OmniAICreator/Qiita-1.07M huggingface dataset:
Linux版dropboxをsystemdでサービスとして起動する

#### 注意

Dropboxクライアントの仕様変更により、CentOS7で本稿の方法ではCentOS7でDropboxクライアントを実行できなくなりました。あらためて対応方法を「[Docker版DropboxクライアントをCentOS7サーバで動作させる](https://qiita.com/little-forest/items/005df4b46440dbb1af3d)」で紹介したので、ご覧ください。

# はじめに

CentOS7サーバにLinux版のDropboxクライアントをインストールし、systemd管理下でサービス起動させてみた。

通常、Dropboxクライアントは特定ユーザの権限で動かすものなので、systemdのユニットテンプレートを使用してマルチユーザに対応して動くようにした。

# インストール
まず、以下のサイトの「コマンド ラインを使った Dropbox のヘッドレス インストール」を参照して、ヘッドレス版のDropboxクライアントをインストールする。(インストール方法は他のサイトでも紹介されているので割愛)

https://www.dropbox.com/install-linux

また、このサイトからコマンドライン版のdropbox管理スクリプト（dropbox.py）をダウンロードする。これを。`~/bin/dropbox.py`に配置していると仮定する。

ここまでで、以下のコマンドでDropboxクライアントが起動/終了できるようになる。

```console
~/bin/dropbox.py start
~/bin/dropbox.py stop
```

# ユニットファイルの作成

Dropboxクライアントをsystemdで管理できるようにユニットファイルを作成する。

以下の内容を `/etc/systemd/system/dropbox@.service` として作成する。ファイル名に含まれる`@`は、このユニットがテンプレートであることを示す。テンプレートユニットは、実行時に複数のインスタンスを起動できるようにするもので、ユニットファイルをうまく作れば、パラメータを初めとする実行条件をインスタンス毎に切り替えることができる。この機能は、従来のSysV initに存在しない、systemd の利点の1つだ。

```ini:/etc/systemd/system/dropbox@.service
[Unit]
Description=Dropbox client (user: %i)
After=syslog.target network.target

[Service]
ExecStart=/bin/bash -c "sudo -u '%i' /home/%i/bin/dropbox.py start"
ExecStop=/bin/bash -c "sudo -u '%i' /home/%i/bin/dropbox.py stop"
Restart=no
Type=forking

[Install]
WantedBy=multi-user.target
```

上記のファイルを作成したら、`systemctl daemon-reload`で反映しておく。

# 実行
``` bash
systemctl start dropbox@ユーザ名
```

たとえば、Dropboxクライアントをインストールしたユーザがaliceならば、以下のようにして実行する。

``` bash
systemctl start dropbox@alice
```

もちろん、enable サブコマンドで自動起動も可能。

``` bash
systemctl enable dropbox@alice
```

# 解説編

systemdのテンプレートユニットでは、`@`以降がインスタンス名として扱われるので、これを実行ユーザ名として扱えばよい。ユニットファイルの中では`%i`識別子で参照できる。(`man systemd.unit`を参照)

単純に考えると以下のように記述すれば良さそうだが、コマンド名の部分で`%i`は展開されないため、このままでは実行できない。

```
ExecStart=/home/%i/bin/dropbox.py start
```

そこで、以下のようにbashから起動し、かつ、`sudo`コマンドで実行ユーザを指定すればうまく展開させることができる。

```
ExecStart=/bin/bash -c "sudo -u '%i' /home/%i/bin/dropbox.py start"
```
moshiでPOJO→JSON変換をする際にnullをシリアライズしたいときもあるよね📛


## nullをnullのままJSONに含みたい！

```kotlin
data class Hoge(val foo: Int? = null,
                val bar: String = "baz") : Serializable
```

こういうのを

```json
{
  "foo": null,
  "bar": "baz"
}
```

こうしたい。

**しかし、**moshiでは、デフォルトの状態だと`null`はシリアライズされずフィールドごと無かったことになります。

```json
{
  "bar": "baz"
}
```
↑こうなる

## ライブラリみっけた

**[moshi-lazy-adapters](https://github.com/serj-lotutovici/moshi-lazy-adapters)**

このライブラリでは、様々なmoshiのアダプターを提供しています。gsonで見たことあるような機能が提供されてます。

### 導入

```groovy
compile 'com.serjltt.moshi:moshi-lazy-adapters:2.1'
```

### 使用例

今回のようにnullをシリアライズしたい場合は以下のように使います。

```kotlin
data class Hoge(@Serializable val foo: Int? = null,
                val bar: String = "baz") : Serializable
```

```kotlin 
val moshi = Moshi.Builder()
        .add(SerializeNulls.ADAPTER_FACTORY)
        .build()
val hoge = Hoge() 
val jsonAdapter = moshi.adapter(Hoge::class.java)
val json = jsonAdapter.toJson(hoge)
```

で

```json
{
  "foo": null,
  "bar": "baz"
}
```

こうなります。
Windows で graphviz の導入

# Dot 言語でグラフを作図するプログラム Graphviz は anaconda + pip で導入できた

一貫した説明が見当たらなかったので、ここにメモしておく。
* Windows 10 x64, anaconda python 3.6, Visual build tools 2015 環境を使用。

## ポイント
* conda コマンドでバイナリの導入
* pip で python モジュールの導入
* anaconda prompt で PATH が通っているように見えても動作しない。グローバルな環境変数設定で、Graphviz の バイナリのあるところに PATH を通すと、動作するようになる。

## 具体的手順
```
(scipy36) C:\Users\007\Documents>pip install graphviz
Collecting graphviz
  Downloading graphviz-0.8.2-py2.py3-none-any.whl
Installing collected packages: graphviz
Successfully installed graphviz-0.8.2

(scipy36) C:\Users\007\Documents>dot -V
'dot' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

(scipy36) C:\Users\007\Documents>conda install graphviz
    （中略）
Downloading and Extracting Packages
graphviz 2.38.0: 
    （中略）

(scipy36) C:\Users\007\Documents>dot -V
dot - graphviz version 2.38.0 (20140413.2041)

```
バイナリがインストールできた。
C:\Users\007\Anaconda3\envs\scipy36\Library\bin\graphviz の下に Graphviz 2.38.0 のバイナリーが導入済みである。（ここでは anaconda の仮想環境 `scipy36` の中にインストールした。 
しかし、実は Graphviz を起動する段階で ( ``render()`` の呼び出し時に ）エラーが出る。

```
graphviz.backend.ExecutableNotFound: failed to execute ['dot', '-Tpng', '-O', 
'graphs'], make sure the Graphviz executables are on your systems' PATH
```
そこで、Windows のコントロール パネル \ システムとセキュリティ \ システム から、[システムの詳細設定][環境変数] で、``PATH`` に ``C:\Users\007\Anaconda3\envs\scipy36\Library\bin`` （conda によるバイナリのインストールディレクトリ）を加えると、エラーなく、グラフ画像が描画できるようになる。

以上です。
ESP32でLチカ(WiFi経由)

# はじめに
秋月で[ESP32-DevKitC ESP-WROOM-32開発ボード](http://akizukidenshi.com/catalog/g/gM-11819/)というものを買ってきました！

このESP32というのはWiFiとBluetoothを搭載した開発ボードです
Arduino IDEで開発可能なのでパソコンとMicro USBケーブルで接続すればArduino IDEでプログラムを書き込むことができます

今回は家のWiFiに繋いでスマホからESP32をLチカさせてみます

# 用意するもの
- [ESP32-DevKitC ESP-WROOM-32開発ボード](http://akizukidenshi.com/catalog/g/gM-11819/)
- Arduino IDEをインストールしたパソコン
- スマホ
- Micro USBケーブル

# 手順
## Arduino core for the ESP32をダウンロード
まずはArduino IDEにESP32のライブラリを入れましょう

Macの場合は[ここ](https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/mac.md)に書いてある通りにやれば大丈夫です

ただ最後の`python get.py`はpython3だとうまくいかなかったのでpython2.7とか指定するとできると思います

## パソコンと接続する
ライブラリが入ったら早速パソコンと接続します

Arduino IDEを起動してツールを選択
下の写真のように設定を変更します

![スクリーンショット 2018-01-27 15.10.29.png](https://qiita-image-store.s3.amazonaws.com/0/164897/0c7a1072-32a3-30d6-5e91-29b3cfdc6aab.png)

次にシリアルポートで`/dev/cu.SLAB_USBtoUART`を選択します
もしシリアルポートをクリックしても現れなかった場合は[ここ](https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers#mac)からドライバをインストールしてください

インストールできたら`/dev/cu.SLAB_USBtoUART`を選択できるようになっているはずです

## スケッチを編集
先ほどライブラリを入れたので
`~/Documents/Arduino/hardware/espressif/esp32/libraries/WiFi/examples/SimpleWiFiServer/SimpleWiFiServer.ino`というスケッチ例があると思います

このスケッチの30,31行目を家のWiFi用に書きかえます

```
#include <WiFi.h>

const char* ssid     = "xxxxx";
const char* password = "xxxxx";

```
上のxxxxxにはSSIDを
下のxxxxxにはパスワードを書いてください

## 配線
IO 5 → 330Ω抵抗 → LED(アノード) → LED(カソード) → GND
![IMG_2521.PNG](https://qiita-image-store.s3.amazonaws.com/0/164897/7e119796-2a4a-777e-c4c1-ca926776a667.png)

## シリアルモニタ起動
スケッチをESP32に書き込む際にESP32のIPアドレスなどが表示されるので
シリアルモニタを開いておきましょう

このときシリアルモニタの方も115200にするのを忘れずに！

## Lチカ
シリアルモニタを開いたままの状態でスケッチをESP32にに書き込みます

書き込みが終わるとESP32のIPアドレスが表示されると思うので

このIPアドレスに対してHかLを指定すればLEDのON/OFFを制御できます

ON  -> http://xxx.xxx.xxx.xxx/H
OFF -> http://xxx.xxx.xxx.xxx/L
Ubuntu 16.04 の初期セットアップ

Linux学習のために環境構築します。
Ubuntuをインストールした後、使い始めるまでにやった事の覚え

[Ubuntu 16.04 のインストール](https://qiita.com/37key/items/28967a53ae3972f3217b)の続き

#目次
1. ネットワークの接続(Wi-Fi)
2. アップデート
3. ポップアップで出てくるアラート対応(1)
4. ポップアップで出てくるアラート対応(2)
5. おまけにやった事

#1. ネットワークの接続(Wi-Fi)
まずは、アップデートしたいので、ネットワークの接続をします。

メニューバー右上のネットワーク設定アイコンを右クリック
接続したいSSIDをクリックし、パスワードを入力する

なぜか上手く接続されなかったので、
再度、メニューバー右上のネットワーク設定アイコンを右クリック
「接続を編集する」を選択
接続したいSSIDを選び編集をクリック、「Wi-Fi セキュリティ」タブのパスワードを入力して保存

#2. アップデート

Terminalから、`sudo apt-get update`と`sudo apt-get upgrade`を発行

#3. ポップアップで出てくるアラート対応(1)
ポップアップで出てくる「アップデート情報：不完全な言語サポート」の上で
「この操作を今すぐ実行する」をクリックする

「言語サポートが完全にはインストールされていません」がポップするので
「インストール」をクリックする

「ソフトウェアをインストールまたは削除するには、認証を行う必要があります」がポップするので
パスワードを入力して「認証する」をクリックする

インストールが自動的に進む

#4. ポップアップで出てくるアラート対応(2)
ポップアップで出てくる「システムプログラムの問題が見つかりました」
`sudo rm -rf /var/crash/*`

#5. おまけにやった事
現在の入力メソッドの設定
キーボード - 日本語 - 日本語(かな86)を選び、左下の上矢印で最上段に設定

一旦、変なポップアップは出なくなりました

おしまい

---

参考にしたHP
[Ubuntuをアップデートする(コマンド編)](https://do-you-linux.com/blog/2013/11/19/post-838/)
[Ubuntuの起動時に「システムプログラムの問題が見つかりました」が表示される](https://ystklog.com/502)
heroku schedulerの使い方　herokuで簡単な処理を定期的に自動的に実行する

#概要
以前書いた記事[APIで複数通貨のレートを効率よく完全自動でデータベースに登録する方法！　メンテナンスも簡単！](https://qiita.com/Hijiri-K/items/842aec0eafd6dc88d326)で作成した、完全自動でレートを登録するコードをheroku上で1日に一回、自動的に実行したいと考えた。
railsで処理を定期的に実行する方法を調べてみると、cornなどのgemを使う方法も見つかったが、今回はherokuでの利用に限定されるが、最も簡単に実装できそうなheroku schedulerを使った実装を紹介する。

やり方は、以下の公式サイトを参考にした。
https://devcenter.heroku.com/articles/scheduler

#事前準備
Heroku schedulerのadd-on自体は無料枠があり、無料で利用することができるが、アプリにadd-onを追加するためにはアカウントのverificationが必要であり、クレジットカードの登録が必要である。

#やり方

##1．実行したいタスクの作成
公式によるとrailsでは定期的に実行したい処理は、 ```lib/tasks/scheduler.rake```というファイルを作成して、そこに記述するのが一般的らしい。
公式に「これをコピーして書き替えろ」というコードのサンプルが載っているのでその通りにする。

サンプルコード

```rb:lib/tasks/scheduler.rake
desc "This task is called by the Heroku scheduler add-on"
task :update_feed => :environment do
  puts "Updating feed..."
  NewsFeed.update
  puts "done."
end

task :send_reminders => :environment do
  User.send_reminders
end
```

今回、私が作成したコード

```rb:lib/tasks/scheduler.rake
desc "This task is called by the Heroku scheduler add-on"
task :test_scheduler => :environment do
  puts "scheduler test"
  puts "it works."
end

task :update_rates => :environment do
  ENV["SSL_CERT_FILE"] = "app/controllers/cacert.pem"
    require 'open-uri'

    sources = ["USD","JPY","EUR","CNY", "KRW","THB", "VND", "SGD", "PHP"]
    currencies = sources.join(',')
    sources.each do |source|
        res = open('https://apilayer.net/api/live?access_key=アクセスキー&currencies=' + currencies + '&source=' + source + '&format=1')
        code, message = res.status # res.status => ["200", "OK"]
        if code == '200'
          result = ActiveSupport::JSON.decode res.read
          # resultを使ってなんやかんや処理をする
          @result = result['quotes'] #返ってきたjsonデータをrubyの配列に変換
          @result.each do |key, value|
            rate = Exchange.find_or_create_by(currency: key)
            rate.update(currency: key, rate: value)
          end
        else
          puts "Error!! #{code} #{message}"
        end
          puts @result
      end
end
```
rakeコマンドで実行できているかを確認するために文字列を出力する
test_schedulerというタスクも作った。

作成したら、コマンドラインラインから動作チェック

```
$rake test_scheduler
```

##2. heroku schedulerのadd-onをアプリにインストール
herokuの自分のアカウントでheroku schedulerをインストールしたいアプリを開き、dashbordからconfigure Add-onsを開き、指示に従ってインストール。

##3. jobの登録
dashbordのheroku schedulerをクリックしjobを登録し、時間などを設定する。

```
$rake test_scheduler
```
時間の設定はUTCで指定する点に注意。

これで終わり。

#感想
Heroku schedulerの使い方を解説した記事はとても少なく、しかも、様々なgemを使用したやり方しか見つからなかった。
今回は公式サイトのやり方をそのまま行ったら、簡単に実装することができた。
時系列データの補間

# 時系列データの補間
- x軸が時系列データを補完したくて，考えてみた。
- pandasを使って，日付型を[ジュリアンデイ](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5)に変換して補間を行った。

# インポート
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
```

# テストデータの作成
- xの時間は2時間毎で，1日分
- sinカーブ，1日で2周期

```python
x = pd.date_range('2018-02-07', '2018-02-08', freq='2H')
y = np.sin(x.to_julian_date()*2*np.pi*2)
```


```python
# テストデータのプロット
plt.figure(figsize=(13,5))
plt.xlim(x[0], x[-1])
plt.scatter(x,y)
```
![output_3_1.png](https://qiita-image-store.s3.amazonaws.com/0/117425/b5a03c0a-66de-7bef-ac3d-c5086d915b77.png)

# 補間データ
- 補間データは10分毎とした。
- 時系列データの作成は[pandasで時系列データの作成](https://qiita.com/wrblue_mica34/items/2cfe71fa83f1c2bc7895)を参照。

```python
x_in = pd.date_range('2018-02-07', '2018-02-08', freq='10min')
```

# 補間
- xはジュリアンデイに変換する

```python
# 線形
f1 = interpolate.interp1d(x.to_julian_date(), y)
y_f1 = f1(x_in.to_julian_date())
```

```python
#2次スプライン
f2 = interpolate.interp1d(x.to_julian_date(), y, kind="quadratic")
y_f2 = f2(x_in.to_julian_date())
```

# 結果表示


```python
plt.figure(figsize=(13,5))
plt.xlim(x[0], x[-1])
plt.scatter(x, y, label='original')
plt.plot(x_in, y_f1, label='linear')
plt.plot(x_in, y_f2, label='quadratic')
plt.legend()
```
![output_10_1.png](https://qiita-image-store.s3.amazonaws.com/0/117425/4c63e8ce-d089-cc55-2969-0836bb3e3e7b.png)
PhpStormでSQLを整形する方法

# 環境

PhpStorm 2017.3.4 (Windows/Mac)

# 方法

- DatabaseのConsoleを開く
- SQLを貼り付ける
- 「Reformat Code」のショートカットキーを押下
  - Windows: Ctrl + Alt + L
  - Maｃ: Command + Option + L

# 具体例

## 整形前

```SQL
SELECT tbl1.are, tbl2.kore, tbl3.sore FROM tbl1 INNER JOIN tbl2 ON tbl1.iro = tbl2.iro INNER JOIN tbl3 ON tbl2.katati = tbl3.katati WHERE tbl1.nedan > 100 AND tbl2.omosa > 20
```

## 整形後

```SQL
SELECT
  tbl1.are,
  tbl2.kore,
  tbl3.sore
FROM tbl1
  INNER JOIN tbl2 ON tbl1.iro = tbl2.iro
  INNER JOIN tbl3 ON tbl2.katati = tbl3.katati
WHERE tbl1.nedan > 100 AND tbl2.omosa > 20
```

# 雑記

偶然ショートカットキーを押したら整形されたのでビックリした。

SQLにもコード整形(Reformat Code)が効くことを知らなかったので別ツールを使ってたけど、今後は調査等でログ上で1行になっている長文SQLを見る時とかに使えるかもしれない。
jQuery DataTablesを使うときのXSS対策

```js
var result = /* サーバーから取得したデータとか */

$("#dataTable").DataTable({
	data: result,
	columns: [
		{ data: "name" },
		{ data: "age" },
		{ data: "tel" },
		...
	]
});
```

なにも考えずにそのままデータを追加すると、サニタイズされないのでXSSが成立してしまう。

なので、ユーザーから入力されたものを含んだデータは`render`に`$.fn.dataTable.render.text()`を設定しておきましょう。

```js
$("#dataTable").DataTable({
	data: result,
	columns: [
		{ data: "name", render: $.fn.dataTable.render.text() },
		{ data: "age",  render: $.fn.dataTable.render.text() },
		{ data: "tel",  render: $.fn.dataTable.render.text() },
		...
	]
});
```

# 参考

[DataTables - Security](https://datatables.net/manual/security)
Processing - 10 - lineとforを使った描画(>>>の連続)

<img width="597" alt="スクリーンショット 2018-02-06 18.37.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/45520/8e036825-e747-4b37-393d-242bcea11ee5.png">


```java:
void setup () {
  size (600, 400);
  smooth ();
  background (255);
  strokeWeight (25);
  noLoop ();
}

void draw () {
  for (int i = 1; i < 9; i = i + 1) {
    stroke (20*i, 155, 155);
    line(i*50, 100, 150 + (i-1)*50, 200);
    line(i*50 + 100, 200, 50 + (i-1)*50, 300);
  }
}
```
Angular CLIで作成したプロジェクトのバンドルサイズを可視化する


[webpack-bundle-analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer)というバンドルサイズ可視化プラグインを使って、Angular CLIで作成したプロジェクトのバンドルサイズを可視化する方法を紹介します。
今回紹介する方法では、Angular CLIが公式に用意しているオプション`--stats-json`を使用するため、 「`ng eject`してwebpackの設定ファイルを編集する」などの手順は不要です。

# 前提

以下の環境で、`ng new`したプロジェクトを使って説明を進めます。

```
$ ng -v                                                                                                           

    _                      _                 ____ _     ___
   / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
  / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
 / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
/_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
               |___/
    
Angular CLI: 1.6.7
Node: 9.2.0
OS: darwin x64
Angular: 
...
```

```
$ ng new bundle-analyzer-test
```

# 手順

## ビルド

まずは、`ng build`コマンドで対象のアプリケーションをビルドします。
この時、ビルドステータスファイルを出力するように`--stats-json`オプションをつけます。

```
$ ng build --prod --stats-json
```

ビルド生成物が保存されているdist以下を確認すると`stats.json`が保存されていることが確認できます。

<img width="981" alt="json.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/0b735211-618b-2628-87b0-55402ad12ca0.png">

## webpack-bundle-analyzerのインストール

Angular CLIで作成したプロジェクトに対して、[webpack-bundle-analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer)をインストールします。

```
$ npm install --save-dev webpack-bundle-analyzer
```

```json:package.json
...
    "webpack-bundle-analyzer": "^2.10.0"
  }
}
```

`npm run bundle-stats`でwebpack-bundle-analyzerが立ち上がるように`package.json`に設定を追記します。

```json:package.json
{
...
  "scripts": {
...
    "bundle-stats": "webpack-bundle-analyzer dist/stats.json"
  },
...

```

## 確認

ここまでの手順で準備は完了です。
`npm run bundle-stats`を実行すると、ブラウザで[http://localhost:8888](http://localhost:8888)が立ち上がりバンドルサイズが可視化されます。

![スクリーンショット 2018-02-07 21.12.07.png](https://qiita-image-store.s3.amazonaws.com/0/79414/c9c1271e-bab8-8619-59f8-e16a5b9205be.png)




# 参考

https://github.com/angular/angular-cli/wiki/build
https://webpack.js.org/api/stats/
https://qiita.com/yuki-takei/items/de23633fe2cfbab9a08c
Unity 動画を途中から再生する

#Unity VideoPlayerを途中から再生
VideoPlayerそのものが割と新しい機能なので途中から再生する記事が見当たらない(もしくは需要がない)ので、備忘録としてQiitaに投稿します。

やり方としては簡単でaudioSourceと同じ感じで再生箇所を指定します

```c#:source.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;

public class NewBehaviourScript : MonoBehaviour {

	public VideoPlayer mPlayer;

	// Use this for initialization
	void Start () {	

	    mPlayer.time = 15f;　//こんな感じで再生途中再生したい時間を
	    mPlayer.Play();
	
	}	
}
```

VideoClipになんか動画入れてあるVideoPlayerを適当に取得してください。
普通に再生するだけならググれば色々記事出てきてこの辺はどこも書いてあると思います。


まぁコード見るようにVideoPlayer.timeに再生したい時間を指定してからPlayするとその時間から再生できます。


何調べても出てこないのでできないと思ってました・・・

追記
動画の全部の長さを取得するには

```c#:source.cs
float length = mPlayer.clip.length;
```

こんな感じで取れるらしいです。
秘密鍵から公開鍵作る

手元に秘密鍵だけある場合に、公開鍵がほしい際に `ssh-keygen` コマンドから生成できるとのことでメモ書き📝

```shell-session
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
```

AWS の pem だけもっているときとかで突然公開鍵が必要な時に便利
配列へのポインタ？ポインタの配列？？

# 参考

プログラミング言語C 第2版
付録A8.宣言

# 配列へのポインタ

```c
int (*foo)[5];
```

分解すると、
declaration-specifiers : `int`
init-declarator-list : `(*foo)[5]`

ここではdeclaration-specifiersはtype-specifierをひとつだけ含みそれが`int`

init-declarator-listはひとつのinit-declaratorからなり、さらにそれはひとつのdeclaratorからなる
それが`(*foo)[5]`

declarator : `(*foo)[5]`をさらに分解すると、
direct-declarator[ constant-expression ]
→( declarator )[ constant-expression ]
→( pointer direct-declarator )[ constant-expression ]
→( pointer identifier )[ constant-expression ]
の形になっており、
pointer : `*`
identifier : `foo`
constant-expression : `5`

括弧でpointerとidentifierが結び付けられているので
「fooはポインタ」であり、
最終的に、
identifier`foo`の型名は、
「整数からなる5個の配列へのポインタ」
となる。

# ポインタの配列

```c
int *bar[5];
```

同様に分解すると
type-specifier pointer identifier[ constant-expression ]
の形になり、ここで、
pointer identifider[ constant-expression ]
の部分は先ほどと違い、
identifier[ constant-expression ]がdirect-declaratorであるので、
「barは5個の配列」であり、
最終的に、
identifier`bar`の型名は、
「整数のポインタからなる5個の配列」
となる。
Visual Studio 2017 Visual C# プロジェクトまとめ

#はじめに
Visual Studio 2017 の 「新しいプロジェクト」ダイアログですが、Visual C# ノードを展開すると、実にいろいろなものが開発できるようになっているようです。(Fig.1)

Fig.1 は Visual Studio 2017 Update 5 のものですが、Visual Studio 2017 登場時より、開発できるプロジェクトの種類は、ずいぶん増えているんじゃないでしょうか。そして、これからも増えていく可能性があります。

このうち、Apple 関連のプロジェクトを除いて (iPhone も Mac も持っていないので) ざっと調べてみました。

![CSProj.png](https://qiita-image-store.s3.amazonaws.com/0/62802/528cc943-da89-cf9d-e5a3-d657139bee22.png)

Fig.1 「新しいプロジェクト」ダイアログで Visual C# ノードを展開したところ

#プロジェクトの内容
ざっくりした「新しいプロジェクト」ダイアログの内容ですが、下記のような感じです。※ 前述したように Apple 関連は除く。

|プロジェクト	       |説明                                                                         |
|:---------------------|:-----------------------------------------------------------------------------|             
|Windows ユニバーサル	|ユニバーサル Windows プラットフォーム (UWP) 用のアプリの開発に使用する。  |                               
|Windows クラシックデスクトップ |	.NET Framework の様々なデスクトップアプリの開発に使用する。名前が「クラシック」となっていても実際はこれが主流です。                                                                |
|Web	               |ASP.NET の開発に使用する。ASP.NET Core (後述) も含む。                         |
|.NET Core             |後述 |
|.NET Standard	       |後述 |
|Android	       |Xamarin.Android アプリケーションの作成用  |
|Cloud	           |Windows, Linux, macOS 用の ASP.NET Core アプリケーションの作成用 |
|Class-Platform	 |Xamarin を使って iOS, Android, Windows 用のアプリを開発できるらしい |
|WCF	          |WCF (Windows Communication Foundation) のライブラリやアプリケーションを開発できる|
|テスト	          |.NET Framework の C# 単体テストの他、Xamarin や Adnroid の単体テスト  |

気になる .NET Core や .NET Standard は、この後に述べさせていただきます。

「Windows ユニバーサル」ですが、プロジェクトの先頭になっていていかにも主流のように見えます。でも、主なターゲットは Windows Phone なのでオワコンじゃないでしょうか。Windows 10 の電卓も UWP アプリですが、動作が遅くて前の電卓の方がよかったです。

実際に、「Windows ユニバーサル」のプロジェクトを作成してみましたが、非常に重くて使うのがいやになるレベルです。

遅くて使いづらい UWP アプリが今後、Windows アプリの主流になることはないでしょうね。

#派生 .NET の詳細
元々は基本クラスライブラリとして .NET Framework だけでしたが、.NET Core と Xamarin が派生しました。(Fig.2)

派生と言っても、.NET Framework のコードの一部を切り出したわけではなく、Xamarin は Mono のクラスライブラリがベースだし、.NET Core も新規に作成されたらしいです。

![NET BCL.png](https://qiita-image-store.s3.amazonaws.com/0/62802/469b9589-9d05-97ea-2243-f51bd084a552.png)

Fig.2 .NET の基本クラスライブラリ

.NET Framework は Windows 用でご存知の通りの機能を持っています。

.NET Core は .NET Framework と異なり複数 OS で動作します。このため、Windows 特有の機能を実装したクラスは含まれません。

Xamarin は Mono のクラスライブラリをベースにしていて、iOS, MacOS, Android に対応したクラスライブラリです。

.NET Standard はクラスライブラリでなく API (仕様) で、すべての .NET が実装する必要がある基本 API セットです。

つまり、.NET Standard に準拠したクラスは .NET Framework, .NET Core, Xamarin など、すべての .NET 実装から参照できます。

ASP.NET Core は .NET Core の一部でウェブアプリとウェブ API を作成するのに使用されます。ASP.NET に含まれる Web Forms は含まれません。

-
2018.02.07勉強まとめ

#DNSレコードタイプ

`Aレコード`
>DNSの最も基本的な、特定のホスト(ドメイン・サブドメイン)とIPアドレスを結びつける情報の事。制御タイプの一つ。Address の略
>(www.)example.comのIPアドレスは192.0.2.0ですよ、とWEBブラウザ等に教えてあげるために設定します

`CNAMEレコード`
>特定のホスト(ドメイン・サブドメイン)を別のホストに割り当てる時に使われる情報の事。ドメインとドメインを結びつける。 エイリアス(alias 別名)とも呼ばれる。制御タイプの一つ。Canonical NAME の略。
www2.example.comっていうのは都合でつけたニックネームで本名は www.example.comっていうんですよ、とWEBブラウザ等に教えてあげるために設定します。

`MXレコード`
>メールアドレスのホスト(ドメイン・サブドメイン)にメールサーバのホストを割り当てる時に使われる情報の事。制御タイプの一つ。Mail eXchange の略。
@example.comのメールを送受信するメールサーバのホストはmail.example.comですよ、とメールクライアント(メール送信時)やメールサーバ(メール受信時)に教えてあげるために設定します。
複数のメールサーバのホストを優先度をつけて設定する事によってメールの紛失を防ぐ事が出来ます。解り易く言えばメールをたらい回しにして暇なサーバで送受信するのです。

`NSレコード`
>特定のホスト(ドメイン・サブドメイン)のネームサーバを指定する情報の事。制御タイプの一つ。Name Server の略。
(www.)example.comに関する設定についてはns.example.comに聞いてくださいね、と他のネームサーバに対応をお願い(丸投げ)するために設定します。

`TXTレコード`
>特定のホスト(ドメイン・サブドメイン)に関連づけるテキスト情報の事。制御タイプの一つ。Text の略。
主に送信メールアドレスの他者によるなりすましなどを防ぐために使われます。その場合のTXTレコードはSPFレコード(Sender Policy Framework)とかSenderIDとも呼ばれます。同じようになりすましメールを防ぐ新しい技術として DKIM(DomainKeys Identified Mail) というのもありすが、こちらもTXTレコードによって設定します。

>引用URL：http://mage8.com/websitetips/dns.html

`ALIASレコード`
>Route 53の内部で扱う特殊なタイプで、外から見たら単なるAレコードに見えます。

`zone`
>ネームサーバがドメインを管理する範囲
引用URL：http://www.atmarkit.co.jp/fnetwork/dnstips/008.html

`zone apex`
DNSの頂上
>CNAMEレコードを設定してはいけません。正確には、CNAMEを設定してもいいですが、CNAMEを設定した名前には他のレコードを共存させてはいけません *2。zone apexにCNAMEを設定してしまうと、他のレコードを置けなくなってしまうので、結果的に大抵の場合zone apexにCNAMEを設定することはできなくなります。

参考URL：https://dev.classmethod.jp/cloud/aws/amazon-route-53-alias-records/

#AWS
・ELBは確保した容量に対して課金
・EIPは異なるAZをまたがっても適用できる
・VPCではサブネットを超えてアドレスを付け替えることができない点に注意
・ヘルスチェック機能。システムの動作に必要なすべてのサーバーをチェックすることが可能
・ロードバランサーを利用したDeep Health CheckとAutoScalingの併用は禁忌事項
・サブネット（AZ）をまたいで冗長化されたEC2のフェイルオーバー（接続先の切り替え）を行うことができる
・Source/Dest. Check：「自分宛の通信以外を受け入れるかどうかをチェックするかどうか」を決める項目。NATインスタンスではOFFにする必要あり。
・ELBと（静的コンテンツを格納した）S3の間に、Nginxなどコンテンツの内容を書き換えることができるプロキシーサーバーを配置する（EC2上で動作させる）
・Proxyサーバーに、コンテンツ内のURLの書き換えルールを追加する。 
・検索性能の高いKVSへメタ情報を格納（Lambda利用）し、その情報をインデックスとして利用する。検索時はKVSを用い、得られた結果を基にインターネットストレージへアクセスする
・リージョンを超えたリードレプリカ（クロスリージョンリードレプリカ）を利用すると、異なるリージョンへリードレプリカを作成できる
・SQS内のキューをCloudWatchで監視。AutoScalingで自動増減
・各デバイスからのアクセスに対する挙動を仮想ロードバランサー経由で変更することが可能となる
dns lookupにかかった時間を記録・監視する

顧客のdnsサーバの調子が悪い様子。それを監視し、自分たちの判断材料にするために利用


# 単発script

```python
$ cat /path/to/dnsspeed.sh
#!/bin/bash
# dns lookup speedを計測する
# 
# $ bash this.sh ドメイン dnsサーバ
# $ bash this.sh example.com 8.8.8.8
#
# @param (string)[domain]      e.g. example.com *required
# @param (string)<dns server>  e.g. 8.8.8.8     default: none
# 
# @return (int)                成功したら msec の値が返る

if [[ -z $1 ]]; then
  echo "dns解決を試すドメインが引数で来ていません。必須です。"
  exit 2
else 
  DOMAIN=$1
fi

if [[ -z $2 ]]; then
  DNSSERVER=
else 
  # dig @8.8.8.8 example.com の形にする
  DNSSERVER=@$2
fi

if MYTIME=$((time dig $DNSSERVER $DOMAIN +trace) 2>&1 ) ; then
    # 成功したらかかった時間をmsecで返す(timeコマンドから取り出し）
    echo $MYTIME | sed -e "s/.*real//" | sed -e "s/user.*//" | sed -e "s/[ms\.]//g"
    exit 0
else
    # timeout/failは0が返る
    echo 0
    exit 1
fi
```

# zabbix UserParameter

```python
$ cat dnsspeed.conf
################################################################
# dns lookup speed measuring tool
################################################################
# 
# dig コマンドを使ってdns lookup にかかった時間を計測
# 結果がmsecで帰ります。timeoutなら0。

# How to use
# Item:
#  type:Zabbix agent
#  dnsspeed[domain,<dns server>]
#  dnsspeed[example.com]
#  dnsspeed[example.com,8.8.8.8]
#
#  @param dns lookup したいdomain
#  @param dns lookup に使いたいdns server
#  @return かかった時間, timeout/failの場合は0

UserParameter=dnsspeed[*],[ -z "$1" ] && echo "Please specity a target domain." || bash /path/to/dnsspeed.sh $1 $2
```

# zabbix trigger
3分dns解決できなければ鳴らす
0=失敗なので0を検知する

```scss
{dnsspeed[example.com].avg(3m)}=0 
```

で、青いラインのdns serverが揺れてることがわかったという話。

![2018-02-07_19h36_05.png](https://qiita-image-store.s3.amazonaws.com/0/24737/b5b19c88-b28d-2410-a29a-37ef21839893.png)
【Bundler】Command: `bundle update`

# `bundle update`

## Summary
* Gemをアップデートする

## Roles
* インストール済みのGem共をアップデートする

## Result
* Gem達がみるみる最新の状態になっていく

## Caution
* アプリケーションのvendor/bundleディレクトリにGemインストールしている場合はちゃんとアプリケーションのディレクトリに移動してから実行する
エンジニアの集合知をノードグラフで図解するSNSサイトを作った。「ノード・ノード・ノード（デスクトップ版）」 

サイトコンセプトは<b>エンジニアの集合知をノードグラフにして図解するSNS。</b>
サイト名は「node-node-node（ノード ノード ノード）」。デスクトップ版のみ。

<a href="https://node-node-node.netlify.com/">エンジニアの集合知をノードグラフで図解するSNS。
「node-node-node（ノード ノード ノード）」
　https://node-node-node.netlify.com/</a>


考えたのは「新しい技術を学ぶ時に各技術要素の関係が分かりにくい。ググればピンポイントで内容が分かるが各技術の関係は不明なまま。そこを集合知を使ってシステムが自動的に図に示してしてくれればいいのに」と。

トップページはこれ。

<img alt="20180205184519.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/052a6d9b-444e-3622-256d-084e832fe9ef.png">

親ノードについた子ノードはパラっと開いて、グリグリとドラッグできる訳でして、こうして階層構造の技術リンクをマッピングしていけば理解しやすいかな、と。

![20180205204551.gif](https://qiita-image-store.s3.amazonaws.com/0/108761/ade3b668-9b54-a84c-9476-5daa9be2f84d.gif)


例えば私の専門はバックエンドなのでインフラやバックエンドの処理はそれなりに把握しているが、JavaScriptをはじめとするフロントエンドの知識はあまり無い。今回のnode-node-nodeのフロントエンドはReact+Reduxで作っていて、その技術情報を手探りで集めてコードを書いた。するとフロントエンドの専門家なら常識でも、専門外の人からは謎な用語がポンポン出て来る。

npm, Babel, webpack, ES2015, Enzyme、とか。

これらの用語についてはググればヒットするし、一応は分かる。仮にnpmがナニなのか知らなかったとしても、ググれば一瞬で分かる。それでも本当に分からないのはこれらの技術要素の関係。各々の技術については分かったつもりになっても、npmとES2015はどんな関係なのか。それぞれ把握しておかなければならないのか、その技術の関連性はずごくあるのか、またはまったく無いのか、など。

ここでは誰もがよく知る技術用語だけをピックアップしたので「そんなもん分かるだろ」と思われたかもしれないが、以下のサッカー戦術用語の場合はどうだろう？

トータルフットボール、ゼロトップ、ミケルス、オフザボール、ポゼッションサッカー、ゲーゲンプレス、４−４−２、ゾーンプレス、アリーゴ・サッキ

これらの用語の相互関係が頭の中に描ける人はある程度サッカーに詳しい人だろう。サッカーに詳しくない人でも、用語をググれば分かる。でも各用語が分かったとしても現在のサッカーシーンの主流戦術や、今までの歴史を俯瞰した概念はなかなか得られない。
そこは「各要素の関係図」を示してもらえれば分かるし、初学者が学ぶ際に役に立つ、というのが本サービスのコンセプト。

これはRailsに必要な技術をマインドマップに示した図。分かりやすいが、そもそもこれを作ったのはきっとRailsのエキスパート。

<img width="400" alt="11dce922-a9d2-272d-f7b8-9944c51a2050.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/11dce922-a9d2-272d-f7b8-9944c51a2050.png">



こういうのはひとりのエキスパートに頼るよりも、ネット文化に添って集合知を結集して自動作成されるようにしたかった。「人気のあるノード＝有用なノード」として目立つ場所に出てくるようにした。

例えばJavaScriptはこんな感じ。
<img width="400" alt="20180205205225.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/7f6afc2f-7c62-1416-234b-0113759eec07.png">


そもそもJavaScriptの初学者はフレームワークとしてReactやらAngularJSがあって、それらがJavaScriptである、ということから理解する必要がある。で、このノードのつながりを見れば一目瞭然かな、と。

早くたくさんの人に使っていただいて、もっといろんなノードが付いて欲しいなーとか思ったりしている。


モバイル版を無視して、デスクトップ版しか出さないのはいかがなものか、というご指摘もあるかもしれないが、基本的にPCでコードを書くエンジニアに向けたサービスなのでご了承ください。とにかく公開してその後のサービスの使われ方を見て変更をかけていくつもり。

ご自身が書いた技術記事が有用だと思う方や、他の人が書いた役に立つ技術記事をご存知の方は、ぜひその記事リンクを貼ったノードを作っていただけますでしょうか。
原理的にはどこまでもスクロールできるほぼ無限大に大きなノードグラフができる。
いつの日か考えもしなかったような巨大な集合知のノードグラフがnode-node-nodeにできていることを願って公開した。


使った技術
個人的にはGraphQLがこのサービス内容に対しては最適だったな、と。
料金はドメイン登録料だけで他は無料で済ませることができた。GCPの永年無料枠サイコー。

- Front-end
 - React
 - Redux

- Back-end
 - Ruby 2.5
 - Rails
 - GraphQL

- Infra
 - Google Cloud Platform
 - heroku
 - MongoDB
 - Redis
 - Cloud flare
 - SendGrid
 - NewRelic

<a href="https://node-node-node.netlify.com/">エンジニアの集合知をノードグラフにして図解するSNS。
「node-node-node（ノード ノード ノード）」
　https://node-node-node.netlify.com/</a>

ぜひご利用ください！
laravel-dynamodb で Range Key の BETWEEN 条件を指定する際の注意

## 結論

* `where($rangeKeyName, 'range', [$min, $max])` を使おう
* `whereBetween()` は無効

## 確認環境

* PHP 7.0.26
* Laravel 5.4.31
* [baopham/laravel-dynamodb](https://github.com/baopham/laravel-dynamodb) 4.2.1
* DynamoDB Local
    * [deangiberson/aws-dynamodb-local](https://hub.docker.com/r/deangiberson/aws-dynamodb-local/) の docker image を利用

## 事前条件

次のようなテーブルを考える。

### Movies

|AttributeName|KeyType|AttributeType|
|:---|:---|:---|
|id|HASH|String|
|search_key||String|
|date||String|
|（以降は適宜必要な Attribute を指定する）|||

このテーブルには以下の GSI が設定されているとする。

|IndexName|HASH|RANGE|Projection|
|:---|:---|:---|:---|
|date_range|search_key|date|ALL|


また、 `App\Models\Movie` に `Baopham\DynamoDb\DynamoDbModel` を継承した Model を定義しているものとする。

## 検証

`search_key` + `date` の GSI で `date` に BETWEEN を指定してデータを取得する。

（今回は GSI での検索になるが、Hash Key + Range Key テーブルや LSI でも同じだと考えられる）

### :ok_woman:  where(~,'between',~) 
きちんと BETWEEN が指定されて、Query になっている。

```php
>>>  App\Models\Movie::where('search_key', '1')->where('date', 'between', ['2017-01-01', '2018-01-01'])->toDynamoDbQuery()
=> BaoPham\DynamoDb\RawDynamoDbQuery {
     +op: "Query",
     +query: [
       "IndexName" => "date_range",
       "KeyConditionExpression" => "#search_key = :a1 AND (#date BETWEEN :a2 AND :a3)",
       "ExpressionAttributeNames" => [
         "#search_key" => "search_key",
         "#date" => "date",
       ],
       "ExpressionAttributeValues" => [
         ":a1" => [
           "S" => "1",
         ],
         ":a2" => [
           "S" => "2017-01-01",
         ],
         ":a3" => [
           "S" => "2018-01-01",
         ],
       ],
       "TableName" => "Movies",
     ],
   }
```

### :no_good:  whereBetween(~)

`whereBetween()` は無効なようで、Range Key での絞り込み条件が指定されずに Scan になってしまっている。

（例外投げてほしいなあ。。。）

```php
>>> App\Models\Movie::where('search_key', '1')->whereBetween('date', ['2017-01-01', '2018-01-01'])->toDynamoDbQuery()
=> BaoPham\DynamoDb\RawDynamoDbQuery {
     +op: "Scan",
     +query: [
       "FilterExpression" => "#search_key = :a1",
       "ExpressionAttributeNames" => [
         "#search_key" => "search_key",
       ],
       "ExpressionAttributeValues" => [
         ":a1" => [
           "S" => "1",
         ],
       ],
       "TableName" => "Movies",
     ],
   }
```

### :no_good:  where(~)×2

単純に AND でつなげる。Scan になってしまう。

```php
>>>  App\Models\Movie::where('search_key', '1')->where('date', '>', '2017-01-01')->where('date', '<', '2018-01-01')->toDynamoDbQuery()
=> BaoPham\DynamoDb\RawDynamoDbQuery {
     +op: "Scan",
     +query: [
       "FilterExpression" => "#search_key = :a1 AND #date > :a2 AND #date < :a3",
       "ExpressionAttributeNames" => [
         "#search_key" => "search_key",
         "#date" => "date",
       ],
       "ExpressionAttributeValues" => [
         ":a1" => [
           "S" => "1",
         ],
         ":a2" => [
           "S" => "2017-01-01",
         ],
         ":a3" => [
           "S" => "2018-01-01",
         ],
       ],
       "TableName" => "Movies",
     ],
   }
```
スマートコントラクトを作るスマートコントラクト

[前に作成した記事](https://qiita.com/sakakibara-setu/items/359300e11ab4953f1918)で述べた通り，Ethereumのスマートコントラクトにはスマートコントラクトを作る権限も与えられています．
そこで，スマートコントラクトを作成する機能を持ったスマートコントラクトを紹介します．

## コード
ここを参考に，一部変更しています．
URL: https://ethereum.stackexchange.com/questions/1415/solidity-create-contract-from-contract

solidityのバージョンは利用しているものに合わせてください．

### Factory.sol

```js
pragma solidity ^0.4.6;

contract Factory {
  bytes32[] public Names;
  address[] public newContracts;

  function createContract(bytes32 name){
    address newContract = new Contract(name);
    newContracts.push(newContract);
  }

  function getName(uint i) returns (bytes32){
    Contract con = Contract(newContracts[i]);
    Names.push(con.Name());
    return con.Name();
  }

  function getAddress(uint i) returns (address){
    return newContracts[i];
  }
}

contract Contract {
  bytes32 public Name;

  function Contract(bytes32 name){
    Name = name;
  }
}
```

## 解説
スマートコントラクトからスマートコントラクトを作成するためにすることは，２つです．

* 作成するスマートコントラクト（今回の場合はContract）を持つこと．
* スマートコントラクトを実体化すること．

new Contract(name)を行うことで，Contract型のスマートコントラクトを新たに生成します．
この時点で生成されたスマートコントラクトには自動でアドレスが割り振られるため，それをnewContractで受け取っています．

Ropstenに挙げた場合，図のようにEtherscanから確認できます．
作成元のコントラクトから作成後のコントラクトを追跡することができます．
このあたりはTokenの追跡にも似てますね．
下が上記の「スマートコントラクトを作成する機能を持ったスマートコントラクト」で，上がこのスマートコントラクトで作成されたスマートコントラクトになります．
Toがアドレスではなく，Contract Creationになっていますね．

![contractfromcontract.png](https://qiita-image-store.s3.amazonaws.com/0/98053/0d79eab8-3f20-1428-4ea8-a94b00c5609d.png)

### 機能一覧
#### createContract(bytes32 name)
引数に指定したnameパラメータを持つコントラクトを作成する．

#### getName(uint i)
指定したインデックス（生成順）のコントラクトが持つ名前を返す．

#### getAddress(uint i)
指定したインデックス（生成順）のコントラクトのアドレスを返す．

### truffleでの利用例
```
$ truffle console
```

以上のコマンドでコンソールに入ってから，以下のコマンドでcreateContract()を実行できます．
この場合は，「Test」というNameパラメータを持ったスマートコントラクトが作成されます．
上で示した図はこの結果です．

```js
truffle(development)> Factory.deployed().then(function(contractInstance){contractInstance.createContract('Test').then(function(v){console.log(v)})})
```

## あとがき
数行でスマートコントラクトを作成する機能を持ったスマートコントラクトを作成することができました．
とても可能性がある機能だと思うので，どんどん使っていきたいですね．
truffleを使ったスマートコントラクトのデプロイや検証といった工程も今後書きたいと思います．
ActiveRecordの罠(in)

株式会社オズビジョンの@terra_yuccoです。

最近コードを触ることは減りましたが、改善活動は細々とやっています。
その中で、素のクエリーからActive Recordに書き換えたかった @CodeIgniter 2.0.3
でも、After(ver.1)が動かなかったんです。

## Before

```php 
$inCondition = '110,111,112';
$sql = "SELECT id
    FROM `hoge`
    WHERE status = 2 and type = 'fuga' and id in ( $inCondition )";
$res = $db->query($sql)->result_array();
```

## After (ver.1)

```php
$inCondition = '110,111,112';
$db->select('id');
$db->from('hoge');
$db->where('status', 2);
$db->where('type', 'fuga');
$db->where_in('id', $inCondition);
$res = $db->get()->result_array();
```

last_query()とってみたら、発行SQLはこんな風になっていた。
IN句は `(110,111,112)` であってほしかったので、確かにこれでは動かない。

```sql
SELECT `id`
FROM (`hoge`)
WHERE `status` =  2
AND `type` =  'fuga'
AND `id` IN ('110,111,112') 
```

## After(ver.2)

```php
$inCondition = '110,111,112';
$db->select('id');
$db->from('hoge');
$db->where('status', 2);
$db->where('type', 'fuga');
$db->where("id in ({$inCondition})");
$res = $db->get()->result_array();
```

After(ver.2)は動きました。
素の構文構造を書かないといけないのがイヤだけど、とりあえず素のSQLを書くよりは数万倍いいはず…

おしまい。
Aurora MySQL 2.01 (MySQL5.7互換)のリリースノート

https://forums.aws.amazon.com/ann.jspa?annID=5424
こちらの簡約です。

## Amazon Aurora MySQL 2.01 GA

- Aurora MySQL 2.xバージョン <=> MySQL 5.7.12の互換性
- Aurora MySQL 1.xバージョン <=> MySQL 5.6.10の互換性

新しくAurora MySQLデータベースクラスタを作成する場合、MySQL 5.7.12またはMySQL 5.6.10のいずれかを選択することができる。（スナップショットからの復元も含む）




## Aurora MySQL 2.01には、Aurora MySQL 1.15との機能等価性

### 可

- Aurora MySQL 1.14 および1.15のスナップショットをAurora MySQL 2.01にリストア

### 不可

- MySQL 5.6.10互換の**Aurora MySQL 1.16以上**のスナップショットをAurora MySQL 2.01にリストア
- Aurora MySQL 1.xクラスタのAurora MySQL 2.01への**インプレースアップグレード**
- S3バックアップからのAurora MySQL 2.01への復元

これらの制限はAurora MySQL 2.xリリースでなくなる予定


## MySQL 5.7.12との互換性

### サポートしているもの

- JSONサポート
- 空間インデックス
- 生成カラム

z-orderカーブを使用した空間インデックス作成のネイティブ実装を使用して、空間データセット用のMySQL 5.7よりも20倍以上の書き込みパフォーマンスと10倍以上の読み取りパフォーマンスを実現。


### サポートしていないもの

- グローバルトランザクション識別子（GTID）
- グループレプリケーションプラグイン
- innodb_page_sizeの64k指定
- 起動時のInnoDBバッファプールのロード
- InnoDB full-text parserプラグイン
- マルチソースレプリケーション
- パスワードValidationプラグイン
- Query rewriteプラグイン
- レプリケーションフィルタリング
- CREATE TABLESPACE SQLステートメント
- Xプロトコル


## まとめ
一部サポートされていないものもありますが、一般的なWebアプリケーションで試しに使う分には支障はなさそうに思われます。
「Aurora、5.7使えないのかー」って声の中では、JSONカラムと空間インデックスに関するものが多かったと思うので、今回これが大きいですね。

### 追記
いつものごとく、クラメソさんが素早く[記事](https://dev.classmethod.jp/cloud/aws/amazon-aurora-mysql-57-generally-available/)にしてくれておりました。
東京リージョン対応や、実際にngramを試すところなどこちらのほうがわかりやすくなっております。
PHPStormでPlantUMLを書く

# 概要
PHPStormでリアルタイムにER図を描きたくて試してみました。
PHPStormでの導入覚え書きですが、IntelliJ IDEAといったJetBrainsのIDE全てに共通するチップスになるかと思います。
Graphvizのインストール方法なども丁寧に書いていこうと思います。

# 導入手順

## 1. PlantUML integration のインストール
PHPStormのプラグインをインストールします。
- PHPStormでFile -> Settings -> Plugins -> Browse Repositories...
- 「plantuml」で検索し「PlantUML integration」を選択・インストール
- 再起動するとプラグインが有効になる
![plantuml1.png](https://qiita-image-store.s3.amazonaws.com/0/117650/d2516860-be4b-33a1-e947-d91c593ff6a2.png)

## 2. Graphviz のインストール
図を描画するのに必要なソフトウェアです。
- [Graphviz 公式サイト](http://www.graphviz.org/download/) へ行く
- (Windowsユーザの場合) Windows -> Stable 2.38 Windows install packages
- インストールする

# 利用方法
- 新規作成できるファイルのリストにUML図を作成するメニューが追加されている

![plantuml2.png](https://qiita-image-store.s3.amazonaws.com/0/117650/197f1740-9efe-c0c8-6ab3-75604b3b9fa2.png)

- エディタに記述していくとリアルタイムで図がプレビューされる
![plantuml3.png](https://qiita-image-store.s3.amazonaws.com/0/117650/524356f2-0759-63e1-6f42-45daeacdd972.png)

内容について、なにかありましたらお気軽にご連絡ください。
Sublime Text3 > 検索 > xxx_yyy_zzz()とyyy_zzz()が定義されたソースにおいてyyy_zzz()だけを見つける > Whole wordオプションをオンにする

```txt:動作環境
Windows 10 Pro (64bit) Fall Creators Update適用済
Sublime Text Version 3.0, Build 3143
```


### 希望

xxx_yyy_zzz()とyyy_zzz()が定義されていて、関数のコールが複数個所であるとする。
この状況でyyy_zzz()だけの記載部分(主に関数のコール)を見つけたい。

### Sublime Text3

- Find in Files...を使う
    - Whole wordオプションをオン
    - `yyy_zzz`で検索

Whole wordオプションをオンにすると「単語間の文字列」も厳密にチェックすると思っていた。
上記のように「単語の外」の文字列も意識した検索であるようだ。

### 関連

[Sublime Text3 | 正規表現 > #define[space][tab]XXXや#define[space][space]XXXや#define[tab][tab]XXXや#define[tab][space]XXX を探す](https://qiita.com/7of9/items/5d9f7f6ab237072d9808)
fuelphp on dockerめも



#プロジェクトの作成
```
$ oil create fuel-sample
```
#ビルドインサーバ起動
```
$ oil create fuel-sample
$ cd /Users/user_name/fuel-sample
$ php oil server -h=0.0.0.0 -p=8080
```

#Dockerのポート
```
ports:
 - "ホスト側のポート:コンテナ側のポート"
 -  ports: 
   - "80:8080"
```
例えばこの例だとdockerで8080でfuelを起動するとhttp://localhost:80
でアクセスできる。

#dbへのアクセス
docker-compose.ymlが

```
version: "3"
services:
    www:
        container_name: fuel_app
        # build: .
        build: ./run_anyway        
        ports: 
            - "80:8080"
        volumes:
            # - ./www:/var/www/html/
            - ../application/:/var/www/html/application
            # - ./environment/config/php.ini /usr/local/etc/php/php.ini
            # - ./environment/config/ssh2.ini /etc/php.d/ssh2.ini
            # - ./environment/config/httpd.conf /etc/httpd/conf/httpd.conf
        tty: true

    db:
        container_name: docker_db_mysql
        image: mysql
        ports: 
            - "3306:3306"
        restart: always
        environment:
            MYSQL_USER: user
            MYSQL_PASSWORD: test
            MYSQL_ROOT_PASSWORD: root
        volumes:
            # - "./mysql:/var/lib/mysql"
            - "./mysql/init:/docker-entrypoint-initdb.d"
```

となっている時、プログラム内でdbにアクセスする際localhostとなっているところをdbに置換する。
wwwやdbはエイリアスとなっているのでコンテナ間のアクセスはリンクを使用する。
https://stackoverflow.com/questions/40075065/using-docker-i-get-the-error-sqlstatehy000-2002-no-such-file-or-directory

#Refferences
fuelPHP
https://qiita.com/snoguchi/items/47392806f898671baa22
vim高速移動
https://qiita.com/takeharu/items/9d1c3577f8868f7b07b5
DockerでfuelPHP
https://qiita.com/TakashiOshikawa/items/8b73fce98d0d55f86936
SourceTreeでGithubの認証に秘密鍵を使う (Windows)

## 概要
下記記事で紹介したやり方で作成した秘密鍵を使ってSourceTreeでGithubに接続しようとするとそのままではGithubの認証ができなかったのでやり方をメモとして残す。

- [秘密鍵・公開鍵を作成する（Win）](https://qiita.com/reflet/items/5c6ba6e29fe8436c3185)

## 秘密鍵（id_rsa.ppk）の作成
WindowsのSourceTreeで秘密鍵を「 id_rsa 」から「 id_rsa.ppk 」を作成する。

### SSHキーの作成/インポート

![step01.png](https://qiita-image-store.s3.amazonaws.com/0/142279/1b13a223-ab71-07be-61f6-2c02dd3f90b2.png)
SourceTreeを起動して、「ツール」 → 「SSHキーの作成/インポート」をクリックする。

![step02.png](https://qiita-image-store.s3.amazonaws.com/0/142279/dfe18522-dc0e-aefe-db8a-5070ee29d6ff.png)
Puttyが起動するので、「Load」ボタンをクリックする。

![step03-1.png](https://qiita-image-store.s3.amazonaws.com/0/142279/7619124a-1a8c-9936-845e-c60f050fee41.png)
パスの部分に「C:¥Users¥{ユーザー名}¥.ssh」を指定する。

![step03-2.png](https://qiita-image-store.s3.amazonaws.com/0/142279/0b1c9e63-3a6f-fab2-5812-f270e04e0f8e.png)
ファイルの種類で「All Files (*.*)」を選択する。

![step03-3.png](https://qiita-image-store.s3.amazonaws.com/0/142279/eeb11a40-31f4-8957-5fc7-4a43417bd513.png)
「id_rsa」を選択して「開く」ボタンをクリックする。

![step04.png](https://qiita-image-store.s3.amazonaws.com/0/142279/57f8c9c1-f7c0-7950-e683-043cd30a70f4.png)
「OK」をクリックする。

### 秘密鍵（id_rsa.ppk）を保存する

![step05.png](https://qiita-image-store.s3.amazonaws.com/0/142279/53cfce1b-d939-d0bd-71f0-e79f6bcd1bda.png)
「id_rsa」がインポートされたので、「Save private key」ボタンをクリックする。

![step06.png](https://qiita-image-store.s3.amazonaws.com/0/142279/45796f12-b944-db70-8853-3c418c0a9cc4.png)
「はい」をクリックする。

![step07.png](https://qiita-image-store.s3.amazonaws.com/0/142279/e89c407a-f85d-46e7-96be-9a0511ff7c3a.png)
パスの部分が「C:¥Users¥{ユーザー名}¥.ssh」になっているか確認する。
また、ファイル名に「 id_rsa.ppk 」を入力し、「保存」ボタンをクリックする。

![step08.png](https://qiita-image-store.s3.amazonaws.com/0/142279/20baef81-1e7f-466a-8267-293f954d1a09.png)
右上の「 × 」ボタンをクリックしてウィンドウを閉じる。

以上で、下記フォルダに秘密鍵(id_rsa.ppk)が保存されます。

## SSHエージェントに登録する

![step09.png](https://qiita-image-store.s3.amazonaws.com/0/142279/4c648175-5ffe-648f-9ada-38b180caba0f.png)
SourceTreeの「ツール」 → 「SSH エージェントを起動...」をクリックする。

![step10.png](https://qiita-image-store.s3.amazonaws.com/0/142279/d50265f4-5931-b5dd-6e9d-ea25583db71c.png)
デスクトップの右下にある常駐ソフトに「 Pageant 」があるのでダブルクリック。
※ Pagent: 赤枠のアイコン

![step11.png](https://qiita-image-store.s3.amazonaws.com/0/142279/7cc4d170-4e5f-f18f-7cff-63cd7473958e.png)
「Add key」ボタンをクリックする。

![step12.png](https://qiita-image-store.s3.amazonaws.com/0/142279/3f66bd60-08c3-a8ec-2d96-e82764b33d7a.png)
「C:¥Users¥{ユーザー名}¥.ssh」フォルダを指定して、一覧に表示される「id_rsa.ppk」を選択し、
「開く」ボタンをクリックする。

![step13.png](https://qiita-image-store.s3.amazonaws.com/0/142279/ede67f72-adf0-a3de-3303-d4228c5a3168.png)
秘密鍵が追加されたことを確認して、「Close」ボタンをクリックする。

![step14.png](https://qiita-image-store.s3.amazonaws.com/0/142279/aacea272-b798-6c08-b59a-8b568ec6cf6a.png)
SourceTreeに戻って、「プル」ボタンをクリックしてみる。
エラーがでなければ成功です。
※ エラーが出る場合は、秘密鍵が間違っていないかなど確認してください。

## Pageantの常時起動
Windowsを再起動するとPageantが自動で起動していないので、自動起動＆秘密鍵の自動登録を行うよう設定する。

- [Pageantに秘密鍵を自動でセットして起動(Windows)](https://qiita.com/reflet/items/6d74851f033ddc325df9)

以上。
HTMLのcanvasで背景が白色のjpegを作る

HTML5のcanvas要素を使って描いた絵の背景は、白ではなく透明です

これをファイルにして取り出したい時は普通 toDataURL を使いますよね

```javascript:hoge.js
var canvas = document.getElementById("myCanvas");
var datauri = canvas.toDataURL("image/jpeg",0.5);//品質0.5は下げ過ぎか…？
```

pngなら透明のまま吐き出されますが、jpegにすると背景が黒になります

最初から黒背景で描いてるならいいですが、白背景で描いてた場合、全然違うイメージの絵ができちゃいますね

なので、絵を書き始める前の最初の段階で、透明の背景を、白く塗りつぶしちゃいましょう。

##HTML側のcanvas要素がこんな感じとすると

```html:test.html
<html>
<body>
    <!-- 横300px、縦200pxのcanvas要素 -->
    <canvas id="myCanvas" width="300" height="200"></canvas>

    <!-- javascriptの読み込みは必要に応じて -->
    <script src="https://code.createjs.com/easeljs-0.8.2.min.js"></script>
    <script src="../test.js"></script>
</body>
</html>
```

##create.jsならこう

```javascript:test.js
canvas = document.getElemenById("myCanvas");
stage = new createjs.Stage(canvas);
var bg_shape = new.createjs.Shape();//shapeインスタンスを作る
bg_shape.graphics.f("white").dr(0,0,300,300);//形を白い四角に決める
stage.addChild(bg_shape);//白い四角をステージに置いて
stage.update();//canvasに描画
stage.removeChild(bg_shape);//白い四角をステージから降ろします
```
f は beginFill 、 dr は drawRect の短縮形(Tiny API)です。短縮前とまったく同じ働きをします。

create.jsを使ったcanvas描画は、セルアニメみたいなイメージですね。

白い四角を作って、撮影ステージに上げて、カシャッと撮影した映像がcanvasに描かれる。

ここで作ったshapeインスタンスは、後から似たような図形を描いたり動かしたりしたい時に重宝しますが、今回はもう要りませんので、後から悪さしないようにステージから降ろしておきます。

##create.js使わないならこう

```javascript:test.js
canvas = document.getElemenById("myCanvas");
ctx = canvas.getContext("2d");
ctx.fillStyle = "#FFFFFF";//筆に白い絵の具をつけて
ctx.fillRect(0,0,300,200);//四角を描く
```

こちらは、カンバスに直接白い絵の具をベチャッと塗っちゃうイメージです。

この四角形のオブジェクトを後から使いまわして、色を変えたり動かしたりとかはできません。

筆で上書きするしかないですね。

##で、作ったのがこちら

[岡竜之介の大喜利道場](http://oka-ryunoske.work/oogiridojo/)

お題に対して、面白い回答を投稿するサイトです。

回答として、絵を描いて投稿することができます。その部分で今回の手法を使ってます。

よかったら遊びに来て下さい！


以上です
UbuntuにRubyをインストールした話

[前回の記事](https://qiita.com/toshi726/items/3ea8a7c152d9517723fd)で仮想マシン上にインストールしたUbuntuに、Rubyをインストールした時のメモです。
## 今回使ったもの
- Ubuntu（バージョン 16.04 LTS）
- git
- rbenv
- ruby-build

## gitのインストール
まずはgitをインストールします。
[参考：Git - Download for Linux and Unix](https://git-scm.com/download/linux)

```
sudo apt-get install git
```

少し古めのgit（バージョン 2.7.4。最新は2.16.1。）がインストールされます。とりあえず現時点で困ることはないので、そのまま使うことにしました。
## rbenvのインストール
githubのrbenvのinstallationに沿って、rbenvをインストールします。
詳細は下記のリンクから。
[github : rbenv](https://github.com/rbenv/rbenv#installation)

簡単にまとめると、

```
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
```

してから、以下の記述を.bashrcに追加するだけです。

```
eval "$(rbenv init -)"
```

.bashrcを書き換えたあとはsourceするなり、ターミナルを再起動するなりします。
### おまけ：rbenvのアップデート
gitからrbenvをクローンした場合は、以下のコマンドで最新にアップデートできます。

```
cd ~/.rbenv
git pull
```

## ruby-buildのインストール
次にruby-buildをrbenvのプラグインとしてインストールします。
詳細は下記のリンクから。
[github : ruby-build](https://github.com/rbenv/ruby-build)

簡単にまとめると、

```
mkdir -p "$(rbenv root)"/plugins
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev
```

最後のapt-getはUbuntu/Debian/Mint用。その他の環境の場合は、以下のリンクから依存ライブラリを確認してください。
[Suggested build environment](https://github.com/rbenv/ruby-build/wiki#suggested-build-environment)
### おまけ：ruby-buildのアップデート
gitからruby-buildをクローンした場合は、以下のコマンドで最新にアップデートできます。

```
cd ~/.rbenv/plugins/ruby-build/
git pull
```

## Rubyのインストール
rbenvを使ってRubyをインストールします。使い方は以下。

インストール可能なRubyの一覧を表示

```
rbenv install -l
```

指定したバージョンのRubyをインストール

```
rbenv install 2.5.0
```

通常使うRubyのバージョンを指定

```
rbenv global 2.5.0
```

## RubyGemsのアップデート
RubyGemsをアップデートします。
[参考：RubyGemsのガイド](http://guides.rubygems.org/command-reference/)

```
gem update --system
```

これでRubyのプログラムを実行できるようになりました。
swiftとC言語を比べて

まずプログラミングをswiftで勉強し始めた。

次にC言語の本も読んでいる。



swiftを解説した本では出てこなかったC言語の用語


プロトタイプ宣言


実引数と仮引数・・・swiftでは引数とだけしか出てこず、実と仮の区別があまり書いていなかった
【Bundler】Command: `bundle install`

# `bundle install`

## Summary
* Gemをインストールする

## Roles
* Gemfileの内容を元にGem達のバージョンを指定してインストールすることができる

## How to
* カレントディレクトリの配下にGemfileが存在する状態で実行する

## Result
* カレントディレクトリ配下のGemfileの記述を元に、Gem達がそれぞれファイル内で指定されたバージョンでインストールされる

## Caution
* Gemのインストール先はデフォルトで下記のSampleの場所（Rubyのバージョンごとに保存されている） ※rbenvを使用
* アプリケーションごとにGemをインストールしてやっていきたいんだという場合は、
アプリケーションのディレクトリ下で、`bundle install --path vendor/bundle`を一度実行する必要がある

###### Sample 

* Gem「Mechanize」のインストール先を検索(`gem which`)

```
$ gem which mechanize
/Users/macuser/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/mechanize-2.7.5/lib/mechanize.rb
```

## Reference

[bundler、bundle execについて　※自分用メモ](https://qiita.com/dawn_628/items/1821d4eef22b9f45eea8)
[Rails開発環境の構築（rbenvでRuby導入からBundler、Rails導入まで）（Macport編）](https://qiita.com/emadurandal/items/a60886152a4c99ce1017#%E9%96%93%E9%81%95%E3%81%88%E3%81%A6ruby%E7%92%B0%E5%A2%83%E3%81%AE%E6%96%B9%E3%81%AB%E3%81%84%E3%82%8D%E3%82%93%E3%81%AAgem%E3%81%8C%E5%85%A5%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6)
MacBookProの環境構築メモ

# もくてき
会社支給のMacBookProが届いて、つらく長かったwin機での開発が終わりを告げました
というわけで新開発機の環境構築から始まるわけですが、毎回何を入れたか忘れqiitaで皆様の環境構築記事を見ながら思い出す生産性皆無なことをしているのでいい加減自分の環境構築リストを備忘録として残しておこうと思い立ったわけですね
~~あとダウンロード中とかひまなので~~
というわけで以下リスト
完全に自分用記事なので面白みはないとおもいます。。
(4/2 更新)

## Utilities
- slack
- alfred
- skitch
- BoostNote
- Trello
- ESET(会社指定)
- office諸々
- Cyberduck

## Browser
- Chrome

## Shell
- iterm2
- zsh
- oh-my-zsh(themaはys)
- peco
- zsh-completions

## Coding Tool
- Homebrew
- Atom
- vim
- vim + コピペ機能 (https://qiita.com/shoma2da/items/92ea8badcd4655b6106c)
- git
- gitlab
- tig

## sql
- mysql
- sequel pro

## ruby
-rbenv
-ruby 2.5.0(rbenv経由)
-rails 5.1.5
[参考](https://qiita.com/yu-yan/items/6e693caf23054c6ba9a1)
-rubymine

## Java
- jenv

## VirtualMachine
- vagrant
- VirtualBox

## Android
- Android Studio
- Genymotion

## iOS
- Xcode

## ProtoTyping
- inVision Studio

# 使用可能になったショートカット
^i             => iterm2の新規ウィンドウを開く
^r(iterm2上で)  => pecoのインクリメントサーチを開く
opt+space      => alfredを開く
ほかいろいろ
[test015] セレクトボックスの要素を上げ下げ

# セレクトボックスの要素を上げ下げ

## 概要
マルチプルなセレクトボックスの要素を上げたり下げたりする

## ソース


### HTML
```test015.htm
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript" src="test015.js">
<title>セレクトボックスの要素を上げ下げ</title>
</head>
<body>
<h1>セレクトボックスの要素を上げ下げ</h1>
<hr>
<select id="test_list" name="test_list" size="8" multiple>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
<input type="button" value="up" id="up">
<input type="button" value="down" id="down">
</body>
</html>  
```

### javascript

```test015.js
$(function(){
  $('#test_list').on('change',function(){
    $('#up').prop('disabled',$(this).find('option:selected').length==0 ||
      $(this).find('option:first').prop('selected'));
    $('#down').prop('disabled',$(this).find('option:selected').length==0 ||
      $(this).find('option:last').prop('selected'));
    if($(this).find('option:selected').length>=2){
      for(var i=$(this).find('option:selected:first').index()+1;i<$(this).find('option:selected:last').index();i++){
        $(this).find('option').eq(i).prop('selected',true);
      }
    }
  }).trigger('change');
  $('#up').on('click',function(){
    $('#test_list option:selected:last').after($('#test_list option').eq($('#test_list option:selected:first').index()-1));
    $('#test_list').trigger('change');
  });
  $('#down').on('click',function(){
    $('#test_list option:selected:first').before($('#test_list option').eq($('#test_list option:selected:last').index()+1));
    $('#test_list').trigger('change');
  });
});
```

## その他

### 元ネタ
- teratail:
 [JavaScriptで複数のOption要素の入れ替えについて](https://teratail.com/questions/112448)

### 動くサンプル
- 調整中