OmniAICreator/Qiita-1.07M huggingface dataset:
Miner から見たハッシュパワー買い手のメリットのメモ

## 背景

GPU とかで仮想通貨をマイニングしている.
Nicehash とかでハッシュパワーを売る(相手先としてハッシュパワーを買う人がいる)市場があるが, ハッシュパワー買い手の利点はなにがあるだろうか?

## Miner(ハッシュパワーの売り手) の収益

マイニング装置(e.g. GPU, ASIC)と電気代とインターネット通信費をかけ, 仮想通貨をマイニングして仮想通貨として収益を得る.
状況によっては直接マイニングするするより Nicehash に売ったほうが収益がよいときもある.
(あとは BTC のように GPU マイニングでは直接マイニングできないコインを得たいときとか)

Miner 側のメリット(行動パターン)はわかりやすい.

## ハッシュパワーの買い手

1 BTC 投じてハッシュパワーを買い, それでマイニングして 1 BTC 以下(手数料など引いたのち)を得たのでは収益は出ない.

DeFi なりで貸出するとき以上のリターンが望めるのが必要.


https://static.nicehash.com/marketing%2FNiceHash_Buying_Guide_2020.pdf

第一と第二のルールで計算せよ, とある. 何かしら収益が得られるタイミングは存在するようである.

How to make a profit from buying hash power from nicehash?
https://www.reddit.com/r/NiceHash/comments/8sp305/how_to_make_a_profit_from_buying_hash_power_from/

diff が変わるときなどにハッシュパワーが大きいと得られるリターンも大きくなるときがある.

ハッシュパワーレンタル期間で difficulty が下がる(取り分が増える)のが想定されるときであろうか.

### 先物, オプション市場?

DeFi なりで, ハッシュパワーや仮想通貨の先物市場, オプション市場があり, 一定のハッシュパワーを買わないといけない状況にある顧客がいるのかもしれない.

#### HFT 市場?

「フラッシュボーイズ」のように, 短期的なハッシュパワーの変動(仮想通貨の価格変動)で鞘どりなどしているトレードプログラムがあるのかもしれない.

### pool 運営者

https://www.nicehash.com/support/hash-power-marketplace/general-help/why-would-someone-buy-hashing-power

ハッシュパワーが多いと reward が多くなる.

### 税務的なメリット?

nicehash などでは仮想通貨建てで決済するため, たとえば 1 BTC を保有したままではなく, 1 BTC を **利用** して 1 BTC を手に入れると, 同じ 1 BTC でも税務的なメリットがなにかあるかもしれない.


### 二次的市場?

日本でハッシュパワーを売るサービス(中身は nicehash に丸投げ)を提供する場合は, 消費税やサービス分を顧客から付加的に得られるかもしれない.
(たとえば日本円を受け取り対価としてハッシュパワーを提供だと, 仮想通貨交換業のライセンスはいらないような?)

その場合, サービス提供者はハッシュパワー購入においてはいくらか損をしてもかまわない.

#### 51% 攻撃?

51% 攻撃など, 一時的にハッシュパワーが得られるとなにか得をする買い手がいるかもしれない.

また, ある程度資本があれば, 小規模な PoW コインのハッシュパワーを上げて価格を吊り上げ, つよつよコイン感を醸し出し, 価格が上がったところで売り抜けるというのもありうるかもはしれない.
(株式市場でいう仕手株みたいな)

### GPU miner?

GPU マイナーからすれば, 実質的には GPU マイニングの収益で BTC のハッシュパワーを買っていると考えられるであろうか.

### その他

機関投資家向けにビットコインのハッシュパワー販売、米ニューヨークの仮想通貨マイナーが開始
https://jp.cointelegraph.com/news/new-york-power-plant-sells-bitcoin-hashpower-to-institutional-investors

グリーン投資みたいなのをうたってハッシュパワーを売るときに, 自社マイニングファームがハッシュパワー足りなくなったときに nicehash とかでハッシュパワーを買っているのかもしれない.

#### BTCST(Bitcoin standard hashrate token)

https://research.binance.com/en/projects/btcst

https://www.1-b.tc/

ハッシュパワーを裏付け担保にしたコイン. 保有する(staking?)ことでマイニング収入が得られる. マイニングファームの資産(BTC miner)をトークン化したものと考えられるでしょうか. 自身でマイニングする場合に対して, マイニング機器値上がりのヘッジとして利用できるらしい.　

nicehash や などと違い価格マーケットでの売買ではないため, ずっと保有しておくことができる.
ただ, マイニングファームの機材が古くなったり総ハッシュレートが上がるなどして, ハッシュパワーの価値が下がっていったらそのぶん BTCST の価格も下がっていくことになるでしょう.




## まとめ

ハッシュパワーの買い手, いろいろ収益となるタイミングはありそうだが, 基本は大口のプール運営者や機関投資家がメインと思われ, 個人がメインで手を出すにはあまり向いていそうな気はしない.
(DeFi なり取引所なりのステーキング(Saving)を狙ったほうが楽そう)

収益源の一部として考え, AI でよろしくハッシュパワー購入と売却のタイミングを自動化して運用するアルゴリズム作りたい.
【Play Flamework】 Javaプロジェクトの作成

#はじめに
皆さんおはこんばにちは。
エンジニア歴１年目、現場未経験の弱小自称 Web エンジニアです。

研修で Spring Boot を使った開発をしたことはあるのですが
今回、チーム開発で初めて Play Flamework を扱うことになったので
その記録を残そうと思い、本記事の作成にいたった次第でございます。

##環境
・MacOS Catalina バージョン10.15.7
・sbt 1.3.13

#sbtのインストール
>sbtとはビルドツールの一つで、Gradleと同じ立場のツールと言えます。
>基本的にPlayFrameworkでは、sbtを使ってビルドや実行を行う事になります。

Gradle とか Maven とかあったな〜。
Spring Boot の研修のとき訳もわからず使ってたンゴ（未だによくわかってない）

```terminal:ターミナル
$ brew install sbt
```

MacOS が Mojave の人はこれだけで簡単にインストールできるみたい。
拙者は Catalina だったからか、`brew install gcc`と`xcode-select --install`が必要だった。

#プロジェクトの作成（Java）
Play Flamework では、Java の他に Scala を使った開発もできるらしい。
今回は Java プロジェクトを作りたいので、以下のコマンドを実行。

```terminal:ターミナル
$ sbt new playframework/play-java-seed.g8
```
プロジェクト名はどうするか、パッケージ名はどうするか聞かれます。
プロジェクト名は適当に`qiita-play-api`とし、
パッケージ名は空欄のまま Enter を押しました。（デフォルト値として｢com.example｣が設定される）

```terminal:ターミナル
This template generates a Play Java project

name [play-java-seed]: qiita-play-api
organization [com.example]:
```

#実行
プロジェクトが完成したら、そのディレクトリに移動してプロジェクトを実行してみる。

```terminal:ターミナル
$ cd qiita-play-api
$ sbt run
```

おそらく初回作成時は、
拙者のPCに何をしよるんじゃああああああああああああああああああああああああ！！！！！！！！！！！
ってくらい長い長いログが出力されるかと思います。

```terminal
--- (Running the application, auto-reloading is enabled) ---

[info] p.c.s.AkkaHttpServer - Listening for HTTP on /[0:0:0:0:0:0:0:0]:9000

(Server started, use Enter to stop and go back to the console...)
```

上記のようなログが出力されたら、http://localhost:9000 にアクセスして

![PlayFlamework初期画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899358/c63216cd-e4cd-9676-bffc-9faae37c8a78.png)

↑こんな感じの陽気な画面が表示されたら一件落着。

#参考記事
・[【爆速環境構築】sbtを使ったPlayFramework2.7のプロジェクト作成方法【Java】](https://blogenist.jp/2020/02/21/10138/)
・[【Play超入門】Play FrameworkでWeb APIを作る ~導入編~【Scala】](https://qiita.com/ka2kama/items/6804d80936cd92b2405c)
【Python】対象物の画素値RGBの平均値を計算する

#1. 概要

今回紹介するのは、対象物の画素値RGBの平均値をcsvファイルに出力する処理です。
![apple_introduction.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565845/7189c79c-1d50-19bb-8dfc-edda9a38e6bc.jpeg)

りんごなど、対象物の画像の画素値の平均を求めたい！
という時に使用できます。この処理を構築した経緯としては、以前私がQiitaに投稿した記事にあります。↓
[【Python】サポートベクタマシン（SVM）を使って画素値からりんごと梨を分類][0]
[0]:https://qiita.com/ZESSU/items/3083ce23e0405565765d
この記事で取り上げた手法の前処理、「りんごと梨の画像それぞれのRGB画素値の平均値の取得」を行うために本処理を使用しています。

本処理をするにあたって必要な情報は対象物が映っている画像だけあればOKです。ただし、背景が入っていると正しく計算できないので、ペイントなどのアプリを使って下図のようにきれいに対象物だけをトリミングしておきます。
![apple_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565845/1389432f-eac0-8411-fa3e-be3bd5c48ffd.jpeg)

#2. 環境
画像処理でopenCV、そしてデータフレームとしてpandasを使用するので事前にこれらのライブラリのインストールをおねがいします。

```
pip install opencv-python
pip install pandas
```

#3. コード
コードはこちらになります。注意点としてはopenCVを使用するので、出力がRGBではなく、BGRの順番になります。

```bgr_csv.py
import cv2
import numpy as np
import pandas as pd

idir = 'input/'
odir = 'output/'
fname='apple'
num_photo=10
bgr = np.zeros((num_photo,3))

for k in range(num_photo):

    img = cv2.imread(idir + fname + '_' + str(k+1) + '.jpg')  #1番からスタート
    print(idir + fname + '_' + str(k+1) + '.jpg')
    h, w, c = img.shape #height, width, channnel

    #初期化
    l=0
    b_ave=0; g_ave=0; r_ave=0

    for i in range(h):
        for j in range(w):
            #画素値[0,0,0]（Black）を除外してピクセルの和とbgrの画素値の合計を計算する
            if(img[i,j,0] != 0 or img[i,j,1] != 0 or img[i,j,2] != 0 ):
                l+=1    #対象となるピクセル数を計算する
                #対象となるピクセルの画素値の和を計算する
                b_ave=b_ave+img[i,j,0]
                g_ave=g_ave+img[i,j,1]
                r_ave=r_ave+img[i,j,2]

    #画素値合計をピクセル数で除することでRGBの画素値の平均値を求める
    b_ave=b_ave/l
    g_ave=g_ave/l
    r_ave=r_ave/l

    bgr[k]=np.array([b_ave, g_ave, r_ave])

df = pd.DataFrame(bgr, columns=['blue', 'green', 'red'])    #opencvの並び準BGRに合わせる
df.to_csv(odir + fname + '.csv')

```

例えば、、、

```
fname='apple'
num_photo=1
```
とした場合は「input/apple_1.jpg」のファイル１つだけの各画素値の平均値を「output/apple.csv」として出力します。

#4. 結果

10個のりんごの画像を処理したら下のように、10個分のBGR画像の平均値を取得したapple.csvファイルが出力されます。

```apple.csv
,blue,green,red
0,39.88469583593901,28.743374377331637,137.23369201906283
1,83.72563703792319,79.59471228615863,164.77884914463453
2,66.8231805177587,74.52501570023027,141.8854929872305
3,55.2837418388098,45.28968211495237,148.4160869099861
4,37.59397951454073,49.82323881039423,137.30237460066527
5,53.68868757437335,50.963264366051206,142.6121454070861
6,51.277953772145956,64.07145371348116,152.98116860260473
7,50.47702848900108,48.37151099891814,124.46714749368914
8,40.35442093843233,52.0682126390019,137.8299091402224
9,48.18758094199441,55.87655919841865,145.6361529548088

```

概要にも記載の通り、このコードで出力したりんごと梨のcsvファイルを使って↓
[【Python】サポートベクタマシン（SVM）を使って画素値からりんごと梨を分類][1]
[1]:https://qiita.com/ZESSU/items/3083ce23e0405565765d
を行っています。こちらの記事も是非見てみてくださいね！
Capslockを○してCtrlを割り当てる

capslockを使う機会がないので、ctrlに変更します。

```regi:kill_capslock

REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00

```
[Unity]ヒットストップを作ってみる

## ヒットストップとは
ゲームで、攻撃がヒットした時に一瞬ゲームの流れが止まるようなあれです。スマブラのファルコンの膝や、モンハンの大剣などがイメージしやすいかなと。大技に多い印象です。

## やってみる
#### 前提
* 敵と、プレイヤーに `Box Collider` が付与されている
* 敵に `Enemy` というタグを設定する
* プレイヤーの右足に `RightFoot` というタグを設定する
* プレイヤーの攻撃モーションで、右足が敵に当たる

今回使ったもの
* プレイヤーのAsset : https://assetstore.unity.com/packages/3d/animations/hq-fighting-animation-free-33478
* エネミーのAsset : https://assetstore.unity.com/packages/3d/characters/animated-witch-and-dragon-monster-49955

#### スクリプト
プレイヤーのスクリプトを作成し、以下の記述を付け加えます。
敵と接触した時に発火される `OnCollisionEnter` を使います。

```c#
    Animator animator;
    private string enemyTag = "Enemy";
    private int count = 0;
    private bool isHitStop = false;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        // ヒットストップ中ならば
        if (isHitStop) {
            count += 1;
            // カウントが20いったなら、ヒットストップを元に戻す
            if (count > 20) {
                isHitStop = false;
                animator.speed = 1;
            }
        }
    }

    void OnCollisionEnter(Collision collision)
    {
        // 敵と接触したならば
        if (collision.collider.tag == enemyTag)
        {
            Debug.Log("敵と接触した！");
            animator.speed = 0.01f; // アニメーション速度を遅くし、ヒットストップを演出する
            isHitStop = true;
            count = 0;
        }
    }
```

これで、プレイヤーが敵と当たった時にヒットストップするようになります。
敵にも同じように判定を付けてあげれば、敵側も止まるようになります。

こんな感じ

![movie_003_Trim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/97286c28-7ca0-c547-cacd-391baa8162da.gif)
ローカルに建てたS3クローンMinIOにSparkからアクセスする時メモ

## はじめに

ローカルにたてた、S3クローンに対してSparkから読もうとした時に詰まったことめも。
（多分、AmazonEMRとS3使う場合は最初から依存JAR等が、セットアップされているハズなので、こんな事は必要ないはず）

## 環境
```bash
$ spark-shell --version
version 3.0.1

$ scala -version
Scala code runner version 2.12.11 -- Copyright 2002-2020, LAMP/EPFL and Lightbend, Inc.

$ java -version
openjdk version "11.0.4" 2019-07-16
```

## MinIO(S3互換オブジェクトストレージサーバ）の準備
S3互換のOSSであるMinIOを、Dockerで起動。ブラウザから、http://localhost:9000 にアクセス、ログイン出来ることを確認。

バケットを作成し、CSVファイルとかをアップロードしておく。

```bash
$ sudo docker run --rm\
                  -p 9000:9000\
                  -e MINIO_ACCESS_KEY=<アクセスキー>\
                  -e MINIO_SECRET_KEY=<シークレットキー>\
                  minio/minio\
                  server /data
```

## Sparkの準備

#### Sparkが依存しているHadoopのバージョンを確認する。
今回はSparkが`3.0.1`なので、MavenセントラルリポジトリにあるSparkCoreのPOMファイルを確認すると、どうやらHadoopの`2.7.4`に依存している模様。

#### hadoop-awsパッケージの`2.7.4`バージョンをMavenセントラルで探す
S3にアクセスするには、`hadoop-aws`という依存ライブラリが必要。Mavenセントラルで以下の依存ライブラリがみつかる。

```xml
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-aws -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-aws</artifactId>
    <version>2.7.4</version>
</dependency>
```

### Spark-shellの起動時に依存ライブラリを追加する

```bash
$ spark-shell --packages org.apache.hadoop:hadoop-aws:2.7.4
```

初回は、起動時に依存関係ツリーをもろもろダウンロード始めます。

## ローカルS3の読み込み
Spark-shellで`SparkContext.hadoopConfiguration`に諸々を設定する。

```scala
// MinIOで設定したアクセスキー、シークレットキーを設定。なお、環境変数でも設定可能
sc.hadoopConfiguration.set("fs.s3a.access.key","<アクセスキー>")
sc.hadoopConfiguration.set("fs.s3a.secret.key","<シークレットキー>")

// 設定しないと本家のAWS S3にアクセスしようとしてしまうので、MinIOのエンドポイントへ変更
// "localhost"では解決できないので、IP直接にする
sc.hadoopConfiguration.set("fs.s3a.endpoint","http://<ローカルIP>:9000")

// MinIOをhttpで建てているので、SSL通信を無効に
sc.hadoopConfiguration.set("fs.s3a.connection.ssl.enabled","false")

// 読める！
val df = spark.read.option("header","true").csv("s3a://<バケット名>/<ファイル名>")
```
【Java】アノテーションの使い方

#プログラミング勉強日記
2020年11月23日
Javadocについて調べたときにアノテーションについて知ったので、まとめる。

#アノテーションとは
　アノテーションは注釈、注記といった意味を表す英語で、プログラミング用語でも注意書きを追加する機能になり余白に文字を追加する機能。アノテーションを理解できればJavaのコードがより見やすくなる。
　アノテーションはデータの有無、データの数によって3種類に分かれる。

- 名前だけでデータのないマーカー(＠Override、＠Deprecatedなど)
- データ1つ持つ単位アノテーション(＠SuppressWarningsなど)
- 複数のデータを持つフルアノテーション

#よく使われるアノテーション

##`@Override`
　記述するメソッドが親クラスのメソッドをオーバーライドしていることを示す。親クラスにないメソッドをエラーにして、記述の間違いをなくすことができる。

##`@Deprecated`
　記述するメソッドの仕様が非推奨であることを示す。Javaのバージョンが新しくなっても、前の記述を残してきたいときなどに使う。

##`@SuppressWarning`
　引数にメッセージを指定することで、記述するメソッドによる警告を非表示にすることができる。

#その他のアノテーション
　上で紹介した3つのアノテーションとは別に、独自のアノテーションを定義するために用意されているメタアノテーションと呼ばれているものがある。

##`@Target`
独自に定義したアノテーションが何を対象としているか宣言するために使われる。クラスやメソッドに付けるのか、変数につけるのかを決める。

##`@Retention`
　コンパイル時やプログラム実行時にアノテーションの情報を保持するかどうかを決めるために使われる。

##`@author`
　作者の名前を記述する

##`@param`
　引数と引数の説明を記述

##`@return`
　戻り値の説明を記述

##`@exception`
　メソッドが投げる例外クラスとその説明を記述

##`@version`
　クラスやメソッドなどのバージョンを記述

##`@see`
　他の関連するクラスやメソッドなどの参照先を記述


#参考文献
[いまさら聞けない「Javadoc」と「アノテーション」入門 (1/4)](https://www.atmarkit.co.jp/ait/articles/1105/19/news127.html)
[【Java入門】アノテーションの使い方と作成する方法](https://www.sejuku.net/blog/22694)
[Javaの「アノテーション」とは？使い方・作り方を解説](https://ec-orange.jp/ec-media/?p=17791)
Laravelとmysqlが接続できない時に対処したこと（健忘録）

このエラーにかなり悩まされたので健忘録として記載します。
初学者の情報です。不備などあればご指摘いただければ幸いです。

#環境
・vagrant-docker-laravel
・docker-compose version 1.25.0
・PHP 7.2.34
・Laravel Framework 5.8.38
・mysql  Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using  EditLine wrapper
・phpmyadminを使用




#エラー内容( php artisan migrate 実行時 )
```
Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access 
denied for user 'root'@'172.23.0.3' (using password: NO) (SQL: select
 * from information_schema.tables where table_schema = laravel and
 *  table_name = migrations and table_type = 'BASE TABLE')
```

内容的にはアクセス拒否のようなことを言われていると思われます。


#今回の主な原因

######①Laravelとmysqlのパスワードの不一致
Laravelの.envファイルに記載されているmysqlパスワード　と　docker-compose.yml内に記載されているmysqlパスワードが不一致でありました。
.envファイルに関してはエディター上で編集すればOKです
.ymlファイルに関してはターミナルから入る。docker-compose.ymlがあるディレクトリまで移動して、

```
sudo vi docker-compose.yml
```
を実行してファイル内を編集します。
(※今回は両ファイルのmysqlパスワードを”root”に統一しました。)
ちなみに、パスワードを揃えると書きましたが、正確には「docker-compose.yml内のパスワードに合わせなければならない！！」です。
（その他の項目も全て.ymlが主導権を握っているらしい。。）

######②データベースの未作成
今回はphpmyadminを用いています。
そもそも、migrationをする前にテーブルが入るための箱（データベース）をphpmyadminに作っておかなければならなかったです。（ブラウザ上で操作）
ちなみにここで作るデータベース名は　.envファイルのDB_DATABASE=●●●で指定されている●●●と言う名前のデータベースを作っておくこと。

######③構文のミス
migrationファイル内の構文が間違っていました。
今回はtimestamps()とtimestamp()で引数の取り方が変わるため、構文エラーとなっていました。
構文エラーは多数あるため、その都度確認する必要があります。


#上記3点を改善した後

dbコンテナに入る

```
docker-compose exec db bash
``` 

Mysqlに接続

```
mysql -u root -p
```

●●●dbの存在を確認 

```
show databases;
```

dbを選択 

```
use ●●●;
```

dbコンテナを抜ける　

```
exit
```

Mysqlを再起動

```
service mysql restart
```

コンテナを立ち上げ直して接続

```
docker-compose up -d
```

#そして最後に

```
php artisan migrate
```

####→→→成功!!
【Java】メソッド（関数）

## 概要
この記事は私のJavaの学習なメモです。
Javaの メソッド、引数、戻り値に関して学んだ内容をアウトプットします。

# メソッド(関数)

## メソッド(関数)とは　
**「幾つかの 処理をまとめて入れておくもの」** です。
自分の場合、**「関数」** という呼び方のほうが馴染み深い気がしますが、** オブジェクト指向プログラミングで使う呼び方は「メソッド」らしいです。 **

め
たとえばゲームの開発をしているとして、「攻撃をする」という処理が記述されている メソッドがあったとします。
それを100ケ所で使う場合は、毎回同じコードを100回記述するのではなく、 メソッド を呼び出すだけで済みます。

「剣で攻撃をする」という処理を「魔法で攻撃をする」と修正する必要があったとしても
メソッド の処理を変えれば、100箇所に反映されます。
「一つの仕事は一つにまとめる」というのがプログラミングで大事な考え方で「DRY ( Don't Repeat Yourself )の原則」という言葉があります。
同じことを繰り返さないことによって、メンテナンスがしやすくなったり、開発そのものが簡単になります。

## メソッドの書き方
単純なメソッドの書き方はこちらです。

```java
アクセス修飾子 戻り値の型 メソッド名(引数の型 引数) {
}
```

1. アクセス修飾子 (省略可能)
2. 戻り値の型 
3. メソッド名
4. 引数の型, 引数

の順に記述していきます。
これらをもとに、引数に **ユーザーの名前** をつかって **文字を出力する** という 「printName」というメソッドをつくったとしたらこういう感じになります。

```java
    public void printName(String name) {
        System.out.println("私の名前は" + name);
    }
```


### 1. アクセス修飾子 (省略可能)
こちらは[アクセス修飾子の種類などについて以前書いた記事](https://qiita.com/takahirocook/items/50cbbdca8e21539170e9)で触れているのでこちらを参照していただけると嬉しいです。

public, protected, 記述なし, private の順番で規制が厳しくなります。

### 2. 戻り値の型 
「このメソッドを実行したら、**なんの 型 の値を返すのか**」というのをここで指定します。

### 3. メソッド名
**ここに書くのは処理のタイトルのようなもので、これがメソッドです。**
次回以降は「**printName()**」と記述するだけで記述した処理を行ってくれます。

### 4. 引数の型, 引数
この()←丸括弧の中にこのメソッドを実行する際に一緒に渡される値のことです。渡される値のことを **「引数」** といいます。



### メソッドの型と順番があっていれば 変数名が違っていても問題なし
EnCountTrainer.javaの enCountTrainer メソッドでは、変数名が、enemyPokemonName , myPokemonName となっていますが、
Main.javaでは、enCountTrainer.enCountMsg(..., ..., enemyPokemon, myPokemon) となってます。
渡す変数と受け取る変数の名前が違っていますが、これは問題ありません。


printTriangleArea メソッドは int型 を 2つ 受け取れるメソッドなので、その順番の通りに、変数の中身（今回の場合 int型 ）が受け渡されるため正常にメソッドは動きます。
とはいえ、呼び出し元と先であまりにも違いすぎるメソッド名は混乱しますので避けましょう。



[インスタンス]:https://qiita.com/takahirocook/items/ec01cdcbb440cf0d1cc4
[インスタンス化]:https://qiita.com/takahirocook/items/ec01cdcbb440cf0d1cc4
[アクセス修飾子]:https://qiita.com/takahirocook/items/e51b0b9d37d95ad587fe
[フィールド変数]:https://qiita.com/takahirocook/items/28df75a133049a74ece1
[new演算子]:https://qiita.com/takahirocook/items/00f9f97592bf50831d39
[カプセル化]:https://qiita.com/takahirocook/items/e469a7c0539a0012868e
[クラス]:https://qiita.com/takahirocook/items/50cbbdca8e21539170e9
[メソッド]:https://qiita.com/takahirocook/items/5bfe43576d87a2a4006c
[mainメソッド]:https://qiita.com/takahirocook/items/f4635915337303de338c
[メソッドの呼び出し]:https://qiita.com/takahirocook/items/f4635915337303de338c
[コンストラクタ]:(https://qiita.com/takahirocook/items/fa1822f2f22c3786593e)
[引数]:https://qiita.com/takahirocook/items/5e5b0ba79e869f4a592e
[Python]お買い物プログラム

#Pythonでお買い物プログラムを作る
```java:
items = {'apple': 100, 'banana': 200, 'orange': 400}
money = 1000
for item_name in items:
    print('--------------------------------------------------')
    print('財布には' + str(money) + '円入っています')
    
    print(item_name + 'は1個' + str(items[item_name]) + '円です')
    
    input_count = input('購入する' + item_name + 'の個数を入力してください：')
    print('購入する' + item_name + 'の個数は' + input_count + '個です')
    count = int(input_count)
    total_price = items[item_name] * count
    print('支払い金額は' + str(total_price) + '円です')
    
    if money >= total_price:            
        print(item_name + 'を' + input_count + '個買いました')            
        money -= total_price            
    else:            
        print('お金が足りません')            
        print(item_name + 'を買えませんでした')
```
#以上
「Unity と iPad で作る AR VFX の世界」のRCam2を使用する方法

# はじめに
<!-- 発端や概要を記載 -->
この記事では、高橋啓治郎さんが開発したRCam2を使用する手順を紹介します。

RCam2を使用した動画を掲載します。
[「Unity と iPad で作る AR VFX の世界」のRCam2を使用テスト](https://www.youtube.com/watch?v=O9G3fj7hC9E&feature=youtu.be)

RCam2のGitHubリポジトリです。
https://github.com/keijiro/Rcam2
ReadmeにRCam2を使用する手順が記載されていますが、私が分からなかった部分を含めて説明します。

こちらにRCam2がどのようなものであるかYouTubeにて紹介してくださっています。
https://www.youtube.com/watch?v=IqE14T3hf7Y&list=LL&index=8

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [必要な機材](#Chapter1)
1. [RCam2の環境構築方法](#Chapter2)
1. [感想など](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 必要な機材
- LiDARを搭載したiPad Pro
    - iPhone 12 Proで動作するかは未検証です。
- Macのパソコン
    - XCodeを使用してiOS向けにビルドするために必要です。
- Windowsのパソコン
    - iOSのアプリから動画などのデータを取得してエフェクトを表示する際に必要です。
- Wi-Fi
    - 同じWi-Fiに接続してデータを送るために必要です。
    - 動画をリアルタイムで送受信できる程度の通信速度が必要です。(遅いと画面がカクカクになります。)
    - 公共のWi-FiではパソコンとiPad Proの間でデータを送信することができない問題がありました。

<a id="#Chapter2"></a>
# RCam2の環境構築方法
- Macのパソコンで準備すること
    - iPad Proアプリの「RcamController」を用意する手順です。
        - https://github.com/keijiro/Rcam2/tree/master/RcamController このURLから「RcamController」のUnityプロジェクトをダウンロードします。
        - UnityでiOS向けにXCodeプロジェクトをビルド
        - XCodeでiPad Proにアプリをビルド
            - ※そのままだとビルド時にエラーが発生してしまうので、https://www.ndi.tv/sdk/#download からNDI SDK Software Develop Kitをインストールしてください。
- iPad Proで準備すること
    - Windowsのパソコンと同じWi-Fiに繋ぎ、ビルドした「RcamController」のアプリを開いてください。
- Windowsのパソコンで準備すること
    - https://www.ndi.tv/sdk/#download からNDI SDK Software Develop Kitをインストールしてください。
    - https://github.com/keijiro/Rcam2/releases/tag/v1.0.0 このURLからRcam2-1.0.0.zip
をダウンロードし、「RcamVisualizer.exe」を開く。
    - 画面左上のドロップダウンに、自身のiPad Proの名前が表示されるので、それを選択してください。
- iPad Proの「RcamController」アプリとWindowsの「RcamVisualizer.exe」がインターネット接続で繋がらないとき
    - https://pc-karuma.net/windows-10-firewall-enable-disable/ このURLを参考に、ファイアウォールを無効にするとうまく繋がる場合があります。
    - 公共のWi-Fiではないものに変更する。(とあるゲーム会社オフィスのゲスト用のWi-Fiで試そうとしましたが、セキュリティの設定が厳しいことが原因(?)で繋がらないことがありました。)
    - イーサネット(有線のインターネットのようなもの)を使用する。(私は検証できていません。)

<a id="#reference"></a>
# 感想など
- RCam2は様々な設定や他のデバイスが必要となるので使用までに負担がかかってしまいますね…。iPad Pro単体で実行できる同様のアプリが開発できればいいですね。
- iPad ProのLiDARの有用性が見えてきましたね。乗るしかない。このビッグウェーブに…!!
- なにか追記すべきことなどありましたら教えて下さい。m(_ _)m
Next.js に TypeScript を導入したのに Any が許容されていた話

# 概要
`Next.js`に`TypeScript`を導入したら設定がゆるふわだったので修正したという話

# アプリケーションの作成と TypeScript の導入

まずはアプリケーションを作成する。

```bash
$ npx create-next-app next-ts
```

次に必要なパッケージをインストールする。

```bash
$ yarn add -D typescript @types/react @types/react-dom @types/node
```

続いて拡張子を変更する。

```bash
$ mv pages/index.js pages/_app.tsx
$ mv pages/_app.js pages/_app.tsx
$ mv pages/api/hello.js pages/api/hello.ts 
```

最後にアプリを起動する。

```bash
$ yarn dev
```

すると自動で下記ファイルが作成される。

```next-env.d.ts
/// <reference types="next" />
/// <reference types="next/types/global" />
```

```tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": false,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve"
  },
  "include": [
    "next-env.d.ts",
    "**/*.ts",
    "**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}
```

無事に http://lobalhost:3000 で画面表示されて完了（？）。

# Any が許容されていたデフォルト設定

「あれ？何か違和感。」
とりあえず適当なファイルを確認する。

```_app.tsx
import '../styles/globals.css'

function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />
}

export default MyApp
```

「そういえば引数の型を指定してしない。`any`で許容されている。」
システムが許しても私は許さない。設定ファイルを確認する。

```tsconfig.json
{
  "compilerOptions": {
    ・・・
    "strict": false
    ・・・
  }
}
```

「なぜデフォルトが`strict: false`なのだろうか。」
`strict: true`に修正する。これで`noImplicitAny`などの設定が有効化される。
暗黙的な`any`が **無事にエラー** になったので各ファイルも修正する。

```_app.tsx
import '../styles/globals.css'
import { AppProps } from 'next/app'

function MyApp({ Component, pageProps }: AppProps) {
  return <Component {...pageProps} />
}

export default MyApp
```

```hello.ts
import { NextApiRequest, NextApiResponse } from 'next'

export default (req: NextApiRequest, res: NextApiResponse) => {
  res.statusCode = 200
  res.json({ name: 'John Doe' })
}
```

`TypeScript`の恩恵は有り難く享受していきたい。

# 参考文献
- https://www.typescriptlang.org/ja/tsconfig#Strict_Type_Checking_Options_6173
【アウトプット　メモ】

rails g controller posts index
でコントローラとアクションを生成する。
posts controller.erb
index.html.erb
を作られる。

<%= posts.each do |post| %>
このeachはpostsに入っているデータをpostに代入して１つずつ取り出す
＊postは変数


rails g model Post content :text
Postはモデル名
contentはカラム名
textはデータ型

実行するとこんなのが作られる
model/post.rb

db/migrate/202011..._create_posts.rb
*postsはPostの複数形なぜかこうなる　多分そういう仕様
中身（202011..._create_posts.rb）

class CreatePosts < ActiveRecord::Migration[5.0]
  def change
    create_table :posts do |t|
      t.text :content
      t.timestamps
    end
  end
end



中途半端だけどここまで
エクセルマクロとTeraTermマクロの連携

#はじめに
最近、TeraTermの実行結果をテキストファイルに貼りつけ、エクセルに取り込むことが多いです。
地味に作業が手間ですので、エクセルVBAとTeraTermマクロを合体して自動化したメモになります。

#概要
大まかな手順は以下になります。
①エクセルVBAでTeraTermマクロ（ttlファイル）を生成する。
②TeraTermマクロでは、ログファイル出力する。
③①をWSHで実行する。
④②をVBAで開く

#実装（公開鍵方式でログインする場合の例です。）

```vb
Sub excl2ttlSample()

    'パラメータ情報
    '------------------------------
    Dim PATH As String  'TeraTermマクロパス
    Dim HOST As String  'ホスト
    Dim USER As String  'ログインユーザ
    Dim PASS As String  'ログインパスワード
    
    PATH = "C:\Users\hogehoge\ttpmacro.exe" 'ttpmacro.exeのフルパスになります。適宜変更して下さい。
    HOST = "aaa.bbb.ccc.ddd" 'ログインするホストのIPアドレスになります。適宜変更して下さい。AWSの場合はURLになることが多いかもしれません。
    USER = "fugafuga" 'ユーザ名は適宜指定して下さい。
    
    'ttlファイル作成
    '------------------------------
    Dim ttlPATH As String
    Dim FN As Integer
    
    ttlPATH = "C:\Users\hogehoge\Desktop\temp.ttl"  '生成するttlファイルを指定します。こちらも適宜。
    FN = FreeFile
    
    Open ttlPATH For Output As #FN
    
    Print #FN, "username = '" + USER + "'"
    Print #FN, "keyfile = '""C:\Users\hogehoge\Desktop\AWS\fugafuga.pem""'" 'pemファイルを適宜指定します。
    Print #FN, "hostname = '" + HOST + "'"
    Print #FN, "msg = hostname"
    Print #FN, "strconcat msg ':22 /ssh2 /auth=publickey /user='"
    Print #FN, "strconcat msg username"
    Print #FN, "strconcat msg ' /keyfile='"
    Print #FN, "strconcat msg keyfile"
    Print #FN, "connect msg"
    Print #FN, "logopen 'C:\Users\hogehoge\Desktop\testlog.txt' 0 0" 'TeraTermのログファイルを適宜指定します。
    Print #FN, "wait '$'"
    Print #FN, "sendln 'ls'"
    Print #FN, "wait '$'"
    Print #FN, "logclose"
    Print #FN, "end"
    Close #FN
    
    'TeraTerm実行 (WScript.Shell)
    Dim wsh As Object
    Dim resp As Integer
    
    Set wsh = CreateObject("WScript.Shell")
    resp = wsh.Run("""" & PATH & """""" & ttlPATH & """", 1, True)
    
    If resp = 1 Then
        MsgBox "失敗"
    End If
    
    Set wsh = Nothing

    Kill ttlPATH 'ttlファイル削除

    'TeraTermログファイルを開いて、MsgBoxに出力します。  
    Dim buf As String
    Open "C:\Users\hogehoge\Desktop\testlog.txt" For Input As #1
        'Do Until EOF(1)
            Line Input #1, buf
            MsgBox buf
        'Loop
    Close #1
End Sub
```
最小全域木構成法（プリム法）の証明

## プリム法とは
最小全域木を構成するためのアルゴリズム
以下のようなアルゴリズムで表されます。

```
def prim(G(V,E))
 任意の始点を選び全域木の部分木(以下T)に加える
 while 全域木が構成されていない間
   TとV-Tを繋ぐ辺の中でコスト最小の辺を選びTに加える
```

非常に素直なアルゴリズムですね。。
実装的には
・Tに加えたらTに入ってるかどうかを表すフラグをTrueにする
・TとV-Tを繋ぐ辺全てを見てコスト最小のものを選ぶのは大変なので、Tに新しく頂点が加わったときにその頂点とV-Tを結ぶ辺のうちコストがより小さくなるのであれば最小コストを更新する
とかが考えられますね。

## プリム法の正しさの証明
とても素直なアルゴリズムなので本当に最小全域木が得られるのか疑問に思うかもしれませんが、以下に示すように背理法で正しさを証明できます。

仮にプリム法によって得られた全域木が最小コスト和でないと仮定する。
そのとき図のようにプリム法で選んだ辺 eよりもコストの小さい辺 e'を含むような最小全域木が存在する。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635127/d7eb3537-5e71-f53f-b162-3ab8fdb7660c.png" style="text-align: center;"/>
ここでプリム法でfではなくeが選ばれたことからe < fということもわかる。
この図からわかるように明らかにfではなくeを含んだ場合でも全域性は担保されており、コスト和は小さくなる。
このことから図の場合は必ず最小全域木ではないことがわかり、プリム法によって得られた全域木が最小コストでないという仮定が誤りであることがわかる。
このことからプリム法によって全域木の部分木とそれ以外とを繋ぐ辺のうちコスト最小の辺を選ぶことによって必ず最小全域木が得られることが示された。
コントローラーのテスト時に画像をアップロードする方法

RSpecでコントローラーの単体テストを行っていた時にエラーが発生したため、解決方法を記録として残します。


## 開発環境
- rails (6.0.3.3)
- rspec-rails (4.0.1)

## コード内容
店舗情報の登録に関するテストを行いました。

```ruby:laundries.spec.rb

context "管理者の場合" do
   before do
     @user = FactoryBot.create(:user, admin: true)
   end

   it "店舗情報を追加できること" do
     laundry_params = FactoryBot.attributes_for(:laundry)
      sign_in @user
      expect {
       post laundries_path, params: { laundry: laundry_params }
      }.to change { Laundry.count }.by(1)
   end
```

内容としては、
1.店舗情報を投稿するためにユーザーを生成する。
2.```FactoryBot.attributes_for```でテスト用の属性値を生成して``laundry_params``に代入。
3.ログインした後に情報を送り、Laundryモデルのカウントが１上がることを確認する。

テストを実行したところ、以下のようなエラーが表示されました。

```ruby

expected `Laundry.count` to have changed by 1, but was changed by 0
```

どうやら、データが正しく登録されていないみたいです...。


## 原因
#### 画像がパラメーターに含まれていなかった。

とりあえずログを確認。

```test.log
Processing by LaundriesController#create as HTML
  Parameters: {"laundry"=>{"name"=>"コインランドリー名古屋店", "address"=>"愛知県名古屋市1-1", "opening_date"=>"2012-01-13", "open_time"=>"7:00", "close_time"=>"23:00", "shoe_washing"=>"true", "futon_washing"=>"true", "dryer"=>"true", "washing_machine"=>"true"}}
  Rendering laundries/new.html.erb within layouts/application
```

パラメーターに値は含まれているが``new.html.erb``がレンダリングされている...
登録に失敗した場合``new.html.erb``をレンダリングするようにしてあるため、エラーが生じていることはわかるが何が原因なのかはわからず。
「もしかしてパラメーターのキー名が間違っていてコントローラーで正しく受け取れていないのでは？」と思いストロングパラメーターを確認したところ...

```ruby:contoroller.rb
  def laundry_params
    params.require(:laundry).permit(:name, :address, :opening_date, :open_time, :close_time, :shoe_washing, :futon_washing, :dryer, :washing_machine, :image)
  end
```

``:image(permitメソッドの最後)``・・・これだ！！！これが抜けているから画像がないぞ！とエラーになっていることが判明。

原因が判明したのはいいが、FactoryBotではデータを生成した後に画像をアタッチするようにしていたためどのようにしてパラメーターに含めればいいのかわからず苦戦しました。

```ruby:FabtoryBot
FactoryBot.define do
  factory :laundry do
    name { 'コインランドリー名古屋店' }
    address { '愛知県名古屋市1-1' }
    opening_date { '2012-01-13' }
    open_time { '7:00' }
    close_time { '23:00' }
    shoe_washing { true }
    futon_washing { true }
    dryer { true }
    washing_machine { true }

    after(:build) do |item|
      item.image.attach(io: File.open('public/images/test_image.png'), filename: 'test_image.png')
    end
  end
end
```

## 解決方法
### fixture_file_uploadメソッドを使う
fixture_file_uploadメソッドはRSpecに用意されているメソッドです。
以下の記事を参考にさせていただきました。
[Active Storage 導入環境下での単体テスト](https://qiita.com/maca12vel/items/ee4d16827f24f69080ae)


以下が、コードのbefore/afterです。
エラー発生時のテストコード

```ruby
it "店舗情報を追加できること" do
 　laundry_params = FactoryBot.attributes_for(:laundry)
   sign_in @user
   expect {
    post laundries_path, params: { laundry: laundry_params }
   }.to change { Laundry.count }.by(1)
end
```
エラー解決時のテストコード

```ruby
it "店舗情報を追加できること" do
　#laundry_paramsにimageを追加
  laundry_params = FactoryBot.attributes_for(:laundry, image: fixture_file_upload("/files/test_image.png"))
  sign_in @user
  expect {
   post laundries_path, params: { laundry: laundry_params }
  }.to change { Laundry.count }.by(1)
end
```

無事にテストが実行されログにもimageが含まれていました！
Windows10 home環境でDocker Hubをインストールしたけど起動しなかった時に調べた内容

自宅のPC検証環境を作りたくDocker Hubをインストール
その時に、docker run hello-worldが実行出来なかったので色々試した内容をまとめておく

結論
・Dockerが起動してるか確認する

環境
・Windows10 home



まずこの記事を参考にインストール
[Windows 10 Home 対応の Docker Desktop for Windows を一足早く試してみました]
(https://techracho.bpsinc.jp/ebi/2020_03_27/90477)


Docker Hubのインストールまでは完了してhello-worldをしてみるも起動しない

```
C:\Users\name>docker run hello-world
docker: error during connect: This error may indicate that the docker daemon is not running.: Post http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/create: open //./pipe/docker_engine: The system cannot find the file specified.
See 'docker run --help'.
```

こんな感じのエラーが出る
エラーを調べてみると環境変数が正しく設定出来ていないので繋がらないっぽい

調べてみると下記のページにたどり着く
[Docker for Windowsでのエラー]
(https://qiita.com/Y-Kanoh/items/180e73c47970ea9bf5bc)
[dockerでネットワークエラー]
(http://acchi-muite-hoi.hatenablog.com/entry/2016/04/26/223559)
[windows: docker: command not found( docker not added to path)]
(https://github.com/docker/toolbox/issues/260)

コマンドから環境変数を設定していたが、設定から環境変数を検索してそこからPATHにDockerをインストールしたフォルダを設定した

環境変数を設定し再度hello-worldを実行するも上のエラーが出て実行できない
一度、再インストールし直して実行してみるも同じ状態

さらに検索してみると下記ページがヒット
[Windows10の環境で docker コマンドを実行するとエラーが発生する]
(https://ja.stackoverflow.com/questions/63492/windows10%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%A7-docker-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B)

このスタックオーバーフローの回答に「Docker Desktopが起動していないのでは？」とありタスクバーのDockerマークを見ると赤い状態で起動していませんでした…

Dockerを起動してあげるとhello-world出来ました。
Python3で仮想環境の構築

## はじめに
　pythonの軽量モジュールである'venv'を使用した環境構築を説明します。
仮想環境を用いた開発をすることにより、プロジェクトで使用しているライブラリ・パッケージが明確化されます。
ローカルで開発をするとローカル環境に余計なライブラリや以前使ったライブラリが残っていたりして、他のマシンにデプロイした際にうまく動かないケースがあるので、仮想マシンなどを使用してプロジェクトを作成し、その中で開発をすると使用するライブラリやパッケージがはっきりし、他のマシン、チーム開発での際に共有もしやすくなる。

## 環境
* python3系

## 仮想環境の作成
※ python3系がインストールしていることを前提とします。

* macの場合

~~~:python
# 仮想環境作成
$ python3 -m venv name # nema: 環境名
# 仮想環境の有効化
$ source venv/bin/activate

# 仮想環境の無効化
$ deactivate
~~~

* windowsの場合

~~~:python
# 仮想環境作成
$ python -m venv name # nema: 環境名
# 仮想環境の有効化
$ source venv/Script/activate

# 仮想環境の無効化
$ deactivate
~~~

## ライブラリのインストール
ここからはローカルでインストールするやり方と同じです。

#### ライブラリのインストール
例えば'numpy'をインストールする場合は以下のようにします。

※以下、シンボリックリンクを'python3 & pip3'で設定しているという前提で説明する。
※'python & pip'で設定している場合は以下の'pip3'を'pip'に変更して実行してください。

~~~:python
(venv)$ pip3 install numpy
~~~

#### インストール済みのライブラリ確認

~~~:python
(venv)$ pip3 list
~~~


#### ライブラリの削除

~~~:python
(venv)$ pip3 uninstall numpy
~~~

## ライブラリ・パッケージの管理
設定ファイル[requirements.txt]を使用することにより、インストールされているライプラリ・パッケージのバージョン管理、及び一括インストールができます。
この設定ファイルを使用することにより、一つ一つライブラリをインストールする手間を省けます。

### インストールされているライブラリのファイル化
~~~:python
(venv)$ pip3 freeze > requirements.txt
~~~
実行したディレクトリに'.txt'ファイルが作成される。

### 設定ファイルのインストール
~~~:python
(venv)$ pip3 install -r requirements.txt
~~~
この実行により、設定ファイルに書かれているパッケージを全てインストールすることができる。

~~~:設定ファイル：例
###### Requirements without Version Specifiers ######
numpy
pandas

###### Requirements with Version Specifiers ######
numpy === 1.14.1
pandas === 0.22.0
~~~

## まとめ
今回は仮想環境の'venv'をざっと簡単にまとめてみましたが、他にも仮想環境はいろいろあります。
例えば、pyenv, conda
これから、pythonの開発を行う際にお役に立てばと思います。。。
【Laravel】Carbon　まとめ

laravelでサービスを作る上で日時操作をする機会が多かったので、よく使っているメソッドなどをまとめました。

##Carbonクラス
CarbonクラスはDateTimeクラスから継承された日付操作ライブラリ。
Laravelには標準搭載されている

##使用方法
use Carbon\Carbon;の宣言をすることで簡単に使用できる。

##取得方法
```
$date = new Carbon();//インスタンス作成
```
##使用用途によって文字列を入れてインスタンス化可能
```
//ex)now:2020-01-01 12:23:34:121212

new Carbon('now'); //2020-01-01 12:23:34:121212
new Carbon('today'); //2020-01-01 00:00:00:000000
new Carbon('tomorrow'); //2020-01-02 00:00:00:000000
new Carbon('yesterday'); //2019-12-31 00:00:00:000000

//時を進めることも可能
new Carbon('+10 minutes'); //2020-01-11 12:33:34:121212
new Carbon('+10 day'); //2020-01-11 12:23:34:121212

//スタティック
$date = Carbon::now(); /2020-01-01 12:23:34:121212
```
##インスタンスより欲しい日時を取得
```
$date = Carbon::now();

$date->year; // 2020
$date->month; // 1
$date->day; // 1
$date->hour; // 12
$date->minute; // 23
$date->second; //34
```

##出力フォーマット変更
```
$date->format('Y年m月d日h時i分s秒')//2020年1月1日12時23分34秒
//時間はhで12時間表示、Hで24時間表示
```

##差分を計算
```
$date1 = new Carbon('2020-01-01');
$date2 = new Carbon('2020-12-25');

// 分
$dt1->diffInMinutes($dt2); // 516960分

// 時間
$dt1->diffInHours($dt2); // 8616時間

// 日
$dt1->diffInDays($dt2); // 359日

// 週
$dt1->diffInWeeks($dt2); // 51週

// 年
$dt1->diffInYears($dt2); // 0年
```

##参考文献
公式サイト　https://carbon.nesbot.com/
ActionMailer実行時にletter_openrが原因で落ちた

##表示されていたエラー
```Launchy::CommandNotFoundError Exception: Unable to find a browser command. If this is unexpected, Please rerun with environment variable LAUNCHY_DEBUG=true or the '-d' commandline option and file a bug```

##経緯と概要
vagrantがどうこうという記事ばかりで参考になるものが決め打ちでなかなか見当たらなかった為、次回同じ原因でハマった時用の備忘録。  
結論、EC2でリモート開発するなら、letter_openerではだめで、letter_opnener_webを使わないといけない。

```ruby
HogeMailer.hoge(huga).deliver
```
みたいな感じのパターンで落ちてて、上記エラー出てるなら疑うべき。

##環境
Rails 4.2
Ruby 2.3
letter_opener 1.4.1
EC2に内にソースコードを置いて、SSH接続での開発

##対応方法
letter_openerだと、リモート開発時（EC2にSSH接続している等）には、上記エラーを吐いてしまう。 
リモート開発でメール送信機能の確認をしたいのであれば、letter_opener_webの追加が必要。 
導入手順は以下。
###1 gemfileにletter_opener_webの追加
gemfileで、

```ruby
gem 'letter_opener_web', group:  :development
```
を追加する。

###2 config/environments/development.rbの設定追加
```ruby
config.action_mailer.delivery_method = :letter_opener_web
```
を追加する。

※※※既にletter_openerをインストールしているのであれば、

```ruby
config.action_mailer.delivery_method = :letter_opener
```

という行があるはずなので、
単純に末尾に```_web```を足してやればOK。

###3 config/routes.rbに設定追加
最後に、以下3行をroutes内に追加してやればOK。

```ruby
  if Rails.env.development?
    mount LetterOpenerWeb::Engine, at: '/letter_opener'
  end
```

##letter_opener_web導入後

`localhost:3000/letter_opener/`を別タブでブラウザ上に開いておけば、
メールの送信記録が確認できる。

##参考記事
https://qiita.com/k-shogo/items/d85905535a64e82a3b2b
http://rubyandrails.hatenablog.com/entry/letter_opener_web
https://www.geek.sc/archives/2227
https://qiita.com/7sgg_m/items/178e0d90fc55c5716474
CentOS8のfirewall-cmdでマスカレード設定をして簡単なゲートウェイサーバを作る


## 構成

インターネット --- eth0-ゲートウェイサーバ-eth1 --- なんかのサーバ


## ゾーンを確認

```
# firewall-cmd --get-active-zone
public
  interfaces: eth0 eth1
```

## ゾーンを変更

```
# nmcli connection modify eth1 connection.zone internal
# nmcli connection modify eth0 connection.zone external
```

## 設定確認
```
#  firewall-cmd --zone=external --query-masquerade
yes

#  firewall-cmd --zone=internal --query-masquerade
no
```

## ゾーンを確認
```
# firewall-cmd --get-active-zone
external
  interfaces: eth0
internal
  interfaces: eth1
```


## ちなみに、こちらは自動的に有効化される
- iptablesだと変更はしてくれなかったかな

```
#  cat /proc/sys/net/ipv4/ip_forward
1
```
特定の言語にてPrettierが効かない【VSCode】


# はじめに

初めまして[Tutu](https://twitter.com/padde_cross)と申します。

VSCodeでの整形ツールとして`Prettier`を使っているのですが、特定の言語にて時々反応しなことがあったので自分の解決方法を残しておきたいと思います。


# 解決方法

VSCodeの`setting.json`にて`Prettier`を適用したい言語のなかで下記の設定を追加する。 
(今回は例として`html`を選択)

```json:setting.json
"[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
 }
```



# 最後に

今回は簡単な内容でしたが、意外とはまってしまったので記録として残しておきました。
このぐらいの簡単な内容は**[Zenn](https://zenn.dev/)**の新機能**スクラップ**がちょうどいいかもしれないですね。
越谷市ポータルサイト

越谷市ポータルサイト
越谷市ポータルサイトは観光、市役所、事件、駅、地図、ランチ、ラーメン、ニュース、人口、レイクタウンに関するホームページです。
https://www.koshigaya.city/

Google Blogger
https://www.blogger.com/about/
テーマ＞HTML を編集

バックアップ
https://github.com/messiahjp/www.koshigaya.city

■Google Analytics
https://analytics.google.com/analytics/web/
後で書く

■Google タグ マネージャー
https://marketingplatform.google.com/intl/ja/about/tag-manager/

Google タグ マネージャーをインストール
下のコードをコピーして、ウェブサイトのすべてのページに貼り付けてください。
このコードは、次のようにページの <head> 内のなるべく上のほうに貼り付けてください。
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-PD2MMXG');</script>
<!-- End Google Tag Manager -->


また、開始タグ <body> の直後にこのコードを次のように貼り付けてください。
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PD2MMXG"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->




■Google Search Console
https://search.google.com/search-console
ドメインプロパティ登録する
最低限のゲストログイン機能を作った

#はじめに
　ポートフォリオの作成にあたり、採用担当者さんに少しでも見ていただけるように、ゲストログイン機能を実装した。

##流れ
1. ルーティング記述
2. ゲストの情報をモデルに記述
3. コントローラーにアクションを記述
4. ビューを記述

流れは機能を実装するときとほぼ同じ。


###1. ルーティング記述
```ruby:routes.rb
devise_scope :user do
    get 'users/guest_sign_in', to: 'users/sessions#new_guest'
  end
```
URIはわかりやすく、正規のユーザーログインと同じような感じで。
アクションは、deviseのコントローラーに記述するので、`sessions`コントローラーを指定。

###2. ゲストの情報をモデルに記述
```ruby:user.rb
def self.guest #ゲストユーザー用のアカウント作成
    find_or_create_by!(email: 'guest@example.com',
                       nickname: 'ゲスト',
                       class_room_id: 1,
                       first_name: 'ゲスト',
                       last_name: 'ゲスト',
                       attendance_number: 1) do |user|
      user.password = SecureRandom.urlsafe_base64 #パスワードはランダム生成
    end
  end
```
`find_or_create_by!`の引数には、自分の作成したアプリで<font color=red>新規登録をする際</font>に必要な項目分作る。
`SecureRandom.urlsafe_base64`でランダムに文字列を生成。

###3. コントローラーにアクションを記述
```ruby:sessions_controller.rb
def new_guest #ゲストログイン用アクション
    user = User.guest #ゲストユーザーをモデルから呼び出す
    sign_in user #ゲストユーザーでサインイン
    redirect_to root_path
  end
```
`gest`は「2」で作成したゲストアカウントのこと。
###4. ビューを記述
```erb
<%= link_to 'ゲストログイン', users_guest_sign_in_path %>
```
##参考記事
[簡単ログイン・ゲストログイン機能の実装方法（ポートフォリオ用）](https://qiita.com/take18k_tech/items/35f9b5883f5be4c6e104)

##最後に
　ユーザー登録前に、２つの情報を登録して、その情報にユーザーを紐づけているのだが、どうすれば、ゲストログインで事前の２つの情報を自動で作成できるのだろうか？必須項目にしない以外の方法を考えたいのだが…
Hyper-V上のCentOS8にネットワークデバイスを追加しても自動的に仮想ネットワークインターフェースが作られない

## 問題
- このようにOS作成後にネットワークインターフェースを追加しても自動認識しない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/3c3880b0-a2bd-36c7-8fdf-3da3f7f6d780.png)


## nmcliで作る
```
nmcli connection add type ethernet ifname eth1 con-name eth1
nmcli connection modify eth1 ipv4.address 172.16.0.2/24
nmcli connection modify eth1 ipv4.method manual
nmcli connection up eth1
```

## 確認
```
[root@aaaa ~]# ip a 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:0b:c9:05 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.208/24 brd 192.168.11.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 240d:1a:76e:800:5397:a6f9:8481:e895/64 scope global dynamic noprefixroute 
       valid_lft 7502sec preferred_lft 7502sec
    inet6 fe80::5854:f022:4e88:61d1/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:0b:c9:0a brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.2/24 brd 172.16.0.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a1c2:78aa:a19f:5a48/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
```
FactoryBotでポリモーフィックなアソシエーションを生成する

#はじめに
FactoryBotを書いてて、ポリモーフィック関連を自動生成するにはどうしたらいいんじゃ！
と思って調べたので、忘備録です。

#やりたいこと
例えばツイッターのようなアプリを作ることを考えて、Postテーブルを作ることにします。Postテーブルには投稿主を表すpostable_idがあるとします。
投稿できるのは、一般のUserの他に別テーブルで管理されてるCompanyも投稿できるようにしたとしましょう。すなわちUserとCompanyはPostとポリモーフィックな関係で結ばれています。

```
User ----|
         |---- Post
Company--|
```
この時、postを生成するのと同時にuserやcompanyをFactoryBotで自動的に生成する方法を説明します。

#解決
では　早速コードをみてみましょう。
まずは、デフォルトで用意されてるかもしれませんが、userとcompanyを作成するファクトリを用意します。

```factories/users.rb
FactoryBot.define do
  factory :user, class: 'User' do
   name { 'test' }
  end
end
```

```factories/companies.rb
FactoryBot.define do
  factory :company, class: 'Company' do
   name { 'test' }
  end
end
```
上記は特になんの変哲のないファクトリーです。specに`create(:user)`みたく書けばuserを作成できるでしょう。
続いてPostのファクトリーは以下のようになります。

``` factories/posts.rb
# userのpostを生成(postと一緒にuserができる)
FactoryBot.define do
  factory :user_post, class: 'Post' do
    postable_type { 'User' }
    #ポリモーフィック関連の名前を指定して、userを生成するfactorを呼ぶ
    association :postable, factory: :user
  end

# companyのpostを生成(postと一緒にcomapnayができる）
  factory :company_post, class: 'Post' do
    postable_type { 'Company' }
    #ポリモーフィック関連の名前を指定して、userを生成するfactorを呼ぶ
    association :postable, factory: :company
  end
end
```
肝はassociationでfactoryを指定することです。これによってuserかcompanyを自動で作成してくれます。
もちろんspecでは`create(:user_post)`で問題ありません。
便利なので是非ご活用ください！
【jQuery~hasClassメソッド~】勉強メモ⑤

jQueryについて学習中。
今回は「hasClassメソッド」について。
ほぼ自分の勉強メモです。
過度な期待はしないでください。

hasClassメソッド
- 
- hasClassメソッドとは

　-引数に指定したクラスが、対象のHTML要素にそのクラスがあるかを確認出来る。
　そのクラスを持っていればtrue、持っていなければfalseを返す。
　
　-基本的な書き方

```.text:基本構造
対象要素.hasClass( 'クラス名' );
// クラス名指定の際、ドットは必要無し
```

　
　-戻り値
　hasClass(　)は、特定のクラスを検出する際に「true / false」で返す特性がある。
　指定のクラスを検出した場合は「true」、検出できなかった場合は「false」を返す。

```.html:HTML
<div class="modal">hasClassメソッド</div>
```

```.js:jQuery
var $div = $('div').hasClass('modal');
 
console.log( div );
```

```.text:検出結果
true
```
<br>

if文を用いて応用
-
- if文を用いた開閉操作

　-こんなの
![image](https://i.gyazo.com/d9e65f9fd877fa93021e4a55c78dc5e4.gif)
　-表示・非表示は、クリックした時に対象のHTML要素に、
　例えば、openクラス（ここの名前はなんでもOK）を持っていれば、（質問の答えが現在表示されていると判断できるので）openクラスを
　外し答えを隠す。openクラスがない場合はその逆。

```.js:jQuery
if(対象要素.hasClass( 'クラス名' )){
  // クラスを外す処理
  // 答えを隠す処理
}else{
  // クラスを付ける処理
  // 答えを表示させる処理
}
 

```
<br>

- サンプルコード

```.html:HTML
<ul id="faq-list">
  <li class="faq-list-item">
    <div class="box">
      <h3 class="question">次回のオリンピック開催国は？</h3>
      <span>+</span>
    </div>
    <div class="answer">
      <p>一応まだ日本です。</p>
    </div>
  </li>
</ul>
```

```.css:CSS
.answer {
  display: none;
}

.box{
  display: flex;
}

span{
  padding-top: 12px;
  font-size: 25px;
}
```

```.js:jQuery
$(function() {
  $('.faq-list-item').click(function(){
    var $answer = $(this).find('.answer');
    if($answer.hasClass('open')) { 
      // removeClassメソッドを用いてクラスを外す
      $answer.removeClass('open');
      // slideUpメソッドを用いて、$answerを隠す
      $answer.slideUp();

      // 子要素のspanタグの中身をtextメソッドを用いて書き換える
      $(this).find('span').text('+');
      
    } else {
      // addClassメソッドを用いてクラスを付ける
      $answer.addClass('open'); 
      // slideDownメソッドを用いて、$answerを表示
      $answer.slideDown();
      
      // 子要素のspanタグの中身をtextメソッドを用いて書き換える
      $(this).find('span').text('-');
    }
  });
});
```

　-$('.faq-list-item').click(function( ){ }
　イベントの構文を使用して、`$('セレクタ').イベント名(function(){ });`clickイベントを作成

　-var $answer = $(this).find('.answer');
　jQueryの変数宣言にはvarを使用
　findメソッドは、全ての子孫要素の中から、指定したセレクタを持つ要素を取得

　- $(this).find('span').text('+');
　textメソッドを使用することで、書き換えることが出来る
　`$('セレクタ').メソッド().メソッド()...`のように書くことでそれぞれのメソッドが適用される（メソッドチェーン）






<br>
過去投稿記事
-
[【jQuery~書き方と各メソッド~】勉強メモ①](https://qiita.com/k-yasuhiro/items/dfe305ff337e6ac8b406)
[【jQuery~準備(読み込み)~】勉強メモ②](https://qiita.com/k-yasuhiro/items/c5f8aa277bd572d89cb4)
[【jQuery~モーダルの表示・非表示~】勉強メモ③](https://qiita.com/k-yasuhiro/items/15449ad19f85275393e8)
[【jQuery~hoverイベント~】勉強メモ④](https://qiita.com/k-yasuhiro/items/da51d0b1baa5e16c69e1)
AWS ソリューションアーキテクトアソシエイト向け問題 セキュリティ編 

## 概要

今回は会社の後輩向けにAWS ソリューションアーキテクトアソシエイト向けの問題を作成したのでそちらの公開を。
元ネタは公式の問題、BlackBelt、公式サイトなどからとっております。内容としては簡単すぎかもしれません・・・

## KMS

* KMSの特徴について説明している文で以下の中から正しいものを1つ選択してください。
    1. 複数のリージョンで同一のキーを使用できる。
    1. 顧客側がキーを提供しサーバで暗号化を実施できる。
    1. EBSを暗号化する際は作成済みのEBSについても暗号化できる。
    1. 複数のアカウントで暗号化キーを共有することはできない。
    1. キーのローテーションは自動でのみ実施される。

<details><summary>回答</summary><div>

* 正解は

    2. 顧客側がキーを提供しサーバで暗号化を実施できる。
        * 顧客側がオンプレ環境の暗号化を使いたい場合でも対応できます

* 以下不正解の理由

    1. キーはリージョン単位のため別のリージョンに移すときは暗号化キーを用意する必要がある
    3. EBSの暗号化の際には作成時に指定する必要がある。既存のEBSを暗号化したいときはスナップショットを取得しコピーを作成するときに暗号化を指定する必要がある。
    4. IAMユーザ、ロールを使ってのアクセス制御が行えるため他のアカウントを設定することで可能となる。
    5. デフォルトは1年でローテーションされるが、１年では長い場合に手動でローテーションを行うことも可能。


</div></details>

## AWS Shield
* AWS Shieldの特徴について説明している文で以下の中から正しいものを1つ選択してください。
    1. AWS Shield Standardを使用することで追加料金なしでレイヤ 3 および 4の保護を行うことができる。
    1. AWS Shield Advanced を使用することで AWS WAF および AWS Firewall Manager を通常より少ない金額で使用することができる。(無料ではないが大幅な割引が行われる)
    1. AWS Shield Standardを使用することで一般的なネットワークおよびトランスポートレイヤーの DDoS 攻撃から保護される。
    1. AWS Shield Standard を使用することでDDoS攻撃等でオートスケールが行われることで発生する追加分の費用が返還される。
    1. AWSでホストされていないと AWS Shieldを使用することはできない。

<details><summary>回答</summary><div>

* 正解は

    3.  AWS Shield Standardを使用することで一般的なネットワークおよびトランスポートレイヤーの DDoS 攻撃から保護される。
        * AWS Shield Standard でも通常のDDoS攻撃からの保護は機能する。またこちらは無料でも使えるのでとりあえず設定することが勧められている。

* 以下不正解の理由

    1. レイヤ3,4の保護はAWS Shield Advancedの機能
    2. AWS Shield Advanced ではAWS WAF および AWS Firewall Manager を無料で利用できる。
    4. スケーリング用 DDoS コスト保護は AWS Shield Advanced の機能です。対象はAmazon EC2、Elastic Load Balancing (ELB)、Amazon CloudFront、AWS Global Accelerator、Amazon Route 53 となっている。
    5.  Amazon CloudFront のカスタムオリジンとしてAWS外のWEBサーバを使用することでAWSでホストしていないとしても使用することができる。


</div></details>
AtCoder 生活　99日目

[前回](https://qiita.com/flandrescarlet237/items/dd9a47821214fa6bca66)

#99日目
今日は灰色の問題2問とABC184に参加しました。

|問題|難易度|自力で解けた|かかった時間|
|:-:|:-:|:-:|---|---|
|ABC091|C|◯|40分21秒|
|ABC108|B|✕|46分41秒|

![スクリーンショット 2020-11-22 22.48.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606053/99e9d449-5364-0520-311a-e3f637b16a0d.png)


##[ABC184](https://atcoder.jp/contests/abc184)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int a,b,c,d;
    cin >> a >> b >> c >> d;
    cout << a*d - c*b << endl;
}

```

###B

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n,x;
    cin >> n >> x;
    string s;
    cin >> s;
  
    rep(i,n){
        if(s[i] == 'o')x++;
        else x = max(0,(x-1));
    }
    cout << x << endl;
}

```

##[ABC091_C](https://atcoder.jp/contests/abc091/tasks/abc091_b)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    ll n;
    cin >> n;
    map<string,ll> cs;
    rep(i,n){
        string s;
        cin >> s;
        cs[s]++;
    }
    ll m;
    cin >> m;
    map<string,ll> ct;
    rep(i,m){
        string s;
        cin >> s;
        ct[s]++;
    }
    ll ans = 0;
    for(auto itr = cs.begin();itr != cs.end();itr++){
        ll sum = cs[itr->first] - ct[itr->first];
        ans = max(ans,sum);
    }
    cout << ans << endl;
}

```

解くのにかかった時間：40分21秒
感想：ｍで回すところをｎで回していたことに全然気づかなかった…

##[ABC108_B](https://atcoder.jp/contests/abc108/tasks/abc108_b)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int a,b,c,d;
    cin >> a >> b >> c >> d;
    cout << c + (b-d) << " " << d - (a-c) << " ";
    cout << a + (b-d) << " " << b + (c-a); 
}

```

解くのにかかった時間：46分41秒
感想：無駄にif文で回していた…

###最後に
今日で頭がかなり固くなってきてしまっていることに気がついた
ABC184のC，D問題は今度復習して解けるようにしておきたい。