OmniAICreator/Qiita-1.07M huggingface dataset:
尺度水準と代数系(書きかけ)

値は尺度水準に基づく．計算機で扱う場合にはそれに数値を当てはめる．

#尺度水準
尺度水準は，以下の4つに分類されるとされている．

- 名義尺度 ：性別など
- 順序尺度 ：好き嫌いなど
- 間隔尺度（差尺度） ：テストの点数など
- 比例尺度（比尺度） ：身長など

数値だけ見ればどの尺度の値も定義域も解像度も同じ(比例尺度は負にならないとも書かれるのをよく見るが、、、)だが，尺度水準とは，謂わば定義域内の数値への「当てはめるときの思想」である．

それぞれの尺度は，次のように説明されることが多い．「演算」は，それぞれの尺度水準の元の数値どうしの演算，「意味がある」とは，演算結果が同じ尺度水準，または下位の尺度水準で説明できる，いろんな元による演算結果を同じ意味の中で捉えることができるということである．

- 名義尺度：原点に対する区別に意味がある．
許される二項演算は，(名義演算) = { ≠} 

- 順序尺度：原点に対する大小関係に意味がある．競べることができる．
許される二項演算は，(順序演算) = {(名義演算),  >}

- 間隔尺度：原点に対する差に意味がある．差で違いを説明出来る．較べることができる.
許される二項演算は，(間隔演算) = {(順序演算), -}

- 比例尺度：原点に対する比に意味がある，比で違いを説明できる．比べることができる．
許される二項演算は，(比例演算) = {(間隔演算), /}

# 比について

割り算で表されるものはその特性に注意しないといけない

- proportion/fraction/割合/歩合/分画/度合/N分率/比率/percentile: 分子が分母に含まれる．確率. 範囲[0,1]
- ratio/比: 分子が分母に含まれない．オッズ．
- rate/率: 分母と分子は異なる次元(異なる単位)．

比例尺度は，このうち「比」である．

比率・割合や率は，間隔（感覚）尺度，

#なんとなくイメージできそうなこと(僕の勝手な仮説)

- 名義尺度の変数はカテゴリカル分布に従う。
- 順序尺度の変数は一様分布，ベータ分布に従いがち．
- 間隔尺度の変数は感覚的な心理物理量で正規分布に従いがち。
- 比例尺度はmks系単位をもち純然たる物理量で、ウェバーフェヒナー的に感覚量と対数の関係にあるから、正規分布に従うであろう間隔尺度に変換することをかんがえれば、こちらは対数正規分布に従いがち。

#「比例尺度は負にならない」は

比例尺度の変数は絶対単位を持ち、それは言い換えれば測定した量が単位量の何倍かを示した値である。それ以上でもそれ以下でもない。ゼロ倍の測定量は現実世界では「無」であり実在しないし、負倍の測定量は現実世界では有り得ないが、数値上はあってよい。ゼロは無を表す値、負は逆方向の値としてあってよい、
と思う。
BBox-Label-Toolをpython3.7で動かしたときのメモ

# はじめに
pyenvの元、BBox-Label-Toolを動かしてみようと試したメモです

# 環境
Ubuntu 18.04.2 LTS
pyenv
python 3.7.0

# BBox-Label-Toolをダウンロード

```sh
% git clone https://github.com/puzzledqs/BBox-Label-Tool
```

# python3では動かない
Environment
python 2.7
と書かれている。python3で動かしたい。きっと動かしている人がいるはずと思いIssuesを見てみる。

```
from tkinter import *
import tkinter.messagebox
```

これに変更すればよいらしいので、main.pyを書き換える。

```main.py
#from Tkinter import *
#import tkMessageBox
from tkinter import *
import tkinter.messagebox
```

# printの記述をpython3に合わせる
printにすべて括弧をつける。そんなに変更箇所は多くなかった。

# python3-tkとtk-devをinstall

```sh
% sudo apt install python3-tk
% sudo apt install tk-dev
```

# python 3.7.0の環境を新たに作る

```sh
% pyenv install 3.7.0
```

# BBox-Label-Toolを起動

```sh
% python main.py
```

<img width="903" alt="screenshot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109158/70cbec9e-dad7-160b-bb02-a750f4c31115.png">

動きました。
使い込んでみてないのでこの先の問題はまだ遭遇していませんが、たぶん大丈夫かな。
サクラエディタ：JavaScriptでマクロ実装（置換編）正規表現の指定にハマりました。

##サクラエディタのマクロ関数：replace()の引数設定について、検索文字列を正規表現にする設定につきまして、理解するまでに時間がかかりましたので、備忘録として記述します。
####サクラエディタのマクロ関数：replace()の説明になります。
- function replace(str1 :String,str2 :String,int3 :Integer)
   - str1:検索文字列
   - str2:置換文字列
   - int3:置換オプション
   - ここでは6を設定しています。以下の2と4を足した6を設定しています。
    - 0x002    英大文字と小文字を区別する
    - 0x004    正規表現

####下記サンプルコードは選択されている部分が^.*$の場合に限り、【選択されていた文字を置換しました。】に置換するものになります。^.*$は'（シングルクォーテーション）で囲まれている為、正規表現として扱われません。/（スラッシュ）で囲むと正規表現として扱われるようになります。

```replace.js
function sakuraReplace(str00) {
 return str00.replace('^.*$','【選択されていた文字を置換しました。】',6);
}

var str00 = Editor.GetSelectedString(0);
if ( str00 !== "" ) Editor.InsText(sakuraReplace(str00));
```
####下記サンプルコードは選択されている部分を【選択されていた文字を置換しました。】に置換するものになります。
```replace.js
function sakuraReplace(str00) {
 return str00.replace(/^.*$/,'【選択されていた文字を置換しました。】',6);
}

var str00 = Editor.GetSelectedString(0);
if ( str00 !== "" ) Editor.InsText(sakuraReplace(str00));
```
FizzBuzzボタンを作りながらReact Hooksを学ぶ 第6回

FizzBuzz ボタンを作りながら React Hooks を学んでいきます。
目次は[こちら](https://qiita.com/masarutan/items/9ff33b4a32042b34a815)。

# Custom Hook を作る
前回まででひととおり React Hooks を使った FizzBuzz ボタンは完成しました。
今回は Custom Hook を作ります。

Hook を組み合わせて独自の Hook を作ることができます。これを Custom Hook と呼びます。
今回は簡単な Custom Hook を作ります。

前回、マウントとアンマウント時の処理を Effect Hook を使って作りました。

```tsx:FizzBuzz.tsx
const FizzBuzz: React.FC<Props> = React.memo((props: Props) => {
  ...
  useEffect(() => {
    console.log('mount');
    return () => console.log('unmount');
  }, []);
  ...
```

`useEffect` の第1引数にマウント時の処理を指定し、その戻り値にアンマウント時の処理を指定します。
これは少しわかりにくいので、第1引数にマウント時の処理、第2引数にアンマウント時の処理を指定するような関数（`useMount`）を作ります。

```tsx:FizzBuzz.tsx
const useMount = (
  mount: () => void,
  unmount?: () => void
): void | (() => void) => {
  useEffect(() => {
    mount();
    return unmount;
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);
};

const FizzBuzz: React.FC<Props> = React.memo((props: Props) => {
  ...
  useMount(() => console.log('mount'), () => console.log('unmount'));
  ...
```

ここで注意しなければいけないのは `useEffect` の第2引数です。
修正前の実装の通り、第2引数には `[]` を渡せば良いのですが、VS Code でファイルを保存すると、eslint-plugin-react-hooks が補完をして `[mount, unmount]` となってしまいます。
これでは期待通りの動作になりませんので、補完されないようにコメントを記述しています。

`useMount` は JSX を使用していませんので、別ファイルに切り出す際には拡張子を `ts` としておきます。

```tsx:hooks.ts
import { useEffect } from 'react';

export const useMount = (
  mount: () => void,
  unmount?: () => void
): void | (() => void) => {
  useEffect(() => {
    mount();
    return unmount;
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);
};
```

↓こんな感じで使います。

```tsx:FizzBuzz.tsx
import React, { useState, useCallback } from 'react';
import FizzBuzzView from './FizzBuzzView';
import { fizzBuzz } from './common';
import { useMount } from './hooks';

type Props = {
  // props で count の初期値を受け取る
  initialCount: number;
};

const FizzBuzz: React.FC<Props> = React.memo((props: Props) => {
  console.log('render');
  const [count, setCount] = useState(props.initialCount);
  // eslint-disable-next-line no-shadow
  const plus1 = useCallback(() => setCount(count => count + 1), []);
  const clear = useCallback(() => setCount(props.initialCount), [
    props.initialCount,
  ]);
  useMount(() => console.log('mount'), () => console.log('unmount'));
  const message = fizzBuzz(count);

  return (
    <FizzBuzzView count={count} message={message} plus1={plus1} clear={clear} />
  );
});

export default FizzBuzz;
```

今回作成したソースコードは[こちら](https://drive.google.com/uc?export=download&id=1IKsn8efi7inOjlaUZjlbS3kbi9qSmohq)。
次回はもうひとつ Custom Hook を作ります。
macOSでvagrant upしたらインターネットに出れなかった

# 背景
Windowsで使っていたVagrantfileをそのままMacに持ってきたら、VMの中からインターネットに出れず四苦八苦したこの感情を昇華させたい。


# 前提環境
* OS(物理PC): MacOSX(10.14.6)
* VirtualBox: 6.0.8
* Vagrant: 2.2.5

# 完成する環境
* CentOS(VM): 7.6 (実際に構築したときのversion。)

# Windowsから持ってきたVagrantfile
```:Vagrantfile
Vagrant.configure("2") do |config|
# Proxy
  config.proxy.http     = "http://proxy:port"
  config.proxy.https    = "http://proxy:port"
  config.proxy.no_proxy = "localhost,127.0.0.1"
# OS
  config.vm.box = "centos/7"
  config.vm.synced_folder ".", "/vagrant", type: "virtualbox"
  config.vm.network "private_network", ip: "192.168.250.250"
  config.ssh.insert_key = false
# Port forwarding
  config.vm.network "forwarded_port", guest: 3000, host: 3000
# Spec
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = "1"
  end
# Username
  config.ssh.username = "vagrant"
end
```

# 結論
これじゃ名前解決できなかった。
curlもyumもできない。
何度ふて寝したことか。

`vb.customize ["modifyvm", :id,"--natdnshostresolver1", "on"]`
をつけよう。

# 上記のVagrantfileのMacOS版
これでインターネットに出れました👏

```
Vagrant.configure("2") do |config|
# Proxy
  config.proxy.http     = "http://proxy:port"
  config.proxy.https    = "http://proxy:port"
  config.proxy.no_proxy = "localhost,127.0.0.1"
# OS
  config.vm.box = "centos/7"
  config.vm.synced_folder ".", "/vagrant", type: "virtualbox"
  config.vm.network "private_network", ip: "192.168.250.250"
  config.ssh.insert_key = false
# Port forwarding
  config.vm.network "forwarded_port", guest: 3000, host: 3000
# Spec
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = "1"
    vb.customize [
      "modifyvm", :id,
      "--natdnshostresolver1", "on",
    ]
  end
# Username
  config.ssh.username = "vagrant"
end
```

よいVMライフを！
GASをGitHubで簡単管理可能なChrome拡張機能　～導入時に躓いたこと～

# 概要

### 背景

GASのスクリプトエディタ画面にて簡単にGitHubでソースコードのバージョン管理が可能な、Chromeの拡張機能を導入したので、簡単な手順とちょっとだけ躓いた部分を備忘録として残しています。

(2020/11 追記)
久しぶりに新しいアカウントでGoogle Apps Script GitHub アシスタントの設定を行ったところ、
SCMの連携で`username` `password`での認証が何故か通らなかったので、`token`での設定方法を追記しました。

▼Chrome拡張機能
[Google Apps Script GitHub アシスタント](https://chrome.google.com/webstore/detail/google-apps-script-github/lfjcgcmkmjjlieihflfhjopckgpelofo)

### 「Google Apps Script GitHub アシスタント」とは

* Chromeの拡張機能
* GASのスクリプトエディタ画面上から簡単にGitHubのリポジトリに連携が行える
* GASのスクリプトエディタ画面上から簡単にPushやPullが簡単に行える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445229/98b42c47-a576-ef7a-76c6-444c2bbb540c.png)

# 導入手順

### 前提条件
* GitHubのアカウントを登録済みである事
* GASソースコード連携用のリポジトリを作成済み

### 手順
1. 「Google Apps Script GitHub アシスタント」のChrome拡張機能をインストールする
2. 連携したいGASのスクリプトエディタを開く
3. `Login SCM`ボタンを押下する
4. GitHubの`username` `password`を入力しGitHubと連携する  
※メールアドレスではなく、usernameの点に注意
5. 連携したい`Repository` `Branch`を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445229/bbb424c5-e3d4-77c3-12de-0a2b0523261f.png)
7. `↓(Pull)` `↑(Push)`でソースコードのバージョン管理を行う

#### ★`username` `password`で連携に失敗する場合 (2020/11 追記)
`password`の代わりに下記の手順でGitHubから`token`を取得して連携を行う

1. GitHubのアカウント設定画面から「Personal access token」を開く  
    [画面右上のアイコン]-[Settings]-[Developer settings]-[Personal access token]
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445229/146780dc-922e-1e6b-7196-30ee8735d4a7.png" width="400">
2. 「Generate new token」のボタンを押下する  
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445229/2bfe7c5a-d12e-4db6-ae68-d9c1830c6e08.png" width="400">
3. Noteには任意の名前を設定し、Select scopesにgistまでのチェックを全てONにする  
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445229/82bb3622-3120-f3ff-d97f-d67484540704.png" width="400">
4. 「Generate token」を押下後に、tokenが表示されているので取得しておく  
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445229/6273fcad-051e-fd31-005c-661e14b698aa.png" width="400">
    - ここから表示を切り替えるとtokenは表示されなくなってしまうので注意!!

### 注意点
*  `Login SCM`でのログイン時、GitHubのエンタープライズ版の場合では、エンタープライズ版用の画面に切り替えて連携する  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445229/cf30d1a8-cb6c-0200-21c4-91ee09fc2926.png)
*  GASのソースコードのファイル名が、関数名と一致していると`↓(Pull)` `↑(Push)`時に正常にファイルを認識してくれないようです  
(※経験則なので詳細な条件とは別にあるかもしれませんｍｍ)
* GitHubの連携後、エンタープライズ版などで参照可能リポジトリが大量にある場合、リポジトリの読み込みが完了するまで、拡張機能が利用できません(筆者の場合だと5分程度時間が掛かります)  

# 参考

[GASのコードをGithub管理するChrome拡張が便利](https://qiita.com/nkjzm/items/d384896d01ac3ff6f91c)
Google Colaboratoryでvimキーバインドが使えるようになった

* 右上のフラスコアイコンをクリックして新機能を試せるようにする

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156265/ba197278-a0a0-5a03-0b37-0203bc9fd23e.png)

* ツール＞設定＞エディタ＞エディタのキーバインド でvimを選択

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156265/22e86270-841d-294b-f5f9-d31c1cd568ff.png)
FizzBuzzボタンを作りながらReact Hooksを学ぶ 第5回

FizzBuzz ボタンを作りながら React Hooks を学んでいきます。
目次は[こちら](https://qiita.com/masarutan/items/9ff33b4a32042b34a815)。

# マウント、アンマウントされたときの処理を実装する

前回までで Hooks および関数コンポーネントを使う方法で、FizzBuzz ボタンを作りました。
前回の修正ではマウント、アンマウント時の処理を削除してしまいました。今回はそこを実装していきます。

マウント時の処理には Effect Hook を使います。
`useEffect` の第2引数に `[]` を指定することで、マウント時に第1引数の関数が実行されます。
また、アンマウント時には第1引数の戻り値の関数が実行されます。

```tsx:FizzBuzz.tsx（マウント、アンマウント時の処理）
  useEffect(() => {
    console.log('mount');
    return () => console.log('unmount');
  }, []);
```

全体ではこんな感じ。

```tsx:FizzBuzz.tsx
import React, { useState, useCallback, useEffect } from 'react';
import FizzBuzzView from './FizzBuzzView';
import { fizzBuzz } from './common';

type Props = {
  // props で count の初期値を受け取る
  initialCount: number;
};

const FizzBuzz: React.FC<Props> = React.memo((props: Props) => {
  const [count, setCount] = useState(props.initialCount);
  const plus1 = useCallback(() => setCount(count => count + 1), []);
  const clear = useCallback(() => setCount(props.initialCount), [
    props.initialCount,
  ]);
  useEffect(() => {
    console.log('mount');
    return () => console.log('unmount');
  }, []);
  const message = fizzBuzz(count);

  return (
    <FizzBuzzView count={count} message={message} plus1={plus1} clear={clear} />
  );
});

export default FizzBuzz;
```

ここまででひととおり React Hooks を使用した FizzBuzz ボタンは完成です。
今回作成したソースコードは[こちら](https://drive.google.com/uc?export=download&id=1w3V7uV7aHiQxjqMjcK0ZovrGsaLDLPNx)。
次回は Custom Hook を作ります。
文系学生のプログラミング学習11日目ーPython パンデジタル数判定ー

今日はPythonを使ってパンデジタル数の判定をするコードを書きました。
パンデジタル数とは、自然数の内 n 進法において0から n − 1 までの全ての数字を少なくとも1つ使って表される数のことです。(出典：Wikipedia)
今回は少し変更して、五桁なら１～５までの数字がすべて使われていたら真、使われていなかったら偽というようにしたいと思います。
例えば、
12345なら真、12234なら偽となります。

#Forループによるパンデジタル判定

```Python
def is_pandigital(num):
	num_list = split_into_digits(num)
	y = [x for x in range(1, len(num_list)+1)]
	true = 0
	for i in y:
		if i in num_list:
			true += 1
	if true == len(num_list):
		return(True)
	else:
		return(False)
```
リストyに３桁なら１～３、５桁なら１～５までの数字を入れます。
for文とif文ではリストyのそれぞれの要素がすべて、num_listに含まれているか確認し、含まれていれば変数trueに１足します。
最終的にtrueの値がnum_listのlengthと同じになっていれば真と判定します。
これでもしっかり判定されるのですが、コードが長く読みづらいので、先日学習したlistcomprehensionを使って書いてみました。

#List Comprehensionによるパンデジタル判定

```Python
def is_pandigital(num):
	num_list = split_into_digits(num)
	y = [x for x in range(1, len(num_list)+1)]
	return(all([i in num_list for i in y]))
```

たった４行で済みました。

```
[i in num_list for i in y]
```

この部分はリストyのそれぞれの値がnum_listに含まれていればTrue、含まれていなければFalseを返します。
True or Falseのリストが出来るので、それをall()で１つにするときちんと判定されます。

最近はコードをいかに短く分かりやすく書くかというのを少し意識しています。
List Comprehensionを使うと大幅にコードが短縮されるのでとても便利です。
FizzBuzzボタンを作りながらReact Hooksを学ぶ 第3回

FizzBuzz ボタンを作りながら React Hooks を学んでいきます。
目次は[こちら](https://qiita.com/masarutan/items/9ff33b4a32042b34a815)。

# App を改造して FizzBuzz ボタンの表示／非表示を切り替える

前回まででクラスコンポーネントを使う方法で、FizzBuzz ボタンを作りました。
しかしこのままでは `FizzBuzz` がずっと表示されており、

```tsx:FizzBuzz.tsx
  // アンマウントされたときの処理
  componentWillUnmount() {
    console.log('unmount');
  }
```

が呼ばれません。
今回は `App` を改造して、`FizzBuzz` の表示／非表示を切り替えられるようにして、アンマウントされたときの処理が動くようにします。
まだ、Hooks は出てきません。

`App` の state を使って表示／非表示を切り替えます。
`disable === false` のときは表示、`disable === true` のときは非表示としています。

hide ボタン、show ボタンを押すたびに、デバッグコンソールに `unmount`、`mount` が表示されます。

```tsx:App.tsx
import React from 'react';
import FizzBuzz from './FizzBuzz';

type Props = {};

type State = {
  disable: boolean;
};

class App extends React.PureComponent<Props, State> {
  constructor(props: {}) {
    super(props);
    this.state = {
      disable: false,
    };
  }

  hide = () => this.setState({ disable: true });

  show = () => this.setState({ disable: false });

  render() {
    const { disable } = this.state;
    const { hide, show } = this;

    return (
      <>
        {disable ? (
          <div>
            <button type="button" onClick={show}>
              show
            </button>
          </div>
        ) : (
          <div>
            <div>
              <button type="button" onClick={hide}>
                hide
              </button>
            </div>
            <FizzBuzz initialCount={0} />
          </div>
        )}
      </>
    );
  }
}

export default App;
```

今回作成したソースコードは[こちら](https://drive.google.com/uc?export=download&id=1y3sifE7SDYSvN-s0O_HogZm-_-OsVJiU)。
今回まででひととおり FizzBuzz ボタンが完成しました。次回は Hooks を使って書き換えていきます。
FizzBuzzボタンを作りながらReact Hooksを学ぶ 第2回


FizzBuzz ボタンを作りながら React Hooks を学んでいきます。
目次は[こちら](https://qiita.com/masarutan/items/9ff33b4a32042b34a815)。

# FizzBuzz ボタンを整理する

前回、クラスコンポーネントと state を使って FizzBuzz ボタンを作りました。
今回は前回作ったものを整理して、ファイルを分割します。

具体的には

1. `FizzBuzz` を状態管理部分と表示部分に分離してそれぞれ別ファイルに
2. 関数 `fizzBuzz` も別ファイルに

していきます。
まだ Hooks は出てきません。

`FizzBuzz` を別ファイルに切り出すので、`App.tsx` は以下のようにシンプルになります。

```tsx:App.tsx
import React from 'react';
import FizzBuzz from './FizzBuzz';

const App: React.FC = () => {
  return <FizzBuzz initialCount={0} />;
};

export default App;
```

`FizzBuzz.tsx` はこんな感じ。
表示部分を `FizzBuzzView` として、別ファイルに切り出しました。
また、メッセージの作成部分 `fizzBuzz` も別ファイルに切り出しました。

```FizzBuzz.tsx
import React from 'react';
import FizzBuzzView from './FizzBuzzView';
import { fizzBuzz } from './common';

type Props = {
  // props で count の初期値を受け取る
  initialCount: number;
};

type State = {
  // 状態として count を持つ
  count: number;
};

// クラスコンポーネントで FizzBuzz ボタンを作る
class FizzBuzz extends React.PureComponent<Props, State> {
  constructor(props: Props) {
    super(props);
    this.state = {
      count: props.initialCount,
    };
  }

  // マウントされたときの処理
  componentDidMount() {
    console.log('mount');
  }

  // アンマウントされたときの処理
  componentWillUnmount() {
    console.log('unmount');
  }

  // +1 ボタンを押すと count をインクリメントする
  plus1 = () => this.setState(({ count }) => ({ count: count + 1 }));

  // clear ボタンを押すと count をリセットする
  clear = () => {
    const { initialCount } = this.props;
    this.setState({ count: initialCount });
  };

  render() {
    console.log('render');
    const { count } = this.state;
    const { plus1, clear } = this;
    const message = fizzBuzz(count);

    return (
      <FizzBuzzView
        count={count}
        message={message}
        plus1={plus1}
        clear={clear}
      />
    );
  }
}

export default FizzBuzz;
```

FizzBuzz の表示部分です。
値（count）とメッセージ（message）、ボタンを押したときの処理（plus1, clear）を props で受け取ります。
state を使わないので、関数コンポーネントで実装します。

```tsx:FizzBuzzView.tsx
import React from 'react';

type Props = {
  count: number;
  message: string;
  plus1: () => void;
  clear: () => void;
};

const FizzBuzzView: React.FC<Props> = React.memo(
  ({ count, message, plus1, clear }: Props) => (
    <div>
      <div>{`${count} ${message}`}</div>
      <div>
        <button type="button" onClick={plus1}>
          +1
        </button>
        <button type="button" onClick={clear}>
          clear
        </button>
      </div>
    </div>
  )
);

export default FizzBuzzView;
```

`fizzBuzz` は React と無関係な純粋な関数ですので、ファイルの拡張子は `.tsx` ではなく `.ts` にしておきます。

```ts:common.ts
// count の値に応じて fizzBuzz メッセージを返す
export const fizzBuzz = (count: number) => {
  if (count === 0) {
    return '';
  }
  if (count % 3 === 0 && count % 5 === 0) {
    return 'FizzBuzz';
  }
  if (count % 3 === 0) {
    return 'Fizz';
  }
  if (count % 5 === 0) {
    return 'Buzz';
  }
  return '';
};
```

今回作成したソースコードは[こちら](https://drive.google.com/uc?export=download&id=1-j_dh2UoIL1o6aGzF_NSb9SCVGxveiFN)。
次回は FizzBuzz ボタンの動作をわかりやすくするために App を少し改造します。
[Ruby] private_class_methodの使い所

# private_class_methodについて
**private_class_method**は`publicなクラスメソッド`を`privateなクラスメソッド`に変更するメソッドです。

```ruby
class Example
  def self.public_foo
    puts 'public class method'
  end

  def self.private_bar
    puts 'private class method'
  end
  private_class_method :private_bar
end

Example.public_foo # => public class method
Example.private_bar # => private method `private_bar' called for Example:Class (NoMethodError)
```

ちなみに、privateアクセス修飾子を使ってクラスメソッドを定義すると普通にアクセスできてしまいます。

```ruby
class Example
  def self.public_foo
    puts 'public class method'
  end

  private

  def self.private_bar
    puts 'private class method'
  end
end

Example.public_foo# => 'public class method'
Example.private_bar # => 'private class method'
# 普通にprivate_class_methodにアクセスできてしまう
```

# 本題：使い所

private_class_methodは`親から継承したpublicなクラスメソッド`を`privateなクラスメソッド`に変更するに使うのに役立ちます。

例えば、Singletonモジュールでは取り扱うインスタンスを一つに制限するために、親のObjectクラスが持つインスタンス生成メソッド（new・allocate）を

```ruby
klass.private_class_method :new, :allocate
```

という形で`privateなクラスメソッド`に書き換えています。

Singletonモジュールの全体を見ると、`privateなクラスメソッドとなったnewメソッド`はinstanceメソッドという独自のインスタンス生成メソッドの中で利用されているのがわかります。
（クラスの外からインスタンス生成を行う役割をinstanceメソッドに一任しているということになります）

```ruby:singleton.rb
...

def klass.instance # :nodoc:
  return @singleton__instance__ if @singleton__instance__
  @singleton__mutex__.synchronize {
    return @singleton__instance__ if @singleton__instance__
    @singleton__instance__ = new()
  }
  @singleton__instance__
end

...

private

...

def included(klass)
  super
  klass.private_class_method :new, :allocate
  klass.extend SingletonClassMethods
  Singleton.__init__(klass)
end

...
```

参考：[ruby/singleton.rb at ruby_2_6 · ruby/ruby](https://github.com/ruby/ruby/blob/ruby_2_6/lib/singleton.rb)

このように、単純に親クラスのメソッドをオーバーライドするのではなく、親クラスのメソッドを利用して代わりのメソッドを定義する手法として役立ちます。
同時に、private化したクラスメソッド自体の完全性を保証しています。

# 番外編
private_class_methodを利用せずに、特異クラスを使うことでprivateなクラスメソッドを定義することもできます。

```ruby
class Example
  class << self
    def self.public_foo
      puts 'public class method'
    end

    private
  
    def private_bar
      puts 'private class method'
    end
  end
end

Example.public_foo # => public class method
Example.private_bar # => private method `private_bar' called for Example:Class (NoMethodError)
```
FizzBuzzボタンを作りながらReact Hooksを学ぶ 第1回

FizzBuzz ボタンを作りながら React Hooks を学んでいきます。
目次は[こちら](https://qiita.com/masarutan/items/9ff33b4a32042b34a815)。

# クラスコンポーネントで FizzBuzz ボタンを作る

ここで作成する FizzBuzz ボタンは
1. 「+1」を押すと、表示されている数値が1ずつ増加する。
2. 数値に応じてメッセージが変わる。3の倍数のときには「Fizz」と表示され、5の倍数のときには「Buzz」と表示される。
3. 「clear」ボタンを押すと数値が0に戻る。
というシンプルなものです。

表示する数値が変化しますので、これを状態として管理する必要があります。
まずは React Hooks を使わずに、従来の「クラスコンポーネント内の state で状態を管理する」方法で FizzBuzz ボタンを作ります。


```tsx:App.tsx
import React from 'react';

const App: React.FC = () => {
  return <FizzBuzz initialCount={0} />;
};

type Props = {
  // props で count の初期値を受け取る
  initialCount: number;
};

type State = {
  // 状態として count を持つ
  count: number;
};

// count の値に応じて fizzBuzz メッセージを返す
const fizzBuzz = (count: number) => {
  if (count === 0) {
    return '';
  }
  if (count % 3 === 0 && count % 5 === 0) {
    return 'FizzBuzz';
  }
  if (count % 3 === 0) {
    return 'Fizz';
  }
  if (count % 5 === 0) {
    return 'Buzz';
  }
  return '';
};

// クラスコンポーネントで FizzBuzz ボタンを作る
class FizzBuzz extends React.PureComponent<Props, State> {
  constructor(props: Props) {
    super(props);
    this.state = {
      count: props.initialCount,
    };
  }

  // マウントされたときの処理
  componentDidMount() {
    console.log('mount');
  }

  // アンマウントされたときの処理
  componentWillUnmount() {
    console.log('unmount');
  }

  // +1 ボタンを押すと count をインクリメントする
  plus1 = () => this.setState(({ count }) => ({ count: count + 1 }));

  // clear ボタンを押すと count をリセットする
  clear = () => {
    const { initialCount } = this.props;
    this.setState({ count: initialCount });
  };

  render() {
    console.log('render');
    const { count } = this.state;
    const { plus1, clear } = this;
    const message = fizzBuzz(count);

    return (
      <div>
        <div>{`${count} ${message}`}</div>
        <div>
          <button type="button" onClick={plus1}>
            +1
          </button>
          <button type="button" onClick={clear}>
            clear
          </button>
        </div>
      </div>
    );
  }
}

export default App;
```

今回作成したソースコードは[こちら](https://drive.google.com/uc?export=download&id=1Bj06NQwe4cUWLg_KAXqujMqX4XZEhZcV)。
次回は今回作成したコードを整理して、ファイルを分割します。
FizzBuzzボタンを作りながらReact Hooksを学ぶ 第0回

FizzBuzz ボタンを作りながら React Hooks を学んでいきます。
目次は[こちら](https://qiita.com/masarutan/items/9ff33b4a32042b34a815)。

と、その前に React の開発に必要な環境設定を行います。

# 環境設定 Mac 編

以下のツールをインストールした後で、React のアプリを作成するためのスクリプトをダウンロードします。

1. [Homebrew](https://brew.sh/index_ja)
1. [Node.js](https://nodejs.org/ja/)
1. [jq](https://stedolan.github.io/jq/)
1. [VS Code](https://code.visualstudio.com)


# ツールのインストール

Homebrew をインストールします。

```bash:Homebrewのインストール
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

[anyenv](https://anyenv.github.io) および [nodenv](https://github.com/nodenv/nodenv) 経由で Node.js をインストールします。

```bash:anyenvのインストール
$ brew install anyenv
$ anyenv init
$ cat << 'EOS' >> ~/.bash_profile
eval "$(anyenv init -)"
EOS
$ exec $SHELL -l
$ anyenv install --init
$ exec $SHELL -l
```

```bash:nodenvのインストール
$ anyenv install nodenv
$ exec $SHELL -l
```

```bash:Node.jsのインストール
# 12 系のうち、最新のものをインストール
$ node=$(nodenv install -list | grep ' 12' | tail -1)
$ echo ${node}
$ nodenv install ${node}
$ nodenv global ${node}
```

何かと便利なツール jq をインストールします。

```bash:jqのインストール
$ brew install jq
```

VS Code とその拡張機能（[Japanese Language Pack](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)、
[ESLint extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)）をインストールします。

```bash:VS_Codeのインストール
$ brew cask install visual-studio-code
$ code --install-extension MS-CEINTL.vscode-language-pack-ja
$ code --install-extension dbaeumer.vscode-eslint
```

# スクリプトのダウンロード

React のアプリは [Create React App](https://facebook.github.io/create-react-app/) を使って作るのが簡単ですが、さらにいくつかの設定をすると開発が楽になります。
Create React App 実行後に独自の設定を行うスクリプトを用意しましたので、ダウンロードしてください。

```bash:create-react-app-ts.shのダウンロード
$ curl -L 'https://drive.google.com/uc?export=download&id=1fvVpPCXM_lvGPQ-7dKxZn_RkWJT5vgiZ' > ~/create-react-app-ts.sh
$ chmod +x ~/create-react-app-ts.sh
```

create-react-app-ts.sh では Create React App を使って TypeScript 用の React アプリを作成した後で、以下の設定を行っています。

1. [eslint-config-airbnb](https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb)（Airbnb が作成したソースコード検証のルール）を設定する。
2. [Prettier](https://prettier.io/)（ソースコード整形ツール）を設定する。
3. VS Code でファイル保存時にソースコードの検証、整形が実行されるように設定する。

create-react-app-ts.sh は以下のように引数にアプリ名を指定して実行します。
実行すると指定したアプリ名のフォルダが作成されますので、そこに移動して `npm start` を実行すると、React が起動します。

```bash:Reactアプリの作成
$ ~/create-react-app-ts.sh fizz-buzz
...
```

```bash:Reactアプリの起動
$ cd fizz-buzz
$ npm start
```
FizzBuzzボタンを作りながらReact Hooksを学ぶ 目次

FizzBuzz ボタンを作りながら React Hooks を学んでいく連載の目次です。

第0回 [準備、環境設定](https://qiita.com/masarutan/items/23ecf22f15bbd1dc2702)
第1回 [クラスコンポーネントで FizzBuzz ボタンを作成する](https://qiita.com/masarutan/items/2921e9d5934039f282d3)
第2回 [FizzBuzz ボタンを整理する](https://qiita.com/masarutan/items/7e2c90cdffe4bad6b7d1)
第3回 [App を改造して FizzBuzz ボタンの表示／非表示を切り替える](https://qiita.com/masarutan/items/8361aa64e27186e7f435)
第4回 [Hooks を使って関数コンポーネントに書き換える](https://qiita.com/masarutan/items/566192ab139b2ec6cc40)
第5回 [マウント、アンマウントされたときの処理を実装する](https://qiita.com/masarutan/items/9ee7685f4584dbeac372)
第6回 [Custom Hook を作る](https://qiita.com/masarutan/items/a23c408e10bf5367434f)
第7回 もうひとつ Custom Hook を作る
php-master-changes 2019-08-02

今日はテストの修正、zendparse() のバッファオーバーフロー修正、MariaDB 10.0.2 以降のバージョン検出に失敗し mysqlnd が正常動作しない問題の修正があった！

# 2019-08-02
## nikic: Fix forwarding of extra args in opcache server tests
- https://github.com/php/php-src/commit/bf53d30fae5178f15915cbe09116a5556b6829ae
- [7.4~]
- ext/opcache で、テスト用のビルトインサーバの起動メソッド php_cli_server_start() に渡す設定引数の扱いを修正

## nikic: Fixed bug [#78363](https://bugs.php.net/bug.php?id=78363)
- https://github.com/php/php-src/commit/85e8ccd55e37028be6260c142c27689977564c9a
- [7.2~]
- zendparse() のバッファオーバーフローを修正
- valgrind で引っかからなかったけど asan で見つかったらしい

## nikic: Add test for bug [#78363](https://bugs.php.net/bug.php?id=78363)
- https://github.com/php/php-src/commit/d89157cd677a00dd02ab890b0af9dc40389514e2
- [7.3~]
- ↑の修正のテストケースを追加

## cmb69: Fix [#78179](https://bugs.php.net/bug.php?id=78179): MariaDB server version incorrectly detected
- https://github.com/php/php-src/commit/f9f4a68368406a2ba2bd9fab0494261090183e8e
- [7.2~]
- ext/mysqlnd で、MariaDB 10.0.2 以降ではバージョン検出に失敗し mysqli::begin_transaction() で "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required" のように警告が出たりする問題の修正
- [5.5.5-10.5.0 みたいなバージョン番号返してきてて](https://github.com/MariaDB/server/blob/826f9d4f7e99973cafe7654697d7c50b8b64b76b/include/mysql_com.h#L41)そいつが原因のもよう
検証用にOS X El Capitan環境を準備するのに手間がかかる

# macOS Mojaveに移行後に、OS X El Capitanの検証環境を作成

macOS Mojave を利用していて、El Capitanの動作環境を構築するのは以外に手間がかかる
*2019年に El Capitanの検証環境を構築する話*

手順

- OS X El Capitanのインストール
    - インストール用ファイルのダウンロード
- 開発環境の構築
    - Xcode及びCommand Line toolsのインストール

## OS X El Capitanをインストールするための準備
状況

- Mojaveにアップデート後App Storeには"Purchased"の項目がなくなり、以前のOSをダウンロードできなくなっている

<img width="1112" alt="Screen Shot 2019-08-03 at 10.39.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213053/459756bc-7bae-f2b5-e262-ee87e42f79e1.png">

- Apple Storeの OS X El Capitanへのリンク https://apps.apple.com/app/os-x-el-capitan/id1147835434?mt=12 でApp StoreのOS X El Capitanのページを表示は可能だけれど、`GET`をクリックしてもSystem PreferenceのSoftware Updateが起動して...ダウンロードは実行できない

<img width="1112" alt="Screen Shot 2019-08-03 at 11.01.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213053/c6972b3a-ae83-4075-48cf-1d35298e1fe3.png">

<img width="780" alt="Screen Shot 2019-08-03 at 11.04.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213053/9b154a01-fbd0-d16a-d748-e7f852a4ba5a.png">



対応

- App Storeが刷新される前の macOS High Sierraの App Storeを利用することで、"Purchased"の項目から OS X El Capitanのインストーラーをダウンロード

<img width="1025" alt="Screen Shot 2019-08-03 at 10.43.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213053/a9135607-b695-e0ae-344d-7f00d1c06156.png">

## OS X El Capitanをインストール

これまでの手順でダウンロードしたインストーラーを利用してOS X El Capitanをインストール

![Screen Shot 2019-08-03 at 11.57.08 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213053/3b9b4e11-3ee2-76b3-b854-6c77a068a97e.png)

##開発環境のインストール

コンパイラ等を導入するためにXcodeとその他のツールをインストール

ただOSのバージョンが古いのでApp Storeからは導入できない

![Screen Shot 2019-08-03 at 11.51.46 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213053/d2dc662e-cc0f-959b-6577-8a7bcdc75387.png)

OS X El Capitanに対応する最も新しいXcodeはVersion8.2.1となる

そこで以下のファイルをApple Developerのサイトからダウンロード

- Xcode Version 8.2.1
- Command Line Tools(macOS 10.11) for Xcode8.2

Xcode Version8.2.1, Command Line Tools(macOS 10.11) for Xcode8.2それぞれをインストール

![Screen Shot 2019-08-03 at 12.45.25 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213053/3b7e523f-0fb5-61ec-8257-3b23892fdc99.png)

上記で環境構築終了

今回はここまで:smile:
サクラエディタ：JavaScriptでマクロ実装（置換編）

#サクラエディタ：JavaScriptでマクロ実装（置換編）
##選択されている部分を置換します。
###下記サンプルコードは選択されている部分を【選択されていた文字を置換しました。】に置換するものになります。
```replace.js
function sakuraReplace(str00) {
 return str00.replace(/^.*$/,'【選択されていた文字を置換しました。】',6);
}

var str00 = Editor.GetSelectedString(0);
if ( str00 !== "" ) Editor.InsText(sakuraReplace(str00));
```
---
###使用しているサクラエディタマクロ関数の説明になります。
- function GetSelectedString(int1 :Integer):String
   - 選択部分全体を返します。未選択の時は空文字列を返します。
   - 改行コードなども含めて選択範囲の文字列をそのまま取得します。
   - 複数行の取得も可能です。

- function InsText(str1 :String);
   - str1の文字列をを貼り付けます。

- function replace(str1 :String,str2 :String,int3 :Integer)
   - str1:検索文字列
   - str2:置換文字列
   - int3:置換オプション
   - ここでは6を設定しています。以下の2と4を足した6を設定しています。
    - 0x002    英大文字と小文字を区別する
    - 0x004    正規表現

###サンプルコードを少し改造してみます。選択されている検索文字列が『あ』で始まる場合に限り選択されている部分を【選択されていた文字を置換しました。】に置換するものになります。
```replace.js
function sakuraReplace(str00) {
 return str00.replace(/^あ.*$/,'【選択されていた文字を置換しました。】',6);
}

var str00 = Editor.GetSelectedString(0);
if ( str00 !== "" ) Editor.InsText(sakuraReplace(str00));
```
###サンプルコードをさらに改造してみます。選択されている検索文字列が『あ』で始まり、『お』で終わる場合に限り選択されている部分を【選択されていた文字を置換しました。】に置換するものになります。
```replace.js
function sakuraReplace(str00) {
 return str00.replace(/^あ.*お$/,'【選択されていた文字を置換しました。】',6);
}

var str00 = Editor.GetSelectedString(0);
if ( str00 !== "" ) Editor.InsText(sakuraReplace(str00));
```
[Python]importしたモジュールの場所を調べる

# はじめに
Pythonのライブラリを作ってて、あれ？そういやよく使われてるライブラリってどんな風に作られてるんだっけ？ってことが気になった。
ということで、ライブラリの場所の調べ方をメモ代わりに残しておく。

# 方法
`inspect.getfile()`[^1]で調べられるらしい。例えばscikit-learnのSVCの場所を調べたいときは以下でOK。

```python
from sklearn.svm import SVC
import inspect

inspect.getfile(SVC)
```

結果は省略。

ちなみに、`print(hoge.__file__)`でも調べられるらしいのだけれども、`numpy`の場所は`print(hoge.__file__)`で調べられたが、使い方が間違えているのかどうかは定かではないが`print(SVC.__file__)`はうまくいかなかった。

# 参考資料

[^1]:[inspect --- 活動中のオブジェクトの情報を取得する](https://docs.python.org/ja/3/library/inspect.html)
画像を共有するのにGooglePhotoMarkdownerが最高だった件

元記事 : https://relativelayout.hatenablog.com/entry/2018/06/20/001722


Github : https://github.com/pokiiio/GooglePhotoMarkdowner

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97208/554c64f9-fc26-57cc-776c-525ec3e269bb.png)

使い方はGithubのReadmeにかいてあるので見てもらえればいいと思います！

気軽に画像を共有することができるのがいいですね！！
WinActorで指定の文字列をクリックする

# はじめに
WinActorで、文字を掴めないこと、ありますよね。
もしかしたら標準ライブラリに文字列を指定してクリックするライブラリがあるかもしれませんが、
探せなかったので作ってみることにします。


## 参考

<a href="https://ie-excel.com/excel-vba%E3%81%A7ie%E3%81%AE%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%EF%BC%88%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E6%96%87%E5%AD%97%E6%A4%9C%E7%B4%A2%EF%BC%89/" target="_blank" >Excel VBAでIEのリンクをクリック（テキスト文字検索） - ie-excel</a>

innerTextは、指定した要素オブジェクトの要素内のテキスト部分のHTMLコードを取得するプロパティです。

参考にさせていただきます。


# やってみる

## 1. 標準ライブラリを使う
**URLを指定してIE起動**を使用します。

スクリプトの最後に、

```vb:URLを指定してIE起動
～省略～
window.Navigate !URL!
```

とあります。
前回同様ですが、Windowという変数でIEウィンドウをキャッチしているようです。

このスクリプトを以下のスクリプトに置き換えします。

## 2.実際のコード

置き換え用スクリプト

```vb:指定の文字列をクリック
Dim moji
	For each moji In window.document.Links
		if instr(moji.innerText,!指定文字列!) Then
			moji.click
			exit for
		end if
	next
```

これに置き換えます。

このあと、WinActorのgui画面で「指定文字列」にクリックしたい文字列を
入れておくと、クリックします。




# その他

言い忘れましたが、IEの保護モードは解除する必要があるかもしれません。

<a href="https://www.atmarkit.co.jp/ait/articles/1405/16/news128.html" target="_blank" >Internet Explorerの保護モードとは？ (1/2)：Tech TIPS - ＠IT</a>
ethers.js で Ethereum アドレスをチェックサム付きアドレスに変換

ethers.js で Ethereum アドレスをチェックサム付きアドレスに変換するサンプルコードです。

```js
// ethers.js をインポート
const ethers = require('ethers')

let lowerCaseAddress = "0xfc12b50bd2d04d3754bfc1cfb6c303fb9eaca118"
let checksumAddress = ethers.utils.getAddress(lowerCaseAddress)
console.log(checksumAddress)
```

#Ref.
- https://scrapbox.io/a42/ethers.js_で_Ethereum_アドレスをチェックサム付きアドレスに変換
【Kotlin】null の場合にデフォルト値を返す

nullable な型の値が null だった場合にデフォルト値を返す、
というような拡張関数は標準ライブラリーにはないようでした。

ではどうするか。

```Kotlin:単純な場合
getValueOrNull() ?: getDefaultValue()
```

```Kotlin:△チェインする場合
(getValueOrNull() ?: getDefaultValue())
    .let { ... }
```

```Kotlin:○チェインする場合
getValueOrNull().let { it ?: getDefaultValue() }
    .let { ... }
```

```Kotlin:拡張関数を自作する場合
inline fun <T> T?.onNull(block: () -> T): T = this ?: block()

getValueOrNull().onNull { getDefaultValue() }
```

／以上
Coderを用いてクロスプラットフォームなプレーンテキストメモサーバを立てる

業務で作業内容のメモを取ることが多く、また複数の端末からメモを編集したいため、ネットワーク上にメモサーバが欲しい
社内規定的に外部クラウドツールの利用は手続きが面倒くさいし、社内ツールに要望を満たせるものはあるもののリッチテキスト形式のためフォーマットや装飾の整理が面倒くさい
エンジニアなら黙ってプレーンテキストかつマークダウンだと思うので、VSCodeのブラウザ版の「Coder」を用いてプレーンテキストメモサーバを立てる方法を紹介する

# 想定する読者
- Dockerを使ったことがある
- VSCodeを愛用している

# 手順

任意の場所にフォルダを作成する
※この中にメモファイル群が蓄積される

```shell
mkdir -p /Users/user/works/coder
```

先ほどのフォルダをマウントしてDockerコンテナを起動する
※`restart=always`オプションを入れておくと、ホストが再起動した後もDockerが起動している限りはコンテナが稼働し続ける

```shell
PROJECT_DIR=/Users/user/works/coder
docker run -p 8080:8080 -d -v "${PROJECT_DIR}:/home/coder/project" --restart=always codercom/code-server --auth none
```

http://${ホストIP}:8080 にアクセスすれば、以下のようなVSCodeの見慣れた画面がブラウザ上に現れる
![coder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/2c21df7a-8cfa-90cc-f640-7f5a073187aa.png)

この状態で、*.mdファイルとしてメモを作成していけば、クロスプラットフォームなプレーンテキストメモサーバの完成である

# 補足
- マウントしているフォルダをバックアップしておけば、Coderサーバは復元できる
- Coderでは日本語化拡張機能は利用できない（2019年12月27日現在）ので、英語のまま利用する必要がある
- 社内のLANで手軽に使うことを想定しているため、ログイン機能等を無効化しており、この状態で外部公開サーバにするのは危険である
WinActorでjavaScriptを実行する

# はじめに

2つ目の投稿です。

WinActorを使っていると、リンクを認識してくれないこと、ないでしょうか。
何度やってもうまく行かない、さらにそのリンクがjavaScriptなとき、javaScriptをWinActor側からキックできないだろうか、と思い立ちました。

## 参考
javaScriptを実行する方法は、先人の知恵がたくさんありますので、利用させていただきます。

-  <a href="https://ken3memo.hatenablog.com/entry/20110626/1309072974" target="_blank" >蛇足 脱線 横道 VBScript IE操作 で javaScriptを実行 Document.Script.setTimeoutをテスト - 三流君 ken3のmemo置き場</a>
-  <a href="https://rabbitfoot.xyz/vba-settimeout/" target="_blank" >商品画像登録用のファイル選択ダイアログはsetTimeoutを使って動かす</a>


Script.setTimeout を使うことでjavaScriptを実行することができる、ということです。


# やってみる

## 1. 標準ライブラリを使う
**URLを指定してIE起動**を使用します。

スクリプトの最後に、

```vb:URLを指定してIE起動
～省略～
window.Navigate !URL!
```

とあります。
前回同様ですが、Windowという変数でIEウィンドウをキャッチしているようです。

このスクリプトを以下のスクリプトに置き換えします。

## 2.実際のコード

置き換え用スクリプト

```vb:WinActorでjavaScriptを実行する
window.Document.Script.setTimeout !javascript!, 200
```

これに置き換えます。

画面上で、「javascript」に実行したいスクリプトを入れることで完成です。

ためしに

```js
javascript:alert('test')
```

と入れてみてください。

testとアラートが出るはずです。



# その他

言い忘れましたが、IEの保護モードは解除する必要があるかもしれません。

<a href="https://www.atmarkit.co.jp/ait/articles/1405/16/news128.html" target="_blank" >Internet Explorerの保護モードとは？ (1/2)：Tech TIPS - ＠IT</a>

また、<a href="https://qiita.com/tie1120/items/d7916f26db8c421200c8" target="_blank" >ブラウザで自動実行できるテストツールを作ってみた - Qiita</a>をみると、

```vb
 ie.navigate( "javascript:formSubmit(1);");
```

とあり、もしかしたらnavigateでもキックできるのかもしれませんね。
試していないのでわかりません。
トークルームの会話を感情分析する LINE WORKS Bot

トークルーム内の発言を Azure Cognitive Services の Text Analytics で感情分析しスコアを記録する Bot です。

単なる記録用途の Bot は愛想がなさすぎるので、会話の雰囲気にあったスタンプを送るようにもしてみます。


感情分析は Microsoft Azure Cognitive Service の Text Analytics を使います。
https://azure.microsoft.com/ja-jp/services/cognitive-services/text-analytics/

メッセージの受信と送信には LINE WORKS の トーク Bot API を利用します。

TITLE: メッセージ送信 (text)
URL: https://developers.worksmobile.com/jp/document/100500801?lang=ja

TITLE: メッセージ受信 - Callback 形式
URL: https://developers.worksmobile.com/jp/document/1005009?lang=ja

一連の処理は Microsoft Flow で、ほぼコーディングなしで行います。

##Microsoft Flow のフロー作成

トリガーに "HTTP 要求の受信時" を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/bdf9e462-8e3c-ca77-fabf-4f072c4b5560.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/9acbb3e8-9775-0fc2-2870-241088b1487e.png)

要求本文の JSON スキーマを "サンプルのペイロードを使用してスキーマを生成する" で生成します。
ペイロードのサンプルは、こちらのページの記載を用います。

TITLE: メッセージ受信 - Callback 形式
URL: https://developers.worksmobile.com/jp/document/1005009?lang=ja

TITLE: メッセージ受信 - Callback 形式 (message)
URL: https://developers.worksmobile.com/jp/document/100500901?lang=ja

-> Request Example - type "text" の箇所

```
{
  "type": "message",
  "source": {
    "accountId": "admin@example.com",
    "roomId": "12345"
  },
  "createdTime": 1470902041851,
  "content": {
    "type": "text",
    "text": "hello"
  }
}
```
次に Azure Cognitive Services の Text Analytics で感情分析するため、"テキスト分析" の "感情の検出" をアクションに指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/dced0fc9-d5ba-9a7b-619d-7ab954a13e00.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/062140a9-1433-867e-900d-0c5fe5519d01.png)

Webhook で受信したテキストを感情検出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/5816985d-0006-4e5f-efbb-4ead477784a5.png)

分析結果は OneDrive for Business の Excel Book に記録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/64cd2e7d-18b7-97b8-9077-34e04bb604fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/85458e40-68a1-751a-d5d9-cce8d3c0f136.png)

スコアは 0 から 1 の数値で表されます。0.7 を超えると肯定的、0.3 を下回ると否定的。

スコアが一定の値を上回ると Bot からスタンプやメッセージが送信されるように条件とアクションを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/8c0d026a-0755-7f94-ba57-3277b51e9b9e.png)

##動作確認
トークルームに Bot を招待し、メンバーの発言が感情分析されること、肯定的な発言でスタンプの送信などが行われることを確認します。
WinActor で画像マッチングを使わずに画像をクリックする 

# はじめに
WinActorの画像マッチング、失敗することがありますよね。
画像マッチングを使わず、画像のURLを指定して、クリックさせれないだろうか（本当に画像限定ですが）
試してみました。

ちなみに、私はプログラミングの素養がありません。これから勉強します。


# 画像をクリックするには
参考にさせていただきました。

- <a href="http://blog.livedoor.jp/newresting-program/archives/38354490.html" target="_blank" >Excel VBA IE(Web)にある画像のボタンをクリックする方法 : 紙様のメモ帳</a>
- <a href="https://tonari-it.com/vba-ie-image-alt-src/" target="_blank" >【エクセルVBAでIE操作】alt属性・src属性を利用して画像ボタンをクリックする</a>


画像urlが一致する場合に、クリックするというスクリプトです。


## WinActor標準ライブラリを使う

**URLを指定してIE起動**　を使います。

スクリプトの、最後に

```vb:URLを指定してIE起動
~省略~
window.Navigate !URL!
```

とあります。

よく、IE自動化等でググるとでてくる変数 objIE が、WinActorのライブラリでは windowで宣言されている
ことがわかります。

## 標準ライブラリを置き換える

このスクリプトを、


```vb:画像クリック
For n = 0 To window.Document.images.Length - 1
     Set objIMG = window.Document.images(n)
     If InStr(objIMG.src, !imgUrl!) > 0 Then
     objIMG.Click
 Exit For
 End If
 Next
````

に置き換えます。


あとは、画面上で「imgUrl」に画像URLをいれれば完成です。

## その他

ちなみに、画像URLは完全一致ですのでフルパスで記載のこと。

Like　を使えば部分一致できるんでしょうか？
試していないのでわかりません。すいません。

### 追記
言い忘れましたが、IEの保護モードは解除する必要があるかもしれません。

<a href="https://www.atmarkit.co.jp/ait/articles/1405/16/news128.html" target="_blank" >Internet Explorerの保護モードとは？ (1/2)：Tech TIPS - ＠IT</a>
内部クラスの使用例


# 内部クラスってどういう時に使うの？
あるクラスのインスタンスやメソッドに関連があることを明確にしたい時に使う。
内部クラスで定義してるものが、単体で必要なケースがある場合それは内部クラスじゃなくトップレベルで定義した方がいい。


## 使用例①

**外部クラスと一緒に使うと有用なヘルパークラスとしての使用。**

たとえば、四則演算を行える電卓クラスを定義してみる。
電卓クラスが、サポートしている計算操作を内部クラスのenumで定義している例が下記です。

```java:内部クラスの例
public class Calculator {
  public enum Operation {
    PLUS      { public int apply(int x, int y) { return x + y; } },
    MINUS     { public int apply(int x, int y) { return x - y; } },
    MULTIPLY  { public int apply(int x, int y) { return x * y; } },
    DIVIDE    { public int apply(int x, int y) { return x / y; } };
    public abstract int apply(int x, int y);
  }
  public int calc(Operation operation, int x, int y) {
    return operation.apply(x, y);
  }
}
```

```java:内部クラスの例_使用例
public class Main {
  public static void main(String[] args) {
    Calculator calculator = new Calculator();
    int result = calculator.calc(Calculator.Operation.PLUS, 2, 3);
    System.out.println(result);
    //=> 5
  }
}
```




## 使用例②
**外部クラスに関連するクラスを定義したい場合**
#### Javaの標準ライブラリでの内部クラス使用箇所
■ java.util.ArrayListに関連するIteratorを定義
![ 2019-08-03 11.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136617/f9101352-5085-287a-767a-562a0790d41e.png)
■ java.util.LinkedListに関連するIteratorを定義
![ 2019-08-03 11.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136617/269e4925-d034-5501-dce5-b191ca93a4ce.png)
■ java.util.HashMapに関連するHashIterator
![ 2019-08-03 11.13.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136617/d9337135-d1c1-e1a3-f1d3-159ed3589827.png)

ArrayListのIteratorや、HashMapのIterator等、そのクラスに関連する定義したい場合に内部クラスを使ってるみたい。
Nordic Nrf528xxを使ってみよう　Lチカをしよう nrf52832 Segger Embedded Studio編 

Nrf528xxを使ってみよう　nrf52840 nrf52832 Embedded StudioStudio準備編の続きです。

ダウンロードしたファイルを解凍し、以下ファイルをクリックします。
今回は、Nrf52832を使用したSMKのEVAB-BT504-01(A)を使用してみます。

![EVAB-BT504-01-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c95d2621-919c-7121-01e8-d1748ce7718b.jpeg)

太陽誘電のものを使う予定でしたが、ボタンとスイッチを増設したりする必要等無いのでこちらを使用しました。
nrf5x-DKボードをご使用でしたら特に変更なく使用可能と思われます。

SeggerのJ-Linkとリボンケーブルで接続します。
J-LINK EDU MINIという名称でDigikeyで2,354円（2019年8月2日現在）
マルチでも2600円以下です。
中華のJ-Linkのコピー品は、2.54ピッチのものですので、余裕があればこちらをお勧めします。
![EVAB-BT504-01-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/cfbb1ecd-0b5f-4d1b-1b6f-1654d17504c1.jpeg)

なお、電源が供給されないので、USBは、ボードとJ-LINKにそれぞれ接続する必要があります。
（当初、私は接続し忘れてしまいました・・・）

それでは、ダウンロードしたファイルを開いていきます。
パス：\nRF5SDK153059ac345\nRF5_SDK_15.3.0_59ac345\examples\peripheral\blinky\pca10040\s132\ses\blinky_pca10040_s132.emProject

*nrf52840の場合は、s132がs140になります。

フォルダのつくりは以下のようです。
nRF5_SDK_15.3.0_59ac345：SDKのバージョン

peripheral：ボード単体用のフォルダ
ble_peripheral：BLE用のフォルダ

PCA10040：nrf52832
PCA10056：nrf52840

S132：nrf52832のSoftDeviceバージョン
S140：nrf52840のSoftDeviceバージョン

ses：SeggerEmbedded Studio

blinky_pca10040_s132.emProjectをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/7b5e689f-5f26-0359-03b1-eb2a7baf3c88.png)

Segger　mbedded Studioが立ち上がります。
Continueをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6e879206-af69-de58-226d-b8ec138a205f.png)

Applicationのmain.cを開けてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1a5495d3-9089-8ef7-3a55-4ca967a39677.png)

 for (int i = 0; i < LEDS_NUMBER; i++)
となっています。
LEDSはpca10040.hに記述されています。

パス：\nRF5SDK153059ac345\nRF5_SDK_15.3.0_59ac345\components\boards\pca10040.h

LEDは

```
#define LED_1          17
#define LED_2          18
#define LED_3          19
#define LED_4          20
```

と記述されているのがわかると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8fe77a85-5c21-2786-8cca-d543d051b084.png)

それでは、書き込んでみましょう。
Build⇒Build　and　Debugをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a99be2c4-7077-b3b8-73d5-796799ea4100.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a87a57ad-8203-0cb0-1f10-14751295e13c.png)

▶を押しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/03b365d3-a96f-44ce-6b54-76fa488210e6.png)

LEDがLED１から順についていくと思います。
これでLチカは終了です。
Unable to resolve path to module

## 症状

"Unable to resolve path to module"というeslintエラーが発生する。

## 原因

importする際、パスは絶対パスを使ってくれということだが、buildする時には特に問題にならない。

## 対応

* eslint-import-resolver-webpackをインストール

  ```sh
  npm install --save-dev eslint-import-resolver-webpack
  ```

* .eslintrc.jsonに下記の設定を追加

  ```sh
  {
  "settings": {
      "import/resolver": "webpack"
    }
  }
  ```

別にこれはeslintのチェックからoffした方がもっとシンプルで良さそうな気がする。

* .eslintrc.jsonのrulesに下記の設定を追加

  ```sh
  "import/no-unresolved": "off"
  ```

## 参考

* https://schiughi.hatenablog.com/entry/2018/05/08/Webpack%E3%81%A7%E7%B5%B6%E5%AF%BE%E3%83%91%E3%82%B9%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B
* https://github.com/kriasoft/react-starter-kit/issues/1180#issuecomment-287539233
Markdown Preview Enhanced で 図 の プレビュー がうまくいかない 時の 対処法

# 目的
- VisualStudioCodeにてmermaidをコーディングしてMarkdown Preview Enhancedでプレビューすると図の色がうまく出ず、出力しても色がうまく出ないときの解決方法をまとめる。

### 本記事は[tyke](https://qiita.com/tyKeP)さんの[MPE(MarkdownPreviewEnhanced)でmermaidのグラフが真っ黒になる問題](https://qiita.com/tyKeP/items/63fd83466399d212d2e4)の情報をもとに作成しています。 
  
tykeさん記事にしていただき本当にありがとうございます。お礼申し上げます。

# この記事のターゲット
- mermaidで図を作ったが、Markdown Preview Enhancedでのプレビューで色がおかしく(下記画像)なってしまった方
  ![MPE_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/65564603-c22b-a19c-4edd-26aaefbe0e6d.png)

# 解決方法
- Markdown Preview Enhancedはインストールしてそのままだと一部の図の色合いがおかしくなる。
- プラグインの設定を修正してあげると正常に表示できる。

1. プラグインバーを開く(赤矢印部分をクリック)
    ![vscode_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/174fc96a-44d9-5a5d-7125-268f56dc9223.png)

1. Markdown Preview Enhancedの欄を探し、歯車マークをクリック
    ![MPE_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/621190ad-e6db-7a81-67fd-54bcd7314e6b.png)

1. 「拡張機能の設定を構成します。」をクリック
    ![MPE_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/112c2015-ddf4-52aa-93c1-00744f1b1c05.png)

1. Markdown Preview Enhancedの設定が表示されたらスクロールして「Markdown-preview-enhanced:Mermaid Theme」の設定を見つける
    ![MPE_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/dc8c1f91-a66c-8fcf-398f-977e28ae3907.png)

1. プルダウンメニューからdefault以外をお好みで選択する。
    ![MPE_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/74f79d58-97c8-bde6-dcf6-9ba00a915ac5.png)
    ![MPE_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a315720f-a1c5-870e-6c5f-1c83c5cde585.png)

1. mermaidのコードを再度プレビューして正常に表示されていることを確認する。
    ![MPE_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6464af1d-a661-b4b5-afcb-5409e1bc596a.png)

# まとめ
- Markdown Preview Enhancedでmermaidを正常に表示させることができた。
【ロシアW杯】ロストフの14秒をUnityで再現

[【記事一覧】ロシアW杯『ロストフの14秒』解析](https://qiita.com/gshirato/items/0eb0119ca1c8ac539ccb)より

# 目的
Unityであの14秒の再現シーンを作成し、位置情報を取得する。

# 方法
1. W杯の映像から目視で(!)約1秒毎の選手・ボールの位置情報を登録。だいたい1時間くらいかかる。
2. 登録した位置情報を線形補間。移動させながらフレームごとの位置情報を記録、CSV化

# 実装
略(Github参照)

# 結果
![remember_rostov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186209/7e82e3a9-fb2c-a49c-21b1-04ced59ed8ab.gif)

# まだ粗い
- スケールしない(特にデータ取得方法)

# Github - [Remember Rostov](https://github.com/gshirato/RememberRostov)

- `Assets/Scripts`に実装コード
- `Resources`にjson, csvファイル
【記事一覧】ロシアW杯『ロストフの14秒』解析

# ロストフの14秒とは
- [ＢＳ１スペシャル「ロストフの死闘　日本ｖｓ．ベルギー　知られざる物語」]
(https://www.nhk.or.jp/docudocu/program/2443/3115505/index.html)

# remember rostovとは
- [ロストフを忘れない ](https://note.mu/stat_ketm/n/nc05324aae77a)

# 記事一覧

|#|Title|Date|
|:--:|:---:|:--:|
|1|[【ロシアW杯】ロストフの14秒をUnityで再現](https://qiita.com/gshirato/items/c7912beab7bec6b5df4c)|Aug 02 2019|