OmniAICreator/Qiita-1.07M huggingface dataset:
OpsRamp WSLを利用してWindowsでLinuxコマンドを実行（期待どおり動作しなかった件）

# 概要

OpsRampではshell、Python、Powershellでスクリプトを作成して登録することで、スケジュール実行したりワークフロー内で実行させることができます。通常、WindowsではPowershellでスクリプトを作成すると思いますが、Windows上でもshellスクリプトを実行させたいというケースも出てくるかもしれません。

Windows10では、標準機能である<font color="Red">"Windows Subsystem for Linux"</font>を有効にすることでUbuntuなどのLinuxを稼働させることができます。Hyper-Vでデプロイする仮想マシンとは異なり、ホストWindowsのPowershellからLinuxコマンドを実行させることができます。逆にLinux上のコンソールからWindowsのファイルシステムにアクセスすることも可能です。

しかし、Windows上でshellスクリプトをそのまま実行させることはできませんでしたので、Powershellスクリプト内にLinuxコマンドを記載して動作するのか確認してみました。

![2021-1212-1741-04.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/f0194f18-f271-0dda-3649-f8ac7cfc8857.jpeg)




# WSLのインストール

Windows上でLinuxコマンドを実行するためには、まずWSL2を有効にする必要があります。Windows 10でPowershellを起動して下記コマンドを実行すると、必要なWindowsコンポーネントの有効化、最新Linuxカーネルのダウンロード、WSL2を既定として設定、およびUbuntuのインストールが実行されます。
※他のLinuxディストリビューションを指定することもできます。

```powershell
wsl --install
```

コマンドの実行がエラーになる場合は、手動でインストールします。（[参考：以前のバージョンの WSL の手動インストール手順](https://docs.microsoft.com/ja-jp/windows/wsl/install-manual)）
※Windows Server 2022プレビュー版で試した際にはWSLの有効化まで成功して、Ubuntuのインストールに失敗してしまいました。手動でインストールしてもダメでした。と、いう事で今回はWindows10を利用しています。
　
　


WSL2のインストールに成功すると、スタートメニューにUbuntuが追加されます。
![2021-1208-0635-57.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/ed9dd07a-023b-1d0f-1e1a-03415faaa4a8.jpeg)


起動するとユーザー名とパスワードの入力を求められます。（ホストWindowsのユーザー名・パスワードとは同期していません）
![2021-1208-0646-03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/213789f7-eaa7-b41e-96ca-9cfe1dd64f27.jpeg)



# スクリプトを実行

以前の投稿（[OpsRamp スクリプトによる自動化](https://qiita.com/cyber_009_mind/items/605cd8a899f700f4cac2)）で記載したように、事前にスクリプトのカテゴリーを作成して、Powershellスクリプトを作成してみます。
<font color="Red">※PowershellからLinuxコマンドを実行するには"wsl.exe"を利用します。<font>

| ![2021-1212-2021-29.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/4e908b15-024f-538c-b823-e999ff0aa099.jpeg) |
| :-- |


作成したスクリプトを実行すると、対象のWindows10にPowershellスクリプト（wsltest.ps1）が作成されます。

| ![2021-1212-2025-22.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/ede53a8b-6d50-d814-dcd0-198dde5d3b0f.jpeg) |
| :-- |


スクリプト内で指定した出力先のファイルも作成されていました。

| ![2021-1212-2026-07.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/dcd1172b-514c-dcd1-99d4-12ebee064362.jpeg) |
| :-- |


しかし、ファイルを開くと何も出力されていませんでした。ファイルが作成されているという事は、Powershellスクリプト内でwsl.exeがLinuxコマンドを実行することに成功しているという事だと思いますが上手くいきませんでした。
![2021-1212-2026-22.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/9457ccab-3a30-6f7c-12ff-ef404d03ab0b.jpeg)


# PowershellスクリプトをWindowsにログインしてローカルで実行してみる（成功します）

OpsRampが作成したPowershellスクリプト（wsltest.ps1）を、Windows10上で実行してみると出力先のファイルにも結果が記録されていることが確認できました。

| ![2021-1212-2034-57.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/cc02e28b-14d5-d9b8-cdf6-17a5b6abb000.jpeg) |
| :-- |


OpsRampからWSLを実行した場合の出力が動作しないようですね。


おわり。
AWS Amplify フレームワークの使い方Part17〜GraphQL Transform v2 @primaryKey/@index (旧@key)編〜

# はじめに
プライマリーキーやセカンダリーインデックスの指定は、以前は`@key`を使って指定していましたが、気づいたらより直感的でシンプルになっていました！！！

バージョンが古いと利用ができないので、AmplifyCLIのバージョンを上げられるタイミングがあればぜひ上げましょう！！！

# 使い方
## プライマリーキー自動生成
プライマリーキーの指定がないときは、自動でidが生成され、プライマリーキーに指定されます。

```graphql
type Todo @model {
  content: String
}
```

## プライマリーキー/ソートキーなし
`@primaryKey`を指定するだけで、簡単にプライマリキーを指定できます。

```graphql
type Todo @model {
  todoId: ID! @primaryKey
  content: String
}
```

## プライマリーキー/ソートキーあり
`sortKeyFields`を指定することで、簡単にソートキーを指定することができます。

```graphql
type Inventory @model {
  productID: ID! @primaryKey(sortKeyFields: ["warehouseID"])
  warehouseID: ID!
  InventoryAmount: Int!
}
```

## セカンダリーインデックス/ソートキーなし
セカンダリーインデックスを指定したい項目に`@index`をつけるだけなんて、、、簡単です。


```graphql
type Customer @model {
  id: ID!
  name: String!
  phoneNumber: String
  accountRepresentativeID: ID! @index(name: "byRepresentative", queryField: "customerByRepresentative")
}
```

## セカンダリーインデックス/ソートキーあり

```graphql
type Customer @model  {
  id: ID!
  name: String! @index(name: "byNameAndPhoneNumber", sortKeyFields: ["phoneNumber"], queryField: "customerByNameAndPhone")
  phoneNumber: String
  accountRepresentativeID: ID
}
```

# 補足
## LSI（ローカルセカンダリーインデックス）
以前は、プライマリーキーを含むセカンダリーインデックスを作成するとLSIが作成されていましたが、amplifyCLIのv4.41.xから基本的には、必ずGSIが作成されるようになっています。

https://docs.amplify.aws/cli/reference/feature-flags/#secondaryKeyAsGSI

## 旧`@key`
旧バージョンの`@key`についてはこちら

https://qiita.com/too/items/cb1dfb4f44536a3e9855

# 参考
https://docs.amplify.aws/cli/graphql/data-modeling/#setup-database-tables
ポインタについてざっくりまとめてみた

## TL;DR
ポインタは変数や関数などを保存しているメモリの場所を指してものです。C言語にはガーベージコレクションという機能がないのでこれを扱う必要があるので概念として軽く知っておこうという話です。

## 始まり
大学の講義で多くの学生がC言語を学ぶ中で以下の表記に疑問を持った方は多いのではないでしょうか？

```  C
#include<stdio.h>
void main(){
  int a;
  scanf("%d", &d);
  printf("input Num : %d", d);
}
```
このような表記に圧倒されてプログラミングをあきらめた学生も多くいるのではないでしょうか。大学のカリキュラムではこの辺りは最初に行うので先生方もいちいちポインタの概念を説明することはせずに「こういう書き方です」といった説明をする方が多いです。

また、文字を受け取る際は

``` C
#include<stdio.h>
void main(){
    char s[256];
    scanf("%s", s);
    printf("%s", s);
}
```
のように書き「&を入れるのか入れないのかはっきりしろや！」と思った方も多いと思います。私もCのこのあたりの話に挫折してpythonに逃げた者なので今回はその辺を調べたので備忘録として共有しておきます。

## アドレス
大前提としてプログラム内で宣言される変数や関数などはパソコン上のどこかしらのメモリに保存されます。ここでいうメモリというのはSDカードのようなものです。SDカードにあるデータを保存する時に直下に置くのかフォルダを作成しておくのかなど様々あります。C言語ではSDカード内のどこに置いたかを表す変数があります。それが**アドレス**です。実際に確認していきましょう。

``` C
#include<stdio.h>
void main(){
    int a;
    printf("address 0x%x\n", &a);
    a = 1;
    printf("num %d", a);
}
//output
//address 0x61ff1c
//num 1
```
上記のコードを実装するとアドレスが出てくるのが分かります。すなわち`int変数aを入れる場所を確保しそこに1という値を入れた状態`です。ここから分かるように`a, &a`はそれぞれ値とアドレスを表現していることが分かります。

## ポインタ
ポインタは以下のように定義されています。
> ポインタ (英: pointer) とは、コンピュータプログラミングにおいて、変数や関数などが置かれたメインメモリ上の番地（メモリアドレス）などを格納する特殊な変数のこと(wikipedia)

言葉で説明するより例を見た方が早いので早速見ていきたいと思います。

``` C
#include<stdio.h>
void main(){
    int *p = NULL;
    int a = 100;
    p = &a;
    printf("a: 0x%x b: 0x%x", &a, p);
}
//output
//a: 0x61ff18 b: 0x61ff18
```
このようにポインタ変数を`*p`のように宣言することでアドレスを示すことができるポインタ変数が使えます。ここまでをまとめると

|  |なんかしらの値  |アドレス|
|---|---|---|
|変数 int data  |data  |&data  |
|ポインタ変数 int *data  |*data  |data  |

のような関係が見ます。

## 結局ポインタは何に必要なのか
ポインタの役割にはいくつかあり

- 参照渡し
- 配列の処理
- メモリの動的処理

などが挙げられます。一番最初に挙げた文字列の例も配列の処理とみなすことができるのであのような書き方になります。最後に配列の例と文字列の例をみてましょう。

```C
#include<stdio.h>
void main(){
    char s[256] = "neko";
    int nums[] = {1, 2, 3, 4, 5};
    char *sp = NULL;
    int *ip = NULL;
    int i;
    sp = s;
    ip = nums;
    for(i = 0; i<5; i++){
        printf("%d %d \n", *(ip+i), nums[i]);
    }
    for(i = 0; i<5; i++){
        printf("%c %c \n", s[i], *(sp+i));
    }
}
//output
//1 1 
//2 2 
//3 3
//4 4
//5 5
//n n
//e e
//k k
//o o
```
配列はポインタ変数としてもとらえることができるので上記のような書き方ができます。また、C言語では文字列は配列として捉えることができるので最初の入力のように`scanf("%s", s)`のような書き方ができるということです。

## 参考文献
https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

https://qiita.com/yz2cm/items/01908cdfe56c304f2a14
【Nuxt.js】同一リンクでも強制リロードさせる

# はじめに

Nuxt.jsを使ったサイトでナビゲーションバーを実装していた際に、同じページのリンクをクリックした時もリロードさせたかったのですが、`nuxt-link` を使用していた場合、イベントが何も走らないので、強制リロードを実行することができません。

色々試した結果、Nuxt.jsの[issue](https://github.com/nuxt/nuxt.js/issues/2285)に挙げられていた方法に落ち着いたのでメモします。

# 実装方法

[router.go()](https://router.vuejs.org/ja/api/#router-go) を利用して実装します。
`router.go()`は本来、引数に指定した数のhistoryを進めたり戻したりできるメソッドですが、
引数にpathを指定することもできるので、それを利用します。
現在のページをpathに指定することで、同じページでも強制的にリロードが走ります。

```jsx
<button @click="$router.go({path:'/top', force: true})">TOP</button>
```

# 注意

ただし、`router.go()`でリロードさせる場合、 `beforeEnterLeave()`などの画面遷移オプションがうまく機能しないので、注意が必要です。
私の場合は`beforeEnterLeave()`に画面遷移アニメーションを記述していたので、実装方法を変更することになりました...。
Bazelのインストール方法(M1 mac)

<h2>環境</h2>
記事作成日時：2021/12/12
OS: M1 mac

<h2>参考サイト</h2>
https://docs.bazel.build/versions/main/install-os-x.html

<h2>インストール手順</h2>
上記のサイトで、the binary installer [1]というのを使ってインストールします。

<b>1. Bazel installerをダウンロード</b>
BAZEL_VERSIONは、2021/12/12時点では4.2.2が最新です。
以下のサイトから最新版を確認してください。
https://github.com/bazelbuild/bazel/releases

以下のコードをTerminalで、入力してください。

```
export BAZEL_VERSION=4.2.2
curl -fLO "https://github.com/bazelbuild/bazel/releases/download/${BAZEL_VERSION}/bazel-${BAZEL_VERSION}-installer-darwin-x86_64.sh"
```

<b>2. Bazel installerを実行</b>

```
chmod +x "bazel-${BAZEL_VERSION}-installer-darwin-x86_64.sh"
./bazel-${BAZEL_VERSION}-installer-darwin-x86_64.sh --user
```

実行した結果は、以下のようになると思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878133/7b7be3e0-def9-06cc-bce8-b0ec61fac45c.png">

<b>3. ~/.bashrcにPathを通す</b>
~/.bashrcと~/.bash_profileを開いて、以下のコードを入力してください。
(*<font color="red">$Home</font>には、PCのHomeディレクリーのPathを入れてください。)

```
export PATH="$PATH:/$Home/bin"
```

bashの編集方法は下記のサイトを参考にしてください。

https://qiita.com/savaniased/items/d9d37d3b958c1f54237e

<b>4. bazelが使えるか確認する。</b>
以下のコードをtermimnalで実行して、versionが確認できれば成功です。

```
source ~/.bashrc
bazel --version
```

成功例

```
bazel 4.2.2
```

失敗例

```
command not found: bazel
```


<h4>[1]the binary installerとは</h4>
以下のサイトに説明があるので、参考にしてください。
https://jp.quora.com/sofutouea-wo-insuto-ru-suru-kiwa-no-insuto-ra-so-su-ko-do-bainari-pakke-ji-no-chigai-ha-nani-desu-ka
【UiPath】MarketPlaceで日本語対応のコンポーネントを探す

# はじめに

この投稿は、UiPath Advent Calendar の 10 日目の記事です。

https://qiita.com/advent-calendar/2021/uipath


# UiPath MarketPlace

UiPathにはマーケットプレイスという、作成したフローや部品を公開できる場所がありますが、2021/12/11 現在で「1387」個が登録されており、日本語対応版ではないものが大多数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/7fcf9dc4-cf6e-1a18-89df-4fb6c6e505fb.png)

https://marketplace.uipath.com/ja/listings

登録されているものの多くは「英語版」で、日本語対応しているものは一部です。

検索条件で、以前は「対応言語」という検索条件があったのですが、いつの間にか消えてました。現在使用できる検索条件は、以下の通りです。

| 条件名 | 指定できるもの |
|:-:|:-|
| キーワード | 複数指定の場合は「OR」条件|
| 製品 | Studio / AI Center / Assistant|
| カテゴリ | All / カスタム アクティビティ / スニペット / <br>テンプレート / コネクター / ツール / ソリューション |
|サポート| 公開者によるサポートあり
|認定 | Gold / Silver / Bronze|
|プロバイダー | UiPath <BR>UiPath ビジネス パートナー / UiPath テクノロジー パートナー<BR>個人公開者 / コミュニティ コントリビューター |
| コンポーネントの種類 | ダイレクト ダウンロード/ リクエストがあれば提供可能/ 外部参照|
| 価格 | 無料 / 有料 |


# 日本語対応コンポーネントを探してみる

キーワード検索で「ひらがな」を入れることが出来ます。
ためしに「あ」と入れて検索すると「65件」ヒットしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/b99bec57-2ad7-4dc5-3dba-7199bf211327.png)
「あ い」と入力すると「140件」ヒット。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/f66fed7e-ab49-5c03-aee4-d2a31397d3ad.png)

どうやら「ひらがな」全部入れれば、日本語対応で絞り込めそうです。（説明等に「ひらがな」が入っていないものは無いと予想）

やってみると「173件」ヒットしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/3b13eafa-fd00-1cb2-205b-cc7a5da69eca.png)

日本語関係なく、全体で「1387」個あったので、日本語対応はそのうちの「173件」＝「約12％」くらいですね。

# 終わりに

定期的にMarketPlaceを眺めていると「こんなのあったんだ」と勉強になるので、ぜひ探してみて下さい。

この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。
React18に向けて今更だけどSuspenseを使ってみる

[React Conf 2021](https://conf.reactjs.org/) が開催され、React18について様々な情報が発表されました。
（動画は日本語字幕もついてますのでぜひ御覧ください。字幕ありがたい！！！）

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

冒頭のKeynoteでは大部分の時間がSuspense周りの話に当てられており、今後Reactを使っていく上で理解しておくことは必須といっても過言でないと思います。すでにReact16.6の時点で実験的機能として利用可能でしたが、今回はReact18ベータ版でSuspenseを触ってみたいと思います。

Suspense自体の説明はこちらの動画をぜひ御覧ください。

https://youtu.be/FZ0cG47msEk?t=305

https://www.youtube.com/watch?v=pj5N-Khihgc

## React18 betaを使う準備

まずはReact17のプロジェクトを`create-react-app`を利用して作ります。

```bash
$ npx create-react-app react-18-suspense
```

`react`と`react-dom`のバージョンを変更します

```text:package.json
"react": "18.0.0-beta-24dd07bd2-20211208",
"react-dom": "18.0.0-beta-24dd07bd2-20211208",
```

```bash
$ npm install
```

最後に、`src/index.js`の内容を修正します。

```jsx:src/index.js
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);
```

立ち上げてうまく動いているか確認してみます。

```bash
$ npm start
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215011/f6b8c0bf-a62e-f153-b93e-4e96bb051edd.png)

Reactのロゴが回っております。うまくいきました。


## Suspenseを使ってみる

GitHubのAPIを使って超単純なリストを作ります。
フェッチようにSWRをinstallします。
React18のbeta版を利用しているため、`--force`オブションをつけます。

```bash
$ npm install swr --force
```

次にGitHubのAPIを叩いてユーザーリストを取得＆表示するコンポーネントを作ります。

```jsx:src/components/UserList.js
import useSWR from "swr";

const fetcher = async (url) => {
    // すぐフェッチできちゃうので3s待つ
    await new Promise((resolve) => setTimeout(resolve, 3000));
    return fetch(url).then((r) => r.json())
}

export const UserList = () => {
    const { data } = useSWR('https://api.github.com/users', fetcher, { suspense: true });

    return (
        <ul>{data.map(user => <li key={user.id}>{user.login}</li>)}</ul>
    ); 
}
```

`UserList`は単純にデータの取得と表示をするだけのコンポーネントです。
コンポーネントの中では値が取得できることが保証されており非常にスッキリしました。
便宜上、urlやfetcherを含めてしまっていますが、分離させればよりコンポーネントの責務が単純になります。

`App.js`でこのように呼び出します

```jsx:src/App.js
import './App.css';
import { Suspense } from 'react';
import { UserList } from './components/UserList';

function App() {

  return (
    <div className="App">
      <Suspense fallback={<p>Now Loading...</p>}>
        <UserList/>
      </Suspense>
    </div>
  );
}

export default App;
```

`Suspense`で囲われたコンポーネント内でデータ取得前の場合は、fallbackに指定した内容が表示されます。
`ErrorBoundary`を使ったエラー処理も可能です。

https://reactjs.org/docs/concurrent-mode-suspense.html#handling-errors

最後にうまく動作するか確認してみます。


最初はローディングがでて・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215011/bff6d236-f4a5-d651-8863-4dbe79bf2cd6.png)
ユーザー一覧が表示されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215011/24c68408-4037-bad5-2df2-079767833f84.png)

## 終わりに

というわけでReact18でSuspenseを使ってみました。
（~~この内容なら別にReact17でもできるのでは~~)
【ReactNative】react-native initのInstalling CocoaPods dependenciesで止まる時の対処法

iOS向けに必要なcocoapodsの依存関係が解決せず永遠にinstallingから進まない現象に陥った。

環境：macOS


## 対処法
[３０、４０分待てば良いという話もあるが](https://stackoverflow.com/questions/56896224/react-native-installing-required-cocoapods-dependencies-stuck)、私の場合は半日待っても解決しなかった。

色々調べた結果、結局キャッシュがうまく生成できていないことが原因だった。
cacheを消して再度トライする。

```bash
rm -rf /Users/[ユーザー名]/Library/Caches/CocoaPods/
```

再度initコマンドすることで無事通った。
校正オプションstriptagsが効かない時の対処法｜a-blog cms

a-blog cmsのカスタムフィールド「リッチエディター」や「インラインエディター」を使って、htmlタグを取り除きたい時に使う校正オプションの使い方について、備忘録です〜

## 任意の位置に、リンクや強調を挿入できるカスタムフィールド
a-blog cmsのカスタムフィールドで、更新者の任意の文字にリンクや強調などを入れたい時は、「インラインエディター」または「リッチエディター」を使うと、再現できます。

```html:
<table class="acms-admin-table-admin-edit">
  <tr>
    <th>インラインエディターテスト</th>
    <td>
      <textarea name="test" class="js-lite-editor-field acms-admin-form-width-full">{test}</textarea>
      <input type="hidden" name="field[]" value="test" />
    </td>
  </tr>
</table>
```

```html:
<table class="acms-admin-table-admin-edit">
  <tr>
    <th>インラインエディターテスト</th>
    <td>{test}[raw]</td>
  </tr>
</table>
```

## 校正オプションstriptagsを使って、htmlタグを表示したり、取り除いたり
「リッチエディター」や「インラインエディター」でカスタムフィールドを作り、校正オプションを使えば、

- Aのページでは、htmlタグを生かしたまま出力
- Bのページでは、htmlタグを取り除いて入力したテキストのみ出力

といったこともできます。

Aのページの場合は、カスタムフィールドメーカーで表示された出力ソースを入力すれば大丈夫なのですが、Bのページの場合は、校正オプションのstriptagsを使います。
しかし、以下のように指定しても、htmlのタグがテキストとして表示されてしまいます。

```html:
<p>{test}[striptags]</p>
```

まずは正解から。htmlタグを取り除きたい時は、以下のようになります。

```html:
<p>{test}[raw|striptags]</p>
```

原因は、「Ver. 2.11 からの校正オプションの仕様変更により、**校正オプションを指定していてもエスケープされる**ため、校正オプションが[striptags] のみだと、エスケープされてから striptagsが動作するので、タグと認識されずHTMLが削除されない」とのことでした。

htmlのタグがテキストとして表示されてしまう際の実行の流れは以下の通りとなります。

1. `&lt;p;&gt;` テキスト`&lt;/p;&gt;` にエスケープ。
2. 変換されたものに対してstriptagsが動作。
3. （エスケープされているため）タグがないので、なにも起きない。

そのため、校正オプションのrawを併用して、エスケープさせない状態でstriptagsを動作させる必要があるとのことでした。

こちらについて、アップルップルのスタッフの方にご指南いただきました。
ありがとうございました！

- [カスタムフィールドメーカー](https://developer.a-blogcms.jp/tools/)
- [a-blog cmsの校正オプション](https://developer.a-blogcms.jp/document/reference/proofreading.html)
Linuxを少し勉強して、実務で使えると思ったコマンドまとめ(初心者向け)

Twitterで、「Linuxができないエンジニアはクソだ」というツイートを見かけてLinuxを少し勉強しました。
そこで、このコマンドは実際の実務でも使えると思ったものをまとめていきます。

## 今回使った書籍
Linuxというものを初めて勉強するので、知識ゼロの状態でした。Linux初学者にはうってつけという以下の本を買いました。Linuxの基礎の基礎を学べると感じました。

https://www.amazon.co.jp/1%E9%80%B1%E9%96%93%E3%81%A7LPIC%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8C%E5%AD%A6%E3%81%B9%E3%82%8B%E6%9C%AC-%E7%AC%AC3%E7%89%88-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B3%B6%E8%83%BD%E5%92%8C-ebook/dp/B07TD1TTYJ

それではコマンド集に移ります。

## ファイル/ディレクトリの操作
**cdコマンド**
ディレクトリを移動する際に使うコマンドです。
「cd」だけの指定だと、ホームディレクトリに移動します。
「cd ディレクトリ名」で指定したディレクトリに移動します。
「cd -」または、「cd ..」で1つ前のカレントディレクトリに移動します。

**lsコマンド**
ディレクトリのファイル一覧を表示するコマンドです。
「ls」だけの指定だと、カレントディレクトリのファイル一覧を表示します。
「ls ディレクトリ名」で指定したディレクトリのファイル一覧を表示します。
「ls -l」でカレントディレクトリにあるファイルの属性情報も表示します。

**mkdirコマンド**
ディレクトリを作成するコマンドです。
「mkdir ディレクトリ名」で指定したディレクトリを作成します。

**rmコマンド**
ファイルやディレクトリを削除するコマンドです。
「rm ファイル名」で指定したファイルを削除します。
「rm -r ディレクトリ名」で指定したディレクトリ名を削除します。「rm -r /*」は恐怖のコマンドとして有名です。

## シェル操作
**aliasコマンド**
エイリアス一覧を表示するコマンドです。
エイリアスとは、簡単に言うとコマンドを別の短縮形で済ませられる設定みたいなものです。「git push」が「gp」で済むみたいな感じ。
エイリアスの設定方法は、別記事が参考になりましたので載せておきます。

https://qiita.com/yutat93/items/b5bb9c0366f21bcbea62

**unaliasコマンド**
上記で設定したエイリアスを削除できるコマンドです。

**historyコマンド**
ターミナル等で入力したコマンドの履歴を表示するコマンドです。
自分のターミナルでは、オプションを何もつけなければ15個表示されました。「history 整数値」で指定した数だけコマンド履歴を表示できます。
履歴を表示すると、左に履歴番号も表示されるので、「!履歴番号」でそのコマンドを実行することができます。
↑↓キーで履歴を1つずつ遡ることはできるものの、正直めんどくさいので、履歴を一括で表示できるのは便利ですね〜

## プロセス操作
**psコマンド**
シェル上で実行されているプロセスを表示するコマンドです。

**killコマンド**
プロセスを終了するコマンドです。上記のpsコマンドと一緒に使うことが多いかもです。
psコマンドを実行すると、PIDと呼ばれるプロセス番号と共に実行されているプロセスが表示されるので、「kill PID」で指定したプロセスを終了することができる。

## ネットワークコマンド
**ip address show**
IPアドレスなどの情報を表示するコマンドです。自分は「ifconfig」コマンドの方が打ちやすいし使いやすいです😅
自分のPCのIPアドレス何だっけという時に使っています。

## ユーザー管理
**passwdコマンド**
パスワードを変更するコマンドです。自分のMacのパスワードをこのコマンドで変更できた時は感動しました。

**suコマンド**
一時的にrootユーザーとして作業するコマンドです。rootとは管理者権限のことです。簡単に言うと、システムに対して絶対的な権限を持っているユーザーで、システム全体を削除できてしまう権限をも持っています。
「su -」で一時的にrootユーザーとして作業できます。ユーザー名を指定すると、一時的に指定したユーザーとして作業できます。
会社のPCは、管理者ユーザーと一般ユーザーが分かれていて、このコマンドを知らなかったときは、いちいちログインし直して作業していたので、クソほどめんどくさかったですね…。

**sudoコマンド**
「sudo コマンド」で、rootユーザーの権限が必要なコマンドを実行できます。
初めて聞いた時は、須藤さんが何かやるのかなと思ってましたwww

## ファイルの圧縮と解凍
**zipコマンド**
zip形式に圧縮するコマンドです。Macだと、いつも右クリックをしてそこから圧縮していたので、コマンドでできたらカッコいいですね🤔

## 最後に
基本中の基本のコマンドしか紹介しませんでしたが、私自身知らないコマンドはかなりありました。Linuxができないエンジニアはクソだというのが少しわかった気がします。。
やっぱり基本は何事においても大事なので、これからも精進します🔥最後まで読んでいただきありがとうございました！
Akka アクター HelloWorld

## Akka
AkkaはJVM上での並列分散アプリケーションの構築を容易にする。

## アクター
アクターは、生成、送信、状態変化、監督の4つの処理を行う軽量プロセス。 
相互にメッセージを送信し、非同期に処理を行うことが出来る。

## Code Sample
```Scala
import akka.actor.typed.scaladsl.Behaviors
import akka.actor.typed.{ActorSystem, Behavior}

// Messages sent to actors
final case class Hello(name: String)

// Define actor behavior
object PrintHello {

    def apply(): Behavior[Hello] = Behaviors.receiveMessage { message =>
        println(s"Hello ${message.name} !")
        Behaviors.same
    }
}

object Main extends App {

    val behavior: Behavior[Hello] = PrintHello()

    // Creating actor
    val printHelloActor: ActorSystem[Hello] = ActorSystem(behavior, name = "PrintActor")

    // Send message to actor
    printHelloActor ! Hello("World")
    printHelloActor ! Hello("Scala")
    printHelloActor ! Hello("Akka")
}
```

## Output Sample
// $ cd hello-world/
// $ sbt
// ...
// $ ~run
// ...
// Hello World !
// Hello Scala !
// Hello Akka !

## GitHub
https://github.com/GL-Kageyama/Akka_Actor_HelloWorld
【図解】Dokcerコンテナの状態

# Dockerコンテナの状態

![docker-container-status-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575380/2622b315-29b6-a9b4-c410-4c3aca5bdb69.png)

## 参考記事
- https://docs.docker.com/engine/reference/commandline/docker/
デジタルプロダクトを開発するチームの議論の共通の土台としてイベントストーミングを導入してみた

これは [GLOBIS Advent Calender 2021](https://qiita.com/advent-calendar/2021/globis) 12日目の記事です。

12日目 → @tatsushitoji 
13日目 → @fursich

と2日に渡り、チームにイベントストーミングというモデリング手法を導入してみた話をさせていただきます。

## TL;DR
イベントストーミングによって

- 協働的にドメインのモデリングをしていくプロセスにおいて共通認識が得られる
- アウトプットとしての図

上記を、ビジネス〜開発者まで様々なバックグラウンドを持つメンバーがいるデジタルプロダクト開発チームの議論の共通の土台とできないかの検証と試験的な導入を行いました。

## イベントストーミングとは

協働的にコト、モノ、ヒトを視覚化しながら整理しドメインのモデリングをしていくワークショップ形式のアクティビティです。

- プロセスが視覚化され、共通認識を得ることができる
- 意見の相違点や暗黙にズレている認識を発見し、認識合わせができる
- チーム内でバラバラに使用されている用語が統一される（ユビキタス言語が導き出せる）

ref: [EventStorming](https://www.eventstorming.com/)

## イベントストーミングを導入しようとした背景

### 課題

- 7月(2021年度2Q)からBizチームとDevチームという2チームに形式上別れてしまったため、コラボレーションが薄くなってきている
- 実装の対象とするドメインで、課題解決をWebアプリケーションでどのようにしたいのかについて誰も描けていない
- （議事録は残すが）口頭ベースの議論が行われていて、認識合わせに時間がかかる
- 同じ用語でもメンバー各々で違う意味を持って話している

こういった状態でリファインメントを行っていたため、「コーナーケースどうします？」や、「そもそもこれは違うんじゃないですか…？」といったちゃぶ台返し話などが頻繁に出てしまい、リファインメントの長時間化やリテイクを引き起こしていました。

### 解決策として

2021年度2QのDevチームのKRの１つに「モデリングを行いそれをベースに議論ができるようになる」というものがあり、モデリングについて調べているときに出てきたのが以下の記事でした。

ref: [「Scramble! #3 FOLIO流 複雑なドメインとの戦い方」イベントレポート](https://note.com/foliobackstage/n/ne30d0443996b)

`ありふれたもの 、未だ見ぬもの: FOLIO プロダクト開発の現場から` のスライドにあるように弊チームでも競合サービスにはない複雑な事象についてモデリングするという話が出てきていたこと、また、イベントストーミングのキャッチアップを進めるにつれて上述した課題の解決が図れそうだと判断しました。
（同じ記事内にイベントストーミングの紹介があったためFOLIOさんでは同時期でイベントストーミングを実施されたと勝手に思っていましたが、同時期であったかは不明です）

BPMN図やUML回路図といったもののように特別な記法が必要ない、というのもBiz/Devのコラボレーションという観点から判断のポイントとして高かったです。

## イベントストーミングのキャッチアップと検証
検証を行うにあたり、プロダクト開発の初期からデータモデリングを進めてくださっていた @fursich を巻き込ませてもらい、キャッチアップに参考にした記事した記事の共有・解決したい課題を伝え、開発がペンディングとなっていた事象（未だ見ぬもの）について最小構成でMiroのテンプレートを使い行うという手法をとりました。

### キャッチアップに参考にした記事

- [新しいモデリング手法: EventStorming (イベントストーミング) をはじめるための準備](https://yoskhdia.hatenablog.com/entry/2018/11/09/200556)
- [ミニマムにはじめるイベントストーミング](https://cyberagent.ai/practical-introduction-to-your-first-event-storming)
- [イベントストーミング導入](https://zenn.dev/tkatsuma/articles/97931405cbcd94)

### Miroテンプレート
- [Event Storming](https://miro.com/miroverse/event-storming/)

### 検証前の所感

- 開発者以外のメンバーとのコミュニケーションにおいて、クラス図や特定のワークフロー図よりBigPictureの方がわかりやすそう
- 開発者でなくても参加可能なのでよさそう
- BigPictureを書ききった時点で要望要件の分析不足を明らかにできそう
- Aggregate (集約)までもっていけるとデータモデリング前までの整理ができているという状態を作れそう
- 揺れのある用語を突き詰めることができるので、自然と淘汰され結果ユビキタス言語で話せるようになりそう
- 適切な粒度でやらないと爆発しそう

### 検証後の所感

- タイムラインでならんでる状態までだとBizメンバーでも初見で理解できそう
- 名前や概念の曖昧さ、スコープの大きさや責務境界の曖昧さで悩んでいるが、これらを可視化してBizメンバーと共有し解決する議論ができそう
- ポストイットの並びを縦にしたり横にしたり、何度もグルーピングを変えてしっくりくるところまでやるのですが、その試行錯誤プロセスがよい
- 事前に適切な（？）粒度のスコープ＆コンテキストでやる必要がありそう

検証を行った結果、議論の共通の土台となり得るものだという判断にいたりました。

## チームでイベントストーミングを実施

検証によって出てきた懸念や不安点を入念に潰す準備を整えて、チームで実施をしました。
チームで実施した結果、以下のようなフィードバックをもらうことができました。

- 認識合わせにとてもいいと感じました。ただ、着地するのが難しそうだとも思いました。
- 想定する機能粒度のズレの可視化ができ、共通理解を醸成する第一歩が踏み出せたと言うことでよかったと思っています。
- 時間はかかるけど、事業理解やユーザのリアルを深く考える時間としてはコスパいいのでは？と思った。
- 多様な視点が出て非常によかったと思います。慣れてきたらもっとスムーズにできそう。
- もっとビッグ・ピクチャーになるとおもうので、みんなで作り上げていきたい。

## まとめ

コストやメンバー各々のイベントストーミングへの理解度など別の問題が出てきていたり、今回イベントストーミングしたものについてはまだ実装途中というのもありますが、チームの課題解決として一定の効果が出始めているように思います。出てきた別の問題については、また進展があればどこかで記事にできればと思います。

チームで実施する前に事前に行った準備などの詳しい話は明日の @fursich のアドベントカレンダーで詳しく書かれるかと思います。
AtCoder231をやった(Java)

AtCoder231をやった。
懲りずにjavaで実装。

##[A](https://atcoder.jp/contests/abc231/tasks/abc231_a)
基本的には、double型で変数を宣言して、格納されたデータを割ればよいです。

```
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        ArrayList<String> list = new ArrayList<String>();
        
        String str = scan.nextLine();
        list.add(str);
        
        double d = Double.parseDouble(list.get(0)) / 100;
        
        System.out.println(d);
    }
}
```

##[B](https://atcoder.jp/contests/abc231/tasks/abc231_b)
※クソコード注意

文字列が重複していたら、その文字列に紐づくカウントをインクリメントすればよいのでは？と考えました。
Java以外でも**Map**ってキーワードで検索かけると多分出てきます。

```
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        Scanner scan = new Scanner(System.in);
        String strIndex[] = new String[1000];
        
        scan.nextLine();
        int i = 0;
        while (scan.hasNextLine()) {
            strIndex[i] = scan.nextLine();
            i++;
        }
        
        Map<String, Integer> map = new HashMap<String, Integer>();
        
        for (String s : strIndex) {
            int v;
            if (map.containsKey(s)) {
                v = map.get(s) + 1;
            } else {
                v = 1;
            }
            map.put(s, v);
        }
        // 適当に1000個配列用意してるからnull格納されたkeyは邪魔
        map.remove(null);
        
        Integer maxValue = 0;
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (entry.getValue() > maxValue) {
                maxValue = entry.getValue();
            }
        }
        
        System.out.println(maxKey);
    }
}
```

ちなみに今回はC問題までいけました。ただTLEだったので載せないです。
いつかC問題もJavaで解きたいな(n回目)。
Kubernetesのログに混乱する件

#これなに？
どんな時にどのログを見ればいいのかはっきり理解できてないので、まずは根本的なkubernetesのログの種類をまとめておこう。

#[混乱の理由] 名前が紛らしい
コンテナログ、コンポーネントログ、システムコンポーネントログ、ノートログ、アプリケーションログ、クラスターログ。
いろんなサイトでログを説明してくれてるけど、みな少しづづ呼び名が違ったりしてどれがどれだか混乱。（コンポーネントログ、と言ってもどれもある意味コンポーネントログな気がするし。。)

#[整理するため]大きく５種類のログにわけられそう
- コンテナログ(aka アプリケーションログ、コンポーネントログ)
- クラスタログ(aka システムコンポーネントログ)
- ノードログ
- イベントログ
- 監査ログ

###コンテナログ
アプリのログ。

```
$ kubectl logs {app-name}
```

###クラスタログ
コンテナ内で走っているコンポーネントログ
k8sのデフォルトサービス/コンポーネントの etcd, kube-apiserver, kube-scheduler, kube-proxy,  kube-controller-managerなど
###ノードログ
クラスタログの一部だけど、コンテナ外、OSレベルで走ってるシステムコンポーネントのログ。kubeletやcontainer runtime等

```
$ journalctl
```

###イベントログ
リソースの変化やなぜPodが失敗したかなどのエラーログがみれる
namespaceのイベントログ

```
$ kubectl get events -n <namespace>
```
Podのイベントログ

```
$ kubectl describe pod <pod-name>
```
###監査ログ
なにが、いつ、だれによって、どうやって起きた？
どこでみつかり、どこで始まり、どうなっった？
audit policyで設定する
https://kubernetes.io/docs/tasks/debug-application-cluster/audit/#audit-policy

##ちなみに
k8sのオフィシャルページにはコントロールプレーンコンポーネントについての説明があり、以下が含まれるらしい(https://kubernetes.io/ja/docs/concepts/overview/components/)

```
etcd, kube-apiserver, kube-scheduler, kube-controller-manager
```
これkube-proxy以外がクラスタログと同じ。kube-proxyはkubeletと同じノードコンポーネントにカテゴライズされてる。それでもube-proxyはOSレベルで走ってないので、ログ的にはノードログではない。。？？ 
##まとめ
監査ログはちょっと外とちがう感じがするけど、調査するのにはこれらの情報は役に立ちそう。今後、実際のログの取得の方法とかもふくめもう少し掘り下げていこうと思います。
Scala3の列挙型(enum)を試す

この記事は [Scala Advent Calendar 2021](https://qiita.com/advent-calendar/2021/scala) の15日目の記事です。
昨日は [ryuhei ishibashi](@cactaceae) さんの [Scalaで一番easyな構成を考えた(autowireの紹介)](https://qiita.com/cactaceae/items/47cf9d637767b287477d) でした。

# はじめに
- ずっとJavaをメインに開発してて、その後にScala(2.11くらい)を使うようになってスマートで書きやすいなと感動していた。
- ただ、列挙型はJavaのenumが使いやすくて、Scalaは標準のものが使い辛く毎回自分で実装したりと不満に感じていた。
- Scala3のenumがどうなったか公式を参考に使ってみる。
  - https://docs.scala-lang.org/scala3/reference/enums/enums.html

# Scala3のenum

## 基本の書き方
```scala
enum Item:
  case Pen, Eraser, Note
```

```scala
scala> Item.Pen
val res: Item = Pen
```

ここはどの言語でも大体同じ。

## 引数を持つ場合
```scala
enum Item(val price: Int):
  case Pen    extends Item(200)
  case Eraser extends Item(300)
  case Note   extends Item(500)
```

```scala
scala> Item.Pen.price
val res: Int = 200
```

引数を持つenumもJavaのように書ける。

## enumに標準で実装されているメソッドたち
```scala
scala> Item.Pen.ordinal
val res: Int = 0

scala> Item.fromOrdinal(0)
val res: Item = Pen

scala> Item.valueOf("Note")
val res: Item = Note

scala> Item.values
val res: Array[Item] = Array(Pen, Eraser, Note)
```

使用機会の多そうなvaluesが標準実装されているのが嬉しい。
valueOfを上手く使えば逆引きメソッドを作る手間も省けそう。

## enumにメソッドを持たせる
```scala
enum Item(val price: Int):
  private val DiscountRate = 0.2
  def getDiscountPrice = price * (1 - DiscountRate)
  case Pen    extends Item(200)
  case Eraser extends Item(300)
  case Note   extends Item(500)
end Item
```

```scala
scala> Item.Pen.getDiscountPrice
val res: Double = 160.0
```

メソッドも問題なく持たせられた。

## enumのコンパニオンオブジェクトを作成する
```scala
object Item:
    def getPairDiscountPrice = (Pen.price + Eraser.price) * 0.3
end Item
```

```scala
scala> Item.getPairDiscountPrice
val res8: Double = 150.0
```

コンパニオンオブジェクトも問題なく作成できた。

# まとめ
- Scala3のenumは使いやすい、もうenumを作る際に悩まくて良さそう。
STM32G031とシリアルのまとめ(リンク集)(STM32G031J6M6)(USART)(USRT)(LPUSRT)(Arduino)


目的
デバッグまたは、センサーの値を出力したい
その時は、シリアルが簡単


0.PA2(PA0(4ピン))でハードウェアシリアル

OBでPA0をGPIOにする必要があるが便利。

https://qiita.com/caa45040/items/28625fa763d22aa8edce


1.Arduino標準シリアル　はっきり言って使いずらい

問題点は、SWD-CLKと重なりなおかつBootと重なる為に書き込むと簡単に書き込めない



STM32G031のArduinoでのUSARTシリアル通信(STM32G031J6M6)


https://qiita.com/caa45040/items/8b77fe33e80a54b47c3d


主なプログラム　(イメージ)


```c++


Serial.begin( 9600 ); // シリアル通信の速度を9600bpsにする。


Serial.println("Hello World !");



```




2.ソフトウェアシリアルは、軽くておすすめ

単純にシフトしてdelayMicrosecondsでタイミングを取っているだけ

STM32G031の独自のソフトウェアシリアルでHello Worldと出力 9600bps


https://qiita.com/caa45040/items/bb483de44a026b64f3d7



STM32G031で9600bpsのソフトウェアシリアルのライブラリ化



https://qiita.com/caa45040/items/adfde734f613447fd094





主なプログラム　(イメージ)


```c++


int pc_putc(char ch) {

  digitalWrite(in7, LOW);//START
  delayMicroseconds(UART_DELAY);

  for(int ii=0;ii<8;ii++){ //Data x 8
    digitalWrite(in7, (ch>>ii)&1  );
    delayMicroseconds(UART_DELAY);
  }//for

  digitalWrite(in7, HIGH);//Stop
  delayMicroseconds(UART_DELAY);

  return(0);
}//pc_putc




```


3.番外編　I2C-USARTコンバータを使う バイナリーもあるよ　かなりの力作


STM32G031とVSCode+STM32CubeでI2Cスレーブの受信文字をシリアル出力(受信)(STM32G031J6M6)



https://qiita.com/caa45040/items/5032e6905c9425f41495



主なプログラム　(イメージ)


```c++


 Wire.begin(sdaPin,sclPin); //STM32G031J6M6

    //I2Cに送信
    Wire.beginTransmission(0x40);
    Wire.write('A');
    Wire.endTransmission();



```


![o_con160.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/053c65e7-e545-e547-0de8-4d0725a23e35.jpeg)



いろいろ

I2Cスレーブで遊ぶ(受信)が競い合って伸びているだが
需要あるんか?(CAA45040調べ)
I2Cで単純に受信した値を返すプログラムで猛烈に単純化、簡単化
したものでチョーべり簡単(プログラムは、?)(設定は、激ムず(ちょべりバァー)(おやじギャグ)
かなり中間的なもので実質30分もかかっていないのだが。
何につかうんだ?(まあいいや)

ゴット(神)とか自分で言っているとバチが当たりそうなので
教授でいいやまたは、C教授
われは、主にインターフェース系を得意とする教授である。
マンマシーンインターフェース(UI)を様々研究している。
記事は、なぜかマシン間インターフェースばかりになっているが
良しとしょう(教授)
液晶やタクトスイッチをバカにする傾向があるが立派なマンマシーン
インターフェースである。(今時は、ヒューマンインターフェース)

STM32G031と(VSCode+STM32Cube)でI2Cスレーブで遊ぶ(受信)(STM32G031J6M6)HAL
https://qiita.com/caa45040/items/06f5d52b089a6e220f3a


STM32L010と(VSCode+STM32Cube)でI2Cスレーブで遊ぶ(受信)(STM32L010F4P6)HAL
https://qiita.com/caa45040/items/012df828e8f5c2c76eca


イメージ

```c++


        if(HAL_I2C_Slave_Receive(&hi2c2,(uint8_t*)aRxBuffer, 1, 1000) == HAL_OK) {
           str1="OK\r\n";

        } else {
           str1="NG\r\n";

        }


```
素朴に便利なrga

```sh
$ rga --rga-list-adapters
Adapters:

 - ffmpeg
     Uses ffmpeg to extract video metadata/chapters and subtitles
     Extensions: .mkv, .mp4, .avi


 - pandoc
     Uses pandoc to convert binary/unreadable text documents to plain markdown-like text
     Extensions: .epub, .odt, .docx, .fb2, .ipynb


 - poppler
     Uses pdftotext (from poppler-utils) to extract plain text from PDF files
     Extensions: .pdf
     Mime Types: application/pdf

 - zip
     Reads a zip file as a stream and recurses down into its contents
     Extensions: .zip
     Mime Types: application/zip

 - decompress
     Reads compressed file as a stream and runs a different extractor on the contents.
     Extensions: .tgz, .tbz, .tbz2, .gz, .bz2, .xz, .zst
     Mime Types: application/gzip, application/x-bzip, application/x-xz, application/zstd

 - tar
     Reads a tar file as a stream and recurses down into its contents
     Extensions: .tar


 - sqlite
     Uses sqlite bindings to convert sqlite databases into a simple plain text format
     Extensions: .db, .db3, .sqlite, .sqlite3
     Mime Types: application/x-sqlite3

The following adapters are disabled by default, and can be enabled using '--rga-adapters=+pdfpages,tesseract':

 - pdfpages
     Converts a pdf to its individual pages as png files. Only useful in combination with tesseract
     Extensions: .pdf
     Mime Types: application/pdf

 - tesseract
     Uses tesseract to run OCR on images to make them searchable. May need -j1 to prevent overloading the system. Make sure you have tesseract installed.
     Extensions: .jpg, .png



```
Laravel個人用メモ

**saveメソッドとcreateメソッドの違い**
・save()は返り値がtureかfalseで返ってくる。
・create()は返り値がModelで帰ってくる。だからリレーションも使える。

**中間テーブルが絡んでくるリレーションの注意点**
・レイレーションの後ろにwithTimestamps()をつけないとcreated_atとupdated_atの値が中間テーブルで作成されない。

```php
    public function images()
    {
        return $this->belongsToMany(Image::class, 'article_images', 'article_id', 'image_id')->withTimestamps();
    }
```
エンジニアは技術力が全て？強みはもっと他にあるかも

# はじめに
なんかエムティーアイのカレンダーが埋まってないらしいと後輩から連絡を受け、
せっかくだしなんか書くか〜と思って今に至ります。
ぶっちゃけ技術のネタが思いつかないので、ちょっと前に行ったイベントのセッションの内容を出しながら、
エンジニアとしてどんな強みを持つか、というところを話していきたいと思います。

# 「技術にもマネジメントにも強みがないと、エンジニアとして活躍できないの？」
僕が昔行った、デブストというイベントのセッションで問われていた質問です。
みなさまこれについてどうお考えでしょうか？
「俺は技術力なら誰にも負けない！」
「私はマネジメント能力なら日本一よ！」
と言える方なら、この記事を見る必要はないでしょう。
でも、大体の人はそうではないと思います。
「どっちもそこそこだ...どうしよう」が普通だと思います。

エンジニアとしての大抵のキャリアは、
・技術力を高めて、プロフェッショナルになる
・マネジメント力を高めて、マネージャーになる
のどちらかになります。
では、どっちも自信がない場合は、どっちにもなれないままでしょうか？

# スピーカーの場合は？
セッションでこの問いを出したスピーカーの方は、技術もマネジメントも自信がなかったけど、
・技術的な内容を、エンジニアじゃない人にもわかりやすく伝えられる
・他社の方との対話が苦じゃない
という強みを元に、技術サポートの職に就いたそうです。その結果、社内でもそれなりの希少性が出て、事業上の価値を出せているようです。
一応セッションでは、
「エンジニア × 営業」「エンジニア　× 人事」という掛け合わせをして、希少性を見出して行こうぜ！
という流れで、いろんなキャリアを考えるきっかけをリスナーに与える形で締めくくられています。

# この記事を書いているお前はどうなんだ
僕も技術力もマネジメント能力もありません。それで悩んでいる時期もありました。
でも、仕事をしていくうちに、
・テストは得意かもしれないぞ
・なんか障害が起こったときの調査力ついたなあ
・俺意外と育成いけるんじゃね？
などなど、いろんな自信を持つようになりました。
今の部署では、この辺りを求められることが多かったので、自分の能力とマッチして、それなりに頑張らせていただいているかと思います（そうじゃなかったらごめんなさい）

# 自分の強みを職場にぶつけよう
セッションのスピーカーの方のお話みたいに、自分が好きなもの・得意なものをエンジニアと掛け合わせて、新しい仕事を見つけていく、という考え方も素敵だと思います。が、実際それによって価値が生まれるかはわかりません。この話は一旦置いておきましょう。

では、今の職場で、今の自分で貢献できることを考えてみましょう。
素直に「技術」や「マネジメント」を磨いていけば、貢献できる範囲は広がるでしょう。が、実際はなかなか勉強できない方もいますよね。
でも、本当に「技術」や「マネジメント」に強みがない方は、職場で活躍できないでしょうか？
職場によりけりなところはありますが、上で取り上げたスピーカーの方は「説明力」で貢献し、僕は「テスト」「調査」「育成」で貢献できてると思います（テストや調査は技術寄りなところもありますが、個人的にはそうでもないと思っています）。
「技術」や「マネジメント」以外でも、自分はこれが得意なんだ、ということを仕事にぶつけてみましょう。案外それによって事業がうまくいったり、いい評価につながったりするかもしれませんよ！


# 強みなんてわからない...という方は
とはいえ、じゃあ自分にどんな強みがあるかわからない、という方はいるかと思います。
いくつか、強みを見つける方法を書いてみようと思います。


**周りを見てみよう**
周りを見てみると、いろんな強みを持って自分の仕事を頑張っている方がいるんじゃないでしょうか？
逆に、「プロフェッショナル」や「マネージャー」という方が職場にいるかと思いますが、その方達は「技術」や「マネジメント」だけですか？
周りの人は、どんな強みがあると思いますか？観察してみると、「あ、これなら自分にもできるかも」と思うかもしれないです。

**とりあえずやってみる**
やっぱり基本はこれな気がします。
やってみて、いい結果を残せたなら、「これならいけるぞ」と思えるでしょう。
ポイントとしては、「こんなことできて当然」と思わないことです。
そのできて当然が、周りができなかったりします。

**褒めてあげて！**
「強み」は、基本的には他者と比較しての「強み」となるはずです。
なので、何が強いかは自分一人では見つけられません。
自分でやったことに対して、何のフィードバックも得られない場合は、これが強みなんだと思えるはずがありません。
周りの人がフィードバックして、初めてこれが強みなんだとわかるようになります。
簡単なフィードバックとして、褒めてあげることが手軽でいいと思います。

# まとめ
すっごく簡単に書きましたが、
エンジニアは「技術」だけでも「マネジメント」だけでもないと思います。
活躍しているエンジニアは、必ず他にも持っているはずですし、「技術」や「マネジメント」がなくても、活躍しているエンジニアはいるんじゃないかな〜と思います。
自分が割とどっちも持ってなくて、どうしようと思っていたので、同じような方がこれを見て、気づきを得られたらと思います。

# 参考
この記事で引用したセッションのURLです
https://event.shoeisha.jp/devboost/20191130/session/2233/
https://speakerdeck.com/jumtech/enziniax00-zhi-zhong-wo-yue-jing-sitexi-shao-xing-wochu-sukiyaria

# 後書き
あまりいい記事じゃないですけど、とりあえずカレンダー埋めようと思って急いで書いたので勘弁してください
Pythonスクレイピング---BeautifulSoupかSeleniumか（自分用）

###BeautifulSoupを使うべきか、Seleniumを使うべきかの判断方法について紹介します。

クラウドソーシングでお小遣い稼ぎをしていたら、先日BeautifulSoupのみによるwebスクレイピングを依頼されました。
seleniumを使かわないのか！おっしゃ楽勝楽勝！と意気揚々と制作にとりかかったわけですが、とあるデータの取得が上手くいかない…。
悪戦苦闘すること**数時間**してようやっとBeautifulSoupでは不可能だという結論に辿りつきました。

なので、同じような無駄な時間を過ごさないように知識を保存します。


##BeautifulSoup
HTMLやXMLファイルからデータを取得し、解析するPythonのWEBスクレイピング用のライブラリ
web上の**静的なデータのみ** 取得できます。
情報をもとにブラウザを立ち上げないので非常に**高速**です。

##Selenium
Selenium は Web ブラウザの操作を自動化するためのWEBスクレイピング用のライブラリ
静的なデータだけでなく**動的なデータ** の取得もできます。
その他、クリック操作やキー入力などスクレイピングでやりたいことは正直なんでもできます。

「なんだーじゃあselenium一択じゃん」って感じですが、ちゃんとデメリットがあります。
BeautifulSoupと違い、毎回chromeなどブラウザを立ち上げるのでかなり**遅速**です。もちろん手作業よりは断然早いのですが、タブを100個開きたいとかとなると馬鹿になりません。

なので、現実的なスクレイピングの方針としては、大枠はseleniumを用いつつ、BeautifulSoupが使える場面では積極的にBeautifulSoupを使うという流れになるとか思います。
まぁそれくらいは私も理解していたんですが、その境界が曖昧でした。

##要は
取得したいデータが動的なのか静的なのか分かればいい訳です。
静的データ：ユーザーに対して、Webサーバーが要求されたデータをそのままブラウザに送信したもの。
　　　　　　毎回同じものが表示されます。
動的データ：JavaScriptなどが裏で色々処理をすることで、表示されるものを都度変えています。
　　　　　　そのため、アクセスのタイミングに応じて内容が異なります。

##判別方法
長々と書いておいて、判別方法は簡単です。
調べたいchrome上で、**「CTR + U」**を押すとサイトのソースが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2004991/09f8a893-c575-a7e1-b681-a53c672d3b4d.png)
　　　　　　　　　　　　　　　　　　　↓↓↓（ズラ～～）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2004991/6975dbcc-0042-e673-b3e6-7d88d467f26b.png)

これがサーバから送られてきた静的データです。
BeautifulSoupはこれを読み込んでいるだけなので早いのです。
このソースの中に調べたい要素があればBeautifulSoupで事足ります。(CTR + Fなどで)
なければ、Seleniumを用いる必要があります。

以上、こんな感じです。
常識なのかもしれませんが、スクレイピングに関するサイトであんまり見かけなかったので今回苦労しました。

でも、スクレイピングしたいデータに限って動的なものが多いので結局Seleniumしか勝たん…

##参考サイト
ブラウザレンタリング：https://qiita.com/sasakiki/items/91dcc8b50d7a61ce98bc
Leafletの導入時にコンパイルに失敗する

# 目的
- ReactにLeafletで地図を導入する

## 環境
- react@17.0.2
- leaflet@1.7.1

# 作業手順（インストールから表示まで）
> 公式ドキュメントに従い進める
> https://react-leaflet.js.org/docs/start-setup/

1) インストール

```
npm install react react-dom leaflet
npm install react-leaflet
```

2) 地図を画面上に表示する

```javascript:App.js
import React from "react";
import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet'
import { LatLng } from "leaflet";
import "leaflet/dist/leaflet.css";

import "./App.css";

function App() {
  const position = new LatLng(51.505, -0.09);

  return (
    <div className="App">
      <MapContainer center={position} zoom={13}>
        <TileLayer
          attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
          url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
        />
      </MapContainer>
    </div>
  );
}

export default App;
```

```css:App.css
.App {
  text-align: center;
  height: 100vh;
}

.leaflet-container {
  width: 100vw;
  height: 100vh;
}

```



# エラーメッセージ
- 以上まで設定できたところで `npm start` を行うと、次のエラーが発生する

```
./node_modules/@react-leaflet/core/esm/path.js 10:41
Module parse failed: Unexpected token (10:41)
File was processed with these loaders:
 * ./node_modules/react-scripts/node_modules/babel-loader/lib/index.js
You may need an additional loader to handle the result of these loaders.
|   useEffect(function updatePathOptions() {
|     if (props.pathOptions !== optionsRef.current) {
>       const options = props.pathOptions ?? {};
|       element.instance.setStyle(options);
|       optionsRef.current = options;
```

# 原因
- トランスパイラのターゲット設定にあるライブラリ内の不具合

> React Leaflet + TypeScriptで地図（地理院タイル）を表示する
> https://zenn.dev/tris/articles/2021-10-react-leaflet-ts-gsi#%E5%AE%9F%E8%A1%8C%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AE%E8%A7%A3%E6%B6%88

# 対策手順
- 1) package.jsonを以下のように修正
 - browserslistを、production、developmentを、全部productionの内容だけにする


```json:package.json修正前
"browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
```

```json:package.json修正後
"browserslist": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ]
```

- 2) キャッシュをクリア
-  `node_modules/.cache` 以下を削除し
-  ` npm install` の上で、再度 `npm start`で起動する
Alibaba Cloud DevOps Pipeline(Flow)を試してみる vol.1

[Alibaba Cloud Advent Calendar 2021](https://qiita.com/advent-calendar/2021/alibabacloud)の12日目の記事です。

Alibaba Cloudで新しいサービスのうち気になった「[Alibaba Cloud DevOps Pipeline(Flow)](https://www.alibabacloud.com/product/apsara-deveops/flow)」について試してみました。

本記事は、workspaceの作成とテンプレート選択までの導入部分となります。

# Alibaba Cloud DevOps Pipeline(Flow)とは
サービス名の表記としては、この3パターンのようです。

* Alibaba Cloud DevOps Pipeline(Flow)
    * サービスページはこちらでの表記
* Alibaba Cloud Flow
    * トップページのメニューにはこの省略した名称での表記
* Alibaba Cloud DevOps Flow
    * ドキュメントでの表記

本記事では、「Flow」と記載していきます。

元々、DevOpsとは開発(Development)と運用(Operations)を組み合わせた用語です。
開発と運用を連携させ、より効率的かつ継続した開発＆リリースする仕組みです。

Flowは、エンタープライズレベルの自動化されたR＆Dとパイプラインプラットフォームです。
継続的なインテグレーション、検証、デプロイ機能を提供しています。

# Flowを試してみました

**1.workspaceの作成**
「Active for free」をクリック
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/7a137582-87fa-aeaa-5a63-cbf9244d8ff0.png)

**2.組織(又はチーム名)を入力し利用するユーザー数を選択**
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/ab4d475a-cfd8-91f8-71d3-69d707638a43.png)

人数はこのような幅で選択できます。
今回は1～10Peopleを選択しました。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/0d33382f-a1d4-03ae-d8e9-c237abe2d1b1.png)

**3.createを押して作成**
ここでトラブルが発生して慌てました。
createを押した後、画面が真っ白に。
リロードしてもダメで、どうしたものかと思っていたところ、このURLにアクセスすると次の4の画面が表示されました。
https://accountid-devops.alibabacloud.com/

**4.組織(チーム)選択画面**
最初に入力した名前の組織(チーム)が作成されているので、それを選択します。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/7d735c3f-bacb-c1ca-2c6b-2697dc5f360e.png)

**5.Pipeline作成・管理画面**
グループやPipelineの作成・管理を行う画面が表示されます。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/9b2b38cb-0e80-bfda-08fc-7dbd03162c81.png)

**6.Pipelineのテンプレート選択**
テンプレートが準備されているものもあります。
今のところはJavaがメインで準備されているようですね。
Java以外のものは、OthersにあるEmpty Templateを選択してTemplateを作成します。
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/6463156f-c6ec-98eb-5604-46a97fc89f88.png)

既存のテンプレートは、公式ドキュメントに記載があるのでそちらを参照してください。
https://www.alibabacloud.com/help/en/doc-detail/204145.html


**7.Pipelineの設定**
Empty Templateを選択すると、このような設定画面が表示されます。
GitとGitHubとの連携に対応しているようです。
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/d84b6ea4-dd61-2c01-a63f-e5b871eee837.png)


あと少し長くなりそうなので、GitHubとの連携などは次回にしたいと思います。
リレーションを使ったデータの取得(個人用メモ)

1.リレーションを使ってデータを取得したい場合は**with(リレーション)**を使用する。

```php
$viewData = User::with(hoge)->get()~
```
2.レイレーションを複数使用したい場合は、配列にしてつなげる。

```php
$viewData = User::with([hoge1,hoge2,hoge3])->get()~
```
3.ネストしたリレーションは「.」でつなぐ。

```php
$viewData = User::with(hoge.fuga)->get()~
```
4.リレーションを繋げて特定のカラムだけ取得したい場合はリレーション：カラム名を指定する

```php
$viewData = User::with(hoge:id,name)->get()~
```

最終コード(個人的なコードです)

```php
public function hoge()
    {
        $viewData = User::with(['mstPrefecture:id,value', 'memberMainSkill:id,value', 'memberSubSkills', 'memberOtherSkills.memberOtherImages:id,image_path', 'memberImages', 'joinWorks'])->get()->map(function ($member){
            return [
                'id'            => $member->id,
                'name'          => $member->name,
                'email'         => $member->email,
                'prefecture'    => $member->mstPrefecture,
                'mainSkill'     => $member->memberMainSkill,
                'joinedAt'      => $member->joined_at,
                'firstWorkedAt' => $member->first_worked_at,
                'subSkills'     => $member->memberSubSkills->map(function($subskill){
                    return [
                        'id'    => $subskill->id,
                        'value' => $subskill->value,
                    ];
                }),
                'otherSkills'   => $member->memberOtherSkills->map(function ($otherSkill){
                    return [
                        'id'           => $otherSkill->id,
                        'name'         => $otherSkill->name,
                        'description'  => $otherSkill->description,
                        'image'        => $otherSkill->memberOtherImages,
                    ];
                }),
                'images'        => $member->memberImages->map(function ($image){
                    return [
                        'id'   => $image->id,
                        'path' => $image->image_path,
                    ];
                }),
                'workCount'     => $member->joinWorks->count(),
            ];
        });
        
        return response()->json($viewData);
    }
```
AWS：Rekognitionとpythonで顔認識を行い、顔だけの画像をトリミングする

#Rekognitionはどのような顔を認識できるのかが気になったので実行
AWSを使って色々やってみる。
無料使用枠を超えると料金発生するが、色々できそう。
##目次
①目的
②ポイント
③コード
④所感
***
###①目的
スマホゲームの人型キャラクターの顔を識別できるのかが気になった。
識別できるならその顔画像をトリミングしてみようと思った

画像はスマホゲームの画像をスクリーンショットで取得。
コードは以前のコードを参照し、少し修正。
>https://qiita.com/be_tiger/items/4941779616d7b8095a81

***
###②ポイント
顔認識された画像は下記ドキュメントに記載されているようにレスポンスが返ってくる。
下画像の「BoundingBox」のレスポンスを使って、顔認識した範囲を取得する。

![screen 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698556/c7a642ce-bf0a-2a16-e2ae-3c0eb80fc4a1.png)
***
顔認識された範囲は四角形で囲われる。
それぞれ四角形の左上と右下を下記レスポンス値で表示される。

・”Left”：四角形の左上のx座標
・”Top”：四角形の左上のy座標
・”Height”：四角形の右下のx座標がLeftから離れている距離
・”Width”：四角形の右下のy座標がTopから離れている距離

※画像の横・縦サイズを１.0として、その割合の値となっている。
　例えば、Leftが0.5なら画像のx座標の0.5（半分）の位置に四角形の一番左がある


>AWSドキュメントのリンク
>https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/faces-detect-images.html
顔認識された範囲は四角形の例
>https://docs.aws.amazon.com/rekognition/latest/dg/faces.html?pg=ln&sec=ft

***
###③コード
```python:code
import boto3
import configparser
from PIL import Image
import json
import glob

#操作画像一覧の取得----------------------------------------------

#自分は「input_folder」というフォルダに画像を保存していました。
#folderに画像パス一覧を収納

folder = glob.glob("input_folder/*.png")

#AWS接続-------------------------------------------------------
#以前のコード参照（①のリンク）

ini = configparser.ConfigParser()
ini.read("config.ini","utf-8")

bucket = "AWS　S3のバケット名"
region = "AWS のリージョン名"

access_key = ini["AWS_KEY"]["aws_access_key_id"]
secret_key = ini["AWS_KEY"]["aws_secret_key"]

session = boto3.Session(aws_access_key_id=access_key,aws_secret_access_key=secret_key,region_name=region)

s3 = session.client("s3")
rekognition = session.client("rekognition")
cnt = 1

#-------------------------------------------------------------
#顔認識したい画像を順次投入
for Pic in fold:

    filename = Pic
    img = Image.open(filename)
    img_width = img.size[0]
    img_height = img.size[1]

    with open(filename, "rb") as f:
        # 読み込んだファイルをS3サービスにアップロード
        s3.put_object(Bucket=bucket, Key=filename, Body=f)

    response = rekognition.detect_faces(Image={"S3Object":{"Bucket":bucket,"Name":filename}},Attributes=["ALL"])
    
    #どのような画像が検出できなかった確認するためデータ名を出力
    if response['FaceDetails'] == []:
        print(filename)

    for faceDetail in response['FaceDetails']:
        
        #顔を囲う四角形の左上（x1,y1）と右下（x2,y2）の座標の取得
        x1 = int((faceDetail["BoundingBox"]["Left"]) * img_width)
        y1 = int((faceDetail["BoundingBox"]["Top"]) * img_height)
        x2 = x1 + int((faceDetail["BoundingBox"]["Width"]) * img_width)
        y2 = y1 + int((faceDetail["BoundingBox"]["Height"]) * img_height)
        
        crop = img.crop((x1,y1,x2,y2))
        
        crop.save(f"output_folder/face_rect{cnt}.png")
        cnt += 1
```
***
###④所感
・ちゃんと顔認識していた。
・ただ、下記画像が認識されにくかった（流石にキャラクターデザインは色々あるからなぁ）
→横顔もしっかり認識していたが、片目が隠れているデザインのキャラクターは認識されにくかった。
→目が線、曲線になっている画像（糸目）は高い確率で認識されない。

・けど、ちゃんと使えるから世の中の技術は凄いなぁとしみじみ実感。
・このようなオープンな技術はたくさんあるので、如何に使いこなす・知っておくことが大事なのではとも思った。

以上。
VMWARE がインストールされている環境で ホスト名検索が遅い

# VMWARE がインストールされている環境で ホスト名検索が遅い

VMWARE がインストールされている環境だと、NetBIOS名での検索が遅くなります。

他のマシンの名前が `hogehoge` だとして 

```
ping hogehoge
```

としたときに4秒程度反応が返るまでに時間がかかります。

これはVMWARE がインストールされている環境だと  `VMware Virtual Ethernet Adapter for VMnet1` や `VMware Virtual Ethernet Adapter for VMnet8` という仮想ネットワーク接続が作成されており、 `VMware Virtual Ethernet Adapter for VMnet1` と `VMware Virtual Ethernet Adapter for VMnet8` に対して名前解決のための通信を行ってタイムアウトした後、実際の物理ネットワークに対して名前解決のパケットを送るため、時間がかかります。

このため、`VMware Virtual Ethernet Adapter for VMnet1` や `VMware Virtual Ethernet Adapter for VMnet8` という仮想ネットワークに対して NetBIOS 名での検索を行わないように設定します。

## 設定方法

### 設定メニューから、ネットワークとインターネットで、イーサーネットを選んで、`アダプタのオプションを変更する` を選びます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/432827b5-2036-556f-08bf-b3be607d8aad.png)

### `VMware Virtual Ethernet Adapter for VMnet1` をダブルクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/17287998-4f7f-e8af-c7e8-ef36870d3545.png)

### `プロパティ` をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/6e34c768-0959-14ba-516f-f6a039b2ca5e.png)

### `インターネットプロトコルバージョン 4 (TCP/IPv4)` をクリックして、`プロパティ` をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/a8278cc2-8c4a-2747-f539-452b5e45fe33.png)

### `詳細設定` をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/f3bdf0cd-8672-7088-f46b-94c03d930aa5.png)


### `WINS` シートを選択して、`NetBIOS over TCP/IPを無効にする` を選んで OK を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/784ddb6f-cdfd-19d7-0cbe-050603029107.png)

### `VMware Virtual Ethernet Adapter for VMnet8` に対しても同様に `NetBIOS over TCP/IPを無効にする` を無効にする操作を行います。

## 注意

`VMware Virtual Ethernet Adapter for VMnet1` と `VMware Virtual Ethernet Adapter for VMnet8` で `NetBIOS over TCP/IPを無効にする` を無効にする操作をすることにより VMWARE ゲスト側で、ホスト名を使用した名前解決ができなくなるため、ホストマシンで名前解決が遅い問題と、VMWARE ゲスト側で、ホスト名を使用した名前解決ができなくなるのとトレードオフの関係にあります。

VMWARE ゲスト側に avahi-daemon をインストールすることで mDNS による名前解決はできます。(参考: https://qiita.com/m-tmatma/items/7668afea91aff4fbfa85 )


## 参考リンク


https://docs.microsoft.com/ja-jp/troubleshoot/windows-server/networking/configure-tcpip-networking-netbios-turn-off

https://atmarkit.itmedia.co.jp/ait/articles/0401/17/news019.html

https://qiita.com/m-tmatma/items/7668afea91aff4fbfa85