OmniAICreator/Qiita-1.07M huggingface dataset:
WinActor サブルーチン　使いかた

### WinActor Forumは使えない
NTT謹製のフォーラムは、なかなかヒットしないのでQiitaにあげます。
（俺の検索ワードチョイスが悪いのか、思うように出てこない）

### 処理のまとめかた
オブジェクト指向のように1classに共通処理を書いて呼び出すことができない
(シナリオGoToで飛ばすことはできるが、呼び出し元に戻せない)
→BにシナリオGoToで飛ばす⇒　AにシナリオGoToでFlgをもって飛ばす⇒Aのフロー先頭に戻るのでFlgの値で処理を分岐させる

というフローは思いついたが、、、バグの温床になりそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/d542f059-32f3-9b8a-154d-c826f9ca9c51.png)

##ベストプラクティス
1シナリオに共通処理をサブルーチンで書く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/6701a21c-3f30-66de-47bf-6c055eb94d55.png)

　　　　　　　　↓
2個目以降のシナリオ作成時に共通処理を入れたいときは、サブルーチンをインポートする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/490d70b4-5cbf-5e59-352e-426078f63291.png)
インポートしたいサブルーチンを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/8962b792-c963-82bc-732c-ee66d2c5cf10.png)
重複した変数があるときいてくる。上書きしたくない場合は、チェックを外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/5ba12674-ad67-2bd3-ec9f-2374763b4546.png)
Windows 10にPerlを導入

GUI開発環境を用意するのにPerlが必要になったので自分用にメモ。

■環境
　- PC : Windows 10, 64bit

■手順
１．Strawberry Perlのインストーラーをdownload
　　　http://strawberryperl.com/
２．インストール
３．環境変数のPathにPerlを追加
　　※デフォルトの場合、以下のパスを追加
　　　```C:\Strawberry\perl\bin```
高階関数、カリー化、部分適用

# 背景・動機

業務でReduxを利用していますが、公式サイトに以下のようなコードが現れビビったので調べました。

```js
const middleware = store => next => action => {
  next(action);
}
```

# 高階関数とは

関数を引数にとったり、関数を戻り値とする関数のこと。

# カリー化とは

高階関数を使うと、以下のようなadd関数を定義することができます。

```js
const add = function(a) {
  return function(b) {
    return a + b;
  }
}
add(1)(2); // 3
```

addのように、引数を1つずつとって関数を返し、関数がつながっている状態にすることをカリー化と言います。
上記は簡略化して以下のように記述できます。

```js
const add = a => b => a + b;
```

# 部分適用とは

カリー化された関数は、任意の引数を固定した別の関数を作成することができます。
これを部分適用と言います。

```js
const add = a => b => a + b;
const add2 = add(2);
add2(3); // 5
```

# どういったメリットがあるの？

関数を再利用する際に、毎回気にしなくて良い引数を固定化できます。
例えばAPI Requestを行う関数を考えてみます。
まずは部分適用を用いないパターン。

```js
const apiRequest = (method, path, data) => {
  return fetch(path, { method: method, body: JSON.stringify(data) });
}
apiRequest('GET', 'http://example.com', { param1: 'hogehoge' });
apiRequest('GET', 'http://example.com', { param2: 'hogehoge' });
apiRequest('GET', 'http://example.com', { param3: 'hogehoge' });
```

上記は部分適用を用いることで、以下のように記述できます。

```js
const apiRequest = method => path => data => {
  return fetch(path, { method: method, body: JSON.stringify(data) });
}
const get = apiRequest('GET');
const getExample = get('http://example.com');

getExample({ param1: 'hogehoge' });
getExample({ param2: 'hogehoge' });
getExample({ param3: 'hogehoge' });
```

引数を固定化することで、引数の数を減らしシンプルにできました。
Rubyをインストールする(macOS)

rbenvを使ってRubyをインストールします（2020/1/7実施）

#環境
macOS Catalina 10.15.2

#Homebrewのインストール

[こちら](https://brew.sh/index_ja)にアクセス

記載されているコマンドを実行します

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

完了確認

```
brew -v
```

バージョンが表示されて完了です

```
Homebrew 2.2.2
```
#rbenvのインストール

[こちら](https://github.com/rbenv/rbenv#homebrew-on-macos)の手順通りコマンドを実行します

```
brew install rbenv
```

初期設定を行います

```
rbenv init
```
以下のように表示されました

```
# Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"
```
.bash_profileを開きます。なければ新規作成になります

```
vim ~/.bash_profile
```

.bash_profileに以下を追記しましょう

```
eval "$(rbenv init -)"
```
.bash_profileの変更を反映します

```terminal
source ~/.bash_profile
```
正しく設定できたか確認

```
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
```
このような表示ならOKです

```terminal
Checking for `rbenv' in PATH: /usr/local/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /usr/local/bin/rbenv-install (ruby-build 20191225)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/Users/username/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK
```

インストールできるRubyのバージョンを確認します

```
rbenv install -l
```

現時点での最新(2.7.0)をインストールします

```
rbenv install 2.7.0
```

インストールしたバージョンを有効化します

```
rbenv rehash
```

バージョンを確認します

```
rbenv versions
```
インストールされたバージョンが表示されます。「*」がついているものが設定されています

```terminal
* system (set by /Users/username/.rbenv/version)
  2.7.0
```


バージョンを切り替えます

```
rbenv global 2.7.0
```

バージョンを確認します

```
ruby -v
```

```
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin19]
```


これで完了です
転職日記3日目

Dockerの勉強を漫画でわかるDockerでしてました。

あの漫画は本当にすごい、Udemyで学習もしていましたが、漫画だとよりすらすら入ってきてもうDocker楽しすぎるとなっていました。

理解力が足りない自分でも本当に楽しく学べたので漫画でわかるDockerおすすめです。

次はAWSでDockerを使えるようにして、ポートフォリオを作ろうと思う

あとは転職サイトも活用していこう

今回は中身が薄くてすみません。Dockerのことをまとめようと思ったのですが

時間がないのでこの辺で失礼します。
GoでSTUNサーバを使って自分のパブリックIPアドレスを取得


以下の記事を参考に Go の実装に置き換えてみた。

* [JavaScriptでグローバルIPを取得する(パブリックSTUNサーバーを利用)](https://qiita.com/azechi/items/1a7832e346f42402cca6)

以下のパッケージ使って同等のことが割と簡単に実装できた。

* [pion/webrtc: Pure Go implementation of the WebRTC API](https://github.com/pion/webrtc)

Go言語楽しい。

## 実行結果

```terminal
# go run webrtc/main.go
2020/01/06 23:31:08 Local IP Address: 192.168.xxx.xxx
2020/01/06 23:31:08 Public IP Address: 113.xxx.xxx.xxx
```

## 実装

```go:main.go
package main

import (
  "log"
  "os"

  "github.com/pion/webrtc/v2"
)

func main() {
  config := webrtc.Configuration{
    ICEServers: []webrtc.ICEServer{
      {
        URLs: []string{"stun:stun.l.google.com:19302"},
      },
    },
  }

  // generate a new connection
  peerConnection, err := webrtc.NewPeerConnection(config)
  if err != nil {
    log.Fatal(err)
  }

  peerConnection.OnICECandidate(func(c *webrtc.ICECandidate) {
    if c == nil {
      os.Exit(0)
    }
    switch c.Typ {
    case webrtc.ICECandidateTypeHost:
      log.Println("Local IP Address:", c.Address)
    case webrtc.ICECandidateTypeSrflx:
      log.Println("Public IP Address:", c.Address)
    }
  })

  if _, err := peerConnection.CreateDataChannel("", nil); err != nil {
    log.Fatal(err)
  }

  offer, err := peerConnection.CreateOffer(nil)
  if err != nil {
    log.Fatal(err)
  }

  if err = peerConnection.SetLocalDescription(offer); err != nil {
    log.Fatal(err)
  }

  // block forever
  select {}
}
```
mac環境構築手順メモ

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#新しいmacbookになったので一から環境構築
今回、環境構築を行った際に参考にした手順やフローをまとめてみました。

１：Ruby,Railsなどの環境構築
・[Ruby初学者のRuby On Rails 環境構築【Mac】](https://qiita.com/TAByasu/items/47c6cfbeeafad39eda07/)
・[30分でできるRuby on RailsとGitHubやエディタまわりの環境構築](https://qiita.com/_kanacan_/items/59f3959169c41a167b1e/)

２：フロントエンドまわりの環境構築
・[全て与えられてきた新人が自力でフロントエンド環境構築［1］](https://qiita.com/oniam/items/c7ddb32836a7317af434/)
・[React 開発環境構築](https://qiita.com/rspmharada7645/items/25c496aee87973bcc7a5/)
・[最近流行りのフロントエンド構成（環境構築編）](https://qiita.com/gorilla0513/items/95c6b7bd79b56b6d5102/)

３：VSCodeの環境構築
・[VSCodeで爆速コーディング環境を構築する(主にReactJS向け設定)](https://qiita.com/teradonburi/items/c4cbd7dd5b4810e1a3a9/)

４：SSHの設定
・[Macで公開鍵と秘密鍵を生成する方法］](https://qiita.com/wakahara3/items/52094d476774f3a2f619/)
・[ssh config最強設定](https://qiita.com/keiya/items/dec9a1142ac701b19bd9/)
・[SSHのconfigファイルを作成し、接続コマンドを簡単にする例【Mac】](https://blog-and-destroy.com/20409/)
・[MacのSSH接続を簡単に！configファイルを作ってVPS接続を簡単にしよう！](https://www.braveryk7.com/mac-ssh-config//)

５：Gitの設定
・[Mac GitHub SSH接続設定](https://qiita.com/ucan-lab/items/e02f2d3a35f266631f24/)
・[git 設定(config)内容を確認したい。](https://chaika.hatenablog.com/entry/2019/02/26/132246/)

６：nginxの設定
・[新しいmacにbrewを使ってnginxをインストールする](https://qiita.com/amemolee/items/56332100f182088687cf/)

７：Herokuの設定
・[Heroku利用の準備手順](https://qiita.com/Daiji-Nagashima/items/755ee75ebc72281a6a82/)

8:(US)キーボードにおける日本語入力切替方法
・[Mac用 Apple英字配列(US)キーボードにおける日本語入力切替のおすすめ：Commandキーのみで実現](https://qiita.com/daichi87gi/items/ded35e9d9a54c8fcb9d6/)

必要最低限の設定は上記の記事などを参考に設定しました！

#追記
１:VSCode Live Shareの設定方法
・[VSCode Live Shareすげぇ
](https://qiita.com/taichi0514/items/95aca7428376a7b41f90/)
バックエンドエンジニアのロードマップ in2020

# 記事投稿の背景
rubyを独学で勉強している最中、とても参考になるエンジニアの学習ロードマップを発見しました(有名なものらしい)。知識整理のためアウトプットさせていただきます！
元ネタは下記リンクです。
<https://github.com/kamranahmedse/developer-roadmap>


#フロントエンド、バックエンド問わず必要になる分野

![roadmap1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562079/b1e90137-bf01-40de-5ba4-3aed26798b01.png)

- Git
- Linuxコマンドなどの基本的なターミナル操作
- データ構造、アルゴリズム
- GitHub
- Semantic Versioning (バージョン番号のつけ方のルールのこと)
- SSH
- HTTP/HTTPS、API

等々。やはりGitHubを使ったバージョン管理は必須スキル、ということですね。そのほかだとデータ構造とアルゴリズム(スタック、キューとか)の勉強は必要になるよう。

# バックエンドエンジニアの学習ロードマップ

![roadmap2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562079/72d202c0-aa37-417b-09a1-3663f3c2bebb.png)

- まずは言語の選択
    - スクリプト言語なのかコンパイラ言語なのか、またその中のどの言語を学習するかを最初に決定。基本的にはどの言語を選択しても学習の流れに大きな違いはない。
- コマンドベースで簡単なアプリケーション作成
    - 選択した言語の実行環境を整え、HelloWorldの表示程度の、簡単なプログラムを組んで慣れていく。
- パッケージマネージャーについて学習
    - rubyであればgem。javascriptならNode.jsのように、言語毎にパッケージマネージャーが存在。その基本的な使用方法を学習する。
- その言語におけるベストプラクティスは何かを調べる
    - 例えばPHPであればPHP-FIGとPSRsをnode.jsとともに使用するケースが多い。このように、学習している言語の一般的な使用方法を整理しておく。
- いくつかアプリを作って公開する
    - 簡単なアプリケーションを作成、Githubなどで公開してみる。
- テストの仕方(単体、結合)を学習
    - その言語における単体テスト、結合テストの実施方法を調べる。
- テスト(単体、結合)を計画し、実施
    - 実際に、作成したアプリケーションに対して単体テスト、結合テストを実施する。
- RDBについて学習する
    - RDB(リレーショナルデータベース)について学習。RDBを使用したアプリケーションを作成する。
- 作成したアプリを運用してみる
    - 作成したアプリケーションを一般公開してみる。例えば、CRUD機能(ユーザー登録や、削除、ブログ等の投稿機能など)を持ったアプリケーションのようなもの。
- フレームワークを学習する
    - その言語における、よく使われるフレームワークを学習。
- これまでに作成したアプリを、フレームワークを用いて再度開発
    - 一度作成したアプリケーションを、フレームワークに沿って再度作成してみる
- NoSQLを学習
    - NoSQLについても学習し、RDBとの違いを整理してみる。
- キャッシュ(メモリキャッシュ、ブラウザキャッシュ両方)を意識した実装を学習
    - ワンランク上の実装を身に着けるため、キャッシュを意識した実装方法を学習。
- REST APIを使用してアプリを作成
    - プログラムの中にAPI連携を含むようなアプリケーションを作成

# さらに学習するなら
さらにweb関連の知識をつけるために、実装を進める中で疑問に思った点は都度調べていくことがよい。例えば下記のようなことは調べると吉。

- 認証 ( Authentication )と承認 ( Authorization )の違いを学習
- Message brokerについて学習
- サーチエンジンについて学習
- Dockerの使い方を学習
- Webサーバーについて学習
- Webソケットの使い方を学習
- GraphQLを学習
- GraphDBを調べる
Web上で動作するVSCodeでTeX書いたらかなり便利だと思うんだけど誰かそういう記事書いてない？


TeXの環境ってかなり容量食うし、TeXコンパイルは重いのでノートパソコンにやらせたくもない。

したがって、高スペックなサーバーにTeX環境と[Coder](https://github.com/cdr/code-server)を構築して、ブラウザでそれをいじるようにしたら便利なのでは？

誰かやってみた人いませんか？

### 追記1

cloud9でやってる人はいるみたい。
https://github.com/nanhung/c9.latex

### 追記2

やってる人見つけた。
https://ir1s.com/online-latex-editor-with-coder/

そしてこんなWebサービスを見つけた
https://cloudlatex.io/

見つけた
https://texwiki.texjp.org/?TeX%E3%82%92Web%E3%81%A7

### 結論

overleafとかいう最強を見つけた。
Rustで構造体に関数を返却させるメソッド追加するの

構造体に関数を返却させるメソッド追加するの、
対象メソッドのself引数に「&'static」ライフタイムを追加して、
newメソッドをconstにするとできた。

```rust
// 構造体のフィールドに持たせた値を使用した関数を作成したい。
type ResultFn = Box<dyn Fn(i32) -> i32 + 'static>;

fn main() {
    static P:Pom = Pom::new(&8);
    let add_fn = P.make_add_fn();
    assert_eq!(15, add_fn(7));
    println!("function result:{}", add_fn(10));
}

struct Pom{p:&'static i32}

impl Pom{

    pub const fn new(q:&'static i32) -> Pom{
        Pom{p:q}
    }

    fn make_add_fn(&'static self)->ResultFn {
        Box::new(move |r| self.p + r)
    }
}

```
「リファクタリング 第2版」Swiftでコーディング その20

# 37-38頁 第1章 型による計算処理の再編成「関数をPerformanceCalculatorに移動」「関数の移動(p.206)」

## Swift版 createStatementData.swift

```swift
import Foundation

struct PerormanceMapPlay {
    let performance: Performance
    let play: Play
    var amount: Int = 0
    var volumeCredits: Int = 0
}

struct StatementData {
    let customer: String
    let performances: [PerormanceMapPlay]
    var totalAmount: Int = 0
    var totalVolumeCredits: Int = 0
}

public class PerformanceCalculator {
    let aPerformance: Performance
    let play: Play

    init(aPerformance: Performance, play: Play) {
        self.aPerformance = aPerformance
        self.play = play
    }

    func amount() -> Int {
        var result = 0

        switch self.play.type {
        case "tragedy":
            result = 40000
            if self.aPerformance.audience > 30 {
                result += 1000 * (self.aPerformance.audience - 30)
            }
        case "comedy":
            result = 30000
            if self.aPerformance.audience > 20 {
                result += 10000 + 500 * (self.aPerformance.audience - 20)
            }
            result += 300 * self.aPerformance.audience
        default:
            print("error")
        }
        return result
    }
    
    func volumeCredits() -> Int {
        var result = 0
        result += max(self.aPerformance.audience - 30, 0)
        if "comedy" == self.play.type {
            result += Int(self.aPerformance.audience / 5)
        }
        return result
    }
}

func playFor(aPerformance:Performance) -> Play {
    return plays[aPerformance.playID]!
}

func usd(aNumber:Int) -> String {
    let format = NumberFormatter()
    format.numberStyle = .currency
    format.locale = Locale(identifier: "en_US")
    return format.string(from: NSNumber(value: aNumber / 100))!
}

func totalVolumeCredits(data:StatementData) -> Int {
    return data.performances.reduce(0) { (num: Int, perf: PerormanceMapPlay) -> Int in
        num + perf.volumeCredits
    }
}

func totalAmount(data:StatementData) -> Int {
    return data.performances.reduce(0) { (num: Int, perf: PerormanceMapPlay) -> Int in
        num + perf.amount
    }
}

func enrichPerfoemance(aPerformance:[Performance], plays:Dictionary<String, Play>) -> [PerormanceMapPlay] {
    var result: [PerormanceMapPlay] = []
    for perf in aPerformance {
        let calculator = PerformanceCalculator(aPerformance: perf, play: playFor(aPerformance: perf))
        var perormanceMapPlay = PerormanceMapPlay(performance: perf, play: calculator.play)
        perormanceMapPlay.amount = calculator.amount()
        perormanceMapPlay.volumeCredits = calculator.volumeCredits()
        result.append(perormanceMapPlay)
    }
    return result
}

func createStatementData(invoice:Invoice, plays:Dictionary<String, Play>) -> StatementData {
    var result = StatementData(customer: invoice.customer, performances: enrichPerfoemance(aPerformance: invoice.performances, plays: plays))
    result.totalAmount = totalAmount(data: result)
    result.totalVolumeCredits = totalVolumeCredits(data: result)
    return result
}
```
「リファクタリング 第2版」Swiftでコーディング その19

# 34-36頁 第1章 型による計算処理の再編成「ポリモーフィズムによる条件記述の置き換え(p.279)」「PerformanceCalculatorの作成」「関数宣言の変更(p.130)」

## Swift版 createStatementData.swift

```swift
import Foundation

struct PerormanceMapPlay {
    let performance: Performance
    let play: Play
    var amount: Int = 0
    var volumeCredits: Int = 0
}

struct StatementData {
    let customer: String
    let performances: [PerormanceMapPlay]
    var totalAmount: Int = 0
    var totalVolumeCredits: Int = 0
}

class PerformanceCalculator {
    let aPerformance: Performance
    let play: Play
    init(aPerformance: Performance, play: Play) {
        self.aPerformance = aPerformance
        self.play = play
    }
}

func playFor(aPerformance:Performance) -> Play {
    return plays[aPerformance.playID]!
}

func volumeCreditsFor(aPerformance:Performance) -> Int {
    var result = 0
    result += max(aPerformance.audience - 30, 0)
    if "comedy" == playFor(aPerformance: aPerformance).type {
        result += Int(aPerformance.audience / 5)
    }
    return result
}

func usd(aNumber:Int) -> String {
    let format = NumberFormatter()
    format.numberStyle = .currency
    format.locale = Locale(identifier: "en_US")
    return format.string(from: NSNumber(value: aNumber / 100))!
}

func totalVolumeCredits(data:StatementData) -> Int {
    return data.performances.reduce(0) { (num: Int, perf: PerormanceMapPlay) -> Int in
        num + perf.volumeCredits
    }
}

func totalAmount(data:StatementData) -> Int {
    return data.performances.reduce(0) { (num: Int, perf: PerormanceMapPlay) -> Int in
        num + perf.amount
    }
}

func amountFor(aPerformance:PerormanceMapPlay) -> Int {
    var result = 0

    switch aPerformance.play.type {
    case "tragedy":
        result = 40000
        if aPerformance.performance.audience > 30 {
            result += 1000 * (aPerformance.performance.audience - 30)
        }
    case "comedy":
        result = 30000
        if aPerformance.performance.audience > 20 {
            result += 10000 + 500 * (aPerformance.performance.audience - 20)
        }
        result += 300 * aPerformance.performance.audience
    default:
        print("error")
    }
    return result
}

func enrichPerfoemance(aPerformance:[Performance], plays:Dictionary<String, Play>) -> [PerormanceMapPlay] {
    var result: [PerormanceMapPlay] = []
    for perf in aPerformance {
        let calculator = PerformanceCalculator(aPerformance: perf, play: playFor(aPerformance: perf))
        var perormanceMapPlay = PerormanceMapPlay(performance: perf, play: calculator.play)
        perormanceMapPlay.amount = amountFor(aPerformance: perormanceMapPlay)
        perormanceMapPlay.volumeCredits = volumeCreditsFor(aPerformance: perf)
        result.append(perormanceMapPlay)
    }
    return result
}

func createStatementData(invoice:Invoice, plays:Dictionary<String, Play>) -> StatementData {
    var result = StatementData(customer: invoice.customer, performances: enrichPerfoemance(aPerformance: invoice.performances, plays: plays))
    result.totalAmount = totalAmount(data: result)
    result.totalVolumeCredits = totalVolumeCredits(data: result)
    return result
}
```
【初心者向け】Rubyで超簡単な本紹介アプリを作ってみる（カテゴリ指定ver）


#Rubyで簡単な本の紹介アプリを作成。今回はeach do とif文を使って、categoryを指定して作ってみた。

#条件
・本の名前が登録できる
・著者が登録できる
・カテゴリ一覧を表示させる
・カテゴリには番号をつける
・カテゴリが登録できる
・最後に本の名前、著者名、カテゴリを一覧表示させる

#擬似コードを考える

```ruby

puts "本の名前を登録"
    title= 名前を取得
puts "著者を登録"
    author = 著者名を取得
puts "本のカテゴリを入力してください"
categorys = 配列を使ってカテゴリ一覧を作る
カテゴリ名の横に数字をつける
each do を使ってカテゴリを表示させる
  category = カテゴリ番号を取得

もし1と入力されたら、○○と表示させる
もし2と入力されたら、○○と表示させる
もし3と入力されたら、○○と表示させる
もし1,2,3のどれでもなかったら、その他と表示させる

puts "以下の通り登録しました"
puts "本の名前は○○"
puts "著者の名前は○○"
puts "カテゴリは○○"

```


#実際にコードを書いていく

```ruby

puts "本の名前を登録"
    title= gets.chomp
puts "著者を登録"
    author = gets.chomp
puts "本のカテゴリを入力してください"
categorys = ["小説","ノンフィクション","ビジネス書"]
number = 1
categorys.each do |category|
  puts "#{number}：#{category}"
  number += 1
end
  category = gets.chomp

if category == "1" then
  category = "小説"
elsif 
  category == "2" then
  category = "ノンフィクション"
elsif
  category == "3" then
  category = "ビジネス書"
else
  category = "その他"
end

puts "以下の通り登録しました"
puts "本の名前は「#{title}」"
puts "著者の名前は「#{author}」"
puts "カテゴリは「#{category}」"

```


#動作確認
```
本の名前を登録
宇宙の歴史
著者を登録
宇宙太郎
本のカテゴリを入力してください
1：小説
2：ノンフィクション
3：ビジネス書
2
以下の通り登録しました
本の名前は「宇宙の歴史」
著者の名前は「宇宙太郎」
カテゴリは「ノンフィクション」
```
上記のような感じで出来ていたら面白いかも。



#ポイント

・categorysの中にカテゴリを複数用意
・categoryをeach doで複数表示させる
・categoryの横には数字をつけたいので、putsにnumberをつける
・数値は0からだと違和感があると思ったので1から表示させるようにした（number = 1とした）
・もし1を選択された場合、小説と表示したかったため、if文で1を小説に変換した。
・カテゴリ一覧以外が入力された場合はその他と表示させた




以上です。
ちょっと思ったのが、if文使わなくても1を小説に2をノンフィクションと変換して表示させることって出来るのかも？
間違い、もっと良い書き方等ございましたら教えていただけますと幸いです。

最後までみてくれてありがとう。
WARN Selenium [DEPRECATION] Selenium::WebDriver::Chrome#driver_path= is deprecated. 対策

某所の申し込みフォームを自動入力するツールを久しぶりに起動したらこんなメッセージがでたのでなんとかする。

といっても `Selenium::WebDriver::Chrome#driver_path=` を使っているコードはない。GEMの内部ということでGemfileを以下のように編集して `bundle update` すればOK。

``` diff
-gem 'chromedriver-helper'
+gem 'webdrivers', '~> 4.0'
```

そもそも `chromedriver-helper` が deprecated だそうで。
こんにちは

# はじめに
初めまして、hart1729といいます。今更ながら始めてみました、よろしくお願いします。
コメントや指摘など下さると嬉しいです。
##自己紹介
- 修士2年(2020年6月現在,21卒)
    - 学部、修士共に数学科
    - 専門は整数論
- エンジニアインターンの経験あり(3週間)
- ブログは初めて
- 数オリ予選突破経験あり
- Atcoder:水(Rating1300ぐらい)

よろしくお願いします。
【Tips】Udemy英語コースをリアルタイムGoogle翻訳

## はじめに
英語の文献に触れられるかどうかは、エンジニアとしての学習効率に大きな影響を与えます。なのに私は英語が全くできません！！

が、学習効率を上げるためにもUdemyで評価の高い英語コースを受講したい…。
と言うことで、日本語化して受講してみたので結果をまとめておきます。

## 前提環境
　OS:macOS(+Android/iPhone)
　ブラウザ：Chrome
　コース：Captionとして英語が提供されているもの↓↓↓↓
　![スクリーンショット 2020-01-07 1.47.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445937/161c258c-c2eb-295b-ac14-3707cb70131b.png)
　※English/English[Auto-generated]

## 事前準備
Chrome拡張機能に「Google翻訳」を追加しておいてください。
Chromeウェブストア：[Google翻訳](https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb?utm_source=chrome-ntp-icon)

## 設定方法
Chromeで対象のUdemy学習ページを開き、以下の手順を実施してください。

　①　Udemyのページ全体の言語を「英語」に変更しておきます。
　　　ページ下部に言語切替用のドロップダウンがあります。
　　　[![Image from Gyazo](https://i.gyazo.com/37e33d134b304445c011c48600425538.png)](https://gyazo.com/37e33d134b304445c011c48600425538)
　　　※日本語でも良いのですが[日本語]→[日本語]の翻訳に失敗とか出て面倒なので

　②　動画右端の[CC]と言うアイコンを選択し、Captionsを「Off」から「English[Auto]」に変更します。これで動画に英語の字幕が表示されるようになります。
　　　[![Image from Gyazo](https://i.gyazo.com/81ca3098437f98a61f78f0789fb7200c.png)](https://gyazo.com/81ca3098437f98a61f78f0789fb7200c)
　　　![スクリーンショット 2020-01-07 1.28.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445937/cded1cbb-83bd-cf79-d89f-2c41ba018f94.png)

　③　同じく[CC]メニューの一番下にある「Caption Setting」を選択します。
　　　設定画面から[Display under video]のトグルを有効にします。
　　　![スクリーンショット 2020-01-07 1.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445937/9780fd90-ebee-3d94-3a8b-399db4eec458.png)

　④　Chromeのアドレス横にある[Google翻訳]ボタンを選択します。
　　　表示された小画面の[このページを翻訳]を選択してください。
　　　![スクリーンショット 2020-01-07 1.36.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445937/1af41029-e3f1-66cc-35c6-64e7756956e0.png)

　補足：上記②メニューの左から２番目、書類のアイコン（Transcript)を選択すると画面右に講義内容が表示されるため、そちらを表示しても良いかもしれません。
　　　[![Image from Gyazo](https://i.gyazo.com/81ca3098437f98a61f78f0789fb7200c.png)](https://gyazo.com/81ca3098437f98a61f78f0789fb7200c)

これでリアルタイム翻訳されるようになります。
ただし、翻訳されるまで英語字幕が表示されるのが、読みにくさを助長するかもしれません笑

## 設定方法（Android/iPhone編）
基本的には同じですが、下記の手順を追加する必要があります。

　①後：右上のメニューで[PC版サイト]のチェックをONにしてください。
　④手順を変更：右上のメニューで[翻訳...]を選択します。
　　画面下部にGoogle翻訳メニューが表示されるため[日本語]に切替えてください。
　
　基本は画面自動回転をONにして、フルスクリーンで見ないと目がシパシパします。
　ただし、iPhoneはフルスクリーンにすると日本語字幕が表示できず…無念。

###非常に残念な点
　モバイルアプリでないとダウンロードができません！！！（致命傷
　そのため、wi-fi環境で事前にダウンロードしておいて通勤時に聴くと言う技が使えません。
　なんと言うか一長一短…英語が出来ないと難儀ですね。。。

## 英語で受講してみての所感
私は、スピードを0.75x倍ぐらいに落とさないと最後まで読めませでした(:ω;)

翻訳の精度としては固有名詞を直で翻訳してしまうので一瞬何のことか理解できないことが多いです。
また、同じ単語でも翻訳結果が毎回異なったりします。
総じて、連想ゲームみたいな感覚に陥って、正直内容が中々入ってこないかも(笑)

基礎学力の差は、その後の人生の成長に大きな影響を与える。
と言うのは、こういう所なんだろうなぁと（泣）どこかで気合い入れて英語も勉強しようと思います。


スマホ版の使い勝手が向上すれば、この記事を更新していこうと思います。
不備などあれば、ご指摘いただけれると嬉しいです！

よろしくお願い致しますm()m

## 参考
以下のサイトさまと内容はほぼ同じです（汗）
[英語字幕しかない講座を日本語字幕にして勉強する方法を解説する](https://kaleido01.com/udemy-zimaku/)
社会人が1ヶ月半で統計検定２級に合格した勉強法

#この記事の目的
「あの参考書も買ったほうがいいのかな…？」
「問題集もやったほうがいいのではないか…？」
と不安になる方が多いと思います。
そういった方々に「[統計web](https://bellcurve.jp/statistics/course/)と[過去問](https://www.amazon.co.jp/%E6%97%A5%E6%9C%AC%E7%B5%B1%E8%A8%88%E5%AD%A6%E4%BC%9A%E5%85%AC%E5%BC%8F%E8%AA%8D%E5%AE%9A-%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A-2%E7%B4%9A-%E5%85%AC%E5%BC%8F%E5%95%8F%E9%A1%8C%E9%9B%86-2016%E3%80%9C2018%E5%B9%B4/dp/4788925494/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E7%B5%B1%E8%A8%88+%E9%81%8E%E5%8E%BB&qid=1578332448&sr=8-1)のみで合格可能」を伝えると同時に、合格への手助けになることが目的です。
私は実際にこの2つだけで2019年12月下旬に統計検定２級（CBT方式）を受験し、合格しました。

もちろん、問題集を解くことも理解を深めるのに大切だと思います。
しかし、その分時間も取られます。（私の場合は会社に行きながら）資格勉強をするのは大変です。
資格の勉強に時間を費やすよりも、資格取得後に得た知識のアウトプットに時間に費やしたほうが理解は深まると私は考えています。（…という建前を盾に、資格取得後も怠ける「意識“だけ”高い系」にならないよう注意も必要ですが…）

#費やした勉強時間
平日は休憩時間や通勤時間も使って、1-2時間。
土日もなんだかんだ1-2時間しか確保できませんでした。

#使用した教材
・[統計web](https://bellcurve.jp/statistics/course/)
![2020-01-08 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479337/14e9dcc8-7aa4-b6cd-c382-53f6896338fa.png)

無料で使用できるサイトです。説明と練習問題があります。
２級にでないところも練習問題として出てくるため、軽く１周して過去問に早く進みます。
過去問で分からないところを確認するために後に何度もお世話になります。

・[過去問](https://www.amazon.co.jp/%E6%97%A5%E6%9C%AC%E7%B5%B1%E8%A8%88%E5%AD%A6%E4%BC%9A%E5%85%AC%E5%BC%8F%E8%AA%8D%E5%AE%9A-%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A-2%E7%B4%9A-%E5%85%AC%E5%BC%8F%E5%95%8F%E9%A1%8C%E9%9B%86-2016%E3%80%9C2018%E5%B9%B4/dp/4788925494/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E7%B5%B1%E8%A8%88+%E9%81%8E%E5%8E%BB&qid=1578332448&sr=8-1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479337/608954ff-b013-1235-93b7-88cc7d08cd36.png)

9.5割の完璧を目指します。
「これを問われている時はこの式を使う。」「なぜこの選択肢ではないのか？」を他人に説明できるレベルまで繰り返し、解きます。
最初はだいぶ苦戦すると思います。おすすめは3回分とりあえず解き、9.5割を完璧にしてから次の3回分を解く手法です。
過去問は出題範囲にバラ付きがあるので、「この問題にはこの式を使う。」という力を3回の過去問の中から比較することで身に着けさせます。

9.5割にしているのは、統計検定２級の性質に起因しています。
統計検定２級は上位合格者を表彰する制度があり、相当実力が無いと解けない難問が存在します。
問題は易問８割＋難問２割の構成で、合格点は６割です。過去問の１００％理解を目指しつつも、全ての難問の理解は妥協します。
1週間後の100%より3日後の7割です。（[ソフトバンクバリュー](https://group.softbank/corp/about/philosophy/value/)より）![2020-01-07 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479337/cbb6ee7a-dba2-7d31-fa60-df2f2c9eaed0.png)

６回分ほぼ全てを他人に説明できるレベルまでいけば合格は間違いないでしょう。気づいたら過去問を３周はしているはずです。私は統計Webを開くのが鬱になるくらいお世話になりました。


#さいごに
統計検定２級合格を祈っています。
M5Stick VをuPyLoaderで動かす時のメモ

##概要
M5Stick Vにファイルを入れるやり方を調べたのでメモとして書きます。

行う処理は、今回は簡単に「Hello World」と文字列を出力させていきます。
こちらのリンクの回と同じ処理です。↓
[M5Stick Vで「Hello World」を出力するまでの最短ステップ(リンク)](https://qiita.com/aki_suga/items/5a5c959deb1a61afe11b)

##準備
使用するPC： MacBook Air
M5Stick V本体
USB Type-Cケーブル

##uPyLoaderをダウンロード

こちらのGithubのリンクからダウンロードします↓
[Githubのリンク](https://github.com/BetaRavener/uPyLoader/releases)

macOSの方は0.1.3が最新です。
![スクリーンショット 2020-01-05 13.51.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/0157a4a3-0074-741a-95a7-2e8c9a8ca707.png)

##M5Stick Vと接続する。
USB Type-Cケーブルを使いPC本体と接続します。

次に上でインストールしたuPyLoaderを起動します。
![スクリーンショット 2020-01-07 1.33.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/c4115444-b8f5-ca47-23af-dc824bd2b78e.png)

左側がローカルのフォルダ、右側がリモートで繋いでいる先のフォルダです。
M5Stick Vをコネクトしていきます。

###コネクトする際の注意！
uPyLoaderとM5Stick Vをコネクトする際は、M5Stick V本体のボタンAを長押ししながらコネクトボタンを押します。
そうすることで、M5Stick Vの起動時に行われるbootファイルの実行を回避することができます。
![スクリーンショット 2020-01-05 13.56.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/6e5afd45-c06a-5232-8e47-d3375c751758.png)

こちらエラーみたいに見えますが、接続成功した時にでるポップアップだそうです。

![スクリーンショット 2020-01-05 14.07.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/5bac0dcb-7859-e09a-90b6-3d27cf91375f.png)
こちらの情報は、Switch ScienseのM5Stick V購入ページにも記載されています。

###ファイルを転送する前に
接続したら、ファイルを転送していくのですが、その前に環境を整えます。

Fileからinit trasfer filesを実行します。
すると、右側のM5Stick Vのフォルダに`「__download.py」`と`「__upload.py」`というファイルが転送されているかと思います。これで準備完了です。

お好きなコードエディタで、`「helloworld.py」`などと適当なフォルダ名でファイルを作りましたら、それをuPyLoaderの左側の画面で選択していきます。。

ちなみに、今回のファイル（helloworld.py）の中身は以下のようなコードです。

```
import lcd

lcd.init()
lcd.draw_string(100, 100, "hello world", lcd.RED, lcd.BLACK)
```

![スクリーンショット 2020-01-05 14.00.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/46968011-1a8f-66dc-86bf-90716491d842.png)

このように選択しましたら、**「Transfer」**というボタンを押します。![スクリーンショット 2020-01-05 14.00.00のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/0dcbbf46-3efa-f1c9-b286-4318b35e41f6.png)

分かりにくいですが、画面の下の方にあります。
これで、ファイルを転送できたかと思います。

そして、実行していきます。

![スクリーンショット 2020-01-05 14.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/976a0062-581e-71b0-3afd-27e823919b98.png)

こちらの**「Execute」**ボタンで実行することができます。

![IMG_9717.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/6711729d-c626-cf88-41cf-f81e73bcf255.jpeg)

このような画面が確認できるかと思います。

###おまけ
また、uPyLoader上で転送したファイルを編集することもできます。
ファイルを選択し、もう一度クリックすると編集画面が開きます。

![スクリーンショット 2020-01-05 14.14.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/a3cd1581-9c07-1a97-ad21-df56f294bfcd.png)

こちらが編集画面になります。
javascript の最新技術情報 (ECMAScript2020) を確認する方法

# はじめに

three.js で簡単な星空を描画するプログラムを作成して以降も、何かと javascript を使ってきましたが、ふと、javascript で実装される新機能などはどのようにして決定するのかという疑問を持ちました。

調べた結果、Ecma International による正式仕様となるまでの過程が公開されているようなので、備忘のために投稿しました。

# 実装する機能を決定する組織等について

Ecma International という情報通信システムの分野における国際的な標準化団体の元で、**ECMAScript (エクマスクリプト)** という javascript の標準仕様として、手続きが行われています。

ECMAScript は、ECMA-262 という規格番号で標準化されており、Edition 番号で更新が行われています。
2015年までは 単純に 1, 2, 3, ... 6 といったような形でしたが、2016年以降はその年を Edition 番号とするようになりました。

今年は 2020年なので、Edition は「ECMAScript 2020」となります。

# 新仕様が確認できるページ

- 仕様情報：[Draft ECMA-262](https://tc39.es/ecma262/)
- ステータスや策定プロセス、各種文書：[emca262 の Github](https://github.com/tc39/ecma262)

# 正式仕様になるまでのプロセスとスケジュール

プロセスについては、The TC39 Process (https://tc39.es/process-document/) のページに記載されています。
0 から 4 のステージがあり、stage4 になってかつ EMCA 総会で承認されると、正式仕様となります。

スケジュールについてですが、[The TC39 Process](https://tc39.es/process-document/) の「Spec revisions and scheduling」に記載されている以下のスケジュールを経て、毎年 7 月に承認されて正式仕様となります。

- 　　～ 1月：新仕様の候補が決定されます。
- 2月 ～ 3月：ロイヤリティーフリーで使用できます。
- 　　　 3月：TC39 によって、stage4 のものが新仕様として組み込まれます。
- 4月 ～ 6月：ECMA CC と ECMA GA によるレビューが行われます。
- 　　　 7月：ECMA 総会にて、正式仕様として承認されます。

# 新仕様の候補(本投稿公開時点：1/7)

新仕様の候補を確認したい場合は、emca262 の Github の README.md にある [Finished Proposals](https://github.com/tc39/proposals/blob/master/finished-proposals.md) で見ることができます。
具体的には、「Expected Publication Year」列が 2020 のものとなります。

ただ、stage4 になったけれども諸事情により stage3 になっている仕様 (例えば、「for-in mechanics」) があるため、実際に Finished Proposals の一覧から各 proposal の詳細を見た方がよいと思われます。

次の 8 つが新仕様の候補となっていました。

- [String.prototype.matchAll] (https://github.com/tc39/proposal-string-matchall)
- [import()] (https://github.com/tc39/proposal-dynamic-import)
- [BigInt] (https://github.com/tc39/proposal-bigint)
- [Promise.allSettled] (https://github.com/tc39/proposal-promise-allSettled)
- [globalThis] (https://github.com/tc39/proposal-global)
- [for-in mechanics] (https://github.com/tc39/proposal-for-in-order)
　⇒現在は **stage3**
- [Optional Chaining] (https://github.com/tc39/proposal-optional-chaining)
- [Nullish coalescing Operator] (https://github.com/tc39/proposal-nullish-coalescing)
　⇒現在は **stage3**

なお、各詳細ページに使用例が記載されていますので、非常に参考になります。

# 最後に

各新仕様の候補の具体的な使い方についてはこれから確認していくことになりますが、いったんは javascript の最新の仕様情報をどのように確認するのかを纏めてみました。

皆様の情報収集の一助になれば幸いです。

# 参考

- [JavaScriptの次の仕様ES2019で追加されることが決定した新機能まとめ] (https://qiita.com/tonkotsuboy_com/items/07f8ef98abf89250b90c)
RubyとRailsの気になる単語

時々あの、あれ、あの〜意味なんだっけって単語を記していきます。
あくまで一言で行きたい。深追いはしない派。

- オブジェクト `クラスの参照とインスタンス`
- クラス `入れるべきデータとメソッドを記載した設計図`
- クラスの参照 `オブジェクトの所属するクラス`
- インスタンス `クラスの設計図から出来たもの`
- インスタンス変数 `クラス内であれば全メソッドで使用することができる、@で定義`
- module `ミックスイン、ネームスペースを提供`
- include `インスタンスとしてメソッドを追加`
- extend `クラスとしてメソッドを追加`
- ブロック `do~endもしくは{}で囲まれた処理のカタマリ`
- Proc `ブロックを持ち運び便利なオブジェクトにしたもの`
- Lambda `Procオブジェクトを作る方法の一つ。Procとの違いは引数チェックする＆returnした後もメソッドを実行し続ける`
- joins `sqlでINNER JOIN`
- INNER JOIN `関係があるデータだけを取ってきてくれる`
- includes `データの先読みをしてキャッシュしてくれる`
- Gemfile `Railsアプリで利用するgemが記述されているファイル`
- Gemfile.lock `Gemfileをもとに実際にインストールしたgemリスト`
- Private `オブジェクトの外側からコールはできない`
- Protected `同じクラスのオブジェクトからならコールは可能`
- セッション　`サーバー側に保存するユーザー情報`
- クッキー　`ブラウザを通じて配布され、パソコンのハードディスクドライブ上に一時的に保存される「小さいファイル」`
- ActiveRecord `OR Mapper (Object <> RDB)`

終わりなんてない。

## 特に面接で聞かれそうなやつら
※追記していきます。

cookieとsessionの違い
HTTP通信のgetとpostの違い
引数とは
プロパティとメソッドの違い
Ajaxとは
requireとincludeの違い
例外処理とは
SQLインジェクションとは？
仮想環境とは？
gemとは？
配列とは？
Nuxtでthisから呼び出すライブラリ, モジュールなどを共通化する

## thisからのアクセス
例えば`$store`, `$router`, `$auth`にアクセスする場合`this.$store`, `this.$router`, `this.$auth`など**this**からアクセスするかと思います。
それはそれで問題ないのですが、同じ処理も増えてきた時に共通化を行う必要が出てきました。
Mixinsを使うだろうという予想はつきましたがNuxtドキュメントでは思うようなものが見つからなかったので共有です。

``` mixins/router.js
export const router = {
  methods: {
    toHoge() {
      this.$router.push('/hoge')
    },
    toFoo() {
      this.$router.push('/foo')
    },
  }
}
```

``` pages/hoge.vue
<script>
import { router } from '~/mixins/router.js'

export default {
  mixins: [router]
}
</script>
```

以上です。これでtoHoge()などを呼び出せました。
とりあえず目的は達成出来たのでこれで良しとします。思ってたものではなかった場合すみません。
GitHub Flowについて確認　（自分用）

・masterブランチを常時デプロイ可能状態とする。

・開発時は、masterブランチから 他ブランチを切って開発

(開発ブランチでコミット、終わらなくても、定期的にpush。共有の為）

・masterブランチへ 開発ブランチから pull request

・必ずコードレビューを受ける

・承認後、masterに開発ブランチをmerge

・merge後masterブランチをデプロイする　
（＝テストも自動化が求められる）


*Reviewerの追加＊
settings内のcollaborators から検索、add
"素人銀行員"が1週間でPython 3 エンジニア認定基礎試験に合格した方法

Python3エンジニア認定基礎試験について、Qiitaにはエンジニアの方が「簡単だぜ」というトーンでマウントした記事が多いと感じたので、非エンジニアの方に役に立てばと思い書きました

プログラミング初心者が試験の合格だけを目的に「成功談」「失敗談」を簡潔に書きます

#私のスペック
 ・プログラミングを普段しない銀行員
 ・新入社員研修で、COBOLを3か月ほど学んだが挫折。以後、触らず。

#試験結果
　・750点/1000点（合格点700点：合格率7～8割）
　・勉強期間は、年末年始の7日×3時間

#理想の勉強方法
#####0)Pythonのインストール（私はjupyter notebookをインストールしました）【0.5h】

#####1)試験範囲の確認【0.1h】
   試験概要や出題問題数に目を通しましょう
　 https://www.pythonic-exam.com/exam/basic

#####2)Webで超基礎を学習（WEB INTO DIVE）【5h】
　 必ず、手を動かしながらPythonで色々なパターンを実行しながら進めるのが重要です
　 https://exam.diveintocode.jp/exam

#####3)模擬試験＋復習【5h】
   早い段階で模擬試験を一回解くのが重要です。やらなくて良いことが何かここで抑えましょう。
　 https://exam.diveintocode.jp/exam

　 〇、×どちらも内容が理解できるまで、以下のサイト等を参考に復習しまくりましょう。
　 https://qiita.com/Lily0727K/items/87304160e09aff5e8a18

#####4)Pythonチュートリアル流し読み【5h】
   いきなり読むと嫌気がさすので、概要が纏めてある以下リンクを読みます
   https://qiita.com/R1ck29/items/17f8bcf70feb2c3d516c

　　いよいよチュートリアルを一読しますが、すべての理解は不要です。
　　模擬試験で出た内容が書いてある箇所の前後をチェックしていく感覚で十分です

#####5)Pythonチュートリアル復習＆模擬試験２回目【5h】
　　チュートリアルの重点ポイントを出題数と重ね絞ります。
　　1,2,3,4,5,8,10,12,14章がコスパが良いので、ここを中心に勉強します

　　模擬試験2回目を受験し、復習をして対策完了です！！


#私がしてしまった勉強方法（失敗談含む）
#####1)Pythonチュートリアルから読む
　　　　難しすぎて最初の2ページで本棚行き。"素人は絶対に最初に手を出さないでください！！"
　　　
#####2)Pythonスタートブック（辻真吾　著）
　　　　初心者向けの名著ですが、範囲が広すぎて試験対策には不向き。
　　　　「8章関数を作る」で難しく挫折・・・
　　　　ただ、プログラミング初心者が「クラスって何？」とかの感触を掴みたいということであれば、1章～3章だけ勉強するのはあり。
　　　　

#試験中に思ったこと
 ・問題のイマイチ良く分からなくても、選択肢から消去法で結構絞れる（明らかに違う回答が混在）
 ・7割程度、模擬試験と類似の問題（まるっきり同じ問題はなしなので、内容の理解は必要）
 ・時間は余る、見直し込みでも30分あれば十分（試験時間は60分）
 
#（余談）私がこれから目指すこと
 ・ビジネス目線で、AI/人工知能の案件企画・組織作りを実施しています。中身も知らないと、伸びしろに限界があると感じているので以下の勉強を継続したいと思います。
　2019年度4Q：「udemy 実践Pythonデータサイエンス」「kaggle参加」「AWS関連の資格」
　2020年度：「ディープラーニングE検定」

------------------------------
###Facebook友達申請、フォロー
https://www.facebook.com/profile.php?id=100003256287953
###人口知能×金融事業のコミュニティ（主催）のフォロー　よろしくお願いします
https://techplay.jp/event/764087
【形式手法】形式手法入門 VDM++チュートリアルをやってみた

# チュートリアル資料
　以下サイトから、チュートリアルのドキュメントと、チュートリアルで使用する演習問題がダウンロードできます。

[形式手法入門 VDM++チュートリアル（IPA）](https://www.ipa.go.jp/sec/old/seminar/20160229.html)

# チュートリアルの概要
- VDMツールのインストールと設定（Overture Tools、VDMTools）
- VDM++言語入門（例題を通じた説明等）

# 読み替えを行った箇所など
　チュートリアルの資料が2016年時点のものであるため、現状の最新バージョンに即していない記載や、やや分かりにくい記載がありました。以下に補足します。ちなみに私が実行したのは、Windows版です。

- p10：インストーラは、VDL Toolsの「VDM-SL」ではなく「VDM++」をダウンロードしました。
- p18 : セットアップ直後は、プロジェクトがまだないので本ページの設定（プロジェクト設定）ができませんでした。そのため本手順は、チュートリアルプロジェクトの読み込み後に実施しました。
- p23 : workspaceに指定するフォルダは、「\seminar_tokyo_20160229-02\Fare0」としました（その下にもFare0フォルダがありますが、それを指定するとうまくいきませんでした）
- p26 : 具体的な操作手順が記載されていなかったので補足します。「Fare0_testspec.vdmpp」を右クリックして、「Debug Configurations..」を実行しました。Nameには任意の名前を入力し、ProjectはFare0を指定、Entry Pointは「Serach」ボタンから「Test()のrun()」を指定しました。
- p28 :具体的な操作手順が記載されていなかったので補足します。メニューバー「実行⇒初期化」を行うと、実行ウインドウが表示されます。実行ウインドウ株の「>>」に、資料記載のコマンド（traces UseFare0）を入力し、エンターを押します。
- p29 : 資料上では「Window -> Open Perspective」となっていますが、存在しませんでした。そのため、「Window ->　Perspective -> Open Perspective」と操作しました。また、画面右部（CT Overviewタブ）のT0、T1はそれぞれ右クリックし「Full Evaluation」を実行しました。

# 感想
　チュートリアルを通じて、開発ツールの使い方や、言語仕様の雰囲気はつかめました。なんだかよく分かっていない部分も多いので、次は一から実装してみたいと思います。

# （参考）使用したインストーラ
- [VDMToolsインストーラ(9.0.7)]( http://fmvdm.org/vdmtools/index-ja.html)
- [The Overture Tool (2.7.2)](http://overturetool.org/download/)
nodeを終了する方法(コマンド)４選

#nodeを終了する方法4選

###①　.exit
.exit と打つことで終了出来ます。

```
[name]MacBook-Pro:[filename] [name]$ node
Welcome to Node.js v13.5.0.
Type ".help" for more information.
> .exit
[name]MacBook-Pro:[filename] [name]$ 
```

###②　Ctrl + d

Ctrlを押しながらDを入力することで終了出来ます。
こちらが一番簡単ですが、２回Ctrl + Dを入力してしまうとターミナル自身が終了してしまうので注意が必要です。

```
[name]MacBook-Pro:[filename] [name]$ node
Welcome to Node.js v13.5.0.
Type ".help" for more information.
>　 (ここで Ctrl + dを入力)
[name]MacBook-Pro:[filename] [name]$ 
```

###③　Ctrl + c を２回入力

```
[name]MacBook-Pro:[filename] [name]$ node
Welcome to Node.js v13.5.0.
Type ".help" for more information.
> 　(ここで Ctrl + cを入力)
(To exit, press ^C again or ^D or type .exit)
>   (ここで Ctrl + cを入力)
[name]MacBook-Pro:[filename] [name]$ 
```

###④　Ctrl + c の次に　Ctrl + d
表示は、③と同じ表示になります。
②と同様に、二回Ctrl + dを入力してしまうとターミナル自身が終了してしまうので注意が必要です。

```
[name]MacBook-Pro:[filename] [name]$ node
Welcome to Node.js v13.5.0.
Type ".help" for more information.
>  (ここで Ctrl + cを入力)
(To exit, press ^C again or ^D or type .exit)
>  (ここで Ctrl + dを入力)
[name]MacBook-Pro:[filename] [name]$ 
```

#最後に
ターミナル終了の可能性がない、①か②をおすすめします。
コンピュータサイエンスを分野ごとに考える

# はじめに
大学でコンピュータサイエンスを学んできたものの、忘れている部分もあり、改めて基礎知識から学び直し、体系的に知識を再構築したいと思い、コンピュータサイエンスを分野ごとに整理した記事です。
**気になった点には気軽に編集リクエストを出して頂けると幸いです🙇‍♂️**

下記のサイトを参考にさせていただきました
- [Things I Don't Know as of 2018](https://overreacted.io/things-i-dont-know-as-of-2018/)
- [僕がコンピュータサイエンスに関して知らないこと](https://blog.p1ass.com/posts/i-do-not-understand-cs/)

# コンピュータサイエンス
## データベース
- DBMS
- NoSQL
- データモデル
- 正規化
- 問い合わせ最適化/障害対策/障害復旧
- 同時実行管理
- 分散管理
- ACID特性
- データベースセキュリティ

## OS
- OSの歴史
- UNIX/Bash
- プロセス/スレッド/スケジューリング
- プロセス間の通信と同期
- 実記憶/仮想記憶の管理
- システムコール/カーネル
- コンテナ(仮想化技術)

## データ構造とアルゴリズム
- オートマトン/チューリングマシン
- クラスP/NP完全/NP困難あたりの話
- スタック/キュー/リスト/木構造/ハッシュテーブルなどのデータ構造
- バブルソート/クイックソートなどのソート
- 二分探索/線形探索などの探索

## セキュリティ
- HTTPS/SSL
- 暗号化
- 共通鍵暗号/公開鍵暗号
- 攻撃手法と対策
- ブロックチェーン

## ネットワーク
- TCP/UDP/その他プロトコル
- HTTP/1.1, HTTP/2
- OSI参照モデル
- 双方向通信
- リアルタイム通信
- LAN/WAN
- 運用と管理(高信頼化)

## プログラミング
- 各種パラダイム
- オートマトン/チューリングマシン
- コンパイラ/アセンブラ/リンカの各動作
- インタプリタ

## ハードウェア
- 論理回路(組み合わせ回路/順序回路)
- CPU/ALU/算術演算の実現方法
- メモリ/メモリアーキテクチャ
- 並列アーキテクチャ
- MIPSアーキテクチャ
- GPU
- キャッシュ
- 二次記憶

## コンピュータグラフィックス
- 座標系/座標変換
- レンダリング手法

## 開発管理
- ソフトウェア開発モデル
- プロジェクト管理/要求定義
- 構造化分析/オブジェクト指向分析
- アーキテクチャ設計/モジュール設計/モジュール分割
- ソフトウェアテスト手法/保守/運用/再利用
- DevOps

## 情報数学
- 集合/確率論
- 情報量/エントロピー
- 情報源モデル/通信路モデル
- 符号化/誤り検知と訂正
- 統計学
- 線形代数
- 微積
[AWS S3ファイルアップロード] Error retrieving credentials from the instance profile metadata server.


こちらの[Qiita記事](https://qiita.com/nobu0717/items/51dfcecda90d3c5958b8)を参考に、LaravelでAWS S3へ画像をアップロードする機能を実装しようとしていたら、以下のエラーが発生しました。

*Aws\Exception\CredentialsException
Error retrieving credentials from the instance profile metadata server. (cURL error 7: (see https://curl.haxx.se/libcurl/c/libcurl-errors.html))*
<img width="890" alt="スクリーンショット 2020-01-06 23.56.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406662/3c3f77ab-22cd-41a2-c7b1-425f9345c988.png">



こちらの[stackoverflow](
https://stackoverflow.com/questions/44703286/error-retrieving-credentials-from-the-instance-profile-metadata-server-laravel)の回答の通り、以下のコマンドを叩いたら解決しました！！

```terminal
$ php artisan config:clear
```

日本語での解説がなかったので、こちらでシェアします〜！！
ROSでRealSenseを真面目に動かしてみる２

#ラジコンの動かし方がわからない
それっぽく点群の表示ができましたが、本体はどうやって動かせば良いのかよくわかりません。
JOYパッドを使ってモーターを動かすところからやってみるのが近道？

#JOYパッドの入力をROSで確認します
大変ためになるこちらのページを参考にJOYパッドを使えるようにします。
ただし、私はmelodicを使っているので、その部分は変更しながら打ち込みます。
[ROS講座07 joyプログラム](https://qiita.com/srs/items/9114bb3c27a148e0b855)

JOY用のパッケージのインストール

```
sudo apt-get install ros-melodic-joy
sudo apt-get install ros-melodic-joystick-drivers
```

![31DF59AB-7C46-4FF4-9860-93A083722236.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/fb01db82-2606-6537-f94a-0d43f0403e1c.jpeg)

ROS講座07と同様に３つのターミナルに打ち込みます。

```
roscore
```

```
rosrun joy joy_node
```

```
rostopic echo /joy
```

![Screenshot from 2020-01-07 00-22-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/d5441132-6897-081e-60e4-341677b565d4.png)

ボタンを押すと、ずらずら数字が流れてボタンの入力が流れます。
ROSでJOYパッドの入力を取るのはすごく楽ですね。

ROSのプログラムを作るために、自分のパッケージを作ります。

```
cd catkin_ws/src
catkin_create_pkg mypackage std_msgs rospy roscpp
```
[ROS講座07 joyプログラム](https://qiita.com/srs/items/9114bb3c27a148e0b855)
ここを参考にJOYパッドからの入力を取るコードを書きます。

```
cd ~/catkin_ws
catkin build
```
![Screenshot from 2020-01-07 21-31-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/a0461320-dcbe-4987-845a-010c4c3adf38.png)

方向転換のボタンが左のアナログボタンに配置されていて使いにくいですが、それっぽく亀が動かせます。
次はモーターを動かしたいですね。

pip3が入ってなかったのでインストールしてモータドライバを入れます。

```
sudo apt-get install python3-pip
pip3 install Adafruit_PCA9685 --user
sudo i2cdetect -y -r 1
```

```
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: 70 -- -- -- -- -- -- --                         
```

I2Cが接続されていることを確認します。

[ros-pwm-pca9685](https://github.com/dheera/ros-pwm-pca9685)


[続き](https://qiita.com/t_kumazawa/items/e64a02490a6415512ff1)
SharePoint-PowerShell 導入編

<p>PowerShellとはコマンドプロンプトの後継アプリです。</p>
<p>Windows10にPowerShellは標準で入っています。<br />「Microsoft PowerShell ISE」を使用します。<br /> 「Microsoft PowerShell ISE」を使ったことが無い場合は、下記がオススメ。</p>
<p></p>
<p><a href="https://tonari-it.com/">いつも隣にITのお仕事 | 毎日の業務が楽チンに！</a><br /> 「Windowsのポチポチ業務を爆速化できるPowerShell、はじめのハードルぐーーんと下げてみます！」<br /><a href="https://tonari-it.com/windows-powershell-start/">https://tonari-it.com/windows-powershell-start/</a></p>
<p></p>
<p>SharePointをPowerShellで操作する以降の記事のスクリプトを使用する場合には<br /> 「SharePoint Online Management Shell」というPowerShell用モジュールのインストールが必要です。</p>
<p></p>
No such file or directory でBuildができない😭

#Buildのエラー⚠️
オンラインスクールで提出した課題がBuildできませんとの指摘が
メンターからきたので、改善のための手順をメモとして記します。

メンターへの課題の提出はGitHubを通じて行うのですが、
GitHubからプロジェクトをダウンロードしてBuildすると
エラーが発生するとのこと。

プロジェクトナビゲーターでファイルの登録状況を確認すると、
次のようになっている模様。

<img width="272" alt="スクリーンショット 2020-01-06 23.24.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489221/ee5853cd-edb6-62a8-876d-fbddc75707ae.png">

自分のMac上では問題なくBuildされるのに。。。
どうしてなの〜😭

#エラーで表示されているmp3ファイルに原因が！
プロジェクトナビゲーターの
「chromeSound.mp3」をクリックして
右側のFile Inspectorを確認してみると

<img width="259" alt="スクリーンショット 2020-01-06 23.38.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489221/9db36f76-c688-02b0-1548-b3d5b0194f8e.png">

このように、Location欄の下に「../../../../../Downloads/chromeSound.mp3」
と表示されていることが確認できます。

これは、chromeSound.mp3ファイルの場所が
Downloadsというフォルダの中にあることを示しています。
自分がBuildしている環境では、そこにmp3ファイルが存在しているため
エラーになっていませんでしたが、**Downloadsフォルダはプロジェクトの
フォルダと別の場所に存在しているため、Gitでcommit/pushしても
フォルダはアップロードされず、メンターがGitHubにアップロード
されたものをダウンロードしてBuildしてもエラーになってしまった**ようです。

#ファイルの登録を修正
一度該当のファイルを削除し、ファイルを再登録するのですが、
そこで注意するべきは、
<img width="726" alt="スクリーンショット 2020-01-06 23.44.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489221/276d3424-9376-0898-a768-b486ee017955.png">

この画面で**Copy items if neededにチェックを入れる**こと!
このチェックを外したままコピーすると、
ファイルをプロジェクトにコピーせず
コピー元のフォルダのファイルを参照するようになってしまい、
**自分の環境意外だとBildできなくなってしまいます😭**

#登録が問題ないか確認
プロジェクトナビゲーターに該当ファイルを登録したら、
File Inspectorの表示を確認します。
<img width="260" alt="スクリーンショット 2020-01-06 23.49.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489221/2bbc57ad-4514-a2dd-e44a-a1653bbec80e.png">

上記のようにLocation欄が「../Downloads」なしで
該当ファイル（今回の場合だと「chromeSound.mp3」）だけの
表示になっていたら、正しくmp3ファイルをプロジェクト内に
コピーした上で登録できていることが確認できます💪
AWSのアクセスキーをパラメータストアを用い安全に取り出す

## まえがき

昨今AWSのアクセスキーをGitHubに誤って上げてしまいオギャーなことになるケースがあるそうです。
それを未然に防ぐ手段として、環境変数に値を埋め込みそれを読み込む手法などがあるそうですが、AWSのSystemManagerにパラメータストアと言った機能があることを知りました。
今回はこの機能を用い、Pythonからアクセスキーの取得を行ってみたいと思います。

## 追記

以下のようなコメントをいただきました。

>アクセスキーを利用せずにIAMロールを利用したほうが、なおよいかと思いますがいかがでしょうか。

仰るとおりです。。。今回は、こちらの諸事情でアクセスキーが必要となるケースだったこともあり、当手法でアクセスキーの取得を行った次第です。
ですので、 **そのような事情がない場合でしたら、IAMのロールを使用しましょう。**

なお、このパラメータストアはECSなどで環境変数を設定する際には有用な機能のようです。例として、DBのパスワードなどを平文で環境変数に埋め込む必要がなくなるなど挙げられていました。
（参考：[ECSでごっつ簡単に機密情報を環境変数に展開できるようになりました！](https://dev.classmethod.jp/cloud/aws/ecs-secrets/)）


## 検証環境

`Amazon Linux AMI release 2018.03`

## 実現方法

GUIで操作していきます(もちろんCLIでもできるそうです)

1. AWS SystemManagerのパラメータストアに入ります(東京リージョンなら[ここ](https://ap-northeast-1.console.aws.amazon.com/systems-manager/parameters/))
2. こんな画面が出てきます![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534310/77571485-70a8-fcdb-40ec-5d45ed462830.jpeg)
3. パラメータの作成をクリック
4. 以下フォームを埋める
  - 名前： 「/project/keyname」のように記入(/を増やす、つまり「/project/dev/keyname」のような管理も可能)
  - 説明： 値の説明
  - 利用枠： 標準を選択(大規模なシステムの場合だと上限値を増やす必要があるとか)
  - タイプ： 任意のものを選択。安全な文字列を選択すると、KMSでデータを暗号化してくれる。
  - 値： 格納したい値を記入

  今回は以下のような設定で値を作成。値を記入後は `パラメータの作成` を押下。

```
名前： /project/test
説明： test param
利用枠： 標準
タイプ： 安全な文字列
KMSの主要なソース(安全な文字列を選んだ場合選択)： 現在のアカウント
KMSキーID： alias/aws/ssm
値： hello project
タグ： 空
```

  うまくいけば、こんな具合にレコードが作成されると思います。![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534310/d82d25bf-2c38-3329-83cd-f593d1db4775.jpeg)

コンソール側で行うことは以上です。

次は、EC2インスタンス上での作業です。

1. aws-paramstore-py をインストール  

    `pip install aws-paramstore-py`
    特に依存も無くインストールされるはず。

2. 以下コードの実行で、値( `hello project` )が取得できる

    ~~~python
    from boto3.session import Session
    import aws_paramstore_py as paramstore

    ssm = Session(profile_name='default').client('ssm', region_name='ap-northeast-1')
    params = paramstore.get('/project', decryption=True, ssm_client=ssm)
    print(params['test'])
    ~~~

## ハマりどころ

ってほどでも無いですが、KMSで暗号化した場合、 `aws_paramstore_py` から返ってくる値は暗号化された情報がそのまま渡されるのでぐぬぬなことになります。
作者の[GitHub](https://github.com/akirakoyasu/aws-paramstore-py/search?q=decryption&unscoped_q=decryption)を見てみたら、 `decryption=False` のオプションがあるのを発見。
こいつを `True` にしたら復号化されました。めでたしめでたし。

## 参考

- [パラメータストアからEC2に環境変数を設定する](https://qiita.com/th_/items/8ffb28dd6d27779a6c9d)
- [使ってますか？ パラメータストア](https://qiita.com/wizpra-koyasu/items/824e59aa24903a122453)
- [akirakoyasu/aws-paramstore-py](https://github.com/akirakoyasu/aws-paramstore-py)
GitHub Pages上のVue.jsアプリでリロードすると404になる場合の対応

# はじめに
Vue.jsで作成したSPAのWebアプリをGitHub Pagesで公開した際に、ページ上でリロードをすると404エラーとなってしまいます。
例えば、`Sample`というリポジトリでGitHub Pagesに公開していれば、`https://〇〇.github.io/Sample/`というサイトがトップページになります。
このページ上でリロードしてもエラーとはなりませんが、`https://〇〇.github.io/Sample/hoge`というページに遷移後、そのページ上でリロードすると、404エラーとなります。

# 404.htmlの作成
その対策法の１つとして、404エラーの際に表示される`404.html`を作成する方法があります。
GitHub Pagesで公開しているディレクトリ（例えばdocs）直下に`404.html`というファイルを置いておくと、404エラーとなった際に、そのページを表示します。
その404.htmlに以下のような内容を記述します。

```html:404.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <script>
        window.location.pathname = "/Sample/"; // この部分があれば大丈夫です
    </script>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>NotFound</title>
</head>
<body>
</body>
</html>
```
scriptに`window.location.pathname = "/(トップページ名)/"; `と記述することで、404.html表示時に自動的にトップページに遷移させています。

# おわりに
今回はトップページに遷移させましたが、遷移先のURLにパラメータ等をセットして、index.htmlでそのパラメータを元に再度遷移させるなどすれば、擬似的に指定したURLのページに飛ぶことができると思います。
以下の方の記事が参考になると思います。
[Github pagesでハッシュなしSPAを作る[Vue.js + vue-router] - Qiita](https://qiita.com/hiyoko3/items/64e0658439c66b16e18c)
クラウド時代の製品・サービス選定の考え方

`AWS` が世に出てもう **10年以上**です。`Azure` も**10年**超えました。

いまだに幾つものプロジェクトでの製品・サービス選定が、ソフトウェア製品時代と同じようです。その考え方に**加えて**、クラウドの選定で考えたい点をまとめてみました。ソフトウェアも商用ソフトウェアと、オープンソース ソフトウェア とで分けてみました。

**あくまで個人の見解ですー:sweat_smile:**

| 項目 | 商用ソフトウェア | オープンソース ソフトウェア | クラウド サービス |
|:-:|:-:|:-:|:-:|
| 開発主体 | 企業 | コミュニティ -自分も参加できる | 企業 |
| ハードウェアの選択 | 可能 | 可能 | 限界がある |
| データの置き場所 | 選択可能 (オンプレミスもクラウドも) | 選択可能 (オンプレミスもクラウドも) | クラウドのみ | 
| 変更の速さ | 年単位 | 月-週 | 月-週 |
| ソフトウェア費用 | ライセンス | 無料 | 使用料 |
| サポート費用 | 開発元あるいはサポート企業 | 自己責任 | 開発元あるいはサポート企業 |
| 運用主体 | 自社 (不足していたら外部へ協力) | 自社 (不足していたら外部へ協力) | 自社 と クラウド企業 |

注: クラウドサービスは、いわゆる `パブリック クラウド` を指します。

# 見えてくるもの

特にオンプレミスとクラウドの違いという観点で列挙してみます。

- クラウドサービス と オープンソース の**変化**は速い
    - もはや、**機能比較** は、殆ど**意味がない!**
        - どうせ半年もすれば、AWS, Azure, GCP は、ほぼ同じサービスを出す
            - 強いて言うなら、現時点で、GCPに PaaSの `動画配信` と(YouTubeがある?)、`全文検索`(Google Searchがある?) が無いくらい
        - **値段もほぼ一緒**
    - 機能追加の要望は出しやすい
        - 例えば、議事録作成のために、Speech to Text にて文字起こし機能を実装するのは構いませんが。いずれ、Office 365 に実装されるのでしょう。実際に議事録ソフトウェアとして OneNoteがあり、Web会議機能をもった Teams がありますからね
    - サービス利用期間は、クラウドサービス企業が決定する
        - 本当の社会インフラの様な20-30年同じものを使うことは大変難しい
        - 直球で。「いつまでも同じものが動くわけではない」
    - 必然的に**変化に対応**できる体制が必要
        - 必然的に DevOps を考える
        - バージョン管理は超大事
        - Unit Test は必然
        - 結果、自動化は進む
    - **疎結合** は常に意識したい
        - 自分のコードと、DBなどのミドルウェア
        - コードの呼び出しとしての REST と HTTP
-  ソフトウェア **+** クラウド サービス という構造
    -  商用もしくはオープンソース ソフトウェア を相手に動くものは、オンプレミスとクラウドの両方で動く
    -  特に `PaaS` には クラウド サービス のみで存在しているサービスがある。ベンダーロックインの始まりでもある
        -  Azure: Azure Data Factory, IoT Hub, Azure Machine Learning, Azure Monitor, Azure Media Services など
        -  AWS: RedShift, IoT Core, SageMaker, Elemental など
        -  GCP: Big Query, IoT, AI Platform など
-  費用の違い
    -  直接費だけでの比較が目に付く
        -  **人、電気料金** は無料ではない。GPU使うとなれば、猶更
    -  クラウドは初期費用が**0円**
-  クラウドでのデータの扱いのメリットを、オンプレミスで実現が難しい
    -  クラウドでは、データは**3重持ち**の原則
        -  1TBのストレージを買ってきても、300GBしか使えない
        -  バックアップ込み
    -  事実上**容量無制限**、バックアップ付き、監視は最低限のみというメリットを金額換算できるのか?
        -  単独で、1KBのファイルと、動画のように1TBのファイルを同じように管理できるのか?

# クラウドで採用しやすいもの
以下原則は使用量課金に由来するものが多い

- ビジネス・技術検証
- 一定の時期に多くの コンピューターリソース が必要なもの
    - テレビの番組連動。季節もの、など
- micro services
- Polyglot Persistence
    - 用途に合わせたデータサービスの選択
        - クラウドでは容量に応じた課金だから
            - 100 GB の DB 1個と、1 GB のDB 100個は **同じ料金**
            - 小さなDBの方が検索が速いわけで
        - RDB Only での限界を突破する

# 備えたい事

- 常に学ぶ姿勢
    - 変化への対応
- 公式ドキュメントを読めるように
    - クラウドはメーカーが作って運用しており、ドキュメントは必ずある
    - オープンソースのソフトウェアも、ドキュメントは必ずある
- 英語は必然
    - 日本語ドキュメントが出るのを待っていると、オープンソースのソフトウェアの恩恵はほぼ受けられない