OmniAICreator/Qiita-1.07M huggingface dataset:
Python Matplotlib の使い方　～東京の夏の気温調査で使ってみた～

#はじめに
PythonにはMatplotlibというグラフを描くためのライブラリが用意されています。Matplotlibの初歩的な使い方を覚え書きとして記すとともに、東京の夏の気温の変化をグラフ化してみます。
#まずやってみる
```Python
import matplotlib.pyplot as plt
plt.plot(X, Y)
# X：X軸の配列 Y：Y軸の配列
```
これだけでグラフは描けます。
例えば、$x^3$のグラフを描いてみます。

```Python
X = [n for n in range(1,100)]
Y = [(x-50)*x**2 for x in X]
plt.plot(X, Y)
```
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112426/fb159fd9-b447-79c4-0056-07e7b88bfc44.jpeg)

２つ以上のグラフを重ねることもできます。

```Python
Z = [x*(x-40)*(x-80) for x in X]
plt.plot(X, Y)
plt.plot(X, Z)
```
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112426/458b6c1d-9ac4-645e-7429-82b9a3f1c4f9.jpeg)


#東京の夏の気温調査
気象庁に過去の気象データがある。（[過去の気象データ・ダウンロード](https://www.data.jma.go.jp/gmd/risk/obsdl/index.php)）
これを年別に8月の平均気温をMatplotlibを使ってグラフ化してみる。
折角なので Pandas を使ってグラフの元データを抽出してみることにした。
※　ダウンロードしたCSVファイル
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112426/d19ee29e-8fa6-4594-bc6b-f000d83ba144.png)

上記のCSVファイルをPandasで読み込んでみる。（Pandasで処理できるようにヘッダをアルファベットに変更している）

```Python
import pandas as pd
df = pd.read_csv("tokyo.csv")
df
```
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112426/faa70190-51fe-470e-d072-83fc99c1caaf.jpeg)
気温（temp）に値の無い年があるため、これを dropna() で取り除く。

```Python
df.dropna()
```
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112426/b74803a0-b12e-58c6-c1d0-994a8df13c86.jpeg)
更に、8月だけを取り出して、X軸（年月）、Y軸（月平均気温）を作って、Matplotlibでグラフを描いてみる。


```Python
X = df.dropna().query('year.str.contains("\\/8")')['year']
Y = df.dropna().query('year.str.contains("\\/8")')['temp']
plt.plot(X,Y)
```
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112426/5ecb941c-7020-b703-60fe-7dfaee172866.jpeg)

X軸（年月）が読めないので、横幅を広げて、縦表示に変更してみる。

```Python
plt.figure(figsize=(16, 5))
plt.xticks(rotation='vertical')
plt.plot(X,Y)
```
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112426/fc27d189-ef9f-8b15-957b-f4185de00c44.jpeg)
年を追うごとに気温が上昇しているように見えます。
上記のグラフに札幌、那覇のデータも加えてみます。

```Python
df3 = pd.read_csv("naha.csv")
X3 = df3.dropna().query('year.str.contains("\\/8")')['year']
Y3 = df3.dropna().query('year.str.contains("\\/8")')['temp']
df5 = pd.read_csv("sapporo.csv")
X5 = df5.dropna().query('year.str.contains("\\/8")')['year']
Y5 = df5.dropna().query('year.str.contains("\\/8")')['temp']
```
東京を青、札幌を緑、那覇を赤でグラフ表示してみます。

```Python
plt.figure(figsize=(16, 5))
plt.xticks(rotation='vertical')
plt.plot(X,Y,color='blue')
plt.plot(X3,Y3,color='red')
plt.plot(X5,Y5,color='green')
```
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112426/8897969b-42f3-6336-f363-879f5a2bd079.jpeg)
グラフを見た限りでは、東京が徐々に那覇の気温に近づいて行ってます。
一方で札幌は少し気温が上昇しているようにも見えますが、上り幅は東京ほどではない感じです。

#まとめ
Matplotlibの勉強を兼ねて東京の夏の基本調査をやってみました。
Matplotlibには、ここで使ったもの以外にもパラメーターが数多くあり、細かな制御ができるようです。
ただし、X軸の配列、Y軸の配列を用意して plot すればグラフが描ける点を押さえておけば、気軽で便利に使える道具です。
※全て Jupyter notebook 上で実行しています。
Webサイトのトップページからそのページまでの経路情報

応用情報技術者平成30年秋期 午前問24

利用者が現在閲覧しているWebページに表示する，Webサイトのトップページからそのページまでの経路情報を何と呼ぶか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b00b1f56-5d0a-646a-81e1-3b04a994b35e.png)


１、パンくずリスト（breadcrumb list）
パンくずリストとは、ユーザーが今WEBサイト内のどの位置にいるのかを視覚的に分かりやすくするため、上位の階層となるWEBページを階層順にリストアップしてリンクを設置したリストのことを指します。通常はコンテンツの最上部に記載されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b0fc688b-edda-181b-3b5a-67853d449802.png)

なぜそのよう妙な名前とすると、
「パンくずリスト」という名前は、童話『ヘンゼルとグレーテル』で、主人公が森で迷子にならないように通り道にパンくずを置いていった、というエピソードに由来する。


２、サイトマップは、
Webサイトにあるコンテンツを項目立てて一覧表示したものです。利用者がどのようなコンテンツがあるのかを素早く認識でき、目的の情報にたどり着きやすくなる利点があります。


３、ナビゲーションバーは、
Webサイトがどのようなコンテンツがあるかを知らせ、コンテンツへの誘導を促すメニューの役割をもつUI部品です。サイト内で共通してページの固定位置に設置することで利用者を迷わせないメリットがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/6d0c84a5-7709-7aae-1cb0-1cc3b583b360.png)


参照：
パンくずリスト
https://www.seohacks.net/basic/terms/breadcrumb-list/

https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%B3%E3%81%8F%E3%81%9A%E3%83%AA%E3%82%B9%E3%83%88

ナビゲーションバー
https://art-break.net/tech/?p=2690
PowerBI Tips

#PowerBIからRedshiftのデータを参照する

####AWS上のRedshiftを直接参照する場合
・アクセスキー
・シークレットアクセスキー
上記を指定することでインターネット越しにRedshiftを利用可。
HTTPSで通信すると考えられる。

####オンプレミスデータゲートウェイ(OPDG)を利用する場合
Redshift以外のDBを使用したり、Redshiftをプライベートサブネットで使用する場合はOPDGが必要

####OPDGはRestAPIを使っています
・RestAPIはアクセストークンとシークレットキー(正しい表現はAPI keyとAPI Secret)が必要
・アクセストークンにはパーミッションを与えるので、利用者が権限を規定できる
・通信はHTTP/HTTPSを使用する

#PowerBIでピボットを行う
####年月ごとに複数の金額列をピボットしたい場合。
１．年月列を選択してピボットを選択し、列にどれかの金額を選択する
２．ピボットで金額列が分解されるので、列名を変更する
　　　★ここで列名を変更しておかないと次のピボット操作時に列名重複エラーが発生する
３．2を繰り返してすべてピボットできたら完了
'0'を引くと、charが表す数値を取得できる

競技プログラミングで、「これは何をしているのだ?」と思い検索をかけたのですが、あまりヒットしなかったのでメモとして残しておきます。

## 問題はこちら
https://atcoder.jp/contests/abc176/tasks/abc176_b

```
問題文
整数 N が 9 の倍数であることと、N を十進法で表したときの各桁の数の和が 9 の倍数であることは同値です。
N が 9 の倍数であるか判定してください。

制約
0≤N<10^200000
N は整数
```

## 解法

解法は、問題文を読んで分かる通り、以下の3ステップで解決できそうです。

```
1. 入力された数値を文字列として取得
2. ループを回して各位の数値を合計する。
3. 合計を9で割って、余りが0なら"Yes", それ以外なら"False"
```


## ASCIIコードに注意
~~ASCIIコードとは、`「文字」と「文字に割り当てられた番号」の対応表`のことをいいます。~~
ASCIIコードとは、`「文字」と「文字に割り当てられた番号」の対応表`のひとつです。

参考
[ASCIIコード表](http://www3.nit.ac.jp/~tamura/ex2/ascii.html)


例えばchar型の`'9'`はint型では`57`と同値になります。これでは、期待している値を取得できませんね。。

そこで、char型の`'9'`をint型の9として扱いたいため、char型の`'0'`を引いてあげます。`'0'`はASCIIコードで`48`を示すので、`57-48=9`でint型の`9`が取得できます。


回答例

```c++
#include <bits/stdc++.h>
using namespace std;
int main()
{

  int sum = 0;
  // ステップ1. string型で値を受け取る
  string s;
  cin >> s;

  // ステップ2. stringの文字数の数だけループを回す。
  for (int i = 0; i < s.length(); ++i)
  {
    sum += (s[i] - '0'); // ASCIIコードであるため、'0'を引くことで正しい数値を取得できる
  }

  // ステップ3. 9の倍数か判定する
  if (sum % 9 == 0) 
  {
    cout << "Yes" << endl;
  }
  else
  {
    cout << "No" << endl; 
  }

  return 0;
}
```

前述した通り、ASCIIコードは、`「文字」と「文字に割り当てられた番号」の対応表`の**ひとつ**です。
よって、ASCIIじゃない文字セットが使われてエンコードされている可能性があります。

しかし、C/C++規格書では `0` から `9` の文字に対応する数値が連続することは保証されています。よって、char型の`'0'`を引いてあげる方法がで、charが表す数値を取得できることは保証されます。

参考
https://qiita.com/yumetodo/items/600ca0df422010cbc4c1#comment-20f4865bca2c3c72070d
GCP認定資格Professional Cloud Architectに合格したので振り返る

# 受験のきっかけ

会社の昇進条件でいくつか取らないといけない資格とかがあったりすると思うのですが、私の場合のその一つがGCP認定資格である「Professional Cloud Architect」でした。

仕事ではAWSとGCPについては日々仕事で触れているので、ある程度アドバンテージがあるかと思って臨んだのですが、結果実務スキルはあまり役に立たず一からしっかり勉強しました。（やはり資格と実務は別物ですね。）

# GCP Professional Cloud Architectとは

ケーススタディに対しGCPの最適なアーキテクチャを導き出し、選択肢を選択するテストになります。

難易度としては、まぁまぁ難しいです。（AWS認定ソリューションアーキテクトプロフェッショナルよりは簡単です）

個人的には試験の問題数が５０問で２時間あるので、よくある「問題数多すぎ！！時間がない！！」みたいな心理的な負荷がないのでそういった意味でもこちらの試験を今回受けてみることにしました。

# 筆者のスペック

GCPの体系的な知識は皆無です。GCEやGCA、GCS、Kubernetes、BQなどは業務で使ったことはあるものの「こういったケースには、このアーキテクチャ！！」といったベストプラクティスを助言できるようなスキルはございません。

インフラの基礎知識、アプリケーション開発の基礎知識については、IT業界が今年で６年目を迎えるので、一定有しております。

# Professional Cloud Architectの勉強方法
記事はこちらに移転しました

https://kimuralog.com/?p=364


# オンライン試験の感想

ちなみにベンダー試験で初めてオンライン受験を経験しました。Wifi環境がよければ問題なく受験可能です。ただおそらく受験者一名に対して、監視官が一名ついている都合なのか試験開始ボタンを押して、試験開始まで待たされました。

あと試験前の本人確認とスマートフォンや鏡を利用して試験場所の状況確認を行うのですが、確認のやり取りは全て英語で行われますので要注意です。

# まとめ
受験料もかなり高額なのでなんとか一発合格できて良かったです。。。
Cloud Architect系の資格は、今後クラウド環境でのアプリケーション開発は一般的になってきますのでオススメですよ。
S3をLAN経由で利用する

##S3をLAN経由で利用する
インターネット経由でしたS3にアクセスできないと思っておりましたが、VPCエンドポイントを利用することでLAN経由(DirectConnectがある前提)で利用できることがわかりましたので、メモとして掲載します。

詳細は参照元の記事に作成方法まで紹介して頂いています。参考となった概念図を掲載させて頂きます。

#VPCエンドポイント概念図
![2019-09-20_18h11_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359386/ff0f8eb0-d35d-ed91-08e2-c4f8f4fc4bc7.png)

参照元
https://jpn.nec.com/clusterpro/blog/20180115.html#targetText=VPC%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF,%E3%81%A7%E3%81%8D%E3%82%8BAWS%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A7%E3%81%99%E3%80%82

[公式]VPCエンドポイント
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints.html#targetText=VPC%20%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88,%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82&targetText=VPC%20%E3%81%A8%E4%BB%96%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9,%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AF%E4%BB%AE%E6%83%B3%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%A7%E3%81%99%E3%80%82
桁上がり、桁上げ

応用情報技術者平成30年秋期 午前問23

1桁の2進数A，Bを加算し，Xに桁上がり，Yに桁上げなしの和(和の1桁目)が得られる論理回路はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b27cae33-097e-435d-72ae-0e8a399e4f2c.png)


１、桁上がり
ABの桁上がりとは、BがAに移動、Bが0に設定とのことかな？？？
いろいろな調査をして、上記の理解らしいだなと思っております。

２、桁上げなしの和（１桁目）
桁上げなしとは、上げている桁が捨てるとのことですね。つまり、１桁だけ残るとのこと。

・キャリー　carry
別名：繰上げ，桁上げ
キャリーとは、ある桁での計算結果が、その桁で表すことのできる数を超えたときに、1つ上の桁へ加えられる数のことである。例えば、ある桁の加算が「8+7=15」であった場合、キャリーは1となる。


上記の概念によると、
A,B,X,Yの関係は下記になりますね。
これは、XはAND（倫理積）、YはXOR(排他倫理和）ですね。


A　B　X　 Y
0  0  0  0
0  1  0  1
1  0  0  1
1  1  1  0



参照：
桁上げ
https://www.weblio.jp/content/%E6%A1%81%E4%B8%8A%E3%81%92

https://www.fe-siken.com/kakomon/23_toku/q25.html
【備忘録：CSS】hover時のボタンアニメーション

# hover時にいい感じのアニメーションにする
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625199/9eeb0f61-f4e1-594e-809d-ddae5dcec4b8.gif)
このような感じで、背景がボタンにかぶさるようなアニメーションをしていきます。

## ソース

```html:btn.html
<div class="l-btn">
  <button class="m-btn">
    button
  </button>
</div>
```
HTMLは普通のボタンを配置している状態です。

```scss:btn.scss
.l-btn{
  width: 100%;
  max-width: 600px;
  margin: 0 auto;
}

button{//ボタンリセット
  background-color: transparent;
  border: none;
  cursor: pointer;
  outline: none;
  padding: 0;
  appearance: none;
}
.m-btn{//ボタンスタイル
  position: relative;
  width: 100%;
  border: 1px solid #000;
  border-radius: 10px;
  padding: 10px 20px;
  margin-top: 30px;
  transition: all .4s ease;
  &::before{//hover時の黒背景を準備
    position: absolute;
    content: "";
    top: 0;
    left: 0;
    width: 0;//黒背景の幅は0に
    height: 100%;//黒背景の高さを確保
    border-radius: 7px;
    z-index: -1;//hover時、テキストが見えるように-1に
    transition: all .4s ease;
  }
  &:hover{
    color: #fff;
    &::before{
      width: 100%;//幅100%にして黒背景をしきつめる
      background: #000;
    }
  }
}
```

cssは上記の形です。
ポイントはz-indexでテキストを表示させるようにするところです。


黒背景が上に被さるので、z-indeがないとテキストが黒背景に被るのですが、z-indexでマイナスを入れることでテキストが上にくるようになります。

このようなボタンを見かけますが、どのようになっているのだろうと思い作成してみました。
【UiPath】Slack連携アクティビティの使用方法

# 概要
UiPathより、Slackへのメッセージ送信やメッセージ・添付ファイルを取得したりリプライを送る方法について解説

# 使用パッケージ(2020/08/22時点)
UiPath.Slack.Activities[Ver 0.3.0]

# サンプルプロジェクト(GitHub)
https://github.com/odm-cckte0122/UiPath-SlackConnectSample

※UiPath Studioより「リポジトリを複製」で参照したい方はこちらのURLを使用下さい
https://github.com/odm-cckte0122/UiPath-SlackConnectSample.git

# 事前準備
- Slackにボットを追加する
- 追加したボットから、接続に必要な情報(ClientID , ClientSecret , Bot Access Token)を取得する
- 追加したボットを、操作したいチャンネルに追加する
※ボットの追加・設定方法については[Slack ボットの作成手順](https://qiita.com/odm_knpr0122/items/04c342ec8d9fe85e0fe9)を参照

# できること(使用頻度が高いもの)
## Slackにメッセージを投稿
サンプルファイル：チャンネルにメッセージを投稿.xaml
**Send Message**アクティビティを使用することで、指定したチャンネルにメッセージを投稿することができる。
【Send Messageアクティビティ設定情報】

| 項目名  | 型 | 入力内容 |
| ------------- | ----- | ------------- |
| Conversation  | String | 投稿するチャンネル名。必須<br>※付与した権限によっては、DMやグループチャットへの投稿も可能  |
| Text  | String | 投稿するメッセージ内容。必須<br>※Slack上で使用するmarkdown記法を使用できる(*で囲むと太字になったりする)  |
| File | String | 投稿に添付するファイルのパス。任意<br>※相対パスでも添付可能・ファイルパスに指定した変数が空白の場合は何も添付されない<br>注意：日本語名のファイルは添付しようとすると文字化けしてしまうため、別途対応が必要 |

## Slackのメッセージにリプライ
サンプルファイル：チャンネルのメッセージにリプライ.xaml
**Get Messages**アクティビティと **Reply**アクティビティを使用することで、指定したチャンネル内の投稿にリプライを送ることができる。
【Get Messagesアクティビティ設定情報】

| 項目名  | 型 | 入力内容 |
| ------------- | ----- | ------------- |
| Conversation  | String | メッセージを取得するチャンネル名。必須<br>※付与した権限によっては、DMやグループチャットへの投稿も可能  |
| Messages  | Slack.Models.Message[] |  取得したメッセージ情報。必須<br>※Message型の配列となっており、投稿者の情報やメッセージ内容、メッセージ固有のIDなど様々な情報が格納されている  |
| MaxResults | Int32 | メッセージの取得上限。任意 |

【Replyアクティビティ設定情報】

| 項目名  | 型 | 入力内容 |
| ------------- | ----- | ------------- |
| Message  | Slack.Models.Message | リプライを送るメッセージ。必須<br>※Get Messagesアクティビティで取得したメッセージから取得した情報をもとに返信するメッセージを指定  |
| Text  | String | 投稿するメッセージ内容。必須<br>※Slack上で使用するmarkdown記法を使用できる(*で囲むと太字になったりする)  |
| File | String | 投稿に添付するファイルのパス。任意<br>※相対パスでも添付可能・ファイルパスに指定した変数が空白の場合は何も添付されない |

## Slackに添付されたファイルをダウンロード
サンプルファイル：投稿に付与されたファイルをダウンロード.xaml
**Get Messages**アクティビティと **Download File**アクティビティを使用することで、指定したチャンネル内の投稿にリプライを送ることができる。
【Download Fileアクティビティ設定情報】

| 項目名  | 型 | 入力内容 |
| ------------- | ----- | ------------- |
| File  | Slack.Models.SlackFile | ダウンロードしたいファイル情報。必須<br>※Get Messagesアクティビティで取得したメッセージにファイルが添付されている場合、SlackFile[]としてこの情報が格納されている  |
| LocalPath | String | ファイルをダウンロードした時のファイルパス。必須<br>※相対パスでも添付可能 |

# 参考
[Slack からエクスポートしたデータの読み方](https://slack.com/intl/ja-jp/help/articles/220556107-Slack-%E3%81%8B%E3%82%89%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%AA%AD%E3%81%BF%E6%96%B9)
※Get Messagesアクティビティで取得したmessage情報を読み解くヒントになるかもしれません。
Message情報をログに出力するサンプル：チャンネルのメッセージ情報を取得.xaml
pythonでデータ分析

##newspicksの記事に触発されてpythonでデータ分析
[【プロ直伝】知識ゼロから使える「データサイエンス」14教材](https://newspicks.com/news/5145271/body/)
なんかいろいろとトラブルが続いた週を終え、帰りがけのスマホで当記事に気づいた。
***
早速、土曜の朝から本屋に行って、「戦略的データサイエンス入門」を探したが見つからず、
udemyの、【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門がなんと期間限定で1300円ほどになっていたので、早速実施した。
[【ゼロから始めるデータ分析】](https://www.udemy.com/course/optworks_1/)
***
いやいや、知らないことだらけで、面白い。
***
[SIGNATE](https://signate.jp/)
udemyのレクチャーで上記サイトからデータダウンロードで作業開始なんだけど、
こんなサイトがあることも知らない。
コンテスト？　なんじゃ。面白い。

***
2020年11月：ここで家のパソコンを買い替えたので
再度、初めからやり直すこととした。
なのでこれも書き直そうと思う。
***
まず、anacondaのインストール。
で、その後は、jupyter　notebookで操作する。
***
おまじないを入れて
`import pandas as pd`
`import numpy as np`
`from matplotlib import pyplot as plt`
`%matplotlib inline`
***
データを読み込む
`train = pd.read_csv("train.csv")`
***
データの中身を見る
`train.head()`
![スクリーンショット 2020-11-15 153408.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282938/be6c0ef7-58bb-ba97-f0f7-dc8380a53a5c.jpeg)

なるほどなるほど。
***
データの行数と列数を見る場合は
`train.shape`
***
基本統計量を確認する場合
`train.describe()`
![スクリーンショット 2020-11-15 153851.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282938/991b9454-6989-e44d-5e2d-967e2572e0ea.jpeg)
***
データの型をみる場合は
![スクリーンショット 2020-11-15 154045.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282938/57bb762d-bdb9-362d-315e-e22915df4b24.jpeg)
***
曜日が月曜のデータのみみる
![スクリーンショット 2020-11-15 154315.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282938/557f7e7e-4b32-8184-0fbe-d512a4a1061f.jpeg)
***
曜日が火となっているデータをyで昇順でみてみる
`train[train["week"]=="火"].sort_values(by="y")`
![スクリーンショット 2020-11-15 154531.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282938/d93c9fbb-c3c1-ccbc-dd40-3d5b2f6beeff.jpeg)
***
trainのyの折れ線グラフを描いてみる
`train["y"].plot()`
![スクリーンショット 2020-11-15 154730.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282938/ed730553-100f-da82-3f84-cf5674411eac.jpeg)
耐タンパ性(tamper)

応用情報技術者平成30年秋期 午前問22

マイクロプロセッサの耐タンパ性を向上させる手法として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ead35094-d8c7-6ad1-face-9e8d31c9ab97.png)


１、耐タンパ性(tamper)とは、
ハードウェアやソフトウェアのセキュリティレベルを表す指標で、外部から内部データに対して行われる改ざん・解読・取出しなどの行為に対する耐性度合いを示します。タンパ(tamper)は"改ざんする"という意味です。

２、静電気放電(ESD)
ESD(Electrostatic Discharge)に対する耐性を強化する。
静電気放電(ESD)によりプロセッサが破壊されるのを防ぐ対策です。

３、検査用パッド
チップ検査終了後に検査用パッドを残しておく。
検査用パッドを介して内部データにアクセスされる可能性があるため耐タンパ性は低下します。

４、
内部メモリの物理アドレスを整然と配置する。
内部プログラムの動作を解析されやすくなるため耐タンパ性は低下します。


これは、耐タンパ性の概念の理解は大事ですね。
セキュリティ強化で、改ざんしにくくなるようにとのこと。


ーーーーーーーーーーーーーーーーーーーーーーー
補足
ICカードの耐タンパ性を高める対策はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5505f691-eae0-32c5-bd4b-1e819b347ea8.png)


参照：
https://www.ap-siken.com/kakomon/30_aki/q22.html

https://www.ap-siken.com/kakomon/29_aki/q44.html
FontAwesomeの導入

##FontAwesomeとは
Webフォントの一種。facebookやtwitterのロゴなどに使用できる。

##FontAwesome用のgemをインストール
```ruby:Gemfile
gem 'font-awesome-sass'
#最下部に追加する
```
Gemfileに追記したら、bundle installしてサーバーを再起動



##HTMLで使用する場合
- head内にリンクを記述
- 任意の場所にアイコンの記述

```application.html.erb
#head内
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.2.0/css/all.css" integrity="sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ" crossorigin="anonymous">
###中省略
<div class="iconのクラス名">
 <i class="fas fa-acorn"></i>　#FontAwesomeからコピーしたコードを挿入
</div>
```

以下のリンクから飛んで使いたいWebフォントを探そう！
https://fontawesome.com/icons?d=gallery
docker loginの認証はどこで実行されるか

# TL; DR
答えは、**`docker`コマンドを実行するOS/ユーザ** です。

より詳細な仕組みを知りたい方は以下を読んでください。

# dockerコマンドは３種類ある
はじめに `docker` コマンドは一つでないという話からはじめます。
ホストOSがLinux以外の場合、
dockerデーモンは仮想OS (macOSならHyperKit, WindowsならHyper-VまたはWSL2)上のLinuxで実行されています。

dockerコマンドは以下の三ヶ所から呼び出すことができます

- ホストOS
- 仮想OS
- コンテナ内部（ソケットマウント方式でdocker in dockerしている場合）

![docker (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67228/2fd7fda9-d209-09a8-2e04-af166d95f368.png)

それぞれで実行されるdockerコマンドは実行されるOS上の普通のプログラムで、
dockerデーモンに対して通信をすることで実際のコンテナを実行します。

つまり、ホストOS上の`docker`コマンドと仮想OS上の`docker`コマンドは
全く別のバイナリということになります。（当たり前ですが）

# docker login
`docker login` はDocker HubやGCR, ECRなどのコンテナレジストリにログインするコマンドです。
ログインすることで、コンテナのpushやprivate レポジトリからのpullができるようになります。

さてログイン処理はどのように実行されるのでしょうか。筆者が調べた限りでは以下のような仕様のようです。

- (dockerデーモンではなく）dockerコマンドを実行したOSで実行される
- 認証情報（の設定）は `$HOME/.docker/config.json` に保存される。

したがって以下のことに気をつける必要があります。 


1. **ホストOS上でログイン状態は、root以外の別のユーザあるいは仮想OS上あるいはコンテナ内のdockerからは利用できません。**
   - ホストOS上で`docker login`しておいても、 仮想OS上のdockerからその認証情報を用いたpush/pullはできません。
   - ホストOS上の別ユーザからもpush/pullはできません。(例外として`sudo`によるpush/pullは可能です。これは`sudo`では環境変数（特に`$HOME`)がユーザのものが引き継がれ、かつrootは`~/.docker/config.json`が読み出し可能だからです。)
        - OK: `sudo docker pull ${private_image}`
        - NG: `echo docker pull ${private_image} | sudo su root`

1. **`docker login`コマンドを`sudo`で実行すると`$HOME/.docker/config.json`の所有者がrootとなります。**
（[ドキュメント](https://docs.docker.jp/engine/reference/commandline/login.html)には `sudo docker login`した場合は `/root/.docker/config.json`に保存されると書いてありますが、少なくともmacOS上では `$HOME/.docker/config.json`に保存されることを確認しました。）

## credential helper
`docker login`の認証状態をいい感じに管理してくれるのがcredential helperと呼ばれるプログラムです。
これを使うと、`docker login`のパスワードをOSのキーチェーンツールに保存したり、
AWSやGCPの認証コマンドを用いる事ができます。

`~/.docker/config.json`に設定を書くと利用できます。以下の例ではデフォルトのhelperとして
`desktop`を使い、`gcr.io`など特定のサイトでは `gloud`を使うという設定です。

```json
{
	"credsStore": "desktop",
	"credHelpers": {
		"asia.gcr.io": "gcloud",
		"eu.gcr.io": "gcloud",
		"gcr.io": "gcloud",
		"marketplace.gcr.io": "gcloud",
		"staging-k8s.gcr.io": "gcloud",
		"us.gcr.io": "gcloud"
	}
}
```

credential helperは`docker-credential-`のprefixがついた普通のプログラムです。

```console
$ docker-credential-
docker-credential-desktop      docker-credential-gcloud       docker-credential-osxkeychain  
```

仕組みも非常に簡単で、引数に`get`、標準入力にログインしたいレポジトリのURLを渡すと認証情報を返してくれます。

```console
$ echo https://gcr.io | docker-credential-gcloud get
{
  "Secret": "{ここは認証トークンなのでマスクしました}",
  "Username": "_dcgcloud_token"
}
```

したがって、**こちらの設定・状態もdockerコマンドを実行するOSやユーザごとに独立しています。**


# docker in dockerで認証情報を共有したい場合
上記の理由から、dockerの認証情報は実行OS,ユーザごとに独立であるという事がわかりました。
したがって、docker in dockerを実現したい場合に、ホストLinuxの認証情報を共有した場合は
以下のようにする必要があります。

1. コンテナ実行時に`$HOME`環境変数を適切に設定します。
2. credential helperコンテナ内部のPATH上にマウントします  
   `-v $(which docker-credential-gloud:/usr/local/bin/docker-credential-gcloud)`
3. ホストOSの`$HOME/.docker/config.json`をコンテナ内にマウントします。
4. credential helperが使う認証情報をコンテナ内部からアクセスできるようにします。（環境変数で渡すか鍵ファイルをマウントします）
TypeScript + webpack + npm + claspでGAS開発

## 完成形

```
├ dist/
   └ main.js (コンパイルされたjsファイル)
│  └ appsscript.json
├ src/ (開発を行うディレクトリ)
├ .clasp.json
├ package.json
├ tsconfig.json
├ webpack.config.js
├ yarn.lock
```

## 1. パッケージのインストール

package.jsonを作成

```
yarn init -y
```

必要なパッケージをインストール

```
yarn add -D @google/clasp typescript ts-loader webpack webpack-cli gas-webpack-plugin cpx @types/google-apps-script @types/node
```

## 2. TypeScript の設定

tsconfig.jsonを作成する

```
yarn tsc --init
```

お好みで設定してください。

```json:tsconfig.json
{
  "compilerOptions": {
    "sourceMap": true,
    "target": "es5",
    "module": "es2015",
    "moduleResolution": "node"
  }
}
```

## 3. webpack.config.js を作成

webpack.config.js ファイルを作成して以下のコードをコピペ

```js:webpack.config.js
const path = require('path');
const GasPlugin = require('gas-webpack-plugin');

module.exports = {
    entry: {
        main: path.join(__dirname, 'src', 'main.ts')
    },
    output: {
        filename: '[name].js',
        path: path.join(__dirname, 'dist')
    },
    module: {
        rules: [
            {
                test: /\.ts$/,
                use: 'ts-loader'
            }
        ]
    },
    resolve: {
        extensions: [
            '.ts',
            '.js'
        ]
    },
    plugins: [
        new GasPlugin(),
    ]
};
```

## 4. claspでGASプロジェクトを作成

googleにログイン
ブラウザが開かれるのでアカウントを選択してログインする

```
yarn clasp login
```

プロジェクトを作成する
今回は`standalone`を選択

```
yarn clasp create [プロジェクト名]

? Create which script? (Use arrow keys)
❯ standalone
  docs
  sheets
  slides
  forms
  webapp
  api
```

.clasp.json ファイルが作成されるのでそれを編集する
`rootDir`にルートディレクトリ`dist`を設定

```json:.clasp.json
{
  "scriptId":"[スクリプトID]",
  "rootDir": "dist"
}

```

## 5. 開発

`src`ディレクトリで開発を行うため`src`ディレクトリを作成する
`main.ts`ファイルを作成し、サンプルコードを書いていく

```typescript:main.ts
declare var global: any;

global.doGet = () => {
    return ContentService.createTextOutput('Hello World');
}
```

#### yarnのbuildコマンドとdeployコマンドを作成
```json:package.json
{
  "scripts": {
    "build": "rimraf dist && webpack && cpx appsscript.json dist",
    "deploy": "yarn build && clasp push"
  }
}
```

gasにdeployする

```
yarn deploy
```

## 6. 公開する

上記のコードをWebアプリケーションとして公開するとこのような感じになります。
![スクリーンショット 2020-08-23 11.28.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526950/703d6cab-1feb-ab7e-f1d9-532c562e796d.png)


以上です。
VPNを使って君は招待を隠したくはないかね

#はじめに

最近、リモートワークが増えてきたことによりVPNといった言葉を聞くことが多くなってきたと思うのですが、実際に自分では使用してことがなかったので、使ってみるとVPNの大切さや面白さが分かりました。少しだけ、ハッカーの気分も味わえます(笑)

#目次
1. VPNとは
2. VPNの種類
3. VPNの仕組み
4. VPNを実際に使用してみた
6. VPNとプロキシサーバーの違い
5. さいごに

#VPNとは
VPNは、Virtual Private Networkといって日本語に訳すと仮想専用線と言います。インターネットの中で通信する時に、悪意ある第三者に情報の改竄や盗聴、なりすましを防ぐために使用するものです。機能としては、インターネットの中に専用のトンネルを引きその中で行き来するパケット情報を暗号化して通信します。簡単に言うと治安の悪い町を徒歩で歩くより、専用の車を使用して通っている方が安全ということです。

#VPNの種類
VPNの種類は大きく分けて2種類あります。

**インターネットVPN**
**IP-VPN**

インターネットVPNは、普段利用しているインターネットの回線を利用しVPNで接続します。
IP-VPNは、通信業者が保有している閉鎖網を使用することでVPN接続します。

この二つの違いは、インターネットVPNはプロバイダ代だけ支払えばよくコストの削減をすることが出来ます。しかし、誰でも利用することが出来るので回線の速度が遅いといったことがあります。
IP-VPNは、費用がインターネットVPNよりもかかるのですが回線の速度が速いといったこともあります。

#VPNの仕組み

VPNの仕組みとして、VPNプロトコルが存在しています。

**IPsec-VPN**
IPsecとは、IP Security Architectureの略です。通信を行う時に暗号化することにより安全に通信が出来るようになっている仕組みです。

**L2TP/IPsec**
L2TP/IPsecとは、L2TP over IPsecの略です。トンネリングといった仮想専用線を設けてその間で通信する技術です。L2TP自体には、通信内容が暗号化されないのでIPsecを使用することで暗号化して通信が出来るようになる、

**PPTP**
PPTPとは、Point to Point Tunneling Protocolの略です。IPsecと同様で、通信を暗号化します。マイクロソフト社が提唱したものになっており。Windowsで相性がいいとされています。

**SSL-VPN**
SSL-VPNとは、Secure Sockets Layerの略です。IPsecと同様に通信を暗号化します。HTTPやPOPなどアプリケーションごとに対応させなければいけません。

#VPNを実際に使用してみた
実際にVPNを使用してみることにしました。今回使用するVPNは、筑波大学が学術研究で提供しているVPNサーバーを使用してみることにしました。(無料で利用することが出来ます)
サーバーを提供しているのはボランティアの形で世界中の人が提供しています。

![aaaaa.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605875/3a23b66a-34c9-8915-01c5-80e82e7bcfcd.png)

上記の画像は実際の筑波大学が提供しているサイトでVPN中継サーバーがボランティアで提供されています。今回は、L2TP/IPsecを使用します。チェックをつけた後に、サーバー一覧を更新を押すとVPNサーバーの一覧が表示されます。一番上に表示されている、VPNサーバーを使用してみることにしました。本当だったら通信速度が速くてPingが小さいのを選ぶのがいいでしょう。設定の方法は、WindowsやMacによって違うのでそこ適宜お調べ下さい。

[こちらに](https://www.youtube.com/watch?v=RrNG-8pwJ_o)Windowsで設定している方がいるので参考にして下さい。

実際にVPNを使用することで、自分のIPアドレスが変更されたかどうか確かめます。

![aaaaa.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605875/5db5d95f-3e3a-46d6-43e9-23b951ebc205.png)
IPアドレス確認には、[CMAN](https://www.cman.jp/network/)を使用しました。

実際に自分の現在のIPアドレスとは違うVPNのIPアドレスに変更されたことが分かりました。
自分の身元が隠せた気がしてハッカーになった気分になりました。(笑)
<font color="Red">VPNの方に自分のIPアドレスは残っているので犯罪などそういった目的には絶対に使用しないでください。
</font>

#VPNとプロキシサーバーの違い
VPNについて勉強を進めていくうちにこれってプロキシサーバーと同じではないかと思って調べていくと違いを見つけました。
VPNは、通信がすべて暗号化されるのに対してプロキシサーバーは特定のブラウザで設定することにより匿名化をすることが出来ます。ここで、セキュリティの高さで言えばVPN方が高いです。なせなら、VPNはパケット情報を暗号化しているの対してプロキシサーバーは暗号化されていないので第三者から盗聴などされてしまう可能性があるからです。

#さいごに
VPNとは、今後さらに重要になっていくのではないかと考えてます。特に無料のWi-Fiを使用するのも本当は危険で通信内容が第三者に見られる可能性もあります。また、政府が有益なアプリや情報を閲覧できないようにしている場合もVPNを使用することで見ることが出来るようになる場合もあります。また、今回は無料のVPNを使用していたのですがセキュリティの事を考えると有料のVPNを使用した方がいいでしょう。

#参考文献
https://cybersecurity-jp.com/security-measures/26436
[VPN Gate](https://www.vpngate.net/ja/)
https://japan.norton.com/vpn-8553
Talend API Tester という拡張機能

APIにリクエストを送って、どんなレスポンスが返ってくるか試すことができます。
https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm?hl=ja

アクセストークンを使ったBASIC認証なども、`Add authorization`で追加することができます。

APIを使っての実装は、ドキュメント読めばってハナシなんでしょうが、やはり実際どう返って来るか見られた方がわかりやすいですよね。
SoC(System on a Chip)の説明

応用情報技術者平成30年秋期 午前問21

SoCの説明として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/f7349555-2cc3-ee87-085c-569bd62cd432.png)


１、SoC(System on a Chip)は、CPUコアやDSP、記憶装置、タイマ、VSBやイーサネットを1つのチップ上で実現したLSI(大規模集積回路)です。必要とされる全ての機能(システム)を1つの半導体チップに集積することによって、「占有面積の削減」「高速化」「低消費電力化」「コスト削減」などのメリットがあるとされています。


２、マイコンボードとは、
マイクロコンピュータ（マイコン）と入出力回路などの周辺回路を1枚の基板に乗せ、手軽にマイコンを利用するための回路です。

一昔前は、主に小型・低価格のマイコンを積んだものを指していました。

最近では広義な意味でのマイコンボードとして、ArduinoやRaspberry Piなど、スマートフォンと同様の高性能なCPUを積んでいるものを含みます。

３、マイクロコントローラ　microcontroller
CPU，チップセット，ビデオチップ，メモリなどコンピュータを構成するための電子回路基板

・マイクロコントローラ (microcontroller) とは、主に電子機器などの組み込みシステムに使われる集積回路のひとつ。 電子機器の制御用に最適化されたコンピュータの一種である。 略してマイコンとも呼ばれる。


４、MCU　Micro Controller Unit
MCUとは、一つの集積回路にコンピュータシステムをまとめた、組み込み用のマイクロプロセッサのことである。主に電子機器の制御などに用いられる。

MCUは、一般的なマイクロプロセッサとは異なり、ROMやRAMなどのメモリ、I/O関連など多くの周辺機能をMCU自体に搭載している。このため、ROMなどを独立した部品として搭載する場合に比べて、システム構築のためのコストを抑えることができるようになっている。

また、メモリの制御や管理を行うための機構であるメモリコントロールユニット（Memory Control Unit）も、同じくMCUと呼ばれる。こちらは、CPUに内蔵されており、リフレッシュやページング、仮想アドレスから物理アドレスへの変換といった制御機能を持っている。


５、SiP(System In Package)
プロセスが異なる機能は，個別に最適化されたプロセスで製造し，パッケージ上でそれぞれのチップを適切に配線した半導体チップ




参照：
https://www.fe-siken.com/kakomon/21_aki/q23.html

https://www.ap-siken.com/kakomon/27_haru/q20.html

マイコンボード
https://dotstud.io/docs/microcon/

MCU
https://www.weblio.jp/content/MCU
vistaでquartus その31

#概要

vistaでquartusやってみた。
cpu作ってみた。
シミュレータで実行。
アセンブラでコンパイル。
実機で実行。

#ソース

a-zを表示。

```
  push  0
  set  i
loop:
  get  i
  push  25
  >
pass:
  jz  pass 
  get  i
  push  97
  +
  out
  get  i
  push  1
  +
  set  i
  jmp loop

```

#シミュレータで実行。

https://embed.plnkr.co/plunk/4ec2GmG6CXCB2ZEf


#アセンブラでコンパイル。


https://embed.plnkr.co/plunk/FL7Ni76aZsrA92Tl


#実機で実行。

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2460a06e-87af-5283-4000-72db7031d647.jpeg)


以上。
PHPSpreadSheetで1万行強書こうとして死んだ話となんとかした話

記憶を頼りに。
帳票出力で1万行を超えるExcelを`PHPSpreadSheet`で書こうとした。
プロジェクトにはすでに`PHPSpreadSheet`のヘルパーライブラリがあってそれ使えみたいな空気感。
で、パフォーマンスが悪くて死んだ。
2000行超えたあたりから1行書くのに3秒とかかかる様になって詰んでた。

## パフォーマンス問題
問題は記憶が確かならこの関数

```php
$spreadsheet->getActiveSheet()->insertNewRowBefore(7, 2);
```

`insertNewRowBefore`。この関数、前の行の様式や書式を引き継いでしてくれるので楽なんですけどパフォーマンスで死ぬ。
`PHPSpreadSheet`、全体的にパフォーマンス問題抱えているようでGithubとかも死屍累々、Stackoverflowでは別のライブラリ使えって言われるので全体的に負け戦。でもなんとかしなきゃいけない

## 対応方法
ともかくからのExcelに行番号を保持してインクリメントしながら書き倒して、様式書式全部設定していけば速度もメモリも許容範囲に収まった。
楽な道はパフォーマンスが悪い、という典型でした。

## ダメだった対応
* 適当な大きさのExcelを用意してそこに書く

5万行とかのExcelテンプレート用意したらメモリ使用量が1GBとかいってダメだった。


## 結果
### 所要時間
360分(予測)→ 12分
まぁまぁ、劇的な結果。
1時間たっても1/6しか進んでなくてプロセス殺したので死んでたときの経過時間は予測。
実際はどんどん一行書くのに時間がかかっていくようになっていたので360分では終わらなかったと思う。

以上です。
pythonでDeepLを使う　（論文翻訳用）

```tran.py

import json
import urllib.parse
import urllib.request
import re


def translate(text, s_lang='', t_lang=''):
    DEEPL_TRANSLATE_EP = 'https://api.deepl.com/v2/translate'
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded; utf-8'
    }

    params = {
        'auth_key': "",#ここにAPIキーを入力
        'text': text,
        'target_lang': t_lang
    }

    if s_lang != '':
        params['source_lang'] = s_lang

    req = urllib.request.Request(
        DEEPL_TRANSLATE_EP,
        method='POST',
        data=urllib.parse.urlencode(params).encode('utf-8'),
        headers=headers
    )

    try:
        with urllib.request.urlopen(req) as res:
            res_json = json.loads(res.read().decode('utf-8'))
            res_json=res_json["translations"][0]["text"]
            return json.dumps(res_json, indent=2, ensure_ascii=False)
    except urllib.error.HTTPError as e:
        return "取得できませんでした。"
#以上を追加した


with open('text.txt') as f:
    text = f.read()

text=re.sub('\n', ' ', text)
text = translate(text, s_lang='', t_lang='JA')
text=re.sub('\n', ' ', text)
print(text)

```

### 使い方
tran.pyとtext.txtを同じ階層に配置し、text.txtに翻訳したい英文を入力して

```
python tran.py
```
でtran.pyを実行します。


参考
-
[Python で DeepL API を使ってみた](https://michimani.net/post/programming-using-deepl-api-by-python/)
Macでその他を消したい（未解決）

# Macで「その他」がかなりの容量を占めておりしんどかったので、消すまでにやったこと記録

### 最初の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287296/68b670a9-5951-b9f7-4423-4c47798483f5.png)
￼
[Macの「その他」を削除し、ストレージ容量不足を解消する方法](https://gori.me/mac/mac-tips/84282)
まずこの記事にしたがってやってみました。

### 他のデバイスのバックアップを削除
→そもそも0バイトだった（バックアップはicloudに置いてあります）

### セーフブート
→約11GBの削除に成功！すごい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287296/0bff00ba-c068-0f0a-8be0-e909f35dfd13.png)

（ちなみにこれは数時間たったら、5GBくらい増えてしまってました、、）
￼
####それでもまだ112GBも残ってる、、、涙


[Macの容量が足りない！ストレージの「その他」の意味と安全な削除方法](https://takakojima.com/delete-strage-others/)
次はこの記事にしたがってみました！

### Downloadsのいらないファイルを削除
巨大なファイルはありませんでした。（最大でも350MBでした）
ダウンロードフォルダ自体は49GB
（使っていないデータは外部orクラウドに移すべきですが、PCの容量圧迫の原因はここではなさそう）

### /Library/Caches/
一番サイズの大きなファイルでも5.8MBでした。
全体では9.38GBでした。

[Mac ストレージ「その他」が異常に多い時に試してみるたった１つの方法](https://apple-teach.com/macroom/storage-shortage/)
次はこの記事に従いました。

### Spotlightのインデックスを再作成
→効果なし

[MACのストレージで「その他」が増え続ける問題を解決｜「お使いの起動ディスクがほとんどいっぱいです」からの格闘日記 | ギャンブル好きに捧げる投資ブログ](https://stockstuck.com/2019/01/29/mac/)
10回ほぼ連続でセーフブートを行うも効果なし、、


### chromeとsafariのキャッシュを削除
→400MBくらい増える。


[Macの容量を食ってる「その他」を調査してみた](http://vdeep.net/mac-storage-sonota)
次はこれで可視化してみました。（最初にこれやればよかった、、、）
すると

```
ユーザー名/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw
```
が64GBも食っていることが判明。
普段、dockerは使わないので全消しすることにしました。

### dockerを削除

もう正直適当に消しました。
/var/Users/ユーザー名/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw
/var/Users/ユーザー名/Library/Caches/com.docker.docker
をゴミ箱に入れ、dockerアプリも消し、

```
sudo rm -rf /var/lib/docker
sudo rm /usr/local/bin/docker-compose
```
をしてみました。笑
（本当はもっと慎重に消すべきだと思います）

### dockerを消したことで解決するかと思いきや、ストレージはあまり変化せず、、、涙

![スクリーンショット 2020-08-22 22.44.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287296/081ef83f-2707-55e2-8418-186ede408508.png)
YouTubeをスクレイピングしようとしたけどAPI使えば済むのでやらんでいいよ

# YouTubeから流行とか把握するために昔作ったけど今はAPIでいいよね
供養
あとYouTubeをスクレイピングしちゃあかんよ

```python

from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
import urllib.parse


def main():
    # 検索ワード
    search_words = ['α波', '睡眠']
    # chromeを開く
    driver = webdriver.Chrome('../chromedriver')
    s = '+'.join(map(urllib.parse.quote, search_words))
    driver.get("https://www.youtube.com/results?search_query=" + s + '&sp=CAM%253D')
    info_list = []
    time.sleep(1)
    for i in range(10):
        driver.execute_script("scrollBy(0, 1000);")
    for i in range(35, 45):
        info = {'title': '', 'url': '', 'channel': '', 'registrant': 0, 'release': ''}
        loop_flag = 0
        selector = f'#contents > ytd-item-section-renderer:nth-child({i // 20 + 1}) > #contents > ytd-video-renderer:nth-child({20 if i % 20 == 0 else i % 20}) > #dismissable > #video-title > yt-formatted-string'
        while loop_flag <= 2:
            try:
                element = driver.find_element_by_css_selector(selector)
                actions = ActionChains(driver)
                actions.move_to_element(element)
                actions.perform()
                info['url'] = element.get_attribute('href')
                break
            except Exception as e:
                print(i, e)
                print(selector)
                loop_flag += 1
                time.sleep(1)
        if not info['url'] == '':
            info_list += info
    print(info_list)
    print(len(info_list))
    driver.quit()


if __name__ == "__main__":
    main()


```
WSL2 移行メモ

WSL2が Windows 10 バージョン 1903/1909 にバックポートされ（なぜか2004が降ってこない）Sufrace proでようやく使えるようになったので、WSL2への移行メモ。

# 今使っているWSL1のubuntuをWSL2に変換する
WSL2をデフォルトにするのは``> wsl.exe --set-default-version 2``だが、今使っているものは明示的に変換しないとWSL1のまま。

```console
> wsl --list -v
  NAME      STATE           VERSION
* Ubuntu    Running         1
> wsl.exe --set-version ubuntu 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
ディストリビューションは既に、要求されているバージョンです。
> wsl --list -v
  NAME      STATE           VERSION
* Ubuntu    Running         2
```

# WSL2のネットワーク構成
WSL1ではホストのWindows 10側とネットワークインタフェースは共有されていたが、WSL2ではvEthernet(WSL)なるHyper-V Virtual Ethernet AdapterがWin 10側に作られ、Win 10と WSL2 がHyper-V仮想スイッチで接続されるようになった。WSL2上のsshdに接続するような使い方で注意が必要そう。

```console:win10
> ipconfig
イーサネット アダプター vEthernet (WSL):

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::18b8:bb13:4def:276a%22
   IPv4 アドレス . . . . . . . . . . . .: 172.17.80.225
   サブネット マスク . . . . . . . . . .: 255.255.255.240
```
```console:wsl2
$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.80.234  netmask 255.255.255.240  broadcast 172.17.80.239
...
```

# Windows 10側の IP アドレスを知る
Hyper-V 仮想スイッチで接続された Windows 10側のIPアドレスは動的に生成される/etc/resolv.confを見るとよい。

```console
$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.17.80.225
```

Windows X server (例えば VcXsrv)を動かす場合の DISPLAY 変数の設定に使える。

```shell
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
```

# WSL環境かどうかのチェック方法
これまでWSL1環境で``if [[ `uname -a` =~ Microsoft ]]; then``で判定していた方法は使えなくなったのでWSL2では``if [[ `uname -r` =~ microsoft ]]; then``で判定するよう変更。

```console
$ uname -a
Linux NX-01 4.19.104-microsoft-standard #1 SMP Wed Feb 19 06:37:35 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$ uname -r
4.19.104-microsoft-standard
```
【Pythonで業務効率化】依頼:このフォルダにあるExcelぜんぶPDFにしてね。

#はじめに

こんな事がありました。
先輩「フォルダにある130件のExcelファイル、〇〇ってシート名に書いてるシートだけPDFにしてほしいんだよね。よろしく！」
僕「分かりました。なるはやでやります！」
作業・・・・
僕「できました！」
先輩「おー、ありがとう。助かった！」
僕「ふう、疲れたあ。。。」
Python「え。私でExcelファイルをPDFにできるの知らないの？」
僕「まじか。また今後もこういう作業あるから、今度は効率化できるように調べてみるか！」

![pic.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/04c420e2-bf5c-c0e4-4762-d8788e3b7e35.jpeg)

ということで、備忘録も兼ねて、フォルダにあるたくさんのExcelファイルをPDFにしておくコードの解説をしていきたいと思います。

#ExcelファイルをPDFにしよう
Excelを操作する為に、win32comというモジュールを使います。
このモジュールをインストールした事が無い場合は、pipでインストールをします。

```
pip install pywin32
```

まず初めに、1つのExcelファイルの1つめのシートをPDFに変換するプログラムを書いてみました。

```code.py
import win32com.client 
excel = win32com.client.Dispatch("Excel.Application")
file = excel.Workbooks.Open(r"C:\aa\bb.xlsx")
file.WorkSheets(1).Select()
file.ActiveSheet.ExportAsFixedFormat(0,r"C:\aa\bb")
file.Close()
```

1行目は、win32comのインポート
2行目は、Excelを操作しますよーっていう設定
3行目は、PDFにしたいExcelファイルの絶対パス
※'r'を使うことで、raw文字列として扱っています。
4行目は、シートのインデックスを指定（この場合は、1つ目のシート）
※シート名で指定する時は、"シート名"とします。複数シートを選択したい場合は、リストを使って指定します。
5行目は、このフォルダにExcelと同じ名前でPDFにしてーって書いています。第一引数を0にする事で、PDFに変換してねってお願いしています。
6行目でopenしたファイルをcloseします。これをしないと、Excelが読取り専用のままになってしまいます。


#フォルダのExcel全てをPDFに

次に、フォルダのExcel全てをPDFにするプログラムを書いていきたいと思います。

まずフォルダを指定し、そのフォルダにある全ファイル名を拡張子含めてリストに格納しました。
そして、そのファイルを1つずつPDFに変換していきます。うまく変換できなかった場合でも、ファイルをきちんと閉じるように、例外処理を使ってファイルを閉じるようにしました。
Excel名をPDF名にできるように、splitext()を使って、ファイル名と拡張子名を分けてから、ExportAsFixedFormat()の引数に渡しました。

```code.py
import win32com.client 
import os

excel = win32com.client.Dispatch("Excel.Application")

path = 'C:/aa/'
files = []

for filename in os.listdir(path):
    if os.path.isfile(os.path.join(path, filename)):
        files.append(filename)

for i in range(0,len(files)):
  try:
    file = excel.Workbooks.Open(path + '/' + files[i])
    file.WorkSheets("AA").Select()
    name, ext = os.path.splitext(files[i])
    file.ActiveSheet.ExportAsFixedFormat(0, path + '/' + name)
  except Exception as e:
    print(e)
  finally:
    file.Close()
```

#さいごに
これで、Excelが何件あってもPDFに楽に変換できる！
Pythonすごい！
wioLTEを使うときに困ったこととその解決策 - 無通信状態の回避 -  

# wioLTEを使うときに困った
wioLTEとsoracomのsimをつかってものづくりをしていたときに困ったことがありました。

simを使って通信すれば、長期間、通信がつづくと考えていましたが、実際はある一定時間が経つと、通信できない状態(無通信状態)になることがありました（soracomのコンソール画面上でいうとsimがオフラインになります）。

IoTのような長期間動作し続けてくれるシステムが望ましいときに、無通信状態になると困ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/0f8c2929-25d1-143e-1258-80359db23ee1.png)

参考にですが、そのときに実現しようとしていたことは、下記の図の通りでwioLTEに一定時間ごとにデータを取得しにいくというものです。
![system.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/e7d97ebc-6e47-30df-23c8-0b2d359a2816.png)

# 解決方法
よくよく調べてみると、soracomのF&Qに下記のようなF&Qがみつかりました。
[無通信の状態が続くと通信が切れるのはなぜですか？]
(https://soracom.zendesk.com/hc/ja/articles/235781348-%E7%84%A1%E9%80%9A%E4%BF%A1%E3%81%AE%E7%8A%B6%E6%85%8B%E3%81%8C%E7%B6%9A%E3%81%8F%E3%81%A8%E9%80%9A%E4%BF%A1%E3%81%8C%E5%88%87%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B-)
そして、このような記載がありました。

>通信を長時間維持する必要がある場合、デバイスからお客様のサーバ宛に定期的にkeep-aliveメッセージを送るなどして無通信の状態が長く続かないようにしてください。

前述したシステムでは、soracom上のサービスを使用せずに、MQTTでデータをやりとりしていました。
なので急場しのぎ、**一定時間ごとにSORACOM Harvestにデータを送信する処理**をwioLTEに書き加えました。
その処理の作成には下記が参考になりました。こちらにはsoracom harvestに使用するための設定方法も記載されています。
[【作業】1-2: デバイス稼働時間を SORACOM Harvest で可視化](https://soracom.github.io/jp-training/WioLTE/1/2-uptime.html)

Arduino IDE上のサンプルプログラムでいうと「soracom-unified」を使用します。
サンプルコードでは、センサを使用して温湿度データを送信するプログラムとなっていますが、必要な部分だけ抜き出し手を入れて利用しました。具体的には44~109行目です。

送信するデータは、経過時間でも、一定の数値(例えば数値の1)でも何でも大丈夫です。
とにかく、「soracomのsimをつかっているよ！」というようなkeep-aliveメッセージを一定間隔で送信できれば良いです。

そうしたところ、**wioLTEに電源が入っている間は長時間つづけて通信**することに成功しました。
下記のグラフは、wioLTEから電源をいれてからの経過時間を送信しています。なので、右肩上がりのグラフになっています。急に0に下がっている部分は、電源を外し通信を止めたためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/ec7730d1-ae40-bf97-8fe9-6b3fa636868d.png)

# まとめや理解できていないこと
休場しのぎの対応のため、他に良い方法がありそうです。
今回はsoracomのsimを利用したため、上記のような対処で上手くいきました。

同時に、LINEモバイルといった他のsimでも通信させてみました。
しかしkeep-aliveメッセージを利用しないと、ある一定時間経過ののち無通信状態に入ってしまいます。こちらのsimでは対処方法がわかりませんでした。

simをつかった長時間通信が必要なシステムには、再接続処理といった通信周りのエラーハンドリングをきっちりと実現する必要があることを痛感しました。
【A-Frame】3DOBJ（gltf）を出してみよう

#コード全体
https://github.com/i-am-ethan/aframe_tutorial_gltf-model

#書いた日
2020年8月23日

書いた目的
WebARの業界を盛り上げたい

#最低限これはできて欲しい

・前回の記事をみている
https://qiita.com/e_san_desuyo/items/005753a285a51e4efdcb
・VSCodeをインストールしている

#手順
（コード全体はgitのっけているのでそちらをみてください）
##（１）gltfファイルの3Dオブジェクトをダウンロードする
オススメのサイト：sketchfab
https://sketchfab.com/feed

##(2)ダウンロードしたファイルをindex.htmlと同じ階層に置く
.binファイルはgltfをダウンロードすると一緒についてきます
![スクリーンショット 2020-08-23 10.32.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/3af3a4e3-d450-0da2-f7b4-6eb371669c2f.png)

##(3)コードを書く
便宜上、カメラやライトを設置していますが、なくてもgltfモデルは出現します。

ポイントは
（１）gltfファイルとbinファイルをダウンロードすること
（２）a-asettsタグ、a-asset-itemsタグ、a-entityタグを記述すること
（３）IDを揃えること（IDは任意の名前です）
※私の場合、デフォルトの3DOBJがデカすぎたのでscaleで調整しています。


```index.html:index.html
<!doctype html>
<html>
  <head>
    <!-- aframeの導入 -->
    <script src="https://aframe.io/releases/1.0.4/aframe.min.js"></script>

    <title>ehe_practice</title>
  </head>
  <body>
    <a-scene>
      <!-- 3Dモデル（gltfファイル） -->
      <a-assets>
        <a-asset-items id="bird" src="scene.gltf" ></a-asset-items>
      </a-assets>
      <a-entity gltf-model="#bird" scale="0.01 0.01 0.01"></a-entity>
      <!-- カメラ設置 -->
      <a-camera
        position="0 10 30"
        cursor-visible="true"
        cursor-scale="5"
        cursor-color="#0095DD"
        cursor-opacity="1">
      </a-camera>
      <!-- ディレクショナルライト（平行光源）の追加 -->
      <a-light
        type="directional"
        color="#FFF"
        intensity="0.5"
        position="-1 1 2">
      </a-light>
      <!-- アンビエントライトの追加（環境光） -->
      <a-light
        type="ambient"
        color="#FFF">
      </a-light>
    </a-scene>
  </body>
</html>
```

完成イメージ
![スクリーンショット 2020-08-23 9.48.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/759a57b2-2f85-5764-1cc7-ed26be6261e4.png)
Cypressのheadlessモードでlogを表示させる

ローカルではうまく動くのにサーバに持っていったheadlessモードでうまく動かなくてなんで？と思いデバッグしようと思って`console.log`や`cy.log`を突っ込んでも何も出力してくれなくて困ったんですが、こうすればheadlessモードでも`cy.log`でログが表示されてウハウハです！

`cypress/support/index.js` と　 `cypress/plugins/index.js`の２つのファイルを触る必要があります。


 ```cypress/support/index.js
Cypress.Commands.overwrite("log", (subject, message) =>
  cy.task("log", message)
);
```

```cypress/plugins/index.js
module.exports = (on, config) => {}
  on("task", {
    log(message) {
      console.log(message);
      return null;
    },
  });
};
```

この2点を追加するだけで、`cy.log`でログがバリバリでてきます！

私はDockerから渡している環境変数がうまく渡せいないの原因でした。ログがなかったら発見するのにもっと時間がかかっていた思います。
プログラムの性能改善で統計を取るために用いるツール　プロファイラ(Profiler)

応用情報技術者平成30年秋期 午前問18

プログラムの性能を改善するに当たって，関数，文などの実行回数や実行時間を計測して統計を取るために用いるツールはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/8e201bea-c6d8-7bd8-4d85-6047cbad65fb.png)

１、プロファイラ(Profiler)は、
プログラムを実行した際に、どの関数が何回実行され、その処理時間がどれくらいであったかなど計測する性能解析ツールです。ボトルネックの特定やパフォーマンスの改善に役立てることができます。


２、パーサ（parse）とは、
コンピュータプログラムのソースコードやXML文書など、何らかの言語で記述された構造的な文字データを解析し、プログラムで扱えるようなデータ構造の集合体に変換するプログラムのこと。そのような処理のことを「構文解析」「パース」（parse）という。


３、プロファイルProfileとは、（結構　プロファイラ　と間違いしやすいだろう。。。）

プロファイル or プロフィールには「自己紹介」として自分の名前や住所、誕生日といった個人情報を記載することでしょう。

ユーザー プロファイルの画面パソコンでも同じです。例えば、「ユーザー プロファイル」（「コントロールパネル」－「ユーザーアカウント」内にある「タスク」の「ユーザー プロファイルの詳細プロパティの構成」をクリックすると開く）ならば、あなたのデスクトップの背景、スクリーン セーバー、ポインタ、サウンド、およびその他の機能の設定である、あなたの個人情報を保存しています。

よって、プロファイルは、パソコンのユーザーがよく使う設定が保存されているファイル群のことなのでした。

４、デバッガは、
デバッグ作業においてバグの発見や訂正を支援する ソフトウェアです。

５、コンパイラは、
ソースコードを一括翻訳して、機械語の目的プログラム(実行ファイル／ロードモジュール)を生成する言語プロセッサです。



参照：

https://www.ap-siken.com/kakomon/30_aki/q19.html

パーサ（parse）
http://e-words.jp/w/%E3%83%91%E3%83%BC%E3%82%B5.html
【新型コロナ】次のピークは12月？　Pythonでトレンド分析やってみた！

![Trend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76072/3c6398d4-f44f-bc1a-281d-72dd4bf11711.png)


#０．まとめ
(1)　PythonのStatsModelで新型コロナのトレンド分析をやってみた
(2)　厚労省のデータを分析したところ、最初のピークが４月、今回のピークは８月
(3)　と、言うことは、次のピークは12月か、という　お話

#１．やったこと
(1)　厚労省のホームぺージから、新型コロナ感染者のデータを取得
(2)　PythonのStatsModelで、トレンド、季節要因、残差に分解

(Special Thanks to)
[もものきとデータ解析をはじめよう](https://momonoki2017.blogspot.com/2018/02/python1.html)を参考にさせて頂きました。
大変、ありがとうございました。

#２．厚労省のホームぺージから、新型コロナ感染者のデータを取得
[厚労省のホームページ](https://www.mhlw.go.jp/stf/covid-19/open-data.html)から、陽性者数をダウンロード。csvデータで簡単にダウンロードが出来るのは、とても好感が持てた。厚労省、スゴイ！

詳しい分析手法については、前述の「もものきとデータ解析をはじめよう」を参照してください。

まずは、準備作業。

```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
% matplotlib inline
```

そして、ダウンロードしたデータを読み込む。1月16日以降のデータが入っている。

```python
df=pd.read_csv('pcr_positive_daily.csv')
df.head()
```

![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76072/6f3c3ba2-6c68-2f68-acd8-01ab32dc3ead.png)

ちなみに、直近のデータは一昨日のもの。基本的に、前日のデータまで取得できるが、更新されるのは、夕方。土日でも更新されるところがエライ！

```python
df.tail()
```

![pic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76072/a6141456-e6c1-e473-d988-0fff880c13c9.png)

さて、データが公表されている１月後半以降、足元までの感染者数の推移を見てみよう。


```python
%matplotlib inline
df.plot()
```

![PCR1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76072/1b81447c-a55d-72ef-e055-2d2718239cae.png)

ちなみに、matplotlibは、そのまま使うと、いわゆる「豆腐」になります(笑)
解決方法は、以下のぺージが、とっても参考になりました。ありがとうございます。
[Googleコラボのグラフ（matplotlib）を日本語化する方法！](https://tecurio.com/googlecolab_matplotlib_japanize/)

#３．PythonのStatsModelで、トレンド、季節要因、残差に分解
さて、やっと本題です。
厚労省のデータを、PythonのStatsModelを使って、分解します。


```python
numbers = pd.Series(df['PCR 検査陽性者数(単日)'], dtype='float')
numbers.index = pd.to_datetime(df['日付'])

res = sm.tsa.seasonal_decompose(numbers)

original = numbers # オリジナルデータ
trend = res.trend # トレンドデータ
seasonal = res.seasonal # 季節性データ
residual = res.resid # 残差データ

plt.figure(figsize=(8, 8)) # グラフ描画枠作成、サイズ指定

# オリジナルデータのプロット
plt.subplot(411) # グラフ4行1列の1番目の位置（一番上）
plt.plot(original)
plt.ylabel('Original')

# trend データのプロット
plt.subplot(412) # グラフ4行1列の2番目の位置
plt.plot(trend)
plt.ylabel('Trend')

# seasonalデータ のプロット
plt.subplot(413) # グラフ4行1列の3番目の位置
plt.plot(seasonal)
plt.ylabel('Seasonality')

# residual データのプロット
plt.subplot(414) # グラフ4行1列の4番目の位置（一番下）
plt.plot(residual)
plt.ylabel('Residuals')

plt.tight_layout() # グラフの間隔を自動調整
```

結果は、以下の通りです。
コードにも書きましたが、上から順番に、
①オリジナルデータ
②トレンドデータ
③季節性データ
④残差データ
と　なります。

![PCR2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76072/c794d686-e164-167f-bb94-99753eadd06a.png)

２番目のトレンドデータに着目して下さい。
最初のピークが４月上旬、今回のピークが８月上旬にあることが見てとれます。
そこから考えるに、次のピークは12月上旬でしょうか。

#４．最後に
新型コロナが早期に終息することを、ただただ祈っています。
しかしながら、現実は厳しい　と、認識しています。

新型コロナの病名はCOVID-19ですが、ウイルス名はSARS-CoV-2だそうです。
このウィルス名はSARSに似ているからだそうです。

そのSARSが流行ったのは2002年ですから、今から20年近く前です。
しかしながら、SARSのワクチンは未だに作られていないようです。

大変な時代だからこそ、出来ることを粛々と、やっていきたいと思います。

新型コロナの影響で、飲み会がなくなったのは、寂しい気もしますが、
在宅勤務の推進など、合理的な働き方を進める、良い機会になった面もあります。

こんな時こそ、落ちついて生きましょう:relaxed:

最後の最後に、参考とさせて頂きましたサイトの関係者の方々に、御礼、申し上げます。
タスクスケジューリングープリエンプション方式(Preemption)、ディスパッチ（Dispatch）

応用情報技術者平成30年秋期 午前問17

プリエンプション方式のタスクスケジューリングにおいて，タスクBの実行中にプリエンプションが発生する契機となるのはどれか。ここで，タスクの優先度は，タスクAが最も高く，タスクA＞タスクB＝タスクC＞タスクDの関係とする。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9dc815b9-a39b-98af-f6b4-9412c3fb942c.png)


１、プリエンプション(Preemption)とは、
実行状態にあるタスクがCPUの使用権を奪われ実行可能状態に移されることをいい、以下の状態を満たした場合に起こります。
　・実行状態のタスクより優先度の高いタスクが実行可能状態になる
　・実行状態のタスクに割り当てられたCPU使用時間が満了する


当該質問には、タスクBとCの優先度は同じので、Cが実行可能状態になったでも、プリエンプションにならないですね。ただ、Aが実行可能状態になった場合は、優先度が高いだから、プリエンプションが発生するだろうね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9c0539d5-e2c9-72ff-4766-3e5603d3310e.png)


２、ディスパッチ　dispatch
ディスパッチとは、複数のプログラムを実行中のマルチタスクオペレーティングシステムにおいて、プログラムに実行権を渡すことである。


参照：
https://www.ap-siken.com/kakomon/27_aki/q16.html

ディスパッチ
https://www.weblio.jp/content/%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81
Windows 10へpygraphvizをインストールする

# PyGraphvizとは
グラフ描画ツールGraphvizのpython用ラッパーです。
Windows環境ではインストールにひと手間かかるためメモ。

## Graphviz本体のインストール
[公式サイト](http://www.graphviz.org/)からGraphvizをインストールする。

~~2020/8/21時点で下記フォルダにあるgraphviz-install-2.44.1-win64.exeが最新版
https://www2.graphviz.org/Packages/stable/windows/10/cmake/Release/x64/
※cmakeフォルダではなく、msbuildフォルダ内には32bit版しかない。またChromeのセキュリティ警告が表示される。
※インストール中、PATHを通すか選択する画面がある。
　デフォルトではPATHを通さない設定(Do "not" add Graphviz to the system PATH)が選択されているため注意。
　PATHを通さない場合、PyGraphvizから使えない。~~

2.44.1(Cmake)版にはneotoが[含まれていないバグ](https://gitlab.com/graphviz/graphviz/-/issues/1753#note_395587188)がある。2020/8/21時点で下記がneotoが含まれ、警告の出ない最新版。
https://www2.graphviz.org/Packages/stable/windows/10/msbuild/Release/Win32/graphviz-2.38-win32.msi

2.38(msbuild)版のインストーラにはPATH設定の画面はないため、別途自分で設定する。

## PyGraphvizのインストール
※「pip install pygraphviz」では、windowsではうまく動かない(インストール中にエラー発生)
[対策](https://github.com/CristiFati/Prebuilt-Binaries/tree/master/PyGraphviz)されたwhlファイルが公開されているためこちらを利用する。


下記の中から適切なwhlをダウンロードし、pipでインストールする。
2020/8/21現在では、下記が最新版。
https://github.com/CristiFati/Prebuilt-Binaries/tree/master/PyGraphviz/v1.5/Graphviz-2.42.2
ファイル名中、cpXX-cpXXのXX部分はpythonのバージョンを示す。
Python 3.8であれば、cp38-cp38を使う。

# 参考資料
http://april.fool.jp/blogs/2013/12/17/graphviz%E3%81%A7%E3%82%AB%E3%83%83%E3%82%AF%E3%81%84%E3%81%84%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E3%81%93%E3%81%86/
30時間制の時間表現を扱うパッケージを作った

## どうして？

テレビやラジオのタイムスケジュールを見ると、25:00のような表現を目にすることがありますよね。
ラジオ番組を日常的に聴取していると、"木曜1:00"という表現よりは、"水曜25:00"という表現の方がしっくりくるのですが、これを感覚的に使えるパッケージが見当たらなかったので、作ることにしました。
そもそも、この表現方法の名前が分からなかったので、ここでは仮に30時間制としています。（28時間制とか30時間制とか、いくつかありそうです）

![30時間制の説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271949/445c26d4-2f0f-2234-34a3-256f23758961.png)

## やったこと

timeパッケージを拡張してtimeextパッケージを作りました。
0:00:00-05:59:59間の時刻を30時間制に置き換えます。
<https://github.com/bluemon0919/go-timeext>

用意した機能は`Parse`と`Format`です。

### timeパッケージの機能との差分は？
timeextパッケージは0:00:00-05:59:59間の時刻を30時間制に置き換えますが、それ以外の時刻についてはtimeパッケージと同じ動作をします。

## 使い方
### 時刻を表す文字列をtime.Time型のデータにパースする

例えば`2020.07.12 25:00:00`という時刻をパースしたい場合、次のように呼び出すことでtime.Time型のデータを取得します。
この時刻データは`2020.07.13 01:00:00`と同値になります。

```go
const Layout string = "2006.01.02 15:04:05"

parsed, _ := timeext.Parse(Layout, "2020.07.12 25:00:00")
f := time.Time(parsed).Format(Layout)
fmt.Println(f) // 2020.07.13 01:00:00
```
https://play.golang.org/p/vHSYCGfxGz6

### time.Time型のデータから30時間制の文字列を取得する

逆に`2020.07.13 01:00:00`を30時間制の時刻として取得したい場合、次のコードで文字列を取得できます。

```go
const Layout string = "2006.01.02 15:04:05"

parsed, _ := time.Parse(Layout, "2020.07.13 01:00:00")
f := timeext.TimeExt(parsed).Format(Layout)
fmt.Println(f) // 2020.07.12 25:00:00
```
https://play.golang.org/p/qP8EOev_JrQ