OmniAICreator/Qiita-1.07M huggingface dataset:
EfficientNetの事前学習モデルをPytorchで使う

#何の記事？
EfficientNetの事前学習モデルをKerasを用いて動かす方法は、[こちら](https://qiita.com/wakame1367/items/d90fa56bd9d11c4db50e)で解説されていますが、今回、Pytorchでも動かす方法を見つけたので、共有します。


#EfficientNetとは？
2019年5月にGoogle Brainから発表されたモデルです。広さ・深さ・解像度を効率よくスケールアップすることにより、少ないパラメータ数で高い精度を実現しています。使用できる単体のモデルの中では、最強と言ってよいでしょう。

<img width="400" alt="https___imgur.com_8AEOwTL.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/358521aa-aac8-25d1-22cc-8ca9e5b861f6.png">
>Tan, Mingxing, and Quoc V. Le. "EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks." arXiv preprint arXiv:1905.11946 (2019).

#Pytorch用のpretrained model
パラメータは、こちらのGitHub内に保存されています。
https://github.com/lukemelas/EfficientNet-PyTorch

以下のように書くと、そのままモデルにインポートできます。"efficientnet-b7"の数字の部分は、0～7まで変更可能ですが、上のグラフからわかるように、"7"を使うのが最も精度が高いです。

```php
!pip install efficientnet_pytorch 　#Google colabだとこれで動きます
from efficientnet_pytorch import EfficientNet

model_ft = EfficientNet.from_pretrained('efficientnet-b7') 　#Pretrained_modelのインポート
```


事前学習にはImageNetを用いているので、全結合層は1000クラスです。以下のようにクラス数を変更すれば転移学習に利用することができます。

```
num_ftrs = model_ft._fc.in_features　　#全結合層の名前は"_fc"となっています
model_ft._fc = nn.Linear(num_ftrs, 2)
```

###Pytorchを用いた転移学習
転移学習のスクリプトについて知りたい方は、こちらのサイトを参考にして下さい。
Pytorch tutorial： https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html
Raspberry Pi と I2C デバイスを長距離ケーブルで接続して通信する

# 概要

**30 m, 100 kHz で通信できました**

注：条件が異なれば結果は変わり、また信頼性試験をしたわけではないので、保証値ではなくあくまで実績です。各自の責任において参考にしてください。

# 条件

- Master
    - Raspberry Pi 3 model B+ / Raspbian / i2ctools
        - [core_freq=250](https://www.raspberrypi.org/forums/viewtopic.php?t=155756)
        - VDDIO = 3.3 V
        - プルアップ抵抗 1.8 kΩ (Raspberry Pi 実装済み)
- Slave
    - [MCP23017](http://akizukidenshi.com/catalog/g/gI-09486/)
        - 配線を 5V にしたので、スレーブ側 VDD は [3.3V LDO](http://akizukidenshi.com/catalog/g/gI-03289/) を使っています
        - 4.5 V 以上なら 1.7 MHz 対応だが、 3.3 V の場合は 400 kHz
        - こちらはプルアップ抵抗なし
- Cable
    - UTP （シールド無しツイストペアケーブル）
        - [26AWG の LANケーブル](https://www.elecom.co.jp/products/LD-CTNBU15.html) を流用
        - [P82B96](http://www.tij.co.jp/product/jp/P82B96) データシートのペア (5V:SCL / GND:SDA)
- 環境
    - 常温常湿
        - 約 20 ℃ / 約 60 %RH
- 方法
    - i2ctools の `i2cdetect` `i2cget` コマンドでスレーブの反応を確認
    - ケーブルの長さとマスターの `i2c_baudrate` を変更して、通信可能な最大速度を確認
        - i2c_baudrate は 100 kHz 刻みで変更

# 検証

## 様子

MCP23017 & LDO 以外にも、いろいろくっついていますが影響は小さいはず（むしろ負荷容量が増えて悪影響ある）

![DSC_0891.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204096/ad5f6c26-47c6-22aa-ea66-499188e307ce.jpeg)

## 結果

ケーブル長 | 通信可能速度 | 備考
:-:|:-:|---
0.3 m | 700 kHz | ツイストペアでない 26AWG
3 m | 600 kHz
5 m | 500 kHz
10 m | 300 kHz
15 m | 200 kHz
30 m | 100 kHz

近似すると `通信可能速度(kHz) = 670 * exp(-0.0675 * 配線長(m))` となる。
それによると 60 m, 10 kHz 程度が実用的な限度か

## 背景と考察

長距離の通信を「低速で構わない」ので「低コスト」で行いたい。
[いろいろ](http://www.fec.co.jp/product/i2c/PCA9600D.htm) 調べ、 [P82B96](http://www.tij.co.jp/product/jp/P82B96) という I2C エクステンダ（バスバッファ）を試そうとしました。（そのため検証基板に P82B96 と周辺部品が乗っています）

比較のために素の I2C の実力を測ってみたところ、想像以上に実力があったのでエクステンダの検証はやめました :laughing: 
ただ、構成によって結果は変わりますし、環境変動・ノイズへの耐性も不明なので、何か判明したら記事を追加します。

PCA9600D （ [秋月](http://akizukidenshi.com/catalog/g/gI-15018/) や [Switch Science](https://www.switch-science.com/catalog/2376/) で購入可能）を購入する前に、まずは試してみる価値のある方法です。

私は、この方法を試す前に先走って [ジャパンエレキットで P82B96 を注文](https://store.shopping.yahoo.co.jp/japan-elekit/5927.html) してしまいましたよ。。。 

せっかく検証環境が整ったので、デバイスの検証リクエストあれば検討します :thumbsup: 

## 未検証項目

- Raspberry Pi 3B+ 以外の master
- MCP23017 以外の slave
- 30 m 超えケーブル
- UTP 以外のケーブル
- P82B96 等のバスバッファ利用
- 環境試験
- ノイズ試験
C言語からC++で戸惑ったところ　メンバ初期化子リストを持つ構造体の配列

メンバ初期化子リストもつ構造体の配列で戸惑ったのでまとめ。
コンストラクタを持つ構造体
vectorも組み合わさってきて混乱した。

##メンバ初期化子リストという機能
構造体の中に書かれる見たこと無い関数の書き方に戸惑った。
メンバ初期化子リストという構造体のメンバ（変数）を初期化する機能とのこと。

```cpp
Edge(int t, int w) : to(t), weight(w) {}
```

今回は、メンバはconstで宣言されていないので、下記のように書き換えることができるが、メンバがconstで宣言されたときは上記の書き方必要になる。

```cpp
Edge(int t, int w){
    to = t;
    weight = w;
}
```

##全体のコード

```cpp
#include <iostream>
#include <vector>
using namespace std;

/* c++では構造体宣言がtypedef宣言も兼ねることになった。 */
struct Edge
{
    int to;
    int weight;
    /* メンバ初期化子リストという機能、constメンバ変数だったときに役に立つ */
    Edge(int t, int w) : to(t), weight(w) {}
};

int main()
{
    /* Edgeを単体で宣言。引数を渡す */
    Edge test1(0, 0);

    /* Edgeを配列で宣言 */
    /* 引数が２つのときは下記の書き方をしなければならない。1個のときは構造体名を省略できる */
    Edge test2[2] = {Edge(0,4),Edge(0,1)};

    /* 引数なしの宣言は不可 */
    // Edge test3[2];

    /* コンテナ宣言(メモリだけ確保された状態) */
    vector<Edge> test4;

    /* アクセスするとVSCodeでは 「Illegal instruction: 4」とエラー */
    // cout << test4[0].to << endl;

    /* コンストラクタがあるため要素を追加するときは一つずつしか出来ない */
    test4.push_back(Edge(1,1));

    /* 要素を入れるとアクセスでき˜るようになる */
    cout << test4[0].to << endl;

    /* constで宣言していないので代入はできる */
    test4[0].to = 5;
    cout << test4[0].to << endl;
    
    return 0;
}
```


##構造体を使った2次元配列　型エイリアス宣言
typedefではなく、型エイリアス宣言というのが使えるようになった。やっていることは同じ。


```cpp
#include <iostream>
#include <vector>
using namespace std;

struct Edge
{
    int to;
    int weight;
    Edge(int t, int w) : to(t), weight(w) {}
};

/* typedefと同じ。型エイリアス宣言というc++の機能 */
/* using identifier attr = type-id ;の形で宣言される */
// typedef vector<vector<Edge>> Graph;と同義
using Graph = vector<vector<Edge>>;

int main()
{
    /* 宣言はこれでOK。コンテナだからメモリを確保しているだけ */
    Graph TEST(3);

    /* ひとつひとつ代入する必要がある */
    /* 1次元の領域に追加 */
    TEST[0].push_back(Edge(1, 2));
    TEST[1].push_back(Edge(1, 2));
    TEST[2].push_back(Edge(1, 2));

    /* 二次元の領域に追加 */
    TEST[0].push_back(Edge(8, 8));
    cout << TEST[0][1].to << endl;

    return 0;
}
```

##参考
コンテナ【vector】 | C++入門～bituse～
https://bituse.info/cp/10

EffctiveC++入門　コンストラクタでは代入よりも初期化を使う
http://www002.upp.so-net.ne.jp/ys_oota/effec/chapter3.htm#12kou

オブジェクトの配列
http://wisdom.sakura.ne.jp/programming/cpp/cpp9.html

型エイリアス、エイリアステンプレート (C++11以上) - cppreference.com
https://ja.cppreference.com/w/cpp/language/type_alias
【作業メモ】CC2540 USB 評価モジュール・キットのファームウェア更新方法

# 記事の概要
Texas Instruments社の[SmartRF プロトコル Packet Sniffer](http://www.tij.co.jp/tool/jp/packet-sniffer)は、[CC2540 USB 評価モジュール・キット](http://www.tij.co.jp/tool/jp/CC2540EMK-USB)を使用して、BLEなどの無線通信のパケットを解析します。

以下の図のように、飛び交うパケットをリアルタイムに取得できるので、とても便利です。

![スニッファー解析.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/c3172f9d-6736-ec22-2a0c-c5c4aa799a08.png)

私は[CC2540 USB 評価モジュール・キット](http://www.tij.co.jp/tool/jp/CC2540EMK-USB)にスニッファー用ではないファームウェアを書き込んでいたので、ファームウェア更新が必要でした。
その作業に難儀したので、ここに更新方法の作業メモを残します。

# 用意するもの

- ソフトウェア
    - [SmartRF プロトコル Packet Sniffer](http://www.tij.co.jp/tool/jp/packet-sniffer)
        - v1を使用します
    - [SmartRF Studio](http://www.tij.co.jp/tool/jp/SMARTRFTM-STUDIO)
    - [SmartRF フラッシュ・プログラマ](http://www.tij.co.jp/tool/jp/FLASH-PROGRAMMER)
        - v1を使用します
- デバイス
    -  [CC2540 USB 評価モジュール・キット](http://www.tij.co.jp/tool/jp/CC2540EMK-USB)
    -  [CC-DEBUGGER](http://www.tij.co.jp/tool/jp/CC-DEBUGGER)
        
# CC-DEBUGGERのファームウェア更新
CC-DEBUGGERをPCに接続し、SmartRF Studioを起動してください。
"List of Connection Devices"に表示される"CC Debugger..."をクリックすれば、ファームウェア更新が開始されます。

![ファームウェア更新1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/11afe11a-da8c-618f-a8a1-03448afefb28.png)


もしくは、書き込むファイルを直接指定することもできます。
SmartRF フラッシュ・プログラマを起動し、"Program Evalution Board"を選択し、"EB Application(USB)"で"CC Debugger"が選択されていることを確認します。

そしてFlash imageに以下のファイルを選択します。

\Program Files (x86)\Texas Instruments\SmartRF Tools\Firmware\CC Debugger\cebal_fw_srf05dbg.hex

"Perform actions"をクリックすればファームウェアが更新されます。

![ファームウェア更新2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/c325c56d-8491-dfe7-1e44-e9a7f9cf7edf.png)

# CC2540 USB 評価モジュール・キットのファームウェア更新
[CC2540 USB 評価モジュール・キット](http://www.tij.co.jp/tool/jp/CC2540EMK-USB)をCC-DEBUGGERに接続し、PCに挿入して電源を供給します。

SmartRF フラッシュ・プログラマを起動し、"Program Evalution Board"を選択し、"EB Application(USB)"で"CC Debugger"が選択されていることを確認します。

そしてFlash imageに以下のファイルを選択します。

\Program Files (x86)\Texas Instruments\SmartRF Tools\Packet Sniffer\bin\general\firmware\sniffer_fw_cc2540_usb.hex

"Perform actions"をクリックすればファームウェアが更新されます。

![ファームウェア更新3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/f53a22de-6faa-9363-270f-4a1d50315307.png)

# 動作確認
Packet Snifferを起動して、Bluetoothを選択してstartをクリックします。

![ファームウェア更新4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/6eb4f867-41e1-83ea-22ad-34e540bb90a9.png)

CC2540 USB 評価モジュール・キットをPCに挿入すると、デバイスCC2540 USB Dongleが認識されます。
クリックで選択して、矢印アイコンをクリックするとスキャンが開始されます。
![ファームウェア更新5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/529ef1ec-dff5-a84f-2d00-88a89d53f2aa.png)

近くのBLE機器のアドバタイジングパケットをスキャンし、以下のようにパケットが画面に表示されるはずです。
![ファームウェア更新6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/3294f494-68cd-e298-ec23-329961430cd1.png)
AWS CLIアカウントのプロファイル切り替え

### AWS CLIアカウントをプロファイル名つきで登録する
```ruby:ターミナル
$ aws configure --profile プロファイル名
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]:
Default output format [None]:
```
### 登録したプロファイルを確認する
```ruby:ターミナル
$ aws configure list
```
### 登録したプロファイルは以下のファイルに保存されている
```ruby:~/.aws/config 
[default]
region = ap-northeast-1
[profile staging-profile]
region = ap-northeast-1
```
```ruby:~/.aws/credentials
[default]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[staging-profile]
aws_access_key_id = AKIAYYYYYYYYYYYYYYYY
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
```
### プロファイルを指定して実行する
```ruby:ターミナル
$ aws --profile staging-profile s3 ls
```
### 環境変数に設定する
```ruby:ターミナル
$ export AWS_PROFILE=staging-profile
```
擬似フラクタル図形をPythonを使って描いてみた

今日は落書きで書いた図形をプログラム（matplotlib）で描いてみようと思い，Pythonを使って描いてみた。

###### 今回使うプログラム

```python:fractal.py
import matplotlib.pyplot as plt
import matplotlib.collections as mc
import numpy as np
import math

def return_point(p1, p2):
    point = (p2-p1)*0.08 + p1
    return point

N = 1000
x = np.linspace(-1, 1, N)

x_point = [0, 100, 200]
y_point = [0, math.sqrt(3)*100, 0]
for i in range (N):
    new_x_point = return_point(x_point[i], x_point[i+1])
    new_y_point = return_point(y_point[i], y_point[i+1])
    x_point.append(new_x_point)
    y_point.append(new_y_point)

fractal = [[(x_point[i], y_point[i]), (x_point[i+1], y_point[i+1])] for i in range(N)]

lc = mc.LineCollection(fractal, colors='#333333', linewidths=1, antialiased=True)


fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(1,1,1)

# ↓非本質的な設定
ax.set_axis_bgcolor('#f3f3f3')
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['left'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['bottom'].set_visible(False)
plt.tick_params(labelbottom=False, labelleft=False, labelright=False, labeltop=False)
# ↑非本質的な設定

ax.add_collection(lc)
ax.autoscale()
plt.savefig('./fractal.png')
```
7行目`point = (p2-p1)*0.08 + p1`の`0.08`の値を変えてみるのも一興.
##  実行後
![fractal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622434/ecea923f-f820-0590-75a5-283f34c6afd7.png)

あら，美しい（CDのジャケットにありそう）
（ところで，何か名前がついていたらコメント欄で教えてください）


#####【追記】
厳密にはフラクタル図形でないと考え，タイトルを"フラクタル図形をPythonを使って描いてみた"から"擬似フラクタル図形をPythonを使って描いてみた"に変更しました。

## 参考にした記事
ありがとうございました。

**pythonでフラクタル図形を作成part1(シェルピンスキーのギャスケット）**
https://qiita.com/okakatsuo/items/f2e79fc501ed9f799734

**Matplotlibで複数の線分を描画する方法**
https://omedstu.jimdofree.com/2019/10/04/matplotlibで複数の線集合を描画する方法/

**matplotlibのめっちゃまとめ**
https://qiita.com/nkay/items/d1eb91e33b9d6469ef51#2-グラフaxesの作成
「TCP」と「UDP」の違いと用途

#概要
TCP/IP規格においてトランスポート層を担当する「TCP」と「UDP」について、それぞれの特徴をまとめました

#前知識
○インターネットでは、TCP/IPという通信規格が使用されている

○TCP/IPでは、ネットワーク層のプロトコルとして**「IP」**、トランスポート層のプロトコルとして**「TCP」**が使用される

○「IP」が通信相手の指定やルーティング、「TCP」がデータの正確性の保証を担当する

○トランスポート層のプロトコルには、「TCP」以外に「UDP」がある

○もともとは「TCP」だけだったが、必要に応じて「UDP」が生まれた

#それぞれの特徴
##**「TCP」**
#####・正確性重視
#####・最初にデータの通り道を確保する
（3ウェイハンドシェークというコネクション確率のやりとりを最初に行う）
#####・データの保証機能がある
（受け取った側が受け取ったデータの情報を反映した「ACK番号」を返すことで、送信元が正しく送信できたことを確認できる→届いていない場合は再送）
#####・順序通りにデータを届けられる
（パケットごとにシーケンス番号を付ける）

####<font color="DarkOrange">＜用途＞</font>
・HTTPやSMTP（メール送信）のプロトコルで使用される
・動画配信等のリアルタイム性の求められる用途には向いていない


##**「UDP」**
#####・速さ重視
#####・TCPの弱点を補うために開発された
#####・事前のコネクション確立や確認の応答、再送、順番保証なし
（→データヘッダが単純になる）
#####・通信相手に一方的にデータを送るだけ


####<font color="DarkOrange">＜用途＞</font>
・DNS、DHCP、SNMP等のプロトコル
・リアルタイム性の求められる用途（動画配信、音声通話）
・正確性がそこまで求められない用途

#まとめ
・インターネット通信において、転送の役割を果たす規格には「TCP」と「UDP」がある

・正確さ重視なら「TCP」、速さ重視なら「UDP」


#参考サイト
以下のページを参考にさせていただきました！
https://hldc.co.jp/blog/2019/07/11/2819/
郵便番号から住所を取得する

# 郵便番号から住所を特定したい時に使う

郵便局の地域検索を利用
https://www.post.japanpost.jp/zipcode/index.html

上記フォームの結果をパースして戻り値をdictionaryで返すfunction


```python
import requests
from bs4 import BeautifulSoup
import re


pref_key = {
    '北海道': 1,
    '青森県': 2,
    '岩手県': 3,
    '宮城県': 4,
    '秋田県': 5,
    '山形県': 6,
    '福島県': 7,
    '茨城県': 8,
    '栃木県': 9,
    '群馬県': 10,
    '埼玉県': 11,
    '千葉県': 12,
    '東京都': 13,
    '神奈川県': 14,
    '新潟県': 15,
    '富山県': 16,
    '石川県': 17,
    '福井県': 18,
    '山梨県': 19,
    '長野県': 20,
    '岐阜県': 21,
    '静岡県': 22,
    '愛知県': 23,
    '三重県': 24,
    '滋賀県': 25,
    '京都府': 26,
    '大阪府': 27,
    '兵庫県': 28,
    '奈良県': 29,
    '和歌山県': 30,
    '鳥取県': 31,
    '島根県': 32,
    '岡山県': 33,
    '広島県': 34,
    '山口県': 35,
    '徳島県': 36,
    '香川県': 37,
    '愛媛県': 38,
    '高知県': 39,
    '福岡県': 40,
    '佐賀県': 41,
    '長崎県': 42,
    '熊本県': 43,
    '大分県': 44,
    '宮崎県': 45,
    '鹿児島県': 46,
    '沖縄県': 47
}


def get_html_text(url: str) -> str:
    try:
        req = requests.get(url)
    except requests.exceptions.ConnectionError:
        return False
    return req.content


def getAddress(postal_code: int) -> dict:
    url = f'https://www.post.japanpost.jp/smt-zipcode/zipcode.php?zip={postal_code}'
    content = get_html_text(url)
    if not content:
        return False
    soup = BeautifulSoup(content, 'html.parser')
    dds = [i.text.strip() for i in soup.body.findAll('dd')]
    if not dds:
        return False
    dds = dds[:4]
    info = {
        'postal': dds[0].replace('-', ''),
        'pref': dds[1],
        'city': dds[2],
        'address': re.sub(r'\(.*', '', dds[3])
    }
    info['pref_no'] = pref_key[info['pref']]
    return info


if __name__ == "__main__":
    data = getAddress(1000004)
    print(data)

"""
結果
{
　　'postal': '1000004', 
　　'pref': '東京都', 
　　'city': '千代田区', 
　　'address': '大手町（次のビルを除く・ＪＡビル）', 
　　'pref_no': 13
}
""" 
```
SQLって何？を知る

#1.目的
この4月から転職して上司から言われた言葉

**「とりあえずSQL使えるようになってね」**

・・・SQLって何？
ちょっと調べたけど、データベースってそもそも何？そこからデータを取ってくるって何？手元のエクセルを皆どっかに保存してるの？etc・・・・

本当の初心者というか何も知らない自分は全くわからず、1週間程度がっつりSQLの基礎を学習しました。

そこで、**①「何も知らない人」向け**に、**SQLとは何かをまとめておく②実務で簡単なSQLを使い始めて、書けるのに時間を要した構文をまとめておくこと**が今回の記事の目的です。

#2.SQLとは
エスキューエルと読む。

ざっくり言うと、**"データベースに保管している"データを集計したり加工する"技術"**のことを指します。

###◆データって？
イメージは、csvやエクセルです。
但し、自分が好き勝手に作ったcsvやエクセルをSQLで操作できるわけではなく。「SQLとして操作できる形に整えた」データを用意する必要があります。

→いくつか種類がありますが、昨今はリレーショナルデータベースという、表形式のデータベースが主流のようです。

表形式というと少し難しく感じるかもしれないですが、こんなデータです。

<img width="330" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465870/32e78ca1-38ff-bb12-0e8b-fc7fe0000be1.png">


###◆データベースって？
データを保管する場所です。
様々なデータベースがサービスとして用意されていて、主なデータベースは下記です。
ここに企業や個人はアカウント作成や契約をして、データを安全に保管しているのです。

メインどころはOracle、MySQLとかがあるようです。
MySQLは無償なので、私はSQLの練習はMySQLでやっています。

<img width="321" alt="キャプチャ1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465870/aaba95e7-bc28-c755-281a-8f06b95e19c5.png">

※出典：https://db-engines.com/en/ranking

###◆SQLを使うことのメリットって何？

データベースを使っていない企業がほとんどなくて、このデータベースに入っているデータを使って様々な開発や分析が行われるので、
メリットというよりは、SQLを使えないとそもそもできないことが多すぎるぞ！というイメージで問題ないのではと思います。

いわゆるデータサイエンティストや、エンジニアの方には必須のスキルといってもいいのではないのでしょうか。

#3.SQLを使うにはどうしたらいい？
手元で勉強する分には、MySQLがちょうどいいのではと思います。
※もちろん、お好みのデータベースを利用してください。

この記事ではMySQLの画面をお見せします。
<img width="634" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465870/128dbfe3-5c81-d7b2-d750-4f6eaba390c4.png">

このように、左側の「mydb」の下にTablesがあり、たくさんデータが格納されていると思います。
これが、私がMySQL上に取り込んでいるデータたちです。
（手元のデータをMySQL上に取り込むイメージです）

この中から例えば「orders」というデータを一旦どんなデータだったか見てみよう、という場合は下記のキャプチャのようにコードを書いて実行すると、画面下部にデータが表示されます。
※お見せしているデータは、とあるudemyの講座のデモデータなので、もちろん架空のデータです。

<img width="429" alt="キャプチャ4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465870/88082a43-63e3-ae19-8b23-b2cb78ca4394.png">

#4.自分が困ったSQL構文

ここからは、約1週間程SQLを学習した私が実務で使う際にすんなり書けず、Google検索にお世話になりながら書いたクエリを紹介していきます。

##(1)前提データ
こんなデータベースがあるとします（テーブル名はplayerとします）。
左から、選手のID,名前,年齢,身長,体重,所属チーム,1回の試合のゴール数とします。

<img width="450" alt="キャプチャ6.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465870/c2e52b85-eba7-98fe-320c-79ea49133e2d.png">


##(2)チームごとの平均ゴール数合計を多い順に表示したい

```SQL
select avg(goal) as number
from player
group by team
order by number desc
```

##(3)チームごとの選手の人数を調べたい
同じ選手が何行も表示されているので、結局選手って何人いるのか調べたい場合。

```SQL
select team, count(distict(id)) as uid
from player
group by team
```

#5.結び
まだSQLを学習し始めたばかりなので4.自分が困ったSQL構文は知っている方からすると学びはないと思いますが、
特に前段のデータベースってなんなの？というあたりは、意外に説明されている記事が少なく、SQL文は書けたとしても結局自分が何をしているのかよくわからなかったので、初学者の方の理解の深化の一助になりますと幸いです。
Vanilla js tutorial

https://unsplash.com/developers
Free HD image API

All people can speak 

Native application vs Hybrid application
https://ymedialabs.com/hybrid-vs-native-mobile-apps-the-answer-is-clear

Native application vs Web Application

////
impact.js 
three.js
worlddraw.withgoogle
https://world-draw.appspot.com/

server -> somewhere in the world!


ES5? ES6? もうHTML5とは言わないのか？
ECMAScript 에크마→specification versions
jsの標準動作書みたいなやつ

※Vanilla.js　javascript without library
it's a raw not cooked 
加工してないもの自然な奴がvanilla.jsか。
カスタマイズしてない、純粋な原始のそのまま

var vs let vs const

varはfunction-scopedで、
let、constの場合はblock-scoped


#var(function-scoped)



///
what is Object?

It's a way to store information on a key-value format


// built in function
console.log(console);
-:>terminal
{ t {
  log: [Function],
  error: [Function],
  info: [Function],
  warn: [Function],
  dir: [Function],
  time: [Function],
  timeEnd: [Function],
  trace: [Function],
  assert: [Function],
  clear: [Function],
  stdout: { [Function] clear: [Function] },
  _times: {} }
   



really shocked!
>“Single quotes and double quotes behave in exactly the same way in JavaScript.” — Matthew Holman in CloudBoost



// js Dom function

メソッドも関数

function f() { return true; }
console.log(f);
console.dir(f);

log-> 一般的なprintのように出力するやつ
dir-> objectを出力する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209211/75c11533-4988-a2cd-e47d-4f6f401426c6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209211/d36ba2ad-2cee-4d9d-0df0-40bd1b3b956f.png)




querySelector()

範囲：documentの全判
idやclassにこだわらなくて、引数でdocumentの全部を検索して最初に合致する子を検出するメソッド



#== vs ===
==　値が同じであるか

if(10 == "10"){
console.log(true);
}else{
console.log(false);
}

===　値それとデータ型が同じであるか
if(10 === "10"){
console.log(true);
}else{
console.log(false);
}
Flutter for webの環境を構築してみた

# 環境
Mac OS X ver10.14.5

# 参考URL
- Flutter for web 環境構築手順 -- https://qiita.com/snyt45/items/e1b1e6d1d74cb006237e
- flutter公式
-- https://flutter.dev/docs/get-started/install/macos
- Flutter for web公式
-- https://github.com/flutter/flutter_web#getting-started
- Flutter Webを動かしたときにつまづいたこと -- https://qiita.com/Nkzn/items/402a29fe9bb517ce78aa

基本的に、flutter公式を元に対応。
自分の行った手順を記述します。

# Flutter SDKを入手する
https://storage.googleapis.com/flutter_infra/releases/stable/macos/flutter_macos_v1.12.13+hotfix.9-stable.zip
※2020年4月21日現在 flutter_macos_v1.12.13+hotfix.9-stable

ダウンロード後、以下を実施

```terminal:mac
$ mkdir ~/development
$ cd ~/development
$ unzip ~/Downloads/flutter_macos_v1.12.13+hotfix.9-stable.zip
```

# Flutterのパスを通す
Flutterのパスを通すために、展開したflutterを移動します

```terminal:mac
$ mv development/flutter /usr/local/var/
```

bash_profileに以下を追記

```terminal:mac
$ vi ~/.bash_profile

===以下追記===
export PATH=$PATH:/usr/local/var/flutter/bin
```

以下で更新

```terminal:mac
$ source ~/.bash_profile
```

無事Flutterがインストールできました

```terminal:mac
$ flutter --version
Flutter 1.12.13+hotfix.9 • channel stable •
https://github.com/flutter/flutter.git
Framework • revision f139b11009 (3 weeks ago) • 2020-03-30 13:57:30 -0700
Engine • revision af51afceb8
Tools • Dart 2.7.2
```

#Flutter for webを試す
参考サイト様の通り行おうと思ったのですが、すでにFlutter for webのgitはold扱い。
以下のreadmeを参考に進めてみます。
https://github.com/flutter/flutter_web/blob/master/OLD_README.md

## flutter_webビルドツールをインストールする
以下コマンドでインストールを実施

```terminal:mac
$ flutter pub global activate webdev
```

で、インストール後、私は以下の表示が出ました。

```terminal:mac
  export PATH="$PATH:/usr/local/var/flutter/.pub-cache/bin"
```

ので、例のごとく、パスを通します。
あと、このままreadmeの通り続けてしまうとこのあと詰まったので、２つのパスを通しておきます。

```terminal:mac
$ vi ~/.bash_profile

===以下追記===
export PATH=$PATH:/usr/local/var/flutter/.pub-cache/bin
export PATH=$PATH:/usr/local/var/flutter/bin/cache/dart-sdk/bin
```

以下で更新

```terminal:mac
$ source ~/.bash_profile
```

## hello worldを実行する
まず、任意のディレクトリでgitをcloneしましょう
私は、先程作成した`development`の配下にクローンしました。

```terminal:mac
$ cd ~/development
$ git clone git@github.com:flutter/flutter_web.git
```
クローンが成功すると、以下のようになりましたね。

```terminal:mac
$ ls
flutter_web
```
hello_worldのディレクトリへ移動します

```terminal:mac
$ cd flutter_web/examples/hello_world/
```

移動したら、以下を実行

```terminal:mac
$ flutter pub upgrade
```

以下も実行します。

```terminal:mac
$ pub get
```

最後に、以下を実行してサーバを起動

```terminal:mac
$ webdev serve
```

私の場合は、http://127.0.0.1:8080 へアクセスし、`Hello World`が赤文字で出力されれば成功です。

以上です。
Taihe社 Gemini 15,6インチモニター

電源ボタンを3秒押してライトをつけたり消したりすることによって起動とシャットダウンが可能(それ以外はやっても何も起こらないのが大半だったのでいじらない方がいいかもしれない)

電源は5時間程持つとか書いてありましたが、実際には3時間程で充電Maxから0になります。

言語は米中日仏は確認その他もろもろあります
画面回転は180度のみ(こちらバグか何かでゲーム画面と設定画面が180度違う)
音声がどこから出るかは不明(要注意)、
頑張って調べます。
イヤホンで聞くと音量1でもかなりうるさいので非推奨、映像出力側の音声のイヤホンポート(？)から出力しましょう

ポータブルモニターの割には重い(約2kg)
画質は綺麗、反射がキツイのでフィルムを貼るのを推奨

設定画面は右側の下から2つ目
上から2,3つ目は音量ボタン(設定画面を開いてる時は左右移動)
1番上のボタンは電源、1番下は入力ケーブル(？)の変更(オート推奨)

画像なしでなおかつ需要があまり無いかもしれませんが、困ってる人の為になればそれでいいかなぁとか思ってます(雑)。
説明書がなかったのもあって調べるのにだいぶ時間がかかりました。

また、最近Discordの音楽botやWallprimeのbot作りに興味があるのですが、未だ初心者なのでどなたか教えてくださる方を募ってます。(絶対来ないと思いますが……)
【Rails】seedから画像をdbに保存する方法

seedデータからdbに画像を保存するやり方です。
本番環境でもできます。

(db/seeds.rb)

```ruby
20.times do |n|
 name = Faker::Games::Pokemon.name
 email = Faker::Internet.email
 password = 'password'
 User.create!(
  name: name,
  email: email,
  password: password,
  password_confirmation: password,
  icon: open("./db/fixtures/icon#{n}.jpg")
 )
end
```

こんな感じで
`icon: open("./db/fixtures/icon#{n}.jpg")`
で呼び出しています。
自分は(db/fixtures)の中に`icon0.jpg`、`icon1.jpg`みたいな感じで20個jpgファイルを置きました。
ご参考までに
Pythonチュートリアル(2章)の内容を箇条書きでまとめた

前の記事：[Pythonチュートリアル(1章)の内容を箇条書きでまとめた](https://qiita.com/Wakii/items/543a60237060849326b8)

#はじめに
[Python3 エンジニア認定基礎試験](https://www.pythonic-exam.com/exam/basic)対策として、Pythonチュートリアル(書籍)の内容を暗記しやすい箇条書きにまとめた自分用メモです。

##参考資料
Pythonチュートリアル： https://docs.python.org/ja/3/tutorial/
2章： https://docs.python.org/ja/3/tutorial/interpreter.html
書籍： https://www.oreilly.co.jp/books/9784873117539/

#"2章 Pythonインタープリタの使い方"
- Python3 エンジニア認定基礎試験の配点
    - 1 / 40問(2.5%) ☆★★★★(重要度：小)
- テーマ
    - インタープリタのインストールと起動／終了
    - 引数の取得方法
    - 対話モードとプロンプトの種類
    - ソースファイルのエンコーディング(文字コード指定)

#2.1 インタープリタの起動
- UNIXの場合
    - Pythonのインストール場所 
        - 通常 /usr/local/bin/python3.5 としてインストールされている。<br>ディレクトリはインストール時に指定可能。
    - 起動方法
        - シェルで "/usr/local/bin/python3.5" と入力。
        - UNIXシェルのサーチパスに /usr/local/bin が入っていれば、"python3.5" で起動できる。
    - 終了方法
        - プライマリプロンプト (>>>) が出ているときに [Ctrl] + [D] を入力。
        - quit() コマンドを入力。
- Windowsの場合
    - Pythonのインストール場所 
        - 通常 C:\\python35 にインストールされる。<br>これもインストール時に変更可能。
    - 起動方法
        - DOSプロンプトで "C:\python35\python" と入力。
        - 以下のコマンドで環境変数pathに C:\python35 を入れれば、"python" で起動できる。
            - set path=%path%;C:\python35
    - 終了方法
        - プライマリプロンプト (>>>) が出ているときに [Ctrl] + [Z] を入力。
        - quit() コマンドを入力。
- ちなみに、[Ctrl] + [D]や[Ctrl] + [Z]はOSにおける**EOF(End Of File: ファイル終端キャラクタ)**を意味する。

##2.1.1 引数を渡す
- スクリプトを起動した際の引数は、**sys.argv**に割り当てられる。
    - sysは組込モジュールで、*import sys* を実行することで参照できる。
    - arvgは引数を格納したリストであり、長さは最小1である。
    - スクリプト名も引数も与えられない場合、sys.argv[0]は空の文字列になる。
    - スクリプト名が標準入力を意味する "-" の場合、sys.argv[0]も "-" になる。
    - "-C コマンド" の形式で実行した場合、sys.argv[0]は "-C" になる。
    - "-m モジュール名" の形式で実行した場合、sys.argv[0]は指定したモジュールの完全な名前になる。
    - "-C コマンド" や "-m モジュール名" の後に続くオプションはsys.argvに残される。

##2.1.2 対話モード
- コマンドをtty(標準入出力となっている端末デバイス)から読み込んでいるとき、インタープリタは**対話モード**になっている。
- 対話モードでは、インタープリタは以下を表示する。
    - **ウェルカムメッセージ** ... 最初に表示。バージョンと著作権から始まる。
    - **プライマリプロンプト (>>>)** ... コマンド入力を促す。
    - **セカンダリプロンプト(...)** ... if文などを入力した際に表示され、継続行の入力を促す。

#2.2 インタープリタとその環境
##2.2.1 ソースコード・エンコーディング
- Pythonのソースファイルは、デフォルトではUTF-8でエンコードしてあるものとして扱われる。
    - UTF-8では、世界のほとんどの言語の文字を扱える。
        - ただし標準ライブラリでは識別子(クラス、変数、関数などの名前)にASCIIキャラクタのみを使っているので、倣ったほうがいい。
    - ソースコードの編集にはUTF-8を認識するエディタを使う必要がある。
- UTF-8以外のエンコーディングを使うこともできる。
    - 方法は、*# *\_\*\_ coding: エンコーディング名 \_\*\_* の特殊コメント行をソースの1行目か2行目に記載する。
    - 使えるエンコーディング一覧は、ライブラリリファレンスのcodecsの項にある。

次の記事：[Pythonチュートリアル(3章)の内容を箇条書きでまとめた](https://qiita.com/Wakii/items/cc4158d602a7646758d9)
[Unity] 画面をキャプチャしてバイナリで保存する

# 0. 概要
Unityで大量のシミュレーション画像を生成してBMPで保存していたが、非常に取り回しが悪いので複数画像をバイナリ化して1つのファイルにしたい。そこで、`PostRender`を使って描画される画面の左上ピクセルから順にRGBで並んだ配列をバイナリ化して1つのファイルに保存したので、その備忘録を以下に記す。

#1. バイナリ画像化

``` C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Capture : MonoBehaviour {
    Texture2D capture_display;
    string fileName = "screenshot\\image.bin";
    System.IO.BinaryWriter writer;
    byte[] yxrgb;
    int ary_size;

    // Use this for initialization
    void Start () {
        capture_display = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
        writer = new System.IO.BinaryWriter(new System.IO.FileStream(fileName, System.IO.FileMode.Append));
        ary_size = Screen.width * Screen.height * 3;
        yxrgb = new byte[ary_size];
    }

    private void OnDestroy()
    {
        writer.Close();
    }

    private IEnumerator OnPostRender() {
            yield return new WaitForEndOfFrame();
            // capture the frame
            RenderTexture.active = Camera.main.targetTexture;
            capture_display.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
            capture_display.Apply();
            for (int i = 0; i < Screen.width; i++)
            {
                for (int j = 0; j < Screen.height; j++)
                {
                    int offset = ( (i * Screen.height) + (j) ) * 3;
                    yxrgb[offset + 0] = (byte)((int)(capture_display.GetPixel(i, j).r * 255));
                    yxrgb[offset + 1] = (byte)((int)(capture_display.GetPixel(i, j).g * 255));
                    yxrgb[offset + 2] = (byte)((int)(capture_display.GetPixel(i, j).b * 255));
                }
            }          
            writer.Write(yxrgb);
    }
}
```

`yield return new WaitForEndOfFrame();`を入れておかないと1フレーム遅れた画像が書き出されてしまうので気を付けること。
【Laravel】Formファサードのselectタグでvalueなしの初期値を入れる方法【Bladeテンプレート】

## 個人的に調べ方が分からず微妙に詰まった

↓↓これがやりたい
<img width="404" alt="スクリーンショット 2020-04-21 19.08.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527256/2ed3d1ba-1886-ea07-e585-da5c4b4556fa.png">

調べるとコントローラーで取得した配列に初期値をprependして無理やり初期値を持った配列を指定する方法が多く出てくるが、何かイケてない気がする。

##以下のように第４引数にplaceholderを追加するだけでした
第三引数にあたる初期値を`null`にして、第四引数に表示したいテキストをplaceholderとして指定するだけです。

```php
{!! Form::select('hoge_id', $arrayHoges, null, ['class' => 'form-hoge',  'placeholder' => '選択してください']) !!}
```

しっかりvalueなし＆デフォルト値でoptionタグの生成ができました。
<img width="428" alt="スクリーンショット 2020-04-21 19.06.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527256/d5a80a9d-2d1a-0ee5-b681-28c0b52b66e0.png">


## さいごに
めちゃくちゃシンプルで単純でした。
シンプルすぎて逆に記事がほとんどなかったのかもしれませんね泣
他にもっとシンプルな方法ございましたら教えて頂けると助かります！
年月日の設定をQMLのTumblerで実装する

Qt 5.12～14あたりの情報です。

#Qtのサンプルアプリがおかしい。
QtにはAlarmsというサンプルプロジェクトがついてきます。
AlarmsにはTumblerで年月日を設定するコードがあるのですが…。
なんか挙動がおかしいです。
年と月の設定によって日数を変更しているのですが、日数が変更されるたびに変な動きをします。
うるう年とかの設定もなんかいい加減です。
なので自分で作ってみました。

#Tumblerの実装
まずは以下のように年月日のTumblerを配置。

```qml
    Text {
        id: yearPrefix
        text: "20"
        color: "white"
        anchors.verticalCenter: parent.verticalCenter
        font{ pixelSize: 40 }
    }

    Tumbler {
        id: yearTumbler
        anchors.left: yearPrefix.right
        anchors.verticalCenter: parent.verticalCenter
        width: 50; height: 300
        model: 100
        delegate: tumblerDelegate
        property int plus: 0
        onMovingChanged: setDate()
    }

    Tumbler {
        id: monthTumbler
        anchors.left: yearTumbler.right
        anchors.verticalCenter: parent.verticalCenter
        width: 50; height: 300
        model: 12
        delegate: tumblerDelegate
        property int plus: 1
        onMovingChanged: setDate()
    }

    Tumbler {
        id: dayTumbler
        anchors.left: monthTumbler.right
        anchors.verticalCenter: parent.verticalCenter
        width: 50; height: 300
        model: 31
        delegate: tumblerDelegate
        property int plus: 1
    }
```
property int plusは、タンブラーの表示が0スタートなのか1スタートなのかを示しています。
年は00から始まってほしいけど、月と日は01から始まってほしいですからね。
この値は、次のtumblerDelegateで使います。
#続いてデリゲート
デリゲートは3つのタンブラー共通で、下記のものを使います。

```qml
    Component {
        id: tumblerDelegate
        Text {
            color: yearPrefix.color
            opacity: 1.0 - Math.abs(Tumbler.displacement) / (Tumbler.tumbler.visibleItemCount / 2)
            text: ("0" + (modelData + Tumbler.tumbler.plus)).slice(-2)
            font: yearPrefix.font
            verticalAlignment: Text.AlignVCenter
        }
    }
```
デリゲート中でTumbler.tumbler.plusと書くと、先ほどのproperty int plusを読むことができます。

#最後に日数を変更する関数
yearTumblerとmonthTumblerのmoving変更時に、下記の関数を呼んでます。

```qml
    function setDate() {
        if(!yearTumbler.moving && !monthTumbler.moving) {
            var lastDay = new Date(2000+yearTumbler.currentIndex, monthTumbler.currentIndex+1, 0).getDate()
            var currentDay = Math.min(dayTumbler.currentIndex, lastDay-1)
            dayTumbler.model = lastDay
            dayTumbler.positionViewAtIndex(currentDay, Tumbler.Center)
        }
    }
```
年月両方のTumblerが停止していたら、dayTumblerのmodelを変更して日数を変更します。

年月の最終日を取得するのに、new Date()を使っています。
Date(年, 月, 0)とすると、その年月の最終日を取得できます。
C++側で、QDate::daysInMonth()なんかを使っても良いですね。

3/31から2月に変更すると、2/28を示すようにcurrentDayを設定しています。

positionViewAtIndex()より先に、modelを変更することが必要です。
modelを変更するとcurrentIndexが0に戻るっぽいので。
(QtのAlarmsサンプルの挙動がいまいちおかしいのは、ここら辺の記述が適当だから。)

positionViewAtIndex()は、アニメーションすることなしにcurrentIndexを変更できます。
単純にcurrentIndexに代入すると、タンブラーがくるくる回ってしまうので。
Pythonでファイルを一行ずつ読み込む

すごく基本的なことなんだけど、pythonであるテキストファイルを一行ずつ読み込む方法を調べてみた。

## 一番スマートだと感じた方法

```python
with open('./test.txt') as f:
    for line in f:
       print line
```

https://journal.lampetty.net/entry/wp/418

## 他にも色々あるけど

多分上記のが一番スマートかな。
read(), readline(), readlines()などを使うサンプルをいくつもみたけど、一行ずつ処理するならば使う必要ない気がした。

```python:read()を使う
with open('./test.txt') as f:
    lines = f.read()
    for l in lines.split("\n"):
        print(l)
```

```python:readline()を使う
with open('./test.txt') as f:
    line = f.readline()
    while line:
        print(line.rstrip("\n"))
        line = f.readline()
```

```python:readlines()を使う
with open('./test.txt') as f:
    lines = f.readlines()
    for l in lines:
        print(l.rstrip("\n"))
```

pythonはやりたい事に対して解決方法がたくさんありすぎるので、どれが良いか考えている時間が無意味に長くなってしまうのが良くないな。。
WinSCPで"パーミッション/タイムスタンプの設定中にエラーが発生しました"について調べてみた

# 発生事象

WinSCPのSFTPモードでファイルを転送すると以下のようなエラーメッセージが表示されることがある。

```
ファイル 'sample.txt' のアップロードは成功しましたが、パーミッション/タイムスタンプの設定中にエラーが発生しました.
問題が解決しない場合は、パーミッションの設定・タイムスタンプの設定を無効にするか、パーミッション設定時のエラーを無視するように設定してください。 ("権限がありません エラー コード: 3からのエラー メッセージ: Permission denied")"
```

解決策としてはこのキーワードで調べてみると分かるが、環境設定から「タイムスタンプの更新」を無効にする、というのがある。
デフォルトではパーミッションの書き換えはOFF / タイムスタンプの更新はONになっているが、何故タイムスタンプの更新でエラーが起こるのかが分からなかったのでちょっと調べてみた。

なお、対象はLinux (今回はCentOS7) で検証した。


# 発生原因

- ファイルの属するグループに対する書き込み権限はある
- ファイルのOwnerではない

例えば、以下のようなファイルがある場合、

- hoge ユーザーでアップロードした場合は問題が起きない
- apache グループに属している hoge 以外のユーザーでアップロードした場合は問題が起きる（ファイルは更新されるが、掲題のエラーが表示される）
- apacheグループに属していないユーザーはそもそもアップロードに失敗する

```
-rw-rw---- 1 hoge apache 10  4月 21 18:25 sample.txt
```

ちなみに同様のエラーについては

> On some systems (e.g. Linux), you need to be an owner of the file (write permissions are not enough) to modify its permissions or timestamp (you will see an error like “Permissions denied” in error details).
> https://winscp.net/eng/docs/message_preserve_time_perm

ファイルオーナーでないと失敗する、とWinSCPのドキュメントに記載されている。
なお、タイムスタンプとパーミッションの変更を無効にすればよい、と公式がこの方法で回避してくれとなっている。

> Whatever the reason is, you need to turn off Set permissions and Preserve timestamp options or turn on Ignore permission errors.

ファイルオーナーでないと、何故タイムスタンプの書き換え **だけ** でもエラーが起こるのか、原因が知りたかったのだが……（それこそ、touchすれば更新できるぐらいのはずなのに）。
さすがにファイルのパーミッション書き換えはオーナーしかできてはまずいから、こっちを書き換えてるのであればエラーの説明はつくが……


# 結論

**完全に推測になる点に注意**。 正確なところを知ってる人がいれば教えて欲しい。

SFTPでタイムスタンプなどを変更するには preserve というコマンド（？のようなもの？）でタイムスタンプだけではなく、ファイルのパーミッションもまとめて更新するのではないかと思える。
これは sftp コマンドの man を見る限り、

```
-p	     Preserves modification times, access times, and modes from	the
	     original files transferred.
```

となっているため。 
で、ファイルのオーナー以外にはその権限がないためタイムスタンプ・ファイルそのもののパーミッションを変えようとしてエラーとなっているように見える。
AWS EC2間でSSH接続する

# はじめに

- AWS VPCの勉強がてら、管理用サブネット～公開サブネット間のSSH接続の試験をしたメモです。

# Internal SSH

- 公開サーバのインスタンス作成時に、キーペアを作成する。
- TeraTermを使って、踏台サーバに、xxx.pemをSCPで送信する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/16f3ebba-84b3-6b53-6cea-b2d22867bf7e.png)

```sh:アップロードしたファイルのパーミッションを変更する
sudo chmod 600 xxx.pem
```

```sh:踏台サーバにコンフィグファイルを作る
touch ~/.ssh/config
vi .ssh/config
```

```sh:.ssh/config
Host wss
    HostName 172.10.0.xxx #IPアドレス
    User ubuntu
    IdentityFile ~/xxx.pem
    Port 22
```

```sh:ターゲットにssh接続する
ssh wss
```

```sh:yes/noを聞かれるので応答する
yes
```

```txt:接続完了
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-1057-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Wed Apr 15 09:47:18 UTC 2020

  System load:  0.12              Processes:           92
  Usage of /:   18.8% of 7.69GB   Users logged in:     0
  Memory usage: 18%               IP address for eth0: 172.10.0.xxx
  Swap usage:   0%


0 packages can be updated.
0 updates are security updates.


*** System restart required ***
Last login: Wed Apr 15 09:41:44 2020 from 172.10.200.xxx
ubuntu@ip-172-10-0-xxx:~$
```

## ネットワークACL

### ManagementNetworkACL
![nwacl1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/d01883b8-4c2e-00c0-cc8d-63cc21e86376.png)

### ExternalNetworkACL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/229d2ea4-4458-f719-2333-470994e23c0f.png)

## セキュリティグループ

### ManagedServer

#### Inbound
![instanceInbound.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/8990853a-f1af-dea4-43e6-b18b619ec58a.png)


#### Outbound
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/670602bb-1bb4-9f8b-2908-06dca5e27901.png)

-----

### WebServiceServer

#### Inbound
![instance2Inbound.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/abfa3c7c-f703-47fa-29ef-b9f00250f6fb.png)


#### Outbound
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/4441451e-67e4-5154-83dc-1ced98122b7e.png)

# おわりに

- ネットワークACLは、ステートレス
- セキュリティグループは、ステートフル
- WebServiceServerのセキュリティグループは、開発専用
　- ポート：8000 → 80、ソース：0.0.0.0/0
plunkerでd3 その8

#概要

plunkerでd3やってみた。
山形県のデータ、読んでみた。

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/473dba42-2973-632b-a4ed-0300aa7cf82a.png)


#サンプルコード



```

d3.json("https://raw.githubusercontent.com/yamaserif/covid19/development/data/data.json", function(error, data) {
  var patients = data.patients.data;
  var keys = ["リリース日", "居住地", "年代", "性別", "退院", "date"];
  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 < patients.length; i++)
  {
    var rows = [];  
    keys.map(function(c) {
      rows.push(patients[i][c])
    });
    table.append("tbody").append("tr").selectAll("td").data(rows).enter().append("td").text(function(d) {
      return d;
    });
  }
});


```

#成果物

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

以上。
Rails で PostgreSQL のパーティションを利用したい

# なにこれ？
Ruby on Rails で PostgreSQL のハッシュパーティションを使いたいよねー、という方！こうすればできました。たぶん、rails db:migrate or db:rollback したら DDL が発行されてよしなに設定されるはず。

# サンプルコード
```ruby
class CreateStaffs < ActiveRecord::Migration[6.0]
  def change
    reversible do |dir|
      dir.up do
        execute <<~"SQL"
                    CREATE TABLE staffs (id uuid PRIMARY KEY UNIQUE, email varchar NOT NULL, cname varchar NOT NULL, created_at timestamp(6) NOT NULL, updated_at timestamp(6) NOT NULL) PARTITION BY HASH (id);
                    #{(0..99).map{|num| "CREATE TABLE staffs_partition_#{num} PARTITION OF staffs FOR VALUES WITH(MODULUS 100,REMAINDER #{num});"}.join}
        SQL
      end
      dir.down do
        execute <<-SQL
                   DROP TABLE staffs;
        SQL
      end
    end
  end
end
```

# おわりに
PostgreSQL 11 からの機能なので、使えない環境の方もいらっしゃると思われます。が、あとで楽できそうなので必要に応じてパーテイションを作っておくことが良さそうですね。
素人Python日記⑤ ～参考書を手に取ってみる

# この投稿の目的
日記みたいなものです。

前回まで、djangoガールズのチュートリアルを2週してみて、主要なファイルの役割とか、触っていく手順みたいなものはぼんやりわかってきました。
ただ、それらの中身についてはさっぱりで、親愛なるグーグル先生に頼るも、あまり体系的にはわからず。
そこで、ひそかにローコスト習得を目指していたけれど、参考書を買ってみることにしました。

# 買った本
[「動かして学ぶ！Python Django開発入門」](https://www.amazon.co.jp/%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6-Python-Django%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-NEXT-ONE/dp/4798162507)を購入。

### 購入理由
 - 表紙に「パイソン」「ジャンゴ」と読み方がふってある（しんせつ）
 - 作りながらすすめていける
 - コードごとに解説がされている（一番重要）
 - 使用するサービス/ソフトと、その目的が最初に一覧化されている（後出しされるのはキライなので、すごくありがたい）
 
なお、本書を完走すると、会員制のWebアプリ（ユーザーがログインして日記等の投稿を行う）ができる模様

## やったこと
 -  本書のP139まで
 -  前半はほとんど座学（でもこれがありがたかった）
 -  後半はトップページ（静的ページ）を作るまで（urls,views,templates,htmlを簡単に作っただけ）
 -  最終的につくりたいものの設計図をスケッチ（本で作ろうとしているアプリではなく、当初の個人的な目標（書籍管理）の遷移図・必要項目などをラフスケッチしました）
 -  所要時間：丸一日

 
## ちょっと理解がすすんだこと
 -  各ファイルの中身や書式（chapter2（djangoの概説）で説明されていて、知りたかった「この変数は何か」「なぜここでこの関数がいるのか」がようやく、少しだけわかった）
 -  設計図の重要性（頭の中がすっきりした。初心者として、最低限まず作っておきたいところと、そのあと追加していけばいいところが明確化）
 -  関数ベースのビューとクラスベースのビュー

 
## やっぱりわかってないこと
 -  本書の前半で説明された書式については眺めただけで身についていない（必要に応じて戻ってくるべき場所がわかったので前進感はある）
 -  本書では関数ベースのビューにはほとんど触れないらしい…。ネット上に展開されてるチュートリアルは関数書いてるものが多いような。今はサクッと作るよりも中身を理解することを大事にしたいのだけど、大丈夫か…？

# 本を買ってみて
よかったと思います。WEB上の無料チュートリアルも十分勉強になるけど、ビジュアル的に体系的だし、見たいところにすぐ戻れるし、手元にあるとやっぱり安心します（感覚古い？）。

なお、選んだ本の難易度がどうだったのかはまだよくわかりません。途中、自分のレベルよりもちょっと高いものを選んでしまったかと思うような記述も少なからずあります。
ただ往々にして1度では理解できないものだと思うので、深く考えずにあとで戻ってくることにします。

不安もありながらですが、なんとか本書の3割くらいまできたので、この調子で進めていこうと思います。


---
＜次の一歩＞
[素人Python日記⑥ ～ネット上にある講座をなぞってみる](https://qiita.com/wahahahagi/items/f106b21fdbab6c51c12e)

＜牛歩的経緯：自宅環境構築＞
[自宅待機を有効活用する① ～思い立ちからゴール設定まで](https://qiita.com/wahahahagi/items/9bdb192d8a55a5087dfe)
[自宅待機を有効活用する② ～LET'S NOTE CF-W8のHDDをSSD換装する話](https://qiita.com/wahahahagi/items/bf216504dbb79d0f9863)
[自宅待機を有効活用する③ ～2020年、ようやくXPをWin10に](https://qiita.com/wahahahagi/items/411b6c0f06d816bac4cc)

＜牛歩的経緯：Djangoと仲良くなる＞
[素人python日記① ～Django導入までの思考回路](https://qiita.com/wahahahagi/items/304229a520f2b0650f03)
[素人Python日記② ～Djangoガールズのチュートリアルをやる（初日）](https://qiita.com/wahahahagi/items/28162eae687c4c793d14)
[素人Python日記③ ～Djangoガールズのチュートリアルをやる（2日目）](https://qiita.com/wahahahagi/items/cfca309d344b616ddeb2)
[素人Python日記④ ～Djangoガールズのチュートリアルをもっかいやる（6日ぶり3日目）](https://qiita.com/wahahahagi/items/373acaa269e35f2e2713)
BigQueryデータ基盤のテーブル依存関係を管理する

# 背景
データマート（途中の中間テーブルも含む。以後両方合わせてデータマート)の生成をBigQueryJobで行なっているようなBigQueryのデータ基盤を想定。

業務アプリケーションの改修で、あるテーブルのカラムが削除/編集されたり、テーブル自体が削除されたりする場合、データ基盤管理者としてはその改修がどのデータマートに影響があるのかを判断する必要がある。このデータマートとテーブルの依存関係をドキュメントとして残しておいてもいいが、ドキュメントの場合はメンテナンスが大変。

今回は、BigQueryの `INFORMATION_SCHEMA.JOBS_BY_PROJECT`から、データマートと依存テーブルのマッピングを生成する。これによって、過去180日に実際に生成されたデータマートが依存しているテーブルを明らかにすることができる。

[INFORMATION_SCHEMA を使用したジョブ メタデータの取得](https://cloud.google.com/bigquery/docs/information-schema-jobs)


# やること

以下のSQLの実行結果でテーブル作成するだけ。過去180日に実行されたBigQueryJobのdestination_tableのあるものから依存テーブルのマッピングテーブルを生成する。

```sql
WITH table_with_repeat as (
SELECT
  destination_table.table_id as destination_table,
  REGEXP_EXTRACT_ALL(query, "(?:FROM|JOIN)[\\s \\n]+`(.+?)`") as tables,
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT 
WHERE job_type = "QUERY" 
AND state = "DONE"
AND destination_table.table_id not like "anon%"
)

SELECT
  twr.destination_table,
  t as table_name
FROM table_with_repeat as twr, UNNEST(tables) as t
```

# これで嬉しいこと
どのデータマートがどのテーブルに依存しているが簡易的なSQLですぐにわかること。

例えば、業務アプリケーションのテーブル `users` が削除された場合を想定する。その場合、以下のようなSQLで、`users` のテーブルに依存しているデータマートがわかる。

```sql

SELECT destination_table FROM mapping_table WHERE table_name LIKE "%users%"
```

さらに、githubのPRをデイリーで自動取得しスキーマ変更の有無をチェックできる( [pythonでgithub apiを呼び出してPull Request 情報を取得する](https://qiita.com/munaita_/items/fe89a1b81d5920abc667) )。

これを組み合わせると、

- 業務アプリのPRにスキーマ変更がある場合はSlackに通知
- 変更対象テーブルがデータマートに影響が無いかを依存マッピングテーブルで調査

というフローが可能になる。

# 参考
[GitHubで管理されたデータマート構築基盤の紹介](https://techblog.zozo.com/entry/datamart_on_github#%E3%83%9E%E3%83%BC%E3%83%88%E3%81%AE%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82)
データマート生成用のSQLから依存関係を可視化する方法が紹介されている事例
機械学習／ノルム、正則化

#1.はじめに
　今回は、ノルムと正則化についてまとめます。

#2.ノルム
　ベクトルの大きさを計算する場合、ノルムという計算式を使います。ノルム$L^p$の一般式は、下記の様に表せます。
![スクリーンショット 2020-04-21 18.22.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/b2d64548-51a0-e018-07ee-1e8d0a407b68.png)


　P=2である$L^2$ノルムは、ユークリッド距離と呼ばれ、
![スクリーンショット 2020-04-21 18.23.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/785dc9c7-072b-6be0-35d0-6b4a66c19e10.png)


　P=1である$L^1$ノルムは、マンハッタン距離と呼ばれ、
![スクリーンショット 2020-04-21 18.22.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/7ebe4b32-6b7e-50be-273c-cdfff35d8b27.png)








#3.正則化
　機械学習において、コスト関数にペナルティ項を加えて、コスト関数＋ペナルティ項の和を最小化する形にすることで、過学習の抑制や次元削減の効果が期待できます。

1)L2正則化
　$min_wf(x)+\frac{\lambda}{2}\sum_{i=1}^n|w_i|^2$

　損失関数＋L2正則化項の合計を最小化するパラメータ$w_i$を求めることで、過学習の抑制効果が得られます。線形回帰の場合は、**Lidge回帰**と呼ばれます。

2)L1正則化
　$min_wf(x)+\lambda\sum_{i=1}^n|w_i|$

　損失関数＋L1正則化項の合計を最小化するパラメータ$w_i$を求めることで、次元削減効果が得られます。線形回帰の場合は、**Rasso回帰**と呼ばれます。
AWS接続できない際のログの場所一覧



それぞれのログの場所は以下の通り。

①Nginx    
[ユーザ名@ip-10-0-0-58 自分のアプリ名]$ cat log/nginx.error.log

②Unicorn
[ユーザ名@ip-10-0-0-58 自分のアプリ名]$ cat log/unicorn.log


③Rails 
[ユーザ名@ip-10-0-0-58 自分のアプリ名]$ cat log/production.log
SELECTし同じテーブルの値をUPDATEする方法【SQLServer】

#同じテーブルの列の値をUPDATEする
SELECTした値を同じテーブルの異なる列へUPDATEする方法。
業務系システムなら入荷の入数と出荷の入数が同じ場合等に使用できる。
よく見かける方法は INNER JOIN を使用する方法。

```sql
UPDATE TBA a
INNER JOIN TBA b
ON  a.col1 = b.col1
SET a.col5 = b.col7
```

とか

```sql
UPDATE TBA
SET a.col5 = b.col7
FROM TBA a
INNER JOIN TBA b
ON  a.col1 = b.col1
```

あとはサブクエリを使用する方法もあるが、
単純に同じ値を更新するだけなら以下の方法でも可能。

```sql
UPDATE TBA
SET col5 = col7
FROM TBA
```
PHPのライブラリ「qr-code」でQRコード生成を実装した【CakePHP】

今回はCakePHPでPHPのライブラリ「qr-code」を活用して、QRコード生成を実装しました。「qr-code」はPHPのライブラリなので、CakePHPでなくても実装できます。

## Composerでqr-codeをインストール

ターミナルでqr-codeをインストールします。

```
$ composer require endroid/qr-code
```

問題なくインストールできるとvendorディレクトリ直下にchillerlanディレクトリがダウンロードされます。

![スクリーンショット 2020-04-21 17.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/5951599b-966e-1993-808d-754614a95d42.png)

## QRコード生成

今回は、ビューのヘルパーを使って生成する関数を定義しました。関数はコントローラでもモデルで定義しても問題ありません。

```php:src/View/Helper/CommonHelper.php
public function qrcode($url)
{
    return (new \chillerlan\QRCode\QRCode())->render($url);
}
```

## ビューでQRコードを表示

ビューで先ほど定義した関数を呼び出し、任意のURLを引数に渡します。そして、CSSを調整してあげればうまく表示されるはずです。

```php:index.ctp
<div style="background:url(<?= $this->Common->qrcode('https://www.google.com/') ?>); height:80px; width:80px; background-size:cover;"></div>
```

<img width="412" alt="スクリーンショット 2020-04-21 18.21.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/1d8bf92b-2f11-6eb2-4181-155e092883a2.png">



### 参考

[５分で出来る！PHPでQRコードを生成する方法](https://blog.apar.jp/program/13204/#toc1)
セマンティックバージョニングを正規表現で評価する

###公式リンク↓↓
[セマンティックバージョニング2.0.0](https://semver.org/)(最後の方に載ってます)

###見るのが面倒な人向け↓↓

```javascript
const regex = new RegExp(/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/);
if(regex.test(hogehoge)){
  console.log("OK")
}
```
Android studioのemulatorでインターネットに繋がらない現象を解決する

Android studioでemulatorを起動し外部APIへGETリクエストを実行しようとするもレスポンスが取得できずなんでだろうと思っていたらそもそもインターネットにできない状態でした．

# 環境
端末: Nexus5X
API version: 28

# 現象
![cannot_reached.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252857/affe2198-13c5-41b7-f788-c7c6c7ae0de9.png)

# 対応
ホスト側のDNSを8.8.8.8(GoogleのDNS)に変更後，emulatorを再起動することで解決
<img width="780" alt="dns_setting.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252857/fce3eef5-e219-95f2-bf8a-24f25d47041d.png">

再起動後
![reached.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252857/800c7b24-8e37-cd93-3efb-9b357b833085.png)

# 参考
[Android emulator not able to access the internet](https://stackoverflow.com/questions/42736038/android-emulator-not-able-to-access-the-internet)
[Android 9(Pie)でHTTP通信を有効にする](https://qiita.com/b_a_a_d_o/items/afa0d83bbffdb5d4f6be)
Rubyの基礎知識・文法について

# 背景
Rubyの基礎知識を備忘録としてのこします。

## 基礎文法

```ruby

出力の仕方
puts ”文字列”or値

コメントアウト
# コメントアウト

文字列の連結
”文字列” + ”文字列”

変数の定義
変数名 = 値

変数展開
文字列の中に#{変数名}とする。

if文
if 条件式
    処理
elsif 条件式
    処理
else
    処理
end

比較演算子
a==b  # aとbが等しい
a!=b  # aとbは異なる

配列
配列名=[値1,値2,値3]

each
配列名.each do |変数名|
    処理
end

ハッシュ
ハッシュ名={キー1:値1,キー2:値2,}

メソッドの定義方法
def メソッド名
    処理
end

クラスの定義方法
class クラス名(大文字で始める)
    処理
end

インスタンスを生成
変数名=クラス名.new

クラス内で変数を作る方法
attr_accessor :変数名
※インスタンスを生成すると同時に生成される

クラス内で変数を作る
self.変数名

他ファイルでクラスを使う方法
require “./ファイル名"

クラスの継承方法

class 子クラス<親クラス

```
mac で Jenkins 起動

いつも mac を再起動した後、Jenkins が起動できなくなるので、備忘録。
ただし、この時は動いたってだけで、将来どうなるかわからない。

### ここ見ろ

```
$ less /var/log/jenkins/jenkins.log
```

### 復旧

```
$ ll /var/log/jenkins/
total 56
-rw-r--r--  1 xxxxxxx  staff  8250 Apr 21 17:53 jenkins.log
-rw-r--r--  1 xxxxxxx  staff   133 Apr 21 00:30 jenkins.log.0.bz2
-rw-r--r--  1 xxxxxxx  staff   134 Apr 20 00:30 jenkins.log.1.bz2
-rw-r--r--  1 xxxxxxx  staff   133 Apr 19 00:30 jenkins.log.2.bz2
-rw-r--r--  1 xxxxxxx  staff   136 Apr 18 00:30 jenkins.log.3.bz2

$ sudo chown jenkins /var/log/jenkins/*
```

### 起動

```
$ sudo launchctl start /Library/LaunchDaemons/org.jenkins-ci.plist
```


### 動作確認

```
$ pgrep -lfa java
57933 /usr/bin/java -Dfile.encoding=UTF-8 -XX:PermSize=256m -XX:MaxPermSize=512m -Xms256m -Xmx512m -Djava.io.tmpdir=/Users/Shared/Jenkins/tmp -jar /Applications/Jenkins/jenkins.war --httpPort=8080
```