OmniAICreator/Qiita-1.07M huggingface dataset:
Power Shellでちょっとした罠にハマったこと

# はじめに
先日、初めてPower Shellを使ってファイルのバックアップ処理を作る機会があったのですが、
そのときにハマってしまった罠、解決策についてまとめておきたいと思います。

# 使用したツール

 * Power Shell
 * Visual Studio Code

# Power Shellを使ったきっかけ
Windows ServerでネットワークポリシーサーバのNPSテンプレートを
定期的にエクスポート、バックアップを取るためにどう自動化するか…
というところから始まりました。

調べてみると、Power Shellでエクスポートすることが可能ということが
わかったので、Power Shellで処理を作成することにしました。

```NPS_Export.ps1
Export-NpsConfiguration -Path c:\config.xml
```

# 罠にハマるまでの作成手順
Power Shellを作成した際の手順を記載します。

 1. Power Shellを起動
 1. NPSのエクスポートコマンドを直接入力して動作確認
 1. Visual Studio Codeでps1ファイルを作成(メインの処理＋ログ出力処理など)
 1. Visual Studio Codeで作成したコードをコピーし、Power Shellにペーストして動作確認
 1. ps1ファイルを実行

1.～4.までTry and Errorを繰り返して作りたい処理を作成、動作確認まで完了しました。

しかし、5.のps1ファイルで実行すると実行は終わったように見えるのに、
処理後の確認をしてみると全く動いた形跡がない。

NPSのエクスポートファイルは作成されていないし、
ログ出力もされていない…
何より、動いていないならエラーが出てもよいはずなのにエラーも出ない…

# 原因
"Power Shell 動かない"、"Power Shell  実行できない"といったワードで検索すると、
一番ヒットするのは、ps1を実行する際に必要なポリシーの設定でした。

``` execute.ps1
powershell -ExecutionPolicy Unrestricted .\hogepiyo.ps1
```

でも、上記はできているのでそれでも動かないのは謎でした。
さらに調べていくと、やっと原因がわかりました。

Visual Studio Codeでps1作成していた時の文字コードが、

「UTF-8」

だったことが原因でした。

実は、Power Shellのコードを書くことに必死になっていて
コード内のコメントを普通に日本語で書いていました。
(作成途中でコードをコピーして実行したときには
日本語のコメントも問題なく読み込み、動作していたので
問題ないんだなと無意識にそのまま進めてしまいました。)

# 解決策
コメントは1バイト文字で書くのが常識と言われたらそれまでですが、
Power Shell内で2バイト文字の名前が付いたファイルを扱う
ケースもあるかもしれません。
そんなときに2バイト文字が使えないのは困ります。
その場合の解決策は、文字コードを以下に切り替えることです。

 * SHIFT-JIS(CP932)→OSのロケール設定に依存するので、日本語環境であれば〇
 * UTF-8 BOM付
 * UTF-16 BOM付

# さいごに
2バイト文字は使用しないほうが良いとわかってはいましたが、
コードをPower Shellにコピーして実行したときは
普通に実行できていたのでps1ファイルで動作させても
同じ挙動をしてくれると思い込んでいました。
ps1ファイルでの動作確認をしたことで
今回この問題にぶち当たりました。
同じような壁に当たった方の参考になれば幸いです。
【Github】ローカルリポジトリからリモートリポジトリへ初回コミット＆プッシュ


毎度githubの初回コミットでブランチをmasterと間違えたりと手間取るので自分用に備忘録。

空のコミットを行う
```
git init

git commit --allow-empty -m "first empty commit"

git remote add origin {url}

git push -u origin main
```

初期ファイルのコミットを行う
```
git add --all

git commit -m "first commit"

git push -u origin main
```
Kotlin KoansでKotlin入門　第５回：String templates

# はじめに
公式の問題集[「Kotlin Koans」](https://play.kotlinlang.org/koans/overview)を解きながらKotlinを学習します。

過去記事はこちら
- [第０回：Kotlin Koansについて](https://qiita.com/kosuke1/items/41d192af63485bfc8cb8)
- [第１回：Simple Functions](https://qiita.com/kosuke1/items/5862a3ece96082a62e67)
- [第２回：Named arguments](https://qiita.com/kosuke1/items/2af11262852ee41b5da7)
- [第３回：Default arguments](https://qiita.com/kosuke1/items/16cb8ac780df58dc8054)
- [第４回：Triple-quoted strings](https://qiita.com/kosuke1/items/52cfeed2c49b0252d40e)

# 問題
[String templates](https://play.kotlinlang.org/koans/Introduction/String%20templates/Task.kt)

month変数を使って、13 JUN 1992（数字2桁、スペース1桁、月の略語、スペース1桁、数字4桁）のフォーマットで日付と一致するように、以下のコードを書き直します。

```Kotlin
val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"

fun getPattern(): String = TODO()
```
そのまま実行するとテストが失敗します。
```
Error: match1: An operation is not implemented.
Error: match: An operation is not implemented.
Error: doNotMatch: An operation is not implemented.
```

# 問題のポイント
トリプルクォートで囲まれた文字列は、バックスラッシュをバックスラッシュでエスケープする必要がないため、複数行の文字列だけでなく、正規表現のパターンを作成する際にも便利です。
次のパターンは、13.06.1992（数字2桁.数字2桁.数字4桁）という書式の日付にマッチします。

```Kotlin
fun getPattern() = """\d{2}\.\d{2}\.\d{4}"""
```


# 解答例
トリプルクォートを使うとエスケープする必要がないため、見た目がすっきり書けますね。
```Kotlin
val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"

fun getPattern(): String = """\d{2} $month \d{4}"""
```


ダブルクォートを使うとこのようになります。
```Kotlin
val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"

fun getPattern(): String = "\\d{2} $month \\d{4}"
```
macのPHPのバージョンを8.1にアップデートする

# PHPを8.1にバージョンアップしたい
先月Laravel9がリリースされ、PHPのバージョンが8.0以上必要になりました。
ついでに8.1からはEnum型なども導入され、いろいろ変化してるみたいですね。
macOSにはもともとphpが入っていますが、手元の環境では7系だったのでHomebrewを用いてインストールしたいと思います。

## バージョン確認

デフォルトではv7.3が入っていました。
```sh
% php -v
WARNING: PHP is not recommended
PHP is included in macOS for compatibility with legacy software.
Future versions of macOS will not include PHP.
PHP 7.3.24-(to be removed in future macOS) (cli) (built: Jun 17 2021 21:41:15) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.24, Copyright (c) 1998-2018 Zend Technologies
```

## インストール
Homebrewの導入は割愛します。

### 1. パッケージの確認
brew searchでPHP v8.1があるかを検索します。ありますね。
```sh
% brew search php@8.1
==> Formulae
php@8.1
```

### 2. インストール
brew installでインストールします。そこそこ時間がかかります。
```sh
% brew install php@8.1 
```

インストールされているか確認。
```sh
% ls /usr/local/opt | grep php 
php
php@8.1
```

### 3. パスを通す
zshrcにパスを通します。.zshrcを編集しましょう。
```sh
vi ~/.zshrc
```

.zshrcに下記を追記します。
```text
export PATH=$PATH:/usr/local/opt/php@8.i/bin:/usr/local/opt/php@8.i/sbin
```

設定を反映させます。
```
source ~/.zshrc
```

バージョンを確認し、8.1に上がっていることを確認します。
```sh
% php -v         
PHP 8.1.3 (cli) (built: Mar  1 2022 10:23:25) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.3, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.3, Copyright (c), by Zend Technologies
```

以上。
gitの初期化コマンド(初学者)

![git1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/72b7ea82-91ad-fb8a-127b-823e8558987c.png)
まずは、GitHubに登録してアカウントを取得します。マニュアルに従って`New repository`を`Create repository`で作成してセットアップ画面でHTTPSから始まる文字列をコピーしてターミナルに以下のコマンドを入れて貼り付け実行。
![git2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/77e3a8f5-2be4-8c1a-870a-4f1d0fc71911.png)
![git3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/ce767d03-f068-c297-7952-049782a73d5c.png)
![git4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/d5337906-9b5a-db2d-3b25-0a8b314e27b9.png)

```terminal
git clone https://github.com/user_name/hoge.git
```
入力しましたがリポジトリが空なので持ってくるものが何も無いエラー表示。

```
Cloning into ‘hoge’...
warning: You appear to have cloned an empty repository.
```
すかさず

```
git ststus
```
で状況を把握するも、

```
fatal: not a git repository (or any of the parent directories): .git
```
ディレクトリが違うようなことを言ってくる始末。。。こんな時に使うコマンドが

```
git init
```
です。

```
Initialized empty Git repository in /Users/name/Desktop/hoge/.git/
```
空のリポジトリが無事初期化されました。
モジュールのre-exportの効率的なやり方

Haskellにおいて、複数のモジュールからあるモジュールにシンボルをimportして、それらをまとめてexportする場合、"import as"形式を使うとよさそう。

```haskell
module Reexporter
    ( module X
    , alpha
    ) where

import Mod1  as X (x, y)
import Mod2  as X (a, b)

alpha :: String
alpha = "hoge"
```

上記のように、re-exportしたいモジュール(Mod1, Mod2)を同じ名前"X"でimport asして、export listには"module X"と書く。上記の例なら`Mod1.x`, `Mod1.y`, `Mod2.a`, `Mod2.b`をre-exportできる。

また、必要ならReexporter module自身にシンボル(上記の例では"alpha")を定義してexportもできる。これは通常のexport listの書き方と同様。

Reexporter module自身で定義したシンボルを**全て**exportしたい場合はどうするか？ 個人的にはあまりそういうことをしないが、以下のようにexport listを書けばいいようだ。

```haskell
module Reexporter
    ( module X
    , module Reexporter
    ) where
```

Reexporterというモジュール名を2回書かないといけないあたりがちょっとイケてないかなあ。
Hex mapの距離空間

# やったこと
ストラテジーゲームとかで採用されるヘクスマップ（六角形を敷き詰めたやつ）における「距離」を考えてみました。

# ヘクスマップにおける「円」
簡単のために、まず原点中心半径1の円を書くことを考えます。
ヘクスマップにおける「円」は正六角形になります。

ここで、[チェビシェフ距離](https://ja.wikipedia.org/wiki/%E3%83%81%E3%82%A7%E3%83%93%E3%82%B7%E3%82%A7%E3%83%95%E8%B7%9D%E9%9B%A2)や[マンハッタン距離](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%B3%E3%83%8F%E3%83%83%E3%82%BF%E3%83%B3%E8%B7%9D%E9%9B%A2)では「円」が正方形になることを利用します。
下図は適当にGrapherで書いた、チェビシェフ距離とマンハッタン距離での半径1の円。斜めになってる方がマンハッタン。
![hexdistance.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565602/9cae2855-f537-1e8b-fb36-05c63eec5050.jpeg)


というわけでこれを活用して、$120^{\circ}$で交わる斜交座標系で、以下のように第一・第三象限ではチェビシェフ距離、第二・第四象限ではマンハッタン距離を取るようにすれば良い。
![hex距離.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565602/dc1345b6-f9f3-0a98-9710-a627bce8de73.png)

式にするとこんな感じ。
```math
1 = 
\begin{cases}
\max(|\ x'|,|\ y'|) & (x'y' \geq 0) \\
|\ x'|+|\ y'| & (x'y' < 0)
\end{cases}
```

斜交座標だと使いにくいので、直交座標との変換式も載せておく。（「'」が付いてないのが直交座標、付いてるのが120度斜交座標）
```math
\begin{align}
x' &= x+\frac{y}{\sqrt{3}} \\
y' &= \frac{2y}{\sqrt{3}}
\end{align}
```
これをgrapherに突っ込んでみると...
![hexdistance.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565602/29c44f4c-d5e5-e64e-a0ef-34fbea9e06db.jpeg)
いい感じに正六角形の円が描けた。

# へクスマップにおける距離
ここまではあくまで原点からの距離を考えていたので、最後に二点間の距離に一般化するとこんな感じ。（120度斜交座標）
```math
d((x'_1,y'_1),(x'_2,y'_2)) = 
\begin{cases}
\max(|\ x'_1 - x'_2|,|\ y'_1 - y'_2|) & ((x'_1-x'_2)(y'_1-y'_2) \geq 0) \\
|\ x'_1 - x'_2|+|\ y'_1 - y'_2| & ((x'_1-x'_2)(y'_1-y'_2) < 0)
\end{cases}
```

ちなみに、
```math
\begin{align}
d(x,y) &\geq 0 \\
d(x,y) &= 0\   \textrm{if and only if}\ (x=y) \\
d(x,y) &= d(y,x) \\
d(x,z) &\leq d(x,y) + d(y,z)
\end{align}
```
という距離関数の定義を満たす**気がする**ので、厳密性ガチ勢の方でもたぶん安心です。

# で？
特にこれといった応用は思いついていません。

ボロノイ図を使ったゲームみたいなものを作っている最中に、マンハッタン距離ともユークリッド距離とも違う面白い距離関数はないかと、気まぐれにこの距離を考えてみたのですが、そのゲームについてはまたの機会に。

ちなみに、マンハッタン距離、チェビシェフ距離、ユークリッド距離、今回作った距離（Hex距離とでも言いましょうか）における、原点中心半径1の円を並べて描くとこんな感じ。
![hexdistance.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565602/88c9cf6b-a86e-ec6e-d95f-f060436091c3.jpeg)
Hex距離はマンハッタン距離とユークリッド距離の間くらいの性質を持っていそうなので、この性質を使った応用が何かあるかもしれません。

何かいいアイデアがあったら教えてください。
ubuntuでboot usb 作成

イメージはここからダウンロード

https://releases.ubuntu.com/jammy/

boot usb作成の流れは`フォーマット`->`書き込み`

フォーマットは`disk`アプリからできる

書き込みはubuntu os boot usb作成の場合はデフォルトの`ブータブルUSBの作成`から

windows os boot usb作成の場合は`woeusbgui`をインストールして使用

# ubuntu 用boot usb の作成

https://qiita.com/masahiros/items/5115365e952b962df41f

https://qiita.com/K-Kachi/items/3e461b10846eee6539cd

http://it.english-and-paso.com/ubuntu-bootable-usb/#:~:text=Ubuntu%20Linux%E3%81%AE%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%94%BB%E9%9D%A2,%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AE%E3%81%A7%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%80%82

# usb復旧
usb容量が小さいとかのバグ時
SD Card formater をしよう


# windows os boot usb の作成

`woeusbgui`のインストール

```
sudo apt update
sudo apt upgrade
sudo add-apt-repository ppa:tomtomtom/woeusb -y
sudo apt update
sudo apt install woeusb woeusb-frontend-wxgtk -y
```

https://take6shin-tech-diary.com/ubuntu_win10/
3d vision 資料

# ロボットのための３次元物体認識研究の現状と展望
 中京⼤学 ⼯学部
橋本 学

http://isl.sist.chukyo-u.ac.jp/wp-content/uploads/2019/05/RSJ-119thSeminar-slides.pdf

# shot特徴量で物体認識

https://qiita.com/hakuturu583/items/3e82acb083779f388640

# オクルージョンのある物体認識　解説

特徴量マッチングで認識する

https://www.google.co.jp/amp/s/slidesplayer.net/amp/16201704/

# クラスタリング
## ユークリッドクラスタリング
- pcl ros で試す　https://lilaboc.work/archives/20136695.html

- 3d lidar 遠くの点群が疎になるので、遠くの点群のユークリッドトレランスを距離で変える　https://lilaboc.work/archives/20178032.html

- 法線群のクラスタリング

https://lilaboc.work/archives/20163899.html


- 岩石点群クラスタリング

http://www.kameda-lab.org/research/publication/2018/201803_IPSJ/201803_IPSJ_ZhaW.pdf

# ROS関係

python点群処理

https://qiita.com/np_hsgw/items/d45ad46286abb7ac2e5c

実行時以下のようなエラーがでた.

```
Traceback (most recent call last):
  File "cropper.py", line 10, in <module>
    import tf2_sensor_msgs.tf2_sensor_msgs
ModuleNotFoundError: No module named 'tf2_sensor_msgs'
```

解決方法  https://answers.ros.org/question/12890/transforming-pointcloud2/

```
sudo apt install ros-noetic-tf2-sensor-msgs
```

# 論文

- RANSAM for Industrial Bin-Picking (2010)

RANSAMアルゴリズムがばら積みピッキング作業で非常に有効であることが,検証された。
Unityのマテリアルにマゼンタを使うな

# はじめに
Unityでのマテリアル解説記事だったりシェーダー解説記事でエラーが起きてないのにわざとマゼンタを使ってることをちょくちょく見かけるので何が悪いのか書きます。

もしもマゼンタを意図的に使うことが文化ならばこの記事は読まなくてもいいです。

シェーダー関係は勉強し始めてまだ1年なのでそういった文化を知らないだけかもしれないです。

# マゼンタの何がダメなのか
Unityのマテリアルでマゼンタ色はエラーを表しています。
なのでエラーの色でオブジェクトが塗りつぶされているとエラーなのか正常なのかわからないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608797/33fc6180-ed44-9a68-40a8-d42baf48865e.png)
色をマゼンタに設定してるだけでエラーは何ひとつないです。

ですがたまにこんな人がいます。
* __マゼンタ目立つし分かりやすくていいじゃん__

『目立つし分かりやすくていいじゃん』了解です。
C#で実践してみましょうか。
``` C#
using UnityEngine;
public class EnemyHP : MonoBehaviour
{
    void Update()
    {
        Debug.LogError("敵のHP" + 5);
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608797/2ed5f4de-3f2e-20db-18e1-618ca0f600f9.png)
Debug.LogError()を使って分かりやすく敵のHPを見ます。
画面左下に赤く注意マークが出ててコンソール画面を見なくても敵のHPがわかります。
便利ですね！！！

### 目立たせたかったの理由一つでこれを許せますか？
エラーじゃないのにエラーが出て、直そうと思ったらただのログ表示だった。
嫌ですよね。Debug.Log()でいいじゃないかと

ならマテリアルでも同じです。

# よくある例と解決策
* マテリアルの色の変更
* 機能紹介
* モック開発


## マテリアルの色の変更
ここをクリックして色を選べば好きな色にできますよ
と書いてマゼンタ色を選ぶ記事

好きな色にできるなら赤や青でいいです。
わざわざマゼンタを選択する理由はないです。

マゼンタを選択してもいいのは
__もし開発中にこの色(マゼンタ)になったらエラーが出てるということです。気を付けましょう。__
とエラーを紹介するときです。

## 機能紹介
マテリアルのパラメーターを紹介する時、元の色をマゼンタにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608797/1cf32d05-ab32-5b78-fa2c-40f7cbba7b00.png)
ノーマルマップの紹介ですがAlbedoの色をわざわざマゼンタにする必要はないです。
ここは普通に白色でいいです。

__ノーマルマップを紹介する目的は達成してるからマゼンタのままでもよくない？__

ノーマルマップの機能は正常だけれどほかの場所でエラーが起きてるのかもしれない
となるので止めた方がいいです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">そうはならんやろｗｗ <a href="https://t.co/T6R6z562hH">pic.twitter.com/T6R6z562hH</a></p>&mdash; あやは401【シェーダー開発中】 (@ayaha__401) <a href="https://twitter.com/ayaha__401/status/1460176597831405570?ref_src=twsrc%5Etfw">November 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

このように部分的にマゼンタになることがあるので止めておきましょう。
複数Passを使えばこのエラーを恐らく実現できます。

ノーマルマップとは変わりますがAlbedoがマゼンタの物体に緑色の光が照らされたら何色になるのかパッと思いつきますか？
マゼンタに対して何か機能が加わった場合に変化を直感的にイメージすることが困難なのでやめたほうがいいと思います。

## モック開発
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608797/f28a1e78-56c3-7531-01b7-63d0b13ae2b8.png)
3Dピンボールゲームのモックアップ作成で四方の壁をマゼンタにしました。

これの悪い点は
* モック段階で壁のテクスチャを決めてないから分かりやすくマゼンタにしてる
* 壁のマテリアルでエラーが起きてる

のどちらなのかわからないです。

### 壁のテクスチャを決めてないから分かりやすくマゼンタにしてる
ならばマゼンタではなくて仮のテクスチャを入れておきましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608797/eed18c50-5ad3-f6cc-67fb-d566219870fc.png)
一目で仮テクスチャなんだなとわかります。

### 壁のマテリアルでエラーが起きてる
純粋にシェーダーでエラーが起きてるなら直しましょう。
マテリアルがNoneだとマゼンタになります。チェックしましょう。
そうではなくてC#で動的にmeshを生成したりするとmeshにマテリアルが未割り当てでマゼンタになったりします。
仮のマテリアルを作って割り当てておきましょう。

# まとめ
* パッと目に入ってわかりやすいからマゼンタに設定
* 具体的な色を決めてないから適当な色としてマゼンタ

は止めておきましょう。
エラーなのか正常なのかわからないです。
仮テクスチャを用意しましょう。
gnuplotでHorizontal histogramを描く

# はじめに
グラフを描画するのに非常に便利なgnuplotですが，ヒストグラムを90度回転させた横書きのヒストグラム(以下，horizontal histogram)は実装されていないそうです．しかし過去に賢人が処方箋を打ち出してくれており，horizontal histogramを疑似的に再現することが可能になっています．
調べた限り詳しい解説がなかったので，ここではなるべく一般化して誰でも利用できるように解説します．

# 通常のヒストグラム
始めに通常のヒストグラムを作成してみます．以下のプロットに使う**data.dat**は，1列目に$x$軸，2列目に$y$軸の値がそれぞれ格納されているとしています．
```
unset key
set xlabel "x"
set ylabel "y"
set xrange [0.0:2.0]
set yrange [0.0:0.1]

BIN = 0.05 # bin widthの指定(任意)
set style fill solid border linecolor rgb "black"
plot "data.dat" using 1:2 bins binwidth = BIN with boxes linecolor rgb "grey" 
```
これを実行すると以下のヒストグラムが作られます．
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582727/638c2790-11b5-e68a-4eea-ca4c0b3536e9.png)

# Horizontal histogram
以下の参考文献によると，gnuplotでは横書きのヒストグラムは（少なくともver 5.4.0までは）実装されていないそうです．(参考：[Horizontal histogram in gnuplot](https://stackoverflow.com/questions/11266452/horizontal-histogram-in-gnuplot)，[【gnuplot】散布図＋ヒストグラム 統合図作成のコマンドセット](https://meltingrabbit.com/blog/article/2017112802/))
そこで苦肉の策としてエラーバーをbox表記で示す`boxxyerrorbars`オプションを用いることで代替する案が挙げられています．

gnuplotのofficial documentation([Official gnuplot online documentation](http://www.gnuplot.info/documentation.html), Version 5.4(日本語), P83)を見ると，プロット点に$x,y$両方のエラーバーを付ける際には`xyerrorbars`を用いて次のように記述します．
```
plot "---.dat" using x:y:delta_x:delta_y with xyerrorbars
```
このときのプロット結果は次の左図のように反映されます．
![xyerrorbars.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582727/bede568b-1ba9-0649-9931-d4b596ec5c2a.png)


ここで`xyerrorbars`の拡張版である`boxxyerrorbars`では，右図のようにエラー範囲をBox状にプロットすることができます．そこでこの箱型のエラーバーを互いに重ならないよう連ねることでヒストグラムっぽくしたのが今回編み出された手法です．
上の`boxxyerrorbars`をヒストグラムに応用することを考えると，horizontal histogramを作る場合，$x,y,\Delta x,\Delta y$はそれぞれ次のように設定すれば良いことが分かります．　<br>

|$x$|$y$|$\Delta x$|$\Delta y$|
|:---:|:---:|:---:|:---:|
|binの高さの半分の値|横軸（$x$軸）の値|binの高さの半分の値$(=x)$|bin幅の半分の値|

これを実装したのが以下のコマンドです．グラフ自体の回転はしていないので，labelとrangeが先ほどと逆転していることに注意してください．

```
unset key
set xlabel "y" # <-- x，y軸逆転
set ylabel "x"
set xrange [0.0:0.1]　# <-- x，y軸逆転
set yrange [0.0:2.0]

BIN = 0.05 # bin widthの指定（任意）
set style fill solid border linecolor rgb "black"
plot "data.dat" using ($2*0.5):1:($2*0.5):(BIN*0.5) linecolor rgb "grey" with boxxyerrorbars
```
すると以下の図が出力されます．グラフのアスペクト比は`(rltb)margin screen`で適宜調節しています．
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582727/e7373baf-35d9-4b10-9d0c-6ec9a72621b2.png)
Selenium備忘録

メモせずにいつも同じことを調べてしまうので、備忘的に随時追記。

### 個別のブラウザモジュール(Chromium)を指定
Chromiumのexeファイルを以下のように指定すれば可能。
~~~java
ChromeOptions options = new ChromeOptions();
// Chromiumを指定
options.setBinary("./lib/chromium-win/chrome.exe");
~~~
### ブラウザの枠外にある要素を枠内に持ってくる
javascriptで。scrollIntoViewのパラメータ：falseで下寄せ、trueで上寄せ。targetXpathは対象要素のXpath。
~~~java
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(false);", driver.findElement(By.xpath(targetXpath)));
~~~

### 新しいタブを開いてリンクを開く
targetXpathは対象リンクのXpath。
~~~java
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL, Keys.RETURN);
driver.findElement(By.xpath(targetXpath)).sendKeys(selectLinkOpeninNewTab);
~~~

### 要素の存在確認
targetXpathは対象要素のXpath。
~~~java
// 要素が出現(見える)まで10秒待機
new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.visibilityOfElementLocated(By.xpath(targetXpath)));
if (0 < driver.findElements(By.xpath(targetXpath)).size()) {
	// findElementsのサイズで判定させる
}
~~~
【rails】ルートにposts/indexを指定している状態で、posts/indexをURLに打ち込んだらエラーが起きた。その原因と解決策

# 状況
- localhost:3000/posts/indexにアクセスしたら以下のエラー
![スクリーンショット 2022-03-09 20.31.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381701/929965d9-9940-8b4b-0acc-410df64ff0ab.png)


# 原因
- ルーティングにposts/indexが指定されていなかった

# 原因に気付かなかった理由
- rootにposts/indexを指定していたからそれで十分だと思っていた
- resouces:postsがあるからそれで十分だと思っていた
```routes.rb
Rails.application.routes.draw do
  devise_for :users,
    controllers: { registrations: 'registrations' }
    
    root'posts#index'
    get "posts/index" => "posts#index"

    get "users/index" => "users#index"
    get '/users/:id', to: 'users#show', as: 'user'

  #親子関係にあるということ
  resources :posts, only: %i(index new create show destroy) do
    resources :photos, only: %i(create)
    resources :likes, only: %i(create destroy)
    resources :comments, only: %i(create destroy)
  end
  
end
```
``` ruby
get "posts/index" => "posts#index"
```
この部分を追加したらposts/indexで検索してもページがちゃんと表示された .
- posts使ってたから十分だと思ってたけど、これは親子関係での指定だからシンプルなresouces とは違ってたって認識でいいのかな？
また後日調べます
IBMのレア認定試験IBM WebSphere Hybrid Edition V5.0 Solution Architectureを受けてみた

# IBM WebSphere Hybrid Edition V5.0 Solution Architectureとは

WebSphere Hybrid Editionは、従来のWAS ND、Base、Liberty Coreに加え、クラウド・マイグレーションのためのツール類を含んだIBMのサブスクリプション製品です。IBM WebSphere Hybrid Edition V5.0 Solution Architectureに合格すると、IBM Certified Solution Architect - WebSphere Hybrid Edition V5.0の認定資格を得ることができます。もちろんOpen Badgeももらえます。

<img width="160" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/356b9edb-5a87-7423-1a18-c9994a40b27b.png">

認定資格および試験の概要はこちら。

> https://www.ibm.com/training/certification/C0006401

# 学習方法

難易度はかなり高めです。下記サイトでラーニングパスが公開されていますので、一通り目を通すことをお勧めします。それでも難しいです。

> https://www.ibm.com/training/path/ibmwebspherehybridedition

# 受験方法

PearsonVUE社のサイトで予約して受験してください。

https://www.pearsonvue.co.jp/Clients/IBM.aspx

以前は最寄りのテストセンターでしか受験できなかったのですが、最近はカメラ付きPCがあれば自宅でも受験可能になりました。こういうご時世ですので、可能であれば自宅での受験をお勧めします。ただし部屋の片づけはきちんとしておいてください。

# 合格点

64問中45問以上の正解で合格です。正答率は70%です。

# 出題内容

試験規約により具体的な問題文は書けませんので、雰囲気になりますが、いくつか問われそうな箇所を書きます。

## WAS ND, Base, Liberty Core

* ライセンスの違いと適用パターン
* JMS利用時の構成
* plug-inの生成と役割
* セッションクラスタリング・レプリケーションの構成
* Collectiveの構成

## マイグレーションツール

各ツールの構成、使用方法について。

* Transformation Advisor
* Mono2Micro
* WebSphere Application Server Migration Toolkit
* Cloud Foundry Migration Runtime

## Cloud Native

* マイグレーションの流れ
* Cloud Native
* Cloud Ready
* Kubernetes
* OpenShift
* Re-host
* Re-platform
* Re-factoring

# 感想

試験の難易度は高めです。WASに詳しいだけでは恐らく合格できません。WASの各エディションだけでなく、Migration Toolkit、Transformation Advisor、Mono2Micro、Cloud Foundry Migration Runtimeといったツール類についてもかなり詳しく問われますが、これらを実際に使ったことがある人は稀だと思うので、e-Learningや製品マニュアルを見て、導入方法から使い方まで勉強しておく必要があります。また、ベンダー試験あるあるですが、どうにも回答の選択肢が腑に落ちないケースもいくつかありました。私はぎりぎり合格できましたが、もう1回受けたら落ちてもおかしくないです。
Jetson Nano 2G をSSDから起動させる（USBブート）

Jetson Nano 2G(...日本発売版ではないかもしれない)。

```sh:
$ cat /etc/nv_tegra_release
# R32 (release), REVISION: 6.1, GCID: 27863751, BOARD: t210ref, EABI: aarch64, DATE: Mon Jul 26 19:20:30 UTC 2021
```


SDカードからOSのJetpackをインストール後。
USB3のポートにSSDを接続した。（USBとSSDの接続ケーブルに相性がある様子）
なおSSDを予めext4にフォーマットした。

```sh
$ git clone https://github.com/jetsonhacksnano/bootFromUSB
$ cd bootFromUSB
$ ./copyRootToUSB.sh -p /dev/sda1
$ ./partUUID.sh
PARTUUID of Partition: /dev/sda1
2d9b7172-4d95-4b88-9cfe-c90d7a81b3b7

Sample snippet for /boot/extlinux/extlinux.conf entry:
APPEND ${cbootargs} root=PARTUUID=2d9b7172-4d95-4b88-9cfe-c90d7a81b3b7 rootwait rootfstype=ext4

$ sudo mount /dev/sda1 /mnt
$ cd /mnt/boot/extlinux
$ sudo vi extlinux.conf
```
extlinux.conf内の
```text:変更前
APPEND ${cbootargs} quiet root=/dev/sda1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 
```
〜のような行を./partUUID.shで出力されたAPPEND〜に変更する
```text:partUUID.shの出力
APPEND ${cbootargs} root=PARTUUID=2d9b7172-4d95-4b88-9cfe-c90d7a81b3b7 rootwait rootfstype=ext4
```
変更して保存したらJetson Nanoからsdカードを取り出して電源を抜いて再起動すればSSDからOSが起動する。


参考：
https://www.jetsonhacks.com/2021/03/10/jetson-nano-boot-from-usb/
https://qiita.com/kitazaki/items/8894eb37bd7dceed7992
ポートフォリオとして、PDCA管理のアプリを作成しました。

# はじめに
### 記事の目的
こちらは、ポートフォリオとして作成したWebアプリケーションの紹介記事です。


https://cicou.under.jp/myPDCA/login.php

# アプリの概要
突然ですが仕事や普段の生活において、クリアしたい目標や目指しているゴールはありませんか？
貯金したい、ダイエットを成功させたい、資格を取りたいなど様々あるのではないかと思います。

しかし、目標を立てたものの続かなかったり、忘れてしまったりすることは少なからずありますよね。

そこで、目標を可視化し分解することで達成へと導く、「PDCAサイクル」を管理できるアプリ**myPDCA**を作りました。

# 機能
### 一覧
作成したPDCAのうち、「抱えている課題」と実行すべきタスクである「Do」が表示されます。
### 作成
達成したい目標とタスクを作成、登録することができます。
「Check」と「Action」については経過とともに入力が必要なため、欄内が空のまま入力を進めることができます。
### 詳細表示
作成したPDCAの具体的な内容を確認できます。
また、表示しているPDCAの編集と削除を行うページへ移動することもできます。
### 編集
選択したPDCAの内容を編集し上書き保存することが可能です。
また、経過を記入する「Check」と結果を記入する「Action」もこの画面で編集していきます。
### 削除
選択したPDCAを削除できます。
# 使用技術
### バックエンド
- PHP 8.1.2
### フロントエンド
- HTML
- CSS
- bootstrap
### データベース
- MySQL 5.7
### デプロイ
- LOLIPOP!

# 工夫した点
### TOPページ
今すべきことがすぐにわかるよう、必要最低限の情報（「抱えている課題」と「Do」）が表示されるようにしました。
### PDCA作成画面
サイクルをイメージしやすいよう入力画面を配置しました。

# 最後に
初めてのアプリケーション作成でぶつかる壁も多かったですが、裏側のロジックを少しずつ理解し楽しみながら作成できました。
まだ実装できていない機能や使いやすさなど、課題点は多いと感じているので日々修正を加え更新していきます。

仕事で達成したい目標ができた時は、いつもPDCAをメモ帳に手書きで記入していました。
しかし手書きだと修正や変更を加える上での不便があったので、アプリケーションとして使用できるようにしてみました。
達成したい目標に大小は関係ないと思いますので、まずはお気軽に使ってみてください。

最後までお読みいただき、ありがとうございます。
[Python]Playwrightを利用したWebページのPDF保存方法 メモ


* Python + Playwrightを利用して複数のWebページにアクセスし、それらのページをPDF保存する方法をメモする。
  - ubuntu 20.04 on wsl2環境で実施。
  - [Seleniumで試した時のもの](https://qiita.com/KWS_0901/items/33ae052e2e4694a6b4f1)をPlaywrightで書き直した。



## 事前準備

* ライブラリインストール

  ```
  pip install playwright
  python3 playwright install
  playwright install-deps 
  ```

  

## 処理フロー

**1. 以下のような対象WebページのURL一覧(`urls.txt`)を用意する。**

```
   https://hogehoge.com/hoge.html
   https://fugafuga.com/fuga.html
   ...
```

**2. 上記ファイルに記載のURLにアクセスする。**

**3. アクセスしたURLをPDF保存する。**

**4. 2，3を繰り返す。**

## コード

* `test.py`

```python
from playwright.sync_api import sync_playwright

# 保存対象URL一覧取得
urls = []
with open('urls.txt', mode='rt', encoding='utf-8') as f:
    urls = f.readlines()

# 対象URL一覧にアクセスし、PDF保存
with sync_playwright() as p:
    browser = p.chromium.launch()
    for i,url in enumerate(urls):
        context = browser.new_context()
        page = context.new_page()
        page.goto(url)
        page.pdf(path=f"{i}.pdf")
    browser.close()
```



## 動作確認

* 実行

  ```
  python3 test.py
  ```

* 実行結果

  * `1.pdf`、`2.dpf`のようなファイル名で、`test.py`と同一フォルダにpdfが保存される。

## 参考情報

* [Playwright](https://playwright.dev/python/)
Dataマニアの完全保存版 リンク集

2020年-後半2021年初めにデータ系のプロジェクトにドハマりしてたときのものです。

クオンツアナリストやエンジニアになりたいわけでもないのですが、
Machine LearningやBig dataのAWSトレーニングもがっつり受けました。

~~AWSトレーニングまとめはこちら（3月末頃更新予定）~~
　
# AWS関連資料
###### 各種ドキュメント一覧
[Big data　ホワイトペーパー](https://aws.amazon.com/whitepapers/?whitepapers-main.sort-by=item.additionalFields.sortDate&whitepapers-main.sort-order=desc&awsf.whitepapers-tech-category=tech-category%23analytics&awsf.whitepapers-content-type=content-type%23whitepaper&awsf.whitepapers-global-methodology=*all&awsf.whitepapers-content-category=content-category%23intro&awsf.whitepapers-industries=*all&awsf.whitepapers-business-category=*all)
[ユーザーガイド一覧（見やすいページ）](https://docs.aws.amazon.com/#user_guides:)
[AWSサービスこれだけ使っても無料](https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all)
[Architect ダイアグラム](https://aws.amazon.com/architecture/reference-architecture-diagrams/?achp_navlib4&solutions-all.sort-by=item.additionalFields.sortDate&solutions-all.sort-order=desc&whitepapers-main.sort-by=item.additionalFields.sortDate&whitepapers-main.sort-order=desc&awsf.whitepapers-tech-category=tech-category%23analytics%7Ctech-category%23ai-ml%7Ctech-category%23databases%7Ctech-category%23cost-mgmt&awsf.whitepapers-industries=industry%23financial-services)


###### データベース
[Data Pipeline](https://docs.aws.amazon.com/data-pipeline/?id=docs_gateway:)
[Athema　SQL](https://docs.aws.amazon.com/athena/?id=docs_gateway:)
[EMR　拡張性と汎用性に優れたデータベース](https://docs.aws.amazon.com/emr/?id=docs_gateway:)
[Kinesis　ストリーミングから、データ収集、分析まで一括サービス](https://docs.aws.amazon.com/kinesis/?id=docs_gateway:)
[cloudfront　世界310拠点の分散で低レイテンシーが実現](https://aws.amazon.com/jp/cloudfront/?nc1=h_ls:)
[Storage Gateway　AWSのクラウドソリューションで自社サーバーをもっとパワフルに](https://aws.amazon.com/jp/storagegateway/?nc1=h_ls:)
[Elastic Block Storage　必要な分だけサービスに合ったストレージを足せる](https://aws.amazon.com/jp/ebs/?nc1=h_ls:)
　

# その他

###### オープンデータ
[S&P　債券や株式等発行元を分析するプロ](https://www.marketplace.spglobal.com/en/datasets?utm_source=SPGMIWebsite:)
[Our World in Data　健康や貧困を中心とした世界中のあらゆるトピック別データベース](https://ourworldindata.org/)
[G空間情報センター　産官学連携の3Dモデルデータベース](https://www.geospatial.jp/gp_front/)
[e-Stat 政府公表の日本の経済活動等データセット](https://www.e-stat.go.jp/release-calendar?startYear=2022&startMonth=3&startDay=9&endYear=2022&endMonth=3&endDay=31)
[World Bankのデータセット](https://data.worldbank.org/)
[科学技術振興機構データベース](https://www.jst.go.jp/data/)


###### オープンソースツール
[MySQL データベースの基本](https://dev.mysql.com/)
[OpenML　オープンソースのデータや分析フローのテンプレート](https://www.openml.org/home)
[Kubeflow UbuntuでML](https://ubuntu.com/ai)


###### 参考プロジェクト
[Craig Taylor　アート性の高いData Viz](https://www.youtube.com/watch?v=wxmqG_jxJiw)
[コマツ　Cesiumを使ったデジタルツイン建築](https://www.youtube.com/watch?v=RFYdhr6CwtE)
[Atlas　ハーバード発お手本になるDataBiz](https://atlas.cid.harvard.edu/)
[biosim4　生物が自然淘汰しながら進化するシミュレーターML](https://qiita.com/Mikotostudio/items/5e5edba1e0921e2e8648)
　
　
　
　　
軽くまとめたつもりがいつの間にか長いリンク集になっていました。
データたくさん見てたらついワクワクしてしまいますね＾＾

関連ワード： Data Visualization / Business Intelligence / Database / Big data / Data Visualization / Machine Learning / 3D / AWS
Rails コマンドがうんともすんとも言わないときの対処法

# 症状
`rails` コマンドを実行したときに、10 分以上待っても何も反応しないことがある。

```shell:Shell
bundle exec rails generate scaffold blog title:string body:text
# 10 分以上待っても反応しない
```

かといって、エラーが出るわけでもない。完全に止まっている状態になる。

# 対処方法
この場合、かなりの確率で Spring に原因がある場合がある。

Spring を一度ストップしてあげると正常に動くようになる。

```shell:Shell
bundle exec spring stop
```

```
Spring stopped.
```

これで `rails` コマンドが正常に実行できるようになる。

# 参考サイト
* ["rails generate" not working](https://stackoverflow.com/questions/23157426/rails-generate-not-working)
docker ros 


## dockerでros melodic立ち上げ

```bash
 sudo  docker run -p 6080:80 --shm-size=512m tiryoh/ros-desktop-vnc:melodic
```
http://127.0.0.1:6080/ にアクセス

![Screenshot from 2022-03-09 19-48-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/d979bc21-315a-4e46-adfe-d62121b54845.png)

pcのテキストをvncの画面内にコピーするときは,左ツールバーにあるクリップボードに貼り付けて行う

![Screenshot from 2022-03-09 19-49-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/9243c516-e724-d894-0855-2e753a20e873.png)

https://qiita.com/karaage0703/items/957bdc7b4dabfc6639da
Dell Inspiron 14 5000がスリープから復帰しない現象を解決した話

はじめまして、小鳥遊と申します。

この記事についてはタイトルの通りで、既に解決済みですが困っている人がいるかもしれないというのと、私が懲りずにまたDell製品を購入したときの備忘録として記事を書いてみました。
Qiitaの趣旨を考えると場違いかもしれませんがご容赦を。

私の場合は既に保証が切れており無敵でしたが、
この記事の解決法を実施すると**保証対象外**になりますので**自己責任**でお願いします。

## これから書くことの概要
* 私物のInspironがスリープから復帰できない
* WLANのドライバが原因
* WLANをintel AX210に換装

## 私物のInspironがスリープから復帰できない
はい。見出しの通りですね。
ここで重要な補足なのですが、**S3ステートに入ると復帰できない**んです。

電源周りの設定を変更していなければハイブリッドスリープが有効になっていると思われるので、スリープにしてから暫くは復帰できるんです。
ただし、時間が経ってスリープがS3ステートに入ってしまうと復帰できなくなってしまいます。

ノートPCとしては致命的ですね。

:::note info
スリープ後すぐに復帰できなくなる？
BIOSで**Sleep mode**を確認しましょう。**Force S3**になっているはずです。
:::

## WLANのドライバが原因
これを突き止めるのに苦労しました。
Windowsのクリーンインストールを何回やったことか…

Windowsのクリーンインストールでわかったことは、クリーンインストール直後はスリープ復帰が可能で、Windows Updateを実施すると問題が発生するということです。

となると、Windows Updateで入ってきた更新プログラムか、ドライバ類が原因という線が濃厚です。

まず初めに更新プログラムを削除。。。スリープ復帰できず。

ではドライバ類が原因、なのですが。
ドライバが多すぎて自力で一個一個潰すのは骨が折れます。
途方に暮れながらネットの海を彷徨っていたところ、**Qualcomm QCA9377のドライバには問題がある**といった書き込みを見つけました。

この書き込みを読み終えてすぐに筐体を開けてWLANモジュールを取り外しました。
その後、問題なくスリープ復帰ができることを確認。
結果として、原因は

**Qualcomm QCA9377を搭載しているDW1810というWLANモジュールのドライバ**

でした。

## WLANをintel AX210に換装し、問題解決
DW1810というWLANモジュールを取り外したことで、スリープ復帰ができるようになりました。

**が、**

ノートPCでWLANが使えないのは致命的ですね。
なのでintel AX210というモジュールを購入し取り付けました。

:::note warn
Insipron 14 5485の場合、AX211ではダメです。AX210を購入しましょう。
Insipron 14 5485以外の人は自身のPCにあったものを購入しましょう。
:::

## その後

AX210に換装してから二週間くらい経ちますが、スリープ復帰全く問題ありませんね。
これが普通なのですが。

おまけでBluetoothバージョンも4.1から5.2に上がりました。

今回原因だったDW1810(QCA9377)、実はBluetoothを突然見失う不具合もあったんですよね。
DellかQualcommかわかりませんが、これちゃんとテストしてるんですかね？

以上、今回遭遇したトラブルの備忘録になります。
ここまで読んでくださった皆様、長々とお付き合いいただきありがとうございました。
[忘却録]　Kicad Footprint 放浪記

# [忘却録]　Kicad Footprint 放浪記

メモとして残します。自分用です
Footprintが直でダウンロードできない時ように見てくれ！（直でダウンロード出来たのあったかレベルで無い）

```txt
Footprintで必要なサイトおよびソフト
samacSys 　
library loader 
Rs components
```

- １
まずは欲しいFootprintデータの型番をGoogleなどの検索エンジンで検索
上から見ていってSamacSysのPCB記号を探す
あればその内容をダウンロードする。

- ２
その後Library loaderを起動して
初期画面からダウンロードファイルの指定をする
その後、Settingに入り１で手に入れたダウンロードファイルを参照する
参照した後に右下にある[OK]を押すと初期画面に戻る。
右上にある OPEN ECAD Modelをクリックする
Zipファイルがダウンロードされる

- 3
２で手に入れたZipファイルを解凍した後自分の使っているソフト（Kicad）のフォルダーに遷移する
この中には.modのファイルなどが含まれている
KicadでFoot printを追加する画面にいきこのModファイル（二つ存在するがKicadでは一つのみしか参照できないようになっていた）を追加する

完成！！


2022/12/12
久しぶりにFootprintを探したがこのサイトは有用だと記載したい
- snapEDA
[サイトのトップ](https://www.snapeda.com/home/)
[kicadのfootprintとシンボルのimport方法](https://www.snapeda.com/about/import/#KiCad5)



画像とかは後日追記します
AWS PrivateLinkで別AWSアカウントのサービスへアクセスする

# 概要
- AWS PrivateLinkとは
    - https://qiita.com/alingogo/items/aa964b5ba6f8320b5cbe
- インタネット経由しなくて、別のAWSアカウントのサービスへアクセスする種類
    - S3
    - Private API Gateway
    - Gateway Load Balance


# 内容
### S3
- [VPCエンドポイント経由して別AWSアカウントのS3バケットにアクセスしてみた](https://dev.classmethod.jp/articles/s3-cross-account-access-iamrole/)

### Private API Gateway
- [インターフェース VPC のエンドポイントを使って、別の AWS アカウントにある API Gateway のプライベート REST API にアクセスするにはどうすればいいですか。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/api-gateway-private-cross-account-vpce/)
- [Amazon API Gateway でのプライベート API の作成](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-private-apis.html#apigateway-private-api-create-interface-vpc-endpoint)

### Gateway Load Balance
- [AWS Gateway Load Balancer のご紹介 — パートナーアプライアンスの簡単なデプロイ、スケーラビリティ、高可用性](https://aws.amazon.com/jp/blogs/news/introducing-aws-gateway-load-balancer-easy-deployment-scalability-and-high-availability-for-partner-appliances/)

# 補足
- 今後はそのほかのサービスが対応されるとここに記述する
テスト62

```vb

Sub Regex_Hyphen()

'正規表現練習
Dim reg As Object
Dim reg_str As Variant

Set reg = CreateObject("VBScript.RegExp")

reg_str = "[" & ChrW(&H2010) & ChrW(&H2011) & _
                ChrW(&H2012) & ChrW(&H2013) & _
                ChrW(&H2014) & ChrW(&H2015) & _
                ChrW(&H2043) & ChrW(&H2212) & _
                ChrW(&H30FC) & ChrW(&HFF70) & _
                ChrW(&H2D) & "]"
                    
'正規表現の指定
With reg
'    文字列の中で色々なハイフンを通常のハイフンに置き換える.....〆(･ω･ )ﾒﾓﾒﾓ
    .Pattern = reg_str      'パターンを指定
    .IgnoreCase = True      '大文字と小文字を区別する(False)、しない(True)
    .Global = True          '文字列全体を検索する(True)、しない(False)
End With

Dim str As String
Dim i As Long
Dim sh As Worksheet
Dim Last_Row As Long

Set sh = ThisWorkbook.Sheets("ハイフン")

With sh

    Last_Row = .Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 2 To Last_Row

       .Cells(i, 5) = reg.Replace(.Cells(i, 1).Value, "-")

    Next i

End With

Set reg = Nothing
Set sh = Nothing

End Sub

'Sub 重複チェック()
'
'Dim Dic As Variant
'Dim i As Long
'Dim buf As String
'Dim Last_Row As Long
'Dim j As Integer
'
'Set Dic = CreateObject("Scripting.Dictionary")
'
'With ThisWorkbook.Sheets("重複データ3")
'
'    Last_Row = .Cells(.Rows.Count, 1).End(xlUp).Row
'
'    For i = 2 To Last_Row
'
'        buf = .Cells(i, 2).Value
'
'        If Dic.Exists(buf) = False Then
'            j = j + 1
'            Dic.Add buf, j
'
'        End If
'
'    Next i
'
'End With
'
'Dim tmp As Variant
'
''重複しないデータの出力
'For Each tmp In Dic
'
'    Debug.Print tmp
'
'Next tmp
'
'
'MsgBox Dic.Count
'Set Dic = Nothing
'
'End Sub
laravelでleafletを使うとmarkerが二重になる

# 不具合
laravelでleafletを使うとmarkerが二重になる

# 環境
- laravel 8
- laravel mix

# 原因
画像パスがおかしい
```
http://localhost/images/vendor/leaflet/dist/marker-icon.png?2b3e1faf89f9a4a4835397e7a43b4f77d%22)marker-shadow.png
```

# 対策
```bootstrap.js
require('leaflet/dist/leaflet.js');
delete L.Icon.Default.prototype._getIconUrl;
L.Icon.Default.mergeOptions({
    iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png').default,
    iconUrl: require('leaflet/dist/images/marker-icon.png').default,
    shadowUrl: require('leaflet/dist/images/marker-shadow.png').default,
});
```

```app.sass
@import '~leaflet/dist/leaflet.css'
```

# 補足
defaultがないと`<img src="[object Module]" />`なる
https://stackoverflow.com/questions/59070216/webpack-file-loader-outputs-object-module

# 参考
https://stackoverflow.com/questions/66853296/leaflet-markers-showing-up-twice-with-laravel-mix

# 設定ファイルなど
https://gist.github.com/YamasakiKenta/7e5aa351de518b2e38fdc90584523b18
ADRパターン

# ADRの概要
- Action-Domain-Responder
- ソフトウェアアーキテクチャパターンの1つ
- MVCの改良版

# MVCと違うところ
1つのアクションに対して、そのリクエストからレスポンスを定義する。

## MVCの場合
例えばMVC実装だと、1つのコントローラーに
- index
- insert
- update
- delete

などアクションを複数定義する。

## ADRの場合
1クラス1アクションにより
- シンプルなリクエスト→レスポンスの流れ
- 1クラスの責務が明確

# 構成
## Action
リクエストを受け取り、ドメインの処理結果をレスポンダに渡す

## Domain
必要な処理を行い結果を返す
ビジネスロジックはここに含まれる

## Responder
ドメインの処理結果を受け取り、必要な準備を行いレスポンスを返す

# 実装例
PHP/Laravel

## Actionクラス
- Controllerクラスを継承
- コンストラクタでドメインオブジェクトとレスポンダオブジェクトを注入
- レスポンダに渡す処理をinvoke(マジックメソッド）で定義

```php
class HogeIndexAction extends Controller
{
  protected $domain;
  protected $responder;

  public fucntion __construct(
    Domain $domain,
    Responder $responder
  ) {
    $this->domain = $domain;
    $this->responder = $responder;
  }

  public function __invoke(Request $request): Response
  {
    return $this->responder->response(
      $this->domain->get()
    );
  }
}
```

## Domainクラス
```php
class HogeIndexDomain
{
  public function get()
  {
    /*
     * ビジネスロジック等
     *
     */

    // 処理したデータを返す
    return ['hoge' => 'fuga'];
  }
}
```

## Responderクラス
```php
class HogeIndexResponder
{
  protected $response;
  protected $view;

  public function __construct(Response $response, ViewFactory $view)
  {
    $this->response = $response;
    $this->view = $view;
  }

  public function response($data): Response
  {
    if (empty($data)) {
      // 404ステータスコードと共にエラー表示
    }

    // 取得したデータをセットしたviewを返す
    $this->response->setContent(
      $this->view->make('hoge.index', ['hoge' => $data])
    );
    return $this->response;
  }
}
```
# 参考
[LaravelでのADR（Action-domain-responder）実装](https://www.ritolab.com/entry/164)
【PHP】foreach小ネタ for文不要論

# コード

なぜかPHP7.0では使えなかった  ※筆者の開発環境が7.0のため
```PHP
<?php
$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];
foreach ($data as ["id" => $id, "name" => $name]) {
    echo "id: $id, name: $name".PHP_EOL;
}

```

# foreachの最初と最後

```PHP
$array = [1, 2, 3];
foreach ($array as $value) {
    if ($value === reset($array)) {
        echo "foreachの最初";
    }
    if ($value === end($array)) {
        echo "foreachの最後";
    }
}

```

# for文がこれで不要になる
```PHP
foreach (range(1,5) as $i) {
    echo $i;
}

#結果 12345

for ($i = 1; $i <= 5; $i++) {
    echo $i;
}

#結果 12345

```






# 結果
```
id: 1, name: Tom
id: 2, name: Fred
```
E2E とは

## 勉強前イメージ

2はtoな感じ？

## 調査

### E2E とは

end to endの略で、端から端までの意味です。
ITでは、通信の2者間を繋ぐ経路全体を指すことが多いです。

### エンドツーエンド原理

ネットワークの設計思想の一つに、 `エンドツーエンド原理` というのがあります。
これは、通信制御やエラー検知など高度な処理は末端システムで行い
ネットワークの経路上では単純な処理や中継のみを行うというものです。

また、関連する言葉として `E2EE(end to end encryption) : エンドツーエンド暗号化` というものがあり
メッセージなどのやり取りは、端から端まですべて暗号化された状態で
送信者と受信者のみ閲覧できるため、匿名性が高い暗号化方式です。

## 勉強後イメージ

これは考えればわかったぞ！！
でも端っこで高度な処理をする思想は認識としてあまりなかったから覚えておこう。

## 参考

- [エンドツーエンド](https://www.ntt.com/business/services/data-utilization/dxplatform/sdpf/knowledge/glossary/008.html#:~:text=%E3%82%A8%E3%83%B3%E3%83%89%E3%83%84%E3%83%BC%E3%82%A8%E3%83%B3%E3%83%89%EF%BC%88end%2Dto,%E3%81%9D%E3%81%AE%E4%B8%A1%E7%AB%AF%E3%82%92%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
- [エンドツーエンド 【end to end】 E2E / エンドトゥエンド / エンド-エンド](https://e-words.jp/w/%E3%82%A8%E3%83%B3%E3%83%89%E3%83%84%E3%83%BC%E3%82%A8%E3%83%B3%E3%83%89.html)
AWS認定試験の一連の流れ

## 目次
- この記事を書いた動機
- 試験申し込み（リアル）
- 勉強方法
- 結果確認方法

## この記事を書いた動機
AWS認定試験を受けようと思ってから、分からなかったこと、不安になったことがあったからです。
この記事を読み、それらの疑問や不安を払拭し、万全な状態で試験に挑むことができれば、と思います。

## 試験申し込み
私はリアルで試験を受けたので、リアルの試験について書いていきます。
大まかな流れとしては、「受ける試験」「テストセンター」「会場」「試験日程」です。

<strong>1. AWS認定アカウントを作成</strong>
AWS認定資格登録のために、AWS認定アカウントが必要なため作成します。
以下のリンクから作成できます。
[https://www.aws.training/certification](https://www.aws.training/certification)

<strong>2. テストセンターを選択</strong>
上部タブ『試験登録』から、テストセンターの選択します。
PSIかピアソン VUEがあり、私はピアソン VUEを選択しました。理由としては、会場が多いことと、UIが綺麗だったことです。

<strong>3. 会場、試験日程の設定</strong>
案内に従って、会場、試験日時を設定します。

:::note warn
※注意※
各テストセンター、試験で持ち物が異なる場合があるため注意
（今回私が受けた試験では個人証明書のみ必要でした　[ピアソン VUEで有効な個人証明書](https://www.pearsonvue.co.jp/Test-takers/Tutorial/Identification-2.aspx)）
:::

## 勉強方法
今回、私は aws cloud practitioner を受けました。学習期間は約3週間くらいです。
お世話になった教材二つを紹介します。
- [AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1HBOTFMNJIWFX&keywords=aws+cloud+practitioner&qid=1646816460&sprefix=%2Caps%2C463&sr=8-4)
- [【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）](https://www.udemy.com/course/aws-4260/)

## 結果確認方法
試験終了直後に予想合否？が表示されます。
その後、正式にaws training and certificationアカウントに対して結果が届くので、『試験履歴』からスコアボードなどが確認できます。また、メールでもデジタルバッチ取得の案内メールも届きます。
私の場合は、昼過ぎに試験を受け、夕方頃には結果が解りました。
WordPressのAdvancedCustomFieldsにデフォルト値を設定する方法

# 実装

左サイドバー > 外観 > テーマエディター をクリック後
右サイドバー > テーマファイル > テーマのための関数 (functions.php) をクリック

ファイルの末尾に以下の内容を追記して保存する

```php
/**
 * カスタムフィールドのデフォルト値を設定する
 */
function acf_my_custom_field_name_callback($field)
{
    $field['default_value'] = "★デフォルト値をここに入力★"
    return $field;
}
```

`my_custom_field_name`の部分にはご自身で作ったカスタムフィールド名を入れてください。

`close_date`ならば、
`add_filter('acf/load_field/name=close_date', acf_close_date_callback);`
みたいな感じで。

関数名も同じく変更してください。
`function acf_close_date_callback($field)`
みたいな感じで。

# サンプル

今回の例では、デイトピッカーのデフォルト値に、
現在日付の一カ月後の値を初期設定することにします。

カスタムフィールド名は `close_date` にします。

左サイドバー > 外観 > テーマエディター をクリック後
右サイドバー > テーマファイル > テーマのための関数 (functions.php) をクリック

ファイルの末尾に以下の内容を追記して保存する

```php
/**
 * 現在日付の一カ月後を文字列で取得
 */
function show_next_month_from_now()
{
    $dt = new DateTime();
    $dt->modify("+1 month");
    $date = $dt->format("Y-m-d");
    return $date;
}

/**
 * カスタムフィールドのデフォルト値を設定する
 */
function acf_close_date_callback($field)
{
    $field['default_value'] = show_next_month_from_now();
    return $field;
}

// デフォルト値設定を適用する
add_filter('acf/load_field/name=close_date', acf_close_date_callback);
```

# 2022.03.13追記

試してないですが、こういう書き方もできるなって思いました。

```php
/**
 * ACFカスタムフィールドにデフォルト値を設定する
 */
function addAcfDefaultValue(name, value)
{
  $fieldName = 'acf/load_field/name=' . $name;
  add_filter($fieldName, function($field){
    $field['default_value'] = value;
    return $field;
  });
}

addAcfDefaultValue('my_custom_field_name', "★ここにデフォルト値を入力★");
addAcfDefaultValue('close_date', show_next_month_from_now());
```

# 参考URL

https://support.advancedcustomfields.com/forums/topic/dynamically-set-acf-field-default-value/

https://wordpress.stackexchange.com/questions/107775/set-default-date-in-datepicker-of-an-advanced-custom-field
PHP8のコンテナでdocker stopしてるのにSIGTERMが送られていない事象について

## 概要

PHP8のDockerコンテナに対して
docker stop
や
docker-compose stop
をしてもSIGTERMが送られず
phpスクリプトに記載のシグナル制御がうまく動かなかった。

## 原因

利用したDocker ImageにてSTOPSIGNALによりデフォルトのSIGTERMから別のシグナルに変更されていたため。

## 詳細

### Docker Image

https://hub.docker.com/r/phpdockerio/php80-fpm

### docker-compose

```yml:docker-compose.yml
version: '2.0'
services:
  app:
    container_name: php8
    image: phpdockerio/php80-fpm
    volumes:
      - ./:/var/www/html/
    command: php /var/www/html/test.php
```

### test.php

```php:test.php
<?php
pcntl_async_signals(true);
pcntl_signal(SIGTERM, 'hoge');

while(true){
    echo("call\n");
    sleep(2);
}

function hoge($signo){
    echo("hoge call\n");
    echo("{$signo}\n");
    exit;
}
```

### うまくいかない実行

```bash
docker-compose up
Starting php8 ... done
Attaching to php8
php8   | call
php8   | call
php8   | call
php8   | call
・・・
```

無限ループ中に別ターミナルからdockerを停止。
```bash
docker-compose stop
Stopping php8 ... done
```

```bash
$ docker-compose up
Starting php8 ... done
Attaching to php8
php8   | call
php8   | call
php8   | call
php8   | call
php8 exited with code 137
```

すぐに終了せずに10秒後にSIGKILLが送られて強制終了。
SIGTERMをキャッチしてくれない。

### うまくいく実行

コンテナを起動しておく。
別ターミナルでそのコンテナに入る。

```bash
docker exec -it php8 bash
# プロセス一覧からtest.phpをシグナルを15でkillする例
ps aux | grep test.php | grep -v grep | awk '{print $2}' | xargs kill -15
```

これを送ると
```bash
$ docker-compose up
Starting php8 ... done
Attaching to php8
php8   | call
php8   | hoge call
php8   | 15
php8 exited with code 0
```
SIGTERM（signo=15）を受け取って即時に終了する。

### 試したこと

全てのシグナルをキャッチしてみる。
```php:test.php
<?php
pcntl_async_signals(true);
for($i=1;$i<65;$i++){
    // このあたりは上書き不可のシグナル
    if($i===9)continue;
    if($i===19)continue;
    if($i===32)continue;
    if($i===33)continue;
    pcntl_signal($i, 'hoge');
}

while(true){
    echo("call\n");
    sleep(2);
}

function hoge($signo){
    echo("hoge call\n");
    echo("{$signo}\n");
    exit;
}
```

実行してみたところ
```bash
$ docker-compose up
Starting php8 ... done
Attaching to php8
php8   | call
php8   | hoge call
php8   | 3
php8 exited with code 0
```

signo=3を受け取って終了した。
signo=3はSIGQUIT
https://www.php.net/manual/ja/pcntl.constants.php

### 考察

なんでdocker stopでSIGQUITを送ってるんだ？
デフォルトだとSIGTERMって書いてあるんだけど…。
https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/stop/
>コンテナー内部の主となるプロセスは、シグナルSIGTERMを受信します。 そして一定時間後にSIGKILLを受信します。 

ここで気になる記載が
>初回に受信するシグナルは、コンテナーの Dockerfile 内においてSTOPSIGNAL命令を使って変更できます。

ほう、ってことはSTOPSIGNALで上書きしてる可能性あるか？
↓
使ってるimageのDockerfileを確認しに行く。

https://hub.docker.com/r/phpdockerio/php80-fpm/tags
https://hub.docker.com/layers/phpdockerio/php80-fpm/latest/images/sha256-5fc31be3e13612fa4a694f64937c267053cd187369f8ec28e335f4bc63abfe5a?context=explore

```Dockerfile
STOPSIGNAL SIGQUIT
```

シグナル上書きしてるぅ！
状況を理解した。

## まとめ

適当に使わず、使ってるImageはよく確認しよう。
Ubuntuでgifを生成する

ubuntuでgifを生成する方法を紹介します。
筆者はubuntu 18.04の環境ですが、おそらく他のバージョンでも大丈夫だと思います。

### peekのインストール

```
sudo add-apt-repository ppa:peek-developers/stable
sudo apt install peek
```
これで準備はOKです。

### peekの実行
ターミナルを開いて、
```
peek
```
を実行。

下記のようなウィンドウが表示されるので、任意の大きさに枠を広げ、「GIF形式で録画」を選択して録画をすればOKです。

![peek.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456240/2ca3db73-8d46-57be-90af-1ded8cfb53b6.png)
VSCodeでREADME (マークダウン) を編集する

VSCodeはREADMEを編集するに当たって便利な機能がたくさんあります。
今回はそんな機能たちの紹介を行っていきたいと思います。
※READMEと書いているもののマークダウン形式のファイル編集全般に使えます。

## 準備
VSCodeの拡張機能で下記をインストールしてください。
後に紹介する機能の一部だけ使いたい方は該当するものだけインストールすればOKですが、入れておいて損はないと思います。

* Markdown All in One
* Markdown Preview Enhanced
* markdownlint

VSCodeのExtensionsタブで"markdown"と入力すると上記のものが出てくると思うので、installを押してインストールしてください。イメージはこんな感じ。
![markdown_extensions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456240/f898ef54-6d9d-6d86-d73a-003b06219afa.png)

## 便利機能
準備ができたら早速各機能を試していきましょう。

### READMEをプレビューする
READMEを編集したらgit pushする前にgithub上でどう表示されるのかプレビューしたいですよね。
プレビューの手順は、

1. ctrl + shift + p
2. Markdown: Markdown Preview Enhanced to the sideを選択

するとこんな感じでプレビューが表示されます。
![preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456240/93532d89-101f-ec4e-86e6-f48023a199f3.png)
※これは最初にインストールしたもののうち、Markdown Preview Enhancedの機能です。

### READMEのフォーマットチェック
markdownlintは、READMEの書式が正しいかを自動で教えてくれます。
特に何かコマンドを実行する必要はなくて、markdownlintをインストールしてさえいればあとは自動で下記のように間違えを黄色の波線を引いて教えてくれます。
![markdownlint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456240/34934cf1-960b-a275-ace9-ed0d02dcd5f3.png)

さらに間違えを修正したいときは、
1. ctrl + shift + p
2. Fix all supported markdownlint violations in the documentを選択

で間違えが一括で修正されます。

### リストを自動で生成する
”Markdown All in One”は番号リストを作る時に1, 2, 3, の番号を改行で自動生成してくれたり、箇条書きのときも”・”を改行で自動生成してくれます。

### 章立ての番号振り分けの自動化

1. ctrl + shift + p
2. Markdown All in One: Add/Update section numbersを選択

すると先程のプレビューで示したREADMEに下記のように自動で少番号がつきます。
![add_number.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456240/c156ff9b-795b-a3e4-cc46-75751583c2bf.png)
※これは最初にインストールしたもののうち、Markdown All in Oneの機能です。


## おわりに
いかがでしたでしょうか。
編集時間がなくなってきたのでここまでとしますが、また随時アップデートしていきたいと思います！
【LUUP】噂の電動キックボードを3時間ぶっとおしで乗ってみた

<h2>LUUP - 緑のボディの電動キックボード</h2>
渋谷で試験的に導入され、本格的に広まり始めているLUUP。<br>
夜中に移動が必要な用事があり、<br>
電車はなく、<br>
タクシーを使いたくない方にピッタリなモノであることは間違いないです！

<h2>基本的な情報</h2>
<ul>
<li>LUUPは道路交通法上、<b>車両</b> の扱い</li>
<li>最高速度は15km/h前後</li>
<li>利用の際には、アプリ上で免許取得時にやっていた試験のミニバージョンをアプリ上で受ける</li>
<li>自分の運転免許証を写真に撮って送信する</li>
<li>支払いのためのクレジットカードを登録する</li>
</ul>

<br>
よって、お酒を飲んで乗れば飲酒運転ですし、<br>
免許を携帯しなければ無免許運転、<br>
一方通行を逆走など言語同断です。気をつけましょう。

<h2>2月上旬の寒い中、3時間乗ってみた</h2>
感想やアドバイスを述べていきます。
<h4>感想１：遅い。</h4>
都内で展開されている赤い自転車（シェアサイクル）でさえ、20km/h出せる。<br>
15km/hは具体的に下記のような問題を発生させます。<br><br>

そろそろ交差点に差し掛かる、信号は、、、「青だな」<br>
が、横目に見える歩行者側の信号が点滅している。。。まもなく車道側も赤に変わると分かる状況です。<br>

普通の車・自転車であれば、これはGOの状況でしょう。<br>
しかし、LUUPはダメです。<br>
最高速度15km/hが遅すぎて、交差点のど真ん中で、別の車線の信号が青に変わります。<br>
歩行者が通れそうにないなら、LUUPは到底通れないです。<br>

<h4>感想２：手袋はつけておけ。</h4>
LUUPはバイクのようにハンドルをひねるタイプではありません。<br>
右手の親指にちいさなレバーがあり、それを押し込みつつ、初速を与えると<br>
電動で速度が増す仕組みになっています。<br>
<br>
つまり、走る際には、このレバーをずっと押し続けないといけません。<br>
<br>
<br>
寒い冬の夜、かじかむ中、指の感覚がなくなりながらも、レバーを押し続けないといけない状況は大変苦行。
<br>
おすすめしないので、温かくしましょうね。<br>

<h4>感想３：足も冷えるぞ。</h4>
常に15km/hで走行できますが、到着まで結構な時間があると、微風を浴び続けるような状態になります。<br>
そのうち、足の感覚もなくなるため、1時間以上乗るつもりなら、貼るタイプのカイロなど準備をしておきましょう。<br>

<h4>感想４：手提げのバッグは危ない、背負え。</h4>
言わずもがな、危険です。

<h4>感想５：携帯を取り付けるための機構が備わっている、ここに携帯をセットしナビを起動せよ。</h4>
鬼便利です。<br>

<h4>感想６：友人同士でツーリングのような使い方をするのがよさそう</h4>
3時間も乗り続けていると、数組ほどLUUP使用者に出くわします。<br>
彼らには友達がいるようで、とても楽しそうだったため、紹介します。<br>

<h4>感想７：小回りが利くようで、利かない。通勤には向かない。</h4>
車両のルールで道路を走る以上、車の通りが多い時間帯は危険がつきまといます。<br>
人通りが多いところなど、走るには危険すぎるなと個人的に思っています。

<h2>結論</h2>
お得かどうかよりも、楽しいかどうかで乗るかどうかを考えたらよいと思いました。
検討の参考になれば幸いです。