OmniAICreator/Qiita-1.07M huggingface dataset:
AWS認定の無料模擬試験を受けてみよう！

# AWS認定試験の無料模擬試験を受けるまで
クラスメソッドさんの記事を参考に、AWS認定試験の無料模擬試験を受けるまでの手順を
自分なりに整理してみました。

個人用のメモとして書いてる記事になるので、参考サイトと内容はほとんど変わりません。
その点はご了承ください。

では、早速手順を踏んで行ってみましょう！！

## STEP1
AWS Skill Builderでログインする。

https://explore.skillbuilder.aws/


アカウントをまだ作成してない人はクラスメソッドさんのこちらの記事を参考にアカウントを作成してくだい。


https://dev.classmethod.jp/articles/aws-skillbuilder/


## STEP2
ログインしたら、検索バーの左側に表示されているフィルターを選択し「Language」を選んだら
「その他オプションを見る」をクリックして、日本語を選択する。

![FireShot Capture 002 - 学習ダッシュボード - AWS Skill Builder - explore.skillbuilder.aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737484/cffcab6b-8879-dd6f-d7c8-d4cd6781bed6.png)

日本語を選択した後の画面
![FireShot Capture 004 - 学習ダッシュボード - AWS Skill Builder - explore.skillbuilder.aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737484/f08811da-17f4-62ea-3fb1-4f38467c0d34.png)


## STEP3
検索バーに「Practice Question」と入力して検索する。
検索を実行すると、以下画像のように認定試験の模擬試験が一覧で表示されるので、受験したい試験を選択すれば
模擬試験を開始することができます。
![FireShot Capture 005 - 学習ダッシュボード - AWS Skill Builder - explore.skillbuilder.aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737484/04ea80bb-d685-6f93-ab57-5df20f4f7e74.png)


## STEP4
受験したい模擬試験を選択したら、以下のような画面が表示されます。
「ENROLL」をクリックして次へ進みます。
![FireShot Capture 006 - AWS Skill Builder - explore.skillbuilder.aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737484/9a227aea-763b-af1f-f03a-833ce78f80b8.png)

画面が遷移し、以下のような画面が表示されるので「さぁ、学習を始めましょう」を選択します。
![FireShot Capture 007 - AWS Skill Builder - explore.skillbuilder.aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737484/5ccd5b08-286a-0ce1-c696-053d0632d242.png)

最後に、以下のような画面が表示されるので「こちらからスタート」を選択して試験を開始することができます。
![FireShot Capture 008 - AWS Skill Builder - explore.skillbuilder.aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737484/914b8bc6-39dc-7a2a-5037-129a0ead6ee0.png)

## 参考サイト

https://dev.classmethod.jp/articles/new-aws-official-practice-questions2/
BigQueryで一時テーブルを使う

BigQueryで一時テーブルが使えることを最近知りました。。

```
CREATE TEMP TABLE テーブル名
```

・一時テーブルの名前にはプロジェクトまたはデータセットを使用しない
・一時テーブルの保管には料金はかからない
・一時テーブルは最大24時間残る。クエリ履歴から参照可能
[参考。詳しく載ってます](https://cloud.google.com/bigquery/docs/multi-statement-queries?hl=ja)

例
```
CREATE TEMP TABLE tmp_table
AS
 SELECT id, date
 FROM myproject.mydataset.mytable
   :
;

SELECT
 id, date
FROM tmp_table
   :
;
```
arxivへのsubmit時の注意点

# はじめに

arxivへの原稿ファイルのsubmitが上手くいかなかったので、
引っかかった点を備忘録代わりにここに記録しておく。

# zip fileの構成
サブディレクトリで構成されるルートディレクトリをsubmitすると、コンパイルが通らない。
つまり、
```
.
├texfiles
└pictures
```
のようなファイルはarxivの仕様としてコンパイルできないそう。
ルートディレクトリに1つ以上のTeXファイルを入れてsubmitしましょう。

# junk fileに御用心
ファイルの構成を上のようにしたらコンパイル自体は通った。
しかし、原稿のメタデータを入力して後の、出力された原稿のPDFを確認する段階で、
PDFが表示されずに先に進めなくなった。

渋々コンパイル段階まで戻り、（死ぬほど長い）コンパイルlogを確認してみると、
どうやらコンパイルされないTeXファイルが悪さしている様子。
ローカル環境でコンパイルしたときのページ数がarxivでコンパイルしたときの
それと比べて少なくなっていた。

そこで、コンパイルされないTeXファイルを全て削除した上でarxivに上げたところ、
junk file周りのエラーが消え、PDFも表示され、無事submitが完了した。

junk fileに御用心。
NVIDIA CUDA Miro-Architecture and Compute Capability List

| Architecture | Release Date | Compute Capability  |                  GeForce                  |             Quadro              |                 Jetson                 |
| :----------- | :----------- | :------------------ | :---------------------------------------- | :------------------------------ | :------------------------------------- |
| Fermi        | 2010         | 2.0<br/>2.1         | GeForce 400 series<br/>GeForce 500 series | Quadro 600                      |                                        |
| Kepler       | 2012         | 3.0<br/>3.5<br/>3.7 | GeForce 600 series<br/>GeForce 700 series | Quadro K600                     |                                        |
| Maxwell      | 2014         | 5.0<br/>5.2<br/>5.3 | GeForce 900 series                        | Quadro K620                     | Jetson Nano                            |
| Pascal       | 2016         | 6.0<br/>6.1<br/>6.2 | GeForce 10 series                         | Quadro P600                     | Jetson TX2                             |
| Volta        | 2017         | 7.0<br/>7.2         | Nvidia TITAN V                            | Quadro GV100                    | Jetson Xavier NX<br/>Jetson AGX Xavier |
| Turing       | 2018         | 7.5                 | GeForce 20 series                         | NVIDIA T600<br/>Quadro RTX 4000 |                                        |
| Ampere       | 2020         | 8.0<br/>8.6<br/>8.7 | GeForce 30 series                         | NVIDIA RTX A2000                | Jetson Orin NX<br/>Jetson AGX Orin     |
| Ada Lovelace | 2022         | 8.9                 | GeForce 40 series                         | NVIDIA RTX 2000                 |                                        |
| Hopper       | 2022         | 9.0                 |                                           | H100(for Data Center)           |                                        |
| Blackwell    | 2024         | 10.x                | GeForce 50 series                         |                                 |                                        |

When you use --generate-code option, Compute Capability is expressed as 2 digit number.
CC `5.0` is `--generate-code arch=compute_50,code=sm_50`

Reference:
Full list of products and Compute Capability
https://developer.nvidia.com/cuda-gpus

Compute Capability Support
https://docs.nvidia.com/deploy/cuda-compatibility/index.html#support-hardware__table-hardware-support

Technical Specifications per Compute Capability
https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#compute-capabilities
ローカル環境でMinIOのファイルストレージを利用する

## はじめに
Amazon S3バケットにファイルアップロードする実装は存在したものの、開発用のS3バケットが用意されていなかったのでAmazon S3バケットに替わるストレージをローカルで用意することができないか調べたところ、今回紹介する`MinIO`を見つけたので設定方法を備忘録として記載します。

### MinIOとは
> MinIO は、GNU Affero General Public License v3.0 に基づいてリリースされた高性能オブジェクト ストレージです。 Amazon S3クラウドストレージサービスとAPI互換です。 MinIO を使用して、機械学習、分析、およびアプリケーション データ ワークロード用の高性能インフラストラクチャを構築します。

※ https://github.com/minio/minio の README.md より抜粋 & Google翻訳

## 実行環境
|  | バージョン |
|:-:|:-:|
|Docker Compose|2.6.1|
|Laravel|8.83.17|

## 設定
### Docker設定
[MinIO公式のDocker Image](https://hub.docker.com/r/minio/minio)を使ってMiniIOのコンテナを定義


```docker-compose.yml
  minio:
    image: minio/minio:latest
    container_name: minio
    ports:
      - "9000:9000"
      - "9002:9002"
    environment:
      - MINIO_ACCESS_KEY=minio_access_key # アクセスキー
      - MINIO_SECRET_KEY=minio_secret_key # シークレットキー
    entrypoint: sh
    command: -c "/opt/bin/minio server /data --console-address :9002;" # コンソールのポート番号を指定
    volumes:
      - minio:/data
volumes:
  minio:
```

### .envファイル設定
S3関連の定義を記載

```.env
AWS_S3_ACCESS_KEY_ID=minio
AWS_S3_SECRET_ACCESS_KEY=minio123
AWS_S3_DEFAULT_REGION=ap-northeast-1
AWS_S3_BUCKET=develop                    # バケット名
AWS_S3_URL=http://localhost:9000/develop # バックエンドからリソース取得する場合のURL
AWS_S3_ENDPOINT=http://minio:9000        # 外部（ブラウザから参照する場合など）のURL
AWS_S3_USE_PATH_STYLE_ENDPOINT=true
```

### config/filesystems.php の設定

```filesystems.php
's3' => [
    'driver' => 's3',
    'key' => env('AWS_S3_ACCESS_KEY_ID'),
    'secret' => env('AWS_S3_SECRET_ACCESS_KEY'),
    'region' => env('AWS_S3_DEFAULT_REGION'),
    'bucket' => env('AWS_S3_BUCKET'),
    'url' => env('AWS_S3_URL'),
    'endpoint' => env('AWS_S3_ENDPOINT'),
    'path' => env('AWS_S3_PATH'),
    'use_path_style_endpoint' => env('AWS_S3_USE_PATH_STYLE_ENDPOINT', false),
],
```

## minIO管理画面アクセス
dockerコンテナ起動後、 http://localhost:9002 にアクセス
ID / パスワードは`docker-compose.yml`に記載
![スクリーンショット 2022-08-02 22.04.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663462/df1cf38e-ee43-7516-1530-179c6b5b2aae.png)

何度かファイルアップロードを試して作成したバケットに保存されていることを確認
![スクリーンショット 2022-08-02 22.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663462/420e82a2-a248-35b1-c3a0-bf5a62fb835a.png)


## 参考
- [ローカルS3環境(minio)を構築する](https://qiita.com/reflet/items/3e0f07bc9d64314515c1)
- [MinIO を使ってローカルでの開発環境の外部ストレージを Amazon S3 からローカルのコンテナへ置き換える](https://www.ritolab.com/entry/232)
- [Laravel 8.x Laravel Sail](https://readouble.com/laravel/8.x/ja/sail.html)
C言語学習 - 階乗

# この記事について
・C言語の勉強を始めた。
・ソース以外に残すことに興味を持った。
・Qiitaはよく見るので、どーせならと

# 今日のソース
入力した整数の階乗を計算する。
階乗より非負整数であるため、1 ~ n について考える。
ただし、0!=1 と定義する。
負の数が入力された場合は、とりあえず、1を出力にした。
本来は入力されても、非負整数を再入力させるような処理が必要。

```c
#include <stdio.h>

int n = 0;
int factorial = 1;

int main(void)
{
	printf("入力した数字:");
	scanf("%d",&n);
	
	if(n >= 0){
		for(int i=1; i < n; i++){
    			factorial = factorial * i;
    		}
		
	}else{
        		factorial = 1;
	}
	
	printf("factorial = %d\n",factorial);
	return 0;
}
``` 

# 実行結果
入力した数字:5
factorial = 24

# やってみて思ったこと
初めてでも簡単に投稿できた。
これなら続けられそう。
Arduinoとかも載せてみようかな。

# 修正(8/3に追記)
ありがたいことに、実行結果について間違いを指摘いただけました！
間違っていた理由としては、forループの条件を間違えたことで入力回数分動作していなかったから。
``` 
修正前
		for(int i=1; i < n; i++){
    			factorial = factorial * i;
``` 

``` 
修正後
		for(int i=1; i <= n; i++){
    			factorial = factorial * i;
``` 

# 実行結果
入力した数字:5
factorial = 120

# 修正して思ったこと
指摘して頂けなかったら、修正しないままだったと思う。
恥ずかしい記事を残すことにならずに済んだので、非常にありがたいと感じた。
時たま、自分の記事を見直すようにする。
PowerAutomate: 困ったときは、JSON解析、ドキュメント、各種APIを

# 背景
Power Automate で困ったときに考えてみることを書き出しておくことで、
以下の原因となった状況を救えたらな、と

https://qiita.com/baku2san/items/1e4d016b33ae29d65728

とはいえ、やり方は色々なので、やりたいことが出来ているならまずは正解

Make it work, Make it right, make it fast ですね。

# 解決策
基本は、「やってみる」

分からないときは動かして調べる

## 動的コンテンツでそれっぽいのを取得

分からない Trigger/Action があったら、動かしてみる

で、結果が以下のように見られるので、やりたい事に使える要素を動的コンテンツから調べる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f8c7fc48-ee78-548d-9927-ac70ce9e5bcb.png)

## JSON を確認して、Property 指定で値を取得
動的コンテンツだけで諦めず、
実行結果の body の部分を JSON Viewer で見てみることで、使えそうな Property が見えてくる

以下は、VS Code での表示例。貼り付けただけで基本はフォーマットしてくれるので便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e2cfb416-ee3c-cc41-728c-e26ba0f798eb.png)

### Property 指定の方法
[JSON 直接指定](https://qiita.com/baku2san/items/fb2e7b8ac03eb3edbb5a#%E7%9B%B4%E6%8E%A5%E6%8C%87%E5%AE%9A) を参考に。


## ドキュメントを見る
ドキュメントの使い方としては・・間違いがあることを前提として、

1. Trigger/Action での
    - 動作概要を知る
    - Input Paramters を知る
    - Return Parameters を知る
1. 使えそうな Trigger/Action が無いか調べる
    - **ID が必要な場合に、その ID の取得 Action は？
    - 他の Action に必要な parameters を返す Action は？

### ドキュメントの開き方は・・

Trigger/Action の Help から飛ぶのが簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e65b563b-4a62-f74b-e954-84fe5eaa4860.png)

Learn more からではなく、こんな感じで Reference へ飛ぶパターンもある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/9c0e47cb-6105-8395-1843-6f41122e7730.png)

また、Action 自体の Reference がなく、関連ドキュメントで説明している場合もある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/3b050df9-b136-5293-dcf4-742e45eb5788.png)

### 式関数のドキュメント

式関数のドキュメントは飛びにくいので、リンクをどうぞ
検索するなら「**Power Automate 式関数**」とかで

https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference

## それでもダメな場合
Rest API で使えるものが無いかを探す。

1. [Graph API](https://docs.microsoft.com/ja-jp/graph/use-the-api) で
1. 各アプリ用の API で
    - [Share Point API](https://docs.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/sharepoint-net-server-csom-jsom-and-rest-api-index)
    - [Yammer API の例](https://qiita.com/baku2san/items/04a281ef1670232fa9fe) 
    - [Forms API の例](https://qiita.com/baku2san/items/47c8ad906e01d7e5d5b9)

会社で外部 API に繋げない場合なんかは、自宅で API Service を提供するって道も・・

# あとがき
Send an HTTP request が増えていってるけど、各アプリ用に対応されていくんですかね？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/62c7f553-81ce-73d3-5756-a5d4c2ecf4d7.png)
5分でFlaskをDockerで起動させる

# 環境
- Windows 10
- WSL2 + Docker
- Ubuntu
- Python 3

# ディレクトリ構成
```
flask
├── Dockerfile
├── docker-compose.yml
├── hello.py
```

# 各種ファイル
今回は最小構成にします。
## Dockerfile
```dockerfile
FROM python:3
ENV PTYHONUNBUFFERED 1
WORKDIR /app
RUN pip install flask
```

## docker-compose.yml
environmentでアプリケーションが動作するコントローラー的なファイルを```FLASK_APP=hello.py```に設置しないと```Error: Could not locate a Flask application. Use the 'flask --app' option, 'FLASK_APP' environment variable, or a 'wsgi.py' or 'app.py' file in the current directory.```
といったエラーが発生する。ローカルで起動するポートを3000に指定しておく。

```yml
version: '3.3'
services:
  api:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: flask
    volumes:
      - ./:/app/
    ports:
      - "3000:3000"
    command: flask run --host 0.0.0.0 --port 3000
    environment:
      - FLASK_APP=hello.py
```

## hello.py
TOPでHello World出力させるシンプルなものを用意。

```python
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

## 起動用
if __name__ == "__main__":
    app.run(debug=True)
```

# サーバ構築＋起動
## Build
```console
$ docker-compose build
Building api
Step 1/4 : FROM python:3
 ---> xxxxxxxxxxx
Step 2/4 : ENV PTYHONUNBUFFERED 1
 ---> Running in xxxxxxxxxxx
Removing intermediate container xxxxxxxxxxx
 ---> xxxxxxxxxxx
Step 3/4 : WORKDIR /app
 ---> Running in xxxxxxxxxxx
Removing intermediate container xxxxxxxxxxx
 ---> xxxxxxxxxxx
Step 4/4 : RUN pip install flask
 ---> Running in xxxxxxxxxxx
Collecting flask
省略
Successfully built xxxxxxxxxxx
Successfully tagged flask_api:latest
```

## 起動
```console
$ docker-compose up
Recreating flask ... done
Attaching to flask
flask  | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
flask  |  * Serving Flask app 'hello.py'
flask  |  * Debug mode: off
flask  |  * Running on all addresses (0.0.0.0)
flask  |    WARNING: This is a development server. Do not use it in a production deployment.
flask  |  * Running on http://127.0.0.1:3000
flask  |  * Running on http://172.19.0.2:3000 (Press CTRL+C to quit)
flask  | 172.19.0.1 - - [02/Aug/2022 13:33:55] "GET / HTTP/1.1" 200 -
```

## 確認
```
$ curl http://localhost:3000
<h1>Hello World!</h1>
```

もしくはブラウザで```http://localhost:3000```を入力

以上！！！

# テンプレートを使いたい
どうせなら、pyファイルとWebコンテンツ内容を切り離し、別個にhtmlテンプレートファイルを用意したい。
## ディレクトリ構成
```
flask
├─ templates
    └─ index.html (new!!)
├─ Dockerfile
├─ docker-compose.yml
└─ hello.py
```

### index.html
```html
<h1>Hello</h1>
```

### hello.py
```python
from flask import Flask, render_template ## render_templateを追加

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html') ## render_templateを使用

## 起動用
if __name__ == "__main__":
    app.run(debug=True)
```

以上！！！
【OracleDB】メモ

# この記事の目的
- sqlの学び直し
- PL/SQLを業務で使えるようになること

## OracleDBを使用するにあたって
OracleのDBを使いたいときはweb上でsql、PL/SQLを実行できるOracle Live SQLもしくはdockerの環境にインストールするのがおすすめです。
windows環境にoracleをインストールしましたが、認証ができない問題が発生しました。

## ストアドについて

### 日付を出力
```sql:PROCEDURE1
CREATE OR REPLACE PROCEDURE PROCEDURE1 
IS
    date_time VARCHAR2(50);
BEGIN
  SELECT SYSDATE
  INTO   date_time
  FROM DUAL;
  DBMS_OUTPUT.PUT_LINE(date_time);
END PROCEDURE1;
```
## 副問合せと結合
３つのテーブルを結合させたい場合のSQL文を考えてみた
```sql:副問合せをFROM句で使用した方法
SELECT
    DISTINCT a3.empno,
    a4.shippingday
FROM (
    SELECT
        a1.empno,
        a1.subschdno,
        a2.subscdtno,
        a2.shippingno
    FROM
        subschd a1,
        subscdt a2
    WHERE
        a1.subschdno = a2.subschdno
    ) a3,
    shippinghis a4
    WHERE a3.shippingno = a4.shippingno
    AND a4.shippingday < TO_CHAR(SYSDATE, 'YYYYMMDD')
    ORDER BY a3.empno;
```
```sql:結合を使用した方法（今回はINNER JOIN）
SELECT
    DISTINCT a1.empno,
        a3.shippingday
FROM
    subschd a1
INNER JOIN subscdt a2
ON a1.subschdno = a2.subschdno
INNER JOIN shippinghis a3
ON a2.shippingno = a3.shippingno
WHERE a3.shippingday < TO_CHAR(SYSDATE, 'YYYYMMDD')
ORDER BY a1.empno;
```
### 結果
どちらも同じ結果を取得できます。
結果の取得スピードに差がないので、どちらを使用すべきか迷います。
個人的な感想ですが、
可読性が高いのは副問合せを使った方法で楽に書けるのは結合を使用した方法かなと思いました。

## バインド変数の使い方
使ったことがなかったので、メモしておきます。
下記、ストアドは従業員テーブルから名前を取得してコンソールに出力します。
注目してほしいのは、```:nm```です。
これは```USING```で指定している文字列「Sam Smith」に置き換わります。

```sql:PROCEDURE2
CREATE OR REPLACE PROCEDURE PROCEDURE2
IS
name VARCHAR2(32767);

BEGIN
  EXECUTE IMMEDIATE 'select name from employees where name = :nm' INTO name USING 'Sam Smith';
  DBMS_OUTPUT.PUT_LINE(name);
  
END PROCEDURE2;
```

## ストアドからストアドを呼び出す方法とOUTパラメーターの使い方
PROCEDURE3からPROCEDURE1を以下のように呼び出します。
```PROCEDURE1(hogetime);```
PROCEDURE1はOUTパラメーターが設定されているので、戻り値を受け取るための変数```hogetime```を設定します。
```DBMS_OUTPUT.PUT_LINE(hogetime);```ではPROCEDURE1で設定された日付のデータを出力します。
イメージとしてはjavaでいう参照渡しに似ています。（どこで受け取ったのか迷いました。。）

```sql:PROCEDURE3
create or replace NONEDITIONABLE PROCEDURE PROCEDURE3(hoge OUT VARCHAR2)
IS
hogetime VARCHAR2(100);
BEGIN
  SELECT
    name INTO hoge
  FROM employees
  WHERE name = 'Sam Smith';

  PROCEDURE1(hogetime);
  
  DBMS_OUTPUT.PUT_LINE(hogetime);
  DBMS_OUTPUT.PUT_LINE(hoge);
    
END PROCEDURE3;
```
```sql:PROCEDURE1
create or replace NONEDITIONABLE PROCEDURE PROCEDURE1(date_time OUT VARCHAR2)
IS

BEGIN
  SELECT SYSDATE
  INTO   date_time
  FROM DUAL;
END PROCEDURE1;
```
## ストアドの実行
oracle sql developerの実行ボタンから直接ストアドを実行できますが、
今回はあえてsqlワークシートからストアドを呼び出して実行してみます。

↓こんな感じで呼べます。
ストアドから呼び出すときのコードとは違います。
```EXECUTE PROCEDURE3(:p1);```
注意すべきは戻り値を受け取る変数は```:p1```こんな感じで書く必要があります。
```sql
variable p1 VARCHAR3;
EXECUTE PROCEDURE3(:p1);
print :p1;
```
```sql:PROCEDURE3
create or replace NONEDITIONABLE PROCEDURE PROCEDURE3(hoge OUT VARCHAR2)
IS
hogetime VARCHAR2(100);
BEGIN
  SELECT
    name INTO hoge
  FROM employees
  WHERE name = 'Sam Smith';

  PROCEDURE1(hogetime);
  
  DBMS_OUTPUT.PUT_LINE(hogetime);
  DBMS_OUTPUT.PUT_LINE(hoge);
    
END PROCEDURE3;
```
## 次回
- カーソル
- ~~ストアドファンクション~~
- ~~パッケージ~~
- インデックス
よく使用するgrepオプション

個人的によく使用するオプションをメモしておきます。
以下のテストファイルを例で使用します。

```text:test.txt
abc
DEF
GhI
def
```

| オプション | 効果 | 例 | 実行結果 |
| :-- | :-- | :-- | :-- |
| -A NUM | マッチした行と、その後のNUM行数表示 | grep -A 1 "DEF" test.txt | DEF<br>GhI |
| -B NUM | マッチした行と、その前のNUM行数表示 | grep -B 1 "DEF" test.txt | abc<br>DEF |
| -C NUM | マッチした行と、その前のNUM行数表示 | grep -C 1 "DEF" test.txt | abc<br>DEF<br>GhI |
| -c | マッチした行数を表示 | grep -c "DEF" test.txt | 1 |
| -E | 正規表現を使用 | grep -E "^DE" test.txt | DEF |
| -e | or検索 | grep -e "DEF" -e "abc" text.txt | abc<br>DEF|
| -i | 大文字と小文字の区別をしない | grep -i "DEF" test.txt | DEF<br>def |
| -n | 行数を表示 | grep -n "DEF" test.txt | 2:DEF |
| -v | マッチしなかった行を表示| grep -v "DEF" test.txt | abc<br>GhI<br>def|

AND検索する際はパイプで繋げる
```bash
$ grep -i "DEF" test.txt | grep "def"
def 
```
RubyでDSLが書きやすい理由を整理する

## これは何
Rubyは「DSLが書きやすい言語」という説明がされることがあります。
なぜRubyはDSLが書きやすい、と言われるのかを僕なりにまとめてみました。
「こういう要素もあるからだよ」などあればぜひコメントや編集リクエストをいただけると嬉しいです。

## DSLの例
DSLとは直訳するとドメイン固有言語です。
簡単なイメージで言うと、「ユーザーが自由に構文に近い仕組みを実装、提供できる」ようなものです。
詳しい説明はWikipediaにお任せします。

https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%9B%BA%E6%9C%89%E8%A8%80%E8%AA%9E

RubyやRailsで使われているDSLで有名なものはActiveRecord周りの実装などでしょうか。
例を記載します。

```user.rb
class User < ApplicationRecord
  validates :name, presence: true
  has_many :articles
end
```

このような形で、RailsのActiveRecord固有の構文を使うことで、バリデーションの設定やリレーションの設定などを簡単に行うことができます。
このようなDSLをなぜRubyでは実現できるのかを整理します。

## DSLを実現するために使われているRuby特性

Rubyには他の言語では珍しい特性がいくつかあります。
それらの特性について説明します。

### 1. メソッドの呼び出し時に()を省略できる
Rubyはメソッドを呼び出すときに`()`を省略することができます。
これにより、構文の宣言のようにメソッドの呼び出しをコードとして記述することができます。

```example.rb
def hello(args)
  "Hello #{args}"
end

hello 'world' #=> 'Hello world'

```

### 2. ブロックを引数として渡せる
Rubyはメソッドに、他の言語でいうブロックを引数として定義できます。
詳しい仕組みは以下をご覧ください

https://qiita.com/k-penguin-sato/items/7f98335ef631ea5ce7ad

これにより、他の言語では構文でしか使えないことが多いブロック記法を伴うようなコードも簡単に実装が行えます

例は以下の通りです。

```example.rb
def two(&block)
  2.times do |i|
    block.call(i)
  end
end

two do |i|
  puts "This is #{i+1} times"
end
```

### 3. クラス宣言のブロック内で直接メソッドの実行ができる
Rubyでは、クラスの宣言時にクラス宣言のブロック内で直接メソッドを実行できます。
例えば以下のようなコードは問題なく動作します。

```example.rb
class Base
  class << self
    def hello(arg)
      pp "Hello #{arg}"
    end
  end
end

class Example < Base
   hello 'world'
end
#=> 'Hello world'
```

### 4. define_methodなどで、動的にメソッドの定義を行うことができる
Rubyは`define_method`や`define_singleton_method`などで動的にメソッドの宣言を行うことができます。
これにより、メソッドで受け取った値を元にクラスにメソッドの定義を行うことなどが簡単にできます。
これらの仕組みについては以下の記事を参考にしてください。

https://qiita.com/hogucc/items/6ab8c5974725970d011c

```example.rb
def define_call(&block)
  define_method :call do
    block.call
  end
end

define_call do
  pp 'Hello world'
end


call #=> 'Hello world'
```

### その他の特性
そのほかにも、DSLを作ってく上でよく使われる特性はあります。
詳しくは以下の記事をご覧ください。

- instance_eval(@kekemoto さんに教えていただきました！)
    - https://www.key-p.com/blog/staff/archives/43226

## DSLを書いてみる
整理した特性を用いて実際にDSLを書いてみます。
今回はメソッドに制限時間を設定するためのDSLを実装してみました。

```example.rb
require 'timeout'

class Timer
  class << self
    def timeout(t)
      @@time = t
    end

    def process(&block)
      define_method :call do
        puts 'start'
        Timeout.timeout(@@time) do
          block.call
        end
        puts 'success'
      rescue Timeout::Error
        puts "timeout"
      end
    end
  end
end


class Example < Timer
  timeout 1

  process do
    sleep 0.5
  end
end


Example.new.call

```

## まとめ
このように、Rubyはいくつかの特性が合わさることにより、特定のドメインに特化したDSLを簡単に実装をすることができます。
ぜひ皆さんも色々な実装を試してみてください。
あまり知られていないプリザンターの便利な機能Top3

## 概要
あまり知られていない（かもしれない）プリザンターの地味だけど便利な機能を個人的なランキング形式でご紹介します。

### 第3位：ショートカットキー
マウスでのクリック操作の代わりになるショートカットキーがあります！

https://pleasanter.org/manual/shortcut

> プリザンターのキーボード操作の支援を目的としたショートカットキーの説明です。

「Alt + s」でレコード更新するのは「Ctl + s」でExcelを上書き保存する感覚に似てますね。

### 第2位：テーマのカスタマイズ
ユーザごとにテーマの色が変更できます！

https://pleasanter.org/manual/user-management-theme

> ユーザインターフェースのテーマを設定することで、ユーザ毎に画面のカラーバリエーションを変更することができます。

パラメータ [User.json](https://pleasanter.org/manual/user-json) の「Theme」の値を設定することでサービス単位でも設定できます。
また、最近（[1.3.15.0](https://github.com/Implem/Implem.Pleasanter.NetCore/releases/tag/Pleasanter_1.3.15.0)／[1.3.16.1](https://github.com/Implem/Implem.Pleasanter.NetCore/releases/tag/Pleasanter_1.3.16.1)）のバージョンアップでアイコンやテキスト色の見やすさが改善されました。

### 第1位：ダイレクトURLのコピー
一覧画面の左上にある鎖のようなマークをクリックすると、フィルタが有効になった状態でクリップボードにコピーされます！

https://pleasanter.org/manual/locations-json

> 一覧画面の画面左上にあるパンくずリスト左横のリンクアイコンをクリックすると「フィルタ」が有効になった状態のURLがクリップボードにコピーされますので、そのパラメータ付きのURLを指定すると、フィルタが有効になった状態で表示されます。

メールやチャットで他の人にURLを共有したいときに便利ですね。

## おわりに
地味な機能も活用して、プリザンター生活がより快適になると嬉しいです！
知らなくて損したVScodeの小技

## 初めに。
どうもpython歴3か月の者です。flask(python)やhtmlでVScodeを使う機会がそこそこ多いですが、
｢もっと早くしりたかった~｣っていう小技を簡潔にシェア致します。もったいぶるほどでもない物なので。
### 環境:windows

## ①ファイル内の検索②一括置換
きっかけ：先生が教えてくれた。

### ①
1. `ctrl + F`⇒検索欄が出現。
1. 検索したい事柄を記載。　例:`submenu`　　submenuというクラスがどこにあるか探したい時。

![2022-08-02_23h55_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/7e82ce1b-683b-8348-87f1-ee539cf4dfb9.png)

#### こんな時に使おう！

webサイトを`検証`で確認してクラスやIDを特定したけれど…
実際のVSCode上でいちいち確認して探すのが面倒くさい！大変！という時に

![2022-08-02_23h59_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/771c87d6-314e-e726-74ed-c48f3c101793.png)

### ②
1. `ctrl + H` で置換タグを出現させる。
1. 置換したい単語を記載。
1. 置換する予定の単語を記載。
1. 全て置換

#### こんな時に使おう！
htmlでコーディングしている時に一括で文言を置換したいとき。

![2022-08-03_01h19_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/3dbe3796-5f9a-0d83-f094-238f457286ad.png)

## 終わりに。
大層なものではないですが小技としてそれなりに有用だと思います。
随時追加予定。

### 参照。

https://blog.kikagaku.co.jp/vscode-shortcut
LaravelとmicroCMSでのコンテンツ管理  microCMSのAPI作成編

PHPフレームワークであるLaravelと、ヘッドレスCMSであるmicroCMSで、コンテンツ管理機能を実装する手法をご紹介します。自分が実装する際にはあまり参考記事がなく苦労した部分もありましたので皆様のお役に立てれば幸いです。Laravelの実装とmicroCMSのコンテンツ管理２つに関してハンズオン形式で記述していきます。


この記事では、microCMSのコンテンツ管理に関してハンズオン形式でご説明していきます。

# microCMSでコンテンツ管理

今回はヘッドレスCMSであるmicroCMSでコンテンツ作成を行います。
ヘッドレスCMSとはHTMLやCSSは管理せず、データのみを管理するCMSになります。
データ管理の仕方はデータベースに近いイメージで、値のみを保存します。
APIを作成してエンドポイントにGETリクエストを送るとjson形式でデータが返されるので、それをLaravel側で受け取って内容を表示します。

## 1. microCMSアカウントとプロジェクトを作成

microCMSのホームページから新規アカウント登録を行います。

https://microcms.io/

アカウント登録完了後、プロジェクトを作成します。
サービス名とサービスIDを記入します。(サービスIDは誰とも被らない様に設定する必要があります)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/c77a0193-44e9-4aaa-d21f-8382529b225c.png)

## 2. API作成
コンテンツの情報を管理するためのAPIを作成しましょう。
コンテンツ(API)の右側の＋ボタンを押して、APIを作成の中から、自分で決めるを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/e53a5b9a-3e2f-5bd6-d5f1-4df34fc83b14.png)

API名を「記事」としてエンドポイントをarticlesにしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/7dd479d4-3684-bd04-f72d-b997afa1dd13.png)

次へボタンを押して、APIの型を選択でリスト形式を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/c5e812a1-c92b-6da9-2614-d951012ae245.png)

次にAPIスキーマを作成します。データベースでいうところの、カラムや型を決めていきます。
型の種類は、テキストフィールド、テキストエリア、画像、日時など色々な種類が選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/6c369ef9-3590-4e62-ecfe-078278032538.png)

フィールドを追加ボタンを押すことで複数のフィールドを追加できます。
完了ボタンを押せばAPI作成完了です。

## 3. コンテンツ作成
早速先ほど作成したAPIのコンテンツを作成していきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/b81a46f5-dee5-767c-0f22-77b4e1be3414.png)

コンテンツIDはどのコンテンツかを識別するためのIDです。デフォルトはランダムな文字列が割り当てられていますが、自分で自由に編集することができます。

先ほどスキーマで設定した、「本文」と「内容」の部分を埋めていきます。
記述し終わったら公開ボタンを押します。

記事が公開されました🎉

## 4. APIレスポンスの確認
先ほど公開したAPIのエンドポイントにGETリクエストを送ると、json形式で登録されたデータの情報が取得できます。APIプレビューをクリックして確認してみましょう。今回はLaravelを使用するため、PHPタブを選択してリクエストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/4eeb39dc-bdc9-23bd-cd1c-dbe08a736230.png)

「取得」ボタンを押すとレスポンスが確認できます。

```
{
    "id": "vr2wjz9qujy9",
    "createdAt": "2022-08-02T12:52:15.137Z",
    "updatedAt": "2022-08-02T12:52:15.137Z",
    "publishedAt": "2022-08-02T12:52:15.137Z",
    "revisedAt": "2022-08-02T12:52:15.137Z",
    "title": "LaravelとmicroCMSでコンテンツ管理",
    "detail": "<h1 id=\"hf887009373\">コンテンツ管理API</h1><p><span style=\"color:#c7243a\">microCMS</span>を使用して<strong>コンテンツ管理</strong>を行うアプリケーションを<span style=\"background-color:#fff8b6\">Laravel</span>で作成します。</p>"
}
```

microCMS側の設定は以上です。お疲れ様でした。

次回はLaravel側の設定を行なっていきます。
thisとthis()

* 生成者やメソッドの媒介変数とオブジェクト変数の名前が同じときに使用
* 同じクラス内の他の生成者を呼び出すときに使用
# this
メンバー変数に値を入れてあげたいときに使用
メンバー変数:メソッドや生成者ではなく、classにある変数
```
public class student(){
   int age;        // メンバー変数
   int score;
}
```
変数名が同じときは近い変数を指す
```
public student(int age, int score){
   age = age;
   score =score;
}
```
媒介変数のage、scoreを指すためエラー発生
```
public student(int age, int score){
   this.age = age;
   this.score =score;
}
```
thisをつけるとメンバー変数を指す

---
# this()
生成子、メソッドを指す
```
public student(int age, int score){
   age = age;
   score =score;
}

public student(){
   this(10, 90);
}
```
同じクラス内にthis()は他の生成子を呼び出す
C#マイクロ秒レベルの高精度Timer

C#にはMS側で用意されたいくつかTimerクラスがありますが、どれもミリ秒でバラつきが発生する精度です。
ミリ秒、マイクロ秒レベルで正確、かつCPU負荷を減らした高精度Timerを後述します。

## 既存Timerの精度問題
既存のTimerでは実行間隔に5~30msほどのバラつきがあります。
```
2022/08/02 12:26:36.0071
2022/08/02 12:26:37.0129
2022/08/02 12:26:38.0171
2022/08/02 12:26:39.0160
2022/08/02 12:26:40.0206
2022/08/02 12:26:41.0060
2022/08/02 12:26:42.0099
2022/08/02 12:26:43.0162
2022/08/02 12:26:44.0195
2022/08/02 12:26:45.0070
2022/08/02 12:26:46.0065
2022/08/02 12:26:47.0062
2022/08/02 12:26:48.0081
2022/08/02 12:26:49.0097
2022/08/02 12:26:50.0142
2022/08/02 12:26:51.0198
2022/08/02 12:26:52.0101
2022/08/02 12:26:53.0168
2022/08/02 12:26:54.0171
2022/08/02 12:26:55.0040
2022/08/02 12:26:56.0087
```

## 高精度Timerクラス
後述するTimerクラスでは初回のみマイクロ秒ブレますが、それ以外は正確になっています。
最小間隔は16msです。

```
2022/08/02 12:21:43.0003
2022/08/02 12:21:44.0000
2022/08/02 12:21:45.0000
2022/08/02 12:21:46.0000
2022/08/02 12:21:47.0000
2022/08/02 12:21:48.0000
2022/08/02 12:21:49.0000
2022/08/02 12:21:50.0000
2022/08/02 12:21:51.0000
2022/08/02 12:21:52.0000
2022/08/02 12:21:53.0000
2022/08/02 12:21:54.0000
2022/08/02 12:21:55.0000
2022/08/02 12:21:56.0000
2022/08/02 12:21:57.0000
2022/08/02 12:21:58.0000
2022/08/02 12:21:59.0000
2022/08/02 12:22:00.0000
2022/08/02 12:22:01.0000
2022/08/02 12:22:02.0000
2022/08/02 12:22:03.0000
2022/08/02 12:22:04.0000
```
### 実装

```C#
public class HighResolutionTimer : IDisposable
{
    private const double MIN_INTERVAL_MILLISECONDS = 16;

    public event EventHandler? Elapsed;

    private TimeSpan _interval;
    private TimeSpan Interval
    {
        get 
        {
            return _interval;
        }
        set
        {
            if (value.TotalMilliseconds < MIN_INTERVAL_MILLISECONDS)
                throw new Exception($"{MIN_INTERVAL_MILLISECONDS}ms以下を設定できません。");

            _interval = value;
        }
    }

    private volatile bool _running = false;

    public HighResolutionTimer(TimeSpan interval)
    {
        Interval = interval;
    }

    public void Start(DateTime startAt)
    {
        running = true;
        Task.Run(() =>
        {
            var nextTriggerAt = startAt;
            while (_running)
            {
                while (true)
                {
                    var rest = (nextTriggerAt - DateTime.UtcNow).TotalMilliseconds;

                    // Sleepメソッドには16msまでの精度しかないため、16msまではSleepで待機し、
                    // それ以降はSpinWaitでCPU負荷を下げる
                    if (rest > MIN_INTERVAL_MILLISECONDS)
                        Thread.Sleep((int)(rest - MIN_INTERVAL_MILLISECONDS));
                    else if (rest > 0)
                        Thread.SpinWait(50);
                    else
                        break;

                }
                Elapsed?.Invoke(this, new EventArgs());

                nextTriggerAt = nextTriggerAt.AddMilliseconds(Interval.TotalMilliseconds);
            }
        });
    }

    public void Stop()
    {
        _running = false;
    }

    public void Change(TimeSpan interval, DateTime startAt)
    {
        Stop();
        Interval = interval;
        Start(startAt);
    }

    public void Dispose()
    {
        Stop();
        Elapsed = null;
    }
}
```
Renderer.boundsの値が変更できない

今回の記事はとても短いです。

# 本題
Renderer系(SkinnedMeshRendererなど)のboundsをスクリプトから変えようとすると、

```cs
renderer.bounds = new Bounds();
//-> Property or indexer 'Renderer.bounds' cannot be assigned to -- it is read only [Assembly-CSharp]
```

```cs
renderer.bounds.extents = new Vector3();
//->Cannot modify the return value of 'Renderer.bounds' because it is not a variable [Assembly-CSharp]
```

というようなエラーが出ます。

解決策は、Renderer.boundsではなく、**Renderer.localBounds**を使います。
例えば、Rendererの範囲を(1,2,3)に変えたいなら、

```cs
Bounds bounds = renderer.localBounds;
bounds.extents = new Vector3(1, 2, 3);
renderer.localBounds = bounds;
```

とします。Transform.positionの扱いととても似ていますね。

# まとめ
いかがだったでしょうか。今回は、かなり基礎的な話だったと思いますが、ネットで調べても全く出てこなかったので記事化しました。
メッシュ周りをいじるのはVRMとかを触るときくらいでしょうか...？筆者も、VRChat用に作成したアバターを調整するプログラムを作っていたときに本記事の問題に直面しました。
今回のように基礎的な話から、コアな話までしていきます。もしお役に立てましたら、フォロー等よろしくお願いいたします。
Dockerfileを利用したSSHサーバ構築

## Dockerfileを利用したSSHサーバ構築

### Dockerfile他の準備
```
$ pwd
/home/masa/docker
$ 
$ ls -a
.   Dockerfile         containerStart.sh  test1_t1.tar
..  containerSetup.sh  init.sh            webtest_img.tar
$ 
$ cat Dockerfile 
FROM ubuntu:latest
RUN echo "now building..."
RUN apt-get update
RUN apt-get install -y openssh-server
RUN useradd -m sshcon
RUN echo sshcon:'sshssh' | /usr/sbin/chpasswd
ADD ./init.sh /root/init.sh
RUN chmod 777 /root/init.sh
RUN echo "finish"
$ 
$ cat init.sh 
#!/bin/bash
/etc/init.d/ssh start
```
### Dockerファイルを実行してイメージ作成
```
$ sudo docker image build -t taka/sshhost:1.3 .
[sudo] masa のパスワード: 
Sending build context to Docker daemon  477.2MB
Step 1/3 : FROM ubuntu
(cut)
 ---> 669d15c3f5b0
Successfully built ae850e39625c

$ docker image ls
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
taka/sshhost   1.3       669d15c3f5b0   36 minutes ago   224MB
(cut)
ubuntu         latest    27941809078c   8 weeks ago      77.8MB
```

### Docker container の作成
shを作成して実行させる
同時実行は検証中（T_T）
```
$ cat containerSetup.sh 
#!/bin/bash
docker run -it --name "taka1" -h Taka1 --net=grpA --ip=192.168.100.15 669d15c3f5b0 /bin/bash
#docker run -it --name "taka2" -h Taka2 --net=grpA --ip=192.168.100.16 669d15c3f5b0 /bin/bash
⇑未使用分はコメントアウトしておく
```

### Docker container の起動
shを作成して実行させる
```
$ cat containerStart.sh 
#!/bin/bash
docker container start taka1
docker container exec -it taka1 /root/init.sh
docker container start taka2
docker container exec -it taka2 /root/init.sh
docker container ls
```
OptunaのLightGBMTunerCVは何のパラメータを探索してくれるのか

# 当時の疑問点
__LightGBMTunerCVってどこで探索するパラメータを設定すればいいのだ？？__

ドキュメントを読んでパラメータ探索を開始するところまでできたものの、何のパラメータを探索するのかわからなかった。だが、sampleのコードを見てもそんな設定はどこにも見当たらない。

疑問を解消するためにソースコードを読んできました。
```Python
def run(self) -> None:
    """Perform the hyperparameter-tuning with given parameters."""
    verbosity = self.auto_options["verbosity"]
    if verbosity is not None:
        if verbosity > 1:
            optuna.logging.set_verbosity(optuna.logging.DEBUG)
        elif verbosity == 1:
            optuna.logging.set_verbosity(optuna.logging.INFO)
        elif verbosity == 0:
            optuna.logging.set_verbosity(optuna.logging.WARNING)
        else:
            optuna.logging.set_verbosity(optuna.logging.CRITICAL)

    # Handling aliases.
    _handling_alias_parameters(self.lgbm_params)

    # Sampling.
    self.sample_train_set()

    self.tune_feature_fraction()
    self.tune_num_leaves()
    self.tune_bagging()
    self.tune_feature_fraction_stage2()
    self.tune_regularization_factors()
    self.tune_min_data_in_leaf()
```
これが```LightGBMTunerCV```クラス（実際には親クラスの```_LightGBMTBaseTuner```）の```run```メソッドです。

これを実行するとパラメータ探索が始まります。

注目すべきは```# Sampling```から下の部分。

ここに書いてありました。

探索してくれるパラメータは以下の通りですね。
>* tune_feature_fraction(): feature_fraction
>* tune_num_leaves(): num_leaves
>* tune_bagging(): bagging_fraction
>* tune_feature_fraction_stage2(): feature_fraction（２回目）
>* tune_regularization_factors(): lambda_l1, lambda_l2
>* tune_min_data_in_leaf(): min_data_in_leaf

# なぜこのパラメータに絞っているのか
疑問点が増えました。LightGBMにおいて重要なパラメータという位置付けなのか、それとも明記しているのがこれなだけで他のパラメータ（learning_rateなど）も探索しているのか。

ソースコードの探検は続きます。。

詳しい方いましたらコメントで教えていただけると幸いです。
【Kotlin×Gradle×MyBatis×MySQL】build.gradle.ktsのmybatisGeneratorがうまく反映できない

## はじめに

4月半にアサインされた会社がKotlinをメインに使っており、「Kotlinサーバーサイドプログラミング実践開発」と言う書籍を参考にマイペースに学習中です。
今までJavaでの開発がメインだったため（とは言っても1年もしてない）、Kotlinって参考資料が少なく奮闘中です。
少しでもお役に立てればと思い、忘備録も兼ねまとめております。

## 今回の事象
MyBatisを導入したプロジェクトを作成する際に、build.gradle.ktsへ記述したmyBatisGeneratorがエラーになってしまう。（書籍の第5章 P.120あたり）

## 開発環境
・開発ツール：intelliJ
・使用言語：Kotlin
・ビルドツール：Gradle
・DB：MySQL
・O/Rマッパー：MyBatis

## 解決策
以前STSを使用して開発をした際に、必要なツールはMarketPlaceからインストールした覚えがあったので、MyBatisを使う際に必要そうなものをインストール。

ここで勝手に使える状態になっていると思っていましが、確認すると「プラグイン’com.intellij.modules.ultimate’をインストールする必要があります」との警告が表示されていました。（参考資料を確認するまで全然気づかなかった…）
![スクリーンショット 2022-08-02 19.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516225/c31eb76c-bd9b-f62a-7fa1-a138f23fe1a0.png)


そこで警告通りUltimate PasteBinをインストール。
インストール後に再起動をかけると…
![スクリーンショット 2022-08-02 19.29.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516225/4f71d1fb-05a0-e5e7-7e13-def8e2e59e37.png)

mybatisGeneratorのエラーがなくなった！！！

## さいごに
今回はbuild.gradle.ktsでmybatisGeneratorがエラーになる事象についてまとめました。
MarketPlaceでのインストールが思いついたのは、地味だけど今までの経験が少し活きたと思った瞬間でした（笑）
エラーがなくなったのでひとまず開発に入れますが、現場ではそれだけじゃダメですね…
これからもコツコツ頑張っていきたいです。

## 参考資料!
[https://sebenkyo.com/2019/09/23/post-0-27/](https://sebenkyo.com/2019/09/23/post-0-27/)
【PowerShell】未割り当てのドライブレターを探す方法

# はじめに

以前に書いた[ドライブレターを変える方法](https://qiita.com/nkojima/items/1f4c61262156a98c58e3)では、「現在割り当てられているドライブレターを、未割り当ての別のドライブレターに変える方法」を紹介しました。

今回はそれと関連して、「未割り当ての（空いている）ドライブレターをPowerShellで探す方法」をまとめてみました。
未割り当てのドライブレターを把握できれば、例えばPowerShellで「共有フォルダをドライブとして割り当てる」という時に、割り当て済みのドライブレターを指定したことによるエラーを防ぐことが出来ます。


# 作成したスクリプト

* 今回は「A～Zまでの全ドライブレター」から「割り当て済みのドライブレター」を差し引いて、「割り当て済みのドライブレター」を求める方法を採用しました。
  * 割り当て済みのドライブレターを直接的に求める方法が分からなかったので、このような実装になりました...
* 「A～Zまでの全ドライブレター」を生成する部分では、[Graceful way to create an alphabet array](https://social.technet.microsoft.com/Forums/lync/en-US/0b2a0a4f-df68-486b-8249-735f7c4fad4e/graceful-way-to-create-an-alphabet-array?forum=winserverpowershell)に掲載されているコードをほぼそのまま利用させてもらいました。

```powershell:find_assignable_letters.ps1
# A:～Z:までの全ドライブレターを作る。
$drive_letters = @()

for ([byte]$c = [char]'A'; $c -le [char]'Z'; $c++)
{  
    $drive_letters += ([char]$c + ":")
}

# 現在割り当てられているドライブレターを取得する。
$assigned_letters = Get-WmiObject Win32_LogicalDisk | % { $_.Name}

# 全ドライブレターから割り当て済みのドライブレターを差し引く
$result = Compare-Object -ReferenceObject $drive_letters -DifferenceObject $assigned_letters -PassThru | Sort-Object

# 結果を表示する
echo $result
```

# 実行した環境

* 以下の図のように、`C`、`D`、`F`、`H`のドライブレターが割り当て済み（使用されている）環境において、上記のスクリプトを実行しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/d83b262a-18ab-ce6e-0c17-06ce197381a9.png)

# 実行結果

* 割り当て済みの`C`、`D`、`F`、`H`を除いたドライブレターが抽出されました。

```text:実行結果
A:
B:
E:
G:
I:
J:
K:
L:
M:
N:
O:
P:
Q:
R:
S:
T:
U:
V:
W:
X:
Y:
Z:
```

# 参考URL

* [ドライブレターを変える方法](https://qiita.com/nkojima/items/1f4c61262156a98c58e3)
* [PowerShellで論理ドライブ情報やドライブレターの一覧を取得する方法](https://win.just4fun.biz/?PowerShell/%E8%AB%96%E7%90%86%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E6%83%85%E5%A0%B1%E3%82%84%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%83%AC%E3%82%BF%E3%83%BC%E3%81%AE%E4%B8%80%E8%A6%A7%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
* [Graceful way to create an alphabet array](https://social.technet.microsoft.com/Forums/lync/en-US/0b2a0a4f-df68-486b-8249-735f7c4fad4e/graceful-way-to-create-an-alphabet-array?forum=winserverpowershell)
* [２つの配列の集合（和集合、差集合、積集合）を取得](https://bgt-48.blogspot.com/2018/04/powershell.html#%EF%BC%92%E3%81%A4%E3%81%AE%E9%85%8D%E5%88%97%E3%81%AE%E9%9B%86%E5%90%88%EF%BC%88%E5%92%8C%E9%9B%86%E5%90%88%E3%80%81%E5%B7%AE%E9%9B%86%E5%90%88%E3%80%81%E7%A9%8D%E9%9B%86%E5%90%88%EF%BC%89%E3%82%92%E5%8F%96%E5%BE%97)
#LibreOffice #LibreOfficeCalc で #XML ファイルを開けないバグの対策

本内容を利用した場合の一切の責任を私は負いません。

# バージョン
- OS  
OS 名:                  Microsoft Windows 10 Home  
OS バージョン:          10.0.19043 N/A ビルド 19043  
システムの種類:         x64-based PC
- LibreOffice
Version: 7.1.7.2 (x64) / LibreOffice Community

メニューの「XMLソース」でXMLファイルを選択し、要素のセルを割り当ててOKボタンを押しても無反応。
どうも、XMLファイルのパスに日本語が入ってるとダメっぽい。
日本語の入っていないパスに置いたら開けた。

※追記(2022/08/04)
最新版でも再現したらしくマスターにパッチがあたったもよう。
次のリリースで直るかも(^^)
https://bugs.documentfoundation.org/show_bug.cgi?id=150247
Ubuntu22.04 VSCodeのLive Shareが起動しない問題

## 環境
- Ubuntu 22.04 LTS (WSLのUbuntuでも、Ubuntu Desktopでも検証済)
- Visual Studio Code
- Live Share Extension Pack

## 発生している問題
拡張機能からLive Share Extension Packのインストールは問題なくできるが、「Join」や「Share」などのボタンを押しても何も反応しない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529362/90e18fb6-b225-ac00-818e-6b8a1fb15fd8.png)

## 手っ取り早く解決方法
### 1.下記コマンドでlibssl1.1を取得
```shell
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb
sudo dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb
```

### 2.VS codeを再起動
完了

## Ubuntu 22.04でLive Shareが起動しない原因

Live Shareを動かすためには「libssl1.1」が必要だが、Ubuntu 22.04ではデフォルトで入っていないのが原因。
libssl1.1を手動で入れる必要がある。

http://docs.microsoft.ex1.https.443.g0.ipv6.zhuhai.gov.cn/en-us/visualstudio/liveshare/reference/linux


## 参考

https://github.com/MicrosoftDocs/live-share/issues/4646

## 余談
上記のissueでは、下記の方法でlibssl1.1をインストールしているが、筆者の環境では`impish-security`を読み込めなかったため、wgetでの方法をおすすめします。

```shell
echo "deb http://security.ubuntu.com/ubuntu impish-security main" | sudo tee /etc/apt/sources.list.d/impish-security.list
sudo apt update
sudo apt install libssl1.1
```
【ContOS7】SSHのセキュリティ設定/sshd_config

## 概要
CentOS7でSSHを使用するにあたり、最低限必要なセキュリティ設定の内容を記述します。（学習ログ）
その中でも今回は`sshd_config`の設定内容を中心に記述します。
※ローカルマシンはmacOSを使用しています。

**他記事に関して**
[【CentOS7】SSH公開鍵認証設定/鍵生成〜サーバーへの転送](https://qiita.com/MitsukiYamauchi/items/a03de5713c894834a8f1)
[【CentOS7】SSHのセキュリティ設定/firewall](https://qiita.com/MitsukiYamauchi/items/ca82dc6496bc857b5cb1)

## ssh_config設定
`sshd_config`ファイルは`/etc/ssh/`に存在しています。
### まずはバックアップとっておこう
必要ですね。
実際にさくらVPSお試しで使って勉強してましたが、一回設定ミスった時に役立ちました。
デフォルトで`/etc/ssh/sshd_config_orig`のバックアップファイルが用意されていましたが、それとは別に`etc/ssh/sshd_config_org`を用意しておきます（作成する癖をつけるためにも）
```shell
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
```

### ポート番号の変更
sshdのポート番号を22番(デフォルト)から、「49152」に変更します。
**(注)** ポート番号を指定する際は、__エフェメラルポート番号（49152～65535）__ から指定するようにしてください。
[エフェメラルポート 【ephemeral ports】 ダイナミックポート](https://e-words.jp/w/%E3%82%A8%E3%83%95%E3%82%A7%E3%83%A1%E3%83%A9%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88.html)
```shell
sudo vim /etc/ssh/sshd_config
```
vimで`sshd_config`を開いたのち、「Port」と検索すると修正箇所がヒットすると思うので、以下のように修正してください。
```ssh
# 修正前
#Port 22

# 修正後
Port 22
Port 49152
```

**(注)** 上記設定では、デフォルトのポート番号を残しています。理由として、ポート番号を変更後にfirewallの設定まで終了させないと、22番ポートでのサーバーログインができなくなってしまうからです。
そのままログアウトせずにfirewallの設定まで終わらせるという方は、ここで22番を削除してしまってもいいのですが、保険のためfirewallの設定完了後に削除するというテイで進めていきます。
firewallの設定に関する記事は以下にまとめています。
[【CentOS7】SSHのセキュリティ設定/firewall](https://qiita.com/MitsukiYamauchi/items/ca82dc6496bc857b5cb1)

### パスワードログインの禁止
「PasswordAuthentication」と検索すると修正箇所がヒットすると思うので、以下のように修正してください。
```ssh
# 修正前
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication yes

# 修正後
#PasswordAuthentication yes
PermitEmptyPasswords no　←空白パスワードの禁止
PasswordAuthentication no ←パスワードログインの禁止
```

### rootログインの禁止
「PermitRootLogin」と検索すると修正箇所がヒットすると思うので、以下のように修正してください。
```ssh
# 修正前
#PermitRootLogin yes

# 修正後
PermitRootLogin no
```

### sshd_configの構文チェック
これまでの編集が完了したら、vimを終了させます。
エスケープキーを押した後、保存して閉じてください `:wq`

vim終了後、以下のコマンドで修正後の構文に間違いがないか確認できます。
```shell
sudo sshd -t
```
特にエラーが出なければOK
もしエラーが出てしまった場合は、バックアップファイルを適用させて最初からやり直してみてください。

### 設定反映
sshd_configの編集は完了しましたが、設定の反映がまだなので、以下のコマンドを実行して設定を反映させます。
```shell
sudo systemctl restart sshd
```

以上になります。お疲れ様でした。

## 補足
[ssh_config設定>ポート番号の変更](https://qiita.com/MitsukiYamauchi/items/50ef7db5657cd74dc700#%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E5%A4%89%E6%9B%B4)　にて、デフォルトのポート番号（22）を削除した方は、ここでログアウトしてしまうと、サーバーへのログインができなくなってしまいます。
firewallの設定がまだの方は、ログアウトせずにfirewallの設定に続いてください。
[【CentOS7】SSHのセキュリティ設定/firewall](https://qiita.com/MitsukiYamauchi/items/ca82dc6496bc857b5cb1)

## 関連記事
[【CentOS7】SSH公開鍵認証設定/鍵生成〜サーバーへの転送](https://qiita.com/MitsukiYamauchi/items/a03de5713c894834a8f1)
[【CentOS7】SSHのセキュリティ設定/firewall](https://qiita.com/MitsukiYamauchi/items/ca82dc6496bc857b5cb1)
numpy 行列の積: 備忘録

# 初めに

einsumを使うため、行列の演算を整理しておく。

https://youtu.be/pkVwUVEHmfI

# 基本操作

## matrix generation

```python
import numpy as np
mat = np.array([[1,2],
                [3,4],
                [5,6]])

array([[1, 2],
       [3, 4],
       [5, 6]])
```

## inverse matrix

```python
mat = np.array([[1,2],
                [3,4],
                ])
mat_inv = np.linalg.inv(mat)

array([[-2. ,  1. ],
       [ 1.5, -0.5]])

```

## pseudo inverser matrix

```python
mat = np.array([[1,2],
                [3,4],
                ])
mat_inv2 = np.linalg.pinv(mat)

array([[-2. ,  1. ],
       [ 1.5, -0.5]])
```

## transpose

```python
mat = np.array([[1,2],
                [3,4],
                ])
mat_t = mat.T
array([[1, 3],
       [2, 4]])
```

# 積 Product

## element-wise multiplication

```python
matA = np.array([[1, 2], [3, 4]])
matB = np.array([[5, 6], [7, 8]])
print(matA)
print(matB)

[[1 2]
 [3 4]]

[[5 6]
 [7 8]]

matAB = np.multiply(matA, matB)

[[ 5 12]
 [21 32]]
```

## inner product (dot product)

```python
matA_dot_matB = np.dot(matA,matB)

[[19 22]
 [43 50]]

```

## matmul()

```python
matA_matmul_matB = np.matmul(matA, matB)

[[19, 22],
  [43, 50]]
```


## outer product (cross product)

```python
np.cross(matA, matB)
[-4, -4]
```
日商エレクトロニクスのDXソリューション

# はじめに

日商エレクトロニクス株式会社のDX事業本部 技術部長の成塚と申します。
当社のDX事業本部では、2022年8月現在5つの事業を展開しており、技術部ではそれらの事業の下支えとなるインフラ運用から、他社ソリューションとの差別化を図る為のアプリケーションの構築、データマネジメント・分析の技術最新動向を日々キャッチアップしています。
2019年から3年以上、それぞれの分野におけるエキスパートが積み上げてきた技術力は、様々なお客様やパートナーによってブラッシュアップされてきました。手前味噌ではありますがかなりのナレッジとして積み上がってきています。それらを自社で保有するだけでなく、アウトプットすることにより、新たなソリューションとの出会いや、より高いレベルのエンジニアの方々とのディスカッション等に繋がることができればと考え、ほぼほぼ週に1件程度ずつ記事をアップしていくことにしました。何かしらの記事が、お役立ち頂けると幸いです。
私からは、日商エレクトロニクスの5つのソリューションについて、ご紹介させて頂きます。

## 日商エレクトロニクスのDX5つのソリューション
　[1.データマネジメント](#1データマネジメント)
　[2.ロジスティックス](#2ロジスティックス)
　[3.インダストリ](#3インダストリ)
　[4.おべんとね！っと](#4おべんとねっと)
　[5.くるまi](#5くるまi)

## 1.データマネジメント
#### （1）ソリューションのコンセプト
データマネジメントエンジニア（取得～可視化）、データサイエンティストの育成を目的としたソリューションです。様々な企業の様々な案件を手掛けて、エンジニアのレベルアップを図っています。多くの案件を手掛けることで、多くのナレッジが蓄積されて他ソリューションのレベルアップに役立てています。
#### （2）ソリューションの主な機能
　・データ取得/加工
　・データ蓄積
　・データ可視化
　・データ分析

## 2.ロジスティックス
#### （1）ソリューションのコンセプト
物流の問題であるドライバー不足の問題を解決するソリューションです。ガスや石油など、前回配送したモノがなくなるタイミングに再度配送する業種に対して、残存量を予測して適切なタイミングでの配送、及び最適な配送ルートの提案を行なっています。
#### （2）ソリューションの主な機能
　・残存予測
　・配送効率化

## 3.インダストリ
#### （1）ソリューションのコンセプト
工場のラインにセンサーを取り付け、センサーデータからラインの生産性向上や不用品率削減等を目的としたデータ分析を行ないお客様にご提案しています。データの取得から分析までを一気通貫で対応できることが強みです。
#### （2）ソリューションの主な機能
　・コネクティビティ
　・データマネジメント

## 4.おべんとね！っと
#### （1）ソリューションのコンセプト
仕出弁当業者と弁当を食べたい人を繋ぐプラットフォームです。従来では団体（会社、学校等）単位での電話orFAX注文、現金決済しかできませんでしたが、個人毎のWEB注文、クレカ決済、給与天引ができるようになりました。
#### （2）ソリューションの主な機能
　・WEB注文機能
　・会社毎注文状況集計機能
　・クレカ決済機能
　・給与天引機能
　・（仕出弁当業者向け）受注連携

## 5.くるまi
#### （1）ソリューションのコンセプト
会社で契約する自動車保険の保険金額を抑えるべく、危険運転や業務外での利用を削減することを目的としたソリューションです。ドラレコに加速度センサー等を搭載して、異常時に人事総務担当に発報（または映像）を飛ばしたり、月次にレポートを作成することが可能です。
#### （2）ソリューションの主な機能
　・異常運転時の発報機能
　・月次報告レポート作成機能


# おわりに

上記ソリューションを支える細かい機能や技術要素については、今後DX技術部のエンジニアから毎週記事を投稿させて頂きます。DXを検討中またはこれから検討したいご担当者様や、SIベンダーの方々のご検討の一助になれば幸甚です。
Next.jsのチュートリアルを実施する。(TypeScript編)

## はじめに
Next.jsのチュートリアルを実施します。

![スクリーンショット 2022-08-02 20.00.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/37f041c2-226c-202f-9a07-92106f94e294.png)


### チュートリアル開始
```typescript:プロジェクト作成
yarn create next-app --typescript

#プロジェクト名を指定して作成
yarn create next-app プロジェクト名 --typescript
```

```
~/develop/nextjs $ ls
my-app
```

```
~/develop/nextjs/my-app $ yarn dev
yarn run v1.22.5
$ next dev
ready - started server on 0.0.0.0:3000, url: http://localhost:3000
info  - SWC minify release candidate enabled. https://nextjs.link/swcmin
event - compiled client and server successfully in 2.5s (169 modules)
```
→http:localhost:3000でアクセス。

![スクリーンショット 2022-08-02 20.06.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/95e372c5-bd41-cd6e-d5c4-bde64aece246.png)
初心者　MySQL8に挑戦する 14

# 堂々巡り

　numbersで表を作って、csv変換して、SequelAceで読み込む、は、ずいぶんと上手になった。何種類もテーブルを作って、SequelAce上でクエリをかけるのもいろいろ試した。

　だがどうしてもFlutterに繋がらない。

　いや、そうじゃない、繋がってる。

　新しいテーブルを作ることはできる。できないのは相変わらず読み出して表示すること。新たに作ったテーブルからも、元からあるテーブルからも読めない。どこにもエラー表示はない。なんの警告メッセージも出ない。表示できないのだから、編集も削除もできない。こうなると、初心者には策の講じようがない。

　ちなみに、今回、写経したのはこれ。

https://www.linkedin.com/pulse/flutter-mysql-aftab-khan/

　おもしろいなあと思うのは、これまで写経してきたいくつものコードが、ほぼ同じことをやっているのに、みんな違う。唯一絶対解、というものはないんだないと改めて思う。そして、どの方法を真似ても、MySQLに繋がりはするが、読み込んで表示できないという状況は変わらない。
　
　もちろん、ただ表示されないなら、リストビューの作り方が悪い、という考え方もできる。けれども、もしデータがなければ「予定はありません」と表示、が入っている写経では、「予定はありません」と表示される。つまり、snapshotが何も拾ってないということだろう。

　そして当然ながら、これは私のミスに違いない。firestoreからsnapshot取るのはできていたんだから、むしろそっちの復習をすべきかなあ。しかし「みんな」できてることが私だけできないというのは、ほんと嘆かわしい。

##　明日は何を試そうかなあ。

https://qiita.com/dongri727/items/066c90d7cbf2457f1951

https://qiita.com/dongri727/items/447e59179e1fa2dfed4f
基本情報（ディレクトリ）

**ディレクトリ**はファイルをグループ化して整理するものです。補助記憶装置の中はディレクトリで管理されています。
ハードディスクなど補助記憶装置はたくさんのファイルを保存しておくことができます。

## ルートディレクトリとサブディレクトリ
ディレクトリには、ファイルだけじゃなく、他のディレクトリも入れることができます。
そうすることで、補助記憶装置全体に階層構造（ツリー構造）を持たせて管理することができます。

```
ディレクトリ-------- hoge.jpg
       |
       --------- fuga.jpg
```
ディレクトリの中にディレクトリがある場合があります。
そのディレクトリを**サブディレクトリ**といいます。
```
旅行写真-------- 伊豆旅行 ------ 伊豆.jpg
      |
      --------- 札幌旅行 ------ 札幌.jpg
```
階層構造の一番上位に位置するディレクトリは**ルートディレクトリ**と呼びます。
「/」もしくは「¥」という記号を使って表します。

## カレントディレクトリ
ディレクトリを開いて確認できる範囲は、そのディレクトリに含むファイルとサブディレクトリの一覧です。サブディレクトリの中に何があるかは、さらにそのディレクトリを開いてみなければ分かりません。

今自分が開いて作業しているディレクトリのことを**カレントディレクトリ**と言います。カレントには「現在の」という意味があります。
カレントディレクトリを含む１階層上のディレクトリのことは**親ディレクトリ**と呼びます。

## ファイルの場所を示す方法
「ファイルまでの場所を指し示す経路」のことを **パス**と言います。
パスには、ルートディレクトリからの経路を書き記す**絶対パス**と、カレントディレクトリからの経路を書き記す**相対パス**という2種類の書き表し方があります。

## 絶対パスの表記方法
パスを表記する方法は次の約束事に従います。
* ルートディレクトリは「/」または「¥」で表す。
* ディレクトリと次の階層との間は「/」または「¥」で区切る。
* カレントディレクトリは「.」で表す（絶対パス表記の場合は関係がない）
* 親ディレクトリは「..」で表す（絶対パス表記の場合は関係がない）

```
/ --------- DIR-A2 ------- FILE-B2
           |
            DIR-A1 ------- FILE-A1
```
FILE-A1の絶対パスは/（ルートディレクトリ）DIR-A1/（階層の区切り）FILE-A1となりますね。

## 相対パスの表記方法
相対パスの表記方法も約束事があります。
* ルートディレクトリは「/」または「¥」で表す。（相対パスの場合は関係がない）
* ディレクトリと次の階層との間は「/」または「¥」で区切る。
* カレントディレクトリは「.」で表す（絶対パス表記の場合は関係がない）
* 親ディレクトリは「..」で表す（絶対パス表記の場合は関係がない）

相対パスで表記する場合は「自分が今どのディレクトリにいるか」が基準となります。そのため目的のファイルに至るまでの経路は、自分がいる位置からの道順を書き記します。

「.」と書けば自分の今いるディレクトリを指します。
「..」と書いたら自分の親ディレクトリを指します。
ディレクトリやファイルの名前が単に書かれただけの場合は自分のすぐ下にあるサブディレクトリやファイルを指します。

例えば
```
/ ------- DIR-A1(現在地) ------- DIR-B1 ------- FILE-A（GOAL)
         |
          DIR-A2 ------- FILE-B
```
FILE-Aの経路は下記のようになります。
./DIR-B1/FILE-A

上記の相対パスとなります。

他の例です。
```
/ ------- DIR-A1(現在地) ------- DIR-B1 ------- FILE-A
         |
          DIR-A2 ------- FILE-B（GOAL)
```
./../DIR-A2/FILE-Bとなります。

## まとめ
絶対パスはルートディレクトリから目的のファイルに至る経路
相対パスは現在の自分がどのディレクトリにいるか

で変わりますね。当たり前ですが、ちゃんと説明できるかは重要ですね。