OmniAICreator/Qiita-1.07M huggingface dataset:
WindowsTerminalショートカットキー一覧

# はじめに
Windows Terminalのショートカットをまとめます。
参照：[Windows ターミナルのインストール | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/terminal/get-started)

# タブ操作
| 動作名 | ショートカットキー| 補足 |
|:-----------|:------------|:------------|
|新しいタブを開く|ctrl + shift + t||
|指定したタブを開く|ctrl + shift + 数値|ドロップダウンメニューの記載を参照|
|複製したタブを開く|ctrl + shift + d||
|タブの切替|ctrl + tab||
|選択中のタブ、ペインを閉じる|ctrl + shift + w|

# ペイン操作
| 動作名 | ショートカットキー| 補足 |
|:-----------|:------------|:------------|
|複製したペイン(分割画面)を開く|alt + shift + d||
|新しい垂直ペイン(垂直分割画面)を開く|alt + shift + plus(+)||
|新しい水平ペイン(水平分割画面)を開く|alt + shift + -||
|ペイン(分割画面)の切り替え|alt + ↑↓→←||
|ペイン(分割画面)のサイズ調整|alt + shift + ↑↓→←||
|選択中のタブ、ペインを閉じる|ctrl + shift + w|

# その他
| 動作名 | ショートカットキー| 補足 |
|:-----------|:------------|:------------|
|ドロップダウンメニューの表示|ctrl + shift + space||
|検索|ctrl + shift + f|選択中のタブ、ペインのみ|
|拡大・縮小|ctrl + スクロール|選択中のタブ、ペインのみ|
|タブの透明度の調整|ctrl + shift + スクロール|選択中のタブ、ペインのみ|
ターミナルのカスタマイズをしたい方はこちら。

- [カスタム配色ガイド | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/terminal/custom-terminal-gallery/custom-schemes)
- [Windows ターミナルのグローバル設定 | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/global-settings)
- [Windows ターミナル プロファイルの設定 | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/profile-settings#background-image-settings)

# コマンドパレット
| 動作名 | ショートカットキー| 補足 |
|:-----------|:------------|:------------|
|コマンドパレットを開く|ctrl + shift + p||

詳細は[Windows Terminal Actions | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/actions)のページを参照。

# まとめ
MacのiTermまでとは行きませんが、WindowsTerminalもなかなかいい感じになってきました！今後も期待ですね。
Python3 Socket通信でエラーがでるときのメモ

2020.03.08

Python3 
Socket通信

本の通りにclient.pyとserver.pyを書いてソケット通信を試みようとした
ところエラーが出て通信できなかった時のメモ。

●サーバ環境
　さくらVPS 3GB 100GB SSH
　Ubuntu 20.04LTS 
　Python3.8.5
　server.py を設置して稼働する

●クライアント環境 （自宅）
　Windows10 Home
　Visual Studio Code
　Python3.9.1（Windows版）
　Rlogin
　client.py を設置して実行する（上記server.py稼働中に実行する）

Ubuntuでのポート開放方法がわからない方は
参考：[ufwコマンドの使い方]("https://qiita.com/hana_shin/items/a630871dce209cff04f3")
などをご参照ください。

●ポート番号が悪さをしている可能性
古い本の中にはソケット通信のポート番号として、ウェルノウンポート番号や登録済み
ポート番号を指定しているものが多い（8000番とか、8001番とか）が、これを**動的・
プライベートポート番号に変更**するだけでプログラムが正常に稼働し、通信できた。

通信エラーがでる人はプログラムで利用するポート番号を確認してほしい。

```Python3:client.py
# 2021.03.08
# ソケット通信テストプログラム
# ポートは動的・プライベートポート番号（49152-65535）を利用しないと
# つながらない！本などで8000番，8001番などを利用しているものが
# 多いので注意する。

import socket

def socketConnectClient():
    PORT=49200 #動的・プライベートポート番号（49152-65535）を利用すること
    SERVER='honyarara.com' #接続先のドメインかIPアドレス
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((SERVER, PORT))  # サーバを指定して接続
        # s.connect((SERVER,8002)) # 仮にポート開けててもソケット通信不可！
        s.sendall(b'Hello!')       # サーバにメッセージを送る
        data = s.recv(1024)        # サーバからの文字列を取得する
        print(repr(data))

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

```Python3:server.py
# 2021.03.08
# socket サーバを作成
# Ctrl+Cで中断終了してください

import socket

SERVER=''  #サーバー側は空欄でよい
PORT=49200 #動的・プライベートポート番号（49152-65535）を利用すること
def socketConnectServer():
    print("ポート番号：{}でソケット通信を開始します。".format(PORT))
    # AF = IPv4 という意味
    # TCP/IP の場合は、SOCK_STREAM を使う
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        # IPアドレスとポートを指定
        s.bind((SERVER,PORT))
        s.listen(10)
        while True:
            conn, addr = s.accept()
            with conn:
                while True:
                    # データを受け取る
                    data = conn.recv(1024)
                    if not data:
                        break
                    print('data : {}, addr: {}'.format(data, addr))
                    conn.sendall(b'Received: ' + data)

if __name__ == '__main__':
    socketConnectServer()
    print("プログラムを終了しました。")

```

実行結果
![server.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346564/a7a2ef76-b671-156f-e1c8-b4cd383c52d8.png)
![client.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346564/a1bb5c99-b051-fff3-31ee-4193c72a1aed.png)



参考：[WikiPedia:TCPやUDPにおけるポート番号の一覧]("https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7")
ウェルノウンポート番号 (0–1023)
登録済みポート番号 (1024–49151)
動的・プライベート ポート番号 (49152–65535)

ぷれじ
【kintone】グラフの小技

kintoneですぐに使えるグラフの小技3つです。
記事にするほどのことはないかも知れないですが、感動したのでここにメモをしておきます_φ(･_･

# [小技1] 凡例をクリックするとグラフのオンオフができる！
![graph.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/62eb89b9-53ec-9cfe-9e0f-487fa5c21c66.gif)

# [小技2] 凡例にマウスカーソルをかざすとちょっと太くなる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/d4be42e6-7214-7da2-524e-6013593bfefd.png)

# [小技3] グラフ自体にマウスカーソルをかざしてもちょっと太くなる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/eb5bb120-94f2-6daa-e0c0-49db06c2f479.png)
PHP printfとsprintfの使い方

#printf と sprintfの違い
・printfは第一引数に指定した数値を第二引数以降で指定した値でフォーマットし出力）。
出力する為echoは不要。

・sprintfはprintfと考え方は同じで出力ではなく値を返すので出力にはechoなどが必要

どちらも変数に格納することも可能。

例１）

```php

$price =5;
$tax = 0.075;

printf('このお皿は %d円で%sさんが買いました',700,'田中');//このお皿は 700円で田中さんが買いました
echo sprintf("このお皿は %d円で%sさんが買いました",700,'田中');//このお皿は 700円で田中さんが買いました
```

例２）

```php

printf('このお皿の値段は　$%.3fです',$price*(1+$tax));//のお皿の値段は　$5.375です
 printf('
%06d左の数字では6桁の数字の1桁目に0が、/ %02d次の数字には2桁のうち1桁目に0が 
/ %01dさらに次は0はつかず1桁目には引数の1が表示されます。/ %03d最後も０はつかず引数の321が表示される。
つまり0は引数の桁数+1桁の数値で指定する必要があります'
,12345,3,1,321);

//出力
//012345左の数字では6桁の数字の1桁目に0が、/ 03次の数字には2桁のうち1桁目に0が 
// / 1さらに次は0はつかず1桁目には引数の1が表示されます。/ 321最後も０はつかず引数の321が表示される。つまり0は引数の桁数+1桁の数値で指定する必要があります
```

上記第二引数以降では%d、%sなど第一引数で指定した値に対し、左から順番にフォーマットする値を設定している。
%○で設定している値には以下の通りの意味がある

[PHP指定子](https://www.php.net/manual/ja/function.sprintf.php")

![スクリーンショット 2021-03-08 9.28.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/62f7ff71-a42a-f611-f976-7c0b55c21feb.png)

今日は以上。
Basic認証の導入

本日は、Basic認証の導入手順を復習のため記事に
残したいと思います。

## バージョン
・Ruby 2.6.5
・Rails 6.0.0
・macOS Big Sur
## Basic認証とは
Basic認証とは、HTTP通信の規格に備え付けられている、ユーザー認証の仕組みのことです。
簡単に説明すると、作成したアプリケーションにユーザー名とパスワードを記述して入力した人だけが
アプリケーションを使えるよと言うものです。

## Basic認証導入手順
まずは、ユーザーとパスワードを設定しましょう。
設定には、authenticate_or_request_with_http_basicメソッドを使用します。
Basic認証によるログインの要求は、すべてのコントローラーで行いたいです。

app/controllers/application_controller.rb

```ruby
class ApplicationController < ActionController::Base
  before_action :basic_auth


  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ユーザー && password == パスワード
    end
  end
end
```
Basic認証の処理をapplication_controller.rbのprivate以下にメソッドとして定義し、before_actionで呼び出しましょう。
これで、設定できました。

### Basic認証コードを改良
設定できましたが、このままではGit Hubに更新した際にそのまま載ってしまうので
セキュリティ的に良くないため、環境変数を利用する実装に切り替えます。
basic_authメソッド内で直接記述しているユーザー名とパスワードを、開発環境の環境変数に格納します。

これは使用しているMacのOSによってやり方は変わってきます。
今回は、OSがCatalina以降のやり方となります。

1.コマンドの実行

```
% vim ~/.zshrc
```

2.「iキー」を押して、インサートモードに移行します。
ターミナルの左下に「INSERT」と表示されるのを確認。

3.zshの内部に、以下の記述を追加しましょう。

```
export BASIC_AUTH_USER=ユーザー
export BASIC_AUTH_PASSWORD=パスワード
```

既にzsh内に記述がある場合は、その記述の下に「追加」します。既存の記述を削除してしまうと、パソコンが正常に動作しなくなる危険性があります。

4.記述を追加したら「escキー」を押して、 「:wq」と入力しましょう。
入力後、「Enterキー」を押して終了します。

5.最後に、「sourceコマンド」を実行します。

```
% source ~/.zshrc
```
これで、環境変数の設定は完了です。
出てきたいくつかの用語について説明させていただきます。

・zsh（ズィーシェル）
「zsh」はログインシェルと呼ばれるもので、プログラムを実行する時に、ユーザーの要求に一番最初に対応する役割を担います。隠しファイルなので、特別な設定なしではFinderなどには表示されていません。
環境変数を記載する場所は、設定ファイルである「.zshrc」の中です。
OSがCatalina以降であれば「zsh」、Mojave以前であれば「bash」が自動で適用されます。

・vim（ヴィム）
vim」とは、サーバー上で使用できるテキストエディタです。vimコマンドを用いることで、指定したファイルの編集をターミナルから行うことが可能です。
以下が使用例になります。

・source（ソース）コマンド
「sourceコマンド」とは、シェルに記述された内容を実行する役割を担います。zshファイルに記述された内容を実行します。

つまり、.zshrcというファイルは隠しファイルで直接記述できないので、vimコマンド
で編集を行い、sourceコマンド実行を行うということですね。
使っているMacのOSによって、「zsh」か「bash」か変わって来るので、設定する前に確認
が必要です。

ここまでできたら再度、application_controller.rbファイルを編集しましょう。

application_controller.rb

```ruby
class ApplicationController < ActionController::Base
  before_action :basic_auth


  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]  # 環境変数を読み込む記述に変更
    end
  end
end
```

これで、環境変数を使って、Basic認証を行えるユーザー名とパスワードを定義できました。

## 本番環境での環境変数の設定
続いて、Herokuの本番環境のアプリケーションにも設定を行います。
下記のコマンドを入力します。

```
% heroku config:set BASIC_AUTH_USER=ユーザー
% heroku config:set BASIC_AUTH_PASSWORD=パスワード
```
設定できたかは、下記のコマンドで確認できます。

```
% heroku config

=== stormy-journey-22625 Config Vars
BASIC_AUTH_PASSWORD:      パスワード
BASIC_AUTH_USER:          ユーザー
```

変更したコードをコミットしHerokuにデプロイします。

```
% git add .
% git commit -m "Basic認証を導入"
% git push heroku master
```

これで、すべて設定は完了です。
使っている環境によってやり方が違う場合もあるので
ご了承ください。
パスワード付きzip添付メール問題を考える ( PPAP 問題)

2021.2.25 オンラインで開催されたJPAAWG主催の[パスワード付きzip添付メール問題を考える(通称:PPAPカンファレンス)]((https://www.jpaawg.org/event/2021ppap/))で、弊社チーフエンジニア平野善隆(@hirachan)が「PPAPの今」「ここが変だよPPAP」の二つのセッションにパネルとして登壇しました。その時の資料をこちらにも共有します。


## 目次
- PPAPカンファレンスの概要
- PPAPの今 (パネルディスカッション)
- ここが変だよPPAP (パネルディスカッション)


## PPAPカンファレンスの概要

カンファレンスホームページから抜粋・引用します。

> PPAPというネーミングの妙もあり、現在、インターネットでのセキュリティ分野でなにかと話題になっている、電子メールのパスワード付きZIP添付書類問題について、JPAAWGとそのメンバーでは長年議論をすすめてきました。
> 昨年末の内閣府、内閣官房での廃止というニュースにつづき、大手企業での廃止の宣言など、色々なプレーヤーからこの問題についての様々な情報が発信されており、問題の本質や代替技術などについて、ややまとまりに欠けてしまっている状況についてJPAAWGでは一度整理する必要があると考えております。
> JPAAWGでは第一回のGeneral Meetingから、本件についてオープンな議論を行ってきましたが、来る2月25日に、メールやセキュリティのエキスパート、企業セキュリティの識者やユーザなどで集まって、PPAP問題についてWebカンファレンスを開き、問題や対策などの情報共有を行いたいと思います。


## PPAPの今 (パネルディスカッション)

- 株式会社オプテージ: 森崎 聡
- 株式会社クオリティア　CS企画本部 チーフエンジニア: 平野 善隆
- LRM株式会社: 幸松 哲也
- [PDF資料ダウンロード](https://www.jpaawg.org/docs/event/2021ppap/P1_PPAP%e3%81%ae%e4%bb%8a%28%e3%82%a2%e3%83%b3%e3%82%b1%e3%83%bc%e3%83%88%e7%b5%90%e6%9e%9c%29.pdf)
[<img width = 600 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326401/0f3b7303-9792-2775-a696-e36614b1293b.png">](https://www.jpaawg.org/docs/event/2021ppap/P1_PPAP%e3%81%ae%e4%bb%8a%28%e3%82%a2%e3%83%b3%e3%82%b1%e3%83%bc%e3%83%88%e7%b5%90%e6%9e%9c%29.pdf)

## ここが変だよPPAP (パネルディスカッション)
- 株式会社クオリティア　CS企画本部 チーフエンジニア: 平野 善隆
- Vade Secure 株式会社: 関根 章弘
- 国立情報学研究所: 北川 直哉
- 株式会社オプテージ: 森崎 聡
- [PDF資料ダウンロード](https://www.jpaawg.org/docs/event/2021ppap/P2_%e3%81%93%e3%81%93%e3%81%8c%e5%a4%89%e3%81%a0%e3%82%88PPAP.pdf)
- [<img width = 600 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326401/90aea222-5f94-f7c9-3fbf-f04fb6cbf044.png">](https://www.jpaawg.org/docs/event/2021ppap/P2_%e3%81%93%e3%81%93%e3%81%8c%e5%a4%89%e3%81%a0%e3%82%88PPAP.pdf)



## 参考
- [「パスワード付きzip添付メール問題を考える」ホームページ](https://www.jpaawg.org/event/2021ppap/)
- [「パスワード付きzip添付メール問題を考える」講演資料] (https://www.jpaawg.org/docs/event/2021ppap/)
privateなGitHubリポジトリを参照するPoetry on  Docker の作り方

# はじめに
docker buildkit sshを試してみました。


# ファイル

```:aaa/main.py
# pri_pjはprivateのライブラリ
from pri_pj import hello

print("start")
print(hello("aa"))
```

mainファイルではプライベートなGitHubリポジトリにあるライブラリ `pri_pj` の `hello ` 関数を使うだけの簡単なpythonファイルです。

```:pyproject.toml
[tool.poetry]
name = "aaa"
version = "0.1.0"
description = ""
authors = ["va034600"]

[tool.poetry.dependencies]
python = "3.6.*"
# プライベートなGitHubリポジトリ
pri_pj = { git = "ssh://git@github.com/va034600/pri_pj.git" }

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
```

poetryを使ってプライベートなGitHubリポジトリにあるライブラリを使う設定をしています。


```:Dockerfile
FROM python:3.6.8

WORKDIR /usr/src/app

ENV POETRY_VERSION=1.0.10 \
    PATH="/root/.poetry/bin:$PATH"

RUN curl -sSL https://raw.githubusercontent.com/sdispater/poetry/${POETRY_VERSION}/get-poetry.py | python && \
    poetry config virtualenvs.create false

COPY ./pyproject.toml /usr/src/app/pyproject.toml

RUN mkdir -m 700 $HOME/.ssh
RUN ssh-keyscan github.com > $HOME/.ssh/known_hosts
RUN --mount=type=ssh poetry install

CMD tail -f /dev/null
```

Dockerfile では poetry install をしています。
`RUN --mount=type=ssh poetry install`
poetry install する際に --mount=type=ssh をつけることでprivateなリポジトリを参照することができます。


# docker buildを実行
準備は整ったのでこれでbuildできるかと思います。

```
$ DOCKER_BUILDKIT=1 docker build -f docker/Dockerfile -t aaa --ssh default .
```

# docker-composeを実行
docker-composeを直接 buildkitを使ってsshアクセスするやり方が見当たらなかったので、
仕方なく、docker build で作成したイメージをdocker-composeで使うことにしました。

```:docker-compose.yml
version: '3.5'
services:
  abc:
    image: aaa
    working_dir: /usr/src/app/aaa
    command: python main.py
    volumes:
      - ../aaa:/usr/src/app/aaa
```

```
$ docker-compose up
```

# 終わりに

以前、Dockerfileからprivateなリポジトリにアクセスするイメージを作った際には、ssh keyをDockerイメージに埋めましたが、これはimageの中にssh keyが残るアンチパターンだった様です。
docker-compose上でbuildkit sshがまだ実現出来なかったのが気になりますが、これで開発する上でdockerイメージにprivateなライブラリを埋め込むことが出来そうです。

# 参考
- https://www.slideshare.net/AkihiroSuda/docker-125002128
- https://qiita.com/shizuma/items/ab185db88f3ea1c037ce
Unityのエラー『All Compiler Errors Have To Be〜』と『error CS0234: The type or namespace name〜』の解決方法をまとめる【備忘録】

ユニティちゃん入れて実行したらエラー出たんで、解決方法を備忘録的にまとめていきます。

エラー内容はタイトルにある通りです。

エラー１つ目

```csharp
”All Compiler Errors Have To Be Fixed Before You Can Enter Playmode!”
```
エラー２つ目

```csharp
error CS0234: The type or namespace name 'Policy' does not exist in the namespace 'System.Security' (are you missing an assembly reference?)
```
順番に解説していきます。

## ”All Compiler Errors...”の意味→エラー出てるから直せ

```csharp
All Compiler Errors Have To Be Fixed Before You Can Enter Playmode!”
```

こいつをgoogle翻訳にかけると、
>「プレイモードに入る前に、すべてのコンパイラエラーを修正する必要があります！」

とのこと。
なるほど、どうやらどこかでエラーが出てるらしいですね...

ってことで、Unityのコンソール内容を確認したところ、、、

```csharp
error CS0234: The type or namespace name 'Policy' does not exist in the namespace 'System.Security' (are you missing an assembly reference?)
```
とのことです。
例のごとくgoogle翻訳にかける。

英訳
> エラーCS0234：タイプまたは名前空間名「ポリシー」が名前空間「System.Security」に存在しません（アセンブリ参照がありませんか？）

いや、アセンブリの参照とか知りませんわ、って話。
引き続きエラー内容で調査すると、先人の記事を発見しました。

[【Unity】Unity-Chan!（ユニティちゃん）でCS0234エラーが発生したときの調査結果と解決方法 - Qiita](https://qiita.com/riekure/items/479406e53d9c6ca137b0)

こちらの記事によると、スクリプト内のusing節から `System.Security.Policy` をコメントアウトし、セーブすればOKとのことです。
早速やっていきましょう。

## 『AutoBlink.cs』の内容を修正
エラーが出てると言われたスクリプトファイル、`AutoBlink.cs`を修正していきます。

スクリプトのファイルパス
`Assets/UnityChan/Scripts/AutoBlink.cs`

```csharp
//エラー修正前
//
//AutoBlink.cs
//オート目パチスクリプト
//2014/06/23 N.Kobayashi
//
using UnityEngine;
using System.Collections;
using System.Security.Policy;
```


```csharp
//エラー修正後
//
//AutoBlink.cs
//オート目パチスクリプト
//2014/06/23 N.Kobayashi
//
using UnityEngine;
using System.Collections;
//using System.Security.Policy;//←ここをコメントアウト
```
修正してビルドをかけたら直りました。
先人に感謝です。

参考記事にはこのような事も書かれてました。
> Unity Japan公式に問い合わせたところ、使っていないので消しちゃって大丈夫との返事をもらったそうです。

とのことらしいです。

最新バージョンとかでは修正されてるらしいので、`AutoBlink.cs`のファイル自体を新しくするって解決策もあるようです。

## 所感

エラーを調べてたら、次なるエラーが出てきて、それを調べてたらまた次のエラーが出てきてそれを調べてたら。。。

エンジニアの領域って、コード書いてる時間より、エラーを解決してる時間の方が長いよね
って感じてます。

まぁクリエイティブって、そういう事ですもんね。

でもありがたいことに、先人達が答えをおいてくれてるんで助かってます。
Qiita万歳、ネット社会万歳。

エラー内容でググれば、たいてい事は何とかなる
(気がする…)

引き続き頑張ろ。
技術の情報収集やトレンドを抑えるためにおすすめのサイト

# はじめに

情報収集やトレンドを抑えるために眺めてるサイトをまとめました。

# ニュース

## Medium

https://medium.com/

## Menthas

https://menthas.com/

## Techfeed

https://techfeed.io/

## FreeCodeCamp

https://www.freecodecamp.org/news/

## eggHead.io

https://egghead.io/

# 知識共有

## Qiita

https://qiita.com/

## Zenn

https://zenn.dev/

## DEV

https://dev.to/

# 企業系ブログ

## codezine

https://codezine.jp/

## type

https://type.jp/et/feature/

## ICS MEDIA

https://ics.media/

# スライド共有

## slideshare

https://www.slideshare.net/

## SpeakerDeck

https://speakerdeck.com/

# イベント紹介

## Doorkeeper

https://www.doorkeeper.jp/

## connpass

https://connpass.com/dashboard/
初学者のJavaScript　メニューの表示/非表示

##jQueryとは
オープンソースライブラリの一つで、定型的な処理を書きやすくしてくれる。主に、DOM操作をする際に使用する。今回はサブメニューの表示/非表示を切り替えプログラムに使用した。

##DOM操作
DOM操作とはHTMLやCSSを書き換えたり、HTML要素にイベントを設定したりすること。

##jQueryの処理について
* イベントを設定したい要素を取得する
* 取得した要素にイベントを設定する
* イベント発火した際の処理決め、実行する

##記述の仕方
```javascript
$(document).ready(function(){
  $('hoge').on('click', function(){
    $(this).next().toggleClass('fuga');
  });
});
```
`$(document).ready(function(){});`
「HTMLが読み込まれたら、functionの{}を処理する」という内容
`$('.hoge').on('click', function(){});`
取得したhogeの要素をクリックした際にイベント発火し、functionの{}が実行される
`(this).next().toggleClass('fuga')`
hoge要素をクリックした際の処理の内容として、(this)でイベント発火の要素を取得し、nextでその直後の要素を取得している。hogeの直後の要素（fuga）の表示/非表示を切り替えるための記述。hogeをクリックすることで、イベント発火し、fugaをtoggleClassメソッドで`(this).next()`に追加・削除を繰り返すことで、表示/非表示を切り替えている。

##メソッドのまとめ
* `$('セレクタ')`：jQueryで要素を取得するメソッド。取得した要素は「jQueryオブジェクト」という独自のオブジェクトに変換する。
*  `('取得したい要素').on('イベント名', function(){イベント発火時の処理})`：取得した要素に対し、イベントを設定する。同じ要素が複数ある場合jQueryでは対象の要素全てにイベントを設定する。
*  `(hoge).toggleClass('クラス名')`：toggleDlassメソッドは取得した要素(hoge)にクラス名があれば削除、なければ追加をする。

## さいごに
プログラミングの初学者です。その日に学んだことを学習の一環としてアウトプットしています。より深く学習していきたいと考えておりますので、ご指摘等いただけますと幸いです。

参考図書：確かな力が身につくJavaScript「超」入門　第２版　著者：加納祐東
gitignoreについて スクショも使って優しく解説！

こんにちは、まゆみです。

今回の記事では、

<ul>
<li>.gitignore を使う時とは？</li>
<li>.gitignore　の使い方</li>

</ul>

について書いていきます。

イラストやスクショも使いながら、誰にでもわかるように説明しますね。


#gitignoreを使う時とは？
![見出しを追加 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/95cc400c-b438-60d2-d685-659252b228d3.png)

例えば、Project folder のなかに、GitやGitHubにアップロードしたいファイルに混ざって、『APIキー』など他人には知られたくないことが書かれた<font color="Red">secret.txtファイル</font>があるとします。

もしくはセッティングのファイルなどもアップロードしたくないですよね。

そのような時に使うのが『gitignore』です。

#gitignoreを実際に使う

ではさっそくgitignoreを使っていきましょう

##gitignore ファイルを作る

コマンドラインに

```

touch .gitignore

```

と入力してgitignore ファイルを作ります

gitignoreファイルは、隠しファイルなのでコマンドラインに『ls』(list) と入力しても表示されませんが、『ls -a』と入力する事で、隠しファイルも表示させることができます。


下記のようになります

![スクリーンショット 2021-03-08 075643.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/b8652ac6-332b-fb94-f30f-fd85a35ddbf9.jpeg)

もちろん.gitignore ファイルには今の時点では何も書かれていません。

なので今の時点で、『git add .』をコマンドラインに入力すると全てのファイルがStaging Area に入ってしまいます。(Staging Area の意味が分からない人は[こちらの記事](https://qiita.com/Mayumi_Pythonista/items/5fff7ffcf9d561259811)で説明しています。)


##.gitignoreファイルに無視したいファイルを書く

.gitignore ファイルを開き Local Repositoryにアップロードしたくないファイル名を書きましょう

![スクリーンショット 2021-03-08 081320.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/6c1a1061-b187-f99d-3dcd-9b9006a276c0.jpeg)

上記の様に書けばOKです。

(もし、『.txt』の拡張子のついたファイルを全て無視したい場合は.gitignore ファイルに　『*.txt』と書きます。)

##コマンドラインでディレクトリ内の全てのファイルをStaging Area にアップロード

![スクリーンショット 2021-03-08 081837.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/1c4a563f-7869-5326-ac7b-0b84d9b4f79b.jpeg)


『git add .』でディレクトリ内にある全てのファイルをStaging Area にアップロードします。

でも、その前に.gitignore ファイルに無視したいファイル名は書いているので、『.git add .』で全てのファイルを指定しているにも関わらず、<font color="Red">secret.txt ファイルは無視されてアップロードされます。</font>

##commitしましょう

ここまでくれば後は、普段通り

①Staging Area にあるファイルを

②commit してLocal Repositoryにアップロードする


#まとめ

.gitignore ってすごく便利ですよね。

.gitignore ファイルを作る時には、必ず一番前に『. ドット』を忘れないようにお願いします！


では今回の記事はこれで終わりにします。
kube-state-metricsを使ってみた

#はじめに
kube-state-metricsが気になっていたので使用してみました。
結果kubernetes-dashboardを初心者は進めるものだと思いました。

https://github.com/kubernetes/kube-state-metrics

まず、理由としてGrafanaとPrometheus連携できるのはいいけど、
実際に監視にたどり着くための手順が複雑すぎます。

# 使用してみる

github上のkube-state-metrics/examples/standard/のフォルダのデータを実行するば、インストールが終わります。
一応、このファイルはarmも対応れていました。
実行の手順としては、以下の手順を実行すれば、実行されます。

```bash
kubectl apply -f service-account.yaml
kubectl apply -f cluster-role.yaml
kubectl apply -f cluster-role-binding.yaml
kubectl apply -f deployment.yaml
```

あとは、deploymentで起動されたポッドに対して、サービスを割り振ってやれば、状態を見ることができます。
やり方は、省略します。

後は、サービスにアクセスして値を確認してみてください。

また、grafna上にサンプルは見つからなかった。
Databricksで提供されるMLflowモデルサービングのRESTエンドポイントによる機械学習モデルの迅速なデプロイ、テスト、管理

[How to Quickly Deploy, Test & Manage ML Models as REST Endpoints with Databricks \- The Databricks Blog](https://databricks.com/blog/2020/11/02/quickly-deploy-test-and-manage-ml-models-as-rest-endpoints-with-mlflow-model-serving-on-databricks.html)の翻訳です。

> MLflowのモデルレジストリは、リアルタイムでの推論、ダッシュボード、そして、テスト、制御、自動化のためのコードスニペットを含むターンキーのモデルサービングを提供します。

DatabricksにおけるMLflowのモデルサービングは、機械学習(ML)モデルを自動的に更新されるRESTエンドポイントとしてホストするターンキーソリューションを提供します。これにより、データチームは、トレーニングから本格運用に至る、リアルタイムMLモデルのエンドツーエンドのライフサイクルを持つことができます。

[サービス提供開始](https://databricks.com/blog/2020/06/25/announcing-mlflow-model-serving-on-databricks.html)以来、多くのお客様が自身で追加のインフラを持ったり、追加の設定を行うことなしに、シーミングレスにMLモデルをRESTエンドポイントとして提供することが可能となりました。さらにモデルサービングをシンプルにするために、MLflowレジストリはモデルサービングのステータスと、モデルサービングページへのリンクを表示する様になりました。
![](https://databricks.com/wp-content/uploads/2020/10/blog-mlflow-integrates-1.png)
MLflowモデルの利用をさらにシンプルにするために、モデルサービングページでは、モデルをリクエストするためのcurlやPythonのスニペットを表示する様にしました。リクエストはデプロイされている最新バージョン(例: model/clemens-windfarm-signature/Production)、あるいは特定のバージョン番号のモデル(例: model/clemens-windfarm-signature/2)に対して送信できます。
![](https://databricks.com/wp-content/uploads/2020/10/serving-requests-opt2.gif)
Databricksのお客様は、このモデルサービングの機能を、ダッシュボードにおけるモデル予測やファイナンスチームへの予測結果の提供などいくつかのユースケースで活用されています。Freeport McMoRanは、プラントのオペレーションをシミュレートするためにTensorFlowのモデルをサービングしています：

> "我々はプラントのオペレーションを最適化し、コストを削減するために、プラントにおける複数の異なるシナリオをシミュレーションし、意思決定するためのレコメンデーションをリアルタイムでレビューする必要があります。DatabricksのMLflowモデルサービングによって、エンドツーエンドのモデルライフサイクルを維持しながら、低いレイテンシーで機械学習から得られる示唆をオペレーターに対してシーミングレスに提供できる様になりました。"

DatabricksのModel Servingは現在(2020/11)パブリックプレビューです。そして、コスト効率が高く、管理容易性のためのMLflowモデルレジストリと密接に統合されており、リアルタイム予測のために、ワンクリックでのデプロイメントを可能にするものです。利用を開始する際にはこちらのドキュメントを参照ください[[AWS](https://docs.databricks.com/applications/mlflow/model-serving.html), [Azure](https://docs.microsoft.com/en-us/azure/databricks/applications/mlflow/model-serving)]。本サービスは現在プレビュー中ですが、比較的ミッションクリティカルではなく、高いスループットが求められないアプリケーションで使い始められることをお勧めします。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
環境構築　6　Node.js

#Node.jsの導入
Railsを動かすためにはNode.jsが必要となり、それをHomebrewを用いてインストールします。
#1. Node.jsのインストール
ターミナルに入力

```
brew install node@14
```

####Node.jsへのパスを設定しましょう

```
% echo 'export PATH="/usr/local/opt/node@14/bin:$PATH"' >> ~/.zshrc
% source ~/.zshrc
```

#2. Node.jsが導入できたか確認

```
% node -v
v14.15.3 # 数値は異なる場合がある
```
通知が来たときにMacのアプリのアイコンがバウンドするのを防ぐ方法

```shell
defaults write com.apple.dock no-bouncing -bool TRUE
killall Dock
```
この二つのコマンドをTerminalから実行すると、通知が来てもMacのアプリがバウンドしなくなります

1つ目のコマンドでアプリのアイコンがバウンドする設定を無効化し、
2つ目のコマンドでDockを再起動させて変更を反映させます

参考
https://www.macworld.com/article/1138403/dockbounce.html
ChromeとFirefoxで印刷用CSS（@media print）を確認する方法

最近よく聞かれる気がするので2021年3月時点の情報を明記しておきます👀
Firefoxはなかなかわかりづらい( ˘ω˘ )

# Google Chromeの場合

※ macOS Canary 91 で確認

1. 開発者ツール右上の三点リーダメニューを開く
2. 「__More tools__」を選択
3. 「__Rendering__」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142709/379dddab-2fdc-7dd0-6d93-0ea7044e876f.png)

Emulate CSS media type から「__print__」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142709/a2473b37-646f-ab59-c7d4-c2a6742f21f5.png)

# Mozilla Firefoxの場合

※ macOS Firefox 72 で確認

1. 開発者ツールを開きます
2. スタイルを操作・確認できるペイン右上のボタンを押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142709/24148238-b063-b9af-b622-350f147b2991.png)
PostgreSQLでcase-insensitiveなカラムを作る

citext型を使う。

## インストール
```
$ sudo apt install postgresqsl-contrib
```

## CREATE EXTENSION
`CREATE EXTENSION` に特殊な権限が必要なので、面倒ならpostgresユーザーを使う。

```
$ sudo su postgres
$ psql dbname
> create extension citext
> \dx
```

psqlを叩く際データベースを指定しないと、対象データベースで認識されないことに注意。

## 使う
```
> alter table users alter column login type citext;
```
【VBA】Split関数で氏名を苗字と名前に分ける

いつもはpythonを使用してExcelファイルの操作を勉強していまして
日々の気づきをアウトプットしているのですが
今回は、VBAでSplit関数を使を使った名前の分割についてです。

A列に名前が入力されていて、B列に苗字、C列に名前を分割して入れたい、
ということをしたいとします。

気を付けることは次の2点でしょうか。

1.  区切り方
2.  海外の方の名前

###### 1.区切り方
区切り方は

- 全角スペース
- 半角スペース
- ・
- セル内での改行（LF）

の４つの区切りパターンがあると思います。

###### 2.海外の方の名前

海外の方の名前を表記する場合は、カタカナか英字など使うと思います。
また、名→姓の順で表記です。
今回はカタカナや英字の場合は、名→姓の順で表記されているとします。

# InStr関数

```vb
InStr(元の文字列A, 検索する文字列B)
```

InStr関数は、引数Aで指定した文字列の中から、引数Bで指定した文字列を検索して、
見つかった位置を返します

```vb:例
InStr("ABCD", "C")
-->3

' 見つからなかった場合は「0」を返す。
InStr("ABCD", "E")
-->0
```

# Split関数

```vb
Split(元の文字列, 区切り文字)
```

Split関数は、ある区切り文字で区切られた文字列を、その区切り文字で区切り、区切られた各文字列を、一次元配列として返します。

```vb:例
str = Split("田中,山田,武田", ",")
str(0)--> 田中
str(1)--> 山田
str(2)--> 武田
```
配列の要素は0から始まるところがポイントでしょうか。

# 正規表現
正規表現を使うためのRegExpクラスを利用したいです。

VBAの画面で「ツール」→「参照設定」でダイアログを開きます。
ライブラリファイルの中から
「Microsoft VBScript Regular Expressions 5.5」にチェックを付けると
正規表現のRegExpクラスが利用できるようになります。

# コード
先ずは出来上がったコードからです。

```vb
Sub 名前分割()
    Dim v                           ' Split関数結果
    Dim s                           ' A列の分割前の氏名
    Dim r           As Range        ' 基準Rangeオブジェクト
    Dim i                           ' ループカウンタ
    Dim regKatakana As New RegExp   ' カタカナチェック用正規表現
    Dim regAlphabet As New RegExp   ' 英字チェック用正規表現
    Dim sFirstName                  ' 姓
    Dim sLastName                   ' 名
    
    ' カタカナの正規表現
    regKatakana.Pattern = "[｡-ﾟァ-ー]"
    regKatakana.Global = True
    ' 英字の正規表現
    regAlphabet.Pattern = "[a-zA-Z]"
    regAlphabet.Global = True
    
    ' A2セルを基準セルに設定。
    Set r = Range("A2")
    
    ' ループのカウンタを初期化
    i = 0
    
    ' A列のループ
    Do
        ' A列の現ループの行位置の氏名を取得
        s = r.Offset(i, 0).Value
        
        ' 氏名が取得できなかった場合
        If s = "" Then
            ' ここでループは終了
            Exit Do
        End If
        
        ' 各区切り文字を含んでいる場合は、その区切り文字で分割
        If (InStr(s, "　") > 0) Then
            v = Split(s, "　")
        ElseIf (InStr(s, " ") > 0) Then
            v = Split(s, " ")
        ElseIf (InStr(s, "・") > 0) Then
            v = Split(s, "・")
        ElseIf (InStr(s, vbLf) > 0) Then
            v = Split(s, vbLf)
        End If
        
        ' 正規表現で氏名がカタカナか英字だった場合
        If (regKatakana.Test(v(0)) = True And regKatakana.Test(v(1))) Or _
           (regAlphabet.Test(v(0)) = True And regAlphabet.Test(v(1))) Then
            sFirstName = v(1)   ' 苗字（A列の氏名が逆）
            sLastName = v(0)    ' 名前（A列の氏名が逆）
        Else
            sFirstName = v(0)   ' 苗字
            sLastName = v(1)    ' 名前
        End If
        
        '// B列に苗字を貼り付け
        r.Offset(i, 1).Value = sFirstName
        
        '// C列に名前を貼り付け
        r.Offset(i, 2).Value = sLastName
        
        ' 次セル用にループカウンタを加算
        i = i + 1
    Loop
End Sub
```

A列に氏名が複数入力されていて、それぞれの苗字をB列、名前をC列に貼り付けたいので
A列を１行ずつループして苗字と名前に分割して貼り付けるようにしてみました。

氏名がカタカナもしくは英字の場合は
苗字と名前を逆に貼り付けないといけないので
まずは正規表現を使ってカタカナまたは英字の氏名かを判定して
そうであれば苗字と名前を逆に貼り付けるようにしています。

今回は、急ぎだったのでVBAで作ったのですが
意外と忘れていて作るの時間がかかっちゃいました。

どちらにせよプログラム書いているときは時間の経過が速くてびっくりしますね。
【GCP】BCEのベネフィットを見出す（FABE分析）

<table>
	<tr>
		<th>ターゲット</th>
		<th>Feature（特徴）</th>
		<th>Advantage（利点）</th>
		<th>Benefit（利益）</th>
		<th>Evidence（証拠）</th>
	</tr>
	<tr>
		<th>スプレッドシートなど、GoolgeDriveの機能を保護したい。できればコンテキストで制御したい。WSは契約中。</th>
		<td>エージェントレスアプローチで簡単に採用。迅速に導入。特定の部署や人物のみに適用可能。追加のコストはかからない。WSやCIPの機能を活かせる。WSを使っていれば追加の契約はいらない。ゼロトラストは環境の全面的な見直しが必要で、1 台のパソコンに複数のエージェントをインストールしなければならないと多くの人が考えていますが、実際に必要なものはウェブブラウザだけなのです。セキュリティ運用を中断させない方法で強力なイノベーションをご利用になれます。現在契約しているGoolgeサービスを活用することができる。</td>
		<td>追加の契約をせずにゼロトラストを実装できる。今使っているコンソールから簡単に設定できる。</td>
		<td>エージェントレスなので、稟議やセキュリティの細かい審査も不要。現在の設定に追加するだけ。追加で何かを契約する必要がなく、ゼロトラストを実装することができる。場合によっては、追加コストもかからず、セキュリティレベルをあげることができます。</td>
		<td></td>
	</tr>
	<tr>
		<th>他社Saasを利用しようとしていて、ゼロトラストでセキュリティを強化したい。現在、Googleサービスは何も契約していない。</th>
		<td>エージェントレスアプローチで簡単に採用。迅速に導入。特定の部署や人物のみに適用可能。スケーラブルで信頼性の高い基盤。IDとコンテキストを意識したアクセス制御。クラウド、オンプレミス、またはハイブリッドを保護できる。BCE単品でも購入可能。Googleのネットワークの規模、信頼性、セキュリティを活用できる。</td>
		<td>Googleのネットワークの規模、信頼性、セキュリティを活用できるので、堅牢なセキュリティレベルを保てます。ID管理するので、複数のSaasを使用していても、BCEでSSOできます。エージェントレスアプローチなので、導入も簡単です。（ここはGKEかからないかも。かからないならコストのメリットもある）</td>
		<td>セキュリティの甘い他社SaasにもGoogleレベルのセキュリティを維持できるので、安心してリモート環境で作業できるようになります。ユーザー側でエージェントをインストールする必要がないので、導入も手間もかからず余計な工数がかかりません。</td>
		<td></td>
	</tr>
	<tr>
		<th>GCP内のアプリを無料の枠で保護したい。GCP利用中</th>
		<td>エージェントレスアプローチで簡単に採用。迅速に導入。特定の部署や人物のみに適用可能。ゼロトラストは環境の全面的な見直しが必要で、1 台のパソコンに複数のエージェントをインストールしなければならないと多くの人が考えていますが、実際に必要なものはウェブブラウザだけなのです。セキュリティ運用を中断させない方法で強力なイノベーションをご利用になれます。Googleのネットワークの規模、信頼性、セキュリティを活用できる。追加の契約をする必要はなし。</td>
		<td>GCP内で簡単に実装でき、BCを実装したことによる追加のコストはかかりません。（LBがかかるかを確認）。GCPを利用中なので、追加の契約は必要ありません。</td>
		<td></td>
		<td></td>
	</tr>
</table>
テキストボックスだらけのシートをセルに一括転記する

※テキストボックスの範囲がかぶってるところは失敗する

## 列構成をテキストボックスに合わせて変動させるver.
``` vb
Sub TextBox2Cell_1()
  '列構成をテキストボックスに合わせて変動させるver.
  '※テキストボックスの範囲がかぶってるところは失敗する
  Dim shp, r1, c1, r2, c2, w, h, t
  Dim Rng1, Rng2
  For Each shp In ActiveSheet.Shapes
    With shp
      r1 = .TopLeftCell.Row
      c1 = .TopLeftCell.Column
      r2 = .BottomRightCell.Row
      c2 = .BottomRightCell.Column
      t = .TextFrame2.TextRange.Characters.Text
    End With
    
    Set Rng1 = Cells(r1, c1)
    Set Rng2 = Cells(r2, c2)
    With Range(Rng1, Rng2)
      .Merge
      .Value = t
      .Font.Name = "Calibri 本文"
      .VerticalAlignment = xlTop
    End With
  Next
End Sub

```

## 列構成固定ver.

``` vb
Sub TextBox2Cell_2()
  '列構成固定ver.
  '※テキストボックスの範囲がかぶってるところは失敗する
  Dim shp, r1, c1, r2, c2, w, h, t
  Dim Rng1, Rng2
  c1 = 1
  c2 = 10
  For Each shp In ActiveSheet.Shapes
    With shp
      r1 = .TopLeftCell.Row
      r2 = .BottomRightCell.Row
      t = .TextFrame2.TextRange.Characters.Text
    End With
    
    Set Rng1 = Cells(r1, c1)
    Set Rng2 = Cells(r2, c2)
    With Range(Rng1, Rng2)
      .Merge
      .Value = t
      .Font.Name = "Calibri 本文"
      .VerticalAlignment = xlTop
    End With
  Next
End Sub
```
Visual Studio Code + TypeScript + Jest でTDD(テスト駆動開発)入門

# 環境構築

Visual Studio Codeで、TypeScript, Jestをインストールします。依存関係のあるパッケージがどんどんバージョンアップされて急に動かなくなることもあるので、とりあえず2021/03/08時点の内容です。

## プロジェクト雛形作り

Visual Studio Code内でどこか適当にディレクトリを作って、Terminal実行。
これがプロジェクトのルートディレクトリになる。

>
$ npm init -y
$ tsc -init

## Jestインストール
>
npm install --save-dev jest ts-jest @types/jest typescript

## package.jsonの編集
2021/3/8時点では以下のような依存関係になりました。そのままだとnpx jestが動かないので、dependencies部分を追加。

```javascript:package.json
{
  "name": "jest2",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "jest"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/jest": "^26.0.20",
    "jest": "^26.6.3",
    "ts-jest": "^26.5.3",
    "typescript": "^4.2.3"
  },
// 以下を追加
  "dependencies": {
    "ts-node": "^9.1.1"
  }
}

```


## プロジェクトのjestの設定初期化
>
npx jest --init

```javascript:jest.config.json
roots: [
  "<rootDir>/src"
],

transform: {
  "^.+\\.(ts|tsx)$": "ts-jest"
},
```

## ts-nodeの依存関係追加
そのまま npm t でテスト実行するとts-nodeがないと怒られるので、ts-nodeをインストール

> npm install --save typescript ts-node

これで環境構築完了。

# テスト実行
テスト実行はnpm tで実行できます。

> npm t

## ソースコードファイルとテストコードファイルの置き場

これまでの例ではプロジェクト直下にソースとテストを置いてましたが、ソースとテストのルートディレクトリは分けるのが普通です。
ソースのルートディレクトリは、ts.configに設定 rootDirがそれにあたります。
慣例的にソースのルートは "src"にしています。

```typescript:ts.config
{
     // 色々設定が他にもあるけど・・・
     "rootDir": "./src",   
     // 色々設定が他にもあるけど・・・
}
```

テストのルートは、
jest.config.jsonに記載します。
これも慣例的には、"test"ディレクトリをテストルートにします。
ディレクトリ構造は、ソースのディレクトリを模倣する形のほうがわかりやすいです。

```typescript:jest.config.json
export default {
  roots: [
    "<rootDir>/test"
  ],
}
```

とりあえずこれでテスト実行できました！(2020/03/08時点）

# TDDをはじめる

さてここからが本題です。テスト駆動開発です。
記載中・・・

# 参考にしたサイト
以下のサイトを参考にしました！ありがとうございました！！

https://qiita.com/okazuki/items/991a068892e946531612

https://qiita.com/mangano-ito/items/75e65071c9c482ddc335
pygameでゲームを作ってみる3＜アニメーション編　Part.1＞

#はじめに
今回は前回導入(？)したSpriteクラスを使ったアニメーション(画像が上下に動き続ける)に挑戦。

#進捗
###できること
・テキストを表示する
・残り時間をカウントし、表示する
・得点を計算し、表示する
・画像を表示する
・画像上をクリックしたときに「+1」を表示する
・画像上をクリックしたときに1点加える

:sparkles:NEW:sparkles:
・画像を上下に動かし続ける　

###コード全文

```python
import pygame
from pygame.locals import *
import sys

Scr_rect = Rect(0, 0, 500, 500)

class MySprite(pygame.sprite.Sprite):
    move_height = 100
        
    def __init__(self, filename, x, y, vx, vy):
        self.image = pygame.image.load(filename).convert_alpha()
        width = self.image.get_width()
        height = self.image.get_height()
        self.rect = Rect(x, y, width, height)
        self.vx = vx
        self.vy = vy
        self.up = self.move_height
        self.down = self.up + self.move_height

    def update(self):
        self.rect.move_ip(0, self.vy)
        if self.rect.top < self.up or self.rect.top > self.down:
            self.vy = -self.vy
    
    def draw(self, screen):
        screen.blit(self.image, self.rect)

def main():
    pygame.init()
    cl = pygame.time.Clock()
    screen = pygame.display.set_mode(Scr_rect.size)
    pygame.display.set_caption("Game")

    font = pygame.font.SysFont(None, 78)
    font2 = pygame.font.SysFont(None, 45)
    font3 = pygame.font.SysFont(None, 30)
    text1 = font.render("Click!", True, (204, 102, 112))
    text2 = font2.render("+1", True, (0, 0, 0))
    click = 0
    score = 0
    n_frames = 0
    TIME_END = 15
    
    #Spriteを作成
    ob1 = MySprite("Game\dg.jpg", 50, 200, 0, -2)
    
    while (1):
        screen.fill((102, 204, 194)) 
        screen.blit(text1, [170, 30])
        
        rest = TIME_END - (n_frames / 30)
        text4 = font3.render('time: {}'.format(round(rest,1)), True, (0, 0, 0))            
        screen.blit(text4,[350,60])

        #Spriteを更新
        ob1.update()
        #Spriteを描画
        ob1.draw(screen)

        for event in pygame.event.get():
            if event.type == QUIT:
               pygame.quit()
               sys.exit()

            if n_frames < 30 * TIME_END and event.type == MOUSEBUTTONDOWN and event.button == 1:
                if ob1.rect.collidepoint(event.pos):
                    click = 9
                    score += 1
        text3 = font3.render('score : {}'.format(score), True, (0, 0, 0))
        screen.blit(text3, [350, 40] )

        if click > 0:
            pos = pygame.mouse.get_pos()
            screen.blit(text2, pos)
            click -= 1

        pygame.display.update()
       
        if n_frames < 30 * TIME_END:
             n_frames += 1

        cl.tick(30)

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

#おわりに
無事、画像を動かすことができてほっとした。寝れないかと思った。
あれ、でもコード書き終わってからも調べたり、これ書いたりしてたら、いつの間にかこんな時間...
次回は、
・アニメーションを残り時間が０になったら終わらせる
・得点システムの改善
をしようかな...？
【数理考古学】ディラックのデルタ関数とヘヴィサイドのステップ関数

複数の次元で参照されるので分離しました(2021.3.8)

#ディラックのデルタ関数

単位インパルス関数ともいう様です。
[デルタ関数とヘヴィサイドの階段関数](https://python.atelierkobato.com/delta/)

>ディラックのデルタ関数 (Dirac delta function) はx=0で無限大、その他の区間で 
0の値をもち、全区間での積分が1となるように定義された特殊な関数です。

```math
\delta (t) = \left\{
\begin{array}{ll}
0 & (t \neq 0) \\
\infty & (t = 0)
\end{array}
\right.
```

```math
\int_{-\infty}^{\infty}\delta (t)dx=1
```

積分するとステップ関数sympy.Heaviside(t)になります。

```python
import sympy as sym

# 記号t,vを定義
sym.var("t,v")

# v = δ(t)
v = sym.DiracDelta(t)

dm = v.subs(t, -1)
d0 = v.subs(t, 0)
dp = v.subs(t, 1)

d_list = [dm, d0, dp]

print("[δ(-1), δ(0), δ(1)] =", d_list)

# デルタ関数の不定積分
i = sympy.integrate(v, t)

print("∫δ(t)dx =", i)

#出力結果
[δ(-1), δ(0), δ(1)] = [0, DiracDelta(0), 0]
∫δ(t)dx = Heaviside(t)
```
#ヘヴィサイドのステップ関数

単位ステップ関数ともいう様です。

[デルタ関数とヘヴィサイドの階段関数](https://python.atelierkobato.com/delta/)

>x<0で0,0<xで1となるように定義された不連続関数をヘヴィサイドの階段関数 (Heaviside step Function)、あるいはヘヴィサイド関数 (Heaviside Function) とよびます。

```math
H(t) = \left\{
\begin{array}{ll}
0 & (t < 0) \\
1 & (t < 0)
\end{array}
\right.
```
>ヘヴィサイド関数を微分するとデルタ関数となります。これはヘヴィサイド関数の原点における接線の傾きが∞となることを表しています。このように、デルタ関数を用いると不連続関数の微分を求めることができます。

```math
\frac{dH(t)}{dt}=\delta(t)
```

```python
import sympy as sym
from sympy.plotting import plot

# 記号t,vを定義
sym.var("t,v")

# v = H(t)
v = sym.Heaviside(t)

# H(-1)
hm = sym.Heaviside(-1)

# H(0)
h0 = sym.Heaviside(0)

# H(1)
hp = sym.Heaviside(1)

h_list = [hm, h0, hp]

print("[H(-1), H(0), H(1)] =", h_list)

# ヘヴィサイド関数をxで微分
dy_dx = sympy.diff(v, t)
print("dH(x)/dx =", dy_dx)

#[-5, 5]の範囲でヘヴィサイドの階段関数をプロット
p = plt(y, (x, -5, 5), xlabel = "t", ylabel = "v")

#出力結果
[H(-1), H(0), H(1)] = [0, Heaviside(0), 1]
dH(x)/dx = DiracDelta(t)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/2c507c4b-0c78-4cef-7636-1b7ddfcc550e.png)
Trying to get property of non-objectエラー

laravelでビューを作成している際に、Trying to get property of non-objectというエラーが出ました。
これは、アロー演算子の先に値がないというエラーです。

これを解決するには、optional()関数を使います。

````
{{ optional($post->category)->name }}
````

ヘルパー関数optional()は第二引数と共に利用し、第一引数(optionalの中)がnullでない時、第二引数を実行します。
システム再起動後もfirewalldを起動する

Vagrant + VirtualBoxでMac OS上にCentOS 7を構築してみた
まずはfirewalldの状態を確認

```
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
```

あれ？アクディブになっていない？
サービスを起動して再度状態確認

```
# systemctl start firewalld.service
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since Sun 2021-03-07 15:59:14 UTC; 4s ago
     Docs: man:firewalld(1)
 Main PID: 943 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─943 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
```

システム再起動後もfirewalldを起動するように設定して無事完了

```
# systemctl enable firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
```
LR(0)集合からLALR(1)集合を生成する

# 概要

LR(1)集合を求めてからLALR(1)集合を求めるのは計算量が多くつらい

LR(0)集合から先読み記号を伝播させる方式でLALR(1)集合を求める方法があるらしいのでそれを使う

# 結果

- LR(1)集合から生成 -> 120秒弱
- LR(0)集合から生成 -> 3秒くらい

になった

# 方法

以下の文法Gについて考える。

```
S -> L = R | R
L -> * R | i
R -> L
```

## 方針

LALR(1)集合とLR(0)集合の核(Kernel)は同じはず

## 1. LR(0)の状態遷移図を求める


```
I0={
    S' -> ・S
    S -> ・L=R
    S -> ・R
    L -> ・*R
    L -> ・i
    R -> ・L}
I1={
    S' -> S・}
I2={
    S -> L・=R
    R -> L・}
I3={
    S -> R・}
I4={
    L -> *・R
    R -> ・L
    L -> ・*R
    L -> ・i}
I5={
    L -> i・}
I6={
    S -> L=・R
    R -> ・L
    L -> ・*R
    L -> ・i}
I7={
    L -> *R・}
I8={
    R -> L・}
I9={
    S -> L=R・}
```

状態遷移図

```
      =    *    i   $     S    L    R 
I0        I4   I5        I1   I2   I3 
I1                                     
I2   I6                               
I3                                    
I4        I4   I5             I8   I7 
I5                                    
I6                                    
I7        I4   I5             I8  I9 
I8                                    
I9                                    
```

## 2. LR(0)の核(Kernel)を求める

LR(0)項(文法に読んでいる場所を含む)の中で、最初の文法`S' -> ・S`またはドットが先頭にないものを核(Kernel)とする。

それぞれの集合の中の項は核から導き出すことができるので、核以外の文法は一旦除外する。

```
[I0]S' -> ・S
[I1]S' -> S・
[I2]S -> L・=R
[I2]R -> L・
[I3]S -> R・
[I4]L -> *・R
[I5]L -> i・
[I6]S -> L=・R
[I7]L -> *R・
[I8]R -> L・
[I9]S -> L=R・
```

同じ状態の核も存在するが、集合のラベルで区別するようにする。

## 3. 核ごとの閉包を計算する

核に先読み記号`#`を入れたものの閉包closure({[I,#]})を計算する。

閉包内の項の先読み記号に`#`が入っている場合、核の持つ先読み記号はすべてその項も持つことになる。

また先読み記号に`#`以外の記号が入っている場合、その記号が項から発生しているとする。

`#`の入った項についてはそれをシフトした項も同じく先読み記号を持つようになるので、
その先読み記号の伝播P(I)として計算しておく。

属している集合の種類については、LR(0)の遷移表をみて矛盾のないものを選ぶ。

```
//伝播先のないものは省略
P([I0]S' ->・S) = [I2]S -> L・=R
    [I3]S -> R・
    [I4]S -> *・R
    [I5]L -> i・
    [I2]R -> L・
P([I2]S -> L・=R) = [I6]S -> L=・R
P([I4]L -> *・R) = [I7]L -> *R・
    [I8]R -> L・
    [I4]L -> *・R
    [I5]L -> i・
P([I6]S -> L=・R) = [I9]S -> L=R・
    [I8]R -> L・
    [I4]L -> *・R
    [I5]L -> i・
```

## 4. 核の先読み記号を伝播によって求める

2.で用意した核の集合に対して、初期値として`S' ->・S`に終了記号`$`を追加する。

また3.で閉包を求めたときに先読み記号が発生する点が存在することから、
項をシフトしたものにその記号を追加しておく。

先読み記号が更新された核については3.で計算したP()を使ってその先読み記号を伝播させる。

更新されなくなったら終了。

```
               初期値  1回目  2回目  3回目
[I0]S' -> ・S    $      $      $     $
[I1]S' -> S・           $      $     $
[I2]S -> L・=R          $      $     $
[I2]R -> L・            $      $     $
[I3]S -> R・            $      $     $
[I4]L -> *・R    =     =/$    =/$   =/$
[I5]L -> i・     =     =/$    =/$   =/$
[I6]S -> L=・R                 $     $
[I7]L -> *R・           =     =/$   =/$
[I8]R -> L・            =     =/$   =/$
[I9]S -> L=R・                       $
```

> 4回目で更新されなかったので終了

## 5. 状態ごとに閉包を求める

4.で核の先読み記号が求まったので、その状態ごとの閉包を求めることでLALR(1)の状態遷移図の集合を求めたことになる。

GOTO(I,X)はLR(0)遷移図のものを流用できる。

# 参考

- Aho, A.V: Compilers - Principles, Techniques, and Tools, Addison-Wesley, 1986
- 中田育男, コンパイラの構成と最適化(第2版), 朝倉書店, 2009
[Tips] Jest で private readonly な値をモックする方法

# はじめに

Jest でクラスの `private readonly` な変数を差し替えたい時に若干引っかかったのでメモっておきます。タイトルでは Jest とありますが、本記事の内容は JavaScript でモックする際の有効な手法の 1 つとして利用することが可能です。

# Object.defineProperty を利用して値を差し替える

結論から言うと変数を差し替えたい場合は下記のような記述になります。

```javascript
const mockValue = "";
Object.defineProperty(service, "privateReadOnlyValue", {
  value: mockValue,
});
```

ちなみに関数を差し替えたい場合は下記のような記述になります。

```javascript
Object.defineProperty(service, "privateSumFunction", {
  value: jest.fn((a, b) => a + b),
});
```

各種テストケースで使いまわしているインスタンスの `private readonly` な変数をモックした場合、値をリストアしたいケースも出てきました。その場合の記述としては、下記が有効でした。

```javascript
// tmpService 変数に service インスタンスを clone して利用する
const tmpService = Object.create(service);
Object.defineProperty(tmpService, "privateReadOnlyValue", {
  value: "",
});
```

# おわりに

`Object.defineProperty` と `Object.create` を駆使すれば大体のケースでは事足りそうです :relaxed: 

# 参考リンク

- [Object\.create\(\) \- JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/create)
- [Mocking read\-only properties for a class · Issue \#2227 · facebook/jest](https://github.com/facebook/jest/issues/2227#issuecomment-265005782)
Navigate with named routesをざっくり読んでみる

Navigate with named routesの公式ドキュメントをざっくり読んでみて、内容を理解する。

https://flutter.dev/docs/cookbook/navigation/named-routes

今回は、2つのスクリーンでのやりとりに関するチュートリアル（以下のリンク参照）の応用版です。
何回も同じ画面に遷移する場合は、routeを使って対応します。

https://flutter.dev/docs/cookbook/navigation/navigation-basics

####1. まずは2つのScreen「First Screen」と「Second Screen」を用意します。

```
class FirstScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('First Screen'),
      ),
      body: Center(
        child: ElevatedButton(
          child: Text('Launch screen'),
          onPressed: () {
            // タップしたときにSecondScreenに遷移する
          },
        ),
      ),
    );
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Screen"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // タップしたときにFirstScreenに戻る
          },
          child: Text('Go back!'),
        ),
      ),
    );
  }
}
```

####2.routesを定義します。

```
MaterialApp
  // アプリは"/"から始まります。今回の場合、 アプリはFirstScreenから始まります。
  routes: {
    '/': (context) => FirstScreen(),
    // /secondに遷移する場合、SecondScreenが構築されます。
    '/second': (context) => SecondScreen(),
  },
);
```

####3.FirstScreenのonPressed内に、second screenへの遷移を記載します。

```
onPressed: () {
  Navigator.pushNamed(context, '/second');
}
```

####4.SecondScreenのonPressed内に、firest screenへ戻る遷移を記載します。

```
// Within the SecondScreen widget
onPressed: () {
  Navigator.pop(context);
}
```
以上です、誰かの参考になれば幸いです。
imgのファイル指定をv-bindでする時

Vue.jsでimgタグのsrc指定を変数で行う場合、そのままだと使えないので注意

## TL;DR
require()を使用する

## やってみる
※この例ではNuxtも使用しています

### そのまま変数を置いてみる

```vue
<template>
  <img :src="pass">
</template>

<script>
export default {
  data() {
    return {
      pass: '~/assets/test-img.png'
    }
  }
}
</script>
```

なんとなくいけるような気はするが、結果は `404エラー` となってしまいます。
どうやら、相対パスを表す `~` 部分が、 **そのまま文字列として** 読み込まれてしまっている模様。（たぶん）

### モジュールとして読ませる
そこで、 `require()` を利用する。

```vue
<template>
  <img :src="pass">
</template>

<script>
export default {
  data() {
    return {
      pass: require('~/assets/test-img.png')
    }
  }
}
</script>
```

これで晴れて表示させることができます！（表示例がないのでわかりにくいですが...）


## （おまけ）static配下の画像の場合
指定したい画像がstatic配下だと、require使わずとも表示させることができます。

```vue
<template>
  <img :src="pass">
</template>

<script>
export default {
  data() {
    return {
      pass: 'test-img.png'
    }
  }
}
</script>
```

template内で直接指定する場合、
`~/static/test-img.png` は `test-img.png` と書くことで、自動でstatic配下に補完してくれるようです。
相対パスの記述がないので、変数で文字列として読ませても、うまく作動するようです。

便利〜〜〜
routes.rbのルーティングを他ファイルに分割した話

# はじめに

本稿は、railsのroutes.rbに記述されたルーティングが数百行にも渡り、コードの可読性が欠けてしまっている場合において、自身がどのように見やすさを確保したのかを記載したものになります。

# ルーティングを分割する

## 0. 編集前のconfig/routes.rb


※記載されている内容は例として設定しているだけなので、それぞれのルーティング名に関連性はありません。


```ruby:config/routes.rb
Rails.application.routes.draw do
  namespace :api, format: 'json' do
    namespace :v1 do
      namespace :libraies do
        resources :libraries
      end

      namespace :books do
        resources :books
      end
    end

    namespace :v2 do
      namespace :libraries do
        resources :libraries do
          collection do
            get :borrowed_books
          end
        end

        resources :librarians do
        end
      end
    end
  end
end
```

### こちらのroutes.rbをファイル分割していきます。

## 1. config配下に"routes"ディレクトリを作成する

![スクリーンショット 2021-03-07 21.43.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515679/a2ef9ba6-f5a5-a3f4-b89a-57a58ffa4c28.png)



## 2. config/routes.rbを編集

```ruby:config/routes.rb
Rails.application.routes.draw do
  def draw(routes_name)
    instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb")))
  end

  Rails.application.routes.draw do
   # ここに"routes_name"を定義します。
  end
end
```

- "routes_name"には`1. config配下に"routes"ディレクトリを作成する`で作成したroutesディレクトリ内に作成したファイル名を指定します。

※まだconfig/routes配下にファイルを作成していないので、次で作成していきます。

# 分割先のファイルを用意

今回サンプルで作成したroutes.rbでは

- api v1
- api v2

この粒度で分割していきたいと思います。

そこで`api_v1.rb`と`api_v2.rb`という名前のファイルを作成します。

```shell
touch config/routes/api_v1.rb
```

```shell
touch config/routes/api_v2.rb
```


# 3. routes.rbに作成したファイル名を指定する

```ruby:config/routes.rb
Rails.application.routes.draw do
  def draw(routes_name)
    instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb")))
  end

  Rails.application.routes.draw do
    draw :api_v1
    draw :api_v2
  end
end
```


# 4. api_v1.rbを編集

```ruby:config/routes/api_v1.rb
namespace :api, format: 'json' do
  namespace :v1 do
    namespace :libraies do
      resources :libraries
    end

    namespace :books do
      resources :books
    end
  end
end
```

# 5. api_v2を編集

```ruby:config/routes/api_v2.rb
namespace :api, format: 'json' do
  namespace :v2 do
    namespace :libraries do
      resources :libraries do
        collection do
          get :borrowed_books
        end
      end

      resources :librarians do
      end
    end
  end
end
```


# 終わりに

これでかなり見やすくなりました！

分割するタイミングはプロダクトによって様々だと思いますが、コードの可読性を上げるためにも管理ができる範囲でコードをどんどん外に出していくことは重要だと思います。