OmniAICreator/Qiita-1.07M huggingface dataset:
パニシング：グレイレイヴンのUI設定が好き

#はじめに

みなさん、「パニシング：グレイレイヴン」はもうプレイしましたでしょうか？

私は崩壊3rd推しだったので、もちろん注目していました。

皆さんも是非プレイしましょう！！！！

公式サイトはこちらです！
https://grayraven.jp/ (『パニシング：グレイレイヴン』公式サイト)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/5adfb327-0ccf-70b7-4609-617f05b935b4.png)


満を持して今日の正午にサービスが開始したこのゲームですが、設定の中のある項目に驚きました。

それがこちらです↓
ご覧ください。

![iOS の画像.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/fa9be7cd-d1d9-4056-1fb4-59473b8ed89d.gif)


はーーー天才！

と、言うわけで、コレを作ってみましょう。

#作り方
分からないけど、どうせUnityを使ってるのでUnityで作成します。

### シーン
まず、シーンを用意します。空で良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/6684043a-3237-256d-58f6-f98a8ace0a47.png)

何もありません。
ここに、Canvasを生成しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/ac9b5aec-78c7-5d78-eea8-af403070e3c2.png)

そしてその中にImageを投入します。
アンカーは縦横ともにストレッチにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/5fcbe9b9-f98c-c3b3-2b3e-fb64208f1acf.png)

コレが背景になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/d74fca34-4eeb-d4c7-7b19-2227814acdf7.png)

そうしたらまずは適当に右側についてくるモノを生成しましょう。
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/3ae34cea-da1f-6c8f-8dbe-34d90d25a14c.png)

ヒエラルキーはこんな感じ。



LeftSideとRightSideに項目を分け、その二つのアンカーも縦横をストレッチにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/ceb95348-431f-aaca-09dd-eeca5e31fa13.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/99287cc1-430b-9496-6088-19d4019d0be6.png)

そしてその項目のアンカーを下記のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/49377937-fd36-d5c8-a340-07a440d1bd6e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/dcb602cb-baf5-0e9f-8241-10f5f4c09d7b.png)

後はスクリプトを書くだけです。


###スクリプト

```C#:UIPositionController.cs
using UnityEngine;
using UnityEngine.UI;

public class UIPositionController : MonoBehaviour
{
    public RectTransform leftTransform;
    public RectTransform rightTransform;
    public Slider slider;


    private void Update()
    {
        // スライダーの値を取得する。(0～1)
        float value = slider.value;

        // スライダーの値を元に位置を動かす。
        float move = 10;
        leftTransform.offsetMin = new Vector2(value * move, 0);
        rightTransform.offsetMax = new Vector2(value * move * -1, 0);
    }
}

```

適当なObjectにつけて(canvasに付けた)、インスペクターにしっかりと設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/22f53f63-1d2a-33bc-2594-327b00211993.png)

そして実行すると見事成功です！！

![iOS の画像_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276381/64f763c5-dd02-a653-3a1e-99d7c469f39c.gif)

端のボタンが押しづらい！！手が短くて届かない！！などの理由がある人にはありがたい設定ですね！

#おしまい
暗号化と認証の仕組み ( 公開鍵 / 共通鍵 / 秘密鍵)

情報の機密性、完全性を保つ上で`暗号化`と`認証`の技術は欠かせないものです。
`機密性`：`限られた人だけが情報に接触できるように制限をかけているか。`
`完全性`：`不正な改ざんなどから保護できているか。`
`可用性`：`利用者が必要なときに安全にアクセスできる環境であるか。`

`暗号化`とは、`データを規則に従って変換し、第三者が解読できないようにすること`で、情報漏えい対策として、`通信の暗号化`、`ハードディスクの暗号化`、`ファイルの暗号化`などで利用されている。
暗号化前のデータを`平文`、暗号化されたデータを元に戻すことを`復号`という。

##共通鍵暗号方式
暗号化と復号で`同じ鍵(共通鍵)`を使用する。
共通鍵は第三者に知られないように秘密にする為、`秘密鍵暗号方式`とも呼ばれる。
`暗号化と復号の処理が高速だが、第三者に鍵が渡ってしまうと、暗号が解読されてしまうリスクがある。`

##公開鍵暗号方式
暗号化と復号で`異なる鍵を使用`し、`暗号化する鍵(公開鍵)を公開`し、`復号する鍵(秘密鍵)を秘密`にする。
暗号化と復号の処理が複雑なため、`処理に時間がかかるが、鍵の入手や管理がしやすい。`

##ハイブリット暗号方式
`共通鍵暗号方式と公開鍵暗号方式をメリットを組み合わせた方式。`
平文はサイズが大きいため高速な共通鍵で暗号化します。
しかし、`共通鍵をそのまま渡すと、情報漏えいすることで解読されるリスクがある為、`
`送信者→受信者の公開鍵で共通鍵を暗号化してから受信者へ渡す。`
`受信者→自分の秘密鍵で共通鍵を復号できるので、その共通鍵を使って暗号文を平文に復号できる。`
Sprockets::DoubleLinkError

初心者です。備忘録のため。残します。
超基本的な内容です。
## エラー内容

```ruby
Sprockets::DoubleLinkError
```

Rails にて erb ファイルを作成して、表示しようとしたら上記発生。ターミナル確認すると以下記述あり。

```ruby
ActionView::Template::Error (Multiple files with the same output path cannot be linked ("style.css")
In "/Users/○○/git/photo_submission/app/assets/config/manifest.js" these files were linked:
  - /Users/○○/git/photo_submission/app/assets/stylesheets/style.css
  - /Users/○○/git/photo_submission/app/assets/stylesheets/style.scss
):
```

## 原因

調べてみたら、Rails は rails new したときに自動で作成される views/layauts/application.html.erb を参照して HTML ファイルを作るようです。

[Sprocketsの仕組み - Qiita](https://qiita.com/ttaka66/items/991a52081a92cb6c2738)

[Rails初学者がつまずきやすい「アセットパイプライン」](https://www.transnet.ne.jp/2016/02/28/rails%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%8C%E3%81%A4%E3%81%BE%E3%81%9A%E3%81%8Dcolnr%E3%80%8C%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3/)

 assets ファイル以下のデータ群を一つに圧縮する（アセットパイプライン）。

views/layauts/application.html.erb

```ruby
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
```

　あとで erb ファイルに変更しようと思って、先に普通の HTML ファイルで作成しており、深く考えずに style.scss を作成していた。VSCode の拡張機能の Live Sass Compiler でstyle.css も自動で作成されており、これがエラーの原因。

assets/stylesheets/application.css に style.scss の記述を写し、stylesheets 直下には application.css だけ残すようにファイルの構造を調整して、再度出力すると問題なく表示できた。
Dxライブラリだけで画像の色を変えて使う(C++ Only)

#前置き

png画像を読み込み、色データを変え、それからテクスチャに変換する一連の処理を
別スレッドで行いたい、と考えて、
OpenCvの導入や使い方も全然よくわからないために、いろいろ試してみてたら、
DxLibのBASEIMAGE型を使ったらうまくいきそうな感じなので、備忘録に

＊C#向けDxLibではBASEIMAGE型(とそれを使う関数)が使用できない関係でC++限定です

＊環境整備などはやってある前提で書いてますが、
何回もこのコードを実行をして確かめてみたところ、一度も不具合は起きていないため問題はないと
判断しています

#c++コード

重要なのはLoadAsyncTest関数の内部ですね

```c++

#include <iostream>
#include <DxLib.h>
#include <thread>

namespace {
	auto texture = -1;
}
 
void LoadAsyncTest() { 
	//BASEIMAGE型を使う処理　ここから

	BASEIMAGE base_image;
	 
	CreateBaseImageToFile(L"b8.png", &base_image);
	
	if (base_image.ColorData.ColorBitDepth <= 8) {
		//8ビット画像の色変え
		//
		//*
		//　パレットの数(BASEIMAGE.ColorData.Paletteの要素数)は、256で固定なので、
		//　ループ等でアクセスする際は、この範囲を超えないように気を付ける
		//*
		for (auto i = 0; i < 256; i++) {
			SetPaletteBaseImage(&base_image, i, 255, 255, 255, 255);
		}
	}
	else{
		for (auto x = 0; x < base_image.Width; x++) {
			for (auto y = 0; y < base_image.Height; y++) {
				//8ビット以外の画像の色変え
				SetPixelBaseImage(&base_image, x, y, 255, 255, 0, 255);
			}
		}
	}

	texture = CreateGraphFromBaseImage(&base_image);

	ReleaseBaseImage(&base_image);

	//BASEIMAGE型を使う処理　ここまで
}

int32_t main() {
	SetMultiThreadFlag(TRUE);
	ChangeWindowMode(TRUE);
	if (DxLib_Init() != 0) return -1;

	//非同期で画像読み込みと色変えとGraphに変換を実行
	std::thread th(LoadAsyncTest);

	while (ProcessMessage() == 0) {
		if (texture != -1) DrawGraph(70, 40, texture, TRUE);
	}

	th.detach();

	DxLib_End();

	return 0;
}


```

#最後に

C#(.net core 3.1 や.net 5)で、C#用DxLibを使って画像読み込みなどをマルチスレッドで実行すると、
謎の不具合が高確率で起きて突然クラッシュしまくりな上に、こうなる原因が全く分からず、
DxLib使うなら、C++に移行しないといけないかなって感じになってる
pymongo.errors.CursorNotFoundの対処法

PyMongoでこのエラーが出た時の対処法が1つにまとめられていなかったので、ここに記述します。

こちらの記事によると、2つの原因が考えられるという。
https://qiita.com/koshilife/items/bece28d331cda5469c33

* タイムアウトの設定時間超過
* バッチ取得サイズ16MBを超えた時

##タイムアウトの設定時間超過
タイムアウトの設定時間超過が原因の場合、`no_cursor_timeout=True`のオプションを追加する事によって解決ができる。そして、cursorは使用後に自分で閉じる必要があるので、`cursor.close()`を記述する。

```python

cursor = collection.find(query, no_cursor_timeout=True)
cursor.close()
```

##バッチ取得サイズの超過
バッチ取得サイズの超過が原因の場合、`batch_size=10`のオプションを追加する事によって解決ができる。ただしbatch_sizeは自分の環境に合わせて適切な値に設定してください。

```python
cursor = collection.find(query, batch_size=10)
```
Pythonで指定ディレクトリのHEICファイルをJPEGへ変換する

# 1.はじめに
iphoneの写真データをPCにインポートしたら見慣れない拡張子を発見しました。
なんというか不便なのでJPEGへの変換方法を調べたので、自分用のメモ兼ねて残します

# 2.準備とか参考にした記事とか
コード書くにあたってこちらの記事を参考にさせていただきました。
[HEICとか何なのかは知りません。でも、とりあえずはPNGにしよう！](https://qiita.com/Retsuki/items/832599f9946a7beb6834)
**ありがとうございます！！**

pythonの標準ライブラリ以外でPillowとpyheifを使います。
pyheifについてはこちらを参照ください。
[pyheif](https://pypi.org/project/pyheif/)

## pyheifのインストール

```console
$ pip install pyheif
```
# 3.コードとか
難しいことはやってないです。
カレントディレクトリと下にHEICファイル突っ込んで、同じフォルダにJPEGファイルを生成するだけ！

```python
from PIL import Image
import pyheif
import pathlib
import glob


def heic_png(image_path, save_path):
    # HEICファイルpyheifで読み込み
    heif_file = pyheif.read(image_path)
    # 読み込んだファイルの中身をdata変数へ
    data = Image.frombytes(
        heif_file.mode,
        heif_file.size,
        heif_file.data,
        "raw",
        heif_file.mode,
        heif_file.stride,
        )
    # JPEGで保存
    data.save(str(save_path), "JPEG")


# 変換対象のファイルがあるディレクトリ
# カレントの下のtempディレクトリを指定
image_dir = pathlib.Path('./temp')
# globでディレクトリ内のHEICファイルをリストで取得
heic_path = list(image_dir.glob('**/*.HEIC'))

# リストのHEICファイルを１個づつJPEGへ変換
for i in heic_path:
    m = "./" + str(i)
    n = './temp/' + str(i.stem) + '.jpg'
    heic_png(m, n)

```

間違いなどありましたら、ご指摘お願いします！
ASP.NET Core Blazor 案件を成功させる為のスキルセットや開発体制について

こんにちは！

インフラジスティックス・ジャパン、テクニカルコンサルティングチームの古堅です。

C# で SPA を構築できるテクノロジーとして ASP.NET Core Blazor (以降、Blazor)  が注目されていますね。

Blazor を採用したいというお声もよく聞くようになりましたが、実際に必要なスキルセットは何か？ どんな開発者体制が良いのか？

本記事で解説します！

<!-- more -->

## Blazor 案件に必要なスキルセット

#### 必要なスキルセット

Blazor アプリケーションの構築には、必要なスキルセットは以下となります。

・HTML + CSS ... デザイン面

・C# ... ビジネスロジック

・JavaScript ... Blazor がサポートしていない機能のカバー

Blazor は JavaScript の代わりに C# でコードが書けるのではないか？と疑問に思う方もいるかと思いますが、JavaScript を全く書かずにアプリケーションを構築することは出来ません。

#### Blazor でも JavaScript は必要、どんな場面で JavaScript が必要なのか？

必要に応じて JavaScript のコードを書く場面があります。

よくあるシナリオとしては、 フォーカスの設定 (※1) や、メッセージボックスの表示などが挙げられます。


#### JavaScript が必要な事例 1 : フォーカス設定 (C# から JavaScript を呼び出す) ※1

C# から JavaScript へ、一方通行の処理としてフォーカス設定(※1)が挙げられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/c584d9a0-feb6-3cad-c3ec-ecf9f1dc41b4.png)

※1 .NET5 以降は、フォーカス設定は、C# から設定できるよう標準でサポートするようになりました！


#### JavaScript が必要な事例 2 : メッセージボックスの表示 (C# と JavaScript  の相互呼び出し)

C# と JavaScript  の相互呼び出しの事例として、確認メッセージを表示し、エンドユーザーに選択を促すようなシナリオがあります。


>   【メッセージ例】

> 「入力した内容で申請しますか？」

>  -> はい

>  -> いいえ


Blazor の一連の流れとしては、下記の通りになります。

① C# から JavaScript に確認メッセージの表示指示を出す。

[ASP.NET Core Blazor で .NET メソッドから JavaScript 関数を呼び出す](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/call-javascript-from-dotnet?view=aspnetcore-5.0)

② ユーザーの選択結果(はい or いいえ)を JavaScript から C# に通知する。

[ASP.NET Core Blazor で JavaScript 関数から .NET メソッドを呼び出す](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/call-dotnet-from-javascript?view=aspnetcore-5.0)


#### 但し、参画メンバー全員が JavaScript のスキルが必要というわけではない

JavaScript の呼び出しは、C# でラップしライブラリ化することが出来ますので、JavaScript のスキルを持っているメンバーがライブラリ化を行い、その他メンバーはそのライブラリを通じて JavaScript の機能を利用することが出来ます。


## Blazor 案件の開発体制について

上記の Blazor の特徴を踏まえて、スキルセットと開発体制を考えると

① C# および JavaScript のどちらも出来るメンバー

   ➡ JavaScripot をラップしたライブラリを作るメンバー (少人数でOK)

② 業務画面、業務ロジックを作成するメンバー

   ➡ ①が作成したライブラリを使用するのでスキルは C# のみ (大人数でOK)

Blazor を採用する理由に C# エンジニアが多数在籍している。というお声をよく聞きますが、どうしても JavaScript が必要になる場面があるでしょう。

そのため、少人数あるいは、1人でもJavaScript のスキルが有るメンバーが参画することで、よりスムーズに開発を進めることが出来ます。

## まとめ

本記事では、Blazor の開発に関するスキルセットや、体制について紹介しました。

弊社では、新しい開発テクノロジーを採用する際の、必要なスキルを学べる技術トレーニングを提供しています。

技術トレーニングでは、お客様の開発要件をお伺いしながら、要件定義フェーズから実装フェーズまでご支援します。

もしお悩みをお抱えであれば、是非[こちら](https://jp.infragistics.com/about-us/contact-us#contactform)からお気軽にお問合せください！


## 開発全般に関するご相談はお任せください！

インフラジスティックス・ジャパンでは、各プラットフォームの特別技術トレーニングの提供や、開発全般のご支援を行っています。

「古い技術やサポート終了のプラットフォームから脱却する必要があるが、その移行先のプラットフォームやフレームワークの検討が進まない、知見がない。」

「新しい開発テクノロジーを採用したいが、自社内にエキスパートがいない。日本語リソースも少ないし、開発を進められるか不安。」

「自社のメンバーで開発を進めたいが、これまで開発フェーズを外部ベンダーに頼ってきたため、ツールや技術に対する理解が乏しい。」

「UIを刷新したい。UIデザインやUI/UXに関する検討の進め方が分からない。外部のデザイン会社に頼むと、開発が難しくなるのではないか、危惧している。」

といったご相談を承っています。

お問合せは[こちら](https://jp.infragistics.com/about-us/contact-us#contactform)からお気軽にご相談ください。
第7回

\![Ubuntu-20.04.1](<https://img.shields.io/badge/Ubuntu-20.04.1-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

これは講義用のまとめサイトです。見た人は是非LGTMを押しといてください。


# やったこと

-   bundler
-   if, case, Array.each


# if, case, Array.each

条件分岐を取り扱おうということだ


### お題

入力された年数がleap year(うるう年)かどうかを判定する<br>プログラミングの実習でよくある課題だが、条件分岐が複雑


### まず4の倍数かどうかを判定する

入力部は

```ruby
p year = ARGV[0].to_i
```

to\_iとはIntegerであるということを示すものらしい

```ruby
if year%4==0 then
  p true
else
  p false
end
```

最初の条件分岐文がこちら。yearを入力として、それを4で割った余りが0ならtrue、そうじゃなければfalseだぞ、と出力するこれを実行すると

```ruby
> ruby check_leap.rb 2004
2004
true
```

1997の場合は

```ruby
> ruby check_leap.rb 1997
1997
false
```

となる


### 特殊な年数の場合をはじいていく

100で割り切れる年はうるう年でなく、400で割り切れる年はうるう年であるという二点を判定できるようにする<br>こういう例外処理は先に済ませておこうと思う。また、長くなってきたのでmethodにしておく

```rudy
p year = ARGV[0].to_i
def leap?(year)
  if year % 400 ==0
    p true
  elsif year % 100 ==0
    p false
  elsif year % 4 == 0
    p true
  else
    p false
  end 
end
leap?(year)
```

これを実行すると

```ruby
> ruby check_leap.rb 1900
1900
false
```

2000の場合は

```ruby
> ruby check_leap.rb 2000
2000
true
```

となった。100の倍数だが400の倍数でない1900と、100の倍数かつ400の倍数である2000を区別できている


### array, eachを使う

大量の値を一気にテストしたいときにはarray(配列)が便利。

```ruby
def leap?(year)
  if year % 400 ==0
    p true
  elsif year % 100 ==0
    p false
  elsif year % 4 == 0
    p true
  else
    p false
  end
end
[1900,1997,2000,2004].each do |year|
　p year
  leap?(year)
end
```

実行すると

```ruby
> ruby check_leap.rb
1900
false
1997
false
2000
true
2004
true
```

正しく判定されてますね


# case

授業中では扱ってなかった気がするけどcaseを使うとさらにコードのrefactoringが可能<br>caseを使って先ほどのコードを書きなおして

```ruby
def leap?(year)
  case
  when year % 400 ==0 ; return true
  when year % 100 ==0 ; return false
  when year % 4 ==0 ;   return true
  else                  return false
  end
end
[1900, 1997, 2000, 2004].each do |year|
  p year
  leap?(year)
end
```

で動くかと思ったら

```ruby
> 1900
> 1997
> 2000
> 2004
```

となり、判定が行われていない？？？(red)<br>と思ったけど、よく見たらleap?(year)の結果の出力部が記述されてないじゃん、ということで、13行目を

```ruby
p leap?(year)
```

として動かすと

```ruby
> 1900
> false
> 1997
> false
> 2000
> true
> 2004
> true
```

よかった、プログラムは短くなったしgreen状態にできた


# 参考記事

-   [チャート式ruby-III(if, case, Array.each by leap year)](<https://qiita.com/daddygongon/items/a550bde1ed6bff5217d8>)



------
 - **source** ~/MasahiroOba/grad_members_20f/members/MasahiroOba/chapter7.org
Laravelでsqliteの設定

#.envの修正
```
#DB_CONNECTION=mysql
#DB_HOST=127.0.0.1
#DB_PORT=8889
#DB_DATABASE=webtools
#DB_USERNAME=webtools
#DB_PASSWORD=

DB_CONNECTION=sqlite
DB_DATABASE=./database/database.sqlite
DB_FOREIGN_KEYS=true
```
#sqliteファイル作成
```
touch database/database.sqlite
```
#キャッシュをクリアし、migrationテスト
```
php artisan cache:clear
php artisan migrate
sqlite3 database/database.sqlite 
sqlite> .tables
migrations         password_resets    users  
```
ExcelやcsvでもらったマスタデータをLaravelのseederでデータ登録する

区分値だったりデータベース上で管理するマスタデータをexcelやcsvで共有されることが多いです。

マスタデータなどはLaravelのSeeder機能を使ってレコード追加していきたいので少し工夫してみたという記録です

例えば都道府県の登録
以下のようなcsvがあるとします。
これをいちいち登録するのはうんざりする作業なのでcsvからLaravelのSeederを使って登録したいです


```csv:todofuken.csv

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

単純な話でただcsvを一行ずつ読んで
insertしていくスクリプトを書くだけです。

```php:Area1TableSeeder.php
<?php

use Illuminate\Database\Seeder;

class Area1TableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        if (($handle = fopen(__DIR__ . './todofuken.csv', 'r')) !== false) {
            while (($data = fgetcsv($handle))) {
                DB::table('m_todofuken')->insert([
                    'id'   => $data[0],
                    'name' => $data[1],
                ]);
            }
            fclose($handle);
        }
    }
}

```

csvファイルもリポジトリで管理しておけばマスタデータが変わったよなんて言うときにも
csvを編集してseedを実行してあげればいいので楽ちんですね

終わり
M5Stack CoreInkの最初の1歩

# M5Stack CoreInkを買った
　スイッチサイエンスさんから、M5Stack CoreInkを購入したので、作業のメモです。

# ツールの入手
　[M5Stack Docs](http://docs.m5stack.com/#/en/quick_start/coreink/quick_start_arduino)を見ながら、まずはCP2104ドライバーのダウンロード＆インストール。続いてArduino-IDEのインストールを行う。
　Arduino-IDEを起動し、環境設定の追加のボードマネージャのURLにM5Stack Boards Managerのアドレス

```
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
```
を入れ、ツールのドロップダウンメニューで「ボード: "Arduino Uno"」となっているところを選んで「ボードマネージャー」を選択。
ボードマネージャーの表示を一番下までスクロールすると、M5Stackが出てきた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/01bd5888-e7d9-0e97-5d91-55ee2577ad59.png)
バージョンの一番新しいやつが1.0.6だったので、インストール。
ダウンロード＆インストールが始まり、完了したら、ダウンロードマネージャを閉じる。
ボードをM5Stack-CoreInkに変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/e078622c-6793-f0ff-b58e-1199d458743c.png)
スケッチメニューからライブラリを管理を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/09a274e6-0a75-f74a-ad0d-0782ec005798.png)
ライブラリマネージャでcoreinkを検索してインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/8ff3bc25-7bdc-eec6-fbe4-9d14c6ff978c.png)
ファイルのスケッチ例から、ずーっと下をたどると、M5-CoreInkのサンプルスケッチが見つかるので、FactoryTestを選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/8d46f986-abf0-bdbf-739f-8043d65d3319.png)
いきなりマイコンボードに書き込んでみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/e34e6980-66fb-4e4a-da3d-4751e9f555d7.png)
結構、コンパイルに時間がかかる。
スケッチの書き込み中にエラーが発生。

```
スケッチの書き込み中にエラーが発生しました

「ファイル」メニューの「環境設定」から
「より詳細な情報を表示する：コンパイル」を有効にすると
より詳しい情報が表示されます。
```
　Arduinoは、USBをシリアルポートとして使っているので、その接続がおかしいのだろうと推測し、M5Stackを抜き、ツールからシリアルポートを見るとCOM1, COM3がすでにある。USB接続させてからもう一度見ると COM4 が増えていたので、これを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/27cd70fd-8d77-3ef2-0e71-75922f855c54.png)
再度、書き込みを行うと、「ピー」と音を鳴らして書き込みが完了。
右のダイヤルを上に動かすと、Wi-Fiのスキャン画面が表示された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/a26a1efd-effc-67de-70e5-6671b56d0db9.png)
RTCのスケッチを書き込み。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/99a710c8-127a-bb66-1b4c-3775599e409b.png)

日付、時間はスケッチに直打ちになってるので正しい時間になっていないが、文字がちいさい。。。。

とりあえず、次の1歩までが長くなりそうなので、RTCのスケッチを使って日時を設定。書き込みまで2分くらいかかるので、4，5分先の時間を書き込んでおいて、指定時間の5秒前くらいにリセットかけてやれば、ぴったり。そのあと、FactoryTestを書き込んでやると、正しい日時で表示されるようになります。
TensorFlow 2.4.0-rc3のビルド手順（Windows10, CUDA11.1.1, cuDNN 8.0.5, Python 3.9.0）

2020/11/30時点でのTensorFlow 2.4.0-rc3のビルド方法の概要を残しておきます。

毎回同じような手順でビルドできるようになってきていますが、その時々で注意すべきポイントや手順があったりします。今回の組み合わせでは、Numpyのバージョンにだけ気をつければ正常にビルドできました。ビルド時点でNumpyの最新バージョンは1.19.4でしたが、このバージョンはWindows環境だとNumpyをimportするだけでエラーになるので、1つ前の`1.19.3`を使用します。

## 追伸

### 2020/12/05

私の環境だけかもしれませんが、以下環境の組み合わせで利用すると作成したTensorFlowのwheelパッケージをインストールする際に`Failed to build h5py grpcio`となりインストールに失敗します。
バージョンは`h5py 3.1.0`、`grpcio 1.34.0`になりますが、現時点で解決策は調べられていません。

### 2020/12/06

作成したTensorFlowのwheelパッケージのインストールで失敗する件、`Python 3.9.0`を利用したときの依存パッケージの組み合わせなどに起因しているエラーのように見えます。
全く同じ設定で`Python 3.8.6`を利用したら問題ありませんでした。

## 環境情報

ビルドに利用した環境です。CUDAやcuDNNのフォルダなど、事前にパスを通した状態になっています。

* Windows 10 Pro 20H2 (64bit)
* Visual Studio Community 2019 Ver 16.8.2
* ~~Python 3.9.0~~ Python 3.8.6（3.9.0を使うとwheelパッケージインストール時にエラーになります）
* MSYS2（`pacman -S git patch unzip` で必要なパッケージを導入済み）
* Bazel 3.7.1 （3.1.0以上のバージョンを使う必要あり）
* CUDA 11.1.1
* cuDNN 8.0.5.39

## ビルド用のフォルダ構成など

今回は`S:\build\build_tf240rc3` フォルダ配下にTensorFlowのソースコードをダウンロードしてビルドしています。Pythonの仮想環境も、TensorFlowビルド用に用意します。

```powershell
S:/build/build_tf240rc3  # 作業フォルダRoot
 + tensorflow  # gitで取得してくるソースコード
 + venv        # Python仮想環境
 + wheelhouse  # 作成したwhlファイルを格納するフォルダ
```

## ビルド手順

`x64 Native Tools Command Prompt for VS 2019` を起動して以下の手順でビルドを行います。

```powershell
# 仮想環境を作成して有効化する
python -m venv s:\build\build_tf240rc3\venv
cd /d s:\build\build_tf240rc3
.\venv\Scripts\activate.bat

# 必要なパッケージのインストール
# 注意：Numpyは最新の1.19.4を使うとエラーになるので1.19.3を使用（利用時もNumpy 1.19.3を使用すること）
python -m pip install --upgrade pip
pip install numpy==1.19.3
pip install six wheel
pip install keras_applications==1.0.8 --no-deps
pip install keras_preprocessing==1.1.2 --no-deps

# ソースコード取得（v2.4.0-rc3のタグ指定）
git clone -b v2.4.0-rc3 https://github.com/tensorflow/tensorflow.git
cd tensorflow

# 環境によってはコマンドのパラメーターが長くなりすぎてエラーになるので不要な環境変数を削除
set _OLD_VIRTUAL_PATH=

# ビルド構成の設定
# CUDA support: Y
# CUDA compute capabilities: 7.5 （利用環境に合わせて変更）
# Optimization: /arch:AVX2 （利用環境に合わせて変更）
# それ以外はデフォルト設定（Enter）
python ./configure.py

# ビルド
# TensorFlow 2.3.0+CUDA11の場合は「DTHRUST_IGNORE_CUB_VERSION_CHECK」のおまじない（CUB互換チェックのスキップ）が必要だったが今回は不要
bazel build --config=opt --config=avx2_win --config=short_logs --config=cuda --define=no_tensorflow_py_deps=true --copt=-nvcc_options=disable-warnings //tensorflow/tools/pip_package:build_pip_package

# パッケージの作成（wheelhouseフォルダにパッケージを作成）
# 数分間画面が更新されないので心配になりますが、きちんと処理されているのでしばらく待ちましょう
bazel-bin\tensorflow\tools\pip_package\build_pip_package ..\wheelhouse
```

これで完了です。
なおビルドに使用したbazelの中間ファイル等は`%UserProfile%\_bazel_%UserName%`フォルダに作成され、容量も20GB近くになるので、不要であれば削除しても問題ありません。Bazelが起動していると削除できないので、その場合はコマンドプロンプトで`bazel shutdown`として、Bazelを終了してから削除してください。
ml-agentsのstepとframeの関係がよく分からなかったので調べてみた。

## 結論
* Update => 可変
* OnActionReceived => 50/s (Fixed Timestep依存) = step
* CollectObservations, Heuristic => 10/s = Desicion Period * step

ML-Agentsのセンサーに、加速度と重力方向を渡そうと思ったら、自分がフレームとステップの関係をよく理解できていなかったことが原因でうまく行かなかったのでまとめてみました。
## Update関数の呼ばれる頻度
可変。Updateは画面のリフレッシュレートに応じて、1秒あたりに呼ばれる回数が決まっていない。これはUnityの基本。

## OnActionReceivedの呼ばれる頻度
固定。画面のリフレッシュレートに関係なく、1秒当たり固定回呼ばれ、これ1回が1stepに相当する。
FixedUpdate関数の呼ばれる頻度で処理しているようで、プロジェクトの設定からFixed Timestepを変更すると変わってしまうため注意が必要。規定だと1秒に50回実行。

## CollectObservations, Heuristicの呼ばれる頻度

コンポーネント「Decision Requester」で設定している「Decision Period」の数だけstepが進むと実行される。
既定値の5が設定されている場合、Fixed Timestepが規定値の「0.02」であれば、5/50で1秒当たり10回呼び出される。
micro:bitで電波時計を作った話

#電波時計とは
日本の時刻の基準は、国立研究開発法人情報通信研究機構（NICT）が「日本標準時」として生成しています。NICTが保有する原子時計から生成した国際標準時（UTC、かつてはグリニッチ標準時GMTとしておなじみでした）を9時間進めたものを日本標準時として、NTPなどの各種時刻サービスを運用しています。詳しくは下記のリンクを参照してください。
https://jjy.nict.go.jp/index.html

時刻サービスの一つに標準電波JJYがあります。JJYは標準電波を送信する無線局のコールサインで、2001年までは5MHｚ、10MHzなどの短波帯で音声信号による時刻情報を送出していました。
現在は40KHｚ、60KHｚという日常では縁のない長波帯で独特の2進化10進数でコード化した時刻情報（タイムコード）を送出しています。

市販の電波時計は、この長波帯でコード化した時刻情報を受信・解析して、時刻を較正しているわけです。
コードについてはNICTのサイトに解説がありますが、時、分、曜日、年などの情報を1秒ごとのパルスで送信しており、パルスの間隔が秒の情報となります。
https://jjy.nict.go.jp/jjy/trans/index.html

パルスの幅も情報の一つで、幅でバイナリの０と１、マーカーを区別しています。時刻情報はマーカーの区切りごとに8ビットのBCDでコード化されています。
*コードの例*
https://jjy.nict.go.jp/jjy/trans/timecode1.html
![timecode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927104/3506daef-52ea-a1f7-9e5c-ddbf2796780a.png)
最初のマーカーが「ｘ時ｘ分０秒」をあらわしますが、分・時の情報を全て取得するのに20秒かかるため、マーカーの時刻がわかるのは20秒後ということになります。
原理的にリアルタイムに時刻を取得することはできず、あくまである程度正確な時計の較正用ということです。
#JJY受信機
電波時計を自作する場合、40KHｚ/60KHｚが受信できる装置をどうするか、が最初の問題になりますが、幸いその目的のモジュールが販売されています。aitendoのD606Cというモジュールを使用しました。
https://www.aitendo.com/product/9148
![denpatokei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927104/738f7773-1fa5-c8f4-38be-41d0ab54535e.png)
CME6005というチップが使われており、バーアンテナもついていて、面倒な部分は処理して頂いているようです。助かります。
![IMG_1711_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927104/a3da404a-d6e0-246e-b534-88626e385f8b.jpeg)
電源をつなげば出力端子にタイムコードが出て来ます。自室でJJYの電波が受信できないため、テスト用にJJYシミュレータを使用しました。
![ocsillo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927104/1557d2ad-b860-d807-4006-6fe3337c292a.png)

#micro:bitでタイムコードを解析する
電波時計モジュールの出力は、上記のように3種類の幅を持つアナログ信号です。パルスの幅をmicro:bitで取得して、「１」「０」「マーカー」を識別する必要があります。
micro:bitには「入出力端子」のカテゴリに「P0に正パルスが入力されたとき」や「受け取ったパルスの長さ(マイクロ秒）」というブロックがありますが、まさにこういう場面で使う機能でした。
![microbitPG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927104/97eeaf01-de20-1e1d-e811-62177a5740d1.png)
ノイズを除去するため一定幅以下のパルスは無視して、パルス幅で１，０を識別し、分と時を格納するバッファ（配列）に書き込みます。分と時さえ取得できればよいので、残りの情報は切り捨てています。
プログラムはこちら
https://makecode.microbit.org/_E20VUW8aCRVr
#時計の形にする
![mojiban.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927104/e2f6661e-75ef-1209-0a0c-f11564381df8.png)
時計本体もmicro:bitで作りますが、ＬＥＤに表示するだけだと面白くないのでアナログ時計にしました。一番単純にサーボの回転角で表現しています。
電波時計がタイムコードを解析し終わると、micro:bitの無線で時計本体に時刻を送信するようにしています。
構造はレゴ、サーボはレゴ対応のGeekservoの灰色のやつで作りました。
文字盤は見やすいように紙コップで縦型にしました。表示は0時~11時、0分~59分と変則ですが、実用上は問題ありません。

こちらの本家サイトに動画もありますので、よろしければご覧ください。
http://make-lab.sakura.ne.jp/RadioClock.html
応用数学

#線形代数
ベクトル…大きさと向きをもったもの
積の求め方…基本はたすき掛け
連立方程式を行列を用いて解く…行基本変形、つまり行列の変形を行うことにより解く
　　　　　　　　　　　　　　　手順自体も計算として表せる
逆行列…行列の逆数のような物
単位行列…掛けても、掛けられても相手が変化しない
単位行列と逆行列…逆行列を左から掛けたり、右から掛けると単位行列になる
逆行列の求め方…掃き出し法→左右の係数の行列に同じ行基本形を実行する
逆行列が存在しない条件…解がない、解が一組に定まらないタイプの連立方程式
行列式の特徴…逆行列の有無を判別する平行四辺形の面積を行列式という
　　　　　　　行列式には線形性がある
固有値と固有ベクトル…特殊なベクトルとｘとその係数λを行列Ａに対する固有ベクトル、固有という
固有値と固有ベクトルの求め方…固有値は行列式が０になることより、2次方程式を解いて求める。固有ベクトルは比率しかわからない
固有値分解…固有値に分解することによって、行列の累乗の計算が容易になる。また行列の特徴がわかり、行列を分類することが出来る。
特異値分解…正方形以外の行列を分解したもの
特異値分解の求め方…正方形以外の行列に転置した行列を掛けると正方行列になるので、それを固有値分解すれば良い
特異値分解の利用例…画像を特異値分解することで、画像を圧縮できる。また、特異値により分類することで教師なし学習ができる。
統計学…大量のデータを読めるようになりたい
集合とは…ものの集まり
確率…頻度確率（発生する頻度）、ベイズ確率（信念の度合い）
条件付確率…ある事象が与えられた条件下で、起こる確率
独立な事象の同時確率…お互いの発生には因果関係のない事象が同時に発生する確率。それぞれの事象を掛け合わせることで求められる。

#確率統計
記述統計と推測統計…記述統計（集団の性質を要約し記述する）
　　　　　　　　　　推測統計（集団から一部を取り出し、母集団の性質を推測する）
確率変数と確率分布…確率変数（事象と結びつけられた数値、事象そのものを指すと解釈する場合も多い）
　　　　　　　　　　確率分布（事象の発生する確率の分布、離散値であれば表に示せる）
期待値…その分布における、確率変数のありえそうな値
分散と共分散…分散（データの散らばり具合、データの各々の値が期待値からどれだけずれているか平均したもの）
　　　　　　　共分散（２つのデータ系列の傾向の違い、正の値は似た傾向、負の値は逆の傾向、ゼロは関係性が乏しい）
標準偏差…２乗することの逆演算（つまり平方根）をすれば元の単位に戻る
様々な確率分布Ⅰ…ベルヌーイ分布（コイントスのイメージ、裏と表の出る割合が等しくなくとも扱える）
　　　　　　　　　マルチヌーイ分布（さいころを転がすイメージ、各面の出る割合が等しくなくとも扱える）
様々な確率分布Ⅱ…二項分布（ベルヌーイ分布の多試行版）
　　　　　　　　　ガウス分布（釣り鐘型の連続分布）
推定…母集団を特徴付ける母数を統計学的に推測すること
推定量と推定値…推定量（パラメータを推定するために利用する数値の計算方法や計算式のこと。推定関数とも）
　　　　　　　　推定値（実際に試行を行った結果から計算した値）
標本平均…母集団から取りだした標本の平均値
　　　　　サンプル数が大きくなれば、母集団の値に近づく→一致性
　　　　　サンプル数がいくらであっても、その期待値は母集団の値と同様になる→不偏性
標本分散…一致性は満たすが、不偏性は満たさない
不偏分散…平均に拘束されるので、その分１減らして、ｎ－１で割り、修正する（大きくする）
情報理論…増加の比率が違えばわかりやすさが違う
自己情報量…対数の底が２のとき、単位はｂｉｔ　logをとることで、場合の数が増えていくと増加する
　　　　　　対数の底がｅのとき、単位はｎａｔ
シャノンエントロピー…微分エントロピーともいうが、微分しているわけではない。自己情報量の期待値
カルバック・ライブラー　ダイバージェンス…同じ事象・確率変数における異なる分布Ｐ，Ｑの違いを表す
交差エントロピー…ＫＬダイバージェンスの一部分を取り出したもの、Ｑについての自己情報量をＰの分布で平均している

[３ヶ月で現場で潰しが効くディープラーニング講座](http://study-ai.com/jdla/)
【LINE WORKS】外部トーク機能（LINE連携機能）を使ってみよう

みなさんこんにちは。今年はコロナ禍の影響もありテレワークされている方も多いかと思います。

LINE WORKSもテレワークで使えるツールの一つだと思いますが、
意外と知られてないLINE WORKの機能「外部トーク連携（LINE連携）」機能はご存知ですか？

これ、使い方によっては、非対面での営業活動にも使える便利な機能です。
なかなか営業活動でLINEを使うのって、個人のアカウントをあまりお客様や取引先の方と交換するのに抵抗ある人もいるのではないでしょうかね。

これ使うと社内だけでなく、社外の人（のLINEやLINE WORKS）とも繋がり、いろんなシーンで使えますよー。
![linexlineworks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532932/700e3f48-2291-c6fa-f7d5-67bdf6b363a2.png)

#使えるプランは？
LINE WORKSにはいろんなプランがありますが、「外部トーク（LINE連携）」機能はどのプランでも使えて便利です。まず覚えておきたいのは、

・有料版だと管理者による利用設定が必要です。つまり管理者から外部の人と繋がって良いですよ、と許可されてる人しか使えないって事です。
・フリープランだとデフォルトで権限が付与されるため設定は不要です。

仕事してる中で、会社からは禁止されてるけど、こっそり自分のLINEアカウントで外部の人と繋がって仕事のやりとりする、なんてちょっと危なくて嫌なだな、、、なんて時に、このLINE WORKSの外部トーク機能がおすすめです。LINE WORKSで繋がっておけば、ログなんかも取れますから。（ログの話はまた別の機会で）

#有料版での外部トーク設定のやり方
LINE WORKSユーザーが外部のLINEユーザーとトークするためには、管理者が管理画面で外部トーク連携を有効にしてあげる必要があります。
![admin-pc-external-line-user-setting-ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532932/64adbe63-984b-2985-9ae7-7fba4f9b8960.png)

外部トーク連携を有効にされたLINE WORKSユーザーはマイプロフィール画面で
・自分のQRコード
・自分のトークID
・招待用リンク
が表示されます。

![message-how-to-link-576x1024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532932/868e95d9-202e-9236-e6d6-bbeb8e488d11.png)

このいずれかでLINEユーザーと繋がることが可能になりますが、ここが__ミソ__です。

_LINE WORKSユーザーが自分でLINEユーザーを追加することはできません。_

あくまでLINEユーザーと繋がるときは、LINEユーザー側から友達追加（申請）してもらう（オプトイン）挙動になりますのでご注意ください。

#LINEユーザーと出来ない事もありますのでご注意を！

LINEでも普通にできる、LINE WORKSでも普通にできることがLINEとLINE WORKSユーザ間では出来ないことがありますのでご注意ください。

出来ない事は・・・
・音声通話・ビデオ通話→__これ出来ませんので！！！__
・LINE特有の機能（ノート、アルバム、LINE Payなど）
・LINE WORKS特有の機能（通訳、予定招待など）

これは出来ません。できる事は
__トークのみです！！__


#繋がったLINEユーザーはどう管理されるか？
追加したLINEユーザーはLINE WORKSアドレス帳で簡単に管理できます。
ただし、LINEユーザーが表示名を自分のニックネームやサムネイルも好きな写真などにしているとそのまま追加されますので、あとあと__「このLINEユーザーどこの誰だっけ？」__なんてことがあり得ます。
名前、電話番号、メールアドレスなどは修正および編集することができますので、ここで本名などにアップデートすることをお勧めします。
![contact-link-others-576x1024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532932/d7170e31-804d-f89a-eeb0-e516aca23b4e.png)



#最後に
どうでしょう？実は使ったことない、知らなかったなんて方はぜひ使ってみると便利ですよ。
特に、この機能を営業マンなどが、お客様のLINEと繋がって営業トークするなんてことにも便利です。
LINE WORKSで繋がっておけば、ログも取れるので会社としても安心安全にLINEを使っているお客様とやり取りできるようになりますよー。お勧めですー！
rbenvのインストールについて（Checking for rbenv shims in PATH: not found）

## 結論
シェルの確認
↓
.zshrcファイルの作成
↓
eval "$(rbenv init -)"
export PATH="~/.rbenv/bin:$PATH"
export PATH="~/.rbenv/bin:~/.rbenv/shims:$PATH"
の三行を追加
↓
source ~/.zshrc
## 環境
- Mac


## 問題点
```
$ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
```
を実行すると、

```
Checking for `rbenv' in PATH: /usr/local/bin/rbenv
Checking for rbenv shims in PATH: not found
  The directory `/Users/ユーザー名/.rbenv/shims' must be present in PATH for rbenv to work.
  Please run `rbenv init' and follow the instructions.

Checking `rbenv install' support: /usr/local/bin/rbenv-install (ruby-build 20201118)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/Users/ユーザー名/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK
```
となり、

```
Checking for rbenv shims in PATH: not found
```
この部分のパスが通っていないこと。
## 解決法
rbenv shimsの環境パスの設定が正しくできていない、とのことなので
.bash_profile内で、

```
export RBENV_ROOT="$HOME/.rbenv"
if [ -d "${RBENV_ROOT}" ]; then
  export PATH="$HOME/.rbenv/bin:$PATH"
  eval "$(rbenv init -)"
fi
```
を記述する。これで再度確認するとOK！になるのだが、ターミナルを再起動するとまた

```
Checking for rbenv shims in PATH: not found
```
のエラーになる。

ここからが具体的な解決法。
今現在シェルがzshになっている。その上で、bash_profileファイル内に記述したのだがそれではターミナルを起動するごとにsource ~/.bash_profileをする必要がある。
結論として新たにzshrcファイル（zsh_profileファイルでもいい）を作成し、同じような記述をするとターミナルを再起動してもパスが通っている状態になっている。
CloudMapper を daemon にする

# CloudMapper とは

awsのネットワーク構成図を作成してくれるツールです。
python3で動きます。

https://github.com/duo-labs/cloudmapper

インストール手順

[CloudMapperを使ってAWS環境を可視化する。](https://qiita.com/kooohei/items/58b6d8654a89c911a2e9)


# daemon にする

```properties:/etc/systemd/system/cloudmapper.service

[Unit]
Description=cloudmapper
After=network.target

[Service]
Type=simple
WorkingDirectory=/var/www/github.com/duo-labs/cloudmapper/
ExecStart=/usr/local/pyenv/shims/python -u cloudmapper.py webserver
Restart=always
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
```

```command:centos7
sudo systemctl enable cloudmapper.service
systemctl start cloudmapper
```


# ハマり

### daemon 化の経緯

ターミナルで `python ./cloudmapper.py webserver` と叩くと、localhohst:8000 で cloudmapperが立ち上がり、ブラウザで見れるようになります。
ターミナルを終了すると見れなくなってしまうので、daemon にして永続的に見れるようにします。

### pythonで daemon 

node の forever に相当するものはなく[たぶん](https://ctrlzr.sakura.ne.jp/img/ameblo/tabun2.gif)、service に入れることにしました。
（pythonピヨグラマーです）

* 1発目

`ExecStart=/usr/bin/python -u {フルパス}/cloudmapper.py webserver`

pyenvでpythonをインストールしているので、/usr/bin/python はデフォルトで入っているバージョン(python2系)です。
cloudmapper はpython3でないと動かないので、`which python` で探しました。

* 2発目

`ExecStart=/usr/local/pyenv/shims/python -u {フルパス}/cloudmapper.py webserver`

これでも動きません。
ターミナルで叩くと、cloudmapper.py 内の show_help が呼び出され、usage: ～ が表示されます。
カレントフォルダが{フルパス}でなれば動かないと気づくのに時間を要しました。
cloudmapper.py の仕様と思います[たぶん](https://ctrlzr.sakura.ne.jp/img/ameblo/tabun2.gif)

* 3発目

`ExecStart=cd {フルパス};/usr/local/pyenv/shims/python -u cloudmapper.py webserver`

カレントフォルダを移動すればいいと分かったので、コマンドを繋げました :sweat: 安直
コマンドエラーが出ていたので、すぐわかりました。

* 4発目（解決）

`WorkingDirectory={フルパス}`
`ExecStart=/usr/local/pyenv/shims/python -u cloudmapper.py webserver`

WorkingDirectory でカレントフォルダを指定して解決です。

（所要時間: ３時間）
django-filterで同じ誕生日の人を検索したい！

# はじめに
この記事は[Django Advent Calendar 2020](https://qiita.com/advent-calendar/2020/django) 9日目の記事です。
2年連続２回目の参加です。



# django-filterを使って同じ誕生日の人（月日が同じ）を取得したかった。

サンプルを作りました。
[django-filterで同じ誕生日の人を検索するサンプル](https://github.com/shimayu22/sample-same-bitrhday-filter)


生年月日をDateFieldで持っているので、そのままdjango-filterを使うとこんな感じ↓
![スクリーンショット_2020-12-04_14_17_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181775/612a3030-9a44-e053-93bb-f58f247ccd6c.png)
![スクリーンショット_2020-12-04_14_17_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181775/e35fba7c-647f-2295-7b4b-938d305308d7.png)
生年月日全部同じ人ではなく、誕生日の年月が同じ人を取得したいのですが、これだと「日付を正しく入力してください」となります。
YYYY-MM-DDの形式で入力してないからですね。

DateFieldの月日だけを検索するためには、`(api)/views.py`にフィルタセットを作成します。

```(api)/views.py
from django_filters import rest_framework as filters
from rest_framework import viewsets

from sample.models import Samplepeople
from sampleapi.serializers import SamplepeopleSerializers

# フィルタセット
class SampleFilter(filters.FilterSet):
    # Date型の月、日をそれぞれ検索できるようにする
    birthday_month = filters.NumberFilter(field_name='date_of_birth', lookup_expr='month')
    birthday_day = filters.NumberFilter(field_name='date_of_birth', lookup_expr='day')

    class Meta:
        model = Samplepeople
        fields = ['id', 'name', 'kana', 'date_of_birth',]

# 通常のViewSet
class SampleViewSet(viewsets.ReadOnlyModelViewSet):

    queryset = Samplepeople.objects.all()
    serializer_class = SamplepeopleSerializers
    filter_backends = [filters.DjangoFilterBackend]
    # 上記のFilterを追加する
    filter_class = SampleFilter
```

フィルタセットで設定した項目が追加されます。
![スクリーンショット_2020-12-04_14_44_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181775/fb5861a2-f59a-d8f2-7e4b-fbd065f0e128.png)

早速、同じ誕生日の人を検索します。
![スクリーンショット 2020-12-04 14.45.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181775/6e2ba20c-edb8-e39d-5916-6f77f0171f9d.png)

生まれた年は異なりますが、月日が同じ人が検索されました。
![スクリーンショット_2020-12-04_14_45_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181775/00e12d61-9ebe-6ede-35b6-237258031c70.png)

あとはAPI叩く際に`?birthday_month=&birthday_day=`に月と日をいれてあげればOKです。
これなら同じ誕生月の人を検索するのも楽々ですね。また、`lookup_expr='year'`を追加すれば同じ年に生まれた人を検索することもできます。


## DateTimeFilterではない
DateFieldの検索だからDateTimeFilterを使うのかな？と思いましたが、最初のやつと同様に「日付を正しく入力してください」になります。
DateTimeFilterもYYYY-MM-DD（YYYY-MM-DD HH24-mm-SS）の形式で入力しないといけないからですね（1敗）

# おわりに
もっといいやり方があれば教えてください。



# 参考
- [疑似個人情報データ生成サービス](https://hogehoge.tk/personal/)
  - サンプルデータを作成しました
- [Django REST framework で django-filter を使う](https://qiita.com/okoppe8/items/77f7f91f6878e3f324cc)
- [現場で使える Django REST Framework の教科書](https://www.amazon.co.jp/dp/B07XWL8FPM/ref=cm_sw_r_tw_dp_x_s9DYFbRHVXEVX)
Opigno LMS - Drupalでラーニングマネジメントシステム

![msedge_bMb4bPoMff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4319/a0817d2e-ad0a-5ca3-53f7-089e379b4d86.png)

### はじめに

[Opigno LMS](https://www.drupal.org/project/opigno_lms)はDrupalのディストーションの一つで、今日現在（2020/12/04）[drupal.orgのMost installed](https://www.drupal.org/project/project_distribution)で上から3番目のディストリビューションです。もしかしたらこのコロナ禍の中で伸びているのかもとも思ったけど、[利用統計（申告分）](https://www.drupal.org/project/usage/opigno_lms)見ると関係なくも見える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4319/acdceeb8-39e0-23ef-5662-3f382572f62e.png)


縁あって調べたところ他のディストリビューションとはまた一味違う感じがして興味深いので紹介します。（と言っても、簡単に調査したり、デモ環境で軽く触った程度なので話半分に聞いて下さい）

### LMSとは

> Learning Management System（学習管理運営システム）の略で、eラーニングシステムにおける重要なモジュールあるいはサブシステムの一つである。

[LMSとは - コトバンク](https://kotobank.jp/word/LMS-1510792)

### 興味深い点

生徒側として初めてこのOpignoを触ったとき、出題されて課題やドキュメントがインタラクティブであることに非常に驚いて感動すら覚えました。（単に選択肢をぼちぽちクリックするだけではない！）

失礼な話ですが、**Drupalだけの為にこんなに作り込める筈がない**と思って調べたところやはり[H5P](https://h5p.org/)というものを利用していまいた。

#### H5Pとは

H5Pのコアはオープンソースで公開されているようで、プロジェクトホームページは [H5P – Create and Share Rich HTML5 Content and Applications](https://h5p.org/) です。日本語コミュニティもあるようですが、公式ではないかもしれないので各自探してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4319/2afc4af7-6883-624e-e486-c898604057e1.png)


[About the project \| H5P](https://h5p.org/about-the-project) にはイントロダクションとして、「インタラクティブコンテンツは作るのも再利用するのもいろいろ大変なのでそれらを簡単につつリッチなコンテンツ作れる様にするよ」（超訳）的なことが書いてあります。

百聞は一見に如かずなので [Examples and Downloads \| H5P](https://h5p.org/content-types-and-applications) で触ってみるのが良いかと思います。

オリジナルのコンテンツも実装できる様ですし、これからもっと盛り上がって行きそうな気がします。

#### eラーニング標準規格との互換性

> Opigno LMS is fully **compliant with SCORM** (1.2 and 2004 v3) **and Tin Can (xAPI)**.

ここは挙げておいてアレですが、具体的な確認はしてません。ただ事実だとすると他のシステムなどからOpignoへの移行やその逆もしやすいのかと思います。これは良いことです。

#### Drupalの立ち位置

これは主観ですが、オープンソースのCMSであるDrupalとその他のオープンソースや標準規格を取り込んだお手本みたいなプロジェクトだなと思いました。Opignoの開発元はサポートやコンサルティングでマネタイズしているようです。

### おわりに

ということで、今回はディストリビューションの紹介を勢いで書きましたがこのご時世LMSがますます注目される事と思ってます。気になった方はOpignoのデモやH5Pのデモはたくさん用意されているので触ってみて、感想などを共有していただけると嬉しいです。

https://demo.opigno.org/ <-デモリンク。クリックするだけで、StudentまたはManagerで
ログイン出来ます。

![msedge_8N1hUav3Af.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4319/3ca78754-0c73-cc31-28b6-5448794306b4.png)
docker-compose up --buildができないときの対処

##環境
・Windows10Pro
・Docker for windows 19.03.13

##概要
〇コマンドで以下を実行したが、MySQLでエラーが出てbuildできない
　_docker-compose up --build_

〇エラーメッセージ
　_ERROR: for web Cannot create container for service web1: Conflict._
　~中略~
　_havCreating mysql ... error_

##解決策
　①以下のコマンドを実行しコンテナを一括削除する
　<font color="LimeGreen">\$ docker rm $(docker ps -aq)</font>
 　②以下のコマンドを実行し再度buildする
　<font color="LimeGreen">\$ docker-compose up --build</font>
　③立ち上げることができる

##参考
https://qiita.com/kabi5/items/9e2090da22ffd6c7ad2a
素数一覧を求めるワンライナー各言語まとめ

お遊び記事です．【追記】お遊びのつもりが，とても秀逸な別解がコメント欄に集まりましたので，そちらもぜひ御参照下さい．とりあえず，J言語すげえ．

# アルゴリズムと実装

主に関数型リスト処理を用いて，**$x$を$2〜x-1$の各整数で割った余りのリストに0が含まれていなければ$x$を素数と判定**しています．このため，任意範囲の整数リスト生成（`range`等），リスト各要素への関数適用（`map`等），リストに特定の値が含まれているかの判定（`include`等），条件を満たした要素のみをリストから取り出す処理（`filter`等）を行う関数があると，より短いワンライナーとなります．


# 各言語での記述例

$1<n<100$の$n$について素数判定を行った結果を表示しています．どうしても長くなりがちなので，字句解析が可能な程度に空白等を詰めています．

```ruby:Ruby
>> ->n{(2...n).reject{|x|(2...x).map{|z|x%z}.include?(0)}}[100]
=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
```

```haskell:Haskell
> (\n->filter(\x->not$elem 0$(\x->map(\z->rem x z)[2..x-1])x)[2..n])100
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
```

```python:Python
>>> (lambda n:[x for x in range(2,n)if not 0 in map(lambda z:x%z,range(2,x))])(100)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
```

```clojure:Clojure
user=> ((fn[n](filter(fn[x](not((set(map #(mod x %)(range 2 x)))0)))(range 2 n)))100)
(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)
```

```javascript:JavaScript
> (n=>(r=>r(n).filter(x=>!(i=>r(i).map(z=>i%z).includes(0))(x)))(n=>[...Array(n-2)].map((v,k)=>k+2)))(100)
[ 2,
  3,
//（途中結果は省略）
  97 ]
```

```lisp:Scheme
> ((lambda(n)(filter(lambda(x)(not(member 0(map(lambda(z)(modulo x z))(cddr(iota x))))))(cddr(iota n))))100)
(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)
```

# 備考

## 記事に関する補足
* ~~JavaScriptに範囲生成関数が標準で用意されていないのがちょっと意外．~~最近のJavaScriptでは``[...Array(n).keys()].slice(s)``あたりが定番の模様（コメントより）．

## 更新履歴
* 2020-12-10：Clojureの例を追加
* 2020-12-04：冒頭にコメント欄参照の旨追記
* 2020-12-04：初版公開（Ruby，Haskell，Python，JavaScript，Scheme）
M1版Macでのコマンドライン開発環境の雑多なこと


# 1. M1でIntel CPU版コマンドラインツールを使う

早い話が前回の記事 [Apple M1のサポートする命令など](https://qiita.com/STDNUL/items/e1521852a8c7f9044827) の続きである。

## Rosettaで動かすためにターミナルを複製する
全てのユニバーサルバイナリは明示的にRosettaで動作させることができるが、Rosetta版とネイティブ版を両方つかいたいケースは割とあると思う。ターミナルは特にそうである。
そんなわけでターミナル.appをコピーしてx86版プログラムを動かしたい方だけRosetta動作に設定した。なんなら見分けがつきやすいようにアイコンファイル(.icns)も書き換えようかなと思っている。

![スクリーンショット 2020-12-04 12.24.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136367/14609375-d18c-2b57-a320-f623ff9fd273.png)


## 留意点
なお、Universal Binaryが用意されていないVisual Studio CodeではRosetta版ターミナルが実行される。つまりx86-64版clangその他のコマンドラインツールが実行される。
よって、M1ネイティブの開発をするのに内蔵のターミナルを使うのはちょっと控えた方がいい。あるいはRosettaのコマンドライン環境でもaarch64ホストへのクロス開発可能なコンパイラを別途導入する。

# 2. Homebrewのインストール
まず、ARM版はようやく対応したところで個々のアプリは正常にインストール・使用できないことがあるので、現時点ではRosettaでIntel版を動かした方が賢明である。

## ARM Mac版をどうしても試したい方
一応、ARM Macネイティブ版は以下の手段でインストールまでは確認しているが対応していないプログラムの方が多いので参考に止める。
なお、/opt/homebrewはユーザー権限で読み書き実行権限を付与しておかれたい。

```
cd /opt/homebrew 
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C .
```

/opt/homebrewというパスが存在するIntel版（Rosettaで動作）の方のHomebrew環境と競合するらしいので、どちらか一方を選択的にインストールすることになるだろう
（現状を考えればIntel版の方がいい）

## HomebrewもIntel版なら当面は安心？
Rosettaで起動したターミナルからHomebrewをインストールすればIntel版Homebrewがそのまま使える。アプリレベルではまだARM Mac版の対応が不完全なので、こちらを選んだ方がいい。
当面はM1ネイティブで動作させたいものをaarch64向けにクロスコンパイルしながら段階的にM1ネイティブの開発環境を揃えていく形になりそうなので、Rosettaとネイティブのターミナルの行き来は割と頻繁にありそう。

# 3. clangでの開発
これがネイティブ起動とRosetta起動のターミナルを並べて双方のclangのオプションの違いを見比べてみたものである。
![スクリーンショット 2020-12-04 12.04.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136367/9c040a33-92a5-7d1f-720a-02ee912647f5.png)

## Rosetta上での -march=native は危険な感じがする
Rosettaでの **-march=native** で実行しているのだが、何やらサポートしないはずのAVX2からAVX512IFMAやらGFNIやらがオプション候補として出てきて不穏なので、M1のMacのRosetta環境で動くx86-64プログラムをビルドするときは念の為に **-march=westmere** を使った方がいいと思われる。
**ひょっとしてこいつ自分のことをMacBook Pro 2020(Intel)だと思い込んでるMacBookPro 2020 (Apple)なのでは？** とか考えたけど不毛なので考えるのをやめた。

## AVX*向けにビルドすればIntel Macで動くバイナリは作れる
AVX*のコードはM1のマシンでは直接実行できないので、動作確認には実機を用意する必要があるが、一応AVX〜AVX-512までのプログラムもビルドできる。Intel MacにAirDropで転送してリモートで実行すれば、手元のM1マシンから離れる必要はないだろう。
リモートデバッグまではちょっと面倒なので状況次第であるが。

そういうわけで、Intel Mac向けにしばらく開発予定がある方は、念の為にIntel Mac実機は手元に残しておいた方がいいかもしれない。AVX-512が動くMacである必要はないかもしれないけど、念の為、MBA2020(Intel)がディスコンになったのでMBP13-2020(Intel)が最も安いAVX-512対応Intel Macで16インチの方はAVX-512非対応である。
スマホ開発しかしてなかった初心者が良いなと思った<dialog>

## はじめに

最近少し業務でも使うかもしれないと思い、HTML,CSS,JavaScriptを勉強していました。
自分は今までアプリ開発しか基本したことがなく、むか〜し1年目の頃にJavaの研修を受けて、
JavaScriptもよく分からないまま,「Angular」FWを使って少しだけ改修作業をやったレベルでしたので、
サンプルアプリを作りながら、まずベタ書きでWeb開発を１から勉強したのですが、その時にスマホ開発でも標準UIでもあったら楽だな〜と思ったので（**知らないだけかもしれない**）息抜きついでに書いていきます。

## `<dialog>`タグ

自分は[MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/dialog)のドキュメントを使ってインプットしていったんですが、ダイアログを実装する時に見つけたのがこの`<dialog>`タグ。
いや、普段フロントエンジニアで活躍されている方、FWを使ってる方からすると全然使わないのかもしれないんですが、
自分的には結構楽で良いなーって思いました。

## 何が良いと思った？

**作り込めば大変なのかもしれないけど、わかりやすく簡単なところ。**

そもそもHTMLはマークアップ言語で初心者でも簡単だというような内容の記事が多く、こちらのダイアログ実装もシンプルなものであればホント簡単でした。

**(別にフロントの開発が簡単なんて思ってはいないですし、自由で歴史がある分何通りもやり方があり、今回は参考書を買ったわけではなかったのでモダンな実装の仕方、ベストな回答が探しにくいという難しさがありました)。**

最新の2020年とかの記事がなかったのでそこまで使用頻度が高くないのかもしれないのですが、
HTML5.2から登場したようですね。

```hoge.html

<dialog>
  <h1>ネイティブのダイアログ ボックス</h1>
</dialog>

```
```hoge.js
const modal = document.querySelector('dialog');
 
// モーダルを表示する (open属性を与える)
modal.showModal();
 
// モーダルを隠す (open属性を削除する)
modal.close();

```

###はい！

これで終わりです。

もちろん<dialog>の中にテキストボックスだったりボタンも置いて簡単にカスタマイズできます。

ちなみに自分とかだとこんな感じ

![スクリーンショット 2020-12-04 15.29.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701264/493807b0-6b54-10d0-3068-99d85b452671.png)

調べながらやりつつも、1hかからないくらいで実装自体はできました。
(閉じるボタンの位置変だな...)

スマホでダイアログ実装だとアラートレベルなら良いんです。(iOSにもUIAlertというものがあります)

ただ、なかなかエラー表示くらいなら良いものの、大体デザイナーさんの用意したUIデザインに沿ったダイアログを実装することが多くい気がします。

自作でカスタムView作るのめんどいし、ライブラリ使うのもデザイナーさんからの要望にあったものを探すのも意外と大変だしと、なかなか前向きに自分はなれないんですが標準で

## まとめ
誰に向けてというわけではないんですが、他の分野の勉強するのも楽しいな〜と思ったのでまとめました。
あとは、いやいやこんなの使わないよとか自分のためにもご指摘があったら受けたいのもあり。

うまくまとまらないですが、カスタマイズしやすい標準ダイアログこい！

### 参考

- [HTML 5.2で新しく登場した<dialog>要素で、ダイアログ ボックスを実装する方法と注意点](https://coliss.com/articles/build-websites/operation/work/how-to-use-dialog-element.html)
symbol-cliでHashを表示するようにプログラムを修正しました

※ 7月頃にNEMHUBに投稿した記事と同じものです。今のsymbol-cliの挙動とは異なっている可能性があります。

# 概要
ブロックチェーンと疎通するためのsymbol-cliというコマンドがあります。
このコマンドでブロックの情報を表示する事ができるのですが、ブロックのHashの情報が表示されていなかったので表示されるようにプログラムを変更しました。
(厳密にはプログラムを作ったのではなく、もともとある仕組みを利用して表示するようにしました)
[依頼を出したサイト](https://github.com/nemtech/symbol-cli/issues/309)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20474/4910aae8-3933-ab1d-2181-b8db2413834e.png)


# なぜHashを表示したいと思ったのか

以下は「ブロック１」と「ブロック２」がチェーンでつながっている模式図です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20474/5005e168-49a2-66c7-07f4-147da1cdf763.png)

ブロックの情報を表示するコマンドを実行すると各種情報が表示されるのですが、ここでは

* height　・・・　ブロック高 (例えば「1」は1番最初のブロック。ちなみにビットコインは「0」が最初のブロック)　
* Hash　・・・　そのブロックを特定できる値
* Previous Block Hash　・・・　ひとつ前のブロックの特定できる値

のみ書き出しています。
ブロック１の「Hash」とブロック2の「Previous Block Hash」が一致しています。
このようにそのブロックのHash値と、一つ先のPrevious Block Hashの値が一致していることを目で見てブロックがチェーンでつながっている事を確認したかった、というのが動機でした。
以下実行結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20474/8155f0fb-4683-ac95-1edb-ae515388abce.png)

興味本位で取り掛かってみたのですが、環境を整える事に時間がかかった割にプログラム修正はあっという間でした。
せっかくがんばってプログラミングできる環境を整えることができたので、少しずつでもなにか作っていければと思います(^_^)v

そして12月5日現在、私は妖怪口ダケになってしまっております。。
はやく人間になりたい！
量子コンパイラを作る。 その8

# 概要

量子コンパイラを作る。
練習問題、2bit乗算器、やってみた。

# コードを書く。


```
make 12
in 0 3
and 0 2 4
and 1 2 5
and 1 3 11
and 0 3 6
xor 5 6 10
and 5 6 7
xor 4 7 9
and 4 7 8
out 8 11

```

# コンパイル結果

```
from blueqat import Circuit

print (Circuit(12).h[ : 4].ccx[0, 2, 4].ccx[1, 2, 5].ccx[1, 3, 11].ccx[0, 3, 6].cx[5, 10].cx[6, 10].ccx[5, 6, 7].cx[4, 9].cx[7, 9].ccx[4, 7, 8].m[ : ].run(shots = 1000))

```

# 成果物

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

# 真理値表で確認。

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6ec204e3-d08f-ae37-a0c8-8328b86c50bf.jpeg)

# 成果物

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

# 回路図で確認。

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/602df181-d865-b13a-d6d3-e7344676b493.jpeg)


# 成果物

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

# 実行結果

```

Counter({
'110100100011': 84, 
'110000000000': 73, 
'010100000001': 71, 
'101110100110': 71, 
'111011000110': 66, 
'010000000000': 66, 
'100000000000': 65, 
'011001000010': 62, 
'000000000000': 61, 
'001000000000': 60, 
'001100000000': 58, 
'111111111001': 58, 
'011101000011': 56, 
'101010000100': 55, 
'100100100010': 51, 
'000100000000': 43
})


```


以上。
App Store Small Business Program に申請してみた

色々翻訳を駆使しながら「[App Store Small Business Program](https://developer.apple.com/app-store/small-business-program/)」を申請してみた。
**※※これを参考にして回答して間違えていても責任は負えません※※**

---

**Paid Applications Agreement**
Have you reviewed and accepted the Paid Applications Agreement (Schedule 2 to the Apple Developer Program License Agreement) posted December 2020, in App Store Connect?

> **有料アプリ契約書**
> App Store Connectで2020年12月に掲載された有料アプリケーション契約書(Apple Developer Program License AgreementのSchedule 2)を確認し、同意しましたか？

確認していなかったので App Store Connect に移動して「契約/税金/口座情報」から確認。
そして「Yes, I have accepted.」

---

**Do you have majority (over 50%) corporate, individual, or partnership interest in the ownership or shares of another Apple Developer Program member account?**

> 他のApple Developer Program member アカウントの所有権または株式の過半数(50%以上)を法人、個人またはパートナーシップ(共同経営)で保有していますか？

他のアカウントの所有権や過半数の株式など保有していないので「No」

---

**Does another Apple Developer Program member have majority (over 50%) corporate, individual, or partnership interest in the ownership or shares of your account?**

> 他のApple Developer Program memberは、アカウントの所有権または株式の過半数(50%以上)を法人、個人、またはパートナーシップ(共同経営)で保有していますか？

自分のアカウントに対して他のアカウントは所有権や株式の過半数などを保有されていないので「No」

---

**Do you have ultimate decision-making authority over another Apple Developer Program member account?**

> 他のApple Developer Program memberアカウントに対する最終的な決定権を持っていますか？

他のアカウトに対する決定権を持っていないので「No」

---

**Does another Apple Developer Program member have ultimate decision-making authority over your account?**

> 他のApple Developer Program memberは、あなたのアカウントに対する最終的な決定権を持っていますか？

自分のアカウントに対して他のアカウントが決定権を持っていたりしないので「No」

---

To the best of your knowledge, you and your Associated Developer Accounts earned no more than 1,000,000 USD in total proceeds (sales net of Apple’s commission and certain taxes and adjustments) during the twelve (12) fiscal months occurring in the 2020 calendar year. You further acknowledge that the information provided above is accurate, and providing false or inaccurate information is grounds for disqualification, termination, and forfeiture of payment.

> あなたの知る限りでは、あなたとあなたの関連デベロッパーアカウントは、2020年暦年に発生する12会計月の間に、総収入(Appleの手数料および特定の税金と調整を差し引いた売上)が100万米ドルを超えていないことを確認しました。お客様は、上記で提供された情報が正確であり、虚偽または不正確な情報を提供することは、資格喪失、終了、および支払いの没収の根拠となることをさらに認めます。

了解しました。ということでチェックして「Submit」ボタンをクリック。

ページが切り替わって


**Thank you for your submission.**
We’ve received your App Store Small Business Program enrollment and will email you about your status soon.

と表示されて

> Thank you for submitting your enrollment for the App Store Small Business Program, designed to help you invest more resources into your business. We’ll review your details and let you know your enrollment status by December 30, 2020.

とメールも来た。

回答あってるといいのだけど。
nmcliでルーティングテーブルを追加[CentOS/RHEL]

CentOS7やRHEL7からNetworkManagerでネットワーク周りを管理するようになった。
管理の時に使うコマンドは```nmcli```です。
今まではルーティングテーブルを追記する時は、```/etc/sysconfig/network-script/route-ethXXX```を追加していたが、```nmcli```を使えば必要なかった。

## ルーティングテーブルを追加

```
nmcli conn mod eth0 +ipv4.routes "172.18.0.0/16 10.10.1.254"
```

## ルーティングテーブルを確認

```
nmcli connection show eth0 | grep IP4.ROUTE
```

以下出力例

```
IP4.ROUTE[1]:                           dst = 10.XX.XX.XX/16, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]:                           dst = 172.18.0.0/16/16, nh = 10.10.1.254, mt = 100
```