OmniAICreator/Qiita-1.07M huggingface dataset:
AWS 認定 - 試験対策 「ソリューションアーキテクト - アソシエイト」（4

# コスト最適化アーキテクチャを設計する
[AWS Innovate オンラインカンファレンス](https://aws.amazon.com/jp/blogs/news/aws-innovate-japan-201904-registration/)
* AWS 認定 - 試験対策 「ソリューションアーキテクト - アソシエイト」
* [セッション１：回復性の高いアーキテクチャを設計する](https://qiita.com/yodyman/items/73a0f91b79675f5e80ff)
* [セッション 2：パフォーマンスに優れたアーキテクチャを定義する](https://qiita.com/yodyman/items/8071258b1fe972477674)
* [セッション 3：セキュアなアプリケーションおよびアーキテクチャを規定する](https://qiita.com/yodyman/items/3398f00a57de87347ae8)
* [セッション 4：コスト最適化アーキテクチャを設計する](https://qiita.com/yodyman/items/298ae52c4f84624ef774)
* [セッション 5：運用上の優秀性(オペレーショナルエクセレンス)を備えたアーキテクチャを定義する + クロージング](https://qiita.com/yodyman/items/53dd34d1e4ca99aeed34)

## コストを最適化したストレージの設計方法を決定する

### AWSの料金体系の概要

* 従量課金制が基本となります
* 従量課金制は、最低料金や長期契約の必要がありません。料金は、使用した分にのみ発生します。
* リザーブド課金は、一部のサービスで予約による値引きを受けることができる。
* 使用量に基づく単位あたりの料金が値引きされる。

### 料金設定の基本的な要素

コストに影響する主な要素は、「データ転送」「コンピューティング」「ストレージ」の3要素

#### データ転送
*  リージョンから外に出る送信に関して料金がかかる
* リージョンの外からの受信および同一リージョン内の送受信について料金がかからない
 
#### コンピューティング
* EC2の料金
    * サーバの実行時間により課金される
    * Amazon Linux, Ubuntu は、秒単位の課金（最小60秒）、それ以外のOSは、1時間単位の課金
    * 選択するインスタンスタイプにより料金が変わる
    * オンデマンド・リザーブド・スポットインスタンスにより料金が変わる
    * インスタンス数
    * ロードバランシング、ELBの料金がかかる
    * 詳細モニタリング、1分単位でメトリクスが収集されるようになるが追加料金が必要
    * Auto Scaling機能そのものは、料金がかからない。
    * Elastic IPアドレスは、利用されずに確保された状態のままだけだと課金される。EC2にアタッチしていれば料金がかからない（アタッチしたEC2が停止していれば、料金がかかる）
    * Elastic IPアドレスは、ひとつのEC2にEIPが二つアタッチされている場合は、ひとつのEIPに料金がかかる
    * オペレーティングシステムとソフトウェアパッケージ、利用するOSの料金が決まっている
    * 小さなインスタンスを長時間実行するよりも大きいインスタンスでバッチジョブを素早く完了させるほうが安価なケースもある

#### ストレージ

* Amazon Simple Storage Service 料金
  * ストレージクラス
      * アクセス頻度により最適なクラスを選択する
  * ストレージサイズ
  * リクエスト
  * データ転送量
* Amazon EBS
  * ボリュームサイズ
  * ボリュームタイプ
  * 1秒あたりの入力/出力オペレーション回数
  * スナップショット
  * データ転送
  * IOPS/スループット/コスト

## コストを最適化したコンピューティングの設計方法を決定する

### コスト最適化可能な代表的なサーバレスアーキテクチャ
  * 運用するサーバが無いサービス
  * AWS Lambda
  * Amazon S3
      * 静的なコンテンツの配布
  * Amazon DynamoDB
  * Amazon API Gateway
  
### Amazon CloudFrontの活用
  * CDNサービスを実現することができる
  * コンテンツがユーザーにより近い地点にキャッシュされる
  * S3, CloudFront間のデータ転送量が無料
  * バックエンドのコスト最適化にもなる
Java String型クラスの比較（==）が使えない理由

#Stringクラスの比較
if文などで、値が等しいかという比較を使う場面があります
例えば・・・

【Q1】
入力した数が答えと当たっているかどうか調べるプログラム

```java:Q1.java
import java.util.Scanner;

class Q1 {
	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);

		System.out.print("数を入力：");
		int n = stdIn.nextInt();

			if (n == 5) {
			System.out.print("あたり");
			} else {
			System.out.print("はずれ");
			}
	}
}

```
この場合は、int型の数値の比較なので
==を使って比較できます。
では文字列の比較として、次の場合を見てみましょう。

【Q2】
なぞなそプログラム

```java:Q1.java
import java.util.Scanner;

class Q2 {
	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);

		System.out.print("豆腐の原料は？：");
		String n = stdIn.next();

			if (judge.equals("大豆")) {
			System.out.print("あたり");
			} else {
			System.out.print("はずれ");
			}
	}
}

```

比較を==ではなく、equalsを使っています。
なぜequalsなのかというと・・・

クラス型（参照型）の比較で==を使うと、内容ではなく
データが入っている「アドレス」の比較になってしまいます。
***
![Qiita用_equalsの比較1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434899/560cadfd-4b91-6d47-44a8-aed61591b8e3.png)
![Qiita用_equalsの比較2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434899/71b6ab88-ead6-b597-7ca1-675214a410ed.png)
![Qiita用_equalsの比較3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434899/52c0d381-1287-5440-3f0f-d4de8cadac91.png)
TypeScript: Koaでリダイレクトする

本稿ではTypeScriptでKoaのリダイレクトをする方法を説明する。

## Koaでのリダイレクトのしかた

ハンドラーに渡ってくる`ctx`オブジェクトに`redirect()`メソッドが生えているので、それを叩くだけ。

```ts
ctx.redirect(url)
```

## `ctx.redirect`の使用例

```ts
import Koa from "koa";
import _ from "koa-route";

const app = new Koa()
app.use(_.get('/old', async ctx => {
    ctx.redirect('/new')
}))
app.use(_.get('/new', async ctx => {
    ctx.body = 'redirected!'
}))

app.listen(4000)
```

`/old`へのHTTPリクエスト

```http
GET /old HTTP/1.1
Host: localhost:4000
```

レスポンスは302になり、`Location`ヘッダにリダイレクト先のURLがセットされているのがわかる。

```http
HTTP/1.1 302 Found
Connection: keep-alive
Content-Length: 39
Content-Type: text/html; charset=utf-8
Date: Mon, 02 Sep 2019 06:01:51 GMT
Location: /new

Redirecting to <a href="/new">/new</a>.
```

## 参考文献

* [Koa - next generation web framework for node.js](https://koajs.com/#response-redirect-url-alt-) - 公式ドキュメント
npm install -g npm って何？  npm 自体のアップデートです。-g は --global という意味です。

npm install -g What is npm? An update of npm itself. -g means --global


以上。

[npm-install | npm Documentation](https://docs.npmjs.com/cli/install)

[npm自体のバージョンを上げる - Qiita](https://qiita.com/n0bisuke/items/b2704b6ebb84f21c03c1)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AWS 認定 - 試験対策 「ソリューションアーキテクト - アソシエイト」（3

# セキュアなアプリケーションおよびアーキテクチャを規定する
[AWS Innovate オンラインカンファレンス](https://aws.amazon.com/jp/blogs/news/aws-innovate-japan-201904-registration/)
* AWS 認定 - 試験対策 「ソリューションアーキテクト - アソシエイト」
* [セッション１：回復性の高いアーキテクチャを設計する](https://qiita.com/yodyman/items/73a0f91b79675f5e80ff)
* [セッション 2：パフォーマンスに優れたアーキテクチャを定義する](https://qiita.com/yodyman/items/8071258b1fe972477674)
* [セッション 3：セキュアなアプリケーションおよびアーキテクチャを規定する](https://qiita.com/yodyman/items/3398f00a57de87347ae8)
* [セッション 4：コスト最適化アーキテクチャを設計する](https://qiita.com/yodyman/items/298ae52c4f84624ef774)
* [セッション 5：運用上の優秀性(オペレーショナルエクセレンス)を備えたアーキテクチャを定義する + クロージング](https://qiita.com/yodyman/items/53dd34d1e4ca99aeed34)

## アプリケーション層の保護方法を決定する

### 責任共有モデル

* AWSの責任
  * クラウドのセキュリティに責任を持つ
  * すべてのサービスを実行するインフラストラクチャの保護に責任を負う
  * ハードウェア、ソフトウェア、ネットワーキング、施設が含まれる
* お客様の責任
  * クラウドにおけるセキュリティに責任を持つ

### AWS Identity and Access Management（AWS IAM）

* リソースへのアクセスコントロールを管理する
* 操作に対する認証と認可の仕組を提供するサービス
* ユーザー、グループ、ロール、ポリシーの４つを制御
* IAMユーザー
  * 認証情報を管理
  * ひとりに対してひとつIAMユーザーを作成する
* IAMグループ
  * ユーザーを束ねて管理
* IAMロール
  * 一時的に権限を委任する場合に用いる
* IAMポリシー
  * 認証を受けたユーザーがアクセスできるリソースの範囲、操作を定義するドキュメント
  * ユーザー、グループ、ロールに割り当てることでアクセスできる権限の範囲を指定できる
  * 必要な最小限の権限を付与する
  * 権限が足りなければ必要な権限のみを追加する
* フェデレーション
  * 自社のユーザー認証に対してSAML IDフェデレーションを利用することで IAMユーザーとの二重管理を避けることができる
* ウェブIDフェデレーション
  * Security Token Service(STS)を使用してロールを割り当てられたOpenIDプロバイダーのウェブIDを持つユーザー
* アンチパターン
  * IAMユーザーを共有する運用
* ベストプラクティス
  * https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html
* AWSアクセスキーを管理するためのベストプラクティス
  * https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-access-keys-best-practices.html
* AWS セキュリティのベストプラクティス」ホワイトペーパー
  * https://d0.awsstatic.com/whitepapers/aws-security-best-practices.pdf
* アマゾンウェブサービス: セキュリティプロセスの概要
  * https://d0.awsstatic.com/whitepapers/Security/AWS_Security_Whitepaper.pdf

## データの保護方法を決定する

### Virtual Private Cloud(VPC)
* お客様独自のプライベートな仮想ネットワークを構築できる
* AWSリソースを起動することができる
* IPv4, IPv6 を利用できる
* インターネットから直接アクセスできるパブリックなサブネットとインターネットから直接アクセスできないプライベートなサブネットの大きく二つに別けることを推奨
* パブリックサブネットは、インターネットゲートウェイが設定されるルーティングテーブルがアタッチされたサブネット
* プライベートサブネットは、インターネットゲートウェイが設定されないルーティングテーブルがアタッチされたサブネット
  * インターネットに直接アクセスできない

|サービス|概要|
|---|---|
|インターネットゲートウェイ|インターネットに接続できる|
|仮想プライベートゲートウェイ|オンプレミスとのVPN接続|
|AWS Direct Connect|オンプレミスとの専用回線接続|
|VPCピア接続|VPCとVPCを接続する|
|VPCエンドポイント|VPC内のインスタンスとS3などのVPC外にあるサービスと直接接続|
|NATゲートウェイ|プライベートサブネットからのインターネット接続|
|VPCフローログ|VPC内のトラフィックを監視|

### セキュリティグループとネットワークACL

||セキュリティグループ|ネットワークACL|
|---|---|---|
|ルール|明示的な許可のみ|明示的な許可または拒否|
|ステート|ステートフル|ステートレス|
|適用対象|ENIに適用|サブネットに適用|
|関連付け|単一のVPCに関連付け|単一のVPCに関連付け|
|サポート対象|VPCとEC2 Classic|VPCのみ|

* ENIは、仮想Nick

### データ層

* データの保護
  * 責任共有モデルにてお客様の責任範囲となる
* 転送中のデータ
  * インターネットからWebの通信は、SSL
  * VPN, Direct Connectによるオンプレミスとの通信は、 IPsec
  * オンプレミス・AWSへのImport/Export Snowballでデバイスによるデータ移動
  * AWS API は、デフォルトでHTTPS
* 保管中のデータ
  * データに対するアクセスコントロール
  * 暗号化
  * S3
    * デフォルトは、プライベートなデータ
    * サーバサイド暗号化
      * S3で暗号化する
    * クライアントサイド暗号化
      * クライアント側で暗号化してS3にアップロード
* AWS KMS(Key Management Service)
  * お客様によるソフトウェアベースのキー管理
  * マネージドサービス
* AWS CloudHSM
  * お客様専用のハードウェアアプライアンス

## 単一VPCアプリケーション向けのネットワーキングインフラストラクチャを定義する
GitHub Pages のユーザーサイトに Nuxt.js で作成したプロジェクトをデプロイする

GitHub Pages のユーザーサイトに Nuxt.js で作成したプロジェクトをデプロイしてみたので、手順を残しておきます。

デプロイする方法として、push-dir を使ってコマンドラインから手動でデプロイする方法とTravis CI などのビルドサーバーを利用して自動的にデプロイする方法がありますが、今回は前者の [push-dir](https://github.com/L33T-KR3W/push-dir) を使う方法でデプロイします。

## 環境

* macOS Mojave 10.14.6
* node v12.8.0
* npm 6.10.2
* yarn 1.17.3
* Nuxt.js v2.9.1
* push-dir 0.4.1

## リポジトリの作成

Github でユーザーサイト用のリポジトリを作成します。

* リポジトリ名は「<ユーザー名>.github.io」
* Public のリポジトリ

として作成します。

作成したらリポジトリをローカルの任意の場所にクローンします。

```
git clone git@github.com:<アカウント名>/<ユーザー名>.github.io.git
```

## ブランチの作成

Github Pages のユーザーサイトは、 URLにアクセスした時に `master` ブランチに置かれているファイルが公開されます。

Nuxt.js で静的アプリケーションを作成すると、アプリケーションは `dist` フォルダ配下に作成されます。作成したアプリケーションを `master` ブランチにデプロイするために、`master` ブランチとは別に開発用のブランチを用意して作業を行うようにします。

```bush
git checkout -b develop
```

ここでは開発用のブランチ名は `develop` としていますが、任意の名前で問題ないと思います。任意の名前とした場合は以降の `develop` を自身で付けた任意の名前に読み替えてください。

## プロジェクトの作成

`develop` ブランチを作成したら、Yarn または npx を使って Nuxt.js のプロジェクトの作成を行います。
ローカルにクローンしたリポジトリの一つ上の階層でコマンドを実行します。

```bash
# Yarn の場合
yarn create nuxt-app <クローンしたリポジトリのフォルダ名>

# npx の場合
npx create-nuxt-app <クローンしたリポジトリのフォルダ名>
```

### Yarn と npx どちらを使うか

Yarn と npx のどちらを使うかは環境に合わせて決めてください。
npx は npm のバージョンが v5.2.0 以降であればバンドルされています。

### Yarn をインストールする場合

macOS の場合は homebrew 経由で、 Windows の場合は Chocolatey 経由でインストールすることができます。

インストール方法については以下を確認してください。

* Mac  
https://yarnpkg.com/ja/docs/install#mac-stable
* Windows  
https://yarnpkg.com/ja/docs/install#windows-stable

## 実行確認

プロジェクトが作成されたら実行できるか確認しておくといいと思います。

```
# Yarn の場合
yarn dev

# npm の場合
npm run dev
```

## push-dir のインストール

プロジェクトが作成されたら push-dir をインストールします。

```bash
npm install push-dir --save-dev
```

インストールしたら `deploy` コマンドを `package.json` に追加します。

```json:package.json
"scripts": {
  "dev": "nuxt",
  "build": "nuxt build",
  "start": "nuxt start",
  "generate": "nuxt generate",
  "deploy": "push-dir --dir=dist --branch=master --cleanup"
}
```

`--branch` オプションに `master` を指定して、デプロイ先のブランチをリモートの `master` ブランチにしています。

## デプロイ前に確認

デプロイコマンドの実行前に以下の確認をしてください。

1. ローカルに `master` ブランチが存在しているか  
存在している場合は2回目以降のデプロイ時に面倒なことになるのでローカルからは削除しておきます。
2. リモートに `master` ブランチが存在しているか  
存在していない場合はコマンド実行時にエラーになる可能性があるのでブランチを作成しておきます。

## デプロイ

静的アプリケーションを作成してデプロイします。

```bash
npm run generate
npm run deploy
```

`https://<ユーザー名>.github.io` にアクセスするとデプロイされていることが確認できます。

### デプロイに失敗する場合

リモートに `master` ブランチがないと cleanup 先のブランチがないから実行できないと言われてエラーになるかもしれません。その場合は、 `master` ブランチを作成してから再度デプロイコマンドを実行してみてください。

### 2回目以降失敗する場合

ローカルに `master` ブランチがないか確認してみてください。デプロイしたときにローカルに `master` ブランチがあるとローカルとリモートのブランチの状態がずれて変になる可能性があります。その場合、デプロイコマンドを実行したときにまだローカルでコミットされた内容がプッシュされてないから cleanup できないなどと言われてエラーになると思います。その場合はローカルにある `master` ブランチを削除してから再度デプロイコマンドを実行してみてください。

## 作ったもの

*リポジトリ*
https://github.com/fumikoyama/fumikoyama.github.io

*作成したユーザーサイト*
https://fumikoyama.github.io/

## 参考

*GitHub Pages へデプロイ - Nuxt.js*
https://ja.nuxtjs.org/faq/github-pages/
gorilla/muxでルートパスに静的ファイルを公開する方法

Goの[gorilla/mux](https://github.com/gorilla/mux)にて、ルートパスで静的ファイルを公開する方法です。

# ルートパス以外で静的ファイルを公開する場合

まずは、ルートパス以外で公開する方法です。今回は `web` フォルダにHTML/CSS/JavaScriptなどの静的ファイルを配備しているとします。

お手軽な方法は以下のように `http.FileServer` を用いる方法です。

```go
r := mux.NewRouter()

// publish static file 
r.Handle("/web/", http.StripPrefix("/web/", http.FileServer(http.Dir("web/"))))
// or
r.PathPrefix("/web/").Handler(http.StripPrefix("/web/", http.FileServer(http.Dir("web/"))))

log.Fatal(http.ListenAndServe(":8000", r))
```

簡単ですね。

# ルートパスで静的ファイルを公開する場合

`/web/` 部分を `/` にしても上手く認識されないため、NotFoundHandlerに記載します。

```go
r := mux.NewRouter()

r.NotFoundHandler = http.StripPrefix("/", http.FileServer(http.Dir("web/")))

log.Fatal(http.ListenAndServe(":8000", r))
```

これで、その他のルーティングが存在しない場合のみ、静的ファイルを提供できます。

# 参考
https://github.com/julienschmidt/httprouter/issues/7#issuecomment-430809282
RubyでNet::SFTPを使うときはputsではなく、upload!を使おう

## 環境

* Ruby 2.6.3
* Rails 5.2.3
* net-sftp 2.1.2

## 前提

net-sftpとは、RubyでSSHプロトコルを使用し、暗号化を行なってファイルの送受信を行うことが出来るライブラリです。

ユースケースとしては外部システムと連携するときなどにアプリケーションのデータをファイル化して、外部サーバーに配置したりするとかだと思います。
[https://github.com/net-ssh/net-sftp](https://github.com/net-ssh/net-sftp)


`Gemfile`に以下を記述して、 `bundle install` すれば使えるようになります。

```yaml
gem 'net-sftp'
```

> 具体的な `net-sftp` の使用方法は検索をすると結構出てくるので、割愛させていただきます。

## 起きた問題

putsを使って外部サーバーへファイルを保存する際大容量の書き込みがいつまで経っても終わらない問題に遭遇した。
以下が該当のコード

```ruby
csv_str = 'hogehogeho,hogehoge,hogehoge' # csvフォーマットにした文字列が入っている
path = '/var/www' # 出力先のファイルパス
filename = 'hoge.csv' # 出力したいファイル名
Net::SFTP.start('host', 'user', :password => 'password') do |sftp|
  sftp.file.open("#{path}/#{filename}", 'w') do |f|
    f.puts csv_str
  end
end
```

ログを見た所、ロジックとしてはエラーとならずに `f.puts csv_str` で処理が止まって動かなくなっていた。

## 対応方法

ファイルを直接サーバーに書き込むのはやめ、一度 `tmp`ディレクトリなどにファイルを配置してから、 `upload!`メソッドを使ってファイルのアップロードをすることで解決した。

> 具体的にどのくらいの容量から `puts` が動作しなくなるのかの計測が出来なかったので、基本的にはファイルのアップロードは `puts` ではなく、 `upload!`メソッドを使用するのがいいと思う

以下が具体的なコード

```ruby
csv_str = 'hogehogeho,hogehoge,hogehoge' # csvフォーマットにした文字列が入っている
path = '/var/www' # 出力先のファイルパス
filename = 'hoge.csv' # 出力したいファイル名

tmp_dir = "#{Rails.root.to_s}/tmp"

# 一度tmpディレクトリへputsでファイルを生成する
File.open("#{tmp_dir}/#{filename}", "w") do |file|
  file.puts csv_str
end

# tmpディレクトリに作成したファイルをuploadする
Net::SFTP.start('host', 'user', :password => 'password') do |sftp|
  sftp.upload!("#{tmp_dir}/#{filename}", "#{path}/#{filename}")
end
```

net-sftpを使用する際は上記を気をつけて実装してみてください。
主なプログラミングパラダイム

自分のための備忘録的なものとしてQiitaを書いていますが、これが誰かの助けになれば幸いです。
また、プログラミング初心者であるため、内容に誤りがあるかもしれないので、誤りがあれば指摘してください。

# プログラミングパラダイム

プログラミングパラダイムとは、プログラムの見方を与えるものであって、言語ごとに対応できるパラダイムの種類や数が異なります。
まずは対照的なものとして、命令型と宣言型があります。
それらとは別のベクトルとして、オブジェクト指向があります。
プログラミングパラダイムはもっとありますが、今回はこれらについて書きます。

## オブジェクト指向

オブジェクト指向言語では、オブジェクトをデータとメソッドの組み合わせとして扱います。
以下の流れで記述していきます。

1. オブジェクトのテンプレートとしてクラスを定義。
2. クラスからオブジェクトをインスタンスとして生成。
3. オブジェクトを捜査して処理を実行する。

主な言語では、PHPやPython、C++、Java、Rubyがあります。

## 命令型

手続き型と同義で扱われることが多いです。
これは、命令や命令を連結した手続きを組み合わせて記述していくものです。
PHPやPython、C++、Java、Rubyなど、有名な言語はほとんど命令型です。
ある計算結果を利用して次の計算をするなど、状態遷移のある処理をするのに向いています。
しかし、命令の組み合わせで状態が変更されることにより、入力に対して予期せぬ結果が出力してしまう、”プログラミングの副作用”が起きることがあります。

## 宣言型

問題の性質や意味、制約を記述します。
処理手順はプログラミング言語の処理系に任せます。
身近な言語にはSQLがあります。

### 関数型

引数に対して特定の値を返すものです。
入力に対して出力が安定しているので、副作用は起きにくいです。
おもな言語は、Haskell、Lisp、Scalaがあります。
拡張性が高いことがメリットとして挙げられます。

### 論理型

プログラムは論理式の組み合わせによって記述されます。
主な言語はPrologであり、自然言語処理に優れています。
事実と規則を記述し、最後に質問を与えることで処理系が推論して回答を出します。
解放のプロセスを定義することが難しい問題に適しています。
アルゴリズムとデータ構造について（超初心者向け）

自分のための備忘録的なものとしてQiitaを書いていますが、これが誰かの助けになれば幸いです。
また、プログラミング初心者であるため、内容に誤りがあるかもしれないので、誤りがあれば指摘してください。


# アルゴリズムとデータ構造

## アルゴリズム

アルゴリズムとは処理の手順のことであり、問題解決の手段とも言えます。

### アルゴリズムの三大処理

全てのアルゴリズムはこの3つの処理の組み合わせから構成されています。

* 順序処理
* 分岐処理
* 繰り返し処理

### アルゴリズムの正当性と停止性

正当性と停止性はアルゴリズムがクリアしなくてはならない条件です。
正当性とは、アルゴリズムが与えられた課題に対して正しい結果をもたら差なければならないということです。
停止性とは、すべてのアルゴリズムは最終的に停止しなくてはならないということです。
処理が終わらないものは無限ループといわれて、アルゴリズムとは言えません。

## データ構造

多くのデータを効率よく管理する仕組みのことです。
データをカテゴリごとに分類したり、系統立てたりします。

### データ型

データ型とは、コンピュータで扱うデータのグループ分けです。
主なデータ型として以下のものがあります。

* 整数型
* 実数型
* 文字列型
* 論理型

### データ構造

主なデータ構造として、以下のものがあります

| 　　　種類       |   データ構造 　　　　|
|:-----------------|:------------------|
|線形データ構造      |配列　　　　　　　　|
|                  | リスト             |
|    　　　　       | 連想記憶           |
|    　　          |  スタックとキュー   |
| グラフデータ構造  | ツリー構造          |
|    　　          | ヒープ構造          |

#### 配列

同じ種類のデータを複数並べただけのデータ構造です。

#### リスト

同じ種類のデータを順序付けして並べた構造です。
順序付けには連続した整数値のインデックスを使用します。
要素へアクセスするには、インデックスを指定します。
連結リストとは、リストの中でも、要素が互いにリンクによって接続されているものです。
単方向リスト、循環リスト、双方向リストの3つがあります。

#### 連想記憶

連想記憶は値をキー(Key)と結びつけて持ちます。
[Key(春)->Value(Spring),
 Key(夏)->Value(Summer),
 Key(秋)->Value(Autumn),
 Key(冬)->Value(Winter),]
リストと似ていますが、要素をインデックスではなくキー(Key)で管理します。
数字で分類はできないけど、関連付けてまとめておきたいデータに最適です。

#### スタック

スタックでは、データを入れた順序と逆順に取り出すことができます
つまり、要素の挿入と削除がリストの先頭だけで行われるようなデータ構造です。
スタックにデータを入れることをプッシュと言い。取り出すことをポップと言います。

#### キュー

キューはスタックの逆で、データを入れた順に取り出すことができます。
つまり、最初に入れたデータが最初に取り出せます。
リングバッファというのは、キューの配列の先頭と末尾を結び付け、リングのような構造にしてキューの目盛りによる使用回数制限をなくしたものです。

#### ツリー

枝先にデータを持ち、そこからまた枝分かれしていく構造。
この構造の内、根元にあたる場所をルートと呼び、枝分かれ部分をノードと呼び、枝の部分をブランチと呼びます。

#### ヒープ

ツリー構造のうち、子供のノードが最大2つで、親のデータが2つの子のデータよりも小さくなるように作られたデータのことです。
ソートアルゴリズムの、ヒープソートでよく用いられます。
gitlabのdefault branchを変更する．

## Default Branch
確認したところ、
GitLab 11.8.0 (ce138642)では以前と設定を変える場所が違っていたのでメモがわりに残しておきます。


最初は、masterブランチになっています。
merge request等を作成する際に、毎回masterからdevelopに手動で変えるのは面倒くさいのでdefault branchを変えてしまいましょう。

### 変更方法

1. サイドバー Settings > Repository
3. Default Branch の [Expand] をクリック
4. Default Branch からdefaultにしたいbranchを選択
5. Save



以上
VMware でGPUのパススルー設定

#VMwareでGPUのPassthrough setting.

1. ESXi6.5 ホストの設定
2. ESXi6.5 仮想マシンの設定

---
##ESXi6.5 ホストの設定
ホストの再起動が必要なので、始めにゲストOSを落としておくことを推奨します。

ホストの設定は[管理]-[Hardware]のタブに[Passthroughの切り替え]があるのでチェックして再起動
（画面がチカチカして押せない時は、気にせず何度も切り替えボタンを押すと有効になるよ。）
![PT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/0d884493-eff8-d094-2c4a-c09e0898f6ae.png)

---
##ESXi6.5 仮想マシンの設定

設定の編集の中にある、構成の編集で1行追加しないと仮想マシン自体が起動しないことがある。
(私の環境だとQuadro4000は追加が必要で、QuadroRTX4000は不要でした。)
**pciPassthru.use64bitMMIO="TRUE"**

![param.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/f8da1dc5-43cf-08fd-903e-03509b1eb271.png)
![passthruMMIO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/2d819508-a71b-3f4d-b174-8d1bf5bc3f09.png)


これでOK.

追記
駄目な時は、メモリの設定と起動オプションの設定も注意
メモリー設定の「すべてのゲストメモリを予約（すべてロック）」をチェック
![PTmem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/02dd01c1-d0d9-1f75-7352-8e6c404aafc1.png)

起動オプションのファームウェアはUEFIにする。
![uefi.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/977e10bd-959a-9d80-d915-ca013282c5f3.jpeg)
【Raspberry Pi】各種OSをインストールする手順

#概要
Raspberry Piに各種OSをインストールする手順メモ。
インストールできるOSのリストは[こちら](https://www.raspberrypi.org/downloads/)から確認できる。
最もセットアップが簡単なNoobsはインストール方法が少し異なるので対象外とする。

#手順
1. OSの`.img`ファイルをダウンロードする
2. microSDカードのフォーマットをする
3. microSDカードにOSのイメージを書き込む
4. Raspberry PiにmicroSDカードを挿入して電源を繋ぐ

##1. OSの`.img`ファイルをダウンロードする
Raspberry Piの公式ダウンロードサイトの[こちら](https://www.raspberrypi.org/downloads/)から、インストールしたいOSのイメージをダウンロードする。

ファイルサイズが大きいので、数分かかります。

##2. microSDカードのフォーマットをする
[こちら](https://www.sdcard.org/jp/downloads/formatter/)のサイトからSD Card Formatterをダウンロード&インストールする。

SD Card FormatterでmicroSDカードをフォーマットする。
:warning: 中身のファイルが全て初期化されるので、もし、保存しておきたいデータがあればどこかに移動しておく。

##3. microSDカードにOSのイメージを書き込む
[こちら](https://www.balena.io/etcher/)のサイトからbalenaEtcherをダウンロード&インストールする。

balenaEtcherでmicroSDカードにOSのイメージファイル(`.img`ファイル)を書き込む。


##4. Raspberry PiにmicroSDカードを挿入して電源を繋ぐ
microSDカードをRaspberry Piに挿入してから電源ケーブルを接続する。
:warning:  最後に電源ケーブルを接続する

無事に起動したらOK！

#Happy Hacking :sunglasses: !

#参考
https://www.raspberrypi.org/downloads/
https://www.raspberrypi.org/documentation/installation/installing-images/README.md
NVMeの取り外し方法

#NVMeをLinuxで取り外す前の儀式

手順概要
１、 lspciでデバイスのIDを特定
２、 egrepでIDとスロットの関連を確認
３、 オフライン実行
４、　いきなり抜きたい場合のLED確認

----


#1,lspciでデバイスのIDを特定

下記例えばスロット１の場合
\#lspci |grep PCIe
 _**10002:01**:00.0
 10002:02:00.0_
(ドライブが二個の時)

#2,egrepでIDとスロットの関連を確認
\#egrep –H ‘.\*’ /sys/bus/pci/slots/*/address
_/sys/bus/pci/slots/***0**/address:**10002:01**:00
/sys/bus/pci/slots/1/address:10002:02:00_

#3,オフライン実行
\#echo 0 > /sys/bus/pci/slots/**0**/power"


----
#4,いきなりブチ抜きたい時。(エラーログ上等)
対象ドライブのデバイス名を確認してから実行。
下記はポート0番の場合。
$sudo yum install OpenIPMI-Tools
$ledmon
$ledctl locate /dev/nvme0n1
$ledctl locate_off /dev/nvme0n1
【Docker SDK for Python】DockerイメージをPythonでプルしてみた

# 開発環境
- MacOS 10.14
- Python 3.7
- Pipenv 2018.11.26
- Docker 19.03.1
- Docker API 1.40
- Docker SDK for Python 4.0.2


# ソースコード解説
## Docker API client
Docker API clientをセットアップする方法はDockerのbase_urlを指定するか、環境変数から情報を取得する2通りあります。

### base_urlを指定する方法

```python
client = docker.DockerClient(
            base_url='unix:///var/run/docker.sock',
            version='auto',
            timeout=60,
        )
```

`version`はDocker APIのバージョンを指定します。`auto`にすると自動的に設定してくれます。
`timeout`はDocker APIのコールのタイムアウトを指定します。単位は秒です。

### 環境変数を使用する方法
予めDOCKER_HOSTの環境変数が設定されている必要があります。

```python
client = docker.from_env()
```

## Imageのプル

```python
try:
    image = client.images.pull(image_name)
except (docker.errors.APIError,
        ImageMismatchedError) as err:
    raise err
```

変数`image_name`に格納されているイメージをプルします。返り値はImageオブジェクトかlistです。
以下のコードでプルしたイメージのタグを含む名前を取得できます。

```python
for tag in image.tags:
    print(tag)
```

# Reference
- [Docker SDK for Python](https://docker-py.readthedocs.io/en/stable/)
Nuxt.js で lodash-es を使う

Nuxt.js で lodash の ES モジュール版 ([lodash-es](https://www.npmjs.com/package/lodash-es)) を使う場合、nuxt.config.js の [build.transpile](https://ja.nuxtjs.org/api/configuration-build#transpile) オプションを設定する必要がある。
( https://stackoverflow.com/questions/53081769/syntaxerror-unexpected-token-export-when-using-lodash-with-nuxt の回答より）

```javascript:nuxt.config.js
export default {
  ...
  build: {
    transpile: [
      'lodash-es'
    ],
    ...
  }
}
```

これで `.vue` ファイルなどで `import` できるようになる。

※ Vue.js で lodash-es を使った時は何事もなく使えたので、この辺り Vue と Nuxt で違いがあるようだ。
Kotlin 1.3のCoroutineのサスペンド関数の合成①（シーケンシャル処理がデフォルト）

# 検証環境
この記事の内容は、以下の環境で検証しました。

* Intellij IDEA ULTIMATE 2018.2
* Kotlin 1.3.0
* Gradle Projectで作成
* GradleファイルはKotlinで記述（KotlinでDSL）

# 準備
詳細は下記の準備を参照してください。
https://qiita.com/naoi/items/8abf2cddfc2cb3802daa

# Sequential by default
[前回](https://qiita.com/naoi/items/9907e1bbac6d517a8dd9)に引き続き、[公式サイト](http://kotlinlang.org/docs/reference/coroutines/composing-suspending-functions.html#sequential-by-default)を読み解いていきます。

タイトルが意味不明です。
読み進めたほうがいい気がします。

> Assume that we have two suspending functions defined elsewhere that do something useful like some kind of remote service call or computation. We just pretend they are useful, but actually each one just delays for a second for the purpose of this example:

訳すと

> 例えば、リモート処理や計算処理に便利なサスペンド関数が2つ定義されていたとします。
> 今回は、サンプルコードなので10秒間遅延させています。

まずは、前提の関数を確認するということですね。サンプルコードを確認してみます。

```kotlin
suspend fun doSomethingUsefulOne(): Int {
    delay(1000L) // pretend we are doing something useful here
    return 13
}

suspend fun doSomethingUsefulTwo(): Int {
    delay(1000L) // pretend we are doing something useful here, too
    return 29
}
```

説明にあったとおりのサスペンド関数が定義されています。

続けて読み進めます。

> What do we do if need to invoke them sequentially – first doSomethingUsefulOne and then doSomethingUsefulTwo and compute the sum of their results? In practice we do this if we use the results of the first function to make a decision on whether we need to invoke the second one or to decide on how to invoke it.
>
> We use a normal sequential invocation, because the code in the coroutine, just like in the regular code, is sequential by default. The following example demonstrates it by measuring the total time it takes to execute both suspending functions:

訳すと

> はじめにdoSomethingUsefulOne関数を呼び出しその後に、doSomethingUsefulTwo関数を呼び出すとしたら、私達はどうするでしょうか。
> はじめに呼び出した関数の結果を以て、その次の関数を呼び出すかどうかを判断します。
>
>コルーチン内のコードは通常のmain関数などと同じ様にシーケンシャルに処理が実行されます。
> サンプルコードではコルーチンが完了する時間を計測しています。

ここにきて、はじめて「そうだったのか」と考えてしまいますね。
確かにコルーチン内で更に非同期などはしていませんでした。
サンプルコードはそれぞれの関数で1秒遅延しているので2秒位かかるはずです。
サンプルコードと実行結果を確認してみます。

```kotlin
import kotlinx.coroutines.*
import kotlin.system.*

fun main() = runBlocking<Unit> {
    val time = measureTimeMillis {
        val one = doSomethingUsefulOne()
        val two = doSomethingUsefulTwo()
        println("The answer is ${one + two}")
    }
    println("Completed in $time ms")
}

suspend fun doSomethingUsefulOne(): Int {
    delay(1000L) // pretend we are doing something useful here
    return 13
}

suspend fun doSomethingUsefulTwo(): Int {
    delay(1000L) // pretend we are doing something useful here, too
    return 29
}
```

実行結果
```text
The answer is 42
Completed in 2012 ms
```

確かに2秒位かかってます。
measureTimeMillis関数については下記を参照してください。
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.system/measure-time-millis.html

# まとめ
このブロックで理解できたことは以下のことだと思います。

* コルーチン内はシーケンシャルに処理が進む
Ruby 配列 が 格納 された 変数 の 中身 を 順 に 出力する

# 目的

- Rubyにて配列が格納された変数の中身を一つづつ出力する方法を知る。

# 押さえるポイント

- eachメソッドを使う
- 配列からブロック変数に格納する
- そのブロック変数に格納された値を出力する

# 書き方の例

- 下記の`配列が格納された変数`には任意の配列が格納されていることとする。
- 下記にRubyの処理を記載する。

``` ruby
配列が格納された変数.each do |ブロック変数|
  ブロック変数
end
```

# より具体的な例

- 下記の変数`numbers`には1〜5までの数字が配列として格納されているものとする。
- numbersに格納された配列の値を順に出力する処理を書く
- 下記にRubyの処理を記載する。

``` ruby
# 配列変数の定義
numbers = [
1, 2, 3, 4, 5
]

# numbersに格納された配列を順にブロック変数のnumberに格納し順に出力する
numbers.each do |number|
 number
end
```
リファレンスの戻り値がいつの間にか壊れちゃう問題について

C++を書いててやらかすミスで精神的ダメージが大きいのは、スタック上の値をリファレンスとして返してしまい、参照先の値が壊れることだ。

これは極めて初歩的なミスであるゆえに痛いわけだが、込み入ったケースではついやらかしてしまう場合がある。というか、俺はやってしまった。込み入ったケースというのは、スタック上の値を別の関数に渡し、その関数が受け取った値から一部を抜き出しリファレンスとして返したのをそのまま戻り値として返してしまうというようなケースだ。

```c++
const Fuga& get_fuga (const Hoge& hoge)
{
	return hoge.fuga;
} 

const Fuga& get_fuga (const Buhi& buhi)
{
	if (...)
		return buhi.get_fuga();
	else
		return get_fuga (Hoge (...));
}
```

いや、この例だと伝わんないかもしれないけど、とにかく込み入っていたんだ。

特に問題なのが、再帰呼び出しとかでスタックの割と深いところにある値をリファレンスで返してしまった場合。この場合、同じくらい深いところまでスタックが消費されない限り、戻り値は正しい値として生き続ける。結果、単体テストを通過してしまい、運用テストとかの段階になって全く関係のないようなところで値が壊れるというようなことが起こり得る。

俺は今までこの問題はとにかくきおつけるしかないのかと思っていたのだけど、突然いいことを思いついた。単体テストで戻り値を調べるときに、あらかじめスタックをランダムな値で壊しとけばいいんでない？

```c++
template<class T, int S=4096>
bool is_equal (const T& v1, const T& v2)
{
	int puff [S];
	for (int i=0; i<S; i++)
		puff [i] = rand();
	return v1 == v2;
}
```

こんな感じで。これをスタック破壊検査と名付けよう。なんちてw

※コメント欄でご指摘を受けたように、このコードは最適化を無効にしてコンパイルしないと意味ない。

いじょう
バリデーションを使って空欄で投稿した時にエラーメッセージを表示したい。

まず、modelでバリデーションをかく

```ruby:book.erb
`validates :name, presence: true`
```
`presence: true`は、空欄でないことを確認してる。


その後にhtmlでエラーメッセージが表示できるようにする

```ruby:book.html.erb
<%= form_for(@names, url: names_path) do |f| %>
<% if @names.errors.any? %>
<%= @names.errors.count %>件のエラー
<% @names.errors.full_messages.each do |message| %>
<%= message %>
<% end %>
```

次にコントローラーで

```ruby:books_controller.rb
def create
        @name = Name.new(name_params)
if @book.save
          redirect_to books_path
        else
          render :new
        end

private
    def book_params
        params.require(:book).permit(:book_name, :opinion)
    end
```

` @name = Name.new(name_params)`
で新規投稿できるよっていうnewが呼ばれてくる
requireでbookを指定してる

条件分岐で、空欄じゃなかったら` redirect_to books_path`にいって、空欄だったら` render`でnewにいくかな
Slug(スラッグ)とは？

## はじめに
DjangoでECサイトを作成している時に参考にしていたサイトがSlugという見慣れないものを使っていたので、その時に調べたものを記事にしました。

## Slugとは
英数字、アンダースコア、ハイフンからなる短いラベル文字列。
urlの中で使われ、urlの一部となる。

## 個人的な解釈
urlを指定するときにidと似た役割をしているもの。

製品のidが1,2,3,4...の時にその製品の詳細ページのurlは
http://shopping-site/product/1
http://shopping-site/product/2
http://shopping-site/product/3
となる。

一方スラグを使えば
http://shopping-site/product/white-bag
http://shopping-site/product/black-pants
http://shopping-site/product/red-tshirt
のように商品ごとに割り当てた英数字でurlを生成することになる。
Google ColaboratoryによるDonkey Car 学習環境(3.1.0編)



走行会などで円滑に学習が行えるように、Jupyter Notebookを作成しました。

Donkey Car(3.1.0)/TensorFlow 1.13.1環境(2019.09.01現在)
[Jupyter note]:(https://github.com/arigadget/donkeycar_colab )

以下にステップ毎の解説をしますので、カスタマイズの参考にどうぞ。

# Install Tensorflow（1.13.1）

Colaboratoryでは現在Tensorflow 1.14.0がプレインストールされているため、GPU版の1.13.1をインストールします。

```python
!pip uninstall -y tensorflow
!pip install tensorflow-gpu==1.13.1
```

# Version check(Optional)

TensoFlow/cuda/cuDNNのバージョンを確認します。一度確認しておけばいいのでレース中は飛ばしても大丈夫です。

tensorflow-gpu : 1.13.1
cuda                   : 10.0.130
cuDNN               : 7.6.2

```python
!pip list | grep -i -e tensorflow
!nvcc --version
!ls -l /usr/lib/x86_64-linux-gnu/libcudnn.so*
```

# Check GPU allocation(Optional)

GPUが割り当てられているかの確認です。これも飛ばしても大丈夫です。
If "Found GPU at: /device: GPU: 0" is displayed, the GPU is ready to use.

```python
import tensorflow as tf
device_name = tf.test.gpu_device_name()
if device_name != '/device:GPU:0':
  raise SystemError('GPU device not found')
print('Found GPU at: {}'.format(device_name))

```

# Install Donkeycar & Create Project

本来ならばセルを分けて記述すればいいのですが、手間を省くため一気にDonkey car(3.1.0 master)のインストールと環境設定をします。

```python
!git clone https://github.com/autorope/donkeycar.git 
%cd donkeycar
!git checkout master
!pip3 install -e .[pc]
!donkey createcar --path /content/mycar
```

# Upload datas.zip & unzip

ファイルのアップロードへのやり方には、主にGoogle Driveに格納する方法と、アップロードフォームを使う方法がありますが、転送の進捗が分かりやすいのとgoogle認証が必要でないことから、後者の方法でtubデータをアップロードします。

例）datas.zip(application/x-zip-compressed) - 2623504 bytes, last modified: 2019/8/31 - 62% done



「ファイル選択」でPC上にあるdatas.zipを選択し、アップロードする。
datas.zipは、実際の学習用フォルダである/content/mycar/dataに格納され、解凍します。

```python
import os
from google.colab import files

if(os.path.exists("/content/mycar/data/datas.zip")):
   os.remove("/content/mycar/data/datas.zip")

%cd /content/mycar/data/
uploaded = files.upload()

!unzip -o datas.zip
```

# Train your data

モデルの格納先をdefalutフォルダ、typeをlinearにしています。

/content/mycar/dataのフォルダー全てを学習対象にします。

```python
%cd /content/mycar
!python manage.py train --model=/content/mycar/models/mypilot.h5 --type=linear
```

# Copy the trained model back to Donkey Car

学習結果は、/content/mycar/models/mypilot.h5に保存される。
「ファイル」にあるmypilot.h5をダブルクリックしPCにダウンロードする。
WinSCP/SSHでRaspberryPiの~/mycar/models/mypilot.h5にコピーする。

#以上
iLo ファームウェアのバージョンアップ（SSH接続）

# はじめに
- GUIからポチポチやるのがめんどいから、せめてコマンドで処理したい

# 対象
- GUIからアップデートしたことある人向け
- ファームのダウンロード方法が分かる
- ファイル置き場用にHTTPサーバが用意できる

# いざ、アップデート

## ファームをダウンロード
　（略）

## HTTPサーバにファームウェアをアップロード
今回は下記の通りHTTPサーバにアップロードした

 /ilo/ilo4-windows2012/ilo4_270.bin
 /ilo/ilo4-windows2012/lang_ja_270.lpk

## SSH接続
###ファームウェアアップデート
</>hpiLO->load /map1/firmware1 -source http://{{ ipaddr }}/ilo/ilo4-windows2012/ilo4_270.bin
status=1
status_tag=COMMAND SPAWNED
Thu Aug 29 17:47:33 2019

Attempting to load iLO 4 firmware image.

status=0
status_tag=COMMAND COMPLETED
Thu Aug 29 17:50:28 2019

Resetting iLO.

※フィンガープリントが変わる

###言語パック(langueage pack)適用
</>hpiLO->load /map1/firmware1 -source http://{{ ipaddr }}/ilo/ilo4-windows2012/lang_ja_270.lpk
status=1
status_tag=COMMAND SPAWNED
Thu Aug 29 17:52:47 2019

Attempting to load iLO 4 firmware image.

status=0
status_tag=COMMAND COMPLETED
Thu Aug 29 17:53:06 2019

Resetting iLO.

※あんまり情報なかったけどファームウェアと同じコマンドでいけた。

以上。
【本読み】人工知能は人間を超えるか　ディープラーニングの先にあるもの


# 本

[人工知能は人間を超えるか](https://www.amazon.co.jp/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AF%E4%BA%BA%E9%96%93%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%81%8B-%E8%A7%92%E5%B7%9D%EF%BC%A5%EF%BC%B0%EF%BC%B5%EF%BC%A2%E9%81%B8%E6%9B%B8-%E6%9D%BE%E5%B0%BE-%E8%B1%8A-ebook/dp/B00UAAK07S)
![](https://images-fe.ssl-images-amazon.com/images/I/51mWcqy%2BipL._SY346_.jpg)

東京大学の松尾先生の本。
四年前ほどの本だけれど、読んでみたところ、人工知能・機械学習・DeepLearningの違いや歴史、これからどう日本は人工知能を活用すべきか？
が丁寧に書かれていた。

# 人工知能とはなにか？

人工知能という定義はたくさんある。
いろいろな学者がそれぞれの定義をしている。
よって、様々な捉え方があってよいが、どのような定義にしても人工知能は「人間を何らかの手段で模した」ものである。

この人工知能は、松尾先生いわくある意味必ず近い将来に実現できる。とある。
これは、人間の脳がそもそも神経細胞の科学的計算で動いているため、この科学的計算をコンピュータでもすことができれば、当然人工知能は実現できるという考える。

ただし、強いAI・弱いAIなど人工知能といっても分類はさまざまなため、一概には言えない。

# 第一次AIブーム

先進的な研究者によって、「ゲーム木」を利用した探索・推論によって
弱いAIが開発された。
このころの人工知能は、いわゆる「パターン学習」に近いAIである。
そのため、当然複雑なことはできないし、簡単なことしかできない。

難しい事ができないため、一回この人工知能ブームは廃れた。
人間の知能をコンピュータで表現することの難しさが、一層明白になった時代だった。

# 第二次AIブーム

1990年ごろからインターネットが開発され、データ量が増加し、それに伴って自然言語処理の発達も著しくなった。
その中で、知識、つまり情報の蓄積も行えるようになり、これまでのAIに知識を加えて判定させる手法が大きく幅を利かすようになった。

しかし、「フレーム問題」など、複雑なことを考え出すと一切解けなくなり、知識の設定も時間がかかり、当然矛盾も起こしやすかった。

多くの人の期待を裏切ったまま、再び人工知能ブームは廃れ、背景でAI研究者が研究を続けていた。

# 第三次AIブーム

さらにデータ量が増加し、ある程度マシンパワーの設備も整ってきた。
そのなかで「入力データ」と「出力データ」、そしてそれを行うための直感的特徴量を利用した機械学習の時代が来た。
これは、人間が特徴量を定めて、その特徴量に関するデータに関して、サポートベクターマシンやクラスタリングを行って、データ分類・類推をするものだった。

しかし、2012の画像コンペで、DeepLearningが急に$10$％以上の認識改善を行った。
このDeepLearningは、機械学習とは異なり、大量のデータとマシンパワーでぶん回すことで、特徴量さえもプログラムに学習させて、ある意味ブラックボックスにモデルを学習させるものであった。

ここから、機械学習からDeepLearningへと時代が移り変わり、データとマシンパワーがあれば、より精度を向上させやすいDeepLearningが主流になる第三次ブームが現在始まっている。

# 人間と人工知能によるシンギュラリティ

DeepLearningの発展によって、様々な技術が現在進歩している。
特に、画像認識やデータ分析などコンピュータに近いものほどから著しい成果を残している。

このディープラーニングは、人工知能ではあるが人工知能ではない。
人間としての意思を現在持っていないからである。
しかし、これからの研究によって、自分以上に賢いものを作ることのできる人工知能が誕生した場合、無限に賢いものが生まれ、新しいシンギュラリティが生まれる。

そのようなシンギュラリティを倫理的に危険視・統制しながら、ディープラーニング・強化学習などのAI分野の研究を勧めていく必要がある。

# 変わっていく世界

現在、ディープラーニングは基本的なものに限られている。
しかし、これからは車の自動運転、画像のみならず音声などのマルチモーダル、体・意思をもったロボットなど、より複雑に応用的な分野で発展していくことが予想される。

そのような世界では、たしかになくなる職業もあるが、新しく生まれる職業もある。
そのなかで、日本人は強みをきちんと理解して、AI・人工知能・DeepLearningという分野を進めていく必要がある。
Zabbix AlertをHangouts Chatへ送る[Zabbix 4.0]

## TL;DR
Zabbixの障害通知を、Google Hangouts Chatのチャットルームで受け取れます
Zabbix側、Hangouts側両方での設定が必要です

## 前提
・Ubuntu 16.04 LTS
・Zabbix 4.0

## ●Hangouts Chat の設定
1. 通知を受け取りたいチャットルームを開きます
2. チャットルームメニュー（画面上部のメンバー数を出している所の▼）より、「Webhookを設定」を選びます
3. 「別のWebhookを追加」をクリックし、適当な名前を入力して、「保存」をクリックします
4. 作成されたWebhookのURLを、URLコピー用ボタンで取得します

## ●Zabbixアラート用のスクリプト作成
Zabbixアラート用のスクリプトの配置場所を以下で特定します  

```
$ sudo grep AlertScriptsPath /etc/zabbix/zabbix_server.conf
※Zabbixのインストール手順によって異なります
```

特定できたAlertScriptsPathに、Webhook用のスクリプトを配置します
以下のようなスクリプトを用意します。
\$1、\$2には、Zabbixのアラート内容が入ります。

```shell:sample.sh
#!/bin/bash
export PATH="/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin"
export LANG=C

access_token=XXXXXXXXXXXXXXXXXXXXXXXXXX # 「Hangouts Chatの設定」で取得したアクセストークン
proxy=XXXXXXXXXXXXXXXXXX # (Optional) プロキシが必要な場合

subject=$1
body=$2

# Webhook 
curl -X POST ${access_token} -x ${proxy} \
--header "Content-Type: application/json; charset=UTF-8" \
--data "{'text': '
件名:
$subject

メッセージ：
$body
'}"

exit 0
```

スクリプトが実行ユーザ：Zabbixによって実行可能となるように権限変更しましょう。

```
$ sudo chown zabbix <スクリプトのパス>
$ sudo chmod 700 <スクリプトのパス>
```
  
## ●Zabbix設定（アクション作成）
ZabbixのWebUIより、設定→アクションを開き、「アクションの作成」を行います。
名前に任意の名前をつけ、実行条件でアラート通知の条件を指定します。
実行内容で、障害発生時のアラート内容を定義します。
復旧時の実行内容で、障害解決時のアラート内容を定義します。
更新時の実行内容で、障害更新時（未検証）のアラート内容を定義します。

```
定義例
件名：*障害発生: {EVENT.NAME}*
メッセージ：障害発生日時： {EVENT.DATE} {EVENT.TIME}
障害名: {EVENT.NAME}
ホスト名: {HOST.NAME}
深刻度: {EVENT.SEVERITY}

イベントID: {EVENT.ID}
{TRIGGER.URL}
```

## ●Zabbix設定（メディアタイプ作成）
ZabbixのWebUIより、管理→メディアタイプを開き、「メディアタイプの作成」を行います。
名前に任意の名前をつけ、スクリプト名に作成したスクリプトのファイル名を指定します。
スクリプトパラメータとして、{ALERT.SUBJECT}と{ALERT.MESSAGE}を追加します。
このパラメータには、先程定義したアクションの内容がそれぞれ代入されます。
スクリプトに渡される引数にもなります。

## ●動作確認
スクリプトのテスト等の機能はZabbixでは提供されていないため、
監視対象の負荷をかけるなどで障害を発生させる必要があります。

### 参考リンク
[5 Custom alertscripts [Zabbix Documentation 4.0]](https://www.zabbix.com/documentation/4.0/manual/config/notifications/media/script)
Azure Blockchain Serviceを試してみる1（チェーン構築編）

# Azure Blockchain Serviceとは
Azure Blockchain Serviceは、Azureが提供するフルマネージドなブロックチェーンサービス（2019/8/30時点でプレビュー版）で、コンソーシアムチェーンの構築及び管理等を行うことが出来ます。
ブロックチェーン自体には、Quorumという米大手銀行JPモルガンが開発するエンタープライズ向けブロックチェーンが利用されています。
Quorumのコア部分はEthereumがベースになっており、GethをForkした実装になっています。それゆえ、Ethereumのエコシステムをそのまま利用出来るという大きなメリットがあります。さらには、Quorumはコンソーシアムチェーンで利用可能な様々なプライバシー関連の機構を搭載しています。　

# ブロックチェーンを作成する
### リソースの選択
Azure Blockchain ServiceはMarketplace内のサービスとして提供されています。
<img width="500" alt="スクリーンショット 2019-08-30 13.25.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16354/585f7338-9008-824b-724d-ce0bc7548a85.png">

### チェーンの構築
リソースの選択後、いくつかチェーンの設定情報を入力します。
「Review + create」をクリックすると、チェーンが立ち上がります。とっても簡単です:wink:
<img width="600" alt="スクリーンショット 2019-08-30 14.19.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16354/13d3866a-c92d-6846-5ab5-e2496de17bb1.png">

#### 設定情報の説明
- PROJECT DETAILS
    - リソースグループとリージョンを指定します。
- BLOCKCHAIN DETAILS
    - Consortium
        - 作成するコンソーシアムの名称です。新しくコンソーシアムを作成するか、既存のコンソーシアムを選択して参加することができます。
    - Protocol
        - 2019/8/30時点ではQuorumのみサポートされています。
- MEMBER DETAIL
    - Name
        - 新たにコンソーシアムに参加するメンバーの名称です。
    - Member account password
        - 作成するメンバーアカウントに設定するパスワードです。
    - Pricing
        - 価格プランです。開発環境用のBasicと、本番環境用のStandardの2種類から選択できます。
    - Transaction node password
        - トランザクション送信用のノードに設定するパスワードです。


#### 構築されたチェーンの確認
「Review + create」をクリック後、10分程度でチェーンのデプロイが完了します。
デプロイが完了すると下記の画面が表示され、ブロック数やトランザクション数などの基本的なメトリクスを確認できます。
<img width="704" alt="スクリーンショット 2019-09-02 11.15.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16354/2554705d-5f44-c0bb-4f98-8491a4919b81.png">

### ノードの構成
チェーンを構築すると、検証ノードとトランザクションノードと呼ばれる2種類のノードが立ち上がります。
検証ノードはブロックの生成及び検証を行い、トランザクションノードはチェーンに対してトランザクションを送信する際のエンドポイントを提供します。
立ち上がるバリデータノードの数は選択した料金プランによって異なり、Basicを選択した場合は1ノード、Standardの場合は2ノードで固定となります。トランザクションノードはどちらの料金プランでも1ノードですが、こちらは後から追加が可能です。

### CLIによるチェーンの構築
##### 1. azure-cliのインストール
```
brew update && brew install azure-cli
```
##### 2. ログイン
```
az login
```

##### 3. グループの作成
```
az group create --name リソースグループ名 --location リージョン
```

##### 4. チェーンの構築
```
az resource create --resource-group リソースグループ名 --name メンバ名 --resource-type Microsoft.Blockchain/blockchainMembers --is-full-object --properties "{ \"location\": \"リージョン\", \"properties\": {\"password\": \"トランザクションノードのパスワード\", \"protocol\": \"Quorum\", \"consortium\": \"コンソーシアム名\", \"consortiumManagementAccountPassword\": \"メンバアカウントのパスワード\" }, \"sku\": { \"name\": \"価格プラン\" } }"
```
※ 価格プランはStandardはS0, BasicはB0を指定する


### ARMテンプレート（IaC）によるチェーンの構築
AzureではARMテンプレートを利用することで、インフラの構成をコード化することが可能です。
しかし、Azure Blockchain Serviceは2019/8/30時点ではまだARMテンプレートに未対応です。
今後対応されることを待ちましょう。


### 終わり
ブロックチェーンの構築をEC2上等に行う場合、冗長化やノード間の接続など何かと手間が掛かりますが、Azure Blockchain Serviceを使うことで非常に簡単に構築を行うことが可能です。この導入の簡単さはフルマネージドサービスを使う大きなメリットの１つです。

さて、[次回の記事](https://qiita.com/hayago/items/ba4ca93bcd5d99735b9e)では構築したチェーンに対して、コントラクトのデプロイを行います:wave:
新卒2年目のインフラエンジニアがAWS障害でやったこと

8/23(金)に起きたAWSの東京リージョンでの障害について、
新卒2年目のインフラエンジニアとしてやったことをまとめておきます。
同様の障害が起きた時の備忘録代わりです。

##障害発生時

監視しているサーバーでのステータスチェックエラーが広い範囲で生じたため、
障害の範囲を特定するために先輩エンジニアを参考に、以下を行いました。

###Twitter監視

Twitterで「AWS」と検索した時のツイートから、
されている言語/報告されている障害発生中のサービスを特定します。
記憶の限りでは、日本語で幅広いサービスで障害が確認できました。
（「AWS障害中？」「弊社のAWSサーバーが〜」みたいなツイートです。）

ここから日本限定で、かつ弊社の東京リージョンのサーバーの障害範囲から、
AWSの東京リージョンの一部で障害が発生していると仮説を立てました。
（この時点でAWSからの障害報告はありませんでした。）

###AWS Service Health Dashboard 監視

AWSの障害情報がわかるダッシュボートの監視です。
[AWS Service Health Dashboard](https://status.aws.amazon.com/)

障害が発生してから数十分後に第一報がありました。
こちらを障害発生中に定期的に監視しておくことで、把握していない障害についても
検知できる可能性が高まります。
（今回だとEBS, RDSのエラー）

日中だったので手作業で監視していましたが、障害がいつまで続くか不明であったため、
SlackにRSSを使って自動投稿できるよう設定しました。
ただし、Slackへの投稿について以下のような条件で作成しています。

* suffixに障害発生日を設定してチャンネルを作成すること
* 障害が終了した時点でRSS連携を外し、チャンネルを削除すること
* 任意参加のチャンネルであること

これらの条件は部署や近辺の人と相談して作成するのがいいと思います。


###監視外で障害が起きているサーバーの探索

監視設定を入れていないサーバーが少なからずあったり、
同時多発的に発生したことで漏れたサーバーがないか実際にアクセスするなどして、
正常動作しているか確認しました。

監視から漏れているサーバーについては、サーバーの保有者に報告し対応していただくなど、
必要な復旧対応をおこないました。

そもそもとして、監視設定を重要度ごとに分けつつ、漏れなく全サーバーに入れることが
必要なのかもしれなかったです。（監視の負荷と兼ね合いですが）

###必要そうな技術知識の共有

障害範囲が複数アカウントで1a/1cと変化していたため、AZの仕組みを検索しました。
その際に共有したのが以下のリンクです。
[AWSアカウントに因らずアベイラビリティゾーンを識別できるAZ IDを利用しよう #reinvent](
https://dev.classmethod.jp/cloud/use-az-id-for-identify-az-crossing-over-account/)

また、所有しているRDSがマルチAZ構成になっているか、
フェイルオーバーしたさいの挙動などについても適宜共有しました。

##その他

実際に担当しているサーバーでも障害が起きていました。
こちらも先輩社員を参考に、現状と今後の方針の共有と復旧確認後の対応をしました。
あくまで先輩社員を参考にすることと、そこからの応用がメインでしたが、
障害に対して素早く状況把握と対応ができたと思います。

##障害終了後
また、障害後にはqiitaなどで以下の内容の記事が多く出され、大変勉強になりました。

* マルチAZ構成についての記事
* 今回の障害でマルチAZ構成でも影響が出た原因
* このような障害に対する対策

この記事も、備忘録兼、対応内容の参考になればと思っています。

###まとめ

まず、タイトルに新卒2年目とつけるか悩んだのですが、新卒2年目の姿勢として、
これからインフラエンジニアを目指す方の参考になればとつけました。

反省点も多くあるので、障害がまた発生した際は今回以上の対応ができるよう励みます。
（今回は、AWSの主要サービスで障害が起きた場合の対策知識の不足を感じました。）
あとは、１週間後に記事を書かずに直後に書けるよう頑張ります。。。
MySQLよく使うコマンドメモ(自分用備忘録)

# はじめに
MySQLをいじっててよく使うコマンドをメモしました。

## データの追加

```mysql
INSERT INTO <テーブル名> VALUES (<値1>, <値2>, <値3>, …);
```

## 列の追加

```mysql
ALTER TABLE <テーブル名> ADD <列名> <データ型>
```

## 列の削除

```mysql
ALTER TABLE <テーブル名> DROP COLUMN <列名>
```

## データの変更

```mysql
UPDATE <テーブル名> SET <列名> = <更新後の値> WHERE <条件>
```

## データの削除

```mysql
DELETE FROM <テーブル名> WHERE <条件>
```

## データの選択（ソートして上位n個取得）

```mysql
SELECT <取得する列名> FROM <テーブル名> ORDER BY <ソートに使う列名> DESC LIMIT <<取得する個数n>
```
# 言い訳
あくまで自分用のメモですので…。また追加します。

2019/10/01更新
AppGoatで学ぶバッファーオーバーフロー

#日に日に増すセキュリティの重要性

7Pay問題をきっかけにセキュリティの重要性が再認識されてきている中、IPAが提供するAppGoatに以下項目が追加されました。

- ディレクトリ・トラバーサル
- OSコマンドインジェクション
- セッション管理の不備編
- Fiddlerの使い方

ちゃんと更新されるんだなという感想は置いておいて、せっかくなので順に沿って学んでみようかなと思います。
まずはバッファーオーバーフローから。

#事前準備

1. 以下のページからAppGoatをダウンロード
https://www.ipa.go.jp/security/vuln/appgoat/index.html

2. 展開し、IPAToolフォルダにあるstart.batを実行

3. 80番ポートが利用中のため起動出来ないエラーが出た場合、以下コマンドで利用しているサービスを確認する。

`netstat -nao`
※IISが起動している場合が多いため、サービス一覧から「World Wide Web Publishing Service」を停止させてください。

#バッファーオーバーフローとは？
一度確保したバッファ領域に、それ以上に大きいデータを後から上書きする事によってプログラムに予期しない動きをさせる攻撃方法です。

![原理.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/69aa70ae-b8fe-30d9-e76e-59ebc9a08e9c.png)
出典：AppGoat

AppGoatのサンプルプログラムでは関数ポインタを格納した変数に対して大きなデータを割り当て、想定外の挙動を実行させるという内容でした。
以下、重要な所だけ抜き出したコード@C++です。

```C++:sample.cpp

#define ARCBOF_MAX_PATH		256


showProgress2(IN ArcDoShowProgress_t DoShowProgress,IN LPCSTR pExtraField)
{
	CHAR ExtraFieldBuffer[ARCBOF_MAX_PATH] = {0};
	strcpy( ExtraFieldBuffer, pExtraField );
}
```
256で確保したExtraFieldBufferに、引数で渡されたpExtraFieldの値を割り当てているため、pExtraFieldが大きいデータの場合バッファーオーバーフローが発生するという演習です。
AppGoatの教本が分かりやすいので、ぜひ一度試してみる事をお勧めします。

#バッファオーバーフロー攻撃を防ぐためにすべき事

元も子もない話ですが、バッファオーバーフロー攻撃のリスクが発生する余地のない言語を使用することであると思います。
参考
https://www.synopsys.com/blogs/software-security/ja-jp/detect-prevent-and-mitigate-buffer-overflow-attacks/

最近流行りの言語はほぼバッファオーバーフロー攻撃のリスクが発生する余地のない言語に該当するので、問題ないと思います。
初めて学習する人はこんな攻撃手法があるんだなという理解だけで十分という事ですね。
※参考に上げた記事にて、発生するリスクがある言語で行うべき対策が書いてあるので読むと勉強になるかも。

まとめが雑になってしまいましたが以上です、読んでいただきありがとうございました。
次回はバッファオーバーフローの脆弱性の検証手法の一つであるファジングという手法についてまとめる予定です。
中華スマホでUQmobileのSIMを使えるようにする

# UQmobileのSIMを使う
スマホやタブレットで外からサーバーに接続してメンテナンスすることってありますよね？
え？ない？それはかなりホワイトな会社で働いていますね…。

サーバー管理をしていると、外からSSHで接続するなんてことは、日常茶飯事すぎてTwitterで呟こうとした時ですら、呟きを書くところに「ssh hogehoge」なんて打ってしまいますよね。
え？ない？そｒ（ｒｙ

そんなリモート作業でも通信速度は速いに越したことはないので、ほとんどのサーバー管理者が契約していると噂の「UQmobile」。
いつなんどき、なにをしている時でもサーバーメンテナンスを行う上で必須と噂の「UQmobile」。

そんなUQmobileですが、中華端末だとデータ通信が使えないことが多いんですよね。
なので、そんな中華端末でデータ通信を使えるようにする手順のポエムです。

**※ 本来ならば、以下の手順は「中華スマホでVoLTEを使って通話をする」ためのものなのですが、私はこれをしないとデータ通信すら出来なかったので、そっち目線のポエムとして書いています。**

## APN設定
DSDS/DSDV端末の場合は、とりあえず必要なSIMのAPN設定をデバイスに登録しておいてください。
理由は後で楽なので。

|項目                             |値                       |
|:--------------------------------|:-----------------------|
| APN名、アクセスポイント名            | uqmobile.jp            |
| APN、APN設定                     | uqmobile.jp            |
| ID、ユーザーID、ユーザー名          | uq@uqmobile.jp         |
| Password、パスワード               | uq                     |
| 認証タイプ、PPP認証タイプ、暗号タイプ | CHAP                   |
| APNプロトコル                     | IPv4v6、IPv4/IPv6       |
| APNタイプ                        | default,mms,supl,hipri |

## VoLTE通話用のAPN（IMS）の追加
APNの追加設定で、

|項目        |値     |
|:-----------|:-----|
|NAME        |   ims|
|APN         |   ims|
|MCC         |   440|
|MNC         |    51|
|TYPE        |   ims|
|APNプロトコル | IPv4v6|

を追加。
追加してもAPN一覧には出てきません。
ここで、一旦端末を再起動します。

## VoLTE Carrier Checkの停止
通話アプリを起動し、ダイヤルパッドから、

**\*#\*#86583#*#***

とタップします。
最後に通話を押す必要はありません。
最後のアスタリスクを押した途端に「**VoLTE carrier check was disabled**」と出ます。

## APN選択
各SIMで使用するAPNを選択しておいてください。

## 一旦、機内モードにして戻す
私の端末では、ここまでやってもデータ通信が有効にならなかったのですが、設定で一旦「機内モード」にしてから、再び「機内モード」を解除したところ、通信が可能になりました。
自分用メモ: DockerでAtcoder用Python3.4.3環境を作る

仮想環境系を使ってもいいけど、Dockerのほうが個人的に楽なため

# 実行コマンド
rootで

```bash
docker pull micktwomey/python3.4:latest
docker run -i -t micktwomey/python3.4
```

pythonオフィシャルレポジトリに3.5以降しか存在しないため、知らん人のレポジトリにあるやつ使うしか無い。
Dockerfile見たけど、aptのレポ追加してインストールしてるだけだから、特に問題ないと思う。
GCEからGCS（Cloud Storage）をファイルシステムとして利用する

本記事は、以下のインストール方法を和訳したものになります。
- Ubuntu and Debian (latest releases)
https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/installing.md#ubuntu-and-debian-latest-releases

# 環境
- Google Compute Engine + Ubuntu and Debian
- Google Cloud Storage

# 前提条件
- GCE（Google Compute Engine）のインスタンスを作成済み。<br>まだ作成されていない方は[こちら](https://cloud.google.com/compute/docs/quickstart-linux?hl=ja)
- Cloud Storageのバケットを作成済み。<br>まだ作成されていない方は[こちら](https://cloud.google.com/storage/docs/quickstart-console?hl=ja)

# 事前準備

GCEのインスタンスを停止した状態で、インスタンスのデフォルトのアクセススコープ（権限）を変更。
この操作を行わないと、GCEのインスタンス上からCloud Storageのファイルを操作できません。

1. VMインスタンスの詳細画面より「編集」
2. アクセススコープを「各APIにアクセス権を設定」に変更
3. ストレージの項目を「フル」に変更（デフォルトでは「読み取り」のみ）

# GCSFuseをインストール

GCSFuseを使用することで、GCEのインスタンス上で、Cloud Storageを共有フォルダとしてGCEのコンソール上で操作できるようになります。通常のファイルシステム同様、```ls``` , ```cp``` , ```mv``` , ```rm``` などのコマンドでファイル操作可能です。

上記ページでは以下のOSについて、インストール手順が載っていますが、本稿では動作確認をとった ```Ubuntu``` と ```Debian``` のみに絞ります。ご容赦ください。

- ubuntu-1804-lts, ubuntu-1604-lts, and ubuntu-1404-lts
- debian-8, debian-7
- centos-7, centos-6
- rhel-7, rhel-6
- sles-12
（2019年9月2日現在）

## GCSFuseのアップデート情報を確認し、公開鍵を取得

GCEのインスタンスを起動し、SSH接続後、以下のコードを実行します。
以下の処理は、現行のUbuntuとDebianに対応しているgcsfuseのアップデートがないか確認し、```apt-get```をセットアップしています。

```bush
export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s`
echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
```

## GCSFuseをインストール

```bash
sudo apt-get update
sudo apt-get install gcsfuse
```

## バケット名を指定して、ストレージをマウント

Cloud Storageのバケット名を指定して、新規フォルダにマウントします。
再起動する度に、```gcsfuse [bucket-name] [path]```の操作が必要になります。

```bash
mkdir mount
sudo gcsfuse [bucket-name] mount
```

# まとめ

```bash
# install GCSFuse
export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s`
echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update -y
sudo apt-get install gcsfuse -y

# mount bucket
mkdir mount
sudo gcsfuse [bucket-name] mount    # please set up [bucket-name]
```

# 参考
Cloud Storage FUSE https://cloud.google.com/storage/docs/gcs-fuse?hl=ja
GitHub - GoogleCloudPlatform/gcsfuse https://github.com/GoogleCloudPlatform/gcsfuse

以上
git リモートブランチチェックアウトからブランチ作成まで


###リモートブランチをチェックアウト

```
git checkout -b チェックアウトしたいブランチ名 origin/チェックアウトしたいブランチ名
```

###チェックアウトしたブランチから別ブランチを作成
```
git checkout -b 作成する別ブランチ名
```

###作成した別ブランチをリモートにPUSH
```
git push -u origin 作成した別ブランチ名
```
アルファベットの文字を大文字や小文字にする方法

# アルファベットの文字を大文字や小文字にする方法

[Exploratory](https://exploratory.io/)では、アルファベットの文字列の大きさを簡単に変えることができます。

さっそく見ていきましょう。


# アルファベットの文字を大文字や小文字にするための関数

アルファベット文字列の大きさを変える関数は、一つの引数を取り、その引数は列名となります。

* str_to_lower(列名)：lowercase(小文字)にする
* str_to_upper(列名)：UPPERCASE(大文字)にする
* str_to_title(列名)：Title Case(タイトルケース)にする

lowercaseは文字列にある全ての文字を小文字にし、UPPERCASEは文字列にある全ての文字を大文字にします。

そして、Title Caseは文字列の中の文頭のみを大文字にし、それ以外を小文字にします。

今回はこのTitle Case、つまりstr_to_title関数を用いて具体的な使い方を見ていきましょう。

# 使い方

例えば、下記のように、列内にある文字の大きさが異なる場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/cf706608-24bc-0e22-6788-cb5183a39e26.png)

これらは文字の大きさは違いますが、同じ情報を表しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/4b2deab9-b0e1-0691-a171-f4f01c28b6fc.png)


しかし、サマリビューで見ると、それぞれが独立した文字だと認識されてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/8c82f9d2-c345-d087-e6f7-22bdeb2a9f54.png)


そのため、これらの文字の大きさを整えて、同じ情報だと認識させるために、文字列の文頭のみを大文字にする`str_to_title`を使用して、"United States"のようにしていきます。

列ヘッダメニューから「テキストを操作」をクリックし、Title Case(タイトルケース)に変換を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/f5c9f23e-75af-30f7-df6e-5070c0afabf1.png)


ダイアログが開き、既にstr_to_title関数と列名が入ってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/519f4283-6fd0-b916-be4e-cb5cf23b521e.png)


実行すると、全ての文字列で文頭のみが大文字にするタイトルケースにすることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/12a62ff6-0f0f-3a35-1437-fa30814cd9da.png)


サマリビューを見てみると、先ほどは一意な値の数が14だったのに対して、タイトルケースに統一したものでは一意な値の数が5になっていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/01c002fe-84c8-210e-306f-af0ea0841b1c.png)



最後に、種類ごとに列を作成した結果は下記のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/f72d8c24-9559-ef10-886a-a6588c5a5c41.png)


---

# Exploratoryデータ・アカデミー

データの可視化、またはデータ分析に関してもっと知りたい、学びたいという方は、私達が提供しているトレーニングやセミナーに参加してみてください。

[こちら](https://ja.exploratory.io/data-academy-jp?utm_campaign=excel_series_2&utm_medium=blog&utm_source=qiita)のExploratoryデータ・アカデミーのページに詳細情報があります。

データを使ってより良い意思決定を行っていきたいと言う方は、ぜひこの機会に参加をご検討ください！