OmniAICreator/Qiita-1.07M huggingface dataset:
QuickSight 利用イメージ

# 利用イメージ

* 管理者/Authorはデータソースを定義し、分析用のデータセットを準備する

* Authorはデータセットを基に分析を作成、Readerにダッシュボードとして共有

* Readerはダッシュボードをブラウザや、スマホから閲覧

<img width="503" alt="qsusageimage.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/4fe60cc6-66f1-faf3-3f93-61c4e90668f8.png">

# QuickSight用語

### データソース

RDS, Redshift, ファイル, Athenaなどデータの供給元です。

### データセット

データソースから閲覧するための一部を切り出し、特定のテーブルの指定や見やすいフィールド名や権限などの設定定義です。

### ビジュアル

いわゆるグラフ

### 分析

データセットを様々なビジュアルで可視化する。そのビジュアル群。

### ダッシュボード

分析をリードオンリーで提供するもの。

### テンプレート

作成した分析をテンプレート化することで、別のデータセットを使いダッシュボードを作成するために利用する。

## QuickSightユーザー

### 管理者

ユーザー管理、エディションの変更、Authorの操作ができる

### Author

データソースの作成、データセットの作成、分析の作成などができる

### Reader

ダッシュボードの閲覧ができる。静止画を見るだけではなく、ドリルダウン, フィルタリング, CSVダウンロードなど可能
NextCloudとownCloud Xを動かしてみた

## NextCloud

```sh
docker run -d \
 --name=nextcloud \
 --restart unless-stopped \
 -p 8081:80 \
 -v $(pwd)/nextcloud:/var/www/html \
 -v $(pwd)/apps:/var/www/html/custom_apps \
 -v $(pwd)/config:/var/www/html/config \
 -v $(pwd)/data:/var/www/html/data \
 nextcloud
```

## OwnCloud X

* [owncloud - Docker Hub](https://hub.docker.com/_/owncloud)

```sh
docker run -d \
 -p 8080:80 \
 -v $(pwd)/data/apps:/var/www/html/apps \
 -v $(pwd)/data/config:/var/www/html/config \
 -v $(pwd)/data/data:/var/www/html/data \
 owncloud
```


## 感想

* Nextcloudでmindmapが使えたので気に入った。
プログラミング言語の学ぶ順番について(初心者から中級者へ)後編




#追記
記事に書き忘れていましたが、複数の言語を中途半端にやるより、一つの言語を極めれる方がいいと思います。
ただその言語が自分に合わない（僕の場合はCが生理的にきつかった)　場合は他の言語へ移った方がいいとも思うのです。



#目次
大前提と学ぶ意義と大まかな学ぶ流れ
最初の一歩：Javascript
飛躍の一歩：Python
最初のコンパイル言語：C#
最後の難関、最強言語：C言語


http://www.minekawada.com/program-lang-order.html
YAMAHA VPNルータのIPsecトンネルインタフェース設定コマンドを生成するツール

# 対象
YAMAHA VPNルータ
(RTXシリーズ、NVR500以降)
Python3.x

# 使い方
以下のgithubリポジトリをcloneしてmain.pyを実行してください。

https://github.com/MasatoHanayama/yamaha_ipsec_tunnel_interface_command_generator

main.pyと同じ階層にconf.txtが生成されます。
それ以外はREADME.mdを参照してください。
JavaのEnum活用例

Javaを以前仕事で使っていた時に、分かりにくい処理があったのでそれをリファクタリングしたお話です。


# リファクタリング前

リファクタリング前はこのようになってました。

```Java

   private void doProcess() {
      A a = initial(); 
      if (!chkfnc1(a)) {
        throw new XXXException(x1);
      }

      if (!chkfnc2(a)) {
        throw new XXXException(x2);         
      }
      
      if (!chkfnc3(a)) {
        throw new XXXException(x3);         
      }
      
      
     execute(a); //チェック後の実行処理
     
   }

  private boolean chkfnc1(a) {}
  private boolean chkfnc2(a) {}
  private boolean chkfnc3(a) {}
  
```


インスタンス取得 -> インスタンスの正統性チェック(n回) -> 実行処理
という流れになってます。

`chkfncN`はシーケンスで流れるもので、順序の依存関係があるとします。

このようなままだとチェック要件が一つ増えると`chkfncN`関数がどのタイミングでチェックされるものか判断しづらくなり嫌気が差してきます。

# Enum
Enumを聞くと、

- 数値と対応関係がとれる
- switch-caseで場合分けができる

等を思い浮かべると思います。
僕の中で思う最大な特徴は順序が保証されていることだと考えています。

Haskellの型クラスEnum の定義の一部にも

```haskell

class Enum a where
 succ :: a -> a -- 次の値を示す関数
 pred :: a -> a -- 前の値を示す関数
```

が定義されています。

またJavaのEnumでも

```Java
  
for (DaysOfWeekEnum day : DaysOfWeekEnum.values()) {
}
```
このように順番に処理することができます

# JavaのEnumにある機能

JavaのEnumは**Enumの中に関数が定義できます**
https://qiita.com/KeithYokoma/items/9681b130ea132cfad64d

# 組み合わせる

以上を踏まえてこのようにできます。

```Java

public enum MyChecker {
    CHK1 {
        @Override
        public boolean chkfnc(A a) {}
        @Override
        public String erroMsg(){}
    },
    CHK2 {
        @Override
        public boolean chkfnc(A a) {}
        @Override
        public String erroMsg(){}
    };
    CHK3 {
        @Override
        public boolean chkfnc(A a) {}
        @Override
        public String erroMsg(){}
    };
    public abstract boolean chkfnc(A a);
    public abstract String errorMsg;
}

```

先ほどの例を用いると

```Java

private void doProcess() {
  A a = initial();
  for (MyChecker val : MyChecker.values()) {
     if (!val.chefnc) {
       throw new XXXException(val.erroMsg);
     }
  }
}

```

とdoProcessの中もスッキリして見渡しが良くなりました。
またEnumを使うことで順序が保証されているので、どのような動作を保証したいかも一目同然になります。


# まとめ

JavaでEnumのvaliesをこのように使っている記事があまりなかったので、書きました。
使える状況が限られますが、enumが順序を保証したものだと認識すれば他の応用も効くかと思います。
pythonとopencvの環境構築

今回は私がおすすめするpythonとopencvの環境を説明・解説していきます。
ぜひ皆さんも参考にしてみてください。
#動機
環境構築してみたら、意外と大変だったのでここに書いておきます。
#参考にしたサイト
[https://prog-8.com/docs/python-env](https://prog-8.com/docs/python-env)
[https://www.sejuku.net/blog/54272](https://www.sejuku.net/blog/54272)
#開発環境
MacOS Catalina
#スタート
###brewをインストール
[Homebrew公式ホームページ](https://brew.sh/index_ja)
ここに書いてあるスクリプトをターミナルに貼り付けて実行するとHomebrewがインストールされます。
###pyenvをインストール
```python
brew install pyenv
```
上を実行するとpyenvがインストールされます。
###pythonをインストール
pythonをインストールする前にやっておかないといけないことがあります。

```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
```
```
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
```
```
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```
```
source ~/.zshrc
```
このコードをあらかじめ実行しておく必要があるらしいです。（このコードを実行しても何も表示されません）
いよいよpythonをインストールします。

```
pyenv install --list
```

これを実行すると現在pyenvでインストールできる、ライブラリやpythonのバージョンが、書かれています。
私の場合、最新安定版の3.8.2をインストールします。

```

pyenv install 3.８.２
```
これを実行するとpython3.8.2がインストールされます。
###opencvをインストール
私の場合公式のopencvをインストールしようとしましたが、そのあとの設定が難しく、簡単な非公式の方にしました。

```
 pip install opencv-python
```

これを実行してopencvをインストールすると、環境構築が終了します。

#最後に
この環境があれば大体のことはできます。
#参考文献
[https://prog-8.com/docs/python-env](https://prog-8.com/docs/python-env)
[https://www.sejuku.net/blog/54272](https://www.sejuku.net/blog/54272)
[WIP]modelのRspecテストの書き方

#概要
私のmodelスペックの運用方針を掲載します。

サンプルコード内で＜単語＞　で表記されている部分は
＜＞を抜き、単語　で指定されている内容に置き換えます。

#model_specで何をテストするべきか？
- バリデーション
- クラスメソッド
- インスタンスメソッド

# サンプルコード(テンプレート)
```ruby:app/spec/models/xxxx_spec.rb
require 'rails_helper'

RSpec.describe ＜モデル名＞, type: :model do
  before do
    ＜インスタンス変数の準備＞
  end
  
  # ＜バリデーションのテスト＞
  describe "＜カラムの名前が＞" do
    before do
      ＜インスタンス変数の準備＞
    end
    context "＜有効な条件ならば＞" do
      it "＜有効な状態である＞" do
        expect＜＞
      end
    end
    context "＜無効な条件ならば＞" do
      it "＜無効な状態である＞" do
        expect＜＞
      end
    end
  end

  # ＜メソッドのテスト＞
  describe "＜メソッドの機能が＞" do
    before do
      ＜インスタンス変数の準備＞
    end
    context "＜条件１ならば＞" do
      it "＜求める結果１である＞" do
        expect＜＞
      end
    end
    context "＜条件２ならば＞" do
      it "＜求める結果２である＞" do
        expect＜＞
      end
    end
  end
  
end
```

# 00_テストレシピについて
共通利用することの多いテスト内容はspec/custom_helper.rbファイルを作成し、その中でメソッド化して記述します。'rails_helper'の中でrequire しておくことで、各specファイル内で、メソッドを利用します。

# 01_バリデーションのテストレシピ
独自のバリデーションを設定している部分、権限周り、決済周りは、優先的にテストをかきます。
modelファイルに単純な設定をするだけで実装できるバリデーションはテスト化の優先度下げます。

## 必須入力
## 任意入力
## 指定文字数
## 指定文字種類

# 02_クラスメソッドのテストレシピ

# 03_インスタンスメソッドのテストレシピ
swapは容量によってメモリ x 2 では無いみたい

参考まで。

## RH7公式
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-swapspace

#### 表15.1 システムの推奨 swap 領域

|システム内の RAM の容量   |推奨される swap 領域
|---|---
|⩽ 2 GBRAM              |              容量の 2 倍
|> 2 GB – 8 GB              |           RAM 容量と同じ
|> 8 GB – 64 GB            |           最低 4GB
|> 64 GB                   |                 最低 4GB
※ ハイバネートは基本使わないだろうと思い、表から省略しました。

#### 参考 ハイバネート
https://ja.wikipedia.org/wiki/ハイバネーション
> OSに備わる機能の一つで、電源を切断（シャットダウン）する前に、メインメモリが保持している内容を外部記憶装置（ハードディスクドライブ、以下ハードディスクと略）に待避させ、次にコンピュータを起動させた際、作業途中から再開できるようにする機能である。

## EC2(linux)公式
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-memory-swap-file/

|物理 RAM の量                                        |     推奨されるスワップ領域
|---|---
|2 GB 以下の RAM                       |                  RAM 容量の 2 倍、ただし常に 32 MB を超える
|2 GB 以上の RAM、ただし 32 GB 未満    |4 GB + (RAM – 2 GB)
|32 GB 以上の RAM                     |                 RAM 容量の 1 倍

### Amazon EC2(Linux)のswap領域ベストプラクティス
https://dev.classmethod.jp/articles/ec2linux-swap-bestpractice/
> swapファイルのススメ
> 
> /etc/rc.localに追記する例
> 2018/01/25更新 : 記事のコメントでエラーになるという指摘があり、一部修正しました。

```
SWAPFILENAME=/swap.img
MEMSIZE=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`

if [ $MEMSIZE -lt 2097152 ]; then
  SIZE=$((MEMSIZE * 2))k
elif [ $MEMSIZE -lt 8388608 ]; then
  SIZE=${MEMSIZE}k
elif [ $MEMSIZE -lt 67108864 ]; then
  SIZE=$((MEMSIZE / 2))k
else
  SIZE=4194304k
fi

fallocate -l $SIZE $SWAPFILENAME && mkswap $SWAPFILENAME && swapon $SWAPFILENAME
```
自動化ツール Autoit を使う

> AutoIt Tools are  a suite of tools intended to help out in the follow areas:

> Build scripting and configuration
Login scripts
General IT administration


という AutoIt ツールを自分用に使ってみる



## メリット 
[なぜautoitを使うのか…](http://blogs.yahoo.co.jp/nullpage_vwxyz/44110527.html)

- 良く文書化されている -- 「Autoitは.chmファイルとオンラインの両方で詳しい資料を提供しています。また多くの利用例もあり、これをコピーして実行する事は理解を助けます。またAutoItウェブサイトには親しみ易いフォーラムがあって第三者からの支援を容易に受ける事が出来ます。」
- USBメモリに入れていつでもインストール無しで利用できる -- 「インストールする事でシステムを破壊する事は有りません。また、どこのPCにもオートメーション環境を持ち歩く事が出来ます。」
- 標準的なエディタ・統合開発環境を持っている -- 「AutoitはSciTeエディタを使ってそれをAutoit用に設定します。AU3ファイルの編集や作成を簡単にする完全なIDE環境を提供します。」
- スクリプトをexeファイルにする事が出来る -- 「これによりテスト自動化機能を単体で利用できる小さなユーティリティの部品にすることができます。そしてAutoitでGUI部分だけを別に作る事によりこれらの部品を組み合わせるだけでいろいろな事が簡単にできるようになります。」
- Basicとそっくりである -- 「これは多くの人にとってプラスになる事が多いはずです。Basicは初心者でも覚えやすくとっつきやすい事は経験的に判っています。暫くAutoitプログラミングのブランクが有ったとしてもその書き方や感覚を忘れてしまう事を心配する必要がありません。例えばPerlGUITestを学んで使い込むと、Perlのプラス面が多い事は良く解りますが、それよりもとにかく直ぐにはじめやすい事が重要です。」


## セットアップ 
### ダウンロード
[AutoIt](http://www.download3k.com/Install-AutoIt.html)
[AutoIt_v3](http://www.autoitscript.com/autoit3/downloads.shtml)

### AutoItMacroGenerator02.exeのダウンロード

[AutoIt_v3](http://www.autoitscript.com/autoit3/downloads.shtml)

- AutoIt Script Editorをダウンロード。%AutoIt3%\SciTE\AutoItMacroGenerator以下にexeがダウンロードされる



## 簡単な利用方法
- AutoItMacroGeneratorを起動し、キー操作をスクリプトに変換する
- Helpの参照(かなり充実している)
- Sciteのヘルプ
- AutoIt3フォルダ以下に多くのSampleがある。 --　Examples,Extras,Include
- Au3Info.exeを利用してコンポーネント情報を調べる。例)ContolIdやWindowNameなどはこのexeを実行することで把握することが出来る


## AutoItでできること
- キー操作記録
- キーボード操作 [http://www.autoitscript.com/autoit3/docs/functions/Send.htm キーの一覧]
- マウス操作

※画面の操作を自動記録するには、SciTE ScriptEditorより「ツール」→「AU3Recorder」を選択し録画ボタンを押すことにより、スクリプトを自動生成してくれます。

- コンポーネント操作
- ユーザー定義関数の作成
- 変数宣言
- EXEファイルの作成-AutoItが入っていないクライアントでも*.au3ファイルをコンパイルしてexe化することで実行できる。

## スクリプト例

- ログインしてF3で終了

```
; Test


; Prompt the user to run the script - use a Yes/No prompt (4 - see help file)
$answer = MsgBox(4, "AutoIt Example", "This script will Execute the Company_U.exe and login by all/all and then quit.  Run?")


; Check the user's answer to the prompt (see the help file for MsgBox return values)
; If "No" was clicked (7) then exit the script
If $answer = 7 Then
    MsgBox(0, "AutoIt", "OK.  Bye!")
    Exit
EndIf


; Run the TEST.bat
Run("TEST.bat")


; Wait for TEST.exe become active
WinWaitActive("ログイン")

Send("all")

Send("{TAB 1}")

Send("all")

Send("{F1}")

Sleep(500)

Send("{ENTER}")

; Now quit by sending a "close" request to TEST
Send("{F3}")

Send("{ALT}&{y}")

; Finished!
```

- メニューの選択方法
 `WinMenuSelectItem($WindowTitle,"Rumix Banner","ファイル(&F)","CSVファイルに書き出す(&C)...")`

- ComboBoxの選択方法
 `ControlCommand(WindowTitle,"Rumix Banner","ComboBox1","SelectString",$String)`

- OKボタン押下方法
 `ControlClick($WindowTitle, "", "[CLASS:Button; TEXT:OK; INSTANCE:1]")`

- Hundleの取得方法
 `$hCombobox = ControlGetHandle($WindowTitle,"",$ComboControlId)`

## 関連
- [AutoItFUNCTION説明のページ](http://www.autoitscript.com/autoit3/docs/functions.htm)

- [AutoHotKey](http://lukewarm.s101.xrea.com/)　…　AutoItよりも簡単らしい。

https://qiita.com/yutaka-tanaka/items/79287a6a401b20d77208
AutoGluonをGoogle Colab GPU環境で実行する方法

## AutoGluonとは
mxnet製のAuto MLライブラリ.
https://autogluon.mxnet.io/

## Setup on Linux
公式ページより

```sh
# Here we assume CUDA 10.0 is installed.  You should change the number
# according to your own CUDA version (e.g. mxnet-cu101 for CUDA 10.1).
pip install --upgrade mxnet-cu100
pip install autogluon
```

## Google Colabで実行
```sh
pip install --upgrade mxnet-cu100
pip install autogluon
from autogluon import TabularPrediction as task
```
> ImportError                               Traceback (most recent call last)
<ipython-input-1-3a57302dda27> in <module>()
      1 get_ipython().system('pip install mxnet autogluon')
----> 2 from autogluon import TabularPrediction as task

怒られる.
CPU利用でも同様.

## 解決
色々試したところ、下記の方法で解決.
https://github.com/awslabs/autogluon/issues/163

```sh
!pip uninstall -y mkl
!pip install --upgrade mxnet-cu100
!pip install autogluon
!pip install -U ipykernel
# and restart runtime
```
今後colabのGPUやcudaが変わるとまたエラーするかもしれない.
WSLで末尾の".exe"を補完してコマンドを実行する

WSLはWindowsのバイナリを実行できますが、`hoge.exe`を`hoge`として実行できません。
数が多くない場合は `alias hoge=hoge.exe` としておけばよいですが、それも面倒な場合もあります。

ところで、Bashでは`command_not_found_handle`というシェル関数が存在する場合、コマンドが存在しない時にこのシェル関数を呼びます。
https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBY

これを利用して、`hoge "a" "b c"`とコマンドを打ちコマンドが存在しない場合に、 `hoge.exe "a" "b c"` としてコマンドを実行することができます。

```bash:.bashrc
function command_not_found_handle(){
        unset command_not_found_handle
        "$1.exe" "${@:2}"
}
```


unsetしておかないとコマンドが存在しない時に再帰ループに陥るので、unsetするといい感じになります。
command_not_found_handleを呼ぶときはサブシェルで実行されるため、unsetをしても元のシェルには影響はありません。


command_not_found_handleを使う方法の欠点は、2回コマンド実行を行うケースがあるため、それがネックになる可能性があります。
そのパフォーマンスも惜しい場合は、`hash`であらかじめ有効なコマンドを設定しておく方法が使えるかもしれません（未調査）
~~WSLをあきらめるという手もあると思います~~

### おまけ

`"${@:2}"`は部分文字列展開を配列`@`に対して行っており、`"$2" "$3" ... "$n"`と同じ意味になります。

https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBB

> ${parameter:offset:length}
> parameter が @ ならば、結果は offset から始まる length 個の位置パラメータになります。 


### 参考

WSLのIssueが上がっていますが、WSL側では対応せず、ユーザにあった方法で回避してもらう方針のようです。
https://github.com/microsoft/WSL/issues/2003
（個人的にもWSLにWindowsの都合はあまり持ち込まないほうが良いと思います。Linuxの互換レイヤーとして頑張ってもらいたいですし）
Node.js(五):Express 実装

<p>今回からはNodeでExpressを勉強しましょう、Expressは人気なのJSバックエンドモジュールと言うことです。先ずはインストールしてみよう。</p>
<h1>実装の手順</h1>
<h3>Node.js立ち上げ</h3>
<p>新たなフォルダを作って、エントリポイントとしてのapp.js追加して、vscode中のターミナルでポロジェクトにnode.jsをインストする。</p>

```terminal
xxx.xxx:my-first-express$npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (my-server) 
version: (1.0.0) 
description: 
entry point: (app.js) 
test command: 
git repository: 
keywords: 
author: 
license: (ISC) 
license: (ISC) 
About to write to /express/my-server/package.json:

{
  "name": "my-server",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this OK? (yes) yes
````
そして、package.jsonは作成しました。

```pachage.json
{
  "name": "my-server",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
```

<h3>Expressインストール</h3>
<p>ターミナルでnpmでexpressをインストールします</p>
```terminal

xxx.xxx:my-first-express$ npm install express
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN my-server@1.0.0 No description
npm WARN my-server@1.0.0 No repository field.

+ express@4.17.1
added 50 packages from 37 contributors and audited 126 packages in 2.902s
found 0 vulnerabilities
```
そして、package.json中で確認しましょう。
 
```package.json
{
  "name": "my-server",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}
```
"dependencies"の意味は開発者使うパッケージ、ちなみに^4.17.1の"^"はマイナバージョンまでを使われる。
<h3>Experss導入</h3>

```app.js
 const express =require("express"); //express moduleをリクワイアする
 const app = express();//expressオプジェットを呼ぶ

//ポットとコールベック関数の内容を設定する
app.listen(3000,function(){
    console.log("Success to run Server!!") 
})
```

最後はターミナルでテストしよう

```terminal
xxx.xxx:my-first-express$ node app.js
Success to run Server!!
```
以上です。
docker-machineでGCPのインスタンス建ててみた

SSLの申請してて暇だった時に、建てることにした。今度やるときは`Terraform`で建てられればいいなとは思っている。

AWSと同様にcredentialを必要とするからIAMを作成した上で、鍵を保存しておく。その鍵までのPATHを調べられたら以下のコマンドを叩く。[(参考リンク)](https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-python)

```
# フルパスで
$ export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
```

またサービスアカウントがIAMに属していない場合、permissionで弾かれるので、追加しておくこと。

自分でさらにカスタマイズしたい場合は、以下のコマンドを試した上でセッティングしてくれれば良いと思う。

```
$ docker-machine create --driver google --help
```

ではコマンドを書いていく。
またこのここで記載されているインスタンスは申請してCPUsの上限を増やさないと利用できないことに注意。(なのでそこは適宜調節してください。)

```
$ docker-machine create \
  --driver google \
　--google-disk-size "30" \
  --google-machine-type "c2-standard-4" \
  --google-network "default" \
  --google-subnetwork ""
  --google-open-port 80 \
  --google-open-port 443 \
  --google-open-port 8888 \
  --google-project projectname \
  --google-username "ubuntu" \
  --google-zone "us-central1-a" \
  testmachine
```

理由はわかっていないのでなんとも言えないが、大文字を使ってインスタンスを作ってしまうとエラーを吐き、消すこともできなくなってしまう。
そうなってしまった人は、直接インスタンスがあるとこへ行きしてもらえると、良いかもしれない。
ちなみにこのポートはhttp,https,Jupyterlab用です。

```
$ cd ~/.docker/machine/machines
$ rm -rf マシン名
```

参考:
[Hyper-Vを使ったdocker-machine上の削除できないDockerホストを強引に削除](https://qiita.com/m_yokoyama/items/cc37e81c8995d6853613)
golang[][]stringでのtranspose(転置)

####goalngで[[][][][][]]のような二次元配列の順番をtranspose(縦横変換)する。
・csvを読み込んだ際に変換したくなったので、その部分を抜粋。


```main.go
package main

import "fmt"

func transpose(slice [][]string) [][]string {
	xl := len(slice[0])
	yl := len(slice)
	result := make([][]string, xl)
	for i := range result {
		result[i] = make([]string, yl)
	}
	for i := 0; i < xl; i++ {
		for j := 0; j < yl; j++ {
			result[i][j] = slice[j][i]
		}
	}
	return result
}

func main() {
	sample := [][]string{
		[]string{"a1", "a2", "a3", "a4", "a5"},
		[]string{"b1", "b2", "b3", "b4", "b5"},
		[]string{"c1", "c2", "c3", "c4", "c5"},
	}
	fmt.Println(sample)
	ar := transpose(sample)
	fmt.Println(ar)
}
```

参考
https://gist.github.com/tanaikech/5cb41424ff8be0fdf19e78d375b6adb8
nvim-qtでタブラインやポップアップメニューがよく見かける感じにならない問題の対処

window10にneovimをインストールし，vim-airlineなどのプラグインを導入したにもかかわらず，タブラインやポップアップメニューがよく見かける感じにならなかったので対処をメモ．

よく見かける感じのタブラインとポップアップメニュー
---
![GuiTabline_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604598/327e6bd3-917b-2ac5-9680-3b4e7463da96.png)
![GuiPopupmenu_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604598/d87504db-6f11-cbb1-1b00-7c2b9c810bdf.png)

問題のタブラインとポップアップメニュー
---
![GuiTabline_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604598/00dcd8ec-22b3-f9f0-5206-d156e603d382.png)
![GuiPopupmenu_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604598/4340c686-ad29-102e-cbf6-7e6b60de4a6c.png)

# 解決策
原因は，nvim-qtではGui設定が適用されるためである．
よって，ginit.vimに以下の設定を記述することで解決できる．

``` vim:ginit.vim
GuiTabline 0
GuiPopupmenu 0
```
Rspecの書き方

Railsを学習していく中でRspecでのテストも書けるようになりたかったのでまとめてみます。

##1 Rsepcの構造
四則演算のテストをもとに考え、Rspecの中で使用されているコードを確認します。

##2 describe
describeはテストの大きな括りを表します。
なので基本的にはこのdescribeの中にテストの内容を細かく書いていきます。

```ruby
describe '四則演算' do
end
```

##3 context
contextはdescribeの中を分けたい時に使用します。
例えば四則演算でいうところの'足し算'、'引き算'、'割り算'、'掛け算'のようにdescribeの中に様々な種類があるときなどはこのcontextを使用します。

```ruby
describe '四則演算' do

  context '足し算' do
  end
  context '引き算' do
  end
  context '割り算' do
  end
  context '掛け算' do
  end

end
```

逆に言うとdescribeの中を複数に分ける必要がなければこのcontextは必要ではありません。

##4 it
itは具体的なテストの内容を記述します。
足し算なら1+1=2になるかなど具体的なテスト内容を記述します。

```ruby
describe '四則演算' do

  context '足し算' do
    it '1+1=2になる' do
    end
  end
  context '引き算' do
    it '2-1=1になる' do
    end
  end
  context '割り算' do
    it '2÷2=1になる' do
    end
  end
  context '掛け算' do
    it '2x1=2になる' do
    end
  end

end
```

##5 テストを記述する
先ほどの構造を踏まえると実際に四則演算のテストをすると以下の形になります。

```ruby
describe '四則演算' do

  context '足し算' do
    it '1+1=2になる' do
    expect(1 + 1).to eq 2
    end
  end
  context '引き算' do
    it '2-1=1になる' do
    expect(2 - 1).to eq 2
    end
  end
  context '割り算' do
    it '2÷2=1になる' do
    expect(2 / 2).to eq 1
    end
  end
  context '掛け算' do
    it '2x1=2になる' do
    expect(2 * 1).to eq 2
    end
  end

end
```

ここで新しく出てきた
・expect
・to
・eq
について解説します。

exepect=処理内容を記述
to=期待する値が~であることを意味
eq=期待する値を記述

##6 テストの実行

```
rspec spec/test_spec.rb
```
正常にテストができるか確認します。
学習したモデルに Semantic Segmentation させて、Webカメラ画像にリアルタイムで、 TouchDesinger のエフェクトかける

Tensorflow を利用した学習モデルを利用して、Semantic Segmentation した情報を基に、TouchDesigner でエフェクト付けるだけで、リアルタイムの人の動きに合わせたインタラクティブアプリケーション作れますって言いたく無いですか？

私は言いたかったので、作ってみました。
![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/c518b182-3191-c162-077c-e2fed8670482.gif)
というわけでリアルタイムと言いながら全然動けないレベルですが、GPUが使えるマシンならもっとずっとマシになるはずです、多分。こんなレベルですが、2人日（16時間、当社比）でできたので、プロトタイプという意味では、次に繋がると思っていて、とても良いんじゃ無いかなと思っています。

# 前提
* anaconda, python インストール済み
* TouchDesigner インストール済み
* MacBook Pro

# 簡単な仕組み
1. Webカメラ -> DeepLab で Semantic Segmentaitonする
2. 1の結果 camTwist 経由で TouchDesigner に入力する
3. 作っておいたエフェクトを 1 の結果にだけ適用して、Webカメラの映像に重畳する

という感じです。

# やり方
それぞれどうやるの？であれば、以下記事に分割してあるので、ご参照ください。
## 1のために
* [DeepLab で Sematic Segmentation する（デモを動かす）](https://qiita.com/matchyy/items/09ce0881c5214d12dc5e)
* DeepLab でWebカメラを使うためのには [Real-time semantic image segmentation with DeepLab in Tensorflow](https://averdones.github.io/real-time-semantic-image-segmentation-with-deeplab-in-tensorflow/)（英語なので google翻訳お願いします）のプログラムを参考にするといいと思います

## 2のために
* (鋭意製作中) 

## 3のために
* Voronoi エフェクトの作り方： [TouchDesigner を勉強しはじめて8時間でかっこいい Voronoi エフェクトを作る](https://qiita.com/matchyy/items/48dcc1b6d5d51aa6576d)
* 1 と 2の結果を合成します（私は Level と Add と Mutliply を使って合成しました）

# 参考
* [映像音響処理概説 2019](http://satoruhiga.com/TDWS2019)
* [【技術解説】DeepLabのセマンティックセグメンテーションとTouchDesignerを用いた映像制作](https://note.com/thedesignium/n/nf4245f419441)
* [今回のエフェクトはこれの変形](https://www.youtube.com/watch?v=54amDdU0eus&feature=youtu.be)
「ソフトウェアテスト入門 押さえておきたい要点・重点」の内容メモ

# 概要 -テストの必要性-
テストを効果的に実施することができればバグや手戻りが減り、開発作業をスムーズに進めることができる。また、開発工数が最適化されて費用対効果が上がることが期待できる。テストは計画→設計→実施の順で進められ、これらの工程を管理していく。通常テストは全工数の半分からそれ以上をかけて実施される。

# ブラックボックステストとホワイトボックステスト
テストにはプログラムやシステムを動かさずテストする静的テストと、反対に動かしてテストする動的テストがある。動的テストは以下の3種類がある。

- ブラックボックステスト
    - プログラム内部の構造に関係なく仕様に基づいて入力から出力の正しさをテストする方法。
- ホワイトボックステスト
    - プログラム内部の構造を考慮しテストする方法。分岐の先の処理の全て確認したりする。
- グレーボックステスト
    - ブラックボックステストとホワイトボックステストの両方取りで、プログラム内部の構造を把握したうえでテストする手法。入力と出力だけでなく必要なだけ内部の処理についても確認する。

ホワイトボックステストはカバレッジを目標値として実施されるが、必要性の高くない範囲までテストを実施してしまう。また、ソースコードに対する試験であり、仕様をテストしているためではないため非効率な部分がある。そのためブラックボックステストをメインとして、補助的にホワイトボックステストを用いることがおすすめされている。

# テスト項目
ブラックボックステストにおいて仕様のパターンやバグになりやすいところを網羅するテスト項目を作成するために同値分割、境界値分析という技法がある。

- 同値分割
    - 仕様から同じような複数の入力値をグルーピングし、その代表値を選択する
- 境界値分析
    - 同値分割した各グループの境界値付近を入力値として選択する
        - 一般的にバグは境界値付近にあることが多い

# カバレッジ
ソースコードがどれだけテストされたかを計測する方法としてカバレッジがある。カバレッジは以下の二つの種類があり、テスト専用のソフトウェアなどで計測できるものがある。

- ステートメントカバレッジ
    - 命令網羅とも呼び、ソースコード中の命令を少なくとも一回実行された場合に100%になる
- ブランチカバレッジ
    - 分岐網羅とも呼び、ソースコード中の分岐命令における分岐先のすべてのコードが実行されると100%となる。

ブランチカバレッジが100%ならばステートメントカバレッジも100%となる。一般的にブランチカバレッジが100%になるようにテストすべきだといわれている。

# 直交表
直交表はテストのための条件の組み合わせを作成する方法で、効率的にテスト項目を抽出することができる。ソフトウェアの機能をテストする場合、複数の機能の組み合わせを全て考えると指数関数的にテスト項目数が増加する。直交表を用いることで組み合わせの増加を抑制でき、効率的にテストを実施できる。一般に直交表で作成されるテスト項目数はソースコードの行数の1/10くらいとなる。

直交表を使ったテストの前条件として事前に単体テストを終わらせていることとする。また、前処理として各因子の水準数を同値分割などにより絞る必要がある。ここで因子とはパラメータ、水準はパラメータの値のこと。この各因子の水準数から適切なサイズの直交表の見積もる必要があるが、方法として2因子間網羅度を100%にする方法と、自由度と呼ばれる水準数からの計算結果より求める方法がある。

# ディシジョンテーブル
直交表はあらかじめ表の形が決められており、テストケースが直交表にうまくはまる場合もあればそうでない場合もある。この直交表とは別に、柔軟性の高いテスト項目の作成法としてディシジョンテーブルがある。行(or列)に条件とその結果出力される値を書き、列(or行)にテスト番号を振る。

# 仕様書の読み方とテスト設計
テストケースを作成するときに仕様書に3色ボールペンで書き込みをすると情報への感動が上がることが期待される。例えば、客観的に最も重要な場所、客観的にまあ重要な場所、主観的に気になったところに線や丸、コメントを書き込むとよい。

テスト設計には、マインドマップを作成することでよりうまくいくかもしれない。
Ubuntu(18.04.3)  SSH編


<h1>1.アップデート</h1>

```
$sudo apt update
```

これは基本毎回やる。

<h1>2.rootのパスワードを変更</h1>

```
$ sudo passwd root
```

Root権限のパスワードを設定。

ちょっと怖いので長めに設定します。

とりあえずRootにログインできました。

```
$ sudo su -
```

これでrootのプロンプトに切り替え。

viでここへ下記追記。

/etc/ssh/sshd_config

```
+ PermitRootLogin no
```

sshdを再起動すればrootのログインを無効にできます。

```
$ systemctl restart ssh
$ failed to restart sshd.service unit sshd.service not found
```

ファ！？

調べていくとそもそもopenssh-serverをインストールしなきゃいけない。

```
$ sudo apt-get install openssh-server
```

では、下記を直して

/etc/ssh/sshd_config

```
- PermitRootLogin prohibit-password
+ PermitRootLogin no
```

再起動。

```
$ sudo /etc/init.d/ssh restart
```

あり・・・・・・(再起動できてない？)。

調べてみるとsshdのサービスを開始しなきゃいけないんですね。

```
$ sudo aptitude install ssh
```

Macのターミナルから入ってみます。

```
$ ssh user@ipアドレス
```

お、できました。

rootにログインできるか試します。

```
$ su root
```

これでログインできなければOKです。

<h1>3.sshdのポートの設定</h1>
下記の変更。

/etc/ssh/sshd_config

```
- # Port 22
+ Port 2022
```

再起動。

```
$ sudo /etc/init.d/ssh restart
```

これで完了です。

<h1>4.ファイアウォールのポート番号閉鎖→新ポート設定</h1>
下記で確認。

```
$ sudo ufw status
```

前回開放した22は削除(あんまり良くないみたいです)

```
$ sudo ufw delete allow 22
```

新ポート開放

```
$ sudo ufw allow 2022
$ sudo ufw reload
```

これで2022番が開放されました

↓で入れないことを確認します。

```
$ ssh アカウント名@IPアドレス
```

↓でないと入れなくなりました。

```
$ ssh -p ポート番号 アカウント名@IPアドレス
```

<h1>最後に</h1>
夜9時から始まりこんな時間になってました。

明日もあるので寝ます。

次回は公開鍵認証方式で接続したいと思います。

(やりだすと止まらない)
rails 開発日記2 ユーザー登録（devise）・deviseでのフラッシュメッセージ

# ユーザー登録機能の実装

＊この記事は技術や知識の共有目的ではなく、完全に自己満足のアウトプット用です。

＜開発環境＞
1. ruby 2.6.3
2. Rails 5.1.6
3. AWS Cloud9
4. GitHub
5. Heroku（予定）

今回はユーザー登録機能を実装するにあたり、deviseを使用してみました。

### デバイスの実装

参考にしたページはこちらです。
https://kitsune.blog/rails-devise

基本的にはこちらのホームページ通りに進めましたが、フラッシュメッセージの実装に少し戸惑ったので詳しく記載していきます。

application.html.erb

```
<body>
    <%= render 'layouts/header' %>
      <% flash.each do |key, value| %>
      <%= content_tag(:div, value, class: "#{key}") %>
      <% end %>
        <div class=" container text-center ">
            <%= yield %>
        </div>
  </body>
```

これでヘッダーの下にエラーメッセージが出るはずでしたが、headerとcontainerクラスのメイン部分が重なってしまい表示されていません。。。

<img width="1440" alt="スクリーンショット 2020-04-17 1.29.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618929/1d8c6464-c01b-033b-9429-b4402ba8b0da.png">

これはheaderにfixed-topというクラスを与えていることでheaderは上側に固定されていますが、その下にbody部分も重なってしまっていることから起こってしまったらしいです。

その為、bodyに以下のcssを加えてあげます。

```
body { 
  padding-top: 50px; 
}
```
これで

<img width="1440" alt="スクリーンショット 2020-04-17 1.05.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618929/a6101e05-757f-f74c-8720-890190690afa.png">

フラッシュが表示されるようになりました。

deviseのおかげでユーザー登録機能は簡単に実装することができたので次は投稿機能に移りたいと思います。
Window10の範囲指定スクショはWin+Shift+S

##　初めに：スクショは範囲切り抜きでしょ？
スクショにはいつもサードパーティを使っていました．

ウィンドウ一つとかデスクトップ全体のショットって使います？
アプリの紹介にはいいかもしれないけど，もう少し詳しいインストラクションには部分ショットを多用しますよね．

いままで愛用していたのは，[［SnapCrab］(フェンリル)](https://www.fenrir-inc.com/jp/snapcrab/)というスクショツール．なかなかいいです．おすすめ．

でもこれ，いま使っているデュアルディスプレイの環境で，ツールバーがどこかに消えてしまう現象が(最新版ならいいのかも)．

困って調べた．

## **なんだ．Windowsも使えそうじゃん**．

### なにはなくとも，**Win + Shift + s**

これ，↓の記事がわかりやすい．
[Windows 10パソコンのスクリーンショットを撮る6つの方法 \| できるネット](https://dekiru.net/article/13701/)

で，やってみた．Win+Shift+s．

画面全体が暗くなって，範囲指定が始まる．

そして，範囲指定が終わると，**終了**．

…………

…………

…………

何事も起きない．

そうか．**バッファにコピーされた**のかと理解力．

ということは……

どこか画像を貼り付けられるアプリかWebサイトを開いて，
Ctrl+V
やると，絵が貼り付けられる．

例えば．このQiitaの記事作成画面だと，貼り付けたらQiita側でつけたファイル名のmarkdown記述が貼り付く．(下の画像参照)
もちろんプレビューには画像が表示される．

**おお．**

まあ，**貼り付ける対象が決まっているときはそれでいいよ．**

でもさ．

バッファにあるだけって不安じゃありませんか？

## とりあえず保存したいときはどうする？

上の記事だと，Win+Shift+sで画面切り取りの後，「切り取り＆スケッチ」が起動するように書いてある．

が，一向に起動しない．

つまり，こういうことか．

* 「切り取り＆スケッチ」を起動してから，W-S-sをやれば，すぐにアプリに貼り付けられる
* 起動しなくても範囲切り取りはできるけど，バッファに入るだけ
  -  → どこかに貼り付けなきゃならん
  
これはちょっくら面倒だぞ．

で，もう少し調べたら，こんな記事が．↓

[【切り取り＆スケッチ】でスクリーンショットが進化（Snipping Toolの後継アプリ） \| Windows10 \| 初心者のためのOffice講座](https://hamachan.info/win10-win-sketch/#st-toc-h-3)

ここには
**「通知領域からお知らせがあるから，編集したい人はそれを押せ」**
とある．

**これだよこれ．**

通知がうざいのでほとんど切っていたからわからなんかった．
しかし「通知を押せ」ってどういう発想してるんかな．
変態的な発想力を感じる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441159/6d9adebe-c7e8-2461-f9d7-55b6391f7787.png)

### ◆これで満足．

* 貼り付けたい先が決まっているときには「切り取りスケッチ」アプリは起動しなくていい → 通知を押さない
* 矢印とかちょっと書き込みしたい  → 通知を押して「切りスケ」起動

この切り替えができるねのは嬉しい．

###  → これでオンライン教材作成が捗る！

と信じたい！
[Swift] ログをファイルに保存する

# ファイルに保存する
位置情報のログを取る場合など、ログをファイルに保存したい


こんな感じでファイルに文字列を保存する`Log`クラス
（例：位置情報ログをCSVで保存する）

```swift
// 1
Log.write("timestamp,latitude,longitude,altitude\n")

// 2
Log.write("""
        \(formatDate(date: location.timestamp)),\
        \(location.coordinate.latitude),\
        \(location.coordinate.longitude),\
        \(location.altitude)\n
        """)
```



```swift:Log.swift

import Foundation

class Log {
    private static let file = "log.csv"

    static func write(_ log: String) {
        writeToFile(file: file, text: log)
    }

    private static func writeToFile(file: String, text: String) {
        guard let documentPath = 
            FileManager.default.urls(for: .documentDirectory,
                                     in: .userDomainMask).first else { return }

        let path = documentPath.appendingPathComponent(file)
        _ = appendText(fileURL: path, text: text)
    }

    private static func appendText(fileURL: URL, text: String) -> Bool {
        guard let stream = OutputStream(url: fileURL, append: true) else { return false }
        stream.open()

        defer { stream.close() }

        guard let data = text.data(using: .utf8) else { return false }

        let result = data.withUnsafeBytes {
            stream.write($0, maxLength: data.count)
        }

        return (result > 0)
    }
}
```


# ファイルを抜き出す
`Info.plist`で
`Application supports iTunes file sharing`を追加し、値を`YES`にする
<img width="873" alt="Screen Shot 2020-04-17 at 1.20.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99815/63e44a65-fb29-068f-aa7c-09a4d2bd824b.png">

MacとiPhoneを接続すると、Finder(or iTunes)にて、ファイルを抜き出すことができる
TouchDesigner を勉強しはじめて8時間でかっこいい Voronoi エフェクトを作る

実際に私が初めて TouchDesigner を触ってから8時間で作った Voronoi のエフェクトです。
![voronoi.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/7a8a6ea6-d18c-0285-d433-8e013c1423cd.gif)
ここでお伝えしなければいけないのは、YouTube の写経だと言うことです、すいません・・・。ただ何事も守破離だと思っているので、写経でもかっこいいと思えるエフェクトを作ることで次に繋がっています。よろしければご参照ください。

# 初めての人は何をやるべきか
とにかく [映像音響処理概説 2019](http://satoruhiga.com/TDWS2019/) がオススメです！

* 学生向けになっているのですが、とても丁寧んで入りやすい気がしました。
* 5章までやったところで、YouTube に移行しました。
    * この辺は何をやりたいかによるかなと思います。私はエフェクトを作りたかったので、Nodeの使い方が少しわかればいいだろうと思って、5章までにしました。
* [TouchDesignerを勉強する時に参考になるサイトまとめ](https://qiita.com/ToyoshiMorioka/items/763f425bc3381209a29f) で紹介されていました。
    * 助かりました、ありがとうございました。

# 上の講義がある程度終わったら
この [YouTube動画](https://www.youtube.com/watch?v=54amDdU0eus&feature=youtu.be) を見ながら一つずつ組み立てていきました。

* 上の講義全然やらずに見ると何をやっているのかチンプンカンプンだと思います。
    * 5章までやってあれば理解できるレベルだと思います。
* 動画は英語ですが、私は見て判断した（英語を聞いていない）ので、英語できなくても大丈夫です。
    * 英語ができたら8時間をもっと短縮できると思います。
[Rails]コマンドで作る★3分BBS

Railsの復習がてらBBS作成の備忘録です。
今回初めてmysqlではなくscaffoldを使用するので
機能拡充しましたら随時更新予定です。

## 作成

```ruby:ターミナル
$ rails new bbs
$ cd bbs
```
## BBS作成

```ruby:ターミナル
$ rails g scaffold テーブル名(例：articles) カラム名(例:content):string　#カラムの型（今回はtext入れるのでstring）
$ rails db migrate
```
## index作成と表示〜BBSのlinkを貼るところまで

```ruby:ターミナル
#コントローラーを作成
$ rails g controller ディレクトリ名（例:home） index
```

```ruby:config/routes
Rails.application.routes.draw do
  get 'home/index'
  resources :articles
  root "home#index" #追記した箇所
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```

```ruby:views/home/index.heml.erb
<h1>Welcome BBS</h1>
<p><%= Date.today %></p>  #今日の日付rubyの表示の仕方なので<%%>で囲ってます
<p>♪( ´▽｀)</p>
<%= link_to "Show list",articles_path %> #パスは$rake routesで調べられます
```
備考：erbは埋め込むという意味らしい。

## 表示してみる

```ruby:ターミナル
$ rails s
```
Webでlocal hostに接続してみてください
表示されるかと思います。

## 一旦ここまでで完成★
![bbs-compressor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540209/8a75a59c-dd88-db2d-1225-99a2f1987d4f.gif)

## 参考ページ
[Paizaラーニング](https://paiza.jp/works)
[rails sとrails server -b 0.0.0.0の違い](https://teratail.com/questions/211450?sip=n0070000_019&uid=145404)
[動画を圧縮して軽くするサイト](https://compressor.io/compress)

## 終わりに
今まで見ていたテキストと別のテキストを見て復習をしています。
local hostの作成方法やアプリの新規作成の方法などが若干違っているので
テキスト進めつつ、更新も行なっていけたらなと思います。
cssつけてないので味気ないですが、実装自体は一瞬で終わります。笑

初学者のため不備のご指摘やアドバイスをいただけ得れば幸いです。
最後まで読んでいただきありがとうございます。
PHPの処理速度の計測方法

#はじめに
PHPで書かれたコードの処理速度を計測したい。
調べると[microtime](https://www.php.net/manual/ja/function.microtime.php)を使った方法が出てきたが、[マニュアル](https://www.php.net/)に

>パフォーマンスの計測には、hrtime() を使うことをお勧めします。

と書いてあったので[hrtime](https://www.php.net/manual/ja/function.hrtime.php)を使って実施します。

#コードの実施例

```php
<?php
$start = hrtime(true); // 計測開始時間

// 計測したい処理

$end = hrtime(true); // 計測終了時間

// 終了時間から開始時間を引くと処理時間になる
echo '処理時間:'.($end - $start).'ナノ秒'; 
?>
```

#hrtimeについて
hrtimeはPHP7.3から新しく追加された関数です。
##説明
任意のタイミングから計測したシステムの高精度な時刻を取得します。
取得時刻の単位はナノ秒です。
##使い方
```php
<?php
var_dump(hrtime(true)); // 数値になる
var_dump(hrtime()); // [秒, ナノ秒]

// int(84687800869800)
// array(2) {
//    [0]=>
//    int(84687)
//    [1]=>
//    int(800855000)
// }
?>
```
##その他
プラットフォームによって時刻の取得方法が異なります。

+ Windows&nbsp;→&nbsp;QueryPerformanceCounter
+ Linux等&emsp;→&nbsp;clock_gettime
+ iOS&emsp;&emsp;&nbsp;&nbsp;&nbsp;→&nbsp;mach_absolute_time
+ HP-UX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;gethrtime
+ AIX&emsp;&emsp;&nbsp;&nbsp; →&nbsp;read_wall_time

#参考・引用
[php マニュアル](https://www.php.net/manual/ja/function.hrtime.php)
[PHPでナノ秒を計る](https://qiita.com/rana_kualu/items/b09ce2c20b2d8b70d916)
ant designのFormを使ってみた

Ant Designを使ってみて、Formコンポーネントで一瞬つまったのでめも

# 概要

- [AntDesign](ant.design)は、Reactのプロジェクトでデザインを楽にしてくれるやつ
- Formの基本的な使い方
- つまったところ & 解決法

# Formの使い方

`<Form>`の中に`<Form.Item`>をネストして、`<Form.Item>`の中にInputとかSelectとかを入れていく

**最低限のFormの例**

```jsx
// 省略
import { Form, Input, Button } from 'antd';

const FormComponent = () => {
  // フォーム送信の処理
  const onFinish = values => console.log(values)

  return (
    // 表示されるフォーム
    <Form onFinish={onFinish}>
      <Form.Item name="user" label="ユーザ名">
        <Input />
      </Form.Item>
      <Form.Item name="password" label="パスワード">
        <Input.Password />
      </Form.Item>
      <Form.Item name="password" label="パスワード">
        <Button htmlType="submit">
          送信
        </Button>
      </Form.Item>
    </Form>
  )
}

export default FormComponent
```

# つまったとこ

`onFinish`を実行すると、consoleに`{}`が表示された i.e. `values`が空だった

**→解決法: `Form.Item`に`name`を設定する**


最後の`htmlType="submit`を持つ`<Button>`を押すと、`onFinish`が実行されるのですが、最初にFormを書いてたときに、Form.Itemの`name`を書いてませんでした
これが原因で、`onFinish`の引数`values`に値が渡ってませんでした

nameを入れたら、onFinishの結果が

```
{ name: value }
```

にちゃんとなりました
エラー "org.codehaus.groovy.reflection.ReflectionCache"

error
```FAILURE: Build failed with an exception. * What went wrong: Could not initialize class org.codehaus.groovy.reflection.ReflectionCache * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org```

solution
```go to the gradle-wrapper.properties located under android>>gradle/wrapper
and change the gradle version to 6.3 (in my case it was 5.5)

It was like this: 
distributionUrl=https://services.gradle.org/distributions/gradle-5.5-all.zip

Changed to this:
distributionUrl=https://services.gradle.org/distributions/gradle-6.3-all.zip

Compile and it should work.```

source: 
https://github.com/gradle/gradle/issues/10248
【UE4】Unityと比べて思ったこと

Unityをそれなりに触ってきたやつが
UE4独学で学習したり仕事で使用したりで約１ヶ月
率直に思ったことを書いてみます
なので薄っぺらいことばかり書きます
※気づき次第更新するので多分項目増えていきます

先に言っておくと
UE4はC++とBlueprint（以下BP）どっち使うかでかなり変わってきます

# とりあえず思ったこと
### 言語
Unity：C#
UE4：C++(UnrealC++)/BP

基本的にUnityはC#書ければ大抵のことはできるし情報も多いので大体なんとかなる

C++はエンジニアじゃないとなかなか手が出せない
エンジニアでもC#から久々にC++触ったときはもう絶望しました
しかもUnrealC++と呼ばれてるUE4専用の書き方などもあります

ただ
基本的にBPメインで
処理負荷が気になるところや拡張したい部分のみC++にする感じがいい気がしますね

BPは慣れればUnityよりも作りやすいです（多分）
コード書かないんで

あとC++とBP使い分けれるので
どこでどっち使うかちゃんと決めておかないと後半カオスになりそうです

### ダウンロード/インストール
Unity：長い
UE4：めっちゃ長い

UE4は容量すごい
Wifiでダウンロードする場合は気長に待つ

### 情報
Unity：ググったら沢山
UE4：ググっても全然ない

これが一番つらいかも
UE4もBPであればまだあるんですが
C++についてはもう致命的に少ないです
ちょっと深いクラス調べようもんならUE4のリファレンスしかでてこないですからね
しかも定義だけしか書いてないものとか
使い方が知りたいんだが、ぐぬぬ

### コンパイル
Unity：コード量によるがそこまで遅くはない
UE4（C++）：インクルードしまくるととんでもない時間かかる
UE4（BP）：比較的速い

Unityはコード変更したら基本的に自動でやってくれますよね
UE4は自分でポチる必要があります
動作確認するときたまに忘れます

あとコンパイルエラーわかりづらいです

UE4はBPメインであれば速いです
そういうこともあってBPとC++どっちメインで作るかによって作業時間かなり変わってきます
C++使う場合は不要なインクルードはしないように

### 設定
Unity：項目は色々あるけどまぁ分かる
UE4：項目ありすぎて何度も迷子になる

UE4は全体的に設定項目やウィンドウがめちゃくちゃあります
どこに何があってどこで設定するのか
何度もやらないと覚えられないです
すぐ迷子になってググります

結局慣れなんでしょうけど
それにしても多いしなんか設定ごとのまとまりがイマイチしっくりこなかったりする

### VisualStudio
Unity：C#
UE4：C++

言語の仕様的なものなのでしかたないんですが
C++の場合
インテリセンスがとにかく重い
クラスとかにカーソル合わせても詳細がなかなかでない
参照先になかなか飛んでくれない
コメント書きづらい（C#はXMLコメントが自動補間される）
インクルード（C#だとusing）の不要削除や整理が自動でできない
とかとか…

いかにC#が書きやすかったかと

が
そもそもBPを使用すればVS自体触らないです

正直BPは思ってた以上に機能が充実してます
結局C++書かないとできないこととか多いんでしょって思ってたんですけどね
実際BPだけでもなんとかなります

### 基盤
Unity：マネージャ
UE4：継承

プログラムの設計の話

個人的にゲームに依存しない基盤部分の設計が好きなんですが
Unityでは入力やオブジェクトなど基盤部分はマネージャを作って実装してたのに対し
UE4はゲームに特化したエンジンということもありゲームの基本ルーチンが出来上がってます
入力やオブジェクト専用のクラスが既にあって
それを継承してプロジェクト独自の処理を作っていく感じ

良くも悪くも
自由な設計ができるUnityに比べて
UE4にはある程度固められた設計があります

### 常駐オブジェクト
Unity：DontDestroy
UE4：ない？

Unityでシーン間で引き継ぎたい場合はDontDestroyでいけるんですが
UE4では今のところ見当たらないです
厳密にはActor（GameObject）がシーン間で引き継げない？
もちろんC++のコードは残せるんでマネージャとか描画されないものは問題ないんですが
例えばフェード用オブジェクト（ローディング画面）とかUnityでは常駐させてたんですが
UE4ではどうするんだろうか

### クラッシュ
Unity：実行してあるとき急になんかクラッシュする
UE4：すぐクラッシュする

これはなんだかんだでクラッシュするのはいいことだと思います

Unityの場合はおかしな実装をしてても意外と動く
nullrefとか起きててもそれなりに動いちゃうんですよね
でAndroidとかしかも特定端末だけたまにクラッシュする…みたいな
実装してしばらくしてから問題になるんですが

UE4はnullrefしようもんなら容赦なくエディタごとクラッシュさせます
問題の箇所にすぐ気づけるのでいいですね

ちなみにBPでの実装であれば基本的にクラッシュの心配もなさそうです
（エンジンの不具合がなければ）

# 現時点では
UE4使うんならBPメインがいい
ってことに行きつきました

C++でがっつり実装しない限りはUE4は作りやすいと思います
BPはちょっと慣れが必要ですが記事や本もそこそこ出てきているので

といっても仕事となるとプロジェクトによってはC++は避けられなかったりもするんですが
少なくともBPを最大限利用することで開発が捗るんじゃないかなと思います
DockerFileから、引数つきのエイリアスを通す

## やりたいこと
Dockerコンテナで引数のあるエイリアスを叩けるようにしたい。

## やりかた
.bashrcにfunctionをEchoで記述するコードをDockerFileに書く。
今回の事例では、jupyter labの立ち上げ時に任意のポートを開くコードを使用しました。

## 例
`RUN echo "function jlab() { \n  command jupyter lab --ip=0.0.0.0 --port=\$1 --allow-root \n}" >> ~/.bashrc`

これをDockerFileの１行に書いてみる

'\$1' の部分が引数となる。'\'はエスケープコマンドで、`\n`は改行。
あとはイメージを作って、コンテナ作成＆起動で入れば、
`jlab 任意ポート`でjupyter labサーバーが立ち上がる。


## ひっかかったとこ
`echo -e `...とならないところ。bash＆Docker初心者の俺は、bashだと必要なオプションがいらないという事実に非常に困惑した。
（コンテナ外だと、普通にエラーする）

## 学んだこと
Dockerとシェルを両方理解して、始めて住み心地はよくなる。
あともっと賢そうな方法あったら、教えてほしいれす...。

## 参考ページ
https://hacknote.jp/archives/8043/
https://eng-entrance.com/linux-command-echo#i-7
http://capm-network.com/?tag=%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E9%96%A2%E6%95%B0
GridレイアウトのベースHTML

# GridレイアウトのベースとなるHTML

# 作成した画面
<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/K/KOJI-YAMAMOTO/20200416/20200416235456.png">

# HTML
以下のhtmlを適当な名前で保存する
```html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="utf-8">
    <title>Grid Sample</title>
    <link rel="stylesheet" href="./gridsample.css">
    <script type='text/javascript' src='./gridsample.js' defer></script>
</head>

<body>

    <div class="grid-container">
        <div class="Header">Header</div>
        <div class="Menu">Menu</div>
        <div class="Contents">Contents
            <br>
            <br>autoを指定しているので自動で高さが変わる
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <br>
        </div>
        <div class="Footer">Footer</div>
    </div>
</body>

</html>
```

# CSS
以下のcssをgridsample.cssで保存して上記のHTMLと同じフォルダに保存する
```css
*{
    border: 1px solid #a9a9a9;
}
html{
    border: none;
}
body{
    width: 1200px;
    margin-left: auto;
    margin-right: auto;
}

.grid-container {
  display: grid;
  grid-template-columns: 20% 80%;
  grid-template-rows: 50px auto 50px;
  gap: 1px 1px;
  grid-template-areas: "Header Header" "Menu Contents" "Footer Footer";
}

.Header {
    grid-area: Header;
    background-color: #fff0f5;
}

.Menu {
    grid-area: Menu;
    background-color: #f5f5f5;
}

.Contents {
    grid-area: Contents;
    background-color: #f0f8ff;
}

.Footer {
    grid-area: Footer;
    background-color: #f0fff0;
}
```
Diagrams on Dockerでシステム構成図を書いてみた

「[Diagramsを使ってPythonでシステム構成図を描く | Developers.IO](https://dev.classmethod.jp/articles/diagrams-introduction/)」の記事をみて良さそうだなーと思ったのだけどPython環境がなかったのでDockerで試してみた話。

# Dockerイメージを準備する
[公式ドキュメント](https://diagrams.mingrammer.com/docs/getting-started/installation)に「`pip`で`diagrams`をインストールせよ、`Graphviz`もインストールしておけ」と書かれているのでそれにしたがってDockerfileを作成。

```dockerfile:Dockerfile
FROM python:latest
WORKDIR /app
RUN apt update && \
    apt install -y python3-pygraphviz && \
    pip install diagrams
```

ビルドする。あとで実行しやすいように`diagrams`という名前のDockerイメージにしておく。

```
$ docker build -t diagrams .
```
これで`diagrams:latest`のDockerイメージの作成が完了。

# Diagramsのファイルを準備する
[公式のQuickstart](https://diagrams.mingrammer.com/docs/getting-started/installation#quick-start)のファイルを用意してみる。

```py:diagram.py
from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB

with Diagram("Web Service", show=False):
    ELB("lb") >> EC2("web") >> RDS("userdb")
```
割と直感的に意味がわかるけど、より詳しくは公式ドキュメントを参照。公式ドキュメント英語だけどシンプルで分量も少ないから読みやすい。あと[Examples](https://diagrams.mingrammer.com/docs/getting-started/examples)がわかりやすい。

# Diagramsを実行する
公式ドキュメントによるとローカルにPython環境があれば、`$ python diagram.py`で実行できるとのこと。

今回はDockerコンテナを使うので、`diagram.py`を作成したカレントディレクトリをボリュームマウントして、`python diagram.py`のコマンドを実行すればOKです。

現在カレントディレクトリはこんな感じ。

```
$ ls
Dockerfile      diagram.py
```
コンテナを実行する。

```
$ docker run --rm -v `pwd`:/app diagrams python diagram.py
```
もう一回`ls`すると`png`ファイルが生成されている。

```
$ ls 
Dockerfile      diagram.py      web_service.png
```
`web_service.png`の中身を確認してみる。

```
$ open web_service.png
```
![web_service.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254216/0f39a312-f028-b402-fcb4-dcb7ccd5593d.png)
公式のQuick Start通りの結果になりました！

# まとめ
Dockerを使って簡単にDiagramsを試すことができました。
Examplesをやってみたり自分で作りたいように構成図を作ってみたりしましたが、「コードで管理できる」「シンプルで見やすい」「Node（アイコンみたいなやつ）も豊富」といいこと尽くしです。
一方で痒いところとしては、複雑になってくると「Nodeの配置そこじゃねぇよ！」ってなったりするし、ClusterをまたぐClusterは書けないみたいなので「異なるAZのインスタンスに同じセキュリティグループを適用」みたいなことは表現しにくいなぁという感じでした。

どちらにせよ、試してみる価値ありかと思います〜。

# References
- [Diagramsを使ってPythonでシステム構成図を描く | Developers.IO](https://dev.classmethod.jp/articles/diagrams-introduction/)
- [Diagrams · Diagram as Code](https://diagrams.mingrammer.com/)
gradle --versionでエラー

error

```
gradle --version
gradle: command not found
```

Solution

```
cd <project フォルダ>
./gradlew --version
```


理由：
gradle がグローバルでインストールされていないか、環境変数のPATHがない。
代わりにプロジェクトフォルダ内のgradle wrapper を使える

source:
https://stackoverflow.com/questions/49939789/i-have-android-studio-installed-but-i-am-unable-to-access-gradle-through-comman
【CSS】z-index ではみ出しを防ぐ (重ねる)

制作中アプリにて、
写真をアップし、その場でプレビューする機能を実装中に、
z-indexを久しぶりに使ったので、
備忘録も兼ねて、ざくっとご紹介します。
# 解決したい事
**下記のように、写真が来ると文字が枠外にはみ出てしまいます。**
[![Image from Gyazo](https://i.gyazo.com/0fd4e1d3758f762210227a10ac7b5129.gif)](https://gyazo.com/0fd4e1d3758f762210227a10ac7b5129)

## < 完成形 >
**写真はテキストの上に乗ってもらいます。**
[![Image from Gyazo](https://i.gyazo.com/2929b2415afccb8526e5e11d44fe020a.gif)](https://gyazo.com/2929b2415afccb8526e5e11d44fe020a)

# z-index プロパティ
ボックスの重なる順番(優先順位)を決めれるプロパティ。
値は整数で、大きいものが手前に表示される。
_____________________________________________________


# cssを記述する。


まず、テキストは写真の下に入って欲しいので、
z-indexの値は 0 にします。

```scss:sample.scss
.text {      // ⬅️テキストが入っているクラス
  z-index: 0;   
  font-size: 16px;
}
```
次に、**写真はテキスト上に重ねる**ので
z-indexの値を 1 にします。

```scss:sample.scss
.img {      // ⬅️写真
  z-index: 1;   
  height: 145px;

}
```
**終了です。**

**※**  写真下部にある「削除」の要素は今回の記事とは関係ありません。
ご覧いただきありがとうございました。
____________________________________
Javaの知識まとめ

#ファイル作成・書き込み・読み込み

//ファイル作成
File file = new File("ファイルパス");
file.createNewFile();

//ファイル書き込み
FileWriter fw = new FileWriter(file);
fw.write("書き込み1\r\n");
fw.write("書き込み2\r\n");

//ファイル読み込み
//(上記のファイル書き込みのすぐ後にこれを行ったら1回目のループでc == -1になった)
int c;
FileReader fw = new FIleReader(file);
while( (c = fw.read()) != -1) {
     System.out.println( (char)c);
}

//ファイルクローズ
fw.close();

#サーブレットでのフォワード
RequestDispatcher dis = request.getRequestDispatcher("dispatch.jsp");
dis.forward(request, response);
みんなが急激に使いだしている Microsoft Teams で他社のテナントに招待されてもいい感じにする2つのやり方

# はじめに
Microsoft Teams 皆さんお使いでしょうか。
世界全体がリモートワーカーへシフトする中で爆発的に伸びてるサービスとなっているようです。

[1日に27億分のオンライン会議を記録、爆発成長する「Microsoft Teams」、直近1カ月で3倍に](https://thebridge.jp/2020/04/microsoft-teams-breaks-daily-record-with-2-7-billion-meeting-minutes-tops-mid-march-high-by-200)

利用が広まる中でお客様などの自社以外の Teams 環境でのやりとりが始まっている人も増えているのではないでしょうか。
私はデスクトップは自社の Teams 、ブラウザはお客様の Teams で運用していたのですがもう1社加わるともう大変。
ワンチームは去年の流行語になっています、トリプルチーム、クアッドチームの方もいるでしょう。

そんな Microsoft Teams を利用するリモートワーカー中級者の皆さんの役に立つ記事を書ければと思います。

# 解決方法
## やりたいこと
- プライベートブラウジングや別ユーザーのブラウザ立ち上げ等はしない
- マルチテナントで Teams 環境を横断した操作をしたい

図に起こすとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/a8c73297-01d2-6330-2857-0f54bda806a0.png)


## 方法1. Multi Teams を利用する ※2022年10月現在は利用できない方法です。
実は Microsoft さんからツールが出ていました。

[TechNet MultiTeams x64](https://gallery.technet.microsoft.com/MultiTeams-x64-2fe55877)
[TechNet MultiTeams x86](https://gallery.technet.microsoft.com/MultiTeams-x86-6d934165)

上記リンク先から Zip ファイルをダウンロードして「MultiTeams.exe」を起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/1b6105cb-90d4-4954-e8d8-d289022d6139.png)

するとブラウザビューの Teams が立ち上がります。Multiになりましたね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/103104d8-f3bb-76fc-8069-88b378a5cc87.png)

## 方法2. Microsoft Teams 毎に Edge の Web アプリ生成を行う

Microsoft MVP の Tom Arbuthnot さんが紹介していた記事の内容になります。
こちらを画面付きでご紹介していきます。

[Create Multiple Edge Web Apps for each Microsoft Teams Guest Tenant](https://tomtalks.blog/2020/03/create-multiple-edge-web-apps-for-each-microsoft-teams-guest-tenant/)

### Edge で Webアプリ生成
 Edge から任意の Teams 上にブラウザアクセスし「このサイトをアプリとしてインストール」を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/fd52d507-7b20-35b7-bd21-a266f4949207.png)

任意の名称をつけましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/d17558b4-5161-4ed3-e7b8-79123b8932e2.png)

アプリとしての Teams が出来上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/155b144f-4c27-9e74-b5af-9e5d2d10466d.png)

### テナントごとにプロファイルを追加し繰り返す

Edge 上で新規のプロファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/68faaa64-0b68-3440-ea78-c7243b5600cf.png)

任意のプロファイル名を設定しましょう。
![2020-04-16_23h50_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/2045f71d-69b1-20f2-d4b2-f132e68e1caa.png)

そしてブラウザ上から先程とは異なるテナントの Teams にアクセスし、先程の手順を繰り返します。

するとこの通り別々の Teams へのアクセスが可能になります！やったね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/c5edca12-3d25-00c6-b86c-a1e6494a1837.png)

この方法はプロファイルを作成する毎に対応できるので無数のチームに対応可能です。

# まとめ
小ネタでしたが常時複数テナントに参加するハイパーリモートワーカーや、チームとディスカッションしながらディスプレイ共有でお客様の Teams の情報を一緒に見るなんてシナリオには使えるネタではないでしょうか。

Edge のアプリケーション生成機能は便利なので他の場面でもお使い頂ければ幸いです。
この投稿が誰かのお役に立てれば嬉しいです。それでは。
【Rails】【エラー】undefined method `to_key' for ×××

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/c133b2a8-1d0e-5bc5-173b-8f26fc3d3c94.png)
railsにて上記エラーが発生しました。

#解決法

```posts_controller.rb
  def index 
    @posts = Post.all
  end
```

```erb:index.html.erb
  <%= form_for @posts ,html: { class: "form-group" } do |form| %>
```
`@posts = Post.all`で定義しているインスタンス変数に対して`form_for`を使っていたため、`form_for`を使用しない構成にしました。

#原因

```
■　ActiveRecord::Relationを返すメソッド
all
scope (実装でnilを返すとallと同様になる)
select (使い方次第)
group
order
reorder
unscope
from
：
（省略）
：

■　配列やオブジェクトを返すメソッド
select (使い方次第)
find
find_by
take
first
last
second
third
fourth
fifth
：
（省略）
：
```
メソッドには`ActiveRecord::Relationを返す`ものと`配列やオブジェクトを返すメソッド`と種類があり、`form_for`の対象であるモデルを`all`である`ActiveRecord::Relationを返すメソッド`を使用していたためにエラーが発生したものと思われます。
平成エイリアスと令和エイリアス

# はじめに
dotfilesのbashrcに長らく鎮座している`heisei`エイリアスと`reiwa`エイリアスを紹介します。
シェルに流し込んでそのまま使えます。

# コード

```shell
alias heisei="echo '平成'`date -d '1988 year ago' +'%y'`'年'"
alias reiwa="echo '令和'`date -d '2018 year ago' +'%y'`'年'"
```

# 出力

```
$ heisei
平成32年
$ reiwa
令和02年
```

おわり。

# ソース
[https://github.com/taro-hida/dotfiles/blob/56c42d6e1b2681f9d26b6d079f560dd5251a99b1/bashrc#L33](https://github.com/taro-hida/dotfiles/blob/56c42d6e1b2681f9d26b6d079f560dd5251a99b1/bashrc#L33)