OmniAICreator/Qiita-1.07M huggingface dataset:
Sophos Anti-Virus for Linuxを試す[CentOS7.6]

#はじめに
セキュリティの意識が低いと耳の痛い言葉を見かけることが多くなったので、自分の出来る範囲でセキュリティ対策を頑張ろうと思いました。
前回は、マルウェア検知ツールを導入しましたので今回はウィルス検知ツールです。

#インストール
https://qiita.com/harasakih/items/deea8b5391be4343002d
上記のサイトをそのまま参考にしてます。ファイル名やパスが若干間違ってたりしますが、まぁ誰も困りはしないレベルだと思います。

#ウィルススキャン
前回のマルウェア検知ツールの動作確認では、対象ファイルがマルウェアではなくウィルスだったのか検知できませんでした。今回こそSophos先輩がバシッと決めてくれるでしょう。早速スキャンします。

```
# savscan -f -ndi -nremove /tmp
.
.
フルモード検索

ファイル 2 個を 6秒で検索しました。
ウイルスは発見されませんでした。
検索が終了しました。
```

検知できてない！！！
そもそもtmpフォルダ配下のファイルは２個じゃない！！！

https://www.sophos.com/ja-jp/medialibrary/PDFs/documentation/savl_9_cgeng.pdf
マニュアル参照中…。

-allのオプションを付ければ全部見てくれるそうです。
今度こそ、ウィルス見つけてくれよ？


```
# savscan -f -ndi -nremove /tmp -all
.
.
フルモード検索

ファイル 8 個を 11秒で検索しました。
ウイルスは発見されませんでした。
検索が終了しました。
```

…まぁ、こういうのは気持ちが大事！
ウィルス検知対策ソフトが動いているというその事実だけで今は十分。

検体ファイルについては、前回のマルウェアテストの際にWindows側で消されたりしたので…
ん、待てよ？Windows側で作ったのがまずかったのかも。
https://support.kaspersky.co.jp/459
上記サイトを参考に、今度はLinux側で再作成。

```
savscan -f -ndi -nremove /tmp -all
.
.
フルモード検索

>>> ウイルス‘EICAR-AV-Test’がファイル /tmp/virus-test.bat に発見されました

ファイル 8 個を 7秒で検索しました。
1 個のウイルスが発見されました。
1 個のファイル（8 個中）が感染しています。
検出に関する詳細は、ソフォス Web サイトの次のリンクを参照してください。
脅威解析センター: http://www.sophos.com/ja-jp/threat-center.aspx
検索が終了しました。
```

や↑ったぜ（琴ノ葉茜ボイス）

```
/opt/sophos-av/bin/savlog  --today --utc

2019-08-13 13:03:18: log.threat       脅威が /tmp/virus-test.bat で検出されました: EICAR-AV-Test (閉じる)。(ファイルはまだ感染しています。)
2019-08-13 13:03:24: savscan.log      オンデマンド検索が開始しました。
2019-08-13 13:03:31: savscan.log      オンデマンド検索の詳細: 検索マスターブートレコード数: 0、検索ブートレコード数: 0、検索ファイル数: 8、エラー数: 0、検出脅威数: 1、検出した感染ファイル数: 1
2019-08-13 13:03:31: log.threat       オンデマンド検索中、脅威が /tmp/virus-test.bat: EICAR-AV-Test で検出されました。(ファイルはまだ感染しています。)
2019-08-13 13:03:31: savscan.log      オンデマンド検索が終了しました。
2019-08-13 13:03:35: log.threat       脅威が /tmp/virus-test.bat で検出されました: EICAR-AV-Test (開く)。(ファイルはまだ感染しています。)
```
手動スキャンだけじゃなくてライブスキャン時にもしっかり確認できているように見受けられます。

最後に今度は発見時の通知の仕組み作りですが、もう後は画像貼り付け掲示板を巡回して画像を収集したいのでここまでにします。
MacBookにWindows Server 2016を入れる

# 背景・目的

- MacBookのBootcampを利用してWindows Server 2016を入れたいが，Bootcampアシスタントくんに「対応するOSでない」と怒られてしまう
    - Windows Serverならあの忌々しきコルタナくんは消える
    - Windows Server最大の障壁である「ドライバがない」問題はbootcampが解決してくれるはず
- Windows Server 2016はWindows10ベースなので，動かないわけがない．そこでBootcampアシスタントの目をかいくぐりWindows Serverをインストールしてみる

ちなみに，学生ならAzure dev tools for teachingで，Windows Server含め大量のWindowsが無料でもらえるので今すぐゲットしよう (ライセンスがリテール版だったりと無駄に豪華．）

## 概要

1. Bootcampアシスタントを利用して，（普通の）Windows10を入れる
2. インストールしたWindows10をブートし，Windows Server 2016をインストール
3. システムの設定
4. 各種ドライバインストール

## 実行環境と必要なもの
### HW
- MacBook, Late 2017
- 外付けキーボード，マウス（Windows Serverインストール直後はドライバがないため，内蔵キーボード・タッチパッドは使用不可となる）

### SW
- Windows10 Education
サーバOSインストールの踏み台なので，評価版の適当なWindowsで良いと思います

- Windows Server 2016 Datacenter
前述の通り，学生特権でもらいました．なんか強いらしいです．

- Windowsサポートソフトウェア
Bootcampアシスタントの「アクション」 > 「Windowsサポートソフトウェアをダウンロード」から取得．
Windows Serverインストール後に使用できるよう，USBメモリなどに保存してください．

## 手順
### 1. Bootcampアシスタントを利用して，（普通の）Windows10を入れる
[Boot Camp アシスタントで Mac に Windows 10 をインストールする](https://support.apple.com/ja-jp/HT201468)を参考にインストールしましょう
Windows10 Educationは入るので，Home, Pro, Enterpriseあたりは入ると思います．

### 2.インストールしたWindows10をブートし，Windows Server 2016をインストール
#### 2.1 ISOイメージを焼く
Windows Server インストールイメージをUSBメモリに焼きます
私の場合、rufusを使用してISOイメージをUSBメモリに書き込んでいます。

#### 2.2 Windows Serverインストール
Windows10を起動して，USBメモリからインストーラを起動し、インストーラの指示に従ってインストールします。
リブートするとキーボードとタッチパッドが死ぬので、リブートしたらキーボードとマウスをつなげましょう

### 3. ドライバ導入
#### 3.1 無線LAN機能インストール
デフォルトで有効になっていない無線LANを有効にします
1. 「サーバーマネージャー」から「管理」>「役割と機能の追加ウィザード」をクリック
2. 「機能」の欄まで「次へ」をクリック
3. 「機能」の「ワイヤレスLANサービス」にチェックを入れる
4. インストール実行

#### 3.2 Windowsサポートソフトウェアのインストール
Bootcampアシスタントからダウンロードした「Windowsサポートソフトウェア」のsetup.exeを実行

#### よくある問題
- キーボードの無変換・かなが機能しない
    - かなりの頻度でキーボードのドライバのインストールに失敗するので、再インストールしましょう。私の場合、[ここ](http://kuneoresearch.com/bootcamp-keyboard-driver-re-install/)の手順で解消できました。どうやらいったんおかしなドライバを入れてめちゃくちゃにするのが肝のようです。
- グラフィックスのパフォーマンスが出ない
    - Bootcamp君の入れるドライバが古いせいです。しかし、Windows ServerではIntel Graphicsドライバをダイレクトにインストールできないので、今後調査します。

### 4. 各種設定
[こちら](https://keitetsu.blogspot.com/2013/05/windows-server-2012os.html)を参考に設定すると使いやすくなります。
2012 R2の時の記事ですが、全く同じ手順が2016でも使えます。
【Python】隣接行列・隣接リスト変換


# 隣接行列

~~~python
gg = np.array([
    [0, 1, 1, 0, 0, 0, 0],
    [1, 0, 1, 1, 0, 0, 0],
    [1, 1, 0, 0, 1, 0, 0],
    [0, 1, 0, 0, 1, 1, 0],
    [0, 0, 1, 1, 0, 0, 1],
    [0, 0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 0]
])
~~~

# 隣接リスト形式

~~~python
g = np.array([
    [1, 2],     # S
    [3, 4],     # 1 A
    [4, 5],     # 2 B
    [6, 7],     # 3 C
    [8],        # 4 D
    [8, 9],     # 5 E
    [999],      # 6 F
    [10,11],    # 7 H
    [12,13],    # 8 I
    [999],      # 9 J
    [999],      # 10 K
    [999],      # 11 L
    [999],      # 12 G
    [999]       # 13 M
])
~~~


# 隣接行列⇒隣接リスト変換

~~~python
print("g = np.array([")
for i in range(len(gg)):
    #print(gg[i])
    gyou=[]       
    for j in range(len(gg[0])):
        #print(gg[i,j])
        if gg[i,j]>0:
           gyou.append(j)
    print(chr(9)+str(gyou)+",")
print("])")
~~~

# 隣接リスト⇒隣接行列変換

~~~python
L=len(g)
#0配列作成
gg=np.zeros((L,L),dtype = int)
for i in range(L):
    for j in range(len(g[i])):
        gg[i,g[i][j]]=1

print("gg = np.array([")
for i in range(L):
    print(gg[i])
print("])")   
~~~
scikit-learnの実装トレーニング１～ロジスティック回帰を使ってみる～

##やること
顧客情報から顧客が定期預金を申し込む確率を予測。
ロジスティック回帰を使用。
他のモデルの利用は[次回](https://qiita.com/shiroino11111/items/610bdd0704cdc25db7c0)に。
実装コードは[こちら](https://github.com/shiroino11111/predict_deposit.git)のbank1.py
#目的
sckit-learnを用いて自分で実装してみる。
##データ収集
[UCI](https://archive.ics.uci.edu/ml/datasets/Bank+Marketing)のBank Marketingを利用。
bank-additional.csv をダウンロード。
このままでは使えないので[こちら](https://forest.watch.impress.co.jp/docs/serial/exceltips/1085962.html)を参考にデータを列ごとに格納。
bank-01.csv と名前をつけて保存。
#####パッケージのインポート

```python
import numpy as np
import pandas as pd
from sklearn.model_selection import *
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
import warnings
import mglearn
```
#####データの読み込み

```python
df = pd.read_csv("data/bank_01.csv")
#ワンホットエンコーディング
data_dummies = pd.get_dummies(df)

features = data_dummies.loc[:, 'age':'poutcome_success']
X = features.values
y = data_dummies['y_no'].values
#データ確認
print("X.shape: {}  y.shape: {}".format(X.shape, y.shape))
print(data_dummies.y_no.value_counts())
```
X.shape: (4119, 63)  y.shape: (4119,)
1    3668
0     451
データに偏りがあるのでAUCスコアを使用する。
#####GridSearchCVを使って最適な正則化強度Cを探索
```python
pipe = Pipeline([('scaler', StandardScaler()), ('classifier', LogisticRegression())])
param_grid = {'classifier__C':[0.001, 0.01, 0.1, 1, 10]}

X_train, X_test, y_train, y_test = train_test_split(
    X, y, random_state=0)
grid = GridSearchCV(pipe, param_grid=param_grid, cv=3, return_train_score=False,  scoring="roc_auc")
grid.fit(X_train, y_train)
print("Best parameters: ", grid.best_params_)
print("grid best score, ", grid.best_score_)
print("Test set AUC: {:.2f}".format(grid.score(X_test, y_test)))

```
結果
Best parameters:  {'classifier__C': 0.01}
grid best score,  0.9383648126404396
Test set AUC: 0.91

grid.cv_results_で調べると、Cの値ではそこまで結果は変わらなかった。
[次回](https://qiita.com/shiroino11111/items/610bdd0704cdc25db7c0)はロジスティック回帰以外で探索しよう。
c++始めてみた：処理速度ってどうやって測るんですか？個人ノート1.4

# c++の処理速度の計測方法を調べる

c++言語を覚えたい理由の一つにc++の処理速度が「早いから」があります

ですがc++の実行・処理速度って
どうやって測るんですか？

[C言語/C++ 処理時間計測 入門 - ViVi web site](http://vivi.dyndns.org/tech/cpp/timeMeasurement.html)

上のサイトによると、

`プログラム開発当初から過度のパフォーマンス最適化を行うのは良くないと言われている。 プログラムソースの柔軟性が失われる可能性があるし、必要無いかもしれない最適化に時間を費やすのは開発工数管理的に好ましくないからだ。`

`プログラムがある程度動作するようになり、パフォーマンスが悪い（実行速度が遅すぎる）場合は、 処理時間計測を行い処理時間を要している箇所を探しだし、アルゴリズムやデータ構造の変更などのパフォーマンス・チューニングを行う必要がある。`

らしいので
最適化は、自分にはまだ必要無いという事が判明しました
しかし、c++言語を書く練習の一つとして
自分の書いたコードがどのくらいの処理速度なのかを測るのはいい練習だと思います
後々になって、その経験が役に立つ時が来ると思いますしね

上のリンクを参考にしながら
処理速度を測る為の自分なりのコードを
[wandbox](https://wandbox.org/)に書いてみました
７０〜９０％ぐらいほぼ一緒ですが
エラー無くかけました

version c++14

```time.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  cout << "clock():\n";
  for (int i = 0; i < 10; ++i) {
    vector<int> v;                // int 型動的配列
    clock_t start = clock();      // *************** スタート時間
    const int N = 1000*100;       //  10万回
    for (int i = 0; i < N; ++i) {
      v.push_back(i);             // 末尾に i を追加
    }
    clock_t end = clock();        // *************** エンド時間
    cout << "duration = " << (double)(end - start) / CLOCKS_PER_SEC << "sec.\n";
  }  
  getchar();
  return 0;
}
```

MATLABでよく処理速度を計っていたので、すぐに気付きましたが
clock()という関数を使って
clock_t start = clock();　ここで計測時間が始まり
clock_t end = clock(); 　ここで計測時間が終了して
その間に行っている計算？処理？の速度を測っているんですよね？

それ以外にも処理速度を計る関数は他にも沢山あるらしいです

- clock() c/c++
- GetTickCount() windows
- timeGetTime() windows
- QueryPerformanceCounter() windows
- C++11 std::chrono() c++11

その他のライブラリ　[<font color="blue">リンク</font>](http://yuzatakujp1013.hatenablog.com/entry/2015/12/28/172536)

処理時間の計測を考察しているQiita先輩がいたので
それに習ってみるのも経験になりそうです
[C++ 処理時間計測classを作ってみる](https://qiita.com/tyanmahou/items/8497d6e815ebf7ea90c6)

#### ~~これでc++言語を学んでいる間、処理速度を測ったり出来る様になりました！~~
<font color="red">（上で紹介している関数は、あくまでもc++のコーディング練習程度である可能性が出てきたので参考程度に、詳細はコメント欄をご覧下さい）</font>

処理の高速化については
別の話題になるし、深い知識がいると思うので
いずれかは説明が出来る様になりたいですね

## 追記

c++の処理速度計算は時間プロファイラー？を使って測る方法がいいらしいですよ？
（詳細はコメント欄をご覧下さい）
（２０１９年８月現在）
【Ruby】要素数が等しい複数のarrayリストの、1つ目の要素から順にhashリストに保存する

要素数が等しい3つのarrayリストがある。

```rb:
array1 = [1,2,3,4,5]
array2 = [6,7,8,9,10]
array3 = [11,12,13,14,15]
```
各arrayリストについて、1つ目の要素から順にhashに保存して別メソッドの引数とする処理を書きたい。

```
p hash
#=>
{:first=>1, :second=>6, :third=>11}
```




####zip関数を利用する
array.zip(other_array, ...)
https://ref.xaio.jp/ruby/classes/array/zip

```rb:
array1 = [1,2,3,4,5]
array2 = [6,7,8,9,10]
array3 = [11,12,13,14,15]
hash = {}

array1.zip(array2, array3) do |a,b,c|
  hash[:first] = a
  hash[:second] = b
  hash[:third] = c
  p hash
end
```


```rb:
#arrayの要素数分のhashが作成される。
#=>
{:first=>1, :second=>6, :third=>11}
{:first=>2, :second=>7, :third=>12}
{:first=>3, :second=>8, :third=>13}
{:first=>4, :second=>9, :third=>14}
{:first=>5, :second=>10, :third=>15}
```

文章で説明するのが非常に難しい
Java8でジェネリクスを活用した汎用的なStringConverterクラス

## なにこれ
* Java で、様々なクラスを文字列に変換するクラスです。

## 動作環境
* Java8 以上。

## クラスの中身
```StringConverter.java
	private static class StringConverter<T> {

		private static final List<StringConverter<?>> converters = Arrays.asList(
				new StringConverter<>(String.class, String::toString),
				new StringConverter<>(BigDecimal.class, BigDecimal::toPlainString),
				new StringConverter<>(Date.class, Date::toString)
		);

		private final Class<T> clazz;
		private final Function<T, String> converter;

		static String convert(final Object object) {
			if(object == null){
				return null;
			}
			return converters.stream().filter(c -> c.isApplicable(object)).map(c -> c.doConvert(object)).findFirst()
					.orElseThrow(() -> new IllegalArgumentException("Unexpected class:" + object.getClass().getName()));
		}

		private StringConverter(final Class<T> clazz, final Function<T, String> converter) {
			this.clazz = clazz;
			this.converter = converter;
		}

		private boolean isApplicable(final Object object) {
			return clazz.isInstance(object);
		}

		private String doConvert(final Object object) {
			return converter.apply(clazz.cast(object));
		}

	}
```


## 使い方

必要に迫られて書いたんだけれど、どんなシチュエーションだったか、間が空きすぎて忘れた。

```
String hoge = StringConverter<変換させたいクラス(convertersに定義してくれよな）>.convert(obj);
```

あとは総称型なかなか活用できる機会がなくて、使ってみたかった。

色々とミスってたら、すみません。
【python】オブジェクト指向プログラミング基礎vol.1 ~オブジェクト指向とは~

オブジェクト指向への理解が浅くインターン先で理解しきれないPythonのコードがあったので勉強したことを細分化してまとめます。

## オブジェクト指向とは

現代のプログラミングの設計方法論として、最もメジャーなもの。オブジェクト指向においては**クラス**という概念を用いて、それを設計の最小単位にすることで、**保守性**と**再利用性**を高めるソフトウェア開発技術。

**保守性**・・・維持管理のしやすさ

**再利用性**・・・プログラミングの再利用のしやすさ

変数だけを定義するとか、関数だけを定義することを許容せずに、必ず「クラスXXの変数」「クラスYYの関数」という形で持ち主を明記するようにしている。



## オブジェクトとは

Pythonの公式ドキュメントでは

> pythonにおけるオブジェクト(object)とは、**データを抽象的に表したものです**。
>
> Pythonプログラムにおけるデータはすべて、オブジェクトまたはオブジェクト間の関係として表されます。
>
> **オブジェクトはアイデンティティ値(identity)、型(type)、そして値(value)を持ちます。**

と記載されている。

オブジェクトには

- アイデンティティ、型、値の3つを持っていること
- データを抽象的に表現したもの

ふたつの大きな性質がある。



### アイデンティティ、型、値とは

オブジェクトにおけるアイデンティティとはPythonで使われるオブジェクトはID番号を持っているという意味。以下のコードを実行すると

```python
hello = 'hello world'
print(id(hello))
```

実行結果

```
2448634654512
```

このように数字の羅列が表示される。

id関数を使うことでそのオブジェクトのIDが割り振られていることがわかる。



**オブジェクトの値**は変数に代入されたデータのことで、上の場合は`hello world`が値になる。



**オブジェクトの型**は整数型や文字列やリスト型といったもので、オブジェクトがどんな型を持っているか確認する関数に`type`というものがある。

```python
print(type(hello))
```

実行結果

```
<class 'str'>
```

strというクラスのオブジェクトだと表示がされます。



例えば下のリストは型のひとつであり、内部に複数のデータをリスト形式で持つ。以下はすべてリスト型のデータです。

```
[]
[1, 2, 3]
['hello', 'world']
[1, 'python', 3]
```

リストは "**型**" であり、上記はそのデータである。リストは "**概念**" で「1, 2, 3という数字が格納されたリストのデータ」は具体的なモノである。オブジェクト指向におけるこの「概念のレベルでのデータが」クラスであり、その具体的なモノがオブジェクトと呼ばれる。

クラスとオブジェクトの関係を以下にまとめる。

| **クラス** | **オブジェクト**        |
| :--------- | :---------------------- |
| 整数型     | 1, 2, 3                 |
| 文字列型   | 'hello', 'world'        |
| リスト     | [], ['hello', 'python'] |

この表だけですとオブジェクトととは「具体的なデータ」のように思えるが、そうではなく、データに加えて処理も含んでいる。例えば、リスト`[1, 2, 3]`に`4`を追加して`[1, 2, 3, 4]`とするには以下のように`[1, 2, 3]`というリストのオブジェクトに対して追加処理をメソッドとして呼び出す。

```python
a = [1, 2, 3]
print(a)

# listオブジェクトaのメソッド呼び出し
a.append(4)

# オブジェクト自体が変更されている
print(a)
```

実行結果

```
[1, 2, 3]
[1, 2, 3, 4]
```

このように`[1, 2, 3]`というリストのオブジェクトがデータだけでなく`append`という処理(メソッド)も持っていて、それを使うことで更新する。

つまり`[1, 2, 3]`は**リストとしての型と`1, 2, 3`という値を持ちながら、かつ関数を保有している**といえる。
PowerShellでバイナリ(もしくはエンコーディングが不明なデータ)を扱う

## パイプラインとリダイレクト
PowerShellでは、普通のシェルと同じ方法でリダイレクトやパイプラインを行った場合、ストリームの内容が文字列に変換されて扱われるという特徴があります。
データによってはエンコーディングの変換でデータが欠落し、通常のコマンドプロンプトと異なる動作になります。

## 欠落例
これらはエンコーディングの変換によってデータが欠落します。

```powershell
#　欠落例1
.\bin.exe > bin_fail1.bin

# 欠落例2
$bin_fail = .\bin.exe
```

## 成功例
次の方法ではエンコーディングの変換なしにデータを取得できます。

```powershell
# コマンドラインインタプリタで標準出力を処理する
cmd /c "bin.exe > bin_cmd.bin"

# バイナリを読み出す
[byte[]]$bin_gc = Get-Content -Path .\bin_cmd.bin -Encoding Byte

# バイナリを書き出す
Set-Content -Path "out_sc.bin" -Value $bin_gc -Encoding Byte
```



## おまけ
コマンドラインインタプリタを使わずパイプでバイナリを得ます。

```powershell:invoke.ps1
# コマンド実行時の標準出力をByte Arrayで得る
function Invoke-BinaryPipe {
    Param($FileName, $Arguments)
    if (-not $FileName) {
        Write-Host "Usage Invoke-BinaryPipe <FileName>"
        return
    }
    [System.Diagnostics.ProcessStartInfo]$psi = New-Object -TypeName System.Diagnostics.ProcessStartInfo
    $ExecPath = (Convert-Path $FileName)
    $psi.WorkingDirectory = (Get-Location).Path
    $psi.RedirectStandardOutput = $true
    $psi.UseShellExecute = $false
    $psi.FileName = $ExecPath
    $psi.Arguments = $Arguments
    [System.Diagnostics.Process]$proc = [System.Diagnostics.Process]::Start($psi)
    if (-not $proc) { return }

    $proc.WaitForExit()
    [System.IO.MemoryStream]$ms = New-Object System.IO.MemoryStream
    $proc.StandardOutput.BaseStream.CopyTo($ms)
    $ms.ToArray()
    $proc.Dispose()
}

[byte[]]$bin = Invoke-BinaryPipe "./bin.exe"

```
(windows用補足)python3でGoogle Cloud Speech-to-Text APIでリアルタイム音声認識する

参考：
https://qiita.com/yoshiokaCB/items/9e2e968756beb53fa452
https://qiita.com/sayonari/items/4656212b4d34714ab98f
https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e
https://techacademy.jp/magazine/20860

誠にありがたいことに、99％は参考欄にある先人の方々のMacのコードで動きました。

pythonの初歩的な知識が無いまま、無理にwindowsで音声認識しようとし、エラーが発生したので、その記録を残します。

上記リンクを参考に、cloudSDKの準備、APIを使うためのjsonファイルを用意し、サンプルコードをgit cloneした後、

```
#ライブラリインポート
pip install google
pip install google.cloud
pip install google.cloud.speech
pip install grpc-google-cloud-speech-v1beta1
pip install pyaudio

#仮想環境
virtualenv venv
env\Scripts\activate

#環境変数
set GOOGLE_APPLICATION_CREDENTIALS=C:\Users\xxx\Downloads\xxxxxxxx.json

#音声認識
cd C:\Users\xxx\python-docs-samples\speech\cloud-client
transcribe_streaming_mic.py
```
↓
PCに向かってしゃべると音声認識してくれる。超すごい。


躓いたポイント
１．windowsの仮想環境

```
env\Scripts\activate
```

(仮想環境にしないとcannot import enumsのエラーが出ました。「仮想環境で実行しろ」のエラーではないので、一生懸命enumsのライブラリをインストールしましたが、解決できません（解決策はstack overflowにあり）。先人たちのサンプルはMacのコードで、windowsの仮想環境のコマンドがわからず、早く動かしたくて仮想環境に入るのを無視してたら、このエラーで躓きました。)

２．環境変数の設定

```
set GOOGLE_APPLICATION_CREDENTIALS=C:\Users\xxx\Downloads\xxxxxxx.json
```

（ディレクトリとファイル名は""や''や<>で括らないで、そのまま書く。参考にしたコードが括られていて、そこに気づかずに躓いた。Windowsだけかしら？）

３．マイク入力をON
以下の手順でミュートを解除する(やっと動いたコードが動かなくなった？と焦ったのはこの初歩的ミスだった。)
コントロールパネル→サウンド→録音→マイク（マイク配列？）→プロパティ→レベル
PycharmプロジェクトでFlaskのデバッグモードをonにする

# 環境
Pycharm Professional Edition 2019.1
Python 3.7.1
Flask 1.1.1
Windows 10

# デバッグモードがonにならない
Flaskのドキュメントだと以下のコードでデバッグモードがonになるとかいてあるが、onにならない。

```python
app.run(debug=True)
```

# Pycharmの実行設定を変える
Shift + Alt + F10で出てきた、ポップアップでEdit Configurationsを選択。

左のサイドバーでプロジェクトの名前がついたものを選択。

ConfigurationタブでFLASK_DEBUGにチェックを入れる。

これで問答無用でデバッグモードがonになる。
ターミナルに突如現る! ESC[ を非表示にする方法

#はじめに
たびたび、ターミナルに何かしらを出力する際、**ESC[** という文字列が出力結果に散りばめられ、非常に見にくい表示になっていました。
私の場合は、`git diff` の出力結果にこのような問題が見られ、解決策がわからないままでしたが、ある英語サイトにソリューションが掲載されていましたので、**日本語版**として同じ問題に遭遇した人の一助になればと思い、本記事を投稿します。

#ソリューション
最初に解決策を示します (❯コマンドプロンプトですので、入力しないで下さい)。

```
❯ export LESS="-iRMXS"
```
上記のコマンドを実行するだけです。
[こちら](http://excid3.com/blog/how-to-fix-esc-in-your-terminal)の英語サイトによると、**less** コマンドに問題があったとか。環境変数 **$LESS** が誤って設定されていることに原因があったそうです。

**Rオプション**をつけることで、ANSI カラーエスケープシーケンスを解するようにできます。

ですので、実は、次のコマンドでも問題は解決できます。

```
❯ export LESS="-R"
```
ただ、Rオプションに加えて、**iMXS**のオプションをつけることで、幾分幸せになることができますよ（理由は補足に示します）。

#変化
私の場合、以下のように見やすくなりました。
苦しみながら、解読していた時が懐かしいです。笑

・before

```
❯ git diff
ESC[1mdiff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erbESC[m
ESC[1mindex 3295719..2feb624 100644ESC[m
ESC[1m--- a/app/views/users/show.html.erbESC[m
ESC[1m+++ b/app/views/users/show.html.erbESC[m
ESC[36m@@ -118,7 +118,6 @@ESC[m
   </div>ESC[m
 </div>ESC[m
 ESC[m
ESC[31m-ESC[m
 <script>ESC[m
 $(".tab").on("click", function() {ESC[m
   console.log(this);ESC[m
```
・after

```
❯ git diff
diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb
index 3295719..2feb624 100644
--- a/app/views/users/show.html.erb
+++ b/app/views/users/show.html.erb
@@ -118,7 +118,6 @@
   </div>
 </div>

-
 <script>
 $(".tab").on("click", function() {
   console.log(this);
```

#補足
私が設定している`less`コマンドの便利なオプションを表にまとめました。

| オプション | 意味 |
|:-:|:-:|
|  -i | 検索時に全部小文字で入力した時だけ、大文字小文字を無視する  |
|  -M | 詳しいプロンプトを表示する（現在の表示位置を%で表示する等）  |
|  -X | less 終了時に画面をクリアしない　 |
|  -S | 一行の長さが画面幅を超える場合でも改行しない  |

#参考資料
- [How to fix ESC \[ in your terminal](http://excid3.com/blog/how-to-fix-esc-in-your-terminal)
- [あなたの知らないlessの世界](https://qiita.com/delphinus/items/b04752bb5b64e6cc4ea9)
- [lessのおすすめオプション](https://qiita.com/takc923/items/598a68c4684114ffb102)
ずっと文系だった人間がパソコンを触りエンジニアを目指す！

少し前からプログラミング学習を始めましたが、基本的には学習した内容をここにメモしていこうと思ってます！　いつか他の人が知らなかった！って言う情報書けるようになれるよう成長したいと思ってます！
Qiitaを書こうとして挫折した話。

はじめまして、おなべ士です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481835/b04e4260-0d89-2ed9-4ad3-7ba71d38f664.png)
さて、STMの使い方について書こうとか思ったりしたのですけど…
書く直前に調べるとすでに書かれたものが出てくる出てくる。。。

とくに[@usashirou](https://qiita.com/usashirou)さんの紹介が素晴らしいので勝手ながらURLを張らさせていただきます。。。
（引用数の多いサイトほど検索上位に来るとか言う話だっけ…？）

- [STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　Lチカ編](https://qiita.com/usashirou/items/65be086c28f7a6feac7d)
- [STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(2)](https://qiita.com/usashirou/items/c49a0b14c1fc6df22e5d)
- [STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(3)](https://qiita.com/usashirou/items/e1cb59a508dac64b8a3c)
- [STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(4) スイッチを使ってみよう](https://qiita.com/usashirou/items/30e522589db9f7dc8fe4)
- [STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(5) 　UARTを使ってみよう](https://qiita.com/usashirou/items/76c812d35642a3c29aea)
- [STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(6) 　UARTを使ってみよう(2)](https://qiita.com/usashirou/items/5a2c9e4fd35c261c4f3a)
- [STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(7) 　割り込みを使ってみよう](https://qiita.com/usashirou/items/0bcb008ef83a159538dd)
- [STM32 Nucleoって何？]
(https://qiita.com/usashirou/items/e66c77a02477f579cee7)

.....うーん、自分が書くことないんじゃない…？

つい先ほどまで

- GPIO
- シリアル通信(UART)
- タイマ(TIM)とクロック
- タイマ割り込み(TIM&NVIC)
- PWM
- Encoderモード
- ADC
- ADC&DMA
- I2C
- SPI
- 外部割込み
- UART&NVIC
- UART&DMA

を書こうと思っていたのですがばらばらで見たらほとんど既出じゃん。。
もはや、まとめサイトを作ることに専念してみるのもありかな…

要望あったら是非コメントしてください！！
EasyApp758 第3回 参加・登壇レポート

先日8月10日(土)に開催しました [PowerApps + Flow アプリ作成研究所 in 名古屋 #3](https://paandflow.connpass.com/event/140520/) 参加レポートです。会の名称が長いですよねｗ 略称は「EasyApp758」です。なお、当日の設営後、発表の順番を入れ替えたためConnpassの発表順ではありません、あしからず。

# 01：PowerAppsは業務改善の覇者の夢を見るか
1番手は [@SinyaSakakibara](https://twitter.com/SinyaSakakibara) さん。
名古屋を中心に、愛知の中小企業向けITコンサルティング、Office 365 導入・活用支援をされている立場から、PowerApps を活用された事例や、導入障壁となっている部分、そこに対するアプローチ案などをご紹介いただきました。また、参加者の方へディスカッションを促していただき、その場でアレコレ議論が発展して非常に楽しい時間でした。
こういう、ディスカッション系のセッションありですねー。

# 02：PowerApps 初心者の館？
2番手は、当方です。
よく「どうやって PowerApps を勉強したらよいですか？」という質問をいただきます。昨今は MS Lean や YouTube の動画など、学習用コンテンツが多数存在します。また、有志の方々がブログやQiitaで様々なテクニックを紹介しており、インターネットに接続できれば比較的効率良く、無償で学習することが可能になってきています。その参考URLを質問に対する回答として提示するためにも、1回まとめよう、と思っていたので登壇用のネタにした次第なのです。

登壇資料はこちら↓。
https://www.slideshare.net/TeruchikaYamada/powerapps-162807949

ご質問いただくなかで「いかにして”苦労せずに楽して”ナレッジだけもらうか？」という意図を感じる方がおみえになるんですが、残念ながら「自ら学ぶ意思」が無い場合は何をやっても無駄だと思うんですよね。小手先の技を身に着けたところで、PowerApps の真価は得られないと考えております。なので、自分自身で手を動かして学ぶ、これが一番だと思ってます。
当方がPowerApps へアプローチし始めた頃は全く日本語の情報が無かったのですが・・・。今は恵まれてますよ、皆さん！さぁ、make.powerapps.com の世界へGo！！

# 03：おやつタイム＋Q&A 対応
ホントはLTタイムの予定でしたが、LT希望者がいなかったんですよね。そんなコトもあろうかと、Sli.doで質問を集めていたのですよ。で、それに対して答えられるヒトが回答していく、というスタイルでQ&Aを実施。Sli.do 以外にも、その場で手をあげて質問してくださったりして、いい感じでしたねー。

そうそう。SharePoint Online（SPO） のカスタムリストに作成する列について。訓練されたSPO使いの皆さんは、半角英数字で命名（物理名を確定）→ 日本語名へ変更（論理名を日本語にして可読性Up）という手順を、息をするように踏むかと思います。

質問で上記に関して指摘されたのですが、現在の PowerApps では、カスタムリストの列は物理名でも、論理名でも、どちらでもアクセスできるようです。なので、マルチバイト文字でカスタムリストの列をいきなり作成しても、エンコードされた文字列ではなく、認識できる文字列でアプローチすることができます。ここは、もう少し調査をしてから別途まとめたいな、と思っています。

# 04：皆で参加する PowerApps のテンプレ Hack 大会 
最後は [@nya193](https://twitter.com/nya193) さんの、PowerApps テンプレート Hack大会。
ご自身が PowerApps の作成画面（make.powerapps.com）で[新しい画面]から追加できるモノを流用しようとしたらハマったので、皆も一緒にハマってみよう、ですｗ 
参加者全員がハンズオンできるように、Office 365 試用テナント＋PowerApps P2試用ライセンスをご準備いただきました！感謝！！

なお、ハマったポイントは「会議」画面からヒトを検索する箇所のみを、別アプリに移植しようと思ったんだけど・・・、という内容です。（画面上で”出席者”というラベルの下部分）

Textボックスで入力された文字列から'Office365ユーザー'をSearchUser。この時、検索用Textボックスの文字数でギャラリーコントロールの表示・非表示を制御。選択された対象（ユーザー）を配列に退避して・・・。

と、かなり複雑なコトになってますので、興味のある方は是非とも解析にアプローチしてみてください。単純にユーザー検索をしたいだけなら、'Office365ユーザー'をデータソースへ追加して、ドロップダウンコントロールを利用したほうが簡単です。ただ、それよりも「会議」画面のコントロール群は使い勝手がよいので、とても勉強になると思います。

# 今後の課題やら、改善案のメモ
- ご新規さんが常連の輪に入りやすい仕組み
- ハンズオン、ないし（もっと）手を動かす回
- Microsoft Flow にフォーカスしたセッション
- Power Platform 事例紹介（※）
- 最新情報

上記※の事例は、是非とも実際に利用している方に話していただきたいなぁと思っています。もし、PowerApps、 Power BI、 Microsoft Flow を業務で活用されている中部地区の方がおみえでしたら、是非とも次回ご登壇賜りたいです。

# 次回告知
「PowerApps + Flow アプリ作成研究所 in 名古屋」の次回、第4回は2019年11月9日（土）を予定しております。会場を探しておりますので、ご協力いただける方はDMやメール等でご連絡いただけると幸いです！

それでは、皆さま。素晴らしい Power Platform Life を！
【Kotlin】SpannableStringBuilderを使って、TextViewの一部をサイズ変更する

下記のように数値の部分だけを大きくすることを考えてみます（数値はAPIから渡される仕様）。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/b2af913a-932e-974a-70c1-9db024f06d15.png" width="320"/>

# そもそも`Span`とは
>スパンは、文字または段落レベルでテキストのスタイルを設定するために使用できる強力なマークアップオブジェクトです。テキストオブジェクトにスパンをアタッチすることにより、色の追加、テキストのクリック可能化、テキストサイズの拡大縮小、カスタマイズされた方法でのテキストの描画など、さまざまな方法でテキストを変更できます。

Spanの種類は20パターン以上あるようなので、詳細が気になる方は公式サイトをご覧ください。
[Spans  |  Android Developers](https://developer.android.com/guide/topics/text/spans)

# コード
## TextViewの拡張関数として実装する

```kotlin
fun TextView.changeSizeOfText(target: String, size: Int){

    // 対象となる文字列を引数に渡し、SpannableStringBuilderのインスタンスを生成
    val spannable = SpannableStringBuilder(target + "hPa")

    // Spanを組み込む
    spannable.setSpan(
        AbsoluteSizeSpan(size, true),
        0, // start
        target.length, // end
        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
    )
    
    // TextViewにSpannableStringBuilderをセット
    text = spannable
}
```

### 解説
肝となるのは`setSpan()`で、

* 第1引数：スタイルをどう変更するか
* 第2引数：変更の開始位置
* 第3引数：変更の終了位置
* 第4引数：影響範囲

をそれぞれ指定します。中身を見に行くとこんな感じ↓

```java
public void setSpan(Object what, int start, int end, int flags) 
```

第1引数で渡している`AbsoluteSizeSpan()`は文字のサイズを絶対値で変化させる際に使うもので、第2引数`dip`に`true`を渡すと、デバイスに依存しないピクセルサイズを設定することができます。（`dip`は`device-independent pixels`の略）

第4引数の「影響範囲」については、基本的に`Spanned.SPAN_EXCLUSIVE_EXCLUSIVE`を渡しておけば大丈夫そうです（というか自分は他の定数を使ったことがないです…）。


## 呼び出す
```kotlin:MainActivity.kt
viewModel.pressure.value?.let { pressure -> //APIから渡される数値の文字列
    binding.textView.changeSizeOfText(pressure, 50)
}
```

これで無事TextViewの一部をサイズ変更することができました。

# 参考
* [Spans  |  Android Developers](https://developer.android.com/guide/topics/text/spans)
* [：Tips 　TextView を使いこなそう　〜 表示編 〜　 その4 - - Google Android -  　雑記帳](https://androidprogram.hatenadiary.org/entry/20100529/1275086958)
* [スパン可能な文字列 - cob-group-site](https://sites.google.com/site/cobgroupsite/android/programing/spannablestring)
custom label

GUI設定方法
・カスタム設定（多国語はオブジェクトと同じで別管理）
・カスタム表示ラベル（翻訳値有り）
・定数

2018年sfdc工作总结_VF,JS,Lightning分别调用custom label的写法
Lightning {!$Label.c.LabelName}
JS  $A.get("$Label.c.LabelName")
VF {!$Label.LabelName}


custom label in apex code salesforce
http://www.sfdcpoint.com/salesforce/custom-label-in-apex-code-salesforce/


Apexからの利用方法
System.Label.＜ラベル名＞

Visualforceからの利用方法
$Label.＜ラベル名＞

Salesforceにはカスタム表示ラベルという、テキスト値を定義できる機能があります
定義したテキスト値は、ApexやVisualforceから利用可能なので、エラーメッセージや文字列などの定数を外出ししたい場合に便利です。

参照
https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/labels_intro.htm


https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/labels_apex.htm
https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/labels_apex.htm
String s2 = System.Label.MyLabelName;


追記
SFDC：Lightning Componentとカスタム表示ラベル

カスタム表示ラベルをLightning Componentで使用できるようになります。
$Label.c.labelName (デフォルトの名前空間の場合)
$Label.namespace.labelName (組織に名前空間がある場合)


controller.jsやhelper.jsなどのJavaScript側では次のように記載します。
$A.get("$Label.namespace.labelName")

<ui:outputText value="{!$Label.c.HelloLightning}" />
LightningCustomLabelDemo.cmp

var label = $A.get("$Label.c.HelloLightning");
alert(label);
LightningCustomLabelDemoController.js

https://tyoshikawa1106.hatenablog.com/entry/2015/06/13/204050

Getting Labels in JavaScript
https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/labels_dynamic.htm
「MAMP」の「Mysql」のパスワードは【root】でした。

#はじめに

最近PHPの学習を初めて
今回書籍
「気づけばプロ並みPHP改正版」という書籍を使い勉強を進めていたのですが
見事にエラーに苦戦し、思わぬ時間を使ってしまったので記事にします。

## エラー内容
```
Access denied for user 'root'@'localhost' (using password: NO)
```

passwordが違うという感じのエラーで
このエラーを引き起こした記述がこちらになります

```hoge.php
$dsn = 'mysql:dbname=shop;host=localhost;charset=utf8';
$user = "root";
$password = '';
    
$dbh = new PDO($dsn,$user,$password);
```

 書籍には今回passwordは[ない]という記述があり
僕はそれを真に受けてしまって
「なにが違うんだー！」
と頭を悩ませていました。

```
Access denied for user 'root'@'localhost' (using password: NO)
```

こちらのエラー内容でググっても
いまいち今回の解決に繋がることが出てこなくて

「もしかして今までのMysqlとMAMPのMysqlは違うのか？」
という疑問になり

MAMP　mysql　で検索かけてようやく出てきました。

ということで

##解決
```hoge.php
$dsn = 'mysql:dbname=shop;host=localhost;charset=utf8';
$user = "root";
$password = 'root';
    
$dbh = new PDO($dsn,$user,$password);
```
これで解決しました。

書籍信じすぎるのはよろしくないですね。

以上です。
ありがとうございました。
Play Framework を Heroku にデプロイする際の注意点

個人的なメモ
Play Framework は 2.7 系で考えている

## （sbt を使う場合は） gradle 関係のファイルを消す

Giter8 テンプレートには sbt 関係のファイルも gradle 関係のファイルも両方含まれているが、Heroku はデフォルトでは gradle の方を見てしまうので、 sbt を使ってアプリケーションを構築した場合は `build.gradle` 等を消す。

## APPLICATION_SECRET の設定

Play Framework のアプリケーションシークレットについては、[公式ドキュメント](https://www.playframework.com/documentation/ja/2.4.x/ApplicationSecret)を参照。

具体的には、

```
sbt playGenerateSecret
```

で秘密鍵が作成される。この秘密鍵を`XXXXXXXXXXXXXX`として、

```
heroku config:add APPLICATION_SECRET="XXXXXXXXXXXXXX"
```

で Heroku 側に環境変数を設定し、`application.conf`の方は

```conf
play.http.secret.key=${?APPLICATION_SECRET}
```

と記述すればよい。

## Allowed hosts filter の設定

有効なホスト以外からのアクセスを遮断する Allowed hosts filter という Filter がデフォルトで入っており、このフィルターに対して `.herokuapp.com` を受け入れさせる必要がある（[参考記事](http://lab.astamuse.co.jp/entry/2018/03/21/114500)）。もちろん、独自ドメインを使う場合は別によしなに設定してやってください。
具体的には、`application.conf` に

```conf
play.filters.hosts {
  allowed = ["localhost", ".local", ".herokuapp.com"]
}
```

を書き足す。

## HTTP を HTTPS にリダイレクトする

`application.conf` に

```conf
play.filters.https.xForwardedProtoEnabled = true

play.filters.enabled += play.filters.https.RedirectHttpsFilter
play.filters.https.redirectStatusCode = 301
```

を書き足す

## その他

base_url が `http://localhost:9000` になっているものは Heroku アプリケーション側の URL に変更しておく。OAuth のコールバック URL とか。
Noodlで外部JSライブラリ読み込み（グラフ表示）


#概要
Noodlで外部ライブラリを読み込んで使ってみました。
今回はChart.jsを読み込んで、グラフ表示させました。
その備忘録です。

この仕組みを使ってChart.jsのコンポーネントを作ってみました。
https://github.com/kmaepu/Noodl-Component-Ambient

#使用するノード
JSライブラリを読み込んで、HTML要素を操作するフローは次の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/f2149c1b-ded8-b086-6105-c3fdd23bf09e.png)

使用しているノードは次の３種類です。

（１）script downloader
　　JSライブラリを読み込むノード
（２）javascript
　　JSを記述するノード
（３）HTML contents
　　HTMLを記述するノード

#各ノードの設定

（１）script downloader
　プロパティ**Script 0**に、ライブラリのロード先パスを設定します。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/47b0fafa-9472-b369-03ca-cf7987d5abb2.png)

（２）javascript
　　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/b9b8885b-e8f3-c9eb-f490-7f15e1617388.png)

Javascriptの記述例は以下の通りです。
inputsに次の３つを追加します。

```js
define({
    inputs: {
        isAddedToDOM : "boolean",
        domElement : "domelement",
        scriptsLoaded: "boolean"
    },
```

runでHTMLの要素と、読み込んだライブラリのインスタンスを生成しています。

```js
run: function(inputs, outputs, changedInputs) {
        var ctx = document.getElementById('myChart');
        var myChart = new Chart(ctx, {
```

（３）HTML contents
　HTMLプロパティをEditして、HTMLを記述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/bd9f66e8-c529-fe70-eb96-0e6aa84cd64a.png)

#例
　Chart.jsを読み込んでグラフ表示してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/c16b0243-9773-9706-b54b-7346a363bfb2.png)

#終わりに
詳しくはNoodlの[ドキュメント](https://noodl-jp.tds-g.biz/doc/node/script-downloader/)とサンプルプロジェクト**Google Mapサンプル**をご参照下さい。
Donkey Carを改造しながら色々勉強してみる

#1.はじめに
Donkey CarにIMUをつけてみたくなったので解析しながら改造しようとしましたが、開発環境が全く整えられていませんでした。
せっかくなのでマークダウンでクラス図とかも書きながらやってみる


#Donkey Car開発が、はかどる環境を整えたい
+ GitHubが簡単に使えるようにしたい
+ UMLを使って開発資料を残したい
+ Qiitaの入力が楽になるようにしたい
+ PCでJETSON-nanoのファイルを直接編集したい

こんなイメージですね。VSCodeで適正な機能拡張を行えばできそうな気がします。
![VSCode.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/4d0d4c65-49a2-b716-aad2-161e7618e359.png)

#PC側のVSCodeでJetson-nanoを直に編集する
SSH接続でJetson-nanoのファイルを直に編集したい。
SSH FSをVSCodeでインストールすると以外にあっさりできた。
しかし、grep検索でディレクトリを対象にした検索ができず、開発には不向き。（やる方法があれば教えてください）
設定の編集にはちょうどいい。
編集量の多い場合はPCで作ってgit hubにアップして、Jetsonではcloneを作るほうがよさそう。

#Git Hubをまじめに使ってみる
Gitでバージョンの管理をしながら編集する。
VSCodeのgitLensが良いと聞いて。

+ GitHubの自分のリポジトリにDonkey Carをフォークする
+ リポジトリからローカルにクローン
+ ブランチを作って保存する

フォークしてクローンして、gitLensで見てみると・・・
![コメント 2019-08-13 180714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/83261c52-6d5b-cb0f-a972-4a8a8efd6786.png)
情報量多すぎ。
GitHubからもタグのついたバージョンをチェックアウトできるので、かなり便利。

#QiitaがVSCodeで編集できるようにする
Qiita用の機能がありました。
[VSCode Qiita](https://marketplace.visualstudio.com/items?itemName=Neetshin.vscode-qiita)
非常に便利で重宝。ローカルでエディットできるだけでもありがたい。
そのまま編集して保存でQiitaに反映されます。
ただ、画像を新規で貼ることができませんでした。
長文を打ち込んだ後、画像をブラウザで張り込んで終了というところでしょうか。

#マークダウンで設計してみる

[MarkdownとPlantUMLでソフトウェアの仕様書や設計書を書くための環境構築手順](https://www.eureka-moments-blog.com/entry/2018/12/17/121617)

ここを参考にして環境を作った。
確かに書いたとおりにプレビューできるので、メモを残すにはちょうどいい。

#タイミングチャートがかける
WaveForm Rener で、タイミングチャートが書ける。
そのうち、自宅でオシロスコープ使い始めたら必要になるかも。

#ターミナルでAnacondaを使う
ターミナルでAnacondaが使えると、学習コマンドも呼び出せて非常に楽です。
設定がちょっとややこしいですが。

ここを参考にして、VSCodeでターミナル実行をminicondaでできるようにしました。
[Visual Studio Code のターミナルから Anaconda Prompt を開くようにする (Windows)](https://qiita.com/_meki/items/5b4f06318f1a0986c55c)



#I2Cに色々つなげてみる
IMUははんだ付けが必要なので、他のものをつないで動作の確認をしてみる。
そもそも、Donkey Car自体がパーツの塊なので、Donkey Carから適当にドライバを吸い込んで動かしてみよう。

```:TestProc.py
#import donkeycar as dk

from donkeycar.parts.actuators import PCA9685

PCA9685.run(100)

```
ApsaraDB for RDS(MySQL)上のデータをGrafanaで可視化する-Grafana導入編-

## 最初に
AlibabaCloudにはデータ可視化サービスとして、DATA-Vがある。しかし、日本サイトでDATA-Vを構築する場合、必ず東京リージョンに構築される。
中国国内から参照したい場合、DATA-V→RDS構成をとってしまうと思ったような性能が出ない。
そこで、今回は、中国国内のRDSに蓄積したデータを、同じリージョンに構築したECS上で動作するGrafanaを用いて可視化する方法を紹介する。

## 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/9abc1c8e-b316-50fa-b2b8-b343e2e3b098.png)

## 導入手順
※ECSとRDSはあらかじめ構築しておくこと。

### 1.Grafanaをインストール
yumで一発でインストールできる。
rpmのダウンロード先は、公式HPにて確認すること。
https://grafana.com/grafana/download?platform=linux

```
# sudo yum install https://dl.grafana.com/oss/release/grafana-6.3.2-1.x86_64.rpm

# rpm -qa |grep grafana
grafana-6.3.2-1.x86_64
```
※今回の構成では、上海リージョンに建てたECSからリポジトリにアクセスしているため、通信がGreatFirewallに引っ掛かり非常に遅い。気長に待つべし。

### 2.Grafanaを起動

```
$ systemctl start grafana-server

$ systemctl status grafana-server
● grafana-server.service - Grafana instance
   Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-08-13 16:27:27 CST; 20s ago
     Docs: http://docs.grafana.org
 Main PID: 17028 (grafana-server)
   CGroup: /system.slice/grafana-server.service
           └─17028 /usr/sbin/grafana-server --config=/etc/grafana/grafana.ini..
```

**Active: active (running)**になっていればOK。

### 3.ブラウザ経由でアクセス。
インストールしたECSのEIPに対して、3000番ポートで接続。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/1c447e87-0a35-341b-5e65-83b560486f94.png)
初期アカウント/パスワードは、admin/admin

ログインすると、パスワードの変更が求められる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/8d75f251-551d-7f08-9119-0d821213bcd2.png)

### データソース登録
ここまで来たら導入編はあと少し。
Add data sourceをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/9fc3ac7e-89de-b07a-48ea-0a2c568cd473.png)

MySQLを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/6fea6d8b-5cac-03ae-fc27-3193a46a1caf.png)

パラメータを入力。
`Name` : データソースの名前を決めて入力(任意)
`Host` : 用意しているRDSのInternal Endpointを入力。末尾に**:3306**をつける。
`Database` : 用意しているデータベース名を入力
`User`/`Password` : データベースに接続可能なユーザ/パスワードを入力。
他はデフォルトのままで良い。

ここまで入力したら、`Save&Test`をクリック。
**Database Connection OK**
と表示されれば、データベースとの接続成功だ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/7777c19a-a7f7-8ddb-17c4-0f49948485d5.png)





## 最後に
今回は、Grafanaに、AlibabaCloudのApsaraDB for RDS(MySQL)をデータソースとして登録するところまでを説明した。
次回は、Grafanaを使って、RDS内のデータを実際に可視化する。
windowsでdlibインストールで詰まったときに

# はじめに

cudaを使わない場合のインストール手順です。
cuda使うversionは次回。


# そもそもやりたかったこと
face_recognitionのために、dlibのライブラリをinstallしたい！


# 環境
windows 10
anaconda env

# やったこと
1. pip install cmake
→ver.3.14.4

2. Visual Studio 2019 Communityのインストール
    - [リンク](https://visualstudio.microsoft.com/ja/downloads/?utm_source=mscom&utm_campaign=msdocs)

    2-1.C++によるデスクトップ開発にチェックしてインストール
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369559/84661257-e81e-0860-8b23-38e19efeaf1d.png)
※写真はインストール後のものなので、イメージが若干異なりますが右下のインストールを押してもらえばOKです。

3. pip install dlib
→ver.19.17.0がインストール


# 詰まったところmemo
**1. C++の開発環境を入れてない状態だと、cmakeのビルド環境が整っておらず失敗する。**

 -  CMAKE_C_COMPILER
 -  CMAKE_CXX_COMPILER

    PATHがうんちゃら言われる。ただ、PATHを直すためのコマンドやらText編集やらしてもうまくいかないので注意。

**2. pip install dlib==19.4　で少し古いversionをpipする**

StackOverflowなどで解決策として提示されているが、Boostライブラリが必要といわれる。
調べるとlatestのdlibでは必要とされていないようであり、versionの指定を外せばOK
vdi仮想ディスクイメージのマウント方法

## 1. はじめに
実行には下記のパッケージを導入する必要があります
>  qemu

## 1. マウント

```

# modprobe nbd max_part=16
# qemu-nbd -c /dev/nbd0 イメージファイル.vdi
# mount /dev/nbd0p1 /mnt

```

## 1. chroot

```

# mount --bind /dev /mnt/dev
# mount --bind /proc /mnt/proc
# mount --bind /sys /mnt/sys
# chroot /mnt

```

## 1. アンマウント

```

# umount /mnt/*
# umount /mnt
# qemu-nbd -d /dev/nbd0

```
jsxにおけるhover要素の追加

https://material-ui.com/components/click-away-listener/
ここのサンプルをもとに、hover要素を追加します

```ClickAway.js
const useStyles = makeStyles(theme => ({
  fake: {
    height: theme.spacing(2),
    margin: theme.spacing(1),
    color: 'red',
    '&:hover': {
        backgroundColor: grey[200],
    }  
  },
}));
```

```react
'&:hover'{
 //something...
}
```

として追加すれば問題なく動きました!

[スクリーンショット 2019-08-13 19.38.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273734/656d5e29-8947-c811-25db-68ca6ebd6814.png)
ショートな初投稿　KubernetesにVolumeの良いresizeする方法

[k8s-blog-pv-resize]: https://kubernetes.io/blog/2018/07/12/resizing-persistent-volumes-using-kubernetes/
[^volmanage]: Volumeをリーサイズ、作成、削除することなど

こんにちは初めまして！（日本では夜ですけど…）
raehik（レイク）です。
前には投稿を書こうとしましたが、結局スケールが広すぎて諦めました。（汗）
ですから、この投稿には簡単なKubernetesのvolume managementの役立つポイントを紹介したいと思います。

日本語は母語ではないですから、意味不明部分があったら私のせいにして下さい！☺

## はじめに
Kubernetesのvolume management[^volmanage]はちょっとね。Kubernetesの他いい部分を比べたらそう思うになる。それでも、Kubernetesはずっと良くなってるの！という証拠を紹介したいと思います。（もう一年前のフィーチャーですけど…）

## 必要事
  * Kubernetes 1.11以上
  * volume expansion（Volumeのサイズを増やすこと）がサポートするprovider　AWS (EBS), GCP (Persistent Disk), Azureなど
  * 今PVCを使用している

あと、VolumeのStorageClassは`allowVolumeExpansion: true`が設定したことが必要です。volume expansionの可能providerは最初から設定したかもしれませんけど、私の場合は違うですからこれを`kubectl apply`で（AWS用）。

```yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gp2-expand
parameters:
  type: gp2
provisioner: kubernetes.io/aws-ebs
reclaimPolicy: Delete
allowVolumeExpansion: true
```

そしてこの`gp2-expand`StorageClassを使ってみて。

## 方法
  1. PVCのフィールド`spec.resources.requests.storage`を増やして
  2. VolumeをmountしているPodを削除して（そしてまた作成）
  3. PVCがサイズを増やしたことが見えるまでStep2を繰り返して

Step1をやると、PVCは`FileSystemResizePending`の様子になる。ファイルシステムのサイズを変更するにはVolumeをmountしているPodを削除することが必要です。

Volumeのサイズを増やす変更だけは可能です。

## 関連ページ
  * [2018年のKubernetesのブログ　Resizing Persistent Volumes using Kubernetes][k8s-blog-pv-resize]（英語）
JavaScriptのグラフ描画ライブラリ13個から自分に合いそうな3つを選定した

仕事でWebページにグラフの描画が必要だったので、色々とライブラリを調べてみました。

実際に試してみるライブラリを3つまで絞ってみたので、選んだもの・選ばなかったものの理由など簡単に残しておきます。(※2019/8/13現在)

ざっと調べただけなので、使った上での判断ではないです。
選んだ3つのライブラリに関しては、実際に使ってまた記事を書こうと思ってます。

# 試してみるライブラリ3つ

まず、使ってみようと思ったのは以下の3つです。

- [Chart.js](https://www.chartjs.org/)
- [D3.js](https://d3js.org/)
- [CHARTIST.JS](https://gionkunz.github.io/chartist-js/)

まず、Chart.jsとD3.jsに関しては有名なライブラリでWeb上の情報も多いのでとりあえず試してみることにしました。

Chart.jsは[日本語ドキュメント](https://misc.0o0o.org/chartjs-doc-ja/)が充実しているのと、[vue-chartjs](https://vue-chartjs.org/ja/)というVue.jsのラッパーがあるのも個人的には嬉しいポイントでした。

D3.jsは理解すればグラフやチャートだけではなく、データのビジュアライズで活用する場面が多そうです。

CHARTIST.JSはグラフ描画のライブラリの中では比較的軽量(圧縮版で40KB)というところとCSSでカスタマイズしやすそうなのが気になったので選びました。

# 使わないことにしたライブラリ

使わないと言っても、案件や仕様など状況次第で変わる可能性はあるのであくまで今回はという話です。

## 商用の場合に有料

予算の厳しい案件だったので、商用利用で有料になるものは選択肢から外しました。

- [amcharts](https://www.amcharts.com/)
- [Highcharts](https://www.highcharts.com/blog/products/highcharts/)
- [canvasJS](https://canvasjs.com/)

ただ、有料のものはやはりクオリティは高そうなので機会があれば使ってみたいです。

## D3.jsのラッパー

- [C3.js](https://c3js.org/)
- [tauCharts](https://taucharts.com/)
- [NVD3.js](http://nvd3.org/)

D3.jsのラッパーも多かったのですが、D3.jsと一緒に読み込むとファイルサイズが400KB以上になってしまうというところで候補から外しました。
あと、これらを覚えるよりかはD3.jsで頑張れば同じようなことができるかなという短絡的な考えもちょっとあります。

## ファイルサイズが大きい

- [ECharts](https://echarts.apache.org/en/index.html)(圧縮版で747KB)
- [ApexCharts.js](https://apexcharts.com/)(圧縮版で439KB)
- [plotly.js](https://plot.ly/javascript/)(圧縮版で3.2MB)

多機能なものがファイルサイズが大きくなってしまうのはしょうがないのですが、今回はそんなに多機能なものを求めていないというところもあり、ライブラリ単体で300KBを超えるようなものは選択肢から外しました。

## 学習コストが高そう  

- [Google Charts](https://developers.google.com/chart/)

Google Chartsは書き方が独特だったのでちょっと学習コスト高そうだなというところで除外しましたが、これも機会があれば触りたいです。

# 参考

[JavaScriptでグラフ描画入門！全８個のライブラリをコード付きで一挙に解説！](https://paiza.hatenablog.com/entry/2016/06/07/JavaScript%E3%81%A7%E3%82%B0%E3%83%A9%E3%83%95%E6%8F%8F%E7%94%BB%E5%85%A5%E9%96%80%EF%BC%81%E5%85%A8%EF%BC%98%E5%80%8B%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E3%82%B3%E3%83%BC)
[チャート、グラフを書くのに良さそうなJavascriptライブラリ6選](https://qiita.com/awakia/items/d064c772b759333c209a)
[【無料】チャート/グラフ作成用JavaScriptライブラリを比較！おすすめ5選](https://www.marorika.com/entry/chart-js-library)
夏休みなので小学生とPythonを勉強してみた - 課題5 サイコロの目の出る確率

小学6年生の長男が夏休みの自由研究にPythonを勉強したいというので付き合ってみました。
どこから手を付けていけばわからないので、いくつか課題を出し、それを実現するコードを一緒に書くということを繰り返しました。

この記事では、「課題5 サイコロの目の出る確率」について扱います。その他の課題については下記の記事をご覧ください。

* [夏休みなので小学生とPythonを勉強してみた - 課題1 FizzBuzz - Qiita](https://qiita.com/shakiyam/items/b8366fde704639abb63d)
* [夏休みなので小学生とPythonを勉強してみた - 課題2 掛け算九九 - Qiita](https://qiita.com/shakiyam/items/0e4153fe7c610b3e8e49)
* [夏休みなので小学生とPythonを勉強してみた - 課題3 掛け算ゲーム - Qiita](https://qiita.com/shakiyam/items/4b4df04369914df3baa6)
* [夏休みなので小学生とPythonを勉強してみた - 課題4 じゃんけん - Qiita](https://qiita.com/shakiyam/items/05c756b4726c941c1c5c)
* [夏休みなので小学生とPythonを勉強してみた - 課題5 サイコロの目の出る確率 - Qiita](https://qiita.com/shakiyam/items/9e0c5548efd0952ab250)
* [夏休みなので小学生とPythonを勉強してみた - 課題6 写真の整理 - Qiita](https://qiita.com/shakiyam/items/2dd2e2763ccf85b19126)
* [夏休みなので小学生とPythonを勉強してみた - 課題7 掛け算ゲームWeb版 - Qiita](https://qiita.com/shakiyam/items/3945a224a8774c332220)
* [夏休みなので小学生とPythonを勉強してみた - 課題8 掲示板 - Qiita](https://qiita.com/shakiyam/items/c3aa6425ff42b75d3310)
* [夏休みなので小学生とPythonを勉強してみた - 課題9 顔の検出 - Qiita](https://qiita.com/shakiyam/items/110b4819b12124587d80)
* [夏休みなので小学生とPythonを勉強してみた - 課題10 顔の認識 - Qiita](https://qiita.com/shakiyam/items/0125dd5db15976d5520e)

コードは[GitHub](https://github.com/shakiyam/python4kids)にて公開しています。

課題5-1 サイコロの目の出る確率を表示する
----------------------------------------------

### 指示 ###

コンピュータにサイコロを100回振らせて、それぞれの目が出た数を表示するプログラムを作りましょう。

### ヒント ###

複数の値をまとめるのに使われる最も汎用性が高いデータ型はリストです。リストは文字列と同様にインデックス(添字)を指定して要素にアクセスできます。

* [3.1.3. リスト型 (list) — Python チュートリアル](https://docs.python.org/ja/3/tutorial/introduction.html#lists)

### 回答例 ###

```python
import random

frequency = [0, 0, 0, 0, 0, 0]
for c in range(100):
    r = random.randrange(1, 7)
    frequency[r - 1] += 1
for i in range(1, 7):
    print(f'{ i }: { frequency[i - 1] }')
```

### 実行例 ###

```
1: 23
2: 16
3: 20
4: 14
5: 13
6: 14
```
JavaScript, Python, django, postgres 数値の扱える範囲まとめ

# 背景
クライアント側をJavaScript、サーバー側をdjangoでpostgres使ってデータの保存を行なっている時

# まとめ表
| 言語（?） | 型 | 最小値 | 最大値 |
| --- | --- | --- | --- |
| JavaScript | | -2^53 | 2^53 |
| python | float | -1.7976931348623157e+308 | 1.7976931348623157e+308 |
| django | FloatField | - | - |
| postgres | double | 整数部、小数部合わせて15桁まで | 整数部、小数部合わせて15桁まで |


| 言語（?） | 型 | 最小値 | 最大値 |
| --- | --- | --- | --- |
| JavaScript | | -2^53 | 2^53 |
| python | integer | - | - |
| django | IntegerField | -2147483648 | 2147483648 |
| postgres | integer | -2147483648 | 2147483648 |

# 参考
- http://easycoding.hatenablog.com/entry/2016/02/04/103339
    - pythonのバージョン3系ではint型がlong型と統合しており、最大値がいくらでも増加し続けられるらしい
- https://qiita.com/suin/items/dd7201053e9b227779ba
    - Javascriptの整数の精度が保たれるのは2の64乗ではなく、2の53乗までらしい。
GitBucket 4.32.0のDBをPostgreSQLに変更する

#GitBucketを外部DBで使いたい
デフォルトのH2は重要なものを入れておくにはあまりよろしくないとのことで、PostgreSQLに変更しました。

同様の記事はいくつか出てきます。
[gitbucketでH2からRDBMSに移行する](https://qiita.com/hadacchi/items/135cb25ec7627a174428) 等

4.32.0(またはそれ以前から)だと、シーケンスが増えているようで、最後のシーケンスの調整だけSQLを更新しました。

#やること
1. DBエクスポート
2. クリアインストール
3. PostgreSQLにDatabase作成
4. 設定変更
5. DBインポート
6. シーケンスの調整

#詳細
1～5は他のサイトを参照
6のみ以下で実施

```sql:sequense.sql
SELECT setval('access_token_access_token_id_seq', (select max(access_token_id) + 1 from access_token));
SELECT setval('activity_activity_id_seq', (select max(activity_id) + 1 from activity));
SELECT setval('commit_comment_comment_id_seq', (select max(comment_id) + 1 from commit_comment));
SELECT setval('commit_status_commit_status_id_seq', (select max(commit_status_id) + 1 from commit_status));
SELECT setval('label_label_id_seq', (select max(label_id) + 1 from label));
SELECT setval('milestone_milestone_id_seq', (select max(milestone_id) + 1 from milestone));
SELECT setval('issue_comment_comment_id_seq', (select max(comment_id) + 1 from issue_comment));
SELECT setval('ssh_key_ssh_key_id_seq', (select max(ssh_key_id) + 1 from ssh_key));
SELECT setval('deploy_key_deploy_key_id_seq', (select max(deploy_key_id) + 1 from deploy_key));
SELECT setval('priority_priority_id_seq', (select max(priority_id) + 1 from priority));
SELECT setval('release_asset_release_asset_id_seq', (select max(release_asset_id) + 1 from release_asset));
SELECT setval('gpg_key_key_id_seq', (select max(key_id) + 1 from gpg_key));
SELECT setval('gist_comment_comment_id_seq', (select max(comment_id) + 1 from gist_comment));
```

バージョンが上がったら、クリアインストールした際に出来たシーケンスを確認して、全シーケンスを最大値+1にしてあげればOKです。
夏休みなので小学生とPythonを勉強してみた - 課題3 掛け算ゲーム

小学6年生の長男が夏休みの自由研究にPythonを勉強したいというので付き合ってみました。
どこから手を付けていけばわからないので、いくつか課題を出し、それを実現するコードを一緒に書くということを繰り返しました。

この記事では、「課題3 掛け算ゲーム」について扱います。その他の課題については下記の記事をご覧ください。

* [夏休みなので小学生とPythonを勉強してみた - 課題1 FizzBuzz - Qiita](https://qiita.com/shakiyam/items/b8366fde704639abb63d)
* [夏休みなので小学生とPythonを勉強してみた - 課題2 掛け算九九 - Qiita](https://qiita.com/shakiyam/items/0e4153fe7c610b3e8e49)
* [夏休みなので小学生とPythonを勉強してみた - 課題4 じゃんけん - Qiita](https://qiita.com/shakiyam/items/05c756b4726c941c1c5c)
* [夏休みなので小学生とPythonを勉強してみた - 課題5 サイコロの目の出る確率 - Qiita](https://qiita.com/shakiyam/items/9e0c5548efd0952ab250)
* [夏休みなので小学生とPythonを勉強してみた - 課題6 写真の整理 - Qiita](https://qiita.com/shakiyam/items/2dd2e2763ccf85b19126)
* [夏休みなので小学生とPythonを勉強してみた - 課題7 掛け算ゲームWeb版 - Qiita](https://qiita.com/shakiyam/items/3945a224a8774c332220)
* [夏休みなので小学生とPythonを勉強してみた - 課題8 掲示板 - Qiita](https://qiita.com/shakiyam/items/c3aa6425ff42b75d3310)
* [夏休みなので小学生とPythonを勉強してみた - 課題9 顔の検出 - Qiita](https://qiita.com/shakiyam/items/110b4819b12124587d80)
* [夏休みなので小学生とPythonを勉強してみた - 課題10 顔の認識 - Qiita](https://qiita.com/shakiyam/items/0125dd5db15976d5520e)

コードは[GitHub](https://github.com/shakiyam/python4kids)にて公開しています。

課題3-1 1から9の範囲でランダムに選ばれた数を表示する
----------------------------------------------------

### 指示 ###

1から9の範囲でランダムに選ばれた数を表示するプログラムを作りましょう。

### ヒント ###

組み込み関数では提供されていない機能を使いたい場合には、その機能を提供するモジュールをimport文で取り込みます。

* [6. モジュール (module) — Python チュートリアル](https://docs.python.org/ja/3/tutorial/modules.html)

整数の擬似乱数を生成するには、randomモジュールのrandrange関数を使います。

* [random — 擬似乱数を生成する — Python 標準ライブラリ](https://docs.python.org/ja/3/library/random.html#functions-for-integers)

### 回答例 ###

```python
import random

print(random.randrange(1, 10))
```

課題3-2 ランダムに選んだ掛け算を表示する
----------------------------------------

### 指示 ###

1から9の範囲でランダムに選ばれた数を2つ用意し、それらを掛け算した結果を表示するプログラムを作りましょう。

### 回答例 ###

```python
import random

a = random.randrange(1, 10)
b = random.randrange(1, 10)
print(f'{a} * {b} = {a * b}')
```

課題3-2 ランダムに選んだ掛け算を問題として出し、結果を判定する
--------------------------------------------------------------

### 指示 ###

1から9の範囲でランダムに選ばれた数を使った掛け算をユーザーに問題として出し、ユーザーが入力した結果の判定結果を表示するプログラムを作りましょう。

### ヒント ###

ユーザーからの入力はinput関数で受け取ります。

* [組み込み関数 input — Python 標準ライブラリ](https://docs.python.org/ja/3/library/functions.html#input)

input関数の出力は文字列なので、int関数で整数に変換します。

* [組み込み関数 int — Python 標準ライブラリ](https://docs.python.org/ja/3/library/functions.html#int)

### 回答例 ###

```python
import random

a = random.randrange(1, 10)
b = random.randrange(1, 10)
c = int(input(f'{a} * {b} = '))
if c == a * b:
    print('Good job!')
else:
    print('Oops!')
```

### 実行例 ###

```
2 * 2 = 4
Good job!
```

```
1 * 6 = 7
Oops!
```
material-UI Grid itemの中央寄せ


##解決策
```js
//grid　の親コンポーネント
<Grid container alignItems="center" justify="center">
  <Grid item xs={8}>
    <Tweet />
  </Grid>   
</Grid>
```

alignItemsとjustifyを指定すればそれだけで中央寄せが可能でした。


##冗長なやり方
今までこんな風にめちゃめちゃ冗長にやってたなぁ...

```js
//grid　の親コンポーネント
<Grid container alignItems="center" justify="center">
  <Grid item xs={0} md={2}></Grid>
  <Grid item xs={12} md={8}>
    <Tweet />
  </Grid>
  <Grid item xs={0} md={2}></Grid>
</Grid>
```