OmniAICreator/Qiita-1.07M huggingface dataset:
自作モジュールをPyPIに登録する

#目的
自作モジュールをPyPIへ登録して`pip install`でインストールします。今回は簡単なコードを実装して使います。
#方法
基本的に[公式のチュートリアル](https://packaging.python.org/en/latest/tutorials/packaging-projects/)に従います。個人的なこだわりで、wslを使ったりgithubに上げたり、仮想環境をpyvenvで作ったりしてますが、今回はそういう事が無くても出来るようにしているつもりです。何回かコマンドを使う必要がある為、そこで引っかかるかもしれません。そこは他の記事にお任せします。または後日、更新します。
#言葉の定義
ライブラリ、パッケージ、モジュールの区別が難しいので、これを参考に大まかに区別をしておきます。

[Pythonのモジュール、パッケージ、ライブラリ徹底解説！](https://ai-inter1.com/python-module_package_library/)
#必要なディレクトリやファイルを作る
[公式のチュートリアル](https://packaging.python.org/en/latest/tutorials/packaging-projects/)のままです。これを任意の場所に作ります。僕はデスクトップにPyPIフォルダを作ってその中で作業しています。
![ptpiディレクトリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/dbe85452-92de-a0e6-75b1-8ed29a8156da.png)



##setup.cfgの編集
前はsetup.pyを作るのが公式だったようですが、今はsetup.cfgとpyproject.tomlを使うようです。中身は公式にお任せしますが、変更点についてだけ、お話します。赤枠で囲まれている所を変更します。
![ptpi_setupcfg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/664c47a1-de39-fd42-5656-49a0c392d778.png)
赤枠で囲まれたところは下の様に書き直しました。
name：自分の付けたいモジュール名
author：PyPIで登録した名前を入れてます
author_email：PyPIで登録したメールアドレスを入れてます
url：自分のgithubのurlを使っています。そのままでも動きました。
project_urls：自分のgithubのurlを使っています。そのままでも動きました。
#buildする
必要なディレクトリやファイルが出来たらbuildしてPyPIへデプロイするする準備をします。ご自身のターミナル（僕の場合はwsl）で次のコマンドを実行して下さい。
##コマンドの更新
buildコマンドを更新します。
```python3 -m pip install --upgrade build```
buildしてPyPIへ上げるファイルとディレクトリを作ります。
```python3 -m build```
上のコードを実行するとdistファイルが出来るはずです。中に.whlファイルと.tar.gzファイルが出来ていれば成功です。具体的には下図の様になります。
![pipyディレクトリ後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/99739556-f1f5-26fa-cee2-5375b5b013f7.png)

#PyPIへの登録
##テスト環境へアップロード
```python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*```
テスト環境に上げたモジュールを使うために、自分の環境にインストールします。
```python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps packaging_tutorial```
##本番環境へアップロード
テストで上手く出来たら本番環境にアップロードします。
```python3 -m twine upload dist/*```

この後はいつもの`pip install <package_name>`でインストール出来るようになります。
#感想
今回は、まずPyPIへアップロードするためだけに、公式チュートリアルに従って簡単に説明しました。説明が簡略化され過ぎて分からない所があると思いますので、その際は質問して下さると嬉しいです。可能な限り、ご説明させて頂きます。
Shopify API 顧客新規登録時、メタフィールドにデータを登録する

ググっても見つけられなかったので、ドキュメントの情報から推測してできるかなと試したら登録できたのでメモ

# 目的
顧客新規登録時に顧客メタフィールドの定義で作成した項目にデータを登録したい。

# Shopify API

## 利用バージョン
```
2022-01
```

## 顧客登録エンドポイント
```
/admin/api/2022-01/customers.json
```
https://shopify.dev/api/admin-rest/2022-01/resources/customer#[post]/admin/api/2022-01/customers.json

## BODY
顧客メタフィールドに　my_fields.id　を作成した例

```json
{
  "customer": {
    "first_name": "Steve",
    "last_name": "Lastnameson",
    "email": "steve.lastnameson@example.com",
    "metafields": [{
        "namespace": "my_fields",
        "key": "id",
        "value": 1234567890
    }]
  }
}
```
Vite×Vue3×Typescriptで最新の環境構築する

### Vite（ヴィート）とは
従来のビルドツールであるVue CLI等に比べて高速で動作するビルドツールのこと。
フランス語で速くという意味らしい。
公式サイト↓

https://vitejs.dev/

###環境構築 Vite×Vue3×Typescript

######1.npmのVersionを確認する(６系とそれ以降でその後のコマンドが変わる）
```
$ npm -v

8.12
```
######2.プロジェクトの作成
```
# npm 6.x
$ npm init vite@latest <ここにプロジェクト名> --template vue-ts

# npm 7+ は追加で 2 つのダッシュが必要:
npm init vite@latest <ここにプロジェクト名> -- --template vue-ts

```

上記は公式サイトに記述されていた

![スクリーンショット 2022-01-19 13.02.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980538/94a2d7f7-1bd0-37ad-58ae-2da7fdb76c3d.png)

vueの後に-tsを付けることでTypescriptを導入することができる。

コマンド入力後の結果は以下の通り

```
Scaffolding project in (中略)

Done. Now run:

  cd <自分が指定したプロジェクト名>
  npm install
  npm run dev

```

######3.開発に必要なライブラリのインストールをする

```
# 生成された Vue プロジェクトフォルダに移動する
$ cd <自分が指定したプロジェクト>

# 開発に必要なライブラリ群をインストールする
# ライブラリ群の情報は package.json に記載あり
$ npm install

```

めちゃくちゃ一瞬でインストールされた！！！Vue-cliを使用した場合はかなり時間がかかった印象がある。あちらはESLintやPrettierやVue Router Vue storeがオプションで使用するのを選べるメリットはあるが....

######3.サーバーを立ち上げる

```
$ npm run dev

  vite v2.5.8 dev server running at:

  > Local: http://localhost:3000/
  > Network: use `--host` to expose

  ready in 419ms.
```

![スクリーンショット 2022-01-19 11.36.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980538/aca08e34-48fa-584a-72e8-58086b545242.png)


###### 推奨IDEを揃える
以前まではvscodeの拡張機能としてVeturを使っていたが、Volarが推奨のようなので、Vscodeに行き拡張機能をインストールした。それに伴って使っていたVeturは無効にした.


######4. 生成されたCodeを確認する

``` vue
<script setup lang="ts">
// This starter template is using Vue 3 <script setup> SFCs
// Check out https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup
import HelloWorld from "./components/HelloWorld.vue";
</script>

<template>
  <img alt="Vue logo" src="./assets/logo.png" />
  <HelloWorld msg="Hello Vue 3 + TypeScript + Vite" />
</template>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
```

``` vue
<script setup lang="ts">
import { ref } from 'vue'

defineProps<{ msg: string }>()

const count = ref(0)
</script>

<template>
  <h1>{{ msg }}</h1>

  <p>
    Recommended IDE setup:
    <a href="https://code.visualstudio.com/" target="_blank">VSCode</a>
    +
    <a href="https://github.com/johnsoncodehk/volar" target="_blank">Volar</a>
  </p>

  <p>See <code>README.md</code> for more information.</p>

  <p>
    <a href="https://vitejs.dev/guide/features.html" target="_blank">
      Vite Docs
    </a>
    |
    <a href="https://v3.vuejs.org/" target="_blank">Vue 3 Docs</a>
  </p>

  <button type="button" @click="count++">count is: {{ count }}</button>
  <p>
    Edit
    <code>components/HelloWorld.vue</code> to test hot module replacement.
  </p>
</template>

<style scoped>
a {
  color: #42b983;
}

label {
  margin: 0 0.5em;
  font-weight: bold;
}

code {
  background-color: #eee;
  padding: 2px 4px;
  border-radius: 4px;
  color: #304455;
}
</style>
```

デフォルトで気になっていたscript setupの記法で書かれていた!!

https://v3.vuejs.org/api/sfc-script-setup.html#basic-syntax
Github Actions, StorybookでSecret値を使う





## components

App.js


REACT_APP_MESSAGEの値を引数として渡す

```
import './App.css';
import { Message } from './components/Message';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <Message message={process.env.REACT_APP_MESSAGE} />
      </header>
    </div>
  );
}
export default App;
```



Message.js

```
import React from 'react';

export const Message = (props) => {
  return <div>REACT_APP_MESSAGE: {props.message}</div>;
};
```



## stories

Message.stories.jsx

storybookでは、prefix `STORYBOOK_`を付けた環境変数しか認識しないので、
`STORYBOOK_`をつけた、`STORYBOOK_REACT_APP_MESSAGE`を使う


```
import React from 'react';
import { Message } from './Message';

export default {
  title: 'Example/Message',
  component: Message,
};

const Template = (args) => <Message {...args} />;

export const Primary = Template.bind({});
Primary.args = {
  message: process.env.STORYBOOK_REACT_APP_MESSAGE,
};
```


## Actions

storybookでは、prefix `STORYBOOK_`を付けた環境変数しか認識しないので、
`STORYBOOK_`をつけた、`STORYBOOK_REACT_APP_MESSAGE`を`env`に設定します。

```
name: Storybook Build and Deploy

on: [workflow_dispatch] # 手動トリガー

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout 🛎️
        uses: actions/checkout@v2

      - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built.
        run: |
          yarn install --frozen-lockfile
          yarn build-storybook
        env:
          STORYBOOK_REACT_APP_MESSAGE: ${{ secrets.REACT_APP_MESSAGE }}

      - name: deploy storybook 🚀
        uses: JamesIves/github-pages-deploy-action@v4.2.2
        with:
          branch: gh-pages # The branch the action should deploy to.
          folder: storybook-static # The folder the action should deploy.
```



# 参考

https://github.com/storybookjs/storybook/issues/12270
【Project Euler】Problem 41: パンデジタル素数

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 41. パンデジタル素数

原文 [Problem 41: Pandigital prime](https://projecteuler.net/problem=41)

**問題の要約：n桁のパンデジタル数で素数のものの最大値を求めよ**

パンデジタル数はもう何度も出てきていますが、今回は素数。例として素数2143が4桁パンデジタル数として挙げられています。これも最大値を求めよなので大きい順に探していきます。

```python
import itertools
import sympy

digits9 = "123456789"
found = False
for n in range(9,0,-1):     
  digits = digits9[n-1::-1]  # "987654321", "87654321",,,"21","1"
  for pstr in itertools.permutations(digits):  # pandigital number in decending order
    ps = ''.join(pstr)
    if sympy.isprime(int(ps)):
      found = True
      break
  if found: break
print(f"Answer: {ps}")
```
（開発環境：Google Colab）
djangoでモジュールごとにテストしたい。

自分用の備忘録です。

###階層とかの設定
①(app名)/tests ディレクトリを作成する。
②testsディレクトリにtestから始まる名前でファイルを作成する。
③testsディレクトリ直下に`__init__.py`を作成する。（重要）

###実行方法

↓プロジェクト全体のテストファイルをすべて実行するとき
`python manage.py test`

↓appごとに実行するとき
`python manage.py test (app名)`
例：`python manage.py test snippets`

↓testsディレクトリのファイルごとに実行するとき
`python manage.py test snippets.tests.(ファイル名)`
例：`python manage.py test snippets.tests.test_snippets_top.py`

###注意点等
・testsディレクトリ直下に`__init__.py`を置かないとファイルを認識してくれないらしい。

・ファイルの名前は`test`で始まらないとだめらしい。

・`python manage.py test`を実行するときは、ファイル名が重複しないようにする必要がある。（ファイルの名前にapp名とかつけるといいかも）

###参考記事
[【Django】ファイルの場所を変えたらTestが動かない](https://qiita.com/ragnar1904/items/ddd79ec516aa6af669bf)
【Project Euler】Problem 40: チャンパーノウン定数

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 40. チャンパーノウン定数

原文 [Problem 40: Champernowne's constant](https://projecteuler.net/problem=40)

**問題の要約：以下のように小数点以下のに自然数を 1 から小さい順に並べた少数点以下n桁目の数を$d_n$としたときの$d_1 × d_{10}× d_{100} × d_{1000} × d_{10000} × d_{100000} × d_{1000000} $を求めよ**

```math
0.12345678910112131415161718192021... \\ 
```

[チャンパーノウン定数(Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A3%E3%83%B3%E3%83%91%E3%83%BC%E3%83%8E%E3%82%A6%E3%83%B3%E5%AE%9A%E6%95%B0) に詳しい説明があります。プログラム的にはかなりシンプルです。

```python
import numpy as np
def Cham(maxlen):  # generate Champernowne's constant as long as maxlen
  ret = ""
  for n in range(1,N+1):
    ret +=  str(n)
    if len(ret)>maxlen: break
  return ret

print(f"Answer is {np.prod([int(Cham(10**6)[10**i-1]) for i in range(NP+1)])}")
```

（開発環境：Google Colab）
pipでインストールしたパッケージのコマンドが使えなかった話(python -m pip)

pipでインストールしたパッケージをコマンドで実行できない問題が発生したので問題状況と解決までを書きたいと思います

### 各種情報
プラットフォーム：MacBook Pro(intel-2019)
OS: macOS Monterey 12.0.1
Python: Python3.9.7
pip3 : pip 21.3.1 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)

# 問題状況
ESP32の開発環境整備のためcliからwebreplを使えるようにしたかった
そのために[upydev](https://carlosgilglez.gitbook.io/upydev/)というパッケージを見つけたのでインストールして使えるようにしたいと思い下記を実行

```bash
$ pip3 install upydev
```

問題なくインストールは完了した．

．．．．がしかし

```bash
$ upydev
zsh: command not found: upydev
```

なぜかコマンドが見つからないと言われてしまって困った


原因を調べていると，
> 過去のPythonのバージョンが残っていて、pipは過去のPythonで実行されている

という[こちら](https://news.mynavi.jp/techplus/article/zeropython-77/)から見つけた．


# 解決
ということで解決方法ですが，

**直接pipコマンドは使わず，pythonコマンドを介してpipモジュールを使う**

ということになりそうです．


```bash
$ python3 -m pip install <package-name>
```

とすることで実行できる．


実際にやってみた

```bash
$ python3 -m pip install upydev
  [...]
  Successfully installed upydev-0.3.7

$ upydev -v
upydev: 0.3.7
```

無事実行できた！


今度からpip3は**python3 -m pip**を使っていきたいと思います
【JavaScript】JavaScriptの複数配列のincludes

```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');
// Your code here!
var search = [1,2,3,4,5];


var data = [1,2,6,5];

search.forEach(function(element){
  console.log(data.includes(element));
});

```

#結果
```
true
true
false
false
true

```
【Project Euler】Problem 39: 整数の直角三角形

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 39. 整数の直角三角形

原文 [Problem 39: Integer right triangles](https://projecteuler.net/problem=39)

**問題の要約：整数の直角三角形の周囲の和pとするとp<1000で最も多いpを求めよ**

整数の直角三角形すなわちピタゴラス数の生成は「[Problem 9: 特別なピタゴラス数](https://qiita.com/masa0599/items/36a0b8a7d82e689de6d8)」で作った**pyth**を使います。生成された基本ピタゴラス数の周囲の和**p**の1000以下の倍数をすべて配列に入れ、これをCounterに入力して数えて最も多いものをmost_commonメソッドで取り出します。ただし要注意なのは**pyth**は必ずしも周囲の和**p**の小さい順には生成しないので**p=1000**で止めると、その後に1000より小さいものが出てくる可能性があるということです。

```python
from collections import Counter
N, p, peris = 1000, 0, []
pgen = pyth()
while p < N*2:  # need up to twice of the bound
  p = sum(next(pgen))
  for i in range(1,(N//p)+1): # Multiples up to N
    peris.append(p*i)

print(f"Answer: {Counter(peris).most_common()[0][0]}")  # extract most common number
```

そこで**p**をいくつまで生成すればいいか考えてみました。
**pyth**で**p**を$10^6$まで生成して、**p**以前のの最大値**pmax**との比率**p/pmax**の最小値**r**を求めます。数が大きくなっていくと**0.5**に収束していくようです。したがって1000以下の**p**をすべて生成するためには2倍の2000になるまでという条件で良さそうです。たぶん証明すれば出来るのでしょうが、誰か出来たら教えてください。

```python
pgen = pyth()
p, pmax, r = 0, 1, 1
while p < 10**6:
  p = sum(next(pgen))
  if p>pmax: pmax=p
  if (p/pmax) < r: r = (p/pmax)

print(f"Minimum s/smax ratio = {r}")
#Minimum s/smax ratio = 0.5035145516710452
```


（開発環境：Google Colab）
Yarn Workspaces





https://classic.yarnpkg.com/lang/en/docs/workspaces/





package.json

```
{
  "private": true,
  "workspaces": ["workspace-a", "workspace-b"]
}
```



workspace-a/package.json:


```
{
  "name": "workspace-a",
  "version": "1.0.0",

  "dependencies": {
    "cross-env": "5.0.5"
  }
}
```



workspace-b/package.json:


```
{
  "name": "workspace-b",
  "version": "1.0.0",

  "dependencies": {
    "cross-env": "5.0.5",
    "workspace-a": "1.0.0"
  }
}
```


# Add Storybook:


```
cd workspace-a
```

```
npx sb init
```
おうちクラウドの vRLI でログ収集してみる

こんにちは、@yama-s です。
本記事は自宅Lab環境（おうちクラウド）に以下製品の導入を試みた記録の続編で、
vRLI でログ収集を行います。

* vRealize Log Insight
* vRealize Network Insight

導入編
その1は[こちら](URLを記載)
その2は[こちら](URLを記載)

# ログイン
`http://vRLIのFQDNもしくはIPアドレス` にアクセスし、
ユーザー名とパスワードを入力してログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/a9d0c780-fedd-7709-9c4c-d2e344b91f78.png)

初回ログイン直後の画面は以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/90fed14b-67bf-0c01-9079-6202ef4eb2c9.png)

# ライセンス登録
管理 → ライセンス より、ライセンスキーを入力します。
ステータスがアクティブとなったことを確認後、
以下3つの観点でログソースを設定していきます。

* vSphere 統合
* エージェント
* Syslog

### vSphere 統合
vSphere 統合では、vSphere環境の vCenter Server および ESXi ホストのログを簡単な操作で取り込むことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/791c725f-c172-adb7-68e4-dd1df1555c8d.png)

統合対象の vCenter Server の情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/d724cacb-fbca-0de6-bd8a-f4bcfe03bdd2.png)

接続テストを行い、成功することを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/32fe204c-0de3-3c35-414b-d913fd402900.png)

「保存」をクリック後、数十秒で構成完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/82ac87bb-7748-eaee-9bfd-8d92340cbd67.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/b1e38bf6-c356-d53a-6cd8-a93033ef227d.png)

設定した vCenter Server の情報が表示され、ステータスが "収集" であることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/0c4fbc5e-ed6a-3c55-89c8-b99baa08abab.png)

ESXi ホストの詳細表示をクリックすると、vCenter 管理下の ESXi ホストの情報が確認できます。`UDP 514番` で収集しているようですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/a33524a4-7815-62a0-f754-eb3c9897d5f4.png)

本環境では、
1台目の vCenter Server (vcsa) で ESXiホストを2台、
2台目の vCenter Server (nested-vcsa) で nested-ESXiホストを4台、管理しています。
nested-vcsa の方も同様に設定してみます。

管理 → vSphere より、"+ VCENTER SERVER を追加" をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/f1e30bef-38c6-5eb0-7d86-f1f5c0a8505b.png)

2台目の vCenter Server の情報を入力し、接続テスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/a52bea7a-5002-b8b0-8241-e79843bc8acc.png)

保存をクリックし、構成完了まで待機
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/9fbd3f4e-aff3-b9e9-7985-dee0d18ae96c.png)
構成完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/878bc972-2ca4-fbb6-8f8d-b1a49ad5ed49.png)
2台とも登録完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/d93a97cb-34fb-0213-8d3a-c368f3bd162b.png)



### エージェント
こちらは、Syslog形式以外のログソースからログを収集する場合に、vRLI のエージェントを利用するパターンです。
環境上の Windows Server を例に実施します。

### Syslog
こちらは、Syslog形式のログソースからログを収集する場合に、Syslog転送先として vRLI を設定するパターンです。
環境上の NSX-T を例に実施します。

### さいごに
様々なログ管理製品がありますが、
vRLI の特徴として vSphere 環境上のログソース設定の簡単さ、シンプルで分かりやすい操作性などが挙げられますね。

是非使ってみてください。
configについて


引用した記事のため、閲覧のみお願い致します。
主にコマンドがどのような役割を示すのかを復習程度に記載しております。	

```

L2/L3スイッチネットワークの構築完了後には、Catalystスイッチのログを取得するのですが、その際に
入力しているCatalystスイッチのshowコマンドを紹介します。なお、紹介する show コマンドの入力前に
機器の設定保存と、出力中に「--More--」が表示されないよう、以下の2つのコマンドを入力しています。

# write memory
# terminal length 0

■　L2スイッチ/L3スイッチ共通 - 基本情報
#DRAMで稼働している現在のコンフィグレーション
　show running-config

#機器が出力しているログ	　
show logging	　

#IOSのバージョン、ライセンス状態、シリアル番号のなど
show version	　

#シリアル番号 （ SFPなどのシリアル番号情報も取得可能 ）
show inventory

#ライセンスの詳細情報	　
show license	　

#スタックしている場合、Master/Memberの確認、プライオリティ番号
show switch

#サービスモジュールを搭載している場合、CPUリンクやH/Wステータス
show switch service-modules

#時刻情報の確認
show clock	　

#NTPサーバとの同期情報の詳細
※細かい制御を行っている場合や公共系インフラの場合、show run all コマンドでデフォルト値を含めた全てを取得しています。
show ntp associations	　

■L2スイッチ/L3スイッチ共通 - ハードウェア情報
Ciscoコマンド	

#FAN、温度、パワーサプライの状態
show env all	

#CPU使用率
show process cpu	　

#メモリ使用率、空き容量
show process memory	　

#フラッシュメモリの中身、使用率　
show flash:	　

#60秒、60分、72時間におけるCPU平均使用率、CPU最大使用率
show process cpu history	　

#PoEスイッチの場合、電源供給能力、供給状態、供給デバイス、クラス
show power inline	　

■L3スイッチ - Layer3情報

#現在起動中のルーティングプロトコルのステータス
　show ip protocols	

#ルーティングテーブル情報
show ip route

#ルーティングテーブルのサマリー(集計したり要約しているものを示す単語)
show ip route summary

#VRFごとのルーティングテーブル。「XXX」には定義したVRF名を指定
show ip route vrf XXX	

#EIGRPが有効化されたインターフェースでのEIGRPトラフィックの情報
show ip eigrp interfaces　

#EIGRPの送受信された各種パケット数
show ip eigrp traffic	　

#EIGRPのネイバーテーブル
show ip eigrp neighbors	

#EIGRPにおけるサクセサとフィージブルサクセサのルート情報
show ip eigrp topology	　

#EIGRPネイバールータから受信した全てのルート情報
show ip eigrp topology all-links	　　

#EIGRPのルート情報
show ip route eigrp

#OSPFにおけるLSAを格納しているリンクステートデータベース
show ip ospf database	　

#OSPFの有効なインターフェース、PID、エリア、コスト値などの一覧
show ip ospf interface brief	　

#OSPFネイバールータの一覧
#OSPFのルート情報
show ip ospf neighbor	　
　show ip route ospf	

#BGPのネイバールータ　　
show ip bgp neighbor	

#BGPステートがEstablished、Active、Idleなのかを一覧情報で表示
show ip bgp neighbor | include BGP state	

#BGPテーブル
show ip bgp

#BGPテーブルのサマリー
show ip bgp summary	　

#x.x.x.xで指定したBGPネイバーの受信経路
show ip bgp neighbor x.x.x.x route	　

#x.x.x.xで指定したBGPネイバーの通知経路
show ip bgp neighbor x.x.x.x advertised-route	

#BGPのルート情報
show ip route bgp	　


■L3スイッチ - Layer3情報 その2

#各VLANごとのHSRPのActive or Standbyステータス、Priority、IPアドレス
show standby brief

#各IPアクセスリストのカウント情報　
show ip access-lists	　

#各ルートマップの設定情報、ポリシーマッチ情報
show route-map	　

#DHCPクライアントへのIPアドレスへの配布ステータス
show ip dhcp binding	　

#SLAの詳細情報（Service Level Agreementの略で、「サービス品質保証」の意味）
show ip sla statistics	

特権EXECモード等もあるにはあるけども本記事では控えます。
最近Teratermマクロも作れたので、今後載せようかと考え中です。

```
Laravel Mix の使いかた

こちらのページと同様のことを行いました。
[Stand-Alone Projects](https://laravel-mix.com/docs/6.0/installation#stand-alone-projects)

簡易サーバーのインストール

```bash
sudo npm install http-server -g
```

Mix のインストール

```bash
mkdir my-app && cd my-app
npm init -y
npm install laravel-mix --save-dev
```

Mix の設定ファイルを作成

```js:webpack.mix.js

let mix = require('laravel-mix');

mix.js('src/app.js', 'dist').setPublicPath('dist');
```

この時点でのフォルダーの構造

```text
$ tree -L 1
.
├── node_modules
├── package.json
├── package-lock.json
└── webpack.mix.js
```

ソースファイルの作成

```js:src/app.js
alert('こんにちは')
```

コンパイル

```bash
npx mix
```

![success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c495d06a-d5c8-e06f-8550-f3fb503ce354.png)


HTML ファイルの作成

```html:dist/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
</head>
<body>
	<script src="app.js"></script>
</body>
</html>
```

dist で簡易サーバーの起動

```text
$ http-server 
Starting up http-server, serving ./

http-server version: 14.1.0

http-server settings: 
CORS: disabled
Cache: 3600 seconds
Connection Timeout: 120 seconds
Directory Listings: visible
AutoIndex: visible
Serve GZIP Files: false
Serve Brotli Files: false
Default File Extension: none

Available on:
  http://127.0.0.1:8080
  http://192.168.1.15:8080
Hit CTRL-C to stop the server
```

クライアントで
http://127.0.0.1:8080
にアクセス
![laravel_mix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9565d4fd-d3de-a2d7-d0a7-ad10204cf000.png)
GeoJSON(ライン)からsource, targetをペアにした配列を作る

地図ライブラリにラインデータを渡す際にsource, targetをペアにしたデータに変換して渡したいときがあるので、その変換方法のメモ。


もととなるGeoJSON(ライン)

```json
const geojson = {
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "LineString",
        "coordinates": [
          [
            -1.0272216796875,
            47.97889140226657
          ],
          [
            -1.9720458984374998,
            47.743017409121826
          ],
          [
            -2.537841796875,
            48.05605376398125
          ],
          [
            -3.1256103515625,
            48.03034580796616
          ],
          [
            -4.04296875,
            48.25759852914997
          ],
          [
            -4.290161132812499,
            48.36354888898689
          ]
        ]
      }
    }
  ]
}
```

変換処理

```js
const result =  geojson.features
  .map(d => d.geometry.coordinates)
  .flat()
  .reduce((a,c, i, array)=>{
  if(!array[i-1]) return a;
    a.push({ source: array[i - 1], target:c})
  return a;
},[])

console.log(result)
> [
	{
		"source": [
			-1.0272216796875,
			47.97889140226657
		],
		"target": [
			-1.9720458984374998,
			47.743017409121826
		]
	},
	{
		"source": [
			-1.9720458984374998,
			47.743017409121826
		],
		"target": [
			-2.537841796875,
			48.05605376398125
		]
	},
	{
		"source": [
			-2.537841796875,
			48.05605376398125
		],
		"target": [
			-3.1256103515625,
			48.03034580796616
		]
	},
	{
		"source": [
			-3.1256103515625,
			48.03034580796616
		],
		"target": [
			-4.04296875,
			48.25759852914997
		]
	},
	{
		"source": [
			-4.04296875,
			48.25759852914997
		],
		"target": [
			-4.290161132812499,
			48.36354888898689
		]
	}
]
```
MySQLのGPGキー有効期限が切れて、公式リポジトリからインストール出来なくなった話

# 回避策
暫定と思われるキーをインポートしてから、MySQLインストールすることで回避出来た。

```
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

# Ubuntu
wget -q -O https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 | apt-keyadd-
```

# エラーメッセージ
```
Public key for mysql-community-client-8.0.28-1.el7.x86_64.rpm is not installed

 Failing package is: mysql-community-client-8.0.28-1.el7.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
```

# 参考
https://support.cpanel.net/hc/en-us/articles/4419382481815-Installer-fails-due-to-The-GPG-keys-listed-for-the-MySQL-repository-are-already-installed-but-they-are-not-correct-for-this-package-

https://bugs.mysql.com/bug.php?id=106188
Mac App Storeでインストールがうまく行かない場合に確認するログ

### Macアプリの審査が通ってリリースしたけど、自分のMacにインストールできない！

macOSアプリを作って無事リリースに漕ぎ着けましたが、実際にApp Storeからインストールしようとしたらうまくいきませんでした。
App Storeのインストールログはどこか、と思って調べたら以下のパスでした。

```
/var/log/install.log
```

tail等で中身を確認して問題解決してください。

#### 私の失敗理由

ちなみに私がインストールに失敗した理由は以下の通りでした。
今回作成したmacOS版はすでにリリースされているiOS版のデスクトップ版という位置付けで、まずはリリースをするという目的だったので、バージョンはiOS版より低いものでした。
で、ログの中に以下のようなメッセージを見つけました。

```log:install.log(抜粋)
...
2022-01-19 10:05:35+09 mymac installd[1148]: PackageKit: Skipping component "com.example.myapp" (1.2.0-5.0.0-*) because the version 1.3.0-1.3.0-* is already installed at /Users/account/AndroidStudioProjects/my_app/ios/DerivedData/Runner/Build/Products/Debug-iphoneos/.XCInstall/MyApp.app.
...
```

AndroidStudioで作っていたiOSアプリのビルドフォルダを削除していなかった、というお粗末な内容でしたが、ログファイルを確認したおかげで解決できました。
Outlook VBAで特定のフォルダのメールを開封済みにする。

#はじめに
やりたいことは表題の通り。最初は仕訳ルールを使って開封済みにしていたが、開封済みにする動作は[クライアントルール](https://support.microsoft.com/ja-jp/office/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E5%81%B4%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%A8-%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88-%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AE%E6%AF%94%E8%BC%83-e1847992-8aa1-4158-8e24-ad043decf1eb)の為か、休みの間に数万件とか溜まっていると~~勝手に開封をあきらめやがる~~正常に動作しなかった（そもそも数日で万単位で飛んでくるメールて何！？）。
フォルダ移動はできているので開封済みにしなくても支障はないんだけど、圧がすごいので何とかならないか調べたらOutook VBAなるもので出来るようだったので調べながら実装。

#仕様
上記でも記載した通り、フォルダ移動は仕訳ルールで問題なく処理できている為、未読メールを開封済みにする処理をVBAにやらせる。

開封したいフォルダは1つではないので、特定のフォルダの配下にあるフォルダの中にあるメールを開封済みにするようにした。
具体的には「開封」フォルダを作って、開封済みにしたいフォルダをその配下に置けば勝手に開封済みにしていってくれる。

#実装
```vb:MailOpen
Private Sub Application_NewMail()

        Dim mail As Object
        Dim myNameSpace As NameSpace
        Dim myInbox As Object
        Dim folder As folder
        Dim strFilter As String
        Dim word As String
        
        word = "開封"
        strFilter = "[UnRead] = True"
        Set myNameSpace = GetNamespace("MAPI")
        Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox).Folders(word).Folders '・・・1
            
        For Each folder In myInbox '・・・2
        
            While folder.UnReadItemCount <> 0 '・・・5
            
                For Each mail In folder.Items.Restrict(strFilter) '・・・3
                
                    mail.UnRead = False '・・・4
                    
                Next mail
                Set folder = myNameSpace.GetDefaultFolder(olFolderInbox).Folders(word).Folders(folder.Name) '・・・6
            
            Wend
            
        Next
        
End Sub

```

#解説
1. 変数wordのフォルダ名（今回は「開封」）のフォルダ配下のフォルダ共を変数に入れている。

1. myInboxの中をループ。つまり「開封」フォルダの配下のフォルダを順番に確認してる。

1. 対象フォルダ内の未読メールを順番に処理。Restriictでフィルタかけないととんでもないことになる。

1. [Unread]をFalseにしてる。それだけ。

1. なんでか知らないけど、3.のForEachだけだと全部開封されない（だれか原因おしえてください）ので未読がある限りループさせるようにした。

1. folderが動的じゃないようなので、フォルダの状況を取得しなおしてる。これがないと無限ループする。


#おわりに
やりたいことはできたけど、未読が千超えると処理がめっちゃ遅い。おとなしく手動で「すべて開封済みにする」をしたほうが早い。

なんか腑に落ちない部分が多いので暇なときに調べて改善するかもです。
こうしたほうがいいよとか教えてくれるとたぶんすんごい喜びます。
【エラー】新しいパソコンに違うバージョンのPHPを入れてしまった。

今回、新しいパソコンに変更するにあたり、一から新しいパソコンにXAMMP、composer、laravelをインストールしました。

そして、以前のパソコンでphp,laravelの作成していたポートフォリオの開こうと、
「php artisan serve」を入力したら、えらい勢いで怒られました((+_+))

それがこの写真（コマンドプロンプトの写真を撮り忘れたので、コピペを張り付けた写真です）
![dobonerr0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203654/69c9aba5-6a6c-1339-c147-4a492098a653.png)

wordに横設定した用紙に張り付けた書類です。写真には#11の項目で終わってますが、
実際には３ページ分続きました。しかも・・赤いラインも入って、、、

まじ、ビビりました((+_+))


で、なぜこのようなエラーで返されたかというと
結論から申し上げますと、
__パソコンにインストールしたバージョンと、ポートフォリオのデータの内容のバージョンが異なっていたことによって生じたエラーだということでした。__

と、いうことで、ここから解消するために私は次のことを行っていきました。


__１、PHPのアンインストールして、再度PHPを再インストール__
__２、platform_check.phpの修正__
__３、composerのアップデート__

では、順番に見ていきます。

####１，PHPのアンインストールして、再度PHPを再インストール

私の場合、以前使っていたパソコンのPHPバージョンは7.0であり、今回インストールしたPHPバージョンは8.0でした。
本来なら、何かしらのソースを入力したらバージョンをダウンする方法があるのだと思うのですが、
面倒くさがりの私は、一端PHPをアンインストールして、もう一度インストールするときにバージョンを最新のものではなく、7.4.27バージョンにしました。（XAMMPにてバージョン7.4.27をダウンロード）

####２、platform_check.phpの修正
さぁこれで使えるのかなと思ったら、またこんな感じで怒られました。

![dobonerr1_LI (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203654/26d51ec6-1897-60f3-b8af-1167a2110955.jpeg)


結論から言えば、
__platform_check.phpでバージョンを8.0.0になっているから、バージョン7.4.27が使えるように変更してください__

とのことです。

では、自分のファイルのplatform_check.phpを開きます。
![dobonerr2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203654/65496367-ed4c-ddc0-47cd-21d47e78c7ec.png)

７行目の数字が80000になってます。
これがバージョンになるのですね。

ここを70000にしました。こうすることでバージョン７以上のものという式に代わります。
![dobonerr3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203654/85fe66d2-7397-6edf-556c-d887eac87de7.png)

####３、composerのアップデート
これでつかえるかなと、再度「php artisan serve」を実行。それでもまだエラーが返ってきます。


![dobonerr4_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203654/b10dd0fc-d9af-3192-aef5-bc11d1d5e3a2.jpeg)


何々、今度はLoggerInterfaceTest.phpがおかしいとのことです。

けど、これに対しては、講師に質問して「composerをもう一度最新にアップデートすることで解消すると思うので、やってみて」とのことでしたので、
コンポーザーをアップデートしてみました。

![dobonerr5_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203654/5a367a72-b7b3-3b82-1793-d475c6045cc7.jpeg)


composer update と入力し、完了した後、
再度php artisan serveを試したところ、無事につなぐようになりました。


よくわからないながら、出来ました。同じ過ちになった方に少しでも役に立てたらと思います。

以上です。
Unity2021.2のWindowsIL2CPPビルドが失敗する問題の解決方法

# はじめに

少し前に購入した自宅用のゲーミングノートPCでOculusQuest2の開発環境を整えているところで、見慣れないエラーでビルドが失敗する問題に遭遇しました。

日本語の記事がないかなと思い、念のため記事にしておきます。

https://twitter.com/mochi_neko_7/status/1483366725907513349?s=20

# 環境

- Windows 10
- Unity 2021.2.8f1
    - 2022/01/19現在で正式版の最新バージョン

# 問題

Windows向けのIL2CPPビルドが失敗しました。

同様の現象がUnity Forumにも投稿されていたので、エラーログはこちらを参照してください。

https://forum.unity.com/threads/solved-il2cpp-build-failed-2021-2-6.1212261/

ちなみに、まったく同じUnity Projectを会社のPCで開いてビルドしてみたところ問題なくビルドが成功したので、環境依存の問題であることまでは特定できていました。

# 原因

Windows 10 SDKがインストールされていないWindowsのPCで、ビルド時に内部でダウンロードが発生し、それがUnity社内にアクセスしていてネットワークエラーが発生しているのが原因のようです。

フォーラムにもあるように、これはUnity側の不具合と思われます。

# 対処法

Windows 10 SDKを使用しているPCにインストールすることで解決することが確認できました。

インストール方法は公式のページ

https://developer.microsoft.com/ja-jp/windows/downloads/windows-sdk/

にもありますが、インストーラーからダウンロードするか、Visual Studioを使用している人はVisual Studio Installerからも簡単にインストールすることができます。

# おわりに

環境依存でかつエラーログから対処法が想像しづらい（最初はネットワークの問題かと思った）問題への対処は大変ですね...

フォーラムの投稿が見つからなければもっと苦戦していました。

これでやっと安心してOculusQuest2の趣味開発ができます。
Jupyter Labで不要なショートカットキーを無効化する

# 経緯
Jupyter Labをvimのキーバインドで操作するため「@axlair/jupyterlab_vim」を利用していたが、ある時からEscキーを押すとセルの移動モード(Commandモード)に切り替わるようになってしまったため、Vimでの操作に支障が出るようになった。

# 概要
Jupyter Labデフォルトの「EscキーでCommandモードに切り替え」というショートカットを無効化し、jupyterlab_vimのEscキーに割り当てられた以下のショートカットを有効化する。

* Esc：ノーマルモードへの切り替え
* Shift + Esc： Jupyter LabのCommandモードへの切り替え

# 設定方法

1. Jupyter Labのメニューから「Settings > Advanced Settings Editor」を開く。

2. 「Keyboard Shortcuts」タブを開き、「User Preferences」に以下の通りデフォルトのEscキーに割り当てられたショートカットを無効化するための設定を入力する。入力後は右上の保存ボタンを押す。

```json
{
    "shortcuts": [
        {
            "command": "notebook:enter-command-mode",
            "keys": [
                "Escape"
            ],
            "selector": ".jp-Notebook.jp-mod-editMode",
            "disabled": true
        },
    ]
}
```

![スクリーンショット 2022-01-19 11.09.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802246/81dc8280-5af8-a014-0cca-ca318631572c.png)
3. 編集画面をリロードし、jupyter_vim側のショートカットキーが有効化されていることを確認する。
【Django】SNS app作成手順03-ログインページの作成

—————login.html作成----------

{% extends 'base.html' %}

{%block content%}
<body class="text-center">
    {{context}}
    
    <main class="form-signin">
      <form method='POST'>{% csrf_token %}
        <h1 class="h3 mb-3 fw-normal">Please login</h1>
        <div class="form-floating">
          <input type="text" class="form-control" id="floatingInput" name='username' placeholder="name@example.com">
          <label for="floatingInput">username</label>
        </div>
        <div class="form-floating">
          <input type="password" class="form-control" id="floatingPassword" name='password' placeholder="Password">
          <label for="floatingPassword">Password</label>
        </div>
        <button class="w-100 btn btn-lg btn-primary" type="submit">login</button>
        <p class="mt-5 mb-3 text-muted">&copy; 2017–2021</p>
      </form>
    </main>
    
    
        
</body>
{%endblock content%}


—————views.pyへ追記----------

def loginfanc(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request,username = username,password = password)
        
        if user is not None:
            login(request,user)
            return render(request,'login.html',{'context':'login'})
        
        else:
            return render(request,'login.html',{'context':'notlogin'})
        
    return render(request,'login.html',{'context':'get method’})


—————urls.pyへ追記----------

path('login/', loginfanc, name = 'login'),
LINEログインで404「The authorization server denied the request. This channel is now developing status. User need to have developer role.」が出た

# 概要
LINEログインを実装中、404エラーが出て、調べているうちにいろいろと解決法が集まったのでまとめます。

**状況**
LINE Developersに登録しLINEプロバイダーとLINEログインチャネルを作成。作成したWebアプリに表示されたLINEログイン画面から、私用のLINEアカウント（Developerに登録したものとは別）でログインを試みる。
「404　The authorization server denied the request. This channel is now developing status. User need to have developer role.」

# 解決方法
LINE Developersから、ログインを試みている**LINE Loginチャネル**を開きます。
![スクリーンショット (20)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153548/d5f8eafd-a2e6-d44c-1ad1-cd6fd0173730.jpeg)

画像左上にのようにチャネルのモードが表示されます。**Developing**だと一般のユーザーはそのチャネルを用いてログインできません。
開発モードでログインをテストしたい場合、Roleタブの「Invite by email」を選択。
![スクリーンショット (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153548/fdcf7a11-cb31-0a6e-a2c6-b9997de40f8a.png)

ログインしたいLINEアカウントのメールアドレスを登録します。Roleは**Tester**をお勧めします。Adminでもログインのテストは行えますが、不必要に大きな権限を与えるのは良くないので。

登録したメールアドレスに、LINE Developersから招待メールが届くので承認します。このとき、アカウントがDevelopersに登録されていない場合、登録が求められます。
成功！

# それでもできない！
・RoleがMemberになってないか
・権限を付与したチャネルはLINELoginか（Message APIとかになってないか）
・試行しているアカウントとRoleに登録したアカウントは同じか

# 公開について
状態はdevelopingからPublishdにすれば権限のない一般ユーザーでもLINEログインを行えるようになります。ただ、一度公開すると再び非公開にすることはできず、チャネルごと削除するしかなくなります。


# 参考記事
大変お世話になりました。ありがとうございます。
参照日（2022/01/19）
https://zakkuri.life/%E3%80%90laravel%E3%80%91line%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A7%E8%A9%B0%E3%81%BE%E3%81%A3%E3%81%9F%E3%83%A1%E3%83%A2/
https://www.line-community.me/ja/question/5e67496a851f7402cd95fbfe
Javaを通してPDFをPDF / Aに変換する方法

##背景
PDF形式をPDF / A形式に変換することにより、ドキュメントのレイアウト、フォーマット、フォント、サイズなどが変更されないように保護し、ドキュメントの読み取りとアクセスを保証しながら、ドキュメントのセキュリティ保護の目的を達成できます。この記事では、Javaバックエンドプログラムコードを使用してPDFをPDF / A1A、2A、3A、1B、2B、および3B標準に変換する方法を示します。以下は、その方法と手順です。

jarパッケージのインポート
Spire.Pdf.jarはこのプログラムにインポートされます。**[ダウンロード](https://www.e-iceblue.com/Download/pdf-for-java.html)**とインポートを実装するために、Mavenプログラムでpom.xmlの次のコンテンツを構成できます。
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>
または、Jarをローカルにダウンロードして解凍し、libフォルダーでjarファイルを見つけてから、Javaプログラムで次の操作を実行して手動でインポートすることもできます。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/42c6128f-ff74-15e8-5991-324c3bcdea82.png)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/c4c7c6e6-da98-af6c-6517-3d4c1022693a.png)
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/5582e07d-752d-1b6e-424b-dbe418e6d386.png)

フォーマット変換を実現するには、それを完了するために必要なコードは2行だけで、ターゲットのPDF / Aフォーマットが取得できます。変換を実装するためのコードサンプル手順は次のとおりです。

1.	PdfStandardsConverterクラスのオブジェクトをインスタンス化し、PDFソースドキュメントをロードします。
2.	上記の表で指定されたメソッドを呼び出して、PDFを指定された標準形式のPDF / Aに変換し、保存します。

##Javaコード一覧
```
import com.spire.pdf.conversion.PdfStandardsConverter;

public class PDFtoPDFA {
    public static void main(String[]args){

        //PdfStandardsConverterクラスのオブジェクトを作成し、ドキュメントパスを渡す
        PdfStandardsConverter converter = new PdfStandardsConverter("C:\\Users\\Administrator\\Desktop\\sample.pdf");
        //PdfA1Aに変換する
        converter.toPdfA1A("ToPdfA1A.pdf");
        //PdfA1Bに変換する
        converter.toPdfA1B("ToPdfA1B.pdf");
        //PdfA2Aに変換する
        converter.toPdfA2A("ToPdfA2A.pdf");
        //PdfA2Bに変換する
        converter.toPdfA2B( "ToPdfA2B.pdf");
        //PdfA3Aに変換する
        converter.toPdfA3A( "ToPdfA3A.pdf");
        //PdfA3Bに変換する
        converter.toPdfA3B( "ToPdfA3B.pdf");
    }
}
```

PDF/A形式の変換した結果は以下のように：
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/5aa3c696-6ba3-eb12-beca-a652978db6bd.png)

今回のPDFからPDF/A形式に変換する方法は以上でした。最後まで読んでいただきありがとうございます。
[py2rb] 辞書の値が関数

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# 辞書の値が関数 (Python)
```python
def a(k, v):
    print(k, v)

def b(k, v):
    print(k, v)

h = {'func a': a, 'func b': b}

h['func a']('A', 1)
h['func b']('B', 2)

# A 1
# B 2
```
辞書の値に関数を入れておいて、引数を渡します。
動的プログラミングですねえ。
# 失敗 (Ruby)
```ruby
def a(k, v)
  p [k, v]
end

h = {'func a' => a}

main.rb:1:in `a': wrong number of arguments (given 0, expected 2) (ArgumentError)
```
ハッシュにメソッドを入れた時点でエラーになります。
# 成功 lambda (Ruby)
```ruby
a = lambda { |k, v| p [k, v] }
b = lambda { |k, v| p [k, v] }

h = {'func a' => a, 'func b' => b}

h['func a'].call('A', 1)
h['func b'].call('B', 2)

# ["A", 1]
# ["B", 2]
```
`lambda`だと成功します。
# 成功 method (Ruby)
```ruby
def a(k, v)
  p [k, v]
end

def b(k, v)
  p [k, v]
end

h = {'func a' => 'a', 'func b' => 'b'}

method(h['func a']).call('A', 1)
method(h['func b']).call('B', 2)

# ["A", 1]
# ["B", 2]
```
`def`のままで行いたい場合は、`method`を使用します。
# 成功 class (Ruby)
```ruby
class A
  def self.call(k, v)
    p [k, v]
  end
end

module B
  def self.call(k, v)
    p [k, v]
  end
end

h = {'func a' => A, 'func b' => B}

h['func a'].call('A', 1)
h['func b'].call('B', 2)

# ["A", 1]
# ["B", 2]
```
`class`も`module`もいけてる。
# メモ
+ Python の 辞書の値が関数 を学習した
+ 百里を行く者は九十里を半ばとす
[Unity]Cube map テクスチャをモデルに投影する

小ネタ。
XR関係が多いと思いますが、何らかの経緯で取得したテクスチャがキューブマップ（Cube map）で、それをモデル上に投影しようと思ったとします。というのが今回の課題。

# texCUBE を使う
シェーダには３次元ベクトルでキューブマップを参照する関数 texCUBE があり、これを利用することになるでしょう。

# Skybox シェーダを使う
すでに texCUBE を使用した Skybox シェーダがありますから、これを使えばよさそうです。が、そのままではうまくいきません。

# Skybox シェーダの何が足りないのか
Unity はバージョンごとに組み込みシェーダのソースコードが公開されていますので、

https://unity3d.com/get-unity/download/archive

ここから Built in Shaders をダウンロードして

> DefaultResourcesExtra/Skybox.shader

を見てみますと、頂点シェーダに

```glsl
o.texcoord = v.vertex.xyz;
```

という記述があります。Cube map を引くための座標にモデルのベクトルを直接投入していますね。通常の Skybox は移動することがないのでこれで良いのですが、カメラや物体座標も適用しないと任意のモデルには貼り付けられません。

# 修正

```glsl
//o.texcoord = v.vertex.xyz;
o.texcoord = mul(UNITY_MATRIX_MV, v.vertex);
```

先ほどの行をこのように修正して、Quadなどでも Cubemap（のうちそのモデルが視界を覆っている部分）を表示できるようになりました。

https://twitter.com/dsedb/status/1483618735025917953?s=21

実際に修正したものを利用するには、この Skybox.shader を自身のプロジェクトにコピーして、シェーダの名前を変更するのがいいでしょう。
【正規化の要点をギュッと凝縮】第1正規化から第3正規化まで

## はじめに
DBの設計を意識したポートフォリオ作成がしたかったため、最低限必要な第1正規化から第3正規化を理解するためにインターネットの記事を見ながら自分なりに要点をまとめてみました。
参考にした記事は本文の一番最後に記載しております。

## 正規化はなぜ必要?
・正規化とはDBの矛盾を設計レベルで防ぐこと

⇒正規化を正しく行うことで矛盾のないDBを設計することができるようになる！

・正規化は非正規形から第6正規形まであるが、基本的には第3正規形までできてればOK

・不整合が起こるのを防ぐことで、メンテナンスの効率UPにつながる

**例）社員テーブル更新時の矛盾**

営業部の部長が「佐藤」から「中山」に変更になった際に、社員の鈴木の行の部長名が変更できてない
![5EA9EE9F-6CAC-40B6-8630-6352718554EB_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516225/06a33556-ea82-e3c8-950b-c649b1ecccc3.jpeg)


## 覚えておきたい用語

### 候補キー（≒ 主キーやユニークキー）

テーブル上で任意のレコードを特定するためのカラムのこと。

例えば、社員番号などは主キーに値する。

### 非キー

主キー（PRIMARY KEYやUNIQUE）以外のカラムのこと。

### 関数従属

あるレコードにおいてXの値が決まれば、Yの値も特定できる関係のことを**関数従属**という。

⇒候補キー（主キー）が決まれば、他の値も定まる

**例）社員番号**

社員番号が決まれば、付随する「名前」、「部署」、「役職」を特定することができる。

![8B02CC6B-5389-4BA7-81CB-26F41DBF7E11.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516225/960bd949-4d86-809d-8894-8c111faa9fa7.jpeg)

この場合、「名前」、「部署」、「役職」は「社員番号」に関数従属していると言える。

### 部分関数従属

複合主キーの一部の項目だけで列の値が特定できる関係のことを**部分関係従属**という。（詳細は第2正規化で！）

上記は1つの候補キー（主キー）によって特定できる関係、部分関数従属は複数の候補キーによってそれぞれ特定できる関係というイメージ。

### **推移的関数従属**

主キー以外の列に関数従属している列のことを推移的関数従属という。

## 第1正規形から第3正規形まで

### 第1正規形

テーブル形式（表形式）で表現できる形であれば第1正規化の条件はクリア！

ただ注意点としては、テーブルの横の長さは統一すること。
![F0EF2102-AD0C-4A20-9467-84C665CD401C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516225/001f6a79-07a1-98fa-190a-81c94ae12a63.jpeg)


### 第2正規形

部分従属しているものを切り離し、従属関係を分離させる方法を第2正規化という。

**例）受注管理テーブル（第1正規形）を第2正規化する**
![96E045A8-34FF-4B46-8F8C-1BCAA49E144D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516225/c1994e5a-6348-f62b-5db2-42838571abee.jpeg)

### 第3正規形

第2正規化で分離したテーブルを更に分離するこを第3正規化という。

上記の図のテーブルはこれテーブルはこれ以上分離することはできないが、更に細かく分離することで表に追加情報を付け加えやすくなることに加え、より管理効率を上げることができる。

## 最後に
最後までご覧頂きありがとうございます。
まだまだ知識不足なので、認識が異なる部分ございましたら教えていただけると嬉しいです。

## 参考

[https://qiita.com/mochichoco/items/2904384b2856db2bf46c](https://qiita.com/mochichoco/items/2904384b2856db2bf46c)

[https://medium-company.com/正規化/](https://medium-company.com/%E6%AD%A3%E8%A6%8F%E5%8C%96/)

[https://breezegroup.co.jp/202005/database-normalization/](https://breezegroup.co.jp/202005/database-normalization/)

[https://oss-db.jp/dojo/dojo_info_04](https://oss-db.jp/dojo/dojo_info_04)
zsh 設定メモ


`~/.zshrc` に次を記載

```~/.zshrc
# 環境変数
export LANG=ja_JP.UTF-8

# 日本語ファイルを扱えるようにする
setopt print_eight_bit

# 履歴
HISTFILE=~/.zsh_history
HISTSIZE=1000000
SAVEHIST=1000000

# 直前の重複を記録しない
setopt hist_ignore_dups
```

## コマンドの自動サジェスト 

`zsh-autosuggestions` をインストール

```
% brew install zsh-autosuggestions
```

`~/.zshrc` に次を記載

```~/.zshrc
source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh
```


## 構文ハイライト

`zsh-syntax-highlighting` をインストール

```
% brew install zsh-syntax-highlighting
```

`~/.zshrc` に次を記載

```~/.zshrc
source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
```
エンジニアに必要なググり力

日頃お世話になっているしまぶーさんのYoutube動画を拝見し、非常に参考になりましたのでここに簡単にまとめておきたいと思う。

【参考】
<a href="https://youtu.be/kNiD4rfNkFA">エンジニアは検索力が大事。プログラミングスキル向上にググり力は必須です。</a>

<h2>まとめ</h2>
詳細は動画を見ていただきたい。
要点として、簡単にまとめると以下の通り。

__エラーでググる__
　エディタ、もしくはブラウザのエラー文言でググる

__頭の中のワードでググる__
　例：css読み込まない

__リファレンスでググる（読む）__
　例：検索可能であれば検索する

__英語でググる__
　例：how to use ○○、how to get darkmode

__Githubでググる__
　リポジトリ内で検索する。Code、Issue、Discussionをよく使う



現場でわからないことにぶつかったとき、参考にしたい。
Salesforceの組織情報でできること

Salesforceで組織情報（Company　Information）でできることはこちらになります

![組織情報１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6b5c3728-4fca-1614-73db-ecbd5afe1f78.png)

![　組織情報２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4daf83ae-f818-6615-c6f4-3b822de11a0f.png)
Nodemon【Node.jsアプリケーションを自動的に再起動ツール】

## Nodemonとは…

nodemonは、ディレクトリ内のファイルの変更を検出すると、自動的にnodeアプリケーションを再起動することで、node.jsベースのアプリケーションの開発を支援するツールです。

https://www.npmjs.com/package/nodemon

##インストール方法

npmまたはyarnを利用してインストールすることができます。
開発環境のみで使用するので、ローカルインストールの方法でいいと思います。


#####グローバルインストール

```typescript:
npm install -g nodemon 
yarn global add nodemon
```

#####ローカルインストール

```typescript:
npm install nodemon --save-dev
yarn add nodemon --dev
```

ローカルにインストールすると、コマンドラインから直接nodemonコマンドを使用できません。
`package.json` の scripts  に設定すると、`npmコマンド` で起動できるようになります。
以下では`npm devStart`で利用できるように設定しました。

```typescript
"scripts": {
    "devStart": "nodemon server.js",
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
```

##起動してみる


```
>npm run devStart

> sample-api@0.1.0 devStart
> nodemon server.js

[nodemon] 2.0.15
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `react-scripts start server.js`

```

nodemon経由で`server.js`ファイルが起動されました。
手動で再起動させたい時は`rs`でできます。

##変更があると

以下のように自動でコマンドがはしり、コンパイルしてくれます。

```typescript
Compiling.....

Compiled successfully!
```


##参考

https://www.wakuwakubank.com/posts/680-nodejs-nodemon/


https://www.npmjs.com/package/nodemon
ミラーレスカメラの活用

# この記事で学べること

- ffmpegの使い方(ごく一部、氷山の一角)
- 家に転がってるNEX-7の有効活用方法

# 必要なもの

- Linux
    - 筆者はKernelを自前でビルドしてるUbuntu 21.10を利用
- 家に余ってるSONY αNEX-7
- HDMIキャプチャーボード
    - 筆者は[これ](https://www.amazon.co.jp/dp/B083LQCPC1?th=1)を利用
- 他、常識的に必要なケーブル類など

# 顔出しオンラインミーティングで差をつけろ！

## やること

###概要

HDMI出力に対応したカメラの出力をPCからカメラデバイスとして認識させる。
α6000番台など最近のカメラはイメージセンサーに入ってきた映像をそのまま出力できるがNEX-7のようなカメラでは背面液晶に映っている画像を出力することとなるので、余計な表示が入らないようにする。
Zoom等で顔出しミーティングに参加する。

それでは次項から詳しく見ていくとしよう。

### NEX-7の液晶の解像度を調べる

[SONYのサイト](https://www.sony.jp/ichigan/products/NEX-7/spec.html)で仕様を確認する。
総画素数が 921,600 となっておりアスペクト比は記載されていないが16:9なので、1280x720である。

### NEX-7の液晶に表示される余計な物を消す

イメージセンサーが3:2なので液晶の(0,0)から(1080,720)の範囲がイメージセンサーで捉えた映像となっており、右側200pxにはインフォメーションなどが表示される。
そしてイメージセンサーで捉えた映像を映す領域に何も表示せず、右側200px部分にのみカメラの設定値を表示させるモードがあるのでそれに設定する。
フォーカスモードはマニュアルフォーカスモードにする。
当然、グリッド表示なども消しておく。

### PCと接続する

HDMI出力をHDMIキャプチャーボードに入力し、HDMIキャプチャーボードをPCに繋ぎましょう。
他にカメラ等を繋いでいなければ `/dev/video0` あたりで認識されるはず。

ここで直接Zoom等でカメラの映像をソースにすると当然ながら右側200px部分に表示される情報まで映ってしまう。

続いてWebカメラ(HDMIキャプチャーボード)の設定とffmpegで処理した内容を出力する仮想カメラ、そしてffmpegでの処理の内容を見ていこう。

### v4l2-ctlでWebカメラの設定をする

と言ってもHDMIキャプチャーボードである。

今一度デバイスのパスを調べるが、昨今のLinuxでは以下のようなシンボリックリンクが作成されていると思われる。

```text
(Ubuntu) [sakura@x2 ~]$ ll /dev/v4l/by-id/usb-VXIS_Inc_MiraBox_Video_Capture-video-index0 
lrwxrwxrwx 1 root root 12  1月 19 00:59 /dev/v4l/by-id/usb-VXIS_Inc_MiraBox_Video_Capture-video-index0 -> ../../video5
```

筆者の環境ではHDMIキャプチャーボードが `/dev/video5` として認識されている。
`/dev/video5` 以外になっても良いようにシンボリックリンクをそのまま使う。

```sh
INPUT_DEV=/dev/v4l/by-id/usb-VXIS_Inc_MiraBox_Video_Capture-video-index0

v4l2-ctl -d "$INPUT_DEV" \
  --verbose \
  -p 30 \
  -v width=1280,height=720,pixelformat=YUYV
```

### 仮想カメラを作る

v4l2loopbackというカーネルモジュールを利用する。
まずはインストール。

```text
sudo apt install -y v4l2loopback-dkms
```

https://biacco42.hatenablog.com/entry/2020/05/12/233429

```
sudo modprobe v4l2loopback
sudo modprobe -r v4l2loopback
```

正常に入ることを確認したら起動時に自動的に読み込まれるようにしておく。

```conf:/etc/modprobe.d/v4l2loopback.conf
options v4l2loopback video_nr=0,1,2,3,4 exclusive_caps=1 card_label="v4l2lo0,v4l2lo1,v4l2lo2,v4l2lo3,v4l2lo4"
```

上記のようにして `v4l2loopback` モジュールを読み込むと `/dev/video0` `/dev/video1` `/dev/video2` `/dev/video3` `/dev/video4` が生成される。
そしてこの状態でHDMIキャプチャーボードをUSB接続すると `/dev/video5` として認識される。

### ffmpegで処理する

イメージセンサーの画像が出ている1080x720の領域でクロップする。
アスペクト比が当然3:2となってしまうので両側に黒地で埋めて16:9に戻す。

```sh
ffmpeg -threads 4 \
  -f v4l2 \
  -thread_queue_size 8192 \
  -framerate 30 \
  -s 1280x720 \
  -i "$INPUT_DEV" \
  -vf "format=pix_fmts=yuv420p,crop=1080:720:0:0,pad=w=1280:h=720:x=100:y=0:color=black" \
  -an \
  -f v4l2 /dev/video0
```

`-vf`オプションにて、(0,0)(100,720)が黒地、(100,0)(1180,720)がイメージセンサーが捉えた画像、(1180,0)(1280,720)が黒地という1280x720のイメージセンサーで捉えている画像だけを作り、`/dev/video0`に出力している。
`/dev/video0` はループバックデバイスで仮想カメラとして扱えるので、これをZoom等で入力ソースとしてやる。

以上で、どの誤家庭にも眠っているNEX-7を有効活用してオンラインミーティングに参加することが出来るようになる。

ちなみに筆者も使っているオンラインミーティングにオススメのレンズは[こちら](https://www.yodobashi.com/product/100000001005991644/)です。

---

それでは良いLinuxライフを。
[py2rb] lambda

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# lambda (Python)
```python
    _identity = lambda x, **kw: x
```
https://docs.python.org/ja/3.7/glossary.html#term-lambda

いわゆる無名関数ですね。
# lambda (Ruby)
```ruby
  _identity = ->(x, **kw) { x }
  # or
  _identity = lambda { |x, **kw| x }
```
https://docs.ruby-lang.org/ja/latest/method/Kernel/m/lambda.html

`lambda`と`Proc`の違いの一つに引数の数が違っている場合があげられますが、可変長引数を使用するとエラーにならない様です。

```ruby
identity2 = ->(x, **kw) { x }
puts identity2.call(2)

# 2

identity1 = ->(x, kw) { x }
puts identity1.call(1)

main.rb:5:in `block in <main>': wrong number of arguments (given 1, expected 2) (ArgumentError)
```
# メモ
+ Python の lambda を学習した
+ 道のりは遠そう
Ubuntu20.04でのNVIDIA Docker環境構築

Ubuntu20.04 + gpu docker環境を構築したので流れをメモしておきます。最後がポイントです。

## 環境

* Ubuntu 20.04 (サーバーインストール)
* NVIDIA GPU

## 手順

### GPUドライバーインストール

昔はいろいろやった気がしたのですが、レポジトリーを追加して一気にいけます。

```
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt install ubuntu-drivers-common
sudo ubuntu-drivers autoinstall
```

動作確認は再起動後```nvidia-smi```で確認。ずらずら出てきます。

### CUIログイン

サーバー用としてインストールしてもインストールするとするとGUI環境のログインが表示されてしまうので、CUIにしたい場合はログイン方法を変更します。

```sh
# 確認
$ sudo systemctl get-default
graphical.target

# 設定変更
$ sudo systemctl set-default multi-user.target

# 確認
$ sudo systemctl get-default
multi-user.target

```

### Dockerインストール

通常の手順通りでインストールします。

https://docs.docker.com/engine/install/ubuntu/

* sudo無しでdockerが動作するように変更

```
$ sudo usermod -aG docker $USER
```

* 動作確認

```
# normal docker
docker run hello-world
```

* GPU環境動作確認

```sh
docker run —gpus all nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04 nvidia-smi
```

nvidia-smiの画面が出ずに失敗します。dockerでGPUが使えるようになっていないようです。

### docker: Error response from daemon: could not select device driver “” with capabilities: [[gpu]]の解消方法

```sh
curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt-get update
```

```
sudo apt-get install nvidia-container-runtime
```

```service docker restart```で再起動

* 再度dockerのGPU動作を確認します。

```sh
docker run —gpus all nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04 nvidia-smi
```

OK!!

参考：

https://www.yurui-deep-learning.com/2021/08/17/docker-error-response-from-daemon-could-not-select-device-driver-with-capabilities-gpu/

# ごにょごにょ

ハード側の問題もあり結局数回インストールしなおす羽目になったので、メモしてありました。また気が向いたらクリーンインストールするかもしれないので、メモを公開しておきます。