OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoderでRuby学習7【Contest168 Triple Dots】

## はじめに
Ruby学習の一環として「競技プログラミング（競プロ）」に挑戦します。
そのための学習の中で学んだことをアウトプットしていきます。
今回は「AtCoder Beginners Contest168」の二問目（Triple Dots）より。
https://atcoder.jp/contests/abc168/tasks/abc168_b

今回の自分の解答と、解答に使ったメソッド・記法を紹介していきます。


## 問題
英小文字からなる文字列 S があります。
S の長さが K 以下であれば、Sをそのまま出力。
S の長さが K　を上回るのであれば、先頭から K 文字だけを切り出し、末尾に"..."を加えて出力すること。

制約
・K は1以上100以下の整数
・S は英小文字からなる文字列
・S の長さは1以上100以下

入力は以下の形で与えられる。

```ruby
K
S

入力例
7
nikoandsolstice
```

```ruby
出力例
# 上記例の場合
=> nikoand...
```

## 解答
まずは僕が最初に書いたコードです。

```ruby
k = gets.to_i
s = gets.chomp
print s.length > k ? "#{s[0...k]}..." : s
```
Atcoderへの挑戦を初めて、初期の頃に学んだ三項演算子を使っての解答です。
[AtCoder Beginners SelectionでRuby学習【Product】様々な解法から学ぶ](https://qiita.com/jag_507/items/a9df2172346a313dabdd)
文字列がの長さをlengthメソッドで出した上で K と比較し、
K より大きかった場合式展開を使って"..."を加えて出力、K 未満だった場合はそのまま出力という流れです。

では、今回使ったメソッド、記法について以下にまとめます。

### lengthメソッド(Stringクラス)
文字列の長さを返します。

```ruby
#例
print "test".length
=> 4
```
ちなみに、Arrayクラスのlengthメソッドは要素の数を返します。

### 文字列の一部を取得する方法①[first...end]
文字列の中から、開始位置（first）から終了位置(end)で挟まれた範囲を文字列として返します。
位置の指定は、1文字目の前を「0」として、1文字目と2文字目の間が「1」という形で指定出来ます。

```ruby
a = "test"

#位置指定方法（イメージ）
0 t 1 e 2 s 3 t 4

#例
print a[0...3]
=> tes
#上記の位置指定方法での、0から3の間を文字列として返す
```

### 文字列の一部を取得する方法②[first, length]
ちなみに、[1, 3]という形で指定すると、「1」の位置から3文字を返します。

```ruby
a = "test"

#例
print a[1, 3]
=> est
```
終了位置を位置指定ではなく、開始位置からの文字数という形で指定したい場合に使います。



## 最後に
以上、「AtCoder Beginners Contest168」の二問目（Triple Dots）から学んだメソッドをご紹介しました。

もし間違いなどございましたら、ご指摘いただけると嬉しいです。
VMの練習

//
# 今後複数の仮想マシンを作ることを想定して、それらをまとめるフォルダ（MyVagrant）を作る
mkdir MyVagrant
# MyVagrantに移動する
cd MyVagrant
# 仮想マシンを作るフォルダを作る（MyCentOS）
mkdir MyCentOS
# MyCentOSに移動する
cd MyCentOS
# 仮想マシン設定用のVagrantfileを作る
vagrant init bento/centos-6.8
# Vagrantfileを編集して仮想マシンのIPアドレスを192.168.33.10にする
# 仮想マシンを起動する（少し時間かかります）
vagrant up
# 仮想マシンの状態を確認する
vagrant status

●CENTOS6のID,Pass(putty)
ID vagrant
password vagrant


IP 192.168.33.10

●PHPサーバー立ち上げ
php -S 192.168.33.10:8000

●ホームページへのアクセス
192.168.33.10:8000

●putty
webサーバーが立ち上がっていた場合　control+C
終了するには　Exit


●仮想サーバを止めるには
PS C:\Users\shimizu> cd MyVagrant
PS C:\Users\shimizu\MyVagrant> cd MyCentOS
PS C:\Users\shimizu\MyVagrant\MyCentOS> vagrant suspend

●仮想サーバを動かすには
PS C:\Users\shimizu> cd MyVagrant
PS C:\Users\shimizu\MyVagrant> cd MyCentOS
PS C:\Users\shimizu\MyVagrant\MyCentOS> vagrant up

●



# OSを最新状態にアップデート（時間かかります）
sudo yum -y update

# スクリプトを入手するためのgitをインストール
sudo yum -y install git

# gitを使ってアプリケーション設定用のスクリプトをダウンロード
git clone https://github.com/dotinstallres/centos6.git

# centos6フォルダができるのでそちらに移動
cd centos6

# スクリプトを実行（時間かかります）
./run.sh

# もろもろの設定を反映
exec $SHELL -l

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
AWS関連まとめ




★GITBASHからAWSのログイン
ssh -i ~/.ssh/FirstKey.pem ec2-user@52.199.121.67


$$ sudo yum -y update
$$ sudo yum -y install httpd
$$ sudo service httpd start
$$ sudo chkconfig httpd on


AWSからコピー
scp -i ~/.ssh/FirstKey.pem ec2-user@52.199.121.67:/var/www/html/index.html ~/Desktop


ファイル転送
scp -i ~/.ssh/FirstKey.pem ~/Desktop/index.html ec2-user@52.199.121.67:~

ログイン
ssh -i ~/.ssh/FirstKey.pem ec2-user@52.199.121.67



$ scp -i ~/.ssh/FirstKey.pem ~/Desktop/index.html ec2-user@52.199.121.67:/var/www/html

★コンフィグファイルがエラーの可能性があるのでパーミッションを変更して再度実行する
File contains no section headers.
Mongo APIを採用したCosmosDBに対して要求したコマンドのRU消費量を知るには

# 背景
CosmosDBは１秒間に利用できるRU（リクエストユニット）は任意の値をユーザーで定義できるため、CosmosDBが消費できるRUの値を大きくすればどんなクエリも安定的に処理できる。しかし、なるべく多くのコマンドを少ないコストで捌きたい場合、自分が要求するコマンドによってどの程度のRUが消費されるかを知り、コマンドに対してRUの消費量が大きければコマンド内容を調整してなるべく少ないRUで同一の結果が得られるように対処しなければならない。ここではnode.jsを採用したプロジェクトにおいてCosmosDBへ要求したコマンドがどの程度RUを消費したのかを調査する方法を示す。

# Node環境下でRUの消費量を知るには
CosmosDBに対してgetLastRequestStatisticsと呼ばれるCosmosDBにだけ利用できるカスタムコマンドを呼び出すことでRUの消費量を知ることができる。Nodeを使用している環境でgetLastRequestStatisticsコマンドを呼び出すにはdbオブジェクトのcommandメソッドを使用すればよい。具体的なコードを以下に示す。

```getLastRequestStatistics.js
const mongodb = require("mongodb")
const mongoClient = require("mongodb").MongoClient;
const connectstring = "CosmosDB接続文字列"
const dbname = "データベース名"

async function getLastRequestStatistics() {
    const client = await mongoClient.connect(connectstring,{useUnifiedTopology: true})
    const db = client.db(dbname)

    //計測したいコマンドを記述する。以下は全件検索をするコマンドの例。
    try {
        const testcursor = db.collection("コレクション名").find({})
        await testcursor.forEach((doc)=>{
            //console.log(doc)
        })
    } catch(error) {
        console.log(error)
    }    

　　//直前に実行したコマンドのRU消費量を知るためにgetLastRequestStatisticsコマンドを実行する
    const result = await db.command({ getLastRequestStatistics: 1 })
    console.log(`result:${result['CommandName']}`)
    console.log(`requestCharge:${result['RequestCharge']}`)        
    await client.close()
}

getLastRequestStatistics().catch((reason)=>{console.log(reason)})
```

上記のように計測したいコマンドの実行、getLastRequestStatisticsコマンドの順でコマンドを実行することで特定のコマンドのRU消費量をしることができる。CosmosDBを利用する場合、本番環境で想定外のRUを消費しないために事前に自分のコマンドがどの程度のRUを消費するのかを一つ一つ確認することをおすすめする。

# 参考ページ
https://docs.microsoft.com/ja-jp/azure/cosmos-db/find-request-unit-charge
Dockerの開発環境でコンテナに入り通常のコマンドで実行する方法


Dockerの開発環境ではDockerの開発環境特有のコマンドでの操作が必要になりますが、スクリプト言語のコマンドをローカル環境で実行するときと同じコマンドで開発ができる方法を紹介します。

# 環境
Docker 19.03.8
Ruby 2.5
Rails 5.2

# Dockerとローカルの開発環境で実行するときの違い
例えば以下のRuby on Railsの開発で用いられるコマンド

```
$ rails db:migrate
```
このコマンドをDockerで実行する場合

```
$ docker-compose run web rails db:migrate
```
このようなコマンドになります。
それ以外にも操作方法がありますが、Ruby on Railsで開発するならRubyやRailsの通常のコマンドの方が楽ですよね。その場合は以下の手順でコマンドを実行します。

# Rubyの通常のコマンドで開発を行うための準備
Dockerを立ち上げます。

```
$ docker-compose start
```
コンテナ名を調べます。

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a9b19e00552e        recipegram_web      "entrypoint.sh bash …"   44 hours ago        Up 11 seconds       0.0.0.0:3000->3000/tcp   recipegram_web_1
975875c12c76        postgres            "docker-entrypoint.s…"   46 hours ago        Up 12 seconds       5432/tcp                 recipegram_db_1
```
コンテナ名を入れて下記のコマンドを実行します。

```
$ docker exec -it a9b19e00552e bash
```
そうするとこのように切り替わるのでこの状態で今回であればRubyやRailsの実行コマンドで開発が行えます^_^

```
root@a9b19e00552e:/myapp#
```
Deno と Postgres で REST API を作成

次のページと同じことを行いました。
[Creating your first REST API with Deno and Postgres](https://blog.logrocket.com/creating-your-first-rest-api-with-deno-and-postgres/)

ソースコードはこちらです。
[ diogosouza / logrocket_deno_api ](https://github.com/diogosouza/logrocket_deno_api)

1) ソースをクローンします。

```bash
git clone https://github.com/diogosouza/logrocket_deno_api.git
```

2) コードの修正

```js:config.js
// const env = Deno.env();

// export const APP_HOST = env.APP_HOST || "127.0.0.1";
// export const APP_PORT = env.APP_PORT || 4000;

export const APP_HOST = "127.0.0.1";
export const APP_PORT = 4000;
```

```js:db/database.js
（省略）
port: 5432
（省略）
```

3) サーバーの実行

```bash
deno run --allow-net index.js
```

4) データの投入

```bash
curl -X POST -H "Content-Type: application/json" \
    -d '{"name":"Gold Star","brand":"Sapporo"}' \
    http://localhost:4000/beers
#
curl -X POST -H "Content-Type: application/json" \
    -d '{"name":"Ebisu","brand":"Sapporo"}' \
    http://localhost:4000/beers
#
curl -X POST -H "Content-Type: application/json" \
    -d '{"name":"Reserve","brand":"Sapporo"}' \
    http://localhost:4000/beers
```

5) データの確認

```bash
curl -X GET http://localhost:4000/beers | jq .
```

6) ブラウザーで、http://localhost:4000/beers/　にアクセス
![deno_postresql_may19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a63cd7b1-f91b-fdc0-f414-ec78876daccd.png)
【VisualStudio】コードジェネレーターが働かなかった【備忘録】

# はじめに

VisualStudio2019でWeb APIを作成しようとしたとき、コントローラーを作ろうと思ったら以下のエラーが出て作成ができませんでした。
![スクリーンショット (105).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/9b5dcf61-0bcb-ce8c-c016-42dd6f03092a.png)

これの解決方法を備忘録として書いておきます。

### 環境
Windows10
VisualStudio2019

# 1. エラーの原因
とりあえず出たエラーに書いてある文言「パッケージの復元に失敗しました。のパッケージの変更をロールバックします。」をコピペして調べましたが、どれをやっても解決せず、、、

原因は「コードジェネレータを実行中にエラーが発生しました。」の方にありました。

VisualStudioがコントローラをスキャフォールドで作成してくれる時には、
Microsoft.VisualStudio.Web.CodeGeneration.Design
というパッケージを使います。（使うものはほかにもあります。）

コントローラを作成しようとすると、パッケージマネージャであるNuGetが勝手にこれらのパッケージをダウンロードしてきてくれて、それを使ってくれます。

そのダウンロードがなぜかできていなかったのが原因でした。

# 2. 解決策
1. 上部のメニューからツール→NuGetパッケージマネージャ→パッケージマネージャの設定を選択して、設定を開く

2. パッケージソースを選択
ここにパッケージのダウンロード元のURLが記述されているはずなのに記述されていなかったことが原因でした。

3. 右上のプラスボタンから新規追加し、

- 名前：nuget.org
- ソース：https://api.nuget.org/v3/index.json

と記述することで完了です。

これによってダウンロード元が指定され、ここからパッケージを持ってきてくれます。

# さいごに
つい最近VisualStudioをインストールしたのですが、普通最初からURL指定されていませんか？
VisualStudioを使っている人が全員この作業をしたとは思えない。
原因に気づくまでにかなり時間がかかってしまいましたが、解決してよかったです。
Slateを使ってAndroidのEmulatorを一発で呼び出す

## about
Window管理ツールのSlateを使って、ショートカットキーでAndroidのEmulatorを前面に表示します。

## 方法
`~/.slate`ファイルに以下を記述


### Apple silicon Mac
```shell
bind {assing-key} focus 'qemu-system-aarch64'
```

### Intel Mac
```shell
bind {assing-key} focus 'qemu-system-x86_64'
```

エミュレートするOSのversionによっては以下の場合もあり

```shell
bind {assing-key} focus 'qemu-system-i386'
```

## いままで
Alfredの検索を使っていて
iOSの「Simulator」は呼び出して前面表示できたのですが、Androidの「Emulator」は出てこないので困っていました。


## 実例
私はCmd+Alt+QでEmulatorを全面に呼び出すようにしています。
```
bind q:alt;cmd focus 'qemu-system-aarch64'
```

# Slate
https://github.com/jigish/slate
携帯電話エミュレータ

# 携帯電話エミュレータの配布先へのリンク

* Docomo
    * [iモードHTMLシミュレータII](https://www.nttdocomo.co.jp/service/developer/make/content/browser/html/tool2/)
        * windows10 1903で動く
        * sslはわからない
* Openwave SDK
    * Openwave Systems Inc. -> Home : [Tools & SDK](https://web.archive.org/web/20070418095054/http://developer.openwave.com/ja/tools_and_sdk/)
        *   [Openwave ® 6.2K](https://web.archive.org/web/20070418095054/http://developer.openwave.com/ja/tools_and_sdk/openwave_mobile_sdk/SDK62K/) (waybackmachine バックアップ)
            *   windows10 1903で動く
            *   sslはわからない
        *   [Openwave SDK Universal Edition1.1](https://web.archive.org/web/20070403220414/http://developer.openwave.com/ja/tools_and_sdk/openwave_mobile_sdk/SDKUE11/) (waybackmachine バックアップ)
            *     windows10 1903はインストールしてもファイルが欠ける（？）


# 参考

* [Codezine 携帯シミュレータ入門](https://codezine.jp/article/detail/1352)
Flutterで簡易アプリを作った（動画チャンネルトラッカー）

# これはなに
flutterを触り始めて、アプリを作ってみようということで簡易アプリを作って公開してみた。その際のメモ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20014/7282ee28-773c-cee4-94fd-1d0dd380d892.png)


主に利用したもの。
- YouTube RSS
- amazon api gateway
- aws lamda
- youtube search api

わりと前に作って忘れてるので、抜けてるところ思い出したらアプデするかも。



# RSS
webfeedを利用。してたんだけど、rss処理するところをlamdaに持っていったので、今回はこれは使わずになった。
https://pub.dev/packages/webfeed

# Youtube RSS
youtubeはatom形式なので、その辺りを対応。


# Youtube API

- [YouTube Data API の概要](https://developers.google.com/youtube/v3/getting-started?hl=ja)

APIキーの制限などはこちらを参考にすると良き（sha1の証明書とかetc）
https://cloud.google.com/docs/authentication/api-keys?hl=ja


youtube RSSのサンプル
https://www.youtube.com/feeds/videos.xml?channel_id=UCXjTiSGclQLVVU83GVrRM4w

youtubeのサムネイル画像について。（RssFeedがなぜか、thmubnailだけうまくとれないので、チャンネルIDをリンクに入れ込んでいる。）
最大サイズのサムネリンク
> http://img.youtube.com/vi/【動画ID】/maxresdefault.jpg

画像の404対応は、このpubが最高
https://pub.dev/packages/cached_network_image

# API Gateway
この辺参考になった。
https://dev.classmethod.jp/articles/getting-start-api-gateway/

# ちょい詰まったところなど

onTapで、launchを下記みたいに書いてると、自動でtapされてしまう問題あった。

```
return ListTile(
 child: Text('aaa'),
 onTap: _launchUrl(val),
);
```

なので、下記で解決。

```
return ListTile(
 child: Text('aaa'),
 onTap: () => _launchUrl(val),
);
```


# 完成物
- [iOS「動画チャンネルトラッカー」](https://apps.apple.com/jp/app/%E5%8B%95%E7%94%BB%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%83%88%E3%83%A9%E3%83%83%E3%82%AB%E3%83%BC/id1506733639)
- [Android「動画チャンネルトラッカー」](https://play.google.com/store/apps/details?id=yukiishikawa.com.youtube_channel_tracker)

めちゃ粗いですが、気になった人は使ってみてください。バグとかあれば連絡ください！（対応できるかわからんですが）
[Python]各フォルダに散らばっている特定のファイルを一か所に集めたい


##はじめに
Qiita初投稿。いつもお世話になっていたので、そろそろ自分も出来上がったものを公開していこうかと。

##各フォルダに散らばっている特定のファイルを一か所に集めたい
こういう事、よく起きませんか？
全てのFolderは同じフォルダ構造を持っていて、sub-sub-folderに眠っているファイル（今回はmdbファイルとしました）をどこか一か所に集めたい..

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635959/bf811747-50e2-5694-aa14-3afd556a0914.png)


##Codeの実行
毎回忘れては調べるので以下に残します。
環境はJupyter notebookで実行しました。

```mdb_collect.py
import os
import shutil
import pandas as pd

#保存したいディレクトリを指定
file_to = r"the location where you want to save them"

#これから探しだすフォルダ構造のトップを指定
k = os.path.exists(r"Parent folder where you seek the files")
if k==True: #一応、folderが存在するか確認します。
    root = r"the location where you seek the files"

for folder, subfolders, files in os.walk(root):
    
# "sub-sub-folder-1" という名前のfolderを見つけたら
# mdbファイルを探しだし取得する。
    if "\sub-sub-folder-1" in folder:
        for file in files:
            if ".mdb" in file:
                file_from = folder + "\\" + file
                print(file_from)
                shutil.copyfile(file_from,file_to+"\\"+file)
```


os.walk()がParent Folder以下の階層すべてを歩きわたってくれるんですね。便利。
Apex 開発：deepCloneとCloneの区別

<h2>普通の方(clone)</h2>
```
Account a = new Account(Name='Acme', BillingCity='New York');			

Account b = new Account();			
Account[] q1 = new Account[]{a,b};			
			
Account[] q2 = q1.clone();			
q1[0].BillingCity = 'San Francisco';			
			
System.debug(q1[0].BillingCity);			//  San Francisco
System.debug(q2[0].BillingCity);			//  San Francisco
```
同じポインターのため、q1修正すると、q2の値も変更されるとのことです。

<h2>deepCloneの方</h2>
```
Account a = new Account(Name='Acme', BillingCity='New York');					
					
Account b = new Account();					
Account[] q1 = new Account[]{a,b};					
					
Account[] q2 = q1.deepClone();					
q1[0].BillingCity = 'San Francisco';					
					
System.debug(q1[0].BillingCity);			//  San Francisco		
System.debug(q2[0].BillingCity);			//  New York		
```

```
List<Account> accts = [SELECT CreatedById, CreatedDate, LastModifiedById, 					
                       LastModifiedDate, BillingCity 					
                       FROM Account 					
                       WHERE Name='Acme' OR Name='Salesforce'];					
					
// Clone list while preserving timestamp and user ID fields.					
Account[] q3 = accts.clone();					
					
// Verify timestamp fields are preserved for the first list element. 					
					
System.debug(q3[0].Id);					
System.debug(q3[0].CreatedById);					
System.debug(q3[0].CreatedDate);					
System.debug(q3[0].LastModifiedById);					
System.debug(q3[0].LastModifiedDate);					
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550974/95b6f8fa-6f4a-4d38-f64b-c4f73c841697.png)

```
List<Account> accts = [SELECT CreatedById, CreatedDate, LastModifiedById, 					
                       LastModifiedDate, BillingCity 					
                       FROM Account 					
                       WHERE Name='Acme' OR Name='Salesforce'];					
					
// Clone list while preserving timestamp and user ID fields.					
Account[] q3 = accts.deepClone(false,false,false);					
					
// Verify timestamp fields are preserved for the first list element. 					
					
System.debug(q3[0].Id);					
System.debug(q3[0].CreatedById);					
System.debug(q3[0].CreatedDate);					
System.debug(q3[0].LastModifiedById);					
System.debug(q3[0].LastModifiedDate);					
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550974/e1babc7e-1406-cfbc-a364-4e4d5027b946.png)

「Id」、参照のみ「タイムスタンプ」と「自動採番」はこまめに扱いできる。
 ディフォルト：false
FlutterでJsonをパースする

今回はjson_annotationを利用してパースメソッドを自動生成します。

まずは以下をpub spec.yamlに追加します。

``` yaml
json_serializable: ^3.3.0
json_annotation: ^3.0.1
```

次に任意のEntityオブジェクトを作成します。

``` dart
class User {
  final String id;
  final String name;

  User(this.id, this.name);
}
```

作成したオブジェクトのファイルの先頭に`part “[任意のクラス].g.dart”`を追加します。

``` dart
part 'user.g.dart';
```

追加後にプロジェクトのルートで以下のコマンドを実行します。

``` zsh
flutter packages pub run build_runner build
```

実行後にパース用のメソッドが自動生成されます。

Entityクラスに以下のような関数を追加して利用します。

``` dart
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
```

面倒なJSONのパースを半自動化できるのでとてもおすすめです。
早くDartにもCodableのような機能が実装されるといいなと思いました。
[InvalidArgumentException]  Could not find a matching version of package “laravel/install”. Check the package spelling, your version constraint and that the package is available      in a stability which matches your minimum-stability (stable).  

#Could not find a matching version of package “laravel/install”でつまづいた点

##背景
Laravelのインストールの際に添付のエラーが出たので、そのときの対処法をまとめます。


```bash:エラー
$ composer global require “laravel/install”

[InvalidArgumentException]                                                   
  Could not find a matching version of package “laravel/install”. Check the p  
  ackage spelling, your version constraint and that the package is available   
  in a stability which matches your minimum-stability (stable).           

```

## 動作環境
`OS : macOS Mojave 10.14.6`
`Composer version 1.10.6`

## 結論
コマンドが間違えていたようでした.

```bash:正
composer global require "laravel/installer"
```

```bash:誤
composer global require "laravel/install"
```

## 原因

公式サイトを調べて見ると以下の記述がありましたので
"laravel/installer"が正しいようです.

```bash:
composer global require "laravel/installer=~1.1"
```
[Python]標準入力

#標準入力

AtCoderなどを想定した、Pythonでの標準入力方法をまとめました。

#文字列

```Python:サンプルコード
S = input() #ここで標準入力
print (type(S), S)
#<class 'str'> atcoder
```

#整数

```Python:サンプルコード
N = int(input()) #ここで標準入力
print (type(N), N) 
#<class 'int'> 20
```

#行列

```Python:サンプルコード
R = int(input()) #行数の入力
P = [list( map( int, input().split() ) ) for i in range(R)] #2行目以降標準入力
# map(関数, 要素)
print(type(P), P)
#<class 'list'> [[1, 32], [2, 63], [1, 12]]
```

#大量の入力

```python:サンプルコード
import sys
import itertools
import numpy as np

read = sys.stdin.buffer.read
#標準入力から複数行取得するための関数です。 readlines() が結果を行単位で分割してリストで返すのに対して、 read() は結果をそのまま1つの文字列として取得します。
readline = sys.stdin.buffer.readline
#標準入力から1行取得するための関数です。
readlines = sys.stdin.buffer.readlines
#標準入力から複数行取得するための関数です。戻り値はリストで、入力された文字列が1行ずつ要素として格納されています。
# .bufferはbytes を返すのでさらに少しだけ速いようですが、あまり差はありません。

#　標準入力例
# 3 4 3
# 1 3 3 100
# 1 2 2 10
# 2 3 2 10

N, M, Q = map(int, readline().split())
print(N, M, Q)
# 3 4 3

# 数値のNumPy配列(N×M)として入力したい場合 npを外せばリストになる。
# 文字列はbytes型なので'b""'が付く。結合等出来ないのでread定義からbufferを外した方が良い。
# input()と併用は避ける。
A = np.array(list(map(int, read().split()))).reshape((N, M))
# 下記と同型のNumPy配列を取得

m = map(int, read().split())
#print(list(m))
# <map object at 0x7f78f13a7d30> [1, 3, 3, 100, 1, 2, 2, 10, 2, 3, 2, 10]

for a,b,c,d in zip(m,m,m,m): # 複数のイテラブルオブジェクト（リストやタプルなど）の要素をまとめる関数
  print(a,b,c,d)
# 1 3 3 100
# 1 2 2 10
# 2 3 2 10
```
AtCoderBeginnerContest168復習＆まとめ（前半）

# AtCoder ABC168
2020-05-17(日)に行われたAtCoderBeginnerContest168の問題をA問題から順に考察も踏まえてまとめたものとなります．
前半ではABCまでの問題を扱います．
問題は引用して記載していますが，詳しくはコンテストページの方で確認してください．
[コンテストページはこちら](https://atcoder.jp/contests/abc168)
[公式解説PDF](https://img.atcoder.jp/abc168/editorial.pdf)

## A問題　∴ (Therefore)
> 問題文
> いろはちゃんは、人気の日本製ゲーム「ÅtCoder」で遊びたい猫のすぬけ君のために日本語を教えることにしました。
> 日本語で鉛筆を数えるときには、助数詞として数の後ろに「本」がつきます。この助数詞はどんな数につくかで異なる読み方をします。具体的には、$999$以下の正の整数$N$について、「$N$本」と言うときの「本」の読みは
>　・$N$の$1$の位が$2,4,5,7,9$のとき"hon"
>　・$N$の$1$の位が$0,1,6,8$のとき"pon"
>　・$N$の$1$の位が$3$のとき"bon"
> です。
> $N$が与えられるので、「$N$本」と言うときの「本」の読みを出力してください。

入力を数字で受け取って，$10$で割った余りが$1$の位になるので，その値で場合分け．
誤差だとは思うけど，少しでも早く提出するために，"hon"の出力を`else`にしました（条件式書くのが多少短くなる）．

```python:abc168a.py
n = int(input())
k = n % 10
if k == 3:
    print("bon")
elif k == 0 or k == 1 or k == 6 or k == 8:
    print("pon")
else:
    print("hon")
```

## B問題　... (Triple Dots)
> 問題文
> 英小文字からなる文字列$S$があります。
> $S$の長さが$K$以下であれば、$S$をそのまま出力してください。
> $S$の長さが$K$を上回っているならば、先頭$K$文字だけを切り出し、末尾に ... を付加して出力してください。

とりあえず，if文で$S$の長さと$K$を比較して，以下のときと上回っているときの処理を書けば終わりです．
pythonは文字列を配列みたいに扱えるので，for文使わずに書きました．

```python:abc168b.py
n = int(input())
s = input()
if len(s) <= n:
    print(s)
else:
    print(s[:n] + "...")
```

B問題解けたのがコンテスト開始から数分なので，このあたりまでは自分の理想とする時間で解けました．

## C問題　: (Colon)
> 問題文
> 時針と分針の長さがそれぞれ$A$センチメートル、$B$センチメートルであるアナログ時計を考えます。
> 時針と分針それぞれの片方の端点は同じ定点に固定されており、この点を中心としてそれぞれの針は一定の角速度で時計回りに回転します。時針は$12$時間で、分針は$1$時間で$1$周します。
> $0$時ちょうどに時針と分針は重なっていました。ちょうど$H$時$M$分になったとき、$2$本の針の固定されていない方の端点は何センチメートル離れているでしょうか。

2,3通り解き方が思いついたのですが，自分は余弦定理使って解きました．
求めたい値$D$は，

```math
D = \sqrt{A^2 + B^2 - 2AB\cos \theta}
```

で求めることができるので，$\theta$を求めれば解けます．
時針と分針が，それぞれ0時から時計回りに針までの角度を，$\theta_A, \theta_B$とすると，

```math
\theta_A = 30 \times H + 0.5 \times M　\\
\theta_B = 6 \times M
```

となるので時針と分針のなす角$\theta$は，

```math
\theta = \theta_A - \theta_B
```

で求めることができます．
ここで，$\theta$が$180$度より大きい場合や負になる場合が考えられますが，

```math
\cos (360 - x) = \cos x \\
\cos (-x) = \cos x
```

となるため，特に問題なく余弦定理の計算をして長さを出すことができます．

```python:abc168c.py
import math
a, b, h, m = map(int, input().split())
x = 30 * h + m / 2 - 6 * m
d = math.sqrt(a**2 + b**2 - 2 * a * b * math.cos(math.radians(x)))
print(d)
```

他に思いついたのは，時針と分針の指し示す座標をそれぞれ$(A_x, A_y)=(A\cos\theta_1, A\sin\theta_1), (B_x, B_y)=(B\cos\theta_2, B\sin\theta_2)$とし，三平方の定理を用いることで求めたい$D$は，

```math
D = \sqrt{(A_x - B_x)^2 + (A_y - B_y)^2}
```

で求めることができます．

余弦定理を使ったのは，答えが正の実数であり，正しい値との絶対誤差または相対誤差に制約があるため，`math`の計算で誤差がどのくらい出るかわからなかったこともあり，極力使用回数が減らせる余弦定理で解きました．

前半はここまでとなります．
前半の最後まで読んでいただきありがとうございました．

後半はDEF問題の解説となります．
[後半に続く](https://qiita.com/takaito0423/items/6b239f072fdfe74be150)．
ejsをアップデートしたらejs-html-loaderが死んだ

ejsを3.0.1から3.0.2以上（執筆時3.1.3が最新）にアップデートした際、**Cannot read property 'forEach' of undefined** と表示され、ビルドに失敗する。

これは3.0.2で[レガシーなコードが消されてしまった](https://github.com/mde/ejs/commit/12beb5ccc08ac1fc5240128f7d5dba2e82acf57f)ため、dependencies に関する値が利用できなくなっている。

ejs-html-loaderは残念がら更新が2019年1月で止まってしまっており（このときも1年半ぶりのアップデートだった）、[Issueはあれど対応はされていない状況](https://github.com/mcmath/ejs-html-loader/issues/19)。

あまりコードは深堀りしていないのでこれで充分かどうかはわからないが、手元で動いた対応を記載しておく。
簡単に言えばdepsを利用しなければ良いということ。

``` node_modules/ejs-html-loader/src/render.js 
export function render(ctx, src, data) {
  let filename = ctx.resourcePath;
  let delimiter = data.delimiter;
  let context = data.context;

  let tpl = compile(src, {filename, delimiter, context});


// depsを返さないようにする
  return {
    rendered: tpl(data)
  };
}
```

~~[一応、プルリクエストは送ってみた](https://github.com/mcmath/ejs-html-loader/pull/20/commits/83e22206bd16ab80815a995512950b11bd84c20b)が、マージしてもらえるかは謎
もしかして自分で別途公開したほうが早い？~~

~~とりあえずは ejsを3.0.1で固定して利用することをおすすめする。~~


## ejs@3.0.2 以上に対応したローダーを作成しました

ejs-html-loader が全く更新されないので自前で公開してみた
https://qiita.com/bananacoffee/items/81c73af464f949a9b0b9
Pandasのpd.to_datetimeで時刻のみ抜き出す方法

Pythonを勉強してたところ、pd.to_datetimeで時刻だけ抜き出す方法が見つからなかったので記載

### 問題点
Pandasのpd.to_datetimeでは文字をTimestampにできるが

```
[コード]
s = pd.Series(["20:00", "21:00"])
t = pd.to_datetime(s, format='%H:%M')
t
```

```
[出力]
0   1900-01-01 20:00:00
1   1900-01-01 21:00:00
```

そのまま日付だけを変換すると```1900-01-01```という日付までついてくる

### 解決策

.dt.timeをつける

```
[コード]
s = pd.Series(["20:00", "21:00"])
t = pd.to_datetime(s, format='%H:%M').dt.time
t
```

```
[出力]
0    20:00:00
1    21:00:00
```
ABC 070 D Transit Tree Pass 

##問題
https://atcoder.jp/contests/abc070/tasks/abc070_d
##見た感じ
与えられているのは木なので、kから各ノードへの最短距離を計算すれば終わりそう.
##解法
ダイクストラ法でkから各ノードへの最短距離を計算した。
そして、クエリに合わせて、足し算した。
##ソースコード
```c++
const int N_MAX=100001;
vector<edge> v[N_MAX];
int n,k,Q;
pint q[N_MAX];
ll d[N_MAX];//ll=long long

void dijkstra(int s){
    fill(d,d+n,INF18);
    queue<int> que;
    que.push(s);
    d[s]=0;
    while(!que.empty()){
        int w=que.front();
        que.pop();
        rep(i,v[w].size()){
            if(d[v[w][i].to]>d[w]+v[w][i].cost){
                d[v[w][i].to]=d[w]+v[w][i].cost;
                que.push(v[w][i].to);
            }
        }
    }
    return;
}

int main(){
    int i,x,y,c;
    //入力
    cin>>n;
    rep(i,n-1){
        cin>>x>>y>>c;
        v[x-1].push_back(edge(y-1,c));
        v[y-1].push_back(edge(x-1,c));
    }
    cin>>Q>>k;
    rep(i,Q){
        cin>>x>>y;
        q[i].first=x-1;
        q[i].second=y-1;
    }
    //処理
    dijkstra(k-1);
    //出力
    rep(i,Q){
        cout<<d[q[i].first]+d[q[i].second]<<endl;
    }
}
```
kinesis

#kinesis
まずは一読
https://qiita.com/yShig/items/500d4139efed91bc432d

#kinesis data streams構成図
![kinesis_map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/dd3405ce-8397-99d6-419b-ce007ee7096d.png)

#kinesis data firehose構成図
![firehose_map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/94072dfe-1a49-07cc-a2af-358c6459245d.png)

##S3
<img width="639" alt="スクリーンショット 2020-05-19 17.01.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/cbbee3cf-51a0-4c2a-c6b4-3b51436fd593.png">

###データが Amazon S3 に配信されない
* Kinesis Data Firehose の IncomingBytes および IncomingRecords メトリクスをチェックし、データがKinesis Data Firehose 配信ストリームに正常に送信されていることを確認
* Lambda によるデータ変換が有効な場合は、Kinesis Data Firehose の ExecuteProcessingSuccess メトリクスで、Kinesis Data Firehose が Lambda 関数を呼び出そうとしたことを確認
* Kinesis Data Firehose の DeliveryToS3.Success メトリクスをチェックし、Kinesis Data Firehose が Amazon S3 バケットへのデータの配置を試みたことを確認
* すでに有効になっていない場合はエラーログ記録を有効にし、配信の失敗のエラーログを確認
* Kinesis Data Firehose 配信ストリームに指定された Amazon S3 バケットがまだ存在することを確認
* Lambda によるデータ変換が有効な場合は、配信ストリームで指定した Lambda 関数がまだ存在することを確認
* Kinesis Data Firehose 配信ストリームで指定した IAM ロールに、S3 バケットに対するアクセス権限と、Lambda 関数に対するアクセス権限 (データ変換が有効な場合) があることを確認
* データ変換を使用している場合は、Lambda 関数が、6 MB を超えるペイロードサイズのレスポンスを返さない

##RedShift
<img width="695" alt="スクリーンショット 2020-05-19 17.02.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/a4571ea4-94dc-9741-6e28-898c60823581.png">

###データが Amazon Redshift に配信されない
* Kinesis Data Firehose の DeliveryToRedshift.Success メトリクスで、Kinesis Data Firehose が S3 バケットから Amazon Redshift クラスターにデータをコピーしようとしたことを確認
* すでに有効になっていない場合はエラーログ記録を有効にし、配信の失敗のエラーログを確認
* Amazon Redshift の STL_CONNECTION_LOG テーブルで、Kinesis Data Firehose が正常に接続できるかどうかを確認
* 前のチェックで、接続が確立されていることを確認したら、Amazon Redshift の STL_LOAD_ERRORS テーブルで、COPY の失敗の理由を確認
* Kinesis Data Firehose 配信ストリームの Amazon Redshift 設定が正確で有効であることを確認
* Kinesis Data Firehose 配信ストリームで指定した IAM ロールに、Amazon Redshift によるデータのコピー元となる S3 バケットに対するアクセス権限と、データ変換用の Lambda 関数に対するアクセス権限 (データ変換が有効な場合) もあることを確認
* Amazon Redshift クラスターが Virtual Private Cloud (VPC) にある場合は、クラスターで Kinesis Data Firehose の IP アドレスからのアクセスが許可されていることを確認
* Amazon Redshift クラスターがパブリックにアクセス可能であることを確認
* データ変換を使用している場合は、Lambda 関数が、6 MB を超えるペイロードサイズのレスポンスを返さないようにします。


##ES
<img width="561" alt="スクリーンショット 2020-05-19 17.03.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/82ca8897-e4a8-a801-b358-b1af8aa7b105.png">


## Splunk
<img width="640" alt="スクリーンショット 2020-05-19 17.03.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/e03598f5-e1fa-a93c-7126-bb2d0014312e.png">


#データが Amazon Redshift に配信されない
* Kinesis Data Firehose の DeliveryToRedshift.Success メトリクスで、Kinesis Data Firehose が S3 バケットから Amazon Redshift クラスターにデータをコピーしようとしたことを確認


#参考文献
* [AWS]kinesisまとめ
    * https://qiita.com/yShig/items/500d4139efed91bc432d
* kinesis
    * https://docs.aws.amazon.com/ja_jp/streams/latest/dev/introduction.html
SQS

# Amazon SQS のベストプラクティス
* Amazon SQS スタンダード および FIFO (先入れ先出し) キューの推奨事項

##Amazon SQS スタンダード および FIFO (先入れ先出し) キューの推奨事項
* Amazon SQS メッセージの操作
* Amazon SQS コストの削減

##メッセージの操作
* タイムリーな方法でのメッセージの処理
    * 可視性タイムアウトを調整
* ロングポーリングのセットアップ
* 問題のあるメッセージのキャプチャ
    * デッドレターキューを設定
    * デッドレターキューの保持期間を元のキューの保持期間よりも長く設定

##Amazon SQS コストの削減
* 適切なポーリングモードの使用
    * 基本ロング
    * 場合によってショート

# Amazon SQS セキュリティのベストプラクティス
* キューにパブリックアクセスできないようにする
* 最小特権アクセスの実装
* Amazon SQS アクセスを必要とするアプリケーションと AWS のサービスには IAM ロールを使用する
* サーバー側の暗号化を実装する
* 転送時のデータの暗号化を強制する
* VPC エンドポイントを使用して Amazon SQS にアクセスすることを検討する

#参考文献
* Amazon Simple Queue Service とは
    * https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html
アコーディオンメニューの作り方


アコーディオンメニューの作り方をを記載しました。

```html
<main>
<ul class="menu">
 <li>
 <a href="">親メニュー1</a>
   <ul>
   　<li><a href="">子メニュー1</a></li>
   　<li><a href="">子メニュー2</a></li>
   </ul>
 </li>

   <li>
   <a href="">親メニュー2</a>
   <ul>
    <li><a href="">子メニュー1</a></li>
    <li><a href="">子メニュー2</a></li>
    </ul>
   </li>
　</ul>
 </main>
```
①ulクラスで全体を囲み
②その子要素としてaタグで親メニューと、改めてulクラスを設定して子クラスを設定する
③ulには、menuというクラスをつける。これは、javascriptでulクラス全体を取得するために
必要

```CSS
div,a,ul {
  padding: 0;
  margin: 0;
}
main {
  width: 1000px;
  margin: 0 auto;
}
a {
  text-decoration: none;
}
li {
  list-style: none;
}
.menu ul {
  display: none;
}
.menu ul.active {
  display: block;
  width: 980px;
  transform: translateX(20px);
  transition: .4s;
} 

.menu > li > a {
  display: block;
  border-bottom: 1px solid black;
}
.menu > li > a::before {
  content: '';
  width: 4px;
  height: 4px;
  border: 0;
  border-right: 2px solid black;
  border-bottom: 2px solid black;
  transform: rotate(45deg); 
  position: absolute;
  margin-top: 7px;
}
.menu > li > ul a {
  display: block;
  border-bottom: 1px dashed black;
}

```

ポイント①
.menu ul {
  display: none;
}　
で、menuの中にあるulは消しておく

ポイント②
.menu ul.active {
  display: block;
  width: 980px;
  transform: translateX(20px);
  transition: .4s;
} 
activeが付いたら、現れる。

```javascript

'use strict'

{
  const parentMenu = document.querySelectorAll('.menu > li > a');
  for(let i = 0;i < parentMenu.length;i++) {
    parentMenu[i].addEventListener('click',function(e){
// 今起こっているイベント要素をthis
      e.preventDefault();
      this.nextElementSibling.classList.toggle('active');
    });
  }

}
```
const parentMenu = document.querySelectorAll('.menu > li > a');
①まずは親メニューをJavascriptで取得する。
この時、querySelectorAllは、配列で取得してくる。

for(let i = 0;i < parentMenu.length;i++)
②forで親メニューの数だけ繰り返し1つ1つ処理をしていく。
0番目の時、1番目の時、2番目の時と一つ一つ行い、iがparentMenu.lengthの
数を超えることはないので、clickイベントは一生行われる

③e.preventDefault();
aタグがページしないようにこの記述をする

④this.nextElementSibling.classList.toggle('active');
thisは、このイベント（click）でnextElementSibling（兄妹要素）に対して
active要素を付ける
追加したChrome拡張機能のコードを見る方法

インストールした拡張機能は下記に入っているので、
{Users}を自分のユーザー名に変更してフォルダにいくとコードが見れます。

```:フォルダの場所
C:\Users\{Users}\AppData\Local\Google\Chrome\User Data\Default\Extensions
```

すると下記画像のようにインストールしている拡張機能分フォルダが並んでいます。

<img width="700" alt="2020-05-19_16h31_19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/a3362244-2a04-78af-49c5-bf13f28e005a.png">

どのフォルダが何の拡張機能かは下記で開いてみるとわかります。

```:ウェブでの検索
https://chrome.google.com/webstore/detail/{フォルダ名}
```

もしくは目当ての拡張機能があればウェブストアで開くとURLの一部がフォルダ名になっているのでそこから確認が可能です。
<img width="803" alt="2020-05-19_16h33_40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/1707b31e-e43d-9c9e-40f3-dfa260945f54.png">
ELB

#ELB

> Elastic Load Balancing は受信したアプリケーションまたはネットワークトラフィックを、Amazon EC2 インスタンス、コンテナ、IP アドレス、複数のアベイラビリティーゾーンなど、複数のターゲットに分散させます。Elastic Load Balancing はアプリケーションへのトラフィックが時間の経過とともに変化するのに応じてロードバランサーをスケーリングします。また、大半のワークロードに合わせて自動的にスケーリングできます。

> Application Load Balancer および Network Load Balancer では、ターゲットをターゲットグループに登録し、トラフィックをターゲットグループにルーティングします。クラシックロードバランサー では、ロードバランサーにインスタンスを登録します。

##クロスゾーン負荷分散

<img width="416" alt="スクリーンショット 2020-05-19 16.13.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/61f00a07-1368-a1a2-d912-0415121048a6.png">

* Application Load Balancer では、クロスゾーン負荷分散が常に有効
* Network Load Balancer を使用する場合、クロスゾーン負荷分散はデフォルトで無効化されます。Network Load Balancer の作成後は、いつでもクロスゾーン負荷分散を有効または無効にできます。

#参考文献
* ELB
    * https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/userguide/what-is-load-balancing.html
Cloud Foundryとは（いちお復習）

#Cloud Foundryとは（いちお）
アプリケーションデリバリー変革のためのプラットフォーム
Kubernetesが既存のアプリケーションのモダナイズやLift&Shiftを目的とする中で、よりインフラに捕らわれずに12-Factorを利用したカナリーリリースを含む新規と更新サービスをロールアウト出来るプラットフォームが注目されています。いわゆるPaaSサービスはHerokuに始まり、クラウドベンダーが手がけるApp EngineやAzure app serviceなどやFaaSよりのAmazon Lambdaなどのサービス、IBMが提供するRedhat OpenShiftなどがあります。その中で今後Kubernetesと同じくオープンソースとしてデファクトになるであろうCloud Foundryとは何かを復習しつつ触って行きたいと思います。

そんなCloud Foundryの初リリースは2011年。高速で簡単なビルド、テスト、デプロイ、アプリのスケール、マルチ言語対応のオープンなクラウドネイティブプラットフォームとして生まれました。以下の様なことをやってくれます。

**Cloud Foundryの主なメリット:**
- アプリケーションのポータビリティー
- アプリケーションの自動スケーリング
- 集約されたプラットフォーム管理
- 一元化されたログ機能
- ダイナミックルーティング
- アプリケーションのヘルス管理
- Elasticsearch、Logstashなどの外部ログツールとの統合
- デプロイされたアプリケーションへの役割ベースのアクセス（RBAC）
- 垂直および水平スケーリングのプロビジョニング
- インフラストラクチャーのセキュリティ
- 様々なIaaSプロバイダーのサポート

Codeから先のアプリケーション、コンテナ化、コンテナのデプロイは自動でいい感じにやってくれます。つまりインフラは意識しない仕組み。後述しますがこれは一度使うと感動します。最大のメリットはアプリ開発サイクルの短縮。数ヶ月から数日と劇的な短縮が可能です。CNCFが公表しているデータだと平均的なプロジェクトで２ヶ月半の短縮と一千万円ほどの節約が出来るそうです(*1)。日本でも確認出来る公開事例だけでも上場企業がWebアプリ系を中心に利用が始めています。

**興味のない方はスルーで構いませんが以下の様なコンポーネントが入っています**
- Gorouter - アプリケーションとシステムのルーティング
- Cloud Controller - アプリケーションのステージング
- User Account and Authentication Server - 認証管理
- Helm Charts  - デプロイ自動化
- Diego - アプリケーションの実行とランタイム
- Eirini - スケジューラー
- Garden - コンテナバックエンド
- Loggregator - ログとメトリックの集約
各種のBuildpacksやService brokersにも対応しています（つまりパブクラ固有のサービスと連携出来たりします）

そんなCFですが、オープンソースなので色々なベンダーがソリューションを提供しています。例えばPlatinumメンバーの顔ぶれは、DellEMC、Google、IBM、SAP、SUSE、VMwareです(*2)。

Happy coding!

*1) [CFF-User-Survey](https://www.cloudfoundry.org/wp-content/uploads/CFF-User-Survey-April-2018.pdf)
*2) [Cloud Foundry members] (https://www.cloudfoundry.org/members/)
「ビッグデータ活用」～ビッグデータって何？と思っているあなたに～

最近、ビッグデータという言葉をよく耳にしますよね？でも実際にビッグデータが何か、なぜビッグデータ活用がここまで広まっているのかを、ちゃんと理解している人は少ないのではないかと思います。
そこで今回は、新入社員のタマと先輩社員のポチがビッグデータについて、わかりやすく紹介します！

## あらすじ
新入社員としてデータサイエンティスト集団、D社のDSチームに配属になったタマ。
期待を胸に社会人として新たな一歩を踏み出した。しかし、DSチームが何をしているのかよくわからないタマは、先輩に色々教えてもらうことにした。
<img width="906" alt="図1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639759/feed972c-2da3-9932-94c5-01324d84e720.png">
<img width="905" alt="図2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639759/1c06538b-3d55-16be-b160-a01df4827fdc.png">
<img width="930" alt="図3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639759/6cfbc589-27f9-58af-b346-fcc2d944aa96.png">
<img width="929" alt="図4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639759/830a0d60-906a-e0c2-9e5f-a5135f45116d.png">
<img width="946" alt="図5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639759/147c6248-b75e-0853-f0c2-4c5d53fc7233.png">
<img width="902" alt="図6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639759/468576eb-46ad-b506-97ed-7f2c70e8f446.png">
<img width="928" alt="図7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639759/947599e2-c0e5-197d-1adb-048088ae36d6.png">
<img width="907" alt="図8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639759/bb257e18-30ca-9497-ea9b-93a2421459ee.png">
<img width="891" alt="図9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639759/49cd9dfd-27ce-8072-2f84-46c9b032d991.png">
<img width="905" alt="図10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639759/4ac61f97-3502-705c-dbb5-87379474f820.png">
<img width="917" alt="図11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639759/40efcbf0-a3d9-f216-4b39-37cb895ba1b2.png">
<img width="905" alt="図12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639759/85dc6aff-3a39-55f0-53f0-9f95b82e8f8e.png">
## まとめ
なにかと話題のビッグデータ。ビッグデータを日々の業務に活用することによって、コストの削減や売り上げの最大化などに大きく貢献する可能性を秘めています。また、お客様にとっても、より豊かに、より快適に日常生活を過ごすことができるようになる可能性もあります。
そのため、皆さんの周りで眠っているビッグデータの活用を検討してみてはいかかでしょうか？
CloudFormation

#CloudFormation
> AWS CloudFormation は Amazon Web Services リソースのモデル化およびセットアップに役立つサービスです

一読
CloudFormationの全てを味わいつくせ！「AWSの全てをコードで管理する方法〜その理想と現実〜」 #cmdevio
https://dev.classmethod.jp/articles/aws-all-iac/

##AWS CloudFormation のベストプラクティス
###計画と編成
* ライフサイクルと所有権によるスタックの整理

* クロススタック参照を使用して共有リソースをエクスポートします

* IAM を使用したアクセス制御

* テンプレートを再利用して複数の環境にスタックを複製する

* すべてのリソースタイプのクォータを確認する

* ネストされたスタックを使用して共通テンプレートパターンを再利用する

###Create
* テンプレートに認証情報を埋め込まない

* AWS 固有のパラメータータイプの使用

* パラメーターの制約の使用

* AWS::CloudFormation::Init を使用して Amazon EC2 インスタンスにソフトウェアアプリケーションをデプロイする

* 最新のヘルパースクリプトを使用する

* テンプレートを使用する前に検証する

###スタックの管理
* AWS CloudFormation ですべてのスタックリソースを管理する

* スタックを更新する前に変更セットを作成する

* スタックポリシーを使用する

* AWS CloudTrail を使用して AWS CloudFormation 呼び出しを記録する

* コードの確認とリビジョン管理を使用してテンプレートを管理する

* Amazon EC2 Linux インスタンスを定期的に更新する

## 既存リソースの CloudFormation 管理への取り込み
> AWS CloudFormation 管理外の AWS リソースを作成した場合は、resource import を使用してこの既存のリソースを AWS CloudFormation 管理に取り込むことができます。リソースは、削除してスタックの一部として再作成しなくても、作成された場所に関係なく AWS CloudFormation を使用して管理できます。

##AWS CloudFormation StackSets の操作
> AWS CloudFormation StackSets は、複数のアカウントおよびリージョンのスタックを 1 度のオペレーションで、作成、更新、削除できるようにすることで、スタックの機能を拡張します。管理者アカウントを使用して、AWS CloudFormation テンプレートを定義および管理し、指定のリージョンの選択されたターゲットアカウントにスタックをプロビジョニングする基盤としてテンプレートを使用します。

#参考文献
* CloudFormation
    * https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html
Kotlin Hello World!

https://play.kotlinlang.org/byExample/01_introduction/01_Hello%20world
を機械翻訳し、読みにくい個所を修正してみました。

# Hello World

```run-kotlin
package org.kotlinlang.play         // 1

fun main() {                        // 2
    println("Hello, World!")        // 3
}
```

1. Kotlin code is usually defined in packages. Package specification is optional: If you don't specify a package in a source file, its content goes to the default package.
Kotlinコードは通常、幾つかのパッケージを定義します。パッケージの指定はオプションで、指定をしなくてもいいです。ソースファイルでパッケージを指定しない場合、そのコンテンツはデフォルトのパッケージになります。

2. An entry point to a Kotlin application is the `main` function. In Kotlin 1.3, you can declare `main` without any parameters. The return type is not specified, which means that the function returns nothing.
   Kotlinアプリケーションへのエントリポイントはmain関数です。Kotlin 1.3では、mainパラメーターなしで宣言できます。戻り値の型は指定されていません。つまり、関数は何も返しません。

3. `println` writes a line to the standard output. It is imported implicitly. Also note that semicolons are optional.
   printlnは、標準出力に一行分を出力します。暗黙的にインポートされます(訳者注：何を暗黙的にインポートするんだろう？？println文は、import文を書かなくてよいということか？？　追記：コメント欄に@sdkeiのコメントがあります。参照してください）。また、セミコロンはオプションで、記述しなくてもいいです。

In Kotlin versions earlier than 1.3, the `main` function must have a parameter of type `Array<String>`.
   1.3より前のバージョンのKotlinでは、下の例のようにmain関数にArray<String>型のパラメーターが必要です。
    
```run-kotlin
fun main(args: Array<String>) {
    println("Hello, World!")
}
```
AtCoderでRuby学習6【Contest168 Therefore】

## はじめに
Ruby学習の一環として「競技プログラミング（競プロ）」に挑戦します。
そのための学習の中で学んだことをアウトプットしていきます。
今回は「AtCoder Beginners Contest168」の一問目（Therefore）より。
https://atcoder.jp/contests/abc168/tasks/abc168_a

自分が使った解法と、公式から公開された解説をもとにまとめていきます。


## 問題
日本語で鉛筆を数える時には数の後ろに助数詞として「本」がつきます。
この助数詞はどんな数につくかで読み方が異なります。
999以下の整数について、「N本」と言う時の「本」の読み方は、

・Nの1の位が「2,4,5,7,9」の時は'hon'
・Nの1の位が「0,1,6,8」の時は'pon'
・Nの1の位が「3」の時は'bon'

Nが与えられるので、対応する「本」の読み方を出力しなさい。

制約
Nは999以下の正の整数

入力は以下の形で与えられる。

```ruby
N

# 例
16
```
上記の例だと最大2回割ることができるので

```ruby
出力例
# 上記例の場合
=> pon
```

## 解答①
まずは僕が最初に書いたコードです。

```ruby
a = gets.to_i.modulo(10)
if [2,4,5,7,9].include?(a)
  print "hon"
elsif [0,1,6,8].include?(a)
  print "pon"
else
  print "bon"
end
```
moduloメソッドを使って、入力から一の位のみを受け取り、
if文とinclude?メソッドで判定を行っていきます。
include？メソッドについては、以下の記事について一度書いたので、
[AtCoder Beginners SelectionでRuby学習【Some Sums】使えるメソッドを増やす](https://qiita.com/jag_507/items/cd3ad74d77ad933897b7#include%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89range%E3%82%AF%E3%83%A9%E3%82%B9)
ここでは、moduloメソッドについて触れておきます。

### moduloメソッド
指定した数で割った余りを返します。
解答では、整数を10で割ることで一の位を余りとして取り出しています。

```ruby
#例
13.modulo(4)
=> 1
42.modulo(10)
=> 2
```

## 解答② case文
コンテスト後に配布された解説では、
case文による、より直感的に記述できる方法が紹介されています。

以下ではcase文で解答した後に、case文の紹介をしていきます。


```ruby
n = gets.to_i.modulo(10)
case n
when 2,4,5,7,9
  print 'hon'
when 0,1,6,8
  print 'pon'
else
  print 'bon'
end
```
最初の解答では、条件を配列に入れてinclude?メソッドで判定をしていましたが、
case文を使うことで、「一の位がもし2,4,5,7,9だったら…」と考えたままのコードが書けています。
確かにこっちの方が良さそうです。

### case文
一つの値に対して複数の候補の中から一致するものを探す時に便利です。
whenで指定するものに一致するかどうかを「===」演算子によって判定します。

```ruby
case object
when value1
  # object === value1の時に実行する文
when value2
  # object === value2の時に実行する文
else
  # 全てに合致しなかった場合に実行する文
end
```
ここで出てきた「===」演算子は、
上記で言うobjectが文字列や数値の場合は、「==」として、
正規表現の場合は「=~」として、
範囲の場合はinclude?のようにその中にvalueを含むかと、言う形で判定してくれるようです。
柔軟で、使い勝手が良さそうです。


## 最後に
以上、「AtCoder Beginners Contest168」の一問目（Therefore）から学んだメソッドをご紹介しました。

もし間違いなどございましたら、ご指摘いただけると嬉しいです。
Spring BootだけでDockerイメージを作る

Spring Boot 2.3でCloud Native Buildpacksを利用したDockerイメージが作れるようになったので試してみたメモ。

Spring Initializrで作ったプロジェクトでmaven実行するだけでコンテナイメージが出来上がります。

```
% mvn spring-boot:build-image
```

出来上がったイメージのサイズは232MB。jibでビルドしたDockerイメージより少し大きいです。

```
% docker images
REPOSITORY                         TAG                     IMAGE ID            CREATED             SIZE
gcr.io/paketo-buildpacks/run       base-cnb                610caf01e85e        10 hours ago        71.1MB
container-build-test               0.0.1-SNAPSHOT          1a0093139bb6        40 years ago        232MB
gcr.io/paketo-buildpacks/builder   base-platform-api-0.3   eccc81d2c404        40 years ago        894MB
jib-build-image                    latest                  91c1ccc9da04        50 years ago        221MB
```

gcr.io/paketo-buildpacksのイメージはビルドで使うイメージ。サイズが大きいので初回はダウンロードに少し時間がかかります。
ビルドは[Paketo](https://paketo.io)を利用してます。
JREはBellSoft Libericaを使っているようです。

https://github.com/paketo-buildpacks/bellsoft-liberica/
Buildpackはあまりよく知らないから、あとでもう少し調べてみようと思います。
JavaScript文法総復習

#目的
HackerRankをやりながら忘れそうな文法を記載していきます。

##配列の合計値の計算
配列の中身を一つ一つ処理して合計を計算する。
####昔風

```sample.js
const array=[1,2,3,4,5];
let sum=0;

for(let i; i<array.length: i++){
 sum+=array[i];
}

```

####ちょっと今風

```sample.js
array.forEach((num) => {sum+=num})
````

####そのほか

```sample.js
let sum = array.reduce((a, c) => {return a + c})
```

##文字列の繰り返し
ES6ではrpeat()が使える

```sample.js
string='A'.repeat(3);
console.log(string);
// AAA
```

##文字列の分割
```sample.js
str="ABCDE";
str.slice(1,3);
//BC
```

##string to int, int to string
```sample.js
parseInt(string);
String(int);
```

##JavaScriptにリストは無い
配列をリストのように扱うことができる

```sample.js
array.push()
```

## forEachとmapとfilterの違い
[https://qiita.com/Uuparu/items/e9867cb6c48736700a4f](https://qiita.com/Uuparu/items/e9867cb6c48736700a4f)

## とてつもなくでかい数字の比較
```
BigInt(a)>BigInt(b)
```
Gitの容量を削減して地球(コンピュータ)に優しい世界を作ろう！

**この作業は慎重に行ってください。一切の責任を負いかねます。**

# `.git/objects`のサイズを測ろう
`du -sh .git/objects`で`.git/objects`のサイズが測れます。
削減前に測ってみましょう。

# Garbage Collection --optional
[git gc --auto](https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%82%AB%E3%83%90%E3%83%AA)

# 使われないデータを選定
`git reflog expire --expire=now --all`で使わないものを選定

#　Clean!
`git gc --aggressive --prune=now`で綺麗にしましょう
再度`du -sh .git/objects`でサイズを測ってみよう！
Amazon SNS とは

#SNS


> Amazon Simple Notification Service (Amazon SNS) は、サブスクライブしているエンドポイントまたはクライアントへのメッセージの配信または送信を、調整および管理するウェブサービスです。Amazon SNS には、発行者と受信者という 2 種類のクライアントが存在し、それぞれプロデューサーとコンシューマーとも呼ばれます。——発行者は、論理アクセスポイントおよび通信チャネルであるトピックにメッセージを作成して送信することで、受信者と非同期的に通信します。トピックにサブスクライブされているサブスクライバー (ウェブサーバー、E メールアドレス、Amazon SQS キュー、AWS Lambda 関数) は、サポートされているプロトコル (Amazon SQS、HTTP/S、E メール、SMS、Lambda) の 1 つを使用して、メッセージや通知を消費または受信します。

<img width="572" alt="スクリーンショット 2020-05-19 15.35.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/8978e38e-e404-6d05-000c-ba3c2219b47b.png">


## 一般的な Amazon SNS シナリオ
* ファンアウト
* アプリケーションおよびシステムアラート
* プッシュ E メールとテキストメッセージ
* モバイルプッシュ通知
* メッセージの耐久性


### ファンアウト

> 並列非同期処理

> レプリケート

<img width="405" alt="スクリーンショット 2020-05-19 15.37.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/89b4326d-b00e-177a-f8ea-c8017f94c282.png">

## デッドレターキューのモニタリングとログ記録方法
> デッドレターキューのアクティビティを通知するには、CloudWatch メトリクスとアラームを使用できます。たとえば、デッドレターキューが常に空であると予想される場合、NumberOfMessagesSent メトリクスの CloudWatch アラームを作成できます。アラームのしきい値を 0 に設定し、アラームがオフになったときに通知する Amazon SNS トピックを指定できます。この Amazon SNS トピックは、任意のエンドポイントタイプ (E メールアドレス、電話番号、モバイルポケットベルアプリなど) にアラーム通知を配信できます。

##Amazon SNS セキュリティのベストプラクティス
* トピックがパブリックアクセス可能でないようにする
* 最小特権アクセスの実装
* Amazon SNS アクセスを必要とするアプリケーションと AWS のサービスには IAM ロールを使用する。
* サーバー側の暗号化を実装する
* 転送時のデータの暗号化を強制する
* VPC エンドポイントを使用して Amazon SNS にアクセスすることを検討する

#参考文献
* Amazon SNS とは
    * https://docs.aws.amazon.com/ja_jp/sns/latest/dg/welcome.html
[Access 2007] マクロを実行すると、"アクションに失敗したエラー番号: 2950" エラーが発生

#Access 2007:マクロを実行すると、"アクションに失敗したエラー番号: 2950" エラーが発生

Access2007 で、Microsoft Visual Basic for Applications (VBA) 関数を呼び出すマクロを Microsoft Office Access 2007 データベースで実行すると、エラーが出て実行できなくなる場合があるようです。

マイクロソフトのページに以下の記載が見つけました。

###マイクロソフトのドキュメント
>[Microsoft Docs] Access 2007 データベースで VBA 関数を呼び出すマクロを実行すると、"アクションに失敗したエラー番号: 2950" エラーが発生する
> https://docs.microsoft.com/ja-jp/office/troubleshoot/access/error-running-macro
Skype通知がこない（Slack等も）

macでいずれかのタイミングでskypeの通知が来なくなった。
右上の通知一覧で見ても来ている気配がない。

スカイプの通知設定をなんどもやりなおしたり再起動してもいっこうに通知がこない。

ふと、macの通知設定があったなと確認してみると、思ったとおりオフ設定。一見落着。

一応、せっかくなので変更方法を記載します。

システム環境設定　＞　通知

該当のアプリを選択　通知を許可する

[![Screenshot from Gyazo](https://gyazo.com/b37622354d0e43db08d58312455d5ec5/raw)](https://gyazo.com/b37622354d0e43db08d58312455d5ec5)
【Rails】gem devise インストール時の流れ

## はじめに
Qiita初投稿です。
拙い文章で恐縮ですが、ご一読いただけますと幸いです。
よろしくお願いします。

## ユーザー管理機能のための**gem devise**をインストール
### 1. Gemfileの最終行に以下のように追記
```:Gemfile
# 省略
gem 'devise'  # 最終行に追記してください
```

### 2. ターミナルで `bundle install` を実行
```:ターミナル
$ bundle install
```

### 3. Gemfile.lockで `devise` がインストールされたか確認
```:Gemfile.lock
# 省略
devise
```

## **devise**の適用
インストールが完了したら、devise専用のコマンドを利用して設定ファイルを作成

### 4. ターミナルで `rails g devise:install` を実行
```:ターミナル
# deviseの設定ファイルを作成
$ rails g devise:install
```
**新規作成されるファイル**

- 
config/initializers/devise.rb
- 
config/locales/devise.en.yml

### 5. ターミナルで `rails g devise user` を実行
```:ターミナル
# deviseコマンドでモデルを作成
$ rails g devise user
```
**新規作成されるファイル**

- 
app/models/user.rb
- 
db/migrate/20XXXXXXXXXXXX_devise_create_users.rb
- 
test/fixtures/users.yml
- 
test/models/user_test.rb

また、config/routes.rbに`devise_for :users`の記述が自動的に追記されます。

```ruby:config/routes.rb
Rails.application.routes.draw do
  devise_for :users
# 省略
```

### 6. ターミナルで `rails db:migrate` を実行
```:ターミナル
# 作成されたマイグレーションファイルを実行
$ rails db:migrate
```

### 7. ターミナルで `rails g devise:views` を実行
```:ターミナル
# devise用のビューを作成
$ rails g devise:views
```
**新規作成されるファイル**

- 
app/views/devise/shared
- 
app/views/devise/shared/_error_messages.html.erb
- 
app/views/devise/shared/_links.html.erb
- 
app/views/devise/confirmations
- 
app/views/devise/confirmations/new.html.erb
- 
app/views/devise/passwords
- 
app/views/devise/passwords/edit.html.erb
- 
app/views/devise/passwords/new.html.erb
- 
app/views/devise/registrations
- 
app/views/devise/registrations/edit.html.erb
- 
app/views/devise/registrations/new.html.erb
- 
app/views/devise/sessions
- 
app/views/devise/sessions/new.html.erb
- 
app/views/devise/unlocks
- 
app/views/devise/unlocks/new.html.erb
- 
app/views/devise/mailer
- 
app/views/devise/mailer/confirmation_instructions.html.erb
- 
app/views/devise/mailer/email_changed.html.erb
- 
app/views/devise/mailer/password_change.html.erb
- 
app/views/devise/mailer/reset_password_instructions.html.erb
- 
app/views/devise/mailer/unlock_instructions.html.erb

以上、`gem devise` のインストール時の流れを説明させて頂きました。
少しでも多くの方の参考になれば幸いです。
AutoScaling

#AutoScaling
> Amazon EC2 Auto Scaling によって、アプリケーションの負荷を処理するために適切な数の Amazon EC2 インスタンスを利用できるように準備することができます。Auto Scaling グループと呼ばれる EC2 インスタンスの集合を作成します。各 Auto Scaling グループ内のインスタンスの最小数を指定することができ、Amazon EC2 Auto Scaling のグループはこのサイズよりも小さくなることはありません。各 Auto Scaling グループ内のインスタンスの最大数を指定することができ、Amazon EC2 Auto Scaling のグループはこのサイズよりも大きくなることはありません。グループの作成時、またはそれ以降の任意の時点で、希望する容量を指定した場合、Amazon EC2 Auto Scaling によって、グループのインスタンス数はこの数に設定されます。スケーリングポリシーを指定する場合、Amazon EC2 Auto Scaling でアプリケーションに対する需要の増減に応じて、インスタンスを起動または終了できます。

## Amazon EC2 Auto Scaling の動的なスケーリング
###スケーリングポリシータイプ
* Target tracking scaling
* Step scaling
* Simple scaling


> Auto Scaling グループ内のインスタンス数に比例して使用率メトリクスに基づいてスケールする場合は、ターゲット追跡スケーリングポリシーを使用することをお勧め

###複数のスケーリングポリシー

> Amazon EC2 Auto Scaling はスケールアウトとスケールインの両方に最大の容量を提供するポリシーを選択します。


### Amazon SQS に基づくスケーリング

<img width="558" alt="スクリーンショット 2020-05-19 13.54.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/8ae65f17-816c-85d3-f130-1f20d1644707.png">

> インスタンスあたりのバックログのメトリクスを使用して、ターゲット値を維持するインスタンスあたりの適正バックログにすることです。これらの数は以下のように計算できます。

* インスタンスあたりのバックログ
    * インスタンスあたりのバックログを決定するには、まず Amazon SQS メトリックス ApproximateNumberOfMessages を使用して SQS キューの長さ (このキューから取得できるメッセージ数) を決定します。
* インスタンスあたりの適正バックログ
    * ターゲット値を決定するには、まずレイテンシーの点でアプリケーションが受け付けることができる数を計算します。次に、適切なレイテンシー値を取ってそれを EC2 インスタンスがメッセージを処理する平均所要時間で割ります。

###Auto Scaling インスタンスおよびグループのモニタリング
* ヘルスチェック
* Amazon Simple Notification Service 通知
* CloudWatch イベント
* CloudWatch アラーム
* CloudWatch ダッシュボード
* CloudTrail ログ
* CloudWatch Logs
* AWS Personal Health Dashboard

#参考文献
* Amazon EC2 Auto Scaling とは
    * https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html