OmniAICreator/Qiita-1.07M huggingface dataset:
docker上のSQLサーバーに接続できない。 ASP.NET CORE

VisualStudio2019ASP.NETCORE APIアプリを作成中。
docker-composeでSQLサーバーも作成しAPIからDBを読みだすとエラー。

Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 40 - Could not open a connection to SQL Server)
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken, DbConnectionPool pool, SqlAuthenticationProviderManager sqlAuthProviderManager)
   at Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at Microsoft.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
   at Microsoft.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at Microsoft.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)

SQLマネジメントツールで確認したら繋がる。
asp側のdockerからPINGを打っても繋がる。名前解決の問題ではなさそう。

原因はDocker-compose.override.ymlにあるDB接続のポート番号。
DefaultConnectionの1433部分。
Dockerで他のポートにマッピングしていたんだけど、コンテナー同士の通信では外部マッピングの物ではなく、内部での1433を設定しないと通信できない。

    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_HTTPS_PORT=84303
      - DefaultConnection=Server=db-conainer-name,1433;Database=database-name;MultipleActiveResultSets=true;User Id=said;password=strongpassword;

検索しても解決がなかなか載ってなくて苦労した。
UnrealBuildTool(UBT)の詳細ログを出して動作を調べよう

#縁の下の力持ち UBT
UE4のコンパイルを統括しているツールがUnrealBuildToolです。
ビルドが必要か判断してビルドを行ったり、事前処理を自動でやってくれたりいろいろな処理を行っています。


大変重要なツールではありますが、上手く行っているときは縁の下の力持ち的なあまり意識しないくても良いツールでもあります。
しかし場合によっては意図通りに動いてくれないことがあります。

##詳細なログを出して動作を調べよう

標準の設定ではUBTはあまり多くのことをログに出力しませんが、ソースを見てみると結構たくさんログを出力してくれるようになっていることがわかります。

```C#
		public UEBuildModuleCPP(ModuleRules Rules, DirectoryReference IntermediateDirectory, DirectoryReference GeneratedCodeDirectory)
			: base(Rules)
		{
			this.IntermediateDirectory = IntermediateDirectory;
			this.GeneratedCodeDirectory = GeneratedCodeDirectory;

			foreach (string Def in PublicDefinitions)
			{
				Log.TraceVerbose("Compile Env {0}: {1}", Name, Def);
			}

			foreach (string Def in Rules.PrivateDefinitions)
			{
				Log.TraceVerbose("Compile Env {0}: {1}", Name, Def);
			}
```

UBTにもEditorと同じようにVerbosityの設定があり、これを変更することでより詳細なログを出すことができます。
有効化するにはVisualStudioのスタートアッププロジェクト(BlueprintProjectならUE4、C++Projectなら自分のプロジェクト)のプロパティを開きNMake->Build Command Line/ Rebuild Command Line に `-Verbose` と追記します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/253a1ee8-634c-58e2-52ea-0629991d54d8.png)

大量のログが出力されてビルド時間が余計にかかると思いますので、不要な時は消してくださいね。

##追記:もうひとつの方法～Build.batを編集する
上のソリューション中のプロパティにもあるようにビルドはEngine\Build\BatchFiles.Build.batを呼び出すことで起動します。
このバッチファイル中にオプションを加えてしまうことでももちろん詳細ログを得ることが可能です。
以下のようにUBTを起動している行の末尾に `-verbose` を追加します

```shell:Engine\Build\Batchfiles\Build.bat
IF EXIST ..\..\Engine\Binaries\DotNET\UnrealBuildTool.exe (
        ..\..\Engine\Binaries\DotNET\UnrealBuildTool.exe %* -verbose
		popd

		REM Ignore exit codes of 2 ("ECompilationResult.UpToDate") from UBT; it's not a failure.
		if "!ERRORLEVEL!"=="2" (
			EXIT /B 0
```
Dockerでneofetchの検証環境を作る！

先日各種linuxのOS情報を確認するコマンドneofetchを様々な環境で試した[記事](https://qiita.com/awaha/items/2f83a82b79b316ea3e06)を作成しました。
この記事を作成するにあたり、構築したDockerの検証環境をまとめたいと思います。

## 各種検証環境の作成
Dockerfileを元にイメージを作成して、そのイメージをdocker runコマンドで叩く方式を取っています。
1. Dockerfileを作成する
2. Dockerfieを元にイメージを作成する。
3. 手順2.で作成したイメージをdocker runする。
neofetchが実行されます。

### Ubuntu
Dockerfile

```dockerfile
FROM ubuntu:20.04

RUN apt update && \
    apt install -y neofetch

CMD [ "neofetch" ]
```

実行コマンド

```shell
docker image build -t neofetch_ubuntu ./ubuntu17_04
docker run --rm neofetch_ubuntu
```
ちなみに"--rm"はコンテナが停止した場合に削除まで自動で行うオプションです。
今回のイメージはneofetchコマンドを実行するだけなので、起動後不要なコンテナを削除するため上記オプションを指定します。

### Centos
Dockerfile

```Dockerfile
FROM centos:8

RUN yum install -y wget && \
    wget https://copr.fedorainfracloud.org/coprs/konimex/neofetch/repo/epel-7/konimex-neofetch-epel-7.repo -O /etc/yum.repos.d/konimex-neofetch-epel-7.repo && \
    yum install -y neofetch

CMD [ "neofetch" ]
```

実行コマンド

```shell
docker image build -t neofetch_centos ./centos
docker run --rm neofetch_centos
```

### Fedora 
Dockerfile

```Dockerfile
FROM fedora:31

RUN dnf install -y neofetch

CMD [ "neofetch" ]

```

実行コマンド

```shell
docker image build -t neofetch_fedora ./fedora
docker run --rm neofetch_fedora
```

### AlpineLinux
Dockerfile

```Dockerfile
FROM alpine:3

RUN apk update && \
    apk add --no-cache neofetch

CMD [ "neofetch" ]

```

実行コマンド

```shell
docker image build -t neofetch_alpine ./alpine
docker run --rm neofetch_alpine
```

### ArchLinux
Dockerfile

```Dockerfile
FROM archlinux:20200407

RUN yes | pacman -Syu neofetch

CMD [ "neofetch" ]

```

実行コマンド

```shell
docker image build -t neofetch_arch ./arch
docker run --rm neofetch_arch
```

### Debian
Dockerfile

```Dockerfile
FROM debian:stretch

RUN apt-get update && \
    apt-get install -y neofetch

CMD [ "neofetch" ]

```

実行コマンド

```shell
docker image build -t neofetch_debian ./debian
docker run --rm neofetch_debian
```

### openSUSE
Dockerfile

```Dockerfile
FROM opensuse/leap

RUN zypper install -y neofetch

CMD [ "neofetch" ]
```

実行コマンド

```shell
docker image build -t neofetch_opensuse ./opensuse
docker run --rm neofetch_opensuse
```

### 全コマンドの実行
イメージ作成後、下記コマンドを実行することで試すことが可能です。

```shell
docker run --rm neofetch_ubuntu
docker run --rm neofetch_centos
docker run --rm neofetch_fedora
docker run --rm neofetch_alpine
docker run --rm neofetch_arch
docker run --rm neofetch_debian
docker run --rm neofetch_opensuse
```

### まとめ
以上でneofetchを各種OSで実行する環境の完成です。
こうやっていろんなOSを気軽に試すことができるDockerって便利ですね！
yukicoder contest 243 参戦記

# yukicoder contest 243 参戦記

## [A 1020 Reverse](https://yukicoder.me/problems/no/1020)

手で実際にやってみると K番目からN番目までが順に並んだ後に1番目からK-1番目が順に並んだり、逆に並んだりすることがわかります. 1番目からK-1番目の並びが順になるか逆順になるかは当然操作回数が奇数か偶数かに依存します. よって以下のようなコードで解けました.


```python
N, K = map(int, input().split())
S = input()

if (N - K) % 2 == 0:
    print(S[K-1:] + S[:K-1][::-1])
else:
    print(S[K-1:] + S[:K-1])
```

## [B 1021 Children in Classrooms](https://yukicoder.me/problems/no/1021)

ポインタを移動しながら配列を書き換えて、ポインタの情報をもとに結果を出力することも考えましたが、ややこしくて頭の中がこんがらがったので deque でストレートに操作を実行することにしました. これなら何も難しいことはなく、以下のようなコードで解けました.

```python
from collections import deque

N, M = map(int, input().split())
a = list(map(int, input().split()))
S = input()

q = deque(a)
for c in S:
    if c == 'L':
        t = q.popleft()
        q[0] += t
        q.append(0)
    elif c == 'R':
        t = q.pop()
        q[-1] += t
        q.appendleft(0)
print(*q)
```

追記: ポインタを動かす方式でも解いてみた. ややこしかった.

```python
N, M = map(int, input().split())
a = list(map(int, input().split()))
S = input()

p = 0
for c in S:
    if c == 'L':
        p = max(p - 1, -N + 1)
        if p < 0:
            a[-p] += a[-p - 1]
            a[-p - 1] = 0
    elif c == 'R':
        p = min(p + 1, N - 1)
        if p > 0:
            a[N - 1 - p] += a[N - p]
            a[N - p] = 0

if p > 0:
    print(*([0] * p + a)[:N])
elif p < 0:
    print(*(a + [0] * -p)[-p:N - p])
else:
    print(*a)
```
IQ Bot：カスタムドメインの作り方

[IQ Bot](https://qiita.com/IQBotter/items/fab5f59230ff38a98bbd)の分類を意図通りに行うために便利な[カスタムドメイン](https://qiita.com/IQBotter/items/a10df61cc7f070e93db1)。

この記事では、そんなカスタムドメインの作り方を説明します。

~~**カスタムドメインのPOSTは、IQ Botのオンプレ版でのみ可能です。**（2020年4月10日現在）~~

オンプレ版／クラウド版に関わらず、カスタムドメインのPOSTは可能です！（2020年9月4日追記）

#全体の流れ

カスタムドメインを作る流れは、以下のとおりです。

１．JSONファイルを作る
２．作成したJSONファイルをIQ BotにPOSTする

カスタムドメインって何……？？という方は、以下の記事をチェックしてみてください。
[こちら](https://qiita.com/IQBotter/items/a10df61cc7f070e93db1)

以下、順を追ってやり方を説明します。

#１．JSONファイルを作る

以下の記事を参考に、JSONファイルを作ります。
[【リンク】IQ Bot： カスタムドメインのJsonファイルの見本と構造](https://qiita.com/IQBotter/items/a2dad8645a746fb96f9d)

#２．作成したJSONファイルをIQ BotにPOSTする

作成したJSONファイルをIQ BotにPOSTします。

POSTの方法は、A2019／V11によって若干異なります。
以下の記事のうち、バージョンに合った方を参照してやってみてください。

[【リンク】IQ Bot：カスタムドメインをPostする方法【A2019】](https://qiita.com/IQ_Bocchi/items/84ab4d5c73332fca7f65)
[【リンク】IQ Bot：カスタムドメインをPostする方法【V11】](https://qiita.com/IQ_Bocchi/items/d05db8602fa2e822bb6a)

#注意点

色々と便利なカスタムドメインですが、注意点がいくつかあります。

- カスタムドメインは、Community EditionにはPOSTできない

- カスタムドメインを使うと、分類に必要な項目数が増える

詳細は[こちらの記事](https://qiita.com/IQBotter/items/b9f6bd9abeb4b9925744#iq-bot%E3%81%8C%E5%B8%B3%E7%A5%A8%E3%82%92%E5%88%86%E9%A1%9E%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E9%A0%85%E7%9B%AE%E6%95%B0)に書いてありますが、カスタムドメインを使った場合は、分類をするために最低限必要な項目の数が増えます。
カスタムドメインを使うときは「その他」のドメインで項目を設定するとき以上に、項目を多めに**作成**することを心がけてください。

[2020/9/4 追記]　カスタムドメインに項目が含まれていさえすれば、**選択**はしなくても大丈夫です。

作成：ドメインの中に項目を含めておくこと
選択：作成したドメインを使ってラーニングインスタンスを作るときに、その項目をチェックすること（＝CSVの出力対象となる）

つまり、必要な項目は5つだが、分類のためにはもう少し要素を増やした方がいい、という場合は、分類の根拠となる項目をカスタムドメイン上には定義しておいて、ラーニングインスタンスを作るときにはその項目を選択しない、といった対応ができます。

- カスタムドメインは、一度POSTしたら後から修正ができない
　→　A2019.14以降では、項目およびAliasの追加ができるようになっています（削除はできません）
　　　※Aliasの意味は[こちら](https://qiita.com/IQ_Bocchi/items/a2dad8645a746fb96f9d)参照
　→　上記以前のバージョンおよびV11系統では、変更したくなったら別のドメイン名でPOSTしなおす必要があります。

- A2019系統のクラウド版では、カスタムドメインの項目名に日本語名を使うと画面上で文字化けする場合がある
　→　項目名の表示が文字化けされるだけで、Aliasには日本語名を保持することができます
　→　ワークアラウンドは、項目名をアルファベットでつけること（Aliasは日本語でOK）です
　　　※Aliasの意味は[こちら](https://qiita.com/IQ_Bocchi/items/a2dad8645a746fb96f9d)参照
Sympyモジュールを使ってグラフを作成する

# Sympyでグラフを作成する
Sympyを使って代数計算をしているときに、この数式のグラフはどんな形をしているのか、サッとみてみたいということがあります。Pythonでグラフといえば、まず思いつくのはmatplotlibだと思いますが、$y=f(x)$としたときの$x$はnumpyのarangeを使って値を代入する必要があるので何とも面倒です。こんなとき使えるのは、SympyのPlotting モジュールです。これは、式をそのままグラフにしてくれる上に、かなり込み入ったこともやってくれます。

# 必要なモジュールをインポート
まず、必要なモジュールをインポートします。Sympyでは、"from sympy import ～"を使うことが多いようです。変数を定義するvarのほか、今回はPlotting モジュールのすごさを実感できる"plot_implicit function"を使ってみます。また、実はSympyのグラフは、裏ではmatplotlibが動いているので、これもimportします。

```python3:必要なモジュールなどをimport
from sympy import var
from sympy.plotting import plot_implicit
import matplotlib.pyplot as plt
```

# 円の作成
ここではまず円 ($x^2 + y^2 =1$) を描いてみようと思います。

```python3:必要なモジュールなどをimport
#楕円の描画
var('x,y')
size = 1.1
f = x**2 + y**2 - 1
plot_implicit(f, (x, -size, size), (y, -size, size),
              xlim=(-size*1.1, size*1.1), ylim=(-size*1.1, size*1.1))
plt.rcParams['figure.figsize'] = (5, 5)
```
plot_implicitを使うと、$y=f(x)$のような形にしなくても、数式をうまくグラフにしてくれます。数式を入力して、plot_implicitで$x,y$の範囲などを指定するとだけでグラフができてしまいます。あとは、matplotloibのplt.rcParamsで、グラフの大きさなどを指定して完成です。結果は次のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258643/e3dedb66-44b5-db19-74f6-fea35d0ea582.png)

# 双曲線の描画
次に双曲線を描いてみます。
式は、$x^2 - y^2 =1$になります。プログラムとグラフは次の通りです。

```python3:必要なモジュールなどをimport
#双曲線の描画
var('x,y')
size = 5
f= x**2 - y**2 - 1
plot_implicit(f, (x, -size, size), (y, -size, size),
              xlim=(-size*1.1, size*1.1), ylim=(-size*1.1, size*1.1))
plt.rcParams['figure.figsize'] = (5, 5)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258643/d14b8c4c-1cd7-b824-81c7-90d8ae609164.png)

# 交わる２直線
最後に交わる２直線を描いてみます。式は、$f= x^2 - y^2 - 0$です。
プログラムとグラフは次の通りです。

```python3:必要なモジュールなどをimport
 #交わる曲線の描画
var('x,y')
size = 5
f= x**2 - y**2 - 0
plot_implicit(f, (x, -size, size), (y, -size, size),
              xlim=(-size*1.1, size*1.1), ylim=(-size*1.1, size*1.1))
plt.rcParams['figure.figsize'] = (5, 5)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258643/e3900076-8eb8-a315-5f1c-08ad3e5e0c6b.png)

# まとめ
いきなり特殊なものを機能を使いましたが、とても便利であると思います。ただし、３次元になるとplot_implicitは使えないようなので、ほかのモジュールを使う必要があります。これについては、もう少し研究してます。
whileループで使用するタイマー

# やりたいこと

低温調理器の作成用に、タイマーを作成しました。
流儀的には、threadingを使用するのが良いのかなと思いましたが、自分の知識の範囲でさくっと作ってみました。

whileループでの使用を想定しておりまして、設定時間内であればTrueを返し続け、設定時間を超えるとFalseを返すという仕様です。
タイマーは、インターバルと、処理時間を事前に設定し稼働させます。

インターバルの時間を短くすると、処理時間の精度が向上します。

処理時間に求められる精度は、用途によってまちまちなので可変にしました。

低温調理の場合は、処理時間が数時間となることが多いのでさほど短いインターバルで回さなくても大丈夫でしょう。

```python:python
import sys
import time

print('何時間後にとめますか？')
hour = float(input())
set_time = hour * 60*60
print(str(set_time) + '秒後にとめますね')

print('カウント間隔')
interval = float(input())
print(str(interval) + 'sec 間隔で数えます')

class Countdown_Timer:
    def Timer(self,t):
        time_now = time.time()
        delta_time = time_now - start_time
        while delta_time < t:
            time_now = time.time()
            delta_time = time_now - start_time
            time.sleep(interval)
            flag = True
            return flag
        else:
            global time_measured
            time_measured = delta_time
            flag = False
            return flag


timer = Countdown_Timer()
start_time = time.time()

print('start Timer')
while timer.Timer(set_time):  
#    print('Timer On')
    pass
else:
    print('Timer Off')
    print('時間は ' + str(time_measured)+' 秒でした。')
    print('誤差は ' + str(time_measured - set_time) + ' 秒です。')
```

低温調理では、処理時間を時間単位で設定することが多いため、処理時間の入力を時間単位としています。

起動すると、こんな感じになります。

＞input()のエコーをなくしたい。

```
何時間後にとめますか？
0.002
7.199999999999999秒後にとめますね
カウント間隔
0.3
0.3sec 間隔で数えます
start Timer
Timer Off
時間は 7.243600845336914 秒でした。
誤差は 0.04360084533691477 秒です。
```
Ruby　条件分岐,ループ処理を利用した簡易的なゲーム作成

Rubyでじゃんけんゲームを作成していて、つまづいた箇所を記載していきます。
####つまづいた箇所

```Ruby
puts "数字を入力してください。"
puts "0:グー, 1:チョキ, 2:パー"

     input_hand = gets.to_i
  while true
    if input_hand == 0 #if 条件を書く(「input_hand」(取得した値)が「0, 1, 2」のいずれかの場合だった場合)
      return input_hand #「input_hand」(取得した値)をそのまま返します。
    elsif input_hand == 1
      return input_hand
    elsif input_hand == 2
      return input_hand
    else 
      puts "もう一度数字を入力してください。"
      puts "0:グー, 1:チョキ, 2:パー"
      input_hand = gets.to_i
    end  
  end 
#以降じゃんけんをさせる処理を記載   
```
最初はこう記載し、処理を実行させてみました。すると、
0~2以外の数字を入力した場合は正しい動作(elseの処理)をしますが、文字列を入力した場合、0:グーを入力したとみなされ、処理されてしまいました。
この原因は、gets.to_iをinput_handに代入していたことでした。
to_iメソッドとは、整数に変換するメソッドです。
これを文字に使うと、0になるというメソッドの仕様があります。したがって、文字列を入力した際に0となり、処理されたということでした。
これを解決する一つの方法として、私はこのようにコードを書きました。

```Ruby
puts "数字を入力してください。"
puts "0:グー, 1:チョキ, 2:パー"

     input_hand = gets.chomp
  while true
    unless input_hand == "0" || input_hand == "1" ||
  input_hand == "2"
    puts "0〜2の数字を入力してください。"
  else
    return input_hand.to_i
  end
      puts "もう一度数字を入力してください。"
      puts "0:グー, 1:チョキ, 2:パー"
      input_hand = gets.chomp 
  end 
#以降じゃんけんをさせる処理を記載   
```
gets.to_iの部分を、gets.chompに変更したことで、入力した数字も文字列情報として扱われます。それにより、入力したモノをそのままの形で条件分岐に入れることができます。
また、input_handが0,1,2の数字でなければ、"0〜2の数字を入力してください。"→"もう一度数字を入力してください。"という表示がされるような処理になっています。そして、0,1,2の数字を入力することで、入力したキーボードから返ってきた文字列を整数に変換して返してくれます。
こうすることで、純粋に0,1,2以外の数字と文字は受け付けなくなりました。
Makefile: help 自動生成に快適な生活ライフを送る

# Makefile: help 自動生成に快適な生活ライフを送る

## 目的
今までMakefileのhelpをちまちま書いていたのだが、
コマンドと離れているため可読性に欠けていた。

この章では、コマンドに対してhelpの内容を記述してhelpに反映させることを実現します

## 実践
今回 `make2help`というCLIを使用します。

### インストール方法
```
go get github.com/Songmu/make2help/cmd/make2help
```

Makefileをスキャンし、ドキュメントとともにルールを表示します。
ルールがドキュメントとして記述される直前に、ダブルハッシュ（`##`）で始まるコメント行を考慮します。

以下がサンプルのMakefile です。

```:Makefile
SHELL := /bin/bash
.DEFAULT_GOAL := help

help:
	@make2help $(MAKEFILE_LIST)

## Note that the API server must
## also be running.
start:
	@gopherjs -m -v serve --http :3000 github.com/tj/docs/client

## Start the API server.
api:
	@go run server/cmd/api/api.go

## Display dependency graph.
deps:
	@godepgraph github.com/tj/docs/client | dot -Tsvg | browser

## Display size of dependencies.
##- Any comment preceded by a dash is omitted.
size:
	@gopherjs build client/*.go -m -o /tmp/out.js
	@du -h /tmp/out.js
	@gopher-count /tmp/out.js | sort -nr

.PHONY: start api deps size help
```

Makefileでヘルプターゲットを定義し、`.DEFAULT_GOAL`に設定すると、makeと入力するだけでヘルプメッセージを表示できます。

以下が結果となります

> api:               Start the API server.
deps:              Display dependency graph.
start:             Note that the API server must
                   also be running.


## まとめ
いかがでしたでしょうか？

今回のサンプルはこちらに載せておきます。
https://github.com/locona/make2help

これからも便利なツールをご紹介していくので、他にも良いツールがありましたらコメントで教えていただけると嬉しいです。
クライアントのブラウザからスパコン ITO の Jupyter に接続

ポート転送を利用して，クライアントのブラウザ（Windows 10 Pro の Chrome で検証しています）から，[スパコンITO](https://www.cc.kyushu-u.ac.jp/scp/index.html) のログインノードで起動した，Jupyter Notebook（JupyterLab も可能）に接続する方法を紹介します．これによりスパコン上での計算結果をそのまま解析図化できるようになり，大変便利です．クライアントでは [MobaXterm](https://mobaxterm.mobatek.net/) を利用します．
この方法はスパコンでの利用に限らず，ポート転送を利用して，クライアントのブラウザからサーバー上で起動した Jupyter に接続する方法として，一般性のあるものです．[こちらの資料](https://www.cc.kyushu-u.ac.jp/scp/support/faq/faq008.html)を参考にさせて頂きました．

# 事前の準備：SSHエージェントの有効化
[MoberXterm](https://mobaxterm.mobatek.net/) の `Settings -> Configuration -> SSH` をクリックします．一番下にある `SSH agents` の `Use internal SSH agent "MobAgent"` にチェックを入れ，その下のボックスの右にある `十字マーク` をクリックし，秘密鍵を（拡張子ppk）追加して，`OKボタン` をクリックします．
加えて，タイムアウトで SSH が切れるのを抑制するため，MobaXterm の `Settings -> Configuration -> SSH` において，`SSH keepalive` にチェックを入れておくとよいでしょう．
これらの作業は一度だけ必要です．

# 手順

### ログインノードで Jupyter を起動
スパコンのログインノードで Jupyter Notebook をブラウザ無し（`--no-browser`）で起動します．

```bash
$ jupyter notebook --ip=127.0.0.1 --port=8888 --no-browser
```

これにより以下のような表示が最後の方に現れます．この部分を後ほどクライアントのブラウザのURLにコピーペーストします．

```bash
http://127.0.0.1:8888/?token=...
```

JupyterLabの場合も同様に起動します．

```bash
$ jupyter lab --ip=127.0.0.1 --port=8888 --no-browser
```

### ローカルポート転送で，Jupyter へのアクセス経路を構築
MobaXterm のタブ横の `+` をクリックして，新しいターミナルを開きます．これはローカルターミナルと呼ばれるものです．このローカルターミナルで以下を実行します．ただし，`m00000a` はユーザアカウントです．

```bash
ssh -o ProxyCommand='ssh -W %h:%p %r@ito.cc.kyushu-u.ac.jp' ito.cc.kyushu-u.ac.jp -l m00000a -L 8888:localhost:8888
```

しばらく待つと，スパコンのターミナルが現れますので，それまで待ちます．

### クライアントのブラウザで先のURLにアクセス
ログインノードで Jupyter を起動した際に現れた URL（`http://127.0.0.1:8888/?token=...`）をクライアントのブラウザの URL にペーストしてアクセスします．これで，クライアントのブラウザ内で Jupyter が現れます．
注意： MobaXterm で URL をコピーする際は，マウスで URL を選択するだけです．Ctrl-C ではありません．
-これからポートフォリオを作成する方へ-　設計図の作成方法：後半

先日の記事に続き、後半をまとめていきます。
残すはサイトマップと、ワイヤーフレームです。
このあたりを整理することは、Ui/UXに繋がる部分です。バックエンドエンジニアを目指す方は、フロント分野に対し高度な技術は要求されませんが、UI/UXは評価されるポイントなのでこだわることをオススメします。

サイトマップ・ワイヤーフレーム作成時はこちらを参考にしました。
ポートフォリオサイトの作り方と制作過程を解説【Webポートフォリオ】
https://fuyuna.net/portfolio-designer-web

#●サイトマップ
画面変移図のことです。
ページのリンクを整理するために必要になります。
![スクリーンショット 2020-04-10 22.28.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553621/0f95aba9-6eb9-42e5-ba51-957b68104be5.png)

これを作成しておくと、ポートフォリオの全体像を把握できたり、各ページのリンクをまとめることができます。


#●ワイヤーフレーム
ページレイアウトのことです。
各ページ、どのようなレイアウトにするのかまとめておきます。
![スクリーンショット 2020-04-10 22.30.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553621/e39406e4-2621-f598-2b93-315fd6d865de.png)

UI/UXに大きく関わってくる部分ですね。なぜそのサービスを作成したのか。そしてそのサービスの対象者は誰なのかを意識し決定していくと良いでしょう。
自分はヘルスケア相談サイトを作成中であり、対象者の年齢が幅広いことを想定しています。なので、webに対し不慣れな方でも扱いやすいように、シンプルさと手軽さを求めました。

こちらを参考に、作成しました。
「エンジニアでも知っておきたいデザインの基礎知識」
https://qiita.com/laineus/items/c43d302e974380993fca
ここまでで設計図の作成は終了です。
大分ざっくりでしたが、全体像は掴んで頂けたかと思います。

今後もこのような形で、自分がポートフォリオ作成時に悩み、かつ悩んでる方も多そうな出来事は記事にしていく予定ですので、是非参考にしてみてください。
kNN(k-nearest neighbor algorithm、k近傍法) -考え方-

kNN(k-nearest neighbor algorithm、k近傍法)の考え方

* 参考にしたもの：[機械学習のエッセンス](https://www.sbcr.jp/product/4797393965/)の第05章「機械学習アルゴリズム」

# k近傍法とは

* 機械学習における、教師あり学習の手法
* 予測も分類もイケる
* 教師データを取り込んでおいて、予測(分類)したいモノの近くにある教師データをもとに予測(分類)する

# 考え方

1. 教師データを取り込む(説明変数、目的変数の両方)
2. 予測したいデータの説明変数を取り込む
3. 予測したいデータの近くにある教師データから、目的変数を予測する

* 近く何個分の教師データを参考にするかは、手動で決める
* 近いデータと遠いデータで重みづけするかも、手動で決める

(「[距離の種類](https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsRegressor.html#sklearn.neighbors.KNeighborsRegressor)」「[近い点の探し方](https://scikit-learn.org/stable/modules/neighbors.html#nearest-neighbor-algorithms)」とかもあるけど、一旦省略)

# 特徴

* 複雑な境界のデータにも適用可能
* 「データ数が小さい」「次元が小さい」場合に向いてる
  * データ数が大きいと
     * 距離が近いものを探すのに時間がかかる
     * 学習データ保持に容量が必要になる
  * 次元が高いと
     * 未知データの近くに学習データが見つかりにくい

# 例

* とりあえず、超簡単に↓で考えてみる
* 説明変数は、それぞれの点の座標
* 目的変数は、**<font color="Blue">青=1</font>、<font color="Red">赤=-1</font>**にしてある

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/c6ddb641-0af6-9324-fa4f-da9ef37ac035.png)

* ここに↓の緑の点が新しくできたとして、目的変数がどのくらいなのか予測する

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/70625927-fd14-88c8-acf7-6bb5df5e50ff.png)

| 何個分を使うか    | 重みづけ    | 予測値 | コメント |
|:-----------------|:------------|:------|:--------|
| 1                | -           | -1    | 一番近くの赤(-1) |
| 3                | 平等        | -0.33 | 赤(-1)が2つ、青(1)が1つの平均 |
| 3                | 距離に反比例 | -0.64 | 青よりも近い赤が重視されてる |
| 5                | 平等        | -0.2  | 赤(-1)が3つ、青(1)が2つの平均 |
| 5                | 距離に反比例 | -0.48 | 青よりも近い赤を重視 |

# 参考にしたもの

* サイト
  * [k近傍法(Wikipedia)](https://ja.wikipedia.org/wiki/K%E8%BF%91%E5%82%8D%E6%B3%95)
* 本
  * [東京大学のデータサイエンティスト育成講座](https://www.amazon.co.jp/gp/product/B07PD237GQ/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1)
  * [見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑](https://www.amazon.co.jp/gp/product/B07KPSJKH8/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1)

# 図作ったときのコード置き場

* scikit-learnに放り込んだだけ: https://github.com/kzy611/qiita/blob/master/kNN_sample.ipynb
PythonでMIDIをMP3形式またはWAV形式に変換 (Google Colaboratory)

# まえがき
この記事はPythonをオンラインで実行できる環境「Google Coraboratory」にて、MIDIをMP３形式またはWAV形式に変換して再生するため手順を書いたものです。
以下に書いた手順通りに実行してください。input.midは変換したいMIDIをご自分で用意してください。

# ①fluidsynthを事前にダウンロード
```shell
!apt install fluidsynth
!cp /usr/share/sounds/sf2/FluidR3_GM.sf2 ./font.sf2
!pip install midi2audio
```

# ②midi2audioを使ってMIDIを変換

```python
from midi2audio import FluidSynth
# サウンドフォントを指定する
fs = FluidSynth(sound_font='font.sf2')
# 入力するmidiファイルとアウトプットファイル
fs.midi_to_audio('input.mid', 'output.mp3') # またはoutput.wav
```

# ③再生
```python
from IPython.display import Audio
Audio('output.mp3')
```
The requires the 'control-flow-collections' experiment to be enabled. の解決法

<img width="968" alt="スクリーンショット 2020-04-10 21.27.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261020/8f67c417-156e-c471-dd60-78ef07f65300.png">

`The requires the 'control-flow-collections' experiment to be enabled.`だの、
`The requires the 'spread-collections' experiment to be enabled.`だの、
注意メッセージが表示されることがあります。
放置していてもbuildには支障をきたさないものの、補完機能や構文エラーチェック機構が機能しなくなるので、地味に不都合。
その解決法です。
一応、StackOverflowには解決方法が載っていますが、日本語記事は見当たらなかったので書き残しておきます。

### ①analysis_options.yamlファイルを新規作成する
VSCodeにせよ、Android Studioにせよ、エディタには構文エラーチェック機構が備わっています。
analysis_options.yamlはその構文エラーチェック機構を、自分でカスタマイズすることができるファイルです。

### ②下記のように記載する
要はこのエラーは、Dart 2.3から追加されたcollection ifとかの文法で、うまく構文エラーチェック機構が働かない事によるエラーというわけみたいです。
ですので、以下のように修正しますい。

```analysis_options.yaml
analyzer:
  enable-experiment:
    - spread-collections
    - control-flow-collections
```

### ③pubspec.yamlファイルを修正する
environmentのsdkはDartの動作環境の規定。
Collection ifやスプレッド演算子は、Dart 2.3から導入されているので、それ以上が望ましいと思われます。
自分は2.5.2としているけれど、たぶん2.3.0でも問題ないかと。

```pubspec.yaml
environment:
  sdk: ">=2.5.2 <3.0.0"
```

### ④エディタの再起動
綺麗さっぱりなくなりました。
<img width="721" alt="スクリーンショット 2020-04-10 22.09.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261020/55d5b7e6-b8dc-6f57-acbf-2d6161de7ae0.png">



参考にしたサイト
[flutter --flow-control-collections are needed, but are they?](https://stackoverflow.com/questions/59458433/flutter-flow-control-collections-are-needed-but-are-they)
[analysis_option.yamlをカスタマイズする](https://makicamel.hatenablog.com/entry/2019/04/07/235833)
[Pub パッケージ・マネージャ](https://www.cresc.co.jp/tech/java/Google_Dart2/development/pub/pub.html)
AWS 認定 デベロッパー – アソシエイトに合格しました。

#はじめに
こんにちは、本日試験を受験し合格いたしましたのでアプローチと出題傾向をお伝えいたします。
##アプローチ
###① 市販で売られている以下の書籍を一週間ほどかけて目を通す
「AWS認定アソシエイト3資格対策～ソリューションアーキテクト、デベロッパー、SysOpsアドミニストレーター～」
###② オンライン模擬テストを受講

###③ ハンズオンを三時間ほど着手

これで私は合格できました。

##出題傾向
* ElasticCashを使用してセッションをオフロード
* ApiGatewayのエイリアス機能
* Lambdaのデバッグ方法
* ECSのプラットフォーム別権限管理
* Kinesisの用途
* SQSのロングポーリングとショートの使い分け
* ElasticCashの書き込み方法の違い
* ApiGatewayのオーソライズにあたってLambdaを用いるかCognitoを用いるか
* DynamoDBのDAX.RCU.WCU.クエリの方法.インデックスの作成など
VSCodeでStyled-componentsを見易くするExtension

###はじめに

VSCodeのExtensionでStyled-componentsに記述するCSSをカラーリングして見易くしたい。
文献にヒットするまで少し時間かかったので、後に続く人のためにこの記事を残そうと思う。

---

###対象となる読者

`VSCode` `extension` `backquote` `backticks` `css` `color` などで必死にExtensionを探している方

---

### Vscode-styled-components

バッククオートの後でCSSに色を付けたい。

<img width="237" alt="スクリーンショット 2020-04-10 21.26.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170254/1ce8cc47-2c9b-fd24-f8b5-ab66ad2e9e1e.png">

あなたが探している Extensionは `Vscode-styled-components` ではないでしょうか？

[Vscode-styled-components](https://marketplace.visualstudio.com/items?itemName=jpoissonnier.vscode-styled-components)

このExtensionを入れるとこうなります。

<img width="240" alt="スクリーンショット 2020-04-10 21.49.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170254/38b6acea-4397-5af3-2675-03f81ba9d0e2.png">

やったね！
IQ Bot のカスタムドメインとは？


#IQ Botにおけるドメイン（＝ドキュメントタイプ＝帳票の種類）

[IQ Bot](https://qiita.com/IQBotter/items/fab5f59230ff38a98bbd)でインスタンスを作るときに、以下のようにドキュメントタイプを選択する欄があります。

ここで選択するドキュメントタイプを、ドメインといいます。
![101_ドメイン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/8febddb0-ca7e-4e6f-8e22-892bedc0d37f.jpeg)

#プリセットドメイン

デフォルトで選択肢の中にある、たとえば「Invoice」のようなドメインをプリセットドメインといいます。
プリセットドメインを選択すると、以下のように、その種類の帳票によくある項目の選択肢が表示されます。
それをチェックしたり外したりするだけで項目の定義ができます。
![102_プリセットドメイン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/94781d85-864c-fd4f-4ae9-a77339299fb2.jpeg)
足りない項目があれば増やすこともできます。

何それめっちゃ便利じゃん！　そのとおりめっちゃ便利です。

ですが残念ながら、プリセットドメインで扱える帳票は英語やドイツ語などのヨーロッパの言語ばかり……。
Invoiceは請求書という意味ですが、日本語の請求書はプリセットドメインに入っていないのです（涙）

![103_ﾌﾟﾘｾｯﾄドメイン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/dfcde35a-7ce1-67f2-405f-e481df1a8a45.jpeg)

だから日本語の帳票をIQ Botで扱うときは、「その他」のドメインを選ぶのが基本なんですね。

**だがしかし……！！！！！**

#カスタムドメイン

実は以下のように、プリセットにないドメインを自分で増やすことができます。
それをカスタムドメインといいます。

![104_カスタムドメイン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/60bea721-072b-00ea-9264-d3bb9e2007f1.jpeg)

カスタムドメインを選択すると、プリセットドメインと同じように、項目を選択肢として表示することができます。

![105_カスタムドメイン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/297666ce-9a01-4fd5-c207-cc49f0ae8a63.jpeg)

上記の例では４つしか項目を設定していませんが、もちろんこちらは自由自在に増やすことができます。

##カスタムドメインの３つの利点

###カスタムドメインのメリット①：項目を入力する手間が省ける

プリセットドメインと同じように、カスタムドメインを作っておくと、項目名をひとつひとつ入力する手間がなくなります。
これはある意味一番わかりやすいメリットですが、次の２つのメリットに比べればおまけのようなものです。

###カスタムドメインのメリット②：帳票からラベルを取得するキーを増やせる

[こちらの記事](https://qiita.com/IQBotter/items/b9f6bd9abeb4b9925744)でも記載したとおり、IQ Bot が帳票からラベルを取得する条件は、「定義した項目に対して、帳票上のラベルが前方一致していること」です。

ドメイン「その他」を選択してフィールド名を定義すると、IQ Botはその１つのフィールド名だけをキーに帳票上からラベルを探そうとします。
そうすると、帳票上のラベルが多岐に渡っている場合などに、IQ Botが帳票上のラベルをつかみそこねて分類がうまくできなくなる可能性があります。

カスタムドメインを作ると、**１つのフィールド名に対して、１：多の形でIQ Botが帳票上からラベルを探してくるキーを定義できる**ようになります。

これによって、**IQ Botの分類をより意図した形に近づけやすくなります。**

###カスタムドメインのメリット③：CSVの列名と帳票上のラベルのキーを切り分けられる

[こちらの記事](https://qiita.com/IQBotter/items/03063d0cb5412db47d46#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%A8%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AB%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B%E5%90%8D%E7%A7%B0%E3%81%AB%E3%81%AF%EF%BC%92%E3%81%A4%E3%81%AE%E6%84%8F%E5%91%B3%E3%81%8C%E3%81%82%E3%82%8B)にも書いたとおり、通常、フォームフィールドやテーブルフィールドの欄に入力する名称には通常、２つの意味があります。

でも、帳票上のラベルは「御請求金額」ってなってるけどCSVには「合計金額」という列名で出したい！　という場合はどうするの？

そんな場合にも、カスタムドメインなら対応できます。


また、分類の問題には直接関係ありませんが、帳票上からラベルを探すキーとCSVの列名を切り分けたい場合などにもカスタムドメインが使えます。

#カスタムドメインを作るには……？

カスタムドメインの作り方は、[こちらのページ](https://qiita.com/IQBotter/items/913163e8aa3a853e8990)で紹介しています。

なお、Community EditionではカスタムドメインはPOSTできないのでご注意ください。
Rubyのインストールでエラーになった

リモートワークで少し時間が出来たので
railsチュートリアル用にローカル環境を構築しようと思ったらrubyのインストールでハマったので備忘


`$ rbenv install 2.6.3`

上記コマンドで下記のようなエラーになった。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
configure: error: clang version 3.0 or later is required
```

OSアップデートの影響らしい
下記コマンドを実行してxcodeをインストールしたら無事にrubyのインストールできました

```
$ rbenv install 2.6.3
ruby-build: use openssl from homebrew
Downloading ruby-2.6.3.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.3.tar.bz2
Installing ruby-2.6.3...
ruby-build: use readline from homebrew
Installed ruby-2.6.3 to /Users/name/.rbenv/versions/2.6.3
```

rubyのインストールができたので
railsの環境構築に進みます！




以下参考にさせていただきました。ありがとうございます:bow: :bow: :bow:
https://qiita.com/nishina555/items/e23d73067a5cac182a63
BuefyのCollapseでiconが変わらない時の対処

buefyのcardのようにクリックしたら詳細を表示させる際に少し詰まったので対応のメモです。
https://buefy.org/documentation/collapse#card

buefyのバージョンは `0.8.13` です。

## toggleさせた際にアイコンを変更したい
ドキュメントに記載されているように、表示されている時と、表示されていない時でアイコンを変更したかったです。
そのままコピペしてみても、アイコンのみ変わりませんでした。どうやらb-iconが再描画されていないようです。。

## 対応方法
b-iconが再描画されていないようでしたので、:keyをpropsの値にすることで、toggleの際にkeyを変更させるようにしました！

```vue
<b-icon
  :key="props.open"
  :icon="props.open ? 'menu-down' : 'menu-up'"
/>
```


## propsは変更されていた
下記のcodepenの内容のようにpropsを表示させてみると、propsは変更されていました。(vue-devtoolsでみても同様)
https://codepen.io/shubhrajthakur/pen/WygOKM
wsl Ubuntu18.04にPostgreSQLをインストールする

備忘録を兼ねてメモ
インストール後の操作についても記録しておきたい

##環境
・ホストOS: Windows10 Home
・ゲストOS: wsl Ubuntu18.04 LTS
・PostgreSQL12.2

##手順
基本的に全てPostgreSQL wiki(https://wiki.postgresql.org/wiki/Apt) に基づいて作業を行います。公式webページよりも理解しやすいです。

① リポジトリを追加する

```
sudo apt-get install curl ca-certificates gnupg
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add
```

② リストの作成

```
deb http://apt.postgresql.org/pub/repos/apt bionic-pgdg main
```

③ パッケージのアップデートとPostgreSQLのインストール

```
$ sudo apt-get update
  sudo apt-get install postgresql
```

④ バージョンの確認

```
$ psql --version
  psql (PostgreSQL) 12.2 (Ubuntu 12.2-2.pgdg18.04+1)
```

psqlのバージョンが表示されれば無事インストールができています。

##参考資料

[PostgreSQL wiki](https://wiki.postgresql.org/wiki/Apt)
gitで管理されているファイルを自分のローカルだけ管理対象から外す

ローカルで自分だけの設定など、あるファイルが編集状態にあり、間違ってコミットしないようにする時に便利。

## 管理対象から外す

```
git update-index --skip-worktree 【ファイル名】
```

## 管理対象外のファイルを確認する

```
git ls-files -v | grep ^S
```

## 管理対象に戻す

```
git update-index --no-skip-worktree 【ファイル名】
```
JSON からクラスを生成してくれる quicktype の Visual Studio 2019 用拡張機能作りました

これ書いてて思ったんですよ…

[JSON から C#、TypeScript、Swift、Go などの型定義を生成してくれる VS Code 拡張機能](https://qiita.com/okazuki/items/42ebb8c0524a2e12cfd0)

Visual Studio Code じゃなくて Visual Studio 2019 でも使えないの？？って。[quicktype の GitHub リポジトリ](https://github.com/quicktype/quicktype)には Visual Studio Extensions というリンクがあって、そこをクリックすると [Paste JSON as Code -quicktype](https://marketplace.visualstudio.com/items?itemName=typeguard.quicktype-vs) に移動します。

でも、Visual Studio 2017 用なんですよね…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/26a368ce-a193-f3c0-8d11-9cdab8b29719.png)

Visual Studio Code の拡張機能があるからいいか…と思ってたのですが、普段一番書くことが多い C# では Visual Studio 2019 を使うので、やっぱり Visual Studio 2019 でも使いたいということで作りました。

[Quicktype for Visual Studio(Unofficial)](https://marketplace.visualstudio.com/items?itemName=okazuki.quicktype-vs2019-unofficial)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/e8d41684-9999-4974-a125-8ac49610921b.png)

**使うためには `npm install -g quicktype` しておく必要があります。**

拡張機能をインストールすると Paste JSON as Code というメニューが編集メニューの下に出来るので JSON をコードとして貼り付けできます。

![extensions.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/4ac84a15-966f-516e-ca4a-523ac917e92c.gif)

## まとめ

quicktype はいいぞ。
Arduinoで照度計を作成し、ログをCSV形式で保存する

##概要
Arduinoを使って照度計を作成し、そこで取れた照度のログをPythonで受け取ってPCにCSV形式で保存するコードを実装した.

##Arduinoで照度計を作成
まずは照度計を作る部分について

使った材料は主に以下の4つ
- Arduino Uno
- ブレッドボード
- フォトトランジスタ（光のセンサー）
- 220Ωの抵抗×1

配線の概要は下の図のようになる.
照度計によって流れる電流の変化をA0端子でAnalogReadしている.
<img width="974" alt="スクリーンショット 2020-04-10 20.35.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391115/62f12a62-785b-501d-5e32-b0e01fd9e459.png">

以下がArduinoに実装したコードになる.

```C++:illuminator.ino
int sensorValue = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  
  sensorValue = analogRead(A0);
  Serial.println(sensorValue);

  delay(1000);
}
```

この状態で照度のログがちゃんと出力されるか確認しておくといいと思う.

##PythonでArduinoのログを受け取る
PySerialというモジュールを使ってArduinoからのログを受け取るらしい.
以下のコマンドでモジュールをインストール.

```
pip install pyserial
```
以下のコードでログをCSV形式で保存する.

```python:save_serial.py
import sys
import serial
import datetime
import csv

ser = serial.Serial('/dev/cu.usbmodem14101',9600) #ポートの情報を記入

while(1):
    value = int(ser.readline().decode('utf-8').rstrip('\n'))
    date = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(date,value)
    with open('test.csv', 'a') as f:
        print('{},{}'.format(date,value),file=f)
```

このコードを実行すると以下のようにdatetimeと値のログがCSV形式で保存される.
<img width="1361" alt="スクリーンショット 2020-04-10 20.51.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391115/7d6ce608-b360-ae62-9766-23f26d53395c.png">

窓際に照度計を設置してグラフで照度の時間変化を表すと以下のようになった.
暗くなる様子がうまく表れている.
<img width="1322" alt="スクリーンショット 2020-04-10 20.56.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391115/e2df7629-df88-f8b6-4b47-4ad497a2b5b9.png">
pythonで文字列を自然順（番号が小さい順）ソート

`sorted`は辞書順になってしまい、数値が小さい順に並ばない。
正規表現を使えば簡単に自然順にできるけど、毎回書くのが面倒なのでメモ。

### 文字列の場合
```python3
l = ['1', '10', '2']

import re
sorted(l, key=lambda x: tuple(map(int, re.findall(r'\d+', x))))
```

### 文字列じゃない場合（pathlib.Pathなど）
```python3
from pathlib import Path
l = [Path('1'), Path('10'), Path('2')]

import re
sorted(l, key=lambda x: tuple(map(int, re.findall(r'\d+', str(x)))))
```

### ライブラリを使う場合
[natsort](https://pypi.org/project/natsort/)というのがある。
リフレッシュトークンを使用して Azure AD からアクセストークンを取得する (C#)

# リフレッシュトークンを使用して Azure AD からアクセストークンを取得する (C#)

\# 以下の記事が書かれた時の版数は .NET Core 3.1 (3.1.24) となります.

[Microsoft.Extensions.Configuration を使って、INI ファイルに書いた設定を読み込む](https://qiita.com/c-yan/items/3e0b2503d26693140457) と [続 JSON をクラスにバインドする (C#)](https://qiita.com/c-yan/items/c0a226c83d339a9662a7) で書いたコードを使っているので、その部分についてはそちらを参照してください.

```csharp
using ConsoleApp1.Configs;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static readonly AppConfig Config = AppConfig.Get();
        static readonly HttpClient HttpClient = new HttpClient();

        static async Task<string> GetAccessToken()
        {
            var body = new Dictionary<string, string>()
            {
                { "client_id", Config.OAuth.ClientID },
                { "client_secret", Config.OAuth.ClientSecret },
                { "grant_type", "refresh_token" },
                { "refresh_token", Config.OAuth.RefreshToken },
                { "scope", Config.OAuth.Scope },
                { "redirect_uri", Config.OAuth.RedirectUri }
            };
            var url = $"https://login.microsoftonline.com/{Config.OAuth.TenantID}/oauth2/v2.0/token";
            var response = await HttpClient.PostAsync(url, new FormUrlEncodedContent(body));
            return JsonSerializer.Deserialize<AzureADResponse>(await response.Content.ReadAsStringAsync()).AccessToken;
        }

        static void Main(string[] args)
        {
            Console.WriteLine(GetAccessToken().Result);
            Console.ReadLine();
        }
    }
}
```
コロナウィルス日本国内累計感染者数を予測してみた。

コロナで緊急事態宣言が出た昨今、皆様いかがお過ごしだろうか？

累計感染者数の推移をグラフ化すると指数関数的になると聞いて、今後の累計感染者数を予測してみた。

指数を算出するのに厚生労働省の定例報告の数値をベースにすると、

2020/4/8発表の4/7時点累計感染者数:4168
2020/4/9発表の4/8時点累計感染者数:4667


※参考：
新型コロナウイルスに関連した患者等の発生について(４月８日公表分)  https://www.mhlw.go.jp/stf/newpage_10785.html
新型コロナウイルスに関連した患者等の発生について(４月７日公表分)  https://www.mhlw.go.jp/stf/newpage_10724.html


「aをe乗するとbになる」と言う関係になる「e」が「指数」となるのだが、javascriptで算出するとこんな感じでできる。

```javascript
const e= Math.log(b)/Math.log(a);
```

これを利用して、「4/7の国内累計感染者数をe乗すると4/8の国内累計感染者数になる」という「e」を基準となる指数として「days」日後までの累計感染者数を予測する関数がこちら。

```javascript
const predict = (days,a=4168,b=4667,f=Math.log,e=f(b)/f(a))=>[...Array(days)].map(_=>~~(a=a**e));

console.log(predict(30)); // 30日後までの国内累計感染者数を計算してみる。

// [  4667,   5233,   5878,  // 4/9 - 4/10の予測値
//    6613,   7451,   8409,   9506,  10764,  12208,  13871, 15787, 17999, 20558,  // 4/11-4/20の予測値
//   23524,  26966,  30969,  35633,  41078,  47446,  54908, 63671, 73980, 86134,  //4/21 - 4/30の予測値
//  100491, 117487, 137648, 161617, 190173, 224269, 265070 ] // 5/1 - 5/7の予測値
```

緊急事態宣言が終わる予定の5/6時点でこれらの数字より感染者数が大幅に減っていたら、事態は収束に向かっていると言えるような気がする今日この頃、みんながんばろー。
JSON をクラスにバインドする (C#)

# JSON をクラスにバインドする (C#)

内容が古くなってしまったので、こちらを見てください＞[続 JSON をクラスにバインドする (C#)](https://qiita.com/c-yan/items/c0a226c83d339a9662a7)

\# 以下の記事が書かれた時の版数は .NET Core 3.1 (3.1.201) となります.

JSON を C# のクラスにバインドする. まずバインド先のクラスを作る. 都合により Azure AD のレスポンス.

```csharp
using System.Runtime.Serialization;

namespace ConsoleApp1
{
    [DataContract]
    public sealed class AadResponse
    {
        [DataMember(Name = "token_type")]
        public string TokenType { get; set; }

        [DataMember(Name = "scope")]
        public string Scope { get; set; }

        [DataMember(Name = "expires_in")]
        public string ExpiresIn { get; set; }

        [DataMember(Name = "ext_expires_in")]
        public string ExtExpiresIn { get; set; }

        [DataMember(Name = "access_token")]
        public string AccessToken { get; set; }

        [DataMember(Name = "refresh_token")]
        public string RefreshToken { get; set; }

        [DataMember(Name = "id_token")]
        public string IdToken { get; set; }
    }
}
```

次に DataContract のヘルパーを作る.

```csharp
using System.IO;
using System.Runtime.Serialization;
using System.Text;

namespace ConsoleApp1.Helpers
{
    public static class DataContractHelper
    {
        public static string Serialize<T>(XmlObjectSerializer serializer, T obj)
        {
            using (var stream = new MemoryStream()) {
                serializer.WriteObject(stream, obj);
                stream.Position = 0;
                using (var sr = new StreamReader(stream))
                {
                    return sr.ReadToEnd();
                }
            }
        }

        public static T Deserialize<T>(XmlObjectSerializer serializer, string s)
        {
            using (var stream = new MemoryStream())
            {
                var sBytes = Encoding.UTF8.GetBytes(s);
                stream.Write(sBytes, 0, sBytes.Length);
                stream.Position = 0;
                return (T)serializer.ReadObject(stream);
            }
        }
    }
}
```

最後に DataContract を利用して、JSON を処理するヘルパーを作る.

```csharp
using System.Runtime.Serialization.Json;

namespace ConsoleApp1.Helpers
{
    public static class JsonHelper
    {
        static readonly DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings() { UseSimpleDictionaryFormat = true };

        public static string ToJson<T>(T obj)
        {
            return DataContractHelper.Serialize(new DataContractJsonSerializer(typeof(T), settings), obj);
        }

        public static T ToObject<T>(string json)
        {
            return DataContractHelper.Deserialize<T>(new DataContractJsonSerializer(typeof(T), settings), json);
        }
    }
}
```

後は Azure AD のレスポンスの文字列が変数 s に入っているとすれば、以下でバインドできる.

```csharp
JsonHelper.ToObject<AadResponse>(s)
```

また、AadResponse 型の変数 a から JSON 文字列を作るのは以下になる.

```csharp
JsonHelper.ToJson(a)
```
ICBI の MATLAB コードを GNU Octave で動かす

機械学習以前のレガシーな超解像変換のひとつ ICBI を試すのに参照コードが MATLAB で、それを Octave で動かすだけのメモ書きです。

- http://www.andreagiachetti.it/icbi/

なお、以前、iNEDI で似た事をしたのですが、それより少し手順を改善してます。

# 準備 

## Octave インストール

- Ubuntu だと snap install octave
- macOS は brew install octave で良いでしょう。

## octave forge

image パッケージを入れます。

- https://octave.sourceforge.io/packages.php
  - https://octave.sourceforge.io/image/index.html

```
$ octave
GNU Octave, version 4.2.2
(略)
octave:1> pkg install -forge image
For information about changes from previous versions of the image package, run 'news image'.
octave:2> pkg list
Package Name  | Version | Installation directory
--------------+---------+-----------------------
       image  |  2.12.0 | /home/yoya/octave/image-2.12.0
```

## 環境設定 (.octave)

octave コマンドを引数なしで実行して対話モードに入り、毎度 pkg load image しても良いですが、.octave に一行入れるとサボれます。

- .octave

```
pkg("load", "image");
```

また、ICBI は div zero の警告が大量に出て、メッセージが埋もれるので以下の設定も入れると良いでしょう。

```
warning("off","Octave:divide-by-zero");
```

警告が減って、大事なメッセージを見落としにくくなります。ICBI を試した後はコメントアウトしとくと良いでしょう。

# 変換

- https://github.com/yoya/ICBI/blob/master/icbi/icbiexample.m

なお自分は imshow をコメントアウトして、imwrite をコメントから戻して実行してます。

```
% octave icbiexample.m
ICBI function example.
This is an example script that shows you how to use the icbi.m function.
Please check the documentation inside this file for further information.

[   0.000 sec] LAYER: 01
[   0.000 sec]    ZF: 01
[   0.012 sec]        PHASE: 00
warning: division by zero
warning: called from
    icbi at line 375 column 34
    icbiexample at line 55 column 10
(略)
[4615.394 sec]        PHASE: 01
warning: division by zero
warning: called from
    icbi at line 375 column 34
    icbiexample at line 55 column 10
(略)
[5796.262 sec] END
```

|testimage.png|testimage_icbi.png|
|---|---|
| ![testimage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798/6c9e0f8d-7dfb-215d-33bf-0dc42bcf78bc.png) | ![testimage_icbi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798/4faf2df7-b2c3-f374-7c79-afab73f3066f.png)|

128x128 を 255x255 にするのに 1時間36分！！！　なかなか重たいアルゴリズムのようです。

# 追記

MATLAB (2020年版)で試したところ、約2秒でした。 3000倍近く速い。。
恐らくは、div zero 警告の出力に足を引っ張られているのでしょう。
【ruby】『ruby入門(メモ1)』初めてのrubyプログラム(hello dinosor)＋コメント

###0.はじめに
前回、ruby on railsに超入門したが、文法など何も知らない状態でスタートしていた。
何も基礎的な事を知らないのに、webアプリが作れることはrailsが素晴らしさでもあり、
怖さでもある。
scaffoldから少しでも踏み出すために文法を学ぶつもりだ。

__そしてプログラムのどこかに恐竜の名前を出すことも心がけていく。(結構重要)__

###１．初めてのrubyプログラム
下記はprintで指定した文字列を出力するプログラム

```ruby:ruby1-1.rb
print("hello dinosor")
```

###２．実行方法

以下コマンドをプログラムのあるディレクトリを入力する。
__ruby プログラム名__

```

c:\ruby_pg>ruby ruby1-1.rb
hello dinosor
c:\ruby_pg>
```

###３、コメント記述法(一行)

__文字列の前に#を入力するとその行がコメントとみなされる__

```ruby:ruby_comment.rb

#dinosor comment
print("dinosor")

```
###４、コメント記述方法(複数行)

__=begin と=endの間に記載された文字列は、コメントとみなされる。__


```ruby:ruby_comment.rb
#下記は複数にわたるコメント
=begin
ティラノサウルス
インドミナスレックス
インドラプトル
これらは全てコメント
=end
print("dinosor2")
```
###５．実行結果

コメント部分は出力されないことがわかる。

```
c:\ruby_pg>ruby ruby_comment.rb
dinosordinosor2
c:\ruby_pg>
```



###６.参考url
下記場所で学んでいることをアウトプットとして残そうと思う。

1.[ruby入門(dotinstall)](https://dotinstall.com/lessons/basic_ruby_v3)
Power BIで対数スケールを使ってデータを可視化する

#はじめに
現在、新型コロナウイルスの感染拡大で、日々の感染者数の推移に注目が集まっています。
指数関数的に増加するデータは、対数スケールを用いると傾向を視覚的に理解しやすくなります。
#サンプルデータ
ここでは、J.A.G Japan社 都道府県別新型コロナウイルス感染者数マップのデータを利用します。
Creative Commons「BY-NC 国際4.0」で公開されており、下記サイトにデータに関する説明があります。
https://jag-japan.com/covid19map-readme/
感染者数マップ: https://gis.jag-japan.com/covid19jp/

#データの読み込み
ホーム>データを取得>webから、httpアドレスを指定し、csvファイルを読み込みます。
https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv
（csvファイルをローカルにダウンロードして、「テキスト/csv」から読み込むこともできますが、Webコネクタを使用することで、「最新の情報に更新」で、すぐにデータ更新ができます。）

#ダッシュボードの作成
折れ線グラフで全国における１日の感染者数を表示します。
ビジュアルを選択し、フィールドよりドラックアンドドロップで設定します。
軸を確定日、値を通しのカウントに設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/36265166-af48-0615-d9ec-9051ba1f8207.png)
Y軸>スケールの種類をログに設定します。
（今後の増加傾向を掴むため、X軸、Y軸のスケールを自動ではなく、手動で設定しています。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/8945a048-5f63-27e9-6181-6c2d9e4a48fd.png)
#メジャーの作成と累計値の表示
csvファイルには累積データが含まれており、そのまま累積数を表示することも可能ですが、凡例に都道府県を設定できるようにするため、累計を算出するメジャーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/fce237c1-26a0-a54f-3d29-e469a8f8e8d3.png)
作成したメジャーで累積数の折れ線グラフも作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/f3c56b1b-de4d-1445-da30-d9cfdf7e3120.png)

凡例に受診都道府県を設定することで、都道府県ごとのプロットも同様に作成できます。
都道府県のように凡例数が多くなると、グラフが読み取りにくくなります。
ラインが"密集"、"密接"、"密着"しすぎないよう、フィルター設定にて、上位10都道府県に限定しています。:smile:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/3ce3d438-d0b8-5c0a-afa2-075e951568e0.png)
都道府県ごとの感染者累積数の推移です。:worried:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/ae22bd37-b050-1a98-987a-cf5b03f1ae84.png)

#さいごに
前回、[Power BIでサクっとデータを視覚化する](https://qiita.com/covao/items/14b1a440a42a02be0aca
)でダッシュボードを作成してみましたが、感染数も一桁増えたため、データーソースを変更し、対数スケールでプロットしてみました。:chart_with_upwards_trend:
【Ruby on rails】You have requested:   spring = 2.0.2  The bundle currently has spring locked at 2.1.0. Try running `bundle update spring`  If you are updating multiple gems in your Gemfile at once, try passing them all to `bundle update`と表示される。


#rails環境構築時エラー

環境設定時に以下コマンドを入力しました。

```
bundle install
```


するとエラーが発生

```
You have requested:
  spring = 2.0.2

The bundle currently has spring locked at 2.1.0.
Try running `bundle update spring`

If you are updating multiple gems in your Gemfile at once,
try passing them all to `bundle update`
```

bundleアップデートしてくださいとのこと。

```
bundle update
```
bundleアップデートした後再びインストール。

```
bundle install
```
エラーがなくインストールできました！
MavenコマンドだけでAPサーバを立ち上げてデバッグしたかった

# はじめに

掲題のとおり、**Mavenコマンドだけでステップ実行できる環境を構築**したかったんです。

Docker とか VM とか立ち上げるほどリソースに余裕もなく、clone & checkout してビルドするとか待ってられず、それでも実行時変数確認とかバージョン差異検証とかしたくなってしまいまして。

で、古来よりある**[Codehaus Cargo](https://codehaus-cargo.github.io/cargo/Home.html) (以下Cargo)**を使ってやってみようかなと思い立って、この記事となります。

昔からあるツールですし「いまどきMavenかよ」って今更感のある内容ですが、参考にでもなれば。

# 要件

- 手元にソース置いて**ビルドするのが面倒**
- **アプリ側のソースは弄れない**(pom.xml含む)、変更管理上厳しい
- バージョン違いで切り替えたり、いっそ**同時起動したい**
- **メモリとか余裕がない**から、VMとかコンテナとかはちょっと...
- IDEは別途立ち上げるとしても、1コマンドでアプリをぽこぽこ立てたい
- APサーバはJetty9.4系で、軽いし

# 必要なもの

予め以下を用意しておきましょう。

- Maven 3.5+
    - 3系なら何でもいいかもしれない
- Java8+
    - JDK8でしか試してないけど、以降でも多分大丈夫
- VSCode
    - デバッグする場合に使う、動かすだけなら不要
    - Java用拡張機能は入れておきましょう


# で、できたものがこちらです

[cargo-jetty-launcher - GitHub](https://github.com/Piecemeal-Technology-Inc/cargo-jetty-launcher)

雑ですが、pom.xmlとJetty設定ファイルだけで構成しています。
基本はmvnコマンド実行時引数(-Dオプション)でどうにでもなるようにしてます。

とりあえず下記コマンドで **org.codehaus.cargo:datasource-war** というデータソースを開くだけのサンプルアプリが動きます。

```sh
git clone https://github.com/Piecemeal-Technology-Inc/cargo-jetty-launcher.git
cd cargo-jetty-launcher
mvn initialize compile cargo:run
```

ブラウザで http://localhost:8081/change-context-root/test にアクセスすると「Got connection!」が表示されます。
コンテキストルートは pom.xml の context.path で制御しています。


## さぁデバッグしよう

VSCodeを立ち上げて、「実行」-「構成の追加」でJavaのlaunch.jsonを生成します。
そこで、以下の構成をconfigurationsへ追加します。

```json-doc:launch.json
    {
       "type": "java",
       "name": "Debug (Remote 9990)",
       "request": "attach" , // リモートデバッグ指定
       "projectName" : "cargo-jetty-launcher",
       "hostName": "localhost",
       "port": 9990, // pom.xml の debug.port プロパティと合わせる
       // target 配下にできてるソースへの参照パスを追加
       "sourcePaths": [
           "${workspaceFolder}/target/sources-datasource-war.1.7.11/main",
           "${workspaceFolder}/target/sources-datasource-war.1.7.11/dependency"
       ]
    }
```

以上で準備が完了したので、後は適当に breakpoint 張ってデバッガ起動するとステップ実行ができます。

![ezgif-4-be77008fa52c.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517337/3a222730-084e-a1d0-cc50-49d07f98a9e8.gif)

1. mvn cargo:run でサーバを起動しておく
2. target/sources-datasource-war.1.7.11/main にwarのソースが入っているので、止めたいところに breakpoint を張る
3. launch.json で作った構成をデバッグで実行する
4. http://localhost:8081/change-context-root/test にアクセスする
5. breakpoint で止まる！ アプリ側だけでなく、Jetty側のソースへもステップインできてる

# おわりに

**※注意**
**これは試行錯誤の末なので、基本的にセオリー通りではないと思います。**
組み込みデータソース使うとかJetty独自拡張入れないとかなら、公式通りに普通にやれば大丈夫かと。
※今回はDBCP2を使いたかったので、多少無理やり構成している

実行時引数である程度汎用的にしてるので、上げたいアプリごとにコマンド用意しておくなどしておけば楽に上げられます。
また、ソースコードなどの実体を持たないので、軽量な形で実行環境をPJ内に展開したりもできます。

本当はCargoでハマったとこの話を書こうと思ってましたが、需要無いと思うのでとりあえず割愛。


## 使用にあたっての前提条件

そもそも、動かす対象のwarとsource-jarがローカルリポジトリ、またはリモートリポジトリにないとダメです。
デバッグしないなら source-jar は不要で、warだけあれば動かせますので。