OmniAICreator/Qiita-1.07M huggingface dataset:
Nuxt2 – vue-closable + transition でフェードイン・フェードアウトのアニメーションをするコード例

# ポイント

- 表示を切り替えたいエリアを `<transition>`で囲む
- `<trantision name="xxx">` の name に対して CSS のプロパティの名前を合わせる ( 例: `xxx-enter-to` )

# 例


```vue

<template>
  <div id="app">
    <button ref="button" class="toggle-button" @click="showPopup = !showPopup">
      TOGGLE
    </button>
    <transition name="opacity">
      <div v-show="showPopup" v-closable="{
        exclude: ['button'],
        handler: 'onClose'
      }" class="popup-box">
        Test Popup Box
      </div>
    </transition>
  </div>
</template>

<script>
import Vue from 'vue'
import VueClosable from 'vue-closable'

Vue.use(VueClosable)

export default {
  data() {
    return {
      showPopup: false
    }
  },

  methods: {
    onClose() {
      this.showPopup = false
    }
  }
}
</script>

<style scoped>
.opacity-enter {
  opacity: 0;
}

.opacity-enter-active {
  transition: opacity 1s;
}

.opacity-enter-to {
  opacity: 1;
}

.opacity-leave {
  opacity: 1;
}

.opacity-leave-active {
  transition: opacity 1s;
}

.opacity-leave-to {
  opacity: 0;
}
</style>
```

# 表示例

![image](https://user-images.githubusercontent.com/13635059/210723549-ea20c044-c64a-471b-975d-17fe0258abb7.png)
![image](https://user-images.githubusercontent.com/13635059/210723553-f33bee1f-f206-4d04-82cf-66c0e46db69a.png)

# 環境

@nuxt/cli v2.15.8

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
dockerでnodeを立ち上げる

Dockerに関しては業務である程度触ってはいるが、自分で立ち上げたことはなかったため、やってみることにした。
expressを利用したプロジェクトのディレクトリの作成から、Dockerfileを使ってdockerイメージを作成するところまで。

### Dockerfileとは？
Dockerイメージを構築するために必要なコマンドを記述するファイル。
- 「使用するnodeのバージョン」「Dockerイメージ内に作成するファイル」などのコマンドを記述する。
- `docker build --tag [name-tag] .`  (`[name-tag]`は任意のタグ名)を実行すると、`Dockerfile`に記述されたコマンドを上から1つずつ実行し、Docker イメージを作成してくれる。

### 手順
1. プロジェクトのディレクトリを作成する。
1. 作成したディレクトリ下に`server/src/index.ts`を作成する。 
1. `cd server`でディレクトリを移動した後、 `npm init -y` を実行して `package.json`を作成する。 
1. 2で作成した`index.ts`に、以下を記述する。([こちら](https://expressjs.com/en/starter/hello-world.html) を参考にしました)
    ```index.ts
     const express = require('express')
     const app = express()
     const port = 3000
     
     app.get('/', (req, res) => {
       res.send('Hello World!')
     })
 
     app.listen(port, () => {
       console.log(`Example app listening on port ${port}`)
     })
    ```
1. `package.json`に以下を追加する。
    ```package.json
   "scripts": {
     "start": "node src/index.ts"
   }
    ```
1. `yarn run start`を実行し、ブラウザで`http://localhost:3000/`を確認する。「Hello World!」が表示されていれば成功で、一旦`yarn run start`は止めておきましょう。
    
    ここまでがexpressについて。ここからがdockerについて。
    この先は、[こちら](https://www.docker.com/blog/getting-started-with-docker-using-node-jspart-i/#:~:text=Creating%20Dockerfiles%20for%20Node.js )を参考にしました。

1. docker desktopを起動する。
1. `server`ディレクトリの直下に`Dockerfile`ファイルを作成する。(ファイル名を間違えると後でエラーが出るので注意)
1. `Dockerfile`に以下を記述する。
    ```Dockerfile
    FROM node:18
    WORKDIR /app
    COPY package.json .
    COPY yarn.lock .
    RUN yarn install
    COPY . .
    CMD [ "node", "src/index.ts" ]
    ```
    nodeのバージョンとして指定できるタグは、[こちら](https://hub.docker.com/_/node)から参照できます。
1. `docker build --tag node-docker .` を実行し、Dockerイメージをビルドする。
    冒頭でも説明した通り、`node-docker`の部分については任意に設定できます。
1. `docker images`を実行し、表示されるリストのREPOSITORIESの中に、今ビルドした`node-docker`があることを確認する。
1. `docker run --publish 3000:3000 node-docker`を実行し、portを公開する。
1. 再びブラウザから`http://localhost:3000/`にアクセスし、「Hello World!」と表示されていれば成功です。
sedでオプションの順番は(-ri)が正解で(-ir)はNG


はじめに結論から書くと ```sed -i -r```と分けた形でオプションを指定すれば良いです。

## 概要

例えばaptのリポジトリを書き換える作業が必要な場合を想定します。
下記のように拡張正規表現を利用し````-ir````の順番でオプションを指定した場合、
うまく書き換えることができません。

```bash
$ cat /etc/apt/sources.list | grep '^deb'|head -2
deb http://archive.ubuntu.com/ubuntu/ kinetic main restricted
deb http://archive.ubuntu.com/ubuntu/ kinetic-updates main restricted

## 「-ir」を指定して(archive|security)をold-releasesに書き換え
$ sed -ir 's@(archive|security).ubuntu.com@old-releases.ubuntu.com@g' /etc/apt/sources.list

## 書き換わってない
$ cat /etc/apt/sources.list | grep '^deb'|head -2
deb http://archive.ubuntu.com/ubuntu/ kinetic main restricted
deb http://archive.ubuntu.com/ubuntu/ kinetic-updates main restricted
```

しかし、なぜかオプションの順番を逆に指定すると想定通りに書き換えることができます。

```bash
## 「-ri」を指定して(archive|security)をold-releasesに書き換え
$ sed -ri 's@(archive|security).ubuntu.com@old-releases.ubuntu.com@g' /etc/apt/sources.list

## 書き換わっている
$ cat /etc/apt/sources.list | grep '^deb'|head -2
deb http://old-releases.ubuntu.com/ubuntu/ kinetic main restricted
deb http://old-releases.ubuntu.com/ubuntu/ kinetic-updates main restricted
```

多くのLinuxコマンドではオプションを連続して指定することができるため、
オプションの順番で振る舞いが変わることは奇妙な振る舞いに感じます。

## 説明とか

この現象は、sedでは```-i```オプションのあとに文字が続いた場合はその文字をバックアップファイルのサフィックスとして扱うという仕様のために発生しています。

> -i[SUFFIX], --in-place[=SUFFIX]
>    ファイルをインプレース処理で編集します (SUFFIX 指定時はバックアップを取ります) 
>「 [Man page of SED](https://linuxjm.osdn.jp/html/GNU_sed/man1/sed.1.html)」 より

つまり```sed -ir```と指定した場合は、ファイルを上書きして```r```というバックアップファイルを作成することになります。
```-i[SUFFIX]```の仕様は下記のように.bakをつけたバックアップファイルを作るために使用されることが多いです。

```bash
$ sed -i.bak 's/a/b/' test.txt
$ ls
test.txt  test.txt.bak
```

実際に```sed -ir```を使用した記事最初の例では該当ディレクトリに```r```がついたバックアップファイルが作成されています。

```bash
$ ls -p /etc/apt/|grep -v /
sources.list
sources.listr
```

つまり```-ir```のオプション指定で想定通りに書き換わらない理由は、
***```-r```オプションが指定されていないために拡張正規表現が利用できない***ことによるものです。

### ```-ir```オプションでもうまく行く場合
レアケースかもしれませんが下記のように```-ir```を指定していても拡張正規表現を利用しなければうまくいきます。

```bash
## 「-ir」を指定して(archive|security)をold-releasesに書き換え
$ sed -ir 's@archive.ubuntu.com@old-releases.ubuntu.com@;s@security.ubuntu.com@old-releases.ubuntu.com@' /etc/apt/sources.list

## 書き換わっている
$ cat /etc/apt/sources.list | grep '^deb'|head -2
deb http://old-releases.ubuntu.com/ubuntu/ kinetic main restricted
deb http://old-releases.ubuntu.com/ubuntu/ kinetic-updates main restricted
```

そして```r```とサフィックスについたバックアップファイルが作成されます。

## 結論

```sed -i -r```または```sed -r -i```という個別に指定する形式でオプションを書くのが良いぽいです。
オプションの順番で躓く心配はなくなります。

## 備考
StackOverflowに同じことが書かれてたりします。
https://stackoverflow.com/questions/17525378/sed-command-order-of-option-flags-matters-ir-vs-ri
言語が違ってても同じミスをする人がいるのは感慨深いというかなんというか……

この記事が誰かの役に立てば幸いです。
AI向けGitHubのレポジトリ比較時に最低限確認して欲しい内容（ビジネス側視点）

# 目的
お客様向け・社内でAIのPoCを始める前にやった方がいい調査内容のメモ書きです。

# 想定読者
AIに関わるプロジェクトを始める様に上司から言われたけど、「学生のノリでOSSをとりあえずCloneして実装すればいいのかな？」「調査は何から始めればいいの？」と悩んでいる方。

# 結論
下記リンクの様に、綺麗にまとまっている表が１つあると判断もしやすいのではないでしょうか？非エンジニアにとっても同じです・・・。
https://qiita.com/okuramasafumi/items/9cff50507df7703374fd

# 前提（つぶやき）
- AIスタートアップに在籍した後、コンサル会社にいるビジネス寄りの人間が書いています。両キャリア通じて色々な人種に囲まれて色々な意味のマネージャーをやっています。
- 修正が必要な内容があれば適宜ご指摘ください。
- プロジェクトを進めている中で、「商用利用のことまったく考えてなかった！ごめん！なんとかして？」と関係者に言わない・言われないための覚書だと思って頂ければ幸いです。
- 予算が潤沢にある場合はランセンスをチェックするソフトを導入すればいいのでしょうが、ＤＸの取り組みが社内で分散化する昨今、中々自前で揃えることも難しいと考えます。

# 本文
GitHubのレポジトリを比較する際、最低限これは調べて欲しい内容は **「ライセンス」「スターの数」「最後のCommit日時」** です。
その上で技術特性を比較して欲しいと考えます。

### ライブラリのライセンス
GitHubではトップページでライセンスがわかります。
（ビジネス側の人間でも少し調べればわかる内容ということでもあります。）
MITやApach2.0であれば、利用目的に関わらずあまり心配しなくても大丈夫です。
調べてコピーレフトの場合は、商用でソフトを提供・公開する場合NGになる確率が高いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090342/e5a404b2-0b53-940b-31ea-ffdfe82ab721.png)

GitHubのトップページに行くと、本記事執筆時の2023/01/05時点では、[TensorFlow](https://github.com/tensorflow/tensorflow) はApache-2.0 license であることがわかります。

※開発者があまり考えず他のレポジトリを取り込んでいて、トップページのランセンスと実態が合っていない場合等はありますが、その様な事態も後続の数値が高いレポジトリを選んでトラブルになる率を下げられると考えます。

### GitHubのスターの数
GitHubではページ右上にスターの数が提示されます。
あまりマイナーなライブラリは多くのユーザーに揉まれていないということなので、相対比較するならスターが多い方が無難だと考えます。
1000以上のスターがあれば、トラブルが少ない印象があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090342/6483be77-9d0f-72e9-93c3-9f5ece2ce1b5.png)

本記事執筆時の2023/01/05時点では、[TensorFlow](https://github.com/tensorflow/tensorflow) は約170000個のスターがあることがわかります。

## 最後のCommit日時
GitHubではInsightタブでCommitの情報が見れます。「Commits」や「Network」を確認してみてください。

最後のCommitが古いレポジトリをどうしても使いたい場合、位置づけをよく確認しないといけません。
誰も触らなくなったのか、特定の営利団体が開発を別レポジトリで実施していて年に1回だけバージョンを上げるのかなどまちまちです。
Commitが活発にされているレポジトリではIssueで連絡をすると直ぐに反応してくれるので、「ライセンスが『商用利用は問い合わせ』となっていても直ぐに解決できたりします。」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090342/408186cd-68a9-5032-029a-5deef900c078.png)

TensorFlowは2023/01/05時点で、1/1週でも121回コミットされています。


### 技術の特性
その技術がなぜ優れているのかの差分がまとまっているといいです。
全体のまとめテーブルの前に、技術開発の潮流まで記載されているとなお助かります。

### 制約
- PyTorchやCUDAのバージョンなど、プロジェクトのディプロイ先の制約は日程に影響を及ぼすので、トレードオフがあるなら比較をしてみて欲しいです。
- 「現在のままでは学習コードは公開されていないので、デモレベルならいいけど開発が進んだ際のチューニングはできないよ」などの気づきもどんどん記載して欲しいです。

### 誰が開発しているか？
コントロールしている方の所属はリストにあると本当はうれしい内容です。
ただ、上記に優先しないという意図で最後に記載します。

### その他
#### データセット
学習済みモデルのデータセットに関するライセンスは決着がついていないので難しい話題かと考えます。
ただ、商用利用が許されないImageNetで学習された重みが、Big Techから商用利用OKで公開している例が多いように見えるので、「データセットのライセンスは有名無実」なのかもしれません。


# 参考リンク
- https://qiita.com/shinya_sun_sun/items/bdafe803a7643e6dd15b
基本的なコピーレフトやコピーライトの考え方が記載されています。

- https://future-architect.github.io/articles/20200821/
各ライセンスのまとめテーブルが役に立ちます。
【Nuxt.js】Microsoftの分析ツールClarityの導入が簡単すぎて感動した

# Clarityとは
ClarityはMicrosoftが提供するWebサイトの分析ツールです。
無料で使用でき、セッションの記録（画面録画）、ヒートマップ、インサイトの確認が可能です。
https://learn.microsoft.com/en-us/clarity/about-clarity

# Nuxt.jsのアプリケーションに導入
1. Clarityにサインアップします。
https://clarity.microsoft.com/
1. プロジェクトを作成し、プロジェクトIDを確認します。
プロジェクトの画面から>設定>概要に記載がありました。
![スクリーンショット 2023-01-05 15.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842052/795f1d99-a247-7180-9d80-bcc77992c40e.png)


3. npmでClarityをインストールします。
https://www.npmjs.com/package/nuxtjs-microsoft-clarity
    
    ```Bash
      $ npm i nuxtjs-microsoft-clarity --save
    ```
     
4. nuxt.config.jsを編集します。
    ```Javascript
      modules: [
        'nuxtjs-microsoft-clarity'
      ]
      microsoftClarity: {
        // Options
        id: "プロジェクトID"
      },
    ```
1. Buildする

以上で導入手順は完了です。
![スクリーンショット 2023-01-05 15.58.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842052/121e229e-b1bd-abce-324b-11a372568458.png)

build後に画面を表示すると、Clarityのプロジェクトの画面からレコーディングされた操作内容や、アクティブなユーザーの数などがリアルタイムで確認できました。
ユーザーのメールアドレス、投稿日時などに自動でマスクがかけられています。
localhostでもモニタリングされることを確認できました。

# まとめ
導入がとても簡単でかつ無料で使用できる感動しました。
画面の表示項目をマスクの度合いを変更したり、サードパーティのプラットフォームにインストールしたり、Googleアナリティクスと統合したり、いろんなことができるようです。
ぜひ利用してみてください。
M5Stack Core2: ping の送信

M5stackCore2 で ping を送信する方法です。
Arduino IDE 2.0.3 を使います。
ライブラリーは、ESPping を使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/cf59481d-ccd5-1aef-d05f-402dd463a51b.png)


```text:ping_test/ping_test.ino
// ---------------------------------------------------------------
/*
	ping_test.ino

						Jan/05/2023
*/
// ---------------------------------------------------------------
#include <WiFi.h>
#include  "ping.h"

const char ssid[] = "rs500m-e1eaf5-1";
const char password[] = "7f7a63e07b1c6";

// ---------------------------------------------------------------
void setup()
{
	Serial.begin(115200);
	Serial.print("Connecting t ");
	Serial.println(ssid);
	// WiFi.mode(WIFI_STA);

	WiFi.begin(ssid, password);

	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
	}

	delay(1000);
	Serial.print("IP address:  ");
	Serial.println(WiFi.localIP());
	delay(1000);

	Serial.println("Pinging address: 8.8.8.8");

	delay(1000);
}

// ---------------------------------------------------------------
void loop()
{
	IPAddress adr(8,8,8,8);

	Serial.print("Ping:  ");
	Serial.print(adr);
	Serial.print(" -> ");

	if (ping_start(adr, 4, 0, 0, 5))
		Serial.println("OK");
	else
		Serial.println("FAILED");

	delay(5000);
}

// ---------------------------------------------------------------
```
Cloud9 の環境複製手順

# はじめに
どうも、初めましての人は初めまして！見覚えがある方はお久しぶりです！ミツクマです🐻
業務で、Cloud9を使用しており、この開発環境を配布できるようにしてほしいと依頼されました。
何を調べても「共有環境」の方法はあっても、環境の複製や配布が見当たらなかったので（自分の調べ方が悪かった）
備忘録として、解決の手順を共有したいと思っています。
今回は、全てプライベートサブネットで開発したかったため、EBSを基に複製する手順を書いていきます。
AMIでも複製ができるとありました。しかし、試したりしていないので
そちらの方が知りたい方はこの記事がおすすめです！
https://qiita.com/shyle/items/112bfbbf0ee479393229

# Cloud9の開発環境の複製手順

## 複製元のEBSを作成する。
複製したいCloud9のEC2インスタンスをまず停止します。
停止の確認ができたら、スナップショットを作成します。
スナップショットからEBSを作成します。

## 新規でCloud9を作成する。
新規でCloud9を作成する手順として
a.	Environment type はNew EC2 instanceを選択する。
b.	Instance typeは複製元と同じ「t3.small」を選択する。
c.	Network settings は「SSH」を選択する。
d.	VPC settingsのVPCはデフォルト、Subnetは複製元と同じAZを選択する。
以上の手順でCloud9を作成します。

## 作成したCloud9のEC2インスタンスを停止する。
作成したCloud9の一覧からEC2のページへいけるので、そこからたどってインスタンスを停止させてください。
停止を確認したら、ストレージのタブをクリックして、アタッチされているボリュームをデタッチしてください。
デタッチしたら、左側のボリュームをクリックします。

## 複製元のボリュームをアタッチ
複製元のボリュームを新規で作成したインスタンスにアタッチしてください。

## 注意点
この時デバイス設定がデフォルトの「/dev/sdf」だと動きませんでした。
なので、「/dev/xvda」に変更してください。

## Cloud9のIDEを起動する
警告が表示されますが、「Accept」をクリックしてください。
そしたら、環境の複製を行うことができます。

以上が、環境の複製、配布になります。

# 最後に
今まで、Cloud9を使用した開発の経験がなかったのですが
なかなか便利だと思いました。今後は、共有環境の状態でペアプロも体験してみたいなと思いました。
(docker-composeさえインストールしたらdockerでいいのでは...?と思ったのは内緒)
同じように悩んでいる人の参考になれば、幸いです。
それでは、ここまで読んでくださりありがとうございました。
また別の記事で！🐻
React初心者　勉強記録　（エラー解消記録）

materialUIをインストールした際にエラーが出現。


`npm i `

package.jsonに定義されたモジュールをインストールするコマンド

- ただしpackage-lock..json 　がすでにある場合はバージョンを揃えるために、package-lock.jsonを見る


`yarn add `  でモジュールを追加すると`yarn.lock`ができる(package-lock.jsonのyarn版)


解消方法としては、一度package-lock.jsonを削除してからnpm i を実行して再生成
Reactの技術面接質問の問題集がすごい

## はじめに
先日「Reactの技術面接質問の問題集がすごい」と話題になっていたので確認すると、333問ものReactに関するQ&Aが載っていたのでご紹介します。Reactの知識を確認したいという方はぜひ一度見てください。

https://github.com/sudheerj/reactjs-interview-questions

中身は全部英語なので、英語に苦手意識がある方はGoogle翻訳をかけて読むことをお勧めします。
https://translate.google.com/  から左上のタブでウェブサイトを選択し、上記のリポジトリのURLを貼ると、結構わかりやすく翻訳されます。（propsが小道具と翻訳されたり、やや日本語が怪しい部分は自分で補ってください）

とにかくリポジトリを見てください!!!
だけでおしまいになると記事として寂しいので、少しだけ中身をご紹介します。

## 内容
全部で8つの項目にわかれてます。
* React本体
* React Router
* 多言語対応
* テスト
* React Redux
* React Native
* Reactのサポートするライブラリやインテグレーション
* その他HooksやHOCなどいろいろなこと

Reactに関して基礎知識から基礎的コーディング、推奨する方法や推奨のライブラリなど、たくさんのReactに関することが載っていて、一通り全部目を通しておくと自分がどのくらいReactを理解しているのかのチェックリストになっているので非常におすすめです。

特に採用者側は面接でReactに関しての技量を図るのに、また応募者側は面接対策として使ってみるのはいかがでしょうか？
mdoc(7)形式のmanページを端末にレンダリングしたときの挙動の違い:".Sh NAME"の有無によるヘッダとフッタの表示の有無(groff vs man-db vs mandoc)

# TLDR
- groff(1.22.4など、jgroffがどこかにいった時代におけるバージョン)は日本語対応とかUTF-8対応とかどうなってるの？誰か教えてくれ。
- man-dbは本当の`.Sh NAME`がなければ`.Dd`,`.Os`などの「ヘッダーやフッターのための」リクエストが無視される(使ってるマクロがgroffのmdocだからか?)
  - groffも同様(英文じゃなければ話にならないことを除いて)
- mandocは優秀。`.Sh NAME`が`.Sh "名称"`であろうが、`.Sh`がなかろうがヘッダやフッタが表示される。

# この記事を書いた動機
マニュアルを書いてみたい。それも是非mdoc(7)形式で書けるのであれば。

## 何故man(7)ではなくmdoc(7)で書くべきなのか
見た目ではなく意味論の重視ができる。あと、後者は新しい。と書くには私の我儘がヤバい。

# 何をした
- FreeBSD 5.2-RELEASE向けの[日本語オンラインマニュアル](http://www.jp.freebsd.org/man-jp/get.html)をダウンロードした
- いろんなマニュアルがEUC-JPでmdoc(7)形式で書かれていた(一部はman(7)形式だった。ar.1.gzやgrep.1.gzがそうである。GNU由来のマニュアルがそのような傾向にあると思われる。)
- そのなかでintro.1.gzでレンダリングのテストをしてみた

## 私の環境
Arch GNU/Linux。最後の`pacman -Syu`によるアップグレードは2023-01-04である。端末エミュレータはrxvt-unicode 9.30-1。幅は、168文字。

```terminal これで宜しいのでしょうか？
$ stty size
48 168
```

## ソフトウェアは何を使った
```terminal
$ yay -Q man-db groff mandoc
man-db 2.11.1-1
groff 1.22.4-7
mandoc-noconflict 1.14.6-1
```

※mandocパッケージもあるが、それはman-dbと衝突するし、何よりこの記事を作成している時点では上流URLが修正されていないので、mandoc-noconflictというAURパッケージで代替。

## intro.1.gzの冒頭はどんな見た目か
```terminal
$ zcat ./intro.1.gz | # GNU拡張ですまない。gunzip -cで同じことができる。
> iconv -f EUC-JP -t UTF-8 | # 文字コード変換。筆者の環境はUTF-8。
> awk '$1!=".\\\""{s=1}s' | # 冒頭にコピーライト表示のコメントがあるため削除
> head # 最初の十行を取得
.Dd October 21, 2001
.Dt INTRO 1
.Os
.Sh 名称
.Nm intro
.Nd 通常コマンド (ツールとユーティリティ) の手引
.Sh 解説
マニュアルのセクション1は、
.Bx
ユーザ環境を構成するコマンドのほとんどについて書かれています。
```

このように、`.TH`や`.SH`が登場するman(7)とは打って異なり、mdoc(7)では`.Dd`,`.Os`,`.Sh`などのマクロが登場する。

## レンダリングさせてみた
### groffで
日本語文字化け。
```terminal
$ zcat ./intro.1.gz | iconv -f EUC-JP -t UTF-8 |
> nroff -mdoc | # このコマンドで端末へのレンダリングが容易
> head

åç§°
     intro — éå¸¸ã³ãã³ã (ãã¼ã«ã¨ã¦ã¼ãã£ãªãã£) ã®æå¼

è§£èª¬
     ããã¥ã¢ã«ã®ã»ã¯ã·ã§ã³1ã¯ã BSD
     ã¦ã¼ã¶ç°å¢ãæ§æããã³ãã³ãã®ã»ã¨ãã©ã«ã¤ãã¦æ¸ããã¦ãã¾ãã
     ã»ã¯ã·ã§ã³1ã«å«ã¾ããã³ãã³ããä»¥ä¸ã«ããã¤ãåæãã¾ãã

     ããã¹ãã¨ãã£ã¿
```

### man-dbで(特に何も指定しなかったらgroffが使われる…と`man 1 man`で理解なう)
ヘッダやフッタが表示されなかった。
```terminal
$ zcat ./intro.1.gz | iconv -f EUC-JP -t UTF-8 | man -l - | head

名称
     intro — 通常コマンド (ツールとユーティリティ) の手引

解説
     マニュアルのセクション1は、 BSD ユーザ環境を構成するコマンドのほとんどについて書かれています。 セクション1に含まれるコマンドを以下にいくつか列挙します。

     テキストエディタ

     コマンドシェルインタプリタ
```

### mandocで
ヘッダ出た。
```terminal
$ zcat ./intro.1.gz | iconv -f EUC-JP -t UTF-8 | mandoc | head
INTRO(1)                    General Commands Manual                   INTRO(1)

 名 称
     intro – 通常コマンド (ツールとユーティリティ) の手引

 解 説
     マニュアルのセクション1は、 BSD
     ユーザ環境を構成するコマンドのほとんどについて書かれています。
     セクション1に含まれるコマンドを以下にいくつか列挙します。

```

# 考察(？)と結論
groffの方のmdoc(7)のマニュアルでは

> The ‘.Sh NAME’ macro is mandatory.  If not specified, headers, footers and page layout defaults will not be set and things will be rather unpleasant.

すなわち節名が文字通り「NAME」となっている節がなければ正しいレンダリングがなされないという。一方でmandocの方のmdoc(7)は同様の記述が見受けられなかった(正しいマニュアルとして最初の節にNAME節が来るべきだという記述はあったが動作にまで影響が出るわけではない)。

<strike>groff側よ、可能であればそのような宗教戦争を止めてくれないかね。</strike>
M2のMacにDockerとDocker Composeをインストールする

M2のMacにDockerとDocker Composeをインストールする手順をまとめる。

# Docker Desktopのインストール
以下から「Mac with Apple silicon」の方でインストローラーをダウンロードしインストールする。
https://docs.docker.com/desktop/install/mac-install/

# Docker Composeのインストール
:::note warn
この記事を書いた時点ではDocker Composeは別途でインストールが必要でしたが、現在はDocker Desktopを入れると一緒にインストールされるみたいです。
:::
最新のバージョンを以下で確認する。
https://github.com/docker/compose/releases
以下のコマンドのバージョン部分を最新のものに置き換えて実行する。
※バージョン2以降は既存のインストール方法とは異なるなので注意

```bash
# インストール先のディレクトリを作成
sudo mkdir -p /usr/local/lib/docker/cli-plugins

# docker-composeをダウンロードして配置(※aarch64の物を指定する)
sudo curl -SL https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-darwin-aarch64 -o /usr/local/lib/docker/cli-plugins/docker-compose

# 実行権限を付与する
sudo chmod a+x /usr/local/lib/docker/cli-plugins/docker-compose

# インストールしたDocker Composeのバージョンを確認する
docker compose -v
```

※コマンドが「docker-compose」から「docker compose」になっているので注意
MacにJavaをインストールする

# Javaのインストール

```bash
# 最新のJavaをインストール
brew install openjdk

# パスを追加
echo 'export PATH="/opt/homebrew/opt/openjdk/bin:$PATH"' >> ~/.zshrc

# 現在のバージョンを確認
java -version
```

# バージョンを切り替える場合

```bash
# cask-versionsをインストール
brew tap homebrew/cask-versions

# jenvをインストール(※バージョンを切り替えたりする場合)
brew install jenv

# jenvのパスを追加(※バージョンを切り替えたりする場合)
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc

# ディレクトリを作成
mkdir -p ~/.jenv/versions

# jenvにJDKを追加
jenv add `/usr/libexec/java_home -v "1.8"`

# jenvに設定されているJDKを確認
jenv versions

# グローバルのバージョンを変更
jenv global 1.8.0.222
jenv versions

# ローカルのバージョンを変更
jenv local 11.0
jenv versions   
```

# 参考

https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2
Magento で "This is a demo store"を表示する方法

設定中のMagentoサイトで以下の"This is a demo store. No orders will be fulfilled"というメッセージを出す方法です。意外にハマったのでメモ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/088ee87b-436c-ee07-5c90-99708fd93d99.png)

```Contents - Design - Configuration```より```Store View```を選択して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/0ca12991-ef37-8b8c-fd03-b7f39ff4a895.png)


```Display Demo Store Notice```を```Yes```に変更すると、```This is a demo  store.```というメッセージが表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56044/08330436-e457-b780-ac58-2b8d18c1161d.png)
BizRobo!の運用ブログ始めます。

# ごあいさつ
:sunrise: 2023年になりました。
新年の抱負ではないですが、今年から部署の情報発信始めます:bangbang:

RPAテクノロジーズという会社で社内向けにRPAロボット :robot:（BizRobo!）の開発・運用をしています。
Product Deliveryという製品開発部門の配下にある`基盤・運用セクション`という部署で情シス業務やDXの推進を行っています。

製品開発の部門ではありますが、主に行うのは製品の用途開発や用途拡張に向けた活動なので、いろんな角度で製品を使い倒そう:exclamation:と日々朝一でDesign Studioを起動します。

とはいえ 100% RPAに時間を使えるわけではなく、情シス業務を中心とした日々のタスクは止むことを知らず。。:umbrella:
朝開いたままのDesign Studioをそっと閉じる日も。。

実際にBizRobo!を導入・推進されているお客様においても同様に `RPAだけやってるわけじゃない` なかでどのように効果をだしていくのか、というのは共有の課題かなと思います。

メーカー視点ではなく一利用者（利用部門）の記録として日々の試行錯誤を皆さんと共有出来たら、もしかしたら素敵なんじゃないかなと思っています。:slight_smile:

記事の更新は月1回を目安に、まずはスタートしていきたいと思います。


:::note warn
このブログは `基盤・運用セクション` のメンバーが日々の業務で体験した出来事をベースにBizRobo!推進の様子や工夫、BizRobo!以外のソリューション紹介や思ったことなどを発信する予定でおりますが、そのいずれもがメーカーとしての推奨を意図するものではありません。
:::

それでは、よろしくお願いします。
Wordpress＋elementor＋JQuery

elementorのデフォルト機能を活用して、簡単に個別ページやテンプレートにJQueryを使用可能。
拡張プラグインのインストールは不要。

htmlウィジェットで以下のように記述する。
```html
<script type="text/javascript">
(function($) {
    $(function() {
        //ここにスクリプトを配置
    });
})(jQuery);
</script>
```
## 拡張プラグインの使用
elementor には多くの拡張ウィジェットを有するプラグインがリリースされているが、JQueryの拡張ウィジェットを使用するためだけにインストール・有効化するのは適切ではない。
MacにPHPをインストールする

# PHPのインストール

```bash
# 最新のPHPをインストール
brew install php
```


# PHPのバージョンの切り替え

```bach
# PHP 8.0を無効にする
brew unlink php@8.0

# PHP 7.0を有効にする
brew link php@7.0
```

# 参考
https://tech.amefure.com/php-homebrew
https://oopsoop.com/how-to-switch-php-versions-on-mac-brew-link-unlink/
PL-900：アプリを共有する

この投稿はMicrosoft PL-900の受験に向けた勉強資料をMS Learnページを参考にして作っています。
一発合格に向けて頑張りましょう！

[アプリを共有する][MS-Learn]

[MS-Learn]: https://learn.microsoft.com/ja-jp/training/modules/build-app-solution/5-share-app

# アプリを共有する
* 共有先ではブラウザーもしくはApple iOS、Google Androidのプレイヤーで実行可能
* アプリの更新をする権限を他のユーザーに与えることも可能

## アプリを共有するための準備をする
まず、共有するアプリを編集モードで開く
1\. Power Apps Studio で、ファイル メニューを選択し、名前を付けて保存を選択してクラウドを選択

2\. 右下コーナーの保存をクリック

3\. アプリが正常に保存されたら、共有をクリック

4\. [共有] タブ　→　アプリを共有するユーザーまたはグループを指定
* 組織内のすべてのユーザーを追加するには、会社名のすべてのユーザーを選択
* 大勢のユーザーと共有する必要がある場合はAzure Active Directoryセキュリティーグループで共有するのがいいかも
* デフォルトでは、ユーザーはユーザーアクセス許可を受け取る
ユーザーにアプリの編集も許可したい場合　→　[共同所有者]チェックボックスをオンにする
* 両方のアクセス許可についてはこちら
    * 共同所有者
        * 可能 - アプリの使用・編集・共有
        * 不可能 - 所有者を削除・変更
    * ユーザー
        * 可能 - アプリの表示・使用
        * 不可能 - アプリの変更

5\. セキュリティーグループを考慮する
* アプリをセキュリティーグループと共有する場合、以下のユーザーはグループに指定されたアクセス許可を得ることができる
    * 該当グループの既存のメンバー
    * 該当グループに参加しているすべてのユーザー
* グループから離脱したユーザーは、アクセス権を持つ別のグループに属しているか、または個人としてアクセス許可を付与された場合を除き、アクセス許可を失う

* セキュリティーグループのすべてのメンバーは、アプリに対してグループ全体が持つのと同じアクセス許可を持っている。ただし、グループの1 人または複数のメンバーにより高いアクセス許可を指定することで、アクセスレベルを高めることができる。
    * 例１）
    セキュリティーグループA　→　アプリを実行するアクセス許可を付与
    セキュリティーグループB　→　共同所有者アクセス許可を付与
        * 全セキュリティーグループのメンバー　→　アプリの実行可能
        * セキュリティーグループBメンバーのみ　→　アプリの編集可能
    * 例２）
    セキュリティーグループA　→　共同所有者アクセス許可を付与
    セキュリティーグループB　→　アプリを実行するアクセス許可を付与
        * 全セキュリティーグループメンバー　→　アプリの編集可能

6\. ユーザーにメールで通知するには、招待メールを送信するチェックボックスをオンにする
* ユーザーにメールで通知することを選択した場合、
    * アプリを共有しているすべてのユーザー　→　アプリへのリンクを含んだメールを受け取る
    * アプリの共同所有者アクセス許可を付与されたすべてのユーザー　→　Power Apps Studioのアプリ編集ができるリンクも受信

7\. 共有 をクリックします。
* 共有アプリを変更して保存すると、
    * 反映された内容がアプリを共有しているユーザーに表示される
        * 機能変更によるユーザーへの影響にご注意を！
    *  重要なアップデートに関してユーザーに通知する計画を忘れなく対応すること
機能テストとは？定義／種類／事例／方法を紹介

機能テストは、ソフトウェアが事前に定義された要件に従って動作しているかどうかをQAスタッフが評価するプロセスです。この記事では機能テストの定義、種類、事例、および方法を見ていきましょう。

1. 機能テストとは？
認知症 機能テスト
機能テストはブラックボックステストの一種で、アプリケーションやシステムの機能が期待通りに動作しているかどうかを確認するために実施されます。このテストでは、テスト対象アプリケーションのユーザーインターフェース、API、データベース、クライアント/サーバー通信、セキュリティ、その他の機能をチェックします。テストは、手動または自動化ツールを使用して実行されます。

2. 機能テストの種類
最も一般的な機能テストの種類を以下で簡単に紹介します。
Read more: https://bit.ly/3vG0TTA
ブロックチェーン開発の基礎知識 ユースケース、仕組み、注意点

1. ブロックチェーン開発とは？
ブロックチェーンとは、デジタル資産のデータの暗号化されたブロックが保管されている、連鎖したりされるデジタル台帳またはデータベースで、データの時系列的な信頼できる唯一の情報源を形成します。

ブロックチェーン開発とは、ネットワーク内で取引を安全に記録し、資産を追跡する、共有され、変更できない分散型台帳技術（distributed ledger technology、略称：DLT）を作成するプロセスです。

ブロックチェーン技術の仕組みは、Googleドキュメントに例えると分かりやすいでしょう。 Googleドキュメントは、グループで共有されてもコピーや譲渡されることはなく、その代わりに単に分散されます。これにより、分散化された配布チェーンが構築され、誰もが同時にベースドキュメントにアクセスできるようになります。他の関係者からの変更を待ってロックアウトされることはありません。また、ドキュメントに対するすべての変更はリアルタイムで記録され、変更は完全に透明化されます。しかし、Googleドキュメントとは異なり、ブロックチェーン上のオリジナルのコンテンツやデータは、一度書き込まれると変更できないため、セキュリティレベルが高くなります。

もちろん、ブロックチェーンはGoogleドキュメントより複雑ですが、この例えはブロックチェーン技術の重要なアイデアを強調しているため、適切です。

ブロックチェーンの特徴をまとめると、以下のようになります。

デジタル資産はコピーや譲渡されるのではなく、単に分散されるのみ
デジタル資産は分散型であるため、複数の当事者がそれを管理し、リアルタイムでアクセスすることができる
ブロックチェーンの台帳は公開であり、すべての変更が記録されるため、完全性と信頼性が保たれる
ブロックチェーン技術は、その台帳が一般に公開され、固有のセキュリティ対策で構築されているため、ほとんどすべての業界で最有力候補となっている
2. ブロックチェーン技術の応用とユースケース
ブロックチェーン技術は現在、ゲームの革新、医療データの保護、食品サプライチェーンの透明性の提供、そしてデータや所有権の管理方法の全体的な変更するために利用されています。ここでは、ブロックチェーンのユースケースと応用の例を紹介します。

2.1. 暗号通貨におけるブロックチェーン開発
ブロックチェーンは、ビットコインのような暗号通貨の基盤を形成しています。米ドルは連邦準備理事会によって管理されています。ユーザーのデータや通貨は、この中央集権システムのもとでは、技術的に銀行や政府振り回されます。もし銀行がハッキングされれば、顧客の個人情報は危険にさらされます。銀行が破綻したり、政府が不安定な国に住んでいたりすると、通貨の価値も危うくなる可能性があります。2008年には、いくつかの破綻した銀行が、部分的に税金を使って救済されました。このような懸念から、ビットコインは最初に構想され、開発されました。

ブロックチェーン開発者
ビットコインは、ブロックチェーン技術を利用して作成、分散、取引、保管される世界で最も人気のある暗号通貨です
ブロックチェーンは、ビットコインやその他の暗号通貨を、コンピュータのネットワークに活動を広げることで、分散的に活躍させます。これにより、リスクが下がるのみならず、多くの処理手数料や取引手数料の削減につながります。

2.2. NFTゲームにおけるブロックチェーン開発
現在、中央集権モデルが大部分のオンラインゲームで採用されています。これは、すべての関連データが、ゲームの管理者が完全な権限を持つサーバーに保管されていることを示します。データベースは一事業者が所有しているため、プレイヤーは自分のアカウントや物を実際に所有していません。さらに、集中管理型サーバーには、次のような欠点があります。アカウントの不当な禁止や、開発者や管理者によるゲーム経済におけるごまかしなどです。

ブロックチェーンを利用したシステムは、分散型データベースとして機能するため、ゲーム内の履歴、デジタルオブジェクト、トークン化された資産など、様々な種類のデジタルデータの認証と保護に利用できます。それぞれのアセットは、独自の代替不可能なトークン（NFT）で表されます。アセットには、キャラクター、ゲーム内カード、スキン、装備品等が含まれます。しかし、アセットの種類にかかわらず、それらはすべて分散型ネットワークによって管理されるブロックチェーントークンにリンクされることができます。このように、各プレイヤーは自分のアカウントとデジタルアセットを完全に管理することができ、これらのアセットを常に自由に取引することができます。


Axie infinity - NFTベースのデジタルペットを繁殖、収集、取引できる人気のNFTゲームです。
2.3. ヘルスケアにおけるブロックチェーン開発
ブロックチェーンは、ヘルスケア産業において様々な形で応用され使用されています。分散型台帳技術は、患者の医療記録の安全な転送を促進し、病院、医師、薬剤師、その他治療に関わる誰もが効率的に参照できます、患者データの単一のエコシステムを構築します。このように、ブロックチェーンは、より正確な診断や個人に合わせたケアプランの作成につながる可能性があります。
Read more: https://bit.ly/3Gf0RHj
コンテナ事始め:Podman入門ハンズオンをつくってみた

# はじめに
<!-- 発端や概要を記載 -->
Podmanの記事を去年から投稿してようやく「完全に理解した」に到達した感がでてきたので、ひとまずここまでの"まとめ"を残したいと思いPodman入門のハンズオンを作成してみました。今年こそはコンテナを始めようという方の役に立てばいいなと思ってます。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Podman入門ハンズオン](#Chapter1)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Podman入門ハンズオン

https://github.com/toomorirh/podman-ws-csa

Podmanをつかってコンテナを始めるためのひとしきりのハンズオンコンテンツを作成しました。コンテナをうごかしたり、コンテナ上のアプリをさわって確認したりできます。コンテンツはReadme形式で読み進めながら必要なものをインストールしたり、コマンドを打ったりするものになっています。ローカルマシン向けに用意しているので特に課金の発生するようなものはありませんのでご安心くださいませ。

(若干作りかけのところはそのうちアップデートします。うまくいかない部分のフィードバックいただけるとたすかります。)
wslでelixir その15

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
shell serverをc#から、叩いてみた。

# 使用したコード

https://qiita.com/ohisama@github/items/2c9459a5b73afbe8440c


# 実行結果

```
>tcp0

>
pwd
/home/user/elixir/rserver


>tcp0

>
ls
README.md
_build
lib
mix.exs
rserver
test
```


以上。
cscの作法 その288

# 概要
cscの作法、調べてみた。
tcpclient使ってみた。

# サンプルコード

```



using System;
using System.Net.Sockets;
using System.Text;

class TcpClient0 {
	private const int  portNum = 5300;
	static public void Main() {
		TcpClient tcpClient = new TcpClient();
		try
		{
			tcpClient.Connect("localhost", portNum);
			NetworkStream networkStream = tcpClient.GetStream();
			if (networkStream.CanWrite && networkStream.CanRead)
			{
				String DataToSend = "";
				//while (DataToSend != "quit")
				{
					Console.WriteLine("\n> ");
					DataToSend = Console.ReadLine();
					//if (DataToSend.Length == 0) break;
					Byte[] sendBytes = Encoding.ASCII.GetBytes(DataToSend);
					networkStream.Write(sendBytes, 0, sendBytes.Length);
					byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
					int BytesRead = networkStream.Read(bytes, 0, (int) tcpClient.ReceiveBufferSize);
					string returndata = Encoding.ASCII.GetString(bytes, 0 , BytesRead);
					Console.WriteLine("{0}", returndata);
				}
				networkStream.Close();
				tcpClient.Close();
			}
			else if (!networkStream.CanRead)
			{
				Console.WriteLine("You can not write data to this stream");
				tcpClient.Close();
			}
			else if (!networkStream.CanWrite)
			{
				Console.WriteLine("You can not read data from this stream");
				tcpClient.Close();
			}
		}
		catch (SocketException)
		{
			Console.WriteLine("Sever not available!");
		}
		catch (System.IO.IOException)
		{
			Console.WriteLine("Sever not available!");
		}
		catch (Exception e)
		{
			Console.WriteLine(e.ToString());
		}
	}
}



```

以上。
CVE,CVSSとは何ぞや？の話

# Why｜なぜ調べようと思ったのか？
- 脆弱性検知ツール`Vuls（バルス）`で、上がってきた脆弱性を、纏まった時間をとって対応しよう。
- 社内の対応方針に従って検知結果をスクリーニングし、対象を絞り込んでいく。
- あれ、CVSSスコアが何パターンか出ているけど、JVNとNVDって何がどう違うんだ？？NVDスコアしか出てないのもあるぞ...

# How｜情報整理の意図
- CVE、CVSSの基本理解と関係する団体名の関係性や区別が分かるように纏める。

# What｜調べた内容
#### CVE（共通脆弱性識別子）
- サービスベンダーや製品に依存せずに脆弱性やインシデントに一元管理されたユニークなIDが付与される、のがポイント。
- CVEの管理は、米国政府の支援を受けた非営利団体の「`Mitre（マイター）`」がしている。
- CVE IDの採番・割当ては、CNA（CVE Numbering Authority）が行っている。CNAには、主要なITベンダーや、セキュリティ企業など100近い組織が登録され、CVE IDの採番を許可された組織となっている。

#### CVSS（共通脆弱性評価システム）
- 脆弱性の特性と重大性を評価するための標準化されたフレームワーク。
- 2015年～Ver.3で運用中。

#### CVSSスコア
- CVSS によって算出される、脆弱性に関する一貫性のあるスコア。
- 3つの評価基準に基づいて、3つのスコアが算出される。
    - 基本値【ベンダーが公開】：時間の経過によって変化しない
    - 現状値【ベンダーが公開】：状況の変化（ベンダの対応や攻撃に使われた実績など）によって変化する
    - 環境値【ユーザーが公開】：各組織での対象製品の利用範囲、攻撃を受けた場合の被害の大きさなどで判断する
- `NVD`、`JVN`、ベンダー（`Ubuntu`など）は、それぞれ「CVSS基本値」をスコアとして公開している。
- `NVD`やベンダーから公開されているCVSSスコアに、ユーザ環境の特性である「環境値」を加えて、全体のCVSSスコアを算出し、対応優先度を判断するのが理想。

#### NVDとJVN（脆弱性情報データベース）
- `NVD`（National Vulnerability Database）
    - アメリカ、`MITRE（マイター）`が管理。
- `JVN`（Japan Vulnerability Notes）
    - 日本、`JPCERT`と`IPA`が共同で運営。
    - NVDを一次情報とした日本語翻訳なので、どうしても情報掲載のタイムラグが発生する。
    - また、NVDから情報が公開されたとしても、CVSS値やCWE値などの情報が不足している場合は、それらの情報が補完されるまで掲載を見送る運用となっている。

#### 補足｜語源の理解
CVE：Common Vulnerabilities and Exposures
CVSS：Common Vulnerability Scoring System

- vulnerability（ヴァルネラビリティ）：脆弱性
    - 「傷つける（vulnero）ことのできる（-bilis）」がコアイメージ。
    - 英語 invulnerable（不死身の）と同じ語源。
- exposure（エクスポージャー）：表に出すこと、公開、暴露
    - 「外に置いて見えるようにすること」がコアイメージ。
- Common Vulnerability
    - and Exposures
    - Scoring System

# 参考サイト
- [CVEとCVSSスコアをざっくり知っておくなら](https://www.ncon.blog/2021/07/cve%e3%81%a8cvss%e3%82%b9%e3%82%b3%e3%82%a2%e3%82%92%e3%81%96%e3%81%a3%e3%81%8f%e3%82%8a%e7%9f%a5%e3%81%a3%e3%81%a6%e3%81%8a%e3%81%8f%e3%81%aa%e3%82%89/)
- [脆弱性に対するオープンで汎用的な評価手法 ～CVSSとは～ ](https://www.toyo.co.jp/onetech_blog/articles/detail/id=37496)
- [JVN iPedia  - よくある質問と答え（FAQ）](https://jvndb.jvn.jp/nav/jvndb_faq.html)
- [脆弱性管理のキモ第２回「脆弱性に関する情報の利用（後編）」](https://japansecuritysummit.org/2022/02/2731/)
- [vulnerable 意味と語源](https://gogen-ejd.info/vulnerable/)
- [exposure 語源とコアイメージと覚え方](https://imageeitango.com/word/exposure)
Inspectorの指定コンポーネントを最上位に移動するメニュー(MoveTop)を追加してみた

# はじめに
ゲームオブジェクトにアタッチされているコンポーネントについて、自前スクリプトコンポーネントなど見やすさの観点から Inspector の最上位に移動したいことがよくあります。
その際に、コンポーネントを右クリックしてコンテキストメニューを開き Move Up を選択してポチポチ移動するのも手間がかかるし、コンポーネントをドラッグ アンド ドロップして移動するのも上手く操作できない時があるので、一気に Inspector の最上位へコンポーネントを移動してくれるメニュー(Move Top)を追加しました。

:::note warn
注意
[Inspectorの使用 Reorder GameObject components - Unityマニュアル](https://docs.unity3d.com/ja/2021.3/Manual/InspectorOptions.html)より
- ゲームオブジェクトの Transform コンポーネントは常に最上位のコンポーネントのため、ここで言う **Inspector の最上位** とは **Transform コンポーネントの下の位置** を意味します
- Inspector のコンポーネントの順序は GetComponents で取得したコンポーネントの順序と同じであることが保証されています
:::

# 詳細
### 作業環境
- Unity 2021.3.6f1
- Unity 2020.3.20f1

### 操作手順
1. Inspector の最上位に移動したいコンポーネントを
右クリックしてコンテキストメニューを開く
1. コンテキストメニューから **Move Top** を選択する
※既に Inspector の最上位にあるコンポーネントやTransform コンポーネントは Move Top を選択出来ません
1. コンポーネントの位置が Inspector の最上位に移動していることを確認する

### 動作イメージ
Inspector の最下位にある Sample Script 1 (Script) コンポーネントを最上位に移動する動作イメージ
<img width="480" alt="UnityEditorスクショ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847630/0bba2f3c-6418-fcff-5fa5-95d9c9fe8db2.gif">

### コード
```C#:MoveTopInspectorComponent.cs
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

namespace Furyu.Framework.Editor
{
    /// <summary>
    /// インスペクタ上のコンポーネントを設定可能な最上位へ移動するEditor拡張
    /// <para>
    /// GetComponentsで取得したコンポーネントの順番とインスペクタの順番は同じ
    /// そのため移動することでGetComponentsの結果に影響を及ぼすことに注意
    /// </para>
    /// </summary>
    public class MoveTopInspectorComponent
    {
        /// <summary>
        /// インスペクタ上の設定可能な最上位へ移動する
        /// </summary>
        /// <param name="menuCommand"></param>
        [MenuItem("CONTEXT/Component/Move Top")]
        private static void MoveTop(MenuCommand menuCommand)
        {
            var component = menuCommand.context as Component;
            while (ComponentUtility.MoveComponentUp(component)) { }
        }

        /// <summary>
        /// インスペクタ上の設定可能な最上位へ移動可能か検証
        /// </summary>
        /// <param name="menuCommand"></param>
        /// <returns></returns>
        [MenuItem("CONTEXT/Component/Move Top", true)]
        private static bool ValidateMoveTop(MenuCommand menuCommand)
        {
            var component = menuCommand.context as Component;
            var components = component.GetComponents<Component>();

            // Transformコンポーネントが常に最上位(index:0)のコンポーネント
            // つまりその次の位置が設定可能な最上位(index:1)
            if (components[0] == component || components[1] == component)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    }
}
```

:::note
Editor拡張適用方法については[特殊なフォルダー名 - Unityマニュアル](https://docs.unity3d.com/ja/current/Manual/SpecialFolders.html)参照
:::

# さいごに
このEditor拡張により、コンポーネント移動の手間とストレスから解放されました。
今回は Inspector の最上位への移動でしたが、逆の実装をすれば最下位への移動も可能ですね。
PHP - mysqli prepare のエラー ( Fatal error:  Uncaught ArgumentCountError: The number of elements in the type definition string must match the number of bind variables )

# ポイント

prapare の第一引数には bind するパラメータの型を文字列で渡すこと

string 二個なら `ss`
string と integer なら `si`

というように


# コード例

巷の例に出てくる  `sss` とか ってなんだよと思いながらてきとうに指定していたらエラーが起こり続けていた

```php
<?php

$mysqli = new mysqli('localhost', 'root', '', 'example');

$stmt = $mysqli->prepare("INSERT INTO users(id, name) VALUES (?, ?)");

// $stmt->bind_param('sss', $id, $name); # エラー
$stmt->bind_param('is', $id, $name); # integer と string なので 第一引数は is

$id = 2;
$name = "ABC";

$stmt->execute();
```

# 参考

https://man.plustar.jp/php/mysqli-stmt.bind-param.html

<img width="1141" alt="image" src="https://user-images.githubusercontent.com/13635059/210698473-1d1f00cd-d96c-4c78-9f84-ad6eed157ff0.png">


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
AI開発の基礎知識 種類、開発プロセス、必要な注意事項


1. AI開発とは？AI開発のユースケース
人工知能は、コンピュータサイエンスの一分野で、通常人間の知能を必要とするタスクを実行できるスマートマシンを構築することに関するものです。

ここでは、AIの具体的な活用事例をご紹介します。

製造業におけるAI：製造業の進化は、人工知能とロボティクスの導入で見ることができます。AIの力を借りれば、故障の検出と解決が容易になります。エラーを検出するようにプログラムされ、被害を克服するための解決策が供給されます。
自動運転車：人工知能は、文字通り自動運転車産業の未来を牽引しています。これらの車にはセンサーが搭載され、車の周りで何が起こっているかを常に記録し、AIを使って適切な調整を行います。これらのセンサーは、車の速度、道路状況、歩行者の有無、他の交通状況など、ミリ秒単位で何千ものデータを取得し、AIがそのデータを解釈して適切な行動を取るのを支援します – すべて瞬時のうちに。
ai開発会社
自動運転車は、AI技術により、人間の操作なしに目的地間を移動する
スマートアシスタント：SiriにAirPodsを探すことを手伝ってもらったり、Amazon Alexaに電気をつけてもらったりしたことがあるなら、おそらく最も一般的な人工知能のひとつに接したことがあるはずです。
マーケティングチャットボット：チャットボットのようなAIを搭載したツールは、現在、中小企業でも広く利用できるようになっています。これは、売上を上げる目的で、ウェブサイトやアプリで見込み客や顧客とのやりとりを自動化するために、コンピュータ・プログラムを採用したマーケティング手法です。マーケティングチームや営業チームがオンラインであるかどうかに関わらず、マーケティング戦略にチャットボットを活用することで、企業はいつでも、どのような状況でも、顧客を適格に判断し、対応することができるようになります。
顔認証システム： 顔認証は、AIのアプリケーションの一つです。生体認証の高度な形態の1つで、データベースから画像やビデオに含まれる顔の特徴を使って、人を認識・確認することができます。行方不明者の捜索や盗難防止に活用されています。
Read More: https://bit.ly/3X9VIXZ
【CSS Tips】ある程度小要素が増えると横にスクロールするリスト

子要素が少ない時は親要素いっぱいに子要素を表示させて、増えてきたらスクロールするようにしたいなと思いCSSを書いたのでメモがてら記事にしました。

## 具体的にどんなケース？

子要素の数が1個、1個、3個可変するコンテナを想定しています。
そして、子要素が2個以下でコンテナに収まるときは2カラムで表示し、3個以上で収まらない時は横スクロールで表示します。

ただし、中の要素を数えて当てるCSSを変えるなどということはしません。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/ddd0c9a8-0345-fae0-3c4b-5e5336cabf76.png)

## CSSの書き方

まずは子要素が1つ、2つ、3つ入ったコンテナをそれぞれ用意し、それぞれのコンテナと子要素に同じクラスを指定します。

そして、コンテナに以下の指定をしておきます。

```
  display: flex;
  gap: 40px;
  overflow-x: auto;
```

次に、子要素に以下の指定をします。

```
  flex-grow: 1;
  min-width: 240px;
  max-width: calc(50% - 20px);
```

まず、`flex-grow: 1;`を指定することで、子要素はコンテナいっぱいに横幅を伸ばします。
そして、子要素の最小サイズを`min-width`で指定しておくことで数が増えるとサイズが足りずにコンテナからはみ出すようになります。
あらかじめコンテナには`overflow-x: auto;`が当たっているので、この時に横スクロールするようになります。
また、`max-width: calc(50% - 20px);`を指定しているので子要素が1つの時は1/2カラム分のサイズになります。

Codepenで作成したものはこちらです。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ExpgMVB" data-user="kabechiyo13" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kabechiyo13/pen/ExpgMVB">
  Untitled</a> by かべちよ (<a href="https://codepen.io/kabechiyo13">@kabechiyo13</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
pip requirements.txt の覚え書き

## requirements.txt とは
- pip でインスコする（した）パッケージ一覧
- 主に別の Python 環境にコードを持っていったときに、pip ライブラリをサクッと入れるために使う

## 作成方法
1. そのプロジェクトで使っている Python 環境に入る（venv等）
1. 次のコマンド打ったら完成
`pip freeze > requirements.txt`
or
`python -m pip freeze > requirements.txt`

## 適用方法
1. そのプロジェクトで使っている Python 環境に入る（venv等）
1. 次のコマンド打って待つ
`pip install -r requirements.txt`
or
`python -m pip install -r requirements.txt`

## 書き方（文法）
詳細は[公式ドキュメント](https://pip.pypa.io/en/latest/reference/requirements-file-format/?highlight=requirements)を参照  

- \# 以降はコメントになる
- パッケージの名前だけ記述すると、インストール時点の最新が降ってくる
- Python の比較演算子 ==, >= などを使ってバージョン指定できる
- Python のバージョンによって挙動変えたり、whl 降らせてインスコも出来るらしいけど余り使わないので割愛
Python備忘録(リスト)

たまにpythonで書く時に“こうしたいんだけどどう書くんだっけ”となるので, 自分が実際につまずいたことと基本事項をまとめました(随時更新します).
メモ程度の記述なので詳細はググってみてください.

今回はリストです.


# リストの操作
## リストの初期化
``` python
#リストの初期化
list0 = [1, 2, 3, 4, 5]         #基本
list1 = [0] * 10                #同じ要素を沢山
list2 = [[1, 2, 3] for i in range(3)]   #多次元
```
```
[1, 2, 3, 4, 5]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
```
## 各要素の型変換
``` python
##型変換
list = [1, 2, 3, 4]
print(type(list[0]))
list = [str(i)+"!" for i in list]   #型変換
print(list)
print(type(list[0]))
```
```
<class 'int'>
['1!', '2!', '3!', '4!']
<class 'str'>
```
## 要素の追加, 挿入, 連結, 分割
``` python
# 要素の追加, 挿入
list=[]
#追加
list.append(1)
list.append(2)
#挿入
list.insert(1, 1.5) #(添え字, 挿入データ)
```
```
[1, 2]
[1, 1.5, 2]
```
リストを連結する際は, extendメソッドもしくは'+'演算子を使う.
``` python
#リストの結合
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = [7, 8, 9]
list1.extend(list2)
list1+=list3
```
```
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
```
リストを分割(一部を抽出)する際はスライスを使う
``` python
#リストの分割
list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list1 = list[0:3]
list2 = list[3:6]
list3 = list[0:9:2]
```
```
[1, 2, 3]
[4, 5, 6]
[1, 3, 5, 7, 9]
```
## インデックスの取得
indexメソッドを使う. 
``` python
#要素のインデックスの取得
list = [9, 4, 6, 2, 3, 4]
idx1 = list.index(2) #存在しない場合はValueError
idx2 = list.index(4)  #重複した要素がある場合, 一番初めが出力
```
```
3
1
```
重複した要素が含まれるリストに対し, すべての要素のインデックスを取得する場合は組み込み関数enumurateを以下のようにして使う.
``` python
list = [9, 4, 6, 2, 3, 4]
idx = [x for x, i in enumerate(list) if i == 4]
```
```
[1, 5]
```
## 要素の削除
要素そのものを指定する場合は.remove, インデックスで指定する場合は.popを使う. 全てを消去する場合は.clearを用いる. 
``` python
#要素の削除
list = [9, 4, 6, 2, 3, 4]
list.remove(6)
list.pop(2)
list.clear()
```
```
[9, 4, 2, 3, 4]
[9, 4, 3, 4]
[]
```
## 要素のカウント
``` python
#要素のカウント
list = ['OK', 'OK', 'NG', 'OK', 'NG']
c = list.count('OK')
```
```
3
```
## ソート
sortメソッドと組み込み関数のsortedがある.
sortはリストの中身を書き換える. 降順にするの場合はreverse=Trueとする. 
``` python
#要素のソート
list = [5, 3, 8, 6, 4, 1]
list.sort()
list.sort(reverse=True)
```
```
[1, 3, 4, 5, 6, 8]
[8, 6, 5, 4, 3, 1]
```
sortedはソート済みの新しいリストを返す.
``` python
list = [5, 3, 8, 6, 4, 1]
list_s = sorted(list)
print(list)
print(list_s)
```
```
[5, 3, 8, 6, 4, 1]
[1, 3, 4, 5, 6, 8]
```
2つのリストの各要素を対応付けてソートする場合(例えば数量を表示するランキング)はzip関数を使って以下のように書く. 動作原理は https://udon.little-pear.net/python_double_sort/ を参照してください.
``` python
list_student = ['A', 'B', 'C', 'D']
list_score = [88, 76, 72, 84]
rank = list(zip(*sorted(zip(list_score, list_student), reverse=True)))
```
```
[(88, 84, 76, 72), ('A', 'D', 'B', 'C')]
```
# さいごに
リストの基本的な操作について少しまとめました. 他にもいろいろまとめていく予定ですので, よかったらそちらもご覧ください.
jenkinsのコーディング規約チェックを行うジョブが動かなくなったので対処したことまとめ

# 概要
背景として元々コーディングチェックを行うジョブにcheckstyleプラグインを使っていたが非推奨になったので、ジョブの設定画面で保存ができなくなってしまいました。
checkstyleプラグインの後継として推奨されている新しいプラグインがあったので、導入方法について記載します。  

# 導入方法
### 1, プラグインをインストール
[warning-next-generation](https://plugins.jenkins.io/warnings-ng/)というプラグインをjenkinsの管理 -> プラグインの管理からインストール

### 2, ジョブに設定
* インストールしたら適当なジョブを1つ作成し、設定画面のビルド後の処理から`Record compiler warnings and static analysis results`を選択
* 設定欄のToolで`Checkstyle`を選択

### 3, ビルド結果を確認
* ビルドが完了するとジョブの左メニューの中に`CheckStyle Warnings`という項目が出てくるのでクリックし、詳細を確認
* 規約違反をしていた場合はファイルとリンクから違反箇所の詳細を確認することができる

# ファイル名にリンクが貼られていない場合
もしリンクが貼られていない時は以下の可能性が考えられるので、確認してみてください。
シンボリックリンクを設定している場合だとシンボリックリンクは無視されてしまうので、規約違反のファイルの特定はできるがリンクから詳細を確認することはできなくなる。
その場合はカスタムworkspaceに絶対パスを指定すると解決する。
CSSのidやclassは意味のある文言にして欲しい

弊社は新規でWEBサイトを作成することがメインですが、たまに他社で作ったサイトを修正して欲しいとのご依頼をいただきます。
その際に一番苦労するのが`該当のidやclassがどこで使っているのかわかりにくいCSSの修正`です。
その他社製CSSを修正する際の愚痴や命名規則など、私が普段心がけていることを記事にします。

## idとclassは意味のある文言にする
まず`意味のある文言`とは何か。
ヘッダーに使っている`class`なのに`footer`って普通に考えてもないですよね。
これは大げさな例ですが、`誰が見ても`、`どこで使っているスタイルか`をルール化できれば、後々自分で修正するにしても分かりやすくて良いんじゃないかなと思ってます。

### ちょいちょい出くわすけど悲しくなるのでやめて欲しい
`<section class="sec01">`等のナンバリングしてるclass名やid名を付ける事。
最初にコードを書いている時は、上からとか下からとか優先順位とかで`sec01`とつけても、後々リニューアルを重ねた時に優先順位が変わったり、コードの場所が移動したりと、意味がなくなってしまうからです。
`sec01` `sec02`と連番なのかと思ったら、`sec03`がなくて`sec04`いというのもあってがっくりすることも...（多分、不要になって消したのかな）

## じゃあ「命名規則」ってどうするの？
社内で`こういう時はこう命名する`と言うルールがあるのであれば、それに従います。
従わないと、社内で自分以外の人が修正を加える時に大変なことになります。

特にルールが決まっていない場合は、まず最低限ひとつのサイトの中ではそのルールに則って命名します。
書いてる途中でコロコロ変わってたら、同じ機能なのに、class名が違うのがたくさん出てきたって事になりかねませんので、注意が必要です。
「コードはシンプルに短く」書いた方がWEBサイトの読み込み速度に影響を与えにくくなるので、出来るだけ短めにするのはお約束です。

## 命名規則の考え方
これはあくまでも私の中でのルールなので「考え方」の参考としてください。
独学で覚えたので、専門的に勉強された方だと「なんでやねん」なところがあるかと思いますので、そこはコメントなどで教えていただけると幸いです。
### 特定のコンテンツ
+ **そのセクションのコンテンツ名を英語で**
例／ある企業の情報掲載しているセクション`<section class="information">`
+ **英語だとわからなくなるから日本語をアルファベットで**
例／ある企業の情報掲載しているセクション`<section class="kigyo-jyoho">`

基本は「どこで使われているコードなのか」がid名とclass名を見ればすぐに分かる様にすることなので、特定のコンテンツに関連するセクションは、流用せず、そのコンテンツにのみ使うようにします。
HTMLで見た時も分かりやすくなるので、メンテナンス性もあがりますね。
同じ機能でもコンテンツが違う場合は
```diff_css
.infomation,
.howto {
```
と言った感じで`,`で区切ってると、コードも多くならずに手間もかかりません。

:::note warn
ここで注意したいのが、英語表記の時に、`和製英語`にするか`正しい英語`にするか。
今時は、優秀な翻訳ツールがあるので簡単に`正しい英語`にすることができるのですが、自分以外の人がメンテナンスすることを考えると、出来るだけ伝わりやすいclass名にしたい。さらに言うと、`正しい英語`にすると結構長い文になってしまってclass名としては使い勝手が悪いと言った状況になります。
そんな時は無理せず、`information`を`info`としたり、本来`お問い合わせ`は英訳すると`inquiry`だけど`contact`とか`mail`にしたりと言った配慮も必要かなと思います。
:::

### 汎用性の高いdivやsection
+ **サイトの大枠**
例／`wrap` `container` etc...
+ **コンテンツの大枠**
例／`content` `archive` etc...
+ **機能ごと（Flex）**
例／横並びにして中央揃え＝`flex-center`、横並びにして左右余白はなしで均等＝`flex-between`etc...
+ **文字の色やサイズ替え**
例／赤文字 `red`、小さい文字 `small`etc...
※`small`は昔のHTMLコードで使われていたタグですが、ここでは`class="small"`として使うことを想定しています。

パッと見て、何に使われるのか分かるので、いちいちcssファイルを開いて確認も必要ないですね。
私は`structure`として、汎用性の高いコードはひとまとめ（別ファイル）にして、サイトを構築する際にすぐに使えるようにしています。

## まとめ
私の場合は、常に**誰が見ても分かるコード**を頭において書いています。
そうすることで後々、自分がメンテナンスする時にも迷わずに修正できるので、自分の為にもなるかと思います。

毎度のことですが、私は独学で覚えたので、なんとなくの感覚でやっているところがあります。
なので言語化ももやっとした表現しか出来なかったりすることが多々あります。
特に意味も考えずにルール化している部分もあるかも。
「これちゃうで～」って箇所あればコメントでご指摘いただけると幸いです。
はじめてのREST API

# REST API概要

## APIとは①
-  Application Programming Interfaceの略
-  インターフェースとは何かをするための「道具（ツール）」
    -  例：ユーザーインターフェースはユーザーがPCを使うための道具
-  プログラミングインターフェースはプログラミングのための道具
-  APIとはアプリケーションを呼び出すためのプログラミングの道具

## APIとは②
- APIによって一から自分でプログラム（道具）を準備することなくやりたいことが実現できる
    - 例：Amazon Product Advertising API
        - 自分のブログ等にAmazonのアフィリエイトリンクを生成するためのAPI
        - ブログのソースにAPI呼び出し処理を記述することでAmazonの商品情報を取得・表示することができる


## REST APIとは
- REST は REpresentational State Transfer の略で、コンピュータ・サイエンティストの Roy Fielding によって作られた
- 彼のRESTアーキテクチャスタイルの原則に合わせたAPI
- 彼のスタイルに合わせたREST APIは特にRESTful APIと呼ばれる


## REST APIの定義
1. ステートレス性
1. 統一インターフェース
1. アドレス可読性
1. 接続性

### ステートレス性
- ステート（状態）レス（ない）＝ やり取りが１回ごとに完結する。
    - サーバはクライアントのセッション情報を保持しない。

#### ステートレスなAPIのイメージ
> :barber: いらっしゃいませ。今日はどんな感じにしますか？
> :boy: 前髪は長め、サイドと後ろはすっきりした感じでお願いします。
> :barber: ヘッドスパはどうですか？
> :boy: 前髪は長め、サイドと後ろはすっきりした感じ、ヘッドスパをお願いします。
> :barber: 以上でよろしいですか？
> :boy: 前髪は長め、サイドと後ろはすっきりした感じ、ヘッドスパをお願いします。以上です。
> :barber: かしこまりました。

#### ステートフルなAPIのイメージ
> :barber: いらっしゃいませ。今日はどんな感じにしますか？
> :boy: 前髪は長め、サイドと後ろはすっきりした感じでお願いします。
> :barber: ヘッドスパはどうですか？
> :boy: ヘッドスパもお願いします。
> :barber: 以上でよろしいですか？
> :boy: 以上です。
> :barber: かしこまりました。

#### ステートレスのメリット・デメリットは以下の通り
<table>
  <thead>
    <tr>
      <th>メリット</th> <th>デメリット</th>
    </tr>
  </thead>
  <tr>
    <td> セッション情報を保持する必要が無いためサーバー資源（メモリ、CPU等）を有効活用できる </td> <td>毎回APIの処理に必要な情報を全て詰める必要があり、トラフィックを圧迫する（結果的にレスポンスが遅くなりリスクあり）</td>
  </tr>
  <tr>
    <td> ・スケーラビリティのあるシステムになる<br>・サーバーを増やせば増やすほど、スループット（単位時間あたりの処理データ量が向上する </td> <td></td>
  </tr>
</table>

### 統一インターフェース
- あらかじめ定義・共有された方法でやり取りされる
    - HTTPリクエスト：GET/POST/PUT/DELETEなど
    - データの形式：JSON/XMLなど

### アドレス可読性
-  アドレス可能性は、全ての情報が一意なURI（識別子）を持っていて、提供する情報をURIで表現できることです。

### 接続性
-  接続性は、**やりとりされる情報にはハイパーリンクを含めることができる**、というものです。
- １つのリンクから別の情報にリンク(接続)することができて、RESTfulなシステム同士なら円滑に情報連携を行うことができます。


## 参考
- [APIとは](https://www.redhat.com/ja/topics/api/what-are-application-programming-interfaces#:~:text=API%20%E3%81%AF%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%BB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9,%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%81%A8%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%A7%E3%81%99%E3%80%82 "Red Hat")
- [REST API](https://www.redhat.com/ja/topics/api/what-is-a-rest-api "Red Hat")
- [REST APIとは？ざっくりと理解してみる【初心者向け】](https://tech.012grp.co.jp/entry/rest_api_basics "")
魅力的なツールたち　目次

[2022アドベントカレンダー](https://qiita.com/advent-calendar/2022/cloudapps)で取り上げたツールの一覧です。


1. 手帳・メモ帳
    - [Notion](https://qiita.com/spumoni/items/eb0159be6baa59f7e9b5)
    - [Obsidian](https://qiita.com/spumoni/items/c64739d8935b4528f39e)
1. 時間管理、プロジェクト管理
    - [Engross](https://qiita.com/spumoni/items/044b0be48816be6f1180)
    - [Asana](https://qiita.com/spumoni/items/2d585b8d6a02b84b6475)
1. チャットアプリ
    - [Slack](https://qiita.com/spumoni/items/f12adfc64b2905921454)
    - [Discord](https://qiita.com/spumoni/items/1fb75d79ab030c7619aa)
1. コラボレーションツール
    - [Miro](https://qiita.com/spumoni/items/b3bfb2423be42f8c3444)
    - [Gather](https://qiita.com/spumoni/items/d66f58342faeb361372a)
    - [LINE WORKS](https://qiita.com/spumoni/items/96262e91190112171d19)
    - [LINE公式アカウント](https://qiita.com/spumoni/items/d0c86c728d8ab5c29f2c)
1. ウエブ、デザイン
    - [Canva](https://qiita.com/spumoni/items/8df53d448abe6d956cb6)
    - [Figma](https://qiita.com/spumoni/items/731eadd764f32b6332c2)
    - [webflow](https://qiita.com/spumoni/items/1663bb09244d254f438c )
    - [Carrd](https://qiita.com/spumoni/items/55e98837b6d0105767b0)
    - [Typeform](https://qiita.com/spumoni/items/aeacf39330b1d8d1d171)
1. ローコード、ノーコード自動化アプリ、Webアプリ
    - [Airtable](https://qiita.com/spumoni/items/d9cfd2502afb98017893)
    - [Zapier](https://qiita.com/spumoni/items/472ac68c85fcbc1c14f0)
    - [Make(formerly Integromat)](https://qiita.com/spumoni/items/79ca808c5106c96b2f35)
    - [Softr](https://qiita.com/spumoni/items/28ccf04db9830c340cc5)
    - [Bubble](https://qiita.com/spumoni/items/76c606b2ecd011362e83)
    - [Glide](https://qiita.com/spumoni/items/dc2f35ec2abc0caa814a)
    - [Adalo](https://qiita.com/spumoni/items/d981d60009aafee941d1)
    - [IFTTT](https://qiita.com/spumoni/items/597c45973771722f34fd)
1. 動画作成
    - [Loom](https://qiita.com/spumoni/items/67907afc5be06f89ddc3)
1. ソーシャルメディア・マーケティング(SMM)
    - [Buffer](https://qiita.com/spumoni/items/3351e2d7e41886c0edf6)
1. 検索エンジン
    - [Neeva](https://qiita.com/spumoni/items/e16ad1dd3964402158fe)
1. 翻訳
    - [PCOT](https://qiita.com/spumoni/items/16ab045b7e05c9cff55a)
【condaって何ですか？②】依存関係(ディペンデンシー)って何ですか？

※[condaって何ですか？？？①](https://qiita.com/leigadget/items/d802f08dc73b8abc9359)の続きになります。先に読んでいただいたほうが流れはつかめるのかなと思います。

はいconda何ですかの2番目です。前回condaとは
あらゆる言語のパッケージ、依存関係、環境管理である。
って話をした上で、condaとpipの一番大きな違いは
pipはpythonのパッケージ管理ができるのに対しcondaはpython以外の様々な言語のパッケージが管理できるって話をしました。

んで今回なんですが、公式ドキュメントにある
あらゆる言語のパッケージ、依存関係、環境管理
の依存関係について少し調べてみたのでここに書いてきます。

---

[IT用語辞典 e-wordsさん](https://e-words.jp/w/%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82.html)曰く、依存関係とは
ある要素が別の要素の存在や完了などを前提としている関係のこと。主にソフトウェア間の関係やプロジェクト管理におけるタスク間の関係を表すのに用いられる。

ま割と言葉の意味のまんまなんですが、正直あんまりイメージがつかなかったのでもう少し調べてみましたが、
わかりやすい気がする例を出すとするなら、
fortniteをプレイしたいとしましょう。
Windowsではもちろん問題なくプレイできますが、fortniteはMacでは動作しません。
この場合、fortniteを作動させるにはwindowsが必要になります。
FortniteというソフトウェアはwindowsというOS(ソフトウェア)に依存しています。

このような関係性をソフトウェア間の依存関係というみたいです。

condaはこの依存関係を管理するために
・環境の分離
・依存関係の競合の識別
を行ってくれます。

condaによる環境管理は次回取り扱う予定ですが、例えるなら
一つのコートで二つ別のスポーツすると混乱するから別のコートにわけよ
って感じですｗ。わかりずらくてすいません。次回ちゃんと説明します。

で二つ目の依存関係の競合の識別。
まず依存関係の競合っていうのは、依存関係が成立しない、矛盾してる状態です。
さっきのfortniteの例でいうなら、どうにかしてfortniteをmacで動かそうとしてる状態です。
一応裏技みたいなのはいくつかありますが(クラウドゲーミングやwindowsエミュレータ等),通常ではできません。
そういったときにcondaは
「必要な条件そろってないよー」
と教えてくれるみたいです。
でcondaはわかる範囲で
「これが足りてないよー」とか「これがバージョン古いよ」
とかも教えてくれるみたいです。

---
以上です。なんというか、今回は例えが多かったですね。
全体的に理解しずらい部分が多かったので例えてみましたが、わかりやすくなってれば幸いです。
すでに言ってますが次回はcondaの環境管理についてふかぼって行こうと思いますのでよろしくお願いします。
また毎度のことですが、間違い等あればコメントで指摘していただけると助かります。
ではお疲れさまでした。