OmniAICreator/Qiita-1.07M huggingface dataset:
React.jsでPropTypesを利用した時の話

今回はPropTypesを利用していてハマった所について取り上げたいと思います。

# Props, PropTypesとは
propsはコンポーネント作成時に値を指定することでコンポーネントで表示させたいデータを指定できます。
React.jsでコンポーネントを定義する時に、PropTypesを指定することでpropsにおける引数の入力チェックを行えます。
数値や文字列、配列などのバリデーションを行いたい時に便利です。

しかし、15.5.0(April 7, 2017)以上では`deprecated`されて、ライブラリとしてインポートする必要が出てきました。


`15.5.0`以前

``` React
import React, { Component } from 'react';
//中略
App.propTypes = {
    data: React.PropTypes.array.isRequired
};
```


`15.5.0`以降

``` React
import React, { Component } from 'react';
import PropTypes from 'prop-types';
//中略
App.propTypes = {
    data: PropTypes.array.isRequired
};
```

`xxx.isRequired`は型を必須にしたい時に使ってください。


ローカルのバージョンは `npm list --depth=0` で確認できます。
執筆時点では16.2.0でした。
(深さ(`depth`)指定しないと、かなり深い階層のも表示されて見づらかったです。)

```
> npm list --depth=0

//省略
+-- react@16.2.0
+-- react-autosuggest@9.4.2
+-- react-bootstrap@0.32.4
+-- react-component-octicons@1.8.0
+-- react-dom@16.5.2
//省略

```

`prop-types`を使って指定できる型について調べてみました。

| オプション                         |説明　　　　　　　　| 
|:----------------------------------|:------------------|
| PropTypes.number| 数値かチェック |
| PropTypes.string| 文字列かチェック |
| PropTypes.array| 配列かチェック |
| PropTypes.bool| booleanかチェック |
| PropTypes.object|オブジェクトかどうかをチェック |
| PropTypes.func|関数かどうかをチェック |
| PropTypes.node|renderできるものかをチェック|
|PropTypes.instanceOf(XXX) | XXXのinstanceかどうか|
|PropTypes.oneOf(['foo', 'bar']) | fooかbarのどちらか|
|PropTypes.oneOfType([PropTypes.string, PropTypes.array])| 文字列か配列|
|PropTypes.arrayOf(PropTypes.string)|文字列の配列かどうか|
|PropTypes.objectOf(PropTypes.string)|文字列の値を持つか|
|PropTypes.element| React Element(?) |
|PropTypes.any.isRequired|何か必須|


複数の条件を絞り込めたりと、色々な型を調べられるんですね。

## 参考
* [今からはじめるReact.js〜propsとstate、それからrefs〜](https://qiita.com/kuniken/items/a22adda392ccc30011b1)
* [react/CHANGELOG.md(GitHub)](https://github.com/facebook/react/blob/master/CHANGELOG.md)
* [React のバージョンを 15.5 系にあげたときにやったこと](https://qiita.com/kasaharu/items/a495a8590a116b872204)
* [React.jsのPropTypesの一覧](https://morizyun.github.io/javascript/react-js-proptypes-validator.html)
* [ReactJS “TypeError: Cannot read property 'array' of undefined”](https://stackoverflow.com/questions/46722788/reactjs-typeerror-cannot-read-property-array-of-undefined)


Reactの勉強、はじめました。
Angular: No component factory found for ~. Did you add it to @NgModule.entryComponents?

Angularの開発にて、新規コンポーネント（モーダル）を追加しようとして以下のようなエラーに遭遇。

```
No component factory found for TestModal. Did you add it to @NgModule.entryComponents?
```

## 解決方法
文字通り、app.module.tsの記載漏れでした。

```module.ts
@NgModule({
  imports: [
    ・・・
  ],
  declarations: [
    TestModal
  ],
  entryComponents: [
    TestModal
  ],
  providers: [
    ・・・
　]
})
```

module追加の場合は、exportsにも追記する必要があるようです。

```module.ts
  exports: [ TestModule ],
```

## 参考
[stack overflow: Angular 4: no component factory found,did you add it to @NgModule.entryComponents?
](https://stackoverflow.com/questions/46990389/angular-4-no-component-factory-found-did-you-add-it-to-ngmodule-entrycomponent/46990483)
（備忘）kubectl コマンドでの短縮リソース名

#短縮リソース名一覧
複数形(`s`)は基本的に省略可能です。（ex. `secrets` ⇒ `secret`）

|リソース名|短縮リソース名|
|---|---|
|certificatesigningrequests|csr|
|clusterrolebindings||
|clusterroles||
|componentstatuses|cs|
|configmaps|cm|
|controllerrevisions||
|cronjobs||
|customresourcedefinition|crd|
|daemonsets|ds|
|deployments|deploy|
|endpoints|ep|
|events|ev|
|horizontalpodautoscalers|hpa|
|ingresses|ing|
|jobs||
|limitranges|limits|
|namespaces|ns|
|networkpolicies|netpol|
|nodes|no|
|persistentvolumeclaims|pvc|
|persistentvolumes|pv|
|poddisruptionbudgets|pdb|
|podpreset||
|pods|po|
|podsecuritypolicies|psp|
|podtemplates||
|replicasets|rs|
|replicationcontrollers|rc|
|resourcequotas|quota|
|rolebindings||
|roles||
|secrets||
|serviceaccounts|sa|
|services|svc|
|statefulsets|sts|
|storageclasses|sc|

#コマンド例

```bash
$ kubectl get po,rs,deploy
```
Gitの備忘録

筆者はGitHubは「ブラウザで動かせるじゃん」といって
gitコマンドなど使っていませんでした...

ということで備忘録。

# ダウンロード
`git clone`だけど、depth指定をしないと遅くなる。基本:

```sh
git clone --depth 10 https://github.com/XXXXXXXXXXXXX/XXXXXXXXXXXXX.git
```

## ブランチ指定
誤:

```sh
git clone --depth 10 https://github.com/XXXXXXXXXXXXX/XXXXXXXXXXXXX/blob/master.git
```

正:

```sh
git clone --branch master --depth 10 https://github.com/XXXXXXXXXXXXX/XXXXXXXXXXXXX.git
```

# ブランチを作る
```sh
git branch develop
```

# ブランチを移動する
```sh
git checkout develop
```

# 差分
要注意: Ctrl-Cで終了するとlessが終了しないので必ず`q`で終了すること。

```sh
git diff
```

# コミット
```sh
git commit -a -m "summary"
```

# Push
```sh
git push origin develop
```

## 書込権限ないのでPull Requestを出したいとき
```sh
git push https://github.com/MyAccount/xxxxxxx.git develop
```
Windows Server 2016またはWindows10のタスクスケジューラーは過去日を指定すると起動しない

忘れないためのメモです、中身は大したことないです。

手動で実行すると動くけど定時起動はしないタスクがありました。
この起動しないはタスクが開始されたけどプログラムが走らないとかそういう話でなく、
そもそもタスクが開始すらされない状態です。

権限の問題かとも思ってバッチジョブとしてログオンとかも設定しましたけど動きません。
試しにメモ帳開くだけのタスクを作ったら0x41303というエラーコードがあり、検索したら[この記事](http://blog.syo-ko.com/?eid=2443)にぶつかりました。

記事に記載の通りで日付を未来にしたら動きましたが、Windows Server 2012 R2とかは普通に動いてたんでなんなんですかね、バグですかね？
Elasticsearch への問い合わせ (python3)

こちらで作成したデータに python3 で問い合わせをします。
[Elasticsearch へのデータ投入](https://qiita.com/ekzemplaro/items/b6dda109ffe19b3c39c8)

```py:elastic_query.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	elastic_query.py
#
#					Oct/04/2018
# ------------------------------------------------------------------
import sys
import requests
import json

# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
args = {
	"q": "tags:apple,moon"
	}
url = "http://localhost:9200/blog/_search"
#
rr=requests.get(url,args)
#print(rr)
#print(rr.text)
dict_aa = json.loads(rr.text)
print(dict_aa.keys())
llx = len(dict_aa['hits']['hits'])
sys.stderr.write("len(dict_aa['hits']['hits']) = %d\n" % llx)
for it in range(llx):
	print(dict_aa['hits']['hits'][it]['_source'])
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行結果

```text
$ ./elastic_query.py 
*** 開始 ***
dict_keys(['took', 'timed_out', '_shards', 'hits'])
len(dict_aa['hits']['hits']) = 2
{'name': '田中康夫', 'title': 'My Name Is Tanaka', 'content': 'I love cat', 'tags': ['Earth', 'Moon', 'Mars']}
{'name': '渡辺五郎', 'title': 'My Name Is Watanabe', 'content': 'I love fish', 'tags': ['apple', 'orange', 'banana']}
*** 終了 ***
```

次のバージョンで確認しました。

```text
$ python --version
Python 3.9.7
```
JavaScriptを勉強しながら独自のaws-cliツールを作ってみた

### 背景
  - AWS LambdaやGCPのCloud Functionでjavascriptにふれる機会が増えてきた
  - javascriptを書いたことがほとんどなかったので、学習しながらaws-cliを作ってみようというのがきっかけ 

### 開発環境
- Mac
- node.js: v10.6.0
- was-cliを実行できる環境が必要
- 自分用のaws-cliツールを作成するために使ったもの
  - コマンドは `commander` を利用
     - commander: https://github.com/tj/commander.js/ 
     - `$ npm install commander`
  - aws-sdk-javascripti(node.js)
     - `$ npm install aws-sdk`
  - AWS SDK for JavaScript
     - https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/index.html

以下に作成したところまでのコマンドです。

- ソースコードはこちらです。
 - https://github.com/yhidetoshi/js-awscli-tool

### コマンドオプション
 - EC2

```
■ インスタンス一覧
 > $ node main ec2 --list

■ インスタンス起動
 > $ node main ec2 start --instanceid <instance-id-1>,<instance-id-2>,...<instance-id-N>
 
■ インスタンス停止
 > $ node main ec2 stop --instanceid <instance-id-1>,<instance-id-2>,...<instance-id-N>
 
■ インスタンス削除
 > $ node main ec2 delete --instanceid <instance-id-1>,<instance-id-2>,...<instance-id-N> 
```

- AMI

```
■ AMI一覧取得
 > $ node main ami --list

■ AMI作成(登録) 
 > $ node main ami create --imagename <imageName> --instanceid <instanaceId>

■ AMI削除(解除)
 > $ node main ami delete --instanceid <instanaceId>
```

- S3

```
■ S3バケット一覧取得
 > $ node main s3 --list
```
LAMP もどき (LAPT) 構築メモ

今回は以下の構成とする。

- CentOS 7
- Apache HTTP Server
- PostgreSQL
- Tomcat

## 参考文献

- [Sample Application](https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/)
- [GitHub - sb3f-ryo-sato/ansible-role-lapt](https://github.com/sb3f-ryo-sato/ansible-role-lapt)
- [postgresql localhost 127.0.0.1 - Google Search](https://www.google.com/search?hl=en&q=postgresql+localhost+127.0.0.1)

## チートシート

```bash
## パッケージインストール
sudo yum install -y postgresql-server tomcat tomcat-admin-webapps httpd

## PostgreSQL データベース初期化
sudo postgresql-setup initdb

## サンプル Web アプリケーションダウンロード (本コマンドはスキップ可)
cd /var/lib/tomcat/webapps; pwd
sudo curl -LO https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/sample.war

## httpd -> Tomcat 連携用設定
cd /etc/httpd/conf.d; pwd
echo 'ProxyPass / ajp://localhost:8009/' | sudo tee tomcat.conf
sudo chcon -v system_u:object_r:httpd_config_t:s0 tomcat.conf

## サービス起動
sudo systemctl enable postgresql
sudo systemctl start postgresql

sudo systemctl enable tomcat
sudo systemctl start tomcat

sudo systemctl enable httpd
sudo systemctl start httpd

## パケットフィルタリング許可 (firewalld 無効時はスキップ可)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
```

## PostgreSQL 設定チートシート

```bash
## postgres にユーザー変更
sudo su - postgres

## 接続用ユーザー, データベース作成
createuser -P testuser91
createdb -O testuser91 testdb91

## 接続許可設定ファイルバックアップ
cd data; pwd
cp -aiv pg_hba.conf pg_hba.conf.`date +%Y%m%d`

## 接続許可設定: 設定差分は後述
vi pg_hba.conf
diff -u pg_hba.conf.`date +%Y%m%d` pg_hba.conf

## ユーザー変更
exit

## PostgreSQL 再起動, 接続テスト
sudo systemctl condrestart postgresql
psql -d testdb91 -h localhost -p 5432 -U testuser91 -W
```

```diff
--- pg_hba.conf.20181009        2018-10-09 13:34:24.119549988 +0900
+++ pg_hba.conf 2018-10-10 09:22:52.465823206 +0900
@@ -75,6 +75,8 @@


 # TYPE  DATABASE        USER            ADDRESS                 METHOD
+host   testdb91        testuser91      ::1/128                 md5
+host   testdb91        testuser91      127.0.0.1/32            md5

 # "local" is for Unix domain socket connections only
 local   all             all                                     peer
```

psql コマンド実行時, ホスト名に localhost を指定すると IPv4 より IPv6 が優先されて名前解決されるようなので, 127.0.0.1 だけでなく ::1 も指定するのがポイント。

```
$ grep -F 'localhost' /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
```

どっとはらい。
Elasticsearch へのデータ投入

次のプログラムを参考にしました。
[Elasticsearchへのデータ投入と検索の方法（初級）](https://qiita.com/kenichiro-yamato/items/db5bcdd9e8cc9bef2027)

日本語も入れてみました。

データを投入するスクリプト

```bash:go_insert.sh
#
curl -H "Content-Type: application/json" \
	-X PUT http://localhost:9200/blog/_doc/t0001 -d '
{
	"name": "山本太郎",
	"title": "My Name Is Yamamoto",
	"content": "I love dog",
	"tags": ["red", "green", "blue"]
}
'

curl -H "Content-Type: application/json" \
	-X PUT http://localhost:9200/blog/_doc/t0002 -d '
{
	"name": "田中康夫",
	"title": "My Name Is Tanaka",
	"content": "I love cat",
	"tags": ["Earth", "Moon", "Mars"]
}
'

curl -H "Content-Type: application/json" \
	-X PUT http://localhost:9200/blog/_doc/t0003 -d '
{
	"name": "渡辺五郎",
	"title": "My Name Is Watanabe",
	"content": "I love fish",
	"tags": ["apple", "orange", "banana"]
}
'
```

データ数のカウント

```text
$ curl 'localhost:9200/blog/_count?q=*'
{"count":3,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0}}
```

データ投入後、検索します。

```text
$ curl -X Gcurl -X GET http://localhost:9200/blog/_search?q=title:yamamoto
{"took":9,"timed_out":false,"_shards":{"total":7,"successful":7,"skipped":0,"failed":0},"hits":{"total":{"value":1,"relation":"eq"},"max_score":0.9808291,"hits":[{"_index":"blog","_type":"article","_id":"t0001","_score":0.9808291,"_source":
{
	"name": "山本太郎",
	"title": "My Name Is Yamamoto",
	"content": "I love dog",
	"tags": ["red", "green", "blue"]
}
}]}}
```

```text
$ curl -X GET http://localhost:9200/blog/_search?q=tags:apple,moon 
{"took":66,"timed_out":false,"_shards":{"total":7,"successful":7,"skipped":0,"failed":0},"hits":{"total":{"value":2,"relation":"eq"},"max_score":0.9808291,"hits":[{"_index":"blog","_type":"article","_id":"t0002","_score":0.9808291,"_source":
{
	"name": "田中康夫",
	"title": "My Name Is Tanaka",
	"content": "I love cat",
	"tags": ["Earth", "Moon", "Mars"]
}
},{"_index":"blog","_type":"article","_id":"t0003","_score":0.9808291,"_source":
{
	"name": "渡辺五郎",
	"title": "My Name Is Watanabe",
	"content": "I love fish",
	"tags": ["apple", "orange", "banana"]
}
}]}}
```

データの削除

```text
$ curl -X DELETE http://localhost:9200/blog
{"acknowledged":true}
```

次のバージョンで確認しました。

```text
$ curl http://localhost:9200
{
  "name" : "iwata",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "R92Wu-uxTl2gad2cs6OkIg",
  "version" : {
    "number" : "7.17.1",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "e5acb99f822233d62d6444ce45a4543dc1c8059a",
    "build_date" : "2022-02-23T22:20:54.153567231Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
```

## Httpie の例 ##
[Elasticsearch: Httpie でアクセス](https://qiita.com/ekzemplaro/items/df1b5363319434f10e81)
Ex予約をすると自動的にGoogle カレンダーに登録する

#Ex予約時に自動的にGoogle カレンダーに登録

##やりたい事

Ex予約時に自動送信で届くメールをもとに、カレンダーに登録する。
Google Apps Script を作成し、Gmail 内のメールを解析して Google カレンダーに追加する。

###目的の振る舞い
######予約完了メールの受信時
- カレンダーにイベントとして追加

######予約変更メールの受信時
- 古いイベントをカレンダーから削除
- 新しいイベントをカレンダーに追加

######カレンダーへの登録形式
|タイトル|新幹線：東京→京都|
|:-----------------|:------------------|
|日時|2018/1/1 9:40 〜 2018/1/1 11:58|
|メモ|のぞみ3号 7号車 8E席|

## 実装方法
README：https://github.com/onagat/ex-yoyaku2google-cal
コード：https://github.com/onagat/ex-yoyaku2google-cal/blob/master/code.js

## 引用文献、引用コード
MITライセンスのもと公開されていたコードを使用し改変しました。foooomio氏に感謝申し上げます。
https://github.com/foooomio/ex-yoyaku 

#その他
なお、Google Apps Scriptの使い方については、
https://qiita.com/t_imagawa/items/47fc130a419b9be0b447
などをご覧ください。
Rubyの基本記述の仕方〜その6〜　form_with

本日、実務で初めて見たform_withについてまとめてみようと思います。

## form_with

html.erb上で、フォームを生成したい時に使用する構文です。
form_withの記述で、

```html.erb
form_with(model: nil, scope: nil, url: nil, format: nil, **options)
```
URL、スコープ、モデルの組み合わせを元にformタグが作成されます。

今回触れた実例では、

```html.erb
 <%= form_with model: [:admin, @user] do |f| %> 
   <div class="field"> 
      <%= f.label :email %><br /> 
      <%= f.email_field :email %> 
```
form_with model:〜
と記述されており、後ろに続く　:adminの記述によって、自動推測に使うオブジェクトを指定し、
inputフィールドにモデルの値を表示します。


また、参考記事をいくつか調べた所、一番基本的な記述は「form_for」もしくは「form_tag」と記載がありました。
今の自分では、文面を読んでも正しく理解できている気がしなかったので、
コードにもっと触れてその差分が分かり始めたころに再度、フォームの構築についてまとめたいと思います。


今日は、このあたりで失礼します。

## 参考サイト

[Rails 5.1] ‘form_with’ APIドキュメント完全翻訳
https://techracho.bpsinc.jp/hachi8833/2017_05_01/39502

Railsドキュメント　-フォーム(form)
http://railsdoc.com/form

RailsGuide -Action View フォームヘルパー
https://railsguides.jp/form_helpers.html
google-home-notifierを調べた

# GoogleHomeに発話させる方法はあった
スマートスピーカーから発話させる事は出来ないと思い込んでいたけど、GHKitというものが実現していると知った。
[GHKit Plusの活用方法紹介～Google Home、Amazon Echo、Clovaでできることを増やそう～](https://freelifetech.com/how-to-use-ghkit-plus/)
ここから調べて、[google-home-notifier](https://github.com/noelportugal/google-home-notifier)という仕組みを知った。
これはGoogleHomeに好きなテキストを発話させるライブラリ。
解説記事：[Google Home開発入門 / google-home-notifier解説](https://qiita.com/SatoTakumi/items/c9de7ff27e5b70508066)

# google-home-notifierを試した

実際には解説記事冒頭のやり方をそのままコピペして実行。途中エラーが出たが[google-home-notifierが「Error: get key failed from google」を吐いたので対策してみた](https://qiita.com/ezmscrap/items/24b3a9a8548da0ab9ff5)のママに修正したら、ちゃんと発話した

# google-home-notifierで何をやっているのか？
参考にした記事[Google Home開発入門 / google-home-notifier解説](https://qiita.com/SatoTakumi/items/c9de7ff27e5b70508066) の後半に詳しく書いてあった。
大体こんな感じらしい。
![1000.png](https://qiita-image-store.s3.amazonaws.com/0/7946/90da3ffa-b4de-e940-c61e-fec07603ebc8.png)

GoogleHomeは単なるスピーカーとして動作していて、テキスト→音声はGoogleのAPIを利用している。またGoogleHomeにはChromeCastとして音声を受け付けるので、そこに「音声」として受け取って流しているだけ。なのでGoogleHomeは単なるスピーカーとして動作しているようだ。


# 他のスマートスピーカーでも同じ事ができそう
前述の[GHKit Plusの記事](https://freelifetech.com/how-to-use-ghkit-plus/)にも「前進のGHKitがGoogle Homeのみの対応だったのが、Bluetooth接続に対応したことで、Amazon Echo、Clova、他Bluetoothスピーカー全般に対応したことでGHKit “Plus”となりました。」とあるように、単なるスピーカーとして繋げる事ができれば、後は同じ事ができそう。
また、テキスト→音声部分はGoogleAPIの他にも、色々なプロダクトがあるので、ここは好みで切り替える事もできそうです。

<img width="525" alt="Cloverを喋らせる.png" src="https://qiita-image-store.s3.amazonaws.com/0/7946/042aa725-47d2-8cf8-c5a6-b9f3d1309873.png">
PhalconでのUpdateメソッドまとめ


仕事でPhalconを使い始めてだいぶ期間が経ったので、ここで備忘録と振り返りも兼ねて、PhalconでのデータのUpdateメソッドの違いや方法についてまとめる。
とりあえず`Phalcon\Mvc\Model`配下のメソッドのみまとめてます。
PHQLやSQLの実行方法については後ほど追記します。

## はじめに

* Phalconに関するタグには記事が多いがどちらかというと環境構築周りの記事が多め
	* https://qiita.com/tags/phalcon/items
* `Phalcon\Mvc\Model`の`save`や`update`以外にもUpdateが出来るメソッドは色々とあるが情報が古いものが多い
* [Phalcon\Mvc\Model\Query::execute](https://docs.phalconphp.com/en/3.4/api/Phalcon_Mvc_Model_Query)とかの最新のQueryクラスの情報が少ない
* 各メソッドごとのメリット/デメリットが分かりづらいのでまとめる

## [Phalcon\Mvc\Model::save](https://docs.phalconphp.com/en/3.4/api/Phalcon_Mvc_Model)
言わずと知れた[Phalconのモデルの基底クラス](https://docs.phalconphp.com/en/3.4/api/Phalcon_Mvc_Model)の`save`メソッド。

* インスタンスのプロパティに設定後＆実行、もしくは引数に更新したい値を設定することで更新可能
* `Phalcon\Mvc\Model::initialize`メソッドで`useDynamicUpdate`メソッドを`ture`に設定すると、特定のカラムのみの更新も可能

```
    public function initialize() {
        $this->useDynamicUpdate(true);
    }
```
* 単一のモデル/テーブルへの更新向き

## [Phalcon\Mvc\Model::update](https://docs.phalconphp.com/en/3.4/api/Phalcon_Mvc_Model)
[Phalconのモデルの基底クラス](https://docs.phalconphp.com/en/3.4/api/Phalcon_Mvc_Model)の`update`メソッド。
saveメソッドよりもUpdateに特化したメソッド。

* インスタンスのプロパティに設定後＆実行
* インスタンスは`find`メソッド等でデータを取得する必要があり
* 単一のモデル/テーブルへの更新向き

## [Phalcon\Mvc\Model\Resultset::update](https://docs.phalconphp.com/en/3.4/api/Phalcon_Mvc_Model_Resultset)
[queryの実行結果クラス](https://docs.phalconphp.com/en/3.4/api/Phalcon_Mvc_Model_Resultset)にも実は`update`メソッドが存在する。
以下のメソッドの戻り値で取得できる。

* [Phalcon\Mvc\Model::find](https://docs.phalconphp.com/en/3.4/api/Phalcon_Mvc_Model)
* [Phalcon\Mvc\Model\Criteria::execute](https://docs.phalconphp.com/en/3.4/api/Phalcon_Mvc_Model_Criteria)
* [Phalcon\Mvc\Model\Query::execute](https://docs.phalconphp.com/en/3.4/api/Phalcon_Mvc_Model_Query)

[Phalconのモデルの基底クラス](https://docs.phalconphp.com/en/3.4/api/Phalcon_Mvc_Model)との違いは以下の点。

* クエリーの取得結果に対して、Update可能（SQLのupdate文のwhere句のようなイメージ）
* 単一のモデル/テーブルだけでなく、テーブルを結合してのUpdateも可能
* 検索結果はメモリ上で32件までしかキャッシュしないため、メモリも節約可能


## 参考
* [Phalconが生成するMySQLのUPDATEクエリーについて](https://qiita.com/pakiln/items/94e0a1e19a0c01764abd)
chromeの%の端数の処理がかわっている

何気なく納品したサイトを見てみたらレスポンシブ時に縦線がでる。なんでかなとFEに聞いたら、クロームがバージョンアップしてパーセントの端数の処理を変更した可能性ありとのこと。迷惑だなー。同じページでfirefoxとIE11でみてみると以上はない。迷惑な話だぜ
Web Starter Kitを作ってみた

## Web Starter Kitとは
静的Webサイトを制作する開発環境のボイラープレートです。
これだけあればとりあえず開発環境には困らないようなものです。
※名前はGoogleの[Web Starter Kit](https://github.com/google/web-starter-kit)から拝借。

## Repository
[ohnaka0410/web-starter-kit](https://github.com/ohnaka0410/web-starter-kit)

## 作った目的
* 周りにタスクランナーを採用している人がおらず、タスクランナーの便利さを広めたかった。
* 他のメンバーに手軽に環境を共有したかった。
* 多くの人に自分のタスクランナーを見ていただき、ツッコミやアドバイスなどがほしい。

## 基本構成

### Task Runner : [Gulp](https://gulpjs.com/)
Webpackやnpm scriptsなどもありますが、可読性・拡張性を重視すると、Gulpが一番しっくりきたので、Gulpを採用しました。
そのうち、[Parcel](https://parceljs.org/)か自作タスクランナーに乗り換え予定です。


### HTML : [handlebars](http://handlebarsjs.com/) + [Front-matter](https://jekyllrb-ja.github.io/docs/frontmatter/)

HTMLテンプレートエンジンは、handlebarsを採用しました。pug(Jade)は独特の記法の学習コストがかかり、ejsはテンプレート機能がないため不採用となりました。
また、ページ毎に変数が設定しやすいように、Front-matterも採用しました。


### CSS : [node-sass](https://github.com/sass/node-sass) + [PostCSS](https://postcss.org/) ([Autoprefixer](https://github.com/postcss/autoprefixer))
無難に今の所一番スタンダードなSass(scss)を採用しました。また、Autoprefixerなどの自動修正ツールも使いたかったので、PostCSSも採用しました。


### JavaScript : [Webpack](https://webpack.js.org/) + [Babel](https://babeljs.io/) ([@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env))

ES6以降の構文を使いたいので、トランスパイラとして、babelを採用しました。また、モジュールバンドラは実績のあるWebpackを採用。
現在、[rollup.js](https://rollupjs.org/guide/en)に切り替えようか迷ってます。


### Server : [Browsersync](https://browsersync.io/)

Gulpのタスクの中でブラウザをリロードさせることができ、また他にも多くのオプションがあるため採用しました。


### Linter : [stylelint](https://stylelint.io/) + [ESLint](https://eslint.org/)

CSS(scss)用のリンターとしてstylelint、JavaScriptのリンターとしてESLintを採用しました。
いずれもオプションが多く、自動修正機能もあります。
また、コードフォーマッターとして、[prettier](https://prettier.io/)も導入してあります。

## 実際に導入してみて

* 随時更新予定

## まとめ
構成などを長々と書いてみましたが、興味ある方は実際に使ってみていただくのが一番かと思います。
アドバイスなどあれば、どんどんご連絡くださいませ！
Javaで多言語対応 Localeの使い方について

超ひさしぶりにJavaを触って多言語対応を行うときにLocaleの使い方にちょっと悩んだのでチェック用のコードを作ってみた。

# はじめに
Localeの値を取得して自動的に言語処理を変えたい。
Locale.getDefault() の結果と、日本語を表す Locale.JAPANESE を比較して同じであれば日本語のメッセージを表示しようとしたが想定した値にならなかった。

# 悩んだこと

Locale.getDefault() の値は、ja_JP であったが、Locale.JAPANESE の値は ja であったため、比較しても日本語で表示できなかった。Locale.JAPAN の値は ja_JP だったため日本語を表示するには Locale.getDefault()の値と、Locale.JAPAN　を比較判定して表示すればいいのか？

#  解釈
Locale.JAPANは日本(国)を表し、Locale.JAPANESE は日本語(言語)を表す。
日本に住んでいても言語は英語を利用する人もいるため、Locale.JAPAN と比較するのはマズイ。
Locale.getDefault().getLanguage() で取得した値と、Locale.JAPANESE.getLanguage()の値を比較するのが良い。

面倒な英語は、アメリカ英語 en_US、イギリス英語 en_GB、オージー英語 en_AU があるけど表示は英語でOKでいいよな。イギリス英語はコックニーとかだと my を me とかbe動詞も変えたりする必要ある？東京の人が話す変な関西弁みたいに、いわゆるモックニー(mockney)になっちゃうかな？:thinking:

~~~java:LocaleTest.java
import java.util.Locale;
public class LocaleTest{
  public static void main(String[] args){
    Locale localization=Locale.getDefault();

    System.out.println("java.version:" + System.getProperty("java.version"));

    System.out.println("localization.toString():" + localization.toString()); // Locale型を文字列で表示

    System.out.println("localization.getCountry() :" + localization.getCountry() ); // 国
    System.out.println("localization.getLanguage() :" + localization.getLanguage() ); // 言語
    System.out.println("localization.getDisplayVariant():" + localization.getDisplayVariant()); // バリアント

    System.out.println("Locale.getDefault():" + localization); // Locale型
    System.out.println("localization.getLanguage():" + localization.getLanguage()); // 文字列型

    System.out.println("Locale.JAPAN(国):" + Locale.JAPAN);
    System.out.println("Locale.JAPAN(国.getCountry()):" + Locale.JAPAN.getCountry());
    System.out.println("Locale.JAPAN(国.getLanguage()):" + Locale.JAPAN.getLanguage());
    String msg=localization==Locale.JAPAN ? "こんにちは 世界！" : "Hello World";
    System.out.println(msg);

    System.out.println("Locale.JAPANESE(日本語):" + Locale.JAPANESE);
    System.out.println("Locale.JAPANESE(日本語.getCountry()):" + Locale.JAPANESE.getCountry());
    System.out.println("Locale.JAPANESE(日本語.getLanguage()):" + Locale.JAPANESE.getLanguage());
    msg=localization==Locale.JAPANESE ? "こんにちは 世界！" : "Hello World";
    System.out.println(msg);

    System.out.println("localization.getLanguage()==Locale.JAPANESE.getLanguage()");
    msg=localization.getLanguage()==Locale.JAPANESE.getLanguage() ? "こんにちは 世界！" : "Hello World";
    System.out.println(msg);

  }
}
~~~

## 実行結果
~~~
java.version:1.8.0_181
localization.toString():ja_JP
localization.getCountry() :JP
localization.getLanguage() :ja
localization.getDisplayVariant():
Locale.getDefault():ja_JP
localization.getLanguage():ja
Locale.JAPAN(国):ja_JP
Locale.JAPAN(国.getCountry()):JP
Locale.JAPAN(国.getLanguage()):ja
こんにちは 世界！
Locale.JAPANESE(日本語):ja
Locale.JAPANESE(日本語.getCountry()):
Locale.JAPANESE(日本語.getLanguage()):ja
Hello World
localization.getLanguage()==Locale.JAPANESE.getLanguage()
こんにちは 世界！
~~~
動的SOQLの作り方

SOQLを動的に作りたい場面があったので、方法と注意点について記事化


動的にSOQLを作成して、レコードを取得したいときは、
クエリ文字列を作成して`Database.query()` に渡してあげる

```java
String soql = 'SELECT Id FROM Account WHERE NAME ='+ VALUE;
List<Account> accountList = Database.query(soql);
```

ここで注意
↑みたいに単純にクエリ文字列に変数を繋げるとSQOLインジェクションが起きるらしいので、
`escapeSingleQuotes()`で変数を文字列として処理する

### 結論
↓みたいにする

```java
String soql = 'SELECT Id FROM Account WHERE NAME = '+ String.escapeSingleQuotes(VALUE);
List<Account> accountList = Database.query(soql);
```

### ポイント
- 動的SOQLはSOQLインジェクションに注意
    - `scapeSingleQuotes()`使う
- 静的SOQLはバインド変数を使っているのでSOQLインジェクションを防げるらしい


参考
- https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_dynamic_soql.htm
Object Detection APIで勾配降下法を変更したり、データ拡張を行う

# Object Detection APIで勾配降下法を変更したり、データ拡張を行う
Object Detection APIのデータ拡張や勾配降下法の変更方法が、あまり投稿されていなかったので、メモしておきます。

## 対象者
Object Detection APIを使ったことがある方

## 勾配降下法を変更する

### デフォルトの状態
下記デフォルトの状態で、70行目あたりに下記のコードがあると思います。
この中のoptimizerの箇所を変更していきます。

```
train_config: {
  batch_size: 24
  optimizer {
    rms_prop_optimizer: {
      learning_rate: {
        exponential_decay_learning_rate {
          initial_learning_rate: 0.004
          decay_steps: 800720
          decay_factor: 0.95
        }
      }
      momentum_optimizer_value: 0.9
      decay: 0.9
      epsilon: 1.0
    }
  }
```


### Adamに置き換えてみる
`momentum`の`optimizer_value`は不要な部分なのでごっそり削っています。

```
train_config: {
  batch_size: 24
  optimizer {
    adam_optimizer: {
      learning_rate {
        exponential_decay_learning_rate {
          initial_learning_rate: 0.004
        }
      }
    }
  }
```

自分の場合、これで多少精度はあがりました。

下記に他の勾配効果法の設定も記載されています。
https://github.com/tensorflow/models/blob/master/research/object_detection/protos/optimizer.proto



## データ拡張を行う
### データ拡張とは？
移動、回転、拡大・縮小などの人工的な操作を加えて、学習するデータを増やす手法です。
データがネックになる教師あり学習においては、非常に有効な手段となります。

詳しくは下記の記事がわかりやすかったので、チェックしてみてください。
http://aidiary.hatenablog.com/entry/20161212/1481549365


### デフォルトの状態
下記がデフォルトの状態で、164~167行目あたりにコードがあると思います。
この中のdata_augmentation_optionsというところを変更します。
デフォルトでは、random_horizontal_flip だけ設定されています。

```
 data_augmentation_options {
    random_horizontal_flip {
    }
  }
```


### 実際に設定する
今回は、下記2つを追加してみました！
`random_horizontal_flip `
画像を水平方向にランダムに反転させる。
`random_rgb_to_gray`
ランダムにrgbの値をグレーに変換する...(自身ない)

```
 data_augmentation_options {
    random_horizontal_flip {
     keypoint_flip_permutation: 1
    }
    random_rgb_to_gray {
     probability: 0.5
    }
  }
```
下記からいろいろ選択できるみたいですね。
https://github.com/tensorflow/models/blob/master/research/object_detection/protos/preprocessor.proto
https://github.com/tensorflow/models/blob/master/research/object_detection/core/preprocessor.py

これを設定することで、私の場合、20%の検出が、50%くらいに上がりました。

### わからなかったこと
`random_horizontal_flip`や`random_vertical_flip`で出てくる、
`keypoint_flip_permutation`の値が、**0 ~ 5**で選択できるみたいですが、この数値の違いがわかりませんでした。

ファイルでは、下記のように設定しているよう。
しかし説明がわからん......w

```
message RandomHorizontalFlip {
  // Specifies a mapping from the original keypoint indices to horizontally
  // flipped indices. This is used in the event that keypoints are specified,
  // in which case when the image is horizontally flipped the keypoints will
  // need to be permuted. E.g. for keypoints representing left_eye, right_eye,
  // nose_tip, mouth, left_ear, right_ear (in that order), one might specify
  // the keypoint_flip_permutation below:
  // keypoint_flip_permutation: 1
  // keypoint_flip_permutation: 0
  // keypoint_flip_permutation: 2
  // keypoint_flip_permutation: 3
  // keypoint_flip_permutation: 5
  // keypoint_flip_permutation: 4
  repeated int32 keypoint_flip_permutation = 1;
}
```
元ページ側の onchange を発火できなくてハマったのでメモ

```html:original.html
<select name="hoge" onchange="fuga()">
</select>
```

（jQUeryで）うまいことfuga関数をChromeExtensionから発火させたい。

```js:contentscript.js
//こういった書き方では実行できない。
$('select[name=hoge]').change();
```

セキュリティ的には当然。
じゃあどうするか。

```js:contentscript.js
//ダミーボタン作って
var tag = '<button type="button" id="myDummyButton" style="display: none;" onclick="fuga()">';

//追加して
$('form[name=piyo]').append(tag);

//発火
$('#myDummyButton').click();
```

うごいちゃうけどこれいいの？
UnityARKitPluginのARFaceAnchorで返ってくるBlendshape一覧

個人メモ

~~~
"eyeBlink_R",
"eyeWide_R",
"mouthLowerDown_L",
"eyeLookDown_R",
"cheekSquint_L",
"mouthDimple_R",
"browInnerUp",
"eyeLookIn_L",
"mouthPress_L",
"mouthStretch_R",
"browDown_L",
"mouthFunnel",
"noseSneer_L",
"eyeLookOut_L",
"eyeLookIn_R",
"mouthLowerDown_R",
"browOuterUp_R",
"mouthLeft",
"cheekSquint_R",
"jawOpen",
"eyeBlink_L",
"jawForward",
"mouthPress_R",
"noseSneer_R",
"jawRight",
"mouthShrugLower",
"eyeSquint_L",
"eyeLookOut_R",
"mouthFrown_L",
"cheekPuff",
"mouthStretch_L",
"tongueOut",
"mouthRollLower",
"mouthUpperUp_R",
"mouthShrugUpper",
"eyeSquint_R",
"mouthSmile_L",
"eyeLookDown_L",
"eyeWide_L",
"mouthClose",
"jawLeft",
"mouthDimple_L",
"mouthFrown_R",
"mouthPucker",
"mouthRight",
"browDown_R",
"eyeLookUp_L",
"mouthSmile_R",
"mouthUpperUp_L",
"browOuterUp_L",
"mouthRollUpper",
"eyeLookUp_R",
~~~
長い行列のテキスト数値データを読み込み→行例に変換するプログラムについて教えて下さい。python numpy pandas

python 初心者です。
１行に１つの数値データがある、長い行列のデータ群を規則に従って読み込んで、行列にする方法として、ベストな方法を検討しております。

＜読み込みデータサンプル＞
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
.
.
.

と続くデータを、

次のような順番で並べて行列にしたいのですが。

<作りたい行列>
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5..

上記の数値は、場所を示しています。
実際のデータは、ランダムな実数が入っています。

python,numpy,pandas..
どれで、どのように読み込めば、シンプルなプログラムになるでしょうか？
＜考え方＞
１.一旦全部読み込んで、その後並べる。
２.1行ずつ読み込みながら、行列に配置して行く。

読み込むデータ行数は、１０万行以上の行数を想定しています。
 

アドバイスよろしくお願いいたします。
Cloud SQL プライベートIPでの接続

#はじめに

Cloud SQLを使用する場合、今まではグローバルIPでの接続となるため、セキュリティを考慮し、cloud proxyやSSL等を使う事が推奨されていたが、今回、PrivateIPでの接続がベータで使えるようになったので試してみた。

公式
<https://cloud.google.com/sql/docs/mysql/private-ip>

#インスタンスの作成
作成時、接続の設定でプライベートIPがチェック出来る様になっている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297571/1766b09b-bddf-093d-b5a0-c14b7b96c6c6.png)

作成後、プライベートIPが振られる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/297571/247d3098-72ef-3118-717d-008f00ccdeb5.png)

#接続確認
あとは作成時に指定したVPC(今回はdefault)から接続が可能なはずなのでGCEから接続。
繋がらない。。。

#原因
Cloud SQLとGCEインスタンスのリージョンが異なっていた事が原因。

公式ページを見ると確かにリージョンは同一である事と書いてあった。
ちなみにゾーンは異なってもOKでした。

|リージョン|ゾーン|接続結果|
|:---|:---|:---|
|同じ|同じ|OK|
|同じ|異なる|OK|
|異なる|異なる|NG|

#終わりに
プライベートIPが使えるようになった事でオンプレの構成をそのままGCPに持っていく事がやっと可能になったー
pythonのmultiprocessingを使って、PHPのスクリプトを平行処理する

## はじめに
「[pthreadsを使わずにcronだけでPHPのバッチスクリプトを平行処理するアイデア](https://qiita.com/imunew/items/c0928a2a06fcdc199cc5)」で紹介した方法だと、平行数の分だけ`cron`の設定を追記しなければいけないので、`Python`の`multiprocessing`を使ってスッキリさせます。

```bash
$ crontab -e

*/5 * * * * php /path/to/batch/script.php 0/3
*/5 * * * * php /path/to/batch/script.php 1/3
*/5 * * * * php /path/to/batch/script.php 2/3
```

## 実装サンプル

```python
#!/usr/bin/python
# -*- coding: utf-8 -*-
# /path/to/batch/script.py
import os
import sys
from multiprocessing.pool import Pool

if __name__ == "__main__":

    args = sys.argv
    id_partition_size = 1

    if len(args) == 2:
        id_partition_size = int(args[1])

    def _batch(arg):
        os.system('php /path/to/batch/script.php {}/{}'.format(arg['partition_index'], arg['partition_size']))

    def run(id_partition_size):
        args = []
        for index in range(0, id_partition_size):
            args.append({'partition_index': index, 'partition_size': id_partition_size})

        pool = Pool(processes = id_partition_size)
        pool.map(_batch, args)

    run(id_partition_size)
```

これで、`cron`には下記の１行を設定するだけになりました。
並列数を変更する場合は、実行時引数を変更します。

```bash
$ crontab -e

*/5 * * * * python /path/to/batch/script.py 3
```

## おわりに
`python` `2.7`でも`3.5`でも動作したので、ほとんどのサーバーで追加インストールなしで動くはずです。
既存のソースコードを活用しつつも、手軽に分散・平行処理できるかと思いますので、活用いただければ幸いです。

ではでは。
Go言語で抽象化に使えそうな言語機能

# 挨拶

最近Goで仕事してますが抽象化の方法がようわからんのでぼちぼち調べている感じ。

# インタフェース・構造体・埋込

Goの基本的な抽象化機構としてはまあこの辺ですよね。

インタフェースといろんな実装型を定義してロジックに渡してみる例。
https://goplay.space/#SWC6a5AjSqy

インタフェースと構造体の埋め込みの例。Goは継承なしオブジェクト指向スタイルだそう。
親から子は見えないけど子から親は見えるので、親のフィールドは見えるし関数も呼べる。
https://goplay.space/#5wCOnPZv2i6

インタフェースで型を隠蔽する例。インタフェースだとメソッドを呼ぶ以外の操作ができなくなる。
https://goplay.space/#hzhrlUoptug

構造体といえば、型として定義した構造体と無名の構造体は可換（なんかに使える？）。ただし:=で単に代入したときは無名の構造体のままなのでメソッドは呼べない。
https://goplay.space/#_IyBl66MGSw

まあ非公開のフィールドがある場合、パッケージ外から見えないので可換とは言えないかも。

# パッケージ

名前空間を分けるための唯一のもの。
https://tour.golang.org/basics/1

グローバル変数、というかパッケージローカルな変数も定義できる。
https://play.golang.org/p/i6rbIoiHFJL

しかしパッケージ内に定義されたものは全部見えて（特に定数と変数が見えるのがつらい）空間がゆるすぎる。
あと構造体にどんなメソッドがあるか調べるにはファイル全部みないといけないのとかつらい。
ソースの頭にパッケージ名を書けるが、実質的にはディレクトリ名で参照するので、あれは意味あるのでしょうか。
同じディレクトリに複数のパッケージ名を置けないわりにプログラムのエントリーポイントは[mainパッケージのmain関数になる](https://golang.org/ref/spec#Program_execution)とかもよくわからない仕様。

# クロージャ

関数を返す関数を作って状態を保持・隠蔽できる。
https://goplay.space/#y5QneyUbs6c

# 関数型変数

Mat Ryerの記事だけど、抽象化の対象が関数1個で十分なら関数型使ったらいいという話。
https://medium.com/@matryer/tiny-abstractions-using-functions-in-go-39cd7b9a1db2

# Type switches

interface{}（Cでいう*voidみたいなもの）を受け取り、実際の型で判定して処理を分けるやつ。
https://tour.golang.org/methods/16

複数の型を代入したり関数で受け取ったりできる。
もうちょっと型の範囲を限定できたらいい気がするんだけど、インタフェースでしぼるしかない。
https://goplay.space/#VgfzZQ9snUw
iTerm2で「manpath: can't set the locale」エラー

iTerm2のバージョンを更新したら下記のエラーが出たのでメモします。

```
manpath: can't set the locale; make sure $LC_* and $LANG are correct
```

# 対応
「Preferences -> Profiles -> Terminal 」のEnvironment箇所にある
「Set locale variable automatically」のチェックを外す。

![スクリーンショット 2018-10-03 14.46.43.png](https://qiita-image-store.s3.amazonaws.com/0/110085/bc2504ea-81dc-0090-c3c1-6eab24f6386d.png)
BigqueryでUTCをJSTに変換する

## 前提条件
* standardSQL使用
* created_atはtimestamp型

## SQL
```sql
SELECT
  created_at AS UTC,
  FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', created_at, 'Asia/Tokyo') AS JST
FROM `PROJECT.DATASET.table_*`
WHERE _TABLE_SUFFIX BETWEEN '20180801' AND '20180801'
ORDER BY created_at
LIMIT 5
```

## 結果
|行  |UTC  |JST  |
|---|---|---|
|1  |2018-08-01 00:00:00 UTC|2018-08-01 09:00:00|
|2  |2018-08-01 00:00:01 UTC|2018-08-01 09:00:01|
|3  |2018-08-01 00:00:01 UTC|2018-08-01 09:00:01|
|4  |2018-08-01 00:00:02 UTC|2018-08-01 09:00:02|
|5  |2018-08-01 00:00:02 UTC|2018-08-01 09:00:02|
bootstrap-vueのモーダルを、モーダル外のクリックやESCキーで閉じないようにしたい場合

# bootstrap-vueで使えるモーダルウィンドウ
```
<b-modal></b-modal>
```
プロパティ(オプション？)を設定しないと、モーダルの外をクリックしたり、ESCキーを押すとモーダルが閉じてしまいます。
それを防ぐには、
### no-close-on-backdrop
### no-close-on-esc

この二つを設定します。

具体的には、

```
<b-modal no-close-on-backdrop=true no-close-on-esc=true>
</b-modal>
```

とすることで防ぐことが出来ます。

公式リファレンスを見ると他にも色々なプロパティがあるみたいです。
https://bootstrap-vue.js.org/docs/components/modal/
C++でSIMDを書くときのオススメライブラリ libsimdpp

## 概要

C++でSIMDを書く人向けの良いライブラリを見つけました。
https://github.com/p12tic/libsimdpp

SIMDをtemplateで扱うことができるので、SSE、AVXなどの異なった命令セットや、float, doubleなどの異なった型を同じコードで扱うことができます。

## メリット

- 命令セットを簡単に切り替えられる
- 型を簡単に切り替えられる
- ヘッダーオンリーで導入が楽

アセンブラや組み込み関数を使うくらいならlibsimdppを使った方が良いと思います。

## デメリット

- GPUと横断の抽象化(OpenCLなど)はできない
- 最新の命令に追従しないかもしれない

OpenCLとどちらを選ぶかは吟味する必要がありそうです。
OpenCLだとCPU向けのカリカリチューニングはできないかもしれないので、カリカリチューニングをする必要があるなら、libsimdppが良いと思います。

## 体験談

x86環境で、実際に使ってみてよかった点のレポートです。

### かんたんに移植できた

libsimdppへの移植は3時間くらいでサクっと終わり、floatからdoubleに切り替えて一発で動作したときは、簡単すぎてビビりました。コンパイル時に、型チェックができるので、ミスが少ないです。

### アルゴリズムの精度を分析できた

アルゴリズムの研究と、アプリケーションへの実装を同時並行で行なっています。

アプリケーションなので、高速化のためにfloatを使っています。ただ、一度アルゴリズムを、生の組み込み関数で書いてしまうと、doubleに切り替えるのはかなり大変です。

一方、研究用途で、以下を知りたいことがあります。

- アルゴリズム自体の性能が悪いのか、計算精度のせいで性能が悪いのか？
- 桁落ちやオーバーフローなど、計算精度を考慮した実装ができているか？

こういうときに、精度を切り替えたバージョンと結果を比較できると、調査がかんたんです。

### アルゴリズムのパフォーマンスを分析できた

型のサイズを変えたり、命令セットを変えたりすることで、メモリボトルネックなのか、CPUボトルネックなのかのヒントが得られました。

[Google BenchmarkのTemplate Benchmark機能](https://github.com/google/benchmark#templated-benchmarks)と組み合わせて、各命令セットでのパフォーマンスを、一覧でかんたんに出力できました。

## その他使ったもの

- Intel TBB
- Intel IPP
- Intel Architecture Code Analyzer: https://software.intel.com/en-us/articles/intel-architecture-code-analyzer

## 類似ライブラリ

### MIPP

- [MIPP github](https://github.com/aff3ct/MIPP)
- [MIPP: a Portable C++ SIMD Wrapper and its use for
Error Correction Coding in 5G Standard](https://hal.inria.fr/hal-01888010/document)

↑によると、AVX-512でMIPPのほうがsimdppより速い？理由は調べてない。
Amazon Linux note

# Security update
Amazon Linux Security Center

https://alas.aws.amazon.com/alas2.html

# v2
## Install old versions @ amazon-extras.

```shell
$ amazon-linux-extras install php7.2
 # ... Select no & didn't install 
$ amazon-linux-extras list
...
15  php7.2=latest            enabled    \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11 ]
...
$ amazon-linux-extras install php7.2=7.2.11
 # ... Select no, but display newest php vers 7.2.14
$ amazon-linux-extras list
 15  php7.2=7.2.11            enabled    \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11 ] 
$ yum clean all
# clean cache
$ yum install php
# display 7.2.11 vers
```

## I don't trust aws, keep source rpms by mysqlf!

```
yumdownloader php-7.2.11 --source
```

## MySQL?
Default mariadb (from rhel7?)
MySQL's packages has not contained in `amazon-linux-extras`.

### Client
Use dokcer.

### Server
PHPの長文テキストを書く時はどれでやる？>>>連結 or Enter改行 or ヒアドキュメント？

## 結論

>一般的なWebサービスの運用環境においてはパフォーマンス上の差は起こりません。
つまり、好みや書きやすさだけで判断して差支ありません。

※この記事を読んだ後に、頂いたコメントを読むことをおすすめします。

余談
ちなみに私はSQLを書く場合などに最も多く使うのですが、SQlをlogに保存する時に空白や改行も保存されてしまうのが嫌なので文字列連結で書くと事にしました。また、処理速度の違いにおいては体感的に殆ど変わらないので考えるだけ無駄だと言う結論に至ります。

この記事は、私が疑問を持ち自分なりの結論を出すために行った稚拙なテストを残すために残して置くとします。

#長文テキストの可読性と処理速度の両立

長文テキストを書く時にダラダラと横に書きたくはありませんよね。
そこで多く見かけるのが`.`で文字列連結をして見やすくする方法です。

```php
$text = 'SQLを書く時なんかは'
    .'長くならないために'
    .'よく改行しますよね！';
```

しかし、処理速度を遅くしたくは無い！！
と言うことで実験しまーす。

##文字列連結

```php
$st = microtime(true);
$text1 = "文字列を"
    ."連結すると"
    ."どうなるんだろうね。"
;
$now = microtime(true);
$time = $now -$st;
echo '処理1の時間:'.(sprintf('%8f', $time))."秒\n";
```
結果→　処理1の時間:0.000009秒

当たり前といえば当たり前ですが文字列連結の処理のせいで今回の検証で一番遅いです。
そして、文字列連結の数が多ければ多いほど更に遅くなるデメリットがあります！
※簡単なのでこの書き方の人は意外と多い…（僕は多用したくない）


##Enter改行

```php
$st = microtime(true);
$text2 = "
    文字列を
    連結すると
    どうなるんだろうね。
";
$now = microtime(true);
$time = $now -$st;
echo '処理2の時間:'.(sprintf('%8f', $time))."秒\n";
```
結果→　処理2の時間:0.000002秒

文字列連結に比べてかなり早くなりました。
僕はこの書き方をよく使っているんです。
デメリットとしては、Enter改行を無視してくれないパターンの時が以外と多いこと！

##ヒアドキュメント

```php
$st = microtime(true);
$text3 = <<<EOD
文字列を
連結すると
どうなるんだろうね。

EOD;
$now = microtime(true);
$time = $now -$st;
echo '処理3の時間:'.(sprintf('%8f', $time))."秒\n";
```

結果→　処理3の時間:0.000001秒

おお、早いっすね！
ヒアドキュメントは終了タグ周辺で改行が必要だったり
終了タグ前後で文字列を入れるとエラーになるところを無視すればとても優秀です！
※エラーの記述に関しては、phpのバージョンによっては異なる。

##テンプレートファイルを作成する
これは今回の様な例には不向きかも知れませんが、変数などを使ってテキストの内容を状況に応じて変更する事ができるのでいいと思います！
ちなみに僕の場合はAPIでXMLを作成する場合などでしか使った事がありません。
SwiftとiOSアプリで歩いた歩数を取得する

##SwiftとiOSアプリとXcodeで歩いた歩数を取得する

個人的に作りたいアプリで、iOSのヘルスケアの歩数を取得するモジュールを作る必要があったので、作りました。


```Swift
import UIKit
import CoreMotion
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    let pedometer:CMPedometer = CMPedometer()//プロパティでCMPedometerをインスタンス化。
//ここは、クラスのプロパティで宣言すること。getWalkのローカル変数で記述してしまって、コールバックが呼ばれるときにインスタンスが消えててエラーが発生してしばらく詰まりました。
    @IBAction func getWalk(_ sender: Any) {
        if(!CMPedometer.isStepCountingAvailable()) { //歩数が取得できるかどうかチェックしてます
            print("cannot get stepcount")
        }
        let from = Date(timeIntervalSinceNow: -10000)//-10000は適当な数字です。適宜最適な数字に書き換えてください。
        let to = Date()//現在を取得してます。
        
        pedometer.queryPedometerData(from: from, to: to, withHandler: {(pedometerData, error) in
            print("歩数は\(pedometerData!.numberOfSteps)")
            print("距離は\(String(describing: pedometerData?.distance))") // 距離
            print("登った回数\(String(describing: pedometerData?.floorsAscended))") // 上った回数
            print("降った回数\(String(describing: pedometerData?.floorsDescended))")
            })
    }
}

```

getWalkっていうメソッドのネーミングがあんまりよろしくないんですが、ここはリファクタリングの必要ありです。
info.plistも書き換える必要があって、これらは他のドキュメントに載ってると思います。
スクリーンサイズからCanvasサイズを調整する

引用：[How to add the iPhone X screen dimensions to the mix of different iPhone dimensions in Unity](https://stackoverflow.com/questions/46396983/how-to-add-the-iphone-x-screen-dimensions-to-the-mix-of-different-iphone-dimensi)

`Canvas > Canvas Scaler > UI Scale Mode` を `Constant Pixel Size` に設定。

<img width="418" alt="スクリーンショット 2018-10-03 12.05.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/136286/29baf0d7-c8d4-7863-1388-1f2abec27b96.png">

`Scale Factor` を調整する以下のコードをCanvasにアタッチする。

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CanvasScreenAutoFix : MonoBehaviour
{
    public static CanvasScreenAutoFix instance;

    private static float DEPEND_W = 1080;
    private static float DEPEND_H = 1920;

    public float scaleRatio = 1.0f;

    private void ResizeCanvas()
    {
        int screenW = Screen.width;
        int screenH = Screen.height;
        if (DEPEND_W == screenW && DEPEND_H == screenH)
        {
            scaleRatio = 1.0f;
            return;
        }
        else
        {
            float W_scale = screenW / (float)DEPEND_W;
            float H_scale = screenH / (float)DEPEND_H;
            float scale = W_scale < H_scale ? W_scale : H_scale;

            GetComponent<CanvasScaler>().scaleFactor = scale;

            scaleRatio = scale;
        }
    }

    private void Awake()
    {
        ResizeCanvas();
        if(instance == null)
       {
           instance = this;
       }
    }

}
```
mongooseでの集計(aggregate , group , sum)

#前提
 - MongoDB Serverがローカルで動作している前提
 - 動作確認環境
   - Windows10, VSCode
   - Node v8.11.3
   - "mongodb": "3.1.4",
   - "mongoose": "5.2.12",
 - 参考
  - [MongoDB で グループごと に データの合計値 を 集計する](https://garafu.blogspot.com/2018/01/mongodb-group-by-sum.html)
 
# サンプルソース

```js:mongoose-aggregate.js
// Mongoose aggreagate の例
// <参考>
// https://garafu.blogspot.com/2018/01/mongodb-group-by-sum.html
require('../../config/config.js')
require("../../db/mongoose.js");
const {SampleOrder} = require("../../models/sampleorder.js")

//サンプルデータ定義
const orders =[
  { datetime: Date.parse("2017-12-15T12:00:00+09:00"), item: "pen", amount: 70 },
  { datetime: Date.parse("2017-12-15T12:00:00+09:00"), item: "note", amount: 40 },
  { datetime: Date.parse("2017-12-15T12:00:00+09:00"), item: "eraser", amount: 100 },
  { datetime: Date.parse("2017-12-12T12:00:00+09:00"), item: "note", amount: 80 },
  { datetime: Date.parse("2017-12-08T12:00:00+09:00"), item: "eraser", amount: 50 },
  { datetime: Date.parse("2017-11-21T12:00:00+09:00"), item: "eraser", amount: 70 },
  { datetime: Date.parse("2017-11-13T12:00:00+09:00"), item: "pen", amount: 20 },
  { datetime: Date.parse("2017-11-02T12:00:00+09:00"), item: "pen", amount: 40 },
  { datetime: Date.parse("2017-10-23T12:00:00+09:00"), item: "pen", amount: 30 },
  { datetime: Date.parse("2017-10-18T12:00:00+09:00"), item: "pen", amount: 10 },
]
//初期化
async function initSampleOrders(){
  await SampleOrder.deleteMany({})
  let res = await SampleOrder.insertMany(orders)
  console.log('[initSampleOrders] length:',res.length)
}
//集計
async function groupSum(){
  console.log('---method:',groupSum.name)
  const res = await SampleOrder.aggregate()
  .group({
    _id:'$item',
    total:{$sum:'$amount'},
  })
  console.log(res)
}
//Main
async function main() {
  console.log('*** start ***')
  await initSampleOrders()
  await groupSum()
  console.log('*** end ***')
}
main()
```
# 実行結果
```console
*** start ***
[initSampleOrders] length: 10
---method: groupSum
[ { _id: 'note', total: 120 },
  { _id: 'eraser', total: 220 },
  { _id: 'pen', total: 170 } ]
*** end ***
```
Mac 端末で IE や edge 環境を構築する手順

Download virtual machines
https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/

1.上記のサイトから、マシーンを選んで zip をダウンロードする。

![スクリーンショット 2018-10-03 13.58.24.png](https://qiita-image-store.s3.amazonaws.com/0/184849/0dfd9f87-b640-8aa5-854a-0094fd51d374.png)

2.展開する。
<img width="241" alt="スクリーンショット 2018-10-03 14.10.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/184849/83aa4e44-486d-937f-e1fd-bf9823b0de37.png">

3.VirtualBox.app を開く  > ファイル > 仮想アプライアンスのインポート

4.展開したファイルを選択して、「インポート」ボタンを押下する。（後は勝手に起動してくれる！）![スクリーンショット 2018-10-03 14.20.53.png](https://qiita-image-store.s3.amazonaws.com/0/184849/23df52a2-703b-4759-6760-fcd7c7b2bfaf.png)

5.閉じる時は、中でシャットダウンをすること。
pybelがテキトウすぎてやばい話

大量のsmilesを処理しなければならなくなり、RDKitやpybelで処理できないsmilesをあらかじめ省く作業をしていた。

RDKitの場合

```py
from rdkit import Chem
mol = Chem.MolFromSmiles("C(=C)(=C)C") #やばすぎ構造
```
`[14:00:21] Explicit valence for atom # 0 C, 5, is greater than permitted`ってでてきた。うんうん。そうだね。

Pybel (OpenBabel) の場合

```py
import pybel
mol = pybel.readstring("smi", "C(=C)(=C)C")
print mol.write("can")
```
`C[C](=C)=C`と出力できてしまった。まじですかこれ。

ということで、構造が正しそうかどうかはRDKitを使い、とりあえずなんでもcanonical smiles出したければpybelを使いましょう。
Elasticsearch : How to rename a field 

### How to Rename an Elasticsearch field

- from

```
    columns:
    - {name: xxx, type: double}
``` 

- to

```
    columns:
    - {name: yyy, type: double}
``` 


### Pipeline API and reindex

- create a new Pipeline API : Rename Processor

```
PUT _ingest/pipeline/pipeline_rename_xxx
{
  "description" : "rename xxx",
  "processors" : [
    {
      "rename": {
        "field": "xxx",
        "target_field": "yyy"
      }
    }
  ]
}
```

```
{
  "acknowledged": true
}
```


- then reindex


```
POST _reindex
{
  "source": {
    "index": "source"
  },
  "dest": {
    "index": "dest",
    "pipeline": "pipeline_rename_xxx"
  }
} 
```

### References
 - https://www.elastic.co/guide/en/elasticsearch/reference/master/rename-processor.html
使われていないSecurity Groupsを抽出するScript

使われていないSecurity Groupsを抽出するだけの簡単なスクリプトを書きました。使っていないものを削除して整理しましょう！
スクリプトは各サービスのインスタンスなどにアタッチされていないSecurity GroupのIDを抽出します。
環境変数やif文は各自追加したり変更すればよいです。
jsonでやる場合は抽出方法は変わります。

```bash:sg_check.sh
#!/bin/bash

export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_DEFAULT_OUTPUT=text

aws ec2 describe-security-groups | grep SECURITYGROUPS | awk -F "\t" '{print $3}' | sort -u | while read line
do
aws ec2 describe-instances | grep $line > /dev/null
if [ $? -eq 0  ]
then
  continue
fi
aws elb describe-load-balancers | grep $line > /dev/null
if [ $? -eq 0  ]
then
  continue
fi
aws ec2 describe-network-interfaces | grep $line > /dev/null
if [ $? -eq 0  ]
then
  continue
fi
aws rds describe-db-instances | grep $line > /dev/null
if [ $? -eq 0  ]
then
  continue
fi
aws autoscaling describe-launch-configurations | grep $line > /dev/null
if [ $? -eq 0  ]
then
  continue
fi
echo $line
done
```

descriptionをちゃんと書いてSecurityGroupは整理したいですね。。。

# 参考
https://qiita.com/rmanzoku/items/f18bee522d90f9bd2b78
https://qiita.com/wildeagle/items/f01f316e791115c6d887
NGINX Unit でIPv6のリスナーを追加する

[公式](http://unit.nginx.org/configuration/)にも意外と見つからなかったので、備忘録。

# NGINX Unit のリスナー設定

例えば `some_app` のリスナーを設定する時のリクエスト本文は以下だが、

```json
"listeners": {
    "*:37564": {
        "application": "some_app"
    }
}
```

これだと普通にIPv4でしかLISTENされない。

```console
# lsof -i | grep unitd
unitd     9999 nobody   99u  IPv4  99999      0t0  TCP *:37564 (LISTEN)
```

IPv6も追加する場合は、NGINX の設定と同様に `[::]` のように明示的にIPv6を指定する。

```json
"listeners": {
    "*:37564": {
        "application": "some_app"
    },
    "[::]:37564": {
        "application": "some_app"
    }
}
```

これでIPv4もIPv6もLISTENされる。

```console
# lsof -i | grep unitd
unitd     9999 nobody   99u  IPv4  99999      0t0  TCP *:37564 (LISTEN)
unitd     8888 nobody   99u  IPv6  88888      0t0  TCP *:37564 (LISTEN)
```
OpenStruct#to_jsonでtableが含まれないようにする

なにかと便利な`OpenStruct`。Hashの代わりに使ったりすることが多いですよね :bulb: 

ただ、`to_json`したときに`table`が含まれてしまうと邪魔なのでモンキーパッチをあてます。

before
---
`table`が邪魔だなぁ :cry: 

```rb
[1] pry(main)> o = OpenStruct.new(a: 1, b: OpenStruct.new(c: 2))
=> #<OpenStruct a=1, b=#<OpenStruct c=2>>
[2] pry(main)> o.to_json
=> "{\"table\":{\"a\":1,\"b\":{\"table\":{\"c\":2}}}}"
```

after
---
モンキーパッチをあてます。
（railsなら`config/initializers`にでも置いておけば :ok_hand: ）

```rb
class OpenStruct
  def as_json(options = nil)
    @table.as_json(options)
  end
end
```

`table`がなくなった :wink: 

```rb
[1] pry(main)> o = OpenStruct.new(a: 1, b: OpenStruct.new(c: 2))
=> #<OpenStruct a=1, b=#<OpenStruct c=2>>
[2] pry(main)> o.to_json
=> "{\"a\":1,\"b\":{\"c\":2}}"
```

以上です :hugging: 


参考
---
- [ruby on rails - Collecting hashes into OpenStruct creates "table" entry - Stack Overflow](https://stackoverflow.com/questions/7835047/collecting-hashes-into-openstruct-creates-table-entry)
- [Class: OpenStruct — Documentation for ostruct (2.3.1)](https://www.rubydoc.info/stdlib/ostruct/OpenStruct)