OmniAICreator/Qiita-1.07M huggingface dataset:
Power BI Tips - ガントチャートを表示する

#概要
IoTシステムで、工場内作業者の作業開始・終了日時を自動記録していて、
作業実績をPower BI Desktopのガントチャートで表示しようとしたんですが、
その際の設定周りの備忘録。

#準備
まず、Power BI Desktopでガントチャートのカスタムビジュアルを取得します。
視覚化ペインの「・・・」をクリックして、「その他のビジュアルを取得」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/611a2183-ecb8-915c-1da8-6c48ef5ee611.png)

Microsoftアカウントでログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/63af6515-e6c3-1f9c-3bc5-25e94e16f9bc.png)

以下のような画面が表示されるので、検索窓に「Gantt」と入力し、検索します。
ガントチャートのカスタムビジュアルは複数ありますが、
私が使った感じだと、Microsoft社の「Gantt」が一番使いやすかったです。
見た目もシンプルなので。
ということで、「Gantt」の追加ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/da38a7e7-c12c-4a18-40cb-a698f8adfae7.png)

#うまくいかなかったこと
カスタムビジュアルが追加されたら、視覚化ペインのGanttのアイコンをクリックして、
ページにGanttを置いてみます。

フィールドはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/aac34d91-6ed0-e5b6-6326-6727ad3f10bb.png)

最低限必要なフィールドは、タスク／開始日／終了日（またはタスク／開始日／期間）のようです。
というわけで、
　開始日時　2020/7/20 21:29:14、終了日時　2020/7/20 21：29：44
のデータを表示させてみると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/fc51c742-049e-b661-7439-74173c62debf.png)

思った通りの表示になりません。
それどころか、終了日時がおかしい（開始日時の1日後になっている・・・）

#試したこと
書式に何か設定があるのかと思ってみてみると、
「日付の種類」という、なんか関係ありそうな設定があったのでいじってみると・・・
ガントチャートのレンジが変わるだけでした・・・。

書式を全て展開して確認してみたところ、
全般項目の中に「期間の単位」という設定が！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/f15c0991-94fa-2a82-3bac-9e64cf769b54.png)

今回使用しているデータが、秒単位まで入っているので、
ここの設定を秒に変えてみると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/e1ab36ce-ea91-a6c5-edfd-36655e0f67b1.png)

正しい表示になりました。

ガントチャートというと、（スケジュール管理等で）日単位で使うことがほとんどなので、
もしかするとこんなところでハマること（人）が珍しいのかもしれません（汗）。
Docker 環境別 no cache install

docker cache clean clear

基本的には、multi-stage-buildを用いて、build用のimageと成果物のimageを分けることが望ましい。
installされたpackageが多数のディレクトリにまたがっていたり、それが難しいケースはbase imageのパッケージ管理ツールのclean機構をonelinerで書くと良い。

## apt

```Dockerfile:Dockerfile
FROM debian

RUN apt-get update && apt-get install -y \ 
* \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
```

参考: https://docs.docker.jp/engine/articles/dockerfile_best-practice.html#run

## npm

```Dockerfile:Dockerfile
FROM node

RUN npm install -g \
* \
&& npm cache clean --force
```

参考: https://qiita.com/hikaruna/items/0bc1e97e8d254f4c27e7

## yarn
```Dockerfile:Dockerfile
FROM node

RUN yarn global add \
* \
&& yarn cache clean
```

### 参考
- https://stackoverflow.com/a/62086050

## yum

TODO

## pip

TODO
[Mac]デフォルトシェルをzshに設定するまで

## 始めに

1ヶ月くらい前にようやっと、デフォルトシェルを`bash`から`zsh`に変更したので、忘備録として、また、これから、`zsh`に移行したい人のため、少し`zsh`を導入するまでについてメモしたいと思います。

`zsh`は「MacOS Catalina」から標準シェルとなりました。

私の場合、「使ってたアプリが使えなくなった」、「Bluetooth接続に問題あり」、といったCatalinaの不具合情報が飛び交ってたので、暫くは`Mojave`を使用していたのですが、リモートワークでディスプレイを増やしたい = 「[Sidecar](https://support.apple.com/ja-jp/HT210380)」がそのニーズを満たせるか試してみたい！ということで、アップデートしました。(まだまだ、アップデートしたくない！！という人もいるかもしれませんね。。。)

アップデート後、ターミナルを開いてみるとこんなメッセージが。。。

```terminal:zshがデフォルトでない場合、毎回表示される。
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
```
以下サイトの案内もメッセージに含まれてますね。日本語で書かれてるので、気になる人は一読してみるのも良いかもしれません。
https://support.apple.com/ja-jp/HT208050

毎回、メッセージ出るのも気になるし(表示させない方法もあります)、bashのバージョンも３(10年前のものでセキュリティ的にどうなの？)で古いままだし...ということで、zshに乗り換えました。

## 対象読者
* MacOSを`Catalina`にアップデートして、かつ`zsh`をデフォルトのシェルとして設定していない人
(これを機に乗り換えたいと思ってる人)

初めから`Catalina`がデフォルトの人は、元々`zsh`が標準のシェルになっているかと思います。

## zshとは
正式名称は`Z Shell`でズィーシェルと読みます。
bashとは完全に互換性があるわけではない点は要注意です。(ここに関しては勉強中...)
以下、Wikiの引用になりますが、作成されたのは大分昔のようです。

>zsh の最初のバージョンは、1990年 [3] に、当時 プリンストン大学の学生であった Paul Falstad によって作成された。 zsh の名前は、当時プリンストン大学のティーチングアシスタントであったイェール大学教授 Zhong Shao のログイン名 "zsh" に由来して名付けられた

[Wikipedia](https://ja.wikipedia.org/wiki/Z_Shell)より


##zshをインストール〜デフォルトシェルに設定する


インストールはHomebrewを使用して行ます。

```terminal:zshインストール~デフォルトシェルの変更まで
$ brew install zsh
$ sudo sh -c "echo '/bin/zsh' >> /etc/shells"
$ chsh -s /bin/zsh
```
これで、`zsh`がデフォルトシェルに変更されました。
因みに使用できるshellのパス一覧がみたい場合は以下コマンドで確認できます。

```terminal

$ cat /etc/shells
     1	# List of acceptable shells for chpass(1).
     2	# Ftpd will not allow users to connect who are not using
     3	# one of these shells.
     4
     5	/bin/bash
     6	/bin/csh
     7	/bin/dash
     8	/bin/ksh
     9	/bin/sh
    10	/bin/tcsh
    11	/bin/zsh
```

#### やっぱりbashに戻したい...という場合は

```terminal:以下コマンドで、bashに戻せます
$ chsh -s /bin/bash
```

## zshに慣れるまでは、bashとzshを併用したい場合の例
上記セクションで設定は完了しましたが、いきなり`zsh`に移行するのが不安...という人もいるかと思います。
その場合、以下の３つにファイルを分けて、運用してみる方が安心かもしれません。

使用するファイルは以下の通り。
* .bash_profile
* .zlogin
* .common_setting（共通の設定を定義しておく）

`.common_settings`という`bash`と`zsh`共通で読み込む設定ファイルを作成し、（ファイル名は任意）
`.common_settings`があれば、読み込むという処理を書きます。


```shell:common_setting(共通の設定)
export PATH="$GOPATH/bin:$PATH"
export GOPATH="$HOME/go"

# alias setting
alias ls='ls -F'
alias la='ls -a'
alias ll='ls -l'
alias cp='cp -i'
```

```bash:bash_profile

COMMON_SETTINGS=$HOME/.common_setting
# 共通の設定ファイルが存在すれば、読み込む
if [ -e $COMMON_SETTINGS ]
then souce $COMMON_SETTINGS
fi

export PS1="$ "

# 以下にbash固有の設定を書く

```

```zsh:.zlogin

COMMON_SETTINGS=$HOME/.common_settings

if [ -e $COMMON_SETTINGS ]
then source $COMMON_SETTINGS
fi

PROMPT="%~ %F{green}>%f%F{yellow}>%f%F{red}>%f "

# 以下にzsh固有の設定を書く

```

これで、`bash`を使いながら、徐々に`zsh`に慣れてく事もできるかなと思います。

## まとめ

ここまでで一旦、`zsh`の導入は完了です。
シェルの起動パターンや、bashにはない書き方もあるの、ある程度理解が進んだら、まとめてアウトプットしたいと思います。
C問題復習～AtCoder Beginner Contest 参戦録 #3

# はじめに

社内外の優秀なエンジニア達から「技術トークが多少わかる採用担当」として信頼を得ることを目指して、AtCoder Beginner Contest（通称ABC）へ参加している。

経緯は記事 [エンジニアから信頼される人事を目指して～AtCoder Beginner Contest 参戦録 #1 - Qiita](https://qiita.com/nagamomo/items/b816ee4a42d79221a075) に綴った。

弊社フロントエンドで使われているJavaScriptを使って5回参加したところ、全てでA, B問題までという結果に終わった。B問題の難易度はFizz Buzzと同等とのことだ[^1]。

C問題は、全く歯が立たなかったものもあれば、もう少し時間があれば解けそうだったものもあった。ここでC問題を復習し敗因をまとめたい。今回は2回分。

同じC問題とは言え、多少難易度が変動することもあるようで、各回の、実際の正答率から割り出した難易度は有志による非公式サイト[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)[^2] を参照した。
難易度の定義は[AtCoder社が提供している人材サービスのサイト](https://jobs.atcoder.jp/info/recruit)を参照した。

# AtCoder Beginner Contest C問題復習 その1

## ABC 170 （6/14開催）

### [C問題 - Forbidden List](https://atcoder.jp/contests/abc170/tasks/abc170_c)

- 難易度: 灰色(Eランク)

#### アプローチふりかえり

- 立てた方針
  - 与えられた整数列 `p_1, ... p_n` を小さい順に並べ替える
  - それぞれと `X` を比較して、絶対値が一番小さいものを探す
- 解けなかった理由
    - sort() の考え方が理解できず挫折（引数に関数が入るってどういうこと・・？）

    > 引数に比較関数を指定しない場合には文字列として比較されるので注意が必要です。

    ([【JavaScript入門】sort()による配列・文字列・オブジェクトのソート方法](https://www.sejuku.net/blog/62904) より)

#### [公式解説](https://img.atcoder.jp/abc173/editorial.pdf)

-  与えられた整数列 `p_1, ... p_n` を起点にするのではなく、 `X` を起点にして考える

#### 解き直し

-  要素数の数え方を調べた（引数の中に関数が入っているのは「高階関数」というらしい[^3]がそれは追って学ぶ）

## ABC 171 （6/21開催）

### [C問題 - One Quadrillion and One Dalmatians](https://atcoder.jp/contests/abc171/tasks/abc171_c)

- 難易度: 茶色(Dランク)

> 結構難しいと思います。C問題にしてはなかなか。苦労した人も多いんじゃないかと思います。

([Youtube解説](https://youtu.be/TUdZT1wIbe8?t=617)より)


#### アプローチふりかえり

- 立てた方針
    - 26 + 26^2 + ・・・という式が頭に浮かんだが、方針は立たず
- 解けなかった理由
    - プログラムで何を求めれば良いのか、問題設定ができなかった

#### [公式解説](https://img.atcoder.jp/abc171/editorial.pdf)

- 与えられた`N`の値の最大値から、犬の名前の最長の長さを求める→15文字
- `N`番目の犬の名前の長さが `l` 文字の名前の中で、辞書順で `N-(26+26^2+26^3+...+26^(l-1))` 番目を求める

#### 解き直し

-  配列の宣言の仕方を調べた
    -  [(初心者向け) JavaScript 配列の作成と初期化 - Qiita](https://qiita.com/tadnakam/items/bb3a0173d9173f715a36)
-  ◯番目のアルファベットを文字列を変換するやり方がどうもわからず、断念

# おわりに

これまで5回挑戦したABCのC問題を一気に復習し、次のコンテストでC問題まで完答するぞと意気込んだもののそう甘くはなく、、今回は2回分で時間オーバー。

FizzBuzzレベルの卒業まで、もう少し時間がかかりそうだ・・:cry:

[^1]: [AtCoder コンテストについての tips - Qiita](https://qiita.com/drken/items/8a6f139158cde8a61dce)
[^2]: メンター役になってくれているエンジニアの友人が教えてくれた。感謝。
[^3]: [JavaScriptの配列で要素のカウントと連想配列にする方法 - suzu6](https://www.suzu6.net/posts/96-js-count-element/)
VSCode で Julia-1.4 を動かすまで

# やること

ここでは，VSCode で Julia を実行するまでの環境構築をまとめていきます．この記事を通して，以下のようにVSCodeを用いてJuliaを動かすことができます．

<img width="1680" alt="スクリーンショット 2020-07-25 19.21.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367076/f9259aed-d060-0ec1-65f0-3b8a89b0fe6c.png">



VSCode , Julia のインストールについては **終了している前提** です．まだの方はそれぞれ以下からどうぞ．

julia download に関して → [Download Julia](https://julialang.org/downloads/)
vscode download に関して → [Download Visual Studio Code](https://code.visualstudio.com/download)

#環境
【PC】macOS Catalina ver 10.15.5
【Julia】↓

```julia
julia> versioninfo()

Julia Version 1.4.2
Commit 44fa15b150* (2020-05-23 18:35 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin18.7.0)
  CPU: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-8.0.1 (ORCJIT, skylake)
Environment:
  JULIA_EDITOR = "/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"
  JULIA_NUM_THREADS = 
```

#設定
いじるのは VSCode のみです．

## 拡張機能の導入
拡張機能を install する．「julia」で検索して出てくる以下の写真の機能を install します．
この拡張機能の GitHub は [こちら](https://github.com/julia-vscode/julia-vscode)．

<img width="1001" alt="スクリーンショット 2020-07-25 20.12.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367076/0108498b-22e2-7980-dcfa-d1a4897503a4.png">

## pathを通す

path を通していきます．基本設定を以下を参照して開いてください．

<img width="613" alt="スクリーンショット 2020-07-25 20.22.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367076/bdc63f83-106b-9767-8853-33a5c1211b56.png">

以下の画像のように，拡張機能 > julia を選択します．

<img width="644" alt="スクリーンショット 2020-07-25 20.24.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367076/2e497582-fc9e-124d-a149-b86906578582.png">

上記画面に映っている `Executable Path` に以下のpath

```bash
/Applications/Julia-1.4.app/contents/resources/julia/bin/julia
```
を通します．私は Julia-1.4 ですが，他のバージョンを使っている方は上のpathのバージョンをいじってください．

ここまできたら，一旦再起動しておきましょう．

**追記**
VSCodeで使用するJuliaのversionをupdateするには，上記パスのJuliaのversionを書き換えれば良いです．

#テスト
任意の `.jl` ファイルを作成したら，`Shift + Enter` をクリックすることで実行できます．以下のようになります！
ターミナルもREPL になるので便利ですね・・・

<img width="1680" alt="スクリーンショット 2020-07-25 19.21.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367076/6246c62c-5543-b7ba-2c66-6e2dc3134fb4.png">

#最後に
備忘録クオリティでした．ぜひやってみてください．
yayでgpgキーのチェックをスキップする方法

`--mflags --skipinteg `オプションを使うらしい

```bash
yay -S --mflags --skipinteg package
```
## 参考サイト
- [Github Jguer/yay Issue #755](https://github.com/Jguer/yay/issues/755)
- [Github Jguer/yay Issue #439](https://github.com/Jguer/yay/issues/439)
- [ArcoLinux HOW TO INSTALL A PACKAGE BY SKIPPING THE VALIDITY CHECK](https://arcolinux.com/how-to-install-a-package-by-skipping-the-validity-check/)
Railsアプリを速度改善する①

#EC2でデプロイ後にレスポンス速度を確かめる

herokuでのデプロイは、起動までのレスポンスが遅くユーザーがその間に離脱してしまうのを恐れたので、AWS(EC2)にデプロイしました。

といいつつも、アプリの起動が遅く感じられたのでトップページが表示されるまでのレスポンス速度を測ってみました。


**[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/?hl=JA)で測ってみた結果**


####モバイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/7e854dfd-9d45-5410-208c-233e6c78b395.png)
####パソコン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/19e15525-dd86-2045-1b3f-f8f68055a762.png)

#使っていないCSSファイルを全部削除

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/52bb964e-3623-d918-180d-c13729d891f1.png)

上記のみ残して、CSSファイルを全削除しました。
####モバイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/e0e39daf-a281-95bd-6417-97d971f60dd9.png)

####パソコン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614274/cb38460b-4ac7-c4d8-d01b-de417fcf0e78.png)

**6~7パーセント改善されました。**

モバイルはまだまだ改善の余地ありなので、他にも試していこうと思います。
初心者によるプログラミング学習ログ 381日目

#100日チャレンジの381日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
381日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日の作業・やったこと⇩<br><br>●就寝前筋トレ5分、キンドル読書 10分<br>●ブログ1記事作成<br>●プログラミング学習381日目 2h<br>・メンターの課題<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%E3%81%A4%E3%81%AA%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><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></p>&mdash; ぱぺまぺ@社畜✕投資✕ブロガー (@ppmp65) <a href="https://twitter.com/ppmp65/status/1286754344046534657?ref_src=twsrc%5Etfw">July 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Concourse CI にGoogleアカウントを使ってSSOする

## はじめに
今までadminユーザーを共有して全てのパイプラインを管理するという運用で済ませてきましたが、
チームの成長に伴って、各自のアカウント使ってもらってログインできるようにしたいと思うようになりました。
チームでは全員Googleアカウントを使っているので、GoogleアカウントからSSOできればいいなと思い設定しました。

意外と手こずったので、再設定時などを想定して方法を書いておきます。

## OIDC を使う
[Generic OIDC auth](https://concourse-ci.org/generic-oidc-auth.html)の仕組みを使って、GoogleアカウントからSSOすることにします。[^1]
[^1]: [oAuth](https://concourse-ci.org/generic-oauth.html)でもできるのかな？ 未確認です。

### クライアントIDとクライアントシークレットの発行
[GoogleDeveloperConsole](https://console.developers.google.com)から、クライアントIDとクライアントシークレットを発行します。

こちらの記事などを参考にしました。
[GoogleのOpenID Connectorを使ってみた](https://qiita.com/toshihirock/items/6679c59ac050f1740db2)

## サーバー設定
発行したクライアントIDとクライアントシークレットを含め、Concourse serverにOIDCの設定をします。
環境変数から、以下の4つを設定しました。

```sh
# 表示名
# ログイン画面に表示されるのでわかりやすいものに
CONCOURSE_OIDC_DISPLAY_NAME: Google

# 先ほど発行したクライアントIDとクライアントシークレット
CONCOURSE_OIDC_CLIENT_ID: 000000000000-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com
CONCOURSE_OIDC_CLIENT_SECRET: yyyyyyyyyyyyyyyyyyyyyyyy

# GoogleのOIDCの場合はこのURLとなる
CONCOURSE_OIDC_ISSUER: https://accounts.google.com
```
Concourseに読み込ませると、ログイン画面にSSO用のボタンが表示されるようになります。
(「Username/Password」から、引き続きパスワード認証もできますね)
![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36450/b28f09b0-fa7b-bea8-0b3c-859d5c9472d4.png)

## チーム設定
クライアントID・シークレットでログインできるユーザーを絞っていない場合、誰でもログインできてしまいます。
ログインしたところで権限がないので、何も見れないし何もできないですが。

正式なユーザーには権限を与えて、パイプラインを作成したりタスクを実行させたりするための権限を与えます。
flyで、以下のようなコマンドを使って設定しました。

```sh
# adminユーザーで、target:testにログイン
fly -t test login -c https://concourse.example.com

# googleというチームを作成し、ユーザーを1名を設定
fly -t test set-team -n google \
--oidc-user 000000000000000000000 \

# googleチームのユーザーを増やす場合はこうする
# 設定済みのユーザーも含めて設定しなおすこと
fly -t test set-team -n google \
--oidc-user 000000000000000000000 \
--oidc-user 111111111111111111111 \
```

`--oidc-user`で指定するのは、OpenID Connectのペイロードにあるsubの値のようです。
参考: https://developers.google.com/identity/protocols/oauth2/openid-connect#an-id-tokens-payload

私は自作のツールを経由して値を確認しました[^2]。
[^2]: ここに何を設定するのかがなかなかわからなかったのですが、普通はこの値をどうやって入手するんでしょう？

### デフォルト権限
この方法で設定すると、各ユーザーはチーム内でowner権限をもちます。
弱めな権限に変更したい場合は、ymlを書いて`--config`か`-c`で読み込ませる必要があるようです。
参考: https://concourse-ci.org/managing-teams.html#setting-roles

## ちょっと面倒に思う点
ユーザーが増えるたびに、flyからset-teamをするというのが面倒に思います。

特定のドメインのGoogleアカウントしかログインできないようにして、ログインさえすればパイプラインが見られるようにするのは、`--oidc-group`とかでできるのかな？

しかし、力尽きたのでここまでで投稿しちゃいます。

## 追記: missing "username" claim
どのバージョンのConcourseからか、今までOIDCでログインできていたのにできなくなるという現象が発生しました。
エラーメッセージは以下でした。

```
Failed to authenticate: missing "username" claim
```

これは、CONCOURSE_OIDC_USER_NAME_KEYの値のデフォルト値が"username"なのですが、GoogleのOIDCのclaimには含まれていないということのようです。
"email"を指定するようにすると、再度Googleでログインできるようになりました。

参考: https://concourse-ci.org/generic-oidc-auth.html#a-note-about-user-lookup
EC2、SSHポート番号を変更するための手順。


## はじめに

EC2インスタンスにSSHで接続する際ですが、ポート番号をデフォルトの22番ではなく、その他の番号にすることで、少しでもハッキングの危険から逃れたりと、セキュリティ向上に寄与出来るのではないかと思われます。
ということで、今回は題名の通り、SSHポート番号を変更する手順について書きます。


## 手順
- 一時的にセキュリティーグループのインバウンドで22番を認めます。

- 公開鍵を使用して、EC2インスタンスにssh接続をします。
- EC2インスタンス内で`sshd_configファイル`の記述を変更します。具体的には下記コマンドを打ってください。
  - `cd /etc/ssh`
  - `sudo vi sshd_config` (viエディターでファイルを開いています。)
  - #port22　のコメントアウトを外す
  - `port2222`に書き換える。(今回は例でポート番号を2222にしていますが、ここを自分の変更したいポート番号に設定してください。)
  - `sudo service sshd restart`
  
- セキュリティグループのインバウンドで、カスタムTCPルール(今回の場合、TCP2222)を開放してください。
- 一時的に認めていた22番はインバウンドルールから外しましょう。
- ssh接続のコマンドで、末尾に　-p 2222を付けて接続します。具体的には以下のようなコマンドになります。
  - `ssh -i .ssh/秘密鍵ファイル ec2-user@パブリックIP -p 2222`

## まとめ
簡単に手順だけをまとめましたが、これで以上になります。
間違っている点などがありましたら、コメントで教えて頂けますと、幸いです。
ありがとうございました。
C# 8.0のswitch式が書きやすくなるコードスニペット

# switch式

C# 8.0で追加されたswitch式は前からあったswitch文にくらべると格段にスマートです。
`break`,`case`ステートメントが不要になり、さらに強力なパターンマッチングが使えるようになりました。
例で比較するとこのようになります。

曜日のenumを引数としてうけとり、なんらかの文字列をコンソールに出力するメソッドがあったとして、このようになります。

```csharp:switch文
private static void PrintDayOld(DayOfWeek day)
{
    string text;

    switch (day)
    {
        case DayOfWeek.Sunday:
            text = "休日";
            break;
        case DayOfWeek.Saturday:
            text = "だいたい休日";
            break;
        default:
            text = "まれに休日";
            break;
    }

    Console.WriteLine(text);
}
```

👇


```csharp:switch式
private static void PrintDayNew(DayOfWeek day)
{
    var text = day switch
    {
        DayOfWeek.Sunday => "休日",
        DayOfWeek.Saturday => "だいたい休日",
        _ => "まれに休日"
    };

    Console.WriteLine(text);
}
```

# コードスニペット

そんな便利なswitch式ですが、私は記憶力激弱なので、書く時に「あれswitchって条件のまえだっけ？」「caseはいらないんだっけ？」と混乱してしまいます。

一度switch文を書いて、VisualStudioにswitch式にリファクタリングしてもらってもよいですが、そもそもswitch文が長くてダサいからswitch式にしたいので書きたくないです。

なのでコードスニペットを自作してVisualStudioに追加しました。

```xml:SwitchExpression.snippet
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Title>SwitchExpression</Title>
      <Author>soi</Author>
      <Description>switch 式を生成します。</Description>
      <Shortcut>switchex</Shortcut>
    </Header>
    <Snippet>
      <Declarations>
        <Literal Editable="true">
          <ID>expressionswitch</ID>
          <ToolTip>expression switch</ToolTip>
          <Default>expression</Default>
        </Literal>
        <Literal Editable="true">
          <ID>case1</ID>
          <Default>case1</Default>
        </Literal>
        <Literal Editable="true">
          <ID>value1</ID>
          <Default>value1</Default>
        </Literal>
        <Literal Editable="true">
          <ID>defaultValue</ID>
          <Default>defaultValue</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp" Delimiter="$"><![CDATA[$expressionswitch$ switch
{
    $case1$ => $value1$,
    _ => $defaultValue$
};]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>
```

# 使用方法
[SwitchExpression.snippet -GitHub](https://raw.githubusercontent.com/soi013/CodeSnippetsForCSharp/master/CodeSnippets/SwitchExpression.snippet)
上記リンクからダウンロードしたファイルを
VisualStudio＞ツール＞コードスニペットマネージャー＞インポート
で選択してください。

`switchex`と入力すると下記コードに変換されます。`expression`などは<kbd><kbd>Tab</kbd></kbd>でジャンプできます。

```csharp
expression switch
{
    case1 => value1,
    _ => defaultValue
};
```

# 参考
https://ufcpp.net/study/csharp/datatype/typeswitch/?p=5#switch-expression

# 環境
VisualStudio 2019
C# 8
.NET Core 3.1
半導体メーカーファウンドリサービス、ファブレス、垂直統合型デバイスメーカー

応用情報技術者令和元年秋期 午前問66

半導体メーカが行っているファウンドリサービスの説明として，適切なものはどれか。

ア、商号や商標の使用権とともに，一定地域内での商品の独占販売権を与える。
イ、自社で半導体製品の企画，設計から製造までを一貫して行い，それを自社ブランドで販売する。
ウ、製造設備をもたず，半導体製品の企画，設計及び開発を専門に行う。
エ、他社からの製造委託を受けて，半導体製品の製造を行う。

・**垂直統合型デバイスメーカー**(英語: Integrated Device Manufacturer)は、半導体産業において、自社で全工程（設計・製造・組み立て・検査・販売）を一貫して行える設備を有しているメーカーであり、IDMとも呼ばれる。

・**ファブレス（fabless）**とは、その名の通りfab（fabrication facility、つまり「工場」）を持たない会社のこと[1]。工場を所有せずに製造業としての活動を行う企業を指す造語およびビジネスモデルである。

・**ファウンドリ（英語: foundry）**とは、半導体産業において、実際に半導体デバイス（半導体チップ）を生産する工場のことを指す。ファブ (fab) と呼ばれることもある。


・デザインハウスでは、　※設計そのサービスを提供する
設計製造する半導体企業が回路設計の全体、又は一部分の設計作業だけを外部企業であるデザインハウスに委託するので、設計した製品はデザインハウスのものではない

・IP(Intellectual Property)プロバイダ
商号や商標の使用権とともに，一定地域内での商品の独占販売権を与える。

・ODM(Original Design Manufacturer)企業
自社で設計し，自社工場で生産した製品を相手先ブランドで納入する。

＜＜半導体産業における水平分業＞＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/eeb7e75e-a317-1f4f-da6c-c3a9d087e47c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/dc641b63-72bd-dc89-5720-5f94f15ea09d.png)


ーーーーーーーーーーーーーーーーーーー
補足

組込みシステム開発において，製品に搭載するLSIを新規に開発したい。LSI設計を自社で行い，LSI製造を外部に委託する場合の委託先として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e5cf8bd4-0531-8b4e-4522-1015c8f32459.png)

質問自体を注意しましょう。
委託元はファブレスですが、
委託先はファウンドリですね。


参照：

https://www.ap-siken.com/kakomon/01_aki/q66.html
https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A6%E3%83%B3%E3%83%89%E3%83%AA
Basic認証とDigest認証について

## 背景
webページに閲覧制限をもうけるときに、認証方式の違いについて調べたので、備忘録のため以下にまとめる。
## Basic認証  
* Apacheでできるアクセス制限の一つ。  
* ユーザー名とパスワードをBase64という変換方式で変換したデータを送信する。  
* 多くのサーバやブラウザに対応しているため、開発者ユーザーの環境を問わず利用できる。  
  
## Digest認証  
* Apacheでできるアクセス制限の一つ。  
* ユーザーIDとパスワードを入力した際、MD5を用いて解析されにくい状態に変換して送信する。  
  
## Basic認証とDigest認証の違い  
* Basic認証だとユーザーIDとパスワードが加工されずそのまま送信されるため、通信を傍受される危険性がある。  
* Digest認証では全ての環境に対応しているわけではないので不特定多数のユーザーに向けたページの設定には向いてない。
Unityで作成したアプリにおいて、ネットワーク接続を確認する場合に使う「Application.internetReachability」!

筆者の環境：OS:Windows10, Unity 2019.3.5f1 使用言語：C#
利用Asset：DOTween,Destructible2D
筆者のプログラミング歴：2020年1月よりUnity上でC#の勉強を開始。

#ネットワークに接続しているかどうかを確認してくれる「Application.internetReachability」

初制作ゲームにて、Admob広告を掲載したのですがその際に、

**『広告のLoadを待たずにゲームを開始すると、バナー広告の操作が上手くいかず、消すべき時に消せない。』**

という不具合が出たので、広告のLoadが完了するまで、スタートボタンを表示させない、という無理やりな方法で
不具合を回避していました。
その為、インターネット接続していない端末はスタート出来ないので、それに対しての回避策を用意する、という更に面倒な事になっています。
今思えば、愚策中の愚策ですね。

現在開発中のゲームでもランキングを搭載予定なのもあり、ネットワーク接続しているかどうかの確認が出来れば、この問題は簡単に解決出来ると思い、調べてみました！
すぐ見つかりました（というか、一度調べてました）。

**Application.internetReachability**を使えば、ネットワーク接続しているかどうかの確認どころか、接続しているネットワークがWi-Fiなのかキャリアネットワーク（4Ｇとかですね）なのか？も、わかるそうです。

　●**NotReachable :**　インターネットに接続していない
　●**ReachableViaCarrierDataNetwork :**　キャリアネットワークで接続している
　●**ReachableViaLocalAreaNetwork :**　Wi-Fiでネットワークに接続している

以下、実装例。

~~~C#
void CheckNetwork()
    {        
        if (Application.internetReachability == NetworkReachability.NotReachable)
        {            
            Debug.Log("ネットワーク接続無し");
        }
        else if(Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork)
        {
            Debug.Log("キャリアネットワークに接続");
        }
        else if((Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork)
        {           
            Debug.Log("Wi-Fiネットワークに接続");
        }
    }
~~~

実際スマホアプリで使用する場合は、ネットワーク接続が無ければ、警告を表示するとかになりますね。
今回の筆者の場合は、スタートボタンは最初から表示しておいて、ボタンを押した時に広告Loadとネットワーク接続の確認をして、それぞれ処理を行う、って感じで実装する事になると思います。

ここまで読んでいただき、ありがとうございました。


参考にさせていただいたサイト：エクスプラボ 様
https://ekulabo.com/network-reachability
JS (TS) で CLI を作る要点メモ

## 概要

Node.js で CLI を作ったので備忘録として作り方の要点をメモします。
npm 等には公開せず、ローカル環境での実行のみを想定しています。

## 環境

Node.js 12.13.0

## 要点

### `package.json` で `bin` を指定

コマンドラインから実行するコマンドと、コマンドを実行した際に実行されるスクリプトファイルを指定。

```json:package.json
{
  "bin": {
    "my-cli-name": "bin/cli.js"
  }
}
```

### `bin` で指定したスクリプトを作成

シェバンで node を指定して、実行したい処理を記述します。

```js:bin/cli.js
#!/usr/bin/env node

require('../dist/app.js');
```

### その他作法

- プロジェクト内の JSON 等静的テキストファイルは `require` で読み込むようにする。
  - `path.resolve` を使うとバンドルされた後や `bin` ディレクトリからの実行時に `__dirname` の挙動が変わる。(10割勉強不足)
  - 静的ファイルは `require` でスクリプト内に埋め込んでしまうのが、時間が無い時は学習コスト掛からず手っ取り早い。
  - テンポラリファイル等の置き場所の解決はどうするのが良いのかまだ判断ついてない。

### 作ったコマンドのインストール

```bash
# プロジェクトのディレクトリで
npm link
# または
npm install -g .
```

## 振り返り

cli で動くプログラムをまともに作ったのが初めてだったのだけど、
今回シングルプロセス/シングルスレッド + 同期 I/O で作っちゃったので処理速度が結構遅くなりました。
非同期 I/O と Worker Threads を覚えるとよさそう。
【JavaScript】promise/then を async/await に書き換えるとこうなる。【非同期処理】


# あらすじ
世の中はまだまだPromise/then方式のドキュメントが多く、
シンプルにasync/awaitで書きたいときに混乱するので、変換方法をまとめました。

# 登場人物

```JavaScript
function bePromise() { /*今回実行したい非同期処理（=Ajaxなど）*/ } 
function isSuccess() { /*bePromise()が成功か失敗か判断する処理*/ }
function ifSuccess() { /*bePromese()が成功した際に実行したい処理*/ } 
function ifFailure() { /*bePromese()が失敗した際に実行したい処理*/ } 

let responseData; // bePromise()が成功した際の返り値
let errorData; // bePromise()が失敗した際のエラーの内容
``` 

# Promise / then

```JavaScript
function(){
  bePromise()
    .then( (responseData)=>{
      ifSuccess();
    }
    .catch( (errorData)=>{
      ifFailure();
    });
}
```

# async / await

### 変数定義方式

```JavaScript
async function(){
  const responseData = await bePromise();
  if( isSuccess() ){
    ifSuccess();
  }else{
    ifFailure();
  }
}
```

### メソッドチェーン方式

```JavaScript
async function(){
  await bePromise()
    .then( (responseData)=>{
      ifSuccess();
    })
    .catch( (errorData)=>{
      ifFailure();
    });
}
```

### try/catch方式

```JavaScript
async function(){
  try{
    const responseData = await bePromise();
    ifSuccess();
  }catch(errorData){
    ifFailure();
  }
}
```

# 補足

今回のように`bePromise()`の後に続く処理が
ひとつの関数にまとめられている場合、

```JavaScript
.then( (responseData)=>{
  ifSuccess();
})
.catch( (errorData)=>{
  ifFailure();
});
```

のようになっている部分を、

```JavaScript
.then( ifSuccess )
.catch( ifFailure );
```

のように、シンプルにまとめることが出来ます。

# 感想
失敗時の処理をどのくらい細かく扱いたいかによって、
いろんな書き方ができるんだなあと思いました。
clang cross compile では case-sensitive file system では大文字小文字を区別しないヘッダを読み込めない

## 背景

llvm-mingw で Windows アプリを cross-compile したい.

しかし, case-sensitive なファイルシステム(e.g. Ubuntu 18.04 + EXT4)では, `#include <Windows.h>` はエラーになる.
(mingw パッケージではヘッダ名はすべて小文字になっているため).

## clang
 
https://reviews.llvm.org/D21113

で case insensitive にするパッチがあるが(2016 年!) 取り込まれていない

## clang-cl

clang-cl(MSVC に擬態するモード)は, しかし case-sensitive であるのを想定しており, `#include <windows.h>` とすると nonportable-include-path warning がでる.

https://github.com/commercialhaskell/stack/issues/3918

## まとめ

```
#ifdef _WIN32
#ifdef __MINGW32__ // mingw gcc, llvm-mingw(clang)
#include <windows.h>
#else // MSVC, clang-cl
#include <Windows.h>
#endif
#endif
```

とりあえずはソースコードにこのように記述して対応するしかない.
安全性の高いパスワードの扱い(Ruby on Rails)

#プログラミングの勉強日記
2020年7月25日　Progate Lv.223
Ruby on RailsⅩⅠ

#概要
　今まで作成したアプリはパスワードが普通の文字列として保存されている。これだと、PCの覗き見やハッキングされデータが盗まれた場合にそのパスワードを使って簡単に他人のアカウントに不正ログインできる。

　→安全性の高いパスワードは万が一覗き見やデータが盗まれてもパスワードの内容がわからない状態である。パスワードを複雑な文字列（暗号化された特殊な文字列）にすることで安全性を高められる。

#Gemfileの編集
　Railsでパスワードを暗号化するときはgem（読み方：「ジェム」）というツールを利用する。gemはRubyやRailsでプログラミングをするときに「よく使う機能」をパッケージ化したものである。様々なgemが存在するが、今回は`bcrypt`という暗号化するためのgemを使う。
　Railsにはインストールしたいgemを記述するGemfileというファイルが存在する。`gem 'gemの名前' `と記述する。`rails new`コマンドで生成されたGemfileにはすでにいくつかのgemが書かれてインストールされている。
　`gem 'gemの名前', 'gemのバージョン' `　とすると、そのバージョンがインストールされる。バージョンを指定しないと、最新のgemがインストールされる。

```:Gemfile
gem 'rails', '5.0.3'
gem 'puma', '3.6.2'

bcryptのインストール
gem 'bcrypt'
```

```:ターミナル
$ bundle install
```

#暗号化する

1. bcryptをインストールすると`has_secure_password`というメソッドが使えるようになる。パスワードを扱うUserモデルに`has_secure_password`を追加する。これでユーザを保存するときに自動的にパスワードを暗号化する。

```ruby:user.rb
class User < ApplicationRecord
  has_secure_password
end
```
　`has_secure_password`はpasswordが存在するか自動的にチェックする。

2. `passwor_digest`カラムを追加する。`has_secure_password`メソッドは暗号化したパスワードを`passwor_digest`カラムに保存する。`rails generate migration`コマンドでマイグレーションファイルを作成し、`passwor_digest`カラムが追加されるように編集する。次に`password`カラムが削除されるように編集する。カラムの削除は`remove_column`を使う。1つのマイグレーションファイルで複数のカラムを変更できる。

```:ターミナル
$ rails generate migration change_users_columns
　マイグレーションファイル変更後
$ rails db:migrate
```

```ruby:2020~_change_users_columns.rb
class ChangeUsersColumns < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :password_digest, :string
    remove_column :users, :password, :string
  end
end
```

3. `password_digest`カラムに暗号化されたパスワードを保持するためには今まで通り`password`に値を代入する。これで、`has_secure_password`によって`password`に代入された値が暗号化され、`password_digest`カラムに保存される。なので、すでにある`password`に関するコードは変更しなくていい。


#暗号化されたパスワードでのログイン
　フォームに入力されたメールアドレスに一致するユーザを取得し、フォームに入力されたパスワードと取得したユーザのパスワードが一致するかを判定する。`has_secure_password`メソッドを有効にすると`authenticate`メソッドを使えるようになる。`authenticate`は渡された引数を暗号化し、`password_digest`の値と一致するかどうかを判定する。`authenticate`メソッドを使って、「送信されたメールアドレスと一致するユーザ」の`password_digest`と送信されたパスワードが一致するかどうかでログイン処理をする。

<img width="447" alt="0725.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/617fc626-9112-2f3b-ad62-26ae876e90a2.png">


```ruby:users_controller.rb
def login
  @user = User.find_by(email: params[:email])
  if @user && @user.authenticate(params[:password])
    
```
共通フレーム2013によれば，要件定義プロセス、企画プロセスで行うこと

応用情報技術者令和元年秋期 午前問65

共通フレーム2013によれば，要件定義プロセスで行うことはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c42a5cfc-4fc5-6b27-0bbd-339cff19d45c.png)



**要件定義プロセス**は、利用者および他の利害関係者が求めるシステムに対する要件を定義することを目的とするプロセスです。システムに関わり合いをもつ利害関係者を識別し、そのニーズおよび要望を抽出する作業が実施されます。

・システム方式設計：システム開発プロセスの基本設計と同じくらいです。


ーーーーーーーーーーーーーーーーーーーーーーーーー

補足：
情報セキュリティマネジメント平成29年秋期 午前問49

共通フレーム2013によれば，企画プロセスで実施することはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/4b4dfd57-b218-2adb-21be-9c9cc3a3a3c3.png)

共通フレーム2013では、**システムライフサイクル**を企画，要件定義，開発，運用，保守の5つのプロセスに分け、各プロセスで実施されるべき作業を定義しています。
このうち企画プロセスでは、
　・システム化構想の立案，
　・及びシステム化計画の立案という2つのアクティビティが定義されています。


ーーーーーーーーーーーーーーーーーーーーーーーーー

補足２：
情報セキュリティマネジメント平成28年秋期 午前問49

共通フレームによれば，企画プロセスにおいて明確にするものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/bdd89513-a393-9cd5-ea01-eced8f586118.png)


**企画プロセスの目的**は、経営事業の目的、目標を達成するために必要なシステムに関係する要求事項の集合とシステム化の方針、及びシステムを実現するための実施計画を得ることである。

企画プロセスは、
　・新たに取得・開発するシステムの構想を立案し、
　・システム化を行うための計画を得るプロセス群です。
経営戦略や情報システム戦略に基づいて対象業務を分析し、システム化の範囲、システム化後の業務形態、概算コスト、投資効果、プロジェクト計画などシステム化の**全体像**を明らかにします。


ーーーーーーーーーーーーーーーーーーーーーーーーー

補足３：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/258bf9a2-41fb-3316-eeba-f65976471e0b.png)


企画プロセスを構成する2つのプロセスの目的です(共通フレーム2013より引用)。「新たな業務の全体像を得る」という文が記載されています。
・システム化構想の立案プロセス
　経営上のニーズ、課題を実現、解決するために、置かれた経営環境を踏まえて、新たな業務の全体像とそれを実現するためのシステム化構想及び推進体制を立案すること

・システム化計画の立案プロセス
　システム化構想を具現化するために、運用や効果等の実現性を考慮したシステム化計画及びプロジェクト計画を具体化し、利害関係者の合意を得ること



参照：
https://www.ap-siken.com/kakomon/29_aki/q64.html
https://www.sg-siken.com/kakomon/29_aki/q49.html
https://www.sg-siken.com/kakomon/28_aki/q49.html
https://www.itpassportsiken.com/kakomon/30_aki/q28.html
Laravelのmigrationで詰まった話

Laravelで、todoアプリを作成中です。
migrationのファイルを作成し、
ターミナルにて

```
＄php artisan migrate
```

いざ！実行！

エラーが出ました。
エラー内容は以下の通りです。

```
  Illuminate\Database\QueryException  : SQLSTATE[42000]: 
Syntax error or access violation: 1071 Specified key was too long; 
max key length is 767 bytes (SQL: alter table `users` add unique 
`users_email_unique`(`email`))
```

指定されたキーが長すぎます。キーの最大長は767バイトです。と



参考にさせていただいた記事
https://qiita.com/beer_geek/items/6e4264db142745ea666f

mysqlをアップデートしました。
Go言語でTimestamp文字列のパースに手間取った話

今までほぼPython一筋でしたが，最近Goを始めてみました。
新しい言語に手を出すと，他の言語ならすぐできるような簡単なことでも非常に引っかかりますね。
ということで，今日起きたそんな一幕をメモがてら記事にしてみました。

# やろうとしたこと
Go言語で`2020-01-01T09:00:00Z`のような文字列から，日本時間における年・月だけ取り出して，つなげて`202001`のようなint型を返す。

# 最終的に行き着いたやり方
```Go

import (
	"strconv"
	"strings"
	"time"
)

func createYearMonth(stringTimestamp string) int {
    // 1. 文字列を日時オブジェクトへとパース
    // "2020-01-01T09:00:00Z" -> 2020-01-01 09:00:00 +0000 UTC
	t, err := time.Parse(time.RFC3339, stringTimestamp)
	if err != nil {
		fmt.Println("Parse Error: ", err.Error())
	}

    // 2. timezoneの変更
    // 2020-01-01 09:00:00 +0000 UTC -> 2020-01-01 18:00:00 +0900 JST
	loc, _ := time.LoadLocation("Asia/Tokyo")
    t_jst := t.In(loc)

    // 3. Year, Month部分を文字列のまま取得し結合
    // "2020-01-01 18:00:00 +0900 JST" -> ["2020", "01", "01 18:00:00 +0900 JST"]
	splitTimestamp := strings.Split(t_jst.String(), "-")
    // "2020" + "01" -> "202001" -> 202001
	intYearMonth, _ := strconv.Atoi(splitTimestamp[0] + splitTimestamp[1])

	return intYearMonth
}
```

# 詰まったところ
## 1. 文字列を日時オブジェクトへとパース

最初は以下のようにtimestampのフォーマットとなるlayoutを自分で適当に定義してパースしようとしました。

```Go
layout := "1970-01-01T00:00:00Z"
t, err := time.Parse(layout, "2020-01-01T09:00:00Z")
```

ただし，これではうまくパースしてくれず。

`time`パッケージの[公式ドキュメント](https://golang.org/pkg/time/#pkg-constants)を見たところ，パッケージ側でconstantとしてフォーマットがいくつか用意されていることを知り，`RFC3339`という今回の入力に最も近いもの`"2006-01-02T15:04:05Z07:00"`をlayoutとして使いました。

## 2. timezoneの変更

最初は以下のようにパース部分でtimezoneの指定も同時に行おうとしていました。

```Go
loc, _ := time.LoadLocation("Asia/Tokyo")
t, err := time.ParseInLocation(time.RFC3339, stringTimestamp, loc)
```

しかしこれをやっても，得られた`t`は**UTCのまま**です。

どうやら上記の`ParseInLocation`におけるtimezoneの指定は，入力文字列からはtimezoneが判断できない時のためのもののようです。

今回はそもそも入力が`"2020-01-01T09:00:00Z"`のようにUTCであることが明記されていたので，意味をなさず。

timezoneそのものを変更するには，

```Go
loc, _ := time.LoadLocation("Asia/Tokyo")
t_jst := t.In(loc)
```
のように後から変換を行うのが正解でした。

## 3. Year, Month部分を文字列のまま取得し結合

こちらはやや力技です。

`.Year()`と`.Month()`で簡単に年・月を取得できるので，単純に考えれば，

```Go
stringYearMonth := fmt.Sprintf("%d%d", t.Year(), t.Month())
```

で澄むはずの話です。

が，これで得られるのは，`"20201"`であって`"202001"`ではないのです。

`t.Month()`がint型なのが問題でした。

ということで，少し遠回りですが，日時オブジェクトを文字列に再変換した後，ハイフン`-`で文字列を分けて年・月だけ繋げる，という廻りくどいことを行っています。

ここもう少しスマートにやる方法あるかも，，，

<font color="red">2020.07.26 追記</font>

なんてことはない，`%d`で文字数を指定すれば簡単にできました。

```Go
stringYearMonth := fmt.Sprintf("%04d%02d", t.Year(), t.Month())
```

# まとめ（？）

とりあえず動いた，よかった！

一応無理やりポイントとなる話を拾い出すと，

- 文字列timestampをパースする際のlayoutは，なるべく`time`パッケージ側で用意されているフォーマットを使う。
- timezoneの変更は，`.In()`を使う。

あたりかなと。

もっとこうやると簡単にできるよ，というのがあれば是非お寄せください！
TCOの算定

応用情報技術者令和元年秋期 午前問62

TCOの算定に当たって，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/724a96b1-d8ec-a0e7-080a-a60e262db896.png)

**TCO(Total Cost of Ownership)**は、ある設備・システムなどに関する、取得から廃棄までに費用の総額を表します。TCOは、初期投資額であるイニシャルコストと、維持管理費用であるランニングコストに大別できます。

１、イニシャルコストの例
ハードウェア購入・設置費用、パッケージソフトの購入費用・開発費、初期教育費など
２、ランニングコストの例
保守・サポート契約費、ライセンス料、運用人件費、消耗品費など


埋没原価とは、過去に支出された費用や、意思決定に内容にかかわらず回収できない費用のことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0a543d9b-40d5-90cc-5052-7a1152ded792.png)


From　https://www.ap-siken.com/kakomon/01_aki/q62.html
【AWS】ログイン - ルートユーザーサインイン

# アカウント使用の流れ

0. [開始前知っておくべきポイント](https://qiita.com/hello112334/items/d9beef22cc5d66fbf578#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E4%BD%BF%E7%94%A8%E3%81%AE%E6%B5%81%E3%82%8C)
1. [アカウント申請](https://qiita.com/hello112334/items/39548933eeec92af8486)
2. **ログイン**
3. [IAM設定](https://qiita.com/hello112334/items/052f1232f6f54a2531c1)
4. [MFA多要素認証](https://qiita.com/hello112334/items/2180a1f59c4d4d69d4a4)
5. [アカウント削除](https://qiita.com/hello112334/items/a7943f064221b4bf0870)

## ログイン
AWS公式サイトURL
https://signin.aws.amazon.com/signin?redirect_uri=https%3A%2F%2Fportal.aws.amazon.com%2Fbilling%2Fsignup%2Fresume&client_id=signup

#### １.Eメールアドレス
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/3c99840c-ce1c-f291-0dcf-473eceeaa279.png)

#### ２.パスワード
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/bc8aaf74-bdb8-c6f8-dc03-7f829ab596db.png)

#### ３.AWSマネジメントコンソール
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/6cc660a0-aad9-4c55-0dcc-fe11f0b2acae.png)
エラー解決（divクラス記述忘れ）


#ロード時にモバイルメニューが表示してしまうエラー

[![Image from Gyazo](https://i.gyazo.com/47e8a59f2e3c4ffe85d8c0d82adc87c2.gif)](https://gyazo.com/47e8a59f2e3c4ffe85d8c0d82adc87c2)


#####モバイルメニュー部分のHTML、CSSやjavascriptの記述ミスがないか確認したがわからなかった。


###参考サイトボタンの `<div class="nostalgic__btn appear up">` 記述が削除してしまっていた


[![Image from Gyazo](https://i.gyazo.com/b5dc2db5008e7c0cd37d902a7d92bde3.png)](https://gyazo.com/b5dc2db5008e7c0cd37d902a7d92bde3)

[![Image from Gyazo](https://i.gyazo.com/efb1f024e669471fdf772993589b74dc.png)](https://gyazo.com/efb1f024e669471fdf772993589b74dc)


###全く別の部分を直したら、ロード時にモバイルメニューが表示してしまうエラーが直った


[![Image from Gyazo](https://i.gyazo.com/205cac0864a971492e4b6581c5030d50.gif)](https://gyazo.com/205cac0864a971492e4b6581c5030d50)


今回、エラーしている部分だけを見るのではなく、他の記述にもミスがあると別の場所に影響することを学んだ。
なぜ別の場所の記述ミスが影響したのかまではわからなかった。
BCPの説明

応用情報技術者令和元年秋期 午前問61

BCPの説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/01dde8c5-94a0-2db3-b584-1c1915eb5391.png)


**BCP**(Business Continuity Plan，事業継続計画)は、予期せぬ災害が発生した場合に、最低限の事業を継続し、または早期に復旧・再開できるようにする企業が定めた行動計画です。


経済産業省や厚生労働省の資料では、BCPの発動から全面復旧に至るまでを以下の4段階のフェーズに分けています。
**1.BCP発動フェーズ**
災害や事故の発生（或いは発生の可能性）を検知してから、初期対応を実施し、BCP発動に至るまでのフェーズ
**2.業務再開フェーズ**
BCPを発動してから、バックアップサイト・手作業などの代替手段により業務を再開し、軌道に乗せるまでのフェーズ
**3.業務回復フェーズ**
最も緊急度の高い業務や機能が再開された後、さらに復旧する業務の範囲を拡大するフェーズ
**4.全面復旧フェーズ**
代替設備・手段から平常運用へ切り替えるフェーズ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7b4a6216-7bea-77d7-72ee-f6bbb72fa369.png)


補足：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/20cdc6c4-085d-86ce-b0c4-ebebb86dc901.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/00db38e6-3b21-b370-8797-cb44f8ea01b5.png)

アカウンタビリティ(企業の説明責任)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/916d9464-b08f-178f-bc67-2f0f5580b7b9.png)


From https://www.fe-siken.com/kakomon/23_aki/q61.html
https://ja.wikipedia.org/wiki/%E8%AA%AC%E6%98%8E%E8%B2%AC%E4%BB%BB
参考にしたネットワーク関連記事置き場

## OSI参照モデル
[OSI参照モデル](https://ja.wikipedia.org/wiki/OSI%E5%8F%82%E7%85%A7%E3%83%A2%E3%83%87%E3%83%AB)

## TCP
[TCP（Transmission Control Protocol）](https://www.atmarkit.co.jp/ait/articles/1612/05/news030.html)

## コマンド
[TCP/IP通信の状態を調べる「netstat」コマンドを使いこなす](https://www.atmarkit.co.jp/ait/articles/0207/20/news003.html)
[traceroute](http://e-words.jp/w/traceroute.html)
[tracerouteを３つのプロトコルで試す](https://qiita.com/att55/items/473f6372eb6721546678)
[【Linux】traceroute の結果(!X, !H, *アスタリスク)の原因/理由,利用ポートについて～](https://milestone-of-se.nesuke.com/sv-basic/linux-basic/traceroute-result/)
[MacでNetstatコマンドを使用する方法](https://jpn.4meahc.com/how-use-netstat-command-mac-74611#menu-1)
[lsofコマンド](https://www.atmarkit.co.jp/ait/articles/1904/18/news033.html)

## 実務
[[メモ]ネットワーク接続トラブル時の問題切り分け方法](https://qiita.com/Yorinton/items/621dd1efaf3e8ee34aa4)
[iproute2mac](https://github.com/brona/iproute2mac)
[Macで使用しているポートを調べる方法とポートを使用しているプログラム確認方法](https://do-zan.com/mac-search-using-port/)
[Macでネットの通信が遅い時にnetstatとlsofコマンド使って調べてみた](https://polidog.jp/2016/05/24/tcp/)

## ネットワーク性能
[【図解】スイッチング処理能力 ～bpsとppsの違い,換算方法,ショートパケットとロングパケット～)](https://milestone-of-se.nesuke.com/nw-basic/as-nw-engineer/bps-pps/#:~:text=bps%20%E3%81%AF%20bit%20per%20second,%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E6%95%B0%E3%82%92%E8%A1%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
[ネットワーク機器の処理性能について](https://www.itbook.info/study/p24.html)
UniRx 押した時と離れたときの間隔の短いタップを検出する

# 概要
ポインターが押された時と離された時の間隔が一定以下のときだけ発火する物をUniRxで作成しました。

赤のエフェクトは押されたこと、青は離されたことを示します。その間隔が短いときだけLogが出力されてます。
![shorttap.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/fad9a71a-fb89-7f81-9e42-0652c6029a76.gif)

プロジェクト全体はこちらから
https://github.com/Arihide/unirx-shorttap

# 説明
短いのでソースコード丸ごと乗っけます。

```csharp
using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UniRx;
using UniRx.Triggers;

public class ShortTap : UIBehaviour
{
    protected override void Awake()
    {
        base.Awake();

        const double shortTapThreshold = 200d;

        this.OnPointerUpAsObservable()
            .Timestamp() // 時間情報付与
            .WithLatestFrom( // ポインターが離れたとき、最後に押された時の情報と合体させる
                this.OnPointerDownAsObservable().Timestamp(),
                (l, r) => new { up = l, down = r }
            )
            // 押した時と離れたときの間隔が shortTapThreshold 以下のときだけ通す
            .Where(pair => (pair.up.Timestamp - pair.down.Timestamp) <= TimeSpan.FromMilliseconds(shortTapThreshold))
            .Subscribe(_ => Debug.Log("Short Tap!"));
    }

}
```
やってることとしては、
- ポインターが離れたときに、最後にポインターが押されたときの情報とニコイチにする
- 押された時と離れたときの時刻を比較し、閾値以下なら通す
という感じですね。

この方法は押されたときではなく、離れたときに発火するのがミソです。
また、条件式を調整すればロングタップなどにも対応できます。
MacでGoの開発環境構築

## Mac環境
```
% sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.5
BuildVersion:	19F101

% echo $SHELL
/bin/zsh

% zsh --version
zsh 5.7.1 (x86_64-apple-darwin19.0)
```
## 環境構築手順
1. [Goの公式サイト](https://golang.org/dl/)から、Goの本体をダウンロードしましょう。
![スクリーンショット 2020-07-25 17.29.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272102/32aa5dde-fda6-aea7-7510-3bdfa4a6513e.png)

1. ダウンロードしたpkgファイルをダブルクリックして、インストールしましょう。
特に注意すべきところはありません。
<img width="735" alt="スクリーンショット 2020-07-25 17.33.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272102/f83f721d-37bd-8b83-aeb6-8efb14aa7aba.png">

1. Goが正しくインストールされたか、コマンドで確認してみましょう。

    ```
    % /usr/local/go/bin/go version
    go version go1.14.6 darwin/amd64
    % go version
    go version go1.14.6 darwin/amd64
    ```

1. Goは、外部のライブラリが格納される場所を、環境変数GOPATHで管理しています。
ここでは、まず空のディレクトリを作りましょう。

    ```
    % mkdir ~/go
    ```
それから、GOPATH環境変数の設定を「~/.zshrc」の末尾に追記しましょう。

    ```ruby:~/.zshrc
    export GOPATH="$HOME/go"
    ```
「~/.zshrc」は、ユーザーのログイン時に一度だけ読み込まれるため、ファイルを書き換えただけでは設定が反映されません。少し乱暴ですが、

    ```
    % source ~/.zshrc
    ```
で強制的に「~/.zshrc」を読み込ませることができます。
最後に、環境変数GOPATHが設定されていることを確認しましょう。

    ```
    % echo $GOPATH
    /Users/[ユーザー名]/go
    ```
1. これでGoのインストール作業は完了です。

## 動作確認
1. 下記「Hello, World」プログラムを書いて、Goで実行して見ましょう。

    ```ruby:hello.go
    package main
    
    import "fmt"
    
    func main() {
      fmt.Println("Hello, World")
    }
    ```

1. 下記コマンドでビルドして、同じディレクトリに「hello」実行ファイルができることを確認しましょう。

    ```
    % go build hello.go

    % ls
    hello		hello.go
    ```
1. 「hello」実行ファイルを実行してみましょう。

    ```
    % ./hello
    Hello, World
    ```
Goは基本的にコンパイルを前提とした言語ですが、ビルドプロセスを隠蔽したコマンド```go run```を使えば、ソースファイルを直接実行することもできます。

    ```
    % go run hello.go
    Hello, World
    ```

## 参考ページ
- [[Mac] Goのアンインストール](https://qiita.com/Nekonecode/items/8561bbe27830090bc70c)
- [Go 公式サイト　Getting Started](https://golang.org/doc/install)
devise 導入 メモ

#devise導入メモ
deviseの導入時の流れを簡単にメモ:man_tone2:

##流れ

1. Gemのインストール
2. フラッシュメッセージの追加(飛ばしてもOK)
3. deviseのViewファイルのインストール
4. Userモデルの作成
5. Usersテーブルの作成
6. ヘッダーの非表示 (飛ばしてもOK)

参考 [devise公式GitHub](https://github.com/heartcombo/devise)



####1. Gemのインストール

Gemfileにdeviseのgemを追加

```
gem 'devise'
```

```
$ bundle install
```

deviseのインストール

```
$ rails generate devise:install
```

####2. フラッシュメッセージの追加(飛ばしてもOK)

```
<% if flash[:notice] %>
   <div class="alert alert-info">
     <%= flash[:notice] %>
   </div>
 <% end %>
 <% if flash[:alert] %>
   <div class="alert alert-danger">
     <%= flash[:alert] %>
   </div>
<% end %>
```

####3. deviseのViewファイルのインストール

```
$ rails generate devise:views
```

#### 4. Userモデルの作成

```
$ rails g devise User
```

routes.rbにdeviseのルーティングが追加される

```routes.rb
devise_for :users
````

####5. Usersテーブルの作成

先程モデルを作成したのでテーブルを作成

```
$ rails db:migrate
```

この時点でdeviseの導入は完了！！
サインアップかサインインページにアクセスすればページが表示されます。


####6. ヘッダーの非表示 (飛ばしてもOK)

deviseを導入するといくつかdeviseのヘルパーメソッドが使えるようになるので
その1つを使ってサインインしていないユーザーにはヘッダーを非表示にします。

ヘッダーがいくつかのページで表示されることを想定してpartial化されている場合
renderしている最後に「if current_user」を追加。

```
<%= render 'partial/header' if current_user %>
```

こうすることによって「current_user」がサインインしているかを条件式が確認してヘッダーを表示/非表示してくれます。

参考 devise系
[devise公式GitHub](https://github.com/heartcombo/devise)
[Rails deviseで使えるようになるヘルパーメソッド一覧](https://qiita.com/tobita0000/items/866de191635e6d74e392)
[devise にusername カラムを追加し、usernameを登録できるようにする。](https://qiita.com/yasuno0327/items/ff17ddb6a4167fc6b471)
Git　コンフリクトの解消

## コンフリクトとは
AとBの作業ブランチがあるとする。
まずAがリモートリポジトリにプッシュされ、マージされる。
次にBがリモートリポジトリにプッシュされる。
このとき、　AとBで変更内容に対立が起こった場合、どちらを採用すればようのか分からなくなる。
この対立をコンフリクトという。


## コンフリクト発生
GitHubにプッシュした際に以下の表示が出たらコンフリクトが起きているということ。
<img width="659" alt="コンフリクト発生.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639096/655d234e-5774-2666-99b7-6c9666f8f3b4.png">

## 解消の流れ
1.ローカルでmasterブランチに切り替える
2.リモートのmasterブランチをプルする
3.作業ブランチに切り替える
4.masterブランチをマージする
5.コンフリクトが発生している部分を修正する
6.リモートにプッシュする

#### 1.ローカルでmasterブランチに切り替える

```
$ git checkout master
```

####2.リモートのmasterブランチをプルする

```
$ git pull origin master
```

####3.作業ブランチに切り替える
```
$ git checkout B_branch
```

####4.masterブランチをマージする

```
$ git merge master
```

####5.コンフリクトが発生している部分を修正する

<img width="568" alt="コンフリクト発生部分.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639096/8e19b10d-7f34-f54b-e68f-4a8db222ec96.png">

<<<<<<< HEAD
ここが作業ブランチの変更内容

=======

ここがmasterの変更内容
.>>>>>>> master


今回は両方の変更を取り込むことにします。

#### 6.リモートにプッシュする

```
$ git add .
```

```
$ git commit -m "コンフリクト解消内容"
```

```
$ git push origin HEAD
```

<img width="659" alt="コンフリクト解消.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639096/803fa958-33ed-7f09-7798-27dfb76980a4.png">



これでコンフリクトが解消できました！
micro:bitでKeigan Motorを動かしてみる

# 動機

- micro:bitの拡張機能の検索窓で偶然KeiganMotorのプラグインを見つけたので使ってみました。

# 事前の注意点

- 最新のMakeCode editorには対応していないようです（2020.07.25時点）
- MakeCode エディタはV1の[旧バージョン](https://makecode.microbit.org/v1)を使う必要があります。
- Keigan 本体のファームウェアを2.0.６以上にする必要があります。
- [ファームウェアのアップデート方法](https://docs.keigan-motor.com/firmware/update)

# やってみた手順

- セットアップについては、[マイクロビットの拡張モジュールのリンク先：日本語版](https://github.com/keigan-motor/pxt-KeiganMotor/blob/master/README_ja.md)に従って進めました。
- 上のページの重要というところが、KeiganMotor固有の設定をする必要があります。

# やってみて、ハマったところ

- micro:bitモードになったかどうかの確認
- [■]を10回押すと、LEDが黄色になって2秒間点滅する。＜これは上のサイトをよく読むと、ちゃんと書いてあった。
- nameをみつけることには、苦労しなかったが、なかなか、動いてくれなかった（なぜ、動いたのかも、不明）
- たぶん、MakeCodeエディータの旧バージョンで作業するためか、不安定なのかもしれないです。
- 命令ブロックの次には、待ち時間を入れないと行けないようでした。

# とりあえず、回りました！

- [最初に作成したモータを１つ動かすプログラム](https://makecode.microbit.org/_M2Ue4WHooiih)
    - プログラムが起動するとLEDが赤色に点灯→60rpmで正転10秒→モータ停止→LED白色点灯
- [2つのモータを動かしてみた](https://makecode.microbit.org/_H8kLzH1h8ezW)
- 上のプログラムにモータを１つ加えて、マイクロビットのAボタンを押すと追加したモータが回る
    - Aボタンを押すと、LEDが紫に点灯→60rpmで逆転10秒→モータ停止→LED黄色点灯
 

# 参考サイト

- [マイクロビットの拡張モジュールのリンク先：日本語版](https://github.com/keigan-motor/pxt-KeiganMotor/blob/master/README_ja.md)
- [製品サイト](https://keigan-motor.com)

# 著者の情報

- [本家のホームページ](http://www2-doi.ct.osakafu-u.ac.jp)
- [かんたんマイコン教室！！](https://www.youtube.com/channel/UC41qeaw-dXNdl0puKkXiuKA)【YouTubeチャンネル】
- [かんたんマイコン教室のQiita](https://qiita.com/tmdoi/items/61be444e1879912aa2a5)
- [本家の過去ページ](https://goo.gl/5vj2Mv)
- [Qiitaの土井研究室ホームページ](https://qiita.com/tmdoi/items/1e4e3d449e86ca2445eb)
- [駆動ロボットのFacebookページ](https://www.facebook.com/QDRdoilab/?ref=bookmarks)
pandasでcsv読み込み　matplotlibでグラフ

メモです。
## サンプルコード

```python:pandas_matplotlib.py

import pandas as pd #csv読み込みなどもできる
import matplotlib.pyplot as plt#グラフ描写

file_name = "test.csv"
""" test.csv の中身↓
1, 3, 5
2, 4, 6
"""

#ヘッダーがcsvにないので読み込み時に追加
name_ = ["X", "Y", "Z"]
df = pd.read_csv(file_name, names=name_, encoding='cp932')
print(df)

# fig = plt.figure()
# ax = fig.add_subplot(1,1,1)

#グラフ(X, Y) とグラフ(X, Z)の重ね合わせ
ax = df.plot(x="X",y="Y", color="b", label="Y")
df.plot(x="X",y="Z", color="r", label="Z", ax=ax)
ax.set_xlabel("label_X")
ax.set_ylabel("label_YZ")
plt.show()
fig = ax.get_figure()
fig.subplots_adjust(bottom=0.2)#はみ出し阻止
fig.savefig("pandas_matplotlib.png")
```

## 結果 

```
   X  Y  Z
0  1  3  5
1  2  4  6
```

![pandas_matplotlib.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503403/71abd53d-d894-673b-4ad9-7b4dfa42a122.png)