OmniAICreator/Qiita-1.07M huggingface dataset:
API Blueprint quickstart

# API Blueprint

Swaggerに代表される、APIドキュメントを生成する環境です。
Markdown形式で記述したあと、aglioというコマンドを叩くと単一のHTMLファイルを生成してくれるため、サクッと始めるにはちょうどいい方式です。

https://apiblueprint.org

# quickstart

sampleを生成するところまでを説明します。

## sample 

以下のガイドに従って、sample.apibファイルを作成します。

cf. https://apiblueprint.org/documentation/examples/01-simplest-api.html


```apib:sample.apib
FORMAT: 1A

# The Simplest API
This is one of the simplest APIs written in the **API Blueprint**. One plain
resource combined with a method and that's it! We will explain what is going on
in the next installment - 
[Resource and Actions](02.%20Resource%20and%20Actions.md).

**Note:** As we progress through the examples, do not also forget to view the
[Raw](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md)
code to see what is really going on in the API Blueprint, as opposed to just
seeing the output of the Github Markdown parser.

Also please keep in mind that every single example in this course is a **real
API Blueprint** and as such you can **parse** it with the 
[API Blueprint parser](https://github.com/apiaryio/drafter) or one of its
[bindings](https://github.com/apiaryio/drafter#bindings).


# GET /message
+ Response 200 (text/plain)

        Hello World!
```


## install agrio

agrioというツールでHTMLを生成します。
npm経由でinstallすることができます。

cf. https://www.npmjs.com/package/aglio

```bash
sudo npm install -g aglio
```

## HTML生成

以下のコマンドで生成が可能です。
`-i`でinput、`-o`でouputを指定します。

```bash
$ aglio -i sample.apib -o sample.html
```

以下のように出力されます。

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106949/656fb389-cb09-8ab2-eae4-2e8d9a0e8829.png)


# ファイル分割

`<!-- include(hoge.apib) -->`のように参照することでファイル分割が可能です。

```apib:index.apib
FORMAT: 1A

<!-- include(users.apib) -->
<!-- include(items.apib) -->
```

```apib:users.apib
# Group User

## GET /api/v1/users

+ Response 200 (application/json)

        Hello User!
```

```apib:items.apib
# Group Item

## GET /api/v1/items

+ Response 200 (application/json)

        Hello Item!
```


# 参考URL

- https://dev.classmethod.jp/server-side/api-document-with-api-blueprint/
- https://qiita.com/takahyon/items/399e3d5781e0f6c73e06
【linuxコマンド】cdコマンドでmacintosh（topディレクトリ）へ移動からvagrant sshの接続まで

vagrant sshで仮想マシンへのやり方がいまいち把握していなかったのでまとめます。

topディレクトリへの行き方などを使用した初心者さん向けの内容となります。


##topディレクトリまで移動
```

$ cd /

rooter:/ ユーザ名$ pwd
/
```

##ssh接続する該当ディレクトリまで移動
```

rooter:/ neko$ ls
Applications	Volumes		etc		sbin
Library		bin		home		tmp
System		cores		opt		usr
Users		dev		private		var

rooter:/ neko$ cd Users


rooter:users neko$ ls
Shared	neko

//ユーザー名を選択
rooter:users neko$ cd neko

rooter:neko neko$ ls
Applications		Music			dump.sql
Desktop			MyVagrant		local.local.pid
Documents		Pictures		mysql.sock
Downloads		Public			sudo
Homestead		Vagrantfile		touch
Library			VirtualBox VMs		過去のlaravel関係
Movies			code

rooter:neko neko$ cd myvagrant

rooter:myvagrant neko$ ls
MyCentOS

rooter:myvagrant neko$ cd mycentos

//virtualbox起動します。
rooter:mycentos neko$ vagrant up
```

##接続完了

```
$ vagrant ssh
Last login: Sat Jan 11 12:34:17 2020 from 10.0.2.2
[vagrant@localhost ~]$
```
AWSの概念

出展：[AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3ERB303UT76DT&keywords=aws%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC&qid=1578744077&sprefix=AWS%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%2Caps%2C266&sr=8-1)

#AWSの長所と利点

##AWSクラウドコンピューティングの6つのメリット

###固定費（設備投資費）が柔軟な変動費へ
・リソースを利用したときに利用した分だけ支払う
・小さく始めることができて大きな投資を行う必要がない
・既存システムの総所有コスト（TCO）を削減することで、新規システムへの投資を柔軟に行うことができ、継続的なコストパフォーマンスを改善できる

###スケールによる大きなコストメリット
・オンプレミスよりも低い変動コストを実現できる
・多くのユーザがクラウドを使用するため、規模の経済を活かして、従量課金制の料金を低く提供できる

###キャパシティ予測が不要に
・必要に応じてリソースの増減を行うことができるので、最大のインフラ容量を予測する必要がなくなる
・リソース不足やリソース過多になった場合は、状況に応じて柔軟にスケジューリングを行えばよい

###速度と俊敏性の向上
・迅速なリソース調達が可能になり、システムの負荷やサービスの拡充に応じて柔軟な構成変更が可能
・検証や開発にかかるコストと時間が大幅に減るため、組織の俊敏性が大幅に向上する

###データセンターの運用と保守への投資が不要に
・AWSの各種サービスの利用料には、従来のオンプレミスシステムの各種費用が含まれる
・クラウドを利用することで、サーバの設置、連携、起動といった重労働が不要になり、ユーザに直結した業務に専念することが可能になる

###わずか数分で世界中にデプロイ
・オフィスに居ながらにして、シンプルな操作と最小限のコストで世界中にデプロイできる

##クラウドアーキテクチャの設計原理

###Dsgin for Failure
・「時間が経てば故障する」ということを認識し、この考えをアーキテクチャに採り入れる
　（故障に備えた設計）
・***単一障害点***（Single Point Of Failure：SPOF）をなくす

###コンポーネントの分離
・***サービス指向アーキテクチャ***の設計原則を踏襲する
・システムのコンポーネントを***疎結合***にすればするほど、スケーリングが大規模にうまく行える
・***マイクロサービスアーキテクチャ***を用いることで、システムを複数の小規模なサービスの集合体として非同期かつ疎結合な構成とし、コンポーネントの分離を促進する

###弾力性（伸縮性）の実装
・リソースの性能を柔軟にスケールアウトしたり、スケールインすることが可能
・***巡回スケーリング***：
　　一定期間（毎日、週ごと、月ごと、四半期ごと）に発生する定期的なスケーリング
・***イベントベーススケーリング***
　　予定されているビジネスイベントのためにトラフィックリクエストが急激に増加されると予想されるときに実施するスケーリング
　　***スケジュールドスケールアウトパターン***を利用することで弾力性を実現する
　　（トラフィック増加が予想される時間帯に自動的にスケールアウト）
・***オンデマンドの自動スケーリング***
　　監視サービスを利用することにより、監視項目（CPUの平均利用率やネットワークのI/O量など）に基づいてトリガーを送信しスケールアウト／スケールインを行う
　　***スケールアウトパターン***を利用することで弾力性を実現する
　　（トラフィック増加を検知して自動的にスケールアウト）
・必要なときだけ調達して、不要なときは廃棄ができる、いわば使い捨て可能なビジネスリソースとしてサーバを考える

###並列化を考慮する
・クラウドでは繰り返し可能なプロセスを極めて容易に構築できるため、できるだけ並列化を実践し、可能であれば自動化する
　　例）ロードバランサーを使用し、複数の非同期のWebサーバ全体で受信リクエストを分散させたWebアプリケーション
・スケーリングは弾力性を組み合わせて、高負荷時にはスケールアウト、低負荷時にはスケールインを行う

cf）
　***スケールアップ***：単体性能を向上。増強方法はシンプル
　***スケールアウト***：台数を増加。複数台構成のため、耐障害性で優位

###コンテンツの保管
・クラウドではデータを***ネットワーク経由***で利用するため、配信のオーバーヘッドやボトルネック対策が必須
・静的コンテンツは外部に出して、エンドユーザの近くに保管する
・動的に処理するデータは、クラウド上のコンピューティングリソースの近くに保管する

##AWS Well-Architectedフレームワーク

###AWS Well-Architectedフレームワークとは
・信頼性、セキュリティ、効率、コスト効果が高いシステムを設計しクラウドで運用するために作られた、アーキテクチャのベストプラクティス

###AWS Well-Architectedフレームワークが基本とする5本の柱

***運用上の優秀性***：
ビジネス価値を実現するためのシステムを実行してモニタリングし、それらをサポートするプロセスと手順を継続的に改善する機能

***セキュリティ***：
リスクの評価と軽減戦略をとおしてビジネス価値を提供しながら、情報、システム、資産を保護する能力

***信頼性***：
インフラストラクチャやサービスの障害からの復旧、必要に応じたコンピューティングリソースの動的な取得、設定ミスや一時的なネットワークの問題などの障害の軽減といったシステムの機能

***パフォーマンス効率***：
コンピューティングリソースを効率的に使用してシステム要件を満たし、需要の変化や技術の進歩に合わせてこの効率を維持する能力

***コスト最適化***：
最も安価にシステムを実行してビジネス価値を実現する能力
10年前の自分へ教えたい「本の読み方」

## 0. はじめに

読書は割と習慣的に行うようにしているのですが、得たはずの知識を**「覚えていない」「使えていない」「他人に(寧ろ自分にも)説明できない」**といったような問題に何度も遭遇したので、**「本の読み方」**をまとめてみました。少しでも参考になりましたら幸いです。

## 1. 本を選ぶとき

### 1-1. 挫折しないために
- 5割から8割くらいは**スラスラと理解できる本**がよい。でないとほとんどの人が挫折してしまう。  
昨日今日プログラミングを始めた人が、いきなりハッカー本を読むのは辛い。
- 全く新しいジャンルを勉強する場合は**入門書**から始める。何も恥ずかしいことではない。新しいことを学ぼうとしている自分は素晴らしい。

### 1-2. 自分に合った本を見つけるために
- ~~ネットなどのレビューは当てにしない。特に低評価コメント。本の価値観は人それぞれ。~~
- 通販は便利だが、できれば**立ち読み**して自分に合っているか見極めよう。

## 2. 本を読む準備

### 2-1. 著者と仲良くなるために
- 本の著者について**事前調査**する。「年齢」「出身地」「出身校」「他に出している本」など。**「顔写真」**は必ずチェックしておきたい。  
仲良くなるべき理由は、後述の会話読みに繋げるため。

### 2-2. モチベーションを高めるために
- **「本を読む目的」「読んでどうなりたいか」**などを、先頭ページやしおりに**メモしておく**。本を読むときは**必ずメモを見返す**。

## 3. 本の読み方
### 3-1. 頭に定着させるために
- まずは全体像を把握するために、**目次にしっかり目を通したり**、**全体をざっくり(かなりざっくりでOK)読んだり**する。RPGと一緒で、1週目より2周目の方が遥かにイージー。
- 著者と**会話するように読む**。例えば「ツッコミを入れる」「なるほどと相槌を打つ」など。会話には感情が含まれるため、記憶に残りやすくなる。
- 新しく得た知識は、自分が持っている知識(過去の書籍や体験から得たもの)と結びつける。
- 1段落や1章読むごとに、**意図的にぼーっとする**。脳はぼーっとしているときに情報が整理され、記憶される。  
このとき、**絶対スマホ触ったりしない**！
- 得た知識は「1日後」「3日後」「1週間後」などの間隔で、**何度も思い出す**。<font color="red">**(想起)**</font>  
  「お風呂」「歯磨き」「トイレ」「通勤」など、手は空いていなくても**頭が空いている時間**はめちゃくちゃたくさんある。

### 3-2. 得た知識を使えるようにするために
- **人に教えるつもりで読む**。いや、**必ず誰かに教える**。家族でも片思いの人でも架空の人物でもいいが、**好きな人に**。ドーパミンが出るだろう。  
- 説明する際は、ど素人でも分かるように。カッコつけて専門用語を並べるのは馬鹿に見える。
- 1段落や1章読むごとに、**自分の言葉で要約する**。<font color="red">**(再言語化)**</font>    
「つまり…」「要は…」といった形。オリジナルの例え話を作るのもGood。  
ただ本の内容を書き写すだけでは脳が満足してしまうのでNG。もう一度言う、**必ず自分の言葉で！！**

## 4. 参考文献

とても勉強になりました！ありがとうございました！(五十音順)

- [**最短の時間で最大の成果を手に入れる 超効率勉強法**](https://www.amazon.co.jp/dp/4054066895/)
- [**東大医学部在学中に司法試験も一発合格した僕のやっている シンプルな勉強法**](https://www.amazon.co.jp/dp/4046023058/)
- [**知識を操る超読書術**](https://www.amazon.co.jp/dp/4761274565/)
- [**学びを結果に変えるアウトプット大全**](https://www.amazon.co.jp/dp/4801400558/)
- [**「読む力」と「地頭力」がいっきに身につく 東大読書**](https://www.amazon.co.jp/dp/4492046259/)
RaspberryPi4のセットアップ時にモニタ映らない問題の解消

#背景
RaspberryPi4を購入して立ち上げようとしたらモニタに映らない（hdmiを認識しない）という問題が起こったので、具体的な対処法を書いておきます。これまでRaspberry3B、3B+、zerowでは起こらなかったので、僕と同じように困っている方は参考にしてみてください。

#使用したもの
・RaspberryPi 4B メモリ4GB（RSコンポーネンツから購入）
・HDMI変換アダプタ（タイプA-タイプD)（ELECOM製）
　https://www.elecom.co.jp/products/AD-HDAD3BK.html
・HDMIケーブル
・PCモニタ

#手順
###1.SDカードの準備
こちらのサイトを参考にマイクロSDカードを準備します。今回はNOOBS_v3_2_1で試しています。
>参考：[Raspberry Pi 4用インストールメディアを作成する](https://pcmanabu.com/create-media-raspberry-pi-4/)

###2.ファイルの書き換え
PC上で、SDカード内のファイルを書き換えます。どうやら、初期状態ではHDMIディスプレイを認識しないという設定になっているようです・・・。そのため、強制的にHDMIを認識させる設定変更が必要になるので、その具体的な手順を以下で説明します。
>参考：[Raspberry Pi 4 model Bで画面が映らない！
](https://signal-flag-z.blogspot.com/2019/11/raspberry-pi-4-b-hdmi-issue.html?m=1)

上記で用意したSDカードの中身は以下のようになっています。この中のOSフォルダを開きます。
![スクリーンショット 2020-01-11 21.18.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193530/9bd54be9-6b92-5a30-1533-ccf472dced2e.png)

今回はRaspberryPi4なので、LibreELEC_RPi4フォルダを開きます。
![スクリーンショット 2020-01-11 21.18.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193530/6019f142-3a6c-8153-ab40-fc1f2e23d749.png)

System.tar.xzをダブルクリックして展開します。
![スクリーンショット 2020-01-11 21.18.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193530/a3e3c37b-2d66-0855-fba5-3247e21b3843.png)
![スクリーンショット 2020-01-11 21.19.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193530/3893ff9e-8c97-d0e5-e454-f85e05c68849.png)

展開されたSystemフォルダの中のconfig.txtを開きます。
![スクリーンショット 2020-01-11 21.19.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193530/7b672117-f1fe-9730-3738-78c258a52aa7.png)
![スクリーンショット 2020-01-11 21.![uploading-0]()
19.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193530/14a445af-f872-f3bd-9d56-280ca2985593.png)

config.txt内の ”# hdmi_force_hotplug=1”の頭の"#"を消して保存します。これでOKです。
![スクリーンショット 2020-01-11 21.20.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193530/534dcc27-537f-627d-dce9-b1d1b5919d72.png)

###3.RaspberryPi4へのOSインストール
以上の設定変更を行い、SDカードをRaspberryPi4に挿入して電源を入れるとモニタに映りました！
その先のインストールは下記の手順で立ち上げればOKです。
>参考：[Raspberry Pi 4へOSをインストールする(Raspbian編)](https://pcmanabu.com/raspberry-pi4-install/)

#まとめ
ちょっと細かいかもですが、できるだけ具体的に書いてみました。参考になれば幸いです。
Reactの初期テンプレが作成出来なかった時の対処メモ

##始めに

node.jsのバージョンは`11.10.1`

久々にReactを勉強し直そうと、取り敢えず、技術書の手順に沿って、`create-react-app`でReactアプリのテンプレートを作ろうとしたら、出来なかったので、その時の対処方として残しておきます。

##問題となった事象
① Reactチュートリアルも一通り復習したし、何か１冊書籍でもこなしておこうと、Reactアプリの初期テンプレを作るため、`npx create-react-app react_app`を実行した。

② installが終わって、生成されたファイル群を見てみると、`node_modules`、`package-lock.json`、`package.json`しか生成されていない...。

③ おかしいな...と、Terminalのログを見ると、以下のようなログが出ていた。

```terminal
A template was not provided. This is likely because you're using an outdated version of create-react-app.
Please note that global installs of create-react-app are no longer supported.
```
create-react-appのグローバルインストールはサポートされなくなりましたよ、との事。

調べてみると、この件について、[issue](https://github.com/facebook/create-react-app/issues/8085)が立っていた模様。


##解決方法

Create React Appの公式ページに**[対処方法](https://create-react-app.dev/docs/getting-started)**が書かれていたので、その手順に従います。

>If you've previously installed create-react-app globally via npm install -g create-react-app, we recommend you uninstall the package using npm uninstall -g create-react-app to ensure that npx always uses the latest version.

```terminal:globalのcreate-react-appをuninstall
$npm uninstall -g create-react-app
up to date in 0.031s
```

次に、以下コマンドを入力します。

```terminal
$which create-react-app
```
もし以下のようなパスが返ってきたら、これも削除します。

```terminal
/usr/local/bin/create-react-app
```

```terminal
$cd /usr/local/bin/
$rm create-react-app
```

再度、以下コマンドを実行してみましょう。

```terminal
npx create-react-app react_app
```

今度は、無事作成されました。
<img width="388" alt="スクリーンショット 2020-01-11 23.00.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33632/67be8606-9c2b-80b8-a4a0-6c63fe8d7d0e.png">



書籍終わったら、Dockerで環境作ってみよう。
よし、勉強しよう。
AdafruitのMQTTブローカーを使う

## 俺たちのAdafruit

Adafruit（エイダフルート）は安い部品の通販サイトとしてよく見かけます。
社長がピンクの髪の女の人だというのをさっきググって知りました。
MQTTブローカーも提供しており、貧乏人のために無料枠もあります。
ありがてぇ。



## やりたいこと

AdafruitのMQTTブローカーにユーザー登録して、パブリッシュするTopicを登録する。



## 手順
[公式の説明](https://learn.adafruit.com/mqtt-adafruit-io-and-you?view=all)を見ながら進めました。



- アカウントを作成 https://io.adafruit.com/
- Actions → Create a New Dashboard

入力例）
Name：SitoppDevなど、任意の名前
Description：開発用など、任意の説明



- Feeds → View All → Actions → Create a new feed

入力例）
Name：M5vDev
Description：開発用

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/6062e9ee-18f9-102c-0c10-809eabe1ce83.png" width="50%">

- Feeds → Actions → Create a New Feed


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/314e5b60-51ac-856b-0f89-0bad516630fe.png" width="50%">

- NameとDescriptionを自由に入力

例）
Name：onoff
Description: 開発用です

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/411f20c8-2caf-1e24-e8ef-3ed17c874e8f.png" width="50%">




- ヘッダの「Feeds」 → View All → onoff → Feed Info

MQTTのTopicが自動生成されて、「MQTT by Key」のところに表示されている。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/7ed4cd0c-32e2-52b6-1d0d-16e2f3935ab5.png" width="50%">


これで完成。



## MQTTサーバー情報

https://io.adafruit.com/api/docs/mqtt.html#mqtt-connection-details


| Host | io.adafruit.com |
|:--|:--|
| Secure (SSL) Port | 8883 |
| Insecure Port | 1883 |
| **MQTT over Websocket | 443 |
| Username | Your Adafruit IO Username |
| Password | Your Adafruit IO Key |


なお、passwordは、ダッシュボードにログインするときのパスワードではなく、32桁のハッシュです。
私はまんまと間違えました。。passwordの調べ方は以下を参照ください。

### username/passwordの調べ方
ダッシュボードの右肩にある「AIO Key」をクリックすると、Username/passwordが閲覧できます。


## おまけ

以前からIFTTTでAdafruitが使える事には薄々気づいていたのですが、Thatに指定する場合がまさにMQTTでした。
Thisに指定したレシピの方が多いみたいですが。



以上です〜
TensorFlow2.1が来た！

# はじめに

こちら、Tensorflow2.0のアドベントカレンダー最後の記事になります。(大遅刻)
Tensorflow2.0がリリースされた！と思ってたら次にTensorflow2.1がもう来ていたので、
ここに変更点や進化したポイントを[ReleaseNote](https://github.com/tensorflow/tensorflow/releases)に基づいて書きます。

# メイントピック

* GPUパッケージ統合
* Cloud TPUサポート
* Ragged TensorのDatasetサポート
* Python2での最後のリリース

# GPUパッケージ統合

Tensorflow2.1からは、わざわざtensorflow-gpuを入れていたのがなくなり、
`pip install tensorflow`だけでtensorflowがGPUサポートになります！
これで、混乱などもなくなり、よりスマートな印象になりましたね。

# kerasAPIのCloud TPUサポート

GCPにはCloudTPUという機能があります。Colabratoryにも一応TPUの項目もありますよね。
Experimentalですが`keras.fit`,`keras.predict`などのkerasAPIで
CloudTPUが使えるようになったとのこと。
昔は`keras.fit`する前に色々やらなきゃいけなかったり、
そもそもColabratoryでは使えなかったりと([こちらの情報](https://stackoverflow.com/questions/55541881/how-to-convert-tf-keras-model-to-tpu-using-tensorflow-2-0-in-google-colab))
色々と面倒だったとのこと。これが改善されてTPUフレンドリーになっていくのはいいですね！

# Ragged TensorのDatasetサポート

Ragged TensorがいよいよDatasetで扱うことができるようになり、
以下のようなことができるようになりました。

```python:Ragged_Tensor
rt_x = tf.ragged.constant([[1,2,3],[],[1,2]])
x_data = tf.data.Dataset.from_tensor_slices(rt_x)

for x in x_data:
    print(x)
```

```:結果
tf.Tensor([1 2 3], shape=(3,), dtype=int32)
tf.Tensor([], shape=(0,), dtype=int32)
tf.Tensor([1 2], shape=(2,), dtype=int32)
```
これで自然言語処理とか、RaggedTensorの様々に活かせる場面が増えるかもしれません。

# Python2サポートはこれで最後

>TensorFlow 2.1 will be the last TF release supporting Python 2. Python 2 support officially ends an January 1, 2020. As announced earlier, TensorFlow will also stop supporting Python 2 starting January 1, 2020, and no more releases are expected in 2019.

とのことで、最終的にTensorflow2.1にて、Python2のサポートが終わるということになります。
まぁ、Python2どんだけ長寿なんだよってくらいには長生きしてますし、
公式サポートだって伸びたとはいえ、2019年で最後となっていましたので、
そろそろPython3へしっかり移行したいですね。
（その前にGoogleにはGcloudSDKのPython3ネイティブ化をして欲しいんですが...)

# おわりに

今回はメイントピックのみを上げさせて頂きました。
今後もReleaseがあったら、こうして記事に載せようかと思いますので、よろしくお願いいたします。
(本当はもっと細かいところまで書きたかったですが、知識不足で申し訳ないです...)
Approaching Haskell

Recently I have been reading programing introduction book of Haskell. Learn some interesting concept and want to write some notes here. I dont expect to master the 
```functional programming``` concept only reading once the book. This doc is for note-keeping.

# Background
Easy to meta-programming, because creating a type and define how to operate on them is very instinctive

```
-- new type
Val n

eval Val n = n -- unwrap the primitive in it
(+) Val a, Val b = Val a+b -- operate on the inner primitive and return a Val type wrapping the result
```

Using Java or python can achieve this goal but class definition is lengthy, tons of getter, setter, factory will calls for boilerplate.

# Functor
Like an interface, mainly used to denotes a container type can consume one mapper function. And ```map``` in map-reduce idiom is the simple ```List``` version Functor working.

```
-- List is a instance of Functor
map num_list \num = 2 * num     -- a anonymous function to double the var

-- When implement Tree as a Functor, fmap is functor .ver of map(reverse actually)
fmap root_node_of_a_tree node_modifier_function
```


# Applicative
Since Functor can only support mapping single element of the container type. It is a very strong building block but still cannot help a lot.
For exp, if we want a general recursive form of operation that may have side effect(dirty) as well as extend from bifunction to trifunction to N-function. One way is to separate the pure part and apply it to elements in a recursive form, which is Applicative.

```
-- code bugs
pure = return
inputChars 0 = return
inputChars n = inputChar inputChars n-1
```

The above sample fit Applicative because ```inputChar``` is dirty itself, later part ```inputChars n-1``` do not depend on its side effect.
The impl of Applicative defines how to using the mapping function recursively, but if the mapping function itself may introduce side effect depended by later recursion, we need Monad

# Monad  
```
let Maybe = Sure n | Exception
let (div) a b  = a / b
```
```div``` funciton's type is Num -> Num -> Num
Butn if b = 0 there might be exception, the Haskell way is to use the type Maybe.
In this case we say ```div``` function have side effect and its type should be
``` Num -> Num -> Maybe```
But this breaks, because when using ```div``` recursively the incoming param can also be ```Maybe``` type when exception thrown in former recursions.

Here Monad comes to help. We can define how to ```bind``` the type of result when side effects, or other cases occurs.


# State Monad

In the form of (a, State), all side effect is stuffed in the State, when we want to receive a pure commputed result from a function, ```a``` will place it.
Jupyter学習ノート_003

## japanmap（日本地図）のサンプル
地図に関するものに興味があるため、「[japanmap](https://pypi.org/project/japanmap/)」というパッケージを利用して試しました。

下記の手順です。
[Google colab](https://colab.research.google.com/)にはjapanmapがデフォルトインストールされないため、毎回新しいノートブック作成時には、japanmapを再度インストール必要です。

- japanmapをインストールする（１回目のみ実施する）
  - １回目のインストール
![first install](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/b313f90c-1ca6-f2ae-0e2d-fae1210baad6.png)
  - ２回目のインストール
![japanmap install](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/9d52eee2-636c-afc9-fe0a-3314df392a97.png)

- 幾つの昨日を実行して見る

```japanmap_01.py
#必要なpackageをインストールする(一回のみ実施する)
#!pip install  japanmap
from japanmap import pref_names
from japanmap import pref_code
from japanmap import groups
from japanmap import is_faced2sea
from japanmap import adjacent
from japanmap import pref_map
from japanmap import get_data, pref_points

 #関東地方
for i in groups['関東']:
    print(pref_names[i], is_faced2sea(i))
print()

 #隣接
for i in [2, 20]:
    print(pref_names[i], ':', ' '.join([pref_names[j] for j in adjacent(i)]))

#境界線データ(svg)
qpqo = get_data()
svg = pref_map(range(1,48), qpqo=qpqo, width=2.5)
svg
```

- 実行した結果

![japanman サンプル実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/0347c88c-b0af-39ce-92d6-1292fa08c33c.png)
[AWS]CloudTrailで操作ログを記録

**2020年1月11日現在の内容です。**

操作ログを記録しておくことで、不正アクセスや不正操作があった際に確認できる。
CloudTrailは90日間ログを無料で保存しているが、S3に保存することで永続的にログを保存できる。
（注：S3を利用すると料金が発生する）

## 設定方法
サービス　→　CloudTrailを検索
<img width="1680" alt="スクリーンショット 2020-01-11 20.48.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/051d464b-1984-8814-94ac-03dc27bf9553.png">

「証跡の作成」をクリック
<img width="1680" alt="スクリーンショット 2020-01-11 20.50.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/bf904ca7-2635-a390-3dae-93442adae046.png">

以下の通り設定し、「作成」をクリック
（今回の例ではS3バケットを新規作成する）
（S3バケット名は重複できない）
<img width="1680" alt="スクリーンショット 2020-01-11 20.58.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/210059a4-ab60-5ad9-50a9-8f6d28277d02.png">
<img width="1680" alt="スクリーンショット 2020-01-11 21.01.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/7274f5c4-f497-0d4c-d419-df85657eaa87.png">


## 参考
[AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)
Excelで選択セルのURLを一括で開くマクロ作った

# はじめに
Excelで複数のセルに入力されているURLを一括で開けるマクロを作成しました。

似たような機能を持ったツールとして、Chorme拡張機能の[「Pasty」](https://chrome.google.com/webstore/detail/pasty/hdjihnnclpjhfdbbinmgoiehhoehhlgf)があったのですが、以下の2点が気になったので、その点をカバーできるようなものを作成しました。

　・上記の拡張機能は対象のURLを一旦コピーする必要があるのですが、コピーする際にURL以外の文字列が含まれていた場合に、警告などが表示されない。(20個タブを開いたつもりだったが、実は1個URL以外が含まれていたため19個しか開いていなかった。そのことが検知できない)
　・セルを飛んで選択した場合(ctrlを押しながら離れた複数セルを選択)コピーができないので、使用できない。

上記の点が特に問題とならない場合には素直に拡張機能を使った方がいいかなと思います。

# イメージ
↓こんな感じでURLの文字列が入ったセルのリストを用意します。
(ハイパーリンクは設定されていなくてもOKです。)
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278934/3fa22dde-2c10-b546-ba89-159c9481b218.png)

↓実行した場合はこんな感じです。
**選択したセルにURL以外が含まれている場合にはメッセージボックスが出力されます。**
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278934/0b92ec32-b48e-d2e6-03b4-767cc415269c.png)
また、私は作ったマクロをアドインとして保存し、クイックアクセスツールバーに登録して使用しています。
上の図の赤枠部分です。
アドインの登録方法などは以下を参考にしました。
https://excel-ubara.com/excelvba4/EXCEL297.html


# コード
```vb:OpenBrowsers
'選択範囲のURLをまとめて開く処理
Sub OpenBrowsers()
    '選択セル
    Dim r As Range
    Set r = Selection
    '開いたURL数
    Dim openCount As Integer
    openCount = 0
    '開かなかったセルのリスト
    Dim not0penList As New Collection
    '出力メッセージ
    Dim outMsg As String

    '選択したセルの数だけループを回す
    For Each r2 In r
        '===== セルにURL文字列が設定されている場合 =====
        If (InStr(r2, "http://") = 1) Or (InStr(r2, "https://") = 1) Then
            'セルにハイパーリンクを設定してから開く
            ActiveSheet.Hyperlinks.Add(Anchor:=r2, Address:=r2.Value, TextToDisplay:=r2.Value).Follow
            '開いたブラウザの数を増やす
            openCount = openCount + 1
        '===== それ以外 =====
        Else
            '開かなかったセルのリストに追加する
            not0penList.Add r2
        End If
    Next r2

    '===== 開かなかったセルがあった場合にはメッセージを出力 ===== 
    If (not0penList.Count > 0) Then
        '何個中何個開いたか
        outMsg = outMsg & vbCrLf & openCount & "/" & Selection.Count & "開きました。"
        outMsg = outMsg & vbCrLf & "開いていないURLは" & not0penList.Count & "個あります。"
        '開いていないセルのセル情報
        For Each i In not0penList
            outMsg = outMsg & vbCrLf & "[" & i.Address(RowAbsolute:=False, ColumnAbsolute:=False) & "] : " & i
        Next i
        'メッセージボックスの出力(警告)
        MsgBox outMsg, vbExclamation
    End If

End Sub
```

# 終わり
今回の処理ではハイパーリンクを設定→開くということを行っているのでブラウザはデフォルトに設定されているものになってしまいます。
開く際にブラウザを選べるようにする機能を追加してもいいかもしれません。
また、他にもVBA用のSeleniumなども使えるようなので、時間があれば調べてみたいと思います。
Ruby で CSV の先頭行だけを得る方法


Ruby の CSV ライブラリーを使って CSV ファイルの先頭行（第一行）だけを得るには

```rb
require "csv"

first_row = CSV.foreach("hoge.csv"){ |row| break row }
```

のようにすればよい。
`CSV.foreach` は CSV の行ごとにブロックを評価するが，初回でいきなり `break` させられるので先頭行しかアクセスしない。
で，`break` の引数がそのまんま `foreach` の返り値になる，というわけ。

しかし，これ，もうちょっと素直な方法が無いもんかね。
どなたかご存知なら教えてください。
デコレーター1

```python:1
def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result
    return wrapper

def sum(a, b):
    return a + b

f = print_info(sum)
r = f(10, 20)
print(r)
```

```:1の実行結果
start
end
30
```

print_info関数がデコレーターで、
sum関数をデコレートしている。

1の書き方だと分かりにくいので
以下の様に書いた方がわかりやすい。。。

またデコレーターは再利用できるので、
それを踏まえて。。。

```python:2
def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result
    return wrapper

@print_info
def sum(a, b):
    return a + b

@print_info
def sub(a, b):
    return a - b

print(sum(10, 20))
print(sub(90, 20))
```

```:2の実行結果
start
end
30
start
end
70
```
gitの基本コマンドをおさらいする

リポジトリを作ったところからマージまで。

## gitリポジトリの取得(パターンA)
```
git clone <ssh://~~~.git>
```
## リモートリポジトリの確認
```
git remote -v
```
## ブランチ一覧の確認
```
git branch -a
```
## ブランチの作成
```
git checkout -b <branch_name>
```
## ブランチをリモートに登録
```
git push -u origin <branch_name>
```
## ブランチの切り替え
```
git checkout <master>
```
---
## 変更したものを確認（ファイル）
```
git status
```
### 変更したものを全部戻す
```
git checkout .
```
## 前回のコミットとの差分を確認（内容）
```
git diff
```
## ファイルをインデックスにまとめて追加
```
git add .
```
### addの取り消し
```
git reset HEAD
```
## addしたものをローカルリポジトリに追加
```
git commit -m '<first commit>'
```
### 1つ前のcommitの取り消し
```
git reset --soft HEAD^
```
## リモートリポジトリへpush
```
git push
```
---
## マージ
```
git merge <dev>
```
digispark タイマー割り込みとUSB通信の組み合わせ

# 目的

digisparkで，タイマー割り込みを用いつつ，USB通信でモニターを行う。

# たたき台ソースコード

```C++
#include <DigiUSB.h>

#include <avr/io.h>
#include <avr/interrupt.h>

int ledPin1 = 1;
boolean s = false;

volatile int i;

ISR(TIM0_COMPA_vect) {
  // 16.5 Mhz / (256*256) = 251.77 Hz
  i++;
}

void setup() {
  DigiUSB.begin();
  DigiUSB.refresh();
  DigiUSB.delay(10);
  DigiUSB.println("Booted digispark.");

    pinMode(ledPin1, OUTPUT);

  cli();

  //initialize the timer0
  TCCR0A  = (1<<WGM01);      // Put timer0 in CTC mode and clear other bits
  TCCR0B  = (1<<CS02) ;      // Timer0 prescaling 256 and clearing other bits
  TIMSK  |= (1<<OCIE0A);     // enable timer1 compare interrupt

  //set the timer0 count
  OCR0A = 255; // Count 255 cycles before calling ISR interrupt
  PORTB |= (1<<PINB1); // Set PortB Pin1 high to turn on LED

  //initialize global interrupts before beginning loop
  sei();

  digitalWrite(ledPin1, 0);

}

void loop() {
  DigiUSB.refresh();
  DigiUSB.delay(10);
  if (DigiUSB.available()) {
    do {
      DigiUSB.refresh();
      DigiUSB.delay(10);
    } while (DigiUSB.read() != '\n' );
    DigiUSB.print("millis()/1000:");
    DigiUSB.println(millis() / 1000);
  }
    cli();
  if (i > 252) { // 16.5 MHz / (256*256) / 252 ~= 1 Hz
    i = 0;
    s = !s;
  }
  sei();

  digitalWrite(ledPin1, s);
}
```

スケッチを書き込むと，1秒間隔でLEDが点滅します。(blink)
digiterm等を起動し，何か文字を書き込んで[return]すると，`millis()/1000`を表示します。

DigiUSBの動作安定のために，しつこいぐらいに`DigiUSB.refresh` と `DigiUSB.delay`が挿入されています。
当初，これがなくて，digitermで認識されなくて悩みました。


# 参考URL

https://nekosan0.bake-neko.net/warehouse_digispark.html
https://brown.ap.teacup.com/nekosan0/3457.html
https://qiita.com/RAWSEQ/items/bf917c8eec2b51b9abc2
aws EC2でのruby 環境構築 

#aws での　ruby on rails 環境構築メモ



* root ユーザーの切り替え

* git のインストール 



```
$ sudo su -
# yum -y install git
```

# Rubyに必要なパッケージのインストール 

```
# yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel
```

# rbenvのインストール

```
# git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
# cp -p /etc/profile /etc/profile.ORG
# diff /etc/profile /etc/profile.ORG

# echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile
# echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> /etc/profile
# echo 'eval "$(rbenv init -)"' >> /etc/profile

# source /etc/profile
```
# RBENV_ROOT環境変数の有効化やbrent init実行

```
#su - root

# env | grep RBENV
```

#インストールしたrbenvバージョン確認

```
#rbenv --version

```

# ruby-buildインストール 

```
# git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
```


# Rubyのインストール  

```
# rbenv install -l
インストールできるRubyのバージョンを確認

# rbenv install -v 0.0.0 
インストールしたいバージョン 

# rbenv rehash 
インストールしたRubyを使用可能な状態にする

# rbenv global 0.0.0 インストールしたバージョン
デフォルトで使用するRubyの指定

# ruby -v 
インストールしたRubyのバージョンの確認
```

#Railsのインストール 
```
#gem update --system

#gem install nokogiri -- --use-system-libraries

#gem install rails -N

#gem install bundler

#rbenv rehash
```
英語ボロボロな私が英語でペアプロする時に助かったフレーズ集

#はじめに
最近、英語でしどろもどろにペアプログラミングをしているのですが、そもそも英語に難ありなのにペアプロってなに言ったらいいのか分からんという状況のため、自分の覚書かねて投稿してみます。
自分で言った言葉だったり、英語ネイティブ/非ネイティブのペアの人が言っていた言葉だったりなので、自然ではない表現があったり、もしかしたら意味が通っていない（ペアが私のひどい英語を察してくれた）表現もあるかもしれません。
英語に堪能なみなさん、何かお気づきの点やおかしな点がありましたらぜひコメントください。
親しい感じなので、だいたい「Can」を使っていますが、よりフォーマルならCouldにしたりpleaseをつけてもいいと思います。




#フレーズ集

##汎用的なもの
- Just in case, ：念のため〜（「念のために保存しよう」とか）
- That’s fine.：大丈夫。（○○しても問題ない？とか聞かれたときに）
- It's my fault!：私のせい！（やらかしたときに）
- For now：とりあえず（とりあえずコメントアウトしとこう、とかとか。便利）
- Let's say：〜したとして/〜だとして（Ifより気軽に使える。Let's say it's trueとか）
- Let’s just go for it：とりあえずやってみるか
- Can you google it?：それググってもらえる？（googleはもはや動詞）

##話し合うとき（コーディング前・コーディング中など）
- We’ll start off with declaring variable.:変数定義から始めようか
- Can you elaborate a little more?：もう少し詳しく説明してもらえる？
- There are several points we must look into.：じっくり確認することがいくつかあるよ。（仕様確認の時とか）
- Can you clarify what you meant by that?：どういう意味か明確にしてもらって良い？
- Are you still with me?：ここまで大丈夫？（説明の途中で）
- Let’s run with that idea.：その案で行こう！
- I can't put my thoughts together.：考えがまとまらない
- Is there anything else we need to think about?：他に考えとくべきことある？

##コーディング中
- Can you add ○○ between line 2 and 3?：２行目と３行目の間に○○を追加してもらえる？
- （関数名）should take values as arguments：（関数名）は引数としてvaluesを持たせないと
- Let’s see what happens.：なにが起こるか見てみよう（とりあえずプログラムを動かしてみるとき）
- Is there anything you want to add?：付け加えたいことある？
- Should we submit a pull request?：プルリク送るべき？（Gitとかで）
- Should we make a commit?：コミットすべき？（Gitとかで）
- Let's ○○ while deploying/uploading/waiting：デプロイ/アップロード/待っている間に○○しよう（think aboutとかassume this worksとかmake our code readableなどなど）
- Why don't we switch me?：ペアプロで役割交代したい時（ドライバとナビゲータ）
- Let me be navigator.：私にナビゲーターやらせて
- We need to like do this for every ○○.：全部の○○でそうする必要がある（配列などで、全要素を処理するときなど）
- I'm going through the properties/values of all the ○○.：○○の全プロパティ/全要素を回そう。（ループ処理で）
- We haven't specified it.：まだ指定してないよ（設定とか、オプションとか）
- Let's call it ○○.：○○と呼ぼう（変数・関数名を考える時に）


##バグがあったとき
- I’m expecting that ○○ might be wrong.：○○がおかしいと思う（行数とか変数名とか関数名）
- Something is failing.：なんか失敗してる

##修正したいとき
- Can you substitute “slice" for “splice"?：spliceの代わりにslice使える？（関数を変えたい時とか）
- Can you erase/delete line 1 to 12?：１行目から１２行目を削除してもらえる？
- Do you mind if I change a little bit?：ちょっと変えてもいい？（コードを）
- Can you comment out line 87?（８７行目コメントアウトしてもらえる？）

##日常会話で使わないけどよく使う単語
- Parentheses：かっこ（）のこと（言葉自体も発音も知らずに苦労した）
- square braces：かっこ[]のこと（bracesはbracketでも通りますがみんなbraces使ってた）
- curly braces：かっこ{}のこと（こちらもbracketでも通ります）
- greater than：>（英語の方がわかりやすかったり）
- less than：<
- greater than or equal to ：>=
- less than or equal to ：<=
- variable:変数
- Array of Objects:こういう構造のやつ（初心者すぎてよくofの前後がごっちゃになるので）

 ```javascript
const somthing = [
    {id:1,name:"NAME1"},
    {id:2,name:"NAME2"}
]
```


#終わりに
私は半年前に英会話をやりはじめ、客観的に英会話力を測ったことないですが（TOEIC受けたくらいで、確かネイティブキャンプのレベルチェックは５でした）、ペアプロの方が日常会話よりはるかに簡単な気がします。（雑談なに言ってるかさっぱり分からん）ITは特にカタカナが多い世界なので、日本語の発音にならないようにちょっと気をつければ技術的な単語に困ることがあまりないのが利点です。
みなさんもぜひ機会があれば英語でなくてもペアプロにチャレンジしてみてください！
[How To]マイグレーションファイルに記載を忘れた！そんなときにマイグレーションファイルを修正するときの方法リスト

RailsをベースにWebページを作成にあたり、モデルを作っていたところ、一部記載を失念してしまい、そのままマイグレーションしてしまいました。。。

そこで、マイグレーションファイルを修正する方法を改めて確認したので、備忘録的に以下に記載します！

#前提条件
今回の説明にあたり、前提条件としてmigrationフォルダ状況を以下を例とします。

```:db/migrate
migrate
├─  20200111042708_devise_create_users.rb
├─  20200111045059_add_nickname_to_users.rb
├─  20200111055028_create_addresses.rb
```

#絶対にやっては行けないこと-マイグレーションファイルの削除-
マイグレーションファイルは絶対に削除しないようにしましょう。実行完了後のマイグレーションファイルを削除してしまうと、schema_migrationsと齟齬が生じ問題が生じる恐れがあります。

＊schema_migrations：
データベースの変更履歴のようなもので、どのマイグレーションファイルまでが実行されているかが記録されていくテーブル。マイグレーションファイルが実行された際に自動的に作成されます。

##rails db:rollback
**rails db:rollback**:
このコマンドを実行すると、データベースの状態が最新のmigrationファイルを実行する前に戻ります。


###rails db:rollbackの手順
1.現状確認
まずはどこまでmigrateが実行されているか確認します。

```:ターミナル
$ rails db:version
Current version: 20200111055028
#migrateファイルの”20200111055028”までマイグレーションしていることを示してます。
 今回の例をベースにすると一番下（最新）です。
migrate
├─  20200111042708_devise_create_users.rb
├─  20200111045059_add_nickname_to_users.rb
├─  20200111055028_create_addresses.rb
```

2.rails db:rollback実行

```:ターミナル
#最新から一つ前まで戻す
$ rails db:rollback
```
この対応をしているとマイグレーションファイルが大量にあるときに詰みます。。。
そのようなときに、任意のファイルまで戻すやり方は以下となります。

```:ターミナル
#任意のファイルまで戻す(ステップ数指定）
#数字の部分で指定し、現在地を含めた箇所まで戻します。
#例えばステップ数に2を指定すれば2つ前の状態に戻ります。
$ rails db:rollback STEP=2

#任意のファイルまで戻す(ver指定）
#verを入力してそこまで戻します。
rake db:migrate VERSION=20200111042708
```
上記がrails db:rollbackによる、マイグレーションファイルの修正となります！

##rails db:migrate:reset
**rails db:migrate:reset**:
このコマンドを実行すると、全てのマイグレーションファイルをリセットして、一から全てマイグレーションします。
＊DBのデータが全てリセットされることをご注意ください。

###rails db:migrate:resetの手順
rails db:migrate:resetを実行しましょう。以上です。
非常に簡単ですので、開発中でDBに特に重要なデータがない場合は、こちらがおすすめかと思われます。

```:ターミナル
$rails db:migrate:reset
```
###rails db:reset と rails db:migrate:reset の違い
似たコマンドでrails db:resetというコマンドがありますが、。
結論
db:resetは、db/schema.rbを元にDB作成し、db:seedまで実行される。
db:migrate:resetは、DBを削除した後に、db/migrate/**.rb を古い順から実行するが、db:seedは実行されない。

|　 |    |　　|
|:--|:--|:--|
|コマンド| db:reset | db:migrate:reset |
|db:drop|✔️|✔️|
|db:create|✔️|✔️|
|db:migrate||✔️|
|db:schema:load|✔️||
|db:seed|✔️||

＊db:seed：
DBに設置する初期データを投入するためのコマンドです。
db/seeds.rbファイルに記入します。

＊schema_migrations：
データベースの変更履歴のようなもので、どのマイグレーションファイルまでが実行されているかが記録されていくテーブル。マイグレーションファイルが実行された際に自動的に作成されます。


#メモ（マイグレーションファイルに記載する型の種類）
|　 |    |　　|
|:--|:--|:--|
|型| 説明 | 用例 |
|integer|数字|ユーザーのidなど|
|string|文字(少なめ)|ユーザー名、パスワードなど|
|text|文字(多め)|投稿文など|
|boolean|真か偽か|真偽フラグ|
|datetime|日付と時刻|作成日時、更新日時など|

以上となります。最後までご覧いただき、ありがとうございました！
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします！
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。

#参照
マイグレーションのロールバック
https://www.javadrive.jp/rails/model/index8.html

rails db:migrate:resetできなかったのでrails db:resetした
https://qiita.com/mom0tomo/items/a252ff8a42eea00f81b1

【Rails】db:reset と db:migrate:reset の違い
https://blog.naichilab.com/entry/db_reset-vs-db_migrate_reset

rake db:seedを使った初期データの投入
https://www.javadrive.jp/rails/model/index10.html
Ubuntuのウィンドウを透明にする

ウィンドウを透過させて，裏に動画流しながら作業をしたかった．
調べてたら，CompizConfig setting managerを使えばできるって書いてあった．
しかし，入れてみても動かない．また調べた．
そうしたらYahoo!知恵袋で[これ](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10190805730)を見つけた．

> もしかしたら GNOME Shell と Compiz は同居できないのかもしれません。

できないらしい．

そこでGNOME Shellで透明にできるものを探した．

# 透過させる方法
Gnome Shell拡張機能で[Glassy GNOME](https://extensions.gnome.org/extension/982/glassy-gnome/)というのがあるのでこれを入れる．

それだけ．めっちゃ簡単．

## 操作方法
透明度を上げる `` <Super> + . ``
透明度を下げる `` <Super> + , ``
透明にさせる（アンロック）/しない（ロック） `` <Super>+` ``
【０】Nuxt.jsのサンプルアプリをDocker上で動かす

## はじめに

Nuxt.js、Firebaseを利用してPWAを作りたいと思い、手を動かす。
他の方の参考になればと思って記録を残していきますが、急に途切れたらすみません。

今回はとりあえず次のことができるようにします。

* Docker上でNuxt.jsのアプリをインストールする
* Docker上のアプリをlocalhostで確認する

こうすることでローカルを汚すことなく以降の開発ができるだろう、という狙いです。

アプリは、今のところメモ・TODOリストを作るつもりです。
とりあえずディレクトリを作成。

```
mkdir sparrow-memo
cd sparrow-memo
```

## 手順

下記を参考にしながらDockerfileを作りました。
https://www.bravesoft.co.jp/blog/archives/3942

```Dockerfile
# 2020/01時点のLTSのnodeをもとにする
FROM node:12.14.1-alpine3.11

# 作業ディレクトリを/workにする
WORKDIR /work

# 環境変数の設定
ENV HOST 0.0.0.0
ENV PORT 80

# 80番ポートを公開
EXPOSE 80
```

これを `build` することで、オリジナルのDockerイメージを作ります。
そしてそのイメージを利用してDockerコンテナ』をつくって、ログイン。

```
docker build -t nuxt-image .
docker run -it --name nuxt -p 80:80 -v $(pwd):/work nuxt-image sh
```

下記を参照しながら、Dockerコンテナ内でNuxt.jsのアプリをインストールします。
https://ja.nuxtjs.org/guide/installation/

```
yarn create nuxt-app app

? Project name app
? Project description My awesome Nuxt.js project
? Author name Kobori Akira
? Choose the package manager Yarn
? Choose UI framework Vuetify.js
? Choose custom server framework None (Recommended)
? Choose Nuxt.js modules Axios, Progressive Web App (PWA) Support, DotEnv
? Choose linting tools ESLint
? Choose test framework Jest
? Choose rendering mode Single Page App
? Choose development tools jsconfig.json (Recommended for VS Code)
```

するとローカルにも `app` ディレクトリ、そしてその中身が出来上がっているはずです。
ここでコミット。

あとはDockerコンテナ内で、アプリを立ち上げてみます。

```
cd /work/app
yarn dev
```

そしてlocalhostにアクセスすると、、、

<img width="1680" alt="スクリーンショット 2020-01-11 20.19.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144277/b45e1889-7505-290f-a00e-2016c4e253e6.png">

ちゃんとページが立ち上がりました！

今後開発を続けたい場合は、コンテナを終了したら自動で削除されるようにしてもよさそうです。

```
docker run -it --rm --name nuxt -p 80:80 -v $(pwd):/work nuxt-image sh
```

## ここまで

https://github.com/koboriakira/sparrow-memo/tree/ver1.0
[AWS]IAMで作業用ユーザーを作成

**2020年1月11日現在の内容です。**

## AWSのユーザー
### ルートユーザー
- AWSアカウントを作成すると作成されるユーザー
- 全てのAWSサービスとAWSリソースにアクセス権を持つ

### 作業用ユーザー（IAMユーザー）
- AWS（IAM）で作成されるユーザー
- 認証情報とアクセス許可の権限を個別に変更できる

**AWS上でルートユーザーは使用せずIAMユーザーで作業を行う。**
（ルートユーザーはアカウントの変更・解約、サポートプランの変更等をする際に使用する）

## IAMユーザーで請求情報にアクセスできる設定に変更する
デフォルトではIAMユーザーは請求情報にアクセスできないため設定を変更しておく

マイアカウントをクリック
![スクリーンショット 2020-01-11 16.27.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/5d223af6-197e-749c-7e7e-16ca2ab95934.png)

「IAMユーザ/ロールによる請求情報へのアクセス」のIAMアクセスのアクティブ化にチェックを入れ、更新をクリック
![スクリーンショット 2020-01-11 16.30.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/aec4ebcf-018f-19b9-d7f0-3e6f8ee73762.png)

## IAMユーザーの作成
サービスからIAMを検索
![スクリーンショット 2020-01-11 16.34.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/9417ca48-e2ad-8b5a-57d9-570ae59d24fb.png)

ユーザー　→　ユーザーの追加
![スクリーンショット 2020-01-11 18.39.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/0761ff7c-3894-cdf1-9982-343b4aa8e5c6.png)
<img width="1680" alt="スクリーンショット 2020-01-11 18.41.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/b1929652-4f76-04a7-26e9-6358da1a796b.png">

以下の通り設定し、「次のステップ」をクリック
<img width="1680" alt="スクリーンショット 2020-01-11 18.47.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/c2a941cf-aa60-7931-c98d-a70fb598bb05.png">

既存のポリシーを直接アタッチ　→　AdministratorAccessを選択し、「次のステップ」をクリック
（必要に応じて選択するポリシーを変更する）
（AdministratorAccessは全てのサービスにアクセスできる管理者権限）
<img width="1680" alt="スクリーンショット 2020-01-11 19.05.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/c3f05274-1fea-c130-c031-f428465d8637.png">

タグは任意で追加し、「次のステップ」をクリック
<img width="1680" alt="スクリーンショット 2020-01-11 19.11.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/8f03eefb-33d5-9815-9a46-882dc2a19086.png">

設定した項目を確認し、問題なければ「ユーザーの作成」をクリック
<img width="1680" alt="スクリーンショット 2020-01-11 19.13.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/57688124-fb36-3ccc-258b-2e8485b3d876.png">

IAMユーザーでログインする際のURLが表示されているのでメモしておく
<img width="1680" alt="スクリーンショット 2020-01-11 19.30.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/aebfb911-78b6-2331-38f2-9cadac8d78cb.png">

ユーザーが作成されていることを確認
<img width="1680" alt="スクリーンショット 2020-01-11 19.36.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/13efd532-ab3a-d257-d238-06e276a8f612.png">


## 参考
[AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)
Spring Bootで作ったアプリの起動時イベント等が書けるらしい

Spring Bootでもアプリが起動した時とかにイベントかませられるらしい
ただ公式リファレンスにもあんま使い道ないやろ的なことが書いてあったし
僕も何に使うかわからん・・・
ただ、こういうのもできるよっていうメモ

# 環境

Spring Boot 2.2.2.RELEASE - 2.2.4.RELEASE
Kotlin 1.3.61
Gradle

環境は以下の記事のまんま

https://qiita.com/ShassBeleth/items/3f3afca83b8ef0b98ede

# エントリポイントで指定する

```SplingBootExampleApplication.kt
@SpringBootApplication
class SpringBootExampleApplication

fun main(args: Array<String>) {

	println("start main method")

	val application = SpringApplication(SpringBootExampleApplication::class.java)

	// 各種イベント追加
	application.addListeners( MyApplicationStartingEventListener() )
	application.addListeners( MyApplicationEnvironmentPreparedEventListener() )
	application.addListeners( MyApplicationContextInitializedEventListener() )
	application.addListeners( MyApplicationPreparedEventListener() )
	application.addListeners( MyApplicationStartedEventListener() )
	application.addListeners( MyApplicationReadyEventListener() )

	application.run(*args)

	// Spring Initializrでの生成時に記載されてたアプリ起動メソッド
	// runApplication<SpringBootExampleApplication>(*args)

}
```

``` 各Listenerクラス.kt
class MyApplicationContextInitializedEventListener : ApplicationListener<ApplicationContextInitializedEvent> {
    override fun onApplicationEvent(event: ApplicationContextInitializedEvent) = println("Application Context Initialized Event")
}
```

# 課題

* 使い道
* イベント処理は別クラスに移せたけどaddListenersも別クラスにかけないかなぁ　いい感じにやってくれる機能があると嬉しい
ghq lookが使えなくなったのでワークアラウンド

ghqのv1が[リリース](https://songmu.jp/riji/entry/2020-01-05-ghq-v1.html)されたことに伴い、
`ghq look`が使えなくなってしまったので、なんとかしました。

# やりかた
1. `ghq get --look` を使う
2. ↓のShellscriptを `.bashrc`などに突っ込んで今まで通り`ghq look`を使う

```shell
ghq() {
  if [[ $1 == "look" ]]; then
    local repo_path
    repo_path=$(command ghq list --full-path --exact $2)
    cd ${repo_path}
  else
    command ghq "$@"
  fi
}
```

1はタイプ数が多くてめんどいのと、公式で[ディレクトリの移動は`cd`を使用することを推奨](https://github.com/motemen/ghq/issues/241)していたので、2のshellscriptにしました。

# 蛇足1

`ghq look`は[こちら](https://songmu.jp/riji/entry/2019-12-28-ghq.html)にある通り
**一時的なコードのチラ見**のための機能で、**ディレクトリの移動に使うものでは無い** とのこと。
(全く知らなかった :scream:)

> ghq look はあくまでも「一時的なソースコードのチラ見」のための機能なのですが、これを作業ディレクトリの移動に使い、それゆえに意図せぬ挙動が起こってハマっているケースが散見されます。これはもちろん利用者側の問題ではなく、アナウンス不足であり、そのように誤解されやすい機能であるから故に、削除したいという意図です。

なんで別のshellプロセスが立ち上がるんだろうなーとは思ってたのですが、

> ghq look は子プロセスで別のシェルプロセスを起動して、ディレクトリを移動したように見せかけています。どうしてもそのようにするしかない。

ということだったんですね :thinking: 

# 蛇足2

`ghq look`は使えなくなってしまいましたが、v1になって、

- `ghq list`の高速化
- `ghq create`コマンドの追加
- `ghq.<repo_root>.root`で、レポジトリ(user, organization)ごとのクローン先を変更可能

など、色々Improveがあるということなので、使っている人は更新したほうが良いと思われます :smile:

# 蛇足3 
レポジトリがいっぱいあって移動が大変な方は、[こちら](https://github.com/Songmu/ghq-handbook/blob/master/ja/05-ghq-list.md)にある通り、pecoや、fzfなどと連携させたほうが良いと思われます :thinking:
エクストリームわんにゃんプログラミング

・コードを見ていると目が疲れる…
・コーディングが退屈…
・~~そもそもプログラミングがつまらない~~

###そう感じているそこのあなた！！

まずはこれを見てほしい
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/622ff9bd-7c9d-9e09-4f58-8db8e10f7017.gif)

どうだろうか、
疲れを癒してくれるネコちゃんとコーギーくんが常に画面上部にいるだけでなく、
退屈さを吹き飛ばしてくれるようなエキサイティングな打鍵感が得られ、
さらにはコンボシステムによりコーディングが捗ってしまうではないか！

この体験を与えてくれるのはGoogle Colaboratoryだけ。
しかも、無料で。

早速試したいでしょう、やり方を教えます。

ただ、Google Colaboratoryの初め方や使い方については説明しないので注意してほしい。
有志が書いた他の記事を参照すると良いだろう。

##Google Colaboratoryの設定を開く
今開いているノートブックの画面右上にある歯車をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/5892359a-fe99-a58b-c037-e8752fd7bac0.png)

##エディタのテーマをダークに
まずは、疲れた目を労うためにテーマをダークにしよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/34a2add8-a0fc-8e42-2a2e-53d27d1eb487.png)

これだけで質素だったエディタがクールなエディタ画面になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/2986bd9b-9c98-bbd9-cea8-aeff5a341389.png)

##エディタをわんにゃんモードにしよう
次に、設定画面左側メニューの[その他]をクリック
この画面を見るだけでわくわくが止まらないだろう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/42e595a9-69d4-31af-1c9b-573a99ce1685.png)

手始めに「コーギーモード」と「猫モード」にチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/e96f954c-1477-e9ae-c327-ee96eb2c911f.png)

これでエディタ画面上部にねこちゃんとコーギーくんが歩き出すぞ
余談だが、ネコちゃんよりコーギーくんのほうが幾分か移動速度が速い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/433c2d0f-854b-8003-13c5-61a847e9b2e0.png)

##エディタをエクストリームモードにしよう
わんにゃんモードにした時と同じ画面でパワーレベルを選択しよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/fcc98ee2-4c1e-6bfc-1b8a-ec371cd2ef3e.png)

パワーレベルを「Many power（use with caution）」を選択し、保存しよう
括弧書きにあるように、今までの常識を覆す機能なので使用には注意が必要だ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428437/2be1bc22-c597-3681-4316-a205a86eb35f.png)

これだけの操作であなたでもエクストリームわんにゃんプログラミングができるようになります、ぜひお試しあれ。
Julia1.3のインストール

# Julia1.3のインストール
全然知らない言語でライブラリを突発的に作ってみたくなってJuliaを入れました。

インストールの手順とインストール時のエラーに関してメモっときます。

## git clone
まずjuliaのリポジトリをローカルに落としてきます。

```
git clone git://github.com/JuliaLang/julia.git
```

## checkout
1.3.0とタグ打ちされているので、そこにcheckout

```
cd julia
git checkout v1.3.0
```

## make
ここでmakeをしたら上手く行くはずでしたが...

(-j4は並列で4つ回すって意味です。)

```
make -j4
```
謎のエラーが出力されます。

```:実行結果
Makefile:60: recipe for target 'julia-deps' failed
make: *** [julia-deps] Error 2
```


## 謎のエラーの解消

色々調べたらgfortranとcmakeを入れる必要があるらしいようです。
私の場合、gfortranがありませんでした。
入れる。

```
sudo apt-get install gfortran
sudo apt-get install cmake
```

## 動作確認
以下のコマンドで動作したら後は、OKです。

```
./julia
```

```:実行結果
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.3.0 (2019-11-26)
 _/ |\__'_|_|_|\__'_|  |  
|__/                   |
```
DynamoDB の条件付き書き込みを試してみる　- condition-expression

デフォルトでは、DynamoDB 書き込みオペレーション (PutItem、UpdateItem、DeleteItem) は無条件です。
つまり、これらの各オペレーションでは、指定されたプライマリキーを持つ既存の項目が**上書き**されます。

条件付き書き込みを利用すると項目の属性が 1 つ以上の想定条件を満たす場合のみに成功できるようできます。それ以外の場合は、エラーが返されます。

とりあえず検証してみる。

---
#1.適当なtableを作成する#

項目を追加する。

```json:item.json
{
    "Id": { "N": "100"},
    "Price": {"N": "3000"},
    "Category": {"S": "Tshirt"}
}
```

```
aws dynamodb put-item \
    --table-name fashion \
    --item file://item.json 
``` 



#2.更新される場合#

ここでは、limit 2000 以下のものに対してのみ、update するものとする。

```json:values.json
{
    ":discount": { "N": "600"},
    ":limit": {"N": "2000"}
}
```

```
aws dynamodb update-item \
    --table-name fashion \
    --key '{"Id": {"N": "100"}}' \
    --update-expression "SET Price = Price - :discount" \
    --condition-expression "Price > :limit" \
    --expression-attribute-values file://values.json
``` 

この場合は、3000 - 600 =　2400 なので更新される。



#3.更新されない場合#

では、さらに discount 600 にしてみます。

```json:values2.json
{
    ":discount": { "N": "600"},
    ":limit": {"N": "2000"}
}
```

``` 
aws dynamodb update-item \
    --table-name Fashion \
    --key '{"Id": {"N": "100"}}' \
    --update-expression "SET Price = Price - :discount" \
    --condition-expression "Price > :limit" \
    --expression-attribute-values file://values2.json
``` 

この場合は、2400 - 600 = 1800 で、limit = 2000 より小さいので更新されない。
Docker?あぁ！クジラのやつね

##はじめに
Docker...あぁクジラが書いてあってコンテナがなんとやらのすげーやつね！
この程度の知識しかなく、かなり危機感を感じたので勉強することにしました。
書いて覚えるタイプなのと備忘録ってことで記事にしてみたいと思います。

##Dockerってなに？
+ 次世代仮想化技術
+ アプリケーションをコンテナにパッケージングして使う
+ 同じ環境を共有することが容易(新規ローカル環境の構築とか楽)らしい
+ 仮想化技術っていってもvmWareやvirtualBoxなどとは別物

##実際何がいいのか
+ Dockerfileでインフラをコード化して管理することができる。
+ ゲストOSがないのでオーバーヘッドが少ない(負荷が低い)

![docker_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564493/d3a3107f-1c82-18c1-9b97-bff8ee4a5ece.png)



上記のようにほかの仮想化ソフトとは違いゲストOSが存在せず、DockerEngine上にコンテナなるものが存在しています。
このコンテナがアプリケーションを実行するための空間です。

通常はOS上に１つの空間が存在していますが、コンテナ型仮想環境では１つのOS上に複数のユーザ空間を用意することができます。
さらにdockerはコンテナの内容をDockerfileなるものにコードとして記述して管理できる仕組みがあるようです。
これによってコンテナ内のOSやライブラリ、環境変数とかをパッケージ化したり保存したり移動したり..したりしたりできるようです(・ω・)マジカ

##Dockerイメージとコンテナ
Dockerにはイメージというものがあり実行環境などをパッケージングしたものがこれにあたり、これらをDockerEngine上で起動したものがコンテナになる。
イメージは起動したコンテナ内で必要なアプリをインストールしたり、各設定を変更したりしたものを保存することで新しいイメージとして使用、配布することが可能になります。

![イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564493/48ff8897-cf47-67c7-1990-e03da35ee4a0.png)

イメージ層のレイヤは読み取り専用になっており、変更することはできません。
レイヤは一つのものをインストールすることでレイヤが積み重なっていきます。
イメージ空コンテナを起動して新しくミドルウェアなどをインストールすることで新しくレイヤを積み重ねることができます。
このコンテナから新しく作成(commit)することでイメージを新しく作成することもできます。その際は図の左のイメージにコンテナレイヤーで追加したものレイヤー３に重なったイメージができあがります。

##Dockerfile
#####Dockerfileとは
DockerイメージはDockerHubから取得(pull）することもできますが、自分でイメージを作成する場合はDockerfileを作成しそれを使用してイメージを作成することができます。
Dockerfileにはベースにするイメージに対して実行する内容を記載します。

##まとめ
+ Dockerはコンテナ型の仮想化技術
+ ゲストOSが存在せず、各環境をコンテナとして扱う
+ コンテナはイメージを起動することで使うことができ、コンテナから新たにイメージを作成することもできる
+ イメージを作成するにはDockerfileを作成しそれをもとにイメージを作成する

初回はDockerについて基本的なことをメモ程度に書かせて頂きました。
次回は実際にDockerを使用して開発環境を構築した記事を書いてみたいと思います。