OmniAICreator/Qiita-1.07M huggingface dataset:
wslのローカルホストサーバをwindows上のサーバと同じように公開したい！！

# wslのローカルホストサーバをwindowsのサーバと同じように公開したい！！
皆さん、wslで立てたサーバーを同じローカルネットワーク上で見たいとか思いますよね？
例えば、webサイトの出来栄えをスマホで確認したい時など。
しかし、最近は全てwslでプログラミングを行うようになっていて、ネットワーク上から見ることができません。
そんなときは、これを実行します。
wslのlocalhostのポート3000をwindowsのポート3000として公開します。
あくまで同じネットワーク限定の公開です。
connectportを変更すれば、また別のwslのポートにも使えます。
リバースプロキシに管理者権限が必要なので、もらえていなかった場合は管理者権限を要求するようになっています。
※別途、3000受信のファイアウォールを切る必要があります

```bat:openwslwifi.bat
@echo off
setlocal enabledelayedexpansion

net session >nul 2>&1
if %errorLevel% == 0 (
for /f "tokens=2 delims=:" %%A in ('ipconfig ^| findstr IPv4') do (
	if defined IP (
		set "WSLIP=%%A"
	) else (
		set "IP=%%A"
	)
)

netsh interface portproxy reset
netsh interface portproxy add v4tov4 listenaddress=!IP! listenport=3000 connectaddress=127.0.0.1 connectport=3000

echo wsl localhost port 3000 to windows !IP!:3000

pause
) else (
	powershell  -command start-process %0 -verb runas
)
endlocal

exit
```
psqlで¥copyコマンドにパラメータを渡せない問題の対応策

公式ページに記載があるが、¥copy コマンドに対して variable interplation(or variable substitution)は使えない。

workaroundとして、コマンド文を組み立てる。

```:env.env
# Mac's psql install path.
SQL_EXEC=/usr/local/Cellar/libpq/[version]/bin/psql

# DB Connection Info.
POSTGRES_USER=postgres
POSTGRES_DB=postgres
POSTGRES_HOST=localhost
POSTGRES_PORT=5432

DB_CONNECT_STRING="-U ${POSTGRES_USER} -d ${POSTGRES_DB} -h ${POSTGRES_HOST} -p ${POSTGRES_PORT}"
# FILE_NAMES
FILENAME=/Users/username/dev/shell/sample.dat
```

```:data_load.sh
# env.envの中身を読み込む
. ./env.env
SQL_FILE=copyFrom.sql
${SQL_EXEC} ${DB_CONNECT_STRING} -f ${SQL_FILE} -v inputFile=${FILENAME}
```

```:copyFrom.sql
\set filename :inputFile

--\copyコマンドに変数代入はできない
--\copy temp from :inputpath;

\set command '\\copy temp FROM ' :'filename'
:command
```


## 参考URL
* [Variable substitution in psql \copy](https://stackoverflow.com/questions/24671177/variable-substitution-in-psql-copy)
* [PostgreSQL公式サイト](https://www.postgresql.org/docs/current/app-psql.html#APP-PSQL-META-COMMANDS-COPY)
VScode vim ヤンクしたデータをクリップボードに保存

# VScode vim ヤンクしたデータをクリップボードに保存

VSCode のメニューより
File > Preferences > settings
Search settings の入力欄に vim.use と入力し

Vim: Use System Clipboard
- [x] Use system clipboard for unnamed register. にチェックを入れる

![Screenshot from 2023-06-27 00-41-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278020/40c22200-f078-4d63-7ec6-8a41ee9f5939.png)

以上。
Ubuntu22.04LST Server セットアップ備忘録

最初からOpenSSHが入ってるので、ローカルでやることはない。

# 初期アプデ

```bash
sudo apt update && sudo apt upgrade
```

# IPアドレスを固定

```bash
# インターフェース名を確認
cat /etc/netplan/00-installer-config.yaml
# デフォルトのネットワーク設定ファイルを無効化
cd /etc/netplan/
ls
sudo mv 00-installer-config.yaml 00-installer-config.yaml.disabled
sudo vi 

# 以下サンプル
network:
    version: 2
    renderer: networkd
    ethernets:
        enp4s0:
            addresses:
                - 192.168.xxx.xxx/24
            nameservers:
                addresses: [8.8.8.8, 192.168.xxx.1]
            routes:
                - to: default
                  via: 192.168.xxx.1
# 以上サンプル

sudo netplan apply
```

# SSH公開鍵認証
- 接続するPCのid_rsa.pubをホームへコピー
- 新規接続にて公開鍵認証ができることを接続テストするまで、古い接続は切らないこと

```bash
ssh-keygen -t rsa
cat id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
sudo vi /etc/ssh/sshd_config

# 以下を追記
PubkeyAcceptedAlgorithms=+ssh-rsa
# 以下を追記(コメントアウト済みを編集)
PasswordAuthentication no

systemctl restart ssh.service
```


# Nvidia Driver
```bash
# recommendが付いている、open,server以外のものを指定
ubuntu-drivers devices
sudo apt update && sudo apt install nvidia-driver-xxx
sudo reboot now
nvidia-smi
```

# Docker 
- Docker Engineのインストールは[公式ドキュメント](https://docs.docker.com/engine/install/ubuntu/)参照(すごい分かりやすい)
- Nvidia Dockerのインストールは[公式ドキュメント](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#docker)のDocker項目を参照(すごい分かりやすい)

```bash
# ユーザー権限追加
sudo groupadd docker
sudo gpasswd -a $USER docker
sudo service docker restart
sudo reboot now
```

# Git
```
git config --global user.name “XXXXXX”
git config --global user.email XXXXX@XXXXXX
```

# Python
```
sudo apt update
sudo apt install python3-venv python3-dev python3-distutils python3-pip
```

# Poetry
- [公式ページ](https://python-poetry.org/docs/) を参照
```
# ローカル環境に.venvを生成するよう設定
poetry config virtualenvs.in-project true
```
vscode vim Ctrl + キー と x と dd でヤンクを無効にする

# vscode vim Ctrl + キー と x と dd でヤンクを無効にする

どうしても windows を触る機会が多いので vim のキー操作になれ始めてもまたWindowsにキー操作に戻ってしまい一行に生産性が上がらない。

vim での Ctrl+Key は無効にすると決めた。  

## vim キーバインド無効

VSCode のメニューより
File > Preferences > settings  
Search settings の入力欄に vim.handleKeys と入力し  
Edit in settings.json のリンクを押下  
以下の記入する。
```json
  "vim.handleKeys": {
    "<C-a>": false,
    "<C-f>": false,
    "<C-n>": false,
    "<C-c>": false,
    "<C-x>": false,
    "<C-v>": false,
    "<C-b>": false,
    "<C-j>": false,
    "<C-k>": false,
    "<C-d>": false,
    "<C-s>": false,
    "<C-z>": false
  }
```

## x と dd でヤンクしない
VSCode のメニューより
File > Preferences > settings  
Search settings の入力欄に vim.handleKeys と入力し  
Edit in settings.json のリンクを押下  
以下の記入する。
```json
  "vim.normalModeKeyBindingsNonRecursive": [
    {
      "before": ["x"],
      "after": ["\"", "_", "x"]
    },
    {
      "before": ["d","d"],
      "after": ["\"", "_", "d","d"]
    }
  ]
```

以上。
[AtCoder] Beginners Selection - ABC083B - Some Sums [Elixir Livebook]

## はじめに

AtCoder の Beginners Selection コンテスト ABC083B - Some Sums 問題を Elixir Livebook で回答しました

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/tree/main/livebooks/atcoder/abc083/abc083_b

## 問題

https://atcoder.jp/contests/abs/tasks/abc083_b

## 入出力例

以下のようになれば OK です

```elixir
"""
20 2 5
"""
|> Main.solve()
|> then(&(&1 == 84))
```

```elixir
"""
10 1 2
"""
|> Main.solve()
|> then(&(&1 == 13))
```

```elixir
"""
100 4 16
"""
|> Main.solve()
|> then(&(&1 == 4554))
```

## 回答１

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  defp split_words(words) do
    String.split(words, " ")
  end

  def solve(input) do
    [n, a, b] =
      input
      |> String.trim()
      |> split_words()
      |> Enum.map(&String.to_integer/1)

    1..n
    |> Enum.filter(fn num ->
      sum =
        div(num, 10000) +
          (num |> div(1000) |> rem(10)) +
          (num |> div(100) |> rem(10)) +
          (num |> div(10) |> rem(10)) +
          rem(num, 10)

      sum >= a && sum <= b
    end)
    |> Enum.sum()
  end
end
```

@torifukukaiou　さんの答えとほぼ同じです

https://qiita.com/torifukukaiou/items/2a17b1cb850cde75f664

N の上限が指定されているため、数字和を再帰ではなく固定の式にしました

実行時間は 347 ms でした

## 回答2

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  defp split_words(words) do
    String.split(words, " ")
  end

  def solve(input) do
    [n, a, b] =
      input
      |> String.trim()
      |> split_words()
      |> Enum.map(&String.to_integer/1)

    1..n
    |> Enum.filter(fn num ->
      sum =
        num
        |> Integer.digits()
        |> Enum.sum()

      sum >= a && sum <= b
    end)
    |> Enum.sum()
  end
end
```

`Integer.digits` で数値を各桁のリストに変換しています `123 -> [1, 2, 3]`

実行時間は 373 ms でした

## まとめ

`Integer.digits`　は知りませんでした
27歳総務職　WEBエンジニア目指すため勉強内容を記録していく

新卒から４年ほど広報や総務といった事務系職種で働いてきたけれど、
どうにも仕事が楽しくない。


定量的な実績が少なく、自分が「これができる」と自慢できるようなスキルもないので、
手に職をつけるという意味でもエンジニアを目指してみようと思います。


また、将来のための記録として今日から勉強した内容を投稿していきます。
できれば毎日投稿したいですが、なかなか難しいと思うので３日に一回は投稿できるように頑張ります。


【2023年6月27日　勉強内容】
・Progate　Web開発コース(Ruby on Rails)
　Step2　HTML & CSS 初級編
　
　感想
　CSSがちょっとだけわかるようになったかもしれない
　細かいプロパティはやっていくうちに覚えられると思う
　構造や記述方法は都度確認していく
データを利用して結果の予想や傾向を分析する方法：その1

皆さんは、多数あるデータを利用して結果の予想や傾向を分析したことはありますか？  
今回、私が大学時代によく利用していた3つの分析方法について簡単に紹介しようと思います。  
1つの説明が長くなってしまうので、1つずつ紹介します。

# 1.因子分析
まず初めに因子分析について紹介します。  
この分析方法は、簡単に説明すると
### 「違いの存在する物事に対して、何が原因でその違いが起こるのかを解明する分析方法」
です。

分かりやすくポケモンで例えてみましょう。
ポケモンには、可愛い、かっこいい、美しいなど様々な印象のポケモンがデザインされています。
このポケモン1種類ずつのデザインについて、イメージのアンケートを実施し、結果をまとめます。  
その結果を用いて因子分析にかけます。
因子分析は、分析ソフトウェアもしくはpython等で作成した計算プログラムで行います。  
因子分析を行うと以下のような結果を出すことができます。
- 対象物(ポケモンのデザイン)に影響を与えている、2～3つほどの要因
- 用いた各要素(アンケートの各項目)が、要因にどれほど影響を与えているか
- 各対象物(各ポケモンのデザイン)の各要因の得点(座標)
- 各要因の特徴

今回、ポケモンのデザインで分析した結果が以下の表です。
![分析結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3321320/f9392107-c91b-9750-a473-a45deffe3a9f.png)

分析結果より、以下のような要因があることがわかりました。
- 「重い、頑丈な、豪快な、迫力のある」の要素がある要因
- 「鋭い、速そうな、洗練された、かっこいい」の要素がある要因
- 「明るい、美しい、和ませる、親しみやすい」の要素がある要因

それぞれの要因に含まれている要素を考慮し、「迫力」「鋭さ」「親しみやすさ」としました。  
要因には寄与率というものがあり、その要素が全データをどれくらい説明できるかを表しています。  
今回は、「迫力」が32.2％、「鋭さ」が24.0％、
「親しみやすさ」が21.9％でした。  
この3要因を合わせて、全データの78.1％を説明できることになります。  
この寄与率は、分析を行った際に一緒に計算されます。

分析結果には、それぞれのデータの「迫力」「鋭さ」「親しみやすさ」がどの程度なのかの数値も出ます。  
その数値を利用し、それぞれのデータがどこに位置するのかを3次元の図に表すことができます。
![図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3321320/83567b43-b112-b069-8eba-eb5e8903c112.png)
この図から各要因にどのような特徴があるのかを考察します。  
今回だと「迫力」は、左のポケモンと右のポケモンで比較し特徴を導き出します。
左のポケモンは、1等身・2等身のポケモンが多く、  
右に行くにつれ等身や体のサイズが大きくなっていることが分かります。

鋭さに関しては、上のポケモンと下のポケモンで比較します。
上のポケモンは、目つきが鋭く、尖った角や羽を持っていたり、人型であったりするポケモンが多く、  
下のポケモンは全体的に丸いフォルムのポケモンが多く存在していました。


親しみやすさに関しては、別の図で表しています。
このグラフの上のポケモンと下のポケモンで比較をします。
上のポケモンは、体の色が暖色系のポケモンが多く、  
下のポケモンは、寒色のポケモンが多く存在していました。

まとめると、今回は因子分析を利用することで、  
ポケモンのデザインの印象は「迫力(大きさ)」32.2％、「鋭さ(シルエット)」24.0％、「親しみやすさ(色)」21.9％で決まるということがわかりました。  
中でも「親しみやすさ」が「色」で決まることは、この分析を行わなければわからなかったことです。

## このように、違いの存在する物事に対して、何が原因でその違いが起こるのかを解明することができるのが因子分析です。
例外処理について

## 例外処理
:::note
プログラムの実行中に予期しないエラーや例外が発生した場合に、それをキャッチして適切に処理するための仕組み
:::

## try catch 例
例外をスローする可能性のあるコードをtryブロック内に配置
tryブロックの中で発生した例外はキャッチされる

```java
try {
    // 例外をスローする可能性のあるコード
} catch (ExceptionType1 e1) {
    // ExceptionType1 の例外をキャッチして処理
} catch (ExceptionType2 e2) {
    // ExceptionType2 の例外をキャッチして処理
} finally {
    // オプションの finally ブロック（必要に応じて使用）
}
```

**tryブロック内で例外が発生→該当するcatchブロックが実行される**
例外の型に応じて、異なるcatchブロックを用意することができる

**catchブロックは、例外が発生した場合の処理を記述**
→例外の情報を利用してログを出力したり、ユーザーにエラーメッセージを表示したり、必要な処理を行う

オプションのfinallyブロックを使用することも可能
**finallyブロックは、例外の有無にかかわらず必ず実行されるブロック**
リソースの解放やクリーンアップなどの処理を行うために使用

*****

**例外処理は、予期しない状況に対処するための重要な手段**
→プログラムの安定性と信頼性を向上できる
多機能！Coinviseで出来る事〜プロフィール作成編〜

## Coinviseで出来る事
![スクリーンショット 2023-06-26 23.21.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/02175c0a-d3b9-03cd-b52a-860aacdd9194.png)


Coinviseで出来る事は、下記の通りです。
めちゃくちゃ多機能、という印象！早速テストしてみたくなりますね。

- 独自のトークンを発行する
- 報酬として貢献者へトークンを配布する
- トークンを「レイヤー2」のチェーンでブリッジする
※ レイヤー２：ガス代が安いチェーンという認識でOK
- マルチシグ・ウォレットで安全にトークンを管理する
※ マルチシグ：複数の署名が必要なセキュリティの高い管理という認識でOK
- NFTのメンバーシップを立ち上げる
- Twitterと絡めた報酬のエアドロップ
- 外部で発行したトークンをCoinviseへインポートする

※公式が発行するマニュアルは[コチラ](https://coinvise.notion.site/Coinvise-Wiki-64b15ff7c1d04ce3b748ca49f7b3c31f)をご覧ください

## Coinviseのはじめかた

まずは、準備編。Coinviseのプロフィールを作ってみましょう。
※こんな感じで作ってみました。

![スクリーンショット 2023-06-26 23.35.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/7fdf3727-7993-f8b0-8ff8-97f156ae91b2.png)

Coinviseの公式ページ「[https://www.coinvise.co/](https://www.coinvise.co/)」へアクセスします。

1. ページ最下部 「Alright, I'm in」 からJOINします
2. 「Connect wallet」 からウォレットを接続します（メタマスクでOKです）
3. メールアドレスを登録し、認証をクリアします
4. 「Manage Profile」内の「Edit Profile」からプロフィールを編集します
5. 以上で準備は完了です！

※具体的な使い方、特に「独自トークンの発行」「メンバーシップの立ち上げ」は今後、別の記事でトライしてみたいと思います！ 


## Coinviseをどう使う？

Coinviseのマニフェストにはこう書かれています。

「Coinviseではクリエイターが第一です。私たちは、クリエイターが無許可、レンタルフリー、オープンな環境で活動する協調的で自立したコミュニティを構築できるツールを構築することを目指しています」

つまり、クリエイターがノーリスクでNFTを活用したコミュニティを構築するサービスになる、ということです。独自のトークン発行や発行したトークンを管理するツール、そしてメンバーシップの立ち上げなど、現時点ではまだそれほど有名ではありませんが、Coinviseで出来る事は非常に面白そうでワクワクしますね。



この記事は、著者が運営するメディア「ぬるぺでぃあ」でも読むことができます（記事は[コチラ](https://miuradonuts.com/2023/06/27/coinvise-001/)）
![](https://miuradonuts.com/wp-content/uploads/2023/06/ヘッダーエリア画像作成.png)
多言語対応

多言語対応を試しました

まずはScreen上にJapanese、Englishのボタンを配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/5da3a50c-3413-7085-eb14-58194377db2f.png)

Dataタブ - Multilingual Localesを右クリックし、Add Locale...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/b03e931f-4401-b50f-3934-341ce5e9c26a.png)
jpを入力して、JapaneseをSelect
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/c6ae8f42-8cb2-2c7e-3374-c9b5ed8d6afc.png)
engで検索し、Trancelation in ja-JPに英語を入力
（これは最初にScreen上に配置したボタン上に書いたEnglishという文字列をja-JPの時は英語にしますよということです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/4a49c606-7e09-25bb-a92b-36363f5978f7.png)
japanで検索し、Trancelation in ja-JPに日本語を入力したらDoneを押します。
（同じく最初にScreen上に配置したボタン上に書いたJapaneseという文字列をja-JPの時は日本語にしますよということです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/9eb2cefd-e026-5f9a-ca66-6734305df0f2.png)
LogicタブにSetCurrentLocalというClient Actionが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/88f7dd6a-7eb1-786c-b444-cbd569fa53c8.png)
JapaneseボタンのClient ActionにRun Client Actionを配置し、
ActionをSetCurrentLocale、Localeを"ja-JP"にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/c8311bce-23c0-1da7-726a-ce4289e8b7ba.png)
EnglishボタンのClient ActionにRun Client Actionを配置し、
ActionをSetCurrentLocale、Localeを"en-US"にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/c6c42d1c-e313-c096-21ee-e0aacc4eba29.png)


完成です。

Publishして、Open in blowserしてください。

Japaneseを押すと、日本語に変わり、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/51824eab-3de6-0d4d-f19c-7abce5ff3989.png)
英語を押すと、英語に戻ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/ffa08f29-cddf-5631-f62d-0e6ccf5586e8.png)
GitHub PagesでWebサイトを公開する方法

## はじめに
GitHub Pagesを使用することで簡単にWebサイトを公開することが可能である。
サイトを公開する方法の一つとして試してみたため、方法をまとめる。

## GitHub Pagesとは
> GitHub Pages は、GitHub のリポジトリから HTML、CSS、および JavaScript ファイル を直接取得し、任意でビルドプロセスを通じてファイルを実行し、ウェブサイトを公開できる静的なサイトホスティングサービスです。

## GitHub PagesでWebサイトを公開する方法
1. GitHubにサイト用のリポジトリを作成する
2. リポジトリ内に、公開するサイト用のファイル（HTML、CSS、および JavaScript ファイルなど）を配置する
3. GitHub->settings->[Change repository visibillity] からリポジトリの公開範囲を[public]にする
![GitHub_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738663/c5d21334-50ef-6157-67d6-5283763c7460.png)
![GitHub_danger_zone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738663/a2529d47-6b04-292d-6fc2-ba7595a9ae05.png)
4.  GitHub->settings->Pages->Branch から公開するブランチを選択し、[save]ボタンを押下し、サイトを公開する（ソース ブランチのリポジトリ (/) のルートまたはソース ブランチの /docs フォルダーのいずれかを指定）
![GitHubPages_page_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738663/294505b2-30ae-48e5-aea2-5f5290dbb7fd.png)
5. GitHub->settings->Pages->GitHub Pages の[Visit side]から公開されたサイトを確認する

## 気を付けるポイント
- サイト用ファイルは、index.html、index.md、または README.mdという命名にすること（GitHub Pagesはこれらのファイルを自動的に読み込むため）
- 公開元がブランチおよびフォルダーである場合、ファイルは、ソースブランチ上のソースフォルダーの最上位レベルに配置すること（たとえば、公開元が main ブランチ上の /docs フォルダーである場合、エントリ ファイルは、main という名前のブランチ上の /docs フォルダー内に配置する必要がある）

## 参考文献
- [GitHub Pages サイトを作成する](https://docs.github.com/ja/pages/getting-started-with-github-pages/creating-a-github-pages-site)
- [自分で作ったWebページをインターネット上に公開しよう！](https://prog-8.com/docs/github-pages)
ＰＭＴｉｌｅｓ（ベクタ・ラスタ）を作ってみた。

MapLibre GL JSで、自分が作ったデータをどのように配信・管理したら良いか？と考えました。

今ここ何番地？
https://office-shirado.com/imakoko/

基本的に、日本全国がフィールドなので、タイル形式が良いかな？と思ってはいましたが、タイル構造（Z/X/Y）では、膨大な数のファイルができてしまい、ファイル転送（ＦＴＰ）も時間がかかり、削除も移動も大変・・・。

半年前まで、「MapLibre」、「pbf」、「MBTiles」、「PMTiles」という言葉を知りませんでしたｗ
８年前にLeafletで少し遊んでたくらいです。

今回、今ここ何番地？では、法務省地図（amx-a提供）、法務省地図地番（代表点）、国有林（国土数値情報）などを読み込むようにしておりますが、基本的には「PMTiles」を利用しております。

最初は、ベクトルタイルのpbf（Z/X/Y構造）も使っていたのですが、データが増えるに従い、管理が大変になりました。
そこで、色々調べたりした結果、単一ファイルのPMTilesが最適という結論に至りました。

amx-aから提供頂いたデータはPMTilesで、当初どのように作成したらよいのか分からず右往左往しておりました。

ベクトルタイルについて、参考にしたのは、以下のYouTubeでした。
＜ベクトルタイルを作ってみた。　～Windows Docker編～＞
https://www.youtube.com/watch?v=KRnr6MEeN6k

上記の動画を元に、自分用のメモをまとめました。
-----------＜初期設定＞-----------
【Dockerのインストール】
https://www.docker.com/
から、Windows版をダウンロードし、インストール

【WSLの更新】
https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package
からダウンロード、インストール
---------------------------------

-----------＜作成作業＞-----------
【データフォルダにGeoJSONをコピー・又は移動】
D:\data\GeoJSON

【Dokerを起動】
起動したら、ちょっと待つｗ

【Windows PowerShellを起動】
１．docker pull unvt/nanban
２．docker run -it --rm -v d:\data:/data unvt/nanban
３．tippecanoe -l layername -rg -z18 -Z18 --no-tile-compression --drop-densest-as-needed --no-tile-size-limit -o /data/layername.pmtiles /data/GeoJSON/*.geojson
※３番目のコピペは、右クリックを使用（なぜか・・・。）
---------------------------------
上記で、PMTilesが作成され、後はFTPソフトでサーバーに上げるだけです。


続いて、ラスタタイルデータについては、参考にしたのは以下のYouTubeでした。
https://www.youtube.com/watch?v=_-d41I84oik
※go-pmtilesの部分
-----------＜初期設定＞-----------
【QGISのプラグイン、QMetaTilesをインストール】
※QTilesも入れた方が良いのかは未検証（QTilesもインストール済み）

【go-pmtilesのダウンロード】
https://github.com/protomaps/go-pmtiles/releases
私は、go-pmtiles_1.8.0_Windows_x86_64を使用。
ダウンロード・解凍したら、回答ファイルをCドライブ直下に移動する。
--------------------------------

-----------＜作成作業＞-----------
【QGISにGeoTiffを貼り付ける】
CRSに気を付ける。

【QMetaTilesでMBTilesを作成】
プラグイン→QMetaTilesで、mbtiles形式で保存する
※一番上にパスとファイル名（test001.pmtiles）を入れる。

【go-pmtilesでPMTilesを作成】
Cドライブ直下においたgo-pmtiles_1.8.0_Windows_x86_64のフォルダに
QGISから出力したtest001.pmtilesをコピー又は移動しする。

コマンドプロンプト（cmd）を起動し、
＜ディレクトリ変更＞
cd C:\go-pmtiles_1.8.0_Windows_x86_64

＜変換実行＞
pmtiles convert test001.mbtiles test001.pmtiles

の２つのコマンドを入力すると、PMTilesが出来上がります。
--------------------------------

結果、全てYouTubeに救われたという事になりますｗ
本当にありがとうございます。

これを書いている時点でも、「MBTiles」と「PMTiles」の違いが良く分かっておりません・・・。
ただ、「PMTiles」は特別なサーバー環境を用意しなくてもＯＫとのことのようです。

という事で、ベクトルタイル・ラスタタイル共に「PMTiles」でしばらくはデータを取りまわしてみたいと思います。

約８年ぶりにＷｅｂＧＩＳに本気を出していますが、
　・MapLibre GL JS
　・PMTiles
　・オープンデータ
　・公開データ
などいい時代になりましたね。

今ここ何番地？では、メンバーが保有するドローン撮影などによるGeoTiffをMaplibreの今ここ何番地？で表示できるように進んでいこうかと思っております。


さて、次の壁は何だろうか・・・。
※壁はなくて良いですけど。
【Docker】GUIでボリュームをバックアップする方法


## 拡張機能をインストール

Docker DesktopのExtensions Marketplaceで`Volumes Backup & Share`をインストールすることでGUIでボリュームのバックアップを取れるようになります。

Docker Desktopを開いて`Add Extensions`をクリックします。

![スクリーンショット 2023-02-26 23.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/cde2400d-fafa-3a23-7038-306a91707fb0.png)


`Volumes Backup & Share`を検索してインストールします。

![スクリーンショット 2023-02-27 0.01.44のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/28393918-cbde-7a39-7aab-7c4188d1921f.png)

`Open`をクリックします。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323334323434332f34393537353261302d353161362d333136652d376434632d6238646166333263313163642e706e67のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/17c28a4e-26fc-77f4-b9fc-15ad2d30433e.png)


## バックアップの作成

インストール後`Volumes Backup & Share`を開きした画像の赤枠内のボタンをクリックしてボリュームをホストにエクスポートします。

![スクリーンショット 2023-02-26 23.50.31のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/a3a255b5-a1cc-4c27-9219-43d1299917e6.png)



## 新しいボリュームとしてリストア

画面右上の`import into new volume`をクリックしてバックアップの際に作成したファイルを選択してリストアします。

![スクリーンショット 2023-02-26 23.50.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/eca2b68d-dcf8-6d53-8866-8d7cc36b56e3.png)
【SwiftUI Color】相対輝度の求め方

# はじめに
色の相対輝度を求める方法を紹介します。

# 相対輝度とは
相対輝度とは、色の明るさを表す値です。0から1の間の値を取ります。0に近いほど暗く、1に近いほど明るい色です。

# コード
```swift
extension Color {
    var relativeLuminance: CGFloat {
        // 色の相対輝度を計算する
        return 0.2126 * components.red + 0.7152 * components.green + 0.0722 * components.blue
    }
    
    private var components: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        // 色の成分を取得する
        var redComponent: CGFloat = 0
        var greenComponent: CGFloat = 0
        var blueComponent: CGFloat = 0
        var alphaComponent: CGFloat = 0
        
        UIColor(self).getRed(&redComponent, green: &greenComponent, blue: &blueComponent, alpha: &alphaComponent)
                
        return (redComponent, greenComponent, blueComponent, alphaComponent)
    }
}
```

# 参考文献
https://ja.wikipedia.org/wiki/%E7%9B%B8%E5%AF%BE%E8%BC%9D%E5%BA%A6
[AWS Q&A 365][ECS]AWSのよくある問題の毎日5選 #87

# 1. Amazon ECSにおけるServiceスケジューラとは何ですか？
Amazon ECSのServiceスケジューラは、サービス内で実行されるタスクの所望数を維持する責任を持っています。所望の数を保つために、タスクを起動および停止し、異常なタスクを自動的に置き換えます。

# 2. Amazon ECSサービスにおけるデプロイメントコントローラとは何ですか？
Amazon ECSサービスのデプロイメントコントローラは、新しいタスク定義の展開プロセスを管理する責任を持っています。ローリングアップデート、ブルーグリーンデプロイメント、または外部デプロイメントを実行することができます。

# 3. Amazon ECSでサービスを管理する方法はありますか？
Amazon ECSでは、AWS Management Console、AWS CLI、またはAWS SDKを使用してサービスを管理することができます。サービスの作成、更新、削除、および状態とメトリクスの表示が可能です。

# 4. Amazon ECSにおけるサービスのロードバランシングはどのように機能しますか？
Amazon ECSのロードバランシングは、Elastic Load Balancer (ELB)またはApplication Load Balancer (ALB)を使用して機能します。ロードバランサは、サービス内のタスクにトラフィックを分散し、異なるロードバランシングアルゴリズムを使用するように構成することができます。

# 5. Amazon ECSでサービスをスケーリングする方法はありますか？
Amazon ECSでは、Service Auto Scalingを使用してサービスをスケーリングすることができます。この機能は、CPU使用率やリクエスト数などのメトリクスに基づいてサービス内のタスクの数を自動的に調整します。スケーリングの動作を制御するために、ターゲットトラッキングやステップスケーリングポリシーを設定することができます。
[AWS Q&A 365][ECS]Daily Five Common Questions #87

# 1. What is the Service scheduler in Amazon ECS? 
The Service scheduler in Amazon ECS is responsible for maintaining the desired number of tasks running in a service. It starts and stops tasks to maintain the desired count, and automatically replaces unhealthy tasks. 

# 2. What is a Deployment controller in Amazon ECS services? 
The Deployment controller in Amazon ECS services is responsible for managing the deployment process of new task definitions. It can perform a rolling update, a blue/green deployment, or an external deployment. 

# 3. How can I manage services in Amazon ECS? 
You can manage services in Amazon ECS using the AWS Management Console, the AWS CLI, or the AWS SDKs. You can create, update, and delete services, and view their status and metrics. 

# 4. How does Amazon ECS load balancing work for services? 
Amazon ECS load balancing works by using an Elastic Load Balancer (ELB) or an Application Load Balancer (ALB). The load balancer distributes traffic across the tasks in a service, and can be configured to use different load balancing algorithms. 

# 5. How can I scale services in Amazon ECS? 
You can scale services in Amazon ECS using Service Auto Scaling. This feature automatically adjusts the number of tasks in a service based on metrics such as CPU utilization or request count. You can configure target tracking or step scaling policies to control the scaling behavior.
【初投稿】元看護師男がIT業界へ。(自己紹介)


# はじめに

初めまして。4月から未経験で開発エンジニアとして転職したtakunと申します。
私は4月から某SES企業に勤めることとなったのですが、研修が終わり待機期間となったところで何か日々の学びをアウトプットできる場はないか調べたところQiitaに行き着いた次第です。

# 目次

● 当アカウント記事についての方向性
● 自己紹介
● 入社〜現在まで


# 当アカウント記事についての方向性


このアカウントでは、主に備忘録として以下の内容を取り扱います。
**・勉強していること**
**・個人開発しているものについて**
**・資格取得日記**
**・キャリアデザインについて**

# 自己紹介

自己紹介が遅れました。改めまして、takunと申します。
記事のタイトルにもある通り、4年制の看護大学を出て病院で看護師を３年ほどやっておりました。年齢は20代後半です。
この業界を知ったのも今年の1月で、業界のことを知れば知るほど自分も開発に携わりたいという気持ちが強くなり転職しました。


# 入社〜現在まで

### ＜研修期間＞
4月〜5月にかけて、自社グループのプログラミングスクールにJava研修として2ヶ月研修を受けました。
Officeスキル、コンピュータ基礎・ネットワーク基礎、HTML・CSSとMySQLでのSQL操作、Java基礎、Webシステム、Springフレームワークについて学びました。

入社前からネットワークに関する勉強やJava言語の勉強を進めていたこともあって、講義で順調にステップアップできたのかなと感じています。
特にWebアプリケーション作成は入力フォームやショッピングサイト制作、クイズゲームなど目に見えて成果が分かりやすく、MVCに基づいたプログラムの構成を考えるのは楽しかったです。
また研修中に自分の手で１から何か作ってみたくて、ババ抜きプログラムを作って遊んでいました。(別で記事にするかも)

### <待機期間>

研修終えてからは、毎日テレワークで勉強する日々になりました。
- 5月下旬~6月上旬
研修中もJavaを自習していたため、6/3にJavaSilverを受験し合格しました。(別で記事にするかも)
自身で１からWebアプリケーションを作ってみたかったため、彼女からお願いされたアプリケーションを制作しました。(別で記事にします)
- 6月下旬~
現在はIT全般の知識がまだまだ足りていないと感じ、基本情報技術者試験に向けて勉強中！進捗としては午前問題は合格ライン乗ってきてはいるので、あと１週間ほど勉強を進めれば試験日程も決めれそう！

# おわりに

こんな新米エンジニアの記事をここまで見て頂けて嬉しいです。拙い文章で恐縮ですが、見ていただいてる方に分かりやすい内容となるよう努めていきます！
今後はエンジニアとして切磋琢磨できるようなコミュニティを広げていきたいので、フォロー・アドバイスなども頂けたら嬉しいです。よろしくお願いいたします。
venvとPowerShellでお手軽Python仮想実行環境

# はじめに
今や誰でもPython書ける時代に。(!?)
Windows Server上で、多人数が作ったコードが動く、
バッチ処理やテスト用のPyhonの実行環境を作るニーズがあった。
「LambdaとかECSとか使っとけば？」で話が済まない場合、
環境を準備する側の都合としては、色々考える必要がある。

要件を整理すると…

#### やりたいこと
- 毎度クリーンな環境でPython実行させたい。
- 気軽にDockerコンテナ使える環境を使える環境でない。
⇒でも、将来的にDocker使用を見越した準備をしておきたい。
- Python書かせるユーザーが多数、レベルも様々。
⇒ある程度、冪等性を意識させたい。
- コンテナのように同時にたくさん実行させたい。
- pyenvとか色々あるのは知ってるが、極力公式環境で作りたい。
- いい感じのができたら標準テンプレとして使いたい。

これを解決するために、タイトルの通り、
「**venvとPowerShellでお手軽Python仮想実行環境**」を作った。

今回は、以下3点を意識した。

#### 意識したこと
- venvを使ったクリーンな環境の準備
- 同時実行のために実行毎にユニークなvenv環境を作る
- Pythonのライブラリはrequirements.txtで管理

# 実践編
#### 今回作ったもの
1. やりたいことを実行させるPowerShell（bat.ps1）
2. サンプルとなるmain.pyファイル
3. 同じくサンプルのrequirements.txt

全部GitHubに上げている。


https://github.com/bd8z/envtest



これで、「main.pyとrequirements.txtだけ弄っておいて～」とすれば、
最低限、作成者側で保守性の良いコードを書いてくれるはず。

#### 0. ps1の呼び出し
実行環境によってps1の実行で詰まったりしそうなので、
ワンライナーでポリシー変更も併せて書く。
```shell:
set-executionpolicy remotesigned -Scope CurrentUser | .\bat.ps1
```

#### 1. ps1ファイル中身
Python実行させるDockerfile書いている要領で書く。
今後、Dockerfileとなったところでちょこっと書き換えれば良い。
UUIDで毎回ユニークなvenv環境を作らせるようにした。
```powershell:
# 01.setting
$venvuud = [Guid]::NewGuid().ToString()
$venvFolder = "venv_" + $venvuud

# 02.build venv environment
python -m venv $venvFolder
& (".\" + $venvFolder + "\Scripts\Activate.ps1")

# 03.python
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python -m pip list

python main.py $venvuud

# 04.end
deactivate
Remove-item -Force $venvFolder -Recurse
```

#### 2. pythonサンプル
Pythonへ引数の渡し方も示しておく。
ファイルを出力させる例として書いておいた。

```python:
import matplotlib.pyplot as plt
import numpy as np
import sys

if __name__ == '__main__':
    uuidStr = sys.argv[1]
    plt.figure(figsize=(6,6))

    for i in range(5):
        plt.plot([1,2,3],[np.random.rand(),np.random.rand(),np.random.rand()])


    filename = uuidStr +".png"
    plt.savefig(filename)

    print(filename)
```

#### 3. requirements.txt
バージョン指定のお作法的なところを、
人気ライブラリで書いておく。
```text
# no version
numpy 

# with version
pandas == 2.0.2 

# with major version
matplotlib == 3.* 
```



# 最後に
「実行可能なPythonを」と指定したのに.ipynb形式で渡されたり、
execがたくさん埋め込まれ、作成者環境でしかうまく動作しなかったり、
変なところで詰まってしまって悲しくなること、ありますよね。


テンプレートをお渡して、テンプレートに合わせて作ってもらった方が、
お互いのため。手戻りも少なくなるはず…
面白！ターミナルにカウントダウンタイマーとストップウォッチを表示！

Mac用のタイマーを探していたら面白いのがあったのでシェア。
- termdown — Countdown timer and stopwatch in your terminal.
らしい。

https://github.com/trehn/termdown

```
pip install termdown
```

とりあえず、25分のカウントダウンをして欲しい。且つ10分前と5分前に音声で知らせて欲しい。

使い方を読むと、なにやらまず使える音声を調べないといけないらしい。
自分はMacなので

```
say -v '?'
```

おーいっぱい出てきた。
とりあえず中国語を選んでみた。

```
termdown -t "25 minutes countdown" -v Ting-Ting -c 10 -c 5 25m
```

うん上手く動いたみたい。いい感じ。
もうちょいカスタマイズする。

```
termdown -t "25 minutes countdown" -v Ting-Ting -c 10 --voice-prefix "还剩10分钟了" -c 5 --voice-prefix "还剩5分钟了" 25m
```

タイル型ウィンドウマネージャーと併用したらもっとカッコ良くなるかも。
KeydownイベントでEnterと書いてるのにテンキーについてるEnter押しても反応しない

## 解決
'Enter'と'NumpadEnter'両方に反応するように書く。

## 動機
自分でイベント発生させて確認すれば一目瞭然なんだけども、意外と調べても出てこないので。
AWSクラウドの概念　AWSの長所と利点


AWSを利用することのメリットを紹介する。

# AWSクラウドのメリット６つ

AWSクラウドを利用すると６つのメリットがある。
1. 設備投資の固定費が柔軟な変動費になる
1. スケールによるコストメリット
1. キャパシティ予測が不要になる
1. 速度と敏捷性の向上
1. データセンターの運用と保守が不要になる
1. 数分で世界中にデプロイできる

以降の章から１つずつ解説していく。


# 設備投資の固定費が柔軟な変動費になる
オンプレミスでは事前にサーバーに多額の投資をする必要があった。クラウドを利用することで、リソースを利用したいときに利用したい分だけ支払うことができる。

また、総所有コスト（Total Cost of Ownership、TCO）を削減することができる。
具体的には、
* 各種人件費
* データセンター費用
* 電気代
* ソフトウェアライセンス
* 保守費用
などがある。


# スケールによるコストメリット
クラウドを利用することで、オンプレミスより低い変動コストを実現できる。
理由は２つ
* 多くのユーザがクラウドを利用するとため、規模の経済を活かして料金を低く提供できる
* AWSはサービス開始から2023年3月時点で129回以上値下げを実施している

従来どおりの利用方法でも、AWSに移行するだけで利用料金が安くなる可能性もある。


# キャパシティ予測が不要になる
オンプレミスでは、理論上の最大ピークを予測して、調達する機器の台数や性能（キャパシティ設計）を見積もってプロビジョニング（システム設計、構築）する必要があった。
AWSでは必要に応じてリソースの増減を行うことができるため、最大のインフラ容量を予測する必要がなくなる。

# 速度と敏捷性の向上
AWSでは、新しいITリソースを簡単に利用できる。

### 速度
オンプレミスでは新しいITリソースの導入に数週間から数ヶ月単位の時間が必要だった。しかしAWSなら分単位で開発者が新しいITリソースを利用することが可能。

### 敏捷性
柔軟なリソース調達が可能になり、システムの負荷やサービスの拡充に応じて、柔軟な構成変更ができるようになる。
アプリケーションエンジニアが行っているアジャイル開発の仕組みを、クラウドインフラのリソース調達に適用するこができる。


# データセンターの運用と保守が不要になる
AWSの各種サービスの利用料金には、オンプレミスの各種費用が含まれる。
* サーバー代
* ライセンス費用
* データセンター利用料
* ラックの利用料
* 電気代
* ネットワーク利用費
* ハードウェアベンダーへの保守費用
* 各種人件費



# 数分で世界中にデプロイできる
日本にいながら、世界中のリージョンにデプロイできる。
コト消費を促進するIT技術

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

# モノ消費からコト消費へ
これからの消費行動は、__「モノ消費からコト消費へ変わる」__ というふうに言われています。
この記事では、なぜ消費行動が変わってきているのか？また、企業側としてコト消費を促進するためにはどういったIT技術が有効的なのか？について記載します。

モノ消費：製品や物品を購入して所有することに焦点を当てた消費の形態
コト消費：体験やサービスを重視する消費の形態

# モノ消費からコト消費に移り変わった背景
モノ消費からコト消費へ移り変わる背景としては、以下のようなものが挙げられます。
- 製品のコモディティ化
技術の進歩やグローバル市場の拡大により、多くの市場でコモディティ化(類似性の高い商品が溢れること)が起こっています。機能面での差別化が難しいため、その製品が与えるコトで差別化を図るようになりました。
- シェアリングエコノミーの台頭
財産の所有よりも利用価値を重視するシェアリングエコノミーの普及によって、コト消費が促進されています。
- デジタルネイティブ世代の登場
デジタルネイティブ世代が成長し、オンラインプラットフォームでのエンゲージメントやコミュニケーションの重要性が増したことにより、物理的な所有よりも体験や共有を重要視するようになりました。

# コト消費を促進するためのIT技術
- AIとデータ分析
[AI](https://qiita.com/7_inai_/items/095f95279a7257eaa01b)を用いて大量のデータ([ビッグデータ](https://qiita.com/7_inai_/items/0bbce95823ca7ae9ae2e))を分析する事で、個別のニーズや嗜好を把握し、顧客毎に最適なコトを提供することができます。
- モバイルテクノロジーと位置情報
モバイルアプリや位置情報を活用して、__現在いる場所によって違った情報提供__ をすることができます。
- ブロックチェーンとトークンエコノミー
ブロックチェーン上のトークンを利用したプラットフォームやアプリケーションが登場しています。トークンを使用することで、__ユーザー間の取引やサービスの提供がスムーズ__ に行われ、コト消費が促進されます。


# 終わりに
このように、モノ消費からコト消費への移り変わりは、製品のコモディティ化やシェアリングエコノミーの台頭など、様々な要因によって引き起こされています。
モノ消費からコト消費への転換は、より価値のある消費体験を提供するための重要なトレンドです。これからの時代において、コト消費に焦点を当てた戦略と革新的なIT技術の活用は、企業の競争力を向上させる上で欠かせないものとなってくるでしょう。

最後までお付き合いくださりありがとうございました。
【未完】Javaエンジニアがcosmosdb-chatgptを読むのに苦闘している その6（Azure App Serviceにデプロイしてみる編）

# はじめに

AWS EC2しか触ったことのない人間が、Azure App Serviceへのデプロイを試みます。
まあその……当たり前のことを書いてると思います。

# Azure App Serviceへのデプロイ手順

## 概要

Azure App ServiceはPaaSのアプリケーション実行環境なので、バイナリを配置して動かす……んだと思い込んでいましたが、違います。
GitHubかなにかのリポジトリのパスを設定すると、ソースを取得してビルドしてくれるというわけです。
いかに最新の環境について行っていなかったかが判りますね！

## 手順

 - Azure Portalで、bicepファイルを喰わせてできたApp Serviceを選択する
 - デプロイメント→デプロイセンターを選択する
 - ソースから適切なリポジトリを選ぶ
 - ソースが取得され、ビルド、デプロイされる

カンタン！神かなにかですか！
ところでエラーが出て走りません。

# プロパティの修正

App Serviceの 設定→構成 を選ぶと、appsettings.jsonに設定すべき値が設定できます。
「__」アンダースコア2つがセパレータになっているので注意。

COSMOSDB_*については、bicepを旨く喰わせていると、設定されているはずです。
OPENAI_*については、bicepから手動で除いてしまったので、以下の4つのプロパティを作成します。

```
    OPENAI__ENDPOINT
    OPENAI__KEY
    OPENAI__MODELNAME
    OPENAI__MAXCONVERSATIONTOKENS
```

ローカルでビルド、デバッグ実行した際と同じく、OPENAI__KEYのみOpenAI社のAPIキーを設定してください。

# 動作確認

App Serviceの「概要」からドメイン（URL）がわかります。アクセスしてみましょう。
→Azure App Service上で動作していることが確認できました。
カンタン！神かなにかですか！
Elixirの対話モードでバイナリと文字列および文字リストの動作を確認してみた

# 概要
Elixirの対話モードでバイナリと文字列および文字リストの動作を確認してみました。以下のページを参考にしました。

https://dev.to/gumi/elixir-06--35na

# 対話モードで実行
以下のコマンドを実行しました。
```
$ iex
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> is_binary("hello")
true
iex(2)> byte_size("hello")
5
iex(3)> byte_size("拝啓")
6
iex(4)> String.length("hello")
5
iex(5)> String.length("拝啓")
2
iex(6)> ?a
97
iex(7)> ?あ
12354
iex(8)> String.codepoints("hello")
["h", "e", "l", "l", "o"]
iex(9)> String.codepoints("拝啓")
["拝", "啓"]
iex(10)> <<0, 1, 2, 3>>
<<0, 1, 2, 3>>
iex(11)> byte_size(<<0, 1, 2, 3>>)
4
iex(12)> <<230, 139, 157, 229, 149, 147>>
"拝啓"
iex(13)> byte_size(<<230, 139, 157, 229, 149, 147>>)
6
iex(14)> String.valid?(<<239, 191, 19>>)
false
iex(15)> String.valid?(<<230, 139, 157, 229, 149, 147>>)
true
iex(16)> <<0, 1>> <> <<2, 3>>
<<0, 1, 2, 3>>
iex(17)> <<230, 139, 157>> <> <<229, 149, 147>>
"拝啓"
iex(18)> "拝啓" <> <<0>>
<<230, 139, 157, 229, 149, 147, 0>>
iex(19)> <<256>>
<<0>>
iex(20)> <<256 :: size(16)>>
<<1, 0>>
iex(21)> <<256 :: utf8>>
"Ā"
iex(22)> <<256 :: utf8, 97>>
"Āa"
iex(23)> <<256 :: utf8, 97, 0>>
<<196, 128, 97, 0>>
iex(24)> <<1 :: size(1)>>
<<1::size(1)>>
iex(25)> <<2 :: size(1)>>
<<0::size(1)>>
iex(26)> is_binary(<<1 :: size(1)>>)
false
iex(27)> is_bitstring(<<1 :: size(1)>>)
true
iex(28)> bit_size(<< 1 :: size(1)>>)
1
iex(29)> is_binary(<<1 :: size(16)>>)
true
iex(30)> is_bitstring(<<1 :: size(16)>>)
true
iex(31)> is_binary(<<1 :: size(15)>>)
false
iex(32)> <<0, 1, x>> = <<0, 1, 2>>
<<0, 1, 2>>
iex(33)> x
2
iex(34)> <<0, 1, x>> = <<0, 1, 2, 3>>
** (MatchError) no match of right hand side value: <<0, 1, 2, 3>>

iex(34)> <<97, x :: binary>> = <<97, 196, 128>>
"aĀ"
iex(35)> x
"Ā"
iex(36)> "he" <> rest = "hello"
"hello"
iex(37)> rest
"llo"
iex(38)> 'hello'
'hello'
iex(39)> '拝啓'
[25309, 21843]
iex(40)> to_charlist("hello")
'hello'
iex(41)> to_charlist("拝啓")
[25309, 21843]
iex(42)> to_string('hello')
"hello"
iex(43)> to_string([25309, 21843])
"拝啓"
iex(44)> to_string(:hello)
"hello"
iex(45)> to_string(1)
"1"
iex(46)> 'this ' <> 'fails'
** (ArgumentError) expected binary argument in <> operator but got: 'this '
    (elixir 1.12.2) lib/kernel.ex:1893: Kernel.wrap_concatenation/3
    (elixir 1.12.2) lib/kernel.ex:1880: Kernel.extract_concatenations/2
    (elixir 1.12.2) expanding macro: Kernel.<>/2
    iex:46: (file)
iex(46)> 'this ' ++ 'works'
'this works'
iex(47)> "he" ++ "llo"
** (ArgumentError) argument error
    :erlang.++("he", "llo")
iex(47)> "he" <> "llo"
"hello"
iex(48)> 
```

# まとめ
何かの役に立てばと。
GoogleTagManagerで変数をつくる

## 変数作成が上手くいかなかった話 
- メモなので簡潔に
- データレイヤーの変数は次のようにパラメーターを設定して送信することで作成することができます。
- 詳細は、[こちらより](https://developers.google.com/tag-manager/api/v2/variable-dictionary-reference?hl=ja
)
```json
  {
   "name": "Sample Data Layer Variable",
   "type": "v",
   "parameter": [
    {
     "type": "template",
     "key": "name",
     "value": "DL Variable Name"
    },
    {
     "type": "template",
     "key": "defaultValue",
     "value": "DEFAULT"
    },
    {
     "type": "integer",
     "key": "dataLayerVersion",
     "value": "2"
    }
   ]
  }
```
## 一応自分がたどり着いた解決法
+ 普通にタグマネージャーの画面で作りたい変数を作成
+ 変数をlistで呼び出す
+ 結果を確認し、コピペしてリクエストボディに送信
+ 結果が分かってから調べなおした結果、とても詳細な公式が見つかる、、、
+ 言い訳をすると、dev docがそれまで使えていたため、dev docを読み込んでいた
## 参考程度に
↓めちゃくちゃわかりやすい公式、なぜ見つけられなかったのか

https://developers.google.com/tag-manager/api/v2/variable-dictionary-reference?hl=ja

↓npm

https://www.npmjs.com/package/@googleapis/tagmanager?activeTab=code

↓Github　タグマネージャー（サンプルあるよ）

https://github.com/googleapis/google-api-nodejs-client/blob/main/src/apis/tagmanager/v2.ts

↓node.js doc（Githubとこれだけだと限界がある。ついでにくそ重い）

https://googleapis.dev/nodejs/googleapis/latest/tagmanager/index.html

↓　公式のガイド（変数ではほんとに役立たずだし、ミスリードが酷い）

https://developers.google.com/tag-manager/api/v1/reference/accounts/containers/variables?hl=ja

## まとめ
ChatGPTもBingも期待していたBardも役立たずであったため、苦労しました。まさか変数は変数辞書という形で別の場所に詳細が書かれているとは、、、
TagManagerは触り始めてまだ日が浅いので、今後のAPIでも変数のように別のページに詳細があるかもしれないことを念頭に進めていこうと思います。
まさか探し物が必要でなくなったときに、見つかる現象がこんなところでも起こるとは思いませんでした。
配列とリストの違い

## 配列（Array）とリスト（List）の違い
:::note
データを格納するためのデータ構造
:::

- 固定サイズか可変サイズ

**配列：固定サイズ**
作成時にサイズを指定したら、その後はサイズの変更不可
**リスト：可変サイズ**
要素を動的に追加、削除、変更可能

- データ型の制約
**配列：単一のデータ型要素のみを格納**
**リスト：ジェネリックを使用、異なるデータ型の要素を格納できる**

- メモリの管理
**配列：連続したメモリブロックとして割り当てられる**
**リスト：内部的には連結リストやダイナミック配列などのデータ構造を使用して実装されている**
→リストは必要に応じてメモリを動的に管理

- 操作の便利さ
**リスト：操作を行いやすくするための多くの便利なメソッドがある**
要素の追加、削除、検索など
**配列：基本的な操作のみ**
手動で要素を移動させる必要がある

:::note
配列は固定サイズで特定のデータ型の要素を格納する場合に適している
リストは可変サイズで異なるデータ型の要素を追加、削除、変更する必要がある場合に適している
ViにおけるESCの代替キーマップは何が良いのか?

# 前書き
**全てのIDEを捨てNeoVimに乗り換えた人です。**

ふと最近、Vimにおける要石「**ESC**」が押しにくいなと思い代替案を探していました。
調べると同じような人は多くいて、
参考になるような設定がいくつか見つかりましたので紹介しようと思います。

### 注意
「設定は全て個人の好みである」という考えが前提です。
優劣を決めようという意図はありませんので予めご了承ください。

# 候補一覧

## ESC
本記事の主題に沿わないが、一応紹介

とあるRedditの投稿によると、圧倒的に使用者が多いようだ
結局バニラが一番ということだろうか?

https://www.reddit.com/r/vim/comments/shndya/how_do_you_escape_to_normal_mode/

## CapsLock
### ESCに疲れた多くのVimmerが辿り着くであろう境地
キーボードの一等地を占有する癖に使用頻度はワースト10に入るであろう**CapsLock**
ここにESCがあるだけでUXがとてつもなく改善される
先ほどのRedditでもCapsLock派を支持する声はとても多かった。

個人的にはとても好きな設定だが、残念ながらここはCtrlキーとして設定したいため却下。
Viしか使わないならESCでもいいが、それ以外のアプリで左手小指にESCがあっても嬉しくないのだ。

## Ctrl-[
### Vim標準の隠れESC
知っている人も多いと思うが、実はこれでもESCと**全く同じ**挙動になる。
なぜそうなるのかは以下の回答が参考になった。

https://vi.stackexchange.com/questions/24852/how-to-remove-the-mapping-from-ctrl-to-escape

> In a terminal Ctrl-A is ASCII 0x01, Ctrl-B is ASCII 0x02 and so on. Ctrl-Z is 0x1A and Ctrl-[ is 0x1B.
And 0x1B is also the ASCII code for ESC.
Vim can't differentiate between ESC and Ctrl-[, because it gets the same key code when either is pressed.

`ESC`と`Ctrl-[`のキーコードが同じであるため、Vi側で区別がつかなくなり挙動が一致するらしい
そういうこともあるんだなと思いちょっと面白かった

個人的にはあまり押しやすくない。


## Ctrl-C
### 間違えてVi開いた人を陥れる罠
Vi慣れしていない者が`visudo`や`git config --edit`などでうっかり入るとこれで詰む
「コマンドなんてCtrl-Cで止めれるだろ！」という甘い考えを捨てることになる要因

NeoVimにおける`Ctrl-C`の定義は、
``` :help Ctrl-c
CTRL-C                  Interrupt current (search) command.
                        In Normal mode, any pending command is aborted.
```
とのことで、**ESCと同義ではない**ことに注意。

打ちなれているキーだということでしばらくこれを使っていたのだが、以下のような問題があった。

- VisualModeから`Shift-i`で入れる複数行同時入力ができない
  - ESCで閉じないとキャンセル扱いになり消える
- Pluginによっては`ESC`時に実行されるものがあり、`Ctrl-C`では実行されない
- そもそも`ESC`と機能的に異なるので気持ち悪さがある

人によっては問題に感じないかもしれないが、いつか困ることになる可能性があるので注意。

## jj / jk / kj
### 最初に思いついた人天才だと思うキーマップ
絶妙に押さないコンビネーション`jj`を`ESC`にする。
ホームポジションを崩さないで押せる上に、すぐにカーソル移動できる状態を保証できる。

ただし、`j`ないし`k`単体を入力したい際に、`timeoutlen`秒の待ちが発生するため注意が必要。

個人的には打ち間違いしにくい & Normal Modeで打っても元の位置に戻る`jk`が好きです。


## ii
### 一癖あるが合理的なアイデア
`i`でInsertになるなら`i`でNormalになるべきだと言わんばかりの設定。
2回押しが必要なため予期せぬ`ESC`は起きにくいだろうが、3回押すと再度Inserになってしまう。
(`i`連打でループできる)


`jk`と比べるとホームポジションを外れるため少し押しにくい気もするが、`ESC`に比べたら遥かに良い。
こちらも`i`単体を入力したい際に、`timeoutlen`秒の待ちが発生するため注意が必要。


## Tab
### インデントに困らないなら非常に優秀
インデントSpace派なら結構良いと思う。
Tabキーの使用頻度が大幅に落ちるため、そこを`ESC`とする。

ふとTab使いたい時に困りそうだが、ポジションは最高。

## Enter
### 鬼才
Enterを上書く。

https://vim.fandom.com/wiki/Avoid_the_escape_key#Using_the_Enter_key

改行したい時は`Shift-Enter`や`Ctrl-Enter`で良いらしい。
押しやすいけどもUX悪そう。

発想は面白いけど絶対使わない。


## Ctrl + xxx系
### 可能性は無限大
デフォルトでInsert時のCtrl + xxxってそこまで多くないので、空いているキーを自由に変える。
よく見かけたのが`Ctrl-L`や`Ctrl-Space`

`Ctrl-Space`は結構好きなバインドで、左手で完結できるあたりがとても良い。

# 個人的結論
色々調べて試し、今現在落ち着いたのは`Ctrl-g`でした。理由はいくつかあります

- 元々`ESC`は左手で押すので、左手で完結するキーが良い
- なるべくホームポジションから押しやすい場所がいい
- Normal Mode時によく使うキーバインドと同じものは避ける
    - 誤操作防止
- `Ctrl-Space`はTmuxで使っているためVimでは使えない
- Karabiner-Elementsでも同様の設定が簡単にできる

`jk`とこれで悩みましたが、単体入力時の待ちが少し気になったためやめました。
とはいえ今でも癖で`jk`してしまう時があるため、とても良い設定だったんだなと思います。

`ESC`代わりのキーをどこに置くかだけでも操作性は大きく変わるので、
みなさんも自分に合った設定を探してみてはいかがでしょうか。
WSL2で外付け光学ディスクドライブを使う

## モチベーション

音楽CDをbin+cueのイメージファイルとして保存しています。ここ1年はSpotifyで満足していたのですが久しぶりにCDでないと聴けない音源があったので、普段行き来しているWindowsとLinuxのどちらでも使える方法を考えたいと思い、試しました。

<details>
<summary>ほかに試したこと</summary>

### MSYS2+cdrdao

https://qiita.com/u1F992/items/b62f23d8608d880f89c8

以前こんなことをしていたので、まずはLinux向けのCLI`cdrdao`をMSYS2で動かすことを考えましたが、早いうちにあきらめました。あまり使われていない環境で依存関係とビルド手順を調べるのはつらいです。

### VirtualBox+cdrdao

VirtualBoxであればホストのUSBデバイスを簡単に仮想環境に引き渡せます。もちろんcdrdaoも実行できました。これでもよかったのですが、Windowsとの隔たりが大きく常用はしないだろうなと思いました。

</details>

## WSL2カーネルのビルド

https://zenn.dev/nanamiiiii/articles/a7d80c389a238d

ビルド手順自体はありふれているので読んだ記事を紹介して割愛します。`General Setup > Local version`を変更しておくのはとてもよさそうです。

有効にするオプションは以下の3つです。

- `SCSI device support > SCSI CDROM support`
- `USB support > USB Mass Storage support`
- `USB support > USB Attached SCSI`
  - パフォーマンスが改善するらしい

ビルドツールでWSL2環境を汚したくないのであれば、作業環境は現在の環境を複製するのがいいと思います。[参考](https://github.com/dorssel/usbipd-win/wiki/WSL-support)

```sh
wsl --list --verbose
wsl --export <current-distro> <temporary-path>\wsl2-usbip.tar
wsl --import wsl2-usbip <install-path> <temporary-path>\wsl2-usbip.tar
wsl --distribution wsl2-usbip --user <user>
```

あとは上の記事のようにUSB-IP経由で外付け光学ディスクドライブをWSL2に引き渡せば、WSL2から`/dev/sr*`として触ることができるようになります。

```
sudo cdrdao read-cd --device /dev/sr0 --read-raw --datafile image.bin image.toc
```
ChromeOS FlexのUSBインストーラ作成の裏道

# はじめに
- Windowsで、Chromeブラウザの拡張機能を使わず、Rufusを使ってChromeOS FlexのUSBインストーラを作る裏道です。裏道といっても、正規のリンクをたどって作成します。
- 普段からRufusを使い慣れており、ChromeOS FlexのUSBインストーラを作るためだけに、Chromeブラウザの拡張機能「Chromebookリカバリユーティリティ」をインストールしたくない人向けの手順です。
# 手順
- ~~まず、ChromeOS Flexのサイトに行きます。~~

https://chromeenterprise.google/intl/ja_jp/os/chromeosflex/

- ~~次図の赤枠で囲った「ChromeOS Flex を試す」をクリックします。~~
![ChromeOSFlex_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1849635/c0f2155b-05f6-cfee-1126-176a5f43e5a6.png)
- ~~次図の赤枠で囲った「こちら」をクリックします。自宅でChromeOS Flexを使わない人はクリックしないでください。~~
![ChromeOSFlex_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1849635/9640bb71-b090-c09f-625e-db90f59aa102.png)

（2024.10.13更新）上図の「こちら」が無くなっているようです。
次の「Chromeos Flexのインストールガイド」に行ってください。

https://support.google.com/chromeosflex/answer/11552529?hl=ja

- 次図の赤枠で囲った「次へ: 1:USB インストーラを作成する > 」をクリックします。
![ChromeOSFlex_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1849635/c8b64197-4991-c101-ad20-5aced46e8420.png)
- 次図のページが表示されたら、「Google からダウンロードする」の項まで下にスクロールします。
![ChromeOSFlex_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1849635/ebbf058e-93b4-0e7a-fb58-70a2d60655fd.png)
- 次図の赤枠で囲った「ChromeOS Flex インストーラ イメージ」をクリックしてzipファイルをダウンロードします。
![ChromeOSFlex_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1849635/a70c8d24-9d03-b8cc-620e-692b32a38ce0.png)
- 今回は「chromeos_15393.58.0_reven_recovery_stable-channel_mp-v2.bin.zip」というzipファイルがダウンロードされました。ダウンロードする時期によって、数字の部分が異なっていると思います。

- 後は、Rufusを起動して、8GB以上のUSBメモリをPCに挿し、ダウンロードされたzipファイル（解凍する必要は無い）を選択し、書き込むだけです。
.xlsx形式のスプレッドシートをPythonで使う

# csv形式のスプレッドシートの読み込み
csv形式のスプレッドシートを読み込む際は以下のようなコードで実行できます。

```python:readcsv.py
with open('PATH/example.csv') as f:
    reader = csv.reader(f)
```

# xlsx形式のスプレッドシートの読み込み
では、xlsx形式のスプレッドシートはどのようにして読み込むのでしょうか。
コードは以下の通り。
```python:readxlsx.py
import pandas as pd
from openpyxl import Workbook

df = pd.read_excel('PATH/example.xlsx',engine='openpyxl', sheet_name='シート名', header=None)
```
また、例えば一列目の要素を配列に入れたい場合は以下のコードで実行可能。
```python:readxlsx.py
url_list = df.iloc[:, 0].tolist()
```

## 出典
1\. note.nkmk.me PythonでCSVファイルを読み込み・書き込み（入力・出力）
https://note.nkmk.me/python-csv-reader-writer/

2\. Python Pandasを使ってExcel読み込みと書き込み
https://reffect.co.jp/python/python-pandas-excel/#excel-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF
新人がレベルアップするためにチームでやるべき4つのこと

# はじめに
私が社会人1年生（プログラミング1年生）の時にやってよかったと思う、チームの取り組みを紹介します。
おそらく再現性あると思うので、ぜひ新人がいるチームでは取り入れてみてください。

# 目次
1. ペアプロ、モブプロで新人が積極的にドライバーをする
1. 新人の実装したコードについてモブレビューをする
1. 見直し項目（レビュー項目）をまとめてみる
1. 手動テストの内容をマインドマップで書く

## 1. ペアプロ、モブプロで新人が積極的にドライバーをする
新人がドライバーをするメリットは、以下のとおりです。

- ショートカットを覚えられる
- コードの整形を入れる癖がつく
- 良くない作業順を訂正できる


どれも、きれいに作業をする上で必要な技術です。

私は最初、if文を書く時にendの前に処理を書き始めていたり、
ロジックがあっているかを適度に確認せずとにかく考えているロジックを全部書き切ろうとしていたり、
コードのインデントがズレていても平気だったり、
変数名の変更を手作業で直そうとしていたり、
挙げたらきりがないですが、とにかく作業がなっていませんでした。

しかし、モブでドライバーしている時に、先輩が
「先にend書こう！」
「一旦ココまでで確認しよう！」
「コード整形して！」
「リファクタリング機能使って！」
「ショートカット使って！」
などなど、作業に関する指摘をたくさん入れてくれたおかげで
今では、丁寧に、効率よく作業を進められるようになりました。

良い手癖をつけるには積極的に手を動かして、たくさん指摘されることが重要です。

ただし、コードの理解もしながら、手順の進め方も学ぶと頭に入り切らないよ！となるかもしれないので、ずっと新人がドライバーをする場合、30分〜1時間くらいで適度に休憩を入れましょう。

## 2. 新人の実装したコードについてモブレビューをする
私のチームでは、「モブレビュー」というレビュー方法を度々行います。
モブレビューとは、書いたコードを大きな画面に映しながら実装者が説明し、その場でレビュワーがコメントをするというものです。

ここで大事なのが実装者がコードの説明をするということです。

コードを説明するとき、以下のことが必要です。
- どの順番でコードを説明するべきか考える
- なぜその実装に至ったかを説明する
- 実装中に悩んだ部分を、悩んだ理由も含めて説明する
- レビューの内容を受けて、その場で適宜コードを変更する

これが新人にとっては、良い復習になります。

私の初めてのモブレビューは（ココロの準備含め）準備なしで挑んだのですが、見事テンパりました。
しかし、うまく説明できた時の達成感は大きかった記憶があります。

コードを説明するという過程にも学びがあるし、良い成功体験に繋がります（説明が酷くてもレビュワーがうまく聞いてあげればレビューは成立するので、いうて失敗することはないです）。

また、先輩レビュワーの観点も学べるという点でも意味ある時間になるのでとってもおすすめです！

## 3. 見直し項目（レビュー項目）を　まとめてみる
開発をしている時、設計を俯瞰したり、可読性高いかな？無駄コード書いてないかな？と考えるなど、みんな自己レビュー（見直し）を行うと思います。

しかし、最初私は目の前のロジックに必死で自己レビューしていませんでした。
もっと言えば、ロジックがうまく機能していること以外に何を見直せば良いのかわかっていませんでした。

そんな時に、チームで1時間くらい時間を取って、レビュー項目をまとめてみました。
これによって、自分にはどんな視点が足りていないのか、何を気にしながら開発するべきなのか把握することが出来ました。

そもそも、開発中にロジックを組むこと以外のことを考えるべきということ自体大発見でした。

たった1時間で非常に効果が出るので、圧倒的おすすめです。

## 4. 手動テストの内容をマインドマップで書く
朗報、コードを書くのに四苦八苦しても、論理的に考えれば有効な手動テストケースを出すことは可能です。

しかし、やはり新人が最初に書いたテストケースは、足りない。

まず、非機能要件を確認するという発想がない（本当に初心者の場合）。
そして、シンプルに仕様やコードの影響範囲を把握していない事による、漏れがある。

そこで、マインドマップを通して、どんな観点でテストしないといけないのかを洗い出します。
自分の頭の整理にもなりますし、自分の理解を試すことにもなります。
また、マインドマップのレビュー先輩は当たり前に持っている観点を学ぶことが出来るので、レベルアップにおすすめです。

# 最後に
今回は新人がレベルアップするためにチームで取り組めることを紹介しました。どれもすぐに取り組めることなのでぜひやってみてください。
質問が苦手な人のための質問構文

# はじめに

新卒の方の配属も始まり、お話する機会も増えてきました。
質問しないと分からないことも多いと思います。でも何て聞いたら良いか分からなくて躊躇ったりしませんか。私はそうでした。
背中を押せるよう、実践してみて役に立った方法をご紹介します。


## DESC法で話を組み立てる

心理学に「アサーション」という領域があります。
詳しいことはいったん置いておきますが、その中にDESC法というものがあります。
DESCとはDescribe、Express、Specify、Chooseの頭文字で、この枠組みで話を整理していく方法です。

何が言いたいか分からなくなった時、これで整理すると質問を組み立てやすいです。
以下ざっくり説明です。


### Describe：描写する
自分が直面している状況などを、客観的に描写する。自分の主観的な解釈は含めないのがポイント。

### Express：表現する
描写した状況に対する、自分の感情や気持ちを書く。

### Specify：明確に提案する
どうしようと考えているか、解決策、相手にして欲しいことなど、提案を具体的に提示する。

### Choose：選択する
相手の反応に対する応答を２種類用意する。
例）相手が提案にYesと言った場合、Noと言った場合




### 例
書類の書き方がわからず、相談したい。

- Describe（描写）
-XXXという書類を書いています。〇〇という箇所が分からず、書くことができません。
- Express（表現）
-自分でも考えてみたのですが、うまく解釈できず困っています。
- Specify（明確に提案する）：
-一度ご相談のお時間をいただけないでしょうか。チャットか、ご都合が合えば対面でお願いしたいです。
- Choose（選択する）
-Yesなら日程調整をする。Noなら誰に確認したらよいか聞く。

### 補足
- 状況に応じて、どこかスキップしたり、順番を入れ替えてもOKです。
- 個人的に、チャットで質問する場合はChoose（選択）は省略して考えることが多いです。対面で緊張しそうな場合はCまで考えます。
- Express（表現）でどの程度感情を表現するかは相手と状況に合わせます。
- 無くてもいいのですが、こちらの切迫感が伝わないことがあるので、最初は少し含めてみて、様子を見て調整でよいと思います。


## 短く済ませたい時
結論を先に、手短な連絡を好む人もいます。
そういうときはSpecifyから考えて、一言Describe（描写）とExpress（表現）を添えると組み立てやすいです。

上の例で言うと、
「〇〇についてご相談したいのですが、どこかでお時間いただけませんか。XXXの〇〇が分からず困っています」という感じです。

## もっと技術的な質問をしたい時
今出たエラーについて聞きたいんだよ！という時、DESC法は適切でないかもしれません。
そういう時の質問パターンは先達の方々が記事に残してくださっていますので、ぜひ検索してみてください。

例えばこちらの記事の
- 「技術系メーリングリストで質問するときのパターン・ランゲージ」
-  「Five Orders of Ignorance」　は一読をお勧めします。

https://qiita.com/seki_uk/items/4001423b3cd3db0dada7

# おわりに
最初は緊張するかもしれませんが、分からないことは質問した方がトラブルになりませんし、何より自分の力になります。
この記事がみなさんの質問ライフに少しでも役立てば幸いです。
BizRobo!の活用事例を参考にロボット開発してみた

就業先では、RPAツールのBizRobo!を使用しています。BizRobo!開発で悩み、BizRobo!ナレッジベースで日々検索しています。

BizRobo!のスキルを磨くために、eラーニングを受講したり、BizRobo!の資格対策をしたりしました。さらにBizRobo!スキルを磨くために、RPAテクノロジーズ株式会社のHPにある活用事例を参考に自分でRPAを開発してみることにしました。
今回は、活用事例を参考にしたBizRobo!開発をご紹介します。

※時間が経過して変わってしまった箇所や間違っている箇所、不適切な表現があるかもしれませんが、その時は都度修正いたしますので、ご指摘いただけると幸いです。


## BizRobo!の活用事例とは
RPAテクノロジーズ株式会社の公式HPにはBizRobo!を導入した事例が載っています。
[【RPA導入事例】BizRobo!活用事例](https://rpa-technologies.com/implementation/)
金融や医療、サービスなどたくさんの業界でBizRobo!を用いた自動化の実績を見ることができます。各業界の方が、公式HPをみた際、「自分たちの業界でこんなことができるなら、導入してみようかな」と感じることでしょう。

各活用事例はパワーポイントのスライド1枚分にまとめています。1枚をみることで、目的や背景、費用対効果、実際の手順、業務フローまで把握することができます。要件概要書のようなページとなっています。

業界ごとのページでなく、活用事例の全てを1ページにまとめたURLを見つけました。
[【RPA導入事例】BizRobo!活用事例　一覧](https://rpa-technologies.com/implementation/?c=1)
業界に関係なく、活用事例を調べることができるため、上記URLから自分の環境でも再現できる活用事例を探し、開発してみようと思った次第です。

## 参考にした活用事例は
今回自分が参考にした活用事例は下記となります。

:::note info
<strong>タイトル：</strong>競合店の価格を集計・出力する業務
<strong>業界：</strong>卸売・小売
<strong>関連部署：</strong>商品管理部
<strong>背景：</strong>競合店サイトが複数あるが、そのサイトの商品数が非常に多く、人でデータをまとめるにはかなりの時間がかかり、やれていなかった。他にも類似のデータ収集業務があるため、汎用性の高い業務だと判断した。
<strong>効果：</strong>競合店の価格情報をタイムリーに共有でき、集計データを商品企画会議で活用できるようになった。価格情報だけでなく、天気や気温のデータ、ゴムや段ボールの相場価格など様々な情報も集計できるようになった。
:::


上記は、典型的なデータ収集業務になります。自分の就業先ではデータ収集業務を行っていないですが、RPA化することが多い代表的な業務になります。

こういう業務をRPA化することで、WebスクレイピングのRPA開発の経験を積んでおきたいと考えました。

## 開発したロボットは
自分が活用事例を参考に開発したロボットは下記になります。
<img width="75%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955689/aab4b555-af8e-eb37-a4dd-49b24c2e0520.png">
活用事例をそのまま再現することができませんでした。
なぜなら、競合店のサイトを複数探すことができなかったからです。

そのため、今回はプロテインをターゲットにAmazonからプロテインを複数ピックアップし、そこから価格情報を取ってくることにしました。


下記のような集計専用ファイルも作成しました。
<img width="75%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955689/ce2f5230-27a7-17eb-fbcd-8b1e5da88f01.png">
上記は設定情報シートになります。
メーカー情報と欲しい商品名、該当サイトのURLを載せています。ここに記載されている情報をもとに価格情報を取得するような処理フローとしました。


<img width="75%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955689/42108187-0b31-5c05-dac5-9653637bcbe4.png">

上記が実際に取得した価格情報を記載するアウトプットシートになります。
月の行がありますが、こちらにはロボットを実行させた日にちを入力するようにしました。
競合店の名前だけはA列に記載しており、B列以降は価格を入力させています。

RPAテクノロジーズ株式会社が実際に携わった活用事例と違うと思います。
それでも、活用事例ページから自分で要件を整理し、それを元にロボットを開発することは、要件定義から設計書を作り、開発する業務と似ており、いい学習になっています。


## 最後に
活用事例を参考にしたBizRobo!開発について、ご紹介いたしました。BizRobo!などRPAのスキルを磨くには、実際に開発することが大事だとRPAエンジニア同士の会話や就業先でよく聞いていました。

実際に自分のパソコンでRPAの開発をすると、経験を積むことができるので、就業先での開発も早くなりました。RPAで実際に開発することの重要性を実感しました。
今回の記事が、RPAのスキル向上で悩んでいる人の為になれば幸いです。

今後もBizRobo!開発に役立つような記事を書いていきます。
Google Bardの日本語回答に画像を含める方法

## はじめに

Google Bardが画像の出力が可能になってから約1ヶ月が経過しました。
しかし、現時点では英語での回答のみに対応しているようで、日本語での回答に関してはまだ具体的な時期が分からないというのが現状です。~~早く対応してほしい......~~

というせっかちな皆様のために、この記事ではGoogle Bardの日本語回答を画像と一緒に出力させるプロンプトをご紹介します。参考になれば幸いです。


https://bard.google.com/?hl=ja

## 番外：普通に質問すると...

**きりたんぽの画像（迫真）**
![スクリーンショット 2023-06-26 16.21.53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345323/2456ae37-ed1e-ca6a-b394-36da1849e9ca.jpeg)

## 質問は英語、回答は日本語

ちょっとずるいですが、英語で質問し、その上で日本語で回答するように指示するのです。一番間違いないです。

英語で質問を書き、後ろに`answer in Ja`を付け加えると、日本語で回答してくれるようになります。
![スクリーンショット 2023-06-26 16.48.18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345323/f99eec2e-b292-6733-f94d-8a3197737947.jpeg)
日本語の回答にちゃんと画像が挿入されています。

利点としては、DeepLなどの拡張機能を使って回答を翻訳する手間が省けること......とかがあげられますかね？質問文は簡単な英語で用意できますから、むずかしいアメリカ語が読めないあなたや私にはいい方法だと思います。

ちなみに`ans in ja`や`lang:ja`を指定すると、英語の回答がほとんどになってしまいます。横着してはいけませんね。

## 追記

API経由でどうにかできないか現在考え中です。
~~どうにかできるようになる前に日本語に対応してくれるといいですね。~~