OmniAICreator/Qiita-1.07M huggingface dataset:
【自分用】SQL基礎メモ【11/05更新】

自分用にProgateで学んだSQLの基礎知識をまとめたものです。
**※他の人にみられるようにみやすく作られておりませんため閲覧する場合はご容赦ください。**



◆テーブル…「表」のこと
◆カラム…「縦の列」のこと
◆レコード…「横の列」のこと
◆クエリ…データベースに送る命令


---
**SELECT**
◆どのカラムのデータを取得するかを選ぶ
`SELECT name(カラム名)`


---
**FROM**
◆SELECTで選んだカラムが「どのテーブル」のカラムかを指しているもの
`SELECT name(カラム名)
 FROM purchases;(どのテーブルの？)`


---
**複数のカラムからデータを取得**
◆下記のようにカラム名をコンマ（,）で区切ります。
`SELECT name,price`


---
**全てのカラムからデータを取得する**
◆全カラムを取得する場合は「＊」の記号を用います。


---
**WHERE(検索条件)**
◆特定のデータを取得するには、
 「どこのレコード（横の列）を取得するか」という意味を持つ
 「WHERE」を用います。


**使用例①：「＝」**
>◆どこのレコードのデータを取得するかを指定するためには
> 「＝」を用いて「○○カラムの○○であるレコード」と
> いった意味になるように条件を指定します。
>◆「＝」は完全一致するものしか取得しないので注意
>`WHERE category = "食費"（categoryカラムが食費であるレコード）`
>※食費の様なテキストはクォーテーションで囲む必要がある。


**使用例②：「>=(比較演算子)」**
>◆比較演算子よばれる、大小比較の記号を用いることで
> 「priceカラムが1000以上であるレコード」を取得することが可能。
>`SELECT * FROM purchases WHERE`
>◆数値データ以外にも「日付データ」にも比較演算子を使うことも可能です。


**使用例③：LIKE(キーワード検索)**
>◆「ある文字を含むデータ」を取得したい場合は、
> 「～のような」という意味を持つ「LIKE演算子」を用います。
>◆LIKE演算子を用いるために使用必要があるのは「ワイルドカード」です。
> ワイルドカードとは「どんな文字列にも一致することを指す記号」です。
> 必ずクォーテーションで囲むこと。
>`SELECT *
> FROM purchases
> WHERE name LIKE "％文字列％";`
>
>◆”プリン%”（プリンで始まる文字列を検索：前方一致）
>◆”%プリン”（プリンで終わる文字列を検索：後方一致）


**使用例④：NOT(指定した以外のものを検索)**
>◆「〇〇を満たさないデータ」や「〇〇に一致しないデータ」
　を取得することができる
`SELECT *
 FROM purchases
 WHERE NOT price > 1000;
 (priceカラムの1000円未満以外のデータを取得)`
`SELECT *
 FROM purchases
 WHERE NOT name LIKE “%1000”%;
 (nameカラムの「プリン」以外のデータを取得)`


---
**データ型**
◆「データ型」とはテキストや数値データ、日付データというような
 「データの種類」を示すものです。
◆データベースではカラムごとにデータ型を決めます。

**クォーテーションで囲む、囲まないデータ型**
◆数値データ：囲まない…1000
◆日付データ：囲む…”2019-11-04”
◆テキスト：囲む…"にんじん"

---
ECSで実行中のサービス更新を試してみた

# はじめに
この記事はコンテナ勉強用として試したことまとめたものです。
今回はECSで実行中のサービス更新を試してみました。

# 「新しいデプロイの強制」設定を使う
Lambdaで一時的に起動数を増やして、古いタスクをソートして削除、起動数を戻す。といった方法でコンテナを入れ替えていましたが、ECSのサービス更新に「新しいデプロイの強制」というものがあったのでこちらを使用して新しいコンテナに入れ替えるようにできるのでは。ということで検証してみました。

# ECSサービスを起動
* 2つのタスクが正常に稼働しているのでこれらを新しいコンテナに入れ替える。
<img width="803" alt="タスク確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/a512a82e-43cf-4a67-0239-1e2693588da1.png">

* 作成された時刻を確認しておく。
<img width="535" alt="タスク①確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/27a89066-b288-3528-1f45-8d231db4594a.png">
<img width="539" alt="タスク②確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/ce4eb5f7-3211-366f-991e-926af1c39727.png">

# 新しいデプロイの強制を実施
* コンソール上から「新しいデプロイの強制」にチェックを入れて実施することも可能ですが、定期的に入れ替えて欲しいので簡単なLambdaを作って試してみました。

```python
import json
import boto3
from botocore.exceptions import ClientError

def lambda_handler(event, context):

    try:
        client = boto3.client('ecs')
        service_update_result = client.update_service(
            cluster = 'test-ecs-cls',
            service = 'test-service',
            desiredCount = 2,
            forceNewDeployment=True
        )
        print(service_update_result)

    except ClientError as e:
        print(e)
```

* タスクが増えた。
<img width="541" alt="デプロイ強制後タスク確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/a9f5ddeb-d426-d43b-3ca1-c7a753e90fb4.png">

* 一時的にタスク数が倍になった。
<img width="538" alt="デプロイ強制後タスク確認2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/6978963b-68d4-6cba-f5ff-962796fb9c93.png">


# コンテナ入れ替わり確認
* 起動数が2つなのでタスク数が4つから2つに減りました。
<img width="807" alt="入れ替え後タスク確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/dc458464-de33-6791-a267-d097fa511d6b.png">

* 残ったタスクの作成時刻が新しいものになっているか確認する。
<img width="537" alt="入れ替え後タスク①確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/3e760b8f-2685-8416-dd6e-f8a34045f73f.png">
<img width="535" alt="入れ替え後タスク②確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/de0a0c3c-b40d-5371-ff57-974d204d8be6.png">

* 古いタスクがちゃんと停止している。
<img width="535" alt="停止タスク①確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/1cec6374-1b42-3c08-168a-0a9a5e5a44d2.png">
<img width="539" alt="停止タスク②確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/1251a29e-aa04-a0fc-e51a-f6700caeb954.png">

# まとめ
* Lambdaでタスク数をカウントして処理するよりも「新しいデプロイの強制」機能を使うことで簡単にコンテナ入れ替えを行うことができる。
* SSMと連携して自動で入れ替え機能を実装してみたい。

# 参考
* https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/update-service.html
UnityのBuild Report Inspectorでビルドレポートをさくっと確認する

# はじめに

Build Report InspectorとはUnityでビルドした時の情報をインスペクターに表示するエディタ拡張です。
ビルドログを後で確認したりビルドに含まれるアセットを確認したりできます。
類似ツールに[Build Report Tool](https://assetstore.unity.com/packages/tools/utilities/build-report-tool-8162)がありますがこちらはUnity製でPackage Manager/Asset Store/Githubから入手できます。

## 動作環境

Unity2019.2.11f1 (必須環境はUnity2018.1以上)
Build Report Inspector preview - 0.1.0
UIWidgets (動作確認用)

## インストール

Package Managerの`Advanced`から`Show preview packages`をチェック、`All packages`に切り替えて`Build Report Inspector`をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/18007a3e-4097-cab5-58cf-a543f68d0a17.png)

Package Managerを使わない場合はAsset StoreもしくはGithubから導入することができます。

- https://assetstore.unity.com/packages/tools/utilities/build-report-inspector-for-unity-119923
- https://github.com/Unity-Technologies/BuildReportInspector

## 使い方

メニューからウインドウ > Open Last Build Reportを選ぶと`/Assets/BuildReports/`フォルダにビルドレポートがコピーされてインスペクタに表示されます。このファイルはビルドした時に`Library/LastBuild.buildreport`に作成されるので手動でコピーする事もできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/bb4d9cd6-0adf-688e-5ad9-7aaea2947ed8.png)

## BuildSteps

各ビルドステップのログメッセージと処理時間が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/00429864-9481-4221-c3bf-5fdae9f5517d.png)

## SourceAssets

ビルドに使われたアセット一覧が表示されます。
ソート方法は以下の3つが用意されています。

* サイズ
* Output Data Files
* Importer Type

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/38351ffe-0acb-7821-be84-28aa050dac51.png)

## OutputFiles

ビルドで書き込まれたファイル一覧が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/04cce590-e271-528e-ef53-b6c015cee860.png)

## Stripping

Engine Code Strippingをサポートするプラットフォームの場合にビルドに追加されたエンジンモジュールの一覧とその理由が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/1b67ed54-99d6-709f-9340-5bf604e6c6ef.png)

# 参考リンク

- [About Build Report Inspector | Build Report Inspector | 0.1.0-preview](https://docs.unity3d.com/Packages/com.unity.build-report-inspector@0.1/manual/index.html)
- [Unity-Technologies/BuildReportInspector: Editor script which implements an inspector for the BuildReport class](https://github.com/Unity-Technologies/BuildReportInspector)
- [Build Report Inspector for Unity - Asset Store](https://assetstore.unity.com/packages/tools/utilities/build-report-inspector-for-unity-119923)
- [Build Report Tool - Asset Store](https://assetstore.unity.com/packages/tools/utilities/build-report-tool-8162)
- [UIWidgets - Asset Store](https://assetstore.unity.com/packages/tools/gui/uiwidgets-146398)
rails-備忘録:データ型

豆知識の備忘録です。

# データ型
基本データベース作成にはデータ型を指定します。

**種類**
　string : 名前、電話番号など短い文字列
　text   : コメントなどかなり長い文字列
　integer: 数字など(小数点なし)
など多用しています。

他にも
float 浮動小数点数型
decimal 固定長整数型
datetime 日時
timestamp 更新時間
time 時刻
date 日付
binary バイナリ文字列型
boolean 真偽値
references 他のテーブルへの外部キーの定義、_id が付いた整数
があります。
年末まで毎日webサイトを作り続ける大学生 〜17日目 BootStrap & Font Awesomeに触れる〜

##はじめに
こんにちは！
年末まで毎日webサイトを作っている者です。
今日はbootstrapとfont awesomeを触ってみました。
昨日ap●leのファーストビュー（デザインのみ)をhtml,css,jsでコツコツと書いていきましたが、bootstrap, font awesomeを使ったら爆速で出来上がると聞いたのでちょっと触ってみました。
扱う技術レベルは低いですが、同じように悩んでる初心者の方を勇気付けられれば幸いです。
今日は17日目。(2019/11/4)
よろしくお願いします。

##サイトURL
- https://sin2cos21.github.io/day17.html


##やったこと
まずやることとして、bootstrapもfont awesomeもCDN（ファイルをダウンロードできる便利サービス？)を利用したのでlinkやscriptのタグを張る必要があります。

```html
<!-- bootstrapの方 -->
 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
        crossorigin="anonymous">
<!-- font awesomeの方 -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt"
        crossorigin="anonymous">

<!-- 3つ全てbootstrapの方 -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
        crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
        crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
        crossorigin="anonymous"></script>
```

これであとはサイトにコードが張ってあるので、使いたいものをコピペして終了です。

結論からいうと、確かにbootstrapで簡単に大枠は作れたんですが、細部の詰め方がよくわかりませんでした。どのクラスがどの装飾をしているのか、どこがどう絡み合っているのか、結局読み解けずに1日が過ぎてしまいました。

![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/3f7c4774-616f-7122-7a17-2c72c1502722.gif)

ただやっぱりレスポンシブに対応しているだけあって、小さくなった時に↑ハンバーガーメニューが勝手に出てきてそれも動くというのがすごいですね。bootstrap おそるべし。

ちなみにfont awesomeの方のコードはこんな感じです↓

```html
<a class="nav-link" href="#"><i class="fas fa-search"></i></a>
```
iタグの部分ですね。上のgifでいうとこれは検索バーを表示してくれています。

##感想
今日はご覧の通り成果がほとんどありませんでした。確かにフレームワークは便利といえば便利ですが、初心者のうちは何が何やらわからないのでそこまでありがたみを感じないというのが正直な感想です。安直にパパッと作ろうとした結果がこれです。やっぱり今は生のhtml, css, jsで地道にやるべきですね・・・。フレームワークは実力がついてから利用することにします。あ、Font Awesomeはすごくシンプルでした。

最後までお読みいただきありがとうございます。明日も投稿しますのでよろしくお願い致します。

##参考
1. Bootstrap (https://getbootstrap.com/)
2. Font Awesome (https://fontawesome.com/)

参考になりました、ありがとうございます。またいつか使わせていただきます！
Rscriptでコマンドラインで入力を受け付ける書き方

####必要性

Rは通常は，Rstudioなどを使って，対話的に行う方法が主流。

readline関数を用いるとRstudioでは対話的な入力が可能だが，Rscriptによるコマンドラインにして，実行すると入力を待ってくれなくなるので，使用できなくなる。

このようなコマンドラインからの入力を受け付ける方法は，大量の仕事を自動化したい際にはとても役立つ。

こうした方法は，Pythonやshell-scriptでの記述は楽だが，未だに分野によってはRで作成された関数を必要とする場面もまだ残っている。

####コードの中身

たとえば下記のような書き方をして

```Rscript:inputAnswer.R
#!/usr/bin/env Rscript

question = "今日は何月 ? : "
cat(question)
Ans = readLines(file("stdin"), n=1)
print(Ans)
```

その後にshellで

```shell-session
#実行可能にする。
chmod +x inputAnswer.R

#実行する。(2行目#以後は入力値)
./inputAnswer.R
今日は何月 ? : #10月
[1] "10月"
```
となる。
NginxでHSTS

## HSTSとは

Hypertext Strict Transport Securityの略。2012年、RFC6797で制定されたWebブラウザに対してTLSの使用を強制する仕組みのことです。

## NginxでHSTSを設定するには

HSTSを設定するのは、 `Strict-Transport-Security` というヘッダを返すようにする必要があります。
このヘッダは以下の要素から構成されます。

### max-age
HSTSポリシーがキャッシュされる時間を秒単位で指定。この秒数の時間内であれば、ブラウザはキャッシュからポリシーを参照します。

### includeSubDomains
HSTSポリシーをサブドメインにも適用するかどうかのフラグです。

### preload
特定のサイトをあらかじめ https://hstspreload.org のリストに追加しておくと、初回アクセスからhttpsにリダイレクトされるようになる機能がありますが、
このHSTS Preload Listを参照するかどうか決めるフラグです。
このリストに登録されていないFQDNは、初回アクセス時にhttpでアクセスした後httpsに切り替えます。
登録しておくと初回アクセス時からhttpsでアクセスされます。

## nginx.conf設定

至極簡単で、ディレクティブに

```nginx
server {
  add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
}
```

このように指定します。
Github Actions で Nuxt App を Firebase Hosting へデプロイ

## FIREBASE_TOKEN の取得
https://firebase.google.com/docs/cli?hl=ja#cli-ci-systems

`firebase login:ci` して `FIREBASE_TOKEN` を取得する

## Github Secrets に設定
https://help.github.com/ja/github/automating-your-workflow-with-github-actions/virtual-environments-for-github-actions#creating-and-using-secrets-encrypted-variables

![github.com_hirose504_nuxt-sandbox_settings_secrets_FIREBASE_TOKEN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12238/9ff65ef5-9499-2464-54cc-8b8cc6576f42.png)

## Github Actions を設定
```yml:.github/workflows/firebase.yml
name: Deploy FIrebase Workflow

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: nuxt/actions-yarn@master
      with:
        args: install
    - uses: nuxt/actions-yarn@master
      with:
        args: generate
    - name: deploy
      run: yarn firebase deploy --token $FIREBASE_TOKEN
      env:
        FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
```
標本分散の分散から急に正規分布の話になる理由

教科書を読んでいて、標本平均の期待値・分散、標本分散の期待値までは特定の確率分布に限定しない一般論だったのに、標本分散の分散の話になると急に正規分布に限定されてモヤモヤしたことがあります。

標本平均の期待値・分散、標本分散の期待値までは母平均と母分散で記述されます。平均、分散は初等的な教科書でも触れられるなじみ深い母数です。

では、標本分散の分散はどうでしょう。分散は$E[(X-\bar X)^2]$で計算できます。期待値計算は確率分布関数を乗じて$X$について積分することで行いますので、その結果残るのは確率分布関数を特徴づけるパラメータです。[前回の記事](https://qiita.com/jajagacchi/items/6cedc412204b415b56a5)でも書きましたが、確率分布関数を特徴づけるパラメータは平均と分散だけではありません。実際、標本分散の分散は4次モーメントが必要になります。初等的な教科書ではこのような馴染みの薄いパラメータを持ち出すことを避けるために正規分布という具体例を出しているのかもしれません。正規分布は独立なパラメータが平均と分散のふたつだけですので、4次モーメントも平均と分散で記述することが出来ます。標本分散の従う確率分布（カイ二乗分布）にまで話を進めている教科書が多いかもしれません。そのせいで余計にモヤモヤしたのですが・・・。

というわけで次回はカイ二乗分布に関する数値実験をしたいと思います。
勉強ログ_day8_MySQL入門⑥(もすこし高度に）

# はじめに
非エンジニアの勉強ログ。
**超初心者プレイ**のため、内容は自分の勉強メモです。

### 昨日まで
- Day7はMySQLへのCSV取り込み方など
- 結局面倒で、A5M2のCSVインポート機能を利用

### 今日のゴール
- MySQL　サブクエリ～トランザクション～テーブル結合、と小ネタ

### 環境
- ホストOS：Windows10 Pro 1903
- [こちら](https://qiita.com/kantan/items/099e2c3ed700f1781df8)で構築した環境を利用する
- MySQL:5.7.27
- SQL開発ツール：A5:SQL Mk-2 2.14.4

### 参考資料・引用元など
- ドットインストール：[MySQL入門](https://dotinstall.com/lessons/basic_mysql_v3 "MySQL入門") ←勉強はこれを基軸に進める
- Qiita：[よく使うMySQLコマンド集](https://qiita.com/CyberMergina/items/f889519e6be19c46f5f4)

# サブクエリ
- 一時的にしか使わないなら、テーブルつくらずサブクエリ

```ruby:mysql
select
  abg(u.age),
  u.ivent
from 
  (select 
    id,
    user_name,
    age,
    case
      when age = 20 then 'congratulation'
      when age = 30 then 'marverous'
      else null
    end as ivent
  from persons) as u
gropu by u.ivent;
```

# トランザクション
- 一連の処理を止めずに行う
- データの確定はcommit,もとにもどすならrollback

# テーブル結合
- inner join：2つのテーブルで一致するレコードのみ出す
- outer join：2つのテーブルで不一致でもレコード出す

```ruby:mysql
select users.id, users.name, users.job, items.name from users inner join items on users.id = items.user_id; 
```

outer joinの場合は
left = 左に書いたtableが軸。右のtableに該当がなかったらその部分はnull
right = 右に書いたtableが軸。leftの逆

```ruby:mysql
select * from users left outer join items on users.id = items.user_id;
select * from users right outer join items on users.id = items.user_id;
```

# キーの制約
- テーブルAにIDがなかったら、テーブルBにレコードつくっちゃだめ！　みたいな制約
- 整合とれる反面、互いのテーブルが連動して容易に削除とかはしづらくなる
- alterで操作　addしたりdropしたり

```ruby:mysql
-- itemsテーブルのuser_idはusersテーブルのidカラムで制約
alter table items add constraint fk_items foreign key (user_id) references users (id);

-- 制約捨てる場合はdrop foreign key
alter table items drop foreign key fk_items;
```

# 小ネタ
### 直前のレコードNoを取得
異なるテーブルのレコードを連続で更新するときに
関連する直前に挿入されたレコードのNoを取得する場合など

```ruby:mysql
insert into users (name, job) values ('taro', 'police');
insert into items (user_id, item) values (last_insert_id(), 'key');
```

### トリガー
あるテーブル情報を変更したときに
連動して別の処理を行うよう、事前に指定が出来る

```ruby:mysql
create trigger users_insert_trigger after insert on users for each row insert into user_logs (history) values ('user added.');
```


# あとがき
- サブクエリあたりから長くなるから混乱する
重複しない数値をランダムで生成する メモ

# プログラム
```test.c
#include <stdio.h>
#include <stdlib.h>
#define MAXDATA 10000

void shuffle(int array[], int size)
{
        int i = size;
        while (i > 1) {
         int j = rand() % i;
         i--;
         int t = array[i];
         array[i] = array[j];
         array[j] = t;
        }
}

int main()
{
        int values[MAXDATA];
        int m;
        int i;
        for (m = 0; m < MAXDATA; m++){
         values[m] = m + 1;
        }

        int size = sizeof(values) / sizeof(int);
        shuffle(values, size);
    
        FILE *fp;
        fp = fopen("test.txt", "a");
        if (fp == NULL){
         perror("ファイルの読み込みに失敗");
         return 1;
        }

        for (i = 0; i < size; i++){
         fprintf(fp, "%d\n", values[i]);
        }

        fclose(fp);

        return 0;
}
```
# 説明
- shuffle関数・・・重複しないように配列要素をシャッフル
- main関数・・・shuffle関数で扱ったデータをただのテキストファイルに出力しているだけ

# その他
- もっといろいろ改良していく
- 重複しない数値の生成は難しいと勝手に思っていたが、こんな簡単な方法があったとは(Fisher-Yatesというアルゴリズムらしいです)

# 参考
[C言語で重複しない乱数生成の仕方を教えてください！](https://teratail.com/questions/28507)
numpy,pandas,matplot libの使い方

numpy
<img width="167" alt="コメント 2019-11-04 231959.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/cbfb0909-01c4-f2ef-5a61-979edf0a37c9.png">

numpyにおけるベクトル表示np.array([ ])

<img width="101" alt="コメント 2019-11-04 232422.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/7651daaf-df91-da89-1a9d-1a453937c944.png">

numpyにおける平均値の求め方　.mean
センタリング
→座標の移動

<img width="151" alt="コメント 2019-11-04 232617.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/b7491adb-e530-6721-884b-32a07e9c5879.png">

numpyにおけるベクトルの内積の求め方
各パラメータの合計値の求め方

pandas
<img width="194" alt="コメント 2019-11-04 233950.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/ef009111-d5c2-eb56-59e5-e1fe5b18ae2c.png">

df.head(3) = 初めのデータ3つだけ表示

<img width="115" alt="コメント 2019-11-04 233951.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/9dfb8251-7c81-04fc-6301-46f82119fa82.png">

matplotlib
<img width="300" alt="コメント 2019-11-04 234916.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/6c2e0125-a075-eab5-d971-764898ef55cd.png">

<img width="402" alt="コメント 2019-11-05 001127.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/35b4c207-733e-6734-58df-67866a8bf0c6.png">
凡例の使い方
JavaでBufferdImageのRGB誤差が指定割合以内か確認する静的関数


## 背景
* 画像の変換処理がうまくいっているかのテストで、RGB値が多少変わってしまう現象と遭遇した
* 等価判定ができなかったので、どのくらいの誤差を割合で許容するか。という作りにした。
* ニッチなニーズかもしれないが、誰かの一助になることを願ってます。

## 動作確認環境
* Java8
* JUnit4

## Code
```java
	/**
	 * ピクセルごとのRed,Green,Blueの色の要素値をAssertします。
	 * 
	 * 要素値の差(±)は 増減 5% まで許容してます。
	 */
	static void assertImages(BufferedImage actual, BufferedImage expected) {
		assertThat("比較している画像サイズが異なります（縦）", actual.getHeight(), is(expected.getHeight()));
		assertThat("比較している画像サイズが異なります（横）", actual.getWidth(), is(expected.getWidth()));

		// 誤差を許容するパーセント
		final int ACCEPTABLE_PERCENTAGE = 5;
		// 誤差を許容する数値(±)
		final int ACCEPTABLE_DIFFERENCE = 255 * ACCEPTABLE_PERCENTAGE / 100 / 2;

		int width = actual.getWidth();
		int height = actual.getHeight();
		for (int y = 0; y < height; y++) {
			for (int x = 0; x < width; x++) {
				Color actualColor = new Color(actual.getRGB(x, y));
				Color expectedColor = new Color(expected.getRGB(x, y));

				assertThat("色の要素値が許容範囲(±" + ACCEPTABLE_PERCENTAGE + "%)を超えてます：Red",
						(double) actualColor.getRed(),
						is(closeTo((double) expectedColor.getRed(), ACCEPTABLE_DIFFERENCE)));

				assertThat("色の要素値が許容範囲(±" + ACCEPTABLE_PERCENTAGE + "%)を超えてます：Green",
						(double) actualColor.getGreen(),
						is(closeTo((double) expectedColor.getGreen(), ACCEPTABLE_DIFFERENCE)));

				assertThat("色の要素値が許容範囲(±" + ACCEPTABLE_PERCENTAGE + "%)を超えてます：Blue",
						(double) actualColor.getBlue(),
						is(closeTo((double) expectedColor.getBlue(), ACCEPTABLE_DIFFERENCE)));
			}
		}
	}
```
Visual Studio Code設定

開発環境を再構築する際のメモとして、自分のVisual Studio Code設定をまとめた。

設定ファイルは[こちら](https://gist.github.com/unhurried/1de20d2296c73d29fe98a266e737b564#file-settings-json)を参照。

#### ユーザー設定

ユーザー設定ファイル（settings.json）を記述することで、エディタの動作をカスタマイズできる。設定ファイルは `Shift + Ctrl + P` でコマンドパレットを開き、`Preferences: Open Settings (JSON)` を選択すれば表示できる。

#### エディタ全般の設定

```json
{
    /* 全般設定 */ 
    // 拡大率を少し小さめにする
    "window.zoomLevel": -1,
    // minimapを表示しない
    "editor.minimap.enabled": false,
}
```

##### 参考

* [User and Workspace Settings - Visual Studio Code](https://code.visualstudio.com/docs/getstarted/settings)

#### プラグイン設定

##### [VSCodeVim](https://github.com/VSCodeVim/Vim)

Vimエディタのキーバインドが利用できるようになる。使いやすくするためにユーザー設定に以下を記述する。

```json
{
    /* VSCodeVim設定 */ 
    // Visual Studio Codeのキーバインドを優先する
    "vim.handleKeys": {
        "<C-a>": false,
        "<C-f>": false,
        "<C-S-f>": false,
        "<C-z>": false,
        "<C-s>": false,
        "<C-p>": false,
        "<C-S-p>": false,
    },
    // OSのクリップボードを利用する
    "vim.useSystemClipboard": true,
    // 検索結果をハイライトする
    "vim.hlsearch": true,
    // easymotionを有効化する
    "vim.easymotion": true,
    // <leader>をスペースキーに変更する
    "vim.leader": "<space>",
    // Shift + hjkl でまとめて移動できるようにする
    "vim.normalModeKeyBindings": [
        {
            "before": [
                "H"
            ],
            "after": [
                "1",
                "0",
                "h"
            ]
        },
        {
            "before": [
                "J"
            ],
            "after": [
                "1",
                "0",
                "j"
            ]
        },
        {
            "before": [
                "K"
            ],
            "after": [
                "1",
                "0",
                "k"
            ]
        },
        {
            "before": [
                "L"
            ],
            "after": [
                "1",
                "0",
                "l"
            ]
        }
    ],
}
```

###### 参考

* [割と突き詰めてやったvim→vscode移行](https://qiita.com/y-mattun/items/45776b7e1942edb2f727)
* [Vim風VS Codeカスタマイズ詳細](https://www.kickbase.net/entry/vscode-settings)
PHPStormで、 git fetch -p が効かない対処法メモ

## 事象

* PHPStorm上のターミナルで、git fetch -p しても remoteブランチの情報が、PHPStorm上から消えない。

## 解決方法

* どうやらメニューからやらないといけないっぽい
  * https://intellij-support.jetbrains.com/hc/en-us/community/posts/206598135-How-can-I-refresh-remote-Git-branches-
をやったら、リフレッシュされた。

## 一言

* IDE上からLocal／Remoteブランチを削除する時に使ってます。便利。
DSP FMラジオ RDA5807FP+ATTINY85+AQM0802A その3 全体回路図

#はじめに
* 電池駆動DSPラジオのその3。全体回路図。
* 回路図というか配置図。fritzingの使い方がよくわかりません。

#全体配置図
* fritzingで書いてみましたが、使用した部品がfritzingになかったりで、今一つな出来上がり。
* とりあえず全体図を載せますが、各パーツに関する他記事もご参照ください。
* ブレッドボード上部のICはDIP化したRDA5807FPです。左上が１番ピン、パスコンは表面実装の0.1μFです。
* ブレッドボード下部のATTINY85は右下が１番ピンです。

![RDA5807FP_KAIRO.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/266d676c-714a-3e88-e047-b668f4dcdf44.jpeg)

#おまけ
* 本記事はここまで。今後は各パーツの解説をして、最後にコードの投稿予定です。
GTK+プログラミングやってみる

#GTK+プログラミングやってみる

着手しはじめた、QEMUのコードリーディングだったのだが
いざ読み始めてたり、調べたりすると
イベントループ処理の流れを理解するにはGLibの動作を知る必要がありそうだということが分かった。

###GLib
出典: フリー百科事典『ウィキペディア（Wikipedia）』
>
GLib とは、C言語で書かれたクロスプラットフォームのユーティリティライブラリの一種である。
【GTK+プロジェクトの一部】としてスタートしたが、現在では他のアプリケーションでも使われている。
当初は低レベルなコードを入れるためのライブラリとされていたが、現在ではプラットフォーム間の差異を吸収する機能も加えられ、
異なるCPU、OS間でのアプリケーションの移植性を確保するライブラリとしても利用されている。
>

Glibは、GTK+の一部とのこと
で、GTK+というのは
GUI アプリケーションを作成するためのツールキット（ライブラリ）のひとつ
もともとは GIMP という画像編集ソフトを作成するために開発されたとのこと

GTK+はQtと並んで、Linuxの標準的なGUIツールキットのようだ
ざっとヘルプとか見るとWindowsでいうなら、MFCに近い感じかな。

GUIプログラミングはもっぱらWindows畑で育ったので、LinuxのGUIプログラミングは全くの未経験
ちょっと寄り道になるけど、GTK+を少し触ってみるっていうのが本記事


###利用環境
>
CentOS Linux release 7.7.1908 (Core)
gtk2-devel-2.24.31-1.el7.x86_64
>

###GTK+のCentOSへのインストール

CentOS でGTK 2 パッケージがインストールされているか確認する方法
rpm -q gtk2
rpm -q gtk2-devel

gtk2-devel は入って無かった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480709/ccf5cafe-f747-7539-be01-3aef90ba89d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480709/136050ff-c52c-c2ac-4c67-56f23352c5dd.png)

そこで、gtk2-devel のインストール(yumにて)
~~~bash
yum install gtk2-devel
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480709/36441c6b-ef55-6b46-0e6a-d93dc3713164.png)

###ちょんプロ (HELLO SKKS)
```HelloGTK2.c
#include <gtk/gtk.h>

static void destroy(GtkWidget *window, gpointer data)
{
    /*  メインループを終了  */
    gtk_main_quit();
}

int main(int argc, char *argv[])
{
    GtkWidget *window, *label;

    /*  GTK+ の初期化  */
    gtk_init(&argc, &argv);

    /*  ウィンドウ(GtkWindow) の作成  */
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    /*  ウィンドウの初期設定  */
    gtk_window_set_title(GTK_WINDOW(window), "SKKS");  //  title
    gtk_widget_set_size_request(window, 200, 100);      //  window size

    /*  ウィンドウが消去されたときのコールバック関数を設定  */
    g_signal_connect(G_OBJECT(window), "destroy",
                     G_CALLBACK(destroy), NULL);

    /*  ラベル(GtkLabel) の作成  */
    label = gtk_label_new("Hello, SKKS!");

    /*  ラベルをウィンドウに追加  */
    gtk_container_add(GTK_CONTAINER(window), label);

    /*  ウィンドウを表示  */
    gtk_widget_show_all(window);

    /*  メインループ  */
    gtk_main();

    return 0;
}
```

###コンパイル
~~~bash
gcc -Wall -o hello HelloGTK2.c `pkg-config --cflags --libs gtk+-2.0`
~~~

Linux畑の人には常識かも知れませんが、調べたのでメモ
シェルスクリプトの中で，コマンドを `（グレイヴアクセント，アクサングラベ，shft+@)で括ると，その部分がそのコマンドの実行結果で置き換わる．
つまり、gtk+2.0に必要な、 -I や -L などをpkg-configコマンドで生み出している
では、pkg-configとは？
以下はWikipediaより
>
pkg-configは、環境変数PKG_CONFIG_PATHのパスに存在する *.pc ファイルに記録された情報を元に、ビルドの際に必要な文字列を返す。
例えば、libaaa.soを /usr/local/lib/aaa/ 以下に保存し、ヘッダファイルを /usr/local/include/aaa/ 以下にインストールした場合
libaaa.so を利用したソースをコンパイルする際に、コンパイラへlibとincludeのパス等を指定する必要があるが、
そのパスが環境ごとに異なる場合を考えると必ずしも gcc -I/usr/local/lib/include -o a.c -L/usr/local/lib/aaa -laaa が成立するとは限らない。
もしもlibaaa が aaa.pc を提供していれば、
pkg-config aaa --cflags
で文字列 -I /usr/local/lib/aaa を得られ、
pkg-config aaa --libs
で文字列 -L /usr/local/lib/aaa -laaa を得られる
>

###実行結果
CentOSのデスクトップに入って、ダブルクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480709/c354f994-5d17-d019-d169-3195c56cf93a.png)
pandasでデータいじりのベストプラクティス

機械学習で、データの前処理が終わったあとに、仮説を持ちながら、
データと戯れる？弄る？フェーズがあると思うのですが、
そのときにpandasを如何に自由自在に操れるかというのが、
大切になってくると思っています。

私自身、少しだけプログラミングの経験や、データベースの知識がある中で、

***pandasのDataFrameの [] ←これややこしすぎ！！***


特に、条件で絞り込むのがつらいなと。

```Python
train[train["company_id"] == 1088]["meter_reading"]
```

この時点でややこしいけど、これがtrain_weather_dfだったら、もうまじで破滅する

```Python
train_weather_df[train_weather_df[“company_id”]==1088][“meter_readings”]
```

さらに、条件が二つになると、より恐ろしいことが起こります・・・

なので、少し複雑なことをやるには、
***.query()を使う***のが良いと思う。

```Python
train.query(qry)["meter_reading"]
```

ただ絞り込んだあと、分析用に「これをグループ１」としようみたいなことってあると思うのですが、
queryメソッドで取ってきたときに直接代入はできないのが注意。

```Python
××××　train.query(qry )["group"] = 1
```
***はできない!!***


そのときの少し回りくどいやり方だけど、多分以下が良いと思います。

```Python
qry = 'company_id == 1088 & meter_reading > 20000'
target_idx = train.query(qry).index
train["group"].loc(target_idx) = 1
```

可読性もそこまで悪くないし、何より、

```Python
train.loc(target_idx) 
```
これで、うまく絞れてるかを確認できるのが良いと思います。

ただ、queryの中に入れられる文字には制限があるそうで、、
そのあたりはいつか困ることになるかもしれない。

ちなみに、このサイトのqueryの例は参考になります。
https://ohke.hateblo.jp/entry/2019/01/12/230000
(engine = pythonとかね)

※追記
queryの中で変数を使いたいというケースがあると思うんですが、
@を頭につけると、変数として認識してくれます！！
これめちゃくちゃ重要。

```python

 tmp_q = "name_ns == @t_name & year == @t_year "
```


参考にした記事
https://qiita.com/kurumen-b/items/45b60299f0893a537f2a
https://qiita.com/mwmsnn/items/6a464865759231aa888d

さらに追記
最近のpandasだと、列絞ってから、ilocみたいな書き方が推奨されないようで、
余計にこの記法が重要になりそうです。
行番号、列番号、行ラベル、カラム名あたりを行ったり来たりしたくなったら、以下を参照
https://note.nkmk.me/python-pandas-get-loc-row-column-num/
ngrokの利用方法

# ngrokの利用方法
業務でngrokを利用したので、忘れない為にも利用方法を記載します。

## ngrokとは？
https://ngrok.com/

>Public URLs for building webhook integrations.
Spend more time programming. One command for an instant, secure URL to your localhost server through any NAT or firewall.

webhookを利用する為のpublicURLを発行できます。
簡易的にセキュアなURLをローカルホストサーバーにNATやFirewallを通して構築することが可能です。

有料プランと無料プランがありますが、ちょっとした動作確認が目的の場合は無料プランで十分です。

## ngrok説明図

<img width="656" alt="スクリーンショット 2019-11-04 22.46.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286094/2f068aba-2f81-3b82-7bdd-6711660bf599.png">

画像参考：[ngrok を使ったら Webhook のデバッグが非常に捗った話](https://blog.shibayan.jp/entry/20150127/1422322065)



## ngrokのメリット

```
1. デモサイトをデプロイせずに試すことが出来る
2. 開発環境でwebhookを試す事が出来る
3. モバイルappのバックエンドサービスをテストを出来る。
4. httpだけではなくhttps通信可能
```

## ngrokを利用した理由
ngrokを利用してローカル環境を外部に公開すれば、デプロイせずにwebhookの受信テストをローカル環境で試す事が出来ると思ったから。



## ngrokの使い方
基本的には以下のサイトを参考にしました。
https://qiita.com/kitaro729/items/44214f9f81d3ebda58bd

### インストール
``` shell
brew install ngrok
```
インストール完了すると、以下のコマンド叩けばバージョンが確認できます。

``` shell
❯❯❯ ngrok --version                                                                                                                                               [~/Desktop/workspac]
ngrok version 2.3.35
```

### 実行
ローカルで起動しているページのポート番号を入れ起動します。

```
http://localhost:3000
```

の場合はポート番号3000なのでこのように実行

```
ngrok http 3000
```
こんな画面が見れれば成功

```
Session Status                online
Session Expires               7 hours, 59 minutes
Version                       2.3.35
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://1fd2ec17.ngrok.io -> http://localhost:3000
Forwarding                    https://1fd2ec17.ngrok.io -> http://localhost:3000

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00
```

### アクセス

httpの場合

```
http://1fd2ec17.ngrok.io
```

httpsの場合

```
https://1fd2ec17.ngrok.io
```

## まとめ
簡単にローカル環境をhttp/httpsで外部公開できるので、webhookURLで本当にhttps受信できるのか確認したりする時に便利です。あと、デモサイトを外部に一時的に見せるときとかにも便利です。
「Flutter入門」で躓いた箇所

1週間ほど前からFultterの勉強をはじめました。  
公式チュートリアルを少し触った後、[Flutter入門(秀和システム)](https://www.amazon.co.jp/dp/B07Q19LVW2/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)で勉強をしていたのですが、
こちらの本がAndroid向けに書かれているため、iOSではサンプルプログラムがそのままでは動作しない箇所があったため対処法をまとめておきます。

本の内容から関数名や処理内容などは変更しています。

VSCodeで開発およびデバッグをしていました。

## ユーザーデータへのアクセス権の取得
### 現象
アクセス権を取得するために[`simple_permissions`](https://pub.dev/packages/simple_permissions)を使用していますが、以下の処理でアプリケーションが強制終了していました。

```main.dart
void requestPermission() async {
  await SimplePermissions.requestPermission(Permission.Camera);
  await SimplePermissions.requestPermission(Permission.WriteExternalStorage);
}
```

### 対処法
ユーザーデータへアクセスする目的を記述

```iOS/Runner/info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>NSPhotoLibraryUsageDescription</key>
	<string>load local pictures</string>
    <key>NSAppleMusicUsageDescription</key>
	<string>save pictures</string>
        ....
```


参考：https://dev.classmethod.jp/smartphone/iphone/ios10-privacy-data-purpose-description/

## 画像保存のアクセス権取得
### 現象

画像保存のアクセス権取得処理用の以下のパラメータはAndroid専用パラメータらしく、例外が発生して停止する。

```main.dart
void requestPermission() async {
  await SimplePermissions.requestPermission(Permission.WriteExternalStorage);
  ...
}
```

### 対処法
AndroidとiOSで処理を分けてiOS用のパラメータに変更。

```main.dart
void requestPermission() async {
    if (Platform.isAndroid && !await SimplePermissions.checkPermission(Permission.WriteExternalStorage)) {
      SimplePermissions.requestPermission(Permission.WriteExternalStorage);
    } else if (Platform.isIOS && !await SimplePermissions.checkPermission(Permission.PhotoLibrary)) {
      SimplePermissions.requestPermission(Permission.PhotoLibrary);
    }
  ...
}
```
参考：https://blog.aftercider.com/entry/2018/12/10/000000


## 返り値の型が合わないと怒られる
以下の様な `dart:ui.Picture.toImage` を使用する部分でエラーが発生しました。

```main.dart
import 'dart:ui' as ui;
class MyClass extends CustomPainter {
  ...
  @override
  void hoge() {
    ui.Image img = piyo();
    ...
  }
  ...
  // ui.Imageを返す
  ui.Image piyo(){
    ....
    ui.Picture picture = recorder.endRecording();
    return picture.toImage(100.0, 100.0);
  }
}
```

エラー

```
The return type 'Future<Image>' isn't a 'Image', as defined by the method 'drawToCanvas'.dart(return_of_invalid_type)
```

## 対処法
`dart:ui.Picture.toImage()` の返り値の型は `Future<Image>` なので、返り値の型を変更。
また、`drawToCanvas()` をコールしている箇所を変更。
(async, awaitを追加)

```main.dart
import 'dart:ui' as ui;
class MyClass extends CustomPainter {
  ...
  @override
  void hoge() async{
    ui.Image img = await piyo();
    ...
  }
  ...
  // ui.Imageを返す
  Future<ui.Image> piyo(){
    ....
    ui.Picture picture = recorder.endRecording();
    return picture.toImage(100.0, 100.0);
  }
}
```

これでiOSでもひとまず動く様になりました。
何かおかしい部分などありましたらコメントで教えていただけるとありがたいです。
javaのjshellとvar がおススメ過ぎます！

最近、Javaのイベントに行ったので、そのメモになります。

# jshell
## なにもの？
何者！かというと、気軽にＪａｖａコマンドを実行できるツールです。
Rubyだと「irb」がありますよね。

Javaだと、、Eclipse を起動して、実行？もしくは、javacでコンパイルして、java で実行？
むっちゃ手間でした。

jshellを使うと、サクッと確認できます。
こんな感じ。タブで自動保管も出来るのがチョー便利です。

```
D:\Program Files>jshell
|  JShellへようこそ -- バージョン13
|  概要については、次を入力してください: /help intro

jshell> System
シグネチャ:
java.lang.System

<ドキュメントを表示するにはタブを再度押してください>
jshell> System.out.p
print(     printf(    println(
jshell> System.out.println("Hello World!!");
Hello World!!

jshell>
```
## どのバージョンからの機能？
ちなみに、Java9から、搭載された機能です。
もっと早く知ればよかった。。

# var
## どのバージョンからの機能？
Java10からの機能ですね。
実は知っていました、でも、勘違いして使っていませんでした。

## 勘違いしてたこと
javascriptのようなvarだと思っていました。
要するに「型保証」しない型かと。。

イベントで話を聞いたら違いました。

要するに「String」をセットした「var変数」に「数値」をセットできてしまう！と思っていましたが、
ちゃんとエラーになりました。

```
jshell> var testVal = "test data";
testVal ==> "test data"

jshell> testVal = 1;
|  エラー:
|  不適合な型: intをjava.lang.Stringに変換できません:
|  testVal = 1;
|            ^

jshell>
```

## varが生まれた経緯
この話が一番、目から鱗でした。

### var が無い頃

```
jshell> class Customer {
   ...>   void test(){
   ...>     System.out.println("Hello World");
   ...>   }
   ...> }
|  次を作成しました: クラス Customer

jshell> Customer customer = new Customer();
customer ==> Customer@5025a98f

jshell>
```
こんな風に書いて、「Customer customer = new Customer();」という形で、「customer」を３回書いています。
人によっては、「Customer cu = new Customer();」みたく、変数名を省略します。これは可読性が下がるのでやめたいです。

で、考えられたのが、「var」です。
### varを使った場合
```
jshell> var customer = new Customer();
customer ==> Customer@20322d26

jshell>
```

「var customer = new Customer();」という形で、変数名を省略せず、「customer」を２回に減らせました！
要するに、変数名を省略せず、繰り返し書いていた内容を書かなくて済むようになりました。

これが、「var」を考えた人の目的とのこと。

目から鱗でした。
これからは「var」を使っていきます。
UPDATE文（複数）

## サンプルテーブル
- テーブル1

| IKO_KEY_1 | PREFECTURE | CITY | BIKO_1 | BIKO_2 |
|:-:|:-:|:-:|:-:|:-:|


- テーブル2

| IKO_KEY_2 | PREFECTURE | CITY | BIKO_2 |
|:-:|:-:|:-:|:-:|

- updateのSQL

```sql:update.sql
UPDATE dev.IKO_TABEL_1 a
SET (CITY,BIKO_2) = 
	(SELECT 
		CITY,
		BIKO_2 
	FROM IKO_TABLE_2 b 
	WHERE 
	a.IKO_KEY_1 = b.IKO_KEY_2
	)
```

## sql

```sql:createsampletable.sql

CREATE TABLE IKO_TABEL_1
(
	"IKO_KEY_1" VARCHAR2(10),
	"PREFECTURE" VARCHAR2(20),
	"CITY" VARCHAR2(20),
	"BIKO_1" VARCHAR2(50),
	"BIKO_2" VARCHAR2(50)
)

CREATE TABLE IKO_TABLE_2
(
	IKO_KEY_2	VARCHAR2(10),
	CITY		VARCHAR2(20),
	BIKO_2		VARCHAR2(50)
);

```
【画像分類(実践編)①】AI革命のスタートポイント、AlexNetを、徹底解説。

![alexnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527577/6f918f21-f7ed-d593-e69f-c63d3c5b9dc0.png)2012年、画像のコンペティションILSVRCに衝撃が走った。去年までのエラー率の最高は26.2％だったのに対して、トロント大学のジェフリー・ヒントン教授のグループが史上最高の成績15.3%を叩き出したのだ。これは、人間の判断率5.0%に大きく近づく大躍進だった。

このサイトは、論文を分かりやすく解説することを念頭に書いています。
もしわかりづらい部分があれば、随時コメント欄から質問よろしくお願いします。

まず、この画像コンペティション ILSVRCとは？について説明する。このコンペティションは1000種類の画像が全部で1400万枚という膨大な画像データセットに対して、3種類のタスクを行う。

- ある1枚の画像がどのクラスに分類されるかというClassificationと呼ばれるタスク
- ある1枚の画像がどこにあるかという場所の指定とどのクラスに分類されるかを同時に行う
Localizationと呼ばれるタスク
- ある1枚の画像に対して、複数の物体があり、その物体全てに対して、どこにあるかを特定するObject Detectionと呼ばれるタスク
の3種類が存在する。
実際にこのモデルを作成する際には、与えられたデータセットを学習用とテスト用、学習のテスト 用の3つに分け、テスト用のデータセットに対して、1000種類の画像を分類し得点を競うのだ。

このAlexNetは当時あまり使われていなかった畳み込みニューラルネットワーク(Convolutional Neural Network)を活用し、問題とされていた過学習(Overfitting)を2つの手法を用いて、ある程度解決し、大きく性能を向上させた。

[詳しくはこちら](https://haderz.com/22/)
AWS CLI経由でEC2インスタンスを立ち上げる

# 手順
順に実行していくコマンドは以下の通り
1. AWS CLIの準備
2. AWS ACCESS KEY IDとAWS SECRET ACCESS KEYの取得
3. キーペアの作成
4. セキュリティグループの作成
5. EC2の起動
6. EIPの取得と紐付け
7. ssh接続

# 1. AWS CLIの準備
pipでインストールする。

```
$ pip3 install awscli --upgrade —-user
```
[公式の説明](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)によるとOSで使用するライブラリの変更を避けるために、--userオプションをつけ、
ユーザーディレクトリのサブディレクトリにプログラムをインストールすることを推奨しているらしい。
注意点として、上記サブディレクトリにパスが通っているか要確認。（該当するならpipのエラー文に詳細有）  
おそらく以下のようなパスを通せば良い。
`/Users/username/.local/bin/aws`

（おまけ）
AWS CLIのコマンド補完を有効化するには、以下のコマンドをbashrcに追記すればよい。

```
$ complete -C aws_completer aws
```

# 2. AWS ACCESS KEY IDとAWS SECRET ACCESS KEYの取得
AWS CLIを通してAWSの様々なサービスを利用するには上記アクセスキーIDとシークレットアクセスキーが必要になる。
マネジメントコンソールの「マイセキュリティ資格情報」からcsvファイルをダウンロードして
以下のコマンドを実行して設定する。

```
$ aws configure
```
# 3. キーペアの作成
各EC2インスタンスに対応するキーペアを作成する（これがないとインスタンスに接続できない）。

```
$ aws ec2 create-key-pair --key-name my-keypair-from-cli
```

# 4. セキュリティグループの作成
以下のコマンドでまずセキュリティグループを作成する。

```
$ aws ec2 create-security-group --group-name my-security-group-from-cli --description my-security-group-from-cli
```
作成したセキュリティグループにはまだルールが追加されておらず、デフォルトの設定が適応される。
デフォルトでは、インバウンドのポートは全て閉じられていて、必要なものだけを開ける必要がある。
一方、アウトバウンドの通信はポートが全て開いているため設定する必要がないことの方が多いだろう。

任意のルールを追記する場合は以下のコマンドを実行する。

```
$ aws ec2 authorize-security-group-ingress --group-id sg-xxx --protocol tcp --port 22 --cidr 0.0.0.0/0
```
group-idオプションには`create-security-group`コマンドで出力されたIDを埋める。
その他のオプションには、設定したい内容を記入していくとよい。

# 5. EC2の起動
最後にEC2を以下のコマンドで起動する。
オプションのAMI IDやサブネットIDはマネジメントコンソールからEC2インスタンスを作成する時のステップで確認すればよい。

```
$ aws ec2 run-instances --image-id ami-xxx --instance-type t2.micro --security-group-ids sg-xxx --key-name my-keypair-from-cli --subnet-id subnet-xxx
```
また、インスタンス名を付与したい場合は、以下のコマンドで実行できる。
resourcesオプションは、`run-instances`コマンドのInstanceIDを指定する。

```
$ aws ec2 create-tags --resources i-xxx --tags Key=Name,Value=my-instance
```

# 6. EIPの取得と紐付け 
上記で作成したインスタンスにはパブリックIPがなく、インスタンスの起動・停止に応じて動的にIPが変更される。
WebサービスなどでIPを固定したい場合はEIPを作成し紐づける必要がある。

```
$ aws ec2 allocate-address
```
こちらのコマンドでAWSが固定可能なIPアドレスを返してくれるので、
それを作成したインスタンスに紐づける。
allocation-idオプションは`allocate-address`コマンドで出力されるAllocationIdを指定する。

```
$ aws ec2 associate-address --allocation-id eipalloc-xxx --instance-id i-xxx
```

# 7. ssh接続
xx.xx.xx.xxには取得したEIPを指定する。

```
$ ssh -i my-keypair-from-cli.pem ec2-user@xx.xx.xx.xx
```
また、my-keypair-from-cli.pemの指定には以下の注意点がある。

- Permissionはユーザーのみの権限にする。  
すなわち、`chmod 400（or 600） my-keypair-from-cli.pem`
- もし.pemファイルの形式がおかしい場合、[リンク先](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-ec2-keypairs.html)を参考に書き換える。  
当方が直面したのは、改行コード\nがテキスト扱いされていたため、改行するよう置換する必要があった。  
vimで`:%s/\\n/^M/gc`で解決した。（^Mは`Ctrl+v Ctrl+m`で入力する）

※EC2インスタンスのAMIがubuntuの場合、ユーザー名ec2-userは使えず、ubuntuに変える必要がある。[参考](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connection-prereqs.html)

# おまけ
### EC2インスタンスの起動
```
$ aws ec2 start-instances --instance-ids i-xxx
```

### EC2インスタンスの再起動
```
$ aws ec2 reboot-instances --instance-ids i-xxx
```

### EC2インスタンスの停止
```
$ aws ec2 stop-instances --instance-ids i-xxx
```
### EC2インスタンスの削除
```
$ aws ec2 terminate-instances --instance-ids i-xxx
```
PowerShell を使って Azure Container Registry をデプロイする

今回は PowerShell で Azure Container Registry をデプロイしてみます。Azure Portal から実行する方法もありますが、PowerShell を使用することで、他のアプリケーションとの連携や DevOps 的観点でも非常に便利なのでやってみたいと思います。

#Azure Container Registry をデプロイする 
今回は使用する PowerShell Code は以下です。

```powershell
New-AzResourceGroup -Name myContainer -Location Japaneast
$registry = New-AzContainerRegistry -ResourceGroupName "myContainer" -Name "myContainerRegistry1110" -EnableAdminUser -Sku Basic
```

まず `New-AzResourceGroup` で新しいリソースグループを作成します。今回は、東日本リージョンに、myContainer という名前のリソースグループを作成します、
そのあとで、`New-AzContainerRegistry` で myContainerRegistry という Container Registry を作成します。

この時、Registry Name は一意である必要があるので、既に使用されているものを指定してしまうと、エラーが吐き出されます。一意の名前を指定しましょう。

#作成した Container Registry にログインする
次に作成したレジストリにログインします。レジストリにログインしたら Docker Login を使用してログインします。以下が P
owerShell Code です。

```powershell
$creds = Get-AzContainerRegistryCredential -Registry $registry
$creds.Password | docker login $registry.LoginServer -u $creds.Username --password-stdin
```

これまで PowerShell で Docker Image を作成したことがないという方は、別途 dokcer のインストールが必要です。
以下ページより Docker のインストールを実行してください。
[Docker のインストール](http://docs.docker.jp/engine/installation/)

これで Docker を使用して Container を作成することが可能です。

#Azure Portal を確認する
実際に Azure Portal を確認してみると、PowerShell で作成した Container Registry が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/bb1a2cfd-bb46-25f9-162d-14eb242518e8.png)

次回記事では container に レポジトリを作成する方法などを PowerShell を使用して実行してみようと思います。
amazon forecastやってみた - 2. 学習データのインポート

# はじめに
今日イベントでAmazon forecastで時系列予測の事例紹介を見たところ
とてもお手軽にできそうな感じがつかめたのでその日のうちにやってみた。
参考：https://dev.classmethod.jp/cloud/aws/amazon-forecast-getting-start/

大きな流れはコチラ。
　1. 学習データを取得する
　2. 学習データのインポート　←今回はココ！
　3. amazon forecastの設定
　4. 学習結果の確認

# 2.学習データのインポート
学習データはS3にインポートさせる
以下、手順
①AWSにログインする
　https://aws.amazon.com/jp/

②S3のTOP画面へ移動する
TOP画面へ移動後、[バケットを作成する]クリック
![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/07dba559-2c5d-342f-5f64-b95365429f05.png)

③学習データを格納するバケットを作成する
ネーミングセンスが壊滅的だけどひとまず"kurashiki20162019"にした。
それ以外はデフォルトの設定で推し進めた。
![キャプチャ8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/bc3f3dbd-df2a-160e-f4db-f1af1134cdc0.png)
![キャプチャ9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/27c0dbc6-2852-4f20-fe1d-84a5d4746293.png)
![キャプチャ10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/68be7877-7076-96de-5a4d-2a9ad19efdc7.png)
![キャプチャ11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/e102571f-5e53-79b8-0c47-0c6a95ad4166.png)
![キャプチャ12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/102e2d47-864f-8ea1-9f20-d119d92bd8c9.png)

最後の画像で"kurashiki20162019"が出来上がったことが何となく確認できるはず。

④バケットに学習データをアップロードする
早速できあがった"kurashiki20162019"バケットをクリックして
学習データをアップロードする。こちらもアップロード以降はデフォルトの
設定ですすめた。
![キャプチャ13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/aee4db5e-fdd1-1524-47dc-507e9523d2a0.png)
![キャプチャ14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/a3fa309e-62ca-f136-e5ac-34a9f0cbf00a.png)
![キャプチャ15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/ba16be06-12a0-5809-6afa-ae001f6e9afe.png)
![キャプチャ16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/bb14bd10-cbb1-4137-8aea-718c7d896e42.png)
![キャプチャ17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/198933ca-9011-7fe4-bc6f-2fb312cae221.png)
![キャプチャ18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/b3c52f11-9495-6e3a-35a0-f51cbaedaccd.png)

⑤学習データのパスを取得する
amazon forecastで学習データのインポートをするために必要なパスを取得する。
取得方法は、アップロードしたcsvデータのチェックボックスをクリックすると
データの操作について画面右側から尋ねられるので、[コピーパス]クリックすればＯＫ。
![キャプチャ19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/af78e03f-c5ad-f38c-b349-1154bf057c14.png)


# おわりに
S3使い慣れてなくてわかる人がみたら「S3の説明をダラダラなにしてるんだろ？」
と言われるような内容になってしまった。。。けど、自分はあまりS3使ったことないので
これくらいがちょうどいい。

～次回へ続く～
グローバル変数に排他制御を行わなかったどうなるのか

### 排他制御とは
同じデータに対して、同時に更新処理が行われる際に、データの整合性を保つために行う処理のことである

###実際にやってみた
####排他制御を行わない場合

```C++:メインプロセス

#include <iostream>
#include <thread>
#include <chrono>

void countThread();
int count = 0;
int main()
{

	std::thread countThread1(countThread);
	std::thread countThread2(countThread); 
	countThread1.join();
	countThread2.join();

	std::cout << "count == " << count << "\n";
}
```


```C++:子スレッド

void countThread()
{
	for (int i = 0; i < 80000; i++)
	{
		count++;
		if ((i % 2000) == 0)
		{
			std::this_thread::sleep_for(std::chrono::milliseconds(1));
		}
	}
}
```


###結果
count == 141471
80000回のカウントアップを2スレッドで行っているので160000になるはずですが、競合が発生し18529回カウントアップに失敗しています。

###排他制御をした場合

今度は排他制御を行い、同様の処理を実行します。
今回はmutexを行い、排他制御します。
メインプロセスと子スレッドを以下のように変更します。

```C++:メインプロセス
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>

void countThread();
int count = 0;
std::mutex countMutex;

int main()
{

	std::thread countThread1(countThread);
	std::thread countThread2(countThread);
	countThread1.join();
	countThread2.join();

	std::cout << "count == " << count << "\n";
}
```

```C++:子スレッド
void countThread()
{
	for (int i = 0; i < 80000; i++)
	{
		countMutex.lock();
		count++;
		countMutex.unlock();
		if ((i % 2000) == 0)
		{
			std::this_thread::sleep_for(std::chrono::milliseconds(1));
		}
	}
}
```


###結果
count == 160000
排他制御を行った場合は欲しかった結果を得られることが出来ました。
排他制御を行わない場合でもコンパイル時、実行時にエラーが起こるわけでは気を付ける必要がありますね。
【MySQL】カラムのNULL・空白判定とCONCAT関数における扱いがややこしい

ややこしかったのでメモしておきます。

テーブルは以下の構成とします。（テーブル名はproducts）
型が違う場合の挙動は分かりません。

|名前           |データ型 
|:-------------|:------------------
| id           |           int(11) 
| name         |       varchar(30) 


# 「!=」は「=」の逆ではない
## 等価演算子
このSQLの場合、nameカラムがNULLのレコードが抽出されません。

```sql
SELECT * FROM `products` WHERE name = ''
```

nameカラムが`NULLと空白両方のレコードを抽出したい場合`は、NULL判定用の条件を追加する必要があります。

```sql
SELECT * FROM `products` WHERE name = '' OR name IS NULL
```

## 不等価演算子
こちらのSQLの場合、`nameカラムがNULL・空白両方のレコードが除外`されます。
等価演算子と真逆の挙動ではありません。

```sql
SELECT * FROM `products` WHERE name != ''
```

`<>`を使用した場合も同じ挙動でした。

```sql
SELECT * FROM `products` WHERE name <> ''
```

# CONCAT関数
## 連結するカラムの値がNULLの場合
nameカラムがNULLの場合は更新されず、NULLのままになります。

```sql
UPDATE products SET name = CONCAT('test', name)
```

## カラムの値がNULLでも連結させたい場合
`IFNULL関数`で値を空白に置き換えます。

```sql
UPDATE products SET name = CONCAT('test', IFNULL(name, '')) 
```

# 参考記事
- [[MySQL]空文字 or NULL を一息で判別したかった話](http://doshirouto.wp.xdomain.jp/web/other-web/3122)
- [[MySQL]nullを含むフィールドのconcat](https://happyquality.com/2009/03/16/877.htm)
- [CONCATでの文字列連結時にひとつでもNULLな項目があると「NULL」扱いになってしまう](https://qiita.com/cufh/items/6bce1548e32eb5a5f21d)
railsのエラー: データベースの名前

railsのエラーの備忘録です。

# カラム名では予約後は使えない
railsでは予約語が設定されておりシステム上使えないことになっています。
エラー内容はこんな感じで

ActiveRecord::SubclassNotFound (The single-table inheritance mechanism failed to locate the subclass: 'news'. This error is raised because the column 'type' is reserved for storing the class in case of inheritance. Please rename this column if you didn't intend it to be used for storing the inheritance class or overwrite Site.inheritance_column to use another column for that information.):
app/controllers/sites_controller.rb:5:in `index'

予約語の例として
reload
send
methods
from_xml
destroy
load
hash
class
touch
errors
changed
try
save
inspect
type
など使うとエラーが出るので注意が必要です。


# 対応方法
単純にカラム名を変更するだけです。

**その1、ターミナル下記のコマンドを打ち**
ails generate migration rename_[変更前のカラム名]_column_to_[モデル名(複数形)]

**その2、マイグレーションファイルを下記のように編集し**
def change
    rename_column :テーブル名, :変更前のカラム名, :変更後のカラム名
  end

**その3、あとはいつもどりmigrateです。**

rake db:migrate
基本技術者試験の勉強計画11月

## 目標と結果
### 目標
・目標以上を目指す
・わからないところをそのままにしない
・独習ゼミをたくさん使って理解する
・午前を終わらせる
### 結果
・わからないところの復讐を自分なりにやった。
・午前を終わらせた。
・主に過去問道場を使っていたが理解できた。
## 振り返り
### keep
・苦手分野もたくさん解いた。
### problem
・やらない日を作ってしまう。
### try
・忙しい日でも10分くらいは電車の中でもやるようにする。
## 週次計画
[3週目(11/4週)](https://qiita.com/poohsan/private/66ba87072d95be8f4820)
[4週目(11/11週)](https://qiita.com/poohsan/private/81bb990cddbc7ab09dfe)
[5週目(11/18週)](https://qiita.com/poohsan/private/9292a86934b531a760f2)
[6週目(11/25週)](https://qiita.com/poohsan/private/7508c2f60b2e3b64087e)
[Slack] Channelのメッセージを一括削除

### やりたいこと
Slackを無料プランで使用している場合、直近10,000件までしか閲覧、検索できないとのこと。
上限に近づいてきてしまったが、現状、有料プランに移行するのも難しいので、過去のメッセージを削除することで一時的に回避したい。

### 結論
https://github.com/sgratzl/slack-cleaner
このツールを使ったらうまくいった。
使い方はreadmeに書かれている通り。

### 試したこと
https://github.com/kfei/slack-cleaner
ググったら最初はこちらのツールがヒットした。
ただ、削除したいchannelが最初、publicチャンネルで作成し、後でprivateチャンネルに変更したものなのだが、
それがどうやらうまくいかないようだった。

```shell
$ slack-cleaner --token <Token> --message --channel channelName --user "*"
Running slack-cleaner v0.3.0
Channel, direct message or private group not found
```

`--channel` を `--group` と変えても同じ。

https://github.com/sgratzl/slack-cleaner
こちらは上記のforkでこちらは現在でもメンテされている様子。
こちらで試したところ、後でprivateチャンネルに変更したものでも `--group` で指定することで削除できた。

```shell
$ slack-cleaner --token <Token> --message --group channelName --user "*"
Running slack-cleaner v0.6.0
Deleting messages from group channelName
Will delete message -> ....
```
基本技術者試験の勉強計画　第3週（11/4週）

## 目標と結果
### 目標
・FE30までやる
・独習ゼミボタンを必ず押す
・目標を達成させる
### 結果
・FE30まで終了した
・独習ゼミのボタンを忘れてしまった

## 振り返り
### keep
・計画通りに勉強を進めること。
・一日一回はテキストを開くこと。
・時間があったら復習すること。
### problem
・独習ゼミのボタンを押し忘れてしまう。
・わからないところをそのままにしない。
### try
・過去問道場を一日最低１０分やる。