OmniAICreator/Qiita-1.07M huggingface dataset:
TISさんが作成した企業分析用データセット「CoARiJ」で遊んでみる①

# CoARiJとは
> 「CoARiJ」は、有価証券報告書やCSR報告書、統合報告書の記載内容(事業概要や財務情報等)と、数値情報(株価およびTOPIX等の指数)をまとめたデータセットです。

https://www.tis.co.jp/news/2019/tis_news/20191114_1.html

## github
https://github.com/chakki-works/CoARiJ/blob/master/README.md

# 非財務情報の重要性
ESGをはじめとした非財務情報の活用がこれからの投資判断には必要

## 伊藤レポート
>投資判断において企業の持続可能性(Sustainability)やリスクを評価するために「ESG (環境・社会・ガバナンス」等の非財務情報を組み込むことが大きな論点となっている。

>MiFIFⅡ等により、アナリストのリサーチが激しく評価され、淘汰圧力が高まる中で、非財務情報をベースとして投資家が必要とする情報を提供するアナリストのみが生き残れるといった意見も示された。

https://www.meti.go.jp/press/2017/10/20171026001/20171026001-1.pdf

## GPIFのESG投資への取り組み
>ESGの要素に配慮した投資は長期的にリスク調整後のリターンを改善する効果があると期待できることから、公的年金など投資額の大きい機関投資家のあいだでESG投資に対する関心が高まっています。

https://www.gpif.go.jp/investment/esg/

## 投資家は企業の持続可能性を見ている
>我々が適切なEDG評価基準を持ち、持続的な成長が見込める企業に投資を行うことで、長期的な投資パフォーマンスを向上させることができる可能性がある

www.amazon.co.jp/dp/4532134811

# 非財務諸表分析の問題点
上場企業の「財務情報」は有価証券報告書や決算短信による開示が義務付けられている。ユーザは企業情報開示サイトであるTDNETやEDINETへのアクセス、また各種APIの利用により、財務情報を容易に閲覧、収集ができる。
http://disclosure.edinet-fsa.go.jp/
https://ufocatch.com/

一方で、「非財務情報」であるESG情報の収集は難しかった。そもそも開示義務がないため入手手段が限られているし、WEB上で公開されていたとしても手動でひとつひとつレポートをダウンロード、前処理する必要があったためである。

# やること
* 動作確認
 * part1ってことでご勘弁を

https://github.com/chakki-works/CoARiJ/blob/master/README.md


# Environments
```
conda create -n coarij python=3.6 anaconda
source activate coarij  
```

# Install

```
pip install coarij
pip install janome # テキスト処理に使用

coarij -- # マニュアルが出てくる
```

# Run command sample
```
# Download raw file version dataset of 2014.
coarij download --kind F --year 2014

# Extract business.overview_of_result part of TIS.Inc (sec code=3626).
coarij parse business.overview_of_result --sec_code 3626

# Tokenize text by Janome (`janome` or `sudachi` is supported).
pip install janome
coarij tokenize --tokenizer janome

# Show tokenized result (words are separated by \t).
head -n 5 data/processed/2014/docs/S100552V_business_overview_of_result_tokenized.txt
1       【      業績    等      の      概要    】
(       1       )               業績
当      連結    会計    年度    における        我が国  経済    は      、     消費    税率    引上げ  に      伴う    駆け込み        需要    の      反動   や      海外    景気    動向    に対する        先行き  懸念    等      から   弱い    動き    も      見      られ    まし    た      が      、      企業   収益    の      改善    等      により  全体  ...
```

## まとめ
* 素晴らしいデータセット
* 分析はまた今度実施 
 * 経年での業績・ESG書きっぷり変化
 * 伊藤レポートの検証
 * 業績との相関というよりESG投資の実際 
* 懸念
 * 「書きっぷり」への対応
 * 辞書

## 追記(2019-12-07)
 * ESGレポートのテキスト起こしは対応していないっぽい
  * Google Cloud Vision APIのOCRとか使わないといけないですね。。。 
   * その辺イマイチじゃないか？？
lldbでIntel記法を使う

lldb はデフォルトでアセンブリの表示に AT&T 記法を用いますが、 Intel 記法に変更することもできます。

ホームディレクトリに `.lldbinit` ファイルを作成し、以下のコードを書き込みます。

```
settings set target.x86-disassembly-flavor intel
```

逆に、 AT&T 記法にする場合は、 `intel` の部分を `att` に書き換えればよいです。
なお、これらは lldb 上で実行することもできます。

```
(lldb) settings set target.x86-disassembly-flavor intel
```

settings コマンドについては `help settings` を参照してください。


また、即値を10進数にしたり、 `0x4` のような即値を `4h` のようにすることもできます。

```
# 即値を10進数にする。
settings set target.use-hex-immediates false
```

```
# 即値を 4h のようにする。
settings set target.hex-immediate-style asm
```

設定の一覧のようなものも探しましたが、見つけられなかったので、その他の設定については以下のテストを参照するとよいでしょう。

[https://github.com/llvm-mirror/lldb/blob/master/packages/Python/lldbsuite/test/commands/settings/TestSettings.py](https://github.com/llvm-mirror/lldb/blob/master/packages/Python/lldbsuite/test/commands/settings/TestSettings.py)
【jquery】画面スクロールボタンの実装からイベント発火の基本を復習する

#目的
jqueryを用いて画面をスクロールさせるボタンを実装します。
基礎の復習も兼ねてかなり初歩的な部分も調べつつまとめています。

#まずは完成形から

###HTMLにてボタンを配置
```erb
<!--スクロールしたい範囲-->
<div class="contents">
</div>

<!--スクロール機能を持たせる要素-->
<div class="scroll_btn">
</div>
```
###jsファイルに処理を記述
```js
$(function(){
  $(".scroll_btn").on("click", function(){
    $(".contents").animate({scrollTop: $(".contents")[0].scrollHeight}, 500, "swing");
  })
})
```
#jsファイルそれぞれの記述について

###$(function(){...})

```js
$(function(){
  //処理したい内容
})
```
この部分は、
「HTMLの読み込みが全て完了したら、以下の処理を実行しますよ」
という宣言のようなものです。

以下の例のように、javascriptファイルはHTMLのhead要素の部分で読み込みが行われます。

```erb
<!DOCTYPE html>
<html>
<head>
  <title>タイトル</title>
  <%= stylesheet_link_tag    'application', media: 'all' %>
  <%= javascript_include_tag 'application' %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>
```
しかし、実際にjavascriptで処理を行いたい部分は
大抵、head要素より下のbody要素の中にあるかと思います。
HTMLは上から順番に読み込むので、順番通りjavascriptファイルが先に読み込まれても、
javascriptファイルにて指定しているHTMLの要素が
まだ認識されていないことになります。

そのため「$(function(){...})」の記述による
「HTMLが全て読み込まれてから」宣言が必要になってくるというわけです。

###発火条件の指定（HTML要素を指定し、そこで何が起きるとイベントが発火するか）

```js
//$(function(){
  $(".scroll_btn").on("click", function(){
    //$(".contents").animate({scrollTop: $(".contents")[0].scrollHeight}, 500, "swing");
  })
//})
```
これは、
「"scroll_btn"というクラスが設定されている要素が"click"されると、
以下function(){}の処理を行います」
という意味になります。

イベントを定義する時の記述として

```js
//$(function(){
  $(".scroll_btn").click(function(){
    //処理
  })
//})
```
こういう形でも問題なく動きます。
しかし、「.on()」で記述をしておいた方が
複数のイベントタイプを設定できるなどメリットが多いようです。
これについてはまた別の機会にまとめたいと思います。

###処理（画面をスムーズにスクロールさせる）

```js
//$(function(){
  //$(".scroll_btn").on("click", function(){
    $(".contents").animate({scrollTop: $(".contents")[0].scrollHeight}, 500, "swing");
  //})
//})
```

#####animate()
このメソッドを利用するオブジェクト（今回はcontentsクラスが指定されたdiv要素)が持つ
プロパティなどを徐々に変化させることができます。
今回はscrollTopプロパティを用いて、指定する高さまでスクロールする機能を持たせます。

#####scrollTop:$(".contents")[0].scrollHeight
contentsが入ったdiv要素のスクロールできる高さ（scrollHeight）を取得（scrollTop)します。


また、animate()の第二、第三引数で、その他スクロールに関するオプションの設定を行っています。

#####第二引数　500
これは「duration(アニメーションの動作期間)」を設定しています。
初期値は"normal"が設定されており、"fast"、"slow"と指定できます。
また、完了までの時間をミリ秒単位で指定することもでき、
今回の「500」であれば「0.5秒で完了する」ように設定していることになります。

#####第三引数　"swing"
これは「easing(値の変化の緩急)」を設定しています。
プラグインを入れずに使える値は”linear”と”swing”だけで
"linear"は一定の変化、”swing”は若干の緩急がつきます。
初期値としては”swing”が設定されているようなので、
今回の場合このオプションは必要ないですね。


#終わりに
以上、スクロールボタンの実装を軸にした
jquery基本の復習でした。
もし何か誤っていることなどあれば
ご指摘いただけるとありがたいです。
学習用資料　クラス

##目標
クラスを十分に扱える能力の習得。
日本語を適宜クラスに置き換える能力の習得

##説明
ここではクラス、メソッドにフォーカスを当てた説明をしていく。
クラスとは、フィールドとメソッドと持つものである。
フィールドとはものごとの状態を表す。
メソッドとはものごとの動作を表す。
すなわち、クラスとはものごとを指す。

この説明が100%全て表しているわけでもないが、一番シンプルに考えれる方法ではある。


プログラミングをする上で重要なのは、いきなり処理を書こうとはしてはいけない。
まずは、プログラミングするものの特徴を見つけ出す。
曖昧な部分は自分で定義していくことが重要になる。


##例題
以降、上記の説明にそって問題を解いていく。

####例1
部屋の灯りをプログラミングせよ。

```csharp:Light.cs
public class Light
{
    private bool IsOn = false;

    public void Switch()
    {
        IsOn = !IsOn;
    }
}
```

IsOnフィールドが電源のON,OFFの状態を表す。
SwitchはOn,Offを行う動作を表す。
ここでは、Switchという動作がIsOnの状態を変化させていることにも注目したい。


####例2
TVをプログラミングせよ。

```csharp:TV.cs
public class TV
{
    private bool IsOn = false;
    private int Channel = 1;

    public void ChangeChannelByNumber(int Channel)
    {
        this.Channel = Channel;
    }

    public void ChangeNextChannel()
    {
        Channel++;
        if (Channel == 13) Channel = 1;
    }

    public void ChangeBackChannel()
    {
        Channel--;
        if (Channel == 0) Channel = 12;
    }

    public void Switch()
    {
        IsOn = !IsOn;
    }
}
```


ここでは状態が二つに増えて、

- 電源のON,OFFを表すIsOn
- 現在のチャンネルを表すChannel


の二つがある。
動作に関しては、

- チャンネルボタンを押した時のチャンネルの変化。(ChangeChannelByNumberメソッド)
- 次へを押した時、チャンネルを一個進める変化。(ChangeNextChannelメソッド)
- 前へを押した時、チャンネルを一個戻す変化(ChangeBackChannelメソッド)
- 電源のON,OFFを押した時の電源の変化。(Switchメソッド)

がある。

ここまでは簡単なものだったので、メソッドの中身なども書いてはいたが難しければ中身をいきなり書く必要はなくまず必要そうなメソッドを用意だけすればよい。
ただし、なんでもかんでもvoidまたはメソッドの引数を空にして用意すればいいわけではなく返り値の型や引数、つまり入力と出力の部分は意識する必要がある。
以降の例題、問題ではメソッドの中身は書かずに変数と、メソッドの返り値、戻り値のみを書く。

####例3

テストの結果を取得するシステムをプログラムせよ。

注意
ここでは、まだメソッドの中身を書けなくもないが、中身は書かず概観だけを示す。

要件
生徒N人の、国語、数学、英語のテストの点数を受け取って保存。
ある生徒Xに対して、国語、数学、英語、総合点の順位を取得。
各教科の平均点、最高点、最低点を取得。

```csharp:Grade.cs
public class Grades
{
    public List<Score> list = new List<Score>();

    public int GetAverage(int Subject)
    {
        int result = 0;

        //実装


        return result;
    }

    public int GetRank(int N, int Subject)
    {
        int rank = 0;

        //実装

        return rank;
    }

    public int GetMax(int Subject)
    {
        int max = 0;

        //実装

        return max;
    }

    public int GetMin(int Subject)
    {
        int min = 0;

        //実装

        return min;
    }


}

public class Score
{
    public int JapaneseScore;
    public int MathScore;
    public int EnglishScore;
}
```

まず、要件から状態は何かを探す。
すると、国語の点数、数学の点数、英語の点数という状態がある。
ここで、状態はなるべくまとめた方が分かりやすい。
例えば、
国語のテストの点数、数学のテストの点数、英語のテストの点数の状態、というのと
生徒のテストの点数の状態、というのでは
後者の方がシンプルで分かりやすい。
なので、まとめるためにScoreクラスを作成して、それぞれのテストの点数をフィールドとする。

次に本題の成績を取得するためのクラスを作成する。
まず全ての生徒のテストの点数の状態が必要。
生徒のテストの点数の状態はScoreクラスで表せるので、
全ての生徒のテストの点数は```List<Score> ```で表すことができる。
動作に関しては、

- 平均点を取得する 
- 最高点を取得する 
- 最低点を取得する 
- 生徒の成績を取得する

を各教科にやればいいので、各教科をintで分けるために引数に入れてメソッドを作れば良い。

例題はこれで終了。以降追記するかもしれない。


##問題

問1
〇×ゲームをプログラミングせよ。

問2
電卓をプログラミングせよ。

問3
図書館の蔵書を検索するシステムをプログラミングせよ。

問4
商品の在庫管理を行うシステムをプログラミングせよ。
よく使うMarkdown記法

# Markdownとは
markdownはqiitaの記事作成やgithubのREADMEファイルなどの文章の書き方です。
手軽に文章構造を明示できるので様々なオンラインプラットフォームで採用されています。
よく使われるMarkdownの記法を紹介します。

# 見出し
書き方

```
# 見出しh1
## 見出し h2
### 見出し h3
#### 見出し h4
##### 見出し h5
###### 見出し h6
```

実装後
> # 見出しh1
## 見出し h2
### 見出し h3
#### 見出し h4
##### 見出し h5
###### 見出し h6

# 強調
書き方

```
** テキスト **
```

実装後

**テキスト**



# 番号付きリスト
書き方

```
1. テキスト
2. テキスト
3. テキスト
```

>1. テキスト
2. テキスト
3. テキスト


# リスト
書き方

```
* テキスト
* テキスト
* テキスト
```

実装後
>* テキスト
* テキスト
* テキスト

# インライン表示
書き方

```
`ソースコード`
`var text = "hello"`
```

実装後

>`ソースコード`
`var text = "hello"`

# コードの追加
書き方
rubyとしている箇所は言語なので、phpで表記したい場合はphpにしてください

    ```ruby:title
    puts "hello"
    ```

実装後

```ruby:title
puts "hello"
```


# リンクの書き方
書き方

 ```
[タイトル](URL)
```

例

 ```
[youtube](https://www.youtube.com/)
```

実装後
[youtube](https://www.youtube.com/)

# 画像の追加

書き方

```
![desktop-1985856_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528825/c4e55ebc-2345-0de3-5e81-a6c785911dc5.jpeg)
```


実装後
![desktop-1985856_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528825/c4e55ebc-2345-0de3-5e81-a6c785911dc5.jpeg)
基本情報6週目(11/25週)

# 目標と結果
### 目標
- 23項目まで参考書の演習問題を正解する。
- できない部分を見つけ、そのままにしない。
- 基礎理論とアルゴリズムを勉強を続ける。
    - 時間管理、工数管理も忘れずに。
- [基本情報技術者試験ドットコム](https://www.fe-siken.com/)を使う。
    - 過去問道場
    - 講座で聞いた頻出問題を対策する。
- 全てのテストを合格する。
    - できれば修了テストにも合格する。
- 独習ゼミの解説動画を観てみる。

### 項目

独習ゼミの項目で言うとFE100まで

21．ビジネスインダストリ
(ビジネスシステム・エンジニアリングシステム・e-ビジネス・民生機器・産業機器)
22．企業活動
(経営組織論・OR/IE・会計財務)
23．法務
(知的財産権・セキュリティ関連法規・労働関連/取引関連法規・その他の法律/ガイドライン/技術者倫理・標準化関連)

### 結果
- 修了テスト以外は合格した。
    - 基礎理論とアルゴリズムは偶然知っていた問題が出ただけなので調子には乗らない。
- 過去問道場で過去5年間の問題を解いた。
    - ユーザー登録をした。
    - 1000問やって80%解けた。
    - 計算問題で落としてる。
    - https://imgur.com/JmujQqe

# 振り返り
### Keep
- 過去問道場をやる。

### Problem
- 計算問題は未だに苦手
    - 問題を暗記する方が早いかもしれない。
    - 一部の簡単な問題は暗記してしまった。

### Try
- 過去問道場を続ける。
vmwareでosxのファンがならなくなる設定（のような気がする的な）

# Summary

OSXでvmware上にwindow10を乗っけてたらファンがうるさかったので設定いじったら静かになった

→

すいません。。。

負荷の高い処理させるとファンがなるので
あまり意味なかったです・・・（汗

## env

```
$ uname -a
Darwin callmekoheis-MacBook-Air.local 19.0.0 Darwin Kernel Version 19.0.0: Thu Oct 17 16:17:15 PDT 2019; root:xnu-6153.41.3~29/RELEASE_X86_64 x86_64

$ ver
Microsoft Windows [Version 10.0.18363.476]
```
## こんな感じ

![Screen Shot 2019-11-24 at 16.45.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149269/fc290648-498f-7003-26ed-b7225c667101.png)
![Screen Shot 2019-11-24 at 16.45.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149269/3bdd9907-92f2-fd4a-22ad-5e340eeb9093.png)
![Screen Shot 2019-11-24 at 16.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149269/4a13a867-1308-5f13-eec3-0f6317a152a2.png)

現場からは以上です
Thomas法による数値解析

# Thomas法が使える条件
係数行列が3重対角行列である連立一次方程式に対してこのThomas法を用いることで効率よく解を求めることができます．
<img width="495" alt="スクリーンショット 2019-11-24 23.12.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184790/465407d7-8c03-1bb1-5918-4e9673f4e8fd.png">

# 流れ
1. 前進消去法で係数aの部分を0にする
2. 前進消去法で係数bの部分を1にする
3. 後退代入によって解を求める


## 前進消去
**前進消去**のざっくりとした手法のイメージとしては**上(1行目)にある行から順番に行列を整理していくイメージ**です．今回であれば係数aを0、係数bを1にする作業を上にある行から行っていくイメージです．


まずはじめに係数a,bは0,1に変化させた時に対応する係数c,dの変数名をc',d'と置くことにします．
なので前進消去後の目標とする行列の形はこんな感じ．
<img width="419" alt="スクリーンショット 2020-01-07 16.03.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184790/408442f6-1011-cd48-fd10-1b9f95f52e6c.png">

### 1行目の処理
1行目で考えることとしては$b_1$を1にすることなので
$c_1' = c_1/b_1$
$d_1' = d_1/b_1$

### k行目
とりあえず2行目で考えます．(すみませんちょっと数式markdownで書くの大変になってきたので手書きで．．)

 <img width="480" alt="ファイル_001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184790/64e3e573-8aa1-8469-916d-075ebbad6d28.png">
こんな感じの状態なので、この状態から係数aを0、bを1にすることを考えればいいので
$(② - ①*a_2)/(b_2-c_1'*a_2)$となります．
そのため$c_2'=c_2/(b_2 - c_1' * a_2 )$、$ d_2' = (d_2 - d_1' * a_2)/(b_2 - c_1' * a_2) $となります．

一般化して書くと

```math
c_k'=c_k / (b_k - c_{k-1}' * a_k ) \\
d_k' = (d_k - d_{k-1}' * a_k)/(b_k - c_{k-1}' * a_k)
```
 

## 後退代入
上の項までで前進代入だ終了してこのような形に行列がなりました．
<img width="419" alt="スクリーンショット 2020-01-07 16.03.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184790/408442f6-1011-cd48-fd10-1b9f95f52e6c.png">

後退代入では名前の通り行列の右下の成分から計算を行っていきます．ここで前進消去によって対角成分が1になっていることが効いてきます．しっくり来ない場合は前進消去後の行列と解`X`の積を実際に手で計算してみるとわかるかと思います．

```math
x_n = d_n' \\ 
x_k = d_k - c_kx_{k+1} \;\;\;\; (1<=k<n)
```

## プログラム
既知である行列`b`と解の行列は次元数が同じなのでメモリ削減のために解は配列`b`に格納しています．また係数c', d'はp,qに置き換わっています．

```.cpp
void Thomas(double *a, double *b, double *c, vector<double> d){
    vector<double> p, q;
    p.push_back(c[0] / b[0]);
    q.push_back(d[0] / b[0]);
    int n = d.size();
    
    
    for(int i = 1; i < n; i++){
        if(i < n-1){
            double _p = c[i] / (b[i] - c[i-1] * a[i]);
            p.push_back(_p);
        }
        double _q = (b[i] - a[i] * q[i-1]) / (b[i] - p[i-1] * a[i]);
        q.push_back(_q);
    }
    
    b[n-1] = q[n-1];
    for(int i = n-2; i >= 0; i--){
        b[i] = q[i] - p[i]*b[i+1];
    }
    
    for(int i = 0; i < n; i++){
        cout << d[i] << endl;
    }
}
```
(*実際にちゃんと動いているかどうかはこの[サイト](https://keisan.casio.jp/exec/system/1278931746 "サイト")を使って確かめてみるといいもしれません)

## 備考
今回紹介したThomas法は拡散シミュレーションなどで用いられる**陰解法**の中で連立方程式を解くために用いられる．

# 参考
https://www1.gifu-u.ac.jp/~tanaka/numerical_analysis.pdf
http://www.mri-jma.go.jp/Publish/Technical/DATA/VOL_47/47_023.pdf
http://nas2008.akita-pu.ac.jp/~ozawa/Lecture/Grad_Schl/HandOut10.pdf
nodebrewコマンドのメモ

# nodebrewめも
「なにインストールしたんやったっけ？」
「切替ってどうやるんやったっけ？」
勉強のときこういうこと多いので備忘録用のめもです。
なのでインストールは終わってる前提です。ご了承ください。。。

### インストールできるバージョンを確認したい
```
$ nodebrew ls-remote
```

### インストールしたい
* バージョンを指定する方法
* エイリアスで指定する方法

があるようです。

#### バージョンを指定する方法
```
$ nodebrew install [version] # 例えば [version] -> v14.1.0
```

#### エイリアスで指定する方法
安定版が欲しい場合

```
$ nodebrew install stable
```

最新版が欲しい場合

```
$ nodebrew install latest
```

※安定版と最新版の違い
安定版: 安全。
最新版: 新しい機能が盛り込まれている。バグが残ってることもある。
のような感じ

### いらないバージョンをアンインストールしたい
```
$ nodebrew uninstall [version] # 例えば [version] -> v14.1.0
```

### バージョンを指定してNodeを使いたい
```
$ nodebrew use [version] # 例えば [version] -> v14.1.0
```

### インストールしたバージョンを確認したい/使用中のバージョンを確認したい
```
$ nodebrew ls
```
結果には `current: v14.1.0` のように現在使用しているバージョンも表示される

### 最後に
Nodebrewを業務で使ってるところってあるんかな、、、

編集終わってから`nvm`ってのを知りました。nodebrewと同じくNode.jsのバージョン管理ができるやつなんかな。調べないと、、、
SwiftUIでtabItemのSF Symbolsのサイズを変更する方法

# SwiftUI tips
SwiftUIでタブのアイテムのサイズを変更するのに少し苦戦したので共有します。
なお、大きくしたアイコンがtabの一番上に付いていてpaddingも効かないのでご了承🙇‍♂️
(解決策あったら米キボンヌ)

## 成功するパターン
```swift
Text("user")
	.tabItem {
		Image(systemName: "person")
			.font(.title)
		}
.tag(4)
```
```swift
.font(.system(size: 10))//とかでも行ける
```
<img width="375" alt="IMG_0335.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/4e3ddfea-4b53-fdcf-810e-2b8f833efa90.png">



## ダメなパターン

```swift
Text("user")
	.tabItem {
		Image(systemName: "person")
			.resizable()
			.aspectRatio(contentMode: .fit)
			.frame(width: tabItemSize, height: tabItemSize)
		}
.tag(4)
```

<img width="375" alt="IMG_0334.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/1a09d016-b744-a620-49bf-e51fb32fb912.png">

## 参考URL
https://developer.apple.com/documentation/swiftui/tabview
Work In Progressなプルリクエストをチームに適用してみて

# チーム開発で起きていた以下の問題に対応する為、WIPなプルリクエストの運用を開始した

- 巨大なプルリクエスト
  1000行超えるPRが結構な頻度で出来てた

- 巨大な変更点に対するコメントのしずらさ
  そもそも論の修正だったりテストのやり直しに繋がりそうだなぁと思いコメントを控えてしまう

- 1コミットがデカい
  デカい1機能1コミットにまとまって微修正のコミットが2,3個みたいな状況

- テストやってるの?問題, どこまでやれば終わりなの?問題
  曖昧な機能要件に対するプルリクエストであるが故、テスト観点など不明瞭な為、テスト仕様書を求められたり、実装者もどこまでやれば良いか認識しきれていなかったり
  
これらはそもそもGitに扱いなれてないメンバーやチーム開発に慣れてないメンバーが多いや、タスクの切り方がしっかり出来ていないなどの問題の為起きていた。
なのでプルリクエストの在り方以前ではあったが、良い機会なので、課題の切り方やGitの運用方法なども見直した

# WIPパターンのプルリクエストとは

**WIP** ... Work In Progressの略。進行中を表す

#### 主な特徴としては
- 最初のコミットは空コミットで始める

- 実装者はプルリクエストをその時点で作成し、コメント内に実装内容などをチェックボックス形式で記載する(この時、PRのタイトルに**[WIP]**などつけ作業中を明確にし、マージを禁ずる)

- レビュアーは認識の齟齬などないか確認する(実装者とレビュアーの意思疎通ツールとしてのプルリクエスト)

- なるべく小さい粒度でコミットし、レビュアーやチームメンバーは適時コードをレビューしたりできる

- すべての実装が完了したらタイトルの**[WIP]**を外し、最終レビューとマージをする

#### 詳しくはこちら
[Work in ProgressパターンによるPull Requestを利用した開発フロー](https://qiita.com/numa08/items/b676e38e3dbabfd39d18)

# 実際にやってみて

そもそも巨大なプルリクエストにならないようにタスクを切ったり、細かくコミットを心掛けるように喚起してから適用した。

### 良かった点
 
- 未完成の段階でレビューや指摘ができる
  データ構造の設計や、アンチパターンを踏みそうなソースに早い段階で指摘できる
  完成してからだと実装者もレビュアーも心的疲労が大きい。それが改善された。
  当たり前だが、これが一番デカい。早い段階でパブリックな場所にソースが置かれるのは良いことしかない。
  特に若手メンバーを育成するのには最良だと思う。

- 勿論コミットは小さくなるし、コンフリクトを未然に防げる
  前述と被るがコンフリクトしそうなソースに気づけ、指摘できる

- 手戻りが減った。あったとしても早い段階で気付ける 
  最初にタスクを細かく洗い出すので、レビューする時に「ここの〇〇ってどういう改修？」、「あれやってないけど大丈夫？」みたいなやり取りができる。
 

### 悪かった点
 
- メンバーによってやったりやってなかったり
  コードレビューに重きを置いているメンバーや自分に近いメンバーはしっかりやってくれたが、始めた当初はメンバー間でモチベーション格差があった。
  タスクの洗い出しが雑だったり、コミットの粒度もマチマチだったり。
  コードレビューが怠惰なメンバーには単純に手間が増えたと感じるかもしれない。
   後述する空コミットの運用にも関係してくる

- 空コミットが出来ない問題
  僕が所属してるチームが基本SourceTreeなどのGUIクライアントを使うメンバーが多く、コマンドでGitを操作したことないメンバー多数である。
 空コミットの仕方を教える手間や、空コミットだけターミナルでやる手間などが発生した。

- プルリクエストが勝手にマージされてしまう
  チームで使っているリポジトリ管理がBacklogの為、ブランチを切っただけでプルリクエストが作れるメリットがあるのだが、その際空コミットしていないブランチが親ブランチがマージされるとそのブランチも差分なしと判断され、マージ済みになってしまう。(GithubはコミットないとPR作れないのでこの問題は起きないと思うが)
 これは空コミットの義務化をする以外ない

- レビュータイミングが人によってまちまち
  これはwip適用する前からあった問題ではありますが、しっかりしたスクラムとかを組んでるわけではないので、結局実装完了後にPRを見るなんてこともありました。
  これに関しては週次などでコードレビューの時間を設けたり、レビュアー側のルール整備も必要だなといったところ
  

## 空コミットをGUIツール陣にも手軽にしてもらう施策

#### GUIツールにカスタムコマンドを登録する

Forkを例に挙げるが、SourceTreeにも同等の機能あり

1. 設定から`Custom Command`の項で`Add Branch Custom Command`を登録する
<img width="635" alt="fork-customCommand.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147358/5c32d4f1-1608-76d2-57f9-30d3c230ac45.png">

2. 空コミットのカスタムコマンドを登録
   この時、`$shortname` を含めておくと自動でブランチ名がコミットされ課題管理ツールと紐付き便利
<img width="682" alt="empty_commit_command.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147358/d8a71353-55a8-77f2-fe3a-97f1ecdd58df.png">

3. 対象ブランチから右クリックから簡単に空コミットが出来るように
<img width="337" alt="empty_commit.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147358/e66af486-3dd0-57ba-5ede-b0c31dec09b2.png">

## まとめ

総じてメンバーやリーダー層やレビューする側からの評判が良く、やって良かったと言える。
やっぱりコードレビューはチーム開発においてかなりの比重と重要度を締めると思うので、一番改善しておくべきかつ効果が出るところ。
同じような悩みを抱えてるチームは一度やってみることを勧めます。
ただ、モチベーション格差などを感じた瞬間に、凹んだりしますが、チームビルディングってまぁこんな感じだよなぁと。利点を知って貰えるように自分が働きかける以外に道はないかなと思ってます。


現在、テストがない状態だったソースにテストコードを書くようにする施策などレガシーで非効率な開発スタイルから脱却しようと施策を打って少しでもチームがうまく回るように頑張っております。
(小ネタ)AnsibleからWindowsへ簡単に接続する方法

#概要
NTLM認証を利用すれば、手軽に接続できる。(ただし注意点あり)

#環境
Ansible2.9.1
Windows2019

#どんなときに使えそうか？
AnsibleからWindowsへ接続する方法はいくつかサポートされています。
Web上では`Basic認証`を良く見かけます。
`Basic認証`は、Windows側の設定変更が必要です。
(手動ならBasic認証の有効化や、暗号化されていないhttp通信の有効化等。[ConfigureRemotingForAnsible.ps1](https://github.com/ansible/ansible/blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps1)を利用する方法も。)

```winrm:sample
winrm set winrm/config/service/auth @{Basic="true"}
winrm set winrm/config/service @{AllowUnencrypted="true"}
```

別の接続方法として[`NTLM認証`](https://docs.ansible.com/ansible/latest/user_guide/windows_winrm.html#ntlm)があります。
`NTLM認証`は、デフォルトで有効になっており、Windows側での設定変更が不要です。
Ansible側のインベントリは以下の通り。

```yaml:inventory.yml
ansible_user=administrator
ansible_password=password
ansible_connection=winrm
ansible_winrm_transport=ntlm
```

例えば、初期セットアップ時に利用したり、手軽に接続を試してみたい場合などは、結構使えると思います。
ただし、ダブルホップ問題[^1]があるため、PlaybookやPowerShellなどの書き方に注意が必要です。
[^1]: ターゲットのWindows(A)から、ファイルサーバのWindows(B)へ、UNCパスでアクセスする場合など。
5分でできるElastic stack(Elasticsearch, Logstash, Kibana)環境構築

Elasticsearch, Logstash, Kibanaはしばしばセットで使われ、ELK stackなどと呼ばれたりします。
簡単に環境構築できますので、[Elastic Stack Advent Calendar1](https://qiita.com/advent-calendar/2019/elasticsearch)、[Elastic Stack Advent Calendar2](https://qiita.com/advent-calendar/2019/elasticsearch) で気になる記事は手を動かしてみてはいかがでしょうか？

## 環境構築

```sh
git clone https://github.com/deviantony/docker-elk.git
cd docker-elk
docker-compose up
```

**== 完 ==**

では二日目の記事をお楽しみに… 
という気持ちになりましたが動作確認をしておきます。

## 動作確認

### Logstash

デフォルトではport 5000でtcpで入力でき、Elasticsearchに出力しています。

nc(netcat)でテキストを流し込んでみます。

```sh
echo "東京特許許可局許可局長" | nc localhost 5000
```

### Elasticsearch

Elasticsearchの確認も…と思いましたが、KibanaはElasticsearchのビューアーですからスキップ。

### Kibana

http://localhost:5601 からアクセスできます。

アカウントは以下のようになっています。

- user: elastic
- password: changeme

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21799/2c2e8c3c-7908-238c-fdec-ae896ce0cc4d.png)

Logstash が流し込んだデータは `logstash〜` に入っていますので、
Index Patternsに `logstash*` を入れて登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21799/91902c19-3e33-512b-4fb1-4e80013c41fc.png)

LGTM!

## Elasticsearchに直接アクセスしたい

デフォルトだ認証が掛かっていて扱いづらいです。
以下で無効にできます(本番で有効にすべきでしょう!)。

```diff
diff --git a/elasticsearch/config/elasticsearch.yml b/elasticsearch/config/elasticsearch.yml
index 39bfd40..11b0242 100644
--- a/elasticsearch/config/elasticsearch.yml
+++ b/elasticsearch/config/elasticsearch.yml
@@ -13,6 +13,6 @@ discovery.type: single-node
 ## X-Pack settings
 ## see https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-xpack.html
 #
-xpack.license.self_generated.type: trial
-xpack.security.enabled: true
+xpack.license.self_generated.type: basic
+xpack.security.enabled: false
```

設定変更後はdockerの再起動が必要です。

## 日本語を扱いたい

```diff
diff --git a/elasticsearch/Dockerfile b/elasticsearch/Dockerfile
index 24278f8..fdc13d6 100644
--- a/elasticsearch/Dockerfile
+++ b/elasticsearch/Dockerfile
@@ -5,3 +5,4 @@ FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}

 # Add your elasticsearch plugins setup here
 # Example: RUN elasticsearch-plugin install analysis-icu
+RUN elasticsearch-plugin install analysis-kuromoji
```

kuromoji pluginをインストールします。
設定変更後はdockerの再起動が必要です。

## まとめ

docker-composeでサクッと環境構築できました！
これでより楽しく Elastic stack Advent Calendar を楽しんでいきましょう!
Janomeで形態素解析

#はじめに
qiita初投稿です。以前から自然言語処理に興味があって触ってみようと言う事で、自分の好きな歌手の曲の歌詞、人気top10とあまり人気のないtop10をスクレイピング→形態解析→頻度の抽出→グラフ化してどのような違いが出るのか見てみました。

##使用したサイト
Uta-Net
https://www.uta-net.com/

##スクレイピング
```python
import requests
from bs4 import BeautifulSoup
from janome.tokenizer import Tokenizer
import collections

t = Tokenizer()

#指定したurlのhtmlから歌詞を抽出
r = requests.get("歌詞ページのURL")
soup = BeautifulSoup(r.content, "html.parser")
kashi = soup.find(id = "kashi_area").text

#名詞の出現頻度の抽出
kashi = collections.Counter(token.base_form for token in t.tokenize(kashi)if token.part_of_speech.startswith('名詞'))
```
上記で歌詞を解析し得た出現頻度データをDBに格納

##グラフ化
```python
import numpy as np
import matplotlib.pyplot as plt
import songdef as s
import japanize_matplotlib

top_x = []
top_y = []

last_x = []
last_y = []

all_x = []
all_y = []

#DBからデータを持ってくる
d_top = s.get_date("top_song")#DBから抽出したデータを持ってくるメソッド
d_top = s.sort_del(d_top)#データをlist型に変換し頻度の高い順にソートし、top10以下を切り捨てるメソッド

d_last = s.get_date("last_song")
d_last = s.sort_del(d_last)

d_all = s.get_date("all_song")
d_all = s.sort_del2(d_all)


#x,yのデータの用意
for res in d_top:
    best_x.append(res)
    best_y.append(d_top[res])

for res in d_last:
    normal_x.append(res)
    normal_y.append(d_last[res])
    
for res in d_all:
    all_x.append(res)
    all_y.append(d_all[res])



#Figureを作成
fig = plt.figure(facecolor = "lightgray", figsize = (20,15))
fig２ = plt.figure(facecolor = "lightgray", figsize = (40,15))

#FigureにAxesを追加
ax_1 = fig.add_subplot(221)
ax_2 = fig.add_subplot(222)
ax_3 = fig２.add_subplot(223)


#Axesの設定
ax_1.set_title("top10_song", fontsize = 14)
ax_1.set_xlabel("word", fontsize = 14)
ax_1.set_ylabel("count", fontsize = 14)

ax_2.set_title("last10_song", fontsize = 14)
ax_2.set_xlabel("word", fontsize = 14)
ax_2.set_ylabel("count", fontsize = 14)

ax_3.set_title("all_song", fontsize = 14)
ax_3.set_xlabel("word", fontsize = 14)
ax_3.set_ylabel("count", fontsize = 14)

#Axesに棒グラフを追加
ax_1.bar(top_x,top_y)
ax_2.bar(last_x,last_y)
ax_3.bar(all_x,all_y)
```
Jupyterで上記コードでグラフ化した結果、、、
![歌詞比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394397/cc215529-eba9-2231-35a3-d137b4e9536e.png)
![歌詞比較２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394397/23c2497f-a73c-19c4-c6ba-313df126c64a.png)
こんな感じになりました！ちなみにall_songは対象のアーティスト全曲のデータです。top10、last10との割合を見るために追加しました。

##結果
top10とlast10、違いはあれど出現している単語はほぼ同じ、全曲と比較しても両方とも同じ単語がみて取れます。違いを見るというよりもそのアーティストの特徴がみられる感じでした。
と言う事で今度は曲のジャンル事に比較してみたらどのような特徴があるのかをみてみようと思います。
【検定論】尤度比検定を数値実験してみる

# 背景
前回（[【検定論】片側検定問題の一様最強力検定](https://qiita.com/jajagacchi/items/12148264cad4a4fa5d86)）は単純検定のみならず、片側検定においてもある条件を満たせば一様最強力検定を構成出来ることを述べました。
しかし一般には一様最強力検定が存在するという保証はありません。今回数値実験する尤度比検定は理論的保証があるわけではありませんが、合理的な検定が得られる場合が多く、実用的なのでよく用いられるそうです。（参考：「現代数理統計学」竹村彰通）

# どのように検定すればよいか
帰無仮説を$\theta\in\Theta_0$、対立仮説を$\theta\in\Theta_1$とします。尤度比は

```math
L = \frac{\max_{\theta\in \Theta_1}f(x,\theta)}{\max_{\theta\in \Theta_0}f(x,\theta)}
```
で定義されます。ネイマン・ピアソンの補題同様、ある$c$を考え、$L>c$のとき棄却します。$c$は有意水準$\alpha$から計算されますが、一般に簡単に求まるとは限りません。しかし、帰無仮説の下で自由に動かせるパラメータの数を$q$、対立仮説の下で自由に動かせるパラメータの数を$p+q$とすると、標本サイズ$n\to\infty$のとき

```math
2\log L > \chi_\alpha^2(p) \to {\rm reject}
```
が有意水準$\alpha$の検定となります。これなら機械的にできますね。

# 数値実験
ポアソン分布から$n$個の値をサンプリングすることを考えます。帰無仮説は$\lambda=\lambda_0$、対立仮説は$\lambda\neq\lambda_0$とします。有意水準は5%とします。まず、帰無仮説の下で尤度を最大とするのは言わずもがな$\hat\lambda=\lambda_0$です。対立仮説の下で尤度を最大とするのは$\hat\lambda=\bar {X}$です。よって

```math
L = \frac{\prod_i e^{-\bar X}\bar X^{x_i}}{\prod_i e^{-\lambda_0}\lambda_0^{x_i}}
```
となります。対数尤度比は

```math
\log L = n(\lambda_0-\bar X) + \sum_i X_i\log\frac{\bar X}{\lambda_0}
```
となります。帰無仮説で動かせるパラメータは$q=0$、対立仮説で自由に動かせるパラメータは$p+q=1$ですので、尤度比検定は

```math
2\log L > \chi_{0.05}^2(1)\simeq 3.84 \to {\rm reject}
```
となります。
それでは$\lambda_0=3$として数値実験してみます。

```c++
#include <iostream>
#include <fstream>
#include <random>
#include <vector>

int factorial(int k)
{
	int ret = 1;
	for (int i = 1; i <= k; i++)
	{
		ret *= i;
	}
	return ret;
}

int main(int argc, char **argv)
{
	std::mt19937 mt(0);
	double lambda0 = 3;
	double lambda = 3;
	int N = atoi(argv[1]);//標本サイズ
	std::poisson_distribution<int> poi(lambda);
	double alpha = 0.05;
	double chi2 = 3.84;

	int Iter = 10000;
	int reject = 0;
	for (int iter = 0; iter < Iter; iter++)
	{
		std::vector<int> data(N);
		double av = 0;
		for (int n = 0; n < N; n++)
		{
			data[n] = poi(mt);
			av += data[n] / (double)N;
		}
		double ll = N * (lambda0-av);
		for (int n = 0; n < N; n++)
		{
			ll += data[n] * log(av / lambda0);
		}
		if (2*ll > chi2) reject++;
	}
	std::cout << reject / (double)Iter << std::endl;

	return 0;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/476f87cd-b502-ec55-9fd8-038ef645c3d0.png)
標本サイズ10以下は怪しいですが、それ以上では有意水準5%前後の値となっています。

# 感想
とりあえず困ったら尤度比とっとけ、って感じでしょうか。
Mavenで導入したKotlinのInterfaceに実装した関数を、Java8からデフォルト実装として利用する方法

# 概要
KotlinのI/Fにはデフォルト実装を定義できますが、Java側からそのデフォルト実装を利用するにはあらかじめ設定が必要です。
今回はその設定方法を書き記します。

# 前提
- Maven
- Kotlin 1.35
- Java 1.8

# 設定方法
### ①Kotlinのプラグインの設定
pom.xmlのkotlinをcompileさせることを定義している箇所の引数に、`-Xjvm-default=compatibility` を追加
例：

```xml:pom.xml
<plugin>
	<groupId>org.jetbrains.kotlin</groupId>
	<artifactId>kotlin-maven-plugin</artifactId>
	<version>${kotlin.version}</version>
	<executions>
		<execution>
			<id>compile</id>
			<goals> <goal>compile</goal> </goals>
			<configuration>
				<sourceDirs>
					<sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
					<sourceDir>${project.basedir}/src/main/java</sourceDir>
				</sourceDirs>
				<args>
					<arg>-Xjvm-default=compatibility</arg>
				</args>
			</configuration>
		</execution>
		<execution>
			<id>test-compile</id>
			<goals> <goal>test-compile</goal> </goals>
			<configuration>
				<sourceDirs>
					<sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
					<sourceDir>${project.basedir}/src/test/java</sourceDir>
				</sourceDirs>
				<args>
					<arg>-Xjvm-default=compatibility</arg>
				</args>
			</configuration>
		</execution>
	</executions>
</plugin>
```

propertiesにjvmTargetを記載
例：

```xml:pom.xml
<properties>
	<jdk.version>1.8</jdk.version>
	<encoding>UTF-8</encoding>
	<kotlin.version>1.3.60</kotlin.version>
	<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
</properties>
```

### ②Javaにデフォルト実装として認識させたいメソッドに `@JvmDefault` アノテーションを付与

以上となります。
[Xcode]Wi-Fiでビルドする[実機]


開発中のiosアプリを実機(iPhone)でビルドする際に、USBケーブルを繋がずWi-Fiでビルドする方法です。

##開発環境
macOS Catalina V.10.15.1
Xcode V.11.2.1

#やり方
１、最初はUSBケーブルで実機(iPhone)とMacを繋ぎます。
（このデバイスを信用しますか？と聞かれるので、「OK」）

２、タブバーにある「Window」をクリックし、さらに「Devices and Simulators」をクリックします。
(ショートカットキーで⬆️＋ ⌘ ＋ ２ でもいい)

３、すると、実機(iPhone)の情報が表示されます。そこにある「Connect via network」のチェックボックスにチェックを入れます。

これで完了です。試しにUSBを抜いてビルドしてみてください、正常にビルドできるはずです。

ただ、ビルドの速度はどうなんでしょう、、、やっぱり有線の方が速いかな？:thinking:
【Python】NumPyを使った行列の乗算処理時間

# NumPyとは
皆様も御存知の通り、Pythonは機械学習やAI分野に強いプログラミング言語です。
その理由は数学系の学術ライブラリの潤沢さにあります。
NumPyはその代表格とも言えるPythonのライブラリです。

# NumPyを使って行列計算（乗算）
行列の乗算をNumPyを使って処理してみようと思います。
人間の手計算では正方行列3*3でも苦労すると思います。
ここでは100*100を処理した時間を計測したいと思います。

```python
# NumPyをインポート
import numpy as np
import time
from numpy.random import rand

# 行列 100*100を指定
N = 100

# 行列を初期化、乱数を発生させる
matA = np.array(rand(N, N))
matB = np.array(rand(N, N)) 
matC = np.array([[0] * N for _ in range(N)]) 

# 開始時間を取得
start = time.time()

# 行列乗算を実行
matC = np.dot(matA, matB)

# 小数第2位で打ち切って出力
print("NumPyを使った計算結果：%.2f[sec]" % float(time.time() - start))
```

## 処理結果
NumPyを使った計算結果：0.03[sec]


# NumPyを使わず、Pythonのfor文をネストして計算
```python
# NumPyをインポート
import numpy as np
import time
from numpy.random import rand

# 行列 100*100を指定
N = 100

# 行列を初期化、乱数を発生させる
matA = np.array(rand(N, N))
matB = np.array(rand(N, N)) 
matC = np.array([[0] * N for _ in range(N)]) 

# 開始時間を取得
start = time.time()

# for文をネスト
for i in range(N):
    for j in range(N):
        for k in range(N):
            matC[i][j] = matA[i][k] * matB[k][j]

print("Pythonのfor文での計算結果：%.2f[sec]" % float(time.time() - start))
```

## 処理結果
Pythonのfor文での計算結果：0.92[sec]


# 100*100の行列計算ではNumPyとfor文のネストでは約９倍もの処理時間の差
ライブラリを使うと単にコードが平易に扱いやすくなるだけでなく、
処理時間も大幅に削減でき、またシステムの負荷も大幅に下げられることが伺えます。

勉強あるのみですね。




### ■ 参考文献
Pythonで動かして学ぶ! あたらしい深層学習の教科書 機械学習の基本から深層学習まで (AI & TECHNOLOGY)　株式会社アイデミー石川聡彦 著
https://www.shoeisha.co.jp/book/detail/9784798158570
direnv: error exit status 1 の回避

# 背景
自分用にメモ。

# 環境（というか状況）

- 事前に direnv を設定済み
- pipenv も導入済み

# direnv: error exit status 1 の回避（venvの保存場所を変更したとき発生）
pipenv で作成された venv の場所を変更したく、下記を .zshrc (もしくは、.bash_profile、 .bashrc もだと思う)に保存したら、エラー direnv: error exit status 1 が発生した。

```terminal
export PIPENV_VENV_IN_PROJECT=true
```

なんで？と思ったが、よく考えると仮想環境のPATHが代わってるからか？と。
ということで、新しいフォルダを作って、そこで pipenv で環境を作り直したら、エラーも消えて正常動作に戻った。
NuxtのCompositionAPIでdayjsをぶっこむ

# Composition APIはthisを潰す

1. dayjsインストール
2. pluginsにdayjsを追加
2. TypeScript用の設定
3. 使い方

## dayjsインストール

```$ yarn add dayjs```

## pluginsにdayjsを追加

理由は後述しますが,plugins/dayjs/dayjs.jsとしています。
一個専用のディレクトリを切ります。

```plugins/dayjs/dayjs.js
import Vue from 'vue'
import dayjs from 'dayjs'
import 'dayjs/locale/ja'

import relativeTime from 'dayjs/plugin/relativeTime'
import LocalizedFormat from 'dayjs/plugin/localizedFormat'
import weekday from 'dayjs/plugin/weekday'

dayjs.locale('ja')
dayjs.extend(weekday)
dayjs.extend(relativeTime)
dayjs.extend(LocalizedFormat)
Vue.prototype.$dayjs = dayjs

```

```nuxt.cofig.js
plugins: ['@/plugins/dayjs/dayjs']
```
## TypeScript用の設定追加
```@/plugins/dayjs/dayjs.d.ts
// 1. Make sure to import 'vue' before declaring augmented types
import Vue from 'vue'

import dayjs from 'dayjs'

// 2. Specify a file with the types you want to augment
//    Vue has the constructor type in types/vue.d.ts
declare module 'vue/types/vue' {
  // 3. Declare augmentation for Vue
  interface Vue {
    $dayjs(date?: dayjs.ConfigType, option?: dayjs.OptionType, locale?: string): dayjs.Dayjs;
  }
}
declare module 'dayjs' {
  interface Dayjs {
    weekday(): number

    weekday(value: number): Dayjs
  }
}
```

```tsconfig.json
  "files": [
    "plugins/dayjs/dayjs.d.ts"
  ]
```

この型定義ファイルを書くときに,@/dayjs.d.tsって感じで置くと,pluginのdayjsをうまく読み込んでくれなかった。plugins下だと読み込んでくれるので,型定義ファイルとpluginファイルを機能ごとにひとまとめにする構成にした。

## 使い方

```component.vue
<script lang="ts">
import { createComponent, reactive } from '@vue/composition-api'

export default createComponent({
  setup (props: {}, { root: { $dayjs } }) {
    const state = reactive({
      now: $dayjs().format('MM月DD日 (ddd)')
    })
    return {
      state
    }
  }
})
</script>
```

下記でもいけますが,上記だと省略できていい感じです。

```typescript
setup (props: {}, context) {
    const state = reactive({
      now: context.root.$dayjs().format('MM月DD日 (ddd)')
    })
    return {
      state
    }
  }
```

# 参考

[僕はとりあえず dayjs !](https://techblog.roxx.co.jp/entry/2019/03/20/143750)
[
SETUP VUEX IN VUE.JS 3 COMPOSITION API WITH EXAMPLE](https://youtu.be/C1BripDJktc)
[Some documentation/guidance to Typescript and using dayjs as a Vue.js plugin #611
](https://github.com/iamkun/dayjs/issues/611)
brew cask のコマンド

# 背景
いつも忘れるので、自分用にメモする。

# brew cask コマンド（設定方法）
[公式](https://github.com/Homebrew/homebrew-cask/blob/master/USAGE.md) はここ。ここですべてわかる。
日本語がいい場合は、[homebrew-caskとは](https://qiita.com/swallowtail62/items/61244ea3c7d00f692823)や[ここ](https://rcmdnk.com/blog/2018/03/14/computer-mac-homebrew/)を見たらわかる。
あと[brew caskが、すごく便利だったことを今更ながらに知った件](https://www.shibuya24.info/entry/brew_cask)もわかりやすい。

# 使い方
公式にも書いてるし、[brew caskが、すごく便利だったことを今更ながらに知った件](https://www.shibuya24.info/entry/brew_cask)でも言われているが、'''brew cask search ○○''' で探すよう記載されるサイトもあるが、これはエラーになる。
以下のサンプルで探す。

```terminal
xxx-xxx% brew search google 
```

他、使い方は brew cask で出る。
```
xxx-xxx% brew cask
Homebrew Cask provides a friendly CLI workflow for the administration
of macOS applications distributed as binaries.

Commands:

    --cache    display the file used to cache the Cask
    audit      verifies installability of Casks
    cat        dump raw source of the given Cask to the standard output
    create     creates the given Cask and opens it in an editor
    doctor     checks for configuration issues
    edit       edits the given Cask
    fetch      downloads remote application files to local cache
    home       opens the homepage of the given Cask
    info       displays information about the given Cask
    install    installs the given Cask
    list       with no args, lists installed Casks; given installed Casks, lists staged files
    outdated   list the outdated installed Casks
    reinstall  reinstalls the given Cask
    style      checks Cask style using RuboCop
    uninstall  uninstalls the given Cask
    upgrade    upgrades all outdated casks
    zap        zaps all files associated with the given Cask

See also "man brew-cask"
```
Ignite UI for Angular のテーマについて

お疲れ様です。

私が「Ignite UI for Angular のテーマ」について、ある程度理解するまでに1週間くらいかかってしまったので、これから学ばれる方が効率的に学習できるようにまとめたいと思います。

##項目
 - テーマとは
 - グローバルテーマとコンポーネントテーマ
 - グローバルテーマの設定方法
 - コンポーネントテーマの設定方法
 - 両方を使用した例
 - 参照

####テーマとは
 - 最小限のコードで、コンポーネントのデザインを変更できるAPIです。  
 （要はIgnite UIが提供するコンポーネントのデザインを簡単に変えれるやつです。）


※コンポーネントとは、ページを構成するUI部品のことです。細かく説明しませんがIgnite UIで言うところのグリッド、ボタンなどのことです。本記事では、コンポーネントという単語がたくさん出てくるのでコンポーネント＝部品を頭にインプットしてください。

####グローバルテーマとコンポーネントテーマ
#####グローバルテーマ
 - カラーパレットを使用して、全てのコンポーネントにスタイルを設定できる。  
（色のパターンを決めて、一括で部品のデザインを設定できる。）

 - 設定方法

```scss:hogehoge.scss
//↓テーマを使うときに、必要↓
@import '~igniteui-angular/lib/core/styles/themes/index';

//グローバルテーマの引数を作成
//主にパレットやグローバルテーマに含めないテーマのリストを作成
//↓パレットの一部を設定した例
$app-color-palette: igx-palette(
    $primary: red,
    $secondary: yellow
);

//↓テーマを使う前に、必ず宣言するもの（お約束）引数なし↓
@include igx-core();
//↓グローバルテーマを設定↓
@include igx-theme($app-color-palette);
```
 - グローバルテーマの引数

|名前|型|デフォルト|説明|
|:---|:---|:---|:---|
|$palette|map|undefined|メインの色やサブの色など一定パターンに沿ったカラーセット。詳しくは[こちら](https://jp.infragistics.com/products/ignite-ui-angular/angular/components/themes/palette.html)|
|$schema|map|$light-schema|テーマで使用する全てのプロパティのリスト|
|$exclude|list|( )|グローバルテーマに含めない、コンポーネントテーマのリスト|
|$legacy-support|boolean|true|テーマの設定方法を決定 falseに設定した場合はCSS変数での設定|


#####コンポーネントテーマ
 - 個別にテーマのスタイル設定ができる。
 - グローバルに定義する。

 - 設定方法（ボタンテーマの場合）

```scss:hogehoge.scss
//↓テーマを使うときに、必要↓
@import '~igniteui-angular/lib/core/styles/themes/index';

//ボタンテーマの引数の設定
//ボタンの色を設定
//↓ボタンの一部を設定した例
$app-button-theme: igx-button-theme
(
    $raised-focus-text-color: green,
    $raised-border-radius: 2px
);

//↓テーマを使う前に、必ず宣言するもの（お約束）引数なし↓
@include igx-core();
//↓ボタンのコンポーネントテーマを設定↓
@include igx-button($app-button-theme);
```

####両方を使用した例

```scss:hogehoge.scss
//↓テーマを使うときに、必要↓
@import '~igniteui-angular/lib/core/styles/themes/index';
//パレットの設定
$app-color-palette: igx-palette(
    $primary: red,
    $secondary: yellow
);
//カードテーマの設定
$my-card-theme: igx-card-theme(
  $background: red,
  $content-text-color: blue
);
//ボタンテーマの設定
$app-button-theme: igx-button-theme(
    $raised-focus-text-color: green,
    $raised-border-radius: 2px
);

//グローバルテーマの一括設定から除外するテーマを指定(テーマの設定はCSSのルールと同じなので、宣言順によっては除外しなくても、想定通りのデザインになる。上書きするのが分かっているなら除外させた方が個人的にはスッキリすると考えてる。)
$exclude-list:(igx-button,igx-card);

//↓テーマを使う前に、必ず宣言するもの（お約束）引数なし↓
@include igx-core();
//↓グローバルとコンポーネントテーマを設定↓
@include igx-button($app-button-theme);
@include igx-card($app-card-theme);
@include igx-theme($app-color-palette, $exclude: $exclude-list);
```

##TODO
 - 今後追加の追加
 - 実はコンポーネントテーマはCSSのようにクラス単位でスコープを設定できるので、その詳細
 

##参照
 - テーマ 
https://jp.infragistics.com/products/ignite-ui-angular/angular/components/themes/index.html

 - グローバル テーマ
https://jp.infragistics.com/products/ignite-ui-angular/angular/components/themes/global-theme.html

 - コンポーネント テーマ
https://jp.infragistics.com/products/ignite-ui-angular/angular/components/themes/component-themes.html
Coroutineって多分こういう事。

1. 指定したthreadの処理(図ではMain thread)にCoroutineの処理がわりこむ。Main threadでcoroutineの処理が始まる。
2. Coroutine内のsuspend function(データ取ってきたり、5秒delayさすとか、終わるまでcoroutineの処理を一時停止させる処理)が終わるのをまっている間、Main threadはcoroutine外の処理に戻って実行できる。
3. suspend functionが終われば、またcoroutineの処理の続きに戻る。
![UNADJUSTEDNONRAW_thumb_d85.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252245/8e660835-83c1-40eb-cb4c-a82ba5a9ee6c.jpeg)

緑の色鉛筆がMain threadの想定される処理順序です。
##ref.
[codelab 6章](https://codelabs.developers.google.com/codelabs/kotlin-android-training-coroutines-and-room/index.html?index=..%2F..android-kotlin-fundamentals#4)
[非同期処理の概念について解説](https://h5y1m141.github.io/step-up-javascript/doc/understanding_javascript/async_02.html)
[Kotlin の Coroutine を概観する](https://qiita.com/kawmra/items/ee4acb7db61f70dec9a8)
ちょっといい感じのdictと、その活用方法

Pythonの基本クラスの一つにdictがあります。
Pythonだけでなく、JavaならMap、JavaScriptならobject、Perlなら連想配列として、
大抵の言語には備わっている、キーと値を紐付けて格納する定番のコンテナ型です。

JSONとの親和性の高さから、ちょっとしたパラメタを保存するのに活用している方も少なくないのではないでしょうか？

# ちょっと不便なdict

そんなこんなで、出番の多いdictですが、

```py
params = dict(iterations=10000, threshold=0.8, foo='hoge', bar='fuga')

params['iterations']
params.get('iterations')
```

Pythonの場合、格納された値を参照するためには、`['key']`とか`.get('key')`とか記述しなければならず、
括弧とクォートの両方が必要とか割とダルいし、見た目的にも優雅さに欠ける感じがします。

もっとスッキリした構文で参照したくなりませんか？
例えば、JavaScriptのように…

# ちょっといい感じのdict

では、さっそく作ってみましょう。

```py
class Map(dict):
    __getattr__ = dict.__getitem__
```

はい、できました（早）。
今回は参照しか使わないので`__getattr__`しか定義していませんが、
必要であれば`__setattr__`や`__delattr__`も同じ様に定義してください。

Mapインスタンスの作り方は、（dictを継承しているので当然）`dict()`と同じです。
値の参照は属性名をドットでつなげて書くだけなので、使い勝手も見た目もシンプルです。

```py
params = Map(iterations=10000, threshold=0.8, foo='hoge', bar='fuga')

params.iterations
# => 10000
```

# いい感じの活用方法

では、Json形式で保存されたパラメタを読み込み、Mapインスタンスに格納してみましょう。
`json.loads()`の引数`object_hook`にdictの代わりに使用するクラスを指定します。

```py
import json
params = json.loads('{"iterations": 10000, "one": {"two": {"three": {"four": "five!"}}}}',
                    object_hook=Map)

params.iterations
# => 10000
params.one.two.three.four
# => "five!"
```

最上位のコンテナだけでなく、入れ子になったコンテナもMapオブジェクトで格納されているので、
属性名をドットでつなぐだけで、一番内側の要素まで一気に参照可能です。
もし、これがdictだったら、

```py
params['one']['two']['three']['four']
```

のように記述しなければならず、腱鞘炎は避け得ないところでした。

# （もっと）いい感じの活用方法

簡単な設定を保存するのにJson形式はシンプルで良い選択肢だと思いますが、

* コメントが書けない
* 入れ子になると読みづらい＆書きづらい
* 最後の要素の後ろにコンマを置けないので、行コピペでイラッとする
* キーをダブルクォートで囲まないといけないので、やっぱり腱鞘炎

など困ることが多いので、最近の私のオススメはToml形式です。

Toml形式から読み込んだ場合も、Mapインスタンスに格納してみましょう。
`pip install toml`で、https://pypi.org/project/toml/ をインストールします。
`toml.loads()`を使い、引数`_dict`にMapクラスを指定します。

```py
import toml
book = toml.loads('''
title="吾輩は猫である"
[publish]
date=1905
[author]
name="夏目漱石"
birth=1867
''', _dict=Map)

book.title
# => '吾輩は猫である'
book.author.name
# => '夏目漱石'
```

# （さらにもっと）いい感じの活用方法

`attrgetter()`という関数を知っていますか？
「オブジェクトから属性名で値を取り出す関数」を生成する関数です。
これを、先程のMapインスタンス`book`に適用してみます。

```py
from operator import attrgetter
extractor = attrgetter('title', 'author.name', 'publish.date')
extractor(book)
# => ('吾輩は猫である', '夏目漱石', 1905)
```

なんと[^1]、階層の違いにも関わらず、
イッパツでフラットに取得することができました！（これは便利かもしれん）

属性名ではなく添字（`['key']`）で値を取り出す`itemgetter()`という関数もありますが、
「ちょっと不便なdict」では、こうはいきませんね。

```py
from operator import itemgetter
extractor = itemgetter('title', 'author.name', 'publish.date')
extractor(book)  # => KeyError: 'author.name'
```

[^1]: `attrgetter()`のドット記法は正式に対応している機能のようです。https://docs.python.org/ja/3/library/operator.html?highlight=attrgetter#operator.attrgetter
Colab使って、画像の真偽をDNNに学習させてみるまで

# はじめに
Colaboratoryで、画像の真偽を学習してみようと思ったが、いろんなところに情報があって集めるのが大変だった。そこで、もう**完成したものをそのまま貼り付けよう**と思った。
Pythonなんとなくわかる人向けです。

ドンッ
https://colab.research.google.com/drive/1ETjxVKCA3zv391tEAY5RHM_cyipIA9D-?hl=ja

そのまま使える人はいないと思いますが、誰かの参考になれば。
**Jupyter-notebookとかPythonとか詳しくない状態で作ったので、なんか指摘も来るといいな。**

# やりたかったこと
私がやりたかったことはこれ。

- Colaboratoryを使う
- 画像の真偽を学習させたい
    - ディープラーニング
- 訓練データ（画像）はGoogleDriveにある
    - 画像は横100px縦150pxのPNGファイル
    - 画像はZIPで圧縮してあって、フォルダ構成は下記の通り
- 学習の履歴をグラフで見たいし、そのグラフやモデル情報をGoogleDriveに保存したい

### ZIPファイルフォルダ構成
- images.zip
    - 0（フォルダ）
        - 偽判定の画像
    - 1（フォルダ）
        - 真判定の画像

# やっていること
簡単にやっていることの説明を書く。Colaboratoryにアクセスして、コードを参照のこと。

### 1つ目のセル（GoogleDriveのマウント）
GoogleDriveをマウントする。見ての通り。
世の中的には、GitHub使うのが多そうですね。GoogleDriveだと、毎回認証がめんどくさい。

### 2つ目のセル（訓練データの展開）
GoogleDriveにある訓練データのZIPファイルを、ディスクに展開する。
訓練データの画像1枚1枚をGoogleDriveから読み込むこともできるが、遅い。ZIPファイルにしておいて、全部ディスクに展開した後、ディスクから読み込んだ方がはるかに速いのでこうしている。

### 3つ目のセル（訓練データの読み込み）
訓練データとテストデータ、真偽同数にしたかったので、シャッフルしつつ真偽交互に画像パスを返すジェネレータ`generate_paths`を作った。
すなわち、
偽として 0-1, 0-2, 0-3, 0-4, 0-5
真として 1-1, 1-2, 1-3, 1-4, 1-5
の10枚の画像があったとして、
0-3, 1-5, 0-1, 1-1, 0-2, 1-3, 0-4, 1-4, 0-5, 1-2
のように返す。

ジェネレータなんか使わず、普通にリストをシャッフルした方がわかりやすかったかも？

`load_data`メソッドでは、実際に画像を読み込んで配列にしている。今回扱った画像は、背景が白のものが多いので、`1 - X / 255`として、白黒反転させて0~1の浮動小数点にしている。大体が0で、時々1がある状態となる。
カラーの画像もあるので、inputのチャネル数は3で。

### 4つ目のセル（学習）
頑張って学習する。
いつ学習が終わったかわかるように、終わった時間を保存するのも忘れない。

```Python
import datetime
tz_jst = datetime.timezone(datetime.timedelta(hours=9), name="JST")
now = datetime.datetime.now(tz_jst)
str_now = now.strftime("%Y/%m/%d %H:%M:%S")
print(f"訓練が終了 {str_now}")
```

モデル全体と、そのアーキテクチャを保存しておく。

### 5つ目のセル（グラフを描画）
`%matplotlib inline`を付けて画面上に表示するとともに、GoogleDriveにも保存する。

# 結論
Colaboratory、GPUとか無料で使えてとても便利。どこでも、iPhoneからでもアクセスできていいですね。ただ、昼間とかに、GPUとTPU使えなくなることがあって悲しい。

学習結果に関しては、accuracy、0.7強…ですって。いろいろ試行錯誤してみたけど、ちょっと微妙…
訓練データがなんなのかはちょっと言えないのだけど、この結果に関しては訓練データが悪い（というか問題が悪い）と信じている。
AtCoder Beginner Contest 146 参戦記

# AtCoder Beginner Contest 146 参戦記

## [ABC146A - Can't Wait for Holiday](https://atcoder.jp/contests/abc146/tasks/abc146_a)

2分半で突破. 書くだけ.

```python
S = input()

if S == 'SUN':
    print(7)
elif S == 'MON':
    print(6)
elif S == 'TUE':
    print(5)
elif S == 'WED':
    print(4)
elif S == 'THU':
    print(3)
elif S == 'FRI':
    print(2)
elif S == 'SAT':
    print(1)
```

## [ABC146B - ROT N](https://atcoder.jp/contests/abc146/tasks/abc146_b)

4分半で突破. 書くだけ.

```python
N = int(input())
S = input()

print(''.join(chr((ord(c) - ord('A') + N) % 26 + ord('A')) for c in S))
```

## [ABC146C - Buy an Integer](https://atcoder.jp/contests/abc146/tasks/abc146_c)

16分で突破. 一目にぶたんで、最近やったなーと [ABC144E - Gluttony](https://atcoder.jp/contests/abc144/tasks/abc144_e) のソースコードをコピってきて、is_ok を書き直して、調整してポイ. 調整に手間取ったのでまだめぐる式が手についてないなあという感想.

```python
A, B, X = map(int, input().split())


def is_ok(N):
    return A * N + B * len(str(N)) <= X


ok = 0
ng = 10 ** 9 + 1
while ng - ok > 1:
    m = (ok + ng) // 2
    if is_ok(m):
        ok = m
    else:
        ng = m
print(ok)
```

## [ABC146D - Coloring Edges on Tree](https://atcoder.jp/contests/abc146/tasks/abc146_d)

敗退. 幅優先探索というアルゴリズム方針はあっていたようなのだが……. 最初に書いたのは TLE を食らい、書き直したのはデータ構造が駄目で MLE を食らったので…….

うーん、77分もあってこれが通せないのは流石に情けない感.

```python
from sys import setrecursionlimit


def genid(a, b):
    if b < a:
        a, b = b, a
    return a * 100000 + b


def paint(currentNode, usedColor, parentNode, edges, colors):
    color = 1
    for childNode in edges[currentNode]:
        if childNode == parentNode:
            continue
        if color == usedColor:
            color += 1
        colors[genid(currentNode, childNode)] = color
        paint(childNode, color, currentNode, edges, colors)
        color += 1


setrecursionlimit(100000)

N = int(input())
ab = [list(map(int, input().split())) for _ in range(N - 1)]

edges = [[] for _ in range(N)]
for a, b in ab:
    edges[a - 1].append(b - 1)
    edges[b - 1].append(a - 1)

colors = {}
paint(0, -1, -1, edges, colors)

print(max(len(e) for e in edges))
for a, b in ab:
    print(colors[genid(a - 1, b - 1)])
```
React + TypeScript + Webpackで開発環境セットアップ

# はじめに

React + TypeScript + Webpackの構成でプロジェクト構築する時の手順になります。

プロジェクトファイルは[こちら](https://github.com/hawaiiantime/react-template/tree/topic/basic_template)で公開中💁‍♂️
ブランチ:`topic/basic_template`

# インストール

まずは、必要なものを順次インストール。

```terminal
$ yarn add react react-dom
```

[Babel 7からTypeScriptのサポートが導入されています](https://devblogs.microsoft.com/typescript/typescript-and-babel-7/)が、[このあたりの情報を読む限り](https://blog.logrocket.com/choosing-between-babel-and-typescript-4ed1ad563e41/)、まだ積極的にBabelによるトランスパイルに移行しなくても良いかなと、個人的には思っています。ちなみに仕事の方でもts-loaderを使っています。

```terminal
$ yarn add -D @types/react @types/react-dom
$ yarn add -D typescript ts-loader
$ yarn add -D webpack webpack-cli webpack-dev-server
```

# 設定

TypeScriptのトランスパイルに`ts-loader`を指定します。

```webpack.config.js
module.exports = {
  mode: "development",
  entry: "./src/index.tsx",
  output: {
    filename: "bundle.js"
  },
  devServer: {
    contentBase: "./public",
    compress: true,
    hot: true,
    host: "localhost",
    port: 3000,
    publicPath: "/"
  },
  resolve: {
    extensions: [".ts", ".tsx", ".js"]
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: [{ loader: "ts-loader" }]
      }
    ]
  }
};
```

TypeScriptのコンパイラオプションは、こんな感じで。
`jsx:react`の指定を忘れずに。

```js:tsconfig.json
{
  "compilerOptions": {
    // 厳格なNullチェックを行う
    "strictNullChecks": true,
    // 未使用のローカル変数を許可しない
    "noUnusedLocals": true,
    // 暗黙的なany型のthis使用を許可しない
    "noImplicitThis": true,
    // strictモードでパースし、出力ファイルに"use strict"を付与
    "alwaysStrict": true,
    // 対応する.mapファイルを生成
    "sourceMap": true,
    // 暗黙的なany型を許可しない
    "noImplicitAny": true,
    // コンパイルに含めるライブラリを列挙
    "lib": ["dom", "es2017"],
    // 生成されるモジュール形式
    "module": "es2015",
    // トランスパイル後の対象ECMAScriptバージョン
    "target": "es5",
    // .tsxファイルのJSXをサポートする際の方式
    "jsx": "react",
    // default export無しでのdefault importを許可
    "allowSyntheticDefaultImports": true
  }
}
```

# コード準備

JSを読み込んで表示するhtmlを用意。

```html:public/index.html
<!DOCTYPE html>
<html>
  <head>
    <title>React Demo</title>
  </head>
  <body>
    <div id="app"></div>
    <script src="bundle.js"></script>
  </body>
</html>
```

とりあえず`div`エレメントを表示。

```react:src/index.tsx
import React from "react";
import ReactDOM from "react-dom";

const App = () => <div>app</div>;

ReactDOM.render(App(), document.getElementById("app"));
```

# 起動

`yarn start`でアプリが立ち上がる事を確認。

```package.json
{
  "name": "demo",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "build": "webpack",
    "start": "webpack-dev-server"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "react": "^16.11.0",
    "react-dom": "^16.11.0"
  },
  "devDependencies": {
    "@types/react": "^16.9.11",
    "@types/react-dom": "^16.9.4",
    "ts-loader": "^6.2.1",
    "typescript": "^3.7.2",
    "webpack": "^4.41.2",
    "webpack-cli": "^3.3.10",
    "webpack-dev-server": "^3.9.0"
  }
}
```

# まとめ

以上、React + TypeScript + Webpackの構成で、プロジェクト開始する際の流れでした。👷🏻‍♂️

# 参考

・[React & Webpack](https://www.typescriptlang.org/docs/handbook/react-&-webpack.html)