OmniAICreator/Qiita-1.07M huggingface dataset:
エンジニアが新規事業を提案してみた

## やったこと

- リーンキャンバス作成
- β版アプリ作成
- アンケート市場調査

## 開始時の状況

私含めて５名の有志チームで、新規事業を提案しました。
新規事業として提案するぞ！と決めた時には、「こんなのできると面白いよね」のアイデアはありました。
しかし、アイデアだけでビジネスとして成り立つかや、本当に必要なアイデアなのか？などは全く考えられていませんでした、

## リーンキャンバス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/e70b74eb-4cc1-a93e-683c-a548b47a28ff.png)

新規事業を進める上で、必ずと言っていいほど、リーンキャンバスやビジネスキャンバスなどで整理するかと思います。

すぐに埋まったのは、 `独自の価値提案と、ソリューション`でした。
最後まで埋まらなかったのは、`圧倒的な優位性と収益の流れ`です。

- 学び
    - 課題と、顧客セグメントが決まっても、その顧客がお金を産むとは限らない。

## β版アプリ作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/2b050fe0-ddf8-b4ca-40f7-4e607344c90c.png)

エンジニアなので、一番価値の出せるポイントと考えアイデアからβ版を作成しました。

## アンケート市場調査

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/d5c0023f-09f8-8d67-3987-134f51dc6ad7.png)

市場に受け入れられるアイデアなのかを調べるために、少し費用をかけてアンケートを実施しました。
自分達だけで考えていると煮詰まりますし、不安になります。

## 結果として

提案資料は、自分達の納得のいくところまで引き上げることができました。
アンケートやβ版アプリで、実際の市場に受けるのかを動くものを使って説明することもできました。

アイデアだけでもいいのかもですが、エンジニアだからできるバリューの出し方や、チーム活動であれば全員が納得のいく形に成長させてから提案するのがいいかなと思いました。
WSL2で追加できるVHDを作って保存先にしたい

Microsoft Store版のWSL Previewでは、仮想ハードディスク（VHD）を追加でマウントすることが容易にできるようなので、データなどを保管するために空のVHDが用意したいと思います。

# 環境
- エディション: Windows 11 Home
- バージョン: 22H2
- WSL バージョン: 0.70.4.0
- カーネル バージョン: 5.15.68.1
- ディストリビューション: Debian GNU/Linux 11


# 仮想ハードディスク（VHD）を用意する
PowerShellからコマンドで用意することもできますが、ここではWindowsに標準で含まれている「**ディスク管理**」を利用します。
1. タスクバーの `スタート` から右クリックで `ディスク管理` を開きます。
2. `操作` メニューから `VHD の作成` を選択します。
3. 以下の項目を指定します。
   - **場所：** 保存場所を指定（`C:\Users\ユーザー名\my-drive.vhdx` など）
   - **仮想ハードディスクのサイズ：** ディスクサイズを指定（`128` `GB` など）
   - **仮想ハードディスク フォーマット：** `VHDX` を指定
   - **仮想ハードディスクの種類：** `可変容量` を指定
   - すべて指定できたら `OK` で実行します
4. `アイコンのあるディスク表示上`から右クリックで `VHD の切断` を選び `OK` で実行します。

これで仮想ハードディスクとしてのVHDファイルが、指定した保存場所に用意されました。
このVHDを、WSLで利用できるext4のファイルシステムでフォーマットして、マウントできるようにしたいと思います。
※VHDXはVHDの後継フォーマットです。


## WSLでVHDをフォーマットする

PowerShellから以下のコマンドでWSLにディスクをアタッチ（接続）します。
※VHDファイルの場所などは適宜差し替えてください。
```:PowerShell
PS C:\> wsl --mount --vhd \\?\C:\Users\ユーザー名\VHDファイル名.vhdx --bare
```
:::note warn
ディスクの管理で「VHD の切断」を行っていないと使用中となり、アタッチできません。
:::

アタッチされているか、また、そのデバイス名を確認します。
```:WSL
$ lsblk
NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda    8:0    0 365.5M  1 disk
sdb    8:16   0     1G  0 disk [SWAP]
sdc    8:32   0   128G  0 disk  ← 容量的にアタッチされたVHDと確認
sdd    8:48   0   256G  0 disk /mnt/wslg/distro
```
### fdiskを使ってパーティションを設定
今回はパーティションが1つだけ作成していますが、使用環境に合わせてパーティションを追加してください。

パーティションを作成（ここでの対象デバイスは `sdc` としています）
```:WSL
$ sudo fdisk /dev/sdc  ← 確認したデバイス名を/dev/の後に指定

↓ パーティションを作る
Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): [Enter]
First sector (2048-268435455, default 2048): [Enter]
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-268435455, default 268435455): [Enter]

Created a new partition 1 of type 'Linux' and of size 128 GiB.

↓ 変更を保存（実行）
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

↓ 確認
$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 365.5M  1 disk
sdb      8:16   0     1G  0 disk [SWAP]
sdc      8:32   0   128G  0 disk
└─sdc1   8:33   0   128G  0 part  ← 出来上がったパーティション
sdd      8:48   0   256G  0 disk /mnt/wslg/distro
```
ファイルシステムとして `ext4` でフォーマットします。
```:WSL
$ sudo mkfs -t ext4 /dev/sdc1  ← フォーマットするパーティションを指定
```

フォーマットが終わったら一旦WSLよりアタッチを解除します
```:PowerShell
PS C:\> wsl --unmount \\?\C:\Users\ユーザー名\VHDファイル名.vhdx
```
これでWSLで利用するためのVHDが用意できました。

## WSLで作成したVHDをマウント
```:PowerShell
PS C:\> wsl --mount --vhd \\?\C:\Users\ユーザー名\VHDファイル名.vhdx --partition 1 --name ディレクトリ名
```
`ディスクは  '/mnt/wsl/ディレクトリ名' として正常にマウントされました。`
と表示されれば上記の場所としてマウントされアクセスすることができるようになります。
パーティションを複数作っている場合は「 --partition 2 --name 別ディレクトリ名」といった具合に各々マウントします。

パーティションを設けない場合は、「fdisk」は使用せず「mkfs」で対象をext4フォーマットしてください。
```:PowerShell
PS C:\> wsl --mount --vhd \\?\C:\Users\ユーザー名\VHDファイル名.vhdx --name ディレクトリ名
```
`wsl --mount` であらかじめマウントをしておく必要があるので、バッチファイルでまとめておくと良さそうです。

# 最後に
保存先を別の仮想ハードディスクに変更して、制作したデータやDBなどの格納先としておけば、バックアップ等も容易になるのではないかと思います。
また、他のディストリビューションでも使いたいといった時にも便利かもしれません。
aws lightsail アップグレード

DNS浸透も気にする必要もなく、30分もあれば余裕

参考
https://infltech.com/articles/JXAU9N

# 流れ

1.アップグレードしたいサーバーを停止しスナップショットを作成
2.新しく好きなスペックでサーバーを立てる
3.1を復元

# 1 サーバーを停止して、スナップショットを作成

管理画面から当該サーバーを停止し、スナップショットを作成。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/3300ff34-2e24-b0eb-58dd-843722f0eb1f.png)

# 2 オレンジのマークをクリックし、 create new instance をクリック

1で取得したスナップショットを自動で復元してくれる

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/4764fafa-c520-e4a3-b704-4ad397cde0ae.png)

# 旧サーバーにログインし、固定IPアドレスをデタッチ 

IPアドレスが、旧サーバーに向いているので、
1.旧サーバーでIPをデタッチ
2.新サーバーでアタッチ

をする

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/2b4d4e2d-7794-57f7-6919-00caff393d80.png)

# firewall 設定

80,443 ポートを追加する

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/873e0399-b10b-240c-b19f-4f9d692aea60.png)


# 旧サーバーからドメインを削除

ゴミ箱アイコンをクリックしてドメインを削除する

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/84c38aeb-9ba9-e1b7-6a85-77bacbd5a1f1.png)

# 新サーバーにドメインを追加

新サーバーのAssign domain をクリックしてドメインを追加

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/d7b2568e-d085-2d77-8967-485f8e17c532.png)

`サーバー移管完了`

ここで注意したいのが旧サーバーの情報等を動的IPアドレスで設定をしているとき、IPアドレスが変わる場合があるということ。
以下、確認しておこう


・laravelの`.env`が読み込めるか？

```
php artisan config:cache
rm -f bootstrap/cache/config.php
```

でキャッシュをクリアする


・MYSQLを外部接続している場合は、固定IPが許可されているか？
・FTPサーバーは固定IPで設定されているか？
・sendgridを使っている場合、IPアドレスは許可されているか？

（上記、されていなければ適宜許可）

:::note info
OK
:::
Google Colaboratory ショートカットメモ

# はじめに
自分用にまとめた、Google Colaboratoryのショートカットと定型作業のメモです(随時更新)。

## 主要ショートカット一覧(Windows限り)

 内容 | ショートカットキー 
-|:-:
1.上にコードセルを挿入|Ctrl + M + A
2.下にコードセルを挿入|Ctrl + M + B
3.セルの削除|Ctrl + M + D
4.コード→テキストに変更|Ctrl + M + M
5.テキスト→コードに変更|Ctrl + M + Y
6.セルの実行|Ctrl + Enter
7.セルの実行+次に移動|Shift + Enter  
8.全セルの実行|Ctrl +F9
9.上のセルをすべて実行|Ctrl + F8
10.下のセルをすべて実行|Ctrl + F10
11.実行の中断|Ctrl + M + I
12.出力の表示/非表示|Ctrl + M + O
13.作業を戻す|Ctrl + Z
14.作業を進める|Ctrl + Shift + Z
15.ランタイムの再起動|Ctrl+ M + .
16.保存|Ctrl + S
17.別のノートを開く|Ctrl + O
18.ショートカット一覧表示|Ctrl + M + H
19.コード予想|Tab
20.コメントの追加|Ctrl + Alt + M

## 定型作業
#### Colaboratoryの既存モジュール確認
```Python
!pip list #左を入力すると以下が表示される
#Package                       Version
#---------------------------------------------------
#absl-py                       1.3.0
#aeppl                         0.0.33
#aesara                        2.7.9
```
#### ファイルアップロード方法
- **URL**: https://blog.kikagaku.co.jp/google-colab-file

#### 新ライブラリのインストールを一回にする
- **URL**:https://ggcs.io/2020/06/22/google-colab-pip-install/
- **要約**: Google drive内にライブラリを!pip install、sys.path.append(ディレクトリ)で呼び出す。


## 有益な情報
#### Google Colaboratory有料版と無料版の違い
- **URL**: https://blog.kikagaku.co.jp/google-colab-newplan
- **要約**: 月1000円で高性能GPU使用可+24時間連続使用、月5000円もある。


以上
window terminal で wsl を起動して ssh するまでのプロファイルを作成した

# はじめに
wslからsshする際、いちいちコマンドを書くのが面倒なので、プロファルに登録した話
これをすれば、windows terminalからボタン1つでサーバに接続できる

# 実行環境・準備物
- wsl2
- Ubuntu 20.04
- windows terminal 1.15.2874
- 接続したいサーバの秘密鍵

windows terminal を使ったwslの実行環境整備方法はここでは割愛する
詳細は以下の公式ドキュメントを参照して欲しい
[Windows ターミナルとは](https://learn.microsoft.com/ja-jp/windows/terminal/)
[WSL を使用して Windows に Linux をインストールする](https://learn.microsoft.com/ja-jp/windows/wsl/install)


# 設定
- [Ubuntu 20.04に秘密鍵を置く](#ubuntu-2004に秘密鍵を置く)
- [windows terminal にprofileを設定する](#windows-terminal-にprofileを設定する)
## Ubuntu 20.04に秘密鍵を置く
場所はデフォルトユーザから読めればどこでも大丈夫
今回はとりあえずホームディレクトリにおいておく
```
$ ll ~/ | grep .pem
-r--------  1 user user  1678 Nov 11 00:31 ssh_test.pem
```
ちなみにエクスプローラーからwslにアクセスしたいときのパスは以下のようになる
```
\\wsl$
```
## windows terminal にprofileを設定する
設定方法は2パターン存在する
- [terminalの設定から登録する場合](#terminalの設定から登録する場合)
- [設定ファイル(json)に直接書き込む場合](#設定ファイルjsonに直接書き込む場合)

個人的には前者がおすすめ(GUIDを生成するのが面倒なので)

### terminalの設定から登録する場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1586001/2ea4e0b1-20a2-e628-d8a7-9d969a406103.png)
- 名前 にはひと目見てわかるものを登録しよう(接続先サーバのホスト名などを書いておくとわかりやすい)
- {user_name} には接続先サーバのユーザ名を入れる
- {ip_adress} には接続先サーバのipアドレスを入れる

設定完了後に「保存」ボタンを押すこと

```shell:コピペ用のコマンド
wsl.exe ssh -i "ssh_test.pem" {user_name}@{ip_adress}
```

### 設定ファイル(json)に直接書き込む場合
下記の内容を追記
```json:setting.json
{
    "profiles": 
    {
        "list": 
        [
            {
                "commandline": "wsl.exe ssh -i \"ssh_test.pem\" {user_name}@{ip_adress}",
                "guid": "{生成したguid}",
                "hidden": false,
                "name": "ssh template profile",
                "startingDirectory": "\\\\wsl$\\Ubuntu-20.04\\home\\user"
            }
        ]
    }
}
```
guidを必ず書かなくては行けないので、以下のツールなどを使って生成しておく
https://hogehoge.tk/guid/

# 接続
以下のようにプルダウンメニューで表示されればOK
クリックするだけで接続できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1586001/c3f7ef7a-e25a-3f34-40b0-7f988fb35ad6.png)

# まとめ
非常に初歩的な内容ではあるが、windows terminal のsshについてまとめてみた
実はwindowsデフォルトのsshクライアントでも接続できるのだが、表示崩れが多かったのでwslで実行することにした
個人的に windows terminal には可能性を感じているので、今後もwindowsのデフォルトターミナルとして頑張ってほしい
【Unity】スクリプトでlocalpositionを変更できない時の対処法


- [はじめに](#はじめに)
- [環境](#環境)
- [やりたいこと](#やりたいこと)
- [スクリプトからlocalpositionを変更できない](#スクリプトからlocalpositionを変更できない)
- [解決策](#解決策)
- [おわりに](#おわりに)
- [参考](#参考)

# はじめに
アニメーションがついてるときに、localPositionが移動できないエラーの解決法です。
調べても解決策がすぐにでなかったため、寄稿します。

# 環境
- OS: Windows 11 Home
- バージョン: 21H2
- Unity Editer Version: 20203.27f1

# やりたいこと

シーン内に置いているドット付き16分音符オブジェクトの名前変更、ポジション移動、スケール移動を以下のスクリプトで制御しようとしています。関数自体は、GameManager.csから動かしています。

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using MusicXml;
using MusicXml.Domain;

public class TestClass: MonoBehaviour
{
    public GameObject _SixteenthNote; // 16分音符
    public void TestCreateScore (){
        GameObject NoteOrRest = GameObject.Find("eighth_note_dotted");
        NoteOrRest.name = "test_note";
        NoteOrRest.transform.localPosition = new Vector3(0.5f,0,0);
        NoteOrRest.transform.localScale = new Vector3(0.7f, 0.7f, 0.7f);
    }
}
```
オブジェクトは以下のアセットをアセットストアからとってきて使っています。

https://assetstore.unity.com/packages/3d/characters/the-notes-17964

# スクリプトからlocalpositionを変更できない
実行すると以下のGifのように、上に飛んで行ってしまいます。想定している挙動はx座標を0.5動かすだけなので、文字通りぶっ飛んだエラーです。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917913/4ee5b18d-fc2b-3ea8-d65b-4d62356df4c3.gif)

よく見ると、名前とスケールの変更はできていますが、localPositionの値が変わっていません。

# 解決策
音符オブジェクトに付いているAnimaterコンポーネントの"Apply Root Motion"のチェック外し、Note Animator Controll(Script)コンポーネントを無効化して実行すると、上手く行きました。

![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917913/149a525d-c4de-8065-74d1-f478f8079e39.gif)

どうやら、"Apply Root Motion"がOnだと、アニメーションによる位置の制御がスクリプトより優先されるらしくバグっていたようです。"Apply Root Motion"をOffにすればアニメーションによる位置移動は行われず、スクリプトから動かせるようになります。

また、Animator Controll(Script)コンポーネントはアセットに含まれていたものでキーボードでのアニメーションのコントロールなどを行っていたらしく、これとアニメーションが競合して、上に飛んで行っていた模様。詳しくスクリプトを読んでないので詳細は不明。重力をオフにしているのも原因かもしれません。

# おわりに
簡単な動作ですが、1日ほど詰まりました。きつい。


# 参考
https://light11.hatenadiary.com/entry/2019/04/18/003100
[m1 mac]rbenvでRubyをインストールするとBUILD FAILEDが出た際の解決方法

# はじめに
rbenvで他のバージョンをインストールした時に、はまったので共有しようと思います。

# 経緯
rubyのバージョンを2.5.3で合わせる必要があり、rbenvでインストールすると下記のエラーが発生しました。

```
rbenv install 2.5.3

Downloading ruby-2.5.3.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.3.tar.bz2
Installing ruby-2.5.3...

WARNING: ruby-2.5.3 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.

ruby-build: using readline from homebrew

BUILD FAILED (macOS 12.5.1 using ruby-build 20220910.1)
```

# なぜ起きたのか？
調査するとどうやら、ruby-buildがビルド時にhomebrewのバージョンを使おうとするため、readlineに問題があるという警告がでて、BUILD FAILEDが発生したようでした。


# 問題解決
以下のようにrbenv installの前にオプションをつけると私の場合は、無事インストールする事ができました。

```
RUBY_CFLAGS="-w" rbenv install 2.5.3
```

# RUBY_CFLAGSとは？
デフォルトのCFLAGS(C言語のコンパイラオプション)へ追加オプションを渡すことを可能にしてくれます。
-wとすることで、**コンパイラからの警告メッセージを出力しないように設定する事**で例外が発生せず、インストールする事が可能になったと思います。

# まとめ
無事インストールできましたが、今回はRUBY_CFLAGS="-w"とする事でインストールは完了してますが、ruby-buildがビルド時にhomebrewのバージョンを使おうとするため、readlineに問題がある事への解決には至ってない為、解決できれば共有していこうと思います。


参考記事
[Installation issues with Arm Mac (M1 Chip) #1691 - GitHub](https://github.com/rbenv/ruby-build/issues/1691)
[cc コンパイラオプション](https://docs.oracle.com/cd/E19957-01/806-4836/ccOptions.html)
スマホで取得した位置情報から滞在判定をするには

## スマホで位置情報を取得すると

緯度/経度(lat/long)が取得される。

```js
lat: 35.67750, lon: 139.76610
```

これを連続で取得すると
```js
[
  {lat: 35.67750, lon: 139.76610},
  {lat: 35.67748, lon: 139.76618},
  {lat: 35.67747, lon: 139.76621},
  {lat: 35.67745, lon: 139.76631},
  {lat: 35.67740, lon: 139.76653},
  {lat: 35.67736, lon: 139.76674},
  {lat: 35.67735, lon: 139.76679},
  {lat: 35.67732, lon: 139.76697},
  {lat: 35.67728, lon: 139.76717},
  {lat: 35.67724, lon: 139.76737},
  {lat: 35.67709, lon: 139.76779},
  {lat: 35.67708, lon: 139.76779}
]
```

こんな感じになる。

しかし、これだけだと、ただの位置情報の羅列。
滞在した箇所と、移動していた箇所を整理したい、

## 考え方

上記で取得できる位置情報データをイメージにすると、こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/11347bba-29a9-f713-1b37-7b2985c82a38.png)

なんとなく視覚的にすると、この辺りが滞在していたのかな？と考えられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/69240008-dd87-f64b-bf57-a3a520976365.png)

- 判定に使う情報
    - 緯度経度（lat/long)
    - 取得時間（timestamp）

取得時間をつけると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/16edafa6-f1cd-abcc-047b-95b2a543c0a7.png)

ここも滞在していたことがわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/53d590b8-cbe9-0265-5e8f-c12f1fe8a593.png)

## アプリに組み込むときに気をつけること

#### スマホで取得する位置情報は急に、実際の滞在場所ではない場所を記録する。

スマホは、GPSやWifiなどを利用して位置情報を取得するのですが、建物の中外や、Wifiが切り替わるタイミングなどで急に外れたポイントを記録します。

*対応方法*
`緯度経度（lat/long)` と `取得時間（timestamp）` から移動速度を取得して、急に `200km/h` とかになると外れ値として、判定から除外する。
前後の速度と比較して、10倍以上になると、大体外れ値でした。

#### スマホが休んで、位置情報を記録しなくなる。

バックグラウンドで取得しているときに、位置情報が取得されていないポイントが複数箇所存在。
AndroidとiPhoneでも記録のタイミングや休みポイントが異なります。

*対応方法*
位置情報が取れていない場合は、ほとんど諦めるしかないです。
写真などの位置情報から補間しています。


#### バッテリー消費が激しい

位置情報を高精度で取得し続けると、バッテリー消費は激しくなります。

*対応方法*
用途に応じて、取得する精度を調整することでバッテリー消費を抑えることができます。
自己紹介

自己紹介用の投稿
作成途中です。今後拡張していきます。
AWS内にデータレイクを作り、データ分析基盤を作成中です
データレイク活用先として機械学習やBIツールについても学習中

好きなAWSサービス： Glue, SageMaker, QuickSight, LakeFormation
【HTML+CSS】文字の前後のみに下線を引いたタイトルを作る

## はじめに
はじめまして．qiita初投稿になります．  
現在，自身のWebサイトをリニューアルしようとしているのですが，そのなかで考えた「文字の前後のみに下線を引いたタイトル」の実現に少し手間取り，またそれに類似したサンプルコードも見当たらなかったため，備忘録的にまとめておきます．
## 作りたいもの
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2927950/d4c5784c-3fab-158b-0dc3-7dcd04f894dd.png)
こんな感じで，文字の前後に下線を引きたい．
## 最初に試したこと
疑似要素に下線を引いた．

<p class="codepen" data-height="300" data-default-tab="css" data-slug-hash="RwJVVKR" data-user="tar0wn3" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/tar0wn3/pen/RwJVVKR">
  index_main_heading_1</a> by Protaetia (<a href="https://codepen.io/tar0wn3">@tar0wn3</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

こうすると，h2要素のwidthは親要素の左側10px+10%から右端まで広がり，after疑似要素は右端からh2要素の左端まで伸びるため，左側の下線はうまく引けているが右側は文字の下まで引かれてしまう．  

かといってh2の文字部分の幅は取得できない為，h2の文字の右側までだけafter疑似要素を伸ばす，といったことはできそうにない．  

**そこで，疑似要素を使うのは諦め，タイトル部分を3つのdivに区切ってみた．**
## 出来上がったもの
<p class="codepen" data-height="300" data-default-tab="css" data-slug-hash="KKemoWj" data-user="tar0wn3" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/tar0wn3/pen/KKemoWj">
  index_main_heading_2</a> by Protaetia (<a href="https://codepen.io/tar0wn3">@tar0wn3</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

無理やりで，かつあまりきれいなコーディングではないかもしれないが，作りたかったものは実現できた．
SQLの基本となる4大命令

エンジニア転職に成功し、改めて基礎的な勉強をやり直しています。
ほぼすべてのWeb開発で必要となる、SQLの4大命令についてまとめました。


検索系
1\. SELECT

更新系
2\. UPDATE
3\. DELETE
4\. INSERT

それぞれの命令が、Webアプリの基本とされるCRUD機能に対応しています。
 * CRUD…アプリに必要とされる基本的な4要素の頭文字をつなげたもの
     * Create…INSERT文に相当する
     * Read…SELECT文に相当する
     * Update…UPDATE文に相当する
     * Delete…DELETE文に相当する



1\. SELECT
テーブルから目的のデータを指定して取得する。

基本構文
SELECT 列名…
　FROM　テーブル名
(WHERE修飾)
(その他の修飾)



2\. UPDATE
既にテーブルに存在するデータを書き換える。

基本構文
UPDATE　テーブル名
　SET　列名1 = 値1, 列名2 = 値2…
(WHERE修飾)


3\. DELETE
既にテーブルに存在する行を削除する。

基本構文
DELETE
　FROM　テーブル名
(WHERE修飾)


4\. INSERT
テーブルに新しいデータを追加する。

基本構文
INSERT INTO　テーブル名
　　　　　　　(列名1, 列名2, 列名3…)
　　　VALUES　(値1, 値2, 値3…)

 ### まとめ
ほとんどのWeb開発では、データベースとのやり取りが必須です。
今回まとめた4大命令を直接書くケースもあるし、フレームワークによってはSQL文を書く必要が無いケースもあります。

しかしSQL文を実際に描かない場合でも、内部的には4大命令を用いたデータベースとのやり取りは行われています。
そのため、「このコードを書くことで、INSERT ○○の命令が実行されるな…」といったイメージを持ちながら開発を進めるのが大事だと思いました。
ブック間コピペの罠

あるレンジを別ブックにペーストしようとしたときのどん詰まり備忘録です。

OK例
```vba
db.Activate
Set copytarget = Range("A1:D32")
copytarget.Copy

newdb.Activate
Range("A1").PasteSpecial xlPasteFormulasAndNumberFormats
Set deletetarget = Range("B2:D32")
deletetarget.Delete
```

NG例
```vba
Set copytarget = Range("A1:D32")
Set deletetarget = Range("B2:D32")

db.Activate
copytarget.Copy
newdb.Activate
Range("A1").PasteSpecial xlPasteFormulasAndNumberFormats
deletetarget.Delete
```
どうやら、いちいちアクティブ化しないといけないっぽいです。面倒ですねぇ。
【Python3】Decimal.quantizeを用いて小数点第○位以下を四捨五入

# 何の記事？

Python3で小数点以下を丸める関数にroundがありますが、
浮動小数点演算の問題により四捨五入が正確に行われない
場合があります。


```python
f = 2.675
 
print(round(f, 2))
```

実行結果：

```python
2.67
```

本当は2.68にならなければなりませんが切り捨てされてしまっています。この事象に対する対策です。


# Decimalを用いる方法

Decimalを用います。

```python
from decimal import Decimal, ROUND_HALF_UP

def my_round(x, d=2):
    p = Decimal(str(x)).quantize(Decimal(str(1/10**d)), rounding=ROUND_HALF_UP)
    p = float(p)
    return p

print(my_round(2.675, d=2))
```

実行結果：

```python
2.68
```
RPAMISSIONのお題「ページ内の文字列を取得」をPowerAutomateDesktopで行い、取得できた。


[RPA MISSION](https://rpa.shima-soft.com/)のお題「[ページ内の文字列を取得](https://rpa.shima-soft.com/missions/get_span_text/summary/)」をやってみた。
PowerAutomateDesktopでページ内の文字列を取得してみた。
処理にかかった時間は4.84秒・・・意外とかかりますね。
フローの作成には20～30分ほどかかりました。
もう少し改良して、3秒以内を目指したい。

今回の実行したフローは以下です。

フロー全体は以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/3bba076f-aef0-dd41-f8bd-2757d6b994f3.png)

フローの詳細は以下です。

1.新しいChromeを起動する
まずはお題ページからパラメータを取得する必要があるので、Chromeのインスタンスを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/b0d828fb-fc92-47f0-72d1-279e23b3ef0b.png)

2.WEBページのボタンを押します
「ミッション開始」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/56eee6da-d725-8416-5400-cc919af3b093.png)

3.WEBページ上の要素の詳細を取得します
「パラメータ」欄からミッション用のURLを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/89433372-4bff-c9a3-eab2-b96d66fe9290.png)

4.新しいタブを作成
ミッション用のURLを新しいタブで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/3624b847-c1dd-4d8f-f8cf-4e4ebed0cafe.png)

5.WEBページ上の要素の詳細を取得します
ミッション用のページから文字列を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/0e24a760-61ac-6557-4807-aeab237d522e.png)

6.WEBページ内のテキストフィールドに入力する
取得した文字列を「解答」欄に入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/0f7a64e9-3a61-5389-f278-4d79e9d54e68.png)

7.Webページのボタンを押します
「回答送信」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/8ef8e524-b334-d474-530c-0c3b0d864e8d.png)

フローの詳細は以上です。
【Docker】no space left on deviceエラーについて

# エラー内容
コンテナをビルドしようとすると、以下のようなエラーが出力された。
```
ERROR: Error processing tar file(exit status 1): write /db/mysql_data/mysql.ibd: no space left on device
```
以下のコマンドでディスクの空き領域を調べてみるとどうやらdockerのコンテナやイメージがディスクを占有し、空き領域が無くなってきているようだ。
```
$ docker system df

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          18        1         4.594GB   4.592GB (99%)
Containers      1         0         178.8MB   178.8MB (100%)
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B
```
# 対処法
docker system pruneを実行すると、実行していないコンテナやイメージを一括して削除することができる。
```
$ docker system prune
```
以下の警告が出るので y と入力。
```
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y
```
ちなみにpruneは「プルーン」と発音し、食べ物のプルーン（干したプラム）という名詞としての意味もあるが、ここでの意味は「余分なものを取り除く」という動詞としての意味。また、食べ物のプルーンという意味と動詞としての意味は、語源が別のようだ。
参考：カリフォルニアプルーン協会「プルーンQ&A」　https://www.prune.jp/about/qa



そんなことを考えながら再度、ディスクの空き領域を確認すると、スッキリした感じになっていることがわかる。
```
docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          5         0         2.433GB   2.433GB (100%)
Containers      0         0         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B
```
これでコンテナをビルドすると、問題なくビルドされた。
【Java】toCharArrayメソッドで2バイト文字が渡ったときの扱い

# はじめに
Java問題集を解いていて、疑問に思ったことを調べたメモ書き
基本情報技術者試験H27年度春期午後問11「セキュアプログラミング」の設問1,dについて

## 1. char型からint型へのキャスト
この問いでは、char型からint型へのキャストも気になったので触れる。
### 1. 以下の記事を参考にした
https://qiita.com/nkojima/items/d358f99efa71655911ea

 ~~char型は1バイト文字を扱うための型で、intは通常２バイト以上らしい。~~
(2022/11/15訂正：javaの場合、charは２バイト、intは4バイトです) 

小さいほうから大きい方へキャストするだけなので、可能とのこと。（符号ありの場合など例外あり）

## 2. toCharArrayメソッド
String型の変数でtoCharArray()メソッドを使用し、
`char[] chars = s.toCharArray();`

のように使用して、文字列を文字配列に置き換えたあと、１文字ずつに対して何らかの処理を行う際に用いる。
この時に、String型の変数の中に漢字などの2バイト文字が入っていたらどうなるか？と迷ってしまった。

結論としては、２バイト文字を変換すると、charの配列の1要素に2バイト分のデータが詰め込まれるようである。
配列の要素2つ分を使って格納するのかな？とも考えていたので迷った。

# まとめ
toCharArrayメソッドで2バイト文字を渡すと、格納先がchar型配列ならば1要素に詰め込まれるみたい。
エンコードのプログラムとかで役に立つかも。
~~char型配列の1要素に2バイトの文字なんて入るのか？という新たな疑問が産まれた。~~
【React】normal exportとdefault exportについて

reactのexport方法にはnormal exportとdefault exportの2種類ある。
違いは以下の点。


## normal export

(exportするコンポーネント側の記述。今回はMainComponentというコンポーネントをexportしたいものとする。)
```
export const MainComponet = ( ) => { };
```

(importするコンポーネント側の記述)
```
import { MainComponet } from ‘./MainComponet’;
```

normal exportの場合、MainComponetをexportするときにconstの前にexportをつけ、importする時にそのコンポーネント名を{ }で囲む。
また、**normal export の場合、importしたいコンポーネント名はexportしたコンポーネント名と一致していなければエラーになる。**
なので、import { MainComponet } from ‘./MainComponet’;の中の{ MainComponet }は、{ SubComponet }のようにコンポーネント名を変更することはできない。



## default export

(exportするコンポーネント側の記述。今回はMainComponentというコンポーネントをexportしたいものとする。)
```
const MainComponet = ( ) => { };

default export MainComponet;
```

(importするコンポーネント側の記述)
```
import MainComponet from ‘./MainComponet’;
```

default export の場合、MainComponetをexportするときは、default export MainComponet とし、const の前にはexportはつけない。
また、importするときは、{ }でimportするコンポーネントは囲まない。
さらに、importしたいコンポーネント名はMainComponetになっているが、変更することもできる。
なので、import MainComponet from ‘./MainComponet’;の中のimport MainComponetをimport Subcomponetとしても良い。



***注意点***

できるだけ**normal exportを使用した方が良い。**
理由は、**default exportだと、import したいコンポーネント名が異なっていてもそのことに気づかなかったり、他のコンポーネントをimportしている可能性があるため。**


## as について
normal exportでコンポーネント名を変更したいときは、import 時にasを使用すると、コンポーネント名を変更することができる。

（MainComponentをSubComponentという名前に変更し、importしたいとき）
```
import { MainComponent as  SubComponent } from './MainComponet’;
```
PUDB_TTYを指定してPuDBを使う

# 免責
この記事に従って発生した如何なる損害も筆者は負うことができません。ご免なさい。

# 目的
私はCLIでpythonスクリプトをデバッグしたいので、PuDBというデバッグツールを使っています。
PUDB_TTYを指定してPuDBを使うときに少し苦労したので、インストール方法を残しておきたいと思います。

# PUDB_TTYを指定する場合のPuDBのインストール方法
現時点で最新の<font color=orange>pudb==2022.1.3</font>では、PUDB_TTYを指定するとurwidでエラー<font color=red>(ValueError: I/O operation on closed file.)</font>が発生するようです。
エラーを回避するために<font color=blue>pudb==2021.2.2</font>をインストールします。
```shell-session:インストール
$ python3 -m pip install --user pudb==2021.2.2
```
# PUDB_TTYを指定してPuDBを使う
PUDB_TTYを指定してPuDBを使うには、次のようにコマンドを実行します。
```shell-session:デバッガを操作するターミナル
$ tty; sleep inf
/dev/pts/4
```
```shell-session:スクリプトを動かすターミナル
$ PUDB_TTY=/dev/pts/4 TERM=vt100 python3 -m pudb ./test.py
```

# PuDBのアンインストール
PuDBを削除するには次のようにします。
```shell-session:アンインストール (PuDBのみ)
$ python3 -m pip uninstall pudb -y
```
```shell-session:アンインストール (依存関係も含めた場合)
$ pip-autoremove pudb -y
```
```shell-session:アンインストール (キャッシュも依存関係も含めた場合)
$ pip-autoremove pudb -y
$ python3 -m pip cache purge
```
# 参考
[Python の CUI デバッガ「PuDB」の紹介と使い方](https://qiita.com/Kernel_OGSun/items/144c8502ce2eaa5e4410)
https://documen.tician.de/pudb/starting.html#debugging-from-a-separate-terminal
paiza.ioでelixir その68

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
通帳に３００円あります。
１０００円、入金して、５００円、払い出しました。


# サンプルコード

```

defmodule Account2 do
	defstruct balance: 0
	def withdraw(account, delta) do
		%Account2{ balance: account.balance - delta }
	end
	def deposit(account, delta) do
		%Account2{ balance: account.balance + delta }
	end
end

defmodule Main do
	require Account2
    my = %Account2{balance: 300}
    |> IO.inspect
    my = Account2.deposit(my, 1000)
    |> IO.inspect
    my = Account2.withdraw(my, 500)
    |> IO.inspect
end


```

# 実行結果

```
%Account2{balance: 300}
%Account2{balance: 1300}
%Account2{balance: 800}

```

# 成果物

https://paiza.io/projects/RVPvnZnGpc4am1ABTGG0uw?language=elixir


以上。
Windows環境のセットアップメモ

# モチベーション
必須なのだけど、やる頻度が少ないので結構忘れがちになる作業の手順をいろいろとメモっておこうと思います。
次回やるときには使用変わってそうですが。

# 作業いろいろ

## キーバインドの変更

何よりかにより、まずはCapsの息の根を止めたい。
そして、MACと並行して使ているときに無意識にやってしまうので、「無変換」と「変換」で日本語入力になるようにしたい。

やり方はいろいろあるようで、長い目で見るとPowerToysを使うのが良いのかもしれません。
PowerToysはなかなか興味深い機能も入っていて、FancyZones（ウィンドウレイアウト配置）目的で入れていたこともあるのですが、アップデートが結構多く、ちょっと相手するのがめんどくさいなぁ、、という感がなくもない感じでした。
また、肝心のFancyZonesも、Sway/i3使う感じで使うと結構めんどくさいし。。
https://learn.microsoft.com/ja-jp/windows/powertoys/

他はというと、IMEを使う方法（Winodws 10の途中からNGに！）、それ用のツールを別途落としてくる、レジストリを手でいじる、などになるようです。
ちなみにIMEは、今でも「変換」「無変換」周りの変更はできるのですが、CTL/CAPSはできなくなったそうで。

ツールは、胡散臭い奴はやだなぁ、、と思っていたいのですが、どうやらMS配布のツールみたいですので、CTL/CAPSはそのツール、「変換」「無変換」はIMEで実施、としようかなと思います。

### Capsの無効化

https://learn.microsoft.com/ja-jp/sysinternals/downloads/ctrl2cap

ダウンロードして、解答して、「管理者権限で起動したcmd等で」ctrl2cap /installします。
フォルダにあるctrl2capをダブルクリックする方法でも利用条項がでるのですが、それだとインストールはされませんでした。。

![ctl2caps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/334ae62a-779f-bf6e-0319-3127fe220423.png)

↑これでAgreeしてもダメ。
ちゃんとCMDから/install付きで実行しないとダメでした。

### 「変換」「無変換」をIME on/offに

デスクトップの右下くらいにあるであろう「あ」や「A」のIME設定ボタンを右クリックして、「設定」。
「キーとタッチのカスタマイズ」より、設定ができますね。

![2022-11-13 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/240a391c-9a05-788e-efb2-195262ca8798.png)
![2022-11-13 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/0047658b-50cf-3dd0-155c-99c2253938f8.png)

## Chrome プロファイル指定の起動

デスクトップアイコンのショートカットから起動するときに、引数でprofileを指定する、というのが実装ですが、別に自分で作らなくても、Chromeから作れるのですね。
ショートカットから起動するときは、Profile名はChrome上で設定したものではなくて、中で自動生成されている(?)「Profile1」などになってしまうので、対応調べるのも面倒だし、素直にChromeのUIから作るほうが楽そうです。

![shortcut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/8cb255eb-94d4-90f9-26ab-63b1259191a7.png)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/dd29de63-f492-d220-83fd-6e42546a51a0.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/19f3c822-f7cb-dd26-c013-f767eb6fc66f.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/da25b031-d72a-7102-f0ff-3779a3049349.png)

ただし、ここで作ったショートカットは作成時のトグルを左に戻すとデスクトップ上からも消えます。
コピペして作ったショートカットも消されたりと、なんか少々気持ちの悪い連携しているので、ちょっと注意しておいたほうが良い感じはあります。

## 仮想環境

仕事で使う（個人ライセンスが使えない）時と環境をあまり変えたくないという思いでVirtualBoxを多用してましたが、最近はデスクトップ系を入れた際にとんでもなく重くなる（VMwareだとそんな感じはない）というストレスを感じることも増えてきました。

技術系の研修で仮想マシンを用意して参加する場合も、大体VMware Fusionを前提として環境が提供されることが多い気もします。
Linux環境もWayland対応してくれてない関係でVirtualBox使わなくしたということがあったりしますし、どうしたものかな。。

今度また使い勝手を調べてみようと思います。

## Git/Vim/(PowerShell)

今日は手が回らんので、後日再度整理しようと思います。

# まとめ
多分また1年後くらいに気が向いてPCをファクトリリセットするときに見るだろうなーという備忘録でした。

むしろ、PCベンダがつけてくるソフト群が紛れ込んでくるのがめんどくさいので、そっちを何とかしておきたい思いも強いですが。
Windows 11メディアで完全にクリアインストールすればいいのでしょうけれど、そうすると今度はOEMライセンスがちゃんと入るのかちょっと不安だし。
なんとも。
サービスプログラムを作成できるようになるまで（１）_サービスプログラムの前提

## はじめに

日頃プログラム開発をしている中で、頻繁にサービスプログラムを使用しています。
サービスプログラムは、どのプログラムからでも共通のロジックとして呼び出すことが可能で、仮にロジックに変更が必要になった際も、このサービスプログラムを修正することで全てのプログラムに反映することができます。

そんなプログラム開発をする上で欠かせないサービスプログラムの、一から学習した記録をシリーズに分けてご紹介します。

## サービスプログラムを作成する前に

サービスプログラムを作成する前に、まずはサービスプログラムが作成可能となった ILE（統合化開発環境）の考え方を知る必要があります。

ILE-RPG は以下の順でプログラム・オブジェクトが作成されます。（画像１）

1. ソース・メンバーからモジュールを生成する。`CRTRPGMOD`
2. 一つ以上のモジュールをバインドしてプログラムを作成する。`CRTPGM`

（画像１）
![createServiceProgram-01_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/7df6c553-ac3b-7936-c7ec-4c8f64aa58df.jpeg)

本来は ① モジュールの作成 ② モジュールからプログラムの作成、という二工程が必要ですが、単一のソース・メンバーからプログラムを作成する際は`CRTBNDRPG`を実行することで、この二つの工程を同時に処理することができます。

従来の考え方である OPM （Original Program Model）は、単一のソース・メンバーをコンパイルすることでプログラム・オブジェクトを作成するという一工程を実行しています。`CRTRPGPGM`（画像２）

（画像２）
![createServiceProgram-01_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/e12600dc-9b8b-83d4-24dd-60ffcfb10dfb.jpeg)


## サービスプログラムはなぜ実現可能なのか？

実は前述の内容には不足している部分があります。
正しくは、② のモジュールからプログラムを作成する際に、サービスプログラムもバインドすることが可能です。

つまり、単一のソース・メンバーからプログラムを作成する OPM に対して、複数のモジュール、及びサービスプログラムを組み合わせてプログラムを作成することが前提の、 ILE だからこそ、他のプログラムからサービスプログラムを呼び出すことが可能です。


## おわりに

今回はサービスプログラムの実現を可能としている ILE（統合化開発環境）についてご紹介しました。

最後までお読み頂きありがとうございます。

## 関連した投稿

[サービスプログラムを作成できるようになるまで（２）_サービスプログラムが実行される流れ](https://qiita.com/tamaday/items/6f25b6a0b4b9f2d252d4)
[サービスプログラムを作成できるようになるまで（３）_サービスプログラムの作成](https://qiita.com/tamaday/items/3aabbb492d01eb86bfe0)
[サービスプログラムを作成できるようになるまで（４）_サービスプログラムの実行](https://qiita.com/tamaday/items/a5181ed4faa9949e0707)
AndroidStudioのワイヤレスデバックがすこぶる便利だった話

Androidアプリ開発で実機を使う場合、たいていの場合、USBケーブルでAndroid端末と接続しますが、そのUSBケーブル邪魔だと思ったことありませんか？

常にAndroid端末を机の上に置きっぱなしならいいのですが、持ち上げたり、回転させたり、カメラでバーコードを読み込もうと思った時に、そのUSBケーブルが邪魔になります。かと言って、USBケーブルを外してしまうとAndroidStudioとのデバックができなくなってしまいます。

Android11からワイヤレスでバックというのが使えるようになり、USBケーブルの代わりにWi-Fi接続が使えるようになりました。これだとケーブルがないので、Android端末を回転、移動させる場合、邪魔なケーブルがないので、すこぶる便利です。是非、お試しください。

いつもの、設定から
→ システム
→→ 詳細
→→→ 開発者向けオプション
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/9733827b-e765-8910-2322-d43438b252d5.png">
ワイヤレスでバックを有効にします。
赤い枠の部分をタップすると、
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/4529b7f1-7e98-bd1b-ffd4-a04ce7aa83c3.png">
この画面が現れます。ここのQRコードによるデバイスのペア設定をタップすると、QRコードを読み込むカメラが起動します。

AndroidStudo側で、仮想マシンが表示されているドロップダウンリストをクリック。
Pair devices Using Wi-Fi
を選択
![and.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/6e9168b3-03a7-82c9-0408-ee484cfb84f3.png)
するとQRバーコードが表示されるので、このQRコードを先程のAndroid端末のカメラで読み取ります。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/e073bb3d-6373-154b-1050-6cc18bee99d4.png">

接続が完了すると、ペア設定済のデバイスの一覧に出てきます。
AndroidStudioの上側の仮想デバイスのドロップダウンリストに出てきます。
次からは、AndroidStudioを起動して、Android端末のWi-Fi接続を有効にするだけで繋がります。

これで、あの邪魔なUSBケーブルから開放されます。

我が家の場合はWi-Fiが不安定なのか、小刻みにワイヤレスでバックの切断/接続を繰り返す場合があります。(その日、時間帯によって、調子いいとき悪い時がある)なので、ワイヤレスでバックとUSBデバックを使い分けています。
AWS認定 SysOpsアドミニストレーター(SOA)の試験ラボについての自身の対策

# はじめに
先日合格したので、自分が行った試験ラボの対策を書いていこうと思います。

## 成績

合格ライン720に対して、735でかなりギリギリでした。
勉強される方は本記事以上のことをやっておいた方がいいという基準になるかと思います。

## 筆者スキル・経験
普段はAWS SAMやCloudFormationでLambda等のサーバレスサービスを作って試用しているだけです。
SOAの試験範囲のサービスは、上記のサービスを除きほぼ触ったことがないです。

# 試験ラボとは

公式の説明では以下のように記載されておりよくわかりませんが、私の認識は、「試験時に提供されるAWS環境上で、特定のシナリオをこなせるかを試す試験方法」になります。
> 試験ラボ: 提供された AWS アカウントの AWS マネジメントコンソールまたは AWS CLI で、特定のシナリオに必要なタスクを完了します。

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sysops-associate/AWS-Certified-SysOps-Administrator-Associate_Exam-Guide.pdf

選択式の問題に加え、この方式の試験がSOAにはあります。

# 準備
選択式の勉強方法に比べ、試験ラボの勉強方法はとても少ないので、私が行った方法を記載していきます。

## ピアソンVUEのサンプル（操作確認程度）
試験をピアソンVUEで申し込むと、申込内容の確認メールに無料のサンプル試験ラボの案内について記載されています。
これは、3回受けることができるようで、最初の試験から90日の間有効のようです。
ですが、私は2回受けましたが、同じ問題でした。そのため、試験ラボの雰囲気や手順を確認する、程度の位置づけになると思います。

若干わかりづらかったので、画面のスクショと一緒に手順を記載します。

1. メールにURLがあるのでアクセス。
1. 「トレーニングキーに登録」をクリック。
    - 再度利用する際は「Sign in」でユーザ/パスの入力になります。 
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/6ac635c5-a16e-4685-6770-3496200d2d1e.png)
1. メールに記載されているトレーニングキーを入力。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4c670e86-71e8-64c1-f9e7-ebb830f1fd40.png)
1. 自分の情報ではなく、<b>メールに記載されている各種情報</b>を入力します。
    - 名前、名字、メールアドレス、パスワード（記号含む）すべて、メール記載通りに入力します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/88ba17f7-c999-ff99-62a8-2e8f55e0820c.png)
1. 登録が完了すると、ホーム画面が表示されます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f1f4cc70-d689-b697-1c6b-b902f4183540.png)
1. アクティビティから、「起動」でサンプル試験ラボを開始します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e1e5b8b0-bea5-3930-1286-a30df48207ec.png)
1. 起動まで待ちます。3分ほどかかりました。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/43e4eb13-cd38-4926-f6fa-ba47b4d92136.png)
1. 起動後は画面に従って回答します。サンプルはすべて英語でした（実試験は日本語でした）。

## 試験ラボ対策問題

### AWS公式
AWS公式から、試験ラボの例として1問あります。例として挙げられている以上試験に出ることはないでしょうが、対策問題がなかったのでやりました。

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sysops-associate/AWS-Certified-SysOps-Administrator-Associate_Sample-Questions.pdf

### Udemy
Udemyの模擬試験にも、試験ラボの例がある講座がありました。その講座では最後の方に2問、試験ラボを想定した問題が入っており、それを見ながら自分のAWSアカウントで手を動かしていました。

:::note warn
本記事記載時点で、該当の講座は登録を行っていませんでしたので、講座名やリンクは載せないこととしました。
:::


### ハンズオン
一切と言っていいほど、行っていませんでした。

# （その他）選択式の対策
## 試験時間180分に向けた特訓
これもUdemyの模擬試験を使いました。問題の正答率も重要ですが、180分という長丁場に対してどう向かっていくか、という訓練も必要と感じたので、その観点で行っていました。

## 問題
選択式の問題については、TechStok（旧koiwaclub）を解いていきました。後半50セクションからよく出ると聞いたので、そこを繰り返して勉強しました。

https://techstock.jp/

また前日に開催された以下のイベントに参加していました。
未参加だったら合格していなかったかも…と感じています。

https://aws.amazon.com/jp/blogs/news/ssm-jireimatsuri-20221104/


# おわりに
試験ラボについての情報が少なかったので、自分の体験を記事にしてみました。
試験ラボはサンプル問題が本当に少ないので、「問題を解く」という勉強方法ではなく、ハンズオンなどを行っての対策がよいかと思います。

受験される方の助けになれば幸いです。
PDFファイルにあるベクタ画像・文字を抽出する．

## やり方
InkscapeでPDFを開くだけです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/49806351-9ef4-570e-029b-69e73124c002.png)
内部インポートは崩れるのでパスでインポート．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/66437d59-645e-51d6-c10a-f58d9a550e48.png)
必要な個所をマウスを引っ張って選択．コピー．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/abeda356-8f92-d998-36bb-a4ddd4db3875.png)
ファイル→新規→貼り付け→サイズの調整（下図）→保存(.svg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/6f916c5b-0909-f972-cec8-6aadaa0ed715.png)
保存されたSVG画像はベクタ画像なのでパワーポイントやワードにきれいに貼り付けられる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/5762b6f0-fd32-f3f0-b957-7873a3234249.png)


* Inkscapeのインストール(https://inkscape.org/ja/)
DOMの習得までの道のり(2/n)_DOMのノード構造

## シリーズ目次
この記事の続編です。

https://qiita.com/SayCheeese/items/1828f11c47ff26162b81

**DOMの習得までの道のり**
1. [やりたいことまとめ](https://qiita.com/SayCheeese/items/1828f11c47ff26162b81)
1. **DOMのノード構造**　（本記事）

## シリーズで解きたい課題
DOMを利用して、`<div>`の中に`<p>`で並んだ要素を、
`<ul><li>`を用いたリスト形式に変換したい

## 本記事の内容
1. DOMとは
1. DOMツリー

## 1. DOMとは [^1]
- JavaScript側からHTML(やXML)の要素を取得できるAPI
    - bodyタグを取得
    - id="content"のdivタグを取得
    - ページの全てのアンカーリンクを取得
- Document Object Model、略してDOM
- HTMLやXMLをオブジェクトの**ツリー上の集合体**として扱うことができる

## 2. DOMツリー
たとえば下記のようなhtmlの場合
```html: before
<html lang="ja">
  <head>
    <title>TEST</title>
  </head>
  <body>
    <div id="foods">
      <p>にんじん</p>
      <p>じゃがいも</p>
      <p>たまねぎ</p>
    </div>
    <button onclick="dispList()">リスト形式で表示</button>
    <script type="text/javascript" src="./scripts/test.js"></script>
  </body>
</html>
```
```mermaid
graph 
html---head
html---body
head---title
body---div
body---button
body---script
div---pにんじん
div---pじゃがいも
div---pたまねぎ
```

- DOMの取得では階層構造の一番上のDocumentオブジェクトからたどっていく
- HTMLのDOM構造の場合は、最上位の`Document`は`<html>`を指す
- 全てのHTML要素はDocumentオブジェクトに属する

## 実践
### 1.　buttonがクリックされたらdispList発動
```js
document.addEventListener("onclick", displayList);
```

<!-- ここからCodePen -->

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="LYryapb" data-editable="true" data-user="SayCheeese" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/SayCheeese/pen/LYryapb">
  FoodDOM_test03</a> by SayCheeese (<a href="https://codepen.io/SayCheeese">@SayCheeese</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

<!-- ここまでCodePen -->

### 1.　div要素の抽出
```js
const pp = document.getElementById("foods");
```

<!-- ここからCodePen -->

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="LYryapb" data-editable="true" data-user="SayCheeese" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/SayCheeese/pen/LYryapb">
  FoodDOM_test03</a> by SayCheeese (<a href="https://codepen.io/SayCheeese">@SayCheeese</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

<!-- ここまでCodePen -->

[^1]: 下記より引用
https://blog.yuhiisk.com/archive/2016/06/13/dom-re-introduction-1.html
SSH接続してコンテナを立ち上げるまでのコマンド（自分の場合）

# SSH接続
```
$ sudo ssh -i ~/.ssh/appname_key.pem ec2-user@固定IP
```
# dockerコンテナの立ち上げ
```
$ docker-compose -f docker-compose-prod.yml build

$ docker network create app_name-network

$ docker-compose -f docker-compose-prod.yml run app rails assets:precompile RAILS_ENV=production

$ docker-compose -f docker-compose-prod.yml up -d
```
# rails DB作成
```
$ docker-compose exec app rails db:create db:migrate RAILS_ENV=production

$ docker-compose exec app rails db:seed RAILS_ENV=production
```
# 参考　ファイルの転送方法
ローカルにて以下を実行
```
$ sudo scp -i ~/.ssh/app_name_key.pem ファイル名 ec2-user@固定IP:/home/ec2-user/
```
Zoomの「イマーシブ ビュー」を試してみた

zoomのイマーシブ ビュー（immersive view）というのは、よくテレビなんかで見る、別々の場所にいるのに、同じ場所にいるように合成される機能で、2020年から使えるようになったらしい。
現時点（2022/11/13）では、無料会員の私でも利用可能だった。
ちなみに、immersiveというのは、「没入感、実体感がある」とか「没入できる」という意味だそうな。

「設定」-「一般」-「さらに設定を表示」を選択すると、WEB画面に切り替わってイマーシブモードのスイッチが表示されるので、ONになっていることを確認する。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/922e70a2-8c66-0a92-52b0-cad06a85c2b5.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/9d7c40e4-da1a-8a29-c702-97259dad8128.png)

事前設定は以上。
早速、ミーティングを開始する。
今回は、以下の三者が参加（みんな離れたところにいると思ってね）。

![3b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/8b934854-e4a5-338f-e48a-031bd89e53dd.png)

主催者（今回はサル君）の画面右上の
「表示」-「イマーシブ ビューを変更」を選択するとダイアログが開くので、二人のビュー（Cafe ... カフェというよりキッチンっぽい）を選択してみた。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/7de5011a-800a-5285-3231-e732f30f78b0.png)

表示はこんな感じになる。きれいに合成されてるね。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/77b67320-ebae-2673-b723-05b22740fa35.png)

二人枠なので、最後にログインしたカエル君は、上に放り出されている。
かわいそうなので、今度は六人のビューを選択した。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/c5adea1a-75d6-53b3-39df-7a08930ce08b.png)

全員参加状態になった。今更なのだけど、ちょっと面白いかも。

対談みたいなのを放送したい時は、パネリストが先にログインしちゃうか、
別のパソコンでzoomをやっているのを、（hdmiでキャプチャしなおすとか、リモートデスクトップを使うなどして）再度流しなおすとよいのかな?
イメージにするとこんな感じ。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/8f92e59a-26d7-41d6-2946-9e72af595eb1.png)

後日調べてみたら、パネリスト席に入れる、入れないは、切り替えることが出来た。

「手動」を選択すると参加者名が表示されるので、「×」で消す、検索する、「V」を押して一覧から選択するなどで入れ替えが出来る。（下記、イメージ図）

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/f6818103-f363-6ce3-f230-8aad85bda392.png)

先日検討した、二重のzoom回線を用意しなくても良いっぽい。

なお、イマーシブ ビュー状態で、ビューから外された人が発言をしても、（スピーカービューと違って）スピーカーが大写しになることはないみたい。（発言自体は可能）
あと、イマーシブビューに切り替えることが出来るのはホストのみ。共同ホストにしても、右上に「表示」ボタンは表示されなかった。
ARM系マシンでx86系のDockerイメージを作成する方法

# はじめに
先日AWS公式ハンズオンとなる「[AWS ハンズオン資料](https://aws.amazon.com/jp/events/aws-event-resource/hands-on/)」の「[Amazon Elastic Container Service 入門　コンテナイメージを作って動かしてみよう](https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-ECS-2022-reg-event.html?trk=aws_introduction_page)」を試そうとした際、エラーで`ECS`のサービスがデプロイできない問題が発生したため、記事に残しておこうと思います。

# エラー内容
「はじめに」で紹介したサイトのアジェンダの「**サービスの作成**」で`ECS`サービスのデプロイを行った際、以下のようなエラーが表示されました。

::: note alert
h4b-ecs-service のデプロイ中にエラーが発生しました
Resource handler returned message: "Error occurred during operation 'ECS Deployment Circuit Breaker was triggered'." (RequestToken: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, HandlerErrorCode: GeneralServiceException)
:::

# エラーの原因
ハンズオンではAWS上でオンライン開発環境が利用できる`Cloud9`を使って、`Cloud9`のインスタンス上でコンテナイメージを作成して、そのイメージを`ECS`にデプロイする手順となっていましたが、私が実施した際は`Cloud9`環境を用意してイメージ作成するのも面倒だったので、自分のPC上でイメージを作成したのが原因でした。

その時使用したPCは`M2`の`MacBook Air`だったので、CPUアーキテクチャは`ARM`系、デプロイ先の`ECS`は`x86`系となることからアーキテクチャの違いが原因となったようです。

# 対処方法
`docker build`する際に`--platform`オプションでCPUアーキテクチャを指定するか`Dockerfile`の`FROM`でCPUアーキテクチャを指定することでビルド時に指定のCPUアーキテクチャでイメージを作成できます。

以下、AWS公式ハンズオン内で実行しているコマンドをCPUアーキテクチャ指定のコマンドに置き換えた場合の例。

```bash:docker_buildコマンドでCPUアーキテクチャを指定する場合の例
docker build --platform linux/amd64 -t xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1 .
```

```bash:DockerfileでCPUアーキテクチャを指定する場合の例
FROM --platform=linux/amd64 ubuntu:18.04
（省略）
```

AWS公式ハンズオンでは実行しておりませんが、`docker-compose`で実行する場合も以下のように`platform`で指定することでCPUアーキテクチャを指定できるようです。

```bash:docker-compose.ymlでCPUアーキテクチャを指定する場合の例
services:
  web:
    image: ubuntu:18.04
    platform: linux/amd64
(省略)
```

# CPUアーキテクチャが違うのにビルドできる理由
`M2`の`MacBook Air`で`Docker`を実行するために、`Docker Desktop`をインストールしていますが、`Docker Desktop`はCPUをエミュレーションできる`QEMU`が含まれています。

デフォルトでは`docker build`を実行するPCのCPUアーキテクチャでビルドされますが、コマンド指定や`Dockerfile`でCPUアーキテクチャを指定することで、ビルド時に指定のCPUアーキテクチャでビルドできます。

# おわりに
開発を行う場合はUnix系コマンドがネイティブで使える分`Windows`より`Mac`のほうがやりやすいと私は感じていますが、`ARM`系になってCPUアーキテクチャの違いで苦しめられることも増えているので、たまに`Intel`系`Mac`が恋しくなる今日このごろ。
AWS EC2のUbuntu RDP環境を複製したらインターネットにつながらなかった！

# せっかちさんに結論から
複製したUbuntuインスタンスのシリアルコンソールで`hostname -I`を実行しても何も表示されない場合、以下のコマンドで解決できた。

```bash
$ sudo dhclient -r ens5 #ens5のIPアドレスを削除
$ sudo dhclient ens5 #DHCPサーバから新しいIPアドレスを取得
```

# あいさつ

こんにちは、あぐらくんです。
ロボットを用いた初学者向けのSTEM教育の研究をしています。
その他、研究室でロボットのシミュレーション環境を構築したり、AWSやDockerなどの開発環境の構築をしています。

# 今回の記事を書くことになった経緯

今年度からTAをしている授業で履修者にUbuntu環境を使ってもらうことになりました。
Ubuntuを日常的に使っている学生なんかいないと思ってるので、EC2にRDP環境を構築して、そのインスタンスを複製して提供することにしました。

その際に複製したインスタンスがインターネットにつながらない問題がという起こったのですが、調べてもUbuntuで同じ問題に直面して解決した人を見かけなかったので、自分で備忘録的にこの記事を作成することしました。
初投稿ですが今後誰かの役に立てれば幸いです。

# 本題

まず複製元となるインスタンス（sobit_begin_sim_1）でUbuntuのRDP環境を構築しました。
インスタンスのステータスチェックが2/2になっていることが確認できたので、これでRDP接続ができるようになりました。
![success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726597/71c602cf-c550-e94d-63e4-ae8f4c20ecd8.png)

このsobit_begin_sim_1からAMIを作成して、コピーとなるsobit_begin_sim_2を起動します。
そしてそのインスタンスにもいざRDP接続！
![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726597/70b8c912-0fda-2f22-a6b7-0fa677f662c6.png)
え、、、？？
ちゃんとインスタンスは起動できたのに、、、
インスタンスのステータスチェックを確認してみるとsobit_begin_sim_2の方は「1/2のチェックに合格しました」という警告が出てました、、、泣
![compare_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726597/f0adac1e-7a62-399a-9a51-656fac21ca8a.png)
sobit_begin_sim_2のステータスチェックを詳しく見てみると接続性チェックに失敗してました！
![check_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726597/c49bdf85-7a68-190d-3c80-1cf5a165aa4f.png)

幸い、シリアルコンソールには接続できたのでいろいろと原因を調べてみることに、、、
`hostname -I`をしても何も出ないし、`ifconfig`でもインターネットに接続されている気配が見えないじゃないか！
<img width="720" alt="figure_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726597/b96c0258-b371-b40a-38ee-d194463e3df6.png">

もう少し詳しく`ip addr`で見てみるとens5とかいうのがいるけど、state DOWNとか書かれている、、、
こいつが原因なのか？？
<img width="1080" alt="figure_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726597/ecb1af32-7ed4-ca22-7880-3652c9dcc845.png">

ってことでsobit_begin_sim_1の方でも`ifconfig`をしてみたら、`hostname -I`でIPアドレスが出力されるし、`ifconfig`でもens5がインターネットに関与しているじゃんか！！
<img width="720" alt="figure_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726597/7d3cf464-9c71-06ce-34d5-e13cd45af4ae.png">

# 解決方法

そこからネットワーク初心者の私は解決策求めていろいろ調べまくった結果、
```bash
$ sudo dhclient -r ens5 #ens5のIPアドレスを削除
$ sudo dhclient ens5 #DHCPサーバから新しいIPアドレスを取得
```
とすることで解決することが分かりました！
<img width="720" alt="figure_4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726597/4b05e927-9b5f-57d9-b30f-531083e4ec92.png">

何やらDHCPサーバとかいうネットワーク設定を自動で配布するサーバ（？）があって、こいつは多分ハードウェア情報にも準拠するからAMIから複製したインスタンスだと互換性がなくてネットワーク接続ができなかったのかなと思います。
何はともあれこれで複製したsobit_begin_sim_2のステータスチェックも2/2の合格になって、RDP接続もできるようになりましたとさ。
<img width="720" alt="fix_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726597/9faaacc0-579b-3134-d3a7-d159c2e378ee.png">
<img width="1080" alt="figure_5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726597/d856dc2e-0c1d-40ab-e1f7-a0ff6fa3c895.png">

めでたし、めでたし
画像変換：EPS, SVG, PDF, PNG, JPGをEPS, PDFに一括変換【LaTeX】

## 画像変換
最初に断っておきますが，画像フォーマットの変更です．ビットマップ画像をトレースしてベクタ画像にするような変換ではありません．環境はWindowsです．
### やり方
* Inkscapeのインストール (https://inkscape.org/ja/)
* EPSを扱う場合はGhostscriptのインストール (https://www.ghostscript.com/releases/gsdnld.html)
* 新しいテキストファイルを作って，名前をconvert.batに変更．右クリック→編集から以下を貼り付け．
```convert.bat
@echo off
for %%f in (%*) do (
 "C:\Program Files\Inkscape\bin\inkscape" -p %%f -o %%~dpnf.eps
)
exit /B 0
```
* エクスプローラ上で変換したい画像をconvert.batファイルの上にドラック＆ドロップ．D&DしたファイルがすべてEPS
EPSに変換されます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/73c83860-ad87-d96d-a5f8-de75afef62af.png)
* **PDFやPNGに一括変換したい場合は"%%~dpnf.eps"の部分を"%%~dpnf.pdf", "%%~dpnf.png"としてください．D&Dする画像はInkscapeが対応していればなんでもよいです**．

## 注意事項
* 日本語を含むファイル名はだめです．
* inkscapeのパスは適宜変更してください．
* Ghostscriptは環境変数にパスを追加してください（https://syunsuke.github.io/r_prepare_for_repoco/ghostscript%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B.html）

## 補足
* EPSに拘る必要はありません．基本的にはLatexではEPSの代わりとしてPDFが推奨されています．EPSに指定されている場合などに本プログラムをご利用ください．
* バッチプログラムの動作について
```convert.bat
for %%f in (%*) do ( 
    ドラック＆ドロップをするとコマンドライン上ではconvert.bat file1 file2 f...のように実行される．
    %* 引数すべてを取得．%1引数の一つ目 %2...
    %%fにはD&Dしたファイルのパスが一つ一つ格納される．
 "C:\Program Files\Inkscape\bin\inkscape" -p %%f -o %%~dpnf.eps
    Inkscapeの画像変換．-p 変換元　-o　出力
    %%~dpnf fのパスの拡張子以外(https://orangeclover.hatenablog.com/entry/20101004/1286120668)
)
exit /B 0
```

## 参考資料
1. InkscapeでEPSファイルを一括で変換する方法 - きまぐれモノログ。， https://kimaguremono.hateblo.jp/entry/inkscape_cmd
1. 【Windows便利小ワザ】大量のフォルダをそれぞれ個別のZIPファイルに一括で圧縮する方法，https://rezv.net/technic/58567/
1. バッチファイルでファイルパスからファイル名や拡張子を自由に取り出す方法 - みちしるべ，https://orangeclover.hatenablog.com/entry/20101004/1286120668
AndroidStudioで「接続できません」への対応（備忘録）

Android Studioのインストール時またはアップデート時に「接続できません」のエラーが出たりプロキシの設定が出たり（プロキシ使ってないのに）した時の備忘録。
ネットワークが２つ（有線とWiFi）あると接続できなくなる場合がある。（正常に接続できる場合もある）
ネットワークは１つにしよう。（WiFiをOffにして、有線のみにするとか）