OmniAICreator/Qiita-1.07M huggingface dataset:
Power Automate: 書式編集出来ない（テーブル化無しで） Excel に書き込む

# 概要
部署間の業務フローを見直したいのに見直せず、Excel書式で社員の回答を提出しないといけない。
そんな時に、Formsで集めてExcel書式に流し込む方法の備忘録

0. Excelに流し込む Office Scripts
0. 回答を集める為の Forms
0. Forms 回答をTriggerとして、office scripts を動かす Power Automate

## Excelに流し込む Office Scripts

- 流し込みたいセルの分だけ引数を用意して定義。ここが今回の肝:point_up_tone2:。

[MS: 自動で実行される Power Automate フロー内で、データをスクリプトに渡す](https://docs.microsoft.com/ja-jp/office/dev/scripts/tutorials/excel-power-automate-trigger)

```typescript
function main(workbook: ExcelScript.Workbook, 
	department: string,
	userName: string,
	answer1st: string,
        // 以降省略 //
	) {
	let selectedSheet = workbook.getActiveWorksheet();
	// Excel書式のセルに目的の値を流し込む
	selectedSheet.getRange("E2").setValue(department);
	selectedSheet.getRange("E3").setValue(userName);
	selectedSheet.getRange("A5").setValue(answer1st);
        // 以降省略 //
}
```

## 回答を集める為の Forms

- 注意点
    - Formsの質問
        - AutomateでOffice Scriptsの引数と関連可能なように番号付けなどしておくと良い
    - Formsの回答
        - Excelで入力したいデータを、Formsで渡せるようにしておく
        - 例）選択肢の結果だけを渡したい場合は、選択肢の先頭に番号を入れておいて、Automateで一文字目だけ切り出す。

![2021-06-13_22h49_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/23b53ee6-0abc-2091-57dc-808ad8767fdd.png)

## Forms 回答をTriggerとして、office scripts を動かす Power Automate

- 利用例
    - 回答の詳細を取得
    - 回答者の情報を取得
    - Run Scriptで、必要な情報を流し込み
![2021-06-13_22h54_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/50211cb0-bf64-24ba-32ee-fca794469559.png)

# まとめ

- こんなことをするよりは・・・部門間のフローを最適化すべきです、ほんと。でも、政治力無いと難しいんで、まずはこういう地道なところから・・:thinking:
Unity スクリプトでのオブジェクトの移動


## 0.0 はじめに
オブジェクトを移動させる方法はいろいろとありますが、代表的な方法をまとめたいと思います。
Unityでオブジェクトを移動させるには、大きく2つの方法があります。
1つは、**座標を変更して**移動させる方法。もう1つは、オブジェクトに**力を加えて**移動させる方法です。







<br>

## 1.0 座標を変更させることによる移動
transformを使用して座標を直接変更します。オブジェクトを移動させるのに一番簡単で単純な方法です。ただし物理演算を無視した座標の変更は自然な動きに反しますので注意しましょう。






<br>

#### 1.1 positionの変更による移動
直接座標を変えて移動するシンプルな方法です。



👍**ポイント**
transform.position（transform.position.x または y, z）には直接値を代入出来ないので注意が必要です。
Vector3(Vector2)の変数を介してtransform.positionを変更します。

```C#:test1.cs
    Vector3 pos = transform.position; // 現在のポジションを代入
    pos.x = 1.0f; // x座標変更
    pos.y = 2.0f; // y座標変更
    pos.z = -1.0f; // z座標変更
    transform.position = pos; // 変更後の座標を代入
```





または下記のように変更します。

```C#:test2.cs
    transform.position = new Vector3(1.0f, 2.0f, -1.0f); 
```




<br>

#### 1.2 Translate関数を使った移動
transform.Translate(x, y, z)を使用してオブジェクトの現在の位置を基準に移動する方法です。
Translate()の引数で指定したベクトルx・y・z分だけオブジェクトの位置を移動させることができます。
 
```C#:test3.cs
    transform.Translate(1.0f, 2.0f, -1.0f);  
```




<br>

#### 1.3 Vector3.MoveTowards関数を使った移動
Vector3クラスにMoveTowards関数があります。MoveTowards関数は**現在地**から**目的地**まで**一定速度**で移動させてくれる関数です。引数には順番に “current” に現在地（Vector3）、”target” に目的地（Vector3）、”maxDistanceDelta” に１フレームの距離(一定速度)をfloatで指定します。

```C#:test4.cs
    Vector3 current = transform.position;
    Vector3 target = new Vector3(10, -5, 0);
    float step = 2.0f * Time.deltaTime;
    transform.position = Vector3.MoveTowards(current, target, maxDistanceDelta);
```








<br>

#### 1.4 Vector3.Lerp関数を使った移動
Vector3クラスにはLerp関数もあり、これを使用してオブジェクトを移動させることができます。
Lerp(a, b, t)関数の引数は　**a : 始まりの位置, b : 終わりの位置, t : aからの現在の位置の割合**です。

👍**ポイント**
tが0の時はaの地点、tが1の時はbの地点です。




```C#:test5.cs
    Vector3 start = transform.position;
    Vector3 target = new Vector3(10, -5, 0);
    float timer = 0; 
    timer += Time.deltaTime;
    transform.position = Vector3.Lerp(start, target, timer); // timerの変化分だけ移動させる（1秒で目的地）
```







<br>

## 2.0 力を加えることによる移動

オブジェクトにRigidbody(リジッドボディ)コンポーネントを追加することで、物理演算で移動させることができます。



InspectorウインドウでAdd Componentボタンを押して検索窓でRigidbodyを検索して追加しましょう。※2Dの場合はRigidbody 2Dを選びます。




👍**ポイント**
Rigidbodyには**Use Gravity**、Rigidbody2Dには**Gravity Scale**のパラメータがあり、重力の影響を調節できます。


![AddRigidBody.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/4b297b93-6727-fb87-1b39-04d51c6d2e56.gif)






























<br>

#### 2.1 速度を変更するVelocity関数を使う
一定の速度でオブジェクトを移動させたり、移動する速度を制限することができます。

```C#:test6.cs
    Rigidbody rb = GetComponent<Rigidbody>();
    rb.velocity = Vector3.right * 2f; // 速さを直接入れる
```





<br>

#### 2.2 力を加え加速度を変更するAddForce関数を使う
オブジェクトに力を加えて物理演算を元に移動させることができます。現実世界と同じようにオブジェクトを自然な動きで移動させることができます。衝突のふるまいなど物理現象を使用している場合はこのAddForce関数を使いましょう。




👍**ポイント**
加える力が小さいとオブジェクトがうまく動かない場合があります。この場合はオブジェクトの質量を軽くするか、与える力を大きくすることで、オブジェクトを移動させることができます。

```C#:test7.cs
    Rigidbody rb = GetComponent<Rigidbody>();
    rb.AddForce(1.0f, 2.0f, -1.0f); // 加える力のベクトルをVectorで入れる
```
CakePHP4 Mailer 公式通りに書いたのに動かない

# 環境
<!-- 環境を記載 -->
* CakePHP4.2.6
* PHP7.4.16 
* Mailer

# はじめに
<!-- 発端や概要を記載 -->
CakePHP4 の公式ドキュメントに記載している Mailer を使用してテンプレートメール機能を実装したい。

# 目次
<!-- タイトルとアンカー名を編集 -->
[1.やったこと](#1-やったこと)
[2.解決方法](#2-解決方法)
[3.参考文献](#3-参考文献)

<!-- 各チャプター -->
#1. やったこと
[公式ドキュメント](https://book.cakephp.org/4/ja/core-libraries/email.html#id6)を参考に Mailer でメール機能を実装。

```
$mailer = new Mailer();
$mailer = $mailer
             ->setEmailFormat('html')
             ->setTo('bob@example.com')
             ->setFrom('app@domain.com')
             ->viewBuilder()
                 ->setTemplate('welcome')
                 ->setLayout('fancy');

$mailer->deliver();
```
公式通りに記述しているのに以下のようなエラーを吐いた。

```
Call to undefined method Cake\View\ViewBuilder::deliver()
```
なんでやねん！

#2. 解決方法
エラー文で色々調べてみたりしたけど一向に出てこない。
そのため CakePHP4 Mailer で調べたら以下のように記述してあったため、試したところ、無事にいけた！

```
$mailer = new Mailer();
$mailer ->setEmailFormat('html')
        ->setTo('bob@example.com')
        ->setFrom('app@domain.com')
        ->viewBuilder()
            ->setTemplate('welcome')
            ->setLayout('fancy');

$mailer->deliver();
```

#3. 参考文献
- [CakePHP4 Cookbook](https://book.cakephp.org/4/ja/core-libraries/email.html#id6)
- [CakePHP 4 で テキストと HTML のメール送信を実装](https://tt-computing.com/cake4-mail-send)
swift(アラート機能の実装)~備忘録~

iphoneを使っているとよく見るアラートの簡単な実装をしていきたいと思います。
処理の流れとしては

ここを押すボタンを押す
↓
アラートが表示される
↓
OKを押すとアラートが消える

これだけです。

よく見るこうゆうやつです

![スクリーンショット 2021-06-13 22.24.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/826735/da257502-9ec9-6458-a064-c8f79e236109.png)

#コード全体

```swift
//
//  ContentView.swift
//  Shared
//
//  Created by  on 2021/06/13.
//

import SwiftUI

struct ContentView: View {
    @State var isError: Bool = false
    var body: some View {
        Button(action:  {
            //ボタンを押下した時にtrueに変換する。
            isError = true
        }) {
            //ボタンのテキスト
            Text("アラートテスト")
            //trueの時にアラートが表示される。
        }.alert(isPresented : $isError) {
            Alert(title: Text("タイトル"), message: Text("メッセージ文"),
                  primaryButton: .default(Text("OK"), action: {
                    Action()
                  }),
                  //キャンセルボタンの設置
                  secondaryButton: .cancel(Text("キャンセル"), action:{})
            )}
    }
}
func Action(){
    print("OKボタンが選ばれました。")
    
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


```



##1.bool値が格納されるisErroorの宣言


```swift
 @State var isError: Bool = false
```


##2.エラーが発生したらtrueにする。
文字通りaction:としてisErrorをtrueにします。

```swift
 Button(action:  {
            //ボタンを押下した時にtrueに変換する。
            isError = true
        })

```

##3.デフォルトのテキストを設定します。
以下を設定する事によって、クリックする前のテキストを設定する事ができます。

```swift
 //ボタンのテキスト
            Text("アラートテスト")

```

.alartのモディファイアを利用することでボタン押下時にアラートを表示する事ができます。
primaryButtonでOKの挙動、secondaryButtonでキャンセルの挙動を設定する事ができます。

cancel()で指定する「キャンセル」ボタンはprimaryButtonとsecondaryButtonのどちらで指定しても左側に配置されるようです。

```swift
.alert(isPresented : $isError) {
            Alert(title: Text("タイトル"), message: Text("メッセージ文"),
                  primaryButton: .default(Text("OK"), action: {
                    Action()
                  }),
                  //キャンセルボタンの設置
                  secondaryButton: .cancel(Text("キャンセル"), action:{})
            )}

```


##ユーザー定義関数okAction
okボタンを押下した時に実行される関数です。
呼び出し元は ``.default(Text("OK"))`` です。

```swift
func Action(){
    print("OKボタンが選ばれました。")
    
}
```


以上です。
CDNキャッシュ

### `ブラウザ <-①- エッヂロケーション <-②- origin`

ブラウザ内にキャッシュされていて変更の必要がない場合 ①で304(not modified)が返される


TODO: TTLを調べて書き足す。
TODO: 304かどうかはどうやってエッジロケーションのサーバで判断しているんだっけ？
CircleCIまとめ

#はじめに
CircleCIを導入するにあたって、自分なりにまとめてみようと思い書くことにしました。
(随時追記していきます)

#CI/CDとは
まず、CI/CDとは何か？
CI/CDとは、「Continuous Integration／Continuous Delivery」、つまり継続的インテグレーション/継続的デリバリーです。
また、CI/CDで一つの技術を指すのではなく、`ソフトウェアの変更を常にテストをして自動で本番環境にリリースできる状態にする`ソフトウェア開発の手法のことをいいます。

#CircleCIとは
前述したCI/CDを実行するサービスの一つです。
参照:CircleCI概要
https://circleci.com/docs/ja/2.0/about-circleci/

##特徴
・クラウド型である
・モダンなCI/CDの機能がある
・日本語でのサポートが豊富

##CircleCIでできること
###テストの自動化
テストは自分で作成する必要がありますが、CircleCIを用いることで、自動でそのテストを実行すてくれるようになります。
具体的にはgithubでプルリクを投げた際に、自動でテストを実行してくれてテストが失敗すればエラーを知らせてくれます。

###自動デプロイ
デプロイ用の設定ファイルに、テストとうを通過しエラーが出なければ本番環境にpullするといった記述が書けます。
これを使って、開発環境からpush→問題がなければ本番環境にpullといったことが自動でできるようになります。
.com Master ADVANCE 試験対策備忘録 (2/5)

備忘録メモＮｏ．２です。

# インターネット接続の設定とトラブル対処

## USB

|規格|転送速度|給電能力|その他|
|---|---|---|---|
|USB 2.0|480Mbps|500mA(5V)|USB1.1から大きく速度向上|
|USB 3.0|5Gbps|900mA(5V)|コネクタのピン数が増加|
|USB 3.1|10Gbps|5A(20V)<br>※ USB PD時|音声や映像の転送(USB AV)規格を追加|
|USB 3.2|20Gbps|同上|デュアルレーンに対応して高速化|

## RAID

|レベル|説明|故障|
|---|---|---|
|RAID-0|ストライピング<br>2台以上のHDD|1大でもＨＤＤが故障するとデータを復旧出来なくなるためリスクが高い。|
|RAID-1|ミラーリング<br>2台以上のHDD|1大のＨＤＤが残っていればデータを復旧出来る。|
|RAID-10|ミラーリングとストライピングの組み合わせ<br>4台以上のＨＤＤ|1台のＨＤＤの故障で有ればデータを復旧出来るが、2台目の故障については故障したＨＤＤの位置によって状況が異なる。|
|RAID-5|ストライピングとパリティの組み合わせ<br>3台以上のＨＤＤ|1台のＨＤＤの故障であればデータを復旧出来る。|
|RAID-6|RAID-5の応用型。RAIDグループ内に2種類のパリティ情報を持つ。<br>4台以上のＨＤＤ|2台までのＨＤＤの故障で有ればデータを復旧出来る。|

## 光ファイバの通信方式

|接続方式|分岐装置|終端装置|
|---|---|---|
|シングルスター方式|なし|メディアコンバータ(MC)|
|パッシブダブルスター(PON)|光スプリッタ|ONU|

## 接続認証に関わる番号

|種類|説明
|---|---|
|APN|接続先の事業者を指定する文字列。MNO端末では予め決められているが、SIMフリー端末やMVNOサービスを利用する場合はAPNを指定する必要が有る。|
|国際移動体装置識別番号(IMEI)|携帯電話端末などに割り当てられる国際的な識別番号。端末識別番号とも言う。|
|加入者識別番号(IMSI)|移動体通信サービスの加入者に割り当てられる国際的な識別番号。SIMカードに記録されている。|
|携帯電話番号(MSISDN)|SIMカードに対して割り当てられている電話番号。ITU-T勧告1.64の定義に従って番号が振られる。|

## 無線LAN

|機能|説明|
|---|---|
|ESSID|ESSID(Extended Service Set IDentifier)はアクセスポイントの名前のような物。無線LANクライアントはESSIDを選択して接続する。|
|WEP/WPA|暗号化通信の方法を選択する。WEPとWPA（WPA2やWPA3)が有る。また暗号化のためのキーを決める必要が有る。|
|MACアドレスフィルタリング|NICに固有に割り当てられた物理アドレスとしてMACアドレスが有る。予めMACアドレスをアクセスポイントに登録しておくことで登録済みのMACアドレスを持つ無線LANカードからの接続のみを受け付けるように制限できる。|

## IPv6/IPv4フォールバック問題への対策

|対処|説明|
|---|---|
|TCPリセット|通信事業者側でTCPコネクションを切断してタイムアウトを早める。|
|Happy Eyeballs|ブラウザに搭載されている機能で、最初からIPｖ6とIPｖ4の両方で通信し、その上で反応が早かった方を採用して通信を継続する。|
|AAAAフィルタ|DNSサーバで取られる対策。IPｖ4による名前解決の問い合わせの場合にAレコード(IPv4用の名前解決)のみを返答し、AAAAレコード(IPv6用の名前解決)を返答しないことで、IPｖ6通信をさせないようにする。但し、DNSSECといいうDNSにおけるセキュリティと相性が悪い。|

# Referece
* [.com Master教科書 .com Master ADVANCE 第3版 (2019年;翔泳社)](https://www.shoeisha.co.jp/book/detail/9784798161389)
【作成中】Python版のRobocodeに挑戦してみた

RobocodeのPython版を触ってみましたので、環境構築等の情報を投稿します。

---

# Robocodeとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/f6d461ce-6b4d-3872-ac96-97c760e5dfa6.png)

『Robocode』（ロボコード）は、小型戦車を自動制御するプログラムを作成し、競技場で別の戦車と戦うオープンソースの教育ゲーム

- 単純なロボットはわずか数分で作成でき、完成度を上げようとすると数ヶ月かかることがある。
- 参加者は各戦車は移動、射撃、位置の走査が可能。
- シンプルではあるが必勝策はなく、戦車に何千行ものコードを戦略として持たせることができる。 
- 統計学やニューラルネットワークを組み込んで制御することもできる。

---
# Python-Robocode

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/fb16d1f6-53c6-2cba-0895-fa43de5e6927.png)
Pythonで動作させるためのRobocodeのフォークで、PyQtで開発されています。

https://github.com/turkishviking/Python-Robocode

---

# PyQt

クロスプラット（Windows・Linux・macOS）のGUIツールキットで、PythonでGUIプログラミングをすることができるフリーソフトウェア

※PyQtの他には、PySide・PyGTK・wxPython・TkinterなどのGUIツールキットが存在する。

---

# 環境構築(mac,M1でのみ実行確認済)

### Homebrewインストール

- Qt5のインストールに必要なMac OS用パッケージ管理ツール
- インストールしていない場合はターミナルで以下のコマンドを実行する。※ユーザ名の箇所のみ変更が必要

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/[ユーザ名]/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
```

### PyQt5インストール

Homebrewを使用し、バージョン指定でインストールする。

```
　pip install pyqt5
```

pipがない場合は以下でインストールする

```
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
```

---

### Robocode起動


Python-Robocodeをダウンロードし、Robocodeのディレクトリ内で以下を実行する。

```
python3 ./main.py
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/14c911a1-fefa-9b36-afc2-3c4e0ad50845.png)

---

### デモの実行
Battle > New を選択すると、戦車の選択画面になり、Startボタンを押すとゲームが開始され、設定したバトル回数が終了すると、結果が表示される。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/c27b4126-bc26-8b65-d14b-0c8937db6330.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/1f542bbe-a11b-8bbe-6eb3-de2bd1491343.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/1b7bae3b-4cc9-1828-2a06-d64bd04199fa.png)

---

### 手順書など
以下はJava版、Python版はドキュメントがない。

https://robowiki.net/wiki/Main_Page

ロボットの作り方

https://robowiki.net/wiki/Robocode/My_First_Robot

---

### ロボットの追加方法

Robotsフォルダにファイルを追加すると、ロボットの種類を追加できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/b87c3ef0-52bb-057b-9c1e-3720c600d20d.png)
自分の記事のまとめページ

#手順書の類
SpringBootソリューション1〜3
https://qiita.com/JoeB/items/02f64562b6928606c716
https://qiita.com/JoeB/items/04258030c107856cceae
https://qiita.com/JoeB/items/5c0de835ddd81b201515


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
[PowerShellの知識](https://qiita.com/JoeB/items/0180f08d87449dd67133)
[Linuxコマンド](https://qiita.com/JoeB/items/db24e22299747b031534)
[Git](https://qiita.com/JoeB/items/6df07f06bff86a3a587b)
[コンピューターサイエンス](https://qiita.com/JoeB/items/25226bcebd0dd36e8c96)
[Excel]グレイコードをエンコード・デコードする

#はじめに
軽くグレイコードを取得したい機会があり、Excelを使ってやってみたのでその時の方法について書きます。

#グレイコードとは
10進数と2進数とグレイコードの対応表は以下の通りです。
10進数が７から８へ変わる時の、２進数とグレーコードの変化に着目してください。
２進数では各ビットが全て反転していますが、グレイコードは1つしか反転していません。

２進数とグレイコードのビットの変化をみていけばわかるように、２進数では複数ビットが反転することはあっても、グレイコードなら必ず反転するのは1ビットのみです。


| １０進数 | ２進数 | グレイコード |
|:--------:|:------:|:------------:|:-:|:-:|
|     0    |  0000  |     0000     |   |   |
|     1    |  0001  |     0001     |   |   |
|     2    |  0010  |     0011     |   |   |
|     3    |  0011  |     0010     |   |   |
|     4    |  0100  |     0110     |   |   |
|     5    |  0101  |     0111     |   |   |
|     6    |  0110  |     0101     |   |   |
|     7    |  0111  |     0100     |   |   |
|     8    |  1000  |     1100     |   |   |
|     9    |  1001  |     1101     |   |   |
|    10    |  1010  |     1111     |   |   |
|    11    |  1011  |     1110     |   |   |
|    12    |  1100  |     1010     |   |   |
|    13    |  1101  |     1011     |   |   |
|    14    |  1110  |     1001     |   |   |
|    15    |  1111  |     1000     |   |   |

##グレイコードの利点
グレイコードは実際には、回転角を取得できるアブソリュートエンコーダのスリットパターンに利用されていたりします。
上述の通り、ビット反転は必ず一桁のみであるため、２進数の場合に対して読み取り誤差を低減することができます。

#本編
##10進数→グレイコード

```
=DEC2BIN(BITXOR(10進数,BITRSHIFT(10進数,1)),桁数)
```

##グレイコード→2進数
素直にvbaで組みました。

```vb
Function gray2bin(gray As String) As String
    ans = Left(gray, 1)
    
    For i = 2 To Len(gray)
        tmp = Mid(ans, i - 1, 1) Xor Mid(gray, i, 1)
        ans = ans & tmp
    Next i
    
    gray2bin = ans
    
End Function
```

以下のように使えます。

```
=gray2bin(グレイコード)
```

##グレイコード→10進数
```
=BIN2DEC(gray2bin(グレイコード))
```

#さいごに
読んでいただきありがとうございました。
ご指摘などあれば、勉強させて頂きたいのでどんどんお願いします。
Marqeta使ってみた（その1）

先日IPOしたばかりのMarqetaプラットフォームを使ってみました。MarqetaはSandboxが提供されているので気軽に遊んでみることができそうです。

Sandboxの使い方はこちらから:
https://www.marqeta.com/docs/developer-guides/core-api-quick-start

## まずはアカウント作成
https://auth.marqeta.com/create-account

メールアドレス含む必要な情報を記入して進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/8147a822-799d-9027-e449-d2f7b1a429ed.png)

メール受信しアドレスが確認されます。その後、SNSでも確認されます。

## ダッシュボードへアクセス
しばらく経つとサンドボックス作成のメールが来るので、ダッシュボードへアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/410dceeb-5123-77b8-0d13-34e692879464.png)

## SDK
現在PythonとRubyのSDKが用意されてるようです。

https://www.marqeta.com/docs/core-api/sdks-landing
プログラミングスクールのチーム開発


はじめまして、ykと申します。
２０２１年2月より某プログラミングスクールに通い、現在転職活動中です。
アウトプットとしてQiitaに記事を書くことにしました。
（プログラミングスクールに通うことを考えている方や実態が知りたい方が少しでも参考になればいい:sob:笑）


とりあえず、記念すべき初記事はチーム開発で感じたことを”率直に”書いて行こうと思います。



とりあえず思ったことは。。。。。



俺は、コミュニケーション能力が著しく低いと再認識しました。。。。
![pose_zetsubou_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1245565/42d0030a-e472-6679-0c16-c2c7b114ea8b.png)
:joy:


プログラミングスクールの生徒は、当然未経験の人だけが集まるところです。
（ごく稀にスクール内に開発経験者がいる←なぜ？:hushed:w）

未経験同士、知識や経験も浅いままだと思うように話が噛み合わないということに気づきました。。。。

具体的には

A君「Enumの定義と指定についてなんだけどさぁ〜」

B君「あれは〜〜〜〜の書き方が良いですよね」

私　「（E、Enum！？　なんだそれ！！！　わからない。。。話に混ざれない。。。終わった:innocent:）」

A君「ykさんは、どう思いますか？」

私　「あぁ〜。ちょっと勉強不足でわからないです。。。」


↑
こんな感じで私は置いてけぼりになることが多々ありました:sob:泣

システム開発において、”勉強不足”は如何なものか:rage:と現役エンジニアさんに怒られちまうわこりゃ・・・

なので円滑なコミュニケーションを生み出すための確実な方法が、”知識”であることだと最初感じた・・・

コミュニケーション人柄で何とかなる人もいるとは思うが、チーム開発では通用しなさそうな気がします。。。。

ここで学んだことは初歩初歩ではありますが、



”知識”というものはチーム開発にとってとても大切だということ。


「え？　わからなかったら、聞けばいいじゃん？www」


って思うかもしれないけど、何度もわからないことを質問やつは”知識不足＝意欲がないやつ”と思われるだろう・・・


普通の職種であれば、


先輩　「わからないことはなんでも聞いて！:relaxed:」

私　　「わかりました！！！」


がよくあることかもしれないが、これは業務において聞かないと出来ない事だから質問するのであって


IT技術の世界においては、


「そのくらいググれや！」


となると思いますっw←これはあくまでも私の所感です。


要は大抵のことはグーグル先生で解決していけるから、ググっても解決できないときだけ質問すべしってことです:relaxed:笑



とりあえず初記事はこの辺にして、続きは次回記事に描くことにします。



この記事を見て、

「はぁ！？全然参考にならないだが？:rage:」

と思う人もいるでしょう（見ている９９％は思ってそうな予感・・・笑）

そこは許してください:sob:
【論文紹介】Evaluating cross-sensory perception of superimposing virtual color onto real drink: toward realization of pseudo-gustatory displays

#論文紹介
論文：Evaluating cross-sensory perception of superimposing virtual color onto real drink: toward realization of pseudo-gustatory displays
著者：Takuji Narumi,  Munehiko Sato
https://dl.acm.org/doi/10.1145/1785455.1785473

#どんなもの
　ABDC(Aji Bag and Coloring Device)を用いて、飲み物の化学成分を変えずに仮想的な色を重ねることで、食べ物を楽しむ感覚を向上させる疑似味覚ディスプレイを開発した。実験の結果、視覚的なフィードバックによって人の基本的な味の感じ方を変えることはできないが、人が経験する味の解釈の仕方に影響を与えることができた。実験ではABDCと染料を使って着色方法を比較したが、着色方法が味を解釈するときの交差感覚効果に影響を与えないことがわかった。


#先行研究と比較してすごいところ
　触覚や嗅覚の情報の入出力の研究は多く行われているが、味覚情報を提示するディスプレイは少ない。この論文では複雑な味覚システムを応用して、クロスモーダル効果を利用した好みの味を提示する疑似味覚ディスプレイの開発を行った。


#技術や手法のキモ
　飲み物の化学成分を変えずに色を変える方法としてABDC(Aji Bag and Coloring Device)を開発した。ABDCは飲み物を入れたビニール袋をストローに取り付けて、ビニール袋を白っぽい水の中に入れて無線のLEDノードで色を重ねた。<font color="gray">(ワイヤレスのLEDノードで構成されている。)</font>
　この白っぽい水(白濁水)が光を拡散させる媒体となって、飲み物の外の色を任意に変えることができる。<font color="gray">(白っぽい水にはコーヒークリーム入りの水を使った。)</font>

#検証方法
　色を重ね合わせた飲み物の味をどのように感じるか、ABDCを用いた結果と染料で着色した場合を比較して実験した。
　オレンジジュースとリンゴジュースの中間的な甘さと酸味を持つ飲み物を中間飲料と名づけ、蔗糖とクエン酸を原料とし、糖度12％、クエン酸濃度0.43％の中間飲料を作った。中間飲料をベースにして3種類の香り付き飲料と3種類の色付き飲料を用意した。

　中間飲料と3種類の色付き飲料を飲んだ後、それぞれの色付き飲料を中間飲料と比較し、色付きジュースの味の体験を作図用紙(甘さとすっぱさの軸を設けた用紙)にプロットしてもらった。比較対象としてリンゴジュースの模造品とオレンジジュースの模造品、見慣れない色の飲み物の3種類を用意した。
　色が味の解釈に与える影響を評価するために、中間飲料に色水を加えたものを比較対象とした3種類(オレンジ、黄色、緑)の色付き飲料を用意した。<font color="gray">(オレンジジュースとアップルジュースを中間飲料の模倣対象とする場合には、馴染みのあるオレンジと黄色を選択し、一方の飲料には馴染みのない色である緑を選択)</font>
　比較対象として，ABCD法による中間飲料を用いた3種類の着色飲料を用意した。染料で着色した水に似た色になるようにLEDの色を調整し，その色を白っぽい水に重ね合わせた。

→<font color="gray">オレンジ色の飲み物を飲んだ時、15人がオレンジジュース、8人がレモンジュースを飲んだと回答した。</font>飲み慣れない色の緑色の飲み物を飲んでも、多くの被験者が明確な答えを出せなかった。だけが有名なジュースに似ている飲み物を飲んだ後に，特定の味を感じたと答えた被験者も多くいた。この結果から視覚フィードバックは基本的な味覚の感度を変えることはできなくても、味の疑似体験を誘発できるとわかった。
　ABCDを用いて着色した飲料であっても同じような結果が得られた。味の解釈における交差感覚効果の質に，着色方法はあまり影響しないことがわかった。
　人が感じる味は飲み物の色を変えることで変化することが示された。色の付け方は味の解釈における交差感覚効果の室に影響しないことがわかった。


#議論
　染料でオレンジ色に着色した飲料は79％の被験者がオレンジ色の味を感じたのに対して、LEDでオレンジ色に着色した飲料では、42％の被験者しかオレンジ色の味を感じなかった。また、染料で緑色に着色した飲み物はほとんどの被験者が味を認識できず、LEDで着色した場合は63%の被験者がメロン味を感じた。
→この結果は液体の濁りによっておこった。LEDで着色された飲み物は、透明な炭酸飲料を連想させる傾向がある。透明度の低い液体を白濁した水とLEDで再現することは難しい。これはなんとかならないのか。
　LEDノードの電池消費が早いので、実験の途中で被験者の前で飲み物の色が変わることがあった。(電池が少なくなるとノードの色が赤くなる)


#気になった論文
　Towards Experiencing Eating as Play(未来の論文)
　Playful Taste Interaction(未来の論文)
ITパスポート_令和元年秋期_問34解いてみた

<div class="container">
    <h1>ITパスポート_令和元年秋期_問34</h1>

    <h6>■　令和元年秋期_問34</h6>
    <a class="btn" href="https://www.itpassportsiken.com/kakomon/01_aki/q34.html">参考ページ(問題ページ)</a><br><br>
    <div>
      <p>売上高，変動費，固定費，営業日数が表のようなレストランで，年間400万円以上の利益を上げるためには，1営業日当たり少なくとも何人の来店客が必要か。</p>

      <table class="striped">
        <tbody>
          <tr>
            <td>客1人あたり売上高</td>
            <td>3000円</td>
          </tr>
          <tr>
            <td>客1人あたり変動費</td>
            <td>1000円</td>
          </tr>
          <tr>
            <td>年間の固定費</td>
            <td>2000万円</td>
          </tr>
          <tr>
            <td>年間の営業日数</td>
            <td>300日</td>
          </tr>
        </tbody>
      </table>

      <hr class="white-text">
      <h6>■　解説</h6>

      <p class="black-text">求めたいのは、1日何人来れば目標に届くか</p>
      <p class="black-text">売り上げの目標は、400万円の利益＋固定費2000万円＝2400万円</p>
      <p class="black-text">また、1人あたりの利益は、売上ー変動費＝3000円ー1000円＝2000円</p>
      <p class="black-text">分かってる事をまとめると、、、</p>

      <table class="striped">
        <tbody>
          <tr>
            <td>客1人あたり利益</td>
            <td>2000円</td>
          </tr>
          <tr>
            <td>目標の売上</td>
            <td>2400万円</td>
          </tr>
          <tr>
            <td>年間の営業日数</td>
            <td>300日</td>
          </tr>
        </tbody>
      </table>

      <p class="black-text">年間で何人客がくれば良いかというと、</p>
      <p class="black-text">2400万円÷2000円＝1万2000人</p>
      <p class="black-text">一日だと、、、</p>
      <p class="black-text">1万2000人÷300日＝40人</p>


      <h2 class="black-text">よって答えは40</h2>
    </div><br>
  </div>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
  <script src="myscript.js"></script>
プログラマはこんなことも考えている

# はじめに

オープンソースプロジェクトには、バグの修正や機能追加のリクエストが来ることがあります。

そのときに、なにをどうすれば変更できるか（変更の難しさ）や、自分には作業のための時間がとれるかとか、自分にはわからないけどあの人ならわかりそうだとか、色々なことを考えます。

しかし、それ以外にも私がどんなことも考えているのか、ということを言語化してみました。

# 意図しない仕様変更

あなたがリクエストをくれ、そのとおりに修正してあなたの環境では良くなったとします。そのとき、

1. あなたの環境では良くなった
1. それ以外の環境では...
   1. 以前から問題があったが、だれも報告していなかった
   1. 以前から問題がなかった
      1. 修正しても問題が起きない
      1. 修正して新たな問題が起きた

このような分岐が考えられます。「それ以外の環境では以前から問題がなく、修正により新たな問題が起きる」理由には、修正のときにバグを入れてしまうことだけでなく、リクエストによる変更が従来の動作とは相容れなくなることがあります。

リクエストをくれたあなたのほかにもたくさんのユーザがいて、あなたも私も知らない使いかたをしているかもしれません。修正したことで、あなたを含む「良くなった」ユーザと、問題なく使っていたのに「問題が起きるようになった」ユーザのどちらが多いでしょうか[^3]。

というわけで、リクエストと既存の動きが両立しないことが明らかだったり、変更の影響範囲が読めなくて「これで大丈夫そう」という自信が持てない部分だと、気軽に手を入れられません。副作用によってほかのユーザから寄せられる「壊れた」や「改悪された」というクレームは、リクエストをくれたあなたではなくこちらに来てしまいます。そんな予感がする未来のことはお構いなしに「いいから俺のリクエストどおり直せよ」みたいな猛プッシュをされると、「仕様が変わったことへのクレームの対応」や「両立しない動作をどちらも満足する仕様に落とし込んで修正する」ことまで全部面倒見るつもりで言ってるんでしょうね？という気分になることがあります。

副作用を起こしても「さらに修正すればいい（修正できる見込みがある）」という自信があったり[^1]、「片方は切り捨てて放置してもいい」と思える図太さがあれば、気にせずどんどん修正できるのかもしれません。

# 確認できないけど修正する

たとえば、環境が同じでも私の手元で問題が再現しないと、状況を確認できないので対策が打ちづらくなります。勘のようなものを働かせて修正してみても「あった」問題が「なくなった」ことを手元で確認することができません。

また、私が持っていない機材をサポートしてほしいというような、修正しても正常な動作を確認できる環境がない場合にも難しさを感じます。

このような場合はリクエストをくれたあなたの確認が頼りになります。しかし、追加情報を求めたり、修正してみて確認を求めたところ、返信が来ないこともあります。たしかに、こちらが直したいと思ってはいても必ず直さなければいけない責任を負っているのではないのと同じく、あなたにも必ず返事をする義務があるわけでもないのですけれど。

これだと、修正を元に戻すか、問題がなくなったことを確認できない修正を採用するか、という選択を迫られます。もし、なんらかの副作用が起きてしまったら、手元で確認できないので事態を収拾するのが難しくなることが予想されます。

# まとめ

ソフトウェアのメンテナンスとは「プログラムにとってなにがよいか」を考えることで、これには「誰かにとって良くする」と「誰かにとって悪くしない」を両立させることが関係していると思います。

プログラマにもいろいろな考えの人がいます。

* 「どんどん直していこう、多少壊れるのは仕方ない」というタイプ
* 「問題ないので黙って使っている多数のユーザに不便をかけないほうがよい」というタイプ

これは「良くする」ために許容できる「悪くなる」の限度が人によって異なるのだと思います。私は後者のタイプなので、できるだけ「悪くなる[^2]」が少なくなるようにしたい、と考えながら作業しています。

[^1]: もし修正できてもすぐにリリースが出ない場合や、リリースが出てもユーザが簡単にはバージョンを上げられないこともあります。

[^2]: 私が言う「悪くなる」には、「起動しなくなる」から、「ショートカットキーが変わる」「1手順でできたことが2手順になる」などのよく使われる使い慣れた操作を変えるようなことまで、幅広い範囲を含みます。

[^3]: 単純に「良くなったユーザ数」×「悪かった度合い」と「悪くなったユーザ数」×「悪くなった度合い」の差はどれくらいだろう、と思います。
輪読メモ｜JavaScript｜applyとcallとbindのthisの対象についての確認

[開眼！ JavaScript――言語仕様から学ぶJavaScriptの本質](https://www.oreilly.co.jp/books/9784873116211/)を輪読会で読み進めている最中です。

本書の中で紹介されていた`apply`や`call`や`bind`について、Chromeのデベロッパーコンソールを利用して復習・確認した📝になります。

`apply`も`call`も`bind`も第一引数に`オブジェクト`を指定することができます。
`apply`と`call`は第二引数の形が異なり、`bind`は`オブジェクト`を指定するのみ(()で実行する)という浅い理解です。
今回確認したのは、`オブジェクト`の部分となります。

`apply`も`call`も`bind`も実務で利用する経験がなく、あまり利用どころにピンと来ていないのが正直なところです。いずれも↑の輪読会をやっていく中でその存在を知りました。

### 事前準備
#### thisの違いを明確に分かりやすくするためにclassを実装する
ついでにインスタンス化した変数(zzz)を用意しておきます。

```js
class ZZZ {
    constructor(x,y) {
        this.x = x;
        this.y = y;
    }
}

const zzz = new ZZZ(1,2);
// → ZZZ {x: 1, y: 2}x: 1y: 2__proto__: Object
```

#### thisを出力するだけの関数を用意する
ついでに呼び出してみます。

```js
function KANSU(){
    console.log(this)
}

KANSU();
// → Window {0: global, window: Window, self: Window, document: document, name: "", location: Location, …}
```
#### thisを出力するだけの関数式を用意する
ついでに呼び出してみます。

```js
const KANSUSIKI = function(){
    console.log(this);
}

KANSUSIKI();
// → Window {0: global, window: Window, self: Window, document: document, name: "", location: Location, …}
```
#### thisを出力するだけのアロー関数を用意する
ついでに呼び出してみます。

```js
const ALLOW = () => {
    console.log(this);
}

ALLOW();
// → Window {0: global, window: Window, self: Window, document: document, name: "", location: Location, …}
```

### 違いを確認する
#### 関数で`apply`も`call`も`bind`を確認してみる
引数として渡している`this`を参照していることが分かります。

```js
KANSU.apply(zzz);
// →　ZZZ {x: 1, y: 2}
KANSU.call(zzz);
// →　ZZZ {x: 1, y: 2}
KANSU.bind(zzz);
// ƒ KANSU(){
//     console.log(this)
// }
KANSU.bind(zzz)();
// →　ZZZ {x: 1, y: 2}
```
#### 関数式で`apply`も`call`も`bind`を確認してみる
引数として渡している`this`を参照していることが分かります。

```js
KANSUSIKI.apply(zzz);
// →　ZZZ {x: 1, y: 2}
KANSUSIKI.call(zzz);
// →　ZZZ {x: 1, y: 2}
KANSUSIKI.bind(zzz);
// ƒ (){
//     console.log(this)
// }
KANSUSIKI.bind(zzz)();
// →　ZZZ {x: 1, y: 2}
```

#### アロー関数で`apply`も`call`も`bind`を確認してみる
出力ログからwindowオブジェクトを参照していることが分かるため、引数として渡している`this`は利用されていないことが分かります。

```js
ALLOW.apply(zzz)
// →　Window {0: global, window: Window, self: Window, document: document, name: "", location: Location, …}
ALLOW.call(zzz)
// →　Window {0: global, window: Window, self: Window, document: document, name: "", location: Location, …}
ALLOW.bind(zzz)
// () => {
//     console.log(this);
// }
ALLOW.bind(zzz)()
// →　Window {0: global, window: Window, self: Window, document: document, name: "", location: Location, …}

```
### スクリーンショット/デベロッパーコンソール
#### 事前準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536171/ad01aa5f-e03c-2919-862e-19d1175206bb.png)
#### 関数で試す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536171/3b558ef3-aa7d-c96c-7e12-a62b592bea08.png)
#### 関数式で試す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536171/7f2437a9-8dd8-dab3-61b2-62fb2a36d5eb.png)
#### アロー関数で試す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536171/6d7ee8d7-a769-b35a-9312-4481b99249e2.png)
読書OutPut Vol.2 シン・ニホン/安宅和人氏著

# シン・ニホン/安宅和人氏著

ひょんなことからこの一冊に出会ったので読んだメモを残します。
今後はもう少し自分の気付きを書けたら良いな〜と思います。

## 日本シンプルにやばい。でもまだ戦える！！

`シン・ニホンさん`「ちょっとそこの君、君の住んでる日本って本当にやばい国って知ってる？」

`私`「え？そんなにやばいんですか？でもでもトヨタとか日本企業だって頑張ってるじゃないですか！」

`シン・ニホンさん`「それ、いつの時代？まじでオワコンだよ。このままだと**ジャマオジ**一直線だよ。」

`私`「・・・。すいません。」

`シン・ニホンさん`「もう今はAI×データの時代なの。証拠に世界の企業ランキングでもGAFAとかが上位でしょ。日本は本当にやばいのよ。」

`私`「そんな！？じゃあもう日本はだめなんですか？」

`シン・ニホンさん`「まあまあ慌てなさんな。戦い方はこの本にちゃ〜んと載ってるから見てみなさい。

`私`「見ます！」

### 感想
```
現在（2018年時点）の世の中と日本の置かれている状況がデータを用いて書かれている。
内容を読むと今すぐ動かなきゃ！でもどうればいい？みたいな焦りは出てくるものの、
スケールが結構大きくて、本書の中にあるかつ自分の影響の和の中にあるできることを
探すことから始める必要がありそう。
```

### 響いたワード
> 未来 = 夢 × 技術 × デザイン(「シン・ニホン」安宅和人著/NewsPicksパブリッシング (2020/2/20)）

いかに将来を見据えて理想や希望の状態を言語化し、それをテクノロジーや設計などを含むデザインして形にしていくかが重要。
ここから改めて言葉にする力の重要性を感じたし、現状ではなく、自分の内面にある理想を生み出すことや未来を創造し、デザインしていく力の重要性を感じた。

### 個人メモ
・必ずもう一度読む
・AI、機械学習などをやる前に本書で紹介されていた数学の単元を少しでもかじる
・データサイエンスについていけるようなITリテラシーを持つ
・pythonの学習をすすめる
CDP のPrivate Repoを作る時、httpdが起動出来ないエラー

# Install

```bash
sudo yum install httpd

```

# Start

```bash
sudo systemctl start httpd
```

Error:

```bash
[centos@worker-3 ~]$ sudo systemctl start httpd
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
[centos@worker-3 ~]$ systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sun 2021-06-13 09:26:34 UTC; 10s ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 20633 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=1/FAILURE)
  Process: 20632 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 20632 (code=exited, status=1/FAILURE)

Jun 13 09:26:34 worker-3.novalocal httpd[20632]: (13)Permission denied: AH00072: make_sock: could not bind to address [::]:8060
Jun 13 09:26:34 worker-3.novalocal httpd[20632]: (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:8060
Jun 13 09:26:34 worker-3.novalocal httpd[20632]: no listening sockets available, shutting down
Jun 13 09:26:34 worker-3.novalocal httpd[20632]: AH00015: Unable to open logs
Jun 13 09:26:34 worker-3.novalocal systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
Jun 13 09:26:34 worker-3.novalocal kill[20633]: kill: cannot find process ""
Jun 13 09:26:34 worker-3.novalocal systemd[1]: httpd.service: control process exited, code=exited status=1
Jun 13 09:26:34 worker-3.novalocal systemd[1]: Failed to start The Apache HTTP Server.
Jun 13 09:26:34 worker-3.novalocal systemd[1]: Unit httpd.service entered failed state.
Jun 13 09:26:34 worker-3.novalocal systemd[1]: httpd.service failed.
[centos@worker-3 ~]$
```


# 対策

SELinuxを無効化

```bash
# Disable SELINUX
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
getenforce
```

# 再度起動してみたら成功

```bash
[centos@worker-3 ~]$ sudo systemctl start httpd
```
開発環境と本番環境を分けたい

#### ターゲット
本番環境でもdocker-composeを使っているけど、
データベースの起動方法などが違う方

## 結論
docker-compose.yml自体をそれぞれ分けるのが一番楽。

```
本番環境：docker-compose.yml

開発環境：docker-compose.local.yml
⇒docker-compose -f docker-compose.local.yml upで起動

```
Denoで「自身のファイルからの相対パス」

相対パスでのファイル操作について～。

## 相対パスの解決方法

まず、Denoの相対パスの解決には2種類ある。

#### モジュール解決(import/export)の場合

**自身のファイルからの相対パス**が使用される。
Denoはインターネット上のスクリプトを直接実行できるが、その場合はリモートURLからの相対パスとして解決される。

例：

```js:https//xxx.com/mod.js
//このコードが`https://xxx.com/mod.js`として実行またはインポートされている場合は、
import './bar' //=> `https://xxx.com/bar.js`がインポートされる
```

#### それ以外の場合

`Deno.readTextFile()`などファイル操作の時は、**カレントディレクトリからの相対パス**が使用される。
カレントディレクトリは変動する可能性がある。

```shell
> cd /foo
> deno eval "Deno.readTextFile('./bar.txt')" # /foo/bar.txt が読まれる
> cd /foo/hoge
> deno eval "Deno.readTextFile('./bar.txt')" # /foo/hoge/bar.txt が読まれる
```

ファイルを操作する時に自身のファイルからの相対パスを使用したい場合は、次のようにする。

## ファイル操作に「自身のファイルからの相対パス」を使用する方法

ここから本題。

[URLオブジェクト](https://developer.mozilla.org/ja/docs/Web/API/URL)と`import.meta.url`を使う。
`import.meta.url`には自ファイルへのパスが入っているので、URLオブジェクトのコンストラクタを使って相対パスの解決を行う。

Denoのファイル操作系APIは、文字列だけでなく**URLオブジェクトでもパスの指定が可能**になっているため、URLオブジェクトをそのまま渡せばよい。

```js
const path = new URL("./foo.txt", import.meta.url) // ./foo.txtが絶対パスに変換される
Deno.readTextFile(path)
```

なお、インターネット上にこのファイルを置いた場合はURLオブジェクトがリモートファイルを指してしまい、機能しないので注意。
（これをリモートとローカルの両方で動作させるための機能として、[ローカルファイルのfetch](https://github.com/denoland/deno/issues/2150)が検討されているようだ。）
あとdeno compileしたときの挙動も変わってきそうではある。(未調査)
[Linux初心者] ファイルの読み取り権限があるのに読めない

# はじめに
Linux初心者の私が、ファイルやディレクトリの権限について分かりにくかった点をまとめました。

# つまづいた点
user_aの所有するファイルを別のユーザー（user_b）から読み取ってみます。
該当ファイルは`temp`ディレクトリにあり、他のユーザーからも読み取れるように権限が設定されています。

```
user_a@raspberrypi:/home $ ls -l /home/user_a/temp
合計 4
-rw-r--r-- 1 user_a user_a 10  6月 13 19:36 file
```

`temp`ディレクトリにも読み取り権限が設定されています。

```
user_a@raspberrypi:/home $ ls -l /home/user_a
合計 4
drwxr-xr-- 2 user_a user_a 4096  6月 13 20:08 temp
```

この状態で、別のユーザー（user_b）から同ファイルを読もうとするとエラーとなります。

```
user_b@raspberrypi:~ $ cat /home/user_a/temp/file
cat: /home/user_a/temp/file: 許可がありません
```

# 何が問題だったのか？
`temp`ディレクトリの権限を変更して、別のユーザーに（読み取り権限に加えて）実行権限を与えてみます。

```
user_a@raspberrypi:/home $ chmod 755 /home/user_a/temp
user_a@raspberrypi:/home $ ls -l /home/user_a
合計 4
drwxr-xr-x 2 user_a user_a 4096  6月 13 20:08 temp
```

この状態なら、別のユーザー（user_b）から同ファイルを読むことができます。

```
user_b@raspberrypi:~ $ cat /home/user_a/temp/file
aaabbbccc
```

つまり、ファイルを読むためには、同ファイルの置かれたディレクトリに実行権限が必要だということになります。

# 追加で検証
次に`temp`ディレクトリの権限を変更して、別のユーザーには（読み取り権限は与えず）実行権限だけを与えてみます。

```
user_a@raspberrypi:/home $ chmod 751 /home/user_a/temp
user_a@raspberrypi:/home $ ls -l /home/user_a
合計 4
drwxr-x--x 2 user_a user_a 4096  6月 13 20:08 temp
```

この状態でも、別のユーザー（user_b）から同ファイルを読むことができます。

```
user_b@raspberrypi:~ $ cat /home/user_a/temp/file
aaabbbccc
```

# まとめ
ファイルを読み取るためには、同ファイルの読み取り権限に加え、同ファイルの置かれたディレクトリの実行権限が必要です。

また、ファイルへの書き込みについても同様のことが成り立ちます。
ファイルに書き込みをするためには、同ファイルへの書き込み権限に加え、同ファイルの置かれたディレクトリの実行権限が必要です。
【GCP】組織ポリシー VS. Dataflow VS. Private Google Access

[前回の投稿](https://qiita.com/sabawanco/items/edbbcf81774ae7f32b98)のとおり、**外部IPを制限する組織ポリシー**（``constraints/compute.vmExternalIpAccess``）を入れて**Dataflowジョブを実行**したところ、ジョブが失敗しました。

https://qiita.com/sabawanco/items/edbbcf81774ae7f32b98


Dataflowの**設定を変更**して、**この事象を回避**できるか実験をしましたので、順番に見ていきます。

# Step1:ワーカーIPアドレスの構成を変更する

Dataflowのジョブの詳細設定に**ワーカーIPアドレスの構成を変更する**という設定がありますので、そこを**プライベート**に変更しました。
![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/1e48e08f-41c4-12b8-8a05-048d3a4a37b6.jpeg)

この設定でジョブを実行しました！結果はどうなったかというと・・・
**失敗**でした:disappointed_relieved:

![11-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/f76d5ae9-a56a-ae2c-ccbd-510e8070797d.jpeg)

内部IPアドレスのみの設定の場合、GCPのサービスに接続できず、エラーとなりました。
さらなる回避策ですが、エラーメッセージに出力されているとおり、**Private Google Access**をする必要がありそうです。

# Private Google Access

**Private Google Access**を使用すると、**内部 IP アドレスしか持たない VM インスタンス（外部 IP アドレスなし）がGoogle API とサービスにアクセスできる**ようになります。
詳細はこちらです。

https://cloud.google.com/vpc/docs/private-google-access


# Step2:Private Google Accessを使用してDataflowジョブを実行する
それではDataflowでPrivate Google Accessを使用できるように設定していきます。

まずはカスタムモードでVPCネットワークを新規作成（詳細略）した後、手動でsubnetを作成しました。こちらのサブネットで、Private Google Accessをオンにしました。
![13-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/7f717c6b-401d-6fd6-9470-5514f1788051.jpeg)

Dataflowジョブの設定に戻りまして、ジョブの詳細設定でサブネットを設定できますので、Private Google Accessをオンにしたサブネットを指定します。
![14-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/dcf7c564-3946-dff8-ae08-35cf01fe8a62.jpeg)

この設定でジョブを実行すると・・・
**ジョブが成功しました！！**:blush:

![17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1602803/470ec0cc-4f22-6464-e79c-742b030b5878.jpeg)

# まとめ
 * 外部IPを制限する組織ポリシーを入れた環境でDataflowを動かすことができました。
 * Google CloudのDataflowに関するページは[コチラ](https://cloud.google.com/dataflow/docs/guides/specifying-networks?hl=ja)になります。
PythonからPostgreSQLを操作

PythonからPostgreSQLを操作

■Postgreをwindows10にinstall

```
$ sudo apt update
$ sudo apt install postgresql
```

再起動

```
$ sudo /etc/init.d/postgresql restart
```

ユーザをpostgresに切り替え

```
$ sudo -u postgres -i
```

ユーザ(user)を作成.
パスワードを聞かれるので,パスワードを設定

```
$ createuser -d -U postgres -P user
```

user用データベースを作成

```

$ createdb userdb –encoding=UTF-8 –owner=user
```

■psycopg2をinstall
PostgreSQLを操作するためpsycpg2をinstall

```
$ pip install psycopg2
```

エラーが出力される場合は以下コマンドを実行

```
$ pip install psycopg2-binary
$ sudo apt install libpq-dev
$ sudo apt install postgresql-common
```

コマンドを実行したら再度インストール

```
$ pip install psycopg2
```

■DataBaseに接続

```python:postgresConect.py
import psycopg2

connection = psycopg2.connect(
    host='localhost',
    database='userdb',
    user='user',
    password='password')

cur = connection.cursor()

cur.execute('SELECT * FROM mybook;')

results = cur.fetchall()

print(results)

cur.close()
connection.close()

```


参考
Windows10のWSL(Ubuntu)にPostgreSQLをインストールしたときのメモ
https://qiita.com/syutaro/items/d08c5c7cc24cddf7694c

psycopg2 インストールエラー
https://qiita.com/b2bmakers/items/d1b0db5966ac145b0e29

初心者がPythonを使ってPostgreSQL に接続する
https://qiita.com/arupaka__ri/items/5d4711c279d111622117

psycopg2 でよくやる操作まとめ
https://qiita.com/hoto17296/items/0ca1569d6fa54c7c4732
【検証】PostgreSQLの試用

今回はPostgreSQLの使い方を確認します。

#データベースの作成
まずは`postgres`ユーザーへスイッチします。
さらにPostgreSQLの設定を行うために`psql`コマンドを実行します。

```
su postgres
psql
```

プロンプトの表示が`postgres-#`となればPostgreSQLの操作を行う準備完了です。
データベースの作成は以下のコマンドで行います。

```
create database <DB名>;
psql -l #作成したDBが表示されればok
```

#データベースの削除
作成したデータベースを削除するには以下のコマンドを実行します。

```
dropdb <DB名>
```

かなり内容が少ないですが、今回は以上とさせていただきます。
Raspberry Pi OS Lite版のノウハウ

* Raspberry Pi OS Lite 10 にて確認。(2021/6/13)

## 自動ログイン

* [電源を入れたときにtty1を自動ログインする設定あれこれ集.md](https://gist.github.com/yoggy/de9a4a6405834f52accc)

```go
sudo vi /etc/systemd/system/getty@tty1.service.d/autologin.conf
```

```rb
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin pi --noclear %I 38400 linux
```

## 自動ログインしたときにコマンドを実行

```sh:/home/pi/.bash_login
# HOMEに居なかったためcd した。
cd ~/
# 起動時刻がわかるようにdate出力
date
# 自動起動させたいコマンドを好きなだけ書く
echo "-- starting login command --"
sh door.sh
```

なお`/home/pi/.bash_login`は実行権限不要

## キー配列を日本語にする

```
raspi-config
```

* otherを一度選び、Japaneseを選択。

## 時刻設定

```sh
date -s "06/13 20:50 2021"
```

## swap無効化

```
dphys-swapfile swapoff
```
nullやundefinedなどの判定でちょっと迷った話

変数でnullやundefined（、空文字、0）を宣言し、判別するときに少しだけ戸惑うことがあった。
今回はJavascriptで書く。

```js
const a = null

if (!a) {
  // undefined または null のときの処理
}
```
このように書くと、nullにもかかわらず変数aが宣言されているので、上記の判定式がfalseと勘違いしてしまう事がある。

##自分が間違えやすい原因
今まで自分は空やundefinedではない変数しか宣言しなかったためにこのような戸惑いが起きたと考えられる。
しかし、下記のように書けばすぐ理解できる。

```js
const a = null

if (a == null) {
  // undefined または null のときの処理（このように書けば一瞬で理解できる）
}
```

nullやundifindなどを理解している、プログラミングに慣れている方々は当然のように思うかも知れないが、自分のような初心者は一瞬でも迷うことがあるので、これを機に間違えないようにしたい。

##参考
https://www.youtube.com/watch?v=KQhyHHQrcic
https://qiita.com/tadnakam/items/ffaef84ee89fe659ed15
ラジオボタンのバリデーションエラー時の値の保持で悩んだ話

##背景
今回の共同開発においてラジオボタンを実装をする必要があったがラジオボタンを実装した経験がなくどのようにするのがわからず苦労したのでそのことについてまとめていく。

##仕様

- カテゴリーは「Laravel」「PHP」「Docker」「web基礎」とする。
- バリデーションがエラーになった場合は画面をリダイレクトする。
- この際に値を保持する。（これに悩まされた。）

##ラジオボタンについて
####サンプルコード
```
<input type="radio" name="example" value="サンプル">サンプル
```
※`<label>`を用いれば丸い箇所だけではなく、文字の部分をクリックしても選択することができる。
 この場合`<input>`に`id`を、`<label>`に`for`を用いてお互いを同じ名前で紐付けしておく必要がある。

`type="radio"` ・・・　radioを指定すると作成できる。
`name=" "` ・・・　複数のラジオボタンを作成する場合同じ名前にすると他の部分を選択したときに自動的に選択が解除される。
`value= " "`　・・・　選択されているときに送信される内容。必須。
`checked` ・・・　この属性が指定されたラジオボタンは最初から選択された状態になる。（グループの中で一つだけ）
##実際のコード
```create.php
<div class="form-check form-check-inline">
    <input class="form-check-input" type="radio" name="category_id" id="category1" value="1" {{ old('category_id') == 1 ? 'checked' : '' }}/>
    <label class="form-check-label" for="category1">Laravel</label>
</div>
<div class="form-check form-check-inline">
    <input class="form-check-input" type="radio" name="category_id" id="category2" value="2" {{ old('category_id') == 2 ? 'checked' : '' }}/>
    <label class="form-check-label" for="category2">PHP</label>
</div>
<div class="form-check form-check-inline">
    <input class="form-check-input" type="radio" name="category_id" id="category3" value="3" {{ old('category_id') == 3 ? 'checked' : '' }}/>
    <label class="form-check-label" for="category3">Docker</label>
</div>
<div class="form-check form-check-inline">
    <input class="form-check-input" type="radio" name="category_id" id="category4" value="4" {{ old('category_id') == 4 ? 'checked' : '' }}/>
    <label class="form-check-label" for="category4">web基礎</label>
</div>
```

##バリデーションエラー時の値の保持
Laravelにおいてバリデーションエラー時の値の保持はグローバルヘルパ関数の`old`を用いることで利用できる。

```
 <input type="text" name="title" value="{ old('フォームのキー名')}"
```
この場合では`old('title')`とすれば入力されたタイトルが保持される。
ここまではわかっていたがラジオボタンの場合どうやって値を保持するのかがわからなく苦戦。最終的には三項演算子を用いるという答えにたどり着いた。

##三項演算子とは
```
条件式　？ 真の場合　： 偽の場合
```
条件式を評価してその答えが真であれば真の場合の式を返し、偽の場合は偽の場合の式を返す。
#####例
```example.php
<?php
  $var = 100;
  $str = ($var % 10 === 0) ? 10の倍数である : 10の倍数でない;
  echo $var."は".$srt;
 
 ///結果）１００は１０の倍数である
 ?>
```
つまりはIF文と同じだが、IF文と違って一文でまとめられてスッキリしており、加えて上記のように変数に代入することもできるメリットが有る。

##実際に使ってみた
```
 <input class="form-check-input" type="radio" name="category_id" id="category1"　value="1" {{ old('category_id') == 1 ? 'checked' : '' }}/>
```
ざっくりと表すと

```
{{ category_idが選択されているかいないか比較 ？ checked : なにも選択しない　}}
```
ということになる。三項演算子ってこういう風に使うのかと感動。

##参考
https://www.tagindex.com/html_tag/form/input_radio.html

https://style.potepan.com/articles/20037.html

https://readouble.com/laravel/5.5/ja/requests.html

https://qiita.com/gyu_outputs/items/d0ba64928972b7b47582
Rails6+devise+omniauth-twitterを使った認証の実装で躓いた。「Not found. Authentication passthru. 」

Railsを初めて触る初心者が、過去の記事をあさりながらTwitterAPIを使ったOAuth認証を実装しようとしたときに躓いた話です。

## 環境
rails6
devise (4.8.0)
omniauth-twitter (1.4.0)

## エラーと解決
以下の記事を参考に実装していました。
https://qiita.com/cigalecigales/items/16ce0a9a7e79b9c3974e

`Sign in with Twitter`リンクを押して、TwitterのOAuth画面に遷移するはずでしたが、ページには遷移せず、「Twitter アカウントによる認証に失敗しました。理由：（Authenticity error）」となり`Not found. Authentication passthru.`が発生しました。

[devise](https://github.com/heartcombo/devise/wiki/OmniAuth:-Overview)と[omniauth-twitter](https://github.com/arunagw/omniauth-twitter)のGithubを読んで原因を探すと....
(参照:https://github.com/heartcombo/devise/wiki/OmniAuth:-Overview)
![スクリーンショット 2021-06-13 20.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227026/63dbfcdf-4b2d-99a5-288d-110758cbb010.png)
[omniauth-rails_csrf_protection](https://github.com/cookpad/omniauth-rails_csrf_protection)を必ずインストールして下さいとのこと。
omniauthに脆弱性 (https://github.com/omniauth/omniauth/pull/809) があることがわかり、その対策で必要だそうです。2015年から議論されており、2019年には既に解決していたそう。

しっかりドキュメントを読むことは大事。
AngularとSpring BootでPaginationを実装する

<h1>概要</h1>
1ページに10枚のメモを表示するPaginationを実装します。
Springの標準ライブラリのPageを使うといい感じにPaginationしてくれるので、Angularで適宜デバッグしながらcontentやtotalPagesなどのSpringからのレスポンスがあるのだなと確認・利用していく流れです。

<h1>Spring</h1>

```MemoRepository.java
public interface MemoRepository extends JpaRepository<Memo, Long> {
    Page<Memo> findAll(Pageable pageable);
}
```

```MemoController.java
@CrossOrigin(origins = "http://localhost:4200")
@RestController
public class MemoController {
    @Autowired
    MemoRepository memoRepository;

    /**
     * メモをページに応じて取得
     */
    @GetMapping("/{page}")
    public Page<Memo> getMemos(@PathVariable("page") int page) throws IOException {
        //PageRequestはバージョンによって書き方が違うので注意が必要
        return memoRepository.findAll(PageRequest.of(page,10,Sort.by(Sort.Direction.ASC, "id")));
    }
}

```

<h1>Angular</h1>

```home.component.html
<nav aria-label="Page navigation example">
  <ul class="pagination justify-content-center">
    <li class="page-item"><a class="page-link" (click)="prevMemo()">前へ</a></li>
    <li *ngFor="let in of pageCounter(totalPages) ; let i = index" class="page-item"><a class="page-link" (click)="clickPage(i)">{{i}}</a></li>
    <li class="page-item"><a class="page-link" (click)="nextMemo()">次へ</a></li>
  </ul>
</nav>
```

```home.component.ts
export class HomeComponent implements OnInit {

  memos: Memo[];
  memo: Memo = {
    japanese: '',
  };
  totalPages: number = 0;
  currentPage: number = 0;

  constructor(private service: MemoService){}

  /**
   * 初期表示時、メモを取得。デフォルトは0ページ。
   */
  ngOnInit(): void {
    this.getMemos(this.currentPage);
  }

  /**
   * メモ取得。
   */
  getMemos(page: number) {
    this.service.getMemos(this.currentPage).subscribe(data => {
      this.memos = data.content;
      this.totalPages = data.totalPages;
    });
  }

  /**
   * 「前へ」押下時、1ページ後ろのページに応じてメモを取得。
   */
  prevMemo(){
    if(this.currentPage !== 0){
      this.currentPage = this.currentPage -1;
      this.getMemos(this.currentPage);
    }
  }

  /**
   * 「次へ」押下時、1ページ先のページに応じてメモを取得。
   */
  nextMemo(){
    if(this.currentPage !== this.totalPages -1){
      this.currentPage = this.currentPage +1;
      this.getMemos(this.currentPage);
    }
  }

  /**
   * ページ押下時、ページに応じてメモを取得。
   */
  clickPage(i: number){
    this.currentPage = i;
    this.getMemos(this.currentPage);
  }

  /**
   * ページ件数を動的に表示する。
   */
  pageCounter(i: number){
    return new Array(i);
  }

}

```
[NEW] Minecraft Spigot Server [1.17] Java用サーバーで統合版とクロスプレイをする方法 「サーバーインストールから」

#はじめに
Ubuntuに限らず、パソコン関連のやり方類はWebサイトをいくつか見る必要があり、場合によっては数十ものサイトを見比べて取捨選択する必要があります。
この記事はそうしたやり方類をまとめて書いていきます。
今回はJava版Minecraftと統合版をクロスプレイする方法をサーバーインストールから解説します。

###この記事でできること
Minecraft Java と Minecraft BEでクロスプレイが実現します。
※Java版とBE版のクロスプレイは本来不可能であり、BE版のサーバーと通信するためのパケットをJava版に変換して通信するプラグインを導入していくため、不安定ではありますがログインおよびプレイは可能です。


###対象読者
コマンド操作がわかる人
コマンド操作がわからない人
Minecraftでクロスプレイをしたい人

#1. Java 16 のインストール
Minecraft 1.17 からは Java 16 になり、以前の Java 8 では不十分なため、Java 16 をインストールします。
以下のコマンドでインストールしてください。

```
sudo apt-get -y install openjdk-16-jdk
```

#2. Spigot Server の入手
Spigot Serverはユーザーでビルドしないといけないので、ビルドツールをダウンロードしてきてビルドします。
また、ターミナルの作業領域でファイルを作成するので、サーバーディレクトリを作成してそこで作業を行ってください。
以下のコマンドでディレクトリを作ってそのディレクトリに移動します。

```
mkdir mcServer && cd $_
```

ビルドツールをダウンロードします。
以下のコマンドでダウンロードできます。

```
wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
```

ダウンロードが完了したらbuildします。
以下のコマンドでbuildを開始します。時間がかかるので気長に待ちましょう

```
java -jar BuildTools.jar --rev 1.17
```

ビルドが完了したら、```spigot-1.17.jar``` ファイル以外は削除してかまいません。
これでSpigotサーバーが入手できました。

#3. Minecraft サーバーを実行
起動のたびに引数を入力するor↑キーするのは面倒なのでシェルスクリプトを作っておきます。
gedit や vi などを起動して以下を入力後、拡張子 ```.sh``` で保存します。今回は ```run.sh``` とします。

```
#!/bin/sh
java -Xms1024M -Xmx8G -jar spigot-1.17.jar nogui
```

このままでは起動しないので、許可を与えます。

```
chmod +x run.sh
```

許可を与えたら一回起動します。
同意書が出てくるのでtrueにし、もう一度実行して、```Done``` まで行ったら ```stop``` と入力していったん止めます。

#4. パケット変換プラグインの導入
統合版のパケットをJava版に変換するプラグインを導入します。
以下のサイトからSipgot用のプラグインをダウンロードして、サーバーディレクトリ内のpluginディレクトリに突っ込みます。

https://ci.opencollab.dev//job/GeyserMC/job/Geyser/job/master/

導入したら、一度起動して終了します。

#5. 認証するプラグインの導入
統合版でのJava版のログインを不要にするプラグインを導入します
以下のサイトからSipgot用のプラグインをダウンロードして、サーバーディレクトリ内のpluginディレクトリに突っ込みます。

https://ci.opencollab.dev//job/GeyserMC/job/Floodgate/job/master/

#6. プロパティの変更
以下を変更します。

* サーバーディレクトリ ＞ ```server.properties```

```
online-mode=false 
```

* プラグインディレクトリ ＞ ```Geyser-Spigot``` ＞ ```config.yml```

```
auth-type: floodgate
```

#7. 起動

完成

#以上
構築方法はこれで終了です

#参考サイト
https://variouscolors.net/game/minecraft-diary/server/geyser/
【SwiftUI】Toggleスイッチを非活性にする方法

アプリ作成を進める中で２つToggleスイッチを使用する場面がありました。
どちらか片方が選択されている場合、もう片方は非活性にしたかったのですが、
調べても参考になる記事が出てこなかったのでメモとして残しておきます。
初学者の方に参考になればと思います。

## 実装方法
とてもシンプルで、buttonと同じくdisabledモディファイアを使用して実現できました。

<img width="400" alt="output.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1223933/35e3ef92-5ce6-6e89-5407-8b9ebd7879b7.gif">


## ソースコード
```swift:SwiftUI
import SwiftUI

struct ContentView: View {
    // トグルスイッチフラグ
    // デフォルトはoffにしたいためfalse
    @State private var toggleFlg1 = false
    @State private var toggleFlg2 = false
    
    var body: some View {

        HStack(spacing: 15) {
            Text("スイッチ1")
                .lineLimit(1)
            Text(toggleFlg1 ? "ON" : "OFF")
                .font(.custom("Times-Roman", size: 15))
            Toggle("", isOn: $toggleFlg1)
                .disabled(toggleFlg2)
                .labelsHidden()
            
            Text("スイッチ2")
                .lineLimit(1)
                .font(.body)
            Text(toggleFlg2 ? "ON" : "OFF")
                .font(.custom("Times-Roman", size: 15))
            Toggle("", isOn: $toggleFlg2)
                .disabled(toggleFlg1)
                .labelsHidden()
                .font(.body)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```
Flexboxで上下左右の中央揃えする方法

#Flexboxで上下左右の中央揃えする方法

Flexboxで要素を中央揃えする方法です。
親要素に対して、display:flex;を指定し、justify-content:center;で上下の中央揃えをします。
そして、align-items:center;で左右の中央揃えをすると上下左右の中央揃えができます。

```css:style.css

.center {
 height:120px;
 display:flex;
 justify-content:center;
 align-items:center;
}
useReducerとuseContext

##useContextとは？
以下の画像が分かりやすいが、わざわざpropsでバケツリレーをしなくても一気に下までもってける。

https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F218656%2F15306049-e6ae-fd95-e051-13b6363ebf65.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=60721f587b67bf0a928e91a6db7489b2


https://qiita.com/seira/items/fccdf4e73c59c491558d

これを見るとuseContext単体で使用するときは、return ()内で使いたい場合が便利。
関数やset~~~とかを使いたいときは少し不便。


##useReducerとは？
https://qiita.com/seira/items/2fbad56e84bda885c84c

ここにすべてが書いてあるが、Reduxみたいにaction, reducerを使ってuseStateを使う感じ。何がいいかって上のサイトの比較にも書かれてあるがグローバルで使えるところ。useContextと使うことで、useState(useReducerだけど)をグローバルに展開できるイメージ。


##useContextとuseReducer
流れとしては以下の記事が分かりやすい。

https://dev.to/hellomuthu23/how-to-use-usereducer-and-usecontext-hooks-with-typescript-in-react-14d1

1.React.createContextでContextを作成。
2.useReducerで使われる関数reducerを定義
3. useReducerを定義
4.```<CardContext.Provider value={{ state, dispatch }}></CardContext.Provider>```
でwrapする

5.
```const { state, dispatch } = useContext(CardContext)```
で子ファイルに呼び出し