OmniAICreator/Qiita-1.07M huggingface dataset:
View を支えるコンバーター

## はじめに

戒めの覚え書き　その２

今回は MVVM の View 層について少し掘り下げます。
View 層に定義されるロジックは描画や表示に関わるものが基本となり、この実装をサポートするための仕組みがいくつか用意されています。ここではコンバーターについてまとめます。

[前回](https://qiita.com/kawasawa/items/5a6dee26db36aa83915f)と同じくオレオレ解釈なので、原則に沿わない面もあるかもしれません。すみません。

## 本文

コンバーターとはその名の通り、要素間で値を変換するための機構を指します。
具体的には ViewModel のプロパティがそのままでは View にバインドできない場合に、両者の間を取り持つ存在です。コンバーターがあることによって、ViewModel の描画に対する意識を削ぐことができ、View は任意の値を描画に適した形へと柔軟に変換できます。

例えば ViewMoidel の bool 型プロパティで View の要素の Visibility を制御する場合、双方の型が異なるため直接バインドすることは出来ません。

```cs:ViewModel
private bool _isVisible;
public bool IsVisible
{
    get => this._isVisible;
    set => this.SetProperty(ref this._isVisible, value);
}
```

```xml:View
<!-- これができない -->
<GroupBox Visibility="{Binding IsVisible, Mode=TwoWay}"/>
```

そこで以下のような IValueConverter インターフェースを実装したクラスを作成し、双方向の変換に必要なロジックを実装します。これを View のリソースに定義し、先の画面要素の Binding.Converter プロパティに設定することで、作成したコンバーターが間に入りバインドが実現されます。

```cs:BooleanToVisibilityConverter 
public class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        => value is bool isVisible && isVisible ? Visibility.Visible : Visibility.Collapsed;

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        => value is Visibility visibility && visibility == Visibility.Visible;
}
```

```xml:View
<Window.Resources>
    <c:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Window.Resources>

<!-- Converter によってバインドが実現する -->
<GroupBox Visibility="{Binding IsVisible, Mode=TwoWay, Converter={StaticResource BooleanToVisibilityConverter}}"/>
```

※ちなみに、この例で挙げた bool 値を Visibility に変換するコンバーターは、定義済みのクラスで System.Windows.Controls.BooleanToVisibilityConverter として存在します。数は少ないですが、必要な変換を行うコンバーターが存在するなら、それを利用する方が確かでしょう。

## おわりに

コンバーターを使えば実装上で求められる様々な値の変換に対応することができます。View は ViewModel のプロパティを都合の良い型でマッピングできるようになり、ビジネスロジックは独立性が高まります。

ですが実際は、そこまで複雑な変換ロジックを要求される場面は少なく、bool 値の変換などの単純処理でいちいちコンバーターを定義するのは面倒に感じます。次回はこれを解決する非常に強力で汎用性の高いライブラリ QuickConverter についてご紹介します。
【Python】LINEで地名入力すると現在の気温を教えてくれるbotを作ってみた



できあがりはこんな感じになりました。
聞いたことのない地名などにも対応しています。
地名→Geocoder→DarkSkyでこぼれなければ表示されます。
個人的にはボストーク基地はいつもチェックしたくなります。

![Screenshot_20200417-192323.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310332/0e368c7f-02d8-ce4c-da47-2a66a2536054.png)

参照したQiitaのページ、アカウント等の取得手順、
Herokuへのデプロイなど徐々に補筆していきます。


環境等について
・Windows10
・python 3.7.5
・Heroku
・Git
・Line 開発者アカウント
・Darksky API


作成したファイルは４つ
Procfile
requirements.txt
runtime.txt
python:main.py


```Procfile
web: python main.py
```

```requirements.txt
Flask==1.1.1
line-bot-sdk==1.16.0
geocoder==1.38.1
```

```runtime.txt
python-3.7.5
```

```python:main.py

from flask import Flask, request, abort
import os
#以下おためし
#import time
import requests
import geocoder
#import tweepy
#以上おためし

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

app = Flask(__name__)

#環境変数取得
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

@app.route("/")
def hello_world():
    return "hello world!"

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
#0327追加
    place = event.message.text
    ret = geocoder.osm(place, timeout=5.0)
#darkskyにpostするため取得ジオデータから不要なカッコを削除
    locate = str(ret.latlng)
    locate2 = locate.replace('[','')
    locate3 = locate2.replace(']','')
#取得希望地をpost url0はSI単位指定で摂氏にする
    url0='?units=si'
    url1='https://api.darksky.net/forecast/*API_KEY*/'
    url2=url1 + locate3 + url0
#JSON形式で取得
    data=requests.get(url2).json()
    data2=data['currently']['temperature']
    word=str(data2)
    word += " ℃ デス"
#以下2行で緯度経度の表示追加　2020_04_11
    word += "\n\n緯度経度は\n"
    word = word + locate
#0327

    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=word))
#0327        TextSendMessage(text=event.message.text))

if __name__ == "__main__":
#    app.run()
    port = int(os.getenv("PORT"))
    app.run(host="0.0.0.0", port=port)
```

エラー等については未処理です。
そのうちやりましょう…

2020年4月時点の情報
DarkSkyはAppleに買収されAPIの新規受付は終了。
サービスも2021年末までとのこと(泣)
OpenWetherMapのAPIが代替として使えるか今後、要検証。
カラムの特定の値がいくつあるか（countメソッド）

countメソッドを使ってカラム値の合計を求めるのに苦労したのでメモ
ruby 2.6.3
rails 5.1.6

##特定の文字数や要素をカウントしたい場合
主の場合、Userモデル（親）、Wordモデル（子）という状況でUserモデルのViewでWordモデルのcompleteカラムのtrueという値がいくつあるのかを表示したいか模索していました。
##結論
特定の文字数や要素をカウントしたい場合はcountメソッドを使うとよい。
lengthやsizeといったメソッドもあるが、そちらはまた別の機会に。
##モデルの状況
**User.rb**

| id      |       name |   email    |
|:-----------------|------------------:|:------------------:|
| 1            |              saber |        ~~        |
| 2           |            lancer |       ~~       |
| 3             |              archer |        ~~        |
| 4               |                caster |         ~~       |

**Word.rb**

| id | english |    japanese    |complete|user_id|
|:--|------:|:------------------:|:--|---:|
| 1 |  saber | セイバー        |true|1|
| 2 |  lancer | ランサー       |true|1|
| 3 |  archer | アーチャー       |false|1|
| 4 |  caster| キャスター         |false|1|

このモデル関係の中でWordモデルのcompleteカラムのtrue/falseの数をUserモデルのビューに出力したいとき

```ruby:users/show.html.erb
@user = User.find(params[:id]) #userコントローラーで定義
<%= @user.words.count{|i| i.complete? === true}  %>
=>2
<%= @user.words.count{|i| i.complete? === false}  %>
=>2
```

他にもwhereとかcountで他の方法が出てきたので試行錯誤してみましたが求めていた数値は出てこず。
この方法に出会うまで数時間を要しました。。。。
最近DBから特定の値を引っ張り出す？ことが多くわからないところが多いですが、その都度調べ上げ知識をつける=>アウトプットのサイクルで勉強にもなるのでいいかなーと思ってみたりしています。
一次元区間の重なりを結合

こんにちは
一次元区間の集合を与え、それらの重なりを結合しました。"[merging overlapping intervals](https://stackoverflow.com/questions/43600878/merging-overlapping-intervals)" (Stack Overflow) を参考にし、ほぼそのままです。

```console
$ ./merger.py 
input: [[-25, -14], [-21, -16], [-20, -15], [-10, -7], [-8, -5], [-6, -3], [2, 4], [2, 3], [3, 6], [12, 15], [13, 18], [14, 17], [22, 27], [25, 30], [26, 29]]
output: [[-25, -14], [-10, -3], [2, 6], [12, 18], [22, 30]]
```

```merger.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def merger(intervals):
    intervals.sort(key=lambda interval: interval[0])
    merged = [intervals[0]]
    for w in intervals:
        if w[0] > merged[-1][1]:
            merged.append(w)
        elif w[1] > merged[-1][1]:
            merged[-1][1] = w[1]
    return merged

intervals = [[-25, -14], [-21, -16], [-20, -15], [-10, -7], [-8, -5], [-6, -3], [2, 4], [2, 3], [3, 6], [12, 15], [13, 18], [14, 17], [22, 27], [25, 30], [26, 29]]
print(f"input: {intervals}")
print(f"output: {merger(intervals)}")
```
はじめての docker push

（今更ながら）はじめての docker push で細かいところで躓いたので残しておきます。

予め、DockerHub でアカウントを作成しておきます。
https://hub.docker.com/

##### 1. Docker コマンドを一般ユーザで実行可能にする

自分の環境では sudo docker push が動作しなかった（コマンド打っても応答なし）ため、sudo 無しで実行できるように準備しておきます。

※このユーザ名は自分のローカル環境上のユーザです（DockerHubのアカウント名ではない）

```bash
sudo usermod -g docker {自分のユーザ名}
sudo gpasswd -a {自分のユーザ名} docker
```

docker info など実行して sudo なしで実行できることを確認します。
もし動作しない場合は、OSの再起動行えばうまくいくはず。


##### 2. Dockerfile を作る

何でも良かったのですが、apache spark のイメージを作りました。
alpine は軽量で嬉しいです。

```bash:Dockerfile
FROM alpine:3.10
LABEL maintainer "blueskyarea"

ENV SPARK_VERSION=2.1.1
ENV HADOOP_VERSION=2.7

RUN apk add --no-cache curl bash openjdk8-jre libc6-compat \
  && ln -s /lib64/ld-linux-x86-64.so.2 /lib/ld-linux-x86-64.so.2 \
  && wget https://archive.apache.org/dist/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz \
  && tar -xvzf spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz \
  && mv spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION} spark \
  && rm spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz

EXPOSE 8080
```

##### 3. Docker イメージを作る

```bash
docker build --tag=blueskyareahm/spark-base:2.1.1-hadoop2.7 .
```

```bash
$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
blueskyareahm/spark-base   2.1.1-hadoop2.7     e2829908cbf7        xx hours ago        318MB
```

##### 4. Docker イメージを push する
まず、docker login を行います。
Username と Password は DockerHub のアカウント作成時に登録したものです。

```bash
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:
Password: 
Login Succeeded
```

docker push していきます。特に問題なければ、すぐに終わります。

```bash
docker push blueskyareahm/spark-base:2.1.1-hadoop2.7
```

##### つまづいたところ
docker push 時に "denied: requested access to the resource is denied" のメッセージが表示され push 出来なかった。

```bash
$ docker push blueskyarea/spark-base:2.1.1-hadoop2.7
The push refers to repository [docker.io/blueskyarea/spark-base]
5ffdb0ebdb14: Preparing 
531743b7098c: Preparing 
denied: requested access to the resource is denied
```

DockerHub 上の docker_id と docker Image 名が一致していないことが問題。
docker_id は blueskyareahm ですが
最初、blueskyarea/spark-base:2.1.1-hadoop2.7　でイメージを作成していました。
そのため、アクセス拒否されていたようです。

以下の手順にて、正しい名前でイメージ名を作成したあと

```bash
# 間違った名前のイメージを元に abc というコンテナを作成
docker run -d --name abc blueskyarea/spark-base:2.1.1-hadoop2.7
# abc コンテナを元に、正しい名前で commit する。
docker commit abc blueskyareahm/spark-base:2.1.1-hadoop2.7
```

docker push で上手くいきました。

```bash
docker push blueskyareahm/spark-base:2.1.1-hadoop2.7
```
Dockerコマンド   ～学習メモ書き


# 前提
・導入メモになります。
・いろいろ試してみたが、やっぱりHyperVがいい


# 準備するもの
## アプリケーション側
> アプリケーション側はnodejs を使用します。
> 今回はnode の公式リポジトリを使用するための、Dockerfile

```ruby:app-server/Dockerfile
FROM node:5
RUN npm -g install redis
ENV NODE_PATH C:\nodejs\node_modules

ENTRYPOINT ["node", "app.js"]
```

```ruby:app-server/src/app.js
var redis = require('redis');
var redis_client = redis.createClient(6379, "noderedis");
var listen_port = 10080;

require('http').createServer(function (request, response) {
    redis_client.incr('counter', function(error, reply) {
        response.writeHead(200, {'Content-Type': 'text/plain'});
        response.end("You accessed here " + reply + " times.\n");
    });
}).listen(listen_port, '0.0.0.0');
console.log("Server is running on port " + listen_port + ".");
```

## Docker compose ファイルの作成
```ruby:docker-compose.yml
nodeapp:
  build: "./app-server"
  container_name: "nodeapp"
  working_dir: "/usr/src/app"
  ports:
   - "10080:10080"
  volumes:
   - "$PWD/app-server/src:/usr/src/app"
  links:
   - "noderedis"
noderedis:
  image: "redis:3"
  container_name: "noderedis"
```


## コンテナ一覧を確認

```shell
$ docker ps
```

## 実行中のコンテナ一覧

```shell
$ docker ps -a
```

## コンテナ起動

```shell
$ docker-compose up 
```



## コンテナ停止

```shell
$ docker stop *contenaID*
```

# おまけ

## コンテナ削除

```shell
$ docker rm *contenaID*
```

```shell
$ docker-compose kill
```

## マウントできない時に疑うポイント

> 参考になったURL

[https://qiita.com/jusotech10/items/cb8077efb9b7a74dfdcc](https://qiita.com/jusotech10/items/cb8077efb9b7a74dfdcc)

# まとめ

> もともとインストールしてるoracleの仮想マシーンとDocker toolbox の相性が合わない⇒　一旦両方ともアンインストールして、入れ直すときに、仮想マシーンにチェックして入れ直すとうまくいく

**Windowsのドッカーのツールボックスのマウントは、
C:¥Users直下とマウントされるみたいです。**

> お金に余裕あるなら、Windows10proを最初に買ってHyperVの仮想環境を使うのが手っ取り早いし起動も早い。。仕事上はproなので環境周りが楽でした。ダッシュボードでコンテナ管理が使えるので便利かと思います。

> 前に作ったVagrantfile環境の整理したら、オラクルもドッカーもアンインストールしてモジュール置くためのディレクトリのマウントに再挑戦してみようと思います。。
Golangで型情報を調べる

#####golangで型情報調べる時に使う

```main.go
package main

import (
	"fmt"
	"reflect"
)

func main() {

	fmt.Println(reflect.TypeOf(1))          // int
	fmt.Println(reflect.TypeOf(""))         // string
	fmt.Println(reflect.TypeOf([]string{})) // []string
	fmt.Println(reflect.TypeOf(true))       // bool
	fmt.Println(reflect.TypeOf(func() {}))  // func()

}
```
plunkerでd3 その6

#概要

plunkerでd3やってみた。
signateのcovid-19読んでみた。


#写真
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7668767a-4405-817e-7513-198fd775bbd3.png)



#サンプルコード


```
var url = "https://docs.google.com/spreadsheets/d/16G_J5W-yOnn6RoMM_fdH84v6efPtuLt2HcmlXhe2wFM/export?gid=0&format=csv";

d3.csv(url, function(data) {
  var keys = data.columns;
  //alert(keys[0]);
  var table = d3.select("body").append("table").attr("border", "1")
  table.append("thead").append("tr").selectAll("th").data(keys).enter().append("th").text(function(d) {
    return d;
  });
  for (var i = 0; i < data.length; i++)
  {
    if (data[i]["受診都道府県"] == "山形県")
    {
      var rows = [];  
      keys.map(function(c) {
        rows.push(data[i][c])
      });
      table.append("tbody").append("tr").selectAll("td").data(rows).enter().append("td").text(function(d) {
        return d;
      });
    }
  }  
});

```

#成果物

https://embed.plnkr.co/plunk/vG4EE1gKgdykDWNW

以上。
「WEBを支える技術」を読んで少々簡単にまとめてみた1 (REST）

プログラミングを勉強し始めて浅いところしか勉強していなかったので読んでまとめてみました。

###WEBとは何ぞや
大まかな用途として三つ


**1. webサイト**
**2. ユーザーインタフェースとしてのweb**
**3. プログラムAPIとしてのweb**

API(Application Programming Interface)の略
APIは簡単に表現するとfacebook連携出来たり、twitter連携できたりするプログラム
###WEBを支えてるのは何か
基本的には三つ

**1. HTTP(Hypertext Transfer Protocolo)**
**2. URI(Uniform Resource Identifier)**
**3. HTML**

URIとは
URIは広い概念。 URLは部分的な物
URIがコーヒー豆ならURLはアイスコーヒー、ホットコーヒー

htmlのリンクをURIが使って、HTTPはURIで操作対象指定して、HTMLはHTTPでやりとりする


# RESTとは
**webのアーキテクチャスタイル**

アーキテクチャやらアーキテクチャやら出てくるが、よくわからない

|  抽象化　| WEBの例 | 
|:-----------|:------------:|
| アーキテクチャスタイル  |    REST   |  
| アーキテクチャ  |    ブラウザ、サーバー、プロキシ   |  
| 実装  |    Firefox,Internet Explorer   |  

抽象度　アーキテクチャスタイル←アーキテクチャ←実装

あまりよくわからないが進めていく

重要な概念にリソース(Resource)
Resource = web上に存在する、名前を持ったありとあらゆる情報
名前　＝　URI（httpなんたら、なんたら）
一つ一つの情報がリソースという概念
リソースは状態変化する（午前はお腹空いたからご飯食べた→食べた後は満腹）

RESTはあくまで概念論なので形はないのね！（なんとなくわかる）

# RESTを構成する複合アーキテクチャスタイル
**1. クライアント/サーバ**
クライアントはサーバーにリクエストを送りサーバーはリスポンスを返す
利点は分離して処理出来るから、クライアント側は携帯だったり、ゲームだったり色々と接続できるよ！

**2. ステートレスサーバ**
ステートレスの意味はクライアントのアプリケーション状態をサーバで管理しない事
よくわからないから下記読んでみた
>https://qiita.com/mtakehara21/items/efcbbc3ba58a62c10eb6

**3. キャッシュ**
キャッシュとはリソースの鮮度に基づいて、一度リソースをクライアント側で使い回す
Cookieと同じじゃないの？なんなの？

- キャッシュ
訪問した “ ウェブページの情報 ” を一時的に保存する仕組み
またページみた時に早く見れたりするよね
- Cookie
訪問した “ ユーザーの情報 ” を一時的に保存する仕組み
ログインするときにパスワード保存したり出来るよね

**4. 統一インタフェース**
URIで指し示したリソースに対する操作を、統一した限定的なインタフェースで行うアーキテクチャスタイル
例えばHTTP1.1では８個のメソッドを定義してる

| メソッド | 意味 |
|:-----------|:------------:|
| GET | リソースの取得 |
| POST | 　子リソースの作成、リソースへのデータ追加、その他処理 |
| PUT | リソースの更新、リソースの作成 |
| DELETE | リソースの削除 |
| HEAD | リソースのヘッダ (メタデータの取得) |
| OPTIONS | リソースがサポートしているメソッドの取得 |
| TRACE | プロキシ動作の確認 |
| CONNECT | プロキシ動作のトンネル接続への変更 |

制約を加えるから見やすくなるんだね（完璧にわかってない）

**5. 階層化システム**
 
システム全体が階層化しやすい
ロードバランサーを設置してアクセス分散したり、プロキシ設置したりしてアクセス制限したり。

基本的にフォルダも階層化したりしますからね

**6. コードオンデマンド**
プログラムをサーバーからダウンロードし、クライアント側で実行するアーキテクチャスタイル
javascriptやflashなど

javascriptはクライアント側で色々しますからね！

上記のRESTのアーキテクチャスタイルを総称して
**REST = ULCODC$SS**

よくわからないのでまとめ

# RESTとはまとめ

|考え方|説明|
|:-----------|:------------:|
|**1.クライアント/サーバ**|ユーザーインタフェースと処理を分離|
|**2.ステートレスサーバ**|サーバー側でアプリケーション状態を持たない|
|**3.キャッシュ**|クライアントとサーバーの通信回数と量を減らす|
|**4.統一インターフェース**|インタフェースを固定する|
|**5.階層化システム**|システムを階層に分離する|
|**6.コードオンデマンド**|プログラムをクライアントにダウンロードして実行する|

以上6つが簡単なRESTの概念！

完璧に理解は出来ていませんが、なんとなくわかりました。
何かご指摘あればメッセージどうぞ！
Jira Software にアプリを追加してみた

「[アトラシアンの「小さなチームの大きな夢をかなえる無料サービス」をいろいろ登録してみた](https://qiita.com/gofurukawa/items/ebab515ac287a51c7e53)」に続けて、Jira Softwareに無償のアプリを2つ追加してみました。

# Team Worklog Reports
https://marketplace.atlassian.com/apps/1219292/team-worklog-reports

「時間の管理」機能で、課題に記録した作業時間を集計するためのアプリです。

まず、課題での作業時間の記録は、右上の…から「作業を記録」を選び、所要時間と残り時間を入力します。
<img width="369" alt="WorkLog1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/566b95a3-579d-cf95-88e5-07a43015ecc2.png">

残り時間は最初だけ、2回目からは入力した所要時間から自動計算されます。見積もり直すのも可。
<img width="411" alt="WorkLog2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/b3f55f79-4c4c-e9b3-688b-e286e14a7969.png">

集計時に日毎や月毎に集計したい場合は、開始日時の日付だけでも正しく入力した方が良いかも。

作業の説明はコミットルールみたいなルールは作らなくても良いかなと思ってますが、ご自由に。

集計する時は、Jiraのヘッダーのナビゲーションの「アプリ」から「Team Reports」を選択します。
<img width="948" alt="Jira App.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/8c615e5c-b090-21e6-697a-9365b31e3382.png">

期間、プロジェクト、ユーザーやグループ、JQLで対象を絞りつつ、グルーピングして表示できます（例としてユーザー、プロジェクト、課題でグルーピングしてみました）。
<img width="1401" alt="Team Worklog Reports.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/4094481e-a03a-f0f4-904f-5f342b1f6e1f.png">

実は、以前の環境では、[Tempo Timesheets: Time Tracking & Report](https://marketplace.atlassian.com/apps/6572/tempo-timesheets-time-tracking-report)という有償のアプリを使っていたんですが、今回無償のアプリを眺めて、時間管理に使えそうなのをいくつか試してみたところ、[Team Worklog Reports](https://marketplace.atlassian.com/apps/1219292/team-worklog-reports)で十分だったなと思いました。

TEMPO Timesheets(時間管理)
https://www.ricksoft.jp/atlassian/timesheets/

を見ると、TEMPOは高機能なんですが、まったく使いこなせていなかったし、小規模チームではここまでの高機能さは不要そうです。

# Who's Looking for Jira Cloud

https://marketplace.atlassian.com/apps/1211596/whos-looking-for-jira-cloud

同じ課題を見ている人がわかる、というだけのアプリです。

疑問があってコメントしようとしてたけど、今見てるみたいだから、チャットしちゃおう、みたいな感じで使えます。チャット後に、結果をまとめてコメントしなきゃいけないんですが、無駄なコメントのラリーは抑制できるかなと思います。

ただ、ちょっと難点がありまして。

旧バージョンの課題ビューだと、右カラムにその課題を見ている人の一覧（まだ僕一人しかいませんが）が表示されていましたが、

<img width="402" alt="OldView.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/a6a07716-1b5c-36e3-fa9b-56256bf34ae9.png">

新しい課題ビューだと、右カラムで「Who's Looking?を開く」をクリックして、

<img width="401" alt="NewView1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/b89464f2-4a14-665d-ad16-6d357f28bd24.png">

見ている人の一覧がスライドしてくる、というUIになってしまっています。ちょっと面倒。

<img width="413" alt="NewView2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/af81443b-a3f1-95a0-eee7-3ebf5559e0ea.png">

Jiraの個人設定で、「Jira の新しい課題ビュー」をオフにすれば、旧バージョンの課題ビューで表示できるんですが、新しい方を使っていった方がいいと思うんですよね…
UnityでScratchのコスチュームっぽく画像を変える方法を思いついたので記事にしてみた話。(C#)

#概要
題の通り、UnityでScratchのコスチュームっぽく画像を変える方法を思いついたのでというお話。
Unityで見た目を変えようとすると結構色々なサイトでアニメーションを使えって言われるんですよね。
使えれば苦労しないわ！！！( ﾟдﾟ )ｸﾜｯ!!
というわけでScratchのコスチュームみたいにあらかじめ登録した画像からテクスチャを書き換える方法を紹介しようかなと思います。
ScratchからUnityに変えようかな....と思っていたりする方の参考になれば幸いです。

#Scratchのコスチュームってなんだっけ？
Scratchから離れていた人は
「Scratchのコスチュームってなんだっけ？」
なんて言う人もいるかも。というわけでそれを一旦思い出していただきます。
![Scratchのコス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620254/0b7af0f3-ca1c-dc7d-17a6-5808cd4e9a5e.png)
これですね。
![コス変えるスクリプトブロックの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620254/ade182f2-32b1-6911-b834-b1363d52ee68.png)
↑こんな感じのブロックを使って画像を変えていたと思います。

これをUnityで似たような感じにやっていくわけです。

#実際にUnityでやっていく
C#で次のコードを書いて下さい。

```C#:sample.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class sample : MonoBehaviour {
	SpriteRenderer spriteRendrer;
	public Sprite[] costume = new Sprite[1];

	void Start(){
		spriteRendrer = this.gameObject.GetComponent<UnityEngine.SpriteRenderer> ();	
	}
}
```

で、これを書いたらコスチューム機能をつけたいゲームオブジェクトにアタッチ。
![インスペクター.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620254/43770dd9-5575-a5b1-1ea4-aff71794ac2e.png)
そうするとインスペクターウィンドウに↑みたいなのが増えてると思います。
これの「▶Costume」をクリックして開いて下さい。
![開いた.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620254/27d5487b-970b-69d3-dbd2-0be43d87c9be.png)
するとこんなのが出てきます。

* Size：使用するコスチュームの数をここで指定します。あとからでも変更できます。
* Element (数字)：使用するコスチュームのIDみたいなものです。Scratchっぽく言うと「◯番目のコスチューム」ってやつです。

これで前準備は完了です！

#コスチュームを変更してみよう！

さてさて、それでは実際に使ってみましょう！
さっきのところでコスチュームの数を指定し、Element (数字)の部分に使用したい画像をドラッグ&ドロップして下さい。
例↓
![例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620254/9a283c94-d2a5-3811-7d05-a7a91791c272.png)

これで使用したいコスチュームを登録できました。

ではコスチュームを変更するためのコードを書かないとですね！(終わり際になってテンション上がってます)

```C#
spriteRendrer.sprite = costume[0];
```

はい。これがコスチュームを変更するためのコードです。
上のコードのcostume[0]の数字の部分には変更したいコスチュームのElement (数字)のところに書いてある数字を入れましょう。
![kore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620254/df563449-c363-0f31-875b-c016f423b6f3.png)

一行だけで良いんです。楽でいいでしょ。
このコードをコスチュームを変更したいところに突っ込めばOKです。
お疲れさまでした。
「投資センスを問うクイズ」をセンスないので力技（Python モンテカルロシミュレーション）で解いてみた

「ROKOHOUSE シーゲル流ロジカル投資術」さんの過去記事に興味深いクイズが出題されていました。

[【投資センスを問うクイズ <出題編>】](http://www.rokohouse.net/archives/3426)

以下のような問題です。

>男の子だけを欲しがる国では、どの家も男の子が生まれるまで子供を増やし続けます。
女の子ができたらもうひとり子供を作ります。
男の子が生まれたらもう子供を作りません。
この国の男女比はどうなりますか？
※男女が生まれる確率は各々1/2とします。
非公認Googleの入社試験より

私は、「どの家も男の子の数は1人。 男の子が生まれるまで子供を作り続けるから女の子が少し多いくらいか？」と直感では思いました。

解答編の記事はこちらです。見る前に自分で考えてみるのもよいかと思います。

[【投資センスを問うクイズ<解答・解説編>】](http://www.rokohouse.net/archives/3430)


私の直感はハズレだったので、解答編が本当に正しいのか、実際に試してみました。

百万組のカップルに、男の子が生まれるまでひたすら子作りをしてもらいました。

実際には独裁国家でない限り無理なので、Pythonコードでやりました。

これも一種のモンテカルロ・シミュレーションと呼べるのでしょうか。

以下はその結果です。見る前に自分で考えてみるのもよいかと思います。
（以下ネタバレ）


次のコードで確認しました。

```python:
import numpy as np
import pandas as pd
import random
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

dic =  {'boys':[],
        'girls':[]}

n_couples = 1000000

for i in range(n_couples):
    n_girls = 0
    n_boys = 0
    while True:
        baby = random.choice(['boy','girl'])
        if baby=='boy':
            n_boys += 1
            break
        else:
            n_girls += 1
            
    dic['boys'].append(n_boys)
    dic['girls'].append(n_girls)

df = pd.DataFrame(dic)
df.index.name = 'parent_id'
df['total'] = df.sum(axis = 1)

print("百万組のカップルから生まれた、")
print("男の子の数：{:>7}".format(df['boys'].sum()))
print("女の子の数：{:>7}".format(df['girls'].sum()))
print("\n平均出産回数：{:.0f}回".format(df['total'].mean()))
print("\n女の子数別の世帯数分布")
df2 = pd.DataFrame(df['girls'].value_counts())

df2.index.name = '女の子の数'
df2.columns = ['世帯数']

df2e = df2.copy()
df2e.index.name = 'Number of girls'
df2e.columns = ['number of couples']
df2e.plot(kind = 'bar', figsize = (8,5))

df2
```


以下、コードからのアウトプットとコメントです。

```python:
百万組のカップルから生まれた、
男の子の数：1000000
女の子の数： 999687
```

男の子の数は当然百万人です。女子の数もほぼ百万人となりました。


```python:
平均出産回数：2回
```

平均すると2回出産すれば男の子が生まれるという結果です。確率50％なので納得ですが、事前にはわかりませんでした。


**女の子数別の世帯数分布**

| 女の子の数 | 世帯数|
|:-------------:|:-------:|
|0	|500580
|1	|249813
|2	|124471
|3	|62512
|4	|31319
|5	|15657
|6	|7718
|7	|3962
|8	|1935
|9	|1041
|10	|493
|11	|239
|12	|141
|13	|60
|14	|22
|16	|14
|15	|13
|17	|4
|18	|3
|20	|1
|19	|1
|25	|1
 
全体の半分の約5万世帯で、男の子が最初の出産で生まれ、女の子がゼロです。確率50％ということです。

「50％の世帯で男の子が1人、女の子ゼロ」というのが、男の子と女の子の総数が等しくなるポイントです。直感で考えたときはこの点を見落としていました。

 

そして、女の子1人が約2万5千世帯、女の子2人が約1万2500世帯、、、と半減していきます。出産1回につき50％の確率で男の子が生まれています。

最後に、男の子を出産するまでに25人の女の子を産んだカップルが1組ありました。お疲れ様です。

上表をグラフ化するとこうなります。
![dist_of_couples.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341224/5cd20633-132c-4990-b2fa-9755acb89d41.png)

このクイズ、最初は分かりませんでしたが、コードを書いているうちに「男の子が生まれたらそのカップルは出産をやめるとか、いろいろこねくり回しているけど、結局どのカップルが産もうが50％の確率で男の子と女の子が生まれ続けているだけでは？」と気づきました。

センスのある人はすぐにこの事実に気づいて、上グラフのような分布イメージが頭に浮かぶのでしょう。

というわけで答えは、

**「この国の男女比は1:1（期待値）」**

が正解でした。
amplify graphql nextTokenを利用してデータを取得しようとするとエラーになる

# はじめに
amplify graphqlにて、nextTokenを利用してdynamoDBから次のデータを取得しようとしたらエラーになって取得できなかった

# スキーマ定義

```javascript

export const mainList = /* GraphQL */ `
  query MainList(
    $user_name: String
    $createdAt: ModelStringKeyConditionInput
    $sortDirection: ModelSortDirection
    $filter: ModelOcrImageFilterInput
    $limit: Int
    $nextToken: String
  ) {
    mainList(
      user_name: $user_name
      createdAt: $createdAt
      sortDirection: $sortDirection
      filter: $filter
      limit: $limit
      nextToken: $nextToken
    ) {
      items {
        id
        user_name
        createdAt
        owner
      }
      nextToken
    }
  }
`;
```

# エラーメッセージ

```json

Object {
  "data": Object {
    "mainList": null,
  },
  "errors": Array [
    Object {
      "data": null,
      "errorInfo": null,
      "errorType": "DynamoDB:UserIllegalArgumentException",
      "locations": Array [
        Object {
          "column": 3,
          "line": 2,
          "sourceName": null,
        },
      ],
      "message": "com.amazonaws.deepdish.common.pagination.InvalidPaginationTokenException: Invalid pagination token given.",
      "path": Array [
        "mainList",
      ],
    },
  ],
}
```

# 結果

amplify/cliのバージョンが低いことが原因でした。

```sh

$ npm ls -g --depth=0
/Users/xxxxxxxx/.nvm/versions/node/v10.14.2/lib
├── @aws-amplify/cli@4.13.3
├── expo-cli@3.13.1
└── npm@6.4.1
```

github issue にも載っていた。
https://github.com/aws-amplify/amplify-cli/issues/3411

amplify/cli のバージョンを4.13.4以上に上げて、再度、`amplify push`することで、無事取得することができました。
Rails scope とは わかりやすく

## Scopeとは
関連オブジェクトやモデルへのメソッド呼び出してとして参照される、よく使用されるクエリを指定できる。どのスコープメソッドも、ActiveRecord::Relationオブジェクトを返す。このオブジェクトに対して、別のスコープを含む他のメソッドを呼び出しを行うこともできる。

## メリット
スコープを使うことで、繰り返し何度も呼び出すクエリをスコープにまとめることができ、汎用性とコードがすっきりする。

## 基本的な使い方
- 使用したいControllerに対応するModelに記入する
- `scope :シンボル名, -> { クエリを指定 }`(ラムダじゃなくても書けますdo~end)

## 補足
### ActiveRecord::Relationオブジェクトとは
クエリを生成するための条件を持っておいて、必要に応じて適切なSQLクエリを生成・発行してくれる
その結果からオブジェクトを作って返したり、保持してくれている
例：User.all, User.where(name: ‘hoge’) などで帰ってくるものがActiveRecord::Relationのインスタンスである。
DoDのテレワークセキュリティガイド一般化と日本語訳

DoD（アメリカ合衆国国防総省)のテレワークの指針が良くできているので、一般化して日本語訳してみた。

原文：
https://dl.dod.cyber.mil/wp-content/uploads/covid19/pdf/unclass-cyber_and_networking_dos_and_donts.pdf


## ネットワークの利用

### やること

* 一日の終わりにVPN接続からログオフする
* 接続に問題がある場合は、ITサービスデスクに連絡する前に、ローカルインターネット接続を確認してください。
* 組織が承認したファイル共有サービス/機能を使用して、他のユーザーとファイルを共有する
* 組織の承認されたコミュニケーションとコラボレーションの方法を公式ビジネスに使用する
* 業務端末でのすべての非ミッションクリティカルな活動を制限する（例：SNS、オーディオおよびビデオストリーミング、私的なショッピング）
* メールに署名する
* システムの利用規定をよく読み遵守する
* ITヘルプデスクに電話する前に、知識のある同僚にヒントを求めて支援を要請する
* メールでオフィスの電話番号以外の代替の電話番号を提供することを検討してください
 在宅勤務中の連絡、不在時の返信、および/または連絡用のボイスメール
* 可能な場合はオフラインで作業する
* 電話会議の開始時間を変更して、常に1時間または30分に開始しないようにする
* 音声およびその他の組織が推奨するコラボレーションツールを使用し、可能であれば携帯電話によるコラボレーションを制限する
* 通話が終了したらすぐに電話会議から切断する

### やってはいけないこと

* 業務端末をミッションクリティカルでないアクティビティ（SNS、オーディオとビデオのストリーミング、私的なショッピングなど）に使用する
* インターネットベースの非公式のオーディオおよびビデオのオンデマンドおよびストリーミングサービスまたはWebサイトを使用する
* 大きなファイルやビデオをメールで送信する
* 使用していないときはビデオ会議を接続したままにする
* 組織で指定されていない限り、オフィスの電話をオフサイトの番号に自動転送する
* ネットワークの制限がミッションに影響を与える場合は、ITヘルプデスクに連絡することをためらってください
* 招待されれいないビデオ会議に参加する。
* 使用していないアプリケーション（メール、ビデオ、音声など）を実行したままにする。


## サイバーセキュリティ

### やること

* マシンを再起動した後にVPN接続をする
* 業務端末に最新のアップデートが適用されていることを確認する
* 可能な場合は業務端末を使用する
* 使用するデバイスが最新のOSでセキュリティパッチが適応されていることを確認する
* 業務端末の使用方法および取扱手順に従ってください
* 業務端末の紛失または盗難があった場合はITサービスデスクに直ちに報告する
* 使用していないすべてのアプリケーションを閉じます
* ベストプラクティスに従って自宅のWi-Fiを構成する。 パスワードを変更して暗号化を有効にする
* 「機密情報」、「重要情報」、および「未分類情報」の違いを理解する
* 攻撃者の攻撃方法（コロナウイルスマップ、コロナウイルススピアフィッシング攻撃など）を理解する
* 不審な活動や行動を指揮系統に報告する
* 組織固有のサイバーセキュリティガイダンスに従ってください

### やってはいけないこと

* 不在時にコンピューターのロックを解除したままにします
* 信頼できないインターネットまたはWi-Fi接続を使用する
* 機密情報、重要情報、個人情報、医療情報を公式のメールアカウントから個人のメールアカウントに自動転送または転送する
* 不審なメールを開く
* 公式のビジネスに個人のメールアカウントを使用
* 公式のビジネスに個人のクラウド/ファイル共有アカウントを使用する
* 組織が認定したインスタントメッセージングアプリケーションを使用して組織情報を共有する
* 個人端末での機密情報、重要情報、個人情報、医療情報の投稿、保存、送信
* 暗号化されていない個人情報、医療情報を送信する
* 他人が画面を見られる公共の場所から作業する
* 業務端末のセキュリティ警告/警告「ポップアップ」をクリック


### 専門用語の翻訳メモ

#### 頻出語
* government-furnished equipment(GFE)->「官給機器」->「政府提供の機器」->「業務端末」

#### 情報の種類
* For Official Use Only (FOUO)「公式使用のみ情報」->「機密情報」
* Controlled Unclassified Information (CUI) ->「管理された未分類情報」->「機密ではない重要情報」
* publicly identifiable information (PII) -> 「個人を特定できる情報」->「個人情報」
* protected health information (PHI) 「保護された健康情報」->「医療情報」
もっと仲良くなりましょうdeviseさん！

みんな大好き**devise**さんともっと仲良くなりたい:disappointed_relieved:
今日は基本的な使い方とよく起こりうるエラーを組み合わせてまとめます:point_up:

deviseとは
---------------
Railsを扱う場合、ログインまわりの機能は**devise**というGemを使用することで簡単に実装できます！これを使わない手はない。

deviseのGemをインストールしてみよう！
---------------
手順は以下です:pencil2:
1. Gemファイルの最終行に「**gem "devise"**」を追記する
2. ターミナルにてカレントディレクトリを確認した後、**$ bundle install**コマンドを実行する
3. **$ rails s** コマンドでサーバーを立ち上げ直す

:warning:ここでよく見かけるエラー1:warning:
Gemをインストールした後は、サーバーを立ち上げ直さなければいけません！なぜなら**インストールしたGemは、サーバーを立ち上げたときに反映される**からです。
つまりサーバーの立ち上げを行わない場合は、エラーが発生してしまいます:sweat_drops:
例えば、deviseをインストールしているのにも関わらず、No Method Errorでundefinde method "usder_signed_in?"が出てきてしまう時などです。注意しましょう！

deviseの設定ファイルを作成しよう！
-----------------
設定ファイルを作成するためには、**$ rails g devise:install**コマンドを実行します:pencil2:
作成されるファイルは以下です！
- config/initializers/devise.rb
- config/locales/devise.en.yml

:warning:ここでよく見かけるエラー2:warning:
**$ rails g devise:install**コマンドを実行せずに、次の手順"Userモデルを作成するためのコマンド **$ rails g devise user**の実行"に進んでしまうと、エラーが発生します！
それが、ターミナルでrailsを含むコマンドを打とうとするときです。

例えば、$rails routesを実行すると・・・
NoMethodError: undefined method 'devise' for User(call 'User.connection' to establish a connection)というようなエラー文が表示されます:fearful:
でも大丈夫！
こんな時は、以下の手順で解決しましょう:point_up:
1. config/routes.rbファイルに自動的に記述された「devise_for :users」をコメントアウトする
2. ターミナルにて**$ rails g devise:install**コマンドを実行する
これで解決できるはずです！

アカウントを作成するためのUserモデルを作ろう！
------------------
手順は以下です:pencil2:
1. **$ rails g devise user**コマンドを実行
2. **$ rails db:migrate**コマンドで、マイグレートを実行

ここではマイグレーションファイルが作成されることに注目しましょう:sparkles:
- app/models/user.rb **→Userモデル**
- db/migrate/2014XXXXXXXXXX_devise_create_users.rb **→ログイン機能に必要なカラムが追加されるマイグレーションファイル**
- test/fixtures/users.yml
- test/models/user_test.rb

また、**$ rails g devise user**コマンドを実行することで、**config/routes.rbファイルにdevise用のルーティング(＝ devise_for :users )が自動で追加される**こともポイントです:sparkles:

:warning:ここでよく見かけるエラー3:warning:
よーし！ここで一度サーバーを立ち上げなおしてみよう！そう思って実行したところ、PendingMigrationErrorが出てしまった...なんてことありませんか？？
でも焦らない！そんな時は以下の方法で解決しましょう:point_up:
1. migrate の実行がされているのか確認
→**$ rails db:migrate**コマンドを実行し忘れていないか
2. おっと、migrateを実行しようとしたら、次は新しいエラーが出たぞ！Myaql2::Error:...
→**$rails db:migrate:status**コマンドでステータスを確認してみる
3. down状態のファイルが見つかった！
→間違って２度**$ rails g devise user**コマンドを実行してしまった可能性あり！
→down状態の**Add devise to users**というマイグレーションファイルを削除する
これで解決だ！！

:star:**まとめ**:star:
私たちがPCの中の構造まで理解せずとも使用できるように、deviseは非常に便利な反面、少し複雑な構造をしているようですね！
しかしログイン機能の実装は、
**1. deviseのGemをインストール
2. deviseの設定ファイルを作成
3. deviseコマンドを使ったUserモデルの作成**
以上の手順を踏めば簡単に行うこともわかりました:raising_hand:
CA1501: 参照できるインスタンス フィールドを宣言しないでください とは何か

Pipelineによる自動ビルド＆デプロイを組み始めると、警告メッセージを1つでも多く消したくなってきます。
その中で、マイクロソフトの文章を読んでも、さっぱり何を言ってるか分からなかったメッセージについてメモしておきます。

【発生環境】

- Visual Studio 2019
- C# 8.0



# CA1051: 参照できるインスタンス フィールドを宣言しないでください

特に思想があるわけではないのですが、継承クラス共通で利用するモノを私は基底クラスにこんな風にreadonlyのprotectedフィールドとして書く癖がありました。
最初にprivate readonlyのフィールドとして定義したものを共通化で移動していくウチにこうなったんだと思います。

```csharp
public abstract class SampleBase
{
    protected readonly ILogger _logger;

    public SampleBase(ILogger logger)
    {
        _logger = logger
    }
}
```

ところが、これがよろしくないらしく、

> CA1051: 参照できるインスタンス フィールドを宣言しないでください

と警告されます。

マイクロソフトの[公式ドキュメント](https://docs.microsoft.com/ja-jp/visualstudio/code-quality/ca1051?view=vs-2019)を読むと

> フィールドの主な用途は、実装の詳細にする必要があります。 フィールドは private または internal である必要があり、プロパティを使用して公開する必要があります。 フィールドにアクセスするのと同じように、プロパティにアクセスするのは簡単です。プロパティのアクセサーのコードは、互換性に影響する変更を導入しなくても、型の機能が拡張されると変化することがあります。

（以下略）・・・とあり、日本語が難しすぎて、何を言ってるか分かりません。

話は単純で、フィールドとは自クラス内なので、protectedやpublicにするんじゃねぇって警告です。

では先ほどのサンプルコードはどう修正すればいいかというと、こんな風にゲッターしかないプロパティを定義すれば解決です。

```csharp
public abstract class SampleBase
{
    protected ILogger Logger {get;}

    public SampleBase(ILogger logger)
    {
        Logger = logger
    }

    // セッターがないのでこれは怒られる
    private void Set(ILogger logger){
        Logger = logger;
    }
}
```

それにしてももう少し公式ドキュメントが分かりやすくならないものか・・・
TypeScript で Object の keys からユニオン型を作りたい

`keyof typeof` で取得する。忘れそうなのでメモ。


```typescript
const Aspects = {
  "3x2": 3 / 2,
  "4x3": 4 / 3,
  "16x9": 16 / 9,
}
type Aspect = keyof typeof Aspects
// type Aspect = "3x2" | "4x3" | "16x9"
// と同じ
```

----


```
type AspectType = typeof Aspects
```

は

```
type AspectType = {
    "3x2": number;
    "4x3": number;
    "16x9": number;
}
```

と同じ型定義を作る。で、keyof で key から Union 型を作る

```
type Aspect = keyof AspectType
```

一行で定義すると、冒頭の書き方になる。

```
type Aspect = keyof typeof Aspects
```

- https://typescript-jp.gitbook.io/deep-dive/type-system/moving-types#knokyapucha
- https://typescript-jp.gitbook.io/deep-dive/type-system/literal-types#bsuno
MySQL  root用パスワード用を変更する　（MySQL 5.7.6）

# 今日はエラー攻略

MySQLのバージョンアップに関するエラー

### いつものようにアプリケーションをサクサク構築している最中に事件は起こった

```
$ mysql -u　root -p
```
でMySQLに入ろうとしたところ

```
Access denied for user '　root'@'localhost' (using password: YES)
```
ということで　パスワード拒否られた時の対処法でございます。

##環境
AWS Claud9
Php ７．３
Laravel 6.0
MySQL　５．７．６

今回はClaud9で環境構築しているため　SSH接続に関しては省略します

### いつものようにアプリケーションをサクサク構築している最中に事件は起こった

## あれっ。mysql -u rootでログインできない？

ログインを試みると、 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) が出る。要するに パスワードが違います のエラーだ…

##　ああん？　パスワード？　設定してね〜よ　

と思ったが　先に進まないので

調べてみると セーフモードで起動し、ログインしてからrootのパスワードを書き換える ことができるらしい

## 起動しているMySQLを一旦停止

```
$ sudo service mysqld stop
```
## MySQLをセーフモードで起動

```
$ sudo mysqld_safe --skip-grant-tables &
```
## MySQLへ　root で　ログイン





セーフモードで起動したMySQLに下記コマンドを使用してrootでログインします

```
$ mysql -u root
```
## root パスワードのリセット

```
mysql> use mysql;
```
MySQL旧バージョンだと

```
mysql> update user set password=PASSWORD("ここにパスワードを記述") where User='root';
```
でいけるのだが　MySQL 5.7以降だと

```
ERROR 1054 (42S22): Unknown column 'password' in 'field list'
```
とpasswordカラムが存在しません というエラーが吐かれる。

# うぉおおん？

ということで　調べてみるこれは、MySQLのアップデート(おそらく5.7.6以降？)で password カラムの内容が authentication_string 移動したためで、そっちを変更しなければいけなかったようだ。と

ということで　
## ここが本題です。

`update user set authentication_string=password("パスワード") where user='root';`
に置き換えて実行

```
update user set authentication_string=password("パスワード") where user='root';

```
そうすると　

```
mysql> update user set authentication_string=password("keichan") where user='root';                                                     
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

```
Query OK ということで　パスワードの設定が無事出来ました。

MySQLのバージョン変更により　なかなか時間がかかった部分なので　同じような状況に遭遇した方の助けになれば幸いです。

檜垣慶太
[Github](https://github.com/higakikeita)
[Twiiter](https://twitter.com/keitah0322)
C#での2次元配列

IT未経験者が学んだことをアウトプットします:grinning:
分かりにくいと思いますが宜しくお願いします。
今回はC#です。

## 2次元配列
配列の中に配列があるもの。
定義するときは [][]を2つつけます。

```C#
string[][] teams = {          //2次元配列
      new string [] {"aさん","bさん","cさん"},
      new string [] {"dさん","eさん","fさん"},
      new string [] {"gさん","hさん","iさん"}
};
```

出力はforやforeachを2重で使う

```C#
string[][] teams = {          //2次元配列
      new string [] {"aさん","bさん","cさん"},
      new string [] {"dさん","eさん","fさん"},
      new string [] {"gさん","hさん","iさん"}
};
  //出力
  for (i=0;i<teams.Length;i++)
  {
    for(j=0;j<teams[i].Length;j++)
    {
       Console.Write(teams[i][j] + " ");
    }
    Console.WriteLine(); //改行
  }

/* 出力結果
aさん bさん cさん
dさん eさん fさん
gさん hさん iさん
*/
```
#### iの役割
iで2次元配列teamsのインデックス番号を指定します。
teams[i]と記述して
teams[0]なら、{"aさん","bさん","cさん"},の配列
teams[1]なら、{"dさん","eさん","fさん"},の配列
teams[2]なら、{"gさん","hさん","iさん"},の配列です。
配列の数だけループを繰り返すため、for文の条件では***i<teams.Length;***としています。

#### jの役割
jで2次元配列の中に入っている配列の要素を指定しています。
teams[i][j]と記述し
teams[0][1]なら、teamsのインデックス番号0の要素(配列)は、{"aさん","bさん","cさん"}です。
{"aさん","bさん","cさん"}のインデックス番号1の要素はbさんです。
なので 

```C#
Console.Write(teams[0][1] + " ");
```
になったときはbさんが出力されます。

2次元配列なので、ループの中のループであるjの全てのループが終わるまでiのループは実行されない。
jの繰り返す条件は、***j<teams[i].Length;***なのでjが3回ループされるまでiのループは実行されない

####処理の順番
iのループに入りjのループに入って
***teams[0][0] teams[0][1] teams[0][2]***　が出力される
jが3回ループし、ループの条件を満たさなくなったのでjのループを抜ける
iのループの条件はまだ満たすので再びiのループに入りjのループに入る
***teams[1][0] teams[1][1] teams[1][2]***　が出力される
jが3回ループし、ループの条件を満たさなくなったのでjのループを抜ける
iのループの条件はまだ満たすので再びiのループに入りjのループに入る
***teams[2][0] teams[2][1] teams[2][2]***　が出力される

iのループの条件も満たされなくなったのでiのループを抜けて出力処理終了です。

ご精読ありがとうございました。
コロナウイルスには気をつけましょう:fist:
scipy の OptimizeWarningを例外としてキャッチする

次のページを参考にしました。
[python - OptimizeWarningを例外としてキャッチする](https://ja.coder.work/so/python/1508276)

```py:curve_fit02.py
#! /usr/bin/python
#
import sys
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

import warnings
from scipy.optimize import OptimizeWarning

warnings.simplefilter("error", OptimizeWarning)
# ------------------------------------------------------------------
def exp(xx, aa, bb, dd, pp):
	rvalue = 0.0
	try:
		rvalue = dd * np.exp(aa * xx - bb) + pp
	except Exception as ee:
		sys.stderr.write("*** error *** in exp ***\n")
		sys.stderr.write(str(ee) + "\n")
	return rvalue
# ------------------------------------------------------------------
xx = np.array([0,1,2,3,4,5])
yy = np.array([195.0, 200.0, 224.0,254.0, 298.0,345.0])
yy = np.array([195.0, 203.0, 224.0,254.0, 298.0,345.0])

popt = np.array([0.0,0.0,0.0,0.0])
print(type(popt))
    
try:
	popt, pcov = curve_fit(exp, xx, yy)
	print(popt)
	print(type(popt))
except Exception as ee:
	sys.stderr.write("*** error *** in curve_fit ***\n")
	sys.stderr.write(str(ee) + "\n")
    
plt.figure()
plt.plot(xx, yy, 'ko', label="Original Data")
plt.plot(xx,exp(xx, *popt), 'r-',label="Fitted Curve")
plt.legend()
plt.show()
# ------------------------------------------------------------------
```

次のメッセージが出ます。

```text
<class 'numpy.ndarray'>
*** error *** in curve_fit ***
Covariance of the parameters could not be estimated
```
Macでnodebrewを使用したnodeのインストールと設定

### (前手順)pkgで入れたnodeの削除 (入れてた場合)
[こちらの記事](https://qiita.com/tabolog/items/da18143e70f40e356b5d)を参考に削除を実施。

```shell
$ lsbom -f -l -s -pf /var/db/receipts/org.nodejs.node.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
```
lsbomコマンドとは
>BOMファイルの内容を表示するコマンド。BOMファイルとは、
「Mac OS X Bill of Materials File」のことで、Apple社固有のファイル。
 インストーラ（Installer.app）を使用するMacOS X標準のパッケージファイルに含まれている。

(参考:[lsbom- BOMファイルの内容を表示する](https://renoji.com/IT.php?Contents=Program_ShellScript_Bash/Cmd_lsbom.html))

```shell
$ sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
```

### 1.nodebrewインストールと環境変数の設定
- ターミナルから、brewで`nodebrew`をインストール

```
$ brew install nodebrew
```
- 正常にインストールされたか確認

```
$ nodebrew -vnodebrew -v
```

- bash_profileにnode関連のディレクトリパスを追加  
~./配下を汚さないように、以下のように設定。

```shell
NODEBREW_HOME=/usr/local/var/nodebrew/current
export NODEBREW_HOME
export NODEBREW_ROOT=/usr/local/var/nodebrew
```
`/usr/local/var/nodebrew`ディレクトリがない場合は作成。
`/usr/local/var/nodebrew/current`は使用するバージョンのnodeディレクトリのシンボリックリンクとなる。

(`/usr/local/var/nodebrew/current`をlsした例)

```shell
$ ls -l /usr/local/var/nodebrew/current
lrwxr-xr-x  1 hoge-pc  admin  35  6 12 15:24 /usr/local/var/nodebrew/current -> /usr/local/var/nodebrew/node/v11.9.0
```


- bash_profileに追加後反映

```
$ source ~/.bash_profile
```

### 2.nodeのインストール
- 以下のnodebrewコマンドを実行

```shell
# 最新版を入れる場合
$ nodebrew install-binary latest

# バージョン指定で入れる場合
$ nodebrew install-binary <バージョン>
# 例
$ nodebrew install-binary v11.9.0
```

- 正常にインストールされたか確認

```shell
$ nodebrew ls
```

- 現在使用するnodeバージョンを設定する。

```shell
nodebrew use <バージョン名>
# 例
$ nodebrew use v11.9.0
```
複数のバージョンをインストールして、バージョンを切り替える場合も
上記の`use`コマンドを使用する。

- 指定したnodeバージョンが使用可能な状態になっているか確認

```shell
$ node -v
```

###(Tips) nodebrewコマンド 
- インストール可能なnodeのバージョンを知りたい場合

```shell
$ nodebrew ls-remote
```
【Windows】マルチモニタ環境でリモートデスクトップで一部のモニタのみ使用する

# TL;DR;

```config:remote.rdp
use multimon:i:1
selectedmonitors:s:0,2
```

モニタの番号は、`ディスプレイ設定から確認できる番号-1`です。（0始まりのため）

# 説明

RDPはマルチモニタに対応しています。しかし、GUIの設定からは全モニタを使うかシングルモニタのどちらかしか選ぶことができません。
例えば、物理的なモニタは3枚あるが、そのうち2枚だけRDPに利用して残りの一枚はローカルのデスクトップを映しておきたい場合に対応することができません。
RDPはあまり帯域を食わないとはいえリモートマシンのリソースは食うし、特に液タブなどの余分なモニタの分まで表示したくありません。

RDPは接続設定をファイルに保存することができます。
その中にマルチモニタの設定なども入っているのですが、ここに隠しパラメータ`selectedmonitors`が存在します。
このパラメータに使いたいモニタの番号を入れることでそのモニタだけが有効になります。

# 参考
[Remote desktop use two out of four monitors (superuser)](https://superuser.com/questions/472346/remote-desktop-use-two-out-of-four-monitors#)
PhpStorm 2020.1からの日本語化は純正のJapanese Language Packプラグインがいいみたい

# 先に結論

![phpstorm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104477/a9f6bd49-d736-9581-a85c-88a082c244e0.png)

もうタイトルがそのまま結論であまり語ることもないのですが、いままでPhpStormを日本語化する場合は、Pleiadesの日本語化プラグインを使っていた人がほとんどかと思われます。わたしもそうでした。

しかし、今はアプリケーション内から直接導入できるJetBrains純正の**「Japanese Language Pack」**を使うのがいいようです。

JetBrainsデスクトップ製品の日本語化
https://samuraism.com/jetbrains/localization
（現在アーリーアクセス版とのことですので、使用の際はご注意ください。）

なんとすばらしい。安定性の向上や高速化も期待できます。まだ使い込んでいませんが、おそらく大きな問題はないでしょう。PhpStormに限らず、PyCharmやRubyMine含めたJetBrainsデスクトップ製品のほとんどすべてが対応してるみたいです。

# ここにたどり着く経緯

新型コロナウイルスの流行によるリモートワーク中のある日の午後、PhpStormが2020.1にバージョンアップしたと知り、ちょうとキリも良かったので**何も考えずにバージョンアップしたら、いきなり起動しなくなりました…**

さらっと調べたところ注意喚起として以下のような記事ががありました

IntelliJ IDEA / PyCharm 等 JetBrains IDE 2020.1 アップデート関連の問題と対処
https://blog.jetbrains.com/jp/2020/04/11/2966

Intellij IDEA2020.1が日本語化できません #54
https://github.com/cypher256/pleiades.io/issues/54

なるほど。非公式版で日本語化していたことが原因だったのかな？　ということで、ざっくり調べてみたところ設定ファイルの位置が変わったみたいです。

Macの場合だと
`~/Library/Preferences/PhpStorm20XX.X`
から
`~/Library/Application Support/JetBrains/PhpStorm20XX.X`
になったようです。

ということで、旧設定ファイルのあったファイルを新設定ファイルディレクトリに移動したりパスを書き換えたりすれば、いままでの日本語化を含めて問題なく動くには動きました。

これでいっかー！ と思ってさらっと設定ファイルの位置が変わったことをTwitterでつぶやいたところ、5分くらいでサムライズムのユースケさんからリプが来て、上に書いた結論を教えていただいたのです。ありがてー!

以上になります。
scipy の curve_fit の使い方

exp 関数のカーブフィットの使い方です。
次のような結果を得ます。
![curve_fit_apr16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5171e594-65dc-2968-647b-a48e1a3ab5f0.png)


```py:curve_fit03.py
#! /usr/bin/python
#
#	curve_fit03.py
#
#					Apr/16/2020				
# ------------------------------------------------------------------
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# ------------------------------------------------------------------
def exp(xx, aa, bb, dd, pp):
	rvalue = 0.0
	try:
		rvalue = dd * np.exp(aa * xx - bb) + pp
	except Exception as ee:
		sys.stderr.write("*** error *** in exp ***\n")
		sys.stderr.write(str(ee) + "\n")
	return rvalue
# ------------------------------------------------------------------
    
xx = np.array([0,1,2,3,4,5,6,7,8])
yy = np.array([95.0, 100.0, 114.0,134.0,178.0,245.0,312.0,412.0,603.0])

popt, pcov = curve_fit(exp, xx, yy)

plt.figure()
plt.plot(xx, yy, 'ko', label="Original Data")
plt.plot(xx, exp(xx, *popt), 'r-', label="Fitted Curve")
plt.legend()
plt.show()

# ------------------------------------------------------------------
```
CodeBuildでappspec.ymlをrootディレクトリに移動するbuildspec.yml

# やりたいこと
 - CodeDeployで利用するappspec.ymlをCodeBuildを使って、ソースコードのrootディレクトリに配置する

# なぜやるか
 - CodeDeployで利用するappspec.ymlはソースコードのrootディレクトリに配置しないとエラーになる
    - [CodeDeploy AppSpec File リファレンス](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file.html)
 - 環境毎に分ける可能性のあるappspec.ymlを、ソースコードのrootディレクトリに配置したくない！(ファイル名も変更できない)

# フォルダ構成
```
 repository_root
  - deploy
    - dev
        - appspec.yml
  - src
  - test
  - other...
``` 

# buildspec.yml
```yaml
version: 0.2
phases:
  build:
    commands:
      - cp deploy/dev/appspec.yml ./
artifacts:
  files:
    - '**/*'

```

# 注意点
 - CodeBuildの `出力アーティファクト` に名前をつけて、 CodeDeployで `入力アーティファクト` を選択すること

# やってみてダメだったこと
## artifactsに直接書く
```yaml
version: 0.2
artifacts:
  files:
    - ./deploy/dev/appspec.yml  # NG
    - deploy/dev/appspec.yml  # NG
    - "deploy/dev/appspec.yml"  # NG
    - '**/*'
```
できそうでできなかった。。。
SMSの便利バージョン！プラスメッセージとは？プラスメッセージを企業で活用する

# プラスメッセージはSMSを便利にしたサービス
業務上、SMS認証を実装していて、SMSの利便性に気づいたので色々調べてみたところ、SMSをより便利にしたサービスがあるのを発見しました

**+メッセージ（プラスメッセージ）**
3キャリア合同で提供しているサービスで、携帯電話番号宛にメッセージを配信できて、画像や動画も送信できるサービス

最近企業が個人に配信することもできるようになったとのこと

ドコモのプラスメッセージURL（個人用）
https://www.nttdocomo.co.jp/service/plus_message/

企業が個人に配信するには公式アカウントを作成する必要があります。
https://www.cm.com/ja-jp/blog/what-is-plusmessage/
公式アカウントのイメージはLINE公式アカウントと同じと考えていいでしょう。

## LINEとプラスメッセージの違い
プラスメッセージ もLINEと同じ様に公式アカウントを作りますが
違いはお友達登録をしなくても電話番号さえ知っていれば送信できるところです。
LNEはコミュニケーションアプリサービスであるのに対して、プラスメッセージ は携帯電話にデフォルトで付属しているメッセージサービスであるため、SMSと同じ様に電話番号宛に配信できます。

LINEと同じところは、アプリをダウンロードしていないと利用できないところです。
Androidの端末は基本的にはそのアプリが事前にダウンロードされているのでAndroid端末宛には配信できますが、IphoneはアプリDLが必要です。



## SMSとの違い
携帯電話番号宛に送れる点で共通しているプラスメッセージとSMSですが
他の違いは
・プラスメッセージは1通2500文字近く送れる　（SMSは1通70文字）
・プラスメッセージは画像や動画、位置情報まで送れる（SMSは文字のみ）
・プラスメッセージは受信者と双方向のやりとりができる（SMSは一方通行）
・プラスメッセージは送信者がサービスによって保証される・なりすましができない（SMSは送の保証なし）

以上のようにメリットがたくさんあるのがわかります。

送信できる文字数が増えたり、双方向のやりとりができたり、送信者名が保証されたりするのは企業としては大きなメリットですね。

Eメールは正直顧客に読まれてないし、電話もコストがかかので、Eメールと電話の代わりにいいサービスだと感じました。

## プラスメッセージ注意点
先ほども書きましたがSMSは携帯電話の機種に限らず受信できるのですが、プラスメッセージはデフォルトで受信ができるのがアンドロイド端末だけです。さらにiphoneでプラスメッセージを利用するためにはアプリをインストールする必要があるとのこと

下のリンクからダウンロード可能

https://apps.apple.com/jp/app/%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8-%E3%83%97%E3%83%A9%E3%82%B9%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8/id1358576433

ただ、CM.comではプラスメッセージ が送信できない場合に自動でSMSを配信できる仕組みがあるので
安心して利用できます。

## 企業で公式アカウントを取得して何に利用するか
プラスメッセージ で一番のメリットはなりすまし防止なので、大切な通知やお知らせなどに利用すると便利ですね。また、マーケティングでも利用ができるとのことだったので、プロモーションメッセージやお得意様限定サービスなどの通知にもおすすめです。


## 法人公式アカウントの始め方
プラスメッセージが便利なサービスだということはわかったが、どうやって企業が利用を開始するのかわからなかったので調べてみた

上記のドコモのページでも、下のSoftbankのページでも企業から顧客への利用については書いてなかったので
https://www.softbank.jp/mobile/service/plus-message/

調べてみました。

今他業務で利用しているSMS配信会社CM.comさんがプラスメッセージが企業向けのプラスメッセージ配信を提供しているとのことでした。
おそらく今の所はCM.comだけではないでしょうか。

https://www.cm.com/ja-jp/plusmessage-api/

**利用方法**
CM.comに確認したところ、APIと管理画面での利用が可能とのことです。

気になったのでいくつか質問してみました

【質問】iphoneユーザーでプラスメッセージをインストールしていない場合にはどうなるのか

【回答】SMSでフォールバックが可能とのことでした。
なので配信側としてはプラスメッセージバージョンとSMSバージョンをそれぞれコンテンツを用意する必要があるとのこと

【質問】メッセージの配信に制約はあるのか

【回答】一方的に送りつける広告やマーケティングメッセージが解禁になりました。ただ、受信者側の承諾（オプトアウト）が必要になります。
＊この承諾（オプトアウト）はプラスメッセージに限らず、SMSやEメールでも必要とされる、特定電子メール法によって定められているルールですのでとりわけプラスメッセージに限定して要求されているものではありません。

【質問】送信元の保証とはどういうものか

【回答】企業アカウントを作成することができて、そのアカウントは厳密な審査が入るのでなりすますことはできない。企業アカウントは画像、ロゴやURL、詳細などを表示することができる

【質問】管理画面の仕様はどの様になっているのか
【回答】インターネット環境があるPCからログインをして管理画面から配信できるサービスです。

##API仕様書について（2022年11月更新）
プラスメッセージの仕様はRSCをベースに構築されているので以下を参考にするといいとのことです。
https://developers.cm.com/messaging/docs/rcs

SMSと異なり、まずはCM.comに公式アカウント申請をするのがベストです。


チャットボット付きプラットフォームも提供開始　2021/7更新
開発環境のない企業向けにログインして利用するプラスメッセージの配信プラットフォームも提供するらしい。またチャットボットもあるようなので開発リソースのない事業者やとりあえずお試しで利用したい事業者には最適かも
## 双方向のためのスクリプトチャットボット　（２０２２年11月）
プラスメッセージは双方向のやりとりができるのも特徴の一つですが
CM.comでは双方向ができる管理画面と双方向のためのスクリプトチャットボットのサービスもあります。
問い合わせが来た時などに対応できる便利なチャットボットで利用シーンを拡大できます。

## 問い合わせ

https://www.cm.com/ja-jp/plusmessage-api/
ここからお問い合わせください
SQLの学習①

参考文献
https://www.sejuku.net/blog/50197

・ＳＱＬとは
リレーショナルデータベースに蓄積したデータを「操作」したり「定義」したりするためのプログラム言語。

・ＳＱＬを使用するメリット
①数万数十万数百万の大量のデータを取得・更新・削除・追加できる。
②国際基準化されているのでMySQLやOracleなどデータベースが変わったとしても、同じSQLで操作することができる。
　すなわち、1度の習得でどのプログラミング言語でも組み合わせて利用することができる。


・SQLでできること
①大量のデータからデータの取得・登録・更新・削除の操作。
②大量のデータから特定のデータを取得する為の条件検索ができる。
③リレーショナルデータベースを使用してExcelのような【表】形式でデータの取得・登録・保存・削除を行う事ができる。
【例】表形式の為、レコード（行）ごとに特定の条件を指定して操作することができる。
 番号　名前　性別
　1　　hoge　男性
　2　　hoge2 女性
　3　　hoge3 男性　※番号3のデータを取得するように操作することができる！
　4　　hoge4 男性


ここまででわかる通り、基本的にバックエンドのお仕事でデータを扱わないなんてことはまずあり得ない。
すなわちSQLを使わないことはないといっても過言ではないくらい重要な言語がSQL。

これからこの無知な頭にエンジニアになるうえで必須のSQLについての知識をこの記録を通して植え付けていく。


・そもそもSQLにはどんな種類があるのか？
SQLには大きく分けて3つに分類分けできる

　①データの操作　＝　DML（データ操作言語）
　②データの定義　＝　DDL（データ定義言語）
　③データの制御　＝　DCL（データ制御言語）

それぞれ下記にて読み解いていく。


■ＤＭＬ（データ操作言語）とは？
テーブルの行（レコード）のデータを取得・登録・更新・削除などのデータを操作する文法のことを指す。
　読み方は【ＤＭＬ（ディー・エム・エル）】

例として...

・SELECT　レコードの取得
・UPDATE　レコードの更新
・DELETE　レコードの削除
・INSERT　レコードの挿入（新規追加）

　※代表的な具体例としてSELECT文で確認。

[　従業員テーブル　]
 番号　名前　性別
　1　　hoge　男性
　2　　hoge2 女性
　3　　hoge3 男性　★番号が「3」のデータを取得するように操作することができる！
　4　　hoge4 男性

＊　SELECT 名前 FROM 従業員テーブル WHERE 番号＝3

この場合は"hoge3"が取り出せます。


■ＤＤＬ（データ定義言語）とは？
データベースやデータベースのテーブル作成や定義する文法のことを指す。
　読み方は【ＤＤＬ（ディー・ディー・エル）】

例として...

・CREATE　データベースやテーブルを作成
・DROP　　データベースやテーブルを削除
・ALTER　 データベースやテーブルを変更

　※代表的な具体例として「従業員テーブルには《番号、名前（20文字まで）、性別》がある」ことを定義する際の文法

＊　CREATE TABLE 従業員テーブル(番号 int, 名前　vachar(20), 性別 char(1));

これで従業員テーブルとテーブル内のカラムが設定される。
もう少し深堀すると、カラムにはデータ型をつける必要がある。

ここでの内容でいえば、int型とchar型、varchar型が設定されている。
注意点として同じ文字列のchar型、varchar型でも文字数が"等しくない"判定をされるケースがある。
詳細についてはここでのSQLの基本とは少し外れるので添付の記事を参考にしてください。
https://xtech.nikkei.com/it/article/COLUMN/20060221/230236/

■DCL（データ制御言語）とは？
データベースに行った変更を確定したり取り消したりする。RDBMSのユーザがデータベースにあるテーブルなどを操作する権限の設定を行える。
　読み方は【DCL（ディー・シー・エル）】

例として...

・COMMIT　　データベースに対して行った変更を確定する
・ROLLBACK　データベースに対して行った変更を取り消す
・GRANT   　　ユーザに操作の権限を与える
・REVOKE　　 ユーザから操作の権限を奪う
Linuxコマンドの基礎

#Linuxコマンド
ターミナルではLinuxコマンドの入力でPCに様々な命令を与える。
Linux(リナックス)とは、OSと呼ばれるPCの中身の種類となるもの。
PCの中身に命令を与えるものがLinuxコマンドである。

#pwdコマンド
print working directoryの略で、カレントディレクトリのパスを表示するコマンド。
使い方は、ターミナルでpwdと打ち込んでエンターキーを押すだけ。

#lsコマンド
listの略で、ディレクトリやファイルの一覧を表示するコマンド。
実行することで、カレントディレクトリの直下にあるディレクトリやファイルの名前が一覧で表示される。
使い方はターミナルでlsと打ち込んでエンターキーを押すだけ。
また、lsの後に半角スペースを空けて、ディレクトリのパスを入力して実行すると、その指定したディレクトリの中身を一覧表示する。

#cdコマンド
change directoryの略で、カレントディレクトリを移動するときに使用。
使い方はターミナルでcd [移動したいディレクトリのパス]と打ち込んでエンターを押下。
また、cdだけ入力し実行した場合は、ホームディレクトリに移動する。