OmniAICreator/Qiita-1.07M huggingface dataset:
PASCAL VOC 2012メトリック評価器のPython実装

モチベーションとしては物体検出のベンチマークとしてはスタンダードなPASCAL VOCのメトリックによるmAPの評価器を手に入れたいということになります。実装は出来ればライセンスも無く、あまり読めないMATLAB版よりPythonなどで書かれたものが良いです(そしてPythonの方が速い)。

ということで色々探した結果、https://github.com/amdegroot/ssd.pytorch でmAP評価器の実装が見つかりました。この実装には些細なバグはあり、その内容については[VOC07のメトリックの計算](https://qiita.com/nnabeyang/items/fb1e458f473937e585be)について紹介したときに紹介しました。

今回は、前回修正したコードを使ってVOC2010のメトリック計算の結果と、2012年版の公式ツールとを比較しました(公式ツールは[Pascal VOC Dataset Mirror](https://pjreddie.com/projects/pascal-voc-dataset-mirror/)のVOC 2012のDevalopment Kitから入手可能です)。文献を見る限り、メトリックの変更が行われたのは2010年で、2012年も同じものが使われているようです。ですが、使った公式ツールが2012年版なのでこの記事のタイトルも2012としています。

それでは前回と同様、重み[ssd300_mAP_77.43_v2.pth](https://s3.amazonaws.com/amdegroot-models/ssd300_mAP_77.43_v2.pth)を使用した場合の結果を示します。

|ap	    |MATLAB   |	python(修正後)| python(修正前)|
|-----------|---------|--------------|--------------|
|aeroplane  |	0.8504|	       0.8505|	      0.8485|
|bicycle    |	0.8843|	       0.8842|	      0.8850|
|bird	    |   0.7888|	       0.7885|	      0.7860|
|boat	    |   0.7282|	       0.7281|	      0.7231|
|bottle	    |   0.5110|	       0.5110|        0.5001|
|bus	    |   0.8847|	       0.8851|	      0.8850|
|car	    |   0.8946|	       0.8945|	      0.8896|
|cat	    |   0.9012|	       0.9013|	      0.9013|
|chair	    |   0.6345|	       0.6345|	      0.6292|
|cow	    |   0.8656|	       0.8655|	      0.8625|
|diningtable|	0.8135|	       0.8134|	      0.8137|
|dog	    |   0.8867|	       0.8869|	      0.8855|
|horse	    |   0.9016|	       0.9016|	      0.9016|
|motorbike  |	0.8735|	       0.8734|	      0.8734|
|person	    |   0.8210|	       0.8208|	      0.8157|
|pottedplant|	0.5133|	       0.5133|	      0.5083|
|sheep	    |   0.7990|	       0.7989|	      0.7930|
|sofa	    |   0.8287|	       0.8291|	      0.8281|
|train	    |   0.8911|	       0.8911|	      0.8911|
|tvmonitor  |	0.7956|	       0.7957|	      0.7933|
|mAP	    |   0.8034|	       0.8034|	      0.8007|

MATLAB版の計算の実行にはoctaveを使用しました。テスト自体はVOC2007のtestデータを使用しています。2007と2012で画像IDのフォーマットが変わっている関係で`VOChash_init`と`VOChash_lookup`には修正が必要です。あとは`tic;`が抜けていてエラーが出る箇所がありました。

ついでながら、調べる過程でhttps://github.com/rafaelpadilla/Object-Detection-Metrics についても調べましたが、PASCAL VOC型のデータセットでdifficultが1になっているときの処理を含まないので、公式ツールからは結果がズレます。定義の意味ではmAPを計算していると思いますが、他の論文との比較にはならないのではと思います。

今回の計算結果を出すのに使用したコードは[ここ](https://github.com/nnabeyang/ssd.pytorch/tree/pytorch1.5.1)から入手可能です。MATLAB版についてはライセンスが良く分からないので、修正後のコードは公開はしていません。
ssh-add できないときの解決方法

#ssh-addができないときの解決方法
gitで詰まったところを備忘録的に書いています．

##環境
windows 10
git bash
##結論
手順をとても簡単にしたものです

```
#ssh-agentをバックグラウンドで起動
$ eval $(ssh-agent -s)
Agent pid 1440

#ssh key を追加
$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /c/Users/Username/.ssh/id_rsa:
Identity added: /c/Users/Username/.ssh/id_rsa (example@mailm)

#確認する
$ ssh-add -l
(あなたのキー)
```

##問題点
ssh公開鍵を毎回パスフレーズ求められるのは面倒くさい，，

```
$ git pull
Enter passphrase for key '/Users/Username/.ssh/id_rsa':
```
##解決方法
ssh keyを自動で認証できるようにしよう

1.このままだとssh-addできない

 ```
$ ssh-add ~/.ssh/id_rsa
Could not open a connection to your authentication agent.

$ ssh-add -K
Could not open a connection to your authentication agent.

$ ssh-add -l
Could not open a connection to your authentication agent.

```

2.ssh-agentをバックグラウンドで起動
とりあえずssh-agentすればいいすればいいらしい

```
//これはできなかった
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-IFr4jBWrz8XT/agent.1429; export SSH_AUTH_SOCK;
SSH_AGENT_PID=1430; export SSH_AGENT_PID;
echo Agent pid 1430;

#これもできなかった
$ eval "ssh-agent"
SSH_AUTH_SOCK=/tmp/ssh-axacGz0TApMp/agent.1434; export SSH_AUTH_SOCK;
SSH_AGENT_PID=1435; export SSH_AGENT_PID;
echo Agent pid 1435;

#これで成功
$ eval $(ssh-agent -s)
Agent pid 1440

```

3.ssh-addする
こんな感じで返ってきたら毎回パスフレーズを求められなくなる．

```
$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /c/Users/Username/.ssh/id_rsa:
Identity added: /c/Users/Username/.ssh/id_rsa (example@mailm)

#確認する
$ ssh-add -l
(あなたのキー)
```

##参考文献
[新しい SSH キーを生成して ssh-agent に追加する](https://docs.github.com/ja/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)
リーダブルコード  ~実務未経験が知っておきたい15のポイント~

#はじめに
リーダブルコード読破しました。総ページ237ページ。
マジできつかった・・・。２日程度かけて読み込みましたが、結構しんどいです。
書いているコードをある程度理解するのも難しいので、プログラミング初学者にはあまりおすすめ出来ません。正直後半は流し読みでした(´・ω・｀)
それでもかなり実務に役立ちそうな箇所は多くあったので、わかりやすくまとめてこれから実務で実践していく用として記録していきます。

#参考文献・参考記事
・[リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655 "リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック") 

・[リーダブルコードを読んだので、殴り書き](https://qiita.com/Kenya/items/faec4cc374edd5ffbba6 "リーダブルコードを読んだので、殴り書き")
この記事にリーダブルコードの全てが記載されていた。この記事読む意味ないので、こっち読んで下さい(・_・)（~~これ読んだら記事書く意味がなくなったww~~)

#実務未経験が知っておきたい15のポイント
参考文献・参考記事記載の通り、[リーダブルコードを読んだので、殴り書き](https://qiita.com/Kenya/items/faec4cc374edd5ffbba6 "リーダブルコードを読んだので、殴り書き") に全てが記載されていたので、個人的に重要と思った15のポイントにしぼって記載します。

###基本概念
***「コードは理解しやすくなければいけない」***
「コードは他人が最短で理解できるコードでなければならない」
「コードは短い方がいいが、"理解するまでにかかる時間"を短くするほうが大切」

###15のポイント

1.名前に情報を詰め込む。
2.一貫性を持たせたレイアウトで目に優しいコードを書く。
3.コードから読み取れるコメントは不要。ひどい名前は名前を変える。
4.コメントには自分の考えを記録する。読み手にコードの意図を伝える。
5.コードの欠陥にはコメントをつける。
6.条件式は否定形よりも肯定形を使う。三項演算子はコードが見にくければ、極力避ける。
7.複雑なコードは「もっと簡単なコードがあるはずだ」と考える。最適ライブラリを探したり、短く簡単にする。
8.コードが読みやすくならない変数を削除する。グローバル変数は避ける。変数は一度だけ扱う(できるだけ)。
9.関数やコードブロックをみて「このコードの高レベルの目標は何か？」と自問する。プロジェクト固有のコードから汎用コードを分離する。
10.「一度にひとつのタスク」を行う。そこで行われているタスクをすべて列挙する。タスクをどのように分割するかよりも、分割するということが大切。
11.コードに想いを込める。おばあちゃんがわかるように説明できなければ、本当に理解したとは言えない。読み手が理解できるように「簡単な言葉で」書くべきなのだ。
12.使用する言語のあらゆるライブラリを自分の頭にインプットする。それが読みやすく、短いコードを書くことに繋がる。
13.かっこいい機能の実装について悩まないで、きっと必要ないから。将来的には必要となる保守や文章化などの「負担」時間を忘れがちになるから。シンプルにしよう。
14.コードを小さく保つ。汎用的な「ユーティリティ」コードを作って、重複コードを削除する。
15.平均的なソフトウェアエンジニアが一日に書く出荷用のコードは10行。成熟したライブラリコードの裏側には、膨大な設計・デバッグ・修正・文書・最適化・テスト・が存在する。積極的にライブラリを再利用しよう。

#まとめ
本当は5つにするつもりでしたが、重要なことが多すぎて15になりました。
「リーダブルコード」には開発において重要なことが多く記載されています。
・[リーダブルコードを読んだので、殴り書き](https://qiita.com/Kenya/items/faec4cc374edd5ffbba6 "リーダブルコードを読んだので、殴り書き")
上記の記事が本当にわかりやすいので、強くおすすめします。
ひと目で意識できるサブ用にお使い頂けたら幸いです。
Host sFlow のご紹介：SNMPに代わるサーバー性能管理

#Host sFlow のご紹介：SNMPに代わるサーバー性能管理
Host sFlowは、一般的なサーバやアプリケーションのパフォーマンス情報をエクスポートするフリー（無償）のオープンソースエージェントです。
Host sFlowエージェントは、sFlowプロトコルを使用して、物理/仮想サーバーのパフォーマンス情報をエクスポートします。
このエージェントは、監視対象のシステムへの負荷を最小限に抑えて、スケーラブルにマルチベンダー・マルチOSに対してのパフォーマンスモニタリングを提供します。

Host sFlowは、
http://www.sflow.net/
のサイトからダウンロードしインストールする事が出来ます。

このサイトの”DOWNLOAD NOW”ボタンより、マルチベンダー・マルチOSに用意された各パッケージをダウンロードし、インストール&コンフィグレーションしてください。

“Documentation”にInstallation/ConfigurationのInstructionがあります。

このHost sFlowの情報は、
フリーの [sFlowTrend](https://qiita.com/Shinya_IDENO/items/43f412fd30754fc1eaff) や 商用版の [InMonTrafficSentinel](https://qiita.com/Shinya_IDENO/items/c1fe2a70da8bc9bfa469) で見ることができます。

####Host sFlow レポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705452/91c545c3-1315-7ab7-0fe7-7ea0132781db.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705452/d7e15f4a-71cb-223c-656c-b26571fd862b.png)
DOSコマンドメモ


##コマンドメモ

dosコマンドでよく使うのをまとめてます


```bat:DOSコマンドメモ.bat

@echo off

rem 画面クリア
cls

rem 日付取得(YYYYMMDD)
set ymd=%date:~0,4%%date:~5,2%%date:~8,2%

rem 年月日を取得
set Year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%

rem カレント設定
cd /d %~dp0

rem 色背景色設定
COLOR B1

rem ファイルの存在チェック
IF NOT EXIST ファイルパス (
　　NOTなのでファイル無し
)


    REM ファイル名が存在するかチェック
    IF EXIST ファイル名 (

        FOR /F  %%a IN ('type パス￥ファイル名 ^| FIND /C /V "" ') DO (
            REM 0件以上の場合
            IF %%a GTR 0 (
　　　　        rem ０行以上あり
            ) ELSE (
       　　　　　rem データ無
　　　　     )
        )
     ) ELSE (
        rem ファイルが存在しない場合
     )






```
[Ransack] ransackable_scopesには気を付けろ！

# 結論
`ransackable_scopes`で実行する`scope`に渡す引数が以下の値だったら
`ArgumentError wrong number of arguments (given 0, expected 1)`
が発生するから気を付けろ！！！

- `"true"`, `"TRUE"`, `"t"`, `"T"`, `1`, `"1"`
- `"false"`,`"FALSE"`,`"f"`,`"F"`,`0`,`"0"`

これらの値はそれぞれTrue, Falseに**暗黙的に変換**されるため、引数に渡せない。




## 解決策
```config/initializers/ransack.rb
Ransack.configure do |config|
  config.sanitize_custom_scope_booleans = false
end
```
これを追記するだけで、**上述の値全てを渡せるようになります**。[^1]


## 渡せる値をカスタムしたいなら
**諦めてください。**
暗黙的に変換される値は [`Ransack::Constants::BOOLEAN_VALUES`](https://github.com/activerecord-hackery/ransack/blob/c9cc20de9e0f7bab92e0579c85bed64d614d23de/lib/ransack/constants.rb#L26
)[^2] で定義されています。
この定数は`freeze`されています。
公式によると`freeze`したオブジェクトを**unfreeze**する方法は無いそうです。[^3]
> There is no way to unfreeze a frozen object.


変換される値のカスタマイズついてはかなり調べましたが、無理でした。。。
一応、[「暗黙的に変換する値をカスタマイズできるようにしたよ！」って内容のPR](https://github.com/activerecord-hackery/ransack/pull/742)がマージされていました。
これによると、以下のように変換する値をカスタマイズできるらしいです。

```.rb
Ransack.configure do |config|
   config.truthy_values_to_convert_in_custom_scopes = ['TRUE', 'true', '1']
   config.falsey_values_to_convert_in_custom_scopes = ['FALSE', 'no way no how']
end
```

**しかし、それ通りに記述しても以下のようなエラーが発生しました。**

```.rb
=> NoMethodError: undefined method `truthy_values_to_convert_in_custom_scopes' for Ransack:Module
```
**ファッ！？！？！？！？！？！？！？！？！？！？！？！？**
[PRの実装内容](https://github.com/activerecord-hackery/ransack/pull/742/files)をを確認しましたが、概要で書かれているような内容は実装されていませんでした。。。
誰かここ分かる方がいれば教えてください。。。


また、@t_oginoginさんがRansackを使わない解決策を提案してくれているので、皆さんの実装状況に合わせてご参考下さい。
https://qiita.com/t_oginogin/items/b45636d64c271ebc409c

## 参考文献
[^1]: sanitize_custom_scope_booleansについて（Ransack公式）
 https://github.com/activerecord-hackery/ransack#using-scopesclass-methods

[^2]: BOOLEAN_VALUESの中身（Ransack公式）
 https://github.com/activerecord-hackery/ransack/blob/c9cc20de9e0f7bab92e0579c85bed64d614d23de/lib/ransack/constants.rb#L26

[^3]: unfreezeできない（Ruby公式）
 https://ruby-doc.org/core-2.6.6/Object.html#method-i-freeze
PHP 配列の中の配列の値を書き換える方法

# 目的

- 配列の中に入った配列の中の値を更新する方法をまとめる

# 実施環境

- 下記サイトにてPHPの動作を確認しながら本記事を書いた。
    - [https://paiza.io/ja](https://paiza.io/ja)

# 例

- 配列の中に入った配列の値を更新する処理を下記に記載する。

    ```php
    foreach (配列A as &変数){
        変数['インデックス'] = '更新したい値';
    }
    ```

# 連想配列の既存インデックスのデータを書き換える具体例

- 配列「$infos」には連想配列が格納されている物とする。
- 連想配列にはインデックス「id」に商品IDが、インデックス「item_name」に商品名が、インデックス「price」に商品の税抜きの値段が格納されている物とする。
- 配列「$infos」に格納されている連想配列のインデックス「price」の税抜き金額を引き出し、税率を用いた計算をし、連想配列のインデックス「price」の税抜き金額を税込み金額で書き換える方法を下記に記載する。

    ```php
    <?php
    
    $infos[] = [
        'id' => 1,
        'item_name' => 'PHP book',
        'price' => '1000',
        ];
        
    $infos[] = [
        'id' => 2,
        'item_name' => 'Ruby book',
        'price' => '1200',
        ];
        
    foreach ($infos as &$info){
        $info['price'] *= 1.1;
    }

    var_dump($infos);
    
    ?>
    ```

# 連想配列に新規インデックスを追加する具体例

- 配列「$infos」には連想配列が格納されている物とする。
- 連想配列にはインデックス「id」に商品IDが、インデックス「item_name」に商品名が、インデックス「price」に商品の税抜きの値段が格納されている物とする。
- 配列「$infos」に格納されている連想配列のインデックス「price」の税抜き金額を引き出し、税率を用いた計算をし、連想配列にインデックス「price_in_tax」を追加する方法を下記に記載する。

    ```php
    <?php
    
    $infos[] = [
        'id' => 1,
        'item_name' => 'PHP book',
        'price' => '1000',
        ];
        
    $infos[] = [
        'id' => 2,
        'item_name' => 'Ruby book',
        'price' => '1200',
        ];
        
    foreach ($infos as &$info){
        $info['price_in_tax'] = $info['price'] * 1.1;
    }

    var_dump($infos);
    
    ?>
    ```

# 参考文献

- [https://www.javadrive.jp/php/for/index10.html](https://www.javadrive.jp/php/for/index10.html)

```php

foreach ($items as &$item){
    $item['id'] = 123;
};

```
macのChromeでDevToolsを開くつもりがメーラを起動してしまうのをやめたい

DevToolsを起動したいのにmacOSのメールアプリが起動してしまったこと、ありますよね。この設定をすれば間違えてメールアプリが起動することはなくなります。

## 環境
- macOS Catalina 10.15.6
- Google Chrome 85.0.4183.102（Official Build）

## やり方

全体の方針は、Chromeのメーラーを開くショートカットキーの変更です。

1. システム環境設定を開き、キーボードを押す
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74853/d783a7b5-a737-cea4-7ad1-78addfa8f3d8.png  width=50%>

2. ショートカットタブを開き、アプリケーションを選択後、画像赤丸部分の＋を押す
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74853/426a9926-6699-868b-0d24-41a235c00e23.png  width=50%>

3. アプリケーションはGoogle Chromeを選択し、メニュータイトルは日本語設定の場合、**必ず** `リンクをメールで送信` にして、キーボードショートカットはまあ押さないであろう好きなやつを入れてください。僕は`⌘ ⌃ ⌥ E`にしました。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74853/abe942ae-d33c-9308-48e0-80a5e67e0df4.png  width=50%>

4. Google Chromeを `⌘Q` でkillして再度起動すると反映されます🎉

## 仕組み
システム環境設定のキーボードショートカットは、対象のアプリケーションの既存のメニューのキーボードショートカットを置き換える（割り当てる）もののようです。そのため、メニューに表示されてる名前（メニュータイトル）と完全に一致している必要があるようです。

今回は`リンクをメールで送信`というメニュータイトルなので、必ずそれを入力して貰う必要がありました。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74853/ae3b1233-0745-ffbf-f169-5456bda59dd8.png  width=50%>
[TypeScript] 自然数型を定義する

TypeScriptの練習のために `[0, 1, 2, 3, 4, 5 ・・・]` となる自然数型を作ってみました。

## 実装
```typescript:v4.0.2
type NaturalNumber<Num extends number> = Rec<Num, []>;

type Rec<Num, C extends unknown[]> = {
  0: C,
  1: Rec<Num, Append<C, C['length']>>
}[C['length'] extends Num ? 0 : 1];

type Append<T extends unknown[], U> = [...T, U]

type Test = NaturalNumber<5>; // => [0, 1, 2, 3, 4]
```

## 動作確認
![Screen Shot 2020-09-09 at 22.45.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528526/61206853-8066-bc8e-5726-01512c370d15.png)

45までが限界でした。


## 参考
[TypeScriptで最低n個の要素を持った配列の型を宣言する方法 - Qiita](https://qiita.com/uhyo/items/80ce7c00f413c1d1be56)
[TypeScript: Append<[1,2], 3> ─ タプル型の最後に要素を追加するユーティリティ型 - Qiita](https://qiita.com/suin/items/9d4e0a819341214532b1)
Jupyter Notebookの基本操作とショートカットキー

Jupyter Notebook で作成したノートブックにおける基本操作方法および利用できるショートカットキーについて解説します。

###コマンドモードとエディットモードを切り替える

ノートブックで表示されているセルは、コマンドモードとエディットモードの 2 つのモードがあります。

コマンドモードはショートカットキーを使用してセルを追加したり削除したりといったセルに対する操作を行う場合に使用するモードです。セルの左側に青の線が表示されているときはコマンドモードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/98fda663-eac2-01d2-3027-19ea77b2381b.png)

エディットモードはセルにプログラムを入力する場合に使用するモードです。セルの左側に緑の線が表示されているときはエディットモードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/0b71b308-f10f-b2ae-c9bf-9bd59842e571.png)

コマンドモードとエディットモードの切り替えは次のショートカットキーを使用します。

Enter:   コマンドモードからエディットモードへ切り替える
Esc  :   エディットモードからコマンドモードへ切り替える

なおマウスを使って切り替える場合、テキストボックスの部分をクリックするとエディットモードになり、テキストボックスの左側部分をクリックするとコマンドモードになります。

###セルを追加する

セルの追加を行うにはコマンドモードで次のようにショートカットキーを押してください。

A: 現在のセルの上にセルを追加
B: 現在のセルの下にセルを追加

次の状態からBキーを押すと、すぐ下にセルが追加されフォーカスが追加されたセルに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/531261d0-58ad-f072-2be2-ceda38498cc3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/3246db89-1365-8997-1d9e-3cfe1f6c4f80.png)

次の状態からAキーを押すと、すぐ上にセルが追加されフォーカスが追加されたセルに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/aa66291a-8f53-a31b-a0f1-749c2beed070.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/24d4629d-6e16-639d-9c26-42da06424313.png)

なおメニューからセルの追加を行うには「Insert」メニューをクリックしてください。表示されたメニューの中から「Insert Cell Above」をクリックすると現在のセルのすぐ上にセルが追加され、「Insert Cell Below」をクリックすると現在のセルのすぐ下にセルが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/a9617494-0a6a-adae-aed9-8ed134cf75d1.png)

###セルを削除する

セルの削除を行うにはコマンドモードで次のようにショートカットキーを押してください。D キーを 2 回連続で押します。

D D: 現在のセルを削除する

次の状態からD Dキーを押すと、現在のセルが削除されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/5b4332d8-621f-549a-0939-9a757f388b35.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/be3e9205-68de-61d0-34af-36aecdddf712.png)

なおメニューからセルの削除を行うには、「Edit」メニューをクリックし表示されたメニューの中から「Delete Cells」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/9032e271-19ee-3edd-7a0e-b80e2b2d59d9.png)
[Rails]1対1対多の場合のdelegateとhas_many-throughの挙動の違い

下記のように1対1対多の関係のモデルがあるとします。

* UserとExamineeは1対1
* ExamineeとTestは1対多

```ruby
class User
  has_one :examinee
end

class Examinee
  belongs_to :user
  has_many :tests
end

class Test
  belongs_to :examinee
end
```

では、Userモデルから関連するTestモデルを取得したいときはどのように実装しますか？

様々なやり方がありますが、ActiveRecordの便利機能`delegate`を使うか、`has_many-through`を使うことが多いのではないでしょうか？
どちらもやりたいことは達成できますが、発行されるクエリが少し違うので紹介します。

# delegate

delegateを使うとメソッドを別クラスに委譲することが出来ます。
詳細はRailsガイドを参照してください。
[3.4.1 delegate](https://railsguides.jp/active_support_core_extensions.html#delegate)

今回の場合、下記のように実装します。

```ruby:app/models/user.rb
delegate :tests, to: :examinee
```

実行すると下記の通り2つのクエリーが発行されます。
まず委譲先のexamineeを取得（1つ目のクエリー）して、その後、examinee.testsを実行（2つ目のクエリー）する挙動になっています。

```irb
irb> user.tests
Examinee Load SELECT `examinees`.* FROM `examinees` WHERE `examinees`.`user_id` = 1 LIMIT 1
Test Load SELECT `tests`.* FROM `tests` WHERE `tests`.`examinee_id` = 1
```

# has_many-through

has_many-throughは多対多の時に使われることが多いですが、今回のように1対多の場合も利用できます。

詳細はRailsガイドを参照してください。
[2.4 has_many :through 関連付け](https://railsguides.jp/association_basics.html#has-many-through%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91)

今回の場合、下記のように実装します。

```ruby:app/models/user.rb
has_many :tests, through: :examinee
```

実行すると下記の通り1つのクエリーが発行されます。
こちらの場合はjoinしたクエリーが1つだけ発行されます。
この機能が多対多に対応するように実装されていると考えると、deletgateのように2段階では効率よく取得できないのでjoinで取得しているんだなと理解できると思います。

```irb
irb> user.tests
Test Load SELECT `tests`.* FROM `tests` INNER JOIN `examinees` ON `tests`.`examinee_id` = `examinees`.`id` WHERE `examinees`.`user_id` = 1
```

# 最後に
2クエリーで取得するほうが良いのか、joinされた1クエリーで取得するほうが良いのかは実行環境によるので一概に良し悪しは判断出来ません。
というか大抵の場合はどちらで書いても問題なく動作するのでぶっちゃけどちらでもよいと思います。

ただ、ブラックボックス的に見ると同じことをしているように見えても、今回のように内部で発行されるクエリーが違ったりします。
たまにはこういう細かな違いを機能の成り立ちや目的などを考えならが確認してみると面白いと思います。
Inspect.exe のインストール (Windows SDK)

RPAなど画面操作を行うツールを使っていて特定のUI要素の情報がうまく取れない場合のデバッグ方法として、Windows SDKに付属の**Inspect.exe**ツールを使うと便利です。

Windows SDKはVisual Studioをインストールしていれば標準でインストールされるので追加のインストールは不要ですが、そうでない場合は無料でダウンロードしてインストールしてくることができます。

この記事では、無料でインストールする方法を解説します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/1e27ad5b-69a0-53d9-07d8-0cb8f2dc0623.png)


# Inspect.exeの存在チェック
最初に、ローカルフォルダの以下の場所を確認して、inspect.exeが既にインストールされていないかをチェックしましょう。

`C:\Program Files (x86)\Windows Kits\(メジャーバージョン)\bin\(バージョン/ビルド番号)\x86`

例:
`C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86`

# Windows SDKのダウンロード
以下の場所から最新のバージョンの「**SDKのインストール**」リンクをクリックします。2020年9月時点での最新バージョンは「Windows 10 SDK バージョン 2004 (10.0.19041.0)」です。

[Windows SDK とエミュレーターのアーカイブ](https://developer.microsoft.com/ja-jp/windows/downloads/sdk-archive/)

すると、ダウンロードフォルダに`winsdksetup.exe`というファイルがダウンロードされます。

# インストール開始
`winsdksetup.exe`をダブルクリックすると、インストーラが起動します。

1. インストールフォルダを聞いてきますので、そのまま[Next]ボタンをクリックします。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/f0bdebd1-72c8-44f3-d9d4-ad2bbaee3c25.png)
2. 次の画面でも「Next」ボタンをクリックします。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b1e21d10-555b-136d-b7b9-0f3a83772cb8.png)
3. ライセンス契約を読んで[Accept]ボタンをクリックします。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a8dc4bb0-42b6-8d36-a0e0-4eaef23becef.png)
4. 機能選択の画面になります。このまま「Install」ボタンをクリックしてしまっても問題ないのですが、そうすると全部で2.6GBのディスク容量を食うので、必要なものだけ選択することにします。ここでは、一旦すべてのチェックボックスを外します。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/9607e37c-6545-75fd-2a34-7b88f15913e9.png)
5. 「Windows SDK for UWP Managed Apps」にチェックを入れます。この時同時に「Windows SDK Signing Tools for Desktop Apps」にもチェックが入ります。必要なディスク容量は700MB前後となります。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/64e14366-aac4-eec7-f1b8-95b3b305ef7a.png)
6. 必要なコンポーネントのダウンロードとインストールが始まるので、しばらく待ちます。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/3bbe5cf8-2ccf-bac7-88fa-b7b7c1fb4123.png)
7. 終了したら「Close」ボタンをクリックします。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/21c13b6b-2852-5b2f-fdb8-57fe584bcef1.png)

※ちなみに、Inspect.exeの実行可能ファイルのサイズ自体は210kBであり、一度Windows SDKをインストールして、このファイルだけをどこかにコピーした後Windows SDKをアンインストールしても、Inspect.exeだけで単体で動作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a459ec86-6199-2d5e-e62a-38aaa3112c89.png)


# Inspect.exeの起動
早速、`C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86` (もしくは類似のビルド番号のフォルダ)を開くと、**inspect.exe**が見つかります。ちなみに、ビルド番号のフォルダーは複数存在することがあり、それぞれにinspect.exeが入っていることがあります。どれでもかまいません。

inspect.exeを起動すると以下のような画面が起動します。
マウスカーソルをあわせると、UI要素のところに黄色い強調表示が表示され、UI要素のツリー構造とそのプロパティが表示されます。APIはMSAAとUIAutomationから選ぶことができるので、デバッグしたい方を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c0e0deba-bdc2-6fae-8337-67026f19c06a.png)
dieselインストール(mysql版)

dieselを試す。目標は[Moodle](https://moodle.org)のデータベースの読み取り。

# MySQL系パッケージのインストール
サーバ、クライアントは無くてもdiesel自体には関係ないはず。

```shell
$ sudo apt install -y mysql-server mysql-client libmysqlclient-dev
```

diesel、diesel_cliをプロジェクトに追加。

```shell
$ cargo add diesel diesel_cli
    Updating 'https://github.com/rust-lang/crates.io-index' index
      Adding diesel v1.4.5 to dependencies
      Adding diesel_cli v1.4.1 to dependencies
```

diesel、diesel_cliをインストールする。`--no-default-features`は、デフォルトのフィーチャをインストールされないように指定。`--features mysql`で、MySQL用のフィーチャを有効にする。

```
$ cargo install diesel_cli --no-default-features --features mysql
    Updating crates.io index
  Installing diesel_cli v1.4.1
   Compiling libc v0.2.76
   Compiling proc-macro2 v1.0.20
   Compiling unicode-xid v0.2.1
   Compiling syn v1.0.40
   Compiling cfg-if v0.1.10
   Compiling autocfg v1.0.1
   Compiling getrandom v0.1.14
   Compiling matches v0.1.8
   Compiling memchr v2.3.3
   Compiling pkg-config v0.3.18
   Compiling tinyvec v0.3.4
   Compiling adler v0.2.3
   Compiling unicode-xid v0.0.4
   Compiling serde_derive v1.0.115
   Compiling byteorder v1.3.4
   Compiling gimli v0.22.0
   Compiling bitflags v1.2.1
   Compiling ppv-lite86 v0.2.9
   Compiling quote v0.3.15
   Compiling regex v0.2.11
   Compiling ucd-util v0.1.8
   Compiling lazy_static v1.4.0
   Compiling serde v1.0.115
   Compiling percent-encoding v1.0.1
   Compiling rustc-demangle v0.1.16
   Compiling object v0.20.0
   Compiling unicode-width v0.1.8
   Compiling utf8-ranges v1.0.4
   Compiling ansi_term v0.11.0
   Compiling remove_dir_all v0.5.3
   Compiling vec_map v0.8.2
   Compiling strsim v0.8.0
   Compiling unicode-bidi v0.3.4
   Compiling num-traits v0.2.12
   Compiling num-integer v0.1.43
   Compiling unicode-normalization v0.1.13
   Compiling miniz_oxide v0.4.1
   Compiling synom v0.11.3
   Compiling mysqlclient-sys v0.2.4
   Compiling addr2line v0.13.0
   Compiling regex-syntax v0.5.6
   Compiling thread_local v0.3.6
   Compiling textwrap v0.11.0
   Compiling idna v0.1.5
   Compiling syn v0.11.11
   Compiling backtrace v0.3.50
   Compiling atty v0.2.14
   Compiling time v0.1.44
   Compiling quote v1.0.7
   Compiling aho-corasick v0.6.10
   Compiling url v1.7.2
   Compiling rand_core v0.5.1
   Compiling error-chain v0.10.0
   Compiling clap v2.33.3
   Compiling rand_chacha v0.2.2
   Compiling derive-error-chain v0.10.1
   Compiling chrono v0.4.15
   Compiling rand v0.7.3
   Compiling diesel_derives v1.4.1
   Compiling tempfile v3.1.0
   Compiling dotenv v0.10.1
   Compiling toml v0.4.10
   Compiling diesel v1.4.5
   Compiling migrations_internals v1.4.1
   Compiling diesel_cli v1.4.1
    Finished release [optimized] target(s) in 7m 09s
  Installing /home/vagrant/.cargo/bin/diesel
   Installed package `diesel_cli v1.4.1` (executable `diesel`)
```

# 振り返り

1. この後、Moodleの既存テーブルからスキーマを取得するところまで持っていく。
zabbixって何なの？

会社でzabbixを使っているが、まったく立ち位置が分からない。
サッカーでいえばポジションが分からない。うーんこの人、よくボールを持ってるけど、この人の仕事は何なの？　と思ったので自分なりにまとめてみました。


#サーバーで動くらしい
この記事（https://knowledge.sakura.ad.jp/12446/）　
から引用すると
「Zabbixは、ラトビアにあるZabbix SIAという企業によって開発されているオープンソースの監視ソフトウェアです」
とのこと。

監視ソフトウェア？
何それ？

監視サーバーにインストールする場合と、監視対象のサーバーにインストールする場合があるようです。

これらのことから、
zabbixはサーバーで動く何かなのだ、と僕は結論づけました。

#zabbixの機能って何なの？
こちらのサイトhttps://www.designet.co.jp/ossinfo/zabbix/basic-functions/
からすると、
様々な監視機能があることが分かります…。

僕は仕事で、AWSのEC2インスタンスをzabbixの監視対象にしました。

zabbixの機能は

サーバーにインストールして（しなくてもできるけど）、CPUやメモリなどの使用率を監視することができるため。

#最後に
zabbixのイメージはなんとなくつかめました。
ただ「zabbixで監視することで何をしたいのか？」のイメージはつかめないので、おいおい勉強していこうと思います。
Maxでメトロノームを使って腱鞘炎を華麗に回避

#前の記事
[Maxでランダムな高さの音がピコピコ鳴るものを作る](https://qiita.com/waokitsune/items/d87e1b3c6b013f099333)

#バージョン
Version 8.1.5（9359645）（64-bit windows）

#重大な欠点
前回作ったこの物体には非常に重大な欠点があることが判明。それは…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/016abdd4-22d3-29e9-d1fe-4efdf4c7f77b.png)
**手が疲れる！！！！！！！！**
マウスでボタンオブジェクトをカチカチカチカチ…。クリックofクリック…。
2秒で気づいたよ「あ、これ手が死ぬ」って……。

#一定間隔で信号を出すやつ
という訳で用意したものがこちらになりま～す。
**metro** オブジェクトという **一定間隔で信号を出す** やつ。
電車かな？あ、全然関係ないけど東京メトロの社内放送の方の声いいですよね(´∀｀*)

[【東京メトロ9路線（本線）】　車内自動放送聞き比べ！](https://www.youtube.com/watch?v=UdSfZ25DNyE)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/cfd5cd54-fdb7-d2fe-41ce-f0801875abe9.png)
ばってんのオブジェクトはONとOFFを切り替えるやつ。（起動or停止）
metroは常に信号を出しているわけじゃないことが分かりました。「演奏の途中でmetroの信号を止めたい」なんてシチュエーションも考えられますもんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/afc74ff1-615e-42bb-4218-3b2a4a6aaf49.png)

#metroの引数は周波数ではなく信号の間隔
簡単に言うと **引数の値を大きくするほどのんびりになる** ってこと。
引数がでかい = ピ………ピ………ピ………ピ………
引数が小さい = ﾋﾟﾋﾟﾋﾟﾋﾟﾋﾟﾋﾟﾋﾟﾋﾟﾋﾟﾋﾟ

#最終的にはこんな感じ
うーん、レトロフューチャーなロボットって感じの音。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2690a50c-b405-79cb-5b79-6bcdce9d8be9.png)

#次の記事
[Maxで正弦波、短形波、三角波、ノコギリ波](https://qiita.com/waokitsune/items/4c588d0bdd5cdb6697bf)
Anacondaのダウンロード

###Anacondaのダウンロード
Anaconda は Python 自身と Python でよく利用される NumPy や Jupyter といったライブラリをまとめてインストールしてくれるディストリビューション(必要なソフトウェアをまとめてパッケージしたもの)です。

Anaconda をインストールするには次の URL へアクセスしてください。

https://www.anaconda.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/8bab6d73-099e-2c76-cfb5-9693b8657000.png)

Anaconda は無料で利用可能な Individual Edition と有料で提供されている Team Edition と Enterprise Edition があります。今回は無料で利用可能な Individual Edition を利用します。

画面上部にある「Products」をクリックし、表示されたメニューの中から「Individual Edition」をクリックしてください。

「Individual Edition」の画面が表示されたら「Anaconda Installers」というところまでスクロールしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/3620a31a-0110-564b-69db-5035bfb35768.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/6f5da0eb-7af7-2a8c-8880-4763aecb183e.png)

今回は Windows 10 64bit の環境にインストールします。 Windows の下に表示されている「64-Bit Graphical Installer (466 MB)」をクリックしてください。(ご自身の環境に合わせて選択してください)。

ダウンロードが開始されます。任意の場所に保存しておいてください。(画面には 3 つほど案内が表示されていますが、 Anaconda のインストールとは直接関係ありませんので見ていただいても閉じていただいても構いません)。

Anacondaのダウンロードはこれで完了です。
え！？ わずか3分でローカルにTypeScriptの実行環境を！？

できらぁ！(様式美)

ということでローカルにTypeScriptの実行環境を作ります。すぐできます。

TypeScriptを使うだけなら、[TypeScript playground](https://typescript-play.js.org/)等を使えばいいと思うのですが、「○○のパッケージを試したい。ついでだからTypeScriptも使いたい」という欲張りさんはローカルに環境構築したくなることもあるでしょう。え？ codesandbox? 知らんなぁ。

とにかくローカルにTypeScriptの実行環境を作っていきます。ゴールは「コンパイルして出来たjsファイルをnodeコマンドで実行するところ」までです。

# 事前準備
以下は事前に準備できてるとします。出来てない方は適当にググってください。

- node, npm(yarn)

# ローカルにTypeScriptの実行環境を作成
ここから本題です。
あと私はyarn派なのでyarnを使います。


## プロジェクトの作成
プロジェクトディレクトリを作成して、package.jsonを作りましょう。

```bash
$ mkdir typescript_try
$ cd typescript_try/
$ yarn init
```

`yarn init`後に色々聞かれますが、とりあえず全部Enterで良いです。(ちゃんと設定したい人はしてください)

## TypeScriptのインストール

```
$ yarn add -D typescript @types/node
```

typescript等はもちろん開発でしか使わないので、-Dはつけましょう(すぐ忘れる)

## tsconfig.json
これが無いとコンパイル出来ないので作ります。ルートディレクトリに置いて下さい。

```bash
$ touch tsconfig.json
```

```json-doc:tsconfig.json
{
  "compilerOptions": {
    "lib": ["ESNext"],
    "module": "CommonJS",
    "outDir": "dist", // コンパイル後に生成されるJSファイルの置き場所をTSCに指示
    "sourceMap": true,
    "strict": true,
    "target": "ES2015"
  },
  "include": ["src"] // TSCがTypeScriptファイルを見つけるためにどのディレクトリを探せば良いか？の指定
}
```

なおこの内容は、オライリーの[TypeScript本](https://www.oreilly.co.jp/books/9784873119045/)の2.3.1 tsconfig.json に記載された内容をベースに作成しました。(`yarn tsc --init`でも内容は異なりますが最低限のものを作れます。こっちの方が普通かも？)

詳細は割愛しますが、以降の説明に関連する2つのパラメータに関してはjsonのコメントに説明を記載しました。なおTSCはTypeScriptのコンパイラのことです。

他の項目に関してはググってください。もしくはオライリー本を買って下さい！ 超良書です。

またこの時点では、"src"/"dist" フォルダが無いため、エディタによってはエラーが表示されるかもしれませんが、そこは一旦スルーして下さい。

## TSファイルの作成
実行したいTypeScriptファイルを作成します。
tsconfig.jsonのincludeで指定した通り、srcディレクトリを作成して、その下に作って下さい。

```bash
$ mkdir src
$ touch src/index.ts
```

```typescript:src/index.ts
const hello: string = 'Hello TypeScript!'
console.log(hello)
```

## コンパイル後に生成されるJSファイルの置き場所を作成
ディレクトリを作るだけでOKです。

```bash
$ mkdir dist
```

もし先ほどtsconfig.jsonでエラーが出ていた場合は、この後エラーが消えていることを確認して下さい。

## TSファイルのコンパイル
作成したTypeScriptファイルをコンパイルします。

```bash
$ yarn tsc
yarn run v1.22.4
$ node_modules/.bin/tsc
✨  Done in 1.39s.
```

生成されたJSファイルはdist下に保存されているはずです。確認してみましょう。

```javascript:dist/index.js

"use strict";
const hello = 'Hello TypeScript!';
console.log(hello);
//# sourceMappingURL=index.js.map
```

それっぽく出来てますね！

## 生成されたJSファイルの実行
nodeコマンドで生成されたJSファイルを実行します。

```bash
$ node dist/index.js
Hello TypeScript!
```

これでローカル環境でTypeScriptのコードを実行できました。簡単でしたね！

# さいごに
「手元でJavaScript周りのパッケージの動作確認等をする時、サラッとTypeScript使えてたらカッコよくない？」という不純な気持ちで書きました。

ただパッケージによっては、別途TypeScript用の設定が必要だったりするのでそこはご注意くださいm(_ _)m
Symfony4-イベントを使って独自のエラー処理をする

#エラー処理をするServiceの作成
```src/EventListener/ExceptionListener.php
class ExceptionListener
{
    public function onKernelException(ExceptionEvent $event)
    {
        // You get the exception object from the received event
        $exception = $event->getThrowable();
        $message = sprintf(
            'My Error says: %s with code: %s',
            $exception->getMessage(),
            $exception->getCode()
            );

        // Customize your response object to display the exception details
        $response = new Response();
        $response->setContent($message);

        // HttpExceptionInterface is a special type of exception that
        // holds status code and header details
        if ($exception instanceof HttpExceptionInterface) {
            $response->setStatusCode($exception->getStatusCode());
            $response->headers->replace($exception->getHeaders());
        } else {
            $response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
        }

        // sends the modified response object to the event
         $event->setResponse($response);
    }
}

```
#service登録
```config/service.yml
services:
#   追加
    App\EventListener\ExceptionListener:
        tags:
            - { name: kernel.event_listener, event: kernel.exception }         
```
フォームでIntegerTypeを使用する場合、値はFormコンポーネントによって整数に変換されます。
symfony4 Twig導入メモ

#CSS、JavaScript、画像アセット
##assetパッケージのインストール
```
composer require symfony/asset
```
```
<link rel="stylesheet" href="{{ asset('admin/assets/vendor/bootstrap/css/bootstrap.min.css') }}">
```
#import,use,include
http://wolfbash.hateblo.jp/entry/2018/02/14/135647
##include
レンダリングされたテンプレートを呼び出し元に返す。
```
{{ include('layout/admin/header.html.twig') }}
```
##use
使用するブロックを呼び出す
```
{% use "blocks.html" %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
```


return $this->render('index/index.html.twig', [
            'controller_name' => 'IndexController',
        ]);
テンプレートに値を渡せる
https://symfony.com/doc/current/templates.html#twig-configuration
過去の電力使用量取得 関西電力編

# はじめに

電力使用量予測のセミナーをしていて、各電力会社の公表されている過去の使用電力量の形式がまちまちなので取得するのが難しいというご意見を聞いていました。
そこで、それぞれの電力会社別にデータの取得方法をまとめてみます。

ちなみに、対象とする電力会社は、北海道電力、東北電力、東京電力、北陸電力、中部電力、関西電力、中国電力、四国電力、九州電力、沖縄電力で、今回は関西電力さんを扱ってみます。

注：大量のダウンロードを繰り返すとサーバに負担がかかるので、ダウンロードは一回だけにするか、対象期間を限定して行うよう心がけて下さい。

# 動作環境

GoogleさんのCoraboratoryという環境で動作させます。

[Colaboratory](https://colab.research.google.com/)

# Webサイト

以下のWebサイトからデータをダウンロードできそうです。

[関西電力送配電 電力需給のお知らせ](https://www.kansai-td.co.jp/denkiyoho/)

# ダウンロード

```py:
for y in range(2016, 2020):
  for m in range(1,13):
    url = "https://www.kansai-td.co.jp/yamasou/{:04}{:02}_jisseki.zip".format(y, m)
    print(url)
    !wget $url

from glob import glob

files = glob("*.zip")
files.sort()

for f in files:
  !unzip $f
```

# 読込と可視化


```py:
from glob import glob
import pandas as pd

files = glob("2*.csv")
files.sort()

df_juyo = pd.DataFrame()

for f in files:
  print("\r", f, end="")
  try:
    df = pd.read_csv(f, encoding="Shift_JIS", skiprows=10, nrows=24)
    d = df.DATE + " " + df.TIME
  except:
    df = pd.read_csv(f, encoding="Shift_JIS", skiprows=16, nrows=24)
  #df.tail(25)
  #df.head()
  df_juyo = pd.concat([df_juyo, df])

print(df_juyo.shape)
print(df_juyo.columns)

df_juyo.index = pd.to_datetime(df_juyo["DATE"] + " " + df_juyo["TIME"])
df_juyo = df_juyo.sort_index()

df_juyo["当日実績(万kW)"].plot(figsize=(15,5))
```
![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/1e9ff47e-09e8-3520-8663-2c894617b5db.png)


できた！

エリアの人口が多いので、必然的に多くの電力が使用される地域になっています。

電気使用量を見ると、色々な気付きがありますね。
以上、現場からきむらがお伝えしました。

# 補足

記事を読んだ人から「時間がかかり過ぎるので、手っ取り早くデータが欲しい場合にはどうしたら良いか？」という質問があったので、ちょっとだけデータを販売してみることにしました。
データに興味があれば以下のURLをご覧下さい。

https://ticket.tsuku2.jp/eventsDetail.php?ecd=16260900020422
絶賛！！　Python Pocket Reference (O'REILLY)。日本語版も欲しいな。訳せないところが。。。あるんですっ。

#目的
以下のPython Pocket Reference (O'REILLY)が、すごく、使いやすい！

　Python Pocket Reference, 5th Edition 
　Python In Your Pocket
　By Mark Lutz 
　Publisher: O'Reilly Media

（　出典：http://shop.oreilly.com/product/0636920028338.do　）

![cat.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/a002827a-92f1-8d7a-d42a-020d296f899d.gif)

しかし。。。。。
うまく意味がとれない英語があるので、念のため（備忘のため）、記事にする。
（おそらく、将来の自分が解決することを期待して。。。）

あとは、英語のことを書いていると、
少しづつ英語力が上がる期待。。。

#意味がわからない英語

##[その１]Noneについて

>None --- a false placeholder object;

Google翻訳（ママ）
>偽のプレースホルダーオブジェクト

⇒　あまり、深い意味はないのだと思いますが、、、軽く、どういうつもりでこう言っているのか、ちょっと、わかりません。
⇒⇒　**正解がコメント欄にあります。**見て下さい。ただし、1回見てしまうと、
　何がわからなかったのか、思い出せなくなる可能性があるので、ご注意！！

#まとめ
特にありません。
この記事で、役立つ情報としては、
Python Pocket Reference (O'REILLY)　が、素晴らしいということぐらい。
おそらく、著者がハンパナイ人なんでしょう。
コメントなどあれば、お願いします。
RTX 2080 Ti では powerlimit しすぎるすると性能が激減する

個体(メーカー)にもよるかもしれません.

ZOTAC の 2080 Ti AMP で確認しました.

nvidia-smi で powerlimit で設定できる最低あたり(今回の場合は 125 W)にすると, P3 state となり 3D 性能やマイニング(compute 性能)が激減するのがわかりました.


https://docs.nvidia.com/gameworks/content/gameworkslibrary/coresdk/nvapi/group__gpupstate.html

によると,

P0, P1 state: Maximum 3D performance
P2, P3 state: Balanced 3D performance-power

とありますが, P3 state はかなり性能落ちるようです.

140W くらいにして, P2 state になるようにしましょう(nvidia-smi で P2 state になっているのを確認する)
SIDからドメイン\ユーザー名変換


```Powershell:Function_SID-ConvertToUser
##############################################################################
#
# 引数: String SID
# 戻値: String Domain\UserName
#
# SID-ConvertTouser -SID "S-1-5-21-ddddddddddd-dddddddddd-dddddddddd-dddd"
#
##############################################################################

Function SID-ConvertToUser()
{

 param( [string]$sid )

  $tmpsid = [System.Security.Principal.SecurityIdentifier]::new($sid)
  return ($tmpsid.Translate([System.Security.Principal.NTAccount])).Value

}
```
DOMとは

#プログラミング勉強日記
2020年9月9日
JSについて調べていくうちにDOMを知り、JSを扱う上で絶対に知らないといけない仕組みだと思ったのでまとめる。

#DOMとは
　Document Object Modelの略で「ドム」と呼ばれ、HTMLやXML文書を取り扱うためのAPI。つまり、プログラムからHTMLやXMLを自由に操作するための仕組み。([APIについてはこちらでまとめている](https://qiita.com/mzmz__02/items/ad2bf8ed8015ebb33c75))
　DOMではHTMLやXML文書をノードと呼ばれる階層的な構造として識別し、JSなどの様々なプログラミング言語やスクリプトから扱いたいノードを特定して操作できるようにする仕組みを提供する。

#特徴
DOMに以下の3つの特徴がある。

- ツリー構造と呼ばれる階層構造を持つ
- それぞれノードで説明される
- WEBページとJSなどのプログラミング言語をつなぐ

##階層構造をとる
　階層構造は組織図的なもの。
　HTMLの階層構造は以下のようになる。以下の例では`<body>`を頂点として下にいくつかの`<section>`と`<p>`で構成されている。これはHTMLで階層構造を構築した場合の一例であり、この階層構造を定義しているものがDOMと呼ばれる仕組みを使っている。

![0909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/1acc7287-159c-ef01-e008-3db030b96ca7.png)


##各要素はノードで表現される
　DOMではノードと呼ばれる用語が出てくる。
　以下のようにノードは各要素自体のことを表す。特定のノードを基準としたときに、その上にあるノードを親ノード、その下にあるノードを子ノード、同じ階層にあるノードを兄弟姉妹ノードと表現する。
![0909-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/663a8cb6-1271-7d00-3d3d-8e1ae07a955f.png)


#参考文献
[DOMとは](https://www.javadrive.jp/javascript/dom/index1.html)
[JavaScript初心者でもすぐわかる！DOMとは何か？](https://eng-entrance.com/what-is-dom)
【CSS】firefoxで動作するようにしたスクロール関連の修正

#はじめに

自作拡張機能をchromeからfirefoxアドオンに移行し投稿（審査待ち）したので、移行中に修正した点を記事にします。

#スクロールバーの表示を消す

スクロールバーは消したいけど、ホイールや別の手段でスクロールはさせたい時のCSSです。

```css:chrome.css
.wrapper::-webkit-scrollbar {display: none;}
```

```css:firefox.css
.wrapper {scrollbar-width: none;}
```

これchromeでも実装しないかな。


#*-reverse

flexboxを使って子要素の配置順を反転させる(row|column)-reverse。

```css:chrome.css
.wrapper {
	display: flex;
	flex-direction: row-reverse;
	overflow: scroll;
}
```

firefoxでこの記述のままだとスクロール幅（rowは横、columnは縦）が可視幅と同値になり、スクロールが効かなくなった。
こんなケースは稀かもしれません。

左右のボックスを入れ替えるだけだったので、orderで対処。

```css:firefox.css
.wrapper {
	display: flex;
	flex-direction: row;
	overflow: scroll;
}
.wrapper.reverse .right_box {order: -1;}

```


#終わりに

他にはfont-familyのfantasyが使えなくてImpactにしたとか
font-sizeを要素でちゃんと指定しないと思うようなサイズにならなかったとか
細かい所は割愛。


※内容がわかりにくい？タイトルだったので変更しました。
社内イベントのLP作るにあたって技術選定をした振り返り

## はじめに

弊社では有志による業務時間外の社内勉強会などが行われることがあるのですが、非エンジニアも巻き込んだ少し規模の大きい社内イベントが9月の頭にありました。
特に誰かから作って欲しいと頼まれたわけではなく、エンジニア、デザイナーとして何かイベントを盛り上げる様なものがあると良いなと考え、@naomunaomu と一緒に特設LPを作って公開しました。

私は技術選定、主に表示するデータの加工、サイト公開にあたっての設定などを行ってました。

残念ながらサイトをお見せすることは出来ないのですが、使用した技術とその振り返りを出来ればと思います。

## 使用した技術

技術を考えるにあたっては以下のことをぼんやりと考えてました。

- いかに工数をかけないか
使われるのが1週間ほどのお祭りサイトなので、RDBだったり、サーバーを立てることも削減できないかなと考えてました。
- いかに費用をかけないか
同上
- いかに業務内で使っていないスキルを使うか
こういった業務とは関係のないものだからこそ、技術的な挑戦ができるので、普段触ったことのないものを少し使いたいなというモチベーションはありました。

今回はざっくりと以下のものを使用しました。

- ホスティング
  - Vercel
- バックエンド
  - SpreadSheet
- フロント
  - Gridsome(Vue.js 2.x)

![スクリーンショット 2020-09-13 15.41.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166596/f2ab6df9-ae3e-c010-f639-7d9a846a3561.png)

各分野に関して、もう少し詳しく

### ホスティング

ホスティングサービスの[Vercel](https://vercel.com/)を採用しました。

- 速さと見た目のシンプルさ
- Git Integration
- Deploy Hooks(API叩いたらbuildしてデプロイしてくれる)
- 無料プランでbasic認証を組み込むことができる。
- 私自身使ったことがなかったので、使用感を知りたかった。

### バックエンド

**Google Spread Sheet**にデータを記入して、build時にJSON形式吐き出すようにしました。
今回DBなどを用意するのは少し大変だなと思ったのと、イベント参加者の情報などを既にシートで記入、管理をしていたので、整形をして渡してあげれば良いのでは？という結論に至りました。

### フロントエンド

**[Gridsome](https://gridsome.org/)**というVue2.x系のフレームワークを使用しました。
いわゆるReactにおけるGatsbyのVue版というイメージです、静的サイトの作成に優れていて、プラグインがそこそこ豊富です
今回サイト作成に関わる二人ともVueの利用経験があったため、Vueの採用は即決でした。

おいおいじゃあなんでVue3.xじゃないんだよとか思うかもしれません。
実際最初はVue3.x + viteで爆速開発環境作ってウキウキしたかったのですが、今回は見送りました。
理由としては2点

- Vuetifyなど、一部使いたいプラグインツールが3系に対応しておらず、導入が少し手間に感じた。
- Gridsomeのプラグインの中でいくつか需要のあるものがあり、そちらを優先した。

シートをデータソースとして扱うにあたって、[良さげなプラグイン](https://gridsome.org/plugins/gridsome-source-google-sheets)があったのでこれ楽じゃねと思っていました。

## 振り返り

### よかった点

- Vercel良かった
  - 勝手にdeployしてくれるので、お互いの開発が止まらない。
  - ブランチ切って検証環境立ててくれるので、確認も楽。
  - 完全無料で運用ができた。
  - SpreadSheetの更新に対して、GASでAPI叩いてdeployができるので、常に最新の情報の載ったLPができた。
- Gridsomeはまあまあ良かった
  - 公式のドキュメントが充実しているので、お互い必要なツールの導入はスムーズだった

### うまくいかなかった点

- GridsomeのPluginを過信していた。
  - 使おうと思っていたプラグインが機能不足だったり。
    - 前述の良さげなプラグイン、GCPのサービスアカウントによるシートとの連携ができず、今回用件を満たさないことに後から気づいて大後悔時代。

## まとめ

- 技術選定の軸を定めておくと、割と決めやすい。
  - 工数なのか、綺麗さなのか、挑戦なのかとか
- きちんとプラグインのリポジトリなどもみた上でしっかり検討しよう

小規模かつ、自分たちでワイワイ作るものだったので、特に後悔はないです。むしろ個人的にも色んなプラグインを知ったり使ったりする良い機会だったなと考えてます。
また別な機会に今回の経験とかが活かせると良いなと思います。
rails newする際のオプションとrails newした後に行う設定

個人的に「`rails new`をする際によく使うな」と感じるオプションと、新規プロジェクトを作成したときによく行う設定を備忘録を兼ねてまとめます。

# rails newをする際のオプション
まずは`rails new`をする際によく付けるオプションについてです。
一つ一つのオプションについては後述します。

```
rails _6.0.3.2_ new appname --database=mysql --skip-test
```

### railsのバージョン指定

```
rails _6.0.3.2_ new
```
こうするとrailsのバージョンを指定することができます。
`_6.0.3.2_`の部分はその都度値を変えてください。

### 使用するデータベースの指定
```
--database=mysql
```
このようにDBを指定しないと、デフォルトのDBは`sqlite`というものになります。
今回は`mysql`を使用する設定です。

### Minitestを生成しない
```
--skip-test
```
デフォルトでプロジェクトを生成すると、Minitestというものが作られます。
私自身、テストにはRSpecを使用することが多いため、上記のようにMinitestを生成しないようにしています。

# rails newした後に行う設定
ここからは実際に`rails new`をした後の設定となります。


### `rails g`コマンド使用時に、不要ファイルを生成しないように設定
```ruby:config/application.rb
module appname
  class Application < Rails::Application
    # 以下を追加
    config.generators do |g|
      g.stylesheets false
      g.javascripts false
      g.helper false
      g.test_framework false
    end
    config.time_zone = "Tokyo"
    config.i18n.default_locale = :ja
  end
end
```
今回主に追加したのは下記の部分です。

```ruby
config.generators do |g|
  g.stylesheets false
  g.javascripts false
  g.helper false
  g.test_framework false
end
```
`rails g`コマンドでコントローラを作成すると、ファイルが自動的に生成されてしまいますが、不要なもの(coffeeやcss)を生成しないようにするのがこの記述です。
`rails g`コマンドは開発の過程で頻繁に使用するものなので、この設定を最初に済ませておくと非常に楽になります。

```ruby
config.time_zone = "Tokyo"
config.i18n.default_locale = :ja
```
また、こちらでデフォルトの言語を日本語にし、タイムゾーンのデフォルトを東京に設定します。

```ruby
config.i18n.default_locale = :ja
```
ただ、上記(日本語化)については注意があり、deviseのGemを使用した時に`users/sign_up`にアクセスするとエラーが発生する場合があります。
なので「特に今は日本語化はいいかな。エラー出るとだるいし」と思う方はこちらは特別設定しなくても良いと思われます。
NTタイムエポック-.NET DateTime変換

#
NTタイムエポック値　=　（.NET Ticks値） - 504911232000000000

```Powershell:Console
#1601/1/1 00:00:00の時点のTicks
PS> ([DateTime]"1601/1/1 00:00:00").Ticks
504911232000000000
```
Ticks(100ナノ秒のカウント)

.NETは「1/1/1 00:00:00」からTicksが計上されます。
Windows NTエポックは「1601/1/1 00:00:00」からTicksが計上されます。

差分のTicks「504911232000000000」を追加して計算します。

※ちなみにExcelは、「1899/12/31 00:00:00」から1hourで計上され、
分以下は小数点で処理をすることとなり、誤差も発生します。


```Powershell:test.ps1
[System.Int64]$NT_TimeEpoc = 132441743819134704 #取得したActiveDirectory上のTicks
$Time = [System.DateTime]::new($NT_TimeEpoc + 504911232000000000)
```

PowershellバージョンによってはDateTimeを以下の宣言で

```Powershell:test.ps1
[System.Int64]$NT_TimeEpoc = 132441743819134704 #取得したActiveDirectory上のTicks
$Time = New-Object System.DateTime($NT_TimeEpoc + 504911232000000000)
```
UTC>JST(9:00)の差分追加

```Powershell:test.ps1
[System.Int64]$NT_TimeEpoc = 132441743819134704 #取得したActiveDirectory上のTicks
$Time = New-Object System.DateTime($NT_TimeEpoc + 504911232000000000 + 324000000000)
```
【Go】sqlxでBulk Insert

## 概要

以下のようなテーブルがあるとします。

```
user
 - id
 - name
```

userテーブルに対して、以下のように複数のValueを一度にinsertをしたい。

```sql
INSERT INTO user (name)
VALUES ('tom'),('james'),('piyo'),('alex'),('josh');
```

上記をsqlxで実現する方法

## 実装

NamedExecを使って、以下のように実装する

```go

import (
  "database/sql"
  "fmt"

  _ "github.com/lib/pq"
  "github.com/jmoiron/sqlx"
)

type User struct {
  ID int32 `db:"id"`
  Name string `db:"name"`
}

func main() {
  db, _ := sql.Open("postgres","user=postgres password=pw dbname=postgres sslmode=disable")
  
  userNames []string{"tom", "james", "piyo", "alex", "josh"}
  users := make([]User, len(userNames))
  for i, v := range users {
    users[i] = User{
      Name: v,
    }
  }

  query := `INSERT INTO user (name) VALUES (:name)`
  _, err := db.NamedExec(query, users)
  if err != nil {
    fmt.Println("エラーだよ")
  }
}


```
Pythonをダウンロードする

Python のダウンロードを行います。下記の URL へアクセスして下さい。

・https://www.python.org/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/a34bf74c-31ff-a682-94cd-b1ea58f6cf33.png)

画面上部に表示されているメニューの中から「Download」にマウスを合わせるとメニューが表示されます。今回 Windows 向けのものをダウンロードしますので、メニューの中から「Windows」をクリックしてください。

Windows 向けの Python の色々なバージョンのダウンロード用リンクが掲載されたページが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/103cdf73-0644-a3b0-29a1-e29f275beac3.png)

最新バージョンの Python をダウンロードします。画面に表示されている「Latest Python 3 Release - Python 3.8.5」をクリックしてください。

Python 3.8.5 のページが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/c510aea5-84d5-c3e1-1026-680608ba0131.png)

一番下までスクロールすると、ソースコードや OS 毎に用意されたダウンロード用リンクの一覧が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552385/1cecec22-3ed8-2b33-fb1f-b6ac03c85844.png)

今回は Windows10 (64bit) 向けのインストーラー付きのものをダウンロードします。「Windows x86-64 executable installer」と書かれたリンクをクリックしてください。

ダウンロードが開始されますので任意の場所に保存しておいて下さい。ダウンロードは以上で終了です。
かっこいいフィボナッチ数列(Elixir)

# はじめに
- Twitterでかっこいいと私が感じた[フィボナッチ数列](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0)のプログラムが書いてあったので写してみました
- [Fibonacci sequence generated by an @elixirlang stream](https://twitter.com/ramalhoorg/status/1299234312731136000)
- [Elixir](https://elixir-lang.org/)は、1.10.4-otp-23を使っています

# [フィボナッチ数列](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0)

```math
f(0) = 0 \\
f(1) = 1 \\
f(n) = f(n -1) + f(n - 2)
```

# プログラム

```elixir:lib/fibonacci.ex
defmodule Fibonacci do
  def sequence, do: Stream.unfold({0, 1}, fn {a, b} -> {a, {b, a + b}} end)

  def at(n), do: sequence() |> Enum.take(n + 1) |> Enum.at(-1)
end

defmodule PureFibonacci do
  def at(0), do: 0

  def at(1), do: 1

  def at(n), do: at(n - 1) + at(n - 2)
end
```
- Fibonacciモジュールの方が、[Twitter]((https://twitter.com/ramalhoorg/status/1299234312731136000))に書いてあった、私がかっこいいと感じたプログラムです
    - すこーし変えています(意味するところは同じはずです)
- `PureFibonacci`モジュールは素朴にフィボナッチ数列の計算を書いてみた例です



# 計測

```elixir
$ iex -S mix

iex> :timer.tc(Fibonacci, :at, [40])    
{19, 102334155}

iex> :timer.tc(PureFibonacci, :at, [40])
{6503506, 102334155}
```

- [:timer.tc/3](http://erlang.org/doc//man/timer.html)は、引数に(モジュール、メソッド名のアトム、引数)を指定してコールすると結果を`{時間, 値}`の形で得られます
    - 時間の単位は、microsecondsであります
- `PureFibonacci.at(40)`は約6.5秒かかるのに対して、`Fibonacci.at(40)`は19μ秒:rocket::rocket::rocket:で計算が終わっているのであります
    - `PureFibonacci`のほうが数式そのままで書いている内容はわかりやすいですが、時間はかかるという結果になりました
- [Stream.unfold/2](https://hexdocs.pm/elixir/Stream.html#unfold/2)


# Wrapping Up
- [Stream.unfold/2](https://hexdocs.pm/elixir/Stream.html#unfold/2) は、というかこれに限らず[Stream](https://hexdocs.pm/elixir/Stream.html#content)は全般的に個人的にはあまりうまく使えていない気がするので理解を深めていきたいとおもいます
- Enjoy [Elixir](https://elixir-lang.org/)! :rocket::rocket::rocket: :lgtm::lgtm::lgtm:
docker image 作成時に Jupyter Lab のカスタム設定をする

これまでデータ分析の環境構築の際は、Anacondaで仮想環境を構築して`pip install`とかをしていた。ただこの場合、メモを残しておいたりしない限りは同じ環境を構築できなかったりするので、最近はDockerを使用するようになってきた。

基本的には、Jupyter公式の[Docker Hub](https://hub.docker.com/u/jupyter)からdocker imageをpullし、必要なものを足していくという感じで環境構築している。（同じように環境構築している人が多い？）
ここで、環境構築時にJupyter Labのショートカットキーの作成も一緒にしてくれると嬉しいと思ったので、そのためのDockerfileの書き方を紹介する。
まだまだDockerについての理解が浅いので間違っていたりしたら指摘してくださるとありがたい。

また、簡単なデモが出来るように[GitHub](https://github.com/kanix29/custom-settings-jupyterlab-docker)にDockerfileなどをあげておいた。dockerを使用したことがある人なら、Dockerfileを読めばすぐに分かるはず。

# 設定方法
## まず試したこと
単純にjupyterから引っ張ってきたimageからコンテナを作成すると、`~/.jupyter/lab/`の下には`workspaces/`があるだけ。

そこで、コンテナ上でJupyter LabのGUIから`Settings -> Advanced Settings Editor -> Notebook -> User Preferences`に設定を記述すると、`~/.jupyter/lab/user-settings/@jupyterlab/`以下に新しくディレクトリとファイルができていることが確認できる。
つまりやることは、docker imageを作成するときに、新しく同じようなディレクトリを作成し、設定ファイルをそのディレクトリに置くだけ。

## Dockerfile
Dockerfileは以下のように書くことができる。
Dockerfileと同じディレクトリ内に設定用ファイルを置いておけば、それをCOPYするだけで済む。

```dockerfile:Dockerfile
# pull docker image
FROM jupyter/datascience-notebook

# make directory
RUN mkdir -p .jupyter/lab/user-settings/@jupyterlab/notebook-extension/ \
    && mkdir -p .jupyter/lab/user-settings/@jupyterlab/shortcuts-extension/

# copy setting files
COPY tracker.jupyterlab-settings .jupyter/lab/user-settings/@jupyterlab/notebook-extension/
COPY shortcuts.jupyterlab-settings .jupyter/lab/user-settings/@jupyterlab/shortcuts-extension/

...
```

このDockerfileからdocker imageをビルドしてcontainerを作成すると、既にカスタム設定が適用されたJupyter Labを確認できる。

### 設定ファイルについて
`tracker.jupyterlab-setting`はNotebookの行数を表示する設定で以下のような内容。

```jupyter:tracker.jupyterlab-setting
{
    "codeCellConfig":{
        "lineNumbers": true,
    },
}
```

`shortcuts.jupyterlab-settings`は、セルを上下させるショートカットキーの設定をしている。ショートカットキーの設定については[こちら](https://qiita.com/kanikanicrab/items/ece0f2ca0fce689e7489)を参考に。

```jupyter:shortcuts.jupyterlab-settings
{
    "shortcuts": [
        {
            "command": "notebook:move-cell-up",
            "keys": [
                "Ctrl Shift K"
            ],
            "selector": ".jp-Notebook:focus"
        
        },
        {
            "command": "notebook:move-cell-down",
            "keys": [
                "Ctrl Shift J"
            ],
            "selector": ".jp-Notebook:focus"
        
        },
    ]
}
```