OmniAICreator/Qiita-1.07M huggingface dataset:
C++ Builder 10.2 Tokyo | XE4 > TeeChart > マウスクリック位置の値を表示する > 10.2 Tokyo:動作する | XE4: エラー > 10.2 Tokyoでもエラー


### 10.2 Tokyo

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
```

TeeChartにてマウスクリック位置の数値を表示する方法の調査。

以下にDelphiコードがある。
https://www.steema.com/support/viewtopic.php?t=5489

- [c++ builder XE4, 10.2 Tokyo > TeeChart > 最初の一歩 > グラフ作成まで](https://qiita.com/7of9/items/c0eb0b85583a197c8a47)

に基づき、グラフ表示をした上で、上記のDelphiコード相当を実装した。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
    Chart1->Series[0]->XValues->DateTime = true;
    Chart1->BottomAxis->DateTimeFormat = L"nn:ss";

    TDateTime dt;

    dt = Now();

    double yval;
    for (int idx=0; idx < 10; idx++) {
        yval = (1+ idx) % 2;
        Series1->AddXY(dt, yval, "", clRed);
        dt = IncSecond(dt, 1);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Chart1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
    int index = Series1->Clicked(X, Y);

    if (index != -1) {
        Chart1->Canvas->TextOutW(X+15, Y, Series1->ValueMarkText[index]);
    } else {
        Series1->Repaint();
    }
}
//---------------------------------------------------------------------------
```

![2018-10-17_18h18_54.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f24fb472-e197-a546-d862-3bfae08790d9.png)

値が表示された。
(Note: (x, Y)そのままの位置ではマウスカーソルに文字が隠れるため、X+15とした）。

### XE4

```txt:動作環境
C++ Builder XE4
```

```
int index = Series1->Clicked(X, Y);
```

上記にて下記のエラーが出る(ソフトは落ちない)。

![2018-10-17_18h28_22.png](https://qiita-image-store.s3.amazonaws.com/0/32870/34a64bb7-02eb-9a68-2e07-1ac5b659b2bd.png)

TeeChartのバージョンはXE4付属品とは異なるため、付属品の場合は動作がうまくいくかもしれない。


### XE4のファイルを10.2 Tokyoでビルド
(追記 2018/10/18)

XE4のプロジェクトを10.2 Tokyoに持ち込み、ビルドするとどうなるか。

![2018-10-18_16h29_47.png](https://qiita-image-store.s3.amazonaws.com/0/32870/191bdc21-a63f-f5c0-81f6-b4ee6f3b1da0.png)

同じようなエラーとなる。


### 原因 
(追記 2018/10/18)

原因について下記に記載した。

- [C++ Builder XE4 > TeeChart > マウスクリックて「モジュール 'XXX.exe'のアドレス XXXでアドレスXXXに対する読み取り違反がおきました。」の発生条件と、とりあえずの対策](https://qiita.com/7of9/items/3677b4b1b3e0c8dafd48)
ICOM IC-R30 Bluetooth

ICOM IC-R30のBluetoothの解析用メモです。

## 基本情報

| 名称 | 情報 |
|:-----------------|:------------------|
| 機器名称(デフォルト)|ICOM BT-003|
| 対応プロファイル|HFP, HSP, SPP, LE|

AndroidはSPPで、iPhoneはBTLEでつないでいると思われる。
※BT-002以前は不可か

## 利用モジュール
[ホシデン HRM1016](https://www.hosiden.co.jp/news/product/hrm1017.html)
Nordic nRF51822にピン足を出したモジュール

## BTLE情報

サービスUUID: 14CF8001-1EC2-D408-1B04-2EB270F14203

| UUID | Properties |
|:-----------------|:------------------|
| 14CF8001-1EC2-D408-1B04-2EB270F14203 | Write, Notify |
| Alert Notification Service| |
|  + 2A44 Alert Notification Control Point| Write |
|  + 2A45 Unread Alert Status| Notify |
|  + 2A46 New Alert | Notify |
|  + 2A47 Supported New Alert Category | Read |
|  + 2A48 Supported Unread Alert Category| Read |
５分でできるgulp、webpackなしでphpとsassが使える簡単ローカル開発環境

#簡単にサイトを立ち上げたい

ちょっとした作業だからgulpとかnpm installとかしたくない。
**例えばこんな時**

* LPや特集ページなど他ページに依存しないペライチページ
* 自分で試してみたい検証サイトとか（知らんけど）

  
そんな場合にちょっと調べたら、すぐできました。

#VS Codeの拡張機能追加
**Visual Studio Codeを使いこなせ! フロントエンジニア必須の拡張機能7選**
https://ics.media/entry/18544

の記事にある「Easy Sass」を入れましょう。VS Codeで開いている環境にあるscssを保存する度にcssとmin.cssファイルを生成してくれます。

HTMLのサイトであれば同記事で紹介されている「Live Server」をインストールすれば、Sassが使えるローカル環境がすぐできます。

※ChromeとFFの「Live Server」の拡張機能を入れるとPHPもLive Server使えば構築できるという記事も見たんですが、うまくいかなたかったので、うまくいく人はここまででこの記事内容は終わりです。


#PHPのコマンドラインでローカル環境を立ち上げ
https://xn--web-oi9du9bc8tgu2a.com/php-web-server/
の記事に記載があるようにコマンド一発でPHPファイルが使えるローカル環境が出来上がります。
立ち上げれたのは良かったんですが、文字化けに困ったのでググると下記記事ですぐに治りました。
https://qiita.com/daikiojm/items/937041b1966229533360

本当すぐにできますよ。
groonga-httpdを他のサーバから呼び出す場合

groonga-httpdをjsonで他のサーバーから呼び出し結果を使う場合にはヘッダーにAccess-Control-Allow-Originを追加しないといけません。

add_headerにて追加します。

```/etc/groonga/httpd/groonga-httpd.conf
 server {
    listen 10041;
    server_name localhost;

    location /d/ {
      groonga on;
      # You can disable log for groonga.
      # groonga_log_path off;
      # You can disable query log for groonga.
      # groonga_query_log_path off;
      # You can custom database path.
      # groonga_database /path/to/groonga/db;
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Credentials' 'true';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    }
    ....
```

以下のコマンドで再起動します。
> /etc/init.d/groonga-httpd restart
FlashAir Lua関数一覧

※2015年に書いたメモですが、下書きに残してあったので公開しておきます。

## 公式

コマンド|機能
|:--|:--|
request|HTTPリクエストの発行
HTTPGetFile|HTTPによるダウンロード
pio|PIO制御
ftp|FTPによるファイル送受信
md5|ハッシュ計算
Scan|SSIDスキャンの実行
GetScanInfo|SSIDスキャン結果の取得
Connect|STAモードで無線LANの有効化
Establish|APモードで無線LANの有効化
Bridge|インターネット同時接続モードで無線LANの有効化
Disconnect|無線LAN停止

## 非公式
コマンド|機能
|:--|:--|
ping|ping送信
ip|IPアドレスの取得と設定
ConnectNum|接続中のクライアント数
SetChannel|無線チャンネルの設定
StartWPS|WPSモード開始
GetSecretCode|シークレットコード取得
SetSecretCode|シークレットコード設定
ClrSecretCode|シークレットコード初期化
SetCurrentTime|時刻設定
remove|ファイル削除
rename|ファイル名変更
spi|SPI通信
SendHTTPMessageByFile|
SendHTTPSSLMessageByFile|
SendHTTPFileByFile|
SendHTTPSSLFileByFile|
SetRmHeader|
IBSS|
WlanLink|
ReadResponse|
ReadStatusReg|
getStatus|
パリティビットをJavaScriptで実装してみる

##はじめに
[この記事](https://qiita.com/hiranari/items/5fc9bf2ef86057e0ae71)の続き。
本来はハミング符号を実装してみたかったのだが、その前段階として前回の排他的論理和に引き続き今回はパリティビットを実装してみる。

##おさらい
パリティビットとは、データ通信などで誤り検出（パリティチェック）に用いられる元データの付加するビット情報。
誤り検出の方式として偶数パリティと奇数パリティと言うものが存在する。
###偶数パリティ
元データ+パリティビットで「1」の個数が偶数になるようにパリティビットを付加する方式。
例）元データ：010
元データの「1」の個数が1つ（奇数）の為、「1」の個数が偶数になるようにパリティビットを「1」とする。
###奇数パリティ
元データ+パリティビットで「1」の個数が奇数になるようにパリティビットを付加する方式。
例）元データ：010
元データの「1」の個数が1つ（奇数）の為、「1」の個数が奇数になるようにパリティビットを「0」とする。

##実装
折角なので排他的論理和は、JavaScriptに標準搭載されたものではなく[前回](https://qiita.com/hiranari/items/5fc9bf2ef86057e0ae71)実装したものを利用する。

```xor.js
var c = a !== b
```

```偶数パリティ.js
function evenParity(bitData) {
    var t = null;
    bitData.forEach(bit => {
        if (t === null) {
            t = bit;
        } else {
            t = Number(t !== bit);
        }
    });
    return [t === 0 ? 0 : 1].concat(bitData);
}

console.log(evenParity(new Array(0,1,0,1,0,1,0))); // [1,0,1,0,1,0,1,0]
console.log(evenParity(new Array(0,1,0,1,0,1,1))); // [0,0,1,0,1,0,1,1]
```

奇数パリティの場合も同じ。（最後のパリティビットの判定が異なるだけ）

```奇数パリティ.js
function oddParity(bitData) {
    var t = null;
    bitData.forEach(bit => {
        if (t === null) {
            t = bit;
        } else {
            t = Number(t !== bit);
        }
    });
    return [t === 0 ? 1 : 0].concat(bitData);
}

console.log(oddParity(new Array(0,1,0,1,0,1,0))); // [0,0,1,0,1,0,1,0]
console.log(oddParity(new Array(0,1,0,1,0,1,1))); // [1,0,1,0,1,0,1,1]
```
Java - クラス・インスタンス生成 Part.4

# 記事の書かれ方について
授業スライドとかを参考にしてるわけじゃないので、別の切り口から説明されてると思うけど。
たぶん言ってることはあっている（はず）。

アドリブなのでミスがあるかもしれないのであったら教えて！

## 4部構成です
[Part.1 さっくりインスタンス生成をしてみる](https://qiita.com/okmt_okmt_/private/5801bc2930b54e9e6559)
[Part.2 コンストラクタを使ってもっとすっきり](https://qiita.com/okmt_okmt_/private/9b862a4a94aae00298fb)
[Part.3 アクセス制御をして、入ってくる値を制限しよう](https://qiita.com/okmt_okmt_/private/ef595bb940c616785564)
[Part.4 クラス変数・メソッドを使ってみる](https://qiita.com/okmt_okmt_/private/f185ad6bc1a47fc1c0c6) ←ｲﾏｺｺ

# つなぎ
前パートではアクセス修飾子を用いて、クラスの外側からのアクセスを制限した。

```java
class DigitalStudentCard{
  //学籍番号
  private int num;

  //お名前
  private String name;

  //コンストラクタ
  DigitalStudentCard(int num, String name){
    //引数のnumをインスタンスのnum(this.num)へ代入
    this.num = num;

    //同じく
    this.name = name;
  }

  //出力する用のメソッド（自己紹介してもらう)
  String getSelfIntroduction(){
    return "学籍番号 : " + num + " 名前 : " + name);
  }
}
```

`private`アクセス修飾子を付けるとそのクラスの内部でしか変数・メソッドにアクセスできなくなる。
アクセスを制限することで、ゲッタ/セッタを作り、値を変更する際にルールを作ったり、そもそも値の変更を禁止することができる。

# staticって何ぞや
`static`は日本語に訳すと「静的」って意味になるらしいです。
性的じゃないぞ。


インスタンス変数やインスタンスメソッドはインスタンスの数だけ存在することになるけど
静的な変数や静的なメソッドは何度も作られるわけではなく、クラスに対してひとつだけ生み出される。

<b>`static`なメソッドや変数を参照するときはインスタンスの生成は不要。</b>
`クラス名.変数名`、`クラス名.メソッド名()`というような感じで呼べる。

# 書いてみる
学生証が発行された枚数を数える`CardManager`クラスを新しく作ってみる。

```java:CardManager.java
class CardManager{
  static int totalCardCount;
  
  static int getTotalCount(){
    return totalCardCount;
  }

  static void countUpTotalCount(){
    totalCardCount++;
  }
}
```

で、`DigitalStudentCard`クラスのコンストラクタに発行されたことを伝える機構を加えよう。

```java:DigitalStudentCard.java
class DigitalStudentCard{
  // 学籍番号
  private int num;

  // お名前
  private String name;

  // コンストラクタ
  DigitalStudentCard(int num, String name){  
    // 引数のnumをインスタンスのnum(this.num)へ代入
    this.num = num;

    // 同じく
    this.name = name;

    // CardManagerのメソッドを呼ぶ
    CardManager.coutUpTotalCount();
  }

  /* 略 */
}
```

こうすることで、`DigitalStudentCard`クラスのインスタンスが生成された数を数えることができる。

```java
class UseClass{
  public static void main(String[] args){
    // 適当にインスタンス生成
    DigitalStudentCard tanaka = new DigitalStudentCard(118114, "田中角栄");
    DigitalStudentCard noguchi = new DigitalStudentCard(118514, "野口英世");
    DigitalStudentCard sakamoto = new DigitalStudentCard(118060, "坂本龍馬");
    DigitalStudentCard oda = new DigitalStudentCard(118010, "織田信長");

    //totalCountを出力してみる
    System.out.println(CardManager.getTotalCount());
        // 4
  }
}
```

# ちなみに
いろんなところでおんなじ値を使いたい！おんなじメソッドを使いたい！なんて時に便利。

例えば文字列を整えるメソッドとか、決まった計算処理を行うメソッドとかがまとまっているような
インスタンス変数を持たないクラスのメソッドへ用いると、わざわざインスタンス生成を行う必要がなくなるのでいいと思う。

ただ... たくさん使うとメモリの無駄遣いになるので注意。

スコープが広い変数とか、static変数が多いのはあんまりよろしくはないので、「あれ...？」と思ったら設計を見直すことも考えよう。
Java - クラス・インスタンス生成 Part.1

# 記事の書かれ方について
授業スライドとかを参考にしてるわけじゃないので、別の切り口から説明されてると思うけど。
たぶん言ってることはあっている（はず）。

アドリブなのでミスがあるかもしれないのであったら教えて！

## 4部構成です
[Part.1 さっくりインスタンス生成をしてみる](https://qiita.com/okmt_okmt_/private/5801bc2930b54e9e6559) ←ｲﾏｺｺ
[Part.2 コンストラクタを使ってもっとすっきり](https://qiita.com/okmt_okmt_/private/9b862a4a94aae00298fb)
[Part.3 アクセス制御をして、入ってくる値を制限しよう](https://qiita.com/okmt_okmt_/private/ef595bb940c616785564)
[Part.4 クラス変数・メソッドを使ってみる](https://qiita.com/okmt_okmt_/private/f185ad6bc1a47fc1c0c6)


# クラスって何じゃろな？
クラスは、フィールドやメソッドをひとまとめにしたもので、よく<b>設計図</b>のようなものって言われたりする。

クラスに書いたフィールド変数とか、メソッドを使うときは<b>インスタンス</b>というものを生成して使うことが多い。
クラスという設計図をもとにインスタンスというモノが作られているわけだから、設計図と例えているんだと思う。

ぶっちゃけぼくはしっくりこないけど。

# で、インスタンスって何やいな
インスタンスは、クラスから作られた〜っていうとさっきの説明とかぶっちゃうな。

インスタンスは`new`キーワードで作られるもので、変数とかメソッドとかのを独立して動かすことができるもの。

# 書いてみる
ひとつ設定を呑んでほしい。
デジタル学生証をテーマにクラスを用意して、そのインスタンスを生成してみよう。

ここで作る学生証クラス`DigitalStudentCard`は学籍番号`num`と、学生の名前`name`をフィールドに持っている。

```java
class DigitalStudentCard{
  //学籍番号
  int num;

  //お名前
  String name;

  //出力する用のメソッド（自己紹介してもらう)
  String getSelfIntroduction(){
    return "学籍番号 : " + num + " 名前 : " + name);
  }
}
```

このクラスを使ってみよう。

```java
class UseClass{
  public static void main(String[] args){

    //インスタンス生成
    DigitalStudentCardtanaka tanaka = new DigitalStudentCard();

    //インスタンス変数へ代入
    tanaka.num = 118114;
    tanaka.name = "田中角栄";


    //別のインスタンスを生成
    DigitalStudentCardnoguchi noguchi = new DigitalStudentCard();

    //新たに作ったインスタンスの変数へ代入
    noguchi.num = 118514;
    noguchi.name = "野口英世";

    //出力
    System.out.println(tanaka.getSelfIntroduction);
        // 学籍番号 : 118114 名前 : 田中角栄

    System.out.println(noguchi.getSelfIntroduction);
        // 学籍番号 : 118514 名前 : 野口英世

  }
}

```

ざっと、田中角栄くんと野口英世くんの学生証を発行してみた。
こうすることで、複数の変数に結びつきが生まれて関連していることがわかりやすくなるんじゃないかなって思う。

これがもし、クラスを使わなかったら`tanakaName`と`noguchiName`が作られてコードがぐちゃぐちゃに...
ゾッとするね。

こんな感じで、これから説明する機能の多くは<b>コードを読みやすく、キレイに、シンプルに</b>するためにある。
使いこなせばコード書くのが楽になっていくのでどんどん覚えていこう。

## ちなみに
先ほど作った`tanaka`と`noguchi`は田中角栄くんと野口英世くんが同じ人間ではあるが、別人であるようにこいつらは<b>別のもの</b>として扱われる。

論理式で比較すると、こういう感じになる。

```java
if(tanaka == noguchi){
  System.out.println("同じインスタンス");
}else{
  System.out.println("違うインスタンス");
}


/* 実行結果 */
// >>違うインスタンス
```

# 次回
次はコンストラクタを実装してみよう！
つぎ → [Part.2 コンストラクタを使ってもっとすっきり](https://qiita.com/okmt_okmt_/private/9b862a4a94aae00298fb)
Objective-CでiOS11の新機能、Drag and Dropを無効化させる

とある案件で諸事情によりiOS11で入った新機能、[Drag and Drop](https://developer.apple.com/ios/drag-and-drop/)を無効化しないといけなくなったため、調査して実際に入れた方法を記載します。

アプリがObjective-Cで書かれているため、ドキュメント込みで色々検索した結果、以下の投稿記事が引っかかったので参考にさせていただきました。
[アプリ全体でiOS 11のドラッグを無効にするにはどうすればよいですか？](https://code.i-harness.com/ja/q/2bed195)

# Swizzling（黒魔術）を使って無効化

参考にした投稿記事の通り、Swizzlingで一律無効化してしまいます。
コードは以下の通りです。アプリで一律無効化したいので、今回の例ではAppController.mmという名前のクラスに記載しています。

```ruby:AppController.mm

#import <UIKit/UIKit.h>
#import <objc/runtime.h>

@implementation UIDragInteraction (TextLimitations)
+ (void)load　{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        
        Class c = [self class];
        
        SEL originalSelector = @selector(isEnabled);
        SEL swizzledSelector = @selector(restrictIsEnabled);
        
        Method originalMethod = class_getInstanceMethod(c, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(c, swizzledSelector);
        
        BOOL didAddMethod =
        class_addMethod(c,
                        originalSelector,
                        method_getImplementation(swizzledMethod),
                        method_getTypeEncoding(swizzledMethod));
        
        if (didAddMethod) {
            class_replaceMethod(c,
                                swizzledSelector,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

/**
 * 差し替え用のisEnabledクラス
 * 一律でNoを返す
 */
-(BOOL)restrictIsEnabled　{
    return NO;
}
@end
```

こんな感じでUIDragInteraction.isEnabledをSwizzlingして、iPadもNOが返るようにしました。
完全な黒魔術ですw

# まとめ

Objective-CだとDrag and Drop無効化のやり方について情報がほとんど引っかからなかったので、結構苦労したのでメモがわりに書きました。

今回の無効化は、自分が調査した結果のあくまで一例です。
swizzlingで入れ替えるのは結構な黒魔法であり、あまり推奨されたやり方ではないので、他にも良い方法があるかもしれません。

Objective-Cはまだまだ勉強不足なため、コメント等で何か他にいい方法があれば意見をいただけると嬉しいです。
【mysql5.6】JSON型でデータを取得する

mysql5.7から、jsonがサポートされました。
https://dev.mysql.com/doc/refman/5.7/en/json.html

しかし、mysql5.7以前のバージョンを使っているサービスは多く存在しているでしょう。
そこで、mysql5.7以前のバージョンでも、DBからJSON型でデータを取得する方法を記しておきます。

下記、サンプルになります。
## サンプルテーブル
### userテーブル
| user_id | user_name | user_passwd | user_passwd_h1 | user_passwd_h2 |     create_datetime     |
|:-------:|:---------:|:-----------:|:--------------:|:--------------:|:-----------------------:|
| 1       | yamako    | jdti8eF3    | QP3J-Dhp       | ZVSEg9Qe       | 2018/10/18 9:21:57.981  |
| 2       | mikiko    | 6UU2hVxm    | (NULL)         | (NULL)         | 2018/10/18 12:05:18.452 |
| 3       | yoshiko   | mhKxekBR    | FecFwETb       | (NULL)         | 2018/10/18 18:58:31.216 |
| 4       | nishiko   | TJWeYTQb    | 2SapnkBt       | TgdBKSLi       | 2018/10/17 15:43:12.754 |

### ソース
```
CREATE TABLE `user` (
  `user_id` int NOT NULL AUTO_INCREMENT COMMENT 'ユーザーID',
  `user_name` varchar(20) COLLATE utf8_bin NOT NULL COMMENT 'ユーザ名',
  `user_passwd` varchar(64) COLLATE utf8_bin NOT NULL COMMENT 'パスワード',
  `user_passwd_h1` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'パスワード1世代前',
  `user_passwd_h2` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'パスワード2世代前',
  `create_datetime` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '作成日時',
  PRIMARY KEY (`user_id`)
);
```


# クエリでJSON型データを取得する

DBにクエリ発行し、JSON型でデータを取得する。
JSON型データというのは、key:value形式のデータを指しており、keyがカラム、valueがデータとなる。
なお、下記の項目を考慮する。
・データが文字列の場合、ダブルクォート"で囲う。
・データが数字、nullの場合、ダブルクォート"を付けない。
・カラムcreate_dataは、UNIXミリ秒で表示する。
・条件WHEREで指定した年月日を検索対象とする。

### クエリ

```
SELECT
  CONCAT('{"accOffDateTime":', user_id, '.', ''), ','),
  CONCAT('"userName":', user_name, ','),
  CONCAT('"userPasswd":', user_passwd, '",'),
  case when user_passwd_h1 is null then '"userPasswdH1":null,' else CONCAT('"userPasswdH1":"', user_passwd_h1, '",') end,
  case when user_passwd_h2 is null then '"userPasswdH2":null,' else CONCAT('"userPasswdH2":"', user_passwd_h2, '",') end,
  CONCAT('"createDatetime":"', REPLACE(unix_timestamp(acc_on_datetime), '.', ''), '"}')
FROM
  user 
WHERE
  DATE_FORMAT(create_datetime, '%Y%m%d') = '20181018';
```

### クエリ結果

```
{"userId":1, "userName":"yamako", "userPasswd":"jdti8eF3", "userPasswdH1":"QP3J-Dhp	", "userPasswdH2":"ZVSEg9Qe", "createDatetime":1539854517981}
{"userId":2, "userName":"mikiko", "userPasswd":"6UU2hVxm", "userPasswdH1":null, "userPasswdH2":null, "createDatetime":1539864318452}
{"userId":3, "userName":"yoshiko", "userPasswd":"mhKxekBR", "userPasswdH1":"FecFwETb", "userPasswdH2":null, "createDatetime":1539889111216}
```

# 参考ドキュメント

・CONCAT 関数
https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_concat

・unix_timestamp 関数
https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_unix-timestamp

・CASE 構文
https://dev.mysql.com/doc/refman/5.6/ja/case.html

・REPLACE 構文
https://dev.mysql.com/doc/refman/5.6/ja/replace.html

・DATE_FORMAT 関数
https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_date-format
Watch ConnectivityのApplication Contextは、再送できない？

iPhoneなどと、AppleWatchの通信に使う Watch Connectivityについてです。

だいたい、こんな感じでコーディングするようです。

```swift:
// セッションの準備
if (WCSession.isSupported()) {
    let session = WCSession.defaultSession()
    session.delegate = self 
    session.activateSession()  
}

// データの送信
do {
    let applicationDict = ["hoge" : "huga"]
    try WCSession.defaultSession().updateApplicationContext(applicationDict)
} catch {
    // エラー処理
}
```

そして、このAPIは「新しいデータがキューに追加されると古いデータは上書きされる」とのこと。　その仕様の影響なのでしょうか、同じ内容のデータ(辞書)を送信すると、さっき送ったから　ということなのか、送られないようです。

Watch → iPhoneの場合は受信側が起動されるので問題ないようなのですが、iPhone→watchは受信に失敗する場合があるようです。　　(自分でプログラムした）ACKが帰ってこないので、再送するが、ACKが帰ってこない。　っという現象に遭遇して発見しました。


結局、送信タイムスタンプを追加することで回避しました。

```swift:
// データの送信
do {
    let applicationDict = ["hoge" : "huga", "timeStamp":Date()]
    try WCSession.defaultSession().updateApplicationContext(applicationDict)
} catch {
    // エラー処理
}
```
[macos] 指定時刻のタイムスタンプをサクッと(?)取得する

Swiftでテストコードやスタブコードに`Date`を使う時なんかに

```sh
date -v${year}y -v${month}m -v${day}d -v${hour}H -v${minute}M -v${second}S +%s
```

例: 2018年10月17日0時0分0秒

```sh
$ date -v2018y -v10m -v17d -v0H -v0M -v0S +%s
1539702000
```
Windows10HomeのHomestead(Laravel)でHMRをやってみる

以前に[「Windows10HomeのLaradockでHMRをやってみる」](https://qiita.com/tomi_shinwatec/items/2e176afae77cf3484b38)という記事を書きましたが、それのHomesteadのLaravel版です。

設定としてはこちらの方が簡単です。

## 環境構成
**開発**
・Windows10 Home
・Oracle Virtual Box

**サーバーサイド**
・Laravel 5.6 Homestead

**フロントエンド**
・React 16.2

**ローカルドメイン**
test-app.local

Homesteadの基本的な環境構成は既に完了しているものとします。
参考：https://readouble.com/laravel/5.6/ja/homestead.html



## webpack-dev-serverの設定
内容はDockerのLaradockのものと大部分は同じですが、プロキシの部分だけ少し変わります。
Homesteadではnginx実行環境が自身のサーバーと同じなのでlocalhostになります。
またポート8080も特別なことはしなくてもそのまま参照できるようです。

```/testProject/webpack.mix.js
let mix = require('laravel-mix');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel application. By default, we are compiling the Sass
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.react('resources/js/app.js', 'public/js')
   .sass('resources/sass/app.scss', 'public/css')
   .webpackConfig({
    output: {
      publicPath: "http://test-app.local:8080/"
    },
    devServer: {
      disableHostCheck: true,
      contentBase: path.join(__dirname, "public"),
      publicPath: '/',
      host: '0.0.0.0',
      port: 8080,
      proxy: {
        '/': {
          target : 'http://localhost'
        }
      },
      stats: { colors: true },
    },
    watchOptions: {
      poll: 2000,
      ignored: /node_modules/
    }
  });
```

### Reactの変更
Reactの設定はDockerのLaradockのものと全く同じです。

パッケージを追加して、

```
# npm install -D  --no-bin-links --no-optional react-hot-loader
```

下記のようにAppContainerのコンポーネントで囲む形にします。

```/testProject/resources/assets/js/app.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import { AppContainer } from 'react-hot-loader';

ReactDOM.render(
  <AppContainer>
    <div>
      <p>hello! World.</p>
    </div>
  </AppContainer>
  ,document.getElementById("content")
)

if(module.hot) {
  module.hot.accept();
}
```

### 実行確認

hot環境を実行して、

```
# npm run hot
```


ブラウザで以下URLを開いて確認します。
http://test-app.local:8080

コンポーネントを変更してみて、ダイレクトに変更されたら成功です。

---
以上になります。Homesteadは簡単でよいですね。
雑記、リンク集

#memo
MYSQLのTRUE や FALSE はそれぞれ 1 と 0 とされている。
[INSERT INTO SELCT構文](https://itsakura.com/sql-insert)



#リンク集




- YAML
    - [YAML入門の入門](https://simple-it-life.com/2016/03/06/yaml-beginner/)
    - [YAML 入門 &#8211; Cloud Cafe](http://cloudcafe.tech/?p=1776)
    - [YAMLとは何か？ - いつもRailsの設定ファイルで出てくるやつの正体](https://qiita.com/Yama-to/items/587544993fb62610528a)

- angular
    - [ng-model](https://qiita.com/hotpot0525/items/5d3d4dce962a39bc6271) 
    - [$watch](http://rennnosukesann.hatenablog.com/entry/2018/02/21/191130)
    - [$routeParams](https://www.buildinsider.net/web/angularjstips/0051)
    - [ルーティング機能](https://www.buildinsider.net/web/angularjstips/0050)

- VSCode
    - [[VSCode] F12で飛んだ先から、戻るショートカット](http://l-s-d.sakura.ne.jp/2017/09/vscode_return_from_f12/) 
    - [矩形選択](https://www.atmarkit.co.jp/ait/articles/1805/11/news022.html)

[初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」]
(https://qiita.com/jnchito/items/893c887fbf19e17d3ff9)
[はじめてのssh]
(http://iatlex.com/linux/ssh)
[JIRA表記]
(https://pyconjp.atlassian.net/secure/WikiRendererHelpAction.jspa?section=all)
[]
()
[]
()
[]
()




[]
()
[]
()


#便利

- 範囲選択
    - 最初の文字をクリック（webページなどではカーソルなどは出ないが気にせず）<br>最後の文字をshiftを押しながらクリック
    - スクロールしないと見えない範囲の選択に有効
PHPで private static なプロパティに値をセットする方法


テストのために private staticなプロパティを書き換えたくて調べました。

具体的にやりたかったのは CakePHP2 の ModelのDB接続を提供している ConnectionMangerの _dataSourcesプロパティにモックのDBを突っ込みたかったんですね。

通常のインスタンスのプロパティなら

```php
$property = new ReflectionProperty($insatnce, '__privateProperty');
$property->setAccessible(true);
$property->setValue('セットしたい値');
```

なんだけど、クラスのstaticプロパティだとこうはいかないので、一旦ReflectionClass経由すればよいようです。

下記のようにすると private static プロパティもセットできました。

```php
$class = new ReflectionClass(ConnectionManager::CLASS);
$property = $class->getProperty('_dataSources');
$property->setAccessible(true);
$property->setValue(['test' => $db]);
// 追記 これで差し替えちゃうと他のテストが失敗するので差し替え前にバックアップしてテスト後に元に戻しましょう^^;
```

まぁ、こんなややこしいことしないとテストできないようなコードになってるのがダメだとはおもうんですが、いろんな制約のなかでこんなしてテストすることもあるのよね…^^;
pillow で透過画像の一部を切り抜きたい

# 透過画像の一部を消したい
画像は文字の緑以外は透明にしているのだが，左から右のように透過 PNG の一部を切り取って消したい．
![letter.png](https://qiita-image-store.s3.amazonaws.com/0/298237/5595b487-1482-dbda-9f4c-a68930f9cf4d.png "letter.png")→![ltter.png](https://qiita-image-store.s3.amazonaws.com/0/298237/8835a19c-80e8-74ce-d6c7-76e095f4b8ca.png "lttr.png")
ペイントソフトでやるなら簡単だ．
しかし Python pillow でやろうとしたところ少し苦労した．
"python pillow alphachannel merge"
などでググっても出てこなかった．
Image クラスにはアルファチャンネルだけを操作するようなメソッドが（おそらく）なく，
あまり有名ではない ImageChops クラスを利用することで解決した．

# 正解
消したい場所を黒くしたマスクを用意．
![mask.png](https://qiita-image-store.s3.amazonaws.com/0/298237/a15fe378-e054-11d8-c0e0-74937860419c.png "mask.png")
アルファチャンネルだけを取り出して演算をし，アルファチャンネルに代入した．

```python
from PIL import Image, ImageChops

# ensure letter having 4 channels RGBA
letter = Image.open('letter.png')
if letter.mode != 'RGBA':
    letter = letter.convert('RGBA')

# ensure mask having 1 channel
mask = Image.open('mask.png')
if mask.mode not in ['1', 'L']:
    mask = mask.convert('L')

# get alphachannel of letter.png
letter_alphachannel = letter.split()[3]

# note: "dark" in alphachannel means "transparent"
merged_mask = ImageChops.darker(mask, letter_alphachannel)

# insert merged alphachannel
letter.putalpha(merged_mask)

# save to file
letter.save('lttr.png')
```

# 応用
別に「切り取る」だけではなくて，透過画像の一部を半透明にすることもできる．
使うマスクを変えれば様々な階調で透明度を変えることは簡単．
![mask2.png](https://qiita-image-store.s3.amazonaws.com/0/298237/b6968365-e7ab-b525-d475-c572a63b20ed.png "mask.png") ![lttr.png](https://qiita-image-store.s3.amazonaws.com/0/298237/c54615c2-51da-ff55-0885-571fa6bf393b.png "lttr.png")

しかし誰かの役に立つ日が来るとは思えないテクニックだ．
ハムスターでも分かった最長増加部分列

先輩に教えて頂いたのを忘れない用です．

考えた人間は天才すぎる．

Longest Increasing Subsequence
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_1_D&lang=jp

#最長増加部分列とは？
数列$A=a_0,a_1,…,a_{n−1}$があるとき，
増加部分列は
$$0≤i_0<i_1<…<i_k<n　\\cap \ a_{i0}<a_{i1}<…<a_{ik}$$
を満たす部分列 $a_{i0},a_{i1},…,a_{ik}$で，最長増加部分列はその中で最も$k$が大きいもの．
（上の問題からのコピペです）

$5,3,1,2,3,5,4,8,7,1$のような数列の場合，最長増加部分列は$1,2,3,4,7$となります．

#Nが小さいとき
数列の長さ$N$が$N<10^3$程度なら，N個のテーブルをもつDPテーブルを用意して所謂配るDPをしていけば，$O(N^2)$で解けますね．
しかし，$N<10^5$になってくるとTLEしてしまいます．

#解法
1.INFで初期化した，文字列の長さN個のテーブルをもつ１次元のDPテーブルを用意
2.列を前から見て行く
3.i番目までで作れる長さjの増加部分列のうち，DP[j]に長さj+1の全ての部分増加文字列の中で最大の数(一番後ろのもの)が最小の部分文字列の最大の数を格納していく
という手順で更新していきます．

これを表にして見ていくとあることが分かるのですが......

$5,3,1,2,3,5,4,8,7,1$を例に見ていきましょう．

縦軸がDPテーブルのインデックス，横軸がカウンタがiのとき見ている値$a_i$です．
![L.gif](https://qiita-image-store.s3.amazonaws.com/0/214706/05640bd7-0d10-bf67-af72-23db33ee839a.gif)

ここで，気づく人は気づく特性があり，1回ごとの値$a_i$によるDPテーブルの更新は１つの要素のみです．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214706/6188c9fe-cc3d-39c2-86e6-e2718fa29b06.png)

そしてこの更新する要素のインデックスは，なんとDPテーブル内を$a_i$で2分探索(lower_bound)で求めることができます．

ここまでの処理は，N回の処理ごとに$O(logN)$の２分探索を行うので，$O(NlogN)$となります．

あとは，DPテーブル内のINFではないインデックスの最大値+1がそのまま，最長増加部分文字列の長さとなるので，INFでlower_boundを取るとすぐに求められますね．

#コード
最初に貼った問題も僅か数行で書けます．

```cpp
#include<bits/stdc++.h>
using namespace std;
#define INF 0x7FFFFFFF

int main(){
    int n;
    cin >> n;
    vector<long long> a(n);
    for(int i=0 ; i < n ; i++) cin >> a[i];
    vector<int> dp(n,INF);
    for(int i = 0; i < n; i++)
        *lower_bound(dp.begin(),dp.end(),a[i]) = a[i];
    cout << lower_bound(dp.begin(),dp.end(),INF) - dp.begin() << endl;
    return 0;
}
```

考えた人間すごすぎる．
ThingWorxの開発者ポータルサイトにアカウントをつくり、試用版サーバーインスタンスを立ち上げる

##ThingWorxとdeveloper Portalの紹介

PTC社が提供しているIoTプラットフォームThingWorxは、WebベースのIoTアプリケーションを開発できる便利なサーバーソフトですが、売り物かつそれなりのお値段がするらしいので、お小遣いで買ってみることはなかなか厳しいです。

さすがにPTC社もわかっているのか、体験版サイトを用意してくれてます。それが[ThingWorx Developer Portal](https://developer.thingworx.com/) です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/3197cec0-53d0-f02c-05a5-718ebe8d6888.png)
アメリカのソフトウェア企業なので、当然のように英語表記のみ。
たかがアカウント登録と侮るなかれ、おもてなしが欠けていて躓く方が出ているようなので、登録方法を説明します。

###ThingWorx developer portalでできること
評価用のクラウドサーバーインスタンスを30日間利用できます。またダウンロード版は90日間利用可能です。
ThingWorxを理解するために必要となるQuickstartやHowto、Tutorialが数多く用意されています。

###必要なもの
1. パソコン（Windows、Mac、Linux いずれもOK)
1. ブラウザ ：ChromeかFireFox 推奨
1. TCP 443番ポートにアクセスできる通信環境
1. アカウント登録に必要となる情報：名前とメールアドレスと所属組織名

※クレジットカードなど支払い情報は必要ありません（2018年10月現在）

###アカウント登録とサーバーインスタンス起動
1. [https://developer.thingworx.com/](https://developer.thingworx.com/)にアクセスし、画面右上の”Sign Up”をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/7a509beb-10fd-ee4a-3550-9763cb691b96.png)

1. アカウント作成画面でメールアドレスとパスワードを入力し、条件を確認の上、チェックをいれて”Submit”をクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/3d03c20a-5f45-530d-c7c4-769402aab629.png)

1. メールボックスを確認してください。以下のメールが届いていたら、”Verify Address”をクリックしましょう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/c7a21334-3a11-ee69-f418-fd0eb1647d70.png)

1. ログイン後、"Manage Your Profile"にて詳細情報を入力します。＊のある項目が必須というのは罠で、すべての項目の記入が必須となっているようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/a2ecc571-6015-b0f6-0d08-cd33f4918dd8.png)

1. 画面右側の人型アイコンをクリックして"View Hosted Server"をクリックすると表示される”Your Evaluation Server”ページで”Create Server”ボタンを押すと、サーバインスタンスが作成されます（数分から10分間ほどかかります）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/8d8430fb-cb82-5470-0d0d-491c9f3d6c27.png)

1. サーバインスタンスのURLが表示されますので、ブラウザからアクセスできるかどうか、確認してみましょう。※URLは、登録者様ごとに異なります。
IDは”Administrator”、パスワードは”Copy to clipboard”をお使いください。
インスタンス作成後、”Launch”ボタンをクリックすることでもアクセスできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/d0bf0ca0-333e-276b-16e0-29dec7578d9f.png)

1. ThingWorx Composerの画面が表示されれば成功です
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/9a48ceaa-0147-1421-c0b5-692d3bf4f101.png)

## サーバーインスタンスが立ち上がった後は
せっかくの30日間の無料期間を無駄にしないよう、さっそくThingWorxを体験しましょう。
画面上部の"Resources"→"Projects & Guides"にすすむと、いろいろなシナリオが用意されています。
筆者のおすすめは [Get Started with ThingWorx for IoT](https://developer.thingworx.com/resources/guides/thingworx-foundation-quickstart) です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/8c8ef910-6c2e-6027-ac83-53153e872f85.png)
VirtualBoxでUbuntu環境構築

####１．必要なソフトウェアの準備
・VirtualBox本体
・Ubuntu XX.XX イメージファイル
　例：ubuntu-99.99.9-desktop-amd64.iso
####VirtualBoxのインストール
・ローカルでセットアップexeを展開
・特に何も触らずポチポチと進める
####２・VMイメージファイルの作成
起動⇒新規
####仮想マシンの作成　の設定
名前：任意
タイプ：Linux
バージョン:Ubuntu(64-bit)
※64-bitが選択肢に無い場合BIOSの設定変更が必要(グーグル先生に聞く
メモリサイズ：任意
ハードディスク：仮想ハードディスクを作成する
####仮想ハードディスクの設定
ファイルの場所：任意
ファイルサイズ：任意
ハードディスクのファイルタイプ：VDI
ストレージ：可変
####VMイメージの設定
設定⇒ストレージ
コントローラーIDEを選択し、画面右の光学ドライブを選択
Ubuntuのisoファイルを選択する

ネットワーク⇒アダプター2
割り当て：ホストオンリーアダプター
####３．Ubuntuのインストール
・イメージファイルを右クリック⇒通常起動
・日本語を選択して、Ubuntuのインストールを押下
・「Ubuntuのインストール中にアップデートをダウンロードする」にチェック
・「ディスクを削除してUbuntuをインストール」にチェック
####４．SSHアクセス設定
Vue CLI v3.0でローカルにあるフォントを適用する

Vue CLIで`vue create`で作成したプロジェクトに、ローカルにあるフォントを適用するのにてこずったので、メモしておく。

1. `src/assets`配下に`fonts`フォルダを作る
2. `src/assets/fonts`フォルダにフォントファイルを格納する
3. `src/assets`配下に`sass`フォルダを作る
4. `src/assets/sass`配下に以下のような`scss`ファイルを作る

```style.scss
@font-face {
  font-family: 'M PLUS Rounded 1c';
  src: url('~@/assets/fonts/MPLUSRounded1c-Medium.ttf') format('truetype');
}
```

5.vueのエントリーに当たる`main.js`で以下のように記述し、4.の`scss`ファイルをインポートする

```main.js
import './assets/sass/style.scss'
```

これであとはコンポーネントで`font-family`で上記のフォントを指定してあげれば適用できる。


`vue.config.js`をつくってローダーを新たに追加する、なんてことはしなくてよくて、vue cliがいいかんじにフォントのローダーも設定していました。
`vue inspect --rules`でwebpackのローダーの設定が確認できます。
MacOS High SierraでWio LTE M1/NB1をセットアップした話

LTE-M対応のWioが出たので、ソラコムさんからポチったのですがはまったので備忘録です。下記のgithubを見ながら試行錯誤しました。
https://github.com/SeeedJP/Wiki/blob/master/Wio_cell_lib_for_Arduino/home-ja.md

下記のgithubの内容を参照して間違えたので、ご注意を。
これは基盤が赤いやつ用で、ソラコムさんの青い基盤のやつ用ではないそうです。
~~ttps://github.com/SeeedDocument/wiki_english/blob/master/docs/Wio_LTE_Cat_M1_NB-IoT_Tracker.md~~

試した環境はMacOS10.13.6、Arduino IDEは1.8.7です。

#SORACOMさんからWio LTE M1/NB1を購入
ソラコムさんのダッシュボードからWio LTE M1/NB1を購入します。

Grove IoT スターターキット for SORACOM(Wio LTE JP Version)と違って、Groveキットがついてきません・・・。

日本向け Air SIM (plan-KM1)も一緒に頼みましょう。
SIMがなくて泣きました。。。


#Arduino IDEをMacにインストール
https://www.arduino.cc/en/Main/Software

#ArduinoボードマネージャーにSeeed STM32F4ボードを追加
Arduino > Preference を開く
<img width="803" alt="スクリーンショット 2018-10-17 16.08.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/63091/71b618ee-1230-3442-fcb1-803e3b33554b.png">


「追加のボードマネージャのURL」に

http://www.seeed.co.jp/package_SeeedJP_index.json

をペーストし、OKを押下。

ツール >> ボード >> ボードマネージャー　　　から
<img width="801" alt="スクリーンショット 2018-10-17 15.32.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/63091/0fe75c6f-c326-72b2-4873-3343b453a26d.png">
Wio　LTEを探し、インストール。

#GWioLTE_Cat_NB1_Arduino_Libraryを追加する


スケッチ >> ライブラリをインクルード >>ライブラリを管理
<img width="803" alt="スクリーンショット 2018-10-17 16.21.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/63091/082da860-de2f-12ba-24f4-89b0671fb559.png">

#ボードを選択
<img width="731" alt="スクリーンショット 2018-10-17 16.24.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/63091/41b95f4b-3b2e-5918-b0de-8759f0a6e9e8.png">

#マイクロUSBでWioとMacを接続
USB-C → Micro USBのコードを忘れずに。

「No Valid JTAG Interface Configured」というエラーが出て
書き込めないと言われる場合は、USBケーブルが悪くての電力が足りない場合の
ようです。


#書き込む手段をOpenOCDに変更
<img width="459" alt="スクリーンショット 2018-10-17 16.25.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/63091/7a4d3833-17f1-b4d4-7f78-5c97eca93cc0.png">

#サンプルコードを実行
<img width="948" alt="スクリーンショット 2018-10-17 16.28.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/63091/0a912ec9-aa11-9afe-d969-1db2079a154e.png">

「→」ボタンを押してコンパイル

※Wio LTE M1はDFUモードは無いそうです。勝手に再起動するとのこと。

#LEDを見る
いろんな色にLチカできてれば、成功です。

#libusbが無いと言われたときのエラー対処

libusbをインストール
`brew install libusb`

libusbheへリンクを貼る
`$ sudo ln -s /usr/local/opt/libusb/lib/libusb-1.0.0.dylib /opt/local/lib/`

（Home Brew /Xcode/node.jsはインストール済みの前提です）
IE, Edgeにはドメイン全体でもLocalStorageの容量制限がある

# 結論から
皆さんご存知の通り、各ブラウザのlocalStorageは**ドメイン毎に○○MBまで**という容量制限があります（ChromeやIEでは10MB）

実は、IEやEdgeには更に**ドメイン全体（同一のルートドメインを持つサイト）の合計が20MBまで**という制限があります。
サブドメインを3つ以上持つようなサイトでは、各々のサイトで10MB使い切ることができません。

## 例えば、

example.comというドメインで

- aaa.example.com
- bbb.example.com
- ccc.example.com

のように3つのサブドメインを使っているとすると、
**IE/Edgeでは**、aaa.example.comでローカルストレージを10MB、bbb.example.comでローカルストレージを10MB使ってしまうと、ccc.example.comでは容量不足でローカルストレージが使えなくなります。

# 検証
6つのサブドメインを持つサイトでlocalStorageの容量超過エラー（QuotaExceededError）がやたら発生する。それもIEだけ。
⇒検証してみることに

## 検証環境
- OS
 - Windows 10 バージョン1803 ビルド17134.345 (64bit)
- ブラウザ
 - Internet Explorer 11.345.17134.0
 - Microsoft Edge 42.17134.1.0
 - Google Chrome 69.0.3497.100

## 検証に使用したコード

以下のコードを各サイトのコンソールで実行します。
localStorageを2Byte単位でほぼ完全に埋めるコードです。[^1]

```javascript
localStorage.clear();

(function() {
  var str2Bytes = "a";

  var hugeStr = "", preHugeStr = "";
  var quotaExceed = false;
  var increaseBytes = 1000000;

  while (true) {
    if (quotaExceed) {
      increaseBytes /= 10;
      if (increaseBytes < 1) break;
      quotaExceed = false;
    }

    preHugeStr = hugeStr;
    hugeStr += Array(increaseBytes+1).join(str2Bytes);

    try {
      localStorage.setItem("0", hugeStr);
    } catch(e) {
      hugeStr = preHugeStr;
      quotaExceed = true;
    }
  }

  return preHugeStr.length*2+2; // localStorageのkeyでも1文字（2byte）使っているので足して返す
})();
```

検証を終えたら

```javascript
localStorage.clear();
```

するのも忘れないように

## 検証結果

|  | IE | Edge | Chrome |
|:--|:--|:--|:--|
| サブドメイン毎 | 10MB | 10MB | 10MB |
| ドメイン全体 | 20MB | 20MB | 無制限（300MB以上） |

IEとEdgeでは3個目のサブドメインでlocalStorageに1Byteも保存できなくなりました。
Chromeでは用意した30個のサブドメイン全てに10MB保存できました。

# 最後に
公式に得られた情報ではなく、検証によって推測した仕様ですので、誤っている可能性もあります。
間違いなどありましたら教えていただければ幸いです。

---

調べてみたらこんなのがあったので、その対策でしょうか。

■アクセスするだけで空き領域が勝手にどんどん減っていく「FillDisk.com」 - GIGAZINE
https://gigazine.net/news/20130304-filldisk-html5-localstorage/


[^1]: JavaScriptのStringはUTF-16形式ですので、1文字=2Byteが最小単位になります。
[TypeScript] 匿名クラス(内部クラス)

```text:確認環境
"typescript": "3.0.3"
```

```typescript:TypeScriptコード
// 匿名クラスのインスタンス化
const inner = new class {
    /**
     * 匿名クラスのメソッド
     */
    public hello(name: string): void {
        // ログ出力
        console.log(`hello, ${name}`);
    }
}

// 実行
inner.hello(`Jon`);
```

```bash:コンソール出力
hello, Jon
```
PHP7で検索サイト作成

My SQLを使わない形での検索サイトの作り方を書きます。

少しPHPの習熟度が上がった人のための記事になります。

とはいっても、初心者からちょっと抜け出した、くらいの感じです。

作ったサイトのキャプチャを載せます。

![2018-10-17 (7).png](https://qiita-image-store.s3.amazonaws.com/0/200171/ea5b7983-a80d-54d5-1e73-e38dac69bc7a.png)

まずはこんな感じでフォームを作って「デスザウラー」という文言を入力しました。

ソースコードはこちら。


```html

<!doctype html>
<head>
<title>
Oct17
</title>
<style>
div,form{
background:pink;
width:160px;
}
</style>
</head>
<body>
<div class=form>
	<form action="POST17.php" method="POST">
		<p class="inputbox">
		<input type="text" name="sample">
		</p>
		<input type="submit" name="検索">
	</form>
	
</body>
</html>



</div>
```
本来、CSSは外部ファイルにしておくべきなのですが
今日は気分的に中に書きたかったというのがあるのでCSSを中に書きました。

そしてサーバーサイド側です。

```PHP
<?php
$zoid = htmlspecialchars($_POST['sample'],ENT_QUOTES,"UTF-8");

$arr = array(
				"ウルトラザウルス",
				"セイバータイガー",
				"シールドライガー",
				"プテラス",
				"モルガ",
				"アイアンコング",
				"デスザウラー",
				"ブレードライガー",
				"デススティンガー",
				"ライトニングサイクス"
				


			);
		foreach($arr as $val){
				if($zoid == $val){
				echo $zoid;
	}
	
}
````
このように書きました。

foreach文とif文を使って書いた形になります。

本当はもっといい書き方があるはずなのですが

とりあえず、実装したものが動けばいいという意味合いで

コードを記述したので信頼性は低いものとなります。

また、配列の中身に該当したものがあったら表示させるよ

っていうような形のコードなので、本来ならPHP Data Objectで

コードを書いていくべきでしょう。

これを書いている間に出たエラーもキャプチャを取りましたので

情報共有させていただきます。

![2018-10-17 (4).png](https://qiita-image-store.s3.amazonaws.com/0/200171/b2ae43e1-f6da-101f-a9e3-255d600f783f.png)

Parseエラーだったため、すぐに直すことができました。

Apache側のログを読み解いていってもよかったのですが

時間がかかりそうな気がしたのでブラウザにエラー表示させるようにしています。

最後に出力結果です。

![2018-10-17 (6).png](https://qiita-image-store.s3.amazonaws.com/0/200171/a1d93a8b-0bd1-2315-5673-d8bf1e5093d5.png)

また、進展がありましたら記事を書きます。
初心者のPHPとMySQL備忘録

#業務上phpとMySQLの繋ぎこみはまったくしないので、休日に趣味でいじるたびに忘れてます
こんにちは、フロントエンドエンジニア&WEBデザイナーをやっている人です。今の会社のサービスではphpをつかっているのですが、バックエンドの方がいるのでMySQLは全く触りません。phpもフロント側で何か出したりする記述程度です。且つ、デザインもやっている関係上ソースコードに触らない時間というのが月に１週間ほど発生します。その度にphpの記憶もMySQLの記憶も消えて行きます。よくないですね。というわけで今回は忘れた自分に対してできるだけ早めに思い出してもらえるようにまとめ記事書きます。備忘録です。誰得ですがよろしくお願いします。


## フロント系
###文字出力

```
<?php echo 'hello!'; ?>
```
###変数

```
$sample = 'さようなら';
<?php echo 'こんにちは' . $sample; ?>
```

###if文

```
<?php if($a === 1): ?>
<?php else; ?>
<?php endif; ?>
```

###for文

```
<?php for($i = 0; $i > 10; $i++): ?>
<?php endfor; ?>
```

###現在のURL取得

```
<?php echo $_SERVER["REQUEST_URI"]; ?>
```

###ドメインのみ取得

```
<?php echo $_SERVER["SERVER_NAME"]; ?>
<?php echo $_SERVER["HTTP_HOST"]; ?>
```

###ドキュメントルート取得

```
<?php echo $_SERVER['DOCUMENT_ROOT']; ?>
<?php echo dirname(__FILE__); ?>
```
##バック系

###PhpMyAdminのデータベース作成方法
1.右上のあたりにあるNEWをクリック
<img width="341" alt="SS 283.png" src="https://qiita-image-store.s3.amazonaws.com/0/130133/d74fb7b1-e015-e4e0-e9c3-0d250917db32.png">

2.NEWを押すと右のエリアがデータベース作成画面になるので、データベース名は任意の文字列。照合順序はutf8_general_ciを選択。作成をクリック。
<img width="692" alt="SS 284.png" src="https://qiita-image-store.s3.amazonaws.com/0/130133/dbd0bcc1-127e-6a65-f391-962e6fea161b.png">

3.すると左のエリアのデータベース一覧に追加されます
<img width="238" alt="SS 285.png" src="https://qiita-image-store.s3.amazonaws.com/0/130133/d9eb2598-c617-b9ab-7550-258711e98d9b.png">

4.データベースはざっくりデータベース＞テーブル＞カラムのような感じで構成されているんですが、データベースを作成すると次は自動的にテーブルを作成する画面になります。下の画像を見ればわかるように、この時同時にそのテーブルの所有するカラム数を決めることができます（あとで追加もできるよ）。
<img width="522" alt="SS 286.png" src="https://qiita-image-store.s3.amazonaws.com/0/130133/cf344bfc-1c09-bf2f-4441-7b40767c0bca.png">

5.任意のテーブルを作成すると、カラムの設定に移ります。今回はログイン画面を作るのを想定して記入して見ました。データ型は適当です（よく使うシリーズを見せたかったw）。データ型ってのは、長文向きのものから短文向き、数字オンリーとか画像とか色々あります。
<img width="600" alt="SS 291.png" src="https://qiita-image-store.s3.amazonaws.com/0/130133/04ade496-7f08-bc9d-1148-936361531ef3.png">

6.一番上のidっていうのはオートインクリメントって言って自動で付与されるIDです。ようはシリアル番号的なやつですね。これを設定するには結構右側の欄にあるこの項目をこう設定します。このAIっていうのがオートインクリメントの略です。ちなみにデータ型はINTです。
<img width="199" alt="SS 289.png" src="https://qiita-image-store.s3.amazonaws.com/0/130133/533980d3-1719-b718-e532-e1594873a24d.png">

7.したらば完了。これでphpMyAdmin上でのデータベース、テーブル、カラムの作り方は完了です。SQL文でも上の一連の作業を行うことができます。


###PDO

```
//データベースへ接続
$db_host='hostName';
$db_name='detabaseName';
$db_user='detabaseUserName';
$db_pass='detabasePassword';

try {
 $pdo = new PDO("mysql:dbname=$db_name;host=$db_host;charset=utf8","$db_user","$db_pass");
} catch (PDOException $e) {
die($e->getMessage());
}
if(!$pdo){
	die('クエリーが失敗。');
}

```
UnityでBuild Settingsによる実機テスト時のエラー

Unity使用歴一か月ほどの自分がアンドロイド用のアプリを作っていた際に、Build Settingsの内容が原因でビルドが出来なくなった時の解決方法です。

自分はこのエラーの解決に時間がかかったのですが、Unityへの理解が深い人は画像を見ただけで一発で分かるかもしれません…

##開発環境
自分：Windows, unityのバージョン2018.2.10f1
相方：Mac, Unityのバージョン違う（正確には覚えてないけど、1.xxとかだった気がする…）

**この時点でおかしい。**
**バージョン揃えろよ俺！**

###このような状況になった原因
　相方が作ったUnityのシーンなどをexport→自分のUnityにimportしました。この時お互いのUnityのバージョンが違ったせいか、importしたときにうまくいったものと、いかなかったものがありました。また、importした際に何故かSceneが複製されており、元のシーンの倍ぐらいに増えていました。ですが、作ったSceneの数を互いに共有していなかったために初めはそのことに気が付かないままScene In Buildに並べ、動作させた。上手く動作した（恐らくimportした際にScriptは複製されていなかったので余計なシーンがSettingされていても呼び出されることはないためエラーが起きなかっただけ）。
　無駄なシーンファイルが多いことに気が付いてassetsフォルダ内のSceneフォルダから削除したものの、**Scene In Build内はいじらずそのまま**。←これがいけなかった

##エラーメッセージ
エラーメッセージは以下の画像のタスクバーのすぐ上の赤字の部分
Unity Editor.BuildPlayerWindow+BuildMethodException:"is an incorrect path for a scene file. BuildPlayer expects paths relative project folder.
と表示されているのが分かると思います。
![ビルドエラー.PNG](https://qiita-image-store.s3.amazonaws.com/0/281110/d8420610-8550-af07-8d7d-d00a27d31e01.png)
このエラーメッセージから自分はシーンファイルのパスが正しくないんだな、というとこまではわかりましたが、どのファイルの事を指しているのかが全然わかりません。数日これで何も進まなかったのですが、ふとBuild SettingsのScene In Buildの上のほうに空白のシーン、右側にDeleteと書いてあることに気が付きました。そこを押して実際に使用するシーンだけを残したところ正常に動くようになりました！
##解決方法
**Build SettingsのScene In Buildにあるなんの情報も持っていないシーンを消した**

#結論

- Sceneフォルダ内のSceneを削除してもBuild SettingsのScene In Buildからは削除されないのでちゃんとそちらも削除する！
- 複数人開発をするときは必ずバージョンを揃える！
- 情報共有は大事！

このような事態をまだ経験が浅い今のうちに体験しておいてよかったと思いますｗ皆さんもUnityのバージョンの確認はしっかりと確認しておきましょうね。
ローカルスナップショット削除

パージ可能なのに使えないストレージを使えるようにローカルスナップショットを削除

```php:test.php
<?php
$aa=shell_exec("tmutil listlocalsnapshots /");
$aa=explode("\n", $aa);
foreach ($aa as $a) {
if ($a=='') {
continue;
}
$l=explode(".", $a);
$c="tmutil deletelocalsnapshots ".$l[3];
// print $c."
// ";
shell_exec($c);
}
?>
```
AthenaでELBのログを解析できるようにする

各所に同じようなコンテンツがあるのですが、AWS側でログフォーマットが変わったりで新旧のログを見ようと思うとうまく見れなかったので作りました。

参考にしたサイトは以下になります。
[Athenaでパースできるログフォーマットを指定する](https://www.null-engineer.ml/2018/01/08/athena%E3%81%A7%E3%83%91%E3%83%BC%E3%82%B9%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%AD%E3%82%B0%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B/)
[Amazon Athena RegexSerDe を利用して ALB ログを探索する(2018年8月版)](https://dev.classmethod.jp/cloud/aws/amazon-athena-alblog-activity-using-regexserde-2/)

```
CREATE EXTERNAL TABLE IF NOT EXISTS elb_logs (
type string,
request_timestamp string,
elb_name string,
client_addrport string,
client_ip string,
client_port int,
target_addrport string,
target_ip string,
target_port int,
request_processing_time decimal(8,6),
target_processing_time decimal(8,6),
response_processing_time decimal(8,6),
elb_status_code string,
target_status_code string,
received_bytes int,
sent_bytes int,
request_verb string,
url string,
protocol string,
user_agent string,
ssl_cipher string,
ssl_protocol string,
target_group_arn string,
trace_id string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1',
  'input.regex' = '([^ ]*) ([^ ]*) ([^ ]*) (([^ ]*):([^ ]*)|-) (([^ ]*):([^ ]*)|-) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*) ([^ ]*) ([^"]*)\" \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) \"([^\"]*)[ ]*\".*$'
) 
LOCATION 's3://<バケット名>/AWSLogs/082750195178/elasticloadbalancing/<リージョン名>/'
TBLPROPERTIES ('has_encrypted_data'='false');
```
「基礎になる接続が閉じられました」というエラーが発生する問題

# ■現象
HttpWebRequestクラスを使いHTTPアクセスする際に、以下のエラーメッセージが出力され、
通信エラーになる。
**基礎になる接続が閉じられました: 維持される必要があった接続が、サーバーによって切断されました**

リクエスト先のURLは、BASIC認証がかけられており、リクエストする都度認証を通す必要がある。

# ■原因
必ず発生する訳ではなく、再現させることも出来ない。
はっきりとした原因は不明。
KeepAliveをデフォルト値(true)にしていたため、セッションが使いまわされることにより何らかの理由で発生したのか？
試行錯誤して以下対応によりエラーを回避することが出来た。

# ■対応
以下の1文を追加する。
req.KeepAlive = false;

```C#
//HTTPリクエストを作成する
HttpWebRequest req = PathUtil.getHttpWebRequest(uploadURL, true, new NetworkCredential("ユーザーID", "パスワード"));
req.Method = "POST";
req.KeepAlive = false;
request.PreAuthenticate = true;
```
SWI-Prolog で JSON ファイルを更新

```text:json_update.pl
/* ------------------------------------------------------------------- */
/*
	json_update.pl

						Oct/18/2018
*/
/* ------------------------------------------------------------------- */
:- use_module([ library(http/json) ]).
:- initialization main.
 
/* ------------------------------------------------------------------- */
% [8]:
data_out_proc(File_out,Dict) :-
	tell(File_out),
	json_write_dict(current_output, Dict),
	told.
/* ------------------------------------------------------------------- */
% [6]:
update_proc(Dict,Key_in,Population_in) :-
	dict_keys(Dict,Keys),
	length(Keys,Ll),
	writeln(current_output , Ll),
%
	get_dict(Key_in, Dict, Value),
	writeln(current_output , Value),
	Name = Value.name,
	get_time(TimeStamp),
	stamp_date_time(TimeStamp,DateTime,-32400),
	format_time(atom(Date_today), '%Y-%m-%d', DateTime, posix),
	Value_new = _{date_mod:Date_today,name:Name,population:Population_in},
	writeln(current_output , Value_new),
	b_set_dict(Key_in,Dict,Value_new).
%
/* ------------------------------------------------------------------- */
% [4]:
reading_JSON_term(File_in,Dict) :-
	write(File_in),nl,
	open(File_in, read, Stream, [] ),
	json_read_dict(Stream, Dict, []),
	close(Stream).
%
/* ------------------------------------------------------------------- */
main(Argv) :-
	format('*** 開始 ***\n'),
	format('Argv: ~w\n', [Argv]),
	[File_in|Yy] = Argv,
	[Key_in|Zz] = Yy,
	[Population_in|_] = Zz,
	write(Key_in),nl,
	write(Population_in),nl,
%
	reading_JSON_term(File_in,Dict),
%
	update_proc(Dict,Key_in,Population_in),
%
	data_out_proc(File_in,Dict),	
%
	format('*** 終了 ***\n'),
	halt.
%
/* ------------------------------------------------------------------- */
```

実行方法

```bash
swipl -f ./json_update.pl /var/tmp/json/cities.json t0924 3987100
```
Node.jsのバージョンをプロジェクト毎に使い分ける

# TL;DR
`nvm` と `direnv` を使ってプロジェクト毎にNode.jsのバージョンを使い分ける。

# どうやって？
## 使用するツール
- `nvm` : Node.jsのバージョン管理ツール
- `direnv` : 環境管理ツール

Macを使っている人は ` $ brew install direnv nvm` で入れちゃいましょう。


## 各種設定
### nvm
プロジェクトのルート直下に以下を記述

```text:.nvmrc
8.12.0 // 使いたいバージョン
```

### direnv
プロジェクトのルート直下に以下を記述

```text:.envrc
export NODE_VERSIONS=~/.nvm/versions/node
export NODE_VERSION_PREFIX=v
set -e
use node
```

（`$NODE_VERSIONS` と `$NODE_VERSION_PREFIX` の宣言はここじゃなくてもいいです。）


これで以上です！

## 参考資料
https://github.com/direnv/direnv/wiki/Node
https://github.com/creationix/nvm#nvmrc
https://github.com/direnv/direnv/issues/207
時系列解析ライブラリProphet　公式ドキュメント翻訳2（インストール編）

Facebookが公開している時系列解析用のライブラリProphetの公式ドキュメントを翻訳していきます。

目次
[1.Prophet公式ドキュメント翻訳（概要＆特徴編)](https://qiita.com/japanesebonobo/items/96868e58d4da42d36807)
**2.Prophet公式ドキュメント翻訳（インストール編)**
[3.Prophet公式ドキュメント翻訳（クイックスタート編）](https://qiita.com/japanesebonobo/items/6f3234adb592f73bafbf)
[4.Prophet公式ドキュメント翻訳（飽和状態の予測編）](https://qiita.com/japanesebonobo/items/9a5a5a13440e90f06f30)
[5.Prophet公式ドキュメント翻訳（トレンドの変化点編）](https://qiita.com/japanesebonobo/items/26cccef8ee9d45006093)
[6.Prophet公式ドキュメント翻訳（周期性・イベント効果・説明変数の追加編）](https://qiita.com/japanesebonobo/items/e674359618a879a49c05)
[7.Prophet公式ドキュメント翻訳（増加し続ける周期性編）](https://qiita.com/japanesebonobo/items/ed02f49ea66eab432af8)
[8.Prophet公式ドキュメント翻訳（誤差の間隔編）](https://qiita.com/japanesebonobo/items/f1acdd4ec1a1d0948553)
[9.Prophet公式ドキュメント翻訳（外れ値編）](https://qiita.com/japanesebonobo/items/4eb36710c689bca80c71)
[10.Prophet公式ドキュメント翻訳（1日単位ではないデータ編）](https://qiita.com/japanesebonobo/items/7062dd300a14bda4f84b)
[11.Prophet公式ドキュメント翻訳（モデルの診断編）](https://qiita.com/japanesebonobo/items/2266729f849868581011)
[12.Prophet公式ドキュメント翻訳（ヘルプ編）](https://qiita.com/japanesebonobo/items/08f85d74371240568fff)

2018/10/17公開。原文リンクは以下。
・Prophet概要＆特徴：https://facebook.github.io/prophet/
・公式ドキュメント：https://facebook.github.io/prophet/docs/quick_start.html

今回の記事はProphetのインストール編です。
![スクリーンショット (88).png](https://qiita-image-store.s3.amazonaws.com/0/296645/6f692e06-d976-cdd5-8a04-361ed3305038.png)
#Rでインストール
ProphetはCRANのパッケージです。したがって``` install.packeges```を使えます。

```R
> install.packages('prophet')
```
インストール後、すぐに開始できます。クイックスタートを参考にしてください。
###Windowsの場合
Windowsでは、Rはコンパイラを必要とします。詳細はrstanが提供しているインストラクション(1)に従ってください。その中で最も重要なステップはパッケージのインストールを試す前に、Rtools(2)をインストールすることです。

もしStanコンパイラの設定をカスタムしている場合は、CRAN(バイナリ)ではなくソースをインストールして下さい。

(1)https://github.com/stan-dev/rstan/wiki/Installing-RStan-on-Windows
(2)https://cran.r-project.org/bin/windows/Rtools/
#Pythonでインストール
ProphetはPyPIにあります。したがってインストールにはpipが使えます。

```py
pip install fbprophet
```
Prophetが最も依存しているのはPyStanです。PyStanにはインストールのインストラクション(1)があります。```pip install fbprophet```を使う前に、インストラクションを参考にしてpystanをインストールして下さい。
インストール後、すぐに開始できます。クイックスタートを参考にしてください。
###Windows
WindowsではPyStanはコンパイラを必要とします。インストラクション(2)を参考にしてください。インストールにおいて最も重要なステップは最新のC++コンパイラ(3)をインストールすることです。

###Linux
まず、コンパイラを確かめてください (gcc、g++、build-essential)。 次にPython development tools(python-devまたはpython3-dev)がインストールされていることを確かめてください。Red Hatの場合はgcc64とgcc64-c++パッケージをインストールして下さい。もし仮想マシンを使っている場合は、fbprophetのインストールの際に最低でも4GBのメモリが必要です。また、fbprophetの使用には最低でも2GBのメモリが必要です。
###Anaconda
gccのセットアップにはcondaのinstall gccを使って下さい。Prophetをインストールする最も簡単な方法は、conda-forgeを使うことです。```conda install -c conda-forge fbprophet```でインストールできます。

(1)http://pystan.readthedocs.io/en/latest/installation_beginner.html
(2)http://pystan.readthedocs.io/en/latest/windows.html
(3)http://landinghub.visualstudio.com/visual-cpp-build-tools