OmniAICreator/Qiita-1.07M huggingface dataset:
C/C++ アプリからぺろっと動画を生成するメモ

## 背景

* サーバーや HPC, ラズパイなどで動かすアプリで, 計算途中の可視化結果などをぺろっと動画にしたい.
  * ラズパイの場合は, ラズパイカメラに画像処理施したものを動画にしたいとか. 
* 別に高度なエンコードはいらない
* 各種アーキテクチャ(SPIR-V とか)や, 制限された環境(コンパイラ, 実行環境, OS)でも動くのに対応しているのがよい
* C/C++ アプリに組み込んで使えるのががよい
  * ffmpeg を外部プログラムで走らせるのもめんどい

基本 GIF or Motion JPEG な AVI がよさそうです.

## gif

gif-h 

https://github.com/charlietangora/gif-h

で良さそうです!

GIF なので, 画像サイズ大きかったり長い動画つくるとファイルサイズ増えますので注意しましょう.

## Motion JPEG + AVI

AVI に Motion JPEG(JPEG 連番)を格納する形式です.
だいたいの動画プレイヤーで見れるかと思います.

実装サンプルはこちら.

https://github.com/Ricardicus/mjpeg-avi

ライセンスが無いので, 気になる方は自前で AVI 出力部分を再実装しましょう.

jpeg エンコードは stb_image_write https://github.com/nothings/stb や turbojpeg あたりでよいでしょう. 
 
## TODO

* [ ] webm を試す. https://github.com/webmproject/libvpx
 * [ ] x86 だとアセンブラを要求しつらい :cry: 
* [ ] gif でうまくデータサイズ減らす(画質を落とす)のを試す.
* [ ] HEIF を試す?(パテントやライセンス周りが気になる)
ViewModel と相互作用処理（Messanger）

## はじめに

オレオレ解釈の覚書　その１３

Livet に用意された相互作用処理のため実装である Messanger についてまとめます。

## 本文

[前回](https://qiita.com/kawasawa/items/36c18fdb512cc1bcbd54)の最後に紹介させて頂きましたが、Livet は Prism と同じく MVVM フレームワークの一つです。
Livet には Messanger と呼ばれる機構が用意されており、View を直接参照することなく ViewModel から相互作用処理を依頼することができます。
Prism 7.2 で廃止されてしまった InteractionRequest の代替としてこちらを利用してみます。

Messanger と InteractionRequest とでは実装方法が異なります。Messanger はインスタンス自体は一つで、ViewModel から通知を行う際に指定する MessageKey によって処理の違いを表現します。View は Messanger をバインドして MessageKey の値を指定することで、通知をハンドルし相互作用処理を実行します。

InteractionRequest と比較すると、Messanger はインスタンス数を抑えられるため実装がスッキリしています。一方で MessageKey を文字列で指定する必要があり、この辺りは好みが分かれるかもしれません。

```cs:ViewModel
using Livet.Messaging;

namespace TestApp.ViewModels
{
    public class MainWindowViewModel
    {
        public InteractionMessenger Messanger { get; }

        public MainWindowviewModel()
        {
            this.Messenger = new InteractionMessenger();
        }

        public void ShowMessage()
        {
            this.Messenger.Raise(new InteractionMessage("ShowMessage"));
        }
    }
}
```

```xml:View
<Window x:Class="TestApp.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:p="http://prismlibrary.com/"
        xmlns:behaviors="clr-namespace:TestApp.Views.Behaviors"
        p:ViewModelLocator.AutoWireViewModel="True">
    <i:Interaction.Triggers>
        <l:InteractionMessageTrigger MessageKey="ShowMessage" Messenger="{Binding Messenger, Mode=OneWay}">
            <behaviors:MessageAction/>
        </l:InteractionMessageTrigger>
    </i:Interaction.Triggers>
</Window>
```

## おわりに

Livet の Messager についてのお話でした。
InteractionRequest と同じく非常に汎用性の高い仕組みであり、MVVM パターンによる開発を強力にサポートしてくれるはずです。
DeepLearningを用いた株価予測（正解データ作成）

#DeepLearningを用いた株価予測（正解データ作成）

[前回の続き](https://qiita.com/hiro0219/items/6dccf56b30f4b2edc62b)

前回の回で株価のデータを加工したので，今回はその加工データをもとに正解ラベルを振っていこうと思う．
と言っても，やることは単純で今回やりたいことは2か月分のデータを元にその先1か月後に上昇しているかどうか．つまり，2か月時点のデータ(40点目)と3か月後のデータ(60点目)を比較し，高いか低いかによって正解ラベルをあたえてやればよい．

ただ気になる点が1点．
どうせ，正解ラベルを振り分けるのであれば，上昇5割・下降5割と正解ラベルごとのデータ数に偏りを持たせないことがベスト．
正直なところ上昇する株価を見極めればよいので，株価が1.1倍以上上昇したものとそれ以外で分類しても何ら問題は無い．そこでまずは株価の上昇比率を簡単に可視化することにする．

###データの可視化
今回は株価の上昇比率をmatplotlibのhistを使用して可視化していこうと思う．

```python
# -*- coding: utf-8 -*-

import os
import pandas as pd
from decimal import Decimal, ROUND_HALF_UP
import matplotlib.pyplot as plt

PATH = "shapeInfo/totalData/"
BASE_POINT = 40
MAX_RANGE = 2

def makeHistgram():
	csv_list = os.listdir(PATH)
	y_li = []
	for csv in csv_list:	
		df = pd.read_csv(PATH + csv, encoding="shift-jis")
		y = Decimal(str(df.iloc[len(df) - 1]["終値"])) / Decimal(str(df.iloc[BASE_POINT]["終値"]))
		y = y.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
		y_li.append(float(y))	
	fig = plt.figure()
	plt.hist(y_li, bins=16, range=(0, MAX_RANGE))
	plt.show()
	#グラフの保存
	fig.savefig("hist.png")

def main():
	makeHistgram()


if __name__ == '__main__':
	main()

```

比較の対象は正直，高値でも始値でもなんでも良かったのだが，とりあえずは終値で統一することにした．
また，MAX_RANGEを2としているのはこの処理を実行する前に比率の最大値を取得したのだが，2を超えるデータが存在しなかったためである．

このコードを元に作成したヒストグラムが以下のとおりである．
![hist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684938/3d1c4748-70a7-a3e2-8db1-d91a3997bfe6.png)
![hist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684938/9e5ac63a-c49d-8193-0e00-d8c5f50abb50.png)



うーん，全体的に1周辺に集まっており，上昇している株と下降している株が均等にあうような気がする．
そこで実際に数をカウントしてみたところ，上昇株2264個に対し，下降株は2291個であった．
アベノミクスの影響で2015年から上昇傾向にあったため，てっきり上昇株のほうが多いと思っていたが，今回のコロナショックの影響もあってかほぼ同数という結果が得られた．

###正解ラベルの振り分け
では上記結果を踏まえたうえで，単純に上昇株と下降株に正解ラベルを振り分けていこうと思う．
今回の振り分けにはディレクトリの階層を用いることとする．

```python
# -*- coding: utf-8 -*-

import os
import pandas as pd

PATH = "shapeInfo/totalData/"
BASE_POINT = 40
OUTPUT_PATH = "shapeInfo/"

def classification():
	csv_list = os.listdir(PATH)
	for csv in csv_list:	
		#カラム行は2行目から
		df = pd.read_csv(PATH + csv, encoding="shift-jis")
		#2か月時点で株価（終値）が1か月前より上昇していた場合、"1"、加工していた場合"0"に正解ラベルを振り分ける
		x = '1' if df.iloc[len(df) - 1]["終値"] > df.iloc[BASE_POINT]["終値"] else '0'
		df.to_csv(OUTPUT_PATH + x + '/' + str(csv))

def main():
	classification()

if __name__ == '__main__':
	main()

```
上昇株は"1"のディレクトリに下降株は"0"のディレクトリにこれで格納された．
次回はこのデータをもとに早速，DeepLearningで分類していこうと思う．
ホストAからホストBに送信するパケットのIPとMACアドレス

平成31年春期 午前問題33

図のようなIPネットワークのLAN環境で，ホストAからホストBにパケットを送信する。LAN1において，パケット内のイーサネットフレームのあて先とIPデータグラムのあて先の組合せとして，適切なものはどれか。ここで，図中の MACn/IPm はホスト又はルータがもつインタフェースのMACアドレスとIPアドレスを示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7a866a34-0f66-f2de-bb94-2f54eea77df1.png)


１、IPパケット
　IPアドレスによってネットワーク層の通信を行うIPヘッダを付加したパケット

２、イーサネットフレーム(MACフレーム)
　MACアドレスによってデータリンク層の通信を行うために、IPパケットに**同じデータリンク層のルータのMACヘッダ**を付加したパケット


ホストBは、ホストAから見てルータの外側(異なるブロードキャストドメイン)に属するので、直接通信ができません。
そこでホストAは、ルータを経由してホストBにパケットを届けることになります。

流れは、
ホストA　　　 ※ホストBのIP＋ルータのMAC
→　ルータ　　※ホストBのIP＋ホストBのMAC　**ルータはMACをホストBに書き換える**
→　ホストB
　　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2ac03b10-cb4b-4bb9-fd24-054e28c53327.png)


参照：
https://www.ap-siken.com/kakomon/22_aki/q34.html

http://fast-macro.com/Johosyori/h22AkiOuyou/h22AkiOuyou-34.html
SVNコマンド覚書

SVNで頻繁に使用するコマンドのメモ書き

#環境系コマンド
**■ バージョン確認**

```
svn --version
```

**■ コマンドパス確認**

```
which svn
```

#操作系コマンド
**■ リモートリポジトリ作成**

```
mkdir -p [リポジトリ名]
svnadmin create [リポジトリ名]
```

**■ チェックアウト**

```
svn co [リポジトリのURL]
```

**■ ステータス表示**

```
svn status
```

**■ 更新**
・更新

```
svn update
```

・指定のリビジョンへ更新

```
svn up -r [リビジョン]
```

**■ 追加**
・指定ファイルのみ追加する場合

```
svn add [ファイルパス]
```

・カレントディレクトリ以下の全ファイルを追加する場合

```
svn add * --force
```


**■ 削除**
・指定ファイルの削除

```
svn delete [ファイルパス]
```

・消失したファイルを削除する

```
svn status | grep '^!' | sed 's/! *//' | xargs -I% svn rm %
```

**■ リネーム**

```
svn rename [リネーム前ファイルのパス] [リネーム後ファイルのパス]
```

**■ コミット**

```
svn commit -m "コメント"
```

**■ 変更取り消し**
・指定したファイルの変更を取り消す場合

```
svn revert [ファイルパス]
```

・全ての変更を取り消す場合

```
svn revert -R .
```

**■ バージョン管理外のファイルを削除**

```
svn status | grep ^? | cut -c9- | xargs rm -rf
```

**■ リビジョンを指定して変更取り消し**

※ 最初に`svn update`しないと`E195020`エラーが発生する場合があるので明記
※ ちなみに、リポジトリのURLは`svn info`コマンドで確認することが可能

```
svn merge -r [破棄するリビジョン]:[戻すリビジョン] [リポジトリのURL]

例） http://example.com/trunk のリビジョン105を破棄して、リビジョン103に戻す場合
svn merge -r 105:103 http://example.com/trunk
```

**■ クリーンアップ**

```
svn cleanup
```

**■ ログ出力**

```
svn log -l [表示件数]

例）最新から10件出力する場合
svn log -l 10
```
AWSのSAA合格者によるMicrosoft Certified: Azure Fundamentals(AZ-900)の合格体験記と受験申し込みの注意点

# 0.はじめに
こんにちは。都内でエンジニアをしている、[@gkzvoice](https://twitter.com/gkzvoice)です。
AZ-900：Microsoft Certified: Azure Fundamentalsに合格しました(英語受験)。
そこで、今回はその合格体験記と個人的につまずいた、同試験の受験申込み方法を書いていきます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AZ-900受かったっ！<br>(MicrosoftのAWSの試験みたいなやつ</p>&mdash; GakujiTamaki@July Tech Festa運営スタッフ (@gkzvoice) <a href="https://twitter.com/gkzvoice/status/1291971061806841856?ref_src=twsrc%5Etfw">August 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

後述しますが、舐めてかかると痛い目に遭うなと感じたので、受験を検討されている方はしっかり対策に取り組んだほうがよいかと思います。

# 1.どんな奴が受けたの？
- 開発エンジニア@オンプレミス

- Azure実務、プライベートともに経験無し

- AWSはSAA-C02をひと月前に合格。
  - ただし、実務経験はなく、プライベートでLambdaで遊んだくらい。
  - cf. [【元不合格者の合格体験記】新版のAWS認定ソリューションアーキテクト-アソシエイト-(SAA-C02)試験勉強まとめ](https://qiita.com/gkzz/items/276036f9c1b26f6452d0)

- 勉強期間は1ヶ月
  - 勉強ペースはゆるめ。（仕事が忙しかったり、技術イベントのJuly Tech Festaの運営スタッフも並行しておこなっていたりと、土日とゆるく平日夜間に勉強する感じ。）
  - cf. [July Tech Festa 2020にプログラム委員として参加したので振り返ってみる](https://link.medium.com/lvahogblM8)

# 2.やったこと

- MS主催の研修を受講
- 以下の2点で知識をインプット
  - [Explore Microsoft Azure cloud concepts (AZ-900) | 公式教材](https://docs.microsoft.com/en-us/learn/paths/explore-microsoft-azure-cloud-concepts)
  - [AZ-900: Microsoft Azure Fundamentals Exam Prep -June 2020 | udemy](https://www.udemy.com/course/az900-azure)
- インプットに使った教材を1周したら模擬試験の演習と復習に着手。
  - [Microsoft Azure AZ 900 Practice Tests | whizlabs](https://www.whizlabs.com/learn/course/microsoft-azure-az-900/)

## 2-1.模擬試験の演習と復習方法
- 1周目は6割〜7割だったが、**伸びしろがこれだけあるのね**とポジティブに復習に励んだ。 
- 復習の際は、サービス間の類似点や相違点を抑えたり、都度インプットで使ったものや過去の復習メモを読み返すようにして、自分がよく間違える問題の傾向を掴むように心がけた。
- 3周ほど回すとスコアも8割〜9割に乗ってきたので、受験日を決めて受験することとした。


# 3.受験申込みの注意点

### 受験申込みするにあたり、必要なことは下記の2つ。

- outlookなどMicrosoftのメールアドレス
  - このメールアドレスを使ってMicrosoftの受験者アカウントを作る。
  - たしか、受験申し込みを進めようとすると必ずMicrosoftのアカウントのログイン画面が出てくるので、そこで左記のメールアドレスを使う。
- 受験料あるいは研修時にもらったバウチャーコード
  - バウチャーコードについてはケースバイケースだと思うので、ここではあまり触れないが、**``私の場合はバウチャーコードを入力するタイミングは受験申し込みの最後の最後で、あやうくクレジットカードで受験料を支払うところだった。``**
  - 受験料を払うかどうかは死活問題だと思うので、時間と気持ちに余裕を持って、焦らず、受験申し込みに挑むべきです。

参考：バウチャーコードを入力する画面をスクリーンショットしたもの(たしか、**``Apply``**をクリックすれば、申し込み完了なので、本当に申し込み直前です。

![Screenshot from 2020-08-08 18-33-56 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341653/8cbb6f0e-cf71-811a-bc03-d7de6e01ac16.jpeg)





### 申し込みは下記のMicrosoftのサイトからPearsonなど選択しておこなう。
  - [Exam AZ-900: Microsoft Azure Fundamentals](https://docs.microsoft.com/en-us/learn/certifications/exams/az-900) 


# 4.所感や受験を検討されている方へひとこと

- AZ-900の難易度はAWSでいう保有資格のSAAより難易度が低いプラクティショナー程度と言われているが、対策はしたほうがいいと感じた。
  - とりわけ、**``実務で扱っていない方に対しては、模擬試験を繰り返し解いておくなど、Azureのサービス間の使い分けをできるだけ頭に入れておかない``**と合格は難しそう。
- AZ-900は、パブリッククラウド、プライベートクラウド、オンプレミスのメリットとデメリットから、Azureの各種サービスのユースケースについてまで広く浅く出題されるかと思いきや、ポッとマニアックな問題が出てきたりと受験して損はしない資格であることも間違いないと感じた。業務でAzureを扱う方、AWSのSAAを取ってから何をしようか？考えあぐねている方は一度受験を検討されてみてはいかがでしょうか。

# P.S. Twitterもやってるのでフォローしていただけると泣いて喜びます:)

- [Twitter/@gkzvoice](https://twitter.com/gkzvoice)

-  [Medium/@gkzz](https://medium.com/@gkzz/)
[無料で簡単]RailsアプリをHerokuで公開する方法

#プログラミングの勉強日記
2020年8月8日　Progate Lv.226

#目標
　すでにローカルで作成済みのRailsアプリケーションをHeroku上で公開する。（すでにGitHubにコードをプッシュ済み）

#方法

##1.Herokuに新規登録をする
　[Herokuの公式サイト](https://jp.heroku.com/)から新規登録を行う。（無料）

##2.Heroku用のデータベースをインストールする。
　Gemfileを以下のように書きかえる。

```:Gemfile
# 開発環境、テスト環境
group :development, :test do 
  gem 'sqlite3' # sqlite3
end

# 本番環境
group :production do 
  gem 'pg' # PostgreSQL
end
```

<img width="746" alt="0808.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/8c5cf8d7-0ebf-f467-73a4-cb4295cc918b.png">
　
　Gemfileを書きかえたら、反映するために`bundle install`をする。


```:ターミナル
$ bundle install
```

データベースの設定ファイル（`config/database.yml`）を書きかえる。

```yml:config/database.yml
# 変更前
production:
  <<: *default
  database: db/production.sqlite3

# 変更後
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5
```

<img width="594" alt="0808-1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/d4d93c2b-bd63-5f9a-92b4-0f3fda2d137c.png">

##2.5. herokuコマンドを使用する(herokuコマンドが使える人は飛ばしてOK)
　herokuコマンドを使うためには、heroku toolbaltというツールをインストールする必要がある。
　[こちら](https://devcenter.heroku.com/articles/heroku-cli)からインストールすることができる。

　以下のコマンドでherokuコマンドが使えるか確認できる。(私はGit Bashで行った）

```:ターミナル
$ heroku --version
```


##3.Herokuにログインする

ターミナル（私はGit Bashを利用した）からログインする。

```:ターミナル
$ heroku login
```

ブラウザで以下のような画面が開く。

<img width="565" alt="0808-2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/cd19469b-573e-8528-cbe4-232768538b54.png">

　画面のLog Inを押すとログインすることができる。（ターミナルでも確認できる）

<img width="435" alt="0808-3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/a398f839-4432-7aea-3a77-4ca560914ed0.png">

##4.Heroku上でアプリを作成する
　自分でサービス名を決めて、以下のコマンドを実行する。サービス名は、最初が文字で始まり、最後が文字または数字である必要があり、小文字、数字、ダッシュのみを含めることができる。

```:ターミナル
$ heroku create サービス名
```
　アプリが作られていれば、`https://サービス名.herokuapp.com/`にアクセスすると以下の画面が出てくる。
 
<img width="467" alt="0808-4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/047b7203-8805-ea40-655c-f9a5ff9a0fb8.png">


##5.Herokuにコードをプッシュする
　GitHubにコードが管理されていることが前提。

```:ターミナル
$ git push heroku master
```
　成功すると、先ほどのURLをリロードすると以下の画面が出てくる。

<img width="376" alt="0808-5.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/70ee2308-4746-854f-0178-9f84e67b61e0.png">


```:ターミナル
$ heroku run rails db:migrate
```
　データベースを更新すると、先ほどのURLでサイトが表示される。


###メモ（ファイルを変更した場合のコマンド）

```:ターミナル
$ git add  -A

$ git commit -m "メッセージ"

$ git push heroku master

$ heroku run rails db:migrate

データベースをリセット（初期化）する場合
$ heroku pg:reset DATABASE
```

#問題点【追記】
以上の方法で、Heroku上Railsアプリケーションを公開することができた。
しかし、carrierwaveとcloudinaryを用いて画像を投稿する機能を作成したが、この部分がうまくいかないので、もう少し試行錯誤してみようと思う。
Herokuにcloudinaruを追加するときにクレカの登録が必要みたい、、？
[[Heroku]Cloudinary環境においてCarrierwaveで画像をアップロード](https://qiita.com/mzmz__02/items/21787dcb90ca91bcbe98)で解決しました！

#参考文献
[挫折した人必見！HerokuでRailsアプリを公開する方法](https://www.sejuku.net/blog/8178)
[herokuのデータベースをリセット/リストア/再構築する](https://qiita.com/quattro_4/items/a2eb3618207e21ca00d3)
[HerokuにRailsアプリをデプロイする手順](https://qiita.com/NaokiIshimura/items/eee473675d624a17310f)
インターネット接続　マルチホーミング、IP-VPN、インターネットVPN、広域イーサネット

平成31年春期 午前問題32

インターネット接続において，複数のISPの回線を使用した冗長化構成を表す用語はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ca2c01b2-8583-1ffa-1533-61ee83e61bb5.png)

拠点間を結ぶVPN（Virtual Private Network）サービスは、インターネットVPN、エントリーVPN、IP-VPN、広域イーサネットの4種類に分類されることが多い。
「インターネットを使ってもよい」かどうかだ。これでインターネットVPNはほかのVPNと区別される。

１、IP-VPN
　IP-VPNは、ISPから提供される閉域IP網を使用してVPNを構築する技術です。
　IP-VPNは、拠点間をプロバイダの**閉域IPネットワーク網**などで接続したレイヤー３のVPNサービスのことである。

２、インターネットVPN
　インターネットVPNは、暗号化プロトコルの技術を用いてインターネット回線上にVPNを構築する技術です。
　インターネットVPNは、拠点間を**インターネット**を介して接続したVPNのことである。

３、広域イーサネット
　広域イーサネットは、企業の拠点のLAN同士を通信事業者が構築しているWANを介して直接接続するサービスです。
  広域イーサネットは、地理的に離れたLAN間を**イーサーネット**で接続したレイヤー２のネットワークのことである。

４、マルチホーミング
　マルチホーミングは、インターネット回線を複数ISPの回線で接続し、1つの回線が切れてもほかの回線で通信し続けられるようにすることで、耐障害性の向上や負荷分散を行う仕組みです。



・VPN（Virtual Private Network）

・WAN  【 Wide Area Network 】  広域通信網
WANとは、地理的に離れた地点間を結ぶ通信ネットワーク。建物内や敷地（キャンパス）内を結ぶLAN（Local Area Network）と対比される用語で、通信事業者が設置・運用する回線網のことを指すことが多い。



参照：
https://www.ap-siken.com/kakomon/31_haru/q32.html

マルチホーミング構成
http://gozura101.chukai.ne.jp/site/page/web/member/net/trouble/as/

IP-VPNとインターネットVPNは何が違う
https://xtech.nikkei.com/it/atcl/column/17/011900625/011900003/
Grbl_Esp32とNejeMaster2の配線

#Grbl_Esp32ボードとNejeMaster2を配線
レーザードライバは配達待ちなのでとりあえずXYのステッピングモーターを動作させるべく配線

ステッピングモーターとモータードライバは普通に配線。
ホーミング用のリミットスイッチはMaster2側からジャンプさせる。
Y軸（太い方）のリミットスイッチはマイコンとつながっているためかリミットスイッチが正しく認識されなかったためパターンをカットした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/9cd7d108-0906-f92f-67a8-16dad957b135.png)

~~ホーミングさせるのにZ軸のリミットスイッチが必要なので、
手で作動させるリミットスイッチを追加している。~~
後のホーミング設定でZ軸ホーミングを回避。

ｘｙ動作は問題ないことを確認。

Master2で使われているコネクタはすべてjst(日本圧着端子) PH
Djangoでパスワード変更すると、勝手にログアウトされる

Django==2.2.12でのお話です。
ログインした状態で、自作の画面からユーザパスワードを変更したあと

・別のページに遷移しようとすると、まずログイン画面に飛んでしまう
・普段なら問題のないサーバーへのリクエストがエラーを返す

といった状況を不思議に思ったアナタ！

実はカスタムのパスワード変更画面を利用している場合、パスワード変更後に強制的にログアウト状態になってしまうんですね。
それまで使用していたセッションが使われなくなるのが原因です。

Djangoが用意している`PasswordChangeView`なんかを使用している場合は、パスワード変更後に自動で新しいセッションを作成してくれるので、ログイン状態が続いてくれます。

カスタム画面でもそうしたい！という場合は`update_session_auth_hash()`関数を使うといいよ。

といったことが、ドキュメント
https://docs.djangoproject.com/en/3.0/topics/auth/default/#session-invalidation-on-password-change
に書かれていました...

ついでに、このドキュメントに書かれている使用例も貼っておきます。

```python
from django.contrib.auth import update_session_auth_hash

def password_change(request):
    if request.method == 'POST':
        form = PasswordChangeForm(user=request.user, data=request.POST)
        if form.is_valid():
            form.save()
            update_session_auth_hash(request, form.user)
    else:
        ...
```
自作コンピュータの作り方 第4話

# 第4話　CPU毎のマザーボード構成　

**"自作の組込みマザーボードを作って自作のコンピュータを作りたい"**

第１話は以下より
https://qiita.com/nonNoise/items/c4800ac35c529c04e941
第2話は以下より
https://qiita.com/nonNoise/items/01427a281ceb7bdc0238
第3話は以下より
https://qiita.com/nonNoise/items/e4bcb08c4e86ab87d0d5

# CPU毎のマザーボード構成　

早速、CPU毎に実際にマザーボードの構成を考えていきたいと思います。

その前に、SiPについておさらいをしておきます。

# なぜSiPにしたのか

SiP(System in Package)については第１話で触れていますが、
ここでは、**なぜSiPにしたのか**を話します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/1abc9aa7-7227-4afc-b189-2a569e93e9a4.png)

第３章で語りました、マザーボードの構成を再び見ていきましょう。

この構成のうち、基板設計で最難所は**DDRメモリ**の部分だったりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/2054c468-8331-a3b5-1257-f3fda16dd80a.png)
http://ww1.microchip.com/downloads/jp/AppNotes/00002717A_JP.pdf
DDR系のメモリは**等長配線**という技を使います。
等長配線は、**同じ長さで配線する**という意味です。
DDRは差動で動作するピンや、タイミングがシビアなピンが多く、長さを合わせることで同期しやすい回路になります。
長さを合わせるために、こう、グネグネした配線を行います。お互いが同じ長さになるように**少し遠回りして**合わせるといった形です。

この等長配線を行うのは、**ものすっごく大変**（とはいえ高級CADで可能となりましたが）であり、
実際に配線できても、**動作するかどうか不安が多い**点です。

この**DDRの配線さえ無くしてしまえば**基板はもっと簡単に作ることが出来る。そういうシナリオです。

そんなシナリオを元に、**配線が大変なものはチップ内部に入れてしまえ**という形で、SiPが登場しました。

皆さん忘れているかもしれませんが、RaspberryPiも同様に、**メモリ配線を省略した基板**であることが多いです。
SiPとは言いませんが、別の仕組みで、CPUとRAMを結合したチップを使用しています。

まぁ、わかるように、DDRメモリの配線は**クッソ疲れます**。
そういった疲れる部分を肩代わりしてるのが、SiPのいいところです。

# SiPの内部構成

### OSD335x C-SiPの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/18f1fc71-5396-ecf9-9b5a-dc83352a38b9.png)

ほとんどの機能が、SiPによりチップ内部に封入されています。
そのため、外部に必要な回路や部品が少なく、その他のインターフェースに力を集中することが出来ます。
これは大変すばらしく、得意としている分野に特化することが出来ます。
ただ、**値段が高い**という難点があります。これが安くなれば幸せですが、そうも成りそうもありません。
値段が高い点を見るに、この状態は、**かなり特殊な状態**と思われます。

### SAMA5D2とSAM9X60の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/5d5311bb-0260-fad2-22c2-56647d85de6c.png)

逆に、本当にDDRメモリの部分のみチップに封入するメーカーもいます。
まぁ、値段が本当に**安い**ので、チップ単品との差が数百円ですので、SiPパッケージを使った方が**むしろ良い**状態です。
ただ、DDRメモリの次に難易度が高いPMICが外部に出ている為、その辺は頑張りどころです。
**安い**点や**小さい**点も含め、非常に小回りが利くので、自分としてはこの当たりのチップは気に入っています。

#マザーボード構成　まとめ

さて、SiPにより大半の機能がワンチップで実現されているため、あとは残りの機能を実現して下れば、自作マザボの完成です。

今回、記事を書きながらですが、基板設計も同時に行っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/48e7ee1a-58f2-2c8f-d61c-620ce4996981.png)

このボードは、意味合い的には**マザーボードではありません**。CPUボードと呼んだり、CPUモジュールと呼んだりします。

**本当は、１枚のボードで納めてマザーボードと言いますが、マザーボードを作るうえで気にしなければならない点が多く**
**今回は、CPUをちゃんと動かすバージョンの基板と、１枚に収めたマザーボードを作る**の二部構成で進めていこうかなと思います。
というのも、この先の話には、**U-BootやLinux**の話もあり、**基板や配線どころの問題ではない**点が多いので、
後段にある大きな敵と戦うために、今は被害を最小限にしたテスト用の基板を作るという戦略をとりたいとおもいます。


# 次回・・・
そろそろ、ちゃんと基板設計を進めないとネタがない汗
とりあえず、現在の基板設計で必要となるベースの話が出来てよかった。
ここから先は、時間がかかるので、二週間～三週間程度お待ちいただければと思います。
ではでは。
PYNQ > DMA tutorial: DMA to streamed interfaces > DMAを二つから一つにしてみた

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
PYNQ v2.5 Image
Vivado v2019.1 (64-bit)
```

### 関連

- [PYNQ > DMA tutorial: DMA to streamed interfacesを試した > 提供されたbitstream | tclから生成されるBlock Design](https://qiita.com/7of9/items/660cf7819e1b54b385a3)


### 概要

- dma tutorialで紹介されているデザインではDMA二つを使用
    - https://github.com/Xilinx/PYNQ_Workshop/blob/master/Session_4/6_dma_tutorial.ipynb
- DMA一つのブロックデザインを一から作って動作確認した


### 作成したBlock Design

![コメント 2020-08-08 173242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/16fc4634-4fed-e464-1393-c9f4d5107b39.png)

PS:M_AXI_GP0からaxi_dma_0:S_AXI_LITEに接続する場合も、三つ目のAXI SmartConnectが必要だった。
(不要になるかと考えていた）。


### Pythonスクリプト

```py
from pynq import Overlay

overlay = Overlay("/home/xilinx/jupyter_notebooks/base/dma_200808.bit")
```

```py
overlay.ip_dict
```

```txt:結果
{'axi_dma_0': {'addr_range': 65536,
  'device': <pynq.pl_server.device.XlnkDevice at 0xb0272490>,
  'driver': pynq.lib.dma.DMA,
  'fullpath': 'axi_dma_0',
  'gpio': {},
  'interrupts': {},
  'mem_id': 'SEG_axi_dma_0_Reg',
  'phys_addr': 1077936128,
  'state': None,
  'type': 'xilinx.com:ip:axi_dma:7.1'}}
```

一つのDMAになったので、dma_sendもdma_recvも同じものを指定。

```py
import pynq.lib.dma

dma_send = overlay.axi_dma_0
dma_recv = overlay.axi_dma_0
```

```py
from pynq import allocate
import numpy as np

data_size = 100

input_buffer = allocate(shape=(data_size,), dtype=np.uint32)

for i in range(data_size):
    input_buffer[i] = i + 0xcafe0000
```

```py
for i in range(10):
    print(hex(input_buffer[i]))
```

```txt:結果
0xcafe0000
0xcafe0001
0xcafe0002
0xcafe0003
0xcafe0004
0xcafe0005
0xcafe0006
0xcafe0007
0xcafe0008
0xcafe0009
```

DMA転送(PS to PL)する。

```py
dma_send.sendchannel.transfer(input_buffer)
```

```py
output_buffer = allocate(shape=(data_size,), dtype=np.uint32)

for i in range(10):
    print('0x' + format(output_buffer[i], '02x'))
```

```txt:結果
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
```

DMA転送(PL to PS)をする。

```py
dma_recv.recvchannel.transfer(output_buffer)
```

```py
for i in range(10):
    print('0x' + format(output_buffer[i], '02x'))
```

```txt:結果
0xcafe0000
0xcafe0001
0xcafe0002
0xcafe0003
0xcafe0004
0xcafe0005
0xcafe0006
0xcafe0007
0xcafe0008
0xcafe0009
```

手じまい

```py
del input_buffer, output_buffer
```
Could9での環境開発 - チートシート (Rails Tutorial)


```
$ printf "install: --no-document \nupdate:  --no-document\n" >> ~/.gemrc
```

リスト 1.1: バージョンを指定してRailsをインストールする

```
$ gem install rails -v 5.1.6
```

リスト 1.2: Railsプロジェクトで使うenvironmentディレクトリを作成する(クラウドの場合は不要)

```
$ cd                  # ホームディレクトリに移動する
$ mkdir environment     # 'environment' ディレクトリを作成する
$ cd environment/       # 'environment' ディレクトリに移動する
```
トランザクションのACID特性　原子性、一貫性、独立性、永続性

平成31年春期 午前問題30

トランザクションのACID特性のうち，一貫性(consistency)の記述として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/df399788-2a08-b10a-54ef-bb1841311be1.png)


ACIDは、データベースのトランザクション処理を行う上で必要不可欠とされる4つの性質(Atomicity・Consistency・Isolation・Durability)の頭文字を並べた言葉です。

１、Atomicity：原子性
トランザクション内の処理がすべて実行されるか、または全く実行されないことを保証する性質。

２、Consistency：一貫性
トランザクションによりデータの矛盾が生じないこと。常にデータベースの整合性が保たれていることを保証する性質。

３、Isolation：独立性
複数のトランザクションを同時に実行した場合と、順番に実行した場合の結果が等しくなることを保証する性質。通常は使用するデータにロックをかけることで直列化可能性を保証する。隔離性と呼ばれる場合もある。
・同時実行される複数のトランザクションは互いに干渉しないという性質である。

４、Durability：永続性
一旦正常終了したトランザクションの結果は、以後システムに障害が発生しても失われないことを保証する性質。通常は行われた操作をログファイル(ジャーナルファイル)に出力することで操作の再現性を担保する。耐久性と呼ばれる場合もある。


参照：
https://www.ap-siken.com/kakomon/31_haru/q30.html

https://www.ap-siken.com/kakomon/20_haru/q69.html
Notificationクラスを使ってEvent Logを出力する


>The most general way to display non-modal notifications is to use the Notifications class.

公式のドキュメントを参照すると、非モーダル通知を表示する一般的な実装と記載してある。
どのような挙動をするのか想像できなかったのでコードと画像を紹介します。

Version

- IntelliJ IDEA 2019.3 (Community Edition)


使い方としてはNotifications.Bus.notifyメソッドの引数にNotificationクラスを渡すと利用できる。
第4引数に渡すNotificationTypeを変更する事によって見た目と出力されるテキストの色が変わる。
### Information
緑色のバルーンと黒字で文字列が出力される。

```kotlin
Notifications.Bus.notify(
	Notification("sample", "hello", "hello! this is Information", NotificationType.INFORMATION)
)
```

<img width="140" alt="screen_shot 2020-08-08 17.08.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132235/b49721e6-24d7-ddf9-3948-fb039c34b0a8.png">
<img width="486" alt="screen_shot 2020-08-08 17.08.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132235/90a9edd6-748b-b462-eb04-89083165fbe1.png">


### Error
赤いバルーンと赤色の文字でログが出力される。

```kotlin
Notifications.Bus.notify(
	Notification("sample", "hello", "this is Error", NotificationType.ERROR)
)
```
<img width="132" alt="screen_shot 2020-08-08 17.11.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132235/ed0ae17f-6b6a-bdc8-c4eb-bacbbcaa1112.png">
<img width="353" alt="screen_shot 2020-08-08 17.11.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132235/184056b6-b682-6460-7f31-6fe803418836.png">

### Warning
黄色のバルーンと黄色の文字でログが出力される。

```kotlin

Notifications.Bus.notify(
	Notification("sample", "hello", "this is warning", NotificationType.WARNING)
)
```
<img width="136" alt="screen_shot 2020-08-08 17.13.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132235/2b9ef0e4-cd34-0711-fb17-7d1dcb2c8402.png">
<img width="410" alt="screen_shot 2020-08-08 17.13.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132235/6ee1dda4-0b22-98ba-00bc-1fa8e561d7ee.png">


(参考)

[IntelliJ Platform SDK DevGuide - Notifications](https://jetbrains.org/intellij/sdk/docs/user_interface_components/notifications.html)

[IntelliJ IDEAのプラグインを作ろう！](https://qiita.com/Vexus2/items/e04a21f00e467b7ac8ad)
ERB クラスを使って変数を展開した静的ファイルを作る

ERBクラスを使って、Railsの html.erb ファイルみたいに変数展開したものを、静的ファイルとして保存したいと思います。

状況としては、例えば、ユーザーごとにプレファレンス設定で、好みのスタイルシートの設定を持っているんですが、一旦設定されれば、変更があるまではスタイルシート自体はそのユーザー専用の静的ファイルにして読み込んだ方が効率的であるということで。

例えば、こんな変数を含んだスタイルシートを書きます。

```css:_style.css.erb
body {
  background-color: <%= bg_color %>;
}
.header {
  color: <%= title_color %>;
}
.text {
  color: <%= text_color %>
}
```

ActiveRecordで読み込んだプレファレンス設定が、
@preference というオブジェクト変数で、@preference.bg_color, @preference.title_color, @preference.text_color を持つとすれば

```ruby
style_erb = ERB.new(File.read("_style.css.erb"))
style_res = style_erb.result_with_hash(@preference.attributes)
File.write("style_#{@preference.user_id}.css", style_res)
```
のようにして変数を展開した静的ファイルを得ることができます。

最初、単純にインスタンス変数 @preference を展開してくれるかなと思ったのですが、ファイルからテンプレートを読んでいるせいか、それはできず、hashとして渡すメソッドを使いました。
ビッグデータのデータ貯蔵場所であるデータレイクの特徴

平成31年春期 午前問題29

ビッグデータのデータ貯蔵場所であるデータレイクの特徴として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/83554e02-028b-9c50-4f80-2007d518eeb1.png)

１、データレイク(Data Lake)とは、
川の流れのように絶えず流れ込んでくる多種多様な生データを、その規模にかかわらず、本来のフォーマットのまま蓄積しておく巨大な"貯水湖"です。蓄積するデータの生成元には、Webサイトやソーシャルメディア、モバイルアプリ及びIoTデバイスなどを含みます。
蓄積されたデータは、機械学習、予測分析、データ検出、プロファイリングなどに役立てられますが、どのように使用するかは基本的に利用者に任せられています。収集する範囲を決めずにそのままのデータが一元的に管理されているため、分析の際に求めるデータが不足したり、他システムから寄せ集めたりといった問題がなくなります。


・データレイクは、規模や種類にかかわらず、どのようなデータでもそのまま保存できるリポジトリです。
・本来のフォーマットのまま保存します。
・事前に用途や目的が決まっているわけではないので、データモデルは定義しません。
・多種多様なデータが単一のデータレイクに混在して保存されます。


データレイクの定義
データレイクとは、構造化データや非構造化データを格納する場所であり、様々なデータソースから集められたデータを管理し、活用のための前処理を行える環境。
Hadoopやオブジェクトストレージ+Sparkで構成されることが多い。


参照：
https://www.ap-siken.com/kakomon/31_haru/q29.html
Dockerで作る、環境整備 （PythonでのGrADSの後処理をしたい

# 何をしたいのか？
- PythonでGrADS用のファイルを読み込んで後処理をしたい
- しかし共有計算資源の環境はクリーンでなければならない
- だがしかし、変換ソフト、ライブラリなどなどインストールしたいものがいっぱいある

ということで、コンテナ仮想化を使おうということです。

# Docker
Dockerを使うと何がいいかというと、計算資源を汚すことなく、必要な後処理を行う専用の仮想計算機を作り上げることができます。使うときにコンテナを立ち上げ、処理を行った後は破棄してまた必要になったら立ち上げることができます。
Dockerの場合は立ち上げのコストが非常に低いので、気軽に立ち上げて一つの処理をした後また破棄することが気軽にできます。

## 環境整備手順
Dockerfileを書くと自動化できていいのですが、ここでは単にシェルを立ち上げて整備して、それを単純にコミットしてイメージを作ることにします。
長期的に使いたいなら、バージョンアップも可能になるようにDockerfileを作るべきですが、最初の基本の機能の確認はシェルで行ったほうが理解が深まります。

今回はUbuntuをもとに、cdoとpip3, netcdf4をインストールします。

## 1. もとになるイメージをpull(拾ってくる)して走らせる
今回はUbuntuを使います。

```sh
$ docker pull ubuntu/ubuntu
```

```sh
$ docker images
```
で、イメージが作れたことが確認できます。

イメージを走らせるためには、

```
$ docker run -it ubuntu/ubuntu
```

とします。

## 2. 必要なソフトウェアのインストール

`pip3`と`cdo`をインストールします。
`pip3`で`netCDF4`もインストールします。

```
# apt update
# apt install python3 python3-pip cdo
# pip3 install netCDF4
```

## 3. 動作確認
きちんとcdoで変換できてnetCDF4もインポートできるか確認します。

```
# python3
>>> import netCDF4 as nc
>>> ^D
# cdo
....
```

## 4. コミットしてimageを作成する
exitコマンドかCtrl+dで抜けて、イメージを作りましょう。
イメージを作るために必要なコンテナIDは、終了したコンテナを確認するために`-a`が必要です。

```sh
# exit
(host) $ docker ps -a
```
このような画面になると思います。
CONTAINER IDはコミットの時に指定するコンテナIDになります。
IMAGEのところにimageの名前があって、STATUSのところでexited ** agoとなっているので、大体どれかはそこを見ればわかると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533324/43724873-f557-8a45-f4fc-dcc3ad1ba224.png)

```sh
$ docker commit [container id] [author]/[image名]
```
というようにコミットしてあげましょう。

```sh
$ docker images
```
で、イメージが作れたことが確認できます。

## 5. 実際に計算させてみる
実際に計算させるとき、２通りあって、runしてからインタラクティブにシェルから実行することもできます。ただ、今回はrunの際にコマンドを指定して実行させてみます。

プログラム、データ群のディレクトリをDockerへとバインドすることで、実際にコンテナから容易にアクセスることができます。また、グラフの確認にXフォワーディングをします。

```sh
$ sudo docker run -e DISPLAY=$DISPLAY --net host -v /tmp/.X11-unix:/tmp/.X11-unix -v $HOME/.Xauthority:/root/.Xauthority -v /home/xxx/:/home/ --shm-size 16g xxx/ubuntu-cdo2 /bin/bash -c "cd /home/speedy-epyc/speedy/python-script; python3 rmse.py"
```

`--shm-size`は、足りなくなるプログラムがあれば必要に応じてつけてください。
【HOMEBREW】 Mac OSのパッケージマネージャーについて node.jsやってたら学んだ事

##【この記事で身に付くこと】
■HOMEBREWとは基礎
■mysqlを自身のMacへ

##【背景】
■node.jsでの開発途中で、mysqlが無く、先に進めなかった為


##【開発環境】
■ Mac OS catalina
■ Homebrew 2.4.9
■ mysql  Ver 8.0.21

##【実装】

###HOMEBREW入れます。
＊Xcodeも自動的にインストールされます。便利

```mac.terminal
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
.
.
.
// 5分くらい待ちます。下記の文は自動で出てきます。
$ Downloaded Command Line Tools for Xcode 
```
###mysql入れます。

```mac.terminal
$ brew install mysql 
```

###確認

```mac.ternminal
$ brew -v
Homebrew 2.4.9
Homebrew/homebrew-core (git revision b32b4; last commit 2020-08-08)

$ mysql --version
mysql  Ver 8.0.21 for osx10.15 on x86_64 (Homebrew)
```

以上。

##【まとめ】
■HOMEBREWとはMACのOSを動かす、パッケージマネージャー
■mysqlはDBの種類
例
　***パッケージマネージャー　＝　app store***
　***パッケージ　＝ app***
みたいな感じでしょうか。。
appstoreがあるからappがダウンロードできる。


##【合わせて読みたい】

■ 【node.js】 node.jsインストール 芋っていたけど、簡単だった件...
https://qiita.com/tanaka-yu3/items/739db5ffed24a8d9ae4b

■ 【comandLine】　一言で　コマンドライン　各種コマンド　ターミナル
https://qiita.com/tanaka-yu3/items/b32e353bd6d7c9ebd4fb

■作業環境を整えるMacOSXのパッケージマネージャ「Homebrew」のインストール方法と使い方
https://liginc.co.jp/web/tool/mac-iphone/151069
dockerコマンド実行時に出たエラー

dockerのimageを作成しようとしたら以下のエラー発生

`$ docker-compose build
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?
If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.`

ググって見つけた記事には権限を変更しろとあるので以下を実行(ec2等の場合はexitしてから再起動)
`$ sudo usermod -aG docker $USER
$ sudo chmod +x /usr/local/bin/docker-compose`

しかし、エラーは変化せず。。。
試しに以下のコマンドを実行するとrunningになっていなかった。
`$ sudo service docker status`

dockerをスタートさせたら無事にコマンドが通るようになった。
`$ sudo service docker start`

エラー出たらまずstatus確認するの大事ですね！
初めてのFlask

##Flaskモジュールのインストール
```
(base) root@e8cf64ce12e9:/home/continuumio#pip install flask 
```

##フォルダ構造の作成
Flaskで使用するHtmlファイルは、プロジェクトフォルダに「templates」という名称のフォルダを作成して格納する必要がある。
注：テンプレートという名前だけど、要はFlaskで利用するHtmlファイルはすべてここに格納すれば良い。

```
.
├── __pycache__
├── hello.py
└── templates
    ├── hello.html
    └── layout.html
```

余談：上記のようなディレクトリ構造を取得するためには、「tree」コマンドを別途インストールする必要がある。
Docker環境がUbuntuだったので「apt install tree」でインストールできた。Macローカルの場合のインストールは別途作業が必要みたい。

各ファイルの役割は下記の通り
- hello.py: アプリケーションのルーティングファイル。
<2020/08/09 追記>
ルーティングファイルは常にこの位置にないとだめみたい。
別フォルダに格納してルーティングするテンプレートのパスを調整してみたけどだめだった。フレームワーク内で決まってるのかもしれない。

- template/hello.html: 画面の一部を構成するhtmlファイル。とどのつまり画面を構成するパーツ。
- templates/layout.html: すべてのHtmlファイルのベースとしてのhtmlファイル。このファイルの部分部分にhello.htmlのようなパーツとしてのhtmlフィアルが組み込まれてくイメージ。

##各ファイルの内容
###layout.html
```layout.html
<!DOCTYPE html>
<html>
<head>
    <titile>{{ title }}</titile>
</head>
<body>
    {% block content %}
    <!-- main-->
    {% endblock %}
</body>
</html>
```
- {{ val }}: val部分には同名の変数の値が反映される。
- {% block content%}~{% endblock %}:このタグ範囲に拡張パーツとしてのhtmlファイルに記載されている{% block content%}~{% endblock %}のスクリプトが差し込まれるイメージ


###hello.html
```hello.html
<!-- layout.htmlをテンプレートに拡張する-->
{% extends "layout.html" %}
<!-- block content ~ endblock-の範囲がテンプレートの同宣言範囲に差し込まれる -->
{% block content %}
<h3>Hello</h3>
こんにちは。{{ name }}さん。
{% endblock %}
```
- extends で指定したｈｔｍｌにこのｈｔｍｌ内のblock contentの内容を反映する。継承のイメージ。

###hello.py
```hello.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def hello():
    name = 'TEST'
    # return name
    return render_template('hello.html', tite="flask test", name=name)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)
```
- 「render_template」をimportすることでJinja2テンプレートの機能が利用できるようになる。
- render_template([呼び出すhtml],[[テンプレートに渡す変数名=値],...]
- 「if __name__ == "__main__":」　コマンドラインからpythonファイルを実行する際のおまじないという認識でOK。
- app_run([host=0,0,0,0],[port=XXXX],[debug=XXXX])でアプリケーションを起動する。
hostとかポートはここで指定しなくても動かす方法がありそうだが、おいおい調査する。

##実行
```
(base) root@e8cf64ce12e9:/home/continuumio# python hello.py
 * Serving Flask app "hello" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with inotify reloader
 * Debugger is active!
 * Debugger PIN: 197-268-519
```

<img width="747" alt="結果.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600163/a3e05165-c070-87d2-63c7-12736b89a1e1.png">

画面が表示できた。

#####最後に
とりあえず最低限の使い方だけわかったけど、実務でFlask使うことってないだろうし、事業会社はDjangoなんでしょうね。
あくまでも、フレームワークの足がかりとしてなら勉強する価値あるかな。
Visual Studio Code で急に"Extension host terminated unexpectedly."と出てきた時にやったこと


## 起こったこと

開発していたら急に```Extension host terminated unexpectedly```と出てきて、拡張機能が使えなくなった。

<img width="457" alt="Screen Shot 2020-08-08 at 16.48.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208723/305bcb0b-cb67-b4e7-a548-7a76ed2e211d.png">


## 解決策

```Open Developer Tools```でエラーを出しているところを見る

自分の場合は「Color Highlight」だったので、「Color Highlight」消して再起動したら直った。

とにかくExtentionsの中からエラーを出している拡張機能を一つ一つ消していくのが大事みたいです。
AWS Dynamo DBへのcsvインポートを手軽に実装(Windows・無料)

#はじめに
[Tech Dive様の記事](https://tech-dive.xyz/2020/03/22/dynamodb%E3%81%B8csv%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/) を大変参考にさせて頂きました。この場を借りて御礼申し上げます。

この記事は上記内容をWindows環境で実施した際の備忘録になります。

#筆者の環境
・Windows 10
・Git Bash

#手順
1.  [Python3](https://www.python.org/downloads/) のインストール

2. Pandasのインストール `pip install pandas`
3. [aws cli](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-windows.html )のインストール
インストールしてもGit Bash で `aws` コマンドが使えなかったので、GitBashで
`cmd \\C aws --version`
を叩いてから再起動したら使えるようになりました

4. アクセスキーの確認
AWS ユーザーメニューの「マイセキュリティ資格情報」から、インポート用のアクセスキーを新規作成

5. アクセスキーとシークレットアクセスキーの登録
`aws configure` を叩き、先ほど作ったアクセスキーを登録

    ```
    aws configure
 
    AWS Access Key ID [None]: [アクセスキー]
    AWS Secret Access Key [None]: [シークレットアクセスキー]
    Default region name [None]: us-east-2 ※テーブルがあるリージョン
    Default output format [None]: json
    ```

6. CSVのヘッダーを変更
先頭行をデータベースのkeyと合わせて、型を()でくくって指定
例） キーが「UserName」(String)なら UserName (S)

7. [import_to_dynamodb](https://github.com/hidesan-xyz/import_to_dynamodb) をclone
`git clone https://github.com/hidesan-xyz/import_to_dynamodb.git`

8. cloneしたディレクトリのルートにインポートするcsvファイルを置く
9. import用shellコマンドの作成
`python create_insert_command.py importdata testtable`
※第一引数にcsv名(拡張子は記載しない) 第二引数にテーブル名

10. 作成されたシェルコマンドの実行 `sh ./testtable_import_20200808164839.sh`


上記手順で完了です。
RailsTutorial2章→usersが表示されない

# 症状
デプロイしたherokuアプリのURLは正常に開けるが、
末尾に/Usersをつけた際
『We're sorry, but something went wrong』と表示される

# 原因
マイグレートが上手くできていなかった

# 解決方法
リスト 2.4: データベースをマイグレートする
の実行コマンドを1から2に変更する

1.$ rails db:migrate
↓
2.$ heroku run rake db:migrate

#なぜrails db:migrateだとダメだった？
調査中
docker-compose upでDBが立ち上がらないときにやったこと

dockerで環境構築をし、サーバーを起動しようと`docker-compose up`をすると
`Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)`というエラーが出てしまう。

ターミナルにて、エラーログを確認すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484801/48df7163-8824-1e10-4bac-96a59217265d.png)
何かが原因でDBがシャットダウンしてしまっている模様。

`privilege tables`なのでsudoで作成するユーザのテーブル？
なぜdockerでこの内容のエラーが出る？
と色々疑問に思ったが、とりあえず一度全てのvolumeを削除してみることに。

## 解決策
①volumeのIDを調べる

```
$ docker volume ls
DRIVER              VOLUME NAME
local               b1d0c8467782387a61c446e1ea2aedaa745d6f120c4c6423bdc37e9005a7bd34
```
②上記で調べた`VOLUME NAME`を用い、rmコマンドにてvolumeを削除

```
$ docker volume rm [VOLUME NAME]
# 例↓
$ docker volume rm b1d0c8467782387a61c446e1ea2aedaa745d6f120c4c6423bdc37e9005a7bd34
```

③`docker-compose.yml`を元に、コンテナ&サーバー再起動

```
$ docker-compose up --build
$ docker-compose run web rails db:create
$ docker-compose run web rails db:migrate
```
④localhost:3000にアクセス
→ **無事エラーなく起動**

## 原因
mysqlのテーブル情報が保存される場所がvolumeなので`コンテナを削除した際にvolumeコンテナを削除しきれておらず、前回のmysqlの情報が中途半端に残っていたため`、権限不足となっていたみたいです。

これ以前に何回もコンテナを作って削除して、を繰り返して試行錯誤していたため、その時の残骸でしょう...

## 参考にした記事
[docker-compose up で db が立ち上がらない時は volume を削除してみる](https://iriya-ufo.net/blog/2019/01/09/delete-docker-volume/)
GIS、キャンパスとなる都道府県と地点データをR作図で書きわける

![Rplot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504024/ac2e04e2-0707-c0a8-3795-7d40860cd95a.png)

上の図は、Rで作成した地図データです。
待機児童の市区町村別データを点データで表現し、その大きさとグラデーションで規模や割合を表現しています。点データだけですと、地域的な特徴がわかりずらいため（ゼロデータの市区町村はそもそも表示されないようになっているため）、キャンバスとなる都道府県地図データを重ね合わせることで、視認性を向上させることにしました。以下、ソースコードです。
必要なシェープファイル等はダウンロードして編集済みであることが前提です。
shpファイルの編集等は、別途、私のyoutubeチャンネルなどを参考にしてください


```r
#編集や読み込みを行うためのパッケージです
library(sf)
library(tidyverse)

#dbmapはデータベースを統合するための市区町村別、
#c_mapは都道府県用のキャンパスとなるマップデータです。
#dbはcsv形式でとった市区町村別のデータです。
db_map <- read_sf("municipalities.shp")
c_map <- read_sf("prefectures.shp")
db <- read_csv("db.csv")
db_2 <- left_join(db_map, db, by=c('adm_code'='admin'))
g01 <- ggplot()+
 geom_sf(data = c_map,fill = "white",alpha=.4)+
 geom_point(data = db_2,aes(x=lon,y=lat,size = SpecificNeed_Num + Waiting_Num + NoJobS_Num, colour = B_Rate),alpha=.7)+
 ylim(32.5,37.5)+
 xlim(137.5,142.5)+
 scale_colour_gradient(low="green",high="red")+
 scale_size_area(max_size=6)+
 labs(size="広義の待機児童数", colour="保育所申込件数分の\n広義の待機児童数")+
 annotate("text",x = 140,y=33,label="注：「広義の待機児童」；特定の保育園等のみ希望している者、求職活動を休止している者	、待機児童の合計\n
出所：厚生労働省（2020）『保育所等関連状況取りまとめ(平成31年４月１日)』よりYoshihiro Kensuke作成。" ,family = "HiraKakuPro-W3",size=2)+
 theme_void(base_family = "HiraKakuPro-W3")
plot(g01)
```
色々いじってみてください。
STM32CubeでFreeRTOS使用時のHardFault対策

# はじめに
STM32CubeMXやSTM32CubeIDEでFreeRTOSを組み込んだプロジェクトを作成し、
ブートローダから起動させるとHardFaultになることが有ります。

```
void HardFault_Handler(void)
{
  while (1)
  {
  }
}
```

# 原因
FreeRTOSはSysTickによってOSを動かしています。
ブートローダでSysTick割り込みを有効にしたままアプリをロードしてしまうと、FreeRTOSの初期化に到達する前にSysTick割り込みが起こり不正メモリアクセスでHardFaultになります。

# 対策
ブートローダでアプリをロードする前にSysTickを停止させます。

```
...
HAL_SuspendTick();
JumpToAPP();
```
USD(米ドル)からJPY(日本円)に変換するシェル

# なんで作ったん

https://mwm-store.com/product/phase-essential
を欲しいなーと思ったがドルが安いときに書いたいなーと思い立った
ら
良きAPIを見つけた方がいたので。
[無料で使える為替取得APIメモ \- Qiita](https://qiita.com/kawaz/items/274f2198a60021972bc0)

# ソース
https://github.com/tknr/price_usd_to_jpy

# 使い方

```
bash price_usd_to_jpy.sh USD(ドル) [メールで欲しい場合は宛先アドレス]
```
## 使用例

### 知りたいだけでメールはいらん人向け

```
$bash price_usd_to_jpy.sh 100
10570 yen
$
```

### メールで送って欲しい人向け

```
$bash price_usd_to_jpy.sh 100 example@example.com
```

てやると、example@example.com 宛に以下のようなメールが届く

```
to : example@example.com
subject : [price report] 100 USD is 10570 yen . 
body:
100 USD is 10570 yen . 
```

のでcrontabに以下のように書いてやればいいんです

```
0 6 * * * /bin/nice -n 19 /bin/bash /home/example/price_usd_to_jpy.sh 100 example@example.com
```
Android 端末内にデータを保存する際の指針

# 概要
Android 端末内にデータを保存する際の指針をまとめました。

# 包括的情報
[Data and file storage overview](https://developer.android.com/training/data-storage) 参照のこと。

# ストレージ選択の指針
![Android Storage Selection Chart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219474/ff1a87ea-c816-bcb8-857a-9670d3c56f09.png)


**アプリ内のみで利用されアンインストール時に削除される**かどうか？

- 他のアプリとデータを共有する場合は **no**, それ以外は **yes**。[^3]

**内部ストレージが好ましい**かどうか？

- 存在の保証[^2]が必要なデータは内部ストレージにすることが必須。
- アプリの基本的な機能[^1]から必要とされるデータは内部ストレージが好ましい。
- 大量のデータを保存する場合は外部ストレージが好ましい。

**メディアファイル**かどうか？

- Android はメディア情報を統合的に扱う Media Store Framework を提供しているため、これを利用することが好ましい。

# 構造化されたデータの扱い

## ◆ 一般論
構造化されたデータについては、key-value pair の場合は [App preferences](https://developer.android.com/training/data-storage/shared-preferences), それ以外の構造の場合は [Database](https://developer.android.com/training/data-storage/room) という指針が一般的なようです。

## ◆ 個人的見解
SharedPreferences のデフォルトの DataStore を利用するのは避けたいところです。理由は、SQLite のような汎用的なマイグレーションパスが存在しないためです。

ここら辺は、時が来たら追記しようと思います。

# App Specific Files
[Access app-specific files](https://developer.android.com/training/data-storage/app-specific) 参照のこと。

# MediaStore API
[Access media files from shared storage](https://developer.android.com/training/data-storage/shared/media) 参照のこと。

# Storage Access Framework
[Access documents and other files from shared storage](https://developer.android.com/training/data-storage/shared/documents-files) 参照のこと。

[^1]: アプリの起動など。
[^2]: 外部ストレージは取り外される可能性を常に考慮する必要がある。
[^3]: アプリ内のみで利用されるがアンインストール時に削除しないという選択肢は、アンインストール後にゴミを残してしまうため、選択肢としてあり得ない。
grepを使ったソースコードファイルの検索

# 目的

- 特定の文字列が記載されているソースコードのファイルを検索するコマンドを紹介する

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

# コマンドの紹介

- ソースコードのファイルがあるディレクトリに移動して下記コマンドを実行する。

    ```terminal
    grep -ilr "検索文字列" ./*
    ```
- 上記のコマンドを実行すると「検索したい文字列」が記載されているファイル名が出力される。

# コマンドとオプションの簡単な説明

1. コマンド `grep`
    - ファイルに対して実行すると条件に合致した行を出力する。
    - 条件には正規表現を使うことができる。
    - よく文字列検索やログの検索に使用する。
    - 大文字と小文字を区別して検索する。
    - `$ grep "検索文字列"`と実行することで検索文字列を次含む行が出力される。
1. オプション `-i`または`--ignore-case`
    - 大文字、小文字を区別せずに検索を行う。
1. オプション `-l`または`--files-with-matches`
    - 検索にヒットした行を含むファイル名のみを出力する。
1. オプション `-r`または`-R`または`--recursive`
    - 再起的に検索する。
1. `./*`
    - 検索ディレクトリの指定をしている。
    - `.`がカレントディレクトリを指す。
    - `/*`がディレクトリ直下全てを指す。
    - `./*`で「カレントディレクトリ直下全て」を指定している。
1. `$ grep -ilr "検索し文字列" ./*`
    - 上記を踏まえると、「検索対象ディレクトリを本ディレクトリ直下の全てとして、検索文字列を検索する。検索文字列の大文字小文字を区別せず、ヒットした行があるファイル名を出力して、かつ検索は対象ファイルが存在する限り再起的に検索する」ということになる。
macOSのスクリーンショット設定を変更する

# 概要

macOSのスクリーンショット機能って便利ですよね。

特に`Command + Shift + 4`での部分選択しての保存は色々な場面で重宝しています。

今回はそのスクリーンショット機能をさらに便利にしたときの設定変更を書き残します。

# 保存先ディレクトリ

デフォルトだとスクリーンショットはデスクトップに保存されます。

デスクトップにできる限りモノを置きたくない僕にとって、これは死活問題です。笑

幸いスクリーンショットの保存先はターミナルからコマンドを実行することで変更することが出来ます。

自分はダウンロードフォルダにスクショを保存したかったので、`~/Downloads`と指定しています。

```
defaults write com.apple.screencapture location [ファイルの保存先のパス]; killall SystemUIServer;
```

# ファイル名

デフォルトの保存名は`スクリーンショット YYYY-MM-DD hh.mm.ss`となっています。

ファイル名で変更できるのは大きく2点あります。

## 文字列部分の変更

設定した文字列でファイル名の`スクリーンショット`の部分が置換されます。

空文字`""`を指定すると文字列部分を削除できます。

```
defaults write com.apple.screencapture name "[任意の文字列]"; killall SystemUIServer;
```

## 日付の有無の変更

trueで日付あり、falseで日付無しとなります。

(日付の表示形式も変えられたら良かったなあ。)

```
defaults write com.apple.screencapture "include-date" [true|false]; killall SystemUIServer;
```

# 保存形式

デフォルトではpngで保存されます。

自分は軽量なファイルで保存したかったのでjpgで保存するようにしています。

jpg以外にも複数のファイル形式を指定できるみたいです。

```
defaults write com.apple.screencapture type [jpgなど]; killall SystemUIServer;
```

# まとめ

上記3点を設定することで、macOSのスクリーンショット機能がより使いやすくなるかと思います！

# 参考

- https://book.mynavi.jp/macfan/detail_summary/id=90165
- https://sp7pc.com/apple/mac/9514
- http://seotech.jp/837
Docker + Rails6 + Postgresql の開発環境を構築する

# 前提
Rails環境を構築していないチームメンバーも環境構築に手間をかけずにローカルで簡単にプロジェクトを動かせるようにとDockerを導入しました。私自身はローカルにRails環境を構築しているため、プロジェクト作成はローカルで行い、Dockerとローカル直のいずれも動作できるようにしました。
Dockerはすでにインストールされているものとします。

# 環境
- macOS Catalina 10.15.4
- Ruby 2.7.1
- Rails 6.0.3.2
- PostgreSQL 12.3
- Docker version 19.03.12

# プロジェクト新規作成
```
$ mkdir myapp; cd $_
$ rails new . --skip-coffee --skip-turbolinks --database=postgresql
```

# 環境変数を管理するdotenv-railsを導入
環境変数によって、Dockerで動かすかローカル直で動かすか選べるようにします。

```ruby:Gemfile
gem 'dotenv-rails'
```

gemをインストール

```
$ bundle install
```

下記はDockeで動かす場合の環境変数の設定例です。

```:.env
DATABASE_HOST=db
DATABASE_USER=postgres
DATABASE_PASSWORD=secret
```
ローカル直で動かす場合は`DATABASE_HOST=localhost`とします。

# Docker用ファイル作成・編集
```yml:docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    ports:
      - "5433:5432"
    environment:
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: 'secret'
      POSTGRES_DB: 'db'

  webpacker:
    build: .
    command: bundle exec bin/webpack-dev-server
    volumes:
      - .:/myapp
    ports:
      - "8080:8080"

  web:
    build: .
    command: /bin/sh -c "rm -f /myapp/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
      - webpacker

```
```yml:dockerfile
FROM ruby:2.7.1
 
ENV LANG C.UTF-8

# 必要なライブラリをインストール
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

# yarnパッケージ管理ツールインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y yarn

# ワークディレクトリ設定
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
EXPOSE  3000
```

`database.yml`に`host`、`username`、`passwrd`の設定を追加

```yml:/config/database.yml
:　省略

default: &default
  adapter: postgresql
  encoding: unicode
  host: <%= ENV.fetch("DATABASE_HOST") { "127.0.0.1" } %>               # 追記
  username: <%= ENV.fetch("DATABASE_USER") { "postgres" } %>            # 追記
  password: <%= ENV.fetch("DATABASE_PASSWORD") { "" } %>                # 追記
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

:　省略

```

# image構築

```
$ docker-compose build
```

# パッケージインストール

```
$ docker-compose run --rm web bin/yarn install
```

# データベース作成

```
$ docker-compose run --rm web rails db:create
```

# 起動

```
$ docker-compose up
```
http://localhost:3000/ へアクセスできます。

# ローカル直で動かす場合
`.env`を編集し、`yarn install`、`rails db:create`、`rails s`で起動します。
Rust+wasmでJSONを扱う

Rust+wasmで複雑なものを作ろうとするとJSON形式のデータは避けて通れないと思いますが、wasm-bindgenのドキュメントにあるJsValueを使うのがよさそうです。

https://rustwasm.github.io/wasm-bindgen/reference/arbitrary-data-with-serde.html

```toml:Cargo.toml
[dependencies]
serde = { version = "1.0", features = ["derive"] }
wasm-bindgen = { version = "0.2", features = ["serde-serialize"] }
```

```rust:lib.rs
use wasm_bindgen::prelude::*;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
pub struct Monster {
    name: String,
    value: String
}

#[wasm_bindgen]
extern {
    pub fn alert(s: &str);
    pub fn console_log(s: &str);
}

#[wasm_bindgen]
pub fn return_name(val: &JsValue){
    let m: Monster = val.into_serde().unwrap();
    //alert(&m.name);
    console_log(&m.name);
    console_log(&m.value);
}
```

dependenciesでwasm-bindgenのバージョンだけでなくserde-seriarizeというfeatureも指定する必要があります。（これを読み飛ばしてて、気付くまで時間かかった・・・）

return_nameの引数の`val: &JsValue`が今回のキモです。今回は`into_serde()`でJSONを読み込んでますが、逆にRustの値をJSONにする`from_serde()`というメソッドもサポートしてます。


```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>hello-wasm example</title>
  </head>
  <body>
    <script type="module">
        import * as mod  from "./wasm.js";
        let monster = {
          "name":"pikachu",
          "value":"100"
        };
        (async () => {
            await mod.default();
            mod.return_name(monster);
        })();
    </script>
    <script>
      const console_log = (val) => {
        console.log(val);
      }
    </script>
  </body>
</html>
```

次にJavaScript側です。wasm.jsから読み込んだRustの関数（return_name)にmonsterという値をそのまま渡します。

![rust.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/56f968dd-8349-f5a7-3a8c-c3fe61931717.png)

絵にすると、こんな感じです。Rustで書いたreturn_nameという関数をJavaScriptのasyncの中で呼び出し、そのreturn_nameではJavaScriptで書いたconsole_logという関数を呼び出しています。

これでJavaScriptで生成した大量のデータをwasmで処理できますね。

環境のインストールとビルドは、こちらの記事が参考になると思います。

https://qiita.com/jp_ibis/items/3205b4799cb567f8ebf5
Laravelのコンストラクタとは

##はじめに
コンストラクタとはクラスからインスタンスを生成するとき（オブジェクトがnewによって作成されるとき）に自動的に呼び出されるメソッドです。
オブジェクト作成時に初期化処理が必要な場合、コンストラクタ内に記述しておけば自動的に実行してくるので大変便利です。

##コンストラクタを用いて実装してみる
```php
class Job
{
    protected $job_service;

    public function __construct(
        JobService $job_service
    ) {
        $this->job_service = $job_service;
    }

    public function main()
    {
        $recruiting_jobs = $this->job_service->recruitingJobs();
        return $this->render($recruiting_jobs);
    }
}
```
メソッド名の部分を__constructとするとコンストラクタとなります。
~~コンストラクタのアクセス制限はpublicのみです。~~
コンストラクタはprivateやprotectedにすることもできますが、その場合外からnewができなくなります。（2020/09/05：追記）

##おわりに
コンストラクタに実装すれば必要なたびごとに初期化の実装が不要になるので便利ですね。

参考：[コンストラクタ - Laravel学習帳](https://laraweb.net/surrounding/1472/)