OmniAICreator/Qiita-1.07M huggingface dataset:
margin, border, padding, position, flex-direction, align-items

#margin, border, padding
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662011/912a7d0c-ba6d-b6a6-451a-2dfe2239656e.png)

#marginとpadding
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662011/c72c9472-9f81-f67b-8c0d-f1a45108c705.png)

#position:relative;
現在の位置を基準に相対的な位置を決める

#position:absolute;
親要素を基準に絶対的な位置を決める

#position:fixed;
要素を指定した位置に固定する

#flex-direction
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662011/b562d8f4-dd2a-9530-4488-56625182f7a0.png)

#align-items
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662011/f2a2dae3-e9be-9782-c075-b1a7d5d1d9fc.png)
＃３【備忘録】do〜while文

#はじめに
　今日の東京は曇りだったおかげで日中はいつもより涼しかったです（32℃はあったと思いますが、、、）
　今日は私自身まだ慣れていないdo〜while文について書いていこうと思っています！

#開発環境
今回も"Eclipse"で総合開発環境でやってみました。
こちらの記事を参考に開発環境を構築してみてください。

[EclipseでJava開発環境を作る（Mac編）](https://codeaid.jp/eclipse-java-mac/)
※今回もMacでの作業となります。

#実装
```java

class Main {
   public static void main(String[] args) {
		int number = 1;
        do {
            number ++;
            System.out.println("number = " + number);
        } while (number < 5);
 
        number = 4;
        do {
            number ++;
            System.out.println("number = " + number);
        } while (number < 5);
 
        number = 5;
        do {
            number ++;
            System.out.println("number = " + number);
        } while (number < 5);
    }
}
```

上記コードを上から順に解説します！

　Mainクラスの中にmainメソッドを定義します。

```java
class Main {
  public static void main(String[] args) {
```
変数numberを定義し、初期値として１を代入します。

```java
int number = 1;
```

numberが5になるまで(number < 5)数を1（++）足し、ルーティングさせて出力します。
出力は`number = 数字`としたいので以下のようになってます。

```java

do {
            number ++;
            System.out.println("number = " + number);
        } while (number < 5);
```

変数numberに4を代入します。

```java
number = 4;
```

再びnumberが5になるまで(number < 5)数を1（++）足し、ルーティングさせて出力します。

```java

do {
            number ++;
            System.out.println("number = " + number);
        } while (number < 5);
```

変数numberに5を代入します。

```java
number = 5;
```

最後のdo〜while文もnumberが5になるまで(number < 5)数を1（++）足し、ルーティングさせて出力します。

```java

do {
            number ++;
            System.out.println("number = " + number);
        } while (number < 5);
```

Mainクラスとmainメソッドの閉じかっこも忘れずに！]

```java
 }
}
```


#実行
```sh:実行結果
number = 2
number = 3
number = 4
number = 5
number = 5
number = 6
```

と表示されていれば成功！

#エラーになってしまう場合
可能性としては`;`が抜けている場合があると思いますので確認してみてください！

#最後に
　今月最後の記事は学習放置していたdo〜while文について書いてみました、、、汗
近況報告になりますが、最近は会社で収益化を考えたwebサイトの作成をしておりました。
私自身設計が苦手で「これでいいのか？」と自問自答しながらなんとか実装寸前まできているところです！
今回はWordPressを使ってみたくて初めて触っていますが、少しずつ楽しくなってきているので
このまま楽しく作成していきたいですね〜笑
　９月ものほほんと記事を更新していきたいと思います！では！！！
いつも使っているgit stash saveは非推奨だった...

Gitのドキュメントには非推奨と書いてあった...

```
This option is deprecated in favour of git stash push. 
It differs from "stash push" in that it cannot take pathspec. 
Instead, all non-option arguments are concatenated to form the stash message.
```

これからは

```bash
git stash push
```

を使います...
#2 AWSのEC2インスタンス(ubuntu18.04)でPython環境を構築する

#はじめに
私はプログラミング言語の初学者です。
その為、読み間違いや理解不足の部分があると思います。
その場合はコメントで教えて頂けると幸いです。

「ゴール」は事前に作成したPythonのwebアプリケーションをデプロイする所まで行きたいと思います。出来るだけ初学者向けに書くつもりです。

作成手順

* AWSのEC2でインスタンスを構築後に、SSH通信をする　
* 構築したインスタンスの中にPythonの環境を構築する　←**現在はここです。**
* インスタンスの中に仮想環境を構築し、Django等をインストール（フレームワーク）
* PostgreSQLを設定する（データベース）
* インターネット上にアプリケーションが接続出来るように設定する（デプロイ前半）
* NginxとGunicornの設定する（デプロイ後半）

##環境を構築して行きます。
###ステップ１(接続編）
まずはじめに、環境構築する場所に移動します。
前回の記事に書いてあったSSH接続でubuntuサーバの中に入ります。
入り方は

```
$ ssh -i xxx.pem ubuntu@'username'
```
入るとこうなると思います。

```
ubuntu@xxx: username$ 
```

###ステップ２（インストール編）

* apt-getをアップデート
* python3-pip python-dev libpq-dev postgresql postgresql-contrib nginxをインストール
* python,psql,nginxのバージョン確認

```
$ sudo apt-get update
$ sudo apt-get install python3-pip python-dev libpq-dev postgresql postgresql-contrib nginx
$ python3 ―version
$ psql ―version
$ nginx -v
```

これでPythonはインストールされました。
次回は仮想環境を作って、Djangoを設定して行きます。
Pandasのread_csv()・read_table()でヘッダーがずれてしまう

# はじめに
csv形式で取得したファイルをpandasで取り込んで処理しようとしたところ、ヘッダーとデータがずれてしまったのですが意外と答えにすぐたどり着けなかったので記事にしました。
[解決法へジャンプ](#解決法)

# 動作環境
以下の環境で実行しました。

| モジュール | version |
| :--: | :--: |
|python| 3.8.3 |
|pandas| 1.0.5 |

# 問題

次のようなcsv形式ファイルをDatFrameとして取り込みます。

```csv:example.csv
Time  x   y   z
   0  1   2  10
   1  2   2  10
   2  3   2  10
..
``` 
`read_csv()`を使って取り込みます。

```python:read_csv.py
import pandas as pd
path = 'csvファイルのパス'
df = pd.read_csv(path)
print(df)
```
ターミナルでの出力結果は次のようになりました。

```bash
#    Time\tx\ty\tz
#  0    1\t1\t2\t10
#  1    2\t2\t2\t10
#  2    3\t3\t2\t10
..
```
余計な`\t`が入ってしまっています。カンマ区切りではなくタブ区切り（tsv形式）だったようです。  

read_tabel()で実行してみます。

```python:read_tsv.py
import pandas as pd
path = 'csvファイルのパス'
df = pd.read_table(path)
print(df)
```
次のような出力結果になりました。　　
`\t`は無くなりましたが、代わりにヘッダーとデータがずれてしまい、zのデータがすべてNaNになってしまいました。

```bash
#    Time  x   y    z
#  0    1  2  10  NaN
#  1    2  2  10  NaN
#  2    3  2  10  NaN
```

# 解決法
次のように`read_csv()`に引数を与えます。

```python:read_csv_2.py
import pandas as pd
path = 'csvファイルのパス'
df = pd.read_csv(path, sep='\s+')
print(df)
```

[padasのドキュメント](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html)によると、1文字以上の文字によって区切られたファイルに対して与える引数のようです。
もともとのデータがタブとスペース区切りになっているのが原因だったようです…。勘弁してよ…笑。

# まとめ
タブとスペースによって区切られていたデータを`csv_read()`に引数`sep='\s+'`を与えて、ヘッダーとデータを正しくDataFrameに変換できました。
【Kotlin】Listの中で定義したListをひとまとめにしたい

```kotlin
class A(
    val numbers: List<Int>
)
```
上記のようなクラスがあり、

```kotlin
val aList: List<A> = listOf(A(listOf(1, 2)), A(listOf(3, 4, 5)))
```
から、

```kotlin
val numbersAll: List<Int> = listOf(1, 2, 3, 4, 5)
```
というデータに変換したい。

### 結論
地道にコード書くしかなさそう。。。と思っていた。
(`numbersAll`の型は`mutableList`になる)


```kotlin
val numbersAll = mutableListOf<Int>()
aList.forEach {
    numbersAll.addAll(it.numbers)
}
```

が、`flatMap`というものを使えば1行で書ける(@htsign さんありがとうございます)。

```kotlin
val numbersAll: List<Int> = aList.flatMap { it.numbers }
```
Swiftでデザインパターン【Bridge】

元ネタ → [ochococo/Design-Patterns-In-Swift](https://github.com/ochococo/Design-Patterns-In-Swift#-bridge)

# クラス図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37598/fff51657-0083-de50-8d71-caba9ed7ebb2.png)



図の引用元：[Wikipedia: Bridge パターン](https://ja.wikipedia.org/wiki/Bridge_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

# 概要
The bridge pattern is used to separate the **abstract elements** of a class from the **implementation details**, providing the means to replace the **implementation details** without modifying the **abstraction**.
Bridgeパターンは、クラスの**抽象要素（プロパティやメソッドの定義）**を**（具体的な）実装の詳細**から分離するために使用される。**抽象要素（プロパティやメソッドの定義）**を変更せずに**（具体的な）実装の詳細**を置き換える手段を提供する。


# サンプルコード
```swift
// Abstraction
protocol Switch {
    // impl: Implementor
    var appliance: Appliance { get set }
    // function()：this.impl.implementation()
    func turnOn()
}
// Implementor
protocol Appliance {
    // implementation()
    func run()
}
// RefinedAbstraction
final class RemoteControl: Switch {

    var appliance: Appliance

    // refinedFunction()： this.impl.implementation()
    func turnOn() {
        self.appliance.run()
    }
    
    init(appliance: Appliance) {
        self.appliance = appliance
    }
}

// ConcreteImplementor
final class TV: Appliance {
    // implementation()
    func run() {
        print("tv turned on");
    }
}

// ConcreteImplementor
final class VacuumCleaner: Appliance {
    // implementation()
    func run() {
        print("vacuum cleaner turned on")
    }
}


// usage //

let tvRemoteControl = RemoteControl(appliance: TV())
tvRemoteControl.turnOn()

let fancyVacuumCleanerRemoteControl = RemoteControl(appliance: VacuumCleaner())
fancyVacuumCleanerRemoteControl.turnOn()
```

# クラス図との対応
|  サンプルコード  |  クラス図  |
| ---- | ---- |
|  **Switch** |  **Abstraction**  |
|  appliance  |  impl: Implementor  |
|  turnOn  |  function  |

|  サンプルコード  |  クラス図  |
| ---- | ---- |
|  **Appliance**  |  **Implementor**  |
|  run  |  implementation  |

|  サンプルコード  |  クラス図  |
| ---- | ---- |
|  **RemoteControl**  |  **RefinedAbstraction**  |
|  turnOn  |  refinedFunction  |

|  サンプルコード  |  クラス図  |
| ---- | ---- |
|  **TV**, **VacuumCleaner**  |  **ConcreteImplementor**  |
|  run  |  implementation  |

# 考察
`Switch`に**抽象要素（Abstract Element）**である`turnOn`の定義をしている。この`turnOn`の内実は`TV`や`VacuumCleaner`等の`Appliance`に準拠したクラスのメソッド（`run`）。`RemoteControl`はこれら`Appliance`に準拠したインスタンスをプロパティとして持ち、そのプロパティを差し替えることで`turnOn()`自体には直接の変更を加えず、つまり**命令手段はそのままに別の実装内容を実行する（実装の追加）**ことが可能になる（ポリモフィズム）。
mac で踏み台経由で svnサーバー にチェックアウトする

#やること
踏み台経由で svnサーバー にチェックアウトする。
・ポートフォワードの設定を記述
・SnailSVN Lite: SVN for Finder を使ってチェックアウト

#ポートフォワードの設定を記述
ターミナルから `.ssh/config` にポートフォワードの設定を記述する
以下コマンド

```言語:コマンド
$ vim ~/.ssh/config
```
ファイルに以下の設定を書く

```言語:~/.ssh/config
Host ポートフォワードの設定名（任意）
  HostName      踏み台IP
  User          ユーザー名
  Port          踏み台ポート
  IdentityFile  ~/.ssh/認証キー
  LocalForward  ポート名（任意） svnサーバーIP:svnサーバーポート
Host チェックアウト先に使う設定名（任意）
  HostName      localhost
  User          ユーザー名
  Port          ポート名（LocalForward）
  IdentityFile  ~/.ssh/認証キー
```

#SnailSVN Lite: SVN for Finder を使ってチェックアウト
以下の url から SnailSVN をダウンロード
手順通りインストールする
しっかりインストールできるとファインダー右上に subversion のアイコンが出る
アイコンを押すとメニューが出てくる
![スクリーンショット 2020-08-31 17.47.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681491/625969e3-2ae7-0164-90f5-303e6c44c869.png)

ターミナルを開いて以下のコマンドを使ってポートフォワードする。
ポートフォワードの設定名（任意）で設定した物を使う

```言語:コマンド
$ ssh -fN ポートフォワードの設定名
```

コマンドを叩いたら、ファインダーの subversion のメニューから `SVN Checkout...` を押下すると設定が開く。
![スクリーンショット 2020-08-31 18.04.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681491/02db3e87-186f-5da8-f6a9-c1ea937c1e87.png)

Repository の `URL of repository` には以下のように設定
`svn+ssh://チェックアウト先に使う設定名（任意）/ソースを管理してるディレクトリ`
Repository の `Checkout directory` にはソースを置くディレクトリ名

`OK`を押したらチェックアウトが始まります。
超初心者向け　CSRFについて簡単にまとめてみた

CSRFについて初心者が初心者向けにまとめてみました。
CSRF関連のエラーが発生したので、CSRFについて調べていましたが具体的にどのような手法(ソース)なのか乗っている記事が少なかったので備忘録としてもまとめています。


#CSRFとは
色々と記事があるので割愛。
[クロスサイトリクエストフォージェリ（CSRF） - Trend Micro]
(https://www.google.com/search?q=CSRF&oq=CSRF&aqs=chrome..69i57j0l6j69i60.6460j0j7&sourceid=chrome&ie=UTF-8)

#CSRF被害の流れ
利用者が対象のサービスにログイン
→クライアントPCで不正なURLをクリック
→自分のアカウントで勝手にクレジット購入される、パスワードが変更されるなど。
[3分でわかるXSSとCSRFの違い]
(https://qiita.com/wanko5296/items/142b5b82485b0196a2da)

#CSRFのやり方
urlを踏んだ先にどのようなコードが書かれているか。パスワード不正変更を例にする。

```html:index.html
    <form action="https://hack-csrf-sample.herokuapp.com/mypage/edit" method="POST">
		<input name="userId" value="hogehogehacker" />
		<input name="password" value="hogehogehacker" />
	</form>
	<script>
		var form = document.querySelector("form");
		form.submit()
	</script>
```

パスワードの変更を例にすると、
①urlをクリックした先のhtmlのformにリクエストするパラメーターを入れ（今回だったら変更するパスワードとユーザーID）
②このページが開いた瞬間にjavascriptでパスワード変更のリクエストを送っている。

[WEBエンジニアなら必ず知っておくべき「CSRF」のサンプルサイトを作ってみた](https://qiita.com/sagami1991/items/23f72ab4e6552221188a)　参照

#CSRFの対策
一例

```php:トークン生成
  $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(16));
```

```php:index.php
  <form action="" method="POST">
    <input type="text" value="" name="userId">
    <input type="text" value="" name="password">
    <input type="hidden" value="<?= h($_SESSION["token"]) ?>" name="token">  ←生成したトークン付与
    <input type="submit" value="登録">
  </form>
```

```php:サーバーサイド
　　if (isset($_POST["token"]) && $_POST["token"] === $_SESSION["token"]) {
      正規のフォームからのリクエスト
    } else {
      非正規のフォームからのリクエスト
    }
```

クライアント側のリクエストのパラメーターにサーバー側で作成した、トークンを入れておくことで、サーバーがレスポンスしたformかどうか確認している。（不正なユーザーが作成したformではないか確認）

[実際にCSRF攻撃してみた](https://qiita.com/kenta_nk/items/e7d369596a3999b0b666) 参照
MaterialUIのmakeStylesのインポート先の@material-ui/core/stylesと@material-ui/stylesの違い

## はじめに

MaterialUIを使っていて、スタイル調整したい時にmakeStylesを使うことがあると思います。

breakpointsやpaleteなどのthemeを使おうと思ったときに、`defaultTheme型にはbreakpointsがない`とTypeScriptのコンパイルエラーが出たので調べたら、makeStyles自体が`@material-ui/core/styles`と`@material-ui/styles`の二つからインポートできるんですね。

で、どう違うのか調べたので書いておきます。

ちなみにVSCodeの補完機能で、インポートした場合に`@material-ui/styles`からインポートされてしまってエラーがでたので気づきました。

## 公式ページ

調べてみると`@material-ui/core/styles vs @material-ui/styles`という項目に以下のように記載されていました。

>Material-UIの使用時にインストールするパッケージの数を減らし、インポートを簡略化するために、`@material-ui/styles`モジュールは`@material-ui/core/styles`から再エクスポートされます。

```ts
// Re-export with a default theme
import { makeStyles } from '@material-ui/core/styles';

// Original module with no default theme
import { makeStyles } from '@material-ui/styles';
```

とりあえずデフォルトのテーマを使いたい場合は、`@material-ui/core/styles`からインポートして、使わない場合は'@material-ui/styles'からインポートすれば問題なさそうです。

## Theme型について

`@material-ui/core/styles`からインポートすればmakeStylesに渡すコールバック関数の引数に受け取る`theme`が`Theme型`になります。ですので、breakpointsやpaletteが使えます。

```ts
import { makeStyles } from "@material-ui/core/styles";

// themeがTheme型に推論されるのでbreakpointsが使える
const useStyles = makeStyles((theme) => ({
  drawer: {
    [theme.breakpoints.up("sm")]: {
      flexShrink: 0,
      width: 256,
    },
  },
}));
```

以下のように`Theme`もインポートして、themeに型付けしてあげてもいいと思います。

```ts
import { makeStyles, Theme } from "@material-ui/core/styles";
const useStyles = makeStyles((theme: Theme) => ({
 //省略
}));
```

ちなみに`Theme型`は以下のように定義されています。

```ts:@material-ui/core/styles/createMuiTheme.d.ts
export interface Theme {
  shape: Shape;
  breakpoints: Breakpoints;
  direction: Direction;
  mixins: Mixins;
  overrides?: Overrides;
  palette: Palette;
  props?: ComponentsProps;
  shadows: Shadows;
  spacing: Spacing;
  transitions: Transitions;
  typography: Typography;
  zIndex: ZIndex;
  unstable_strictMode?: boolean;
}
```

## DefaultTheme型について

`@material-ui/styles`からインポートすると、`Theme型`がないので`DefaultTheme型`になります。

```ts
import { makeStyles } from "@material-ui/styles";

// themeがDefaultTheme型に推論されるのでbreakpointsが使えない
const useStyles = makeStyles((theme) => ({
  drawer: {
    [theme.breakpoints.up("sm")]: {  // エラー！！
      flexShrink: 0,
      width: 256,
    },
  },
}));
```

`DefaultTheme型`は次のようにテーマの中身が記載されていないため、breakpointsなどは使えません。

```ts:@material-ui/styles/defaultTheme/index.d.ts
export interface DefaultTheme {}
```

## まとめ

自分はデザインセンスが皆無で、社内の業務システムとか作る時にMaterial-UIがものすごく便利なので重宝しています。同じような方は是非使ってみてください。

あと、TypeScriptで書けばコード作成中にチェックできるので、やっぱりTypeScriptは学ぶべき言語だと思いました。

間違ってたら指摘していただけると幸いです。
Python3 で標準型データのみをもつ辞書データ(dict)から class の動的変数を生成するメモ

たとえば設定ファイルを JSON で書いておいて, dict で読んで, Class の変数にしたい.
文字列ルックアップだと, typo したときにバグになってしまうことがある.

とりあえず設定データ(e.g. 数値, 文字列)であれば `__dict__` を update すれば行ける.

```
class Conf:
  def __init__(self):
    pass

d = { 'a': 3 }

c = Conf()
c.__dict__.update(d)

print(c.a)
```

## 変数を dict にしたい

逆に変数から dict を作るのも, `__dict__` を iterate すれば行ける.

## TODO
 
* [ ] すでに変数が定義されていると上書きされてしまうので, 上書きチェクの機能をつけてみたりする
自作キーボード QMK を Dockerに入ってmakeする。Windowsならではの巻

# fwのダウンロード

## 大本をまるっと持ってくる
`git clone https://github.com/mackee/qmk_firmware.git`

## 自分が変更したいキーボードのブランチに切り替える。今回はpulsarの場合

```
cd qmk_firemware
git branch pulser
```

必要に応じてサブモジュールもまるっと落としておく

# ビルド用のコンテナDL

```
docker pull qmkfm/base_container
```

## qmkのフォルダーをコンテナ内に/qmkとして、マウントしつつ
インタラクティブモードでコンテナを起動する。

```
docker run -it  -v C:\Users\a2c_n\tmp\qmk\qmk_firmware:/qmk qmkfm/base_container
```

## makeする

```
make pulsar/rev2:custom
```
文字列の置換と削除


# 文字列の置換と削除

プログラミングで文字列を扱う時、文字列の一部を置き換えるという処理をよく実行します。
文字列オブジェクトの持つreplase()メソッドを使うと、文字列の一部を別の文字列に置き換え、置換することができます。
【例】
orig_str = “こんにちは”
orig_str.replase(“こ”, “あ”)
↓
あんにちは 

replase()メソッドを呼ぶと、文字列を置換した結果が新しい文字列になって返ってきます。
メソット呼び出しに使った文字列オブジェクトは変更されません。※文字列は変更不可能なデータ型

replase()メソッドは、2番めの引数に空の文字列を渡せば、文字の削除にも使えます。
指定した文字列が空の文字列に置き換わり、結果として削除されます。
例えば、3桁ごとにカンマの入った整数相当の文字列を、数値として扱う場合、単純に文字列を数値に変換するなら
組み込み関数のint()を使えます。しかし、カンマのような記号が入ると、int()関数がエラーを起こしてしまいます。
事前に、replase()メソッドを使って、不要な文字列を取り除くようにし、その上でint()関数で数値に変換すれば良いです。
【例】
str_num = “1,000,000”
num = int(str_num.replase(“,” ,  “”))
num
↓
1000000


split()メソッド
split()メソッドを使うと、文字列を特定の文字を目安にして分割できます。
タブや、スペースのような空白文字列や、カンマで分割された長い文字列を、細かい文字列に分割するのにsplit()メソッドを使います。
Excelのような表計算ソフトでは、表の内容をタブで区切る形式で書き出せます。
また、インターネットからダウンロードできるデータも、似たような形式で配布されていることがあります。
このようなデータをPythonに取り込んで処理する時split()メソッドを使います。
split()メソッドは、分割に利用する区切り文字列を引数をして渡して、結果を文字列のリストとして返します。
なお、Excelなどの表計算ソフトが書き出すCSV形式のファイルは、フォーマットが複雑でsplit()メソッドでは扱いづらいです。

join()メソッド
join()メソッドを使うと、split()メソッドと逆の処理を行えます。
join()メソッドは、文字列を要素として持つリストを引数にとって、リストの文字列を連結してた文字列で取得することができます。
連結の時、間に挟む連結文字列を使ってjoin()メソッドを呼び出します。
例えば、空白で区切られた数値相当の文字列を、カンマで区切る形式に変換したいとします。
split()とjoin()を組み合わせると次のように書けます。
【例】
str_speeds = “38 42 20 40 39”
speeds = str_speeds.split()
csep_speeds = “,”.join(speeds)
csep_speeds
↓
38,42,20,40,39

空白にカンマを置き換えるだけなら、文字列型のreplase()メソッドを使って［str_speeds.replase(“ “ , “,”)］
と書けますが、split()とjoin()を組み合わせる方法には、replase()メソッドが持たない利点があります。
split()メソッドは、分割しようとする文字列の前後に不要な空白があったり、間のスペースが複雑だったりしても
上手に要素を分割してくれます。

replase()を使った場合とsplit()とjoin()を使った場合の比較
【replase()の場合】
str_speed2 = “ 38 42 20 40 39 “
str_speed2.replase(“ “, “,”)
↓
,38,42,20,40,39,

【split()とjoin()の場合】
str_speed2 = “ 38 42 20 40 39 “
speed2 = str_speed2.split()
csep_speed2 = “,”.join(speed2)
↓
38,42,20,40,39

手入力したデータなどでは、この例のような余分な空白が入りがちです。
このようなデータをに扱うためには、split()とjoin()を使うと便利です。
OpenCV for Unityを使ってバーチャル動画背景メーカーを作った話



##記事の概要
OpenCV for Unityという95ドルのアセットを用いて、ZOOMなどのバーチャル動画背景を作成するデスクトップアプリを作りました。
http://virtual-background-movie-maker.tilda.ws/
こちらのサイトにアプリの説明やダウンロードするリンク先を載せています。

##作った背景
ZOOMなどのビデオ通話に使う、バーチャル「画像」背景作成アプリはあるのですが、バーチャル「動画」背景作成アプリはまだありませんでした。
そこでバーチャル動画背景メーカーを作ることになったのです。

##使用した技術
####OpenCV for Unity
https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088
OpenCV for Unityにある「VideoWriter」というSceneに、録画して動画を作成する機能があったので、これをそのまま使用しました。
注意しなければならない点は、保存する動画のコーデックです。OpenCV for UnityのReadme.pdfに書かれている動画のコーデック形式を拡張する設定をします。
VideoWriter.csの以下の関数の部分を書き換え、保存する形式を「.mp4」に変える必要があります。

```VideoWriter.cs
writer.open(savePath, VideoWriter.fourcc('H', '2', '6', '4'), 30, new Size(Screen.width, Screen.height));
```

こうすることで保存した動画をそのままZOOMのバーチャル動画背景として読み込ませることができます。

####StandaloneFileBrowser
https://github.com/gkngkc/UnityStandaloneFileBrowser#readme
この機能を使うことで、ユーザーが持っている画像や動画のファイルを動的に読み込ませることができます。

####AfterEffectのアニメーションフォント
アルファベットで名前を表示する部分に使用しました。

####CharTweener
https://github.com/mdechatech/CharTweener
TextMeshProの文字を1文字ずつずらして動かすために使いました。

####HSV Color Picker
https://github.com/judah4/HSV-Color-Picker-Unity
文字の色を選択するカラーピッカーのアセットです。

##感想
OpenCV for Unityを使うことで、動画作成デスクトップアプリを作ることができました。
OpenCV for Unityは95ドルの有料アセットなのですが、これを使わないでUnityのデスクトップアプリ内で動画を作成する方法を見つけることはできませんでした。
今回はZOOM向けのバーチャル動画背景作成アプリとしましたが、他にも応用できると思います。
汎用コンピュータにおけるファイル、DBMSと関係データベース

#汎用コンピュータとは
　科学技術計算、事務処理、制御用等、ソフトウェア次第で様々な用途に利用することができる大型のコンピュータのこと、
　基幹業務処理において利用されることが多いらしい。メインフレームとも呼ばれる。


#汎用コンピュータにおけるファイル
　一連のデータをまとめたもの。**レコード**の集合が**ファイル**という

#ファイルへのアクセス方法
　アクセス方法は以下の３種類がある

　**・順次アクセス**
　先頭レコードから順番にアクセスする方法。シーケンシャルアクセスとも呼ばれる
　![図91.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/1bc9ed6c-6bb2-82d4-b6e9-8e52ab84abc6.png)


　**・直接アクセス**
　任意のレコードに直接アクセスする方法。ランダムアクセスとも呼ばれる
　![図92.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/395ba2ad-105f-887c-016d-a56f0c50cb4c.png)


　**・動的アクセス**
　順次アクセスと直接アクセスを組み合わせた方法。任意のレコードに直接アクセスした後
　それ以降を順次アクセスで順番に処理する。
　![図93.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/3fac1915-cb06-fd06-687b-10ac2600ce35.png)


#ファイル編集法
　代表的な編成は以下の通り
　
　**・順編成ファイル**
　　頭から順番にレコードを記憶していく
　　もっとも単純な編成法で、順次アクセスのみが可能

　**・直接編成ファイル**
　レコードの中のキーとなる値を利用することで、直接アクセスを可能とする編成法が、直接編成ファイル
　**直接アドレス方式**と**間接アドレス方式**があり、それぞれキー値から格納アドレスを求める

　・直接アドレス：キー値の内容をそのまま格納アドレスとして用いる方式
　・関節アドレス方式：**ハッシュ関数**という計算式により、キー値から格納アドレスを算出して用いる方式
　　<font color="#cc0000">※ハッシュ関数による計算の結果が重複することで異なるレコードが同じアドレスで衝突してしまうことがある。
　　これを**シノニム**という</font>

　**・索引編成ファイル**
　索引を格納する**索引域**とレコードを格納する**基本データ域**、そこからあふれたレコードを格納する**あふれ域**という
　3つの領域から構成され索引による直接アクセスと先頭からの順次アクセスという両方の特性を備える編成法
　![図96.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/0c6d0c94-3e68-0dd3-2355-47820e08c6d6.png)

　

　**・区分編成ファイル**
　**メンバ**と呼ばれる順編成ファイルを複数持ちそれらを格納する**メンバ域**と書く目場へのアドレスを管理する
　**ディレクトリ域**とで構成される編成法
　

#DBMSとは
　**データベース管理システム(Data Base ManaSement System)**のこと
　DBMSは、データベースの定義や操作、制御などの機能を持つミドルウェア

#関係データベースは表、行、列とは
　関係データベースは表の形でデータを管理するデータベース
　![図94.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/e83b1f16-6dbc-fe46-1e4f-4f8477602ea2.png)


#表を分ける「正規化」という考え方
　関係データベースでは、蓄積されているデータに矛盾や重複が発生しないように、
　表を最適化することが**正規化**

#関係演算とビュー表
　関係演算とは、表の中から特定の行や列を取り出したり、表と票をくっつけて新しい表を
　作り出したりする演算のこと。「選択」「射影」「結合」などがある。
　**・選択**
　　行を取り出す演算。この演算を使うことで、表の中から特定の条件に
　　合致する行だけを取り出すことができる
　**・射影**
　　列を取り出す演算。この演算を使うことで、表の中から特定の条件に
　　合致する列だけを取り出すことができる
　**・結合**
　　表と表とをくっつける演算。表の中にある共通の列を介して2つの表につなぎ合わせ

　また、関係演算を用いると、ため込んだデータを使って様々な表を生みだすことができる
　このような、仮想的に作る一時的な表のことを**ビュー表**という

#スキーマ
　スキーマとはデータベースの構造や使用を定義するもの
　標準的に使用されているANSI/X3/SPARC規格では3層スキーマ構造をっている。
　外部スキーマ、概念スキーマ、内部スキーマという3層に定義わけることで、データの独立性を高める。
　![図95.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/db8378c0-2ce3-d783-1b47-c1467851dfe9.png)

　
　
#以上
【流出解析】シリーズ　第1回　流域界の決定と入力データの用意

# 移転のお知らせ

こちらの記事は下記のサイトに移転しました。

> [NNテックブログ](https://nnhiroba.xsrv.jp/nnTechBlog/Article/Article?ID=31)
ADGroupとADGroupメンバーの一覧の出力方法

【PowerShell】ADGroupとADGroupメンバーの一覧の出力方法


PowerShellで下記コマンドを実行

Get-ADGroup -Filter *| 
    select Name, @{Label = "MemberNames"; Expression = {($_| Get-ADGroupMember| select -ExpandProperty Name) -join ","}}|
    Format-List


ADグループ名とそのグループに所属しているメンバーの一覧が表示されます。

■出力例
GroupA
User1,User2,User3

GroupB
User4

GroupC
User5,User6

※このコマンドではグループ名とメンバー名以外のプロパティの出力は省略しています。


プロパティの情報も必要であれば、
select Name, @{...　となってるところを select *, @{...　とします。

また、ファイルを出力するときはFormat-ListではなくExport-Csvにします。
[Python]librosaを使用してopus音源をwav音源に変換する

# はじめに
音源データ集めをしていたらopusファイルのデータにたどり着いたので，データの形をwavに統一したいため，wavファイルに変換しようというのが今回のモチベです．
面白かったので記録がてら残しておきます．

## 環境
- Windows 10 Home
- Python: 3.8.5
- librosa: 0.8.0
- ffmpeg: 4.3.1-static-64-bit

## 各拡張子の特徴
- opus
    - 人間が知覚できる聴覚全体を再現することができる音源を保存している形式．
    - ビットレートは固定と可変の両方あるため，ファイルの容量を小さくすることも可能
    - 非可逆音声圧縮あり，人間の声の録音にも向いている(.mp3は音楽向き)

- wav
    - 非圧縮音声であるため，データ数=標本化周波数 x 秒数，で簡単にデータを算出することができる
    - データ構造がコンテナフォーマットのため，[ファイルヘッダの情報](http://soundfile.sapp.org/doc/WaveFormat/)が分かれば扱いやすい
    - ビットレートは固定なので，ファイル容量は圧縮音声より多い

## 使用ライブラリ
ライブラリの候補として```PyOgg+PyOpenAL```, ```PySoundFile```, ```librosa+PySoundFile+ffmpeg```が挙がりましたが，更新頻度が高く人気のある```librosa```を主軸にして作成することにしました．
ffmpeg(Fast Forward MPEG)は[公式](https://ffmpeg.org/download.html)よりバイナリファイルをダウンロードしてパスを通してます．

## opusからwavに変換

使用するファイル:[このサイト](https://www.aconvert.com/jp/audio/opus-to-wav/)の例示ファイル(```sample.opus, sample.wav```)をダウンロードしています．

- sample.opus
    - 容量: 248 KB
    - 標本化周波数：48000 Hz
- sample.wav
    - 容量：1,146 KB
    - 標本化周波数：22050 Hz
    - ビットレート：352 kbps

```python
import librosa as lr

opus_file_path = "sample_opus_files/sample.opus"

# Required ffmpeg(Fast Forward MPEG) https://ffmpeg.org/download.html
# defalt sr=22050: issue https://github.com/librosa/librosa/issues/509
data, samplerate = lr.load(opus_file_path, sr=None)

# using PySoundFile as sf
lr.audio.sf.write("sample.wav", data, samplerate)
```

やってることはとても単純です．たぶんライブラリが使用できるように準備するほうが時間かかります．

## さいごに
今回は標本化周波数(サンプリング周波数)がopusでは，48000 Hzでwavでは，22050 Hzだったので結果の違いに焦りましたが純粋にwavデータ作ったときに標本化周波数のデフォルトが違ったのかなぁと考えています．同じ結果にしたいなら```sr=None```の引数を消せば同じ結果になります．
この辺りは，[ここ](https://note.com/hama_matcha/n/nd792ba26b112)でちょろっと書いているので気になる方は見てもらえればなと・・・
変換の方法は決まったのであとは，フォルダ単位で指定すればopus2wav変換できるようにしてくれるコードを書いてお終いですね．Pythonなら余裕でやってくれそうです．
あと，今回のデータしかり，ほかのデータでもあんまり標本化周波数を気にして変換かけないだろうなぁと思うことがあります．
人間の話し声において，ナイキスト周波数は8000 Hzあれば十分なので標本化周波数が16000 Hzあれば後はあまり知覚されないので，数字で見ないと感覚ではわからないなぁと，私もよくやらかすので・・・

## 追記
- 2020 0903
    - フォルダレベルで変換可能なツールを作ったので[自身のGitHub](https://github.com/HamaguchiKazuki/opus2wav.python)に置いときます．
特定フォルダ配下のアクセス権をCSVに出力する方法

【 PowerShell】特定フォルダ配下のアクセス権をCSVに出力する方法

PowerShellで下記コマンドを実行

 Get-ChildItem -Recurse | Get-Acl | Select-object @{Label="Path";Expression={Convert-Path $_.Path}}, AccessToString |Export-Csv C:\Users\Desktop\○○○.csv -encoding Default


[説明]
・Get-ChildItem
フォルダ下のアイテムを取得

サブフォルダの配下も取得する場合は -Recurse を追加


・where {$_.mode -match “d”}
対象をフォルダのアクセス権を取得

ファイルのアクセス権も取得したい場合はこのコマンドを削除


・Get-Acl
アクセス権情報を取得


・Select-object
出力する項目を絞る


・@{Label=”Path”;Expression={Convert-Path $_.Path}}
フォルダのパス情報を出力


・AccessToString
アクセス権情報を出力


・Export-Csv 
CSVに出力


・C:\Users\Desktop\○○.csv
CSVファイルの保存先を指定（※今回はデスクトップ上に「○○」というファイル名で保存します。）

日本語フォルダ名、アクセス権情報が文字化けする場合は　-encoding Default　を追加



＜PowerShellのドライブを切り替える方法＞

・CD ドライブ名
※ドライブ名のあとにコロン(:)を入力することを忘れないように注意
【Swift】範囲型について

###1.はじめに
---
今回は基本的なデータ型の１つである、範囲型についての説明と、使い方を解説していきます。(もう１つの基本的なデータ型であるストライド型については次回の記事で解説します。)

###2.範囲型とは
---
まずSwiftには**範囲演算子**というものがあり、「A..<B」や「A...B」など、上限値Bを範囲に含めなかったり、範囲に含めたりするものがあります。ここでは上限、下限のデータ型を**境界値型**と呼ぶことにします。境界値型をTで表すとすると、先ほどの前者の範囲を表すデータ型をRange＜T＞、後者はClosedRange＜T＞のように型パラメータ付きの記述で表すことができます。ただし範囲を表さなくてはいけないので、Tは要素間の大小比較が可能な型でなくてはならないことに注意してください。

###3.片側範囲型と範囲演算子
---
範囲型には上限値のみの範囲、下限値のみの範囲もあり、これらを片側範囲といいます。ここまでで説明したものも含め、次にまとめます。

<dl>
<dt>A..＜B</dt>
<dd>Range＜Int＞</dd>
<dd>Range＜Double＞</dd>
<dt>A...B</dt>
<dd>ClosedRange＜Int＞</dd>
<dd>ClosedRange＜Double＞</dd>
<dt>A...</dt>
<dd>PartialRangeFrom＜Int＞</dd>
<dd>PartialRangeFrom＜Double＞</dd>
<dt>..＜B</dt>
<dd>PartialRangeUpTo＜T＞</dd>
<dt>...B</dt>
<dd>PartialRangeThrough＜T＞</dd>
<dl>

PartialRangeFrom＜T＞型は下限値のみの範囲で、下限値は必ず範囲に含まれます。上限値のみの範囲では、上限値自体を範囲に含めるかどうかで２つの種類があります。上限値を含まないのがPartialRangeUpTo＜T＞型で、含むのがPartialRangeThrough＜T＞型です。

以下では範囲型のインスタンスのことを範囲と呼ぶこととします。範囲型は構造体として定義されているので、範囲自体もそのインスタンスとして初期化したり、メソッドやプロパティを利用できます。範囲型の初期化にはイニシャライザよりも範囲演算子を利用するのが簡単です。以下にいくつかの例を示します。

```Swift:
0 ... 5               //ClosedRange＜Int＞型
"a" ... "x"           //ClosedRange＜String＞型
1.5 ..< 4.0           //Range＜Double＞型
10...                 //PartialRangeFrom＜Int＞型
...UInt(25)           //PartialRangeThrough＜UInt＞型
..<Float(3.14)        //PartialRangeUpTo＜Float＞型
```

###4.範囲型のプロパティとメソッド
---
範囲型の主なプロパティとメソッドを示します。範囲型によっては備えている機能が異なることがあるので注意してください。

**lowerBound: T { get }**
範囲の下限値

**upperBound: T { get }**
範囲の上限値

**contains(_: T) -> Bool**
引数の値が範囲に含まれる場合にTrueが返る

**overlaps(_: Range＜T＞) -> Bool**
インスタンスの範囲と引数の範囲が重複しているとTrueが返る

###5.乱数の生成
---
ここで乱数の生成等、ランダム性を利用する際の方法についてまとめます。Swiftには標準ライブラリで、整数や実数で範囲を指定し、そこに含まれる乱数を返すというものが提供されています。以下に示します。

```Swift:
Int.random(in: 2 ... 4)            //2から4のまでのいずれかの整数
Double.random(in: 3.14 ..< 4.00)   //3.14から4.00までのいずれかの実数
Bool.random()                      //trueまたはfalse
```

このように、整数、実数、Bool型のタイプメソッドで乱数を生成できます。引数にはその型を境界値型とするRange型かClosedRange型の範囲を指定します。Bool型の場合は引数は不要です。
また他の方法として、shuffled()というメソッドを利用して、含まれる要素をシャッフルした配列を返します。

```Swift:
(2..<6).shuffled()                     //[3, 2, 5, 4]等を生成 
String("シャッフルします".shuffled())   //"ッフすシャまルし"等を生成
```

その他にも、randomElement()というメソッドで、要素をランダムに１つ取り出すことができます。要素がない場合はnilが返ってくるので、型はオプショナル型になります。

```Swift:
(1...9).random.Element()!                           //1～9のどれか
["攻撃する", "防御する", "逃げる"].randomElement()!  //3つの文字列のどれか
```

これらのメソッドの実行には、システムが用意した乱数ジェネレータが使われ、乱数列の初期設定は実行されるたびに自動的に行われるので、私たちが初期値を与える必要はありません。

###6.おわりに
---
今回は範囲型についての説明と、その基本的な使い方や、それを利用した乱数の生成法についての解説をしました。冒頭でもお伝えした通り、次回は同じく基本的なデータ型の１つである、ストライド型についての解説の記事を上げようと思います。記事が上がりましたら、そちらの方もぜひご覧ください。
WinPCのgitで「fatal: Authentication failed for XXX」が出た時の対応方法


# 対象読者
以下のWindowsPCを使用しており、HTTP経由でのpullやcloneした時に```fatal: Authentication failed for```が出ている人が対象読者です。
以下がエラーメッセージ。

```
> git clone https://gitserver.com/XXXX/XXXX.git
Cloning into 'Database'...
fatal: Authentication failed for 'https://gitserver.com/XXXX/XXXX.git'
```

# 解決方法：Window 資格情報を追加
**Windowsの資格情報を追加**します。
コントロールパネル → ユーザアカウント → 資格情報マネージャーに進みます。
そして下の画面の「Windows 資格情報の追加」を追加します。
![2020-08-31_15h15_00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247515/1e0753ff-6521-722b-db7a-3312d2049512.jpeg)

そして、

 - ネットワークアドレス
 - ユーザ名
 - パスワード

を入力します。

![2020-08-31_17h26_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247515/f9c0c793-b4f8-c8b0-b41d-75aa99cfd2d9.jpeg)

これでOKです。
いのちの輝きくんの目を回してみる。

## はじめに
Pythonでいのちを輝かせるという記事（下記にリンクがあります。）があり、
どうしても目を回してみたくなりました。
参考記事の「いのちを輝かせる」画像をベースに、円座標を計算して、目を回した画像を作成し、
OpenCVを用いて動画作成と出力を行いました。

## 円座標の計算
```
def get_coordinates(center_x: int, center_y: int, rotate_val: int, speed: int):
    radius = 10
    theta = (rotate_val / speed) * 2 * np.pi
    x = center_x + int(radius * np.sin(theta))
    y = center_y + int(radius * np.cos(theta))
    return x, y
```

## 目を回した結果
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">いのちの輝きくん改 <a href="https://t.co/UPlC7cdhnh">pic.twitter.com/UPlC7cdhnh</a></p>&mdash; Takeshi Nishida (@tnishida) <a href="https://twitter.com/tnishida/status/1300347192402534400?ref_src=twsrc%5Etfw">August 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## ソースコード
https://github.com/take9999/untitled/blob/master/The_brilliance_of_life.py

## 参考記事

PythonとOpenCVでいのちを輝かせる
https://qiita.com/Takayoshi_Makabe/items/07e4553362fc14d7ddb1

Pythonでグラフのアニメを作る（OpenCVでmp4ファイルを出力編）
https://water2litter.net/rum/post/python_matplotlib_anime_opencv/
テーブルのセル内のチェックボックスをチェックしやすくする

テーブル内にチェックボックスを作ると、ラベルもうまく使えないしどうしたものかと思っていたのですが、しっかり解決方法はありました。

```example.html
<table>
  <tr>
    <td onclick="getElementById('checkbox').click();">
      <input type="checkbox" id="checkbox" onclick="this.click()">
    </td>
  </tr>
</table>
```
`onclick`属性はその要素がクリックされたときの処理、
`getElementById()`はそのidのエレメントを返すメソッドです。
これだけだと中のチェックボックスをクリックすると、それが2重にはたらいてもとに戻ってしまうのでチェックボックスにもonclickを設定しています。

参考→https://am-yu.net/2012/01/06/checkbox/
PythonでWikipediaを簡単に利用する方法

#実行環境
python = 3.8.1
windows

#インストール方法

```
pip install wikipedia
```

#使い方

```
import wikipedia

#日本語の記事からとってくる
wikipedia.set_lang("ja") 

#Wikiの要約欄を取ってくる。auto_suggestがTrueだと意図しない結果が返す場合がある。
text = wikipedia.summary("検索したいワード", auto_suggest=False)

#Wikiの全文を取ってくる。
page = wikipedia.page("検索したいワード", auto_suggest=False)

#pageのタイトル
page.title

#pageのURL
page.url

#pageの本文
page.content
```

#文章校正
Pythonで利用するうえでテキスト内容を編集する方法

```
#正規モジュールのインストール
import re

#ふりがなを取り除く
page = re.sub('（.+?）', '', page)

#年号を取り除く。
page = re.sub(' (cf. .+?)。', '', page)
```


#参考
詳しいことはここに書いてあります。
https://pypi.org/project/wikipedia/
pythonのsqlite3でsqlを使いデータベースからデータをカラムごとに取り出す関数作ってみた[sqlite3 , sql ,pandas]

#モチベーション
普段機械学習系ばかり独学してますが、twitter等ではsqlの知識も必要といわれる方をよく見ます。なので少しずつ並行して学ぼうということで、最初にはデータを取り出すところから関数化していきたいと思います。

この記事では以下をやります.

 + pandasのdataframeをdbに格納
 + 作ったdbからcolumn指定でデータを取り出す

すでにある場合はごめんなさい。
SQLは完全初心者なので多めに見てください(-_-;)

####今回使うもののimport
```python
import sqlite3
import pandas as pd
import pandas.io.sql as sql
```

#DBを作る
pandasを使いお試し用のDBを作成します。
作るdataframeは以下のようにしたいと思います。値は適当です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512849/a927119a-c33c-efe4-3b4f-9bf78754be7f.png)

```python
city = ["tokyo","kyoto","oosaka"]
num = [30,20,28]
df_1 = pd.DataFrame({"city":city,"number_of_city":num})
```
######dataframe -> databaseへ
```python
path = "tamesi.db"
conn = sqlite3.connect(path)
cur = conn.cursor()
sql.to_sql(df_1,"study",conn,if_exists="replace",index=None)
cur.close()
con.close()
```
今回はtamesiというデータベースにstudyというtableで作成しました。

#指定カラムを取り出す関数を作る
作りました。

```python
def ret_column(db,table,column=""):
    assert bool(column), "no column is spcified"
    conn= sqlite3.connect(db)
    cur = conn.cursor()
    cur.execute("select {} from {}".format(column,table))
    val = cur.fetchall()
    cur.close()
    conn.close()
    return val
```
columnに取り出したいものを入れて取り出します。一応columnに何もないとエラーを返すようにしてみました。
やってることは単純にdbとtable指定してsql文呼び出しているだけです。
#全データを取り出す関数を作る
せっかくなんで全データを取り出す関数を作成してみます。
つくりました。

```python
def ret_all(db,table):
    conn = sqlite3.connect(db)
    cur = conn.cursor()
    cur.execute("select * from {}".format(table))
    val = cur.fetchall()
    cur.close()
    conn.close()
    return val
```
カラム指定がないのでこちらの方が簡単でしたね。
#使ってみる
```python
path = "tamesi.db"
table="study"
val_1 = ret_column(path,table,column="city")
val_2 = ret_all(path,table)
print(val_1)
print(val_2)

#以下出力
[('tokyo',), ('kyoto',), ('oosaka',)]
[('tokyo', 30), ('kyoto', 20), ('oosaka', 28)]
```
ちゃんと取り出せていることが確認できました。
#ついでにインスタンス化してみる
簡単にclassで実装してみました。

```python
class ret_from_db():
    def __init__(self,db):
        self.db = db

    def ret_column(self,table,column=""):
        assert bool(column), "no column is spcified"
        conn= sqlite3.connect(self.db)
        cur = conn.cursor()
        cur.execute("select {} from {}".format(column,table))
        val = cur.fetchall()
        cur.close()
        conn.close()
        return val

    def ret_all(self,table):
        conn = sqlite3.connect(self.db)
        cur = conn.cursor()
        cur.execute("select * from {}".format(table))
        val = cur.fetchall()
        cur.close()
        conn.close()
        return val
```
上二つをくっ付けただけです、特筆はなし。
######使ってみた
```python
get_db = ret_from_db(db="tamesi.db")
val_1 = get_db.ret_column(table="study",column="city")
val_2 = get_db.ret_all(table="study")
print(val_1)
print(val_2)

#以下出力
[('tokyo',), ('kyoto',), ('oosaka',)]
[('tokyo', 30), ('kyoto', 20), ('oosaka', 28)]
```
ちゃんとできました。
#終わり
これが実用性があるかどうかは知りません使ってことないので(-_-;)
次はpandasで読み取ることができればsklean等に使いやすくなるのでそれを作りたいですね。
VueCLIとfirebaseで匿名掲示板を制作した際に、参考にした記事とエラー解決記事

#はじめに
この記事を書く目的は、VueCLIとFirebaseで匿名掲示板を制作した際に、参考にした記事とエラー解決記事をまとめておきたいと考えたからです。
そして、僕がエラーでかなり苦しんだので、解決策の一つとして力になれば幸いです。

##「$ firebase list」のエラー解決
参考記事：[「$ firebase list」のエラーに関して](https://qiita.com/chiba_hiro0514/items/6443bcca7d9290e2b4d2)

`$ firebase list`　→　`$ firebase projects:list`

コマンドが変更されたみたいです。
僕はfirebaseのHosting機能を使用する際に、この問題が起きました。

##TimeStampで時刻を表示させたい

参考記事：[Firebaseで取得したUnixTimestampを文字列に変換する](https://qiita.com/yasu_yyy/items/f92c6e517e2bd1192ec8)
[【Firebase】知らなくて損した時間の取得方法【１行だったのに…】](https://qiita.com/mattun_evo/items/b73123b8d988dbf416ff#comments)
[firebase公式ドキュメント](https://firebase.google.com/docs/reference/js/firebase.firestore.Timestamp)

ここで一番苦労したのは、書き方がわかっても自分の場合どの箇所に書いたらよいかわからず苦労しました。また、短くする記述もわからず、結局、長々となってしまいました。

```vuejs
   <ul>
      <li v-for="(todo,key) in todos" :key="key" class="loop_lisy">
        {{todo.name}}
        <button @click="removeTodo(key)" class="delete_btn">削除</button>
        <div class="date_display">
          {{todo.timastamp.toDate().getFullYear()}}-{{todo.timastamp.toDate().getMonth()+1}}-{{todo.timastamp.toDate().getDate()}}
          {{todo.timastamp.toDate().getHours()}}:{{todo.timastamp.toDate().getMinutes()}}
        </div>
      </li>
    </ul>
```

##掲示板を制作する際に参考にしたもの
[ToDoリストを作りながら学習しよう！](https://cr-vue.mio3io.com/tutorials/todo.html)
[VueJS入門その30「VueJSとFirestoreでTODOリストを作る(1)」](https://www.youtube.com/watch?v=_n67scuq4QQ)
他にもドットインストールや[Udemy](https://www.udemy.com/course/js-ts-vue/)を参考にしました。

僕が制作した掲示板は、todoアプリを制作する記事を参考にして、派生させました。
なぜ、todoアプリから派生させたかというと、Qiitaなどで掲示板を制作する記事はたくさんあったのですが、firebaseのバージョンが変わったせいかルールの記述方法が違ったり、router,vuexを同時に使用していて複雑過ぎる記述があったりと、難しすぎて参考にならなかったからです。

#さいごに
これらの記事以外にもエラーや参考にした記事がたくさんありましたが、記事にまとめようと考えたことが遅かったためこの分量しか残っていませんでした。この記事が参考になれば幸いです。
IE11で Lightning Component 不具合の対処法

１、 <lightning:datatable>を枠で囲もうとしたい場合、左罫線が切れてしまうことがあります。
  CSSで対応します。

```html:aaa.cmp
<div class="datatable-frame">
  <lightning:datatable ... />
</div>
```

```css:aaa.css
.THIS .datatable-frame{
  height: 20rem;
  padding-left: 0.1px; /* fix IE bug */
  border: 1px solid rgb(198, 198, 198);
}
```

２、 標準で、<lightning:show-toast>が改行をサポートしません。※IE11限りない。
  CSSで対応します。

```css:force_show_toast.css
.toastMessage.forceActionsText{
  white-space: pre-line !important;
}
```

```html:aaa.cmp
<ltng:require styles="{!$Resource.staticSourceName+'/force_show_toast.css'}"/>
```

３、 <lightning:overlay>.showCustomModal()で表示したコンポーネントに、<lightning:input type="date">カレンダーがあれば、カレンダーの表示が切れることがあります。
  CSSで対応します。

```css:fixed_ie_bug.css
.modal-body.slds-modal__content{
  overflow: visible;
}
```

(随時追加)
音が鳴るボタンを作る

### ・ ボタンクリックで音が鳴るようにしたい
もっと簡単な記述の方法はあると思いますが、思いの外難しかったのでメモ書き
>音声ファイルはmp3しか扱っていません

##### ０.作業に入る前に準備として、使いたい音声を assets/audios のなかに保存

##### １.準備ができたら HTML のボタンを作ってあるところに audio要素を配置
例）
`<div class="audio", id="audio">
　　<audio id="sounds" src="assets/sound1.mp3" preload="auto"> 
　　</audio>
</div>`

>audioタグは音声ファイルを再生することができるマルチメディア系のタグです。気になった方は調べてみてください。
音声を自動で読み込むかどうかの指定をpreload属性で行うことができます。今回はauto(自動)に設定し、ボタンのクリックと同時に音が鳴るように preload="auto" を使用しています。

##### ２.次に JavaScript でHTMLの要素を取得し、clickイベントの発火
例）
`window.addEventListener("DOMContentLoaded", () => {
　　const audio = document.getElementById("audio");
　audio.addEventListener('click', function(){
 　　document.getElementById("sounds").currentTime = 0;
 　　document.getElementById("sounds").play();
　});
});`

>idからdiv要素を取得し、クリックされたときに事前にpreload属性で読み込んでおいた音声が鳴るようにしています。（div要素である必要はありません）
clickイベントの発火後audio要素をidから取得し、playで再生されます。 currentTimeは再生位置の確認や音声の長さを設定できます。currentTime = 0は、ボタンを連続で押したときそれに合わせて連続で音が鳴るように記述しています。

#
以上で音が鳴るボタンは完成です。
audioタグを増やせば複数の音声を使用できますし、JavaScriptの記述によっては複数の音声から1つの音声を鳴らすこともできます。
#
#
音が鳴るボタンをつくれない方はJavaScriptが読み込まれていない。若しくはaudioファイルが読み込まれていない可能性が高いです。
>後者の場合 assets/config/manifest.jsの中に`//= link_tree ../audios .mp3`と記述し、config/webpacker.ymlのstatic_assets_extensions:に`.mp3`と記述してみてください
Kubernetes 1.16とHelmと古いマニフェストの注意点

# 経緯

IBM Cloudとは直接関係はないのですが、KubernetesやHelmをばりばりエンタープライズで使っているのはIBM Cloudユーザーが多いと思いますのでibmcloudタグで投稿します。

Kubernetesは1.16でいくつかの旧APIが廃止になっていますが、それをHelmを組み合わせたときに少し困ったことが起きたので、共有しておきます。

* Kubernetesを古いバージョンから利用し続けていた
* DeploymentをapiVersion: apps/v1beta2で宣言していた
* それを自作のChartでHelmを使ってデプロイしていた
* Helmは2.16以前のものを使っていた
* この度Kubernetesを1.16にバージョンアップしようとした
* 1.16の前提でHelm v2を使っている場合はマスタ更新前にHelmを2.16以降にする必要がある
* そのためHelmのTillerとCLIを2.16にバージョンアップ(helm init --upgrade)した
* マスターおよびワーカーのバージョンアップを行った
* 古いマニフェストでデプロイしたPodは無事動いていた
* そういえば古いAPIだと今後動かないことに気づき、ChartのDeploymentのマニフェストをapps/v1に修正しアップグレードをしようとするとエラー

# エラー内容

```
$ helm upgrade ${リリース名} ${チャート}
UPGRADE FAILED
Error: failed decoding reader into objects: unable to recognize "": no matches for kind "Deployment" in version "apps/v1beta2"
Error: UPGRADE FAILED: failed decoding reader into objects: unable to recognize "": no matches for kind "Deployment" in version "extentions/apps/v1beta2"
```

# 原因

Deploymentのapps/v1beta*はKubernetesの1.16から廃止されています。なのでバージョンアップするとそのままでは動かないのですが、事前に行ったhelm init --upgradeによって、デプロイ済のv1beta2のマニフェストはapps/v1に自動的に書き換えられるようです。そのためバージョンアップ後も動いていました。

次にあらためて新しいChartでデプロイをしようとするとエラーになりました。原因ですが、HelmはSecretにこれまでのマニフェストの情報を履歴で持っていて、デプロイの際に前の情報と比較するようなのですが、Secret内の古いマニフェストがapps/v1beta2のままのため、helmがそんなバージョンには対応していない、とエラーになったようです。

# 対応

本来ならばHelm 2.16に上げる前に旧リリースの完全な削除と新APIバージョンでの再デプロイをすることが正解のようです。

しかし私のようにうっかり先にバージョンアップしてしまった場合は、手動で削除が必要でした。

* Helm 2.16でhelm delete ${リリース名} --purge
* エラーになるがhelm lsの結果からは消える、Helmのsecretも消える
* ServiceやDeploymentなどChartのテンプレートでデプロイしたものはそのまま残っているので、手動で削除
* あらためてChartを新規デプロイ

以上

# 参考

* https://github.com/helm/helm/issues/6969
CakePHP4にSassを導入する

# やりたこと
CakePHP4プロジェクトにSass（node-sass）を導入する。

# 環境(今回の作業に関連ないものも記載)
* PHP7.4
* cakephp4.1.2
* node14.6.0
* npm6.14.8
* yarn1.22.4
* node-sass4.14.1

# 方法
以下の二つの方法を検討したが、SassとCakeは分離しておいた方が、どちらかを変更する際に便利かなと思ったので、今回は後者で実施した。

* cakephp3-elixirを利用する
2020/8/31現在cakephp4-elixirというものがないのも、利用を敬遠した理由でもある。
（[参考](https://www.ritolab.com/entry/82)）


* yarnを利用する
今回はこちらで行う。

# 手順

## nodeインストール
省略。
nodeenvとかnodebrewを使うと便利。

## npmインストール
省略

## yarnインストール
省略

## app配下をyarnプロジェクトにする
app直下で以下を`yarn init`を実行。
nameとprivate以外はデフォルト値。

```
yarn init
yarn init v1.22.4
question name (app): アプリケーション名
question version (1.0.0): 
question description: 
question entry point (index.js): 
question repository url: 
question author: 
question license (MIT): 
question private: yes
success Saved package.json
✨  Done in 26.98s.

```
これで、app直下に`package.json`,`package-lock.json`,`node_modules`ができる。


## node-sassインストール
app直下で`yarn add --dev node-sass`
packageに以下が追加される。

```package.json
  "devDependencies": {
    "node-sass": "^4.14.1"
  },
```

ちなみにsassにも`sass`や`node-sass`があるようで、どちらでも動作はしたが早いらしいので`node-sass`とした。
https://qiita.com/190131start/items/ad5a3fcf70afe8ab6d5c
## sassディレクトリ整備
app直下で以下のコマンドを実行する。

```
mkdir -p resources/scss/base
mkdir -p resources/scss/modules
mkdir -p resources/scss/partials
touch resources/scss/style.scss
```

ディレクトリ構成は以下を参考にさせていただいた。
https://tsudoi.org/guide/detail/8.html

## 動作確認用にSassファイル作成
動作確認用のため、中身は適当。

```resources/scss/base/_normalize.sass
a {
  cursor: pointer;
  text-decoration: none;

  &:hover {
    color: inherit;
  }
}
```

```resources/scss/style.scss
@import 'base/normalize';
```

## package.jsonにビルドコマンド追加

```package.json
  "scripts": {
    "build": "node-sass resources/scss/ -o webroot/css"
  },
```

## ビルド実行
app直下で`yarn build`
webroot/css配下にstyle.cssができていれば成功。

# この次にやりたいこと
nodemonで自動でビルドさせたい。

# 参照
ありがとうございます。
https://uxmilk.jp/38084
https://tsudoi.org/guide/detail/8.html
https://qiita.com/FumiyaShibusawa/items/9fab0dacaa99920a8611
https://qiita.com/acc1io/items/2d0d0c3adc98e254571f
放置してたGCPを復活させる（終わり）- 独自ドメインの設定 -

GCP復活の作業履歴
[放置してたGCPを復活させる（１）- プロジェクト作成 -](https://qiita.com/3S_Laboo/items/62322280d1844d461bab)
[放置してたGCPを復活させる（２）- VMインスタンス作成 -](https://qiita.com/3S_Laboo/items/03b54621479e193101f7)
[放置してたGCPを復活させる（３）- gcloud CLIインストール -](https://qiita.com/3S_Laboo/items/75682b3d008d0fdce355)
[放置してたGCPを復活させる（４）- PC(Windows10)からVMにssh接続 -](https://qiita.com/3S_Laboo/items/63a17738071a171decb1)
[放置してたGCPを復活させる（５）- VMのIPを固定する -](https://qiita.com/3S_Laboo/items/c897628aec6d04f4fe5f)
[放置してたGCPを復活させる（６）- nginxインストールとhttp設定 -](https://qiita.com/3S_Laboo/items/9a8446f84baa80252cb9)
[今回：放置してたGCPを復活させる（終わり）- 独自ドメインの設定 -](https://qiita.com/3S_Laboo/items/cce944d49cbd1d4aa745)

今日は独自ドメインを設定しまーす。
# 情報収集
[Google Cloud Platform (GCP) で独自ドメインを設定する](https://qiita.com/tomy0610/items/adc839be9d100c0daf96)
[Google Cloud DNSでIPアドレスとドメイン名を紐付ける](https://qiita.com/NagaokaKenichi/items/95052742d40392f3215e)

# 独自ドメインの作成
ん？そういえば、今年1月にGCP作ったときGoogle Domainsでドメイン作ったな。。。
![2020-08-31_15h30_47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567235/4650fe2a-259a-9ba9-1bda-a1e5f450571c.jpeg)
あ、作ってた。適当に作ったことを記憶しています。
# Cloud DNS
ハンバーガー⇒ネットワークサービス⇒Cloud DNS
![2020-08-31_15h37_15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567235/fe15bf64-4a6b-5743-022a-f310f782b209.jpeg)
ゾーンを作成
![2020-08-31_15h40_48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567235/e777aba1-72c1-9a4a-5e6b-2b5dfe0f49a8.jpeg)
![2020-08-31_15h43_50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567235/06aa8234-3e4b-6bd7-9859-cf58856f6ab2.jpeg)
![2020-08-31_15h48_20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567235/de561889-c8b6-3373-e02f-96dfda5259c3.jpeg)
レコードセットを追加
![2020-08-31_15h53_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567235/a00da725-2ed3-7b06-fb3c-486932c72a42.jpeg)
レコードセットを追加(www)
![2020-08-31_16h04_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567235/9467cd50-765e-7867-68ef-2fb326267108.jpeg)
![2020-08-31_16h08_22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567235/a1a09e22-55aa-a7dc-3646-a0b197390356.jpeg)
つながるかな？
⇒つながらない。。。
# Google Domains
ネームサーバを設定
![2020-08-31_16h18_38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567235/c606d31a-e6a7-0dce-11d2-743ed898b34f.jpeg)
つながんね。。。
。。。あ、VM起動してねぇや。起動！
![2020-08-31_16h24_59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567235/b27e9e7a-471b-4d0e-f269-87a360be2439.jpeg)
イエイ！
wwwがあってもなくてもつながったで！
よし。これでGCPも大体復活したかな。
今後はwordpressとか立ち上げるのを記事にしていきまーす。
ありがとうございました。
JavaScriptのクロージャ(closure)

### クロージャとは

>クロージャは関数とその関数が作られた環境という 2 つのものの組み合わせです。

>この環境は、クロージャが作られた時点でスコープ内部にあったあらゆる変数によって構成されています。

> [クロージャ - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures#:~:text=%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3%E3%81%AF%E9%96%A2%E6%95%B0%E3%81%A8%E3%81%9D%E3%81%AE,%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%B8%E3%81%AE%E5%8F%82%E7%85%A7%E3%81%A7%E3%81%99%E3%80%82)

### ざっくり言うと
クロージャとは入れ子関数と、親関数で宣言され入れ子関数から参照されるローカル変数をあわせたもの。

```js:クロージャ

function makeCounter() { // 親関数
  let localCounter = 0; // ローカル変数
  
  return function() { // 入れ子関数
    localCounter++;
    console.log(localCounter);
  }
}

const counter = makeCounter();

counter(); // 1
counter(); // 2
counter(); // 3
```

localCounterの値は保持され、1ずつ増えていく。

これはグローバル変数で

```js:
let globalCounter = 0;

function counter() {
  globalCounter++;
  console.log(globalCounter);
}

counter(); // 1
counter(); // 2
counter(); // 3
```
としたものと結果は同じだが、グローバル変数を用いなくて済むのでクロージャのほうが安全。


```js:クロージャ
function makeCounter() {
  let localCounter = 0;

  return function()
    localCounter++;
    console.log(localCounter);
  }
}

const counter = makeCounter();

counter(); // 1
counter(); // 2
counter(); // 3
console.log(localCounter); // エラー
```

関数の外からは直接ローカル変数localCounterを参照できない。

### クロージャが作られるタイミングと独立性

親関数が呼び出されローカル変数と入れ子関数が宣言されたときにクロージャが作られる。

2回親関数を呼び出すと、独立な2つクロージャが作られ、それぞれが参照するローカル変数は同名であるが異なる変数である。

```js:クロージャ
function makeCounter() {
  let localCounter = 0;
  
  return function() {
    localCounter++;
    console.log(localCounter);
  }
}

const counter1 = makeCounter(); // クロージャ1ができる
const counter2 = makeCounter(); // クロージャ2ができる

counter1(); // クロージャ1のlocalCount = 1
counter1(); // クロージャ1のlocalCount = 2
counter2(); // クロージャ2のlocalCount = 1
```



### 参考
[クロージャ - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures#:~:text=%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3%E3%81%AF%E9%96%A2%E6%95%B0%E3%81%A8%E3%81%9D%E3%81%AE,%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%B8%E3%81%AE%E5%8F%82%E7%85%A7%E3%81%A7%E3%81%99%E3%80%82)
Unity メモ（動的スプライト変更）

Unityのスプライトが、更新されなくて結構ハマる。

原因としては、overrideSprite　を更新していない事が問題みたい
・・・と思ったら結構検索にヒットした。
同じことで困ってる方が結構いる・・・正常な使い方はどっちなのかな？？？


sprite側で表示したければ、overrideSpriteをNULLにする必要がありそう、
今、設定しようとしたものを必ず是とするなら必ずoverrideSpriteに設定すればそちら側が表示された。

■表示されたパターン１

```
public void ChangeSprite( Sprite data )
{
	overrideSprite = data;
}
```


■表示されたパターン２


```
public void ChangeSprite( Sprite data )
{
	overrideSprite = null;
	sprite = data;
}
```


■参考URL
https://qiita.com/Takaaki_Ichijo/items/024ef3bc01558185f073

https://qiita.com/TD12734/items/497f024479466e2a7a3f

https://ritsuka.dev/change-image-sprite


■開発環境
Unity2019.3.8.f1
NintendoSwitch開発機
【VScode】超基本ショートカットキーまとめ

##はじめに
日常的に使うVScodeのショートカットキーをまとめてみました。
カテゴリごとに分けたつもりですが、曖昧なものが何個かあったため正しくはカテゴリ分け出来ていないかもしれません。ご了承ください:pray::pray::pray:
今後新たに知ったショートカットキーがあったら随時追加予定です。

##検索系ショートカット
・`ctrl` + `F`　エディタ、現在開いているファイル内での検索
・`ctrl` + `P`　フォルダ内のファイル検索
・`ctrl` + `shift` + `F`　全体の検索結果の表示。指定して文字を検索したいときに便利
・`ctrl` + `shift` + `H`　全体の置換結果の表示
・`ctrl` + `shift` + `E`　サイドバーにエクスプローラを表示
・`ctrl` + `shift` + `X`　サイドバーに拡張機能の検索画面を表示

###検索中の動作
・`Alt` + `C`　大文字と小文字を区別する
・`Alt` + `W`　単語単位で検索する
・`Alt` + `R`　正規表現を使用する

##選択系ショートカット
・`ctrl` + `A`　全体を選択
・`ctrl` + `L`　行を選択。押し続けることで複数行選択可能
・`ctrl` + `D`　選択した文字列と同じ文字列を選択。押し続けることで複数選択可能。かなり便利
・`ctrl` + `shift` + `↑↓`/`← →`　行を選択。用途的には`ctrl`+`L`と同じだが、矢印キーにより、上部も選択可能

##移動系ショートカット
・`ctrl` + `Alt` + `↑↓`　矢印キーで移動することでカーソルを追加
・`ctrl` + `← →`　単語単位で移動
・`ctrl` + `Home`　ファイルの最初に移動
・`ctrl` + `End`　ファイルの末尾に移動
・`Home`　指定した行の行頭に移動
・`End`　指定した行の行末に移動
・`ctrl` + `U`　直前に作業していた行に移動
・`ctrl` + `G`　画面上部にポップアップが出現。指定した行に移動
・`Alt` + `↑↓`　指定した行を上/下に移動

##編集系ショートカット
・`ctrl` + `]`　指定した行にインデントを追加
・`ctrl` + `[`　指定した行のインデントを削除
・`ctrl` + `/`　指定した行のコメントを設定
・`Alt` + `shift` + `↑↓`　指定した行を上/下にコピー
・`ctrl` + `enter`　指定した行の下に空行を追加

##画面、ファイル操作系ショートカット
・`ctrl` + `shift` + `N`　新規のVScodeを開く
・`ctrl` + `shift` + `W`　VScodeを閉じる
・`ctrl` + `N`　新規のエディターを開く
・`ctrl` + `W`　エディターを閉じる
・`ctrl` + `O`　ファイルを開く
・`ctrl` + `B`　サイドバーを表示
・`ctrl` + `shift` + `P`　コマンドパレットの表示
・`ctrl` + `S`　保存
・`ctrl` + `KS`　ファイルをすべて保存

##ショートカットキーの設定方法
`ctrl` + `K`　と　`ctrl` + `S`　を押すことによりキーボードショートカットが開きます（サイドバー下部の設定からでも開けます）
![vscode.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669215/1b5565a9-d9ae-7626-8fd1-5ffe0a8eb8e2.png)
日常的にいつも使っているショートカットから基本使うことはないであろうショートカットまで、凄まじい数のショートカットが出てきます。
![vscode2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669215/8b94a258-e490-e542-5a03-71c60439cc87.png)
ショートカットキーを変更したい場合は、変更したいものをクリックします。すると左にペンマーク（編集する）が出てくるのでクリック。
![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669215/cbde18e8-3548-1df5-0450-e8afc3ad9125.png)
変更のためのポップアップがでるので任意の変更したいキーの組み合わせを入力して変更完了。

##まとめ
「超基本」と言っておきながら半分以上は所見のショートカットでした…。
日常的に使うVScodeを効率化するためにショートカットキーを調べてみましたが、以前からやっていれば明らかに楽だったなぁ…と思うショートカットが何個もありました。
これから何度もお世話になるVScodeをショートカットを駆使して上手にスマートに活用していきたいですね！


##参考にしたサイト
・[VScodeの便利なショートカットキー](https://qiita.com/12345/items/64f4372fbca041e949d0#%E7%B7%A8%E9%9B%86%E7%B3%BB)
・[キーボードから手を離さずにVScodeで開発したいという気持ちを大切にしています](https://insider.10bace.com/2019/02/22/vs-code%E3%81%A8%E3%81%8B%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%97/)