OmniAICreator/Qiita-1.07M huggingface dataset:
素人が迷い込んだ補数と基数と減基数の世界

# 0. はじめに
　コンピュータについての本を読んでいたとき、「コンピュータは２の補数を使って負数を表現し、負数の加算によって減算を行う」と書いてあった。コンピュータについて知識が薄い自分からすると、「減算すればいいのでは？補数なんていらないのでは？」といった感じであった。

　これを理解するには、n進法の性質とコンピュータの仕組みについて知る必要があった。今回はそれをまとめる。

# 1. 語句の確認
### 1.1 基数とは
　数値の表現方法で、位取りを行う数字のこと。2進数では2、10進数では10、n進数ではnが基数になる。底ともいう。

### 1.2 補数とは
　Wikipediaによる説明では、

>補数（ほすう;complement）とは、ある基数法において、ある自然数 a に足したとき桁が1つ上がる（桁が1つ増える）数のうち最も小さい数をいう。
https://ja.wikipedia.org/wiki/%E8%A3%9C%E6%95%B0

と、ある。

馴染みのある10進法で具体的に見てみよう。  

- $4 + 6 = 10$
- $4 + 11 = 11$
- $4 + 96 = 100$

4に6や11や96を足しても桁は増えるが、その最小の数は6なので、10進法においては「4の補数は6」となる。同様に、「１4の補数は86」、「114の補数は886」となる。

 - $ 4 + 6 = 10 $
 - $ 14 + 86 = 100 $
 - $ 144 + 886 = 1000 $

つまり補数とは、ある数の桁をあげるのを「補」ってあげる数だ。

### 1.3 減基数とは
　またまたWikipediaによる定義では、
>b 進法において、自然数 a を表現するのに必要な最小の桁数を n としたとき、
・ $b^{n}-a$ を      「b 進法における a に対する基数の補数（b の補数）」
・ $b^{n}-a-1$ を「b 進法における a に対する減基数の補数（b - 1 の補数）」
という。

とある。「減基数の補数」という表現で使われるらしい（減基数それ自体の言葉の定義を調べたが出てこなかった汗）。

　ここにあるように「減基数の補数」とは、あと１で桁が上がる直前の数だ。補数の定義との兼ね合いで言えば、「足したときに桁が上がらない数のうち最大の数」と言える。10進法において、4の減基数の補数は5、14の減基数の補数は85、１４４の減基数の補数は885、となる。減基数の補数を足すと、$基数-1$(今回は$10 - 1 = 9$)の数が各桁に並ぶことになる。

 - $ 4 + 5 = 9 $
 - $ 14 + 85 = 99 $
 - $ 144 + 885 = 999 $

　減基数の補数とは 、桁が上がるには少し「元気」が足りない数のことだ。

　以上、１０進数の世界における補数等の振る舞いを見てきた。次は２進数の世界における振る舞いを見ていこう。

# 2. ２進数の世界
　2進数における減基数の補数から求めよう。減基数の補数は桁が上がる直前の数だった。つまり、$11111.....11$のように$1$が連続して並ぶようなものだ。

　$11001$を具体例として考えよう。これの減基数の補数は、$00110$だ。確かに両者を足すと$11111$となる。これの求め方は、$11001$の$1$を$0$に、$0$を$1$にひっくり返してあげればいい。

　減基数の補数に$+1$してあげたものが補数となるので、$11001$の補数は、$00110$に$+1$をした$00111$となる。確かに$11001+00111 = 100000$となって桁が上がっている。
 
# 3. 補数を使った減算表現
　準備が長かったが、これから「加算による減算」を見ていく。具体例として$253 - 121 = 132$(10進数)を使おう。

　さっそくではあるが、「加算による減算」の表現を見てみよう。まず、$121$の補数である$879$を$253$に足すと、$253 + 879 = 1132$となる。下三桁の$132$の値は、$253 - 121 = 132$の結果と合致する。これは、$253 + (1000 - 121) = 1000 + 132$と変形してみると分かりやすいかもしれない。

- $253 - 121 = 132$
- $253 + 879 = 1132$
- $253 + (1000 - 121) = 1000 + 132$

　次に２進数で見てみよう。$1110 - 0011 = 1011$を使う。$0011$の補数は$1101$。よって、$1110 + 1101 = 11011$となり、下四桁の$1011$は確かに合致している。同様に変形して見てみよう。

- $1110 - 0011 = 1011$
- $1110 + 1101 = 11011$
- $1110 + (10000 - 0011) = 10000 + 1011$

　これが「加算による減算」の表現だ。補数の性質をうまく使っている。実際には$1011 ≠ 11011$なので、減算と全く一緒というわけではない。しかし、これにコンピュータの仕組みを組み合わせるとうまく減算を表現できる。

# 4. コンピュータの仕組み  
　以下のコンピュータの仕組みを使う。

- コンピュータの演算機能は加算機能のみであること
- 演算機能は限られたビット範囲の中で行われること
- 加算によって溢れた桁は捨てられること

　これらを使うと、「加算による減算」がうまくいく。上記と同じ例を使う。

- $1110 - 0011 = 1011$
- $1110 + 1101 = 11011$
- $1110 + (10000 - 0011) = 10000 + 1011$

ビット範囲が$4$ビットと限られていた場合、溢れた$5$ビット目は捨てられるので、$1110 + 1101 = 1011$がコンピュータ上では成り立つ。以上から、加算によって減算を表現できた。

# 5. おわり
　初めの疑問を出発点にして調べていくと、n進法の性質とコンピュータの仕組みがうまく組み合わされていていることを知ってとても感動した。コンピュータに加算器しかないことに対して減算器もつければいいのにと思ってしまったが、無駄をはぶいてシンプルでいるからこそここまでコンピュータは進化したんだろうと思わされた。

# 6. 参考文献
『プログラムはなぜ動くのか　第２版　知っておきたいプログラムの基礎知識』
ロジックサマナーの「圧縮」という問題

####[ロジックサマナー](https://paiza.jp/logic_summoner/)というゲーム風プログラミング学習サイトがある。



今日は暇だったので、こちらのサイトで遊んでいたのだけど、
思ったより難しくて困ってしまった。

[問題のページ]
(https://paiza.jp/logic_summoner/challenges/logics_type_2001)


要約すると。

b開始パターン
-
>入力:"bbbbbwww"
出力:5 3

各文字ごとに文字数を半角スペース区切りで返す。最後は改行。
w開始パターン
-
>入力:"wwwbbbbb"
出力:0 3 5

各文字ごとに文字数を半角スペース区切りで返すのは一緒。
頭に0を付けるが異なる点。
頭の0の意味は"b"が0個であるから。





```python:compression.py

input_line = input()

#判定文字列
judgment_str=str

#出力用配列
output_array=[0]

#判定文字列が異なる場合、出力配列に要素追加
for i in input_line:
    if judgment_str!=i:
        output_array.append(0)
    output_array[-1]=output_array[-1]+1
    
    #今回の処理に用いた文字列を判定文字列に格納
    judgment_str=i

#出力用文字列
output_str=""

#最終ループ以外は要素の値+" "、最終ループは要素の値+改行
for j in range(len(output_array)):
    if j+1!=len(output_array):
        output_str=output_str+str(output_array[j])+" "
    else:
        output_str=output_str+str(output_array[j])+"\n"
print(output_str)

```




僕のようなpython初心者にはわりと難しい課題でした。
もっとイイ解き方あったら教えてください……。
gccで静的リンクと動的リンクを混在させたい

# 結論
下記のように書く。
`g++ main.o -Wl,-Bstatic -lAAA -lBBB -Wl,Bdynamic -lXXX -lYYY`

結果、次のように静的リンクと動的リンクを混在させられる

- 静的リンク：libAAA, libBBB
- 動的リンク：libXXX, libYYY

# gcc の -Wl オプションについて
-Wlはリンカへのオプションをカンマ区切りで書くとのこと。
以下 man gcc から抜粋
```
-Wl,option
Pass option as an option to the linker.  If option contains commas, it is split into multiple options at the commas.  You can use this syntax to pass an argument to the option.
For example, -Wl,-Map,output.map passes -Map output.map to the linker.  When using the GNU linker, you can also get the same effect with -Wl,-Map=output.map.
```
Symfony4+api-platformでデータ保存時の挙動をカスタマイズする

# What is Symfony api-platform?

rest apiをSymfony4で超簡単に実装できるバンドルです。
https://api-platform.com

※ インストール方法や基本的な使い方は既存の記事があるのでそちらを見てください。
https://qiita.com/ippey_s/items/9cceec252babe8057047
https://qiita.com/tsubo/items/2cad91228b29f6f77317

# Customize actions on data persist

単にデータの読み書きするだけなら、デフォルト設定のまま `@ApiResource` つきのエンティティを増やすだけで使えちゃうのですが、POSTされたデータをエンティティにマップしてDBに保存するだけではない、カスタムの挙動を入れたいときってあると思います。
たとえばデータ保存と同時にメール送信とかSlack投稿とか。

そういう場合にどういう実装をすればいいか調べた＆実験してみました。

## Create your own DataPersister

`DataPersisterInterface` を実装したカスタムクラスを作るだけです。

- `supports($data)` でカスタムの保存処理を行いたい対象をサポートさせる
- `persist($data)` に実際の保存処理を書く
- `remove($data)` に実際の削除処理を書く

サンプルはこちら https://github.com/77web/api-platform-playground/blob/a1afe552bef5e28bbfa96a6d7b29be4adc3e4725/src/Persister/BookPersister.php
※ 単なるサンプルなのでTimestampableExtensionでできそうなことしかやってませんが、実際はここでいろいろな処理を足すことができます。

## Define your DataPersister as Symfony service with `api_platform.data_persister` tag

自作のDataPersisterを `api_platform.data_persister` タグをつけてサービスとして定義します。

サンプルはこちら https://github.com/77web/api-platform-playground/blob/a1afe552bef5e28bbfa96a6d7b29be4adc3e4725/config/services.yaml#L29-L34

この状態で書き込みAPIを呼び出すと、単にDBにデータを保存するのみならず、カスタム処理を実行させることができます。

# How does this work?

（ここからは余談です。）

`api_platform.data_persister` タグをつけると、自作のDataPersisterがdata_persisterとして認識され、ChainDataPersisterクラスにセットされます。
※ 参考 SymfonyのDIコンテナでタグがどのように使われるかは [Symfonyで同種のクラスを大量に使うときDIで楽するテクニック（自作タグのススメ）](https://tech.quartetcom.co.jp/2018/12/13/symfony-di-use-custom-tags/) に書いておきました

保存時に実際にどのDataPersisterを使うかは [ChainDataPersisterクラス](https://github.com/api-platform/core/blob/master/src/DataPersister/ChainDataPersister.php) によりストラテジーパターンを使って決定されています。

単にapi-platformを使うだけでなく、仕組みにも興味のある方は見てみてください（条件分岐禁止！） :smile:

※ ちなみにどういうわけか公式のドキュメントにカスタムのDataPersister利用について記載が見当たらなかったのでソースコードを読んでアタリをつけて実験で確認しました :sweat_drops:
__memo_Network Environment Configuration


1. [Domain name取得](#domain-name取得)

1. [Domain Name System (DNS) settings](#domain-name-system-dns-settings)
    デプロイしたサーバのIPと取得したDomain nameをDNSサーバへ登録する。

1. [SSL setting](#ssl-setting)
https通信のためSSL認証設定する。
Nginxの設定をhttps向けに修正
FWのルールを変更する。
   

# Domain name取得
[namecheap](https://www.namecheap.com/) に登録してDomain名`20190805.xyz`を購入してみました。1年1ドルくらい。
～.comは人気なのか、名前で人気不人気あるようで安いものは約1ドル/年~高いものだと8ドル/年とか。

[ICANN](https://lookup.icann.org/lookup)で検索確認
![0.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428410/357900d6-3847-0e43-a483-3cb6dd27679e.jpeg)
* WhoisGuardを有効化しておくと紐づくメールアドレスだとかの個人情報が表示されない。何もしない状態だとPanamaになっていました。

# Domain Name System (DNS) settings
[Cloudflare](https://dash.cloudflare.com/) に登録。
こちらは無料で、DNSサーバの表示があるのでコピーしてnamecheap の方で登録し向き先を変更。
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428410/24408184-1df6-6f2d-20e3-3da237683bab.jpeg)

Cloudflare上のDNS設定部分で、アプリをデプロイしたサーバのIPとnamecheapで取得したDomain名の紐付けをする。（このサーバはDigitalOceanで立てたもので、1ヶ月無料期間が終わると使えなくなる）
![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428410/74e4cc1a-184b-e744-81c1-6b873d94db53.jpeg)

Requesutを投げてみると下記のとおり返ってきました。CNAMEの`www.20190805.xyz`も効いていました。
![5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428410/1983adb9-c744-9906-0b93-21fcf6089a73.jpeg)


# SSL setting
Crypt設定(Cloudflare)で、`Full(strict)`を選択。
![5-0.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428410/f85f32c0-1ec7-cf4b-2830-3e6c5280e14e.jpeg)

`Origin Certificate Installation`で規定のままNextをクリック。
![6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428410/e6037572-c483-b72e-b7de-316bf234da5b.jpeg)

Key formatで`PEM`を選択。
![7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428410/6ee52ea3-62bb-3198-41a2-7d0155e23a9f.jpeg)

サーバ側で下記のファイル、フォルダを作成し、それぞれOrigin certificateのテキストをコピペ。
`/var/www/ssl/20190805.xyz.pem`

```vi:20190805.xyz.pem
-----BEGIN CERTIFICATE-----
MIIEpDCCA4ygAwIBAgIUKpggyNiz4WiEh4GJM1o3x0te778wDQYJKoZIhvcNAQEL
<<< 中略 >>>
jgZjkVpFetL78zN2kxhEiozAejGcBC0UOs14GOJsoFVnlHEYjON80A==
-----END CERTIFICATE-----
```

`/var/www/ssl/20190805.xyz.key`

```vi:20190805.xyz.key
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCsAgaz9Y/dFchk
<<< 中略 >>>
VJVGv5J/QlVlKquVN3H//y1F
-----END PRIVATE KEY-----
```

## Nginxの設定をhttps向けに修正
`sudo vi /etc/nginx/sites-enabled/<config file name>.conf`

```vi:.conf 
server{
 listen 443 default_server;
 server_name 20190805.xyz;
 ssl on;
 ssl_certificate /var/www/ssl/20190805.xyz.pem;
 ssl_certificate_key /var/www/ssl/20190805.xyz.key;
 real_ip_header X-Forwarded-For;
 set_real_ip_from 127.0.0.1;

location / {
 include uwsgi_params;
 uwsgi_pass unix:/var/www/html/<app location>/socket.sock;
 uwsgi_modifier1 30;
 }
}

server{
 listen 80;
 server_name 20190805.xyz;
 rewrite ^/(.*) https://20190805.xyz/$1 permanent;
}
```

```
$ sudo systemctl reload nginx
$ sudo systemctl restart nginx
```


## Firewallのルール追加

```
$ sudo ufw allow https
Rule added
Rule added (v6)

$ sudo ufw reload
Firewall reloaded
```

httpsでの接続ができようになりました。
Windows Terminal で Git Bash を表示する

[Windows Terminal](https://github.com/microsoft/terminal) は Build 2019 で発表された Windows 向けの新たなターミナルです。マルチタブが導入されており、複数の PowerShell やコマンドプロンプトなどを切り替えながら利用することができます。また、Windows10 v1809 から Unix / Linux 互換の擬似コンソール [ConPTY](https://devblogs.microsoft.com/commandline/windows-command-line-introducing-the-windows-pseudo-console-conpty/) が導入されたため Bash on Ubuntu on WSL などの Linux シェルを表示することも可能です。せっかくなので [Git Bash](https://gitforwindows.org/) も利用できるように設定してみました。

![git-bash-on-windows-terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/24ab28df-45f3-a57a-65bf-af896cbdff15.png)

## 設定手順（GUI）

**（2021-05-19追記）** Windows Terminal のバージョンアップに伴い、GUIでの設定が可能になりました。

1. Windows Terminal を起動し、設定画面を開きます。

2. サイドメニューの`[プロファイル]`-`[新規追加]`からプロファイルを追加し、以下のように設定します。

    ![WT-GitBash-GUI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/6ad6e2a1-d481-4791-671f-58bd7fe1be7c.jpeg)

3. 新規タブの選択肢に `Git Bash` が追加されました！

## 設定手順（手動）

1. PowerShell を起動して適当な GUID を取得します。
    ```powershell
    [guid]::NewGuid()
    ``` 
2. Windows Terminal を起動し、設定画面から`[JSONファイルを開く]`を押下して `settings.json` を開きます。
3. `"profiles" : [ { ... } ]` の末尾に以下のオブジェクトを追記して保存します。`"guid"` の値は先ほど取得した GUID に差し替えてください:
    ```json
    {
        "guid" : "{e635c1d7-d15f-f81e-4665-c60b3f27a3f6}",
        "acrylicOpacity" : 0.5,
        "closeOnExit" : true,
        "colorScheme" : "Campbell",
        "commandline" : "C:\\Program Files\\Git\\bin\\bash.exe",
        "cursorColor" : "#FFFFFF",
        "cursorShape" : "bar",
        "fontFace" : "consolas",
        "fontSize" : 14,
        "historySize" : 9001,
        "icon" : "C:\\Program Files\\Git\\mingw64\\share\\git\\git-for-windows.ico",
        "name" : "Git Bash",
        "padding" : "0, 0, 0, 0",
        "snapOnInput" : true,
        "startingDirectory" : "%USERPROFILE%",
    
       "useAcrylic" : true
    }
    ```

4. 新規タブの選択肢に `Git Bash` が追加されました！

    ![git-bash-added-selection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/8ff677e8-7b96-cfb6-84ee-d96b47c1da47.png)

※ここでは同様の手順で [PowerShell Core 6](https://aka.ms/pscore6) も 追加しています。

## 日本語対応

上記の作業だけでも利用することはできますが、ロケールの設定が行われていないため日本語が文字化けしてしまいます。そこで、`~/.bashrc` で環境変数 `LANG` を指定します：

```shell:.barhrc
export LANG=ja_JP.UTF-8
```

日本語が文字化けしなくなりました。

![git-bash-on-windows-terminal-ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/3fe5e15e-1284-dd0f-80eb-22ac86259197.png)

※ここでは同様の手順で [Cygwin](https://qiita.com/yokra9/items/e8b184021091dbabb8a1) も追加しています。

もしフォントの崩れが気になる場合は、任意の**等幅フォント**を指定します。<del>このとき、マルチバイト文字をUnicodeエスケープシーケンスで記載しなければならないことに注意します</del> 現在は修正されています：

```json-doc
{
    // MSゴシック
    "fontFace" : "MS\u30b4\u30b7\u30c3\u30af",
    // BIZ UDゴシック
    "fontFace" : "BIZ UD\u30b4\u30b7\u30c3\u30af"
}
```

## 参考リンク

* [Adding Git-Bash to the new Windows Terminal](https://stackoverflow.com/questions/56839307/adding-git-bash-to-the-new-windows-terminal)
* [Windows Terminal で Cygwin Bash を表示したい](https://qiita.com/yokra9/items/e8b184021091dbabb8a1)
djangogirls をやっていて詰まりました。プロジェクトを作成しよう！の部分です。

djangogirls をやっていて詰まりました。

プロジェクトを作成しよう！　url https://tutorial.djangogirls.org/ja/django_start_project/
の
django-admin.py は、必要なディレクトリとファイルを作成するスクリプトです。次のようなファイル構造が作成されましたね。:

djangogirls
├───manage.py
├───mysite
│        settings.py
│        urls.py
│        wsgi.py
│        __init__.py
└───requirements.txt

とありますが、自分は
djangogirls
|--myvenv
        Include
        Lib
        Scripts
        pyvenv.cfg
|--requirements.tx

となっています。これでは含まれているファイルが違うのか設定変更はできましたが、
python manage.py migrate
が実行できません。
　
なぜ含まれてるファイルがちがうのか、この先どう進めればいいか困っています。
誰かご教授お願いします。
2019-08-12　わからなかったところ

この記事は、今日の学習において、個人的にわからなかったところを復習していくだけです。私のための記事であることはご了承ください。

#make_blobs
クラスタリングのサンプルデータ生成にmake_blobsを使いました。まずは、make_blobsの動作を見てみます。

```
from sklearn.datasets import make_blobs

x,y = make_blobs(random_state=0)

#出力
x
#[[ 2.632  0.689]
 [ 0.081  4.691]
 [ 3.003  0.743]
 [-0.638  4.091]...
#100行、2列の二次元配列
y
#[1 0 1 0 0 0...
#要素が100個の配列
```
make_blobsは、上記の通り100行2列のndarray型の配列と100個の要素を持つndarray型の配列を生成してくれます。make_blobsの引数であるrandom_stateは、擬似乱数のシード値を固定するために使われます。擬似乱数のシード値に関しては[こちら](https://teratail.com/questions/15388)をご覧ください。
本当につかえるフォント集

Windows環境下で鉄板の本当につかえるフォントを集めてまとめた。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">本当につかえるフォント集 - NAVER まとめ <a href="https://t.co/H5fQUV5YeD">https://t.co/H5fQUV5YeD</a></p>&mdash; kannkyo (@kannkyoshi) <a href="https://twitter.com/kannkyoshi/status/1160884184660885505?ref_src=twsrc%5Etfw">August 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
技術系資格試験は受ける意味があるのか？〜Ruby Gold編〜


## 前書き
[技術系資格試験は受ける意味があるのか？〜Ruby Silver編〜](https://qiita.com/Sayatam/items/b0d50f4912f43f79b9d3) の続きです。
学習期間は３週間ほどで、一発合格だったものの100点満点中76点でギリギリ合格でした。


## 結論
まず私はRuby歴1年半で、OSS活動をバリバリやってる人間ではない(OSSの恩恵にあやかってアプリを作る方が好き)ということが前提にあります。

その上で、
「一般的なアプリ開発に役立つかを重視する人にとっては、勉強するのはとても有益だけど、合格は目指さなくていいのでは？」と思いました。
Silverとはうってかわって、試験にすることによる嫌な感じが出ていたように感じました。

まとめると、
Silver -> Rubyで１アプリ作り終わったくらいの人には是非合格を薦めたい
Gold -> 特異クラスやメタプロについて理解したい、組み込みクラスや添付ライブラリについてさらっと知りたい人には勉強を薦めたい。言語としてのRubyを極めたい人には合格を薦めたい。
という感じです。

## 動機
・class_eval等メタプロについて、業務ではそんなに使わずあやふやな理解できているのでちゃんと勉強したい
↑のせいでライブラリを読む時に分からなくて諦めてしまう時があるが、それで痛い目にあった
・FiberとかStringIOとかよくわかってないクラスやライブラリがあるの気持ち悪い
・Ruby歴1年半だし、Silverで止まらずGoldまでとってみよう

## 良かったと思うポイント
先に良かった点。

まず、この試験を受けるにあたり、積読になっていたメタプログラミングRubyを読みました。
そのおかげで動機の一つであった
> class_eval等メタプロについて、業務ではそんなに使わずあやふやな理解できているのでちゃんと勉強したい

は達成することができました。
実際にRailsやgemでメタプロがどう使われているかも説明されていたため、今後ライブラリも多少読めていくのではないかと期待。

もう一つは業務ではまだ使ったことはないが、いつか使うかもしれない組み込みクラスや添付ライブラリについて一通りさらっと学べたのも良かったです。
いつか機会があった時に使える候補が増えたりするので、一通り知ってはいるというのは実はすごく意味があると思っています。
今年のRuby会議でも発表がありましたが、Fiberとか使ってみたいと思うようになりました。


## 悪かったと思うポイント
「これ普通に開発してて必要になるケースある！？！？」という問題が多かったです。
例えばこんな問題とか

```ruby
module M
  @@val = 75

  class Parent
    @@val = 100
  end

  class Child < Parent
    @@val += 50
  end

  if Child < Parent
    @@val += 25
  else
    @@val += 30
  end
end

p M::Child.class_variable_get(:@@val)
```

```ruby
class S
  @@val = 0
  def initialize
    @@val += 1
  end
end

class C < S
  class << C
    @@val += 1
  end

  def initialize
    @@val += 1
    super
  end
end

C.new
C.new
S.new
S.new

p C.class_variable_get(:@@val)
```

複雑な状況に置けるクラス変数について必ず数問出るのですが、誤解を恐れずに言うと、そもそもwebアプリ作る時にクラス変数とか使わなくない？という気持ちでいっぱいでした。
もちろんRubyの理解を試したいのは重々承知なのですが、こんな状況あります？という気持ちが拭えなかったです。

他にも定数やらeval、Refinementに関して、意図はわかるけど現実的じゃないなと感じてしまう問題がありました。
なのでアプリ開発に役立てたい人は、勉強するのは有益ですが、合格を目指す必要はない、と思いました。

## 最後に
とはいえテストをすることにより人間の記憶は定着するらしいので([使える脳の鍛え方](https://www.amazon.co.jp/%E4%BD%BF%E3%81%88%E3%82%8B%E8%84%B3%E3%81%AE%E9%8D%9B%E3%81%88%E6%96%B9-%E3%83%94%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%BB%E3%83%96%E3%83%A9%E3%82%A6%E3%83%B3-ebook/dp/B07NP3DHTJ/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=18TIQWCEGBQ8E&keywords=%E4%BD%BF%E3%81%88%E3%82%8B%E8%84%B3%E3%81%AE%E9%8D%9B%E3%81%88%E6%96%B9&qid=1565610164&s=digital-text&sprefix=%E4%BD%BF%E3%81%88%E3%82%8B%E8%84%B3%E3%81%AE%2Cdigital-text%2C268&sr=1-1))、合格するための勉強にも意味があると思います。
しかし1万６千円と高いので、合格をゴールにして2度3度と受ける必要はないんじゃないかなあと。

そしてもう1年くらい開発を続けたら、合格して良かったと思う日がくるかもしれません。
その時は編集します。

## おまけ：勉強方法
Silverはほぼ暗記型の試験ですが、Goldは３割は知ってるだけで正解できる暗記系、残りは知識を使って考える系でした。
なのでしっかりとRubyにおける特異クラスとは？オープンクラスとは？などを理解する必要があります。

・メタプロフラミングRubyの1~5章を読む。4~5章は３回くらい読みました。良書。
・[Ruby 技術者認定試験合格教本](https://www.amazon.co.jp/dp/B0756VF9Y3/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)のGoldの試験範囲を一通り読む。
・Ruby 技術者認定試験合格教本の模擬試験をとく。同じような問題がたくさんでました。
・Rexの模擬試験をとく×3
https://rex.libertyfish.co.jp/

をやりました。
【Python】文字列から任意の文字を置換する

# 環境
OS : MacOS Mojave
Python 3.7.2



# re.sub()を使う
正規表現を使って文字列置換を行います。
基本形は以下の通りです。

```python
re.sub("[置換したい文字]", "置換後の文字", "置換対象の文字列")
```
まず、置換したい文字が一文字だった場合を以下に示します。


```python
>>import re
>>re.sub("[a]", "あ", 'abcdefg')
'あbcdefg'
>>re.sub("[a]", "あ", 'aaabbbccc')
'あああbbbccc'
```
abcdefg、aaabbbcccのaを全て"あ"に変換しています。

置換したい文字は二文字以上だと、それぞれの文字を置換後の文字にします。


```python
>>import re
>>re.sub("[aceg]", "あ", 'abcdefg')
'あbあdあfあ'
>>re.sub("[ac]", "あ", 'aaabbbccc')
'あああbbbあああ'
```
コミュニケーションにおける曖昧な表現をリアルタイムで検出して、発話者にアラートしたい（作成中）

コミュニケーション相手のノンバーバルコミュニケーションをCVで読み取って、アラートしてくれるプログラムの論文(REsCUE: A framework for REal-time feedback on behavioral CUEs using multimodal anomaly detection, Arakawa.Yakura, 2019)を読んで、考えました。(たぶんそういう内容、ちがったらすみませんが訂正します)
自閉スペクトラム障害の人との面接場面で、カウンセラー側に同様のアラートを発するプログラムは作れないか。
→カウンセラーの抽象的(abstract)な表現にアラートを出し、具体的(concrete)で伝わりやすい表現を促すプログラムを作りたい。

〇抽象語をリストアップする
・アンケートやインタビューもするか

〇抽象語の辞書を作成する
話題に基づく語義曖昧性解消評価セット(https://github.com/nut-jnlp/JapaneseTopicWSD)を参考に作成する
・辞書内に「字義どおりに解釈した場合の意味」も用意しておく（ex適当＝適切）
（または「広辞苑等の辞書」内に無い意味の辞書を作る？(ex適当＝手抜きしてよい)）

＜テスト済＞
〇音声入力はgoogleのcloud speech APIを使いtranscribe_streaming_mic.pyで処理する

〇transcribe_streaming_mic.pyの戻り値を、曖昧な表現を検出するプログラムに渡す処理

〇受け取った値をリアルタイムで自然言語処理する
・形態素解析（Janomeは全部Pythonで書かれてて遅いらしいのでMecabでやる方向で）
・形態素解析された品詞から辞書の抽象語を検出する
・検出した場合、以下の処理を行う

＜テスト済・方法は要研究＞
〇語義曖昧性解消（word sense disambiguation:WSD）
手法１
@文脈（文書）のベクトルの算出
・単語のベクトルを足し合わせる（名詞、動詞、形容詞）
・Window sizeはいくつが適当か？
@抽象語の辞書のすべての意味と、文脈ベクトルのコサイン類似度を比較し、最も高いものを語義として語義曖昧性解消（WSD）の処理をする。
・アラートの精度が低い場合はスタッキングで絞る？
・語義が字義どおりに解釈した場合の意味でなかった場合（または「広辞苑等の辞書」内に無い意味だった場合）、アラートを表示する。（スマートウォッチにアラート？）

手法２
「話題に基づく語義曖昧性解消(桾澤, 2018)」をベースに実装
Context Word Embedding(CWE)を用いる(単語の分散表現のベクトルを繋ぎ合わせて文章のベクトルを作り、話題に基づく語義曖昧性解消評価セット(https://github.com/nut-jnlp/JapaneseTopicWSD)からSVCで分類する手法(Context Representation with Word Embeddings for WSD:sugawara, 2015)の論文を入手して使う)
↑精度75％らしい　pythonでの行列の作り方でつまづいている。

〇コミュニケーションの肝要な副詞のうち、多義にわたるものを検出 
ex「もうちょっと」(抽象的な量の表現)←これをWSDすると良いのか？
（ex「また」という表現は抽出しない）
〇照応解析、ゼロ照応解析で照応先が曖昧なのも対象とする？
文内、文間、外界ゼロ照応解析が「あった」とき(ガ格が空いてる)にアラート(文間ゼロ照応解析の制度は30％以下のため　文書全体を考慮したニューラル文間ゼロ照応解析モデル 大内 啓樹,2017)
意味解析システムSAGEによるゼロ照応解析は精度50％
〇指示代名詞の検出「「それ」とって」
〇換喩の検出　単語間連想関係を用いた換喩表現の自動検出
Angularセットアップ[Mac]

Macbook Airを購入したので、セットアップがてら手順をメモ。

## brew

まずはこれ。デフォルトで入ってないんですね。
https://brew.sh/index_ja

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

## nodebrew

環境切り替えに使えるので今回はこれも入れます。
参考：https://qiita.com/tabolog/items/da18143e70f40e356b5d

### インストール
```
$ brew install nodebrew
```

### バージョン一覧表示
```
$ nodebrew ls-remote
```

### 欲しいバージョンをインストール
`latest`を指定すると最新が入るらしいのですが、怖いのでちゃんとバージョン指定しました。

```
$ nodebrew install-binary 12.8.0
```

### ちゃんと入ってるかチェック

```
$ nodebrew ls
```

### current(使用するnodeのバージョン)を指定
```
$ nodebrew use v12.8.0
```

### nodeのバージョンを確認
```
$ node -v
```

今回の場合は`v12.8.0`と出力される。はず。

## Angular CLI
すべてはこれを入れるためだけの作業。
### インストール
```
$ npm install -g @angular/cli
```

### 動作確認
適当なディレクトリで、

```
$ ng new test-app
```

routingとスタイルシートについての質問に答えたらプロジェクトが生成されていることを確認。

# 感想
導入が本当に楽。
あとはIDE(お気に入りは[VSCode](https://code.visualstudio.com/))とかGitのビューアー(これもお気に入りの[GitKraken](https://www.gitkraken.com))入れて開発環境構築完了。

他にフロント開発でのオススメがあれば教えてください。
link

### javascript
https://stephengrider.github.io/JSPlaygrounds/
https://babeljs.io/repl
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array
https://developer.mozilla.org/ja/docs/learn/javascript/objects

### DOM
https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model/Introduction
https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model
https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model/examples
https://developer.mozilla.org/ja/docs/Web/API/HTML_DOM

### Google
clear cashe
full page screen capture
Awesome screen shot
JSONView
HTML error check
ruler

### VS
vuejs extention pack

### json 配列 取得 js
http://wims-tea.hatenablog.jp/entry/2015/06/10/141614
https://qiita.com/1mada/items/9a48f7053a6016b5fd5a

### vue.js axios 使い方
https://reffect.co.jp/vue/vue-axios-learn
https://www.thepolyglotdeveloper.com/2017/10/consume-api-data-http-vuejs-web-application/
https://medium.com/javascript-in-plain-english/implement-movie-app-with-vue-vuetify-axios-open-movie-database-api-d12290318cf9
http://www.omdbapi.com/?s=indiana&apikey=b76b385c&page=1&type=movie&Content-Type=application/json

### axios
https://github.com/axios/axios
https://www.jsdelivr.com/package/npm/axios
https://www.yoheim.net/blog.php?q=20170801
https://jp.vuejs.org/v2/cookbook/using-axios-to-consume-apis.html

### API
https://jsonplaceholder.typicode.com/
https://h5y1m141.github.io/step-up-javascript/index.html
https://qiita.com/busyoumono99/items/9b5ffd35dd521bafce47
https://developer.mozilla.org/

### storefront
https://docs.storefrontui.io/
https://storybook.storefrontui.io/?path=/story/introduction--how-to-use-storybook

### Vue
https://cr-vue.mio3io.com/
https://blog.jin-no.jp/vue-js/vuecli3-create-component-build/
https://qiita.com/coppieee/items/dcf120d6b8eef68ecb34
https://cli.vuejs.org/guide/build-targets.html#web-component
https://www.shoeisha.co.jp/book/download/9784798158921

### WebDesign
https://htmlcolorcodes.com/
https://htmlcolorcodes.com/tutorials/html-text-color/
https://coolbackgrounds.io/
https://cssgradient.io/
https://cssgradient.io/swatches/
https://cssgradient.io/gradient-backgrounds/

### Kr
http://www.openads.co.kr/nTrend/article/4394/%EB%8B%A4%EC%96%91%ED%95%9C-%EC%A2%85%EB%A5%98%EC%9D%98-%EB%B0%B0%EA%B2%BD%EC%9D%84-%EC%9B%B9%EC%83%81%EC%97%90%EC%84%9C-%EC%A0%9C%EC%9E%91%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-lsquoCOOL-BACKGROUNDSrsquo?fbclid=IwAR3O9muQuzCuQiHZ_hSgT0cb5JwkbhAj5DYSC0_juWXmD86gpYe85jbokps
mingw で実行時に inflateReset2 が見つからないと怒られたときの対処法：zlib1.dllを補う

# 結論
zlib1.dll が必要

# エラー内容
a.exe - エントリ ポイントが見つかりません
プロシージャ エントリ ポイント inflateReset2 がダイナミック リンク ライブラリ libpng16-16.dll から見つかりませんでした。 

# 補足情報
```sh
% grep -rn inflateReset2 /usr/x86_64-w64-mingw32/*
/usr/x86_64-w64-mingw32/include/zconf.h:118:#  define inflateReset2         z_inflateReset2
/usr/x86_64-w64-mingw32/include/zlib.h:967:ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
/usr/x86_64-w64-mingw32/include/zlib.h:976:     inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source
```
React 再帰コンポーネント 親子関係を持つリストをツリー表示する

親子関係を持つリストをツリー表示するコンポーネント。

サンプルサイト: https://react-recursive-array-to-tree.netlify.com/
レポジトリ: https://github.com/natsuhikok/react-recursive-array-to-tree

## リストデータ
以下の配列をツリー表示にします。
**注意: 親子関係がぶっ壊れているとエラーなしで無限ループに突入します。</span>**

```list.js
const list = [
 { id: 1, name: 'at 01', parentId: 0 },
 { id: 2, name: 'at 02', parentId: 0 },
 { id: 3, name: 'at 03', parentId: 0 },
 { id: 4, name: 'at 04', parentId: 0 },
 { id: 5, name: 'at 05', parentId: 0 },
 { id: 6, name: 'at 06', parentId: 0 },
 { id: 7, name: 'at 07', parentId: 0 },
 { id: 8, name: 'at 08', parentId: 0 },
 { id: 9, name: 'at 01-01', parentId: 1 },
 { id: 10, name: 'at 02-01', parentId: 2 },
 { id: 11, name: 'at 02-01-01', parentId: 10 },
 { id: 12, name: 'at 02-02', parentId: 2 },
 { id: 13, name: 'at 03-01', parentId: 3 },
 { id: 14, name: 'at 03-01-01', parentId: 13 },
 { id: 15, name: 'at 03-01-01-01', parentId: 14 },
 { id: 16, name: 'at 08-01', parentId: 8 },
 { id: 17, name: 'at 09', parentId: 0 },
];
```

## 再帰コンポーネント

`<RecursiveComponent rootId={0} list={list} />`でリストと最初の回で表示する`parentId`を渡します。


```RecursiveComponent.jsx
import React from 'react';
export const RecursiveComponent = ({ list, rootId }) => {
  const targetList = list.filter(item => item.parentId === rootId);
  return (
    <ul>
      {targetList.map(item => (
        <li key={item.id}>
          <span>#{item.id}</span> {item.name}
          {list.find(l => l.parentId === item.id) &&
            <RecursiveComponent list={list} rootId={item.id} />
          }
        </li>
      ))}
    </ul>
  )
}
```
SQL Server 2017 Developerエディションのインストール手順


![sqlserver2017dev_install_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9370/138c242b-58dc-ad68-2113-344d988573d1.png)


ダウンロードが完了したらexeを実行してインストールを進める。

![sqlserver2017dev_install_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9370/63ab4859-d2c2-7b3f-540c-17092907431b.png)

基本を選択

![sqlserver2017dev_install_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9370/0c4315e0-198c-8dfd-6ede-11d90477458b.png)

同意するを押下

![sqlserver2017dev_install_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9370/3300b695-4d20-7eec-feb3-469069fba8f4.png)

インストールを押下

![sqlserver2017dev_install_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9370/61d949ea-03b2-870c-2bcc-a4354ba925de.png)

SSMSのインストール

![sqlserver2017dev_install_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9370/b4ff5f44-bc4d-3dd3-68d3-ec9a3f07f029.png)


SQL Server Management Studio 18.2のダウンロードを押下して
exeをダウンロードして実行する

![sqlserver2017dev_install_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9370/3d3ec131-bb42-832c-3cfd-c0b4116bba98.png)

インストールを押下

<img width="522" alt="sqlserver2017dev_install_7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9370/fb9836fd-912d-5ef6-05ca-cfaf17a00406.png">

![sqlserver2017dev_install_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9370/38781703-8f62-0472-d581-b3dd47cf84ee.png)
PHPのスプレッド演算子


```php
<?php

$arr = [1,2,3,4,5];

function test(int $a, int $b, int $c, int $d , int $e) {
	var_dump($a);
	var_dump($b);
	var_dump($c);
	var_dump($d);
	var_dump($e);
}

// 配列がアンパックされて各要素が引数に渡される
test(...$arr);
// 実行すると以下のアウトプットが出る
// int(1)
// int(2)
// int(3)
// int(4)
// int(5)


?>
```
Java ScriptをブラウザのURL上から行う方法。

#JavaScript疑似プロトコル
 別名：JavaScript pseudo protocol / javascript疑似スキーム / JavaScript URI

#コード
このコードをURLに貼り付けるとアラート画面がブラウザから出てくる。

```javascript

javascript:alert('test');
```
#使い方
そもそも「javascript:」とは、疑似プロトコルの一種とのこと。
これに始まる文字列がアドレスバーに入力されると、ブラウザがそれをJavaScriptとして解釈し実行する。（今回はalert('test')の部分。
これを応用したのがブックマークレットである。

上手くいけば申し込みフォームの自動入力はやってくれると思う。多分。
要件定義で気を付けるポイント

最近、物忘れが激しくなってきて、具体的なことを思い出すのに時間がかかる（笑）

なので、具体的なことをメモっておく。

まずは、要件定義で気を付けるポイント。
本内容は、私の経験に基づく、個人的な主観になります。

# 要件定義で気を付けるポイント
## 何をやりたいの？を確認する
これは言わずとも、大体出てきます。

## 何故やりたいの？を確認する
これは、聞かないと出てきません。
絶対聞くべき内容です。

何故聞くべきか？

**もっと良い方法があるかもしれないから**
**やりたいことを更に良くする方法があるかもしれないから**

下手をすると、理由を聞くことにより、システムを作らなくてもよくなる可能性もある。

# 駄文
システム開発は、結局は分業ですが、関わる人みんなで作るものだと思っています。
そのほうが、目的に合致したシステムが作れると思っています。

なので、何故やりたいのか？を関わる人、みんなで共有すると、目的に合致したシステムが作れると思っています。

人によっては、「言われたことだけをやりたい。」って、人もいるかもしれません。

ただ、そのスタンスのリスクは、「言われたこと」は、人が出しているので完ぺきではありません。
なので、絶対に変わる可能性が高いです。

それを文句なく受け入れられるのであれば、否定はしません。

私は、出来る事なら無駄なことをしたくない人なので、
出来る限り、「やること」を一緒に考えます。
それを考えるには、「何故？」が必要。

だから、聞いちゃうんですよね～。
【ggplot2/R】stat_function()関数で回帰直線を書く

備忘録的なメモです。

初めに、回帰モデルを作成します。

```math
y = b_0 + b_1x \\
```
C1:説明変数
C2:目的変数
DF:データフレーム

```R
Model1 <- lm(C2 ~ C1, DF)
```

次に回帰係数のパラメーターの値を取り出し、表示する。

```R
a <- Model1$coefficients #回帰係数の値を取り出す
a
a[1] #1つずつ表示（b0）
a[2] #1つずつ表示（b1）
```

関数ggplot()とstat_function()を組み合わせると、このパラメーターの値を使って回帰直線を引くことができます。

```R
ggplot(DF, aes(x = C1, y = C2)) +
  geom_point(color = "orange", size = 3) +
  stat_function(color = "red",
                fun = function(x) a[1] + a[2]*x) 
#stat_function()で関数を描画
#fun = function(x)の後にxの関数を記述する
#xは最初にggplot()で指定したx軸と対応づけられる
```

fun = function(x)の後にxの関数を記述します。
xは最初にggplot()で指定したx軸と対応づけられます。

こんな感じの図に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471633/ac8a25c3-bf0b-21fa-8a45-314b37d34c2f.png)
【Python】基本入力時の文字列ソート

# はじめに
Pythonで競プロをやっていると文字列のソートが意外とややこしいことに気付いたので、今回は文字列のソートの基本をまとめます。AtCoderのPython3.4.3と3.8で動作確認済みです。

#一つの文字列
文字列を`s`としたとき，`sorted(s)`で1文字ずつソートされたリストが返ってきます。

```:入力
bcaed
```

```python:Python
s = sorted(input())
print(s)
```

```:出力
['a', 'b', 'c', 'd', 'e']
```

#文字列のリスト (1次元)
文字列のリストを`str_list`としたとき，`str_list.sort()`か`sorted(str_list)`でソートされたリストが返ってきます。

```:入力
az aj ab aa bc ad
```

```python:Python
str_list = sorted(list(input().split()))
print(str_list)
```

```:出力
['aa', 'ab', 'ad', 'aj', 'az', 'bc']
```

#文字列のリスト (2次元)

```:入力
3
az aj
ab aa
bc ad
```

```python:Python
n = int(input())  #nは入力回数
str_list = [list(input().split()) for _ in range(n)]
print(sorted(sorted(str_list)))
```

```:出力
[['ab', 'aa'], ['az', 'aj'], ['bc', 'ad']]
```

素直にsortすると各リストの先頭要素をkeyとしてsortしていることが分かります。
では先頭以外の要素でソートしようとすると、以下のようになります。

```python:Python
n = int(input())  # nは入力回数
str_list = [list(input().split()) for _ in range(n)]
print(sorted(str_list,key=lambda x:x[1]))  # 2番目の要素でソート
```

```:出力
[['ab', 'aa'], ['bc', 'ad'], ['az', 'aj']]
```

#降順ソート
降順にソートしたいときは、`reverse==True`を`sorted()`のカッコ内に書き加えてください。

```:入力
az aj ab aa bc ad
```

```python:Python
str_list = sorted(list(input().split()), reverse=True)
print(str_list)
```

```:出力
['bc', 'az', 'aj', 'ad', 'ab', 'aa']
```


# さいごに
読んでいただきありがとうございました。指摘等ございましたらコメントお願いします。
php-master-changes 2019-08-11

今日は各関数で arginfo を PHP スタブへ移行する修正、preg_replace() の引数チェックエラーで TypeError を投げるようにする修正、GD で RGBA の色要素の範囲チェックを追加する修正、imagecopymerge() と imagecopymergegray() の引数が src と dst 逆に書かれていた問題の修正、imagexbm() の arginfo 修正があった！

# 2019-08-11
## duncan3dc: Convert json functions arginfo to php stubs
- https://github.com/php/php-src/commit/7e7eaa0eb23fd67202ca669ff1b9e66993ba797a
- ext/json で、json 関連の関数の arginfo を PHP スタブへ移行

## iNem0o: Add base64_encode / base64_decode stubs
- https://github.com/php/php-src/commit/b98bc5bd9216be9d2ee47d251630d069d30e129d
- [base64_encode()](https://www.php.net/manual/ja/function.base64-encode.php) / [base64_decode()](https://www.php.net/manual/ja/function.base64-decode.php) の arginfo の PHP スタブへの移行

## duncan3dc: Convert gettext functions arginfo to php stubs
- https://github.com/php/php-src/commit/f9980e609e268188446d00a6ee076ffc74cc06a6
- ext/gettext で、arginfo の PHP スタブへの移行

## simPod: Add BCMath PHP stubs
- https://github.com/php/php-src/commit/4799b76f39a46fdb9d96f0803bd1b935d607409e
- ext/bcmath で、arginfo の PHP スタブへの移行

## Rimvydas Zilinskas: Add partial openssl stubs
- https://github.com/php/php-src/commit/31d7f9763b4825e667eb34437f2bd7fbef5067e6
- ext/openssl で、一部の arginfo の PHP スタブへの移行

## stephenreay: Add stubs for PCRE extension
- https://github.com/php/php-src/commit/66b750d07e4d2d46fc2644a80305239c6d7addf3
- ext/pcre で、arginfo の PHP スタブへの移行

## cmb69: Add GD function stubs
- https://github.com/php/php-src/commit/c90a27387e7a3dd420c75786b0144f13dccb3676
- ext/gd で、arginfo の PHP スタブへの移行

## cmb69: Fix arginfo
- https://github.com/php/php-src/commit/4067519541850cfe47d031792f1d46829468706e
- ext/gd で、arginfo の誤りを修正

## nikic: Use TypeError for preg_replace type check
- https://github.com/php/php-src/commit/228bae7d74a7886f05716ef5ac0f3ba200caccc4
- ext/pcre で、[preg_replace()](https://www.php.net/manual/ja/function.preg-replace.php) の引数チェックエラーで TypeError を投げるよう修正

## cmb69: Extend color component range checks
- https://github.com/php/php-src/commit/092571c1cbe82b28b84d1b69f474e6eb55c9a258
- [7.4~]
- ext/gd で、RGBA の色要素の範囲チェックを追加

## cmb69: Fix parameter order
- https://github.com/php/php-src/commit/9818f863c3b5e87b7b81b5d66c4be585ab169102
- [7.4~]
- ext/gd で、[imagecopymerge()](https://www.php.net/manual/ja/function.imagecopymerge.php) と [imagecopymergegray()](https://www.php.net/manual/ja/function.imagecopymergegray.php) の引数が src と dst 逆に書かれていたのを修正

## cmb69: Fix arginfo
- https://github.com/php/php-src/commit/0c5b75b0635138b43237d650cdf5e72a60cef76f
- ext/gd で、[imagexbm()](https://www.php.net/manual/ja/function.imagexbm.php) の第二引数が nullable なので arginfo を修正
【R】回帰モデルから係数を取り出す方法

備忘録的なメモです。

回帰モデルを作成します。

```math
y = b_0 + b_1x \\\
```

A1:説明変数
A2:目的変数
DF:データフレーム

```R
Model1 <- lm(A2 ~ A1, DF)
```

作成した回帰モデル（Model1）から係数を取り出す方法はこんな感じ。

```R
a <- Model1$coefficients #回帰係数の値を取り出す
```

表示方法はこんな感じ

```R
a
a[1] #1つずつ表示（b0）
a[2] #1つずつ表示（b1）
```

実行結果は、

```R:実行結果
> a <- Model1$coefficients #回帰係数の値を取り出す
> a
(Intercept)          C1 
   3.667721    0.339507 
> a[1] #1つずつ表示（b0）
(Intercept) 
   3.667721 
> a[2] #1つずつ表示（b1）
      C1 
0.339507
```
JavaScript 文字列 の 連結 ～console.log("文字列" + "文字列");～

# 目的

- JavaScriptの文字列の連結方法を知る。

# 押さえるポイント

- 文字列を連結するときも、足し算と同じように`+`符号を用いる。
- 連結したい文字列はダブルクォーテーションで囲む。

# 書き方の例

- 下記に文字列を連結する汎用的な処理を記載したJavaScriptファイルの内容を記載する。
※`>`に続く記載はコンソールの出力

``` javascript
# 文字列1と文字列2を連結する
console.log("文字列1" + "文字列2");
>文字列1文字列2
```

# より具体的な例
- 文字列「aaa」「bbb」「ccc」を前から順に連結してコンソールに出力する。
- 該当文字列を連結する処理を記載したJavaScriptファイルの内容を記載する。
※`>`に続く記載はコンソールの出力

``` javascript
console.log("aaa" + "bbb" + "ccc");
>aaabbbccc
```

- 文字列「おはよう」「ございます」をそれぞれ連結してコンソールに出力する。
- 該当文字列を連結する処理を記載したJavaScriptファイルの内容を記載する。

``` javascript
console.log("おはよう" + "ございます");
>おはようございます
```
ZYBOでNode-REDを実行する

#はじめに
　Node-REDはNode.js(ver10.x)が入れば実行できるので、ZYBOのDebian 9でも動くと思い、やってみました。
この記事はその備忘録です。

 ZYBOとは、Xilinx社のZynq-7000シリーズが載った、FPGA開発ボードです。
Zynqを簡単に紹介すると、CPUとFPGAがワンチップになったICです。
秋月電子から購入可能です。
http://akizukidenshi.com/catalog/g/gM-13282/

#開発環境
ターゲットボード：　ZYBO Zynq7020評価ボード Z7-20
ターゲットOS：　[Debian 9](https://releases.linaro.org/debian/images/installer-armhf/17.08/)
Node.js：　v10.16.2
npm：　v6.9.0
Node-RED：　v0.20.7

#手順
Node-REDのインストール手順は次の通りです。
　1.curlをインストール
　2.Node.jsをインストールする
　3.Node-REDをインストールする
　4.Node-REDの起動を確認する

 始める前に、次のコマンドでパッケージを更新しておくことを勧めます。

```
sudo apt-get update
sudo apt-get upgrade
```

##1.curlをインストール
　linaroからダウンロードしてきたイメージファイルを展開したDebian 9には、curlがインストールされていないので、インストールします。

```
sudo apt-get install curl
```

##2.Node.jsをインストールする
　既にNode.jsをインストールされている場合は、以下のコマンドでアンインストールしておきます。

```
sudo dpkg -r nodejs
sudo dpkg -r npm
```

 Node-RED推奨バージョンのNode.jsをインストールします。
次のコマンドでインストールします。

```
sudo curl -sL https://deb.nodesource.com/setup_10.x | bash -
sudo apt-get install -y nodejs
```

　curlコマンドで以下のようなエラーが発生する場合があります。

```
curl: (77) error setting certificate verify locations:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: none
```

　CA認証に失敗しているようなので、次のコマンドでCA認証パッケージをインストールします。

```
sudo apt-get install ca-certificates
```

 Node.jsのインストールに成功すると、nodeコマンドとnpmコマンドが使用できるようになります。
それぞれのバージョンを確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/993a1ccf-e668-5da3-9257-fdf2d79a8e48.png)

##3.Node-REDをインストールする
　Node-REDをインストールするコマンドは次のとおりです。

```
sudo npm install -g --unsafe-perm node-red
```

##4.Node-REDの起動を確認する
　次のコマンドでNode-REDを起動します。

```
node-red
```

　起動すると次のようなログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/cc228439-30dc-c4f0-5588-686a39118d3a.png)

　ブラウザからアクセスしてみます。URLは次の通りです。

```
http://ZYBOのIPアドレス:1880
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/66252b22-4f23-a5f4-1982-30336fdce4e5.png)

#参考
Node.jsのインストール方法
https://github.com/nodesource/distributions/blob/master/README.md

Node-RED日本ユーザ会　ドキュメント
https://nodered.jp/docs/getting-started/
LeetCode / Best Time to Buy and Sell Stock

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/08/12/185157)からの転載）

東京都内在住の私ですが、<b>ひとり開発合宿</b>なるものをやってみようと思い、とある県のホテルに泊まって、部屋から出ず黙々とコードの写経をしています。

しかし、ひとり開発合宿は、自分に対する甘えを断ち切れる精神の持ち主でないと、あまり向いていないですね。
ついLeetCodeに浮気してしまいました。

次からはコワーキングスペースに突撃してみたいと思います。

さて、今日の問題。

[https://leetcode.com/problems/best-time-to-buy-and-sell-stock/]

Say you have an array for which the ith element is the price of a given stock on day i.

If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design an algorithm to find the maximum profit.

Note that you cannot sell a stock before you buy one.

Example 1:
<img width="620" alt="スクリーンショット 2019-08-12 18.27.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/d030db62-3743-e69e-04cd-fa3109905a31.png">
Example 2:
<img width="619" alt="スクリーンショット 2019-08-12 18.28.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/f3bc7607-b3e9-5cae-80d2-3b788179c9cb.png">
最も安い時に買い、高い時に売りぬけることで、最大の利益はいくらになるか算出する問題です。
現実には先々の値段がわかっていることはまずないですが、相当精度の高い時系列予測モデルができていればワンチャン？なアルゴリズムですかね。

#### 解答・解説

##### 解法1
解法を思いつくのは難しく無いと思います。
今回の問題は時間計算量はどう頑張っても[tex:O(n)]というところなのでアルゴリズムの比較はせず、簡潔なコードとイマイチなコードを並べておきます。

まずは私のsubmitしたコード。

```python
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        ans = 0
        if prices:
            buy = prices[0]
            for price in prices[1:]:
                if price < buy:
                    buy = price
                if price - buy > ans:
                    sell = price
                    ans = sell - buy
        return ans
```

コードの意味は非常にシンプルで、買値buyは安い値段があれば置き換え、売値sellは利益ansを超える利益が出るようなら置き換える、という操作を要素数分繰り返しているだけです。

続いてDiscussionで見つけた5 lines solution。

```python
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        max_profit, min_price = 0, float('inf')
        for price in prices:
            min_price = min(min_price, price)
            profit = price - min_price
            max_profit = max(max_profit, profit)
        return max_profit
```

コードの意味は私のsubmitしたものと同じですが、とても簡潔ですね。
特に、初期値を max_profit, min_price = 0, float('inf') と設定するところがまだ自分には思いつきませんでした。
python　プログラミング問題 ~基本から2進数まで~

こんにちは、rickyです。

今回はpythonでプログラミングの問題を解く際に詰まった内容をまとめていきたいと思います。

問題は与えられた数字を2進数に変換し、右からn番目の数字を求めるという内容でした。

久しぶりにプログラミングの問題を解いたので一部忘れている箇所があったので備忘録として記述します。
今回の対象者としてはプログラミングの問題を解く際に基本的な内容について学びたい方を対象としています。
一般的な文法については理解しているけど問題を解くのは初めてないし、なれていない方が対象です。

・1行目にスペースで区切られた2つの数字を取得する方法について
プログラミングの問題では1行目に『2 3』といった書き方で値が渡されることが多いです。
その際に前の数字と後ろの数字を分けて変数に格納したい場合に以下の書き方で取得します。

a,b = input().split()

https://qiita.com/863/items/b970d2f376c1e16c921bより抜粋

・型変換
プログラミングの問題では適宜型の変換が要求されます。
例えばstring型で入力された数字をint型に直す作業が必要な場合があります。
その際には以下の書き方で対処しましょう。

a = int(a)

https://note.nkmk.me/python-str-num-conversion/参照

・型を調べる
この内容はプログラムの中身について調べたいときに役立つ内容になります。
変数の型を調べることでエラーの特定につながるので覚えておいて損はないです。

print(type(a))

https://note.nkmk.me/python-type-isinstance/参照

・数字を2進数で表現
今回の問題の核となる数字を2進数で表す内容について以下の関数を用います。
(なお変数aには10進数の数字が入っているものとする)

a = bin(a)

https://qiita.com/umeda_takumi/items/29cf4ecd7f9c33f79336参照

今回はここまでとなります。
調べれば簡単に分かる内容ですが、便利なので覚えておいた方がいいと思います。
この内容がプログラミングの問題を解く際にお役に立てれば幸いです。
ここまで読んでいただきありがとうございました。
インスタンス変数、クラス変数、クラスインスタンス変数のまとめ

基礎的なところの認識が曖昧になってしまっていたため、復習のためにまとめておきます。

## 1. インスタンス変数
インスタンスごとに独立して持つ変数。

- インスタンス変数にアクセスできるのは、initializeメソッドとオブジェクトのインスタンスメソッドだけ
- initializeメソッドで初期化されて、その後各インスタンスメソッドから参照・変更される使い方が多い（と思う）

### 1-1. 定義
変数名の前に「@」をつけて定義する

```ruby
@instance_var = 'instance_var'
```

### 1-2. 使い方

```ruby
class Foo
  # 明示的にインスタンス変数を宣言しなくて良い
  # => 宣言した場合、それは「クラスインスタンス変数」と見なされる

  # (o) initializeメソッドからアクセス
  def initialize
    @instance_var = 'instance_var'
    p "#{@instance_var} at initialize"
  end

  # (o) インスタンスメソッドからアクセス
  def xxx
    p "#{@instance_var} at xxx"
  end

  # (x) クラスメソッドからアクセス
  def self.yyy
    p @instance_var
  end
end

# initializeメソッドからはアクセスできる
foo = Foo.new # => 'instance_var at initialize'

# インスタンスメソッドからもアクセスできる
foo.xxx # => 'instance_var at xxx'

# クラスメソッドからはアクセスできない
Foo.yyy # => nil
```

## 2. クラス変数
そのクラスの全てのインスタンスで共有される変数

- クラスとそのインスタンスがスコープになる
- 定数と似ているがクラス変数は何度でも値を変更できる点で異なる
- クラスメソッド、インスタンスメソッド、クラス定義式内でアクセス可能

### 2-1. 定義
変数名の前に「@@」をつけて定義する

```ruby
@@class_var = 'class_var'
```

### 2-2. 使い方
```ruby
class Foo
  @@class_var = 0

  def xxx
    @@class_var += 1
    p @@class_var
  end

  def self.yyy
    @@class_var += 1
    p @@class_var
  end
end

foo = Foo.new

# 同一インスタンス内で値は共有される
foo.xxx # => 1
foo.xxx # => 2

# インスタンスが異なっても、値は共有されている
foo2 = Foo.new
foo2.xxx # => 3

# クラスメソッドからもアクセスできるし、値も共有されている
Foo.yyy # => 4
```

## 3. クラスインスタンス変数
クラスオブジェクトのインスタンス変数
個人的に非常にややこしい。見た目はインスタンス変数なのに、機能的にはクラス変数に近いため。

-  一見するとクラス変数とほぼ同じように使えるが、そのクラスのみでしか参照できない。例えば、そのクラスを継承したクラスではその変数にアクセスできない。
- クラスメソッドからはアクセスできる
- インスタンスメソッドからアクセスすることはできない（クラスオブジェクトのインスタンス変数であるため）
- クラス定義式内で定義される（メソッド内で初期化されない）
- 見た目は通常のインスタンス変数と同じため、混同されやすい

### 3-1. 定義
変数名の前に「@」をつけて定義する
**※ 見た目はインスタンス変数と同じだが、定義する場所がクラス定義式内になる**

```ruby
@class_instance_var = 'class_instance_var'
```

### 3-2. 使い方
```ruby
class Foo
  # クラス定義式内で定義される
  @class_instance_var = 'class_instance_var'

  # クラスメソッド内でクラスインスタンス変数を出力
  def self.xxx
    p @class_instance_var
  end

  # インスタンスメソッド内でクラスインスタンス変数を出力
  # => これはインスタンス変数扱いとなり、参照できない 
  def yyy
    p @class_instance_var
  end
end

# Fooを継承したBarクラスを作成
class Bar < Foo
end

# クラスメソッドからクラスインスタンス変数は参照できる
Foo.xxx # => 'class_instance_var'

# インスタンスメソッドからクラスインスタンス変数は参照できない
# => インスタンス変数とみなされるため
foo = Foo.new
foo.yyy # => nil

# 継承されたクラスからクラスインスタンス変数は参照できない
Bar.xxx # => nil
```
お役立ちになりましたら、
いいねボタン、よろしくお願いします。
AWS 認定 Alexaスキルビルダーの日本語版が公開されたのでスキルビルダーになった話

[AWS 認定 Alexaスキルビルダーになろう](https://aws.amazon.com/jp/blogs/news/alexa-certification-japan/)

というわけで、これまで英語でしか受けられなかったAlexaの認定が日本語でも受けられるようになりました。
以前、[英語版のままの模試を受け](https://qiita.com/ikegam1/items/c6299200d8e8e5d87b59)た結果、本試験については諦めていたのですが、いよいよという事で早速受けて参りました。
まだ結果の詳細は出ておりませんが、受けたてホヤホヤのHotなうちに

# スペック

- 普通のWEBエンジニアでVUI系は業務ではノータッチ
- プライベートでちょくちょくスキル作ってる
- aws認定は7つめ

# AWS 認定 Alexaスキルビルダー 模試

まずは対策と現状認識のため、日本語版での模試を受けておきます。
プラクティスのタダ券があったのでそれを使いつつ。
考えこむような問題は少なく、20分もかからずに終える事ができました。
なお、模試で選んだ業者はピアソンVUE。試験して10分後ぐらいにレポート届いてました。
ちなみにAudioPlayerとかVideo再生のあたりがあまりよくわかってない。APLではそういう事やったりするんだけど、AudioPlayerとかVideoAppとかとちょっと違って混乱する。

結果：

```
AWS Certified Alexa Skill Builder - Specialty Practice を受験いただき誠にありがとうございました。本試験受験前の準備対策のご参考まで、以下の情報をご確認ください。

総合スコア: 65%

トピックレベルスコア:
1.0  Voice-First Design Practices and Capabilities: 100%
2.0  Skill Design: 40%
3.0  Skill Architecture: 66%
4.0  Skill Development: 40%
5.0  Test, Validate, and Troubleshoot: 100%
6.0  Publishing, Operations, and Lifecycle Management: 100%
```

ちょい微妙っすね。。Skill Design, Skill Architecture, Skill Developmentが落第点。基礎が少し足りないのかな。少し準備はしといた方が良さそうだ。

# 試験会場などについて

これまでは秋葉原の歌舞伎町のセンター（PSI）で試験を受ける事が多かったのですが、ピアソンVUEでのテストを受けて見たかったので武蔵小杉のテストセンターにしてみました。
PSIでもセンターによってはカメラ監視があったりなかったりとけっこう違うのですが、ピアソンVUEはまたけっこう違いますね

- 受付で写真撮られた
- 身分証明書はPSIと同じ(免許証とクレカ)
- 免許証は自席に持ち込む必要がない
- UIはシンプルで装飾とかないけどまあまあ使いやすい
- ログインしてから1分くらい(?)次の画面が表示されなくてちょっと焦った
- 耳栓があった
- システムへのログインは共通アカウントっぽくてログイン後に自分の名前を選ぶ。（個人情報的な許諾って最初にあったんかな？）
- 早めに受けるのは自由
- パーティションが低くて他の人が移動してるのが見える。

印象としては悪くないです。リラックスもしやすい。

# 本試験

まず結果からいうと無事合格はできました！
ただ、そんなに余裕はなかったですね。
ぜんぜんわからない（というか知らない）のもいくつか。

これから受けようと思ってる方へのポイントをいくつか。

- なんでもいいのでカスタムスキルを作成し、公開申請してみましょう（そしてできれば審査を一度蹴られましょう。蹴られた理由が重要です）
- 公開後のアップデートもやりましょう
- AudioPlayerのスキルを公開しない前提でもいいので一つ作ってみると良さそうです
- aws的なとこではLambda、S3、DynamoDbのあたりを触っておきましょう
- AMAZONの標準ビルトインインテントについてを理解しておきましょう
- カスタムスキル以外もさらっと把握しておきましょう
- 模試受けておく
- サンプル問題も解いておく
- [このあたり](https://developer.amazon.com/ja/docs/ask-overviews/build-skills-with-the-alexa-skills-kit.html)に目を通しておきましょう

だいたいこんなところかなぁ。
日頃、アレクサスキルを作っている方であれば、おおよそはなんとなく解けるかと思います。
個人的にはこれまで受けたaws認定の中では一番楽ちんだった。試験も60分くらいで終えて、のんびり見直してみても90分かからなかった。
ポイントとしては幅広いタイプのスキルの作り方を知っておく事かなと。

なお、試験を終えたのが16:30前で、今現在は18:40。さすがにまだ結果レポートは届きません。
結果が届き次第、この記事は更新されます。

# 最後に。

さて。
この認定、何に役立つのやら。
業務でalexaスキル作る日がくるといいなー。なんかガチなやつ。

# 結果を追記

結果、いただきました！
8/14の日本時間4:17に受信。試験からおおよそ36時間ですね。
スコア的にはぼちぼち余裕あり。安全圏内でした。AudioPlayerスキルがわかってればもうちょいいけたなー。

受験者スコア: 838 
結果: 合格

The AWS Certified Alexa Skill Builder - Specialty (AXS-C01) の試験結果は、100 から 1000 の
間の値で示されます。合格に必要な最低スコアは 750 です。
おめでとうございます。AWS Certified Alexa Skill Builder - Specialty に合格し、AWS 認定資格
を取得されました。

![スクリーンショット 2019-08-14 7.37.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308709/c6ee9ecf-8ac7-0395-90bf-aa758f22575e.png)
Visual Studio Code Remote Developmentを利用してVisual Studio CodeとJupyter notebookをリモートで実行する

#要点
リモートPCのVS Code実行環境とjupyter notebook実行環境をVisual Studio Code Remote Developmentを利用して超簡単にローカルPCからで実現する。
Google colabなどもあるが、非力なモバイルPCで簡単にリモートのPCスペックを利用した開発が可能。リモートPCにはVS Codeが入っていなくてもOK。

#環境

- リモートPC:Ubuntu18.04。ssh環境構築済み。
- ローカルPC：Macbook 2017 Mojave。Visual studio codeインストール済み。

#Visual Studio Code Remote Development
1．ローカルPCにVisual Studio Codeをインストール
2．[Visual Studio Code Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)をインストール
3．~/.ssh/configに設定してあるssh接続先がCONNECTIONSに一覧化されるので、選択すると該当するssh接続を利用してVS Code経由でリモートコード実行が可能。
4．さらにForwarded Portsにjupyter notebookのポート(デフォルトだと8888)を指定し、リモートPC上でjupyter notebookを起動すると、ローカルPCブラウザ上でlocalhost:8888を開くことでリモートPCのjupyter notebookを実行できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439094/3af6d459-f5c6-3ae0-0b0a-296c92cf953c.png)
Veturのテンプレート解析機能でCSS Modulesの$styleを警告しないようにする

VSCode 拡張である [Vetur](https://github.com/vuejs/vetur) の設定で [Template Interpolation Service をオン](https://slides.com/ktsn/analyzing-vue-template-with-typescript-compiler#/3)にすると、 TypeScript コンパイラによる Vue テンプレートの解析が有効になることを勉強会で知りました[^1]

![vscode-vetur-02-fix.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137045/eeefebfd-486f-8654-7b3d-1a477569e4a1.gif)

上図のように、 `data`, `computed`, `props` 等で定義されたプロパティ `message` がサジェストされて非常に便利です。
しかし、 [Vue.js で CSS Modules を用いる](https://vue-loader-v14.vuejs.org/ja/features/css-modules.html)際に注入される `$style` というプロパティに対して警告が出るようになってしまったため、この警告を回避するようにしてみました。


# 動作環境
- macOS Mojave
- Node.js 10
- @vue/cli 3.10.0
    - Vue 2.6.10
    - vue-loader 15.7.1
    - typescript 3.5.3
- VSCode 1.37.0
    - Vetur 0.22.0

# プロジェクトを作成
[vue-cli でプロジェクトを作成](https://cli.vuejs.org/guide/creating-a-project.html)します:

```bash
vue create css-modules-vetur-test
# Manually select features を選択し TypeScript をインストールする
cd css-modules-vetur-test
```

(vue-cli をグローバルにインストールしたくない場合は `vue` コマンドの代わりに `npx @vue/cli` でもOKです)

# `shims-vue.d.ts` ファイルの編集
`Vue.prototype` による拡張をする場合の型定義[^2]と同じようにして警告を回避します。

以下を `src/shims-vue.d.ts` ファイル上部に追記します:

```typescript:src/shims-vue.d.ts
import Vue from 'vue'

declare module 'vue/types/vue' {
  interface Vue {
    $style: { [className: string]: string }
  }
}
```

`<style module>` の中で定義されたclass名まではサジェストしてくれませんが、警告を回避することができました:
<img width="394" alt="vscode-vetur-03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137045/0fc9e7c4-d476-d31c-e302-7bf173083c12.png">


[^1]: [TypeScript コンパイラを活用した Vue テンプレートの解析 Meguro.es # 22 @ メルカリ](https://slides.com/ktsn/analyzing-vue-template-with-typescript-compiler)
[^2]: [typescript+vueで独自プラグインを実装する方法](https://qiita.com/gaku3601/items/86b5741eff83fa40ef5a)
続・m5stackでストップウォッチを作る

#続・m5stackでストップウォッチを作る
前回記事の続きになります。
>m5stackでストップウォッチを作る
https://qiita.com/zasshyu6/items/c0bd9bb592192b3c80e7

##前回の振り返り
 - `5usec`周期でタイマをカウント
 - マルチスレッドで動かすと色々と不具合が発生
    - 4secぐらいでリセットがかかる(`vTaskDelay()`をかけると止まらない)
    - ボタンを押してもタイマが止まらない時がある


前回記事を読んでいただいて以下のご指摘を受けました

- 'core1'で二つタスクが回ってるので`WDT`で引っかかっているのでは？
    - `esp_task_wdt_feed()`関数を時間切れ前までに呼ぶといい

##試すこと
 - マルチスレッドで止まらないように作る
 - ボタンで止まるようにプログラムを変更
 - ついでに画面ちらつきが気になるので直してみる

全部修正したmain.cppをgithubに上げました。
https://github.com/zasshyu66/m5stack_Study/tree/master/StopWatch3

####マルチスレッドで止まらないように作る
`esp_task_wdt_feed()`関数を調べてみたらどうやら`ESP-IDF`の関数だった模様
`arduino`からは呼び出せない上に、`WDT`にアクセスする方法が見当たらなかったので別の方法を考えてみます

 1. `Core0`で`Thread1`,`Core1`で`loop`を動かす
    - 4secくらいでやはり止まる。 
 2. `vTaskDelay(1)`を`Thread1`に入れる
    - 前回と同様にしっかり動く。`loop`は別処理で監視周期呼び出しがあるのでこれで二つのtaskが監視周期をもつことになる
    - ちなみに`vTaskDelay(0)`だとビルドは通るが4secくらいでリセットがかかります


`loop`の監視周期を外そうとか、`CONFIG_FREERTOS_HZ`を変更するとか、監視やクロック関連をいじるのも視野に入れましたが、ファイル管理の面で手間がかかるため却下しました。
`ESP-IDF`を使う理由ができたかもしれない・・・


####ボタンで止まるようにプログラムを変更
これはチャタリング防止の部分のバグでした
マルチスレッド関係なかった
チャタリング防止を修正で完了

####画面ちらつきが気になるので直してみる
画面のちらつきが気になる・・・ので直したい
以下の記事が出てきました。

>M5Stackでいろいろやってみた。
https://togetter.com/li/1214295?page=3

`TFT_eSPI library`の`Sprite`を使えばいいらしいが・・・どうやって使えばいいんだ・・・
色々調べてみたら`platformio`がサンプルを出してくれていた

>TFT_eSPI by Bodmer
https://platformio.org/lib/show/1559/TFT_eSPI/examples?file=Print_Smooth_Font.ino

`TFT_eSPI library`が基本的に公式の`LCD API`とほぼ同じ使い方ができる
~~`Sprite`とは・・・~~
大きいのは文字の設定が文字の色と背景色を選択できること
`LCD API`の場合はほんとに上書きだけなので文字が重なるのだが、`TFT_eSPI library`だと背景色と文字の描写なのでそのまま上書きできる
だから文字位置を覚えておけばそこから改行して書き直せばよいだけになるので考え方がだいぶ楽になります

##次にやること
次にパルスカウンターを作ります。
エンコーダを買いたかったけど千石電商に売ってたのは一回転で24plsのものだけだった・・・
でも買えたのでそれを使ってパルスカウントと回転速度を表示するプログラムを作ります


・・・余談ですが今回の調べものや記事を書いている途中でマウスのホイールが壊れました
まさかホイールの回転を見るスイッチにつながってる軸が折れるとは思わなかった