OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】都道府県別のデータを地図にプロットする（全国の車の所有台数）

# この記事の目的

Pythonで以下の様な, 都道府県レベルの塗り分け地図を描く
市区町村レベルなら[こちら](https://qiita.com/yuto16/items/112cfbaf40cb078ec5ca)へ

![how_many_cars_map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540956/09530bc8-1c5f-1867-26a6-a738c746438e.png)

ちなみにデータは全国の乗用車の所有台数を使用した.

ページの最後に[コード一覧](#コード一覧)があります.

# 解説

色付きの地図を作成するために, [japanmap](https://pypi.org/project/japanmap/) というライブラリを用いる

```bash
pip install japanmap
```


その他ライブラリの準備

```python
import numpy as np
import pandas as pd
import cv2
from PIL import Image
import matplotlib.colors
import matplotlib.pyplot as plt
from japanmap import *
```

データを読み込み
データは[ここ](https://www.airia.or.jp/publish/statistics/number.html)から2019年のExcelファイルをダウンロードして加工した. 

```python
df = pd.read_csv("how_many_cars.csv")
df = df.iloc[:53,:8]
```

都道府県別の乗用車台数を辞書形式で保存

```python
for k,n in zip(df["運輸支局"], df["乗用車"]):
    if k in ["札幌", "函館", "旭川", "室蘭", "釧路", "帯広", "北見"]:
        tmp=1
    else:
        tmp = pref_code(k)
    tmp = pref_names[tmp]
    #print(k,tmp)
    if tmp not in num_dict:
        num_dict[tmp] = n
    else:
        num_dict[tmp] += n

```

num_dictの中身は、まだこんな感じ

```python:num_dict
>> print(num_dict)
{'三重県': 1161089.0,
 '京都府': 1007847.0,
  ...
 '鳥取県': 346273.0,
 '鹿児島県': 955360.0}
```

作成したnum_dictの値を台数から色情報(RGB)に変換

```python
n_min = min(num_dict.values())
n_max = max(num_dict.values())

#print(n_min)
#print(n_max)

cmap = plt.cm.rainbow
norm = matplotlib.colors.Normalize(vmin=n_min, vmax=n_max)

def color_scale(r):
    tmp = cmap(norm(r))
    return (tmp[0]*255, tmp[1]*255, tmp[2]*255)

for k,v in num_dict.items():
    num_dict[k] = color_scale(v)
```

最終的なnum_dictの中身

```python:num_dict
>> print(num_dict)
{'三重県': (19.5, 157.4059464288972, 241.021876181009),
 '京都府': (41.49999999999999, 128.85792190698177, 246.1066417260737),
  ...
 '鳥取県': (127.5, 0.0, 255.0),
 '鹿児島県': (47.5, 120.63885699318257, 247.29821868892742)}

```


japanmapにnum_dictを渡してプロット

```python
plt.figure(figsize=(10,8))
plt.imshow(picture(num_dict))

sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
plt.colorbar(sm)
plt.show()
```

以上！


# コード一覧

```bash
pip install japanmap
```

```python
import numpy as np
import pandas as pd
import cv2
from PIL import Image
import matplotlib.colors
import matplotlib.pyplot as plt
from japanmap import *

df = pd.read_csv("how_many_cars.csv")
df = df.iloc[:53,:8]

num_dict={}

for k,n in zip(df["運輸支局"], df["乗用車"]):
    if k in ["札幌", "函館", "旭川", "室蘭", "釧路", "帯広", "北見"]:
        tmp=1
    else:
        tmp = pref_code(k)
    tmp = pref_names[tmp]
    #print(k,tmp)
    if tmp not in num_dict:
        num_dict[tmp] = n
    else:
        num_dict[tmp] += n

n_min = min(num_dict.values())
n_max = max(num_dict.values())

#print(n_min)
#print(n_max)

cmap = plt.cm.rainbow
norm = matplotlib.colors.Normalize(vmin=n_min, vmax=n_max)

def color_scale(r):
    tmp = cmap(norm(r))
    return (tmp[0]*255, tmp[1]*255, tmp[2]*255)

for k,v in num_dict.items():
    num_dict[k] = color_scale(v)

plt.figure(figsize=(10,8))
plt.imshow(picture(num_dict))

sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
plt.colorbar(sm)
plt.show()
```
Railsでのjoinsの結果のidについて

Railsでテーブル結合してデータを取得した時、idを参照元の主キーにしたいのに参照先の主キーになってしまっていた。
結論として

```
Hoge.joins(:fuga).where(fuga_name:"hoge").select("fuga.*,hoge.*")
```
このようにselectで最後に指定したテーブルの主キーが結合したデータの主キーとなる。
TECH::EXPERT生徒向け、プロゲートでやった方がいいレッスン ランキング

#はじめに
[プロゲート](https://prog-8.com/)とはWEBブラウザ上でプログラミングが学習できるWEBサービスで、
PCの環境構築が不要で、誰でも気軽に学習できること、わかりやす、可愛いので、子供の学習にも最適です。

さて、そんなプロゲートをTECH::EXPERT生の私がやってみて、
出来るだけ**カリキュラムとの関連性が高いおすすめレッスン**をランキングにしてみました。
このレッスンの出来がどうのこうのではなく、あくまで
**「TECH::EXPERTの学習に役立つか？」**という点だけで紹介します。
※課金していることが前提です。

#1位　scss
カリキュラムで必要最低限の知識の部分のみ補っているところが高評価。
どんなに良いレッスンでも、時間がない中で課題に追われていると、
できるだけ関連性の高い学習をしたいと思うのは人間だもの。（みつお）
そのため、
**①基本的なところ全部出てくる**
**②カリキュラムとの関連度が高い**
**③応用カリキュラムで大活躍**
で、納得の1位だと思ってます。

#2位　ruby
基礎カリキュラムのつまづきどころですが、
書いた量で力を底上げしてくれる心強いレッスンです。
中間テスト合格までしっかりお世話になります。
応用編に入ったら、あまり活用しないですが、1位同様、無駄なく関連している点が高評価です。
個人的にオススメな学習方法は、**アプリ版をやってからパソコン版をやること。**
パソコン版からやると難しくてグダグダになりますが、
アプリ版をやってからパソコン版をやると「かける…かけるぞ！」となります。
逆の順でやると簡単すぎてあんまり効果ないです。

#3位　html/cssのflexbox
Cssのfloat苦手意識あるなら、これを覚えたら心強いです。
応用カリキュラムでも使用している箇所があるほか、
いろんなレイアウトに活用できる方法なので、覚えておいて損無いです。
カリキュラムでは一部でしか使用されていないのですが、
実用性がめっちゃ高いので3位です。

#4位　Ruby on Rails
めっちゃボリュームがあるすげーレッスンです。
基礎カリキュラムのPictweetやっている時に並行してやることをお勧めします。
とにかく、「ルーティング → コントローラー → ビュー」を復習できて、
Railsの基礎を固めてくれる心強いレッスンです。
応用カリキュラム入ってしまうと、あまりお世話にならない点と、
GEM使用については触れない点でカリキュラムとの乖離があるので時間がない時にやるのは作戦ミスです（1敗）
カリキュラムではdeviseを使ったユーザー管理をしますが、
プロゲートではメソッドを自分で書くので「ああ、GEMって裏でこんな働きをしてくれてるんだな」っていう点がわかるのは新鮮でした。

#5位　HTML /CSS
基礎カリキュラムの最初の方から苦手意識があるならばこのレッスンをした方が良いでしょう。
応用入ると、haml,scssを覚えなければいけないことと、
Rubyやrailsに時間を割いた方がいいのではないか？という点でこの順位です。
本当にHTMLを1ミリも触ったことがないなら、それはそれでhamlの方が慣れ親しめるチャンスなので、
無理してHTML覚えなくていいんじゃね？というのが個人的な感想

#6位　jQuery
応用カリキュラムで登場する言語です。
プロゲートでは「見た目をリッチにするため」に使用していますが、
応用カリキュラムではajaxというサーバーとの連携に使用しています。
その点でカリキュラムとレッスンに乖離がありますが、
jQueryの書き方に慣れる点と、
応用カリキュラムであまり触れない「画面を賑やかにする」を補えるという点で良いレッスンだと思っています。

#7位　javascript
カリキュラムでさらっと紹介しているだけなので、それを基礎からガッチリ学習できるレッスンです。
カリキュラムでは使用することは少ないですが、スマホアプリなどに使用されているものなので、
学習のとっかかりとして素晴らしいレッスンであることと、railsの次にボリューミーで大満足。

#8位　SQL
Sequel proのクエリのところで打ち込むコードの書き方が勉強できます。
まだ恩恵を受けてないけど、データ数が多くなってきたら活用するのではないかと感じます。
また、「こういうふうにデータを集計して活用するのか」とアプローチを変えて考えると、DB設計の時の参考になります。

#9位　Git
応用カリキュラムでgitをやりますが、基本的にはgithubのデスクトップアプリを使用するので、
コマンド操作をほとんどしなくなる点で微妙な位置にいるレッスンですね。
現場によってはgithub使用してないところもあるそうなので（どうやってファイル管理してるんだ…）、
そういう時にはここでおさらいするのが良いかな？なんて思ってます。

#10位　Java
ソースコードがめっちゃ長い。
Rubyってシンプルでいい言語やなって。
そう、人類の軌跡に感謝するために一度やってみて。
ほんと意味わかんねぇから。
ありがたみがわかったら、中断して他のレッスンやってください。

#おわりに
いかがでしたでしょうか。
これから勉強するけど、出来るだけ効率的に勉強したいなって方の参考になればと思います。
私は読んでも読んでも頭に入らないタイプなので、プロゲートのように書いて覚える学習方法が性に合ってました。
キャラクターも可愛いし、とにかく崇拝しています。
苦手だなぁとか、わからない！つらい！と思ったら、とにかくプロゲートで書いて基礎を固めるのが良いと感じました。
書いた量がイコールで能力に反映するわけではないですが、

読んでもわからないだったら書く！　まずやってみる！

[プロゲート](https://prog-8.com/)をやってみるでもなんでも、
色々試して自分にあった学習方法を見つけられると良いですね。
[vmware][ubuntu]Ubuntu仮想マシン(18.04)のディスク容量の拡張

# 背景

開発用の仮想マシンのディスクの空きがなくなってきたので拡張。
一昔前は`fdisk`コマンドを使ってやや手間がかかる＆間違えないか不安の伴う作業でしたが、今はGUIツールで簡単にできちゃうのですね。驚

# ディスク容量の拡張手順
## VMWare側での作業

ディスク容量の拡張を行います。

![VMWare](https://i.gyazo.com/b593d0754e4a5bcc25fd911780e06781.png)

## OS(Ubuntu)側での作業

ディスクツールでパーティションのリサイズ

### ディスクツール起動

![](https://i.gyazo.com/e84210ceb186584432f56da44de8db6c.png)

### Resize処理起動

![](https://i.gyazo.com/e6106996a3d06a2e5b8e7488c7adb23b.png)

### Resize実行

![](https://i.gyazo.com/57beb24b1c373f4c33c1d994572b326f.png)
WEBアプリケーション開発における旬の技術調査

# はじめに
私は、約3年勤めたSIerを退職し、タイへ２ヶ月、オーストラリアへ1年の語学留学へ行ってました。
日本に戻ってきて、カンファレンスに参加したり、元職場の先輩と飲みに行って現状を探ったりしたところ、本当に1年ちょっとしか経ってないの！！？ってぐらい進化していたので、自分用にまとめようと思います。

間違いもたくさんあるので、その都度直していこうと思います。

- 以下、今回まとめようと思っているもの
  - Docker
  - TypeScript
  - spring-boot
  - React
  - Angular
  - AWS

# Docker
本当に衝撃的だった。
過去にアーキテクチャ設計メンバーとして働いていた自分にとって、こんな画期的なもの、がなぜ3年前には存在しなかったのか呪ったほどである。

想像してみてほしい。
開発メンバー５０人以上の大規模PJ、フロントエンドとバックエンドで異なるIDEによる開発環境と実行環境、協力会社と社員でセキュリティレベルが異なりダウンロードできないファイル。
地獄である。手間である。平気で1日の工数として割り当てられる。無駄。


それがすべてDockerで解決される。
DockerFile、docker-composeファイルを作成して配布・起動すれば、一発で全く同じ仮想環境が作られる。

# TypeScript
ざっくりいうと、静的型付け言語のJavaScriptって感じ？
バックエンドメインで開発してきた自分としては、動的型付け言語の型推測とかは慣れないので助かるし、デバック前に型の不一致によるエラーが検出できるのはメリットだと思う。（行数は増えるけど）
また、babelでEcmaScriptのVersion？を気にしなくていいっていうのも大きいメリットだなって思う。
最終的に実装対象に合わせたJavaScriptに変換されるのも、すっごいJavaっぽい。

# spring-boot
Springの設定ファイル不要版？っていう風に聞いた。by元先輩社員
Springで最も理解できないxmlファイルを書かなくていいっていうだけで神に聞こえる。ただ、アノテーションなどの基本的なSpringの機能は同じみたい。まだ、あまり調べていないがすっごくきになるし、早く使ってみたい。

# React
Facebookが作ったJavaSpringフレームワークらしい。
対抗馬にAngularがあるが、最近はReactのほうが勢いがあるらしい。by元先輩社員
ただ、先日参加したJJUGではAngularとSpring-bootの開発デモが行われていたし、Angularの方がネットでもよく見るので、少し混乱気味。
実際触ってみて感触を確かめたいので、両方で試作アプリを作ってみる予定。

ざっくり見た感じ、JavaScriptフレームワークでHTMLとJavaScript部分がJavaのインターフェースと実装みたいな関係になったのかなって印象。（器だけ作って中身は別ファイルでって意味）
個人的には大歓迎。
HTML内のidとか要素をわざわざ気にして、JavaScriptで取り出してーってしているの、、、馬鹿らしいなーって思ってたので。

# AWS
いたるところで見る。
これも抑えておきたい（抑えておかなければならない）技術の一つなのは間違いない。
ちょっと個人で触ってみるのと、企業で採用するのでは使用する機能や規模が大きく異なる気はするが、とりあえず個人で、無料で使用できる範囲で試してみたいと思う。

#まとめ
たった1年ちょっとで旬の変わるIT業界の恐ろしさを肌で感じた。
前職では、目の前にあるタスクをやっていくので精一杯で、カンファレンスに参加したり、技術について勉強したりする余裕がなかったんだけど、この機会にしっかり学んで、一人でもサーバーからフロントエンドまで開発できるようにしとこうと思う。
VScodeでGitHubの連携する時にハマったこと

#作成したファイルがプッシュ出来なくなってしまった
VSCodeで作成したphpファイルをGitに上げたいと思い、GitHubでレポジトリを作成し上げようとしたら、何故か出来なかったので、備忘録として寄稿することに致しました。
※ちなみにこれは初回ではなく、2回目の出来事なので、VSCodeからGitに接続を行うといった初期設定は省いています。

#行ったこと
##GitHub
リポジトリの新規作成画面にて、以下のように設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/9b76ccb6-2e28-0002-15e0-97d140008570.png)

「Create Repository」をクリック後、「READ ME」ファイルがリポジトリ内に作成されていることを確認。
ここで、「Clone or download」でリポジトリのURLをコピーしました。

##VScode
上げたいファイルが格納されているフォルダに移動し、リモートリポジトリ追加のコマンドをターミナルで実行。

```
git remote add origin 作成したリポジトリのURL
```
リモートリポジトリ追加後、「git pull origin master」でリモートリポジトリをローカルに持って来ようとしたところ、以下のようなエラーが発生しました。

```
$ git pull origin master
From https://github.com/fuzzy-yusuke/test
 * branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories
```
どうやら、マージしようとしたら拒否された模様。

#fetchとrebaseで解決
検索して調べると、「git fetch」と「git rebase」のコマンドを実行すると、プッシュが成功したとありましたので、早速実行すると、無事作成したGitHubのリポジトリに上げることが出来ました。
ちなみにこの二つの意味は下記の通りです。

fetch:リモートリポジトリの最新データを取得すること。
      これを行うことで、ファイルの競合を防ぐことが出来ます。
rebase:作業が完了したブランチを、分岐元のブランチ（今回の場合はmaster）にくっつけること。

#git mergeも行う（2020/04/24 追記）
最近またこのエラーに遭遇したため、上記の方法を試しましたが、エラーが解決出来ませんでした。
そこで、以下のコマンドを実行しましたが、上手くコミット出来ました。

```
$git merge --allow-unrelated-histories origin/master
```
merge:修正・変更したブランチを元のブランチに統合させること。

#原因は何だったのだろうか
出力されたエラーメッセージをググったり、発生したことや実行した手順等を元に記事を探ったところ、GitHubのリポジトリには「READ ME」のファイルがあるのに、ローカルのフォルダに無かったことが原因である可能性が高いと考えました。
そんな状態で「fetch」でリモートリポジトリの最新状態を取得せずにプッシュしようとしたが為に、マージが拒否されてしまったものだと思われます。
前回上手くプッシュ出来たのは、おそらく「READ ME」を作成しなかったからだと思われます。（この時はノートを残していなかった…）
（2020/04/24 追記）
又、ローカルにリポジトリを作成する前にREADME.mdをリポジトリから削除したため、「README.mdを削除した。」という別の分岐のヒストリーを残したままコミットしようとしてしまったから、fetchとrebaseだけではダメだった...と考えました。
「確認と更新は大事」ということを今回で学びました。
（というかREADME.mdが要らない時は最初から作らない。）

#参考文献

・[git push -u origin masterでrejectにハマる]
(https://qiita.com/watsuyo_2/items/aa95e54c4974a80123e9)

・[【git】git pushがrejectされたときの対応方法]
(https://www.softel.co.jp/blogs/tech/archives/3569)

・[初めてGitHubリポジトリにpushしたらrejectedエラーになったときの対応メモ]
(https://qiita.com/takanatsu/items/fc89de9bd11148da1438)
FACTORY START UP SERVICES, PLEASE WAIT FOR POWER OFF BUTTON 問題の解決

Xperia で 端末リセット（工場出荷状態）にした後に
「FACTORY START UP SERVICES, PLEASE WAIT FOR POWER OFF BUTTON」
と連続で表示される問題（とそれに続いて起こるあれこれ）の解決方法（の一つ）

他の情報でどうしても解決しなかったがadbコマンドでパッケージを無効化することで解決できた。

対象のAndroid端末以外に必要な環境

* adbコマンドが利用可能になっているPC
* Android端末接続するためのUSBケーブル

手順

* Android端末側でUSBデバッグを有効にして（詳細は省略）USBケーブルでPCと接続する
* PC側で作業コマンドプロンプトを開く
* 以下を実行

```
$ adb shell 
$ pm disable-user --user 0 com.sonyericsson.startupflagservice 
```

Package com.sonyericsson.startupflagservice new state: disabled-user
と表示されたら成功
祝日に通知しない！SlackリマインダをGASでつくる

# はじめに

Slackのremindで↓の設定をしていると、祝日も通知が来て嫌だったのでつくりました。
`/remind @here "10時から朝礼します。参加しますか？" at 10:00 every weekday`

Google apps script(GAS)でなんでもできる。

## 1. Slackアプリ追加

Slack API の [Your Apps](https://api.slack.com/apps) からアプリを追加する

追加できたら設定画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/386426fa-91f2-f2b3-6666-4e33674ba9cc.png)

### OAuth & Permissions 設定

左メニューの「OAuth & Permissions」から「Install App to Workspace」を選択してワークスペースのTokenを取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/736852c3-ac5a-0da4-3e9e-34ae7702b66f.png)

## 2. GASからSlackにメッセージ

### GAS作成
Googleドライブの +新規 > その他 > Google apps script を選択

リソース > ライブラリ で「M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO」を追加し、最新バージョンを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/5cd72e40-064f-b5f2-0fe4-a0f1baf77d5c.png)

ファイル > プロジェクトのプロパティ > スクリプトのプロパティ にTokenを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/edfa76e8-8d14-33cf-437f-af922088bec5.png)

サンプルプログラムをコピー

```js
var token = PropertiesService.getScriptProperties().getProperty('SLACK_TOKEN');

function test() {
  var slackApp = SlackApp.create(token);
  var channel = "#qbot-test";
  var message = "おはよう";
  slackApp.postMessage(channel, message);
}
```

追加した関数「test」を選択して実行▶
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/184e2a01-91aa-ef3c-ced5-5640c501be9f.png)

いろいろ許可して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/a2e6c813-d551-f059-92dd-d84d6613f4b3.png)

SlackにメッセージがきたらテストOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/c645cf81-6da9-da74-4a18-38be0141849b.png)


## 3. 祝日に通知しないトリガーを作成する

### トリガー登録

トリガーの実行する関数を準備

```
function addTrigger() {
  // ここに処理
}
```

編集 > 現在のプロジェクトのトリガー (またはストップウォッチアイコンメニュー) を選択

右下の「＋トリガーを追加」から実行する関数を選択
毎日朝6時から7時に実行する設定にしています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536619/f87e191a-0d1e-d285-abe1-b50e2646243a.png)


### 平日だけ通知する

[【GAS】休日・祝日を判定する関数](https://qiita.com/jz4o/items/d4e978f9085129155ca6) を使います。

トリガーで追加した「addTrigger」の処理に休日ならそのままreturnするようにします。
平日なら時間と関数を指定して新しくトリガーをセットします。
実行済みのトリガーが残ってしまうのでdeleteTriggerで削除しています。

```js
function addTrigger() {
  if (isHoliday()) {
    return;
  }

  var date = new Date();
  date.setHours(9);
  date.setMinutes(30);
  ScriptApp.newTrigger("morningBot").timeBased().at(date).create();
}

function deleteTrigger(name) {
  var triggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == name) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

function morningBot() {
  deleteTrigger("morningBot");
  var channel = "#qbot-test";
  var message = "朝礼参加しますか？";
  slackApp.postMessage(channel, message);
}
```

## 最後に

よい週末、祝日をお過ごしください
Cosmos DBを使ってみた

Cosmos DBは新規作成時にSQL API, Table APIなどDBの種類を指定します。
指定した種類によって、使い方が変化します。

## SQL APIで作成した場合
category 列で検索して3レコードヒット 
<img width="1435" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/c361078f-89df-d1f1-b3fc-0fe87895b337.png">
 
タイムスタンプ列でレンジ検索してソート 
<img width="1435" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/a0647f60-7cfd-8c94-0991-6a9ef6b0560f.png">

列のSelect。その列がないレコードはブランクになる。
<img width="1440" alt="スクリーンショット 2019-11-29 1.19.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/91b108c7-9cc5-1a37-eed0-71aa0878d960.png">

SumしてSelect
<img width="1440" alt="スクリーンショット 2019-11-29 1.19.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/73504f2e-cfb7-47ed-db9e-79128ea9600b.png">


## Table APIで作成した場合
Table Storageと同じイメージ。Partition KeyとRow Keyをキーとしたキーバリューストア。

 
Partition KeyやRow Keyで絞り込み。
<img width="1435" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/0113db8a-053f-2a79-ae77-42481d7372b9.png">
 
 
任意の列を条件に指定して絞り込み。Table Storageと違い、すべての列にインデックスが作成されるとのこと。
 <img width="1435" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/2de3451b-9087-0653-2b95-16ad75fd58af.png">
【AutoHotKey】特定のアプリのみでホットキー適用

```php:test.ahk
#IFWinActive, ahk_exe Code.exe
    LCtrl & WheelUp::
        WinGetTitle, title, A
        If (title = "test.ahk - JavaScript - Visual Studio Code" )
        {
            MsgBox, %title%
            SetKeyDelay -1
            Send {Ctrl Down}{;}{Ctrl Up}
        }
        Return
#IFWinActive
```

>参考
[AutoHotKey で右クリック＋ホイールでズームしたい - ねとめもー](http://nmm.blog.jp/archives/51479428.html)
[Autohotkey: 特定のアプリケーションのみの条件分岐（IF文）について – とろテク](https://wp2.trojanbear.net/1026.html)
C言語のポインタについて（3章～4章）

# はじめに
引き続き、C言語のポインタについて理解を深めるため、この本を読み備忘録としてまとめる
[C言語ポインタ完全制覇](https://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E5%88%B6%E8%A6%87-%E6%A8%99%E6%BA%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%82%BA%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-%E5%89%8D%E6%A9%8B-%E5%92%8C%E5%BC%A5/dp/4774111422/ref=pd_sbs_14_1/356-1543581-5839563?_encoding=UTF8&pd_rd_i=4774111422&pd_rd_r=99ef5424-127c-4ce2-9ee4-a653746dde39&pd_rd_w=t3Lij&pd_rd_wg=gz6EY&pf_rd_p=1585d594-d9d0-474b-8a4e-69eca1566911&pf_rd_r=2F0Q3T3B4ZM8G0F18W1B&psc=1&refRID=2F0Q3T3B4ZM8G0F18W1B)

この本には見るたびに発見が見つかって面白い。
感謝、感謝。ありがとうございます。

# 3章
## 宣言の解読方法
1. 識別子（変数名、関数名）を見つける
2. 識別子に近い順でまとめる
   - 宣言をまとめる括弧
   - 配列の[ ] , 関数の（ ）
   - ポインタの *
3. 最後に型の指定子をまとめる

### 例題1
・ int (*func)(double);
1. 識別子はfunc, funcはポインタ
2. 関数の引数はdouble, 戻り値はint
　→ funcは戻り値がint、引数がdoubleの関数へのポインタ 

### 例題2
・ int hoge[10];
1. 識別子はhoge, hogeは配列, 型はint
　→ hogeはint型の配列（要素10）

### 例題3
・ int *hoge[10];
1. 識別子はhoge, hogeは配列, hogeの配列はポインタ, 型はint
　→ hogeはint型を指すポインタの配列（要素10）

### 例題4
・ int (*hoge)[10];
1. 識別子はhoge, hogeはポインタ, hogeのポインタは配列, 型はint
　→ hogeはint型の配列（要素10）を指すポインタ

### 例題5
・ int hoge(void (*func)(void))
1. 識別子はhoge, hogeは関数,戻り値はint
2. 識別子はfunc, funcはポインタ,引数はvoid,戻り値はvoid
　→ hogeは関数（引数は、戻り値がvoidで引数なしの関数ポインタ）


## 配列へのポインタ
・配列へのポインタと、配列の先頭アドレスを表すポインタは同じ値だが、
　配列か、要素を指すかで異なる

```c
int array[3];
int (*array_p)[3];

array_p = &array; //array[3]の配列へのポインタ

//array_p = array; int型の値（array[0]）へのポインタ
```

```c
int *p;
int array[10];

p = array; //int型の値（array[0]）へのポインタ

// array = p; すでに定義済みの配列のアドレスにポインタ変数は上書きできない
// これはint a ですでに確保した値の &a に値を入れようとしているのと同義
```
これと同様のことを行おうとしているのが

```c
char str[10];
str = "abc";
```

これはすでに要素10の配列strを定義しているが、
配列の先頭アドレスに "abc"の先頭アドレスを入れようとしているのも同様。

## アロー演算子
・構造体のメンバへのアクセスで
　p->hoge は (*p).hoge と同義

## const修飾子はconstの後に続く識別子が読み出し専用「読み出し専用」
・const 変数 は 変数が読み出し専用
・char * const 変数 は 変数が読み出し専用
・const char *変数 は 変数の参照先が読み出し専用
・char const *変数 は 変数の参照先が読み出し専用

## typedefの使い方
・typedef char *string
charのポインタ変数をstringと定義

## 文字列リテラル
・次の表現はどれもお同じ
char *str = "abc";
char str[] = "abc";
char str[] = {'a','b','c','¥0'};

# 4章
## ポインタの反則遊び その1
まずは、わかりやすい例

```c
    int a[5] = {1,2,3,4,5};
    int *b = a;
    printf("%d",*(b + 5));
    printf("%d",a[5]);
```
これは、配列の要素数以上の値を指定している。
コンパイルでエラーにはならない。

## ポインタの反則遊び その2
```c
typedef struct {
    int npoints;
    Point *point;
}Polyline;

PolyLine *polyline;

↓↓↓↓↓↓↓ あなたの記事の内容
polyline = malloc(sizeof(Polyline) * 2);
polyline->point = malloc(sizeof(Polyline) * 5);
───────
Polyline = malloc(sizeof(Polyline) * 2);
polyline->point = malloc(sizeof(Polyline) * 5);
↑↑↑↑↑↑↑ 編集リクエストの内容
```
↓

```c
typedef struct {
    int npoints;
    Point point[1];
}Polyline;

PolyLine *polyline;

Polyline = malloc(sizeof(Polyline) + sizeof(Point) * (npoints - 1));
```

## ポインタの反則遊び その3
配列の添え字は「0」から始まるが、強制的に「1」から始める

```c
    int array[10] = {1,2,3,4,5,6,7,8,9,0};
    int *array_p = &array[-1];
    // int *array_p = array[-1] ではコンパイルエラー

    printf("%d",array_p[1]);
```

# あと書き
3,4章の読破時間・・・5h
nodeを使ってmysqlに接続する

nodeでmysqlに接続するには

```
// requireの設定
const mysql = require('mysql');
 
// MySQLとのコネクションの作成
const connection = mysql.createConnection({
  host : 'localhost',
  user : 'root',
  database: 'testdatabase'
});
 
// 接続
connection.connect();
 
// userdataの取得
connection.query('SELECT * from userdata;', function (err, rows, fields) {
  if (err) { console.log('err: ' + err); } 
 
  console.log('name: ' + rows[0].name);
  console.log('id: ' + rows[0].id);
 
});
 
// userdataのカラムを取得
connection.query('SHOW COLUMNS FROM userdata;', function (err, rows, fields) {
  if (err) { console.log('err: ' + err); }
 
  console.log(rows[0].Field);
  console.log(rows[1].Field);
});
 
// 接続終了
connection.end();
```
QuizKnockで取り上げられたLook-and-say Sequence (見て言って数列) をPythonで生成する

先日投稿されたQuizKnockさんの動画 [【東大】Google本社でGoogle入社試験に挑戦！](https://www.youtube.com/watch?v=7KaiPOou1As) で、 **Look-and-say Sequence(見て言って数列)** が取り上げられていました。
これは以下のように、初項を1として「前の項を読み上げた数字を並べたものが次の項になる」という規則で変化する数列です。

```
1   = 1が1個 (One 1)  → 1 1
1 1 = 1が2個 (Two 1s) → 2 1
2 1 = 2が1個,1が1個(One 2, One 1) → 1 2 1 1
1 2 1 1 = 1が1個,2が1個,1が2個...
```

今回の動画で初めてこの数列の存在を知り、面白いと思ったので
この数列を生成するプログラムをPythonで作成してみました。

```python
def lookAndSay(initialValues, maxIteration=None):
    x = initialValues
    yield x

    iteration = 1

    while True:
        if maxIteration is not None and iteration >= maxIteration:
            break

        new_x = []
        prev = x[0]
        count = 1

        for n in x[1:]:
            if n == prev:
                count += 1
            else:
                new_x.append(count)
                new_x.append(prev)
                prev = n
                count = 1
        new_x.append(count)
        new_x.append(prev)

        x = new_x
        yield x
        
        iteration += 1
```

下のようにすると、初項を1としたLook-and-say Sequenceを第10項まで生成し、出力します。

```python
>>> for li in lookAndSay([1], 10):
...     print(li)
...
[1]
[1, 1]
[2, 1]
[1, 2, 1, 1]
[1, 1, 1, 2, 2, 1]
[3, 1, 2, 2, 1, 1]
[1, 3, 1, 1, 2, 2, 2, 1]
[1, 1, 1, 3, 2, 1, 3, 2, 1, 1]
[3, 1, 1, 3, 1, 2, 1, 1, 1, 3, 1, 2, 2, 1]
[1, 3, 2, 1, 1, 3, 1, 1, 1, 2, 3, 1, 1, 3, 1, 1, 2, 2, 1, 1]
```

もっと上手いやり方があったらコメントで教えて下さい！
エンジニアにオススメしたいyoutuber ! Tech系Youtuber5選！

# Able Programming
機械学習に必要なpythonのライブラリや、機械学習の手法について解説しています。初心者でも機械学習に触れられるようになっています。
[Able Programming](https://www.youtube.com/channel/UCh5M2YUAPW7HnpfTUv7XHmA/videos)
<img width="1009" alt="スクリーンショット 2019-11-29 1.14.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/531de601-7cb8-1d76-09a9-b7035ed647f5.png">


# シリエン戦隊JUN TV

シリコンバレーの現役エンジニアで、シリコンバレーで働いているエンジニアならではの情報を載せています。
将来シリコンバレーで働きたい人や起業したい人にオススメです。
[シリエン戦隊JUN TV](https://www.youtube.com/channel/UCqRPKFts1Puj6Wn7U4e3ppA)

<img width="1009" alt="スクリーンショット 2019-11-29 1.15.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/01566094-ddcb-d734-1b7e-9991b8ad974a.png">


# KENTA / 雑食系エンジニアTV
エンジニア向けオンラインサロンを運営しているエンジニアさんのyoutubeチャンネル

[KENTA / 雑食系エンジニアTV](https://www.youtube.com/channel/UC_HLK-ksslL-Z_2wiIZDlMg)

<img width="1009" alt="スクリーンショット 2019-11-29 1.15.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/9dfca187-e952-db90-a82b-4ed3e5658f81.png">

# 迫 佑樹
プログラミング教材販売などを行なっているエンジニアさんのyoutube
[迫 佑樹](https://www.youtube.com/user/divinewind820)

<img width="1009" alt="スクリーンショット 2019-11-29 1.15.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/b956ebc8-d1c1-042d-8643-676951436ca7.png">

# たにぐち まことのともすたチャンネル
react,vue,aws,wordpressなどのコーディングについて解説しているyoutube
[たにぐち まことのともすたチャンネル](https://www.youtube.com/user/tomostajp)

<img width="1009" alt="スクリーンショット 2019-11-29 1.15.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/425baae8-e71d-ee35-d724-3e8cd905393e.png">
email_fieldの入力フォームに初期値を反映させる方法

#bootstrapを使用しながらemail_fieldの入力フォームに初期値を反映させる方法。
ポートフォリオを採用側に見てもらう時少しでも手間を省くため、ワンクリックで済むようにと初期値設定を考えました。
text_fieldは大量に検索ヒットしたけどemail_fieldとpassword_fieldは出てこなくて苦戦したので、自分用メモとして。

```ruby:new.html.erb
        <%= form_with(url: login_path, scope: :session, local: true) do |f| %>

      <div class="form-group">
        <%= f.label :email, 'メールアドレス' %>
        <%= f.email_field :email, class: 'form-control', placeholder: 'hoge@gmail.com' %>
      </div>

      <div class="form-group">
        <%= f.label :password, 'パスワード' %>
        <%= f.password_field :password, class: 'form-control', value: 'hoge' %>
      </div>
      <%= f.submit 'ログイン', class: 'btn btn-primary btn-block' %>
    <% end %>
```

email_fieldの方には　placeholder: 'hoge@gmail.com'
password_fieldの方には　value: 'hoge'

下記のURLのchapter 7−４を参考にしてください。
[email_fieldとpassword_field初期値設定](https://books.google.co.jp/books?id=wlNHDwAAQBAJ&pg=PA265&lpg=PA265&dq=email_field&source=bl&ots=0eB_hTdTmw&sig=ACfU3U1oCkR9ny6CIHEi4WHZ5epf-xCqNA&hl=ja&sa=X&ved=2ahUKEwjwvsLZnI3mAhUUzmEKHaD4D8gQ6AEwDHoECBQQAQ#v=onepage&q=email_field&f=false)
AWS CLIでKMSを試すメモ

# 前提（用語）

- カスタマーマスターキー（CMK）
    - AWS側で管理される鍵
    - データの暗号化には直接利用しない
    - マネジメントコンソールであらかじめ作成しておく（持ち込みも可能らしい）
- カスタマーデータキー（CDK）
    - ユーザーがデータの暗号化に用いる鍵
    - 通常はAWSで暗号化されて保存されており、データの暗号時/複号時に、都度復号化して取得する

# 概要
データを暗号化/復号化する流れ。暗号化/復号化に用いる鍵(CDK)をKMSで管理する。
CMKはあらかじめマネコン等で作成しておくこと。

# 手順メモ

## 1. カスタマーデータキー（CDK）を作成する

```
% aws kms generate-data-key --key-id "[CMKのキーID]" --key-spec "AES_256"
{
    "Plaintext": "[平文のカスタマーデータキー]", 
    "KeyId": "[CMKのARN]", 
    "CiphertextBlob": "[暗号化されたカスタマーデータキー]"
}
```

## 2. データの暗号化

お好きなツールで `[平文のカスタマーデータキー]` を使ってデータを暗号化

## 3.  `[平文のカスタマーデータキー]` は破棄する

## 4. `[暗号化されたカスタマーデータキー]` を保存する
Base64デコードして保存しておく（後に、平文のカスタマーデータキーの取得に必要）

```
echo [暗号化されたカスタマーデータキー] | base64 -d > enc.txt
```

***


## 5.  `[平文のカスタマーデータキー]` を取得する

暗号化されたカスタマーデータキーを用いて `[平文のカスタマーデータキー]` を取得して `data-key.txt` ファイルに保存する。 `data-key.txt`  に保存される内容は前段で取得した `[平文のカスタマーデータキー]` と同じ文字列が保存される。

```
aws kms decrypt --ciphertext-blob fileb://enc --query Plaintext --output text > data-key.txt
```

## 6. データの復号化

取得した `data-key.txt` を用いてお好きなツールで復号化する。

# 参考

AWS Black Belt Online Seminar AWS Key Management Service (KMS) https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-aws-key-management-service-kms

AWS KMSを使って秘密鍵を管理する | DACエンジニアブログ：アドテクゑびす界 http://yebisupress.dac.co.jp/2017/03/30/aws-kms%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E7%A7%98%E5%AF%86%E9%8D%B5%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B/

[JAWS-UG CLI] Amazon KMS 入門 (2) データの暗号化・復号化 - Qiita https://qiita.com/domokun70cm/items/a863ae60d4467fc7a790
#Ruby で #Rails と同じ Time.zone.now を使う

- activesupportをinstall & require する
- Time.zone を指定する
- あとは Rails と同じようにする

```
gem install activesupport
```

```rb
require 'active_support/core_ext'
# => true

Time.zone
# => nil

Time.zone = 'Tokyo'
# => "Tokyo"

Time.zone
# => #<ActiveSupport::TimeZone:0x00007fded1c02c10 @name="Tokyo", @tzinfo=#<TZInfo::DataTimezone: Asia/Tokyo>, @utc_offset=nil>

Time.zone.now
# => Thu, 28 Nov 2019 17:41:36 JST +09:00
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2773








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PrivateLink経由でAzureDataFactoryからBlobStorageを認識できるか試してみる

#はじめに
下記のように要件上オンプレNW内にSelf-Hosted IRを構成しなければいけない、かつExpress Routeによるデータ移送が要件の場合、PrivateLinkを使うことになると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/87f1b487-0daf-c3d5-756f-91aeebdfa6e4.png)


以下の記事でPrivateLinkを構成しましたが、Azure Data Factory(以下、ADF)で利用するにはどうするか、実践しました。
[Azure Private Linkが出たのでStorageとSQLへの接続を試してみる](https://qiita.com/ryoma-nagata/items/590242bd8b1865a57a82)

2019/11時点の調査です。

#実践！
下記の状態のStorageをAzureDataFactoryから認識させたいと思います。なお上記記事内の作業によりPrivateEndPointは構成済みでVMからは参照ができる状態です。

StorageのFWの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9962755e-14d4-bc5e-4833-fa419365d577.png)
##Self-Hosted IRの構成
Self-Hosted IR自体の説明は以下。
[セルフホステッド統合ランタイム](https://docs.microsoft.com/ja-jp/azure/data-factory/concepts-integration-runtime#self-hosted-integration-runtime)

ADF内でIntegration Runtimeを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f0c58b62-35b2-d735-9709-bbc85cba4878.png)

Self Hostedを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b9b224fc-27b5-ed0d-5cd3-28ead0471438.png)

今回はExpress Setupを利用します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0b633a93-7051-0f23-ffc5-003cfc0cbc10.png)

Exeを実行してPrivateEndpointのあるVnet内のVMにSelf-Hosted IRをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/fd3b96ec-6ed3-87ff-bb7e-e94eb9403b6f.png)


##Linked Serviceの構成
接続を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5e936e00-d350-daa0-fefa-ca3fccede391.png)
先ほど構成したSelf-HostedIR経由で設定してみるとあっさりいきました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5cf84de4-76f8-0dcf-3eb9-3f3dff23963b.png)

設定どうなってるかみてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/018daece-4b59-7da1-68dc-366225db00e9.png)

PrivateEndPointはこんなんなってたんで、Suffixとか変わってるかなーと思いきやそうでもありませんでした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ba56eefd-a8ea-61b1-f4a5-79a69650720c.png)


#まとめ
あっさりつながりました。早くGAしないかな
Xcode11.2につまずいた

# はじめに
**現在Xcode11.2を使用している場合すぐにアップデートしてください！！**

# UITextViewでクラッシュ
Xcode11.2には致命的なバグがあります。

Storyboard,xibでUITextViewを使用していると**クラッシュ**します。

対応としてはStoryboard,xibでUITextViewを使わずにコードで書くしかないのですが、このバグに関してはすぐに修正され[Xcode11.2.1](https://developer.apple.com/documentation/xcode_release_notes/xcode_11_2_1_release_notes)がリリースされています。

現在(2019/11/29)ではXcode11.2だとApp Store Connectにアップロードできなくなっています。（下記参考）

[Xcode 11.2ではApp Store Connectにアップロードできない](https://dev.classmethod.jp/smartphone/iphone/cannot-upload-xcode-11-2/)

# 雑記
個人的にはXcode11.2で解消されたUITabBarControllerのバグが面白かったです。

一部で話題になっていましたが、[StoryboardからUITabBarControllerを生成すると左端に謎のViewが表示される](https://developer.apple.com/documentation/xcode_release_notes/xcode_11_1_release_notes#3392083)んだとか...

こちらの[公式の回避策](https://developer.apple.com/documentation/xcode_release_notes/xcode_11_1_release_notes#3392082)が下記のようなものでした

```swift
class WorkaroundTabBarController: UITabBarController {

    required init?(coder: NSCoder) {
        super.init(coder: coder)

        // This must be run immediately after the call to super.
        if (tabBar.subviews.count > 1) {
            tabBar.subviews[0].isHidden = true
        }
    }
}
```

力技感があって素敵です:heart_eyes:

# さいごに
早い段階でこのバグの報告があったので、私は11.2にはアップデートせずこのバグに遭遇することはありませんでした。

運悪くXcode11.2でSwiftの学習をはじめた方はこれにハマって長時間悩んだかもしれませんね:sob:

このバグのおかげで最近わりとリリースノートを見るようになりました:satisfied:
「危険すぎる」と話題の文章生成AI「GPT-2」で文章を生成しよう

# GPT-2の運営はOpenAI
OpenAIはイーロン・マスクなどをはじめとする有力な実業家・投資家が参加している人工知能を研究する非営利団体です。
https://openai.com/

# 生成の手順
1. gitからclone
2. モデルのインストール
3. ライブラリをインストール
4. 文章を生成


## 1. gitからclone
```
git clone https://github.com/seiyatakahashi/gpt-2.git && cd gpt-2
```

## 2. モデルのインストール
```
python3 download_model.py 1558M
```

## 3. ライブラリをインストール

```
pip3 install -r requirements.txt
```

## 4. 文章を生成
```
python3 src/interactive_conditional_samples.py
```
AWS CDK(Cloud Development Kit)の参考リンク集

## AWS CDKとは

>AWS クラウド開発キット (AWS CDK) は、使い慣れたプログラミング言語を使用してクラウドアプリケーションリソースをモデル化およびプロビジョニングするためのオープンソースのソフトウェア開発フレームワークです。

- CloudFormationのテンプレートを動的に生成するツール
- TypeScriptやPython等の言語を使うので、**IDEによる補完や文法チェック**が可能
- より短く簡潔なコードでインフラ管理が可能


![](https://d2908q01vomqb2.cloudfront.net/da4b9237bacccdf19c0760cab7aec4a8359010b0/2019/07/04/AppStacks.png)

## よく使うコマンド

```Python
# スタックの一覧を表示
cdk ls

# 定義されたスタックのAWS CloudFormaitonテンプレートを作成
cdk synth

# CDKアプリを初めてデプロイする際に「bootstrapスタック」を構築する
cdk bootstrap

# CDKアプリをデプロイする
cdk deploy xxxx

```


## 参考資料
- ソースコード
    - [aws/aws-cdk: The AWS Cloud Development Kit is a framework for defining cloud infrastructure in code](https://github.com/aws/aws-cdk)
- ドキュメント
    - 開発マニュアル
        - [What Is the AWS CDK? - AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/ja_jp/cdk/latest/guide/home.html)
    - APIリファレンス
        - [AWS CDK · AWS CDK Reference Documentation](https://docs.aws.amazon.com/cdk/api/latest/)
    - TypeScript
        - [docs.aws.amazon.com/cdk/api/latest/typescript/api/index.html](https://docs.aws.amazon.com/cdk/api/latest/typescript/api/index.html)
    - Python
        - [AWS CDK Python Reference — AWS Cloud Development Kit 1.18.0 documentation](https://docs.aws.amazon.com/cdk/api/latest/python/index.html)

- 開発環境
    - [AWS Cloud9 の AWS CDK サンプル - AWS Cloud9](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/sample-cdk.html)



- ワークショップ
    - [AWS CDK Intro Workshop :: AWS Cloud Development Kit (AWS CDK) Workshop　](https://cdkworkshop.com/)（英語版）
    - [AWS CDK Intro Workshop :: AWS Cloud Development Kit (AWS CDK) Workshop](http://educationhub-e901cdf0-10eb-11ea-b86c-4993bc17c7c2.s3-website-us-west-2.amazonaws.com/)（日本語版）

- イベント等発表資料
    - [Infrastructure is Code with the AWS CDK - AWS Online Tech Talks - YouTube](https://www.youtube.com/watch?v=ZWCvNFUN-sU&feature=youtu.be)
    - [ソフトウェア開発者のためのAWS環境構築フレームワークAWS Cloud Development Kit (CDK)](https://pages.awscloud.com/rs/112-TZM-766/images/B-3.pdf) DEVDAY TOKYO セッション発表資料
構造体へのインターフェースの埋め込み

構造体へのインターフェースの埋め込みについての知識に漏れがあったので、調べたことをまとめました。

Goでは、インターフェースの明示的宣言はなく、インターフェースの持つメソッドを実装することでそのインターフェースを満たしていることになります（ダックタイピング）。

しかし、実はインターフェースを構造体に埋め込むことでも、例えその構造体はインターフェースの持つメソッドを持っていなくても、そのインターフェースを満たしていることになります。

下記のコードでは、user構造体はUserInterfaceを持っているのでUserInterfaceのもつFullName()を持っていなくてもUserInterfaceを満たしていることになります。よって、下記のコードはビルドが通ります。

```Go
func main() {
	taro := testUser{
		firstName: "Taro",
		lastName:  "Yamada",
	}
	outputUser(taro) //testUserがUserInterfaceを満たしているため、taroをoputputUserに渡せる
}

type UserInterface interface {
	FullName() string
}

type testUser struct {
	UserInterface       // interfaceを埋め込むことで、メソッドを実装しなくてもそのinterfaceを満たせる
	firstName, lastName string
}

func outputUser(u UserInterface) {
	fmt.Println(u.FullName())//userはFullNameメソッドを持っていないがコンパイルエラーにならない
}
```
しかし、ouputUserメソッド内で実際には実装されていないFullName()メソッドを呼んでいるため、実行時にはpanicが起きます。

```bash
❯ go run main.go
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x10992c7]

goroutine 1 [running]:
main.main()
        /Users/mmm/go/src/github.com/masalennon/test/main.go:13 +0x87
exit status 2
```
上記のコードに、FullNameメソッドを追加すれば、ちゃんと実行されます。

```Go

func (u user) FullName() string {
	return u.firstName + " " + u.lastName
}
// Taro Yamada
```

おわり
ComposerでLaravelの開発環境を構築しよう

# Laravelとは
Laravelは、MVCのWebアプリケーション開発用の無料・オープンソースのPHPで書かれたWebアプリケーションフレームワークです。webフレームワークを使うことでwebサービスの開発スピードが上がったり、セキュリティの安全性を担保できます。日本では、様々な企業で使われています。
 引用: [ウィキペディア](https://ja.wikipedia.org/wiki/Laravel)
公式ページ: http://laravel.jp/

<img width="1218" alt="スクリーンショット 2019-11-29 0.13.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/b7885e44-5fe9-7510-de31-443590156ef1.png">


# Composerとは
composerはPHPのパッケージ管理システムです。
https://getcomposer.org/
<img width="1218" alt="スクリーンショット 2019-11-29 0.15.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/c98205e9-e37f-d23d-edb7-a961bf3afa52.png">


# 環境構築の手順
1. Homebrewをインストール
2. MySQLをインストール
3. Composerをインストール
4. Laravelのプロジェクトディレクトリを作成

## 1. Homebrewをインストール
HomebrewとはmacOS用パッケージマネージャーで、composerとmysqlをインストールをするために必要なのでインストールします。
Homebrew公式ページ: https://brew.sh/index_ja

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## 2. MySQLをインストール
laravelはデータベースシステムを使うので、MySQLをインストールします。laravelはMySQL以外にもSQLiteやPostgreSQLなどを使うこともできます。

brewコマンドを使ってmysqlをインストールします。

```
brew install mysql
```

mysqlのサーバーを起動させます。

```
mysql.server start

Starting MySQL
. SUCCESS! 
```

mysqlサーバーに接続します。

```
mysql -u root
```


## 3. Composerをインストール
brewコマンドでcomposerでインストールします。

```
brew install composer
```

## 4. Laravelのプロジェクトディレクトリを作成
composerコマンドでlaravelのプロジェクトディレクトリを作成します。

```
composer create-project laravel/laravel your-project-name --prefer-dist
```

作成したプロジェクトディレクトリに移動

```
cd your-project-name
```

laravelサーバーを起動

```
php artisan serve
```

起動ができたら、 http://localhost:8000/ にアクセスしましょう。

<img width="1218" alt="スクリーンショット 2019-11-29 0.28.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/47a506b4-7e3b-7a34-cc16-d4e00e5c3680.png">



#### 参考
[Mac へ MySQL を Homebrew でインストールする手順](https://qiita.com/hkusu/items/cda3e8461e7a46ecf25d)

[Mac に Homebrew で composer をインストールする (201808)](https://qiita.com/naoki_koreeda/items/726598a938f3c211ff49)
oneWEX クラスタリング機能

#はじめに

学習データを準備した上で、予め定義した構成に沿って行う分類器とは異なり、学習データを必要としないクラスタリング機能がoneWEX v12.0.2から「動的クラスター」機能として利用可能となったため試してみました。

#動的クラスター

ダッシュボード右側の「ファセット分析」より「動的クラスター」を選択します。クラスタリング結果の数に「250」と「500」のどちらかを選択し、「分析」ボタンをクリックすると自動的にクラスタリングを実施しグラフ化してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540549/e6d95319-bdc2-274d-a650-b972267fbeaa.png)

細やかな設定はできないようですが、アンケート結果や蓄積されたログの傾向をクイックに確認するには便利な機能です。
ダッシュボードで分析をすすめる中で、フィルタリングを行いつつクラスターを簡単に利用できるのも非常に効果的です。

#####お断り
このサイトの掲載内容は私自身の見解であり、必ずしも所属会社の立場、戦略、意見を代表するものではありません。 記事は執筆時点の情報を元に書いているため、必ずしも最新情報であるとはかぎりません。 記事の内容の正確性には責任を負いません。自己責任で実行してください。
#Ruby / #Rails で日付を UTC あるいは local時刻 = JSTなどで time に変換するにはするには引数を指定せよ

# Rails


```rb
Date.parse('2020-01-01').to_time(:utc)
# => 2020-01-01 00:00:00 UTC

Date.parse('2020-01-01').to_time(:local)
# => 2020-01-01 00:00:00 +0900

```

# Ruby の場合はgem installが必要

```
gem install activesupport
```

```
 require 'active_support/date'
 require 'active_support/core_ext'
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2772








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rails+VueのPOSTでパラメーターが思ったとおりに渡せなかったのでメモ

## やったこと
deviseなどのgemを使わずユーザー登録機能をrailsとvueで実装

## ハマったこと
ユーザー登録フォームに入力してPOSTした時、:userの中にpasswordとpassword_confirmationの値が入らず(ネストせず)かなり苦戦。

具体的にはこんな感じ。

### 理想形
```:コンソール
Parameters: {"user"=>{"name"=>"hogehoge", "email"=>"fugafuga@test.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}}
```

### NG形
```
Parameters: {"name"=>"", "email"=>"", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "user"=>{"name"=>"", "email"=>""}}
```

**passwordとpassword_confirmationだけuserの中に入ってこない！！**

まあNG形の場合でもコントローラーのストロングパラメーターで

```users_controller.rb
private
  def user_params
    params.permit(:name, :email, :password, :password_confirmation)
  end
```

とすれば大丈夫なんだけど、どうしてもカッコよくこう書きたい！

```users_controller.rb
private
  def user_params
    params.fetch(:user, {}).permit(:name, :email, :password, :password_confirmation)
  end
```

vueで書くとhas_secure_password効かないのか〜？とか、formの書き方が悪いのか〜？とか、とにかく色々と原因を考えまくって時間を浪費したこと浪費したこと。


## Vueの書き方
先にNGだった書き方から。(js部分のみ。かなり省略してます)

### NGの書き方
```js:NewForm.vue
import axios from 'axios';
export default {
  data: () => ({
    user: {
      name: '',
      email: '',
      password: '',
      password_confirmation: '',
    },
  }),
  methods: {
    createUser: function() {
      axios
        .post('/api/v1/users', this.user)
        .then(response => {
          var res = response.data;
          this.$router.push({ name: 'home' })
        })
        .catch(error => {
          if(error.response.data && error.response.data.errors) {
            this.errors = error.response.data.errors;
          }
        })
    },
```
これだとNG形になります。

### 理想形のパラメーターが返ってくる書き方

```js:NewForm.vue
import axios from 'axios';
export default {
  data: () => ({
    name: '',
    email: '',
    password: '',
    password_confirmation: '',
  }),
  methods: {
    createUser: function() {
      axios
        .post('/api/v1/users', { user: { name: this.name, email: this.email, password: this.password, password_confirmation: this.password_confirmation }})
        // 以下、同じなので省略
```
POSTする時に、こうやって明示的に書けばOKだった！

どうしても納得いかないのが、NGの時もnameとemailはちゃんとネストされてたってこと。
passwordとpassword_confirmationは、テーブルのカラムに存在しないから取れなかったと思うんだけど、has_secure_passwordを書いててもダメなもんかい:sob:

初歩的な実装に、ものすごい時間がかかってしまったというお話でした。
ではまた！
AndroidのlogcatをTSV形式に加工するrubyスクリプト

Androidのlogcatを解析する際にExcelやgoogleスプレッドシートに貼り付けて、
フィルタ機能を使って一部のログのみ抽出して表示したいので作ってみました。


## 変換スクリプト

```ruby:locat2tsv.rb
#!/usr/bin/env ruby

while line = ARGF.gets
	(date, time, pid_package, level_tag, message) = line.split(" ",5)
	(pid, package) = pid_package.split("/")
	(level, tag) = level_tag.split("/")

	data = ["#{date} #{time}", pid, package, level, tag, message]
	puts data.join("\t")
end
```

## 変換結果をgoogleスプレッドシートに貼り付けた例

<img width="926" alt="スクリーンショット 2019-11-29 0.17.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19321/d7ad3def-259e-558a-0a6f-e0a9b3564235.png">



## 使い方

```
cat env-logcat.log | ./locat2tsv.rb | pbcopy
```

```
./locat2tsv.rb env-logcat.log | pbcopy
```



変換後のTSVのカラムは次の通りです
1. 日時
2. pid
3. パッケージ名
4. ログ出力レベル
5. tag
6. ログメッセージ
名前とアイデンティティーについてちょっと考察したメモ

# 目次
0. 何故名前とIDについて考えるか
1. IDと名前とは
2. 名前の付け方

# 1. 何故名前とIDについて考えるか 
名前とIDはプログラムを書く日ならほぼ必ず触れる要素である。
この似たような両者を比較することで名前の役割を再認識すると、名前の付け方の判断基準を持つことができる。

#2. IDと名前とは
どちらも同様に何かを指し示すために使うもの。
両者の最大の違いは「人間に意味を感じ取らせるか否か」。
「一意性」があるか否かは必ずしも両者を区別しない。

## IDとは
Identifierの略。何かを一意に特定するもの。
例 「中学校の生徒のうち、3年4組出席番号15番、など」

## 名前
名前も何かを指し示すためにあるもの。しかし一意に特定できるとは限らない。
例「学校のクラスで佐藤さんが1人なら、学校のなかでの文脈で佐藤という名前は一意に特定できるが、学校の外では一意に特定できない」

## IDと名前の目的の違い
どちらも何かを指定するために使われるが、名前は一意に特定できるとは限らない。
それでも名前が使われる理由は、「人間」にとって認識しやすく、意味を感じ取りやすいから。

人間にとって「3年4組出席番号15番の生徒」では即座に誰かを認知しずらい「佐藤」はすぐ連想できる。

## 一意に特定する名前もある
例えばドメイン名。ドメイン一つに対して1つのアクセス先が対応する。
IDだから一意、名前は一意じゃない、とは限らない。あくまで、意味を感じ取らせるかどうかがIDと名前の違い。IPはIDで、ドメインは名前。

## 整理すると
1. 一意に特定する => ID
2. 一意に特定し、かつ意味を感じ取らせるもの => ユニーク名前
3. 一意に特定するとは限らず、意味を感じ取らせるもの => 普通名前

#3. 名前の付け方
プログラムで名前を扱う量は非常に多い。そのため、名前の付け方に一定の判断基準を持津ことで、名前付けの判断スピードを高めることには意味がある。

ここで、名前とは何かについての理解に基付いて判断基準を一つ提示してみる。

## 名前の付け方を考える基準
プログラムにおいて、変数など名前の付け方は「2」のユニーク名前を意識する。

一意に特定するのはプログラムのために必要であり、意味が分かりやすいのは人間のために必要。

##名前づけの方針

1. 意味がわかるシンプルな名前を付ける。
2. 他に類似の対象があり名前を区別する必要性がある場合は、その相違点を接頭語や接尾語、あるいはその他の方法で区別する．


## 例
通常は必要十分なシンプルな名を付ける。

例えばユーザーであれば

```js
var user = new User()
```

しかし、管理者ユーザーと通常ユーザーが存在する場合

```js
var admin_user = new User({role: "admin"})
var user = new User()
```

ユーザーが雇用者と被雇用者などで処理が別れる場合

```js
var employer = new User({role: "employer"})
var employee = new User({role: "employee"})
```
Content-TypeとX-Content-Type-Options: nosniff

# Content-Typeとは？
- HTTPレスポンスヘッダに付与する属性。
- 返却するファイル形式が何なのか？、を知らせる目的がある。

```
# Content-Typeの例
text/plain → テキストファイル  
text/html  → HTMLファイル  
application/json → JSONファイル
application/pdf → PDFファイル  
```

# X-Content-Type-Options:nosniffとは？
- この属性を付与すると**ファイルの内容をContent-Type属性から判断してね**とお願いできる。
- IEではContent-Typeを指定していても、htmlと勝手に判断してJavascriptが実行されてしまうことがあるためMSが実装した。
- **IE以外のブラウザでも使える属性**である。

# なんのために使うの？
- ファイルダウンロード時にファイル形式をブラウザに誤認させてJavascriptを実行させてしまうような攻撃(XSS攻撃)を防ぐことができる。
Ubuntuのディスプレイ設定で、「スクリーンの情報を取得できませんでした」と出た時の対処法

#Ubuntu16.04ディスプレイの設定ができない

ある日急にUbuntuの設定→ディスプレイで解像度をいじろうとしたら・・・

**スクリーンの情報を取得できませんでした**

設定できない(^_^;)

スクリーンショット撮り忘れたから、どんな画面か知りたい人、下のサイトから見てください

[Ubuntuはアップグレード後に「画面情報を取得できませんでした」](https://codeday.me/jp/qa/20190808/1404082.html)

#対処法
簡単に直す事ができたので、同じエラーで困っている人の為に私の直した方法を共有します。

それは・・・
**unity-control-center**
を再インストールするだけです！！！！

```
sudo apt-get remove unity-control-center
sudo apt-get install sudo apt-get install unity-control-center
unity-control-center
```

これで私は無事直りました。

![Screenshot from 2019-11-29 00-11-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297375/e8fe8210-6fdd-6bed-3ca6-04ad27d8e3f6.png)

**私のversionは16.04.LTSです。**
ぜひ参考にしてください!
#Rails にタイムゾーンが設定されていない場合に Time.use_zone とで一時的にタイムゾーン指定を有効にする : UTC VS JST

日本時間 16:46 に実行した例

# UTC

```rb

Time.zone.parse('2020-01-01 00:00')
# => Wed, 01 Jan 2020 00:00:00 UTC +00:00
Time.current
# => Thu, 28 Nov 2019 07:46:28 UTC +00:00
Time.zone.now
# => Thu, 28 Nov 2019 07:46:28 UTC +00:00
```

# JST

```rb
Time.use_zone("Tokyo") { Time.zone.parse('2020-01-01 00:00') }
# => Wed, 01 Jan 2020 00:00:00 JST +09:00
Time.use_zone("Tokyo") { Time.current }
# => Thu, 28 Nov 2019 16:46:28 JST +09:00
Time.use_zone("Tokyo") { Time.zone.now }
# => Thu, 28 Nov 2019 16:46:28 JST +09:00

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2771








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ruby 初歩的な比較演算時まとめ

# 目的

- Rubyのif文などで使用する比較演算子をメモ程度にまとめる

# 比較演算子記載方法まとめ

|比較演算子  |意味  |
|---|---|
|A < B  |AがBより小さい  |
|A <= B  |AがB以下     |
|A > B  |BがAより小さい  |
|A >= B  |BがA以下     |
|A == B |AがBと等しい   |
|A != B |AがBと異なる   |

# 書き方の例

- 下記に比較演算子を用いた簡単な条件分岐処理を記載する。

    ```ruby
    # 変数格納
    age = 23

    if age >= 20
      puts "成人しています"
    end
    ```
Nasal Demons(鼻から悪魔)

https://stackoverflow.com/a/13444785/684921

![NasalDemons.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6657/a47f22c8-9794-ef0d-cbc4-78437f687f30.jpeg)
> I told the story about undefined behavior to my favorite daughter who likes to doodle. She sent me this the next day. There is simply so much to love about it. -- [EvilTeach](https://stackoverflow.com/users/7734/evilteach)
macでVSCodeのターミナルをPowershellにする


Visual Studio CodeのターミナルをPowershellにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84612/230db9ef-a7ff-7f20-1054-6f0ac24bb20c.png)



# Visual Studio Codeの設定

Powershell 「pwsh」のパスと引数はなしで設定する。

```json
{
    "terminal.integrated.shell.osx": "/usr/local/bin/pwsh",
    "terminal.integrated.shellArgs.osx": []
}
```

# 補足

## Visual Studio Codeをインストール

macOSのVisual Studio Codeのダウンロードとインストール
https://code.visualstudio.com/docs/setup/mac

## Powershellをインストール

```bash
brew cask install Powershell
```
条件によって特定のプロパティがあったりなかったりするオブジェクトを簡単に書きたいなあと思った場合

例えば、`is_flag` が `true` の時だけ、`id` というプロパティがあり、それ以外の場合は `id` プロパティが存在してはいけないオブジェクトをワンライナーで書きたいなあと思った場合。

```javascript

const obj = {
  ...(is_flag ? { id:1111 } : {}),
  hoge: `hogehoge`,
  fuga: {
    fugafuga: `fugafuga`
  }
}
```
pyenvを使って、python3.xを構築しよう

## pyenvとは
複数のPythonバージョンを簡単に切り替えられるツール

## 環境構築の手順
1. Homebrewをインストール
2. pyenvインストール
3. pyenvのパスを通す
3. python3.6をインストール
4. python3.6を適用

## 1. Homebrewをインストール
HomebrewとはmacOS用パッケージマネージャーで、pyenvのインストールをするために必要なのでインストールします。Homebrewを使えば、pyenv以外にも、phpやmysqlなどを入れることができます。
Homebrew公式ページ: https://brew.sh/index_ja

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## 2. pyenvインストール
pyenvはpythonのバージョン管理ツールです。

```
brew install pyenv
```

## 3. pyenvのパスを通す
パスを通すため、bash_profileの編集をします。下記のコマンドを全て実行すると、パスを追加することができます。

```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

## 4. python3.6をインストール
pyenvでpythonのバージョンをインストールするには、`pyenv install インストールするversion`を実行します。今回は3.6をインストールするので下記のようなコマンドを実行します。

```
pyenv install 3.6.0
```


## 5. python3.6を適用

```
pyenv global 3.6.0
```

#### 参考
[pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法](https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b)

[Pyenvの使い方](https://qiita.com/mogom625/items/b1b673f530a05ec6b423)
薬理学実習＿鎮静睡眠麻酔薬

```bash:time.sh
name=$1
conc=$2
sleep 540; say "{$1}、１分前です"
sleep 60;  say "{$1}、時間です"
say "次の投与濃度は{$2}分の１です"
```

```python:time.py
import numpy as np
import os,sys
import pickle
import pandas as pd

import argparse

#最初の引数受付
parser = argparse.ArgumentParser()
parser.add_argument('-n', '--name', type=str, default=None, help='person name')
parser.add_argument('-d', '--drug', type=str, default=None, help='drug name')

args = parser.parse_args(sys.argv[1:])
name = args.name
drug = args.drug

time_path = 'time.sh'
os.system(f'chmod +x {time_path}')

result = []
import time

print('実験を開始します。モニターの時間を教えて下さい')
base_time = input()
print(f'{base_time}より実験開始')

#base time
bt = time.time()
conc_lis = [64,32,16,8,4,2,1,0]

#input()関数で、ただエンターを押すことで次に進むことを実装する。
inp=''

#各投与濃度について繰り返し
for i in range(6):
    if inp=='':
        next_conc = conc_lis[i+1]
        
        #時間経過を数え、音声読み上げを行う
        os.system(f'bash {time_path} {name} {str(next_conc)}')
        
        #投与後10分経過した段階を記録しておく
        time_past = time.time() - bt
        print('スコアを教えて下さい')
        score = input()
        conc = conc_lis[i]
        print(f'睡眠スコア:{score},濃度:{conc}')
        result.append(np.array([time_past,score,conc]))
        print('注射が終わったらリターンキーを押してください')
        inp = input()
        if inp!='':
            inp = ''
            
        #毎回データを保存
        path = f'{drug}.pickle'
        with open(path, 'wb') as f:
            pickle.dump([result, base_time],f)
        print(f'{path} に保存します')
        df = pd.DataFrame(result)
        df.columns=['時間経過','睡眠スコア','濃度']
        print(f'{drug}.csvに保存します')
        df.to_csv(f'{drug}.csv')
        
        
        print('次の実験に移ります')
 ```