OmniAICreator/Qiita-1.07M huggingface dataset:
Vuetifyでラジオボタン（v-radio）を横並びにする方法

Vuetifyのラジオボタン(v-radio)を横並びにしたい。
**→propsに row を指定すればOK**

---
まず、普通に書くと以下の画像のように縦並びになります

    <v-radio-group>
      <v-radio label="はい"           value="radio-1"></v-radio>
      <v-radio label="どちらでもない"  value="radio-2"></v-radio>
      <v-radio label="いいえ"         value="radio-3"></v-radio>
    </v-radio-group>
↓
![radio_tate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352532/258e9bfa-f362-3ab4-ff6d-64a7332c80c0.png)

どうにかこれを横並びにしたかったのですが、
「Vuetify ラジオボタン 横」などのバカっぽい検索を繰り返してもなかなか情報が出てきませんでした。
Vuetifyを使わない素のラジオボタンなら、「インライン要素にせよ」などの情報が出てきますが
いろいろ試すも一生縦のまま。


が、[公式リファレンス](https://vuetifyjs.com/ja/components/selection-controls/)を眺めていると、ばっちり書いてありました。

>Radios - Direction
>ラジオグループは、それぞれのpropsを使用して、行（row）または列（column）にできます。既定値は column です。

"横並び"など、縦横という言葉に囚われていたので見落としていました。
ページ内検索だけでなく、ざっと全体を読むことも大事ですね……

    <v-radio-group row >
      <v-radio label="はい"           value="radio-1"></v-radio>
      <v-radio label="どちらでもない"  value="radio-2"></v-radio>
      <v-radio label="いいえ"         value="radio-3"></v-radio>
    </v-radio-group>
↓
![radio_yoko.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352532/fe23294f-04af-1216-bd19-39f833fe98bd.png)
AIの現実世界への応用

# 音声認識
- 隠れマルコフモデル
    - 文章としての単語の繋がりを確率的に表現して文書の形を推測する言語モデル
    - 「未来の状態が現在の状態にのみ依存する」というマルコフモデルの一種
    - 「動詞の後には形容詞や名詞が置かれやすい」といったルールを学習する
    - 現在はディープラーニングに置き換えられている

#自然言語処理
- **セマンティックウェブ**
    - 情報リソースに意味を付与することでコンピュータに高度な意味処理を実現することを目指す
- **意味ネットワーク**
    - 単語同士の意味関係をネットワークによって実現する

ここ20年でインターネットの発展と共に分析の対象となるデータ量が増え、大きく活用が進んだ技術として**「統計的自然言語処理」**がある。
一般常識を知識ベース化することを目標にした**「Cycプロジェクト」**は現在も続いている。
2001年からは**「OpenCyc」**として知識ベースの一部が一般公開されている。

- 言語モデル : 確率を精密に設定することにより人間が用いる言語をモデル化する
    - 素朴な言語モデルは、設定しなければならない確率が膨大なので。精密なモデル化は現実的ではない。そこでそれをニューラルネットワークによって近似したものを**「ニューラル言語モデル」**という

1. 形態素解析
2. データのクレンジング (不要な文字列の除去)
3. データのベクトル化
4. TF-IDF等で各単語の重要度を評価

- 解析技術
    - 形態素解析 (意味をもつ最小単位、品詞)
    - 構文解析 (形態素間の構文関係)
    - 含意関係解析 (2つの分の間の含意関係)
    - 意味解析 (構文解析から意味のまとまり)
    - 文脈解析 (文単位での構造や意味)
    - 照応解析 (照応語、省略された名詞)
    - 談話解析 (話題の推移)
    - LDA (トピック推定、教師なし学習)
    - LSI (低次元の潜在意味空間)

# 深層強化学習
- 行動価値関数(ある状態である行動をとる利益)をディープニューラルネットワークで近似計算して行う強化学習のことを深層強化学習という
- 深層強化学習においてよく利用されるのが、DeepMind社が開発したDeep Q-Network (DQN)である
- DQNはAlphaGoにも使われている
- DQNはCNNの一種である

# ロボティクス
- 制御動作に**モンテカルロ法**や**Q学習**などの強化学習が使われている
- ロボットの一連の動作を1つのDNNで実現することを**一気通貫学習**という
- 五感など複数の情報を組み合わせて処理することを**マルチモーダル処理**という

# ゲーム
- AlphaGo
    - DeepMind社の囲碁AI 
- Ponanza
    - 将棋AI
- ディープブルー
    - IBM社のチェスAI
    - 先駆的な存在
    - 力任せの探索で世界チャンピオンに勝利

# 問題

- フレーム問題
    - 人工知能がどのようなことを考慮すべきでどのようなことを考慮すべきでないかを判断するのに膨大な時間がかかってしまうという問題
    - フレーム問題を打ち破ったAIを**「汎用AI」**という
    - フレーム問題を打ち破っていないAIを**「特化型AI」**という
- シンボルグラウンディング問題
    - 記号システム内のシンボルをどのようにして現実世界の意味と結びつけるかという問題
DataGripの基本操作

(気が向いたら、更新します)

## Sequel Proなどから別の乗り換え先を探してるという人...

DataGripを検討してみてはいかが!?


## DataGripについて

- JetBrainsの有料プランで契約出来るソフト
    - 一ヶ月お試し無料で使える
- MySQL, Redis, SQLiteなど様々なミドルウェアをサポートしている
- とても高機能！
- しかし、高機能すぎて、基本的な操作がどこにあるのかよく分からない...
    - この記事では、基本的な操作方法について解説します

## DBの接続方法

まず接続方法から

- 左側のDatabaseタブ > +マーク > Data Source > 対象のミドルウェアを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/04939209-e920-a6e1-bbbb-db5ac6b583f3.png)

- Host, User, Password, Databaseを記述
- Download missing driver filesが下に出ている場合は、 Downloadリンクを押下してdriverをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/332364ba-cb80-142d-6c40-9727bcc5f7be.png)

## Table操作
### Table作成
- schemaは各DBのこと。schemaを選んで、右クリック New > Tableでテーブル作成出来る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/ff69e27e-3701-3474-97b7-6e3760a4bc28.png)

- GUIで作成したい場合は、上側の画面を
- SQL文を直接打ち込みたい場合は、下側の画面(SQL Script)を使う
- 上の画面を変更すると、非同期でSQL文の画面の内容を更新してくれる
    - 逆はしてくれない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/73ddb742-d61a-4e64-c57e-97d5e8835366.png)
- Excuteでテーブル作成

### テーブル検索

Shiftを二回押せば、検索画面が出てくるので、そこでテーブル名の検索も出来る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/7d178002-ff60-3934-e27e-7d2a49d14d1e.png)

## カラム操作
### 追加

- +ボタン > Add New Rowで行を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/b43aae40-304d-f9d9-3fca-7b9ca5c19d36.png)

- 行が増えるので、中のカラムを編集する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/afbe950f-2b90-dbfe-634c-083d00e058ff.png)

- ただし、すぐ反映されるわけではない
  - draft状態になっているので、Submitボタンを押す必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/e3f5df32-bdd5-6808-e07f-15abb4ea18f5.png)

### カラム内検索方法

- メニューからfilter byを選択すればできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/c298d307-fb54-390a-bee4-49bf8e5780e1.png)


- もしくは、検索窓にwhere文から後ろを記述して検索

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98082/f93d7dda-7b84-974d-b077-082453335506.png)


(気が向いたら、更新します)
WSLからエクスプローラを起動する方法


## はじめに
`WSL(Windows Subsystem for Linux)`で`Git Bash`のようにコマンドラインからエクスプローラーを起動したいと思い、実行方法を調べてみました。

実行環境は以下のとおりです。

- Windows : Windows 10 Pro
- WSL : Ubuntu 18.04.2 LTS

## やりたかったこと
`Git Bash`ではコマンドプロンプトの`startコマンド`を使用してエクスプローラーを実行することができます。

```
$ start explorer [ディレクトリパス]
```

これと同じように、コマンドラインからエクスプローラを実行できるかを`WSL`で確認します。

## 結果
結果として`WSL`では下記のコマンドでエクスプローラーを実行することができました。

```
$ explorer.exe [ディレクトリパス]
```

### Windows側のファイルを実行できる理由
`envコマンド`を用いてWSL側の環境変数`PATH`の中身を確認してみました。

```
$ echo $PATH | sed s/:/\\n/g | grep -Ei "/mnt/c/windows"
/mnt/c/Windows/system32
/mnt/c/Windows
/mnt/c/Windows/System32/Wbem
/mnt/c/Windows/System32/WindowsPowerShell/v1.0/
/mnt/c/WINDOWS/system32
/mnt/c/WINDOWS
/mnt/c/WINDOWS/System32/Wbem
/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/
/mnt/c/WINDOWS/System32/OpenSSH/
/mnt/c/WINDOWS/system32
/mnt/c/WINDOWS
/mnt/c/WINDOWS/System32/Wbem
/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/
/mnt/c/WINDOWS/System32/OpenSSH/
```

どうやら`WSL`ではWindows側の環境変数がデフォルトで反映される為、Windowsの標準コマンドなどの実行ファイルを指定できるようです。

## .exeを指定しないでコマンドを実行する
実行方法は分かりましたが、いちいち`.exe`を指定して実行するのが億劫なのでエイリアスを登録します。

### エイリアスの登録
bashの設定ファイル`.bashrc`の中にエイリアスを登録し、`.exe`なしでコマンドが実行できるよう設定します。

```
$ vim ~/.bashrc
```

`vim`の編集画面が開かれるので、以下のように`.bashrc`に内容を追記してください。

```
alias [コマンド名]='[実行ファイル名]'
```

私は以下のように設定しました。

```
# aliases
alias explorer='explorer.exe'
```

編集が終わったら、`sourceコマンド`で`.bashrc`を再度読み込ませて、エイリアスを反映させます。

```
$ source ~/.bashrc
```

`sourceコマンド`実施後、`.exe`なしでコマンドを実行できるか確認します。

```
$ explorer .
```

これで`.exe`なしで実行できるかと思います。
ちなみに設定したエイリアスの一覧は`aliasコマンド`で確認できます。
PromiseとAwaitの違い、Promiseで勘違いしたこと

「PromiseとAwaitの違い」というタイトルがもう、わかってない感がすごくてヤバイっすね
Promiseが基礎機能で、Awaitはpromiseを使って待つ仕組み的なもの。


## Promise の `.then()` は待たないという話

Promise の `.then()` は一気に実行される。最初のとこすら待ってくれない。一気に流したいなら promise 作って then するだけで非同期になる。 `.then()` の中でAPI取得とかしてたら、（実行順は揃うけど結果の）前後はまったく保証されない。

#### e.g. 
4秒待つ、3秒待つ、2秒待つ・・・と時間がかかるかと思いきや、最期の1秒待つやつから順に帰ってくる。

```js
log = (str) => console.log(str);

new Promise(function(resolve, reject) {
  setTimeout(() => log(4000), 4000);
  resolve();
}).then((result) => {
  setTimeout(() => log(3000), 3000);
}).then((result) => {
  setTimeout(() => log(2000), 2000);
}).then((result) => {
  setTimeout(() => log(1000), 1000);
});
```

#### result
```js
1000
2000
3000
4000
```




## 待つために Await がある
先の例を順番通り実行したい場合は、awaitで同期モードにする。

```js
worker = (i) => {
	return new Promise((resolve) => {
		setTimeout(function(){resolve(i)}, i);	
	});
}

async function start() {
	let res = await worker(4000);
	log(res);
	res = await worker(3000);
	log(res);
	res = await worker(2000);
	log(res);
	res = await worker(1000);
	log(res);
}

start();
```



#### result

```js
4000
3000
2000
1000
```

## await に `then()` をぶら下げても、一気に実行される

最初の4000にだけawaitをつける
→ 4000はすぐ実行される
→ その他は4000の直後にだららっと実行される（非同期モード）

```js
worker = (i) => {
	const promise = new Promise((resolve) => {
		setTimeout(function(){
			console.log(i);
			resolve(i);
		}, i);	
	});
	return promise;
}

async function start() {
	let res = await worker(4000)
				.then(worker(3000))
				.then(worker(2000))
				.then(worker(1000));
}

start();
```

#### result

```js
１000
2000
3000
4000
```



意味不明すぎるので、狙ってたとしてもこんなことはしてはいけない。（これがやりたい場合は素直に `Promise.all()` しましょう）



## `then()` の中でawait すれば、待つ

then() の中でも `async` を書かないといけないので少しトリッキー。

```js

worker = (i) => {
	const promise = new Promise((resolve) => {
		setTimeout(function(){
			console.log(i);
			resolve(i);
		}, i);	
	});
	return promise;
}

async function start() {
	let res = await worker(4000)
				.then(async () => await worker(3000))
				.then(async () => await worker(2000))
				.then(async () => await worker(1000))
}

start();

```

#### result 


```
4000
3000
2000
1000
```


## 結論

awaitはawaitだけで使う。then()とは組み合わせない （チェーンにしない）

```js
// good 
await worker(1);
await worker(2);

// wrong
await worker(1)
      .then(async () => await worker(2))
```

追記 ->
await同士を組み合わせて待ちたい場合の記事を書いた
https://qiita.com/uturned0/items/74ff00cbef3290d0aed2
<-

以上、基礎連でした。



## アロー関数ちなみに
アロー関数のことをラムダ式と呼ぶらしい。

これは

```js
log = (str) => console.log(str);
```

これと同じ

```js
function log (str) {
    console.log(str);
}
```

1行だけなら {} が省略できる

引数が１つなら () すら省略できる

```js
log = str => console.log(str);
```

`log = str` が並んでる時点でかなりヤバイ見た目になる。
個人情報保護法改正(2020年)の改正内容

# 概要

本記事では2020年の日本の個人情報保護法改正における改正内容をまとめる。
本記事は以下の記事の続き。
https://qiita.com/yamato225/items/7153ca8c929282603435

# 内容

## 「仮名加工情報」に関する規定の追加

仮名加工情報とは、他の情報と照合しない限り特定の個人を識別することができないように個人情報を加工して得られる情報のこと。
仮名加工情報の場合、個人情報や匿名加工情報よりも取り扱いにおける義務などが緩和されている(35条の二の9)。
例えば、

* 取得時の利用目的外の利用(15条で禁止されている)が可能。
* 開示請求(28条)や、利用停止の請求(29条)に応じる義務はない。

など。

なお、

* 個人情報を、どのように加工すれば、仮名加工情報と認められるのか
* 仮名加工情報が漏洩しないように講じるべき安全措置

については、個人情報保護委員会の定めに従うことになっているが、2020/7/7時点で案内は出ていない模様。

## 「個人関連情報」の追加

個人関連情報とは、生存する個人に関連する情報であって、個人情報、仮名加工情報、匿名加工情報のどれにも該当しないもののこと。定義がいまいちな気がするが、個人関連情報が想定しているのは、Webサイトのアクセス履歴や購買履歴といった情報の模様。
個人関連情報自体を第三者に提供しようとする場合、提供先で個人情報として扱われることが想定されるときは、本人の許可を得ずに提供してはならないと明示された。


## 個人の権利の拡大

個人が事業者に対し求めることの出来る権利が拡大した。

* これまで６ヶ月以内に削除されるデータは開示請求の対象でなかったが、対象になった。
* データの開示方法は文書のみだったが、電子データで提供を受けることもできるようになった。
* 第三者に対する提供記録も開示請求できるようになった。
* 利用停止・消去を請求できる条件が増えた。①違法、または不当な手段で事業者が利用した場合②事業者がそのデータを必要としなくなった場合③重大な漏洩等を生じた場合、④本人の権利や利益が害される恐れがある場合

## オプトアウトによる第三者提供の制限

①不当な方法で得た個人データ
②他の事業者からオプトアウトで得た個人データ

は、オプトアウトによる第三者提供ができなくなった。


## 罰則の強化

個人情報保護委員会の命令に違反したり虚偽報告したりした場合の罰則が強化された。
具体的には、「６ヶ月以下の懲役または３０万円以下の罰金」が「１年以下の懲役または５０万円以下の罰金」となった。
また、これまで法人に対する規定は無かったが、法人に対し１億円以下の罰金を課す条文が追加された。

## その他

* 認定個人情報保護団体の認定条件が緩和(事業者による自主的な取り組みを促す)。
* 違法、または不当な行為を助長し、または誘発する恐れがある方法による個人情報の利用が禁止された。
* 漏洩等が発生した場合に、①本人②個人情報保護委員会への報告が義務となった。
* 域外適用。外国の事業者でも報告や命令の対象になる。
* 外国の第三者への提供の制限。当該国における個人情報保護制度などの情報を本人に提供する義務が課された。

# 関連する事件

## 破産者マップ問題

2019年、官報に掲載された破産者の氏名や住所を公開した「破産者マップ」というサイトが公開された。個人情報保護委員会は、個人情報保護法(2015年改正)の観点から問題だとして運営者に行政指導を行い、サイトは閉鎖された。

## リクナビ内定辞退率提供問題

リクナビを運営するリクルートキャリアが独自に算出した学生の内定辞退率を企業に販売していた。個人情報保護委員会は提供を受けた企業と提供元のリクルートキャリアに対し勧告・行政指導を実施。

# 参考文献

* 個人情報の保護に関する法律等の一部を改正する法律（概要）
https://www.ppc.go.jp/files/pdf/200612_gaiyou.pdf
* 新旧対照表
https://www.ppc.go.jp/files/pdf/200612_sinkyutaisyohyo.pdf
* 個人情報の保護に関する法律等の一部を改正する法律
https://www.ppc.go.jp/files/pdf/200612_houritsu.pdf
* 個人情報保護法の令和２年改正案の１０のポイント
https://www.gojo-partners.com/column-ps/3646/
* 衆議院：個人情報の保護に関する法律等の一部を改正する法律案
http://www.shugiin.go.jp/internet/itdb_gian.nsf/html/gian/honbun/houan/g20109048.htm
* 破産者マップに行政指導
https://www.asahi.com/articles/ASM3N3T12M3NULFA008.html
* 個人情報保護委、“リクナビの内定辞退率”利用企業に行政指導　トヨタ、京セラなど35社  
https://www.itmedia.co.jp/news/articles/1912/04/news155.html
【Vue.js】 Loading 付き Submit Button

Vue.js でのローディング付き submit ボタンのサンプル例を紹介します。
どのプロジェクトでも使えることでしょう。

## クリック前

![スクリーンショット 2020-07-07 1.08.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38580/5fd060ac-2ea0-01b9-2c99-030147cc7384.png)

## クリック後

![スクリーンショット 2020-07-07 1.09.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38580/4ef18e70-7092-7bb2-772c-71ab9e436926.png)

## Vue.js + Composition API のコード

ローディングコンポーネント

```buttonLoader.vue
<template>
  <div class="loader"></div>
</template>

<style scoped>
.loader,
.loader:after {
  border-radius: 50%;
  width: 10em;
  height: 10em;
}
.loader {
  font-size: 2px;
  position: relative;
  text-indent: -9999em;
  border-top: 1.1em solid rgba(255, 255, 255, 0.2);
  border-right: 1.1em solid rgba(255, 255, 255, 0.2);
  border-bottom: 1.1em solid rgba(255, 255, 255, 0.2);
  border-left: 1.1em solid #ffffff;
  -webkit-transform: translateZ(0);
  -ms-transform: translateZ(0);
  transform: translateZ(0);
  -webkit-animation: load8 1.1s infinite linear;
  animation: load8 1.1s infinite linear;
}
@-webkit-keyframes load8 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
@keyframes load8 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
</style>
```

submit button コンポーネント

```submitButton.vue
<template>
  <button type="submit" :class="styles" :disabled="isLoading">
    <button-loader v-if="isLoading" />
    <span v-else>{{ text }}</span>
  </button>
</template>

<script lang="ts">
import { defineComponent } from '@vue/composition-api'
import buttonLoader from '@/components/atoms/buttonLoader.vue'

export default defineComponent({
  components: {
    buttonLoader
  },
  props: {
    text: String,
    styles: String,
    isLoading: Boolean
  },
  setup() {}
})
</script>
```

利用側のコンポーネント

```signup.vue
<template>
  <div>
    <form>
      <submit-button
        @click.native="login()"
        text="ログイン"
        styles="w-full flex justify-center ..etc"
        :isLoading="state.isLoading"
      />
    </form>
  </div>
</template>

<script lang="ts">
import { defineComponent, reactive } from '@vue/composition-api'
import submitButton from '@/components/atoms/submitButton.vue'

export default defineComponent({
  components: {
    submitButton
  },
  setup() {
    const state = reactive({
      isLoading: false
    })
    const login = async () => {
      state.isLoading = true
      try {
        ...
      } catch (error) {
        ...
      } finally {
        state.isLoading = false
      }
    }
    return { state, login }
  }
})
</script>

```
雀士適性検査ゲーム

###作成理由
外出もできず暇を持て余していた時に麻雀にはまり、麻雀に関するものを製作したいと考えていたためです。
[課題の内容決め](https://qiita.com/FKazuki/private/717407e8baf60ef83499)
このとき懸念してたことが起こりました。

---

#####参考にした本

* 「Pythonでつくるゲーム開発入門講座」,<br>廣瀬　豪

####使用した画像

* [いらすとや](https://www.irasutoya.com)
　　

---

###実際に作成したもの↓
![コメント 2020-07-04 121856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638195/8d91456c-a41e-8da8-7fff-12e16c0e0b39.png)

---

###反省とコード

* bouncing ball のときmainloopの後ろに()つけ忘れをしていたのをまたやってしまいました。<br>
  （()忘れたとき実行しても、どこに問題があるか教えてくれないからたちが悪い）

```Python:kadai.py
import tkinter as tk

Kekkahhapyou = [
"  ; ;麻雀だけでなく、他の博打もやめておいたほうがいいと思います。", #チェック0
"  ; ;雀士には全く向いていません。",  #チェック1
"  ; ;麻雀はお控えください。雀士には向いていません。",  #チェック2
"＾＾いいですね！雀士の素質はあると思います。",  #チェック3
"素質十分です。麻雀やってみませんか？",  #チェック4
"麻雀をやるために生まれてきたのかもしれませんね。",  #チェック5
"あなたは雀士です。隠しても無駄です。",  #チェック6
"貴方は麻雀のみならず他の博打にも才能があるのは確実です。",  #チェック7
]
def click_btn():
    pts = 0
    for i in range(7):
        if bvar[i].get() == True:
            pts = pts + 1
    tekiseiritu = int(100*pts/7)
    text.delete("1.0", tk.END)
    text.insert("1.0", "<診断結果>あなたの雀士適性率は" + str(tekiseiritu) + "%です。" + Kekkahhapyou[pts])

root = tk.Tk()
root.title("雀士診断アプリ")
root.resizable(False, False)
canvas = tk.Canvas(root, width=800, height=600)
canvas.pack()
gazou = tk.PhotoImage(file="kadai.png")
canvas.create_image(400, 300, image=gazou)
button = tk.Button(text="診断", font=("Times New Roman", 32), bg="gray", command=click_btn)
button.place(x=400, y=480)
text = tk.Text(width=40, height=5, font=("Times New Roman", 16))
text.place(x=320, y=30)

bvar = [None]*7
cbtn = [None]*7
ITEM = [
"賭け事が好き",
"自分は運のいいほうだと思う",
"自分は本番に強いタイプだ",
"集中力には自信がある",
"相手の思考を読むのが得意だ",
"物事は焦らずじっくりやりたい",
"負けず嫌いだ",
]
for i in range(7):
    bvar[i] = tk.BooleanVar()
    bvar[i].set(False)
    cbtn[i] = tk.Checkbutton(text=ITEM[i], font=("Times New Roman", 12), variable=bvar[i], bg="#dfe")
    cbtn[i].place(x=400, y=160+40*i)
root.mainloop()

```
～AIに自我を宿らせることはできるのか？～　要約1.0版　PDCA型自立思考AI 初期アイディア

# 自己紹介
皆さんこんにちは。
山中（さんちゅう）で,はちわれ猫たちと,一緒に生息しているWebエンジニア,ほげふがーです。
また,最近は自立思考型AIの仕組みを考えることが趣味になっています。
気になったら,何かコメントいただけると嬉しいです(^^
# 追記
本記事の件、こちらのシステムで実現できてるかもしれない....この会社さんとAuto-GPTスゴすぎる
[LLM Agent](https://logmi.jp/tech/articles/328825)
# ～きっかけ～
ここを見てね！
https://qiita.com/TiresiasGit/items/9b78b9380ac56bf118b9
1.漫画：アトム・ザ・ビギニング　A106くん(アトムくん)　を見て。
<img width="200" alt="9784864684170.jpg"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559034/f5d3bd49-630f-cb0d-017a-5e2140f860c6.jpeg">
出典元：https://www.heros-web.com/works/atom-tb/comics/
2.ドラえもんのような,人間くさいけど,優しいAIも欲しい。←(◎これも重要ね。)
3.アニメ：PsychoPass　のシビュラシステム,ラウンドロビン　を見て。
<img width="800" alt="nuEFsgFQ1BnEhf51571934381_1571934435.jpg"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559034/e65e8f80-0452-0b9b-5a92-1f9051adf0e5.jpeg">
出典元：https://dorama-navigate.com/psycho-pass3-consideration-what-is-bifrost

4.AIが国会をすべき。という思想をもっているから。

この4つが,僕を取り組ませる原動力です。

# PDCA型自立思考AI　アイディア
さて,本題です。
思いついたのは,下記のデータフロー(包括的フレームワーク)です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559034/28fefe09-1256-31e1-abb1-5302559bc00a.png)

(Azureでほとんど実現できるかも？)

# 理想状態テーブルと現実状況テーブル
現実世界は複雑なので,DBのテーブル同士の演算ができるRDBやpython＋dataframeで扱うのが望ましい。
それぞれのテーブルは,
　いつ,
　どこで,
　だれ1が,
　だれ2に,
　何を,
　どのようする,
　なぜ,
　優先度,
　実行可能flag(初期値0:実行不可)
の列を持つ。
# 詳しいフローは
ここを見てね！
https://qiita.com/TiresiasGit/items/9b78b9380ac56bf118b9

# 結局何をしていたのか？
　・何をしていたかというと,端にPDCAだった。(品質管理手法の考え方の基本)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559034/cc8f6c00-4b91-3bf8-52e9-ef225f7851c7.png)
　・現状,PDCA型自立思考AIは,理想状態と,言語モデルをどうあるべきか？を抜けなく完璧に定義できないと、暴走する危険性は十分にある。

# もっといいのがあるよ！という方へ
もし,「もっといい理想的な自立思考AIができるよ！思いついた！」or「一部分だけど作れたよ！」という方がいらっしゃいましたら,コメント欄を自由に使っていただいて結構ですので,ご教授をよろしくお願いします。m(_ _)m
高専キャリアでクラウドAI開発してつよつよになるお話　その1(1週目進捗報告)

**高専キャリアでドラクエプレゼンを聞きながら、teamsのBotを開発してプロになれる講座が始まるらしい...**

そして無料。というわけで、参加してつよつよになりたいと思います。
このシリーズが終わる頃にはつよつよになっていることでしょう。

## やりたいこと
- Azure使い倒してみる
- LINE Botで作りかけてた時間割を教えてくれるBotをTeams Botにして運用したい

というわけで、順調にいけばこれから時間割BotをTeamsでも動かせるようになるでしょう。楽しみ！！

## 1週目の進捗報告
- de:code2020の登録
- Azure for studentsの登録

## 次までのタスク
- de:code2020のレッスンに取り組む
- Microsoft Learn for Studentsでお勉強
- 作りたいBotを3つくらい決めておく

頑張ります!!!!!
flutterのリリースビルド時にExecution failed for task ':app:lintVitalRelease'.が発生した時の対応

# 概要
下記コマンド実行時に、`Execution failed for task ':app:lintVitalRelease'`が発生したのでその際実施した内容です。

```bash
❯ flutter build apk
```

# 環境
```bash
[✓] Flutter (Channel stable, v1.17.5, on Mac OS X 10.15.5 19F101, locale ja-JP)
[!] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    ✗ Android license status unknown.
      Try re-installing or updating your Android SDK Manager.
      See https://developer.android.com/studio/#downloads or visit visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions.
[✓] Xcode - develop for iOS and macOS (Xcode 11.5)
[✓] Android Studio (version 3.6)
[✓] VS Code (version 1.46.1)
[!] Connected device
    ! No devices available
```

# 対応内容

## lint optionsを追記

下記内容を`android/app/build.gradle`に追加。lintOptionsは既に記載されているはずなので、` checkReleaseBuilds false`のみ追加しています。
```gradle:android/app/build.gradle
lintOptions {
        disable 'InvalidPackage'
        checkReleaseBuilds false # 追加
}
```

## buildコマンドを変更

### こっちは失敗
```bash:failed
❯ flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi
```

### こっちは成功
```bash:success
❯ flutter build appbundle --target-platform android-arm,android-arm64,android-x64
```

# まとめ

` flutter build appbundle`を利用することで無事apkファイルがビルドできました。
参考になれば幸いです。

# 参考サイト

https://github.com/flutter/flutter/issues/30598#issuecomment-622926226
Vagrantで起動する仮想マシンへのファイル共有を無効化したい

# はじめに
この記事は以下のバージョンで設定した際の内容になります。

```
>vagrant version
Installed Version: 2.2.9
Latest Version: 2.2.9
```

VagrantをHyper-Vで立ち上げた際に、ホスト―仮想間でのSMBを用いたファイル共有するためにID/PWを入力するための応答が毎回返ってきます。

これはVagrantfileにフォルダ共有する要素を記述していなくても応答されるメッセージになります。

```
==> master: Preparing SMB shared folders...
    master: You will be asked for the username and password to use for the SMB
    master: folders shortly. Please use the proper username/password of your
    master: account.
    master:
    master: Username (user[@domain]): XXXXXX
    master: Password (will be hidden):

Vagrant requires administrator access to create SMB shares and
may request access to complete setup of configured shares.
==> master: Setting hostname...
==> master: Mounting SMB shared folders...
    master: D:/Vagrant => /vagrant
```

ID/PWの入力ミスをしても再入力が求められるわけでもなくエラーを吐いて、Vagrantとしての動作を終了する。

```
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t cifs -o vers=2.0,credentials=/etc/smb_creds_vgt-9638fd9441b3a216f378d2b7892d3142-6ad5fdbcbf2eaa93bd62f92333a2e6e5,uid=1000,gid=1000,mfsymlinks //XXX.XXX.XXX.XXX/vgt-9638fd9441b3a216f378d2b7892d3142-6ad5fdbcbf2eaa93bd62f92333a2e6e5 /vagrant

The error output from the last command was:

mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
```

このエラーが吐かれても仮想マシンはファイル共有機能は設定されないまま起動するが、少々手を焼く。
たまに以下のように仮想マシン起動に用いられる`ruby.exe`がプロセス終了せず、その後の動作が作動しない現象に直面することもしばしば。

```
>vagrant halt
An action 'read_state' was attempted on the machine 'master',
but another process is already executing an action on the machine.
Vagrant locks each machine for access by only one process at a time.
Please wait until the other Vagrant process finishes modifying this
machine, then try again.

If you believe this message is in error, please check the process
listing for any "ruby" or "vagrant" processes and kill them. Then
try again.
```

上記エラーに遭遇した場合、タスクマネージャーから`ruby.exe`を強制的に終了させることで解決する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146869/84ff4f8a-a628-325c-4a5e-6bd20ff337ae.png)


毎回、ファイル共有が必要な場面も少なく、必要に応じてWinSCPなどを用いてファイルを取り出す環境に適応したいので、
このデフォルトで実装されているファイル共有を取り消すことにした。

# ファイル共有の無効化設定の方法

Vagrantfileに以下の内容を追記することで無効化することできた。

```
config.vm.synced_folder ".", "/vagrant", disabled: true
```
UiPath：本日の年度を得る方法

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

DateTime型ってのは、単に日付とか日時を格納して、.ToString辺りで文字列化して、ファイル名の一部にしてみたりって位しか使っていなかったんですが、業務要件によっては「**年度**のフォルダの中にファイルがあるんだよね」なんて言われてしまって。。。

**年度**を求めるのには、COBOL的発想だと、月を持ってきて、1月、2月、3月だったら年 - 1だよね。。。なんてやってしまうのだけど、DateTime型には、「DateTime.AddMonths(Int32)」と言うありがたいメソッドがあるわけで。

|日付|年度|-1月|-2月|-3月|-4月|
|:-----|:----:|:-----|:-----|:-----|:-----|
|2020/5/1|2020|2020/4/1|2020/3/1|2020/2/1|2020/1/1|
|2020/4/1|2020|2020/3/1|2020/2/1|2020/1/1|2019/12/1|
|2020/3/1|2019|2020/2/1|2020/1/1|**2019/12/1**|**2019/11/1**|
|2020/2/1|2019|2020/1/1|**2019/12/1**|**2019/11/1**|**2019/10/1**|
|2020/1/1|2019|**2019/12/1**|**2019/11/1**|**2019/10/1**|**2019/9/1**|
|2019/12/1|2019|**2019/11/1**|**2019/10/1**|**2019/9/1**|**2019/8/1**|

例えば日付に-3月を加算してあげれば(3月を減算として書きたいところだけど）、2020/3/1が2019/12/1となって**2019年度**となり、2020/4/1は2020/1/1となって**2020年度**となる。

ならば、3月始期の会社だったりすると、-3ではなく、-2してあげればいいんですね。

流石にプログラマだったりするとこのレベルだと既に実装しているだろうけど、最近のトレンド、「内製化」する会社の現場の方はちょっと覚束ない。

だもんで、一気に**年度**までを取得できる代入式を見せてあげている訳で。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/2a57d1a4-7e12-715e-92bf-623cf5b15ec3.png)

左辺：年度（Int32)
**右辺：日時.AddMonths(-3).Year**

##おわりに
いかがでした？
DateTime型はExcelシート上の日付でフィルタリング範囲に使ってみたり、先の例のように業務で管理単位とするなど、様々なシーンで扱うことが多い**型**です。是非UiAthでのロボ開発の一助になればと思っています。

ありがとうございました！

2020/7/9 初稿、日時.AddMonths(-3).Yearとすべきところを、日時.AddMinutes(-3).Yearとしていました。
Metasploit でdatabaseに接続できない時の処理

# msf5 >db_status で接続できてない

[*] postgresql selected, no connection
となって、接続できない時の処理です。<img width="319" alt="db-status.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627370/a1398735-f039-2f3e-391a-0091aba26efa.png">

## Postgresqlサービスをupdateして起動

```Bash:
sudo update-rc.d postgresql enable
sudo service postgresql start
```

## そして、Metasploitを起動し、確認する
```Bash:
msfconsole
```
起動後、

```Bash:
db_status
```

<img width="409" alt="db-connect.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627370/98e190bf-714e-59ca-f50e-123610fcd60c.png">

解決しました！
【初心者でもわかる】cssでよく使われる単位は「px, %, vw, vh」のこの4種類だけ！

# どうも、7noteです。今回は4種類の単位の話していきます。
どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/unit/
Python で「年月」を扱う

Python で「年月」を扱うためのクラスを書いたが、[dateutil](https://dateutil.readthedocs.io/) を使えばできるということに後から気付いてしまったので供養。勢いで書いたし <del>テストもないので</del> (最低限のテストは書いたが) 使うときは自己責任で。

## 実装
PyPI に上げたので、pip でインストールできる。

``` console
$ pip install ym
```

コードはこちら
https://github.com/hoto17296/python-ym

## 用例
``` python
from ym import ym
```

### 年月を指定してインスタンス作成
``` python
ym(2020, 4)  #=> ym(2020, 4)
```

### 現在の月からインスタンス作成
``` python
ym.current()  #=> ym(2020, 7)
```

### 文字列からインスタンス作成
``` python
ym.parse("2020-04")  #=> ym(2020, 4)
```

### 日付オブジェクトからインスタンス作成
``` python
from datetime import date

ym.parse(date.today())  #=> ym(2020, 7)
```

``` python
from datetime import datetime

dt = dateime.now()
ym.parse(dt.date())  #=> ym(2020, 7)
```

### 年, 月 を取得
``` python
current = ym.current()  #=> ym(2020, 7)
current.y  #=> 2020
current.m  #=> 7
```

### 加算, 減算
``` python
ym(2020, 4) + 10  #=> ym(2021, 2)
ym(2020, 4) - 10  #=> ym(2019, 6)
```

### 年月の差
``` python
ym(2020, 7) - ym(2020, 4)  #=> 3
```

### 比較演算
``` python
ym(2020, 7) < ym(2020, 4)  #=> False
ym(2020, 7) > ym(2020, 4)  #=> True
ym(2020, 7) == ym(2020, 4)  #=> False
```

### 範囲取得
``` python
list(ym(2020, 4).to(2020, 7))  #=> [ym(2020, 4), ym(2020, 5), ym(2020, 6)]
```

``` python
current = ym.current()  #=> ym(2020, 7)
list(current.to(current + 6))  #=> [ym(2020, 7), ym(2020, 8), ym(2020, 9), ym(2020, 10), ym(2020, 11), ym(2020, 12)]
```
Puppeteerの動画再生には形式に注意が必要

ヘッドレスブラウザのPuppeteerを使いWebRTCを通して、Videoタグの動画を相手に送るというのを行おうとしていたが、はじめうまく動作しなかった。
結果として、動画の形式（codec）が悪かったという話

## 動く動画形式

簡単に言うと、PuppeteerのデフォルトブラウザはChromiumで、Chromiumで動く動画・音声形式は以下ですよ、という感じらしい。
https://www.chromium.org/audio-video

### Container formats
- MP4 (QuickTime/ MOV / MPEG4)
- Ogg
- WebM
- WAV

### Codec formats (Decode Only)
#### Audio
- FLAC
- MP3
- Opus
- PCM 8-bit unsigned integer
- PCM 16-bit signed integer little endian
- PCM 32-bit float little endian
- Vorbis
- AAC [Main, LC, HE profiles only, xHE-AAC on Android P+] [Google Chrome only]
- AMR-NB [Google Chrome OS only]
- AMR-WB [Google Chrome OS only]
- PCM μ-law [Google Chrome OS only]
- GSM [Google Chrome OS Only]

#### Video
- VP8
- VP9
- AV1 [Only Chrome OS, Linux, macOS, and Windows X86 at present]
- Theora [Except on Android variants]
- H.264 [Google Chrome only]
- MPEG-4 [Google Chrome OS only]

で、適当な動画を再生しようとしたらH.264で、Google Chromeなら動くらしいが素のChromiumでは残念ながら動かないので、puppeteerでも動かなかった。
音声は対応形式だったので流れてた模様

というのでcodecを変えて、試しに
`WebMコンテナ`で、`Audio:Vorbis`、`Video：VP8`でエンコードしたところ再生されました。

## 資料とそれ以外の方法

実はここに書いてあって、音声・動画系はうまく行かない時があるよとのこと。
https://github.com/puppeteer/puppeteer

> You may find that Puppeteer does not behave as expected when controlling pages that incorporate audio and video. (For example, video playback/screenshots is likely to fail.)

これとは別に回避方法としては、Chromeをインストールしてそれを使う方法もあるようです

```javascript
const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});
```

この場合はpuppeteerではなくpuppeteer-coreで良いようです
［JS］動的に追加した要素を取得したりごにょごにょできる MutationObserver を使ってみた

![MutationObserver.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593842/a66463b1-b88f-416d-5992-63425dab733a.jpeg)

記事はこちら

https://myscreate.com/mutationobserver/
nuxtでyarn add firebaseしたときにcore-jsがたくさんModule not foundするやつの対処法

`create-nuxt-app`からNuxtアプリを作っていて、
`yarn add firebase`をしたらこんなエラーがたくさん出てきたときの対処法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212694/bfc47ab8-8fd9-1b38-48b1-8cf1b7cde4a5.png)


ここで解決案が出されていた

[Module not found: Error: Can't resolve 'core-js/modules/es6.array.iterator' in '/app/.nuxt' · Issue #5287 · nuxt/nuxt.js](https://github.com/nuxt/nuxt.js/issues/5287#issuecomment-622660147)


```console
yarn add -D core-js@3 @babel/runtime-corejs3
```

からの、`nuxt.config.js`に以下追加で解決

```
export default {
  build: {
    babel: {
      presets({ isServer }) {
        return [
          [
            require.resolve('@nuxt/babel-preset-app'),
            // require.resolve('@nuxt/babel-preset-app-edge'), // For nuxt-edge users
            {
              buildTarget: isServer ? 'server' : 'client',
              corejs: { version: 3 }
            }
          ]
        ]
      }
    }
  }
}
```
Xcode11 プロキシ設定


プロキシ環境化で作業をしているため、設定をすることが多いのですが、
Xcode11でプロキシの設定が変わっていたので、残しておこうと思います。

###### 変更ファイル
Xcode11以前
/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/net.properties

Xcode11
/SharedFrameworks/ContentDeliveryServices.framework/Versions/A/itms/java/lib/net.properties

###### 変更内容
パスワード設定がある場合でも、パスワードの指定は不要でした。

**動かない:disappointed_relieved:**
`http.proxyHost=http://username:p%40ssword@myproxy`
`http.proxyPort=8080`

**動いた:smiley:**
`http.proxyHost=http://myproxy`
`http.proxyPort=8080`

###### 悩み
simulatorのプロキシ設定方法がわからないです。:sob:

######独り言
プロキシ環境での作業は色々ストレスがあって大変です。
1602 キャラクタ LCDモジュール をI2C接続で ESP32 で動かす

1602 キャラクタ LCD モジュールを I2C で接続してみます。

「1602 キャラクタ LCDモジュール を STM32 と RaspberryPi で動かす」
https://qiita.com/nanbuwks/items/d5f094e54a3f6641c970

にて、16行2列の液晶モジュールについて説明しました。
この記事ではパラレル接続で RaspberryPi と STM32 で動かしましたが 今回は I2C 接続と ESP32 の組み合わせで試してみます。

# 環境

- ESP32 WEMOS Lolin32
- Arduino 1.8.10 開発環境
- LiquidCrystal I2C by Franc de Brabander バージョン 1.1.2 ライブラリ

# LCD と I2C 変換アダプタ

LCDは先の記事「1602 キャラクタ LCDモジュール を STM32 と RaspberryPi で動かす」
https://qiita.com/nanbuwks/items/d5f094e54a3f6641c970
で紹介した 3.3V のものを使いました。

![IMG_20200706_230115881.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8bf92b0f-0231-e10d-a90b-9aabe678611d.jpeg)

これに、I2C 変換アダプタを接続します。
![IMG_20200706_225832676.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9432b685-6d24-4289-d2c7-a81b8039ae16.jpeg)

今回は表面にはんだ付けしました。

このI2C変換アダプタは中華製のノーブランド品です。


## 接続
![IMG_20200706_224123329_HDR.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/0793e298-b63c-1d8e-a1f6-763b645abec8.jpeg)

|I2C変換アダプタ側|Wemos ESP32側|
|:---:|:---:|
|GND|GND|
|VCC|3.3V|
|SCL|SCL|
|SDA|SDA|



# I2C アドレス

変換アダプタのチップや、アドレス指定ジャンパーの設定によりいくつかアドレスが変わっているそうだ。購入の際ドキュメントなどはないので、スキャナで調べた所 0x27 だった。

cf.,「ESP32 を使って I2C スキャナ」
https://qiita.com/nanbuwks/items/c235f7f867f6139b6c8b


一見同じに見える「1602LCDをI2C変換アダプタを使ってArduinoで表示する。」
https://qiita.com/clses/items/b4940804eb0a663fdc41
の記事では 0x3F となっているが、こちらではサンプルプログラムのデフォルトの 0x27 のままで動作した。

以下は「1602 キャラクタ LCDモジュール を STM32 と RaspberryPi で動かす」のサンプルプログラムをI2C用に書き換えたもの。

```

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // I2C addr, 16x2 character

void setup()
{
  Serial1.begin(115200);
  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0); //LCD Row 0 and Column 0
  lcd.print("Hello...!");
  lcd.setCursor(0, 1); //LCD Row 0 and Column 1
  lcd.print("Time:");
}

void loop() {

lcd.setCursor(6, 1);
int times=millis() / 1000;
lcd.print(times);
Serial1.println(times);
delay(1000);
}

```


# おまけ 秋月電子のLCDで失敗

![IMG_20200706_225617993.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7680b941-4eae-3334-6f1b-266dbcdaad05.jpeg)

秋月電子「Ｉ２Ｃ接続キャラクタＬＣＤモジュール　１６×２行　白色バックライト付」
(ACM1602NI-FLW-FBW-M01)

でもやってみました。こちらは追加モジュール無しでI2C通信ができます。
I2Cアドレスはマニュアルでは  10100000 とあります。このまま読むと 0xA0 となりますが、最下位ビットはR/Wビットなのでそれを除外し 1ビットシフトして 0x50 が I2C アドレスらしい。

しかしやってみましたが、I2Cスキャナにもスケッチにも反応しませんでした。調査中・・・



## 接続
![IMG_20200706_225554018.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e1021a98-ec4f-0d95-fd73-942395ca151e.jpeg)

|No.|Symbol|説明|
|:---:|:---:|:---:||
|1|VSS|GND||
|2|VDD|3.3V||
|3|V0|LCDコントラスト調整。10kΩの半固定抵抗に接続|
|4|SCL|I2C SCL|ESP32 SCLに接続
|5|SDA|I2C SDA|ESP32 SDAに接続|
|6|BL+|バックライトLED+|接続なし|
|7|BL-|バックライトLED-|接続なし|
配列や連想配列から、その要素のunion型を生成する

# 配列からunion型を生成する

```typescript
const sakana = ['アジ', 'サンマ', 'イワシ'] as const
```
ここから
`'アジ' | 'サンマ' | 'イワシ'`を生成する場合、

```typescript
type Sakana = typeof sakana[number]
```

とするようです。

<img width="463" alt="スクリーンショット 2020-07-06 23.08.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/6777225f-eff5-990f-8093-ef662d5ac0d9.png">

添字に数字を入れると、その添字の要素の型となる。
<img width="438" alt="スクリーンショット 2020-07-06 23.21.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/418cea82-1329-3f08-c5a1-5e9aa65929fa.png">


# 連想配列の配列からunion型を生成する

```typescript
const sakana = [
  { name: 'アジ', code: 0 },
  { name: 'サンマ', code: 1 },
  { name: 'イワシ', code: 2 },
] as const
```
ここから
`'アジ' | 'サンマ' | 'イワシ'`を生成する場合、

```typescript
type SakanaName = typeof sakana[number]['name']
```
とするようです。
<img width="438" alt="スクリーンショット 2020-07-06 23.10.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/b1660f94-3448-ea54-004e-e88264e5e8dd.png">

# 連想配列からunion型を生成する。


```typescript
const sakana = {
  アジ: 0,
  サンマ: 1,
  イワシ: 2,
} as const
```
ここから
`'アジ' | 'サンマ' | 'イワシ'`や`0 | 1 | 2`を生成する場合、

```typescript
type SakanaName = keyof typeof sakana//'アジ' | 'サンマ' | 'イワシ'
type SakanaCode = typeof sakana[SakanaName]//0 | 1 | 2
```

とするようです。
<img width="336" alt="スクリーンショット 2020-07-06 23.14.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/8ee305f8-4a38-73dc-19c4-06f3fa21fccc.png">
<img width="359" alt="スクリーンショット 2020-07-06 23.15.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/77b33364-a114-8be3-1a61-03449ef445c2.png">


# まとめ

値からLiteral Typesを生成する場合、as constをつける。
配列の要素の型を取りたい場合、添字箇所に`number`と入れる。
連想配列のvalueのほうの要素の型を取りたい場合、添字箇所に、キーを文字列で入れる。
連想配列のキーのunion型を取りたい場合は、連想配列の型に対してkeyofする。

# オマケ

JetBrainsのIDEで、↓とすれば、カーソルが当たっているところの型が見れるようです。

<img width="262" alt="スクリーンショット 2020-07-06 23.08.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/f7bef9c9-5f19-0874-b113-9b67090b9527.png">

# 参考資料

[TypeScript3\.4 の const assertion \- Qiita](https://qiita.com/Takepepe/items/f39c249ed31e546ecb7c)
[忙しい人のためのIntelliJ IDEAショートカット集（´\-\`） \- Qiita](https://qiita.com/yoppe/items/f7cbeb825c071691d3f2)
Hyper-V手遊び(起動と停止をPowerShellで行う)

#この記事、何?
ホストあまり色々入れたくないので仮想マシン頼み。
Windowを表示しとかなくていいのでHyper-Vがいいな、と。
で、DBをホストしてくれていればいいマシンの起動と停止を楽にしたい・・・
あっ、こういう時のためのPowerShellか?

・・・という話。というか、写経?

#参考資料
■PowerShell を用いてHyper-V仮想サーバーを起動、停止、一時停止させる - Windows Server Tips
https://www.ipentec.com/document/hyper-v-virtual-machine-change-state-by-poweshell

あたしのこのページなくていいような・・・

■実行命令
(起動)
Start-VM -Name "ubu1804"                                                                      
(停止)
Stop-VM -Name "ubu1804"            

あっ、管理者権限が必要ね?                                                             

#感想
やっぱ今どきっていいわ。
こんな感じで、「これって、簡単にやれるよね?」ってこと、探せば出てくる。車輪の再開発をするなと言われていることですし、ね。
[Unity/ARFoundation]Apple Mach-O Linker (ld) Error  clang: error: no such file or directory com.unity.xr.arkit/Runtime/iOS/UnityARkit.aの対処方法

## はじめに
ARFoundationを2.xから4.02へアップデートしたタイミングで、iOSビルド時に次のエラーが発生しました。

```
Apple Mach-O Linker (ld) Error
clang: error: no such file or directory (中略) com.unity.xr.arkit/Runtime/iOS/UnityARkit.a
```

## 対処方法
[ARKit XR Plugin更新履歴](https://docs.unity3d.com/Packages/com.unity.xr.arkit@4.0/changelog/CHANGELOG.html)によると、 `4.0.0-preview.1`で破壊的変更として、 `UnityARkit.a`は`libUnityARKit.a`にリネームされたようです。
古いファイルを参照しているので、一度`プロジェクト>Library`を削除し、再度ビルドすると今度はビルドが通りました。

## 参考文献
https://docs.unity3d.com/Packages/com.unity.xr.arkit@4.0/changelog/CHANGELOG.html
[C#/WPF] プライマリディスプレイ(1番の画面)の全体の大きさ/作業領域の大きさを取得する

もくじ
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

# やりたいこと
アプリの起動時、モニターの大きさに合わせて、ウインドウのサイズを調節したい。
そのために、今のモニターの大きさを取得したい。

# やり方
`SystemParameters`クラスの、`WorkArea.Width`/`WorkArea.Height`もしくは`PrimaryScreenWidth`/`PrimaryScreenHeight`を使う。

|使うもの|中身|
|:--|:--|
| SystemParameters.WorkArea.Width<br>SystemParameters.WorkArea.Height|プライマリモニタの作業領域の幅と高さ|
| SystemParameters.PrimaryScreenWidth<br>SystemParameters.PrimaryScreenHeight|プライマリモニタ全体の幅と高さ|

# 実験①
どんな値が取れるか見てみる。

モニタの並び
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/89a887e0-a15f-03ca-9d1e-4ceb78c23a10.png)

1番モニタ(プライマリモニタ)の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/622f72f8-b07d-770b-7fac-84d4b96c284e.png)

2番モニタの設定（解像度は1番と同じで、125%になっている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/c450b656-534f-464c-903a-207a354e1cb3.png)

コード

```cs
private void Button_Click(object sender, RoutedEventArgs e)
{
    var w = SystemParameters.WorkArea.Width;
    var h = SystemParameters.WorkArea.Height;
    var pw = SystemParameters.PrimaryScreenWidth;
    var ph = SystemParameters.PrimaryScreenHeight;
    AddLog("WorkArea　     幅：" + w + "高さ：" + h);
    AddLog("PrimaryScreen　幅：" + pw + "高さ：" + ph);
}
```

〇結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/5cbb0fe6-df31-e5c9-fb20-8c8d9f097891.png)
→1番ディスプレイは、100%設定なので、モニタの素の解像度の値そのまま。

〇プライマリディスプレイを右側のディスプレイにして実行した結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/89dea01a-3e22-d76c-f03c-b66b36222427.png)
→2番ディスプレイは、125%設定なので、それぞれ、1920/1.25、1080/1.25の値になった。
また、アプリはプライマリに設定したディスプレイの方に表示された。

# 実験②
実験①はタスクバーを「自動的に隠れる」ようにして実施していたので、隠れないようにしてつねに表示されるようにしてから実施してみる。(1番ディスプレイ、100%で実施)

〇結果
タスクバーの分だけ、WorkAreaのほうの縦の値が小さくなった。
PrimaryScreenWidthとHeightは変わらず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/f39e69f1-24c1-e3f4-2448-993f05c48622.png)

※タスクバーを上に広げてやったりすると、その分WorkAreaの値は縮む様子。
下の値は、タスクバーを画面の下半分まで広げたときの数字。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/849d78a6-c15f-28f5-ecd9-427f26c7f000.png)


# 実験③

自分のアプリのウインドウの大きさを、スクリーンのサイズに合わせて調整してみる。
(試しに、プライマリモニタの真ん中に、モニタの作業領域の大きさの3/4の大きさのウインドウを出してみる)

```cs
private void Button_Click_1(object sender, RoutedEventArgs e)
{
    var screen_width = SystemParameters.WorkArea.Width;
    var screen_height = SystemParameters.WorkArea.Height;

    this.Width = screen_width * (3.0 / 4.0);
    this.Height = screen_height * (3.0 / 4.0);

    this.Top = screen_height * ((1.0 / 4.0) / 2.0);
    this.Left = screen_width * ((1.0 / 4.0) / 2.0);
}
```
DockerをHomebrewでインストール

#はじめに
こちらではDocker Desktop for MacをHomebrewでインストールするやり方について説明したいと思います。
コマンドやらはまた今度

#環境
Mac

#手順
brew caskでインストール

```
$ brew cask install docker 
```

ダメだった場合

```
$ brew update-reset && brew update
```

```
$ brew cask
```

をしてからインストール

#まとめ
いかがだったでしょうか
よくある記事のひとつでしたが次回は
今回の構築を参照して使いかたの説明をできればと思います。
利用している開発環境について

# 自宅にて利用している開発環境
##cloud9
利用する際に参考にしたページ 
https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/sample-php.html

##Visual Studio Code
拡張機能から、以下のPythonをインストールしてソースコードを書き実行。
<img width="417" alt="スクリーンショット 2020-07-07 23.21.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652034/cdd7428d-6fbc-dad8-3ee9-b4aecf9a2c54.png">

実行方法については、以下のページを参考
https://code.visualstudio.com/docs/python/python-tutorial#_run-hello-world
【JavaScript】IF文で「指定した変数がいずれかの値と一致したらTRUE」条件を記述

ちょっと面白かったので、メモを兼ねて投稿します。
# コードの実例
以下のような、一つの変数しか使っていないOR条件のIF文をもっと短く書けないかなぁと思いました。

```
if (value === 1 || value === 2 || value === 3
  || value == 4 || value == 5 || value == 6
  || value == 7 || value == 8 || value == 9) {
  // 処理
}
```

以下のように、配列にすると短く書けますね。

```
if ([1, 2, 3, 4, 5, 6, 7, 8, 9].includes(value)) {
  // 処理
}
```

ただしIEではincludes()メソッドはサポートしていないようです。
そこで、代わりにindexOf()メソッドを使う手もあります。

```
if ([1, 2, 3, 4, 5, 6, 7, 8, 9].indexOf(value) !== -1) {
  // 処理
}
```
これならIE11では動くはずです。
どのような書き方にせよ、他の人がぱっと見で理解できるのが一番ですね。
[Java] Mockitoでコンストラクタに引数を渡す/メソッドのデフォルト呼び出しをcallRealMethodにする

Mockitoのちょっとしたメモ

## コンストラクタに引数を渡す

```java

package jp.jig.product.live.server.common.service;

import org.junit.Test;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class ApiServiceTest {

    public static class ApiService {

        private final String endpoint;
        private final int timeout;

        public ApiService(String endpoint, int timeout) {
            this.endpoint = endpoint;
            this.timeout = timeout;
        }

        public String request() {
            if (endpoint == null) {
                throw new IllegalStateException("endpoint is null");
            }

            return endpoint;
        }

        public boolean validTimeout() {
            return timeout > 0;
        }
    }

    @Test
    public void test() {

        ApiService apiService = mock(ApiService.class);
        when(apiService.request()).thenCallRealMethod();
        apiService.request(); // -> throw IllegalStateException
    }

}
```

例えば上記のような `ApiService` のmockを作って、 `request()` メソッドを callRealMethod する場合などで 
コンストラクタで値を設定したいといった場面があると思います。

このとき `mock()` の第2引数に `MockSetting#useConstructor` を使うことでmockオブジェクトを作りつつ、コンストラクタに引数を渡すことができます


```java

    @Test
    public void test() {
        ApiService apiService = mock(ApiService.class, withSettings().useConstructor("http://localhost", 100));
        when(apiService.request()).thenCallRealMethod();
        apiService.request(); // -> http://localhost
    }
```  

コンストラクタにロギングを仕込んでみると、ログも出力されるので、コンストラクタ内の処理も実行されていることがわかります。

## デフォルト呼び出しをcallRealMethodにする

テストの際に基本的には本来のメソッドを呼び出したいが、一部のメソッドだけモックしたい。。。といったことがあると思います。

```java
ApiService apiService = mock(ApiService.class,
 withSettings().defaultAnswer(CALLS_REAL_METHODS));

```

こちらは `MockSetting#defaultAnswer` に `CALLS_REAL_METHODS` を渡すことで、デフォルトでcallRealMethodになります。

ただし注意点が一つあり、callRealMethodになっているメソッドで `when()` を使うときは注意が必要になります


```java
    @Test
    public void test() {
        ApiService apiService = mock(ApiService.class, withSettings().defaultAnswer(CALLS_REAL_METHODS));
        when(apiService.request()).thenReturn("hogehoge"); // -> throw IllegalStateException
    }
```

上記コードは一見普通に動きそうですが、 `when(apiService.request())` の時点でメソッドが呼び出されてしまいます。
これを回避するためには `doReturn` を使うのがいいらしいです。

```java

    @Test
    public void test() {
        ApiService apiService = mock(ApiService.class, withSettings().defaultAnswer(CALLS_REAL_METHODS));
        doReturn("hogehoge").when(apiService).request();

        apiService.request(); // -> hogehoge
    }
```

doReturnを使うことで  callRealMethod を呼び出さずにmockを設定することができます。
iptablesを使ってWebサーバおよびTCP通信をポートフォワーディング

# 概要
Linuxで、あるwebサーバの「ホスト名:ポート番号」を「別のホスト:ポート番号」へ転送（つまりポートフォワーディング）する方法について記載。実現にはCentOSやUbuntu等に標準搭載されている「iptables」を利用。
今回紹介する内容は、おそらくCentOS7以降にデフォルトで入っているfirewalldなどでも実現できるが、極力環境に依存せずにポートフォワーディングする方法を模索した結果、iptablesを使うことにした。
iptablesでのポートフォワーディング方法を紹介する記事はそれなりにあるが、それらの方法を素直に試しても上手くいかず、実現までにかなりハマったので本記事で改めてまとめる。
本例でのご紹介はHTTP(HTTPS)のみだが、SSHでも動作確認済。またTCP通信であれば他のプロトコルでも動くはず。

## サンプルソース（23/07/09追加）

GitHubにシェルスクリプトのサンプルを追加しました。

https://github.com/showchan33/port_forwarding_tcp

# 実現したい構成
* webサーバ(転送先)のIPアドレスは``23.45.67.89``、ポートは``80``
* ポートフォワーディングの設定を行う転送元サーバのIPアドレスは``192.168.1.4``
* クライアントから転送元サーバに``http://192.168.1.4:10080``をリクエストすると、転送元サーバがwebサーバにポートフォワーディングして、``http://23.45.67.89:80``のサイトへリクエスト。
* リクエスト送信後、webサーバが返すレスポンスをクライアントで閲覧可能

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/a3531e20-64b4-8bc5-fe25-676ed6ba467b.png)

# iptablesによる実装
転送元サーバで、以下のコマンドを実行

## (1) PREROUTINGチェイン
* クライアントから入ってくるリクエストで、宛先のIPアドレスとポートを変換
  * ``--dport`` : 変換前の宛先ポート番号
  * ``--to-destination`` : 変換後の「宛先IP : ポート番号」

```text
$ sudo iptables -t nat -A PREROUTING -p tcp \
                --dport 10080 -j DNAT \
                --to-destination 23.45.67.89:80
```

## (2) POSTROUTINGチェイン
* 転送元サーバから外に出ていくパケットに関する記述
  * ``-d`` : 変換後のIPアドレス
  * ``--dport`` : 変換後の宛先ポート番号
  * ``-j MASQUERADE`` : IPマスカレードを行う

```text
$ sudo iptables -t nat -A POSTROUTING -p tcp \
                -d 23.45.67.89 --dport 80 \
                -j MASQUERADE
```

  * IPマスカレードで具体的にやっていることは、送信元のIPアドレスを「クライアント」から「転送元サーバ(192.168.1.4)」に変換する処理。ポート番号は通信の度に任意の値（例:51720、52369等）が付与される。

## (3) FORWARDチェイン
* クライアントから送信したパケットの通過を許可するために必要な記述。
* TCP通信の場合、3way-handshakeと呼ばれる方法で双方向通信が行われるため、両方の通信を許可するための設定が必要
  * 参考サイト : [Linuxで作るファイアウォール［パケットフィルタリング設定編］](https://www.atmarkit.co.jp/ait/articles/0112/18/news002.html)

* 「クライアント → webサーバ」へのパケット通過を許可するコマンドが下記

```text
$ sudo iptables -A FORWARD -p tcp \
                -d 23.45.67.89 --dport 80 \
                -j ACCEPT
```

* 一方で「webサーバ → クライアント」へのパケット通過を許可するコマンドが下記
  * 逆方向の設定なので、webサーバのIPアドレスとポートを記載したオプションが「``-s`` : 送信元アドレス」「``--sport`` : 送信元ポート番号」になっていることに注意
  * ２行目の記述「``! --syn -m state --state ESTABLISHED``」は特定の条件を満たした通信のみ許可するための記述。セキュリティを気にしなければ省略しても問題ないはず。

```text
$ sudo iptables -A FORWARD -p tcp \
                ! --syn -m state --state ESTABLISHED \
                -s 23.45.67.89 --sport 80 \
                -j ACCEPT
```

## (4) OUTPUTチェイン
* 転送元サーバからのリクエストもポートフォワーディングしたい場合に記載
* 書き方はチェイン名をOUTPUTとする以外は(1)のPREROUTINGと同じ

```text
$ sudo iptables -t nat -A OUTPUT -p tcp \
                --dport 10080 -j DNAT \
                --to-destination 23.45.67.89:80
```
仕組みから理解するGit 入門 〜ひとり開発でも便利〜 参加レポート

仕組みから理解するGit 入門 〜ひとり開発でも便利〜の参加レポートです。

## 感想
めっちゃわかりやすかったです！
30分でこんなにGitのことを理解できるのかと普通に感動します。

動画中の図も非常に柔らかい雰囲気でとっつきやすいと思います。

- 今までGitを使ったことがなかった方
- GitクライアントツールでしかGit操作をしたことがなかった方

に非常にお勧めできます！

[仕組みから理解する git 入門 〜ひとり開発でも便利〜](https://mu-zaru.connpass.com/event/181008/)
Youtube Liveへのリンクを上記イベントページから参照できます。


## Gitとは

- バージョン管理をするツール

### バージョン管理とは

- 変更履歴を管理すること

### バージョン管理のメリット

#### 変更履歴があるので元に戻せる
- バージョン1
  - →バージョン2に変更
        - →やっぱりバージョン2に戻す  
といったことが可能

#### 変更履歴があるので振り返れる

いつ誰がどんな変更をしたのかを振り返れる

<b>個人開発であっても「昨日の自分は他人」という観点でバージョン管理をした方がいい</b>  
「この意味不明なコード、誰が書いたんだ？」→「あ、昨日の自分だった・・」

## バージョン管理のやりかた

### 原始的な管理

#### ファイルコピー

- 記事.txt
- 記事_20200701.txt
- 記事_20200702.txt

#### 酷い場合

- 記事_最新.txt
- 記事_最終修正済み.txt

<b>→結局なにが最新なん？</b>

### Gitの管理イメージ

- ファイルの変更履歴データがGitに管理され、蓄積されていく

<b>→何が最新なのか、いつ誰がどのような修正をしたのかわかる</b>

### メジャーなGitコマンド

#### 初期化
```sh
git init
```
カレントディレクトリ以下のフォルダ、ファイルをGit管理の対象にする

#### ファイル追加

```sh
git add ファイル名
```

変更履歴を記録する対象に追加する
ファイル名はワイルドカード指定や.で全ファイルという指定が可能

```sh
git add *.txt
```

#### コミット
```sh
git commit -m 'コミットメッセージ'
```

Repositoryに変更を記録する
※変更内容を文章で記載しておく必要がある
→コミットメッセージ

#### コミットまでの流れ
```sh
git add zaru.txt
```

```sh
git commit -m 'zaru のプロフィールを編集'
```

#### ログ確認

```sh
git status
```
ファイルの状況を確認する
修正してaddされたファイルや修正したけどaddしてないファイルを見分けるために使う


```sh
git log
```

commitで記録した差分を確認する

### ブランチ
うまくいっている状態のコードを残していろいろ試したい

masterブランチ  
  →featureブランチ
<b>masterブランチの状態は残したまま、コピーして新しくブランチを作る</b>

```sh
git switch ブランチ名
```
ブランチを切り替える

```sh
git switch -c 新しいブランチ名
```

新しいブランチを作成して切り替える

```sh
git branch
```

ブランチ一覧を表示する

```sh
git -d branch
```
ブランチを削除する

#### マージ
別のブランチのコミットを持ってきて反映させることをマージ（merge）という


```sh
git merge ブランチ名
```

試した成果をmergeで反映

#### リストア

```sh
git restore . --source 戻したい場所
```
指定した位置まで変更履歴を戻す


```sh
git restore . --source HEAD~2
```

２個前のコミットまで全て戻す

## 終わりに
私はいつもGitクライアントをメインで使っていましたが、内部でどのようなことが起きているのかをしるためにコマンドベースでGit管理してみようかな？
と思えるような勉強会でした。
主催のムーザルちゃんねるさんには感謝しかありません😌
[ムーザルちゃんねる](https://mu-zaru.connpass.com/)
Macのコマンドラインで明日を表現する方法

## macのdate表現で困った

macユーザーになってまだ３ヶ月の私にとっては、bashのdateコマンドすら手強い相手でした。
今回、目的にあった形で日付の表現をするのに、小一時間以上かかってしまい軽く自分にショックを受けてしまいました。

他のmacビギナーにとっても日付の表現で時間を多く無駄にしてしまうことはショッキングなことだと思ったので、ここにナリッジをまとめておきたいと考えました。

## そもそも：macのコマンドラインで日付表現をしたかったわけ

macにはautomatorという非常に便利なツールがあることを最近になって知りました。
これを使えば、macに最初から入っているツールを組み合わせて、自分好みの自動化アプリケーションを簡単に作ることができます。

今回は、毎日の日記を自動で作成するアプリケーションを作るために、bashで日付表現を使う必要がありました。

## date -d '1 days'では明日を表せない？

検索ボックスで、「bash 日付」と打ってでてきたのが、見出しのワンライナーでした。

```bash:bash
date -d '1 days' 
```
これで、明日の日付を取得して自動でファイルの作成ができる！
と思ったら...これがうまく行かないのです。

というのも、この表記はGNUとよばれるパターンの表記方法だったのです。

## GNUって？

GNUはwindowsのコマンドラインでの書き方になります。
ところが、私はmacユーザー。
どうりでこの表現ができないわけですね。

## windowsがGNUならMacは

もちろんmacにも明日の表現方法はあります。
macの表現方法はBSDと呼ばれる表記方法になるそうです。

BSD表記になると、明日を表すコマンドは以下の通り。

```bash:bash
date -v+1d
```
よかった！macでも簡単に表現できました！

こうして、``(バッククォーテ)を組み合わせたところ、
念願の「本日付けのファイルをコピーして明日の日付のファイルを作成する」ことができました！

```bash:bash
cp `date +%Y%m%d`.txt `date -v+1d +%Y%m%d`.txt
```