OmniAICreator/Qiita-1.07M huggingface dataset:
SQLの自己結合を用いて数学の重複組み合わせを表現する

## はじめに

SQLにおいて、自分はあまり聞き慣れなかった自己結合の今後役立つかもしれないテクニックを紹介していきます。

実行結果はこちらで確認できます。

https://www.db-fiddle.com/

## 自己結合を用いて重複組み合わせを作る

重複組み合わせの概念は以下を参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/549edaed-ed86-bb79-d6ce-88f99d426a10.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/0d77a35b-5190-88b7-1d0d-05ec0e5c17c0.png)

https://study-line.com/juhukukumiawase/

### Schema (MySQL v5.7)

何かのメンバー一覧だと思ってください。

```sql
CREATE TABLE members (
  id INT NOT NULL PRIMARY KEY auto_increment,
  name TEXT
);

INSERT INTO members VALUES
    (1, 'tanaka'),
    (2, 'okada'),
    (3, 'hiranuma');
```

このメンバーの重複組み合わせを考えます。

### 今回のケースを計算すると

```math
_{3}H_{2} = _{4}C_{2} \\
= \frac{4\times3}{2\times1} \\
= 6 \\
```

6通りの組み合わせが考えられます。

### Query

```sql
SELECT 
   M1.name AS name_1,
   M2.name AS name_2
FROM members M1
INNER JOIN members M2 ON M2.name <= M1.name
```

文字コードの順にソートして、 自分（M1）と同等か、それよりも前に来るメンバーがペアになります。

### Results

| name_1   | name_2   |
| -------- | -------- |
| tanaka   | tanaka   |
| tanaka   | okada    |
| okada    | okada    |
| tanaka   | hiranuma |
| okada    | hiranuma |
| hiranuma | hiranuma |

重複があることがわかります。

組み合わせなので、順序を入れ替えただけのペアは同じとみなしています。

## 参照

https://www.amazon.co.jp/dp/4798157821/

59p 

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103
ABC214 C問題ふりかえり～AtCoder Beginner Contest 参戦録 #7

# はじめに

ある有名Web系会社のエンジニア採用担当者の方が競技プログラミングに挑戦し、採用候補のエンジニアはもちろん、社内のエンジニアとのコミュニケーションに活用している事例を読み、刺激を受けて始めた競技プログラミング。

採用の仕事からは離れたものの参加を継続している(使用言語はPython)。安定してA, B問題をクリアし、Cにチャレンジする時間を確保することを当面の目標としている。今回はAB完いう結果に終わった。

# ABC214 復習

## 問題

https://atcoder.jp/contests/abc214/tasks/abc214_c

## 自分の誤答

```python
# -*- coding: utf-8 -*-
N = int(input())

S = list(input().split(" "))
T = list(input().split(" "))
U = []

s = 0

U.append(T[0])

for i in range(1, 2*N):
    s = min(int(U[(i-1)%N])+int(S[(i-1)%N]), int(T[i%N]))
    U.append(s)

for i in range (N):
    print(U[i])
```

## 学び・気づき

### 参加中に調べたこと

-   「どちらか小さいほう」の表現の仕方 [^1]

### 敗因

-   t_0が十分小さい前提(最初のすぬけ君が高橋君から宝石をもらうところからスタートする)で解いた。
    -   最初のすぬけ君がN番目のすぬけくんから宝石をもらうタイミングのほうが高橋君からもらうのより早い場合を考慮する必要があった。

### 学び

公式回答を読んでも理解できなかったが、以下の方のツイートを読み考え直したら理解できた。

https://twitter.com/eoeo_kyopro/status/1426558807375695872

# まとめ

ABC214の復習を実施。自分と同じところでつまづいて「わからなかった」と言っているツイートを複数見かけた。中には自分よりもレベルの高い方々もいらっしゃり、同じことで悩めたということで成長を実感でき嬉しかった。

[^1]: [三項演算子の代わりにmax, minを使いすっきり書く | Python(https://www.suzu6.net/posts/88-python-max-min/)
Rubyのメソッド(関数)、引数、戻り値について(小学生にもわかるように解説)

# メソッド(関数)とは
メソッドとは***プログラムの中で何か特定のことをする命令や指示のようなもの***のことです。
例えばポケモンのゲームをやっていて、「たたかう」のコマンドで相手に10万ボルトのような技で攻撃するという命令を出すとします。この10万ボルトで相手を攻撃するというのがメソッドです。

ポケモンの攻撃プログラムを作ると以下のようになります。
```rb
class Pokemon
  attr_accessor :name, :hp

  def initialize(name, hp)
    @name = name
    @hp = hp
  end

  def attack(target, move)
    puts "#{@name} uses #{move}!"
    damage = calculate_damage(move)
    target.take_damage(damage)
  end

  def take_damage(damage)
    @hp -= damage
    puts "#{@name} took #{damage} damage! HP: #{@hp}"
  end

  private

  def calculate_damage(move)
    # ここで各技のダメージを計算するロジックを実装
    case move
    when "Thunderbolt"
      return 20
    # 他の技のダメージもここに追加
    else
      return 0
    end
  end
end

# ポケモンのインスタンスを作成
pikachu = Pokemon.new("Pikachu", 50)
enemy = Pokemon.new("Enemy", 50)

# ピカチュウが攻撃する
pikachu.attack(enemy, "Thunderbolt")
```

⚫︎***補足***
メソッドは***defとendで囲み***ます。***defの後に attackなどと書いてあるので
攻撃のことが書いてある***のだなとわかりますよね。これで***攻撃メソッド***となります。


# 引数
***プログラムの一部分に渡す情報***のことです。

ex)
あなたが彼女にラブレター(手紙)を渡すとします。ラブレター(手紙)の中身が引数で、彼女が手紙を読むことであなたが伝えたいことが伝わります。引数は、メソッドや関数の括弧の中に書かれていて、そのメソッドや関数が何をするかを決めるのに使われます。

例えば、彼女に手紙を書くメソッドを作るとします。そのメソッドには、手紙の内容（引数）を渡す必要があります。

例えば、次のようなRubyコードがあるとします。
```rb
def love_letter(name,message)
  puts "#{name}へ: #{message}"
end

love_letter("メアリ","付き合ってください‼︎")
```
表示結果は
```
メアリへ: 付き合ってください‼︎
```
となります。




# キーワード引数
***プログラムの一部分に情報を渡す方法の一つ***で、***情報を渡す際にその情報の役割や意味をわかりやすく示す***ことができます。

ex)
彼女にプレゼントを贈るとします。プレゼントには、色やサイズなどの情報があります。
キーワード引数を使うと、***その情報を具体的に指定できます***。

例えば、"color: 'ピンク'"や"size: '大'"といった具体的な情報をプレゼントと一緒に渡すことができます。

メソッドや関数に渡す情報をキーワード引数として指定でき、どの情報が何のために使われるのかがわかりやすくなります。

```rb
def buy_gift(item:, color:, size:)
  puts "プレゼント: #{item}, 色: #{color}, サイズ: #{size}"
end

buy_gift(item: "ワンピース", color: "ピンク", size: "中")
```
```
プレゼント: ワンピース, 色: ピンク, サイズ: 中
```

buy_giftというメソッドを定義し、3つのキーワード引数を受け取ります。
***：item、color、size。そして、それぞれの引数を使ってプレゼントの情報を表示***しています。


# 戻り値
***プログラムの一部分が終わった後に返される情報***のことです。小学生にもわかるように説明すると

ex)
あなたが友達にLINEを送って、友達がそのLINEを読んだ後に何かを返してくれるとします。
その何かが戻り値です。


***メソッド（関数）の実行が終わった後にその結果を返します。***


ex)
計算機を使って足し算をして、その結果を知りたいとします。計算機がその結果を返してくれるのが戻り値です。

```rb
# メソッドを定義。このメソッドは、2つの数字を受け取り、それらを足して結果を返す。
def add_numbers(num1, num2)
  result = num1 + num2  # num1とnum2を足して、その結果をresultに代入
  return result  # 計算結果であるresultを返す。
end

# メソッドを呼び出して、結果を変数に代入します。
sum = add_numbers(5, 3)

puts "足し算の結果は #{sum} です。"  # 結果を出力します。
```
resultが、ここでは戻り値です。


# 資料

ChatGPTを参照
ABC215 C問題ふりかえり～AtCoder Beginner Contest 参戦録 #6

# はじめに

ある有名Web系会社のエンジニア採用担当者の方が競技プログラミングに挑戦し、採用候補のエンジニアはもちろん、社内のエンジニアとのコミュニケーションに活用している事例を読み、刺激を受けて始めた競技プログラミング。

採用の仕事からは離れたものの参加を継続している(使用言語はPython)。安定してA, B問題をクリアし、Cにチャレンジする時間を確保することを当面の目標としている。今回はAB完、CはTime Limit Exceededという結果に終わった。

ちなみにこの回の直前にAtCoder社の高橋社長がこんなTweetをされていた。

https://twitter.com/chokudai/status/1427906860716154881

難化なんかしていないという反論も含めて様々な反応があったが、C問題が易しくなるといいなーという淡い期待を抱いて参加した。

# ABC215 復習

## 問題

https://atcoder.jp/contests/abc214/tasks/abc215_c

## 自分の誤答

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

S,K = map(str, input().split(" "))
K = int(K)
N = len(S)
orderlist = []

letters = list(S)
letters.sort()

for i in itertools.permutations(letters, N):
    s = ''.join(i)
    if (s in orderlist) == False:
        orderlist.append(s)

print (orderlist[K-1])
```

## 学び・気づき

### 参加中に調べたこと

-   順列 [^1]

### 敗因

-   唯一思いついたやり方が計算量の大きいものだった（このパターンに陥ることが多い）。
    -   O(N)をO(1)に減らす必要があった

### 友人コードからの学び

-   (公式回答にPythonが無かったため、メンター役を買って出てくれている友人が個別に解説してくれた。感謝）
-   set型 [^2]を使う
    -   重複した要素を持てないことを利用でき、判定が不要となる

# まとめ

ABC215の復習を実施。計算量の考え方がやっと少しわかってきた。

[^1]: [Pythonで階乗、順列・組み合わせを計算、生成 | note.nkmk.me](https://note.nkmk.me/python-math-factorial-permutations-combinations/)

[^2]: [Python, set型で集合演算（和集合、積集合や部分集合の判定など） | note.nkmk.me](https://note.nkmk.me/python-set/)
Reactを基本からまとめてみた【6】【State（ステート）】

##はじめに
####学習するに至った経緯
2020年より、未経験からエンジニアへの転職を目指し、某プログラミングスクールへ通う。入学後、『Ruby』を未経験から学ぶ人が多いのと『Ruby』の求人が思っていた以上に少ないので、卒業後、フロントエンドのエンジニアを目指す事に。
Reactの学習した事を言語化し、認識の深化による備忘録として記載。

##Stateとは
コンポーネント単位で状態を保持する為の仕組み。
『状態』とは、数値、文字列、配列などWebアプリケーションを表すデータの事。

##Propsとの違い
コンポーネント単位で状態を保持。Stateだと親子関係なくそれぞれ独立した仕組み。
Propsの場合、親コンポーネントから子コンポーネントへ値を渡す仕組み。
Stateの場合、一度定義したものは後々変更する事ができる。

##StateとPropsの違い
####Props 　親コンポーネントから子コンポーネントへ値を渡す仕組み

親コンポーネント：Post.js

```Post.js
<Button title="Post"/> 　 ➡️　 親から子へ ⬇️
```

子コンポーネント：Button.js

```Button.js
<button class=" ">
<I class= "..."/>
{props.title} ⬅️ 親から子へ　⬅️
</button>
```
➡︎ 『Post』変更不可

####State  コンポーネント単位で状態を保持する仕組み

親コンポーネント：App.js

```App.js
state={admin: trune}　⬅️お互い独立
```

子コンポーネント：Counter.js

```Counter.js
state={count: 0}　⬅️お互い独立
icrement=()=> {
 count++
}
```
➡︎ 『count: 5』変更可能

##React.Fragmentとは
React でよくあるパターンの 1 つに、コンポーネントが複数の要素を返すというものがある。フラグメント (fragment) を使うことで、DOM に余分なノードを追加することなく子要素をまとめることができるようになる。

```sample.js
render() {
  return (
    <React.Fragment>
      <ChildA />
      <ChildB />
      <ChildC />
    </React.Fragment>
  );
}
```

##実際にコーディングを行う
####(1) 作成するアプリのイメージ共有

count:0 が表示されている。『Increment』ボタンを押したら増え、
『Decrement』ボタンを押したら減るアプリ。

####(2) counterプロジェクトを新規作成

```
terminal
creat-react-app <プロジェクト名>
```

####(3) index.jsとApp.jsを作成する

デフォルトのファイルを全部削除して、index.jsとApp.jsを作成する。

```index.js
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";

ReactDOM.render(<App />, document.querySelector("#root"));
```

```App.js
import React from "react";

const App = () => {
  return (
    <div>
      <div>App</div>
    </div>
  );
};
export default App;
```

####(4)semantic-ui-cdnを導入する

```
https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css
```

上記のコードを　piblic/index.html　に貼り付ける。

####(5) Counter.jsを作成する

① src/components / Counter.jsを作成する。
② React.Fragmentを使用する。

```Counter.js
import React, { useState } from "react";

const Counter = () => {
  const [count, setCount] = useState(0);
  const onCountUp = () => {
    setCount(count + 1);
  };
  const onCountDown = () => {
    setCount(count - 1);
  };
  return (
    <React.Fragment>
      <p>Count: {count}</p>
      <button className="ui primary button" onClick={onCountUp}>
        Increment
      </button>
      <button className="ui red button" onClick={onCountDown}>
        Decrement
      </button>
    </React.Fragment>
  );
};

export default Counter;
```
####(6) App.jsを作成する

``` App.js
import React from "react";
import Counter from "./components/Counter";

const App = () => {
  return (
    <div className="ui container" style={{ marginTop: "20px" }}>
      <Counter />
    </div>
  );
};

export default App;
```



##参考サイト
[【React入門】#6 State（ステート）の理解]
(https://www.youtube.com/watch?v=ykiCPXF4bzU&t=1039s)
HerokuにGitでHelloWorldをデプロイする②[SpringBoot]


今回は、前回作成したHelloWorldをHerokuにデプロイします。
前回→[HerokuにGitでHelloWorldをデプロイする①[SpringBoot]](https://qiita.com/kiki_202181/private/de4c0aab5713b478f04e)

#環境
+ OS : Windows10
+ Git : 2.32.0
+ Heroku : 7.53.0
+ eclipse
+ Spring Boot(thymeleaf,Maven)

#前提条件
+ Gitをインストール済み
+ Herokuに登録済み
+ Heroku CLIをインストール済み

#コマンドプロンプトを開く
前回作成したHelloWorldをHerokuを開いてください。
そして、フォルダのパスが書いてあるところに、`cmd`と入力し、Enterキーを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832699/00f5166b-e470-6eed-dce4-e4a0b3099c63.png)

こうしてコマンドプロンプトを開くと、`cd`でHelloWorldがあるディレクトリまで移動する必要がありません。

##init,add,commitをする

```
>git init
>git add .
>git commit -m"HelloWorld"
```
私は、cmdで操作しましたが、「Git Bash」でも大丈夫です。
右クリック＞Git Bash Hereをクリックすると、Git Bashが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832699/e6045e3f-e223-8f65-f096-83be1034cd23.png)

#Herokuにログインする

```
heroku login -i
```

Herokuを登録するときに設定した、自分のメールアドレスとパスワードを入力してください。
もし、`'heroku' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。`といわれたら、下記の記事を見てみてください。
['heroku' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。](https://qiita.com/kiki_202181/items/2995748f6ba63190bf62)


###Heroku上にアプリを作成する

```
heroku create
```
`heroku create アプリ名`でアプリ名を指定することもできます。
今回はアプリ名を指定しないので、自動的にアプリ名が付けられます。
※あとで変更可能です

###Herokuにpushする

```
git push heroku main
```
もしくは、`git push heroku master`と入力してください。

>`main`と`master`は、どちらもherokuのブランチ名です。
以前までは、`master`がデフォルトのブランチ名でしたが、「master:主人」という英単語が「slave:奴隷」と対比となっており、BLM運動によってGitHubやHerokuのデフォルトのブランチ名が「master」から「main」に変更されました。

https://www.publickey1.jp/blog/20/githubmainmastermain.html
https://www.itmedia.co.jp/news/articles/2007/13/news057.html

###作成したアプリを開く
```
heroku open
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832699/ac8c8fe7-8ddd-b229-1733-b7b485e80f5f.png)

#参考HP
[【herokuコマンド】createからdestroyまで](https://qiita.com/chihiro/items/5c3ff400f6cb99deb945)
【GitHub】Actions で pytest を実行する

actions で python の実行環境を用意するには、[actions/setup-python](https://github.com/actions/setup-python)を使用する。あとは、pytest を含む必要なモジュールをインストールすれば、pytest が実行できる。

```.github/workflows/pytest.yaml
name: Pytest

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.8'
          architecture: x64
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
      - name: Test with pytest
        run: |
          python -m pytest
```

## 参考

Python のビルドとテスト
https://docs.github.com/ja/actions/guides/building-and-testing-python

actions/setup-python
https://github.com/actions/setup-python
'heroku' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。

#環境
+ OS : Windows10
+ Heroku : 7.53.0

#環境パスを通す(path)
コマンドプロンプトで`heroku`と入力したとき、
`'heroku' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。`
というエラーが出た場合、パスが正しく通っていないので、パスを設定します。

###システムの詳細設定の表示を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832699/b72d681e-fa81-3eed-0469-9a2f309db089.png)

###環境変数を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832699/ca96f640-03ab-4307-4de6-1fdf345eb785.png)

##Pathの設定をする
システム環境変数から`Path`を探し、選択して編集を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832699/9bbb321c-fff9-50a5-0300-684cb8bb80d3.png)

###Herokuのパスを追加する
新規を押して、

```
C:\Program Files\Heroku\bin
```

を追加してください。
Herokuをダウンロードした際、デフォルト設定だったら、`C:\Program Files\Heroku\bin`のパスだと思います。
もし、ほかの場所に展開した場合は、その場所のパスを入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832699/337750cc-5bb6-3bd7-0910-996d3b7e965c.png)

OKを押して終了します。
もし設定する前にコマンドプロンプトを開いていた場合は、そのコマンドでは設定が反映されないので、閉じて新しいコマンドを開いてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832699/341163ae-0d38-ad12-fd55-9df239dcb530.png)

#参考HP
[Windowsの環境パスを通す(path)](http://realize.jounin.jp/path.html)
[Herokuが内部コマンドまたは外部コマンドとして認識されない（Windows）](https://codehero.jp/python/42170691/heroku-not-recognized-as-an-internal-or-external-command-windows)
Ubuntu 18.04でリモートデスクトップ

# 環境
Ubuntu 18.04.3

# XRDP設定
## パッケージインストール
xrdp関連のパッケージをインストールする。

```
$ sudo apt -y install xserver-xorg-core xorgxrdp xrdp
$ sudo apt -y install xserver-xorg-input-all
```

## サーバの設定

```
$ sudo vi /etc/xrdp/xrdp.ini
- new_cursors=true
+ new_cursors=false
```

```
$ sudo vi /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla
[Netowrkmanager]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device
ResultAny=no
ResultInactive=no
ResultActive=yes
```

```
$ sudo rm -f /etc/polkit-1/localauthority.conf.d/02-allow-colord.conf
```

```
$ sudo vi /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla
[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes
```

```
$ sudo vi /etc/xrdp/sesman.ini
- FuseMountName=thinclient_drives
+ FuseMountName=.thinclient_drives
```

xrdpおよびpolkitを再起動する。

```
$ sudo systemctl restart xrdp
$ sudo systemctl restart polkit
```

## ユーザー設定
ユーザーの .xsessionrc ファイルを以下のように設定する。

```
$ vi ~/.xsessionrc
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
```

# トラブル事例
## ローカルでログインできない
### 症状
xrdpをインストール後、リモートデスクトップ接続では接続できて、キーボード・マウスは使用できる。一方、ローカルで直接ログインすると、キーボード・マウスが使用できない

### 原因
xserver-xorg-input-all がインストールされていない。sshでログインし、xserver-xorg-input-allをインストールする。

```
sudo apt -y install xserver-xorg-input-all
```

# 参考文献

https://orenda.co.jp/blog/1874/

https://qiita.com/tukiyo3/items/8793ede62180a0e32a22

https://tarufu.info/ubuntu_xrdp_color_profile/
DockerでReact環境を構築する手順

# なぜこの記事を書いたのか
「Dockerfile と docker-compose.ymlを一から作成してビルドする」という一連の流れを確認したかったため。

# 環境構築完了（ゴール）の確認
この記事のゴールは以下のようにReactのページが起動すること。
![React-top](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758310/2823d6eb-abea-c83f-d7df-6ce90795373f.png)

# 環境構築の手順
①Docker、nodeのインストール
②Dockerfile、docker-compose.ymlの作成
③ビルド
④Reactアプリの作成
⑤コンテナの実行


## ①Docker、nodeのインストール
- Dockerのインストール
https://www.docker.com

:::note info
Dockerはコンテナ型の仮想環境。
Dockerをインストールして、Dockerの環境の中で開発をすることになる。
:::

- nodeのインストール
https://nodejs.org/ja/download/

:::note info
Dockerで環境構築したり、ライブラリをインストールする為にnodeが必要になる。
:::

## ②Dockerfile、docker-compose.ymlの作成
docker-react-app（プロジェクトフォルダ）
　└┬─  Dockerfile
　　└─ docker-compose.yml

上記のフォルダ構成を参考に、ファイルを作成する。

:::note info
「docker-react-app」というフォルダを作成し、その直下に「Dockerfile」「docker-compose.yml」という名称で新規ファイルを作成すればOK。
:::

- Dockerfile

```Dockerfile
FROM node:14.17.5 
WORKDIR /usr/src/app/
```

:::note info
ターミナルで「node -v」を実行することでnodeのバージョンを確認できる。バージョンを「FROM node:○○.○○.○」という形で指定する。
:::

- docker-compose.yml

```docker-compose.yml
version: '3'
services:
  node:
    build:
      context: .
    tty: true
    environment:
      - NODE_ENV=development
    volumes:
    - ./:/usr/src/app
    command: sh -c "cd reactapp && npm start"
    ports:
    - "3000:3000"
```

## ③ビルド

「③ビルド」「④Reactアプリの作成」「⑤コンテナの実行」で実行する「docker-compose」コマンドは、Dockerfileが存在するディレクトリで実行する必要がある。ターミナルにて「cd  docker-react-app」を実行してディレクトリを移動しておく必要がある。

このコマンドを実行してビルドする。

```
docker-compose build
```

※buildコマンドはimageを作成する。コンテナは作成しない。

## ④Reactアプリの作成

```
docker-compose run --rm node sh -c "npm install -g create-react-app && create-react-app reactapp"
```

上記「①Docker、nodeのインストール」でnpmをインストールしていれば「npm install -g create-react-app && create-react-app reactapp」が実行され、Reactがインストールされる。

## ⑤コンテナの実行

```
docker-compose up
```

ここまで完了したらWebブラウザで「 http://localhost:3000 」へアクセスする。以下のようにReactのページが起動すれば環境構築完了となる。
![React-top](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758310/2823d6eb-abea-c83f-d7df-6ce90795373f.png)


# 参考

- Reactの開発環境をDockerで構築してみた https://blog.web.nifty.com/engineer/2714

# Dockerで環境を構築する手順の記事

- Reactの環境構築 👈今ここ
- [React + TypeScriptの環境構築](https://qiita.com/kashimuuuuu/items/b5f35057dfe1980d053a)
Logic Apps Tips - Azure Blob Storageへの保存

#概要
2つのAzure Logic Appsで、Azure Blob Storageのデータをやり取りするシステムをつくることになって、
ちょっと悩んで調べたことの備忘録

#悩んだこと
片方のLogic AppsでBlob Storage内にブロックBlobを作成し、
もう一つのLogic Appsで作成されたブロックBlobの中身を使って処理をするシステムなんですが、
作成と取得にどのアクションを使うのかという点です。

###Blobのコンテンツ作成のアクションが二つある
Logic Apps で使用できるAzure Blob Storage用のアクションの情報は、
[Docs - Azure Blob Storage](https://docs.microsoft.com/ja-jp/connectors/azureblob/?WT.mc_id=DOP-MVP-4028478)内に記載があります。

Blob Storageのコンテナー内にコンテンツを作成するアクションは
・BLOB を作成する (V2)
・ブロック BLOB を作成する (V2)
の二つがあります。
どちらでもブロックBlobを作成できるのですが、
どちらも指定するパラメータが一緒で、どちらを使えばいいのか悩ましいですね。

この二つのアクションの違いは、
戻り値（応答）として、BlobMetadataが返されるかという点です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/1324f9f6-79ed-045e-98e2-4fde5ccea86a.png)

このBlobMetadataには、生成されたBlobのメタデータが含まれています。


###Blobのコンテンツを取得するアクションも二つある
Blob Storageのコンテナー内のコンテンツを取得するアクションは
・BLOB コンテンツを取得する (V2)
・パスを使用して BLOB コンテンツを取得する (V2)
の二つがあります。

見た目はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/4210edef-44a5-e11e-017e-da0ce5f57c84.png)

もちろんどちらでもコンテンツの取得が可能なのです。
ただ、「Blobコンテンツを取得する」アクションの方は、
UIのBLOB欄にコンテンツの「ID」を指定します。
このID、変数等を使って直接指定する場合、どうやって取得するのか？という話なんですが、
コンテンツを作成したときに使用したアクションの戻り値であるBlobMetadataに入っています。
⇒それ以外でどうやって取得するのかは調べきれてないです（汗）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/ca4e4152-0de7-7aa9-b881-3d74bcce7bf7.png)

どちらのアクションを使う方は、システムによって違うかとは思いますが、
検討する際に上記の指定方法を踏まえたうえで、実現方法を検討しないとですね。





そして、「パスを使用してBlobコンテンツを取得する」アクションの方は、
パスを変数等を使って指定する場合、フルパスじゃなくて相対パスを記述するようにします。

```
/（コンテナ名）/（コンテンツ名）
```
Laravel6のテスト用データベースをsqliteにする

テストのためにデータベースをもう一つ用意するのがおっくうだったので、
sqliteを使ってみました。

### sqliteで使うファイルを作成

```
touch database/laravel_db.sqlite  
```

### sqliteの設定を変更
config/database.php

```

'connections' => [

        'testing_sqlite' => [
            'driver' => 'sqlite',
            'url' => env('DATABASE_URL'),
            'database' => env('DB_DATABASE', database_path('laravel_db.sqlite')), //作成したファイルのパスに変更
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ],


```

### phpunit.xmlの設定

phpunit.xml

```
<server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="DB_CONNECTION" value="testing_sqlite"/> // database.phpで設定しているデータベース名に変更
        <server name="DB_DATABASE" value="./database/laravel_db.sqlite"/> //作成したファイルのパスに変更

```


### テスト実行

```
./vendor/bin/phpunit
```

めちゃめちゃ楽です。

## 補足
sqliteはインメモリを使っているのでデータが必要なテストをする場合、その都度データを投入する必要があります。データを事前に準備したいときは、テストクラスに以下のような処理を書いておくといいです。

### テスト前にデータを用意
参照
[https://qiita.com/pomechan0505/items/288b3a7f4622e170d7fe](https://qiita.com/pomechan0505/items/288b3a7f4622e170d7fe)

テスト実行時、テストクラスで最初に実行されるテストの前に一度だけphp artisan migrate:fresh —seedが実行される

```
class hogehogeTest extends TestCase
{
    private static $isSetUp = false;

    protected function setUp():void
    {
        parent::setUp();

        if(self::$isSetUp === false) {

            $this->artisan('migrate:fresh --seed'); // php artisan migrate:fresh --seedコマンド実行
            self::$isSetUp = true;
        }
    }

}
```

## 参考記事
https://codelikes.com/laravel-tests/#toc9
Powershellで孫継承クラススクリプトを作りました

Powershellで孫継承のクラススクリプトを作成いたしました

```Powershell
#####クラスの継承処理テストPowershell ##########################
##### Create Date  2021/8/27                   #################
##### Create Author  乃木坂好きのITエンジニア  #################

# スーパークラス定義
class Nogizaka{
    [string] msg(){
        return "乃木坂46"
    }
}

# サブクラス(継承するクラス)定義
class Ikkisei : Nogizaka {
     [string] msg2(){
        $Data = ([Nogizaka]$this).msg()
        $Data += "の1期生は10年活動している"
        return $Data
    }
}
class Nikisei : Nogizaka {
     [string] msg3(){
        $Data = ([Nogizaka]$this).msg()
        $Data += "の2期生は8年活動している"
        return $Data
    }
}

class Sankisei : Nogizaka {
     [string] msg4(){
        $Data = ([Nogizaka]$this).msg()
        $Data += "の3期生は5年活動している"
        return $Data
    }
}
class Yonkisei : Nogizaka {
     [string] msg5(){
        $Data = ([Nogizaka]$this).msg()
        $Data += "の4期生は3年活動している"
        return $Data
    }
}
class ShinYonki : Yonkisei {
    [string] msg6(){
        $Data = ([Nogizaka]$this).msg()
        $Data += "の新4期生は1年活動している"
        return $Data
    }	
}

# インスタンス化
$TestObject = New-Object Ikkisei
$TestObject.msg2()
$TestObject1 = New-Object Nikisei
$TestObject1.msg3()
$TestObject2 = New-Object Sankisei
$TestObject2.msg4()
$TestObject3 = New-Object Yonkisei
$TestObject3.msg5()
$TestObject4 = New-Object ShinYonki
$TestObject4.msg6()

```
Firebase Authentication, Auth0, Amazon Cognitoを比較した

業務の方で認証基盤のリプレイスを行っていて、その際に行ったサービス選定のメモです。
自身が身を置いている会社のサービスでの認証基盤は、パスワードをDBで管理している状態で危殆化リスクがあったり、強固な認証(MFAなど)を入れづらい状態にありました。
今では様々なプロダクトが、認証の処理は他のサービスに任せる傾向にあると認識しております。そもそもセキュリティの分野は奥が深い(自身もほとんど理解できていない)ですし、プロダクトの成長にフォーカスしたいのに、セキュリティの分野に時間を割くのは悪手でしょう。
自社のプロダクトも例にもれず、プロダクトの開発自体にフォーカスするために認証サービスを導入しようという運びになりました。

## サービス候補選び

調べてみると想像より多くのサービスが存在することがわかりました。

- Amazon Cognito
- AWS Amplify Authentication
- Auth0
- Firebase Authentication
- Google Identity Platform
- Azure Active Directory B2C
- Okta Identity Cloud
- IBM Cloud Identity
- Akamai Identity Cloud
- Salesforce Identity
- SAP Customer Data Cloud

もちろんこれらのドキュメントをそれぞれ読み込んで、自社のプロダクトの性質とマッチしたサービスを選ぶことが重要ですが、あまり多くの時間を割きたくはないです。
そこで、自身が担当していないプロダクトにおいて利用事例のあるサービスや利用しているIaaS内部に含まれたサービスに絞って比較を行いました。
この時点で下記の3つのサービスが候補となります。

- Amazon Cognito
- Firebase Authentication
- Auth0

それぞれを下記のような面からみていきます。

- コスト
- 移行プラン
- 高度なセキュリティ機能

## Amazon Cognitoの特徴

### コスト

- 50000人まで無料
- 以降は1人あたり0.0055USD
- 高度なセキュリティ機能利用だと一人あたり0.050USD追加

[https://aws.amazon.com/jp/cognito/pricing/](https://aws.amazon.com/jp/cognito/pricing/)

### 移行プラン

- [lambdaの機能で都度以降](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-lambda-migrate-user.html)
- [CSVを用いた一括以降](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-using-import-tool.html)

### 高度なセキュリティ機能

- 侵害された認証情報の確認
- 怪しい人には2段階認証させる
- 特定IPブロック

[https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pool-settings-advanced-security.html](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pool-settings-advanced-security.html)

## Firebase Authenticationの特徴

### コスト

- 無料(Sparkプラン) 電話認証が月1万回まで
- 有料(Blazeプラン) 電話認証が従量課金

### 移行プラン

- Firebase CLIでCSV or JSONからインポート
- Firebase Admin SDKでインポート
- ref: [https://firebase.google.com/docs/auth/admin/import-users?hl=ja](https://firebase.google.com/docs/auth/admin/import-users?hl=ja)

### 高度なセキュリティ機能

- 特になし

## Auth0の特徴

### コスト

- プランによって様々
- 無料でも利用可能
- ref: [https://auth0.com/jp/pricing](https://auth0.com/jp/pricing)

### 移行プラン

- エンタープライズプランだと[自動マイグレーション](https://auth0.com/docs/users/import-and-export-users)を利用した都度移行が可能
- [JSONファイルで一括、またはDBに直接つないで一括移行](https://auth0.com/docs/extensions/user-import-export-extension)

### 高度なセキュリティ機能

- [パスワード侵害の検出](https://auth0.com/docs/attack-protection/breached-password-detection)(エンタープライズプランのみ)
- ボットやブルートフォースアタックの検出
- IPスロットリング
- ref: [https://auth0.com/docs/attack-protection](https://auth0.com/docs/attack-protection)

## 結論

採用したのはAuth0でした。機能面との考慮でCognitoが最もコスパ良いのですが、背景としては下記のような事が挙げられます。

- ドキュメントが豊富
- 自社のプロダクトでの導入実績あり＆認証基盤を統一したいモチベーションもある
- M2M認証がアドオンとして提供されていて、他の仕組みが作りやすい

基本的に利用しやすさの面での採用が大きかった気がします。実際に導入を進めていますが、情報が充実しており、今の所困った点はありません。

## 終わりに

選定にあたり参考となったサイトを挙げておきます。このサイトから辿れるBoothもとても参考になりました。

- [https://s-takayanagi.hatenablog.com/](https://s-takayanagi.hatenablog.com/)
TypeScript + Expressでクリーンアーキテクチャをシンプルに実装してみた

表題の通り、クリーンアーキテクチャを実装してみたのでそのまとめ記事です。

## クリーンアーキテクチャとは

このあたりは調べるとたくさん出てくるのであえて自分の言葉で説明する必要はなさそうです。

- [世界一わかりやすいClean Architecture](https://www.nuits.jp/entry/easiest-clean-architecture-2019-09)
- [実装クリーンアーキテクチャ](https://qiita.com/nrslib/items/a5f902c4defc83bd46b8)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231086/e5b83322-5207-377d-b7ee-71373a7ac741.png)


有名な図はこれですよね。
各レイヤーについて簡単にまとめます。

### Enterprise Business Rules(黄色)

そのビジネスのルールそのものをカプセル化したもの。メソッドを持ったオブジェクトでもデータ構造でもOK。

### Application Business Rules(赤色)

アプリケーション固有のビジネスルールをカプセル化したもの。Enterprise Business Rules層への入出力を調整し、それらに最重要のビジネスルールを実行させる。
難しい表現ではありますが主に下記のような役目があるものだと理解しています。

- Enterprise Business Rules層が処理を行えるように入力を変更
- 行った処理をDBに保存して永続化
- 出力を調整

特に「行った処理をDBに保存して永続化」の部分はこのレイヤーを象徴する部分に思えます。
Enterprise Business Rules(黄色)はビジネスのルールであって、それをアプリケーションとして反映させる役目がこのレイヤーということですね。

### Interface Adapters(緑色)

このあたりから徐々に外向きの機能となっていきます。Webやモバイルのアプリケーションへの出力のためにデータ構造を調整する役目を担っています。
MVCアーキテクチャでいうとC(Controller)がこの部分を担うようになっていますね。

### Frameworks & Drivers(青色)

文字通りデータベースやフレームーワークがこのレイヤーにあたります。
これらが外側にあることによって、MySQL→MariaDBに置き換えたいとか、Express→NestJSに置き換えたいといったことが比較的容易にできるようになります。

## 構成

今回は簡単なTODOアプリのWebAPIを実装しました。([リポジトリはこちら](https://github.com/youchann/todo-typescript-clean-architecture))

```
./app
├── application
│   ├── type
│   └── useCase       // Application Business Rules(赤色)
├── entity            // Enterprise Business Rules(黄色)
│   └── todo.ts
├── index.ts
├── infrastructure    // Frameworks & Drivers(青色)
│   ├── database.ts
│   └── router
└── interface         // Interface Adapters(緑色)
    ├── controller
    ├── repository
    ├── serializer
    └── type
```

`interface/type`や`application/type`は型や抽象クラスを格納する場所となっています。このあたりの型を外のレイヤーから参照することによってDIP(依存性逆転の原則)を実現しています。なので内側のレイヤーは外側のレイヤーの実装に依存することはない状態となっています。

## 感じたこと

### MVC慣れしている人には理解に時間がかかる

自分はRailsやCodeigniterといったフルスタックなフレームワークに慣れていたので、設計や実装にかなりの時間を要しました。DIPといった概念も全く触れていなかったので当初は全くわからなかったです。
あまり経験のないエンジニアの多いチームとかだと、こういったアーキテクチャは採用しないのではないかと思いました。

### 導入コスト高い

プロダクト初期の段階だとこのようなアーキテクチャをガッツリ取り入れることはないかなと思いました。自分の実装を見ていただけるとわかるのですが、たった1コのテーブルをWebAPIから操作するだけなのに、かなり多くのファイルを持っています。これだと初速が確実に遅くなりますし、ビジネスが当たるかわからない状況下において、いきなり取り入れるのは難しいかなと思いました。

### フレームワークやライブラリの移行がかなり容易になる

感じたことというより事実なのですが、外側のレイヤーは依存がないので修正が容易になります。
例えば自分のリポジトリにおいてExpressからKoaに切り替えたいといった場合、修正する箇所はinfrastructureディレクトリ内部のファイルのみです。MySQLから他に乗り換えたいといった場合も同様です。
もちろんインターフェイスを整えるといった工数は発生しますが、修正箇所が限定的ですぐにわかるのがこのアーキテクチャの強みだなと思いました。

## 終わりに

クリーンアーキテクチャの勉強を通じて、技術の肥やしがまた一つ増えた感覚を覚えました。やはり定期的に自分の武器を増やす行為はしていきたいですね。
Solana archive node を建てたいメモ

## 背景

Solana の archive node へアクセスしたい.
(残高の遷移をみたいとか)

https://blog.quicknode.com/quicknode-archival-node-arrives-on-solana/

2021/8 月時点で 17 TB くらい必要となっています...

## 情報

https://blog.lopp.net/2021-altcoin-node-sync-tests/

メモリ 128 ~ 256 GB ないと out-of-memory あたりで落ちるぽい.

## とりあえず archive アクセスしたい

QuickNode で対応しています.

https://www.quicknode.com/chains/sol

ただし archive node へのアクセスは 10 回/month まで
(それ以上だと $250/month かかる)

## TODO

* [ ] メモリ 128 GB ~ 256 GB マシンを用意して sync 試す.
* [ ] どのコマンドで archive node を建てることができるか調べる
シェルスクリプトの後ろにバイナリを埋め込む手法はPOSIXで考慮されているという話

思いっきり雑学レベルの話ですみませんが、思い出した今書かないと忘れそうだなと思ったのでｗ

この手法で何が出来るかと言うと、シェルスクリプトを実行するとスクリプトファイルの後ろ（`exit` で終了されて実行されない領域）に結合されたバイナリ形式の圧縮ファイル部分を抜き出して `/tmp` 以下に展開してそこに含まれているバイナリ形式の実行ファイルを実行して、一見シェルスクリプトのように見えるのに実はバイナリファイルを実行してるじゃんなどという楽しいことができます。いかにもハックまがいの手法に見えますが、どうやらこの手法は POSIX で考慮されているようです。

これを知ったのは「[シバン shebang がないシェルスクリプトはどのシェルで動くかわからない（からちゃんと書いとけ）](https://qiita.com/ko1nksm/items/1dd4937e7f0cc2ba3f75)」の記事を書いている時に見つけた fish の [PR 7802](https://github.com/fish-shell/fish-shell/pull/7802) です。fish はシバンがないスクリプトを実行するとエラーになっていたのですが 3.3.0 からエラーにならずに POSIX シェルで実行するようになりました。PR 7802 はその修正を行った PullRequest です。

この PullRequest によると、（この修正により fish は）「バイナリコンテンツが結合されたシェルスクリプトを実行できるようになります。」「POSIX は最近この動作を要求するように改定されました」とあります。

> ...
> it can run shell scripts having concatenated binary content. 
> ...
> POSIX was recently revised to require this behavior:

この話に関係する POSIX の Issue Tracker(Austin Group Defect Tracker)の Issue は次の ２ つです

- https://www.austingroupbugs.net/view.php?id=1250
- https://www.austingroupbugs.net/view.php?id=1226

詳細は記事参照ということで逃げますが、ようするには以前は「シェルスクリプトはテキストファイルでなければならない」という仕様だったのが「実際にはシェルスクリプトの後ろにバイナリコンテンツ（圧縮ファイルなど）が結合されたシェルスクリプトがたくさん使われてるよね？テキストファイルでなければならないだとダメだよね？」という流れで、シェルスクリプトが実行可能かどうかを判断する方法が修正されました。

ま、POSIX ってこういうもんです。POSIX が仕様を決めてみんながそのとおりに実装するという流れではなくて、現実の実装を元に仕様としてまとめてるだけなんです。どの実装も今はこうなってるからこれを仕様にしようぜって後から改定してるのが POSIX です。

ということで今はそういうシェルスクリプトは POSIX で認められているということです。POSIX 準拠の方法ですので、みなさんもバンバン、シェルスクリプトにバイナリを埋め込みましょう！
初めてのブロックチェーン

#ブロックチェーンってなぁに？
ビットコインを実現するために作られた管理者のいらない取引の仕組みです。

##仕組みってどういうこと？
特徴として
①正しい記録しか記録できない
②管理者不在、参加者全員で共有、運用する
③ネットワーク共有型のデータベースのようなもの
つまり
データベースの一種で、データベースの機能を強化する仕組み、と言えます。

##へ〜、どうやって強化するの？
こんなルールがあります。
①ルールに沿った書式のデータだけが記録できる
②参加者全員で合意されたデータだけが有効になる
③一度書き込まれたデータは変更、削除できない
④システム全体を止めることはできない

##で、何が記録されるの？
取引の履歴が記録されるます
ビットコインのように、「誰と誰がどんな取引をしたのか」などが記録されます。



#そもそも、ブロックチェーンて何がいいの？
ブロックチェーンでは非中央集権が実現できるよになります。

###今までの取引は中央集権
取引を行う際、間に管理者を挟む　＝　管理者がデータの正確性を確保する
**中央集権の問題点**
管理者に情報が集中している。
その管理者に問題が発生すると・・・想像に容易いですね。

###ブロックチェーンでの非中央集権
管理者不要で取引が行える　＝　ブロックチェーンで正確性を確保する

##ブロックチェーンは、どうやって正確性を確保しているの？
データの書き換えをできないようにしました。

##書き換えできなくしたの？どうやって？

①一定期間ごとに、誰でも見れる台帳に取引履歴を「ブロック」単位で格納しチェーン状に繋げる
②新規で繋げるブロックには、**取引データ**、**前のブロックのハッシュ値**、**ナンス**を格納する
③ナンスの計算に誰でも参加できるようにし、善意の参加者全員による監視を実現した

* **前のブロックのハッシュ値**：前のブロックの情報全て（前のブロックの取引データ、前の前のブロックのハッシュ値、前のブロックのナンス）を元に計算される一意の値
* **ナンス**：次のブロックに格納される予定のハッシュ値が一定の条件を満たすようにする値。書き換えに莫大な計算能力が必要


これにより、１つのブロックを改ざんすると、データの整合性を偽造するために、
そのブロック以降の「ナンス」も同時に再計算する必要が出てきます。

そのためには、善意の参加者全員よりも高い計算能力が必要となります。
結果として、改ざんは現実的ではない　＝＞　改ざんできない　＝　正確である、と言えますね。
このような構造で正確性を証明することをプルーフ・オブ・ワークというみたいです。


##でもさ、善意の参加者はどうやって集めるの？？
マイニングを実施することで参加者を集めています。

##マイニング？何それ？
ナンスの計算を最初に完了した人に報酬を与える仕組みのことです。
新規のビットコインの発行はマイニングでのみ行われています。
この報酬を求め、参加者が利己的にマイニングを行なっている、というわけです。


#ブロックチェーンってどんなのがあるの？
①オープン型（ビットコインなど）
・誰でも参加できる（匿名で参加できる）
・参加者の数に制限がない
・中央管理者がいない
**特徴**　：　悪意のある参加者がいることを前提として形成されている　＝＞　取引の承認にコストがかかる


②クローズド型
・特定の範囲の認証された者のみ参加
・参加者の数に制限がある
・中央管理者あり
**特徴**：信頼できる者のみが参加していることを前提として形成されている　＝＞　取引の承認コストを抑え、高速化できる



##ブロックチェーンっていいことばかりなの？
そうでもありません。
ブロックチェーンはデータの変更、修正ができないため、　サービス提供者の信用性が上がると言えます。
一方で、 **誰でも見ることができる**ということは、個人情報が流失し放題とも言えますよね。

つまり
商用取引には向いているが、個人情報の蓄積には向かない。と言えそうです。


##ブロックチェーンは他に何に使われているの？
現在はまだ色々な課題があるようですが、可能性がとても期待されている仕組みのようです。
仮想通貨や金融分野で使われ始めているようです。
gitlab-ceのパスワードリセット

サンプルで rootパスワード忘れた場合を試してみた

```shell
 $ sudo su -
 $ gitlab-rails console -e production
```

```rb
user = User.find_by_username 'root'
user.password = 'password'
user.password_confirmation = 'password'
user.send_only_admin_changed_your_password_notification!
user.save!
```

最近のアプデで **user.send_only_admin_changed_your_password_notification!** が追加されたから、ドキュメントしっかり読まないと更新できないっぽい

# 参考
https://docs.gitlab.com/ce/security/reset_user_password.html#reset-your-root-password
Unity コンポーネントを持っているかを調べる

##0.0　はじめに
ゲームオブジェクトに特定のコンポーネントが含まれているか調べる





##1.0　結論
GetComponent<>()の返り値で判断可能です。
例えばゲームオブジェクトにRigidbodyコンポーネントが含まれていればGetComponent< Rigidbody>()の返り値はtrue、含まれてなければ返り値はfalseとなります。、





```C#:Test.cs
if (GetComponent<Rigidbody2D>()) {
    Debug.Log("Rigidbody2D含まれてるよ");
} else {
    Debug.Log("Rigidbody2D含まれてないよ");
    gameObject.AddComponent<Rigidbody2D>(); // 含まれてなければ加える
}
```






##2.0　おまけ
下記のように[RequireComponent (typeof ())]のアトリビュートを付けているとコンポーネントを自動に追加してくれます。
**ポスト** typeof ()の（）中にコンポーネント名を入れる。




```C#:Test.cs
[RequireComponent (typeof (Rigidbody))]
public class Test : MonoBehaviour {

}
```
LambdaでDropbox内にフォルダを作成する

LambdaでDropbox内にフォルダを作成したときの個人メモ

# 前提
[LambdaでDropbox APIを実行する](https://qiita.com/nkmk1215/items/573bce8924f42d4d9690)ができていること

# 実行手順
- 実行前のDropboxの状態を確認

![025.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/2189750c-c0c8-d4d5-dc25-63668d5736aa.jpeg)

- [/create_folder](https://www.dropbox.com/developers/documentation/http/documentation#files-create_folder)を利用ために必要な権限が「files.content.write」であることを確認

![024.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/a9be74f8-2b3f-d26e-40db-c9fd349c1f44.jpeg)

- アプリ情報から権限を確認、「files.content.write」にチェックが入れて「submit」を押下

![026.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/948d1c6b-c2b2-bc64-bc17-4c3ec9e32657.jpeg)

- 権限変更後リファレンスを再読み込み、アクセストークンを取得する  
  　※権限変更後に再度アクセストークンを取得しない場合、「missing_scope」エラーとなる

![029.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/bf24302c-7ac4-e9ae-3e52-103ea36f4f42.jpeg)

- EXAMPLEからcurlコマンドをコピーしソース修正

```hello.sh
function handler () {
    EVENT_DATA=$1

    HTTP=`curl -X POST https://api.dropboxapi.com/2/files/create_folder_v2 \
    --header "Authorization: Bearer （アクセストークン）" \
    --header "Content-Type: application/json" \
    --data "{\"path\": \"/Homework/math\",\"autorename\": false}"`
    RESPONSE="{\"statusCode\": 200, \"body\": \"$HTTP\"}"
    echo $RESPONSE
    
}
```

- 「Test」を押下し、実行

![030.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/1a7bc178-6361-4524-18f5-d0afff707fa0.jpeg)

- レスポンスを確認

![031.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/ddbee752-8569-c0d3-fe45-8f28c335e26b.jpeg)

- フォルダ（/Homework/math）が作成されていることを確認

![033.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/b55d230b-1805-43b7-59be-d8303e130902.jpeg)

# 感想
- アクセストークンの取得をリファレンス上から行えるのはすごく楽
- ファイルのアップロードもできるようになりたい
plunkerでタイミングチャート その3

#概要

plunkerでタイミングチャート、やってみた。

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/20e5103c-5d78-2872-3fe7-546f6c0b573b.jpeg)


#成果物

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

以上。
PowerShell で sbt を実行したときに日本語を文字化けさせない方法

PowerShell で [sbt](https://www.scala-sbt.org/) を起動した際、出力（ファイルパス等）の日本語部分が文字化けしてしまうことがあります。
これは、PowerShell のシステムコンソールの出力エンコーディング設定が Shift JIS (CP932) であるのに対し、sbt の出力エンコーディングが UTF-8 であるためです。

有名な解決法として、`chcp` コマンドを前もって実行しておき、コンソールのコードページを `932` から `65001` (=UTF-8) に変更する方法が挙げられます。

```powershell
chcp 65001
sbt
```

さて、この方法でも問題はないのですが、`chcp` でコードページを変更するとコンソールの表示がクリアされてしまいます。

![chcp-clear-console.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/85c1b294-0c8a-116a-4dd6-2c6aaca8669d.gif)

これが気になる場合は、PowerShell ネイティブな方法でコンソールの出力エンコーディング設定を変更することで回避できます：

```powershell
[Console]::OutputEncoding = [Text.Encoding]::GetEncoding('utf-8')
sbt
```

この設定は現在の PowerShell セッションの間だけ持続します。同セッション内で Shift JIS に戻したい場合は、以下のコマンドを実行します：

```powershell
[Console]::OutputEncoding = [Text.Encoding]::GetEncoding('shift_jis')
```

![pwsh-notclear-console.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/36845e55-3f9c-294c-4d7a-cb0dd3fd7319.gif)

## 参考リンク

* [chcp](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/chcp)
* [PowerShell 7をインタラクティブシェルとして使う - 文字化けを解消](https://news.mynavi.jp/itsearch/article/hardware/5170)
* [Encoding.GetEncoding メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.text.encoding.getencoding?view=net-5.0)
* [各種処理の入出力文字コード設定方法](https://satob.hatenablog.com/entry/20140729/p1)
plunkerでタイミングチャート その2

#概要

plunkerでタイミングチャート、やってみた。

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/fa99046d-2ce6-2a8b-b6b3-9ca66c617788.jpeg)


#成果物

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

以上。
Laravel viewに共通変数を使いたいが中身を画面に応じて変えたい

Qiita投稿 #30

今回は・・・
Laravelのビューコンポーザを使用した時の備忘録です。

```php:SampleProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;

class SampleServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     * 
     */
    public function register()
    {
        
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {

        View::composer(['Sample1','Sample2','Sample3'],'App\Http\ViewComposers\SampleComposer');

    }
}
```
`php artisan make:provider SampleServiceProvider`
上記でプロバイダを作成しbootメソッド内にviewを指定します。
Sample1,2,3には同じ変数を使用するが中身は変えたいという場合を想定し、SampleComposerで条件分岐させます。


```php:SampleComposer.php
<?php 
namespace App\Http\ViewComposers;

use Illuminate\View\View;

class NamingComposer
{
    // 省略

    public function compose(View $view)
    {
        
        // 画面に応じて分岐
        switch($view->name()){
            case 'Sample1':
                $view->with('success','サンプル１です');
                break;
            case 'Sample2':
                $view->with('success','サンプル２です');
                break;
            case 'Sample3':
                $view->with('success','サンプル３です');
                break;
            default:
                break;
        }
    }
}
```
laravelで用意されているViewクラスのメソッドを使う場合`view()`もしくは`view->with()`で画面や変数指定をする機会が多いと思います。
日本語記事でこれ以外のメソッドが紹介されているのはあまり見かけませんが、laravel APIドキュメントを見ると様々なメソッドが用意されています。
#### view->name()
`view->name()`は現在のviewの名前を取得します。
今回はこちらのメソッドを使用しSampleComposer内で画面名に応じて処理を書いていきます。
またサービスコンテナに共通ロジックを書いておくことで、「依存度が下がる」「複数のファイルに同じコードを書かなくて済む」「修正する際は１つのファイルのみで済む」「可読性が上がる」など様々なメリットがあります。composerでも独自のサービスコンテナを使用することができますので、積極的にサービスコンテナとビューコンポーザを使っていきたいですね。一人でアプリケーションを作成する時は気にする必要はあまりないですが、チームで開発するときは「共通項はまとめる」という意識が重要かと思います。

###参考
https://laravel.com/api/6.x/Illuminate/View/View.html
plunkerでタイミングチャート

#概要

plunkerでタイミングチャート、やってみた。

#参考にしたページ

https://qiita.com/0x20FE/items/d446cdb838c9af544bd2


#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5538645e-eb1f-543c-d925-2ee51fa27114.jpeg)



#成果物

https://embed.plnkr.co/plunk/1ANxAA8ezSdAMaHh


以上。
iOSアーキテクチャ勉強

## MVC(Cocoa MVC)

- View
  - 表示、入出力
- Controller
  - 入力に基づくModelとViewの制御
- Model
  - データの保持、通信

ViewControllerがViewとControllerの役割を両方持つため肥大化しがち
Massive View Controllerとか呼ばれる

普通言われるMVCとはModelがデータの変更をViewに通知すると言う点で違う

## MVP

MVCと違い入力を受け付けるのがControllerではなくViewになるViewControllerはViewとして扱われる
- Supervising Controller
  - データバインディングによりViewがModelを監視し、データ更新があれば表示も更新する
  - データを加工せずに表示できるのでPresenterの負担を軽減できるがModelがViewのレイアウトに依存する
- Passive View
  - 必ずmodelとViewの間はPresenterが介すのでViewとModelが分離するがPresenterの負担増

## MVVM

ViewとViewModelをデータバインディング。MVPと違うのはMVPはデリゲートやインターフェイスで処理を移譲・更新処理を行うのに対して、MVVMではデータバインディングでViewとViewModelを紐づける

## クリーンアーキテクチャ

- GUIアーキテクチャ
  MVC,MVP,MVVMなどUIに関するロジック

クリーンアーキテクチャはUIに関するロジック(プレゼンテーション層)とシステムに関するロジック(ドメイン)を分離するのが目的
## 3階層システム
  - プレゼンテーション層(ユーザーインターフェース層)html,swift,
    ページの表示、ページ間の遷移、ユーザーが入力した内容をビジネスロジック層に受け渡す処理などを行う、
  - ビジネスロジック層(アプリケーション層)php,python,ruby
    プレゼンテーション層、データアクセス層がすること以外が全部ここ。
  - データアクセス層 sql
    CRUDのしょりをおこなう

  よくMVCとかMVVMとかは全部プレゼンテーション層の話
##  参考
:https://qiita.com/os1ma/items/7a229585ebdd8b7d86c2
      https://www.ibm.com/jp-ja/cloud/learn/three-tier-architecture
      https://qiita.com/navitime_tech/items/602d3286f23952ae0149#mvp-model-view-presenter
【kintone】サブテーブルの行を自動追加・削除する

## やりたいこと
数値フィールドに入力された値を元にサブテーブルの行を追加したり削除したりしたい

## フィールドとフィールドコード
| タイプ | フィールド名 | フィールドコード |
|:-:|:-:|:-:|
| 数値 | テーブルの行数 | rowCount |
| テーブル | テーブル | table |
| 文字列（1行） | 文字列（1行） | string |

![スクリーンショット 2021-08-29 14.00.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205237/bd06a691-f871-5a5f-525b-963529a5eeaa.png)


## コード
```javascript:sample.js
(function() {
    "use strict";
    // rowCountフィールドが変更されたときに動かす
    const events = ["app.record.create.change.rowCount",
                    "app.record.edit.change.rowCount"];
                    
    kintone.events.on(events, function(event) {
        const record = event.record;
        const rowCount = record.rowCount.value;
        const tableLength = record.table.value.length;
        if (rowCount > tableLength) {
            // 行を増やす処理
            for (let i = 0; i < (rowCount - tableLength); i++) {
                record.table.value.push({
                    "value": {
                        "string": {
                            //追加した行数を確認するためにvalueに数字を設置セットする
                            "value": i + 1,
                            "type": "SINGLE_LINE_TEXT"
                        }
                    }
                });
            }
        } else if (rowCount < tableLength) {
            // 行を減らす処理
            record.table.value.splice(rowCount, tableLength - rowCount);
        }
        return event;
    });
})();
```

## できた
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205237/db0dd38e-5f74-87f8-c9c8-68bdff952a0f.gif)
command not found:nodeエラーが表示されたときの解決方法

#エラーケース
ターミナルでnodeのバージョン確認をするコマンド「node --version」を実行したら、「command not found:node」というエラーが返ってきてしまう。”node”というコマンドが認識されていないみたい。

#解決方法
「node」をインストールすればOK
https://nodejs.org/ja/download/

npmも同様にインストールすればコマンドとして認識されるようになる。
pyenv installで"C compiler cannot create executables"で失敗するときの対応方法


## 概要

`pyenv install 3.9.4`で以下のエラーが出た。（エラーの前後は省略）

```
configure: error: C compiler cannot create executables
```

3.9.4を別のバージョンに変えても同じエラーで失敗する。


結論としては、xcode-selectをインストールし直したら成功した。


## 環境

* macOS Big Sur
* pyenv 2.0.5


## 対応方法

```
$ sudo rm -rf /Library/Developer/CommandLineTools
$ xcode-select --install
```


自分はこの方法でうまくいきましたが、実行するときは自己責任でお願いします。
MacでUnreal Engineを使用する際の注意点

MacユーザーでUnreal Engineの使用を諦めてしまう人が少なからずいるようなので、自分が調べてわかった範囲でメモしておきます。

#1.キーボードの入力ソースはU.S.
　これで、ドロップダウンリストを開いたときのフリーズを防止できるようです。

#2. ._ファイルはdot_clean等で削除しておく。
 こんな感じのクイックアクションを登録しておくといいかも。コンパイル時に自動的にdot_cleanを実行できればいいんですが。
C++Classを追加する前やWindows版などでプロジェクトを開く前は、必ずdot_cleanしましょう。トラブルは起きにくくなるはずです。
![quickActionForDot_clean.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245844/58ea1f0a-4c97-8ee6-a822-1c38440f65e3.jpeg)

#3.存在していないファイルをコンパイルしてしまう場合は、File>Refresh Xcode Project
Visual Studio(code)でも同じような対処法になると思います。

#4.ファイヤーウォールの設定を見直す
 UExEditor.appとUnrealFrontend.app、それとUnrealLightmassの外部からの接続を許可してあげてください。
これでライティングビルドもできるはずです。
![firewallsettingforUE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245844/2856bdff-3ec1-ac25-1c39-1ea17f4a6ca0.jpeg)
参考URL:https://answers.unrealengine.com/questions/771668/mac-ue4183-cant-build-lighting.html?sort=oldest


#最後に
　C++のコード追加でトラブルが多い印象。
これで、Windowsとも行ったり来たりできるはず。

ライティングビルドができない件も自分の環境では解決できました！やったね！
【TypeScript入門】配列とタプルについて簡単にまとめてみた

# はじめに
TypeScriptで配列とタプルを扱い方を簡単にまとめました。

## 配列の要素として持つ値の型を定義できる

```typescript
  // シンプルな配列の型定義
  const colors: string[] = ['red', 'blue']
  colors.push('yellow') // OK
  // colors.push(123) // コンパイルエラー
  console.log('sample:', colors)
```

## 配列定義方法:T[]とArray<T>は同義
```typescript
  const even: Array<number> = [2, 4, 6]
  even.push(8) // OK
  // even.push("100") // コンパイルエラー
  console.log('sample:', even)
```

## 合併型も使える
* 特別な理由がない限り使わないほうがよい
    * for文等で値を取得する際に値の型に気をつけないといけないから

```typescript
  // 合併型を用いた配列の型定義
  const ids: (string | number)[] = ['ABC', 123]
  ids.push('DEF') // OK
  ids.push(456) // OK
  console.log('sample:', ids)
```

# 配列の型推論
* アノテーションしなくても型推論される

```typescript
 // 型推論された配列の生成
  const generateSomeArray = () => {
    const _someArray = [] // any[] 　　　　　*　変数名の_は、内部だけで扱われるという意味
    _someArray.push(123) // number[]として推論される
    _someArray.push('ABC') // (string | number)[]として推論される
    return _someArray
  }

  const someArray = generateSomeArray()
  someArray.push(444)
  // someArray.push(true) // generateSomeArray()は(string | number)[]の配列を返すと推論されるので、booleanは追加されない
  console.log('sample:', someArray)
```

#  タプルについて〜より厳格な配列〜
* タプルは配列の各要素の数と型を定義できる

```typescript
  // 一般的なタプルの型定義
  const response: [number, string] = [200, 'OK']
  // response = [400, "Bad Request", "Email parameter is missing"] // 定義された要素数と合わない
  // response = ["400", "Bad Request"] // numberにstringを代入できない
  console.log('sample:', response)
```

* 可変長（レストパラメーター）も使える

```typescript
 // 可変長引数を使ったタプル
  const restParameters: [string, ...string[]] = ['ABC', 'DEF', 'GHI']
  restParameters.push('JKL')
  console.log('sample:', restParameters)
```

# イミュータブルな配列
* Javascriptの配列はconstで宣言してもミュータブル（書き換え可）

```typescript
 // Javascriptの配列
      const commands1: string[] = ['git add', 'git commit', 'git push']
      commands1.push("git fetch") // 追加OK
      commands1[2] = "git pull" // 代入OK
      console.log('sample:', commands1)
```


* readonlyでイミュータブル（書き換え不可）な配列/タプルを作れる

```typescript
    // 読み取り専用の配列
    const commands2: readonly string[] = ['git add', 'git commit', 'git push']
    // commands2.push("git fetch") // 追加不可
    // commands2[2] = "git pull" // 代入不可
    console.log('sample:', commands2)
```

* readonlyの別の書き方

```typescript
    // 読み取り専用の定義方法
    const immutableNumbers: ReadonlyArray<number> = [1, 2, 3]
    // immutableNumbers.push(4) // NG
    console.log('sample:', immutableNumbers)

    const immutableNames: Readonly<string[]> = ['Tarou', 'Kazu', 'Yuto']
    // immutableNames.push("Takashi") // NG
    console.log('sample:', immutableNames)

```
ラビットチャレンジ

# ラビットチャレンジの為の数式の書き方
※本記事は必要な時に随時追記していきます

## 数式の記述
数式の前後を`$`で挟むことで文中に数式を表示することができる。

$y = x^2 + 2x + 4$

* 書き方

> \$y = x^2 + 2x + 4\$

## Tex記法で記述
コードブロックにmathを指定してTex記法で数式を記述することができる。

```math
y = x^2 + 2x + 4
```

* 書き方

> \`\`\`math
> y = x^2 + 2x + 4
> \`\`\`


# いろいろな数式の練習
ディープラーニングで使われている数式を記述する。

## 記号

|記号|書き方|
|:-:|:-:|
|$\alpha$|\alpha|
|$\beta$|\beta|
|$\gamma$|\gamma|
|$\pi$|\pi|
|$\phi$|\phi|
|$\varphi$|\varphi|
|$\mu$|\mu|


参考
・https://en.wikibooks.org/wiki/LaTeX/Mathematics#List_of_mathematical_symbols

## 指数/項目数

$k_{n+1} = n^2 + k_n^2 - k_{n-1}$

* 書き方
> \$k_{n+1} = n^2 + k_n^2 - k_{n-1}\$

・指数は「^」
・k項は「_」
・「{ }」で括ることも可能

## 行列

```math
A = \left(\begin{matrix} a & b & c \\ d & e & f \\ g & h & i \end{matrix} \right)
+ \left(\begin{matrix} a & b & c \\ d & e & f \\ g & h & i \end{matrix} \right)
```

* 書き方

> \`\`\`math
A = \\left(\\begin{matrix} a & b & c \\\\ d & e & f \\\\ g & h & i \\end{matrix} \\right)
+ \\left(\\begin{matrix} a & b & c \\\\ d & e & f \\\\ g & h & i \\end{matrix} \\right)
\`\`\`

|項目|内容|
|:-:|:-:|
|\beigin{matrix}|行列の開始|
|\end{matrix}|行列の終了|
|\left|左大括弧|
|\right|右大括弧|

* 連立1次方程式

```math
\left\{\begin{matrix}x_1 + 4x_2 = 7 \\ 2x_1 + 6x_2 = 10\end{matrix}\right.
```

* 書き方

> \`\`\`math
\left\{\begin{matrix}x_1 + 4x_2 = 7 \\\\ 2x_1 + 6x_2 = 10\end{matrix}\right.
\`\`\`

# 参考
https://en.wikibooks.org/wiki/LaTeX/Mathematics