OmniAICreator/Qiita-1.07M huggingface dataset:
エントロピーを簡単に

#エントロピーとは
ちまたでエントロピーという言葉を聞くことがあるかもしれませんが、あれは何を表しているかというと、情報の多さ(大きさ)とも捉えることができます。ここら辺の説明や例はググるといろいろでてくるので、そちらをどうぞ。

# エントロピーの定義
いちばんオーソドックスな定義は

```math
H(X)=-\sum_x p(x)log p(x)
```
でしょう。$p(x)$は確率なので$0\leq p(x) \leq 1$の値を取るので、その範囲では、logの定を2としても$e$としても$log p(x)$の値が負になるので、エントロピーの値が非負となることが直感的にわかるでしょう。(※厳密な証明ではないです) また確率変数が離散の場合は

```math
H(X)=-\int p(x)log p(x)dx
```
となります。
一般に確率p(x)が0に近い値ばかり、あるいは１に近い値ばかり取ると、エントロピーは小さくなるが、値が散らばるとエントロピーが大きくなります。

#相互情報量
２つの確率変数が与えられた時に、その2つの依存具合を示すものである。２つの確率変数が独立な場合相互情報量は0となる。相互情報量には２つの定義がある。

### 一般的な定義

```math
I(X,Y)=\int \int p(x,y)log\frac{p(x,y)}{p(x)p(y)}dxdy
```

相互情報量という名前ではこちらが良く使われている気がします。logの分子には同時分布、分母には周辺分布が用いられており、$p(x)とp(y)$が独立、つまり$p(x,y)=p(x)p(y)$のとき、この値が0となるのも納得できよう。

### KLダイバージェンス

```math
KL(p,q)=\int p(x)log\frac{p(x)}{q(x)}dx
```
カルバックライブラー情報量とも呼ばれますが、こちらもp(X)とq(x)の分布の近さを測る距離(厳密には距離ではない)として使われています。値が小さいほど2つの分布の距離が近い考えられます。EMアルゴリズムの最適性について証明するときや、AICなどの情報量規準の文脈で見られます。 
一般的な定義は$p(x,y)$と$p(x)p(y)$のKLダイバージェンスと考えることもできます。

#交差エントロピー

```math
H(X)=-\sum p(x)log q(x) 
```
交差エントロピーは決定木のノードの分割規準(不純度)やニューラルネットの損失関数の文脈で用いられることがあります。一般のエントロピーがp(x)のみを使っていたのに対し、交差エントロピーはp(x)とq(x)という2つの分布を使っています。こちらも2つの分布が異なると値が大きくなります。


#ネゲントロピー
ネゲントロピーとは、非ガウス性の基準となる指標で、独立成分分析において独立成分を推定する際に非ガウス性を利用しており、そこで用いられる。

```math
J(x)=H(x_{gauss})-H(x)
```

このように定義されるが、第1項は確率変数ベクトル$x$がガウス性(正規分布に従う)を持つとしたときの、エントロピーである。$x$がガウス性を持つ場合は$J(x)$が0となるので、独立成分の推定ではこの値が大きくなるように推定する。
$H(x_{gauss})$を導出する。$x$が多変量(p変量)正規分布に従うとすると、確率密度関数は

```math
p(x|\mu,\Sigma)=\frac{1}{2\pi^{p/2}|\Sigma|^{1/2}}exp\{-\frac{1}{2}({x}-\mu)^T\Sigma^{-1}({x}-\mu)\} \nonumber
```

と表される。あらかじめ$exp$の中を変形する。ベクトルなのでトレース作用素を用いても変わらないことと、トレースの性質$tr(AB)=tr(BA)$を用いて

```math
\begin{align}
({x}-\mu)^T\Sigma^{-1}({x}-\mu) &= tr\{({x}-\mu)^T\Sigma^{-1}({x}-\mu)\} \\
&= tr\{\Sigma^{-1}({x}-\mu)({x}-\mu)^T\} \\
&= tr(\Sigma^{-1}\Sigma) \hspace{10pt}※\Sigmaは共分散行列 \\
&= tr(I_p) \hspace{10pt}※Iは単位行列 \\
&= p
\end{align}
```
と書き直すことができる。よって

```math
\begin{align}
H(x_{gauss}) &= -\int p(x)logp(x)dx \\
&= -\int p(x)\{-\frac{p}{2}log2\pi-\frac{1}{2}log|\Sigma|-\frac{p}{2}\}dx \\
&= \frac{p}{2}log2\pi \int p(x)dx + \frac{1}{2}log|\Sigma|\int p(x)dx +\frac{p}{2} \int p(x) dx \\
&= \frac{p}{2}log2\pi + \frac{1}{2}log|\Sigma|+\frac{p}{2} \\
&= \frac{1}{2}log|\Sigma| + \frac{p}{2}\{log2\pi+1\}
\end{align}
```
となる。
_pathと_urlの違いについて調べてみた

##そもそも_pathと_urlってなんだ？
ヘルパーの一種。ルーティングを作成すると、アプリケーションのコントローラで多くのヘルパーが利用できるようになりますがその内の一つみたいです。

##相対パスと絶対pathの違いってなんだ？
そもそもそこからでした。相対パスは今いる位置を起点にして、場所を指定する。絶対パスは今いる位置に関係なく場所を指定する。

例

```
root_path => '/'
root_url  => 'http://www.example.com/'

new_path => '/new'
new_url => 'http://www.example.com/new'
```

##_path
・相対パス
・redirect_to以外で使用する。
・link_toでよく使用されるイメージ

##_url
・絶対パス
・redirect_toの時にセットで使用する。(HTTPの仕様上、リダイレクトのときに完全なURLが求められるので)

##参考記事

・[Rails のルーティング](https://railsguides.jp/routing.html)
・[pathメソッドと_urlメソッドの使い分け](https://qiita.com/higeaaa/items/df8feaa5b6f12e13fb6f)
Express,React,SuperAgent使ってTodoリストを作ってみた。その1(APIサーバー構築編)



#はじめに
SuperAgentでCORS前提でReact, node.jsの記事が見当たらかったので、色々調べてまとめてみた。
環境設定はMacユーザーを前提にしてます。
出来るだけ初心者にもわかるよう一から書いています。

#環境設定
環境設定はこちらの記事を参考にnode.jsをインストールしてください(Macの方)
https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09

#Expressインストール
```:ターミナル
$ mkdir todoApp
$ cd 　todoApp
$ mkdir todo_server
$ cd todo_server
$ npm init

entry point: (index.js) server.js

$ npm install --save express 
```

＊npm initをすると、色々聞かれます。　
entry pointのみserver.jsとしておく。(APIサーバーとわかりやすくするため)
それ以外はEnterで問題ないです。

#その他、必要なモジュールをインストール
```:ターミナル
npm install --save body-parser
```


#server.jsを記述
好きなエディタで書いてください。私の場合はvim
`vim server.js`

```javascript:server.js
var express = require('express');
var bodyParser = require('body-parser');
var app = express();

app.set('port', (process.env.PORT || '5000'));

//CORSの設定（HTTPレスポンスヘッダの追加）

app.use(function (req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
  res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Max-Age', '86400');
  next();
});
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

//OPTIONSメソッドの実装

app.options('*', function (req, res) {
  res.sendStatus(200);
});

/*
**todoリストの処理
*/

//todoの配列を用意
var todo = [
  { message: 'todoを表示'}
] 
//ここはAPIサーバーのホーム。内容は特に重要ではない
app.get('/', function(req, res){
  var param = {"result": "Hello World"};
  res.json(param);
});

//api用のget, postルートメソッド
app.get('/api', function (req, res) {
  res.json(todo);
});
app.post('/api', function(req, res) {
  console.log(req.body);
  console.log(req.body.name);
  console.log(typeof req.body);
  todo.push({
    message: req.body.message
  })
  res.sendStatus(200);
});
//port確認用
app.listen(app.get('port'), function(){
  console.log("this api server is running at localhost:" + app.get('port'));
});

```

**これでAPIサーバーは完成!**
#APIサーバー起動
```:ターミナル
$ npm install
$ npm start
```
試しに`http://localhost:5000/api`にアクセスして

{ message: 'todoを表示'}

と出てれば成功です。


#次はその２(Reactクライアント制御編)
現在作成中

#参考にした記事
https://qiita.com/akakuro43/items/7f5c366e537324f92510
https://tnakamura.hatenablog.com/entry/2015/12/17/083546
PostmanからAPI Gatewayのパラメータ付きPostメソッドを叩く

表記の件、情報なさそうだったので記載しておく。
※筆者の検証環境のものです。適宜、チューニングは必要と思います。

メソッドとURLの設定までは、まぁ問題ないと思うが、迷われる可能性があるのは、以下２点。

## ヘッダの設定

<img width="966" alt="Postman_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/51320/b38ea576-933e-6675-d9a4-345df1edb575.png">

APIキーを使用する例。
Content-typeも必要に応じて設定しておく。（Bodyの設定時に入る）
設定を誤っていると、以下が返ってくると思われる。

```
"message": "Unsupported Media Type"
```

## Bodyの設定

<img width="962" alt="Postman.png" src="https://qiita-image-store.s3.amazonaws.com/0/51320/25fe338f-8755-a8b9-711b-14c3a9826f3e.png">

こっちの方が情報ないかも。
`raw` を選択し、`JSON(application)` を選んでおく。
テキストエリアにJSON形式でパラメータを記載しておく。


以上で、API Gatewayにアクセスできる（はず）
ESS JobのログをWebAPIで取得するJavaプログラム

# ERP Integration Service

ERP Integration Service には、ERPのデータインバウンドとアウトバウンドのAPIと、関連ジョブのステータス確認やログ取得のAPIが提供されています。
この中、[downloadESSJobExecutionDetails](https://docs.oracle.com/cd/E51367_01/financialsop_gs/OESWF/ERP_Integration_Service_ErpIntegrationService_svc_6.htm#oracle.apps.financials.commonModules.shared.model.erpIntegrationService.ErpIntegrationService)はESSジョブのプロセスIDを指定して、そのジョブのログや出力ファイルを取得するAPIになります。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/260307/6ebb41ab-ae86-18b3-dad8-67df20a0c999.png)

# Javaプログラム

## APIサービス取得とアクセス権限取得

サービスを取得するには、WSDLとサービス名を引数にして呼び出します。

```java
URL wsdl = new URL(
		"https://〇〇〇.oraclecloud.com/publicFinancialCommonErpIntegration/ErpIntegrationService?WSDL");
QName serviceName = new QName(
		"http://xmlns.oracle.com/apps/financials/commonModules/shared/model/erpIntegrationService/",
		"ErpIntegrationService");
erpIntegrationServiceService = new ErpIntegrationService_Service(wsdl, serviceName);

SecurityPoliciesFeature securityFeatures = new SecurityPoliciesFeature(
		new String[] { "oracle/wss_username_token_over_ssl_client_policy" });
erpIntegrationService = erpIntegrationServiceService.getErpIntegrationServiceSoapHttpPort(securityFeatures);
```

アクセス権限を取得するためユーザ名とパスワードを設定します。

```java
Map<String, Object> reqContext = ((BindingProvider) erpIntegrationService).getRequestContext();

reqContext.put(BindingProvider.USERNAME_PROPERTY, jobUser);
reqContext.put(BindingProvider.PASSWORD_PROPERTY, jobPass);
```

## ログ取得

downloadESSJobExecutionDetailsの引数に対象ジョブのプロセスIDと"log"を指定します。
※出力ファイルを取得したい場合は"out"を指定します。
※レスポンスのデータはZipファイル形式のため、Zipファイルに書き込みます。

```java
try (BufferedOutputStream bos = new BufferedOutputStream(
		new FileOutputStream(new File(logDir + "\\" + logFilename + ".zip")))) {

	List<DocumentDetails> docList = erpIntegrationService
			.downloadESSJobExecutionDetails(essProcId, "log");

	for (DocumentDetails docDetail : docList) {
		bos.write(docDetail.getContent());
	}
} catch (FileNotFoundException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
}
```
pip installでzlibがどうのこうのって言われてインストールできない




## エラーメッセージ

```
zipimport.ZipImportError: can't decompress data; zlib not available
```

よくわからないけどMacをmojaveに変えてしまうとこの問題にぶち当たるらしい。

## 対処法


```
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pk$ -target /
```

めでたしめでたし。
catの内容をpipeで繋いだ結果自分自身を更新する

たまにしかやらないのでほんとに忘れる

sedとか使わないで catしてpipeで繋いでゴニョっとして
redirectで自分自身を更新ってことを年に一回くらいやりたくなって、前までtmp fileとか書いてrenameとかやってたんだけど

あ、よく考えたら これでよかったんや！

~~~bash
$ cat file | do_something | tee file
~~~

### ダメ絶対

~~~bash
$ cat file | do_something > file
~~~
bashで文字にに色がつかない

何も考えない場合 `$''` 使え

zshだと何もしなくても色がついてたのでbashで実行した時に焦った
変数使う時にめちゃくちゃめんどくさいんだけど

~~~bash
bash-3.2$ echo -e "\e[32;1m[MESSAGE]\e[m"
\e[32;1m[MESSAGE]\e[m

bash-3.2$ echo -e '\e[32;1m[MESSAGE]\e[m'
\e[32;1m[MESSAGE]\e[m

bash-3.2$ echo $'\e[32;1m[MESSAGE]\e[m'
[MESSAGE]
~~~
Go言語テストのやりやすいメソッド

# はじめに
思いついたのでメモします。

# どういうこと？
httpリクエストやDBアクセスするコードを書いた際に本当にサーバにつなぎに行かないで欲しい場合。

# コード

```go:hoge.go
package hoge

import (
	"bytes"
	"net/http"
)

type Sender struct {
	req *http.Request
}

// prepare
func Send(method, url, body string) (sender *Sender) {
	req, _ := http.NewRequest(
		method, url, bytes.NewBuffer([]byte(body)))
	return &Sender{req}
}

func (sender *Sender) Do() int {
	cli := http.Client{}
	res, _ := cli.Do(sender.req)
	return res.StatusCode
}
```

```go:hoge_test.go
package hoge

import (
	"net/http"
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestSend(t *testing.T) {
	s := Send(http.MethodPost, "https://hogehoge.com/chome", "this is test!")
	assert.Equal(t, s.req.Method, http.MethodPost)
	assert.Equal(t, s.req.URL.Scheme, "https")
}
```

httpアクセスまでやると、httpパッケージのテストしてるだけなので、手前でちゃんとRequestを作れてるという確認だけできればいいよね。
というアプローチです。

以上
c++でsplit関数を秒で実装してみた

# c++にはsplit関数がない
　なんでかは分かりませんがc++を作ってる偉い人がsplit関数は静的言語のc++の理念には沿わないからだとかなんとか。
　stringのfind関数使えばsplitっぽいものが作れそうだったので自分の備忘録的な感じで置いときます。

# split関数実装

例えばこんな例、「文章なる文字列sを一つ与えられた時にカンマ(,)をスペース(空白)で置き換えたい」としよう。これをstringのfind関数を使って書くとこうなる。

```c++:sample01.cpp
#include <iostream>
#include <string> // VC++ではこいつ入れないとコンパイル通らない
using namespace std;

int main() {
    string s;
    cin >> s; // 標準入力例 "hoge,hoge,hoge"
    
    size_t i = s.find(","); // 文章の先頭からカンマの位置を探す(最初に見つかるカンマ１つだけ)
    s[i] = *" "; // 空白で埋める。*忘れないように注意
    
    cout << s << endl; // 標準出力例 "hoge hoge,hoge"
    
    return 0;
}

```

　先頭のカンマだけとは言わず、文章sからすべてのカンマをスペースに置き換えたいならwhile文を使えばよい。find関数は文字列s内に探したい文字列がない場合は-1を返してくるので、これをwhileの継続条件にしてやる。
※追記：-1はstring::nposとして実装されているそうなので、どっちを使ってもよい

```c++:sample02.cpp
#include <iostream>
#include <string> // VC++ではこいつ入れないとコンパイル通らない
using namespace std;

int main() {
    string s;
    cin >> s; // 入力 "hoge,hoge,hoge"

    // カンマ駆逐
    while (s.find(",") != -1) { // カンマが見つからなくなるまで
        s[s.find(",")] = *" "; // find関数をそのままsの添え字にして行間短縮
    }

    cout << s << endl; // 出力 "hoge hoge hoge" カンマが全て空白に置き換わった
	
    return 0;
}
```

　以上クソ丁寧に解説してみました。質問や改良案などあればコメントください。
MacのGCCで返り値を返さない関数を書くと鼻から悪魔が出る

# はじめに

未定義動作って怖いですね。未定義動作を入れると何が起きるかわからないことから、「鼻から悪魔」とかよく言われます。以前も踏んだことがあるのですが、今回また未定義動作を踏んでそうとう時間を溶かしたので、僕みたいな犠牲者が出ないようにここにメモしておきます。

環境:

* macOS Mojave 10.14.3
* g++ (Homebrew GCC 8.2.0) 8.2.0

# 現象1

以下のコードをMacのg++でコンパイル、実行するとSIGILLで死ぬ。

```cpp:test1.cpp
int hoge() {
}

int main() {
  hoge();
}
```

```sh
$ g++ -O1 test1.cpp  
test1.cpp:2:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^

$ ./a.out
zsh: illegal hardware instruction  ./a.out
```

## なぜ？

* 返り値を返すと宣言した関数で返り値を返さないのは未定義動作であり、
* かつMacのGCCでは、デフォルトでubsan(Undefined Behavior Sanitizer)が有効になっており
* ubsanが有効な状態では未定義動作を検出して`ud2`という命令を出力するから。


実際、関数`func`のアセンブリに`ud2`が出ている。

```nasm
  .globl __Z4hogev
__Z4hogev:
LFB0:
  ud2
```

`ud2`まで処理が進んだらSIGILLで死ぬ。

# 現象2

以下のコードをコンパイル、実行すると無限ループになってスタックを使い切って死ぬ。

```cpp:test2.cpp
#include <iostream>

int foo() {
  std::cout << "foo" << std::endl;
}

void bar() {
  std::cout << "bar" << std::endl;
  foo();
}

int main() {
  foo();
}
```

ここで、関数`bar`はどこからも呼ばれていないことに注意。

```sh
$ g++ -O1 test2.cpp                                                                              test2.cpp: In function 'int foo(int)':
test2.cpp:5:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^

$ ./a.out
foo
bar
foo
bar
(snip)
foo
bar
foo
bar
zsh: segmentation fault  ./a.out
```

呼ばれていないはずの関数`bar`が何度も呼ばれている。

## なぜ？

* 上記のコードを食わすと、関数`foo`にret文がつかなくなる[^1]。
* すると、処理が`bar`に移る。
* `bar`から`foo`がcallされているため、無限に`foo`がcallされてスタックを使い切って死ぬ。

[^1]: なぜかは知らん。それこそ悪魔に聞いてください。

アセンブリも掲載しておく。みやすさのためにc++filtをかけて、かつラベルをいくつか削除してある。

```nasm
	.globl foo()
foo():
LFB1564:
	pushq	%rbx
	movl	$3, %edx
	leaq	lC0(%rip), %rsi
	movq	std::cout@GOTPCREL(%rip), %rbx
	movq	%rbx, %rdi
	call	std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
	movq	%rbx, %rdi
	call	std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
	.globl bar()
bar():
	pushq	%rbx
LCFI1:
	movl	$3, %edx
	leaq	lC1(%rip), %rsi
	movq	std::cout@GOTPCREL(%rip), %rbx
	movq	%rbx, %rdi
	call	std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
	movq	%rbx, %rdi
	call	std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
	call	foo()
```

関数`foo`にret文がなく、そのまま`bar`に処理が移ってしまっているのがわかる。


ちなみに、`foo`の中の処理を空っぽにすると`ud2`を吐くので処理はすぐに止まり、かつSIGILLで死ぬ。

```cpp:test3.cpp
#include <iostream>

int foo(int m) {
}

void bar() {
  foo(0);
}

int main() {
  foo(0);
}
```

```sh
$ g++ -O1 test3.cpp
test3.cpp: In function 'int foo(int)':
test3.cpp:4:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
$ ./a.out
zsh: illegal hardware instruction  ./a.out
```

# まとめ

MacのGCCは、-O1 以上でubsanが有効になり、「返り値があるのに返り値を返さない関数」を書くと、SIGILLで死んだり、最悪無限ループを作ったりするので気をつけましょう。
Laravelセキュリティ：クリックジャッキング対策

# 結論
適当なミドルウェアを作成してhandleを以下のようにした後、webのミドルウェアグループに追加する。

```php
$response = $next($request);
//$response->header('X-Frame-Options', 'deny');ではだめ(後述）
$response->headers->set('X-Frame-Options', 'deny'); //状況に応じてsameoriginやallow-fromを指定
return $response;
```

# クリックジャッキングとは
攻撃者が作成したページの上に透過iframeなどでターゲットのwebサイトを埋め込み、ユーザーに対してターゲットのwebサイト上で何かしらのアクションをさせる攻撃のこと。下の図で言えばユーザーからはピンクのページしか見えておらず、指示通りに「ココをクリック」の場所を押したつもりが、実際にはサイトAで情報公開を選択してしまったことになる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176284/3b2d91c8-3862-8948-7be4-2f22d0b9da43.png)

画像：IPA 「知らぬ間にプライバシー情報の非公開設定を公開設定に変更されてしまうなどの『クリックジャッキング』に関するレポート」(https://www.ipa.go.jp/files/000026479.pdf) より

Laravelではこれを防ぐような仕組みが組み込まれていないので、自分でなんとかしましょうという記事です。

# クリックジャッキングを防ぐには
上の説明から分かるように、自分のwebサイトがiframeやembedなどで埋め込まれるとまずいわけです。よってこれを回避しましょうという話なのですが、最近のブラウザではレスポンスヘッダに「X-Frame-Options」を指定することで埋め込みを許可する、しないを制御することができます。

参考：https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

レスポンスヘッダにこのオプションを指定するため、LaravelではMiddlewareを利用するのが良さそうです。

```
$ php artisan make:middleware AddXFrameOptions
```

``` AddXFrameOptions.php
<?php

namespace App\Http\Middleware;

use Closure;

class AddXFrameOptions
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        $response->headers->set('X-Frame-Options', 'deny'); //状況に応じてsameoriginやallow-fromを指定
        return $response;
    }
}
```

APIは関係ないのでwebグループの方に先ほどのミドルウェアを追加します。

```Kernel.php
protected $middlewareGroups = [
        'web' => [
            ...
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\AddXFrameOptions::class // 追加
        ],
...
];
```

curlなどでレスポンスヘッダにX-Frame-Optionsが追加されていることを確認しましょう。

```
$ curl -D - http://localhost/myapp
```

# おまけ
冒頭にあるように、ミドルウェアでヘッダーを追加する際、

```
$response->header('X-Frame-Options', 'deny');
```

としてしまうと、ダウンロード等でファイルを返す際に以下のようなエラーが出ます。

```
Call to undefined method Symfony\Component\HttpFoundation\BinaryFileResponse::header()
```


https://stackoverflow.com/questions/29289177/binaryfileresponse-in-laravel-undefined にあるように、header()はSymfonyのResponseには定義されていないからだそうです。ややこしや。
ベクトルタイル一枚をCMSにおけば管内図基盤なのではという話をあとで書く

私は「国連ベクトルタイルツールキット」のリードとして基本図ベクトルタイルを最適化・相互運用する話に日ごろ携わっていますが、その中で、逆に「管内色塗りするタイプの図こそ、簡単にだせるよな」と思っています。

## あとで書く
こういうことを、あとで書いてみたいです。

1. 管内ポリゴンのデータをひろってくる
2. 管内を十分に覆うタイル番号を確認する。例えば https://hfu.github.io/module-locate/ を使って。
3. Tippecanoe で、そのタイル番号のベクトルタイルを作る。多くの場合、そのタイルは数十キロバイトとかの小さなものになるだろう。元のデータよりも小さい場合が多いし、地図をPNGとかにしたものとくらべると、遥かに小さいものになるはずだ。
4. それを、なるべくわかりやすいURLで、CMSのうえでいいから置く。
5. それを、Mapbox GL JS や OpenLayers で利用するサイトを書く。なるべくたくさん書く。使い方も書く。そうすることで、そのベクトルタイルを組織内基盤として使い回せるようになってくる。
6. それでこの方法を、なるべくオープンな方法で共有する。

## See also
私の手元の実験コードとしては、こういうものを書いています。このレポジトリでは投影が入っていてややこしくなっていますが、たいていの場合、dirty-reprojectors を使う必要はないでしょう。あとで解説してみたい。
https://github.com/hfu/small-world
クリップボードにコピー

```haml
%span{data: {name: 'ほげ'}, onclick: 'copySomething(this)'} facebook
```

```javascript
function copySomething(name){
  var selection = window.getSelection(), range = document.createRange();
  range.selectNodeContents(name);
  selection.removeAllRanges();
  selection.addRange(range);
  document.execCommand('copy');
}
```

DATA属性が持ってる「ほげ」をクリップボードに格納したいが挫折ｗ
とりあえずここまで！
GKE手順メモ

# クラスタセットアップ

>クイックスタート  |  Kubernetes Engine のドキュメント  |  Google Cloud
>https://cloud.google.com/kubernetes-engine/docs/quickstart?hl=ja

## 初期設定
```
gcloud config set project [PROJECT_ID]
```

```
gcloud config set compute/zone [COMPUTE_ZONE]
```

## クラスタ作成

gcloudでもできるが、コンソールの方がノードの調整がしやすい

## kubectlとクラスタつなぐ

```
gcloud container clusters get-credentials [CLUSTER_NAME]
```

## GPUを使う

>GPU  |  Kubernetes Engine  |  Google Cloud
>https://cloud.google.com/kubernetes-engine/docs/how-to/gpus

GPU付きのクラスタを立ち上げる。
東京リージョン(asia-northeast1)だとTesla T4しか使えないので若干割高。
台湾（asia-east-1）とかだとTesla K80なども使える。

上記のドキュメントだと

>目的の GPU を選択

という記載があるが、自分の環境だとデフォルトでK80やP100は割当が1になっていたが、
```GPUs (all regions)``` というのが0になっているのが原因でクラスタの立ち上げに失敗した。
```GPUs (all regions)``` の割当を申請し、反映されたあとは立ち上げに成功した。

ドキュメントにあるように立ち上がったら

```
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/nvidia-driver-installer/cos/daemonset-preloaded.yaml

```
を実行してドライバーをインストールする。

# アプリケーション

## Container Registry

>Container Registry のクイックスタート  |  Container Registry  |  Google Cloud
https://cloud.google.com/container-registry/docs/quickstart?hl=ja

>イメージの push と pull  |  Container Registry  |  Google Cloud
https://cloud.google.com/container-registry/docs/pushing-and-pulling?hl=ja

* ホスト名

>gcr.io は米国でイメージをホストしていますが、今後は場所が変更される可能性があります。
us.gcr.io は米国でイメージをホストしますが、その場所は、gcr.io によってホストされるイメージからは独立したストレージ バケットです。
eu.gcr.io は、欧州連合でイメージをホストします。
asia.gcr.io は、アジアでイメージをホストします。

```
docker tag [SOURCE_IMAGE] [HOSTNAME]/[PROJECT-ID]/[IMAGE]
```

## httpsで公開

以下にしたがう

>GKE でマネージド証明書を用いた https 通信を設定する - Qiita
>https://qiita.com/watiko/items/71d78a4d31eee02cb47d
情報処理安全確保支援士 平成25年度秋 午後1問4 

#設問1
**・秘密として管理されていること**
**・有用な情報であること**
**・公然と知られていないこと**

不正競争防止法の営業秘密に関連する問題
正式な文書としては
「秘密として管理さえている生産方法、販売方法、その他の事業活動に有用な技術上または営業上の情報であって、公然と知られていないこと」
午前問題でも何度か出題されているため、この3つは覚えておきたい。

#設問2
**・ディジタルフォレンジックス**
インシデント発生時の初動で大切なのは「証拠保全」
NPOから「証拠保全ガイドライン」というものが出ているため1度目を通しておく(長いけど・・・)
たぶん回答は「デジタルフォレンジックス」でも大丈夫なはず
[証拠保全ガイドライン](https://digitalforensic.jp/home-act-products-df-guideline-7th/)

#設問3
**(1)a:人事部 b:退職日終業時刻**
将来的には人事情報と情報システムを連動させて確実に利用者ID、アクセス権限を停止させる。
暫定的にできる対応としては人事部が退職届を受理した後、運用担当者が停止処理を行うこと。
また、退職日まではIDを利用できる必要があるため、現在の運用規定同様「退職日終業時刻(後)」に
処理する必要がある。

(2)**リスク:インターネットを利用して機密情報を社外持出し用PCの外部に送信できる**
現在の運用では社外持出し用PCは「情報収集のためにインターネットアクセスが可能」「VPN装置で認証を行えば機密情報の取得が可能」な状況
従業員に悪巧みを考えている人がいれば、「機密情報取得→外部への送信」が可能である。

　**C:VPN装置経由だけを許可する**
現在は社内のファイルサーバにアクセスする時のみ、VPN装置を利用している。
インターネットへ直接アクセスすることを禁止し、VPN装置を経由にすることでインターネットアクセス制御が行えるし、利用者のアクセス履歴が残り後々情報漏えいが発覚した際の調査材料にも利用できる。
プロキシサーバ経由でもよいと思われるが、VPN装置がリバースプロキシ的存在という記載もあるため「社外持ち出しPC→VPN装置→プロキシサーバ→インターネット」の順はさすがに回りくどい。

#設問4
**・ファイルの中身に紙媒体同様に、"厳秘"、"秘"を明示する**
電子媒体はアクセス権は付与していたが、機密情報のレベルが明示されていない(問題文に記載がない)
そのため、社外への開示が可能なのかがよくわからない状況。
媒体が電子にしろ、紙にしろ同様に扱うことが求められる。

#考え方
・「社外持ち出し用PCでインターネットにアクセスして情報を収集できるようにしている。」
　　→逆にインターネットに情報を発信できる可能性があるという認識を持つ。
・機密情報保管は紙、電子問わず同様のポリシーを保つ
・保護すべき情報は「個人情報」と「機密情報」
【Mac】UnityのExternal Script EditorでJetBrains ToolboxのRiderを指定する方法（もしかしたらバグ回避策）

## 概要

MacのUnityで外部エディタにJetBrains ToolboxでインストールしたRiderを指定する方法がちょっとややっこしかったので手順を示す。
もしかしたらもっと楽な方法があるのかもしれない。

※ただこのやり方だとscriptファイル開こうとするたびにRider開いちゃってなんかやっぱり挙動がおかしい気がする（開きっぱなしにすればいいから問題ない挙動？）

## 環境

- macOS Mojave  10.14
- Unity 2018.3.6f1
- JetBrains Toolbox 1.13.4801
- Rider 2018.3.3

## ToolboxでインストールしたRiderを探す

Toolboxのアプリインストールパスを見ると多分、下記の用に表示されているはず。
愚直にやるのであればこのパスを指定してあげれば良いのですが、パスにバージョン情報が含まれているため、バージョンアップごとに指定し直さなければならない。

```
~/Library/Application\ Support/JetBrains/Toolbox/apps/Rider/ch-0/{version}/Rider.app
```

そんな面倒なことはしたくないので解決策。
実はインストールしたJetBrains Toolbox.appの中にショートカットが存在するのでこちらを指定すればOK。

```sh
$ ls -la ~/Applications/JetBrains\ Toolbox/
drwxr-xr-x  3 hrs-o  staff    96  2 22 14:30 Rider.app
```

## 実際にUnityでRiderを指定する

- UnityのPreference -> External Tools → External Script EditorからBrowseを選択
- キーボードショートカットで`「Command」＋「Shift」＋「G」`を押してGo to the folderダイアログを表示
  - 先程のパスを選択したいが、そのままだとToolbox.appを選択してしまうので一工夫する
- 入力欄に `~/Applications/JetBrains Toolbox/Rider.app` を入れてGo
- Rider.appが表示されるのでOpen

![unity-browse-ex-tools.png](https://qiita-image-store.s3.amazonaws.com/0/1664/b3eac893-9d18-b3b7-6200-61dff3bef727.png)

## 備考

toolboxから入れるとPreference開くときにエラーが出るっぽいのでこれがちゃんと解決したらこの手順必要なく、自動でpathを検索してくれる気がしている。

https://youtrack.jetbrains.com/issue/RIDER-23678#focus=streamItem-27-3295974.0-0
agora.io SignalingSDKの利用例(テキストチャット)

#概要
agora.ioには映像/音声配信のSDK以外にメッセージングができるSignalingSDKが提供されています。
利用用途は様々で、チャットやイベント情報の送受信、ビデオ通話の招待等に利用できます。
Native/Web/Server用にSDKが用意されています。

[公式ドキュメント](https://docs.agora.io/en/Signaling/product_signaling?platform=All%20Platforms)

**※Signaling SDK は、サポート終了しております。後継サービスとして、[RTM (Real-time Messaging) SDK] (https://docs.agora.io/en/Real-time-Messaging/product_rtm?platform=All%20Platforms) が提供されております。RTM SDK は、Signaling SDK に比べ、 安定性や信頼性が向上しております。**

#チャットの実装例
SignalingSDKでチャネルにログインし、メッセージを送るサンプルです。
[Githubに公開しています](https://github.com/fu-jimoto/Agora-ChatRoom-Web)

###Signalingのインスタンス作成
```javascript
var signal = Signal(app_id);
```

###Signalingサービスへの接続
```javascript
session = signal.login(ACCOUNT,"_no_need_token");
//実利用では第２引数はTokenを生成して利用します
```

###Channelへの入室
```javascript
channel = session.channelJoin(CHANNEL_NAME);
```

###メッセージの送信
```javascript
channel.messageChannelSend(MESSAGE,CALL_BACK);
//投稿禁止や特定文字列の禁止等の制御については送信前に独自実装が必要になります
```

###メッセージの受信
```javascript
channel.onMessageChannelReceive = function(account, uid, msg){
  //Your Logic
}
```

この他にも個別でメッセージを送る事も可能です。



#最後に
[**agora.ioに関するお問い合わせはこちらから**](https://hubs.ly/H0kB1_n0)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://hubs.ly/H0kB1_n0)
HTMLで特殊文字のエスケープ記号

特殊文字のエスケープ記号を忘れるとので、よく使うものを備忘録として纏めています。

# HTMLでよく使う特殊文字

| 表示       |       記号 |
|:-----------------|------------------:|
| < |　\&lt; |
| >           |            \&gt; |
| &             |             \&amp; |
| "               |                \&quot; |
| '             |             \&#39; |
| 空白文字          |           \&nbsp; |

# 参考URL
[HTML特殊文字コード表](http://www.shurey.com/js/labo/character.html)
DRAGINO Lora GPS HAT-JPを動かしてみた

# 更新＆訂正しました
チップのレジスタを叩いて送信パワーを設定する場合に以前の設定ではRF送信しないことが判明しました．
試した状況からモジュールの無線はPaBoostを選択しないと出力されませんでしたのでPaBoostを選択して出力を設定するようにしました．
以前の設定ではミスってRFOを選択して設定していましたが片方向の動作で実際に送信はしていなかったので発覚しなかった．．．
SX1272搭載モジュールが手元にないので推測になりますが同じくPaBoostを選択するようにしてあります．

#DRAGINO Lora GPS HAT-JPの出力設定
技適マークの付いたモジュールをRSコンポーネンツで入手しました．
まずは簡単そうなsingle_chan_pkt_fwdをRPIに入れてTTNのgw構築にチャレンジしてみました．
ソースを眺めると出力を設定しているところが見当たらず、チップのデフォルト（SX1276の場合13.2dBm、SX1272の場合14dBm）になると思われます．
そこで周波数を日本向けに変更するついでに出力も設定してみましたのでメモです．
ちなみにチップはsx1276でした．
##周波数変更
uint32_t  freq = 923200000;
##出力設定　（更新版）
以下main.cppに追加

// Tx Power Register
　#define	REG_PA_CFG	0x09
//	Power Setting for Japan ARIB STD-T108 
//  20mW=13dBm
////----UPDATED----SELECT PA_BOOST----////
//  SX1276 RegPaConfig(0x09), Val=1.011.1011=0xbb
//  bit 7 	PaSelect = 1, select PA_BOOST (not RFO!)
//  bit 6-4	MaxPower = 3, Pmax=10.8+0.6*3=12.6 < 13
//  bit 3-0 OutputPower = 11 =b, Pout=17-(15-OutputPower)=13
int  PWR_JPN_1276 = 0xbb;    //3f;

// SX1272 RegPaCfg(0x09), Val=1.000.1011=0x8b
//  bit 7 	PaSelect = 1, select PA_BOOST (not RFO!)
//  bit 6-4	n/a = 0, Pmax=2+OutputPower = 13
//  bit 3-0 OutputPower = 11 = b 
int  PWR_JPN_1272 = 0x8b;

周波数設定の後に追加します．
// Set Tx Power for Japan
    if (sx1272) {
		writeRegister(REG_PA_CFG, PWR_JPN_1272);
	} else {
		// sx1276
		writeRegister(REG_PA_CFG, PWR_JPN_1276);
	}

参考：
https://github.com/tftelkamp/single_chan_pkt_fwd
SX1272のデータシート https://www.semtech.com/uploads/documents/sx1272.pdf
SX1276のデータシート https://www.semtech.com/uploads/documents/DS_SX1276-7-8-9_W_APP_V5.pdf
Cloud Functions と Mailgun のサーバーレスアーキテクチャでメールを送信する

サーバーレスアーキテクチャで静的サイトをホスティングしたいけど、お問い合わせのメールは送りたい、というときに読む記事です。
技術的には、

* Google Cloud Functions（Firebase のプラットフォームとして提供されているサーバーレス関数：AWS Lambda と同じような機能の GCP版）、 
* Mailgun（メールを API を叩くことで送信してくれるサービス：AWS SES みたいなもの）

の 2つを使います。

## 動機

なんでこんなことをしたいかと言うと、Angular や React.js で SPA的に静的サイトを作る際に、メールだけは送りたいとか、この情報だけはユーザーの見えるところに置いておけないという要望があるためです。
この場合、通常であれば別途アプリケーションサーバーを用意して独自の処理を書いたりするのですが、
それすら面倒くさい
最小のサーバーでさえコストが合わない、オートスケールさせたいという状況に出くわしたので、従量課金かつオートスケールする Cloud Functions を使用します。

この記事を書いた動機は、至極単純に日本語の記事がなかったので、です。

## 書いてないこと

基本的に Cloud Functions や Mailgun がなにか、という説明は書きません（括弧書きの中で少し書いていますが）。
僕自身がこういった数行のまとめを読んで、「このサービス、完璧に理解した！」という経験が無いので、実例を通してなんとなくこういうものかな？という推測を積み重ねていった後に説明を読めば良いと思います。

## 想定読者

* `gcloud`コマンドラインツールを用いて GCP の設定や運用がある程度できる。

## Cloud Functions概要

Cloud Functions は、node.js の形式でファイルをデプロイするといい感じにエントリーポイントを作って機能を提供してくれるサービスです。
まずは雛形を作ります。

* 例えば適当に `sample` というディレクトリを作って、その直下に `index.js` というファイルを置きます。
* 次に、`sample`ディレクトリの中で `npm init` を実行して、`package.json` を作ります。
* `npm install` を実行しておきます（何も追加してないのであまり面白いことは起きません）。
* `index.js` を次のように変更します。
 
```js
'use strict';

exports.sampleAction = (req, res) => {
  res.send(`you said ${req.body}`);
}
```

* GCP のプロジェクトを設定します。

```bash
# このプロジェクトは firebase console に載っているものの方が良い気がします。
# https://console.firebase.google.com/u/0/?hl=ja
#
# ...が、GCP上だけで作ったプロジェクトで試してないので真偽はわかりません。
# 試してみてわかった方がいらっしゃいましたら教えてください。
$ gcloud config set project プロジェクトID
```

* 以下のコマンドでデプロイします。

```bash
$ gcloud beta functions deploy sampleAction --trigger-http --region asia-northeast1
```

おめでとう！これで初めての cloud functions が完成だ！

というわけで、デプロイした後に表示された `httpsTrigger:` の後の URL に `curl` とかでなにか送ると、リクエストをオウム返しする機能が完成しました。

## Mailgun を Cloud Functions で使うために

Mailgun を node.js上で走らせるためには、（自分で API を叩くライブラリを作ってももちろん良いですが）mailgun公式のライブラリを使用します。
https://github.com/mailgun/mailgun-js

使い方は github を見てもらえば分かると思います。
どこかのページを見たら API が古かったので、公式を参照するほうが良いです。

Mailgun でどうやってメール送信の設定するの？ということに関しては、「mailgun 設定」とかでググるといっぱい記事が出てくるので割愛します。
昔はクレジットカード登録しなくても月1,000件くらいまで遅れた気がしますが、現在は無料の範囲でもクレカ登録必須になりました。

さて、先程作成した sample というプロジェクトを修正していくことにしましょう。

まず、`sample`ディレクトリの直下で

```bash
$ npm i --save mailgun.js
```

を実行します。
次に、`index.js` を次のように書き換えます。

```js
'use strict';

const API_KEY = 'YOUR_MAILGUN_API_KEY';
const DOMAIN = 'YOUR_DOMAIN';
const mailgun = require('mailgun.js');

// mailgun client
const client = mailgun.client({
  username: 'api',
  key: API_KEY,
})

exports.sampleAction = (req, res) => {
  client.messages.create(DOMAIN, data)
    .then(msg => console.log(msg))
    .catch(err => console.error(err));
}
```

`YOUR_...` のところは適宜書き換えてください。

はい、これでオウム返しをメール経由でできるようになりました。
あとはこのエントリーポイントをフロント側から叩けばメール送信機能の完成です。

## 本番運用に向けて

簡単のため、いくつか本番環境では好ましくないところを残しています。

* `API_KEY` と `DOMAIN` はソースコードから分離して、例えば環境変数などで管理するべき
* CORS対応（ドメイン制限含む）
* データの永続化（firebase realtime DB などに接続する）
* 許可しない HTTP Method への対応

本記事ではこれらの設定は特に書きません。


## まとめ

正直、メール送信くらいの機能であれば、別途アプリケーションサーバーを用意するよりも全然楽です。
とりあえずサクッと作ってコスト最小で出したい！ってときには良い選択肢なのではないでしょうか？
Windows環境でlaravelプロジェクトをcloneした後の設定

laravelのプロジェクトをcloneしたときの操作手順です。　

sourcetreeを使い、ローカルレポジトリにcloneします。
![sourcetree.png](https://qiita-image-store.s3.amazonaws.com/0/365630/041ed56c-6522-08eb-1a89-70838b8219d4.png)


cloneしてきたプロジェクトに移動し、composer installを行うことで
vendorディレクトリを作成します。

```cmd
cd [cloneしたプロジェクト]
[cloneしたプロジェクト]>composer install
```

次に接続するDBの情報を入れるためにenv.exampleの名前をenv.に書き換え編集します。
中身を接続するDBの情報に書き換えてください。

```　.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
```

アプリケーションキーの生成を行います。

```　
php artisan key:generate
```

最後にマイグレーションを実行します。


```　
php artisan migrate
```

一連の作業が終わったらサーバーを立ち上げて確認してみてください。
ISO 8601形式でUTCの現在時刻をサクッと表示する方法(with Docker)

macOSのdateコマンドにISO 8601形式で表示するオプションがなかったので、Dockerのbusyboxイメージを使って現在時刻を表示します。
Dockerを使うことで、ポータビリティを高めます。

なお、busyboxなのでUTCでの表示になります。

```bash
docker run busybox date -Iseconds
```

```bash:実行結果(UTC)
2019-02-22T08:59:10+0000
```

**追記**

`-I` オプションを使わない場合はこちら。

```bash
docker run busybox date "+%Y-%m-%dT%H:%M:%S%z"
```
ASP.NET MVC5でもルートテンプレート内でトークンを使いたい！

## ルートテンプレートでのトークンの使用
ASP.NET Core ではルーティングを定義するときにトークンを使用できます。
[ルート テンプレートでのトークンの置換 ([controller], [action], [area])](https://docs.microsoft.com/ja-jp/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.2#token-replacement-in-route-templates-controller-action-area)
しかし残念ながら ASP.NET MVC5 には実装されていないため逆輸入します。

## IDirectRouteProvider の作成
DefaultDirectRouteProvider を継承してトークンを変換する処理を実装します。

```DefaultTokenDirectRouteProvider.cs
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Web.Mvc.Routing;

public class DefaultTokenDirectRouteProvider : DefaultDirectRouteProvider
{
    public override IReadOnlyList<RouteEntry> GetDirectRoutes(ControllerDescriptor controllerDescriptor, IReadOnlyList<ActionDescriptor> actionDescriptors, IInlineConstraintResolver constraintResolver)
    {
        return base.GetDirectRoutes(controllerDescriptor, actionDescriptors, constraintResolver)
            .Select(x =>
            {
                x.Route.Url = x.Route.Url
                    .Replace("[controller]", x.Route.Defaults["controller"].ToString())
                    .Replace("[action]", x.Route.Defaults["action"].ToString());
                return new RouteEntry(x.Name, x.Route);
            })
            .ToList();
    }
}
```

## RouteConfig への登録
あとは MapMvcAttributeRoutes メソッドに先ほど作成した DefaultTokenDirectRouteProvider を渡してあげるだけです。

```RouteConfig.cs
using System.Web.Mvc;
using System.Web.Routing;

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.Clear();
        routes.MapMvcAttributeRoutes(new DefaultTokenDirectRouteProvider());
    }
}
```

## 使い方
以下の今までの書き方が...

```Sample1Controller.cs
using System.Web.Mvc;

[RoutePrefix("Sample1")]
public class Sample1Controller : Controller
{
    [HttpGet]
    [Route("Index")]
    public ActionResult Index()
    {
        Response.StatusCode = (int)HttpStatusCode.NotFound;
        return View();
    }
}
```

スマートになります。
[area] トークン、トークンのカスタマイズは対応していません。

```Sample2Controller.cs
using System.Web.Mvc;

[RoutePrefix("[controller]")]
public class Sample2Controller : Controller
{
    [HttpGet]
    [Route("[action]")]
    public ActionResult Index()
    {
        Response.StatusCode = (int)HttpStatusCode.NotFound;
        return View();
    }
}
```
【CakePHP3.6 以降】コンポーネントでセッションを利用する方法

コンポーネントでセッションを利用する方法を検索して、
いろんな記事を参考に試してみたが、どれも上手くいかなかった。。。

辛抱強く調べてみるとバージョン3.6以降ではセッションオブジェクトの呼び出し方法が変わっていることが、上手くいかない原因のようでした。（レシピブックにもちゃんと書かれていました。。。詳しくは[こちら](https://book.cakephp.org/3.0/ja/development/sessions.html#accessing-session-object)）
3.6以降でコンポーネントでセッションを利用する方法を紹介させていただきます。
##CakePHP3.6以降

```php:SampleComponent.php
namespace App\Controller\Component;

use Cake\Controller\Component;

/**
 * Common component
 */
class SampleComponent extends Component
{
  protected $_defaultConfig = [];

  public function initialize(array $config)
  {
    parent::initialize($config);

    $this->controller = $this->_registry->getController();

    $this->session = $this->controller->getRequest()->getSession();
  }

    public function testWrite()
    {
        $this->session->write('test', 'test');
    }
 
    public function testRead()
    {
        $this->session->read('test');
    }
}
```

ご参考になれば幸いです！
seabornでグラフ描画できなかった時の試行錯誤

#seabornを使えばグラフが描けるらしいぞ？からの試行錯誤


初心者の例にもれず、Jupyter notebookで楽しくデータをいじっていたら、なんとも微妙なハマり方をしたので、備忘録として書いておく。
出発点はここから

```
import seaborn as sns
sns.set() 

iris = sns.load_dataset('iris')
sns.jointplot('sepal_width', 'petal_length', data=iris)
```

最後の行を書いて実行すればグラフが表示されるものと思っていたが、なにやら

```
<seaborn.axisgrid.JointGrid at 0x1a20a0a828>
```

なるメッセージだけが表示されるのみであった。いくつかググった結果、この場合は

```
import matplotlib.pyplot as plt　 #もともとインポートしていなければ書く

plt.show()
```

で表示されるようだ。（当たり前？）
sns.show()とかで表示できたらわかりやすい気がする、、、
【Swift 4】テストビルドか判断する方法

スキーム毎に処理を分けたい時、
例えばテスト実行中にアクセスするURLを分岐したい時に使えます。


スキームを選択して`Edit Scheme`
`Environment Varibles`に適当なKeyとValueをセットする
<img width="896" alt="スクリーンショット 2019-02-22 17.50.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/47337/a4626629-339c-a584-d476-c1bb318efaf5.png">



```swift:Viewcontroller.swift
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        if Scheme.isTesting() {
            print("Testing")
        } else {
            print("Not Testing")
        }
    }

}

class Scheme {
    static func isTesting() -> Bool {
        if ProcessInfo().environment["isTesting"] == nil {
            return false
        }
        return true
    }
}

```
MOMと収縮と拡張の法則

#MOMという指標
MOM（モメンタム）という指標がある。
>モメンタムとは、相場の勢いや方向性を判断するオシレータ系指標で、当日の終値からｎ日前の終値を引いて求められるため、短期的な動きを判断する指標として使用されます。
売買タイミングを把握する指標というよりは、相場が上昇している時の勢いが弱くなってきているのか、また相場が下降している時の勢いが強くなってきているのかを捉える先行指標としても利用できます。


>・買いタイミング
モメンタムがゼロ以下からゼロ以上に上抜ければ買いタイミングとなります。
ゼロ以上でさらに上昇した時は、強気相場と判断します。
株価が上昇しているのに、モメンタムが横ばいになってきたら上昇率が低下していることを表します。
株価が安値更新時に、モメンタムが直近安値を更新できない時に買いタイミングとなります。

>・売りタイミング
モメンタムがゼロ以上からゼロ以下に割り込めば売りタイミングとなります。
ゼロ以下でさらに下降した時は、弱気相場と判断します。
株価が下降しているのに、モメンタムが横ばいになってきたら下落率が低下していることを表します。
株価が高値更新時に、モメンタムが直近高値を更新できない時に売りタイミングとなります。

>>引用元：
https://www.sevendata.co.jp/shihyou/technical/momentum.html


![![ダウンロード (1).png](https://qiita-image-store.s3.amazonaws.com/0/340650/a96e8f21-032c-1de6-6b73-0d41952f661b.png)
uploading-0]()
つまり、相場のおおざっぱな傾きを計算して相場の上下移動を算出する。

#そのまんま作ってみる
まず、10日間のMOM指標、MOM10だけで売買を行ってみた。
MOM10が強気→買う
MOM10が弱気→売る
という単純なプログラムです。
##結果

![スクリーンショット (100).png](https://qiita-image-store.s3.amazonaws.com/0/340650/9ac8cdf3-4fdd-955a-89fc-83243e871f94.png)

損益-3.40%
よくはない。


#売り買いタイミングを逆にしてみる。
では、
MOM10が強気→売る
MOM10が弱気→買う

```MOM10_2.python
 def _my_signal＿MOM(data):
      
      cp = data["MACD"].fillna(method="ffill")
      MOM10 = pd.DataFrame(data=0,columns=[], index=cp.index)
      for (sym,val) in cp.items():
        MOM10[sym] = ta.MOM(cp[sym].values.astype(np.double), timeperiod=10)
      #モメンタムが0以上で強気状態＝買い
      buy_sig = MOM10[(MOM10 >0)]
      #モメンタムが0以下で弱気状態＝売り
      sell_sig = MOM10[(MOM10 <0)]
      return {
        "MOM10": MOM10,
        "buy:sig:MOM10": buy_sig,
        "sell:sig:MOM10": sell_sig,
        }

```
![スクリーンショット (104).png](https://qiita-image-store.s3.amazonaws.com/0/340650/ea7797a3-2da4-53e8-5077-6fbd279b5fd3.png)

損益17.41%

定説と逆にした方が儲かるという結果になりました。

#収縮と拡張の法則
>値動きの値幅が収縮した後に強いブレークアウトが起きると、その値動きは継続しやすいという法則です。
たくさんのチャートを観察してみてください。
強いブレークアウトが起きる少し前の値動きを見てみると、三角持ち合いになっていたり、小幅なレンジ相場になっていることがよくあります。
これはたまたまそうなっているのではなく、ブレークアウトに向けてエネルギーをため込んでいるのです。コイルを巻くような段階のあと、一気に動き始めるという言い方をしてもいいですね。

>>引用元：https://sokusenryoku-fx.com/fx-chart/souba-housoku2/

#収縮を再現する
収縮はボリンジャーバンドによって判断することとしました。
```
    def _TALIB_CALL(data):

      #各銘柄の終値(株式分割調整後)を取得、欠損データの補完
      cp = data["close_price_adj"].fillna(method="ffill")

      upperband = {}
      middleband = {}
      lowerband = {}

      buy_sig = pd.DataFrame(data=0,columns=[], index=cp.index)
      sell_sig = pd.DataFrame(data=0,columns=[], index=cp.index)
      uband = pd.DataFrame(data=0,columns=[], index=cp.index)
      lband = pd.DataFrame(data=0,columns=[], index=cp.index)

      for (sym,val) in cp.items():
        upperband[sym], middleband[sym], lowerband[sym] = ta.BBANDS(cp[sym].values.astype(np.double),
          timeperiod=25,
          nbdevup=2,
          nbdevdn=2,
          matype=0)

        lband[sym] = lowerband[sym]
        uband[sym] = upperband[sym]
        #-2σに近いときに収縮
        buy_sig[sym] = lowerband[sym] / cp[sym]
        #＋2σに近いときに拡張
        sell_sig[sym] = cp[sym] / upperband[sym]


      return {
        "upperband:price": uband,
        "lowerband:price": lband,
        "bb_buy:sig": (buy_sig >= 1.002),
        "bb_sell:sig": (sell_sig >= 0.99),
      }```


この
bb:buy:sigを収縮のサイン
bb_sell:sigを拡張のサインとします。

縮小・拡張
NRIアジャイルハブ #16 Active Book Dialog会「管理ゼロで成果はあがる～「見直す・なくす・やめる」で組織を変えよう」（１）

![header.jpg](https://qiita-image-store.s3.amazonaws.com/0/192038/b79c4d94-bef0-b08d-98e5-c6b8a26a7fac.jpeg)

# はじめに

[社内アジャイルコミュニティ「NRIアジャイルハブ」](https://n-agile-community.peatix.com/view)の16回目の企画として、Active Book Dialogを実施しました。
https://nri-agile-hub16.peatix.com/view

今回はそのレポートです。

# 読んだ本

[ソニックガーデンの倉貫さん](https://kuranuki.sonicgarden.jp/)の近著『管理ゼロで成果はあがる～「見直す・なくす・やめる」で組織を変えよう』を読みました。

https://www.amazon.co.jp/dp/B07MSDRMM6/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

![表紙](https://images-fe.ssl-images-amazon.com/images/I/51UwG-wSDmL.jpg)

ちなみにActive Book Dialog(以下ABD) は本来「本を買ってきて、裁断しちゃって、みんなで分担して読む」というアクティビティなのですが、トップの写真を見ると分かる通り今回はPDFをA4に印刷して実施しています。
というのも出版社からオフィシャルにABDをやるなら提供します、とアナウンスされているんです。素敵！

https://gihyo.jp/book/topics?cid=264

今回はこちらから申し込んで利用させていただきました。

# Active Book Dialog (ABD) とは

今回読んだ本の著者である倉貫さんのブログが非常にまとまっていてわかりやすいので、こちらをご参照ください。

https://kuranuki.sonicgarden.jp/2019/02/abd.html

ただ、端的に言うと・・・

1. 担当を決めて手分けして読み、読んだところを白紙にざっとまとめる＝コ・サマライズ（みんなで要約）
2. まとめたところを本の順番に沿って勢いよく発表していく＝リレー・プレゼン（互いに発表）
    * このとき、気になったところに付箋を貼っていきます（✔をつけていくというのが元祖のルールらしい）
3. 気になったところを議論＝ダイアログ（みんなで議論）

というものです。
ゼミの輪読をものすごい勢いでやるという感じですね。

# というわけでやってみた。

コ・サマライズ中。

![52599231_327506484632314_218036540222210048_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/192038/5b9d8ecf-b94a-a1a8-30dd-426f057bb330.jpeg)

そしてリレープレゼン。左の二列はもう発表が終わって、コメントの付箋が付いてますね。

![52446350_2513162148698074_1979601923384279040_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/192038/7cd9257a-6579-0fa6-2c1b-4d6de94e32dd.jpeg)

最終的な出来上がり図。

![52923186_2320564211338962_7208145880895979520_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/192038/232ba055-5e42-3447-8a86-850ddf5942e3.jpeg)

今回は参加者が4人だったのと昼休みの50分枠で実施したので、約30ページずつ、計120ページほどを読むことができました。手元のKindleで読んだ範囲を確認したら、**なんと半分くらい読めてる**。すごい。
まだこの場以外で同じ本を読めていないので精読した場合の理解度と比べられてはいませんが、それなりにわかった気にはなることができました。
本の内容自体が分かりやすかったのもあるかもしれません。

# 振り返り

![52920454_1072315672970222_383883287858249728_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/192038/1ef92235-f9fe-be02-c162-eb5d5a61f675.jpeg)

フィードバックの内容を見ると、全体的に好評でした。
とくにABDの使い所に関していくつかコメントが出たのが印象的でした。

* お客さんが出した本を営業チームでABDで効率よく読んでおくといいのでは？
* 順番に読まないと辛いタイプの本（論文とか、推理小説とか）をABDで読めるのだろうか。
* 推理小説のオチを担当する人が可哀想という意見も。

なお、本の内容に関しては是非ご自身で買って読んで（あるいはABDをやって）いただければと思いますが、コ・サマライズ中に「わかりみしかない・・・」というような呟きが漏れまくっていました。
おすすめの一冊になりそうです。

# 今後の予定

直近ではこちらのイベントを予定しております。

* [NRIアジャイルハブ #19 RSGT2019リピート会 全部スクラム！～SIerで大切だったこと、サービサーで大切だったこと～](https://nri-agile-hub-19.peatix.com/view)
    * 元NRI、現レバレジーズの森實さんがRSGT2019の講演を再放送してくれます。
* [NRIアジャイルハブ #17 顧客により早く価値を届けるために～コイン渡しゲーム～](https://peatix.com/event/599598/view)
    * コインを渡しながら顧客に価値を届けることについて考えるというゲームをやってみます。

また、遠からず今回の本のABDの後編をやろうと思っていますので、こちらもぜひご期待くださいませ。

それでは。
Android Developers Blog 適当意訳 #5 Expanding target API level requirements in 2019

# 2019年のターゲットAPIレベル
2019年2月21日

[原文](https://android-developers.googleblog.com/2019/02/expanding-target-api-level-requirements.html)
**※英語の勉強と自分用のメモ程度のかなり適当なものです。**


[以前の投稿](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html)で、
我々はAPIの挙動変更がどのようにAndroidのセキュリティとプライバシー保護(アプリの予期せぬバッテリーやメモリの過剰利用を阻止する事でのユーザー体験の向上も含みます)を進展させるかを説明しました。


2018年の11月から全てのGoogle Play上のアプリのアップデートは、ターゲットAPIレベルが 26(Android 8.0)以上であることを要求されています。
多くの開発者の努力のおかげで、AndroidユーザーはモダンなAPIを使い、安全でプライバシーを考慮したアプリを楽しんでいます。
例えば、2018年の間に、150,000以上のアプリがランタイムパーミッションをサポートしましたし、ユーザーに細かいデータの制御を提供しました。

本日、我々は2019年にGoogle Playが求めているものの情報を提供し、他のアプリストア経由での配布に関する変更に関してもお知らせします。

**2019年のGoogle Playの要求事項**

ユーザーに最高のAndroid体験を提供する為に、Google Play Console はアプリが最近のターゲットAPIレベルである事を要求します:

- **2019年8月:** 新規アプリのターゲットAPIレベル は 28 (Android 9)以上である必要があります
- **2019年11月:** 既存アプリの更新もターゲットAPIレベル は 28 (Android 9)以上である必要があります

更新されない既存のアプリは影響を受けないので、2019年11月以降もPlay Storeからダウンロード可能です。
アプリの [minSdkVersion](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#min) はどの値も使えます。
ですので、過去のバージョンのAndroid向けのビルドには変更はありません。

Android 9 Pie での変更は、[動作の変更点: API レベル 28+ をターゲットとするアプリ](https://developer.android.com/about/versions/pie/android-9.0-changes-28)をご覧ください。

**他のストアで配布されるアプリ**

ターゲットAPIレベルを最近のものにする事は、アプリがどのように配布されるかに関わらず価値があります。
中国では、Huawei, OPPO, Vivo, Xiaomi, Baidu, Alibaba, Tencentなどが提供しているアプリストアも2019年にターゲットAPIレベルが 26 (Android 8.0)以上である事を要求するでしょう。
我々は上記以外のアプリストアも同様の要求うを行うと考えています。

我々がPlay Store以外で検知したスパイウェアの95%以上がランタイムパーミッションを避ける為に意図的にターゲットAPIレベルを22以下にしています。
ユーザーをマルウェアから守るために、[Google Play Protect](https://www.android.com/play-protect/)は最近のAPI レベルをターゲットにしていないAPKをインストールしようとする場合に警告を行います：

- **2019年8月:** ターゲットAPIレベルが25以下の新規アプリのインストール時に警告を受けます
- **2019年11月:** 既存アプリのアップデート時にアップデートするAPKのターゲットAPIレベルが25以下の場合は警告を受けます
- **2020年以降:** 要求されるターゲットAPIレベルが年毎に上がります

これらの警告は、端末のAPIレベルよりアプリの [targetSdkVersion](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#target) が低い場合のみ表示されます。
例えば、端末がAndroid 6.0 (Marshmallow)の場合は、ターゲットAPIレベルが22以下のアプリをインストールしようとした時に警告が表示されます。
端末がAndroid 8.0 (Oreo)以上の場合は、ターゲットAPIレベルが25以下のアプリをインストールしようとした時に警告が表示されます。


2019年8月に先駆け、Play ProtectはPlay Store以外でアプリを配布する開発者の為に、開発者オプションで設定すればこれらの警告を端末で表示し始めます。
全てのAndroidバージョンとの互換性を保つ為に、開発者はいかなるアプリもターゲットAPIレベルを26以上にするべきです。
brewでインストールしたapacheの起動とか設定ファイルとか

macにはじめから入ってるapache2でdjangoと連携させようと思ったら署名がどうのこうのでモジュールが読み込めなかったのでbrewでapacheをインストールしたのです。

## インストール

`brew install httpd`


## 起動・停止・再起動

`brew services start httpd`
`brew services stop httpd`
`brew services restart httpd`

なんとなく入れてみたらそのとおりに動いてくれました。


## 設定ファイル

`/usr/local/etc/httpd/httpd.conf`

`/usr/local/etc/httpd/extra/httpd-ssl.conf`

ちなみにデフォルトだと
8080（http）
と
8443(https)

でリッスンしているので必要に応じて上記ファイルを編集します。



## 標準で入ってるapacheを無効化させる

https://weblabo.oscasierra.net/apache-macos-install-homebrew/

↑を参照で。
3分で覚え直す$_SESSIONの使い方まとめ [PHP]

##セッションとは
セッションは、Webサイトにアクセスして行う一連の流れのことです。サイトを訪れたユーザデータを個別に管理できます。
簡単に言うと、サーバー側に情報を保存できる仕組みです。
###$_SESSION(セッション変数)とは
`$_SESSION`とは、PHPのスーパーグローバル変数の1つであり、現在のセッションに登録されている値の変数です。また、連想配列として使用します。
###セッション管理の開始
まず、`session_start`関数を使用してセッションをスタートします。すでにスタートされていれば、既存のセッションを再開します。

```php:session_start.php
<?php
    session_start();
?>
```

###セッション情報の保存・取得
セッション情報は`$_SESSION`に連想配列として保存されます。保存の仕方としては、`$_SESSION['キー'] = 値`とします。
また、`変数 = $_SESSION['キー']`とするとセッション情報を取得できます。

```php:session_start.php
<?php
    session_start();
    // セッション情報の保存
    $_SESSION['name'] = 'sorya';
    // セッション情報の取得
    $name = $_SESSION['name'];
?>
```

一度セッションに保存されれば`$_SESSION['name']`は他のページでも取得可能です。

```php:session_get.php
<?php
    session_start();
    // セッション情報の取得
    $name = $_SESSION['name'];
    echo $name;
    // sorya
?>
```

###セッションの削除
キーで指定して一つずつ削除したい場合は、`unset()`関数を使用します。
全てのセッションを削除したい場合は、`$_SESSION`を空配列にします。

```php:session_delete.php
<?php
    session_start();
    $_SESSION['id'] = 3;
    $_SESSION['name'] = 'Yuki';
    $_SESSION['year'] = 2019;
    unset($_SESSION['name']);
    var_dump($_SESSION);
    // array(2) { ["id"]=> int(3) ["year"]=> int(2019) }
    $_SESSION = array();
    var_dump($_SESSION);
    // array(0) { }
?>
```

###細かなセッション情報の取得
`session_id()`は現在のセッションID、`session_name()`は現在のセッション名を返します。

```php:session_information.php
<?php
    session_start();
    echo session_id();
    //  a816aebf3b02a9a3425418a3c3da410e57
    echo session_name();
    // PHPSESSID
?>
```

###セッションの有効期限を設定
セッションには、有効期限が存在し、それを過ぎると保持されていた情報は削除されます。デフォルトではプラウザが閉じるまで有効となっています。
`session_start`関数のオプションで有効期限を設定することができます。また、この時の有効期限は秒数で指定します。

```php:session_config.php
<?php
    // セッションの有効期限を100秒に設定
    session_start([
        'cookie_lifetime' => $100,
    ]);
?>
```
また、`ini_set`関数で`session.gc_maxlifetime`を変更することでもセッションの有効期限を設定することができます。この場合、`ini_set`関数の第1引数に`session.gc_maxlifetime`を、第2引数に秒数を指定します。

```php:session_con.php
<?php
    session_start();
    // セッションの有効期限を60秒に設定
    ini_set('session.gc_maxlifetime', 60);
?>
```

###セッションを終了する
セッションを終了するには、`$_SESSION`変数を空配列にするか、`session_destroy`関数を用いる方法があります。

```php:session_end.php
<?php
    session_start();
    $_SESSION['name'] = 'sorya';
    // セッションを終了する
    session_destory();
?>
```

>[参考]
・PHP sessionざっくり理解したい
https://qiita.com/dokkoisho/items/b790a2f4ba13e1e9b07a

>[よければこちらもどうぞ(内容は一緒)]
http://otter3.php.xdomain.jp/sharealgo/post/PHP/content51.php
プログラミングをしていて出てきた英語をどんどんまとめていく

# Git(Github)
**・failed to push some refs to...**
いくつかの関連するものを...にプッシュできませんでした

**・Install missing gem executables with `bundle install`
足りないgem実行ファイルを `bundle install`でインストールしてください。

**・aborted!**
中止された！

**・failure**
読み方は「フェイリアー」
失敗

**・resolution**
解決

**・stdout**
読み方は「シッドァゥト」
標準出力

**・**
**・**
**・**
**・**
imagemin-pngquant@7.0.0からoptionの書き方が変わってるから注意

[imagemin-pngquant](https://www.npmjs.com/package/imagemin-pngquant)v7.0.0からoptionの書き方が変わったので注意です。
v7.0.0にアプデした上でv6.0.1までの書き方をすると `ArgumentError: Expected argument to be of type 'array' but received type 'string'` というエラーが出ます。

```js:imagemin-pngquant@6.0.1までの書き方
pngquant({
    quality: '70-85',
  })
```

```js:imagemin-pngquant@7.0.0以降の書き方
pngquant({
    quality: [.7, .85],
  })
```

上記のように配列にした上で、最小値0から最大値1の範囲を小数点を使って表しましょう。
ransackでヒット０件の時には検索結果に何も表示させない方法

#通常の検索結果
<img width="1340" alt="スクリーンショット 2019-02-22 17.09.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/332184/42220048-4c62-7f9d-864f-36143db8a43a.png">
全データの中から、検索ワードにヒットしたものだけが表示される。

もしヒットがない場合、全データが表示される。
（上記でいうと渋谷も含め六本木でも川崎でも出てくる）

**・・・なぜ?**

(どうもransackを使う際、controller側で記載する`.result`(検索を行うメソッド)の仕様上こうなっている模様。)

#やりたいこと
<img width="1358" alt="スクリーンショット 2019-02-22 16.49.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/332184/bb0e1c08-77c0-9035-c598-600a5cb9a259.png">


ヒット０件の場合、検索結果に何も表示させない。

#やり方
ransackの使い方は色々とわかりやすい記事があるので
そちらで確認してください。ここでは省略します。

```controller.rb
def hoge
@search = Post.ransack(params[:q])#[:q]の中身(検索範囲)の記述は省略します。
@result = @search.result(distinct: true)
@check = params[:q]
```
controller側に上記のように記述されているとして、（必要に応じて以下変更要）

-`hoge`→検索結果を出すページのアクション
-`Post`→検索したいモデル
-`@search`→検索内容をいれたローカル変数
-`@result`→検索結果をいれたローカル変数
-`@check`→検索範囲をいれたローカル変数

```検索結果表示画面.html
<% if @check.present? %><!--　ここが重要　-->

      <% @result.each do |result| %>
　　　　<!--　中略　-->
      <% end %>

<% else %><!--　ここが重要　-->
<% end %><!--　ここが重要　-->
```
上記のように、通常の検索結果表示のための記述を
`<% if @check.present? %>`と`<% else %>`で挟みます。
ここまでで、**もし検索条件には当てはまるものがあれば表示**となり、
続く`<% else %><% end %>`により、**当てはまらなければ何も表示しない**となります。

これだけ！

#参考ページ
`.present?`のあたりの使い方については、こちらが参考になります。
https://qiita.com/somewhatgood@github/items/b74107480ee3821784e6