OmniAICreator/Qiita-1.07M huggingface dataset:
Word Cloudが作りたくなったら。


# やりたいこと
- 極力少ないステップでWord Cloudを作ること。(1度作ってしまえば充分という時にどうぞ)

## ポイント
- 形態素解析を `janome`で実行
    - `MeCab`だと`python`から見えるようにするための設定が必要
- Word Cloudに利用するフォントの設定

# 環境
- Windows 10
- python 3.7

# Library setup 
Anacondaを入れていれば、こんなところで大丈夫でしょうかね：

```py
pip install janome
pip install wordcloud
```

# 環境設定
```py
import pandas as pd

from janome.tokenizer import Tokenizer

import matplotlib.pyplot as plt
from wordcloud import WordCloud
```

# データ読み込みから下準備

- こんなデータ(`sample.csv`)を用意します。csvと言っておきつつ、カンマは使っていませんが、、、

```sample.csv
ライオンはパンダかもしれない
いや、そんなことはない 
 :
```


```py
## データ読み込み
df = pd.read_csv('sample.csv', header=None)
## タイトルを付与
df.colums = ['sentences']

## 関数群の定義
def get_nouns(sentence, noun_list):
    for token in t.tokenize(sentence):
        split_token = token.part_of_speech.split(',')
        ## 一般名詞を抽出
        if split_token[0] == '名詞' and split_token[1] == '一般':
            noun_list.append(token.surface)

def depict_word_cloud(noun_list):
    ## 名詞リストの要素を空白区切りにする(word_cloudの仕様)
    noun_space = ' '.join(map(str, noun_list))
    ## word cloudの設定(フォントの設定)
    wc = WordCloud(background_color="white", font_path=r"C:/WINDOWS/Fonts/msgothic.ttc", width=300,height=300)
    wc.generate(noun_space)
    ## 出力画像の大きさの指定
    plt.figure(figsize=(5,5))
    ## 目盛りの削除
    plt.tick_params(labelbottom=False,
                    labelleft=False,
                    labelright=False,
                    labeltop=False,
                   length=0)
    ## word cloudの表示
    plt.imshow(wc)
    plt.show()
```

# 準備が整ったところで実行
```py
## 形態素解析の準備
t = Tokenizer()

noun_list = []
for sentence in list(df['sentences']):
    get_nouns(sentence, noun_list)

depict_word_cloud(noun_list)
```

# 結果
こんなのが出れば成功：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80539/07387425-72a9-734b-1fa7-6873c48a5131.png)
[メモ] Webフロントエンドチューニング


Webフロントエンド ハイパフォーマンス チューニング　-久保田 光則 (著)
https://www.amazon.co.jp/dp/B0728K5JZV/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

を読んだ個人的な備忘録です。

# ブラウザのレンダリングの流れ
```
Loading -> Scripting -> Rendering -> Painting
```

この4つの処理のかたまりを `Frame` と呼部

この指標はGoogle Chromeの検証ツールのPerformanceタブのSummaryタブで見ることができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32950/4951bdcc-b9f1-f1a0-ece1-87191a39254c.png)

Loadingは、リソースのダウンロード、リソースのパース
Scriptingは、JavaScriptの実行
Renderingは、レイアウトツリー構築（CSSルールマッチング処理など）
Paintingは、レンダリングエンジンが描画した画面が表示される

## CSSルールマッチング処理
CSSは右のセレクタから評価される

```css:index.css
.container > .button { } 
```

最初に.buttonを持つDOMを探し
次に、.container要素内の.buttonか？

を確認し適用する。

# パフォーマンス指標RAIL
Googleがパフォーマンス指標のRAILを提唱しています。
公式ドキュメント↓
https://developers.google.com/web/fundamentals/performance/rail?hl=ja

RAILはそれぞれの頭文字を取って、Response、Animation、Idle、Load。
それぞれ以下の意味と基準値を示します。

| 指標       |意味|      時間|
|:-----------------|---------------|-------------:|
|Response |ページ内のアクションに対する応答|100msc|
|Animation| 連続して行われるFrameの中で1フレームの処理の目安|16msec|
|Idle | ユーザが待っている状態でのJavaScriptの実行|50msec|
|Load | ウェブページコンテンツの読み込みにかかる時間|100msec|


# Chromeの検証ツールの指標の意味
検証ツールは開いたことがあるものの、それぞれの指標の意味をしっかり理解できていなかったのでまとめておきます。

## Network > Timingタブ内に表示される内容

Queueing ... レンダリングエンジン内のキューイングに処理されるのにかかる時間
Stalled ... マシンのネットワークを活性化させるのにかかる時間
DNS Lookup ... ドメイン名をIPアドレスに解決するために行う時間
Initial connection ... TCPでの接続を確立するのにかかる時間
SSL ... TLS での通信トンネルを確立するのにかかる時間

Request sent ... HTTPリクエストを送信するのにかかる時間
Waiting(TTFB) ... Time To First Byte, リクエストを送信し終えてから、最初のデータを受け取るまでにかかる時間
Content Download ... コンテンツの最初のバイトからすべて受け取り終えるまでにかかる時間

# Loadingのチューニング
・HTML/CSS/JavaScriptを最小化
・適切な画像形式
・画像ファイル最適化
・CSSのimportを避ける（CSSのimportは直列でロードされる)
・JavaScriptを非同期で読み込む(async、defer)を使う
・DNSプリフェッチ
└ リソースの名前解決を先に行っておくことでオーバーヘッドを削減
・ページプリレンダリング
・Gzip圧縮を有効にする
・CDNを用いてリソース配信
└ ネットワークのオーバーヘッド削減、キャッシュ
・ドメインシャーディング
└ HTTP1.1だと同一ドメインのHTTPコネクション数が最大6つまでだが、複数のドメインからコンテンツを取得すれば、6 * nのコネクション数を得ることができる（HTTP/2が利用できるならやる必要がない）
・ブラウザキャッシュ
・Service Workerによるキャッシュ

## async、deferの違い
async... 複数のJSがasyncでロードされる場合、順番が保証されない。DOMのロードと並行してロードする
defer ... ドキュメントのパース完了後に発火（DOMMContentLoadedイベントの前に発火する)。


## HTTP vs HTTPS Test
HTTPとHTTPSのロード時間の差が視覚的にわかる
https://www.httpvshttps.com/

# JavaScriptのチューニング
Performanceタブで計測
・GCを防ぐ
・メモリ使用量を抑える

モバイルのクリックイベントは、ダブルタップを検知するために300ms待ちが発生する

# レイアウトツリーのチューニング
・利用していないCSSルールセットを減らす
pythonで3億桁までの多数桁乗算時間

pythonとC(gnuのgmp)の多数桁乗算の比較を行った。パソコン(4Ghz)での計算時間を下記に示す(単位:秒)。10進3億桁(結果)1回から桁数半分、回数倍で順に計算。共に右端の値は10進236万桁を128回計算した時間。
python　 :  1627, 1084, 723, 482, 322, 215, 143, 96 (s)
gnu(gmp)　 :  4.5, 3.9, 3.7, 3,4, 3.2, 2.8, 2.6, 2.2 (s)
千桁以上でpythonはカラツバ法、gmpはFMT(整数FFT)を使用しているのが分かる。pythonは桁数2倍で、3倍の時間(例は逆順1.5倍)が必要。gmpはFMT計算なので、桁数x回数でlog(桁数)比となる。
pythonのソースと両者の詳細結果は https://ecc-256.com のpythonプログラムの多数桁乗算を参照。面白いことに、10進20桁から200桁(共に回数は膨大)ではpythonは2倍程度遅いだけ。これは、共に結果を格納する場所の確保とポインターに多くの時間が必要のためだろう。
pythonはd10=format(a)でaを10進数に変換する処理が遅い。乗算が桁数2倍で3倍の時間に対し、変換は4倍かかる。118万桁、236万桁、472万桁の乗算と変換の時間を順に示す。
乗算: 0.24, 0.72, 2,19 (s), 変換: 19, 77, 308 (s)
Angular9が正式にリリースされたので、アップデートしてみた

ついにAngular9が正式にリリースされました！
去年の10月/11月にリリース予定だったのが、rc.14まで延期に延期を重ねた末のリリースです。。

Angular9ではIvyがデフォルトのレンダリングエンジンとなることもあり、注目度が高いアップデートですね！

さっそく業務で扱っているプロジェクトをAngular9にアップデートしてみたので、メモしておきます。

# 変更点

[Updating to Angular version 9](https://angular.io/guide/updating-to-version-9)にいろいろ書いてあります

## 非推奨

https://angular.io/guide/updating-to-version-9#new-deprecations

## 削除された非推奨API

https://angular.io/guide/updating-to-version-9#new-removals-of-deprecated-apis

## 自動でマイグレーションされるもの

https://angular.io/guide/updating-to-version-9#automated-migrations-for-version-9





# バージョンアップ手順

[Angular Update Guide](https://update.angular.io/#8.2:9.0)にアップデート方法が記載されているため、手順に沿ってアップデートします。

## バージョン8の最新版へのアップデート

```
ng update @angular/core@8 @angular/cli@8
```

## Typescript3.7へのアップデート

Angular9ではTypescript3.7以上が必要なため、Typescriptもアップデートします

```
npm install typescript@latest
```

※この記事の執筆時点では3.7.5が最新でした


## Angular9へのアップデート

```
ng update @angular/core @angular/cli
```
→[Automated Migrations for Version 9](https://angular.io/guide/updating-to-version-9#automated-migrations-for-version-9)に書いてある内容が自動で変更されます

## Multiple Projectゃ複数ライブラリを並列ビルドしている場合はngccコマンドが必要

multi project構成のAngularプロジェクトで[npm-run-all](https://www.npmjs.com/package/npm-run-all)や[concurrently](https://www.npmjs.com/package/concurrently)を利用して並列ビルドしている場合、`ERROR in ngcc is already running at process`のようなエラーが出てしまい、1つのプロジェクトしかビルドできません。


これを回避するために、ビルド前に`ngcc`でコンパイルしておきます。
参考：https://angular.io/guide/ivy#speeding-up-ngcc-compilation

```package.json
"scripts": {
  ・・・
  "postinstall": "ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points"
```



# 余談（PrimeNGについて）

UIフレームワークの[PrimeNG](https://www.npmjs.com/package/primeng)もAngular9に対応したバージョンが出ています。
（執筆時点では9.0.0-rc.4）

PrimeNGのV8はIvyに対応しておらず、Angularだけv9にアップデートするとエラーになってしまいます。
そのため、Angular9に上げるならPrimeNGも一緒にアップデートする必要があります。

ただ、こいつが地味に癖があったので、メモっておきます


## `primeng/common`ディレクトリがなくなった

コンポーネント以外のクラス（ServiceやMenuItem等）はcommon下にあったのですが、v9から`primeng/api`下に移動されていました。
これにより、importのパスを変更する必要があり、ほぼ全画面の修正が必要となりました。。


## [Steps](https://www.primefaces.org/primeng/#/steps)の挙動がおかしくなった

これは私の環境が悪いのか、各ステップアイテムに`ui-steps-item`が付与されないという現象が起きました。。
これにより、CSSが適用されずに画面が崩れてしまいました。

とりあえず、Stepsに渡すMenuItemのstyleClassで`{'ui-steps-item':true}`を指定することで回避しました。





# 最後に

無事にAngular9へのアップデートができました。
今回は何といってもIvyでしょう！

気になる効果ですが、`ng build --prod`で生成されるmain.jsのサイズが450KB→370KBくらいまで小さくなりました。（サーバーでgzipに圧縮して返した状態のサイズです）

初期表示時の全体サイズも2.6MB→2.0MBと、600KBも削減できました！！
Ivyすごい！


ちなみに、今回の手順では`@angular/pwa`や`@angular/cdk`は自動でアップデートされなかったため、個別にアップデートする必要がありそうです。
LiquidTap Python Clientを使う②

# 目次

* [はじめに](#はじめに)
* [「Liquid by Quoine」の"Orders"を取得する](#liquid-by-quoineのordersを取得する)

# はじめに

[「Liquid by Quoine」](https://www.liquid.com/ja/)のAPIを叩こう～その2～

# 「Liquid by Quoine」の"Orders"を取得する

BTC/JPYの発注とキャンセルを実行した結果を取得してみる。
(2020.02.07)

## コードを書く

```py:orders.py
import liquidtap
import time

def order_callback(data):
    print("order:" + data)

if __name__ == "__main__":

    token = "APIトークンID"
    secret = "APIトークン秘密鍵"

    tap = liquidtap.Client(token, secret)
    tap.pusher.connect()
    tap.subscribe("user_account_jpy_orders").bind('updated', order_callback)

    while True: # 無限ループ
        time.sleep(1)
```

## 実行

orders.pyを実行し、トレードツールから発注とキャンセルを実行してみます。

```sh
$ python3 orders.py
order:{"average_price":0.0,"client_order_id":null,"created_at":1581080779,"crypto_account_id":null,"currency_pair_code":"BTCJPY","disc_quantity":0.0,"filled_quantity":0.0,"funding_currency":"JPY","iceberg_total_quantity":0.0,"id":2079030430,"leverage_level":1,"margin_interest":0.0,"margin_type":null,"margin_used":0.0,"order_fee":0.0,"order_type":"limit","price":1500000.0,"product_code":"CASH","product_id":"5","quantity":0.001,"side":"sell","source_action":"manual","source_exchange":"QUOINE","status":"live","stop_loss":null,"take_profit":null,"target":"spot","trade_id":null,"trading_type":"spot","unwound_trade_id":null,"unwound_trade_leverage_level":null,"updated_at":1581080779}
order:{"average_price":0.0,"client_order_id":null,"created_at":1581080779,"crypto_account_id":null,"currency_pair_code":"BTCJPY","disc_quantity":0.0,"filled_quantity":0.0,"funding_currency":"JPY","iceberg_total_quantity":0.0,"id":2079030430,"leverage_level":1,"margin_interest":0.0,"margin_type":null,"margin_used":0.0,"order_fee":0.0,"order_type":"limit","price":1500000.0,"product_code":"CASH","product_id":"5","quantity":0.001,"side":"sell","source_action":"manual","source_exchange":"QUOINE","status":"cancelled","stop_loss":null,"take_profit":null,"target":"spot","trade_id":null,"trading_type":"spot","unwound_trade_id":null,"unwound_trade_leverage_level":null,"updated_at":1581080832}
```

表示された！
無限ループなので Ctrl+c で停止します。

今回発注したのはこんな感じのものです。
![order.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484011/a035a741-2466-9cbb-84bc-1b38339eaab5.png)
画像が小さくてスミマセン。
[Ruby]Dateクラスで日付を扱う

# RubyのDateクラスについて

- RubyのDateクラスを使用することで『日付』を扱うことができます。


```ruby

 # Dateクラスを読み込む
 require "date"

 # Date.newの引数に年月日を渡して、変数dayに格納
 day = Date.new(2020,2,22)

 # dayの出力結果は「2020-02-22」となる
 puts day

 # 「sunday?」メソッドは日付が日曜日かどうか真偽値を返す
 puts day.sunday?

```

Dateクラスの便利な使い方やメソッドについて、また随時更新していきたいと思います！
ご覧いただきありがとうございました！
Nim + Docker でデバッグ環境を作る

## 私とNimの最初のハードル
解説があるのはローカルにNimをインストールしてデバッグをするやり方ばかり。
ただ、近々PCを買い替えたいという思いもあり二度環境構築はしたくないので、私はDockerを使いたかったのです。
カッコカッコせずに早いコードを書きたかったんです。

## やったこと

### VSCode + Dockerデバッグの環境を整える
以下2つのエクステンションをインストールして上げましょう。
①Remote – Containers　(ms-vscode-remote.remote-containers)
②Remote Development (ms-vscode-remote.vscode-remote-extensionpack)

### 公式イメージでデバッグに足りないライブラリを追加
[Nimの公式Dokcerイメージ](https://hub.docker.com/r/nimlang/nim/)は、ライブラリ不足でデバッグ出来ません…。
なので必要なものをインストールして上げます。

`apt update && apt install -y gcc gdb`

後は通常通りのVSCodeのデバッグ関連の設定をしてあげればOKです。

## 全ソース
GitHubに全ソースを置いているので、~~私のようにPythonから入って設定分からねえという方は~~良かったらご活用ください。
https://github.com/tkkm/nim-docker-debug


## もうちょっと詳しく
~~宣伝させてください~~
ブログに詳しめに書いているので、良かったら覗いて見て下さい。

https://tkkm.tokyo/post-367/


それでは皆さん。良きNimライフを。
Rails5.2.2にアップデート

#1. 前提
環境：AWS Cloud9
Ruby 5.1.6→5.2.2にアップデートした経緯とやったことを纏めます。
今回は何のコーディングもされていない、まっさらな状態のRails環境をアップデートしました。
エラーなど出ようはずがなく、面白みのない備忘録です。
初心者なのでお手柔らかにご指摘いただけると幸いです。
リポジトリ：https://github.com/yumelog/todo_list

#2. 経緯
端的に言うと、Githubからのセキュリティアラートを受けてRailsをアップデートすることになりました。

#3. やったこと
Railsチュートリアルを参考にWebアプリを作ってみようと、チュートリアルを参考にRails new

```
$ rails _5.1.6_ new sample_app
```

Gemfileを以下のとおり更新

```ruby:Gemfile
source 'https://rubygems.org'

gem 'rails',        '5.1.6'
gem 'puma',         '3.9.1'
gem 'sass-rails',   '5.0.6'
gem 'uglifier',     '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.7.0'

group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
end

group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.1.5'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

group :test do
  gem 'rails-controller-testing', '1.0.2'
  gem 'minitest',                 '5.10.3'
  gem 'minitest-reporters',       '1.1.14'
  gem 'guard',                    '2.13.0'
  gem 'guard-minitest',           '2.4.4'
end

group :production do
  gem 'pg', '0.20.0'
end
```

Railsチュートリアル(第4版)ではBitbucketにpushですが今回はGithubへpushしました。
上記作業までをpushすると、Githubからセキュリティ警告メールが届きました。
actionviewが古いよー
<img width="299" alt="github1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239929/a1350811-64ac-7eea-c5c7-d07e0cc7776c.png">
pumaが古いよー
<img width="288" alt="github2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239929/bc926f08-cc8f-5550-bbb8-7c769bcc5e34.png">

##3.1 セキュリティアラートへの対処
###3.1.1pumaのアップデート
pumaのバージョンを新しいものに指定

```ruby:Gemfile
...
gem 'puma',         '3.12.2'
...
```

保存して、bundle updateして、Githubにpushするとアラートが一つ消えました。

###3.1.2 actionviewのアップデート
上述のGemfileを見渡してもactionviewは明示的に指定しておらず、はて、どこに書いてあるのかな？と迷いました。
Gemfile.lockに書いてあったのでそこを直接直しそうに血迷いましたが踏みとどまり、
とりあえずGemfileに明示的に指定してbundle updateをしました。

```ruby:Gemfile
...
gem 'actionview',         '5.1.6.2'
...
```

すると以下のエラーが発生。

```
Bundler could not find compatible versions for gem
"actionview":
  In Gemfile:
    actionview (= 5.1.6.2)

rails (= 5.1.6) was resolved to 5.1.6, which
depends on
      actionview (= 5.1.6)
```

railsのバージョンが合ってないのかと~~思って~~勘違いしてRailsのバージョンを上げることにしました。
(この時ググって一番上に出てきた結果がRailsのアップデートだったんですが、もしや5.1.6.2って指定したのがだめだったのか・・・？)

###3.1.3 Railsのアップデート
まずGemfileのRailsのバージョンを書き換え。

```ruby:Gemfile
...
gem 'rails',        '5.2.2'
...
```

このあとはお決まりの流れです。

```
$ bundle update
$ git add -A
$ git commit -m "rails upate"
$ git push
```

エラーなく無事にアップデート完了しました。
<img width="352" alt="Rails5_2_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239929/54ecb4a6-c67a-5277-0e5f-ea22b76bf13b.png">

#最後に
この記事を書いてるときに、Gemfileのactionviewの指定がエラーの原因だったんだと思い立ちましたが合ってるでしょうか？
プライベートな開発だから結果オーライですがもう少し慎重に開発せねばと常々思います。
Next.jsで環境変数を利用するためにdotenvは必要ない

## 追記
環境変数についてRFCが出たので気長に待ちましょう。
よりセキュアに環境変数を設定することができます。
[[RFC] .env environment support · Discussion #11106 · zeit/next.js](https://github.com/zeit/next.js/discussions/11106)

## さらに追記
[Enable NEXT_PUBLIC_ env var support by timneutkens · Pull Request #12283 · zeit/next.js]
(https://github.com/zeit/next.js/pull/12283)
> Last part needed for #11106. This enables inlining of NEXT_PUBLIC_ prefixed environment variables at build time.

上のRFCの実装が完了しました。こちらの方法で環境変数を設定しましょう。


# tl;dr
`next.config.js`の`env`に任意の値を設定するだけ
`dotenv`を使いたい場合には`next.config.js`で`dotenv`を呼び出せばよい

# 解説
Next.jsはVersion 8からbuild-inで環境変数（Environment Variables）に対応しています。
[Blog - Next.js 8 | Next.js](https://nextjs.org/blog/next-8#build-time-environment-configuration)
下記リンクを参考にすれば容易に設定できるでしょう。
[Environment Variables - Documentation | Next.js](https://nextjs.org/docs/api-reference/next.config.js/environment-variables)


ただし既存のdotenvシステムを利用したいケースもあるかと思います。
本体レポジトリにdotenvを使用したexampleも存在しているので参照してみましょう。
[next.js/examples/with-dotenv at v9.2.1 · zeit/next.js](https://github.com/zeit/next.js/tree/v9.2.1/examples/with-dotenv)

```js:next.config.js 
require('dotenv').config()
module.exports = {
  env: {
    // Reference a variable that was defined in the .env file and make it available at Build Time
    TEST_VAR: process.env.TEST_VAR,
  },
}
```
特に難しいことはなく`dotenv`が公式で推奨しているようにconfigを実行するだけです。
[motdotla/dotenv: Loads environment variables from .env for nodejs projects.](https://github.com/motdotla/dotenv)

> As early as possible in your application, require and configure dotenv.
> `require('dotenv').config()`

## `dotenv-webpack`は（通常）必要ない
昔の記事では`dotenv-webpack`の使用が推奨されていることがあります。
これはbuild-inで対応していなかったVesion 8以前にexampleにて推奨されていた方法です。
現在でも動作はしますが推奨されていません。以下が該当のIssueとPRです。
[The with-dotenv example does not seem to follow current Next.js conventions · Issue #9371 · zeit/next.js](https://github.com/zeit/next.js/issues/9371)
[Update `dotenv` example by francismarcus · Pull Request #9372 · zeit/next.js](https://github.com/zeit/next.js/pull/9372)

Next.jsは内部でwebpackを用いてビルドを行っています。それをカスタマイズする方法です。
筆者はNext.jsにおいてwebpackのカスタマイズは最小限にするべきだと考えています。
今回のようなケースでは使う必要はないかと思われます。

Next.js 8以降で`dotenv-webpack`を利用するケースが思いつかないのでよかったらコメントください。
Google Apps ScriptのランタイムにV8が採用された話

# GASでES2015が使えるようになったらしい
以下のページを見ると、ランタイムとしてV8が使えるようになったっぽいです。
[Google公式発表](https://developers.google.com/apps-script/guides/v8-runtime?hl=ja)

V8ランタイムが使えるようになったということは、ついにGASにES2015が来たということです。
早速使ってみましょう。

プロジェクトを作成して、マニフェストファイルに`"runtimeVersion": "V8"`を追加しましょう。

```json:appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}
```

とりあえず、class構文を使ってみましょう。

```javascript:コード.gs
class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  
  get area() {
    return this.height * this.width;
  }
}

function myFunction() {
  const rec = new Rectangle(100, 200);
  Logger.log(rec.height);
  Logger.log(rec.width);
  Logger.log(rec.area);
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222887/4742e730-97bc-720f-343a-18540616ca57.png)

おぉー、使えた。

# まとめ
GASが便利になった
(JavaScript)イベント駆動について

今日はJavaScriptとjQueryについて学習しました。

JavaScriptは「イベント駆動」という概念に基づいて設計されているそうです。

Javaスクリプトにおけるイベントとは、HTMLの要素に対して行われた処理要求のことで

例えば、「ある要素の上にマウスカーソルを乗せる」、「ブラウザ上のボタンをクリックする」なども

イベントに当たります。

そのイベントが発生したらそれをきっかけにコードが実行される仕組みが「イベント駆動」です。


Webページを見ていてカッコいい動作は大体JavaScriptのおかげなのだなと思いました。
Androidの強制アップデートでよく使うアプリバージョン比較方法

現在のバージョンと強制アップデートのバージョンを比較して、処理をするということはよくあります。  
重大なバグがあった場合に「このバージョン以上は〜する」みたいなときに使うあれです。

```kotlin
/**
 * バージョン
 *
 * @property major メジャーバージョン
 * @property minor マイナーバージョン
 * @property patch パッチバージョン
 */
class Version(val major: Int, val minor: Int, val patch: Int) : Comparable<Version> {

    /**
     * コンストラクタ
     */
    constructor(major: Int) : this(major, 0, 0)

    /**
     * コンストラクタ
     */
    constructor(major: Int, minor: Int) : this(major, minor, 0)

    /**
     * バージョン（Int）
     */
    private val version = versionOf(major, minor, patch)

    /**
     * バージョン変換
     *
     * @param major メジャーバージョン
     * @param minor マイナーバージョン
     * @param patch パッチバージョン
     * @return Int
     */
    private fun versionOf(major: Int, minor: Int, patch: Int): Int {
        return major.shl(16) + minor.shl(8) + patch
    }

    override fun toString(): String = "$major.$minor.$patch"

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        val otherVersion = (other as? Version) ?: return false
        return this.version == otherVersion.version
    }

    override fun hashCode(): Int = version

    override fun compareTo(other: Version): Int = version - other.version

    companion object {

        /**
         * 文字列のバージョンから生成
         *
         * @param version バージョン（String）
         * @return [Version]
         */
        @Throws(IllegalArgumentException::class, NumberFormatException::class)
        fun from(version: String): Version {
            val parts = version.split(Regex("\\."))
            return when (parts.count()) {
                1 -> Version(parts[0].toInt())
                2 -> Version(parts[0].toInt(), parts[1].toInt())
                3 -> Version(parts[0].toInt(), parts[1].toInt(), parts[2].toInt())
                else -> throw IllegalArgumentException("This is invalid version format. $version")
            }
        }
    }
}
```

使う側

```kotlin
if (BuildConfig.VERSION_NAME < Version("1.1.0")) {
    // 強制アップデート表示
}
```

## おまけ

こんなけバージョン比較方法を紹介しといてあれなんですが  
最近は [in-app-updates](https://developer.android.com/guide/playcore/in-app-updates) という機能が追加されました。

ただこれはアプリ内で、アップデートを促進するための機能です。  
アップデート画面を閉じることができるので <b>強制アップデートではない</b>です。
QUANTUM ESPRESSO install memo

for me

make時に# 5117 のエラー
`iotk_base.f90(20): 警告 #5117: # プリプロセッサー行が正しくありません。`

コンソールが日本語表示なのが問題だった。
`export LANG=en_US`
このコマンド後、再度configureしてmake
Railsで部分テンプレートを使用時、Missing テンプレートエラーが出た際、解決したこと

#Missing partial shared/_header with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in:っというエラーが発生した際、どう解決したのか

erbファイルに部分テンプレートを書く際は、基本 <%= render 'ファイル名' %> でよかったはず・・・・
以下参照（ピカワカさんありがとうございます）
https://pikawaka.com/rails/partial_template

<img width="248" alt="スクリーンショット 2020-02-07 21.09.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540462/4f79c90d-af54-ac5b-a7d6-85649105d7e4.png">

以上のような階層です。

#部分テンプレートを当てたい場所と、使用するテンプレートについて

テンプレート化したいものはsharedファイルの中にある

```ruby
_header.html.erb　っというファイル
```

部分テンプレートを使用する場所は

```ruby
new.html.erb
```

ファイルをまたいでいるため、shared/テンプレ化したファイル名
っという記述であってるはず・・・・

っと思ったが、

<img width="798" alt="スクリーンショット 2020-02-07 21.19.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540462/0d71f538-551a-d8c4-9986-df962e99229d.png">


#devise/shared/headerっというファイルを指定したら解決

```ruby
<%= render "devise/shared/header" %>
```
上記の通り上の階層のdeviseを指定すると、部分テンプレートを使用できた。
謎でしたが・・・・とにかく解決した！10分くらいで解決したのが幸い。


ここは違う、ここはこうしたほうが良い等々ございましたらご指摘いただけますと幸いです。
最後までみていただきありがとうございます。
挿入ソート

今日から
[INTRODUCTION TO ALGORITHMS](https://www.amazon.co.jp/Introduction-Algorithms-Thomas-H-Cormen/dp/8120340078/ref=sr_1_2?__mk_ja_JP=カタカナ&keywords=introduction+to+algorithm&qid=1581077652&sr=8-2)を読み始めたので、簡単な内容も多いですが、アルゴリズムをまとめていきます。 

# 挿入ソート
要素数10の配列を挿入ソートによってソートするのは、次の例と類似しています。

テーブルに10枚のトランプが置かれていて、初め手札の枚数は0とします。テーブルのカードを一枚ずつ引いていき、手札に加えるのですが、手札は常に昇順にソートされた状態にキープします。手札って整頓させておきたいですよね、左に数字の小さいカード、右に数字の大きいカードというように。
このプロセスのポイントは、**カードが三つに分類できるということ**です。

- 手札にある既にソートされたカード
- 今テーブルから引いて、これから加えようとしているカード
- まだテーブルに置かれているカード

挿入ソートもこのことに着目します。

- 配列のうち、既に昇順にソートされている部分
- 配列のうち、今見ている要素
- 配列のうち、まだ昇順にソートされていない部分

例えば、

インデックス|0|1|2|3|4|5|6|7|8|9
:---|---|---|---|---|---|---|---|---|---|---
値|5|3|8|1|2|4|7|6|9|0

という要素数10の配列があるとします。まだテーブルに全てのカードが置かれている状態と考えてください。
カードを一枚ずつ引いていって、今ちょうど5枚目を引いたとします。これは、配列がインデックス0-3まではソートされていて、今インデックス4の2に着目していることに等しいです。

インデックス|0|1|2|3|4|5|6|7|8|9
:---|---|---|---|---|---|---|---|---|---|---
値|1|3|5|8|<font color="red">2</font>|4|7|6|9|0

さて、この2を挿入する位置探しましょう。

- 2と8を比べ、8の方が大きいので、2と8の位置を交換します。
- 2と5を比べ、5の方が大きいので、2と5の位置を交換します。
- 2と3を比べ、3の方が大きいので、2と3の位置を交換します。
- 2と1を比べ、2の方が大きいので、ここで終了します。

同様の手順を、6番目から10番目のカードに対しても行うと、ソートされた配列が得られます。これが挿入ソートの手順です。

```python
def insertion_sort(a) -> None:
    for i in range(1, len(a)):
        key = a[i]
        j = i - 1
        while key < a[j] and j >= 0:
            a[j+1] = a[j] 
            j -= 1
        a[j+1] = key

a = [1, 3, 5, 8, 2, 4, 7, 6, 9, 0]
insertion_sort(a)
print(a)
```

出力

```
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

冒頭でご紹介したテキストですが、何で挿入ソートでこんなにページ割けるんだってくらい、一つのアルゴリズムに関して色々説明しているので、読み進めて補足することがあれば別記事をまた書こうと思います。
[学習4日目]PHP(初級編) - 変数の表示の仕方、繰り返し処理、分岐処理の書き方

変数定義や配列、if文やfor文の基本的な概念？書き方？はC言語とほとんど同じだったので省略。
以下、PHPっぽいなと思った書き方の決まりを記録します。

##変数の表示
###表示する時の変数には「$」を前につける + 改行をつける場合は「``$変数.'<br>'``」と書く。
```index.php
$i = 0;
echo $i.'<br>';
```

##繰り返し処理、分岐処理
###if文やfor文の()内の変数は全て「＄」をつける
```index.php
for($i=0; $i<10; $i++){
  if($i % 3 == 0){
    .....
  }
  ...
}
```

###breakはループを完全に抜ける、continueは現在の周だけスキップしてループは続ける

```index.php
    for($i=1; $i<=1000; $i++){
      if($i % 3 == 0){
        continue;
      }
      echo $i.'<br>';
    }
```
こうすると、iが1〜1000の間for文が回されるが、3の倍数の時だけ、echoまでいかずに次のiにいく。
結果はこんな感じなる。
1
2
4
5
7
8
10
11
13

###foreach文は配列のためのfor文みたいな感じ
foreach文は初めてみた。（私の学習した中の言語では。）
配列の値を順番に取り出してくれるらしい。
配列のキーを取り出すには``$key``を。値を取り出すには``$value``を使う。
foreachの()内は``(`` 配列 ``as`` キー変数　``＝>`` 値変数 ``)``
と書く。

```index.php
    $scores = array('数学' => 70, '英語' => 90, '国語' => 80);
    foreach($scores as $key => $value){
      echo $key.'は'.$value.'点です。<br>';
    }    
```
結果はこうなります。

数学は70点です。
英語は90点です。
国語は80点です。
Tabulatorを使ってみた日

##Tabulatorとは
html5の表を簡単に作成できるJavaScriptライブラリー

##手順

・jqueryを[ここ](https://code.jquery.com/)からCDNで読み込む.
・[GitHubリポジトリ](https://github.com/olifolkerd/tabulator)からTabulatorライブラリーをコピーして、tabulator.cssとtabulator.jsファイルをプロジェクトに読み込む。


```hoge.html
<! DOCTYPE html>
<link rel="stylesheet" href="tabulator.css">
<script type="text/javascript" src="tabulator.js">

<div id="example-table"></div>
```

```hoge.js
$("#example-table").tabulator({
  columns:[
    {title:"Name", field:"name", sortable:true, width:200},
    {title:"Progress", field:"progress", sortable:true, sorter:"number"},
    {title:"Gender", field:"gender", sortable:true},
    {title:"Favourite Color", field:"col", sortable:false},
    {title:"Date Of Birth", field:"dob"},
    {title:"Cheese Preference", field:"cheese"},
  ],
});


var sampleData = [
  {id:1, name:"Oli Bob", progress:12, gender:"male", rating:1, col:"red", dob:"", car:1, lucky_no:5, cheese:"Cheader"},
  {id:2, name:"Mary May", progress:1, gender:"female", rating:2, col:"blue", dob:"14/05/1982", car:true, lucky_no:10, cheese:"Gouda"},
  {id:3, name:"Christine Lobowski", progress:42, gender:"female", rating:0, col:"green", dob:"22/05/1982", car:"true", lucky_no:12, cheese:"Manchego"},
  {id:4, name:"Brendon Philips", progress:100, gender:"male", rating:1, col:"orange", dob:"01/08/1980", lucky_no:18, cheese:"Brie"},
  {id:5, name:"Margret Marmajuke", progress:16, gender:"female", rating:5, col:"yellow", dob:"31/01/1999", lucky_no:33, cheese:"Cheader"},
];

```






##参考
[HTMLのテーブルをJSONで動的に更新できる「Tabulator」がスゴい！](https://www.webprofessional.jp/dynamic-tables-json/)
[Tabulatorを使った見やすい表形式のWebアプリの作成]
(https://qiita.com/e21084/items/dcd7e190dc651127aa71)
環境変数名から接頭辞を取り除くシェルスクリプト (CI 向け)

# Motivation

CI において、 `AWS_ACCESS_KEY_ID` といった環境変数を CI スクリプトに与えたい状況はよくあることです。

しかし、複数の環境に対応する場合に、`AWS_ACCESS_KEY_ID="${DEV_AWS_ACCESS_KEY_ID}"` (DEV 環境用の変数を使う例) などと都度書くのは手間がかかります。

このような場合に、接頭辞の付いた環境変数を一括で展開する bash script を用いれば、CI スクリプトをシンプルにしつつ実現することが可能になります。

# Script Usage

GitLab CI の例ですが、以下のようにして使います:

```yaml
.my_ci_job: &my_ci_job  # 全環境で共通の CI Job 定義
  script:
    - 'source ./setup-environment-variables.sh "${ENVNAME}" AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY REPOSITORY_URL'
    #
    # 以下、任意のスクリプトを記述する。下記は筆者の例:
    #
    - $(aws ecr get-login --no-include-email)
    - docker build -t $REPOSITORY_URL:latest .
    - docker push $REPOSITORY_URL:latest

my_ci_job_dev:  # 上記の Job に ENVNAME=DEV を与えて実行
  <<: *my_ci_job
  variables:
    ENVNAME: DEV

my_ci_job_prod:  # 上記の Job に ENVNAME=PROD を与えて実行
  <<: *my_ci_job
  variables:
    ENVNAME: PROD
```

上記の CI 定義に加えて、CI 環境の設定で `DEV_AWS_ACCESS_KEY_ID` および `PROD_AWS_ACCESS_KEY_ID` 等の変数を定義します。

CI スクリプト中の `./setup-environment-variables.sh` は、`${ENVNAMEの値}_AWS_ACCESS_KEY_ID` の環境変数を `AWS_ACCESS_KEY_ID` 変数に展開するため、CI job 定義は環境に関わらず 1 回記述するだけで良くなっています。


# Script

以下が `setup-environment-variables.sh` の内容です:

```sh

# Usage: source ./setup-environment-variables.sh PREFIX NAME ...
# Example: source ./setup-environment-variables.sh DEV AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY
#
# Copies environment variable from [PREFIX]_[NAME] to [NAME].
# e.g. Copy DEV_AWS_ACCESS_KEY_ID variable into AWS_ACCESS_KEY_ID
# Useful for CI.
#
# Arguments:
#   $1 : Prefix of variable name
#   $n : Name of variables to copy
if [ -z "$1" ]; then
  echo "Usage Example: source ./setup-environment-variables.sh DEV AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY" 1>&2; exit 1
fi
PREFIX="$1"
shift

for var_basename in "$@"
do
  dest_name="${var_basename}"
  src_name="${PREFIX}_${var_basename}"
  src_value="${!src_name}"

  if [ -z "${src_value}" ]; then
    echo "Missing variable: ${src_name}" 1>&2; exit 1
  fi

  declare -x "$dest_name=${src_value}"
done
```

Bash 前提のスクリプトになっていますが、多くの CI ツールは bash で動作するため使えるのではないでしょうか。
Variable indirection と declare を使うことで目的を実現しています。

また指定された変数が存在しない・空である場合にエラー終了するため、CI での変数定義の不足をわかりやすく検知できるようにも実装してあります。
GentooでのEclipseのインストール（amd64アーキテクチャ向け）

# はじめに（公式記載の方法でうまくいかない理由）
gentoo wiki
https://wiki.gentoo.org/wiki/Eclipse

大まかな作業の流れとしては上記のリンクに記載されている通りで大丈夫ですが、実際に

```bash:
layman -a eclipse
emerge --ask dev-util/eclipse-sdk-bin
```
を実行してもうまくいきません。2020年2月7日現在、"eclipse"オーバーレイと対応しているバージョンが4.6.2-r1なのですが、~amd64でマスクされているためです。
マスクには「特定のアーキテクチャ向けのテストが十分でない」などそれ相応の理由があるため、今回はマスクを無視するのではなく別のオーバーレイを探してインストールします。

# オーバーレイの選択
Gentoo Portage Overlays
https://gpo.zugaina.org/dev-util/eclipse-sdk-bin/

上記サイトからインストールしたいバージョンのEclipseを選びます。
たくさんありますが、まず~amd64の記載が**無い**ものから選んでください。
現時点では4.13.0が最新ですので、例としてこちらをインストールしたい場合はオーバーレイ名が"calculate"となります。

# オーバーレイの登録、インストール

```bash:
layman -a (上記で調べたオーバーレイ名)
emerge --ask dev-util/eclipse-sdk-bin
```

emergeの方は特に変更点はありません。
無事にインストールが完了すれば

```bash:
eclipse-bin-(バージョン)
```

で起動できるようになります。
2/7 授業ノート

#今日習ったこと
**BracketにおけるEmmetを用いた入力省略方法**
・main(タグにしたい文字列)+Tabキー：```<main></main```>
・p>img[src="#" alt=""]+Tabキー：```<p><img src="#" alt=""></p>```
・ul>li*3>a[href="#"]{メニュー}→Tabキー：
```<ul>
                <li><a href="#">メニュー</a></li>
                <li><a href="#">メニュー</a></li>
                <li><a href="#">メニュー</a></li>
            </ul>```
・h1+p+h2→Tabキー：
```<h1></h1>
<p></p>
<h2></h2>```
・;m+Tabキー：;margin:
・fz→予測変換：font-size: 

参照：Bracket Cheat Sheet→https://docs.emmet.io/cheat-sheet/

#お話
自分が今後どのような人間(仕事的な)になりたいか、
そのディティールが具体的に見えたならばあとは行動するだけ。
先生の場合は〇〇だった、という具体例を出してお話いただいた。
また勉強の際は基礎応用発展を同時進行で一気にやれ、というのはとても同感。

**自分に置き換えた場合**
複合的に色々やりたいという考えはもともとあるが、
一点集中してしまうと行き詰まりを感じるから気を散らしていたい、
というのが偽り無き本音なので(ここ10年ぶれることなくこの考え)、
このままでは食いっぱぐれるか、あれもこれもやって忙殺されるかの二択ビジョンが見えた。
地獄である。が、そういう知り合いをたくさん知っている。

#感想
[昨日の記事](https://qiita.com/aachan_studyrecords/items/8eea23dcebf8c267bd78)がなぜか伸びてて驚き(1日で100viewくらい)。なぜだ…？

職業観の話だけど、Web系以外にもいろんなことに関心があって、
人生を楽しむという点で多趣味なのは非常にいいことだけど、
「やりたいことをやりきる」という点では正直ぼやけてしまっていると思っている。

①Web系でどう生きていきたいか
②そのためには何が不足しているか
③不足を満たすために今何をするべきか

早めにこの3点を確定させることが必要だ。
初心者によるプログラミング学習ログ 232日目

#100日チャレンジの232日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

232日目は
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>232日目<br>・MySQLを自分のパソコンに導入<br>・udemyでcss+javascript講座<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1225510648811003904?ref_src=twsrc%5Etfw">February 6, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Kaggle:Introduction to Manual Feature Engineering その4

https://www.kaggle.com/willkoehrsen/introduction-to-manual-feature-engineering

## Modelingから
https://www.kaggle.com/willkoehrsen/introduction-to-manual-feature-engineering#Modeling

## KFold
```
    # Create the kfold object
    k_fold = KFold(n_splits = n_folds, shuffle = False, random_state = 50)
```
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html

交差検証の１つらしい。データを10個に分けたら、1個はテスト用、9個はトレーニング用、それを10回検証して、10個それぞれの分割したデータでテストが回るようにする。
k_fold.split()の返り値は渡した配列なりのindexが返ってくる。

## いまいち分からない
```
    # Empty array for feature importances
    feature_importance_values = np.zeros(len(feature_names))
    
    # Empty array for test predictions
    test_predictions = np.zeros(test_features.shape[0])
    
    # Empty array for out of fold validation predictions
    out_of_fold = np.zeros(features.shape[0])
```
feature_importance_valuesなど、ここらへんをなぜ0初期化する必要があるのか？NAが入ってくるのかな？
その後の関数で、

```
        # Record the feature importances
        feature_importance_values += model.feature_importances_ / k_fold.n_splits
```
みたいにしてるし・・必要なんでしょうか。
と最後まで関数追ってて気付いた。これnumpy配列の加算をしてるのね。最初の加算をするのに確かに初期化がいりますね。


## overfit
> The control slightly overfits because the training score is higher than the validation score. 

なるほどです。。が結果としては相関係数が高い特徴量削ったほうがスコアは低かったという。

ということで、Introduction to Manual Feature Engineering は終わり。

次は

Introduction: Manual Feature Engineering (part two)
https://www.kaggle.com/willkoehrsen/introduction-to-manual-feature-engineering-p2

なのかな。何か目新しいことがありそうにもないが、Part1を自分で今出来るかと言ったら出来ないので、よい復習になることを期待する。

##学んだ英語
- worthwhile やりがいのある、価値のある
- to be had (ある、手に入る）はずである　（ちょっと意味はあやしい）
プログラミング初学者ー3ヶ月目で思う事ー

##はじめに
初めまして！てらって呼んでください:relaxed:
簡単に自己紹介をするとごみくずプログラミング初学者です。(３ヶ月目)
プログラミングに片足を突っ込んで3ヶ月目に入りました。
これから以下の5点について書こうかと思っています。
##結論

- **プログラミングはほとんど魔法です**
- 散々言われていますが、やはりどう考えても何か物を作るべき。
- 大体エラーはTypo(タイプミス)です。
- GAOGAOGATEについて。
- 世界は広かった。

##プログラミングはほとんど魔法です。
![mahoutsukai_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565068/a793f3cb-0eea-2272-36e2-17b530bb3702.png)


基礎の基礎を学んでいる段階では気付きませんが、先人達は神ツールを作り上げています。(フレームワークやライブラリ等々。)
基礎の基礎を学び終え、神ツールを使いはじめると何が起こって居るかよくわからないが、とりあえずこう書けばやりたかった事ができる状況に陥ります。ここで気をつけたいのが、調べすぎない事です。謎が謎を呼び理解できないので、どんどん先に進んだ方が良いと思います。やっとの思いで理解したのにその長いコードを１行で代替できるみたいな事はざらだし、ググってコピペして、ちょっといじって完成！みたいな事がもはや基本です。
時間を無駄にしないためにも（自戒）、どんどん先に進むべきです。魔法の使い方を僕らは覚えれば良いだけです。
使い方ですら山の様にあるので、まずは覚えて使える様になるのが、先決だと感じています。

##散々言われていますが、やはりどう考えても何か物を作るべきです。

何かの問題を解決する為にプログラミングはあると思うのでやはり何かを作ることが大事だと思います。
メンターさん口を揃えて何か自分で作ることが大事と仰っていて、実際に作ってみる事で覚えられる事を私自身nowで実感して居ますし、これは間違いないはずです。ただし、自分ができなさ過ぎて若干メンタル持っていかれるので注意です！自分にとってあったら便利だなと思うものを作ってみるのがまじでおすすめです！

##大体エラーはTypo(タイプミス)です。
これに尽きます。と言うかこれが全てです。参考書やドットインストール等をみながら、色々コードを移していくとやっぱりTypo(タイプミス)をします。ボク自身そうだし、今もそうです。数えてはいないですがTypo(タイプミス)で1日を無駄にしたりしてました。
[difff](https://difff.jp/)はまじでお世話になったのでオススメです。
これは自分のコードとお手本のコードを比較してくれます。

##GAOGAOGATEについて

私は現在ベトナムで実際に生活しながら自分の作りたいアプリケーションを実際に作るプログラミング合宿に参加しています。参加した理由は、海外にまで行ってプログラミングを勉強しようって人はまだ比較的少ないであろうと思った事と自分の作りたいアプリケーションを作れると書いてあったからです。現在、個性的な方達(ボクも個性的かもです笑)と同じ時間を過ごしながら実際に物を作って居るのですが、正直最高です。人として魅力のある方達しかいません笑。↓気になった方はぜひ
GAOGAOGATEホームページ
[GAOGAOGATE](https://gate.gaogao.asia/)

-同期のレベル高過ぎdaijuさん-
[twitter](https://twitter.com/daiju08)
[ブログ : gaogaoゲートって何？/](https://daiju81.com/gaogao/gaogao%e3%82%b2%e3%83%bc%e3%83%88%e3%81%a3%e3%81%a6%e4%bd%95%ef%bc%9f/)



#世界は広かった

初めて海外で生活しているのですが、お店のドアマンは椅子に座って居るし、お店の店員はスマホいじってるし、駐車場の休憩室で寝っ転がりながら笑い話してるおばちゃん。みんな楽しそうだし。僕もそっち側の方が幸せかなと思い始めています。日本のコンビニって店員頑張り過ぎだなってめっちゃ思います。

#記事を書いてみての感想

文章ってむずいです。。。w
プログラミングを勉強し始めて確実に人生変わってきて居ると感じています。(いい意味で)
作りたいアプリが完成したら公開して詰まった点や色々かける事はあると思うので記事を書いてみようと思います。最後までよんでくれてた方いたら割と嬉しいです。。。
またね！twitterでも色々呟いてます。
[twitetr](https://twitter.com/aaaa56039257)
WordPressタグのメモ

専用タグについては基本的に
WordPress Codex：https://wpdocs.osdn.jp/Main_Page
で調べる。

##よく使うものまとめ
####<?php wp_head(); ?>
/headの直前
####<?php wp_footer() ?>
/bodyの直前

上記はhtml,stylesheetやJavaScriptの読み込み等

#####記事作成フォーム
`<?php WHILE(have_posts()):the_post(); ?>
          <div class="post-preview">
            <a href="post.html">
              <h2 class="post-title">
                <?php the_title(); ?>
              </h2>
              <h3 class="post-subtitle">
                <?php the_excerpt(); ?>
              </h3>
            </a>
            <p class="post-meta">Posted by
              <?php the_author(); ?>
              on <?php the_time("Y年n月j日 l"); ?></p>
          </div>
          <hr>
      <?php endwhile; ?>`


#####<?php the_title(); ?>
投稿記事のタイトル読み込み＆表示

#####<?php the_content(); ?>
投稿記事の内容読み込み＆表示

#####<?php the_time($d); ?>
投稿の公開時刻
$dは表記形式("Y年n月j日 l")("Y/m/d")("Y-m-d")など

#####<?php the_author(); ?>
投稿者名の読み込み＆表記

#####<?php echo get_template_directory_uri() ?>
cssの参照先自動取得。基本的に以下の型で取得します。
`<link href="<?php echo  get_template_directory_uri() ?>/css/〇〇.css" rel="stylesheet">`


#####<?php echo home_url(); ?>
ホーム画面へのリンク読み込み

#####ページの前後移動リンク
`<?php previous_posts_link(); ?>
        <?php next_posts_link(); ?>`
または
`<?php echo paginate_links(); ?>`

#####<?php the_permalink(); ?>
hrefに入れると記事へのリンクになる
リンク先のページはテンプレート階層に従う


##よくあるミス
#####CSSが反映されない場合
head外のパス設定ミスの可能性。
headタグ外にもCSSを参照している箇所がある場合は<?php echo get_template_directory_uri() ?>/で読み込む必要があります。echoしましょう。
弱者のためのさくらのレンタルサーバでWordpress #0 序章

このエントリーの目的は安く簡単にそしてある程度の可用性を持ちながらWordpressのサイトを立ち上げるために書いています。
弱者の戦略です。
ただ、弱者の戦略と言えども、戦略には変わりはなく、ちゃんといくつかの理由からなるエントリーです。

どうも、最近、パブリッククラウドでWordpressを立ち上げる方が多いです。
で、満足な運用をできない。
金をどぶに捨てているようなものです。
その点、さくらのレンタルサーバは安く、そしてインターネット勃興期から使われた実績もあります。
弱者はパブリッククラウドなど使わず、さくらのレンタルサーバに頼りましょう！

#さくらのレンタルサーバのいい点
まず、さくらのレンタルサーバのいい点をいくつか挙げてみたいと思います。

##1.安いわりに可用性があり、サポートもいい
私はWordpressブログをさくらサーバに置いています。
2年間使っていますが、サーバダウンは実用上、問題になるレベルでは起こっていません。
また、サポートもいいです。
おかしなアクセスがあるとメールで報告してくれます。
無料サーバだとここまで望めません。
料金は100GBのストレージで初期費用1,048円、月額524円です。
100GBのストレージが小さい？
本格的な商業ブログをやる方はちゃんとしたITエンジニアに頼んで、AWS、GCP、Aureでやるべきです。
PoCのようなプロジェクトや事業の立ち上げでは、このぐらいでいいです。
撤退する時のコストもかかりません。

##2.コマンドレスで使える
パブリッククラウドのAWS、GCP、AzureになるとシェルにアクセスしてCUIでLinuxのコマンドを使い、パッケージをインストールする必要があります。
さくらのレンタルサーバはGUIのWebでの操作だけでWordpressをインストールできます。
シェルも用意してありますが、わざわざ使うことはないです。
もちろん、Wordpress側のテーマやプラグインのインストールはWordpressのGUIのAdmin画面でやる必要があります。
ただ、ここまでできないなら、もうWordpressはあきらめたほうがいいです。
エントリーを書くにしても、このAdmin画面から行います。
それなら、商業ブログサイトを使うべきです。
ただし、広告なしにするには、それなりにコストがかかってきます。
また、コマンドレスで運用できるため、ミスコマンドによるサイトがぶっ壊れるとかありません。

##3.汎用的なサーバとしても使える
Apacheはインストール済みなので、静的なWebサイトのサーバとしても使えます。
また、メールサーバもあるので、独自ドメインを取得して、メールサーバとして使うことも可能です。

#さくらのレンタルサーバの悪い点
さて、いい点を3つばかり挙げましたが逆の点についても。
##1.あくまでサーバ共有でベストエフォートなこと
サーバは共有型です。
占有型ではないので、速度の保証はありません。
ただ、パブリッククラウドでサーバ占有型はコストがかなりかかります。
AWS、GCP、Azureもスケールを広げたところで厳密な意味でのサーバ占有ではないはずです。

##2.独自ドメインの処理が変なこと
これは使ってみないとわからないのですが、まず、ユーザー個別に与えられているドメインにアクセスしてから独自ドメインに転送されます。
ネットの速度が遅いとわかります。
とは言え、名前解決自体はしてくれるので、あまりUXに影響はないです。

##3.ストレージの巻き戻しができない
まぁ、これはよくオンプレミスで運用していた方に言われます。
オンプレミスはバックアップしているので、サーバのバックアップから巻き戻しができます。
ただ、HP、ブログ管理者が素材管理しないと言うのもいかがなものかと思います。
まず、サイトへアップする前に素材をローカルで保存する運用にするべきです。

個人的な見解になりますが、Wordpress専用のレンタルサーバは最適化されているかもしれませんが、概して値段が高いです。
CDNを利用すると、さらに高くなります。
正直、そこまで必要なアクセスがある方ならビジネスベースに乗るはずなので、専門の協力会社を使うべきです。
個人で運用するなら、最低限のITリテラシーがないとWordpressに限らず、ブログ運用が難しいです。

と言うことで、#0 序章を終わります。
反響があったら、実際の操作のスクリーンショットなどがある#1以降を書こう思います。
【Python】rootユーザー以外のユーザーでpipしたときにパーミッションで怒られた話

# エラー発生
pipでモジュールをインストールしたいと思い、下記のコマンドを実行しました。

```sh:失敗コマンド
pip install kanjize -t ./python
```

```sh:実行エラー
PermissionError:
```

上記のように、実行すると、権限が無い為、実行エラーになりました。

# はじめにやったこと

```sh:はじめにやったこと
sudo pip install kanjize -t ./python
```
実行した結果、上手くいきませんでした。

RootユーザーのPythonバージョンを調べてみると・・・

```
sudo python -V
⇒Python 2.7.16
```

通常のバージョンは、

```
python -V
⇒Python3.7.6
```

ルートの参照しているPythonが違いました。

# 解決する為にやったこと
今回は、pipさえできればいいので、下記のコマンドで、Python3.7.6のパスを調べ、

```
which python
⇒/usr/bin/.pyenv/shims/python
```

調べたPythonのパスを`sudo`で叩いてみました！！

```sh:成功したコマンド
sudo /usr/bin/.pyenv/shims/python -m pip install kanjize -t ./python
```

強引な方法ですが、pipする事が出来ました。
(翻訳)HDFSのディスクとデータノードのサイズについて(Cloudera blog記事の超意訳)

たまたまCloudera blogの内容が目に留まったので超ざっくり意訳してみました。
Hadoopクラスターのデータノードサイズの検討に役立つ記事でした。
https://blog.cloudera.com/disk-and-datanode-size-in-hdfs/

Hadoop運用してればわかることかと思いますが、bit-rotのところや、ブロックレポートがあるってところは勉強になりました。
ところどころ勝手な意訳が入ってます。

----

適切なディスクサイズと容量はどれくらいかって話です。

アクセスが少ないデータに対して容量の大きいストレージを割り当てるのはいいですが、
アクセスが多いデータに対して容量の大きいストレージを割り当てるのは要注意です。

というのも以下の二つが要注意
1. 容量の大きいディスク - 総容量と同じことですが、より多くのディスクを使った方が高IO帯域になります。
2. 高容量ノード - (1台あたりの)容量が大きくなると、障害復旧に時間がかかるようになります。

これらはHDFSに特異ってわけじゃなくて、耐障害性を高めるためにレプリケーションしてる分散ストレージサービスであればどれも当てはまるでしょう。

なので1データノードあたり100TBで8ディスク以上が推奨です。
1ディスク8～12TBで100TBが上限です。

# HDFSで大容量ボリュームの時のインパクト

## IO帯域が減る

データノードが96TBだとして、8TBx12本と16TBx6本を考えてみよう。
100MB/secのread/writeスループットと7200RPMのスピードと仮定する。

|       |8TBx12本|16TBx6本|補足|
|:-----------|:------------:|:------------:|:-----------|
|Read/Writeスループット|1200MB/sec|600MB/sec|100MB x ディスク数
|Random IOPS|2880 |1440 |ちょっとわからないんですが、(7200 / 60) x 2 x ディスク数かと思います。

## bit-rot 検知に時間がかかる

bit-rotを検出するためにデータノードはブロックをスキャンしてます。
そのスキャンは通常3週間ごとに行われます。
アプリケーションが動いてたらそのスキャン作業とリソースの奪い合いになります。
設定は変えられるけど5MB/secとしましょう。

12TBのディスクだったら、12TB/5MBps≒28日くらい

ディスクサイズ増えたらもっと時間かかります。

※bit-rot:経年劣化により磁気ディスクが読み取れなくなってしまう障害

## ブロックレポートが重くなる

容量が大きくなればブロックレポートのブロック数も増えます。
データノードごとにブロックレポート生成時間が増え、RPCペイロードも増え、ネームノードでのブロックレポート処理も重くなり
クラスターの性能が落ちることになります。

# 高容量ノードのインパクト

## 障害復旧に時間かかる

ストレージのノードが落ちたら、冗長性のためにデータブロックをレプリケートしなければなりません。
リカバリー時間はデータノードサイズに比例するし、データノード数に反比例します。

リカバリー時間= (c * s)/n とすると

cは定数、sは各ノードの使用容量、nはストレージノード数。

クラスターの容量が与えられてるとすると、ノード毎の容量が2倍になるとリカバリー時間は4倍になります。
各ノードの容量が2倍になってノード数が半分になると仮定すると、

リカバリー時間=(c * 2s)/(n/2) = (4 * c * s)/n

変数sとnは他のストレージソリューションでも同様に重要です。
高容量データノードはどんなクラスターでもリカバリー時間に同じようなインパクトがあるでしょう。

## データノードのデコミッション時のインパクト

計画的なノードのデコミッション中でも、すべてのブロックは他ノードに再レプリケートされます。
高容量データノードのデコミッション時間の影響はデータノード障害のリカバリー時間とほぼ同じです。
クラスターの容量が与えられてるとすると、ノード毎の容量が2倍になるとリカバリー時間は4倍になります。

HDFS-14854でデコミッション時のパフォーマンス改善が実装されてます。
今後のCDPで有効になるでしょう。


---

1データノードあたりの容量が増えると障害が起きたり、デコミッション時のデータ復旧に時間がかかるのはほんんんと同意。
かといって容量減らしてサーバー増やすとか、サーバーラックもおいそれと倍にできるわけじゃないから悩ましいです。
あらためて小さい容量のサーバーがたくさんあるほうがいいことがわかります。
またブロックレポートというのも今回で初めて知りました。Hadoopクラスターは裏でいろいろと動いてるのも調べないとわからないですね。
Gmailで必要ないメールをフィルタで即自動削除する方法

Gmail に定期的に送られてくるメールで読まずに自動削除してしまいたいときには、フィルタ機能を使用することで自動でゴミ箱送りにしてくれます。
自分は例えば「Find My (探す)」アプリでデバイスの音を鳴らしたときに、Apple からメールが送られてくるのが鬱陶しいので設定しています。

# 方法

1. 右上の歯車マークをクリック
2. 「設定」をクリック

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155587/f37739bb-c88e-132f-b300-b7c93988c2af.png" width="300px">
3. 「フィルタとブロック中のアドレス」をクリック
4. 「新しいフィルタを作成」をクリック
5. ルールを入力
6. 「フィルタを作成」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155587/fd667ec6-2a19-9810-334f-c52fe1161e7e.png" height="350px">
7. 「削除する」にチェック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155587/9d05d790-d7f8-f85d-78a8-7f784622887c.png" height="450px">
8. 「フィルタを作成」をクリック
9. 完了
Synergy をつかってmacOSとubuntuで「１台のディスプレイの表示を切り替えてる環境」でキーボードとトラックパッドを共有する

# 前提
* キーボードとマウスを Synergy https://symless.com/synergy を使って共有する
* このときキーボードとマウスは macOS 側のものをつかう（macOSがサーバ、ubuntuがクライアントになる）
* ディスプレイは１台で、端子毎にマシンを接続し、表示は表示対象の端子を切り替えることでおこなう

# このときにどんな問題があったか？

ディスプレイにはそれぞれ「ubuntuのインストールされたPC」と「蓋をとじたMacBook Pro」が接続されています。で、それぞれにSynergyをインストールして適切な設定をすることでキーボード・マウスの共有は簡単に出来ました。ただし、macOS側からubuntu側に操作をする対象を変更して、画面表示を切り替えるとSynergyの接続が切れてしまいます。で、よくよく考えてみたら、画面を切り替えたあとのMacBook Proはクラムシェルモードだったのが「ディスプレイを認識しなくなったのでスリープになってしまい接続が切れるということがわかりました。で、これの嫌らしいところは「切れたあとにトラックパッドを動かして瞬間起動させることでまた接続が復活する」ので問題がどこにあるのかよくわからないことです。

# 解決するには

結論としては「MacBook Proの蓋を閉じてもスリープしないようにすればいい」ということになります。で、そのなかで一番手軽なのは、、、

* Fermata https://github.com/iccir/Fermata を使う

というのが一番手軽でした。ただし公開されてないAPIを使っているという話なのでいつ使えなくなるのかはわかりませんし、そういうアプリなので自己責任で使うようにしましょう。とはいえカーネルエクステンションを入れるとかはない（どうようのアプリではそういうタイプのものもある）ので気楽なのは気楽っです。

で、これMacBook Proでなにか長時間のタスクを回してる、というときなどにも便利です。先二位も書いたように（すべてのモニターがそうかは別にして）モニターをスリープさせたことでMacBook Proが自動的にモニターを認識しなくなり、スリープする、などがどうもありそうで、というのもディープラーニングでモデル作成をしてるときに画面スリープ後に極端に処理が遅くなってる、みたいな例が手元でありました。そういうときにスリープしないようしておけば安心かな、、、と。まぁ蓋を開けてつかうとか、電源繋いでるときには画面をスリープしないようにしてスクリーンセーバーで対応する、など方法はありそうですが。とはいえ「絶対にスリープさせたくない」という状況はありそうなんでそういうときにつかってみるといいかもしれません。

とりあえず手元では無事MacBook Proでつかってるキーボードとトラックパッドをつかってubuntuのchromeでこの記事を書いています（途中３回くらいリターンがおされっぱになる現象に出会しましたがまぁ、このくらいはいいでしょう）。

キータッチが変わらないって最高です。。。
基本情報技術者　テクノロジ系　第9章 データ構造、アルゴリズム、プログラミング⑤



# 整列
データを並べ替えるアルゴリズムについてです。

## 整列アルゴリズム
下記のようなものがあります。


### 交換法 O(n2)
隣同士を比較して
順序が逆であれば入れ替えます。

### 選択法 O(n2)
最大値、最小値を順じ取り出す。

### 挿入法 O(n2)
整列済み要素の適切な位置に
未整列要素を挿入する処理を繰り返します。

### クイックソート O(nlog n)
基準値よりも大きなグループと
小さいグループに分ける。
その後同様の処理を繰り返します。

二分法に近い形です。

### マージソート O(nlog n)
整列済みの二つの配列を併合することを
繰り返します。

配列データの2分の1を格納する作業領域が必要です。

### シェルソート　O(n 1.25)
挿入法の改良版

一定間隔ごとに整列し、感覚を徐々に狭めながら再度整列を繰り返します。

### ヒープソート O(nlog n)
ヒープの根を取り出して、ヒープを再構築することを繰り返します。
CC BYデータの3次, 4次, 5次, 6次............. 利用について

# 前置き
プログラミングに直接関係ない気がするけど、クリエイティブ・コモンズ分かる人なんて限られてると思うのでQiitaに書きました。
それと本記事では**BY**以外は触れません。

# CC BY #とは
これを見なさーい😾
https://creativecommons.org/licenses/by/4.0/deed.ja

要するに著作権表記してって事ですね。
`© 20xx example`とか書かれてるあれです。

# 2次利用に関して
2次利用は普通に権利表記すればいいだけです、どのサイトにも書かれていますね。

# 3次利用に関して
## 想定
データ(1次 CC BY)
↓
API(2次)
↓
アプリ(3次)

## 説明
詳しい事はCCの[FAQ](https://creativecommons.jp/faq)を見れば分かるので、簡素に書きます。

これは2次のライセンスによって2通りに分かれます。

1. 2次にCCライセンスが**適用されている**場合、CC BYもしくはそれ以上のライセンスであることが**確定する**ので、2次の権利表記をするべきです。  
理由は[CCライセンスの付いた作品を元にして、新しい作品を作りました。この新しい作品には、どのようなCCライセンスを付けることができますか？](https://creativecommons.jp/faq/#c11)を御覧ください。
2. 2次にCCライセンスが**適用されていない**場合、2次の独自ライセンスに沿って利用する必要があります。  
この場合の2次のライセンスは*All rights reserved*とすることが可能です。  
理由は[CCライセンスの作品を利用する際、何を記載すればよいのでしょうか？　また、CCライセンスのURLやアイコン、バナー等も表示しなければならないのでしょうか？](https://creativecommons.jp/faq/23/#a6)を御覧ください。

# 結論
本記事を読んで分からない人は1次と2次の権利表記しよう
(独自ライセンスならちゃんと読もう)
基本情報技術者　テクノロジ系　第9章 データ構造、アルゴリズム、プログラミング④



# 探索
アルゴリズム: 処理の手順
データを探すアルゴリズム: 線形探索、二分探索、ハッシュ法

## 時間計算量(オーダ)

データ数の増加に対する、処理時間の増加指標

### オーダ記法(O記法)
O(n)などと記述して、効率の良さを表します。
(n)は処理するデータの数を表します。

#### O(1)
データ数にかかわらず、処理時間が一定

#### O(log n)
データ数が２倍に増えても、手間が一回増えるだけ

#### O(n)
データ数が10倍だと処理時間も10倍になります。

#### O(nlog n)
データ数が10倍だと処理時間も30倍になります。

#### O(nc) (cは小文字)
データ数が10倍だと
処理時間は二乗で100倍になります。

## 探索アルゴリズム
左のオーダ記法は時間計算量を表します。

### 線形探索 O(n)
順番に一つずつ、値の比較をしていく

### 二分探索 O(logn)
データの整列が前提条件
データを前半と後半に分けて行います。

小さい順に並んていれば
中央値>目的値　であれば前半を
中央値<目的値　であれば後半を探します。

### ハッシュ法 O(1)
事前にハッシュ表に登録しておく必要がある。

ハッシュ関数を用いて
格納場所のアドレスを計算して、目的の値を探します。

## 線形探索
先頭要素から順に探します。

## 二分探索
データを昇順に整列させておく必要があります。

最小値と最大値の平均から中央値を算出する。

そこから前半と後半を分けて探索
仮に後半にあれば同様に分けて再探索

要は、中央値を求めて半分削って行って探索する方法です。

## ハッシュ法
データの格納場所を計算によって決める方法です。

### ハッシュ関数
データの格納場所を求める計算式

## ハッシュ法により衝突(コリジョン)
異なったキーに大して、同じハッシュが計算されること

### シノニム
後から、同じハッシュとして計算されたハッシュのこと
下記の方法で処理がされます。

* オープンアドレス法: 空き領域に格納
* チェーン法: 同じハッシュの値をリストで管理する方法
SAMで作成されるApiGatewayをエッジ最適化以外で作成したいとき

SAMだとApiGatewayのリソースを書かなくても暗黙的につくられますが、既定ではエッジ最適化でつくられているので、リージョンとかプライベートでつくりたい。
今回はリージョンで指定します。

`AWS::Serverless::Api` のリソースを記述して、 `EndpointConfiguration` に `REGIONAL` を指定します。
`AWS::Serverless::Function` のEventsに `Type: Api` を作成しますが、その際に `RestApiId` を指定して、先ほど作成した`AWS::Serverless::Api` リソースを参照するように指定します。

```template.yaml
Resources:
  ApiGatewayApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      EndpointConfiguration: REGIONAL
  FooFunction:
    Type: AWS::Serverless::Function
    Properties:
      Events:
        Foo:
          Type: Api
          Properties:
            Path: /foo
            Method: post
            RestApiId: !Ref ApiGatewayApi
```

## 参考

- https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-api.html
Ubuntu 18.04＋PhpStorm(IntelliJ)で絵文字を表示する

Ubuntu 18.04のPhpStorm(IntelliJ)で絵文字が表示できない問題があったので解決方法を調べました。

# 結論

symbolaフォントをインストールすれば良い様です。

```
sudo apt-get install fonts-symbola
fc-cache -f -v
```

（こんな感じで表示されます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71575/6e32ee4b-808b-7e46-d2e4-59032d4dbc22.png)

参考ページ： https://youtrack.jetbrains.com/issue/IDEA-192107