OmniAICreator/Qiita-1.07M huggingface dataset:
Blockchain in Enterprise周辺についてのメモ

エンタープライズ用途のブロックチェーンプロダクトについて、
最近の事情を元に頭を整理したメモを記事にしました。所感を加えた個人的な内容です。

##前提
エンタープライズ用途のブロックチェーンでは、パブリックチェーンを避ける
※中央管理者がいないブロックチェーンがパブリックチェーン。

パブリックチェーンを使えない理由は、
・秘匿したいデータが存在する
・マイニング報酬を作らないため、承認の責任を負う人がいない
・コントラクトは変更されやすいため、管理・責任の主体が必要
・スケーラビティが必要なので、参加者に全ブロックを保持させられない

必然的にコンソーシアム型ブロックチェーン・プライベートチェーンを使うことになる。
こちらでは、上記の問題を解決できる。
その基盤としては、hyperLedger fabricが一番実績と勢いがある。
ただ、それとともに課題も見つかってきている感じ。

##先行者（HLF）の課題
- ステートDBにファントムリードが起こり得て、トランザクションの独立性を保てない
- 複数のチャネルをまたがってトランザクションの一貫性を保てない
- orderedがトランザクションのブロックをまとめているため、処理が遅くなる
- orderedは単一障害点で、冗長化が必要

色々ありますね…。

###ブロックチェーン技術のトリレンマ
- 分散性（非中央集権性含む）
- スケーラビリティ
- セキュリティ

現状、この3つを同時に満たす・高めることができないことが
定理のようになっている。

一度ブロックチェーンに書き込んだ情報って
修正手順も複雑になるだろうから、障害・不整合が困るのは想像できる。
上記の3つの内では、分散性を抑制せざるを得ない。

しかし、ブロックチェーン技術において分散性がもっとも売り物なので、
抑えすぎると既存のシステムと差別化できなくなっていく。
また現状は、特長の一つである標準での冗長化にも課題がある。
改ざん耐性のあるフレームワークとしての価値は残るが、大掛かり。
そんな印象。

当初、自分がエンタープライズ用途のブロックチェーンに魅力を感じた点はp2pの技術による同期を行うことで、分散したDBの整合性を既存にあるような苦労（xaトランザクションの使用・不整合データの保守など）をせず、もっと楽に確保できるのでないかというところだった。

これについては、ブロックチェーンにRDBのようなロック機構はないものの、管理者（hyperLedger fabricだとorderer）がブロックの順序付けを行う際に、ノード間のトランザクションを同期し、一貫性・独立性を保ってくれると分かった。（秘密保持範囲が同じノード間のみ）
ただノード間のデータが伝播途中の時や、いずれかのノードが書き込みに失敗した場合では、次回トランザクション発行で全体のデータが同期される前に、各ノードで古いデータを読み出すため、ネットワーク全体で見たときのリピータブルリード・ファントムリードは常に起こり得るものと認識した方が良さそう。

これらのブロックチェーン共通の特性に加えて、HyperLedgerFabricでは前述したような課題があるが、こちらのスライドによると、
https://oracle-code-tokyo-dev.connpass.com/event/141642/presentation/
Kubernetesの活用で解決しようとされているとのこと。
今後の検証・実績に期待です。

##1対1なcorda
また個人的にはcordaに注目している。
ステートDBのデフォルトがRDBだし、
データモデルでトランザクションとブロックが1対1になっていることがキモ。
そうすることでどうなるか。

- 1回のトランザクションで配信するべき対象が少なく、コミット（ファイナリティ付与）までの処理が速い。
- ブロック生成処理を並列実行できる（エンタープライズ版）
- ブロックが分割されているので、他のネットワークへの移し替えも楽。インターオペラビリティと呼ばれるもの。

ソースはこちらのスライド
https://medium.com/corda-japan/corda-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E7%89%B9%E5%BE%B4-%E7%B6%9A%E3%81%8D-26f7a516ec89


日頃オブジェクト指向の考え方に慣れているプログラマ的な直感では、この設計が正しいんじゃないかと思えている。読んでwktkした。

ただあまり人気がないのは、R3社による基盤のため中央集権的な色彩がより強いからかもしれない。
ブロックチェーンの魅力を端的に語る言葉としては、やはり非中央集権性なわけで。
あとエンタープライズ版は有料ですね。。


cordaの商用実績がもっと出てきてほしい。
1対1でやるならCordaだろう（ドン！）
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28279/8e068136-2717-58a3-66a7-fb5a4c71882c.png)
<br>
すみません、言いたかっただけです。

<br>
<br>
##参考資料
https://www.slideshare.net/oracle4engineer/ochacafe-4-hyperledger-fabric
https://medium.com/corda-japan/corda%E3%83%87%E3%83%BC%E3%82%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E7%89%B9%E5%BE%B4-701d49f02cd
docker volume mount時のuser owner問題

## 問題

container内で作ったfileのownerがrootになる

```console
[user1:~/] $ docker run -it --rm -v $PWD:/work -w /work busybox touch hoge
[user1:~/] $ ls -l
-rw-r--r--   1 root      root           0 Oct 13 22:22 hoge
```

user1で作業したいのにいきなりrootのpermissionになってしまった。こまる。

## 対策1. docker-run -u option

```console
$ docker run -u $(id -u):$(id -g)
```

### 問題点
- conateiner内ではrootとして扱いたい

## 対策2. Rootless dockerを使う
形としてはきれい。将来的にはこれが良いと思う。
via: https://github.com/moby/moby/blob/master/docs/rootless.md

### 問題点
実験的。
異常に遅い。
docker run busyboxに20s。
docker buildの1stepに最低20s。
使い物にならない。バグだろうか？
**追記: 遅くないときもある。マシンの構成かInstallの仕方か。**

## 対策3. userns-remapを使う
### 前提
- サーバー管理者である
- dockerを使わせる一般ユーザーは一人とする

### 手順
debian stretchの例

- 一般ユーザーのuid:1000 gid:1001とする

```console
$ sudo vi /etc/docker/daemon.json
```

```diff:/etc/docker/daemon.json
+{
+  "userns-remap": "default"
+}
```

```console
$ sudo systemctl restart docker
$ sudo vi /etc/subuid
```

```diff:/etc/subuid
- dockremap:10000:65536
+ dockremap:1000:65536
```

```console
$ sudo vi /etc/subgid
```

```diff:/etc/subgid
- dockremap:10000:65536
+ dockremap:1001:65536
```

```console
$ sudo systemctl restart docker
```

### 確認

```console
[user1:~/] $ docker run -it --rm -v $PWD:/work -w /work busybox sh
/work # touch hogehoge
/work # ls -l
-rw-r--r--    1 root     root             0 Oct 13 22:37 hogehoge
/work # exit
[user1:~/] $ ls -l
-rw-r--r--   1 user1 user1      0 Oct 13 22:37 hogehoge
```

verygood!! :)

### 参考
- https://stackoverflow.com/questions/35291520/docker-and-userns-remap-how-to-manage-volume-permissions-to-share-data-betwee
- https://docs.docker.com/engine/security/userns-remap/

### 問題点
- 色々前提が多い
- 一部機能に制限がある
- マルチユーザーでdockerを利用できない(rootも無理)

## 対策?4. Docker Desktop for Macを使う
- なにもしないでも望み通りの挙動になっている
- Docker用Linux <-> Mac 間マウントで都合のいいことになったと予想

### 問題点
- ない

---

Windows編
Docker desktop for windows, wsl2 環境
## 問題
windowsは、rootユーザーという概念がないので問題が発生しない。
しかし、wsl2でdocker以外のディストリビューションを入れていた場合(ex: ubuntu)に、やはりownerがrootになってしまう。使い物にならない。

## 対策5
wsl2とwindowsのマウントの設定を変更する。

```console
$ wsl -d docker-desktop
[wsl(docker-desktop)] $ vi /etc/wsl.conf

[automount]
root = /mnt/host
crossDistro = true
- options = "metadata"
+ options = ""

[wsl(docker-desktop)] $ exit
$ wsl -t docker-desktop
```

### 情報ソース
- https://docs.microsoft.com/ja-jp/windows/wsl/wsl-config#automount
ほかは思い出せません。ごめんなさい。
vbsの作法 その40

#概要

vbsの作法調べてみた。
練習問題やってみた。

#練習問題

中学生でも、使えるrpaツールを作れ。
ヤフオクの自動入札できますか。

#環境
windows7 64bit

#方針

'timeを導入する。

#命令文

```
'win ohifw
'mouse 400 540
'time 2019/10/14 06:53:00
'click
```

#命令文の意味

アクティブウィンドウは、ohifw
マウスを400,500へ
06:53:00まで、待つ
クリック




#サンプルコード

```
Dim App6
Dim Appflg
Set App6 = Createobject("OHIcompo6.srv")
WScript.ConnectObject App6, "App6_"
App6.text = "'win ohifw" & vbcrlf & "'mouse 400 540" & vbcrlf & "'time 2019/10/14 06:53:00" & vbcrlf & "'click"
Sub App6_exit()
	Appflg = 2
End Sub
Sub App6_ok()
	Dim sh
	Dim m
	Dim lines
	Dim win
	Dim n
	Dim a(100)
	Dim b(100)
	Dim c(100)
	Dim d(100)
	Dim line
	Dim lin
	Dim i
	Dim j
	Dim v0
	Dim v1
	Dim start
	Set sh = CreateObject("WScript.Shell")
	lines = Split(App6.text, vbCrLf)
	For i = 0 To UBound(lines)
		If Left(lines(i), 4) = "'win" Then
			win = Mid(lines(i), 6)
			lines(i) = ""
		End If
		If Left(lines(i), 2) = "'{" Then
			v0 = i + 1
			lines(i) = ""
		End If
		If Left(lines(i), 2) = "'}" Then
			v1 = i - 1
			lines(i) = ""
		End If
	Next
	If v0 > 0 Then
		line = Split(lines(v0), ",")
		For i = 0 To UBound(line)
			If line(i) = "$a" Then
				For j = v0 + 1 To v1
					lin = Split(lines(j), ",")
					a(j - v0 - 1) = lin(i)
				Next
			End If
			If line(i) = "$b" Then
				For j = v0 + 1 To v1
					lin = Split(lines(j), ",")
					b(j - v0 - 1) = lin(i)
				Next
			End If
			If line(i) = "$c" Then
				For j = v0 + 1 To v1
					lin = Split(lines(j), ",")
					c(j - v0 - 1) = lin(i)
				Next
			End If
			If line(i) = "$d" Then
				For j = v0 + 1 To v1
					lin = Split(lines(j), ",")
					d(j - v0 - 1) = lin(i)
				Next
			End If
		Next
		For i = v0 To v1
			lines(i) = ""
		Next
		n = v1 - v0 - 1
	End If
	m = sh.AppActivate(win)
	WScript.Sleep(500)
	If m Then
		For j = 0 To n
			For i = 0 To UBound(lines)
				If Left(lines(i), 5) = "'time" Then
					start = Mid(lines(i), 7)
					start = CDate(start)
					While Now() < start
						WScript.Sleep 100
					Wend
				End If
				If Left(lines(i), 6) = "'mouse" Then
					line = Split(lines(i), " ")
					sh.Run "%windir%\System32\rundll32.exe MouseControll.dll, _SetMouseXY@16 " & line(1) & "," & line(2)
				End If
				If Left(lines(i), 6) = "'click" Then
					sh.Run "%windir%\System32\rundll32.exe MouseControll.dll, _LeftClick@16"
				End If
				If lines(i) = "" Then
				ElseIf lines(i) = "$a" Then
					sh.SendKeys a(j)
				ElseIf lines(i) = "$b" Then
					sh.SendKeys b(j)
				ElseIf lines(i) = "$c" Then
					sh.SendKeys c(j)
				ElseIf lines(i) = "$d" Then
					sh.SendKeys d(j)
				Else
					sh.SendKeys lines(i)
				End If
				WScript.Sleep 500
			Next
		Next
	Else
		MsgBox "ウィンドウが見つかりません。" 
	End If
	Set sh = Nothing
End Sub
Do
	WScript.Sleep(100)
	App6.ping
Loop until Appflg = 2
Set App6 = Nothing


```

以上。
最強の令和勉強・調査フレームを目指す 

https://reiwa-insights.com/
![スクリーンショット 2019-10-13 15.23.29 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513348/bc8651cb-7ab4-02fa-d070-524698550692.png)
【JavaScript】if文の基礎「天気予報で理解する条件分岐」

#1.if文とは「if」
<b>条件</b>によって<b>処理</b>を分岐させる構文です。

一文で表すと「Aという条件に合致した時、Bという処理を実行する。」
条件に合致しない場合は、何も処理されません。

```javascript
//書き方
if( 条件A ){
条件Aに合致した時の処理B
}
```
　
<b>■例：もし天気予報が、雨だったら「傘を持っていく」と表示</b>

```javascript
var weather = （ここに天気を書く）
if( weather === '雨' ){           //weatherに「雨」という値が入っていたら
	console.log('傘を持っていく')  //「傘を持っていく」と表示する
}
```
##2.条件に合致しない時の処理「else」
「条件に合致しない時」にどのような処理をするのか指定することもできます。

```javascript
//書き方
if( 条件A ){
条件Aに合致した時の処理
}
else{
条件に合致しなかった時の処理
}
```
　
<b>■例：もし天気予報が、雨だったら「傘を持っていく」と表示</b>
　　　<b>そうでなければ「何も持っていかない」と表示</b>

```javascript
var weather = （ここに天気を書く）

if( weather === '雨' ){                  //weatherに「雨」という値が入っていたら
	console.log('傘を持っていく');       //「傘を持っていく」と表示する
}
else{                                  //そうでなければ
	console.log('何も持っていかない');  //「何も持っていかない」と表示する
}
```

#3.条件は複数指定できる「else if」
条件＆処理は複数書くことができます。

```javascript
if( 条件A ){
条件Aに合致した時の処理
}
else if(条件B){
条件Aに合致せず、条件Bに合致した時の処理
}
else{
どの条件にも合致しなかった時の処理
}
```
　
<b>■例：もし天気予報が、雨だったら「傘を持っていく」と表示</b>
　　　<b>もし天気予報が、晴れだったら「扇子を持っていく」と表示</b>
　　　<b>そうでなければ「何も持っていかない」と表示</b>

```javascript
var weather = （ここに天気を書く）

if( weather === '雨' ){                 //weatherに「雨」という値が入っていたら
	console.log('傘を持っていく');       //「傘を持っていく」と表示する
}
else if( weather === '晴れ' ){          //weatherに「晴れ」という値が入っていたら
	console.log('扇子を持っていく');     //「扇子を持っていく」と表示する
}
else{                                  //そうでなければ
	console.log('何も持っていかない');  //「何も持っていかない」と表示する
}
```
Rootless Docker install トラブル(debian stretch)

## Rootless Docker install時にsystemdが検出されずdaemonの起動を設定してくれない
### 環境
OS: Debian stretch
systemd: systemd 232

### エラーの発生方法
- ```systemctl --user daemon-reload```が成功しない状態で、```curl -sSL https://get.docker.com/rootless | sh```を実行する
- Rootless Dockerのinstallには成功するが``` systemd not detected, dockerd daemon needs to be started manually```と表示され、deamonの起動は手動で行うように促される

### 原因
```systemctl --user daemon-reload```が成功しない状態だと、インストールスクリプトのsystemd検出処理が働かず、systemd用のセッティングがなされないため

> if systemctl --user daemon-reload >/dev/null 2>&1; then
    SYSTEMD=1
> https://get.docker.com/rootless

### 経緯
- RootlessDocker([参考1](https://engineering.docker.com/2019/02/experimenting-with-rootless-docker/) [参考2](https://github.com/moby/moby/blob/master/docs/rootless.md))を使おうと思った
- Debian stretchをクリーンインストール
- 一般ユーザーでログイン
- ```curl -sSL https://get.docker.com/rootless | sh```を実行
- 上述の問題が発生

### 解決
1. [systemctl --userが失敗する](#systemctl---user%E3%81%8C%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B)を解決する
2. 先のinstallで.bashrcに設定を追記している場合は、削除する
3. ```systemctl --user daemon-reload```が成功することを確認する
4. ```curl -sSL https://get.docker.com/rootless | sh```を再び実行する

## ```systemctl --user```が失敗する
via: http://hirai.me/memo.html#systemctl-user

### 環境
OS: Debian stretch
systemd: systemd 232

### エラーの発生方法
- ```systemd --user```が起動していない状態で```systemctl --user```を叩くと```Failed to connect to bus: No such file or directory```
- rootlessdockerのインストールスクリプトがsystemdを検出しない状態で終了した際の```export XDG_RUNTIME_DIR=/tmp/docker-1000```の環境変数設定を.bashrcに書いてしまった状態で```systemctl --user```の実行(こちらは後述の解決法をやってもエラーが出続けるため、.bashrcから、rootlessdockerのインストールスクリプト由来の設定をすべて削除すること

### 原因

>
- systemd --user が起動していない場合、 systemd サービスに接続できないことでエラーが発生する。
- systemd --user 自体は /lib/systemd/system/user@.service から起動されており、 libpam-systemd とは直接関係はない
- ただし、 libpam-systemd がインストールされていない状態では、 systemd --user は、必要なディレクトリや環境変数が足りず起動できない
- libpam-systemd でインストールされる pam_systemd モジュールは、 systemd --user の起動に必要な環境変数やディレクトリを設定する
- 結果的に、 libpam-systemd をインストールすると、 systemd --user が起動できるようになり、 systemctl --user からユーザーサービスが起動できるようになる

> http://hirai.me/memo.html#systemctl-user

### 対処法
1. ```sudo apt install pam_systemd```
1. マシン再起動
1. ``` root@ # systemctl status user@1000```でactiveになっていることを確認
1. ``` user@ $ systemctl --user```が正常動作することを確認
[Nuxt.js] Firebaseの設定で環境変数dotenvを扱う

```bash
$ npm i --save @nuxtjs/dotenv
$ yarn add @nuxtjs/dotenv
```

```nuxt.config.js
  plugins: [
    '~/plugins/firebase.js',
  ],
  modules: [
    '@nuxtjs/dotenv',
  ],
```

```plugins/firebase.js
import firebase from "firebase/app";
import "firebase/auth";

if (!firebase.apps.length) {
  firebase.initializeApp({
    apiKey: process.env.API_KEY,
    authDomain: process.env.AUTH_DOMAIN,
    databaseURL: process.env.DATABASE_URL,
    projectId: process.env.PROJECT_ID,
    storageBucket: process.env.STORAGE_BUCKET,
    messagingSenderId: process.env.MESSAGING_SENDER_ID,
    appId: process.env.APP_ID
  })
}

export default firebase;
```

.envファイル

```.env
API_KEY='AIXXXXXXXXXXXXXXXXXXXXXXXX'
AUTH_DOMAIN='hogefuga.firebaseapp.com'
DATABASE_URL='https://hogefuga.firebaseio.com'
PROJECT_ID='hogefugao'
STORAGE_BUCKET='hogefuga.appspot.com'
MESSAGING_SENDER_ID='123456789'
APP_ID='1:123456789:web:abcde1234'
```

## 参考
- [nuxt-community/dotenv-module](https://github.com/nuxt-community/dotenv-module)
sassをいれる時にハマった

# 🍀まえがき

## ■書いてあること
SCSSを試してみようとして環境構築しようとしたら、わりとハマったのでメモ

## ■下記の症状に効能があります
- とりあえずscss使えるようにしたい
- bashrcとかなんやねん
- rubyでパーミッションエラーになる
- rbenvしたけどバージョンが切り替わらない
- bashrcが見つからない
- bashrcになんて書いたらいいかわからない


## ■メインコンテンツ

- 主な流れ
    - homebrew入れる
    - rbenv入れる
    - 最新のruby入れる
    - rubyのパスと通す
    - sass入れる

### いきなりsassを入れようとしてみる

下記のように怒られる！！！💢

```
$ sudo gem install sass
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/bin directory.
```
https://qiita.com/kolife/items/08d9abb02dcb189bebfc
要はrubyのバージョンが古いってことらしい？


### homebrew入れる
とりあえず下記を実行

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
https://brew.sh/index_ja

>homebrewは色々と便利なツールを簡単にインストールしたり管理したり出来るやーつ。
>ruby周りは何をするにしてもまずはこれを入れることから始まる。

### rbenv入れる
まずはrubyの現在のversionを確認
こんな感じ

```
$ ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
```

とりあえず下記を実行

```
$ brew install rbenv ruby-build
```

### 最新のruby入れる

```
$ rbenv install (インストールしたいバージョンを指定)
例えばこんな感じ
$ rbenv install 2.6.5
```
バージョンはここで確認しよう
https://www.ruby-lang.org/ja/documentation/

最新バージョンを取得したらそのバージョンに切り替える

```
$ rbenv versions
* system
  2.4.2
  2.6.5 (set by /Users/tadatsugu.sampei/.rbenv/version)
$ rbenv global 2.6.5
```

切り替えたらバージョンを確認

```
$ rbenv versions
  system
  2.4.2
* 2.6.5 (set by /Users/tadatsugu.sampei/.rbenv/version)
```

さらに確認。下記のようになれば成功

```
$ ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]
```

### rubyのパスを通す
最新のrubyに切り替えたのに、`ruby -v`で相変わらず古いバージョンを見ている場合、rbenvにパスが通っていないので、パスを通す。
結論から言えば`.bashrc`ファイルを編集してパスを記述すればいいのだがちょっとハマった

- bashrcは普通はuser直下にあるらしい`~/.bashrc`
- でも最初からないことがあるらしい
- その場合は普通に新規作成をする必要がある

```
ホームディレクトリに移動
$ cd
新規作成
$ touch ~/.bashrc
編集(エディタとかでもok)
$ vi ~/.bashrc
```

編集モードになったら、何も考えずに下記を貼り付ける

```
[[ -d ~/.rbenv  ]] && \
  export PATH=${HOME}/.rbenv/bin:${PATH} && \
  eval "$(rbenv init -)"
```

設定ファイルを読み込ませる

```
$ source ~/.bashrc
```

### 思い通りのパスになってるか確認

`$which`して確認する

```
ダメなパターン

$ which ruby
/usr/bin/ruby

$ which gem
/usr/bin/gem
```


```
OKなパターン

$ which ruby
/Users/hoge/.rbenv/shims/ruby

$ which gem
/Users/hoge/.rbenv/shims/gem
```
Rails database.yaml の<<:の確認

# Rails database.yaml の<<:の確認

`database.yaml` の `<<:` が何かわからなかったため調査

```yaml
# SQLite. Versions 3.8.0 and up are supported.
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3
```

## 結論

```yaml
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
```

`default: &default` でエイリアスを定義し

```yaml
development:
  <<: *default
  database: db/development.sqlite3
```

`<<: *default` でエイリアスとして定義した `default` を `development` にマージしている。
rbenv に新しいバージョンの Ruby をインストールする

# rbenv に新しいバージョンの Ruby をインストールする

Git でインストールした rbenv を Ruby 2.6.4 -> 2.6.5 へアップデートする手順

## 環境

- Ubuntu 18.04

## rbenv をアップデートする

```shell-session
$ cd ~/.rbenv
$ git pull origin master
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/rbenv/rbenv
 * branch            master     -> FETCH_HEAD
   4e92322..577f046  master     -> origin/master
Updating 4e92322..577f046
Fast-forward
 README.md | 10 ++++++++++
 1 file changed, 10 insertions(+)
```

## ruby-build をアップデートする

```shell-session
$ cd ~/.rbenv/plugins/ruby-build
$ git pull origin master
remote: Enumerating objects: 60, done.
remote: Counting objects: 100% (60/60), done.
remote: Compressing objects: 100% (35/35), done.
remote: Total 60 (delta 29), reused 39 (delta 16), pack-reused 0
Unpacking objects: 100% (60/60), done.
From https://github.com/rbenv/ruby-build

- branch master -> FETCH_HEAD
  5db61ac..da8e0b4 master -> origin/master
  Updating 5db61ac..da8e0b4
  Fast-forward
  bin/ruby-build | 4 ++--
  share/ruby-build/2.4.8 | 2 ++
  share/ruby-build/2.4.9 | 2 ++
  share/ruby-build/2.5.7 | 2 ++
  share/ruby-build/2.6.5 | 2 ++
  share/ruby-build/truffleruby-19.2.0.1 | 7 +++++++
  6 files changed, 17 insertions(+), 2 deletions(-)
  create mode 100644 share/ruby-build/2.4.8
  create mode 100644 share/ruby-build/2.4.9
  create mode 100644 share/ruby-build/2.5.7
  create mode 100644 share/ruby-build/2.6.5
  create mode 100644 share/ruby-build/truffleruby-19.2.0.1
```

## Ruby 2.6.5 をインストールする

```shell-session
$ rbenv install 2.6.5
Downloading ruby-2.6.5.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.5.tar.bz2
Installing ruby-2.6.5...
Installed ruby-2.6.5 to /home/glorydays/.rbenv/versions/2.6.5
```

## Ruby 2.6.5 をデフォルトにする

```shell-session
$ rbenv global 2.6.5
$ ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]
```

## コマンドの確認

試しに Rails のプロジェクトを作成する。

```shell-session
$ rails new test-app
rbenv: rails: command not found

The `rails' command exists in these Ruby versions: 2.6.4
```

Ruby 2.6.5 に Rails はインストールされていないためインストールする。

## rbenv exec gem install rails

`rbenv` で管理された Ruby に `gem install` する場合は `rbenv exec` で実行する。

```shell-session
rbenv exec gem install
```

bundler をインストールする。

```shell-session
$ rbenv exec gem install bundler
Fetching bundler-2.0.2.gem
Successfully installed bundler-2.0.2
1 gem installed
```

rails をインストールする。

```shell-session
$ rbenv exec gem install rails
Fetching thread_safe-0.3.6.gem
Fetching tzinfo-1.2.5.gem
$ rbenv rehash
```

## コマンドの確認(再)

再度 Rails のプロジェクトを作成する。

```shell-session
$ rails new test-app
create
 create README.md
create Rakefile
create .ruby-version
create config.ru
create .gitignore
create Gemfile
run git init from "."
(省略)
Done in 8.56s.
Webpacker successfully installed 🎉 🍰
```

完了
Elm公式ガイドの未翻訳箇所の概要(2019/10/13時点)

# Elm公式ガイドについて

[Elm公式ガイド（日本語）](https://guide.elm-lang.jp/)は、関数型プログラミング言語Elmの[公式ガイド（英語）](https://guide.elm-lang.org/)を、有志の皆様が翻訳してくださったものです。
日本語訳版のおかげで、多くの方々がElmに入門しやすくなったのではないでしょうか。

# この記事の概要

2019年9月後半、Elm公式ガイド（英語）に大きめの変更が入りました。
これはその変更内容をまとめたものです。
まだ翻訳されていないので、みんなで翻訳していきましょ〜:grinning:

# 変更点概要

- ガイドで教えている内容自体には変更なし
- 表記が変更された（よりシンプルになったような気がします）
- ガイド内で実際にコードを書いて試すことができるようになった（replが埋め込まれた）
- そのためElmやエディタのインストール説明がかなり後に回った

# 変更点一覧

|ファイル名|変更|新規|削除|主な変更内容|ファイル概要|
|:--|:-:|:-:|:-:|:--|:--|
|.gitignore|○|||コメント行などを削除しシンプル化|（git用の設定ファイル）|
|book.json|○|||全ページ右上にあったshareボタンの削除|（gitbookの設定ファイル）|
|book/README.md|○|||表記をよりシンプルにした|はじめに|
|book/SUMMARY.md|○|||「インストール」を細分化＆後の方に移動|目次|
|book/appendix/function_types.md|○|||replが埋め込まれた|関数の型|
|book/architecture/README.md|○|||表記の変更＆画像と動画でよりわかりやすくした|The Elm Architecture|
|book/architecture/buttons.md|○|||冒頭の「サンプルコードをダウンロードするか」を削除|ボタン|
|book/architecture/forms.md|○|||冒頭の「サンプルコードをダウンロードするか」を削除| フォーム |
|book/architecture/hints.mp4||○|||（The Elm Architecture内の動画）|
|book/architecture/text_fields.md|○|||冒頭の「サンプルコードをダウンロードするか」を削除| テキストフィールド |
|book/architecture/try.png||○|||（The Elm Architecture内の画像）|
|book/core_language.md|○|||見出しは変わらないが大幅な変更＆replが埋め込まれた| 言語の基礎 |
|book/effects/http.md|○|||冒頭の「サンプルコードをダウンロードするか」を削除| HTTP |
|book/effects/json.md|○|||冒頭の「サンプルコードをダウンロードするか」を削除| JSON |
|book/effects/random.md|○|||冒頭の「サンプルコードをダウンロードするか」を削除| Random |
|book/effects/time.md|○|||冒頭の「サンプルコードをダウンロードするか」を削除| Time |
|book/error_handling/maybe.md|○|||replが埋め込まれた| Maybe |
|book/install.md|||○|細分化されたため削除| インストール(旧) |
|book/install/README.md||○||「インストール」が細分化されたため新規作成|インストール|
|book/install/editor.md||○||「インストール」が細分化されたため新規作成|インストール/Code Editor|
|book/install/elm.md||○||「インストール」が細分化されたため新規作成|インストール/Elm|
|book/install/images/editor.png||○|||（インストール/Code Editor内の画像）|
|book/install/images/terminal.png||○|||（インストール/Elm内の画像）|
|book/interop/README.md|○|||冒頭の表記を変更| JavaScriptとの相互運用 |
|book/styles/website.css||○||目次最下部の「GitBookで公開」の非表示など|（全ページ共通のcss）|
|book/types/custom_types.md|○|||replが埋め込まれた| カスタム型 |
|book/types/pattern_matching.md|○|||typo修正| パターンマッチ |
|book/types/reading_types.md|○|||replが埋め込まれた| 型を読む |
|book/types/type_aliases.md|○|||サンプルプログラムと表記をよりわかりやすいものに変更＆replが埋め込まれた| 型の別名 |
|book/webapps/structure.md|○|||ほんの少しだけ表記の変更| モジュールの構造化 |
|build.sh|○||||（GitBook用のshell）|
|favicon.ico||○|||（アイコン）|
|redirects.json|○||||（リダイレクトの設定）|
|repl/README.md||○|||（ページ内に埋め込まれたrepl用）|
|repl/assets/repl.js||○|||（同上）|
|repl/build.sh||○|||（同上）|
|repl/elm.json||○|||（同上）|
|repl/index.js||○|||（同上）|
|repl/package.json||○|||（同上）|
|repl/src/Error.elm||○|||（同上）|
|repl/src/Flags.elm||○|||（同上）|
|repl/src/Repl.elm||○|||（同上）|
|test.html||○|||（ガイドからは参照されない。本当にテスト用っぽい。）|

# 差分の確認方法
[Elm公式ガイドの「翻訳について」](https://guide.elm-lang.jp/about_translation.html#原文のバージョン)から、翻訳済の内容と最新の公式ガイド（英語）との差分が確認できます。
UniTask -> UniRx変換を行う際に見落としてしまったところ

## 概要

https://github.com/Cysharp/UniTask
https://github.com/neuecc/UniRx

UniTaskとUniRxは同じ作者(neueccさん)のものでして、今はリポジトリが分割されましたが
元々は単一プラグインでした。
非同期を扱う特徴としてはある程度似たようなところもありますが、
それぞれ場面による長所があり両方を一緒に使っているプロジェクトを世の中でよく見かけます。

UniRx -> UniTaskの変換はObservable.Awaiter.csでAwaiterが実装されており、変換せずに awaitを書ける、もしくは明示的にToUniTask()メソッドを使い変換させる方法があります。
(ToUniTaskを使うとCancellationTokenを渡せるのと、useFirstValueが用意されており
後者が望ましいと思います)

UniTask -> UniRxに関しては ToObservable()メソッドが用意されており、これを使えばRxとして扱うことが出来ます。

今回はUniTask -> UniRxを変換する際にミスしやすいところに関して軽く話してみようと思います。

## 本題
https://github.com/Cysharp/UniTask/blob/5bfff5bc244e4ecda13e427853a0a514ce525689/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskObservableExtensions.cs#L33

ToObservable()の内部実装としては、AsyncSubjectを使い結果を受け取る処理となっております。
ここでわかると思いますが、Fire().Forget()となっているため
**UniTaskを非同期に走らせ、その結果をObservableに通知させる**
ことになります。

Observer/Observableの役割としてはある処理の監視を行い通知することで終わるので、
走った処理をキャンセルする義務はないものに意味合い的には間違いないと思います。

Taskのキャンセルですが、ObservableのようにDisposableとして購読を破棄するわけではなく
キャンセル処理を自前で実装しないといけないため、実装が確立されているUniTask<T>型に対して後ほど外部からキャンセルさせることは出来なくなっております。

とのことで、こういうところを見落としてしまいました。
1.ToObservableをしたとしても内部ではUniTaskが普通に走るため、
SubscribeしなかったらもちろんObservableは走らないが普通にUniTaskの処理は走る

使うつもりながらSubscribeしないまま放置するObservableは普通にコードミスだと考えて良いでしょうが、SelectMany/ContinueWith等の引数としてFuncでないIObservableを受け取るところで使われる際には明示的に遅延させないと意図しないタイミングで走る可能性があったためDeferを囲むことになりました。

```csharp
private async UniTask HogeAsync()
{
    ...
}

//変更前
button.OnClickAsObservable()
    .SelectMany(HogeAsync().ToObservable()) // 多分Select().Switch()が望ましいですが
    .Subscribe()
    .AddTo(disposable);

//変更後
button.OnClickAsObservable()
    .SelectMany(Observable.Defer(() => HogeAsync().ToObservable()))
    .Subscribe()
    .AddTo(disposable);
```

2.ObservableがDisposeされることで、(もちろん)UniTaskもキャンセルされるわけではない

2に関しては、キャンセルさせないといけないUniTaskに関しては以下のコードを書くことで解決しました。

```csharp
private async UniTask HogeAsync(CancellationToken ct)
{
    //ctを用いてキャンセル処理を行う
    ...
}

//変更前
//複数Clickを行っても前のHogeAsyncはキャンセルされず最後まで走る
button.OnClickAsObservable()
    .Select(_ => HogeAsync().ToObservable())
    .Switch()
    .Subscribe()
    .AddTo(disposable);

//変更後
private IObservable<Unit> HogeAsObservable()
{
    return Observable.Create<Unit>(observer =>
    {
        var disposable1 = new CancellationDisposable();
        var disposable2 = HogeAsync(disposable1.Token).ToObservable()
            .Subscribe(observer);              

        return new StableCompositeDisposable(disposable1, disposable2);
    });
}

button.OnClickAsObservable()
    .Select(_ => HogeAsObservable())
    .Switch()
    .Subscribe()
    .AddTo(disposable);
```

複数のCancellationTokenを使わないといけないなら CancellationTokenSource.CreateLinkedTokenSourceを使う感じですかね。

## 終わりに
UniTaskのキャンセル処理をきちんとケアするのが面倒くさい割りに、UniTaskを使うと可読性があがるのと簡単に値を返すだけの操作にはUniTaskが向いているので、どっちかを外す選択は出来なく悩ましいですね。逆にUniRxのストリームの細かい動作の操作も欲しい場合があるので、個人的にはキャンセルをそんなに考慮しなくても良いDomain層での非同期処理に関してはUniTaskを、ストリームの操作が頻繁に必要となる際にはUniRxを使う感じになってます。(複数の値と単体の値で区分けもできますが)
しばらくは両方適切に混ぜて使う形になりそうです。
【SpringBoot】SpringBoot2.0.9 -> 2.1.9でテストを実行できなくなった状況への対処【JUnit5】

# 状況
既存のプロジェクトで`SpringBoot`を`2.0.9`から`2.1.9`に上げた所、`./mvnw surefire:test`を実行すると`TestEngine with ID 'junit-jupiter' failed to discover tests`するようになってしまいました。

また、`idea`からの実行では大半のテストが動くものの、`Suppressed: org.junit.platform.commons.util.PreconditionViolationException: Configuration error: You must configure at least one set of arguments for this @ParameterizedTest`と出てパラメタライズテストが落ちるようになりました。

その対処としてやったことのまとめです。

# 試した内容
以下の順で試した所解決しました。

1. `Maven`のアップデート
2. `JUnit5`の依存性を`junit-jupiter`のみ追加する形へ修正

## 1. Mavenのアップデート
[こちら](https://dzone.com/articles/why-your-junit-5-tests-are-not-running-under-maven)の記事で「*`Maven3.6.0`未満だとダメ*」的な記述が有り、自分の環境の`Maven`が`3.5.4`だったため、`3.6.2`へアップデートしました。

これを実行してもその場で症状は変わりませんでしたが、後で何かしら影響が有るかもしれないので、アップデートしておいた方がいいかなと思います。

- [【Mac】brew upgrade mavenでMavenを最新にアップデートする \- Qiita](https://qiita.com/wrongwrong/items/a005334a17c9bbbcc1d0)

## 2. JUnit5の依存性をjunit-jupiterのみ追加する形へ修正
[こちら](https://bugs.eclipse.org/bugs/show_bug.cgi?id=545849)に「*`junit-jupiter-api`、`junit-platform-launcher`、`junit-jupiter-engine`の代わりに`junit-jupiter`のみをテストの依存関係として使用するとバグが消える*」という記述があったため実際にやってみた所、発生していた問題は両方とも解消しました。

```xml:pom.xml(修正前の抜粋)
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-launcher</artifactId>
    <version>1.5.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.5.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.5.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.5.2</version>
    <scope>test</scope>
</dependency>
```

```xml:pom.xml(修正後の抜粋)
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.5.2</version>
    <scope>test</scope>
</dependency>
```

# 原因の考察
以下は`pom.xml`変更後`mvn dependency:tree`した結果です。

```
[INFO] +- org.junit.jupiter:junit-jupiter:jar:5.5.2:test
[INFO] |  +- org.junit.jupiter:junit-jupiter-api:jar:5.3.2:test
[INFO] |  |  +- org.apiguardian:apiguardian-api:jar:1.0.0:test
[INFO] |  |  +- org.opentest4j:opentest4j:jar:1.1.1:test
[INFO] |  |  \- org.junit.platform:junit-platform-commons:jar:1.3.2:test
[INFO] |  +- org.junit.jupiter:junit-jupiter-params:jar:5.3.2:test
[INFO] |  \- org.junit.jupiter:junit-jupiter-engine:jar:5.3.2:test
[INFO] |     \- org.junit.platform:junit-platform-engine:jar:1.3.2:test
```

これを見ると、`junit-jupiter-api`、`junit-platform-launcher`、`junit-jupiter-engine`は`5.3.2`が入っています。
ここから、原因はライブラリのバージョン間の互換性の問題だと思われます。

# 参考にさせて頂いた記事
- [Why Your JUnit 5 Tests Are Not Running Under Maven \- DZone Java](https://dzone.com/articles/why-your-junit-5-tests-are-not-running-under-maven)
- [545849 – No Test found with test runner 'JUnit 5': NoSuchMethodError](https://bugs.eclipse.org/bugs/show_bug.cgi?id=545849)
【css】display: table-cell でli要素を横並びに表示する

次のようなhtmlがあるとき、li属性を横並びに表示したい

```html
 <title>メニュ</title>
</head>
<body>
  <h3></h3>
  <ul class = "tes">
    <li><a href="#">HOME</a></li>
    <li><a href="#">page1</a></li>
    <li><a href="#">page2</a></li>
    <li><a href="#">page3</a></li>
    <li><a href="#">page4</a></li>
```

次のようにcssをあてる

```css
ul.tes {
    display:table;
    table-layout:fixed;
    width:500px;
    padding-bottom: 40px;
}
ul.tes li {
    display:table-cell;

}
```
Firefox の Format Link の直し方

Firefox には [Format Link](https://addons.mozilla.org/ja/firefox/addon/format-link3/) という大変便利なアドオンがある（Google Chrome にも似たようなのはある）。

この記事では，そのアドオンの不具合と，その直し方について書く。

# Format Link の概要

例えば Ruby の公式リファレンスマニュアルの以下のページへのリンクを自分の記事に書きたいとする。
[instance method Array#\[\] (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/2.6.0/method/Array/i/=5b=5d.html)

URL だけのリンクでは分かりづらいので，上記のリンクのごとく，ちゃんとリンクテキストと URL とに基づくリンクにしたい。Markdown だと `[リンクテキスト](URL)` の形式でそれはできるのだが，そのように書くのが面倒くさいのである。

URL のコピペはロケーションバー（アドレスバー）から持ってくるだけからいいものの，リンクテキストを**同時に**持ってくることができない。

また，上記の例で言うと，リンクテキスト中に `[` や `]` が含まれるので，Markdown で書くときにバックスラッシュを付けて `\[` や `\]` のように書いてエスケープしてやらねばならない。面倒だし，やり忘れもありがち。

Format Link をインストールしておけば，当該ページでコンテキストメニューから選ぶだけで Markdown 形式のリンク用文字列がクリップボードにコピーされる。もちろん適切なエスケープもなされる。

形式は Markdown 以外も選べるし，自分で自由に作ることもできる。

ちなみに，ページ上に選択テキストがある場合と無い場合で動作が変わるようになっている。
選択テキストがある場合はそのテキストがリンクテキストになり，無い場合はページの `title` 要素がリンクテキストになる。なんと心憎い配慮であることか。

もうこれ無しにリンクなんかしたくないっ！ってくらい使ってた。

以下のような Qiita の記事へのリンクを作るのも，一瞬でできるのだ。
[Rust の論理積の & は短絡評価じゃなかった - Qiita](https://qiita.com/scivola/items/25e867d69588bf568a6f)

Qiita の記事へのリンクであることが分かるように，リンクテキストの末尾に「`- Qiita`」が付いているといいのだが，この部分は記事上には表示されていないので，Format Link を使うまでは，HTML の title 要素から拾ってくるか，手で打つしかなかったんである。

# 不具合

ところが，どこかのバージョンからか，おかしくなった（Format Link のバージョンじゃなくて Firefox のバージョンだったかな？）。
設定が空っぽになって変更もできない状態になり，どうにも使えなくなってしまった。

プロジェクトの GitHub リポジトリーには issue も立った。
[Can't save setting in FF67 · Issue #25 · hnakamur/FormatLink-Firefox](https://github.com/hnakamur/FormatLink-Firefox/issues/25)

しかし，作者さん（感謝してます！）がお忙しいのか，全く動きがなかった。

# 解決法

そこへ！　@lo48576 さんが対症療法的に正常化する方法を書いてくださった（上記の issue 参照）。

以下に，その手順を日本語で要約させていただく。

[1] ロケーションバーに `about:debugging#/runtime/this-firefox` と打つ
[2] Format Link の「調査」をクリック（コンソールが出る）
[3] コンソール上で `await browser.storage.sync.set(DEFAULT_OPTIONS);` と打つ

たったこれだけで直る。えっと Firefox を再起動したほうがいいのかな。よく分からんけど，ともかく直った。
@lo48576 さん，あなたは今，私の神です。崇拝します。少なくとも夜が明けるまで。もうすぐ寝ますけど。

不具合の原因や，上記の操作の意味などは上記 issue の @lo48576 さんの書き込みにあるので，ご参照を。
TensorFlowのGradientDescentOptimizerでValueErrorに困った件

TensorFlowの勉強をしている際にGradientDescentOptimizerのValueErrorで詰まったので、忘れないように解決方法（チェックすべきポイント）をメモに残しておく。

# エラーが出たコード

```
import tensorflow as tf

x = tf.Variable(0, name = 'x')
func = (x - 1)**2

optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.1)

train_step = optimizer.minimize(func)

# 以下はエラー原因には無関係
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(20):
        sess.run(train_step)
    print('x = ', sess.run(x))
```

実行結果は以下のようになり、どこが間違っているか延々と悩んだというお話。
***ValueError***: Invalid type tf.int32 for pow_3:0, expected: [tf.float32, tf.float64, tf.float16, tf.bfloat16].

# エラー原因
GradientDescentOptimizerはFloatにしか対応していないため、***0（Int）ではなく0.（Float）***と記述しなくてはいけなかった。

```
x = tf.Variable(0., name = 'x')
```

上記以外、他の部分のコードは修正しなくてOK。
後になって考えればエラーメッセージを冷静に読めば分かったんだけど、TensorFlowのエラーメッセージに慣れていなかったことと、エラー箇所がtrain_stepの部分を示していて思考がそっちばかりにハマっていた…
（参考書にも注意ポイントとして明記しておいて欲しかった）


固定観念に囚われずに愚直に学びなさい、という教訓にはなったかな？
GWT Material Designで遊ぼう（環境構築編）

GWT Material Designというものが面白そうなので試しに触ってみたときの備忘録です。
あとGWTの記事が少なすぎるので誰かの参考になれば...。

# 必要なもの
  - IntelliJ Ultimate
  - Maven
  - サンプルプロジェクトの取得

※基本的には[公式サイト](https://gwtmaterialdesign.github.io/gwt-material-demo/#gettingstarted/)に書かれてる通りに実施すればOK。以下細かく手順を載せていきます。

# IntelliJ Ultimateのインストール
https://www.jetbrains.com/idea/downloa
ここからIntelliJ Ultimate（有償版・トライアル期間30日）をインストール。
有償版でないとGWTのコンポーネントが使えないので注意。

# Mavenのインストール

```
$ brew install maven
$ mvn -v
```

# サンプルプロジェクトを取得
```
$ mvn archetype:generate -DarchetypeGroupId=com.github.gwtmaterialdesign -DarchetypeArtifactId=gwt-material-archetype -DarchetypeVersion=2.1.1
```

このときいろいろ聞かれますが適当でOK。
- groupId:
- artifactId:
- package:
- description:
- moduleName:
- projectName:


# IntelliJでビルド
IntelliJでさきほど取得したプロジェクトを開き、ビルドします。

実行/デバッグ構成を開く。
<img width="676" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234929/b3e61e99-d4d4-b8ae-46ba-deb27e589ece.png">

「+」ボタン押して
<img width="925" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234929/98e865c8-00e6-d8e1-27f7-90a5bca7ed37.png">

「GWT Configuration」を選択し
<img width="923" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234929/580ab9b0-912a-42db-8cc1-f61c59fe742c.png">

適当に名前をつけてあげてから「Apply」→「OK」
<img width="928" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234929/cf084619-df49-66db-f9be-8bfaff91c616.png">

さきほど作成した実行/デバッグ構成を選択していビルド開始すると
<img width="680" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234929/38ebe1b1-a58a-9c7e-7d85-a18cba3286fe.png">

できた
<img width="983" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234929/f262cbf3-816b-7a05-d98d-e9f9372160b9.png">

簡単ですね。
これで環境は整いました（たぶん）。
あとはXMLファイルを編集して画面を作りこんでいきましょう。

# 最後に、GWTをいじってみる理由など...
WEBシステムを作る上でなにを重視するかはエンドユーザあるいは開発者自身の思いに依るとことですが、どんな現場でも「見た目＝UI」をあーしたいこーしたいだの議論が白熱するあまりプロジェクトがスムーズに進まないということを経験してきました。

UIを練り練りするのもそれはそれで楽しいですが、一度ある程度の水準までガイドラインを決めてしまえば、あとはシステムの中身のことを考える時間に回したほうがスピーディに事が進むのになあとも思ったりします。

この「ガイドラインを先に作っていこうぜ！」っていうのをデザインシステムっていうらしいですが、あまり導入経験がないのでもっと勉強したいなと思ってます。その1つとして今回はGoogleが提供しているマテリアルデザイン、そしてこれを簡単に実装できるらしいGWTというフレームワークを利用してみます。理由としては、フロントサイドの実装にHTML/CSS/JS等は使わず、ルールに則ってXMLを記述すれば自動的にデザインを適用してくれるらしいという~~メンドくさがりな私にはピッタリの~~シンプルなところが魅力的だったので。

概要とかは追々調べていくとして、まずは弄ってみたい。
今回の記事ではまず環境構築まで行い、次回から [GWT公式サイト](https://gwtmaterialdesign.github.io/gwt-material-demo/ "GWT公式サイト")に載っている機能をあれこれ試していきたいと思います。
【初心者】HTML　要素同士を重ねる／ヘッダーの固定etc【備忘録３】

##8/11～8/13 勉強したこと
- widthに関して、%表示ができるので画像・アイコンなど等間隔に並べる際はとても便利な書き方なので覚えておきたい。
- 要素同士を重ねる際はposition:abusolute;が使用できるが、もうひとつの要素からずらして表示させたい場合はposition:relatibe;と一緒に使って表示させる。ごちゃまぜにならないように覚える。
- ボタンなどに影を付けて押したようにする際は自動でなるわけではないことを学んだ。<br>
→　activeを使用して、影をなくす・色を変える・ボタンを下に動かす　３つの合わせ技で押したように見せれることがわかった。
- ヘッダーのみ固定する際は、スクロールした際に他の要素のほうが上に来てしまうことがあるのでz-index:10;を書くことによって一番上に表示させておかねばならない。 


##振り返り
小テストのような形で、自分の書き方でページを作って間違えた箇所など今後はメモしていければと思う。次の記事で気を付けたい箇所として書き残す。
【JUnit5】「assertEqualsの参照はあいまいです」への対処

# 問題
以下のように、片方がプリミティブ型、片方がオブジェクト型な状態で`org.junit.jupiter.api.Assertions.assertEquals`を呼び出すと「*assertEqualsの参照はあいまいです   org.junit.jupiter.api.Assertionsのメソッド assertEquals(java.lang.Object,java.lang.Object)とorg.junit.jupiter.api.Assertionsのメソッド assertEquals(int,int)の両方が一致します*」としてコンパイルエラーになります。

```java
assertEquals(1, (Integer) 1);
```

# 対処
どちらかをキャストしてやれば大丈夫です。
基本的にプリミティブ型にキャストしてやるのがいいと思います。

```java
assertEquals(1, (int) ((Integer) 1));
```
Rider/ReSharperのUnity向けLive Template

Riderで提供されているUnity向けの[Live Template](https://www.jetbrains.com/help/rider/Using_Live_Templates.html)をGifで紹介します。

一覧は、[reshaper-unity](https://github.com/JetBrains/resharper-unity/tree/net193/resharper/resharper-unity/src/Templates/Live)のGitHubリポジトリから。


# sfield

`UnityEngine.SerializeField`アトリビュートがついたprivateなフィールドを作るライブテンプレート。

キーワードは`sfield`。

![sfield.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/54240475-8ed6-a5f9-22f7-b78653b0e63c.gif)

# sprop

`UnityEngine.SerializeField`アトリビュートがついたprivateなフィールドをバッキングフィールドとして持つプロパティ作るライブテンプレート。

キーワードは`sprop`。

![sprop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/22717447-8e69-9bdd-9796-483ef3646f1c.gif)

# cor

コルーチン用の`IEnumerator`を返すメソッドのライブテンプレート。

キーワードは`cor`。

![cor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/c45db312-501a-6010-e3fc-a90a5c0e4674.gif)

# reqcomp

`UnityEngine.RequireComponent`を付与するライブテンプレート。

キーワードは`reqcomp`。

![reqcomp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/4c1765de-9548-f4d3-2f78-9679ecd6a58b.gif)

# assetmenu

`UnityEditor.CreateAssetMenu`アトリビュートを付与するライブテンプレート。

キーワードは`assetmenu`。

![assetmenu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/5eee8391-35f5-bddf-88d6-809ff5238563.gif)

# menuitem

`UnityEditor.MenuItem`アトリビュートを付与するライブテンプレート。

キーワードは`menuitem`。

![menuitem.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/c856ef29-de06-13f5-81d4-5101041dd78c.gif)


# log系

`UnityEngine.Debug.Log`などのライブテンプレート。

キーワードは`log`など。

![log.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/bc00189d-2e70-0a5d-eb86-88200fa33af8.gif)
![logwarn.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/f74582e3-4337-a7ac-033b-639f2fe05399.gif)
![logerr.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/5ea15c8e-efd3-c04c-2fed-9a32686b6fed.gif)
![logex.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/456e259f-c317-f99b-b752-fd237a06fde4.gif)
![logvar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/d0d24b0e-624e-679d-fc08-7ee2f3b55356.gif)
GCPのVMでWordPress立てたら新エディター(Gutenberg)からの投稿が失敗する

WordPressもGCPも詳しくなくあれれって数日間悶々とググったりと時間を溶かしたので誰かのためになればと思い記録しておきます。

# 事象
WordPressをGCPで立てたのですが、新エディター(Gutenberg)での新規投稿ができず、「公開に失敗しました」のエラーが表示されてしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/5d0d8c9e-5060-9034-69b2-3e507ad27388.png)


# 環境
どういう条件で発生するのかはわからないのですが、私のWordPress環境を記載しておきます。
- Google Cloud Platform（wordpress with nginx and ssl certified by bitnami）
- 動的IPを静的に変更済
- ストレージをGoogle Cloud Storageのバケット利用
- 独自ドメインを購入し、CDN（Cloudflare）でhttps化済
- phpバージョンはPHP 7.3.9 (cli) (built: Aug 30 2019 14:19:42) ( NTS )
- WordPressバージョンは 5.2.3

# 対処方法
## （余談）気が付いたきっかけ
ダッシュボードの一般画面で、URL欄に「http://」と表示されていてここ編集できないようになってまして、https化できてるはずなのになぜだろうと思ったのがきっかけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/439b13c4-f7f6-846e-3ec5-ff726a0dd5fe.png)

## 手順
GCPのサーバーにSSHログインし、以下のコマンドを実行

```:terminal
sudo vim /opt/bitnami/apps/wordpress/htdocs/wp-config.php
```

以下の箇所を探し、

```:wp-config.php
define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . '/');
```

以下に編集して上書き

```:wp-config.php
define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/c21fe59a-4a89-beb4-a651-2941cc9ee7cb.png)


プロンプトに戻るんで以下のコマンド実行(何も出力されずプロンプトだけ返ってきます）

```:terminal
sudo nginx -s reload
```

ダッシュボード＞一般のURL表示に反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/b9288d47-027f-8d45-73c6-02ecc8792613.png)

新エディタで試してみたらできたー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/2fa72c61-9302-5e6f-adb6-c313c5be2f06.png)

ただ‥手順記録しようと一旦元に戻して投稿失敗するか試してみたらなぜか公開できてしまい、もしかしてここが原因ではなくnginxを再起動するだけでよかったとかそういうオチかもしれない…


# 参考になった情報
[GCP上のWordPressでSSL(https)を有効にする方法](https://noatolog.org/blog/wordpress/bitnami-ssl-https/)
[1時間で出来る！最強のWordPress環境構築](https://qiita.com/ryuta69/items/dbb0db5cf7099b7a7cc4)
k3dでk3d create実行時に複数ポートを同時にマッピングさせる

`--publish="8080:8080" `の要領で足していく感じ

```
k3d create --name="k3s-default" --workers="2" --publish="80:80" --publish="443:443" --publish="8080:8080" --server-arg --no-deploy --server-arg traefik
```

## 参考
https://github.com/rancher/k3s/issues/712
SQLserverを立ててエクセルVBAでデータを取得できるにした時の備忘録

##マスタDBの作成
SQLserverでDBを立てました。
https://qiita.com/mrsr6113/items/477599bb6e4ce522bf88

##エクセルでSQLserverからデータを取得する
こちらで公開されているコードを使用させていただきました。
https://hosopro.blogspot.com/2017/07/excelsql-server.html

##「ユーザー定義型は定義されていません。」エラーで焦る
こちらを参照させていただきました。
https://tsware.jp/tips/tips_334.htm

「ActiveX Data Objects 2.Xのチェックを外す」となっていましたが、エラーが出ましたので下記にチェックを入れたところ解消しました。
Microsoft DAO 3.X Object Library
また、今回はMicrosoft ActiveX Data Objects 6.X Libraryを使用しました。

##作成したエクセルでVBAが保存できない
久しぶり過ぎてうっかりしてましたが、保存形式が「.xlsm」にしないとダメですね。

##SQLserverからselectするだけなら「データの取得」が便利
わざわざVBAを使わなくてもデータを取得するだけならGUIでできるようになってますね。。
「データ」タブ - 「データの取得」 - 「データベースから」
本当に便利になったものです。
Pythonでネットワーク分析 -- 基本用語 --

# 概要

**Pythonでネットワーク分析をする際に登場する用語集を整理しました。**
**今後も追加していく予定です。**

<dl>
  <dt>頂点(vertex)</dt>
    <dd>グラフを構成する点(ノードと呼ばれることもある)</dd>
  <dt>辺(edge)</dt> 
    <dd>頂点を結ぶ線(エッジと呼ばれることもある)</dd>
  <dt>有向グラフ(directed path)</dt>
    <dd>一方通行であるような辺が存在するグラフ</dd>
  <dt>無向グラフ(undirected path)</dt>
    <dd>すべての辺が双方向であるようなグラフ</dd>
  <dt>道(path)</dt>
    <dd>頂点と辺が代わる代わる連続したもので同じ頂点が二度以上現れないもの</dd>
  <dt>強連結</dt>
    <dd>任意の２頂点間に道が存在する有向グラフ
    <dd>２頂点間の方向は区別する</dd>
  <dt>弱連結</dt>
    <dd>各辺の方向を無視した時に任意の２頂点間に道が存在する有向グラフ</dd>
  <dt>次数</dt>
    <dd>ある頂点に繋がっている辺の数のこと
    <dd>自身に入ってくる辺の数を「入次数」、出て行く辺の数を「出次数」とよぶ</dd>
  <dt>重み付きグラフ</dt>
    <dd>各々の辺に数字が書いてあるもので数字は「重み」という
    <dd>数個の頂点を通る経路について、始点と終点が同じ頂点になる場合を「閉路」という
    <dd>ある頂点から頂点への経路について、通過する辺の重みの和が最小になる経路を「最短経路」という</dd>
  <dt>木</dt>
    <dd>閉路を持たないグラフのこと
    <dd>一番上の頂点を「根」、一番したの頂点を「葉」と呼ぶ
    <dd>自分より上の頂点を「親」、下の頂点を「子」という
    <dd>（辺の数）＝（頂点の数）－１である</dd>
  <dt>二部グラフ</dt>
    <dd>頂点を２つのグループに分けた時に、同じグループ内の頂点同士を結ぶ辺が無く、別々のグループの頂点同士を結ぶ辺しかないようなもの</dd>
SVGのアニメーション方法の比較


|分類|CSS|SMIL|JavaScript|
|---|---|---|---|---|
|ストロークアニメーション(書き順)|〇|〇|〇|
|モーフィングアニメーション|×|〇|〇|
|単純なアニメーション(プロパティ変更)|〇|〇|〇|
|パスアニメーション|×|〇|〇|

## CSSで動かす
### メリット
- JavaScriptによるプログラミングがほとんど不要
- CSSプロパティ(塗りや線、拡縮・回転・移動等)であれば、手軽にアニメーションが実現できる

### デメリット
- パスの変形やパスに沿った移動はできない(path要素のd属性にアクセスできないため)
- IE11で動作しない

### まとめ
CSSプロパティの変更で対応できるシンプルなアニメーションで、IE 11に対応不要な場合に有効です。

[CSSによるSVGアニメーション](https://qiita.com/takeshisakuma/items/4942579825f75b4153f9)の記事書きました。

## SMILで動かす
|アニメーションの種類|使うタグ|
|---|---|
|属性値の変化|animateタグ|
|CSSのTransforms系の変形(回転・移動・拡縮など)|animatetransformタグ|
|パスに沿った移動|animatemotionタグ|


### メリット
- HTMLコードだけでアニメーションが可能です。
- プロパティの変更以外にも、モーフィングやパスに沿ったアニメーションが実現できます。

### デメリット
- IE 11とEdgeでは動作しません。

### まとめ
スマホサイト用サイトでSVGアニメーションを実装する場合に有効です。

[SMILによるSVGアニメーション](https://qiita.com/takeshisakuma/items/201d74aa89ef7febd97e)の記事書きました。

## JavaScriptで動かす
JavaScriptからDOMを操作することでアニメーションできます。

### メリット

|メリット|内容|
|---|---|
|表現力が高い|あらゆるアニメーションが可能(塗りと線の変化、拡縮・回転・移動、パスの変形、パスに沿ったアニメーション等)<br>CSSプロパティやSMILで実現できたものは、すべて実現できる|
|対象ブラウザが多い|IE 11、Microsoft Edgeを含む主要ブラウザーで動作する|


### デメリット
- CSSやSMILに比べると、コードが煩雑になるので難易度が高くなります。


### ライブラリ
ライブラリを使用することで、デメリットである実装の難易度を下げることができます。

- [Snap.svg](http://snapsvg.io/)
- [vivus](https://maxwellito.github.io/vivus/)
- [SVG.js](https://svgjs.com/)
- [svg-morpheus.js](http://alexk111.github.io/SVG-Morpheus/)
- [anime.js](https://animejs.com/)
- [D3.js](https://d3js.org/)
- [vivid.js](https://webkul.github.io/vivid/)



[JavaScriptによるSVGアニメーション](https://qiita.com/takeshisakuma/items/655a6a89434f7d9fb294)の記事書きました。
DBのリレーション

## 目的

- DBのテーブル設計をするにあたり基礎的な知識としての「DBのリレーション」について知る。

## DBのリレーションとは？？

- 文字通り「関係」を表す。
- テーブル同士の関係のことである。

## リレーションの種類

### 一対多

- ベースとなるテーブルと、2つ以上のサブテーブルがあったとする。
- サブテーブルの主キーがベースとなるメインのテーブルで使用されていることを指す。
- 下記画像の場合、ベースとなるテーブルが「社員テーブル」で、サブテーブルが「会社テーブル」「部署テーブル」である。  
  ![WS000067.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d1bfd609-09d6-9a7f-79da-4a414e6fbd3e.jpeg)


### 多対多

- リレーショナルデータベース(RDB)では作成してはならないものである。
- 現実世界に存在するものに対して関係性を洗わす図(ER図など)を作るとできてしまうことがある。
- 下記の画像で説明すると、一人の学生は複数の講義を履修することができる。一つの講義は複数の学生に履修してもらうことが可能である。  
  ![WS000073.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/90691e75-82e7-24b2-e798-d33fd8d81897.jpeg)
- 関連実体をもって解決する。簡単に言うとた多対多のテーブルをつなぐ新たなテーブルを作成してあげればよい。
- 新たに「受講テーブル」を作成してあげればベースとなるテーブルが「受講テーブル」で、サブテーブルが「学生テーブル」「講義テーブル」となり、一体多ののリレーションが出来上がる。  
  ![WS000069.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6a76872c-e66e-b681-657c-303c1e726649.jpeg)

### 一対一

- リレーショナルデータベースではあまり作成しないテーブルのリレーションである。
- 複数のテーブルの主キーが一致しており、一つにまとめることができるリレーションのこのである。  
  ![WS000070.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/82041ebb-e393-b413-1fac-5ca5e2db94d1.jpeg)  
  ![WS000071.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cd95f767-6eac-aaab-0376-fe57bc56703c.jpeg)
intellij IDEA で spring boot, kotlinでホットデプロイ環境

今まで、STS, spring boot, java, maven, devtool でやっていました

intellij IDEA, spring boot, kotlinを試したくなってやってみました
Spring Initializr で zipを作ります
![2019-10-13_23h41_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274034/11c02989-723c-b94c-c14b-1b252a94180b.png)

解凍して、Intellij で gradle project で importします
![2019-10-13_23h43_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274034/d6a67166-ab56-424c-cf53-3d257b475392.png)


Sampleでクラスを作成します
![2019-10-13_23h47_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274034/2234ed8c-92b5-eb28-0b5b-16fd917c6967.png)

Terminalで以下を実行します
```bash
gradlew build --continuous 
（又は「gradlew build -t」）
```

![2019-10-13_23h45_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274034/88f57d42-2ef9-3b3d-4592-e026d0421818.png)

Gradle bootRun します
![2019-10-13_23h52_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274034/1096989e-fe7d-667c-c6bc-4427184adf1e.png)

ブラウザで表示を確認します
![2019-10-13_23h46_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274034/20e19934-9192-9ad8-539d-a17d530dc361.png)

Sampleの内容を書き換えます
![2019-10-13_23h47_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274034/e2d7ee87-23e7-0c79-eafd-32b9ea0e296a.png)

再度ブラウザで表示すると、書き換えたSampleの内容で表示されました
![2019-10-13_23h59_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274034/ddce43f9-0a05-8adf-81fb-c68190039107.png)

上述の方法を見つける前に
以下の設定をする方法をよく見かけていて一応これも設定しています。
ただこちらの設定が必要なのかは確認していません。

Shift を2回押して、Registry
「compiler.automake.allow.when.app.running」にチェックを入れる

「settings > Compiler > Build project automatically」にチェックを入れる
[重要][2023更新]VBScript Language Referenceがバージョンに移動して絶対に見つけられません

# 探すのに2時間以上かかった
マイクロソフトは人に偉そうなことをいうまえに、まず検索ができるようにしたほうがいいと思います。
## 検索しても嘘がヒットする
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ics/vbscript
URLを見るとVBSCRIPTのようだ。しかし、ここは基本的にWindowsXPのファイヤーウォールなどなので関係がない。
##公式も嘘をリンクしている
https://msdn.microsoft.com/en-us/data/aa292164(v=vs.85)

https://msdn.microsoft.com/ja-jp/scripting/default.htm?/scripting/vbscript/default.htm
申し訳ございません。ご指定のページが見つかりません。

## 現在の公式(2023 Add)
やっぱり見つからない。しかし、検索語を工夫して日本語バージョンを見つけた。
Microsoft Windows スクリプト テクノロジ
https://learn.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392483(v=msdn.10)

### ついでにWaybackMachineも活躍
Do-It-Yourself Script Center Kit（今は多分使えないけどな。）
https://web.archive.org/web/20150110160931/http://msdn.microsoft.com/ja-jp/library/cc392193.aspx
Scriptomatic ツール
https://web.archive.org/web/20130301220535/http://technet.microsoft.com/ja-jp/scriptcenter/ff18940
https://web.archive.org/web/20130123091340/http://www.microsoft.com/en-us/download/details.aspx?id=7097
https://web.archive.org/web/20130123091340/http://www.microsoft.com/en-us/download/details.aspx?id=7097
Powershell 2.0 Quick Referense
https://web.archive.org/web/20100524173446/http://technet.microsoft.com/ja-jp/scriptcenter/dd919258.aspx


## 現在の公式(旧2019-2023)
まず
https://docs.microsoft.com/en-us/previous-versions/
このページに行く。このページより下のページで検索するとうまくいかない。
次に検索欄を出して`VBSCRIPT` と入力
直にアドレスを書くと、現在は以下のフォルダにある

VBScript
https://docs.microsoft.com/en-us/previous-versions/t0aew7h6(v%3dvs.85)
VBScript Language Reference 
https://docs.microsoft.com/en-us/previous-versions/d1wf56tt%28v%3dvs.80%29

## VBSCRIPTにライフサイクルがあるのか？
VBSはいまだに使えるし、バージョンアップも何もしていない。そもそも標準として存在している機能がなぜライフサイクルで以前のバージョンになてしまうのか、無茶苦茶だとしか言いようがない。

## VBScriptはなぜか廃止と一緒に検索される。

[さよなら、VBScript - 阿久津良和のWindows Weekly Report 掲載日 2017/07/18 21:02 mynavi](https://news.mynavi.jp/article/20170718-windows10report/)

[出勤したら（IEサポート終了決定で）VBScriptはお亡くなりだった件について 2022-05-31](https://techblog.cartaholdings.co.jp/entry/archives/8320)

## しかしVBScriptは2023年現在いまだに使われている(2023 Add)
power-automateの項目を見てみよう
[VBScript を使用して Excel 列を自動調整する](https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/how-to/autofit-excel-columns-vbscript)
[VB スクリプトに変数を追加する](https://learn.microsoft.com/ja-jp/power-automate/guidance/rpa-sap-playbook/adding-variables-to-vbscript)
[VBScript を使用して Word 文書からテキストを抽出する]
2023/02/02
> 光学式文字認識 (OCR) を使用して Word 文書からテキストを抽出できますが、このアプローチは、スクロールが必要な複数ページの文書では複雑になる可能性があります。
<b>Word 文書からテキストを抽出するためのより効率的な方法は、VBScript を使用することです。</b> Power Automate は、デスクトップでスクリプトを実行できるよう VBScript の実行アクションを提供します。
Word 文書からテキストを抽出するには、VBScript の実行 アクションを実行し、次のコードを実行する VBScript フィールドに貼り付けます。

### さらにこれ。
[Power Automate Desktop「VBScriptの実行」アクション](https://blog-tips.sekenkodqx.jp/2021/09/17/power-automate-desktop-action-run-vbscript-system/)

たしかにIEが停止した今、Edgeの互換モードでしか動かないというのはあるが、VBSciptの使い道はブラウザだけではない。Outlookもそうだし、Microsoft Power Autimateのように新しい機能ですら公式が平気で使っている状況である。

 以上のようにVBScriptはMicrosoftの公式の各所に記載されており、全く廃止の気配はない。さらに必須の知識である。しかし、機能ごとに紹介されているため、どうしても知識が断片的になる。ご本尊のページは、VBSってなんだろうというときには外せないページであるが、いまだに検索が難しい。全然以前のバージョンではないと思うし、以前のバージョンにするなら新しいページが必要だと思う。