OmniAICreator/Qiita-1.07M huggingface dataset:
Oracle 各スキーマがアクセスできるプロシージャ、パッケージ、ファンクション、トリガーなどの依存性リスト取得

```SQL:list_dependencies.sql
--
-- 各スキーマがアクセスできるプロシージャ、パッケージ、ファンクション、トリガーなどの依存性リスト取得
--
-- 当然のことだが、OracleにSTOREされないSQL単体やPL/SQLの無名ブロックはこのリストには載らない。
--
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING ON
SET LINESIZE 250
SET PAGESIZE 50000
SET TAB OFF
SET TERMOUT OFF
SET TRIMSPOOL ON
-- SPOOL pass includes CONNECT_IDENTIFIER, USER_NAME and SYSDATE
COLUMN USER_NAME    NEW_VALUE USER_NAME
COLUMN SYSTEM_DATE  NEW_VALUE SYSTEM_DATE
SELECT USER || '_' AS USER_NAME
     , TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS') AS SYSTEM_DATE
FROM DUAL ;
SPOOL list_dependencies_&&_CONNECT_IDENTIFIER._&&USER_NAME&&SYSTEM_DATE..log
-- Windows ↑,  UNIX/Linux では ↓ を有効に
-- SPOOL list_dependencies_\&&_CONNECT_IDENTIFIER._\&&USER_NAME\&&SYSTEM_DATE..log
BREAK ON NAME ON TYPE
COLUMN NAME                  FORMAT A30
COLUMN TYPE                  FORMAT A17
COLUMN REFERENCED_NAME       FORMAT A45 HEADING "REFERENCED OWNER.NAME"
COLUMN REFERENCED_TYPE       FORMAT A12
COLUMN REFERENCED_LINK_NAME  FORMAT A15
COLUMN DEPENDENCY_TYPE       FORMAT A10
SELECT
    DP.NAME                                -- オブジェクトの名前
  , DP.TYPE                                -- オブジェクトのタイプ
  , DECODE(MO.STATUS, 'VALID', NULL, MO.STATUS) AS STATUS
  , MO.LAST_DDL_TIME                                                 -- 最後に更新された日次
  , NVL2(DP.REFERENCED_LINK_NAME, DP.REFERENCED_OWNER                -- 参照されるオブジェクトの所有者(リモート・オブジェクトの場合はリモートの所有者).
                                  || '.' || DP.REFERENCED_NAME       -- 参照されるオブジェクトの名前
                                  || '@' || DP.REFERENCED_LINK_NAME  -- 親オブジェクトへのリンク名(リモートの場合)
  , DP.REFERENCED_OWNER || '.' || DP.REFERENCED_NAME) AS REFERENCED_NAME
  , DP.REFERENCED_TYPE                     -- 参照されるオブジェクトの型
  , DECODE(RO.STATUS, 'VALID', NULL, RO.STATUS) AS R_STATUS
  , DECODE(DP.DEPENDENCY_TYPE, 'HARD', NULL, DP.DEPENDENCY_TYPE) AS DEPENDENCY_TYPE  -- 依存性がREF依存性であるか(REF)、そうでないか(HARD)
FROM USER_DEPENDENCIES DP
LEFT OUTER JOIN USER_OBJECTS MO  -- MY OBJECT
ON  MO.OBJECT_TYPE = DP.TYPE
AND MO.OBJECT_NAME = DP.NAME
LEFT OUTER JOIN USER_OBJECTS RO  -- REFERENCED OBJECT
ON  RO.OBJECT_TYPE = DP.REFERENCED_TYPE
AND RO.OBJECT_NAME = DP.REFERENCED_NAME
WHERE
    RO.OBJECT_NAME NOT LIKE 'BIN$%' -- except trash box, since Oracle10.1.0
ORDER BY 
    DP.NAME
  , DP.TYPE
  , DP.REFERENCED_OWNER
  , DP.REFERENCED_NAME
  , DP.REFERENCED_TYPE
  , DP.REFERENCED_LINK_NAME ;
SPOOL OFF
-- SYS.STANDARD は Oracle社が提供している標準関数(SQL language referenceに載っている関数)を1つ以上使っていると当リストに載る
CLEAR BREAK
COLUMN NAME                  CLEAR
COLUMN TYPE                  CLEAR
COLUMN REFERENCED_NAME       CLEAR
COLUMN REFERENCED_TYPE       CLEAR
COLUMN REFERENCED_LINK_NAME  CLEAR
COLUMN DEPENDENCY_TYPE       CLEAR
SET ECHO ON
SET FEEDBACK ON
SET HEADING ON
SET LINESIZE 80
SET TERMOUT OFF
```
Javaで実行したJavaScriptからJavaメソッドをコールする


■本家のドキュメント(1)
https://docs.oracle.com/javase/jp/6/technotes/guides/scripting/programmer_guide/
■本家のドキュメント(2)
https://developer.mozilla.org/ja/docs/Rhino/Scripting_Java



```java

package pkg;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class HelloJavaScript {
	public void run() {
		System.err.println("hello!");
	}
	public static void main(String[] args) {
		// see
		// https://developer.mozilla.org/ja/docs/Rhino/Scripting_Java
		// These packages are likely not in the java package, so you'll need to
		// prefix the package name with "Packages."

		// Get the JavaScript engine
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine = manager.getEngineByName("JavaScript");
		String script = "" //
				+ "var obj = new Packages.pkg.HelloJavaScript();" //
				+ "obj.run();" //
		;
		try {
			engine.eval(script);
		} catch (ScriptException e) {
			e.printStackTrace();
		}
	}
}
```
PHPで作ったシステムをデスクトップアプリ風にする

卒業制作で備品管理システムを作ったのですが、何故かローカル（学校内）で使用するシステムなのにPHPで作ってしまった（当時使いこなせる言語がjsとphpくらいしか無かった）ので、それをどうにかしよう、という経緯。

※今回のシステムはサーバーではなくクライアント側のPCに入っているものとします

# 「別にそのままでもいいのでは？」
別にブラウザを開いて`http://localhost/`ﾀｧｰﾝとキーボードで叩いてもらってもいいのですが…それ以前な問題がたくさんあります。

- システムをPCに導入するのが面倒
  - 今回サーバーはXAMPPではなくiisを使用していた
  - iisに合わせてPHP 7.xをインストールが必要 & php.iniを色々修正
  - MySQLもインストールが必要

この時点でやる気が削がれます（開発を始める際も相当苦労しました）

- クライアント側での操作次第で挙動が変わる
  - cssでposition:stickyを使っていたり、chromeでしかテストしていないので、chromeで使ってほしい
  - chromeのデベロッパーツールで好き放題postで送るデータを改ざんできる
  - ブラウザの設定次第で挙動も変わってくる
  - `http://localhost/`のショートカットをPC上においてもデフォルトの設定次第で起動するブラウザが変わってくる

これはマズいと思い、色々改善策を探ってみた（前置きなっがい

**要はphp7が動くサーバーとurlとかメニューバーがないBlinkレンダリングエンジンが一体になっている、かつクライアントのPCへの導入が楽になるものが欲しい！**

# ボツになったもの
 - winbinder
   - <del>サイトがクローズしているのでボツ</del>Githubに移行していたっぽいが、php7未テストということでボツ
 - HC-Standalone-S+ for PHP
   - winbinderを使っているのでボツ
 - PHP-GTK
   - PHP 5.xしかないのでボツ

# PHP Desktop
名前の通りphpが使えてレンダリングエンジンがBlinkのchromiumを使用しているこれを使うことにしました。
[phpdesktopのGithub](https://github.com/cztomczak/phpdesktop)	
今回は最新版の`PHP Desktop Chrome 57.0`を使っていきます。

zipファイルを解凍するだけで使えます、楽ですね！
何やら色々ファイルが入っていますが、`www`ディレクトリにphpで作ったものを置いて`phpdesktop-chrome.exe`を実行すればあたかもデスクトップアプリケーションのような振る舞いをしてくれます（多分最初の画面は`www/index.php`にしないといけないと思います）。

## 設定
`settings.json`を設定することによってブラウザの設定やウィンドウの設定などできます。
詳しくはwikiに書いてます。
参考程度に自分はどの項目を修正したかだけ載せてみます。

```json
"debugging": {
    "show_console": false
},
"main_window": {
    "title": "備品管理システム",
    "icon": "hoge.png",
    "default_size": [1366, 768],
    "disable_maximize_button": true,
    "center_on_screen": true,
    "start_maximized": true,
    "start_fullscreen": true,
    "always_on_top": true
},
"chrome": {
    "external_drag": false,
    "reload_page_F5": false,
    "devtools_F12": false,
    "command_line_switches": {
    	"lang": "ja"
    },
    "enable_downloads": true,
    "context_menu": {
        "enable_menu": false,
        "navigation": false,
        "view_source": false,
        "open_in_external_browser": false,
        "devtools": false
	},
}
```
何やら色々書きましたが、簡単に何の設定変えたかというと

- コンソール（cmd）が開かないように
- ウィンドウ左上のアイコンと名前を変更
- 画面サイズを固定化&常時トップに表
- デベロッパーツールを無効化
- 言語を日本語に
- リロード（F5）を無効化

コンテキストメニューもほとんど無効化しました
phpdesktopを使用する際には言語は絶対に日本語にしたほうが良いかと思います。下記症状が確認できました

- 漢字が中華フォントになる
- プルダウンメニューが開かない
- input type="date"のdatepickerが開かない
- デベロッパーツールの設定が反映されない

これで無事phpなのにそれっぽいデスクトップアプリが完成しました。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/158800/b85d21c6-de2a-b2c7-580a-f25987a45225.png)
メモ：Docker上でRailsを動かす時の初期化処理どうする？

この記事は
===

FargateとかeksとかいよいよAWSもDocker全開になってきていいかげんちゃんとサーバで動くDockerfileを模索していた時に、Railsの各種初期化をどうするんだろうと迷った時のメモです

初期化処理諸々
===

Gemのインストール（bundle install）
---

* bundle installはシンプルにビルド時に実行すればOKです

```dockerfile:Dockerfile
RUN \
  gem install bundler && \
  echo 'gem: --no-document' >> ~/.gemrc && \
  cp ~/.gemrc /etc/gemrc && \
  chmod uog+r /etc/gemrc && \
  bundle config --global jobs 4 && \
  bundle install && \
  rm -rf ~/.gem
```

DBスキーマの作成
---

* ECSの場合RDSを使うと思うので、そもそも考慮不要です

DBマイグレーション
---

* ```rake db:migrate```はDBが起動していないといけないので、ビルド時には実行不可能です
* 悩みましたがコンテナ起動時にどさくさでmigrationも毎回かけてしまうことにしました
    * ChefベースのOpsworksの標準Railsテンプレートもそんな動きになってた気がするし

```dockerfile:Dockerfile
ENTRYPOINT bundle exec rake db:migrate && \
    bundle exec unicorn_rails -E production -c config/unicorn.rb -D && \
    /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
```

asset precompile
---

* docker build時にまとめて実行したいところなのですが、```rake assets:precompile```は動かないというジレンマが・・・
    * これもビルド中はDBサーバが存在しないという制約によります
* 色々調べていたら[The NullDB Connection Adapter Plugin](https://github.com/nulldb/nulldb)というActiveRecordのモックアダプタを発見、これでいけることがわかりました

```ruby:Gemfile
gem 'activerecord-nulldb-adapter'
```
```dockerfile:Dockerfile
RUN bundle exec rake assets:precompile DATABASE_URL=nulldb://localhost
```

終わりに
===

* ```rake assets:precompile```とかはそもそもDBに繋がない仕様にしてほしい気がしますね
* フロントはyarn/reactでSPAみたいな潮流だからもうasset pipelineとかほとんど使わない説もありますが。。
Project Euler 30「各桁の5乗」

はじめてのジェネレータ関数。

# Problem 30 「各桁の5乗」
驚くべきことに, 各桁を4乗した数の和が元の数と一致する数は3つしかない.

1634 = 1^4 + 6^4 + 3^4 + 4^4
8208 = 8^4 + 2^4 + 0^4 + 8^4
9474 = 9^4 + 4^4 + 7^4 + 4^4

ただし, 1=1^4は含まないものとする. この数たちの和は 1634 + 8208 + 9474 = 19316 である.
各桁を5乗した数の和が元の数と一致するような数の総和を求めよ.

```python
def hoge(num):
    # 最大値の算出
    d = 1 # 桁数
    while True:
        # 例えば 9^5*7=413343 であるため、9の5乗を7個足しても7桁には至らないことが分かる
        # このことから 9^5*6=354294 が問の条件に合致する可能性のある最大の値となる（たぶん）
        if d > len(str(9 ** num * d)):
            break
        d += 1
    max_number = 9 ** num * (d-1)
    # ジェネレータ関数を使ってみる
    def search():
        # 1=1^5は含めないので2^5(最小値)→最大値まで地道に全件走査
        for n in range(2**num, max_number+1):
            x = sum( int(m) ** num for m in str(n) )
            if n == x: yield x
    return sum(search())

print(hoge(5))
```

ジェネレータ関数の使い方あってますかね。
Azureのディスクのサイズ(容量)を減らす


結論は**できない。**
2019/07/25時点でもできない。

![azure_disk_size_変更.png](https://qiita-image-store.s3.amazonaws.com/0/206716/144c45ee-1822-c72d-8d83-5adb1d1e92c0.png)


下記に記載されています。
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/expand-os-disk

    警告  
    新しいサイズには、既存のディスク サイズより大きい値を指定する必要があります。

サイズの拡張(増やす)は、情報が多いが減らす情報は上記しかありませんでした。
データディスク(非OSディスク)について、VMのDiskManagementで容量を減らしても、無理でした。

ディスクは、VMと違って停止ができません。
初期サイズおよび増やす際には、ご注意を。ランニングコストに直結します。
*どうしても減らしたい場合は、新規にディスク作成して移行するしかないか？。ただし、OSディスクだとそれも難しい。

## 参考サイト
ディスクのサイズの変更
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/expand-os-disk

Azure仮想マシンのOSディスク容量を拡張する
https://qiita.com/yotan/items/bfba7581a4168a401e2a
PC SSDかHDDか確認する場合 windows10

### SSDかHDDか確認する場合
①エクスプローラを開く。windows + E 同時押し
②Cドライブを右クリックでプロパティを開く
③ツールタブを開く
④ドライブの最適化とデフラグの最適化を選択する。
⑤ドライブ毎にメディアの種類が表示されている

ソリッド ステート ドライブ　→　SSD
ハードディスク ドライブ　→ HDD
LTspice > LTspice事始め


以下のページからダウンロード
[Linear Technology - デザイン・シミュレーション](http://www.linear-tech.co.jp/designtools/software/#LTspice)

ユーザー登録を済ませてからダウンロードする流れになります。

DL後、インストーラーを起動します。
特に迷うことなく進むと思います。
インストールが完了すると以下の画面が表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/3c73cb66-fcec-4691-05e9-d196c96aeb7a.png)
react-grid-layout



[STRML/react-grid-layout: A draggable and resizable grid layout with responsive breakpoints, for React.](https://github.com/STRML/react-grid-layout)


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/5d09f992-48bf-7322-9095-301ac54226b9.png)


## Installation
Install the React-Grid-Layout package package using npm:

```bash
npm install react-grid-layout
```

creat index.html

Include the following stylesheets in your application:

/node_modules/react-grid-layout/css/styles.css
/node_modules/react-resizable/css/styles.css
Angular  dateフォーマットで表示が崩れる





appフォルダ直下moment.pipe.pipe.tsを作成する

```ts moment.pipe.pipe.ts
import { Pipe, PipeTransform } from '@angular/core';
import * as moment from 'moment';

@Pipe({
    name: 'momentPipe'
})
export class MomentPipePipe implements PipeTransform {

    transform(value: any, args?: any): any {
        moment.locale('js');
        if (value === undefined || value === null) return '# value is undefined or null #';  // (3)
        if (args === undefined || args === null) return '# args is undefined or null #'  // (4)
        let s = moment(value).format(args);
        return s;
    }

}
```



## 参考

[DatePipe を IE11 等で動かすと変な表示になる件に対応する - らびたろちゃんにっき](http://rabitarochan.hatenablog.com/entry/2017/04/20/204600)

[Angular Tips: Formatting Dates with a Custom Date Pipe (dd/MM/yyyy)](https://loiane.com/2017/08/angular-tips-formatting-dates-with-a-custom-date-pipe-dd-mm-yyyy/)

[date pipe formatter doesn't format minutes and seconds properly in IE 11.0.9600.18350 and Edge · Issue #9524 · angular/angular](https://github.com/angular/angular/issues/9524)
Primer３のTm値計算をJavaScriptに実装


Primer３のTm値計算は oligotm.c というプログラムが担っています。
今回はこちらをJavaScriptに移植しました。

ファイルのダウンロードは以下からできます。

```Bash:Download
git clone https://github.com/Kazuki-Nakamae/oligotmJS.git;
```

使い方は以下のようです。

```html:example.html
<script src="./oligotm.js"></script>

<script>
    var instance = new oligotm();
    /*
    oligotm(Sequence,
            DNA concentration,
            Concentration of salt,
            Salt concentration (mM),
            Concentration of dNTPs (mM),
            tm_method_type({ breslauer_auto: 0, santalucia_auto: 1 }),
            salt_correction_type({ schildkraut: 0, santalucia: 1, owczarzy: 2 })
    */
    var Tmvalue = instance.oligotm("ATTTGCGCGAATGCAATCGG", 50, 50, 0, 0, 0, 0) // primer3 default setting
    console.log(Tmvalue)
</script>
```

```Result
68.302986
```

![Screen Shot 2018-02-14 at 3.35.15 PM.png](https://qiita-image-store.s3.amazonaws.com/0/147329/28c0950c-23a0-fd46-205a-7a23587c08da.png "Screen Shot 2018-02-14 at 3.35.15 PM.png")

出力値は実際のPrimer3の出す値とずれてないことがわかります。

実際に行ったテストでは、デフォルトのパラメータで 1bp-40bp の範囲でそれぞれ10万種類の配列をNodejs上で計算し、その出力値がoligo.tmの出力と相違がないことを確認しています。
また、18bp-36bp の範囲でそれぞれ1配列ずつを実際のブラウザ（IE11, Edge, Chrome, FireFox, Safari, Opera）で計算し、その値が[Primer3 plus](http://www.bioinformatics.nl/cgi-bin/primer3plus/primer3plus.cgi)が返す値と同一であることを確認済みです。

何かご意見や問い合わせがありましたらコメントして頂けると幸いです。
Semantic Segmentation Using Deep Learning

#概要
深層学習を活用したSemantic Segmentationについての論文をピックアップし掲載する。

##FCN(Fully Convolutional Networks)
畳み込みのみで表現されたネットワークで全結合層がないことが特徴。
スキップアーキテクチャーによってローカル特徴を保持する。
（プーリングを行うほど高次な特徴が抽出できるが、ローカルな特徴は失われていくという性質がある）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204210/5763631a-9985-bd63-16ac-0234d5c879c1.png)
https://arxiv.org/abs/1411.4038
##U-Net
プーリング層は位置情報を曖昧にする性質がある。
そのため、浅い層では位置情報が鮮明に、深い層では位置情報が曖昧になっていく。
領域検出では位置情報は曖昧にしてほしくないため、
Encoder-Decoder構造により、物体の局所的情報と全体的位置情報の両方を統合して学習している。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204210/308634c8-dfb7-8ec6-f5c3-c46168f57d37.png)
https://arxiv.org/abs/1505.04597
##SegNet
FCNでは出力層の部分で計算量が多く、メモリや時間を多く必要とする課題がある。
セグメンテーションを高速、省メモリに行えるようにするためにEncoder-Decoder構造を提案。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204210/e9229805-b2c5-31c9-63a3-7712b5ab60af.png)
https://arxiv.org/abs/1511.00561
##PSPNet(Pyramid Scene Parsing Network)
ILSVRC2016のセマンティックセグメンテーションで1位でCVPR2017で発表された論文。
入力画像からCNN(ResNet+Dlilated Net)で特徴抽出し、その特徴量を異なるサイズのPoolingをかけてUp-samplingし、結果を統合することで識別結果を出力する。オブジェクトの関連性の考慮や似たものの判別、不明瞭なクラスの検出を行わせることが目的。
グローバルな特徴を検出するためのピラミッド構造。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204210/2ee96193-121f-cd96-1fe8-3b00635ec68a.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204210/b4c87a80-daca-fdc6-2f18-e0f4821be6ac.png)
https://arxiv.org/abs/1612.01105
https://hszhao.github.io/projects/pspnet/
https://github.com/mitmul/chainer-pspnet
https://github.com/rkuga/PSPNet
##HFCN(Highly Fused Convolutional Network)
up-conv部によって低層で獲得したグローバルな特徴を改めて畳み込むことで得られる特徴を拡張して再利用している。
ソフトコスト関数という領域面積比を考慮した損失関数によって小領域であるときに学習が粗く進むことの対策をしている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204210/226f3811-e291-697f-8e7d-14c07a2ffaa7.png)
https://arxiv.org/abs/1801.01317
##VH-HFCN
HFCNの拡張ネットワーク。Downsampling後の特徴マップに対し、VH-stageで垂直方向(9×1)と水平方向(1×9)伸びるカーネルを指定した畳込み層により垂直線形特徴と水平線系特徴を抽出する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204210/3fb7bfc1-8b75-eab0-aed1-7f6023ef3868.png)
https://arxiv.org/pdf/1804.07027.pdf

#参考文献リストのサイト
http://ni4muraano.hatenablog.com/entry/2017/08/15/165213
https://github.com/tangzhenyu/SemanticSegmentation_DL

#更新履歴
20180426 : VH-HFCN追加
201803xx : 記事作成
Webサイトの動画自動再生を iphone / android / pc で行う。

WordPressサイトのファーストビューで動画を自動再生してほしいと言われ、iphoneで再生されず詰ってしまいました。
自動再生・ループ再生をiphone / android / pcで行ったのでまとめ。
デバイスに関する条件分岐に関しては、ざっくりとした感じだったのでざっくりにしています。

# 条件分岐タグの話

## wp_is_mobile( )
pcとそれ以外を識別する。
今回はこのタグの内部にiphone / androidを識別する条件分岐を追加。
> 携帯電話・スマートフォンを特定して検知するわけではなく、タブレットもモバイルデバイスとして認識されることに注意してください。(Codexより）

## is_android( ) ,is_iphone( )
こちらはfunctions.phpに自分で設定します。

```php:functions.php
// androidを識別
function is_android() {
  $is_android = (bool) strpos($_SERVER['HTTP_USER_AGENT'],'Android');
  if ($is_android) {
      return true;
  } else {
      return false;
  }
};

// iphoneを識別
function is_iphone() {
  $is_iphone = (bool) strpos($_SERVER['HTTP_USER_AGENT'],'iPhone');
  if ($is_iphone) {
      return true;
  } else {
      return false;
  }
};
```

## \<video>\</video>と\<video>\<source>\</video>
環境が動画のフォーマットをサポートしているかを順番に検証し、該当したものを再生する場合（複数のフォーマットを指定する必要がある場合（複数指定できるだけ余裕のある素材をお持ちの場合））は`<video><source></video>`で複数指定しておくと良く、１つのフォーマットしかない場合は`\<video src="">\</video>`で指定する。

###　videoタグに指定できる属性

| 属性 | 内容 |  
|:-----------------|:------------------|
| autoplay | 自動再生 |
| controls | 再生、音量、シーク、ポーズを制御するためのコントロールを表示 |
| loop | 自動でその動画を繰り返し再生 |
| muted | 指定することで消音再生 |
| poster | 動画が再生可能になるまでの間に表示する画像などを指定。指定しない場合は何も表示されない |
| playsinline | 動画を再生するエリアを指定する場合に指定。指定しないとiosで自動再生されなかった |
※preloadを指定することで動画を事前に読み込む（部分的に指定することも可能）か、読み込まないかを制限できますが、autoplayを指定するとpreloadより優先されるので特に指定する必要はありません。

### playsinlineについて
最終的に、今回iphoneでの自動再生を解決するのにplayinline属性を指定しなければならなかった。
controlsを指定して、iphoneで動画を再生すると全画面表示になっていて、それを指定する範囲（videoタグにcssをしているとかdiv内でposition指定するとか）で再生したい場合に必要な属性らしい。



# 最終的なコード
```php:hoge.php
<?php if ( wp_is_mobile() ) : ?> // PC以外での閲覧時

    <?php if ( is_android() ) : ?>　 // androidでの閲覧時

      <video autoplay muted loop>
        <source src="path/movie_sp.mp4" type="video/mp4">
      </video>

    <?php elseif ( is_iphone() ) : ?> // iphoneでの閲覧時

      <video autoplay muted loop playsinline>
        <source src="path/movie_sp.mp4" type="video/mp4">
      </video>

    <?php else: ?>// androidでもiphoneでもないデバイスでの閲覧時

      <video autoplay muted loop>
        <source src="path/movie_sp.mp4" type="video/mp4">
      </video>

    <?php endif;?>
  
  <?php else: ?> // PCでの閲覧時
  
    <video autoplay loop muted>
      <source src="path/movie.mp4" type="video/mp4">
    </video>
  
  <?php endif; ?>
```

## 参考
- [関数リファレンス/wp is mobile \- WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_is_mobile)
- [WordPressでスマートフォン・タブレット・PCで表示を変更する条件分岐方法 \| ホワイトベアー株式会社](https://whitebear-seo.com/wordpress-conditional-mobile-pc/)
- [iOS 10 Safari から video の inline 再生が可能になります \- latest log](http://uupaa.hatenablog.com/entry/2016/08/29/171809)
- [<video> \- HTML \| MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/video)
- [はたして iPhone は iOS 10 なら動画を自動再生できるのか \- Qiita](https://qiita.com/haribote/items/ef7ec97ca059eeb6d9ae)
PDFから注釈を抜き出した話

# きっかけ
春の人事異動に向けてWebページの改定が必要になりました。
URLの一覧からChromeの --print-to-pdf オプションを使ってすべてのページをPDFに落として修正が必要な個所にすべて注釈を入れたけど、一覧にして管理したいからPDFから注釈を全部引っこ抜けないだろうか？

# PDFMinerを使う
よく調べてみると、[GitHubに4年前に書かれた extract_pdf_comments.py というphthon2系らしきソース](https://gist.github.com/ckolumbus/10103544)があるのでこれを試す

# 動作環境
いつものSurface3 (Win10 x64)
Phthon 3.6.4

# PDFMinerの導入
[ここ](http://irukanobox.blogspot.jp/2017/03/python3pdf.html)を参考に PDFMiner.six を導入する
前提条件としてVS2015とpycryptoが必要なので[ここ](https://qiita.com/walkure/items/09516cb711ff1c886286)を参考に入れる

# ソースを直す
エラーメッセージと闘いながらpython3 向けの修正と日本語対応を行う。サンプルソースは以下のように変化した。

```python3:extract_pdf_comments.py
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdftypes import PDFObjectNotFound

pages = []

def extract(objid, obj):
    global pages
    if isinstance(obj, dict):
        # 'Type' is PDFObjRef type
        if 'Type' in obj and obj['Type'].name == 'Page':
            pages.append(objid)
        elif 'C' in obj:
            pr = obj['P']
            try:
                pi = pages.index(pr.objid)+1
            except:
                pi = -1
            print(objid,pi, obj['Subj'].strip(b'\xfe\xff').decode('utf-16be'),obj['T'].decode(),obj['Contents'].strip(b'\xfe\xff').decode('utf-16be')

fp = open("sample.pdf", 'rb')
parser = PDFParser(fp)
doc = PDFDocument(parser, "")
visited = set()
for xref in doc.xrefs:
    for objid in xref.get_objids():
        if objid in visited: continue
        visited.add(objid)
        try:
            obj = doc.getobj(objid)
            if obj is None: continue
            extract(objid,obj)
        except PDFObjectNotFound as e:
            print >>sys.stderr, 'not found: %r' % e

```

これを実行するとこんな感じで出力される

```
51 9 ハイライト表示 user 表題：部署名の変更
55 9 ハイライト表示 user マネージメントの入れ替え
57 9 ハイライト表示 user 要検討：部署名の変更？言い回しの変更？
59 9 ハイライト表示 user 2018/4の記事を追加
```

実際にはこれをフォルダ指定して存在するPDFファイルをすべて処理して、ファイル名も含めてカンマ区切りで出力するように変更している。

>(2018/2/22追記)
現状のソースでは、ユーザー名は英数字のみで、コメントは日本語で何かが記入されている（無記入でない）ことが前提になっています。
マーキングだけしてコメントを入力しないと、"Contents"がないとか言われてエラーになります。

# おまけ
## URLの一覧からWebページをPDFとして保存する

```cmd:printPDF.bat
REM chrome \
REM  --headless \                   # Chrome をヘッドレスモードで実行する
REM  --disable-gpu \                # 暫定的に必要なフラグ
REM  --remote-debugging-port=9222 \
REM  https://www.chromestatus.com   # 開きたい URL（デフォルトは about:blank）
REM
REM CSVの書式は、 #,<url>,<filename>
REM
set curdir=C:\tmp
set csvfile=%curdir%\url.csv
set chromedir="C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
for /f "tokens=1,2,3 delims=," %%a in (%csvfile%) do (
 %chromedir%  --headless --disable-gpu --print-to-pdf=%curdir%\%%c.pdf %%b)

```
PHPの型について


PHPではあまり型のことを考えなくてもプログラミングができるが、自動的に型変換がなされるため時に思わぬ動作をすることがある。

# PHPにはどんな型があるのか？

公式サイト http://php.net/manual/ja/language.types.intro.php


- **基本の型**
- 擬似的な型

というものがある。
「擬似的な型」はドキュメント上でのみ出てくる「可読性をあげるための型」である。
**「基本の型」** は更に **「4種類のスカラー型」「4種類の複合型」「2つの特別な型」** の3つに分類される。

## 4種類のスカラー型

- 論理値　boolean
- 整数　integer
- 浮動小数点数　float（double）
- 文字列　string

### 論理型 `boolean`
http://php.net/manual/ja/language.types.boolean.php

真偽の値を `true` `false` で表し、大文字・小文字は区別しない。

#### ◉ true/falseを数値で表すと...（論理型=>整数への変換）

`true` が1、 `false` が0。

#### ◉ `boolean` に変換すると `false` になるもの

- integer の 0 (ゼロ)
- float の 0.0 (ゼロ)
- 空の文字列、 および文字列の "0"
- 要素の数がゼロである 配列
- 特別な値 NULL (値がセットされていない変数を含む)

ゼロでない数字は全て `true`  になる。（-1 とか）

### 整数型 `integer`
http://php.net/manual/ja/language.types.integer.php

{..., -2, -1, 0, 1, 2, ...} というような整数のこと。
普通に書けば10進数、「8進数・16進数・2進数」として認識して欲しい時はそれぞれ「`0`・`0x`・`0b`」をつける。
 
```php
$a = 1234; // 10進整数
$a = 0123; // 8進数 (10進数の83と等価)
$a = 0x1A; // 16進数 (10進数の26と等価)
$a = 0b11111111; // 2進数 (10進数の255と等価)
```

#### ◉ 整数のオーバーフロー
大きすぎると、floatとして認識されるようになる。
その境目はPCのビット数に依存する。

#### ◉ 浮動小数点数=>整数への変換
float から整数に変換する場合、その数はゼロのほうに丸められる。

### 浮動小数点
http://php.net/manual/ja/language.types.float.php#warn.float-precision

いわゆる小数点。

### 文字列
http://php.net/manual/ja/language.types.string.php

## 4種類の複合型

- 配列　array
- オブジェクト　object
- コールバック関数　callable
	- 関数が実行中に実行される関数
- iterable

### 配列
http://php.net/manual/ja/language.types.array.php

### オブジェクト
http://php.net/manual/ja/language.types.object.php

### コールバック関数 `callable`
http://php.net/manual/ja/language.types.callable.php

#### ◉ コールバックに関する記事
http://wa3.i-3-i.info/word12295.html
https://qiita.com/geshi/items/2ca7628db9091de6ac43
https://qiita.com/pocket8137/items/df5afba90b51e90587a5

### `iterable`
http://php.net/manual/ja/language.types.iterable.php

## 2つの特別な型

- resource
- null

### `resource`
http://php.net/manual/ja/language.types.resource.php

### `null`
http://php.net/manual/ja/language.types.null.php

# 型チェックに使える関数

## チェックさえできればOK `var_dump()`
http://php.net/manual/ja/function.var-dump.php

## 型を取得 `gettype()`
http://php.net/manual/ja/function.gettype.php

## その他諸々


- settype() - 変数の型をセットする
- get_class() - オブジェクトのクラス名を返す
- is_array() - 変数が配列かどうかを検査する
- is_bool() - 変数が boolean であるかを調べる
- is_callable() - 引数が、関数としてコール可能な構造であるかどうかを調べる
- is_float() - 変数の型が float かどうか調べる
- is_int() - 変数が整数型かどうかを検査する
- is_null() - 変数が NULL かどうか調べる
- is_numeric() - 変数が数字または数値形式の文字列であるかを調べる
- is_object() - 変数がオブジェクトかどうかを検査する
- is_resource() - 変数がリソースかどうかを調べる
- is_scalar() - 変数がスカラかどうかを調べる
- is_string() - 変数の型が文字列かどうかを調べる
- function_exists() - 指定した関数が定義されている場合に TRUE を返す
- method_exists() - クラスメソッドが存在するかどうかを確認する

# 型の比較
http://php.net/manual/ja/types.comparisons.php
Node-RED - HTML/JavaScript/CSS/SQL入門の紹介

Node-REDやMySQLを使ってアプリケーションを書く上で基本になるHTML、JavaScript、CSS、SQLなどの入門の資料について紹介します

#1.HTML入門
- ブラウザで開く画面の枠組みはほぼ全部これで書かれています
- Node-REDのフローでは、オレンジ色のTemplateノードの中にこのHTMLを書いておいて、HTTPでアクセスされたときにクライアント（ブラウザ）へ返されて画面に表示されるように使われます
- 入門編をいくつか：
    - [サルワカ - 初心者向けHTML入門：書き方の基本とタグの使い方](https://saruwakakun.com/html-css/basic/html)
    - [ドットインストール - HTML入門](https://dotinstall.com/lessons/basic_html_v3)
    - [YouTube - 【HTML入門】#01. HTMLの基本を学ぼう！](https://www.youtube.com/watch?v=WYDzyIgOezQ)

#2.JavaScript入門
- 上記のHTMLの中で`\<script\>JavaScriptの記述\</script\>`で囲んでいろいろな処理を記述します
- Node-REDのフローでは、はだ色のFunctionノード内でJavaScriptがそのまま使えます。これはNode-REDがNode.js上で稼働しているためです
- Node-RED内でのJavaScriptのいろいろな活用については、それぞれのNode-REDのQiita記事をご参照ください
- 入門編をいくつか：
    - [JavaScriptの基本をサルでもわかるようにまとめた【入門用】](http://www.ituore.com/entry/javascript-basic) 
    - [ドットインストール - JavaScript入門](https://dotinstall.com/lessons/basic_javascript_v2)

#3.CSS入門
- 前述のHTMLと組み合わせて画面の装飾を指定します
- Node-REDのフローでは、①オレンジ色のTemplateノードをCSS用に個別に用意してその中にCSSを記述し`msg.payload.css`などに格納して後段のTemplateノード内のHTMLへ渡すか、②HTML用のTemplateノード内に最初からCSSを埋め込んで記述する、などの方法があります
- 入門編をいくつか：
    - [サルワカ - 初心者向けCSS（スタイルシート）入門：基本的な書き方を総まとめ！](https://saruwakakun.com/html-css/basic/css)
    - [ドットインストール - CSS入門](https://dotinstall.com/lessons/basic_css_v3)

#4.SQL入門
- MySQLなどのデータベースに格納されたデータへアクセスするための言語です
- Node-REDのフロー内では、インポートしたMySQLノードの直前にはだ色のFunctionノードを置いてその中でmsg.topicにSQL文を用意して次のデータベース（ノード）へ投入するようにします。データベースからの返り値（ResultSet）はmsg.payloadに格納されて返却されるので、データベースノードの直後に緑色のDebugノードを接続しておくことでデータベースから返された値を確認することができます
- 入門編をいくつか：
    - [MySQL初心者入門講座](http://mysqlweb.net/)
    - [ドットインストール - SQL入門](https://dotinstall.com/lessons/basic_mysql_v3)
    - [YouTube - SQL入門](https://www.youtube.com/watch?v=j4kh9YBS7QU)
    - [SQLZOO](http://sqlzoo.net/wiki/SQL_Tutorial)

#5.Node-RED参考情報
- Node-REDの画面左側のパレット内の各ノードの情報は、それぞれのノードをワークスペース内へドラッグ＆ドロップしたあと、当該ノードを選択した状態で画面右側の「情報」タブを開くと、各ノードの情報や入力・出力データの情報、サンプルの書き方などが表示されます
- Tigergateに記述したNode-REDの情報以外に下記のような情報もあります
- 入門編をいくつか：
    - [Node-RED日本語入門](https://nodered.jp/docs/)
    - [Qiita - Node-RED事始め](https://qiita.com/joeartsea/items/93e8483a31292067c654)
    - [Qiita - 目からウロコ！Node-REDのデザインパターン10選](https://qiita.com/zuhito/items/e9abfd6f1ba188f908ed)
Reactビギナーズガイドをtypescriptで勉強し直してわかったこと②【propTypesの必要性について】

# propTypesのおさらい

オライリーから出ている「Reactビギナーズガイド」を読んで、サンプルで載っているコードをtypescriptに書き直しながら勉強をしています。

propTypesはes5のjsでは次のように使います。

```javascript
propTypes: {
  defaultValue: React.PropTypes.string.isRequired;
}
```

何をやっているかというと、Propsとしてコンポーネントに渡されるデータの型や必須の有無をコンポーネント側で定義しておき、変な値が渡されないようにする制約のようなものです。

別に書かなくてもコードの動作自体は可能です。

# propTypesってtypescriptで果たして必要なのか

typescriptではPropsの型はコンポーネント側で明示的に指定しないといけません。

```typescript
interface ButtonProps{
  value: string;
}
class Button extends React.Component<ButtonProps, {}> {
  // ... //
}
```
のように。
これは非常に面倒なことでありますが、vs codeなどでシンタックスハイライトや入力補完ができるのも、この型を明示しなければならない制約の恩恵と言えます。

で、typescriptでpropTypesが果たして必要かというと、調べたところこれはどうも必要なさそうです。
当たり前ですが、すでにinterfaceなどで型を定義していますので、さらにpropTypesで型を定義しても二重に同じことを書いているだけになります。


ところで実はtypescriptでもpropTypesは書けます。

# typescriptでpropTypesを記述する

まずnpmでインストール

```
npm install --save @types/prop-types
```

コードではこんな感じで書けます。

```typescript
import * as React from 'react';
import * as PropTypes from 'prop-types';

interface Button {
  headers: string[];
}

class Button extends React.Component<ButtonProps, {}> {
  static propTypes = {
    headers: PropTypes.arrayOf(PropTypes.string)
  };
  // ... //
}

```

この機能、なんのために必要なんだろうと気になって調べたところもっともらしい答えがgithubのtypescriptのリポジトリのissueにありました。

# typescriptにおけるPropTypesの必要性

https://github.com/Microsoft/TypeScript/issues/4833

> What about the case when building a react library to be used by others. Others may not be using typescript. It would be nice to have a way to generate PropTypes when creating the distributed lib so other developers will be able to get PropType validation during development when using the library. React then strips theses away when building production.

要約すると、

es5とかtypescript以外で書いている他人が、自分がtypescriptで作ったreactライブラリを使用する際に、変なPropsが渡されたらきちんとwarningを出して上げなくてはいけない。
typescriptでbuildする時には（自分が使う分には）Propsに想定外の型が送られてきたら制約に引っかかりbuildは失敗してエラーに気づけるけど、buildした後はその制約はもう消えてしまうので、きちんとコードとして制約を残すにはpropTypesを書いておかなくてはならない。

といった趣旨でした。

複数人で、typescript以外のjsとtypescriptが入り乱れる環境での開発を強いられる場合は必須の機能なんですね。
また一つ勉強になりました。
source codeの追い方 -なぜlessコマンドはバイナリファイルを読めるのか-

# なぜlessコマンドはバイナリファイルを読めるのか
lessコマンドでrpmファイルを開くと、リリースノートが読める。

![スクリーンショット 2018-02-14 14.30.13.png](https://qiita-image-store.s3.amazonaws.com/0/75761/9a794d7f-6926-c55e-1b73-8f6eee0e1ddb.png)

なぜバイナリファイルであるはずのrpmをlessで開くと読めるのか。
ソースを読むのが早そうだったのでいろいろ調べつつやってみた。

せっかくなのでインストールしている馴染みのパッケージのsource codeを読むための流れを纏めることにした。

# 実行コマンドのフルパスを確認
```
[root@tkd003 tmp]# which less
/usr/bin/less
```
lessコマンドの実態は
/usr/bin/less
だということがわかる。

# rpmファイル名を確認する

どのrpmファイルでインストールされかた確認する

```
[root@tkd003 tmp]# rpm -qf /usr/bin/less
less-458-9.el7.x86_64
```

less-458-9.el7.x86_64というファイルらしい。
この名前を元にググる。

# rpmファイルをダウンロードする
https://centos.pkgs.org/7/centos-x86_64/less-458-9.el7.x86_64.rpm.html

からダウンロードできる事がわかった。

![スクリーンショット 2018-02-14 14.09.40.png](https://qiita-image-store.s3.amazonaws.com/0/75761/56722528-b7e2-f22a-a4c8-92ee6abd8b84.png)

ソースもあるけど、今回は敢えてBinaryファイルをダウンロード

```
[root@tkd003 less]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/less-458-9.el7.x86_64.rpm
--2018-02-14 14:09:32--  http://mirror.centos.org/centos/7/os/x86_64/Packages/less-458-9.el7.x86_64.rpm
mirror.centos.org (mirror.centos.org) をDNSに問いあわせています... 111.90.139.14
mirror.centos.org (mirror.centos.org)|111.90.139.14|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 122672 (120K) [application/x-rpm]
`less-458-9.el7.x86_64.rpm' に保存中

100%[===========================================================================================>] 122,672      516KB/s 時間 0.2s   

2018-02-14 14:09:37 (516 KB/s) - `less-458-9.el7.x86_64.rpm' へ保存完了 [122672/122672]

[root@tkd003 less]# 
```

# rpmファイルを解凍する

```
[root@tkd003 less]# rpm2cpio less-458-9.el7.x86_64.rpm | cpio -idv
./etc/profile.d/less.csh
./etc/profile.d/less.sh
./usr/bin/less
./usr/bin/lessecho
./usr/bin/lesskey
./usr/bin/lesspipe.sh
./usr/share/doc/less-458
./usr/share/doc/less-458/LICENSE
./usr/share/man/man1/less.1.gz
./usr/share/man/man1/lessecho.1.gz
./usr/share/man/man1/lesskey.1.gz
424 blocks
[root@tkd003 less]# 
```

# grepであたりをつける
```
[root@tkd003 less]# grep rpm -r *
バイナリファイル less-458-9.el7.x86_64.rpm に一致しました
usr/bin/lesspipe.sh:*.rpm) rpm -qpivl --changelog -- "$1" ;;
[root@tkd003 less]# 
```
usr/bin/lesspipe.shに何か書かれていそうだ。

ソースを読んでみると、
lessコマンドでrpmや、tar、zipを開くと別のコマンドに置き換わることがわかった。

```
less -N usr/bin/lesspipe.sh

     49 *.tar) tar tvvf "$1" ;;
     50 *.tgz|*.tar.gz|*.tar.[zZ]) tar tzvvf "$1" ;;
     51 *.tar.xz) tar Jtvvf "$1" ;;
     52 *.xz|*.lzma) xz -dc -- "$1" ;;
     53 *.tar.bz2|*.tbz2) bzip2 -dc -- "$1" | tar tvvf - ;;
     54 *.[zZ]|*.gz) gzip -dc -- "$1" ;;
     55 *.bz2) bzip2 -dc -- "$1" ;;
     56 *.zip|*.jar|*.nbm) zipinfo -- "$1" ;;
     57 *.rpm) rpm -qpivl --changelog -- "$1" ;;
     58 *.cpi|*.cpio) cpio -itv < "$1" ;;
     59 *.gpg) gpg -d "$1" ;;
     60 *.gif|*.jpeg|*.jpg|*.pcd|*.png|*.tga|*.tiff|*.tif)
```

つまり、rpmをlessで開くと実際は

```
rpm -qpivl --changelog -- less-458-9.el7.x86_64.rpm 
```
が実行される。ということである。
lessコマンドはバイナリを開いた際、それぞれに対応したコマンドに置き換えられ、結果としてバイナリファイルを読んでいるような事ができる。
zabbix-twilioをzabbix3.0で動かすためにやったこと

## 前書き

[前回](https://qiita.com/uu4k/items/a43298c49f94632e8c99)、zabbixからtwilioで電話かけさせるためにwaker作った。

しかし[zabbix-twilio](https://github.com/begood-technology/zabbix-twilio)でそもそもよくね、って思ったので検証して見たら、動かすまでにいろいろ苦労したのでそのあたりを共有する。

## 動作環境

今回はGCP上に立てたDebianインスタンス上のDocker上でZabbix3.0のコンテナを動かしている。

```docker-compose.yml
version: '2'
services:
  zabbix-db:
    image: monitoringartist/zabbix-db-mariadb
    volumes:
      - /data/mysql:/var/lib/mysql
      - /data/backup:/backups
      - /etc/localtime:/etc/localtime:ro
    environment:
      - MARIADB_USER=zabbix
      - MARIADB_PASS=my_password
  zabbix-server:
    image: monitoringartist/zabbix-xxl:3.0.10
    depends_on:
      - zabbix-db
    ports:
      - "80:80"
      - "10051:10051"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./zabbix-twilio-1.1:/usr/local/share/zabbix/alertscripts/zabbix-twilio
      - ./zabbix-twilio-1.1/zabbix-twilio.php:/usr/local/src/zabbix/frontends/php/zabbix-twilio/zabbix-twilio.php
      - ./twilio-php-4.12.1:/usr/local/share/zabbix/alertscripts/zabbix-twilio/lib/twilio-php-latest
    links:
      - zabbix-db:zabbix.db
    environment:
      - ZS_DBHost=zabbix.db
      - ZS_DBUser=zabbix
      - ZS_DBPassword=my_password
```

## 諸注意

- twilioのアカウント作成とかSIDの取得の仕方などは説明しない
- zabbix-twilioのドキュメントに書いてある部分の説明は省略する
    - [Zabbix電話通知プラグイン「zabbix-twilio」とは - Zabbix 電話通知プラグイン 「zabbix-twilio」 ドキュメント](http://begood-technology.github.io/zabbix-twilio/)

## ドキュメントに載ってないやるべきこと一覧

### 1. バグ修正

Zabbix3.0に上がる際にAPIの仕様が変更されたのか知らないが、APIで認証取る際のauthパラメータが空文字だとエラーになるので、nullに変更。

ついでにログのところにもバグあったので修正。

```sh
diff -r zabbix-twilio/zabbix-twilio.php zabbix-twilio-fixed/zabbix-twilio.php
81c81
<                               $log->info ( "Digits 不一致 Digits:$_REQUEST ['Digits]" );
---
>                               $log->info ( "Digits 不一致 Digits:".$_REQUEST ['Digits'] );
150c150
<       private $auth = '';
---
>       private $auth = null;
```

### 2. twilio-phpのバージョンは4.12.1

twilio-phpの最新バージョンだとクラスがなくてエラーになるため、古いバージョンのtwilio-phpを取得する必要がある。

なお、ディレクトリ名はtwilio-php-latestにしないとrequireされないので注意。

```sh
git clone https://github.com/twilio/twilio-php -b 4.12.1 twilio-php-latest
# 先に掲示したdocker-composeの場合だとtwilio-php-4.12.1って名前でディレクトリ作ってマウント時にlatestつけてる
```

### 3. mediaの設定でScript parametersの設定が必要

Zabbix3.0からパラメータ指定しないといけなくなった。

[ここ](https://www.zabbix.com/documentation/3.0/manual/config/notifications/media/script)の画像通り設定すればOK

### 4. Actionのmessageの"eventid:"などの後ろにスペース入れない

以下のような感じでスペース入れないようにする。スペースが入っているとエラーになる

```
eventid:{EVENT.ID}
message:ホスト{HOST.NAME}でPort監視障害が発生中です
```

## その他つまった場合

とりあえずつまったらconfig.phpの`$DEBUG_FLG = true;`にする。デバッグログが出るようになる。

twilio→zabbixの箇所でエラー出てる場合は、twilioのコンソールからエラー内容が見れるので、そちらも参考にする。
システム開発業務向けテンプレート集

# 1. 日本式従来のドキュメント構成
エンタープライズ開発のウォーターフォールの場合は下記のような大量のドキュメントが必要です。金融系などしっかりした会社に行くと大量のドキュメント作成の壁にぶち当たりますが、エンジニアとしての下地を作る上では結構な訓練にはなるので一通りきちんとした文書が書けるようになるのが望ましいです。文章化できない曖昧な事象をそもそもコード化できないので練習としては素晴らしい訓練になるでしょう。

| 入り口ドキュメント | 出口ドキュメント | 備考 |
|:-:|:-:|:-:|
| 要件定義書  | システムテスト項目書 | 要件定義書は必要 |
| 基本設計書  | 結合テスト設計書  | 基本設計書相当は必要 |
| インターフェイス仕様書  | API仕様書/クラス仕様書など| ドキュメントはswaggerやjavadocなどで置き換え |
| 詳細設計 | 単体テスト | RubyであればテストはRspecで置き換え |
| 画面設計 | - | XDなどのワイヤーフレームツールで置き換え |
| WBSスケジュール | プロジェクト進捗報告 | JIRAなどのグループウェアで置き換え |
| テスト仕様書 | [QA報告書](https://drive.google.com/file/d/15vpVAlUnug1EsHYQH_svLggy7RkeIAgN/view?usp=sharing) | JIRAなどのツールで置き換え/報告書も置き換え可能な場合あり |

# 2. 普段利用しているテンプレート
ワイヤーフレームであったり、チケット管理ツールやQAツール、テストコードをかけるフレームワークがあったりとここ最近は開発事情が変わってきているので、無駄を省くために最小限のドキュメント構成でプロジェクトを進めたいです。
日系,外資(というより外国企業)でそこそこエンタープライズな規模でプロジェクトをやってみて
、最低限必要と思われる文章だけテンプレート化しておきます。
設計書やテスト項目書が最低限なのは上述の通りツールを用いて代替する前提だからです。

| 英設計 | 日設計 | 英テスト | 日テスト |
|:--|:--|:--|:--|
| [System Requirement](https://drive.google.com/file/d/1zRu5rHp98RJlmPvCPIxJh4DoDLmKfhuD/view?usp=sharing)  | [要件定義書](https://drive.google.com/file/d/1B-HB3NkVVliLtTYqqUYhf-WTRX6x6sVG/view?usp=sharing) | Test Plan | [システムテスト項目書](https://drive.google.com/file/d/1P7OUN4vsZVJstMln1vv8ibXDzMNz_0n2/view?usp=sharing) |
| 上記ドキュメントに包括 | [基本設計](https://drive.google.com/file/d/1j4OrbmL_XonNaUWiz54dQjDRyvdHFu7B/view?usp=sharing) |上記ドキュメントに包括 | 接続テスト項目書 |


*リンクがあるものはダウンロード可能
*パワポ、ワード、エクセルなのでダウンロード読むなりしてください
*いくつかいいテンプレがなかったものについては見つけ次第更新
「execFunc()()」を見て「ふぁっ？？」っとなった時のメモ

# 概要

最近のJavaScript？は`execFunc()()`みたいな感じで、かっこかっこ言ったりしてます。よくわかりません。

関数で関数を返すことができるのでこんな感じで書けるらしい。　[参考](https://qiita.com/ukiuni@github/items/5f3d8620187905aea3d4#4-%E3%81%8B%E3%81%A3%E3%81%93%E3%81%8B%E3%81%A3%E3%81%93%E8%A8%80%E3%81%A3%E3%81%A6%E3%82%8B)

# 例

```js
const callFunction = () => {
	return (text) => {
        console.log(`text is ${text}`)
    }
}
```

```
>callFunction()("is this text?")

=> text is is this text?
```

# 参考

[JavaScriptを読んでて「なにこれ！？」と思うけれど調べられない記法8選。 - Qiita](https://qiita.com/ukiuni@github/items/5f3d8620187905aea3d4)
[イマドキのJavaScriptの書き方2018 - Qiita](https://qiita.com/shibukawa/items/19ab5c381bbb2e09d0d9)
LinuxでネットワークインタフェースのMACアドレスを調べる方法 /sys/class/net

# /sys/class/net

ネットワークインタフェースのMACアドレスが欲しいときには、今まではifconfig の結果をgrep, sedを駆使して整形していたが、もっと簡単な方法があった。

```
$ cat /sys/class/net/eth0/address 
00:0c:29:e8:cd:e0
```

コロンを消したいときは

```
$ cat /sys/class/net/eth0/address |sed 's/://g'
000c29e8cde0
```

# /sys/class/net のカーネルのドキュメント
https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-class-net

# ついでに

Ethernetケーブルが抜けたかどうかは`/sys/class/net/eth0/carrier` の値でわかる。1が正常で0で断線。
`/sys/class/net/eth0/carrier_changes` でcarrierの値の変化の回数がわかるようだ。つまりケーブルを抜き差しした回数。
Firebase の開発者権限を Read Only にする

Firestore の管理画面、便利なんですがボタンポチポチでデータ変えられてしまうので本番環境では Read Only にしたいです。
Cloud Functions の deploy も開発者のローカルからやらせたくありません。

## GCP の権限

画面左上のユーザと権限から GCP に飛んで

<img width="493" alt="スクリーンショット 2018-02-14 13.57.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/5678/82e68810-a2b8-6320-ea02-d0347f18745b.png">

権限を __参照者__ にします。

<img width="1189" alt="スクリーンショット_2018-02-14_13_58_52.png" src="https://qiita-image-store.s3.amazonaws.com/0/5678/50590a73-5c43-9eca-05af-a765c2cb6f1d.png">

これで OK。

## 本当に参照のみになっているか

<img width="759" alt="スクリーンショット 2018-02-14 13.56.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/5678/dbfefe22-76cf-bd99-3ba0-b6e2fb5500f9.png">

なってる!

```
$ firebase deploy --only functions:hoge

Error: Unable to authorize access to project project-hoge
```

Cloud Functions の deploy もエラーになりました。


## 閲覧者は書き込みできる

最初は閲覧者というロールで参照のみになると思ったんですが、閲覧者だと編集できてしまいました...。

<img width="706" alt="スクリーンショット 2018-02-14 14.05.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/5678/9908b4c3-e5ab-c302-395d-27f6ee261737.png">

[Google Cloud Platform での権限の設定  \|  ドキュメント  \|  Google Cloud Platform](https://cloud.google.com/docs/permissions-overview?hl=ja) を見ても参照者という用語は見つからず、よくわからない。
TouchDesigner CPlusPlus Plugin作成時の設定 (Windows)

## はじめに oFをプラグインとして組み込もうと思ったけどやめた

TouchDesignerのCPlusPlusことはじめとしてopenFrameworksをプラグインとして実行しようとしたが、あまりに手順が煩雑だし、TOPでしか使えないようだし、テクスチャはSpoutとかでも取ってこれるし、あんまりメリット感じれなかった。今後に期待。なので、素直にopenFrameworks使わずに書くことにした。

### それでもoFを使うときの参考

- [openFrameworksプロジェクトをCPlusPlusTOPとして使うなら](https://www.derivative.ca/wiki099/index.php?title=OpenFrameworks)
  - ただし2018年2月上旬の時点で、文章が間違いだらけなので注意
  - Exampleだけ落として、それをテンプレートにして作るのが早そう
- [TouchDesignerからopenFrameworksアプリを実行する](https://qiita.com/yasuhiro0122/items/f6c5b12b676c274535fd)



## テンプレート

ひとまず形だけ、個人的に使いやすい感じで。使いながら修正。

[hideakitai/TDCPlusPlusTemplate ](https://github.com/hideakitai/TDCPlusPlusTemplate)


## プロジェクトファイルの準備

- 上記のテンプレートをコピペしてくる
- toeの名称を変更
- ```Project > Properties```
- 下記の2つの設定を変える (Debug, Release 両方)
  - ```Configuration Properties > Debugging > Command``` にTouchDesignerのexeのパス
  - ```Configuration Properties > Debugging > Command Arguments``` にdllを実行するtoeのパス
- CPlusPlus CHOP/TOP/SOP でdllのパスを指定する (Debug, Release間違わないように)



## 自分の使いやすいようにプロジェクトの設定を変更

完全に好みになるが、自分はoFに似せて(一部は適当で)こんな感じにした。General, Debugging を変更。

#### Tips

- ```TOUCH_TEXT_CONSOLE = 1``` を入れておくと、ビルド時にコンソールが表示されるようになる
- コマンドプロンプトから ```setx TOUCH_TEXT_CONSOLE 0``` をすると、CPlusPlus関係なく常にコンソールが出るようになる



#### General

<img width="800" alt="02_project_properties_debug_general.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/37296/63223e55-d8f1-6ee1-4b2f-a3de53aadd19.jpeg">

<img width="800" alt="03_project_properties_release_general.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/37296/4347fbe2-1ad3-b8e1-8a4d-91b9776c496f.jpeg">


#### Debugging

<img width="800" alt="04_project_properties_debug_debugging.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/37296/42fde2ff-7da6-94f6-2283-ffe426196c88.jpeg">

<img width="800" alt="05_project_properties_release_debugging.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/37296/b49c4fdf-43ab-498a-671a-b67fe2ee3aec.jpeg">




## 補足：Visual StudioでSolutionの名前を変更するときの手順

- Solution Explorer で Solution, Project, .cpp, .h を選択し、名前を変更する

  - View > Properties Window を出し、Nameを変更
  - ProjectのProperties Windowでは、Root Namespaceも変更する

- class名と.cppのincludeファイル名など、ソースコード上の名前を変更

- Solutionファイルをテキストエディタで開いて、以前の名前を現在の名前にする

- vcxproj, vcxproj.filters, vcxproj.user (, VC.db) の名前を変更する

- その他の中間ファイルやdllなど、前の名前のいらないものを削除

- VS2017なら[コレ](https://marketplace.visualstudio.com/items?itemName=KuanyshNabiyev.FullRenameProject)とかが使える
- ソリューション全体のリネーム、良い方法あれば教えてください！
  ​
UX/UIデザインに関する記事のまとめ

開発にはよりユーザービリティを考慮した画面設計が大事である。
いくつか参考になるサイトをまとめたのでここに記す

#### UXポートフォリオ
- https://www.seleqt.net/design/inspiringuxdesignportfoliosselection/

#### UXとは？
- https://hataraku.vivivit.com/works/uiux
- http://uxmilk.jp/38516

#### UIデザイン
- https://material.io/guidelines/patterns/errors.html#errors-app-errors

#### error message
- https://www.justinmind.com/blog/how-to-design-error-messages-downloadable-example/
Atomのautocomplete-pathsでMaximum file Count のエラー回避

Atomの拡張パッケージに「autocomplete-paths」というパス参照を提供してくれるとても便利なものがあるのですが、Maximum file Countのエラーが出て使えない！という方向けの回避方法。

↓このエラー
![autocomplete-error.PNG](https://qiita-image-store.s3.amazonaws.com/0/187744/9c103090-2086-8526-d296-ec13ee079fb4.png)


## 対策1 ファイル数カウントの調整
標準設定では2000ファイルまでのリミットがあるため、単純にこれを調整すれば良いという方はこちらの記事が参考になります。
[Atomの『autocomplete-paths』で「Maximum file count of 2000 has been exceeded.」エラー](http://blog.yamashita-design.com/2017/08/atom-autocomplete-paths_maximum-error/)

## 対策2 特定ディレクトリの除外
おそらくこのエラーが出る方の大半がこちらだと思いますが、参照する必要の無いディレクトリを参照してしまっているため、このエラーが出ているパターンです。
私の場合はnode_modulesのディレクトリを読み込んでしまいこのエラーが出るパターンで、同様の事例は多いと思います。

この場合は特定ディレクトリを除外すればいいのですが、**このパッケージの「設定」のところから除外…という正攻法でいくと私のようにハマります。。**

正しい対処方法は以下の通りです。(※標準の英語表記名はカッコで記載)

1. 環境設定(Settings) -> コア設定(Core) 
![core.PNG](https://qiita-image-store.s3.amazonaws.com/0/187744/d34fc454-e6c9-6695-b86f-8229b9e6c77d.png)


2. 無視するファイル(Ignored Names)の項目で"node_modules"を追加します。
![core-setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/187744/23e53d9a-0881-5325-a717-47513f7b7512.png)

3. Atomを再起動
これだけです。

ちなみにパッケージの「autocomplete-paths」の設定にも同様の項目があるのですが、こちらを設定してもなぜか効きません。
ソースを見るとminimatchというモジュールで文字列マッチ判定をしているようですが、どう入力してもうまくいきません。。
もしこちらの設定で除外できる方法をご存知でしたら教えてください。


### （補足）ツリーメニューからもディレクトリを削除
除外したディレクトリはそもそもツリー表示上も不要のことが多いので、この表示も除外できます。

1. 環境設定(Settings) -> パッケージ(Packages) 
2. "tree-view"を検索して「設定(Settings)」をクリック
3. "Hide Ignored Names"にチェックを入れる（Hide VCS Ignored Filesも合わせてチェック入れてもいいかも）
![tree-setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/187744/446b30f9-4810-cdbe-9d87-51960c459e4f.png)

これでツリー上からもディレクトリ表示が消えます。是非お試しを。
モンテカルロ木構造(Monte Carlo Tree Search) その2

前回はUCB1やMCTSのアルゴリズムを簡単に解説行ってきました。今回はDefault PolicyおよびTree Policyなどについての項目についての解説を[A Survey of MCTS](http://pubs.doc.ic.ac.uk/survey-mcts-methods/survey-mcts-methods.pdf)に沿って進めていきます。


# UCB1 / UCT  (Upper Confidence Tree)について
UCBをベースにしたTree Searchモデルということから、上記[A Survey of MCTS](http://pubs.doc.ic.ac.uk/survey-mcts-methods/survey-mcts-methods.pdf)ではUCT=(Upper Confidence Tree)のアルゴリズムの説明がされており、__Tree Policy / Default Policy / Best Child__の各々のロジックが組み込まれています。
紹介されているUCTアルゴリズムを下記の図の様に抜粋し６つのパートを色分けしてみました。

![mcts_uct.jpeg](https://qiita-image-store.s3.amazonaws.com/0/210629/78b64b1b-b9e7-4888-0e7e-82ff1ae51628.jpeg)


# Tree Policy / Default Policy / Best Child
それでは、上記アルゴリズムを重要性が高いものから各々説明していきます。

| Policy | 説明 |
|:--|:--|
|*Best Child* <br> ピンクの囲み④ |Best Childは上記ロジックの順序からすると４番目の説明となりますが、Tree Policyの中で使用される重要なロジック・パターンなので先に説明をします。ここでは親Nodeから拡張された既存の子Nodeから最も高いRewardを算出した子Nodeを選択します。<br><br>argmax以下で取得されるNodeのReward計算式 ($\frac{Q(v^{\prime})}{N(v^{\prime})}+c \sqrt{\frac{2lnN(v)}{N(v^{\prime})}} $)は、前回説明したUCBのことで、第二項に探索Biasが加算されているので探索数が多いNodeでは0に限りなく近づき第一項の平均値と同等になります。|
|*Tree Policy*<br>ブルーの囲み②   |このPolicyはTreeから新たにNodeを派生するか(__EXPAND(v)__のところです)、もしくは既存のNodeから最も高いRewardを出力できるNodeを先に説明した__(Best Child)__で選択します。<br>下記の三目並べ(Tic Tac Toe)の例題で提示されている様に、親Nodeから子Nodeを派生できれば、Nodeを拡張できますし。もし拡張できるNodeが存在しない場合は既存のNodeから選ぶということになります。候補を選ぶ基準はUCB1で定義されたRewardが使用されます。 |
|*Default Policy* ブルーの囲み⑤ | Default Policyは、別名__Simulation__とも呼ばれています。このPolicyでは__最後__までNode下のLeaf(例えば囲碁などのゲームであれば、相手方もしくは自身が一つ駒を進めていくこと)を拡張していきます。Tree PolicyでNode下から終点に達するまでLeafを拡張していくか(引き分けまで駒を打ち続ける)、もしくは閾値を超えたLeafを伸ばしていきます。強化学習で使用された言葉を借りていうならば、決定した行動で状況を更新していくということです。|
|   |   |

#三目並べでTree PolicyおよびDefault Policyを解説

Tree Policy / Default Policyを三目ならべで簡単に解説します。図はTim Weeler氏の[Alpha Go Zero How and Why it works](http://tim.hibal.org/blog/alpha-zero-how-and-why-it-works/)より抜粋してあります。

## Tree Policy
状況$S_0$では既に○２つ、✖️２つの駒が打たれています。ここで✖️は駒を打つ空いている箇所が５箇所あるので、✖️の立場で考えると、子Nodeが5個作成出来る環境になっています。Tree Policyではこの子Nodeをまず最低1個作成することから始まります。どの子Nodeを作成するかはランダムに決定します。子Nodeを１個作成した後は、子Nodeを次のロジックDefault Policyに渡します。
![mcts_uct_node.jpeg](https://qiita-image-store.s3.amazonaws.com/0/210629/42438702-0f42-015a-0651-2df71507b316.jpeg)

## Default Policy
例えば、上記Tree Policyで$S_{0,1}$が選択されDefault Policyに渡された場合、✖️もしくは◯は$S_{0,1}$から空いている盤面をランダムに探してお互い駒を打ち続けます。この行動は勝敗が決まるか、もしくは引分けに到るまで行われます。この図の例では盤面上に最後まで駒が打ち続けられましたが、✖︎が勝利した結果となっています。ここで勝利がつけば、勝利者には➕のReward、敗者であれば、➖のRewardをセットして、後のUCBの計算に使用する様にします。


<img width="946" alt="mcts_uct_defaultpolicy.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/210629/4424c3d8-05c0-1ecf-7094-0d2f2eb9e065.jpeg">


>出典:[Alpha Go Zero How and Why it works by Tim Wheeler](http://tim.hibal.org/blog/alpha-zero-how-and-why-it-works/)


以上、MCTSをあまりに簡単に解説してしまいましたが、次回はPythonで実装しながら解説を行いたいと考えています。
Python progate学習完了

Progateというサイトでのpythonの学習を一通り完了した。
メソッドの細かな違いについては載っていいないので、今後役に立ちそうなのでURLを掲載(メソッドの細かな違いについて)

https://qiita.com/masaru/items/5ebf2e96d6524830511b


Progate感想
・文字というよりイラスト重視の解説のため、直観で理解することができた。
※特にクラスやインスタンスは文字よりも、イメージで考えた方が理解しやすい気がする。

・全くプログラムが読めない所から、プログラムの文章の意味がわかるようになった。

・大まかに初歩の内容を学習することができたが、細かい部分は自分で悩みながら進めるしかないと思った。
Logicool Options のキーストローク割り当てができない。（Karabiner-Elementsが原因）

情報がなくて困ったのでメモ

Logicool製品の設定をするLogicool Optionsというソフトウェアがあります。
マウスの物理ボタンにショートカットキーを割り当てる「キーストロークの割り当て」という機能があるのですが、これを選択して、割り当てるキーを押しても反応がないとき。

渡しの場合は、Karabiner-Elementsというソフトウェアと競合していることが原因でした。

Karabiner-Elementsを一旦終了させてキーストロークの割り当てをおこなってから、再度起動させることで、両方並行して使えます。

それだけ。
VSCodeのMarkdown Previewの中華フォントをどうにかする

VSCodeでの中華フォントは随分昔に修正されているようですがMarkdown Previewの部分は中華フォントのままでしたので、その修正を行ったメモになります。


### 環境
---
Windows 7
VSCode 1.19.2


### 修正方法
---
`<C-,>`でUserSettingsを開き以下を追記します。

```
  "markdown.preview.fontFamily": "Meiryo UI" //"Meiryo UI"の部分はお好きなフォントに
```
  
  
デフォルトでは環境毎のフォントが色々書かれていますがとりあえず上記の設定でWindows7では文字化けはなくなったので良しとします。
XcodeGen + CocoaPods の組み合わせで Build Phases の一番最後に script を追加する

# TL; DR
Cocoapods の [script_phase](https://guides.cocoapods.org/syntax/podfile.html#script_phase) を使う

---

```yaml:project.yml
name: ExampleApp
targets:
  ExampleApp:
    type: application
    platform: iOS
    sources: ExampleApp
    prebuildScripts:
      - name: Run SwiftLint
        script: ${PODS_ROOT}/SwiftLint/swiftlint
    postbuildScripts:
      - name: Run Fabric
        script: "${PODS_ROOT}/Fabric/run"
```

↑こんな project.yml だったときに

```sh
$ xcodegen
$ pod install
```

`xcodegen` -> `pod install` すると、`postbuildScripts` の後に Cocoapods の script が追加される。

Fabric の script は Cocoapods のものよりも後（一番最後）に呼ばないといけないので、困る。

なので、以下のように一番最後に追加したい script は Podfile に書く。

```diff
--- a/Podfile
+++ b/Podfile
@@ -7,4 +7,7 @@ target 'ExampleApp' do
 
   pod 'Fabric', '~> 1.7.2'
   pod 'Crashlytics', '~> 3.9.3'
+
+  script_phase :name => 'Run Fabric',
+               :script => '"${PODS_ROOT}/Fabric/run"'
 end
```

Podfile に移動した script は project.yml から消す。

```diff
--- a/project.yml
+++ b/project.yml
@@ -7,6 +7,3 @@ targets:
     prebuildScripts:
       - name: Run SwiftLint
         script: ${PODS_ROOT}/SwiftLint/swiftlint
-    postbuildScripts:
-      - name: Run Fabric
-        script: "${PODS_ROOT}/Fabric/run"
```

そうしてから `xcodegen` -> `pod install` すると、 Build Phases の最後に `[CP-User] Run Fabric` という名前の script が追加されて、めでたしめでたし。