OmniAICreator/Qiita-1.07M huggingface dataset:
UiPath 月初日・月末日取得方法（VB.NET)

# UiPath 月初日・月末日取得方法（VB.NET)

業務自動化でよく月初日や月末日を求めることが多いため自分用のメモ

# 変数を作成

| 変数名 | 変数の型 |
| -------- | --------- |
| month_first_day| System.DateTime | 
|days| Int32 |
| month_last_day | System.DateTime |

上記の通り3つ変数を用意する。
※[追記](#追記)の最後に記載している方法を使う場合は`days`はいらないです。

![variablelist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545124/bd653a00-aaae-6cc5-d7e2-1325167e8cab.png)


System.DateTime型は 変数一覧 -> 変数の型 -> 型の参照で型の名前に入力すると出てくる。

![datatype.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545124/6c41dcd6-ca32-0482-fe58-04c60e0ee3d8.png)


# 変数の既定値を設定する

## month_first_day

```vb
new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1)
```

month_first_dayに上記を設定する。

`DateTime.Now.Year`でシステム日付の年部分

`DateTime.Now.Month`でシステム日付の月部分

最後の`1`で日付を月初にする。

![month_first_day.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545124/dc027fe4-662b-c429-bb15-f6d1b893408a.png)


## days

```
DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month)
```

daysに上記を設定する。

`DaysInMonth`は指定した年、月の日数を返します。（うるう年も計算する）

`DateTime.Now.Year`と`DateTime.Now.Month`を指定することでシステム日付の今月の日数を取得します。

![days.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545124/9ba3f5e4-7c63-1665-6f3e-48059d32085f.png)



## month_last_day

```vb
new DateTime(DateTime.Now.Year, DateTime.Now.Month, days)
```

month_last_dayに上記を設定する。

`DateTime.Now.Year`でシステム日付の年部分

`DateTime.Now.Month`でシステム日付の月部分

`days`で先ほど取得した今月の日数（最終日）を指定する。

![month_last_day.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545124/ae75daac-5559-0c8a-1ed2-13949e29e17f.png)


# テスト

![Main.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545124/96ee8979-c9d7-ec55-c41c-6fbb3cef0cf9.jpeg)


# 出力結果

![debug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545124/056bf008-62fd-41e7-be20-90ac621a47c6.png)



```vb
month_first_day.ToString("yyyy/MM/dd") '2019/12/01
month_first_day.ToString("yyyyMMdd") '20191201
```

ToStringの後で表示形式を変更できる。

※ 月部分は`MM`にする`mm`だと分になってしまう

# 参考サイト
https://www.atmarkit.co.jp/ait/articles/1505/27/news018.html

# 追記

当月分のデータ取得するなどでタイムスタンプが同じように`yyyy/MM/dd hh:mm:ss`のデータを比較する場合
`month_first_day`はそのままでよいが、`month_last_day`は以下のように設定する。

```vb
new DateTime(DateTime.Now.Year, DateTime.Now.Month, days).AddDays(1).AddSeconds(-1)
```

上記に設定後の`month_last_day`出力値（2019/12/17)

```
12/31/2019 23:59:59
```
これで、条件などに
`month_first_day(12/01/2019 00:00:00) =< 比較データ >= month_last_day(12/31/2019 23:59:59)`
と設定すれば当月分のデータを取得できる。

ここまで書いてて気づいたこと

```vb
month_last_day = month_first_day.AddMonths(1).AddDays(-1)
```
にすれば`days`いらなかった。。。
Haskellとレコード構文でゲッターを実装する

# はじめに

[いなたつアドカレ](https://qiita.com/advent-calendar/2019/allinatatsu)の十六日目の記事です。

## びふぉー

```hs

data Student = Student String String Int -- なまえ, 学籍番号, 学年

getName :: Student -> String
getName (Student name _ _) = name

```

nameのゲーッターを作成しています。
これを全フィールド分かくのはとても無駄だし、引数の順番と中身がわかりにくいです。

## あふたー
```hs
data Student = Student { name : String,
                       s_id : String,
                       grade : Int}

test_student :: Student
test_student = Student {name = "inatatsu", s_id = "18-0015", grade = 2}
```

このようにStudent型をレコード構文を用いて実装することで、Student型の可読性が上がります。
さらに、フィールドの名前を指定できるため、引数の順番を覚える必要性がなくなります。

そして、レコード構文では、各フィールドへのゲッターが自動で生成されます。

# まとめ

Haskellをすこれよ
Prettier と ESLint/stylelint のルールの違い

フロントエンド初心者の自分が、
Prettier, ESLint, stylelint などのツールを整理するための備忘録です。

## それぞれの役割
自分が認識しているそれぞれの役割はだいたいこんなかんじ。

- Prettier
    - 自動でコードをきれいにしてくれるコードフォーマッター
- ESLint
    - JavaScriptの静的解析ツール
- stylelint
    - CSSの静的解析ツール

ただ、Prettierがどこまで自動で整形してくれるかが自分のなかであいまいでしたので、調べてみました。

## 公式に書いてあった
https://prettier.io/docs/en/comparison.html

訳すとこんな感じ。

↓↓↓

Linterで適用するルールは大きく二つに分かれます。

- 書式に関するルール
    - 1行の長さは80文字まで、スペースとタブの混在を禁止、など
- 品質に関するルール
    - 未使用な変数定義の禁止、暗黙的なグローバル変数の禁止、など

**書式のルールはPrettierに任せてください！** ただし、**品質に関するルールは面倒見れません...**

## まとめ
Prettier はコードをきれいにするには非常に便利ですが、 ESLint/stylelint を併用して使用したほうが
バグの少ない品質の高いコードになります。併用しましょう。

以上。
LPIC304試験対策　330.1仮想化の概念と理論

LPIC304を受験するので、まとめていきます。
LPIC304試験については、[公式ページ](https://www.lpi.org/ja/our-certifications/exam-304-objectives)を確認ください。
1つ1つトピックのボリュームが多かったので、単元ごとに書きました。

---

#330.1仮想化の概念と理論
重要度：8
##仮想化とは
仮想化(Virtualization)とは、コンピュータリソースを抽象化すること。

###サーバ仮想化のメリット
・H/W資産の柔軟な運用
・仮想マシンのテンプレート化
・ピーク時間の分散
・ランニングコストの削減

###サーバ仮想化のデメリット
・物理サーバの故障やメンテナンス時の影響
・パフォーマンスの低下
・仮想化の専門知識が必要

##サーバ仮想化の手法
- ホストOS型
 - 特徴：ホストOS上に仮想化S/Wをインストールし、その上にゲストOSを動作させる。
 - メリット：手軽
 - デメリット：動作のオーバーヘッドが大きくなる
 - 具体的なツール：VirtualBox、VMware Workstation、Microsoft Virtual PC、Parallels Desktop
 
 \#試験に出るのは、VirtualBoxの特徴くらい

- ハイパーバイザー型
 - 特徴：物理マシンの上に仮想化ソフトウェアを直接起動し、その上にゲストOSを起動する。企業での仮想化の主流。
 - メリット：ホストOS型に比べてパフォーマンスが良い
 - ツール：Xen、HP社のIntegrity Virtual Machines、VMware社のVMware vSphere

###ハイパーバイザーの実現方法
完全仮想化(H/W仮想化とも呼ぶ)、準仮想化(PV：ParaVirtualization)の2種類がある。

|  | 完全仮想化 | 準仮想化 |
|:-:|:-:|:-:|
| H/Wエミュレーション | する | しない |
| 処理性能 | 低い | 高い |
| ゲストOSの修正 | 不要 | 必要 |
| CPUの仮想化支援機能  | 必要 | 不要 |　

ゲストOSとしてWindowsを採用できるのが、完全仮想化。

完全仮想化を効率化する為には、CPUの仮想化支援機能を利用する。
これは最近のCPUに含まれている機能。
仮想化ソフトウェアが行う処理の一部をCPUが分担することで処理を高速化する。
Intel VT(Intel Virtualization Technology)やAMD-V(AMD Virtualization)として実装されている。

##コンテナ型仮想化
###コンテナ概要
仮想マシンを作成するほどの手間をかけずに、一台の物理サーバにおいて複数のサーバにそれぞれ独立した環境を提供できる。
クラウドコンピューティングの発展とともに注目を浴びている。

###仕組み
Linuxの機能の組み合わせで成り立っている。「chroot」によるルートディレクトリ位置の変更、「NameSpace(名前空間)」による空間分離、「cgroup」によるグループ化されたリソースの制限等が使用されている。
つまり、
コンテナ内プロセスは、変更されたルートディレクトリまでの空間しか見えず、お互いが隔離された状態として動く。隔離された空間内でリソース制限をかけることにより、それぞれの環境にあった隔離空間が形成される。
各コンテナを、OS側から見ると、コンテナは通常のLinuxのプロセスであり、OSは一つしか動いていない。

###試験に出題される範囲のコンテナ
コンテナ型S/Wとして、LXC、OpenVZ、Dockerがある。

- 特徴：仮想CPU、仮想メモリ、仮想ディスクという仮想的なH/W概念がないため、エミュレーションの必要性がない
- メリット：構築スピードが早い。集約率が高い。
- デメリット：OSの不具合、障害などが広範囲に及ぶ。異なるOSを稼働させることができない。OSレベルでのカスタマイズに制限がある。

##クラウド
クラウドとは、ネットワークの向こう側にコンピュータ群やサービスたちを指す。
詳しくは[こちら](https://www.ipa.go.jp/files/000025366.pdf)

###5つの特徴
- オンデマンド・セルフサービス
 - 必要なときに必要サービスを自由に利用できる
- 広帯域ネットワークアクセス
 - インターネットを利用して、どこからでもアクセスできる
- リソースの共有
 - リソースを蓄えておき利用できる 
- スピーディーな拡張
 - サービスやリソースの利用を迅速かつ柔軟に変更できる
- サービスが計測可能
 - リソースの利用が計測できる

###3つのサービスモデル
- SaaS
    - 「S/W as a Service」の略。単にS/Wを利用する。O365、Salesforce、gmailなど
- PaaS
    - 「Platform as a Service」の略。開発環境までを提供してくれる。Windows Azureなど
- IaaS
    - 「Infrastructure as a Service」の略。サーバ、ストレージなどのインフラ環境を提供してくれる。Amazon EC2など


###4つの配置モデル
- プライベート(自社)クラウド
- コミュニティクラウド
- パブリック(インターネット)クラウド
- ハイブリッドクラウド

##マイグレーション
既存の環境をそのまま別の環境へ移すこと

- ライブマイグレーション
    - サービスを停止することなく移行すること。
    - 仮想化システムの魅力の1つ
- P2V
    - 物理サーバから仮想サーバへの移行
- V2V
    - 仮想サーバから別の仮想物理サーバ上の仮想サーバへの移行
- V2P
    - 仮想サーバから物理サーバへの移行
MediaPipe の Hand Tracking を Ubuntu 18.04/20.04 で動かす

Ubuntu 18.04LTS + RTX2080 でやる。hesdless なマシンなので、live ではなく mp4 ファイルの処理ができればよしとする。

基本、https://github.com/google/mediapipe/blob/master/mediapipe/docs/install.md に書いてある通りにするだけで、あまりおもしろみはなし。

bazel は apt ではインストールできなかったので、https://docs.bazel.build/versions/master/install-ubuntu.html を見てこの通りやる。

    $ sudo apt install curl
    $ curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
    $ echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt 
    $ stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list

    $ sudo apt update && sudo apt install bazel
    $ sudo apt update && sudo apt full-upgrade
    $ bazel

opencv を入れる。

    $ sudo apt-get install libopencv-core-dev libopencv-highgui-dev \
                       libopencv-calib3d-dev libopencv-features2d-dev \
                       libopencv-imgproc-dev libopencv-video-dev

hello world を実行

    $ export GLOG_logtostderr=1
    $ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \
        mediapipe/examples/desktop/hello_world:hello_world

何も問題なく実行された。raspbian とは大違い。Hand Tracking のビルドも特に問題なく通った。

## Ubuntu 20.04 の追記

1. opencv2/core.hpp not found とか言われた場合：

```
$ sudo ln -s /usr/include/opencv4/opencv2 /usr/include/opencv2
```

としてみる。

2. opencv2/optflow.hpp not found とか言われた場合：

```
$ sudo apt install libopencv-contrib-dev
```

としてみる。

3. Numpy is Installed? とか言われた場合：

```
$ sudo apt install python-numpy
```

としてみる。

私の環境では、これくらいで動いてくれました。
PythonのGzipFileクラスはBufferedReaderを経由してreadされる

だからどうしたという話ですが、GzipFileを使ったコードを書いていて気がついたのでメモです。

# GzipFileとは
[Pythonでgzipを扱うクラスです。](https://docs.python.org/ja/3.7/library/gzip.html)

コンストラクタにファイル名を渡すとローカルのGzipファイル、fileobjを渡すことでファイル「っぽい」Gzipオブジェクトの読み書きが出来ます。


# BufferedReaderを使っている箇所
[GzipFileのコンストラクタ内](https://github.com/python/cpython/blob/9a3ffc0492d1310ead9ce8f5ee678c26b20a338d/Lib/gzip.py#L176)では、下の図のように

* 実際のioClass（引数のfileobj、もしくはファイル名から取得したファイル）を
* 実際の読み込みを行う[_GzipReader](https://github.com/python/cpython/blob/9a3ffc0492d1310ead9ce8f5ee678c26b20a338d/Lib/gzip.py#L377)でラップ
* さらに、それをBufferedReaderでラップ

する関係になっており、GzipFileをreadする時はBufferedReaderを経由することになります（※）。

![gzip_class.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311203/0fe04f5b-6953-a98e-8291-07e3e67fd82a.png)

※より正確には、_GzipReaderとIoClassの間に、_PaddedFileというクラスが挟まります


# バッファのサイズを変えたい時
GzipFileはBufferedReaderのバッファーサイズにデフォルト（io.DEFAULT_BUFFER_SIZE）を使います。

読み込み対象のioによっては、より大きな単位でバッファしたい時もあるかもしれません（※）。
が、GzipFileの機能ではバッファサイズが変更出来ないようなので、GzipFileのfileobjにBufferedReaderを渡しましょう。

※ 例えば、GCSはダウンロードする単位が小さい（数KB単位）だと、[パフォーマンスが落ちるそうです](https://cloud.google.com/blog/ja/products/gcp/optimizing-your-cloud-storage-performance-google-cloud-performance-atlas)。
DeepLearningでポケモンを生成する

# はじめに
この記事は[近畿大学Advent Calendar 2019](https://qiita.com/advent-calendar/2019/kindai)の16日目の記事です．
何番煎じか分かりませんがGanでポケモンの画像を生成します．将来的には生成した画像に更にポケモン図鑑の説明を付加するようなことをしたいと思っています．
ソースコードは[こちら](https://github.com/mina-moto/PokemonGenerator/)

# DCGAN
画像生成にはDCGANを用いました．詳細は[論文](https://arxiv.org/abs/1511.06434)を参照ください．
実装は[DCGAN-tensorflow](https://github.com/carpedm20/DCGAN-tensorflow)を用いたのですが，なぜか公式のソースコードにバグがあったので[修正したもの](https://github.com/mina-moto/DCGAN-tensorflow-pokemon)を使っています．

# データセット

[pokemon-images-dataset-by-type](https://github.com/rileynwong/pokemon-images-dataset-by-type)で公開されている，ポケモンの画像を用いました．

# 環境構築

## Docker image download
```
docker pull minamotofordocker/pokemon_generator:latest
```

## ライブラリ系のインポート
```setup.sh
#!/bin/sh

# Pokemon Image Data
git clone https://github.com/rileynwong/pokemon-images-dataset-by-type

# DCGAN
git clone https://github.com/mina-moto/DCGAN-tensorflow-pokemon

# Dataset setting
mkdir -p data/pokemon_image/
cp pokemon-images-dataset-by-type/all/* data/pokemon_image/

echo "Finish!"
```
### 各コマンド詳細
ポケモンの画像のインストール．

```
git clone https://github.com/rileynwong/pokemon-images-dataset-by-type
```

DCGAN-tensorflowのインストール．

```
git clone https://github.com/mina-moto/DCGAN-tensorflow-pokemon
```

インストールした画像の場所変更．

```
mkdir -p data/pokemon_image/
cp pokemon-images-dataset-by-type/all/* data/pokemon_image/
```


# DCGANで画像の学習

パラメータ調整は[この記事](https://qiita.com/yoyoyo_/items/4df8d78b5118190bbcd2)を参考にしました．

```shell
docker run -v $PWD:/PokemonGenerator -w /PokemonGenerator -it --rm minamotofordocker/pokemon_generator:latest python DCGAN-tensorflow-pokemon/main.py --data_dir data/ --dataset pokemon_image --out_dir out/ --out_name pokemon_gan_sample --input_fname_pattern=*.png --input_height 120 --output_height 120 --train --epoch=5000 --batch_size=64 --learning_rate=0.001 --G_img_sum
```

## 生成された画像

学習の様子(4600epochまでの200epochごとに生成される画像)．

![train_run.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250461/18ef1e4a-62f9-d084-4621-4ba24ba7a586.gif)

4600Epoch目の画像．ポケモンのような何かができてる？
![train_00004600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250461/8c95237d-c1b4-f260-7ce7-def155ffa4e7.png)
Pleasanterの中にある関数（スクリプト機能）を使ってみた

# Pleasanterとは
オープンソースのWebデータベース。インシデント管理やナレッジ共有など様々な場面で活用できる。
また、CSSやJavaScriptを用いて自分好みにカスタマイズすることもできる。

## スクリプト機能
Pleasanterには開発者向けの機能としてスクリプト機能が存在する。JavaScriptをサイトごとに設定することができ、標準機能にはない操作等を加えることが可能。また、Pleasanterには独自の関数が用意されており、今回はその中からいくつか試してみた。

### $p.getControl
項目名から要素を取得できるメソッド。下図の「管理者」項目の要素を取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/f7124bba-9ccb-2b7d-be0c-1c3d3c52fd47.png)



ブラウザの管理コンソールに「$p.getControl('項目名')」を入力して実行してみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/87e79444-444e-2dc3-722a-5f95726422b2.png)


項目の背景色をオレンジ色に変えてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/93b5d993-5cb2-8bb0-1390-02c25284b628.png)


### $p.setMessage
画面下部にメッセージを表示するメソッド。下図の赤枠部分にメッセージを表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/613b3116-084e-61a0-fb8c-f1d2d6132dea.png)

画面下部に「Hello,world!」を表示してみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/a31c228f-bdc9-f52f-0205-a7f304e6033f.png)



### $p.apiCreate
AjaxのPOSTリクエストによる新規レコードを作成するメソッド。Aテーブル、Bテーブルを用意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/f37856e3-5d9a-2e91-2644-637f3b23b341.png)




今回はAテーブルでレコードを更新した際に、Bテーブルにレコードを作成する。
Aテーブルに以下のスクリプトを登録。スクリプトの登録方法については割愛。

```javascript
$p.events.after_send_Update = function () {
    $p.apiCreate({
        id: 2636305,    //新規作成するサイトのID（今回はBテーブルのID）
        data: {
            Offset: 0,
            Title: '作成したレコード'
        },
        done: function (data) {
            $p.clearMessage();
            $p.setMessage('#Message', JSON.stringify({
                Css: 'alert-success',
                Text: 'レコード作成完了！'
            }));
        },
        fail: function (data) {
            console.log(data);
        }
    });
}
```


Aテーブルにあるレコードを更新。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/3678c04f-4efe-a317-2cc7-d8d1dd2b4d3f.png)

Bレコードに移動してみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/841bfbbe-f6b2-53f7-27d0-85210c480eaf.png)

# 最後に
今回試したもの以外にも便利な関数がたくさん用意されている。詳しくは[こちら](https://pleasanter.net/fs/publishes/524084/edit)を参照。
他にもPleasanterには様々な機能があるため、一度手に取って試してみてはいかがでしょうか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/d955dadf-b65b-1c87-1b20-ef42bd754092.png)
Next.js + Now + Typescriptで爆速デプロイ

## 概要
Next.js + Now + Typescriptで爆速デプロイ💣

## 目次
- Next.jsとはなにか
    - なにがいいの？
- Nowとはなにか
    - なにがいいの？
- 実装
    - Next.js + Typescript環境作成
    - Nowでデプロイ

## Next.jsとはなにか
以下[公式ドキュメント](https://nextjs.org/)翻訳
### Server Rendering
Next.jsを使用すると、Reactアプリケーションのサーバーレンダリングが、データの送信元に関係なく、かつてないほど簡単になります。

### Static Exporting
新しいフレームワークを学ぶ必要はありません。Next.jsを使用した静的サイトのエクスポートは、1つのコマンドと同じくらい簡単です。

### CSS-in-JS
Next.jsには付属してstyled-jsxいますが、ご存知のすべてのCSS-in-JSソリューションでも動作します。

### Zero Setup
自動コード分割、ファイルシステムベースのルーティング、ホットコードの再読み込み、ユニバーサルレンダリング。

### Fully Extensible
BabelとWebpackを完全に制御します。カスタマイズ可能なサーバー、ルーティング、および次のプラグイン。

### Ready for Production
より小さいビルドサイズ、開発のコンパイルの高速化、その他多数の改善のために最適化されています。

## Next.jsなにがいいの？
### 直感的なページベースのルーティングシステム（動的ルートのサポート付き)
pages配下の構成がアプリのURL構成になる
`pages/index.js` => `/`
`pages/about.js` => `/about`

### デフォルトでSSRしてくれる
ReactでSSRしようとすると結構めんどくさいのをデフォルトでやってくれるので楽チン

### ページの読み込みを高速化する自動コード分割
コード分割も自動でやってくれる

基本的に何も気にしなくても使うだけで最適化してくれるのが嬉しい。

### サンプルが豊富
guthubの[example](https://github.com/zeit/next.js/tree/canary/examples)を見ればだいたいやりたい構成が載っている。

## Nowとはなにか
[公式ドキュメント](https://zeit.co/docs)の翻訳

ZEIT Nowは、静的サイトおよびサーバーレス機能向けのクラウドプラットフォームです。これにより、開発者は、即座にデプロイし、自動的にスケーリングし、監視を必要とせず、すべて設定なしで WebサイトとWebサービスをホストできます。

Nowの使用開始はほんの数ステップで、1分もかからずに新しいプロジェクトを開始して実行できます。
### なにがいいの？
シンプル且つ高速にデプロイを実現

## 実装
### Next.js + Typescript環境作成
プロジェクト作成

```
mkdir next-ts
cd next-ts
yarn init -y
yarn add react react-dom next
mkdir pages
```

次に`@types`を追加

```
yarn add -D typescript @types/react @types/node
```

次に`package.json`に`scripts`を追加

```
"scripts": {
  "dev": "next",
  "build": "next build",
  "start": "next start"
}
```

`pages`配下に`index.tsx`を追加

```pages/index.tsx
const Home = () => <h1>Hello world!</h1>;
export default Home;
```

これで準備完了です。
次のコマンドを実行して、devサーバーを起動します。

```
yarn dev
```

`http://localhost:3000`にアクセスします。
<img width="552" alt="スクリーンショット 2019-12-16 22.05.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533593/0b6948a3-d7a7-25fa-0049-e8fcbae9f6d3.png">



これだけでnext + typescriptの環境は完成です。

## Nowでデプロイ
[Now](https://zeit.co/signup)でアカウント作成

Now CLIをインストール

```
npm i -g now
```

次のコマンドを使用してログインします。

```
now login
```

デプロイ

```
now
```

これでデプロイ完了です
[Hello world](https://next-ts-39r52fv3z.now.sh/)

## おまけ
Next.jsでググってるのになぜかNuxt.jsの概要が出てくるのが悲しいなといつも思う
<img width="1289" alt="スクリーンショット 2019-12-16 21.22.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533593/b819a0ee-6f33-fdf8-5d27-51d228ad4040.png">
Logstashプラグインのサポートについて

### １．はじめに

- Elastic社のサポート対象範囲となるLogstashプラグインについて、調査しました。Logstashプラグインは、yml形式で記載したパラメータを変換処理することができ非常に便利である一方で、エンタープライズで利用する場合は製品保証を考慮しなければならないので注意が必要となります。
- Elastic社のホームページを確認すると、製品サポートするLogstashプラグインを２つのカテゴリ（Tier 1/2）に分けて、そのサポートレベルを設定しています。
-情報は、２０１９年１２月１６日付けのものとなります。 

### ２．Logstashプラグイン（Tier 1）のサポート

- Tier 1のLogstashプラグインは、***Elastic社自身が直接リリース***したもので、プラグインとして多くのシステムに採用された実績を持ちます。
- Elastic社は、Tier 1のLogstashプラグインに対しては、すべての緊急度レベル（１～３）に対してサポートリクエストを受け付けることができます。



| Input plugins       | Codec plugins | Filter plugins    |Output plugins|
|:-----------------|:------------------|:-------------------|:-------------------|
| azure_event_hubs |avro|cidr|elasticsearch
|beats|cef|clone|email
|elasticsearch|es_bulk|csv|file
|file|json|date|http
|generator|json_lines|dissect|kafka
|heartbeat|line|dns|rabbitmq
|http|multiline|drop|redis
|http_poller|plain|elasticsearch|s3*
|jdbc|rubydebug|fingerprint|stdout
|kafka||geoip|tcp
|rabbitmq||grok|udp
|redis||http|
|s3* ||jdbc_static|
|stdin||jdbc_streaming|
|syslog||json|
|tcp||kv|
|udp||memcached|
|||mutate|
|||prune|
|||ruby**|
|||sleep|
|||split|
|||syslog_pri|
|||translate|
|||truncate|
|||urldecode|
|||useragent|
|||uuid|
|||xml
** S3インプット/アウトプットプラグインは、AWS S3のみをサポート。
** Rubyはあくまで、フィルター機能のみをサポートするだけで、Rubyコードの実行そのものはサポート対象外。

### ３．Logstashプラグイン（Tier 2）のサポート

- Tier 2のLogstashプラグインは、Elasticでして構築したシステムソリューションに対して影響を与える可能性があります。
- Elastic社は、Tier 2のLogstashプラグインに対しては、緊急度レベル３に対してのみサポートリクエストを受け付けます。


| Input Plugins       | Codec plugins | Filter plugins    |Output plugins|
|:-----------------|:------------------|:-------------------|:-------------------|
|couchdb_changes|collectd|aggregate|csv
|gelf|dots|de_dot|elastic_app_search
|graphite|fluent|throttle|
|jms***|graphite||
|snmp|msgpack||
|sqs|netflow||
|twitter|||


### ４．緊急度レベルによるサポートの分類分け

- Elastic社は、インシデントの緊急度に応じてレベルを分けており、緊急度は(1)Urgent、(2)High、(3)Normal、(4)Dev Supportの4段階に分けることができます。
- 緊急度レベル1～3は、シルバー/ゴールド/プラチナ/エンタープライズの運用レベルサポートに限り適用することができます。
 
![6666666.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/d1cab6f3-c855-bc23-4aac-adddd8e7859b.png)

- Urgent：運用がダウンし、ビジネスやサービスが停止する場合。最優先のサポートが提供
- High：運用に支障があるが、動作している場合。どの程度運用に影響するか不明な場合に、できる限りすみやかにサポートが提供
- Normal：運用に問題はないが、質問がある場合。- ディベロプメント：運用に関連しないケースとして指定する場合。時間的制約のないサポートとして対応

以上
AI系の仕事を始めて６ヵ月の現在地

今回の記事では、題名にもある通りデータサイエンス系に関わる仕事を始めて半年間の知見であったり、感じた事、今後の展望等を書きたいと思います。

本記事は「データ分析人材のキャリア（データラーニングギルド） Advent Calendar 2019」16日目の記事になります。

#経歴
・大学卒業（学部は国際系）
・新卒は大手CSVチェーン（担当店７～８店舗のマネジメント等をおこなうSV職がメイン）
・RPA導入
・AI導入（現在）


#現在の仕事内容
７月に入社してもうすぐで半年が経過しますが、主に担当している業務は、エンジニア、プリセールス業務です。
エンジニア業務については、案件を取る為の無償検証 or PoC段階でのモデル作成になります。この業務については、チームメンバーのアドバイスを貰いながら実施はしていますが、大学時代からこの領域に触れてきた新卒メンバーの方が良くできていると思います。（分かってはいたけど悲しい。。。。）
一方プリセールス業務は、展示会での説明、商談や営業が一時対応をした中で確度が高い案件について同行してヒアリング、提案、見積作成をおこなうといったところから、セミナーで自社のソリューション紹介をおこなうなど多岐にわたっています。このあたりの業務については、知識不足を実感することは多々ありますが、今まで培ってきたコミュニケーション力を発揮することである程度こなしていく事が出来るようになってきました。後は、自社で過去おこなった案件の提案、報告レポートに一通り目を通して自分のメモとしてまとめ直す事である程度その場で質問に回答できるようにもなってきました。


#仕事における今後の展望
来年は、現在プリセールスとして案件提案をおこなっている案件が、受注できた場合はそのままPLとして担当できる様にしたいと思っています。（結構な数提案しているので、すべて失注した場合は爆死ですが。。。）
後は、現在製造業をメインで提案していて機器系のエンジニアの人たちとスムーズに話ができるだけの知見が欲しいなーとも感じています。


#最後に
カレンダーの特性上まとめきれずあげる事になってしましましたが、もう少しゆっくり振り返って加筆出来たらしようと思っています。
未経験文系新卒が取り敢えず、就職までにやった方が良いと感じたこと

#はじめに
去年の十二月、内定を取り消され、もぐりこんだIT会社に勤めて、早九か月なtearsmileと申します。
楽しくAzureやAWSやC#とサーバーの鞍替えやビックデータの構築をしながら生きています。
そんな意識低めの未経験文系新卒エンジニアですが、やっとけばよかったなと後悔することは多々あります。
そんな訳で意識の低い未経験文系新卒がやってて良かったこととやらなくて後悔したことを書きます。
四月に私みたいに後悔する人が少なくなれば嬉しいです。

##やってて良かったこと
###html/CSS
・これに関しては高校時代にやっていた。
SEになりたいと思ったきっかけ。
一番、簡単に始められるコードらしきものなので、やっといて損はない。
ものづくりか好きか嫌いかという判断が出来る。

###Excel
・資格があるので、取れるなら取っといても良いとは思う。
数字を見るのが苦しくないか、苦しいか。
パソコンをいじるのが苦しくないか、苦しいかの判断が出来る。

###Progate
https://prog-8.com/dashboard
・一応、Javaとかは打っていました。
やらないよりはマシ。圧倒的にマシ。
導入方法には充分。
書いたもん勝ちというのがコードの世界……。

上三つはやっていたことですが、これで苦しかったら、やめとけという話です。
さっさと第二新卒枠を考えた方が楽だと思います。
手に職とか言うけれど、人間合う合わないは絶対にある。

##やらなくて後悔したこと
###勉強会
https://devlove.doorkeeper.jp/
・取り敢えず、一度、話を聞く講演会みたいな勉強会に行くのはありです。
自分に興味がありそうなものがあったら、行くべきです。
自分の出来なさだとか、やる気だとかを貰えます。
交通費はかかりますが、無料で行けるものも世の中にはあります。
上記URLで開催されるイベントはzoomというアプリケーションで
見れるものもあります。ついでに無料です。

###Twitter
未経験新卒エンジニアとして、Twitterを始めておくのはありです。
情報収集にも良し。
仲間を見つけるのも良し。
もしかしたら、コミュニティを見つけられるかもしれないという意味でも良しです。

###paiza
https://paiza.jp/
コードを試しに打つなら、こちらもありだと思うんです。
環境構築する前に打ってみよう。
Javaだとメソッドを作るまでは行けることが判明しました。

###Python
https://www.python.org/
https://www.anaconda.com/
https://weblabo.oscasierra.net/python-anaconda-install-windows/
やりやすい言語は何だと思う？と聞かれると、Pythonなのではと思います。
未来性もあるし、データ分析もできるし、かなり省略も出来るし。
なんてったって、Pythonを入れるだけで、図とか書けます。
環境構築のやりやすさはPythonが一番でした。
Anacondaを入れて、Spyderを使って、Pythonを書くのはやりやすかったです。

###基本情報の勉強をしておくこと
教科書を買うことは悪いことじゃないです。
基本情報が云々という話もありますが、文系未経験新卒エンジニアの知識のなさを
舐めてはいけません。
基本情報の勉強をしておくとよいのは、IT専門用語だとかが分かることです。
アルゴリズムは難しいですが、やっといて損はないです。

##結論
やって良かったこととやらなくて後悔したこととか書いてありますが、
割と感じたのは如何に最初の一歩を踏み出すことが重要かということです。
難しい所からわざわざチャレンジしなくても、簡単なところから始めればよいと思います。
勿論、志が高い人間はわんさかいらっしゃるし、出来ないことも多いとは思います。
でも、最初からあきらめるのは違うと思うので、自分でHello、Worldから書いてみてよいと思います。
駆け出しエンジニアがガチの初心者にプログラミングを教えてみる

## 経緯
業務でデータ・サイエンティストとしての知識を要求された友人、統計学やデータ分析などは専門外なのでエンジニアリングに必要な知識を提供する事になりました。

## まえがき
私も駆け出しエンジニアであり誰かにエンジニアリングの講義経験がないため講義内容を手探りで考えています。
１対１の講義となります。

### 教える言語【Python】
講義対象はデータ・サイエンティストとしての知識を要求していたので、データ分析、統計学、機械学など専門的なライブラリが豊富にある。
文法がシンプルで読みやすい。
もともと、シンプルで効率的に書けることを目指している言語、非常に文法がシンプルでプログラミング初心者が学習するのに、おすすめな言語であるため。

## 今回の講義で教えた事

* プログラミングを行う上で汎用的なテキストエディタの選択
* Gitの使い方

Gitの説明については１人でプロジェクトを管理する程度、コマンドの詳細についてはあまり詳しく説明せず概念や簡単な使い方VScodeを使用したGitの管理方法をなどを教えました。

## テキストエディタの選択
Pythonを扱う上でベストなIDEはPyCharmですが、機能の数など初心者には目を回してしまいかねない機能や要素が多いため不採用としました。
他のIDEで汎用的かつシンプルで拡張性の高いテキストエディタを採用することにしました。
**Atom** か**VScode**の２択になったわけですが、これは完全に個人的な趣味でVScodeを採用しました。
教える身としても教えやすい環境を作りたかった。

個人的な意見としてはGitに関する素敵な拡張機能がある

* GitLens — Git supercharged
* Git History

特に今回の講義ではGit Historyが役に立ちました。
Git管理ならSourceTreeを利用する事も考えましたが、人は情報量が増えると途端に理解する事を止めてしまいSourceTreeの扱いを必要最低限覚えてGitの情報が頭からすっぽ抜けてしまう可能性があったので今回は不採用です。
Gitの知識がつけば、本人自身で深くGitを調べた時にでもSourceTreeにいきつくでしょう。

### 講義した感想
IDEをインストールし、VScodeについて軽い説明をしただけなので講義を受けている友人もそんなに難しい顔をする事はありませんでした。
VScodeを軽く操作している時に友人が興味を持ってくれたのは以下の事でした。

* ファイルの拡張子
* GUIとCUI
* VScodeでフォルダを開く事のできるエクスプローラー

拡張機能に関しては、まだ便利さを理解する領域ではないので今は特に関心のある様子ではありませんでした。

## Gitの使い方
今回はGitの解説は行いません。あくまで講義をした時の手ごたえや感想、反省点をメインに記述する予定なので詳しい解説は省きます。
講義で教えた内容はローカルリポジトリでプロジェクトを管理する方法でとどめています。リモートリポジトリでの管理方法も後に解説する必要があるとは思いますが、今回は情報の量を絞る事にします。

### 講義した内容
基本的にはVScodeからGitを操作する方法とGitの概念をざっくり説明しました。
コマンドから説明しないのかという意見も多々多くあると思いますが、コマンドによる操作はエンジニアリングになれていない人には難しい操作や、目に入る情報となるためVScodeから基本的な操作を行いつつ概念を説明することにしました。
Gitのcommit状況をGit Historyの拡張機能で表示させ解説しました。

### 講義した感想
Gitを一般の人にも分かるように言葉選びをするのが大変でした。
友人が難しいと感じていた内容は以下の通り

* branchを切り替える事でプロジェクト内の状況が変化する
* mergeする事で変更内容を別branchに反映させる

確かに知らない人からしたら意味のわからない動作をしていますよね…
今回の講義ではゲームのセーブと例える事で解決しました。

## あとがき
はじめて人に教える立場となりましたが、０から教えていくのがすごく難しかった。
具体的には、講義対象がどこまで理解しているのか掴みにくかった。
避けられない専門用語などをどのように理解してもらえるかを考えながらかみ砕きながら解説するのが難しかった。
そしてQiitaの記事で講義の概要をまとめるのがなにより難しかったです。
LINE WORKS のトークン取得時に必要な JWT をサクっと生成してみた (LINE WORKS API 1.0)

LINE WORKS の API を試そうと思ったのに、JWT 生成で悩んでしまったという時、この記事を読んでみてください。

取り急ぎ、Web サービスで JWT を生成して、トークンを発行する方法を説明します。運用環境での JWT 生成やトークン発行および管理については、様々な考慮が必要だと思いますので、とりあえずテスト目的での利用を想定した記事です。ご理解くださいませ。

この記事は LINE WORKS API 1.0 に沿った記載です。API 1.0 は 2023 年 4 月 30 日にリタイア予定です。API 2.0 に準じた記事を以下で掲載しています。
https://qiita.com/iwaohig/items/ba41a43a5fc46ba07051

## サーバー API のトークン

LINE WORKS の API のうち、トーク Bot API などの実行にはサーバー API のトークンが必要です。

トークンの発行方法は 2 種類あるのですが、サーバー ID を用いたトークンの発行は、やや面倒です。

JWT (JSON Web Token) 生成ってなんじゃい、、みたいな。

## JWT.IO という素敵なサービス

JWT.IO というサービスで、Web ページにパラメータをコピペすることで、サーバー トークン生成に必要な JWT を生成できます。

JWT.IO にアクセスします。

https://jwt.io/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/24d44df8-c0c4-4870-143b-237338cc04ab.png)

ページ下方にスクロールします。

ALGORITHM のプルダウンで "RS256" を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/ddc494c4-21c1-aef7-72c6-e16466510ea9.png)

Decoded の PAYLOAD と VERIFY SIGNATURE を書き換えていきます。

### PAYLOAD
```
{
  "iss":"46c4f281f81148c9b846c59262ae5888", <- サーバー ID
  "iat":1492504672, <- JWT 生成日時
  "exp":1492506472  <- JWT 満了日時
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/2032dd3a-9abf-464b-d966-a9068ebf5e03.png)

サーバー ID は Developer Console の "Server List(ID登録タイプ)" で生成された "ID" を用います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/6f3d0cad-0269-ca0c-f53a-e3c65fad6041.png)

JWT の生成日時と満了日時の間にトークンのリクエストを行う必要があります。UNIX 時間で記述します。最長 60 分有効となるよう指定できます。

UNIX 時間の変換はこのあたりの Web サイトを使いましょう。

https://keisan.casio.jp/exec/system/1526003938

### VERIFY SIGNATURE
Developer Console の "Server List(ID登録タイプ)" で生成された "認証キー" をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/2d381f42-bf10-a225-2c56-33a02064ab62.png)


ダウンロードしたファイルの内容を -----BEGIN RSA PRIVATE KEY----- の方の入力欄に貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/0d87b942-b260-866f-df46-006f1bfe3459.png)


ここまでの作業を行うと、左側の Encoded の欄に、JWT が生成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/3a5e0863-c24e-5dac-906a-17e5cb9b57c3.png)


## トークンの発行
生成された JWT を使って、LINE WORKS 認証サーバーへの Token リクエストを行います。

こちらのページの下方、[3. LINE WORKS 認証サーバーへの Token リクエスト - RFC-7523] の記載に沿って実行します。
https://developers.worksmobile.com/jp/document/13?lang=ja

Postman での実行例のスクリーンショットは以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/70d2c3bc-7145-4b73-e849-169207619765.png)

正しくリクエストが実行されると Token の値を含むレスポンスが返ります。
yarn runが出来ない！！！

# yarn run出来ないんだけど！！！！
Githubに上げたコードをcloneして```yarn run```したら以下のエラーメッセージが発生

```
error Command failed with exit code 127.
```
なんだこれ？って思ったら以下を実行していないだけだった

```
yarn install
```

よく考えれば当たり前のことだけど忘れてしまうため備忘録
raspberry piにdocker-composeを導入

[前回](https://qiita.com/K-USK/items/1ae8340db5c2359862d8)に引き続いてraspberry piにdockerを導入したのでメモしておく。

## なぜDockerを使うのか
localのmacでもremoteのRaspbianでも同じ環境を、一つのDockerfileさえあれば動かせるような便利なものとDockerを思っていた。が、そうではなかった。そもそもとして、Dockerは[linux環境でのみ動くもの](https://qiita.com/mufasa/items/9356187a3bcb20b64e82)らしく、Docker for mac ではHyperKitと言うlinuxの仮想環境が立ち上がっているらしい。これ自体はlocalとremoteで異なるDockerfileを書くのに大きな違いにはならなさそうである。しかし、Raspberry PiはCPUがarm製のものらしく、その辺りも考慮してDockerfileは書かないといけないようだ?

とはいえ、既に先人たちが用意した環境をimageを持ってくるだけで使えることには相当の恩恵があると言うことを信じてDockerを使うことにする。

## DockerとDocker-Composeの導入

Docker Composeのインストールには[Docker公式レポジトリからdocker-composeのバイナリを作成する](https://qiita.com/tkyonezu/items/ceaaf41924df39254058)のが正しい方法のようである。ところが、[こちらのサイト](https://withblue.ink/2019/07/13/yes-you-can-run-docker-on-raspbian.html)によるとpipコマンドでインストールができるようである。pythonを生でraspberry piに導入するのも好ましくない気がするが（要出典）、今回は簡単にこの方法にしたがって作成を行った。

Dockerのインストール

```
# Install some required packages first
$ sudo apt update
$ sudo apt install -y \
      apt-transport-https \
      ca-certificates \
      curl \
      gnupg2 \
      software-properties-common

# Get the Docker signing key for packages
$curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -

# Add the Docker official repos
$ echo "deb [arch=armhf] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
     $(lsb_release -cs) stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list

# Install Docker
# The aufs package, part of the "recommended" packages, won't install on Buster just yet, because of missing pre-compiled kernel modules.
# We can work around that issue by using "--no-install-recommends"
$ sudo apt update
$ sudo apt install -y --no-install-recommends \
    docker-ce \
    cgroupfs-mount
```

デーモンの起動

```
sudo systemctl enable docker
sudo systemctl start docker
```

docker-composeのインストール

```
# Install required packages
$ sudo apt update
$ sudo apt install -y python python-pip libffi-dev python-backports.ssl-match-hostname

# Install Docker Compose from pip
# This might take a while
$ sudo pip install docker-compose
$ sudo apt-get -y install python3-pip
$ pip3 install docker-compose
```

以上でdocker、docker-composeコマンドが使えるようになっているはず。
Slackのカスタムレスポンスを使ってメンションを飛ばしてみた

マルチチャンネルゲストの方々をグループメンションしたかったのですが、マルチチャンネルゲストの場合だとそれができません。しかし[カスタムレスポンス](https://slack.com/intl/ja-jp/help/articles/202026038-Slackbot-%E5%85%A5%E9%96%80#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%97%E3%81%9F%E8%87%AA%E5%8B%95%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)とマルチチャンネルゲストのnameがあればできます。

ワークスペースのカスタマイズにて設定します。右のフォームは左のフォームで設定したものが来た時にSlackに投稿される文章です。右のフォーム側にマルチチャンネルゲストのnameを定義します。

![スクリーンショット 2019-12-16 22.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44324/5a1bac61-1650-8075-567a-0f6dc6ec3843.png)

name はhttps://api.slack.com/methods/users.list/test で確認できます。
実行する時にtokenが必要です。これはhttps://api.slack.com/legacy/custom-integrations/legacy-tokens で作ったものを使って実行してください。
Macとサブディスプレイを最大活用して作業する【デザイナー編】

## ごあいさつ
- [ゆるゆる新卒1年生 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/yuruyuru-freshman) 、本日は @snd-07 が投稿させていただきます:relaxed:

## 普段、こういった作業をしています
- ビジュアルを作るし、コードを書く。
- **同時に触るソフトが多くて混乱する:rolling_eyes:**
    - ランディングページを作る時
        - 画像データは`PhotoShop`で作りながら、`xd`でプロトタイプを作る。
        - 細かい調整をする素材は、`Illustrator`で作る場合も
    - マークアップする時
        - `xd`でデザインを見ながら、`vsCode`でHTML、cssを書く

## そんな私の心の叫び
- **複数ソフトを開くので、切り替えが面倒くさい！**
- Command+Tabじゃ足りないよ・・・:sob:

## 色々試してみた結果、こうやって作業するのが一番よかった
1. **各ソフトを開くデスクトップを固定させる**
    - この記事を参考にさせていただきました
        - [macOSでディスプレイ1枚で作業する技術](https://qiita.com/saboyutaka/items/489ed2ffe4c1187b65a7)
2. **大きいディスプレイを最大に活用する**
    - サブディスプレイを、メインに変更
        - システム環境設定→ディスプレイ→配置
            - <img width="423" alt="スクリーンショット 2019-12-16 22.17.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250206/73c20b8a-5bab-95b1-c9fc-06ce240e890f.png">

        - 壁紙で、視覚的にどのデスクトップにいるかわかるように
        - ![nabi_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250206/c8f0de31-5448-ca5f-dade-c1af262ce55e.png)
        - ディスプレイ・外付けキーボードで作業し、macbookは、資料を見たり、連絡を取ったりする時などにサブとして使っています
- **外付けキーボードを使う**
    - キーボードの位置を自由にできるようになったので、姿勢が楽に。


## 結果、かなり作業が楽になりました！

- どこに何を開いているか、迷うことがなくなりました。
- macBookよりも大きいディスプレイを、余すことなく有効活用しています！
    - 画面が大きいと、本当〜〜に作業しやすいです:v:


## おわり

- 最後まで読んでいただきありがとうございました♩
- みなさまの作業場についても、ぜひ教えてください〜〜
今CivicTechで必要にされていること

#CivicTechアドベントカレンダー16日目です。
##今Civictechで必要とされていることを書きたいと思います。
最近思うのですがFacebookはボランティアに冷たいと思い始めました。
徐々に自分としてははてなにもう一つブログを持とうかと思っています。
昼なぜあんな事を書いたかというと皆さんに迷惑がかかってないか心配だったからです。
Qiitaさんも最近Facebook自体に顔を出さなくなってきています。
そんな話はここまでにして本題を書きます。
Civictechで何を必要とされているかです。
今重要とされているのは
・クライシスマッピング
・シニア向けプログラミング
・小中高生向けプログラミング教室
・ハッカソン＆アイデアソン
・SDGｓの普及
・防災・減災
です。

先週の土曜日もSDGｓの勉強会で金沢から福島さん・岐阜からも中村さんがお見えになり色々とお話ができ良かったと思います。
自分は特に防災方面で活躍している人間だったので雪害などの話も聞けてよかったと思っています。

##防災・減災とは
みなさん正直にお話しておきますがハザードマップはあくまでも自治体が出している指標です。
自分の家は大丈夫だと思っている人多いと思います。
実際に災害が起きるとどのような動きをするかと言うと避難指示前に情報を取得できればすぐにクライシスマネージメントのためにクライシスマッピングを開始します。
これは実際入力途中でも有効になるのですぐさま公開に踏み切っています。
それはなぜかと言うと早め早めの想定が必要になるからです。
自分たちができる範囲で自治体の友達などに避難指示など出ていないか問い合わせをしたり自治体のホームページから災害情報を洗い出しを行いマッピングを行っています。
これを行うことにより被災地の皆さんの避難ができるようになります。
現在はフォーマットがバラバラで文字のところもあれば表でまとめてくれているところもあり今年自分もマッピングしたのですが大変でした。
丸一日費やしてました。
古橋くんもDRONBIRDの活動で全国各地を回っている状況です。
皆さんにお願いしたいことがあります。
<strong>DRONBIRDもクライシスマッピングも皆さんの協力がないと素早くできません。台風19号のときは2日遅れになってしましました。</strong>
皆さんができることはいっぱいあるのです。

##みなさんが協力できること
クライシスマッピングをしているときに思ったことですが自治体の情報が文字情報が多かったです。
これをGoogleスプレットシートに
・提供施設
・施設名
・住所
・電話番号
・緯度経度
を抽出していただきたいのです。
これだけでもあればほぼ一日でリアルタイムに近い情報が提供できます。

現在自分もクライシスマッピングの簡易化を考えながらプログラミングの計画を立てていますが。
問題の自治体が文字情報重視なのです。
これには本当に10名の方が参加していただけることになってましたが最終的には自分一人ぼっちでした。
<strong>追い上げなきゃという気持ちが先走ってしまうのです。</strong>
流石に自分のスピードにはついていけない状況でした。
CSVの準備を依頼するとかなりスピードアップと簡易化ができると思います。
まずはここからです。

<strong>実は今回のアーバンデータチャレンジには防災情報の統一フォーマットを提案します。</strong>
これをすることで実際に最大限のスピードアップができます。
CSV取り込みや入力システムを作らないといけないので4年がかりになりそうですが。
誰かがやらないと減災はできません。
本当に今年はいろいろなことがありました。

##ショックことが連続しています。
<strong>ネット右翼にボランティア活動しているこいつには気をつけろと祭り上げられてしまいました。</strong>
調査したところ自民党関連のネット活動家であることが判明しています。
みなさんも気をつけてください。
正直コレもショックでしたが一番のショックは自分の投稿したアドベントカレンダーの投稿自体がスパーム扱いを受ける事態になってしまったということです。
もちろん技術関連も含めです。
まさかFacebookから一週間も投稿禁止をされてしまいました。
Facebookは技術者を敵だと思っているんだなと感じてしまい悲しかったです。
悲しいことが最近続いています。

情報は流しますがFacebookでの私のアドベントカレンダーの投稿でのいいねはしなくていいです。
その代わりQiitaのリンクに来ていただきたい。
Qiitaは良いコミュニティです。
安心できると思います。
Qiitaでいいねを押してください。


以上投稿とします。

また長文になってしまい申し訳ないです。
MaplatEditorで不正確な古地図をマッピングする（１）インストール

Maplat Advent Calendarでは昨日まで、ベース地図やオーバーレイ地図を追加する方法を説明してきました。
16日目からは、不正確な古地図を追加する方法の説明に入りますが、その前に古地図の場合はデータを作るエディタである、MaplatEditorというものの使い方を知ってもらう必要があります。
一度に全て書いてしまうのは大変なので、これから数日でMaplatEditorを説明したいと思います。
今日はインストールまで。

#### MaplatEditorのダウンロード元

MaplatEditorのダウンロードリンクは、[MaplatEditorのgithubサイト](https://github.com/code4history/MaplatEditor/wiki)にあります。
<img width="741" alt="スクリーンショット 2019-12-16 21.35.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/dce6e3fd-176a-7916-c70f-48622bb4b83b.png">
今のMaplatEditorは0.3.1ですが、そのダウンロードリンクは以下になります。
MaplatEditorのgithubサイトのリンクは、最新版が更新されるたびにダウンロードリンクも更新されます。

* Windows用 (64ビット): https://t.tilemap.jp/maplat/dist/MaplatEditor-0.3.1-win32.zip
* Mac用: https://t.tilemap.jp/maplat/dist/MaplatEditor-0.3.1-darwin.zip

#### Mac版

インストールと言っても、基本的にダウンロードしてzipを展開するだけです。
<img width="882" alt="スクリーンショット 2019-12-16 21.48.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/f41986ee-320c-291e-b7be-aec75c801fa4.png">
Mac版はzip展開すると、中に`MaplatEditor.app`というアプリケーションがあります。
これを実行すると、MaplatEditorが起動します。
この`app`ごと、どこに移動しても起動可能です。

#### Windows版

Windows版はzip展開すると、中に`MaplatEditor.exe`というファイルがありますが、同じレベルにたくさんの`dll`、フォルダなども合わせて展開されます。
Windows版は`exe`単独で動かしても動作せず、これらの周辺のファイルも一緒に動かしてあげないと動作しません。
一緒に動かしてさえあげれば、どこでも動作します。
<img width="882" alt="スクリーンショット 2019-12-16 21.48.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/8fc1643c-7e53-69f8-571e-caa3c4341d85.png">

#### 起動してみる

それでは、展開した`app`または`exe`を起動してみます。
下記のような画像がでてくれば正常に動作しています。
下記画像はMac版ですが、Windows版でも
<img width="1312" alt="スクリーンショット 2019-12-16 22.02.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/2cddfbed-131c-a39e-f843-a9c34adadbd1.png">
最近のOSだと、WindowsでもMacでも、「信頼できないダウンロード元からなので実行できません」うんぬん出てくる場合がありますが、その辺はセキュリティー設定でこいつだけを信頼してから実行してください。
そうすると2度目からは出ません。
この辺はいずれちゃんと正規な署名をしないといけないとは思っていますが、まだelectronアプリで署名する方法をよくわかっていません。
詳しい方教えて助けていただけると嬉しいです。

------

今日のところは、とりあえず起動が確かめられたところまでです。
地図画像の登録、データ保存などは明日以降。
PowerPointのアドインであるIguanaTexを使用する際の注意

# 背景
僕は普段PowerPointをDropbox上に保存しているのですが，Localで使用できていたIguana Texが急に使用できなくなってしまいました．

出てくるエラーは，
> Could not start process: '"pdflatex" -shell-escape -output-format dvi-interaction=batchmod "IguanaTex_temp.tex"'. GetLastError returned 0

というものでした．

調べたら[このリンク](http://www.jonathanleroux.org/software/iguanatex/faq.html)にヒットしたので，リンク先の記事に従ってコマンドプロンプト上でlatexと打ってみたのですが，きちんと認識されています．

# 解決法
単純にDropBoxからLocalのストレージにファイルを移動することでエラーは表示されずきちんと処理してくれるようになりました．
非常に単純なことでしたがシェアしておきます．
PHPの便利な配列関数

##はじめに
PHPの配列操作で、個人的によく使っている関数などを書きます。

##配列への変換
###String→Array
```php:test.php
<?php
	$foo_string = 'aaa,bbb,ccc';
	$foo_array = explode(',', $foo_string);

	var_dump($foo_string);          
    // string 'aaa,bbb,ccc' 

	var_dump($foo_array);
    // array(size=3) 
    //   0 => string 'aaa' 
    //   1 => string 'bbb'
    //   2 => string 'ccc'
```
implode()を使うと、Array→String の逆変換ができます。

###Object→Array
```php:test.php
<?php
	$foo_obj = new stdClass();
	$foo_obj->key = 'val';
	$foo_array = json_decode(json_encode($foo_obj), true);

	var_dump($foo_obj);
    // object(stdClass) 
    //   public 'key' => string 'val'

	var_dump($foo_array);    
    // array(size=1) 
    //   'key' => string 'val'
```
Array型へのキャストやget_object_vars()での配列変換では、ネストしたオブジェクトを配列化してくれないので、
多少読みづらくてもjson_encode()を使って変換したいです。


##配列内の検索
###配列に値があるか
```php:test.php
<?php
	$foo = ['1' => 'aaa', '2' => 'bbb', '3' => 'ccc'];
	$bar = 'bbb';
	$is_exists = in_array($bar, $foo, true);

	var_dump($is_exists);
	// boolean true
```
in_array()の第３引数をtrueにすると、厳密な型比較をします。

###配列のキーに値があるか
```php:test.php
<?php
	$foo = ['1' => 'aaa', '2' => 'bbb', '3' => 'ccc'];
	$bar = '2';
	$is_exists = array_key_exists($bar, $foo);

	var_dump($is_exists);
	// boolean true
```

##配列の整形
###配列から単一のカラムの配列を生成
```php:test.php
<?php
	$foo = [
		[
	        'name' => 'aaa',
	        'gender' => 'man',
		],
		[
	        'name' => 'bbb',
	        'gender' => 'male',
		],
		[
	        'name' => 'ccc',
	        'gender' => 'man',
		],
	];
	$bar = array_column($foo, 'name');

	var_dump($bar);
	// array (size=3)
    // 0 => string 'aaa'
    // 1 => string 'bbb'
    // 2 => string 'ccc'
```
例示しているのはかなり単純な例ですが、第３引数の設定などをするとかなり柔軟に配列を生成可能です。

###配列の結合
```php:test.php
<?php
	$foo = ['aaa' => 'bbb'];
	$bar = ['ccc' => 'ddd'];
	$merged_array = array_merge($foo, $bar);

	var_dump($merged_array);
    // array (size=2)
    // 'aaa' => string 'bbb' 
    // 'ccc' => string 'ddd' 
```

##さいごに
PHPは配列の関数が数多く用意されているので、配列を扱うのが楽しいです。
その他の配列関数については、公式のリファレンスをご参照下さい。
https://www.php.net/manual/ja/ref.array.php
文化祭用にランチャーを作った話

こんにちは。今年は OpenSiv3D(v0.4.0) を使用して文化祭のランチャーのプログラム開発を担当したので記事にしたいと思います。
# 何を作ったか
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">最後は、興風祭のゲームランチャー。<br>高1の部員2人で、デザインと本体作成を分担している。<br>今年のゲーム制作者たちの努力がこのランチャーに詰まっています！<br>ぜひ会場に来て、プレイしてください！！<br>(一部個人情報保護のため画像が表示されています)<br><br>使用ソフト:OpenSiv3D <a href="https://t.co/zRBrtRyFZr">pic.twitter.com/zRBrtRyFZr</a></p>&mdash; 早稲田中高PCプログラミング部 (@waseda_pcp) <a href="https://twitter.com/waseda_pcp/status/1177552520828243969?ref_src=twsrc%5Etfw">September 27, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
# 便利だった機能
このランチャー制作で特に苦労したのがアニメーションなのですが、それを作るのに`Transition` や `Periodic::Sine0_1()`などがとても便利で、これとEasingを組み合わせてほとんどの動きを作っています。
この二つの機能は [OpenSiv3Dのサンプル](https://scrapbox.io/Siv3D/%E3%83%9E%E3%82%A6%E3%82%B9%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A7%E5%9B%B3%E5%BD%A2%E3%82%92%E3%83%8F%E3%82%A4%E3%83%A9%E3%82%A4%E3%83%88) に載っているのでそちらを参考にしてください。

# 苦労したこと
 
アニメーションももちろん苦労しましたが、ランチャー制作にあたってウィンドウへの操作が必須だったので、Windows APIをかじった程度の腕だとそこに苦労しました。いくつか苦労したことを挙げていきたいと思います。
###Process機能の未実装
旧Siv3Dにあった`System::CreateProcess`にあたる機能が当時OpenSiv3Dにはありませんでした。
自分で実装するのは手間がかかるなーと思いながらSiv3DのSlackで質問したところ、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218959/808a0bf6-a40d-edf7-0ebf-b49295dd665a.png)

__1分で参考になるリンクと共に回答が来ました。__

開発者に質問しやすく対応が早いのはSiv3Dの良いところですね。
※ちなみにOpenSiv3D v0.4.1で `Process` 機能が公式に実装されたので現在は楽にできるようになってます。

###アクティブウィンドウ問題
ランチャーからゲームを起動している間に何らかのキー入力をするとアクティブなウィンドウがランチャーウィンドウのまま起動してしまう致命的なバグがありました。
そこでこれを解決するためにゲームウィンドウのhWndを使いアクティブ化しようと考えたのですが、プロセスIDしか保持していないため
> 各ウィンドウのプロセスIDを調べ、ゲームのプロセスIDと一致していたらそのhWndを返す

という関数を作り、取得したhWndを使って

```c++:
SetWindowPos(processHWND, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
```
という風にすることで解決しました。
###フルスクリーン化問題
例年モニターにゲーム画面のみを映すゲームセンター形式なので、フルスクリーン化は必須でした。
フルスクリーン化するだけなら[公式リファレンス](https://siv3d.github.io/ja-jp/reference/fullscreen/)を参考にすれば実装できる（僕の場合はSceneのサイズを変更したくなかったので `Window::SetFullscreen`の第三引数に`WindowResizeOption::KeepSceneSize`を指定しました）のですが、ここで問題が発生しました。
ランチャーをフルスクリーン化するとゲームウィンドウがランチャーの後ろに隠れてしまうようになりました。

困ったので `Window::SetFullscreen` の内部コードを調べたところ、`SetWindowPos` で `HWND_TOPMOST`が指定されていました。
普通、アクティブなウィンドウが最前面にくるのですが、`SetWindowPos` で `HWND_TOPMOST` を指定すると、ウィンドウは常に最前面におかれ、他のウィンドウがアクティブになっても最前面ウィンドウの後ろにおかれます。そのため作成したゲームウィンドウがフルスクリーン化、つまり最前面指定されたランチャーより後ろに置かれていたのです。
これはランチャーのhWndを使って

```cpp:
SetWindowPos(launcher_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
```
という風にすることで最前面指定を解除でき、解決しました。
###その他の問題
- ゲームを起動している最中にタスクバーとスタートボタンが見えてゲームセンター感がなかったので、タスクバー`Shell_TrayWnd`とスタートボタン `Button` で `FindWindow` してhWndを取得、これを使い `ShowWindow` で `SW_HIDE` を指定して隠しました
- これは別に苦労してないのですが、ゲームのプレイ動画を流したかったけど動画再生機能が実装されてなかったので連番画像を12FPSで5秒ほど流してループさせるといった形式で代用しました

# 感想
デザイン担当が頑張ってくれたので僕はデザインの再現と機能面の実装をするだけで済み、とても早く作業が進みました。分担は大事ですね。
文化祭当日でも特にバグはでなかったのでなんとかうまくいって良かったです。
# おわりに
これからランチャーを制作したい人は [OpenSiv3Dサンプルのゲームランチャー]( https://siv3d.github.io/ja-jp/sample/game-launcher/ ) をぜひ読んでみてください。僕の場合はキーボードのみで動作させる、フルスクリーン表示させるという前提があったのでやや苦労しましたが、その辺にこだわりがなければほぼサンプルだけでも制作できると思います。がんばってください。
Riot.js v4 内部プロパティまとめ

[Riot.js Advent Calendar 2019](https://qiita.com/advent-calendar/2019/riotjs) の16日目が空いていたので埋めます。

## はじめに
[前回](https://qiita.com/nekijak/items/dad31aeb541a468634af)の調査で`Symbol('riot-component')`がキーとして使われていることが判りました。
これ以外にもいくつか似たようなものがあったので、まとめておきます。

## Symbol('riot-component')
```javascript
DOM_COMPONENT_INSTANCE_PROPERTY = Symbol('riot-component')
   :
element[DOM_COMPONENT_INSTANCE_PROPERTY] = this; // add eventually the 'is' attribute
```
riotファイルがマウントされている(子コンポーネント)エレメントのプロパティに定義されています。
前回でも触れました。中身は対象コンポーネント(つまり子)の`this`です。

## Symbol('parent')
```javascript
PARENT_KEY_SYMBOL = Symbol('parent')
   :
this[PARENT_KEY_SYMBOL] = parentScope
```
`this`のプロパティに定義されています。
自分が他のコンポーネントから呼び出されている場合に`親コンポーネントのthis`が入っています。
自分より親がいない場合は`undefined`となっています。

## Symbol('attributes')
```javascript
ATTRIBUTES_KEY_SYMBOL = Symbol('attributes')
     :
this[ATTRIBUTES_KEY_SYMBOL] = createAttributeBindings(element, attributes).mount(parentScope);
```

`this`のプロパティに定義されています。
コンポーネントのマウント時に渡された情報（の複製）が入っています。

## Symbol('template')
```javascript
TEMPLATE_KEY_SYMBOL = Symbol('template')
   :
this[TEMPLATE_KEY_SYMBOL] = this.template.createDOM(element).clone(); // link this object to the DOM node
```

`this`のプロパティに定義されています。
コンポーネントのHTMLテンプレートに関する情報（の複製）が入っています。

## まとめ

この中で使えそうなのは、`Symbol('riot-component')`と`Symbol('parent')`ですね。

親から子を呼ぶには、`Symbol('riot-component')`

```javascript:親から子
const elm = this.$("my-child");
let child = elm[Object.getOwnPropertySymbols(elm).find(symbol => symbol.toString() === "Symbol(riot-component)")];
console.log(child);
```

子から親を呼ぶには、`Symbol('parent')`です。

```javascript:子から親
let parent = this[Object.getOwnPropertySymbols(this).find(symbol => symbol.toString() === "Symbol(parent)")];
console.log(parent);
```
クラウドについて

今回はクラウドについて投稿します。
なんとなくで覚えてる単語を今は投稿していく方針です。

# クラウドコンピューティング
クラウドの正式名称です。

ソフトウェアやハードウェアの利用権などをネットワーク越しに提供する技術を
「クラウドコンピューティング」（Cloud Computing）と呼びます。
　
レンタルサーバとは異なり「必要な時に、必要な分だけ使う」事ができるので
スモールスタートでサービスを始める際に重宝します。

# クライアント
ユーザーのことにあたります。

## 単語の意味として
クライアント(Client)とは「何か（モノやサービスなど）を提供される人」という意味です。

## IT技術として
クライアントとは、Webサイトを閲覧するスマホやPCにあるWebブラウザのことを言います。

# サーバ
サービスの大元にあたる機械にあたります。

## 単語の意味として
サーバ(Server)とは「何か（モノやサービスなど）を提供する人」という意味です。

## ハードウェア
ソフトウェアを格納する倉庫

## ソフトウェア
Webサーバなど

### Webサーバ
「Webブラウザからコンテンツを閲覧できる状態にしてくれているモノ」を意味します。

# デプロイ
デプロイ（deploy）とは配置する、展開するといった意味の英単語です。

webサービスにおいて
サーバ上にアプリケーションを配置し、Web上に展開するといった意味合いと考えて下さい。

# AWSについて
AWSとはAmazon Web Servisesの略で、米Amazonが提供している 
クラウドコンピューティングサービス の総称です。
　
サービスに

* Amazon EC2(仮想サーバ)
* Amazon S3(クラウドストレージ)
* Amazon RDS(データベース)

などがあります。
データセットのローダーの作成

# はじめに
- 学習プログラムから、バッチサイズを与えて、学習画像と学習ラベルを取得したり、テスト画像やテストラベルを取得できる様にします。
- 下記の `TensorFlow` の実装を参考にしました。
    - https://github.com/tensorflow/tensorflow/blob/r1.12/tensorflow/contrib/learn/python/learn/datasets/mnist.py
- 以前 `pickle` 化した、学習画像、学習ラベル、テスト画像、テストラベルを読み込む箇所を改造しています。
- ソース一式は [ここ](https://github.com/maedamikio/public/tree/master/abe_or_ishihara/learning) です。


# データセット
- 最初に記載の通り、下記を参考にしています。
    - https://github.com/tensorflow/tensorflow/blob/r1.12/tensorflow/contrib/learn/python/learn/datasets/mnist.py

```
class DataSet():
    """データセットの管理."""

    def __init__(self, images, labels):
        self._num_examples = images.shape[0]
        images = images.reshape(images.shape[0], images.shape[1] * images.shape[2])
        images = images.astype(numpy.float32)
        images = numpy.multiply(images, 1.0 / 255.0)
        self._images = images
        self._labels = labels
        self._epochs_completed = 0
        self._index_in_epoch = 0
```

```
def dense_to_one_hot(labels_dense, num_classes):
    """Convert class labels from scalars to one-hot vectors."""
    num_labels = labels_dense.shape[0]
    index_offset = numpy.arange(num_labels) * num_classes
    labels_one_hot = numpy.zeros((num_labels, num_classes))
    labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1
    return labels_one_hot
```


# pickle データの読み込み
- 上記のデータセットに `pickle` の画像、ラベルを読み込みます。

## データの読み込み
- 設定ファイルを元に、オリジナルのデータ、もしくは水増しデータを読み込みます。

```
def load_data(one_hot=False, validation_size=0):
    """データセットを config.py に従い読み込み."""

    train_num = AUGMENT_NUM if USE_AUGMENT else 0
    datasets_file = os.path.join(DATASETS_PATH, ','.join(CLASSES), '{}x{}-{}.pickle'.format(IMG_ROWS, IMG_COLS, train_num))

    with open(datasets_file, 'rb') as fin:
        (train_images, train_labels), (test_images, test_labels) = pickle.load(fin)
```

## ラベルの one hot 変換
- 今回は、読み込んだラベルデータは、`one_hot` に変換して後工程に繋げています。
- 例えば、晴れ: 1、曇り: 2、雨: 3 の様にラベルが付いているとすると、晴れ: (1, 0, 0)、曇り: (0, 1, 0)、雨: (0, 0, 1) の様な形への変換です。
- 詳しくは、`機械学習 one hot` で検索してください。

```
    if one_hot:
        num_classes = len(numpy.unique(train_labels))
        train_labels = dense_to_one_hot(train_labels, num_classes)
        test_labels = dense_to_one_hot(test_labels, num_classes)
```

## 画像とラベルのデータセット クラス化
- データセットを読み込むたびに、位置をシャッフルしています。
- バリデーションが必要な場合もあるので、学習データから切り出せる様にしています。
- 最後に、学習、バリデーション、テストのデータセットクラス化をしています。

```
    perm = numpy.arange(train_images.shape[0])
    numpy.random.shuffle(perm)
    train_images = train_images[perm]
    train_labels = train_labels[perm]

    validation_images = train_images[:validation_size]
    validation_labels = train_labels[:validation_size]
    train_images = train_images[validation_size:]
    train_labels = train_labels[validation_size:]

    train = DataSet(train_images, train_labels)
    validation = DataSet(validation_images, validation_labels)
    test = DataSet(test_images, test_labels)

    return Datasets(train=train, validation=validation, test=test)
```


# おわりに
- データセットのローダーを作成しました。元データの、`pickle` データを読み込む箇所に改造を行なっています。
- ただ、最近は、この辺りを隠蔽してプログラム出来るので、わざわざ実装する必要は少ないです。最初で最後だと思う。
- 次回は、学習モデルを作成したいと思います。
データベースで日付を扱う

#はじめに
SQLで日付の扱い方がわからなかったので、取り組んだ内容をメモに残す

#SQLでデータベースから最新の日付を取得する
例えば運動の記録が保存してあるテーブルがあるとして、最も直近で行ったアクティビティの日時を取得したい

TABLE NAME : ACTIVITY　　

| TRAINING       |     DISTANCE   |    START_DATETIME   |
|:-----------------|------------------:|:------------------:|
| RUN             |              6 |        20190405T08:20:10        |
| BIKE           |            80 |       20190406T10:20:15       |
| RUN           |            10 |       20190406T17:26:10       |
| RUN           |            10 |       201904010T10:26:10       |
| RUN           |            15 |       201904014T10:26:10       |

日時であっても数値のようにMAX()を使ってあげれば最も直近で行ったアクティビティを取得可能
ただし未来のアクティビティが記録されている場合はそちらが取得されてしまうので注意

```sql:sql
SELECT MAX(START_DATETIME) FROM ACTIVITY 
```

#SQLでデータベースから指定した日時の行を取り出す
指定した日時の間で行ったアクティビティを抽出したい。

例えば上のテーブルにおいて、2019年4月6日から2019年4月12日の間で行ったアクティビティを取り出したい。
このような時は以下のようにかける

```sql:sql
SELECT * FROM ACTIVITY WHERE '20190406T00:00:00' <= START_DATETIME AND START_DATETIME < '20190413T00:00:00'  
```

BETWEEN句を使うとスマートに書けるが、個人的には以下の理由から上の書き方が好み。

- 不等号が「＞、＜」固定で、「≧、≦」が扱えない。
- 普段のプログラミングと同じ感覚で書ける。

#最後に

意外と日付だからと特別に句が用意されているのではなく普通に数値感覚で扱えることがわかった。
だからこそ細かいところで思いもよらない結果が表示されたりしそうなので注意する。
GYOMUハックエンジニアのモチベーションについて

これは[GYOMUハック/業務ハック Advent Calendar 2019](https://adventar.org/calendars/4192)の13日目の記事です。

# モチベーションについて

GYOMUハックエンジニアをやっていると、データインポートのような業務を回す上では重要な作業が出てきます。
だけど私的にはあまり面白くなく、辛い作業です。（この手の作業をもくもくとこなせる人を尊敬します）
この手の作業が楽しくなるように工夫してみます。

# どうやるか？

ツールを作ります。

Salesforceならデータローダやデータインポートウィザードがあるのですが、プログラミングの練習だと思って作ります。

Common LispでSalesforce連携ができないかと思い、途中まで作ったライブラリがこちらです。
https://github.com/tamurashingo/cl-salesforce-bulk


```cl:example
(defparameter *upsert-record*
  "Name,Description,ExternalId__c
\"Tamu Systems, Inc.\",\"update record\",C00001
\"new company\",\"create record\",C00002
")

(ql:quickload :cl-salesforce-bulk)

(defvar *conn* (cl-salesforce-bulk.connection:login "tamura.shingo@gmail.com" "password#password" "37.0"))
(cl-salesforce-bulk.api:bulk/upsert *conn* "Account" *upsert-record* "ExternalId__c")
```


# 気をつけた点

## このツールがなくても誰も困らないようにする

Salesforceであれば、データローダやデータインポートウィザードがあるので、何かの理由で実行環境が使えなくなっても業務は回ります。自分が担当じゃなくなったときは「データローダでインポートをお願いします」で済みます。

これがCommonLisp処理系を入れてコマンドラインから `sbcl` を起動して〜、だとなにかエラーがあったときに対応できる可能性は結構低いです。

（逆にこのツールがないとみんな困る状況になるまでツールが成長してしまったのであれば、みんなが分かる言語やライブラリで書き直したほうが良いと思います）


## ツール作成が本業にならないようにする

あくまでモチベーション維持、モチベーションアップのためにやることです。
本業(GYOMUハック)のじゃまにならない程度の稼働におさえます。




# まとめ

- ツールを作ってモチベーションアップ
- プログラミングは楽しい
- いつでも標準のやり方に戻れる程度のやつを作ろう