OmniAICreator/Qiita-1.07M huggingface dataset:
OpenShift 4.4を構築してアプリを動かしてみる - ハードウェア準備編 -

## きっかけ
Openshiftの本を入手したのですが、手元にOpenshiftを簡単に動かせる環境がなく
手元にいつでも遊べる環境が欲しかったのでベアメタルの環境を準備してみました。
https://www.amazon.co.jp/dp/4863543182

## 実際のベアメタルサーバ
ベアメタルと聞くと、ブレードサーバ的なものを想像していたのですが、実際に稼働しているサーバはこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/318cc738-525d-e14e-3a20-cf1c966ce78e.png)

中身はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/2074a868-f147-061f-b4e6-b3e82cdcbef9.png)
-> 容量が足りないので、追加で2.5inchのHDDを追加しました。

## スペック
- メーカー名 Intel
- 型番	BOXNUC8i7BEH1
- CPU	Intel Core i7-8559U 2.70GHz
- メモリ	32 GB(16GB2枚)
- ストレージ	1000GB (SSD)
- ストレージ	1000GB (HDD)
- グラフィック	Intel Iris Plus Graphics 655

## 注意点

### マシン
OpenShiftの環境構築のためにOSはVMWare ESXiを導入するのですが、
VMWare EXSiの導入実績のある筐体が良さそうです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">NUCでメモリー64GB認識して起動した :) <a href="https://t.co/YEnuHtXYJA">pic.twitter.com/YEnuHtXYJA</a></p>&mdash; 日常系インフラ自動化もふもふおじさん@Ansible x VMware (@sky_jokerxx) <a href="https://twitter.com/sky_jokerxx/status/1149589461451202560?ref_src=twsrc%5Etfw">July 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


ほかにも、NUCのIntel 第5世代や、第7世代で構築されている方もいらっしゃるようでしたが
NUC系は型番がいろいろあるので、これから購入される方は型番でESXiの稼働実績があるかググった方がよさそうです。
特に、インターネット接続をするネットワークインターフェイスについては、マザーボードに依存する場合が多いのでESXiの動作実績があるか注意してください。
昔から、蟹のマークのRealTek製のネットワークを利用されている方が多い印象ですが、VMwareでは動かないとかよくありがちです。。。。

### CPU
今回i7のCPUを使用しております。
i5やi3の方が価格的には安いのですが、4VCPUを6台同時稼働が必要になるため、背に腹は代えられませんでした。（泣

### メモリ
メモリーは32GBで使用率は90%ぐらい、ぎりぎり収まっている感じです。
64GBぐらいあると良さそうです。

### ストレージ

OpenShift構築には、120GBのマシーンを6台立てることになります。
そのためストレージは1000GBが必要となります。
配列をx個に分割し、配列ごとの累計を新しい配列に格納する

配列に1時間毎のデータが1年分格納されています。
この配列を日別のデータに変換し、新しい配列に格納する方法について書きます。
## やること
1. 配列をx個ごとに分割する
2. 分割した配列内の累計をy回出す
3. 新しい配列に累計を入れる

今回の場合、x=24,y=365

## 引用
#### 配列をn個ごとに分割する関数

```js
const sliceByNumber = (array, number) => {
    const length = Math.ceil(array.length / number)
    return new Array(length).fill().map((_, i) =>
      array.slice(i * number, (i + 1) * number)
    )
}
```

- [引用元リンクはこちら](https://qiita.com/chihiro/items/1047e40514a778c08baa)

#### 累計を出す

```js
var result = array.reduce(function (accumulator, currentValue, currentIndex, array) {
        return accumulator + currentValue;
});
```

- [引用元リンクはこちら](http://yucatio.hatenablog.com/entry/2019/12/10/222311)

## コード
```js
var array1 = [1, 2, 3, 1, 2, 3, ...];//省略

const sliceByNumber = function(array, number){
    const length = Math.ceil(array.length / number)//Math.ceilで引数以上の最小の整数を返す
    return new Array(length).fill().map(function(_, i){ 
            return array.slice(i * number, (i + 1) * number);
        }//_はcurrentValueが空の意。iは配列のインデックス/添字
    )//fillがインデックス付き配列を返す。mapは与えられた関数を配列のすべての要素に対して呼び出し、返された値を追加
}

array2 = sliceByNumber(array1, 24);//配列の分割。array2.lengthは365

newArray = new Array();//新しい配列を作成

for(var i = 0; i < array2.length; i++){
    var result = array2[i].reduce(function (accumulator, currentValue, currentIndex, array) {
        return accumulator + currentValue;
    });
    newArray[i] = result;//累計を新しい配列に格納。それを365回繰り返す
}
```
引用元の著者に感謝です。
ありがとうございました。
DLしたLaravelの環境構築方法（Linux）

　【前提条件】composerがインストール済み Lamp環境が正常に構築できている。

　　　　githubからDLしたLaravelプロジェクトをとりあえず動かせる
　　　　用にするまでの設定します。　
    
##1、laravelプロジェクトをDLしてみる
ギットハブにアクセスしてとりあえず適当なLaravelのプロジェクトをDLしてみましょう【プロジェクト名testlaravel】
![laravel1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1020834/f7b41174-9614-438a-0d57-ab357f99a777.png)

##２、composerをインストールする
DLしたtestlaravelプロジェクトのserveを起動しようとするとこのようなエラーが出てきます。

```
/var/www/html/testlaravel$ php artisan serve
こんなエラーが出てきます↓
PHP Warning:  require(/var/www/html/testlaravel/vendor/autoload.php): failed to open stream: No such file or directory in /var/www/html/testlaravel/artisan on line 18

Warning: require(/var/www/html/testlaravel/vendor/autoload.php): failed to open stream: No such file or directory in /var/www/html/testlaravel/artisan on line 18
PHP Fatal error:  require(): Failed opening required '/var/www/html/testlaravel/vendor/autoload.php' (include_path='.:/usr/share/php') in /var/www/html/testlaravel/artisan on line 18

Fatal error: require(): Failed opening required '/var/www/html/testlaravel/vendor/autoload.php' (include_path='.:/usr/share/php') in /var/www/html/testlaravel/artisan on line 18

```
Composerが入っていないためLaravelプロジェクトが起動できないのでcomposerをインストールします

```
/var/www/html/testlaravel# composer install
```
##３、composerのインストールが完了したら
composerのインストールが完了したら早速testlaravelプロジェクトを立ち上げてみましょう

```
 /var/www/html/testlaravel# php artisan serve
```
  立ち上がることは立ち上がりますが、ここで必ず500サーバーエラーが発生します。
![500serve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1020834/909d80eb-d6db-e337-5a83-18baf64e3619.png)

##4、.envファイルとAPP_KEYの設定を行う
ここでエラーが発生する要因としてlaravelに.envファイルが作成されていない
APP_keyが作成されていない事が要因でサーバーエラーが発生しています。

まずは.envファイルを作成してみます。コマンドで以下の用に入力します

```
cp .env.example .env
```
この段階ではまだenvファイルは作成されてませんのでAPP_KEYの作成をしてみます

```
php artisan key:generate
```
vi　.envと入力して無事.envファイルが作成されていれば完成です
↓こんな奴です

```
APP_NAME=
APP_ENV=
APP_KEY=
APP_DEBUG=
APP_URL=

LOG_CHANNEL=

DB_CONNECTION=
DB_HOST=
DB_PORT=
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=
（以下略）
```
改めてtestalaravelプロジェクトを立ち上げてみていつものあのページが出てきたら成功です。
![thelaravel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1020834/2cfe59cd-8311-356e-5deb-ab7e29da0607.png)
【ReactNative】スプラッシュ画像の設定(自分メモ)

**react-native-splash-screen**を使う
[参考](https://dev-yakuza.posstree.com/react-native/react-native-splash-screen/)

## 導入
```
yarn add react-native-splash-screen
cd ios
pod install
or
npx pod-install ios
```

## ios
スプラッシュ画面のファイルは
ios/[プロジェクト名]/LaunchScreen.storyboard
**subviews、constraintsの削除**をしておく


ios/[ProjectName]/AppDelegate.m

```
...
#import "RNSplashScreen.h" // add

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    [RNSplashScreen show]; // add
    return YES;
}

@end
```


## Android
./android/app/src/main/java/com/apng/MainApplication.java:
プロジェクト名/android/app/src/main/java/com/プロジェクト名/MainActivity.java　を以下の様に修正

```javascript
import android.os.Bundle; //追加
import com.facebook.react.ReactActivity;
import org.devio.rn.splashscreen.SplashScreen; //追加


public class MainActivity extends ReactActivity {

  /**
   * Returns the name of the main component registered from JavaScript. This is used to schedule
   * rendering of the component.
   */
  @Override
  protected void onCreate(Bundle savedInstanceState) { //追加
    SplashScreen.show(this); //追加
    super.onCreate(savedInstanceState); //追加
  } //追加
```

色設定用

```
cd プロジェクト/
touch ./android/app/src/main/res/values/colors.xml
cd ./android/app/src/main/res/
mkdir layout drawable-xhdpi drawable-xxhdpi drawable-xxxhdpi
```

colors.xmlが出来たので以下の設定

```
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="splashscreen_bg">#283c55</color>
    <color name="app_bg">#283c55</color>
</resources>
```

launch_screen.xml

```
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/launch_screen">
</LinearLayout>
```

drawableはそれぞれのディレクトリにlaunch_screen.pngを入れる。

種別	解像度(w*h)
ldpi	200 x 320
mdpi	360 x 640
hdpi	480 x 800
xhdpi	720 x 1280
xxhdpi	1080 x 1920
xxxhdpi	1440 x 2560
docker-composeで指定するcommandはDockerfileよりも優先される

# 優先度

docker-composeでは
`build`において`dockerfile`を指定することで、Dockerfileからイメージを生成してコンテナを作成できます。

このとき、このDockerfileでデフォルトで実行されるCMDがあります。

```Dockerfile:Dockerfile
CMD ["uvicorn", "code.main:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]
```

このDockerfileがある状態で、docker-compose.ymlの`command`に別のコマンドを書き込んでみます。

```yaml:docker-compose.yml
version: "3.0"

services:
  fastapi:
    image: "image"
    container_name: "container"
    # ビルド
    build:
      dockerfile: ./docker/fastapi/Dockerfile
      context: .
    restart: always
    tty: true
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    command: /bin/bash -c "sleep 10 && uvicorn code.main:app --reload --reload-dir code --host 0.0.0.0 --port 8000"

```


このとき、docker-compose.ymlのcommandが優先して実行されます。
そのため、10秒スリープしてからuvicornが実行されます。

Dockerfileはすでにあって、ymlで簡単に動作を変更できることを考えると、自然な動作かなと思いました。
MacOS の Ansible で 開発用WebサーバのDocker コンテナを作成する

### 概要
  * ansible を使って開発環境用の docker コンテナを作成しようとしたが、ansible-bender を使う方法は、podman と buildah が必要らしく(参考：[Ansibleを使ってdockerコンテナを立ち上げる](https://note.com/tar28/n/n2479ab960187))、MacOS 用の buildah が配布されていないようなので、別の方法を調べてみた。
  * ansible の community.docker に含まれるモジュールは、ansible が結局、ssh 接続を前提としているので、パッケージのインストールなど、やりたいことができない。(image や container を外側から触ることはできるが、中身の操作は不可)
  * よって、ansible 側から docker のイメージやコンテナを操作するのではなく、Dockefile で docker イメージを構築する際に、イメージ内に ansible をインストールし、そのイメージ内で ansible をローカル実行して、自分自身に必要なパッケージのインストールや設定を行うようにする。(ansible のエージェントレスという利点は失われてしまうことになるが)

### 環境
* macOS Catalina (10.15.1)
* Docker version 20.10.0, build 7287ab3
* ansible 2.10.3

### やったこと
  * ansible の実行に必要なディレクトリやファイル、rpm パッケージを全て docker コンテナ側へコピーする。コンテナ内で ansible をローカル実行させるため。
  * python, pip のインストール。
  * ansible-galaxy から必要なロールのインストール。(community.general, community.crypto)
  * いくつかのサービス(chrony, http, mackerel, sshd)起動の設定を外す。docker には１コンテナ１サービスの概念があり、コンテナ内のサービスを制御するのではなく、コンテナ自体の起動、停止によるコントロールが前提となっており、サービスの起動・停止などのコントロールはできないため。
  * Dockerfile 内で必要なポートを開け(EXPOSE 80 443)、docker run でコンテナ起動時に、それを指定する。

* Dockerfile

    ~~~
    FROM centos:centos8

    RUN dnf clean all && rm -r /var/cache/dnf  && dnf upgrade -y && dnf update -y

    RUN dnf install -y sudo

    RUN dnf install -y python3-pip
    RUN pip3 install ansible
    RUN ansible-galaxy collection install community.crypto
    RUN ansible-galaxy collection install community.general

    ## ansible の実行に必要な設定ファイルをディレクトリごとコピーし、
    ## それらを全て dev.yml ファイルから読み込む
    COPY ./ ./.
    RUN ansible-playbook dev.yml

    EXPOSE 80 443

    CMD ["/bin/bash"]
    ~~~

* イメージ作成とコンテナ起動時の実行例

    ~~~
    ## イメージの構築
    $ cd (Dockerfile のあるディレクトリ)
    $ docker build -t web/dev:1.0 .
    
    ## コンテナ起動
    $ docker run -itd -p 80:80 -p 443:443 --name test web/dev:1.0
    ~~~

### 参考
* [Ansible+DockerfileによるDockerイメージの作成](http://ks888.hatenablog.com/entry/2015/02/14/123444)
* [Ansibleを使ってDockerコンテナを立ち上げる(モジュール編)](https://note.com/tar28/n/n9910b3bc48c5)

以上。
ぼくのかんがえた技術文書のかきかた

# はじめに
ぼくは、新卒2年目の自称エンジニアです。でも最近なんだかモチベが低下中です。
論文/仕様書/プレゼンなどの技術文書の内容を他者に見せた時、「ここはどういう意味？」、「ここは分かりにくいから書き直して」。そう返されて修正する日々です。最終的に他者に修正してもらうこともあって、がっかり。

## 目的
誰でもすぐに理解できる技術文書を書きたい！！
そのために必要なことをまとめて、成長の糧にしたい。

## 想定する読者
誰でも

## ぼくの技術文書のよくないところ
* 書いているうちに目的とずれてくる。
思い付きで書き始めてしまうため、自分の言いたい(技術的な)ことに焦点が合ってしまって本来の目的を忘れる。
* 読者の理解に頼ってしまい、説明不足になる。
『AはBだからCである。』という文章のとき、Aが本当にそうであるか分からない。Bという理由の根拠が甘い。Cであるかどうかはっきりしない。
* ストーリーが一貫していない。
なぜそう言えるか？理由をあちこちに書いている。
* あいまい。
自身のなさの表れ。
* 文章が長くなり、複雑になる。
分かりやすくしようするあまり書きすぎてわかりにくくなる。
* 事実と意見が混ざっている。
『～は...である。』←それは言い過ぎ。ということがある。
* 用語の説明が甘い。


## ぼくのマインドのよくないところ
* 読者のことを意識していない。自分の理解レベルと同じだと思っている。
* 全てを書けばよいと思っている。(書けてないが)
* 修正前提で提出している。


## 具体的な修正方法
* はじめに目次を書いて全体像をつかむ。
* 仮想の読者を設定する。デフォルトは小5
* あいまいな表現を検索して変換する。
『と見てもよ い』『であろう』
『と思われる』『と考えられる』
『ほぼ』 『約』『ほど』『ぐらい』
『たぶん』『ような』『らしい』
『こと』『もの』
* 根拠/理由を書く。
* 1文は2行までに短くする。
* 以上のことをチェックリストにチェックする。


### 果たしてぼくは成長できるのか
【003_モーペルテュイ】コマ大数学科

ビリヤードでAの玉を3クッションでBに最短で入れるためにはどうすればよいか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017176/acc20aa7-cfb4-c7ea-5b9c-7f13e34d85b6.png)

```tex

\begin{tikzpicture}
  % ==階段，放物線，
  % 線を引く
  \fill [color=yellow!50!white,rounded corners=5pt] (-0.5,-0.5) rectangle (6.5,3.5);
  \draw [very thick] (-0.5,-0.5) rectangle (6.5,3.5);
  \fill [color=green!70!white,very thick](0,0) rectangle (6,3);
  \fill [color=red!70!white] (1.5,2) circle (0.25cm) node (2,1)[font=\small,black]{A};
  \fill [red!20!black] ([shift={($(6,3)-(0.2,0.2)$)}]-45:0.3cm) arc [start angle=-45, end angle=135, radius=0.3cm];
  \fill [red!20!black] ([shift={($(0,3)+(0.2,-0.2)$)}]45:0.3cm) arc [start angle=45, end angle=225, radius=0.3cm];
  \fill [red!20!black] ([shift={($(0,0)+(0.2,0.2)$)}]135:0.3cm) arc [start angle=135, end angle=315, radius=0.3cm];
  \fill [red!50!yellow] ([shift={($(6,0)-(0.2,-0.2)$)}]-135:0.3cm) arc [start angle=-135, end angle=45, radius=0.3cm];
  \node at (5.9,0.1)[font=\small,black]{B};
\end{tikzpicture}
```
STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版 Optimization Levelを変更して最適化する

STM32CubeIDEで以下のようなエラーが出た人はいないでしょうか？

```
c:\st\stm32cubeide_1.3.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.7-2018-q2-update.win32_1.4.0.202007081208\tools\arm-none-eabi\bin\ld.exe: region `FLASH' overflowed by 944 bytes
collect2.exe: error: ld returned 1 exit status
make: *** [makefile:54: STM32F042-1.elf] Error 1
"make -j4 all" terminated with exit code 2. Build might be incomplete.

11:53:58 Build Failed. 3 errors, 1 warnings. (took 10s.509ms)
```

![Keyboard-1-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/cb7507f8-d953-0800-0215-2e775396c40b.jpeg)
フラッシュにファイルが入らないというエラーになります。
最適化して入るようにしてみましょう。（すべてではありません）

###右クリック⇒Properties
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a04d0455-8603-8327-f8b0-42f65d68fd0e.png)

C/C++ Build⇒Tool Settings⇒MCU GCC Compoler⇒Optimization 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/243eb919-77fa-d6f8-fd58-7089578c81b0.png)

###Optimization levelを変更する

```
arm-none-eabi-objdump -h -S  STM32F042-1.elf  > "STM32F042-1.list"
arm-none-eabi-objcopy  -O binary  STM32F042-1.elf  "STM32F042-1.bin"
arm-none-eabi-size   STM32F042-1.elf 
   text	   data	    bss	    dec	    hex	filename
  17928	    364	   3780	  22072	   5638	STM32F042-1.elf
Finished building: default.size.stdout
 
Finished building: STM32F042-1.bin
 
Finished building: STM32F042-1.list
 

11:58:13 Build Finished. 0 errors, 1 warnings. (took 9s.209ms)
```
以上でコンパイルが通るようになります。
FeliCaのIDmを取得する

#目的
入退室管理をするために、ICカードの読み込みと書き込み、ICカードを作成する。
まずは、現在利用可能なカードを複製し、練習台とする。
今回は、FeliCaカードのIDmを取得する。

#使用機材、環境
Windows10 Pro
コマンドプロンプト
PaSoRi　RC-S380
FeliCaカード

#ICカードの規格の特定
ICカードの規格によって、手法、名称が異なる可能性があるので、特定する。
大きく分類するとFeliCaとMifereがある。

##FeliCa
国内最大級のシェア。
処理速度が高く、カードをかざしてから処理完了まで0.1秒。
交通系のICカード（SuiCa、ICOCA、PASMOなど）に採用。

##Mifere
海外では一般的。
FeliCaに比べ廉価で、約1/3の価格で購入できる。

今回は、FeliCaのIDmを取得する。

#ICカード認証方法
現在、IDmで認証する方法があることがわかった。

##①IDmで認証する。（Mifereの場合、UID)

「IDm」とよばれるメーカーがICカードに書き込んだ固有の製造番号がある。
これで認証する。
IDm＋暗証番号などもある。

(参考)https://qiita.com/mono_taro/items/8bac24c5768da0828f2b


##②それ以外
現状情報を見つけられていないのですが、
IDmは認証の上、追加でエンコードする情報で認証する可能性もあるのではと思っており、、検索中。

#IDmの特定
OpenSCを使用することで、IDmを取得できるらしい。

>OpenSCとは、暗号化機能を備えたスマートカードに重点を置いて、スマートカードを操作するためのソフトウェアツールとライブラリのセットです。 OpenSCは、認証、暗号化、デジタル署名などのセキュリティアプリケーションでのスマートカードの使用を容易にします。

(引用)https://en.wikipedia.org/wiki/OpenSC

##OpenSCのインストール

こちらが参考にOpenSCのインストールをします。
（参考）https://qiita.com/erik_t/items/7d40b02be3bb13f2c3af

##Open SCでの操作
こちらを参考に、IDmを取得するための操作をします。
（参考）https://qiita.com/erik_t/items/a8e36323a44bab92640d

###エラー:Failed to connect to card :Card is invalid or cannot be handled Aborting.

OpenscでICカードが認識されているか確認するため、`opensc-tool.exe -a`でATRを取得します。
>ATR（Answer To Reqset)とは、カードが電気的に活性化した際にカードから送られる初期応答情報です。

その結果、以下の応答が表示されました。
`Failed to connect to card :Card is invalid or cannot be handled Aborting.`


最終的に、公式リファレンスが参考になり、`certutil.exe -scinfo`　`pkcs11-tool.exe" --login --test`を実行後は、`opens-tool -a`で表示される３行目にIDmが表示されました。
（なぜ解決したのかがわかっていません。。よければコメントください。）

（参考）https://github.com/OpenSC/OpenSC/wiki/Windows-Quick-Start


次はこのIDmで認証できるのか、IDmに追加して書き込みをして認証を行う必要があるのか進めていきます。
fuse-box+TypeScriptで公式通りやったらimport使えないって言われた

### 😫概要
fuse-box v4.0.0の[getting-started](https://fuse-box.org/docs/getting-started/setup)をstep1からやっていったらこんなエラーが出る

```
fusebox % ./node_modules/.bin/ts-node fuse.ts
(node:42058) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/Users/fusebox/fuse.ts:1
import { fusebox } from 'fuse-box';
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:979:16)
    at Module._compile (internal/modules/cjs/loader.js:1027:27)
    at Module.m._compile (/Users/fusebox/node_modules/ts-node/src/index.ts:1056:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/fusebox/node_modules/ts-node/src/index.ts:1059:12)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at main (/Users/fusebox/node_modules/ts-node/src/bin.ts:198:14)
    at Object.<anonymous> (/Users/fusebox/node_modules/ts-node/src/bin.ts:288:3)
```

### ✨解決
`tsconfig.json` の `module` を `commonjs` にすれば解決！

```json:tsconfig.json
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "commonjs",
    "outDir": "./dist",
    "strict": true,
    "moduleResolution": "node",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": [
    "./src/**/*.ts"
  ]
}

```

### 👀参考
https://stackoverflow.com/questions/63445821/ts-node-execute-typescript-with-module-import-and-module-defined
RailsアプリをHerokuにデプロイする

個人の忘備録になります。基本操作はすべて、macOSのターミナルで行います。



## １．Heroku CLIをインストール
ターミナルを開き、下記のコマンドを入力します。

```
% brew tap heroku/brew && brew install heroku
```

インストールが終了したら、完了を確認するために下記のコマンドを入力します。
ここでは、heroku/x.y.z出力に表示されるはずです。

```
% heroku --version
heroku/7.0.0 (darwin-x64) node-v8.0.0
```


## ２．ログイン
CLIをインストールした後、heroku loginコマンドを実行します。メールアドレスやパスワードをもとめられるので、入力していきます。

```
% heroku login
=> Enter your Heroku credentials.
# メールアドレスを入力し、エンターキーを押す
  => Email:
# パスワードを入力して、エンターキーを押す
  => Password:
```
<b>Logged in as メールアドレス</b> と出力されるとログイン成功です。


## ３．Heroku上にアプリケーションを作成

```
%　cd デプロイしたいアプリの場所
```

アプリ作成の際にアプリ名は一意でなければいけないので、他の人がすでに使っている名前だとエラーが表示されます。
またアプリ名がドメインの一部となるので、ドメインに使えない文字列は利用できません。
以上２点に気をつけて、以下のコマンドを入力します。

```
% heroku create　アプリケーション名
```

正しく設定できたことを確認する場合は、以下を入力します。

```
% git config --list | grep heroku
```

入力後、 <b>fatal: not in a git directory</b> 以外が表示されていれば成功です。

## ４．MySQLを使用する場合
Herokuでは、使用するデータベースの設定が、デフォルトでPostgreSQLになっています。MySQLを使うためには、ClearDBというデータベースサービスが提供しているアドオンを追加することによって、HerokuでMySQLを使用できるようになります。

下記のコマンドを入力して、ClearDBアドオンを追加します。

```
% heroku addons:add cleardb
```

Ruby on Railsを使う場合は、MySQLに対応するGemについて考慮する必要があり、そちらの設定を変更します。
まず、下記のコマンドを入力してください。

```
% heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
```

これでClearDBデータベースのURLを変数heroku_cleardbに格納できました。
続いて、下記のコマンドを入力します。

```
% heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}
```

## ５．Heroku上にmaster.keyを設置
Heroku上には、環境変数（OSが提供するデータ共有機能の1つで、「どのディレクトリ・ファイルからでも参照できる変数」）としてmaster.keyの値を設置します。
まず、下記のコマンドを入力してください。

```
% heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```

設定が正しくできているか、Herokuの環境変数一覧を表示するには、以下のコマンドを入力します。

```
% heroku config
```

入力後、<b>RAILS_MASTER_KEY：</b>　という項目がある場合、成功です。


## 6.アプリケーションをHerokuへ追加
Herokuへコミットをプッシュすることで、Herokuにアプリケーションの情報が追加できます。以下のコマンドを入力します。

```
% git push heroku master
```

## 7.Heroku上でマイグレーションファイルを実行
データベースにはマイグレーションの情報が反映されていませんので、heroku runを頭につけて、マイグレーションを実行してください。

```
% heroku run rails db:migrate
```

## 8.アプリケーションの情報を確認
これまでの作業で、Herokuに反映したアプリケーションの情報を確認するには、以下のコマンドを入力します。

```
% heroku apps:info
```

## 9.アプリケーションを開く

```
% heroku open
```
問題なく、アプリケーションが開けましたらデプロイ完了です。


## おまけ１：ログのチェック
アプリが適切に機能しないような問題が発生した場合は、ログをチェックします。--tailをつけることでログの最終１０行のみ表示にすることができます。

```
% heroku logs --tail --app アプリケーション名
```

## おまけ２：環境変数が更新されない場合の対処法
#### ファイルの変更履歴が存在する場合
Herokuにプッシュしたときから少しでもファイルに差分が存在する場合は、通常通りコミットして、そのコミットをHerokuにプッシュすれば問題ありません。以下のコードを上から順に実行していきます。

```
% git add .
% git commit -m "後から見てわかりやすいコミット名"
% git push heroku master
```

#### ファイルの変更履歴が存在しない場合
特に変更するファイルもないがHerokuに設定した環境変数だけ本番環境に反映させたい場合は、上記の方法ですと、「Everything up-to-date（すでに最新の状態に更新されています）」と表示されます。したがって、意図的に空のコミットを作成してHerokuにプッシュする方法を行います。以下のコードを上から順に実行していきます。

```
% git commit --allow-empty -m "空のcommit" 
% git push heroku master
```
Windows環境でAuteMuteUsのDocker利用セルフホスティング

#はじめに
AutoMuteUsはAmong usをDiscordのボイスチャットを併用して遊ぶ際に、自動ミュートしてくれるツールです。
最近は勝率とか色々機能が増えてきているようですが、最新機能を利用するにはDockerでセルフホストする必要があります。
Windowsのexeで実行できるものは2.4.3で開発が止まっており、動作も不安定気味です。

Dockerでセルフホストに成功したのでやり方を記録しておきます。

AutoMuteUs
https://github.com/denverquane/automuteus

#環境
Docker Desktop 3.0.4
Docker Compose 1.28.0-rc2
automuteus 6.10.1
galactus 2.4.1

#AutoMuteUsホスティング手順
githubのDocker Composeに記載されている通りですが、以下に手順を示します。

①下記リンクの [3. Discord の bot を作成する] を参考にbotを作成・招待しTokenを取得する。
　[Among Us 用超便利 Discord bot “AutoMuteUs” をセルフホストした (公式推奨簡単版)](https://aquasoftware.net/blog/?p=1415)

②Docker DesktopとDocker Composeをインストールする。

③下記リンクからymlファイルをダウンロード
https://github.com/denverquane/automuteus/blob/master/docker-compose.yml

④下記リンクからsampl.envをダウンロード
https://github.com/denverquane/automuteus/blob/master/sample.env

⑤ダウンロードしたsampl.envを.envに名前変更し、下記の項目を記載する。
　AUTOMUTEUS_TAG：[ここ](https://github.com/denverquane/automuteus/releases)から最新のバージョン番号を記載
　GALACTUS_TAG：[ここ](https://github.com/automuteus/galactus/releases)から最新バージョンの番号を記載
　DISCORD_BOT_TOKEN：①で取得したトークンを記載
　GALACTUS_HOST：automuteusのコンテナがアクセスするgalactusのホストを記載。
　今回はローカルで完結するので`http://localhost`と記載
　GALACTUS_EXTERNAL_PORT：ホストへのアクセス時のポート番号を記載。今回は`80`。変更する場合はGALACTUS_HOSTにもポートを記載する。

⑥作成した`.env`と`docker-compose.yml`を同じフォルダ内に配置し、そこをカレントディレクトリにしてコマンドラインを起動。

⑦コマンド実行 `docker-compose pull`

⑧コマンド実行 `docker-compose up -d`

以上でホスト完了。Docker Desktopで稼働状況を確認し、正常に動作していればOK。

#利用
下記リンクから最新のAmongUsCaptureをダウンロードし、起動して [Setting] - [Discord] - [Discord token] に取得したトークンを入れる。
https://github.com/denverquane/amonguscapture

ゲームを起動し、botを招待したDiscordのチャンネルで`.au new`と入力すればbotからDMがくるので、リンクをクリックしてAmongUsCaptureとリンクすれば利用できる。
その他のコマンドは[公式Githubページ](https://github.com/denverquane/automuteus)を参照。

#補足
環境構築時に発生したトラブルについて
galactusで下記のエラーが発生し、redisに接続できない。
websocket: close 4004: Authentication failed.
No REDIS_USER specified.
No REDIS_PASS specified.

上記エラーが発生するのはDiscordと通信が取れないことが原因らしい。
同じポート番号が他のコンテナで既に使われていないか、
Discordのトークンが合っているかなどを確認するとよい。
【Rails6】Rubocop警告一覧

#はじめに

転職活動用ポートフォリオ作成中です。
今回、CircleCiを導入したことにより、push時にRubocopでコードのスタイルチェックが行われるようになり、そこで指摘されるエラーをまとめていきたいと思いました。

#環境

Ruby on Rails '6.0.0'
Ruby '2.6.5'

#①Layout/ExtraSpacing: Unnecessary spacing detected.

不必要な、スペースが確認されたためです

```ruby:app/models/company.rb
validates_format_of :password, on: :create,  with: PASSWORD_REGEX, message: 'には英字と数字の両方を含めて設定してください'
```

今回は少しわかりにくいですが、「on: :create」と「with: ~」の間に1文字分余計なスペースがあったため、警告が出た模様です。

#②Layout/EmptyLineBetweenDefs: Use empty lines between method definitions.

メソッドの定義文が1つの空の行で区切られているかどうかをチェックしています。

```
def a
end
def b
end
```

「def a」と「def b」の間に空白を開けていなかったため発生した模様です。

#③Layout/TrailingWhitespace: Trailing whitespace detected.

該当部分の末尾に余計な空白が存在しているため、警告が出ました。


#終わりに

```
bundle exec rubocop -a
```

上記コマンドを使用すれば、勝手に修正してくれるみたいですが、
なぜか意味を調べたくなったので、投稿しました。気が向けば新たな警告文が出た場合は、投稿していきます。。。。
古いBuffaloのLinkstationでntpサーバから時刻取得する

# はじめに
## 対象読者
* 古い Buffalo の Linkstation をご利用の方

# 問題
* ntp サーバを指定しても時刻が正しく取得できなくなった
* 手動で設定しようにも、設定できるのが `2020/12/31` までと言われる！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/a90596e0-0122-5c73-cfc9-b1e5953b7fef.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/8bb89bf3-5cad-01ca-873c-31db33f197b4.png)


# 解決
* ntp サーバの IP アドレスを逆引きして IPv4 のアドレスを直接入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/3b9da7f6-e3f4-541b-43d2-9b961403c974.png)


# おわりに
## 感想
* いい加減、買い換えないとですね(´･ω･`)
UE4  ERROR: Not expecting project ... to already have a target rules of with configuration name Game (AppNameTarget) while trying to add

###UE4でIOSリモートビルドをしようとした時に、ERROR: Not expecting project ... to already have a target rules of with configuration name Game (AppNameTarget) while trying to add
英語で調べても全然ドキュメント出てこないから苦戦した。


#解決方法

同じ名前で何回もリモートビルドしていたのが原因。MAC側に前のターゲットファイルが有るよっていう事らしい。
/Users/<font color="Red">MacUserName</font>/UE4/Builds/<font color="Red">WindowsPCname</font>/<font color="Red">C</font>/Users/<font color="Red">WindowsUserName</font>/Documents/Unreal_Projects/<font color="Red">Appname</font>/Intermediate/ProjectFilesIOS/<font color="Red">AppName</font>.xcodeproj
が既に有ることが原因だった。
Windows側のプロジェクトフォルダにProjectFilesIOSなんてフォルダねーじゃん！って思ってたらこれMAC側のルートだったのね。MACでリモートビルド用フォルダを全部消せば直る。↑のルートの場合は

#####rm -rf /Users/<font color="Red">MacUserName</font>/UE4/Builds/<font color="Red">WindowsPCname</font>/<font color="Red">C</font>/Users/<font color="Red">WindowsUserName</font>/Documents/Unreal_Projects/*
をしてからまたビルドしてみよう！
Browserwindowのことが少し分かったので

コツコツとelectronでデスクトップアプリを作って１ヶ月、やっと形になったので動作を確認してみようとパッケージングをしたらメインウィンドウでボタンを押すとサブウィンドウが開くという部分がうまく動かなかったのでゴチャゴチャいじっていたらBrowswerwindowの理解が深まったので書き残しておこうという記事。

たぶんアプリをリリースしたことのある人には当たり前のことだと思うのでほぼ自分用です。

追記
アプリをMacのアップストアーでリリースしたのでよかったらみてみてください↓
https://apps.apple.com/jp/app/%E3%81%8A%E3%81%A4%E3%81%BE%E3%81%BF/id1549128084?mt=12
##環境
vue-cli-plugin-electron-builderをインストールしてvue-routerを使ってます。

##本編

メインウィンドウの元はほぼこんな感じのコードで

```background.js(mainwindow)
let win;
async function createWindow() {
  // Create the browser window.
  win = new BrowserWindow({
    width: 900,
    height: 800,
    webPreferences: {
      // Use pluginOptions.nodeIntegration, leave this alone
      // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
      nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
    }
  });
  win.maximize();

  if (process.env.WEBPACK_DEV_SERVER_URL) {
    // Load the url of the dev server if in development mode
    await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
    if (!process.env.IS_TEST) win.webContents.openDevTools();
    // await transparentWnd.loadURL(process.env.WEBPACK_DEV_SERVER_URL+"/#/transparent");
  } else {
    createProtocol("app");
    // Load the index.html when not in development
    win.loadURL("app://./index.html");
  }
}
```

サブウィンドウもこれ真似すればいいやとこんな感じのコードにしました。

```background.js(subwindow)
let transparentWnd;
var is_showing = false;

ipcMain.handle("open-sub", (event, data, id, time, screenSize) => {
  async function createTransparentWindow() {
    transparentWnd = new BrowserWindow({
      width: 930,
      height: 610,
      x: 100,
      y: 150,
      transparent: true,
      hasShadow: false,
      alwaysOnTop: true,
      webPreferences: {
        nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
        preload: `${__dirname}/preload.js`
      }
    });
    if (process.env.WEBPACK_DEV_SERVER_URL) {
      await transparentWnd
        .loadURL(process.env.WEBPACK_DEV_SERVER_URL + "/#/transparent");
          transparentWnd.webContents.send("comments", data, id, time);
        ;
      if (!process.env.IS_TEST) transparentWnd.webContents.openDevTools();
    } else {
     transparentWnd.loadURL("app://./index.html");
      })
    }
    transparentWnd.on("close", () => (is_showing = false));
  }

  if (is_showing === false) {
    createTransparentWindow();
    if (screenSize == "FullScreen") {
      transparentWnd.maximize();
    }
    is_showing = true;
  }
});
```

しかしこのままだとnpm run electron:serveでは正常なのに、 electron:buildでパッケージングしたアプリだとウィンドウは開くけどコンテンツが表示されませんでした。

###原因と解決方法
原因は if (process.env.WEBPACK_DEV_SERVER_URL)・・・の部分で、ここはおそらく「develepmentのときはif、それ以外（本番）のときはelseを読み込むよ」という意味なのでelectron:serveのときは"/#/transparent"を読み込んでいるけどパッケージングしたあとは"./index.html"を読み込んでしまっていたということです。

なのでelseの部分を

```
if (process.env.WEBPACK_DEV_SERVER_URL){
...
}
else{
await transparentWnd.loadURL("app://./index.html/#/transparent").then(()=>{
 transparentWnd.webContents.send("comments", data, id, time);
})
}
```

とすることでelectron:serveのときと同じ期待通りの動きにすることができました！！
[備忘録]本番環境への更新(heroku)

# 前提
- Railsでアプリケーションを作成している
- heroku CLIのインストールが済んでいる


# 本記事の目的
- 作成したアプリケーションにローカルで変更を加えたので、herokuで本番環境にも変更を反映させたい
- herokuでのプッシュ方法をいつも忘れてしまうので、備忘録代わりに投稿しておきたい

# 手順
1.ローカル環境での変更をgithub上のmasterブランチへプッシュ<br>
2.ターミナル上からherokuへログイン

```:terminal
% heroku login --interactive
↓
heroku: Enter your login credentials
Email [example@example.com]: example@example.com
Password: ********
Logged in as example@example.com


どのディレクトリで実行しても問題ないが、更新したいアプリのディレクトリ上で実行するのが無難だと思う。
```
<br>
3.アプリケーションをherokuにプッシュする

```:terminal
% git push heroku master
更新したいアプリのディレクトリ上で実行
```

<br>
4.もしデータベース関連でも変更がある場合は以下も実行する

```:terminal
% heroku run rails db:migrate
更新したいアプリのディレクトリ上で実行
```

以上。
Kubernetes the hard way を初学者目線で解説する ~ #2 Vagrantでオンプレ環境構築

#はじめに
30代未経験からエンジニアを目指して勉強中のYNと申します。
インフラ初学者の私ですが、Kubernetes the hard wayを進めるにあたって、インフラに関する基本的な知識を体系的に学ぶことができました。
そこで、初学者目線での学びなどを本記事にまとめておきたいと思います。

#目次
[こちらをご覧ください](https://qiita.com/theFirstPenguin/items/1f702af92f4eee83f398#%E7%9B%AE%E6%AC%A1)

#Vagrantの基本
Vagrantの基本的な使い方は下記のチュートリアルを参照ください。
https://learn.hashicorp.com/tutorials/vagrant/getting-started-teardown?in=vagrant/getting-started

```
vagrant ssh master-1 #インスタンスに接続
exit #退出

vagrant suspend #一時停止
vagrant halt #停止
vagrant destroy #削除
vagrant up #再起動
```

#Vagrantを使ってクラスターのノードインスタンスをセットアップする
githubからクローンしたvagrantファイルを実行すると、下図のようなLAN設定でubuntuインスタンスを起動します。workerノードにはDockerがインストールされます。
![スクリーンショット 2021-01-16 16.55.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/7fb60973-e5d0-c2bc-0b03-2c31e0c66730.png)

```mac.PC
git clone https://github.com/mmumshad/kubernetes-the-hard-way.git
cd kubernetes-the-hard-way\vagrant
vagrant up
```

#master-1ノードとその他ノードの間でのssh通信をする
mastetr-1ノードから他ノードへssh接続するための設定を行います。この設定だけでは、master-1から他ノードへの一方通行となります。
![スクリーンショット 2021-01-16 16.56.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/2b5d595d-828c-8aff-a737-6ccfc12a30cd.png)

```master-1.node
#master-1上でsshキーペアを作成し、/home/vagrant/.sshに保存
ssh-keygen 

#公開鍵を表示。表示されたキーをどこかにメモしておく。
cat /home/vagrant/.ssh/id_rsa.pub

#master-1以外のノードに先ほどの公開鍵を登録する
vagrant ssh master-2
cat >> ~/.ssh/authorized_keys <<EOF
> ssh-rsa xxxxx vagrant@master-1　（先ほどの公開鍵を貼り付け）
> EOF
```

#masterノードにkubectlをインストール
2つのmasterノードにkubectlをインストールします。
現段階ではkubectlの設定がされていないので、kubectlコマンドを使うことはできません。

```master-1.node/master-2.node
#ダウンロード
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"

#実行権限を追加
chmod +x ./kubectl 

#適切なディレクトリに移動
sudo mv ./kubectl /usr/local/bin/kubectl
```
Jersey - Which DDD Architecture Layer is Suitable for Filter?

In DDD there are many architectures. Some of them are said to be layered, some are not. In any case, there is a layer (or slice or component or whatever you want to call it) that contains only domain code; that domain layer has not dependency to other layers, contains only pure business logic. The first client of that layer is called Application layer that contains Application services that have , among other, the authorization responsibility; it checks if a user is permitted to execute some command (modify the state of the system) or query (view some data). Although it may seem that this authorization contain business logic, this logic is different from the core business logic.

So, about your example, the domain code should not check by itself if a user has access to some computers. The repository should expose a filter that the Application services could use to filter the computers the user has access to. It is OK to put this functionality inside the repository. In fact, in my opinion, the repository does not belong in the domain layer, not even the repository interfaces.

In CQRS, the command side of the domain layer does not contain any trace of repository/infrastructure code/interfaces, only pure domain logic. The application service authorize the user, loads the aggregate then call a method on it (here stays the domain code) then persist the aggregate.

On the query side there may be infrastructure code involved in the read-model, in order to keep even the domain layer thin. Here reside the filters that can be used by the application services to filter the computers the user has access to, but those filters are no pre-applied by the domain code, they are just exposed to application services use.

So, the conclusion, is to not mix the authorization code with the domain/business logic code.

https://stackoverflow.com/questions/43484497/authorization-filter-in-layered-architecture
LaTeXで論文を引用するときに著者と年号にリンクを貼りたい

# 環境

- MacBook Pro (16-inch, 2019)

- macOS Catalina 10.15.7

- VSCodeにMacTeXを入れている．

- BibTeXで参考文献を管理している．


# やりたいこと

これまで，参考文献を引用する際は，```\cite```コマンドを使って引用していたが，それだと[1]，[2]，...と本文中に番号が振られて，そこにリンクが貼られていた．

```latex
吾輩は犬である\cite{honyaraka}．

→ 吾輩は犬である[1].
``` 

しかし，自分はPASJのテンプレのように，```\citep```コマンドや```\citet```を使って，著者と年号の部分にリンクを貼りたい．

```latex
吾輩は犬である\citep{honyaraka}．

→ 吾輩は犬である(Kakunojinbutu et al. 2021)．

\citet{honyaraka}は，著書の中で吾輩は犬であると結論づけている．

→ Kakunojinbutu et al. (2021)は，著書の中で吾輩は犬であると結論づけている.
``` 

つまり以下の画像のようにリンクを貼り，それを押せば該当する参考文献のページまで飛ぶようにしたい．

![スクリーンショット 2021-01-12 16.17.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567602/52049170-3377-a311-8601-50336d351f68.png)
スクリーンショット 2021-01-12 16.17.20

# 方法

以下では，macOSを使っていて，BibTeXで参考文献を管理している事を前提として話を進める．

## TeXのスタイルファイル

まず，```natbib.sty```というTeXのスタイルファイルというものを用意する必要がある．

以下のリンクの先の'Download'から```natbib```をダウンロードする．ダウンロード先はどこでもOK．

https://www.ctan.org/pkg/natbib

zipファイルなので，解凍する．すると```natbib```というディレクトリができるのでターミナルでそこに移動する．

```shell
 $ cd /Path/to/natbib
```

その後，続けて

```
$ latex natbib.ins
```

と打つと，今いるディレクトリの中に```natbib.sty```が生成されている．

これを，自分の修論なり卒論なりのTeXファイルがあるディレクトリに置く．

これでスタイルファイルの準備はOK．

## TeXファイルの準備

スタイルファイルが準備できたら，編集しているTeXファイルの```\begin{document}```の前に以下を入力する．

```latex
\usepackage{natbib}
\bibpunct[:]{(}{)}{,}{a}{}{,}
```

また，BibTeXを使っている人は```\bibliographystyle{}```と```\bibliography{}```を併用している場合がほとんどであると思うので，その部分を以下のように編集する．なお，```\bibliography{bibitem}```の```bibitem```は自分のBibTeXファイル(```.bib```の前の部分)の名前を用いる．

```latex
\bibliographystyle{plainnat}
\bibliography{bibitem}
```

これでできるはず．

# 参考

http://otoguro.net/home/latex/bibtex/

http://www.tufs.ac.jp/blog/is/g/sodan/texman.pdf
rust バージョン一覧の取得

```show_version.sh
#!/bin/zsh
cargo show --json $1 | python -m json.tool | jq ".versions[].num"
```

出力結果

```
"2.0.0-beta.2"
"2.0.0-beta.1"
"1.1.1"
"1.1.0"
"1.0.0"
"1.0.0-alpha.3"
"1.0.0-alpha.2"
"1.0.0-alpha.1"
"0.2.6"
"0.2.5"
"0.2.4"
"0.2.3"
"0.2.2"
"0.2.1"
"0.2.0"
"0.1.0"
```

やりたいことはcargoのコマンドでできた。
https://stackoverflow.com/questions/65677998/how-can-i-find-the-latest-stable-version-of-a-crate-using-cargo/65679346#65679346
アレクサが寒いねと返してくれるスキルを作ってみた

今年の冬は寒いですね。
という事で、アレクサに寒いねと話しかけたら寒いねと答えてくれるスキルの開発をやってみた。



###作成
開発者のページ
https://developer.amazon.com/ja

上記URLからスキル作成ページへ進み
下記を選択してスキルを作成を押す。
![スクリーンショット 2021-01-12 14.25.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105573/abf0a159-046f-2bbd-a9c9-920d64875d4d.png)

スクラッチで作成を選択し、テンプレートで続けるを押す。
![スクリーンショット 2021-01-12 14.28.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105573/8998aba4-39fd-363f-4857-d2f4ef4fda48.png)

###開発
デフォルトのHelloWorldIntentを削除
![スクリーンショット 2021-01-12 14.34.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105573/d08bffc4-de28-541f-b7f8-5f920f6d0a15.png)


その後、インデントを追加を押し、
SpeakIntentを作成。
サンプル発話に話題を入力する。
![スクリーンショット 2021-01-12 15.01.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105573/e38f58b9-4085-70da-e4c3-cf580a65f815.png)


入力後はモデルをビルドを押す。
ビルド完了後、コードエディタを開き、以下を修正する。

修正箇所は3箇所。

```lambda_function.py
# speak_output = "Welcome, you can say Hello or Help. Which would you like to try?"
speak_output="寒いね。"

# return ask_utils.is_intent_name("HelloWorldIntent")(handler_input)
return ask_utils.is_intent_name("SpeakIntent")(handler_input)

# speak_output = "Hello World!"
speak_output = "そういう時は暖かい飲み物でもいかがですか？"

```


修正後デプロイを押す。

###テスト

まずは、スキル名の「寒いね」を入力する。
アレクサは「寒いね」と返してくれた！
その後、SpeakIntentのサンプル発話で作った「雪が降ったね」を入力。
「そういう時は暖かい飲み物でもいかがですか？」と答えてくれた。

![スクリーンショット 2021-01-12 15.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105573/340c8f9c-af0d-2569-accb-216c3a3565e8.png)

###実機確認
https://alexa.amazon.co.jp/spa/index.html#skills/?ref-suffix=nav_nav

で有効なスキルを押す。
開発スキルタブで「寒いね」スキルが登録されている事を確認。

これで、
「アレクサ、寒いね」
と話しかけると答えてくれるようになる。
jestでCannot find module 'spdx-license-ids'というエラーになった時の対処

# どんなエラーが出たのか

jestでテストを実行した時に以下のエラーが出ました

```
Test suite failed to run

Cannot find module 'spdx-license-ids' from 'node_modules/spdx-expression-parse/scan.js'

Require stack:
  node_modules/spdx-expression-parse/scan.js
  node_modules/spdx-expression-parse/index.js
  node_modules/validate-npm-package-license/index.js
  node_modules/normalize-package-data/lib/fixer.js
  node_modules/normalize-package-data/lib/normalize.js
  node_modules/meow/index.js
  src/bin.ts
  src/tests/bin.test.ts

  at Resolver.resolveModule (node_modules/jest-resolve/build/index.js:306:11)
  at Object.<anonymous> (node_modules/spdx-expression-parse/scan.js:4:11)
```

# どうやって治したか
jestのconfigの `moduleFileExtensions` に `json` を追加したら直りました

- 変更前

```package.jsonから一部
"jest": {
    "moduleFileExtensions": ["ts", "js"]
}
```

- 変更後

```package.jsonから一部
"jest": {
    "moduleFileExtensions": ["ts", "js", "json"]
}
```

# なぜ治ったのか

今回エラーしたパッケージはspdx-license-ids(https://github.com/jslicense/spdx-license-ids) なのですが、内部でjsonファイルが使われています。
jestはconfigのmoduleFileExtensionsに指定された拡張子のファイルしか読み込みません。(https://jestjs.io/docs/en/configuration#modulefileextensions-arraystring)
なので、spdx-license-idsで使われていたjsonファイルを読み込むことができずエラーしました。

ちなみに、jestのmoduleFileExtensionsの初期値は
```
["js", "json", "jsx", "ts", "tsx", "node"]
```
なので、私が余計な設定をしていなければこのエラーは発生しませんでしたね😇
Linuxコマンド（基礎中の基礎）　自分用メモ


## はじめに
最近railsやらPHPをやたら学習していたので復習がてら、Linuxコマンドについて復習したく投稿しました

もちろん自分用のメモです


##Linuxコマンド

- cd (current directory)←ターミナルに打ち込むとそのdirectoryに移動できる
  appと言うdirectoryがとして、cd appとターミナルに打ち込むとappと言うディレクトリに移動できるって話である

- pwd (print working directory)
  今いるディレクトリを表示する

- ls (list)
  ディレクト内のファイルを確認、表示する

- mkdir (make directory)
  新しいディレクトリ（フォルダ）を作成
　例：mkdir test
  これでtestと言うディレクトリ（フォルダ）が作成される

- touch
  新しいファイルを作成
　例 touch test.rb
 　これで新しいファイルが作成される

- rm
  ファイルの削除
　例：rm text.rb
 これでtext.rbが削除される

- rm -r
  ファイル削除
　例：rm -r test
  ※該当のディレクトリで行う事

テックキャンプで学習していた頃、上3つくらいしかしてなかった汗
ちなみに上三つはマジでよく使いました
最終課題とポートフォリオのアプリ行ったり来たり・・・
削除と作成は割とマウスでどうにでもなるから使わないんだよなぁ（反省）
Java-強制型変換

# Java-強制型変換
### int型同士の計算
```go
int number1 = 13;
int number2 = 4;

System.out.println(number1/number2);  //int型同士の割り算

//コンソール
3
```
int型同士の計算「13 / 4」は3になってしまう
int型の変数同士の割り算で、正確な値を出したいときはどうすれば??

### キャスト
```go
int number1 = 13;
int number2 = 4;

System.out.println((double)number1/number2);

//コンソール
3.25  //double型の計算結果
```
このようなときは強制的に型変換を行う
これをキャストと呼び、(変換したいデータ型)値とする

int型同士の値から、最終的にdouble型の計算結果を得たい場合
どちらか1つをキャストする(もう一方はJavaが判断してくれる)
Java-自動型変換

# Java-自動型変換
### 型変換について
```go
System.out.println("内藤さんは"+26+"歳です")

//コンソール
内藤さんは26歳です
```
「+」などの操作は同じデータ型同士でないといけない
型の違うものを演算するときは、型を変換し同じ型にする

Javaではこの型変換方法として自動の変換と手動の変換がある
String型とint型を足すと
int型が自動でString型に変換され文字列の結合が行われる

### 数値の計算の注意点
```go
System.out.println(5/2);  //int型同士の計算
System.out.println(5.0/2.0);  //double型同士の計算

//コンソール
2  int型
2.5  double型
```
数値計算における注意点
int型同士の計算は結果もint型になり
double型同士の計算は、結果もdouble型になる

int型の5をint型の2で割ると
結果は「2.5」ではなく「2」となることに注意

### 計算時の自動型変換
```go
System.out.println(5.0/2);
                   5.0/2.0  //double型に変換

//コンソール
2.5  double型
```
int型とdouble型の計算では結果はdouble型になる
計算の過程でint型がdouble型に変換されるため
よって「5 / 2.0」もしくは「5.0 / 2」の結果は2.5

5を5.0にするように、整数は必ず小数でも表せるため
Javaが自動で型変換を行う
Install buildah and container-selinux

On some special CentOS 7, when installing buildah:

```
curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_7/devel:kubic:libcontainers:stable.repo
yum -y install buildah
```

Got these errors:

```
--> Processing Dependency: container-selinux >= 2:2.85-1 for package: 2:runc-1.0.0-103.dev.el7.x86_64
--> Finished Dependency Resolution
Error: Package: buildah-1.19.0-1.el7.x86_64 (devel_kubic_libcontainers_stable)
           Requires: container-selinux
Error: Package: 2:runc-1.0.0-103.dev.el7.x86_64 (devel_kubic_libcontainers_stable)
           Requires: container-selinux >= 2:2.85-1
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

```


But can't install container-selinux from package service, but can be installed manually.

```
yum install -y http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.107-3.el7.noarch.rpm
```
VSCode 選択した複数行をマルチカーソルにするキーボードショートカット

## Atom Keymaps

https://marketplace.visualstudio.com/items?itemName=ms-vscode.atom-keybindings

Atom Keymaps では、 `Command` + `Shift` + `l` に設定されているが、デフォルトのキーマップではどう設定されているのか気になった。

## キーボードショートカットの設定変更

`Command` + `K`, `S` でキーボードショートカット設定を開く

```
Add Cursors to Line Ends
editor.action.insertCursorAtEndOfEachLineSelected
```

で検索する。

デフォルトでは `Shift` + `option` + `|` となっていました。

しかし、日本語キーボードだとどうやっても押せそうにないので、
`Shift` + `option` + `¥` に変更するとうまくいった🤗
brew upgrade rbenv ruby-build で XcodeがmacOSをsupportしてないエラー

ruby3.0、rails6.1.0で新たにrailsアプリを開発。
atomエディタのLinterが ``rbenv: version `ruby-3.0.0' is not installed``とのエラーを吐く。 

rbenvでruby-3.0.0を入れる必要があるとのことなので、以下のコマンドを実行。

```
$ brew update
　（時間かかった。。）
$ brew upgrade rbenv ruby-build
```

参考：[rbenvでmacのrubyを最新にする \- Qiita](https://qiita.com/kogache/items/5886a6b62f036c1f94c9)

すると以下のエラー。

```
==> Installing ruby-build
Error: Your Xcode does not support macOS 11.
It is either outdated or was modified.
Please update your Xcode or delete it if no updates are available.
Xcode can be updated from the App Store.

Error: An exception occurred within a child process:
  SystemExit: exit
```

[More Software Downloads \- Apple Developer](https://developer.apple.com/download/more/?=for%20Xcode)より最新のCommand Line Toolsを手動でインストール。

参考：[Error: Your Xcode does not support macOS 11\.0\.が出た時の対処方法](https://zenn.dev/welchi/articles/xcode-does-not-support-macos11)

その後、再度以下のコマンド。

```
$ brew upgrade rbenv ruby-build
Error:
  homebrew-core is a shallow clone.
  homebrew-cask is a shallow clone.
To `brew update`, first run:　
...
```
なんかError吐いたけどインストールしたよう。

```
$ rbenv install --list
...
3.0.0
...
```
　入ってる。

```
$ rbenv install 3.0.0
...
$ ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20]
```
成功。
Kubernetes the hard way を初学者目線で解説する ~ #1 全体像を理解する

#はじめに
30代未経験からエンジニアを目指して勉強中のYNと申します。
インフラ初学者の私ですが、Kubernetes the hard wayを進めるにあたって、インフラに関する基本的な知識を体系的に学ぶことができました。
そこで、初学者目線での学びなどを本記事にまとめておきたいと思います。

#目次
[こちらを参照ください](https://qiita.com/theFirstPenguin/items/1f702af92f4eee83f398#%E7%9B%AE%E6%AC%A1)

#全体像を理解する
##LAN構成
`Vagrant`を用いてオンプレ環境に5台のubuntuインスタンスを起動します。
ubuntuインスタンスとLANの構成は下記のようになっています。

![スクリーンショット 2021-01-12 14.48.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/06251134-65b3-acbe-f11c-c3a364a0c5f6.png)

##クラスターコンポーネントの構成
`API-server`や`kubelet`などの`kube-system`コンポーネントは`Pod`を使うのが一般的ですが、今回は`systemdのservice`として書くノードに配置します。一方で、`core-DNS`や`Weave`などのアドオンは`Pod`として配置します。

masterノードが2つあるため、それぞれの`API-server`へのアクセスは`HA-proxy`でロードバランスします。`etcd`も2つありますが、クラスタリングして片方をread replica的に振舞わせることで冗長化を行います。また、`scheduler`と`controller-manager`については片方のみをリーダーとして稼働させています。
(※`Pod`でなく`systemd`で稼働させているため、本当にリーダーだけが動いているかは未確認です。。。)

一方で、workerノードについては、`Pod`の名前解決のために`core-DNS`を、CNIとしては`Weave`のプラグインを使用しているため、両者とも`Pod`として稼働しています。

これがベストプラクティスかと問われればそうでも無い気がしますが、[github](https://github.com/mmumshad/kubernetes-the-hard-way/tree/master/docs)の内容に準じて進めていきます。Kubernetesのクラスタのmaster冗長化のためのベストプラクティスについては[こちら](https://kubernetes.io/docs/tasks/administer-cluster/highly-available-master/)を参照ください。

![スクリーンショット 2021-01-12 15.04.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/11a83e19-71cd-e518-f364-eff7a7f5ebf1.png)


##外部からPodへのアクセス
アプリケーションの利用者目線で上記のクラスター図を眺めると、`Pod`へのアクセス方法は下記のようになります。
どちらかのworkerノードのIPアドレスの`NodePort`に対してアクセスすることで、どちらかのworkerノードにある`Pod`へアクセスします。
ここで注目すべきは、worker-1 / worker-2のどちらにアクセスしたとしても、どちらのPodにアクセスするかは分からないということです。

これは、`Weave`がノードを跨ぐネットワークを構築し、`kube-proxy`がどのpodに振り分けるか決定し、`core-DNS`でpodのIPアドレスを解決する、という連携で成り立っています。

上記ネットワークについては、下記記事が分かりやすかったです。
>[Kubernetesネットワーク 徹底解説](https://zenn.dev/taisho6339/books/fc6facfb640d242dc7ec)

![スクリーンショット 2021-01-12 15.21.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/096ef090-fa70-e2da-d7e5-bfea43ca29eb.png)

##コンポーネント間の連携
コンポーネントの連携について、今回構築するクラスターの最終形を下図にしてみました。
（※`scheduler`と`controller-manager`が、なぜLBではなく`localhost`宛に通信しているのかよく分かりませんが、[github](https://github.com/mmumshad/kubernetes-the-hard-way/tree/master/docs)の内容に準じて進めていきます。。。）

![スクリーンショット 2021-01-12 15.47.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/d513e353-9969-3926-ad61-639101ea76b7.png)
Snowpack で React・Vuejs・Svelte を動かしてみる

## Snowpack とは

webpack や rollup などの代替として利用できるフロントエンドの依存解決を行うビルドツール、**モジュールバンドラではなく**、コードを ESM 形式に変換してモジュールとして利用できるようにする。

参照：[Snowpack公式サイト](https://www.snowpack.dev/)

---

### ES Modules までの歴史

1. NodeJS が誕生、CommonJS を基にしたモジュール機能を実装
1. RequireJS が誕生、AMD をブラウザ用に変換する
1. Browserify が誕生、CommonJS をブラウザ用に変換する
1. CommonJS でも AMD でも使える UMD が誕生 
1. Webpack が誕生、やたらと多機能で実質的にデファクト環境となる
1. ES Modules の策定

つまり現状では CommonJS（CJS）、AMD、UMD、ES Modules（ESM） の４種類のモジュール形式が存在することになります。

---

### ES Modules の誕生

フロントエンドの複雑化・肥大化にともなって ES Modules（ESM） という仕様が策定された、これは 2021年現在では既に Microsoft Edge を含む IE 以外のブラウザでは対応されており、Nodejs でも v12 以降は標準対応している。

参照：[MDN - JavaScript モジュール](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Modules)

---

### 普及しない ES Modules

じゃあ依存ファイルを ESM でガンガン import すれば良いよね！としたいところだったが、 いくつかの問題が存在していた。

1. webpack 等のバンドラが開発環境として普及してしまっている
1. npm で提供されているライブラリの多くが ESM に対応していない
1. import に対応していないブラウザに対する互換性がまるでない

---

### そして Snowpack の登場

ここで前述の問題を解決するための新たな手段として注目されているのが Snowpack というビルドツールで、これは単純にいうと npm ライブラリを ESM 形式に変換して出力するというビルドツールである。

※これはつまり ESM をサポートしている [Deno](https://deno.land/) でも npm の資産が使えるようになることも意味しています。 

なお現状ではファイルのバンドルだけではなく、JSX や Vue テンプレートファイルの変換とかもしてると思うので、それらの対応についても解説しておきます。

---

## フレームワークへの対応

Snowpack には create-snowpack-app というボイラープレートが存在しており、簡単にいうと React や VueJS などのフレームワークを Snowpack で変換する際の開発環境があらかじめ用意されています。

これにより JSX や Vueファイル、Svelteファイルの変換などが行えます。

[create-snowpack-app のテンプレート一覧はこちら](https://github.com/snowpackjs/snowpack/tree/main/create-snowpack-app/cli)

---

### React

```:Reactの例
npx create-snowpack-app yourappname --template @snowpack/app-template-react
```
```:React+TypeScriptの例
npx create-snowpack-app yourappname --template @snowpack/app-template-react-typescript
```

---
### Vue

```:Vueの例
npx create-snowpack-app yourappname --template @snowpack/app-template-vue
```
```:Vue+TypeScriptの例
npx create-snowpack-app yourappname --template @snowpack/app-template-vue-typescript
```

---
### Svelte

```:Svelteの例
npx create-snowpack-app yourappname --template @snowpack/app-template-svelte
```
```:Svelte+TypeScriptの例
npx create-snowpack-app yourappname --template @snowpack/app-template-svelte-typescript
```

---
## WebWorker 対応

2021年1月現在では WebWorker 内での ES Modules は全てのブラウザで対応しているわけではありません、これに関しては、`Snowpack v 3.0.0` と `Snowpack Webpack v5 plugin` の両方で自動的にバンドルファイルを出力するようになりました。

[Web Workers - Snowpack](https://www.snowpack.dev/guides/web-worker/#esm-web-worker-support)

---

## IE対応

```
npm snowpachk --nomodule
```

でレガシーブラウザ用に旧来のようにバンドルしたJSファイルを出力できるが、ドキュメントに書いてない気がする。
Android Studioインストール後にコマンドラインでビルドしようとするとJDKのインストールを求められる問題の対処法

macでAndroid Studioの環境構築をした際に若干詰まった部分をメモしておきます。

# 問題
macにAndroid Studioをインストールしたあと、Android Studio外で以下のようなコマンドによりビルドしようとした際に、以下のエラーメッセージとスクショのようなダイアログが表示され、JDKのインストールを求められました。

```shell:ビルドコマンドとエラーメッセージ
$ ./gradlew assembleDebug
No Java runtime present, requesting install.
```

JDKをインストールを求めるダイアログ
![スクリーンショット 2021-01-12 15.23.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/9dd36ac7-0382-1d68-0e37-f5bef0712f34.png)

# 環境
- macOS Catalina 10.15.17
    - Intel CPU
- Android Studio 4.1.1

# 解決策
Android StudioにはすでにJDKを内包しているため、パスを通してやれば良いです。

具体的なパスは、Android Studioのメニュー > File > Project Structureの画面で、左ペインのSDK Locationを選択し、JDK Locationを見ることで確認できます。
![JDKパス確認画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/a51ec07e-b426-c108-1da6-f81e2f8a08e1.png)

ちなみに、ここの項目のヒントに、「外部プロセスで利用したい場合は`JAVA_HOME`にこのパスを追加する」旨が記載されていました。
![JDKパスヒント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/5fa21dff-4cf0-852e-5f73-c8e6d5f832dd.png)

確認したパスを`~/.zprofile`ファイルに以下のように書き込んだのちターミナルを再起動すると、ビルドコマンドが利用できるようになります。

```shell:.zprofile
export JAVA_HOME="/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home"
```

# 参照
- https://developer.android.com/studio/intro/studio-config.html?hl=ja#jdk
- https://qiita.com/tsumuchan/items/43a55789f1cf213611cc