OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoのモデル：ManyToManyField

# モデルの例と定義
サッカー選手（Player）とそのポジション（Position）を例として考えて見ます。
１、選手は複数のポジションができる
２、同じポジションの選手は複数存在

この場合はManyToManyの出番です。

```python:モデルの例
class Position(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=20, unique=True)


class Player(models.Model):
    ・・・（略）・・・
    position = models.ManyToManyField(Position)
```

上記のモデル定義を用いてDjangoのmigrateをしたら、下記の三つテーブルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/1ce73be6-27f0-23d6-2797-69cf3c1236a3.png)

player_positionというテーブルは、playerテーブルのPKとpositionテーブルのPKで、以下のように情報を管理しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/424e6997-1f6a-6a47-72e2-a1f4201a0e2f.png)

# 検索の例
「Pirlo」という選手のポジションをすべて抽出

```python
positions = Player.objects.get(name='Pirlo').position.all()
[print(p.name) for p in positions]

実行結果：
DM
CM
```

「CB」というポジションの選手をすべて抽出（方法１）

```python
players = Player.objects.filter(position=Position.objects.get(name='CB'))
[print(p.name) for p in players]

実行結果：
Maldini
Nesta
```

「CB」というポジションの選手をすべて抽出（方法２）

```python:モデルの例（方法２）
class Player(models.Model):
    ・・・（略）・・・
    position = models.ManyToManyField(Position, related_name='player')
```
※選手モデルののポジション定義に、上記のように「**related_name='player'**」という**逆参照**を追加すれば、下記のようにポジションの実行結果から選手を直接取得することも可能
***（migration不要）***

```python
players = Position.objects.get(name='CB').player.all()
[print(p.name) for p in players]

実行結果：
Maldini
Nesta
```

## 追記
「CB」というポジションの選手をすべて抽出した方法１と方法２ですが、作成されたクエリを確認したところ、両方も下記のSQLを生成しました。

```sql
SELECT "soccer_player"."id", "soccer_player"."name", "soccer_player"."team_id"
FROM "soccer_player"
INNER JOIN "soccer_player_position" ON ("soccer_player"."id" = "soccer_player_position"."player_id")
WHERE "soccer_player_position"."position_id" = 1
```
VisualStudioでC++を書く際のシンタックスハイライトの変え方

#はじめに
Visual StudioでC++を書いてた際、マクロのシンタックスハイライトの色がいまいちだったので、変更した事をメモがてらに書きます。

#環境について
環境は多少違っても大丈夫だと思うけど、シンタックスハイライトの設定を変えた際の環境について一応記述しておきます。

* Visual Studio 2019 (Windows版)
* カラーテーマはダーク

#変更の仕方

1. メニューバーから、ツール > オプションを選択する
![devenv_FxH38rNlQK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481373/0bf39e46-dc37-7dcc-a012-72c1a69abae6.png)
2. オプションウィンドウから、環境 > フォント及び色を選択する
![devenv_jdUV2lKHyT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481373/d243f26e-4444-18a1-296f-a678841990a9.png)

3. 表示項目の中から「C++ マクロ」を選択
![devenv_Mw89gcP8iB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481373/39f393ec-21f4-4f4a-4960-2371b6ffdc4c.png)

4. 前景色を黄緑に変更し、OKを押す
![devenv_iAZ981nyvG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481373/caa2cf9e-3553-86f9-7f3f-1764f86e6f28.png)


#結果

これでC++上でのマクロの色が黄緑に変わります
![devenv_yEomle9hiZ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481373/53423637-c2ce-2113-bc25-bc657ad4f5f9.png)
Truffleの単体テストでモック的にERC20を利用する方法

#経緯
下記のような関数の単体テストを実行するために、ERC20のモックが必要になった。その手法を備忘録的に記述

```
pragma solidity ^0.5.0;

import "openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol";
import "openzeppelin-solidity/contracts/math/SafeMath.sol";

contract HogeContract {
    using SafeMath for uint256;

    mapping(address => uint256) amap;

    function huge(address _token, uint256 value) public {
        amap[_token] += value.div(ERC20(_token).totalSupply());
    }
}
```

#やり方

1.contractsフォルダ以下にTestErc20Token.sol(名前は任意)ファイルを作成する。
2.1に下記の内容を記述する。
　・solidityバージョンは任意
　・openzeppelinがインストールされていない場合は別途インストールが必要
　・発行数や名前、小数点桁数は任意

```
pragma solidity ^0.5.0;

import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";

contract TestErc20Token is ERC20 {
	string public name = "TestErc20Token";
	string public symbol = "T20T";
	uint public decimals = 18;
	constructor() public {
		_mint(msg.sender, 100000000);
	}
}

```
3.testフォルダ以下にHogehoge.ts(名前は任意)ファイルを作成する。
4.3に下記の内容を記述する(あくまで例)

```
contract('HogeContractTest', ([deployer, u1, u2]) => {
	const hogeTestContract = artifacts.require('HogeContract')
	const testErc20TokenContract = artifacts.require('TestErc20Token')
	describe('HogehogeTest; huge', () => {
		it('huge', async () => {
			const hogeContractTest = await hogeTestContract.new()
			const erc20 = await testErc20TokenContract.new()
			hogeContractTest.huge(erc20.address, 5)
　　　　     //　以下assertを書いていく
		})
	})
})

```
中心差分と前方差分

プログラミングで微分をするときは前方差分よりも中心差分が望ましい。理由は中心差分の方が誤差が少ないから。

```python
import numpy as np

#前方差分
def numerical_diff_forward(f,x):
  h = 1e-4
  return (f(x+h) - f(x)) / h
#中央差分
def numerical_diff_center(f,x):
  h = 1e-4
  return (f(x+h) - f(x-h)) / (h*2)


np.float32(1e-3)

def function(x):
  return 0.01*x**2+0.1*x

print(abs(0.2 - numerical_diff_forward(function,5)))
print(abs(0.2 - numerical_diff_center(function,5)))

#9.999991725240243e-07
#9.102163467389346e-13
```

参考
[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 ]
地図の著作権表示のまとめ(2019 11)

著作権まとめ　地図編です。各社のページでご確認ください。

#OpenStreetMap

https://www.openstreetmap.org/copyright
##ライセンス形式

データ

* Open Data Commons Open Database License (ODbL) 
* https://opendatacommons.org/licenses/odbl/

地図画像やドキュメント

* Creative Commons Attribution-ShareAlike 2.0 ライセンス (CC BY-SA) 

##クレジット
© OpenStreetMap contributors


#地理院タイル

国土地理院コンテンツ利用規約
　https://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html

##ライセンス
政府標準利用規約（第2.0版）(クリエイティブ・コモンズ・ライセンス 4.0互換)
webサイト上の情報
  複製、公衆送信、翻訳・変形等の翻案等、自由に利用可能　商用利用可能

##クレジット
そのまま使う時
　出典：国土地理院ウェブサイト　（当該ページのURL）

加工した場合
　・地理院タイル （標高タイル）を加工して作成
　・「○○データ」（国土地理院） （当該ページのURL）をもとに○○作成

干渉SARデータ
　だいち（ALOS）/PALSARの場合：
　　　『解析：国土地理院　原初データ所有：JAXA、METI』
　　　『 Analysis by GSI from ALOS raw data of JAXA, METI 』
　だいち2号（ALOS-2）/PALSAR-2の場合：
　　　『解析：国土地理院　原初データ所有：JAXA』
　　　『 Analysis by GSI from ALOS-2 raw data of JAXA 』
mysql.server  startコマンドでPIDファイルをupdateできなくてエラー吐き出されたら？

<h1>対象者</h1>
Macユーザーであることが前提です。以下、状況説明。

①mysql.server startコマンドで上記のエラーがでた。
②そこで、binディレクトリやvarディレクトリやCellarディレクトリ等に存在する
mysqlを全て消し去りbrew install mysqlした。
（消し方は他の方が記事を書かれているので省略します。）
③しかし直らなかった。

という方が対象です。

<h1>対処法</h1>

結論から述べると、エラーログを見に行けば良いです。
一旦、①を読んでみてください。もし必要であれば②をみてください。

<h3>①PIDファイルのエラーログを見に行く</h3>

```
tail -f /usr/local/var/mysql/PC名.local.err
```

エラーメッセージにPC名.local.pidの場所が書いてあると思います。
そのファイルが存在する場所と同じディレクトリにPC名.local.errが存在しますので、
tail -fの後ろにそのパスを書いてあげます。

実行した結果、エラーログに「君さあ、mysqlをすでに他のポート番号で動かしてない？」
と出たならば、②以降を読んでください。


<h3>②ポート番号を実行しているプロセスを発見する。</h3>

```
lsof -i :該当ポート番号
```
このコマンドを実行することで、該当ポート番号で動いているプロセスのIDを発見できます。

<h3>③プロセスを終了させる</h3>
```
kill -9 該当プロセスID
```
-9は強制的にプロセスを終了させるとき利用します。
最初は-9なしで実行し、ダメだったら利用します。

以上をもってmysql.server startとすれば、SUCCESS!の文字が出るかと思います。

<h1>参考文献</h1>
https://hi-algorithm.com/mysql-server-start-error/
https://qiita.com/growsic/items/5c1626f60b5e5538d2b3

参考文献の著者様に感謝です。
Rubyのキーワード引数にto_hashを実装するオブジェクトを渡すとキーワード引数として展開される

## TL;DR

Rubyにおいて、キーワード引数を取るメソッドには、`to_hash`メソッドを実装しているオブジェクトを渡すことができて、キーワード引数として展開して解釈される。

## キーワード引数とは

```ruby
def log(msg, level: "ERROR", time: Time.now)
  puts "#{ time.ctime } [#{ level }] #{ msg }"
end

log("Hello!", level: "INFO")  #=> Mon Feb 18 01:46:22 2013 [INFO] Hello!
```

(https://magazine.rubyist.net/articles/0041/0041-200Special-kwarg.html より引用)

この`log`メソッドの`level`や`time`みたいな感じで、引数にデフォルト値を指定することができて、また名前を指定して引数を渡せるという便利機能です。

## Hashはキーワード引数に展開される

キーワード引数にはHashを渡すことができて、その場合はHashの中身が展開されます

```ruby
# 普通の使い方
log('aaa', level: 'AAA') # => Wed Nov  6 09:16:36 2019 [AAA] aaa
# Hashも渡せる
log('aaa', {level: 'AAA'}) # => Wed Nov  6 09:16:44 2019 [AAA] aaa
```

このようなHash => keyword引数の変換はRuby 2.7ではdeprecatedになったので注意してください [^1]

## Hash以外もキーワード引数にわたす

そして、キーワード引数に渡して展開されるのはHashだけではありません。「`to_hash`を実装しており、かつその返り値のkeyがsymbolであるオブジェクト」ならなんでも展開されます。

```ruby
# to_hashを実装しているクラス
class HogeWithToHash
  def to_hash
    { level: 'AAA' }
  end
end

# キーワード引数として展開される
log('aaa', HogeWithToHash.new) # => Wed Nov  6 09:27:25 2019 [AAA] aaa

# to_hashを実装しているが返り値のHashのkeyが文字列であるクラス
class HogeWithToHashStringKey
  def to_hash
    { 'level' => 'AAA' }
  end
end

# キーワード引数として正しく展開されない
log('aaa', HogeWithToHashStringKey.new) # => ArgumentError (wrong number of arguments (given 2, expected 1))
```

## キーワード引数に展開されるオブジェクトの例: Rake::TaskArguments

このような条件を満たすオブジェクトとして、Rakeタスクを定義するときに使われる `Task::Arguments` が挙げられます。したがって、以下のRakefileは正しく動きます：

```ruby
def greet(first_name:, last_name:)
  puts "Hello, #{first_name} #{last_name}"
end

task :greet, [:first_name, :last_name] do |t, args|
  greet(args)
end
```

```shell-session
$ rake "greet[Ichiro,Tanaka]"
Hello, Ichiro Tanaka
```

以上

[^1]: https://blog.saeloun.com/2019/10/07/ruby-2-7-keyword-arguments-redesign.html
社内勉強会「レンダリング合宿１」 ソフトウェアラスタライザー基本実装編 05.深度バッファ

#ソフトウェアラスタライザー基本実装編 05.深度バッファ
前回はポリゴンの描画を行いました。
しかし単純に奥からソートして描画する方法では交差の場合や大きなポリゴンで問題が出ます。
というわけで今回は深度バッファを導入してみます。

###リポジトリ
https://github.com/NoriyukiHiromoto/Rendering01_SoftwareRasterizer/tree/01_05_depth_buffer

今回はの結果は以下のような感じです。
前回のものと違って前後関係がちゃんと反映されて描画されているのがわかります。
また深度バッファを用いた場合、効率的に深度テストで破棄されるように描画を行うことでピクセル処理を削減することが出来るため処理速度を上げることもできます。
いわゆるEarly Z-passといわれているものです。
実際前回は2～3FPSだったものが今回は15FPSほど出ています。
![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358928/ba0998e4-3d3c-ce1c-2871-23504298f49a.png)

#深度バッファの中身
深度バッファの中身はただのfloat値です。
DirectX8とか9の時代は速度やらメモリやらの都合でunsigned shortだったり、ステンシルを8bitいれたunsigned intがメインだったりしましたが、昨今ではiPhoneなんかも深度バッファfloatになっています。

今回も扱いやすさを重視してfloatで深度バッファを扱います。
基本的に深度バッファは深度値をいれるだけのバッファなので各ピクセルに対してfloatが1個あります。

#深度バッファの実装
まずは以下のように定義をします。

```cpp:Renderer.h
typedef FrameBuffer<Color>			ColorBuffer;
typedef FrameBuffer<fp32>			DepthBuffer;
```

そしてカラーバッファと一緒に深度バッファも生成します。
当然カラーバッファと同じサイズになります。

```cpp:Framework.cpp
ColorBuffer ColorBuff(DIBBuff.Surface(), SCREEN_WIDTH, SCREEN_HEIGHT);
DepthBuffer DepthBuff(nullptr, SCREEN_WIDTH, SCREEN_HEIGHT);
```

ラスタライズしている箇所で前回はひたすら三角形の描画を行っていましたが、今回は描画前に深度バッファの深度値と現在の三角形の深度値を比較して後ろになる場合は破棄しています。

```cpp:Renderer.cpp
	auto pDepthBuffer = _pDepthBuffer->GetPixelPointer(x0, y0);
	auto pColorBuffer = _pColorBuffer->GetPixelPointer(x0, y0);

	// 求めたバウンディング内をforで回す
	fp32 py = fp32(y0) + 0.5f;
	for (int32 y = y0; y <= y1; ++y, py += 1.0f)
	{
		int32 x_offset = 0;
		fp32 px = fp32(x0) + 0.5f;
		for (auto x = x0; x <= x1; ++x, px += 1.0f, ++x_offset)
		{
			// 辺1-2に対して内外判定
			auto b0 = EdgeFunc(p1.x, p1.y, p2.x, p2.y, px, py);
			if (b0 < 0.0f) continue;
			// 辺2-0に対して内外判定
			auto b1 = EdgeFunc(p2.x, p2.y, p0.x, p0.y, px, py);
			if (b1 < 0.0f) continue;
			// 辺0-1に対して内外判定
			auto b2 = EdgeFunc(p0.x, p0.y, p1.x, p1.y, px, py);
			if (b2 < 0.0f) continue;

			b0 *= InvDenom;
			b1 *= InvDenom;
			b2 *= InvDenom;

			// 重心座標系でz値を求める
			const auto Depth = (b0 * p0.z) + (b1 * p1.z) + (b2 * p2.z);
			auto& DepthBuf = pDepthBuffer[x_offset];
			if (Depth >= DepthBuf) continue;
			DepthBuf = Depth;

			// 重心座標系で法線を求める
			Vector3 Normal = {
				((b0 * n0.x) + (b1 * n1.x) + (b2 * n2.x)),
				((b0 * n0.y) + (b1 * n1.y) + (b2 * n2.y)),
				((b0 * n0.z) + (b1 * n1.z) + (b2 * n2.z)),
			};

			// 適当な感じでライティングする
			Vector_Normalize(Normal, Normal);
			const auto NdotL = Vector_DotProduct(Normal, _DirectionalLight) * 0.25f + 0.75f;

			const auto Brightness = uint32(NdotL * 255.0f);

			auto& ColorBuff = pColorBuffer[x_offset];
			ColorBuff.r = Brightness;
			ColorBuff.g = Brightness;
			ColorBuff.b = Brightness;
		}

		pDepthBuffer += SCREEN_WIDTH;
		pColorBuffer += SCREEN_WIDTH;
	}
```

ラスタライズ時に描画先のピクセルの座標と同じ座標の深度バッファを参照し手前の深度の場合だけ描画を行うという処理になっています。

#最後に
これでポリゴンの交差のことを考えたり奥からソートしたりといったことを考えなくてよくなりました。
ここまででポリゴンを正確に描画をするというラスタライザとしての基本機能の実装は終わりになります。
次回はいよいよテクスチャマッピングに入っていきます。
CentOS 8 で supervisord を使う

## インストール

```sh:インストール
yum install -y epel-release

yum install -y supervisor.noarch
```

## supervisordの設定修正

docker上で利用する場合、以下修正が必要。

```diff:/etc/supervisord.conf
  [unix_http_server]
+ file=/var/tmp/supervisor.sock
  
+ [inet_http_server]
+ port=0.0.0.0:9001
+ username=user
+ password=123
  
  [supervisord]
  logfile=/var/log/supervisor/supervisord.log
  logfile_maxbytes=50MB
  logfile_backups=10
  loglevel=info
  pidfile=/run/supervisord.pid
+ nodaemon=true
  minfds=1024
  minprocs=200
  
  [rpcinterface:supervisor]
  supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
  
  [supervisorctl]
  serverurl=unix:///run/supervisor/supervisor.sock
  
  [include]
  files = supervisord.d/*.ini
```

### 起動

```sh
supervisord -c /etc/supervisord.conf
```

### 自動起動したいプログラムの記述

```sh:httpd
yum install -y httpd
```

```apache:/etc/supervisord.d/httpd.ini
[program:httpd]
command=/usr/sbin/httpd -D FOREGROUND
```


### supervisord の ステータス画面

プロセスの落とし上げがこちらから可能。http://localhost:9001

![スクリーンショット_2019-11-06_09-46-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/99c9ca36-6e65-5562-9ae0-f084558a4960.png)
Google Colaboratory でAPIサーバーを立てる。

機械学習を使ったサービスのプロトタイプを短期間だけ公開したい場合AWSでサーバー借りるのもめんどくさいしお金かかるとおもったらColabでもサーバー立てられることを知ったので書き残しておきます。

URL発行に必要なngrokをダウンロード

```
!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip ngrok-stable-linux-amd64.zip
```

以下をノートブック上で動かせばURLをくれます。

```
get_ipython().system_raw('./ngrok http 6006 &')
!curl -s http://localhost:4040/api/tunnels | python3 -c \
  "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"
```

そしてFlaskを使ってアプリケーションサーバーを立てます。サンプルでindex.htmlをレンダリングしてますが、もちろんJSON返却もできるのでAPIとしても使えます。

```
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def index():
    return render_template( "index.html" )

if __name__ == '__main__':
    app.run(port=6006)
```

一度ストップさせてから再度実行するとエラーがでちゃうのでランタイム再起動で対応してください。
もちろん90分、12時間ルールで止まっちゃうので注意。
WPFからUWPのAPIを使う手順

# TL;DR

- WPFからUWPのAPIを呼び出すための一番簡単な方法を記載します。
- UwpDesktopを使用する方法もありますが、最新のOSでは動かないことがあったため、手作業で行う方法を記載します。

# リソース

- https://codezine.jp/article/detail/10654
- https://github.com/biac/codezine

# 環境

- Windows 10 1903 (OS ビルド 18362.418)
- Visual Studio 2019 16.3.7

# 手順

## (1) Packageフォルダを削除します。

もし、試行錯誤等を行ったPackageフォルダがソリューションファイルと同じフォルダにある場合は削除します。

## (2) ソリューションのNugetパッケージの管理を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/ce2ad25a-7e8a-620c-3140-13759fe9711e.png)

## (3) 対象のプロジェクトに「UwpDesktop」がある場合にはアンインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/86dc049b-e095-3e5f-bfa1-bf10bc8706da.png)

## (4) プロジェクトをアンロードしてcsprojファイルを編集し、以下のUwpDesktop関連のブロックを削除します。

```xml
  <ItemGroup>
    <Analyzer Include="..\packages\UwpDesktop.10.0.14393.3\analyzers\dotnet\UwpDesktopAnalyzer.dll" />
  </ItemGroup>
```

## (5) 以下の2つのファイルを参照します。

```
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
```
```
C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.18362.0\Windows.winmd
```

### 誤った例

例えば、以下の場所を参照すると、コンパイルは成功しても、API使用箇所で`ファイルまたはアセンブリ 'System.Runtime.WindowsRuntime, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'、またはその依存関係の 1 つが読み込めませんでした`といったエラーが表示されます。

```
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5.1\System.Runtime.WindowsRuntime.dll
```
```
C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Facade\Windows.winmd
```
plunkerでtensorflow.js その19

#概要

plunkerでtensorflow.jsやってみた。
callbacks使ってみた。

#サンプルコード


```



tf.setBackend('cpu');
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
function draw(data, n) {
	var hc = n * 100 + 100;
	ctx.strokeStyle = "#f00";
	ctx.lineWidth = 1;
	ctx.moveTo(0, hc);
	for (var i = 1; i < data.length; i++)
	{
		ctx.lineTo(i, hc - data[i] * 30);
	}
	ctx.stroke();
}

const model = tf.sequential();
model.add(tf.layers.dense({
	units: 40,
	activation: 'tanh',
	inputShape: [1]
}));
model.add(tf.layers.dense({
	units: 1,
	activation: 'tanh'
}));
model.compile({
	optimizer: 'adam',
	loss: 'meanSquaredError'
});
const buffer = tf.buffer([200, 1]);
const buffer2 = tf.buffer([200, 1]);
b = [];
for (var i = 0; i < 200; i++)
{
	var x = i / 30.0;
	var y = Math.sin(x);
	b.push(y);
	buffer.set(x, i, 0);
	buffer2.set(y, i, 0);
}
draw(b, 0);
const xs = buffer.toTensor();
const ys = buffer2.toTensor();
c = [];
model.fit(xs, ys, {
	batchSize: 200,
	epochs: 2000,
 	callbacks: {
		onEpochEnd: (epoch, logs) => {
			if (epoch % 10 == 0) 
			{
			  c.push(logs.loss);
			  draw(c, 1);
			}
		},
	}
}).then((d) => {
	var str = "loss = ";
	str += d.history.loss[0];
	alert(str);
	p = [];
	for (i = 0; i < 200; i++)
	{
		var x =  i / 30.0;
		var pre = model.predict(tf.tensor2d([[x]], [1, 1]));
		var f = pre.dataSync();
		p.push(f);
	}
	draw(p, 2);
});


```

#成果物

https://embed.plnkr.co/VYR1bjBySV5OmWqR1XF4/

以上。
SwiftUIとCoreDataを@FetchRequestで連携させる

データベースのデータをSwiftUIに表示したい場合、
データベースがCoreDataであれば、
`@FetchRequest` と `FetchedResults` を使うことによって連携することができます。

# FetchRequest

[FetchRequestのドキュメント](https://developer.apple.com/documentation/swiftui/fetchrequest)

FetchRequestのパラメータには `sortDescriptors` や `predicate` などが用意されていて、
`@FetchRequest` をFetchedResultsプロパティにつけることによってCoreData内のデータを取り出せます。
例えば、EntityというデータモデルをcreateAt順で取り出したい場合は以下のコードの感じでプロパティを用意します。

```swift
    @FetchRequest(entity: Entity.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Entity.createAt, ascending: true)], animation: nil)
    var ascendingEntities: FetchedResults<Entity>

```


# ソースコード例


```swift
import SwiftUI
import CoreData

struct ContentView: View {
    @Environment(\.managedObjectContext) var context: NSManagedObjectContext

    @FetchRequest(entity: Entity.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Entity.createAt, ascending: true)], animation: nil)
    var ascendingEntities: FetchedResults<Entity>
    
    var body: some View {
        NavigationView {
            List(ascendingEntities, id: \.self) { entity in
                Text(entity.createAt!.description)
            }.navigationBarTitle("Navigation Bar").navigationBarItems(
                leading: Button(action: {
                    let entity = Entity(entity: Entity.entity(), insertInto: self.context)
                    entity.createAt = Date()
                    try! self.context.save()
                }) {
                    Text("Add")
                },
                trailing: Button(action: {
                    let req:NSFetchRequest<Entity> = Entity.fetchRequest()
                    let result = try! self.context.fetch(req)
                    self.context.delete(result.first!)
                    try! self.context.save()
                }) {
                    Text("Remove")
                }
            )
        }        
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

        return ContentView().environment(\.managedObjectContext, context)
    }
}
```

こんな感じでSwiftUIを準備すると、
簡単にCoreDataとの連携が取れます。

![Nov-06-2019 07-59-55.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62305/4aed2a0e-7bf1-430b-c04e-2da5f0f48cc0.gif)


つかおう！CoreData！
RustでPostgreSQLのストアードプロシージャを呼び出して結果を取得する

# 目的
PostgreSQL11以降ではストアードプロシージャ利用できるようになります。ストアードプロシージャはストアードファンクションとは違ってリターンで値を返すことができません。しかしINOUTパラメーターで呼び出し側に結果を返すことができます。

RustでどうやってINOUTを受け取ることができるのか調べてみました。

結果、queryした戻りのrowsに1行だけ返ってきて、INOUTパラメーター名をカラムのように指定することで取得できることがわかりました。

# コード

```sql:test_sp.sql
CREATE OR REPLACE PROCEDURE test_sp(
    p_param BIGINT DEFAULT NULL
    ,INOUT p_result1 JSONB DEFAULT NULL
    ,INOUT p_result2 JSONB DEFAULT NULL
) AS $PROCEDURE$
DECLARE
BEGIN
  p_result1 := jsonb_build_object(
      'aaa',
      'bbb',
      'ccc',
      p_param
  );
  p_result2 := jsonb_build_object(
      'efg',
      'hij',
      'lmn',
      p_param * 2
  );
END;
$PROCEDURE$ LANGUAGE plpgsql;
```

```rust:Cargo.toml
[package]
name = "pg"
version = "0.1.0"
edition = "2018"

[dependencies]
serde_json = "^1.0"
r2d2_postgres = "^0.14"

[dependencies.postgres]
version = "^0.15"
features = [
    "with-serde_json",
]
```

```rust:main.rs
fn main() {
    let manager = r2d2_postgres::PostgresConnectionManager::new(
        "postgres://localhost:5432/test",
        r2d2_postgres::TlsMode::None).unwrap();
    let pool = r2d2_postgres::r2d2::Pool::new(manager).unwrap();
    let conn = pool.get().unwrap();
    let sql = r#"
       CALL test_sp(p_param := $1)
    "#;
    let param: i64 = 10;
    let stmt = conn.prepare_cached(sql).unwrap();
    let rows = stmt.query(&[&param]).unwrap();
    let row = rows.get(0);
    let result: serde_json::Value = row.get("p_result1");
    println!("{:?}", result);
    let result: serde_json::Value = row.get("p_result2");
    println!("{:?}", result);
}
```
【Apex】OutputText内で日付を表示する際の曜日をVF側だけで日本語表記できないかやってみた。

まずは以前にもご紹介したOutputTextの日付のフォーマット化を使って、

想定通りの日付を表示させます。

```java:
public class DateTimeController {
    public Date dayOfWeek { get; set; }
    
    public DateTimeController(){
        dayOfWeek = system.today();
    }
}
```
```html:
<apex:page controller="DateTimeController">
    <apex:pageMessages id="message"/>
    <apex:form >
        <apex:pageBlock >
            <apex:outputText value="{0,date,yyyy/MM/dd}">
                <apex:param value="{!dayOfWeek}"/>
            </apex:outputText>
        </apex:pageBlock>
    </apex:form>
</apex:page>
```

すると表示はこのようになります。
![スクリーンショット 2019-11-06 6.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/5673e789-8d99-4558-fb77-d7818c7263b4.png)

では次に

```html:
<apex:outputText value="{0,date,yyyy/MM/dd E}">
   <apex:param value="{!dayOfWeek}"/>
</apex:outputText>
```

フォーマット部分にEを加えてみます。

![スクリーンショット 2019-11-06 6.46.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/0d90c229-9328-e087-6d9b-05dbaab46eba.png)

すると短い形式の曜日がでましたが、英語表記ですね。。。

ここでjavaのフォーマットを見直してみると、引数にロケールを渡してあげると
良いみたいなんですが。

salesforceだとしっかり怒られます。

<img width="517" alt="スクリーンショット 2019-11-06 6.55.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/4f65a74e-e4a9-26b7-d780-62990e935f49.png">

ちなみに試してみたのは下記の形式です。

```html:
<apex:outputText value="{0,date,yyyy/MM/dd E,Locale}">
<apex:outputText value="{0,date,yyyy/MM/dd E,Locale.Japan}">
```

やっぱりApex側で番号取得して曜日に変換するやり方しかないんだろうか。。。

今回は答えが見つからずでした。

引き続き模索してみようと思います。


#profile

生まれも育ちも大阪の浪速中の浪速っ子が30才未経験からITエンジニアとして生きるブログもやってます。
よかったらみてください:muscle_tone2:

<a href="https://blogmura.com/profiles/11016817?p_cid=11016817"><img src="https://blogparts.blogmura.com/parts_image/user/pv11016817.gif" alt="PVアクセスランキング にほんブログ村" /></a>
Raspberry Pi Mouseの準備を進めてみた

ラズパイのSDカードにubuntuを入れるために、パーティションを消してまっさらにしました。
「[USBメモリに出来た複数のパーティーションをWindowsの標準機能だけで削除する](https://qiita.com/ktyubeshi/items/e71dd89722db85081284)」を参考にさせていただきました。

【参考のページ】
「[Raspberry PiとROSを使ったロボットシステム](https://www.slideshare.net/ryuichiueda/32raspberry-piros)」：開発の進め方の参考になります

上記本の方法で、SDカードにubuntu焼いて、Raspberry Pi Mouseに差し込んで電源ONしたところ、
![IMG_4753a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/6286b7ff-6f69-6eee-f8ac-d9018c9e2332.png)


画面がこんなことになりました。どうしてなんでしょうか。
![IMG_4754.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/9d05519e-45fb-34bd-afaf-beab8efda14b.jpeg)


Raspberry Pi 3B　へのubuntuインストールを調べてみたいと思います。
![IMG_4755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/edf8c254-5bfc-6098-7dca-a5e98dfb699e.png)

【参考：Raspberry Pi 3B　へのubuntuインストール】
・[第564回　Raspberry Pi 3 Model B+にUbuntu 18.04 LTSをインストールする](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0564)
・[第48回「ラズベリーパイにUbuntu MATEをインストール！」](https://deviceplus.jp/hobby/raspberrypi_entry_048/)
・[Ubuntu/7zファイルの解凍をできるようにする](https://linux.just4fun.biz/?Ubuntu/7z%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%A7%A3%E5%87%8D%E3%82%92%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)

なんとかインストールできましたが、無線LANの設定がうまくいきません。困りました。
![4f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/eb077b41-12bd-7a6f-729d-2fdff619bab9.png)
標準正規分布の下での2次モーメントの標本分布がカイ二乗分布となることを数値実験で確かめる

# 背景

[前回の記事](https://qiita.com/jajagacchi/items/6c69d7860d51dbabce57)で述べたように、標本分散の分散を記述するためにはは4次モーメントが必要となり少しややこしくなります。

標準正規分布については、平均周りの2次モーメントの標本分布はカイ二乗分布となります。今回はこれを数値実験で確かめます。

# 確かめたいこと

標準正規分布において、標本サイズを$n$、標本分散を$s^2$とすると、$ns^2$は自由度$n-1$のカイ二乗分布に従います。自由度$n-1$のカイ二乗分布とかいうカッコイイ名前ですが、これは$n-1$個の標準正規乱数を用意し、その二乗和の従う分布であり、それほどややこしいものではありません。

ここで確かめたいのは、標準正規乱数の二乗和がカイ二乗分布に従うこと、そして$ns^2$が自由度$n-1$のカイ二乗分布に従うことです。

# 数値実験１：標準正規乱数の二乗和がカイ二乗分布に従うことの確認

$5$個の標準正規乱数の二乗和をサンプリングしてヒストグラムを作ってみます。

```c++
#include <iostream>
#include <random>
#include <vector>

int main(int argc, char **argv)
{
        std::mt19937 mt(0);
        std::normal_distribution<double> r(0, 1);//標準正規乱数

        int N = atoi(argv[1]);//標準正規乱数の個数
        int Iter = 100000;//試行回数

        for (int iter = 0; iter < Iter; iter++)
        {
                double sum = 0;
                for (int n = 0; n < N; n++)
                {
                        double X = r(mt);
                        sum += X * X;
                }
                std::cout << sum << std::endl;
        }

        return 0;
}
```

ヒストグラムと自由度$5$のカイ二乗分布を重ねてみます。おおむね一致していることが確認できました。
![image-20191106031931559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/9817dbf8-d94a-c60d-abe8-9b27821ecd5e.png)

# 数値実験２：平均周りの二次モーメントが自由度n-1のカイ二乗分布に従うことの確認

標本サイズを$6$として、標本分散のサンプリングを行います。

```c++
#include <iostream>
#include <random>
#include <vector>

int main(int argc, char **argv)
{
        std::mt19937 mt(0);
        std::normal_distribution<double> r(0, 1);//標準正規乱数

        int N = atoi(argv[1]);//標本サイズ
        int Iter = 100000;//試行回数

        for (int iter = 0; iter < Iter; iter++)
        {
                double sum2 = 0, sum1 = 0;
                for (int n = 0; n < N; n++)
                {
                        double X = r(mt);
                        sum1 += X;
                        sum2 += X * X;
                }
                std::cout << sum2-sum1*sum1/(double)N << std::endl;
        }

        return 0;
}
```

ヒストグラムと自由度$5$のカイ二乗分布を重ねてみます。おおむね一致していることが確認できました。
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/3d54aa04-0dee-8bf6-aba1-5a213fad274a.png)
コードを見ると、そりゃあカイ二乗分布になりそうよな、と思います(sum1は平均ゼロでsum2の寄与が主だと思われるため)。

# まとめ

標準正規乱数の二乗和がカイ二乗分布に従うこと、そして$ns^2$が自由度$n-1$のカイ二乗分布に従うことを数値実験で確認しました。

一般には$ns^2/\sigma^2$は自由度$n-1$のカイ二乗分布に従います。標本分散がわかっているものとして、$\sigma^2$の値として好きなものを取れば、$ns^2/\sigma^2$の値がカイ二乗分布のどこからサンプリングされるかが決まります。つまりその$\sigma^2$の値である確率がわかります。$\sigma^2$の値を網羅的に振ってやる（積分ですね）ことでどの範囲の$\sigma^2$の値があり得そうかがわかります。このようにすることで母分散の値を区間推定出来ます。
deviseで作成したユーザー認証機能にプロフィール画像をActive Storageで追加してみる

# はじめに
deviseで導入したユーザー認証機能にユーザーのプロフィール画像を追加したかったので、はじめはcarrierwaveなどを使って画像をアップロードしようと考えていたがRails 5.2から導入されたActive Storageを使えば、Usersテーブルに画像用のカラムを追加することなくプロフィール画像を設定できるようなので使ってみました。


deviseは導入済みという前提で進めていきます。


## 環境
ruby 2.6.5
rails 5.2.3



## Active Storageを準備する

```bash
$ rails active_strage:install

$ rails db:migrate
```

このコマンドの実行で2つのテーブルが作成されます。

- active_storage_blobs
- active_storage_attachments


### active_storage_blobs
ファイル名やファイルの種類、バイト数とかを保持するテーブルみたいです。


### active_storage_attachments
このテーブルは、active_storage_blobsとActive Recordを紐付ける中間テーブルとしての役割があるようです。



## Userモデル
deviseで生成されたUserモデルに`has_one_attached :avatar`を追加します。
これは１つの画像ファイルを添付するためのもので、複数ファイルを添付したい場合は`has_many_attached :images`とします。


```app/models/user.rb
class User < ApplicationRecord

  devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :validatable

  # :avatarの部分は用途に合わせて :image :photoでも可
  has_one_attached :avatar

end
```

## コントローラーにストロングパラメータを設定する

ユーザー編集画面でプロフィール画像をアップロードしたいので、編集画面で画像ファイルを受け取れるようにストロングパラメータを設定します

```app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
# deviseコントローラにストロングパラメータを追加
before_action :configure_permitted_parameters, if: :devise_controller?



protected
  # 編集画面から画像を受け取れるよう設定
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:account_update, keys: %i(avatar))
  end

end
```

ストロングパラメータの詳しい設定は以下で確認できます。
- [deviseリファレンス](https://github.com/plataformatec/devise#strong-parameters)



## ビューに追加
プロフィール画像のアップロード用と表示用のヘルパーをビューファイルに追加します。

### ユーザー編集画面


```erb:app/views/deives/registrations/edit.html.erb
.
.
.
<div class="field">
    <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
    <%= f.password_field :current_password, autocomplete: "current-password" %>
</div>

<%# 追加 %>
<%= f.file_field :avatar %>

<div class="actions">
    <%= f.submit "Update" %>
</div>
.
.
.
```



### ユーザー詳細画面

```erb:app/views/users/show.html.erb
<p><%= @user.email %></p>

<% if @user.image.attached? %>
  <%= image_tag @user.avatar %>
<% end %>

<%= link_to "編集", edit_user_registration_path %>
```

ユーザー詳細画面は初期状態のdeviseには無いので追加する必要があります。
下の記事が分かりやすく参考になりました。


- [devise導入からユーザーのプロフィール画面を作成するまで](https://qiita.com/Ryokky/items/71b5a853989721b89c6e)

## Active Storageを使うと簡単だった

以上でプロフィール画像のアップロードから表示までが完了しました。
Active Storageを使うとテーブルにカラムを追加する必要がないにも関わらず、usersテーブルに`avatar`というカラムがあるかのように操作できるところが便利でした。


他にもActive Storageを使うことでAmazon S3やGoogle Cloud Strageなどへのアップロードが可能になるようです。



## 参考サイト

- [Active Storage の概要 | Railsガイド](https://railsguides.jp/active_storage_overview.html)
- [【Rails 5.2】 Active Storageの使い方 | Qiita](https://qiita.com/hmmrjn/items/7cc5e5348755c517458a#warning-%E9%87%8D%E8%A6%81)
“わからないところがわからない”方向けの勉強法

#目次
- 目的
- 必要なもの
- 学習法
- まとめ


##目的
プログラミングの学習をしていると、ひたすらカタカナや英語が登場し、「わからないところがわからない・・・」と悩む方が多いです。
これはハードウェアの領域なのか？
ネットワークが原因なのか？
PCの知識が必要なのか、まずは英語の勉強をすべきなのか。。。

どこから手を付けたらいいかわからない、そんな方への勉強方法を紹介します。

##必要なもの
マインドマップ

ここではGoogleアカウントをお持ちの方向けへ、["MindMup"](https://www.mindmup.com/#storage) を紹介します。
GoogleDriveにMindMupを追加します。
[![Image from Gyazo](https://i.gyazo.com/383e515607f7f9e6f83060e5e61db2ec.png)](https://gyazo.com/383e515607f7f9e6f83060e5e61db2ec)
右下のアプリを追加→MindMupと検索し、追加。

※A4用紙などでも構いません。

##学習法
"わからないところがわからない"という状態は、どちらを向けばよいのかわからない状態です。
これから学習する部分がどれだけのサイズがあるかわからず、頭の容量をどれだけあければいいのかわからない状態でもあります。

その場合は**自分がわかるところ**を認識する勉強をしましょう。
今現在わかることを徐々に増やすイメージです。

1. 中心に今わかるキーワードを１つ書きます。
[![Image from Gyazo](https://i.gyazo.com/68cd3a85a46b9e6884255831f13db11c.png)](https://gyazo.com/68cd3a85a46b9e6884255831f13db11c)
2. その言葉を中心に連想できるワードを書いていきます。４〜５つほどで良いです。
[![Image from Gyazo](https://i.gyazo.com/d7ac995363cf99c3bca933a9d03b9ea4.png)](https://gyazo.com/d7ac995363cf99c3bca933a9d03b9ea4)
3. 次は周りに書いたワードについて、関連のキーワードを拡げます。２〜３回繰り返していきます。
[![Image from Gyazo](https://i.gyazo.com/a97c2c2dfec04471d7b5c7d58f919e06.png)](https://gyazo.com/a97c2c2dfec04471d7b5c7d58f919e06)
[![Image from Gyazo](https://i.gyazo.com/db82f3f04f2cd297d5929f3c23f2cad8.png)](https://gyazo.com/db82f3f04f2cd297d5929f3c23f2cad8)
４. 次に自分でキーワードを説明します。
重要なのは「何か調べつつ、正解を書く」ではなく、間違っても良いのであくまで現在の自分が“わかる”ワードで書くことです。※今回はオレンジで記入しました。
[![Image from Gyazo](https://i.gyazo.com/f102188abb9bc42540a9956829a39787.png)](https://gyazo.com/f102188abb9bc42540a9956829a39787)


１〜４をひたすら拡げていく形でアップデートをし続けます。
何か調べたり、理解が深まるなどしてさらによい説明を思いついたら、さらに更新。
間違っていることに気づいた場合は、削除を繰り返します。

##まとめ
学習というと、知らないことを身につける。ということに他ならないのですが、
プログラミングの学習はstudy（勉強）ではなく、learn（学ぶ）ということが重要になってきます。
文字にできる、ということは「ここまでは覚えている」と安心して新しいことを覚えにいけます。

そしてこのブランチが膨らませられなくなったときは、そこから先が「わからないところ」となります。
そこから外に拡げるように学習をしていきましょう。
無料で使える公開 API のリスト：48 カテゴリ

# A collective list of free APIs

API Key の登録なし＋無料で株価情報が取れる API ないかなーと探していたら、面白いリストが見つかりました。48 カテゴリにわたり数百もの API がリストされています。545 contributors (2019/11/6 時点) によるまさに集合知（？）ですね。

Github: [https://github.com/public-apis/public-apis](https://github.com/public-apis/public-apis)



>**A collective list of free APIs for use in software and web development.**

の説明通り、

- Animals
- Anime
- Anti-Malware
- Art & Design
- Books

など、どんなデータ？と思うようなカテゴリから、 [Geocoding](https://github.com/public-apis/public-apis#geocoding)、[Jobs](https://github.com/public-apis/public-apis#jobs)、[Music](https://github.com/public-apis/public-apis#music) まで、全部見ることができていませんがどんなネタにも対応できそうな気がします。


# Financial Modeling Prep

Finance 系は [ここ](https://github.com/public-apis/public-apis#finance)から。今回はとりあえず最新の株価が分かればよかったので、シンプルな [Financial Modeling Prep](https://financialmodelingprep.com/) のサービスを使うことにします。参考まで実行例をば。


## MATLAB例

```matlab:singleQuote.m
symbol = "amzn";
url = "https://financialmodelingprep.com/api/company/real-time-price/" + symbol + "?datatype=json";
jsontxt = webread(url)
value = jsondecode(jsontxt)
```

結果はこんな形。

```
jsontxt =
    '{
         "symbol": "AMZN",
         "price": 1800.57,
         "updated_at": "2019-11-05 16:32:13"
     }'

value = 
  struct with fields:

        symbol: 'AMZN'
         price: 1.8006e+03
    updated_at: '2019-11-05 16:32:13'
```

`webread` の出力は文字列（`char`) ですが、`jsondecode` を使うと構造体になります。R2019b 使いました。

## JavaScript例

```html:singleQuote.html
<!DOCTYPE html>

<head>
    <title>getting quotes</title>

<body>
    <h1>getting quotes</h1>
    <p id="quotes"></p>
    <p id="updated_at"></p>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script>
        $(document).ready(function () {
            let symbol = 'amzn';
            let callback = function (data) {
                let strPrice = data.price.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
                // From https://stackoverflow.com/questions/149055/how-can-i-format-numbers-as-currency-string-in-javascript

                document.getElementById('quotes').textContent = data.symbol + ": $" + strPrice;
                document.getElementById('updated_at').textContent = data.updated_at + '(UTC)';
                alert('Stock Price: $' + strPrice + ' at ' + data.updated_at + '(UTC)');
            };

            // https://financialmodelingprep.com/developer/docs/realtime-stock-quote-api
            let url = "https://financialmodelingprep.com/api/company/real-time-price/" + symbol + "?datatype=json";
            $.getJSON(url, callback);
        });
    </script>
</body>
</head>
```

![Capture.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/e15a1210-284c-f363-f7f9-f17c93fa0dd5.png)

こんな感じ。使いやすそう。
Vue.js 環境構築

# 1. Vue.js 環境構築

## 1.0 Homebrewをインストール

Homebrewのインストールを行います｡

[Homebrew](https://brew.sh/index_ja)

インストール後バージョンを確認する｡

``` 
$ brew -v 
```

バージョン確認できたら完了｡

## 1.1 nodebrewをインストール

## 1.2  npm または yarn のインストール

npm または yarnをインストールを行います｡

今回は､homebrew で yarn を用いて行います｡

- yarnのインストール
<br>
```brew install yarn```

## 1.3 Vueのインストール

- Vue の インストール
<br>
```yarn global add @vue/cli```
Visual Studio Onlineを軽く試した

## 準備

- [Visual Studio Online](https://visualstudio.microsoft.com/services/visual-studio-online/)
- 上記リンクのGet startedをクリック
- 前提としてMicrosoftアカウントとAzureの登録が必要
  - とりあえずAzureは無料アカウントで良さそう
  - Azure使ったことないから試しながら使ってる

## planを作る
- 料金プランの選択
  - 一旦無料試用版を選択した
- Locationを選択
  - ShouthestAsiaを選択した

<img width="598" alt="Screen Shot 2019-11-06 at 0.55.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65939/345e12c7-967b-fd0c-5e7e-4f1a763e772b.png">


## 環境を作成

- Create environment
    - 環境名
        - 好きな名前
    - Gitリポジトリ
        - github以外は試してない
    - Instance Type
        - とりあえずStandardにした
    - あとは適当

<img width="339" alt="Screen Shot 2019-11-06 at 0.59.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65939/cee0cf41-97bc-9740-970f-e95bd1642cca.png">


## エディタ画面

iPad Pro 11のSafariで開いてみた
![IMG_0036.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65939/0329302a-d99c-4186-8221-7cc3101308a1.jpeg)


- 普通にVSCodeの画面
- 遅延とかも今の所あんまり感じない
- 最初の読み込みは遅い
  − インスタンス立ち上げてるから？
- 環境作ったらnpm installも終わってる
- nodeも普通に動く
  - 多分stableのバージョンになるんじゃないかな
- Safari（iPadOS）は今の所サポート対象外っぽい

<img width="536" alt="Screen Shot 2019-11-06 at 1.04.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65939/18e1d9ea-94d4-9890-9722-b6dfda3ab055.png">


## 動作確認

- vsonline-qickstartではserver.jsが記述されていた
- npm startでサーバを立ち上げる
- Remote Explorer > Forwarded Ports > Port :3000 をクリックするとブラウザで動作確認できる
  - かなり時間がかかる
  - これもリクエストしてからインスタンス作ってるのかな...
  - HMRできるかどうかはまだ試してない
    - あとでwebpack dev serverで試してみる

<img width="778" alt="Screen Shot 2019-11-06 at 1.07.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65939/3549d13c-1f02-2a4d-46e9-e1954b4e2e25.png">


![IMG_0037.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65939/5cf34e71-deba-2aa9-3133-d8865a09465e.png)


## 所感

もちろんmacOSアプリ版のVS Codeでローカル開発したほうがその瞬間のDXはいいんだけど、Visual Studio OnlineがあればiPad Proでコーディングできるのはメリットが大きい。
外でコーディングする機会が少ないのであればMacBookを手放してiPad Proオンリーにしても良いかもと思える素晴らしい可能性である。

普段はMac miniで開発し、外では優雅にiPad Proで開発する。
そういう生活を作っていけたらと思う。

つーかiPadOS用のアプリを作ってくれよサティア・ナデラさんッッ
railsのArrayで範囲外のindexを指定した時にループさせる方法





通常、Arrayクラスのオブジェクトで範囲外のindexを指定するとnilが返ります。

```bash
> message_array = ['success', 'warning', 'info', 'danger']
> message_array[4]
=> nil
```

しかし
範囲外のindexを指定した際、良しなにindexをループさせて欲しい場面があったので、紹介します。
(上記の例だとmessage_array[4]を指定した時に`success`を返して欲しい)

## 動作環境
rails 5.2.2.1

## 準備

### Arrayクラスを拡張する
lib/core_extにArrayクラス拡張用のファイルを作成します。

```ruby:/lib/core_ext/array.rb
class Array
  def values_at_loop(index)
    self[index % length]
  end
end
```

initializerで上記ファイルをrequireします。

```ruby:/config/initializers/extensions.rb
require 'core_ext/array'
```
準備は以上です。

## 実行方法

`values_at_loop(index)`の形式でメソッドを呼び出します。


```ruby
> message_array = ['success', 'warning', 'info', 'danger']
=> ["success", "warning", "info", "danger"]
> message_array.values_at_loop(0)
=> "success"
> message_array.values_at_loop(1)
=> "warning"
> message_array.values_at_loop(2)
=> "info"
> message_array.values_at_loop(3)
=> "danger"
> message_array.values_at_loop(4)
=> "success"
> message_array.values_at_loop(5)
=> "warning"
> message_array.values_at_loop(6)
=> "info"
> message_array.values_at_loop(7)
=> "danger"
> message_array.values_at_loop(8)
=> "success"
> message_array.values_at_loop(-1)
=> "danger"

```


## まとめ

使い所はめちゃめちゃ少ないですが、ルーレットのような回転する構造を配列で表現したい時などに使えそうです。
mix ecto.migrate で重複エラーが起きた時のメモ【調査中】

すいませんものすごく個人的なメモです。

# 問題

`mix ecto.migrate`を行った際以下のようなエラーが発生

```shell
$ mix ecto.migrate
warning: found quoted keyword "test" but the quotes are not required. Note that keywords are always atoms, even when quoted. Similar to atoms, keywords made exclusively of Unicode letters, numbers, underscore, and @ do not require quotes 
  mix.exs:56

** (Ecto.MigrationError) migrations can't be executed, migration name create_articles is duplicated
    (ecto) lib/ecto/migrator.ex:275: Ecto.Migrator.ensure_no_duplication/1
    (ecto) lib/ecto/migrator.ex:256: Ecto.Migrator.migrate/4
    (ecto) lib/mix/tasks/ecto.migrate.ex:83: anonymous fn/4 in Mix.Tasks.Ecto.Migrate.run/2
    (elixir) lib/enum.ex:783: Enum."-each/2-lists^foreach/1-0-"/2
    (elixir) lib/enum.ex:783: Enum.each/2
    (mix) lib/mix/task.ex:331: Mix.Task.run_task/3
    (mix) lib/mix/cli.ex:79: Mix.CLI.run_task/2
    (elixir) lib/code.ex:813: Code.require_file/2
```
英文ではcreate_articles名が重複しとるぞと

# 解決法（とりあえず解決法を知りたい人に）
テーブル名が同じ名前のためエラーが出たのこと、
以下のコマンドで通ります。
`mix ecto.migrate --step 1`

# 原因

どうやら migrate する際にテーブル名が重複していたようでmigrationを一つに実行すると通るというわけですね。

> You can fix it by running 1 migration at a time

`mix ecto.migrate --step 1` こちらのコマンドをうつと

```shell
$ mix ecto.migrate --step 1
warning: found quoted keyword "test" but the quotes are not required. Note that keywords are always atoms, even when quoted. Similar to atoms, keywords made exclusively of Unicode letters, numbers, underscore, and @ do not require quotes 
  mix.exs:56

[info] == Running App.Repo.Migrations.CreateArticles.change/0 forward
[info] create table articles
[info] == Migrated in 0.1s
```
やったぜ実行できました！
> Ideally you should not have 2 migrations with the same name :)

以下の記事でもあるようにテーブル名は同じ名前じゃだめだよーとのこと
むむーどこで作成しちまっていたのか...
メモでした。

# 参考リンク
How to fix Ecto duplicate name migrations error 
http://disq.us/t/2jnipyj
ありがとう　[https://github.com/minhajuddin](https://github.com/minhajuddin)　さん

そのほか日本語での mix tasks を解説してくださっている記事です。
Phoenix入門 （第14章 Mix Tasks その２） - 技術メモ
https://www.tech-note.info/entry/phoenix-14-mix-tasks-2#mix-ectogenmigration
ありがたいありがたい

mix tasks は一通り覚えようと思いました...
【Swift】String interpolation produces a debug description for an optional value; の解決法

# 環境
・Xcode11.2
・Swift5.1.2

# 出現コード
```swift:Test.swift
var text:String? = "hoge"
print("\(text)")
```

# 原因
Optional<String>をunwrapせずに出力しようとしているため

# 解決方法

## 1. if let
```swift:Test_resolved.swift
  var text:String? = "hoge"
  if let text = text {
    print("\(text)")
  }
  else {
    print("nil")
  }
```

## guard let

if letでも良いが都度処理する必要がある。
基本的には、optional型を処理する場合は早めにunwrapすべきだと思うので

```swift:Test_resolved.swift
  var text:String? = "hoge"
  guard let text = text else { return }
  print("\(text)")
```
としてしまうのが基本的には良いと思う。

誰かのお役に立てば。
Nuxt.jsアプリをDockerイメージ化する

# はじめに

Nuxt.jsで作ったフロントエンドアプリを、Dockerイメージにビルドする方法を記載します。
簡単にできると思いきや、環境変数周りでいろいろはまったため、その点も備忘録として記載します。

# Dockerfile

ビルド環境に依存しないよう、nuxtアプリのビルドもイメージビルド時にするようにしてます。
また、`.dockerignore`を使うことで、コンテナ内で生成される各種ファイルが、ビルドコンテキストに追加されないようにしてます。
これがないと、ローカルのnode_modulesをビルドコンテキストにコピーしてしまうため、だいぶ遅くなります。

```dockerfile:Dockerfile
FROM node:10-alpine

WORKDIR /app
ENV NUXT_HOST 0.0.0.0

COPY package.json yarn.lock ./
RUN yarn install

COPY . .
RUN yarn run build

EXPOSE 3000

CMD ["yarn", "run", "start"]
```

```:.dockerignore
node_modules
.nuxt
```

ほんとは、マルチステージビルドを使って、nuxt startに必要なもののみ実行用イメージにコピーすれば、イメージサイズはかなり小さくなりそうですが、なにが必要なのか厳密によくわかってないのと、nuxtのバージョンにより必要なファイルが変わりそうなのとで、頑張るのやめました。

# 環境変数周りの注意事項

Nuxt.jsでは、`nuxt.config.js`で環境変数を定義できますが、これらの環境変数は、`nuxt build`時に[文字列リテラルに置き換えられる仕組み](https://ja.nuxtjs.org/api/configuration-env/)になってます。axiosモジュールのように、`nuxt.config.js`以外に環境変数から設定値を読み込む様になっているものもありますが、いずれにせよ、ビルド時に文字列リテラルに置き換えられます。
なので、実行環境に応じて変更したいものは、`nuxt start`時ではなく、`nuxt build`時に、環境変数または`nuxt.config.js`で指定する必要があります。

つまり、ビルド時に設定値が固定化されてしまうため、環境ごとに設定値を変更したい場合は、**環境ごとに別のイメージをビルドする必要があります**。Dockerイメージで使用する設定は、[Twelve-Factor Appでも言われている](https://12factor.net/ja/config)通り、**実行時に環境変数として指定するのが望ましい**ため、なんとかしたくなります。

対策として、[nuxt-env](https://github.com/samtgarson/nuxt-env)を利用すると、`nuxt start`時に指定した環境変数に、以下のようにアクセスできるようになります。

```vue
<script>
export default {
  mounted() {
    // コンポーネント内では、this.$envでアクセスできる
    console.log(this.$env.hoge)
  },
  asyncData(ctx) {
    // nuxtのコンテキスト経由でアクセスできる
    return {
      hoge: ctx.$env.hoge
    }
  }
}
</script>
```

```js:store/someModule.js
export actions = {
  someAction(ctx) {
    // Vuex store内では、this.$envでアクセスできる
    console.log(this.$env.hoge)
  }
}
```

VueコンポーネントやStoreで使用する設定値を変更したい場合はこの方法でなんとかなりますが、モジュールに渡す設定値を可変させたい用途では、残念ながらこの方法は使用できません。

結局は、環境別にイメージをビルドし直すしか、現状は方法がないようです。
Nuxt.js自体が、SPA+SSRを簡単にやるためのフレームワークであり、SPAの場合は環境別の設定はビルド時に組み込んじゃうのが一般的なので、しょうがないかなという感じはしますが、将来的になんとかなってほしいところです。
[MySQLのエラー] ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

ローカルに立てたデータベースサーバにローカルのCSVファイルからデータを読み込ませようとしたらエラーになったときのメモ。

### エラー内容

```sql:MySQL
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
```

### 実行環境
- OS : macOS Mojave (10.14.6)
- MySQL : バージョン 5.7.25

### 実行したクエリ

```sql:MySQL
LOAD DATA INFILE '/Applications/sample/TEST.CSV' INTO TABLE `something` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
```

### 正しいクエリ

```sql:MySQL
LOAD DATA LOCAL INFILE '/Applications/sample/TEST.CSV' INTO TABLE `something` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
```

`LOAD DATA INFILE ...` ではなくて `LOAD DATA LOCAL INFILE ...` とすることでエラーを吐かずに実行できました。前者はサーバ上のファイルを読み込む場合、後者はローカルのファイルを読み込む場合に使用します。
`ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement` のエラー内容で検索するとDBの設定ファイル、my.cnfやらmy.iniやらを編集するという記事がよく出てくるのですが、自分の場合、設定ファイルは特に触らずいけました。
また、クエリ内のテーブル名よりも後ろはオプションなので、どのような処理を走らせたいかで変わってくると思います。

ちなみにテーブル名 `something` のところをバッククォートで囲っていますが、SQLの予約語だったときにエスケープするためなので、基本バッククォートはなくても実行可能です。（むしろ予約語ならなるべくその名前を使わない方が良いと思うのでどうしてもという場合以外はなくて良いかも）

今日はそんな感じです！

### 参考URL
[MySQLでファイルのデータをテーブルに挿入する](https://qiita.com/tas6/items/55d4e58896c36836d10b)
[MySQLでCSVファイルを使って結果出力やデータ入力を行う方法](https://proengineer.internous.co.jp/content/columnfeature/6776)
[secure_file_privを設定してMySQLのファイル作成権限を変更する](https://webmemo.work/secure_file_priv/)
[[ MySQL ] データをCSVでエクスポートしようとして、secure-file-privに引っかかった件](https://qiita.com/bohebohechan/items/207e87786b1e30f60abe)
[phpMyAdminのSQLに付加される「’」に似た記号「`」は何？](https://php1st.com/1184?fbclid=IwAR2Xb1tMyBIS0FFCI1YJI5yZTr9bHZ1QpZlPPUxfg56V_25PF1JoRWzqXT8)
クラスタ参加コマンドをもう一度表示

```
kubeadm token create --print-join-command
```

出力

```
kubeadm join 192.168.0.111:6443 --token wci5w8.cdbdzurlz31ggq2l     --discovery-token-ca-cert-hash sha256:dc5f91d71626d835e4a9cdf661f34d868c3dff8b195f32187588721e9ceab94a
```
STM32マイコン体験セミナー（RTOS編）2019年11月5日実施

STM32マイコン体験セミナー（RTOS編）はNUCLEO-F429ZI（STM32F429）を使用して行われました。（2019年11月5日）

LANを搭載したNUCLEO-F429ZI上でイー・フォース社のµC3（RTOS）およびµNet3（ネットワーク･スタック）を構築する体験セミナーです。
（STマイクロのセミナーではありますが、eForce社が主催となります。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/26661cdc-9717-eb2b-dfdb-8ee4342f8422.png)

#使用物一覧
##・NUCLEO-F429ZI
https://www.st.com/ja/evaluation-tools/nucleo-f429zi.html
NUCLEO-F429ZIはCortexM4のSTM32F429を搭載したマイコンボードになります。
LANポートも搭載しており、Macの問題さえなければ、かなり使えるボードだと思います。

##・μC3/Compact
https://www.eforce.co.jp/uc3-compact/

##・EWARM（Embedded Workbench for ARM）
https://www.iar.com/jp/iar-embedded-workbench/#!?currentTab=free-trials
コードサイズ制限版で行われました。

##アジェンダ
###・RTOS全般の説明
###・STM32マイコンハンズオン
###・RTOSの機能紹介
###・STM32マイコンハンズオン

![IMG_0801.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0dbb9361-8101-09f0-28b6-5ff886cb6724.jpeg)
μITRON（μC3/Compact）を使用して、LEDとボタンの排他制御を行いました。

####最後はネットワーク通信まで行ったよ。
(LANケーブルが下だから見えない･･･）
![IMG_0802.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/112d380b-665d-d82d-a2a1-f8e437c6fd7b.jpeg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9d54c3a8-585e-f09e-3265-8d1eeb9ac77b.png)
LED Blinker Intervalを変更したりPing Requestを入れたり出来ます。

####無償版のMacアドレスは固定だそうです
ザ無念・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/724ec319-9f5f-187a-8569-6903a468e410.png)

###資料とか・・・
無償評価版がダウンロードできるようです。
https://www.eforce.co.jp/processors/#st

さらに、定員が少ないですが(今まで5回以上全落ちしましたが）イーフォース社でもセミナーを行っています。
###「RTOSをマスターしたい人のための体験セミナー」
https://www.eforce.co.jp/category/event/
[Vue] スライダーで割合を調整するUIを作成する

# サンプル

各要素(数は増減あり)の割合を調整するUIが欲しかったので、[vue-slider-component](https://github.com/NightCatSama/vue-slider-component) を使用して作成してみました。
スライダーの中にあるドット(点)を操作することで各 item の割合を調整できます。

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="e-q" data-slug-hash="eYYVGQX" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="vue-slider-component multiple dots">
  <span>See the Pen <a href="https://codepen.io/e-q/pen/eYYVGQX">
  vue-slider-component multiple dots</a> by e-q (<a href="https://codepen.io/e-q">@e-q</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

バインドしている dots の要素を増やすと点が増えます。
processFunc で返す配列が、各バーの始点・終点です。processFunc の引数には点の位置が配列で入ってきます。
参考 : https://nightcatsama.github.io/vue-slider-component/#/api/props?hash=process

## tooltip

codepen でうまくできなかったので省いていますが、下記のように書くことで各要素の値を tooltip で表示することもできます。
参考：https://nightcatsama.github.io/vue-slider-component/#/advanced/components-slots?hash=process-slot

<img width="627" alt="tooltip.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527434/b4b0f0a8-88d4-8ac0-0d32-b05df23caaa9.jpeg">

```vue:App.vue
<template>
  <main id="app"
      <vue-slider ref="slider" v-model="dots" tooltip="none" :process="processFunc" :enable-cross="false">
        <template v-slot:process="{ start, end, style, index }">
          <div class="vue-slider-process" :style="style">
            <div :class="[
              'merge-tooltip',
              'vue-slider-dot-tooltip-inner',
              'vue-slider-dot-tooltip-inner-top',
            ]">
              {{ getRaito(index) }}
            </div>
          </div>
        </template>
      </vue-slider>
  </main>
</template>
<style>
  .merge-tooltip {
    position: absolute;
    left: 50%;
    bottom: 100%;
    transform: translate(-50%, -15px);
  }
</style>
```