OmniAICreator/Qiita-1.07M huggingface dataset:
挿入ソート Insertion Sort【可視化GIFでソートアルゴリズムを解説 その３】

# 3、挿入ソート（Insertion Sort）

挿入ソートとは、シンプルで直感的なソートアルゴリズムです。 順序付けられたシーケンスを作成することで機能します。ソートされていないデータの場合は、ソートされたシーケンスで後ろから前にスキャンし、対応する位置を見つけて挿入します。 挿入ソートは通常、インプレースソート（つまり、O（1）の余分なスペースのみを使用するソート）によって実装されます。したがって、後方から前方にスキャンするプロセスでは、ソートされた要素を段階的に後方に繰り返しシフトする必要があります。ステップ。、最新の要素の挿入スペースを提供します。

## 3.1 アルゴリズムの説明
一般的に、挿入ソートはインプレースを使用して配列に実装されます。 具体的なアルゴリズムは次のとおりです。

* 最初の要素から始めて、要素はソートされたと見なすことができます。
* 次の要素を取り出し、並べ替えられた要素のシーケンスで後ろから前にスキャンします。
* 要素（ソート済み）が新しい要素よりも大きい場合は、要素を次の位置に移動します。
* 並べ替えられた要素が新しい要素以下になる位置が見つかるまで、手順3を繰り返します。
* 新しい要素をこの位置に挿入した後。
* 手順2〜5を繰り返します。

## 3.2 可視化デモ
![](../../../resources/codility/sort/InsertionSort.gif)

## 3.2 実装

```java
    /**
     * Insertion Sort
     * @param array
     * @return
     */
    public static int[] insertionSort(int[] array) {
        if (array.length == 0)
            return array;
        int current;
        for (int i = 0; i < array.length - 1; i++) {
            current = array[i + 1];
            int preIndex = i;
            while (preIndex >= 0 && current < array[preIndex]) {
                array[preIndex + 1] = array[preIndex];
                preIndex--;
            }
            array[preIndex + 1] = current;
        }
        return array;
    }
```

## 3.4 性能評価

挿入ソートは通常、インプレースソート（つまり、O（1）の余分なスペースのみを使用するソート）によって実装されます。したがって、後方から前方にスキャンするプロセスでは、ソートされた要素を段階的に後方に繰り返しシフトする必要があります。ステップ。、最新の要素の挿入スペースを提供します。

* 最良時間計算量 ：T(n) = O(n) 
* 最悪時間計算量 ：T(n) = O(n2) 
* 平均時間計算量 ：T(n) = O(n2)

***
選択ソート Selection Sort【可視化GIFでソートアルゴリズムを解説 その２】

# 2、選択ソート（Selection Sort）

最も安定したソートアルゴリズムの1つ。**どのデータが入力されても、O（n2）時間計算量**であるため、使用する場合は、データサイズが小さいほど良いです。 唯一の利点は、追加のメモリスペースを使用しないことです。 理論的には、選択的ソートは、ほとんどの人が考えるソート方法でもあります。

Selection-sortは、シンプルで直感的なソートアルゴリズムです。 それは機能します：最初にソートされていないシーケンスで最小（大きい）要素を見つけ、それをソートされたシーケンスの最初に保存し、次に残りのソートされていない要素から最小（大きい）要素を見つけて、それをソートされたものに入れますシーケンス最後に。 など、すべての要素が並べ替えられるまで続きます。

## 2.1 アルゴリズムの説明
レコードn件の直接選択と並べ替えを直接選択し、n〜1回並べ替えて、順序付けられた結果を取得できます。 具体的なアルゴリズムは次のとおりです。

* 初期状態：無秩序な領域はR [1..n]であり、順序付けられた領域は空です。

* i番目のソート（i = 1,2,3 ... n-1）の開始時、現在の順序付けられた領域と無秩序な領域はR [1..i-1]とR（i..n ）それぞれ。 このソートトリップは、現在の無秩序領域から最小のキーを持つレコードR [k]を選択し、それを無秩序領域の最初のレコードRと交換して、R [1..i]とR [i +1を作成します。 .n）レコード数が1増加した新しい順序付けられた領域と、レコード数が1つ減少した新しい無秩序領域になります。

* n-1パスが終了し、配列が順序付けられます。

## 2.2 可視化デモ
![SelectionSort.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/6f195764-b9f1-6b50-d4d5-b8938e364329.gif)

## 2.3 実装

```java
    /**
     * Selection Sort
     * @param array
     * @return
     */
    public static int[] selectionSort(int[] array) {
        if (array.length == 0)
            return array;
        for (int i = 0; i < array.length; i++) {
            int minIndex = i;
            for (int j = i; j < array.length; j++) {
                if (array[j] < array[minIndex]) //find the minest number
                    minIndex = j; //hold the index of the min number
            }
            int temp = array[minIndex];
            array[minIndex] = array[i];
            array[i] = temp;
        }
        return array;
    }
```

## 2.4 性能評価

最も安定したソートアルゴリズムの1つ。どのデータが入力されても、時間計算量はO（n2）であるため、使用する場合は、データサイズが小さいほど良いです。 唯一の利点は、追加のメモリスペースを使用しないことです。 理論的には、選択的ソートは、ほとんどの人が考えるソート方法でもあります。

* 最良時間計算量 ：T(n) = O(n2) 
* 最悪時間計算量 ：T(n) = O(n2) 
* 平均時間計算量 ：T(n) = O(n2)

* * *
アドミニストレーター認定試験に向けた学習 ⇒ アドミニストレーター認定の準備: 設定とオブジェクト ⇒ アドミニストレーター認定の準備の開始

１．アドミニストレーター認定試験に占める割合が 10% の目的はどれですか? 2 つ選択してください。
２．アドミニストレーター認定試験に占める割合が 13% の目的はどれですか? 2 つ選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/55033d4d-ad89-07f0-f8fd-9691b136692c.png)
React・Tailwind CSS で動的にclassを追加する方法【アクティブクラス】

React・Tailwind CSSで動的にclassを追加する方法になります。
propsの値でstyleを変えたい場合やアクティブクラスに別途classを追加したい場合などに有効かと思います。

## 解説

```jsx
import React from 'react'

const Home = ({ active }) => {
  const normalStyle = 'px-6 py-4 bg-gray-200' // デフォルトのclass
  const activeStyle = `${normalStyle} bg-red-200 text-red-900` // デフォルトのclassと追加したいclass
  const style = active ? activeStyle : normalStyle // どちらのスタイルを当てるかを判別

  return (
    <div className={style}>
      <h1>Hello</h1>
    </div>
  )
}

export default Home
```
まずはデフォルトのclassを定義し`normalStyle`に代入します。
その後に文字列連結でclassを追加して`activeStyle`を作ります。

あとは、propsの値の条件などでclassNameを変えることで、動的にclassを追加することができます。
DatabricksのPools

[Pools \| Databricks on AWS](https://docs.databricks.com/clusters/instance-pools/index.html) [2021/4/15時点]の翻訳です。

Databricksのpoolsは、アイドル状態で利用可能なインスタンスのセットを維持しておくことで、クラスターの起動時間、オートスケーリングに要する時間を短縮します。[プールにアタッチされた](https://docs.databricks.com/clusters/instance-pools/cluster-instance-pool.html#cluster-instance-pool)クラスターがインスタンスを必要とした場合、まず、プールにあるアイドルなインスタンスの一つを割り当てようとします。プールにアイドルなインスタンスが存在しない場合、クラスターからの要求に応えるためにプールは新たなインスタンスをインスタンスプロバイダーから獲得します。クラスターがインスタンスを解放した際には、プールに返却され、他のクラスターから利用できます。

プールの紹介と推奨設定に関しては、以下の動画を参照ください。
<iframe width="560" height="315" src="https://www.youtube.com/embed/FVtITxOabxg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

アイドル状態のインスタンスがプールに存在している間は、Databricksの課金は発生しません。インスタンスプロバイダーの課金は発生します。[課金体形](https://aws.amazon.com/ec2/pricing/)を参照ください。

UI、CLI、Pools APIでプールを管理することができます。本章ではどのようにUIでプールを管理するのかを説明します。他の手段に関しては、[Instance Pools CLI](https://docs.databricks.com/dev-tools/cli/instance-pools-cli.html)、[Instance Pools API](https://docs.databricks.com/dev-tools/api/latest/instance-pools.html)を参照ください。

本章では以下を説明します。

- [Display pools(英語)](https://docs.databricks.com/clusters/instance-pools/display.html)
- [Create a pool(英語)](https://docs.databricks.com/clusters/instance-pools/create.html)
- [Configure pools(英語)](https://docs.databricks.com/clusters/instance-pools/configure.html)
- [Edit a pool(英語)](https://docs.databricks.com/clusters/instance-pools/edit.html)
- [Delete a pool(英語)](https://docs.databricks.com/clusters/instance-pools/delete.html)
- [Use a pool(英語)](https://docs.databricks.com/clusters/instance-pools/cluster-instance-pool.html)
- [Best practices: Pools(英語)](https://docs.databricks.com/clusters/instance-pools/pool-best-practices.html)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
バブルソート Bubble Sort【可視化GIFでソートアルゴリズムを解説 その１】

# 1、バブルソート（Bubble Sort）

バブルソートは単純なソートアルゴリズムです。 ソートするシーケンスに繰り返しアクセスし、一度に2つの要素を比較し、順序が間違っている場合はそれらを交換しました。 シーケンスにアクセスする作業は、交換が不要になるまで、つまりシーケンスがソートされるまで繰り返されます。 このアルゴリズムの名前の由来は、要素が小さいほど、交換によってシーケンスの先頭にゆっくりと「フロート」するためです。

## 1.1 アルゴリズムの説明

* 隣接する要素を比較します。 最初のものが2番目のものよりも大きい場合は、2つを交換します。

* 隣接する要素の各ペアに対して、最初の最初のペアから最後の最後のペアまで同じ作業を行い、最後の要素が最大数になるようにします。

* 最後の要素を除くすべての要素に対して上記の手順を繰り返します。

* ソートが完了するまで、手順1〜3を繰り返します。

## 1.2 可視化デモ

![bubbleSort.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/ee67103b-c6e1-55c0-bcce-d84d8756fbd3.gif)

## 1.3 実装

```java
    /**
     * Bubble Sort
     *
     * @param array
     * @return
     */
    public static int[] bubbleSort(int[] array) {
        if (array.length == 0)
            return array;
        for (int i = 0; i < array.length; i++)
            for (int j = 0; j < array.length - 1 - i; j++)
                if (array[j + 1] < array[j]) {
                    int temp = array[j + 1];
                    array[j + 1] = array[j];
                    array[j] = temp;
                }
        return array;
    }
```

## 1.4 性能評価

* 最良時間計算量 ：T(n) = O(n) 
* 最悪時間計算量 ：T(n) = O(n2) 
* 平均時間計算量 ：T(n) = O(n2)

* * *
LinuC合格用 1週間でLPICの基礎が学べる本 7日目まとめ

# プロセスとジョブ
![7日目のまとめ-プロセスとジョブ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1124047/ed4fb536-5ebb-98aa-0e3e-b848d6200168.png)

# ネットワークの基礎
![7日目のまとめ-ネットワークの基礎.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1124047/993a0984-571d-3402-9ad9-5a364edb55af.png)

# ネットワークの基礎（２）とシステム監視関連
![7日目のまとめ-ネットワークの基礎（２）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1124047/f6805298-a01f-1323-d44c-c09a8d9f05db.png)
業務系開発からスマホアプリへ転向する

初投稿ということで、初心を書き残しておこうという記事です。

## 自己紹介
正社員から初めて非正規に、そしてフリーとなったエンジニアです。
今は言語を教えたりしています。
イラストやシナリオのお仕事もしています。

これまで.Net系の開発で様々な業務系開発に携わってきました。
・人材派遣会社の基幹システム
・列車運行システム
・POSシステム
・官公庁基幹システム
・医療系検査システム

色々な業界に関われ、システム関係以外の知識が得られることが
この仕事の愉しみだと思っています。
（準鉄オタになんかならなかったと思うし
糖尿病や遺伝子に詳しくなんかならなかったでしょう！）


## 目的
そんな自分がこれからやりたいこと！
それはスマホアプリ開発です。
モバイル系の開発は将来性が魅力です。
かつて社内でEZWeb向けの研究開発は一瞬やっていたものの、
世の中はスマホが主流になりそれもすぐに終わってしまいました。

やっぱりユーザーの反応が身近に感じるものを作りたい。
そして昔からの夢だったのがゲーム開発に関わること。
最終的には配信できるゲームが作りたい！

とはいえ広告は利用したいとしても利益などは考えていません。
学習にかかる諸費用を少しでも賄えたら上等と思っています。

最終的にはそちらをメインの仕事にしていきたいので、アプリ自体ではなく
コードや言語特有の技術の利用のチャレンジが目的です。


## やりたいこと
Javaの開発経験から
・Kotolin
・GO

C#の開発経験から
・Unity（モバイルちゃうやん）

本人がiOSのユーザーなので
・Flutter

このあたりの言語、環境で簡単なものから作っていこうと思っています。


Android Studioの環境がうまくいっていないのでまずはそこから。
同じように詰まっている人の助けになればいいなと思います。


よろしくお願いします！
[AWS] CloudShellで簡単にS3署名付きURLを発行する

# CloudShell
マネジメントコンソールの上部から実行できる、Amazon Linux2ベースのシェルプロンプトです。
EC2インスタンスをわざわざたてなくても、ボタン一つで、マネジメントコンソールからAWS Cliを実行したり、簡単なLinuxコマンドを実行したり、あるいは1GBのスーペースがあるのでちょっとしたツールのインストールも可能だったりします。
リージョン内に10個のCloudShellを同時実行できて、料金も無料です。
AWS Cliをインストールしていない端末かの操作や、ちょっとしたことを試すだけなら、EC2インスタンスがなくてもできてしまうので、結構使い道はあります。

## 起動方法
マネジメントコンソールの上部にあるボタンをポチっと押してください。それだけです。
![managementconsole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/4cebc612-758a-0660-5974-3789c7559e66.png)

すると、下のようなモーダル画面が表示されます。今後表示したくない場合は、「DO not show again」をチェックして画面をCloseしてください。
![welcome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/e413ea50-12d9-7ec6-3875-9de12c284b2b.png)

少したつと、シェルが使えるようになります。
![shell1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/9aff1cbd-8a7c-9d9b-35f3-2d75cc6c3812.png)

## できること
右上の[Actions]を開くと、以下のようなことができることがわかります。
![menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/593c7ae5-caf6-57e2-db78-929a7144efd4.png)
ファイルのアップロードやダウンロードもできます。
コマンドラインで、S3へのPUTや、CloudFormationのスタック作成などを確認したい場合などに使えますね。
さらに、その隣の歯車のアイコンからは、CloudShellの設定もできます。
![preference.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/eda979f8-f53b-ecbf-9d2e-51d2b29ceb2a.png)
フォントのサイズや、テーマカラー、あと複数行コマンド貼り付け時の確認の有無などがあります。
![confirm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/c9792c03-ee4f-bc00-e6be-fcdc9553e943.png)

# ではさっそく署名付きURLを発行してみます
## アップロード
まずは、S3にファイルをアップロードします。この時、マネジメントコンソールからアップロードしてもよいですし、クライアントからAWS Cliを叩いてもOKです。
せっかくなんで、CloudShellにファイルアップロードしてCloudShellを叩いてみる、でももちろんOKです。

## S3のURI確認
マネジメントコンソールで、アップロードしたファイルの画面をみてみましょう。
オブジェクト概要欄に「S3 URI」という欄があるので、これをコピーしておきます。
![s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/5f2d38a1-ed8a-91a0-8ff9-6e9ee12e4c2d.png)

## 署名付きURLの発行
```
aws s3 presign [S3 URI] --expires-in 有効期間（秒）
```
すると、署名の付いたURLが表示されます。このURLでアクセスすると、認証なしでファイルにアクセスすることが可能となります。
![presign.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/f56c7585-efeb-1d95-dd0d-28230763fdd3.png)
【Vscode】覚えて損なし！Emmet（補完ツール）機能について

# 初めに
HTMLを書く時にタイプミスなどがあったり、長いコードや同じコードの繰り返しなどがあると作業効率が下がってしまいます。そんな場合に便利なのがEmmet自動補完ツール。Vscodeには最初から導入されている機能で、書き方さえ覚えれば簡単にHTML文書を作成できます。その特徴と書き方について調べてみました。
※内容に間違いなどがある場合はご指摘をよろしくお願いします。

#Emmetとは
![スクリーンショット 2021-04-20 7.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/a2aa18b9-81f7-7e05-03e3-1687bb163e07.png)
HTMLやCSSを省略記法で簡潔に記述できる自動補完ツールです。Zen-Codingと呼ばれていたらしく、特定エディターのプラグインもしくは標準機能として提供されています。習得するとタイプ数をかなり減らすことができる便利なツールです。

# HTMLの主な使い方
❶簡単にHTML文書を作成
「！」の後に「tabキー」を押すと簡単にHTML文書ができてしまします。html文書宣言やhead、metaタグなど面倒な打ち込み作業がなくなります。
![スクリーンショット 2021-04-20 8.25.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/c34ab0dc-2ed0-1a94-455c-530b33ffa91f.png)
![スクリーンショット 2021-04-20 8.25.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/34b0f31c-5d5d-ee46-c949-695dad27fd23.png)
❷親子構造が作れる
「>」キーで親子関係を表現。<nav>要素の下にリストを作る場合の記述は1行で簡単に出来ちゃいます。

```html
nav>ul>li   #最後に「tabキー」を押します。

<nav>
    <ul>
        <li></li>
    </ul>
</nav>
```
❸同じ要素の繰り返し
「＊」キーで繰り返し。ulタグの下にliタグを７つ作リたい場合、要素の掛け算で実現できます。

```html
ul>li*7  #最後に「tabキー」を押します。
<ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>
```
❹兄弟関係
「＋」キーで繋げます。それぞれ違う要素が並ぶ時に便利です。

```html
div+p+a   #最後に「tabキー」を押します。

<div></div>
<p></p>
<blockquote></blockquote>
```
# CSSも書ける
使い方は{}内に要素の略語？を打ち込むだけです。

```ruby
bg     #最後に「tabキー」を押します。

body {
     background: #000;
}
```

```ruby
fl     #最後に「tabキー」を押します。

.first {
     float: left;
}
```

# cheatキーについて
これらの使い方については公式サイトで確認できます。
https://docs.emmet.io/cheat-sheet/
書き方や例が詳しく乗っているのでおすすめです。

# 最後に
Emmet機能を使えば、簡単にHTMLやCSSの作成ができます。慣れるまで時間が掛かりますが、タイプミスや書く時間もかなり減らせるので試してみてはいかがでしょうか。

# 参考サイト・記事
https://docs.emmet.io/cheat-sheet/
https://docs.emmet.io/
https://qiita.com/tedkuma/items/67876e6be3369b0e730c
【Vue.js】v-slotの使い方

## v-slotの使い方

```vue
// これが親コンポーネント
<template>
<div>
  <LikeHeader>
    <template v-slot:title>  // v-slotを使用する時は必ずtemplateタグで囲まなければいけない。
      <h1>こんにちは</h1>
    </template>
    <template v-slot:number>
      <h2>{{ number }}</h2>
    </template>
  </LikeHeader>
  <LikeNumber :total-number="number" @my-click="number= $event"></LikeNumber>
  <LikeNumber :total-number="number"></LikeNumber>
</div>
</template>

<script>
import LikeHeader from "./components/LikeHeader.vue";

export default {
  data() {
    return {
      number: 18
    };
  },
  components: {
    LikeHeader
  }
}
</script>
```

```vuejs
// こっちが子コンポーネント
<template>
  <div>
    <slot name="title"></slot> // 親コンポーネントのv-slotで指定したnameをこのslotタグに渡す
    <slot></slot>
    <hr>
    <p>いいねの数</p>
    <slot name="number"></slot>  
  </div>
</template>

<script>
export default {
  props: ["headerText"]
};
</script>
```

これでslotごとに表示を変えることができる。

親コンポーネントでv-slotを使用する時は、divタグなどで囲むとエラーが出る。
必ずtemplateタグを使用する。
Laravel基礎 .env　app_debugについて

本当に初歩の内容ですが、```app_debug=false``` にしたまま放置していて、
**「何かエラーが起きてるけど分からない、何が行けないんだっ！！」**となって、
ちょっと時間を棒に振ってしまったので、忘れないように残していこうと思います。


先週、[app_debug=trueであったり、composerが古いものをずっと使っているとウイルスに感染する](https://qiita.com/reopa_sharkun/items/f3819b2e8727728da82a)といった内容の記事を見て、falseで最初からやれば問題なんじゃないかと思い、
.envファイルをfalseにして何も確認せずに、作業を中断してしまいました。

数日後に作業を再開して、ddでどこまで処理が動作しているか確認しようとしたら・・・
![スクリーンショット 2021-04-20 8.07.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283827/4d2679c3-3037-0479-421d-29ae26fa8663.png)


あれ？？？
コントローラーでddしてるのにそこに行ってないのかなぁ、プロバイダーとかのせいかなぁ・・・・
rootもあってるのに、ちゃんとしたエラー出てこない！！


調べていくうちに.envファイルのAPP_DEBUG=falseが行けないと分かり直したら無事に治りました。
**（本当初歩的な問題なのにいざ当たると分からなくなるので処理を変えたら動作確認するべきって教訓でした！）**
なんということでしょう、匠の手によりandメソッドが導入され、テストのexampleが減ったではありませんか

## formオブジェクトを用いてリクエストテスト、結合テストを行いリソースの保存を検証したい

```ruby
class Output
  include ActiveModel::Model
  attr_accessor :content, :user_id, :book_id, :awareness, :action_plans

  def save
    awareness = Awareness.new(content: content, book_id: book_id, user_id: user_id)
    awareness.save
    action_plans.each do |action_plan|
      action_plan = ActionPlan.new(time_of_execution: action_plan[:time_of_execution], what_to_do: action_plan[:what_to_do], how_to_do: action_plan[:how_to_do], book_id: book_id, user_id: user_id, awareness_id: awareness.id)
      action_plan.save
      BookActionPlan.create(book_id: book_id, action_plan_id: action_plan.id)
    end
  end
end
```

こんな感じで一度に複数のモデルにデータを挿入するformオブジェクトを生成した。
本を読んだ気づきとアクションプラン(1~3個で変動)を同時に保存することができる。
これを用いてリクエストテストやユニットテストを実装する際にリソースの保存処理の書き方で困った

## changeマッチャを使ってモデルのカウントの上昇分を検証する

普通rspecでリソースの保存を検証する際には

```ruby
expect do 
  post hoge_path
end.to change(Hoge, :count).by(1)
```

のようにやる。こうすることでモデルのカウントが増えていることを検証している。

ところが今回のformオブジェクトでは検証すべきモデルが複数あるのでこういうときはどう書くのか？というのがわからなかった。

## exampleを複数用意することでも対処は可能だけど

```ruby
it "投稿に成功するとAwarenessモデルのカウントが1増える" do
  expect do
    post api_v1_book_outputs_path(book.id), xhr: true, params: {output: output_params}, headers: headers
    sleep 2
  end.to change(Awareness, :count).by(1)
end


it "投稿に成功するとActionPlanモデルのカウントが3増える" do
  expect do
    post api_v1_book_outputs_path(book.id), xhr: true, params: {output: output_params}, headers: headers
    sleep 2
  end.to change(ActionPlan, :count).by(3)
end
```

こんな感じでexampleを複数はやしてもいいんだけどなんか冗長だなぁと感じていた。
すると以下の記事にヒットした。

https://qiita.com/kaket4n/items/0e94956036d05d40db41

## andメソッドを使うことで検証内容を増やす

```ruby
it "投稿に成功するとAwarenessモデルのカウントが1増え、ActionPlanモデルのカウントが3増える" do
  expect do
    post api_v1_book_outputs_path(book.id), xhr: true, params: {output: output_params}, headers: headers
    sleep 2
  end.to change(Awareness, :count).by(1).and change(ActionPlan, :count).by(3)
end
```

こんな感じでandでつなげることでcountの検証を複数同時に行うことができる。
すげぇこんなのあるのか…
私はこれを知った時稲妻が落ちたような気持ちになった。

実際のアプリの環境に照らしても同時に検証できる方がベターなのでこれでコードの可読性もテストとしての安全性も高まった。やったね！
ゲオの骨伝導ワイヤレスヘッドホン買ってみた

## 背景
ずっと気にはなっていたけど値段的な面でなかなか踏み出せなかった骨伝導ワイヤレスヘッドホン。
テレワーク生活もだいぶ長くなり、オンライン会議の頻度もハンパなくなっていた最中、お手頃価格でこの度発売されることをTwitter経由で知ったので、勢い任せで飛び込んでみた。
ちなみに買ったのはタイトルにもあるゲオのこれ。

https://geo-online.co.jp/campaign/special/other/geoselection/earphones/bch200b300.html

https://www.geonet.co.jp/news/21458/

【骨伝導 ヘッドホン】でググると評価が良いものはだいたい2万弱の価格帯が多いけど、これは `2999円(税込)` とほぼ1/5～1/6程度の値段、かつなんか `3000円は切りましたよ！` 感が非常に伝わったのも購入の要因。

## 所感
いきなり結論。サクッと読みたい人はここまで読んでもらえればOK。
ちなみに筆者はオンライン会議用途で購入しているため、違う用途だと印象が変わるかもしれません。

### 良かった点
- 安価。骨伝導ヘッドホンとして2999円は魅力的。ゲオオンラインなら送料も無料。
- 軽い。33gはヘッドセットとしてもだいぶ軽い方な気がする。
- 耳が蒸れない。両耳のヘッドセットをつけると耳が蒸れるからそれが解消。
- 移動できる。Bluetoothだから当たり前といえば当たり前。
- 音はまぁまぁ。オンライン会議用途で購入したので、音楽を聴きたい人はまた違う印象かも。
- 遅延はほぼなし。Bluetooth 5.0の恩恵。音楽を聴きたい人は(ry
- 防水は使わないがIPX4はまぁ良いと思う。汗かきの人も安心。

### 良くない点(今後に期待枠)
- マイクは使えないと思っていいレベル。音を上手く拾ってくれない。会話するとストレス値高い。
- 音漏れはする。大きい音量だと当然といえば当然。
- 音量が大きいと振動が強くなるのでちょっとこめかみがこそばゆい。骨伝導ならでは？
- 充電しながらの利用は不可。ここはちょっと残念。
- 防水対応のため充電部のアダプタ蓋があるが、そこの耐久性はちょっと不安。
- Bluetooth 5.0のアダプタ対応機器がないと真価は発揮できない？4.x系の後継互換でもそこまで大きな影響はないと思うが。
- ペアリングはシングル。ここは値段的に致し方ないかなぁ。(`追記：2021/04/28`)

※それぞれ他に思いついたら追記する予定。

### まとめ
マイクが使えないレベルだったので、結果として音はこのヘッドホンで、マイクはノートPCのマイクでという運用になっているものの、そこまでストレスなく使えている印象。
用途がオンライン会議用なんで、PCやモニタ前に座って使用すること前提になってるからというのも当然ある。
ただ、骨伝導イヤホン試してみたいという人は軽い気持ちで試してみてもいいかも。合う合わないは人それぞれ。
良くない点についてはこういう改善方法があるよ！というコメントがあれば是非お願いします。

## 蛇足(`※2021/04/28追記`)

### ファーストインプレッション

初骨伝導ワイヤレスヘッドホン届いた。

![IMG_20210413_192124.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314171/c3084f0e-e0fb-b19d-1f38-c6150ee999fa.jpeg)

軽量、かつそこそこの連続稼働時間。

![IMG_20210413_192151.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314171/9044b7bb-b4c4-de22-e77b-b86333fe7bb4.jpeg)

パッケージ裏面。

![IMG_20210413_192141_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314171/77986fe6-dd44-a946-9ede-d05f30134b29.jpeg)

商品仕様。他のBluetoothイヤホンもそうだけど、連続待機時間って割と大きい時間書いてあるけど、どんな条件で計ってるのかと思うよね。

![IMG_20210413_192430_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314171/43746898-921f-8bf2-99a1-52705167d975.jpeg)

![IMG_20210413_192439_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314171/9df33b56-79ab-34b1-5094-088f73902f0b.jpeg)

パッケージオープン。だいぶスッキリした中身。ヘッドホン自体は少し厚みがある感じか。

![IMG_20210413_192950.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314171/d3b148b9-ebca-d46b-ead7-a9c5b752c233.jpeg)

商品中身全容。こちらもすっきり。耳栓が入ってるのが骨伝導ならではって感じ。

![IMG_20210413_193105.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314171/5fedeac7-05cd-99ec-7254-9318635beee0.jpeg)

充電部のコネクタ部。若干見にくいけどこの蓋がまぁまぁ固め。これ使ってるうちに劣化がどの程度なのかは気になる。

### 感想
持った感じはとても軽い。社員証の重さが約75gって感じなので、34gは重さ的にもずっと耳にかけられる感じする。たぶんつけないけど。
使用感はまた別途レビューするけど、個人的にはこれからワクワクしながら使えそう。
[Mac]Gitのアカウントを切り替える - アカウント情報切り替えから認証情報の再登録まで -

仕事を変えた時にGitのアカウント切り替えでつまずいたので、備忘録ついでにここにその正しい方法をまとめておくことにする。

まずは以下のコマンドで情報切り替え

```
$ git config --global user.name "Bob" // ユーザーネームが入る
$ git config --global user.email "bob@example.com" // アカウントに紐づくアドレスが入る
```

以上。ただ、これだけだと"permission denied"みたいになって実際にpushとかができない。
なのでさらに認証情報を古いものを削除して再登録する必要がある。

以下Macでの流れ。

Macのアプリ、キーチェーンアクセスを開く。
場所-> アプリケーション>ユーティリティ>キーチェーンアクセス.app

![スクリーンショット 2021-04-19 午後6.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702689/5e14c711-6cec-b4b0-8688-7b0fb10aadbe.png)

アプリの検索窓から"git"を検索。すると以下のようなアイテムが表示される。
![スクリーンショット 2021-04-19 午後6.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702689/721fb998-e940-f0dd-6492-7a124737f3fb.png)

これらを削除して、改めてpushなんかを試してみる。
するとユーザー名とパスワードを聞かれるので、入力して実行する。
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_702689_48d3802e-8e29-9a2d-0890-98ba3f973e39のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702689/1bd6864d-e91f-694d-8b72-fd2b7e55b5cc.png)


これで無事認証情報が更新されて、pushも完了するはず。

以上。あまり頻繁にやる作業じゃなくて、毎回ググらないといけなくなる予感がしたのでここに書いておきました。
Windows10のサービスチャンネル

■きっかけ
カスタマーサポート業務を行う上でキッティング作業の際に出てきた用語の備忘録です。
■感想
英語の意味を理解すれば見当がつく内容であった。使い方によって更新頻度も切り分けがされている事を知りました。
「Semi-Annual」=半期
「Long−Term」=２-３年

■Windows 10 のサービス チャネルとは？
windowsOSの更新頻度の話で、半期チャンネルと長期サービスチャンネルに分類される。
半期チャンネルは年に2回のペースで最新バージョンがリリースされ、通称「SAC（Semi-Annual Channel）」と呼ばれます。一般的に使われるWindows 10 （Home・Pro・Education・Enterprise）はSACに分類されます。
長期サービスチャンネルは、特殊な用途のシステムが稼働する環境向けに、機能の更新を2～3年に1回の頻度に減らしたWindowsのサービスチャンネルです。LTSC（Long-Term Serving Channel）と呼ばれます。
「Cortana」はWindows10の音声認識機能。基本的にSACで搭載。

参考
https://solution.fielding.co.jp/column/it/itcol04/202101_01/
update_attributesでエラーになった時の対処方

#環境
- Rails6.1


```ruby:contoller.rb
def update
  user = User.find(params[:id])
  user.update_attributes
end
```
UPDATE文が出ずにエラーなりました。

```:ターミナル
NoMethodError (undefined method `update_attributes' for #<Reaction:0x00007fd4e260db78>
Did you mean?  update_attribute):

```

エラーで動かなかったの調べてみると
`update_attributes`が非推奨になったみたいで思わぬ挙動をしてました。
結論から言いますと`update`に変更したら問題なく動きました。

```ruby:contoller.rb
def update
  user = User.find(params[:id])
  user.update_attributes #非推奨になりました。
end

def update
  user = User.find(params[:id])
  user.update #上記と同じ実装方法になります。
end

```

rails 6.0までは`update_attributes`使えるらしいですが
rails 6.1で使えなくなってるので色々調べて見ました。

#参考
>非推奨のActiveRecord::Base#update_attributesおよびActiveRecord::Base#update_attributes!を削除
[Railsガイドより](https://railsguides.jp/6_1_release_notes.html#active-record-%E9%9D%9E%E6%8E%A8%E5%A5%A8%E5%8C%96)
Androidアプリ評価件数、星平均数取得pythonスクリプトでサクッと定時集計

#概要
Androidアプリレビュー件数、星平均数取得の２点を取得するスクリプトを作成する
cronで１日１回集計をログへ出力する
出力例：`2021/04/10 21:00:07 18 件, 星平均: 2.6`
(筆者はRaspberryPiを起動しっぱなしにしてるのでそこでこのスクリプトを実行させている)
環境：Python ver 3.5.3

##コーディング
※変数googlePlayURLのurlだけあなたのアプリのurlに差し替えて下さい。

```python:do.py
# 実行ファイル
import sys
import funcs

args = sys.argv

googlePlayURL = "https://play.google.com/store/apps/details?id=com.my.appname&hl=ja"
funcs = funcs.Functions(googlePlayURL)
#funcs = funcs.Functions(args[1])
funcs.get_all()
```

```python:funcs.py
import urllib.request
import re
import pprint
from pprint import pprint
import os
import time
import urllib.error
import datetime

class Functions:
    first_url = ""      #ページのURL
    headers = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"}
    html = ""

    def __init__(self,url):
        self.first_url = url #ページのURLを保管す
        #print(self.first_url)

    #全処理を行う
    def get_all(self):
        self.get_page_html(self.first_url)  #取得したurlからhtmlコードを取得
        num = self.get_review_num()         #レビュー数を取得
        average = self.get_review_average() #平均を取得する
        dt_now = datetime.datetime.now()    #現在時刻を取得
        print(dt_now.strftime('%Y/%m/%d %H:%M:%S')+" "+num+" 件, 星平均: "+average)
        #print(self.html)

    #取得したページからhtmlコードを取得
    def get_page_html(self,url):
        request = urllib.request.Request(url, headers=self.headers) 
        self.html = urllib.request.urlopen(request).read().decode('utf-8')
        #print(self.html)
        pass

    #レビュー件数を取得
    def get_review_num(self):
        pattern = "aria-label=\"[0-9]+ 件の評価"
        res = re.findall(pattern,self.html)
        string1 = res[0].replace("aria-label=\"","")
        #pprint(string1)
        pattern2 = "[0-9]+"
        res2 = re.findall(pattern2,string1)
        string2 = res2[0]
        #pprint(string2)
        return string2

    #星平均数を取得する
    def get_review_average(self):
        pattern = "平均評価: 星[^個]+個"
        res = re.findall(pattern,self.html)
        #pprint(res[0])
        pattern2 = "[0-9]+[^/]+"
        res2 = re.findall(pattern2,res[0])
        string2 = res2[0]
        #pprint(string2)
        return string2
```

シェルで実行しlog.txtへ追記していく

```shell:do.sh
python3 /home/pi/project/myAppGooglePlayChecker/do.py >> /home/pi/project/myAppGooglePlayChecker/log.txt
```

##cron設定

crontab内で以下のように設定し毎日21時に集計する

```
0 21 * * * sh /home/pi/project/myAppGooglePlayChecker/do.sh
```
pythonでgnuradio その2

#概要

pythonでgnuradioやってみた。
サイン波をグラフ表示。

#写真

![time0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c38df97d-12e7-ff74-f5db-d83a19c2a7fd.jpeg)


#サンプルコード

```
from PyQt4 import Qt
from gnuradio import gr
from gnuradio import blocks
import sys
try:
    from gnuradio import qtgui
    from PyQt4 import QtGui, QtCore
    import sip
except ImportError:
    sys.stderr.write("Error: Program requires PyQt4 and gr-qtgui.\n")
    sys.exit(1)
try:
    from gnuradio import analog
except ImportError:
    sys.stderr.write("Error: Program requires gr-analog.\n")
    sys.exit(1)

class my_top_block(gr.top_block):
    def __init__(self):
        gr.top_block.__init__(self)
        Rs = 8000
        f1 = 100
        f2 = 20
        npts = 2048
        self.qapp = QtGui.QApplication(sys.argv)
        src1 = analog.sig_source_f(Rs, analog.GR_SIN_WAVE, f1, 0.3, 0)
        self.snk1 = qtgui.time_sink_f(npts, Rs, "Sin Time Example", 1)
        self.connect(src1, (self.snk1, 0))
        pyQt = self.snk1.pyqwidget()
        pyWin = sip.wrapinstance(pyQt, QtGui.QWidget)
        self.top_widget = Qt.QWidget()
        self.top_layout = Qt.QVBoxLayout(self.top_widget)
        self.top_layout.addWidget(pyWin)
        self.top_widget.show()

if __name__ == "__main__":
    tb = my_top_block();
    tb.start()
    tb.qapp.exec_()
    tb.stop()





```


以上。
flutter 1.12以前で作ったアプリでwebview_flutterを使うとAndroid版がクラッシュする

flutter 1.12 以前で create した flutter アプリで webview_flutter を使うと Android 版がクラッシュすることがあります。

# 再現方法
flutter 1.12以前のバージョンで flutter create して、[webview_flutter 1.0.7 のサンプル](https://pub.dev/packages/webview_flutter/versions/1.0.7/example)を動かすと、次のエラーでクラッシュします。

```
E/flutter ( 5736): [ERROR:flutter/shell/platform/android/platform_view_android_jni_impl.cc(44)] java.lang.RuntimeException: platformViewsController must be set before attempting to begin the frame
```

# 原因
SurfaceAndroidWebViewを利用するとクラッシュするようです。サンプルコードの場合、次の1行があり、SurfaceAndroidWebView を WebView.platform に設定しているため、クラッシュします。

```
  if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
```

# 対策
1. SurfaceAndroidWebView を使わない。簡単ですが、[Hybrid Composition](https://github.com/flutter/flutter/wiki/Hybrid-Composition)が効かなくなるため、テキスト入力の挙動が不自然になる場合があります。

2. [Upgrading pre 1.12 Android projects](https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects)に従って、v2アーキテクチャに移行する。コードの改修量は少ないですが、v2対応していないプラグインが利用不可能になります。
論理記号文における括弧、カンマ、セミコロンなどの使い方

# はじめに

LaTeX で論理式、論理記号文を書いていて、テキストによって括弧 (丸括弧 parenthesis、角括弧 bracket、波括弧 braces) の使い方に揺れがあったりして、あとカンマの使い方、どういう場合に省略するのか。 と考えていてイプシロンデルタ論法の数式で比べよう、と思いつきました。

この記事ははてなに書いたものを改訂したもの。


# 実例

日本の離散数学などのテキストでは次のような表示になっている。

$\forall\varepsilon \gt 0 \;\;\exists\delta \gt 0 \;\; \forall x \in \mathbf R \;\;(0 \lt |x - a| \lt \delta\implies |f(x) - f(a)| \lt \varepsilon)$

日本語のウィキペディアでは次のような表示になっていた。

${}^{\forall} \varepsilon \gt 0,\;^{\exists} \delta \gt 0 ;\;^{\forall} x \in \mathbf R\;[0 \lt |x - a| \lt \delta\implies |f(x) - f(a)| \lt \varepsilon]$

英語では epsilon-delta definition of limit と言う。

英語のウィキペディアでは次のような表示になっていた。 上と合わせるために少し改変した。

$\forall\varepsilon \gt 0,\;\exists\delta \gt 0 ;\;\forall x \in 
\mathbf R,\;0 \lt |x - a| \lt \delta\implies |f(x) - f(a)| \lt \varepsilon$

# 考察

たぶんどれも正しいのだとして、自分の好みとわかりやすさでは日本のテキストの表示がよいと思う。 

カンマやセミコロンは意味があって、明確に区別できるのかもしれないが、カンマやセミコロンは論理記号文以外でも使われるので、いずれにしても文脈で確認しなくてはいけないので、それならばスペースがよい。 

命題を角括弧 bracket で囲むのは話としてはわかるが通常の丸括弧 parenthesis で十分だと思う。 その証拠に英語のウィキペディアでは囲ってもいない。 囲まないルールはわかりにくくなると思うのでなんらかの方法で囲った方がよいと思う。

あと、全称記号 $\forall$ と 存在記号 $\exists$ を小さく前上付きにするのはみんなが同じルールならばわかりやすいとは思うが揺れがあるのだったら普通の大きさで変数の前につけて問題ないと思う。

# LaTeX でのソース

ここで書いた、latex でのソースは以下の通り。 スペース `\;`は見やすさのために適宜加えている。

日本ののテキスト

```
$\forall\varepsilon \gt 0 \;\;\exists\delta \gt 0 \;\; \forall x \in \mathbf R \;\;(0 \lt |x - a| \lt \delta\implies |f(x) - f(a)| \lt \varepsilon)$
```
日本語のウィキペディア

```
${}^{\forall} \varepsilon \gt 0,\;^{\exists} \delta \gt 0 ;\;^{\forall} x \in \mathbf R\;[0 \lt |x - a| \lt \delta\implies |f(x) - f(a)| \lt \varepsilon]$
```
英語のウィキペディア

```
$\forall\varepsilon \gt 0,\;\exists\delta \gt 0 ;\;\forall x \in 
\mathbf R,\;0 \lt |x - a| \lt \delta\implies |f(x) - f(a)| \lt \varepsilon$
```


ちなみに、文の意味は「$f(x)$ の $a$ における極限は $f(a)$ である」ということ。

$\displaystyle \lim_{x \to a} f(x) = f(a)$

```
$\displaystyle \lim_{x \to a} f(x) = f(a)$
```
Pythonを使ってOutlookの添付ファイルを保存しよう！

#サラリーマンのメールのストレス軽減
Pythonで添付ファイルを保存するツールがあるが、不特定多数向けにOutlookのフォルダーの選択をドロップボックスで選択する処理を追加しています。
#参考
###ベースシステム
https://office54.net/python/app/outlook-attached-save
##フォルダの概念
https://qiita.com/konitech913/items/8a285522b0c118d5f905
##追加変更するコード
```python:python
import win32timezone
```
時間系統を使用時は上記を追加すること。

```python:python
entry_outlook = ttk.Combobox(frame, state='readonly')#ttk.Entry(frame)
```
ウィジェットを変更して、ドロップボックスの抽出を追加する。

```python:python
Flist =[]
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
folders = outlook.GetDefaultFolder(6).Folders
for folder in folders:
    Flist.append(folder.name)
print(Flist)
entry_outlook["value"]=Flist
```
#この後
あとは、PowerAutoMato for Desktopが無償化されましたので、RPAでサクッと自動化処理を行うと良いです。

###流れ
１.Outlookの受信フォルダ下位に仕分けフォルダを作成してもらう。
２.ルールの作成などで自動化してもらう。
3.ツールを使用してもらい、添付ファイルを保存後RPAをかけてもらう。
Python 時系列 list の圧縮

# 時系列 list の圧縮

## 目的
時系列などで各時刻のラベルを出力すると，同一のラベルが並ぶことになる．重複を取り除くことによってラベル系列を見やすくする．

簡単に言うと，

`['A', 'A', 'A', 'B', 'B', 'C', 'A', 'A', 'A', 'B', 'B']`を
`['A', 'B', 'C', 'A', 'B']`にしたい．

python の基本機能で実現できる．

## アルゴリズム

+ リストを作成する
+ 一つずらしたリストを作成する
+ 比較して，一致していない要素でリストを作る

## 実験
### 初期設定
簡単にするために，文字列を list にする

```
item1 = list('AAABBCAAABB')
print('item1:', item1)
# item1: ['A', 'A', 'A', 'B', 'B', 'C', 'A', 'A', 'A', 'B', 'B']
```

### 一つずらしたリスト
+ list の加算を使う
+ list のスライスを使う

list は「加算: `+`」 や 「乗算 `*`」ができる．
list のスライスは基本なので覚えておくとよい．

`['_']+item1[:-1]` とした．
`item1[1:]+['_']`でもずらすことになる．
できた list は item1 と同じ長さ．

```
item2 = ['_']+item1[:-1]
print('item2:', item2)
# item2: ['_', 'A', 'A', 'A', 'B', 'B', 'C', 'A', 'A', 'A', 'B']
```

### リストの比較

+ `zip` を使いリストをまとめる．
+ `if` で要素を選択

zip では要素の数を合わせておいた方が良い．

```
item3 = [i for i,j in zip(item1, ['_']+item1[:-1]) if i != j]
print('item3:', item3)
# item3: ['A', 'B', 'C', 'A', 'B']
```

動作に対する補足実験 `if`で何を比較しているか確認する．

```
item4 = [(i,j) for i,j in zip(item1, ['_']+item1[:-1])]
item5 = [(i,j) for i,j in zip(item1, ['_']+item1[:-1]) if i != j]
print('item4:', item4)
print('item5:', item5)
# item4: [('A', '_'), ('A', 'A'), ('A', 'A'), ('B', 'A'), ('B', 'B'), ('C', 'B'), ('A', 'C'), ('A', 'A'), ('A', 'A'), ('B', 'A'), ('B', 'B')]
# item5: [('A', '_'), ('B', 'A'), ('C', 'B'), ('A', 'C'), ('B', 'A')]
```

## まとめ

list の加算，スライスにより比較するための list を作成した．
zip を使い，if で選択することで重複を取り除いた．

python の基本機能で実現できる．
JSONata で ISO 8601 に従ってタイムゾーンを指定しつつ小数秒まで時間を表示したい

# 概要

JSONata で、

- ヒトと機械の多くがサポートしている ISO 8601 に沿って時間を表示する (Date/Time functions のデフォルト)
- タイムゾーンを指定する

細かい書き方は [こちらの記事](https://qiita.com/tseigo/items/e7deb8d6d4902a4aef30) が勉強になりました。

## 日時関数 (Date/Time functions) のフォーマット指定方法

[JSONata 公式ドキュメント](https://docs.jsonata.org/date-time-functions) によると、[XPath](https://www.w3.org/TR/xpath-functions-31/#date-picture-string) と同じように指定するらしいです。 `picture` って呼ぶんですね。

### 指定子（specifier）

今回の表示に必要なもの。9.8.4.1 The picture string の表より抜粋。

| 指定子 | 意味 |
| --- | --- |
| Y | 西暦 |
| M | 月 |
| D | 日 |
| H | 時 |
| m | 分 |
| s | 秒 |
| f | 小数秒 |
| Z | タイムゾーン |

### 修飾子（modifier）

修飾子は固定長（０埋め）に使うだけです。
ミリ秒を表示したいなら `[f001]`、マイクロ秒なら `[f000001]`、という感じ。

## JSONata で表示

### unixtime をもとに表示

```
$fromMillis(1510067557121, '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01].[f001][Z]', '+0900')
```

=> `2017-11-08T00:12:37.121+09:00`

### 現在時刻の場合

```
$now('[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01].[f001][Z]', '+0900')
```

## 終わり

タイムゾーンだけ指定する方法ってないんでしょうか

### 参考

- https://qiita.com/tseigo/items/e7deb8d6d4902a4aef30
- https://docs.jsonata.org/date-time-functions
- https://www.w3.org/TR/xpath-functions-31/#date-picture-string

### 環境

一応メモ

- Node-RED v1.3.2
- Node.js v14.16.0
OpenGLでVBOを使って数万頂点でFPSが20しか出なかったときの改善法

OpenGL(LWJGL)を使って3DレンダリングをしていましたがFPSが20しかでず、明らかに頂点数の割にFPSが低くて問題解決に悩まされました。
解決後は60FPS出ています。GPUの使用率も10分の1くらいになりました。

# 試したこと

 - Instanced Drawする
 - インターリーブ形式のVBOを使う

# 最終的な解決方法

```Java
glVertexAttribPointer(0, 3, GL_DOUBLE, false, 20, 0);
```
頂点データをGL_DOUBLEで登録するのがいけなかったようです。double値だと計算に時間がかかるのかなんなのかは知りませんがとにかくdouble値はできるだけOpenGLで扱わないほうが良さそうです。

```Java
glVertexAttribPointer(0, 3, GL_FLOAT, false, 20, 0);
```
こうやってfloat値で登録します。
任意のホスト名でssh接続できるサーバー内にGitリポジトリを設置したときのローカル環境側でやることメモ

#概要
~/.ssh/configで任意のホスト名でssh接続できるサーバーにGitリポジトリ設置した際に
ローカル環境でclone、リモートリポジトリの設定を行うコマンドをメモしておく

(Githubへの設定はネット上ですぐに見つかるが自サーバーケースはなかなか見つからず毎回時間浪費するので今回メモ。
「Githubは情報漏洩関連で不安なのでもう自サーバーにリポジトリおくぞ！」など意外と需要あるかもしれない…)

#前提条件
1. 任意のホスト名(configファイル内で定義)でssh接続できるサーバーがある(ssh ホスト名でつながる状態)
2. 上記サーバーにGitのリモートリポジトリ設置済み

#ローカル環境でやること

* まずは、git clone

```
git clone 任意のホスト名:パス/リポジトリ.git
```

* リモートリポジトリの設定

```
git remote set-url origin 任意のホスト名:パス/リポジトリ.git
```

おしまい。
Pythonで脳波を取得する

　ふと思い立って[MindWave Mobile](https://t.co/l7mL5Pqtll?amp=1)をヤフオクで落としました。140億個とも言われるニューロンが同時多発で動いている脳。その中の1つの電気信号をとっただけで何か分かるなんて毛頭信じちゃいないんですが、眠ってるかどうかくらいは分かるんじゃないかと思って実験してみようと思ったわけです。

　とりあえず動かしてみよう。でももうずいぶん昔のデバイスだから、誰かパケット解析くらい実装してないかな・・と見まわして、とりあえず最初にみつけた[Pythinkgear](https://github.com/groner/pythinkgear)がpipで入るらしいので入れてみました。動かそうとしたら、pipで入ったくせにPython 3に対応してなくてエラーが出るとか散々だったんですが、まぁついでだしと[ポーティングしておきました](https://github.com/groner/pythinkgear/pull/4)。

　これで、Pythonから脳波（の一部）をとれるようになったみたいです。
　使い方としては、[Neurosky製のDeveloperツール](http://developer.neurosky.com/docs/doku.php?id=developer_tools)をインストールして、BluetoothでMindWaveをPCと接続して、ThinkGear Connectorという仮想シリアルポートを作成するツールを立ち上げたら以下のコードでOKみたいです。
　ただ、ThinkGear Connectorからデータを吐き出させるとき、Devツール内のVisualizerとかで一旦デバイスの信号クオリティを確認してからつないだほうが手戻りがなくて良かったです。他の記事によると、最初からシリアルポートから読みだそうとしてもダメだったけど、こういったアプリで信号を確認してからだとうまくいったみたいな記述も見かけました。アプリ側からデバイスに対して何か設定を流したりしてるんですかね？

　まぁとりあえず、深い睡眠のときにあらわれるというデルタ波の強度。

``` Python
import thinkgear
import logging

def main():
    #logging.basicConfig(level=logging.DEBUG)

    for pkt in thinkgear.ThinkGearProtocol('COM5').get_packets():
        for d in pkt:
            if isinstance(d, thinkgear.ThinkGearPoorSignalData) and d.value > 10:
                print("Signal quality is poor.")

            if isinstance(d, thinkgear.ThinkGearEEGPowerData):
                print("Delta value: {}".format(d.value.delta))

if __name__ == '__main__':
    main()
```

　こちらは、1秒に1度出力される値です。この”強度”というのは、Neurosky製アルゴリズムが計算した値で、[単位はないらしい](http://developer.neurosky.com/docs/doku.php?id=thinkgear_communications_protocol#asic_eeg_power_int)です。なので、他の波形の値や他の時間の値と比較するという使い方らしい。なかなか扱いに困る。でも生体信号ってこんなもんなんだろうなぁ。
　デルタ波以外にも、シータ波、低アルファ波、高アルファ波、低ベータ波、高ベータ波、低ガンマ波、中ガンマ波がとれます。指定方法は[これ](https://github.com/groner/pythinkgear/blob/master/thinkgear/thinkgear.py#L236)。

　そして、生の計測した脳波をcsvに落とすコード。

``` Python
import thinkgear
import datetime

def main():
    file_path = "raw.csv"
    wflag = False

    with open(file_path, mode="w") as f:
        f.write("datetime, raw_wave")
        for pkt in thinkgear.ThinkGearProtocol('COM5').get_packets():
            for d in pkt:
                if isinstance(d, thinkgear.ThinkGearPoorSignalData) and d.value < 10:
                    wflag = True

                if wflag and isinstance(d, thinkgear.ThinkGearRawWaveData):
                    f.write("{},{}\n".format(datetime.datetime.now(), d.value))

if __name__ == '__main__':
    main()
```

　512[Hz]くらいで16bitの生の波形が取得できます。何気に凄くないかこれ。

　その他、[集中度合い](http://developer.neurosky.com/docs/doku.php?id=thinkgear_communications_protocol#attention_esense)や[リラックス度合い](http://developer.neurosky.com/docs/doku.php?id=thinkgear_communications_protocol#meditation_esense)も取れるようになってます。
　このあたりは、[Neuroskyのドキュメント](http://developer.neurosky.com/docs/doku.php?id=thinkgear_communications_protocol)と合わせて読むかんじで。

　ところで、寝オチたのを検知して目覚ましをかけるみたいな使い方ができないかと思って購入してみたわけですが、実際にこのヘッドセットをつけると、頭が締め付けられて装着は1時間が限界。とても居眠りどころじゃないというのはどうしたらいいんでしょうか。
git submoduleの追加/削除/更新の練習する

## ドキュメント

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB

## 認証が通らないパターン
`please make sure you have the correct access rights and the repository exists. exit status 128`

- git cloneにHTTPつかってる場合
- SSHKeyが未登録の場合


## submodule追加の練習

1. サブモジュールとして読み込むリポジトリ(child)を公開で作る
1. 親リポジトリ(parent)に1.を追加する

※HTTPで追加すると更新に失敗するのでSSHを利用
※HTTPで追加した場合は、[submodule削除](submodule削除)して入れ直し

```:Terminal
git init child
cd child
touch README.md
git add .
git commit -m "first commit"
# GITHUB上でchildリポジトリを作る
git remote add origin git@github.com:<GITアカウント>/child.git
cd ../
git init parent
cd parent
git submodule add git@github.com:<GITアカウント>/child.git
git add .
git commit -m "first commit"
```
VSCODE上なら以下の様に登録されたサブモジュールが青で表示される
![スクリーンショット 0003-04-19 17.49.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13713/91705249-94f7-c32f-a76a-c4c13e8b183c.png)

```:Terminal
# GITHUB上でparentリポジトリを作る
git remote add origin git@github.com:<GITアカウント>/parent.git
```

GITHUB上で見ると、以下の様にサブモジュールにリンクされている
(@以降はcommit番号)
![スクリーンショット 0003-04-19 17.54.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13713/96cf2a42-6212-e88f-9681-bc8b74c9c519.png)

### マスター以外のブランチを使う場合
```
git submodule add -d <ブランチ名> <リポジトリ名>
```

## submodule更新の練習
サブモジュール(child)を更新して親(parent)に反映

以下３つのやり方があるので、順に試す

1. `git submodule update --remote --merge`
1. `git submodule update --remote`
1. `git submodule update --recursive` 

# 

1. `child`の`README.md`を更新してPUSH
1. `parent`で更新をPULLしてマージ
1. `parent`をpush

README.mdを更新

```
cd ../child 
git add .
git commit -m "Update README.md"
git push
cd ../parent
git submodule update --remote --merge
# もしくは
# git submodule foreach git fetch
# git submodule foreach git merge origin/master
git add child
git commit -m "Update child"
git push

```
さらにREADME.mdを更新

```
# ここまで同じ
git submodule update --remote
# ここから同じ
```

さらにREADME.mdを更新

```
# ここまで同じ
git submodule foreach 'git pull origin master'
git submodule update --recursive
# ここから同じ
```


## サブモジュールの解除
```
cd ../parent
rm -rf child
git submodule deinit child
rm .gitmodules
rm -rf .git/modules/child
```

```
error: the following file has local modifications:
```

## ローカルリポジトリをサブモジュール


## リポジトリ削除
GitHubから公開した`child`を削除

## 参考
https://qiita.com/BlueSilverCat/items/19bb9b814572cd35b2ae
https://rochefort.hatenablog.com/entry/git_submodule_update_recursive
msys2 ucrt64環境でquick_exitするための方法

# quick_exitとは

https://cpprefjp.github.io/reference/cstdlib/quick_exit.html

これ見てください

あるいは

https://qiita.com/yumetodo/items/ba5bef7f64636ed2f439

をどうぞ

# これまでのmsys2 mingwでは

使えません。msvcrtには`quick_exit`が含まれていないからです。

https://stackoverflow.com/questions/36825196/quick-exit-not-available

# msys2 ucrt64では

https://qiita.com/yumetodo/items/d849a6dcf08e0435f815

普通に使える・・・はずもなく、一工夫必要です。

以下のコードが最短でquick_exitを呼ぶ方法です。

```cpp
extern "C" [[noreturn]] void quick_exit(int) noexcept;
int main()
{
        quick_exit(0);
}
```

つまり何かというと、`/ucrt64/include/c++/10.2.0/cstdlib`およびそこから参照される`/ucrt64/x86_64-w64-mingw32/include/stdlib.h`にはまだ`quick_exit`の宣言がありません。

でもucrt自体にはあるので、ならば標準ライブラリヘッダーなんか投げ捨てて自分で宣言を書けばいいわけですね！

~~・・・あとでバグレポ投げます。~~投げました

https://github.com/msys2/MINGW-packages/issues/8425

# 修正された

その後、mingwそのものの問題だったのでメーリングリストに投げ直していました。
https://sourceforge.net/p/mingw-w64/mailman/message/37265392/

すると

- 2021-04-22 03:38:54(UTC): https://sourceforge.net/p/mingw-w64/mailman/message/37266519/
- 2021-04-22 07:58:37(UTC): https://sourceforge.net/p/mingw-w64/mailman/message/37266635/
- 2021-04-22 08:38:39(UTC): https://sourceforge.net/p/mingw-w64/mailman/message/37266649/

ぽんぽんと修正が投げられて承認されてmasterにpushされました

https://sourceforge.net/p/mingw-w64/mingw-w64/ci/7dda261

```diff_c
--- a/mingw-w64-headers/crt/stdlib.h
+++ b/mingw-w64-headers/crt/stdlib.h
@@ -387,6 +387,9 @@
 #define _CRT_TERMINATE_DEFINED
   void __cdecl __MINGW_NOTHROW exit(int _Code) __MINGW_ATTRIB_NORETURN;
   void __cdecl __MINGW_NOTHROW _exit(int _Code) __MINGW_ATTRIB_NORETURN;
+#ifdef _UCRT
+  void __cdecl __MINGW_NOTHROW quick_exit(int _Code) __MINGW_ATTRIB_NORETURN;
+#endif
 
 #if !defined __NO_ISOCEXT /* extern stub in static libmingwex.a */
   /* C99 function name */
@@ -420,6 +423,9 @@
 #endif
 
   int __cdecl atexit(void (__cdecl *)(void));
+#ifdef _UCRT
+  int __cdecl at_quick_exit(void (__cdecl *)(void));
+#endif
 #ifndef _CRT_ATOF_DEFINED
 #define _CRT_ATOF_DEFINED
   double __cdecl atof(const char *_String);
```

そして

> https://sourceforge.net/p/mingw-w64/mailman/message/37266669/
>
> This has been fixed on master now:

と言ってくるLiu Haoさんめっちゃかっこいい。

はやくmsys2に降ってこないかなぁ・・・。
msys2でucrtのランタイムを使おう！ようこそucrt64

# ucrtとは

[Universal CRT へのコードのアップグレード | Microsoft Docs](https://docs.microsoft.com/ja-jp/cpp/porting/upgrade-your-code-to-the-universal-crt?view=msvc-160)

ここに解説があるが要約する。

まずプログラムを動かすにあたり、少なくともCのランタイムライブラリが必要になる。これはmsvcrtがこれまで用いられてきた

Visual Studio 2015でC lintimeのリファクタリングが行われ、様々な機能が追加された。例えばstrtodでの浮動小数点のパースの改善とか`std::quick_exit`の対応とかそういうのだ。これをUniversal C Runtime、ucrtと呼ぶ。

msys2でもこのucrtに対応する動きが見られている。

# msys2におけるucrt対応

わりとひっそりと行われている。

[https://github.com/msys2/MINGW-packages/issues/6901](https://github.com/msys2/MINGW-packages/issues/6901)

あたりが該当するissueにようにおもえる。

何回か`pacman -Syuu`で更新し続けているとそのうち`msys64`直下に`ucrt64.exe`/``ucrt64.ico`が生えていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/7064ecc7-313d-d03a-0f14-c8043722ba3f.png)

まだ駆け出しのプロジェクトでパッケージ側も対応していないものもある(私のパッケージもなんとかしないと・・・)。

# トラブルシューティング

## `ucrt64.exe`/``ucrt64.ico`がない！

`pacman -Syuu`で更新し続けましょう。そのうち生えます。該当するパッケージは
https://packages.msys2.org/package/msys2-launcher?repo=msys&variant=x86_64
これです。

## `pacman -Syuu`でucrt64を見に行っている様子がないが？

```
$pacman -Syuu
:: パッケージデータベースの同期中...
 mingw32 は最新です
 mingw64 は最新です
 ucrt64 は最新です
 msys は最新です
```

のようになっているのが望ましい状態だがucrt64がないぞという場合もある

### `/etc/pacman.conf`を確認する

```ini
[mingw32]
Include = /etc/pacman.d/mirrorlist.mingw32

[mingw64]
Include = /etc/pacman.d/mirrorlist.mingw64

[ucrt64]
Include = /etc/pacman.d/mirrorlist.ucrt64

[msys]
Include = /etc/pacman.d/mirrorlist.msys
```

上のようなのが含まれているのが望ましいが、ucrt64の項目がないかもしれない。その場合は手動で付け加える。

### `/etc/pacman.d/mirrorlist.ucrt64`を確認する

そもそもないかもしれない。そういう場合は`/etc/pacman.d/mirrorlist.minw64`をコピーして作成して、各URLの末尾を`ucrt64`に置換すればよい
HTMLでTwitterカードを設定するコード

最近のWordPressテーマだと標準で実装されていることが多いのですが、無料テーマとかだと実装されていないこともある「Twitterカード設定」

TwitterでURL付きのツイートをしたときにカードとして画像が表示されると目に止まりやすいので必然的にCTRも上がる。

そこで今回はHTMLのコードでTwitterカードを実装する方法をメモとして残しておきます。

```html
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@Twitterのユーザー名" />
<meta property="og:image" content="表示させたい画像のURL" />
```

最低限必要なのはこれだけ。

ページによって表示させる画像を変えたい、場合とかだとWordPressの有料テーマならアイキャッチ画像を自動で設定してくれるものが多い。

あとカードの種類は「summary_large_image」以外に「summary」があるけどカードサイズも画像サイズも小さいので人によって好みが分かれる。

＊WordPressの人は外観からテーマエディターからheader.php内にコードを記入しましょう


## HTML/CSSのお役立ち情報

https://wagtechblog.com/programing/html-css-school
Flexboxを使う時にはmarginを使用せずスイス国旗を作ってみた

```Flexbox``` を使う際、余白の調整で```margin```を使いたくなるが、
```Flexbox```  と　```margin```を同時に使うことはWEB制作する上であまりよろしくないと
教えてもらったので、それを踏まえてスイスの国旗を```margin```バージョンと```Flexbox``` バージョンで作って試してみました。

目標：Flexboxの基礎を理解するため
テキストエディターはVSCode.
↓下記のFlexboxチートシートを参考
[Css Flexboxのチートシート] (https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet)

～codeを書き始める前の準備～
・構成を考える！　何をどんな風に、どうやって作るのか？
　最初にある程度決めておくと後が楽になります。
　例　スイスの国旗を調べる
　　　```<div>```は何個必要なのか？
　　　```class```属性名はどうしようか？
　　　

・紙とペンで実際に枠を書いてみる（添付画像参照 準備出来次第添付します）
ここまで出来たらcodeを書いていきます♪ ※head部分は省略

```html
<div class="switzland1">
      <div class="land1">
        <div class="swit1 swits1">しかく１</div>
        <div class="swit1 swits2">しかく２</div>
        <div class="swit1 swits3">しかく３</div>
        <div class="swit1 swits4">しかく４</div>
      </div> 
    </div>
```

```css
.switzland1 {
  width: 450px;
  height: 300px;
  border: 1px solid black;
}

.land1 {
  width: 100%;
  height: 100%;
}

.swit1 {
  width: 180px;
  height: 120px;
  background-color: red;
}

```
一旦ブラウザで確認　↓

![スクリーンショット (25).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311071/9b866a65-b9b9-7579-2670-54db01b91480.png)

赤い、しかく１，２、３，４を```display: flex```を使って操作したいので、
親要素である、```.land1```　に```display: flex```をつけてあげる。

```css
.land1 {
  width: 100%;
  height: 100%;
  
  display: flex;　※
  flex-wrap: wrap;　※
}
```

![スクリーンショット (26).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311071/0b43939e-9715-c0f2-479b-953e2dbce536.png)

上記の状態から、```margin```　をつけてみる。

```css
.swits2 {
  margin-bottom: 60px;
  margin-left: 90px;
}
.swits4 {
  margin-bottom: 60px;
  margin-left: 90px;
}
```

![スクリーンショット (27).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311071/dcc988b3-4b4b-4e39-c7f6-ed41d8e5232d.png)

```margin``` を使ってみたが、一応問題なくスイス国旗ができました。
次に、```margin``` を使わず、```Flexbox``` のみでスイス国旗を作ってみます。

```css
.land1 {
  width: 100%;
  height: 100%;
  
  display: flex; ※
  flex-wrap: wrap;　※
  justify-content: space-between;　※
  align-content: space-between;　※
}
```

ブラウザで確認　↓↓

![スクリーンショット (28).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311071/9e2ce6ce-4668-495f-b34d-40e8a9ecebb8.png)

上記も```flexbox``` のみでもキレイに作成できました。


##　まとめ
挙動的に```margin```と```flexbox```を同時に使用しても問題ない。
ただ、```margin```本来の使い方を無視する形になるので、```flexbox```と```margin```を併用しないでできるようにしてあげる
```margin```は要素と要素の隙間を開けるモノ。
```flexbox```は要素と要素の間隔を調整するモノ。
両方共に、同じ使い方をするのと、```flexbox```で要素の間隔を調整してあげているのに、```margin```で要素の隙間を調整することはあまりよろしくない。
また、併用したところでどちらかが無視をされて上手く作動しないときがある。

上手にまとめが出来なかったが、```margin```と```flexbox```　は併用しない。と覚えておくことは損はないと思います。
ちなみに```padding```と```flexbox```の併用は良いとのことでした！



今回は以上です
ありがとうございます！
[gitエラー]remote: Invalid username or password. fatal: Authentication failed for


きっと今後未来の自分がエラーに躓くのでメモしとく。

## 結論
２段階認証の設定をしたときは
git clone https://hoge.gitではなく
git clone git://hoge.gitを使ってね。



```
# NG
~/hogeProject:user1 git clone https://github.com/hoge/hoge-branch.git
Cloning into 'hoge-branch'...
Username for 'https://github.com': user1
Password for 'https://user1@github.com': 
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/hoge/hoge-branch.git/'

# OK
~/hogeProject:user1 git clone git@github.com:hoge/hoge-branch.git
Cloning into 'hoge-branch'...
warning: You appear to have cloned an empty repository.

```
イキった方法でVSCodeを実行する（Windows）

こんにちは。すずともです。
VSCodeでプログラムを書くとき、大体の場合は対象のフォルダをVSCodeで開いて書き始めますよね？

一度開いたフォルダであれば、`Open Recent(最近開いたファイル)`に表示されるので開くのが楽ですが、新規プロジェクトなどで、初めてそのフォルダを開く場合、結構めんどくさいです。

というのも、

1. VSCodeを開く
1. 「ファイル」→「フォルダを開く」から対象のフォルダを選択

という手順を踏まないといけません。マウスを動かさないといけないし、めんどくさいですよね！？(僕だけ？w)

右クリックのメニューに「VSCodeで開く」を追加できるらしいですが、コンテキストメニューが大きくなるのも嫌なので、筆者は嫌いです。

ということで、以下の手順を提案しますw

# エクスプローラで`Alt`+`D`からの`cmd`からの`code .&exit`

手順を見出しに書いちゃいました笑。このままです。

エクスプローラで該当のフォルダを開いているとします。
この記事ではドキュメント直下の`test`フォルダをVSCodeで開くとします。

ここで`Alt`+`D`を押すと、下記画像のようにアドレスバーにカーソルがいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255360/8ced6aa6-5a4a-44cc-af65-e989c70253a6.png)

この全選択されている状態で、`cmd`と入力してEnterを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255360/8ebe0925-307f-f111-cf33-fa9f084b225f.png)

すると、コマンドプロンプトが起動します。カレントディレクトリは開いていたフォルダです。
これ、意外と結構使えるので便利ですよ(o^―^o)

開いたコマンドプロンプト内で、`code .&exit`と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255360/7a9c409d-2dc8-da68-1dd6-720b4724baba.png)

`Enter`を押すと、VSCodeがtestフォルダを開いた状態で起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255360/ac18058d-4465-ad95-631a-5ac7b5578441.png)

# 解説
解説って程でもないですが、軽く説明します。

- エクスプローラからの`Alt`+`D`
 これはエクスプローラのショートカットで、`Alt`+`D`(筆者の環境では`Ctrl`+`L`でも出来た)を押すとアドレスバーにカーソルがいくようになります。ここでみそなのが初めから「全選択」されているところ。

- からの`cmd`
　実は、エクスプローラのアドレスバーからコマンドプロンプトが起動できます。方法は簡単でアドレスバーに`cmd`と打つだけ。

- からの`code .&exit`
　`code <PATH>`コマンドで任意のパスをVSCodeで開くことが出来ます。先ほどコマンドプロンプトを起動したときのフォルダが既にカレントディレクトリにｎっているので、カレントディレクトリを指す`.`をPATHの部分に入れてあげれば、VSCodeを開いてくれます。
　その後の`&exit`はコマンドプロンプトを閉じる動作をしてくれます。これがないとコマンドプロンプトが起動した状態になってしまうので、exitコマンドを&でつなぐことで１行で実行しています。

# 最後に
ただVSCodeを起動するだけですが、マウスを触らずにキーボードだけで完結。プログラマーっぽい？ですかねw
最後にドキュメントフォルダ内にtestファイルを作ってvscodeを起動、かつJavascript/Typescriptランタイム「Deno」の開発環境を整えるまでの動作をGIFで起こしてみました。

ちなみに、エクスプローラで新規フォルダを作成するショートカットは`Ctrl`+`Shift`+`N`です。
Denoの開発環境を整えるのは以下の記事を参考に…

https://qiita.com/SuzuTomo2001/items/3d85eb92fcfff255ce46

![2021-04-20-00-25-02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255360/307d25fa-4108-651c-b432-22e2b65893db.gif)

なぜかコマンドプロンプトが終了できてませんねw。あと、キーボード操作もおぼつかないです。すみません。