OmniAICreator/Qiita-1.07M huggingface dataset:
AWS上にDockerで環境構築する

#コンテナをAWSに送る３つの方法
・Dockerレジストリを使う（Docker hub）
・Dockerfileを送る
・Docker imageをtarにして送る

##ホストのEC2にSSHでログインする
シェルを使う時にSSHでアクセスする。
SSHでログインすると、AWSのインスタンスにDockerをインストールすることなどができる。

SSH・・・secure shell
secureにシェルを起動する


ssh -i xx.pem username@hostname

xx.pem ・・・ サーバーを立てた際にダウンロードした鍵ファイル
-i ・・・ 鍵ファイルを指定するためのオプション

例）
ssh -i mydocker.pem ubuntu@ec2　・・・　.amazonaws.com

##AWSのインスタンスにDockerをインストールする
・SSHでサーバーにアクセスする。
　ssh -i xx.pem username@hostname
・パッケージをアップデート
　sudo apt-get update
・ dockerをインストール
　sudo apt-get install docker.io

※sudo gpasswd -a ubuntu docker
dockerというグループを作り、そこにubuntuを入れることで、グループに属している人はdockerを使えるようになる。
ubuntuのサーバーでdockerを使う時は、基本的に必ずやる
（sudoを付けなくても実行できるようになる）

#Docker imageをtarにして送り、コンテナを作る
Docker imageをtarにして送る。

###tarファイルに変換する
docker save  イメージID　> 任意のファイル名.tar
docker save fd867gy7fg  > myimage.tar

###sftpでAWSにアクセスする
sftpでアクセスすることでファイルを転送させることができる。

sftp　・・・ Secure File Transfer Protocol


sftp -i xx.pem username@hostname
例）
ssh -i mydocker.pem ubuntu@ec2　・・・　.amazonaws.com

###転送する
・put local/path [remote/path]
put temp_folder/myimage.tar /home/ubuntu
ローカルのファイルをリモートサーバー（EC2）にファイルを送る
※リモートのパスを指定しない場合、sftpでログインした場合のカレントディレクトリに転送される

・get local/path [remote/path]
リモートサーバー（EC2）からファイルをとってくる。

###.tarからDocker imageに戻す
sshでAWSにアクセスし、docker loadでイメージに戻す。
・ssh -i xx.pem username@hostname
・docker load < ファイル名.tar
・docker run でコンテナにする。

例）
docker load < myimage.tar

#Dockerfileを転送する方法でコンテナを作る
・sftpでアクセスし、dockerfileを転送する。
　sftp -i xxx.pem ubuntu@[hostname]
　put local/path [remote/path]

・sshでアクセスし、buildしコンテナを作る
　ssh -i xxx.pem ubuntu@[hostname]
　（新しくフォルダを作り、ビルドコンテクストを作りそこにDockerfileを置く）
　docker build .

#最後に
この記事は、かめさん（ https://twitter.com/usdatascientist?s=21 ）のudemyのdocker講座の（ https://www.udemy.com/share/103aTRAEMfeVhaTXoB/ ）書き起こしです。

※あくまで、自分のための書き残しとして投稿しているので、講座と異なる部分を含んでいる可能性があります。

かめさんのブログ( https://datawokagaku.com/docker_lecture/ )
東西南北の緯度経度から任意の数に分割する

```ruby
# 縦横何分割するか
DEVIDE_COUNT = 7 

# 配列の中央値
cneter_index = (DEVIDE_COUNT / 2) + (DEVIDE_COUNT % 2)

# 東西南北
origin_n = 0
origin_s = 50
origin_w = 100
origin_e = 200

north_south_unit = (origin_s - origin_n).fdiv(DEVIDE_COUNT)
west_east_unit = (origin_e - origin_w).fdiv(DEVIDE_COUNT)

# 北から南、西から東へ分割していく distance_rankは中心から遠いほど大きくなる
Mesh = Struct.new(:nl, :sl, :el, :wl, :distance_rank)
results = []
(1..DEVIDE_COUNT).each do |ns_count|
  (1..DEVIDE_COUNT).each do |ew_count|
    results << Mesh.new(
      origin_n + (north_south_unit * (ns_count -1)),
      origin_n + (north_south_unit * ns_count),
      origin_w + (west_east_unit * (ew_count -1)),
      origin_w + (west_east_unit * ew_count),
      (cneter_index  - ns_count).abs + (cneter_index - ew_count).abs
    )
  end
end

pp results.sort_by(&:distance_rank)
```
【忘備録】Rubyをやってみて何度も調べたコマンド一覧

# はじめに
Rubyを半年程さわってみて、調べる頻度が多かったコマンドをここでまとめてます。
初学者兼初投稿なのでコメントやLGTMなどでフィードバック頂けると励みになります。よろしくお願いします。

# Ruby関連
```
rubyのバージョンを確認する
$ ruby -v

railsのバージョンを確認する
$ rails -v

credentials.yml.encのファイルを開く
$ EDITOR='code --wait' rails credentials:edit
(※vscodeでファイルを開くにはshellをインストールしてcodeコマンドを使えるようにする必要あり)
```

# unicorn関連
```
起動状態を確認する
$ ps auxwww | grep unicorn

プロセスを終了する
$ kill -9 ○○○○○○

すべてのログを確認する ($ cd /var/www/app/log にて)
$ less unicorn.staderr.log

直近10件のログを確認する ($ cd /var/www/app/log にて)
$ tail unicorn.staderr.log
```

# nginx関連
```
再起動する
$ sudo service nginx restart

すべてのログを確認する (本番環境のホームディレクトリにて)
$ sudo less /var/log/nginx/error.log
```

# MySQL関連
```
起動状況を確認する
$ sudo service mysqld status

起動する
$ sudo service mysqld start
```

# Capistrano関連
```
デプロイ実行
$ bundle exec cap production deploy

１つ前の状態にロールバック
$ bundle exec cap production deploy:rollback
```

本番環境まわりのコマンドばかりになってしまいましたが、過不足があれば随時更新していきます。
Github Actionsことはじめ


## What is "Github Actions?"

> GitHub Actionsは、すべてのツールを連携して、開発ワークフローのすべてのステップを自動化します。
> 任意のクラウドに簡単にデプロイしたり、Jiraでチケットを作成したり、npmにパッケージを公開することが可能です。

つまりGithub上でCI/CDができる。2,000min/1monthまで無料。

## ワークフローを作る
### 準備
ワークフローはyml形式で記述する。
.github/workflows/配下にあるymlファイルが実行されるので、まずはリポジトリ直下に.github/workflowsを作ろう。

```
repository/
    ├ .github
    │   └ workflows
    │       └ hoge.yml ←Github Actions実行対象
    ├foo
    └bar
    
```

### 基本的な文法
#### ymlの構造
ymlの第一階層に記述するのは以下の4つ。

- name
    - ワークフローの名前。省略するとワークフローファイルの相対パスがその値に設定される。

```yml:example
# Build and Pushという名前のワークフローを定義
name: Build and Push

︙
```

- on（必須）
    - ワークフローを起動するトリガー。
    - [push, pull_request]というようにArrayで指定するとor条件でトリガーされる。
    - [onに使えるワークフローをトリガーするイベント一覧](https://help.github.com/ja/actions/reference/events-that-trigger-workflows)

```yml:example1
# 「v」から始まるタグがプッシュされたときに発火するトリガーを定義
on:
  push:
    tags:
      - v*
```

```yml:example2
# masterブランチがプッシュされたときに発火するトリガーを定義
on:
  push:
    branches:
      - master
```

```yml:example3
# Issueが新規作成、もしくは編集されたときに発火するトリガーを定義
on:
  issue:
    types: [created, edited]
```

- env
    - ワークフロー中すべてから参照できるグローバル変数のようなもの。`$<KEY>`で展開できる。
    - 同じ名前で複数の環境変数が定義された場合、詳細度が高い順にオーバーライドされる。
        - 詳細度低 < `env` < `jobs.<job_id>.env` < `jobs.<job_id>.steps.env` < 詳細度高

```yml:example
# $SERVERからproductionと展開できる環境変数を定義する
env:
  SERVER: production
```
- jobs
    - ワークフローで実行される1つ以上のジョブ。複数登録すると並列で処理される。
    - 逐次処理をさせたい場合には`jobs.<job_id>.needs`キーワードを使用して他のジョブへの依存関係を定義することができる。
    - 詳しくは[公式ドキュメント](https://help.github.com/ja/actions/reference/workflow-syntax-for-github-actions#)を参照されたし。

基本的には以上これら4つの文法を組み合わせてワークフローを組み立てる。
次はdockerfileをビルドしてAmazon ECRにPushするワークフローの例。

```yml:example
jobs:
  build-and-push:  # job_id

    runs-on: ubuntu-18.04  # ubuntu 18.04環境で実行
    timeout-minutes: 300   # タイムアウトは300分

    steps:
    - name: Build, tag, and push image to Amazon ECR
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
      run: |  # 「|」でシェルを複数行実行できる。（ymlの文法）
        IMAGE_TAG=$(echo ${{ github.ref }} | sed -e "s#refs/tags/##g")
        for REPOSITORY in `ls -l | awk '{print $9}' ; do
        docker build -t $ECR_REGISTRY/$REPOSITORY:$IMAGE_TAG ./$REPOSITORY/
        docker push $ECR_REGISTRY/$REPOSITORY:$IMAGE_TAG
        done
      shell: bash  # bashで実行。 pythonとかも選べる。
      working-directory: ./docker  # 実行するディレクトリ

```

## ワークフローを実行する
onで指定したイベントが検知されるとGithubが自動でワークフローを実行してくれる。
手動で実行はできないので、自分でonイベントを踏む必要がある。

実行履歴はリポジトリの「Actions」タブから見れる。
<span style="color: #d61b09">なお、実行されないとこの一覧には表示されないので注意。</span>
.github/workflow配下にymlを作っただけでは表示されない。
Rで無限混合ガウスモデルへの道.4(未完成)

# 記事の目的
無限混合ガウスモデルの周辺化ギブスサンプリングをRで実装することです。
参考書籍: [佐藤一誠. ノンパラメトリックベイズ. 講談社. 2016](https://www.amazon.co.jp/%E3%83%8E%E3%83%B3%E3%83%91%E3%83%A9%E3%83%A1%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%83%99%E3%82%A4%E3%82%BA-%E7%82%B9%E9%81%8E%E7%A8%8B%E3%81%A8%E7%B5%B1%E8%A8%88%E7%9A%84%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E6%95%B0%E7%90%86-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%BD%90%E8%97%A4-%E4%B8%80%E8%AA%A0/dp/4061529153/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)

# 目次

[1. モデルの説明](#1-モデルの説明)
[2. 使用データ](#2-使用データ)
[3. 分散固定の混合ガウスモデルのギブスサンプリング](#3-分散固定の混合ガウスモデルのギブスサンプリング)
[4. クラスタリング確認](#4-クラスタリング確認)

#1. モデルの説明
グラフィカルモデル、生成過程は前回と大体同じです。
ディリクレ分布の仮定が少し違います。

![IMG_0167.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/6902a90c-5c3d-38a3-5fb0-472e371c5f86.jpeg)
#2. 使用データ
```R:
> X <- iris[,1:4]
> D <- ncol(X)
> N <- nrow(X)
> head(X)
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1          5.1         3.5          1.4         0.2
2          4.9         3.0          1.4         0.2
3          4.7         3.2          1.3         0.2
4          4.6         3.1          1.5         0.2
5          5.0         3.6          1.4         0.2
6          5.4         3.9          1.7         0.4
> 
```

#3. 分散固定の混合ガウスモデルの周辺化ギブスサンプリング
```R:
library(dplyr)
library(mvtnorm)
# (1)
K <- 1
# (2)
z <- rep(1:K,N)[1:N]
# (3)
m0 <- rep(0, D) 
r <- 1
a0 <- 1
b0 <- 1

# (4)
m <- matrix(NA, nrow=K, ncol=D)
alpha <- 15
t <- matrix(NA, nrow=N, ncol=K)
n <- {}
max.iter <- 30
a <- 2*a0+(N-1)*D
x.av <- X %>% apply(2, mean)
t1 <- {}

set.seed(100)
for(s in 1:max.iter){
  t <- matrix(NA, nrow=N, ncol=K)
  m <- matrix(NA, nrow=K, ncol=D)
  x.av <- matrix(rep(x.av,each=N-1), nrow=N-1, ncol=D)
  x.k.i <- matrix(NA, nrow=K, ncol=D)
  # (ⅰ)
  for(i in 1:N){
    X.i <- X[-i,]
    rownames(X.i) <- 1:(N-1)
    z.i <- z[-i]
    x.av.i <- X.i %>% apply(2, mean)
    for(k in 1:K){
      # x.k\i
      x.k.i[k,] <- X.i[z.i==k,] %>%  apply(2, mean)
      # n\i
      n[k] <- z.i[z.i==k] %>% length()
      # m\i
      m[k,] <- n[k]*x.k.i[k,]/(n[k]+r)
    }
    #b\i
    b <- 2*b0+(unlist(X.i-x.av) %*% unlist(X.i-x.av))+(N-1)*r/N*(unlist(x.av.i) %*% unlist(x.av.i))
    for(k in 1:K){
      t[i,k] <- dmvt(as.numeric(X[i,]), delta=m[k,], df=a, sigma=(1+1/N)*b[1]*diag(D))*((n[k])/(N-1+alpha))
    }
    t1[i] <- dmvt(as.numeric(X[i,]), delta=m0, df=2*a0, sigma=(1+1/r)*b0*diag(D))*(alpha/(N-1+alpha))
    z_prob <- append(t[i,], t1[i])/ sum(append(t[i,], t1[i]))
    z[i] <- rmultinom(1, 1, z_prob) %>% which.max()
  }
  K <- z %>% unique() %>% length()
}

```

#4. クラスタリング確認
前回同様t分布が違うと思います。
今回はエラーで終わりました間違いが分かり次第修正します、、、
2020/10/28　WordPress実装方法について

社内案件でWordPressの構築をするにあたって、
知識が圧倒的に足りてなかったので勉強した内容を書きとどめていく。

<h2>パスの出力</h2>
<?php echo get_stylesheet_directory_uri();?>

例：
```<link rel="stylesheet" href="<? php echo get_stylesheet_directory_uri( );?/css/style.css">
```
<h2>カスタム投稿の記事ページを作るには？</h2>
・CPT UIなどのプラグインでカスタム投稿を作る。
・作成時の投稿タイプスラッグを用いて「single-"投稿タイプスラッグ名".php」を作成。

<h2>カスタム投稿の出力</h2>

設定したカスタム投稿のみを一覧として出力したい時。

```<?php
$args = array(
  'post_type' => 'gourmet', /* カスタム投稿名が「gourmet」の場合 */
  'posts_per_page' => 5, /* 表示する数 */
); ?>
 
<?php $my_query = new WP_Query( $args ); ?>
 
<ul>
 
<?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?>
 
<!-- ▽ ループ開始 ▽ -->
 
  <li>
    <h3><?php the_title(); ?></h3>
    <p><?php the_time( get_option( 'date_format' ) ); ?></p>
  </li>
 
<!-- △ ループ終了 △ -->
 
<?php endwhile; ?>
 
</ul>
 
<?php wp_reset_postdata(); ?>
```

<h2>記事のサムネの出力</h2>
記事にサムネの設定があれば画像を表示させ、なければ〜みたいな処理。

```	
<?php if( has_post_thumbnail() ): ?>
  <?php the_post_thumbnail('medium'); ?>
<?php else: ?>
  <img src="<?php echo get_template_directory_uri(); ?>/images/no-image.gif" alt="no-img">
<?php endif; ?>
```

ソースコードの('medium')の部分で、呼び出す画像のサイズを指定することができる。
『thumbnail』『medium』『large』『full』『空欄』
※fullにすれば原寸のためCSSで制御しやすい。


<h2>the_content();のCSSが記事一覧ページで反映されない時</h2>
WPはデフォでthe_content();を呼び出すとpタグが付与される。
そのため、pタグのなかにthe_content();を入れた場合はCSSが反映されない。

解決策としては以下を記載。

```
<?php remove_filter (‘the_content’, ‘wpautop’); ?> //the_content();の前に置く。
<?php the_content(); ?> 
```


本日は以上ー。
React Native 0.59->61アップデートの記録

## これは何？
ReactNative v0.59 -> v0.61アップデート時に行ったことのまとめ。
今後のReactNativeアップデート作業時の参考にどうぞ。

## 全体の基本方針
1. ReactNativeのバージョンアップ（ビルドまで）
2. FatalErrorを吐くライブラリを直す（赤画面にならないところまで）
3. dependenciesをアップデート・壊れたら直す（極力黄色の警告メッセージを出さない）
4. devDependenciesをアップデート

### ReactNativeのアップデート
#### 手順
- 基本的には`$ react-native upgrade {version}`でアップデートする。メジャーバージョンを2つ以上跨がない。
- 失敗したら[React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/?from=0.59.7&to=0.59.8)を参考に自分でソースを直す。
- アップデートが完了したらビルドを実施。
- ビルド成功したら（赤画面でもとりあえずビルドはOKなので）`$ git add -A && git commit`

#### Tips
- v0.59 -> v0.60のときはauto linking対応のためリンクされていたライブラリを手動で解除していった。`$ react-native unlink {package}`
- unlinkコマンドではMainApplication.java のpackages.add()関数を削除してくれないので、自分で消す。

### ライブラリのアップデート
- `$ yarn upgrade-interactive --latest`で個別アップデートする。
- ライブラリを削除する場合は`$ react-native unlink`コマンドでリンク解除してからがおすすめ。MainApplication.javaからの削除もお忘れなく。
AWSにネットワークを構築する方法

# はじめに
AWSはAmazon Web Servisesの略で、Amazonが提供しているクラウドサーバーのサービスです。
AWSへの理解度を高めるために、学んだことをアウトプットします。
今回はネットワークとの関係を記載します。


# 今回の流れ

* VPCの作成
* サブネットの作成
* インターネットゲートウェイの作成
* ルートテーブルの作成


# VPCの作成

### VPCとは
AWSの中に自由なネットワークを作れる領域のこと。

### VPCの作成手順

* AWSマネジメントコンソールでVPCページに行く

サービス検索にVPCと入力すると表示されます。

* リージョンの設定をする

リージョンを設定していない人は画面右上の自身のアカウント名の横にあるリージョンの設定を行います。  
私はアジアパシフィック（東京）を選択しています。

* VPCを作成する

サイドバーのVPCをクリックし、右画面の「VPCの作成」をクリック、そして、VPCの設定画面に遷移します。
名前タグとIPv4 CIDRブロックの入力欄が出てくるので、好きなものを入力します。
IPv4 CIDRブロックは使用するIPアドレスの範囲です。
（意味が分からない方はこちらの記事をどうぞ。https://qiita.com/daisuke30x/items/2ef2233001c14f8076d3）

今回は参考にしている書籍に倣って、「10.0.0.0/16」とします。
（つまり、10.0.0.0 ~ 10.0.255.255）

作成したVPCのネットワーク空間は作成したユーザー以外からは見えない状態です。


# サブネットの作成

### サブネットとは

VPCを分割したネットワークのこと。

### サブネットを作成する理由

①物理的な隔離

例えば、社内LANを構築する場合、1階と２階で別のサブネットに分けたいことが挙げられます。
どちらかのサブネットが障害を起こしても、もう片側には影響が出にくいというメリットがあります。

②セキュリティ上の理由

例えば、以下の例があります。
「社内で経理部のネットワークだけは、他部署からアクセスできなくしたい」  
「サーバー群だけ別のサブネットにし、そのサブネットとの通信を監視・一部のデータのみ通したい」  
「インターネットに接続するサーバーだけを別のサブネットにし、社内LANから隔離したい」

### サブネットの作成手順

* サイドバーの「サブネット」をクリックし、右画面の「サブネットの作成」をクリックします。 
* 名前タグに好きな名前を入力します。
* VPCに作成したものを入力、もしくは選択します。
* IPv4 CIDRブロックには割り当てるIPアドレスの範囲を指定します。

サブネットのIPアドレスはVPC領域の範囲の中で指定します。
今回、VPC領域10.0.0.0 ~ 10.0.255.255で設定しているため、その中の10.0.1.0 ~ 10.0.1.255を指定します。  
つまり、「10.0.1.0/24」と入力します。

* 「作成」をクリックします。

# インターネットゲートウェイの作成

### インターネットゲートウェイとは

VPCとインターネットを接続するもの。

### インターネットゲートウェイの作成手順

* サイドバーの「インターネットゲートウェイ」をクリックし、右画面の「インターネットゲートウェイの作成」をクリックします。 
* 名前タグに好きな名前を入力します。（今回は名前を入れずに進みます。）
* 「インターネットゲートウェイの作成」をクリックします。
* 作成したインターネットゲートウェイにチェックを入れ、アクションボタンから「VPCにアタッチ」をクリックし、作成したVPCを入力後、「アタッチ」をクリックします。

（アタッチの作業によりインターネットゲートウェイとVPC領域を結びつけることができます。）

# ルートテーブルの作成

ここではサブネットとインターネットとの接続をします。

### ルートテーブルとは

データの送信先のIPアドレスの値により、どのネットワークにデータを流すか決めるもの。
流すべきネットワーク先は**ターゲット**と呼ばれます。

### ルートテーブルの作成

* サイドバーの「ルートテーブル」をクリックし、右画面の「ルートテーブルの作成」をクリックします。 
* 名前タグに好きな名前を入力します。
* 作成したVPCを入力か選択します。
* 「作成」をクリックします。
* 「サブネットの関連付け」をクリックします。
* 希望のサブネットにチェックを入れ、「保存」をクリックします。
* サブネットのデフォルトのゲートウェイの「ルート」タブをクリックし、「ルートの編集」ボタンをクリックします。
* 「ルートの追加」ボタンをクリックし、送信先に「0.0.0.0/0」と入力、ターゲットには作成したインターネットゲートウェイを選択、「ルートの保存」をクリックします。

設定できたかは、サブネットの「ルートテーブル」タブから確認できます。


# 参考
「Amazon Web Services 基礎からのネットワーク＆サーバー構築」
著者：大澤文孝、玉川憲、片山暁雄、今井雄太

# 最後に
本投稿が初学者の復習の一助となればと幸いです。
UnityのポップアップUIをスクリプトなしで作る

ポップアップウィンドウはウィンドウの外をクリックすると閉じて欲しいです。
この機能はuGUIで簡単に作れるので、備忘録の意味を込めて記事にします。
![2020-10-28_21h21_02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313474/42526fb1-ec5b-4eaf-7ec6-72bf5e9bb167.gif)

- ステップ1

UIパネルがあった時、3つのパネル（Popup、Background、Popup_panel）を作り、画像のように配置する。
![2020-10-28_20h57_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313474/bd7cd1fb-9eac-4463-673f-6a266cbee41a.png)
<b>ポイント</b>
基本的に、ヒエラルキーの順番で上から描画されるので、ヒエラルキーでUIの下にPopupを置くとPopup表示時に表示で下にあるUIが反応しないようになります。
（言い換えると、ヒエラルキーで下にあるUIが前面にくる）

- ステップ2

BackgroundはUI全体を覆う大きさにする。
BackgroundにButtonコンポーネントをつけて、クリックしたらPopupオブジェクトのアクティブがfalseになるようにする。
![2020-10-28_20h58_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313474/ac8eddb3-6aeb-7e73-7c50-4c83346ecf21.png)
<b>ポイント</b>
ヒエラルキーでBackgroundの下にPopup_panelがあるので、Popup_panelが前面にくる。
これにより、Popup_panelをクリックしてもBackgroundは反応しないが、Popup_panelの外をクリックすると、Backgroundのボタンが押され、Popupの表示が消える。

<b>完成</b>
Popup_panelを画面サイズより少し小さくすると、それっぽいものが完成します。
見た目の変化を見るために適当にボタンとテキストを追加して動かしたのが以下の動画です。
![2020-10-28_21h15_30.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313474/dd6cf51f-2e24-d8dc-a8ae-f7bbd240a7ff.gif)
UIにPopupのアクティブをtrueにするボタンをつけて、Popup_panelにアクティブをfalseにするボタンをつけると、記事の最初のようなUIが出来ます。

参考ページ
[uGUIの描画する順番](https://blog.cfm-art.net/archives/391)
VuetifyのCSSを上書きしたいときに取りうる選択肢

#VuetifyのCSSは強い
基本的にいじらなくてもいい感じにきれいにできるという意味と、overrideしようとすると若干面倒くさいという二重の意味で強いVuetifyのCSSですが、変更したい場合があり思うところがあったので、こんなときにはこの方針でという備忘録

#そのコンポーネントでしか使わない
scoped styleを使用して、あげれば事足りる。要素に対して直接Styleを付けなければここが最後に読み込まれるので、あるコンポーネントでしか使わないようなクラスがあればここに書いてあげればそれでいい

```vue
<style scoped lang="sass">
.wrap-text
  word-break: break-all
  white-space: normal
</style>
```

#複数のVuetify標準コンポーネントに適応したい
この場合都度Scoped styleに持ってくるのは面倒なのでグローバルで呼べるようにする。しかしこの場合には、単純にクラスを追加するだけだとVuetifyの標準CSSの方が優先されることがあるので、確実にoverrideしたい場合には、キチンとネストして書くか`deep`を使用するか、最終奥義 `!important`を使用する。

```sass:components/_sample.sass
.wrap-text
  word-break: break-all !important
  white-space: normal !important
```

```sass:app.sass
@import './components/_sample'
```
【PHP】作成中、classの復習

#目次
[classの作り方](#classの作り方)
[instanceを作るための`new`](#1-はじめに)
[継承するためのextends](#2-内容い)
[instance作成と同時に色々処理したいときの`__construct()`](#3-内容ろ)
[instanceが継承元classのプロパティとメソッド取得するための`static`と`self`コンビ](#4-内容は)
[①instanceごとに好き勝手させないための`abstract`](#5-おわりに)
[①instanceごとに好き勝手させないための`interface`](#5-おわりに)

# classの作り方
classとはプロパティ(変数)とメソッド（関数)をグルーピングしたもの。
> 変数や関数は、小規模開発の際は名前のつけたで管理できるが、人間なので、沢山できてくると関数や変数名を重複してうわがいてしまったり、やたら関数や変数名が長くなってしまったり、まったく関係ない処理を作りたいのに他の処理と競合してしまわないかと気を使ったりなど非効率なので、「商品情報を処理する変数と関数」「ユーザー情報を処理する変数と関数」「購入情報を処理する変数と関数」という処理に必要なプログラムをグルーピングして管理しやすくしよう！という先人の偉大な産物。

> ”設計書”と例えられることが多いが、”設計書”であるclass内のプロパティやメソッドを使うこともあり、この後出てくるが継承元にも継承先にもなるため、実態がないというイメージは持たない方が良い。

# 作り方
```php
class 

継承元class=全ての個人の共通処理
親class=
instance=個人
```

メモ
インスタンス化できない
通常クラスの継承は、メソッド名と処理内容含め継承できるため、重複処理の記述を激減できる
abstractクラスはメソッド名のみ継承で、処理内容は継承先でそれぞれ記述する、プログラム処理上メソッド名を統一したい、最低限必要な共通メソッド名なので漏れないでほしい
abstractクラスは処理を書かないので当然__constructはかけない、そのため

abstractクラス：最低限必要なメソッド名を定義(抽象的な定義)
通常クラス：abstractクラスから継承したメソッドの処理を記述＋__constructでインスタンス化した時の共通処理を記述(具体的な処理内容の記述)

abstractクラス(抽象的な定義)
↓
通常クラス(具体的な処理内容の記述)
↓
インスタンス(決められたプロパティとメソッドの取得作業)
まだGUIで消耗してるの？vSphereをターミナルから操ろう👨🏽‍💻

Flash終了でvSphereクライアントが使えなくなるし、たまにはCLIから操作してみませんか！？

## tl; dr
1. MacにPowerShellを入れる
2. PowerCLIを入れる
3. Happy Hacking

## 導入方法

### MacにPowerShellを入れる
[OSS化した](https://techtarget.itmedia.co.jp/tt/news/1810/09/news04.html)おかげで、あの！PowershellがMacで使えるようになった。
こんなの誰が使うんや…。

```
$ brew cask install powershell
$ pwsh

PS /Users/username/>
```

### PowerCLIを入れる
PowerCLIはVMWareの各製品をCLI上で操作できるツールらしい。
Powershell上からワンコマンドで導入できる。
https://docs.vmware.com/jp/VMware-vSphere/6.5/com.vmware.vsphere.install.doc/GUID-F02D0C2D-B226-4908-9E5C-2E783D41FE2D.html

```
PS /Users/username> Install-Module -Name VMware.PowerCLI -Scope CurrentUser

Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its InstallationPolicy value by running
the Set-PSRepository cmdlet. Are you sure you want to install the modules from 'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): Y
```

### Happy Hacking!
以上でvSphereへのログイン→操作→ログアウトという一連の操作ができるようになる。

```
PS /Users/username> Connect-VIServer -Server HOSTNAME -User ****** -Password ******
PS /Users/username> Get-VM
PS /Users/username> Disconnect-VIServer
```

## 真面目に使う
公式に[PowerCLI上で使えるコマンドレット一覧](https://code.vmware.com/docs/4721/cmdlet-reference)がある。
Powershellの勉強も必要だが、スクリプト(.ps1)を組めば運用自動化も夢じゃない！？

### 事例No1. IPの衝突
帳簿上空いているはずのIPにPingを打ったら通ってしまった…。
arpコマンドでMacアドレスがわかったが、ホスト名がわからない…。
それ、PowerCLIなら解決できます。

```
PS /Users/username> Get-VM | Get-NetworkAdapter | select Parent,MacAddress | where MacAddress -eq XX:XX:XX:XX:XX:XX

Parent    MacAddress
------    ----------
bad_host XX:XX:XX:XX:XX:XX
```
Get-VMコマンドでVM一覧を取得。
パイプで渡ってきたVM一覧オブジェクトのネットワークアダプタ情報を取得。
さらにパイプで渡ってきたネットワークアダプタ情報のうちParent, MacAddress列だけを射影。
最後にMacAddressがXX:XX:XX:XX:XX:XXと等しい行だけを選択。

### 事例No2. 電源オフは誰？
サーバーを複数台SSHからシャットダウンした。
本当に停止したか確認したいが、GUIは更新が遅くて仕事にならない…。
それ、PowerCLIなら解決できます。

```
PS /Users/username> Get-VM | Where { $_.PowerState -eq "PoweredOff" }

Name   PowerState Num CPUs MemoryGB
----   ---------- -------- --------
host1  PoweredOff 6        31.781
host2  PoweredOff 6        31.781
host3  PoweredOff 8        128.000
hosw4  PoweredOff 6        31.781
```

## 参考
https://qiita.com/testnin2/items/f4c1cd81fa800fddd561
最大化ボタン無効化

![image01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/ba9ef7a9-927b-1186-7e42-5b7906b9a7ea.png)


```xml:MainWindow.xaml
<Window
    x:Class="SampleApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:SampleApp"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="300"
    Height="200"
    ResizeMode="CanResizeWithGrip"
    SourceInitialized="Window_SourceInitialized"
    mc:Ignorable="d">
    <Grid />
</Window>
```

```Csharp:MainWindow.xaml.cs
using System;
using System.Runtime.InteropServices;
using System.Windows;

namespace SampleApp
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// ウィンドウに関するデータを取得
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="nIndex"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

        /// <summary>
        /// ウィンドウの属性を変更
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="nIndex"></param>
        /// <param name="dwNewLong"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

        /// <summary>
        /// ウィンドウスタイル
        /// </summary>
        private const int GWL_STYLE = -16;

        /// <summary>
        /// 最大化ボタン
        /// </summary>
        private const int WS_MAXIMIZEBOX = 0x0001_0000; // C#7より前の場合は 0x00010000

        public MainWindow()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 初期化時
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_SourceInitialized(object sender, EventArgs e)
        {
            IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper((Window)sender).Handle;
            int value = GetWindowLong(hwnd, GWL_STYLE);
            SetWindowLong(hwnd, GWL_STYLE, (int)(value & ~WS_MAXIMIZEBOX));
        }
    }

}
```
Pyxelの環境構築（Mac）


Pyxelというレトロゲームエンジンの環境構築手順についてまとめておきます。

Mac向けの解説となっています。

# Pyxelとは

Pythonでレトロ風のゲームを開発することのできるゲームエンジンです。
githubで公開してくれているので詳しくはこちらを見てください。
[https://github.com/kitao/pyxel](https://github.com/kitao/pyxel)

# Pyxelの環境構築

この順番で説明していきます。

- Homebrewのインストール
- Python3のインストール
- Pyxelのインストール

## 手順1

Pyxelを使うためには、Python3のインストールが必要です。（Macに標準でインストールされているPythonはバージョンが古く、Pyxelが動作しません。）
そして、Python3をインストールするために、Homebrewを使うと便利ですのでインストールしていきます。

まず、Mac標準のアプリケーションのターミナルを開いて、下のコードを入力して実行してください。（$マークは入力しなくて大丈夫です！！）

```
$ brew -v
```

実行結果が下のようになった場合は、homebrewがすでにインストールされています。__手順4__に進んでください

```
Homebrew 2.5.5
Homebrew/homebrew-core
```

実行結果が下のようになった場合はHomebrewがインストールされていません。__手順2__に進んでください。

```
command not found
```

実行結果が下のようになった場合はHomebrewが正しくインストールされていません。__手順3__に進んでください。

```
Homebrew 2.5.5
Homebrew/homebrew-core N/A
```

## 手順2

下のコードを実行してください。なにかウィンドウが出てきた場合、画面の指示にしたがってインストールしてください。
また、press RETURN ・・・ と表示された場合はEnterキーを、password: と表示されたら自分のパソコンのログインパスワードを入力してください。

```
$ xcode-select --install
```

終了したら、次に下のコードを実行してください。かなり時間がかかります。
先ほどと同じように、press RETURN ・・・ と表示された場合はEnterキーを、password: と表示されたら自分のパソコンのログインパスワードを入力してください。

```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

終了したら、__手順4__に進んでください。

## 手順3

下のコードを実行してください。

```
$ brew update-reset
```

終了したら、次に下のコードを実行してください。かなり時間がかかります。
press RETURN ・・・ と表示された場合はEnterキーを、password: と表示されたら自分のパソコンのログインパスワードを入力してください。

```
$ brew doctor
```

終了したら、__手順4__に進んでください。

## 手順4

Homebrewがインストールされたと思うので、次にPython3のインストールを進めていきます。

下のコードを実行してください。そこそこ時間がかかります。

```
$ brew install python3 gcc sdl2 sdl2_image gifsicle
```

終了したら、__手順5__に進んでください。

## 手順5

Python3がインストールされたと思うので、最後にPyxelをインストールしていきます。

下のコードを実行してください。

```
$ pip3 install -U pyxel
```

__これで、Pyxelでレトロゲームを作る準備は終了です！！！__

# まとめ

お疲れ様です！！
かなり時間がかかったと思いますが、これでPyxelを使えるようになっているはずです。
Pyxelの使い方についてはたくさん記事があると思うので各自調べてやってみてください！

最後まで読んでいただきありがとうございました！
間違った内容がありましたらご指摘いただけると嬉しいです！

# 参考

- [https://github.com/kitao/pyxel](https://github.com/kitao/pyxel)
テスト17

```vb

Sub test()

Dim wb As Variant
Dim i As Long

Set wb = ThisWorkbook.Worksheets("Sheet5")

'---------------------------------
'データ作成用コード

For i = 2 To 40

Select Case wb.Cells(i, "A").Value

    Case "東京"
    
        wb.Cells(i, "B").Value = 100
        
    Case "千葉"
    
        wb.Cells(i, "B").Value = 200
        
    Case "神奈川"
    
        wb.Cells(i, "B").Value = 300
        
    Case "北海道"
    
        wb.Cells(i, "B").Value = 400
    
    Case "埼玉"
    
        wb.Cells(i, "B").Value = 500
        
    End Select

Next i

End Sub

'--------------------------------------
'並べ替え用コード

With ActiveSheet '対象シートをアクティブにする
    
    .Sort.SortFields.Clear '並び替え条件をクリア
    
    '項目1
    .Sort.SortFields.Add _
        Key:=ActiveSheet.Cells(1, 1), _
        SortOn:=xlSortOnValues, _
        Order:=xlAscending, _
        DataOption:=xlSortNormal
        
    '項目2
    .Sort.SortFields.Add _
        Key:=ActiveSheet.Cells(1, 2), _
        SortOn:=xlSortOnValues, _
        Order:=xlAscending, _
        DataOption:=xlSortNormal
    
    '項目3
    .Sort.SortFields.Add _
        Key:=ActiveSheet.Cells(1, 3), _
        SortOn:=xlSortOnValues, _
        Order:=xlAscending, _
        DataOption:=xlSortNormal
        
    With .Sort '並び替えを実行する
        .SetRange Range(Cells(1, 1), Cells(13, 4))
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        
End With

'--------------------------------------
' 複数条件で集計

'=SUMIFS(D2:D40,B2:B40,100,C2:C40,30)

'--------------------------------------


'メモ(Accessの高速化)
Application.Echo False '画面の描画を止める
・・・処理を実行する・・・
Application.Echo True '画面の描画を行う


'メモ(rowsメソッドは失敗しました、の対策)
Set xl = CreateObject("Excel.Application")

xl.Visible = True
Set xlWb = xl.Workbooks.Open("c:\tmp\test.xlsx")
Set xlSh = xlWb.Sheets(1)
'xl.Sheets(1).Select
int行数 = xlSh.Cells(xlSh.Rows.Count, "A").End(xlUp).Row

'シート→ブック→エクセルの順で閉じていく
Set xlSh = Nothing
xlWb.Close: Set xlWb = Nothing
xl.Quit: Set xl = Nothing


End Sub

```
さくらのレンタルサーバ（スタンダードプラン以上）にアップロードしているファイルを手元のPCに scp コマンドでダウンロードする


さくらのレンタルサーバ（スタンダードプラン以上）にアップロードしているファイルを手元のPCに scp コマンドでダウンロードする際のオプションのサンプルです。

さくらのレンタルサーバのホームディレクトリの下の「temp」ディレクトリの中にある「sample.zip」というファイルをダウンロードします。

```
scp example@example.sakura.ne.jp:/home/example/temp/sample.zip ./
```

※example : さくらのレンタルサーバの初期ドメイン(のサブドメイン部分)

- 検索用キーワード：さくらサーバー
Rで無限混合ガウスモデルへの道.3(未完成)

# 記事の目的
分散も確率変数の場合の混合ガウスモデルの周辺化ギブスサンプリングをRで実装することです。
参考書籍: [佐藤一誠. ノンパラメトリックベイズ. 講談社. 2016](https://www.amazon.co.jp/%E3%83%8E%E3%83%B3%E3%83%91%E3%83%A9%E3%83%A1%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%83%99%E3%82%A4%E3%82%BA-%E7%82%B9%E9%81%8E%E7%A8%8B%E3%81%A8%E7%B5%B1%E8%A8%88%E7%9A%84%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E6%95%B0%E7%90%86-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%BD%90%E8%97%A4-%E4%B8%80%E8%AA%A0/dp/4061529153/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)
この書籍のアルゴリズム4.4に対応します

# 目次

[1. モデルの説明](#1-モデルの説明)
[2. 使用データ](#2-使用データ)
[3. 分散固定の混合ガウスモデルのギブスサンプリング](#3-分散固定の混合ガウスモデルのギブスサンプリング)
[4. クラスタリング確認](#4-クラスタリング確認)

#1. モデルの説明

![IMG_0166.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/c7c60e66-8b61-e8b6-6614-aefe2511066f.jpeg)
#2. 使用データ
```R:
> X <- iris[,1:4]
> D <- ncol(X)
> N <- nrow(X)
> head(X)
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1          5.1         3.5          1.4         0.2
2          4.9         3.0          1.4         0.2
3          4.7         3.2          1.3         0.2
4          4.6         3.1          1.5         0.2
5          5.0         3.6          1.4         0.2
6          5.4         3.9          1.7         0.4
> 
```

#3. 分散固定の混合ガウスモデルの周辺化ギブスサンプリング
```R:
library(dplyr)
library(mvtnorm)
# (1)
K <- 3
# (2)
z <- rep(1:K,N)[1:N]
# (3)
r <- 1
a0 <- 1
b0 <- 1

# (4)
m <- matrix(NA, nrow=K, ncol=D)
alpha <- 100
t <- matrix(NA, nrow=N, ncol=K)
n <- {}
max.iter <- 5
a <- 2*a0+(N-1)*D
x.av <- X %>% apply(2, mean)
x.av <- matrix(rep(x.av,each=N-1), nrow=N-1, ncol=D)
x.k.i <- matrix(NA, nrow=K, ncol=D)

for(s in 1:max.iter){
  # (ⅰ)
  for(i in 1:N){
    X.i <- X[-i,]
    rownames(X.i) <- 1:(N-1)
    z.i <- z[-i]
    x.av.i <- X.i %>% apply(2, mean)
    for(k in 1:K){
      # x.k\i
      x.k.i[k,] <- X.i[z.i==k,] %>%  apply(2, mean)
      # n\i
      n[k] <- z.i[z.i==k] %>% length()
      # m\i
      m[k,] <- n[k]*x.k.i[k,]/(n[k]+r)
    }
    #b\i
    b <- 2*b0+(unlist(X.i-x.av) %*% unlist(X.i-x.av))+(N-1)*r/N*(unlist(x.av.i) %*% unlist(x.av.i))
    for(k in 1:K){
      t[i,k] <- dmvt(as.numeric(X[i,]), delta=m[k,], df=a, sigma=(1+1/N)*b[1]*diag(D))*((n[k]+alpha)/(sum(n)+alpha*K))
    }
    z_prob <- t[i,]/ sum(t[i,])
    z[i] <- rmultinom(1, 3, z_prob) %>% which.max()
  }
}

```

#4. クラスタリング確認
```R:
library(cluster)
par(mfrow=c(1,2))
clusplot(X, iris[,5], color=TRUE, shade=FALSE, labels=4, lines=0)
clusplot(X, z, color=TRUE, shade=FALSE, labels=4, lines=0)
```

>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/920e6a32-4d63-8644-20ee-10c0892c270f.png)

#補足
コードの雰囲気は良い感じだったんですが、全然クラスタリングできてない…
おそらくt分布の式が違うんですが、対処法がわかりしだい修正します、、、
誰か間違いが分かる人いたら教えて欲しいです😥
最初にVSCodeのスニペットは作っておこう

Next.jsで開発をしていてコンポーネントを新しく作るとき、今までは`rafce`コマンドしていました。

```tsx:SampleComp.ts
import React from 'react'

const sample = () => {
  return (
    <div>
      
    </div>
  )
}

export default sample

```


##でもなんか気に食わない
でも色々気に食わないところがありした。例えば...

**・型がついていない**
**・最初っからdivタグなのは嫌だ**
**・そもそも`rafce`ってコマンドが気に食わない**



##理想
Reactの関数コンポーネントを作るのであれば`React Functional Component`ってことで頭文字取って`rfc` で呼び出したい。
（完成イメージ）

```tsx:SampleComponent.ts
import React, { FC } from 'react'

export const SampleComp: FC = () => {
  return (
    <>
      <p>this is sample</p>
    </>
  )
}
```

##そんな時は自作しよう
VSCodeを開いて、設定のUserSnippetsを選択します。
![Screen Shot 2020-10-28 at 19.25.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386558/85563de9-47dc-b3a3-856a-3226c54c9a71.png)

そうすると検索バーが出てくるので、そこで言語を選択します。
（今回はNext.jsでTypeScriptを使いたいので`typescriptreact.json`を選択）
![Screen Shot 2020-10-28 at 19.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386558/a7f87272-10c0-5c47-f1fe-198a62fb4949.png)

するとTypeScriptでReactを書くときのスニペットを設定するjsonファイルが出てくるので、ここに色々書いていきます。
![Screen Shot 2020-10-28 at 19.33.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386558/806bb09a-eb51-a03d-a531-05570cdb30c2.png)

何やらExampleがあるので、それを見てみると
![Screen Shot 2020-10-28 at 19.35.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386558/931c3a93-0110-55a7-5d9b-65c469a427a7.png)

説明すると

　`prefix:`　トリガーとなるコマンドを書く。これを打つと`body`に設定したスニペットが展開される。
　`body:`　ここにスニペットを書いていく。配列にすれば複数行のスニペットが作れる。`$1`と書いたところに最初カーソルが当たっている。`$2`, `$3`としておくと、Tabで移動できる。
　`description:`　説明文。なくても発動するけど未来の自分のためになるべく書いておこう。

と言うことです。なのでこれを自分好みに書き変えます。

```json:typescriptreact.json
{
  "console.log": {
    "prefix": "cl",
    "body": "console.log($1)",
    "description": "console.log"
  },
  "React Functional Component": {
    "prefix": "rfc",
    "body": [
      "import React, { FC } from 'react'",
      "",
      "export const $TM_FILENAME_BASE: FC = () => {",
      "  return (",
      "    <>",
      "      $1<p>this is sample</p>",
      "    </>",
      "  )",
      "}",
      ""
    ],
    "description": "create React Functional Component"
  }
}
```

コンポーネント名をファイル名と同期させたい時はVSCode公式が用意してくれる`TM_FILENAME_BASE`定数を使います。

他にも色々あります。（[VSCode公式](https://code.visualstudio.com/docs/editor/userdefinedsnippets)）
　`TM_FILENAME`　拡張子つきのファイル名
　`WORKSPACE_NAME`　今のワークスペース名
　`CURRENT_MONTH_NAME` Julyとかで今月が出てくる

#完成品
いい感じだ
![Screen Shot 2020-10-28 at 20.52.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386558/bc64113d-4fff-fda1-b490-6150655e5423.png)



#まとめ
・prefixでコマンド登録！
・bodyにスニペットを書く！
・保存！
・色々変数が使える！

#参考リンク
VSCode公式
https://code.visualstudio.com/docs/editor/userdefinedsnippets

分かりやすかったYouTube動画
https://www.youtube.com/watch?v=KhaQw923268&ab_channel=Code2020
HerokuでSequel ProからClearDBに接続する方法


### 1. HerokuのCLEARDB_DATABASE_URLを確認する
<br>
`コマンドを実行`


```
$ heroku config --app アプリ名
```

:point_down:CLEARDB_DATABASE_URLの情報が表示される

```

CLEARDB_DATABASE_URL: mysql://ユーザー名:パスワード@ホスト/データベース?reconnect=true
```
<br>
### 2.表示されたCLEARDB_DATABASE_URLの情報をバラして入力する
標準接続モードを選択
![スクリーンショット 2020-10-28 20.44.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/828524/03c1518c-237e-ad37-8a93-55035867089a.png)
以上
gistが使いづらかったのでキータに戻る

本日、gistに移転しようと考えて使っていたのですが、
シンプルすぎて使いづらく、キータ に戻ろうと思います。

gistの利点は
「Revisition機能」があり、更新するごとに変更点を見れること。

gistとキータの共通点は
「マークダウン」、「シンタックスハイライトがある」、
「インターネットに残るもの」

違う点は
「記事を書いている途中にプレビューが出る」
「記事を書いた後に右側に見出しが出る」

キータの方が便利だったので、こちらを勉強過程のアウトプットに使おうと思います。

よりメモ的に使うならばgistの方がいいのかもしれません。
Revisition機能があるので。

より質の高い情報発信のためにキータを使えればいいなと思っていたのですが、
とにかく書いていてストレスがない方が良いと考えたので、戻ります。


<a href="https://gist.github.com/yottodest021">書きかけのgist</a>
TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'となったときの対応方法

- 環境
    - macOS Catalina バージョン10.15.7
    - Python 3.8.5
    - pandas 1.1.3


# 事象 : TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'
時間を引き算したら怒られた

```bash
Traceback (most recent call last):
  File "/Users/mananakai/tryPython/main.py", line 30, in calc_diff
    diff = end - start
TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'
```

```py
def calc_diff(start, end):
    diff = end - start
    print(diff)
```

## 原因 : datetime.timeとdatetime.dateはそのままじゃ計算できない
- [[python] datetime.time型で時間の足し引き](https://qiita.com/tekitoh/items/00f5afe0faadb27846b0)

時間情報(datetime.time)、日付情報(datetime.date)だけでは計算できない。
計算には、日時情報(datetime.datetime)を使う。


### 対応 : datetime.datetimeに変換して計算する
計算結果は、時刻間の差情報(datetime.timedelta)になる

```py
def calc_diff(start, end):
    today = datetime.date.today()
    d_start = datetime.datetime.combine(today, start)
    d_end = datetime.datetime.combine(today, end)
    diff = d_end - d_start
    print(type(diff)) # >> <class 'datetime.timedelta'>
```
JavaでSSLデバッグするときの設定


# 目的

件名の通り、JavaでSSLデバッグするときの設定の覚書です

# 設定方法

Javaの起動オプションで `javax.net.debug` のプロパティ値を `all` か `ssl` に設定します

PaaSなどで起動オプションを明示的に利用しないときは、環境変数 `JAVA_OPTS` に `-Djavax.net.debug=all` のように設定しています

# 参考
https://docs.oracle.com/javase/jp/11/security/java-secure-socket-extension-jsse-reference-guide.html#GUID-31B7E142-B874-46E9-8DD0-4E18EC0EB2CF
Slack独自のMarkdown記法　チートシート

#はじめに
Slack独自の記法ルールを自分用にまとめました。
紹介したもの以外にルールがありましたら、教えて欲しいです！！

## 太字
__対象のテキストの前後を「`*`」で囲みます__ 


## 斜体
対象のテキストの前後を`_`で囲みます

## 取り消し線
~~対象のテキストの前後を「`~`」で囲みます~~

## インラインコード
`対象テキストの前後を「``` ` ```」で囲みます`

## コードブロック

```
対象テキストの前後を「```」で囲みます
```

## 引用タグ
>テキストの先頭に`「>」`を付ける

## 順序付きリスト
1. テキストの先頭に「`1`」と「`.`」、スペースを付ける
2. テキストの先頭に「`1`」と「`.`」、スペースを付ける

## 箇条書き
* テキストの先頭に「`*`」、スペースを付ける
* テキストの先頭に「`*`」、スペースを付ける 

## 絵文字
対象テキストの前後を「`:`」で囲みます

##チャンネルへのリンク
テキストの先頭に「`#`」を付ける

#参考
* [メッセージの書式設定](https://slack.com/intl/ja-jp/help/articles/202288908-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E6%9B%B8%E5%BC%8F%E8%A8%AD%E5%AE%9A)
* [slack でのいろんな表記方法] (https://qiita.com/sheercat/items/186c71af92c9494ab26f)
* [Slack のメッセージ記法と Markdown を比較してみる](https://qiita.com/tk0miya/items/63ae78cede0eb57f6d07)
macOS CatalinaでVirtualBoxの仮想マシンが立たない(解決)

## 環境
macOS Catalina ver10.15.3
VirtualBox ver6.1.14 (2020/10/28現在最新バージョン)

# エラー発生
Kali Linuxを入れた仮想マシンを立ち上げようとすると、突然起動が中断し、「VirulBox VM が予期しない理由で終了しました」と出てしまいました。
調べてみると色々と記事が上がっていました。

https://qiita.com/Syn256/items/9a53280cd3a92cd1939f
https://forums.virtualbox.org/viewtopic.php?f=8&t=95041&start=1
https://ameblo.jp/arcadia-8160/entry-12535127793.html

# 自分の環境で解決した方法
色々なことを試していたので、全てはいらないかもしれないし、いるかも知れません。

## １つ目
Macの[システム環境設定]> [セキュリティとプライバシー]> [プライバシー]
にある「アクセスビリティ」と「入力監視」にVirtualBoxを追加しました。

この時点で、VirtualBoxを立てもエラーで落ちる。

## ２つ目
コマンドラインでVirtualBoxを起動しました。

virtualBoxの起動(必要ないかも)

```
$ virtualBox
```
仮想マシンの起動

```
$ VBoxManage startvm "仮想マシン名"
```
すると、エラーが発生せず起動しました。

以降も、コマンドラインで起動すると正常に立ち上がりました。

# 終わりに
結局、１つ目の設定はいるのかどうかはわかりません。しかし、もし外して、またVirtualBoxが立たなくなってしまったら面倒なので、このままにしておきます。しかし、問題がわからないので、怖いですね....。

# 参考
https://qiita.com/Syn256/items/9a53280cd3a92cd1939f
https://forums.virtualbox.org/viewtopic.php?f=8&t=95041&start=1
https://ameblo.jp/arcadia-8160/entry-12535127793.html
新米エンジニアを手助けしてくれる無料ツール

## はじめに


ここには思いついた順に書いていきます。

関数名
https://codic.jp/

ここにも記載したのですが、最終的に名詞なのか動詞なのか間違いやすい。
また、登録もできるので、統一感を出すことが可能。
GitHub Actions self-hosted runnerをインストールしてCI/CDを実行

以下のガイドを見ながら実際にインストールを行った．

[Adding self-hosted runners](https://docs.github.com/en/free-pro-team@latest/actions/hosting-your-own-runners/adding-self-hosted-runners)

GitHubリポジトリにアクセスして，Settings → Actionsを選ぶ．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/b5df7b5c-829a-b255-c3fb-3f6c1b3592a4.png)

Add runnerを選ぶ．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/ae66d26a-a151-f195-bd98-821a695d9c11.png)

利用するプラットフォームとアーキテクチャを選ぶ．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/d3c2fe3e-5f76-75a8-ff19-0e016839f548.png)

インストール方法に沿ってコマンドを実行する．

```
sudo mkdir /opt/actions-runner
cd /opt/actions-runner
chown `whoami`: /opt/actions-runner
curl -O -L https://github.com/actions/runner/releases/download/v2.273.5/actions-runner-linux-x64-2.273.5.tar.gz
tar xzf ./actions-runner-linux-x64-2.273.5.tar.gz
./config.sh --url https://github.com/cdsl-research/stns-config --token XXXXXXXXXXXXXXXXXXXXXX
```

実行結果は以下になる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/8b72fb2a-3bde-c731-476f-28db54b443ac.png)

起動スクリプトでRunnerを起動する．

```
./run.sh
```

実行結果は以下になる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/ce4854aa-f120-e281-78da-a91311121e67.png)

Runnerの実行時の起点ディレクトリは次のパスになる．

```
/opt/actions-runner/_work/repository_name/repository_name/
```

実際に `.github/workflows/xxx.yml` を作成してみる．

```yaml
name: Sample Workflows

on:
  push:
    branches:
      - master

jobs:
  deploy:
    runs-on: self-hosted
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
      - name: Setup Python
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
      - run: |
          python a.py
```

以下は実行結果は次のようになる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/069416fd-d804-3c06-5eed-c2d7cc7ce14e.png)

systemdのserviceファイルを書く．[テンプレート](https://docs.github.com/en/free-pro-team@latest/actions/hosting-your-own-runners/configuring-the-self-hosted-runner-application-as-a-service#customizing-the-self-hosted-runner-service)を公式が提供している．

```systemd:/etc/systemd/system/github-actions-runner.service
[Unit]
Description=GitHub Actions Runner
After=network.target

[Service]
WorkingDirectory=/opt/actions-runner
User=gha-runner
Group=gha-runner
ExecStart=/opt/actions-runner/bin/runsvc.sh
Restart=always
KillMode=process
KillSignal=SIGTERM
TimeoutStopSec=5min

[Install]
WantedBy=multi-user.target
```

ユーザを追加

```bash
sudo useradd gha-runner
```

ディレクトリの所有者を変更

```
sudo chown -R gha-runner: /opt/actions-runner
```

systemdへ追加して永続化と起動

```bash
sudo systemctl daemon-reload
sudo systemctl enable --now github-actions-runner
```
VSCodeを開くとソース管理が5000件と表示される。

Qiita初投稿となります。

VScodeを開くとアクティブな変更が多すぎますと警告が出る。

サイドバーを見るとソース管理の部分が5000件になっていた。
無視しようと思いましたが、すごく気になる。。。

それから、ググっても中々出てこず1時間格闘の末に
次の記事を見つけました。

[Visual Studio CodeとGitHubの連携]
(https://note.com/kinako1525/n/n390c40a7e849)
>ソース管理が5000件と表示された時の対処法
無事、ダウンロードが済んだところで何故かソース管理が5000件になっていました...。
調べてみたところ、いつの間にか隠しフォルダの.gitができていたのが原因のようです。

Gitの学習を中途半端にしていた事があり、
久しぶりに触った時に`git init`を入力した事を思い出しました。

実際に確認すると隠しフォルダに
.gitフォルダが作成されていましたので削除。
記事通り消すことができました。

一応、念の為に隠しフォルダの探し方も載せておきます。

隠しフォルダの探し方

`command + shift + .`

これはすぐに出てきたのですが、
肝心のホームディレクトリをどこで表示させるのかわからず。

またググらせていただき、次の記事を見つけることができました。

[ターミナルからFinderを開く](https://qiita.com/ShinichiOkayama/items/53ddd4cdeb82b3e37efb)

ターミナルで次のコマンドを入力
`open ~`

以上を踏まえて、結果的には下記の手順ですね。

1 . `open ~`　ターミナルからホームディレクトリを開く
2 . `command + shift + .` 隠しフォルダを表示→.gitフォルダ削除

これで解決したという話です。

以上、ほとんど無いエラーだと思いますが、
私のメモ代わりに投稿させていただきました。
Webサイトのユニバーサルデザイン(Webアクセシビリティ)について

#プログラミング勉強日記
2020年10月28日
Webサイトをユニバーサルデザインに基づいて作成するために大切なことをまとめる。

#ユニバーサルデザインとは
　ユニバーサルデザインについて調べると下記が出てくる。([引用元](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3))

> ユニバーサルデザイン（Universal Design、UD）とは、文化・言語・国籍の違い、老若男女といった差異、障害・能力の如何を問わずに利用することができる施設・製品・情報の設計（デザイン）をいう。

　Webサイトにおけるユニバーサルデザインも考え方は同じで、すべての人がWebサイトで提供される情報を利用できるようにすることである。特に<b>Webアクセシビリティ</b>と呼ばれる。

#気を付けるべき点
　Webのデザインで気を付けるポイントは以下の3つである。

- 文字サイズは読みやすい大きさに
- 色の使い方を気を付ける
- 「色の見え方」を考える

##文字サイズは読みやすい大きさにする
　高齢の方のインターネット利用も増えていることもあり、あらかじめ読みやすい大きさの文字サイズにしておくと良い。
　ニュースサイトなどの幅広い年齢の方が読むサイトの本文のサイズは15~16pxが多い。ニュースサイトのように文字数の多いWebページでは、文字サイズを大きくしすぎると1行に入る文字数が少なくなってしまうので、読みにくくなる可能性もあるのでそういった場合は注意が必要である。なので、フォントサイズを変更できるボタンなどを設置することが良かったりもする。

##色の使い方に気を付ける
　加齢によって色彩識別能力が低下するといわれており、これによって文字サイズを大きくしたとしても色の組み合わせによっては見にくくなってしまうことがある。なので、色の組み合わせを考える。（具体的には、色のコントラストを上げるといったことをすると良い）

##「色の見え方」を考える
　色の見え方は人によって異なるので、Photoshopの画面の表示からP型(1型)色覚、D型(2型)色覚を選択するなどしてシミュレーションを行い、色の確認をする必要がある。


#参考文献
[まずはここから！Webの「ユニバーサルデザイン」をはじめよう！](https://webbu.jp/universaldesign-3484)
[伝わるWebサイト「Webサイトをユニバーサルデザインに！」](https://www.asobou.co.jp/blog/web/universal-design)
Performance Testing Extensionの導入メモ

# はじめに
Unityでベンチマークをとるにあたり、以下の記事にあるPerformance Testing Extensionを試してみたので手順をメモしておく。
https://blogs.unity3d.com/jp/2018/09/25/performance-benchmarking-in-unity-how-to-get-started/

記事作成日（2020/10/28）時点で最新のドキュメントは以下の通り。（バージョン 2.3.1 preview）
https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.3/manual/index.html

# 手順
ドキュメント通りに設定すればいいが、わかりやすいようにキャプチャもつけてメモしておく。

## manifest.jsonにパッケージを追加
パスは `{Project}/Package/manifest.json` にある。

```manifest.json
{
  "dependencies": {
    "com.unity.test-framework.performance": "2.3.1-preview",
  }
}
```

## TestRunnerの準備
使用するパッケージはドキュメントに書いてある通り、TestRunnerの拡張機能なため、TestRunnerの準備をする。
>The Performance Testing Extension is intended to be used with, and complement, the Unity Test Runner framework.

TestRunnerについては以下の記事を参照するとわかりやすいため詳細は割愛する。
https://light11.hatenadiary.com/entry/2020/07/01/200253

## アセンブリに参照を追加
テスト用のAssembly Definition FileのAssembly Definition Referencesに `Unity.PerformanceTesting` を追加する。

![スクリーンショット 2020-10-26 19.15.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304453/d192f1ff-9894-ad86-3f4c-d54017a9f824.png)

Assembly Definitionについては以下の記事を参照するとわかりやすい。
https://qiita.com/toRisouP/items/d206af3029c7d80326ed

## テストコードを書く
テストするメソッドに Performance 属性を追加する。
詳細はドキュメントのサンプルを参照のこと。
https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.3/manual/index.html#taking-measurements

```csharp:Test.cs
[Test, Performance]
public void Test()
{
    Measure.Method(() => { ... }).Run();
}
```

## テスト実行
TestRunnerを実行すると、TestReportでパフォーマンスの結果を確認することができる。
メニューの `Window → Analysis → Performance Test Report` からウィンドウを開くことができる。

テストの結果は以下のドキュメントのように表示される。
https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.3/manual/index.html#viewing-performance-test-report

詳細はドキュメントを参照のこと。
https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.3/manual/index.html#output

# 番外編
テスト用のアセンブリで [MessagePack for C#](https://github.com/neuecc/MessagePack-CSharp) を参照する時に必要なものをメモしておく。
必要なのは以下の3つ。

- Assembly Definition References
  - MessagePack
  - MessagePack.Annotations
- Assembly References
  - System.Memory.dll

![スクリーンショット 2020-10-26 19.43.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304453/50bcc576-10aa-0cd8-f581-fc49459646ab.png)
【Ruby on Rails】try(:[ ], :key)を読み解く

## はじめに

```ruby
user.try(:[],:name)
```
初めてこのコードを見た時、
「なんで空の配列をメソッドの部分に入れているんだ、、、？」
と思いました。
Ruby(Rails)の文法をすっ飛ばしてきた弊害ですね、、、


##そもそもRailsのtryとは？

Active Supportに搭載されているメソッド (Rubyだけでは使えない)
対象のオブジェクトがnilでない時のみ、指定したメソッドを使う
第一引数に使いたいメソッド、第二引数にその引数(必要であれば)を与えます


``` ruby
user = {name: "test"}

# user[:group]がnilであるため、メソッドエラーが起きる
user[:group].replace("A")
# => NoMethodError: undefined method 'replace' for nil:NilClass

# nilな対象に対してtryを使うとエラーは起きず、nilが帰ってくるだけ
user[:group].try(:replace,"A")
=> nil
```

## 空の配列がメソッドに？

それでは本題ですが、rubyのHashには[]のメソッドがあります。
引数にkey名を取ってそのvalueを返します。

```ruby
user.[] :name
=> "test"
# これはuser[:name]と同じ
```

ちなみに、「+」などもメソッドとして使えます。

```ruby
user[:name].+ 2
=> "test2"
```

<br>


今回の場合はtryとこのメソッドの組み合わせなので

```ruby
user.try(:[],:name)
=> "test"
```
という結果が返ってきます。

## まとめ
[]についてなかなかヒットしなかったので少し理解に苦しみました。
ruby/railsの文法を勉強し直します、、、
組合せ最適化で、書籍を平らに積んでみよう

## 背景

> ノートPCでオンライン会議をしようとしています。
> ノートPCの位置が低いので、カメラの角度が下からになっています。
> 急いでノートPCの高さを高くしたいのですが、手元で使えるのがいくつかの書籍しかないです。
> ノートPCは書籍より大きいので、書籍を2列に積む必要があります。また、2列の書籍の高さが違うとバランスが悪いので、2列の書籍の高さは同じくらいにしたいです。

## 問題

> いくつかの書籍を2列に積んでなるべく高くしてください。
> そのとき2列の書籍の高さの差は1ミリメートルまでにしてください。

## 考え方

組合せ最適化を使って解きます。
手順としては、問題を定式化して、Pythonでモデルを作成してソルバーで解きます。
「[最適化におけるPython](https://qiita.com/SaitoTsutomu/items/070ca9cb37c6b2b492f0)」も参考にしてください。

## 定式化

- 入力パラメーター
    - `books`：各書籍の高さ
    - `limit`：2列の高さの差の上限
- 変数
    - `obj`：2列の高さのうち低い方
    - `suml`：左の列の高さ
    - `sumr`：右の列の高さ
    - `vl`：各書籍ごとに左の列に積むかどうか（0:積まない、1:積む）
    - `vr`：各書籍ごとに右の列に積むかどうか（0:積まない、1:積む）
- 目的関数：2列の高さのうち低い方を最大化
- 制約条件
    - `obj`は`suml`と`sumr`のうち小さい方（1）
    - `suml`は左の列の高さ（2）
    - `sumr`は右の列の高さ（3）
    - `suml`と`sumr`の差が`limit`以下（4）
    - 書籍は左右のどちらかにしか置けない（5）

## Pythonで解いてみよう

入力パラメーターは、乱数で適当に作成します。

```py
import random
from ortoolpy import model_max, addvars, addbinvars, lpDot, value

random.seed(1)
books = [random.randint(10, 20) for _ in range(20)]  # 本の厚さ（ミリメートル）
limit = 1  # 左右の高さの差の許容値（ミリメートル）

n = len(books)
m = model_max()  # 数理モデル
obj, suml, sumr = addvars(3)  # 低い方の高さ、左の高さ、右の高さ
vl = addbinvars(n)  # 左に本を置くか
vr = addbinvars(n)  # 右に本を置くか
m += obj  # 目的関数（なるべく高くする）
m += obj <= suml  # (1)
m += obj <= sumr  # (1)
m += suml == lpDot(books, vl)  # (2)
m += sumr == lpDot(books, vr)  # (3)
m += suml - sumr <= limit  # (4)
m += sumr - suml <= limit  # (4)
for vli, vri in zip(vl, vr):
    m += vli + vri <= 1  # (5)
m.solve()  # ソルバーで求解
print(f'{m.status = }')
print(f'{value(suml) = }')
print(f'{value(sumr) = }')
print(f'{[int(value(vli) - value(vri)) for vli, vri in zip(vl, vr)]}')
```

`lpDot(X, Y)`は、`X`と`Y`の内積です。つまり`lpDot(books, vl)`は、左の列の高さになります。

#### 出力

```
m.status = 1
value(suml) = 149.0
value(sumr) = 148.0
[-1, -1, -1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, 1, -1]
```

`m.status = 1`は「最適解が得られている」という意味です。
`value(X)`は変数`X`の値を取得します。
左の列の高さは149ミリメートル、右の列の高さは148ミリメートルで、差は1ミリメートルになっています。
最後のリストは、1が左の列に置いて、-1が右の列に置くことを表しています。

## 余談

上記は0.1秒で計算できますが、`limit`を0にすると、計算時間は24秒になります（240倍）。
このように、組合せ最適化では、ちょっとパラメーターが変わると計算時間が大きく変わることがあります。
`limit`を色々変えたいときは、「[ビンパッキング問題の解き方](https://qiita.com/SaitoTsutomu/items/3a970e071768bbe96005)」のような工夫が必要かもしれません。
Unity Hubを出さずにプロジェクトを開くと楽

Unity Hubでプロジェクトを選択するのは面倒です。
Unity Hubを出さずにプロジェクトを開く方法の紹介です。

**環境は Windows 10 です**

方法1 シーンアセットをダブルクリックする
---
エクスプローラーにて
シーンアセット .unity ファイルをダブルクリックする方法です。
.unityファイルがUnityEditorに関連付けされている必要があります。

おすすめは次の方法2です。

方法2 batファイル作成
---
次のようなテキストを 好きな名前.bat で保存します。メモ帳でOKです。

```winbatch
start "" "C:\Program Files\Unity\Hub\Editor\2020.1.0f1\Editor\Unity.exe" -projectPath "d:\game"
```

バージョンやプロジェクトは書き換えてください。
start "" は、これをしないとUnity実行中に黒いウィンドウが残ってしまいます。

また、batファイルの実行をスタート画面に登録することも可能です。

エクスプローラにて、保存したbatファイルを右クリック > `ショートカットの作成`
ショートカットを右クリック > `プロパティ` > `リンク先` の**先頭**に `cmd /c(スペース)` を追加しOK

もう一度ショートカットを右クリックし`スタート画面にピン留めする`
タスクバーにD&Dしてピン留めすることも可能です。