OmniAICreator/Qiita-1.07M huggingface dataset:
PyInstallerで作成した実行可能ファイル(.exe)が動かないときの調査方法

# 事象

PyInstallerでexeを作って実行したが動かない。
VSCodeからは動く。
exe化するとローカルでも動かない。

# 調査方法

--noconsole"を外して、--debug allをつける。
--noconsoleをつけたままだと、大量のポップアップで泣く。
--debug allをつけることで、コマンドプロンプトに大量のログが出力されるようになる。

```Python
pyinstaller myprogram.py --onefile --debug all
```

```
[12808] PyInstaller Bootloader 3.x
[12808] LOADER: executable is C:\******
[12808] LOADER: homepath is C:\******
[12808] LOADER: _MEIPASS2 is NULL
...
[6072] PyInstaller Bootloader 3.x
[6072] LOADER: executable is C:\******
...
[6072] LOADER: Runtime option: v
[6072] LOADER: Initializing python
import _frozen_importlib # frozen
import _imp # builtin
import '_thread' # <class '_frozen_importlib.BuiltinImporter'>
import '_warnings' # <class '_frozen_importlib.BuiltinImporter'>
import '_weakref' # <class '_frozen_importlib.BuiltinImporter'>
# installing zipimport hook
import 'zipimport' # <class '_frozen_importlib.BuiltinImporter'>
...
```
こんな感じで1000行近く出力される。

テキストに貼り付けて、errorを検索する。

```
import 'myprogram_config' # <pyimod03_importers.FrozenImporter object at 0x03E5C3B0>
Traceback (most recent call last):
  File "myprogram.py", line 16, in <module>
OSError: [WinError 123] ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。: ''
[6072] Failed to execute script myprogram
[6072] LOADER: OK.
[6072] LOADER: Cleaning up Python interpreter.
```

おそらくこれが原因。

# 今回の問題

```Python:改修前
# ルートディレクトリ変更
os.chdir(os.path.dirname(__file__))
```

[python 指定 os.path.dirname(__file__) は空を返します。](https://code-examples.net/ja/q/76c38c)

```Python:改修後
# ルートディレクトリ変更
os.chdir(os.path.dirname(os.path.abspath(__file__)))
```

プログラムがおいてあるパスを取得したかっただけなんだけど、
前者はexeにしたときはだめらしい。
Highcharts : データラベルのふちどりを消す

## データラベルがデフォで縁取られる

![hc1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42946/c33d6ecb-9f59-98e9-b82d-704a03ab37a6.png)

Highchartsの円グラフにデータラベル（グラフ内へ項目名）を配置したら、テキストが縁取られるのがうすらダサいので対処した。

ちなみにこの状態のコードは以下。

```javascript
Highcharts.chart('pie1', {
    chart: {
        type: 'pie'
    },
    title: {
        text: ''
    },
    tooltip: {
        pointFormat: '<b>{point.percentage:.1f}%</b>'
    },
    plotOptions: {
        pie: {
            cursor: 'pointer',
            dataLabels: {
                enabled: true,
                distance: -40,
            }
        }
    },
    credits: {
        enabled: false
    },
    colors: ['#37BEF0', '#31AAD6', '#2B96BD', '#F09600', '#D68400','#BD7400','#32B400','#2C9C00','#258200','#FF6600','#E65C00','#CC5200'],
    series: [{
        name: 'operator',
        colorByPoint: true,
        data: [{
            name: '項目1',
            y: 7
        }, {
            name: '項目2',
            y: 3
        }, {
            name: '項目3',
            y: 3
        }]
    }]
});
```

## 解決方法

![hc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42946/5a6b3ba6-bbf4-9d25-7cdc-e5cdd954f4e5.png)


```javascript
dataLabels: {
    enabled: true,
    distance: -40,
    style: {
        textOutline: 0
    }
}
```

データラベルの`style`オプションで`textOutline: 0`を加えるだけでした。


## 出典

https://stackoverflow.com/questions/32311174/remove-highcharts-datalabel-border
RDBMSの切り替えについて

Rails6 から 利用DBを途中で変更するコマンド db:system:change が追加されました。

早速試すことにしました。

##実験
Postgres から MySQL に変更。

```bash
$ rails db:system:change --to=mysql
    conflict  config/database.yml
Overwrite /home/noriyuki.amari/training/rails-template/config/database.yml? (enter "h" for help) [Ynaqdhm] Y
       force  config/database.yml
        gsub  Gemfile
        gsub  Gemfile
```

つまり、config/database.yml と Gemfile を書き換えるだけですが、
自分でいちいち書き換えなくて良くなって便利ですね。

使う機会はあまりない気もしますが、、、
Pythonでシーザー暗号（漢字含む）

# シーザー暗号
[シーザー暗号 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B6%E3%83%BC%E6%9A%97%E5%8F%B7)
アルファベットを指定された文字数分ズラすという、原始的な暗号化手法です。
最も単純な換字式暗号の一つであり、文字から文字に1文字単位で変換する方式（単純換字暗号）だそうです。
暗号というよりは、いわゆる「鏡文字」みたいなものなので、まじめに暗号化するものとは少し違うかと思われます。

# 実装（アルファベット・数字のみ）

アルファベット、数字のみの場合は、pythonの組み込み関数のROT13を使えばできます。
`codecs`モジュールをインポートして`codecs.decode()`を使って変換します。
Wiki曰く、伝統的にこういう場合はシフト数は13らしいです。
13にしておけば、アルファベットは26文字なので、同じ関数で暗号化と複合化をこなせるからかと思われます。
ちなみにシーザー暗号ではシフト数は3だったそうですね。

```python
import codecs
codecs.decode('Hello, World!', 'rot13')
# 'Uryyb, Jbeyq!'
codecs.decode('Uryyb, Jbeyq!', 'rot13')
# 'Hello, World!'
```

# 実装（漢字含む）
今回は、漢字を含む文字列のデータのマスキングが必要だったので、自前で作りました。
ただし、以下の通りの制約を設けました。

- 制約
 - 記号 そのまま（変換しない）
 - アルファベット 数字はkeyで設定した文字分だけズラす。ズラす先はループして指定（X→key:5→C）
 - かな・カナ・漢字 1文字以上（次に存在する文字が存在するまで※）

※かなカナ漢字は、keyの数字に関係なく1文字ズラすコードにしています。理由は後述します。

以下、実装したコードです。
plaintextの部分に文字列を渡して、出力として暗号化された文字列が返ってくる関数です。
keyの情報は関数内に入れ込みました。

```python
def caesar(plaintext):
    key=13    # アルファベットおよび数字について文字コードをズラす数を決める
    enc="cp932"    # 文字コードを指定する
    ciphertext = ""  # 暗号化した文字を1文字ずつ追加していくための変数を定義しておく
    for ch in list(plaintext): #1文字ずつ走査し、if分を使って文字コードの数字から文字の種類を判定する
        #記号
        if (' ' <= ch <= '/') or (':' <= ch <= '@') or ('[' <= ch <= '`') or ('{' <= ch <= '~') or ('、' <= ch <= '◯') :
            ciphertext +=chr(ord(ch))
        #A-Z
        elif 'A' <= ch <= 'Z':
            ciphertext += chr((ord(ch) - ord('A') + int(key)) % 26 + ord('A'))
        #a-z
        elif 'a' <= ch <= 'z':
            ciphertext += chr((ord(ch) - ord('a') + int(key)) % 26 + ord('a'))
        #0-9
        elif '0' <= ch <= '9':
            ciphertext += chr((ord(ch) - ord('0') + int(key)) % 10 + ord('0'))
        #その他（ひらがなカタカナ漢字など）
        else:
            byte=bytearray(ch.encode(enc)) # 文字コードを指定してエンコードする、この出力は2バイトのbyte列になるのでbytearrayに変換してから扱う
            while(1): # 文字が存在する文字コードにぶつかるまで、1ずつバイトをズラしていく
                try:
                    try:
                        byte[-1]+=0x01  # 末尾バイト部分を1bitズラす、
                    except:
                        byte[-1]=0x00   # 繰り上がり考慮。末尾バイトを00に戻して次バイトをインクリメントする
                        byte[-2]+=0x01  
                    x=byte.decode(enc)  # encでデコードしてみて、エラー発生を検知する
                except:
                    pass
                else:
                    break
            ciphertext += x
    return ciphertext
```

# 補足
漢字は次に存在する文字までズラす、という意味を説明します。
漢字の場合、次の番地に文字が定義されていないケースがあります。
たとえば、文字が存在しない文字コードの例が以下です。

![文字が存在しない文字コード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507249/335db85a-7813-e8e9-ee8f-bfc21ec08a58.png)

この場合、"入"のとなりの番地には文字が指定されていません。
このとき、文字コードを+1してからその文字コードを文字に直そうとすると（0x93FC→0x93FD）、
0x93FDという文字は存在しないため、エラーとなってしまいます。
したがって、文字が存在する番地になるまで、+1を繰り返す、という動作を加えています。
この場合、"入"は"如"になります。
ただし、今回はズラす量を1と想定しているので、これ以上なにもしていませんが、
もし2以上にしたい場合、「"乳"も"入"も、"如"に暗号化されてしまう」みたいな状況になるので、相応の改変してください。
この関係上、かなカナ漢字は「keyで指定した文字数」に関係なく「1つだけ隣にズラす」というプログラムになっています。
とにかく、ズレて戻せさえすればそれでよかったのでそうしました。

※もろもろの判定にtry-except構文を使っているのはさすがにひどいような気がします。
取り急ぎ仕事で動けばよかっただけなので、だれか追記お願いします。
【Oracle Cloud】1.使ってみる

- OCI(Oracle Cloud Infrastructure)も無料枠があるので試してみたいと思います。
- まずは↓にアクセス

https://www.oracle.com/jp/index.html

- **Oracle Cloud無償ティア**をクリック
<img width="1657" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/dbf8fb97-0165-6c26-b734-00810dbaa311.png">

- **今すぐ始める（無償）**をクリック
<img width="1510" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/65eed86e-798c-b60a-b5e4-a7cb368f8de9.png">

- メールアドレスを入力し、国をJapanにしてNext
<img width="823" alt="03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/90cdaed3-62a9-8e62-8798-daf8f9e8bd1d.png">

- **¥33,000**分の無料枠がある
- 今回は個人で検証するので**Personal Use**を選択し、いろいろ入力し**Net:Verify Mobile Number**をクリック
<img width="826" alt="04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/0aaeea0b-1753-ef81-ec84-a94b715496e8.png">
<img width="762" alt="05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/614f130e-7ed6-aea6-78f7-ca554dc59d44.png">

-　いろいろ入力していったらログイン画面が現れる
<img width="1645" alt="08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/81bd56e0-49a8-5fc0-9e8f-671303827a5e.png">
- ログインするとこんな画面
<img width="1672" alt="09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/5280037b-a3eb-f7b2-cd83-44336d0368d3.png">
Web関係の標準化文書一覧

# はじめに
困った時に、１次情報を調べるようにしていますが、Web関係で調べた情報を一覧として残していきます。まずは、Content-Typeの定義を載せます。

## Content-Type 一覧
- [Content-Type 一覧]( https://www.iana.org/assignments/media-types/media-types.xhtml) : 
HTTPでは、送受信する情報の種類を、`Content-Type`として相手に伝えます。この文字列は、 [IANA](https://www.iana.org/)が定義しています。
一覧は、[ここ]( https://www.iana.org/assignments/media-types/media-types.xhtml)から取得できます。

## HTTPのキャッシュ
- RFC7234: (RFC2616の更新版) [Hypertext Transfer Protocol (HTTP/1.1): Caching](https://tools.ietf.org/html/rfc7234) 
- RFC7232: (RFC2616の更新版) [Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests](https://tools.ietf.org/html/rfc7232)
残ってしまうリモート追跡ブランチを一括削除する方法[コマンド・SourceTree]

Gitの基礎だと思いますが、備忘録として残します。

merge済みのRemoteのブランチを削除していたとしても、ローカルには残っています。
（SourceTreeで言うと、REMOTESの中にたくさん残ってしまいますね）

それを一つ一つ削除するのも面倒だったのでコマンドで…

```
git fetch -p
```
`-p` は `-prune`の略で、
「取得後、リモートに存在しなくなったリモート追跡ブランチを削除します」
と説明されていました。

まさに欲しかった機能です。

と、ここまで書いて、念の為にSourceTreeをチェックしたところ、
同一機能がきちんとありました。

メニューのRepository -> Fetch
で上から2番目のチェックを入れれば良さそうです。
![スクリーンショット 2019-10-31 11.30.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/23e67140-2a95-e70f-ddd6-cc20809b661d.png)

ありがとうございました。

##参考
https://git-scm.com/docs/git-fetch/1.7.0
php7.2からeach()関数は非推奨になった

この関数は、配列のkeyとvalueのペアを返す関数ですが、
foreachよりもループが遅く、PHPそのものの変更に伴って実装上の問題を引き起こしたことから非推奨になったそうです。

通常はlist関数と併用することが多いですが、普通にforeachを使えば十分なのであまり困ることはないかと思います。

```php
// 関数サンプル

$foo = ["test1", "test2", "test3", "test4"];
$bar = each($foo);
var_dump($bar);
```

```
出力結果
ーーーーー
array(4) {
  [1]=>
  string(5) "test1"
  ["value"]=>
  string(5) "test1"
  [0]=>
  int(0)
  ["key"]=>
  int(0)
}
```

なお、PhpStorm（本環境は2019.2）上では下記のように非推奨関数として打ち消し線が表示されています。

![スクリーンショット 2019-10-31 11.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/7bd83099-bb66-98ec-5d9e-7eafb52a15c8.png)

https://www.php.net/manual/ja/migration72.deprecated.php
https://www.php.net/manual/ja/function.each.php
jQuery読み込みに関するメモ


jQuery読み込み順番についてのメモをして行きたいと思います。

## 関連するエラー

~~~
uncaught referenceerror: jquery is not defined
~~~
こんなエラーが出た場合に疑いたいことは

1. 読み込み順序
1. 多重読み込み

これを疑いたくなります。

### 読み込み順序

まずこのケースです。

~~~
<html>
<head>
<script>jQuery(functrion)(){
alert('fdas');
})</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
</body>
</html>
~~~

この場合には、jQuery読み込まれる前にjQueryの機能を利用しようとするので、jQueryが見つからないエラーが出ます。

~~~
uncaught referenceerror: jquery is not defined
~~~

### 多重読み込み
意図せずにこのケースに陥る場合があります。例えばWordPressだとテーマで読み込まれていることに気が付かずに、
自分でもjQueryを読み込んでしまうといった場合に発生します。バージョンが違いで、古い方で定義されていない関数を利用すると、
エラーになってしまいます。

~~~
Uncaught TypeError: jQuery(...).ex is not a function
    at
~~~

こんなエラーが出ます。

~~~
<html>
<head>
<script>
jQuery(functrion)(){
jQuery.ex('fdas');
})
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> ### versionが違う
</head>
<body>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.n.m/jquery.min.js"></script> ### versionが違う
</html>
~~~

この場合、下の方が有効になるので、現行バージョンよりも新しい場合、または古い場合に、
意図した関数が利用できずにエラーになる場合があります。


[【jQuery】プログラム動かない時に確認すること](http://mikaduki.info/os/centos/1192/)
TerraformのProvider Official化 はじめてみました

## はじめに

自社サービスの [Enterprise Cloud](https://ecl.ntt.com/) について、僕らのチームでTerraform用のCommunity Providerを公開しています。

https://github.com/nttcom/terraform-provider-ecl

で、これをOfficialにしてみようという取り組みをはじめました。

それについて現時点でできたことを書いてみます。
申込み自体は意外とシンプルな手続きだったので、もし参考になればと思いまして。

## 本ページで書いてあること

- Terraform ProviderをOfficial認定してもらうための申込み方法

## 本ページで書いてないこと

- Providerの開発方法
- ProviderのOfficial化挑戦に関する成否（まだどう転ぶか全然わかりません）


## Official Providerを申し込むにあたって

進め方は [こちら](https://www.terraform.io/guides/terraform-provider-development-program.html) に書いてあります。
どうやら最初の1, 2点のリソースくらいの規模の段階から申し込んでおきつつ、段階的に対応リソースを広げていく・・・というやり方も可能なようですね。
今回の僕らの場合、もうほぼ出来上がっているのですが今後拡張もしていく予定なので参考になります。
読み進めていくと申し込む方法が出てきます。

## 申し込み方法

フェーズとしては、 **Engage** という部分が申し込みに該当するようです。

> 1. Engage
> Please begin by providing some basic information about the provider that is being built via a simple webform.

このwebformのリンクをたどるとこんなフォームが見えます。

![screencapture-docs-google-forms-d-e-1FAIpQLSe5TjsThekgY0nUZan8M8JFVFk2qFC0shR6Fwpggn8XhhoHdg-viewform-2019-10-31-10_45_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/fb4a60b8-0582-cea9-21ae-5778d8d11079.png)

これに書いて送信すれば良いだけのようです。

殆どの情報はすぐかけるので、自分たちの状況に特化した内容だけ書きます。

### GitHub repo

現状の公開リポジトリを書いておきました。

https://github.com/nttcom/terraform-provider-ecl

### Infrastructure test account credentials

https://keybase.io/encrypt#terraform へのリンクがあるのですが、これを使って認証情報をencryptして送るようです。

例えば実際にTerraformを使う際、*provider.tf* みたいな感じで認証情報を定義すると思います。

```go
provider "ecl" {
  auth_url          = "https://keystone-sg1-ecl.api.ntt.com/v3/"
  user_name         = "********************"
  password          = "********************"
  tenant_id         = "********************"
  project_domain_id = "default"
}
```

これを、

https://keybase.io/encrypt#terraform のフォームに貼り付けてEncryptボタンを押すと変換結果が出て来ます。
その文字列を貼り付けておきました。

```
-----BEGIN PGP MESSAGE-----
Version: Keybase OpenPGP v2.1.3
Comment: https://keybase.io/crypto

(略)

-----END PGP MESSAGE-----
```

### List of resources

provider.goを貼ってしまえばいいかなとも思ったのですが、とりあえずdatasourceは除外しresource名だけを抜き出してみました。

```
ecl_compute_instance_v2
ecl_compute_keypair_v2
ecl_compute_volume_attach_v2
ecl_compute_volume_v2
ecl_dns_recordset_v2
ecl_dns_zone_v2
ecl_imagestorages_image_v2
ecl_imagestorages_member_accepter_v2
ecl_imagestorages_member_v2
ecl_network_common_function_gateway_v2
ecl_network_gateway_interface_v2
ecl_network_internet_gateway_v2
ecl_network_network_v2
ecl_network_port_v2
ecl_network_public_ip_v2
ecl_network_static_route_v2
ecl_network_subnet_v2
ecl_security_host_based_v1
ecl_security_network_based_device_ha_v1
ecl_security_network_based_device_single_v1
ecl_security_network_based_waf_single_v1
ecl_storage_virtualstorage_v1
ecl_storage_volume_v1
ecl_vna_appliance_v1
```

現時点でやったことはここまでです。
進展がありましたらまたこちらに書いていこうかと思います。:raising_hand_tone1:
ruby ?や!のついたメソッドの使い方


# !
- upcase
 - 文字列を大文字で返すメソッド

```
name = "sasaki"
puts name.upcase    
puts name
```
実行結果：SASAKI


- upcase!
 - 文字列を大文字で返しつつ、元の文字列も大文字に書き換えるメソッド
 - 破壊的なメソッド

```
puts name.upcase!
puts name
```
実行結果：
SASAKI
SASAKI

※もし小文字として使用したいなら戻す必要あり

- downcase
 - 文字列を小文字で返すメソッド

```
name = "SASAKI"
puts name.downcase
```
実行結果：sasaki

- reverse
 - 文字列を逆順に返すメソッド

```
name1 = "sasaki"
puts name1.reverse
```
実行結果：ikasas

# ?
- 真偽値 true false

```
p name1.empty?  #nameの中身が空かどうか
p name1.include?("")  #nameの中に"k"が含まれているかどうか
```
実行結果：
false
true
linphone-sdkをビルドする

誰得な気がしますが、情報少なすぎる気がするので、投稿します。
もともとWindows UWP向けにビルドしたかったんだけど、上手くいかずとりあえずLinuxだとビルド出来ることの確認で。

## 環境

- OS : Ubuntu 19.10 x64(VultrのVPS)
    - 4core / 8GB

## ビルド環境構築

移行の操作はビルドし終わったら環境を壊すつもりで作っているので、すべてroot権限で操作してます。

```
# sudo apt-get install cmake cmake-curses-gui doxygen python-pip python-setuptools  nasm yasm \
 libx11-dev build-essential  make pkg-config libx11-dev libxv1  libpulse-dev pulseaudio libasound2-dev pavucontrol
# pip install pystache
# pip install six
```

## ビルド

```
# git clone https://gitlab.linphone.org/BC/public/linphone-sdk.git --recursive
# cd linphone-sdk/
# mkdir build
# cd build
# cmake ..
# ccmake .
# cmake --build . --parallel <number of jobs>
```

最後のコマンドの parallel は並列してビルドするためのパラメータです。
ビルドが失敗したときに何が原因が分かりにくいため、上手くビルド出来なかったときは、パラメタを外してみてください。

build/linphone-sdk/desktop/ 配下にビルドされたファイル群が出力されます。
Vueでcss書く時に意識していること

## 汎用クラスを使う

bootstrapやVuetify使ってるなら汎用クラスが備わってるのでそれを使いましょう。

[Spacing · Bootstrap](https://getbootstrap.com/docs/4.3/utilities/spacing/)

[Material Component Framework — Vuetify.js](https://vuetifyjs.com/ja/styles/spacing)

以下のようなスタイル指定はhtmlが`ul`から`ol`に変わった場合に、スタイルも併せて変更する必要があります。汎用クラスを使っておけばhtmlのみの変更で済み、冗長なスタイルの指定も不要です。（1要素に2個くらいまで）

``` html
<template>
  <div>
    <p>リスト</p>
    <ul class="mt-1"> 
    </ul>
  </div>
</template>

<style scoped lang="scss">
ul {
  margin-top: 1em;
}
</style>
```

↓

``` html
<template>
  <p>リスト</p>
  <ul class="mt-1"> 
  </ul>
</template>
```

## コンポーネント単位でクラス名をつける

以下のようにコンポーネント単位でクラス名を付けることで、scopedの複雑な仕様に悩まされることなく書けます。
コンポーネント名とクラス名の1:1を守ればscopedを使わずとも、スタイルが重複することはありません。

出力されるcssのセレクタも`.chat .header`でなく`.chat-header`と1セレクタになるので、レンダリングのスピード的にもよかったはず。

（BEMのelement, modifierの違いは名前から判別できるので全て`-`で繋ぐスタイル。）

``` html:Chat.vue
<template>
  <div class="chat">
    <h2 class="chat-header">チャット見出し</h2>
    <div class="chat-box">
      <p class="chat-box-text chat-box-text-admin"></p>
      <p class="chat-box-text chat-box-text-user"></p>
    </div>
  </div>
</template>

<style scoped lang="scss">
.chat {
  &-header {
    margin-top: 1em;
    font-size: 16px;
  }
  &-box {
    &-text {
      backgroud-color: #ddd;
      &-admin {
        backgroud-color: #333;
      }
    }
  }
}
</style>
``` 

↓ 出力されるcss

```css

.chat-header {
  margin-top: 1em;
  font-size: 16px;
}
.chat-box-text {
  backgroud-color: #ddd;
}
.chat-box-text-admin {
  backgroud-color: #333;
}
```
ruby 文字列オブジェクトについて

#文字列概要


- "" 特殊文字使える、式展開
- \n⇒改行
- \t⇒タブ挿入

```
puts "hello world"
```
実行結果：hello world

```
puts "he\nllo wor\tld"
````
実行結果：
he
llo wor  ld


- '（シングルクォーテーション）では特殊文字を使用することはできない

```
puts 'he\nllo wor\tld'
```
実行結果：he\nllo wor\tld

#文字列の式展開
```
puts "price #{3000 * 4}"
puts 'price #{3000 * 4}'
```
実行結果：
price 12000
price #{3000 * 4}

```
name = "My friends"
puts "hello #{name}"
```

実行結果：hello My friends

```
puts "hello" + "world"
puts "hello" * 5
```
実行結果：
hello world
hellohellohellohellohello
JavaScript（メソッド/オーバーライド）

#メソッド

インスタンスの動作（のようなもの）を**「メソッド」**と呼ぶ。

「名前」や「年齢」などの情報はプロパティで追加したのに対して、
メソッドは「挨拶をする」「値を計算する」などの処理のまとまりを表す。

メソッドはクラスの中で定義する。
書き方:`メソッド名() { }`

メソッドは関数と似たようなもので、中括弧「{ }」の中にそのメソッドで行いたい処理を記述する。

```js

//例
class クラス名 {
	constructor(){
		・・・・・・・
	}
	メソッド名(){
	行いたい処理
	}
}
```

メソッドは、そのクラスから生成したインスタンスに対して呼び出す。
具体的には、以下の図のように「インスタンス.メソッド名()」とすることでそのメソッドを呼び出し、処理を実行することができる。

```js

//例
class Animal{
	constructor(name,age){
		・・・・・・・
	}
	greet(){
		console.log(“こんにちは！”)
	}
}

const animal = new Animal(”バルー”,3);
animal.greet();
```

##this

メソッド内でインスタンスの値を使用するには、「this」という特殊な値を用いる。

書き方:`this.プロパティ名`

```js
//例
class Animal {
	constructor(name,age){
		・・・・・・・
	}
	info() {
		console.log(`名前は${this.name}です。`);
	}			               //↑インスタンスのnameプロパティの値になる
}
const animal = new Animal(“バルー”,3);
animal.info();

//コンソール
名前はバルーです
```

##メソッド内でメソッドを使う

メソッド内に同じクラスの他のメソッドを使うことができる。
書き方:`this.メソッド名()`

>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495605/0a0161b8-e859-0854-d9e7-6f04d85f5124.png)



#継承
すでにあるクラスをもとに、新しくクラスを作成する方法のことを**「継承」**と呼ぶ。
例えば、「Animalクラス」から「Dogクラス」を継承すると、「Animalクラス」の全ての機能を引き継いで、「Dogクラス」を作成することができる。

継承を用いてクラスを作成するには`extends`を用いる。

```js
//例
class Dog extends Animal {
}
```

「Dogクラス」は「Animalクラス」のすべての機能を引き継いでいる。
そのため、「Dogクラス」内にはまだ何もメソッドは定義されていないが、「Animalクラス」に定義されている「infoメソッド」などを使用することができる。

```js
//例
class Animal {
	info(){
		this.greed();
		console.log(`私は${this.name}です`);
		console.log(`${this.age}歳です`);
	}
}
class Dog extends Animal {
}

const dog = new Dog(“バルー”,3);
dog.info();
	//↑Animalクラスに定義されているメソッドを使用できる
```


##メソッドの追加

継承して作成したクラスにも、新しくメソッドを追加することができる。（←独自のメソッド）

メソッドでは、関数と同じように戻り値を用いることができる。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495605/2cb31686-ee15-4ddf-fe44-85ea2dc76edf.png)

子クラスで定義した独自のメソッドは親クラスから呼び出すことはできない。

```js
class Dog extends Animal {
	getHumanAge(){
		return this.age*7;
	}
}
const dog = new Dog(“バルー”,3);
const humanAge = animal.getHumanAge();
					//↑getHumanAgeメソッドはDogクラスにしかないのでエラーになる
```

#オーバーライド

##同名のメソッド

親クラスと同じ名前のメソッドを子クラスに定義すると、子クラスのメソッドが優先して使用される。
これは、子クラスのメソッドが親クラスのメソッドを上書きしていることから、**「オーバーライド」**と呼ばれる。

```js
const dog = new Dog(“バルー”,3);
dog.info();

class Animal {
	info(){
		・
		・
	}
}
class Dog extends Animal {
	info(){
		・
		・
	}
}
```

##コンストラクタのオーバーライド

メソッドと同じように、コンストラクタもオーバーライドすることができる。
例えば、子クラスにプロパティを追加したい場合などに用いる。

コンストラクタをオーバーライドする際は1行目に`super()`と記述する。

子クラスのコンストラクタ内`super()`では、その部分で親クラスのコンストラクタを呼び出している。
親クラスのコンストラクタが引数を受け取る場合には、「super」の後ろの丸括弧「( )」に引数を渡す。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495605/7e8a5787-a1d9-f1c7-4d4e-2b6a34907620.png)
Rust S3から大きいファイルをダウンロード

実装メモ

```rust
use std::fs::File;
use rusoto_s3::{S3Client, S3, GetObjectRequest, HeadObjectRequest};
use std::io::Write;
use futures::stream::Stream;
use futures::future::Future;

fn main() -> std::io::Result<()> {

    // std::env::set_var("AWS_ACCESS_KEY_ID", "YOUR AWS ACCESS KEY ID HERE");
    // std::env::set_var("AWS_SECRET_ACCESS_KEY", "YOUR AWS SECRET ACCESS KEY HERE");

    let bucket_name = String::from("your-bucket-name");
    let s3_object_key = String::from("test.json");
    let region = "us-east-1".parse().unwrap();
    let client = S3Client::new(region);

    let mut request = HeadObjectRequest::default();
    request.bucket = bucket_name.clone();
    request.key = s3_object_key.clone();
    let result = client.head_object(request).sync().unwrap();


    let from = 0;
    // you can write the following request inside foreach by specified buffer capacity.
    let to = result.content_length.unwrap();
    let mut request = GetObjectRequest::default();
    request.bucket = bucket_name.clone();
    request.key = s3_object_key.clone();
    let range = format!("bytes={}-{}", from, to);
    request.range = Some(range);
    let result = client.get_object(request).sync().unwrap();
    let body = result.body.unwrap().concat2().wait().unwrap();

    let mut file = File::create("test.json")?;
    file.write_all(&body)?;

    Ok(())
}
```
今更聞けないユークリッドの互除法(最大公約数)

高校数学で習うユークリッドの互除法をC#で実装します。
https://github.com/ma3100/AlgorithmPrimer/blob/master/FirstAlgorithmForCSharp/First/Euclidean.cs

# ユークリッドの互除法とは？

数Aで習う、2つの整数a,bの最大公約数を求める公式です。
細かい公式は家庭教師のトライさんあたりがしてくれているので割愛します。

https://www.youtube.com/watch?v=246Yxl8gTVk

高校数学では余剰を求める方法で解くのが一般的ですが、今回は減算する方法も紹介します。

# 余剰で求める方法

1. aをbで割って、余りをcに入れる。
2. aにbを、bにcを代入する。
3. cが0でなければ1に戻る。
4. aに入っている値が最大公約数である。

文字でイメージ出来ない場合、以下画像でイメージを膨らませてください。

<img width="175" alt="スクリーンショット 2019-10-31 10.15.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/92ae19e2-c10f-a120-f53c-91b58d1a4b4f.png">

``` division.cs
        public int divisionPattern(int a,int b)
        {
            var divisionValue = -1;

            while(divisionValue != 0)
            {
                divisionValue = a % b;
                a = b;
                b = divisionValue;
            }

            Console.WriteLine($"Answer:{a}");
            return a;
        }
```

# 減算で求める方法

1. aとbの内、大きい方 - 小さい方の答えを大きい方の変数に代入する。
2. aとbが等しくなければ1に戻る。
3. aに入っている値が求める最大公約数である。

文字でイメージ出来ない場合、以下画像でイメージを膨らませてください。
<img width="118" alt="スクリーンショット 2019-10-31 10.37.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/57902a91-3f35-96ff-80b3-7f6192ee47cb.png">


``` minus.cs
        public int minusPattern(int a,int b)
        {
            while(a != b)
            {
                if(a > b)
                {
                    a -= b;
                }
                else
                {
                    b -= a;
                }
            }

            Console.WriteLine($"Answer:{a}");
            return a;
        }
```

# 所感

コンピューター的には、当然余剰で求める方が効率良いです。
数学アレルギーを持つ人に対しては、減算の方が簡単だし驚きも生まれるから場合によっては紹介しても良いのかな程度です。
rubyの数値オブジェクトについて


# 数値
p 4.8.class #何クラスに属しているのか見れる
p 4.8.methods #どんなメソッドをもっているのか

- p 10 + 3 #足し算
- p 10 * 3 #引き算
- p 10 - 3 #引き算
- p 10 / 3 #3
- p 10 % 3 #1
- p 10.0 / 3 #3.33333
- p Rational(2,5) + Rational(3,4) #分数 
- p 2/5r + 3/4r　#上記分数簡単に書いたもの
- p 56.3 round #四捨五入
- p 56.3 floor #小数点以下切り捨て
- p 56.3 ceil #小数点以下切り上げ
Redisコマンド一覧

# Redisコマンド一覧

### redis-cli で接続

```
$ redis-cli -h xxxxx
```

### パスワード認証
```
> AUTH password
OK
```

### データベースを一覧表示する(データベース数)
```
> CONFIG GET databases
1) "databases"
2) "16"
```
上記ではデータベースの数は16です。

### データベース毎のデータ数(キーの数)を表示

```
> INFO keyspace
# Keyspace
db0:keys=1539,expires=1,avg_ttl=12160
```
上記では、db0にkeysが1539件あります。

### データベースを選択

```
> select 2
```

データベース番号で、使用するデータベースを選択します。

### すべてのキーを表示

```
> keys *
```

### 条件に合うキーを表示

```
> key *hoge*
```
hogeを含むキーをすべて表示します

```
> keys [a-c]*
```
a か b か c で始まるキーをすべて表示します

### データをセット
```
> set key value
```
SwiftUI(macOS)でAVPlayerViewを使う

macOSアプリのSwiftUIで動画を再生するAVPlayerViewを使いたい場合は、[NSViewRepresentable](https://developer.apple.com/documentation/swiftui/nsviewrepresentable)に適合するViewを自分で用意する必要がある。

```swift 
import SwiftUI
import AVKit

struct PlayerView: NSViewRepresentable {
    @Binding var player: AVPlayer
    
    func updateNSView(_ NSView: NSView, context: NSViewRepresentableContext<PlayerView>) {
        guard let view = NSView as? AVPlayerView else {
            debugPrint("unexpected view")
            return
        }
        
        view.player = player
    }
    
    func makeNSView(context: Context) -> NSView {
        return AVPlayerView(frame: .zero)
    }
}
```

`makeNSView`で`AVPlayerView`の実体を作った後、`updateNSView`内で`player`をセットする。

```swift 
struct ContentView: View {
    @ObservedObject var videoItem: VideoItem = VideoItem()
    
    var body: some View {
        VStack {
            if videoItem.playerItem != nil {
                PlayerView(player: $videoItem.player)
            }
            Button(action: {
                let panel = NSOpenPanel()
                panel.allowedFileTypes = [kUTTypeMovie as String]
                DispatchQueue.main.async {
                    if panel.runModal() == .OK {
                        guard let url = panel.url else {
                            return
                        }
                        self.videoItem.open(url)
                    }
                }
            }) {
                Text("Open")
            }
        }.frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}
```

View側では、`player`をBindする。

ファイルを読み直した際に、複数の`AVPlayer`が生成されることを防ぐため、`AVPlayer`自体は一つのインスタンスを使い回し、`replaceCurrentItem`で`playerItem`を切り替えていく形で実装するとシンプルになる。

```swift 
import SwiftUI
import AVFoundation

class VideoItem: ObservableObject {
    @Published var player: AVPlayer = AVPlayer()
    @Published var playerItem: AVPlayerItem?
    
    func open(_ url: URL) {
        let asset = AVAsset(url: url)
        let playerItem = AVPlayerItem(asset: asset)
        self.playerItem = playerItem
        player.replaceCurrentItem(with: playerItem)
    }
}
```
設計で気を付けること

##神は激怒した
要件定義から進めていた案件がある。
詳細設計、開発工程までいって、順風満帆だと思われた…のだが。
神の一声[^1]で設計書の手戻りが起きた。
[^1]: 顧客と合意した仕様であったが、第三者の指摘で要件が変化した。所謂メテオフォール型開発である。神が１人で助かった。

今後のため、設計書を見直すときのポイント、
新たに設計するときに気を付けるべきポイントをまとめてみる。

##設計で気を付ける事
###原則は開発工数＜ユーザ利便性
開発者のためのシステムではない。
工数がかかるなら、見積もり出すときに聞けばよい。

###現行システムの保守・機能追加なら親切度を合わせる
本当はあるべきな親切機能だったとしても、既存の機能でやってない事なら慎重に。
なんでここにはあるのに、ここではないの？とか聞かれるリスクがある。

###顧客説明用資料と実設計書の整合性
実設計書を正として顧客説明用資料を捨てるプロジェクトもあれば
顧客説明用資料も同時に修正しないといけないプロジェクトがある。

###開発サイドの意思は明確に示す
A案B案ある場合は、顧客に判断を丸投げしない。
原則はこうしようと思うけどいいですよね？という姿勢で。
判断をゆだねると、先に進まない事が多い。

###画面名、機能名は正式名で書く
開発現場での通称とかで書いちゃう事が多い。

###画面項目名は正式なもので書いているか
「～名」という項目が、が「～名称」という項目名になってたり。

###画面のレイアウトと設計書の項目定義の順序は一致しているか
単体テストで気づくとは思うけど、tabindexとかも見直しが必要。

###画面の遷移方式に変更がないか
ポップアップ、遷移、etc...。

###新規テーブル作るなら、IDに変更はないか
自分が知らない間に進んでる別案件で、いつの間にか採番されて使えなくなってる事がある。
まぁこれはプロジェクトそのものの管理体制の問題だけど。

###DB項目に増減がないか
要件が変化する中で、主キーが変わる場合がある。

###DB項目にお作法がないか
機能的にはいらないけど、暗黙のお作法で主キーに設定しないといけないものとか。
あとは作成日時とか論理削除とか、使わなくても絶対つけようねって項目があったりする。

###制限は変わっていないか
文字数制限とか変化しているとき見落としがち。

###図形の中身も変わっているか
吹き出しとか、フローチャートとか。
一括置換とかしたときに取り残されやすい。
自分の中に旧仕様の知識があるので、見逃しがち。

###バックアップは細かくとる
gitとかあるならブランチ切ってちょこちょこ入れる。
先行して改修したけど、やっぱいらないよねってなる事も多い。
たまに残ってる、ファイルサーバでの人力バージョン管理システムは早く絶滅してほしい。

###体裁を統一する
段落の附番方式、フォント、罫線、英数字の全半角。
MSゴシックとMSPゴシックがこっそり混在してたりする場合がある。
~~全部等幅にすればよいのに~~

あとは設計書の上のほうにある作成日付、作成者、更新日付と更新者とか。新規作成時も更新日付書くのか？
プロジェクトによってルールはまばら。
ここの履歴情報って、バージョン管理システムで対応するべきものだと思うので、廃止していただきたいが・・・。

###リンクとボタン
aタグで画面遷移するやつをリンクというところもあればボタンっていうところもある。
何が違うのって話だけど、使い分けるところもあればどっちかに表現寄せるとこもあるので気を付ける。

###判定条件に可変項目を指定するとき
ユーザが入力する項目を判定条件にする場合は入力パターンを考慮する。
システムでしか入れないと思ってたワードも、手入力される場合があったりする。

###承認が必要？
あれやってこれやってって要件を言われて、それが技術的に実現可能だとしても。
具体的にこの資産のここをこう直しますよっていうのと、本当にその対応していいのかって
いちいち顧客に聞かないといけない場合がある。

##終わりに
他にも出てきたら、追記する。
null安全の観点から見たnull非許容型、null許容非安全型、null許容安全型の比較

# 前置き

## 前置き1

本記事は次の記事へ強く影響を受けております。

* [null安全でない言語は、もはやレガシー言語だ \- Qiita](https://qiita.com/koher/items/e4835bd429b88809ab33)

上で書かれているようなnull安全について少し別の角度から整理することを目的としてこの記事を書きましたが、上記の記事を理解しているならば以下の内容は蛇足かもしれません。

## 前置き2

nullに当たる概念の名称は言語によって微妙に異なりますが(例: Scala → None, Swift → nil)、以下では押し並べてnullと表記します。

# 本記事の目的

以下ではnull安全の共通理解を助けるためにnull安全と関係した3つの型について定義・説明します。

# null安全に関係した3つの型

## 1. null非許容型[^1]

以下の特徴を持ちます:

* 宣言あるいは推論された型の代入を許容する
* nullの代入を許容しない

Javaのプリミティブ型、TypeScriptのデフォルトの型などがこれに当たります。

```java
int a = 10;   // OK
int b = null; // コンパイルエラー
```

```typescript
a: string = 1;    // OK
b: string = null; // コンパイルエラー
```

## 2. null許容非安全型[^1]

以下の特徴を持ちます:

* 宣言あるいは推論された型の代入を許容する
* nullの代入を許容する
* nullチェックやパターンマッチなしに元の型の属性やメソッドへアクセス可能(ただし中身がnullだった場合は実行時例外が発生する)

Javaの参照型などがこれに当たります。

```java
MyClass a = new MyClass(); // OK
MyClass b = null;          // これもOK
a.method1(); // OK
b.method1(); // NullPointerExceptionが発生
```

## 3. null許容安全型[^1]

以下の特徴を持ちます:

* 宣言あるいは推論された型の代入を許容する
* nullの代入を許容する
* nullチェックやパターンマッチなしに元の型の属性やメソッドへアクセスできない

Kotlinのnull許容型、TypeScriptのnull共用型などがこれに当たります。

```kotlin
val a: String? = 1          // OK
val b: String? = null       // OK
b.length                    // コンパイルエラー
if (b != null) { b.length } // OK
```

## 比較表

| 型名             | nullを許容 | nullチェックなしに<br>属性やメソッドへアクセス | 実行時例外が<br/>発生する危険が | 代表例 |
|------------------|------------|---|---|---|
| null非許容型     | しない | n/a | ない | Javaのプリミティブ型<br/>TypeScript |
| null許容非安全型 | する | できる | ある | Java, C#の参照型 |
| null許容安全型   | する | できない | ない | Kotlinのnull許容型<br/>TypeScriptのnull共用型 |

# 言語仕様の観点から見たnullとnull許容型

nullというものは言語仕様の中でも大抵特別に扱われています。
というのも言語処理系としては宣言された型の値のみの代入を許容する(つまりnull非許容型)が最も自然だからです。あえてnull許容型を言語デフォルトとして実装している[^2]のはプログラマーの利便性などを考えた拡張だと言えます[^3]。
ScalaやHaskellなどでは型階層を工夫することでnullを単なる1つの値や型として表現しています。そうすれば言語仕様上nullを特別扱いする必要がないためです。

[^2]: わざわざ言語デフォルトと言っているのは、TypeScriptのように通常通り宣言した場合はnull非許容型、unionを利用してnullも取れるように宣言するとnull許容型のように選択的な提供もできるからです

[^3]: ちなみにこれを最初に行ったのは[アントニー・ホーア \- Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%88%E3%83%8B%E3%83%BC%E3%83%BB%E3%83%9B%E3%83%BC%E3%82%A2)で、後にこのことを1,000億円の失敗だと語っています

# 言語デフォルトの型のトレンド

2012年頃までは多くの産業向き言語でnull許容非安全型がデフォルトの型でした。
C, C++, C#, Java, Objective-Cなどがそれに当たります。
しかし、null許容非安全型を使うことの危険性が広く認知されたことにより2012年頃を境にデフォルトの型がnull許容安全型であるような言語が開発され徐々に普及するようになりました。代表的なものにKotlin, Swift, TypeScriptなどが挙げられます。

# 最近良く聞くようになったnull安全とは何なのか

端的に書くと、null許容非安全型の利用をやめて実行時例外が発生する危険をなくそう、というものになります。
しかし、JavaやObjective-C, C#などでは言語デフォルトの型がnull許容非安全型であるためnull許容非安全型を使わないことは不可能です。
そのためKotlinやSwift, TypeScriptなど言語デフォルトの型がnull許容安全型であるような言語への移行が2019年現在進んでいます。

# 関連リンク

* [null安全でない言語は、もはやレガシー言語だ \- Qiita](https://qiita.com/koher/items/e4835bd429b88809ab33)
* [なぜ null はそのプログラミング言語にあるのか（その1 \- ”無”の無い世界） \- Qiita](https://qiita.com/VoQn/items/a82e13668697d29fbbef)


[^1]: プログラミング言語を横断した統一的な名称がないため、暫定的にこの記事内ではこう呼びます。もっとcanonicalな名前がありましたら教えて下さい。
MaaS Japan と EMot が面白そう

## はじめに

この記事は、本来[こちらのブログ](https://students-tech.blog)で公開予定だったものです。
ちょっとNetlify君が不機嫌なようなので、こちらで公開します。

## MaaS Japan って何？

[MaaS Japan](https://www.maasjapan.net/) とは、小田急グループのひとつである、株式会社MaaS Tech Japan が発表したプラットフォームです。

端的に説明するならば、電車やタクシー、バスなどの公共交通機関を利用するユーザのデータを格納しているデータベースになります。

![](https://japan.cnet.com/storage/2019/05/27/0bbc3bd5a46609e1eaffc496997c0b46/19052701.jpg)
[引用元](https://japan.cnet.com/article/35137546/)


## 何のために？

ここで、**なぜ小田急がこんなことをやっているのか？** という疑問が出てきます。

実は、小田急電鉄は[EMot](https://www.emot.jp/)というアプリケーションを、つい昨日(2019/10/30)にリリースしており、Maas Japanと連携したアプリケーションとなるようです。

上の画像の`小田急が開発するMaaSアプリ`の部分にEMotが当てはまるわけですね。

さらに小田急は、**日本の人口減少**と、**0~19歳/20~69歳の自動車を持っていない人/70歳以上の人口推移**に着目して、**もっと外出して小田急を利用してもらおう！** 　という狙いがあるようです。

[こちら](https://www.stat.go.jp/data/nihon/02.html)から詳細な情報がダウンロードできます。


## 小田急だけ使えても不便じゃない？

実は、小田急グループは非常に大きなグループです。

[こちら](https://www.odakyu.jp/company/group/)をご覧いただければわかりますが、小田急電鉄だけでなく、複数の**バスやタクシー**会社も小田急グループに属しています。

つまり、小田急電鉄だけでなく、電車を利用した後の交通機関でもMaaS Japanで連携を取ることができるでしょう。

さらに上の画像の通り、**遠州鉄道やJR九州、JAL、Japan Taxi、WHILLなど、さまざまな企業がMaaS Japanと連携する予定です。**

これにより、EMotやMaaS Japanが広がっていけば、日本全国でMaaSが利用できるようになるでしょう。


## むしろ便利

今までは電車のチケットやタクシーの予約は、すべてそれぞれのアプリケーションや電話、券売機でやってきました。

ですが、EMotを始めとするMaaSアプリケーションを使うことで、**スマホ1つで完結します。**

さらに、EMotでは **飲食サブスク** というサービスも開始しています。

これは、毎月定額でおにぎりやそばなどが食べられるといったものです。

詳しくは[こちら](https://www.emot.jp/service/detail/index_5.html) からご覧になれます。 


## 他にMaaSサービスを実施している会社ってあるの？

小田急だけでなく、JR東日本と東急電鉄が連携して、伊豆で行っている「観光型 MaaS」や、WILLERも北海道に定額型MaaSを導入することを発表しています。

ですから、これらの会社もMaaS Japanを利用して連携が実現すれば、EMot1つですべてが完結し利便性が向上すると考えられます。


## まとめ

- 小田急が斬新なプラットフォーム、**MaaS Japan**をリリース。
- これから日本で興ってくるMaaSサービスは、これを介してデータのやり取りをすることで手間が省ける。
- これから広がる可能性がある

## 最後に

小田急すごいですね。
【Unity】【3DAnimation】第一回 幾何学オブジェクトをアニメーション

# 全体のゴール
  - UnityChanのアセットに含まれる各ファイルの意味を理解できること。
  - 簡易人型モデルを作成し自作のアニメーションを作成できること。

# 今回の目標
　まず第一回は肩慣らしとして、タイムラインを用いて幾何学オブジェクトに対してアニメーションを行う。
今回は参考サイトに沿って手を動かしています。

# 手順
- Create -> 3D Object -> Cubeでアニメーションをさせるためのオブジェクトを生成する。
 ![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/7bbfed1a-3f08-8477-1c1f-b82133b74cd5.png)

- Window -> Animation -> Animationで「Animationウインドウ」を表示する。
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/2eab7554-47c8-e60c-2bdb-eaba3f4db2d2.png)

- Createボタンを押してアニメーションを新規作成する。
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/8d0ff658-a49e-49dc-d548-26c07e319b3f.png)

- Add Propertyでアニメーションするプロパティを選ぶ。
以下はRotationに対するアニメーションの設定例。
Rotation.yを1:00(1秒)かけて120°回転させる。
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/4663aa79-2ae8-fff1-3ae9-096979157342.png)

- 「Animation」タブの左下にある「Dopesheet」を「Curves」に切り替えると、ベジェ曲線を用いて、よりなめらかなアニメーションを行うことができる。
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/262d1994-8fdd-e0f8-4454-f09837f31ea5.png)

- 元のウィンドウでは以下の変化が起きている。
  Cubeのインスペクタに「Animator」コンポーネントが追加されている。
  「Cube.controller」「CubeRotate.anim」が作成されている。
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/6e5dcf40-0510-2115-bbca-87e4720bf58e.png)

- オブジェクトに親子関係を持たせてアニメーションを行うと？ (親がEarthHigh 子がMoon)
　⇒ 地球の回転／拡大／移動は月も連動した。親のアニメーションは子に伝播する。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/eeacea32-a0b2-b082-c7d3-8db095a32e9c.png)


[参考サイト]
https://www.atmarkit.co.jp/ait/articles/1411/20/news045.html
ruby　文字を表示させる(超基礎)


- irb 
- ri オブジェクト名
 - オブジェクトの中身見れるよ


```
print "hello world" #表示
puts "hellow world" #行末に改行が含まれる
p "hello world" #デバッグ用としてオブジェストの種類が分かりやすいように表示
```
これを実行すると
hello worldhello world
"hello world"

と表示される

###変数
- いきなり書き始めてもいい
- 英小文字または_から書き始める

```
msg = "hello world"
puts msg
```
実行結果：hello world

###定数

- 定数 ⇒ 書き換えたくない文字のこと
- 英大文字から書き始める

```
TENKI = "晴れ"
puts TENKI
```
実行結果：晴れ
話題のCoderをCentOS6.10で立ち上げる

# Coderとは
Coderとはweb上で使用できるVisualStudioCodeです。
githubのrepositoryは[こちら](https://github.com/cdr/code-server)。
要はServerを開発機として使え、そして例えばnginxやapacheなどを使用すればIpadでも開発ができるということ。

……果たしてそういうことをするのかということは置いておいて。


# なぜCentOS6.10なのか
CoderはCentOS7系には対応している。
そしてもちろんUbuntuにも対応している。
しかし、CentOS6系はglibcが古いため対応していない。
Coderは親切にもDockerに対応しており、しかもDockerFileまで用意しているのでDockerさえ入っていれば簡単に立ち上げられる。

が、CentOS６系は古いタイプのDockerにしか対応していない。
なのでDockerで立ち上げるのではなく直接Coderを立ち上げようと試みたが、glibcが対応していないということだ。

# glibcを入れ替える
これは[偉大なる先人](https://gist.github.com/harv/f86690fcad94f655906ee9e37c85b174)が行ってくれているのですぐに解決する。

```bash
#! /bin/sh

# update glibc to 2.17 for CentOS 6

wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm

sudo rpm -Uvh glibc-2.17-55.el6.x86_64.rpm \
glibc-common-2.17-55.el6.x86_64.rpm \
glibc-devel-2.17-55.el6.x86_64.rpm \
glibc-headers-2.17-55.el6.x86_64.rpm --force --nodeps
```
<font color="Red">**なお、無理やりCentOS7のものを入れようとするとクラッシュするのでしてはいけない。**</font>
仮想環境でない限り<font color="Red">**絶対に**</font>やめよう。


# libstdc++ の入れ替え
次に libstdc++ を入れ替える。
libstdc++を入れ替えようとしておそらく一番最初にヒットするのはソースからbuildすることだろう。
しかし実はそんなことをする必要はない。
そもそもソースからbuildしようとすると途方も無い時間がかかるため、待っている時間は暇だし環境によってはPCが使えないなんてこともあるかもしれない。
そこで今回はソースからではなくrpmから抽出する方法を取ることにした。

こちらはCentOS7のものに変えても問題ない為、CentOS7のものを抽出していく。

```bash
wget http://ftp.riken.jp/Linux/centos/7/os/x86_64/Packages/libstdc++-4.8.5-39.el7.x86_64.rpm
rpm2cpio ./libstdc++-4.8.5-39.el7.x86_64.rpm | cpio -id

sudo cp usr/lib64/libstdc++.so.6.0.19 /usr/lib64/
cd /usr/lib64/; sudo mv libstdc++.so.6 libstdc++.so.6.bak
sudo ln -s libstdc++.so.0.19 libstdc++.so.6
```

# code-serverを立ち上げる
後はcode-serverのバイナリファイルをgithubからダウンロードし
`/usr/bin/`直下においてあげれば`code-server`でCoderが立ち上がる
localhost以外で使用する場合はnginxやapache等でproxy設定をすればたぶん出来るハズ。(やったことない)
linux commandでのクォーテーションによる動作の違いメモ

# linux commandでのクォーテーションによる動作の違いメモ

## 今のunixtimeの表示

```
date +%s
```

## 2秒ごとにコマンドを実行し、内容を確認できる

```
watch
```

## 試す
### とくになし

**更新される**

```
watch date +%s
```


### ダブルクォーテーション

**更新される**

```
watch "date +%s"
```

### ダブルクォーテーション+$()

**更新されない**

```
watch echo "$(date +%s)"
```

### シングルクォーテーション+$()

**更新される**

```
watch echo '$(date +%s)'
```
自習が苦手ですぐ人に頼ってしまう打開策（自分用）


・なるべく人に聞かない
・人に聞こうと思ったらまず調べる
・またわからなくなる
・人に聞こうと思ったらまず調べる

の繰り返し

メッセンジャーで都度誰かに聞くよりも
ギリギリまで自分で調べてこれ以上進めない限界の
ところまで来たものをまとめておいて
実際に人に会ったときにまとめて質問する方が
効率がいい気がする。

その場でメッセンジャーで聞いたほうが有益と判断した場合は
素直に聞く。

自走力のトレーニング。
GitHub の Permission denied (publickey) で躓いたけど解決した時の話

#はじめに
AWSにRailsアプリをデプロイする過程で、
Gitとの連携がうまくいかなかったので、解決策をメモに残します。
##接続確認
鍵登録後 SSH コマンドで GitHub に挨拶してみます。

```
$ ssh -T git@github.com
を実行してみて、

Hi [account_name] You've successfully authenticated, but GitHub does not provide shell access.
がかえってくれば接続 OK です。
これを目指します。
```
##パーミッションをチェックする
今回は大丈夫でしたが
鍵のパーミッションがゆるい場合、以下のように
デカデカと警告が出るのでこちらはすぐ分かります。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
:
:
:
こんな感じで堂々と出る。
```
これは鍵のパーミッションを適切に締めてあげれば OK 。

chmod を実行します。

```
$ chmod 600 ~/.ssh/aws_git_rsa
$ chmod 644 ~/.ssh/aws_git_rsa.pub

権限変更後、この様になっていれば OK です。

$ ls -la ~/.ssh/ | grep aws_git_rsa
-rw-------   1 username  staff  1831 May  4 07:48 aws_git_rsa
-rw-r--r--   1 username  staff   404 May  4 07:48 aws_git_rsa.pub
```
##接続時の鍵をチェックする
v オプションを付けることで、SSH 接続のデバッグログをチェックすることができます。

```
$ ssh -vT git@github.com
```
を実行します。

すると、ズラズラとログが出てきます。

```
OpenSSH_7.9p1, LibreSSL 2.7.3
debug1: Reading configuration data /home/tatsuki/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 48: Applying options for *
debug1: /etc/ssh/ssh_config line 52: Applying options for *
debug1: Connecting to github.com port 22.
debug1: Connection established.
debug1: identity file /home/tatsuki/.ssh/id_rsa type -1
:
```
上から順によくよく覗いてみると

GitHub に登録した鍵は aws_git_rsa ですが、どうやら id_rsa が使われているようです。。。

そりゃ、認証できないはず（笑）

##今回の原因
今回は SSH の設定が誤っていました。

はじめ、

```
$ vim ~/.ssh/config
Host github 
  Hostname github.com
  User git
  IdentityFile ~/.ssh/aws_git_rsa
```
というように 設定を入れていました。

ホストを github としていたため、 
github.com へ接続するときにこの設定がマッチしていなかったらしい。

SSH 設定を次に修正すると、問題なく接続できました。

```
Host github github.com　←コイツを追加
  Hostname github.com
  User git
  IdentityFile ~/.ssh/aws_git_rsa
```
cradle.js (0.7.1) が動かなかった話

cradle使おうとしたんです。
[node.jsから驚くほど簡単に使えるNoSQLサーバ Couchbase(CouchDB)を試す!](http://wise9.jp/archives/4291)

を参考に、expressのバージョンが上がってるからちょこちょこ修正しつつ、さてDB編集だと言った時にこんなエラーが。

```
C:\home\minori\program\js\app4\node_modules\cradle\lib\cradle.js:316
            if (! o.__lookupGetter__(attr)) {
                    ^

TypeError: o.__lookupGetter__ is not a function
    at C:\home\minori\program\js\app4\node_modules\cradle\lib\cradle.js:316:21
    at Array.forEach (<anonymous>)
    at C:\home\minori\program\js\app4\node_modules\cradle\lib\cradle.js:315:24
    at Array.forEach (<anonymous>)
    at Object.cradle.merge (C:\home\minori\program\js\app4\node_modules\cradle\lib\cradle.js:314:10)
    at C:\home\minori\program\js\app4\node_modules\cradle\lib\cradle\database\documents.js:71:35
    at Request._onResponse [as _callback] (C:\home\minori\program\js\app4\node_modules\cradle\lib\cradle.js:244:9)
    at Request.self.callback (C:\home\minori\program\js\app4\node_modules\request\request.js:185:22)
    at Request.emit (events.js:210:5)
    at Request.<anonymous> (C:\home\minori\program\js\app4\node_modules\request\request.js:1161:10)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! app4@0.0.0 start: `node ./bin/www`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the app4@0.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Minori\AppData\Roaming\npm-cache\_logs\2019-10-30T18_04_15_163Z-debug.log
```

パっと見 cradle の中で起こってるエラーなので該当箇所を見てみるとこんな記述が。

```js:cradle.js
cradle.merge = function (target) {
    var objs = Array.prototype.slice.call(arguments, 1);
    objs.forEach(function (o) {
        Object.keys(o).forEach(function (attr) {
            if (o.__lookupGetter__(attr)) {
                target[attr] = o[attr];
            }
        });
    });
    return target;
};
```

ソースの精査をしていいないので `cradle.merge` が何やってるかなんとなくしかわからないのですが、DB呼び出す度に2回ぐらい呼ばれてて最後の最後にどうも普通のJsonオブジェクトか何かになる模様。

なのでこう書き換えて動きました。

```js:cradle.js
cradle.merge = function (target) {
    var objs = Array.prototype.slice.call(arguments, 1);
    objs.forEach(function (o) {
        Object.keys(o).forEach(function (attr) {
            if (o.__lookupGetter__ && ! o.__lookupGetter__(attr)) {
                target[attr] = o[attr];
            }
        });
    });
    return target;
};
```

プルリク送っとこうかな……でもこれでバグが取れきったかどうかわからないしな……
【脳のリソース不足のあなたに】生Rubyのエラー（例外クラス）と良くある原因

## はじめに
**元気なときは大丈夫！**ちゃんとエラー文を読み解いて自己解決出来る！

でも、頭が疲れて**脳がリソース不足**になっているとき、ついテキトーにググって**時間を浪費**してしまっていませんか？

そんな疲れたあなたのために、「原因はこれじゃない？」と**あたりをつけられる**よう良くある原因を問いかけ形式でまとめました。


※Rails ではなく、**生Ruby**でのエラーを記載しています。

## この記事が役立つ方
- エラー発生時にあたりをつけず
- 手当り次第にググってしまう
- Ruby初心者

## この記事のメリット
- Rubyのデバッグ効率UP！

## よく発生する例外クラス一覧
- SyntaxError
- NameError
- NoMethodError
- TypeError
- ArgumentError
- SystemStackError
- LoadError


## それぞれの良くある原因
### SyntaxError
- `end`の過不足はありませんか？
- `,`の過不足はありませんか？
- `()`や`{}`の過不足はありませんか？
- ハッシュの`{}`がブロックの`{}`と間違えて解釈されていませんか？
- 
### NameError
- 単純なタイプミスはないですか？
- 以下が未定義なのに呼び出されていませんか？
	- ローカル変数
	- 定数
	- privateメソッド
- `require`忘れ（外部ファイル・ライブラリ）はありませんか？

### NoMethodError
- 単純なタイプミスはないですか？
- レシーバの想定していた型と異なっていませんか？
	- ex.文字列を想定していたのにシンボルになっていた
- レシーバが想定に反して`nil`になっていませんか？

### TypeError
- 違う型同士の演算をしようとしていませんか？

### ArgumentError
- 引数が過剰していませんか？
- 引数が不足していませんか？
- 引数の正負が間違っていませんか？

### SystemStackError
- 無限ループ
	- 間違ってメソッドを再帰呼び出ししていませんか？

### LoadError
- `require`や`load`の実行に失敗していませんか？
	- 呼び出したいファイルのパス誤り(もしくはライブラリ名）はありませんか？
- gemは実行環境にインストール出来てますか？




## おわりに
自分が**脳のリソース不足のとき**につい手当り次第ググってしまうクセがあったので、反省してまとめました。

実際はここで出てきた表面的な方法では解決出来ないことも多いですが、まずは応急処置として確認はするべきですね。

まずググる、の前に**範囲を絞ってから**解決するクセをつけます。
誰かの辞書代わりにもなれば幸いです。

## 参考にさせて頂いた書籍（いつもありがとうございます）
[プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus | 伊藤 淳一 | コンピュータ・IT | Kindleストア | Amazon](https://www.amazon.co.jp/dp/B077Q8BXHC/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
タグ判別でインスタンスを停止するLambda関数

EC2インスタンスは起動時のみ料金が加算されます:arrow_heading_up:
つまり使用していないときには停止するだけで、料金を抑えることが可能です。

Reserved InstanceやSpot Instanceを使用する方が安くなりますが、
業務で使用する場合など一部利用パターンでは使用しづらいかもしれません。
なので、一括でインスタンスを停止するLambda関数を作成しました。

Terraformで構築しているので、すぐに使えるかと思います。

## 説明

* タグで停止対象の判別をしています
* 全リージョンが対象です
* IAM Roleを作成する必要があります

ソースコードとLambda関数のテストコードはgithubで公開しています。

## 使用方法

githubよりcloneしてください。
https://github.com/Sunochi/stop_ec2_instanses

READMEにデプロイまでの詳細手順を載せてありますが、
以下にも日本語で手順を書きますので、参考にしてください。

### Terraformのインストール

hashicorp社が提供しているインフラストラクチャ定義ツールです。
[install guide](https://learn.hashicorp.com/terraform/getting-started/install.html)

バージョンは`0.12.5`以上でお願いします。
`0.11.x`以下ではおそらく動作しません。

### python(pip)の使用準備

pipを使用するため必要になります。
環境ごとにインストール方法が大きく異なるので、申し訳無いですが割愛します。

### 環境変数の設定

Terraformを使う環境にて、下記の環境変数を設定してください。

```
TF_VAR_lambda_function_name: Lambdaの関数名
AWS_REGION: デプロイ先(`ap-northeast-1`など)
```

以下は1か2のどちらかのみ設定してください。

```
1.
AWS_SDK_LOAD_CONFIG: 1
AWS_PROFILE: ~/.aws/credentialsに設定しているprofile名

2.
export AWS_ACCESS_KEY_ID=<access key>
export AWS_SECRET_ACCESS_KEY=<secret access key>
```

設定例

```
$ export TF_VAR_lambda_function_name=set_cloudwatch_expire
$ export AWS_REGION=ap-northeast-1
$ export AWS_SDK_LOAD_CONFIG=1
$ export AWS_PROFILE=test_account
```

### デプロイ

デプロイはディレクトリごとになります。
順番がありますので、必ず守ってください

```
## IAM
$ cd IAM/
$ terraform init
$ terraform plan
$ terraform apply
## 表示内容に問題なければ　yes と入力

## Lambda.
$ cd Lambda/
$ ./lambda_build.sh
$ terraform init
$ terraform plan
$ terraform apply
## 表示内容に問題なければ　yes と入力
```

定期実行する場合は下記のCloudWatch Eventのルールもデプロイして下さい。
デフォルトの設定では毎月1日に実行されます。

```
$ cd CloudWatch/
$ terraform init
$ terraform plan
$ terraform apply
## 表示内容に問題なければ　yes と入力
```

## EC2インスタンスの設定

github上のコードをそのままデプロイした場合は下記設定が必要です。

### 停止対象から外す方法

EC2インスタンスのタグに下記を追加してください。

```
Auto-stop: No
```

このタグがある場合に限り、停止対象から除外されます。

### 停止対象にする場合

とくに設定は必要ありません。

## おわりに

テスト環境や開発環境をEC2インスタンスで構築したまま、停止忘れなどでコストが無駄にかかります。クラウドを使用しているのに柔軟に停止しないのは損です。

本番環境や停止したくない環境のインスタンスにのみタグをつけて、他は毎日22時に停止することで対策を始めましょう:punch:
githubには毎日22時に停止する設定のCloudWatch Eventsのterraformもあるので、ぜひ活用ください。
GCP アップデート (10/25-10/31 2019)

フィードがよくわからん日付で飛んでくる。。。

### AI Platform: [Oct 24, 2019](https://cloud.google.com/ml-engine/docs/release-notes#october_24_2019)
- MLS1マシンタイプに加えて、N1マシンタイプがオンライン予測で使う機能がベータになったよ。 (現状us-central1だけ)
  - GPU使って2GBまでのモデルも使える。
  - モデル40個超えると性能劣化するようなので注意。
  - MLS1でもモデルサイズが250MBから500MBに拡張されたよ。

### AppEngine: [Oct 17, 2019](https://cloud.google.com/appengine/docs/standard/java/release-notes#october_17_2019)
- Java11 runtimeがGAになったよ。

### Functions: [Oct 17, 2019](https://cloud.google.com/functions/docs/release-notes#October_14_2019)
- インスタンス数の最大を決められるmax instancesがGAになったよ。

### Cloud Run for Anthos: [Oct 10, 2019](https://cloud.google.com/run/docs/gke/release-notes#September_10_2019)
- 0.8.1-gke.0が1.14.6-gke.13と1.13.10-gke.7で使えるようになったよ。

### AppEngine: [Oct 16, 2029](https://cloud.google.com/appengine/docs/standard/go/release-notes#september_27_2019)
- Go1.13がベータになったよ

### Compute: [Oct 25, 2019](https://cloud.google.com/compute/docs/release-notes#october212019)
- Organization PolicyでGCPのIAMでGCEへのログイン制御をするOS Loginを制御できるようになったよ。
- Orgを利用してOS Login APIに対するアクセスのAuditも可能になったよ。

### AI Platform: [Oct 28, 2019](https://cloud.google.com/ml-engine/docs/release-notes#october_28_2019)
- 新しい学習用のジョブを作成するときはCompute Engineマシンタイプをこれからは推奨。
  - CPU、memory, GPU, TPUが柔軟に設定できる。
  - これまでのはAI Platformマシンタイプからレガシーマシンタイプにドキュメントでは名前が変わる。

### CloudRun: [Oct 25, 2019](https://cloud.google.com/run/docs/release-notes#October_25_2019)
- 古いメタデータサーバが削除されたよ。

### Storage: [Oct 29, 2019](https://cloud.google.com/storage/docs/release-notes#October_29_2019)
- サービスアカウントで利用できるHMACキーがGAになったよ。
  - S3と同じ方式。

### Composer: [Oct 30, 2019](https://cloud.google.com/composer/docs/release-notes#October_30_2019)
- 新しいバージョン(composer-1.8.0-airflow-1.9.0, composer-1.8.0-airflow-1.10.1, composer-1.8.0-airflow-1.10.2, and composer-1.8.0-airflow-1.10.3)がリリースされたよ。
  - デフォルトがcomposer-1.8.0-airflow-1.9.0に。
  - Airflow 1.10.3に対応

### GKE: [Oct 30, 2019](https://cloud.google.com/kubernetes-engine/docs/release-notes#october_30_2019)
- バージョンアップデートのお知らせ。
  - デフォルトが1.13.11-gke.9に。
  - 不正なyaml/jsonをAPIサーバに投げるとCPU高負荷になってDoSされる[CVE-2019-11253](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-11253)に対応しているので、気になる人は上げましょう。(API接続元絞ってれば内部からの攻撃やミスぐらい気にしてれば良さそう。)

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)