OmniAICreator/Qiita-1.07M huggingface dataset:
機械学習の基礎（備忘録）

# 人工知能の種類
人工知能(AI)をどう定義するかによるが、「AIにできること、できないこと」[^1]によれば、

>「コンピュータに知的な作業を行わせる技術」

ということらしいです。コンピュータはそれだけでは計算機としての役割しかありませんが、知的な作業というのは計算だけではできません。今日では、弱いAI（ある特定の作業が得意な人工知能）しかできておらず、研究の中心も弱いAIです。しかしながら、AlphaGoや東大ロボに見られるように、人間の能力を上回るAIも出始めており、不完全ながらも人々を魅了しています。また、広告や政治活動などもAIが台頭してきており、フェイク動画や個人に沿った広告の表示など、日常生活でも避けて通ることができなくなりつつあります。
もし、強いAIが完成したなら、コンピュータが自我を持って言葉を発したり、表現したり、様々なことがひとりでにできるようになると、それはもはやシンギュラリティーを克服し、ゲーム「Detroit: Become Human」や映画「I, Robot」のようにAIが人間の意図を無視したり暴走したりして人間を襲うことが現実になるかもしれません（極端ですが）。
2045年問題とも言われています。
現状では、AIはただのアルゴリズムなので、そういう意味ではシンギュラリティーを超えることはまずないのではないかと思います。

話が脱線しましたが、人工知能には大きく分けて次の4種類があります。

* 教師あり学習（分類モデル、回帰モデル）
* 教師なし学習（クラスタリング、主成分分析）
* 強化学習（報酬を与えて、それを最大化するような行動を学習させる）
* それ以外（ルールベース）

上3つをまとめて__機械学習__と呼びます。
機械学習は簡単に言えば、条件分岐も自動的に学習してくれるアルゴリズムです。
予測モデルを人間が作るのではなく、自動的に生成してくれます。
それでも、特定のパラメータの値は人間が決めなくてはいけません。そのようなパラメータを__ハイパーパラメータ__と呼びます。
また、機械学習の部分集合として、__深層学習（ディープラーニング）__というものがあります。

世間的には「AI=ディープラーニング」と受け止められていますが、決してAIはディープラーニングだけではありません。
注目されている理由は、ディープラーニングが神経細胞ニューロンを模したものであり、人間の脳の構造により近いからです。
ただ、物体や文字を認識するにも、人間による認識とコンピュータによる認識とでは大きく違います。
そういう意味では、まだまだ人間の脳を構成するのは無理でしょう。

ちなみに、AlphaGoではディープラーニングと強化学習を組み合わせた__深層強化学習__が使われています。

それでは、機械学習のそれぞれについて、いくつか手法をざっくり紹介します。

# 教師あり学習

教師あり学習とは、教師データ（入力データ＋正解ラベル）を元にモデルを学習し、未知のデータに対して予測や分類をする技術のことです。
例えていうと、教師が生徒に例題の解法を教えて、次いでその解法を学習した生徒が練習問題を解く、というイメージでしょうか。
目標はその生徒の正解率をあげることです。
しかしながら、教え込みすぎると、変な癖がついたり自分で考えることをしなくなり、結果的に以前解けたような簡単な問題でもできなくなってしまいます。
その状態を__過学習（overfitting）__といいます。
過学習は、いわば訓練データに適合しすぎている状態です。
つまり、教えた通りにしか生徒が解けず、ちょっと問題文の言い回しや数値を変えただけで途端に解けなくなってしまうというイメージです。
したがって、過学習を起こさないようにパラメータを調整しながら、できる限り誤差が小さくなるようなモデルを作らなければなりません。
教師あり学習には、回帰と分類問題の2種類があります。
まずは回帰について見ていきましょう。

（教師あり学習の概要に続く...）

[^1]: 藤本浩司・柴原一友『AIにできること、できないこと』日本評論社、2019年
python Pyinstaller exeによる 自動アップデート方法

## やりたい事
- アプリを開いたら、アップデートがあるか確認する
- アップデートがあれば、自動でアップーデートを開始する
- アプリを再起動する

それでは、いってみよう！

## アプリを開いたら、アップデートがあるか確認する 

```
hogehoge.spec

・・略
exe = EXE(pyz,
          Tree('version',prefix='version'), # 追加
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='hogehoge_mac',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )
```
versionを追加して、exeを作っておく事。
versionディレクトリの下に、system.jsonをおく

```
system.json
[
  {
    "version": "1.9"
  }
]
```

```
# バージョンチェック
　　if common.system["version"] != str(common.information[0].system_version):

```
作っておいたバージョンとデータベースのバージョンを比較する
jsonの読み込みやデータベースからの取得は割愛ね。


## アップデートがあれば、自動でアップーデートを開始する
```
            # ダウンロード
            file_size = 50029115
            res = requests.get(self.url, stream=True)
            pbar = tqdm(total=file_size, unit="B", unit_scale=True)
            with open(self.save_name, 'wb') as file:
                for chunk in res.iter_content(chunk_size=1024):
                    file.write(chunk)
                    pbar.update(len(chunk))
                pbar.close()
```
自動アップデート、tqdmでダウンロードすると、見た目が良い感じです。
ポイントは、save_nameをexeとは違う名前で保存します。

## アプリを再起動する
```
            # バッチ実行
            command = "rename.cmd " + self.save_name + " " + self.rename_name + " " + self.delete_name
            subprocess.Popen(command.split())
```
ダウンロードが終わったら、バッチをキックして、バッチの中で、ファイルの削除とリネームとアプリ起動を行う。

```
# rename.cmd
taskkill /im %2 /F
timeout 2
del /f %3
timeout 2
rename %1 %2
%3
```
動いてたプロセスを念のため切ります。
アップデート前のファイルを削除します。
アップデート後のファイルをリネームします。
再起動します。

## まとめ
- 今のバージョンをjsonで持っておく
- 最新バージョンをデータベースに持っておく
- pythonでダウンロードする
- バッチでリネームする

python内では、今動いるアプリの名前を変えることは出来ないので、バッチをキックする必要がある。
素人Python日記④ ～Djangoガールズのチュートリアルをもっかいやる（6日ぶり3日目）

# この投稿の目的
日記みたいなものです。
新型コロナウイルス対応として「自宅待機」中。時間の有効活用のためちょっとずつお勉強中です。
先週1週間は「自宅待機」は無く通常出勤だったので、その間全く進みはありません（帰宅後やれよって話ですが）。
せっかくDjangoガールズのチュートリアルを終えましたが、1週間もたつともうさっぱりです。

ということで、前回までの復習がてら、Djangoガールズのチュートリアルをもう1周します。
といっても、もともと反復してやろうと思っていました。
合うとか合わないとか、わかりやすいとかそうでないとか、それすらわからない状態のときは、とにかく何度もやるしかないのです。


# Djangoガールズ3日目・やったこととわかったことなど

## やったこと
 -  Djangoガールズチュートリアルを最初から最後まで（とはいえインストールとかないので楽。またコマンドラインの説明やfor文とは？みたいなものは省略。
 -  仮想環境の再構築から中身の作り込みまで
 -  大体4～5時間くらい。

## ちょっと理解がすすんだこと
 - インターネットの仕組みの中で、このチュートリアルが何をしようとしているか（前回は、サーバを立ててWEBサイトの中身をぶちこんでいるという当たり前のことがあやふやなまま進んでしまった）
 - リストとディクショナリの違い（配列とキー付き配列）
 - ディクショナリの中にリストも持てる
 - 仮想環境はプロジェクト単位（べんり）
 - 仮想環境の設定～プロジェクトの作成
 - オブジェクト＝プロパティとメソッド
 - モデルの名称は大文字
 - URLとViewとTemplateは3点セット

### 仮想環境の設定～プロジェクトの作成
プロジェクト単位で必要なことなので、これは今後何回も使うことになる（はず）。ので、手順を覚えておく。
 1. 仮想環境のディレクトリをつくる
    ・コマンドプロンプト : mkdir hoge
 2. 仮想環境構築
    ・cd hoge
    ・python -m venv huga
 3. 仮想環境起動
    ・huga\Scripts\activate
    （Scriptsフォルダのactivateファイルを実行）
 4. Djangoインストール
    ・hoge直下に「requirements.txt」作成
    ・中身はDjangoのバージョン「Django~=2.2.4」1行記載
    ・コマンドプロンプト：pip install -r requirements.txt
    （pip（DjangoのDLソフト）実行）
 5. プロジェクト作成
    ・django-admin startproject mogu .
    （huge/manage.pyとか、mogu/urls.py, settings.pyとかができる）
 6. settings.pyで設定変更
    ・LANGUAGE_CODE = 'ja'
    ・TIME_ZONE = 'Asia/Tokyo'
    ・末尾のSTATIC_URL = '/static/'　の下に以下追記
    　→ STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    ・ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com']
    　※ ホストによって異なる
 7. データベースセットアップ
    ・コマンドプロンプト：python manage.py migrate
    　※ デフォルトはSQLite3（settings.pyに記載あり）
 8. サーバ起動
    ・python manage.py runserver
    　→ http://127.0.0.1:8000/

⇒3.と8.は初回以外も毎回必要。



 
## やっぱりわかってないこと
 - なんで「python manage.py startapp blog」でblogフォルダの下にたくさんモノができるのか？（中のファイルをひとつづつ見ると、コードはシンプル⇔from django.XXX⇒なんか取得してる？/Settingsの中でinstalled_appsを列挙していることと関係？これがDjangoの機能？ほかにはどんなものがある？）
 - urlpatternの中の意味（チュートリアルで、「ここでinclude関数を使いたいので、」とか言われても。こっちは使いたいと思ってないんじゃ！）
 - path('', include('blog.urls')で、なんでblog.urlsに全部リダイレクトするのか。blog.urlsとはそもそも何か（blogフォルダのurls.py？）
 - path('', views.post_list, name='post_list')で、「見てのとおり、post_list という名前のビュー をルートURLに割り当てています」って…見てもわからないよ！…あっでもここまで言語化してみたらわかってきたかも…すごい…
 - render(request, 'blog/post_list.html', {})の、1個目と3個目の引数なに
 -

# チュートリアル（2回目）を終えて

まだわからないことは多いですが、全体的な流れと、どのファイルが何をやっているのかということが、ちょっとだけ掴めた気がします。少しだけ次に進んでも大丈夫な予感。
CSSの装飾なんてものは後回しで、とりあえず動くものをつくりたい。


---
＜次の一歩＞
[素人Python日記⑤ ～参考書を手に取ってみる](https://qiita.com/wahahahagi/items/dbbda23a151303b9395a)

＜牛歩的経緯：自宅環境構築＞
[自宅待機を有効活用する① ～思い立ちからゴール設定まで](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)
AWS DevOps Engineer Professional受験記

#はじめに
AWS DevOps Engineer Professionalに合格したので、受験時の学習内容を記載したいと思います。
なお、試験スコアは、890/1000 でした。

# 試験範囲の確認
まずは、公式サイトで[試験範囲](https://aws.amazon.com/jp/certification/certified-devops-engineer-professional/)を確認します。

- 分野 1: SDLC の自動化 22%
- 分野 2: 構成管理および Infrastructure as Code 19%
- 分野 3: 監視およびロギング 15%
- 分野 4: ポリシーと標準の自動化 10%
- 分野 5: インシデントおよびイベントへの対応 18%
- 分野 6: 高可用性、フォールトトレランス、およびディザスタリカバリ 16%

ただ上記を見ても何を学習すべきが、どんなサービスに関して出題されるかはよく分かりません。

# AWS公式のEラーニング
そこでオススメするのが、AWS公式のEラーニング [Exam Readiness: AWS Certified DevOps Engineer – Professional (Japanese)](https://www.aws.training/Details/eLearning?id=40664)です。

試験範囲ごとに出題されるサービスの簡単な説明とサンプル問題が含まれていません。
学習対象のサービスを把握するのに最適なコンテンツです。
オリジナルのコンテンツは英語ですが、日本語訳もあり、スライドも日本語版されています。

# Udemy AWS Certified DevOps Engineer Professional 2020 - Hands On!
次に各サービスを深掘りするために、Udemyの本試験用の[学習コンテンツ](https://www.udemy.com/course/aws-certified-devops-engineer-professional-hands-on/)を利用しました。
試験出題対象のサービスの解説 + 動画形式のハンズオンになっています。

試験範囲のサービスを全て利用するのがベストですが、そんな時間はなかなか確保できないので、ハンズオンの動画を見て、やったつもりになろう作戦です。

試験範囲のサービスが網羅されているようでオススメです。
ただし字幕は自動生成なので、AWS用語は正しく表示されないことに注意してください。

また、このコースを毎年アップデートされ、別コンテンツとなるようです。
本記事のリンク先は2020年版なのでご注意ください。

# AWS サービス別資料 & ホワイトペーパー

上記のUdemyコースでいまいち理解が進まない場合は、[サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)を利用しました。

ホワイトペーパーは試験ガイドに記載があるものは、サッと目を通しました。
中でも、「Blue/Green Deployments on AWS」は、ほぼ間違いなくここから出題されると思うので目を通しておきましょう。

ガイドに記載があるホワイトペーパーは９個ほどありますが、(2020年4月時点で)日本語訳があるのは[「Microservices on AWS」](https://d1.awsstatic.com/International/ja_JP/Whitepapers/MicroservicesOnAWS-V2_NT0829_SMO_MJ_EditSM_ProofSM_ProofNT.pdf)だけのようです。

# Udemy問題集 AWS Certified DevOps Engineer Professional Practice Exams
試験対策として、擬似問題を解くことは必須です。
この[コース](https://www.udemy.com/course/aws-certified-devops-engineer-professional-practice-exams-amazon/)は、本試験に近い問題もあり、かなりオススメです。
また、解説も丁寧です。

問題数は、75問 x 2となっています。
２週ぐらいして90%ぐらい取れたら合格は近いと思います。
AtCoder_ABC

# AtCoderのコンテストのときの回答検証
ABCのコンテストしか現状参加していない(現状参加回数３回で灰色コーダー)
### 162_A
input()が使えるかどうかの問題!!n.count('7')を忘れていたから愚直に分割した。

``` python:ABC_162_A.py 
n = input()
if n[0] == '7' or n[1] == '7' or n[2] == '7':
    print('Yes')
else:
    print('No')
```
``` python:ABC_162_A.py 
n = input()
n = n.count('7')
if n >= 1:
    print('Yes')
else:
    print('No')
```
### 162_B
FizzとBuzzとFizzBuzzの和を求め,Nまでの総和を求め最後に引く

``` python:ABC_162_B.py 
n = int(input())
s3 = 0
s5 = 0
s15 = 0
count = 0
for i in range(int(n / 3)):
    s3 += (i+1) * 3
for i in range(int(n / 5)):
    s5 += (i + 1) * 5
for i in range(int(n / 15)):
    s15 += (i + 1) * 15
for i in range(n):
    count += (i+1)
print(count-s3-s5+s15)
```
普通に等比数列(Fizz,Buzz,FizzBuzz)のため$\frac{1}{2}k\(a_1+a_k\)(kはN以下の項数)$のほうが早いよね

``` python:ABC_162_B.py 
n = int(input())
Sum = 0.5 * n * (1 + n)
# n < 3やn < 5のときでもint(n/3) = int(n/5) = 0のため問題なし
Sum3_5 = 0.5*(int(n/3)*(3+3*int(n/3))+int(n/5)*(5 + 5*int(n/5)))
Sum15 = 0.5 * (int(n / 15) * (15 + int(n / 15) * 15))
# 問題の回答が整数値のため
print(int(Sum-Sum3_5+Sum15))
```
### 162_C
全探索じゃ解けないと考え(a,b,c)の組を考えて解く。(pypyなら全探索でもTLEではなかった)
#### pattern1
a,b,cが全て一致(a==b==c):gcd(a,b,c) = a
#### pattern2
a,b,cが2数が一致(a==b!=c):gcd(a,b,c) = gcd(a,c)
3箇所から１つ選ぶため${}_3C_1$のため３倍
#### pattern3
a,b,cが全て一致せず(a!=b!=c):gcd(a,b,c) 
a,b,cの並び替えが存在するため６倍
next_permutation的なのがあったほうが最後は早いはず

``` python:ABC_162_C.py 
import math
k = int(input())
wa = 0
for a in range(k):
    wa += (a + 1)
for a in range(k):
    for b in range(k):
        if a != b:
            wa += 3 * math.gcd(a + 1, b + 1)
 
for a in range(k):
    for b in range(a):
        for c in range(b):
            wa += 6*math.gcd(math.gcd(a+1, b+1), c+1)
print(wa)
```
三項演算子の優先順位

三項演算子の使い方でミスしたので記録しておきます.

## 三項演算子とは
```c++:
a ? b : c
```
とすると, aがTrueのときb,Falseのときcになる演算子です.
例えば

```c++:
std::cout << (true ? 1 : 0) << std::endl;
```
とかでは1が出力されます.

## 優先順位
C++での三項演算子の優先順位はかなり低いです.
私はこんなミスをしました(本当は違いますがこんな感じのやつです).

```c++:
int x = 100 - (a == 1) ? 1 : 0;
```
a=1のとき1を引いてくれることを期待したのですが結果はx=1となりました.
これは三項演算子の条件部が(a == 1)ではなく100-(a == 1)になっていたことが原因です.

この場合書き方として

```c++:
int x = 100 - (a == 1 ? 1 : 0);
```
や

```c++:
int x = 100 + (a == 1 ? -1 : 0);
```
の方がいいのかなと思いました.

## まとめ
三項演算子は括弧でくくろう.
【SQL】関数

この資料は弊社後輩に説明するために扱った＆口頭説明の補助的資料です。
せっかく纏めたので記念に残しておくかだけのものです、悪しからず。

---

# 先週の復習
使用するテーブル : SQLZoo の world
カラム：名前(name), 大陸(continent), 人口(population), 面積(area), 国内総生産(gdp)

Q1. 面積が 3000000 平方キロ以上　または　人口が 250000000 以上の国名、人口、面積を表示する。

Q2. 南アメリカ大陸にある国の国名と 人口(100万人単位/0が6個) と GDP(10億ドル単位/0が9個) を小数点以下２桁に丸めて表示する。

---

# 先週の復習
使用するテーブル : SQLZoo の world
カラム：名前(name), 大陸(continent), 人口(population), 面積(area), 国内総生産(gdp)

Q1. 面積が 3000000 平方キロ以上　または　人口が 250000000 以上の国名、人口、面積を表示する。

```sql
SELECT name , population , area
FROM world
WHERE population >= 250000000 OR area >= 3000000
```

Q2. 南アメリカ大陸にある国の国名と 人口(100万人単位/0が6個) と GDP(10億ドル単位/0が9個) を小数点以下２桁に丸めて表示する。

```sql
SELECT name, ROUND(population/1000000, 2), ROUND(gdp/1000000000, 2)
FROM world
WHERE continent = 'South America'
```

---

# 関数 - LENGTH
文字列の文字数を求めてくれる関数。
使用する DBMS によって `LEN` だったり `CHAR_LENGTH` だったり違うので注意。
今回は `LENGTH` で OK！

```sql
SELECT name, LENGTH(name)
FROM world
WHERE LENGTH(name) > 20
```

---

# 関数 - LEFT / RIGHT
文字列を左(または右)から n 文字切り取る関数。
`LEFT([対象文字列], [切り取る文字数])` のように使う。
使用する DBMS によって `SUBSTR`だったり `SUBSTRING` だったり違うので注意。
今回は `LEFT / RIGHT` で OK！

```sql
SELECT name, LEFT(capital, 3)
FROM world
WHERE LEFT(name, 1) = 'A'
```

---

# 関数 - SUM
列の値を合計してくれる関数。

```sql
SELECT SUM(population), SUM(gdp)
FROM world
WHERE continent = 'Europe'
```

---

# 関数 - COUNT
レコード件数を取って来てくれる関数。

```sql
SELECT COUNT(*)
FROM world
WHERE LEFT(name, 1) = 'A'
```
NuGet の Source Link で新しいバージョンのソースが見れない問題とその解決

# 問題
NuGetのライブラリに変更を加えて、バージョンを上げて、Packしたものを、LocalNuGetに上げて、`~/.nuget`配下のキャッシュを消したのち、そのライブラリをテストするための簡単なサンプルを動かしてみたら、期待通りに動かない。そこで、`Go to Definition` でソースコードを見ると、更新したはずの、ソースコードが古いままだった。もちろん、VSの再起動とか、クリーンも実施したが同じだった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/c265441a-2e90-32f2-578f-15d0e0da9453.png)

なんでやねん！ということで、`csproj`を再確認して、Packagesを参照するとちゃんと想定のバージョンになっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/c8035db1-0cfe-1bce-75c1-836021d984a7.png)

## 発生した現象

残念ながら、解決策ではないのだが、この問題は、どうやら Gitに関係していると思われる。上記の環境は、あるリポジトリのForkリポジトリで、自分のクライアントに Clone している。私は大きい Pull Request が嫌いなので、パッケージの変更のPullRequestと、それを使った新しいサンプルで別のBranchを切って作業していた。

つまり、ワークフローとしては

1. ブランチAで、NuGetのリポジトリを変更、`pack` で NuGet パッケージを作成、それを`LocalNuGet` に格納する
2. ブランチをAからBに切り替える
3. `.nuget`のキャッシュを削除する
3. 先ほど作ったNuGetパッケージを使うためのサンプルがあるので、そこで、新しく作ったバージョンのNuGetを取り込む。
4. サンプルの中でNuGetの中身のクラスに対して、`Go To Definition`を実施している。

ところか、こうすると折角ブランチAでいれた変更がなされてないように見える。これには相当はまった。

## ワークアラウンド

解決したわけではないのだが、ワークアラウンドとしては、サンプルを同じリポジトリには、置かず、まったく別のローカルPCの場所に作り、リポジトリのブランチはAのままにしておくと、NuGetパッケージが全く同じなのに新しいソースを見ることができた。そこで、これは、ビルドやPackの問題ではなく、きっと、[Source Link](https://docs.microsoft.com/en-us/dotnet/standard/library-guidance/sourcelink)の振る舞いの問題ではないか？と推察した。

## NuGet Package エクスプローラーで中身を見てみる。

[NuGet Package Explorer](https://github.com/NuGetPackageExplorer/NuGetPackageExplorer) というツールがあるっぽく、packによってできたものの中味を閲覧できる。**Repository:** で指定されている箇所が、SourceLinkの見に行くリポジトリであると、下記のドキュメントには記述してあった。ここでは特にSourceLinkを明確に設定していない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/87b4a784-a330-9c75-0ba0-e85d3d12e400.png)

ちなみに、画面にある、**Health:** のところに、`Source Link:` があるが、`Contains untracked sources`があり、オーバーレイすると、 明らかにNuGetパッケージは、どこでビルドされたのかの情報を持ってそうだ。明確なメタデータの値としてはなさそうだった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/ac1de38f-a074-a456-e925-83c01db05ee5.png)

## 考察

このNuGetの定義を見る限り、**Repository:** のところにコミットを持っているので、これをある特定の優先順位でいろいろなところを見に行くようになっているのでは？と推察している。例えば、最初にURLを見に行って同じコミットを探して、なければローカルのビルドされたソースの位置にあるコミットを探して、、、といった具合だ。それに従えば、最初の振る舞いは妥当に感じる。ただし、これは、自分が妄想しているだけなので、確実に挙動を理解するために、Source Link の Issue として質問しておいた。

* [Question: Priority of searching source #603](https://github.com/dotnet/sourcelink/issues/603)

# まとめ

NuGet Package Explorer いい感じ！ちなみに、NuGet Package Explorer からキャッシュが消せそうな雰囲気である。Dependencyとかもざっと見れて、かなりいい感じ！今回みたいにはまったときにはいい感じかも。

# リソース

* [Source Link](https://docs.microsoft.com/en-us/dotnet/standard/library-guidance/sourcelink)
* [NuGet Package Explorer](https://github.com/NuGetPackageExplorer/NuGetPackageExplorer)
木構造　用語

#木構造
木構造とは、階層的な構造を表すのに適したデータ構造です。ソフトウェア開発ではドキュメント、組織図、グラフィックスなど階層構造を抽象化する方法として活用されます。

また、木構造は、効率的なアルゴリズムとデータ構造を実装するための基礎構造で、情報処理とプログラミングには欠かせない概念となります。標準ライブラリとして提供されている多くのアルゴリズムやデータ構造が木構造に関連しています。

##根付き木
木構造とは節点（node)と節点同士を結ぶ辺(edge)で表されるデータ構造です。

根付き木の節点には親子関係があります。根付き木Tの根rから節点xに至る経路上の最後の辺が節点pと節点xを繋ぐとき、 p を x の親(parent)、xをpの子(child)と呼びます。

根は親を持たない唯一の節点です。子を持たない節点は外部節点(external node)または葉(leaf)と呼ばれます葉でない節点を内部節点(internal node)と呼びます。

根付きの木Tの節点xの子の数をxの次数(degree)と呼びます。 

根rから節点x までの距離の長さをxの深さ(depth)と呼びます。また、節点xから葉までの経路の長さの最大値を設定xの高さ(height)と呼びます。根の高さが最も高くなり、それを木の高さと呼びます。

###用語
- node 節点
- edge 辺
- parent 親
- child　子
- leaf (external node)　葉(外部節点)
- internal node 内部節点
- degree　任意の節点の子の数、次数（孫は数えない）
- depth　根から任意の節点までの経路の長さ、深さ
- height　任意の節点から葉までの経路の長さの最大値、高さ


##二分木
一つの根を持ち、すべての節点についてその子の数が2以下である木を根付き2分木と言います。

二分木では節点が持つ子の数が2以下となりますが、左の子と右の子は区別されます。つまり、子が一つの場合それが左の子なのか、右の子なのかが厳密に区別されます。


##参考
[プログラミングコンテスト攻略のためのアルゴリズムとデータ構造 | 渡部 有隆, Ozy（協力）, 秋葉 拓哉（協力）](https://amzn.to/2XCxVo5)
Amplify+GraphQL+DynamoDBでのデータソート

#はじめに
React(typescript)でAWSのAmplifyとGraphQLを用いてDynamoDBにあるデータをソート(今回は作成日順に)して一覧表示する時に詰まったのでメモ程度に残しておきます。どうやらElasticSeacrhなるものがあるらしい。誰かの役にたちますように。

[Amplify公式リファレンス](https://aws-amplify.github.io/docs/cli-toolchain/graphql#searchable)

#スキーマにsearchableを追加
```graphql:schema.graphql
type Message @model
@searchable #←これを追加
{
  id: ID!
  username: String!
  content: String!
  updatedAt: AWSDateTime
  createdAt: AWSDateTime!
}

```

編集を保存したら



```
$amplify push
```
で編集内容をpushしましょう。
ElasticSearchが生成されます。
それでは、queriesを確認してみましょう。

```graphql:queries.ts
#--略---
export const searchMessages = /* GraphQL */ `
  query SearchMessages(
    $filter: SearchableMessageFilterInput
    $sort: SearchableMessageSortInput
    $limit: Int
    $nextToken: String
  ) {
    searchMessages(
      filter: $filter
      sort: $sort
      limit: $limit
      nextToken: $nextToken
    ) {
      items {
        id
        username
        content
        updatedAt
        createdAt
      }
      nextToken
      total
    }
  }
`;
```
先ほどのpushが反映されて、新しくsearchMessagesが作成されていますね！

あとは好きなところでqueryを叩きましょう。今回はApp.tsx内で書いています

```typescript:App.tsx
import React,{useEffect,useState} from 'react';
import { API, graphqlOperation } from "aws-amplify";
import { searchMessages} from './graphql/queries';



const App:React.FC=()=> {

const querySort = Object.assign({},{
    sort : { 
        field: 'createdAt',//作成日指定
        direction: 'asc'//早い順
    },
    limit : 100 //デフォルトだと10個までしかとれない
  })

useEffect(() => {
  (async ()=> {
    try {
      let results = await API.graphql(graphqlOperation(searchMessages,querySort));
      console.log(results);//ここで内容を出力
     
   } catch (e) {
      console.log(e)//エラー処理
    }
 })();
},[]);

...
}
return(
 <>
 ...
 </>
)

```

コンソールでobjectを確認すると、データが作成日によって並び替えられています！
大分色々省きましたが、参考になったら嬉しいです

#参考記事
[Amplify公式リファレンス](https://aws-amplify.github.io/docs/cli-toolchain/graphql#searchable)
Mac + fish + pyenv + VSCode（2020年4月）


タイトルの組み合わせでローカル開発環境を構築するときに、いい感じの情報が出てこなかったのでメモしておく。


## 環境
* Mac 10.14.6
* fish, version 3.0.2

fish（シェル）はすでに使っている前提。

## ゴール
VSCodeで開発中のプロジェクトでPython3.8を使えるようにする。


## 手順
### Homebrewインストール
割愛

### pyenvインストール

Homebrew経由で行う。

```
brew install pyenv
```

### シェルの設定

下記のファイルを新規作成。

```~/.config/fish/conf.d/pyenv.fish
pyenv init - | source
```

公式ドキュメントにある通りの設定。
psubコマンドを使った設定を入れている情報がネット上に多いが、それらは昔の設定かも。

### Python3.8をインストール、仮想環境作成（venv）

```
$ pyenv install 3.8.2

# インストールしたPythonを使用するプロジェクトのルートディレクトリで実行する
$ pyenv local 3.8.2

# .python-versionというファイルができているはず
$ ls .python-version
.python-version

# Pythonのバージョンを確認
$ python --version
Python 3.8.2 

# 仮想環境の作成
python -m venv venv
```

### vscode
このプロジェクト（ディレクトリ）を開くと、仮想環境（venv配下にあるpython）が勝手に認識された。



## 参考リンク

* pyenvのインストール方法
    * https://github.com/pyenv/pyenv#installation
教師あり学習とは？ おおまかな流れと種類ごとの使い道の具体例まとめ

機械学習は「教師あり学習」と「教師なし学習」に大別されます。
この記事では、これから機械学習の勉強を始めたい人向けに、「教師あり学習」について基本的な説明を行います。

####この記事の内容
- 教師あり学習とは
- 教師あり学習のおおまかな流れ
- 教師あり学習の種類と使い道


## 教師あり学習とは

**教師あり学習とは、「コンピュータに予め正解を教える」機械学習の手法です。**

例えば、顔の画像によって男女を区別するプログラムを考えてみましょう。
このようなプログラムを作成する場合、まずは大量の男女の写真をコンピュータにインプットさせます。「この顔は男性！」「この顔は女性！」といった具合です。

このように「予め正解を教える」ことによって、コンピュータは「彫りが深い系の顔は男性なんやな」とか「髪が長いのは女性なんやな」って感じで、知識を蓄えていきます。


その結果、新しい人の写真を与えると、「教えた正解に基づいて」男性か女性かを判定してくれるようになるわけです。



## 教師あり学習のおおまかな流れ
### 0. データの収集
教師あり学習を行うには、「正解」として与えるための大量のデータを収集する必要があります。
「何を明らかにしたいのか」を明確にし、その目的にあったデータを入手します。
今回の場合、数万枚の男女の顔写真を用意するところからスタートです。

### 1. 目的変数と説明変数を設定する
予測したい情報のことを**目的変数**といいます。
一方、予測に使う情報のことを**説明変数**といいます。

先ほどの例だと、「男性か女性か」という結果が目的変数にあたります。顔写真のデータが説明変数、「男性か女性か」という結果が目的変数にあたります。説明変数と目的変数の設定を適切に行わないと、学習を行っても効果を得られないので要注意です。

### 2. 学習に使うアルゴリズムを選ぶ
どのような計算方法によって「説明変数→目的変数」を導くかという仕組みを**学習アルゴリズム**といいます。用いるデータの特徴や用途によって、適したものを選ぶ必要があります。

学習アルゴリズムについて全て触れることは省略しますが、この記事にまとめられてます。
https://qiita.com/t-yotsu/items/1a6bf3a4f3242eae7857

### 3. 訓練データを与える
アルゴリズムを決めたら、**正解付きのデータ**を与えて、パターンを学習させます。
これを**訓練データ**といいます。
訓練データは時に数万個に上りますが、数よりも質が重要です。
質の悪い訓練データを与えると、判定基準が曖昧になってしまったり(**学習不足**)、逆に厳格になりすぎてしまったりする(**過学習**)ので注意が必要です。

### 4. テストデータで結果をみる
訓練データによる学習が終わったら、正しく学習が行われたかを検証します。
**テストデータ**を作成したプログラムに判定させ、**正解率**などを算出することによって、性能の評価を行います。
この時、訓練データとテストデータは事前に分けておき、異なるものを使う必要があります。

先ほどの例だと、訓練データで与えたものとは別の男性と女性の写真を使って判定を行い、正しく評価できた割合を調べることになります。




## 教師あり学習の種類
教師あり学習は、主に二種類の用途によって使われます。

### 分類問題
与えたデータをいくつかの種類のラベルに分類する場合には、教師あり学習が使われることが多いです。
冒頭で紹介した男女の画像判別の例もこちらの分類問題にあたります。

例)
- 画像データを「犬」と「猫」に分類する
- 手書きの数字を判読する
- 似ている芸能人


【訓練データ】ラベル付き訓練データ
【目的変数】分類ラベル(「犬」と「猫」など)


### 回帰問題
実験データや測定データなどの過去に起こったデータを学習させ、数値データを予測するものを**回帰問題**とよびます。回帰問題でも教師あり学習が使われることが多いです。

例)
- 日照量から農作物の収穫量を推定する
- 株価の変動から毎日の終値を予想する
- 買い物パターンからその人の貯金額を推定する

【訓練データ】結果となる数値付きの実測データ
【目的変数】数値

## まとめ
- 「教師あり学習」はあらかじめ訓練データを与える学習方法
- 訓練データとは異なる「テストデータ」を用いて性能を評価する
- 目的変数が「分類ラベル」の分類問題と、「数値」の回帰問題に分かれる
laravel5.7 , vue.js を 使うまで

# 最新の node.js をインストール



この 12.x を 13 とかに変更すればさらに13とかもインストールできそう。


```

curl -sL https://rpm.nodesource.com/setup_12.x | bash -


```

なんかコマンド打ってよ？
的なことが表示されるので


```

sudo yum install gcc-c++ make
curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo

sudo yum install yarn
sudo yum install nodejs -y


```

選択肢はすべてy

```

node -v
//v12.16.2

```




#npm インストール

```

sudo npm update -g npm
npm -v
//6.14.4

```


```

npm install
npm run dev
npm install vue-template-compiler --save-dev --production=false
npm run watch

```






vue.blade.php を 作成。

```resources/views/vue.blade.php

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="csrf-token" content="{{ csrf_token() }}">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Laravel</title>
        <link rel="stylesheet" href="{{ mix('/css/app.css') }}">
        <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">
        <style>
        </style>
    </head>
    <body>
    <div id="app">
        <example-component></example-component>
    </div>
    <script src=" {{ mix('js/app.js') }} "></script>
    </body>
</html>


```







パスを設定


```web.php

Route::match(['get', 'post'] ,'/{app}', function () {
    //本番になったら削除する
    \File::cleanDirectory(storage_path()."/framework/views/");
    return view('vue');
})->where('app', '.*');

```



これで untitled\resources\js\components\ExampleComponent.vue を変更すると
中身が反映されるようになる。
pyTorch torch.var()の値が分散ではない

2020/4/13 投稿

# 0. この記事の対象者
- pythonを触ったことがあり,実行環境が整っている人
- pyTorchをある程度触ったことがある人
- pyTorchによるtorch.var()を使っている人


# 1. はじめに
昨今では機械学習に対してpython言語による研究が主である.
なぜならpythonにはデータ分析や計算を高速で行うためのライブラリ(moduleと呼ばれる)がたくさん存在するからだ.
その中でも今回は**pyTorch**と呼ばれるmoduleを使用し,その中の**torch.var()**について話をしていく.
結論から言うと**torch.var()**による計算は分散ではなく**不偏分散（標本分散）**となっている.
実は多くの統計的なライブラリでは**variance**は**不偏分散**を指しているらしい(私は知らなかったけど統計屋さんは当たり前にそう思ってるのだろう).
この話を実際にプログラムを通じて紹介していく.

ただしこの記事は自身のメモのようなもので,あくまで参考程度にしてほしいということと,簡潔に言うために間違った表現や言い回しをしている場合があるかもしれないが,そこはどうかご了承していただきたい.

# 2. 事前知識
事前知識としてpythonのnumpyとpyTorchをある程度使えるようにしていただきたい.
この記事ではこれらが当たり前に使える体で話を進めていく.
参考として下記LinkにpyTorchのTensor型についての記事を参照していおく.

[pyTorchのTensor型とは](https://qiita.com/mslive/private/241bfb42d852bb801b96)


# 3. torch.var()を使ってみる
まずプログラムを書く前に,当たり前ではあるが平均$\mu$,分散$\sigma^2$,不偏分散$s^2$についての式を示す.

```math
\mu = \frac{1}{n}\sum_i^n x_i\\
\sigma^2 = \frac{1}{n}\sum_i^n (x_i-\mu)^2\\
s^2 = \frac{1}{n-1}\sum_i^n (x_i-\mu)^2
```

ここで$x$は入力サンプル,$n$はサンプル数である.


サンプルとなるデータを以下のように定義した.

```ruby:filename.rb
a = torch.tensor([1.,2.,3.,4.,5.])
print(a)

------'''以下出力結果'''--------
tensor([1., 2., 3., 4., 5.])
```

さてまずは普通に分散を求めてみると

```ruby:filename.rb
mu = torch.mean(a)
var = torch.mean((a - mu)**2)
print(var)

------'''以下出力結果'''--------
tensor(2.)
```

ここで**torch.mean()**は入力した全要素の平均を求める.
このように分散は2.0であることがわかった.

では,pytorchの**torch.var()**を使ってみる.

```ruby:filename.rb
var = torch.var(a)
print(var)

------'''以下出力結果'''--------
tensor(2.5000)
```

と値が変わっている.
この答えが**torch.var()**が分散を求めていない理由である.
実は**torch.var()**は入力した全要素の**不偏分散(標本分散)**を求めているのである.

# 4. torch.var()を使うときの注意
実際に**torch.var()**を使う時の注意だが,分散を予期している場合はこれを使うのを避けるべきかというと必ずしもそうとは言えない.
というのも式から見てわかる通りサンプル数が非常に多い場合はどちらもだいたい同じ値になるからである(nが1000なら1000で割る分散と999で割る不偏分散はほぼ一緒).
今回の私の例のように**少ないサンプル数でやる場合**は注意が必要ということである.

# 5. ひとこと
今回はtorch.var()に関することをまとめてみた.
もしかしたら当たり前なことをつらつら述べているだけかもしれないが私は驚きだったので記事として書かせていただいた.
それから分散と不偏分散周りのしっかりした意味合いとかは自身の知識が乏しいため表現ミスなどは温かい目で指摘していただきたい.
読みづらい点も多かったと思うが読んでいただきありがとうございます.
MySQL データベース削除


##MySQLへ接続

SQLを実行するためにはデータベースに接続しなければいけません。

```:Tarminal
mysql -u root
```

##データベースの一覧を確認
次に作成したデータベースの一覧を確認します。

```:Tarminal
show databases;
```

するとこういった一覧が表示されます（データベースの内容は個々人によって異なります）
<img width="302" alt="データベース.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484216/dd22baac-6600-da94-4ec3-13fdf74f7846.png">


##データベースの削除
このコマンドでデータベースを削除できます。

```:Tarminal
mysql> drop database 削除したいデータベース名;

```

##ハイフン付きのデータベース名を削除するにはデータベース名を`(バッククオート)で囲む

例えば　**exam-pictweet_development**　のようなデータベース名のものを削除しようとすると下記のようなエラーが出てしまいます。

```:Tarminal
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'exam-pictweet_development' at line 1
```

なのでデータベース名にハイフンが入っているものには **`(バッククオート)** で囲んで上げる必要があります。

```:Tarminal
mysql> drop database `exam-pictweet_development`;

```
そうすれば下記のように表示されデータベースを削除できます。

```:Tarminal
Query OK, 7 rows affected (0.17 sec)
```
念の為削除できているかデータベースの一覧を確認します。

```:Tarminal
show databases;
```
Rails5 投稿コメント機能と削除機能がうまく行かない

削除やコメントに対しえエラーは表示されないが思っているようなアクションがされない
＃やっってること

<img width="793" alt="スクリーンショット 2020-04-13 13.25.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618242/b51cd1e3-d2b4-5fd8-e2a7-e572a54d6670.png">

上記がコメントのコントローラー


下記がコメントさせたいshowページ


<img width="793" alt="スクリーンショット 2020-04-13 13.18.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618242/e949c184-367e-bfcf-ae63-b4285fc5b9a0.png">

＃どのような結果か　

コメントの内容が出力されていない
ユーザー名とdestroyリンクのみ表示される




destroyを押すと古いコメンとから削除され消したいものを消すことができない


＃改善策などあればご教授して欲しいです
Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | コンテンツ(教材)の保護(Microsoft Office ファイル)

関連記事は[**「Microsoft Teams の授業での活用」**](https://qiita.com/hisaho/items/12837a169bd6f1d90d5c)をご参照ください。

# はじめに
新型コロナウィルスの完成拡大を受け、日本政府は2020年4月10日、教科書などの著作物をインターネットなどによる遠隔授業で使えるようにする改正著作権法を2020年4月28日に施行する政令を閣議決定しました。これによりネットやテレビを通じた遠隔授業で、教科書などの著作物を自由に無償で使えるようになったわけです。SARTRASも新型コロナ対策として[**20年度に限り**](https://current.ndl.go.jp/node/40726)、学校側から補償金を徴収しない特例措置を導入することを決めています。
しかし、2019年にNHKで放映された[**デジタル・タトゥー**](https://www.nhk.or.jp/drama/dodra/tatoo/) が警鐘を鳴らすように、一旦インターネット上で公開された書き込みや個人情報などが、一度拡散してしまうと、完全に削除するのは不可能です。改正著作権法が施行されるとはいえ、**アフターコロナ**(新型コロナウィルスの終息後)を見据え、オンライン授業で使用する教材を誰もが閲覧できる場所に置いてしまうのは問題です(<font color="red">後々、著作権法違反で訴えられないように注意しましょう</font>)。本記事ではどのようにして閲覧権限を持つ人のみに電子教材を配布していったらについて解説いたします。

# Azure Information Protection (AIP) とは
AIP はファイルやメールなどのコンテンツを暗号化し、特定の状況かでのみコンテンツにアクセスできるようにすることで、情報漏洩を防ぐクラウドサービスです。

#ZIPで暗号化して共有すればいいのではないですか？

日本ではいまだにZIPファイルの暗号化を使うケースがよくありますが、受け取ったユーザーが暗号化を解除しれば、何もセキュリティ設定が施されていないコンテンツになってしまいます。すると自由にコンテンツをコピーできてしまいますし、誰がいつアクセスしたかについての監査を行うことも難しく、特に学外にコンテンツが出てしまった場合、アクセス監査を行うことはほとんど不可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/dfc6d4b2-bb66-7aad-21e7-8432844f3ee0.png)

#Word、PowerPoint、Excel はコンテンツにパスワード設定できるから大丈夫なのでは？
Word、PowerPoint、Excelでは、コンテンツにパスワードの設定ができます。PowerPointの場合には、**[ファイル]**→**[情報]**→**[プレゼンテーションの保護]**→**[パスワードを使用して暗号化]**で設定できます。しかしこの方法では、パスワードを知っている自分以外の第三者がパスワード設定を解除することもできてしまうため、意味がありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/4a6b5803-c98a-2174-c9fd-fc06f45e999f.png)


#Azure Information Protection によるコンテンツの保護

AIPによるコンテンツの保護の仕組みを下図に示します。ポイントは、暗号化解除のためのカギがクラウドサービスであるAIPにあるということです。暗号化されたコンテンツを閲覧するには、この暗号化解除のカギが必要でこのカギを取得するには、ユーザー認証を行う必要があります。つまり配布されたコンテンツを他人にメールで送ろうが、どこかのクラウドサービスに置こうが、ユーザー認証できない閲覧権限のない人はこのファイルを見ることができないのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/5a547431-8652-472c-45fd-cd72069b87cf.png)

#Officeアプリケーション以外のファイルでAIPで保護できるものは

以下の拡張子のファイルが保護できます。

- .txt
- .xml
- .jpg
- .jpeg
- .pdf
- .png
- .jt
- .tif
- .tiff
- .bmp
- .gif
- .jpe
- .jfif

#ファイルの保護の仕方

Office アプリケーションからは、以下の手順で暗号化できます。
**[ファイル]**→**[情報]**→**[プレゼンテーションの保護]**→**[アクセスの制限]**→**[社外秘￥すべての従業員]**。　このような設定をするとテナント外の部外者は閲覧できなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/cc33a36f-bb9c-8da7-961d-7b72c7e6685d.png)

もちろん、特定のユーザーのみ閲覧するといった設定もできます。例えば教授会の資料なので、関係する教授のみが閲覧できるといった設定もできます。
**[ファイル]**→**[情報]**→**[プレゼンテーションの保護]**→**[アクセスの制限]**→**[アクセス制限あり]**をクリックし、閲覧、変更できるユーザーを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/e9c66e0a-49dc-f984-a53f-82cf4d0bbc90.png)

印刷を禁止するといった設定も可能です。

# まとめ
AIPでコンテンツを保護することで、閲覧権限を持たないユーザーは閲覧することができなくなりますので、安全に教材を公開、共有することができるようになります。
この直し方→Assertions require every name in the call target to be declared with an explicit type annotation.

TypeScriptで「Assertions require every name in the call target to be declared with an explicit type annotation.」というコンパイルエラーが出たときの直し方です。

## どのようなときに発生するコンパイルエラーか？

このエラーは、[Assertion Functions](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#assertion-functions)を次のようなアロー関数で定義したときに発生します。

```typescript
const assertString = (value: unknown): asserts value is string => {
  if (typeof value !== 'string') {
    throw new Error('Value must be string')
  }
}

let value: unknown
assertString(value) // コンパイルエラー
const str: string = value
```

## このエラーの直し方

このエラーの直し方は2つあります。

### 直し方1: `function`で書き直す

ひとつめは、アロー関数をやめて`function`で書き直す方法です。

```typescript
function assertString(value: unknown): asserts value is string {
  if (typeof value !== 'string') {
    throw new Error('Value must be string')
  }
}

let value: unknown
assertString(value) // OK!
const str: string = value
```

### 直し方2: 変数の型を明示する

ふたつめの直し方はアロー関数の変数の型を明示する方法です。

```typescript
type AssertString = (value: unknown) => asserts value is string

//                  ↓変数の型を明示
const assertString: AssertString = value => {
  if (typeof value !== 'string') {
    throw new Error('Value must be string')
  }
}

let value: unknown
assertString(value) // OK!
const str: string = value // Also assignable!
```

上の例では型エイリアスを定義した上で、変数の型を明示していますが、型エイリアスを使わない書き方でもOKです:

```typescript
//                   変数の型アノテーションに直接関数のシグネチャを書く
//                  |-----------------------------------------|
const assertString: (value: unknown) => asserts value is string = value => {
  if (typeof value !== 'string') {
    throw new Error('Value must be string')
  }
}
```

型エイリアスを使うか使わないかはお好みで。

## なぜこのエラーが発生するか？

どうしてこのようなエラーが発生するのかは分かりませんが、下記のissueによれば、この仕様は意図的なものだそうです。

* [Error when assertion function calls aren't CFA'd by ahejlsberg · Pull Request #33622 · microsoft/TypeScript](https://github.com/microsoft/TypeScript/pull/33622)

これは想像ですが、コンパイラの都合上、control flow analysis→変数の型推論の順番で行われていて、通常のアロー関数の書き方だと、その型推論がまだ行われていないため、control flow analysisができないのだと思います。本当のところどうなのかはわからないので、知っている人は教えて下さい。
関数の引数（配列）の使い方が不明

#配列の引数について
最近C言語を初めた初心者です。
質問です。
#質問
関数testではch_nameのアドレスを受け渡しています。
そのアドレスに"yonyon"を代入しますが、関数か抜けるとそれが維持されない理由がわかりません。


```c
#include <stdio.h>

int test(char *pointer){  
    printf("pointer s = %s\n",pointer);
    pointer = "yyoonn";
    printf("pointer にyyoonnを代入する。\n");
    printf("pointer s = %s\n",pointer);
    return 0;
}
int main(void){
    char    ch_name[] = "yonyon";
    printf("ch_name s = %s\n",ch_name);
    test(ch_name);
    printf("ch_name s = %s\n",ch_name); 
}
```
####出力結果
ch_name s = yonyon
pointer s = yonyon
pointer にyyoonnを代入する。
pointer s = yyoonn
ch_name s = yonyon

最後なぜyonyonに戻ってしまうのかがわかりません。
どなたか教えてください。
PRを提出してLGTMをもらった後、別ブランチを切って開発するまでの流れ

###前提
- 現在いるブランチはtask1。
- - ブランチ（task1）のプルリエストを提出して、LGTMをもらった。
- 次の開発のためにtask2というブランチを作ろうとしている。
- リモートリポジトリでLGTMをもらったブランチ（task1）をmasterにマージをしていない状態。
- ローカルリポジトリでもtask1をmasterにマージをしていない状態。


###順序
#####①リモートリポジトリでmasterにマージをする。（bitbucketだとマージをするボタンがあります。）

#####②ローカルリポジトリでもmasterにtask1をマージしてから、masterブランチにいる状態で```git checkout -b task2```を実行する。

```
$  git checkout master  #masterブランチに移動する
$  git merge task1      #task1をmasterにマージする
$  git push origin master  #masterブランチに今回マージした変更を適用する
```


または、


#####task1ブランチにいる状態で```git checkout -b task2```を実行する。

```
$  git checkout -b task2   #task1ブランチにいる状態でtask1の内容を引き継いだtask2を作成し、同時にtask2ブランチに移動する

```
#####注意
※task1ブランチにいる状態で```git checkout -b task2```を実行する方法ですと、当然```git checkout -b task2```を実行した時点ではmasterブランチにtask1の内容はマージされていない状態となります。
task2の開発が終わった後、

```
$  git checkout master  #masterブランチに移動する
$  git merge task2      #task2をmasterにマージする
```
上記を行えばtask2（task1の内容を引き継いでいます）をmasterブランチにマージすることができます。


私が取り入れているのはローカルリポジトリでもmasterにtask1をマージしてから、masterブランチにいる状態でgit checkout -b task2を実行する方法です。
どのブランチまでマージをしたか忘れてしまいリモートリポジトリを辿るのが面倒なので1ブランチの開発が終わったらマージをしています。
font-familyを使ってフォント指定をする方法

##font-familyとは
font-familyとは、CSSのプロパティ（設定項目）のひとつで、これを指定すると、フォント（文字）の種類を変更することができます。
構文
font-family: フォント名 ;
でフォントを変えられます。
###使用できるフォント名
よく使われているフォントのリストです。

| 総称ファミリー | フォント名 | 
|:--|:--|
| sans-serif (ゴシック系フォント） | sans-serif |
|| arial | 
|| arial black |
|| Impact |
|| MS Sans Serif |
| serif（明朝系フォント) | serif | 
|| Century |
|| MS Serif |
|| Times New Roman |
| monospace(等幅フォント） | monospace |
|| Courier |
||MS ゴシック |
| fantasy(装飾系フォント） | fantasy |
||Monotype Corsiva |
| cursive(筆記体フォント） | cursive |
|| Comic Sans MS | 
| 日本語フォント | MS UI Gothic |
|| MS Pゴシック |
|| メイリオ |
|| 游ゴシック/游ゴシック体 |
|| ヒラギノ角ゴシック |
|| ヒラギノ丸ゴ ProN |
|| Droid Sans |
指定したフォントがWebページを閲覧する人のPCやスマホに対応していないときは、意図しない表示になってしまうことがあります。
これを避けるために、font-familyには複数のフォントを指定し、ひとつはすべりどめのフォントを記載しておくことが推奨されています。すべりどめは「総称ファミリー」とよばれ、特定のフォントがなくても似たフォントのグループの中から自動的に表示してくれます。
###フォント指定
【例】
HTML

```
<div class="sample"> ABC123あいうえお愛 </div>
```
CSS

```
.sample {  
    font-size: 20px;
    font-family: "serif";
}
```
上記のように記述すると、ABC123あいうえお愛のフォントが変わります。
###複数のフォントの指定
複数のフォントを指定する時は、以下のルールがあります。
①優先度の高いものから先に記述する
②フォント名とフォント名の間は、「,」（カンマ）で区切る
③フォント名にスペースが含まれる場合は、「'」（クォーテーション）か「"」（ダブルクォーテーション）で囲む
④滑り止めの総称ファミリーを最後に記述する
【例】
HTML

```
<div class="sample2"> ABC123あいうえお愛 </div>
```
CSS
```
.sample {
    font-size: 20px;
    font-family: "YuGothic","Yu Gothic","ヒラギノ角ゴ","sans-serif";
}
```
参考フォント
[Font-familyメーカー](https://saruwakakun.com/font-family)
改行コードって難しいっ

## はじめに

標準入力から文字列をつけとってなんやかんやする機会は多いと思います。Go で標準入力から文字列を受け取る方法の 1 つとして [fmt.Scanf](https://golang.org/pkg/fmt/#Scanf) を使う方法があります。for ループを使った複数行の文字列を読み込んでいるときに Unix 系の OS と WindowsOS で挙動が異なることに気づきました。バグっぽい挙動を示しています。

問題になっているのは OS の差異による改行コードの違い、CRLF(`\r\n`) と LF(`\n`)によるものです。

公式リポジトリの Issue にもあがっていました。Open な Issue です。

https://github.com/golang/go/issues/23562

## サンプル

実際に fmt.Scanf を使う以下のような簡単な実装を考えてみます。

```go:main.go
package main

import "fmt"

func main() {
	var f, s string

	fmt.Printf("Please enter first string:\n")
	_, err := fmt.Scanf("%s", &f)
	fmt.Println(err)

	fmt.Printf("Please enter second string:\n")
	_, err = fmt.Scanf("%s", &s)
	fmt.Println(err)
}
```

Unix 系で `go run main.go` として実行します。入力する文字列は `hoge`, `fuga` とします。

### Unix系での実行

```console
Please enter first string:
hoge
<nil>
Please enter second string:
fuga
<nil>
```

想定通りに読み込むことができました。

### Windows系での実行

Windows 系で `go run main.go` として実行します。Unix 系のときと同様に入力する文字列は `hoge`, `fuga` とします。

```console
Please enter first string:
hoge
<nil>
Please enter second string:
unexpected newline
```

見ると 2 回目の fmt.Scanf でエラーとして `unexpected newline` と出力されていることがわかります。これは想定外です。

## 詳細を見てみる

何が起きているか、詳細を確認します。デバッグ用の io.Reader を実装して確かめます。デバッグ用の io.Reader の実装は Issue からの引用です。

```go
type myReader struct{}

func (r myReader) Read(p []byte) (n int, err error) {
	n, err = os.Stdin.Read(p)
	fmt.Fprintf(os.Stderr, "DEBUG: %q %v\n", p[:n], err)
	return n, err
}
```

```go
func main() {
	input := myReader{}
	var f, s string

	fmt.Printf("Please enter first string:\n")
	_, err := fmt.Fscanf(input, "%s", &f)
	fmt.Println(err)

	fmt.Printf("Please enter second string:\n")
	_, err = fmt.Fscanf(input, "%s", &s)
	fmt.Println(err)
}
```

- Unix系での実行

```
Please enter first string:
hoge
DEBUG: "h" <nil>
DEBUG: "o" <nil>
DEBUG: "g" <nil>
DEBUG: "e" <nil>
DEBUG: "\n" <nil>
<nil>
Please enter second string:
fuga
DEBUG: "f" <nil>
DEBUG: "u" <nil>
DEBUG: "g" <nil>
DEBUG: "a" <nil>
DEBUG: "\n" <nil>
<nil>

Process finished with exit code 0
```

- Windows系での実行

```console
Please enter first string:
hoge
DEBUG: "h" <nil>
DEBUG: "o" <nil>
DEBUG: "g" <nil>
DEBUG: "e" <nil>
DEBUG: "\r" <nil>
<nil>
Please enter second string:
DEBUG: "\n" <nil>
unexpected newline
```

上記の結果から、Windows 系では 2 回目の読み込みの際に `\n` を読み込もうとしていることがわかります。

で、これは Pob Pike 氏が以下のようにコメントしています。Oh...

> The scanning code in fmt is cursed. cc @rsc

## 進行中のCL

レビュー中の CL は以下です。

https://go-review.googlesource.com/c/go/+/110595

## 暫定対応

**暫定的には以下のように末尾に `\n` を付与する** ことで WindowsOS でも想定通りエラーにならずに動作します。(Unix 系の OS でも同様に動きます)

```diff
func main() {
	var f, s string

	fmt.Printf("Please enter first string:\n")
-	_, err := fmt.Scanf("%s", &f)
+	_, err := fmt.Scanf("%s\n", &f)
	fmt.Println(err)

	fmt.Printf("Please enter second string:\n")
-	_, err = fmt.Scanf("%s", &s)
+	_, err = fmt.Scanf("%s\n", &s)
	fmt.Println(err)
}
```

```console
Please enter first string:
hoge
<nil>
Please enter second string:
fuga
<nil>
```

参考: https://stackoverflow.com/questions/17401709/why-doesnt-fmt-scanf-in-go-wait-for-user-input/17403785

エラーにならずに文字列を読み込むことができました。
PHPUnitでmarkTestIncompleteでテストの未実装を明示する

PHPUnitでテストを実装するときにテストを実装しなきゃいけないことがわかっているが、今は事情により実装出来ない場合

```php

public function testHoge()
{
    $this->markTestIncomplete('後で実装する');
}

```

というふうに`markTestIncomplete`を利用してmarkしておくとテスト実行時にTrueでもFalseでもなく、IncompleteのIが表示されるようになります。

これによってテストの未実装を防ぐことが出来ます。
MacOS CatalinaでHWD12を利用する


## はじめに
auから発売されていたUSB STICK LTE HWD12 by HUAWEIをMacで利用していましたが、OSをMojabeからCatalinaにバージョンアップするとこのデバイスが利用できなくなってしまいました。

MacOS Catalina から 32bit アプリケーションが動作しなくなり、このデバイス用のアプリケーションが32bit のため起動できないようです。
![スクリーンショット 2020-04-11 16.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89268/518595ce-5262-e492-9101-c28d5b233099.png "スクリーンショット 2020-04-11 16.21.36.png")

複数のMacBookを所有していますが、このデバイスが使えないためMojabeからOSをバージョンアップできずに困っていました。（2020/4現在、au側の対応は見つかりませんでした）
今回、色々調べることで、この製品がHuawei E3276をカスタマイズしたモデルらしいので本家のHauweiからドライバーを入手することで無事にHWD12がCatalinaでも利用できるようになりました。自己流ですがその方法をアップしておきます。

##64bitアプリケーションのダウンロード
Huaweiの下記のサイトで検索しました。
https://consumer.huawei.com/en/support/search/

このリンク先からアプリケーションをダウンロードします。
**Hilink products tool, support MAC 10.15**

https://consumer-tkb.huawei.com/tkbapp/downloadWebsiteService?websiteId=1697201

ダウンロードフォルダにHiLink.appというファイルがダウンロードされます。

## インストール
先に古い32bitのUSB STICK LTE setting toolをアプリケーションフォルダから削除しておきます。（uninstallも動かなかったのでアプリケーションフォルダからゴミ箱に入れます）

ダウンロードしたファイルHiLink.appをアプリケーションフォルダへ移動して、その後ダブルクリックして実行することでインストールされます。

## 設定ファイルの書き換え
インストール後に設定ファイルを書き換えます。
/Library/StartupItems/MobileBrServ/ArConfig.dat
このファイルの中身をもとの32bit版で書かれていた内容にします。

```ArConfig.dat
[INSTALL]
service_name=USB STICK LTE setting tool
service_desc=USB STICK LTE setting tool

[PRODUCT_ID]
pid=14db,1f01;14dc,1f01;14db,1f03

[OPENBR_TIME]
wait_time=1

[OPEN_URL]
domain=http://au.home/
url=http://192.168.1.1
auto_open_url=1
```

## 再起動
この後、Macを再起動します。
起動後、HWD12をMacに指すとしばらくすると通信確立の紫色のインジケーターになりました。

ブラウザが立ち上がりこのドライバーは最新でないと言われますが、無視して閉じても大丈夫です。
![スクリーンショット 2020-04-11 17.05.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89268/63af97be-82c3-7c39-c0e4-858a3fb70593.png "スクリーンショット 2020-04-11 17.05.41.png")

自己責任ですが、これでCatalinaにバージョンアップ後、使えなくなっていたHWD12が再び利用できるようになりました。

## おわりに
このデバイスが使えないのでMacOSのバージョンアップを保留していた他のMacBookもMojabeからCatalinaにバージョンアップすることができるようになりました。
やっぱりOSは最新版が気持ちいいですね。
Ruby と Perl で解くAtCoder ABC 162 C メモ化による高速化

# はじめに
*[AtCoder](https://atcoder.jp/home)* の AtCoder Beginner Contest 162 の C問題がTLE寸前でしたので、復習を兼ねて投稿します。
# お礼
オフィシャルの解説やネット上の解説・解答を参照して理解を進めております。
**AtCoder** さん、競技プロプレイヤーさん、ありがとうございます。
# なぜTLE
ループを三重にしていることもありますが、***Perl*** では、最小公倍数を求める関数が遅いことが要因と考えられます。

そこで、*[もっとプログラマ脳を鍛える数学パズル アルゴリズムが脳にしみ込む70問](https://www.amazon.co.jp/dp/B078LMFXXC)* にて再三紹介されているメモ化による高速化を行いたいと思います。

今回のC問題
*[AtCoder Beginner Contest  C - Sum of gcd of Tuples (Easy)](https://atcoder.jp/contests/abc162/tasks/abc162_c)*
# TLE した Perl ソース
```TLE.pl
use v5.26; # strict say state biwise
use warnings;

chomp (my $k = <STDIN>);
sub gcd {
  my ($x, $y) = @_;
  while ($y) {
    my $r = $x % $y;
    $x = $y;
    $y = $r;
  }
  $x;
}
my $ans = 0;
for my $i (1..$k) {
  for my $j (1..$k) {
    my $c = gcd($i, $j);
    for my $l (1..$k) {
      $ans += gcd($c, $l);
    }
  }
}
say $ans;
```
自作の gcd 関数を使用しています。
（*[Mathモジュールにgcd関数が用意されていますが、更に遅くなることが分かっています。](https://qiita.com/superrino130/items/a65eaa417f7da80971e7)*）

||Perl 自作gcd|
|:--:|:--:|
|実行時間|<font color="orange">TLE</font>|
# Ruby の gcd メソッド
***Ruby*** では Integer クラスに gcd メソッドが用意されていますので、それを使用します。

```rubygcd.rb
k = gets.to_i

ans = 0
1.upto(k) do |i|
  1.upto(k) do |j|
    n = i.gcd(j)
    1.upto(k) do |k|
      ans += n.gcd(k)
    end
  end
end
puts ans
```
毎度のことながら、*Ruby* のスッキリ感は凄いですね。

||Perl 自作gcd|Ruby gcd|
|:--:|:--:|:--:|
|実行時間|<font color="orange">TLE</font>|741 ms|
# Perl メモ化による高速化
```perlmemo.pl
use v5.26; # strict say state biwise
use warnings;

chomp (my $k = <STDIN>);
my @memo;
sub gcd {
  my ($x, $y) = @_;
  return $memo[$x][$y] if $memo[$x][$y] > 0;
  my ($u, $v) = ($x, $y);
  while ($y) {
    my $r = $x % $y;
    $x = $y;
    $y = $r;
  }
  $memo[$u][$v] = $x;
}
for my $i (1..$k) {
  for my $j (1..$k) {
    gcd($i, $j);
  }
}
my $ans = 0;
for my $i (1..$k) {
  for my $j (1..$k) {
    my $c = $memo[$i][$j];
    for my $l (1..$k) {
      $ans += $memo[$c][$l];
    }
  }
}
say $ans;
```
ここでは、予め gcd の計算結果を配列 memo にメモしておき、配列の値として呼び出します。

||Perl 自作gcd|Ruby gcd|Perl memo|
|:--:|:--:|:--:|:--:|
|実行時間|<font color="orange">TLE</font>|741 ms|408 ms|
# Ruby メモ化による高速化
```rubymemo.rb
k = gets.to_i

@memo = Array.new(k + 1).map{Array.new(k + 1, 0)}
def gcdmemo(i, j)
  return @memo[i][j] if @memo[i][j] > 0
  u, v = i, j
  while (j > 0) do
    r =  i % j
    i = j
    j = r
  end
  @memo[u][v] = i
end
1.upto(k) do |i|
  1.upto(k) do |j|
    gcdmemo(i, j)
  end
end
ans = 0
1.upto(k) do |i|
  1.upto(k) do |j|
    c = @memo[i][j]
    1.upto(k) do |l|
      ans += @memo[c][l]
    end
  end
end
puts ans
```
上記 Perl メモ化による高速化と同じ手法で、自作の gcd メソッドを使用しています。

||Perl 自作gcd|Ruby gcd|Perl memo|Ruby memo|
|:--:|:--:|:--:|:--:|:--:|
|実行時間|<font color="orange">TLE</font>|741 ms|408 ms|437 ms|
メモ化　凄い
# まとめ
+ ABC 162 C の解法を改良した
+ メモ化の応用ができるようになった

参照したサイト
*[Rubyの配列で使えるメソッド、二次元配列の使い方](https://qiita.com/dddisk/items/8ad2d5570edf3c577eea)*
【Python】数学的な変換処理まとめ（直行座標や極座標変換など）【math, numpy等】

#極座標(r, Θ)から直交座標(x, y)を求める

```python
def getXY(r, degree):
    # 度をラジアンに変換
    rad = math.radians(degree)
    x = r * math.cos(rad)
    y = r * math.sin(rad)
    print(x, y)
    return x, y
```

#直交座標(x, y)から極座標(r, Θ)を求める

```python
def getRD(x, y):
    r = math.sqrt(x**2+y**2)
    rad = math.atan2(y, x)
    degree = math.degrees(rad)
    print(r, degree)
    return r, degree
```

#原点xyから特定のXYへの極座標(r, Θ)を求める

```python
def getxy_RD(x, y, X, Y):
    _x, _y = (X-x), (Y-y)
    r = math.sqrt(_x**2+_y**2)
    rad = math.atan2(_y, _x)
    degree = math.degrees(rad)
    print(r, degree)
    return r, degree
```
プライベートMIBインポート手順

#やりたいこと
2つのプライベートMIBファイルをインポートしたい。
正常にMIB変換される事を確認したい

#おおざっぱに言うと
・プライベートMIB専用のディレクトリを作成し、MIBファイルを格納
・snmp.confに作成したディレクトリを参照する旨を書き込む
・確認コマンド流して正常にインポートされていることを確認！！

#環境
・Redhat Linux Enterprise 7.7
・net-snmp net-snmp-utils インストール済

#手順

1.SNMPマネージャサーバへSSH接続をし（以下作業全てroot権限で）MIB設置用ディレクトリを作成

```
# mkdir /usr/share/snmp/vendor_mibs
```

2.MIBファイルをMIB設置用ディレクトリにコピー
　tmpディレクトリにteratermのSSH SCP機能を使用してアップロード
  (今回は2ファイルだけのため圧縮する必要なし　必要に応じてscpクライアントや圧縮を利用してファイル送信をしてね)

3.tmpディレクトリへアップロード後MIB設置用ディレクトリへコピー

```
# cp /tmp/<mib.txt> /usr/share/snmp/vendor_mibs/<mib.txt>
```

4.snmp.conf有無確認
　無い場合は以下の通り作成する

```
# touch /usr/share/snmp/snmp.conf
```

5.snmp.conf記述内容

```
MIBDIRS /usr/share/snmp/mibs:/usr/share/snmp/vendor_mibs
MIBS all
```

6.確認コマンド

```
# snmptranslate <任意のOID>
```

snmptranslateが正しく表示されればインポート完了！！
Shift_JISからUTF-8へ変換する

# なぜ文字化けしていたか

- Shift_JISで書かれたテキストをUTF-8で見ていたため。

# エディタはそもそもどのようにテキストを表現しているか

- テキストを保存するとき、エディタはShift_JISやUTF-8などの文字コードを使って、テキストを内部的な値に変換している。
- **文字コードによって内部的な値は異なる。**
- テキストファイルを開くとき、エディタはShift_JISやUTF-8などの文字コードを使って、内部的な値をテキストに変換して表示している。
- 保存するときとファイルを開くときに使用する文字コードが違うと文字化けが発生する。

**つまり保存するときとファイルを開くときは同じ文字コードを使用する必要がある。**

# Shift_JISからUTF-8へ変換する

- VScodeはデフォルトでutf-8でファイルを開くため、Shift_JISのファイルを開くと文字化けする。
- まずはShift_JISでそのファイルを開きなおすことで文字化けを解消
- 次にUTF-8でファイルを保存する。
- これでUTF-8でファイルを開いても文字化けは再現しない
【Laravel】migrationでカラムの変更に対応してないデータ型があった

# はじめに

Laravelのmigration機能についてです。
migration機能では、DBのテーブル作成と削除やカラムの追加と削除などの操作を行うことができます。

カラムの変更では、カラムをnullableに変更したり、データ型を変更したりできます。

ある時、一部のデータ型でカラムの変更を行おうとした時にエラーが発生したので、
カラムの変更に対応してないデータ型があることを知りました。
あまり知られていないようなので、まとめます。


## カラムの変更方法について

カラムを変更するには,作成と同じようにカラム名を指定した後ろで`change()`を呼びます。
例にあるようにInteger型などは普通に変更できます。

```php
    public function up()
    {
        Schema::table('products', function (Blueprint $table) {
            $table->unsignedInteger('column_a')->nullable()->change();
        });
    }
```


## 対応してない方を変更しようとした時に発生するエラー

対応してないデータ型でchangedを呼ぶと以下のようなmigration実行時にエラーが発生しました。

```
In DBALException.php line 264:
                                                                                                                                                                                                    
  Unknown column type "tinyinteger" requested. Any Doctrine type that you use has to be registered with \Doctrine\DBAL\Types\Type::addType(). You can get a list of all the known types with \Doct  
  rine\DBAL\Types\Type::getTypesMap(). If this error occurs during database introspection then you might have forgotten to register all database types for a Doctrine Type. Use AbstractPlatform#r  
  egisterDoctrineTypeMapping() or have your custom types implement Type#getMappedDatabaseTypes(). If the type name is empty you might have a problem with the cache or forgot some mapping informa  
  tion.           
```

# 変更できるデータ型
|データ型|
|:--|
|bigInteger          |
|binary              |
|boolean             |
|date                |
|dateTime            |
|dateTimeTz          |
|decimal             |
|integer             |
|json                |
|longText            |
|mediumText          |
|smallInteger        |
|string              |
|text                |
|time                |
|unsignedBigInteger  |
|unsignedInteger     |
|unsignedSmallInteger|

### 参考

https://laravel.com/docs/6.x/migrations#modifying-columns

> Only the following column types can be "changed": bigInteger, binary, boolean, date, dateTime, dateTimeTz, decimal, integer, json, longText, mediumText, smallInteger, string, text, time, unsignedBigInteger, unsignedInteger and unsignedSmallInteger.

# 変更できないデータ型

tinyInteger,unsignedTinyIntegerなど。変更できるカラム以外

こういうカラムは、一回dropしてからまた作り直す必要がありそうです。
（他に良いやり方があったら教えてください）


以上、参考になりましたら幸いです。
M2Detを動かした。

# 概要
M2Detを動かしたときの手順の備忘録。


# 参考記事
https://qiita.com/K_ichijima/items/a415d3d03f91274da4f3
https://qiita.com/nabechi6011/items/2b0b44894b93b702215b

# 環境
OS: Ubuntu18.04 
GPU: Nvidia GeForce GTX 1070
CUDAやAnacondaのバージョンは[こちら参照](https://qiita.com/harayama_dev68/items/fc660bec06ee05ed32c3)

# デモ実行までの手順
1. [ここ](https://github.com/qijiezhao/M2Det)のリポジトリをクローンする。
2. 必要なモジュールのインストール

     ```terminal:
$conda create -n m2det python=3.7
$conda activate m2det
$conda install pytorch==0.4.1 torchvision -c pytorch
$pip install opencv-python tqdm
$pip install cython
$pip install addict
$pip install --upgrade Pillow
$pip install matplotlib
$pip install termcolor
$cd M2Det
$mkdir weights
$bash make.sh
```

3. 重みファイル（m2det512_vgg.pth）を[GitHub](https://github.com/qijiezhao/M2Det)のリンクからダウンロードしてweightsディレクトリに置く。
4. デモを実行する。

     ```terminal:
$python demo.py -c=configs/m2det512_vgg.py -m=weights/m2det512_vgg.pth --show
```

# COCOデータセットを使った学習手順
あとで追記予定。
素人が誰かが欲しくなりそうなWebツール作ってみたい

# 素人が誰かが欲しくなりそうなツールを作ってみたい

### 今考えているもの
社内向けツールの作成

# 開発言語　フレームワーク
Ruby 2.6系
Rails 6系

# 参加するにあたって
1. いまからRailsの勉強がしたいんだー　←　どんどん参加しちゃってください
2. なに作ればいいかわかんない　←　Issueみてアイデアみつけて実装してきましょ？
3. 初心者です実務経験ないし...　←　関係ないです、勉強しながら作っていきましょ？
4. 随時更新します

# ルール
1. 自分が何か作るときは、Masterブランチじゃなくて自分専用のブランチを作ってくださね
2. どんな機能を付けるかIssueを上げましょう
3. 他人が嫌がるような行動は避けましょう
4. 同じ機能を作らない
5. ほかの人のコードや機能を触る場合は、その人に連絡を！
6. 随時更新します

# GitHubページ
https://github.com/NobitakunProj/JupiterManger

# Slack参加用
https://join.slack.com/t/nobitakun-proj/shared_invite/zt-dl19nfdg-4o2tnvptg_MTFUiZqF4Wkw
いつでも参加してください！


# 最後に一言
楽しみながらプログラミングしていきましょ！！
Let's Enjoy Programming Life!!