OmniAICreator/Qiita-1.07M huggingface dataset:
C++で使えるデータ構造の比較表



## はじめに

C++でコードを書いていて、データ構造の違いでメンバ関数がちょっと違っていたりして迷ったことはありませんか？

- vectorへの要素追加ってpush_backだっけ？insertだっけ？
- mapはソートされてるんだっけ？ソートされるのはどれだっけ？

私もこういうことがあって迷ったため、比較表にまとめてみました。

コードはあくまで例であり別の書き方があるものもありますが、よく使われるであろう表記を記載しました。

## pair, tuple

| |pair|tuple|
|:-----:|:-:|:-:|
特徴|2つの値をペアで保持できる|0個以上の値の組を保持できる|
変数宣言|pair\<int,string> p(1, "Two");|tuple\<int, int, string> t;|
値の代入|p = make_pair(1,"Two");|t = make_tuple(1,2,"Three");|
値の参照|p.first<br>p.second|int& i = get\<0>(t);<br>int& j = get\<1>(t);<br>string s = get\<2>(t);|
比較|若い番号の要素で比較<br>等しい場合には一つ後ろの要素で比較|若い番号の要素で比較<br>等しい場合には一つ後ろの要素で比較|


## vector, set, map, multimap
| |vector|set|map<br>unordered_map|multimap<br>unordered_multimap|
|:-:|:-:|:-:|:-:|:-:|:-:|
特徴|動的配列|重複のない要素集合|連想配列<br><br>unorderedがついているものはソートされていないmap|多重連想配列<br>キーを重複して持てるmap<br><br>unorderedがついているものはソートされていないmap
キーの重複が可能か|No|No|No|Yes|
変数宣言|vector\<int> v(要素数,初期値);|set\<int> s{2,1,4,5};|map\<string, int> m;|multimap\<string, int> m;|
値の参照|v[0]|-|m.at("One")|findを使う|
値の代入|v[0]=1;|-|m["One"] = 1;|？|
空判定|v.empty()|s.empty()|m.empty()|m.empty()|
サイズ|v.size()|s.size()|m.size()|m.size()|
末尾の要素|v.back()|auto itr=s.end();itr--;cout << *itr << endl;|-|同左|
要素を追加|v.push_back(3)<br>末尾に追加|s.insert(3)|m["One"] = 1;<br>または<br>m.insert(make_pair("One",2));<br>または<br>m.emplace("One",2);|m.insert(make_pair("One", 1));
要素を削除|v.erase(v.begin() + 2)<br>2番目の要素を削除<br><br>v.pop_back() <br>末尾要素を削除|s.erase(3)|m.erase("One")|s.erase(3)|
要素の検索<br><br>イテレータが返る,要素が見つからない場合はx.end()が返る||s.find(3)|m.find("One")|？|
ソートされているか(lower_boundが使えるか)|No|Yes|**map** Yes<br>**unordered_map** No|**multimap** Yes<br>**unordered_multimap** No|
ソートの計算量|O(NlogN)|-|-|-|
昇順ソート|sort(v.begin(),v.end());|-|-|-|
降順ソート|sort(v.begin(),v.end(), greater\<int>());|-|-|-|
要素の順番を逆にする|reverse(v.begin(),v.end());|-|-|-|


## stack, queue, priority_queue, dequeue

| |stack|queue|priority_queue|deque|
|:-:|:-:|:-:|:-:|:-:|
仕組み|LIFO<br>backから挿入され、backから取り出す|FIFO<br>backから挿入され、frontから取り出す|優先度付きキュー<br>デフォルトは降順|先頭・末尾の両方から要素の追加・削除ができるキュー
宣言例|stack\<int> st;|queue\<int> q;|priority_queue\<int> q;|deque\<int> dq;
ソートされるか|No|No|Yes|No
要素数|st.size()|q.size()|同左|dq.size()
先頭に要素を追加|-|-|同左|dq.push_front(1)
先頭要素の参照|-|q.front()|同左|dq.front()
先頭要素の取り出し|-|q.pop();|同左|dq.pop_front()
末尾に要素を追加|st.push(1)|q.push(1)|同左|dq.push_back(99)
末尾要素の参照|st.top()|q.back()|同左|dq.back()
末尾要素の取り出し|st.pop()|-|同左|dq.pop_back()

## まとめ

C++の基本的なデータ構造について比較してまとめてみました。

※あまり慣れていないため、誤記があれば指摘ください。
忘れがちなrubyの基礎知識を復習

## はじめに
改めてrubyの基本的な記法を復習するための記事になります。

## ・あるオブジェクトを文字列に変換するto_sメソッド
```
# 文字列→文字列
'1'.to_s   # => "1"

# 数値→文字列
1.to_s     # => "1"

# nil→空白の文字列
nil.to_s   # => ""

# 真偽値true→文字列の"true"
true.to_s   # => "true"

# 真偽値のfalse→文字列の"false"
false.to_s   # => "false"
```

## メソッドの呼び出し方

```
# 通常の書き方
オブジェクト.メソッド(引数1, 引数2, 引数3)
# カッコを省略しても良い
オブジェクト.メソッド 引数1, 引数2, 引数3
# 引数がない場合
オブジェクト.メソッド
```

## 変数名の作り方
```
# 変数名はスネークケースが望ましい
first_name = user.first_name

# キャメルケースは慣習的に使用しない
firsfName = user.first_name

# 数字から始まる変数はエラーになり使用できない
2_discount_price = 200
```

## 文字列について
シングルクオート('')を使用しても、ダブルクオートを使用しても("")文字列を表現することができる。
使い分けとしては、基本的にはシングルクオートを使い、式展開する場合はダブルクオートを使用する

```
# 文字列
'これは文字列'
"これは文字列"

# 式展開する場合
i = '文字列'
"これは#{i}"  # => これは文字列
```

## 論理演算子||と&&

```
# &&はANDの論理演算
# 条件1も条件2も真であれば真、それ以外は偽となる
条件1 && 条件2

t1 = true
t2 = true
f1 = false
t1 && t2      # => true
t1 && f1      # => false
```

## ||はORの論理演算

```
## 条件1も条件2のいずれかが真であれば真、両方偽であれば偽となる
条件1 || 条件2

t1 = true
t2 = true
f1 = false
f2 = false
t1 || t2      # => true
t1 || f1      # => true
f1 || f2      # => false
```

## ?で終わるメソッド
?で終わるメソッドは慣習的に真偽値を返すメソッドになります。

```
# 空文字列であればtrue、文字が入っていればfalseを返すempty?メソッド
''.empty?           # => true
'あいうえお'.empty?   # => false
```
C# 勉強(2)  VS code コンソールアプリビルド

１．プロジェクトファイル .csproj を開き、RuntimeIdentifiers に、対象ターゲットを指定する。

```c#

\<PropertyGroup>
\<OutputType>Exe\</OutputType>
\<TargetFramework>netcoreapp1.1\</TargetFramework>
\<RuntimeIdentifiers>win10-x64\</RuntimeIdentifiers>
\</PropertyGroup>
```

２．ビルド　
> dotnet restore
> dotnet build
> dotnet publish -c Release -r win10-x64

３．実行
ビルド後に「exe」ファイルができているのでcmdから実行。
Reactのcomponentについて

#Reactとは
HTMLのように1つの画面を複数の要素を組み合わせて表現可能な言語
この要素をReactではcomponentと言う

さらにReactは，componentの状態が更新されたら，その変更に合わせて画面を更新可能
この更新はstateを用いることで可能となる
つまり，ある画面において，変更があるコンポーネントのみにstateを持たせるとよい
また，stateを更新する際には，setStateを用いる

#componentの種類
class componentとfunction componentの2つが存在する．
この2つについて紹介する
##class component
-stateを持つことのできる
-event handlerを定義可能
-他のcomponetのpropとして情報を渡すことができる

####典型的な構造
~~~jsx
// ComponentもReactと一緒にインポートする
import React, { Component } from 'react';

//classの宣言
class コンポーネント名 extends Component {

  //Event handlerやstateを定義する場所

  //render()メソッド
  render() {

    //return
    return (
      
    );
  }
}
export default コンポーネント名; 
~~~
##function component
stateを持つことができない

####典型的な構造

~~~jsx
// Componentをインポートする必要はありません。
import React from 'react';

// functional componentの宣言
const コンポーネント名 = () => {

  //return
  return(
    
  )
}

export default コンポーネント名;
~~~

#文献
[【無料！】 Reactの基礎を学んでTODOアプリを作ろう！](https://note.com/dragontaro/n/n0daa9f013135)
[React初心者のためのハンズオン](https://freelance-jak.com/technology/react/2102/)
[初めてのReact「入門編」導入から基本まで〜TODOアプリを作ってを学ぼう！](https://webkikaku.co.jp/homepage/blog/hpseisaku/javascript/react-start/)
RDS オプショングループ

#オプショングループを使用する
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithOptionGroups.html

> DB エンジンによっては、データとデータベースの管理を容易にしたり、データベースのセキュリティを強化したりするための、追加の機能が用意されている場合があります。Amazon RDS では、オプショングループを使用してこれらの機能を有効にして設定します。オプショングループには、特定の Amazon RDS DB インスタンスに使用できる機能 (オプション) を指定できます。オプションの設定では、そのオプションの動作を指定できます。DB インスタンスをオプショングループに関連付けると、指定したオプションとそれらの設定がその DB インスタンスに対して有効になります。

次のDBのオプショングループが使用可能
* MariaDB
* Microsoft SQL Server
* MySQL
* Oracle

##オプショングループの概要

> Amazon RDS では、新しい DB インスタンスごとに空のデフォルトオプショングループが用意されます。このデフォルトオプショングループを変更することはできませんが、デフォルトオプショングループからその設定を引き継いで新しいオプショングループを作成することはできます。DB インスタンスにオプションを適用するには、以下を実行する必要があります。

新しいオプショングループを作成するか、既存のオプショングループをコピーまたは変更します。

1 つまたは複数のオプションをオプショングループに追加します。

オプショングループを DB インスタンスに関連付けます。

> DB インスタンスと DB スナップショットはいずれもオプショングループに関連付けることができます。場合によっては、DB スナップショットからの復元や、DB インスタンスに対するポイントインタイム復元を行うことができます。このような場合、DB スナップショットまたは DB インスタンスに関連付けられているオプショングループは、デフォルトで、復元された DB インスタンスに関連付けられています。復元された DB インスタンスに異なるオプショングループを関連付けることができます。ただし、新しいオプショングループには、元のオプショングループに含まれる永続オプションまたは固定オプションを含める必要があります。永続オプションおよび固定オプションについては後で説明します。

> オプションでは、DB インスタンスで実行するために追加のメモリが必要です。そのため、DB インスタンスの現在の使用状況によっては、サイズのより大きいインスタンスの起動が必要になる場合があります。たとえば、Oracle Enterprise Manager Database Control には約 300 MB の RAM が使用されます。サイズの小さい DB インスタンスに対してこのオプションを有効にした場合は、パフォーマンスの問題やメモリ不足のエラーが発生することがあります。


##永続オプションと固定オプション
> DB インスタンスがオプショングループに関連付けられている間は、固定オプションをオプショングループから削除することはできません。

> 固定オプション (Oracle Advanced Security TDE の TDE オプションなど) をオプショングループから削除することはできません。固定オプションを使用している DB インスタンスのオプショングループは変更することができます。ただし、DB インスタンスに関連付けられているオプションに、同一の固定オプションが含まれている必要があります。場合によっては、DB スナップショットから復元やポイントインタイム復元を行うことができます。DB スナップショットに関連付けられているオプショングループに固定オプションが含まれている場合、復元された DB インスタンスは、その固定オプションが含まれているオプショングループにのみ関連付けることができます。
コマンドプロンプト入門１

#コマンドプロンプトを開く
windowsボタンを押してcmdと入力Enterを押す
#基本的なコマンド
[`dir`]→今いる階層のファイル、フォルダを表示する(ターミナルでいうlsコマンド)

[`cd パス`]→指定したパスに移動する

[`cd..`]→一つ上の階層に戻る

[`md 指定の名前`]→指定の名前のフォルダを作る(ターミナルでいうmkdirコマンド)

[rd 指定したフォルダの名前]→ 指定したフォルダを削除する

[`ren ファイル、フォルダ　ファイル、フォルダ`]→ファイル、フォルダの名前を変更する
例：text.txtの名前をtext1.txtにする　[`ren text.txt text1.txt`]

[`Del ファイルの名前`]→指定のファイルを削除する
例：text.txtのファイルを削除する　[`Del text.txt`]

[`exit`]→ターミナルを閉じる

[`shutdown -s -t 秒数`]→指定の秒数後にシャットダウンをする

[`shutdown -a`]→シャットダウンの予約を解除する
(上のコマンドを打って電源が落ちそうになったら打つといい)
#少し変わったコマンド
[`cls`]→コマンドプロンプトを綺麗にする

[`type ファイルの名前 > ファイルの名前`]→指定の名前のファイルを作成する
例：text.txtのファイルを作成する　[`type text.txt > text.txt`]

[`ipconfig`]→インターネット関連の情報が見れる

[`ping ルーターのipアドレス`]→インターネットの通信速度が確認できる

[`tree`]→フォルダーの階層構造が見れる(ちょっと見ていて楽しい)

[`start https://www.google.co.jp`]→ブラウザを立ち上げる
PHP トレイトの検証

今回はトレイトのお話をしていきます。
公式ドキュメントとやっていることは同じかもしれませんが、
個人的にわかりやすいようにメモのような形で解説していきます。
1〜3は公式ドキュメントと挙動が同じですが、
4は個人的に気になったところを書いていきます。

<h1>1.基本的な使い方</h1>

```test_sample.php
<?php

require_once(__DIR__ . '/HelloWorld.php');

$app = new say();

$app->sayHello();
$app->sayWorld();

?>
```

```HelloWorld.php
<?php

trait HelloWorld
{
    public function sayHello(){
        echo 'Hello ';
    }

}

class say
{
    use HelloWorld;
    public function sayWorld(){
        echo 'world';
    }

}

?>
```

```
$ php test_sample.php
Hello world
```

useでトレイトを読み込めば使えます。

<h1>2.同じメソッド名の場合</h1>
```test_sample.php
<?php

require_once(__DIR__ . '/HelloWorld.php');

$app = new say();

$app->sayHelloWorld();

?>
```

```HelloWorld.php
<?php

trait HelloWorld
{
    public function sayHelloWorld(){
        echo '1';
    }

}

class say
{
    use HelloWorld;
    public function sayHelloWorld(){
        echo '2';
    }

}

?>
```

```
$ php test_sample.php
2
```

上記の場合は、sayクラスのメソッドが優先されています。

<h1>3.トレイトが複数の場合</h1>

```test_sample.php
<?php

require_once(__DIR__ . '/HelloWorld.php');

$app = new say();

$app->sayHello();
$app->sayWorld();
$app->sayHelloWorld();

?>
```

```HelloWorld.php
<?php

trait Hello
{
    public function sayHello(){
        echo 'Hello ';
    }

}

trait World
{
    public function sayWorld(){
        echo 'World';
    }

}

class say
{
    use Hello, World;
    public function sayHelloWorld(){
        echo '!';
    }

}

?>
```

```
$ php test_sample.php
Hello World!
```

複数の場合は、カンマ区切りでいけます。

<h1>4.コンストラクタとデストラクタは使える？</h1>
ここからが個人的に気になるところなので検証します

```test_sample.php
<?php

require_once(__DIR__ . '/HelloWorld.php');

$app = new say();

$app->sayHelloWorld();

?>
```

```HelloWorld.php
<?php

trait Hello
{
    public function __construct(){
        echo 'Hello';
    }

    public function __destruct(){
        echo 'world';
    }

}

class say
{
    use Hello;
    public function sayHelloWorld(){
        echo '_';
    }

}

?>
```

```
$ php test_sample.php
Hello_world
```

結論：コンストラクタもデストラクタも呼ばれる

ちなみに、トレイトを親クラスとして継承させるのは無理みたいです。
逆も無理です。

```
例1.
class say extends Hello

例2.
trait Hello extends say
```
JOI 2011 予選 C 最高のピザ

##問題
https://atcoder.jp/contests/joi2012yo/tasks/joi2012yo_c
##見た感じ
具材のカロリー順にソートしてgreedyでよさそう
##解法
greedy
##ソースコード
```c++
const int N_MAX=103;
int n,a,b,c,calo[N_MAX];

int main(){
    int i;
    //入力
    cin>>n;
    cin>>a>>b;
    cin>>c;
    rep(i,n){
        cin>>calo[i];
    }
    //処理
    sort(calo,calo+n,greater<int>());
    double cost=a,calory=c;
    i=0;
    double ans=0,nans=calory/cost;
    do{
        ans=nans;
        cost+=b;
        calory+=calo[i];
        i++;
        nans=calory/cost;
    }while(nans>ans);
    //出力
    int res=ans;
    cout << res <<endl;
}
```
HTMLの細かいスキル


```html
<strong>太文字にする</strong>
<blockquote cite="出典URL"><p>引用する</P></blockquote>

order list 順番が記載される。
<ol>
<li>①</li>
<li>②</li>
<li>③</li>
</ol>

リスト
<dl>全体
<dt>項目A</dt>
<dd>回答A</dd>
<dt>項目B</dt>
<dd>回答B</dd>
<dl>

表を作る
<thead>table hed
<tr>table row（行）
<th>年</th> table hed cell
<th>出来事</th> table hed cell
</tr> 
</thead> 
<tbody>
<tr> table row（行）
<td>1995年</td> table data set
<td>会社設立</td>
</tr>
<tr> table row（行）
<td>2255年</td> table data set
<td>未来へ</td>
</tr>
</tbody> table body

違うタブでサイトを開く
<p>プログラミング学習サービスの「<a href="https://dotinstall.com" target="_blank">ドットインストール</a>」です！</p>

日付や時刻
<time>2020-05-14</time>

```
Docker Hubの使い方

# 環境
macOS 10.15.4
Docker 19.03.8

# アカウントの登録
下記のリンクからDocker Hubのアカウント登録を行います。
https://hub.docker.com

![dockerhub01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587506/67205976-9950-e5e0-96aa-5751b10532e7.png)

# Docker Hubを使う
### Docker Hubにログインする
ターミナルから指定のディレクトリに移動してDocker Hubと連動させるためログインを行います。

```
$ docker login
```
するとUsenameとPasswordが求められるのでDocker Hubのアカウント登録した情報を入力します。

```
$ docker login
Username:(アカウント名) 
Password:(パスワード)
Login Succeeded
```
これでDocker Hubとの連動が完了しました。

### イメージIDを調べる
下記のコマンドを実行してイメージIDを調べます。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
recipegram_web      latest              a91018b6cf9c        7 days ago          1.3GB
<none>              <none>              1f63874cf252        7 days ago          1.3GB
<none>              <none>              38f311130abd        7 days ago          1.04GB
docker_sample_web   latest              604c94f14094        8 days ago          1.04GB
<none>              <none>              a1cd1b5bdb2a        8 days ago          989MB
ruby                2.5                 a98425292e84        4 weeks ago         843MB
postgres            latest              0f10374e5170        4 weeks ago         314MB
gihyodocker/echo    latest              3dbbae6eb30d        2 years ago         733MB
```
指定のイメージIDを探して下記のように記述します。

### アップロードを実行する

```
$ docker tag a91018b6cf9c chisaki0606/recipegram:latest 
```
この記述はわたしの場合の例ですが、```a91018b6cf9c```は指定のイメージIDになります。
そして```chisaki0606/recipegram:latest```の記述は```(Docker Hubのアカウント名)/(リポジトリ名):(タグ名)```になります。最後の```latest```は指定はありませんが最新の場合にはこちらのタグ名にすることが慣例になっています。

確認をするとアップロードが完了されました^_^
<img width="1440" alt="スクリーンショット 2020-05-24 22.13.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587506/2c9a2148-6d30-9616-043d-405d2940ac2d.png">
Javaのクラスの使い方や定義、import

###他クラスのメソッドの呼び出し
クラス名.メソッド名()とすることで、クラスのメソッドを呼び出せます。
【例】

```Main.java
class Main {
  public static void main(String[] args) {
    Person.hello();  //Personがクラス名でhelloがメソッドです
  }
}
```

```Person.java
class Person {  //Personがクラス名です
  public static void hello() {  //helloがメソッドです
    System.out.println("おはよう");
  }
}
```
上記のようにMain.javaのPerson.hello();でPerson.javaのPersonをクラスを呼び出します。
ちなみに、クラスの定義は「class クラス名」となります。
クラス名の最初の文字は大文字にし、ファイル名は「クラス名.java」に必ずします。
【例2】

```Main.java
public class Main {
  public static void main(String[] args) {
    Person.nameData(Person.fullName("佐藤", "太郎"), 20);  //Personがクラス名でnameDataがメソッドです。Person.fullNameも同様です
  }
}
```

```Person.java
class Person {
  public static void nameData(String name, int age) {  //nameDataがメソッドです
    System.out.println("私の名前は" + name + "で" + "年齢は" + age + "歳です");
  }
  public static String fullName(String firstName, String lastName) {
    return firstName + " " + lastName;
  }
}
```
上記の結果は「私の名前は佐藤太郎で年齢は20歳です」ととなります。
###なぜクラスを分けるか
Mainクラスは実行用のクラス、Personクラスはロジック(論理)をまとめる役割分担が明確になるためです。
Javaは、ファイルではなくクラスを実行します。実行時にmainメソッドを持つクラスしか実行できません（mainメソッドのないクラスは、他のクラスから呼び出して使います）。
またクラス名に関係なく、実行時にはmainメソッドが呼ばれます（Mainクラスだからmainメソッドが呼ばれるわけではありません）。
###外部ライブラリ
他人が作ったクラスを利用することです。このようなクラスを外部ライブラリと呼び、自分のプログラムに読み込むことで利用できるようになります。
外部ライブラリを自分のプログラムに使えるようにするには、importを使います。
class定義より上で「import java.lang.Math」とします。
Mathクラスのメソッドは、数学的なメソッドの意味をもちます。
【例】

```Main.java
import java.lang.Math;
class Main {
  public static void main(String[] args) {
    int max = Math.max(3, 5);  //Mathは外部から読み込んでいるクラスです
    System.out.println("最大数字は" + max);
  }
}
```
上記の場合maxメソッド(引数に渡した2つの数値の大きい方を返してくれるメソッド)を使っているので、結果は数字が大きい「最大数字は5」となります。
他にも引数の小数点以下を四捨五入して返すroundメソッドなどがあります。
###importしなくても使える
先ほど、import java.lang.Math;を使いましたが、importしなくても自動で読み込まれます。
他にも、「java.lang.クラス名」となる外部ライブラリはすべて自動で読み込まれます。
【UE4】アニメーションBPの共有(2)

<h2>キャラクターに動きをつける</h2>
前回
https://qiita.com/KLaboratory/items/fecb657668215e48660dの続きです。
<h3>コントローラー</h3>
コントローラーブループリントを作成します。操作はすべてここで行います。キャラクターの動きをキャラクターのブループリントに書くのが一般的ですが、せっかくアニメーションBPを共有しようとしているのですから、操作の記述も共有したいところです。コントローラーのBPを作成して、プロジェクト設定Player Controller Classに指定します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/b0ff9167-eeb8-3ced-6ac5-e60b3f17d8db.png)
<h4>コントローラーBP</h4>
移動、回転、ジャンプは通常のものと同じなので詳しいことは割愛します。まずは移動。実行して、Maria JJがＴポーズのまま移動すれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/3ea2e487-fb81-dba3-2b4c-34f5a7edf559.png)
続いて回転。これも、実行して、Maria JJがＴポーズのまま回転すれば成功です。TurnRateは0以外の初期値を入れてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/bc09a097-ca4c-3c22-02ce-d3c5201cfaa2.png)
Jumpです。これもMaria JJがＴポーズのまま浮遊すれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/17fd8a0a-bc78-a281-4e33-fd8b9490e560.png)
コントローラーBPはここで一旦置いておきます。
<h4>アニメーションBP</h4>
続いてアニメーションBPです。Idleと歩くところだけ作ります。AnimGraphにステートマシンを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/3c699281-559e-be14-1b3e-a1e18a28c4a0.png)
Idleのステートを作り、Idle(Maria JJのもの、Great swordではない方)アニメーションを接続します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/f3ba2dae-d8fe-6f48-9221-a4880af66c39.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/b970c53b-c1d5-951c-c9b6-709ce2961b06.png)
実行するとMaria JJがIdleポーズに変わっていれば成功です。AnimGraphに戻り、IdleステートにWalk/Runのステートを作ります。本来ならブレンドスペースなどを使ってスピードによって変化させますが、今回は省略します。とりあえず、Runのアニメーションをつけます。トランジションルールのSpeedもとりあえず適当な数値を入れておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/97b0dbcf-420b-7fd2-be98-fcba3f31fb44.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/950b0bad-bb22-9042-8791-142c59dbe280.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/2317bb34-25bf-eaae-1e86-2be8ad02f9df.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/b3b684d8-fd39-cbe3-96f3-4452f99ee445.png)
イベントグラフはこのようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/69fba679-cfd0-f36f-eeb4-f8a268224fbb.png)
実行するとMaria JJが走ります。
次回に続きます。
Java volatileを使用した際の性能影響について検証

#概要
volatileを使用した際の性能影響について検証したメモページ。

#volatileとは
フィールドに付ける修飾子。
マルチスレッドのプログラムの場合に、スレッドがフィールドの値をキャッシュする可能性がある。
volatileを付けると、キャッシュの対象外にすることができる。
（本ページではvolatileの役割についての詳細は割愛。）

#性能検証
##性能検証に使用した環境
**マシンスペック**
CPU：Intel(R) Core(TM) i5-2400S CPU
RAM：8GB
OS：windows10 64ビット

**実行環境**
Eclipse(2020-03 (4.15.0))
Java8

##volatileを使用した場合の性能
volatileを付与した状態で、int型のフィールドを1億回カウントアップする処理の時間を計測。

```java
    private volatile int cnt = 0;

    private long exe() {

        long start = System.currentTimeMillis();

        for (int i = 0; i < 100000000; i++) {
            this.cnt++;
        }

        long end = System.currentTimeMillis();

        return end - start;
    }
```

上記のコードでの計測を10回実施し、平均値を取得。

**結果**
平均値：964ms

##volatileを使用しない場合の性能
上記のコードから、フィールドをvolatileを使用しない形に変更。

```java
    private int cnt = 0;
```

同様に計測を10回実施し、平均値を取得。

**結果**
平均値：7ms

#まとめ
volatileを使用した場合のほうが性能が悪くなるが、1億回カウントアップで上記程度の時間であるため、ほとんどの場合は影響なさそう。
Javascriptで作る　モーダルウィンドウ

まず、モーダルを作る場合、部品が何個あるのか考えます。
今回のモーダルウィンドウでいうと、
①モーダルを呼び出すボタン
②モーダルが出てきた際の背景が黒い画像
③モーダルウィンドウ

大きく分けて、この３つが必要となる。


①モーダルを呼び出すボタン

```html
<section class="container">
      <p>ボタンを押すとモーダルウィンドウが開きます</p>
       <button type="button" class="btn">開く</button>
    </section>

```

②モーダルが出てきた際の背景が黒い画像

```html

<div class="mask" id="blackMask"></div>

```
③モーダルウィンドウ

```html
<section class="modal" id="">
      <div class="top">
        <h1>Vue.js Modal Window！</h1>
        <input type="text">
      </div>
      <div class="under">
       <button type="button" class="btn">送信</button>
      </div>
    </section>

```

次にCSSで非表示設定、Javascriptで動きを付けていく

①mask と　modalを非表示にする（CSS）
1.display: none;
2.transform: translateY(150px,-500px);
※モーダルは上から落ちてくる感じにしたいので、translateY(-500px);で上に置いとく
※SCSSの場合は、CSSではなく、IDの方にクラスを付けるため、{}の外側に書く

```javascript

  const open = document.getElementById('open');
  const idMask = document.getElementById('idmask');
  const idModal = document.getElementById('idmodal');

  open.addEventListener('click', () => {
    idMask.classList.add('active');
    idModal.classList.add('drop');
  });
  idMask.addEventListener('click', () => {
    idMask.classList.remove('active');
    idModal.classList.remove('drop');
  });

```

基本的には、要素を取得してきてclickイベントで要素の付け外しを行う

おまけ

```css

.modal {
  background: #ffffff;
  width: 200px;
  border-radius: 4px;
  transform: translate(150px,-500px);
  transition: transform 0.4s;

```
transition: transform 0.4s;を設定してあげることで、上からゆっくりと
モーダルが落ちてくる。
Qiitaの画像投稿時に　![error]()　となる件

##![error]() となる件
画像をアップした所　

```
![error]()
```
となってしまいました。
5月は記事を結構書いていたので容量をオーバーしたようです。

過去に投稿したことがある人は月100MBまでだそうです・・・
（これを書いているのが5月24日　あと1週間は記事をアップできません・・・）

>1MBを超える画像をアップロードしようとした場合は、自動的に1MBに収まるように大きさが変更されます

つまり、100枚までアップできる模様です
Qiitaは仕様でアップしたものが消えないので加算されていくはずなので
実質100回のアップロードしか出来ない事になります。
なかなか厄介な仕様ですね・・・

スクショ取ったけど、制限がかかるのでアップできません・・・

```
![error]()
```

###参考情報
>画像投稿時に、![error]()となる件
https://qiita.com/saiteu/items/49f5415fe7043357a053

>Qiitaに1件も投稿していない時の画像アップロード容量の上限は月間2MBまで
https://qiita.com/unsoluble_sugar/items/f61be798972883e44877
【Rails】fields_forが表示されない

今回は、「fields_for」で「file_field」を使用しようとしたところ、ビューに反映されずに苦戦したので、備忘録として解決した方法を記載します。
同じ悩みを抱えた方の一助になると幸いです。

※この記事ではfields_for とaccepts_nested_attributes_for を使ったフォーム作成手順を解説するものではありません。

#今回登場するモデル
・（親）postモデル
・（子）imageモデル

postモデルとimageモデルaccepts_nested_attributes_forでアソシエーションしております。

# 想定
ツイッターやFBのようなSNSを作成。
「form_for」を用いて投稿フォームを作成するところです。

文章　→postモデル
写真　→imageモデル
に保存したく、以下のようにビューを作成しました。

# 間違えたコード
（わかりやすいように関係箇所のみ抜粋してます）

```haml:haml
.form__contents
  = form_for @post, id: "new_post" do |f|
    .title
      = f.text_field :title
    .text
      = f.text_area :text
    .image
      = f.fields_for :images do |i|
        = i.file_field :image
    = f.submit "投稿!"
```


よし、コーディング完了！！いざビューへ！！
…あれ、、「= f.fields_for :images do |i| 」以下が反映されてないぞ…
しかもエラーも出てないから何が悪いのかわからない…調べた通りやったのに…


# 上手く行ったコード
```haml:haml
.form__contents
  = form_for @post, id: "new_post" do |f|
    .title
      = f.text_field :title
    .text
      = f.text_area :text
    .image
      = f.fields_for :images, @post.images.build do |i|
        = i.file_field :image
    = f.submit "投稿!"
```

# まとめ
私はてっきり「fields_for」では保存したいモデルを書けば「file_field」で記載したカラムに保存してもらえるとばかり思っていたのですが、

「fields_for」の第二引数に**子モデルのインスタンス**も渡してあげないとダメみたいでした。

なるほど…たしかに「form_for」でもインスタンス渡してあげてるんだから当たり前か。
（そもそも　images.build　インスタンス作れるって初めて知りました！）

どんどはれ。

[参考させていただいたサイト](https://acchann.hatenablog.com/entry/2018/03/16/224300)
【環境構築 Mac】Ruby on Rails (+Webpackerでエラーの対処)

#初めに
Ruby on Railsの環境構築を行いましたので、記録します。

【構築環境】
・Rails6
・Ruby 2.6.3

【マシンスペック】
・macOS Catalina
・バージョン 10.15.3
・iMac(retina 4K, 21.5-inch,2019)
・プロセッサ 3 GHz 6コアIntel Core i5
・メモリ 8GB

【使用エディター】
VScode
(https://azure.microsoft.com/ja-jp/products/visual-studio-code/)

#構築手順
##Command Line Toolsのインストール
こちらでは、AppleIdが必要になります。
Id・パスワードを忘れている場合は事前に準備してください。

①Appleのdeveloperアカウントページにログイン
https://developer.apple.com/account/#/welcome

②See more downloadsからダウンロードリストページへ
https://developer.apple.com/download/more/

→OSに対応したCommand Line Toolsをダウンロードしてください。

##Homebrewのインストール
①Homebrewの公式サイトへ行き、記載されているコマンドを「ターミナル」に貼り付けてください。
(Homebrewの公式サイト)https://brew.sh/index_ja

※私の場合は以下のコマンドでした。

```/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"```

②Homebrewのインストールの確認
インストールが無事されたか不安なので、確認をします。

```brew -v```

※私の場合は以下のコマンドでした。

```Homebrew 2.2.17
Homebrew/homebrew-core (git revision 572fc; last commit 2020-05-24)```

##rbenvのインストール
①rubyのバージョン管理ができるようインストールします。

```brew install rbenv ruby-build```

②インストールが完了したら、以下のコマンドで確認してみてください。

```rbenv -v```

※私の場合は以下のコマンドでした。

```rbenv 1.1.2```

##Rubyのインストール
ここからは、Rubyをインストールしましょう。
※Rubyについては、使用者によりは、もうインストールされているかもしれません。

①インストールされているか確認します。

```ruby -v```

※私の場合は以下のコマンドでした。

```ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin19]```

もうインストールしてたいましたが、もしインストールされていない様でしたら、以下でインストールしてください。

②インストールされていない場合
以下のコマンドで、インストール可能なRubyのバージョンを確認します。

```rbenv install --list```

確認できたら、以下を実行、
数字は「rbenv install --list」で実行されたバージョンを指定します

```rbenv install ●●●●```
```rbenv global ●●●●```
```rbenv rehash```
```ruby -v```

バージョンがインストールされているか確認のため「ruby -v」を行いました。

##Bundlerのインストール
①以下のコマンドを実行して、インストールしてください。

```gem install bundler```

②確認します。

```bundle -v```

##my SQLのインストール
①my SQLをインストールして起動します。

```brew install mysql```

②my SQLを確認してください

```mysql.server start```

##Railsのインストール

①ディレクトリを制作しましょう
●は、任意のファイル名で記入してください。

```mkdir ~/●●●●●●●```

②制作したフォルダーに移動

```cd ~/workspace```

③Gemfileを作成する

```bundle init```

④Gemfileの中を編集・コメント解除
「mkdir ~/●●●●●●●」で制作したフォルダには「Gemfile」があります。
エディターソフトで、それを起動してください。

ファイルの中には```# gem "rails"```がメモ表記になっているので、コメント解除をしてください。

⑤Railsのインストール

```bundle install --path=vendor/bundle```

⑥Railsがインストールか確認

```bundle exec rails -v```

※私の場合は以下のコマンドでした。

```Rails 6.0.3.1```

##Railsでテストファイルを作成

①制作したいファイル先を指定

```cd desktop```
※私の場合はデスクトップ上に制作しました
また、こちらの制作時はRailsのインストール先のパスが異なります。
私は、新しくvscodeで新しくターミナルを制作していますのでご注意ください。

②Railsで新規ファイルを制作
●は任意のファイル名です。

```rails new ●●●●●```

しかし

私はここでエラーが発生!!
原因は「Webpackerでエラー」でした。
以下の作業を行います。

##Webpackerのインストール

①yarnがインストール

```brew install yarn```

②下記のコマンドを実行してください。

```rails webpacker:install```

でも「yarn」がインストールされていない!
と言われているので下記のコマンドを実行します。

##Railsの起動

①ブラウザを立ち上げるコマンドを実行する
以下のコマンドを実行してください

```rails s```

②ローカルサーバを起動

http://localhost:3000

→無事に起動しました。
よかった！

#参考記事
[Ruby初学者のRuby On Rails 環境構築【Mac】](https://qiita.com/TAByasu/items/47c6cfbeeafad39eda07)
[Homebrewのインストール](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)
[Rails6 Webpackerでエラーが出た](https://qiita.com/libertyu/items/1eb74adc817ab8971100)

参考記事様には、とても助かりました。
ありがとうございます。
SECCON Beginners CTF 2020 Writeup (Noisy equations)

チームr0bu5tとして、SECCON Beginners CTF 2020に参加していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/67540110-1a6f-2409-ced5-f8f8fc8782a7.png)

自分が解いたNoisy equationsの解法を共有します。数学的なところが非常に面白くて、解いていて楽しかったです！

# Noisy equations

## 問題
以下のサーバ側のコードが与えられていて、そのサーバに接続すると`coeffs`と`answers`が返ってくるというものです。

乱数が使われているので毎回異なる結果が返ってきます。

```server.py
from os import getenv
from time import time
from random import getrandbits, seed


FLAG = getenv("FLAG").encode()
SEED = getenv("SEED").encode()

L = 256
N = len(FLAG)


def dot(A, B):
    assert len(A) == len(B)
    return sum([a * b for a, b in zip(A, B)])

coeffs = [[getrandbits(L) for _ in range(N)] for _ in range(N)]

seed(SEED)

answers = [dot(coeff, FLAG) + getrandbits(L) for coeff in coeffs]

print(coeffs)
print(answers)

```

## 解法

コードを読み解くと、以下のようになっていることがわかります。

```math
A_ix + b = y_i
```

Aが`coeffs`, xが`FLAG`, bが`seedで固定されたgetrandbits(L)`, yが`answers`です。Aに関しては乱数が固定されていないため、実行するたびに値が変わります。

これを2回取得すれば、xを求めることができます。

```math
A_1x + b = y_1\\
A_2x + b = y_2\\
```
```math
\Rightarrow (A_1-A_2)x = y_1-y_2\\
```
```math
\Rightarrow x = (A_1-A_2)^{-1}y_1-y_2\\
```

以下のコードでFLAGを得ることができました。

```solver.py
import numpy as np
from sympy import Matrix

A1 = Matrix([[123123..., ...], ...])
y1 = Matrix([123123..., ...])
A2 = Matrix([[123123..., ...], ...])
y2 = Matrix([123123..., ...])

A = (A1-A2)
y = (y1-y2)

soln = A.LUsolve(y)
print(''.join([chr(s) for s in soln]))
```

```math
\Rightarrow ctf4b\{r4nd0m\_533d\_15\_n3c3554ry\_f0r\_53cur17y\}
```

チームメンバー・運営の皆様お疲れ様でした。
HTML構造

HTMLでは、構造化するために、おおよそ以下のような
ものを使って枠組みを作る。

header/nav/aside/footer/main/article/section

特に、ややこしくするのがmain/article/sectionである。

ややこしくしているものを一つ、一つ取り上げていくと
まずmainは、

①ページ内のメインコンテンツに使用する
②1ページに1つのみ
③header/nav/aside/footer/article/sectionの中にでは使わない

article要素の定義

①単独で成り立つもの
②ページ内でmainコンテンツの中で使用
③トップページの新着情報などに使う
④フォーラムの投稿、雑誌や新聞の記事、ブログの記事などで使う

section要素の定義
①ページ内の文章の区切りなどに使用
②レイアウトの目的使用しない。使用する場合は、<div>を使う
③見出し（Hタグ）が無いを箇所は<section>を使用しない

sectionやairticleタグは、h1を使うことができる。（通常h1はページ内に１つ）
【JavaServlet】千里の道も一歩から　一歩目

#Servletとは
WebアプリケーションをJavaで実現するための仕組み
#Webアプリケーションとは
会員制のサイトを例に挙げる

1. クライアント（PCやスマホ）に、ユーザ情報を入力してログイン
2. サーバーが、送られてきたユーザ情報を受け取る
3. データベースなどを利用してユーザやパスワードが合ってるか確認する
4. 合っていたらマイページを表示、間違っていたらログイン画面に戻してエラーメッセージを表示

ざっと下のようなイメージ
<img width="496" alt="servlet2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/68126027-ec78-eb27-3f31-bc4156b81ba7.png">
サーバーに送る情報を「リクエスト」、サーバーから送られてくる情報を「レスポンス」という
また、クライアントの画面はHTMLではなくjspと呼ばれるファイルで構成される（中身はほぼHTMLと同じで、javaのコードも書くことが可能）
#なぜ素のサーブレットか
個人的にはいきなりStrtusやSpringといったフレームワークをやるより、手作業でWebアプリケーションを作ってみて処理の流れを肌で感じるのも大切なことだと思います
#プロジェクト作りましょう
前置きが長くなりましたが、さっそく作っていきます
Eclipseの[パッケージ・エクスプローラー]にカーソルおいて右クリック
[新規]-[その他]の順にクリック
<img width="419" alt="servlet1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/0e515497-12da-f231-8a1d-63ac9f5f7dab.png">
[web]-[動的webプロジェクト]の順にクリック
※検索に「動的」と入れると早い
<img width="428" alt="2020-05-24 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/ca8cb593-ad95-003e-fdb8-d86974c3092d.png">
プロジェクトに任意の名前を入力して[次へ]をクリック
他の項目は基本的には触らないが、[ターゲット・ランタイム]と[動的webモジュールバージョン]の値は後で必要になるので覚えておく
<img width="428" alt="2020-05-24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/720d6cae-491c-c1a4-0203-478a032f307f.png">
[次へ]をクリック
<img width="428" alt="2020-06-01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/cc27d2ba-9e44-c851-c51b-83386cf50a9d.png">
[web.xmlデプロイメント記述子の生成]にチェックを入れて[完了]をクリック
<img width="428" alt="2020-06-01 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/fa07abb6-fb2b-aa68-fdb9-8ad4eb43676e.png">
完了！
#サーバー作りましょう
TomcatとApacheを別途用意する方法もあるが今回はEclipseに内蔵しているTomcatで実施
[ウィンドウ]-[ビューの表示]-[その他]の順にクリック
<img width="330" alt="servlet3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/21fd1783-8a5b-1bd5-2408-fd635f5de741.png">
[サーバー]を選択してOKをクリック
※検索に「サーバー」と入れると早い
<img width="233" alt="2020-05-24 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/50297911-5548-2f1f-bcbb-30ce1cb89701.png">
これによってEclipse上に[サーバー]が表示されるので、その領域内で右クリック
[新規]-[サーバー]の順にクリック
<img width="312" alt="servlet4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/c82ee485-f265-3500-1954-041c0f235dc9.png">
[サーバーのタイプを選択]から、[プロジェクト作成時](#プロジェクト作りましょう)で覚えておいた[ターゲット・ランタイム]と同じTomcatバージョンになるようなサーバーを選択して[次へ]をクリック
<img width="428" alt="2020-05-24 (3).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/f8ebf7b3-f7e2-9c88-ceb2-86316739222e.png">
[使用可能]欄から、先ほど作成したプロジェクトを選択して[追加]をクリック
<img width="428" alt="2020-05-24 (4).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/593de5fd-63b2-bff2-fcf3-40371d6c81dc.png">
[構成済み]欄に移ったことを確認したら[完了]をクリック
<img width="428" alt="2020-05-24 (5).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/cbc2ca95-a800-15b9-2df9-6fd4451ab047.png">
完了＆環境構築終了
次からファイルを作成していくよ
[【JavaServlet】千里の道も一歩から　二歩目](https://qiita.com/hatopo/items/4fb619529fec04f1ad6e)
指定時間以降バックアップ完了確認

指定時間以降にバックアップが完了したか確認する関数

```Powershell
Function Check-CompleteWindowsBackup($Stime)
{

	$filter = @{Logname='Microsoft-Windows-Backup';Id='14';StartTime=$Stime}

	Try{

		$temp = Get-Winevent -FilterHashtable $filter -ErrorAction Stop

		if($temp.count -gt 0){
	
			Return $True;

		}else{
	
			Return $False;

		}

	}Catch{

		Return $False;

	}

}
```

10分毎繰り返し（完了すると終了処理へ）
```Powershell
$count = 0;

for($i = 1;$i -le 24; $i++)
{



}
```
ワークフローからプロセスビルダーへの移行

１．ワークフローの代わりにプロセスビルダーを使用すべきなのはなぜですか?
２．プロセスビルダーで使用できて、ワークフローで使用できないアクションはどれですか?
３．ワークフロールールをプロセスに変換する工程のステップの正しい順序を選択してください。
４．ベストプラクティスは次のうちどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/0fbde45c-436d-5ec4-7133-d0c6e41c8323.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/4832afa0-8c20-4dab-2d8c-b69aebd780ca.png)
LightGBMの論文を読んだ記録

## はじめに
[LightGBM:A Highly Efficient Gradient Boosting Decision Tree](chrome-extension://ohfgljdgelakfkefopgklcohadegdpjf/https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf)
を読んだので記録しておきます。機械学習はど素人なので間違いや見当違いな点がありましたらぜひご指摘いただきたいです。

## LightGBMとは
GBDT(Gradient Boosting Decision Tree,勾配ブースティング決定木)のなかで最近人気のアルゴリズムおよびフレームワークのことです。マイクロソフトの方々が開発されています。

LightGBMには新しい点が2つあります。1つ目はGOSS(Gradient-based One-Side Sampling)、2つ目はEFB(Exclusive Feature Bunding)です。
LightGBMは名前にlightとついている通り、軽い(計算が早く、メモリ消費が少ない)ことが売りのアルゴリズムです。GOSSはデータを減らす工夫、EFBは特徴量を減らす工夫となっています。

この論文は
1. Introduction
2. Preliminaries(準備)
3. GOSS
4. EFB
5. Experiments
6. Conclusion
という構成になっています。この投稿では理論部分である2〜4を扱います。

## 準備：なぜGOSSやEFBが必要なのか
決定木のアルゴリズムで一番時間がかかるのは木の構造を決める(つまりどこで分割するかを決める)部分だそうです。これを短縮することで効率的に学習が行えます。

そのためにXGBoostというアルゴリズムでは特徴量をヒストグラムを使って離散的なグループに分け、グループの境界だけで分割を試すという工夫がなされました。これによりあらゆる点で分割を試すsklearnやRのgbmパッケージよりXGBoostは効率的に学習が行えました。
(以前投稿したXGBoostの記事も参考にしてみてください [XGBoostの論文を読んだ記録](https://qiita.com/shoutaqiita/items/1379ca4ff41bb0cdfbce))

LightGBMではこのヒストグラムによるアプローチを取り入れた上で、さらに
1. GOSSを使ってデータを減らす
2. EFBを使って特徴量を減らす
ことに成功しています。

データを減らしたり、特徴量を減らしたりする手法は他にもありますが、
- SGD以外の手法はAdaBoostをベースにしているのでGBDTにはそのまま使えない
- SGDを使うと正確性が損なわれる
という理由であまり望ましくないようです。(この理由は私にはよく分かりませんでした)

## GOSS
一般に決定木のアルゴリズムが分割する場所を探す際には勾配が計算されます。
そしてGBDTでは勾配が小さいデータは誤差が少ないことと同義です。もしそうした既によく訓練されているデータを省ければ訓練の効率を上昇させることができます。

ですが単純に勾配が小さいデータを消すとデータの分布が変わってしまい、正確さが損なわれます。
そこでGOSSでは以下の方法でデータを減らしています。
1. 勾配が大きいものは全て残す (例として上位60%を残すとします)
2. 勾配が小さいものに対してはランダムサンプリングを行う (例として全体の10%分を残し、残り30%は消すとします)
3. ランダムサンプリングしたものはデータ数がもとに戻るように定数倍する (この例では10%分のデータを4倍すればデータ分布は崩れません)
これがLigthGBMの行う工夫の1つ目、GOSSです。

## EFB
特徴量がたくさんあるデータでは、スパース(ほとんどの値が0)になることがしばしばあります。
ほとんど0の特徴量同士を結合させ、特徴量の数を減らすことができれば、より効率的に学習が行えます。
これがEFBの基本となる考え方です。

そのためには
1. どうやって結合させる特徴量を選ぶか
2. どうやって結合させるか
の2つが問題となります。

### (1)特徴量の選び方
もし2つの特徴量が同時に0以外の数をとる、ということが起きないならその2つの特徴量は結合できます。すごく簡単な例だと、男かどうかという特徴量と女かどうかという特徴量は同時に0以外の数を取らないため、1つにまとめられます。
また多少は衝突(同じインスタンスに対してどちらも0以外の値をとる)してしまっても、衝突率が小さければあまり情報を失わずにまとめることができます。

こうした衝突率の小さい特徴量の選び方の問題はNP-hard(最適解を多項式時間で見つけることは困難)だそうです。なので近似解を見つけるためにグラフの色分け問題に帰着させ、探索します。各特徴量を頂点として幾何的に考えるようですが、詳細は分かりませんでした。

### (2)特徴量の結合の仕方
例えばA特徴量が0〜10、B特徴量が0〜20の値をとるとします。
この時Bの全ての値に+10してBの範囲を10〜30に変えてあげれば、AとBの情報をきれいに分けることができます。なお論文ではずらす項はoffsetと呼んでいました。

## まとめ
これまで見てきたように、LightGBMではGOSSとEFBという2つの方法により効率的に訓練を行うことができます。論文ではXGBoostを比較しても有意に良い結果が出ていました。
Golang sync.WaitGroupとsemaphoreを使って10並列で画像ダウンロード

sync.WaitGroupとsemaphoreを使って10並列で画像ダウンロードするサンプルスクリプトです。
並列実行数が10を超過しないように、semaphoreを使っています。便利です
[sync.semaphore](https://github.com/golang/sync/blob/master/semaphore/semaphore.go#L40) の実装を読んでみると面白いですよ

[golang.org/x/sync/semaphoreを使ってゴルーチンの同時実行数を制御する](https://blog.lufia.org/entry/2018/01/26/141300) を参考にしつつ実装してみました


```go:main.go
package main

import (
	"context"
	"fmt"
	"io"
	"net/http"
	"os"
	"sync"

	"golang.org/x/sync/semaphore"
)

var wg *sync.WaitGroup
var sm = semaphore.NewWeighted(10) // 10並列で取得
var maxPage = 50                   // 最大ページ取得数

// main 実行方法: GO111MODULE=off go run main.go
func main() {
	// 検索元: https://www.jisc.go.jp/app/jis/general/GnrJISSearch.html
	target := map[string]string{
		"X0001": "kAIAALDEpH2u0O895seN",
		"X0002": "UQMAALzrEixtvmtcZ4zt",
		"X0003": "VAMAACJ6MCttlyDSqCTz",
	}

	for name, pageUrl := range target {
		if pageUrl == "" {
			continue
		}
		download(name, pageUrl, maxPage)
	}
}

func download(name string, pageUrl string, maxPage int) {
	wg = &sync.WaitGroup{}
	makeDir(fmt.Sprintf("page/%s", name))
	for i := 1; i <= maxPage; i++ {
		wg.Add(1)
		go getImage(name, pageUrl, uint(i))
	}
	wg.Wait()
}

func makeDir(path string) {
	os.Mkdir(path, 0777)
}

func getImage(name string, pageUrl string, page uint) {
	defer wg.Done()
	// 並列実行数を制御
	if err := sm.Acquire(context.Background(), 1); err != nil { // 指定した同時実行数制限smから1つ実行権限を取得。上限に達していて取得できない場合は、取得でき次第、実行を開始
		fmt.Println(fmt.Sprintf("sm.Acquire(ctx, 1) error. err: %+v", err))
		return
	}
	defer sm.Release(1) // 最後にsm実行権限枠を1つ空ける

	sb := map[string]string{
		"X0001": "pdfb2",
		"X0002": "pdfa7",
		"X0003": "pdfb5",
	}
	serverName, _ := sb[name]

	// https://www.jisc.go.jp/pdfb5/PDFView/GetImage/VAMAACJ6MCttlyDSqCTz?pageNo=1&width=1200&seq=0
	urlBase := "https://www.jisc.go.jp/%s/PDFView/GetImage/%s?pageNo=%d&width=1200&seq=0"
	url := fmt.Sprintf(urlBase, serverName, pageUrl, page)
	fmt.Println(fmt.Sprintf("[+]start PagetNo.%d url:%s", page, url))
	// 画像データ取得と取得結果をHTTP Statusで振り分け
	response, err := http.Get(url)
	if err != nil {
		return
	}
	if response.StatusCode >= 300 {
		return // HTTP Statusが300以上で取得失敗
	}
	defer response.Body.Close()

	// 画像ファイル保存
	filePath := fmt.Sprintf("./page/%s/%d.png", name, page)
	file, err := os.Create(filePath)
	if err != nil {
		return
	}
	defer file.Close()

	io.Copy(file, response.Body)
}

```

実行結果
<img width="826" alt="スクリーンショット 2020-05-24 21.38.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65312/e16be92e-cdb1-1d94-17c7-60cf967006f3.png">
Java Scriptの基礎

####JavaScriptとは
`JavaScript`とは、プログラミング言語の一つで、1990年代中盤に登場しました。
サイトのプルダウンや画面を更新しないでサーバーと通信したい時に使われます。
略称は、`JS`です。
####HTMLへの導入方法
htmlファイルと同じ階層にJSファイルがある場合htmlファイルに以下のように記述するとJSファイルが読み込まれます。

```index.html
<head>
  <script src="script.js"></script>
</head>
```
headタグ内にある、`scriptタグ`の`src`属性にファイル名を記述します。JSの拡張子は`.js`です。

####window.alert()
ブラウザにアラートを表示させるメソッドです。
表示させたい値を引数にとります。また、変数でも可能です。

####console.log()
ブラウザのコンソールにテキストを表示させるメソッドです。
表示させたい値を引数にとります。また、変数でも可能です。

変数での記述方法は以下になります。

```script.js
var team = "鹿島アントラーズ";
console.log( team + "の勝利です。");
```
コンソールが面に 鹿島アントラーズの勝利です。 が表示されます。

####変数宣言について
`var`はES6バージョンの書き方です。
それ以降の変数宣言の仕方としては。
・let
・const
の二つが用いられます。

`let`は、後で書き換えられ変数宣言です。
`const`は、後で書き換えられない変数宣言です。


####条件分岐

```script.js
let number = 100;
if (number % 15 == 0) {
console.log(number + "は、３と５の倍数です。");
} else if (number % 3 == 0) {
console.log(number + "は、３の倍数です。");
} else if (number % 5 == 0) {
console.log(number + "は、５の倍数です。");
} else {
console.log(number + "は、３の倍数でも、５の倍数でもありません");
}
```

上記のように記述するとコンソールに、100は、５の倍数です。　と表示されます。
ifの後のカッコ内に条件式を記述します。その条件に当てはまった場合は、波カッコ無いの記述が処理されます。
最初の条件式が偽だった場合は、else if以降に処理が移ります。その条件が真だったら波カッコ内の処理を開始、偽だった場合はさらに次に進みます。elseはどの条件にも当てはまらなかった場合に出力したい処理を記述します。

####配列
JSには配列という概念があります。

```script.js
let name = ["takuya", "shingo", "tsuyoshi", "masahiro", "GORO"];
console.log(name);

##コンソールでの表示
(5) ["takuya", "shingo", "tsuyoshi", "masahiro", "GORO"]


---------配列の数を取得---------
lengthメソッドを使います。
------------------------------
console.log(name.length);

##コンソールでの表示
5

---------配列の最後に要素を追加---------
pushメソッドを使います。
-------------------------------------
name.push("morikun");
console.log(name);

///"morikun"が追加されます。

##コンソールでの表示
(6) ["takuya", "shingo", "tsuyoshi", "masahiro", "GORO", "morikun"]

---------配列の最後の要素を削除---------
popメソッドを使います。
-------------------------------------
name.pop();
console.log(name);

///"morikun"が削除されます。

##コンソールでの表示
(5) ["takuya", "shingo", "tsuyoshi", "masahiro", "GORO"]

---------配列の最初の要素を削除---------
shiftメソッドを使います。
-------------------------------------
name.shift();
console.log(name);

///"takuya"が削除されます。

##コンソールでの表示
(4) ["shingo", "tsuyoshi", "masahiro", "GORO"]
```

popメソッドとshiftメソッドに指定して複数の要素を削除することはできません。


####オブジェクト
波カッコを使ってオブジェクトを生成します。
{}内に名前と値をセットにして管理します。このセットのことをプロパティと言います。
最初からオブジェクトにプロパティを定義して生成することもできますし、空の波カッコで生成することもできます。

```script.js
let takuya = { name: "kimura", age: 40, team: "SMAP" };
console.log(takuya);

###コンソールでの表示
{name: "kimura", age: 40, team: "SMAP"}

///名前がteamにあたる値を取得
console.log(takuya.team);

###コンソールでの表示
SMAP

///名前がageにあたる値を更新
takuya.age = 47;
console.log(takuya.age);

###コンソールでの表示
47
```

####for文
繰り返しの構文です。

`for(let i = 0; i < 繰り返す回数; i += 1) {繰り返す処理}`と記述します。

```script.js

num = 1;
for (let i = 0; i < 10; i += 1) {
console.log(num + "回目の出力になります！");
num += 1;
}

###コンソールでの表示
1回目の出力です。
2回目の出力です。
3回目の出力です。
4回目の出力です。
5回目の出力です。
6回目の出力です。
7回目の出力です。
8回目の出力です。
9回目の出力です。
10回目の出力です。
```
Flutter の Todo アプリサンプル

# 完成イメージ

![ezgif-3-b8a1b85bd875.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45822/b86e5e3a-5ef8-c53a-25fa-a616882552c6.gif)

# コード

main に書き連ねているだけのサンプルです。

```dart:main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: TodoList(),
    );
  }
}

class TodoList extends StatefulWidget {
  @override
  TodoListState createState() => TodoListState();
}

class TodoListState extends State<TodoList> {
  List<String> _todoItems = ['task1', 'task2', 'task3', 'task4'];

  void _addTodoItem(String task) {
    if (task.length > 0) {
      setState(() => _todoItems.insert(0, task));
    }
  }

  Widget _buildTodoList() {
    return ListView.separated(
      itemCount: _todoItems.length,
      itemBuilder: (context, index) {
        return _buildTodoItem(
          context,
          _todoItems[index],
          index
        );
      },
      separatorBuilder: (context, index) {
        return Divider();
      },
    );
  }

  Widget _buildTodoItem(BuildContext context, String todoText, int index) {
    return Dismissible(
      // Show a red background as the item is swiped away.
      background: Container(color: Colors.red),
      key: Key(todoText),
      onDismissed: (direction) {
        setState(() {
          _todoItems.removeAt(index);
        });

        Scaffold
            .of(context)
            .showSnackBar(SnackBar(content: Text("$todoText dismissed")));
      },
      child: ListTile(title: Text(todoText)),
    );
  }

  Widget _floatingButton() {
    return FloatingActionButton(
      onPressed: () => {
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => Scaffold(
            appBar: AppBar(title: Text('New task'),),
            body: TextField(
              autofocus: true,
              onSubmitted: (val) {
                _addTodoItem(val);
                Navigator.pop(context);
              },
              decoration: InputDecoration(
                hintText: 'タスクをどうぞ',
                contentPadding: const EdgeInsets.all(16.0),
                )
              ),
            )
          )
        )
      },
      child: Icon(Icons.add)
    );
  }

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Todo')),
      body: _buildTodoList(),
      floatingActionButton: _floatingButton(),
    );
  }
}
```

# 参考

https://medium.com/the-web-tub/making-a-todo-app-with-flutter-5c63dab88190
https://pusher.com/tutorials/flutter-listviews
https://flutter.dev/docs/cookbook/navigation/navigation-basics
https://flutter.dev/docs/cookbook/gestures/dismissible
【Rails】ぼっち演算子について

# ぼっち演算子「&.」
レシーバであるオブジェクトが
・nilの場合nilを返す
・nilでない場合、その後の処理を行う

# 書き方
ぼっち演算子の使い方は
「オブジェクト&.メソッド」
になります。

sessions_controller.rbを例に使い所をみていきます。

```app/controller/sessons_controller.rb
class SessionsController < ApplicationController

  def new; end
  
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user&.authenticate(params[:session][:password])
      log_in user
      redirect_to user
　   else
      flash.now[:danger] = 'Invalid email/password combination'
      render :new:
    end
  end

  def destroy
    log_out
    redirect_to root_url
  end
end
```

railsチュートリアルでは以下のように書かれています。

```app/controller/sessons_controller.rb
# ...
def create
   user = User.find_by(email: params[:session][:email].downcase)
   if user && user.authenticate(params[:session][:password])
# ...
```
Railsチュートリアルの書き方はuserが存在する場合、&&以降の処理を実行するという流れです。userが存在しなけれはnilが返されそれ以降の処理は実行されません。
どちらにするかは好みかと思われますが、ぼっち演算子を使った方が記述が簡単かもしれませんね。

# その他メモ
・Ruby2.3で追加された演算子
・「&.」の姿が膝を抱えている人に見えることがからぼっち演算子という名前がついたとのこと
・オブジェクトさんがいなかったら(nil)、メソッド使って遊ぶことができないから寂しくてnilを返す、ぼっちな演算子。
【学習メモ】AWS（VPC）


##【VPC】ネットワーク構築
【基本手順】
1.ネットワーク（VPC）を構築
2.その環境で、サーバー（EC2など）を設置
3.必要なアプリを実装


【ネットワーク構築の全体像】
**＜目標成果物：WordPressでのシステム構築＞**
1.インターネットからWebサーバーへ接続
2.Webサーバーに格納されているWordPressからDBサーバーのMySQLにデータを格納する

【AWSのネットワークの概念】
リージョン：AWSのサービスが提供されている地域

アベイラビリティゾーン：独立したデータセンター
※1つのリージョンに複数のアベイラビリティゾーンがあることで、1つのデータセンターが壊れても他のデータセンターが稼働できる

VPC：AWS上に仮想ネットワークを作成するサービス

サブネット：VPCを細かく区切ったネットワーク
例：
「インターネットから見れるようにしたい」
「DBはネットから見れないようにしたい」
など用途によって分ける
→サブネットは、アベイラビリティゾーンの中に作成

【IPアドレス】
＜イメージ＞
<img width="558" alt="スクリーンショット 2020-05-23 15.44.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/92431c83-62b2-c507-dcd8-6c26c43c27fe.png">

＜IPアドレスとは＞
ネットワーク上の機器を識別するためのインターネット上の住所

①パブリックIPアドレス
・インターネットに接続する際に使用するIPアドレス
・プロバイダーやサーバー事業者から貸し出される

②プライベートIPアドレス
・インターネットで使用されないIPアドレス
・使用可能な範囲は下記の通り。この中であれば自由に使用可能

10.0.0.0〜10.255.255.255
172.16.0.0〜172.31.255.255
192.168.0.0〜192.168.255.255

・社内LANの構築やネットワークの実験時はプライベートIPアドレスを使用する

※IPアドレスは、「ネットワーク部（前半3つ目）」と「ホスト部（後半の4つ目」に区分けできる

ネットワーク部：固定
ホスト部：可変＝任意の数を設定できる

CIDR表記
サブネットマスク表記

設定するネットワークのIPアドレス（例）
VPC：10.0.0.0/16
パブリック：10.0.10.0/24
プライベート：10.0.２0.0/24

＜作業の手順＞
①VPCを作成する
②サブネットを作成する
③ルーティングを設定する

###①VPCの作成

トップ画面からVPCを検索し作成
CICDブロックには、今回設定するIPアドレスを記入する。

＞VPC：10.0.0.0/16
<img width="774" alt="スクリーンショット 2020-05-24 20.42.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/919f79e2-2ecb-72a3-18d6-1924495ee038.png">

設定が完了すると、VPCトップページに戻り、「CIDRブロック」タブをクリックすると確認できる。

###②サブネットを作成
設定したVPCから、パブリックサブネッt・プライベートサブネットのIPアドレスを範囲指定する

AWSのサブネット画面に移動し、サブネットの作成をクリック。
VPCは、先ほど指定したVPCを選択。
CIDRブロックは、任意の内容。

<img width="768" alt="スクリーンショット 2020-05-24 20.51.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/1e213041-1c53-be1f-5d66-4f9fd52be943.png">

###③ルーティングの設定
ゴール：パブリックサブネットからインターネットに接続できるようにしたい
（１）インターネットゲートウェイを作成しVPCにアタッチする
（２）ルートテーブルを作成し、パブリックサブネットに紐付け

が、現状Webサーバーがインターネットに接続できない状態で、接続できるようにする設定を、ルーティングという

ルートテーブルは、「宛先のIPアドレス」と「次のルーター（AWSではターゲット」という書式で設定する

インターネット接続を可能にするために、「インターネットゲートウェイ」を作成


**（１）インターネットゲートウェイを作成しVPCにアタッチする**

VPCを開きインターネットゲートウェイの作成を押し、作成する。すると、こんな感じで出来上がる。

<img width="149" alt="スクリーンショット 2020-05-24 21.14.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/9c643ed4-2d2c-6a35-4fc3-f54fbeb9c60d.png">

detachedの状態なので、アクションタブから「VPCにアタッチ」を選択

<img width="513" alt="スクリーンショット 2020-05-24 21.16.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/01cba096-12d5-5d89-8d15-3f63aa789d6e.png">

**（２）ルートテーブルを作成し、パブリックサブネットに紐付け**
ルートテーブル項目から選択して作成。


<img width="576" alt="スクリーンショット 2020-05-24 21.20.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/9d824fa6-ef6d-f27e-f78b-71d373d70a4c.png">


これで関連付けができればOK
デフォルトルートをインターネットゲートウェイに設定

<img width="599" alt="スクリーンショット 2020-05-24 21.22.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/3ff51138-577a-5066-7bef-a5ef95367d75.png">

パブリックサブネットにも適用させる。
関連付けの編集から編集。

<img width="583" alt="スクリーンショット 2020-05-24 21.23.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/0b957ae9-f927-024b-e01b-eb6313e1647a.png">

その後はルートタブから作成して適用させる。
WebAssemblyをwindows上で使用する

# はじめに
Web画面の開発などでは良くJavaScriptが使用されていますが複雑な処理を行うと動作が遅くなる場合があります。
そのため、より早くより効率的に開発をするためにCやC++といったコンパイル可能な言語を使用してWebの開発を可能にしたものがWebアセンブリになります。
Emscriptenを使用してWindowsの開発環境を作る方法は[公式](https://emscripten.org/docs/index.html)に記載されていますが、自分の悩んだところやエラーなどを含めてまとめてみました。

# 環境
 - windows 10
 - python:3.6.5
 - emcc:1.39.16
 - clang:11.0.0

# 環境作成
2020/05/24時点で、EmscriptenはGit上からソースを取得してインストールを行う方法しかないようです。
GitのクライアントをWindowsに入れたくないため、GitHubのWebからソースをダウンロードしてインストールしています。

## ソースのダウンロード
[GitHubのサイト](https://github.com/emscripten-core/emsdk)からダウンロードして解凍するか
クローンすることでソースを取得します。
解凍先のパスに日本語が入っていると後々エラーするため日本語のないパスの方が良いです。

## インストール
・コマンドプロンプトを起動する
   ※フォルダの場所によっては管理者として実行が必要

・ソースを配置したフォルダに移動する
   自分はC:\webassenbleに配置したので以下のコマンドになります。
   コマンド:``` cd C:\webassenble\emsdk-master ```

・インストール
   配置したソースの中にemsdkがあるはずなのでそれを使用してインストールを行います。
   Emscriptenはバージョンの指定をしてインストール更新が可能になっており、今回はlatest(最新)を入れています。
   このコマンドを実行した後に大体10分ほど時間がかかります。
   コマンド:``` emsdk install latest ```

コマンド結果

```
Installing SDK 'sdk-releases-upstream-ae5001f
～～～～　略　～～～～～
Done installing SDK 'sdk-releases-
```

・設定更新
   Emscripten用の設定を行います。この設定はWindows自体には設定されずにユーザのフォルダの直下のファイルに設定されます。
   コマンド:``` emsdk activate latest ```

コマンド結果

```
Writing .emscripten configuration file to user home directory
～～～～　略　～～～～～
dows Registry, rerun this command with the option --global.
```

・設定反映
   現在開いているコマンドプロンプトに環境設定を読み込みます。
   コマンド:``` emsdk_env.bat ```

・インストール確認
   インストールできたかを確認します。このコマンドでバージョン等が出てくればOKです。
   この時にパスなどに日本語が含まれるとエラーします。
   コマンド:``` emcc -v ```

# 実行
実行するには実行したいC/C++ファイルを作成して、上でインストールしたEmscripten用のプロンプト上でコンパイルします。

## C/C++ファイルの作成
今回は新しい言語に遭遇したときにお決まりとなるhelloworldを表示するプログラムを作成します。

``` cmain.cpp

#include <stdio.h>

int main() {
  printf("hello, world!\n");
  return 0;
}
```

## Emscripten用のプロンプト起動
ダウンロードしてきたemsdk-masterの下にある``` emcmdprompt.bat ```をダブルクリックしてEmscripten用のコマンドプロンプトを起動します。

## コンパイル
作成したC++ファイルのフォルダまで移動して``` emcc ```コマンドでコンパイルを行います。
3分ほどしてコンパイルが成功すると、今いるフォルダに``` a.out.js ```と``` a.out.wasm ```ができています。
コマンド:``` emcc cmain.cpp ```
※この時も場所によっては管理者による実行が必要になります。


## 実行
``` a.out.js ```をnodeで実行するとhello, worldが表示されていることがわかります。

```
>node a.out.js
hello, world!

```

# おわりに
Webアセンブリについて、公式の手順通りにインストールして実行してみました。
比較的簡単にできましたが、ところどころつまずく点や考える点などがありました。
次回以降はこの環境を使ってもう少し色々なことをしていこうと思います。