OmniAICreator/Qiita-1.07M huggingface dataset:
競技プログラミング備忘録②　配列のuniq地味にすごいなぁ・・・。

指摘により修正2020/5/3

今日は配列のメソッドについて備忘録としてメモしておきます。
先駆者のコードをみていると目から鱗が多い。。。

##push
Arrayクラス、インスタンスメソッドの中にpushがございます。
これは、配列に追加するメソッドですが、後入れといえばわかりやすいでしょうか？
[1,2]配列があった場合、３を入れると、既存の配列はそのままで[1,2,3]と格納してくれます。
簡単なメソッドで可読性が高いので愛用しています。

```ruby

num = 3
ary = Array.new(num)
num.times do |i|
  ary.push(i) # [0,1,2]と格納される
end

```



## uniq
Arrayクラス、インスタンスメソッドの中にuniqメソッドがございます。
簡単にArray　→　Arrayを返すメソッドです。
これは、主に重複している文字列を削除してくれるメソッドです。

このメソッドの処理速度が尋常じゃないほど早い。

繰り返し処理で同様のメソッドを実現した場合、タイムアウトしてしまうのに対して、（私の組み方に問題ありですけど）
uniqメソッドはタイムアウトしない・・・だと？
この上なく便利なメソッドなのでぜひ競技プログラミング必須ですなぁ。

```ruby

num = 3
ary = []
num.times do
  ary.push('test') # pushメソッドは配列に追加するメソッドです。簡潔でわかりやすい。
end
p ary #['test','test','test']と配列に格納されています。
p ary.uniq #他のtestは消えて['test']のみ出力されます。
p ary.uniq.length #配列数なので１が出力されます。

```

まだまだ学ぶことが多いなぁ。
【Karabiner】左の⌘単体入力で「英数」キー入力を送信したい

# 概要
いつも忘れるので備忘録的に。
ErgodoxEZを使っているのですが、新しいMacに接続するたびに
左コマンドを単体で入力して英数モードにしたい。

# やり方

## Ruleのインストール
https://ke-complex-modifications.pqrs.org/
にアクセスし、 「For Japanese」を「[Karabiner-elements](https://karabiner-elements.pqrs.org/)」にインストールする。

## Ruleの有効化
一番上の「コマンドキーを単体で押した時に...」のRuleを有効にする。

でできます。

誰かのお役に立てば。
active_hashの使い方

# active_hashとは
Active_Recordのように読み込み専用情報をまとめたハッシュを扱うことができるものです。
現在アプリのDBに変動が起きないデータを保存している場合、すぐ入れ替えることが可能。
まとめると、DBに保存せずに使うことができる。

##使い方
※都道府県(prefectureモデル)のactive_hashを作成する。

1.Gemfileに以下を記述する。

```
gem 'active_hash'
```

忘れず実行する。

```
$ bundle install
```

2.Active_Hash::Baseを継承しているモデルを作成する。(app/modelsの中にファイル作成)

```app/models/prefecture.rb

class Prefecture < ActiveHash::Base
end
```

3.データを用意する。(config/initializersの中にファイル作成)

```config/initializers/data.rb

Rails.application.config.to_prepare do
  Prefecture.data = [
      {:id => 1, :name => "北海道"},
      {:id => 2, :name => "青森県"},
      ...
  ]
end
```

4.アソシエーションを定義する。

[例]
PrefectureとAddress(住所)が１対多の関係を定義します。

active_hash側のモデルに定義

```app/models/prefecture.rb
class Prefecture < ActiveHash::Base
  include ActiveHash::Associations
  has_many :addresses
end
```

Active_Recordのモデル側に定義

```app/models/address.rb
class Address < ActiveRecord::Base
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :prefecture
end
```
NestJSの始め方

JavaScript(TypeScript)のサーバーサイドフレームワークであるNestJSを始めていきます。

## CLIのインストール

まずはプロジェクトの作成や、コントローラー等の生成を行うことができるCLIを開発マシンにインストールします。
npmまたはyarnでインストールしてください。

```bash:npmの場合
npm i -g @nestjs/cli
```

```bash:yarnの場合
yarn global add @nestjs/cli
```

## プロジェクトの雛形作成
次にインストールしたCLIを使って、プロジェクトの作成・雛形の生成を行います。

```bash
nest new my-app
```

カレントディレクトリに作成することも可能です。

```bash
nest new .
```

コマンド実行後、以下のようにnpm or yarnのどちらを使うか尋ねられるので、好みの方を選択してエンターを押下して先に進めましょう。方向キーまたはj/kキーで選べます。

```bash
? Which package manager would you ❤️  to use?
  npm
❯ yarn
```

このコマンド実行によって、以下のように自動でファイルが生成されます。

```bash
CREATE nest-demo/.eslintrc.js (599 bytes)
CREATE nest-demo/.prettierrc (51 bytes)
CREATE nest-demo/README.md (3370 bytes)
CREATE nest-demo/nest-cli.json (64 bytes)
CREATE nest-demo/package.json (1897 bytes)
CREATE nest-demo/tsconfig.build.json (97 bytes)
CREATE nest-demo/tsconfig.json (336 bytes)
CREATE nest-demo/src/app.controller.spec.ts (617 bytes)
CREATE nest-demo/src/app.controller.ts (274 bytes)
CREATE nest-demo/src/app.module.ts (249 bytes)
CREATE nest-demo/src/app.service.ts (142 bytes)
CREATE nest-demo/src/main.ts (208 bytes)
CREATE nest-demo/test/app.e2e-spec.ts (630 bytes)
CREATE nest-demo/test/jest-e2e.json (183 bytes)
```

## 開発サーバーの起動

現状で既にアプリケーションサーバーとして機能させることが可能ですので、以下コマンドで起動してみましょう。

```bash:npmの場合
npm run start
```

```bash:yarnの場合
yarn run start
```

無事起動されたら、localhost:3000にアクセスしてHello World!を拝むことができます。

あとは雛形に沿って自分の作りたいアプリケーションを組み立てていく形になります。
こちらの記事の参考にもさせてもらった[公式ドキュメント](https://docs.nestjs.com/)が非常に充実しているので、そちらでフレームワークのお作法を学びながら進めていきましょう。
カレントディレクトリ以下のサイズが大きなディレクトリを特定

上位１０件を特定

```
$ du -k ./* | sort -nr | head -10
9128852	./python
1926448	./python/speechapi
1438140	./python/wordcloud-jp
1437872	./python/wordcloud-jp/.fonts
1282212	./python/openpose
1282204	./python/openpose/tf-pose-estimation
1030652	./python/picture
980496	./python/julius
900552	./python/julius/dictation-kit-4.5
879660	./python/julius/dictation-kit-4.5/model
```
中央寄せ

webページで各要素を横の中央にはいちしたい場合には、「margin:0 auto」や『text-align:center;』を使用します。

１．テキストや画像などのインライン要素を中央寄せにしたい場合
ブロック要素化する
display:blockなどで囲む　divやｐも

２・そのブロック要素事態を画面の中央にしたい場合
ＣＳＳファイル内でブロック要素に　margin; 0 auto;を指定する

３.
複数のブロック要素を横並びにし画面の中央寄席にしたい場合
1と同じ方法
dockerイメージファイルの置き場は溢れないか

### イメージファイルの置き場

Dockerのイメージファルの置き場はデフォルトでは/var/lib/docker以下にある．
いくつもイメージを落とし始めるとこの場所があふれるかもしれない．

### 置き場所を変更する

ubuntu 18.04.4LTSの場合．

例えば/opt/dockerに置きたい．
/optには心配しないでよいくらいの領域があるとする．

[ここに方法があった](https://linuxconfig.org/how-to-move-docker-s-default-var-lib-docker-to-another-directory-on-ubuntu-debian-linux)
要するに，
/lib/systemd/system/docker.service 
の一部を変更すればよい．

```
(before)
ExecStart=/usr/bin/docker daemon -H fd://

(after)
ExecStart=/usr/bin/docker daemon -g /opt/docker -H fd://
```

これでサービスを再起動すればよい．
システムの再起動でもよい．

voila (^-^)/
assert_selectの第2引数に注意！（Rails 6.0.0）


##結論　文字列を渡すか数字を渡すかでテスト条件が変化する
###文字列を渡した場合は指定した要素の内容を検証する
```rb:users_profile_test.rb
test "profile display" do
  assert_select 'strong#following', "2"
end
```
```erb:_stats.html.erb
<!--テストがパスするパーシャル-->
<strong id="following" class="stats"> 2 </strong>
```
###数字を渡した場合は指定した要素の個数を検証する
```rb:users_profile_test.rb
test "profile display" do
  assert_select 'strong#following', 2
end
```
```erb:_stats.html.erb
<!--テストがパスするパーシャル-->
<strong id="following" class="stats"> 2 </strong>
<strong id="following" class="stats"> 2 </strong>
```
##参考情報
Railsガイドによると、assert_selectには2つの書式があります。
>assert_select(セレクタ, [条件], [メッセージ])という書式は、セレクタで指定された要素が条件に一致することを主張します。セレクタにはCSSセレクタの式 (文字列) や代入値を持つ式を使えます。

>assert_select(要素, セレクタ, [条件], [メッセージ]) は、選択されたすべての要素が条件に一致することを主張します。選択される要素は、element (Nokogiri::XML::Node or Nokogiri::XML::NodeSetのインスタンス) からその子孫要素までの範囲から選択されます。

推測ですが、第2引数に文字列を渡した場合は
・第1引数＝要素
・第2引数＝メッセージ
と判断され、数字を渡した場合は
・第1引数＝要素
・第2引数＝条件
と判断されると思われます。

上記を踏まえると、以下2つは同じ条件であると考えられます。

```rb
assert_select 'strong#following', 2
```
```rb
assert_select 'strong#following', count: 2
```

数字を渡すと自動的に条件であると判断されてしまうということですね。

要素の内容の数字を検証したい場合は第2引数を
・ダブルクオートまたはシングルクオートで囲って文字列化
・ダブルクオートで囲って式展開する
必要があると考えられます。

これに気づくのに半日かかりました...

##あとがき
現在Ruby on Railsチュートリアルで学習中の初学者・タツロンです。
今回は14章 14.2.2~14.2.3を学習中につまづき、検証して気がついた事について投稿させていただきました。
間違っている点やアドバイス等ございましたらコメント頂けば幸いです。

参考：[Rails テスティングガイド](https://railsguides.jp/testing.html)
[VRChat向け]R.A.M 2019をUnity2018.4で使う場合の注意点

2020/5/7 追記
BugReportしたところ、5/6にFix版をUPしてくださりました～。
現在は修正されていますとのこと。

Unityで「川」の地形を作成したい場合の必須アセット
NatureManufactureさんが提供するツールについてです。
[River Auto Material 2019](https://assetstore.unity.com/packages/tools/terrain/r-a-m-2019-river-auto-material-2019-145937)

新しく2019verが発売されており、現在はこちらを使っています。
対応するUnityのVersionが2018.3以上となっており、VRChatの2018.4は対応でした。

しかし、使おうとすると下記のエラーが発生します。

```
Assets\NatureManufacture Assets\Spline System\Scripts\Editor\RamBackgroundEditor.cs(14,41): error CS0026: Keyword 'this' is not valid in a static property, static method, or static field initializer
```

これは、2019以下を使った場合のみに起きる不具合っぽく

```
Assets\NatureManufacture Assets\Spline System\Scripts\Editor\RamBackgroundEditor.cs
```

上記ファイルにある以下のコードでエラーとなっています。

```
    static RamBackgroundEditor()
    {
#if UNITY_2019_1_OR_NEWER
        SceneView.duringSceneGui += OnSceneGUI;
#else
        SceneView.onSceneGUIDelegate += this.OnSceneGUI;
#endif
    }
```

2019.1以下の場合は、Staticの中で「this.OnSceneGUI」とthisが使われております。

[コンパイラ エラー CS0026](https://docs.microsoft.com/ja-jp/dotnet/csharp/misc/cs0026)の発生です。

```
#else
        SceneView.onSceneGUIDelegate += this.OnSceneGUI;

```

この部分を、下記に変更してあげましょう。
this.をなくすだけですね。


```
#else
        SceneView.onSceneGUIDelegate += OnSceneGUI;
```

2019で使っているときは、Error吐かなかったんですが、
define ディレクティブで分けているからか。

この辺はテスト大変そう。
私的Rust学習メモ1(メモリ管理とか)

# Rust
なんとなくやりたくなったので学習メモ。

# Rustのメモリ管理
CやC++のような手動管理でもなく、最近の言語にメジャーなGCでもなく、所有権ベースのメモリ管理。

## 他の手法との比較
* 手動管理の場合は、人為的ミスでメモリ管理に失敗する
* ガーベージコレクタの場合、実際にメモリが解放可能になってからGCが走るまでのタイムラグがあることによりパフォーマンスに影響が出る場合がある。

[Discordの例](https://www.atmarkit.co.jp/ait/articles/2002/10/news038.html)
個人的な経験としてはJavaでも似たようなメモリ使用量のブレに悩まされたことはある。

## Rustのアプローチ
* Heap上のメモリの所有権を持つ変数を一つに限定し、その変数がスコープを抜けたら解放する
GC方式と異なり、不要になった段階で即座にメモリを解放できる。

### なぜ一つに限定する？
* ヒープに乗っているものに紐づく変数が複数あると解放してよいかの判断が難しくなる(GCが頑張っているところ)
* CやC++のような手動管理は熟練者でもバグを避けられない。
* 紐づいている変数が一つだけならチェックがコンパイラレベルで可能+二重解放によるバグのリスクもない。

## メモリ上の置き場
どこに置かれるかによって、所有権問題を考えなければいけないかが変わる。
* バイナリ
* Stack
* Heap

### バイナリ
stringリテラルで作成した文字列などのimmutableな定数。
コンパイル時に確定するので実行ファイル上に存在し、
実行ファイルのバイナリがメモリ上に読み込まれたときにそこへの参照を持つ。
実行中に解放する必要がないので、所有権問題は起こらない。

### Stackに置かるもの
数値型やboolean及び、Heapに置かれないものの配列やTuple(及びCopy Traitを持つもの。このあたりは追々)。
基本的に、変数定義時点で必要なメモリ上の領域が確定されるもの。
スコープ内にある時はStackに置かれ、値がコピー渡しされる。(変数への代入や引数として渡すとき)
常にコピー渡しなので、所有権について考える必要なし。

### Heapにおかれるもの
上記の二つ以外。
Heapに実体が置かれて、Stackには参照のみが格納されるもの。
一口に文字列といっても、String型は可変長なのでこちら。
メモリ上の使用領域がRuntimeに変わるため、所有権を1変数に限定する必要あり。

## 所有権の変わるタイミング
### 別変数への代入
```rust

let hoge = String::from("hoge");
let fuga = hoge;
```
上記のようにすると、fugaの宣言以降hogeは使えない。(所有権がfugaに移る)

### 引数として渡す
```rust

fn hoge_func(hoge:String){//Rustはスネークケースが原則
 println!("hoge is :{}",hoge);
}

///
let hoge = String.from("hoge");
hoge_func(hoge);
//以降hogeは使えない

```
こちらもhogeFunc内の引数に所有権が渡ってしまうのでhogeFuncの呼び出し以降は使えない。
なお戻り値として返すことで、呼び出し元に所有権を返すことができる

```rust

fn hoge_func(hoge:String) -> String{
 println!("hoge is :{}",hoge);
 hoge //;をつけないとその値を返す式扱いとなる(;をつけると文になり戻り値は{}になる。)。早期returnしない場合最後に参照した式の値を返す
}

///
let hoge = String.from("hoge");
let hoge2 = hoge_func(hoge);
//所有権はhoge -> hoge_func内hoge -> hoge2と移る

```

## 借用
所有権を渡したくない場合は借用(borrow)を使う。
これは、ヒープに対する参照に対する参照を作って渡す形。

``` rust
fn hoge_func(hoge:&String){
    println!("hoge is :{}",hoge);
}

let hoge = String::from("aa");
hoge_func(&hoge);
    
println!("hoge is:{}",hoge);//貸しているだけで所有権を失っていない。
```

### 借用とmutation
借用元がmutなら一つだけmutな借用が可能

``` rust
fn hoge_func(hoge:&mut String){
    hoge.push_str("fuga");
}

let mut hoge = String::from("hoge");
hoge_func(&mut hoge);
    
println!("hoge is:{}",hoge);//hogefuga
```

#### mutの借用は同時に一つしかできない。

``` rust
fn hoge_func(hoge:&mut String){
    hoge.push_str("fuga");
}

let mut hoge = String::from("hoge");
let h = &hoge;
hoge_func(&mut hoge);//既に借用をしているとダメ。
    
println!("hoge is:{}",hoge);//hogefuga
```

``` rust
fn hoge_func(hoge:&mut String){
    hoge.push_str("fuga");
}

let mut hoge = String::from("hoge");
{
 let h = &hoge;
}
hoge_func(&mut hoge);//これは借用しているhのスコープが切れているのでOK
    
println!("hoge is:{}",hoge);
```

``` rust
fn hoge_func(hoge:&mut String){
    hoge.push_str("fuga");
}

let mut hoge = String::from("hoge");
hoge_func(&mut hoge);
hoge_func(&mut hoge);//ここも一つ目の借用のスコープが切れているのでOK
    
println!("hoge is:{}",hoge);//hogefugafuga
```
bootstrapでjqueryが動作しなかった不具合

HTML+CSS+jQueryの時は普通に動いてくれていたページが、bootstrapにしてから動かなくなりました。

ちなみにコードは以下のような感じで、エラーメッセージは"Uncaught TypeError: $(...).slideToggle is not a function"というようなもの。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width" initial-scale=1.0>
	<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
	<title>test</title>
</head>
<body>
	<div class="container-fluid">
		<i class="fas fa-angle-double-down"></i>
                <span>text text text</span>
	</div>
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
  </body>
<script>
	$(function(){
		$('span').hide();
		$('i').click(function(){
			$('span').slideToggle();
		});
	});
</script>
</html>
```

多少省略しましたが、bootstrapを使った上でアコーディオンメニューがやりたかったんですね。

エラーメッセージで検索してみると、jQueryのCDNが二つあるとか、順番がおかしいのではないかという内容が出てきました。

私はbootstrapのCDNをそのまま載せているだけで、bootstrapのCDN以外のjQueryのCDNは載せていませんし、順番もちゃんとjQueryのCDNが一番上に来るようにしています。

#結論：bootstrapのCDNのjQueryの部分を変えた

```
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
```
だったところを、私が普段html+css+jQueryの時に使っているjQueryのCDN

```
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
```
に変えました。これで私の場合は動くようになりました。

ちょっと試してみたら上手く行ったというだけなのでどこかの観点から見ると間違っていそうで怖いんですが、その際にはこっそり教えてください。
Virtualbox+Vagrant+Centos8.1で失敗。CentOS8.0→8.1でごまかした記録

#環境
##Host
- OS: Windows 10 Pro
- CPU: Intel i7-7700HQ
- Memory: 16GB

##Software Version
- Virtualbox: 3.6
- Vagrant: 2.2.7

#やったこと
##Vagrantfileへの追記内容
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.synced_folder "my/path/projects", "/projects", type:"virtualbox"

##その１
いつもお世話になってる、chefさんのbentoでCentOS8.1を入れようとするも失敗するｗｗｗ
`Error: Unknown repo: 'C*-base'`
が出てしまう。

##その２
色々調べて、ってか"Error: Unknown repo: 'C*-base'"でググるとすぐに [CentOS 8 - installing Guest additions fails #367](https://github.com/dotless-de/vagrant-vbguest/issues/367) が出てきた。

でも、ごちゃごちゃやってるのが面倒。でもコピペは好きじゃないのでもう一回調べる。
そして、[VagrantでCentOS8を起動すると「Error: Unknown repo: 'C*-base'」のエラーが出る](https://qiita.com/You_name_is_YU/items/a7e2ca82ba48faee8e97) に出会い参考にさせて頂く。

でも、やっぱり
`Error: Unknown repo: 'C*-base'`
が出る。涙

##その３
やっぱり楽したいので、他のboxを試すことにする。けど、どれがいいのか。→みんなが使ってる奴。
Download数が一番多い（2020/05/02 時点）、[generic/centos8](https://app.vagrantup.com/generic/boxes/centos8) を試す。

エラー出なかった。でも8.0だった。だまされたｗｗｗ

> A generic CentOS 8.1 image, ready for use as an appliance or development environment.
> docker hyperv libvirt parallels and 2 more providers

8.1って言ってるくせにｗｗｗ

なので、そのまま sshで入って

```
sudo dnf update
```

しました。

#結論
centos 純正が使えないってのは参った。今後の更新できっと使えるんだろうけど、現時点(2020/05/02)では使えませんでした。
もし誰か解決方法がわかつなら教えていただきたいです。

今回の目的はCentOS8系への入門なので、8.1にこだわることはないのですが、使うとなれば8.1以降になると思うので、8.1に更新しました。
でも、PHPとかMySQLとかのバージョンもごにょごにょやる必要があるかも知れませんね。。。
とりあえず一旦ミドルウェアのインストール作業に入ろうと思います。

※誰の役にも立ちそうにない記事でごめんなさい。
（備忘録）AWS EC2でLinuxサーバー構築

# 1. はじめに
2020年5月3日に[ヤマムギ](https://yamamugi.connpass.com/)様主催にて開催された[ヤマムギ vol.8 (AWS)EC2でLinuxサーバー構築ハンズオン](https://yamamugi.connpass.com/event/174794/)について、自分への備忘録としてまとめてみました。ご参考になれば幸いです。

# 2. 学んだ内容

- やること構成図の確認
- IAMロールの作成
- EC2インスタンスの起動
- EC2へセッションマネージャで接続
- メタデータの確認
- EC2インスタンスの終了


# 3. 学習サイト

- [ヤマムギ vol.8 (AWS)EC2でLinuxサーバー構築](https://www.yamamanx.com/yamamugi-8-handson/)

# 4. 学習メモ

```plaintext:学習メモ
ロールの作成、一般的なユースケース：
EC2

ポリシー：
AmazonSSMManagedInstanceCore

ロール名（任意）：
EC2Role

Amazonマシンイメージ（AMI）：
Amazon Linux 2 AMI (HVM), SSD Volume Type
64ビット(x86)

インスタンスタイプ：
t2.micro（無料利用枠の対象）

IAMロール：
EC2Role

タグ（任意、最大50個まで設定可能）：
キー：Name
値：LinuxTestServer

セキュリティグループの割り当て：
既存のセキュリティグループを選択する
default

キーペア：
キーペアなしで続行
（今回はssh接続しないので使わないため）

接続方法：
セッションマネージャー
```

```plaintext:コマンドプロンプト
// Linuxコマンド操作
$ whoami
$ cd
$ pwd

// メタデータの確認
$ curl http://169.254.169.254/latest/meta-data

$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/IAMRoleName
```

# 5. ハンズオンで得た豆知識

- Default VPCは、検証目的のみで使うこと。（本番環境で使うと、インターネットにさらされることとなる。）
- システムマネージャー越しに、簡単に便利にセキュアにアクセスする。
- Amazon Linux 2は、RedHat系のLinux。
- インスタンスタイプを選ぶことで、サーバの性能を決める。
- EC2に（アベイラビリティゾーンにある）EBSボリュームをアタッチして使う。
- 極力、余分な性的情報を持たないで済むように考える。（システムズマネージャーを用いるとよい）
- 終了したインスタンスは最終的に削除となるが、一時的にterminated状態となりしばらく残る。

# 6. 参考サイト

- [AWS 無料利用枠に関するよくある質問](https://aws.amazon.com/jp/free/free-tier-faqs/)
- [YouTube：アンチパターンから気づくWell-Architectedセミナー](https://www.youtube.com/watch?v=_Hrt6mUYaGQ&feature=youtu.be)
- [GW Stay home 応援！無料オンラインセミナー毎日開催](https://blog.trainocate.co.jp/blog/stayhome_015)
- [OnlineMa-jon](https://live.remo.co/e/onlinema-jon/register)
- [アルバイトが休みになっちゃった学生さんへ](https://www.yamamanx.com/to-student/)

# 7. EC2利用にかかった費用（無料枠1年を超えている場合）
- 利用時間：15分程度

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/4269cd1c-4464-d44d-5f04-4099ec877ed6.png)

# 8. おわりに
AWS学習の参考になれば幸いです。
ハンズオン開催してくださいました[ヤマムギ](https://yamamugi.connpass.com/)様、感謝いたします。

2020/05/03 NISHIZONO Takahiro
研究室で入退室記録システム Jibbleを使う予定だった話



研究室の研究活動をもっと活発にしたい．→
そのためには学生の個性や研究スタイルを尊重しつつも，総体としてはもっと研究室に滞在してほしい．→
**滞在時間を増やす**ため，これから研究室運営の改善を行っていきたい．その取り組みの効果を**定量的に検証**したい．→
よって**学生の平均滞在時間がどれくらいなのか，測っておきたい**．

という論理の元で，出欠管理ができるシステムを導入しようと思い，適当と思われるシステムを探したところ，Jibbleというサービスがあることを知り，研究室に導入してることを決意しました。

4月からの本格的運用開始を予定し、2〜3月中に準備や自分と院生で試行をしていましたが、新型コロナウィルスの影響で大学研究室も閉鎖されオンラインでの指導になっため，現在のところそれほど本格的には運用されていない状況です。


# 研究室概要
- 地方私大．
- 情報系．　実験計測を多用する研究室ではないのでハードウェアはほぼ計算機のみ
- 各教員は独立した研究室を持つ．
- 毎年8〜11名の4年生（卒研生）が研究室に配属される．
- 修士課程以上の進学率は高くない．

実験系ではないこともあり，今までは研究時間の管理にはかなりルーズなほうだったと思います．

# what I do NOT want to do

- 成績評価の参考にはしない （スタイルがあるので，家でやってきたというならそれでもいい）
- 個々人を管理する（マイクロマネジメント）道具としては利用しない 


# 要件
- 最大20名程度までの入退室時間を記録できる．
- slackと連動できる：既に研究室ではslackを導入しており，それなりに使いなせているので．
- 無料版がある: 研究費での月額契約は手間だし，試行錯誤段階では予算をあまり使いたくはないので．
- 操作が簡素で負担にならない: 結局使ってくれて定着しないと意味ないので．
- 学生が自身の活動の振り返りに使える：週ごとのレポートとかみれるようになってると便利．

# Jibble
[Jibble](https://www.jibble.io/)というサービスをみつけ，無料でもそこそこの機能は備えていそうなので，使ってみることにしました．

# 主な機能
- ios/androidアプリやウェブ，slack，下記のキオスクなどからin(入室)/out(退室)の記録ができる．
- ウェブやslackなどから今誰が部屋にいるか等が確認できる．
- in/out の時間は後から書き換え可能（書き換えできなくする設定も可）．
- [日/週/月次の統計レポート](https://www.jibble.io/timesheets-and-reports)をウェブで見ることができる
 
# [Slack との連携](https://www.jibble.io/time-tracking-for-slack)
- Jibbleのbot に話しかけることでin/outの記録や時間，誰が部屋にいるかなどを知ることができる
- 誰かの入退室があるごとに，slackのチャンネルにbotから通知を流すことが可能．

# Kioskモード
AndroidかIOS端末に [JibbleのApp](https://www.jibble.io/attendance-timetracking-for-tablets)をダウンロードし，Kioskモードにしておくと，端末から２タッチで簡単に入室，退室の操作が行えます．入室時に顔写真を撮って記録したり，その写真をSlackに流すこともできますが，使ってません．

安いAndroidタブレット端末を部屋の入り口に置いて使っています．

# 無料版でできないこと
- 記録は自由に書き換えれるように設定しているし，そもそもどこにいてもin/outできるので，記録の信頼性は保証できない
- Kioskでの顔認証や生体認証は，無料版ではできない．
- 日/週/月次レポートはウェブで見ることができるが，無料版ではデータをダウンロードできない．
- ログは２ヶ月しか保存されない．

成績評価と連動しない，性善説的な研究室で，学生全体平均のおおまかな滞在時間を知ることが主な目的として使っているで，これでとくに問題はないと思います．

データのダウンロードはできれば便利なんですが，無料版なのでしょうがない．これは月ごとデータをスプレッドシートに書き写すなどして対応します．

# 現状

現在のところ、在宅の学生をオンラインで指導している状態で、在宅で研究活動している時間にinの記録をしろとは言ってますがそれほど徹底させてはないので、使う人は使ってる状態です。

自分で使って気づいたことは以下です：たまにoutを忘れるが自動的にoutする機能が便利、対応可能な時間帯を知らせるのには便利、無料版でログを残すのが少し手間、など。

研究室閉鎖が終わったらまた更新するかもしれません。
CでL2のペイロードを覗き見

#概要
EtherフレームはOSI参照モデルのレイヤー2に位置します。
直接通信する機器間でデータをやり取りする為の情報が入ったフレームです。
この記事ではC言語によるEtherフレームの解析を行い、Etherフレームについて理解を深めてみます。

#環境構築
CentOSを想定しています。
フレームの取得にはlibpcapというCライブラリを利用します。

```bash
yum -y update
yum install -y gcc vim wget tar flex byacc
wget http://www.tcpdump.org/release/libpcap-1.6.2.tar.gz
tar zxvf libpcap-1.6.2.tar.gz
cd libpcap-1.6.2
./configure
make -j 8
make install
```

#Etherフレームについて
##フレームフォーマット
Etherフレームの内容(IEEE802.3形式)は以下となっています。

| 概要 | サイズ | 説明 |
|:-----------|------------:|:------------|
| プリアンブル | 7byte | タイミングを取るための固定ビット列 |
| SFD         | 1byte | タイミング用。<br>次のビットからデータが開始されるよ的な。 |
| 宛先MAC     | 6byte | 通信先の機器を識別する為の番号 |
| 送信元MAC   | 6byte | 通信元の機器を識別する為の番号 |
| Etherタイプ | 2byte | 上位のプロトコルを表す値。<br>但し1500以下だったらデータサイズを表す |
| データ      |  可変 | カプセル化した中身のデータ |
| FCS      |  2byte | 受け取り側でエラーが発生してないかをチェックする用 |

###Etherタイプ(一部)
defineはnet/ethernet.hに定義されています。
以下はその値と説明についてです。

| 値            | define         |説明               |  
|:--------------|:---------------|:-----------------|
| 0x0000-0x05DC | -              | フレームの長さ     |
| 0x0800        | ETHERTYPE_IP   |IPパケット         |
| 0x0806        | ETHERTYPE_ARP  |ARPパケット        |
| 0x8100        | ETHERTYPE_VLAN |dot1Q VLANフレーム |
| 0x86DD        | ETHERTYPE_IPV6 |IPv6パケット       |

###Etherフレーム構造体
CでEtherフレームを扱う場合、net/ethernet.hに構造体が定義されています。

```c:net/ethernet.h
struct ether_header
{
  u_int8_t  ether_dhost[ETH_ALEN];      /* destination eth addr */
  u_int8_t  ether_shost[ETH_ALEN];      /* source ether addr    */
  u_int16_t ether_type;                 /* packet type ID field */
} __attribute__ ((__packed__));
```

#EtherフレームのDump
フレームの受信処理は[コチラ](http://qiita.com/Ki4mTaria/items/dabee07097acbab469d9)を参照してください。
以下ではフレームを受信した後、コールバック関数内でEtherヘッダ内容をDump表示しています。

```c:ether_hdr.c
#include <netinet/if_ether.h>
#include <arpa/inet.h>
#include <string.h>
char * convmac_tostr(u_char *,char *,size_t);

void start_pktfunc( u_char *user,                 // pcap_loop関数の第4引数
                    const struct pcap_pkthdr *h , // 受信したPacketの補足情報
                    const u_char *p               // 受信したpacketへのポインタ
                  ){
  char dmac[18] = {0};
  char smac[18] = {0};
  struct ether_header *eth_hdr = (struct ether_header *)p;
  
  printf("ether header---------\n");
  printf("dest mac %s\n",convmac_tostr(eth_hdr->ether_dhost,dmac,sizeof(dmac)));
  printf("src mac %s\n",convmac_tostr(eth_hdr->ether_shost,smac,sizeof(smac)));
  printf("ether type %x\n\n",ntohs(eth_hdr->ether_type));
}
char * convmac_tostr(u_char *hwaddr,char *mac,size_t size){
  snprintf(mac,size,"%02x:%02x:%02x:%02x:%02x:%02x",
                     hwaddr[0],hwaddr[1],hwaddr[2],
                     hwaddr[3],hwaddr[4],hwaddr[5]);
  return mac;
}
```
Vue の props default とかで使うあの コロンとカッコと矢印はfactory関数というらしい 'default': () => ({ count: 0 })  

[[Vue.js] なぜpropsのdefault値にObjectやArrayを指定する際にfactory関数にする必要があるのか - Qiita](https://qiita.com/hogesuke_1/items/c74463de1a1eee802ca8)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3117











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ローカルのdockerImageが多くなりすぎてヤバいので一括削除する

MacのDockerは何やらその中で利用できる容量が決まっているらしく（PCのディスクとは別）
結構頻繁にいっぱいになる。
image作ってる途中にこんなエラーが出て悲しい。

```console
Error processing tar file(exit status 1): 
write /home/vmagent/app/dist/static/js/app.f321c198c91fde51a686.js: no space left on device
```

お掃除。多分こういうことになる人は、あるプロジェクトで頻繁にイメージを作ってる人だと思うので
イメージ名が代替固まってるんじゃないかなーと予想。
そんな人に送るこんなコマンドで一括やっつけちゃいましょう。

```bash
 docker rmi `docker images | grep XXXXX | awk -F' ' '{print $3}'`
```
AI(機械学習)Randam Forestで株価を予想するWinodwsアプリケーションの開発

### 概要
前回[Pythonのscikit-learn Ramdam Forestを使った株価予想](https://qiita.com/koutarou-yamada/items/1e7d895c6529a5b998c8)を行った。同じ手法で株価予想を行うアプリケーションを、いつも使いのC++Builderで開発して、より手軽に株価予想を行えるようにした。Pythonに比べて高速に株価計算が行えるようになった。開発したアプリケーションは、下記に置いているので、お試しください。
[G-Chart ver1.00](http://sin3rou.g1.xrea.com/lib/gchart_v100.zip)
![screen-image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606353/4c20bd66-bc14-345d-20d7-5cee4fdefaf8.jpeg)

### 使い方
1. WindowsのPCのみで動作します。[ダウンロード](http://sin3rou.g1.xrea.com/lib/gchart_v100.zip)したgchart_v100.zipを適当なフォルダに展開。
2. gchart.exeを起動　
3. データ更新でデータ更新を実行
4. 株価予想で株価を予想する銘柄を選択し計算実行
5. 結果出力に選択した銘柄の明日の株価の動きが表示される。計算結果の詳しい解説は後章もしくは、ソフト添付のmanual.pdfに記載する。

### C++Builder
[C++Builder](https://www.embarcadero.com/jp/products/cbuilder)は、Bolandの時代から使っている。最近のC++BuilderはWindowsだけでなくMac,Android,iOSにも対応したクロスコンパイル機能までついている。今回は、最新のC++Builder10.3 Community Editionを使った。Community Editionは個人で趣味の範囲で利用する分には無償で利用できる。

### 株価予想のアルゴリズム
株価予想のアルゴリズムは、「[AIを使った株価予想をPythonのscikit-learnライブラリRandam Forestで試してみた](https://qiita.com/koutarou-yamada/items/1e7d895c6529a5b998c8)」で考察したのと同じ手法である。即ち、ターゲットの銘柄と１日遅れで動きが連動している銘柄を抽出し、それらの予想結果から多数決によって、ターゲットの銘柄の株価の動きを予想する。
1. 前日からの株価の動きを1:値下(3%以上) 2:値下(3%未満) 3:値上(3%未満) 4:値上(3%以上)で定義する
2. 全銘柄に対して、ターゲット銘柄の株価と前日の株価の動きを、最近20日分と100日分で集計した決定木を作成する。これを過去100日間分行って、株価の動きに対する的中率を求める。
3. 20日分,100日分それぞれの的中率の高い方から20銘柄をRandam Forestの投票権を持つ銘柄として選定する。これらの銘柄は、ターゲット銘柄から1日遅れで動きの連動率が高い銘柄となる。
4. 間近の株価の値を投入して選定した20銘柄それぞれの決定木でターゲット銘柄の株価を予想し、その多数決によって、ターゲット銘柄の予想値とする。

### 予想結果画面
予想結果の画面について解説する。
**[銘柄]**:
株価予想の計算を行ったターゲットの銘柄。括弧内は計算した最終の株価データのに日付。予想はこの次の日の株価予想値となる。
**[最近20日分で予想]**
最近20日分の株価の動きで決定木を作成した場合の予想値。
1: 値下(3%以上)　　2:値下(3%以内)　 3:値上(3%以内)　　4:値上(3%以上) 
括弧内の的中率は、過去(100日間)での同じ関連銘柄で予想した場合のそれぞれ20日、100日の決定木を使った場合の的中率。 
表の銘柄は、個別の銘柄で決定木を作成した場合に、それぞれ過去20日、100日での決定木を使った場合の目標銘柄の予想値と過去(100日間)同じ方法で計算した場合の的中率を示す。20日決定木の的中率の高い20銘柄を選択して、多数決をとって目的銘柄の予想を出している。 
**[最近100日分での予想]**
最近100日分の株価の動きで決定木を作成した場合の予想値
**[グラフ]**
グラフは、過去250日分の目的銘柄と表の選択された株価の動きを示す。横軸は、右側が新しい。目盛りは10日毎となっている。縦軸は、250日前の株価の値を基準とした株価の変動率を示している。上がプラス(上昇)で下がマイナス(下落)を示す。目盛りは1％毎になっている。緑が目的の銘柄で、青が表の選択された銘柄となる。

### 出力結果例の考察
上の予想結果の画面イメージ例では、6508 明電舎の2020/05/01の次の日の株価の動き予想している。最近20日分の株価の動きを基にした予想では、3:値上(3%未満)となっている。同じ20日分の条件で過去の予想を行った場合の的中率は65.3%となっている。決して低くはない。この時、予想の多数決の投票権を持つのは1326 SPDRゴールド以下表に示す20銘柄となっている。これらはターゲットの明電舎との関連性は深そうではないが1日遅れの株価の動きに連動性があるとの結果になっている。個別の的中率も67.3~65.3%と高い的中率の銘柄から構成されている。同じく過去100日分を基にした予想では、2:値下(3%未満)の予想となり予想が異なってきた。100日分での過去の的中率は61.2%となっている。ターゲット銘柄とRandamForestの候補となる株価の動きをグラフで確認してみると動きに連動性がある事も確認できる。

### まとめ
AIの機械学習Randam Forestを使った株価予想のアプリケーションを開発した。銘柄、日によって変化するが概ね60%以上の的中率を出せているのではないかと思う。Pythonのように機械学習のライブラリがC++言語では充実していないので手作りの部分があったが、その分、データの読込み、株価予想のアルゴリズムに最適化でき計算時間が大幅に短縮できた。(Python:8時間→C++:5分)これは、コンパイル言語であった為かもしれない。課題としては、今回、20日,100日,20銘柄と固定値としていた個所が適切であったかは不明で、より最適化すれば的中率を更に向上でいるかもしれない。　

###最後に
最後まで読んで頂いてありがとうございます。本稿で述べた株価予想ソフトG-Chartを強化した有償版を利用した株式投資法について、下記で紹介しています。
[G-Chartを用いた株式投資法の紹介](http://sin3rou.g1.xrea.com/gchart.html)
rbenv で install ができなかった時の対処法

## 概要
rbenv で新しく別バージョンの Ruby をインストールしたかったが、`install` コマンドを叩いた際に以下のようなエラーが発生。

```
$ rbenv install 2.7.0
Downloading openssl-1.1.1d.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/1e3a91bc1f9dfce01af26026f856e064eab4c8ee0a8f457b5ae30b40b8b711f2
Installing openssl-1.1.1d...

BUILD FAILED (OS X 10.15.4 using ruby-build 20200401)

Inspect or clean up the working tree at /var/folders/w_/0xyscdr105gdxd26fpl679f40000gn/T/ruby-build.20200503102702.1876.6wZCKR
Results logged to /var/folders/w_/0xyscdr105gdxd26fpl679f40000gn/T/ruby-build.20200503102702.1876.log

Last 10 log lines:
In file included from apps/app_rand.c:10:
In file included from apps/apps.h:13:
In file included from ./e_os.h:16:
In file included from include/openssl/e_os2.h:243:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.3/include/inttypes.h:16:15: fatal error: 'inttypes.h' file not found
#include_next <inttypes.h>
              ^~~~~~~~~~~~
1 error generated.
make[1]: *** [apps/app_rand.o] Error 1
make: *** [all] Error 2
```

## 解決法
以下を `.bashrc` や `.zshrc` に書き、 export する。

```sh
export SDKROOT="$(xcrun --sdk macosx --show-sdk-path)"
```

## 試したもの
- [rbenv による Ruby のインストール失敗と解決
](http://blog.nocorica.jp/2017/01/rbenv-failed/)
  - CommandLineTools の再インストール

## 参考
[macOS 10.15 Catalinaで、"fatal error: 'stdio.h' file not found"が出てしまう！](https://qiita.com/Rascal/items/b92d94631adfbd19522a)

## おまけ
そもそも、なぜ新しく Ruby をインストールしようとしたかというと、`bundle install` がうまくいかず、試しに新しいバージョンの Ruby をインストールしたら治るかと思い、試すと起こりました。
尚、上記 `bundle install` 時にうまくいかないのも上記解決法でおそらく解決できたかと思います。
エラーメッセージまではちょっと取っていなかったのですが、`ffi` という gem をインストールしようとした際に
以下のようなメッセージと共に表示されていました。

```sh
ERROR: Failed to build gem native extension.
```
【Unity】java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

問題自体は、以下の記事で紹介されてるものと同じです。

[java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation](https://qiita.com/oxsoft/items/042aaa6e9c7ae828e967)

この記事では解決策の1つを紹介します。

### 解決策
1.`PlayerSettings>Resolution Scaling`で、`Orientation`、`Allowed Orientations for AutoRotation`の設定を以下のようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237014/dacd235e-31cb-2a65-1ffc-464d75feff22.png)


２.`[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]`を使い、Sceneが読み込まれる前に画面を縦に固定させます。

以下のScriptをプロジェクトに追加するだけで済みます。


```C#:RotationController.cs
using UnityEngine;

public static class RotationController
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    public static void Initialize()
    {
        // 縦画面に固定する場合の設定です
        Screen.autorotateToPortrait = true; // 縦
        Screen.autorotateToLandscapeLeft = false; // 左
        Screen.autorotateToLandscapeRight = false; // 右
        Screen.autorotateToPortraitUpsideDown = false; // 上下逆        
        Screen.orientation = ScreenOrientation.Portrait;
    }
}
```

`[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]`については、参考資料も紹介しておきます。
http://tsubakit1.hateblo.jp/entry/2016/07/29/073000


デバイスを横にしたまま起動すると、起動直後はUnityのロゴが横になって表示され、起動直後も一瞬横画面で表示されるかもしれませんが、その後すぐに縦画面に固定されプレイ体験としてはほぼほぼ問題ないものになります。
（自論）コンピューターにおけるエンジンといふモノ

プログラミングに関して、なるべく一般人が馴染みやすい話を
書いていこうと思う。

前には、下記のプログラムの書き出しの話を書いた。
https://qiita.com/motochan1969/items/efec9bfa5a8fca27a32b

今日はちょっと趣旨が違うのであるが、
プログラミングというのは、はっきり言えば、キリの無い世界だという事を
まず、最初に書いておきたい。

なぜ、こんな話を書くかと言えば、自分が最初に触った
パーソナルコンピュータ、ＰＣ８００１の話である。

コロナ休暇の中、何気にネットで調べていたら、こんな記事に出会った。
https://twitter.com/PasocomMini

なんと40年ぶりに、ＮＥＣのパソコンの復刻版が出たと言うではないか！

もうかなり懐かしくなり、その後、自分の作ったBASICマガジンの
記事を探し回り、下記のブログに上げて頂いた方に
直接コンタクトして、懐かしい自分の投稿の記事のPDFを
頂くことが出来た。
http://relaxwind.info/88mag/be-maga/pc-8001/hagetaka/hagetaka.html

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/06ae7a4a-102d-9cb0-bc0e-967ca92f99af.png)
![p4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/b4be47c1-dfef-4034-7762-497f7d12904f.png)
![p5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/c036e15a-1513-ade0-00ef-76cdd1bca0b3.png)
![p6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/285ded60-8845-13d7-8560-15154f819d72.png)

脱線しまくるが、後半のZ-80のマシン語は、
当時、ネットなどの情報もなく、ひたすら芸夢狂人さんの、
ギャラクシアンのコードを、逆アセンブラでノートに書いて
勉強したものだ・・・

それと2パスアセンブラというのは、ＲＯＭで提供されていた奴だ。

ラベル付き逆アセンブラなんていうのも懐かしい。
昔はロール紙に長々と、プリンターで印字したものだ。
（すべては、ノスタルジックな自分の思い出に浸っている）

さて、このゲームを作った35年以上も前であるが、
はっきり言って、ゲームの面白さや、プログラム作成の
エッセンスなんていうものは、時代を経ても
全く変わっていない。

自分の未開のことを、自分で調べて、やり遂げる
それだけの知的好奇心の遊びだ。

あのころは、16進数のコードを見ても、
何の暗号かも分からず、ただただニーモニック表を眺めながら
解読をしていたのだ。

しかし、考えてみたら、この16進数のアセンブラの羅列なんて、
いまのエンジニアが、いったいどこまで理解できるのであろうか？

かなり話題が脱線したのであるが、
要するにプログラム作りなどと言うものは、
結局は、その時代にある、できる物をもがき集めて
ただ、ただ、シコシコと頑張るものなのである。

最近になって、NODE.JSを触り始めたのであるが、
プログラムというものは、コンピュータと言うマシンの
パフォーマンスをどこまで引き出せるのか？
やはり、それに尽きるのである。

このレースゲームもそうだが、結局は当時のBASICでは
反射神経が要求されるような、エキサイトなゲームを
作ることが限界だったので、メインルーチンは機械語で書いている。

高速に画面がスクロールしたり、乱数で左右に揺れたり、
それが動いた時の興奮はいまでも、忘れることができない。


コンピュータの性能が上がり、
最近はスクリプトでも結構早く動く時代になったが、
いまなお、それを担うソフトウェアの部分が大きい。

NODE.JSもまさに、このようなエンジンを積んでいるのだ。
https://ja.wikipedia.org/wiki/V8_(JavaScript%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3)


そんな訳で、自分の過去に作ったレースゲームと、
コンピュータのエンジンというものに触れてみた。

プログラムの前に、マシンの性能や、積んでいるエンジンなど
そういうところを意識しなくてはいけない。

それにしても、最近は時代の進歩がすさまじいと感じる。

だって12万以上もしたパーソナルコンピュータが
手のひらサイズで、生まれ変わる時代である。
https://www.pcmini.jp/product_pc-8001/


そんな訳で、この連休は懐かしい自分のパソコン少年時代を
振り返り、もう一度、原点に立って、自分が進むべき道を
見つめなおしてみたいと思う。
(ISC)² のメンバーダッシュボードをCPE取得/登録の確認で使う

# どうしてこれを書いたのか
無料WebinarのCPEがいつ登録されたのかを確認するときに「あ、そういやこれまとめてないや」と思って書いた。

#手順

##1. (ISC)²のメンバーダッシュボードにアクセスする
[メンバーダッシュボード](https://www.isc2.org/Dashboard)

こんな感じで画面が見れる。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267016/3688c8cf-11e1-9dff-0af0-4e89ad77a4c7.png)
|:-:|

この画面から**一見**してわかることは次の通り。

* (CPE Statusより）3-Year Cycleにおいて残り58CPEを取得する必要がある
* (Current 3-Year Cycleより）Apr 2019 - Mar 2020のCPEはすでに取得済み
* (Current 3-Year Cycleより）Apr 2020 - Mar 2021のCPEは半分ぐらい取った

CPEの細かい情報は「VIEW DETAILS」をクリックすると見れる。

##2. 「VIEW DETAILS」ページにアクセスする
CPE取得/登録の確認で使うのは以下の部分のみ。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267016/4bd41b4a-025c-a64d-8467-2eed33b4698f.png)
|:-:|

こっちを見ると、さっき一見してわからなかった

* 3-Year Cycleにおいて62CPEを取得完了している

ってことがわかる。~~なんで表現統一しないのだろうね。~~
さらに細かい情報を見るためには、この図の**青囲み部分**をクリックする。

##3. どの動画のCPEが取れてるんだっけか
この画像は参考。最近登録されたCPEを確認する方法は以下のいずれか。

* 「Start」列で降順ソートかける
* ページを送って最近登録されたCPEを確認する

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267016/82fb1402-5f83-3862-57a8-9e54f2412165.png)
|:-:|
[pip3] ImportErrorが発生する

# `pip3` コマンドを実行するとエラーが発生する問題発生
ImportError: cannot import name 'pkg_resources' from 'pip._vendor' 

## 原因
`pkg_resources`が`pip._vendor`パッケージにないとのこと

実際にpackageが存在しているかをCLIで確認したところ存在していることがわかった。
そして、ファイルの場所を確認したところpipで管理しているディレクトリに存在していないことが判明。

- ファイルの存在確認

```python
Python 3.7.7 (default, Mar 10 2020, 15:43:33) 
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pkg_resources
>>> pkg_resources.__file__
'/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py'
>>> 
```

- pip起動時に必要なpackageのディレクトリ
`/Users/username/Library/Python/3.7/lib/python/site-packages/pip/_vendor/`

## 解決策

- パッケージファイルをpip管理下のディレクトリにコピー
- パッケージファイルのシンボリックリンクをpip管理下のディレクトリに作成

今回はシンボリックリンクを作成する案で対応。
`ln -s /usr/local/lib/python3.7/site-packages/pkg_resources /Users/username/Library/Python/3.7/lib/python/site-packages/pip/_vendor/pkg_resources`

```bash
% pip3

Usage:   
  pip3 <command> [options]
.
.
.
```

めでたく実行できるようになりました。

## 参考(実際のエラーログ)

```
Traceback (most recent call last):
  File "/Library/Developer/CommandLineTools/usr/bin/pip3", line 10, in <module>
    sys.exit(main())
  File "/Users/username/Library/Python/3.7/lib/python/site-packages/pip/_internal/__init__.py", line 16, in main
    from pip._internal.utils.entrypoints import _wrapper
  File "/Users/username/Library/Python/3.7/lib/python/site-packages/pip/_internal/utils/entrypoints.py", line 3, in <module>
    from pip._internal.cli.main import main
  File "/Users/username/Library/Python/3.7/lib/python/site-packages/pip/_internal/cli/main.py", line 10, in <module>
    from pip._internal.cli.autocompletion import autocomplete
  File "/Users/username/Library/Python/3.7/lib/python/site-packages/pip/_internal/cli/autocompletion.py", line 9, in <module>
    from pip._internal.cli.main_parser import create_main_parser
  File "/Users/username/Library/Python/3.7/lib/python/site-packages/pip/_internal/cli/main_parser.py", line 7, in <module>
    from pip._internal.cli import cmdoptions
  File "/Users/username/Library/Python/3.7/lib/python/site-packages/pip/_internal/cli/cmdoptions.py", line 28, in <module>
    from pip._internal.models.target_python import TargetPython
  File "/Users/username/Library/Python/3.7/lib/python/site-packages/pip/_internal/models/target_python.py", line 4, in <module>
    from pip._internal.utils.misc import normalize_version_info
  File "/Users/username/Library/Python/3.7/lib/python/site-packages/pip/_internal/utils/misc.py", line 20, in <module>
    from pip._vendor import pkg_resources
ImportError: cannot import name 'pkg_resources' from 'pip._vendor' 
```
インライン要素ブロック要素

ブロック要素は自動的に改行されるので
横並びにするにはfloatを使用する必要がある。
インライン要素は、自動的に改行されるので横並びとなる

インライン要素を改行させたい場合は
div p display:block ul li を使用。

displayプロパティとは
ある要素をブロック要素に変更したり
インライン要素に変更したりするもの

display:block;
テキスト画像などのインライン要素を　ブロック要素として表示したい場合に使用

display:inline;
div p ul & li　などのブロック要素をインライン要素で表示したい場合に使用。

display:inline-block;
インライン要素のように横並びができて、ブロック要素のようにmarginやpaddingなどで上下左右の間隔を自由に指定できる div p ui li などのブロック要素をインライン要素で表示したい場合に使用。
機械学習の際にGPUを認識しないときの解決策

機械学習の際に重い処理（RNN後そのままConfusionMatrix）をするとChromeが落ちる。そんなに重いか？ってのはさておきGPUがちゃんと機能している確認する。

```
from tensorflow.python.client import device_lib
device_lib.list_local_devices()

2020-05-03 08:31:40.027079: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
↑↑↑
上記エラーは無視してもいいらいしい。
https://teratail.com/questions/193036

2020-05-03 08:31:40.090341: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2799925000 Hz
2020-05-03 08:31:40.090757: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x55ebdc78e290 executing computations on platform Host. Devices:
2020-05-03 08:31:40.090787: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (0): <undefined>, <undefined>
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 1732731571361142608
, name: "/device:XLA_CPU:0"
device_type: "XLA_CPU"
memory_limit: 17179869184
locality {
}
incarnation: 2910256701880528088
physical_device_desc: "device: XLA_CPU device"
]
```
いろいろでてきたが、GPUの文字はない。。
そこでCUDA,cuDNNなどバージョン確認
`cudnn.h`をテキストでオープン
define CUDNN_MAJOR 7
define CUDNN_MINOR 6
define CUDNN_PATCHLEVEL 5
どうやら7.6->7.4が適切。

下記の手順に従い書き換え（cuDNNのサイトより）
Navigate to your <cudnnpath> directory containing the cuDNN Tar file.
Unzip the cuDNN package.
$ tar -xzvf cudnn-x.x-linux-x64-v8.x.x.x.tgz
Copy the following files into the CUDA Toolkit directory, and change the file permissions.
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/include/cudnn_version.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

うーん・変わらない。
同じような症状でお悩みの方。発見。（10.1，10.0が混じってる可能性）
https://blog.logicky.com/2019/03/09/095753
参考に

その後
もしかすると、このコマンドだけでtensorflow-gpu や cudatoolkit、cudannなど GPU を使うために必要なを全てが入っちゃうみたいな記事を後々見つけた。
https://codelabo.com/posts/20200229081221


`conda install -c anaconda keras-gpu`
いちおうやっておく。

ひとまずGPUが動かない問題は保留。
学習はできていて安定しているので、致命的な問題になれば対策する。
# 現状と今後の課題
nvidia-smiでCUDA10.1が表示される。ToolKitでは10.0
cudnn7.6、7.4が混在（多分問題ない）
Driver435でOKか

# 参考にさせていただいたサイト

[TensorFlowからGPUが認識できているかを2行コードで確認する]
(https://thr3a.hatenablog.com/entry/20180113/1515820265)

[機械学習時にGPUを認識してくれなくて、とっても困っている人向けの記事](https://medium.com/lsc-psd/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E6%99%82%E3%81%ABgpu%E3%82%92%E8%AA%8D%E8%AD%98%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%81%AA%E3%81%8F%E3%81%A6-%E3%81%A8%E3%81%A3%E3%81%A6%E3%82%82%E5%9B%B0%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E4%BA%BA%E5%90%91%E3%81%91%E3%81%AE%E8%A8%98%E4%BA%8B-58586f1ffc0c)
＃9HTML CSS 　ボックス要素とインライン要素

1.ブロック要素
その要素を2つ以上続けて書くと、自動的に改行されて表示されるモノ。

//<h1>,<h2>, <div>, <form>, <table>,<p>,<ul>,<li>//

2.インライン要素
　その要素を2つ以上続けて書くと、改行されずに横並びに表示されるモノ。<img>,<a href>,<strong><span>
改行/横並び　ブロック要素：改行される
　　　　　　　インライン要素：横並びになる
margin ブロック要素：上下左右ともに効く
　　　　インライン要素：左右は効く　上下は効かない

padding
ブロック要素：上下左右ともに効く
　　　　　　　
インライン要素：左右が利く上下は効くが表示がおかしくなる

text-align

そのブロック要素で囲んだ中身のテキストや画像に対して聞かせることができるブロック要素
　そのテキストや画像を　div や　ｐ　などで囲うことでそのテキストや画像に対して聞かせることができる
JavaScriptからJavaへの道

ひょんなことからJavaScriptエンジニア(JavaScript経験者)がJavaをやることになった際、ぶつかった問題点・注意点・苦労などを備忘録として残しています。
基本スタンスとしては、JavaScriptとJavaの違いをJavaScript側から記載しています。

#環境構築の違い
##JavaScriptの場合
まず入り口と言いますか敷居が違います。
JavaScript(以下、JSと省略)なら、ブラウザとメモ帳(エディタ)さえあればOKです。
いずれも標準装備で、JSを試すだけならブラウザのコンソール上で叩けばいいので、メモ帳すらいらないです。
これは結局のところJSは、もともとHTMLにアクションを加えたいがためにブラウザ内に処理系を載せた、インタプリタ方式のスクリプト言語であるという特徴に由来するからです。
##Javaの場合
一方のJavaはコンパイラ方式のプログラミング言語であり、標準装備だけでは動かせません。
JVM上で動くのでJRE/JDKを入れます。入れ方はネットでいくらでも見つかります。
注意点としては、「パスを通しておく」ぐらいでしょうか。

#型の違い
##JavaScriptの場合
JSはいわゆる動的型付けであり、厳密な型はない状況です。
型がないがゆえに楽な時もありますが、落とし穴にはまる時もあります。
プリミティブも参照もすべてvarで宣言します。

##Javaの場合
一方のJavaは静的型付けであり、厳密です。ここがまず慣れない点であり、苦労します。
###プリミティブ型(基本型、値型)
boolean、char、その他数字関連で計8種類ほど存在。型名の頭文字はいずれも小文字です！
###参照型(クラス型)
String、配列など。型名の頭文字は大文字です！
Javaではクラス名の頭文字は大文字にするというルールがあるようです。
f2pyでnumpyの配列を扱う

# f2pyを用いてnumpyのデータを解析

numpyはデータの取り扱いは便利だが、Pythonはforループが遅いので微分などをうまく行う方法がない。f2pyで微分の部分のみfortranで書いてやれば、高速化できて良い。微分の操作などは多くの解析で共通なので、一度書いておくと使いまわせて良い。

f2pyの公式マニュアルは[こちら](https://numpy.org/doc/stable/f2py/index.html)にあるので参照されたい。

# fortranコード

サブルーチンを用いて関数を書くのが基本と思われる。
基本事項は以下

- `intent`は必ず書く
- 返り値は`intent(out)`で管理

例えば、「配列に1を足して返す関数」は以下のように書ける。ファイル名は`f2py_test.f90`などとしておく

```fortran
subroutine add(qq,ix,qq_add)
  implicit none
  
  integer :: i
  integer, intent(in) :: ix
  real(8), dimension(ix), intent(in) :: qq
  real(8), dimension(ix), intent(out) :: qq_add
  
  do i = 1,ix
    qq_add(i) = qq(i) + 1
  enddo

  return
end subroutine add
```
# コンパイル

```terminal
f2py --fcompiler=gfortran -m f2py_test -c --f90flags='-O3' f2py_test.f90
```

とする。オプション `-c` は必ずつけて最後にコンパイルするファイル名を書く。それぞれのオプションは以下

- `--fcompiler=`: fotranコンパイラ指定
- `-m`: Pythonで用いるときのモジュール名(ファイル名と同じでなくて良い)
- `--f90flags=`: fortranコンパイラで使うオプション

# Pythonからfortranコードの利用
Pythonからf2pyを利用する時は、以下のようにする。


```python
import f2py_test # f2pyでコンパイルしたモジュールをインポート
import numpy as np
ix = 5
qq = np.zeros(ix) # 適当にnumpy配列を定義
qq_add = f2py_test.add(qq,ix) # f2pyで定義した関数を呼び出す
```
fortranコードで定義した`qq_add`は`intent(out)`としてあるので、戻り値と判断され、関数の引数には含めない。
一方、上記のコードでは配列の大きさ`ix`も関数の引数として含めたがf2pyでは、配列の大きさは自動的に判定してオプション変数とした上で、自動的に`len(qq)`を代入してくれる。よって、

```py
qq_add = f2py_test.add(qq)
```
としても同様に結果になる。

# 触れないが触れたいこと

- 多次元・複数の配列でも基本的に方法は同じ
- 変数の形が呼び出しで違ってもf2pyがなんとかしてくれる
- 一つのファイルの中に複数のサブルーチンを書いても問題ない

# 終わりに

numpyの配列を解析する時に、f2pyを使う心の障壁を低くして解析を高速にしたいと思う
HTML&CSS　練習/float/header

header {
  position: absolute;
  top: 0px;
  left: 0px;
  width: 100%;
  height: 55px;
  background-color: navy;
  color: white;
}

.abc {
  float: left;
  width: 233px;
  padding-left: 11px;
  font-size: 24px;
  line-height: 55px;
}

header ul { 
  float: right;
  width: 157px;
  line-height: 55px;
}

header ul li {
  float: left;
  list-style: none;
  padding-right: 22px;
  font-size: 16px;
}

//【練習問題】が左寄せで表示され、【基本】と【応用】が右寄せ　かつ　横並びで表示されるようにfloatプロパティを設定する。
DELETEしたレコードを履歴テーブルにINSERTするトリガーを実装する

## 前提
【RDBMS】
PostgreSQL 12.2

【準備するテーブル】
・削除対象のテーブル(productテーブル)
・削除したレコードを移すテーブル(archiveテーブル)

## 手順① トリガプロシージャの作成
プロシージャとは連続した複数の処理を1つに定義したものです。
プロシージャでは条件分岐やループなどを記述することもできますが、今回はINSERTするだけの機能であるため、シンプルに記述します。

トリガプロシージャの決まりとしてPostgreSQL 11.5文書には以下のように記述されています。
> トリガ関数は、引数を取らない、trigger型を返す関数として宣言される必要があります
https://www.postgresql.jp/document/11/html/trigger-definition.html

以上を踏まえてトリガプロシージャを作成します。

```sql
CREATE FUNCTION process_backup()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
BEGIN 
	INSERT INTO archive SELECT OLD.*;
	RETURN OLD;
END
$function$
```
##### OLDについて
OLDは更新される前のデータベースの行を保持しています。今回実装しようとしているトリガプロシージャでは、削除される行がOLDに格納されることになります。

##### RETURN OLDについて
DELETEの場合は、渡された行(OLD)を返す必要があります。元テーブルのデータをまったく変更しない場合はNULLを返します。

## ②トリガーの宣言
productテーブルの行削除後に①で定義したprocess_backup()が実行されるように定義します。

```sql
CREATE TRIGGER backup_recode 
AFTER DELETE ON product 
 FOR EACH ROW EXECUTE PROCEDURE process_backup();
```

## 実行結果

- DELETE前

| product.id      |      product.name |  |archive.id|archive.name|
|:----------------:|:-----------------:|:-----------------:|:-----------------:|:-----------------:|
| 1            |apple|    |     |     | 
| 2           | orange|   |    |     |

- DELETE後

```sql
DELETE FROM product;
```
| product.id      |      product.name |  |archive.id|archive.name|
|:----------------:|:-----------------:|:-----------------:|:-----------------:|:-----------------:|
|             ||    |1     |apple     | 
|            | |   |2    | orange    |

DELETEしたタイミングでarchiveテーブルに削除内容がINSERTされています。


## まとめ
トリガプロシージャの作成とトリガを定義することで、削除したレコードを別テーブルに移すことができました。トリガプロシージャに条件分岐やループを用いることでさらに高度なレコード操作ができそうですね。

ブログも是非 => [文系SEの気ままにTech LIFE](https://lc-xx16.hatenablog.com/)
[LINE Messaging API]ASP.NET CoreでLINE Messaging APIを使う

#LINE Messaging API
ドキュメントは[こちら](https://developers.line.biz/ja/services/messaging-api/)

#ASP.NET Core
ドキュメントは[こちら](https://docs.microsoft.com/ja-jp/aspnet/core/introduction-to-aspnet-core?view=aspnetcore-3.1)

#NuGet
使用するNuGetは[こちら](https://github.com/line-developer-community/line-messaging-api-csharp)
HTML&CSS復習課題

header {
  width: 100%;
  height: 60px;
  background-color: black;
}

.logo img {
  max-width: 280px;
  height: auto;
}

header ul {
  float: left;
  line-height: 40px;
  margin-bottom: 12px;
}

header ul li {
  float: left;
  list-style: none;
  padding-right: 90px;
  color: white;
  font-size: 20px;
}

main {
  clear: both;
}

.main-container {
  width: 1580px;
  height: 100%;
  margin: auto;
  margin-top: 20px;
}

.left {
  float: left;
  width: 1050px;
}

.right {
  float: right;
  width: 475px;
}

h1 {
  border-left: 5px solid black;
  border-bottom: 2px solid black;
  padding-left: 10px;
  margin-bottom: 10px;
  width: 60;
}

.bookstore img {
  width: 100%;
  height: 100%;
  margin-top: 10px;
}

.graybox {
  width: 100%;
  height: 100%;
  background-color: lightgray;
  margin-top: 20px;
  text-align: center;
}

.graybox img {
  width: 230px;
  padding: 15px 10px 15px 10px;
}

.graybox1 {
  display: inline-block;
}

.graybox2 {
  display: inline-block;
}

h3 {
  border-bottom: 2px dotted black;
}

li {
  margin-bottom: 10px;
  list-style: none;
}

footer {
  clear: left;
  width: 100%;
  height: 60px;
  bottom: 0;
  left: 0px;
  color: white;
  background-color: black;
  text-align: center;
  line-height: 60px;
}
ASP.NET MVC : jQuery.ajaxを使った非同期処理

ASP.NET MVCで、jQuery.ajaxを使った非同期処理の実装方法を説明する。
ajaxを使うことで、ページ上の情報をページ遷移せずに更新できる。

簡単なサンプルを通して、GETやPOSTでの非同期処理の実装方法を確認する。

**サンプル**
テキストボックスに文字列を入力しボタンをクリックすると、サーバで処理が実行され、入力した文字列がそのまま返される。
返された文字列は、テキストボックスの下に表示される。

![mvc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64683/ac64edcd-6fab-61c2-d044-4f3d977de716.png)

# 1. GET
`$.get()`を使って非同期処理を実現する。
## クライアント
```html:Index.cshtml
<script>
    $(function () {
        $('#getButton').click(function () {
            $.get('@Url.Action("Get", "Home")',
                { text: $('#textbox').val() },
                function (data) {
                    console.log(JSON.stringify(data));
                    $('#text').text(data['returnText']);
                }
            );
        });
    });
</script>
```

**補足**
※リクエストの送信先URLは、シングルクオーテーション「'」で囲むこと。
※「ReferenceError: $ is not defined」のエラーが出る場合、「jquery.min.js」が読み込めていない。
_Layout.cshtmlのbodyタグにある以下の行を、headタグ内に移動する。

```html
<script src="~/lib/jquery/dist/jquery.min.js"></script>
```

## サーバ
```csharp:HomeController.cs
public IActionResult Get(string text)
{
    System.Diagnostics.Debug.WriteLine(text);

    System.Threading.Thread.Sleep(5000);

    return Json(new { returnText = text });
}
```

# 2. POST
`$.post()`を使って非同期処理を実現する。

GETと異なるのは、以下の2点。
* `$.get()`ではなく、`$.post()`を使う。
* リクエストの送信先は、`HomeController.Get()`ではなく、`HomeController.Post()`である。メソッドの上には、`[HttpPost]`を付けること。

## クライアント
```html:Index.cshtml
<script>
    $(function () {
        $('#postButton').click(function () {
            $.post('@Url.Action("Post", "Home")',
                { text: $('#textbox').val() },
                function (data) {
                    console.log(JSON.stringify(data));
                    $('#text').text(data['returnText']);
                }
            );
        });
    });
</script>
```

## サーバ
```csharp:HomeController.cs
[HttpPost]
public IActionResult Post(string text)
{
    System.Diagnostics.Debug.WriteLine(text);

    System.Threading.Thread.Sleep(5000);

    return Json(new { returnText = text });
}
```
メールを受信したときにExcelに書き込むプロセスを自動化してみた

#はじめに
最近少しづつPowerAutomateで遊んでいるものです。いきなり高度なことを目指すと挫折しそうだったので、シンプルなプロセスを自動化してみてQiitaに投稿しようと思い立ちました。
プロセスを自動化するときには特に投稿しようとは思っていなかったので、途中のスクリーンショットをとっていなかったのであまり網羅したものは作れないような状態です。

#自動化したプロセス
Outlookの受信フォルダに届いたメールの情報をOnedriveに保存したExcelファイルに書き込む。
#詳細
Office365に契約したらFlowが選択肢として出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412306/6483cb7e-dcba-edb3-d79e-bbb6649a598a.png)


「空白から作成」から自動フローから作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412306/bf6ace57-3d79-81c4-3748-88d295f5f642.png)

ステップが二つしかないですがこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412306/4661b588-876a-b024-6dd3-5bbc9c0588ca.png)

Excelを選択するときに無印とBusinessとOnedriveが出てきました。何を選べばいいのか不明だったので試行錯誤しました。
結果Onedriveが正解でした。

その前に保存するExcelをOnedriveに作っておきます。
Excelを指定するときにTable名を指定します。そのため、Excel上でTableを作成します。
TableはExcelのOptionで指定します。名前を付けておいてあとで呼び出しやすくしておくといいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412306/cb088852-e8ed-7e2c-4ac0-8e6dc54133ad.png)
Tableを指定するときに表題だけ作っておいたほうがいいです。今回は複数の空欄行を含めて表にしたので空欄が出来ました。

今日確認したら５件ほど登録されていたので成功です。テストを実行するときは仮に自分宛にメールするとテストができます。