OmniAICreator/Qiita-1.07M huggingface dataset:
abc115-Dを解いた再帰関数の解き方

## 問題

https://atcoder.jp/contests/abc115/tasks/abc115_d

二度目の挑戦。解けて本当に嬉しかった。
この手の問題は他の競プロ系サイトでも出題しているので意外と大事。


## 方向性
問題文から再帰関数を用いるであろうことは想像難くない。問題はシュミレーターを作ると全てのバーガーの要素が膨大になってしまうので無理。必要な分だけ考えて算術で効率的にとく。

## 何が難しいか
問題の解釈は問題ない。問題は再帰をするための条件と戻り値を正しく決定できるかである。また、条件分岐が多いことも難易度をあげている。

## 解法
再帰問題のコツは状態位相を少ない値でモデリングすることだと感じた。つまり大事なことは以下の二つ
1. 再帰的に関数を呼び出すので、N,N-1,N-2...1,2の全てに成り立つ関数を作成すること。
2. 終了条件を考えること。

1. 再帰的に関数を呼び出すので、N,N-1,N-2...1,2の全てに成り立つ関数を作成すること。

今回の問題で必要となるのはダックスフンドの現在地と何次元のバーガーを参照しているかであるためその２つを引数にとる

2. 終了条件を考えること。

今回レベル０バーガーというわかりやすい終了条件があるのでこれを使う。


## コード

以下コード。僕の解き方だと無駄に三つ引数を使っているので改善の余地あり。
```python
N, X = map(int, input().split())
patty = [1]
buns = [0]

for i in range(0, N):
    patty.append(patty[i] * 2 + 1)
    buns.append(buns[i] * 2 + 2)

print(patty)
print(buns)

burger_high = patty[N] + buns[N]
print("burger : ", burger_high)
print("burger/2 : ", burger_high/2)


def dfs(now_runrun, now_burger_high, dimension):
    if dimension == 0:
        return 1
    ## るんるんが一番下にいれば一つもパティは食べれない
    elif now_runrun == 1:
        return 0

    ## るんるんが真ん中にいたら、n - 1次元バーガー + 1を食べる
    elif now_runrun == now_burger_high // 2 + 1:
        return patty[dimension - 1] + 1

    ## るんるんが一番上にいたら全てのパティを食べる
    elif now_runrun == now_burger_high:
        return patty[dimension]


    next_burger = now_burger_high // 2 - 1
    next_dimension = dimension - 1

    if now_runrun <= now_burger_high // 2:
        return dfs(now_runrun - 1, next_burger, next_dimension)
    else:
        return dfs(now_runrun - (patty[next_dimension] + buns[next_dimension] + 2),
                   next_burger, next_dimension) + patty[next_dimension] + 1


print(dfs(X, burger_high, N))
```
xRay + Jira で次世代のテスト管理 その1

xRayとはJiraのプラグインです

https://marketplace.atlassian.com/apps/1211769/xray-test-management-for-jira?hosting=cloud&tab=overview

2020年2月現在、最強のテスト管理ツールと思われる qaTestとかHP Quality Centerに匹敵するかと思われます。とはいえ、かかる費用は Jira + xRayの価格のみ。10アカウントまでならば、月額20ドル/10名

## 出来ること(jira+xRay)

* 要件・不具合が管理出来る(Jiraの基本機能)
* 要件・不具合に紐付いたテスト設計が作成出来る
* テスト設計チケットにテスト手順を紐付けられる
* テスト設計チケットの実行チケットが作成出来る
* 実行チケットに紐付いた不具合チケットが作成出来る
* テスト設計を再利用できる→ 派生開発・拡張開発でのリグレッションテストを管理出来る

## マニュアル

https://confluence.xpand-it.com/display/XRAYCLOUD/Xray+Cloud+Documentation+Home
Node.jsの関数をBashでパイプぽく使えるコマンド

Node.jsの関数をBashで使おうと思うことがあるのでしょうか……？
私は今まではありませんでした。

@takuya_1stさんの[nodeの関数をbashシェルで使えるようにする。](https://qiita.com/takuya_1st/items/11b9b79d16ccbb3aed40)という記事が面白かったのでコマンドを作ってみました。

<a href="https://github.com/amanoese/nodep"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/amanoese/nodep.png" width="460px"></a> 

下記コマンドでインストールできます。

```bash
$ npm i -g @amanoese/nodep
```


## 使い方

例えば、下記のようにしてQueryStringを無駄にEncode,Decodeした後にJSONに変換することができます。

```bash
$ echo -n 'a=b' | nodep encodeURIComponent @ decodeURIComponent @ "require('querystring').parse" @ JSON.stringify
{"a":"b"}
```

Node関数同士の接続は bash の "|" ではなく "@"　になります。

また、[元の記事](https://qiita.com/takuya_1st/items/11b9b79d16ccbb3aed40)の方ではNode.jsの関数を実際にコマンドとして利用できるようにしていましたが、
コマンドが増えて煩雑になりそうかつ登録で名前の衝突とかしそうと感じたので、１つのコマンド内で処理が完結するようにできるようにしています。

## 少し実用的な使い方？
下記のように使えばjqでは処理できない？JSONぽいJavaScriptオブジェクトを処理するとき役に立つかもしれません。

```bash
$ echo -n '{a:1}' | sed 's/^/x=/' | nodep eval @ JSON.stringify | jq .
{
  "a": 1
}
```

## 感想

Node.jsの関数がつかえるとたのしいですね。


## 余談

パイプライン演算子の実装がきたら下記のようなコマンドにしてJavaScriptぽくしたほうが面白いかもしれません。

```bash
$ echo -n 'a=b' | nodep '$stdin |> encodeURIComponent |> decodeURIComponent |> require("querystring").parse |> JSON.stringify'
```

あと、npmでインストールできますが、このコマンドはShellScriptでできています。
wanderlust でファイルを添付するとき base64 決め打ちにする

今となっては Emacs でメールを wanderlust で読み書きしている人は少ないのかもしれませんが、個人的な忘備録．

wanderlust でファイルを添付するとき、C-c C-x TAB のあと、ファイルを指定したあとにも、色々聞かれますが最近は base64 でいいと思いますので決め打ちにします．そのために、~/.emacs.d/elpa/semi-20190708.1302/mime-edit.el を開いて、
M-x goto-line で、1565 を入力して飛びます．そこから以下のように5行をコメントにし、その下に、(setq encoding "base64") を書き入れます．つまり、

;;;    (setq verbose (or (interactive-p) verbose))
;;;    (if verbose
;;;	(setq type (mime-prompt-for-type type)
;;;	      subtype (mime-prompt-for-subtype type subtype)
;;;	      encoding (mime-prompt-for-encoding encoding)) )
    (setq encoding "base64") 

このようにして、保存します．その後、dired mode で mime-edit.el をバイトコンパイルすればOKです．なお、元々の mime-edit.el をリネームしておくことをお勧めします．そして、無保証です．

これで、メールにファイルを添付するとき、ファイル選択するだけで添付が完了します．
(Xserver)サブドメインでMagentoを使う

開発用のサーバーとドメインを用意し、それを使っていくつかのサービスの開発をしようとしたが、サービスを分けるときに
example.com/mg
のようなサブディレクトリではなくて、
mg.example.com
といったサブドメインで分けようと思ったのがきっかけ。

# 環境
Xserver 10x （ドメインはxdomeinにて取得）
php 7.2.27
SQL 5.7.x
magento 2.3.4

# Xserver上でサブドメインの登録
サブドメインの登録については、情報がいくらでものっているので割愛。
サブドメインを登録すると、
/(利用ドメイン)/public_html
にサブドメイン名（mg.example.comだったらmg）のディレクトリが作られる。

なのでざっくり、
1. magentoをダウンロード
2. Xserverにアップロード
3. 元々あったmgを適当な名前に変える
4. 解凍したディレクトリの名前をmgに変える(その他権限の変更など)
といった手順で進める。

# magentoをダウンロード
[公式サイト](https://magento.com/tech-resources/download)からダウンロード。
Xserverでcomposerを使うとちょっと面倒らしいので、今回は手動でアップロードする。

サンプル付きとそうでないのがあるが、そこはお好みで。今回はサンプル付きのzipを選択した。

# Xserverにアップロード
[Xserverの公式マニュアル](https://www.xserver.ne.jp/manual/man_install_magento.php)には、新規ディレクトリをサーバー上で作って、その中に回答したファイルを全部移せと書いてあったが、流石に時間がかかりそうなのでzipファイルをアップロードし、サーバー上で解凍する。

コマンドでターミナル上でアップロードすればよかったが、FPT接続して
/(ドメイン)/public_html
にアップロード。

そしてSSH接続したのち

```
$ cd $HOME/(ドメイン)/public_html
```
でディレクトリを移動し、

```
$ unzip (圧縮ファイル名).zip
```
で解凍。

# 元々あったmgを適当な名前に変える
サブドメインを作った際に自動生成される、サブドメイン名と同じディレクトリの名前を変える。
何かあったとき戻せるように名前を変えるだけにしたけれども、正直削除でも問題ないと思う。

# 解凍したディレクトリの名前をmgに変える(その他権限の変更など)

先ほど解凍したディレクトリ名を、サブドメイン名に変える。
そして、それの権限を

```
$ chmod 711 (ディレクトリ名)
```

に変更して、めでたく完了。

# まとめ
最後の権限を変えることを忘れると、永遠と403になって疲れます。
magentoの日本語の記事が中々ない上に、自分が求めてたものが見つからなかったので書きました。
Docker, Docker-compose 良く使うコマンド

#docker, Docker-compose 良く使うコマンド
Dockerを使う際に良くコマンドを忘れてしまうので、
自分用の忘備録です。

#Docker-compose build

```
docker-compose build
```

imageを作成・Pullするコマンド、


#docker-compose run
```
docker-compose run (サービス名) （コマンド）
example: docker-compose run --rm app bash 
```
コンテナを起動して、コマンドを実行することができる。
-rm を追加することによって、コマンドを実行した後に、
コンテナを削除します。

docker-compose　up する前などに、一時的にコンテナ内に入り
コマンドを実行したい時などに便利です。

#docker-compose exec
```
docker-compose exec (サービス名) (コマンド名)
example: docker-compose exec app bash
```

これは、稼働中のコンテナに入りコマンドを実行するための物です。


#docker-compose run
```
docker-compose up
```
このコマンドを実行すると、
docker-compose.ymlで記述した通りにコンテナを作成し、
コンテナ同士を繋げて起動をします。

-d をオプションとしてつけることで、バックグラウンドでコンテナを起動します。
自作パッケージで自作パッケージを使用したい【UnityPackageManager】

# package.jsonのdependenciesに自作パッケージは適用できない

まず前提条件として、自作パッケージをパッケージするにあたって必要となる`package.json`だが、このjson内のdependenciesではなぜか、自作パッケージのgitリポジトリURLで依存関係を適用することができない。（Unity起動時に依存解決する際にエラーが発生する）したがって、自作パッケージで自作パッケージを適用したい場合は、別の方法を取る必要がある。

# 適用方法
### 1. AssemblyDefineに適用するパッケージのguid参照を登録する

パッケージするにあたって、プロジェクトにAssemblyDefineファイルを配置する必要があるが、自作パッケージ通しで別のAssemblyDefineを使用するため、片方が依存関係を持つ場合、もう片方のguidの参照を登録する必要がある。

<img width="460" alt="Screen Shot 2020-02-06 at 21.56.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132627/2c2b45cf-9f3c-4ad1-7d11-3e394c9a4a06.png">

### 2. 自作パッケージを使用する先のPackage/manifest.jsonで依存関係のあるパッケージもdependenciesに登録する

例えば、`unity-master-data`という自作パッケージで`unity-excel`という自作パッケージを使用していて、別のプロジェクトで`unity-master-data`を使用したい場合、Package/manifest.jsonに両方を追加する必要がある。

```
{
  "dependencies": {
    "com.tani-shi.unity-excel": "https://github.com/tani-shi/unity-excel.git#1.0.0",
    "com.tani-shi.unity-master-data": "https://github.com/tani-shi/unity-master-data.git#1.0.0",
    ...
    }
}
```
GIFアニメーションを作るだけの記事

記事をご覧になってくださりありがとうございます！

どうも初めまして。2年間ぐらい組込み開発に携わっていましたが
転職後、環境的要因で精神崩壊→奇跡的に回復した、りゅうです。🐉

#ほんだい
この記事は、**複数のpng画像を昇順または降順に並べ替え一枚のgif画像を生成するプログラム**について載せている記事です。

#ソースコード
```python:gifmake.py
# -*- coding: utf-8 -*-
import sys
from PIL import Image
import glob

args = sys.argv

#Ascending (昇順)/Descending(降順)
if args[2] == 'A':
	value = False
elif args[2] == 'D':
	value = True
else:
	print('Enter A or D for the second argument!')
 
files = sorted(glob.glob('./*.png'),reverse=value)
images = list(map(lambda file: Image.open(file), files))

images[0].save(args[1]+'.gif', save_all=True, append_images=images[1:], duration=400, loop=0)
```
#実行例
コマンドラインに下記のように入力するとgif画像が生成されます。

```
(base) C:\Users\UserName\Desktop>pyhton gifmake.py [生成するgif画像名(拡張子なし)]　[A/D(昇順/降順を指定する)]
```

##降順
![true.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/ea1ad800-7e53-6247-a0de-3b5e1854ef88.gif)
##昇順
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/1b892f1a-2dd8-2240-4cbc-20438347a033.gif)

#ソースコードのポイント
sorted()のreverseパラメータがTrueだと降順に、引数なしおよびFalseだと昇順にgif画像が生成できます。
最後の行のパラメータduration値を変更することで、gifアニメーション間隔を変更できます。

#使った画像
いらすとや様

#最後に
自分自身、組み込み系と同時にWEB系も行いたいので、
今後は、それに関する情報も発信すると思います。
よろしくお願いします✌
時刻の floor 関数（Python）

こんにちは。
時刻に対する floor 関数を作ってみました（```dt_floor()```）。計算単位として、下記例では 1 時間を整数で除算した値の 15 分を使っています。

```python
interval = 900  # in seconds
dt = datetime.datetime.strptime("2020-01-01 00:05:05+09:00", '%Y-%m-%d %H:%M:%S%z')
print(dt_floor(dt, interval))  # => "2020-01-01 00:00:00+09:00"
```

```python
import datetime

MINUTE = 60  # in seconds
HOUR = 3600  # in seconds
ndiv = 4  # in [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60]
interval = HOUR//ndiv  # in seconds

def dt_floor(dt, interval):
    interval_m = interval//MINUTE  # in minutes
    minute_floor = (dt.minute//interval_m)*interval_m
    return dt.replace(minute=minute_floor, second=0)
```
（データベース）DDLとDML

データを定義するDDLの命令とデータを操作するDMLの命令をまとめてみました。

# DDL（Data Definition Language)
| 命令     |       機能　　　　　　 |
|:-----------------|------------------:|
| CREATE           |データベースやテーブルの作成|
| ALTER            |データベースやテーブルの更新|
| DROP             |データベースやテーブルの削除|

#DML(Data Manipulation Language)
| 命令     |       機能　　　　　　 |
|:-----------------|------------------:|
| INSERT          |データの登録|
| UPDATE          |データの更新|
| DELETE         |データの削除|
|SELECT          |データの検索|
Donkey Car ベース車両 HSP94186 のステアリング切れ角アップ手術

#はじめに
Donkey Car のキットを買うと、ベース車両としてHSP94186というラジコン本体がついてきます。

これのステアリング切れ角が異様に小さい。

狭い日本では扱いにくいので、もっと切れるようにしたい。

#ステアリングリミッター
実車でもラジコンでも、ステアリングの切りすぎでリンケージやサスペンションなどの機構に負荷がかかることを防ぐため、物理的なステアリングリミッターが入っていることが多いです。

HSP94186も、どこかにステアリングリミッターが入っているような動きをします。

軽く分解してみたところ、下図赤矢印の突起がステアリングリミッターの役割をしているようです。

![st01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/46f379f0-ef40-a4d6-db43-6bb3afb7522a.jpeg)

外すとこんな感じの部品です

![st02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/eedae663-d621-b78b-9d0c-343286c3f57b.jpeg)

#改造

突起を削ろうかと思いましたが、**裏返しにするだけ**で良さそうです。

ちょうどいいところに穴があるので、他の場所を分解しなくても、**ネジ2本だけ**で裏返す改造ができます。

![st03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/b3cd3705-1752-d450-eab5-78ffcffc0b88.jpeg)

奥まったところの部品のネジ止めで作業しにくいですが、片方に棒を突っ込んで仮固定して、反対側のネジ止めをするとちょっとラクにネジ止めできます。

#結果

この部品を裏返したところ、ちょっとだけ切れ角が増しました。

改造後
![st04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/fd3700bc-2f8a-8b72-be9c-afa3e8bc9ab2.jpeg)

---
改造前
![st05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/6739361a-29cf-e3fd-1fda-da5f51788e0b.jpeg)

写真だと伝わりにくい・・・

簡易的に最小回転半径を計ってみたところ、約85cmが約55cmになりました。

```myconfig.py``` の ```STEERING_RIGHT_PWM``` と ```STEERING_LEFT_PWM``` の変更を忘れずに行ってください。

ギリギリの設定値にすると物理的に負荷がかかるので、ちょっと控えめの値にした方がいいかもしれません。（サーボセイバーが柔らかめなのであまり気にしなくてもいいかも）
【Flutter】テキスト内にアイコンを簡単に埋め込む方法

# 概要
一般的に、テキスト内にアイコンを埋め込もうとすると以下のような書き方になります。
![temp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298844/f45b1767-2eed-5313-6c8a-f45064d6dcfa.png)

```dart
RichText(
  text: TextSpan(
      style: Theme.of(context).textTheme.body1,
         children: [
            TextSpan(text: 'ほげほげ'),
            WidgetSpan(
                child: Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 2.0),
                    child: Icon(Icons.audiotrack),
                ),
            ),
            TextSpan(text: 'ふがふが'),
          ],
       ),
   )
)
```

しかし、```styled_text```ライブラリを使うことでもっと簡単に書くことが出来ます！

# 手順
## 1. pubspec.yamlに```styled_text```を追加
```yaml
dependencies:
    styled_text:     #ここに追加する
```
## 2. 使いたいところにタグを定義

タグの書式は以下のとおりです。

```dart
<tag_name/>    //タグの後ろの"/"を忘れない！
```
以下の通りに追加します。

```dart
StyledText(
    textAlign: TextAlign.center,
    text: "ほげほげ <note/> ふがふが",  //テキストの中に入れる！ 隙間がなくなるので、タグの両端にスペースを入れたほうが良い
    styles: {
       'note': IconStyle(Icons.audiotrack)
    }
)
```

## 3. タグに対応したアイコンを定義
タグに対応したアイコンを```styles:```で定義します。

```dart
'tag_name': IconStyle(iconData)
```

実際に導入すると以下のようになります。

```dart

StyledText(
    textAlign: TextAlign.center,
    text: "ほげほげ <note/> ふがふが",
    styles: {
       'note': IconStyle(Icons.audiotrack) //対応するタグを定義
    }
)
```
## 4. 完成！
同じようにできました！！
![temp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298844/1aa5633b-8e03-86cd-f46b-dec73f997ad7.png)


# 最後に
このパッケージは、アイコンを埋め込む他にも一部だけテキストのスタイルを変更するときにも使えます！(というかそっちがメイン？）
記述量も減るので、こちらを採用してみるのもいいかもしれません。

なんか、すごい煩雑な書き方をしないといけないと感じていたので、簡単に行う方法があってよかったです。
今現在(2020/02/06 Channel master, v1.14.7-pre.91, on Microsoft Windows [Version 10.0.18362.592], locale ja-JP)、Flutter for webで`TextSpan, WidgetSpan`がバグって使えない状態なので、こちらの方法を使うと良いかもしれません。

## 参考文献
styled_text | Flutter Package
https://pub.dev/packages/styled_text

Flutter: how to add icon to text? - stackoverflow
 https://stackoverflow.com/questions/57897786/flutter-how-to-add-icon-to-text
PyRAFインストール

# はじめに
IRAFおよびPyRAFをインストールした記録です。
IRAFとPyRAFを一緒にインストールしようとしたら失敗したので、最終的に別々にインストールしました…
誰かの役に立てば幸いです。

環境
MAC　OS10.13
miniconda

# IRAFのインストール
ここに書いてる通りにする。
http://research.iac.es/sieinvens/siepedia/pmwiki.php?n=HOWTOs.IrafMacOSX

# PyRAFのインストール
```
conda create -n iraf27 python=2.7 pyraf-all stsci
```
これをしてから、

```
export iraf="/opt/iraf/iraf/"
```
これでどこからでもpyrafとターミナルに入力すればPyRAFが起動します。
SteamVR2.0環境でHMDのコントローラを用いた移動・回転の実装

#SteamVR2.0 でのコントローラを用いた移動・回転方法
後輩たちへのメモ程度にSteamVR2.0 での移動・回転方法を記述

1.下記のスクリプトを`[CameraRig]`にアタッチ
2.InspectorのVR_cameraに`[CameraRig]`の子オブジェクト`Camera`を設定
3.ActionManifestで設定した項目を各`SerializeField`に設定
※ここではActionManifestの説明を省くので，詳しくはググってください
気が向けば追記するかも

Unityで実行すると，左手で移動，右手で回転ができる
移動・回転スピードは値を変更してください


```cs:VR_Move.cs
using UnityEngine;
using Valve.VR;

public class VR_Move : MonoBehaviour
{
    [SerializeField] SteamVR_Input_Sources HandRight;
    [SerializeField] SteamVR_Input_Sources HandLeft;
    [SerializeField] SteamVR_Action_Boolean up;
    [SerializeField] SteamVR_Action_Boolean down;
    [SerializeField] SteamVR_Action_Boolean right;
    [SerializeField] SteamVR_Action_Boolean left;
    
    [SerializeField] private float speed = 6.0f;
    [SerializeField] private int Rotspeed = 2;
    
    [SerializeField] private Camera VR_camera;

    private float First_axis_Y = 0;

    void Start ()
    {
        //Y軸の初期値を取得
        First_axis_Y = transform.localPosition.y;
    }

    
    void Update ()
    {
        //左手トラックパッドで移動
        if (up.GetState(HandLeft) == true)
        {
            transform.localPosition += VR_camera.transform.forward * speed * Time.deltaTime;
        }

        if (down.GetState(HandLeft) == true)
        {
            transform.localPosition -= VR_camera.transform.forward * speed * Time.deltaTime;
        }

        if (right.GetState(HandLeft) == true)
        {
            transform.localPosition += VR_camera.transform.right * speed * Time.deltaTime;
        }

        if (left.GetState(HandLeft) == true)
        {
            transform.localPosition -= VR_camera.transform.right * speed * Time.deltaTime;
        }

        //Y軸を初期位置に固定．空中に浮きたいor重力概念を追加する場合は以下をコメントアウトする．
        transform.localPosition = new Vector3(transform.localPosition.x, First_axis_Y, transform.localPosition.z);
        
        //右手トラックパッドで回転
        if (right.GetState(HandRight) == true)
        {
            transform.Rotate(0, Rotspeed, 0);
        }

        if (left.GetState(HandRight) == true)
        {
            transform.Rotate(0, -Rotspeed, 0);
        }

    }
    
}
```
PlatformIO IDE + STM32 Nucleo で Arduino コードのデバッグをする

昨年の ET2019 の STMicro ブースでもらった STM32 Nucleo、開発環境のインストールめんどいなと放置していたら、PlatformIO から使えるんですね。。しかも Arduino でも mbed でも書けるし、デバッガもそのままで使えるしで、とても快適。

使った（もらった）ボードはNucleo F401REです。OS は macOS です。

## プロジェクトのビルド

PIO Home で New Project の作成をします

- Name: てきとう
- Board: ST Nucleo F401RE (手持ちのボードに合わせてください）
- Framework: Arduino (mbed とかも選択可能)

![スクリーンショット 2020-02-06 19.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9549/3ec5c741-146c-49b6-617b-f602af896317.png)

コードは適当に L チカなものを用意しました。

```cpp:src/main.cpp
#include <Arduino.h>

unsigned int counter = 0;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  delay(100);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);

  counter++;
}
```

てっきり Nucleo = mbed で書かないとと思い込んでいたけど、Arduino なコードも動くんですね。

初回のビルドではコンパイラやらライブラリやらのダウンロードで数分かかるようです。

## デバッガ

で、ここからが本番。
F401RE には STLink というデバッガが付属しているので、そのままでステップ実行とかできるんですね。

まず、platform.ini に `debug_tool = stlink` を追記します:

```ini
[env:nucleo_f401re]
platform = ststm32
board = nucleo_f401re
framework = arduino
debug_tool = stlink
```

そして先ほどのコードにブレークポイントを設定します（行番号をクリック）：
![スクリーンショット 2020-02-06 20.10.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9549/e7e41e0a-a432-caeb-3657-48840dab5092.png)
この状態で デバッグ > デバッグの開始（もしくは F5）をすると、
![スクリーンショット 2020-02-06 20.15.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9549/c8f138a4-18c1-27d1-ff4b-272f98fe6687.png)
なにやら見慣れないところで止まりました。とりあえずデバッグコンソールで c (continue) を入力してみましょう。
![スクリーンショット 2020-02-06 20.18.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9549/d68b14c4-b404-b064-6804-1add0887f13a.png)
先ほどのブレークポイントで止まりました。やったね！

あとはステップインするなり、変数の値を見るなり、いつもの gdb のように使えます。

JTAG ICE を接続してデバッガをインストールして設定してー、と面倒な作業をせずとも、ふつーのプログラムのようにマウスぽちぽちでデバッグできて大変便利ですね。
2/6 授業ノート

めっさ量が多い。
#復習
・h1 – h6：見出し
・p：段落、文章、画像等
・br：改行
・img：画像表示
・a：リンク要素
・ul：箇条書きリスト（順番無し）
```<ul><li></li></ul>```
・ol：箇条書きリスト（順番あり）
```<ol><li></li></ol>```
・dl：説明（説明）リスト
```<dl><dt></dt><dd></dd></dl>```

#テストに出る！範囲
・```<!DOCTYPE html>```の事を**DTD(Document Type Definition)**と呼ぶ
　→文書のバージョン情報を記述
・head要素→ページ全体の情報(文字コードやキーワードなどの補足情報、検索エンジン向けの情報など)を記述。ブラウザに表示されない
・body要素→ページの中身を記述。ブラウザに表示される

#今日習ったこと(教科書P46～48、P56～)
**リンクの設定(教科書P46～48)**
・リンクには3種類ある
　①同一ページ内の別の場所(ページ内リンク)
　②同一サイト内の別ページ(内部リンク)
　③別のサーバにある外部Webページ(外部リンク)

　①同一ページ内の別の場所(ページ内リンク)について
　→ページ内リンクはid属性(要素に固有の識別名を指定する属性)を使って設定する
　ex:)```<section id=”aaa”></section>…<a href=”#aaa”>```
　　 →1. section要素にid属性を使って固有の識別名”aaa”を与える
　　 →2. a要素のhref属性に「#+リンク先id」を記述
　②同一サイト内の別ページ(内部リンク)について
　→href属性内に目的ファイルまでのパスを記述する
　ex:)```<a href=”../profile.html”>aaa</a>```
 　　 →同じタブ内でリンク先ファイルを開く
　③別のサーバにある外部Webページ(外部リンク)
　ex:)```<a href=”http://www.yahoo.co.jp ”target=”_brank”>yahoo!トップページへ</a>```
 　　 →新規ウィンドウ/タブでリンク先ファイルを開く(target=”_brank”)

**CSSの概要(教科書P56～)**
・CSS(Cascading Style Sheets)：HTML文書に装飾・レイアウトを施すための言語のこと
　☆cascading:「小さな滝」という意味が転じて「継承する」というニュアンスで使われている
・CSSでできること
　文字組みの成形(文字サイズ、文字スタイル、行間、字下げ、行揃えなど)
　色の変更(前景色、背景色)
　レイアウトの調整(ボックスサイズ、余白、段組みなど)
　要素の装飾(影、角丸、。グラデーション、背景画像の貼り付けなど)
　要素の変形(拡大縮小、回転、傾斜、反転など)
　アニメーション効果(トランジション効果、キーフレームアニメーション)
特定の条件によって適用するスタイルを変更する機能(メディアクエリ)

・CSSをHTMLに組み込む方法
　→インライン、内部参照、外部参照の3種類のやり方が存在する。基本は外部参照
　①インライン：HTML文書内に直接記述する方法
　　ex:)```<h1 style=”color: red;>aaa</h1>```
→h1タグ内の文字列aaaの文字色だけredにする
　②内部参照：HTML文書のhead要素内にstyle要素を設定して記述する方法
　　ex:)```<head><style>h1{color: red;}</style></head>```
→h1タグ内の文字列aaaの文字色だけredにする
　③外部参照：CSSを外部ファイル化して参照する方法。link要素で呼び出すのが一般的
　　ex:)```<head><link href=”外部CSSファイルへのパス” rel=”stylesheet” media=”all”></head>```
→外部CSSファイルの記述をHTML文書に反映させる
　☆CSSを外部ファイル化すると複数ページ間でスタイルを使いまわせる＝デザインに修正が入った場合は外部ファイルを修正すれば全てのページに反映されるなど管理がしやすいため、基本的には③のやり方で記述する。

・CSSの基本書式
　→「**セレクタ{プロパティ:値;}**」という流れで書く。
　ex:)h1{color: #ff0000;}
　　☆h1部分→セレクタ、color部分→プロパティ、#ff0000部分→値と呼ぶ
　
・CSSで使う単位(教科書P98)
　→相対単位と絶対単位の2種類がある。主に相対単位を使用する
　　相対単位：px,%,em,ex,rem,vw,vhなど
　　絶対単位：pt,pc,mm,cm,inなど
・使ったコード
background-image: url(img/header.jpg);　：背景画像を配置
background-position: right top;　：背景の位置を調整(右&上寄せ)
background-repeat: no-repeat;　：背景画像を繰り返さない
background-color: #900;　：背景の色を指定
color: #fff;　：文字の色を指定
	height: 150 px;　：ボックスの高さを指定(レイアウトが崩れる危険があるのであまり使わない)


#感想
今日めちゃくちゃ情報量が多い…。
色の話などもあったけど、その辺は土曜日あたりにまとめ直す。
体系的に学んでこなかったので、点と点が線で結ばれていく感覚。
覚えなきゃだ…果てしない……。
初心者によるプログラミング学習ログ 231日目

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

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

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

231日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>231日目<br>・udemyで、css+javascript講座<br>・webサイト部分的模写<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1225149032932073472?ref_src=twsrc%5Etfw">February 5, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
VS Code で ESLint × Prettier のベストかも知れないプラクティス

::: note alert
この記事は2020年6月時点での知見に基づく内容で、既に参考にするには古すぎる情報です。
2025年1月時点での知見に基づき新しい記事を作成しました。詳細は以下の記事をご覧ください。
:::
https://qiita.com/iShinkai/items/4657ae12cfc074dd8700

---

**2020/06/20 修正**
[前提](#前提) の部分について、VS Code のバージョンアップに伴い当てはまらない記述が出て来ましたので、一部
内容を修正しました。

## 前書き

餅は餅屋と言う事で、コードフォーマットは `Prettier` に任せ、`ESLint` には静的解析だけを担当させると言う棲み分けが昨今の風潮ではないかと思います。
しかし VS Code には拡張機能でも `ESLint` や `Prettier` が用意されており、`npm` 等でインストールされるそれらとの関連がややこしい。
と言うわけで、 **「いろいろ突き詰めればいろいろあるけどとりあえずこれで良くね？」** と言うやり方をご紹介します。

チーム・組織や案件によってニーズやルールは異なるのは当然ですが、ごくごくシンプルに決まったルールでフォーマットと lint をやってくれればそれでいいんだ。と言う人向けです。

## 前提

前提として、VS Code に

- [ESLint 拡張](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
- [Prettier 拡張](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)

がインストール済みで、保存時に自動フォーマットが掛かるよう設定済みであることが条件です。
（`editor.formatOnSave` よりも `editor.codeActionsOnSave` の方が推奨されるそうです）

```json:.vscode/settings.json
{
  // (省略),
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  }
}
```

もちろん、`npm / yarn` で `eslint`、`prettier` もインストールされている必要があります。

```bash
npm install -D eslint prettier
# もしくは
yarn add -D eslint prettier
```

## 設定

最終的には以下の措置だけで良いです。

まず、ESLint と Prettier の競合をよしなに取り計らってくれる設定をインストールします。

```bash
npm install -D eslint-config-prettier
# もしくは
yarn add -D eslint-config-prettier
```

それを ESLint が参照できるよう設定。

```javascript:.eslintrc.js
module.exports = {
  env: {
    es6: true,
  },
  extends: [
    // 省略,
    "prettier",
  ],
};
```

`extends` の最後に `prettier` を追加するようにしてください。
最初とか途中ではダメです。

あとは必要に応じて `.prettierrc` で任意のフォーマット設定を指定すれば良いです。
特段の理由がなければデフォルトで良いと思いますが、`"singleQuote": true` くらいはしておきたいかもですね。

これで簡単快適に素敵なコーディングライフが送れます！


## 参考

[VSCode でファイル保存時に Prettier と ESLint でフォーマットをかけても、1 回でフォーマットしきらないときの対処法](http://pvcresin.hatenablog.com/entry/2019/09/15/VSCode_%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BF%9D%E5%AD%98%E6%99%82%E3%81%AB_Prettier_%E3%81%A8_ESLint_%E3%81%A7%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%82%92%E3%81%8B)
[Prettier 入門 ～ ESLint との違いを理解して併用する～](https://qiita.com/soarflat/items/06377f3b96964964a65d)
[続・VSCode 上で vue ファイルに対して ESLint と Prettier が快適に動作する設定](https://qiita.com/fukasawah/items/03fa205353ac03b06b7e)
[vscode-eslint v2](https://qiita.com/mysticatea/items/3f306470e8262e50bb70)
アダルトサイトでも利用OKのHPテンプレート（html）など

超初心者向けにとりあえずHPなど作って公開してみたい人向け。
お金をかけずに自分の力だけではじめられます。

### HTMLエディターソフト
[Homepage Manager](https://www.vector.co.jp/soft/win95/net/se077898.html)
定番なHP作成フリーソフトです。

### HPテンプレート
[ネットマニア](http://www.netmania.jp/)
[てんぷれの天ぷら](http://www.spstore.com/)
[Template Party](https://template-party.com/db_template/?act=list&kind=1&info9=night&html=list_night.html)
アダルト商用利用可のテンプレートです。


### FTP
[FFFTP](http://www2.biglobe.ne.jp/~sota/ffftp.html)
作成したサイトをアップロードする際に使う定番なフリーソフトです。

- [Template Partyを利用した参考HP](http://shaktiyoni.x.fc2.com/)
JSONの基礎の基礎


JSONは、Java Script Object Notationのこと。テキストベースのデータフォーマット。

JavaScriptのオブジェクトとほぼ同じ形式であり、例えば下記のJavaScriptオブジェクト。

```javascript

var schoolOne = {

  hensachi: 60,
  students: 260,
  name: "ichi-koukou"

}

```

これを、JSONにすると

```javascript


{"hensachi": 60, "students": 260, "name": "ichi-koukou"}

```

こんな感じになります。簡潔に短くなりました。


JavaScriptのオブジェクトをJSONに変換する方法はこちら。

```javascript

JSON.stringify(schoolOne);

```

これで、JSONに変換されました。

逆に、JSONをJavaScriptオブジェクトに変換する場合は

```javascript

//まずJSONに変換したものを変数に入れる

var jsonSchoolOne = JSON.stringify(schoolOne);

//これで変数にはschoolOneのJSON版が入っている

//次にJSON → JavaScriptオブジェクトにする
JSON.parse(jsonSchoolOne);


```



まとめ

つまり、APIとかでJSONスタイルでデータを取得した際は、必ずJSON.parseでJavaScriptオブジェクトの形式に戻してから、値を取得するようにしましょう。
Heroku + Rails + S3でサイトマップを設置

Herokuを使うと、サイトマップの設置がめんどいです。
レンタルサーバー時代はweb上の適当なツールで自動生成して、FTPでアップロードするだけの超単純な作業だったのですが、今回は色々と大変でした。

とは言えやり方がわかってしまえばそこまで大変な作業ではないので、今後のために手順をまとめておきます。

##全体の流れ
- AWSのアカウントを作る
- S3のバケットを作る
- アクセスキー、シークレットアクセスキーを取得する
- 環境変数を登録する
- gemをインストールする
- サイトマップ用の設定ファイルを作る
- ルーティングを追加する
- サイトマップをS3にアップロードする
- robots.txtを編集する
- Google Search Consoleにサイトマップの場所を登録する

環境変数登録の部分から説明していきます。
アクセスキーの取得までは、「S3 バケット作成」等でググって頑張ってください。

##環境変数を登録する
ローカル、Herokuそれぞれに、以下の3つの環境変数を登録します。
`AWS_ACCESS_KEY_ID`：AWSのアクセスキー
`AWS_SECRET_ACCESS_KEY`：AWSのシークレットキー
`S3_BUCKET_NAME`：作成したバケットの名前

私の場合、ローカルは`dotenv-rails`を使い、Herokuは管理画面上から登録しました。

##gemをインストールする
```rb:Gemfile
gem 'sitemap_generator' #サイトマップ作成用
gem 'aws-sdk' #AWS接続用
```
```terminal
$ bundle install
```

##サイトマップ用の設定ファイルを作る
```terminal
$ rails sitemap:install
```
以下のように書き換える

```rb:config/sitemap.rb
SitemapGenerator::Sitemap.default_host = 'https://example.com'
SitemapGenerator::Sitemap.sitemaps_host = "https://s3-ap-northeast-1.amazonaws.com/#{ENV['S3_BUCKET_NAME']}"
SitemapGenerator::Sitemap.adapter = SitemapGenerator::AwsSdkAdapter.new(
  ENV['S3_BUCKET_NAME'],
  aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
  aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
  aws_region: 'ap-northeast-1',
)

SitemapGenerator::Sitemap.create do
  #ここからサイトマップに登録したいページのパスを書いていく
  add root_path
  add mcs_genre_path
  mcs = Mc.all
  mcs.each do |mc|
    add mcs_detail_path(mc_id: mc.id)
  end
  add rankings_p_line_path
  add comments_path
.
.
end
```

##ルーティングを追加する
```config/routes.rb
get '/sitemap', to: redirect("https://s3-ap-northeast-1.amazonaws.com/#{ENV['S3_BUCKET_NAME']}/sitemaps/sitemap.xml.gz")
```

##サイトマップをS3にアップロードする
ここまでの変更をHerokuにデプロイした後、以下のコマンドを打ち込むと、サイトマップが作成されS3に保存されます。

```terminal
$ heroku run rails sitemap:refresh
```

※S3のパブリックアクセスの設定が上手くできていないとエラーが発生するので注意。
[AWS S3で「Access Denied」を解決する](https://qiita.com/tktcorporation/items/ec2dbc2fe540e313f917)



##robots.txtを編集する
以下の1行を追加

```public/robots.txt
Sitemap: https://example.com/sitemap
```

##Google Search Consoleにサイトマップの場所を登録する
Search Consoleにログイン後、画面左のサイドバーから「サイトマップ」を選択し、それっぽいところにURLを入力して送信します。


##参考
- [heroku+railsでs3にsitemapを置く](https://qiita.com/you8/items/71a07ada6fd8661b5ddb)
- [【Rails】Heroku + S3でsitemapを利用する方法](http://vdeep.net/rubyonrails-heroku-sitemap-s3)
railsチュートリアル1章 bundle updateにて「An error occurred while installing pg (0.20.0), and Bundler cannot continue.」が発生する件

railsチュートリアル1章　リスト 3.2サンプルアプリケーション用のGemfileにて

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

上記追加後 `$ bundle install`で

```
An error occurred while installing pg (0.20.0), and Bundler cannot continue.
Make sure that `gem install pg -v '0.20.0' --source 'https://rubygems.org/'` succeeds before bundling.
```
のようなエラーが出た。
その後`$ bundle install --without production`でエラー回避できたので、原因は後で追記する。
ExcelVBAを高速化する方法

# 0. 共通
基本的に、全てのVBAの処理は以下のコードの間に入れることが望ましい。

```vb:処理開始時
Application.ScreenUpdating = False              '画面の描画更新を停止する
Application.Calculation = xlCalculationManual   '自動計算をOFFにする
Application.EnableEvents = False                'イベントの発生を無効にする
Application.Cursor = xlWait                     'マウスポインタを砂時計にする
```

```vb:処理終了直前
Application.Cursor = xlDefault                     'マウスポインタをデフォルトにする
Application.EnableEvents = True                    'イベントの発生を有効にする
Application.Calculation = xlCalculationAutomatic   '自動計算をONにする
Application.ScreenUpdating = True                  '画面の描画更新を有効にする
```

VBA高速化に関して、自動計算や画面の描画更新については多くのWeb記事を拝見したが、
**マウスポインタについて**はあまり記事をみかけなかった。
この設定を入れていないと、Excel上にカーソルがある時に「砂時計←→通常」の状態変化を激しく繰り返すことによって、本来10秒程度で済む処理が5倍程度に膨れ上がっていた。

Excel2013以降で発生するらしい。（自分はExcel2019で同事象を確認）
[こちらの記事](https://www.saluteweb.net/~oss_excelcursor.html)に助けていただいた。ありがとう。

# 1. コピーする
コピーして貼り付けを行う場合、以下の点に気をつけたほうが良い。

## 1-0. クリップボードへのコピーは必要最低限にする
個人的に意外だったのだが、「クリップボードにコピーする」という処理がそれなりに重いということ。
例えば、**テンプレートシートの１行をコピーして、出力用シートにデータ件数に応じて貼り付けを行う**というような処理を想定する。
コピーした情報はクリップボードに保持されているため、出力処理を含むループ内で**毎回コピーする必要はない**。
クリップボード上の情報を**貼り付ける**だけで良いので、不要なコピー処理は避けること。

> 単一セルのコピー処理を100回ループさせたところ、3秒程度の時間がかかった。

## 1-1. 書式をコピーしたい
この場合は必要最低限の範囲を指定して**書式の貼り付け**を行った方が(値を含めた貼り付けと比べて)**2倍ほど早い**。
逆に、値のみをコピーする場合も同様の指定の方が望ましい（と思う）。

```vb
Range("A1").PasteSpecial Paste:=xlPasteFormats
```

| 設定項目 | 設定値 | 結果 |
|:-:|:-:|:-:|
| Paste  |  xlPasteValues | 値貼り付け  |
| Paste  |  xlPasteFormats | 書式貼り付け  |
※上記は一部情報の抜粋です。

参考:[MS公式ドキュメント](https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.pastespecial)

## 1-2. 行や列をコピーして挿入したい
この場合は、先に行や列を新規挿入した上で、コピー内容を貼り付けた方がよい。
自分では未確認だが、処理件数によっては数分程度早くなったとも。。。


# 値をセットする

シートに値をセットする際、以下のような古典的な書き方をしていませんか？

1. 処理対象の元となるデータの件数だけ、出力先のシートの行に対してループ
2. データの項目の数だけ、出力先のシートの列に対してループしながら値をセット

単純な一覧形式のデータを出力する場合、**二次元配列の変数に値をセットした後、出力先シートの指定範囲に対して一度だけ書き込み**を行った方が、圧倒的に早いです。


# ステータスバーの表示
処理に時間がかかる場合、ステータスバー（Excelの左下にあるエリア）に進捗状況を表示させる、ということをしがちである。
利用者に対して親切な仕組みではあるが、例えば1000回ループする際に1000回ステータスバーを更新する必要はあるのだろうか？

```vb:悪い例
For i = 1 to 1000
    Application.StatusBar = i & "件目を処理中です。。。"
Next
```

条件分岐の処理を追加してでもステータスバーの更新頻度を下げた方が、全体としてはパフォーマンスが向上するため、全体の処理時間との兼ね合いでステータスバーの表示は検討すべきである。

```vb:良い例
For i = 1 to 1000
    If i Mod 100 = 0 Then
        Application.StatusBar = i & "件まで処理しました。"
    End If
Next
```

# 参考記事
[みるくP　ブログ](http://chiroinu.freehostia.com/wordpress/?p=231)
GithubActionsでMySQL8.0のRSpecを動かす

## 問題点
GithubActionsでRSpec(MySQL8.0)を動かそうとしたら、mysql-clientが5.7でうまく動かなかった。
RSpecの実行にて以下のエラーが発生
> Mysql2::Error::ConnectionError:
  Plugin caching_sha2_password could not be loaded: /usr//usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

## 結論
```.github/workflows/rspec.yml
name: rspec
on:
  push:
    paths-ignore:
      - README.md
      - Dockerfile
      - docker-compose.yml
jobs:
  rspec:
    name: RSpec
    runs-on: ubuntu-latest
    env:
      RAILS_ENV: test
    services:
      mysql:
        image: mysql:8.0.15
        env:
          MYSQL_ROOT_PASSWORD: pass
    container:
      image: ruby:2.6.5-alpine
      env:
        MYSQL_HOST: mysql
        MYSQL_ROOT_PASSWORD: pass
    steps:
    - uses: actions/checkout@v1
    - name: Setup container
      run: |
        apk --update add build-base libxml2-dev libxslt-dev mysql-dev mysql-client openssl tzdata && \
    - name: Gem install
      run: |
        gem update --system && gem install bundler --no-document && bundle install -j4
    - name: Setup test DB
      run: |
        bundle exec rails db:setup
    - name: Run RSpec
      run: |
        bundle exec rspec
```

## 問題点
- MySQL8.0から認証方式が`caching_sha2_password`に変更された
- debian系のDockerコンテナに入っているmysql-clientの`5.7`では新しい認証方式に対応していない
- 対応するには、mysql-clientを`8.0`にするか、認証方式を旧来のものに必要がある

## 対応
- debian系はリポジトリ登録したり、8.0系のクライアントを入れるのに手間がかかるので、alpineにして必要なものをいろいろ突っ込んだ
- ライブラリ周りは必要に応じて加えたり、省いたりしてください
- キャッシュは考慮していません
- GithubActionsでdocker-composeの`command`的なことをやることがうまくできなかったので、認証方式を変更することは諦めました...
Colabでtensorflowの学習済みモデルをKerasで使いたい

#参考にしたサイト
colabでtensorboard
https://qiita.com/sakaia/items/6d619a74f6ec4dda6f8c

pbをtensorboardで開く
https://toxweblog.toxbe.com/2018/06/07/tensorboard-open-pb-file/

pb2h5
https://qiita.com/ocjosen/items/941b98c9fbee30f71e73

tensorflowのモデル
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

フレームワークごとのモデル一覧
https://modelzoo.co/
SQL基本コマンド１（DB・テーブル作成）

#はじめに
会社でデータ分析業務を行っていて、SQLを書くようになったので備忘録として
コマンドをまとめていく
＊コマンドは全て小文字でも可能
＊必ず最後にセミコロンをつける

#MYSQLを起動してログイン
```
＊起動
sudo service mysqld start

＊ログイン（rootユーザーとして）
mysql -u root
```

#とりあえずDB・テーブル作成
```
＊DB作成
create databese DB名;
＊テーブル作成
create table table名(カラム名1　データ型1,カラム名2　データ型2.....);
```

何はともあれ最初はDBとテーブルを作成。
DB名・table名には好きな名前を入れてOK
複数DBがある場合は、use文を使用して使用するDBを決める

#お次はカラムを作ろう
```
＊usersテーブルの場合
 *カラム追加（単数追加）
 alter table users add カラム名 データ型;

*カラム追加（複数追加）
 alter table users add(カラム名1 データ型1,カラム名2 データ型2.......);

 *カラム削除
 alter table users drop カラム名;

 *カラム更新
 alter table　change users 旧カラム名　新カラム名 データ型;
```

とりあえずここまで次はレコードの追加について書きたいと思う
vagrantでngrok

# はじめに
vagrantを使ってローカルで開発していたwebページを、その場にいない人に共有したかった。

# やり方
https://dashboard.ngrok.com/signup
でユーザー登録、ダウンロード、解凍する。
path云々があるのでユーザーのbinに配置。

![スクリーンショット 2020-02-06 11.27.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446130/634f786b-4176-a47a-eec2-3ddad5e0e418.png)

ログイン後の画面にあるコマンドを実行する。
アカウントの認証トークンがngrok.ymlファイルに追加される。

![スクリーンショット 2020-02-06 11.46.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446130/20a34945-de07-3651-e7f2-6eaac82a9f52.png)

Vagrantfileに追記

```:Vagrantfile
config.vm.network "forwarded_port", guest: 80, host: 8080
```

`8080`は好きな空いてるポート番号。これを使う。

コマンド。


```:
ngrok http 8080
```

![スクリーンショット 2020-02-06 11.38.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446130/c799a490-20f7-f9f9-c707-765c04b09161.png)

これでFowardingのURLにアクセスしてもらえば見てもらえる。
URLはngrokコマンドを実行するたびに変わるので注意！
[http://127.0.0.1:4040](http://127.0.0.1:4040)で色々確認できる。

基本はこれでOK。


# パスワードをかける

```:
ngrok http -auth="ユーザー名:パスワード" 8080
```

コマンド実行の際オプションをつける。

URLにアクセスした際パスワードを求められるようになる。

# おわり
参考にさせていただいた記事。
[ngrokが便利すぎる](https://qiita.com/mininobu/items/b45dbc70faedf30f484e)
[少しでも安全にngrokを使用する(Basic認証)](https://qiita.com/da-sugi/items/77f5b9bbbd32d8a79bf3)
全てのファイルをファイル名順でリストアップするコマンド

以下のコマンドで全てのファイルをファイル名、ファイルサイズ順でリストアップできます。

```
ls -la $(find / -type f) | sort -k9
```

ファイルサイズ順（降順）なら

```
ls -la $(find / -type f) | sort -nr -k5
```

ファイルサイズ順（降順）トップ10だけなら

```
ls -la $(find / -type f) | sort -nr -k5 | head -10
```
git pull についての備忘録

# はじめに

- 「git pull origin master」を実行することで、リモートリポジトリから最新の情報を取り込むことができる。
- ここではgit pullがどういった動きで行われているかについて書く。

# 出てくる用語
- **origin**： リモートリポジトリのURLの別名。
- **master**： デフォルトのブランチの名前、メインのブランチ。リモートにもローカルにも存在。
- **origin/master**：リモートリポジトリのmasterブランチを追跡しているローカルのブランチ。


# git pullの中身
- git pullは以下の行程を一気通貫で行うコマンド。

## １．git fetch
- リモートリポジトリから最新の情報をローカルリポジトリに持ってくることができる。

- 持ってくる場所はローカルのmaterブランチではなく**origin/master**ブランチに取り込む。

## ２．git merge
- ブランチをmasterに反映させるコマンド。

- origin/masterブランチの情報をローカルのmasterブランチに取り込む。

## イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/ae762595-f72c-6494-0af2-716f0acb9705.png)
NVIDIA GeForce 搭載PCでUbuntu起動時にエラー (Couldn’t get size: 0x800000000000000e)

# 現象

自作PCを組み立ておわり、OSを焼くときに、「Couldn’t get size: 0x800000000000000e」のエラーが出てしまい、先に進めなくなる問題にあたった。

[NVIDIA GeForce 入り PC で Ubuntu インストーラ(GUI版)の表示が壊れてた場合](https://qiita.com/yoya/items/026317fe2ddb30ab411d)の記事と同じ現象です。ただし、少し違う部分もあり、引っ掛かったのでまとめます。

※ 2020/02/06現在の現象。時期に解決されうる問題だと思います。

# 環境

- GPU: NVIDIA GeForce 2080 Ti
- OS: Ubuntu 18.04.3
- （BIOSやGRUBのバージョンにも依存するかもしれません)


# 解決策

基本的な方法は[NVIDIA GeForce 入り PC で Ubuntu インストーラ(GUI版)の表示が壊れてた場合](https://qiita.com/yoya/items/026317fe2ddb30ab411d)と同じです。

「Install Ubuntu」の画面のメニューが出るところでeボタンを押して、linux行の末尾に「nomodeset」を入れます。

このときに、「Install Ubuntu」にカーソルがあたっている段階でeボタンをおしてください。私の場合はデフォルトで「Try ...」にカーソルがあたっていて、正常にインストールが行われず、`sudo update-grub`ができませんでした。

また、「Install Ubuntu」にカーソルをあてて再度チャレンジすると、`sudo update-grub`をわざわざしなくても、勝手に反映されていました。

# 補足

[NVIDIA GeForce 入り PC で Ubuntu インストーラ(GUI版)の表示が壊れてた場合](https://qiita.com/yoya/items/026317fe2ddb30ab411d)のコメントにも記載がありましたが、3ヶ月ほど前に全く同じようにやったときにはこのようなエラーは起きなかったです。一時的な競合の可能性がありますが、パット見なかなか解決が難しそうなので要注意です。
gorm.DB.FirstでIDしか取って来れなかった話

# TL; DR
`gorm.Open` するときに `&parseTime=true`パラメタをつけよう

# 問題
## 該当コード
```go
var passedAuth AuthData
err := json.NewDecoder(r.Body).Decode(&passedAuth)
if err != nil {
	fmt.Println(err)
	return
}
var auth AuthData
db.First(&auth, &AuthData{UserID: passedAuth.UserID})
fmt.Printf("%+v\n", auth)
```

## こうなって欲しかった
```
{Model:{ID:1 CreatedAt:2020-02-06 09:50:59 +0000 UTC UpdatedAt:2020-02-06 09:50:59 +0000 UTC DeletedAt:<nil>} UserID:hogehoge Password:hogehoge}
```

## こうなった
```
{Model:{ID:1 CreatedAt:0001-01-01 00:00:00 +0000 UTC UpdatedAt:0001-01-01 00:00:00 +0000 UTC DeletedAt:<nil>} UserID: Password:}
```
__IDしか取得できてない！__

# 原因
よくログを見てみると...

```
sql: Scan error on column index 1, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time
```
教えてくれてた。無視しててごめん。

# 解決
見た感じ一般的なエラーっぽかったので、まるっとコピペしてググってみたらこの記事にたどり着いた。
[Gormでunsupported Scan的なエラーが出た](https://shinshin86.hateblo.jp/entry/2019/03/09/131829)

どうやら`gorm.Open` するときに `&parseTime=true`パラメタを付けないとらしい。

該当箇所を見てみる。

```go

db, err := gorm.Open("mysql", "root:admin@tcp(mysql:3306)/data_base?charset=utf8mb4")
```

ついてない。これだ。修正。。

```go
db, err := gorm.Open("mysql", "root:admin@tcp(mysql:3306)/data_base?charset=utf8mb4&parseTime=true")
```

直った。すごい。

# 参考文献
[Gormでunsupported Scan的なエラーが出た](https://shinshin86.hateblo.jp/entry/2019/03/09/131829)
Laravel5.6以降のLog設定の小ネタ

config/log.phpでログを設定するようになってからの設定方法についての小ネタ。
ドキュメントに明示されておらず、StackOverflow等でもなかなか出てこないので書いておく。

## monolog driver以外でも、Formatterはconfig/log.phpで指定できる

https://laravel.com/docs/6.x/logging#customizing-monolog-for-channels
>
Monolog Formatters
When using the monolog driver, the Monolog LineFormatter will be used as the default formatter. However, you may customize the type of formatter passed to the handler using the formatter and formatter_with configuration options:

```php
'browser' => [
    'driver' => 'monolog', // <= simpleドライバなどでもformatter指定できる
    'handler' => Monolog\Handler\BrowserConsoleHandler::class,
    'formatter' => Monolog\Formatter\HtmlFormatter::class,
    'formatter_with' => [
        'dateFormat' => 'Y-m-d',
    ],
],
```

* ドキュメントには `monolog` ドライバー用のオプションのように書かれているが、 `simple` や `daily` のdriverであっても同様に、formatterパラメータが有効
    * 同様にformatter_withも有効

## tap()時、getHandlers()で全ハンドラを回さなくても直接$logger->pushProcessor()できる

ドキュメントの `tap()` のサンプルが以下のように書かれているため、プロセッサの設定でも同様のループを書いていることが多い

```php
// tapの処理サンプル
public function __invoke($logger)
{
    foreach ($logger->getHandlers() as $handler) {
        $handler->setFormatter(...);
    }
}
```

```php
public function __invoke($logger)
{
    foreach ($logger->getHandlers() as $handler) {
        // ならこうやろ！
        $handler->pushProcessor(...);
    }
}
```

※このサンプルに引っ張られて上記Formatterの設定を `tap()` でやってしまう疑惑

* `__invoke($logger)` に渡される実体は `Monolog\Logger`
* Loggerのスタック全体に対して適用するProcessorを `pushProcessor()` で突っ込める ⇒[ソース](https://github.com/Seldaek/monolog/blob/8459330a3ee60b640ddce8462eb50c71f617d545/src/Monolog/Logger.php#L224)

    ```php
            public function __invoke($logger)
            {
                // 全部に適用したいならこれで十分
                $logger->pushProcessor(...);
            }
    ```
[スライド版] みちびきとSPRESENSEによる高精度位置情報の取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/2a5effa0-b4e9-b1a7-c1ad-3fd9d13dc88e.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/16581ac8-5914-7bb5-ef47-b9ae937c5efd.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/7d4f1e31-962b-9566-e4c4-d6b80e34cdaa.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/387a30df-f446-d4fe-3988-b0cef1279b2f.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/5300ad75-67b5-356e-0bb6-9cfc75b34a08.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/2d20f4ef-209c-def5-553c-65428d4f0c45.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/f536b580-8613-630a-a416-de7c23d84e5f.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/12ff9294-0485-2ec5-60d4-af42822be497.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/35b8544d-2e61-dbd6-6701-5f1842d518fd.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/bd85cf4d-dc19-9dd2-59a4-ef20d19a7979.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/62783247-7b0b-e6b9-146b-423ff7768141.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/61e7c685-2eb3-19cf-9855-e4174aab2601.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/f2165200-f9d4-a04e-a547-fcc22c0d1165.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/a6dda41d-c82d-3d28-ab3d-a28d4dd6c64d.png)
競プロ用のテストシェルスクリプトを作った

# はじめに
データ構造の勉強のために競プロをやろうと思っており、そのためにテストを作りました。
よかったら使用してみてください。
デバッグ時にも標準入出力のまま実行できるため、提出時にコードを書き換える必要がなく、まあまあ便利かなと思います。

# シェルスクリプト
コンパイルコマンドは`$ make`としているので、同一ディレクトリに`makefile`を用意する必要がある。
`makefile`を使わない場合は、`make`部分を`g++ main.cpp -o main.out`と変更すると良い。
`input0 input1 ...`は、プログラムへの標準入力をあらかじめ用意する。`output0 output1 ...`に関しては、用意しなくとも動作には影響を及ぼさないが実行時の便利のために用意した方が良い。

```bash:test.sh
#!/bin/bash
# Compile
make

PRE_IFS=$IFS
IFS=$'\n'

# Put data {input output}
input0="1"
output0="1"
input1="2"
output1="2"

inputs=(  ${input0}  ${input1}  ${input2}  ${input3})
outputs=(${output0} ${output1} ${output2} ${output3})

# Test
for ((idx=0; idx<${#inputs[@]}; idx++))
do
	echo "== Testing with input" ${idx} " ====="
	echo ${inputs[${idx}]}
	echo "------- Result ------------"
	echo ${inputs[${idx}]} | ./main.out
	echo "------- Answer ------------"
	echo ${outputs[${idx}]}
done
echo "==========================="
```

# 解説
以下、各処理の簡単な説明を列挙する。

```bash:test.sh
#!/bin/bash

# Compile
make
```

これはシバンとコンパイル。

```bash:test.sh
# Put data {input output}
input0="1"
output0="1"
input1="2"
output1="2"

inputs=(  ${input0}  ${input1}  ${input2}  ${input3})
outputs=(${output0} ${output1} ${output2} ${output3})
```

ここでは、入力データおよび出力データを準備する。`input0="1"`で、文字列として値を保存しており、`inputs=( ${input0} ${input1} ... )`では、文字列の配列として各入力を保存する。この時、準備していない変数(`input2, input3`)を配列の要素としたが、bashでは値の存在しないものを配列に入れても要素にされないようなのでこのように記述した。出力に関しても同様である。

```bash:
# Test
for ((idx=0; idx<${#inputs[@]}; idx++))
do
	echo "== Testing with input" ${idx} " ====="
	echo ${inputs[${idx}]}
	echo "------- Result ------------"
	echo ${inputs[${idx}]} | ./main.out
	echo "------- Answer ------------"
	echo ${outputs[${idx}]}
done
echo "==========================="

IFS=$PRE_IFS
```

`${#inputs[@]}`は入力配列の文字数を表し、`for (( ... ))`によって準備された入力の個数だけ`idx=0, 1, ...`とループ処理を行う。`for idx in ${#inputs[@]}`とすると`idx=1, 2, ...`となってしまう点に注意する必要がある。`echo ${input} | ./main.out`とすることで、`echo ... `の結果を`main.out`の標準入力にパイプすることができる。

ループ内では、

- 何番目のテストなのか
- 入力内容
- 出力結果
- 正解

の情報を人の目で見てわかりやすいように適宜情報を`echo`した。

# おわりに
bashはほとんど書いたことがないので、不具合・改善策等あれば言ってもらえると幸いです。
Nuxt で description をデフォルト設定していないのに、謎の値が入る



## 解決策

`nuxt.config.js` の `plugin` にて `meta` プロパティをオフにする

```
 ...,
 ['@nuxtjs/pwa', { meta: false }],
 ...,
```

もしくは、 `@nuxtjs/pwa` を使わない。

## 前提

+ Nuxt.js v2.8.1
+ @nuxtjs/pwa

## 起こったこと

`nuxt.config.js` で、metaタグの `description` を設定していないのに以下のようなタグが append される

```html
<meta data-n-head="true" data-hid="description" name="description" content="---">
```

## 原因

`@nuxtjs/pwa` が README.md の値を append していた

この時の `README.md` の `---` の値が使われていた。。

```
# Project title

---

some text...

```

## @nuxtjs/pwa の挙動

### 1. `package.json` に `description` が設定されているとき

　`package.json` の `description` の値をつかって、自動的にmetaタグを挿入
 　
　※ただし、 `nuxt.config.js` でmetaタグが指定されていた場合は、そちらが overwrite される
 
 
### 2. `package.json` に `description` が設定されていないとき

　なぜか `README.md` の2行目の値が使われる 🤔🤔🤔
 
　中を見ると `process.env.npm_package_description` に `README.md` の値が入っていた（原因は未調査）
 
 
## まとめ

 PWAが要件にないのに、 `@nuxtjs/pwa` が `plugin` として使われている場合は注意しましょう
Tera Termの設定を思いのままにしたい！

文字化けしてほしくないなー。接続先のサーバーいくつかあるし、個別で設定変えたいな。

#各設定を保存しよう
##改行コードと文字コード
【設定】の【端末】から好みの設定に変更できる

![20200206_Qiita01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509471/0ec9a094-1497-74da-db80-ebad8ea3a882.png)

設定できたら【OK】をクリック

##背景色と文字色
【設定】の【ウィンドウ】から好みの設定に変更できる

![20200206_Qiita02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509471/df9610e0-97b7-fd05-52da-59eaefad902b.png)

黒い画面にABCとなっているところがリアルタイムで変わる。
背景は真っ白（R:255,G:255,B:255）だと眩しく感じたので、少し暗くするのが良い。

#INIファイルで保存しよう
好みの設定になったら【設定】の【設定の保存】から保存する

![20200206_Qiita03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509471/4266fa90-ab15-ee6d-74da-401b1d2c3f16.png)

プロジェクト名とかで保存するとわかりやすい。

#INIファイルを読み込もう
【設定】の【設定の読み込み】でINIファイルを読み込む

![20200206_Qiita04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509471/cd4a601b-3008-b15c-f09a-6959e39fd106.png)

背景が白っぽくなった
![20200206_Qiita05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509471/e4a82f77-2499-9fcd-08b7-ece2c0648eab.png)

作業に入る前に個別で設定したINIファイルを読み込めば、Tera Termで複数のサーバーを起動していても「どれがどの作業しているサーバーだっけ？:neutral_face:」を防げる。
Chromeの拡張機能を作成してみた〜2〜

####前回の続き
[Googleの拡張機能を作成してみた](https://qiita.com/migikata-agari/items/434858999257f6ca52be)

####仕様（今後の展開も含む）
1. ページを開いた瞬間にページ内のimgタグを取得し、別タブに画像とaltの内容を表示します
2. イベントの発火をページ開いた時ではなく、アイコンをタップした瞬間に変更する　←今ココ
3. 別タブに表示するのではなく、アイコンクリック時に表示するHTMLへ表示する

####フォルダ・ファイル構成
```
test/
  - manifest.json　→　設定ファイル
  - jquery.min.js
  - content_scripts.js　→　処理ファイル
  - background.js　→　イベント発火ファイル
```
####ファイルの中身
```JSON:manifest.json
{
  "name": "TakeAPicture",
  "manifest_version": 2,
  "version": "1.0.0",
  "permissions": [
    "activeTab"
  ],
  "browser_action": {
    "default_title": "TakeAPicture"
  },
  "content_scripts": [
    {
      "matches": ["http://*/*", "https://*/*"],
      "js": ["jquery.min.js", "content_scripts.js"]
    }
  ],
  "background": {
    "scripts": ["background.js"],
    "persistant": false
  }
}
```
```javascript:background.js
// 拡張機能のアイコンのクリックイベントを登録
chrome.browserAction.onClicked.addListener(function(tab) {
    // 拡張機能内で通信を行う為、メッセージ送信
    chrome.tabs.sendMessage(tab.id, "Action");
});
```

```javascript:content_scripts.js
// メッセージ受信用のイベントを登録
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
    if (request == "Action") {
        // 特定のイベント（アイコンクリック）の場合、画像取得
        get_image_in_window();
    }
});

function get_image_in_window() {
	var set_html = "";
	$("img").each(function() {
		var src = ($(this).hasClass('lazyload')) ? (($(this).attr('data-src') != undefined) ? $(this).attr('data-src') : $(this).attr('src')) : $(this).attr('src');
		var img = '<img src="' + src + '" alt="' + $(this).attr('alt') + '" />';
		var cap = '<p>' + $(this).attr('alt') + '</p>';
		set_html += img + cap + "<br>";
	})

	var nwin = window.open("", "image_list", 'width=600,height=700,resizable=1,scrollbars=1');
	nwin.document.open();
	nwin.document.write(set_html);
	nwin.document.close();
}
```
####終わり
前回まではページを表示した瞬間に拡張機能の処理が動いていた為、毎回鬱陶しい感じでした。
アイコンクリックでの発火にしたことで、拡張機能を随時ONで使用できるようになりました。

####参考サイト
[Google Chromeのエクステンションを作成する方法](https://ajike.github.io/build-chrome-extension/)

####更新履歴
20/02/10 タイトルを変更しました。
【初心者向け】開発環境：Angular + VSCode in Windows

# はじめに
- Angularかじったときの備忘録です
- 意外と開発環境のセットアップに手間取ったのメモを残しておきます
    - 手間取ったというより、情報が多く、何がシンプルでベストなのか特定するのに時間がかかりました。
- VSCodeのインストール手順は割愛します

# まずはAngularを用意
- 結局本家のサイトが一番でした。
    - https://angular.jp/guide/setup-local
- ここもミニマムで分かりやすかったです。
    - https://poppingcarp.com/angular_intro_setup_windows/
- Node.jsインストールして、AngularCLIインストールするだけでＯＫです。
    -  Node.jsはLTS版となる12.14.1 (同梱 npm 6.13.4)
    -  AngularCLIは8.3.24
- ここまでは、VSCode関係無いです。この時点でAngular開発できるようになります。上記サイトのTutorialは一通り試せます
    - ng newでプロジェクト作って、ng serveでローカル起動すれば、動作確認することができます。

# VSCodeの設定
- エディタはVSCodeが使いやすく情報も多いです。
    - バージョンは1.41.1
- ng newして生成したフォルダを選択して、それぞれのファイルを編集しながら開発していきます。それなりにコード補完もしてくれます。
- AngularCLIはVSCode上のTerminalから直接叩けばいいでしょう。ng serveして、chromeでlocalhost:4200にアクセスして、画面を開いておけば、コードの更新毎に画面も更新してくれます。画面が表示されない！？みたい場合は、chromeの開発者ツールでエラー確認できます。
- componentやserviceをVSCodeコンテキストメニューから生成するような拡張が欲しいような気がしますが、AngularCLIのコマンド覚えればいいだけの話です。
- 結論として、何も設定する必要が無いのか、というわけではなく下記の拡張はおススメです。
    - Angular Language Service
        - コード補完がかなり強化されます。特にhtmlファイル内。

# 終わりに
- 内容の薄い記事となってしまいました。
- VSCodeの拡張機能情報をもう少し追記予定です