OmniAICreator/Qiita-1.07M huggingface dataset:
【Linux】特定の文字列を含むファイル名を表示する

特定の文字列を含むファイルを探す方法をメモしました。

`grepコマンド`を使います。

# 参考記事

>[grepコマンドの詳細まとめました【Linuxコマンド集】](https://eng-entrance.com/linux-command-grep)

>[【 grep 】コマンド――特定の文字を含む行を抽出する](http://www.atmarkit.co.jp/ait/articles/1604/07/news018.html)

>[【find・grep】特定の文字列を含むファイルのリストを取得する方法。](https://qiita.com/pokari_dz/items/0f14a21e3ca3df025d21)

# ファイル名のみ表示

指定したディレクトリ以下を再帰的に検索し、検索対象の文字列が存在するファイル名を表示します。

```sh
$ grep -ril "文字列" ディレクトリのパス
```

- git_testディレクトリ内にある"first"を含むファイルを検索した結果

```sh
$ grep -ril "first" git_test
git_test/test_01.txt
git_test/test_02.txt
git_test/testdir/test_03.txt
git_test/testdir/test_04.txt
```

# ファイル名と該当行を表示

指定したディレクトリ以下を再帰的に検索し、検索対象の文字列が存在するファイル名と該当行を表示します。

```sh
$ grep -rin "文字列" ディレクトリのパス
```

- git_testディレクトリ内にある"first"を含むファイルを検索した結果

```sh
$ grep -rin "first" git_test
git_test/test_01.txt:3:first
git_test/test_02.txt:3:first
git_test/testdir/test_03.txt:3:first
git_test/testdir/test_04.txt:3:first
```

# 今回使用したオプション

## -r(--recursive)
サブディレクトリ内も含めて（再帰的に）検索する。

## -i(--ignore-case)
大文字・小文字を区別しない。

## -l(--files-with-matches)
検索結果にファイル名のみ表示する。

## -n(--line-number)
行番号を表示する。

# fgrepコマンド
今回は`grep`を使用しましたが、正規表現を使用しなければ`fgrep`で高速検索ができるそうです。

# 拡張子を指定した絞り込み
- 平成30年12月12日追記

以下の書き方で、特定の文字列を含むtxtファイルの名前のみを表示する事ができます。
探したいファイルの拡張子がハッキリしている場合は便利です。

```sh
$ find ディレクトリのパス -name "*.txt" | xargs grep -l "文字列"
```
react + railsで車検の代車を管理するホワイトボードアプリを作ってみた

# 車検の代車管理ホワイトボードアプリ
**※2025/03/26追記：Markdownのパーサーの変更に合わせて修正**
**※2021/09/09追記：セキュリティ上の理由でリポジトリの公開をやめました。**
**※2019/07/25追記：現在も本番環境では改修を続けているため記事を書いた時点と仕様が異なる点があります。**
**※記事の内容は2018/12時点のものです。**
車検の代車管理のホワイトボードアプリを作りました。
どの顧客にどの代車をいつ貸し出すのかを管理するアプリです。
![aaa.gif](https://qiita-image-store.s3.amazonaws.com/0/227948/ecd9a847-e7c0-877e-eaa0-fb3fb7210f8f.gif)
以下のURLから実際に触ることができます。※IE、edge非対応

URL: [https://www.loaner-car.com](https://www.loaner-car.com)
~~Github: [https://github.com/ma-ak2011/loanercardemo](https://github.com/ma-ak2011/loanercardemo)~~


Password: 1234567890 メールアドレス: test@test.com (時間がない人のためのデモ用アカウント)

よくないところや改善点など感想をいただけたら嬉しいです。
またセキュリティの脆弱性などの指摘もお待ちしてます。

# 使用した技術

### クライアントサイド
- react
- react-connected-router
- react-calendar-timeline
- redux
- redux-saga
- superagent
- immutable.js

#### Unit Test
- jest
- enzyme

### デザイン
- MaterialUI

### サーバーサイド
- Ruby On Rails で実装したAPI

### サーバ
- Ubuntu
- Nginx + Unicorn

### CI/CD
- CircleCi

### インフラ
- AWS

AWSの構成は下の図のようにしました。
※codedeployでのデプロイはBlueGreenデプロイにしています。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/227948/c82c7acb-77a2-d491-8b82-546661f02351.png)


それぞれの技術についての詳細はまた別途記事を書こうかなと思っています。
# 設定した目標
優先順
1. reactの知識を深める。
2. SPA(画面遷移はしない)で実装する。
3. StateはReduxで管理。
4. JsのUnit Testを書く。（Componentも）
5. Linuxを使った環境を全体的に理解する。
6. AWSを理解する。
7. CI環境を構築する。

### なぜこのような目標になったのか？
reactが１番の目的だったのですが、目標にはreactには直接関係ない分野もたくさんあります。
本当はreactだけ勉強して他の環境は普段慣れ親しんだものを使いたかったのですが、そうはいかない事情がありました。

今まではずっと.Net環境で開発していたのですが、たまたま2年ほど前にクライアントサイドにreactを採用する機会がありました。それ以来ずっとreactの案件に入りたいと思っていたのですが、日々の業務に忙殺されてなかなか準備ができませんでした。
そしてようやく本格的に準備を始めたのですが、あることに気づきました。

.Net環境でreact使ってる案件がほとんどない！

reactをやるためにはどう見ても他の環境に移動せざるを得ませんでした。
しかし今までと環境が違いすぎて不安材料が多すぎました。
今までの環境とreact使ってる案件の環境を試しに比較してみると、結構覚えることがありました。

| 環境   |   開発マシン    |    サーバー    |    DB    | サーバーサイドの言語 | クラウド |
|:---------|:----------:|:--------:|:--------:|:--------:|:--------:|
| react使ってる案件 | Mac   |  Linux   |  MySQL<br>Postegreなど  |  PHP、Java、<br>Rubyなど  |  AWS    |
| .Net           | Windows  |  WindowsServer |  SQLServer    |  C#    |  Azure    |

考えていても仕方がないのでこれらをまとめて全体的に理解するために準備をしました。
少し準備が進んで「何か作ってみよう。」と思っていた頃に両親からの相談があり作ってみることにしました。

# 車検代車管理ホワイトボード　事の発端
両親は自営業で小さな自動車の修理工場を経営しています。
前回実家に帰った時、「車検周りの管理が大変で辛い。特にホワイトボードが大変だ。」と言って
その写真を見せてくれました。
この写真を参考に小さなプロトタイプを作りました。
![IMG_0625.JPG](https://qiita-image-store.s3.amazonaws.com/0/227948/af47d1fd-f17a-216e-d87a-80afeb3a222d.jpeg)
### 手作りボードの問題点
1.横軸が代車、縦軸が日付になってます。
  →代車が昔は４５台ほどあって今は３５台ほどだそう。また増えたらこのボードでは対応できない。

2.付箋の色は代車貸出の理由を表しているそうです。（黄→車検、青→車販売、板金→ピンク、その他→緑）
  →付箋はよく剥がれ落ちるので付箋にも代車名と日付を書かなければいけないので２度手間。

3.マジックで書いた矢印は貸出期間を表しているそうです。
  →マジックの線が細いため、縦軸と混ざってぱっと見わかりずらい。

# 感想
- react-calender-timelineの紹介みたいになってしまった。
- reactのデザインパターンをもっと学んでどんどん使っていきたい。
- railsは自動生成してくれるのでかなり楽だった。

# 改善したいこと
- react-calender-timelineのヘッダーの色変えたい。
- styleをインラインで書いたところがあるのでcss in jsをもっと勉強したい。
- circleciにrspecは組み込んであるもの、時間的にUnitTestを実装できなかった。
- jsのUnit Test充実させたい。（今の所ほんの一部）
- AWSはCloud​Formationを使ってサクッと作りたい。
PythonでItem2Vecを使って本のレコメンドをしてみた。

「久しぶりに小説なんか読みたいな〜」と書店に行くも自分ってどんな本が好きなんだっけ？
と分からなくなるし、大手通販サイトはイヤホン買ったらイヤホン勧めてくるしということで自分でレコメンドシステムを作ってみることにしました。

## やりたいこと
・Item2Vecという手法を使って、本をベクトル化し自身が今までに読んで面白かった本との類似度を求めることで好みが似通った本をオススメしてもらいたい。

・複数の好みの本を足し合わせたベクトルとの類似度を求めることで新しいジャンルの本と出会いたい！（[こちらのスライドを参考にさせていただきました](https://www.slideshare.net/recruitcojp/ss-56150629)）

## Item2Vecとは
そもそもItem2Vecとは単語をベクトル化する手法として有名なWord2Vecをアイテムベースで転用したものです。
ちなみにWord2Vecの解説はこちらの記事がとてもわかりやすいです。([絵で理解するWord2vecの仕組み](https://qiita.com/Hironsan/items/11b388575a058dc8a46a))
簡単に説明するとWord2Vecは文章内の単語同士の位置関係から各単語をベクトル化するのですが、Item2Vecはユーザーのアクションログや購買ログなどの時系列データの位置関係から各アクション・商品をベクトル化するものです。単語が商品に変わっただけで手法はWord2Vecと何も変わりませんね。
今回はこの商品を本とすることでベクトルを獲得します。

##学習データ
学習データはSeleniumを使って[読書メーター](https://bookmeter.com/)という各ユーザーが読んだ本を記録・共有するwebサービスからスクレイピングしユーザーの最近記録した本のIDを10件ずつ取得しました。
各ユーザーの10件の読書ログがWord2Vecにおける１文章にあたります。
(読書メーターさんありがとうございました。)

##Word2Vecの実装
手法自体はWord2Vecとなんら変わらないのでgensimを使ってベクトルを取得します。
ちなみにオプションとして本の多様性が出ればいいなぁとベクトルサイズは少なめの100にしました。
書いたコードはこれだけです。

```
from gensim.models import word2vec
model = word2vec.LineSentence("data.txt")
book_model = word2vec.Word2Vec(model, size=100, min_count=40, window=10,sg=1)
book_model.wv.most_similar(["本のID"],[],10)
```

##結果（作品のネタバレあり）
入力例として有名な作品をいくつか入れてみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/325334/34e16792-f944-96a1-3a8e-13078a3b77ca.png)

評価指標がないことが難点ですが
「君の名は。」については序盤にスピンオフ作品や新海誠作品が並んでおり、中盤以降の作品に関しては死後の人物と会ったりする話などところどころ「君の名は。」と内容が似ている作品がある気がします。。。。？
しかし「下町ロケット」や「火花」については同じ著者の作品しか出力されなかったり、同じ芥川賞を受賞した作品がレコメンドされるなど内容と関係のない部分が反映されてしまいます。
最後に興味深い点として「君の名は。」と「下町ロケット」を足し算した作品のレコメンドでは両作品の特徴として「若者」＋「下克上」テイストが反映されたのか「ビリギャル」などがレコメンドされており面白い結果になったかなと思います。

##追記
結果を見るとだいぶノイズのような作品が多く見受けられたので改善のために別途読書メーターから各ユーザーが読んだ本の著者をスクレイピングしItem2Vecにより著者をベクトル化してみました。
これを行なった理由として「火花」の結果から見てわかるように芸能人の方が書かれた作品のレコメンドには芸能人の作品が多く出力されておりメディアや著者同士の親交が結果に影響しているのではと思ったからです。
結果、入力作品の著者を別途著者モデルに入力することで類似した著者を出力させ、彼らの作品をレコメンドから除くことである程度ノイズを削減することができました。

##終わりに
今回Qiita初投稿だったので、書き方がうまくないかもしれません。
内容も不十分かもしれませんが、間違っている箇所・疑問箇所は何でもコメントしてください！！！
PostgreSQLに新規登録しようとしたら、「duplicate key value violates unique constraint」と怒られた。

新規登録をしようとしたら、以下エラーが返ってきた。
それについて調べたので、メモ。

## エラーメッセージ
`Unique violation: 7 ERROR:  duplicate key value violates unique constraint "TableName_pkey"↵DETAIL:  Key (id)=(33) already exists. (SQL: insert into ~~(以下省略)`

## 解決方法 & 実行履歴
[PostgreSQLでINSERT時に自動採番の主キーが重複してエラーが出る場合の対処法](https://www.xmisao.com/2014/06/07/duplicate-key-value-violates-unique-constant-primary-key-on-postgresql.html)　で紹介されている方法で解決した。

ただ、Postgresの使い方や実行した結果等を記録として残したいので、記述します。

### PastgreSQLにログイン
```shell
# まずはhomesteadにログイン
$homestaed ssh

# PostgreSQLにログイン
vagrant@homestead:~$  psql -d DATABASE -U homestead -h 127.0.0.1
```

> 接続情報はプロジェクトの`.env`ファイルに記載されている。

> ```:.env
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=database_name
DB_USERNAME=homestead
DB_PASSWORD=＊＊＊＊＊
```

### 参考サイトの実行結果
参考：[PostgreSQLコマンドチートシート](https://qiita.com/Shitimi_613/items/bcd6a7f4134e6a8f0621)

```sql
# tableのレコード数を確認
database=# select MAX(id) FROM table_name;
 max
-----
  40
(1 row)

# シーケンスの番号を確認
# レコード数よりも小さいことが確認出来ました。
database=# select nextval('table_name_id_seq');
 nextval
---------
      34
(1 row)

#シーケンス番号をレコード数に合わせる 
database=# select setval('table_name_id_seq', (select max(id) from table_name));
 setval
--------
     40
(1 row)

# シーケンスの番号を再確認
# レコード番号以上になっている事が確認出来ました。
database=# select nextval('table_name_id_seq');
 nextval
---------
      41
(1 row)
```

これで、新規登録が出来ました。
しかし、採番されたのが42番。41番が欠番になってしまった。

もう一度登録してみると、43番となったので問題は解決したようだが、気持ち悪い。。。

### 「とりあえず、解決したから、もう良い」と言う場合
PostgreSQLを終了する

```sql
database=# \q
```

## シーケンスってなに？
> シーケンスオブジェクト(シーケンス生成器とも単にシーケンスとも呼ばれます)とは CREATE SEQUENCE コマンドで作成される 1 行の特別なテーブルです。シーケンスオブジェクトは通常テーブルの行に一意の識別子を生成するために使用されます。 
引用：[6.11. シーケンス操作関数 - PostgreSQL 7.3.4 ユーザガイド](https://www.postgresql.jp/document/7.3/user/functions-sequence.html)

上記サイトを見ると、以下記載もあった。
>**nextval**
シーケンスオブジェクトをその次の値に進めその値を返します。これは自動的に処理されます。 複数のセッションが同時に nextval を実行したとしても、それぞれの工程は個別のシーケンス値を間違いなく受け取ります。
引用：[6.11. シーケンス操作関数 - PostgreSQL 7.3.4 ユーザガイド](https://www.postgresql.jp/document/7.3/user/functions-sequence.html)

つまり、先ほどの最後に、`select nextval('table_name_id_seq');`をしたから、シーケンス番号が41番に進んでしまって、新規登録時42番が採番されてしまったのだった。
やはりコマンドは必ず一度調べてから実行すべきですね。

## なぜシーケンス番号がヅレるの？
> SQLでinsertして行く分には基本問題ないけれど、CSVなどからインポートした場合、保存した値とずれてしまい、（以降省略）
引用：[地方で活動するweb制作者の日々を綴るblog](http://blog.livedoor.jp/loopus/archives/50846480.html)

なるほど！
確かに該当のDLは、開発用のでもデータを流し込んで作った。

## まとめ
今までMySQLばかりを触っていたため、PostgreSQLを使ってこなかった。
そのため、今回PostgreSQLの操作方法やシーケンスオブジェクトと言うものを使っている事が知れたことは良かった。

今後もPostgreSQLとはお付き合いしていくと思うので、もっと仲良くなっていきたいなと思った今日この頃でした。
デバドラインストール不要 usbhidでアップロードできる教育系arduino　まなぼ～ど??

### デバイスドライバーインストール不要、標準usbhidデバイスとしてアップロードできるarduino互換機
私がArduino始めた数年前、ソフトウエアUSBのHIDベースのbootloaderを試したりしたけど、AVRDUDEをサポートしたものが無かったので諦めてました。
最近studuino miniというボードがArduinoIDEで使えると小耳にはさんだので、ちょっと調べてみました。
記事中のソフトは公開されているので、ググってダウンロードしてみてください。

###bootloadHID
そのままずばりなのですが、V-USBというソフトウエアUSBでHIDデバイスとしてHEXファイルをアップロードできるbootloaderです。
atmega系のMPUだけでArduinoボードが作れ、最もローコストなインプリメントで、またPCのデバイスドライバは不要なので、学校などで利用しやすいという点もメリットだと感じています。
これをArduinoIDEから使えるようにすればいいのですが、やはりAVRDUDEでのサポートはありませんでした。
studuino miniではどうやっているのかインストールして調べてみると、ArduinoIDE1.87では、bootloadhidのコマンドラインをprogrammer.txtに登録できるようです

```programmer.txt
stmini.name=Studuino mini
stmini.program.tool=bhid
```

bhid.exeというコマンドラインがstuduino miniボードのUSBデバイスの PID / VID 用のbootloadhidらしいので、
こいつをオリジナルのbootloadhidに置き換えれば、自作のbootloadhid用ボードで動作するんじゃないかとトライしてみました

###自作のbootloadhid用ボード

ちっちゃいものくらぶのちびでぃ～のpro基板にatmega168と12MHz水晶を載せて、USBコネクタをくっつけて、
bootloadhidベースのirukaさん作HIDmon88ブートローダー書き込んで、USBのHIDでアップロードできる事を確認してから、
studuino mini用のArduinoIDE1.87環境でHIDmon88添付のBOOTLOADHID.EXEと置き換えたら
[ArduinoIDEからアップロードできるようになりました。](https://www.youtube.com/watch?v=vJjkLokDBH0)

ArduinoIDEで使えたので、Scratch1.4ベースのstuduino miniのブロックプログラミング環境からでも[アップロードができるようですね♪](https://www.youtube.com/watch?v=R5ejYLfS0Wk)

###うまくいったので、LIPO電源でモータードライバ載せた基板を起し中～
![起し中～](https://scontent-nrt1-1.xx.fbcdn.net/v/t1.0-9/47170955_2285227804880950_7828363755716083712_n.jpg?_nc_cat=108&_nc_ht=scontent-nrt1-1.xx&oh=274e7d4ad990a9ccd162e54fe000b820&oe=5CA05833)

###基板が届いたので、はんだ付けしたった～
![基板が届いたので、はんだ付けしたった～](https://pbs.twimg.com/media/DuTy85kUcAALjcr.jpg)

###ロボットカ～に仕立ててみた
[カマボコ板切って基板、モーター、電池、前輪をくっ付けて、ロボットカ～に仕立ててみた🎵](https://www.facebook.com/tomon777/posts/2326277870775943
)
![ロボットカ～に仕立ててみた](
https://pbs.twimg.com/media/Du161yMV4AAYo07.jpg)
Visual Studio CodeにLaravel用おすすめExtension(拡張機能)を導入する

この記事は、「[【連載】初めてのWindows用Laravel 5.7開発環境構築入門](https://qiita.com/hitotch/items/a646972fe1992611e92b)」の孫記事です。環境などの条件は、親記事をご覧ください。
この記事は、「[XAMPP上にLaravel 5.7をインストールする 2018年12月版](https://qiita.com/hitotch/items/d22fa4c12d0f15f7adc4)」の子記事です。

---
　今回はVisual Studio CodeにLaravel用のExtension(拡張機能)を入れます。筆者のおすすめですが、拡張機能については好みによるので、好きなのを入れればよいかと。

# Laravel用Extensionを導入するには

Visual Studio Codeを開き、Extensionsを開いて、検索文字に``laravel``と入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/2808ccc7-373f-03b1-b9a6-99472a2bdd6b.png)

Laravel用Extensionがたくさん出てくるので、好きなのを入れます。

# おすすめExtension

## Laravel 5 Snippets

Auth::, Config::, Session:: などのスニペットを提供してくれます。
次のLaravel Blade Snippetsの前提おすすめExtensionなので、一緒に入れると良いでしょう。

## Laravel Blade Snippets

Blade(Laravelのテンプレート言語、HTMLの拡張みたいなの。C#でいうRazor) を記述するときに、超短縮入力を可能にしてくれます。
たとえば``html:5``とタイプするだけで、HTML全体を一気に書いてくれます。
![screenshot.gif](https://qiita-image-store.s3.amazonaws.com/0/315589/89e3601f-2d55-8755-1e46-f722b418bec0.gif)
（上の画像はLaravel Blade Snippetsより転載）

## Laravel Artisan

LaravelのArtisanコマンドをVisual Studio CodeのF1コマンドラインから簡単に実行できるようにしてくれます。

ターミナルを開く→PHP ARTISAN コマンド　とタイプする→結果

が

F1→ARTISAN コマンド

となります。
もちろんスニペットな動きもするので、Artisanの扱いがとても楽になります。

例えばルートリストを取るのは以下のようになります。
![route-list.gif](https://qiita-image-store.s3.amazonaws.com/0/315589/9957aa80-a4ca-14b6-9bde-0c6231e09845.gif)
（上の画像はLaravel Artisanより転載）

## Laravel goto view

コントローラからBladeに一気に飛べるようになります。

![use.gif](https://qiita-image-store.s3.amazonaws.com/0/315589/fb46f534-2e7a-62a5-1e99-314fd547d552.gif)
（上の画像はLaravel goto viewより転載）

## Laravel Blade Spacer

Bladeを記述するとき、{{}}などの中に適切なスペースを入れてくれます。

![preview.gif](https://qiita-image-store.s3.amazonaws.com/0/315589/2ea78aa9-fe8c-87d3-5bf8-006d82652a45.gif)
（上の画像はLaravel Blade Spacerより転載）
C++17のFilesystemを使ってみた

# 概要
カレントディレクトリのファイル一覧とかを超簡単に取得できる。
[C言語でフォルダ内のファイル数とファイル名を取得](https://qiita.com/ueken0307/items/5d82ac138b1d09cf7430) で苦しんだのはなんだったんだ...
`std::filesystem`にある。~~VC++だと`std::experimental::filesystem`。~~
Visual Studioをアップデートしたら`std::filesystem`で使えました。**(追記:2018/12/13)**

# コンパイル
## 環境
- gcc  :  8.2.1
- VC++ : 19.12.25834 (Visual Studio 2017)

## gcc
**`-lstdc++fs`オプションを付けないといけない。**
例:`gcc -o test test.cpp -std=c++1z -lstdc++ -lstdc++fs`

## VC++
~~`/std:c++17`を有効にしなくてok。(exprimentalだからかな)~~
~~例:`cl test.cpp`~~

`std::c++17`を指定してコンパイルする。
例:`cl test.cpp /std::c++17`
**(追記:2018/12/13)**


# カレントディレクトリのファイル一覧を取得する
cpprefjpを参考にした。
filename()までだと、出力がダブルコーテーションで括られる。

```c++

for(const std::filesystem::directory_entry &i:std::filesystem::directory_iterator(".")){
  std::cout << i.path().filename().string() << std::endl;
}
```

# 指定ディレクトリ以下のファイルを再帰的に表示
コマンドライン引数で指定したディレクトリ以下のファイルを再帰的にいい感じに表示。

```c++

#include<filesystem>
#include<iostream>

void printFile(std::string path,int depth = 0){
  for(const std::filesystem::directory_entry &i:std::filesystem::directory_iterator(path)){
    for(int i=0;i<depth;++i){
      if(i==depth-1){
        printf(" ├");
      }else{
        printf(" │");
      }
    }
    
    if(i.is_directory()){
      std::cout << i.path().filename().string() << std::endl;
      printFile(i.path().string(),depth+1);
    }else{
      std::cout << i.path().filename().string() << std::endl;
    }
  }
}

int main(int argc,char *argv[]){
  printFile(argv[1]);
  return 0;
}
```

実行結果

```
a.png
file2
file1
folder2
 ├test.png
folder1
 ├file3
 ├file4
 ├folder3
 │ ├file7
 │ ├file5
 │ ├file6

```
# 追記(2018/12/12)
再帰的にファイルを表示するだけなら`recursive_directory_iterator`を使えばいいっぽい。（名前の通りだね）
指定ディレクトリ以下のファイル,フォルダを再帰的にすべて表示

```c++

#include<filesystem>
#include<iostream>

int main(int argc,char *argv[]){
  for(const std::filesystem::directory_entry &i:std::filesystem::recursive_directory_iterator(argv[1])){
      std::cout << i.path().filename().string() << std::endl;
  }
  
  return 0;
}

```

実行結果

```
a.png
file2
file1
folder2
test.png
folder1
file3
file4
folder3
file7
file5
file6
```

# 参考
[cpprefjp - filesystem](https://cpprefjp.github.io/reference/filesystem.html)
[cpprefjp - 処理系](https://cpprefjp.github.io/implementation.html)
[本の虫 - GCCの実験的なfilesystemを使う方法](https://cpplover.blogspot.com/2017/01/gccfilesystem.html)
C++/CLI, C++/CX, WRL, C++/WinRT違いメモ

#メモの目的
URLや共有したい情報を記載。

作成中。


#C++ 言語・フレームワーク等比較

| 言語・フレームワーク・プロジェクション(？) | 将来性 | 特徴 |  メリット |  デメリット |
|:--|:--|:--|:--|:--|
| WinAPI | 昔ながらのAPI。直接使うことはほぼない ||||
| MFC | オワコン　VS2017ではオプション ||||
| C++/CLI | オワコン　VS2017ではオプション | グルー言語用途で使える||C++混在だとstd::mutexが使えない、自動並列化オプション/Qparが使えない など制限があったりする。|
| C++/CX | オワコン　VS2017ではオプション 　公式がWinRT仕様を推奨||||
| WRL | オワコン　VS2017ではオプション 　公式がWinRT仕様を推奨||||
| C++/WinRT | Microsoft公式推し||||

#C# から呼べるか
C#(.NET)から呼び出す方法

| No.| 項目 | 説明 |メリット|デメリット|
|:--|:--|:--|:--|:--|
| 1| COM | COMで通信 |||
| 2| DLLImport| C#からDLLImport使う。|||
| 3| CLI|C#からは普通のライブラリとして呼べる。||C++/CLIがオワコン|

C++の種類ごとに使える方法

| C++種類（フレームワーク・プロジェクション） | 可・不可 | 説明 |
|:--|:--|:--|
| WinAPI |可|COMかDLLImport|
| MFC |可|COMで。DLLImportもいける？知らんけど。|
| C++/CLI | 可 | CLI|
| C++/CX |可？|COM？|
| WRL |可？|COMがどうとか言うてるので呼べるでしょう。|
| C++/WinRT |可らしい|[http://www.moonmile.net/blog/archives/3429](http://www.moonmile.net/blog/archives/3429)　でそんな感じのことが。まだちゃんと読んでない。COMだけどCOMかどうか意識しないでいい？|


#参考URL
##C++/CLI
Microsoft「C++ のサポート ライブラリ」
https://docs.microsoft.com/ja-jp/cpp/dotnet/cpp-support-library?view=vs-2017


[C++/CLIとC++混在でstd::mutex使えないのでその代わりを実装](https://qiita.com/hidetaka0/items/59002521130450093dbf)

##WinRT

>For authoring and consuming Windows Runtime APIs using C++, there is C++/WinRT. This is Microsoft's recommended replacement for the C++/CX language projection, and the Windows Runtime C++ Template Library (WRL).

(https://docs.microsoft.com/ja-jp/windows/uwp/cpp-and-winrt-apis/より引用)

Microsoft「C++/WinRT」
https://docs.microsoft.com/ja-jp/windows/uwp/cpp-and-winrt-apis/

Kenny Kerr「C++ - C++/WinRT の紹介」
https://msdn.microsoft.com/ja-jp/magazine/mt745094.aspx

Moonmile Solutions Blog 「[win8] c++/cx から c# のライブラリは使えない…と思ったが使える」
http://www.moonmile.net/blog/archives/3429
XamarinでAndroidプロジェクトをアーカイブするときに「『共有 Mono ランタイムを使用する』オプションがオフになっていることをご確認ください」ってエラーが出たときの対処法

#はじめに
Visual StudioでXamarinでアプリケーションを作るときに、Androidのプロジェクトを`アーカイブ`するときがあります。
`アーカイブ`するときは`ソリューションエクスプローラ`からAndroidプロジェクトを右クリックしてコンテキストメニューから`アーカイブ...`を選択します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/80e07ae8-7d9c-3c5b-4821-c359c65e41c8.png" title="" alt="image.png" width="60%" height="" >

しかし、以下のようなメッセージが出てアーカイブに失敗することがあります。

「Please ensure that you are using a release configuration and that "Use Shared Mono Runtime」
「リリース構成を使用していることと、プロジェクトのビルドオプションの[共有 Mono ランタイムを使用する]オプションがオフになっていることをご確認ください。」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/b6a5d58f-c8e0-d0a6-28f8-49df53fd4ee8.png)

この記事はこれを解決する方法です。

#環境

- Windows10 Pro
- Visual Studio 2017 
- Xamarin


#解決方法

エラーメッセージにあるように、「共有 Mono ランタイムを使用する」をオフにすればよいことがわかります。
簡単ですね。
ただ、このとおりの設定項目が無いことがまずは問題です。
この項目に相当するのは以下の「共有ランタイムの使用」という項目です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/979c2ced-3dfd-ac94-5385-95964caafca6.png" title="" alt="image.png" width="60%" height="" >

この項目は、Androidプロジェクトのプロパティの「Android オプション」にあります。

このチェックを外せばOKです。
もう一度アーカイブしてみましょう。
成功すると思います。

#それでも同じエラーが出るときは

「共有ランタイムの使用」をオフにしてもやっぱり同じエラーが出てアーカイブができないことがあるようです。
というかありました。私もこれでしばらく詰まってしまいました。

Googleで「shared mono runtime」で検索すると、同じようなことで困っている人がいるようで、いくつも記事が見つかります。

その中で[以下のページ](https://github.com/xamarin/xamarin-android/issues/1760)を読んでいくと、下の方に「`.vs`フォルダを消してVisual Studioを再起動したらアーカイブできた」というような書き込みが見つかります。

その書き込みの後は以下のように喜びの声が続々と。
「It works!」てきな。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/dac57716-e27e-cea5-4965-34b4f7251b92.png)


#おわりに
`.vs`フォルダの役割を知らないので「これでバッチリ！」とは言えませんが、もしお困りであれば試してみてもよいかもですね。
Go言語でTwitterAPIを使ってツイート検索(Premium search API版)

前回の続き[Go言語でTwitterAPIを使ってツイート検索](https://qiita.com/int_main_Nick/items/6006dd049b40ee85aa97)

##用意するもの
Consumer API keys
Access token
Access token secret

こちらを参照してください:https://ahiru8usagi.hatenablog.com/entry/TwitterAPI_KeyAndToken

##ソースコード
まずはOAuth認証

```go:main.go
    config := oauth1.NewConfig(consumerKey,  consumerSecret)
    token := oauth1.NewToken(token, tokenSecret)
    httpClient := config.Client(oauth1.NoContext, token)
```

ここまでは前回と一緒。
今回は利用するJSONデータについてもメモ。

```go:main.go
//リクエスト
//使わないデータはコメント化するなりして無効化する必要がある。Queryだけは必須。
type Request struct{
	Query string `json:"query"`
	Next string `json:"next"`
}

//レスポンス
//RequestParametersというのがあったけど今回は無視。
type Response struct{
	Results []Tweet `json:"results"`
	Next string `json:"next"`
}
```

ResultsがTweetオブジェクトの配列を返してくる。SandboxのSearchAPIでは一度の要求で100個までのツイートしか取れないから、前に返ってきたResponseの中にあるNextを次の要求の時に指定してさらに100個のデータを取ってくる必要がある。Nextが返ってこなかった場合データを取りつくしたことになる。

Requestを投げてresponseのbodyを見るとちゃんとデータが返ってきているのにJSONをパースすることができなかったが、どうやらResultsがresultsになっていたようだ。もしかすると最初の文字は大文字じゃないとダメなのかも。

次はResponseを受け取ってくる関数。

```go:main.go
func search(client *http.Client, search *Request)(Response, error){
	encoded, err := json.Marshal(search)
	//今回はPOST
	req, err := http.NewRequest(
		"POST",
		"https://api.twitter.com/1.1/tweets/search/30day/[Dev environment label].json",//30dayかfullarchive
		bytes.NewBuffer(encoded),
	)
	if err != nil {
		return Response{}, err
	}

	req.Header.Set("Content-Type", "application/json")

	//レスポンス
	response, err := client.Do(req)
	if err != nil {
		return Response{}, err
	}

	b, err := ioutil.ReadAll(response.Body)
	if err != nil {
		return Response{}, err
	}

	var result Response
	json.Unmarshal(b, &result)
	response.Body.Close()

	return result ,nil
}
```

指定するURLは30日間のツイートを取るのか、制限なしでツイートを取ってくるのかによって変わってくる。
前者の場合
https://api.twitter.com/1.1/tweets/search/30day/[Dev environment label].json
後者の場合
https://api.twitter.com/1.1/tweets/search/fullarchive/[Dev environment label].json

[Dev environment label]は図1へ行ったところにある図2の文字列のこと。
![スクリーンショット (102)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/316006/8d9820b0-3c1d-50b2-71c9-eda273776809.jpeg)
図1:TwitterAPIリファレンスの画面

![スクリーンショット (101)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/316006/595c25db-7d78-6416-a661-206ea583dc0d.jpeg)
図2:Dev Environments

最後にmain関数で受け取ったツイートを表示できるようにする。

```go:main.go
func main(){
    config := oauth1.NewConfig(consumerKey,  consumerSecret)
    token := oauth1.NewToken(token, tokenSecret)
	httpClient := config.Client(oauth1.NoContext, token)

	result, err := search(httpClient, &Request{
		Query:"#golang",
	})
	if err != nil{
		fmt.Println(err)
	}

	for _, tweet := range result.Results{
		fmt.Println("text:"+tweet.Text)
	}
}
```

JSONのところでも書いたが、100個以上ツイートを取りたい場合、前回受けっとったNextの値を次のRequestに入れる必要がある。今回、この最低限の機能ができたあたりで無料使用期間が来てしまってデバッグがしばらくできなくなってしまったためそこまで試せていないが(お恥ずかしい…)、アルゴリズムは多分

はじめの要求(Next指定なし)
↓
次の要求(Next指定あり)
↓
次の要求(Next指定あり)
↓以下ループ処理
.
.
.
↓
データ終わり(Nextが返ってこなくなった)

みたいな感じになるかも。

今回もTweetオブジェクトの内容やRequest、Responseも完全には説明できていないので、もっと詳しく見たいという方は[APIリファレンス](https://developer.twitter.com/en/docs/tweets/search/api-reference/premium-search)を参照してください。
DxOpalのゲームをコンパクトにして公開する方法

DxOpal用に書いたコードはゲームの規模が大きくなってrequire_remoteの数が増えてくると、逐次同期で読むので起動までに時間がかかるようになってきます（これはこれで解決したい問題なのですが……）
そこで「[リリースするゲーム](http://www.cranehouse.dojin.com/wordpress/?page_id=348)」では一つのjsファイルにまとめてさらに圧縮して少しでも軽くなるようにしました。その方法をメモって置きます。

# 手順
1. DxOpal本体のopal/dxopal.rbのrequire "opal-parser"をコメントアウトする
これをやっておくと本体のサイズがぐっと小さくなります。
（追記・現在require 'dxopal/patches/require_remote'の行もコメントアウトしないと内部でopal-parserが呼ばれているのでサイズが小さくなりません）
2. 自分が書いたゲームのコードのrequire_remoteをすべてrequireに置き換える
require_remoteのままだと使えないので。
3. DxOpalのビルドに自分のコードのパスを通してビルドする
4. ビルドされたjsファイルをuglifyjsでコンパクトにする。
uglifyjsがインストールされている必要があります。

# 面倒くさいのでRakeにしちゃいました
自分のプロジェクト用のオレオレRakeなので環境に合わせてカスタマイズが必要かもしれません。

```ruby:Rakefile
require 'opal'
require 'rake/clean'
DXOPAL_PATH = '../dxopal'

directory "tmp"
desc "Build main.js"
task :build => ["main.js"]

desc "Build main.js and main.min.js"
task :build_min => "main.min.js"

file "main.min.js" => "main.js" do |t|
  sh "uglifyjs #{t.source} -o #{t.name}"
end

CLEAN.include("tmp")
CLOBBER.include("main.js")
CLOBBER.include("main.min.js")

file "main.js" => "tmp" do |t|
  FileList["**/*.rb"].each do |filename|
    s = open(filename).read
    open("tmp/" + filename, "w") do |f|
      f << s.gsub("require_remote", "require")
    end
  end

  Opal.append_path(DXOPAL_PATH + "/opal")
  Opal.append_path("tmp")
  js = Opal::Builder.build("./tmp/main.rb").to_s
  File.write(t.name, js)
end
```

以下のコマンドでビルドされてmain.jsとmain.min.jsができます。
私のプロジェクトの場合、計3MB近くあったファイルが789KBまで小さくなりました。

```
$rake build_min
```
おまけ

```
$rake clean 作業ファイルの削除
$rake clobber 出力ファイルの削除
```
# 配置
jsファイルは以下のように配置します。

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset= "utf-8" />
    <title>DxOpal Game</title>
  </head>

  <body>
    <canvas id="dxopal-canvas"></canvas>
    <div id="dxopal-errors"></div>
    <script type="text/javascript" src="main.min.js?20181209"></script>
  </body>
</html>
```
キャッシュがクリアされるようにmain.min.js?の後にクエリー文字列をつけています。
Electron Vue + Puppeteerで作る便利デスクトップApp

こんにちは！HALアドベントカレンダーの10日目を担当する名古屋のしがない学生です。
へっぽこエンジニアの自分でもElectron Vueを使うことで2,3日でデスクトップアプリを作れたのでその素晴らしさを共有したいと思います。

## 何を作ったの
![title.png](https://qiita-image-store.s3.amazonaws.com/0/183347/4a5a10ee-d269-9f33-0105-c9dd0f79bc3b.png)
portanというキュートな名前のWebviewアプリを作りました。

「なんだWebviewか」
と今、何人かが思ったでしょう。

portanは常にオントップでWebページを表示することができます！
Qiitaとか誰ぞやのブログを見ながらコードを書きたいときとかありますが、MacやWindowsだとフルスクリーン状態で画面分割するのは標準では2分割が限界です。~~多分..~~
そんな時にちょっと小窓で見たいなんて時に便利で、portanは何画面でも出せます！~~検証してないけど~~

動画もフルスクリーンで表示できますが、それはpicture in pictureを使ったほうが便利ですね
Skypeみたいなやつです。
↓こんな感じ
<img width="1440" alt="スクリーンショット 2018-12-11 19.57.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/183347/cbbb60f7-c61c-872e-ba58-3e88a03fca92.png">

ちなみにここからダウンロードできます
[portan - Always on top Webview](https://isy.github.io/portan)


## どんなもの使ったのか
宣伝はこのくらいにしてどんな技術を使ったのかに入りたいと思います。

### Electron Vue
Vue.js によるデスクトップアプリを作る時に便利な
Electronのボイラープレートです。

VueでElectronが使えるので書きやすいです！

#### ハマったポイント
Electron Vueには直接関係ありませんが、Webviewを常時トップの表示させる部分で少しハマりました
公式ドキュメントを見て下記のような感じで行けるかなーと思ったら、フルスクリーンの画面にはWebviewを表示させることができませんでした。

```javascript
 win.setAlwaysOnTop(true);
 win.setVisibleOnAllWorkspaces(true);
```

色々と調べた結果こんな感じだと行けるようです

```javascript
app.dock.hide();
win.setAlwaysOnTop(true, 'floating');
win.setVisibleOnAllWorkspaces(true);
win.setFullScreenable(false);
```

`app.dock.hide`をしないといけないのはちょっと謎ですね。いい方法を知っている方は教えていただきたいです。


### Puppeteer
PuppeteerはHeadless ChromeをNode.jsから簡単に操作できるやつです
今回は表示したWebサイトのfaviconとページタイトルを~~盗む~~取得するために使用してます。

ElectronのWebcontentsというAPIでもタイトルとかは引っ張って来れますが今後の機能追加とPuppeteerを使って見たかったので使いました

### NeDB
NeDBはJavaScriptで使用できるデータベースです。
WebViewの表示履歴を保存するのに使ってます。

mongodbを使ったことがある方なら問題なく使えると思います
こんな感じで検索できる↓

```bash
db.find({ ○○: ●● })
```

この記事が非常に参考になりました。ありがたいです
https://qiita.com/tinymouse/items/0731eef4aebf2779bd0b


## おわりに
いちおうオープンソースなのでマサカリ大歓迎です。
スターは大大歓迎です😊
https://github.com/isy/portan

Twitterもやってます
https://twitter.com/isytter
[cocoa][swift]Cocoa.swift 2019-01 のご案内

# 第116回 Cocoa勉強会 関東
<p>Cocoaを一人で勉強するのはつらくて長い道のり...<br />
そんなあなたの<br />
Cocoa.swift</p>

# Cocoa.swift について
<ul>
<li>Cocoa勉強会 関東 Swift分科会 です。</li>
<li>ほぼ毎月、池袋コワーキングスペース OpenOffice FOREST で開催してます。</li>
<li>macOS/iOS/watchOS/tvOSプログラマーのための勉強会です。</li>
<li>プログラムに関する知識や経験を共有を目的としています。</li>
<li>会の活動内容や発表資料、サンプルコードは公開を前提としています。</li>
<li>申し込みは、connpassから。<br /><a href="https://cocoa-kanto.connpass.com/">https://cocoa-kanto.connpass.com/</a></li>
</ul>

# 発表者へのお願い
<ul>
<li>発表を希望される方は申し込み時のconnpassアンケートでお申し込みください。</li>
<li>事前に資料のリンクをconnpassに登録していただけますと嬉しいです!</li>
</ul>

# Cocoa.swiftのご案内
<ul>
<li>会場：池袋コワーキングスペース OpenOffice FOREST<br />http://co-forest.com</li>
<li>集合：現地</li>
<li>座席代：夜間ドロップイン 一人1,000円</li>
</ul>

# スケジュール
<ul>
<li>18:00 自習</li>
<li>20:00 発表
	<ul>
	<li>20:00〜20:30 「検討中」成田さん</li>
	<li>20:30〜20:45「FoundationDBについて」村上</li>
	<li>20:45〜21:00「私の方式：MyDocumentについて」村上</li>
	<li>21:00〜21:15 休憩</li>
	</ul>
</li>
<li>21:15 意見交換会
	<ul>
	<li>MVCを考える</li>
	</ul>
</li>
<li>21:45 次回日程の決定、片づけ</li>
<li>22:00 解散</li>
</ul>

# Cocoa勉強会 関東について
<ul>
<li>以下のFacebookグループから、ご参加下さい。<br />https://www.facebook.com/groups/cocoa.kanto/</li>
</ul>

# 注意事項
<ul>
<li>写真の撮影、録音録画は、発表者、もしくはその内容によっては、望まない場合もあります。 事前に確認をお願いいたします。またコワーキングスペース周囲の方へのご配慮もお願いいたします。</li>
<li>被写体の肖像権等に関するトラブルについて、Cocoa.swift は一切関知いたしません。当事者同士での解決をお願いします。</li>
<li>イベント中に発生した怪我や盗難等のいかなるトラブルに、Cocoa.swift は一切責任を負いません。</li>
</ul>

【関連情報】
<a href="https://qiita.com/advent-calendar/2018/cocoa">Cocoa Advent Calendar 2018</a><br />
<a href="https://cocoa-kanto.connpass.com/event/111294/">Cocoa.swift 2019-01</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
Visual Studio Code で作成した User Snippets を削除する方法

Visual Studio Code の方でスニペットを削除するような機能は提供されていないようなので、スニペットファイルを直接削除します。

**削除作業は設定ファイルのバックアップを作成し、Visual Studio Code を終了してから行うことを推奨します。**


## 設定ファイルの場所

- [Visual Studio Code User and Workspace Settings](https://code.visualstudio.com/docs/getstarted/settings#_settings-file-locations)

上のドキュメントの "Settings file locations" によると、VS Code の設定ファイルは各プラットフォームごとに次の場所に保存されているようです。

- Windows `%APPDATA%\Code\User\settings.json`
- macOS `$HOME/Library/Application Support/Code/User/settings.json`
- Linux `$HOME/.config/Code/User/settings.json`

`settings.json` の近所にスニペット定義ファイルも保存されているはずです。



## 具体的な削除方法

macOS の場合であれば、

```sh
$ ls -1F "$HOME/Library/Application Support/Code/User"
keybindings.json
settings.json
snippets/
syncLocalSettings.json
workspaceStorage/
```

`snippets/` が見つかったので中身を見てみます。

```sh
$ ls -1F "$HOME/Library/Application Support/Code/User/snippets"
global.code-snippets
markdown.json
python.json
shellscript.json
```

`.code-snippets` の拡張子を持つファイルが scope を指定できるタイプのユーザー定義スニペットファイルです。あとは `rm global.code-snippets` とかすれば普通に消えます。

ちなみに `Settings Sync` を使っている場合も問題なく削除が Gist に反映されました。
CircleCI 2.1のOrbを利用したShallow Cloneチェックアウトでチェックアウトを高速化する

# はじめに

CircleCI 2.1では[Orb](https://circleci.com/docs/2.0/orb-intro/)と呼ばれる新機能を利用できます。
Orbとはサードパーティー製のパッケージのことで、[CircleCI Orb Registry](https://circleci.com/orbs/registry/)に公開されているOrbをインポートして`config.yaml`を記述できるようになります。[^1]

[^1]: 自分でOrbを作って公開することもできます。

このCircleCI Orb Registryに[ganta/git](https://circleci.com/orbs/registry/orb/ganta/git)というOrbが公開されており、このOrbを利用することでShallow Cloneチェックアウトができるようになります。

今回は、このganta/gitを利用したShallow Cloneチェックアウトを試してみました。
また、普通にチェックアウトした場合およびCircleCI 2.0のソースキャッシュを使った場合と速度を比較してみました。

# 検証に使ったリポジトリ

パックファイルのサイズが2.5GiBのリポジトリを使って検証しました。

```sh
$ git gc
$ git count-objects -vH
count: 378
size: 1.69 MiB
in-pack: 488802
packs: 1
size-pack: 2.50 GiB
prune-packable: 0
garbage: 0
size-garbage: 0 bytes
```

# 普通にチェックアウトした場合

まずは、普通にチェックアウトした場合です。

```config.yaml
jobs:
  build:
    steps:
      - checkout
```

普通にチェックアウトした場合は、チェックアウトに1分10秒かかりました。

<img width="1156" alt="スクリーンショット 2018-12-11 23.12.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/9588/1197a3b6-5836-02d3-8c98-1a27cacc19ef.png">

# CircleCI 2.0のソースキャッシュを使った場合

次に、CircleCI 2.0の[ソースキャッシュ](https://circleci.com/docs/2.0/caching/#source-caching)を使った場合です。

```config.yaml
version: 2.0
jobs:
  build:
    steps:
      - restore_cache:
          keys:
            - source-v1-{{ .Branch }}-{{ .Revision }}
            - source-v1-{{ .Branch }}-
            - source-v1-            
      - checkout      
      - save_cache:
          key: source-v1-{{ .Branch }}-{{ .Revision }}
          paths:
            - ".git"
```

ソースキャッシュを使った場合は、チェックアウトは8秒で完了するようになりましたが、キャッシュの復元に35秒、キャッシュの保存に1分3秒かかるようになってしまい、合計で1分46秒と逆に遅くなってしまいました。

<img width="1156" alt="スクリーンショット 2018-12-11 23.11.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/9588/4ffcb30e-0f47-e221-aa88-094f06b9177b.png">

# CircleCI 2.1のOrbを利用してShallow Cloneチェックアウトした場合

最後に、CircleCI 2.1のOrbを利用してShallow Cloneチェックアウトした場合です。

```config.yaml
version: 2.1
orbs:
  ganta-git: ganta/git@1.2.0
jobs:
  build:
    steps:
      - ganta-git/shallow-clone-checkout
```

Orbを利用してShallow Cloneチェックアウトした場合は、チェックアウトが33秒で完了するようになりました。

<img width="1156" alt="スクリーンショット 2018-12-11 23.03.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/9588/628f312e-dd91-e44c-809e-c001d62c0354.png">

# まとめ

CircleCI 2.1はいいぞ。
プロキシ環境でJenkinsのDockerイメージを動かす

プロキシサーバー環境下でJenkinsの公式Dockerイメージを動かすには、Jenkinsのプロセス（Java）がHTTP(S)通信でプロキシを使うように以下の起動オプションを指定する必要がある。

* http.proxyHost HTTP通信で利用するProxyサーバーのホスト名
* http.proxyPort HTTP通信で利用するProxyサーバーのポート番号
* https.proxyHost HTTPS通信で利用するProxyサーバーのホスト名
* https.proxyPort HTTPS通信で利用するProxyサーバーのポート番号

Dockerコンテナ起動例：

```shell
docker run --name {コンテナ名} \
  -p {Web用ポート番号}:8080 -p {JNLP用ポート番号}:50000 \
  --env JAVA_OPTS="-Dhttp.proxyHost={ホスト名} -Dhttp.proxyPort={ポート番号} -Dhttps.proxyHost={ホスト名} -Dhttps.proxyPort={ポート番号}" \
  jenkins/jenkins:lts
```

#### 参考

* https://github.com/jenkinsci/docker
* https://docs.oracle.com/javase/jp/8/docs/technotes/guides/net/proxies.html
【初心者向け】Dagger３分入門

本稿は、「なんかDaggerの記事たくさんあるけど、長くてよくわかんねぇー。てかビルドすらできねぇ...」という方の為の記事です。初めてDaggerを使う人が３分でDaggerの**初歩的な使い方を知る**ことを目的とします。
##Daggerって何？
###そもそもDIとは？
依存性の注入なんて言われても意味わからないですよね。
例えばヘッドッセット。ヘッドセットってヘッドホンとマイクで出来てますよね。
「マイクだけ高価なのに変えたい」と思ってもマイクだけ取り外せない...
というか外したら壊れますよね。なぜならマイクに依存した実装がされているからです。
この依存性を排除して、マイクだけとっかえ可能にしようぜ！というのがDIです。
そういう設計にすればヘッドホンに高価なマイクを装着（依存性の注入）ができますよね。
###Daggerとは？
アノテーションを用いてソースコードを自動生成します。
それによりDIを簡単、簡潔に実現してくれるのがDaggerです。
##Daggerで使うパーツを理解する
###Module
モジュールの役割は、提供したいオブジェクトのインスタンスを生成することです。
###Component
コンポネントの役割は、Moduleが提供するインスタンスを受け取りたい側とModuleを繫ぐことです。
モージュルで生成されたインスタンスはコンポネントを経由して渡されます。
##3秒で理解したい人用
ここはとあるレストラン←@Module

あなた「麻婆豆腐、激辛で」←@Inject
ウエイター「かしこまりました、
　　　　　 オーダー入りまーす..略」←@Component
厨房「ガッテン承知」←@Provides

たぶんこんな感じ
##実践
###1.Moduleを作成する
- Moduleには@Moduleを付与します。コンストラクタに引数を設定することも可能です。
- @Providesを付与したメソッドで提供したいオブジェクトのインスタンスを返しましょう。

```
//引数も指定できます
@Module
class SampleModule(var msg:String) {

    //@Provideを付与したメソッドで注入したいオブジェクトのインスタンスを返す
    @Provides
    fun provideHoge():Hoge {
        return Hoge(msg)
    }
}
```
###2.Componentを作成する
- Componentには@Componentを付与します。インスタンスを提供してくれるModuleクラスを指定しましょう。
- injectというメソッドを定義することで、指定したModuleクラスから得られるオブジェクトを@Injectを指定したメンバに注入するコードが自動生成されます。
- injectメソッドの引数には依存性を注入するクラスを指定します。
- 勘違いをしやすいですが、依存性を注入するのではなく***依存性の注入を依頼する***というニュアンスです。

```
//アノテーションの引数でModuleを指定しましょう。
@Component(modules = [SampleModule::class])
interface SampleComponent {

    //Moduleで生成するインスタンスを受け取るクラスを引数にとる
    fun inject(activity: MainActivity)
}
```

###3.いったんBuild
- BuildするとDagger+〇〇Component（2で作ったComponent名）というクラスが自動で生成されます。

###4.@Injectする
- Moduleで生成するインスタンスを受け取りたいメンバには@Injectを付与します。
- Componentを実装して、適宜設定を加えて依存性の***注入依頼***をしましょう。

```
class MainActivity : AppCompatActivity() {

    //Moduleで生成するインスタンスを受け取りたいメンバに@Injectを付与
    @Inject lateinit var hoge:Hoge


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //自動生成されたクラス
        DaggerSampleComponent.builder()
                //自動生成されたModuleを引数にとるメソッド
                .sampleModule(SampleModule("テスト"))
                .build()
                //Componentにつくったinjectメソッド
                //上記の内容で依存性の注入を依頼
                .inject(this)

        Log.e("TEST", hoge.msg())

    }
}
```
##最後に
Daggerにはたくさんのアノテーションが用意されています。
使い方だけではなく裏側の処理、Dagger自体のロジックをかじってみることもとても大切です。
少しずつ学んで行きましょう！
次のステップには@SubComponentやAndroid拡張がオススメです。
WebGL でゾエトロープをやってみたかったのです

## 前置き

WebGL アドベントカレンダー 12 日です。

以前、錯視の一種であるスリットアニメーションを WebGL とレイマーチングで実装したことがありました。

参考： [3D みたいだけど 2D なんだけどやっぱりよくみたら 3D なんだけどでもやっぱり 2D なんだけどでもよくよく考えてみたらこれって GLSL 使ったレイマーチングなんじゃね？ \- Qiita](https://qiita.com/doxas/items/caaa7471ad2d08571579)

まあ一種のお遊びで実装した感じだったのですが、思いのほかうまく動いてて、自分が一番びっくりでした。

今回も、錯視のネタでなにかできないかなと思ってネタを考えてみたのですが……

いろいろ考えて結局、ゾエトロープを WebGL で実装してみたらどういう結果になるのかなあというのが前々から気になっていたので、試してみました。

まあ時間があんまりなくて、シュッと作った感じで凝ったことはなにもしてません……

そもそもゾエトロープとはなんぞやというのは以下の Wikipedia の記事を参考に。

[回転のぞき絵 \- Wikipedia](https://ja.wikipedia.org/wiki/%E5%9B%9E%E8%BB%A2%E3%81%AE%E3%81%9E%E3%81%8D%E7%B5%B5)

実装してみた結果は、以下から確認できます。

[https://doxas\.org/work/zoetrope/](https://doxas.org/work/zoetrope/)

ソースは GitHub から。

[doxas/advent2018: advent calendar 2018 demo](https://github.com/doxas/advent2018)

![test2.jpg](https://qiita-image-store.s3.amazonaws.com/0/39638/add05f0a-1468-ebfb-c851-42639ffeec10.jpeg)


## 仕組み

なんというか見たまんまなのですが、シリンダーのジオメトリを作ってそこに少しずつ様子の違う絵を貼り付けてやって、高速に回転させてやります。

このアニメーションの元となる絵は、なんか手でドットとか打ってもよかったのですがシェーダで書いちゃうほうが簡単そうだったので GLSL でアニメーション書いちゃいました。

時間の経過によってそのままアニメーションするシェーダは以下から確認できます。

[GLSL で描画した元になったアニメーション](https://goo.gl/Ksg1GM)

これを、4 x 4 のブロックに区切って合計 16 回、ひとつのフレームバッファに焼きます。

実際には、コードのほうでは 8 x 8 とかもっと細かいテーブルにすることもできるのですが、細かすぎてもなんかあんまり結果は変わらん気がしたので、4 x 4 の 16 フレームでアニメーションが一周するようにしてあります。

![test1.jpg](https://qiita-image-store.s3.amazonaws.com/0/39638/256a98f8-cf6d-0715-e0ed-6ca204a8b6c6.jpeg)

こんなかんじで。

それを、シリンダーの各面にぺったんこしてぐるぐるします。

## 高速化するとブレブレになっちゃう問題

実装する前からなんとなく想像はしていたのですが……

時間の経過に応じて回転するようにしていると浮動小数点の微妙な精度の問題というかブレとかもあるし、たぶんうまくいかないのではないかなと思ってました。案の定、速度を上げていくと徐々にブレが大きくなっちゃいますね……

毎フレーム、どれくらい回転するのかを定数化してきっちり決めてしまえばたぶんブレは少なくできると思うのですが、なんとなくそれはやらずに、ブレブレな感じそのままにしてあります。

画面右側のスライダーを使うと回転速度を任意に変更できますので、気になる方はぐりぐりしてみてください。

こういうの実際に作ってみるとわかるのですが、やっぱり現実世界は素晴らしくよくできてますよね……

いつか私も現実になりたいです……
論文まとめ：Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks

#はじめに 
メタラーニングの論文の１つ、通称MAML（マムル）
[1] C. Finn, et. al. "Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks"
を読んでみた。

arXiv:
https://arxiv.org/abs/1703.03400

公式の（？）コード：
https://github.com/cbfinn/maml

ちなみに nikkei robotics 2019年1月号 の岡野原氏の記事でもこの論文が紹介されていた。

# 概要 
1. メタラーニングのモデル
2. 複数のタスクで学習させる事で、それぞれのタスクに特化したパラメータをすぐさま得られる

# モデル
### 問題設定 
メタラーニングのモデル： $f$
observation ： $\bf{x}$
モデルの出力： $\bf{a}$
初めの obsevation の分布： $q(\bf{x}\rm_1)$
traisition 分布： $q(\bf{x}\rm_{t+1}|\bf{x}\rm_t, \bf{a}\rm_t)$
エピソードの長さ： $H$
これらを用いて各タスク： 

```math
\mathcal{T} = \{ \mathcal{L}(\bf{x}\rm_1, \bf{a}\rm_1, \cdots ,  \bf{x}\rm_H, \bf{a}\rm_H ), q(\bf{x}\rm_1), q(\bf{x}\rm_{t+1}|\bf{x}\rm_t, \bf{a}\rm_t) \}
```

教師あり学習の場合は $H=1$ 。
タスク全体の分布： $p(\mathcal{T})$
個々のタスクの分布： $p(\mathcal{T} _i)$  

ロス： $\mathcal{L}(\bf{x}\rm_1, \bf{a}\rm_1, \cdots, \bf{x}\rm_H, 
\bf{a}\rm_H) \to \mathbb{R}$
タスク $\mathcal{T} _i$ のロス： $\mathcal{L} _{\mathcal{T} _i}$ 

モデルのパラメータ： $\theta$ 
モデルからの出力： $f_{\theta}$

### 手法 
パラメータの初期値 $\theta$ とする。

$i$ 番目のタスク $\mathcal{T} _i$ のロス $\mathcal{L} _{\mathcal{T} _i}$ から通常の勾配降下法でパラメータの更新値 $\theta ' _i$ を求める。

```math
\theta ' _i = \theta - \alpha \nabla _{\theta} \mathcal{L} _{\mathcal{T} _i} (f_{\theta})
```

このタスクごとに求まった $\theta ' _i$ のロス $\mathcal{L} _{\mathcal{T} _{i} }(\theta ' _i)$ の全タスクにわたる合計値が最小化するような $\theta$ を求める。

```math
\min _{\theta} \sum _{\mathcal{T} _i \sim p(\mathcal{T})} \mathcal{L} _{\mathcal{T} _i} (f_{\theta ' _i}) = \min _{\theta} \sum _{\mathcal{T} _i \sim p(\mathcal{T})} \mathcal{L} _{\mathcal{T} _i} (f_{\theta - \alpha \nabla _{\theta} \mathcal{L} _{\mathcal{T} _i} (f_{\theta})}) 
```

これに関しても勾配降下法で勾配を求める。そしてパラメータの初期値を更新する。

```math
\theta \gets \theta - \beta \nabla _{\theta} \sum _{\mathcal{T} _i \sim p(\mathcal{T})} \mathcal{L} _{\mathcal{T} _i} (f _{\theta ' _i})
```

このとき $\theta$ に関して微分しているので、

```math
\begin{eqnarray}
\theta &\gets& \theta -\beta \nabla _{\theta} \sum _{\mathcal{T} _i \sim p(\mathcal{T})} \mathcal{L} _{\mathcal{T} _i} (f _{\theta ' _i}) \\
&=& \theta -\beta \nabla _{\theta} \sum _{\mathcal{T} _i \sim p(\mathcal{T})} \mathcal{L} _{\mathcal{T} _i} (f_{\theta - \alpha \nabla _{\theta} \mathcal{L} _{\mathcal{T} _i} (f_{\theta})} ) \\

\end{eqnarray}
```

となり、微分の微分が登場するので、Hessian を求める必要がある。

<font color='red'> 書きかけ </font>
GCSにおいた画像のビューアーをスプレッドシートで作る

こんばんは claspが嫌いなわけじゃないけど、
別にしょぼいスクリプトまでclasp使う必要なくね派の大橋です。

ホントはclaspをCIで使ったり、最近良く質問を受ける「フォームの自動返信スクリプト」のよくあるバグについて書こうと思いましたが、 ~~めんどくさかった~~ 時間がなかったです。


## Cloud Storageのビューアーに作りたい
さて皆さんCloud Storage(GCS)は使っていますか？
システムを作ったりすると画像ファイルをアップロードしたり、編集した画像を保存したりと
GCSに画像ファイルを置くことは多々あると思います。

ただここで問題になるのはGCSには画像のビューアーはありません。
自前でGAEなどを用いて作ってもいいのですが、いざやろうと思うと結構めんどくさいです。

そこで今回はスプレッドシートを利用して、簡易のGCS画像ビューアーを作りたいと思います。

## スプレッドシートで画像表示

スプレッドシートには `IMAGE` という関数があり、URLを指定するとセル内に画像を表示することができます。
直接画像を貼り付けるのに比べて、セル内の文字列を引数にして画像を表示でき、今回の様なビューアーを作るにはとてもいいです。

<img width="582" alt="無題のスプレッドシート_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/2965/bd90697f-afc3-c9f7-4ff2-fd3c4a0059c7.png">

今回はこの`IMAGE`関数とGCSのSigned URL(署名付きURL)を利用して、画像ビューアーを作りたいと思います。

## 準備

署名URLを作成するには、参照する予定のバケットの読み込み権限を持ったサービスアカウントの秘密鍵が必要です。
秘密鍵は Google Cloud Consoleから発行してください。
※今回は~~めんどくさかった~~ 時間がないので作成方法は省略します。以下をご覧ください。形式はJSON形式でダウンロードしてください。

https://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=ja#creating_service_account_keys

## コード

今回はスプレッドシートのカスタム関数を作成し、`IMAGE`関数に渡したいと思います。
先程取得した秘密鍵が含まれるJSONファイルはhtmlとして`secret.json.html`という名前で保存してください。

```javascript:Code.gs
function testCreateSignedUrl() {
  Logger.log(createSignedUrl("gs://hoge"));

}

/**
 * Create Signed URL
 *
 * @param {String} path gcs path prefix is gs://
 * @return Signed URL
 * @customfunction
 */
function createSignedUrl(path) {
  var resource;
  if (path.indexOf("gs://") === 0) {
    resource = path.replace("gs:/", "");
  } else {
    throw new Error("path must include gs://");
  }
  
  var sl = [
    "GET",
    "",
    "",
    "" + (new Date().getTime() + 60 * 1000),
    resource
  ];
  
  var unsign = sl.join("\n");
  var secret = JSON.parse(HtmlService.createHtmlOutputFromFile("secret.json.html").getContent());
  var sign = Utilities.computeRsaSha256Signature(unsign, secret.private_key);
  var url = "https://storage.googleapis.com" + resource;
  var req = UrlFetchApp.getRequest(url, {payload:{
    "GoogleAccessId": secret.client_email,
    "Expires": sl[3],
    "Signature": Utilities.base64Encode(sign)
  }});
  
  return req.url + "?" + req.payload;
}

```

## シート内で使う

あとはシート内で`IMAGE`関数に渡すだけです。
まずGCSに非公開な画像を置きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/2965/e842e62b-b4d1-f969-9823-1eca50cb185c.png)

そしてこれを表示してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2965/b9abcfbb-2a60-c8ff-c1b5-3017844130d8.png)


## まとめ
今回は簡易ですがGCSビューアーを作成してみました。
充電用のMicroUSBケーブルを見つけるデバイス #大晦日ハッカソン

これは [#大晦日ハッカソン](https://atnd.org/events/102652) で作成したものです。


# 充電用MicroUSBの罠

いろいろ基板などにMicroUSBがついてきて、気づくと山のようにMicroUSBだらけになってしまいます。そして使おうと思ってそこの山から取り出すと・・充電用で通信できない！！ということがよくあります。見た目で区別もつかず、つないでみて動かない。基板が壊れたのかな？と不安になったり・・。

# 作ったもの
USBのケーブルを刺すとライトが光り、通信用か充電用か判断してくれます。
![IMG_20181231_233654.jpg](https://qiita-image-store.s3.amazonaws.com/0/4221/8dc886e7-8f2b-dc3f-fc9a-b9633150db4b.jpeg)
中身

![IMG_20181231_222402.jpg](https://qiita-image-store.s3.amazonaws.com/0/4221/3a23e498-ccc6-d018-3f63-81b1287585d3.jpeg)
充電専用ケーブルをつないだ場合には赤ランプのみ

![IMG_20181231_222341.jpg](https://qiita-image-store.s3.amazonaws.com/0/4221/4d3cd2d6-ce8f-1376-7397-7c9c735f22e7.jpeg)
通信できるケーブルをつないだ場合は青と赤ランプが点灯

# 材料
- 電池ボックス（単4×3本）
http://www.aitendo.com/product/4204
- USBコネクタ(A/メス)
http://www.aitendo.com/product/4397
- ジャック・プラグ変換基板
http://www.aitendo.com/product/4728
※これに似たもの
- プラケースwith基板
http://www.aitendo.com/product/13779
※中のユニバーサル基板だけ利用
- LED (赤*2 青*2)
- 抵抗やピンヘッダ、ケーブルとかもろもろ

# 充電用MicroUSBと通信用MicroUSBの違い

USB TypeA端子は左から
[GND] [D+] [D-] [5V]
という順番で並んでいます。充電用は[D+][D-]は接続されていません。ケーブルを切ってみると充電用は赤黒の２本しかありません。

![IMG_20181231_234838.jpg](https://qiita-image-store.s3.amazonaws.com/0/4221/72a7699b-f632-5446-42fd-cfa1b85d891a.jpeg)

そのため、各端子がすべて結線されているかどうかをチェックすれば判別できます。
単純に通電させてUSBケーブルを経由させてLEDを光らせれば判断できるようになります。
原理は非常に簡単ですね。
なのでLEDが４つあるんです。４本の通電チェックしてるだけなので。
両端は赤、真ん中２本は青になるようにつなげています。
回路図書くと余計にわからなくなるくらい単純な構造です。

たまにしか使わないとはいえ、意外と重宝するものです。
ちゃんと基板起こしてボタン電池にして小型化までいけたら・・・ら・・・・。
Pythonのdatetimeモジュールを使った時に、タイムゾーンを固定させる方法

# TL;DR
タイムゾーンに関するインスタンスを引数としてかませるといいよ。
サーバーがどこにあろうと同じ時間を指してくれる。

```python
import datetime
JST = datetime.timezone(datetime.timedelta(hours=9), "JST")

print(f"ただいま、世界協定時刻で　{datetime.datetime.now(datetime.timezone.utc)}　です")
# ただいま、世界協定時刻で　2018-12-31 14:03:05.436561+00:00　です
print(f"ただいま、日本時刻で　{datetime.datetime.now(JST)}　です")
# ただいま、日本時刻で　2018-12-31 23:03:05.436561+09:00　です
```

# 悩む
個人的にwebアプリケーションを作成したけれど、費用をできるだけ抑えるためにデプロイ先を[IBM BlueMix](https://www.ibm.com/cloud-computing/bluemix/ja)にした。
時刻を使用して、一定時刻になったら動作する…といったプログラムを書いたのだけれど、サーバーがアメリカにあるせいで、設定した時刻の9時間後に動作してしまう。

この対処法として、`datetime`オブジェクトに`timezone`を与えてあげるといいということを思い出した。

# つまり
`datetime.timezone`インスタンスを作成して、それを`datetime`オブジェクトの引数`tzinfo`として与える
日本は世界協定時刻から見て9時間進んでいるので、9時間進んでいる設定にしてあげる

```python
import datetime
JST = datetime.timezone(datetime.timedelta(hours=9), "JST")
```
第一引数には世界協定時刻からの時間差を示す`-datetime.timedelta(hours=24)`から`datetime.timedelta(hours=24)`の間の`datetime.timedelta`オブジェクトを与え、第二引数には名前を与える。

それを以下の様に`datetime.datetime`に与えてやる

```python
certain_time = datetime.datetime(2020, 0, 0, tzinfo=JST)  # キーワード引数として与えるときは tzinfo
now = datetime.datetime.now(JST)
```

こうすると、イイ感じで日本の時間になってくれます。

更になんと、アメリカとか(世界協定時刻－7とか)にするとサマータイムの対応まで自動でやってくれます。wow

timestampから日本時刻に直すには

```python
stamp = datetime.datetime.now(JST).timestamp()
stamp
# 1546266904.187328
datetime.datetime.fromtimestamp(stamp, tz=JST)
# datetime.datetime(2018, 12, 31, 23, 35, 4, 187328, tzinfo=datetime.timezone(datetime.timedelta(0, 32400), 'JST'))
```

といった感じで、`tz`として`datetime.timezone`インスタンスを与えてあげます。
# 注意点
タイムゾーンに関する情報を与えた`datetime.datetime`オブジェクトは`aware`、そうでないものは`naive`と呼ばれ、互いの比較、演算ができません。

```python
datetime.datetime(2019, 1, 1) - datetime.datetime.now()
# datetime.timedelta(0, 1225, 880213)

datetime.datetime(2019, 1, 1) - datetime.datetime.now(JST)
# ---------------------------------------------------------------------------
# TypeError                                 Traceback (most recent call last)
# <ipython-input-35-33a1ced3b530> in <module>()
# ----> 1 datetime.datetime(2019, 1, 1) - datetime.datetime.now(JST)

# TypeError: can't subtract offset-naive and offset-aware datetimes

datetime.datetime(2019, 1, 1) > datetime.datetime.now(JST)
# ---------------------------------------------------------------------------
# TypeError                                 Traceback (most recent call last)
# <ipython-input-36-3121cc180bc8> in <module>()
# ----> 1 datetime.datetime(2019, 1, 1) > datetime.datetime.now(JST)

# TypeError: can't compare offset-naive and offset-aware datetimes
```
つまり、一つのプロジェクトの中で複数の`datetime.datetime`オブジェクトを扱うときは、どっちかにそろえたほうが良いってことだね。
Db2でTIMESTAMP⇔文字列変換 & TIMESTAMPの算術計算

通算10000回は調べているので、いい加減にまとめておきます(大げさ)。なお以下のSQLはDb2 on Cloudで稼働確認を行いました。おそらくDb2 LUW V10.5やV11でも動くと思います。zOSはわかりません(´・ω・｀)

## TIMESTAMP→文字列

まずtimestampから文字列に変換する場合は`VARCHAR_FORMAT`もしくは`TO_CHAR`を利用します。フォーマット指定子は以下に示す`VARCHAR_FORMAT`のIBM Knowledge Centerに一覧が記載されています。

- `VARCHAR_FORMAT`: https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0007110.html
- `TO_CHAR`: https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0007108.html

例えば以下の2つのSQLは両方とも`2018/12/29 16:52:49`というような結果を返します。

```sql
SELECT TO_CHAR(current timestamp, 'YYYY/MM/DD HH24:MI:SS') FROM SYSIBM.SYSDUMMY1;
SELECT VARCHAR_FORMAT(current timestamp, 'YYYY/MM/DD HH24:MI:SS') FROM SYSIBM.SYSDUMMY1;
```

## 文字列→TIMESTAMP

次に文字列をパースしてTIMESTAMPに変換したい場合は`TIMESTAMP_FORMAT`もしくは`TO_DATE`を利用します。第2引数にはフォーマット形式を指定しますが、ここで利用できるフォーマット指定子は`TIMESTAMP_FORMAT`のIBM Knowledge Centerに記載されています。

- `TIMESTAMP_FORMAT`: https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0007107.html
- `TO_DATE`: https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0007109.html

以下に示す2つのSQLは`2018/12/30`という文字列をTIMESTAMPにパースするサンプルで、どちらも`2018-12-30 00:00:00.0`という結果を得ることができるはずです。

```sql
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') FROM SYSIBM.SYSDUMMY1;
SELECT TIMESTAMP_FORMAT('2018/12/30', 'YYYY/MM/DD') FROM SYSIBM.SYSDUMMY1;
```

## 算術計算

Db2では日付の算術計算をサポートしており、`+ 1 hours`などのように「演算子→数値→単位」形式で可能になっています--と書くとややこしいですね(´・ω・｀) これについてはサンプルを見てもらったほうが早いと思います。以下のサンプルは2018/12/30に1年・1か月・1日・1時間・1分・1秒をそれぞれ足し算するもので、それぞれのSQLの結果はコメントで示しています。

```sql
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 1 years   FROM SYSIBM.SYSDUMMY1; -- 2019-12-30 00:00:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 1 months  FROM SYSIBM.SYSDUMMY1; -- 2019-01-30 00:00:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 1 days    FROM SYSIBM.SYSDUMMY1; -- 2018-12-31 00:00:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 1 hours   FROM SYSIBM.SYSDUMMY1; -- 2018-12-30 01:00:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 1 minutes FROM SYSIBM.SYSDUMMY1; -- 2018-12-30 00:01:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 1 seconds FROM SYSIBM.SYSDUMMY1; -- 2018-12-30 00:00:01.0
```

引き算ももちろん可能です。

```sql
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') - 100 years  FROM SYSIBM.SYSDUMMY1; -- 1918-12-30 00:00:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') - 100 months FROM SYSIBM.SYSDUMMY1; -- 2010-08-30 00:00:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') - 100 days   FROM SYSIBM.SYSDUMMY1; -- 2018-09-21 00:00:00.0
```

最後に複数の日時を足したり引いたりする例を示します。結構複雑な計算も可能ですが、ここまでくるとSQLではなくアプリ側で計算したほうがよさそうですね(´・ω・｀)

```sql

SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 10 hours - 10 minutes + 10 seconds FROM SYSIBM.SYSDUMMY1; -- 2018-12-30 09:50:10.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 10 years - 10 months  + 10 days    FROM SYSIBM.SYSDUMMY1; -- 2028-03-10 00:00:00.0
```