OmniAICreator/Qiita-1.07M huggingface dataset:
Jupyter Notebook で括弧の入力補完( autoCloseBrackets )をオフにする

## 動機
基本的に楽できるところは楽にするというスタンスではあるけれど、入力補完系は目的のものが入力できなかった場合のリカバリがかえって手間になることがあって個人的には好きではない(入力候補が見える程度で良い）。

特に括弧の自動入力については、括弧内の入力を終えた時にカーソルを移動しなければならいため、結局手動で括弧の入力する時と手間が変わらない。
また、私は Jupyter Notebook では autopep8 を使用している。
この時、括弧を行を跨ぐように改行すると、インデントが崩れることがあり、その修正に結構な労力を割かれる。

ということで、 Jupyter Notebook 上の括弧の自動補完を切ることにした。

## 手順
Jupyter Notebook 上で次のコードを実行する。

```python
from notebook.services.config import ConfigManager

c = ConfigManager()
c.update('notebook',
         {"CodeCell": {"cm_config": {"autoCloseBrackets": False}}})
```

実行すると `~/.jupyter/nbconfig/notebook.json` が更新されて自動補完をオフにできる。

```json:~/.jupyter/nbconfig/notebook.json
{
  "Cell": {
    "cm_config": {
      "lineNumbers": false,
      "autoCloseBrackets": false
    }
  },
  "load_extensions": {
    "jupyter-autopep8/jupyter-autopep8": true
  },
  "CodeCell": {
    "cm_config": {
      "autoCloseBrackets": false
    }
  }
}
```

`"autoCloseBrackets": false` となっていることがわかる。
Jupyter Notebook で上記手順を行うのが面倒な場合には直接 notebook.json を編集すればよい。
AmazonLinux2（ami-e99f4896）でDeepSecurity Agentのインストール時にUnsupported platform is detectedが発生する問題

# 現象

先日正式リリースされたAmazon Linux 2（ami-e99f4896）にTrend Micro Deep Security Agent 11.xをインストールスクリプト経由でインストールすると以下のようなエラーが発生し、エージェントがインストールされない問題の解決法を残したいと思います。
当問題が修正されるまでの暫定手順とさせていただきます。

```shell:errorlog

Unsupported platform is detected

Unsupported platform is detected
./AgentDeploymentScript.sh: line 63: /opt/ds_agent/dsa_control: No such file or directory
./AgentDeploymentScript.sh: line 64: /opt/ds_agent/dsa_control: No such file or directory
```

# 問題箇所

インストールスクリプトからインストールする際に、プラットフォーム情報（OSの種別）を/tmp/PlatformDetectionで確認しています。
そこでlsb_releaseでディストリビューション、バージョンを取得するが、**n/a** しか取得されない。
Amazon Linux側でセットし忘れたのか、このPlatformDetectionが問題なのかは不明ですが、現時点で取得できない状態です。

# 対策方法

以下の2つの方法があります

## インストールスクリプトを修正

インストールスクリプトのlinuxPlatform変数に*amzn2/x86_64/*を直書きする。

```shell:AgentDeploymentScript.sh

#!/bin/bash
linuxPlatform='amzn2/x86_64/';
```


## インストーラからインストールする

Agentのダウンロードから対象のプラットフォームのインストーラでエージェントをインストールし、インストールスクリプトの最後のコマンドを実行する。（下記の部分）

```
/opt/ds_agent/dsa_control -r
/opt/ds_agent/dsa_control -a dsm://agents.deepsecurity.trendmicro.com:443/ "tenantID:<xxxxxxx>" "token:<yyyyyyyyy>" "policyid:<zzzz>"
```
7. ArduinoでECHONET Liteデバイスを作る

Arduino用のECHONET Liteライブラリを作って見ました。
下記にサンプルとともにおいてあります。

https://github.com/Hiroshi-Sugimura/EL_dev_arduino


- （追記）ライブラリをアップデートし，M5stackの場合について記述しました。

https://qiita.com/Sugimura-Laboratory/items/72af96c7db6b356b95b8

# どんなもの？

このライブラリはコントローラというよりはデバイスになることを想定しています。
サンプルは一般照明オブジェクトになっていて，ArduinoについているL9のLEDをON，OFFできます。
電源がはいるとDHCPでIPをとってきて，LCDにIPを表示します。

![yousu.png](https://qiita-image-store.s3.amazonaws.com/0/120396/bfec710a-26d6-9371-bec6-1e728cde160c.png)

ここでは簡単に使い方を紹介します。

# 環境・準備

必要に応じてLANケーブルやブレッドボードなども必要です。

- Arduino + Ethernet （サンプルと写真はArduino Ethernet R3）
- LCD（AQM0802A）　（ピッチ変換した完成品が使いやすいでしょう）
 - 秋月: http://akizukidenshi.com/catalog/g/gM-09109/
 - SwitchScience: https://www.switch-science.com/catalog/1407/

# サンプルの実行手順

簡単4ステップで実行できます。

- 上記のURL（Github）からソースをダウンロードします。
- 適当なフォルダに展開します。
- EL_dev_arduino.ino(18行目あたり）を編集して，　macアドレスを適切なものにします。

```C++:EL_dev_arduino.ino
// macアドレスは商品別で設定する必要がある。 |
byte mac[] = { |
    0x??, 0x??, 0x??, 0x??, 0x??, 0x??}; |
```

- 実行します。
- IPアドレスが表示されればOK!


# 動作テストの方法

ECHONET Liteコントローラのアプリケーションで制御できます。各環境のおすすめを下記に記します。

- Windows なら下記URLにある「Super Speed Node Generator for ECHONET Lite Ver.3.0.1」が良いでしょう。
 - SSNG: https://smarthouse-center.org/sdk/download/
- iOS　なら下記URLのSSNG for iPhoneか，EL Lightingがよいでしょう。
 - SSNG for iPhone: https://itunes.apple.com/jp/app/ssng-for-iphone/id1076467789?mt=8
 - EL Lighting: https://itunes.apple.com/jp/app/el-lighting/id1296697112?mt=8

## ZIPの内容

下記の4モジュールでできています。

- EL_dev_arduino.ino: サンプル
- EL.h, EL.cpp: ECHONET Lite プロトコルのクラス
- ELOBJ.h, ELOBJ.cpp: ECHONET Lite デバイス状態を保存しておいてあげるクラス
- LCD.h, LCD.cpp: DHCPで取得したIPを表示するためのLCD制御クラス

自分で新しいデバイスを作りたい場合はサンプルを書き換えていけば大丈夫です。

# 参考文献

- エコーネットコンソーシアム: https://echonet.jp
- ECHONET Lite入門 スマートハウスの通信技術を学ぼう！: http://amzn.asia/fIyglVQ
Embed YouTube videos on webpages without worrying about loadtime

1) Paste the DIV codes on your website, where the video should appear to the users.

EX: ![Untitled.jpg](https://qiita-image-store.s3.amazonaws.com/0/218886/626f6432-2b1e-b472-dca0-b1516c099f2a.jpeg)

(Don't forget to change your video ID)

2) Place the JavaScript given in the reference image.

![jRmFnQ.jpg](https://qiita-image-store.s3.amazonaws.com/0/218886/11da6d6c-a354-9c47-efd8-d226b9b7ac6c.jpeg)

3) Place the CSS before the close of </head>tag.
![LpPDRw.jpg](https://qiita-image-store.s3.amazonaws.com/0/218886/5b795330-ea73-7c73-4fbf-3ce7db4f518f.jpeg)

By doing this you can reduce the load of web pages.

Check The Reference For Complete Step By Step Process: https://codepen.io/Christaelrod/post/embed-youtube-videos-on-webpages-without-worrying-about-loadtime
WPS非対応の無線LAN端末(Meraki)に対してヘルシオホットクックから接続する方法

## はじめに

エンジニアマストアイテムのヘルシオホットクック。料理をバッチ処理出来る。一度食材を切ってセットさえすれば、あとは完成まで勝手にやってくれる。1日30分料理の時間が短縮されることを考えると、その時間的コスパは絶大。WiFi対応モデル(KN-HW24C-R)を利用すれば、新しいレシピもダウンロード出来る。SHARPの底力をみた。

ただ欠点が一つ。__ホットクックとの無線LAN接続はPBC方式のWPSしか対応していない。__なんという割り切り仕様だ。

自宅の無線環境は当然WPSなど存在しないCisco Merakiなので、さてどうするかと思っていた所、__なぜか「ホットクック + Meraki」という同じ技術スタックを抱える同僚が横におり、すでに彼がこの問題を解決させていたので簡単に解決__。「Qiitaとか投稿手間だから、代わりに適当に書いておいて」ということで、書いておきます。


## 基本構成

```
ルータ(プロバイダ支給) > Meraki MR33 (AP Mode) > Clients
```

ちなみにMerakiに限らずWPS非対応の無線APであればすべて同様


## 仕組み

実はWPSでは、ハンドシェイク完了後にSSIDとパスワードの組み合わせクライアント側に転送してくれる。

すなわち、__今使っている無線APと全く同じSSIDとパスワードの組み合わせを、WPS対応無線APで設定し、プッシュボタン式でホットクック側と設定完了さえできればOK__。あとは大本の無線APが違う端末に入れ替わっていても、接続出来るようになる。

## 事前作業

WPS対応の無線APなんでもいいので購入する

- [ELECOM 11ac/a 11n/b/g ポータブルルーター(WRH-583BK2)](http://www2.elecom.co.jp/products/WRH-583BK2.html)


## 具体的ステップ

- `Meraki MR33` と上流(ルータ)が繋がっているLANを抜く
- `WRH-583BK2` に抜いたLANを接続する
- `WRH-583BK2` の2.4GHzに、今メインで使っているSSIDとパスワードの組み合わせを設定する
- PBC方式で `WRH-583BK2` のWPSを起動する(画像参照)

<img width="1003" alt="screenshot" src="https://qiita-image-store.s3.amazonaws.com/0/142932/ce292f82-43d7-b47e-b781-b2dc1b20e4cb.png">

- ホットクック側から無線接続させ、完了を見届ける
- `WRH-583BK2`を取り外し、元々の `Meraki MR33` に差し替えて無線を元に戻す
- ホットクック側に移動し、無線LANの機能を再起動する(ON/OFFする)
- 引き継続きホットクックが無線接続出来ていることを確認する


## 注意点

- ホットクックにてWPS接続完了後に、上位の無線APを切り替え後にホットクック側で無線LAN Client機能のON/OFF作業が必要。
    - DHCPでIPアドレスがアサインされるが、ホットクック側で掴みっぱなしになってしまう模様。
    - ホットクックのコンセントを一瞬抜き差ししても、バッテリー稼働してしまうためか、同じIPのまま
Node.jsで終了時にファイル保存する

単なるメモなので短いです

# 終了時にデータを保存したい

僕はNode.jsでsocket.ioを扱うプログラムをよく書いているのですが、プログラム終了用のイベントとかは特に実装せずに、終了したくなったときはCtrl+Cで終了させています。その終了したときにデータを保存したかったので、そのやり方です。

# テスト用ソースコード

```javascript
var fs = require("fs");

var saveData = {}

process.on("exit", function() {
    console.log("Exitting...");
    saveData["date"] = new Date();
    var json = JSON.stringify(saveData, null, "    ");
    fs.writeFileSync("savedata.json", json);
    console.log("Saved!");
})
process.on("SIGINT", function () {
    process.exit(0);
});

setInterval(function(){}, 10000);
```

多分Node.jsでプログラム終了時に処理を行いたくてgoogle先生に教えを請うと、process.onでexitシグナルを受け取る方法が出てくると思います。
この方法だと、process.exitで終了した時や、プログラムがエラーで終了したときのイベントは受け取れるのですが、Ctrl+Cで終了した際は呼ばれません。
なので、さらにprocess.onでSIGINTシグナルを受け取り、その中でprocess.exitをしてやることにより、Ctrl+Cで終了してもexitシグナルを受け取ることができます。
あとはexitシグナルのリスナー内に保存する処理を書けばいいです。
exitシグナルのリスナー内では非同期関数は使えないので、ファイルを書き込むときはfs.writeFileSyncの同期関数を使いましょう。
select2 4.0.6rcで、HTML data属性が反映されない

# 問題

select2は、HTMLのdata属性を読んで初期化してくれるが、4.0.6rcでは、バグがあって読んでくれない。

こんなふうにできるけど、

```html
<select class="select2" data-width="300px"></select>
```

```js
$(() => {
  $('.select2').select2()
})
```

4.0.6rcでは、300pxが反映されない。

see: https://github.com/select2/select2/issues/5320

# 対処

現状では、最新の正式リリース 4.0.5 を使うしかなさそう

```
yarn add select2@4.0.5
```
OLED付きESP32でTinyGPS++を使う

#材料

https://www.amazon.co.jp/dp/B0736LHNWJ

![IMG_3659_01.png](https://qiita-image-store.s3.amazonaws.com/0/181687/f3f408cc-6f8c-6682-068d-300101f1a51e.png)


#ソース

```c

#include <TinyGPS++.h>
#include "SSD1306.h"
SSD1306   display(0x3c, 5, 4);
TinyGPSPlus gps;

void setup() {
Serial.begin(19200); 
Serial.print("Start!");Serial.println("");

/* Wemos OLED setup
*/
  display.init();
  display.flipScreenVertically();
  display.displayOn();
  display.clear();

  display.drawString(0,  32, "Hello");
  display.display();

  delay(100);
}

void loop() {
  while (Serial.available() > 0){
    if (gps.encode(Serial.read())){
      
      /* Output Serial
      */
      Serial.print("LAT=");Serial.println(gps.location.lat(),6);
      Serial.print("lng=");Serial.println(gps.location.lng(),6);
      Serial.print("ALT=");Serial.println(gps.altitude.meters());
      Serial.print("sate=");Serial.println(gps.satellites.value());
      
      /* dtostrf
      */
      char gpslat[16],gpslng[16],gpshigh[16],gpssate[16];
      dtostrf(gps.location.lat(), 12, 8, gpslat);
      dtostrf(gps.location.lng(), 12, 8, gpslng);
      dtostrf(gps.altitude.meters(), 12, 4, gpshigh);
      dtostrf(gps.satellites.value(), 12, 0, gpssate);
      
      /* Output Wemos OLED
      */
      display.clear();
      display.setFont(ArialMT_Plain_10);
      display.setTextAlignment(TEXT_ALIGN_LEFT);
      display.drawString(0, 0, "GPS");
      display.setFont(ArialMT_Plain_10);
      display.setTextAlignment(TEXT_ALIGN_RIGHT);      
      display.drawString(127,0,gpslat);
      display.drawString(127,16,gpslng);
      display.drawString(127,32,gpshigh);
      display.drawString(127,48,gpssate);
      display.display();
    }
  }
}

```

#メモ
WiFiライブラリ入れてAmbientとかのクラウドに送るとか、SDカードに書き出すとかお好みで。
WindowsにTensorflowを入れてみる(成功編)

#始めに
昨日トライしてダメだったのの続きです。
最終的にうまく行ったら他の環境で精査の上、見やすい記事にする。
AnacondaやPython等は一度アンインストールしました。

#TensorFlowインストール

### 参照
「TensorFlowのオリジナルのインストールページ」https://www.tensorflow.org/install/install_windows

##未確認情報
Visual C 2015再配布のライブラリが無いとダメだという情報もある。

###ここまではぶつからないだろうと、下記OKという事でパス

```
    CUDA Toolkit 9.0. For details, see NVIDIA's documentation Ensure that you append the relevant Cuda pathnames to the %PATH% environment variable as described in the NVIDIA documentation.
    The NVIDIA drivers associated with CUDA Toolkit 9.0.
    cuDNN v7.0. For details, see NVIDIA's documentation. Note that cuDNN is typically installed in a different location from the other CUDA DLLs. Ensure that you add the directory where you installed the cuDNN DLL to your %PATH% environment variable.
    GPU card with CUDA Compute Capability 3.0 or higher for building from source and 3.5 or higher for our binaries. See NVIDIA documentation for a list of supported GPU cards.
```

####実はダメでした。バージョンがCUDA9.2とcuDNN7.1でもいけるだろと思ったらCUDA9.0とcuDNN7.0でないとダメらしい…

##Python3.6.6インストール

素朴な疑問として、3.7.0でも動くんだろうか？


https://www.python.org/downloads/release/python-366/
から
「Windows x86-64 executable installer」
クリックして下記を落とします。

```
python-3.6.6-amd64.exe
```

###昨日失敗した、コマンドプロンプトでpipで入れる。

####ただしこれやるなら先にpipのアップグレードでしょうな。

```
>> pip install --upgrade pip
```

またダメだというので

```
>> python.exe -m pip install --upgrade pip
```

最新らしいです。

でわ。

```
pip install --upgrade tensorflow-gpu
```

…アクセス禁止らしい。

では管理者モードでコマンドプロンプト起動後。

```
pip install --upgrade tensorflow-gpu
```

…ありゃ。はいっちゃったよ。

###ただし、PATHに下記を追加する。
C:\program files\python36\Scripts

##では、Validate your installation

```
>> $ python
```

```
>>> import tensorflow as tf
```

…

```
ImportError: Could not find 'cudart64_90.dll'…

```
…………… (T_T)

もしかして、CUDA9.2じゃダメなのか？
という仮説の元、CUDA9.0を落としに掛かる。

## CUDA / cuDNN再インストール

「CUDA Toolkit 9.2 Download」
https://developer.nvidia.com/cuda-downloads
から
「Windows」
まで選んだ上で…ページ中段くらいの
「Legacy Releases」
を叩く。

#### CUDA Toolkit 9.0に飛びます。
4つ落として順に入れる

```
cuda_9.0.176_win10.exe
cuda_9.0.176.1_windows.exe
cuda_9.0.176.2_windows.exe
cuda_9.0.176.3_windows.exe
```

### もう一度Tensorflow動作確認

####Validate your installation

```
>> $ python
```

```
>>> import tensorflow as tf
```
ダメでした。

###cuDNNもバージョンを揃えないとダメか？

前例があるので、cuDNNも7.1でなくて7.0系を試す事にする。

https://developer.nvidia.com/rdp/form/cudnn-download-survey

ログインして、「Software License Agreement」にチェックすると選択肢が現れるが、その中でも枠外に出てくる「Archived cuDNN Releases」を選択。

「Download cuDNN v7.0.5 [Dec5, 2017], for CCUDA 9.0」
から
「cuDNN v7.0.5 Library for Windows10」選んで下記を落としてくる。

```
cudnn-9.0-windows10-x64-7.zip
```

展開すると「cuda」フォルダ下に、「bin」「include」「lib/x64」フォルダが現れるので、中のファイル(dll)を

```
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\
```

の該当するフォルダにコピーする。

今度こそ。最後まで行きました。

```
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
```

# 余裕があったら、修正加筆して別に掲載します。
Xcodeでビルドしようとしたら "This app could not be installed at this time."  というエラーが出て失敗する状態からの脱出

環境：
Mac OS High Sierra 10.13.3（17D47）
Xcode Version 9.4 (9F1027a)

エミュレータでビルドしたところ以下のようなエラーで失敗する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52847/00e792dc-d78a-8599-ab2e-fd57c5b79877.png)


https://stackoverflow.com/questions/47760643/xcode-this-app-could-not-be-installed-at-this-time
を参考に、

```
cd ~/Library/Logs/CoreSimulator/
vi CoreSimulator.log
```

を見ると

```
Framework did not have a CFBundleIdentifier in its Info.plist
```

というエラーが出ていた。

以下記事を参考に
https://qiita.com/morimorim/items/7d0817d2420c3fe8d5a3
https://stackoverflow.com/questions/37601925/framework-did-not-have-a-cfbundleidentifier-in-its-info-plist


```
altを押しながらproduct > clean build Folder
```

をするとエラーがなくなりビルド成功。めでたしめでたし。
Django Girls TutorialでDjango2.0以降を使ったurlの設定方法


「PythonでWebアプリケーションが作りたい」と思い、Djangoを勉強することに。公式チュートリアルが自分には難しかったので、いくつかの記事でオススメされているdjango girls tutorialに取り組んでみました。

説明が丁寧で、１つ１つの課題が細かく設定されているなど、確かに初心者には最適だと思ったのですが、チュートリアルのDjangoのバージョンが1.11で、個人的に突っかかったポイントがあったのでメモに残しておきます。

<h1>Pathを使ったURLの設定</h1>
特に混乱したのがwebサイト全体のURLを書いたurls.pyのここ。



<img width="490" alt="スクリーンショット 2018-07-06 13.56.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/250928/7616b4fe-1b84-1e69-b1b4-2632edfd77dd.png">
これをそのまま打ち込んで、runserverするとエラーが出て動かない。
これは、Django2.0以降は、url()ではなくて、path()でURLを設定することになったからみたい。

いろいろ検索して試したところ、こうすると動く。

```python

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
]
```

~~どうして引数にinclude()を使っているのだろうとか、仕組みの理解は怪しいですが、とりあえず動いたので嬉しい。~~
include()で、作っているアプリ（この場合はblog）のurls.pyを引っ張ってきて、path()に渡しているということだろうか。
admin.site.urlsの方をincludeしないのは、adminをimportしているからみたい。

このチュートリアル、日本語も英語もコメントが可愛くて面白かったです。


<h6>参考記事</h6>
Django Girls Tutorial[https://legacy.gitbook.com/book/djangogirlsjapan/workshop_tutorialjp/details]
Django 2.0の変更点について[https://qiita.com/massa142/items/15c130169d3bfc4a9996]
Django2.0以降の変更点で気づいたポイント:引数つきのpath設定[https://qiita.com/k_mawa82/items/b8cbc960415e975da925#%E6%9C%AC%E7%B7%A8]
Django 2.0 url() to path() cheatsheet[https://consideratecode.com/2018/05/02/django-2-0-url-to-path-cheatsheet/]
GASを使ってTypeForm上にアップロードされた画像を取得する件

Typeformのセキュリティ強化とそれに伴うGASの改修を記念して

# 前提
[ピティナ](https://compe.piano.or.jp/event/final/news.html?_ga=2.137008880.1153340614.1530490118-1304715073.1522724651) では一部のお申込みを [Typeform](https://www.typeform.com/) で作っています。

Typeform は直感的な操作でアンケートや簡易的な申込フォームを作れるのが特徴で
一番のお気に入りは、画像アップロード機能とLogicJumpです。

LogicJumpっていうのは要するに if文 を書ける機能で、
回答に応じて表示する質問を変えることができる機能です。

類似のサービスはいろいろありますが、if文 を書けるのはありがたいです。

### とりあえず触ってみたい？
公式のサポートセンターが、問い合わせフォームを Typeformで作っているので、
雰囲気を知りたい方はこちら。
[ こんな画面 ]
![Submit Ticket  EN .png](https://qiita-image-store.s3.amazonaws.com/0/16382/d9ad77ef-4716-bc6e-7175-4413b4902a27.png)
※最後に submit しなければ、送信されることもないので安心。

# GoogleSheetとの連携
そんな素敵サービスなのですが、アップロードされた画像をダウンロードするには、
Result画面からダウンロードボタンを押さないといけない。
っていうのが、こまったポイントでした。

[ Resule画面イメージ ]
![Results.png](https://qiita-image-store.s3.amazonaws.com/0/16382/914eb420-c479-e608-bfe2-09547efcb9e8.png)

正直なところ Typeform の管理画面はびっくりするくらい遅いです。[阿部寛さんのサイト](https://qiita.com/Morix1500/items/0eac072a027d478a6b83)10年分くらいかかります。
1000レコード分、一つ一つダウンロードしていたら年が明けます。

そこでスプレッドシートにデータ連携して、取得したURLからダウンロードをします。

## データ連携方法
連携方法は２種類です。

### Typeform の integrate機能
Result画面にある「integrate」リンクを開くと、各種連携サービスが出てきます。

![integration.png](https://qiita-image-store.s3.amazonaws.com/0/16382/0d1cfca2-071e-8893-2b47-c27354616a1e.png)
MailChimp とかもありますね。

赤枠で囲った部分がGoogleSheetsとの連携ですが、新しくファイルを作るか、既存ファイルを利用するか選べます。

フォームの全項目（全カラム）分をGoogleSheetに連携してくれて、新しく申込が来るたびにレコードが追加されていきます。

### Zapierなど
基本的には、上記の integrate で事足りると思うのですが、integrate ができる前からZapier で連携しているので
そのまま利用しています。

あえて必要性を語るなら、下記のようなケースには Zapier 等の連携サービスが必要になります。

* 複数のフォームを持っている
* 各フォームで項目は完全に一致していない
* GoogleSheetに連携した際、同じ項目は同じ列に欲しい

３点目は下記の画像ダウンロードの部分に係る部分ですが、
１つのGASで複数のGoogleSheetを扱う場合にはあり得るかと思います。


## 画像のダウンロード
### 昨年までは・・・
さて、GoogleSheetへの連携まで出来たら、今度は画像のダウンロードがしたいのですが、
実は、昨年までは取得したURLを叩けば（誰でも）画像がダウンロードできました:stuck_out_tongue:

[ ダウンロードURL ]
` https://admin.typeform.com/form/results/file/download/{HOGEHOGE}/{FUGAFUGA}/{PICTURE} `
※今はアクセスしても、ログイン画面が表示されるだけです。

呆然とする穴っぷり（なので、Qiitaにも書けずにいました）だったのですが、
さすがに気づいたらしく、現在はAPIキーなどが必要になりました。


### 2018年7月現在の仕様
セキュリティが強化されたのはユーザとして喜ばしい限りなのですが、

* ユーザが画像アップロード ～ 特定のフォルダに、特定のファイル名で保存

を自動化できたのが、TypeFormを使う最大のメリットだったので、自動ダウンロードできなくなると結構なダメージです。

そこで、[サポート](https://twitter.com/typeformhelp)に問い合わせたり、[APIリファレンス](https://developer.typeform.com/responses/)を見たり、ひたすらResponseを取得してみた結果
取得できるURLが分かりました。

[ ダウンロードURL ]
`https://api.typeform.com/v0/form/{form_id}/fields/{fields_id}/blob/{PICTURE_NAME}?key={API_KEY}`

※ v0 っていうのが不安なんですが。v1 のAPIあるし・・・。
※ いつまでダウンロードできるかは不明です。

form_id, fields_id について、またAPI_KEYの取得方法は[ドキュメント](https://developer.typeform.com/get-started/)にありますので、必要なかたはご参照ください。


ダウンロードできなくて困っている方の参考になれば幸いです。
rails _version_ new がうまくいかないときの対策

# 問題

例えばこういう感じで複数のバージョンがある場合

```bash
 gem list rails

*** LOCAL GEMS ***
rails (5.1.4, 5.1.2, 4.2.6, 4.1.16)
```

よく見るバージョンの指定方法として

```bash
rails _4.2.6_ new your_app_name
```

とかあるが、生成された中身を見てみると意外とインストールされている最新バージョン（上の例で5.1.4）で`app`が出来てしまっている事がある。

# 解決策

```bash
bundle init
```

で、まず `Gemfile` を作る。出来た `Gemfile` に以下のようにrailsを指定してやる。


```ruby
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails", "4.2.6"
```

この `Gemfile` がある同じディレクトリで

```bash
bundle exec rails new your_app_name
```

とすると、アンダースコアのバージョン指定をせずに`Gemfile`指定のバージョンで生成が出来る。
WSL上でDocker Engineが動くようになっていたっぽいという話

# 経緯
『
太古の昔より人々はWSLでDockerを動かそうとしてきた。
しかしながら、様々な理由からDocker for WindowsやVirtualBoxを頼らざるを得ない状況が続いていた…
』


みたいな認識。
実際ググるとそういうアプローチの記事がよく引っかかる。
[WSL(Bash on Windows)でDockerを使用する - Qiita](https://qiita.com/yoichiwo7/items/0b2aaa3a8c26ce8e87fe)
[WSLでDockerを使う - Qiita](https://qiita.com/tkyonezu/items/f89fe109ee764912bc8f)


Docker Engineが動かない理由はcgroupだったりSocketだったり様々な要因が絡んでいるのだろうと思っていたし、いつかWSLのアップデートによって解消される問題なのだろうと想像されていた。しかしなかなか解消されなかった。
そんな私もWindows 10の大型アップデートの度に期待をし、失望するというルーチンを繰り返してきた。


しかし、先日こんなツイートを見かけた。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">は？いつの間にかdockerがWSLネイティブで動くようになってるやんけ <a href="https://t.co/bSr0j9Ja0g">pic.twitter.com/bSr0j9Ja0g</a></p>&mdash; あると (@twinkfrag) <a href="https://twitter.com/twinkfrag/status/1001027541790932993?ref_src=twsrc%5Etfw">2018年5月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

**まじかよ**
そんなメモ。

# ネタ元
詳しく流れを知りたい人は、下記redditを参照。
ぶっちゃけ「WSLを管理者権限で動作させる」ってのと「Microsoft Store版のUbuntuを使う」って所を抑えておけば、サクッと動かせると思う。本メモはこれの抜粋。
https://www.reddit.com/r/bashonubuntuonwindows/comments/8cvr27/docker_is_running_natively_on_wsl/


# 検証環境
- Windows 10 Pro(1803)
- Ubuntu 16.04 in WSL(ストア版)(後述するけど非ストア版ではなぜか動かなかった)


# 下準備
## Microsoft StoreからUbuntuを入れる
そもそもWSLを動かせない人はその準備を

## 管理者権限で動いているWSLからDockerをインストール
管理者権限(ココ重要)で動かしているWSLからDockerをインストール。

```
sudo apt update
sudo apt upgrade
sudo apt install docker.io
sudo cgroupfs-mount
sudo usermod -aG docker $USER
sudo service docker start
```

# hello-worldしてみる
```
sudo docker run hello-world
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/133666/d9b4caee-abad-5f58-1582-d732cd17fa8a.png)

すごい！！！ほんとに動いた！！！


## ということで…
ホントにDocker EngineがWSLで動きました！


# 踏みそうな所
何故かStoreから入れたUbuntuじゃないと動かなかった。
( `lxrun /install` で入れたいわゆる `Legacy` ってやつでは動かない )

「動かないなー」って時は、どのディストリビューションが標準設定になっているのかを調べてみると良さそう。
[WSLのディストリビューションの切り替えに関するメモ - Qiita](https://qiita.com/yanoshi/items/802e586f5f939081b08a)


# 所感
最高かよ。
cakephp2でテーブルのエイリアス名を予約語にした際、findがエラーになる

findのconditionsにて独自queryを使用した際、テーブルのエイリアス名に予約語を使用したらエラーになった。

サンプルコード以下に示す。

###テストコード
```php:test.php
$option = array('conditions' => 'Customer.id IN(select Customer.id from customers as Customer INNER JOIN orders as `order` on Customer.id = order.customer_id)');

$test = $Customer->find('count', $option);
```

###結果
```
Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order ON `Customer`.`id` = `Order`.`customer_id` '
```





因みに、サブクエリ部分をquery()で実行すると問題なく処理が通る。
```
$this->query(select Customer.id from customers as Customer INNER JOIN orders as `order` on Customer.id = order.customer_id);
```

###原因
findのconditionsに設定したものは自動的に識別子を付与してくれるらしく、その際に一旦全ての識別子を除外するらしい。


###結論
その設定を無効化することもできるが、現実として難しいため素直にエイリアス名を変更したほうがよいだろう。
Rails(Docker)でwebpackがインストールできない

## はじめに
webpackを導入する際、検索するときに`docker`を含めて検索し忘れた方向けの記事です。なぜなら、`docker rails webpack`と検索すれば丁寧な記事が見つかるから！
そうしなかった私が、webpackの導入に悩んだ内容をメモとして残します。

## 邪道
Rails環境はできていて、Vue.jsをwebpackを使おうと思って、導入方法の記事を参考に以下の手順で行いました。
①yarnのインストール

```bash
$ brew install yarn
```
yarnのインストールだけで1時間以上かかりました。。
②webpackのインストール

```bash
$ docker-compose run web rails webpacker:install
Webpacker requires Node.js >= 6.0.0 and you are using 4.8.2
```

はい。Node.jsのバージョンが違うらしい。apt-getも使えないので詰みました。

## 正攻法

Dockerfileに追記するだけ。

```bash:Dockerfile
.
.
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
########################################################################
# yarnパッケージ管理ツールをインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y yarn
# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - && \
apt-get install nodejs
########################################################################
WORKDIR /tmp
.
.
```


```bash
$ docker-compose run web bundle exec rails webpacker:install
Starting hoge_db_1 ... done
RAILS_ENV=development environment is not defined in config/webpacker.yml, falling back to production environment
      create  config/webpacker.yml
Copying webpack core config
      create  config/webpack
      create  config/webpack/development.js
      create  config/webpack/environment.js
      create  config/webpack/production.js
      create  config/webpack/test.js
.
.
Webpacker successfully installed 🎉 🍰
```

問題なくインストールできました。
VSCode上で、Python3.7の時、pylintで1行目に出たエラーと解決法

#VSCode上で、Python3.7の時、pylintで1行目に出たエラー

Python3.7にして、VSCodeで、コード書いていたら、
なにも間違ったこと書いていないのに、１行目にエラーが！
絶対間違ったこと書いてないのに、、、
だって

```
import sys
import os
```
しか書いてないし。

## 出てきたエラー

```
[pylint] F0002:<class 'RuntimeError'>: generator raised StopIteration (1,1)
```
え？Iteratorなんて回してないし。。。

## 調査

とりあえず、VSCodeの設定が悪いのかどうかを切り離したかったので、
コンソール開いて、pylintしてみた。

```
Traceback (most recent call last):
  File "/Users/takashi/Dev/env/lib/python3.7/site-packages/astroid/decorators.py", line 89, in wrapped
    res = next(generator)
StopIteration

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/takashi/Dev/env/lib/python3.7/site-packages/astroid/decorators.py", line 104, in wrapped
    raise StopIteration
StopIteration

The above exception was the direct cause of the following exception:

~ 省略 ~
```
お？こっちでも失敗。
問題は、python3.7のastroid/decorators.pyで発生してるっぽい。

## 解決法

### コンソールからのpylintのエラー解消
調べてみたら、[これ](https://github.com/PyCQA/pylint/issues/2234)が。
おぉまさしくこれっぽいということで、書いてある通り、
`pip install pylint astroid --pre -U`
したら、コンソールからのpylintではエラーが解消された。

### VSCode上でのpylintのエラー解消
ただしまだ、VSCode上では、同じエラーが出ていた。
そこでよくよく考えたら、
virtualenv使ってenv環境でやってるのに、VSCodeでのPythonの設定ってそのままでいいのか？
と思い確認。
`"python.linting.pylintPath"`という項目の設定を、
`"pylint"`から`"env/bin/pylint"`に変更してみたら、
エラーが解消された。
AWS（Bitnami）上のRedmineとGitHubを連携させる

ネットを検索するとGithubとの連携方法も色々と載っておりますが、Redmineのオフィシャルwikiに従い連携を行います。

参考
http://www.redmine.org/projects/redmine/wiki/JaRedmineRepositories

## SSHでEC2に接続
```
ssh -i ~/.ssh/秘密鍵名.pem <ユーザ名>@<IPアドレス or DNS名>
```

## Bitnami版Redmineサーバーの時間設定

EC2やLightsailにてBitnami版Redmineを選択した場合UTCとなっている為、日本時間へ変更します。

```
sudo dpkg-reconfigure tzdata
```

---

## Redmine Github Hook pluginインストール

https://github.com/koppen/redmine_github_hook

```
cd /home/bitnami/apps/redmine/htdocs/plugins/
git clone https://github.com/koppen/redmine_github_hook.git
```

### Redmine再起動

```
cd /home/bitnami/apps/redmine/tmp/
touch restart.txt
```

![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/99333/153cae1a-63ed-f097-5e27-8e170923a236.png)
![ss4.png](https://qiita-image-store.s3.amazonaws.com/0/99333/d6a8b9c3-0481-564b-cdf7-19159176c499.png)

---

## リポジトリ保存ディレクトリ作成

```
sudo mkdir /home/bitnami/apps/redmine/github_repos
sudo chown -R bitnami:daemon /home/bitnami/apps/redmine/github_repos
```

## GitHubへのSSH公開鍵の登録

```
cd ~/.ssh
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub
```

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/99333/c047b5c2-6eda-3985-f28e-fa6855591e5b.png)
![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/99333/85360798-6679-1d92-df09-f8493fc82ff9.png)

### Passenger実行ユーザー（daemon）からGithubへSSH接続をさせる為に秘密鍵のコピー

```
cd /usr/sbin
sudo mkdir .ssh
sudo cp ~/.ssh/id_rsa* .ssh
sudo chown -R daemon .ssh
```

## リポジトリのクローン

```
sudo -u daemon /bin/bash
cd /home/bitnami/apps/redmine/github_repos
git clone --bare git@github.com:<user_name>/<project_id>.git
```

## Redmineのリポジトリ設定

![ss5.png](https://qiita-image-store.s3.amazonaws.com/0/99333/1237c38a-3fcf-baad-2f91-4bda2ce89048.png)

## GitHubのwebhook連携設定

push時にリポジトリのfechを行いRedmineのリポジトリを最新状態にします。

登録するURLは下記の形式となります。

```
http://<Redmineサーバー名>/github_hook?project_id=<プロジェクトID>
```

![ss6.png](https://qiita-image-store.s3.amazonaws.com/0/99333/839a931d-e5ea-c15d-e0e0-85888fdeabea.png)


以上で設定完了です。
Ubuntu1804のZabbixServer3.4に監視ノードを追加する。


こちらの記事のつづきです。

 [Ubuntu1804(bionic)にZabbixをインストール。](https://qiita.com/ajitama/items/bc1910d905349c4f3cf8)

ノードにエージェントを入れて監視してみる。

#### ・リポジトリを追加。

```sh
wget http://repo.zabbix.com/zabbix/3.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.4-1+bionic_all.deb

dpkg -i zabbix-release_3.4-1+bionic_all.deb
```


```shell
# apt search zabbix-agent

zabbix-agent/unknown 1:3.4.11-1+bionic amd64
  Zabbix network monitoring solution - agent
```

新しいものがaptで見つかるようになりました。

#### ・エージェントインストール

```
apt install zabbix-agent
```

設定してみる。
設定ファイルは以下。
`vim /etc/zabbix/zabbix_agentd.conf`

サーバのIPを指定します。
97行目：Server=10.71.233.55
138行目：ServerActive=10.71.233.55

ローカルホストの名前を記載。
149行目：Hostname=zabclient-1

#### サーバ側設定
Configration　-> hosts


「Create Host」を選択
「Hostname」にはホスト名を。
「Visible name」に管理画面用の名前をいれました。同じでいいでしょ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213689/76e79460-4e27-d266-8ebf-1b20ac7695fa.png)

テンプレートの設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213689/f67b889b-47c0-a005-1edd-22e9cee692de.png)

Selectボタンを押す。
Template OS Linuxを選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213689/8a161d80-b0d8-9f78-85b8-000afe8edfd3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213689/fc2ae129-c4bb-2074-754b-2f2cd2952529.png)
Addをクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213689/f8f256b1-f157-b118-54f9-62f9ecbb848f.png)
Updateを押すと追加されました。



エラーが無ければちゃんとAvailabilityが光ってくれるみたいです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213689/913c3e09-59ec-0977-97dc-6cb01e636b7d.png)

テンプレート（監視項目）はデフォルトですが、自分に合わせて作ってみたいと思います。
ROS2やってみた [Ament Tutorial編]

[前回の記事](https://qiita.com/KN_Apple/items/ac649b1d2912b2d36249)でROS2の環境構築を行いました。
今回は予告通り、公式のチュートリアルを見ていこうと思います。
指摘等あればお願いします。

#その前に
前回の環境構築は[こちら](https://github.com/ros2/ros2/wiki/Linux-Install-Debians)を参考に行いました。
しかし、この方法ではデモの実行ファイルだけがインストールされてしまい、ソースコードを見るためには、[ソースコードからビルド](https://github.com/ros2/ros2/wiki/Linux-Development-Setup)したROS2環境が必要だったので環境構築をやり直しました。

以下は[Building ROS2 on Linux](https://github.com/ros2/ros2/wiki/Linux-Development-Setup)の「How to setup the development environment?」まで出来た人向けの記事となります。

#ROS2のデモを動かす準備
ROSでもお馴染みのワークスペースを作っていきます。

```
$ mkdir -p ~/ros2_ws/src
```

ここではsrcの親ディレクトリ、つまりros2_wsが名前通りワークスペースとなります。
次に、githubからros2.reposというファイルを落とします。

```
$ wget https://raw.githubusercontent.com/ros2/ros2/master/ros2.repos
```
このファイルの中身を少し読んでみると、repositoriesという文字や、git、urlなどが書かれていることがわかります。
これはgitから落とす内容をまとめたもので、以下のコマンドで、まとめてダウンロードできます。

```
$ vcs import ~/ros2_ws/src < ros2.repos
```

##ビルドして実行

ビルドコマンドは以下

```
$ src/ament/ament_tools/scripts/ament.py build --build-tests --symlink-install
```

ビルドでエラーがなければ準備が出来たので、実行してみましょう。

端末を立ち上げ、以下を順に入力

```
$ cd ~/ros2_ws/
$ . install/local_setup.bash
$ ros2 run demo_nodes_cpp listener
```
もうひとつ端末を立ち上げ、以下を入力

```
$ cd ~/ros2_ws/
$ . install/local_setup.bash
$ ros2 run demo_nodes_cpp talker
```
![Screenshot at 2018-07-06 13:19:00.png](https://qiita-image-store.s3.amazonaws.com/0/263384/5d057425-1d99-bdf4-c4b6-5ce61f29d53d.png)

上のような表示が確認できれば成功です。

#終わりに
今回実行したdemo_nodes_cppのパッケージは```~/ros2_ws/src/ros2/demos/```にあります。良かったら読んでみてください。
Excel for Mac（15.31）のCSV保存方法は二種類ある！

株式会社オークファンの佐藤です。
どういうわけか社内エンジニアのHHKB率が増えてきた、今日このごろです。

## CSVのエクスポートで困る
Excel for Macのxlsxシートを「名前をつけて保存」すると出力されるCSVが、なぜかBOMつきUTF-8、改行コードもCRになってしまいます。
他の人は普通にCR+LFで出力できるのになぜ？と思って、エクスポート時の文字コード・改行コードを調べてみたところ、ExcelからのCSV保存方法は二種類あることが判明しました！

## 保存オプション

この中に「CSV」が二種類あるのにお気づきでしょうか？　

![excel-expoprt.png](https://qiita-image-store.s3.amazonaws.com/0/9384/29a8f5dd-3d68-b851-d1fa-a9df1de3796c.png)

ダイアログ|文字コード|改行コード
---|---|---|---
CSV UTF-8(カンマ区切り) (.csv) |UTF-8 (with BOM) |CR
CSV(コンマ区切り) (.csv) |特に指定なし？|CRLF

Excel for Macのバージョンによっては、「UTF-8」の項目がない場合もあるようです。

CSVをExcelを開くと文字化けする問題に対応するために、UTF-8のエクスポートをつけたのでしょう。
「CSV」という文字だけで選ぶと、つい上にあるUTF-8にしてしまいますが、よりにもよって**BOMあり**なので、先頭行を読み込む際にシステムのエラーチェックに引っかかることがあります。

（´-`）.｡oO（あと、コンマとカンマが並んでいるのが気になりますね……）

## 文字コードを確認するコマンド
生成されたファイルの形式は、コマンドで確認できます。

```csv.sh
# 「CSV UTF-8(カンマ区切り)」 = BOMを入れるため、間違いなくUTF-8として解釈
$ find bom.csv | xargs file
./bom.csv: UTF-8 Unicode (with BOM) text, with no line terminators

# 「CSV(コンマ区切り)」 = BOMを入れないため、内容で文字コード解釈される
# ASCII文字しか入っていない場合
$ find bills.csv | xargs file
./bills.csv: ASCII text, with CRLF line terminators

# ASCII文字以外が入っている場合
$ find japanese.csv | xargs file
./japanese.csv: Non-ISO extended-ASCII text, with no line terminators
```

Excelから出力するCSVを使うときには、気にしておくといいと思います。

## まとめ
（´-`）.｡oO（手順書に記載する際は気をつけてください……）
Xserver に Matomo(Piwik) をインストールする

## 公式サイト
Matomo(Piwik) のクイックインストール
https://matomo.jp/tech/forpj/695


## ダウンロード

最初にMatomo(Piwik)のサイト http://piwik.org/latest.zip から最新版のMatomo(Piwik)をダウンロードします。


## インストール手順

アップロード、解凍してサーバーのディレクトリにアクセスします。

（１）システムチェック
（２）DB接続設定
（３）ユーザー登録
の順に行います。

（１）システムチェック
以下のエラーとなりました。
環境はXserver、PHP5.6です。

>いくつかの重大な問題を防ぐためには、php.ini ファイルで以下を設定する必要があります: always_populate_raw_post_data=-1　

![phperror.JPG](https://qiita-image-store.s3.amazonaws.com/0/255878/8eea000b-0e27-965e-8f4b-a28d8ef259ea.jpeg)


php.iniを変える方法もあったと思いますが、他のシステムも稼働しているので、
Xserverで別ドメインのディレクトリを作成し、PHP7.0にすることでエラーが解消しました。

（２）DB接続設定
ホスト名、ユーザー名、パスワード、データベース名を
間違えなければ大丈夫だと思います。
データベース名が最後なので間違えないように注意しましょう（間違えました）。

（３）ユーザー登録
特に問題ないと思います。


## インストール完了

おめでとうございます
![おめでとう.JPG](https://qiita-image-store.s3.amazonaws.com/0/255878/e042b0f5-7ccb-b0ed-7237-6948711ed253.jpeg)
Git MEMO

### コンフリクトしたファイルだけを表示する

```
$ git diff --name-only --diff-filter=U
```

### ブランチの所有者と更新日時を確認する

```
git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n
```

### ignore しているファイルを表示する

```
$ git status --ignored
```
Rails4からRails5へのテストケースでキーワード引数を機械的に一括変換する。

# Rails5からテストケースにてHTTP methodsで利用する場合、キーワード引数が必須になった。
https://github.com/rails/rails/pull/18323

### before

```ruby
post url, hoge: 'foo'
```

### after
```ruby
post url, params: { hoge: 'foo' }
```

Rails4からRails5へ以降する際に、既存のspecファイルが大量にある場合、手動で行うとなかなか以降がスムーズに行きづらいです。

# 機械的に一括変換をする。

機械的に一括変換をするgemがあります。

https://github.com/tjgrathwell/rails5-spec-converter

```ruby:spec/controller/test_controller.rb
  get :index
      search: 'bayleef',
      format: :json
```

```ruby:Gemfile
+ gem 'rails5-spec-converter'
```

```bash
$ bundle install --path vendor/bundle
$ bundle exec rails5-spec-converter
```

```ruby:spec/controller/test_controller.rb
  get :index
      params: {
        search: 'bayleef'
      },
      format: :json
```
onブラウザでphpのプログラムシミュレーションができるサイト

「phpの簡単な動作チェックをしたい」
こんなシチュエーションありませんか？
私はあります。

皆さんもありますよね？

環境構築は必要なっし。
ブラウザがあればOK

下記のサイトでシミュレーションができます。
http://codepad.org/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/4d9d7f17-e463-2ee8-c475-c08c06aeca76.png)

上図のキャプチャを見るとわかりますが、様々な言語のシミュレーションが可能。
・C
・C++
・D
・Haskell
・Lua
・OCaml
・PHP
・Perl
・Plain Text
・Python
・Ruby
・Scheme
・Tcl

使い方は簡単です。
１．言語選択。
２．コードを記入。
３．「submit」ボタンクリック。
４．下図のように結果が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/ca1bce72-43dc-e0ab-09df-3bf468743c01.png)


おまけ
phpinfo()も通ったので（いいのかな(;^_^A）phpのバージョンを共有します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/27a7be55-0e0c-3723-23d1-856986e3f501.png)



最後に
用途としては簡単な動作確認をする際に使用したほうがよさそうです。
[MySQL 8] DATETIME型の昨日<DATE型の今日<DATETIME型の今日

# 困った
JSON型に突っ込んだDATE型形式のデータと、クエリで突っ込んだDATETIME型のデータを比較したらドツボにはまりました。

# 結論
```sql:MySQL
> select "2018-07-01" > "2018-06-30 23:59:59.999999";
→true

> select "2018-07-01" = "2018-07-01 00:00:00.000000";
→false

> select "2018-07-01" < "2018-07-01 00:00:00.000000";
→true
```

**DATETIME型の昨日<DATE型の今日<DATETIME型の今日ってなってる！！**

DATE型→DATETIME型変換って`00:00:00`付与じゃないの！？
DATETIME型→DATE型変換ってミリ秒を四捨五入して日付を取得するんじゃないの！？

参考:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-type-conversion.html

>11.3.7 Conversion Between Date and Time Types
To some extent, you can convert a value from one temporal type to another. However, there may be some alteration of the value or loss of information. In all cases, conversion between temporal types is subject to the range of valid values for the resulting type. For example, although DATE, DATETIME, and TIMESTAMP values all can be specified using the same set of formats, the types do not all have the same range of values. TIMESTAMP values cannot be earlier than 1970 UTC or later than '2038-01-19 03:14:07' UTC. This means that a date such as '1968-01-01', while valid as a DATE or DATETIME value, is not valid as a TIMESTAMP value and is converted to 0.

>Conversion of DATE values:

>- Conversion to a DATETIME or TIMESTAMP value adds a time part of '00:00:00' because the DATE value contains no time information.

>- Conversion to a TIME value is not useful; the result is '00:00:00'.

>Conversion of DATETIME and TIMESTAMP values:

>- Conversion to a DATE value takes fractional seconds into account and rounds the time part. For example, '1999-12-31 23:59:59.499' becomes '1999-12-31', whereas '1999-12-31 23:59:59.500' becomes '2000-01-01'.

>- Conversion to a TIME value discards the date part because the TIME type contains no date information.

# 最後に
これって常識？？
terminalで使うtodoをコマンドだけで作ってみた

## はじめに

terminalで使うtodoが欲しかったので作ってみた。

あまりリッチな機能はいらないのでファイルを使ったTODOとする。
あと自分がzshを使ってるのでzshじゃないと動かないかも。

ちなみに自分はwindowsの場合はcygwinを使ってます。

## 機能

### TODOの表示

`tl` でTODOを表示します。


<img width="267" alt="スクリーンショット 2018-07-04 12.25.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/14914/dd3fde47-3759-79e7-d1d0-988e5a893710.png">


### TODOの追加

`ta` でTODOを入力します。

仕組みとしてはホームディレクトリに `.todo` というファイルを作成してるだけです。

TODO入力するとTODOの末尾に追加されて一覧が表示されます。

<img width="210" alt="スクリーンショット 2018-07-06 12.02.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/14914/cdc74944-b044-ef81-0894-58bb705bf8fc.png">

### TODOの完了（削除）

`td` エンター後に対象TODOの選択（インクリメンタルサーチ可）になるので選択して実行。

対象が完了（削除）されて一覧が表示されます。

<img width="248" alt="スクリーンショット 2018-07-04 12.28.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/14914/27a99b0f-26f0-e203-114c-9c2f55d6af3e.png">

<img width="303" alt="スクリーンショット 2018-07-04 12.27.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/14914/d9b87717-5587-3060-705c-e44637173507.png">

<img width="266" alt="スクリーンショット 2018-07-04 12.27.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/14914/24615997-8469-126e-06e4-138198e6bb2f.png">

ちなみに私はmacでは `peco` windowsでは `percol` を使っているのでwindowsの場合は以下のエイリアスを設定してます。

```.zshrc
peco=percol
```
また `peco` とか使わないよという場合は `remove-todo-by-no` という関数を作成してあるので `alias` を変更すれば番号指定で削除できるようになります。

完了したTODOは一応、 ホームディレクトリの `todo_history` というファイルの追加しています。

### 完了したTODOの表示

`tcl` で完了したTODOが表示されます。
完了時に日時を追加しているので完了日時とTODOの内容が表示されます。

<img width="258" alt="スクリーンショット 2018-07-06 11.28.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/14914/e60500de-e420-a87f-3c00-175650bcfd4b.png">

### TODOの変更

`te` でTODOをvimで開くようになってます。
vimで普通に編集して保存してください。

### 作ってみて

あまりshellを書く機会がないので面白かった。
↑詳しい人には無駄な処理があると突っ込まれそう。。
最初に `tl` 打つとファイルがないエラーでるしｗ
今回使用した `nl` コマンドとかしらなかったし。

まぁ自分的にはこれくらいシンプルなのが使いやすくて良いかなっと。

作成したものはgistにUPしておいたので使いたい方いれば自由に使ってください。

https://gist.github.com/astrsk-hori/6d034a36851569a40b54118ccb9bf9a9
RxSwiftで一つ前の値と現在の値を両方Subscribeする方法

Observable.zipを用いて、`初期値を与え１つ目の値が流れてきたときにSubscribeする方法`と`初期値を与えずに２つ目の値が流れたときにSubscribeする方法`があります。

## 初期値を与える場合
```swift
extension ObservableType {
    func preSubscribe(startWith e: Self.E,
                      onNext: (((Self.E, Self.E)) -> Void)? = nil,
                      onError: ((Error) -> Void)? = nil,
                      onCompleted: (() -> Void)? = nil,
                      onDisposed: (() -> Void)? = nil) -> Disposable {
        return Observable.zip(self.startWith(e), self)
            .subscribe(onNext: onNext, onError: onError, onCompleted: onCompleted, onDisposed: onDisposed)
    }
}
```

## 初期値を与えない場合
```swift
extension ObservableType {
    func preSubscribe(onNext: (((Self.E, Self.E)) -> Void)? = nil,
                      onError: ((Error) -> Void)? = nil,
                      onCompleted: (() -> Void)? = nil,
                      onDisposed: (() -> Void)? = nil) -> Disposable {
        return Observable.zip(self, self.skip(1))
            .subscribe(onNext: onNext, onError: onError, onCompleted: onCompleted, onDisposed: onDisposed)
    }
}
```

## 使い方
```swift
let sequence = Observable.of(1, 2, 3)

sequence
    .preSubscribe(startWith: 0, onNext: { n0, n1 in
        print(n0, n1)
    })
    .disposed(by: disposeBag)

// (0, 1), (1, 2), (2, 3)

sequence
    .preSubscribe(onNext: { n0, n1 in
        print(n0, n1)
    })
    .disposed(by: disposeBag)

// (1, 2), (2, 3)
```
Google Could Vision API

## What is Cloud Vision API?
Cloud vision API provides powerful image analytics capabilities as easy to use APIs. It enable application developers to build the next generation of application that can see and understand the content within the image. It quickly classifies image into thousand of categories (eg: apple, lion, pencil ....). The service enable the customer to build metadata on their image catalog, moderate offensive content, or enable new marketing scenarios though image sentiment analysis. 
## The Cloud Vision API Features
1. <b>Label Detection :</b> Detect broad set of categories within an images, ranging from modes of transportation to animals.
<img width="1145" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/211892/4d4dd97c-eff0-f9bf-b2a8-1b35aa7a1881.png">

2. <b>FaceDetection and Landmark Detection :</b> Detect multiple face within the images, along with the associated key facial attributes like emotional state or wearing headwear. <b>Facial Recognition is not supported.</b>
<img width="892" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/211892/d3fd9dd0-f7e9-32f2-5aa9-99874b7c29c7.png">
3. <b>Explicit Content Detection :</b> detect explicit content like adult content or violence content within the image.
<img width="880" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/211892/9d20d41c-9b26-4a23-a998-80c86e15759c.png">
4. <b>Image Attributes :</b> Detect general attributes of the image, such as dominant, colors and appropriate crop hints.
<img width="877" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/211892/da77882f-f7b3-dfff-bc70-594c17d4c72e.png">
5. <b>Logo Detection :</b> Detect popular product logo within the image.
<img width="447" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/211892/c0e7cf97-0ab5-fbff-7a0d-e966c777464d.png">
6. <b>Web Detection :</b> Search on the internet for the similar image.
<img width="876" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/211892/16caddc8-0bc3-4c7d-190f-aecb7314fa8e.png">
7. <b>Integrated REST API :</b> Access via REST API to request one or more annotation type per image. Images can be uploaded in the request or integrated with <a href="https://cloud.google.com/storage/">Google Cloud Storage</a>
8. <b>Optical Character Recognition :</b> Detect and extract text within an image with support for broad range of languages, along with support for automatic language identification.

## References
* <a href="https://cloud.google.com/vision/docs/"><b>Google Cloud Vision Documentation</b></a>
* <a href="https://cloud.google.com/vision/"><b>Google Cloud Vision API</b></a>
IoTにおけるアンテナ設計

様々なIoT向け無線システムが普及してきているなか、誰でも簡単にIoT向けデバイスを開発できるような環境になってきましたが、アンテナ設計は重要です。
まず、ある一例を見てみましょう。
#アンテナ設計による受信レベルの違い
2つのデバイス（通信モジュールの出力は同じです）のSigfox受信レベルを見てみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/d14815f3-2377-ae74-4ea4-6eb168b2e17d.png)
左（GOOD）は正常なデバイス、右（BAD）はアンテナ設計がよろしくないデバイスです。全体的に20dB程度の差が出てしまっています。
これは、極端な例ですが、アンテナ設計を間違えることにより、10dB以上のロスが出てしまうことはあります。

#基板とアンテナ位置による違い
下の絵は、某アンテナメーカー（日本アンテナ）さんの資料です。アンテナメーカー仕様としては、最大利得 +1.8dBiというアンテナですが、基板とアンテナ設置位置やRF回路とアンテナの接続方法によっては、実際の利得が大きく異なります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/b49ba4b6-8370-918a-f146-02e11f1af098.png)
この絵の中で、VSWRという値がでています。このVSWRというのは、Voltage Standing Wave Ratio（電力定在波比）と呼ばれるもので、高周波が伝送していくときの進行波と反射波の関係を表したものです。
アンテナについても、このVSWRは重要で、この値が低くなるように設計します。逆に、このVSWRが高くなってしまうと空中に放射される電力が小さくなってしまいます。

下の絵は、アンテナと金属板の離隔によって、VSWRがどうなるかというイメージ図です。（実試験結果ではありません）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/c9f723da-2346-c7cf-bc4c-798ca57637c1.png)
920MHzに対して特性をもつアンテナを使っていても、金属板による影響によってVWSRが高くなり（悪くなり）ます。

では、どうしたらいいのでしょうか？という話になると思いますが。。。
アンテナのインピーダンスマッチングを図るとか、アースをちゃんととるとか、基板、金属との関係とか、いろいろ要素がありますので、是非、アンテナメーカーさんやアンテナ回路設計を得意とされている会社さんに、設計段階で相談されるのがお薦めです。

日本アンテナさん。情報提供ありがとうございます。
[日本アンテナIoTページ](https://www.nippon-antenna.co.jp/ja/product/communication_02.html)

最後に、Sigfox社がアンテナ設計についてのコンテンツをあげていますので、ご紹介します。
https://build.sigfox.com/antennas


[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)
EC2のSSH接続でPermission denied (publickey) への対応

以下の2つを大変参考にさせていただきました。
https://qiita.com/youcune/items/2f427979403771f2e03a
https://qiita.com/katsukii/items/c3df0653ac07d41fe03f

上記に加えて、秘密鍵を登録しました。macでは常識の作業なのでしょうか。

```
ssh-add -K id_rsa
```
CentOS6.9にmozjpegをインストールする 

# CentOS6.9にmozjpegをインストールする
基本的なインストール方法は各所にありますが、どうも上手くいかないパターンが多かったので単純に個人的な備忘録です。

######適宜作業ディレクトリで作業をします。
```cd /var/tmp/```

######必要なパッケージをインストールしておきます。
```yum install nasm libtool autoconf```

######mozjpegのパッケージをダウンロードします。
```wget https://github.com/mozilla/mozjpeg/archive/v3.3.1.tar.gz```

######解凍します
```tar -zxvf v3.3.1.tar.gz```

######ソースのディレクトリに移動します。
```cd mozjpeg-3.3.1/```

######コンフィグファイルを生成します。
```autoreconf -fiv```

######ビルド用のファイルを生成します
``` ./configure ```

######ビルドします
``` make ```

######インストールします
```make install```

これで/opt/mozjpeg/の下にmozjpeg関連の物がインストールされます。

```
[root@xxxxxx mozjpeg]# pwd
/opt/mozjpeg
[root@xxxxxx mozjpeg]# ll
合計 16
drwxr-xr-x 2 root root 4096  6月 20 15:54 2018 bin
drwxr-xr-x 2 root root 4096  6月 20 15:54 2018 include
drwxr-xr-x 3 root root 4096  6月 20 15:54 2018 lib64
drwxr-xr-x 4 root root 4096  6月 20 15:54 2018 share
```

ただ、このままですとプログラムの場所が分かりづらいので、
######/usr/local/bin/にシンボリックリンクを張ります。
```ln -s /opt/mozjpeg/bin/* /usr/local/bin/```
/usr/bin/にシンボリックリンクを張ると、libjpeg-turboがインストールされている環境だと上書きをしてしまうので注意してください。

######コレでインストール完了です。
この場合のツボは
```autoremake```
を利用しているところです。
(案外そのまま./configureからインストールする紹介がありますが、動かない場合がありますのでその際にはautoremakeを試して見ると良いかもしれません)
シェルの基本 | スペース区切りのテキストはクォートしないと、複数の引数として展開されてしまうので注意

# 例

```bash
# /bin/bash

echo "arg 1 : $1"
echo "arg 2 : $2"
echo "arg 3 : $3"
```

# 実行例

```bash
$ ./example.sh 1 2 3

arg 1 : 1
arg 2 : 2
arg 3 : 3
```

```bash
$ ./example.sh "1 2 3"

arg 1 : 1 2 3
arg 2 :
arg 3 :
```

# 環境

- GNU bash, version 4.4.0(1)-release (x86_64-apple-darwin15.6.0)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Vue.jsでグローバルなフィルターを設定。

備忘録として残します。

ここ最近Vue.jsに一目ぼれの僕。
中でも、フィルターという機能に感銘を受けた。

どうやら、内部的に保持しているデータは加工したくないが、
「画面上で描画する際にはこう見せたい！」というわがままな我々の願いをかなえてくれる。

https://jsfiddle.net/msht0511/wue9rfc0/
上記サイトでシミュレートしてみました。

3桁区切りにカンマをつけて表示するというフィルターは鉄板のため、
インスタンス単位で定義するのはナンセンス。
Flutterを仕事で2ヶ月使って思ったこと

# 導入のしやすさ
 * Mac必須 開発というよりかは、iPhoneやiOS Simulatorの為
 * Flutter Doctor 便利
 * packageも楽ちん
 * 導入というか性質というか、頻繁にFlutterアップデートが来る。描画が壊れるupdateもあったが、回避方法はあったので致命的ではなかった

# Flutter
 * WYSWYGツール不在の為、UI設計が面倒とおもったけど十分高い生産性
 * hot reloadが優秀　(ソース保存即時反映）
 * Debug paintが優秀 (各コンポーネントの描画範囲等がわかる)
 * Flutterの基本コンポーネントにしろよと思ったパッケージ群、よっぽどシンプルじゃない限り必要になる　以下 pubspec.yaml dependencies:に追記するべきパッケージ
<pre>
  validate: "^1.6.0"  #email等、入力チェック
  http: "^0.11.3+16"  # APIと通信するためのもの
  sqflite: any   #SQLiteを使うもの
  path_provider: any  #iOS,Android問わず、ローカルリソースパスを取ってくるもの
  map_view: any  # google map widget
  url_launcher: "^3.0.2" #他のアプリにパスする http:// ブラウザ  tel://　電話起動等
  flutter_webview_plugin: "^0.1.6" #サファリとBrowserを一緒くたに扱えるWebView 
  share: "^0.5.2"  #他のアプリにシェア UIActivity, share compat相当
</pre>
 * 描画エリアがシビアというかサイズが足りないと、派手なエラー描画が出てできない事を教えてくれる。
 * コンポーネントによっては、描画エリアサイズがわからない場合、使えないと真っ赤なエラー画面で教えてくれるが、コンポーネントがイケてないだけではと思ったり。
 * 基本中の基本 Scaffold にbottomNavigationBarとかついているのに、タブアイテム3個しか入れらないとか、ふざけ過ぎじゃないですかね。
 * setStateや条件分岐で表示を変えるとか、慣れるのにちょっとかかるかも。
 * iOSとAndroid　ほぼほぼ互換性を保つ
 * 互換性を保てないところ
    * google map (iOS デフォはapple mapのため）packageで回避できる
    * Webview (iOS はsafari, androidは browserの為）packageで回避できる
    * splashスクリーン 本当の意味でのロード中はflutterではできない。
 * いちいち Alignment指定にClass指定をしないといけないとか、プロパティにClass要求が多いので、入れ子の入れ子の入れ子...になるのがホントクソ 
 * 生産性は素晴らしく良い。
 * Action と View分けにくすぎ。無理に分けると操作しずらくなる
 * メンテンス性を高めるには、Widgetを小分けにClass化して、再利用性を高める、ダラダラと巨大なWidgetを作らない。
 * Action相当は存在せず、Viewとロジックごっちゃに書いてる
 * 手探りでやって行ってだいたいこうなった
<pre>
model APIやsqlite用のmodel
view  画面分のファイル
widget viewが使うWidget集. 複数の画面で使ったり、単にScreenがデカイ場合も小分けする用途
util 複数箇所から使われるユーティリティ
</pre>


# Dart
 * カッコ地獄 []{} () 普段pythonを書いていたので、これ煩わしいすぎる　ダサい
 * Android Studio、IDEのカッコ補完がなければ死んでた　閉じ部分に//Scaffoldとか出てくれるのには助かる
 * ほぼほぼカッコのせいで可読性低い
 * 書きやすい、瞬発力出る　→　楽しい
 * カッコ以外はモダンな言語仕様で、概ね好感が持てる。
 * ドキュメントは日本語が無いので、英語力ない人はお断り状態