OmniAICreator/Qiita-1.07M huggingface dataset:
argparseの使い方備忘録

業務でPyTorchで実装されたモデルを度々学習させています。ただ、必要なファイルが都度少しずつ異なるという場面が多々有ります。職場の方からargparseを使うと便利だとご教示頂いたので、使ってみるととても使いやすいと感じました。しかし、いつも使い方を忘れてしまうので備忘録メモとして残しておこうと思います。

```python:使用例
class SampleClass

    def __init__(self, required_arg, optional_arg):
        self.required_arg = required_arg
        self.optional_arg = optional_arg

    def sample_func(self):
        pass


if __name__ == "__main__":
    from argparse import ArgumentParser
    arg_parser = ArgumentParser()
    arg_parser.add_argument("required_arg")

    # オプション引数にはデフォルト値も設定
    arg_parser.add_argument("--optional_arg", default=DEFAULT_VALUE)
    args = arg_parser.parse_args()
    
    # デフォルト値を使わない例
    SampleClass(args.required_arg, optional_arg).sample_func()

    # デフォルト値を使う例
    SampleClass(args.required_arg).smaple_func()

```

# Reference

https://docs.python.org/ja/3/library/argparse.html

https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0
imageminをrequireして怒られる

## はじめに

`imagemin`をnode.jsで実行すると怒られた。

```js:imagemin.js
const imagemin = require('imagemin')
const imageminMozjpeg = require('imagemin-mozjpeg')
const imageminPngquant = require('imagemin-pngquant')

imagemin(...略)
```

```
const imagemin = require('imagemin')
                 ^
Error [ERR_REQUIRE_ESM]: require() of ES Module
Instead change the require of index.js in imagemin.js to a dynamic import() which is available in all CommonJS modules.
```

「`import`で読み込んでね」と怒られている。

`import`で読み込んで実行する。

```js:imagemin.js
import imagemin from 'imagemin'
import imageminMozjpeg from 'imagemin-mozjpeg'
import imageminPngquant from 'imagemin-pngquant'

imagemin(...略)
```

```
(node:65499) Warning: To load an ES module,
set "type": "module" in the package.json or use the .mjs extension.
```

再び怒られる。

「`package.json`に`"type": "module"`を追加するか、拡張子を`.mjs`に変更してね」と言われている。

```js:imagemin.mjs
import imagemin from 'imagemin'
import imageminMozjpeg from 'imagemin-mozjpeg'
import imageminPngquant from 'imagemin-pngquant'

imagemin(...略)
```

done！！

## 何がどうなっているのか

`imagemin`のv8系から`ESM`のみサポートしている模様。
`require`で読み込むことができないので`import`で読み込む必要がある。
また、node.jsで実行するには拡張子を`.mjs`にするか、`packege.json`に`"type": "module"`を追加する必要がある。

`packege.json`に`"type": "module"`を追加するときは注意が必要で、そのプロジェクト内の`require`を全て`import`での読み込みに修正する必要がある。
そうすると`__dirname`などが使えなくなる。

個人的には`ESM`のパッケージをnode.jsで動かす場合は`.mjs`にしています。

## ESM?

node.js v12から`ESM`をデフォルトでサポートしていた。
nodeのコミュニティでも`ESM`に統一していこうみたいな雰囲気になっている。

ES modulesとCommonJSの話を書くと長くなるので、おすすめの書籍を貼っておきます。
この辺りはJSの歴史を遡って全体像を把握した方が幸せになります。

https://www.amazon.co.jp/%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%81%AA%E9%96%8B%E7%99%BA%E3%83%84%E3%83%BC%E3%83%AB%E3%81%A8%E8%A8%AD%E8%A8%88%E3%83%BB%E5%AE%9F%E8%A3%85-%E5%AE%89%E9%81%94-%E7%A8%9C/dp/4798061778/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=1644929985&sr=8-1-spons


## まとめ

node.jsで実行するライブラリは脳死で`require`しがちだったので色々と勉強になった。

## 参考資料

https://qiita.com/shimataro999/items/8a63ec06f33ccd2ea9ca

https://zenn.dev/azu/scraps/8251dab75562c8
debian9 環境設定 再度新しいPCにインストールする

# 今回の要求事項に沿ってインストールしたもの

[LinuxからWindows共有フォルダへアクセス](https://codeaid.jp/blog/linux-windows-share/)

Linuxから共有フォルダへアクセスする
apt install cifs-utils


# 前回行ったはずですが、記録が残ってないもの

+ このようなリポジトリから更新を安全に行うことができないので、デフォルトでは更新が無効になっています。
 /etc/apt/sources.list の修正　これをしておかないと apt -y apdate apt -y apgrade　ができない

+ ユーザの追加
 adduser --shell /bin/bash --home /home/admin admin

+ tukubaiと自作したコマンドをリモートコピーしたい。けどエラーなんですよね。

```
scp .: not a regular file
```
やっとわかった。
このエラーが発生する可能性のある1つの方法は、次のように最初のパスの前にスペースがある場合です。

```
scp myUserName@HostName: /path/to/file  /path/to/new/file  
```

修正するには、スペースを削除します。

```
scp myUserName@HostName:/path/to/file  /path/to/new/file
```

[scp gives "not a regular file"](https://stackoverflow.com/questions/29547087/scp-gives-not-a-regular-file/29548109)


何故かmake コマンドが無いというエラー
apt install build-essential

VIMでなくて、VIになっていた
apt -y install vim


# 前回した設定で記録が残っていた分

```
apt-get install apache2 
```
設定は
https://www.server-world.info/query?os=Debian_9&p=httpd&f=1

apt-get install php php-cgi libapache2-mod-php php-common php-pear php-mbstring php-cli

https://www.server-world.info/query?os=Debian_9&p=httpd&f=3


openssl
apt-get install openssl

apt-get install curl

apt-get install python2.7

https://shioleap.github.io/blog/Linux/Debian/terminal-display-current-directory-only/
tfstateのoutputsが読み込めない原因と対策

# 原因と対策
tfstateにはバージョンがあり、構成が違ってきます。
[tfstate-v1](https://www.terraform.io/cloud-docs/sentinel/import/tfstate)
[tfstate-v2](https://www.terraform.io/cloud-docs/sentinel/import/tfstate-v2)
![tfstate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169482/a575c5c0-c4cf-ea97-3b78-8e5df2170734.png)

少し前の書籍などで勉強しているとパス指定が違ってくることがあるので
対策としてはtfstateファイルを確認してパスを指定します。

# 状況
vpc用のtfファイルとec2用のtfファイルを分けて書いている場合に
idなどを使い回したい場面があります。
例として

```vpc.tf
＃このセクションでtfstateにサブネットのIDを書き出しています
output "public_subnet_id" {
    value = "${aws_subnet.public_subnet.id}"
}
```

```ec2.tf
resource "aws_instance" "sandbox" {
    ami = "oooooooo"
    instance_type = "t2.micro"
    ＃この行でs3のxxxxxバケットのxxxxx/terraform.tfstateに書かれているoutputsセクションのpublic_subnet_idを読み出しています。
    subnet_id = "${data.terraform_remote_state.vpc.outputs.public_subnet_id}"
}
data "terraform_remote_state" "vpc" {
    backend = "s3"
    config = {
        bucket = "xxxxxx"
        key = "xxxxx/terraform.tfstate"
        region = "ap-northeast-1"
    }
}
```

```tfstate.tfstate

{
  "version": 4,
  "terraform_version": "1.0.1",
  "serial": 5,
  "lineage": "xxxxxxxxxx",
  "outputs": {
    "public_subnet_id": {
      "value": "subnet-xxxxxxxxxxxxx",
      "type": "string"
    }
  },
  "resources": [
      .
      .
      .
```

このような形でtfstateファイルを経由して
tfファイル間で値をやり取り出来ます。

# エラーになった例
ec2.tfで以下のように指定していたらエラーになりました。
前述のtfstateバージョンが違う形で指定しているのが原因です。

```error.tf
resource "aws_instance" "sandbox" {
    ami = "oooooooo"
    instance_type = "t2.micro"
    subnet_id = "${data.terraform_remote_state.vpc.public_subnet_id}"
}
```

# エラーメッセージ

```error.sh
$terraform plan
╷
│ Error: Unsupported attribute
│ 
│   on ec2.tf line 4, in resource "aws_instance" "sandbox":
│    4:     subnet_id = "${data.terraform_remote_state.vpc.public_subnet_id}"
│ 
│ This object has no argument, nested block, or exported attribute named "public_subnet_id".
```
2月15日のコースレビュー

多相性の特徴：
1.継承関係があり
2.サブクラスはスーパークラスメソッドをオーバーライドする
3.スーパークラス参照は子クラスオブジェクトを指する
多相性のルール：
左にコンパイルし、右に実行するメソッドをオーバーライドする
![A3B0DD7267B1C22B24F0648816350D1C_看图王.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524339/a4d78a98-cfbb-0845-39e7-077e33892da8.png)
Google スプレッドシートの便利な使い方を調べた際のメモ

(自分が業務に役立ったことは随時メモしていこうと思います)

- N対Nリレーションについて
  - 複数選択テキストボックスUIを出してそこから選択させるような手段はネイティブでは**ない**
  - N対Nリレーションのテーブルをどこかに作り、その結果を1セルにカンマ区切りなどで表示させる方法は**ある**: https://support.google.com/docs/thread/42786712/trying-to-pull-multiple-rows-of-data-from-one-vlookup-value?hl=en
- セルリンク: https://qiita.com/n_sekiya/items/229d70b2594cdbe48539
- iferror: http://pixelbeat.jp/post-229/
- textjoinで改行でつなぐ: https://www.officeisyours.com/entry/2020/03/29/124906#TEXTJOIN%E9%96%A2%E6%95%B0%E3%82%92%E7%94%A8%E3%81%84%E3%82%8B%E6%96%B9%E6%B3%95
- 値のみ貼り付けを使えるようにする (Vivaldiにて): https://forum.vivaldi.net/topic/34593/googleスプレッドシートで-値のみ貼り付け-が効かない/6
【Vim】基本コマンドの使い方まとめ①

#はじめに
こんにちは。
こちらの記事では、Vim の基本コマンドについて記しています。
誤っている点がございましたらコメントいただけると幸いです。

##基本コマンド



|  キー   | 動作 |
| :--: | :--: |
|  esc  |  コマンド（標準）モード切り替え  |
|  i  |  挿入モード切り替え  |
|  A  |  末尾に移動して、挿入モード切り替え  |
|  :w  |  編集しているファイルの保存  |
|  :wq  |  編集しているファイルを保存して閉じる  |
|  :q  |  編集を加えていないファイルを閉じる  |
|  :q!  |  編集を保存せずに強制的に閉じる  |
|  x  |  1文字削除  |
|  de  |  1単語削除  |
|  d$  |  カーソルにのった文字を含んだ末尾までの行を削除  |
|  0  |  先頭行まで移動  |
|  dd  |  行削除  |
|  2dd  |  2行削除（数字で複数行選択可能）  |
|  u  |  直前に実行したコマンドのやり直し  |
|  U  |  直前に実行したコマンドを行ごとやり直し  |
|  control + r  |  コマンドのやり直しの取り消し  |





<br>


#おわりに
ここまで基本コマンドの一部についてまとめました。
引き続きチュートリアルに取り組んでいきます！

以上、最後まで読んでいただきありがとうございました！
Web3.0検証(2)-分散型アプリのアーキテクチャ

##### [前回] [Web3.0検証(1)-Web3.0対応ブラウザに触れてみる](https://qiita.com/mingchun_zhao/items/f789e551ac7e8f6920df)

## はじめに

前回はWeb3.0の入り口として、Web3.0対応ブラウザBraveを触ってみました。
今回は、Web3.0アプリケーションの内部構造がどうなっているか、理解しておきます。

## Web3.0分散型アプリ(DApps)とは

[ethereum.org](https://ethereum.org/en/developers/docs/dapps/)の定義がわかりやすかったです。以下、抜粋です。

```
A decentralized application (dapp) is an application built on a decentralized network 
that combines a smart contract and a frontend user interface.
A dapp has its backend code running on a decentralized peer-to-peer network. 
A dapp can have frontend code and user interfaces written in any language
 to make calls to its backend.
Furthermore, its frontend can get hosted on decentralized storage such as IPFS.
```

登場人物が四つあるようです。

- バックエンド
    - 分散型Peer to Peer(P2P)ネットワークで実行される
    - 対して、Web2ではバックエンドコードが集中型サーバーで実行されていた
- フロントエンド(ユーザーインターフェイス)
    - 任意の言語で記述でき、バックエンドを呼び出す
- 分散ストレージ(IPFSなど)
    - フロントエンドを分散ストレージにホストできる
- スマート・コントラクト
    - ブロックチェーン上のトランザクション実行に使用される

関連用語を確認しておきます。

- Peer to Peer(P2P)
    - [Wikipedia](https://ja.wikipedia.org/wiki/Peer_to_Peer)から引用:「複数のコンピューター間で通信を行う際のアーキテクチャのひとつで、対等の者（Peer、ピア）同士が通信をすることを特徴とする通信方式、通信モデル、あるいは通信技術の一分野を指す。」
- IPFS
    - [Wikipedia](https://ja.wikipedia.org/wiki/InterPlanetary_File_System)から引用:「InterPlanetary File System (IPFS)とは分散型ファイルシステムにデータを保存・共有するためのP2Pハイパーメディア分散プロトコルである。IPFSネットワークにあるノードは分散ファイルシステムを形成する。」
- スマート・コントラクト
    - [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%BB%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%AF%E3%83%88)から引用:「契約のスムーズな検証、執行、実行、交渉を意図したコンピュータプロトコルである。スマートコントラクトには第三者を介さずに信用が担保されたトランザクションを処理できるという特徴がある。」

スマート・コントラクトがよくわかりませんでしたが、ブロックチェーンと関係するようですので一旦は気にせず。

### Web3.0分散型アプリのアーキテクチャはどうよ

以下の説明がとても参考になりました。
https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application

アーキテクチャ図はこんな感じ:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/fc4ff2ef-92e0-fd07-dbe7-1ec8acd0c386.png)

従来のWeb2アプリと比べ、新しく登場したものをリストアップします。

- Signer
    - ユーザの秘密鍵を使ってメッセージやトランザクションに署名する署名者のことで、ユーザがEthereumネットワーク上で操作できるように許可してくれるようです
- Provider
    - Ethereumネットワークへの接続には、プロバイダーが必要のようです
- Contract
    - 上述のスマート・コントラクトのことです(今後検証予定)

## おわりに
今回は手を動かせず理論武装だけでしたので、いくつかモヤモヤが残ってしまいました。
次回から、Web3.0アーキテクチャの各要素を検証しながら、理解を深めようと思います。
なんか、わくわくしてきました。

##### [次回] [Web3.0検証(3)-分散型アプリを作ってみる](https://qiita.com/mingchun_zhao/items/60239eefc86f9192fe12)
ローカルDBをCloudSQLにインポート

ローカル開発後にCloudSQL(GCP上のデータベース)へそのままDBデータを移す方法についてメモ
(この記事はpgAdmin4を使用している場合のみ想定した記事になっています。)

手順

1. pgAdmin4でデータベースを選択して、右クリックから「Backup」を選択
1. Dum optionsタブをクリックし、必要な項目にチェック
1. GeneralタブでのFormatは「Plain](SQLファイル)を選択、それ以外は特に触らずBackup開始
1. Cloud SQLでインスタンスを作成
1. SQLインスタンス内でユーザーアカウントを作成（ローカルでアクセス可能にしているユーザー名とパスワードにする）
1. Cloud Storageの任意のバケットに、3で作成したバックアップファイルをアップロード
1. SQLインスタンスのダッシュボードより「インポート」をクリック
1. インポート元のバケットとファイル名を選択
1. 接続先のデータベース名を入力し、事前に作成しておいたユーザーを指定してインポート開始 ![スクリーンショット 2022-02-16 9.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/89b589f3-3b1b-9555-266b-511a1ff57f6f.png)
Monorepoでhusky + lint-stagedをpackageごとに異なる設定で動かす

## これは何

モノレポで複数のパッケージを管理しているリポジトリで、パッケージごとにlint-stagedで走らせるコマンドを設定する方法について説明します。

## 前提

- husky: 7.0.4
- lint-staged: 12.3.3

### workspaces

`packages`以下に2つのパッケージがある状態です。
今回はfrontendパッケージでのみeslintを実行したいと思います。

```json:package.json
{
  "workspaces": [
    "packages/frontend",
    "packages/backend"
  ],
}
```

## インストール

workspaceにlint-staged, huskyをインストールします。

```bash
yarn add -D -W lint-staged husky
```

## husky でprecommitの設定

READMEにあるように、以下のコマンドでprecommitの設定をしていきます。

https://github.com/typicode/husky

```bash
npm set-script prepare "husky install"
npm run prepare
```

今回はyarnを使ってprecommitのコマンドを設定します。

```bash
yarn husky add .husky/pre-commit "yarn lint-staged"
```

すると以下のようなファイルが生成されました。

```sh:.husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

yarn lint-staged
```

## lint-stagedでeslintの設定

実は、lint-stagedを実行したいpackageに`.lintstagedrc.json`を設置するだけで完了です。

https://github.com/okonet/lint-staged#how-to-use-lint-staged-in-a-multi-package-monorepo

```json:packages/frontend/.lintstagedrc.json
{
  "*.{js,jsx,ts,tsx}": "eslint --fix"
}
```

これで、対象のパッケージのみprecommitの設定ができるようになりました。
ec2にgitをインストールしてgithubからgit pullできるようになるまで

## 経緯
ec2にアプリをデプロイするためにgitをインストールし、githubからリポジトリをクローンしようと思ったのですが、githubのssh設定でつまづいたため記事として残しておきます。

## 結論
ssh接続のための鍵はroot(sudo)で作成する

## やったこと
### 1. ec2にssh接続
```
$ ssh -i {ec2に接続するための鍵} ec2-user@{ec2のpublicIP} 
```

### 2. gitインストール
```
$ sudo yum install git
```

### 3. githubにssh接続するための鍵を作成する
```
$ ssh-keygen -t ed25519 -C {自分のメールアドレス}
```
3回ほど質問されますが、全てEnterを押せばOKです
これで~/.ssh/id_ed25519(秘密鍵)と~/.ssh/id_ed25519.pub(公開鍵)が生成されます

### 4.githubに公開鍵を登録する
https://github.com/settings/ssh/new
こちらから公開鍵の登録ができます。
Titleには好きな文字列を、Keyには公開鍵(今回だとid_ed25519.pub)の内容をコピーして貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524155/c67fe60d-dabe-02d6-c4c5-b9e5b9a06a9c.png)

### 5.SSH接続の確認
```
$ ssh -T git@github.com
```
このコマンドを叩いて下が返ってくれば成功です
Hi (account名)! You've successfully authenticated, but GitHub does not provide shell access.

### 6.リモートリポジトリをクローン(ここで詰まった)
```
$ git clone git@github.com:{ユーザ名}/{リポジトリ名}.git
```
SSHの接続設定も完了しているので本来であればリポジトリのクローンができるはずです。
しかし、実際に返ってきたのは以下でした...
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

## 解決策

### gitのドキュメントを読んでみる
https://docs.github.com/en/authentication/troubleshooting-ssh/error-permission-denied-publickey
上のリンクに次のような記述がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524155/e9a4475f-869b-081e-2505-5c63ed135776.png)

要はSSH鍵を作成するときにsudoを使ってしまうと、gitコマンドを使うときに毎回sudoをつけないといけなくなるよということでした。
しかしながら、SSH鍵を作成するときにsudoをつけた覚えはありません。
ということで、逆にsudoつけて鍵作ったらどうなるんだろうと試してみたところうまくいきました！
```
$ sudo ssh-keygen -t ed25519 -C {自分のメールアドレス}
```
git cloneの時もsudoをつけてあげます
```
$ sudo git clone git@github.com:{ユーザ名}/{リポジトリ名}.git
```

## まとめ
SSH鍵生成のときにsudoを使うことで無事githubとの接続ができました。
(gitのコマンドを使うときに毎回sudoをつけないといけない制約はありますが...)
【Vue.js】v-slotについての個人的まとめ①

## はじめに
個人的な学びを軽く書き留めているだけの記事です。

## v-slot
呼び出し側から呼び出し元のcomponentをカスタマイズできる機能。

まず下記のように`<slot></slot>`で挟む形でデフォルト値にしたいHTMLを書いて親側で呼び出してみる。

```vue:ChildComp.vue
<template>
  <div>
    <slot><h1>ほげ</h1></slot>
  </div>
</template>
```

```vue:ParentComp.vue
<template>
  <div>
    <ChildComp></ChildComp>
  </div>
</template>
```

![Screenshot - 2022-02-12 19.59.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607264/f7276127-f91c-6f99-f49a-2e5503a5b321.png)

この場合、ParentComp側では単にChildCompを呼び出しているだけなのでChildComp側ではデフォルト値に設定されている「ほげ」がブラウザ上に表示されている。

v-slotを利用してChildCompの内容をカスタムしてみる。

```vue:App.vue
<template>
  <div>
    <ChildComp>
      <h1>hoge</h1>
    </ChildComp>
  </div>
</template>
```

上記のようにChildCompへカスタマイズしたい内容を追加する。

![Screenshot - 2022-02-12 20.07.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607264/2182ca88-01ff-a554-d3cd-a0dc900a6d87.png)


結果としてデフォルト値に設定している「ほげ」は「hoge」へ差し代わってブラウザへ表示されていることが確認できる。


## 名前付きスロット

slotには名前をつけてターゲットを明確にすることもできる。


```vue:ChildComp.vue
<template>
  <div>
    <slot name="hoge">
      <h1 class="hoge">ほげ</h1>
    </slot>
    <slot>
      <h1 class="default">デフォルト</h1>
    </slot>
    <slot name="fuga">
      <h1 class="fuga">ふが</h1>
    </slot>
  </div>
</template>
```

![Screenshot - 2022-02-13 21.18.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607264/89830558-dc2f-eb18-3e48-bb786b69e2c9.png)

```vue:ParentComp.vue
<template>
  <div>
    <ChildComp>
      <template slot="hoge">
        <h1 class="hoge">hoge</h1>
      </template>
      <h1 class="default">default</h1>
    </ChildComp>
  </div>
</template>
```

![Screenshot - 2022-02-13 21.25.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607264/91ed21de-2d95-83fd-25dd-ba85bcb2b92d.png)

ChildCompには `name="hoge"` といった属性と、 ParentCompのには `slot="hoge"` のようにtemplateで指定した名前をつけることでカスタマイズの対象を明示的に示すこともできる。 
名前をつかない場合はdefaultとして扱われ、名前をつけていないslotの箇所へ反映がされる。
何も設定しなかった場合はChildCompの内容がそのまま反映される。


その②へ続く
C言語でアドレスのアドレスを参照していると思ったけど問題なかった話

#はじめに
タイトルにもある通り、C言語でアドレスのアドレスを参照していると思ったけど問題なかった話です。
C言語の配列の表記方法の曖昧さに混乱させられたのでメモしておきます。

#本題
問題の箇所

```c
bzero((char *)&buf, sizeof(buf));
```

bufはchar型の配列です。
「buf」だけで配列の先頭アドレスを参照しているのに「&buf」としているためアドレスのアドレスを参照している！？

本来ならこう書くべきです。

```c
bzero((char *)buf, sizeof(buf));
```
あるいは

```c
bzero((char *)&buf[0], sizeof(buf));
```

しかし、一発でメモリを破壊してしまいそうなコードなのにプログラムは期待通りに動いている。。。

色々調べてみましたが、結論から言うとC言語の文法的に問題ないそうです。
（C言語の配列アドレス表記法として認められている？）
参考　[POINTER](http://kmaebashi.com/programmer/pointer.html)
引用↓
>【配列→ポインタの読み換え】
>
>式の中では、配列は「先頭要素へのポインタ」に 読み換えられる。
>　int a[10];
>の時、式の中では、a と &a[0]は同じ意味となる。
>
>ただし、以下の個所は例外である。
>1.sizeof演算子のオペランド
> sizeof演算子は、ポインタのサイズではなく、配列自体のサイズを返す。 
>
>2.& 演算子のオペランド
> & 演算子は、配列全体のアドレスを返す。
> 配列から読み換えられたポインタは左辺値を持たないため、
> & 演算子のオペランドにはならないはずであるが、この例外規則のため、
> & でアドレス(配列の先頭要素のアドレスではなく、配列全体のアドレス)が
> 取得できる。この規則は初心者を混乱させることがある
> (例えば scanf("%s", buf) でなく、scanf("%s", &buf)と書いても
> 正常に動いてしまう(正常に動いたように見えてしまう)が、
> メリットは今ひとつわからない。 
>
>3.初期化時の文字列リテラル
> char の「配列」を初期化する場合の文字列リテラルは、
> 中括弧内に文字を区切って書く初期化子の省略形である。
> char の「ポインタ」を初期化する場合の文字列リテラルとの
> 違いに注意すること。

例外規則とかやめてほしい。。。

つまり、bufや&buf[0]は配列の先頭アドレス、&bufは配列全体のアドレスで、両者は異なるアドレスだけど同じアドレスであるかのように動いてしまう、ということらしい。
#おわりに
配列・ポインタを扱うところで変な書き方をしても動いてしまうのがC言語の怖いところですが、表記法に曖昧な部分があることがC言語をより複雑にしているというのを身をもって知りました。
データソース、BIツール、開発ツールをDatabricksに接続する

[Connect to Databricks \| Databricks on AWS](https://docs.databricks.com/getting-started/connect/index.html) [2022/1/22時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

本書では、Databricksで利用するために接続することができるさまざまなデータソース、BIツール、開発ツールを紹介します。これらの多くはパートナーシステム、あるいはPartner Connectハブを通じて利用することができます。

# Partner Connect

Partner Connectは、Databricksクラスター、SQLエンドポイントと検証済みソリューションを容易にインテグレーションすることができるユーザーインタフェースです。

詳細に関しては、[Databricks Partner Connectガイド](https://qiita.com/taka_yayoi/items/401f3d785f8262d53ea2)をご覧ください。

# データソース

Databricksでは、Amazon S3、Google BigQuery、Google Cloud Storage、Snowflakeなどのプロバイダーに格納されている、CSV、[Delta Lake](https://qiita.com/taka_yayoi/items/345f503d5f8177084f24)、JSON、Parquet、XMLなどさまざまなデータフォーマットを読み書きできます。

包括的なリスト、接続手順に関しては、[Data ingestion](https://docs.databricks.com/integrations/partners.html#ingest)、[Data sources](https://docs.databricks.com/data/data-sources/index.html)をご覧ください。

# BIツール

Databricksでは、Power BI、Tableauなどを含むお使いのBIとの検証済みインテグレーションを提供しており、ローコード、ノーコードの体験を通じて、多くのユースケースでDatabricksクラスター、SQLエンドポイントを活用してデータを操作することができます。

包括的なリスト、接続手順に関しては、[BI and visualization](https://docs.databricks.com/integrations/partners.html#bi)をご覧ください。

# その他のETLツール

あらゆる種類の[データソース](#データソース)にアクセスできることに加え、Databricksではdbt、Prophecy、Azure Data FactoryのようなETL/ELTツール、Airflowのようなデータパイプラインオーケストレーションツール、DataGrip、DBeaver、SQL Workbench/JのようなSQLデータベースツールとのインテグレーションを提供しています。

接続手順については、以下を参照ください。

- **ETLツール**: [Data preparation and transformation](https://docs.databricks.com/integrations/partners.html#prep)
- **データパイプラインオーケストレーションツール**: [Airflowによるデータパイプラインの依存関係の管理](https://qiita.com/taka_yayoi/items/5b5a3cb556acb57b67b1)
- **SQLデータベースツール**: [Use other tools](https://docs.databricks.com/dev-tools/index.html#use-a-sql-database-tool)、[Access Delta tables from external data processing engines](https://docs.databricks.com/delta/integrations.html)

# IDE、その他の開発ツール

Databricksでは、DataGrip、IntelliJ、PyCharm、Visual Studio Codeなどの開発ツールをサポートしており、コーディングにおいてDatabricks[クラスター](https://qiita.com/taka_yayoi/items/c5d99cd77fe4bfcf69f0)、[SQLエンドポイント](https://qiita.com/taka_yayoi/items/23d7789198c2dcd66381)を活用することができます。

包括的なリスト、接続手順に関しては、[Developer tools and guidance](https://docs.databricks.com/dev-tools/index.html)を参照ください。

# Git

DatabricksのReposはお使いのGitプロバイダーとのレポジトリレベルでのインテグレーションを提供し、Databricksノートブックでコードを開発し、リモートのGitリポジトリと同期することが可能となります。詳細は[Databricks ReposによるGit連携](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140)をご覧ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
【Chrome拡張】続編：Qiitaの記事を見ているエンジニアとリアルタイムに交流できる拡張機能作った


**本記事は、MMOBrowser(ver0.1.0)の追加機能を使ったQiitaの利用例を紹介する記事になります。
MMOBrowserの概要・利用方法は[こちらの記事](https://qiita.com/Hylia221/items/6142bdc527cc6b3c9fe5)をご参照ください。**

# こんなことを思ったことはありませんか
- Qiitaで見つけた面白い記事の感想を共有したい...
- 自分が投稿した記事を見ている人に感想を聞きたい...
- 記事にあるコードや数式が分からないのでエンジニアに質問したい...

## そんなときにはMMOBrowserを活用しよう！
MMOBrowserを導入することで、同じWebサイトにアクセスしている人たちのマウスカーソルがブラウザ上に表示され、自由にコミュニケーションを取ることができるようになります（下図）。
Qiit![qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264364/72ce56bb-632d-10b5-a073-6838d6e6b3ba.gif)
## 利用例①：トップページで記事を共有しよう！
面白い記事や自分が投稿した記事など、他の人に見てもらいたい記事をトップページで共有しましょう！
**利用手順**
1. [https://qiita.com/](https://qiita.com/)を開く
2. 拡張機能のショートカットから「チャットを表示」をクリック
3. チャットウィンドウに共有したい記事のURLを入力し、「送信」をクリック
4. マウスカーソルの右上にフキダシでメッセージが表示されれば送信成功。[https://qiita.com/](https://qiita.com/)にアクセスしている人に記事のURLが共有されます。
![Toppage.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264364/bec1fcb7-7e15-83ad-6027-2c57acc0b8a8.gif)


## 利用例：②自分が投稿した記事に来た人と交流しよう！
自分が投稿した記事で待機すれば、訪れた人とコミュニケーションがとれるかも...
![執筆者.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264364/2515be2f-80a5-2391-9aac-f7b38880e3de.gif)

## 利用例：③分からないコードや数式は質問しよう！
分からないコードや数式があったら、近くにいるエンジニアの方々に聞いてみよう！
マウスカーソルを使えば簡単に場所を伝えられます！
![質問.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264364/70c82888-f37d-ab42-6c64-11f2aaf99ce0.gif)


## ほかにも...
### 利用例④人気な記事にアクセスしよう！
ワールド情報ウインドウから現在の接続数が多い記事を見に行きましょう！
**利用手順**
1. 拡張機能のショートカットから「ワールド情報を表示」をクリック
2. ワールド情報ウィンドウの「qiita.com」をクリック
3. 記事のタイトルと現在の接続数が表示されるので、接続数が多い記事のタイトルをクリック
4. 人気の記事にアクセスできます。
![popular.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264364/d6b5ad71-6218-c51b-ea34-69894e2268fe.gif)

## さいごに
　Qiitaの記事は一人で読んでいても楽しいですが、エンジニアたちと記事についてコミュニケーションを取りながら一緒に読むことでより一層楽しくなること間違いなし！

　今後はYoutubeに対応してパブリックビューイングっぽくするを考えてます。他にも面白い使い方や実装してほしい機能などありましたらここからご意見頂ければ幸いです！


　引き続きMMOBrowserをよろしくお願い致します。
CCNA勉強1

#スタティックルートの設定
ip route 192.168.3.0 255.255.255.0 192.168.2.2
宛先(ホスト]orネットワークアドレス+ワイルドカードマスク)　転送先
※デフォルトルートの場合、宛先は 0.0.0.0 0.0.0.0 を指定
※転送先の指定は　直接接続　再帰　完全指定　の3種類。
※直接指定は出力インターフェースのみ指定
※再帰はネクストホップアドレスのみ指定
※完全指定は上記の両方を指定


show ip route
自ip［Administrative Distance値/メトリック値］

#AD値
EIGRP　90
OSPF　110
RIP　120

#OSPF
show ip ospf neighbor
・ネイバー関係確立条件
Hello/Dead間隔
サブネットマスク
エリアID


#EIGRP
FD:Feasible Distance:自ルータ-宛先の合計メトリック
RD:Reported Distance:ネイバーから宛先の合計メトリック
複合メトリック=(帯域幅+遅延)*256
帯域幅=10000/Mbps
遅延=遅延合計*10
CSSでカラーパレットを管理する際のアンチパターン

## この記事の概要

CSSによるカラーパレット管理において、たまに見かけるけど**やめておいた方が良い**方法を記事にしました。

:::note warn
タイトルの「アンチパターン」は少し言い過ぎかもしれません。
しかし他に良い言い回しが浮かばなかったため、若干強い表現ですが使用しています。
:::

## やめた方が良い方法

以下の方法です。

- 色をHSLで扱い
- CSS custom propertiesに`h`, `s`, `l`それぞれを定義して
- `l`だけを変える

パッと見てもなんのことやらだと思うので、実際にコードを示します。

```css:style.css
/* 色の定義 */
:root {
  /* 色相と彩度の定義 */
  --color-hsl-h: 94;
  --color-hsl-s: 100%;

  /* 段階的な明度の定義 */
  --color-hsl-l-1: 90%;
  --color-hsl-l-2: 80%;
  --color-hsl-l-3: 70%;
  --color-hsl-l-4: 60%;
  --color-hsl-l-5: 50%;
  --color-hsl-l-6: 40%;
  --color-hsl-l-7: 30%;
  --color-hsl-l-8: 20%;
  --color-hsl-l-9: 10%;

  /* hsl()を用いて、同一色相同一彩度、明度変化のカラーパレット定義 */
  --color-primary-1: hsl(var(--color-hsl-h) var(--color-hsl-s) var(--color-hsl-l-1));
  --color-primary-2: hsl(var(--color-hsl-h) var(--color-hsl-s) var(--color-hsl-l-2));
  --color-primary-3: hsl(var(--color-hsl-h) var(--color-hsl-s) var(--color-hsl-l-3));
  --color-primary-4: hsl(var(--color-hsl-h) var(--color-hsl-s) var(--color-hsl-l-4));
  --color-primary-5: hsl(var(--color-hsl-h) var(--color-hsl-s) var(--color-hsl-l-5));
  --color-primary-6: hsl(var(--color-hsl-h) var(--color-hsl-s) var(--color-hsl-l-6));
  --color-primary-7: hsl(var(--color-hsl-h) var(--color-hsl-s) var(--color-hsl-l-7));
  --color-primary-8: hsl(var(--color-hsl-h) var(--color-hsl-s) var(--color-hsl-l-8));
  --color-primary-9: hsl(var(--color-hsl-h) var(--color-hsl-s) var(--color-hsl-l-9));
}

/* 上で定義した色を実際に使うとこういうイメージ */
.block1 {
  background-color: var(--color-primary-1);
}

.block2 {
  background-color: var(--color-primary-2);
}

.block3 {
  background-color: var(--color-primary-3);
}
```

コードを見る限りだと、なんだか良い感じに管理できているように見えるかもしれません。

しかし実際の見た目は以下のようになっています。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/676ef070-b20a-c9a9-7320-b9741c52e70e.png)

- 中間の色の彩度がやたら高く見える
  - 数値的には全て同じはずなのに
- 暗い側の最後の2色、変化が急

などこのままだとどうにも使いづらそうです。

また、色相や彩度を変えてみても同じようなパレットが生成されました。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/e5a392f9-a0ae-8797-69c4-59c2cfcf2eb4.png)

## このアプローチのまま解消を目指すなら

- `l`だけでなく`h`や`s`も段階的に数値を用意する
- `l`の数値変化を等間隔でなく、実際の見た目に合わせて用意する

こういった調整を施せば多分使えるパレットは生成できると思います。

しかし、そうなるとh, s, lの組み合わせ数もかなり多くなりますから、HEX値を直接custom propertiesに登録してしまった方が楽な気もします。

## 何故こんなことが起きるのか

この分野の専門でないため若干説明が怪しいですが……

- 明度について
  - 人間の目が刺激を受け取る際、リニアではなく対数で処理している
    - ウェーバー・フェヒナーの法則
- 彩度について
  - マンセルの色立体を確認しても、中程度の明度が一番彩度方向に膨らんでいる
    - 明度が極端に高い場合や低い場合、割合としては彩度100%であっても取り得る絶対値がそもそも小さい

参考になりそうな記事も貼っておきます。

https://qiita.com/yoya/items/122b93970c190068c752

https://www.dic-color.com/knowledge/munsell.html

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox
2022/2/16主にITとかセキュリティの記事

【更新あり】Google、「Chrome 98.0.4758.102」を公開 - 一部脆弱性はすでに悪用報告も
https://www.security-next.com/134123

ESETのWindows向け製品に権限昇格の脆弱性
https://www.security-next.com/134151

実例をSNSで共有、被害を未然に防ぐ「#迷惑メール展」
https://www.security-next.com/134138

「セキュリティ・キャンプフォーラム2022」がオンラインで開催
https://www.security-next.com/134130

大和ハウスグループ会社がEmotet感染、不審メールに注意を呼びかけ(2/14)
https://s.netsecurity.ne.jp/article/2022/02/14/47124.html

第17回 認知バイアス錯覚を知らなければリスク管理は始まらない(2/14)
https://www.risktaisaku.com/articles/-/64996

オープンソース開発、欠陥修正に弱点　有志頼みに限界(2/14)
https://www.nikkei.com/article/DGXZQOUC312FA0R30C22A1000000/

2月TIOBEプログラミング言語ランキング、Python・C・Java増加(2/14)
https://news.mynavi.jp/techplus/article/20220214-2271941/

.NETが20周年、特別なお祝い放送も(2/14)
https://news.mynavi.jp/techplus/article/20220214-2272237/

CircleCIを利用して、AWS S3に静的サイトを自動デプロイする(2/14)
https://liginc.co.jp/578172

危険な「パスワード」の具体例つき！ 増えすぎたスマホのパスワードを安全に管理する方法(2/14)
https://article.auone.jp/detail/1/3/7/27_7_r_20220214_1644839862225194

大塚製薬　悪質な「偽サイト」による詐欺被害にご注意ください(2/14)
https://www.otsuka.co.jp/information/beware-of-online-fraud.html

グーグル、企業向けSNS「Currents」を段階的廃止へ--「Spaces」に移行(2/14)
https://gunosy.com/articles/eg822

5月10日にサポート終わるWindows 10, version 20H2、更新推奨(2/14)
https://news.mynavi.jp/techplus/article/20220214-2271944/

北朝鮮、仮想通貨４６０億円盗む　２１年に７回サイバー攻撃(2/14)
http://yamagata-np.jp/news_core/index_pr.php?kate=Main&no=2022021401001383

金融庁、みずほに報告命令　11日の障害で(2/14)
https://www.nikkei.com/article/DGXZQOUB14C0Q0U2A210C2000000/

Googleの2段階認証設定すると50%以上安全になるよ(2/14)
https://www.gizmodo.jp/2022/02/google-account-hacking-minus-50-percent.html

米国防総省、オープンソースをプロプライエタリより優先的に採用する調達方針を明らかに。同省CIOが書面で通知(2/14)
https://www.publickey1.jp/blog/22/cio_2.html

「Adobe Commerce」「Magento」に致命的なゼロデイ脆弱性 ～任意コード実行の恐れ(2/14)
https://forest.watch.impress.co.jp/docs/news/1388123.html

みずほとクラウド、人員減らせない日本型ITシステム(2/14)
https://www.nikkei.com/article/DGXZQOUC0374W0T00C22A2000000/

M＆A前に不可欠な「IT移行リスト」作成、計上漏れで数十億円の追加費用も(2/16)
https://xtech.nikkei.com/atcl/nxt/column/18/01926/020900003/

新常識の「先」つかむ　鍵は情報と人材にあり(2/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020700276/020700003/

注目、3つの新常識　今が変化のチャンス(2/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020700276/020700002/

名ばかりCISOはいらない　ヒヤリハット共有で安全な組織を(2/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600001/020700103/

なぜ被害は広がるのか　50年の歴史をひもとく(2/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020700276/020700001/

なぜMACアドレスは48ビットなのか？(2/15)
https://xtech.nikkei.com/atcl/nxt/column/18/01947/020900001/

M＆Aの成否を分ける「ITデューデリジェンス」とは、入札の勝敗に影響も(2/15)
https://xtech.nikkei.com/atcl/nxt/column/18/01926/012700001/

福井県が認証付きアカウントの乗っ取り被害、フォロワーが10倍以上に増える(2/15)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/121500152/

NTTコム、eSIMのプログラム領域開放　第1弾はIoTセキュリティー(2/14)
https://xtech.nikkei.com/atcl/nxt/column/18/01537/00314/

年末最終営業日に振込設定ミス　年初の連休明けに法人IBが性能劣化 みずほ銀行(2/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/020900101/
ESXiのhostnameを変更する方法

#1. はじめに
BM for VPCのESXiは、[ここ](https://qiita.com/testnin2/items/1b0afe2a70d525b0c5a2)にも記載した通り、プロビジョニング時にはhostnameが設定されないため、`localhost`のままになっている。
ここでは、VMware社の[KB1010821](https://kb.vmware.com/s/article/1010821)に従ってhostnameを変更してみる。

#2. 変更方法

```txt:バージョン確認
[root@localhost:~] vmware -vl
VMware ESXi 7.0.2 build-17867351
VMware ESXi 7.0 Update 2
```

```txt:設定変更前
[root@localhost:~] hostname -s
localhost

[root@localhost:~] hostname -f
localhost.localdomain

[root@localhost:~] hostname -i
127.0.0.1

[root@esx-001:~] cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1	localhost.localdomain localhost
::1		localhost.localdomain localhost
```

```txt:設定変更後
[root@localhost:~] esxcli system hostname set --host=esx-001
[root@esx-001:~] esxcli system hostname set --fqdn=esx-001.vmware.ibmcloud.local
```

```txt:設定確認
[root@esx-001:~] hostname -s
esx-001

[root@esx-001:~] hostname -f
esx-001.vmware.ibmcloud.local

[root@esx-001:~] hostname -i
10.18.0.11

[root@esx-001:~] cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1	localhost.localdomain localhost
::1		localhost.localdomain localhost
10.18.0.11	esx-001.vmware.ibmcloud.local esx-001
```
C++ で numpy っぽく書いて GPU-accelerated 処理できる MatX のメモ

## 背景

numpy 便利よね. Python(e.g. pytorch, jax, cupy) で fft とか svd とかやっている...
しかし GPU 処理しても, いまいち性能でなかったり, 大きめデータだとメモリ不足(メモリを無駄につかう)になってつらい...

GPU + C++ でやりたいけどコード書くのめんどい...

いつの間にか MatX が出てました.

https://github.com/NVIDIA/MatX

fft や svd など俺得関数対応していてよい!
(CPU 実行もあるよ)

## ビルド

Ubuntu 20.04 あたり使っていれば compiler は特には問題ないですが, cmake が 3.18 or later を必要とします.
Ubuntu 20.04 ですと snap で cmake 入れるとよいでしょう.

CUDA は 11 or later のみ対応です. CUDA 10 は対応していませんので注意です!

## ユニットテスト

Unit test では python 環境に numpy, scipy, cupy が入っている必要があります.

## 自前アプリに組み込む

cmake add_subdirectory でいけるようになっています.

## TODO

* cuew を使い, SDK 不要でビルドできるようにする
  * 著者の cuew fork の `cudart` branch で cuFFT など対応中: https://github.com/syoyo/cuew/tree/cudart/sandbox/cudart
fetchでapi（Json情報）を取得

fetchを利用してJson情報を取得します。
Promiseがわかってなくてはまってしまったので、備忘録として残します。

API開発時に役立つ[JSONPlaceholder - Free Fake REST API](https://jsonplaceholder.typicode.com/)を利用。
何種類かリソースが用意をされておりますが、今回はUSER情報（https://jsonplaceholder.typicode.com/users）
を使用させてもらいます。

### JSONPlaceholder

![Screenshot(44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142782/8d35bfa0-efc4-0164-0091-ef5851ab02d3.png)


## 実装
```html
<h1>fetch</h1>
<h2>名前情報を取得</h2>
<ul id="name_box">
</ul>
```


```javascript
let name_box = document.getElementById("name_box");

function getJson(){
	fetch("https://jsonplaceholder.typicode.com/users/")
		.then(response => response.json())
		//response.json()をusersとして扱います
		.then(users => {

		//取得したユーザー情報をイテレートしてhtmlに出力
		for(user of users){
			var list = document.createElement('li');
			list.innerHTML = user.name;
			name_box.appendChild(list);
		}
	});
};

getJson();
```

## 結果
![Screenshot(45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142782/c65fe3ac-db48-6a38-28d0-64d6ce05af1a.png)

#async awaitに書き換えてみよう

## 実装
```html
<ul id="name_box2">
</ul>
```


```javascript
let name_box2 = document.getElementById("name_box2");

async function getJson2(){
	const res2 = await fetch("https://jsonplaceholder.typicode.com/users/");
	//console.log(res2);
	const users2 = await res2.json();
	//console.log(user2);

	//取得したユーザー情報をイテレートしてhtmlに出力
	for (user2 of users2) {
		var list2 = document.createElement('li');
		list2.innerHTML = user2.email;
		name_box2.appendChild(list2);
	}
}

getJson2();
```
## 結果
![Screenshot(45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142782/8b3c8856-c186-9b19-143a-13d6bbf71c79.png)
ansible-playbookをssm経由で実行する



## 準備

- ダイナミックインベントリといって、タグなどの識別子からIPやIDを取得することができ、それに対しansibleを実行できる
- タグやセキュリティグループIDでもフィルタリングができる模様

```aws_ec2.yaml
plugin: aws_ec2
regions:
  - ap-northeast-1
boto_profile: vamdemic

# フィルタの設定
filters:
  instance-state-name: running
  tag:Name: vamdemic-app-integration-dev-server


# グルーピングの設定
# タグ毎にEC2インスタンスのグループをまとめる
keyed_groups:
  - key: tags.Application
    prefix: tag_Name_
    separator: ""

# inventory_hostnameの設定項目の優先順位
# 上から優先され、取得できなければ下に下がっていく
# この例だと Nameタグがなければ `ip-address`（パブリックIPv4アドレス）を採用し、
# それも設定されていなければプライベートIPv4アドレスを採用する
hostnames:
  - tag:Name
  - ip-address # パブリックIPv4アドレス
  - private-ip-address

compose:
  # SSM Session Managerでホストに接続したい場合は以下のようにする
  ansible_host: instance_id
```



```ec2.yaml
- name: EC2 dynamic inventory
  hosts: "vamdemic-app-integration-dev-server"

  vars:
    ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o ProxyCommand='aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p''"
    ansible_user: ec2-user
    ansible_ssh_private_key_file: ~/.ssh/vamdemic_aws.pem

  tasks:
    - name: Print Name tag
      debug:
        msg: "{{ tags.Name }}"
```

## 実行

一覧取得

```bash
ansible-inventory -i aws_ec2.yaml --graph
@all:
  |--@aws_ec2:
  |  |--vamdemic-app-integration-dev-server
  |--@ungrouped:
```

実行

```bash
ansible-playbook -i aws_ec2.yaml ec2.yaml
```

## 参考
https://zenn.dev/ohsawa0515/articles/enable-ec2-dynamic-inventory-by-ansible
https://docs.ansible.com/ansible/latest/collections/amazon/aws/aws_ec2_inventory.html
docker-compose upコマンドを実行すると指定されたファイルが見つかりません。とエラー表示がでる。

n予備校プログラミングコースの第二章LinuxというOSにて。

docker-compose up -d を実行すると、指定されたファイルが見つかりません。というエラーが出ました。
エラーの内容　

```

Traceback (most recent call last): File 
"docker\api\client.py", line 214, in 
_retrieve_server_version File "docker\api\daemon.py", line 181, in version 
File "docker\utils\decorators.py", line 46, in 
inner File "docker\api\client.py", line 237, 
in _get File "requests\sessions.py", line 543, in get File "requests\sessions.py", line 530, 
in request File "requests\sessions.py", line 
643, in send File "requests\adapters.py", line 
439, in send File "urllib3\connectionpool.py", 
line 670, in urlopen File 
"urllib3\connectionpool.py", line 392, in 
_make_request File "http\client.py", line 
1255, in request File "http\client.py", line 
1301, in _send_request File "http\client.py", 
line 1250, in endheaders File 
"http\client.py", line 1010, in _send_output 
File "http\client.py", line 950, in send File 
"docker\transport\npipeconn.py", line 32, in 
connect File "docker\transport\npipesocket.py", line 23, in 
wrapped File "docker\transport\npipesocket.py", line 72, in 
connect File "docker\transport\npipesocket.py", line 52, in 
connect pywintypes.error: (2, 'CreateFile', '指定されたファイルが見つかりません。')  During 
handling of the above exception, another exception occurred:  Traceback (most recent 
call last): File "docker-compose", line 3, in <module> File "compose\cli\main.py", line 81, in main File "compose\cli\main.py", line 200, in perform_command File "compose\cli\command.py", line 60, in project_from_options File "compose\cli\command.py", line 152, in get_project File "compose\cli\docker_client.py", line 41, in get_client File "compose\cli\docker_client.py", line 170, in docker_client File "docker\api\client.py", line 197, in __init__ File "docker\api\client.py", line 221, in _retrieve_server_version docker.errors.DockerException: Error while fetching server API version: (2, 'CreateFile', '指定されたファイルが見つかり ません。') [20948] Failed to execute script docker-compose PS C:\Users\81802\workspace\linux-study> docker version error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/version": open //./pipe/docker_engine: The system cannot find the file specified. Client: Cloud integration: v1.0.22 Version: 20.10.12 API version: 1.41 Go version: go1.16.12 Git commit: e91ed57 Built: Mon Dec 13 11:44:07 2021 OS/Arch: windows/amd64 Context: default Experimental: true

```

解決策

docker desktopの再インストール

docker desktopの画面左下のクジラマークがオレンジから水色に変わると、エラーがでなくなりました。
JavaScript メモ

## let
-  値の再代入ができる


## const
-  値の再代入ができない
-  位数の宣言

## var
- letとほぼ同じ
- 今はletを使うべし


## データ型
- データ型＝データの種類
- データの種類によって出来ることを区別するために存在


1.プリミティブ型
- 真偽値
- 数値
- 文字列
- etc


2.オブジェクト
- オブジェクト
- 配列
- 関数
- etc

## 型変換
- 暗黙的型変換
- なんのためのデータ型を意識しなくてもプログラムが書けるように
- if文の条件式→データを真偽値に変換
   
 - 真偽値の判定
    - falseになる値
        - false
        - underfined
        - null
        - 0]0n
        - NaN
        - null
        - ""(空文字)
    - それ以外は全てtrue


## 配列
- 値に順序をつけて格納できるオブジェクト
- 使い所：複数の値を」まとめて扱いたい時
- []で定義
- 0から順に割り切る

- 配列は0,1,2と数える
`const array=[
 "one",
 "two",
 "three"];
`
- 0番目にアクセスしたい場合
`array[0]; //=>"one"`

- 配列を末尾に追加できる
array.push("four");

- 3番目にアクセスしたい場合
array[3])　//=>"four"`

## ループ
- 繰り返し処理を行うもの
- 使い所：同じ処理を繰り返したい時
- forEach:配列の全要素に対して反復処理
   
## localStorage
- ブラウザにデータを保存しておく仕組み

- データの保存
`localStrage.setItem('キー','値');`

- データの保存
`localStrage.getItem('キー');`

## オブジェクト
- 名前と値が対になったものの集合
- 使い所：1つのものに対し、複数の属性データを持たせたい時
Windows Server 2022 0xC1900101 - 0x30018

# はじめに
本記事ではWindows Server 2019から2022にアップデートする皆様の助けになればと思い執筆させていただきました．

# 出てきたエラー
0xC1900101 - 0x30018
SYSPREP_SPECIALIZE 操作中にエラーが発生したため、インストールは FIRST_BOOT フェーズで失敗しました
![unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328076/8cb75b7d-509b-1814-555c-8875a6c4e75b.png)

# 解決するために実行したこと．
setuperr.logを見る．
```$WINDOWS.~BT\Sources\Panther``` に絶対ある．

そうした場合このような物が出てくると思われる．
> 0000019f (F) Installer: Setup Internet Print Provider Installer Binary Name: PrintAdvancedInstaller.dll ErrorCode: 800700b7 Phase: 38 Mode: Install (first install) Component: Microsoft-Windows-Printing-InternetPrinting-Server

インターネットプリントが原因とここから読み取れる．
無効化すべくサーバーマネージャーを起動し役割と機能の削除ウィザードから以下のものを無効化する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328076/7103b5c6-5ccb-9a74-1cb7-00b9f9a51f70.png)

無効化後Windows Serverをアップデートする．

## 終わりに
この問題6か月放置してました(実話)
【Laravel + jQuery 】BlockUIプラグインで非同期通信中のローディング状態を表示する

# 概要

`Ajax`を利用した非同期通信で`jQuery BlockUI Plugin`を利用したので紹介します

## `BlockUI`について

http://malsup.com/jquery/block/#overview

> jQuery BlockUI Pluginを使用すると、AJAX使用時にブラウザをロックすることなく、同期動作をシミュレートすることができます[1]。このプラグインを有効にすると、無効化されるまで、ページ（またはページの一部）に対するユーザーの操作を阻止します。BlockUIは、DOMに要素を追加して、ユーザーとの対話をブロックする外観と動作の両方を実現します。

![スクリーンショット 2022-02-16 0.46.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/f0537f53-ea7a-0d3b-bfcf-095460eb1a4d.png)





# やり方

## `CDN`を`<script>`タグで読み込む


https://developers.google.com/speed/libraries

https://cdnjs.com/libraries/jquery.blockUI

```php:index.blade.php
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="http://malsup.github.io/jquery.blockUI.js"></script>
```

## `BlockUI`の設定

`$.blockUI()`で画面をロックします

kakuオプションについては以下を参照してください

http://malsup.com/jquery/block/#options


```js:index.js
/**
 * BlockUI
 * ローディング・画面ブロック
 */
function ajaxBlockUi(message) {
    $.blockUI({
        message: message,
        css: {
            border: 'none',
            padding: '15px',
            backgroundColor: '#000',
            '-webkit-border-radius': '10px',
            '-moz-border-radius': '10px',
            opacity: .5,
            color: '#fff'
        }
    });
}
```

## 非同期通信処理

```js:index.js
const AJAX_WAIT_MESSAGES = {DEMO: "Please wait..."}
const API_DEMO = '/api/hoge';

/**
 * @summary 非同期通信デモ
 */
$(document).on('click', '#demo', function (e) {
    // ローディング開始
    ajaxBlockUi(AJAX_WAIT_MESSAGES.DEMO);

    $.ajax({
        type: "POST",
        url: API_DEMO,
        data: {id: 1},
        dataType: "json",
        scriptCharset: 'utf-8'
    }).then(function (data) {
        console.log('完了したよ');

        // ローディング終了
        $.unblockUI();
    }, function (XMLHttpRequest, textStatus, errorThrown) {
        console.log("get_staff_list failed");
        console.log("XMLHttpRequest : " + XMLHttpRequest.status);
        console.log("textStatus     : " + textStatus);
        console.log("errorThrown    : " + errorThrown.message);

        //　ローディング終了
        $.unblockUI();
    });
});
```

# 最後に

読んでいただきありがとうございます。
今回の記事はいかがでしたか？
・こういう記事が読みたい
・こういうところが良かった
・こうした方が良いのではないか
などなど、率直なご意見を募集しております。
nvidia-smi で NVIDIA GPU の graphics core clock を固定するメモ

## 背景

マイニングや機械学習などでクロックを固定化したい.
消費電力の削減や安定動作につながります.

## 方法

nvidia-smi でいけました.

https://hiveon.com/forum/t/locked-core-clock-speed-is-much-better-than-power-limit-why-is-not-included-by-default/29803


クロックのオフセット指定は nvidia-settings でないとだめですが, 固定だと Ubuntu(Linux) の場合 x-window 立ち上げなくても nvidia-smi でいけるっぽい.

同様に memory もクロック固定できました.
100日でSQLの達人になる@LeetCode! Day15 <NULLを含む数値比較は注意>

## 584. Find Customer Referee （問題レベル: Easy）要課金
今日の問題はこれ。
referee_idが２でない行をリストアップせよ。ただしNULLの行もあるという問題。

SQLの文法はとても簡単で
```referee_id != 2```あるいは```referee_id <> 2```を使うだけ。
しかしこの問題のポイントは、SQLにおける`NULL`の扱い。

ポイントは`NULL`は、数値比較ができないということ。
そのため、`NULL`の行も評価するためには、`referee_id is NULL`や
`IFNULL(referee_id, 0) <> 2`あるいは、`COALESCE(referee_id, 0) != 2`を使う必要があるということ。

* [LeetCode](https://leetcode.com/)の問題は、MS SQL Serverで解いています。
【 Java_評価の3つの原則 】

Javaを学習中の初学者による備忘録です。
Javaは`３つの単純な原則`に従いながら式の評価を完了します。

## 評価とは
Javaが式に従って計算処理をすること。
例えば、1+3=4という式では、『1+3を`評価`した結果が4になる』ということになります。

## 評価の3つの原則
■評価結果への置換の原則
オペランドの情報を使って計算を行い、それらオペランドを巻き込んで結果に化ける（置き換わる）
例  :  1+5=6では、1と5を足すと、6に置き換わる。

■優先順位の原則
式に演算子が複数ある場合は、優先順位の高い演算子から順に評価される。
例  :  1+5*6では、5*6を行い、後に30+1を行う

■結合規則の原則
式内に、同じ優先順位グループに属する演算子が複数ある場合、演算子ごとに決められた「方向」から順に評価される。
例 : 10+5+2では10+5から順に、a=b=10ではb=10から順に評価される。



##補足
・オペランド...1+3=xを例に取ると、『1 3 x』のこと。『+ =』は演算子。
Chart.jsのscales optionsの書き方が変わっていたのでメモ

[Chart.js](https://www.chartjs.org/)を使ってグラフを描くにあたってグラフのオプションの書き方が以前（v2）と変わっていてつまずいたので備忘録。

# 公式ドキュメント

ここみたらちゃんと書いてある。
[https://www.chartjs.org/docs/master/axes/](https://www.chartjs.org/docs/master/axes/)

`@see`に記載されているここもoptionsだけどgeneralのことしか書いてない。（使うときは一緒に入れて渡す）
[https://www.chartjs.org/docs/latest/general/options.html](https://www.chartjs.org/docs/latest/general/options.html)

# 環境

```json:package.json
"chart.js": "^3.7.0",
"react-chartjs-2": "^4.0.1",
```

# 全部入りサンプル

```typescript:Graph.tsx
export const options = {
  responsive: true,
  plugins: {
    legend: {
      display: false,
    },
    title: {
      display: false,
    },
  },
  scales: {
    xAxis: {
      type: "time" as "timeseries",
      alignToPixels: false,
      backgroundColor: "rbga(10,10,10,0.3)",
      display: "auto" as boolean | "auto",
      grid: {
        borderColor: "rbga(10,10,10,0.3)",
        borderWidth: 1,
        borderDash: [10, 5],
        borderDashOffset: 0.0,
        circular: false,
        color: "#666",
        display: true,
        drawBorder: true,
        drawOnChartArea: true,
        drawTicks: true,
        lineWidth: 1,
        offset: false,
        tickBorderDash: [20, 5],
        tickBorderDashOffset: 0.0,
        tickColor: "#666",
        tickLength: 8,
        tickWidth: 1,
        z: 0,
      },
      ticks: {
        backdropColor: "#000",
        backdropPadding: 2,
        callback: (value: number) => {
          if (value === 1) {
            return "S";
          } else if (value === 2) {
            return "M";
          } else if (value === 3) {
            return "L";
          }
          return null;
        },
        display: true,
        color: "#666",
        font: {
          size: 16,
          family: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
          style: "normal" as
            | "italic"
            | "normal"
            | "oblique"
            | "initial"
            | "inherit",
          weight: "undefined",
          lineHeight: 1.2,
        },
      },
    },
    y: {}, // x, yだけでも大丈夫だけれど`position`や`axis`を明示することを推奨
  },
};
```

# 変わってたところ

## scales.xAxis が配列じゃない

```typescript:v2
  scales: {
    xAxes: [{
      display: false,
    }],
  },
```
```typescript:v3
  scales: {
    xAxis: {
      display: false,
    },
  },
```

## scales.x.gridLines → scales.x.grid

中身もすこしだけ変わっている。z-indexとか指定できる。

## scales.x.ticks.beginAtZero, scales.x.ticks.stepSize はない
目盛がいらないところは`scales.x.ticks.callback`を使って`null`または`undefined`を返す。

```typescript:Graph.tsx
export const options = {
  scales: {
    yAxis: {
      ticks: {
        callback: (value: number) => {
          if (value === 1) {
            return "S";
          } else if (value === 2) {
            return "M";
          } else if (value === 3) {
            return "L";
          }
          return null;
        },
      },
    },
  },
};
```
DroidCamアプリのHDトライアル版接続でキャプションを消したい

### 概要
スマホをワイヤレスカメラとして使えるDroidCamアプリ。無料版でHD解像度接続すると、キャプション（文字）が表示されます。これをOpenCVを使って消す（画像処理でごまかす）ことにチャレンジしました

### 初回の取り組み：標準画質での接続

以前、DroidCamアプリをWindows上で動作するPythonアプリと接続する記事を書きました。

https://qiita.com/loveshioya/items/8c996def9bc8df9489f7

今回は、DroidCamのHD解像度で繋ぎます。接続自体は、上記の記事の中でも手法を記載しました。接続時のURL指定を以下のようにする、という手法です。

```
cap.open('http://192.168.179.3:4747/video/force/1280x720')
```

### キャプション

HD解像度版での動作はトライアル扱いで、画面上に以下のようなキャプション（字幕）が出ます

![100.before.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595249/92c3af5a-a49f-e5ab-a6c6-94428107e87c.jpeg)

```
DroidCam for iOS (HD Trial)
```

というキャプションが出ていますね。これを画像処理で消したいと思って処理しました。

### 結果

処理結果が以下です。

![100.after.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595249/476840cc-22e6-dfc2-61bc-5620723d382e.jpeg)

完全ではないですが、それなりに誤魔化せているようです

### キャプションの特徴
1. キャプションは毎回同じ大きさで画像の上に描画されている
1. キャプションが配置される場所は接続ごとに変更される
1. キャプションの配置は１回の接続中は変化しない

### 処理の説明
キャプションの特徴を踏まえて以下の処理を実施しました
1. あらかじめキャプション部の画像を１枚、取得し２値化したものを保持しておく
1. DroidCamと接続後、最初のフレームと２値化画像でOpenCVのテンプレートマッチを実施
1. 今回の接続でのキャプション配置を記憶しておく
1. ２フレーム目以降は以下の処理を繰り返す
1. 受信フレームからキャプション部を切り出し
1. ３x３カーネルでスキャンして中央画素が文字画素の場合に、文字以外の画素の平均で置換
1. 上記の置換をrgbごとに実施。
1. 切り出し画像に対してスキャンをして全ての画素置換が完了させる
1. 切り出し画像内の文字画素の置換が完了したら受信フレームのキャプション部を上書きする
1. 表示ウィンドウ画像を更新

### 処理中の画像など
#### あらかじめ準備しておくキャプション部の２値化画像
![logo.thresh.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595249/f9645319-ff95-c2c2-8533-7cb61766e69a.jpeg)

#### 受信フレームから切り出したキャプション部の画像
![before.caption.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595249/23dcb89e-109f-c91c-94c6-0ab95208248f.jpeg)

#### 3x3カーネル作業中の状態（２値化画像と受信画像）
２値化画像は反転して利用している。文字画素を黒とした方がBITWIDTH_ANDで処理しやすいため
![kernel3x3.mono.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595249/870fd38d-e6d3-e03b-b9ba-992f73889669.jpeg)
受信画像
２値化カーネルと論理積ANDを取ることで、文字でない画素のみを残して
分子：輝度レベルの総和
分母：文字以外の画素数（２値化カーネルの白い画素数）
で置換画素のレベルを算出して置換する
![kernel3x3.color.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595249/a027ced2-bfaa-45cb-63d0-c97d0f968a57.jpeg)

#### 置換後のキャプション部
![after.caption.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595249/da9bd0dd-1c90-b8f8-6082-6edc5ee9ac84.jpeg)

### 結果と感想
・簡単な処理ですが、それなりの置換結果になっています
・１フレーム処理するのに０．５秒程度かかっています。

かなり遅いですね。早いパソコンが欲しいです。
アルゴを変えて処理が改善できるか？ということは気が向けば実施するかもしれません。

### 認識している課題
1. 処理が遅い
1. 置換結果を以降の処理で利用するので、置換結果がカーネルスキャン方向に依存する
1. カーネルサイズが３x３なので、文字画素が連続していると置換精度が落ちる

### 環境
#### スマホ側
iPhone7
DroidCam:1.8.0
#### パソコン側
Mac Book Air(2013Mid)
Python:3.9.1
OpenCV:4.5.1