OmniAICreator/Qiita-1.07M huggingface dataset:
AI、ロボット戦争の到来

# 戦争におけるAIの実用化

現在、某地域では戦争が激化しはじめており、そこではAIをつかった戦争が始まっている。

https://jbpress.ismedia.jp/articles/-/65487

https://www.nikkei.com/article/DGXZQOGR23DA50T20C21A6000000/


おそらく、この地域でロボットやAI兵器が多数実験されるのだと思う。

# 米国などでのAI関連企業の投資と軍需産業

米中ではAIやロボット関連のエンジニアの所得はすごく高く(年収1千万円ぐらい）、そうした企業への投資も多い。

https://www.glassdoor.com/Salaries/us-ai-engineer-salary-SRCH_IL.0,2_IN1_KO3,14.htm

これらの技術は、個々の企業が大きくなること以上に、企業活動の過程で発明された技術がやがて軍需産業へと使われるのかもしれない。

# AI、ロボット戦争が徐々に進行

兵士へのなり手は少なくなる一方で、AIやロボットを利用した戦争がそのうち一般化するのだろうと思う。

https://www.britannica.com/topic/Killer-Robots-The-Future-of-War-2118625

現在も国際的な規制の法的規制は曖昧であるし、おそらく、国際法を無視した国もでてくるだろう（今でも存在する）。

https://jsil.jp/archives/expert/2016-11

ドローン操縦者のPTSDなども実際あるので、もうAIやロボットを絡めた戦争ははじまっており、全面戦争になる日もSFだけの話ではないのかもしれない。

https://www.newsweekjapan.jp/stories/us/2015/06/post-3710.php

こうしたことに対してエンジニアは、どう向き合うのかといえば、やはり人道を考えた政治的な観点ももって、開発に向き合うべきかなと個人的に思います。
電子レンジやインターネットが軍事技術からの転用であるように、軍事と技術は切っても切り離せないものもあります。ただ、手放しで技術の濫用を放置してもいいのだろうかという疑問はあります。

原爆に対するアインシュタインの述懐をみると、たとえ天才でも止められない時流があるのかもしれないですが、それでいいのだろうかという気も。

https://www.businessinsider.jp/post-195875
【Flutter】pubspec.yamlのコメントアウトを翻訳してみる

Flutterプロジェクトを作成すると初期の`pubspec.yaml`に英語の説明文がコメントアウトされています。

https://qiita.com/hiroyukiwk/items/8ac02c7709abfa2fbad9

`main.dart`に続き`pubspec.yaml`もFlutterを理解する上で必要な要素と思い翻訳をしてみました。

# 翻訳したファイル

```pubspec.yaml
name: mycproject
description: A new Flutter project.

# 次の行は、`pub publish`を使って誤ってpub.devにパッケージを公開してしまうことを防ぎます。
# これは、プライベートなパッケージに適しています。
publish_to: "none" # pub.devに公開したい場合は、この行を削除してください。

# 以下は、アプリケーションのバージョンとビルド番号を定義します。
# バージョン番号は、1.2.43のようにドットで区切られた3つの数字に、オプションでビルド番号を＋で区切ったものです。
# flutter buildでは、バージョンとビルダー番号の両方を、
# それぞれ--build-nameと--build-numberを指定することで上書きすることができます。
# Androidでは、build-nameがversionNameに、build-numberがversionCodeになります。
# Androidのバージョニングについては、https://developer.android.com/studio/publish/versioning
# iOSでは、build-nameはCFBundleShortVersionStringとして、build-numberはCFBundleVersionとして使用されます。
# iOSのバージョニングについての詳細は
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  # 以下は、アプリケーションにCupertino Iconsフォントを追加するものです。
  # iOSスタイルのアイコンにはCupertinoIconsクラスを使用します。
  cupertino_icons: ^1.0.2

dev_dependencies:
  flutter_test:
    sdk: flutter

# このファイルのDartの汎用部分については、
# 次のページを参照してください： https://dart.dev/tools/pub/pubspec

# 以下は、Flutterに特化した内容です。
flutter:
  # 次の行は、アプリケーションにMaterial Iconsフォントが含まれていることを確認し、
  # material Iconsクラスのアイコンを使用できるようにしています。
  uses-material-design: true

  # アプリケーションにアセットを追加するには、次のようにassetsセクションを追加します。
  # assets:
  #   - images/a_dot_burr.jpeg
  #   - images/a_dot_ham.jpeg

  # 画像アセットは、1つまたは複数の解像度固有の「バリアント」を参照することができます。
  # https://flutter.dev/assets-and-images/#resolution-aware.

  # パッケージの依存関係からアセットを追加する方法の詳細については
  # https://flutter.dev/assets-and-images/#from-packages

  # アプリケーションにカスタムフォントを追加するには、この「flutter」の中にフォントセクションを追加します。
  # このリストの各エントリには、フォントファミリー名を示す「family」キーと、
  # フォントのアセットやその他の記述子を示すリストを示す「fonts」キーが必要です。
  # 例えば
  # fonts:
  #   - family: Schyler
  #     fonts:
  #       - asset: fonts/Schyler-Regular.ttf
  #       - asset: fonts/Schyler-Italic.ttf
  #         style: italic
  #   - family: Trajan Pro
  #     fonts:
  #       - asset: fonts/TrajanPro.ttf
  #       - asset: fonts/TrajanPro_Bold.ttf
  #         weight: 700
  #
  # パッケージの依存関係からのフォントに関する詳細は
  # see https://flutter.dev/custom-fonts/#from-packages
```

※　翻訳はDeeplを使用しました。
【React】ReactでSPA実装(初歩:React Routerでページ内遷移)

#はじめに
ReactでSPA(シングルページアプリケーション)を作成する上で初歩となる、React Routerに関する記事になります。

#前提
この記事では環境構築、「create-react-app」でまでの作業が完了していることを前提に進めます。

#1、react-router-domのインストール
まず今回使用するreact-router-domライブラリをインストールします。

```
npm install react-router-dom
```

#2、遷移先用のjsxを用意する
今回はまずcssもなにもない、ただ文字が表示されるだけの関数コンポーネントが記述されたjsx（hello.jsx、seeyou.jsx）を、 src > page(任意のフォルダ) 配下に用意します。
jsファイルでも問題ありません。

```hello.jsx
import React from 'react';

function hello(){
    return (
        <div>
            hello
        </div>
    )    
}

export default hello;
```

```seeyou.jsx
import React from 'react';

function seeyou(){
    return (
        <div>
            seeyou
        </div>
    )    
}

export default hello;
```

#3、App.jsの編集
実際の表示ページであるApp.jsでは、「BrowserRouter」、「Route」、「Link」をインポートします。
BrowserRouterを親要素として、その中にRoute、Linkを記述します。
Routeタグの中ではpathでURLを指定していて、「exact」はpathに指定したURLが完全一致した時のみ表示できるようになります。
componentでは、そのパスに対して表示するコンポーネントを指定しています。


```App.js
import React from 'react';
import {
  BrowserRouter,
  Route,
  Link
} from "react-router-dom";
import hello from './page/hello';
import seeyou from './page/seeyou';

function App() {
 return (
   <BrowserRouter>
     <ul>
       <li><Link to="/hello">こんにちは</Link></li>
       <li><Link to="/seeyou">さよなら</Link></li>
       <li><Link to="/">リセット</Link></li>
     </ul>
     <Route path="/hello" exact component={hello} />
     <Route path="/seeyou" exact component={seeyou} />
   </BrowserRouter>
 );
}

```

#4、npm startで表示確認
npm startでlocalhost:3000を開くと以下のように表示されます。
![スクリーンショット 2021-06-07 2.19.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578982/f464e2b0-8ff5-52ef-4957-a759629d5697.png)

まずは「こんにちは」をクリックします。
URLがlocalhost:3000/helloに変わり、「hello」が表示されます。
![スクリーンショット 2021-06-07 2.24.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578982/ec852590-65a1-f979-dd4b-4e2e8a05568c.png)

次にリセットをクリックします。
URLが戻り、helloが消えます。
![スクリーンショット 2021-06-07 2.24.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578982/d861faad-9d24-a738-5094-5d7aeee39267.png)

「さよなら」をクリックします。
URLがlocalhost:3000/seeyouに変わり、「seeyou」が表示されます。
![スクリーンショット 2021-06-07 2.24.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578982/7562677c-4ba7-219e-a620-c2c0a8f4e13d.png)

このように非同期処理で表示を切り替えることができます。
【Php】Sessionの学習ノート(1)

# 初めに
Sessionについて学習した内容のoutput用記事です。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。
※こちらの記事はあくまでも個人で学習した内容のoutputとしての記事になります。

# Sessionとは
クライアントとサーバー間の通信において、クライアントがサーバーに接続してサーバーから離れるまでのことを指す。

# session_start() 
phpにおいてsessionを管理するため、新たにsessionをスタートする、または既存のsessionを続けるメソッド。sessionを開始すると管理するためのIDが発行される。それと同時にスーパグローバル変数$_SESSIONが生成され全てのsessionデータが連想配列という形で保存される。

```php
<?php
session_start();
?>
```

# $_SESSION
session_start()メソッドで生成されるスーパーグロバル変数。sessionの情報が連想配列という形で保存される。

```php
$_SESSION['bgcolor'] = 'yellow';
$_SESSION['animal']   = 'dog';
$_SESSION['time']     = time();


echo $_SESSION['bgcolor'];
echo '<br>';
echo $_SESSION['animal'];
echo '<br>';
echo $_SESSION['time'];
```
 $_SESSIONに保存されているデータは以下の通り。
![スクリーンショット 2021-06-07 7.25.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/cfc9b09d-e564-5eb1-e27e-1be3b0005051.png)

# isset()
変数がセットされているか否かをチェックする関数。セットされているとtrue、されていないかnullである場合はfalseを返す。

```php
var_dump(isset($_SESSION['bgcolor']));
//bool(true)
```

#unset()
指定した変数のセットを解除する関数。

```php
unset($_SESSION['bgcolor']);
echo $_SESSION['bgcolor'];
```
bgcolorがunsetされ、定義されていないと表示される。
![スクリーンショット 2021-06-07 7.38.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/a60b2989-0232-ddcd-0c7c-497321509d42.png)

# 参考サイト
https://www.php.net/manual/ja/session.examples.basic.php
https://www.php.net/manual/ja/reserved.variables.session.php
https://www.php.net/manual/ja/function.isset.php
https://www.php.net/manual/ja/function.unset.php
https://e-words.jp/w/%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3.html
https://www.ntt.com/bizon/glossary/j-s/session.html
Max React Sec9 メモ

###99

・stateは一つのelementに従属するので,rootelementが必要になる。

・配列でreturnすることもできるが、keyが要求される

・解決する方法はchildrenを返すだけのカスタムコンポーネントを作る

```
const Wrapper = props => {
  return props.children;
};

export default Wrapper;
```

・またはReact.Fragmentを使う（同じ）
<React.Fragment></React.Fragment>で囲む

###103
・css的にはmodalのelementは全体のaboveであるべきだが上のやり方ではできない。


・なんとindex.htmlにroot divを追加する

```
<div id="backdrop-root"></div>
<div id="overlay-root"></div>
<div id="root"></div>
```

・さらにreactDom使ってしていしてreturnする
デフォルトだとid root内にrenderされるのを指定して強制してる感じかな

```
import ReactDOM from 'react-dom';

const Backdrop = props => {
  return <div className={classes.backdrop} onClick={props.onConfirm} />;
};

const ModalOverlay = props => {
  return (
    <Card className={classes.modal}>
      <header className={classes.header}>
        <h2>{props.title}</h2>
      </header>
      <div className={classes.content}>
        <p>{props.message}</p>
      </div>
      <footer className={classes.actions}>
        <Button onClick={props.onConfirm}>Okay</Button>
      </footer>
    </Card>
  );
};

const ErrorModal = (props) => {
  return (
    <React.Fragment>
      {ReactDOM.createPortal(
        <Backdrop onConfirm={props.onConfirm} />, 
        document.getElementById('backdrop-root')
      )}
    </React.Fragment>
  );
}

export default ErrorModal;
```
OS初学者の学習記録 〜3. プロセス(その2)〜

# プロセス間通信
OSには複数プロセス間で、動作の指示や動作完了の通知などの連携が必要になる。

### シグナルによる通信
プロセス間で非同期イベントの発生を伝えるための方法。

プログラマは、「シグナルハンドラ」という処理ルーチンをプロセスに設定できる。
→シグナルハンドラが設定されていないプロセスに関しては、シグナルのデフォルトの処理が行われる。

シグナルハンドラは、実行中の処理に割り込んで仕事をするので、実行中の処理に副作用が起こる可能性があることに注意する。


### 共有メモリによる通信
**共有メモリ**と呼ばれる、どのプロセスからもアクセス可能なメモリ領域のデータを、プロセスの仮想アドレス空間に読み出す(またはその逆)ことで、プロセス間での通信を実現している

メリット

* データの転送は、物理的には1つの領域への書き込み&読み出しで行われるため、メモリの無駄がない。
* プロセス固有のメモリにアクセスする必要がないので、大量のデータであっても高速にやり取りできる。

デメリット

* 共有をおこなう各プロセスは、同じ計算機上で動作しないといけない。(プロセスのメモリ空間と共有メモリの間のmappingがおこなれるから)


### パイプによる通信
UNIX系のOSに実装されている通信方法で、「複数のプログラムの入出力をつなぐ」仕組み。(linuxで「|」でつなぐやつですね、これは僕でも知ってました笑)

パイプの入出力を、それぞれ役割分担して複数のプロセスが持つことで「FIFO(first in first out)」のストリームを共有し、協調的な動作を行う。(「書き込んだ順番で読み出す」ようにしている！)


### ソケットによる通信
複数プロセス間での通信をおこなう仕組み。遠隔マシン上のプロセス間通信の標準的方法となっている。
どのソケットを利用するかは、アプリケーションの要件に合わせて決定。

* TCP / IP プロトコル

FIFOの動作が保証される。

* UDP プロトコル

FIFOが保証されない。また、データの到達確認等を行わないので、高速にデータをやりとりできるが、欠落する可能性もある。



# 競合状態と相互排他

複数のプロセスが資源を共有して処理をすすめるとき、その共有資源が不整合を起こさないように制御する機能がOSには必要になる。


### 競合状態

2つまたはそれ以上のプロセスが、共有データを読み書きしているとき、最終結果がプロセスの切り替えや順序に依存してしまう状態。


### 相互排他

共有資源を「1つのプロセスが独占」して利用する権利をもたせるための機能。


### きわどい領域

共有資源にアクセスし、競合を起こす可能性があるプログラムの部分を「きわどい領域」という。
→きわどい領域に入って処理ができるのは1つのプロセスのみ、という実装をすれば相互排他を実現できる。


### ビジーウェイト

共通の「ロック変数」を準備する。
きわどい領域に入る前に、ロック変数をロック状態にしてから処理に入る。(他のプロセスは、逐次ロック変数を参照して、解除されていないかを確認し続ける。これが「ビジー」の由来？)
きわどい領域を出たら、ロック状態を解除する。

### セマフォ

あるプロセスがきわどい領域に入るときに、他のプロセスが存在する場合
→他のプロセスを動かすには、当該プロセスを待ち状態にすればよい。

セマフォには、downとupの2種類のメソッドがある。

#####  down

セマフォの値が0より大きいかを調べる。
0より大きいとき、値を1減らして次の処理を継続する。
0ならば、値を減らす前にプロセスを待ち状態にして、スリープさせる。

#####  up

セマフォの値を1増加させる。
このとき、1つ以上のプロセスがスリープしていれば乱数などでどれか1つ選んで、スリープを解除する。(ウェイクアップ)
すなわち、down操作が継続される。


### モニタ

特別に定義された関数、変数データ構造の集合。
モニタとして定義された関数は、「1つのプロセスしか」実行することができない。

プログラマは、きわどい領域にあたる関数をモニタとして定義して実装する。
→プログラマがロックとアンロックを明示的に記述しなければならないときに比べると、楽だしミスが生じにくい。


# 複数プロセスの問題


### プロデューサ・コンシューマー問題

「プロデューサー(生産者)」と「コンシューマー(消費者)」の2プロセスにおいての問題。

* それぞれ固定長のバッファを固定メモリとして持つ
* プロデューサーはデータを生成し、バッファに追加する
* コンシューマーは、バッファからデータを取り出し、バッファ城のデータを1つずつ順に消去していく

↓

* プロデューサーは、バッファが全て使われた状態の時、データの生成を中止する(スリープ)
* コンシューマーは、バッファが空のとき、データの取り出しを中止する(スリープ)
* プロデューサーがデータを追加したとき、コンシューマーがスリープしているなら、ウェイクアップさせる。


この問題を解決する方法は、「カウンティングセマフォ」を利用する方法。(準備中)




### リーダ・ライタ問題

複数プロセスの並列性に関する例。

「メモリからデータを読み出すプロセス(リーダ)」と「メモリにデータを書き込むプロセス(ライタ)」が混在しているとき、

* 複数のリーダが、同時にデータを読み出すことはできる
* あるライタがデータを書き込んでいる最中は、更新途中のデータが消えないようにリーダは読み出しができないようにする

↓
ライタは、データの書き込みに際して、ロックとアンロックをする必要がある。
リーダは最初のリーダのみが読み出し時にロックされる。
2つ目以降のリーダは、最初のリーダがすでにロックされているのでロックしない、という実装ができる
terminalでGitの認証情報を更新する

MacのTerminalでGitを使っている場合、usename, passwordは一度入力すると以後聞かれなくなると思いますが、その後ユーザやパスワードを変更したくなった時にどうするかを記します。

1. キーチェーンを開く
2. gitなどで検索し、該当の認証情報を削除する

コマンドラインのgitのクレデンシャル情報は下記の画像の通り、「アクセス制御」タブの「これらのアプリケーションによるアクセスを常に許可」に `git-credential-osxkeychain` が入っているかと思います。

![スクリーンショット 2021-06-07 7.15.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194978/0ca1b352-0dde-d5b7-f9a2-7288595db7a1.png)

この認証情報を消した後再度pushなどをすると、username, passwordが聞かれます。

以上、認証情報の削除は自己責任で行ってください。
STM32L010のGPIOの速さを測る


x Mbedのリビジョン143

目的
GPIOのテスト
WS2812Bを光らせる。

myledの速さは、1.827Mhz
ODRの速さは、7,995Mhz

結果
ODRの方が速い


```c++

#include "mbed.h"

//myled         1.827Mhz 010
//GPIOA->ODR    7,995Mhz 010

DigitalOut myled(PA_4);

int main() {
    
    while(1) {
        myled = 1;
        //wait(0.2);
        myled = 0;
        //wait(0.2);
    }//while
  
//    //                        1234567890123456
//    int on1  = GPIOA->ODR | 0b0000000000010000;
//    int off1 = GPIOA->ODR & 0b1111111111101111;
//    
//    while(1) {
//        GPIOA->ODR = on1;
//        //wait(0.2);
//        GPIOA->ODR = off1;
//        //wait(0.2);
//    }//while
    
}//main



```


```c++


#include "mbed.h"

//myled         1.827Mhz 010
//GPIOA->ODR    7,995Mhz 010

DigitalOut myled(PA_4);

int main() {
    
//    while(1) {
//        myled = 1;
//        //wait(0.2);
//        myled = 0;
//        //wait(0.2);
//    }//while
  
    //                        1234567890123456
    int on1  = GPIOA->ODR | 0b0000000000010000;
    int off1 = GPIOA->ODR & 0b1111111111101111;
    
    while(1) {
        GPIOA->ODR = on1;
        //wait(0.2);
        GPIOA->ODR = off1;
        //wait(0.2);
    }//while
    
}//main



```
Windows10でのPyMC3インストールについて：きちんとオリジナルの手順を確認しましょう

PyMC3のインストールでドツボったので、メモしておきます。
要は[公式のGitHub](https://github.com/pymc-devs/pymc3)をきちんと読みましょうということです。

## 環境
- windows10 64bit
- anaconda3 2021/5版
- PyMC3 3.11.2


## はまったやり方
conda インストールの方法をググって、以下のサイトを見つけました。
[conda-forge / packages / pymc3](https://anaconda.org/conda-forge/pymc3)
ここにある通り、`conda install -c conda-forge pymc3`を実行してインストールすると、visual studio 2017が所定のパスにないと怒られてしまいました。

仕方なく、**過去の**インストール成功事例の記事を参考にやってみましたが、PyMC3のバージョン3.6など古いバージョンしか入れられなかったり、arvizのバージョン違いが怒られたりしました。


## 正しいやり方
PyMC3のGitHubから、以下のwindowsインストール手順が書いてあるサイトがありました。
[PyMC3 Installation on Windows](https://github.com/pymc-devs/pymc3/wiki/Installation-Guide-(Windows))

まず、以下のコマンドを実行して、mypm3envという仮想環境に必要なライブラリをインストールします。

```
# starting out with a fresh environment
conda create -c msys2 -c conda-forge -n mypm3env python=3.8 mkl-service libpython m2w64-toolchain scipy matplotlib pandas
conda activate mypm3env
```

このあとで、PyMC3をインストールします。

```
pip install pymc3
```

こうやってPyMC3をインストールした後で、[チュートリアル](https://docs.pymc.io/notebooks/getting_started.html)を動かすと、きちんと動きました！


安易に記事を探すより、オリジナルの手順に沿ってやりましょうという話でした。
ArchLinux PostgreSqlを入れてみた

## 概要
ArchLinuxでのPostgreSqlの構築について紹介します。
PostgreSqlは、Arch Linuxの公式パッケージリポジトリで入手でるため、非常に簡単にインストールできます。


### PostgreSqlbのインストール
まず、pacmanパッケージマネージャーのパッケージデータベースを更新します。

```bash
sudo pacman -Sy
```
<br>

次のコマンドを実行し、ArchLinuxにPostgreSQLインストールします。

```bash
sudo pacman -S postgresql
```
<br>

バージョンの確認

```bash
postgres --version
```

実行ステータスの確認

```bash
sudo systemctl status postgresql
```
<br>

PostgreSQLを起動するためにはPostgreSQLのデータディレクトリを初期化させる必要があります。
また、PostgreSQLのデータディレクトリを初期化する前に、次のコマンドを使用してpostgresユーザーとしてログインする必要があります。
※PostgreSQLを使用または管理するには、常にpostgresユーザーとしてログインする必要があります。
そうではない場合、権限エラーが発生し、機能しない可能性があります。

```bash
sudo su - postgres
```
<br>

次のコマンドでPostgreSQLのデータディレクトリを初期化し、データディレクトリが生成されます。
※ Arch Linux上のPostgreSQLのデフォルトのデータディレクトリは/ var / lib / postgres / dataです。

```bash
initdb --locale en_US.UTF-8 -D /var/lib/postgres/data
```
<br>

postgresユーザーからログアウトします。

```bash
exit
```
<br>

PostgreSQLのデータディレクトリが生成されたので、次のコマンドでPostgreSQLを起動できます。

```bash
sudo systemctl START postgresql
```
<br>

次のコマンドでPostgreSQLが再度実行されているかどうかを確認できます。

```bash
sudo systemctl STATUS postgresql
```
<br>

システムの起動時にPostgreSQLを追加して、システムの起動時に自動的に起動するようにするには次のコマンドを実行し、PostgreSQLをシステムの起動に追加します。

```bash
sudo systemctl enable postgresql
```
<br>
以上でArchにPostgreSqlを簡単にインストールし、また、システム起動にPostgreSqlを自動的に起動させることができます。
guard文による分岐処理

## guard文とは
guard文とは条件が不成立の場合に処理を抜けるための条件分岐文。
条件が不成立の場合は、else節内の処理が実行されguard文を含むスコープから抜けないとコンパイルエラーとなる。

```swift
let str = "abc"

func exampleFunction() {
    guard str == "abc" else {
        return  // スコープを抜ける
    }
    
    print(str)
}

```

## guard-let文
guard文もif-let文と同様、guard-let文を利用してオプショナル変数のアンラップが行える。
guard文は条件式が成立しなかった場合にはスコープから抜けるため、guard-let文で宣言された変数や定数はguard-let文以降でも利用可能。

```swift
let int: Int? = 123

func exampleFunction() {
    guard let a = int else {
        return
    }
    
    // guard-let文で宣言した定数aを{}の外からも利用できる
    print(a)  // 123
}
```

## if文との使い分け
条件を満たさない場合に処理を早期退出したいときは、if文に比べてguard文の方がシンプルに実装できるため適していると言える。
また、guard文は条件を満たさない場合に必ずスコープを抜けなくてはならないので、想定外の状況においても処理を抜ける実装の漏れを防ぐことができる。
Fakerを利用してダミーデーター作成


<h1>使う意味</h1>
掲示板などを作成して投稿されたらどのようになるのか、確かめたい時に一個一個手作業で書くよりダミーデーターを作成して確認するため。

<h1>Gemのインストール</h1>
`Gemfile`

```
gem 'faker'
```
そして`bundle install`


<h1>seedファイル編集</h1>



`db/seeds.rb`

```
20.times do 　　　　
    User.create!(
        first_name: Faker::Name.first_name,　
        last_name: Faker::Name.last_name,
        email: Faker::Internet.email,
        password: '123qwe',
        password_confirmation: '123qwe'
    )
end
```
と私の場合このように記載する
`20.times do`で20個作成する

`first_name: Faker::Name.first_name`はfirst_nameにFakerのNameの中のfirst_nameメゾットを使うという意味

なのでpasswordに関してはfakerのメゾットは使わず20個全部のpasswordを123qweにしている。

createだとtrue/falseしか返しません。これだとuserの作成に失敗した場合に、エラーが返ってきません。なので、create! を使います。

`,`はお忘れずに


<h1>最後に</h1>
ターミナルで

```
rails db:seed
```
Laravel post送信を解説


<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/5678e0fd-a57f-e406-b5b4-1d012d130746.png">


<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/a9bca9c0-8aa2-0f13-acfc-d37b4a2c491a.png">


# ルーティング

```PHP
<?php
Route::get('/request_form', 'SampleController@requestForm');

Route::post('/request_sample', 'SampleController@requestSample');
```

# コントローラー

```PHP
<?php
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
 
class SampleController extends Controller
{
    public function requestForm(){
      return view('samples.request_form', [
        'title' => 'フォームサンプル',
      ]);
    }
    public function requestSample(Request $request){
      
      $user_name = $request->input('user_name');
      $comment = $request->input('comment');
      
      return view('samples.request_sample', [
        'title' => 'リクエストの受け取り',
        'user_name' => $user_name,
        'comment' => $comment,
      ]);
    }
}

```

# 送信フォームのビュー

```PHP
<?php
@extends('layouts.default')
 
@section('title', $title)
 
@section('content')
<h1>{{ $title }}</h1>
<form method="post" action="{{ url('/request_sample') }}">
  {{-- 偽のフォームでないことを証明するためのcsrfトークンを埋め込み --}}
  @csrf
  <div>
    <label>
      名前:
      <input type="text" name="user_name">
    </label>
  </div>
  <div>
    <label>
      コメント:
      <input type="text" name="comment">
    </label>
  </div>
  <input type="submit" value="送信">
</form>
@endsection
```

# 送信先のビュー

```PHP
<?php
@extends('layouts.default')
 
@section('title', $title)
 
@section('content')

<h1>{{ $title }}</h1>
<p>名前: {{ $user_name }}</p>
<p>コメント: {{ $comment }}

@endsection

```

# 共通レイアウトファイル

```PHP
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>@yield('title')</title>
    <style>
        .header_nav {
            display: flex;
            list-style: none;
            padding-left: 0;
        }
        .header_nav li {
            margin-right: 30px;
        }
    </style>
</head>
<body>
    @yield('header')
    @yield('content')
</body>
</html>
```
JavaScriptでGIF画像生成メモ #twilio_online_contest_2021 


[Twilio WebRTCハンズオン（ホワイトボード編）](https://qiita.com/mobilebiz/items/c5f8d9e035871982b325)お絵描きしたものをGIF画像にしてみたいなぁと思って試しました。

> ![](https://i.gyazo.com/4751f54012dca53587eeaf49ac91046f.gif)


## JSGIFの利用

jsgifというライブラリを使ってGIF画像生成をしてみました。

> [JavaScriptでjsgifを使ってアニメーションGIFを動的生成する](https://blog.ver001.com/javascript-animation-gif/)

[こちら](https://github.com/antimatter15/jsgif)からDLしたフォルダを解凍して

* b64.js
* LZWEncoder.js
* NeuQuant.js
* GIFEncoder.js

を利用します。

## コード全文

今回、GIT画像化したいpngファイルを7枚用意しました。

コードはほぼ参考サイトのままですが、微修正しています。

> [JavaScriptでjsgifを使ってアニメーションGIFを動的生成する](https://blog.ver001.com/javascript-animation-gif/)


```index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>GIF生成</title>
</head>
<body>

    <div id="anime">
        <img src="images/gif/1.png" width="80" />
        <img src="images/gif/2.png" width="80" />
        <img src="images/gif/3.png" width="80" />
        <img src="images/gif/4.png" width="80" />
        <img src="images/gif/5.png" width="80" />
        <img src="images/gif/6.png" width="80" />
        <img src="images/gif/7.png" width="80" />
    </div>
    
    <div>
        <p><button id="create">アニメGIFを作成する</button></p>
        <canvas id="canvas" style="display:none;"></canvas>
        <img id="anime_gif">
    </div>

    <script src="jsgif/b64.js"></script>
    <script src="jsgif/LZWEncoder.js"></script>
    <script src="jsgif/NeuQuant.js"></script>
    <script src="jsgif/GIFEncoder.js"></script>
    
    <script src="script.js"></script>
</body>
</html>
```

```script.js
let encoder;

document.querySelector('#create').onclick = (event) => {
    //canvasの取得
    const canvas = document.querySelector('#canvas');
    const ctx = canvas.getContext('2d');
    //GIFEncoderの初期処理
    encoder = new GIFEncoder();
    encoder.setRepeat(0); //繰り返し回数 0=無限ループ
    encoder.setDelay(500); //1コマあたりの待機秒数（ミリ秒）
    encoder.start();
    //画像ファイル一覧を取得
    frames = document.querySelectorAll('#anime img');
    //canvasのサイズを1枚目のコマに合わせる
    canvas.width = frames[0].naturalWidth;
    canvas.height = frames[0].naturalHeight;
    //全ての画像をcanvasへ描画
    for (let frame_no = 0; frame_no < frames.length; frame_no++) {
        ctx.drawImage(frames[frame_no], 0, 0);
        encoder.addFrame(ctx); //コマ追加
    }
    //アニメGIFの生成
    encoder.finish();
    document.querySelector('#anime_gif').src = 'data:image/gif;base64,' + encode64(encoder.stream().getData());
}
```

## よもやま

お絵描きしたCanvasから直接生成できるように出来るといいですよね。

取り急ぎ、`#twilio_online_contest_2021`のハッカソンで触ってみたので忘れないうちにメモしておきました。
前半は無音、後半は音ありのアラームを作成する方法

# 前半は無音、後半は音ありのアラームを作成する方法
スマホのアラームを常用していて、自分だけ気づくためにはバイブレーションのみが望ましいが、音がならないとスマホを違う場所に置いていた場合に困るので、前半は無音、後半は音ありのアラームを作成する。たいていのスマホは、任意の音楽をアラームに設定できるのでその機能を利用する。

## 手法
まずはアラーム用の音源を準備。今回は以下のフリー素材を使うことにする。
https://otologic.jp/free/se/clock01.html

FFmpegを用いてこの音源をループさせる。必要ならば、concatを繰り返す。
参考:　https://trac.ffmpeg.org/wiki/Concatenate

```bash:bash
cp "Clock-Alarm03-02(High-Loop).mp3" temp.mp3
ffmpeg -i "concat:temp.mp3|temp.mp3" -c copy temp_loop.mp3
```

前半部分に無音区間を挿入する。adelayで無音区間の長さを設定。ここでは30 secとした。
参考:　https://ffmpeg.org/ffmpeg-filters.html#adelay

```bash:bash
ffmpeg -i temp_loop.mp3 -af "adelay=delays=30s:all=1" Delay_Alarm.mp3
```

これをスマホで読み込んでアラーム音に設定する。
機械学習のプロダクト開発におけるエラー解析によるモデル改善プロセス

雑多に、どこかで書き直します。
習慣化のため、とりあえずメモレベルで投稿

[機械学習プロジェクトを始めるためのヒント]
機械学習は、モデル、データ、ハイパーパラメーターを選定し、学習を行い、エラー分析を行いそれをもとに更なる改善を行う反復プロセスである。
これを何度か繰り返したのちに、十分に良いモデルが出来上がってから、本番に移す前に最終的な性能評価を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658983/935013c8-3b7c-48eb-85bb-b2b727eaf489.png)

 
・最初のモデル選定は何から始めるか
・何が可能かを知る為に文献検索から始める。
オンラインコース、ブログ、オープンソースなどを参考にする。
・可能であれば、オープンソースで実装できる妥当なモデルを見つける
　半日から数日かけてブログ記事を読み、すぐに着手できるようなものを探す。

最初のステップに着手できれば、より多くの回数を繰り返して効率的に作業を進めることが可能である。良質なデータであればオープンソースのアルゴリズムでもそれなりの結果が出る。

・環境の制約はあまり気にしない（もしプロジェクト成功の見通し、自信があるならそうしてもよい）、それよりもベースライン確立が先。

・学習アルゴリズムを初めて試す時は、すべてのデータで実行する前に、コードとアルゴリズムの健全性を簡単にチェックすることが効率的。小さなデータセットで過学習させ、出力までを試してみる。わずか数分、数秒でコードの健全性をチェックできる。
[モデルの平均誤差だけで性能判断をしてはいけない理由]

	テストセットの平均誤差が小さくても、特に重要なデータセットについてのパフォーマンスが十分でなければ本番環境で役に立たないものになる
ex) ウェブ検索の例
ウェブ検索には「おいしい料理店」や「新しい快適グッズ」などの検索クエリがありますが、この種の検索キーワードでヒットした検索結果に対して、最高の結果を提供してくれないウェブ検索エンジンでも「まあこんなもんだろう」と許すことができるが、「Youtube」や「○○株式会社」などのように、そのサイトに明確に到達したい意図があるクエリに対して異なる結果を返したときの、ウェブ検索エンジンへの信頼性は下がる。全体のテストセットへの精度は良いが、一部の主要なデータセットへの当てはまりが悪く使えない例。

Eコマースサイトを運営しているとして、レコメンドシステムを作ったとしよう。様々なメーカーやブランドの小売店の商品を紹介し、レコメンドする上で特定の性別、地域、小売店、民族に偏ったレコメンドになると悪い結果になる

まず、ベースラインを定めること
非構造化データなのか構造化データなのかによって適切な方法は変わる。
非構造化データ（音声、画像、言語）は人間のパフォーマンスと比較するといい。
[いつ？]
・機械学習プロジェクトに着手し、最初のフェーズで検討

[どのように？]
・人間レベルのパフォーマンス（HLP）と比較してみること
・最先端の文献やオープンソースの結果を参照し、その成果を参考値とする
・旧来のシステムが導入されている場合は、そのパフォーマンスと比較すること
[何のメリット]
・何に取り組むべきかを優先順位付けを効率的に行うことができる。
・エンジニアとビジネスサイドのメンバー間での期待値調整、認識統
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658983/3b7365a9-f3bb-c9d9-6417-e988f12cb27f.png)

 
上の例は、音声認識システムにおいてのベースライン設定例。当初、Accuracyだけを比較するとLow Bandwidthを改善したくなるが、HLPと比較した結果、Car Noiseに取り組んだ方が有益な可能性があるということを示した例。

Type別のデータ全体に占める割合という観点も付け加えることが重要。
改善において、定量的な分析に加え、定性的な考察を加えることも必要。

・カテゴリーの出現頻度は？
・カテゴリーの精度を向上させるのがどれだけ簡単か？
・その精度を改善することでの精度改善以外のインパクトはないか？
　→ユーザーの欲求をより満たすものになるのでは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658983/bed1383f-41ad-42fa-b63c-27f82b378929.png)



[誤差分析]
エラー分析を行うことで学習アルゴリズムをにパフォーマンス改善を効率的に行うことが可能。
解析方法
誤分類や誤差の大きいラベルのデータセットをピックアップし、データの特徴や種類に偏りがないか仮説を立て、観察してみること。スプレッドシートのようなものでチェックをすると分かりやすい。観察しながら、他に仮説が思いついた際には、列を追加し、再度チェックをする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658983/a3d9050d-8483-c66a-2c1d-68ac10ee9361.png)


目的は傾向を観察し、それをデータとして入手すること。
パフォーマンス向上に役立つデータのカテゴリーについて、アイデア着想のヒントとなる。

見るべき観点
・ある特定のクラスに偏って分類されていないか
・画像データのプロパティ（明度、反射など）
・メタデータ（モデル、生産工場など）
解析方法
・誤分類データを観察し、データの特徴の性質、背景の確認を行いタグ付けを行う
・タグ付けされたデータの中で、何割が誤って分類されたか
→この種のタグが付いたデータに対する現在の性能を把握する
・タグ付けされたデータがデータ全体の何割を占めるか
→タグ付けされたデータがデータセット全体の中でどれだけ重要かがわかる
・そのタグ付けされたデータの改善余地はあるのか？
→人間レベルのパフォーマンスの測定結果と比較する
どの問題に優先的に着手をするか。
一般的にデータを収集するのには時間とコストがかかる。
どのような種類のデータを収集すべきかが明確になる。
ユーザー認証

## 概要
Spring bootを例にユーザー認証時のパスワードの暗号化(ハッシュ化)についての扱いを紹介します。


### 依存関係
pom.xmlに下記の依存関係を追加します。

```pom.xml
<dependency>
         <groupId>org.springframework.security</groupId>
         <artifactId>spring-security-crypto</artifactId></dependency>
<dependency>
```

### ハッシュ化アルゴリズム
PasswordEncoderインターフェースの実装クラスが6つあります。

|PasswordEncoderの実装クラス|概要|
|:--|:--|
|AbstractPasswordEncoder|-|
|NoOpPasswordEncoder|ハッシュ化を行わないエンコーダ(テストなどで使用)|
|Pbkdf2PasswordEncoder|設定可能な反復回数とランダムな8バイトランダムソルト値を使用してPBKDF2を使用するPasswordEncoderの実装|
|StandardPasswordEncoder|SHA-256アルゴリズム + 1024回のストレッチでハッシュ化を行うエンコーダ|
|BCryptPasswordEncoder|bcryptアルゴリズムでハッシュ化を行うエンコーダ|
|SCryptPasswordEncoder|scryptアルゴリズムでハッシュ化を行うエンコーダ|

###bcryptとは
認証で使用するパスワードを安全にハッシュ化するアルゴリズムです。
bcryptは60文字のハッシュ値を生成します。
また、このハッシュ値の中には下記4つの情報が含まれています。

- bcryptのバージョン
- ストレッチング回数（ハッシュ化の回数で、2のn乗のnのことで4~31を指定できる）
- ソルト値
- ハッシュ値

下記ハッシュ値を例に表にすると以下の表のようになります。
\$2a$10$E5J7SFVBbzynwgKPazA69uNN9lpn6zHq5om6a51FuoTqxo9KsxQHG

|要素|実際の文字列|範囲|
|:--|:--|:--|
バージョン情報|$2|最初の$の後
ストレッチング回数|$10|2番目の$の後
ソルト値|$E5J7SFVBbzynwgKPazA69|3番目の$の後
実際のハッシュ値|uNN9lpn6zHq5om6a51FuoTqxo9KsxQHG|30文字目から最後

### プログラムの実装例
```eApplication.java
package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@SpringBootApplication
public class SpringBootEncodeApplication implements CommandLineRunner {

	@Autowired
	PasswordEncoder passwordEncoder;

	@Bean
	PasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}

	public static void main(String[] args) {
		SpringApplication.run(SpringBootEncodeApplication.class, args);
	}

	@Override
	public void run(String... args) {
		String password = "123";
        // PasswordEncoderのencodeメソッドを用いての平文のパスワードのハッシュ化
		String hashedPassword = passwordEncoder.encode(password);
		System.out.println("hashedPassword : " + hashedPassword);
                
        // PasswordEncoderのmatchesメソッドを用いて平文パスワードとハッシュ化したパスワードの照合
		if (passwordEncoder.matches(password, hashedPassword)) {
			System.out.println("it is match");
		}
		System.out.println("it is not match");
	}
}
```
私の所属チームに感じる、7つの良いところ

# はじめに

私は現在、部会委員会という社内の委員会に所属しています。
部会とは部門状況や部員の近況を共有するイベントで、その部会の運営が主な活動内容です。

**活動が始まってから1年ちょっと経ちますが、このチーム、素敵な良いいいいチームなんです。**

チーム内の雰囲気は和気藹藹としていて居心地が良く、それでいてただの馴れ合いではなく切磋琢磨できています。
とにかくポジティブな空気が満ち溢れていて、まさに理想的なチームだと思っています。

この素敵なチームが素敵たる所以はなんだろうかと、振り返えってみて思いついた「**7つの良いところ**」を紹介します。

# 1. 先輩・上司の方から「心理的安全性」を高めようとしてくれているのが伝わる
「心理的安全性」という言葉、ご存知でしょうか？

ハーバードビジネススクールのエドモンドソン教授が提唱した言葉で、「チームのメンバーがそれぞれ不安を抱えることなく、自分の考えを自由に発言できたり、行動に移したりできる状態」とされています。

チームの先輩方は、チーム発足時から「心理的安全性の高い集団にしよう！」と実際に口に出して明確に示してくれていました。
心理的安全性を高めようとすることは、後輩・部下側からもできるかもしれません。
しかし、やはり年次や立場の上下関係は影響力が大きいと思うので、こうやって先輩・上司の方から言ってもらえると、それだけでも安心感が違います。

当時、怖いお客さんの下で仕事をしていた私は、とても嬉しかったのを覚えています。

# 2. 「無理しないでいいよ」を強調・実践してくれる

「2.」と「3.」はセットです。

部会委員会の活動は、メンバーそれぞれメインのプロジェクト業務の合間を縫って行っています。
そのため、プロジェクトの状況次第では忙しくて委員会活動に参加できないことがあります。

しかしそのことで責められることは一切ありません。
むしろ「プロジェクトお疲れ様！」と励ましてくれます。

私はメンバーの中でもプロジェクト都合で委員会活動ができなくなることが多い方です。
そのことで申し訳ない気持ちになることがありますが、他のメンバーの方が「気にしなくていいよ」、「おれが代わりにやるよ」という言葉を何度もかけてくれるおかげで、負い目を感じることなく活動できています。

# 3. 能動的に「頑張りたくなる」雰囲気がある

自分が忙しいときにたくさん助けてもらいました。
すると逆に他のメンバーが忙しくなったとき、よっしゃ今度はおれが助ける番！！となります。

つまり、きつい時に「無理しないでいいよ」と言い合える関係は、頑張れるときに「頑張りたくなる」気持ちに繋がっていると思います。
上の方で、「2.」と「3.」はセットです。と書いたのはこういう意味です。

また、このチームはみんな向上心が高く、そのことも「頑張りたくなる」気持ちに繋がっています。
アウトプットを積極的に行ったり、イベントで使うツールを自作したりと誰か頑張ると、それを見た他のメンバーは「おれも頑張って何かするぞ！」となります。

まさに切磋琢磨なプラスの影響の及ぼし合いです。

# 4. ルールやフレームに「縛られすぎない」柔軟さがある

委員会活動を行っていくうえで、いろいろなルールがあります。（暗黙的なものも含む）
フレームワークに沿って打ち合わせや振り返りを行うこともあります。

しかし、ルールやフレームはあくまで手段にすぎないことをメンバー全員が意識していて、
何を達成したいためのものか、何を実現したいためのものかということを大切にしています。

いわゆるそのマインド部分がハッキリしていることで、必ずしもルールやフレームに従うだけでなく、柔軟な取捨選択によって、より効率的な方法を見つけられるようになっていると思います。

他チームで、フレームに縛られすぎて自分たち自身が何のためにやってるのか分からなくなっていて、ただなんとなく時間を過ごしてしまうことがありました。
そんな時には委員会で学んだことを活かして改善したいです。

# 5. 挑戦を恐れない「身軽さ」がある

セクションタイトルの通りですが、このチームは本当に身軽です。
何か新しいことを始めることへの躊躇がほとんどありません。

失敗したら止めればいいだけ、元に戻せばいいだけ、という思考が習慣づいています。
挑戦に対して否定的な人が誰もいません。

この思考があれば、既に最適だと思っている状態からでも、さらにより良い状態を発見できる可能性が広がります。

また、たとえそのとき直接的な改善ができなかったとしても、「挑戦の習慣」自体が未来の何かの改善に繋がると思います。

# 6. チームメンバーに対して「嫌そうな顔」をしない

たまに、口では肯定していても、何となく嫌そうな顔、不満気な顔をする人がいます。

嫌そうな顔をするくらいなら、むしろ否定してくれた方が議論もできますし、もしかしたら認識齟齬が発覚するかもしれません。
なにより、そんな顔をされたら雰囲気が悪くなり、次に意見を言いたいときに躊躇してしまいます。

逆に、嫌そうな顔をした側からすると、既に言いたいことを言えない状態になってしまっているのかもしれません。

どちらにせよこのようなことはチームにとって良い状態ではありません。

部会委員会では、誰かが「嫌そうな顔」をするところを見たことがありません。
このことも、信頼関係を築けいている証拠だと思いました。

# 7. メンバーが自チームのことを「好き」でいる

メンバーはみんな、部会委員会のことが好きだと言いいます。
毎日の活動の雰囲気からも、そのことがすごく伝わってきます。
そんなメンバー、チームが私も好きです。

自分たちが自チームのことをはっきり好きと言えれば、そりゃポジティブに活動できます。

「1.」～「6.」に書いたことやその他いろんなことの積み重ねで辿り着いたこの状態こそ、部会委員会チームの最も素敵な良いいいいところだと思っています。

# おわりに

将来自分がチームビルディングを先導する立場になった時や、僭越ながらどこかの誰かのために、この記事が少しでも役に立ったら良いなと思っています。
ReactivePropertyメモ：きちんと動くEventToReactiveCommand

Prismを使ってエレガントにMVVMを構築したい。
そこで活躍するのがReactivePropertyによるイベント制御なのだが、
Nugetのバージョンで「おまじない」が変わってくる。

一番参考になるのがこのサイトだが
https://elf-mission.net/programming/wpf/episode06/#EventToReactiveCommand_TreeView_SelectedItemChanged

イベントに関しては記述が古いし、

http://once-and-only.com/programing/c/treeview%E3%81%8B%E3%82%89selecteditem%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99%EF%BC%88c-wpf%EF%BC%89/

ここもそのままでは動かない。

というわけでこれで動く！という組み合わせをド根性で探り当てたのでメモ（俺はライブラリの中にどんな命令があるのかを調べる方法を知らないのだ）。

<b>Nuget画面</B>
![Nuget.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1599481/66f347c4-acda-ea10-1e85-f20c4db1d598.jpeg)
バージョンはこう！

<b>XAML</B>

			 xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
			 xmlns:ri="clr-namespace:Reactive.Bindings.Interactivity;assembly=ReactiveProperty.WPF"

このReactiveProperty.<b>WPF</B>がナウいおまじないだ。

            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectedItemChanged">
                    <ri:EventToReactiveCommand Command="{Binding SelectedItemChanged}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
おまじないが正しければこの組み合わせが通る。
riの方だけ延々エラーが取れなくて絶望したらこの記事を思い出せ！
clang で AST を JSON で dump するメモ

## 背景

C/C++ コードから関数定義を抜き出したり, ちょっとした source-to-source translation とかしたい.

libclang(clang-index?)の python binding などもありますが, メソッド調べるとかめんどいです.

clang そのものに AST を JSON でダンプする機能があります!

### ast-dump

`-ast-dump=json` で JSON でダンプできます. (xml もあるよ)

`-ast-dump` オプションは Clang 固有のため, Clang 専用コンパイルフラグである `-Xclang` を先につけます.
もしくは, 条件によっては `-cc1`(clang そのもの?を呼び出す) でもよいです.

https://stackoverflow.com/questions/8991662/what-does-the-clang-cc1-option-do

`-fsyntax-only` で構文処理だけするようにします(実際にコンパイルを行わない)

```
$ clang -Xclang -ast-dump=json -fsyntax-only test.c
```

```
$ clang -cc1 -ast-dump=json -fsyntax-only test.c
```

あとは python で読むなりして JSON 処理すればいけます!
JSON viewer 使って構成をチェックするとよいでしょう.

## スクリプト例

JSON を python で処理する例です.

```
def eval_expr(expr):
    s = ""

    if expr['kind'] == 'ConstantExpr':
        inner = expr['inner']
        assert len(inner) == 1

        s += eval_expr(inner[0])

    elif expr['kind'] == 'UnaryOperator':
        opcode = expr['opcode']

        assert len(expr['inner']) == 1
        assert opcode == '-'

        s += "{}{}".format(opcode, eval_expr(expr['inner'][0]))

    elif expr['kind'] == 'IntegerLiteral':

        s += expr['value']

    elif expr['kind'] == 'BinaryOperator':
        assert len(expr['inner']) == 2

        opcode = expr['opcode']

        s += "{} {} {}".format(eval_expr(expr['inner'][0]), opcode, eval_expr(expr['inner'][1]))

    else:
        print("eval_expr: TODO:", expr)
        raise

    return s

```

## 制約

### プリプロセッサ

`#define` とかのプリプロセッサ関連の情報はダンプされません. プリプロセッサ情報とかも欲しい場合はなにかほかの手を考える必要があります. AST 情報吐いてくれそうな C preprocessor を探してみるとか.

libclang では pp-trace https://clang.llvm.org/extra/pp-trace.html がありこれを何やら活用する手もありそうです.


### システムヘッダのファイル名はトラックされない場合がある?

AST はプリプロセス後のソースで生成されます.

たとえば `cublas_v2.h` を処理すると `FP_NAN`(math.h で定義) の `EnumDecl` が生成されますが, これに対応するソースファイル情報(`math.h`)は出てこないです.
以下のように, includedFrom で `cuComplex.h` は残っていますが, `math.h` はないです.

```
    {
      "id": "0xe21268",
      "kind": "EnumDecl",

...
            "end": {
              "spellingLoc": {
                "offset": 25890,
                "line": 856,
                "col": 17,
                "tokLen": 1,
                "includedFrom": {
                  "file": "/usr/local/cuda/include/cuComplex.h"
                }
              },
              "expansionLoc": {
                "offset": 25898,
                "line": 857,
                "col": 7,
                "tokLen": 6,
                "includedFrom": {
                  "file": "/usr/local/cuda/include/cuComplex.h"
                }
              }
            }
          },
          "name": "FP_NAN",
          "type": {
            "qualType": "int"
          },

...
```

システムヘッダの場合はうまくトラックされないようです.

ただ, TypedefDecl など一部はうまくトラックしてくれるようです.
　 
### 関数ポインタの typedef

typedef の定義が関数ポインタの場合, ほかの typedef と切り分けが面倒かもです.
[Async Iteretor]ちょっとずつ変化するコンポーネントを作りたい

## はじめに

1 秒ごとに処理に応じてちょっとずつ変化していくコンポーネントが作りたかった  です

[プログレスバー](https://material-ui.com/components/progress/)の拡張版みたいな...

setInterval を使って実装して見たけど、[setInterval の引数に渡した関数内では State が参照できない](https://www.fixes.pub/program/7468.html)ようで、以下のように setState 内で無理矢理条件分岐を作らないといけないです

```js
const intervalValue = setInterval(() => {
  setCount((count) => {
    if (count === 5) {
      clearInterval(intervalValue)
      return count
    }
    return count + 1
  })
}, 1000)
```

もっといい方法はないか考えていたらふと Generator の事を思い出したので実装してみることにしました

## 実装

お試しなのでシンプルにカウントアップするものを実装

### 作るもの

- ボタンを押すと 1 秒おきにカウントアップされる
- 比較のため Genetretor+Iteretor を使ったものと Interval を使ったものどっちも実装してみる

### コード

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="azuha" data-slug-hash="poeVOGB" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="poeVOGB">
  <span>See the Pen <a href="https://codepen.io/azuha/pen/poeVOGB">
  poeVOGB</a> by あずは (<a href="https://codepen.io/azuha">@azuha</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

### 解説

非同期ジェネレータ関数を利用して、count が 5 になるまで 1 秒毎に yield でカウントアップしていきます

ジェネレータ関数を利用するとその戻り値は Generetor 型となり、yield で指定した値を持つ、いわゆるイテラブルなオブジェクトとして返却されます

wait 関数を自作し、await で待機処理を作るために async 関数にしています

```
const countUp = async function* (first) {
  let count = first;
  while(count < 5) {
    await wait(1000)
    count++
    yield count
  }
}
```

非同期ジェネレータ関数の戻り値は AsyncGeneretor 型となり、受け取ったイテラブルなオブジェクトは for await...of 文で取り出すことができます。

```
for await (const value of countUp(0)) {
  setCount(value)
}
```

ES2018 まで for 文の中で非同期処理は行えなかったみたいですが、for await...of 文が追加されてからは上記のような書き方ができるようになりました

Interval を使用する場合 setInterval の戻り値を保持する State を用意しないといけなかった反面、ジェネレータ関数を利用すると State は必要なく簡潔に書けることがわかると思います

## 後書き

今まであまり触れてこなかったジェネレータ関数を利用することで欲しかった「ちょっとずつ変化していくコンポーネント」を実装することができました 

割と最近出た構文（だと思っている）ですが、こういう新しい技術は覚えておくと今まで難しかったことがあっさり解決することがあるんだな〜と勉強になりました
競プロのお勉強 ~for Pythonista~

#はじめに
最近**AtCoder**と**paiza**をはじめました:beginner:

やっていくうちにテンプレートのようなものがたくさんあったので，
思いつく限りを備忘録がてらまとめていきます(自称備忘録芸人)．
まとめながら頭を整理させていただきます．

いいものがあれば順次更新していこう！
[:file:](#もくじ) ← をクリックするともくじにいけます．

#もくじ

- **[再帰上限数](#再帰上限数)**
- **[標準入力](#標準入力)**
  - [1行だけ](#1行だけ)
  - [複数行](#複数行)
  - [行数指定なし](#行数指定なし)
1. **[標準出力](#標準出力)**
1. **[リスト内の和](#リスト内の和)**
1. **[リスト内最大最小](#リスト内最大最小)**


# 再帰上限数
再帰を使うときは念のため書きましょう．
再帰で`TLE`が出るときはいったん書いてみる．

```python
import sys
sys.setrecursionlimit(10000)
```
[:file:](#もくじ)

# 標準入力
様々な形式の入力が指定される．
## 1行だけ
```py
# atcoder → 'atcoder'
S = input()    

# atcoder → ['a', 't', 'c', 'o', 'd', 'e', 'r']
S = list(input())

# 1 2 3 4 → ['1', '2', '3', '4']
N = input().split()

# 1 2 3 4 → [1, 2, 3, 4]
N = list(map(int, input().split()))
```
[:file:](#もくじ)

## 複数行
```py
# 2
# at
# coder
# → ['at', 'coder']
N = int(input())                          # 行数
input_list = [input() for i in range(N)]  # 入力行
```
[:file:](#もくじ)

## 行数指定なし
ユーザーが`Ctrl+C`とか`<EOF>`を入力したときを終了とするようなやつ．
(某社のWebテストの入力形式がこれで爆死しました:bomb:)

```bash:input
> 2021-06-05 get 100
> 2021-06-06 set 50  
> 2021-06-07 get 150
> Ctrl+C
```

```py:逐次処理パターン
while True:
    try:
        # 文字列入力の場合
        input_list = list(input().split())
        # 数字入力の場合
        # input_list = list(map(int, input().split()))

        # 逐次処理を記述
    except:
        # 処理ができなくなったら終了処理
        break   # もしくはquit(), os.exit()
```

```py:リストに追加パターン
input_list = []
while True:
    try:
        # 文字列入力の場合
        input_list.append(list(input().split()))
        # 数字入力の場合
        # input_list.append(list(map(int, input().split())))
    except:
        # 処理ができなくなったら終了処理
        break
# ~以降の処理を記述

print(input_list)
# [['2021-06-05', 'get', '100'],
#  ['2021-06-06', 'set', '50'],
#  ['2021-06-07', 'get', '150']]
```
[:file:](#もくじ)

# 標準出力
print()関数を使う．

```py:入力例
S = 'aiueo'  # str
N = 5        # int
M = 10       # int
```

```py:そのまま
print(S)           # 一般的にみるやつ
print(S, end='\n')  # 上と同じ意味
# aiueo
# aiueo
```

```py:末尾指定
print(S, end='')    # 改行しない
print(S, end=';')   # 末尾に;を出力, 改行しない
# aiueoaiueo;
```

```py:intとstr
print(S, N+M)
# aiueo 15

print(S+str(N+M))
# aiueo15

print(S+N+M)
# これはエラー×
# str型とint型の足し算になるため
```
```py:リストの中身を一文字空けて
print(' '.join([S, S, S]))
# aiueo aiueo aiueo
```

[:file:](#もくじ)

# 空のDPを作成
DP(動的計画法)の問題では，空のリストを用意して結果を格納することがよくあります．
フラグの管理や探索アルゴリズムなどに使えるかと．

```py:Nは入力サイズなど
# [0, 0, ..., 0, 0]  0で初期化
dp = [0 for i in range(N)]

# [[], [], ..., [], []]  空のリストのリスト
dp = [[] for i in range(N)]

#[[0, 0, ..., 0], [0, 0, ..., 0], ..., [0, 0, ..., 0]]
# 0で初期化したリストのリスト
dp = [[0 for i in range(N)] for i in range(N)]
```
などなど用法用量に合わせて．

[:file:](#もくじ)

# リスト内の和
dpに登録したフラグ(存在:1, 無し:0)を数えたりするときに使えそう

```py
# 例えば
# 処理結果 dp = [0, 1, 0, 0, 1, 1, 0] 等
print(sum(dp))
# 3
```
[:file:](#もくじ)

# リスト内最大，最小
```py
# 例えば
# 処理結果 dp = [2, 1, 3, 9, 4, 8] 等
print(max(dp))
# 9
print(min(dp))
# 1
```
[:file:](#もくじ)

# おわりに
ビギナーもビギナーです．同じような記事もあると思います．
備忘録なので許してください．なんでm...

**`Tips`**などあればぜひ教えてください！
そのうち更新します．

それでは :wave:
心理的安全性について考えてみる　〜チームビルディング勉強会〜

#　心理的安全性とは？
原点はおそれのない組織

医療機関で「ミスが多く報告されるチーム」が一番成果を出しているという研究結果がもとになっている

https://www.amazon.co.jp/%E6%81%90%E3%82%8C%E3%81%AE%E3%81%AA%E3%81%84%E7%B5%84%E7%B9%94%E2%80%95%E2%80%95%E3%80%8C%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E3%80%8D%E3%81%8C%E5%AD%A6%E7%BF%92%E3%83%BB%E3%82%A4%E3%83%8E%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E6%88%90%E9%95%B7%E3%82%92%E3%82%82%E3%81%9F%E3%82%89%E3%81%99-%E3%82%A8%E3%82%A4%E3%83%9F%E3%83%BC%E3%83%BBC%E3%83%BB%E3%82%A8%E3%83%89%E3%83%A2%E3%83%B3%E3%83%89%E3%82%BD%E3%83%B3/dp/4862762883


## 心理的安全性にはステージがありそう
### ステージ1
ステージ1は失敗できないため、萎縮し意見が出せない状態

#### チームの状態として

- `チームとして`という観点がないため、改善意見しづらい
- 失敗に対して、誰が失敗したと`個人に対し矛先`が向いてしまいチャレンジができない

### ステージ2
チームの中で双方向の信頼が結ばれる（尊敬し合う）関係性ができた状態
課題：心理的安全性が高いが、目標水準が低いと「ヌルい職場」になってしまう

#### チームの状態として

- `問題対チーム`の構造ができ、チームとしてカイゼンが進む
- チームとして、安全な仕事しかなく、チャレンジに至らない

#### ここに至るために、
課題として相互の信頼関係を築くために

- チームのメンバーを知る、話す自己開示
- チームとしてのWorking Agreementを策定し目的を揃える
- 感謝を伝える場を作る

などの活動を地道に続けるしかない

### ステージ３
チャレンジングな領域に進み、チームとして学習が進んでいる状態

#### チームの状態として

- チームとして課題を議論でき、失敗を許容できる文化が醸成される
- チームとして、業務だけでなく学習の時間が確保できる

#### ここに至るために、

一例として、組織の目的が具体的に落とし込まれていないなどがあり、

- 組織のゴールを自分たちなりに解釈できる人、活動を行う
- 組織の目的をマネジメントが具体化する活動をSMがサポートする

など活動する必要がある
`特効薬はない`

https://blog.tinect.jp/?p=60508


## 学者が学会で議論できる

議論の中で信頼関係がない場合でも心理的安全性が高い場合があるのではないかと提言

特に、学者が学会で議論をしている状態は心理的安全性が高い状態とすると、
以下の２つがあれば心理的安全性が高い状態に移行できるのではないか？

- 共通のビジョン、目的を認識している
- 上下関係がないフラットな関係性
- 議論するための土台となる情報を理解している


##議論に上がった書籍、文献


https://www.amazon.co.jp/%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E3%81%8B%E3%81%9F-%E7%9F%B3%E4%BA%95-%E9%81%BC%E4%BB%8B/dp/4820728245

https://www.amazon.co.jp/%E3%82%A8%E3%83%A9%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%82%B7%E3%83%83%E3%83%97-%E2%80%95%E8%87%AA%E5%B7%B1%E7%B5%84%E7%B9%94%E5%8C%96%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AE%E8%82%B2%E3%81%A6%E6%96%B9-Roy-Osherove/dp/4873118026

https://collabpatterns.sfc.keio.ac.jp/No25.html
Teradata Studio Express 接続方法



#接続方法

## １．接続
プロファイルをタイプとプロファイル名を選択しNext
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685631/9b969f5f-4534-d07c-f1d7-aa9c1fb97837.png)


##２．接続詳細

以下、入力し Test Connectionで、接続確認

| 項目名 | 内容 | 入力例 |
|:-:|:-:|:-:|
| Database Server Name  |  ホスト名 or IPアドレス |  127.0.0.1 |
| User Name | 接続ユーザ名  | dbc  |
| Password  |  パスワード | dbc  |


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685631/d44cf5bb-c7af-60d0-4856-f74cccf3b831.png)


##３．確認結果

接続が成功したらFinish


##４．接続完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685631/7da86705-f939-8ab3-9cb0-cded79bf8ee0.png)



#参考リンク
[Teradata® Studio™ Express ユーザー ガイド • リーダー • Teradataドキュメント | テクニカル マニュアルへのクイック アクセス](https://docs.teradata.com/r/aBMEnq2IRvin0exYeUMyTg/root)
Linux基礎学習まとめ① 基本コマンド(cd, ls, mkdir, rm, cat, etc.)

##概要
皆様、初めまして。
Webエンジニアを目指すにあたり、雑食系エンジニアのYouTuberとしても活動されている[KENTA](https://twitter.com/poly_soft)という方が発信してくださっている動画を拝見しました。
また、たくさんの方がQiitaやnoteにエンジニアを目指すためのロードマップとして、「Linuxの基礎を勉強するべき」とおっしゃっていました。
私自身、ネットワーク周りやファイル管理などの知識に疎く、プログラミング学習だけでは成長できないと考え、Linuxの基礎から勉強していくことにしました。

そこで、私が勉強したことをここにアウトプットして、自分だけでなく勉強を始めたばかりの方々の知識のインデックスにしたいと思います。

記事初投稿になるので、至らぬ点はご容赦ください。

##実行環境
- macOS BigSur 11.4
- CentOS7 (macOS上でLinux環境を構築する方法は[こちら](https://qiita.com/tamago3keran/items/781728815e359243ff33)を参考にしました)

##基本のコマンド
私個人的に便利でよく使うな〜と思うコマンドをいくつかピックアップしました。

####1. ls (ファイル参照)

```
書式
$ ls [option]
```

よく使うオプション

- -a : 隠しファイルやディレクトリまで全て表示
- -l : データサイズや権限などを詳細表示
- -R : カレントディレクトリ以下の全階層のファイル、ディレクトリを表示


####2. cd (ディレクトリ移動)、 pwd (カレントディレクトリ確認)

```
書式
$ cd [target_directory]
```

相対参照(ex. `cd ../dir`)や絶対参照(ex. `cd /etc/`)は覚えておくと非常に便利。
現在の作業ディレクトリを確認するコマンド`pwd`と合わせて覚えておくとなおよし。

####3. mkdir (ディレクトリの作成)
新規ディレクトリを作成するコマンド

```
書式
$ mkdir [new_dirname]
```

####4. rm (削除コマンド)

```
書式
$ diff [option] [file1] [file2]
```
よく使うオプション

- -r : ディレクトリまで含めて削除
- -f : 強制削除

基本このオプションつけて作業してた。
本当は -i オプションをつけて確認したほうが安全。

####５. touch (ファイル作成、タイムスタンプ変更等)

```
書式
$ touch [filename]
```
指定したファイル名のファイルが存在しない場合、指定した名前で新しくファイルを作ってくれるので、適当なテストファイルとかを作成する際に便利。

####6. cat >, >> (catコマンドを用いたリダイレクト)

```
書式
$ cat > [filename]
$ cat >> [filename]
```
コマンドの挙動確認のために標準入力の内容をそのままファイルに格納し、テストファイルを作成する。
 `Ctrl + D` で標準入力を終了する。
  `>`で新規作成、`>>`で追記。
各種コマンド実行後に、その標準出力結果を新規ファイルに保存するときなどにも使える。

####7. tail (ファイルの終わりを標準出力)

```
書式
$ tail [option] [filename]
```

- -f オプションについて

ファイルの終わり部分を標準出力するコマンドだが、-f オプションをつけることによって、ファイルを動的に読み込むことができる。
　`Ctrl + C`を押すまでシェルに制御が戻らない。
　Webサーバーのアクセスログやエラーログを見る場合に使えそう（その辺りはまだ勉強中）。

####8. sort (ソート)

```
書式
$ sort [option] [filename]
```
ファイル内容を列の内容に応じてソートするコマンド。
オプションの付け方で様々なソートが可能(アルファベット降順、数値昇順など)

よく使うオプション

- -k : ソートする列数をnで指定する
- -n : n列目の数字を文字列ではなく数値としてソートする（100, 70, 20みたいな時に文字列だとうまくソートできない）

####9. diff (差分比較)

```
書式
$ diff [option] [file1] [file2]
```

二つのファイルの差分を比較するコマンド

よく使う(と思われる)オプション

-　-u : わかる人にはわかる見覚えのある差分表示になる。普通にこのオプションつけたほうが見やすいと思う。

##参考文献
この記事は以下の情報を参考にして執筆しました。
- [Linux標準教科書(ver.3.0.2)](https://linuc.org/textbooks/linux/)
ActiveRecordやRubyの！？について

絶賛Rails勉強中なので適当に使っていた！や？をまとめます
#ActiveRecordの！
create,save,update,destroy等のメソッドの後ろに！をつけた場合、それぞれのCRUD処理が失敗した場合に例外（ActiveRecord::RecordNotFound）を返すようになります。

！を付けない場合は成功した場合true、失敗した場合falseが返却されます。
# Rubyの！
rubyのメソッドに！をつけた場合は「破壊的メソッド」になるそうです。なに言ってんのかわかんないですね。

### 破壊的メソッドとは？
この方の記事がわかりやすかったです。
https://qiita.com/tentom/items/0164b68dff94702e3880

破壊的メソッドにした場合はオブジェクトが再生成されます。
非破壊的メソッどはオブジェクトは変わらないまま値だけが変わります。

# ?
メソッドに？を付けることで真偽値を返すメソッドだということを直感的に表すことができます。
つけなくても真偽値が返ってくることには変わりありませんが、付けた方がわかりやすくなっていいと思います。
メソッドに？を付けた場合、メソッドを呼び出すときにも？を付ける必要があります。
NFTの価値についてを考えてみる

#なぜデジタル資産は不正利用できないのか
デジタル資産と呼ばれるNFT(Non-Fungible Token：非代替性トークン）)ですが、仮想通貨は金のやりとりをマイニングすることで取引を承認する。それと同じ流れでNFTもマイニングすることで資産の価値を承認することになる。不正取引が横行しているであろう、この世の中で外部者から取引が正しいのか確認できる資産であるから人気が出ているのであろう。

#では、元々価値が無いモノを価値のあるモノに生まれ変わらせるのはどうすればいいのか
##プラットホームを面白くしてみる
例えば、３秒間の効果音を売るNFTプラットホームがあったとして、その３秒間をどうUI的に面白みを持たせるかによって買ってくれるであろうユーザーがでてくる。これは単純に面白いから買ってくれるという趣味的な価値になってきますね。
綺麗だから買ってみる。好きな芸能人が使っているから買ってみる。みんなに自慢したいから買ってみる。これらが一つの価値の見出し方になってくると思ってます。ただ、著者や発行者のブランド力などのバックボーンがなく、全く無いモノに価値をつけていくのは、路上ライブから有名になっていくアーティスト並みに難しいということでもある。何にせよ、後ろ盾なしで世間に認めてもらえるぐらいのプラットホームをつくることがwebエンジニア（フロント・バック・インフラ）にとっての最大の誇りなのかもしれませんね。一曲で有名になる歌手もいれば、何十曲とつくってやっと有名になる歌手。webサービスに限っても似たような仕組みなのではないでしょうか。世間にニーズがあった心が揺さぶられるような、そんなwebサービスを開発する。便利になることも大事ですが、使っていてワクワクするようなwebサービスはもっと大事。遊び心は大切に。

##バックボーンで押し切る
NFTという流行トレンド（少しトレンド離れしているが）に大企業から発のサービスが加わったら根幹が信用性に満ちているので、面白みが多少欠けていてもバズる可能性があり、そしてまた価値が無いモノに価値がついていく。これは、長期的な資産上昇が考えられる投資的な側面で安定感があるので利口的な価値の創造かなと思います。ただ、個人的に長期的な資産上昇を考えての保有は面白みに欠けていると思っていて保有をしている間でもその価値を楽しめるような造りの方が面白いのでバックボーンで押し切る系のNFTサービスには保有間価値があるものをつくってもらいたいですね。例えばの話、元レペゼン地球の銀太さんがヨーロッパで「ポテトのタトゥー」をみせたらポテトが無料になった。みたいなそんなエピソードがNFTを通して、もっと生まれていければ精神的な豊かな世の中になっていくのではないかと思ってます。

##ソーシャルゲーム戦法で勝負
７つあるドラゴンボールを全て揃えると願いが叶うわけではないですか。これを例えば、７つある商品を全て揃えて取引アドレスを並べるとそれが鍵になって眠っている何かが解禁されるみたいなミステリーゾーンをつくることによってみたいなマーケティング戦略？をしていくやり方。これは、人間の心理につけ込む事が大事だとは思うのですが、SNS特有のゲームに飽きて気づいたら何でこんなゲームに課金してしまったんだーみたいな後悔をなくす仕組みづくりにできるがNFTだと思っているので有名なソシャゲが早々NFT進出していってソシャゲ民が儲かるような仕組みが出来上がったら面白いなと思います。まあ、お金目的のソシャゲがNFT進出するとは思いませんが。

#まとめ
価値のないモノからあるモノにってテーマで書きましたが、単純に最初から価値があるモノもあります。例えばアスリートのカードみたいな、そんなNFTサービスをつくることもバックボーンがあれば可能だとは思いますので様々豊かな面白いNFTサービスをつくっていきましょう。ECサービスは商品が必要ですが、NFTは商品が実際になくてもつくることは可能なので発想次第で無限通りのアイデアが出てきて考えてる時間がすごく楽しいです。開発進めないと何も生まれないんですけどね。。
Prisma導入メモ

# 概要
prismaの導入から簡単なクエリー・メモ

## [prisma](https://www.prisma.io/)とは
node.jsとTypescriptのORマッパーで(Goでも使える)以下の特徴などがある
- データモデルをスキーマで表現する
- スキーマから型を生成できる(直感的に扱えるようになる)
- PRISMA STUDIOという名のSQLクライアントを内臓している(web)

# セットアップ
```bash
# インストール
$ npm i -D prisma
```

```bash
# 初期化
$ npx prisma init
```
初期化すると以下のファイルが生成される

- .env
- prisma/schema.prisma

`.env`にはDBの接続先設定を設定し、`schema.prisma`の`datasource.provider`には、使用するデータベースをしていする（postgresql, mysql, sqliteなど）
[公式Doc](https://www.prisma.io/docs/getting-started/setup-prisma/start-from-scratch-typescript-postgres#connect-your-database)

### DATABASE_URLの設定例
```.env
# postgresql
# postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA
DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"

# mysql
# mysql://USER:PASSWORD@HOST:PORT/TABLE_NAME
DATABASE_URL="mysql://root:root@localhost:3306/test_database"

# sqlite
# file:FILE_PATH
DATABASE_URL="file:./dev.db"
```

`prisma/schema.prisma`にはデータベースの情報やデータモデル（テーブル構造）を記述する
・[データベースの情報](https://www.prisma.io/docs/concepts/components/prisma-schema/data-sources)
・[データモデル](https://www.prisma.io/docs/concepts/components/prisma-schema/data-model)
・[スキーマ リファレンス](https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference)


## マイグレーションの作成・実行

マイグレーションの作成・DBへ反映・型情報の生成

```bash
$ npx prisma migrate dev

# マイグレーションの語尾に`init`を付与する
# `20210606142525_init`
# $ prisma migrate dev --name init
```

## 他のコマンド

```bash
# Prisma Studioの起動
$ prisma studio

# データベースをリセットしDBへ反映(本番では使用しない)
$ prisma migrate reset

# マイグレーションのステータスチェック
$ prisma migrate status

# マイグレーションの実行・DBへ反映
$ prisma migrate deploy

# 型情報の生成
$ prisma generate
```