OmniAICreator/Qiita-1.07M huggingface dataset:
java.time.LocalTimeのtoString

java.time.LocalTimeのtoStringは秒が0のとき出力されないのが残念だった。。

LocalTime.of(14,30) -> 14:30:00 って出力されてほしい。


    @Override
    public String toString() {
        StringBuilder buf = new StringBuilder(18);
        int hourValue = hour;
        int minuteValue = minute;
        int secondValue = second;
        int nanoValue = nano;
        buf.append(hourValue < 10 ? "0" : "").append(hourValue)
            .append(minuteValue < 10 ? ":0" : ":").append(minuteValue);
        if (secondValue > 0 || nanoValue > 0) {
            buf.append(secondValue < 10 ? ":0" : ":").append(secondValue);
            if (nanoValue > 0) {
                buf.append('.');
                if (nanoValue % 1000_000 == 0) {
                    buf.append(Integer.toString((nanoValue / 1000_000) + 1000).substring(1));
                } else if (nanoValue % 1000 == 0) {
                    buf.append(Integer.toString((nanoValue / 1000) + 1000_000).substring(1));
                } else {
                    buf.append(Integer.toString((nanoValue) + 1000_000_000).substring(1));
                }
            }
        }
        return buf.toString();
    }
WindowsのUbuntu上でMySQLを起動する





#MySQLの起動
ここは単純にMySQLを呼び出してみます

```.bash
$ mysql

#=>ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```

グーグル先生曰く「ソケット経由でローカルのMySQLサーバに接続できません」だそうです

今度はローカルホストを指定してみます

```.bash
$ mysql -h 127.0.0.1

#=>ERROR 1045 (28000): Access denied for user 'ユーザー名'@'localhost' (using password: NO)
```

通信はできましたが今度はユーザー名とパスワードがないそうです
初期設定でのユーザー名のrootとパスワードを付け加えます

```.bash
$ mysql -h 127.0.0.1 -u root -p

#=>Enter password:
```
パスワードの要求が来ました、さっそく入れてみましょう

```.bash
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 30
Server version: 8.0.12 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```
来ました、これで起動完了です

コマンドラインを見れば確かに当然かな？と思える内容ですがここまで来ると爽快感があります

とにかくこれでMySQLをUbuntu上で起動することができました

この記事が次にMySQLを使おうと思っている人たちの参考になれば幸いです
しょぼいエンジニアの時短術 vol1. ストレスフリーな「EXCEL新規作成」

# EXCELのブックを新規作成して名前をつけて開くのを簡略化する。

エンジニアだとソースコードを書くだけでなく、EXCELファイルを作成することは多いと思います。
EXCEL起動はショートカット設定しておけばいいけど、問題は名前をつけるのがあとまわしになることで、書いたはいいけど、閉じるときにどこに保存するか名前どうするか迷うことないですか？

「新しいファイル」みたいな適当な名前をマイクロソフトが勝手につけてくれますが、以下のフローがやりやすい人が大多数だからだと思います。で、保存するページは毎回選べと。
1. EXCELを起動
2. なにか作業する
3. どこに保存するか決める
4. 名前をつける
5. 保存する

ですが、自分的には以下のフローのほうがいいなと思いました。
1. どこに保存するか決める（決めておく）
2. 名前をつける
3. EXCELを起動
4. なにか作業する
5. 保存する

なぜなら、作業やるときに、その作業を「何をやるか」を意識するために名前をつけるべきだと思います。
ファイル名は作業の内容を端的に表します。
でも、officeの標準はそうなっていないので、それを矯正付けるためにプログラムに頼ろうということで、バッチを書きました。

# ソースコード
```batch:create_new_excel.bat
@echo off
REM  set dir
set /p NEW_FILE_NAME="enter new excel file name: "
set NEW_FILE_DIR=C:\tmp\work\doc
set BASE_FILE=C:\tmp\src\run_office\template.xlsx
set dt=%date%
set tm=%time%

REM new filename is {entering new name}_YYYYMMDD.xlsx
set NEW_FILE_FULLNAME=%NEW_FILE_NAME%_%date:~0,4%%date:~5,2%%date:~8,2%.xlsx

REM if you want {entering new name}_YYYYMMDD_HHMMSS.xlsx, use this
REM set NEW_FILE_FULLNAME=%NEW_FILE_NAME%_%date:~0,4%%date:~5,2%%date:~8,2%_%tm:~0,2%%tm:~3,2%%tm:~6,2%.xlsx

REM check saving change option /-Y
copy /-Y %BASE_FILE% %NEW_FILE_DIR%\%NEW_FILE_FULLNAME%

echo "NEW FILE NAME:"
echo %NEW_FILE_DIR%\%NEW_FILE_FULLNAME%

REM Run Excel.exe new file
"C:\{directory in your office exe}\EXCEL.EXE" %NEW_FILE_DIR%\%NEW_FILE_FULLNAME%

exit

```

## 解説

### 前準備
4,5行目で、保存するフォルダ（予め決めておく、私は一時フォルダのworkにどんどん投げ込みあとで整理することにしています）とコピーするテンプレートのファイル。自分はシートもたくさんあると邪魔なので、1シートだけにした空のエクセルファイルをおいておきます。

### ファイル名
9行目では、入力したファイル名に今日の日付をつけます。11行目に、年月日時分秒の場合をつけたので好きな方を使いましょう

### EXCEL起動
EXCELの起動は.exeを直接叩くかたちにします。

### 文字コード
自分はvisual studio codeのエディターを使っていて基本、UTF-8のファイルにしていますが、普通はコマンドプロンプトはSHIS-JISの方がお多いと思います（自分もそうです）。で、コメントやechoがバグらないように英語でコメント書いてますが、あまり意味はないです。もちろん、入力したファイル名は日本語でOKです。

# 終わりに
batchファイル、文法に癖があって敬遠してましたが、時短だけでなくストレスフリーな仕事をするためにも、ちょくちょく入れていこうかなと思い書いています。どんなシステムでも標準の業務フローが想定されて、作られています。Microsoft Officeもそうです。ですが、「それは、本当にいいフローなのか？変えられないのか？」を考える習慣はもっていたいですね。
HTML5のrequiredが効かない

#qiita初投稿練習
##HTML5のrequiredが効かない。

HTML5のformを利用するときにrequiredが効かない。
どうやらjqueryからsubmitするとあかんらしい。

```javascript:onclick.js

		for(var i=0;i<$("[name=Checkbox]").length;i++){
			if($("[name=koumokuName]").eq(i).val()==""){
				alert("空白があります")
				return;
			}
		}
		document.form1.submit();
```
Mac—AlfredのClipboard History拡張がカラーコードを変換してくれた


なんだこれ！ と思った。

![image](https://user-images.githubusercontent.com/13635059/44132075-ed4bb2fc-a091-11e8-9f48-f32078259660.png)

Clipboard History の動作なのかAlfredの何らかの基本動作が絡んでいるのかは不明。(調べていない)

## 参照

- [Gist](https://gist.github.com/YumaInaura/965f4e5bc90a0a62fa426d82c78e0382)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
1つのフォルダに置いた複数のcsvファイルをまとめて1つのdataframeにする


-globを使ってファイルパスを生成します。
-プログレバーを表示したかったので、tqdmを利用しています。
-日本語が含まれるファイルパスで、それによるエラーを回避するため、engine='python'を追加しています。
-ちょうどindexにしたいものが、Unnamed: 0にあったので、set_index('Unnamed: 0')しています。
-あとあと、重複データがあると困るので、重複確認をしています。any().any()は速度上若干不利らしいですが、わかりやすいので、使っています。



~~~python
import glob
import sys

import pandas as pd
from tqdm import tqdm


def csvs_to_one_df(path):
    df = pd.DataFrame()

    for file_path in tqdm(glob.glob(path), desc='csv loading'):
        data = pd.read_csv(file_path, dtype=object, engine='python')
        data.columns = data.columns.str.strip()
        data = data.set_index('Unnamed: 0')
        data = data[data.index.notnull()]
        df = pd.concat([df, data])

    df = df.sort_index()

    if df.duplicated().any().any():
        sys.exit('error:重複データあり')

    return df
~~~
【エラー解決】React NaitveでシミュレーターがCommand+Rで起動しない件を解決

#概要

久しぶりにコードを見たり書いたりしてます。

今回、React Naitiveが気になって環境構築し、簡単にコードを書いてシミュレーターを起動し、挙動を確認しようと思ったら、表示されずにハマってしまったので、なにをして解決したのかを書きます。

<img width="1362" alt="React Naitive Error.png" src="https://qiita-image-store.s3.amazonaws.com/0/97880/682d9d18-5451-c204-498a-979f474657b3.png">

<font color="OrangeRed">添付画像（iosシミュレーター上）</font>のように、
ターミナルで``react-native run-ios``を押下しても、全く反応せず。

###解決したこと


シミュレーターを選択し、メニューの「Hardware」 => 「Keyboard」 => 「Connect Hardware Keyboard」を確認し、チェックが入っているかを確認してください。

<img width="922" alt="スクリーンショット_2018-08-15_13_14_19.png" src="https://qiita-image-store.s3.amazonaws.com/0/97880/44f73ac7-c393-9c1e-bdbb-b23e85da6105.png">

これでも反応しなかったのですが、再度ターミナルで``react-native run-ios``を押下したら、起動するようになりました。


[![Image from Gyazo](https://i.gyazo.com/61b8650747a9354bb1a24caff0564a84.gif)](https://gyazo.com/61b8650747a9354bb1a24caff0564a84)

###参考記事
[React Nativeでcommand+Rで変更を反映させることができない](https://teratail.com/questions/86800)

[Reload app in iOS simulator using Command-R not working
](https://stackoverflow.com/questions/39939831/reload-app-in-ios-simulator-using-command-r-not-working)
今更ながら、CloudFormation で ElastiCache を構築した。

## はじめに
ElastiCache を使いたいって話が出たので、コンソールからポチポチ作ろうと思ったんです。
どうせならと思い、CloudFormation を使ってデプロイできるようにすれば、何回も同じことしなくてもいいっしょ、てな考えから作ってみました。

## やってみた
### 作るもの
- Memcached(Multi AZ)
- Redis Cluster

### テンプレート
JSON は人が書くものじゃないと思っているので、yaml で。初めて作ったんでこんなもんでしょ。
VPC とサブネットは作成済みだったんで、ID を指定しているだけです。

```yaml:
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  Subnet1:
    Type: String
    Default: [ゾーンAのサブネットID]
  Subnet2:
    Type: String
    Default: [ゾーンCのサブネットID]
  SGName:
    Type: String
    Default: [EC2メニューで作ったセキュリティグループID]
  InstanceType:
    Type: String
    Default: cache.r4.large
Resources:
  ECacheSubnet:
    Type: 'AWS::ElastiCache::SubnetGroup'
    Properties:
      CacheSubnetGroupName: elasticache-subnet-group
      Description: elasticache-subnet-group
      SubnetIds:
        - !Ref Subnet1
        - !Ref Subnet2
  ECacheMemdPG:
    Type: 'AWS::ElastiCache::ParameterGroup'
    Properties:
      CacheParameterGroupFamily: memcached1.4
      Description: "memcached cluster Params"
  ECacheRedisPG:
    Type: 'AWS::ElastiCache::ParameterGroup'
    Properties:
      CacheParameterGroupFamily: Redis4.0
      Description: "redis cluster Params"
      Properties:
        cluster-enabled: "yes"
  ECacheMemd:
    Type: 'AWS::ElastiCache::CacheCluster'
    Properties:
      AutoMinorVersionUpgrade: false
      AZMode: cross-az
      CacheNodeType: !Ref InstanceType
      CacheParameterGroupName: !Ref ECacheMemdPG
      CacheSubnetGroupName: !Ref ECacheSubnet
      ClusterName: memcached-cluster-01
      Engine: memcached
      EngineVersion: 1.4.34
      NumCacheNodes: 2
      Port: 11211
      PreferredAvailabilityZones:
        - ap-northeast-1a
        - ap-northeast-1c
      PreferredMaintenanceWindow: 'sun:17:00-sun:20:00'
      VpcSecurityGroupIds:
        - !Ref SGName
  ECacheRedis:
    Type: 'AWS::ElastiCache::ReplicationGroup'
    Properties:
      AutomaticFailoverEnabled: true
      AutoMinorVersionUpgrade: false
      CacheNodeType: !Ref InstanceType
      CacheParameterGroupName: !Ref ECacheRedisPG
      CacheSubnetGroupName: !Ref ECacheSubnet
      Engine: redis
      EngineVersion: 4.0.10
      NodeGroupConfiguration:
        - PrimaryAvailabilityZone: ap-northeast-1a
          ReplicaAvailabilityZones:
            - ap-northeast-1a
            - ap-northeast-1c
        - PrimaryAvailabilityZone: ap-northeast-1c
          ReplicaAvailabilityZones:
            - ap-northeast-1c
            - ap-northeast-1a
      NumNodeGroups: 2
      Port: 6379
      PreferredMaintenanceWindow: 'sun:17:00-sun:20:00'
      ReplicationGroupDescription: redis-cluster-01
      ReplicationGroupId: redis-cluster-01
      ReplicasPerNodeGroup: 2
      SecurityGroupIds:
        - !Ref SGName
```

### 出来なかったこと
- パラメータグループに任意の名前を付けることができなかった
    - CLI だとできるから、CloudFormation が未対応な模様

## やってみた感想
初めて CloudFormation を使ったんですが、ドキュメントをちゃんと読めばできる。
ただ、CloudFormation が対応していないものがあるとは思ってなかったから、そこは CLI に頼るか、機能が追加されるのを待つか。

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html
SQLAlchemy ORM での foreign key 削除

データベースの[ON UPDATE と ON DELETE](http://docs.sqlalchemy.org/en/latest/core/constraints.html#on-update-and-on-delete)の機能と、ORMレベルでの[delete](http://docs.sqlalchemy.org/en/latest/orm/cascades.html#delete)機能がある。

ORM 側に囲み記事がある通り、この二つは機能的に重複していて、挙動に注意が必要になる。超意訳してみる。

まずデータベースでの `ON DELETE` は many-to-one の many 側に記述するが、ORM では逆転して one-to-many 側に記述する。両方同時に書くと次のようになる。

```python
from sqlalchemy import event, ForeignKey
from sqlalchemy.orm import relationship, backref
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class A(db.Model):
	__tablename__ = "a"
	k = db.Column(db.String, primary_key=True)
	bs = relationship("B", backref="a", cascade="all") # one 側であるAに記述

class B(db.Model):
	__tablename__ = "b"
	k = db.Column(db.String, primary_key=True)
	a_id = db.Column(db.String, ForeignKey("a.k", ondelete="CASCADE")) # many 側であるBに記述
```

一般的に `ON DELETE` は「親が消されないようにする」ために使われる。同様の挙動を ORM で実現したい場合は次の 2 通りの方法がある。前提知識として、ORM のデフォルトの挙動では、外部キーを NULL に更新する。1.) 外部キーを保持するカラムに `NOT NULL` 制約を付けて、ORM のデフォルトの挙動を阻害する。2.) cascade="all" に `passive_deletes` フラグをつけると、外部キーを NULL に設定することなく親が消される。この場合データベースレベルでの何らかの仕組みを併用する。

データベースレベルでの `ON DELETE` は効率が良い。一方で ORM ではひとつずつ `DELETE` が実行される。

[`passive_deletes`](http://docs.sqlalchemy.org/en/latest/orm/collections.html#passive-deletes) をうまく使え。

`ON DELETE` は many 側でのみ動作するように、SQLAlchemy でも逆向きに使って many 側で設定すること自体はできる。実用的には one-to-one の場合で、この場合は `single_parent` フラグを設定しよう。
JavaScript 変数の巻き上げと対策

## 変数の巻き上げ(ホイスティング:hoisting)
JavaScriptでは、関数の最後に変数を宣言したとしても、関数の先頭で変数を宣言したことと解釈される。
これを変数の巻き上げ(ホイスティング:hoisting)という。

### 例で見てみる
```javascript
var name = 'グローバル';

function func() {
  console.log(name);     //...(1)
  var name = 'ローカル';
  console.log(name);     //...(2)
}

func();
```

####結果はこうなる

```javascript
//(1) undefined

//(2) ローカル
```

###なぜこうなるのか？
JavaScriptでは、関数の最後に変数を宣言したとしても、関数の先頭で変数を宣言したことと解釈されるから。
つまり上の記述はこれと一緒。

```javascript
var name = 'グローバル';

function func() {
  var name;

  console.log(name);     //...(1)undefined
  name = 'ローカル';
  console.log(name);     //...(2)ローカル
}

func();
```


###対策
変数巻き上げはJavaScript特有の挙動で、意図しない動作を行う原因になることもある。
対策としてはシンプルで、変数の宣言はスコープの先頭で行い変数巻き上げが発生しないようにする。
C言語でC#のIList<T>を実装してみた

# はじめに
突然ですが皆さんは好きなクラスはありますか？私はList\<T\>が好きです。
そっけない名前のくせにしっかりタイプセーフな所が魅力です。
そんなList\<T\>をC言語でも使えるようにしたいという気持ちが溢れ出しそうになったので、C言語でList\<T\>っぽいものを実装してみました。

# 作ったもの
といっても、List\<T\>の全てのメソッドを実装するのはしんどいです。
しんどいので今回は[IList\<T\>](
https://msdn.microsoft.com/ja-jp/library/5y536ey6(v=vs.110).aspx)で定義されているインターフェースだけ実装しました。

ソースコードは下記を参照ください。
https://github.com/nendo-code/CSList
CSList.hがIList\<T\>を実装したものになります。

# CSList.hを使ってみる
CSList.hを使って下記のコードをC言語で実装してみます。

**C#版コード**

```c#:ListMain.cs
using System.Collections.Generic;
public class ListMain{
    public static void Main(){
        IList<int> list = new List<int>();
        list.Add(1);
        list.Add(2);
        list.Add(3);
        foreach(int item in list){
            System.Console.WriteLine(item);
        }
    }
}
```

**C言語版コード**

```c:ListMain.c
#include "CSList.h"
#include <stdio.h>

CSList_use(int)

int main(int argc, char const *argv[]){
    CSList(int) list = CSList_new(int);
    list->Add(list,1);
    list->Add(list,2);
    list->Add(list,3);
    CSList_foreach(int,item,list){
        printf("%d\n",*item);
    }CSList_foreach_end
    CSList_delete(list);
    return 0;
}
```

あまり違和感無くC言語でもList\<T\>っぽい実装ができているかと思います。
IList\<T\>で定義している程度のメソッドは実装されていますので、詳しく使い方を知りたい方は[example.c](https://github.com/nendo-code/CSList/blob/master/example.c)を参考にしてみてください。
組み込みなどPC以外の環境で使う場合は[CSList_conf.h](https://github.com/nendo-code/CSList/blob/master/CSList_conf.h)で環境に合わせた設定に書き換えて使って下さい。

# 感想
今回作ったCSListはC言語でジェネリックを実現するためにマクロを多用して実装しているのですが、黒魔術感が半端なく、デバッグがやや面倒でした。
が、頑張ったおかげでいちおうタイプセーフ（型の指定が違うとコンパイラがワーニングを吐くよ）なリストが出来たので満足しました。
Dataframeの不要な列を取り除く方法


#Dataframeから、columnが特定の文字列で始まる列をまとめて取り除く方法

##少しだけ列を簡単に取り除く
dropを使えばわりと簡単ですが、書き下す必要があって面倒です。


~~~python
df.drop(columns=[column1, column2, ...])
~~~

## 複数の列を同時に取り除く

大量のcolumnsを持つdataframeから、特定の文字列、例えば'filter'で始まるcolmunsの列データだけ取り除いたdataframeを取得したかったので、以下のようにしました。


~~~python
df.loc[:, [not s.startswith('filter') for s in df.columns.tolist()]]
~~~


columnsをリストにしてから1つ1つcolumn名を取りだして、指定の文字列（ここでは'filter'）で始まるかを判定した上で、条件に当てはまるところを削除したいので、notをつけて真偽判定を逆にしています。
Androidで複数の画像を選択する方法

自前で作る必要があるのかと思ったら、intentにわたす値で指定することができた。

```kotlin
        val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
        intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/jpeg","image/png"))
        activity?.startActivityForResult(intent, requestCode)
```
Docker Compose のインストール

やってみたのでメモ。こちらもそのまま公式ドキュメントの手順をなぞっただけだけど。

# 手順
1. Githubからバイナリをインストールする（バージョンは[Compose repository release page on GitHub](https://github.com/docker/compose/releases)を確認）

    ```
    # curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
    ```

2. 実行権限を付与する

    ```
    # chmod u+x /usr/local/bin/docker-compose
    ```

3. バージョンを確認する

    ```
    # docker-compose --version
    ```

# 参考
- [公式ドキュメント - Install Docker Compose](https://docs.docker.com/compose/install/#install-compose)
- [公式ドキュメント - Command-line completion](https://docs.docker.com/compose/completion/)
vue.jsで「数字」しか入力できないinput要素を作る

# 2020/06/01追記
[[今度こそ完全に理解した]vueで数字しか入力できないinputタグのカスタムコンポーネントを作る](https://qiita.com/rh_taro/items/c44d2c6783c27d6bdd03)
の方で諸問題に対応したコードを公開したのでそちらを参照して頂けると。。。

# 「数字」とは
ここでいう「数字」というのは
「0」「1」「2」「3」「4」「5」「6」「7」「8」「9」
です

# 「type="number"」だと
「数値」の入力フォームになるので上記の「数字」の他に「e」「.」「-」などが入力可能

# ~~解決策~~
~~泥臭い方法しか思いつかず、正規表現で数字以外を取り除くようにしました~~
~~うーん、ダサい！~~

```vuejs:フォーム
<input @input="validate" v-model="numValue">
```

```vuejs:メソッド
validate() { 
  this.numValue = this.numValue.replace(/\D/g, '')
}, 
```

### 正規表現
`\D`は数字以外にマッチ
`g`は全体で複数箇所マッチさせるグローバルサーチというオプション

## vue.js以外
タイトルに「vue.jsで」って書きましたがたぶんvue以外でも普通に動くと思います
AWS SAMのLambda (Python)で環境変数で設定した値を配列で受け取る

環境変数に設定された値は文字列としてしか取得できません。

なのでos.getenv()で値を取得したあとsplit()で配列化します。
ついでにstrip()も呼んでスペースも除去します。コードはこんな感じです。

```py
array = [x.strip() for x in str(os.getenv('(環境変数名)')).split(',')]
```

yamlファイルはこんな感じです。

```yaml
Resources:
  Lambda:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: lambda_function.lambda_handler
      Runtime: python3.6
      CodeUri: .
      MemorySize: 128
      Role:
        Fn::GetAtt:
        - LambdaRole
        - Arn
      Timeout: 3
      Environment:
        Variables:
          (環境変数名): 'val1, val2, val3'
```
WSL でも Resilio Sync を使う

基本的に Linux (Ubuntu) の場合と一緒。

## 環境

WSL(Ubuntu)のバージョンは以下

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"
```

##### ダウンロード
- [https://www.resilio.com/individuals/](https://www.resilio.com/individuals/)
- x64 をダウンロード

##### インストール
- [https://help.resilio.com/hc/en-us/articles/206178924-Installing-Sync-package-on-Linux](https://help.resilio.com/hc/en-us/articles/206178924-Installing-Sync-package-on-Linux)
- install
- $ wget -qO - https://linux-packages.resilio.com/resilio-sync/key.asc | sudo apt-key add -
- $ curl -LO http://linux-packages.resilio.com/resilio-sync/key.asc && sudo apt-key add ./key.asc
- $ sudo apt-get update
- $ sudo apt-get install resilio-sync

##### 起動
ターミナルから<br>
- run
- $ rslsync
で起動、その後ブラウザから [http://localhost:8888/](http://localhost:8888/) にアクセス<br>

初回はユーザ名とパスワードの登録を促される。<br>
このユーザ名パスワードはResilio Sync の Web UI にアクセスする際のユーザ認証に利用される。<br>
登録が完了すると、再度、ユーザ名とパスワードを訪ねて来て認証が通ったら Resilio Sync の Web UI が開く。<br>


![](https://gyazo.com/123163460d72e3c6af2c1be2bb0c028e.png)
pom.xmlから必要な情報を抜き出す

以下のコマンドを実行するとguice-3.0.pomから「groupId:artifactId:version」を表示する

```shell
mvn -f guice-3.0.pom -q '-Dexec.executable=echo' '-Dexec.args=${project.groupId}:${project.artifactId}:${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.6.0:exec
```

exec.argsに渡す文字列を変更すれば出力する内容は自由に変更可能。
参考: https://stackoverflow.com/a/39665194

以下のように取得することもできるが複数のパラメータをまとめてとることはできない模様。

```shell
mvn org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate "-Dexpression=project.version" -q -DforceStdout
```

参考: https://stackoverflow.com/a/3545363
Tableau Prep の使い方 - コマンドラインによる自動化

#Tableau Prep Command Line Interface (CLI)
Tableau Prep 2018.2.2 における新機能です。コマンドラインから flow ファイル (.tfl) を実行することができるようになりました。
[Tableau Prep ヘルプ](https://onlinehelp.tableau.com/current/prep/ja-jp/help.html)
[コマンドラインから出力ファイルを更新](https://onlinehelp.tableau.com/current/prep/ja-jp/help.html#prep_save_share.html#commandline)

これにより、Windows のタスクスケジューラ等を使って Tableau Prep のスケジュール実行が可能になります。
タスクスケジューラ 触ったことないよ、という方は以下の記事を参照ください。
[Windowsでbatファイルを自動実行したい時（タスクスケジューラの設定）](https://qiita.com/Richard_Roe/items/44e16841f16ee40c6113)

#.tfl ファイルをコマンドラインから実行してみる
Tableau Prep では出力形式としてローカルに csv, tde, hyper の各フォーマットで吐き出すか、Tableau Server, Tableau Online にデータソースを Publish するか選べるようになっており、コマンドライン経由でもこれらのアウトプットに対応しています。

##認証資格情報ファイルの作成
入力先となるデータソースへのログイン情報および、出力先となる Tableau Online / Tableau Server へのログイン情報を json ファイルとして定義してあげます。今回は Excel をデータソースとして試すので input は空にして、output だけ定義します。credentials.json と名前を付けて適当なディレクトリに保存します。

```json:credentials.json
{
  "inputConnections":[
 ],
  "outputConnections" : [
  {
  "serverUrl":"server to publish to URL",
  "contentUrl":"siteID",
  "username":"username",
  "password":"password"
  }
 ]
}
```

##フローの実行
コマンドラインからフローを実行するには、管理者としてコマンドプロンプトを開きます。
-h をつけて実行すると help を参照できます。
Windows:

```cmd:TableauPrepCLI
\<Tableau install location>\Tableau Prep <version>\scripts\tableau-prep-cli.bat -h
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/c5f602f7-065c-3fd3-00a4-9cb021c0b61d.png)

-c で認証資格情報ファイルを、-t で .tfl ファイルを指定できます。

```cmd:TableauPrepCLI
\<Tableau install location>\Tableau Prep <version>\scripts\tableau-prep-cli.bat -c \path\to\<credentials file>.json -t \path\to\<flow name>.tfl
```
実行結果はこんな感じです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/cd8efbd3-ae16-708a-3e3e-3fb8457faa78.png)


##タスクスケジューラに登録
さきほどのコマンドを bat ファイルとして保存し、タスクスケジューラに登録します。
詳細は [Windowsでbatファイルを自動実行したい時（タスクスケジューラの設定）](https://qiita.com/Richard_Roe/items/44e16841f16ee40c6113) を参照ください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/d54c4ad5-b6a0-72ea-d970-7eca8a94bff0.png)


#まとめ
Tableau Prep の処理を自動化することができました。~~現状は Tableau Prep CLI とタスクスケジューラの合わせ技でどうにか運用に乗りそうです~~。~~本来であれば Tableau Server の一機能としてスケジューリング設定ができれば一番よいのですが。~~
~~ちなみにスケジューリングに関する機能拡張要望はこちら↓~~
~~[Tableau Prep - add ability to schedule flows](https://community.tableau.com/ideas/8677)~~

Tableau Prep Conductor と呼ばれる製品機能が実装されました。Data Management Add-on と呼ばれる追加ライセンスを購入すると機能が使用できます。
https://www.tableau.com/ja-jp/products/add-ons/data-management

#リソース
[Tableau Prep の使い方 - LOD 表現的な計算をしてみる](https://qiita.com/tab123/items/744af3de293c4af1610a)
[はじめてのTableau Prep](https://www.sharp-sbs.co.jp/bi/tableau-prep-text.html)
ubuntuで/var/tmp配下のファイルを定期的に削除する

# はじめに

Red Hat系の場合、tmpwatchが``/var/tmp``配下にある古いファイルを削除してくれるのですが、Debian系の場合はそうではないようです。
Debian系でも、``/tmp``配下のファイルを定期的に削除する仕組みはありますが、``/var/tmp``は対象外だったようなので、定期的に削除する方法を調べました。

# やり方

Red Hat系でいうtmpwatchの代わりに``tmpreaper``というパッケージがあるため、そちらを使用します。

```shell
apt-get install tmpreaper
```

途中、セキュリティに関するドキュメントを読むのを勧めるモーダルが出て来ます。Enterキーを押下するとインストールが完了します。

次に、設定ファイルを開き、以下の3箇所を修正します。

```shell:/etc/tmpreaper.conf

# 1. 直前の文章を読み、理解した上で SHOWWARNING をコメントアウトする
# SHOWWARNING=true

...

# 2. "/var/tmp/." を追加 (不要であれば "/tmp/." の記述は削除)
TMPREAPER_DIRS='/tmp/. /var/tmp/.'

# 3. 5日以上アクセスがないと削除(デフォルトは7日)
TMPREAPER_TIME='5d'

```

# 終わりに

これで``/var/tmp``配下のファイルを定期的に削除できるようになりました。
【FileMaker】某○xcelみたいに行の間に行を追加したいんです

というお題で仕事をしたので、Tipsとして残しておきます。

要は、こういう感じです。
<img width="1026" alt="addLine1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/6f1f52fb-ccae-522f-3d5a-c4e92f9c37e0.png">

LineNo2行目と3行目の間に、行をどんどん追加していっています。
ついでにLineNo2.5行目の間にもどんどん行を追加して行きます。

普通に新規レコードを追加すると、最終行に追加されて行きます。
その部分は同じですが、今回はソート機能を使うことで、LineNo順に行が増えていくような「錯覚」を起こしています。

# テーブル設計
テーブルでは、
・シリアル番号を保持するフィールド
・新規作成行の際に自動で入るシリアル番号のフィールド
があれば十分です。
<img width="752" alt="addLine2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/871c7ed9-bf4c-e4f8-d247-8d7382457de6.png">

# スクリプト
## 単純に1行最終行に追加（青ボタン）
行の下に1行追加するスクリプトと共通で実装しています。
単純に1行追加するときは、スクリプトの引数にLineNoを指定せずに実行をします。
<img width="564" alt="addLine3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/776aa7aa-1f05-fb6f-e4ee-c72c152950ce.png">

## 行の下に1行追加（緑ボタン）
現在行をスクリプトの引数として渡し、次の行のLineNo（図中（１））との等分（図中（２））を求め、新規作成行のLineNoにします。
常に等分しますので、選択している（ボタンを押した）行のLineNoと次の行の中間の値になります。
最後に、LineNoを昇順でソート（図中（３））します。
<img width="561" alt="addLine4.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/eca0440c-fd06-4bd9-2047-381aa3482721.png">

## 行の削除（赤ボタン）
行を削除しています。
エラーを出したり削除フラグを設けない場合は、スクリプト化しなくても動きます。
<img width="497" alt="addLine5.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/dc702586-92b6-2338-1f7e-f74583997e58.png">

## データのリセット（Data Resetボタン）
行追加にはなくても問題ないですが、テストを進める時に必要だったので作りました。
テーブルデータを削除（図中（１））してシリアル番号を1に戻しています。（図中（３））
ただ、FileMakerのバージョン12〜14ではテーブルデータを1行の削除できないので、エラー処理と12〜14で実行した時でもテーブルデータが削除できるように実装しています。（図中（２））
<img width="552" alt="addLine6.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/c7071ba5-f7ed-8566-159f-9cd9ed100655.png">

# レイアウト設計
このレイアウトは、LineNoの昇順になっていることが条件なので、レイアウトが表示された段階でソートが動くようにスクリプトを作成してスクリプトトリガのonLayoutEnterで指定しています。
<img width="906" alt="addLine7.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/c9a28b89-1270-2aa0-f0e7-3b2da1e1882b.png">

# まとめ
今回のTipsのような行間に行を追加というのは、某○xcelでは標準実装ですね。
FileMakerでも同じように行間に行を追加したい、という場合、どうぞ参考にしてください。

サンプルで作成したファイルは、Githubで公開していますので、ダウンロードして動きを確認してみてください。
addLine.fmp12というファイル名です。
Github Repository : [FileMakerSample](https://github.com/atsukosekiguchi/FileMakerSample)
雨が振りそうになったらLINEに通知するIFTTTレシピ検証

#①IFTTTレシピ
![20180815-01.PNG](https://qiita-image-store.s3.amazonaws.com/0/145508/22d4fde7-f60b-8ea7-cd55-06e76116f0ee.png)
![20180815-02.PNG](https://qiita-image-store.s3.amazonaws.com/0/145508/97b99866-3c10-f1d7-ea95-c46443fb907a.png)

#②Yahoo通知
![yahoo.png](https://qiita-image-store.s3.amazonaws.com/0/145508/24d6e58a-b5d2-cc28-023d-553e07cd16f2.png)

#③LINE通知
![LINE.png](https://qiita-image-store.s3.amazonaws.com/0/145508/9face5b1-6bee-5a73-8801-bebf73995146.png)

#④検証結果
起きたら道は雨で濡れていました。
実際の雨の時間帯は…　(-_-;)
Discordのおはなし

#Discordとは
世の中にはボイスチャットのツールとして
1.Skype
2.Team Speak
3.Mumble

などなどいろいろツールがあります。
この中で、やけに重たいのが「**Skype**」。これは有名な話ですね。
ですが、昔ながらのツールとして、やはり親しまれているのはこの**Skype**でしょう。(お金つぎ込めば電話としても使えますし・・・。)

このツールの中に新たな軽い仲間が加わりました

そう。それが**Discord**。

DiscordはSkypeよりも軽く、画面共有も軽く、映像の出力も軽い。（ただし、カメラの企画、またはPCのスペックによることを知っておいてくださいな・・・。）

Discordの良い点を記載します。

1.軽い。軽すぎる。ヘリウムガス突っ込んだ風船くらい軽い。
2.アプリケーションもあるが、ブラウザでも使用ができる。
3.**Discord.js**や**Eris**を使用して、自分でjsの基本を使ってBotが作れる。

※その他もろもろあります。

その中で、Discord.jsとErisについて少しだけかじったので共有。

#Discord.jsとErisは
Discordに対して、Botを作り

###**会議に追加して通知やリプライを返す事など機能を追加することができる！**

ちなみにどちらもNode.jsを使用し、インストールすることになります。

まだまだ開発段階なのですが、ネタを言われたら返答したりするBotなおかつ、通話開始時に通知しちゃうBotを作成中。

詳細や、壁が出てきたらまた投稿します。

では、また！
Ruby on Rails でページを作成する仕組み



#はじめに
ページがブラウザに表示されるまでに、**ルーティング→コントローラ(C)→モデル(M)→ビュー(V)**という順で処理が行われている。
モデルはデータベースの情報が必要な時だけ使用するため、必要じゃない時はとばす。
railsはMVCアーキテクチャ（MVCモデル）という設計法に基づいて開発を行う。※MVCは上記頭文字

#ページ作成に必要なものについて

##①ルーティング＜ブラウザとコントローラをつなぐ＞
config/locales/routes.rb （コンフィグフォルダのローカルフォルダのルーツファイルに置かれる）

ユーザーが送信したURLに対して「どのコントローラの、どのアクション」で処理するかを決める「対応表」


ex.)ブラウザでURL(localhost:3000/home/top)を入力すると、homeコントローラーのtopアクションで処理される

```
get "home/top" => "home#top"  
　リクエスト=>"コントローラ＃アクション"
```




##②コントローラ　＜モデルとビューをつなぐ＞
app/controllers （アプリケーションのメインフォルダのコントローラフォルダに置かれる）
Viewからの入力に応じて、必要なロジックの実行をModelに依頼し、その結果表示をViewに依頼する。

　　　　　　　　　　　　　　　　　　　　　　　　　　
ex.)「rails generate controller home top」を実行したとき、「home_controller.rb」というコントローラのファイルが作成され、ファイルの中に「topメソッド」が追加される。
コントローラ内のメソッドを「アクション」と呼ぶ。

```
#アクション

def top　　　　　　　　　
end      　　　　　　　　　　　　　　　　　　　　　　　　
```
アクションは、コントローラと同じ名前のビューフォルダから、アクションと同じ名前のHTMLファイルを探してブラウザに返す。

app/views/home/top.html.erb　←ここにかいてある情報をブラウザに映し出す。


##③モデル＜データベースを操作＞
app/models(アプリケーションのメインフォルダのモデルフォルダに置かれる）
          	
モデルはデータベースに含まれるテーブル毎に用意され、データベースに対してデータの登録・取得・更新・削除などを行うことができる。



##④ビュー＜ページの見た目を作る＞
app/views （アプリケーションのメインフォルダのビューフォルダに置かれる）
ビューに書いてあること（HTML)がブラウザに表示されるのでビューを編集すると表示する内容を変えることができる。







この流れで処理が行われることによってユーザーは欲しい情報を得ることができる:fist_tone2:


〜上記に記載したディレクトリ、ファイルの概要〜
①/config..アプリケーションの設定情報を格納する
　　　/routes.rb..ルーティングの設定を行う
　　　/locales..辞書ファイル(グローバル対応等)

②/app　..アプリケーション開発中にメインで使用するディレクトリ
　　　　/controllers..Controller クラスを格納する

③/models..　Modelクラスを格納する

④/views..View クラスを格納する
RailsのSoceryとactiverecord-session_storeでログイン認証を実装

# はじめに
APIの認証に最適なGemがないかな～と探していました。
どうもDeviceは大仰過ぎるのと、5系の環境下でうまく動かず四苦八苦していました。
そんなところで、SoceryとDoorkeeperに出会い、簡単に実装できました！
今度はWEBも実装する事になったので、セッション管理が必要だ～という事でSoceryとactiverecord-session_storeでログイン認証を実装する事になったのであります。

# 環境
- CentOS7
- ruby 2.4.3
- Rails 5.2.0
- MySQL 5.7

RoRとMySQLは導入済みの前提で話を進めます。

# 導入
いつもの様にGemfileを編集します。

## Gemfileの編集

```ruby:Gemfile
gem 'sorcery'
gem 'activerecord-session_store'
```

## bundleインストール
コンソールからバンドル～Soceryとactiverecord-session_storeのインストール

```console:console
bundle
rails generate sorcery:install
rails generate active_record:session_migration
```

## migration fileの編集
Sorceryはデフォルトだとusersと言うテーブルのマイグレーションファイルになります。
しかしながら私が実装した環境では、usersはログイン認証以外の人情報を扱うテーブルとして既に存在していて、ログイン認証を同時に扱うには都合が悪かったのでsessionsというテーブルとして作成しました。
また、メールアドレスをログインIDとしない方式にしたのでlogin_idというcolumnでテーブルを作成しています。

```ruby:yyyymmddxx_add_session_stores_table.rb

class CreateSessions < ActiveRecord::Migration[5.2]
  def change
    create_table :sessions do |t|
      t.string :login_id, null: false
      t.string :crypted_password, null: false
      t.string :salt, null: false
      t.timestamps
    end
  end
end

```

activerecord-session_storeはデフォルトだとsessionsと言うテーブルのマイグレーションファイルになります。
しかしながらこちらについても、sessionsと言うテーブルは上記のSocery実装時に既にログイン認証(ID・パスワード管理)のためのテーブルとして存在していたので、session_storesという名称に変更しました。

```ruby:yyyymmddxx_add_sessions_table.rb

class AddSessionStoresTable < ActiveRecord::Migration[5.2]
  def change
   create_table :session_stores do |t|
    t.string :session_id, :null => false
    t.text :data
    t.timestamps
  end

    add_index :session_stores, :session_id, :unique => true
    add_index :session_stores, :updated_at
  end
end

```

マイグレーションを忘れずに。

```console:console
rails db:migrate
```

## Soceryの設定情報
デフォルトのログイン認証テーブル(:users)から変更になったことの宣言と、テーブルの変更について記述。

```ruby:config/initializers/sorcery.rb
Rails.application.config.sorcery.submodules = []
Rails.application.config.sorcery.configure do |config|
  config.user_config do |user|
    user.username_attribute_names = :login_id
    user.stretches = 1 if Rails.env.test?
  end
  config.user_class = 'Session'
end
```

## activerecord-session_storeの設定情報
activerecord-session_storeを使用する事の宣言と、テーブル名称がデフォルト(:sessions)から変わった事を記述するファイルを作成。
セッションの有効期限を24時間に設定。

```ruby:config/initializers/session_store.rb 
Rails.application.config.session_store :active_record_store, :key => '_app_session', :expire_after => 24.hour
ActiveRecord::SessionStore::Session.table_name = 'session_stores'
```


# セッション
セッションの情報はこんな感じで取り出せたり。

```ruby:console
p session[:login_id]
```

こんな感じにインポートできたりします。

```ruby:controller
session[:form_data] = params[:form_data]
```
PWA (Progressive Web Apps) の概要

#### 特徴

ウェブアプリとネイティブアプリの利点を兼ね備えたアプリ

* ネイティブアプリのように素早く表示され、オフラインでも利用できる。
* ブラウザで利用するが、アプリのホーム画面への追加やプッシュ通知もできる。
* URLで簡単にアプリを公開でき、検索エンジンからも発見できる。

#### 鍵となる技術

##### App Shell アーキテクチャ

アプリのユーザーインターフェースが機能するために必要な最小限のHTML、CSS、JavaScriptをシェルとして、アプリで利用するデータから分離して構築する考え方。PWAではシェルには積極的にキャッシュを活用して、ユーザー体験を高める。詳細は [App Shell モデル](https://developers.google.com/web/fundamentals/architecture/app-shell?hl=ja) を参照。

##### Service Worker

ブラウザがWebページの処理とは別にバックグラウンドでスクリプトを実行する仕組み。PWAではService Workerを使ってApp Shellやデータをキャッシュして高速な表示とオフライン利用を可能にする。詳細は [Service Workerの紹介](https://developers.google.com/web/fundamentals/primers/service-workers/?hl=ja) を参照。

##### Cache API (Service Worker の一部)

ブラウザのキャッシュを制御するAPI。PWAではURL指定可能なリソースをオフラインで利用するためのキャッシュ制御に使われる。

##### IndexedDB

クライアント（ブラウザ）のローカルデータベースにデータを保存するためのAPI。PWAではURLで指定不可能なデータをオフラインで利用するための保存に使われる。LocalStorageやSessionStorageは同期的であるため、PWAでの利用は推奨されない。

##### Web App Manifest

ネイティブアプリとしての表示方法（アプリ名やアイコンなど）をJSON形式で定義したファイル。詳細は [MDN web docs](https://developer.mozilla.org/en-US/docs/Web/Manifest) を参照。

#### Service Workerを使ったキャッシュ制御実装

[はじめてのプログレッシブ ウェブアプリ](https://developers.google.com/web/fundamentals/codelabs/your-first-pwapp/?hl=ja) で紹介されている実装の流れを簡単にまとめている。

##### Service Workerの登録

`navigator.serviceWoker.register()` を呼び出して Service Worker のスクリプトを登録する。

##### App Shell のキャッシュ制御（キャッシュ優先）

* `caches.open()` でキャッシュ名（Service Workerを変更する度に異なる名前にする）を指定してキャッシュを開き、キャッシュするURLのリストをキャッシュに追加する。
* `activate `イベントリスナーで使われていないキャッシュを削除する。
* `fetch `イベントリスナーでキャッシュが存在する場合はキャッシュデータを返却する。

##### データのキャッシュ制御（キャッシュ、ネットワークの順にデータ取得）

まずはキャッシュからデータを取得しデータを早く表示した後に、ネットワークから新しいデータが取得できればそのデータで更新する。

* fetchイベントリスナーでデータのリクエスト時に結果をキャッシュ処理を挟む。
* アプリでは、キャッシュからデータを取得して、サーバーへのリクエストの応答がない場合はキャッシュデータでアプリを更新する。サーバーから応答を受け取ったときに最新データでアプリを更新する。

#### 参考

* https://developers.google.com/web/fundamentals/codelabs/your-first-pwapp/?hl=ja
* https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/offline-for-pwa?hl=ja
Rspecでメソッドチェーンを書くときに迷った

Railsでコントローラのテストを書くときに、こういうコードをrspecで書きたいと思いました。

```rb
@book = Book.find_by_info(set_information).first
```


こういうふうに書くらしい。

```rb
allow(Book).to receive_message_chain(:find_by_info, :first){ book }
```


参考URL
[Relish](https://relishapp.com/rspec/rspec-rails/docs)
JavaScriptの基礎知識

JavaScriptに関する基礎知識

・出力するときはconsole.log

・計算記号は、+,-,*,/,%とphpと変わらず

・変数を定義する際は
　　let 変数名　= "代入する値"

・定数を定義する際は
　　const 変数名　= "代入する値"
  ※定数は変数と違い、後から更新できない

・条件分岐は
　if(条件式）{
      処理
　｝

・条件が複数の場合…
　かつは＆＆で、またはは||で表す

・条件分岐の方法としてswitch文もある

switch(条件の値）{
 case 値1:
   条件の値と値1が等しい時の処理
　　break;
 case 値２:
    条件の値と値２が等しい時の処理
　　break;

※breakを必ず書く！！！
php-master-changes 2018-08-14

投稿したつもりが……！下書き保存だけだった……！

# 2018-08-14
## laruence: Fixed zend_read_static_property
- https://github.com/php/php-src/commit/78d823d9c3a5854ff200fbce18dcebbaa5f71065
- [zend_read_static_property_ex 実装時](https://github.com/php/php-src/commit/813b6fc95050b32409014877e7dc9849c16717ee)にスコープの差し替えを行わない実装となっていたのを修正
- 標準拡張の範囲内では使ってる奴なさげかな

## cmb69: Revert "DOMDocument::formatOutput attribute sometimes ignored"
- https://github.com/php/php-src/commit/819cf5283bd53ae44b9d5645a42988c11ec50f67
- ext/dom で [5 月の修正時](https://github.com/php/php-src/commit/ef9ed19ec7f141311feea1d42467f5773cfc09bc)に[バグっていた](https://bugs.php.net/bug.php?id=76738)ので revert

## cmb69: [ci skip] Update NEWS wrt. php-7.3.0beta2 tagging
- https://github.com/php/php-src/commit/66a43629141a76622956d1d6e279fed58545e516
- NEWS に 7.3.0beta2 の日付を入れた
- NEWS に 7.3.0beta3 を足した
- 7.3.0beta2 のタグが打たれてる
    - https://github.com/php/php-src/commit/4950324f69577b4a6eef7bd3f19c8ec5c787bcde

## weltling: Followup fix for ef9ed19e, see also bug #76738
- https://github.com/php/php-src/commit/083285f22a74989689f97d1d53476e7eaec35acc
- ext/dom の revert した修正は　[DOMDocument::formatOutput がたまに無視される](https://bugs.php.net/bug.php?id=76285)という問題への対処で、この問題を別途解決した修正

## weltling: Cleanup
- https://github.com/php/php-src/commit/8b3174f256147a1708821621a8cbe2b257fca737
- ifdef の削除
- xmlBufferContent の 中身は[こんなん](https://github.com/GNOME/libxml2/blob/35e83488505d501864826125cfe6a7950d6cba78/tree.c#L7353)
mysql起動時でエラーが起きた時の対処

# Mysql5.6をHomebrewでinstallした後に起きたエラーに対処する

以下のコマンドでmysqlをインストールした．

```zsh
$ brew install mysql@5.6
```

その後，インストールが正常にされているか確認するために，以下のコマンドを実行したら，エラーがでた．

```zsh
$ mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```
mysql.sockなるファイルが/tmp配下に無いよって言われたので，素直に/tmp配下にmysql.sockを作成する．
作成は以下のコマンドで行った．

```zsh
$ sudo touch /tmp/mysql.sock
```

そして，再度mysqlが実行できるか確認する．

```zsh
$ mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
```
またしても，エラーが発生エラー文の括弧の中身が2→38に変わっただけ．

ここで気づく．そもそもMysqlのサーバー起動してなくね？そりゃ，mysqlコマンド実行されないわ．
ということで以下のコマンドを実行した．

```zsh
$ sudo mysql.server start
Starting MySQL
... ERROR! The server quit without updating PID file (/usr/local/var/mysql/XXXX.local.pid).
```

またしてもエラー．今度は/usr/local/var/mysql配下のpidファイルが無さそう．ということで，このディレクトリを確認したところ，pidファイルが
見当たらなかった．ということで，pidファイルを作成する．

```zsh
$ sudo touch XXXX.local.pid
```
その後，再度mysqlサーバが起動できるか確認．

```zsh
$ mysql sudo mysql.server restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL
... ERROR! The server quit without updating PID file (/usr/local/var/mysql/XXXX.local.pid).
```
また，pidファイルがないとか言われる．この時点で心が折れたのでググった．
したら，Qiitaのどっかで見つけた．あとで見つけて参照つけます，
どうやら，最初にやった/tmp配下にsockファイルを作ったことがよくなかったらしい．
ということで，下記のコマンドで削除

```zsh
$ sudo rm /tmp/mysql.sock
$ sudo rm /tmp/mysql.sock.lock
```
あと，/usr/local/var/mysqlの権限を_mysqlに変更しておく

```zsh
$ chown -R _mysql:_mysql mysql
```

再度，mysqlサーバーを起動する．

```zsh
$ sudo mysql.server restart
ERROR! MySQL server PID file could not be found!
Starting MySQL
. SUCCESS!
```
やっと，起動した．なんでこんなに手間取ったのだ．．．
CSSで横から単色のブロックが徐々に表示された後に、画像が表示されるアニメーション

最近、よく見かけるやつです。

![img.gif](https://qiita-image-store.s3.amazonaws.com/0/42231/7ac42e83-6442-1dcc-8363-b6a0c587417c.gif)


このようなアニメーションはスクロールに応じて表示されます。

アニメーション自体はCSSのみで実装していますが、スクロールに応じてアニメーションを実行させるにはトリガーが必要です。

アニメーションのトリガー・設定に、最初は [wow.js](https://github.com/matthieua/WOW) を利用しましたが、アニメーションのタイミングがずれるため、 [jquery.inview](https://github.com/protonet/jquery.inview) を利用しました。

jquery.inview は、指定した領域に達したときに、クラスを付与します。

今回は `wrap` の領域が表示されたときに `wrap` に `wrap_animated` クラスを、 `img` に `img_animated` クラスを付与しています。

jquery.inview の使い方はググってください。

```html
<html>
<head>
<title>test</title>
</head>
<style>

@keyframes blockSlideRight {
    0% {
        width: 0%;
    }
    50% {
        width: 100%;
        transform: translateX(0);
    }
    100% {
        transform: translateX(100%);
    }
}

@keyframes imgFadeInLeft {
    50% {
        transform: translateX(100%);
    }
    100% {
        transform: translateX(0);
    }

}

.wrap {
    overflow: hidden;
    position: relative;
    display: inline-block;
}

.wrap_animated::after {
    animation: blockSlideRight 1s ease both;
    position: absolute;
    background: #0199e6;
    content: '';
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
}

.img {
    transform: translateX(100%);
}

.img_animated {
    animation: imgFadeInLeft 1s ease both;
}

</style>
<body>

<div class="wrap">
         <img class="img" src="01.jpg">
</div>

<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js'></script>
<script src='jquery.inview.min.js'></script>
<script>
$(function() {
    $('.wrap').on('inview', function(event, isInView) {
        if (isInView) {
            $('.wrap').addClass('wrap_animated');
            $('.img').addClass('img_animated');
        }
    });
});
</script>
</body>
</html>
```

サンプルコードでは、表示する画像の前に要素がないためスクロールしなくてもすぐにアニメーションされますが、前に要素があれば、スクロールに応じてアニメーションされます。

ざっくり説明すると、`img` 要素に `translateX(100%)` を指定することで、`wrap` 領域の外に配置しています。

`wrap` には `overflow: hidden` を指定しているので、 初期では `img` 要素は表示されません。

`wrap` が表示されたタイミングで `wrap_animated` クラスが付与されます。

`wrap_animated::after` でベタ塗り・アニメーションの設定をしています。

`blockSlideRight` のアニメーションでは 、`0%` から `50%` では `width` の設定をし、 `50%` から `100%` では `transform: translateX` の設定をしています。

これは、ベタ塗りのブロックが左端から右端まで徐々に表示された後に、左端から右端まで徐々に消えるようにするためです。
postgresqlのtextカラムで無効な文字列を弾く

### textの場合　

```
postgres=# CREATE TABLE test (
    sample text CONSTRAINT check_invalid_char CHECK (sample !~ 'a')
);
postgres=# INSERT INTO test VALUES ('hoge');
postgres=# INSERT INTO test VALUES ('hage');
ERROR:  new row for relation "test" violates check constraint "check_invalid_char"
DETAIL:  Failing row contains (hage).
```

### text配列の場合

```sql
postgres=# CREATE FUNCTION check_text_value (
     vals text[]
) RETURNS boolean AS $$
     SELECT bool_and (t !~ 'a') FROM unnest(vals) AS t
$$ LANGUAGE sql IMMUTABLE
postgresql=# CREATE TABLE test (
    text[] vals CHECK (check_text_value (vals))
);
```

### 参考

https://stackoverflow.com/questions/46673217/postgresql-check-constraint-to-limit-specific-characters

https://www.postgresql.org/docs/9.3/static/functions-matching.html

https://stackoverflow.com/questions/38718553/set-a-check-constraint-for-text-array-in-postgresql

https://stackoverflow.com/questions/43699601/is-it-possible-to-use-a-check-constraint-to-test-objects-in-a-jsonb-array

https://www.postgresql.org/docs/9.5/static/functions-aggregate.html
コマンドプロンプトでTABキーが入力補完じゃなくて困った時の対応

Windows10のPCを使っていたら、コマンドプロンプトでTABキーが入力補完じゃなくて地味に困ったので調べてみた。
複数のやり方があるようなのでメモ。

参考：https://www.thewindowsclub.com/autocomplete-in-windows-command-prompt

## レジストリに登録
レジストリで設定するパターン。
これが一番運用が楽かなぁ。

パス：\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
※ユーザごとに設定したい場合は HKEY_CURRENT_USER の方に設定

|    キー              |    値             |    補足                                              |
|:-------------------  |:-----------------|:-----------                                          |
| CompletionChar       | 4 or 6 or 9      |  それぞれ、4:Ctrl+d、6:Ctrl+f、9:TAB で入力補完となる   |
| PathCompletionChar   | 4 or 6 or 9      |  それぞれ、4:Ctrl+d、6:Ctrl+f、9:TAB で入力補完となる   |

設定イメージは上記参考リンクの通り。


## コマンドプロンプトのオプションに設定
コマンドプロンプトの起動オプションに設定することで入力補完の機能を適用できる。

``` Ctrl+dで入力補完するコマンド
> cmd :f:on
Microsoft Windows [Version 10.0.17134.165]
(c) 2018 Microsoft Corporation. All rights reserved.
```

ショートカットの起動オプションに設定するのも良い。
でも、普段 Ctrl+r -> cmd で起動してる人はレジストリいじる方が向いてると思う。
Asp Net.Core(2.1)をIISでホスティング

# 前提条件
Windows2016ServerですでにIISがセットアップされているものとします。
# それでは
IISのホスティング設定をネットで漁っていると、
* .Net Core2.1 Runtime
* ASP.NET CORE Module
上記のダウンロードおよびインストールが必要と記載されています。
現在（2018/08/15）ではASP.NET CORE Moduleのダウンロードが最新ではないようなので、探していたら
[Run apps - Runtime](https://www.microsoft.com/net/download)という名称で上記の２つが統合されたようです。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/136187/23810637-2f18-1ee0-d6e1-1e21cd445443.png)

ですので、インストールは更に簡単になりました。
1. Run apps - Runtimeをダウンロード＆インストール
2. IISを設定
3. デプロイ
上記でホスティングが可能になりました。
# IISの設定について
Asp.Net Coreを利用する場合アプリケーションプールに.Net CLRバージョンをマネージコードなしにする必要があります。
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/136187/8a386728-73f3-71b3-8fea-a437cf5d3d7e.png)
How to visualize a word2vec vector trained by fastText on a tensorboard

```python

import os
import tensorflow as tf
import numpy as np
import fastText
from tensorflow.contrib.tensorboard.plugins import projector

# load model                                                                                                                                                   
word2vec = fastText.load_model('./browse_history.bin')

# create a list of vectors                                                                                                         
dim = len(word2vec.get_words())
embedding = np.empty((len(word2vec.get_words()), word2vec.get_dimension()), dtype=np.float32)
for i, word in enumerate(word2vec.get_words()):
    embedding[i] = word2vec.get_word_vector(word)

# setup a TensorFlow session                                                                                                       
tf.reset_default_graph()
sess = tf.InteractiveSession()
X = tf.Variable([0.0], name='browse_history_embedding')

place = tf.placeholder(tf.float32, shape=embedding.shape)
set_x = tf.assign(X, place, validate_shape=False)
sess.run(tf.global_variables_initializer())
sess.run(set_x, feed_dict={place: embedding})

# write labels                                                                                                                     
with open(os.path.join('log', 'metadata.tsv'), 'w') as f:
    for word in word2vec.get_words():
        f.write(word + '\n')

# create a TensorFlow summary writer                                                                                               
summary_writer = tf.summary.FileWriter('log', sess.graph)
config = projector.ProjectorConfig()
embedding_conf = config.embeddings.add()
embedding_conf.tensor_name = 'browse_history_embedding:0'
embedding_conf.metadata_path = os.path.join('log', 'metadata.tsv')
projector.visualize_embeddings(summary_writer, config)

# save the model
saver = tf.train.Saver()
saver.save(sess, os.path.join('log', "model.ckpt"))
```

- we can execute above code on jupyter notebook

- python binding for fastText is one included in fastText original git repository, is not one which is install by command "pip install fasttext"

 
# how to create sprite image file

```python

from PIL import Image
mport math

master_width = 124 * 90   # x thumbnail width
master_height = 124 * 90  # x thumbnail height

master = Image.new(
    mode='RGB',
    size=(master_width, master_height),
    color=(0,0,0)) # fully transparent


for index, label in enumerate(word2vec.get_words()):
    img = jpgs.get(label) #  jpgs: images file set
    if img:
        i = (index % 124) * 90
        j = int(index / 124) * 90
        print(index, i, j)
        master.paste(img,(i,j)) # paste sprite master image
        
master.save('master.png')
```
初心者のテスト

# テスト投稿
プログラミング学ぶなら、とりあえずgithubとqiitaはアカウントを持っておけとのお言葉を頂戴し、トライ。

30目前の今、0からではあるけれど、頑張ります。
変化/成長の記録をつけていく。
Androidで水平のProgressBarの余白を削除する方法

Androidの水平のProgressBarは上下に余白があって、あるビューの最上部や最下部に配置するといったことをやりたいときに不都合があります。

余白を削除する方法を色々と調べてみたが3rd partyのライブラリを使うほうが早いし確実という結論に達しました。
ライブラリは [MaterialProgressbar](https://github.com/DreaminginCodeZH/MaterialProgressBar)を使用します。

上下の余白なしの2dpの高さのProgressBarを表示するには以下のようにします。

```xml
        <me.zhanghai.android.materialprogressbar.MaterialProgressBar
            style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal.NoPadding"
            android:layout_width="0dp"
            android:layout_height="2dp"
            android:indeterminate="true"
            android:indeterminateTint="#f00"
            android:indeterminateTintMode="src_in"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:mpb_progressStyle="horizontal"
            app:mpb_useIntrinsicPadding="false" />
```

`app:mpb_useIntrinsicPadding="false"` で画像自体に設定されている余白を使わないようになるので余白がなくなります。
mix-blend-mode

# mix-blend-modeについて

DOMエレメントを重ねた時の見え方を指定するCSSプロパティ

PhotoshopやIllustratorで使うオーバーレイがcssできる

## 対応状況
![](https://www.tam-tam.co.jp/tipsnote/wpdata/wp-content/uploads/2017/06/caniuse-690x253.png)
参考：https://caniuse.com/#search=mix-blend-mode

Safariの一部、IE, Edgeはサポートしていない

# ブレンドモードとは？
レイヤーを重ねたときに上位のレイヤーを下位のレイヤーにどのように重ねて表示するかの設定。
アドビ系のソフトで昔から搭載されている。

![スクリーンショット 2018-08-15 8.49.15.png (9.3 kB)](https://img.esa.io/uploads/production/attachments/4290/2018/08/15/34850/a7b8f1b1-9f2a-41cb-8de6-dce5d356875e.png)
↑photoshopだと`通常`の部分

---

# 書き方

```css
.pt-1 {
  mix-blend-mode: difference;
}
```
のように記入する。
背景画像のみに適応させたい場合には

```css
.back-only { 
  background:green url(images/img01.jpg) no-repeat;
  background-blend-mode: multiply; 
} 
```
のように記入する。

---

# 使用できるものについて
| 名称 | プロパティ | 意味 |
|--- | --- | --- |
| 通常 | normal | 通常のまま |
| 乗算 | multiply | 色と色が重なる部分を暗くする描画モード。重ねれば重ねるほど暗く。 |
| スクリーン | screen | 色と色が重なる部分を明るくする描画モード。重ねれば重ねるほど明るくなる |
| オーバーレイ | overlay | 下のレイヤーの色が暗いと「乗算」、明るいと「スクリーン」が適用される描画モード |
| 比較（暗） | darken | 重なる部分の両方の色をくらべて、暗い方が適用される描画モード |
| 比較（明） | lighten | 重なる部分の両方の色をくらべて、明るい方が適用される描画モード |
| 覆い焼き | color-dodg | 色味(色相)を保ちながら、色と色が重なる部分を明るくし、コントラストを強くする描画モード |
| 焼き込み | color-burn | 色味(色相)を保ちながら、色と色が重なる部分を暗くし、コントラストを強くする描画モード |
| ハードライト | hard-light | オーバーレイよりもコントラストが弱い描画モード |
| ソフトライト | soft-light | オーバーレイよりもコントラストが強い描画モード |
| 差の絶対値 | difference | 明度の大きい方から小さい方の数値が引かれて合成される描画モード。白を重ねた場合は単純に色が反転し、黒を重ねた場合は何の影響もない |
| 除外 | exclusion | 差の絶対値よりもコントラストが弱い描画モード |
| 色相 | hue | 下のレイヤーの輝度と彩度を維持したまま、上のレイヤーの色相を合成する描画モード |
| 彩度 | saturation | 下のレイヤーの輝度と色相を維持したまま、上のレイヤーの彩度を合成する描画モード |
| カラー | color | 下のレイヤーの輝度を維持したまま、上のレイヤーの色相と彩度を合成する描画モード |
| 彩度 | luminosity | 上のレイヤーの色の輝度が、下のレイヤーに合成される描画モード |

---

# ブラウザで検証したいときに

[mix-blend-mode](https://ics-creative.github.io/150705_mixblendmode/demo_complex/)
NativeScriptでUITextfieldやWebViewの長押しメニューが英語になる場合の解決法

NativeScriptでアプリを作るとUITextfieldやWebViewでテキストを長押ししたときのメニューが英語になってしまいます。

<img width="375" alt="IMG_BD5A14FABC98-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/170712/28c6e7b7-45b5-ed83-9be3-ade5dd201f45.jpeg">

「Select」「Select All」となってしまっていますね...↑
これらを日本語にしたい場合には以下のプラグインをインストールしましょう。

NativeScript Localize Plugin
https://github.com/lfabreges/nativescript-localize

プロジェクトのルートで以下を実行します。

```bash
tns plugin add nativescript-localize
```

appフォルダにi18nフォルダを作成し、その中にja.default.jsonを配置しましょう。

```
app
  └ i18n
      └ ja.default.json
```

ja.default.json の中身は以下のような感じです。
"My App" のところはご自分のアプリ名に置き換えてください。

```json:ja.default.json
{
	"app.name": "My App"
}
```

あとはいつものように`tns build ios`するなり`tns run ios`してみましょう。

<img width="375" alt="IMG_115F24EDA553-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/170712/8bf420a2-6fc0-a94c-186b-918696023141.jpeg">


長押しメニューが日本語になりました！

# 補足

この問題は、実はプラグインを使わなくても解決はできます。
`platforms/ios` にあるXcodeプロジェクトを開き「Japanese」をLocalizationを追加すれば解決です。

ただその場合、一度Platformを消してしまうと、Localizationの設定が英語に戻ってしまうというデメリットがあります。

そこでこのプラグインを使うと、ビルド時に動的にLocalizationを追加してくれ、
Platformを削除した場合も手動で追加する必要がなくなります。

NativeScriptではplatformsフォルダは動的に生成される前提で、生成されたXcodeプロジェクトはバージョン管理にも含めないため、プラグインを使って動的に書き換えるほうがスムーズなはずです。
PHPでif入れ子の閉じをうまくミスる

##仮にこのような入れ子状態のコードがあったとして

```php
<?php
	if( true ) {
		echo 1;
		if( true ) {
			echo 2;
			if( true ) {
				echo 3;
			}
		}
	}
```
###「 } 」を誤って消してしまった場合

```php

<?php
	if( true ) {
		echo 1;
		if( true ) {
			echo 2;
			if( true ) {
				echo 3;
			// } を誤って消してしまう orz
		}
	｝
```
すると、このようなエラーがでますね。

```html:Oops_error.html
Parse error: syntax error, unexpected end of file in ~/Oops.php on line 10
```
これだと行番号が最後にくるので場所がわからない。
調べている間に同僚から「お昼休憩さきに行ってるね」と声をかけられてしまいます。


## 対策：記述方法を交互に変えて書いてみる

わかりやすいようわかりにくいトラップを仕掛けます。

```php

<?php
	if( true ) : // ←
		echo 1;
		if( true ) {
			echo 2;
			if( true ) : // ←
				echo 3;
			endif; // ←
		}
	endif; // ←
```
### これでミスってみます

```php

<?php
	if( true ) : 
		echo 1;
		if( true ){
			echo 2;
			if( true ) :
				echo 3;
			// endif; またやってしまったのか orz
		}
	endif;
```
このようなエラーになります。

```html:mistake1_error.html
Parse error: syntax error, unexpected '}', expecting elseif (T_ELSEIF) or else (T_ELSE) or endif (T_ENDIF) in ~/mistake1.php on line 9
```
行番号が2番めの入れ子末尾で止まってくれました。
これでもう少し調べやすくなりましたね。

###記述式が逆だったら
```php

<?php
	if( true ) {
		echo 1;
		if( true ) :
			echo 2;
			if( true ) { 
				echo 3;
			// }
		endif;
	}
```

```html:mistake2_error.html
Parse error: syntax error, unexpected 'endif' (T_ENDIF) in ~/mistake2.php on line 9
```
これも良い結果ですね。（よくない）
'}' と 'endif' でその上はなにかと考えると解決しやすくなる気がします。

以上、実践で投入しないネタでした。