OmniAICreator/Qiita-1.07M huggingface dataset:
kintoneでもasync/awaitで非同期処理をしたい

タイトルまんまです。
もうコールバック地獄から開放されたい！思いから試してみました。

肝はfunction(event) →async function(event) とすること。簡単簡単。

```
kintone.events.on(['app.record.edit.submit'], async function(event) 
{
    console.log("-START");
    console.log("1");
    await promiseWait("1");
    console.log("2");
    await promiseWait("2");
    console.log("3");
    await promiseWait("3");        
    console.log("-END");

    return event;
});

async function promiseWait(opt) {
    console.log("※3秒待機 "+opt);
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve();
        }, 3000);
    });
}
```
動作結果は下記

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76660/16c09e7e-7089-319e-8b5d-fb8c7d007d31.png)
YOLOv3動かしたメモ

(自分用のメモなので体裁は後ほど・・・)

#開発環境
Windows10


#やったこと

- Python3.7インストール

- 必要モジュールをpipでインストール


```bash
pip install pandas opencv-python matplotlib cython
```
- PyTorchインストール

公式サイトでインストールコマンド表示してくれるのでそれを利用
https://pytorch.org/get-started/locally/

```bash
pip3 install https://download.pytorch.org/whl/cpu/torch-1.1.0-cp37-cp37m-win_amd64.whl
pip3 install https://download.pytorch.org/whl/cpu/torchvision-0.3.0-cp37-cp37m-win_amd64.whl
```

インストール後python起動して"import torch"して試してみてエラーなければOKっぽい

```bash
PS F:\> python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
```

- YOLOv3ダウンロード

とりあえずgitからzipで持ってくる。
https://github.com/ayooshkathuria/pytorch-yolo-v3.git

YOLOv3の学習済みファイルをダウンロードする
https://pjreddie.com/media/files/yolov3.weights

学習済みファイルはYOLOv3のルートに格納する

- デモプログラムで試す

```bash
python video_demo.py --video '2019-07-05 11-08-27.mp4'
```
浮動小数点データ型で、realとdouble precisionのどっちを使うべきか

# はじめに
テーブル設計をする時、浮動小数点を扱うデータ型に、realと、double precisionと２種類あるが、どっちを選ぶべきかについてまとめてみた。

# 環境
PostgreSQL 9.5

# 説明
オフィシャルドキュメントを見ると、**real**は**6桁精度**、**double precision**は**１５桁精度**とある。

https://www.postgresql.jp/document/9.3/html/datatype-numeric.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/9699d4f3-6931-6a82-2336-ef5a12b04093.png)

６桁精度とは、整数部＋小数部で６桁以下という事で、１５桁精度とは、整数部＋小数部で１５桁以下という事。（この時、小数点は含めません）

見た方が早いと思うので、データを格納してみる。つまり、このようなデータが格納できるという事です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/8c4c1045-6bc3-b1ff-7df2-6a01049008e0.png)
nuxt-property-decorator で transition


- 参考

https://cmty.app/nuxt/nuxt-class-component/issues/c8
https://github.com/nuxt/nuxt.js/blob/dev/examples/layout-transitions/pages/users.vue#L22-L25

```xxxx.ts

import { Component, Vue } from "nuxt-property-decorator";

@Component({components: {}})
export default class extends Vue {
  transition(to: any, from: any) {
    if (!from) return "slide-left";
    return +to.query.page < +from.query.page ? "slide-right" : "slide-left";
  }
}
```
変数と定数

[JavaScript本格入門](https://www.amazon.co.jp/dp/477418411X/ref=cm_sw_r_tw_dp_U_x_wxAJCbT3GGKT9)(ISBN 978-4774184111)で基礎からJavaScriptを勉強するシリーズです。
今回はChapter2から変数と定数についてです。

# 変数

## 変数宣言

変数宣言は`var`命令で行います。

```js
var 変数名;            // 変数宣言
var 変数名 = 初期値;    // 変数宣言と初期化
```
リテラルの型によって変数のデータ型が自動的に変わります。
データ型が自動的に変わる例を下記に示します。

```js:リテラルの型によって変数のデータ型が決定する
var x = 1;              // 変数xを数値型リテラルで初期化
console.log(typeof x);  // 出力:number
x = 'Hello world!';     // 変数xに文字列型リテラルを代入
console.log(typeof x);  // 出力:string
```
変数xは数値を代入したときは数値型になり、文字列を代入したときは文字列型になっていることが分かります。`JavaScriptには型がないというのは誤解`です。
※[typeof演算子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/typeof)はオペランドの型を文字列で返してくれます。

## 変数宣言（ES2015）

ES2015からは`let`による変数宣言が標準化されました。構文は`var`命令と同様です。
**ES2015が使える環境では`var`よりも`let`を使うようにしたほうが良いです。**
コンパイル時にvarよりもletの方が厳密なチェックが行われ安全です。

```js
let 変数名;            // 変数宣言
let 変数名 = 初期値;   // 変数宣言と初期化
```

`var`との違いを順番に見ていきます。

### 変数の重複がNG

```js
let x = 'hoge';
let x = 'foo';
```

```:実行結果
let x = 'foo';
    ^

SyntaxError: Identifier 'x' has already been declared　　　// 同名の変数がすでに宣言されている!!!
    at new Script (vm.js:79:7)
    at createScript (vm.js:251:10)
    at Object.runInThisContext (vm.js:303:10)
    at Module._compile (internal/modules/cjs/loader.js:657:28)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)
```
同様のことを`var`で行った場合エラーとならず、後から宣言された変数がxを上書きしてしまいます。
`let`を使うことでソースコードが長い場合にうっかり変数を上書きしてしまうなどの事態を防げます。

### ブロックスコープに対応している

```js
let x = 1;
if (x === 1) {
  let x = 2;
  console.log(x);   // 2を出力
}
console.log(x);     // 1を出力
```

```:実行結果
2
1
```

これはifブロック内で宣言した`変数x`と、外で宣言した`変数x`が別のものであることを意味しています。
JavaScriptでない言語を学んだ人からするとごく自然なことです。

一方、これを`var`を使うと下記のようになります。

```js
var x = 1;
if (x === 1) {
  var x = 2;
  console.log(x);   // 2を出力...?
}
console.log(x);     // 1を出力...?
```

```:実行結果
2
2
```
`var`はブロックスコープに対応していません。したがってifブロック外で先に宣言された`変数x`をifブロック内で宣言された`変数x`で上書きしてしまいました。

それが`var`の仕様と言ってしまえばおしまいなのですが、直感的にはおかしな動きなので、`let`を使う方がミスが防げそうです。

## 定数
### 定数宣言
`const`命令を使用します。ES2015から標準化されました。
値を変えられたくない固定値は定数を利用します。

```js
const X = 3.14;
X = 3.15;         // 値を変えようとしてみる
```

```:実行結果
X = 3.15;
  ^

TypeError: Assignment to constant variable. // ちゃんと怒られました
```

### 注意点

参照型を定数にする場合アドレス自体は変更不可ですが、参照先のデータは定数とならないので注意が必要です。

```js

const GIORNO_GIOVANNA = {stand: 'Gold Experience'};

try {
    GIORNO_GIOVANNA = 'change!';                     // 参照型の定数自体は変更できないッ!
}catch(error){                                       // TypeError: Assignment to constant variable.
    console.log('Unless! Unless! Unless!');
}

GIORNO_GIOVANNA.stand = 'Gold Experience Requiem';   // 参照先のデータは変更可能なので注意ッ!
console.log(GIORNO_GIOVANNA);
```
AWSのIAMポリシーの「説明」に日本語を使う方法(小ネタ)

## TL;DR;
1. コンソールからだとAWSのIAMポリシーの「説明」に日本語は使えない
2. CLIからだったら使える
3. 検証してないけどCloudFormationでも使えるんじゃないか

## 背景
同僚Tが「昔誰かが作ったポリシーの説明に日本語が使われてるんだけど、あれどうやってるんだろ？」みたいな話をしてました。
同僚S「昔はできたけど仕様が変わったとか？」
私「ブラウザが翻訳してるだけとか？」
T「違うみたいです(スクショをペタリ)」
私「あー、ほんとだ。これは自動翻訳じゃないわー」
T「でしょ？」
私「でも、`最大 1000 文字。英数字と「 +=,.@-_ 」を使用します。`って書いてあるしなー」

![aws_create_policy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28487/b1a521bb-e60b-5662-f996-ca4893e267a7.png)

私「ひょっとしてコンソールでバリデーションしてるだけでCLIとかなら行けるとか？」
T「まさかーｗ。AWSともあろうとこがそんな雑なことしないでしょーwwww」
私「ですよねーｗ」

## やってみた
```
aws iam create-policy --policy-name "sample-lambda-execution-jp" --description "ラムダを実行(CLIから日本語入力テスト)" --policy-document file://適当に作ったポリシーファイル.json
```

## できちゃった
![aws_policy_jp_description.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28487/df84cf80-dc18-32e6-cc65-3cc8db770c51.png)
※スクショとコマンドで実行

## まとめ
T & S & 私「えぇ…」
何はともあれ、CLIとコンソールではポリシーの説明に使える文字の制約が違うようで、日本語が入力できるようです。
試してないけどCloudFormationでもできるんじゃないかと思います。
~~コンソールでもJSのバリデーション部分をドッタンバッタンすればできるんじゃないかな！~~
wordpressのビジュアルエディタでテーブル・表を簡単に作成する方法

wordpressで記事を書いていると、
「あ、これ表を作りたいなー」という時がありますが、
そんな時私はテキストエディタモードの方で
HTMLでtableを粛々と書いてました。
が、なんとビジュアルエディタで簡単に作ることができましたのでその方法のメモです。

Excelを使用します。
Excelで適当に行列を使って表を作ります。
<img width="564" alt="スクリーンショット 2019-07-05 11.08.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/a49a12c2-03c5-ea1c-458d-2b6e8a0c6a00.png">

そしてコピーして

<img width="761" alt="スクリーンショット 2019-07-05 11.08.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/924082d2-1afd-d67f-b9fb-21747cea1c58.png">

ビジュアルエディタモードの方に貼り付けるだけ！

<img width="760" alt="スクリーンショット 2019-07-05 11.09.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/6835ee05-dd87-634b-95b7-a3837a17d3be.png">


便利！

テキストモードで見ると、ちゃんとtableタグが生成されているのでここからスタイル調整も簡単に可能です。
MeCabをローカルにインストールして躓いた時に見て欲しい

またその内、別の環境にインストールするときに躓きそうなのでメモ。。。　


## 対象の方
- MeCabをローカルにインストールした。 
- ipadicもローカルにインストールした。 
(まだ入れてないよって方は、 [この記事](https://qiita.com/pugiemonn/items/e4e0c5c620566c45c3f0))
- でもmecab使えない。

## mecabを実行するとエラーが出る
~~~bash
$ mecab --version
mecab of 0.996

$ mecab
param.cpp(69) [ifs] no such file or directory: /usr/local/etc/mecabrc
~~~

## 解決策
mecabrcが見つからないと怒られてるので、環境変数MECABRCにパスを通す。

~~~bash
export MECABRC="[インストール先]/etc/mecabrc"
~~~

## できた

~~~bash
$ mecab
やったねメカブちゃん形態素解析できるよ
やっ	動詞,自立,*,*,五段・ラ行,連用タ接続,やる,ヤッ,ヤッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
ね	助詞,終助詞,*,*,*,*,ね,ネ,ネ
メカブ	名詞,固有名詞,一般,*,*,*,*
ちゃん	名詞,接尾,人名,*,*,*,ちゃん,チャン,チャン
形態素	名詞,一般,*,*,*,*,形態素,ケイタイソ,ケイタイソ
解析	名詞,サ変接続,*,*,*,*,解析,カイセキ,カイセキ
できる	動詞,自立,*,*,一段,基本形,できる,デキル,デキル
よ	助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
EOS
~~~

何だろうなぁ。 
再インストールしたらエラーが出たので、アンインストールに失敗したゆえのエラーかもしれない。。。

以上。
LXDストレージプールのbtrfsボリュームの透過圧縮を有効化する方法

まず、透過圧縮を行いたいボリュームを特定します。

```
# lxc storage list
+---------+-------------+--------+--------------------------------+---------+
|  NAME   | DESCRIPTION | DRIVER |             SOURCE             | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| default |             | btrfs  | /var/lib/lxd/disks/default.img | 1       |
+---------+-------------+--------+--------------------------------+---------+
```

次に、以下のコマンドを入力します。デフォルトでは ```user_subvol_rm_allowed``` が指定されていますので、これに加えて ```compress=lzo``` を指定します。（user_subvol_rm_allowedはつけなくても良いかもしれませんが念のため）

```
# lxc storage set default btrfs.mount_options user_subvol_rm_allowed,compress=lzo
```

lxdサービスを再起動し、mountコマンドでcompress=lzoが有効化されたことを確認します。

```
# service lxd restart
# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
～ （略）　～
/var/lib/lxd/disks/default.img on /var/lib/lxd/storage-pools/default type btrfs (rw,relatime,compress=lzo,space_cache,user_subvol_rm_allowed,subvolid=5,subvol=/)
～ （略）　～
```

## 参考

- ストレージの設定
 - https://lxd-ja.readthedocs.io/ja/latest/storage/
- btrfs の透過圧縮を有効にしてみる
 - https://ikata.co/blog/enable-btrfs-compression.html
【UiPath】テキスト、CSVファイルをUTF-8で書き込むとBOMが付く

# 現象
UiPathで作成したテキストファイルまたはCSVファイルを他のところで使用するときに、「不正な文字がある」等のエラーが出て上手くいかない。

# 原因
もしかしたら文字コード「UTF-8」のBOMが原因かも知れない。
UiPathでテキストファイルやCSVファイルを作成するとき、エンコーディングの指定を空白または「UTF-8」にした場合、BOM付UTF-8になる。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/f20f1c06-7dfd-299c-756f-cda8063dc07e.png)

「BOM」とはテキストファイルの始めに付く見えない記号のようなもので、そのファイルがどんな文字コードで書かれているかを教えてくれる。
ただし、UTF-8においては「付けない方が良い」とされているので、BOMが付いていると上手く読み込めなくなるシステムも多い。

作成されたファイルにBOMがあるかどうか確認するためには、サクラエディタなど、(メモ帳よりは)高機能なテキストエディタを使用して、ファイルを開いてみると良い。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/d90e5575-16da-ae99-d82b-a6d06eb28d23.png)

# UiPathでのBOM無しUTF-8のファイル作成方法
ファイル書き込みのプロパティを見てもBOM無しで出力する方法は見当たらないため、自力でBOMをなくすフローを加える必要がある。

## BOM削除のサンプル
テキストファイル書き込み後に`コードを呼び出し`を追加する。
`コードを編集`ボタンを押した後のウィンドウに、下記コードを貼り付ける。
このコードでは、指定されたファイルを一旦BOM有UTF-8で読込み、その内容をBOM無UTF-8にしてファイルに書き込んでいる。

```vb
If Not File.exists(in_filePath) Then
	Exit Sub
End If

Dim tmpPath As String = in_filePath & ".tmp"

File.Move(in_filePath, tmpPath)

Using reader As New StreamReader(tmpPath, New System.Text.UTF8Encoding(True))
	Using writer As New StreamWriter(in_filePath, False, New System.Text.UTF8Encoding(False))
		
		Dim line As String = reader.ReadLine
		
		Do While line IsNot Nothing
			writer.WriteLine(line)
			line = reader.ReadLine
		Loop
	
	End Using
End Using

File.Delete(tmpPath)
```

引数は以下の通り。`in_filePath`にBOMを取り除きたいファイルのパスを指定する。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/cd64ba05-efe0-6596-6dd8-1157e6a56d14.png)

実行後のファイルを確認してみると、作成されたファイルのBOMが無くなっていることが分かる。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/9f8ec161-630f-51e8-4f6c-b820cc92ef77.png)
gitで`fatal: unable to read tree ~~`となって困った話

##概要
`error: object file .git/objects/hogehoge/hugahugahuga is empty`
とか
`fatal: unable to read tree hogehuga`
というエラーが発生して該当ファイルの削除をしたり色々試した結果
`git stash`や`reset`もできずプッシュもチェックアウトもできなくなって詰んだ
↓↓↓
`git checkout --force [ブランチ名]`で、無理やりそのブランチから逃げて、新しく別のブランチを作って作業し直した(変更箇所はメモしておこうな(自戒))

##環境
+ gitlab
+ ubuntu - 16.04.4 LTS
+ git - 2.7.4
 
##どんなことがあったか
先日仮想環境が落ちて再起動したところ
`error: object file .git/objects/hogehoge/hugahugahuga is empty`
という感じのエラーに遭遇した

ネットでそれらしい記事を探したところ、以下の記事を見つけたので試してみて
https://bokunonikki.net/post/2018/0910_git_object_empty/
ひとまず上手くいったように見えたが、pushかstashをしようとしたときにタイトルにも書いた以下のエラーが発生してコマンドが実行されない状態に陥ってしまった。
`fatal: unable to read tree hogehuga`

そこで「強制チェックアウトならあるいは？」と思い`git checkout --force develop`を実行したところ成功。
ブランチを一度削除してもう一度リモートからブランチを取ってきて作業を進めた。
これで上手くいったと思いきや、コミットしようとした際にまた`object file ~~ is empty`の文字が...

環境構築やり直し？うっ、頭がorz

##結局どうしたのか
そんなに時間を割く余裕もなかったので最終的には、再度`git checkout --force`でブランチを変えて、リモートのgitlab上で新たにブランチを作成してそこでもう一度同じ作業をやり直した。
（せめて変更箇所をメモ帳か何かにコピっておけばよかったorz）

##結論
+ タイトルのエラーが発生してgitのコマンドが思うように使えなくなっても、`git checkout --force`でとりあえずそのブランチから逃げられた
+ コミットとプッシュはこまめにしよう

##原因の推測
仮想環境が落ちてしまった時に、プッシュしていなかった新規ファイルがおかしくなってしまったのではないかと思う。（一度ブランチを削除した後に、再度同じ新規ファイルを作成したらエラーになったからという安直な推測）

気が向いたら再現するかどうか試してみようと思う
手元にサーバー不要でWebSocket Client間で通信できるフリーサーバー Achex, Websocket.in が便利そう

ページ間やアプリケーション間で連携をするときにWebSocketはとても便利です。

しかし、AとBでメッセージをやり取りしたいとき
その両方がHTMLページだったときのような場合、AとBはクライアント機能しか持っていないため、どこかでサーバーCを立てAとBはCと通信しなければなりません。

このサーバーCを用意して、Cに投げたメッセージを自動でAやBに送信してくれるサービスがあります。

それが
[Achex](https://achex.ca/)
や
[WebSocket.in - The open and free WebSocket server for all.](https://www.websocket.in/)
といった登録不要でWebSocketサーバーを提供してくれるサービスです。

使い方も簡単でベースとなるURLに任意のインスタンスを追加することである程度プライベート[^1]な空間になります。

[^1]: セキュリティ的な意味ではなく

achexを例としてあげると、
`wss://cloud.achex.ca/qiita`
とすることでここに接続しているグループを`qiita`インスタンスとして管理できますし、さらに細かくHubとしてグループ分けもできます。

![achex.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62354/d17efdd3-92fb-7e06-77ce-e00f0f56c878.gif)




簡単な例としてユーザー指定のメッセージ送信の例です。(もっと簡単な例として全体発言のechoもあります)

手順は接続→認証→送受信です。

```js:送信側
  const socket = new WebSocket('wss://cloud.achex.ca/qiita');

  socket.addEventListener('open', function (event) {
    console.log('open',event)
    // 事前登録などはなく使用時に好きなものを入れられます。
    socket.send('{"auth":"khsk", "password":"pass"}');
    socket.send('{"to":"receiver", "msg":"test"}');
  });

```

````js:受信側
  const socket = new WebSocket('wss://cloud.achex.ca/qiita');

  socket.addEventListener('open', function (event) {
    console.log('open',event)
    socket.send('{"auth":"receiver", "password":"pass"}');
  });

  socket.addEventListener('message', function (event) {
    console.log('message',event)
    const json = JSON.parse(event.data)
    console.log(json)
    // auth時のレスポンスもmessageで来るので弾いておきます
    if (json.auth == 'OK') {
      return
    }
    console.log(json.msg)
  })
```

こうすることで`receiver`へメッセージを送信することができます。
JSON形式なのでmsgにはオブジェクトや配列も渡せていろいろ使い道がありそうです。

センシティブな情報でなければfreeですし、通知機能などの個人利用では十分そう。
IPアドレスやポートの固定化も必要ないので、WSサーバーを立てすぎてどれがどれだったかと頭を悩ましたりサーバーの維持に気を使う必要もなさそうです。

# 情報源

* [live and free websocket server - Stack Overflow](https://stackoverflow.com/questions/34980852/live-and-free-websocket-server)
goenvを使ってMacにGo1.12.xの開発環境を構築する(Go1.13以降にも対応）

## 1. Homebrewでgoenvをインストール
`brew install goenv`でインストールしたgoenvのバージョンは1.23.3で新しいGoのバージョンがでても反映されません。
新しいものは全てgoenv 2.0.0bataXXに反映されていきます。
なので以下の方法でgoenv 2.0.0bataXXをインストールします。

Homebrewでgoenvの**HEAD**をインストールする。

```shell
$ brew install --HEAD goenv
```

その後`~/.bash_profile`に以下の設定を追記する。

```bash:~/.bash_profile
export PATH="$HOME/.goenv/bin:$PATH"
export GOENV_DISABLE_GOPATH=1
eval "$(goenv init -)"
```

ターミナルで`source ~/.bash_profile`を実行し変更を反映させる。

## 2. Goのインストール
### ダウンロード可能なgolangバージョンを調べる。
```shell
$ goenv install -l
 ```
### 欲しいバージョンをインストールする。
```shell
$ goenv install 欲しいバージョン
```
(例：1.12.6が欲しい場合は`goenv install 1.12.6`を実行する。)

## 3. Goの設定
### 使用するバージョンを設定する。
```shell
$ goenv global 1.12.6
```
`go version`で`go version go1.12.6 darwin/amd64`と表示されれば完了

## 4. GOPATHの設定
### `~/.bash_profile`に以下の設定を追記する。
```bash:~/.bash_profile
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
```
### 変更を反映させる。
```shell
$ source ~/.bash_profile
```

## 注意事項
`brew install --HEAD`でインストールしたものは`brew upgrade`では**更新されない**
なので

```shell
$ brew upgrade --fetch-HEAD goenv
```
で更新しましょう。
[HEADバージョンで入れたパッケージのアップデート](https://rcmdnk.com/blog/2016/09/29/computer-mac-homebrew-brew-file/#head%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%A7%E5%85%A5%E3%82%8C%E3%81%9F%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88)

## 追記(2019/09/26)
少し前にGo1.13が出ましたね。
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">🥳 Go 1.13 is released!<br><br>📝 Release notes: <a href="https://t.co/B5cODBfZHv">https://t.co/B5cODBfZHv</a><br><br>⬇️ Download: <a href="https://t.co/StazJXa19M">https://t.co/StazJXa19M</a><a href="https://twitter.com/hashtag/golang?src=hash&amp;ref_src=twsrc%5Etfw">#golang</a></p>&mdash; Go (@golang) <a href="https://twitter.com/golang/status/1168966214108033029?ref_src=twsrc%5Etfw">September 3, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

上記の手順を行えばGo1.13.Xもgoenvで使用できます。
SQSから大量のメッセージを消すときのTips

## 普通は

マネジメントコンソールから消すことが出来ると思うけど、大量のデッドレターキューを削除、とかやると、キュー消すのが時間がかかって戻ってこないよね。  


## コマンド

SQSを消す権限のある（=IAMロールを保持している）EC2でAWS CLIを利用する。
queue-urlの部分は適当差し替えること。

```
aws sqs purge-queue --queue-url <queue-url> --region ap-northeast-1 --output json
```
【var()　関数】CSSでこんなことができるの知らなかった！

# 生のCSSでこんなことができる！

CSSで変数を使うとなるとSassやLess・・・と思っていましたが、なんとCSSでもCSS Variablesと呼ばれる便利な機能が存在していたようです。

[CSS変数: MDNサイト](https://developer.mozilla.org/ja/docs/Web/CSS/--*)

## ザックリと一例を


```css

/* あらかじめ使用する値を定義する */
:root {
  --primary: #ddd;
  --dark: #333;
  --light: #fff;
  --shadow: 0 1px 5px rgba(104, 104, 104, 0.8);
}

/* CSSリセット */
* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}


 /* ここで使用！ */
.btn {
  background: var(--dark);
  color: var(--light);
  padding: 0.6rem 1.3rem;
  text-decoration: none;
  border: 0;
}

.main-nav a {
  background: var(--primary);
  display: block;
  text-decoration: none;
  padding: 0.8rem;
  color: var(--dark);
  text-align: center;
  font-size: 1.1rem;
  box-shadow: var(--shadow);
}

```

このように```var()```のカッコ内に定義した変数名を入れれば簡単に使えます。
なんども同じ値を入力したり、変更する手間が省けるのでかなり便利です。

## ブラウザ対応

[caniuse.com](https://caniuse.com/#feat=css-variables)だと、主要なブラウザでは特に問題なさそう？

chromeだと2016年に、
firefoxだと2014年にリリースされたバージョンまで対応されています。

ただ、これは個人的な解釈であり、実務でブラウザ対応はどこまでやるか、などの知識や経験があるわけではないので、実際の現場で得た経験者の意見がありましたらぜひ教えてください！
gtags (GNU global) で、関数の位置がうまく認識されずずれてしまっているときの対処

# 現象
`:Gtags -f %` をやってみたが、会社独自の define などが使われているせいか関数の先頭がうまく認識されず、少しずつずれている。

# 解決方法
.notfunction ファイルを作成して、除外したいシンボルを追記する。
https://www.gnu.org/software/global/manual/global.html#FILES-1

# 独り言
gtags.conf についても勉強したいなぁ。。
[Excel VBA]カレントディレクトリの変更

`ChDir 変更後のパス`でも変更できるが、変更先が別のドライブだったり、ネットワーク上だったりすると上手くいかない。そういう時は↓の方法で。

例：カレントディレクトリをネットワーク上にあるxlファイルの場所に変更したい場合

```vb
Public Declare PtrSafe Function SetCurrentDirectoryA Lib "kernel32" (ByVal lpPathName As String) As Long

Sub change_directory()
  Debug.Print "変更前: " & CurDir  
  SetCurrentDirectoryA ThisWorkbook.Path
  Debug.Print "変更後: " & CurDir
End Sub
```

参考
https://social.technet.microsoft.com/Forums/lync/en-US/33551b22-1a10-4c33-abd4-b96b8ec858f3/how-to-change-current-directory-to-a-network-drive-in-vba?forum=excel
netlify開発を便利にするnetlify-cli


## インストール

```
npm install netlify-cli -g
```


## ログイン
ここから先は`npx`で動かしていきます。

```
npx netlify login
```

ログインポップアップが表示されるので使用したいアカウントでloginしましょう。

##　ディレクトとnetlify上のプロジェクトを紐付ける

```
npx netlify init
```
↑と打つと

```
❯ ⇄  Link this directory to an existing site 
  +  Create & configure a new site 
```
上記のように選択肢が表示されるので既存プロジェクトを紐づけたい場合は `Link this directory to an existing site`を選択
新規プロジェクトを作成し紐づけたい場合は `Create & configure a new site`を選択してください。

### エラーが出た場合
`.netlify>state.json` を開くと設定ファイルがあるので編集します。

```.netlify>state.json
{
  "siteId": "API ID"
}

```

API IDを書き込めばok

#### API IDの場所
netlifyのプロジェクト管理画面に記載されています。

![スクリーンショット_2019-07-05_9_40_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115687/e45d346a-0786-c633-0553-c7c27ff73597.png)





## 手動デプロイ

netlifyは基本的にgitと連携してpushすれば自動でデプロイされますが
netlify-cliを使ってデプロイすることも可能です。

```
npx netlify deploy
```

## 公式リファレンス

詳しくは公式リファレンスを読んでください。
https://www.netlify.com/docs/cli/
aptを、Proxy環境化で使う

得意のProxyネタ。
今回は、WSL（Windows Subsystem for Linux）でUbuntuを使う検証をやっています。

# /etc/apt/apt.confを修正する

```vim
Acquire::http::Proxy "http://{proxy_ip}:{proxy_port}";
Acquire::https::Proxy "http://{proxy_ip}:{proxy_port}";
```

# 終わりに
まぁ、いつもながら単純なんですが、これだけです。
Linuxだと環境変数「http_proxy」「https_proxy」を設定してあげると
大体うまくいく気がしてましたが、aptのように読み取ってくれない
コマンドもあるという理解ができました。
TheImagingSource社製 UVC camera を RaspberryPi 　で動かし、定時記録をする

#UVC　カメラで定時記録#
###ラズパイ、ubuntu、v4l2、fswevcam、を使ってUVCカメラで１分おきに静止画保存###
・カメラ：The Imaging Source　社製　DFK24UP031
・カメラアプリ：fswebcam
・UVCドライバー：v4L2
・OS:Ubuntu
・HW:RasuberyPi

fswebcam　はコマンドで一フレーム静止画を保存できる。動画を保存することはできない。

##１）UVCカメラドライバ（v4l2）のインストール##
USBインタフェースを持ったカメラ（UVC）稼働させるため、UVCカメラのドライバであるv4l2　をインストールする

```bash:
$sudo apt-get libv4l-dev
```

　→　管理者権限(root)であれば、sudoは不要、sudoはコマンド単位で管理者権限を使えるコマンド


##２）カメラアプリ（fswebcam）のインストール##
静止画をキャプチャーするため、カメラアプリとして、fswevcamをインストールする。

```bash:
$sudo apt-get install fswebcam
```

　→　管理者権限(root)であれば、sudoは不要



##３)撮影処理を作成（シェルで作成）##
処理内容：画像のキャプチャーを行うコマンド（fswebcam）を使って画像をキャプチャーし、現在時刻の名前を持ったファイルとして保管する。
例）5/2　10:15　撮影、保管　pic.0502_10:15.jpg
flag_capture という名前のファイルが存在（サイズ不問：user　pi　に見えることは必要）していたら稼働する

エディターで下記内容のファイル（fswebcam.sh）を作成する。

```bash:fswebcam.sh 
DATE=`date "+%m%d_%H:%M"`
echo $DATE
if [ -e ./flag_capture ] ;then
	fswebcam ./pic.$DATE.jpg
fi
```

　→シェルに実行権を付与（所有者であっても実行権がないと実行できない）

```bash:
$chmod +x fswebcam.sh 
```

##４）処理のスケジューリングを行う（crontabを使用）##
crontab　を使って起動時刻と処理を登録する。
crontab を編集する。

```bash:
$crontab -e
```
エディターが立ち上がるので、次のように入力する。
0-59 * * * * ./fswebcam.sh >/dev/null 2>&1

crontab を確認する。

```bash:
$crontab -l
0-59 * * * * ./fswebcam.sh >/dev/null 2>&1
```

```bash:（参考）crontabサンプル
#日中　毎時15分　　
15 9-17 * * * ./fswebcam.sh >/dev/null 2>&1
#夜間　15分おき　　
0,15,30,45 18-08 * * * ./fswebcam.sh >/dev/null 2>&1
#平日日中　20分おき　　
0,20,40　9-17 * * 1-5 ./fswebcam.sh >/dev/null 2>&1
```
分　時　日　月　曜日 コマンド
（曜日は 0 が日曜日）

##1分おきにフレームを保存するようにスケジューリングした。##
flag_captureという（ファイル名のファイル）の存在を稼働の必要条件とした。
このファイルがあれば稼働する、なければ稼働しない。
他アプリと連携するときに、他アプリがflug_captureを作成するようにすると順序制御、タイミング制御が可能となる。


##保存するファイルは、下記ファイル名。##

```bash:
pic.MMDD_HH:MM.jpeg
```


##サンプルファイル##

```bash:
5/14　11:45　に撮影して保存した画像
pic.0514_11:45.jpeg
```
![pic.0514_11:45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/1ef0aad5-eb60-aef9-d7d0-bfc897e9d2da.jpeg)

```bash:
5/14　11:46　に撮影して保存した画像
pic.0514_11:46.jpeg
```
![pic.0514_11:46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/7c7b1aab-0d34-47b1-c00b-9ee664fdf7f9.jpeg)

```bash:
5/14　11:47　に撮影して保存した画像
pic.0514_11:47.jpeg
```
![pic.0514_11:47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/70ebde6f-1cc8-e4e8-eafd-b8009b87be1e.jpeg)

```bash:
5/14　11:48　に撮影して保存した画像
pic.0514_11:48.jpeg
```
![pic.0514_11:48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/fb4750b6-fd76-c2ff-5cd6-4304d24e2423.jpeg)
アプリにLINEログインを導入する場合はProguardに設定追加が必要

ハマったのでメモです。

LINEログインを実現するためには、LINEのSDKを利用します。

[公式ドキュメント：AndroidアプリにLINEログインを組み込む](https://developers.line.biz/ja/docs/android-sdk/integrate-line-login/)

公式ドキュメントでは触れられていませんが、Proguardを使っているとビルドに失敗します。
おそらくSDKのバージョン5.0.1からです。

## 対処法
下記を追記します。

```lang:proguard-rules.pro
# LINE SDKで参照しているクラス
-keep class io.jsonwebtoken.**
-dontwarn io.jsonwebtoken.**

 -keep class org.spongycastle.jce.**
-dontwarn org.spongycastle.jce.**

 -keep class javax.naming.**
-dontwarn javax.naming.** 
```

以上
TECH　DAY -9,-8 HTML/CSS

勉強した項目：　HTML/CSS概要　
時間： 2:30
内容：
＊学習アウトプットです。なにぶん間違いなんかもあります。気をつけますがその際はご指摘いただけますと幸いです＊

###【テキストとボタンの配置】　
　　　cssにおける`＊`は全ての要素において適用の意味

```style.css
* {
  box-sizing: border-box;
}
```
これで、paddingのした際に、外殻のサイズは変わらずに内部で余白を作れる。

**・`color`はフォントの色を指定するプロパティ**
**・`text-align`は、テキストの横方向での位置を指定するためプロパティ　`center`で中央**
**・`font-size`は文字通りフォントサイズを指定します。`rem`は標準のフォントサイズを基準**

**・`letter-spacing`は文字の間隔を調整するというプロパティ**
**・`display`: `inline-block`という指定。
　　　　　`inline-block`を使うと、要素を横並びにした上で横幅と高さを指定する**

**・`border-radius`は四角形の角を丸くするためのプロパティ**

**・`text-decoration`:` none`　は、通常リンクには下線が引かれるが、不要時は`none`**

###【画像の取り込み】
`image folder`を作成し、ファイルは一括管理　
HTMLのフォルダ`の中に格納

css.styleの方で読み込み設定する
body要素で

```style.css 
background: url('images/bg.jpg') fixed;
    background-size: cover;
```
を組み込む

背景画像を`url`で設定、スクロールで動かないようにするので、`fixed`で固定

| 値 | 内容 |
|:--|:--|
| auto | サイズは自動的に決まる |
| contain | 縦横比を保ったまま、範囲内に全ての画像が入るように配置（縦か横に空白ができる） |
| cover | 縦横比を保ったまま、対象範囲を全て埋めるように配置（画像の縦かよこが切れる） |
| 長さ（例：980px） | 縦横を長さで指定 |
| パーセンテージ（例：60%） | 縦横を親要素に対する比率で指定 |

まとめ：html/cssの大まかな概略は理解できてきた。
文書構成や装飾、
コードの記載も１度、実施してみて引いた感じで全体を見直すと構成がみやすい。
ブラウザに落とし込んで、実際の間違いを見つけられるので、際格差が求められる。

事前学習の期間はあと、１週間ある。
まだまだ進めるし、理解できる、頑張ろう！
action_dispatch routing

urlがcontrollerにmappingされるまで

rails middleware
ActionDispatch::Routing::RouteSet#call
ActionDispatch::Journey::Router#serve
ActionDispatch::Journey::Router#find_routes
ActionDispatch::Journey::Route#app
ActionDispatch::Routing::RouteSet::Dispatcher#serve
ActionController::Base#dispatch


config/routesから追加まで
ActionDispatch::Routing::RouteSet#draw
ActionDispatch::Routing::Mapper::HttpHelpers#get

ActionDispatch::Routing::Mapper::Resources#match
ActionDispatch::Routing::RouteSet#add_route
ActionDispatch::Journey::Routes#add_route
custom_routes << route

判定
custom_routes.select { |r| r.path.match(arg) }
GPSカー その12

#概要

GPSで自動走行する、コンテストがある。GPS・QZSSロボットカーコンテスト2019
実機を借りて、アプリから操作する部門が今年は無いらしい。
実機を作ってみた。

#写真

![DSCN0366.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2566cb17-e951-31c9-ce13-855f0808a572.jpeg)

#構成

機体:    中華なラジコン
マイコン: wemos d1
GPS:     u-blox neo-7m fake
電源:　単三6本

#第一回テストラン

同じ所を、ぐるぐる廻った。ハンドル逆かな？

#第2回テストラン

ケーブルが、タイヤに絡まり、退場。

#第3回テストラン

同じ所を、ぐるぐる廻った。少し、ハンドルは、動く。

以上。
Raspberry piで地デジサーバ構築:09_録画・ストリーミング再生パッケージのインストール

# 依存パッケージのインストール

```terminal:端末
sudo apt-get install dh-autoreconf
```

# recdvbのダウンロード

```terminal:端末
wget http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.1.tgz

# 解凍
tar xvzf recdvb-1.3.1.tgz

# ディレクトリの変更
cd recdvb-1.3.1
```

# より使いやすくするために(非推奨)

そのままビルドするとストリーミングする際、hostsファイルにIPアドレスが記載されていない端末は「**gethostbyname failed**」が表示され、再生できないので関連するソースコードをコメントアウト及び変更しておく。

同一ネットワーク内の端末すべてからアクセスできてしまうため、セキュリティが大幅に低下する。実行は**自己責任**で行うこと。

今回ダウンロードしたrecdvd 1.3.1の以下の行を変更・コメントアウトする。

### 変更

```terminal:端末
sudo nano recpt1.c
```

```c:recpt1.c
# 変更前
941 fprintf(stderr,"connect from: %s [%s] port %d¥n", peer_host->h_name, inet_ntoa(peer_sin.sin_addr), ntohs(peer_sin.sin_port));

# 変更後(「peer_host->h_name,」を削除)
941 fprintf(stderr,"connect from: %s port %d¥n", inet_ntoa(peer_sin.sin_addr), ntohs(peer_sin.sin_port));
```

### コメントアウト

以下の6行をコメントアウトしておく。
バージョンが異なる場合、記載している行番号と異なる可能性があるので見つからない際は前後のコードも確認してみること。

```c:recpt1.c
921 struct hostent *peer_host;
...
934 peer_host = gethostbyaddr((char *)&peer_sin.sin_addr.s_addr,
935 		  sizeof(peer_sin.sin_addr), AF_INET);
936 if ( peer_host == NULL ){
937 	fprintf(stderr, "gethostbyname failed¥n");
938 return 1;
939 }
```

# ビルド・インストール

```terminal:端末
./autogen.sh
./configure --enable-b25
make
sudo make install
```

インストールが完了したため、次は動作確認を行う。

# 物理チャンネル20を10秒間録画する

```terminal:端末
recdvb –-b25 -–strip 20 10 test.m2ts
```

完了した後に「**test.m2ts**」が作成され、再生できたら成功。私はVLCを使用して動作確認を行った。
チャンネルは受信する地域による異なるため、[物理チャンネル一覧](https://www.maspro.co.jp/contact/channel.pdf)から自分の地域に合った物理チャンネルを受信すること。

# ローカルネットワークにストリーミングで公開

``` terminal:端末
recdvb –-b25 –-strip -–http 8080
```

今回はVLCで再生する。Macでは「**ファイル**」->「**ネットワーク**」に以下のアドレスを入力し、ストリーミング再生できたら成功。

```url:url
http://[IPアドレス]:8080/[物理チャンネル]
```

# 安定して動かすために

動作させるとラズパイ本体・チューナがすごく発熱するため、熱を逃がしやすいケースや冷房が効いている部屋で行うほうがいいだろう。
長時間動かし続けるとハングアップする危険性がある。
pythonでスペース区切りのデータをcsvに変換する

Pythonの標準モジュール`re`を用いて以下のようにスペースで区切られたデータをカンマ区切りのcsvファイルに変換します。

```text:変換前
datetime  data1 data2
2019-01-01 15 25
2019-01-02  20 30
2019-01-03  25 40
```

```text:変換後
datetime,data1,data2
2019-01-01,15,25
2019-01-02,20,30
2019-01-03,25,40
```
# 環境
* Ubuntu16.04(WSL1)
* Python3.6


pythonの標準モジュールしか利用していないので、たいていのpython環境でも問題なく動作すると思います。
実行はLinuxのshellからを行っています。(最近ではWindows環境でもWindows Subsystem for Linux等を使えば容易にLinux環境を構築することができるようになってきました。)

# プログラムの作成

## モジュールのインポート
```python:mkcsv.py
import re
import sys
```

`re`はpythonで正規表現を扱うモジュールです。また`sys`はコマンドライン引数を指定してpythonにスペース区切りのファイルを渡すために利用します。



## 変換の準備

スペース区切りをカンマ区切りに変換するために正規表現の文字列のパターンと、入力するファイル、出力するファイルを準備します。

```python:mkcsv.py
pattern=re.compile(' +') #' +'で一文字以上のスペースを正規表現のパターンとして定義
ifile=sys.argv[1]        #入力するファイル名をコマンドライン引数から受け取る
fout=open('c'+ifile.split('.')[0]+'.csv','tw') #出力ファイル名を入力ファイルから命名してopen
```

`sys.argv[0]`は実行ファイル名自体が返されます。

入力ファイルが`test.txt`であった時、出力ファイルは`ctest.csv`となります。

## 入力ファイルを一行ずつ読み込んで出力ファイルに書き込み

```python:mkscv.py
with open(ifile,'tr') as fin:
    for iline in fin:
        fout.write(pattern.sub(',',iline)) #一文字以上のスペースをカンマに置換
    ofile.close()
```

~~入力ファイルは`with`で自動的に閉じられますが出力ファイルは自分で閉じておく必要があります。~~
コメントで教えていただきましたが入力ファイルと出力ファイルともにwithでまとめて記述することができるようです。

```python
with open(ifile,'tr') as fin \
     open('c'+ifile.split('.')[0]+'.csv','tw') as fout:
```

# 追記:csvモジュールを使う
コメントで指摘いただいた通りcsvモジュールを使った方が圧倒的に適切です。
コードを引用させていただきます。

>```python:mkcsv.py
>import csv
>import sys

>assert len(sys.argv) == 2
>fname_in = sys.argv[1]
>fname_out = 'c{}.csv'.format(
>    ''.join(fname_in.split('.')[:-1])
>)
>
>with open(fname_in, newline='') as fin,  \
>        open(fname_out, mode='w', newline='') as fout:
>
>    reader = csv.reader(fin, delimiter=' ', skipinitialspace=True)
>    writer = csv.writer(fout)
>
>    writer.writerows(reader)
>
>```

# コード全体(非推奨)

```python:mkcsv.py
#! /usr/bin/python3
import re
import sys
pattern=re.compile(' +') 
ifile=sys.argv[1]       
ofile=open('c'+ifile.split('.')[0]+'.csv','tw') 
with open(ifile,'tr') as fin:
    for iline in fin:
        ofile.write(pattern.sub(',',iline))
    ofile.close()
```



シェバン行にpythonパスを書いておくと直接ファイルを実行できます。環境に応じて変更してください。

# 実行

```bash
$ python3 mkcsv.py test.txt 
```

シェバン行を書いた場合

```bash
$ ./mkcsv.py test.txt
```

(個人的に)よく使うコマンドなので`~/bin`下に`mkscv.py`を置いてパスを通しておくと便利です。

この場合どこのディレクトリからでも`mkcsv.py`が実行できます。

```bash
$ mkcsv.py test.txt
```

# 補足1

上述のコードはカレントディレクトリにあるファイルにしか正常に動作しません。

入力ファイルからディレクトリのパスとファイル名に分離したりするとより汎用性を高められるかもしれません。

# 補足2

これくらいの置換ならわざわざpythonで書くよりもシェルスクリプトと`awk`とか`sed`を組み合わせて作った方がいいかもしれません。

以下awkを使って書いたコードです。

```bash
#! /bin/bash
filename=$(echo "$1" | awk 'BEGIN{ FS ="."}{ print $1}')
 awk -v OFS="," '{$1=$1; print $0 }' $1 > c"$filename".csv
rm $1
```
Docker(Docker Compose)で立ち上げたMongoDBにプログラムから接続すると認証エラーになる件の解決

`authSource=admin`が必要。

```ruby
# Ruby
client = Mongo::Client.new('mongodb://root:example@mongo:27017/mydb?authSource=admin')
```

なお、docker-compose.ymlはこんな感じで書いてある想定。

```yaml
# Use root/example as user/password credentials
version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
```

https://hub.docker.com/_/mongo


## 参考
https://docs.mongodb.com/manual/reference/connection-string/
MySQLで値をNULLとする方法

MySQLでカラムの値を`NULL`にすることができます。
既存の値を`NULL`へと置き換えたい場合に参考にしてください。

## 既存の値を`NULL`とする
下記の記述を実行することで、既存のカラムの値を`NULL`とできます。

```sql
UPDATE テーブル名 SET カラム名 = NULL
```

### 構文の説明
`UPDATE`でカラムの値を更新しています。
次にテーブルを選択してから、`SET`でカラムを選択して`NULL`を既存の値と置き換えています。

### 条件を付け加える
下記のように最後に`WHERE 条件`を記述することで、`NULL`とするカラムなどの条件を追加することができます。

```sql
UPDATE テーブル名 SET カラム名 = NULL WHERE 条件
```

条件の部分には、他のカラムの値の情報（例えば`id=1`など）と紐付けることで、より柔軟に既存の値を`NULL`へと置き換えることが可能になります。
NTS(non technical skill)とTeam Workについて

安全工学シンポジウム2019
https://www.anzen.org/html/program.html
>オーガナイズドセッション
7月4日（木）　第4室　6階6-A(1)
13:40〜15:20　OS-8　今後のNTS（ノンテクニカルスキル）訓練を考える
OS-8-2
『EBT』～パイロット訓練のパラダイムシフト（発想の転換）～
○石川　宗（日本航空）
OS-8-3
安全文化醸成のエビデンスに基づいたチームトレーニング：TeamSTEPPS
○種田憲一郎（国立保健医療科学院）
OS-8-4
自衛隊におけるCRM訓練について
○廣瀬義和（日本ヒューマンファクター研究所）
OS-8-5
コンピテンシーとしてのノンテクニカルスキルの訓練
○小松原明哲（早稲田大学）

において、IT業界ではイギリスのIEEのSafety Assessorのスキルに習って、
ITSS, ETSSにおいてNTSに相当する事象を取り上げていることを議論の中で紹介した。

また、LinuxにおいてgithubによるTeam Workにおいては、NTSはさほど必要がないことにも言及した。

また、名古屋で実施していた事業で、自己評価により水準を記述し、目標水準を自己設定し、達成度は訓練講師と本人で行うことなども紹介した。

TSP, PSPについてはセッション内では言及しなかった。

分野が違うとこんなにも差があるのかと驚きの。

来年は発表をお願いされた。
営業talkで多分話はないと思う。

セッション終了後の議論はこちら。

# 文書履歴(document history)
ver. 0.01 初稿 20190715
ver. 0.04 URL追記　20230226

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
水素自動車用カーナビの基本仕様。仮説（152）

水素自動車と電気自動車の安全分析をするとして何に着手すればよいか、日本学術会議の安全工学シンポジウムで質問した。

識者から、トンネルが最大の課題かもとのこと。

トンネル事故における水素自動車の扱いの分析がまだ十分ではないのかもしれない。

そこで、水素自動車とトンネルについて整理する。

# 1 トンネルのない国で売る
一番てっとりばやく、市場効果のある方法は、トンネルのない国で水素自動車を売ることである。

トンネルがないのであるから、トンネルに対する対策が当面は必要がない。

# 2 トンネルを回避するカーナビソフトを開発する

トンネルを回避するカーナビがあれば、トンネルに入る可能性が激減させることができる。

わざわざ危険性の高い行動をとる必要はない。

## 対象索道定義
数メートルのトンネルは、ここでの対象から除外してもよいと思う。
水素自動車をトンネル内から除去するのに手間がかかりそうな場合を想定するとよいかもしれない。５mくらいなら、普通の車で牽引できるような気もする。間に車があると除去できないかもしれない。
ひとまず10m以上のトンネルをトンネルとする。

## 課題
道路の地下を通る立体交差が、カーナビデータとしてトンネルとして認識できるかどうか。
20m程度の地下道は、日本ではいっぱいありそう。
このあたりの取り扱いについて水素自動車の識者に聞いてみよう。

# 3 トンネル　水素自動車　で安全分析をする。
順次実施予定。

# 文書履歴(document history)
ver. 0.01 初稿
ver. 0.02 課題追記 20190709

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Swagger UIとSwagger EditorをWebサーバで動かす

SwaggerでAPIの定義を記述したいが、インターネットには上げたくなかったり、社内ファイアウォールでデモ版へのアクセスが封じられてるときは、Swaggerをローカルサーバーで起動することになると思います。

ローカルだと各人が環境作らなければならないため、Webサーバに置いて使う方法を紹介します。

---

# Swagger UI

## インストール

下記コマンドを実行し、ドキュメントルートに配置するファイルを取得します。

```
git clone https://github.com/swagger-api/swagger-ui.git
cd swagger-ui
npm install
npm run build
```

## ドキュメントルートに配置・確認

ビルド後`swagger-ui/dist`ディレクトリをドキュメントルートに配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/5f7446c0-dedf-d69f-cb40-98ed493d410d.png)

## デフォルトで読み込むSwaggerファイルを変える

デフォルトで読み込むSwaggerファイルを`https://petstore.swagger.io/v2/swagger.json`から任意のURLに変えたい場合は、`index.html`の42行目のURLを任意の値に編集します。

```javascript:index.html
    window.onload = function() {
      // Begin Swagger UI call region
      const ui = SwaggerUIBundle({
        url: "https://petstore.swagger.io/v2/swagger.json", // 任意のURLを設定
	validatorUrl: null,  // URLバリデーターを無効化
        dom_id: '#swagger-ui',
        deepLinking: true,
        presets: [
          SwaggerUIBundle.presets.apis,
          SwaggerUIStandalonePreset
        ],
        plugins: [
          SwaggerUIBundle.plugins.DownloadUrl
        ],
        layout: "StandaloneLayout"
      })
      // End Swagger UI call region

      window.ui = ui
    }
```

さらに`validatorUrl: null,`を足しておくと、URLのバリデーションチェックを停止できます。

# Swagger Editor

## インストール

下記コマンドを実行し、ドキュメントルートに配置するファイルを取得します。

```
git clone https://github.com/swagger-api/swagger-editor.git
cd swagger-editor
npm install
npm run build
```

## ドキュメントルートに配置・確認

ビルド後`swagger-editor/dist`ディレクトリと`swagger-editor/index.html`をドキュメントルートに配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/3b8356a6-d402-b44e-99ae-de15bca1624d.png)

## デフォルトで読み込むSwaggerファイルを変える

Swagger Editorはクエリストリングで`url`をキーにしてURLを渡すとそこのSwaggerファイルを読み込んでくれます。
リンクを張るときにセットしておくか、次のようにソースを修正して、デフォルトで読み込むファイルを変えることができます。

```javascript:index.html
  window.onload = function() {

    // クエリストリングがなかったら任意のURLをセットして読み込みなおす
    if(location.search == ""){
        window.location.href = window.location.href + "?url=https://petstore.swagger.io/v2/swagger.yaml";
    }

    // Build a system
    const editor = SwaggerEditorBundle({
      dom_id: '#swagger-editor',
      layout: 'StandaloneLayout',
      presets: [
        SwaggerEditorStandalonePreset
      ]
    })

    window.editor = editor
  }
```

以上でした。
Scratch で足し算

足し算は基本、ということでScratch 3.0で足し算を作ってみました。

- https://scratch.mit.edu/projects/318147138/

![tashizan.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/9959189c-0480-5663-f151-6591c97d05b1.jpeg)

掛け算も作ってみました。

- https://scratch.mit.edu/projects/320963629

## 動作
- 一桁の足し算です。
- 旗![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/e79b620d-7ac7-1aa4-04f2-d63ee15c23a8.png)もしくは”スペースバー”を押すと、新しい足し算の問題が設定されます。
- 右辺の答えには"?"を表示します。
- 数字キーを押すと、右辺に数字が表示されます。
- ２回数字キーを押すと、２桁の数字になります。最初に押されたキーが１０の位です。
- 足し算の答えと、右辺が一致すると、チェックマークが表示されます。

## スプライト

スプライトは８個でできています。
<ul>
<li>S1　左辺の１個目の数字
<li>S2　”＋”のキャラクタ
<li>S3　左辺の２個目の数字
<li>S4　”＝”のキャラクタ
<li>S5　右辺の１０の桁
<li>S6　右辺の１の桁
<li>S7　チェックマーク
<li>S8　空白、制御用
</ul>

## コスチューム
- S1, S3<br>
"0","1","2","3",...,"9" の数字です。<br>
コスチュームの番号が１から打たれていますので、数字の値とコスチュームの番号から１を引き算しないとなりません。<b>子供に説明するには、ちょっと難しいかもしれません。</B>
- S2, S4<br>
"+", "=" というキャラクタがそれぞれ入っています。
- S5<br>
"0","1","2","3",...,"9" の数字です。１０番目に"?"が入っています。<br>
右辺の１０の桁にはゼロは表示しません。問題が開始された時には"?"が表示されます。
- S6<br>
"空白","1","2","3",...,"9" の数字です。１０番目に"?"が入っています。<br>
右辺の１の桁はゼロを表示します。問題が開始された時には"?"が表示されます。
- S7<br>
コスチューム１番が空、間違いを示しています。コスチュームの２番が正解マークが入っています。

## コード
- S1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/0d73ad9d-c921-bb9d-d56b-6d81ae1a93e1.png)
スタートを受け取ると、a という変数に<b>1から9の乱数</b>を設定します。合わせてコスチュームを同じ番号にします。a+1 番目のコスチュームが表示され、"1"から"9"の値が表示されます。

- S3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/4cb752ee-98a2-9b64-012b-30f1e95bf579.png)
S1と同じですが、変数bを使用します。

- S2, S4
プログラムは空です。

- S7
ここで計算をしていますので、先に記載します。計算を行うトリガー、きっかけとしてcalcというメッセージを受け取ります。
問題は a+b です。~~ただし、上にも書きましたがa,bはコスチュームの番号をそのまま持っていますので、２を引き算しないとなりません。子供に説明するには、先にそれぞれ１を引いて変数に入れた方がよかったですね。~~答えを変数 add に入れます。
右辺はp,q という変数に入ります。pが10の位、qが1の位です。p*10+q を変数sumに入れます。
正解なら、チェックを表示（ついでに音も鳴らしています）、不正解なら空白を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/663d7e93-bd05-2074-f528-967c0c0d0de9.png)


- S8
数字キーの入力を処理しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/d581007f-003d-9ff3-8e30-08d172ea156e.png)

数キーを押すと、変数qの中身をpへ移動します。pが10の位です。
qに数字キーの値を入れます。メッセージcal2 を送ります。
このプログラムを1,2,...9,0 と10個コピーして作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/cd28aa7f-82ac-f36c-ba1b-58ab2de65cb7.png)

メッセージcal2を受け取ると、m=p+1, n=p+1 を計算し、メッセージcalcを送ります。
mとnは、S5とS6のコスチュームを選択するための変数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/a912da52-8504-7398-9995-2e3f8fd90852.png)

初期化もS8のプログラムで行っています。p,q をゼロに初期化、m,n を"?"が表示できるように11に初期化しています。

- S5　
メッセージ、calcを受け取るとコスチュームを変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/53661ab1-9bc3-81c9-f970-a6259ef5050d.png)

- S6
メッセージ、calcを受け取るとコスチュームを変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/e3bdd52c-003b-83c7-b300-58a42d71dc25.png)

## まとめ
Scratchで足し算を作ってみました。小学生のプログラミングの勉強になれば良いかなと思っています。コスチュームの番号と、数字の関係が右辺と左辺で違ってしまっているので、そのうち修正したいですね。
Rails構築するための環境

<a href="http://railsgirls.jp/install">パソコン用環境</a> 
macOS ターミナルから 
Windows 用セットアップ 
・WSL 
Windows からセットアップ

仮想環境 
Vagrant

IDE 
Cloud9 
codenvy.io

<a href="https://railstutorial.jp/chapters/beginning?version=5.1#sec-deploying">本番環境（練習用）</a> 
Engine Yard 
Rails Machine 
クラウドサービス 
Engine Yard Cloud 
Heroku

マイぺージ
<a href="https://blooming-reef-85835.herokuapp.com/posts/index">マイぺージ</a>
Django Girls Tutorialを復習する（１）　〜Djangoのインストール＋プロジェクトを作成しよう！〜

注意事項はこちら。
https://qiita.com/K-Kazutaka/items/1a432bda4f723e6757d6
写経用の記事です。

`~$ mkdir djangogirls`
　＃プロジェクトを作成。mkdir + プロジェクト名

`~$ cd djangogirls`
　＃ディレクトリを移動。cd + プロジェクト名

`~$ python3 -m venv myvenv`
　＃仮想環境を構築。python3 -m venv +仮想環境名

`~$ source myvenv/bin/activate`
　＃仮想環境内へ。source 仮想環境名/bin/activate

`~$ python3 -m pip install --upgrade pip`
　＃Djangoのインストール

`~$　echo "Django~=2.0.6" > requirements.txt`
　＃djangogirls内に、DjangoのVerを記したファイルを作成

`~$ pip install -r requirements.txt`
　＃requirements.txt を実行してDjangoをインストール。　　　

`~$ django-admin startproject mysite .`
　＃プロジェクトを作成。

```mysite/settings.py
TIME_ZONE = 'Asia/Tokyo'

LANGUAGE_CODE = 'ja'


STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')


ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
```


`~$ python manage.py migrate`
　＃ブログのデータベースを作成する

`~$ python manage.py runserver`
　＃ウェブサーバを起動する
JFreeChart-インターヴァルチャート-DefaultIntervalCategoryDataset


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.renderer.category.IntervalBarRenderer;
import org.jfree.data.category.DefaultIntervalCategoryDataset;

/**
■ JFreeChart-インターヴァルチャート-DefaultIntervalCategoryDataset
・データセットにはDefaultIntervalCategoryDatasetを使用する.
・レンダラにはIntervalBarRendererを使用する

 */
public class Chart11_01 {
  // 目次-インターヴァルチャート(IntervalChart)
  A_Chart11 a_Chart11;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    // 表示データの作成
    DefaultIntervalCategoryDataset dataSet = null;
    {
      // 商品名
      final String[] catKeys = {"A","B","C","D","E"};
      // 日ごとの売り上げの最小値
      final double[][] lows =  {
        {50,30,34,33,60}, // 1-3
        {55,40,45,37,60}  // 4-6
      };
      // 日ごとの売り上げの最大値
      final double[][] highs = {
        {55,48,70,48,65}, // 1-3
        {60,45,75,50,70}, // 4-6
      };
      dataSet = new DefaultIntervalCategoryDataset(lows,highs);
      // 商品名をカテゴリキーとして設定
      dataSet.setCategoryKeys(catKeys);
      // 対象期間をシリーズキーとして設定
      dataSet.setSeriesKeys(new String[] {"1月～3月","4月～6月"});
    }
    // 軸の設定
    CategoryAxis xAxis = new CategoryAxis("商品");
    NumberAxis yAxis = new NumberAxis("売上");
    // レンダラの設定
    IntervalBarRenderer renderer = new IntervalBarRenderer();
    // Plotの作成
    CategoryPlot plot = new CategoryPlot(dataSet,xAxis,yAxis,renderer);
    //
    JFreeChart jfreeChart = new JFreeChart("売上の最小と最大",(Plot)plot);
    ChartFrame cFrame = new ChartFrame("売上の最小と最大",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
}
```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/2b91cb1e-8e51-6883-1a4f-125d809be85d.png)
インデックスの機能のメリット・デメリット(メモ書き)

#1.インデックスの機能のメリット
インデックスとは、データベースの機能の一つであり、テーブル内のデータ検索を高速化する機能を有する。そのため、インデックスを特定のテーブルのカラムに設定すると、そのカラムで検索をした時の検索速度が向上する。

#2.インデックスの機能のデメリット

データ検索を高速化することで、データを保存・更新する速度が遅くなったり、データベースの容量を使ってしまうこと。
#3.Railsにおけるインデックスの追加方法

マイグレーションファイルを新たに作成し、編集して特定のテーブルのカラムにインデックスを貼る。
**インデックスを設定することを、「インデックスを貼る」と表現することがある。**

```
$ rails g migration AddIndexToテーブル名
```
例）userテーブルにインデックスを追加したい場合

```
$ rails g migration AddIndexToUsers
```
Ruby Webフレームワーク ~Hello Hanami world~

# Hanamiとは :cherry_blossom: :cherry_blossom: :cherry_blossom:
[公式サイト](https://hanamirb.org/)
Ruby on RailsのようなRubyのWebフレームワークです。
2017年にバージョン1がリリースされた比較的新しめのフレームワークで、Railsに近いところもあります。

RailsがMVCベースで、規約に乗っかればスピード感もってサービスを立ち上げるのに強みがあるのに比べ、Hanamiは、DDDの思想がベースにあり、より柔軟にシンプルに設計できることを重視し、長期的なメンテナンスを考え作られているようです。

詳しい解説はこちらをご覧ください。
[HanamiはRubyの救世主(メシア)となるか、愚かな星と散るのか](https://magazine.rubyist.net/articles/0056/0056-hanami.html)



今回は公式のgetting startedに沿って、立ち上げるところまでやっていきます
[Hanami getting started](https://guides.hanamirb.org/introduction/getting-started/)



# 開発環境

- Mac

- ruby v2.6.2



# プロジェクト作成

まずはhanamiをインストールし、プロジェクトを生成しましょう。
`rails new`のように`hanami new <projectname>`で、プロジェクトが生成されます。

```bash
$ gem install hanami
$ hanami -v
1.3.1
$ hanami new hanami-sample
```


ディレクトリ構成は以下のようになります。

```bash
.
├── Gemfile
├── README.md
├── Rakefile
├── apps
│   └── web
│       ├── application.rb
│       ├── assets
│       │   ├── favicon.ico
│       │   ├── images
│       │   ├── javascripts
│       │   └── stylesheets
│       ├── config
│       │   └── routes.rb
│       ├── controllers
│       ├── templates
│       │   └── application.html.erb
│       └── views
│           └── application_layout.rb
├── config
│   ├── boot.rb
│   ├── environment.rb
│   └── initializers
├── config.ru
├── db
│   ├── migrations
│   └── schema.sql
├── lib
│   ├── hanami-sample
│   │   ├── entities
│   │   ├── mailers
│   │   │   └── templates
│   │   └── repositories
│   └── hanami-sample.rb
├── public
└── spec
    ├── features_helper.rb
    ├── hanami-sample
    │   ├── entities
    │   ├── mailers
    │   └── repositories
    ├── spec_helper.rb
    ├── support
    │   └── capybara.rb
    └── web
        ├── controllers
        ├── features
        └── views
            └── application_layout_spec.rb
```

Railsとほぼ同じ構成ですが、DDDで言うところのドメイン層のビジネスロジックが`lib`ディレクトリに配置されているのは異なる点ですね。


# アプリ立ち上げ

プロジェクトを作成できたら、依存関係をインストールして、アプリを立ち上げましょう。

```bash
$ bundle install
$ bundle exec hanami server
[2019-07-05 04:37:35] INFO  WEBrick 1.4.2
[2019-07-05 04:37:35] INFO  ruby 2.6.2 (2019-03-13) [x86_64-darwin18]
[2019-07-05 04:37:35] INFO  WEBrick::HTTPServer#start: pid=76404 port=2300
```

portは2300で立ち上がるので、[http://localhost:2300](http://localhost:2300)にアクセスしましょう。

起動できていれば、以下画面が表示されます。
<img width="1031" alt="スクリーンショット 2019-07-05 4.38.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194498/46bad8f7-0a94-ab66-f3ec-1e9430ab537a.png">


# おわりに
今回は立ち上げるところまで行いました。
実際のコードの中身を見ていくところも今後記事にしていきたいと思います。
マイグレーションツール作ってみた

マイグレーションツールは[goose](https://bitbucket.org/liamstask/goose/src/master/)のシンプルさが気に入っていたのですが、多少使いづらい点があったため、ほぼ同じ機能にして自分で気に入るものを作ってみました

- コマンドも大体一緒 up / down / status
- MySQLとPostgresしかサポートしてません

mg
https://github.com/nissy/mg

こんな感じの設定ファイルです


```toml
[postgres-sample]
  driver = "postgres"
  dsn = "postgres://user:${PASSWORD}@${HOSTNAME}:5432/dbname?sslmode=disable"
  source_dir = [
    "./data/postgres/migrates",
    "./data/postgres/seeds"
  ]
```

### ポイント

- SQLのsourceディレクトリを複数選べる
これがつくりたかった動機なんですが、環境によって差し込みたいとかあるので、複数ディレクトリ選べてファイルを時系列順に入れたかった

- 設定ファイルに環境変数使える
使いたかった
`${PASSWORD}` こんな感じで使える



### 感想
今の会社で採用してもらえたので嬉しい
特定文字の手前までを一括りとして、正規表現やVBAを使って前後を入れ替える

#やりたいこと

とある文字列から商品名とIDを入れ替えたかった。ちなみにこんな感じ。

◆元データ
ホワイトチョコレート（ID000101）
さわやかオレンジ（ID000201）
↓
◆必要データ
(ID000101)ホワイトチョコレート
(ID000201)さわやかオレンジ

※括弧は全角から半角にしている。

今まではいちいちIDの部分を切り取ってから先頭に貼り付けて、括弧を半角に修正していた。
ここでいう特定の文字は、IDをくくっている「（」にあたり、その手前の商品名とIDで括って前後を入れ替えたかった。

それなりに量があったりするので、明らかに無駄だな～っと思いながら作業をしていたので、先輩に相談してみた。
「俺なら正規表現使うかな～」というヒントを頂いた！

正規表現・・・。言葉は聞いたことがあるけどよく知らないな～と思い早速調べてみた。

##正規表現でやるなら
結論を書くとこれで解決。

```
置換前：(.*)(?=（)（(.+)）
置換後：(\2)\1
```

##VBAでも簡単だけど組んでみた。

```VB
Sub 前後入替()
    Dim str As String   '取得文字
    Dim kakko As String: kakko = "（"   '全角括弧
    Dim kakko2 As String: kakko2 = "("  '半角括弧
    Dim name As String  '商品名
    Dim id As String    'ID
    '選択しているセルの値を抽出
    str = ActiveCell.Value
    '括弧の全角・半角判定エラー処理
    '半角括弧の場合は処理を終了
    If InStr(str, kakko2) > 0 Then
        MsgBox "半角括弧が含まれています。"
        End
    '対象外のセルを選択している場合
    ElseIf InStr(str, kakko) = 0 Or Null Then
        MsgBox "選択したセルを確認してください。"
        End
    End If
    
    name = Left(str, InStr(str, kakko) - 1)
    id = Mid(str, InStr(str, kakko) + 1, Len(str) - InStr(str, kakko) - 1)
    
    '文字とIDを入れ替えて出力
    ActiveCell.Value = "(" & id & ")" & name
    
End Sub
```

こっちは商品名に「（」が入った時点で想定外の挙動になるけど、一旦考慮から外しました。


繰り返し使うようなものだったらマクロ作っておくと、作業がはかどりますね。活用していきたいです。

備忘録的なものになってしまいました。もう少し詳しく調べられたら記事を更新しようと思います。※特に正規表現