OmniAICreator/Qiita-1.07M huggingface dataset:
EC2 + Cloud9 の環境準備

# はじめに
EC2+Cloud9の環境を作ろうとしたらクソほどハマったのでまとめておきます。

## 目次
0.[下準備](#0.下準備)
1.[インスタンスを用意する](#1.インスタンスを用意する)
2.[SSH接続する](#2.SSH接続する)
3.[Cloud9で環境を作る](#3.Cloud9で環境を作る)
4.[色々インストールする](#4.色々インストールする)


#### 0.下準備
インスタンスを作成するVPCの設定をしてください。デフォルトでも大丈夫です。SSH通信だけできるようにセキュリティグループで22番ポートは空けておいて下さい。

#### 1.インスタンスを用意する
インスタンスを作成します。セキュリテイグループやVPCの範囲などには気をつけて下さい

#### 2.SSH接続する
ここからが本番です。
まずIPが用意されていなかったら、Elastic IPを作成し、インスタンスに関連付けておいて下さい。

##### 2.0 公開鍵を１度以上使っている場合
以下のようなものが表示されると思います。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
```

これが出たら以下のコマンドを行って下さい。

```
$ ssh-keygen -R ホストIP # 今回であれば、インスタンスのIPアドレス
```

またそのあと以下のコマンドを行って下さい。

```
chmod 400 公開鍵.pem
```

これで、接続することができるようになると思います。

##### 2.1 SSH接続する

インスタンスのページから接続するをクリックして、誘導の通りに接続して下さい。
接続したインスタンスは落とさないで下さい。

#### 3.Cloud9で環境を作る

Create enviromentを行って下さい。また基本的にはこれを参考にして下さい。
[AWS Cloud9をSSH接続で使うまでの手順](https://qiita.com/predora005/items/bb3a5ef93acbd351a686)

またCloud9の公開鍵を手に入れたら以下のコマンドを接続しているインスタンス上で打ち込んでください。

```
$ echo "[コピーした公開鍵]" >>  ~/.ssh/authorized_keys
```


#### 4.色々インストールする

初期のインスタンスにはNodeなど必要なものが用意されていないのでインストールしていきます。

Node

```
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . .bashrc
$ nvm install node
```

AWSの起動元ディレクトリの権限変更

```
$ sudo chmod u=rwx,g=rx,o=rx ~
```

AWS Cloud9のインストール

```
$ sudo yum install -y gcc
$ curl -L https://raw.githubusercontent.com/c9/install/master/install.sh | bash
```

### 補足
gitのインストールとコミット毎にアカウント情報を入力しなくて済むようにする設定。

```
$ sudo yum -y install git
$ git --version
```

## おわりに
参考を組み合わせてなんとかたどり着いたものです。
あなたによきAWSライフを、、、

### 参考
[AWS Cloud9をSSH接続で使うまでの手順](https://qiita.com/predora005/items/bb3a5ef93acbd351a686)
[SSH接続エラー回避方法：.ssh/known_hostsから特定のホストを削除する/削除しないで対処する3つの方法](https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938)
入門者もプロもJAMスタックからはじめよう！

## JAMスタックとは何か

JAMスタックの[公式サイト](https://jamstack.org/)によると、ビルドが自動か手動か、もしくはフレームワークがNext, Gatsby, Hugoどの種類でも共通しているのはサーバーに依存しないということであると説明されています。ではではJAMの頭文字について説明していきます。

#### Javascript
上記で「サーバーに依存」しないため、メイン使用することになるのはフロントエンドで大活躍しているJavascriptです。Angular, React, Vueなどのフレームワークやライブラリを使用したものももちろん含まれます。

#### API
全てのサーバーサイドの処理やデータベースアクションは再利用可能なAPIとして抽象化されており、JavaScriptによるHTTPS経由でアクセスされます。

#### Markup
デプロイ時に静的サイトの生成ツールやアプリケーションのビルドツールによって事前にビルドされていなければい。

## JAMスタックを始めるのは難しいか？
これまで技術構成を表す用語として下記のようなものがありました。

- MEANスタック(MongoDB + Express + Angular + Node.js)
<img src="https://s3-ap-southeast-1.amazonaws.com/djamblog/article-220220120804.png" width="400">
- MERNスタック(MongoDB + Express + React + Node.js)
<img src="https://gainfromhere.com/wp-content/uploads/2018/05/mern-stack-1.jpg" width="400">
- LAMP(Linux + Apache + MySQL + PHP)
<img src="https://i1.wp.com/pointsandlines.jp/wp-content/uploads/2020/02/lamp.png?resize=750%2C240&ssl=1" width="400">

プログラミングを始めたばかりの入門者が上記のような技術を全て学ぼうとすると、習得にかなりのコストと時間がかかるので、JAMスタックも同様に難しいと思ったのですが、実際に触ってみると、簡単に開発ができ、しかも高パフォーマンスなアプリケーションができてしまうので、エンジニアの転職を考えているかたや、ブログやコーポレートサイトを作ってみたいが「Wordpressか...」なんて思っているかたにかなりマッチするのではないでしょうか。

## 何から始める？

Javascriptフレームワーク御三家のAngular, React, Vue.jsに対応する静的サイトジェネレータがそれぞれあるので、下記の3つのうちどれかから入るといいと思います。上記3つもそうですが、それぞれの長所、短所があるので、業務で使っているものや実際に書いてみて楽しいものを選ぶのがいいと思います。

### 1. Scully
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316359/a06e4d9a-d696-5bb4-4f22-dd0ef9b15f83.jpeg" width="250">

GDEのAaron Frostさんらのチームによって開発されたフレームワークです。Angularのサービスや、コンポーネント、モジュールといった概念も使用できるようです。
次に紹介するGatsbyやGridsomeなどの静的サイトジェネレータの人気の高まりを受けて、昨年終わり頃に公開となったため、日本語情報はもちろん、関連記事の絶対数がかなり少ないですが、今後期待が高まるフレームワークだと思います。

### 2. Gatsby
<img src="https://images.ctfassets.net/a9gugm0iezvw/3VkYN4jjt1HD0Cpuz9UZ3j/8d593fc52d97910f1faed172a5aa0c33/34442516-fb1a1a3c-ecc2-11e7-8fe8-530435f22336.jpg?w=2800&h=1500&q=50&fit=fill" width="250">


Reactベースの背的サイトジェネレータです。私はまだ使ったことがないのですが、上で紹介したScullyと次に紹介するGridsomeが、まだまだ日本語の記事やドキュメントが少ないのに対して、わりと記事が充実しているイメージです。

Reactを使い慣れたかたはもちろんですが、3大フレームワークの使用経験がなく、今から静的サイトジェネレータを使いたい人にとってもマッチするのではないかと思います。



### 3. Gridsome
<img src="https://gridsome.org/logos/logo-normal.svg" width="250">
Vueベースの静的サイトジェネレータです。Page, リンク, コンポーネントなどほぼ全てがVueコンポーネントとなっています。データのやりとりはGraphQLでおこなわれるため、とっつきにくそうに思いますが、一度学んでしまえば素早く開発ができてしまいます。

多くの部分でGatsbyに似ていますが、公式サイトもGatsbyそっくりで、かなりリスペクトがあるみたいです。


日本ではVue.jsやNuxt.jsの採用事例が急激に増えている中で、Gridsomeを使用して手軽にサーバーレスなサイトを作る事例も多くなるのではと思います。

ちなみに私の個人ブログもGridsomeを使用して作成しましたが、かなり早く開発できしていて気持ち良かったです！

## まとめ
- まずはJAMスタックから初めてみよう！
- 自分にあったフレームワークを選んでみよう!
- 入門者にもおすすめ。

## 関連サイト
- [Jamstack.org](https://jamstack.org/community/)
- [Scully - 公式リポジトリ](https://github.com/scullyio/scully)
- [GatsbyJS - 公式サイト](https://www.gatsbyjs.org/)
- [Gridsome - 公式サイト](https://gridsome.org/)
言語処理100本ノック-38(pandas使用):ヒストグラム

[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)[「第4章: 形態素解析」](http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch4)の[38本目「ヒストグラム」](http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec38)記録です。
前回ノックの「豆腐」さえ乗り越えていれば簡単です。ラベルを出さなければ「豆腐」対応する必要もないです。

# 参考リンク

|リンク|備考|
|:--|:--|
|[038.ヒストグラム.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/04.%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90/038.%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0.ipynb)|回答プログラムのGitHubリンク|
|[素人の言語処理100本ノック:38](http://qiita.com/segavvy/items/c53c35827524f875ba2d)|多くのソース部分のコピペ元|
|[MeCab公式](https://taku910.github.io/mecab/)|最初に見ておくMeCabのページ|

# 環境

|種類|バージョン|内容|
|:--|:--|:--|
|OS|Ubuntu18.04.01 LTS|仮想で動かしています|
|pyenv|1.2.16|複数Python環境を使うことがあるのでpyenv使っています|
|Python|3.8.1|pyenv上でpython3.8.1を使っています<br>パッケージはvenvを使って管理しています|
|Mecab|0.996-5|apt-getでインストール|

上記環境で、以下のPython追加パッケージを使っています。通常のpipでインストールするだけです。

|種類|バージョン|
|:--|:--|
|matplotlib|3.1.3|
|pandas|1.0.1|

# [第4章: 形態素解析](http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch4)
## 学習内容
> 夏目漱石の小説『吾輩は猫である』に形態素解析器MeCabを適用し，小説中の単語の統計を求めます．
>> 形態素解析, MeCab, 品詞, 出現頻度, Zipfの法則, [matplotlib](http://matplotlib.org/), [Gnuplot](http://www.gnuplot.info/)

## ノック内容
> 夏目漱石の小説『吾輩は猫である』の文章（[neko.txt](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/neko.txt)）をMeCabを使って形態素解析し，その結果をneko.txt.mecabというファイルに保存せよ．このファイルを用いて，以下の問に対応するプログラムを実装せよ．

なお，問題37, 38, 39は[matplotlib](http://matplotlib.org/)もしくは[Gnuplot](http://www.gnuplot.info/)を用いるとよい．

### [38. ヒストグラム](http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec38)
> 単語の出現頻度のヒストグラム（横軸に出現頻度，縦軸に出現頻度をとる単語の種類数を棒グラフで表したもの）を描け．

# 回答
## 回答プログラム [038.ヒストグラム.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/04.%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90/038.%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0.ipynb)

```python
import matplotlib.pyplot as plt
import pandas as pd

plt.rcParams['font.family'] = 'IPAexGothic'

def read_text():
    # 0:表層形(surface)
    # 1:品詞(pos)
    # 2:品詞細分類1(pos1)
    # 7:基本形(base)
    df = pd.read_table('./neko.txt.mecab', sep='\t|,', header=None, 
                       usecols=[0, 1, 2, 7], names=['surface', 'pos', 'pos1', 'base'], 
                       skiprows=4, skipfooter=1 ,engine='python')
    return df[(df['pos'] != '空白') & (df['surface'] != 'EOS') & (df['pos'] != '記号')]

df = read_text()

hist = df['surface'].value_counts().plot.hist(bins=20, range=(1, 20))
hist.set_xlabel('出現頻度')
hist.set_ylabel('単語種類数')
```

## 回答解説
`pandas`の`plot`使うだけです。ラベルも追加しました。

```python:
hist = df['surface'].value_counts().plot.hist(bins=20, range=(1, 20))
hist.set_xlabel('出現頻度')
hist.set_ylabel('単語種類数')
```

### 出力結果(実行結果)
プログラム実行すると以下の結果が出力されます。まぁ、こんな感じですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/a55a5c9a-6aef-14d6-b7e4-fb62278cfa08.png)
初心者によるプログラミング学習ログ 252日目

#100日チャレンジの252日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
252日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>252日目<br>・youtubeで、JSのミニアプリ模写<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1234206555609780224?ref_src=twsrc%5Etfw">March 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【LINE bot】おいら、だじゃレンジャー！その2

#はじめに

以前の作成した、[だじゃレンジャーLINE bot](https://qiita.com/Hexans/items/06b9abdcfb4a838a18f7)の更新。

#問題点

1. 小学生には難解な漢字が多く読めない。
2. 与えられたお題(キーワード)でだじゃれを返せない場合、botからのレスポンスがなく、利用者が不安に。

#目的

1. 漢字にフリガナをふる。
2. だじゃれを返せない場合は、返せない旨を伝える。

# 詳細
詳しい解説とコードは[【LINE bot】おいら、だじゃレンジャー！その2](https://www.aiprogrammers.net/entry/2020/04/19/015232)をご覧ください。
useStateについて

React useStateについて学んでみました！

# useStateとは？
そもそも**useState**とは何かわからなかったので調べてみました！

useState = 基本のフックです！

じゃあ、**基本のフック**とは...？

**「フック (hook) は React 16.8 で追加された新機能です。<br />state などの React の機能を、クラスを書かずに使えるようになります。」**
https://ja.reactjs.org/docs/hooks-state.html

とのこと。...まとめると
**クラスを書かずにFC(Function Component)でクラスコンポーネントのstateとほぼ同じことができる新機能！**
らしいです。

## hook
調べてみるとhookには他にも色々あります。

- 基本のフック
 - useState
 - useEffect
 - useContext

- 追加のフック
 - useReducer
 - useCallback
 - useMemo
 - useRef
 - useImperativeHandle
 - useLayoutEffect
 - useDebugValue

https://ja.reactjs.org/docs/hooks-reference.html

## useStateを使ったカウントアップ
今回は**useState**を使ってカウントした数を数えるためのカウントアップボタン

```js
import React, { useState } from 'react';
const Test = () => {
 // まず定義します。
 const [count, setCount] = useState(0);
 // countはただの変数
 // setCountはcountに値を入れるためだけの関数
 // useState(0)の0はcountの初期値

 const countUp = () => {
 // ボタンを押して１ずつカウントアップします
 setCount(count + 1)
 }

 return (
  <button onClick={countUp}>
   {`ボタン${count}`}
  </button>
 )
}
```

**やってみた**
![Large GIF (1596x756).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/f093d3df-2bc6-ea6d-f826-ef7251752b9a.gif)


## 注意点
useStateの初期値はなんでも良くて、0でも1でも、boolean系、文字列なんでもありです。
ただし、オブジェクトはダメです！！！

class componnentだと...

```js
this.setState({ test1: 3 });
```
↑っとやるとそのプロパティだけ更新されます。

ですが、useStateは違います。


```js
// オブジェクトを定義
const [test, setTest] = useState({
   test1: 1,
   test2: 2
 });

const countUp = () => {
    console.log("countUp-test", test);
    setTest({ test1: 3 });
  };

  return (
    <div className="App">
      <button className="buttonView" onClick={countUp}>{`ボタン`}</button>
    </div>
  );

```

testオブジェクトのtest1の値を更新しようとするとそのプロパティだけ更新されますが、他が消えてしまいます！！

**やってみた**
![Large GIF (1596x784).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/8797120b-71cb-fbfd-d855-f5b6b6488012.gif)


useStateでのオブジェクト管理はやめましょう！
Qiitaの画像アップロード上限

##Qiitaでの画像アップロード制限

- <h3>記事を投稿していない場合</h3>

月2MBまでアップロード可能。

- <h3>記事を投稿している場合<h3>

月100MBまでアップロード可能。

#対策

- 次月を待つ。
- 他のサイトでアップロードしておいて、リンクを提示。
- なるべく圧縮した画像をアップ。
EKSで機械学習 #3  Managed Worker Node作成編

# はじめに
このシリーズでは Amazon EKSで機械学習を行っていきたいと思います

# シリーズ目次
EKSで機械学習 #1 準備編
EKSで機械学習 #2 クラスター作成編
EKSで機械学習 #3 Managed Worker Node作成編 (この記事)

# この記事の目的
すでにクラスターは作成済みですが、Worker Nodeはない状態なので作ります。
せっかくなので、EKSの機能の１つの、Managed Worker nodeを作成します。
また、Managed Worker nodeはGUIで作る方法とeksctlや、CloudFormation/Terafformなどで作る方法などがありますが、今回はGUIで作ってみたいと思います。

# EKSの管理コンソールから、Managed Worker Node を作成する
## Worker Node用のIAM roleを作成する
Worker NodeもEC2インスタンスなので、IAM roleが必要です。まずはそれを作成します。
必要なPolicyなどはこちらに書いてあるのでサクッと作成します
今回作成する、Managed Worker Node名は「managed-1」にするので、IAM role名を「eks-managed-1-worker-role」としました。

こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107953/55c0a273-2542-97a2-ac6e-1d971aaa6911.png)


## Managed Worker Node の作成
名前は managed-1
IAM roleは、先ほど作成した eks-managed-1-worker-role
ssh keyは、なんでもOK（sshを行う予定はないので）
タグやラベルは特に指定しない。

https://docs.aws.amazon.com/eks/latest/userguide/worker_node_IAM_role.html


クラスターの詳細を開いて、「ノードグループを追加」で追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107953/8c8a2a66-397f-9600-daea-231b24a8742b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107953/8dd1c896-491e-2db9-71c0-2938f1a749bf.png)


計算構成はデフォルトのまま

スケーリングの構成は、最小サイズを1, 希望のサイズを1、最大サイズを2に変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107953/7716f04a-0c25-bb6f-fd11-3af40692e8cb.png)

作成が終わるまで待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107953/8ded8dd4-cd32-7d1a-7ab2-4e7a2aa2e79b.png)

```
k get node
NAME                                           STATUS   ROLES    AGE   VERSION
ip-192-168-109-12.us-west-2.compute.internal   Ready    <none>   67s   v1.14.8-eks-b8860f
```


こんな感じで、node が表示されたらOK。

ついでにpodも動いていることも確認しておく


```
k get pod -A
NAMESPACE     NAME                      READY   STATUS    RESTARTS   AGE
kube-system   aws-node-mz9z5            1/1     Running   0          17h
kube-system   coredns-84549585c-4zf68   1/1     Running   0          18h
kube-system   coredns-84549585c-gmsgg   1/1     Running   0          18h
kube-system   kube-proxy-qj27l          1/1     Running   0          17h
```

# まとめ
今回は、Managed Worker Nodeの作成を行いました。
次回は、GPUが搭載された Managed Worker Nodeの作成を行います
Python 標準入力で行列表現

#AtCoderでよく使われる標準入力を使用して3×3の行列を作った


環境　Python 3.7.3

```python

import pandas as pd

s = [input().split() for  i  in range(3)]
N = pd.DataFrame(s,columns=list("123"),index=["Tokyo","Nagoya","Osaka"])
print(N)

```

##入力
9 8 7
6 5 4
3 2 1

##出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489142/0d3e3a89-a4f0-f800-91da-59b9dd7fe302.png)
JavascriptのテストフレームワークJestを導入して、非同期関数をテストする

Javascriptのテスト用ツールには、MochaやChaiなどいろいろあります。
今回は多様なテストツールの中でも、Facebook製の**jest**というフレームワークを導入して使ってみます。

## jestとは

Jest · 🃏快適なJavaScriptのテスト 
https://jestjs.io/ja/

>Jest is a delightful JavaScript Testing Framework with a focus on simplicity.

>It works with projects using: Babel, TypeScript, Node, React, Angular, Vue and more!

Jestはシンプルで、Babel、Typescript、Node、React、Angular、Vueなどに対応しています。

## 前提

今回はTypescriptプロジェクトにjestをインストールする想定です。

## 導入手順

Getting Started · Jest 
https://jestjs.io/docs/ja/getting-started.html

Jestの公式ページ

### インストール

```console
$ npm install --save-dev jest @types/jest ts-jest
```

### package.jsonの編集


必要な編集作業は2つです

- `npm run test`を入力時に、jestを実行する
- ts拡張子のファイルをjestの対象にする

```package.json

{
  "scripts": {
  ...
  ...
    "test": "jest"
  },
  "jest": {
		"moduleFileExtensions": [
			"ts",
			"js"
		],
		"transform": {
			"^.+\\.ts$": "ts-jest"
		},
		"globals": {
			"ts-jest": {
				"tsConfig": "tsconfig.json"
			}
		}
	},
}

```

### テストコードを配置するディレクトリ作成

`__test__` 以下にテストコードを配置します。
`src`以下にコードを配置します。


## テストコードの書き方

### 非同期関数をテストする

今回は、aws-sdkを用いた関数をテストしてみます。
IAM RoleのAPIを叩いてRole Nameが含まれた配列を返す関数をテストします。


#### テストコード用構文

テストコード内に、テスト用の書き方があるので、いくつか紹介します。
すでにテストをある程度書いた経験がある方は飛ばしてもらって構いません。

- describe
  - テスト箇所の宣言をします。
- it
  - テスト内容を記述する場所です。
  - jestでは、testとも書けます。
- expect
  - テスト対象を指定して、実行結果をテストします。

### テストコード

関数の実行結果に、ec2-roleというロール名が含まれるかどうかテストしています。
ec2-roleを、ご自身のAWSアカウントに登録されているRole名へ変更すれば流用することができます。

#### 非同期関数のテスト

jestではasync、await構文が使えるので、それらを用いてテストしています。(itの部分です)


`./__tests__/index.spec.ts`

```typescript:./__tests__/index.spec.ts
import { IAMRoleNameCollector } from '../src/index';
import { IAM } from 'aws-sdk';

describe('the test of IAMRoleNameCollector', () => {
	const iam = new IAM;
	const iamRoleNames = new IAMRoleNameCollector(iam);
	it('test', async ()=> {
		const result =  await iamRoleNames.listRoleNames();
		expect(result).toConatin('ec2-role');
	})
}) 

```

- テスト対象の関数が含まれる関数

`./src/index.tx`

```tsx
import { IAM } from "aws-sdk";

export class IAMRoleNameCollector {
	readonly iam: IAM
	roleNames: null | Promise<any>;

	constructor(iam: IAM) {
		this.iam = iam;
		this.roleNames = null;
	}

	async listRoleNames () {
		return this.roleNames = await this.iam.listRoles()
			.promise()
			.then(data => {
					return data.Roles.map(roleInfo => {
						return roleInfo.RoleName
					})
			})
			.catch(err => {
					return err;
				}
			)
	}
}
```

## テストの実行

いよいよ、テストを実行してみます。
下記コマンドを入力すると、テストが実行されて結果が表示されます。


```console
$ npm run test 

> XXXXX@1.0.0 test /Users/XXX/Documents/XXXXX
> jest

 PASS  __tests__/index.spec.ts (7.146s)
  the test of IAMRoleNameCollector
    ✓ test (896ms)

  console.log src/index.ts:60
    [
      'ec2-role',
    ]

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        8.517s
Ran all test suites.
```

## まとめ

今回はjestを使ってかんたんに非同期関数をテストしてみました。
公式リファレンスも充実しているので、他に気になったことがあればぜひ参考にしてみてください。

Getting Started · Jest 
https://jestjs.io/docs/ja/getting-started
EKSで機械学習 #2 クラスター作成編

# はじめに
このシリーズでは Amazon EKSで機械学習を行っていきたいと思います

# シリーズ目次
EKSで機械学習 #1
EKSで機械学習 #2 クラスター作成編 (この記事)

# この記事の目的
EKSクラスターを作成します。
クラスターは eksctlを使って行います。
美しくつくることが目的ではないので、最低限の設定でクラスターを作成し、
あとは必要に応じてCLIやGUIで追加設定を行う予定です。

# eksctlを使って、EKSクラスターを作成する
eksctl自体の使い方はこちらを参照 - https://eksctl.io/

```eksctl create cluster --name=ml --version=1.14 --without-nodegroup --region=us-west-2 ```

バージョン 1.14で、クラスター名が ml で、node-groupは作成しない。という設定で作る。
ここでは詳細説明はしないが、内部的にはCloudFormationが動いているので、エラーが発生した場合はCloudFormationの管理画面を見て解決する必要がある。

完成までに15分くらいかかるのでじっと待っておく必要あり。
権限エラーが出た場合は、自分のIAMユーザの権限を確認しておくこと。
デフォルトでは、Cloud9に割り振られる権限は、自分のIAMユーザの権限になっているため、
例えば、Cloud9のEC2のIAMロールに管理者権限が付加されていても、自分のIAMユーザの権限が弱い場合は、それで上書きされるので、CloudFormationを実行できず、権限エラーが発生することがある。


アウトプットはこんな感じになる

```
[ℹ]  eksctl version 0.13.0
[ℹ]  using region us-west-2
[ℹ]  setting availability zones to [us-west-2d us-west-2b us-west-2a]
[ℹ]  subnets for us-west-2d - public:192.168.0.0/19 private:192.168.96.0/19
[ℹ]  subnets for us-west-2b - public:192.168.32.0/19 private:192.168.128.0/19
[ℹ]  subnets for us-west-2a - public:192.168.64.0/19 private:192.168.160.0/19
[ℹ]  using Kubernetes version 1.14
[ℹ]  creating EKS cluster "ml" in "us-west-2" region with 
[ℹ]  if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=us-west-2 --cluster=ml'
[ℹ]  CloudWatch logging will not be enabled for cluster "ml" in "us-west-2"
[ℹ]  you can enable it with 'eksctl utils update-cluster-logging --region=us-west-2 --cluster=ml'
[ℹ]  Kubernetes API endpoint access will use default of {publicAccess=true, privateAccess=false} for cluster "ml" in "us-west-2"
[ℹ]  1 task: { create cluster control plane "ml" }
[ℹ]  building cluster stack "eksctl-ml-cluster"
[ℹ]  deploying stack "eksctl-ml-cluster"
[✔]  all EKS cluster resources for "ml" have been created
[✔]  saved kubeconfig as "/home/ec2-user/.kube/config"
[ℹ]  kubectl command should work with "/home/ec2-user/.kube/config", try 'kubectl get nodes'
[✔]  EKS cluster "ml" in "us-west-2" region is ready
```

# まとめ
今回は eksctl を使って、EKSクラスターのみを作成しました。
次回は、worker nodeを作成しようと思います。
Dockerコンテナ上で、変更があるコンポーネントのdirだけterraformコマンドをうって回るmakeコマンドを整備する

## はじめに
こんにちわ！都内でエンジニアをやっている、これからSREをやっていきな[nari](https://twitter.com/fukubaka0825)と申します。
最近記事が書けてなかったんですが、3月から新しい職場ということもあって、今週は前職で作ったものの供養に５つくらい記事を書いていきたいと思います。

## 何を作ったか
Terraformでインフラをコード管理していて、以下の図のように細かいコンポーネントに分けて管理している場合、
pullrequestを打つ前にローカルでそれぞれのdirにcdしてterraformコマンドを打ってほしい(plan-allコマンドがほしい)ケースが多くあると思います。
![スクリーンショット 2020-03-02 01.14.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/b390d270-56d5-abca-de45-30fd9a8bf02c.png)

コンポーネントを分ける話の詳細 -> [Terraformのコンポーネント分割について検討する](https://qiita.com/fukubaka0825/items/103c900a4072121bb4ae)

今回は、今まで個人利用の範囲ではBashscript書いてmakeコマンド(make plan/all)で直接呼び出していたものを、**チームに共有するにあたってwindowsユーザーも使えるようにdockerコンテナを立ち上げてそこでterraform planを打つように変更したので、その仕組みを共有したいと思います。**


# ファイル構成
- 構成としては、Dockerfileとplan_all.shとMakefileを作成していきます

```Dockerfile:Dockerfile
FROM hashicorp/terraform:0.12.xx

COPY . .
#大元のimageのENTRYPOINTを消す
ENTRYPOINT [] //❶
```
❶: hashicorp/terraformのイメージは、ENTRYPOINT ["terraform"]が設定されているので、docker runのフラグ(--entrypoint)で上書きするか、ここで[]で上書きしてしまう(実行をCOMMAND側に寄せる)のが良いと思います。

```sh:scripts/tf/plan_all.sh
#!/bin/sh -xe

export EXCLUDE_DIRS='^\.|scripts|modules|config|app|slack_bot_cdk|dockerfiles|event_pattern'
DIRS=$(git --no-pager diff HEAD --name-only | xargs -I {} dirname {} | egrep -v "$EXCLUDE_DIRS" | uniq) //❶
if [ -z "$DIRS" ]; then echo "No directories for plan."
	exit 0
fi
for dir in $DIRS //❷
do
	echo $dir
	(cd $dir && terraform init -input=false -no-color)
	(cd $dir && terraform plan -input=false -no-color)
done
```
❶: EXCLUDE_DIRSで指定したdir以外にHEADとの差分があるdirの名前をDIRSに代入しています
❷: DIRSそれぞれでterraform planを打って回ります

```Make:Makefile
build/tf:
	docker build -f dockerfiles/tf/Dockerfile -t vk-tf:latest .\
		--cache-from vk-tf:latest
plan/all:
	make build/tf
	docker run -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" \
		vk-tf:latest scripts/tf/plan_all.sh //❶
```
❶: 定義したDockerfileのimageをbuildして、そいつを起動して作成した`scripts/tf/plan_all.sh`を打っています。実際のオペレーションとしては、実行したい環境のAWSのENVをセットして`make plan/all`を打てば差分のあるコンポーネントでだけterraform planを打ってくれる感じになります

## 最後に
コンポーネント分けた+[terragrunt](https://terragrunt.gruntwork.io/)などのツール入れたくない場合に結構有効かなと思うので是非使ってみてください。
【Gimp】「修復ブラシ」で写真のストローを目立たなくして消してみた

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️GIMP 2.10


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">💃Gimp💃<br>Gimpの🖌️修復ブラシ🖌️を使って写真🥤のストローを目立たなくして消してみたよぉ😍<br>簡単にできた🍹<a href="https://t.co/4BWiOBDJ0H">https://t.co/4BWiOBDJ0H</a> <a href="https://t.co/A0Cpu0dqPL">pic.twitter.com/A0Cpu0dqPL</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1234157265080315905?ref_src=twsrc%5Etfw">March 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Gimpの修復ブラシを使って、ストローを目立たなくして、消していきます
<img width="466" alt="スクリーンショット 2020-03-01 18.59.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/6c2d64c8-4b1a-f132-2f03-796ebdaf43d2.png">


1.まず、Gimpに、加工前の画像を取り込む
<img width="1083" alt="スクリーンショット 2020-03-01 19.01.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/84d0e6f6-53dc-e5a3-28ad-be5bfc0d58f4.png">

2.修復ブラシを選択し、ブラシの大きさを選択して、ブラシのサイズを「５０」にする
<img width="45" alt="スクリーンショット 2020-03-01 19.59.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/b59e4b6f-9095-ce95-14ed-c33a5fb09e85.png">
<img width="1210" alt="スクリーンショット 2020-03-01 19.05.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/7e19d854-d341-89b9-d7d3-182535ce760b.png">

3.「Command」ボタンを押しながら、コピー元の画像をクリックする
<img width="297" alt="スクリーンショット 2020-03-01 19.49.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/64efe16b-3855-a6ee-7019-bf419cafce0a.png">

<img width="801" alt="スクリーンショット 2020-03-01 19.50.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/cef842ea-1cc4-c02a-2f90-56ce0a300cee.png">

4.消したいストローをクリックして、ドラッグしていく。
<img width="771" alt="スクリーンショット 2020-03-01 19.51.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/f945477d-1852-de12-8dfb-5419a9daee8e.png">

ドラッグしながら、ストローを消していく
<img width="751" alt="スクリーンショット 2020-03-01 19.53.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/9d7f1bb3-3b9d-8a46-f98e-46b4be43a061.png">


完成！
![sutoro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/12aeb70f-4608-4103-46b1-20039aacd43e.png)
Mac Laravelの環境構築を行う

# 目的

- 初心者向けの環境構築方法をまとめる

# 実施方法概要

1. PHPのパッケージ管理プログラムComposerのインストール
1. laravelのインストール
1. 確認

# 実施方法詳細

1. PHPのパッケージ管理プログラムComposerのインストール
    1. 下記リンク先にアクセスする。
        - [https://getcomposer.org/download/](https://getcomposer.org/download/)
    1. リンク先の「Manual Download」に記載されているバージョン名部分をクリックする。(今回は1.9.3をダウンロードする。)
        ![スクリーンショット 2020-02-27 22.57.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d94870d7-45c4-644f-002b-e9072f017e41.png)
    1. ダウンロードが開始される。
        ![スクリーンショット 2020-02-27 23.00.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0cf66ce5-d287-9093-e71c-5eb70521450b.png)
    1. ターミナルで下記コマンドを実行してダウンロードしたファイルを然るべき場所に設置する。。パスワード入力を求められたら入力する。

        ```terminal
        $ cd ~/Downloads
        $ sudo mv composer.phar /usr/local/bin/composer
        ```

    1. 下記コマンドを実行して先に場所を移動したファイルのパーミッションを設定する。

        ```terminal
        $ chmod a+x /usr/local/bin/composer
        ```

    1. 下記コマンドを実行してComposerのインストールを確認する。

        ```terminal
        $ composer -v
        ```

1. laravelのインストール
    1. 下記コマンドを実行してlaravelをインストールする
        - 下記コマンドでエラーが出た方はこちら
            - [Mac Laravelの環境構築時にエラーが出た話 vol.1](https://qiita.com/miriwo/items/879f0f54be2d3a6bfa44)

        ```terminal
        $ composer global require laravel/installer
        ```

    1. 下記コマンドを実行してlaravelコマンドのパスを通す。

        ```terminal
        $ echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile
        $ source ~/.bash_profile
        ```

    1. 下記コマンドを実行してlaravelコマンドのパスが通っているか確認する。command not foundが出力されなければOKである。

        ```terminal
        $ laravel
        ```

1. 確認
    1. 任意のディレクトリに移動してから下記コマンドを実行してアプリ作成が行えるか確認する。

        ```terminal
        $ laravel new test_app
        ```

    1. 下記コマンドを実行してtest_appを起動させる。

        ```terminal
        $ cd test_app
        $ php artisan serve
        ```
    1. 先のコマンドを実行して下記のように出力されたことを確認する。

        ```terminal
        Laravel development server started: 任意のURL
        [Fri Feb 28 01:14:53 2020] PHP 7.4.3 Development Server (任意のURL) started
        ```

    1. 先の出力の「任意のURL」をコピーしてブラウザで開く。
         - 筆者の場合は[http://127.0.0.1:8000](http://127.0.0.1:8000)だった 
    1. ブラウザにて下記の画面が表示されたら環境構築は環境である。

        ![スクリーンショット 2020-02-28 1.17.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/4f382833-8cdd-f5dc-0cdb-f5f4a6217eac.png)
WinFormsでリフレクション


# カルチャの変更
```
Thread.CurrentThread.CurrentCulture = new CultureInfo("en");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
```


# Assemblyの取得
```
var assembly = System.Reflection.Assembly.Load("TargetApp");
```


#型の列挙
```
assembly.GetTypes()
```

#FormとUserControl以外はじく
```
if(!(type.IsSubclassOf(typeof(Form)) || type.IsSubclassOf(typeof(UserControl)))) continue;
```

#インスタンス化
```
var instance = Activator.CreateInstance(type);
```

#コントール列挙
```
foreach (FieldInfo memberInfo in ti.DeclaredFields)
{
    var declareField = memberInfo.GetValue(instance);
}
```

#Formキャプチャ
```
Bitmap bmp = new Bitmap(form.Width,form.Height);
form.DrawToBitmap(bmp, new Rectangle(0, 0 ,form.Width, form.Height));
bmp.Save(type.FullName + ".bmp");
```

#UserControlをFormに追加してキャプチャ
```
var userControlForm = new Form();
userControlForm.ControlBox = false;
userControlForm.Controls.Add((UserControl)instance);
userControlForm.Show();
Bitmap bmpUserControl = new Bitmap(userControlForm.Width, userControlForm.Height);
userControlForm.DrawToBitmap(bmpUserControl, new Rectangle(0, 0, userControlForm.Width, userControlForm.Height));
bmpUserControl.Save(type.FullName + ".bmp");
userControlForm.Close();
```
MroongaのNATURAL LANGUAGE MODE検索スコアが短queryでは変

2020-02、2つのMroonga記事を書いている間に気づいた検索スコアの話です。

- [Aurora MySQLのtextをEC2 MariaDBレプリカでMroonga全文検索](https://qiita.com/masudakz/items/1afafcca1c01d8b9c276)
- [MroongaのNormalizer/Tokenizer/TokenFilter](https://qiita.com/masudakz/items/b09ec98031455f30330b)

# score がなんか変

```sql
> SELECT t_stringvalue,MATCH(t_stringvalue) AGAINST("作業場所") AS score
  FROM t_tagproperty
  WHERE MATCH(t_stringvalue) AGAINST("作業場所")
  ORDER BY score DESC LIMIT 5;
+---------------------------------------+-------+
| t_stringvalue                         | score |
+---------------------------------------+-------+
| iOS標準ディレクトリ：ファイルの保存場所  |  6513 |
| 本体工(場所打ち）                      |  6513 |
| 作業場所の整地                         |  6513 |
| 作業場所の地耐力を事前に確認すること。   |  6513 |
| 作業場所の整地                         |  6513 |
+---------------------------------------+-------+
```

- 検索query "作業場所" はトークン2つ"作業","場所"になってる様子
- "場所"しかhitのない1行目2行目のscore=6513
- "作業"と"場所"の2つhitした3-5行目も score=6513

# Mroongaのスコア仕様

参照:[5.7.2. Mroongaにおける検索スコア](https://mroonga.org/ja/docs/reference/full_text_search/scoring.html)

> 上位N個のトークンを取り出す N = マッチしたトークン数 / 8 + 1

なるほど。query のトークン数8を超えるまで最上位重みのトークン1つしか計算しない仕様です。"作業"と"場所"の両方を含んでもscoreで上位に来ないのはこの仕様のためです。
どうやら「関連文書検索」のようにqueryがとても長いケースを想定しているのが、 `IN NATURAL LANGUAGE MODE` のようです。long query x long results の score 計算量を抑制する意図が見えます。

# MroongaのBOOLEAN MODE推し

https://mroonga.org/ja/docs/reference/full_text_search/boolean_mode.html

> デフォルトの IN NATURAL LANGUAGE MODE よりも IN BOOLEAN MODE の方が適切です。なぜなら IN BOOLEAN MODE はWeb検索エンジンのクエリーと似ているからです。多くのユーザーはWeb検索エンジンのクエリーに慣れています。


BOOLEAN MODE での hit , miss, OR, AND, negative くらいで足りるし、結果がわかりやすいって判断ですね。

# 結論

`IN NATURAL LANGUAGE MODE` のスコアをHitトークン数が8以下のときのロジックを少し修正して、Hitトークン数を反映することは不可能ではないでしょう。でもやる意味があるかというと疑問です。

queryのトークン数が少ないときの検索者の意図は、どのトークンも重みは同じじゃないでしょうか。
データベースの統計情報から計算して、どれか1つのトークンだけ差別的に重みをつけてもありがた迷惑かなと思います。推されるとおり `IN BOOLEAN MODE` で使うことにします。

データベースが大きくて、short query だと1位タイのhit多数になるケースが多いでしょうが、そのときの `ORDER BY` でのメインは、 `IN BOOLEAN MODE` の score でも、 `IN NATURAL LANGUAGE MODE` の score でもない、第2キーのなにか別の文書属性になるでしょうから。
`Timestamp` とか `Stars` とか `Recommends` とか

※世紀の変わり目には `TF*IDF` の検索スコア実装したのを担当してました（Okapi BM25も試してたっけ？）。20世紀は遠くなりにけり
【Python GUI】Tkinterを使ったDICOMのコントラスト調節とBMP変換

#目的

- <b>コード保存。中身は汚い。</b>
- DICOM画像を任意のコントラストに調節しBMPに保存。
- コントラスト調節の式が怪しいかも。

詳しい解説とコードは[【Python GUI】Tkinterを使ったDICOMのコントラスト調節とBMP変換](https://www.aiprogrammers.net/entry/2020/04/19/014952)をご覧ください。
vim用にGroovy Language Serverを設定する

vimでGroovyを書くためにLanguage Serverを設定したときにちょっと詰まったところがあったのでメモしておきます。

# まずGroovyのインストール

macの場合です。Homebrewからインストールして適切にJAVA_HOMEを設定すればオッケーです。私の場合はHomebrewで入れたopenjdkが入ってたのでそちらに向けました。openjdk@11でも動くようです。

```
$ brew install groovy
$ export JAVA_HOME=$(/usr/libexec/java_home -v 13)
```

インストールできたらバージョンが表示できるはずです。

```
$ groovy -v
Groovy Version: 3.0.1 JVM: 13.0.2 Vendor: Oracle Corporation OS: Mac OS X
```

# Groovy Language Serverのbuild

プラグインとしてvim-lspを使っているので各言語での設定が書いてある[wiki](https://github.com/prabirshrestha/vim-lsp/wiki/Servers-Groovy)に従って設定します。今回はやってませんがmattnさんの[vim-lsp-settings](https://github.com/mattn/vim-lsp-settings)を使うのもありだと思います。

ホームディレクトリ直下に.lspディレクトリを作ってその中にgroovy-language-serverのリポジトリを追加します。(wikiではlspディレクトリとなってますがなんとなく.lspにしています。)

```
$ mkdir ~/.lsp
$ cd ~/.lsp
$ git clone https://github.com/prominic/groovy-language-server
$ cd groovy-language-server
```

次にbuildしたいのですがどうやらJAVA_HOMEがJava13に向いている状態だと失敗するようです。(本当か？)
あまり複雑なことはしたくなかったのでdirenvでリポジトリ内だけJAVA_HOMEがJava11(openjdk@11)を向くようにしてからbuildすると成功しました。

```
$ export JAVA_HOME=$(/usr/libexec/java_home -v 11)
$ ./gradlew build
```

build/libs/groovy-language-server.jarというjarファイルができたら完了です。
__リポジトリ側のREADMEにはgroovy-language-server`-all`.jarができると書いてますが`-all`はつかないjarファイルができるので注意してください__

# Groovy Language Serverを動かす

jarファイルなのでjavaコマンドで実行するだけです。

```
$ java -jar ./build/libs/groovy-language-server.jar
```

vimへのLanguage Server登録も忘れずに。

```
if executable('java') && filereadable(expand('$HOME/.lsp/groovy-language-server/build/libs/groovy-language-server.jar'))
  autocmd User lsp_setup call lsp#register_server({
        \'name': 'groovy-language-server',
        \'cmd': {server_info->[
        \  'java',
        \  '-jar',
        \  expand('$HOME/.lsp/groovy-language-server/build/libs/groovy-language-server.jar')
        \]},
        \'whitelist': ['groovy']
        \})
endif
```

なんらかgroovyのファイルを開いて`:LspStatus`をチェックしてください。こんな感じになれば動いてます。groovy-language-server.jarの実行を自動で行うようにしておくのもありかなと思います。
<img width="462" alt="スクリーンショット 2020-02-23 13.30.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333558/037d8248-1694-13de-cd07-e3cc85f7dbe1.png">

# 感想

groovyちょっと楽しいです。

# 参考記事

https://tech.recruit-mp.co.jp/server-side/happy-groovy-life/
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

タイトルのエラーだとmysqlが起動してなかったり、ファイルがなかったり、という理由でエラーが出ることが大半だと思いますが、Railsのdatabase.ymlが未設定でも起こります。
30分くらいハマってしまいました。

db:createしたときにおこりました。

```/config/database.yml

// 次を書き換えることが必要。これをしないとdb:createでこける。
// 一例。デフォルトだとhost:はlocalhost
  password: xxxxx
  host: mysql
```

参考
[rails5のDockerfileとdocker\-compose\.ymlを書く \- Qiita](https://qiita.com/yoshinyan/items/e1f801d6df422d5b7f88)
ksnctf 24 Rights out

#ksnctf 24 Rights out
* 問題
    * http://ksnctf.sweetduet.info/problem/24
* パズル
    * 十字方向で反転するやつ
    * 解いても特になにもなし<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416717/561ae247-d969-3b6d-b70b-c5fbc5eb0a57.png)
* .exeファイル
    * binwalk<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416717/e061dc72-d18d-f7f4-0055-53032accc056.png)
        * .xmlあるので拡張子変えて開くが特になにも分からない
    * ILSpyで逆コンパイル
        * .exeファイルが渡されたら逆コンパイルできるかどうか考えるのがよい
        * 逆コンパイルしたものを一通り読む。check()の中でフラグが作られてそう
        * check()の中だけ抜き出す
        * C#よくわからないのでC++に直して実行<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416717/50d2e622-7251-0025-a756-6e6ed38b2c44.png)
EKSで機械学習 #1 準備編

# はじめに
このシリーズでは Amazon EKSで機械学習を行っていきたいと思います

# シリーズ目次
EKSで機械学習 #1 準備編 (この記事)

# この記事の目的
EKSを構築するための環境作成を行います

## Cloud9の作成
このシリーズでは、Oregon リージョンを利用しているため、
Oregon リージョンにCloud9環境(Amazon Linux版)を作成します。
(作成方法自体は省略します)

こんな感じのイメージです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107953/a7cf42e4-4af3-5b6c-9243-3cba6feb6e46.png)


## k8s/EKS関連ツールのセットアップ
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started-eksctl.html
これを参考にしてツール郡をセットアップします
具体例には以下の手順に従います

- 最新の AWS CLI をインストールする
- AWS CLI 認証情報を設定する (この部分は、Cloud9を利用する場合は設定済みなので、スキップできるはずです)
- eksctl をインストールする 

## kubectl/aws-iam-authenticator をインストールして設定する

具体的にはここを参照。最新のバイナリでOK

- https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/install-kubectl.html
- https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/install-aws-iam-authenticator.html)


(これは参考) ``` echo "alias k='kubectl'" >> ~/.bashrc ``` と入力しておくと、kubectl が k だけの入力で済むようになる。
 
# まとめ
次回以降で行う予定のEKSクラスター作成の準備ができました。
AI×ブレスト

## 概要
なんか面白いサービスないかな、って思ってたらこの記事で見つけました。

　　[アイデアが思いつかないときは、どこにいけば良いのか？](https://note.com/nzmt_i2o3/n/n241f56dc27f9)

その中で紹介されている[「AIブレストパーク」](https://ai-b-spark.com/main)をやってみた。

Googleアカウントあれば、無料で2週間フル機能使えるっぽいです。
その後も限定的ですが、無料でいくつか使えます。

## AIブレストパークって？

**AIが一緒にブレストやってくれる**サービスです。
とりま、つまらなそうなテーマ「テレワーク」でやってみた（笑）
どこまで広がるかな～。

- **デフォルト発想**
![01_AIブレスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384185/23c9a6bb-21b1-2f1f-8569-b806697d27b7.png)

　うん、普通。水道光熱費くらいか。
　テレワークで会社の光熱費下がってるんだから、自宅補助増やしてよ的な交渉とかいいかも。

- **「主婦アタマ」にしてみた**

　大したことないのでは？って思ったけど…おお、面白い。

  ![02_atamahenko_syufu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384185/9b68b215-4b03-9109-dfc3-f8fa732c8a1c.png)

　習い事が多めに出るのね。なるほど、これはおもろい。
　左利きの長男とかウケるｗｗｗｗその発想はなかった。
　確かにテレワーク要素で左利きのことをより気にしなくて良くなるのかも。
　電車、固定電話、隣の人とのぶつかり合い、etc
  
- **「ビジネスアタマ」にしてみた**

　おお、意外と面白い。
　サーバントリーダーシップが出てくるのね、なんでだろう。
　シニア活用はマジで謎。テレワとは遠いところにいる人たち…だからこそなのかな？
　９割の人がテレワについていけそうもないけど…。

- **「作詞家アタマ」にしてみた**

　これは期待！！！！
　![03_sakushikaatama.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384185/30e2210e-6995-acf6-6222-15c4fd40b2c2.png)

　あ、残念…。


それ以外に右側には、ワードやフレーズ生成機能があるのね。
気になったモノを羅列してみます。

- **やけに人間くさいテレワーク**
- **テレワーク看板娘**
- **デート専用テレワーク**
- **風雲児のテレワークがきっとやけに人間くさくする**
- **テレワークな軽労働と縁な五感が出会いました**
- **まぶしい透明感のオルタナティブはテレワークです**

うん、これは面白い。

## 結論

AIに兎角つきまとう**「ロジックが不明瞭で信用していいのか」**というフレーズ。
不明瞭≠信用の理論と対極寄りにあるのが、**自由発想を求める「ブレスト」**。
**親和性良いこの組み合わせ、よく考えたな～**って思いました。
Google Cloud RunでRubyを使ってGoogleドライブにアクセスする（サンプル付き）

# 背景

[Google Cloud RunでRubyを使ってFirestoreにアクセスする（サンプル付き）](https://qiita.com/skuroki@github/items/339e404d19e39b21911d)の続きです。

元々解決したかったのは「Googleドライブのための認証を行う時にファイルへの書き込みを行っていた」のをどうやってCloud Runに持ってくるかという話でした。

認証情報の保存方法は[ファイル](https://github.com/googleapis/google-auth-library-ruby/blob/master/lib/googleauth/stores/file_token_store.rb)と[Redis](https://github.com/googleapis/google-auth-library-ruby/blob/master/lib/googleauth/stores/redis_token_store.rb)の2通りがあります。

先述の通りCloud Runの仕様上ファイルへの書き込みは止める必要があり、Redisは

* Memorystore for Redisには無料枠がないっぽい
* GCEのVMインスタンスにRedisを立てても、Cloud Runから内部ネットワーク経由でアクセスする方法がないっぽい

ために諦め、TokenStoreの実装は難しくなかったので、Firestoreを使うTokenStoreをでっち上げて使う方法を試してみた所、うまく行きました。

# サンプル

https://github.com/skuroki/stateless_google_drive_access

# 動かし方

[前回の記事](https://qiita.com/skuroki@github/items/339e404d19e39b21911d)と異なる点のみ記載します。

## Googleドライブとの連携の設定

[Developer Console](https://console.developers.google.com/)から`OAuth 2.0 クライアント ID`を開きます（作ってないなら作る）。

<img width="1089" alt="クライアント ID" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17353/64370440-3735-ad3d-bec4-d1e94f125f46.png">

`クライアント ID`と`クライアント シークレット`を確認します。

Cloud Runでのサービス起動時に

<img width="449" alt="環境変数" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17353/ca15fcaf-c19f-2894-1bf9-7bd0b43bc3a8.png">

環境変数に`クライアント ID`と`クライアント シークレット`を設定します。

## （無理やり）ブラウザから操作する

<img width="503" alt="statelessg…iveaccess_–_サービスの詳細_–_Cloud_Run_–_kokkai-iinkai_–_Google_Cloud_Platform.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17353/5b5fc1b6-204c-db8a-4b15-a45b62510d50.png">

OAuth2の認証を利用する都合、ブラウザから操作する必要があります。

ブラウザからのリクエストにヘッダ項目を追加できるプラグインを使います。私は[ModHeader](https://chrome.google.com/webstore/detail/modheader/idgpnmonknjnojddfkpgkljpfnnfcklj/related?hl=ja)を使いました。

Cloud Shell上で`gcloud auth print-identity-token`コマンドを実行してトークンを取得したあと、追加のリクエストヘッダを設定して

<img width="576" alt="リクエストヘッダ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17353/8a8e7312-cef5-93da-83c0-04187411f2ca.png">

サービスのURLを開きます。

リンク先で認証を行って、コードをコピーして、元のページのコード入力欄にペーストして、送信します。コピー元で改行になっていたところにスペースが入っているかもしれないので、そこは削除しましょう。

<img width="302" alt="Hello_Google_Drive.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17353/6ff1ede8-548d-bdbe-0cdb-8e17417f6b6b.png">

Googleドライブのファイルの名前が一覧表示されます。

## Firestoreに保存された認証情報

<img width="829" alt="kokkai-iinkai_–_Firebase_console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17353/5030dda5-821a-37af-2cb6-84d67d8f41ed.png">

このように、認証情報が保存されています。
【Deep Learning】SONY neural network consoleをCUIから実行

#コード内容
<b>コード保存のため投稿。</b> コードは汚い。
SONYが開発した、neural network console(NNC)をCUIから実行。SONYが提供しているNNablaライブラリを使用する。

詳しい解説とコードは[【Deep Learning】SONY neural network consoleをCUIから実行](https://www.aiprogrammers.net/entry/2020/04/19/013538)をご覧ください。
RSSの表示の仕方(express,node.js)

express(express-generator)を使って東京メトロのリリースニュースを表示します

#xmlモジュールのインストール

```bash
npm install --save xml2js
```

#xmlを使っているサイトを見つける
今回は、
https://www.tokyometro.jp/news/rss/news.xml
このサイトを使います。

#モジュールのロード
router内のjsファイル内で

```javascript

var http = require('https');
var parseString = require('xml2js').parseString;
```

途中です。
【RDS】Remote Desktop Servicesのお勉強

#はじめに
数年前に先輩からこれから流行るよ、と言われていた RDSシステム。
最近携わることがあったので、勉強がてらにまとめてみました。

#リモートデスクトップサービスってなあに？
「*リモートデスクトップサービス*」と聞くとわからない人がいるかもしれませんが、
「**リモートデスクトップ接続**」と聞くと馴染みのある方は多いはず。

リモートデスクトップ接続は、操作端末のローカルPCから
ネットワーク接続ができ、かつリモートデスクトップを有効化している端末、サーバに
リモートからログインできて使用できる機能ですね。
プライベートでは使用する機会はなくとも、仕事で使用する人は多いですよね。

リモートデスクトップサービスはそれの応用編みたいな感じで、
ローカルPCからリモートでサーバに接続して、
サーバ上で作業ができるという便利システムです。
*（超大まかな説明ですが）*

#リモートデスクトップサービスを使ってみた所感
私が実際に構築して、テストをしてみた感想を書きます。
1. インターネット接続をリモート先（RDS）のみに許可する場合、サーバーのセキュリティだけ強力にすれば良いので、運用が楽
2. 操作ログなどがサーバー上に残るので、ログの管理なども楽
3. サーバーのOSを使用できるので、ローカルPCのOSが低くても最新のOSを使用できたりする

#リモートデスクトップサービス構成のそれぞれの役割
##ゲートウェイ
私は使用したことが無いが、ゲートウェイというだけあり、
*RDPをSSL（Secure Sockets Layer）でカプセル化し、ファイアウォール越えを容易にすると共に、証明書によるサーバー認証やネットワークアクセス保護（NAP）で内部リソースを保護する*らしい。（[引用：日経XTECH](https://xtech.nikkei.com/it/article/COLUMN/20100526/348494/)）
要約すると、接続を強化するということですかね。

##接続ブローカー
各セッションホストサーバーの負荷状況により、
ユーザーのアクセスを負荷の少ないセッションホストサーバーに負荷分散する機能。
ユーザーは一度接続ブローカーに接続して、セッションホストサーバーに接続する。
※試しに「localhost¥administrator」で接続すると、セッションホストサーバーに「<接続ブローカーのホスト名>¥administrator」でログインしようとして失敗していた。

##Webアクセス
ユーザーが許可されたリモートサービスをWebブラウザにてショートカットを取得できるために必要。

##ライセンス
リモートデスクトップサービスを使用するためには、CALと言う、ユーザーあるいは(クライアントの)デバイスごとのライセンスが必要。
そのライセンスの管理をしてくれる。

##セッションホスト
ユーザーが接続する先のサーバー
大規模なシステムであれば、セッションホストサーバーは何十台とあるはず
多くのユーザーが同時接続することを踏まえて、スペックを高くすると良い。

#簡単な構成図（自分なり）
ゲートウェイはあんまり理解できていないので、書き忘れてました。
もうちょっと勉強してから追加します。
<img width="1112" alt="IMG_0254.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505630/34435e85-b865-47fb-4560-633c030c7be4.jpeg">

#おわりに
実際に構築して、使用してみると家でも使いたくなります。
（2015年に購入したMacBook Airを使用しているので、ポンコツに。。）
下記のメモにも書いてますが、azureと連携しているらしい。
是非使ってみたいし、CALはごまかせる程度にazureもお金がかからない程度に構築してみようかな。


#備考
RDSのサービスをインストールするためには、
**サーバーがドメイン参加していないといけない**。
既存環境のAD無しで構築する場合は注意が必要。

#参考
[Mirosoftのマニュアル](https://docs.microsoft.com/ja-jp/windows-server/remote/remote-desktop-services/rds-supported-config)

#メモ
[azureと連携しているらしい](https://docs.microsoft.com/ja-jp/windows-server/remote/remote-desktop-services/rds-integrate-with-azure)ので、是非やってみたい。
AWSソリューションアーキテクト試験の対策方法

## はじめに

2020年3月22日以降は、現行の試験内容がアップデートされるとのことなので
下記の対策方法が必ずしもフィットするとは限りません。

## AWS Certified Solutions Architect - Associate とは

そこかしこで詳しく記述されていると思われるので割愛。以下ではSAAと記述します。

## 前提

- 筆者
  - AWSを使用した簡単なシステム構築経験アリ
  - 下記対策でSAA合格
      - 勉強時間はおおよそ、通勤時間と土日を使い1ヶ月程度
      - 正直なところ、AWS未経験でもITに関する基礎知識が多少あれば下記対策で合格可能と思います
- 下記対策で落ちたとしても知ったこっちゃないので、そこはよしなにお願いします

## 具体的な対策方法

- AWS使用経験がある場合

 1. [ここ](https://aws.koiwaclub.com/) のWEB問題集（80～129番）をひたすら解き続ける
 2. 間違えた問題を解き直す

- AWS使用経験が無い場合

 1. 参考書を買う
     - 教本は3種類ほどあったと思いますが、自分で良いなと思ったものを選べば良いと思います
     - その教本でサービス内容を抑える
 2. 教本を読み終えたら
     - [ここ](https://aws.koiwaclub.com/) のWEB問題集（80～129番）をひたすら解き続ける
 3. 間違えた問題を解き直す

以上です。共通して言えることは、WEB問題集を解き続けることです。
なお、私はエクセルで正誤を管理しながら、不正解の多い問題番号を繰り返し解き直しました。
\# これ、結構面倒なので運営側は個々人の解答履歴を管理してもらいたいもの。今後のアプデに期待。

## 備考

- 上記サイト（「[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)」 通称：小岩）
  - 有料コンテンツ。最低プランで4300円ほどかかる
      - とは言え、後述の参考書＋模擬試験の費用に鑑みれば妥当な価格設定かと
      - SAAなら60日のゴールドプランで良い気がしますが、お好みで
      - なお、私はこのサイトの回し者じゃありません
  - AWSの公式ドキュメントを基にした問題が900問近く揃えられている
      - 問題集番号の80～129番を2周ほどすれば良い通説アリ
          - 80～129番を重点的に解けば良い通説は出処が不明
          - 時間があれば1から順に解くと良いと思います（私は80～129番を2周しました）
  - **答えを覚えるのではなく「なぜそうなるのか」をしっかり理解する**

- 類似サイト
  - [AWS認定資格 無料WEB問題集＆徹底解説](https://aws-exam.net/saa/saa_question.php)
      - なんと無料
      - 合格後にたまたま見つけたもので、有用性は不明
      - 多分似たようなサイトは、私が知らないだけで山のようにあるのかも

- 公式模擬試験
  - 個人的に受ける必要ないと思います
  - 上記サイトの「AWS認定本試験モード」と言った似たような機能があります
      - これで代替可能かも:thinking_face:？
      - ただし、この認定本試験モードは受験後に解答を出してくれないのがかゆい…（運営側のアプデに期待）

- 教本
  - 正直なところ、 **構築経験があるのなら** 買う必要はないかと
      - ググれば最新の情報が出てくる
      - 演習問題の量もたかが知れている
  - 合格自体を目的とするのであれば、教本代を上記サイトに充てるべきかなと
  - 構築経験が無いのであれば、概要を知るために買ったほうが良いかも

## おわりに

- 上述の内容がいつまで有効な対策手法であるかは不明ですが、現状かなり効果的ではないかと個人的に思います
- 今後他の資格についても、同様の対策方法で狙っていこうと思います
  - 本試験の半額バウチャーが付与されたことですし
  - 他の資格についても同様の対策で通用するか、記述するかもです
株価をダウンロードしてプロット

### はじめに

株取引を行うために統計を取りたい、と思い、株価のデータの取得方法を調べました。
株価をダウンロードしてプロットするところまでpython で動かせたので、メモします。東京証券取引所で取引されている３銘柄のデータをダウンロードして、こんな感じでプロットできました。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/ef284b61-5ad1-8759-560b-db487c9ce409.png)

何か大儲け、できないかな。。。。なんて。^^)

### Yahoo Finance からデータを取得するライブラリ

方法はGoogle先生に紹介していただいたページを拝見していろいろ調査したのですが、なかなか思うように「ここ１～２年のデータをスクリプトでダウンロードして比べる」という用途に使えなく苦労しました。Quandl, pandas_datareader などをさまよった挙句,

[yahoo-finance-api2](https://github.com/pkout/yahoo_finance_api2)

に行きつきました。ソースをみると https://query1.finance.yahoo.com/v8/finance/chart/... の応答をparse している感じです。また、リンクのgithub の READMEに書かれているUsage そのままで動きました。

### 準備

PIPでインストールできました。

```
python3 -m pip install yahoo_finance_api2
```

### 実装

README にあるUsage を少し変更しただけですが、以下の感じでプロットしました。
メモとしては、

- timestamp はミリ秒、ＵＴＣなので、日本標準時間に変更してあげる
- 各エポックについて、Open, High, Low, Close, Volume に数値があり、データが無いところは null となっている。例えば取引が無かった場合、とかでしょうか。
- 取得できる範囲が限られている感じがしました。例えば、以下のプログラムでは、1000週間のデータを要求していますが、１年ちょっとしかデータは得られていません。

```
import matplotlib.pyplot as plt
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
import pandas as pd

data_list = [ \
    ["4391.T", "LOGIZARD"], 
    ["4755.T", "RAKUTEN"],
    ["2303.T", "DAWN"]]

fig, ax = plt.subplots(len(data_list), 1, figsize=(16, 8))
for i, (company_code, company_name) in enumerate(data_list):
    my_share = share.Share(company_code)

    try:
        symbol_data = my_share.get_historical(share.PERIOD_TYPE_WEEK, 1000,
                                        share.FREQUENCY_TYPE_DAY, 1)
        df = pd.DataFrame(symbol_data.values(), index=symbol_data.keys()).T
        df.timestamp = pd.to_datetime(df.timestamp, unit='ms')
        df.index = pd.DatetimeIndex(df.timestamp, name='timestamp').tz_localize('UTC').tz_convert('Asia/Tokyo')

        ax[i].set_title( "TSE {} ({})".format(company_name, company_code))
        ax[i].plot(df.index, df.close, '.')
        ax[i].grid(True)
        ax[i].set_ylabel("Stock Price [Yen]")
        ax[i].label_outer()
        if i == (len(data_list) - 1):
            ax[i].set_xlabel("Date")
    except YahooFinanceError as e:
        print(e.message)
        pass
plt.show()
```

とりあえず動いたから良いとする。

　- 本件と関係ないですが、ググっていたら[TradingView](https://jp.tradingview.com/chart/)　という、使えればすごそうなサイトに出会いました。　
　- 当初は、Quandl を使おうと頑張りました。`pip3 install Quandl` で簡単にインストールでき、[ここ](https://www.quandl.com/tools/python) にあるとおりに動きます。ただ、最近のデータが取得できませんでした。一方、```  https://www.quandl.com/api/v3/datasets/TSE/4391/data.csv ``` のように、直接悪背うすることもできました。変数を指定して、所望のデータが得られたのかもしれません。
ラズパイでラジオを定期的に録音

#通勤時にカーナビで基礎英語を聞きたい

だいぶ前に記事を書き始めて放置してしまっていたのですが、自分の忘備録として最後まで書いてみました。

英語の勉強をしたいが、あまり自由な時間が無く、通勤時間を有効に使いたいと考えました。
通勤手段が車のため、テキストを見るような物は選択できず、基礎英語なら聞いて声を出すことで勉強になるのではと思いました。
しかし、通勤時間帯に基礎英語の放送は無いため、何か定期的に録音できる手段はないかと考えたところ、だいぶ前に購入して放置していたラズパイが使えるのではと思い立ち、いくらか調べたり、試したりすることで、とりあえず目的を達成できる状態になったので、備忘録として記載したいと思います。
ちなみに、NHKが過去1週間分の放送を聴けるサービスを実施しているので、スマホのデータ通信量に十分な余裕がある方は、そちらの方がお手軽です。私は1GBプランのため、今回の手段を検討しました。

##ffmpegで録音
最新のRaspbianであれば、「ffmpeg」がインストールされていると思いますので、特に意識せずに利用できます。
ターミナルから都度コマンドを入力してもいいですが、後で定期実行の設定をしたいので、シェルスクリプトにコマンドを記述します。

```ruby:rec.sh
#!/bin/sh
ffmpeg -i 放送局のアドレス -to 録音時間[秒] -c copy 保存ファイル名
```

私の場合、放送局は「NHKラジオ第2」、基礎英語2と3を連続で録音するため30分 ⇒ 1800秒に余裕を持たせて「2000秒」、ファイル名は日付を付けたかったため「MMDD.m4a」としています。
具体的にはこんな感じ。

```ruby:rec.sh
#!/bin/sh

ffmpeg -i https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8 -to 2000 -c copy `date "+%m%d"`.m4a
```

参考
・[らじる★らじるサービス一覧XML取得](http://www.nhk.or.jp/radio/config/config_web.xml)
・[日時をファイル名に付けるには]
(https://www.atmarkit.co.jp/flinux/rensai/linuxtips/240datefilename.html)

録音が終わった後は、NASへコピーしておいて、スマホなどからアクセスしやすく管理しています。

```ruby:filecp.sh
#!/bin/sh
sudo cp `date "+%m%d"`.m4a /mnt/NASをマウントしたフォルダ
```

NASにファイルをコピーするためには、マウントしておくことが必要です。
cifs-utilesをインストールし、ラズパイ起動時にマウントするようにfstabに下記を追記します。（******には、ご自分の環境のIDとパスワードを記載してください。）

```ruby:/etc/fstab
//NASのアドレス/マウント元フォルダ /mnt/マウント先フォルダ cifs vers=1.0,username=******,password=******,iocharset=utf8,defaults 0 0
```

下記の記事を参考にさせて頂きました。


参考
・[Raspberry Pi 3 に NAS をマウントさせる]
(https://qiita.com/fstyle/items/284508cfc33af54d826d)

後は、crontabで定期的に実行するように設定します。
私の場合は、基礎英語2、3を録音したいため毎週、月～金曜日の6時15分から録音し、
7時にNASにコピーするように設定しています。

```ruby:
15 6 * * 1-5 sh /home/pi/rec.sh
0 7 * * 1-5 sh /home/pi/filecp.sh
```

参考
・[crontabコマンドについてまとめました]
(https://eng-entrance.com/linux-command-crontab)

以上。
Git のコミットの日時を指定のものにする

# Git のコミットの日時を指定のものにする

GitHub の草の関係で指定したい場合とか.

```sh
$ git commit --amend --date="Sun Mar 1 23:59:59 2020 +0900"
$ git rebase HEAD~1 --committer-date-is-author-date
```
「文言」でレンダリング-Online IDE編　お手軽環境構築なし!

### はじめに

２０１９年末彗星のように現れた「文言/wenyan-lang〜漢文風プログラミング言語」もう試してみましたか。私は試してみました。[公式](https://wy-lang.org)のフッターには[WIKI]も増えています。
<img width="922" alt="Screen Shot 2020-03-01 at 5.05.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334227/4ceb5a14-2190-1e52-2c53-1380fef4a7c8.png">

興味はあるけれど...とまだの方にお手軽環境構築なしですぐに試せるオンラインエディターをご紹介します。

オンラインエディターが[こちらhttps://ide.wy-lang.org/](https://ide.wy-lang.org/)に引越しになりました

ソースコードも[言語本体](https://github.com/wenyan-lang/wenyan)と[別プロジェクト](https://github.com/wenyan-lang/ide)になりスタイリッシュにより使いやすくなりました。

### ポイント
:white_check_mark:テーマがライトとダーク選べる!(エディター見た目大事)
:white_check_mark:レンダリング出来る
:white_check_mark:オフラインでも使える
:white_check_mark:My Scriptsでスクリプト管理できる
:white_check_mark:実行結果とJavaScriptはすぐ見れる

### 使い方

まずはアクセスすると(:arrow_down:はdarkテーマ)こんな見た目
<img width="1429" alt="Screen Shot 2020-03-01 at 4.59.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334227/55f1277b-8248-7dbd-5ccb-6fe691248eea.png">

大きく4つのペイン(左、中央、右、下部)に分かれています

**左側**:サンプルプログラム、My Scriptsの選択
　　「+」で新しいMyスクリプト追加 
　　「↓」で編集したソース保存
**中央**:ソースコード表示、編集作業部
　　　highlight、コード補完も完備
　　　※サンプルソースはサーバーに取得に行かず、Build時に同梱の物を表示　
   「compile」でwenyanソースを右側にJavaScript変換、実行結果を下部に表示 
**右側**:wenyanソース「compile」(transpile)結果表示
　　「?」でヘルプ(link表示)　
　　「⚙」でテーマ変更など設定変更
**下部**:ソースの標準出力結果
    「Render Book」ソースの**レンダリング**
　　　※「↓」レンダリング後表示され、結果をダウンロード出来る!!!　 

### おわりに

いかがでしたか。苦労したレンダリングが2クリックで完了。拍子抜けする簡単さ。
サンプルプログラムもcontributeされ増えています。

2019年12月に使ってみた方も是非活用してみて下さい。