OmniAICreator/Qiita-1.07M huggingface dataset:
MacでChromeをキャプチャしてCanvasの映像をMadMapperに送る

# 背景
p5.jsで描いたアニメーションをMadMapperに送ってプロジェクションしたい！プロジェクションのためにProcessingに書き直すのがめんどくさい！
だったら画面キャプチャしてキャプチャした映像をMadMapperに送れば良いのでは…？

# 概要
Chromeの画面にp5.jsのアニメーションを表示 -> NDIでキャプチャ -> MadMapperで受信してプロジェクション…という構成
プロジェクションマッピングソフトやVJソフトにCanvasの映像を送りたい時に使えるかも？

## 実験環境
* macOS 10.13
* Chrome 75.0
    * p5.js
* NDI Tools 3.8
    * NDI Scan Converter
* MadMapper Demo 3.6

## NDIとは
[【Blog】 NewTek NDI ツール 3.6 「ライブプロダクションの可能性は無限大！」 @ ishicaw / motionworks](https://motionworks.jp/blog/18059) より引用

> NDI (ネットワークデバイスインターフェイス) は、NewTek社によって開発された、ライブビデオをネットワーク上で配信するためのIPビデオプロトコルです。イーサネットなどのローカルエリアネットワーク環境で放送品質のビデオを送受信することができるようになります。

# 手法
## Chrome -> NDI
下記からMac用のNDIツールをダウンロード、インストール
[NewTek NDI Tools](https://www.newtek.com/ndi/tools/)

Chromeで映像として送りたいページを開き、NDI Scan Converterを起動
File > Google Chrome を選択し、映像を送りたいウィンドウを指定
<img width="759" alt="スクリーンショット 2019-07-08 15.46.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67311/4115a0b4-62b5-fe76-14a1-f7d40bc09032.png">

NDI Video Monitorを起動し、 File > hogehoge.LOCAL > Scan Converterを選択すると送信中の映像が確認できる

Chromeのツールバーも映像として含んでしまうので全画面表示の状態で送信したくなるが、NDI Scan ConverterにChromeが認識されなくなったり、Chrome以外のアプリケーションがアクティブだとCanvasのアニメーションが停止したりと色々問題があったのでウィンドウ表示で送ることに…

## NDI -> MadMapper
MadMapperを起動し、Live Inputの欄からScan Converterを選択してChromeのウィンドウを受信
MadMapper上でChromeのコンテンツだけを表示するように(=ツールバーを表示しないように)表示範囲を調整
<img width="1164" alt="qi.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67311/12d1f29d-2271-23b8-118c-aa3b06dab7ba.png">

## Syphonの利用
MadMapperはNDI Scan Converterから直接受信できたが、それ以外のアプリケーションで映像のやり取りのためにSyphonを使いたい場合、下記のソフトが使えそう
[NDISyphon \| VDMX Documentation](https://docs.vidvox.net/freebies_ndi_syphon.html)

NDI Scan Converterを設定後、NDISyphonを起動し上部のNDI -> SyphonのNDI Clients欄からhogehoge.LOCALを選択して「Enabled?」にチェックするとSyphonで送信される
<img width="828" alt="qi2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67311/4aa42dd0-c6d4-4c9c-fa26-dd23b4066912.png">

# 雑感
* NDI Scan ConverterはChromeだけでなく色々なアプリケーションの画面が送れるため、ゲーム画面のプロジェクションなど幅広く応用できそう(試してみたらSlackやFinderの画面ですら送信できた)
* Canvasのアニメーションの動作速度はやや落ちたが、PCのスペックにも依存しそう？
* Windowsでも同じようにできないか調査中…

# 参考URL
[Topic: gameplay to spot \| Spout](http://spout.zeal.co/forums/topic/gameplay-to-spot/)
RSCSSを使用した感想と課題

#概要
RSCSSは合理的なCSS設計のためのアイデア集です。
スッキリしていて良さそうな印象だったので、サイト制作に取り入れてみました。
その時の感想と課題を書きます。

#RSCSSについて
簡単に以下のような特徴があります。

- Components で組み立てる。Components は ` - ` で区切った２ワード。（例： .like-button）
- Components の内部要素は Elements。Elements は１ワード。（例： .field）
- Components も Elements も variants を持てる。variantsは ` - ` ではじめる。（例： .-large）
- Components はネストできる。
- Layout に関するスタイルは親 Components で指定する。

詳細は公式サイトで確認してください。
https://rscss.io/index.html
https://qiita.com/kk6/items/760efba180ec526903db


#感想
良いところ

- 組み立てるのがかんたん。Elementsに簡単なワードを使えるのが良い。
- Componentsごとにscssファイルを分けるの良い。ただし、globは必須。
- Componentsの命名規則は２ワード、Elementsは１ワードって分け方がよい。
- Variantsの命名が気に入った。（.-large）

残念なところ

- キーセレクタが汎用的なワードになるのでパフォーマンス的にすこし心配。
- scssでの過剰なネストを避けるのは賛成だが、結果、子セレクタ（>）が連なって分かりにくくなる。それを防ぐためには、細かくComponentsを分ける必要がある。
- レイアウトに関するスタイルを親のComponentsからの指定に徹底するのが大変。
- ネストしたComponentsの複雑さをsassのextendで解決するのは反対。後から情報を追うのが面倒になる。
- Componentsの命名規則とファイルのフォルダ構成に課題あり。（プロジェクト内でルール化が必要）



#設計のアイデア
RSCSSの改善案ではなく、RSCSSを取り入れ、これからどんなCSS設計を採用するかについてのアイデアです。


##子セレクタ問題
デザインの複雑性に対応するためにはネストを深くするか子セレクタ（>）を連ねることになり、パフォーマンス的にも読解的にも良いとは言えません。細かくComponentsを分けると管理が煩雑になることがあるので、ElementsをComponentsの子クラスではなく、BEM的に書いた方がよいと思いました。
個々のComponentsごとに１つのscssファイルにまとめる管理方法は賛成です。

```scss
/* ✗ Avoid: 3 levels of nesting */
.image-frame {
  > .description {
    /* ... */
    > .icon {
      /* ... */
    }
  }
}

/* ✓ Better: 2 levels */
.image-frame {
  > .description { /* ... */ }
  > .description > .icon { /* ... */ }
}

/* My Best */
.image-frame_description { /* ... */ }
.image-frame_icon { /* ... */ }
```

##状態変化
RSCSSのVariantsはそのままつかうが、Helpersは使用しません。便利かもしれないけど、複雑化するためです。

```scss
// Variants
.component-name {
  &.-large {...}
}
// Helpers
._center { text-align: center !important; }　//NG
```

##レイアウト
レイアウト関連のスタイルは親からの指定を「推奨」にします。画面上部に固定するコンポーネントなどを考慮するためです。
記述の場合は、親ではなく子の中で指定するようにします。依存関係がまとまり、コンポーネントを削除しやすくなります。これは、ECSSから得たアイデアです。

```scss
.child-component {
  .parent-component > & {
    position: absolute;
    left: 1em;
    top: 1em;
  }
}
```

#まとめ
課題が残るが、良いアイデアを得ることができました。
結局のところ、どこまで変化を許容して設計するかだと思います。
いろんな場所で便利に使えるclassは変化に弱く、個々のUIパーツごとに完結させると、変化に強いがコードが多くなります。

中規模以上だったり、運用期間がある場合は、個々のUIパーツごとに完結させる方が良いというのが、今現在の結論です。その上で、開発しやすい設計を考えていこうと思います。

#更新履歴
（2019/07/23）子孫セレクタをたくさんつかっても対してパフォーマンスが落ちないそうなので、記事内容を更新しました。
https://twitter.com/clockmaker/status/1153314178754420738
My jupyter notebook installation manual

# Jupyter notebookを使いやすくする

## 前提条件

- CentOS7
- python3(python3.4でも3.6でもどちらでも良い）

## Install & make initial script

```bash
# pip3 install jupyter
# cat >  /etc/systemd/system/jupyter.service << EOF
[Unit]
Description=jupyterlab

[install]
WantedBy=multi-user.target

[Service]
ExecStart=/bin/jupyter notebook --ip=0.0.0.0 --allow-root
Restart=always
EOF
```

最近は、jupyterを入れるだけでjupyterlabが使えるようなのでこれで良い。
rootで起動できるのはいかがかと思うが個人環境なので適当に。

## Install RISE 

```bash
# pip3 install RISE
# jupyter-nbextension install rise --py --sys-prefix
# jupyter-nbextension enable rise --py --sys-prefix
```

残念ながらjupyterlabでRISEを実行してええ具合にスライド化するのはまだのようだけど入れておく

### Install bash kernerl

```bash
# pip3 install bash_kernel
jupyter qtconsole --kernel bash
jupyter console --kernel bash
```

・・・のはずなんだけどX周りのエラーらしき物が出てるので後で考える。
HTMLの基本～コメントアウト、リンクなど

#HTMLの基本
コピペして使ってください。
HTMLの基本構造、コメント、リンク、画像、リストを記載。

###基本構造

```html:sample.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Title</title>
    <link rel="stylesheet" href="stylesheet.css">
  </head>
  <body>
    <header></header>
      <div class="top-wrapper"></div>
      <div class="middle-wrapper"></div>
      <div class="bottom-wrapper"></div>
    <footer></footer>
  </body>
  </body>
</html>
```

###コメント、リンク、画像、リスト

```html:sample.html

<!--コメント-->

<!--リンク-->
<a href="URL"></a>

<!--画像-->
<img src="URL">

<!--リスト-->
<ul>
  <li></li>
  <li></li>
  <li></li>
</ul>

```
matplotlibメモ

```Python:plt.py
import matplotlib.pyplot as plt

#何も描画されていない新しいウィンドウを描画
plt.figure()
#画像を表示
plt.imshow(train_images[0])
#よくわからん
plt.gca().grid(False)
plt.show()
```

```python:plt.py
import matplotlib.pyplot as plt

#幅と高さを指定
plt.figure(figsize=(10,10))
for i in range(25):
#グリッド上に図を配置（行数、列数、プロット番号）
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
#cmで色を指定
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])
plt.show()
```
```python:plt.py
import matplotlib.pyplot as plt

# "bo" は青いドット
plt.plot(epochs, loss, 'bo', label='Training loss')
# ”b" は青い実線
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
#凡例の位置を調整する。詳しくは下記のURL
plt.legend()

plt.show()
```
https://qiita.com/matsui-k20xx/items/291400ed56a39ed63462
JFreeChart-積上棒グラフ-DefaultCategoryDataset


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

/**
■ JFreeChart-積上棒グラフ-DefaultCategoryDataset
・複数の商品売上の合計を表示するようなものに使用される.
・StackedBarRendererを使用すると同一ColumnKeyのデータが積み上げられる.

 */
public class Chart08_00 {
  // 目次-積上げバーチャート(StackedBarChart)
  A_Chart08 a_Chart08;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    // 表示データの作成
    DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
    {
      //
      dataSet.addValue(136.5,"商品A","2014");
      dataSet.addValue(206.1,"商品A","2015");
      dataSet.addValue(296.7,"商品A","2016");
      //
      dataSet.addValue( 40.5,"商品B","2014");
      dataSet.addValue(105.7,"商品B","2015");
      dataSet.addValue(199.4,"商品B","2016");
      //
      dataSet.addValue(150.5,"商品C","2014");
      dataSet.addValue(87.5,"商品C","2015");
      dataSet.addValue(40.0,"商品C","2016");
    }
    //
    CategoryAxis catAxis = new CategoryAxis();
    NumberAxis numAxis = new NumberAxis();
    // 積上棒グラフにはStackedBarRendererを使用する
    StackedBarRenderer renderer = new StackedBarRenderer();
    CategoryPlot catPlot = new CategoryPlot(dataSet,catAxis,numAxis,(CategoryItemRenderer)renderer); // (1)
    JFreeChart jfreeChart = new JFreeChart("売上構成の変化",(Plot)catPlot);
    //
    ChartFrame cFrame = new ChartFrame("売上構成の変化",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
}

```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/cd258372-4487-0d5e-51f8-ba38ae657be3.png)
wemosでeigen その２

#概要

wemosでeigenやってみた。
ニューラルネットワークでxor学習してみた。

#結果

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d90f095b-29a5-3374-8a5a-c4aa7952d5f2.png)



#参考にしたページ

http://wildpie.hatenablog.com/entry/20110813/1313231659


#サンプルコード


```
#include <vector>
#include <Eigen.h>
#include <Eigen/LU>
#include <Eigen/Dense>
#include <math.h>

using namespace Eigen;
void print_m(const Eigen::MatrixXd &X)
{
	int i,
		j,
		nrow,
		ncol;
	nrow = X.rows();
	ncol = X.cols();
	Serial.print("nrow: ");
	Serial.println(nrow);
	Serial.print("ncol: ");
	Serial.println(ncol);
	for (i = 0; i < nrow; i++)
	{
		for (j = 0; j < ncol; j++)
		{
			Serial.print(X(i, j), 6);
			Serial.print(", ");
		}
		Serial.println();
	}
}
/*
auto lambda_act = [](const double x) { 
	return 1.7159 * tanh(0.6667 * x); 
};
auto lambda_act_p = [](const double x) { 
	return 1.7159 * 0.6667 * (1.0 - 1.0 / (1.7159 * 1.7159) * x * x); 
};

auto lambda_act = [](const double x) { 
	return tanh(x); 
};
auto lambda_act_p = [](const double x) { 
	return 1.0 - x * x; 
};
*/
auto lambda_act = [](const double x) { 
	return 1.0 / (1 + exp(-x)); 
};
auto lambda_act_p = [](const double x) { 
	return x * (1.0 - x); 
};
const int kNumInput = 2;
const int kNumHidden = 8;
const int kNumOutput = 1;
const double kEta = 0.3;
void Softmax(VectorXd &in)
{
	VectorXd vec_exp = in.array().exp();
	const double sum_exp = vec_exp.sum();
	in = vec_exp.array() / sum_exp;
}
void learn(const VectorXd &in, const VectorXd &tk, MatrixXd &w0, MatrixXd &w1)
{
	VectorXd xi(1 + kNumInput);
	xi(0) = 1.0;
	xi.tail(kNumInput) = in;
	VectorXd aj = w0 * xi;
	VectorXd zj(1 + kNumHidden);
	zj(0) = 1.0;
	zj.tail(kNumHidden) = aj.unaryExpr(lambda_act);
	VectorXd yk = w1 * zj;
	//Softmax(yk);
	VectorXd delta_k = yk - tk;
	VectorXd delta_j = w1.transpose() * delta_k;
	delta_j = delta_j.array() * zj.unaryExpr(lambda_act_p).array();
	w1.array() -= kEta * (delta_k * zj.transpose()).array();
	w0.array() -= kEta * (delta_j.tail(kNumHidden) * xi.transpose()).array();
}
VectorXd feedFoward(const VectorXd &in, const MatrixXd &w0, const MatrixXd &w1)
{
	VectorXd xi(1 + kNumInput);
	xi(0) = 1.0;
	xi.tail(kNumInput) = in;
	VectorXd aj = w0 * xi;
	VectorXd zj(1 + kNumHidden);
	zj(0) = 1.0;
	zj.tail(kNumHidden) = aj.unaryExpr(lambda_act);
	VectorXd yk = w1 * zj;
	//Softmax(yk);
	return yk;
}
void setup()
{
	Serial.begin(9600);
	Serial.println("ok0");
	VectorXd x[4];
	for (int i = 0; i < 4; ++i)
	{
		x[i] = VectorXd::Zero(2);
	}
	x[0] << 0.0, 0.0;
	x[1] << 0.0, 1.0;
	x[2] << 1.0, 0.0;
	x[3] << 1.0, 1.0;
	VectorXd t[4];
	for (int i = 0; i < 4; ++i)
	{
		t[i] = VectorXd::Zero(1);
	}
	t[0] << 0.0;
	t[1] << 1.0;
	t[2] << 1.0;
	t[3] << 0.0;
	MatrixXd w0 = MatrixXd::Random(kNumHidden, 1 + kNumInput);
	MatrixXd w1 = MatrixXd::Random(kNumOutput, 1 + kNumHidden);
	Serial.println("ok0");
	for (int n = 0; n < 1000; ++n)
	{
		for (int i = 0; i < 4; ++i)
		{
			learn(x[i], t[i], w0, w1);
			delay(10);
		}
		Serial.println(n);
	}
	for (int i = 0; i < 4; ++i)
	{
		print_m(feedFoward(x[i], w0, w1));
	}
}
void loop()
{
	delay(300);
}


```

以上。
TypeScript: デコレーターで実行時もイミュータブルなクラスを実現する

TypeScriptでは、イミュータブルなクラスを作りたいときに、クラスプロパティに`readonly`をつけることで、読み取り専用のプロパティを定義できる。`readonly`なプロパティに値を再代入しようとすると、コンパイルエラーになる。

TypeScriptコードはコンパイルされるとJavaScriptコードになるが、そのときには`readonly`の情報は削除される。したがって、もともと`readonly`だったクラスプロパティは、JavaScriptコードになったときには上書き可能なプロパティになってしまう。

TypeScriptだけでソースコードを固められる場合は、`readonly`つまりコンパイル時のイミュータビリティチェックだけで十分だと思う。一方で、TypeScriptで書いたクラスをJavaScriptライブラリとして提供し、かつ、そのクラスが誰に使われるか分からないような場合には、実行時もイミュータブルなクラスになっていないと不安が残る。

本稿では、デコレーターを使った、実行時イミュータブルなクラスの実現方法を紹介する。

## 実行時イミュータブルにするデコレータの定義

```ts
function immutable(constructor: any): any {
  const wrapper = function () {
    const instance = new constructor(...arguments)
    Object.freeze(instance)
    return instance
  }
  wrapper.prototype = Object.create(constructor.prototype)
  return wrapper
}
```

このデコレーター関数は、クラスコンストラクタを引数に受け取り、それを継承したプロキシコンストラクタを返すようになっている。
プロキシコンストラクタの中身は特に変わったことはしてなく、親コンストラクタが作ったインスタンスに`Object.freeze`をかけているだけだ。

## デコレータの使い方

```ts
@immutable
class Sample {
  constructor(public readonly foo: number) {
  }
}
```

クラス定義に`@immutable`と書くだけ。

## 本当に実行時イミュータブルになっているかの確認


```ts
import assert = require('assert')

const sample = new Sample(0)

assert.strictEqual(sample.foo, 0)
assert.throws(
  () => eval(`sample.foo = 1`),
  /^TypeError: Cannot assign to read only property 'foo' of object '#<Sample>'$/
)
assert.strictEqual(sample.foo, 0)
```
redis-cliの接続時によく使うコマンド使い方メモ

# redis-cliの接続時によく使うコマンド使い方メモ

## redis起動
redisが起動していない時の起動方法
```sudo redis-server /etc/redis.conf```

## redisへの接続方法
```redis-cli -c -p 6379 -h {hostname}```

ローカル環境の場合は以下

```redis-cli -c -p 6379 -h 127.0.0.1```

-cはクラスタモードで接続する場合

## データベースの指定
Redisはデフォルトで16個のデータベースがあり、
それぞれ0～15のindexが割り当てられている。

``` SELECT ```で使用するDBを指定できる

mysqlでいうところの``` use {schema名}```のようなDB指定のイメージ

```SELECT {index}```

### データベース数の確認

```config get databases```で現在のデータベース数を確認できる

~~~
127.0.0.1:6379> config get databases
1) "databases"
2) "16"
~~~~

次回はDBの中身確認コマンドメモにします。
複数のGLM, GLMMの係数とAICを、csvファイルに一気に出力する

## コードの記述

野外の生物調査では、しばしば種ごとの個体数をカウントするような場面があります。
例えば、鳥類の調査では"ラインセンサス法"がしばしば用いられます。
この調査では調査ルートを歩きながら、出現した鳥類の個体数を種ごとに記録していきます。

出現した種の個体数が、どのような環境要因の影響を受けているか、
を解析する際には一般化線形モデルや一般化線形混合モデルが用いられます。
しかし、種ごとにコードを書いていくのはめんどうです。

全ての種に対して、
共通のモデル
「応答変数(e.g., 各種の個体数)　～　説明変数1(e.g., 土地利用割合) + 説明変数2(e.g., 景観割合)」
により解析したい場合にforループを使って一気に解析し、種ごとにcsvファイルに出力してくれるコードを書いてみました。

ただし、出現個体数の少ない種が多く含まれる場合などは、モデルが収束せず、ループが途中で止まってしまうので、あまり効率よくはありません。
そのような場合は、種を絞って解析するとよいと思います。

コードが汚いですし、もっと効率化できる気がします。
もっときれいなコードを発見できたら更新するかもしれません。

```


setwd("c:/Users/~~~")                                            #ディレクトリの指定
allt <- read.csv("~~~.csv", header=T)                            #csvファイルの読み込み

x <- allt[,c(11:61)]                                             #csvファイルから応答変数(e.g., 種ごとに整理した個体数)のみ抽出
value <- 1:51                                                 　 #ループする応答変数の個数を指定
for(y in value){　　　　　　　　　　　　　　　　　　             　 #forループの宣言
	ff <- formula(paste(names(x[y]), 　　                    　　#paste関数を用いてglmの式を指定、応答変数を列数で指定
	      paste("~ 説明変数1 + 説明変数2",sep=""), sep="")) 　　　#説明変数は列名で指定
fmla <- glm(ff, data=allt, family=poisson)                    　 #上で指定したオブジェクトffを用いてGLM
        assign(paste("res",y,sep=""),fmla)    　                 #assign関数を用いてデータフレーム"res1"-"res51"を作成
fmlb <- summary(fmla)$coefficient　　　　　　　　　　　　　　　　　 #GLMの係数だけ抽出
        assign(paste("s.ans",y,sep=""),fmlb)　　　　　　　　　　   #上で抽出した係数を"s.ans1"-"s.ans51"として格納
fmlc <- AIC(fmla)                                                #モデルのAICを計算
        assign(paste("aic",y,sep=""),fmlc)


mm <- formula(paste(names(x[y]), 　　                   　　　　　#以下からGLMMの解析
	      paste("~ 説明変数1 + 説明変数2 + (1|ランダム切片)"
                     ,sep=""), sep=""))　	    　                    
m1 <- glmer(mm, data=allt, family=poisson)                    
      assign(paste("res",y,sep=""),m1)                        
m2 <- summary(m1)$coefficient 
      assign(paste("s.ans",y,sep=""),m2)
m3 <- AIC(m1)
        assign(paste("aic",y,sep=""),m3)

fmld <- cbind(fmlb,fmlc,m2,m3)
        assign(paste("result",y,sep=""),fmld) 
write.table(fmld,paste("フォルダ名/ファイル名",y,".csv",sep=""),      　#結果をcsv出力
	append=T,quote=F,sep=",",row.names=T,col.names=T)
}

```
期間リターンの算出 with sqlalchemy

初めてのテスト投稿なので、生暖かい目でお見守りください。

ある時点からある時点の株価リターンをSQLで算出します。
すでに分割考慮後の株価テーブルを持っている前提です。

株価が入ったテーブルを用意します。
構成は日付=ddate、証券コード= tick、終値 = close

```python
class stock_price(Base):
    ddate   = Column(Date(), primary_key=True, index=True)
    tick    = Column(Integer(), primary_key=True, index=True)
    open    = Column(Float())
    high    = Column(Float())
    low     = Column(Float())
    close   = Column(Float())
    volume  = Column(Integer())
    raw     = Column(Float())
```

sqlalchemyでエンジンとセッションとを生成します。

```python
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import psycopg2
db = "postgresql+psycopg2://{user}:{pass}@{host}:{port}/{db}"
engine = create_engine(db)

session_ = sessionmaker(bind=engine)
session = session_()

```

自己結合対策をします。

```python
prc = stock_price
import sqlalchemy.orm as orm
e_prc = orm.aliased(prc, name="e_prc")
s_prc = orm.aliased(prc, name="s_prc")
```

クエリを作成します。

```python
import datetime as dt
e_day = dt.date(2019, 7 ,1)
s_day = dt.date(2019, 7 ,5)

e_price = e_prc.close
s_price = s_prc.close
dur_chg = ((e_price / s_price) - 1) * 100
query = session.query(
                e_prc.tick,
                dur_chg.label('dur_chg'),
                ) \
    .join(s_prc, s_prc.tick == e_prc.tick) \
    .filter(e_prc.ddate == e_day) \
    .filter(s_prc.ddate == s_day) \
    .order_by(dur_chg)
```

pandasのdataframeに格納します
```python
import pandas as pd
df = pd.read_sql(query.statement, engine)
print(df)
```

終わりのお作法
```python
session.close()
engine.dispose()
```


初めてやってみたのですが、自作の関数をほどかなければならなくて、
少し時間がかかりました。
また、環境違うのでミスがあるかもしれないのはご容赦ください。
method_sourceってgemを読んだら知恵が詰まってた。

## method_source is 何？
### minimum sample
```
require 'method_source'

def my_important_method
  # do nothing, just sleep
  sleep 4 
  'successfuly done with my hard work!!'
end

method = method(:my_important_method)
method.source.display
```

すると。。。

```
def my_important_method
  # do nothing, just sleep
  sleep 4 
  'successfuly done with my hard work!!'
end
```

メソッドの定義がプリントされる。

## どんな実装か

Method objectからは定義もとのfile, lineが取れる。
そのファイルを全部読み込み、line以下を全て取ってくる

```
lines = File.readlines(file)
lines = lines[(line - 1)..-1]
```

linesをイテレートして、methodの定義が終わるところを判定する。

```
lines.each do |v|
  code << v
  return code if complete_expression?(block ? block.call(code) : code)
end
```

これでmethod定義が抜き出せたので、あとは表示するだけ


## 知恵
rescueされるerrorを判別するだけのmodule

```
def hoge
  rescue MyModule
end

module MyModule
  def self.===(error)
    some_condition(error)
  end
end
```

evalを使ってstrの構文をチェックだけして、BEGIN throwで実行させずに戻る

```
catch(:valid) do
  eval("BEGIN{throw :valid}\n#{str}")
end
```
どうゆう仕組みか？
strが構文としておかしいとSyntaxErrorが出て throwされない。
strが構文としてokだったらそのstr実行前に BEGIN で登録された throwが走る。

### 所感
まず `BEGIN` とか知らなかった。
この3行でこれだけのこと詰め込めるrubyはスマートで好き。
awscliのprofile名をすべて取得する方法


# profile名だけ取得する

複数の環境を使っている人向け。

このコマンドでdefault以外のprofile名が取得できる。

```shell
$(cat ~/.aws/config | grep \\\[profile | sed -e "s/\[profile //g" -e "s/]//g")
```

profile名つけないでコマンド叩いちゃったときが怖いので、自分はdefaultのcredentialsは

```text
[default]
aws_access_key_id = xxxxxxxxxx
aws_secret_access_key = xxxxxxxxx
```
という感じで無効化しているので、defaultはあえて取得していない。

# 応用

こんな感じにシェルスクリプトを書くとすべての環境に一括でなんやかんやできる。

```shell

#!/bin/bash
profiles=($(cat ~/.aws/config | grep \\\[profile | sed -e "s/\[profile //g" -e "s/]//g"))

for profile in ${profiles[@]}; do
    export AWS_PROFILE=$profile
    #ここにaws-cliコマンドを書く
done
```
wemosでeigen

#概要

wemosでeigenやってみた。
行列で九九やってみた。

#結果


![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3574bae1-7484-f483-4157-4261c6769ebc.png)

#サンプルコード


```
#include <vector>
#include <Eigen.h>
#include <Eigen/LU>
#include <Eigen/Dense>

using namespace Eigen;
void print_m(const Eigen::MatrixXd &X)
{
	int i,
		j,
		nrow,
		ncol;
	nrow = X.rows();
	ncol = X.cols();
	Serial.print("nrow: ");
	Serial.println(nrow);
	Serial.print("ncol: ");
	Serial.println(ncol);
	for (i = 0; i < nrow; i++)
	{
		for (j = 0; j < ncol; j++)
		{
			Serial.print(X(i, j), 6);
			Serial.print(", ");
		}
		Serial.println();
	}
}
void setup()
{
	MatrixXd a;
	MatrixXd b;
	MatrixXd c;
	Serial.begin(9600);
	a = MatrixXd(9, 1);
	a << 1, 2, 3, 4, 5, 6, 7, 8, 9;
	print_m(a);
	b = MatrixXd(1, 9);
	b << 1, 2, 3, 4, 5, 6, 7, 8, 9;
	print_m(b);
	c = a * b;
	print_m(c);
}
void loop()
{
	delay(300);
}

```

以上。
(覚書)IntelliJ Idea maven更新してもライブラリ系クラスでエラーが消えない時にやったこと

 IntelliJでmavenプロジェクトのソースの一部で使用していたライブラリ系クラスが存在しないエラーが発生した。
 1. mavenのreimport all maven Maven Projectを行なったが変化なし
 2. mavenがrepositoryディレクトリを削除し再度1を実行したが変化なし
 3. intelliJの[File]>Invalidate Cache/Restartを実行

で解決。
手動でintelliJのCacheディレクトリを消すとよいと書かれているページもあったが、
自分の場合プロジェクトがおかしくなってしまった。
3の実行でプロジェクトは元どおりになり、エラーも解消。

2020/03/20 追記
上記でもダメな事象発生。以下の手順を行なった。
1. 上記1-3を行う
1. maven-cleanを行う
1. maven-installを行う。

以上で解決。
plunkerでmath.js

#概要

plunkerでmath.jsやってみた。
行列で九九やってみた。

#結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a3581243-2a90-8f53-91c7-a0e4e37cc00f.png)

#サンプルコード

```
var a = math.matrix([[1, 2, 3, 4, 5, 6, 7, 8, 9]]);
var b = math.matrix([[1], [2], [3], [4], [5], [6], [7], [8], [9]]);
var c = math.multiply(b, a);
alert(c);
```

#成果物

https://embed.plnkr.co/ZxK62d7vi0uBXPPYDIOM/


以上。
xfc4-terminalでアンダーバーが表示されない時の対応方法

- 環境
    - CentOS Linux release 7.6.1810 (Core)
    - xfc4-terminal 0.8.7.4

デフォルトのフォントで半角アンダーバー(_)が表示されなかった・・・。

1. xfc4-terminalを起動する
1. [Edit] > [Preferences...] > [Appearance]タブ
1. 「[Use System font]にチェックを入れる」 or 「アンダーバーが表示されるフォントを選択する」
    1. [Ricty Diminishedフォントを設定する方法 - Qiita](https://qiita.com/ponsuke0531/items/db06599f92b234fbd062#xfc4-terminalcentos%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/3f5fff1f-9419-e8b9-b1f3-a762b4bd98d4.png)
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/1c9f0211-c117-3dea-7698-0721849885c9.png)
当日日付[yyyyMMdd形式]のフォルダを作成するVBS

vbsはShift_JISじゃなきゃ動かない
vscodeとか使ってると稀によくあるミス

なんでvbs？暇つぶしです。。。


```vb
Option Explicit
On Error Resume Next

Call Main()
Public Sub Main()
    
    Dim sh: Set sh = CreateObject("WScript.Shell")
    Dim DesktopPath: DeskTopPath = sh.SpecialFolders("Desktop")

    Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
    Dim FolderName: FolderName = yyyyMMdd(Now)
    Dim FolderPath: FolderPath = fso.BuildPath(DesktopPath, FolderName)
    
    If Not fso.FolderExists(FolderPath) Then
        fso.CreateFolder(FolderPath)
    End If
    
    If Err.Number <> 0 Then
    	MsgBox Err.Description
    End If

    Set sh = Nothing
    Set fso = Nothing
End Sub
Public Function yyyyMMdd(prmDate)
    yyyyMMdd = CStr(Year(prmDate)) & Right("0" & Month(prmDate), 2) & Right("0" & Day(prmDate), 2)
    Exit Function
End Function

```
Azure VMにziproxyしたらハマった話

#思い立ち
どこからでもアクセスできて、画像とかを圧縮できるZiproxyを立ち上げたかった
Azure for Studentがあるので、DebianのVMでやってみようと思った
※Azure超初心者です...

#構成図
- OS Debian 9系
- ソフトウェア ziproxy

#やり方
1. `apt-get install ziproxy`
2. `nano /etc/ziproxy/ziproxy.conf`
3. `#port 8080` → `port 1234`(お好きな数字で)
4. `sudo service ziproxy restart`
5. Windowsのプロキシの設定をする

そのあと、Azure PortalからNSGとかの設定をしたはずなのに、外部からつながらなかった...

#解決(していない...)
- NSG(ネットワーク セキュリティ グループ)には2種類あることが発覚
(受信ルールと送信ルール)
受信しか通してなかったので，送信も設定した → けどダメ
- VMの再起動しても治らなかった
知識ゼロから学ぶ ソフトウェアテスト(3章 ブラックボックステスト⑤ ランダムテスト,ブラックボックステストのまとめ)

知識整理のために投稿しています。
本は `知識ゼロから学ぶ ソフトウェアテスト[改訂版]`です。
テストってなかなか書けない。

## ランダムテスト

- アドホックテスト・アドリブテスト、モンキーテストなどと呼ばれる
- 全体の数10%のバグはランダムテストから見つかる
  - とはいえ荒っぽいやり方なのでオススメはできない
  - 氷山の一角でしかない

## まとめ

- 入力ダイアログボックスがあれば **境界値テスト**
- 複数の入力ダイアログボックスがあれば **ディシジョンテーブルテスト**
- ダイアログボックスの遷移があれば **状態遷移テスト**
- 全てのバグを発見できるテストは存在しない
  - 楽して(手法に則って)60%くらいのバグをさっさと見つけよう！
エクセルで、「見えないシングルクオート」を生成する方法

役に立つ場面が思い浮かびませんが、伝授します。
幽霊みたいなセルを作りましょう。

# 見えないシングルクオートとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408585/28f117aa-8229-d88e-209f-b56a2279f144.png)
B1セル、空白に見えます。上の数式バーにも何もありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408585/598c2189-2444-ed5a-2831-1bda0e21af37.png)
B1セルに対して、空白セルか確かめるISBLANK関数を当てると、「空白ではない」という意味の `FALSE` が表示されます。
実はここB1セル、何もないように見えて、シングルクオートが入っているのです。

（2019/7/10 追記）
B1セルに入っているのはシングルクオートではありませんでした。詳しくは記事の最後に。

# 見えないシングルクオートを作ろう

環境
以下2つの環境で動作することを確認しています。
- Microsoft Excel for Mac v16.16.10
- Excel 2013 (Windows)

1. シングルクオートを入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408585/363a7f3e-b6cb-de89-c75a-eef4a8fcaffe.png)


2. セルをコピーします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408585/9e231736-c2a9-626d-dc47-ca779e8d96d6.png)


3. 別のセルを選び、形式を選択してペーストをします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408585/7e6307e8-15aa-1dac-749c-6a3653a0b3f5.png)


4. 「数値」を選んでokします
（windowsなら「値」です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408585/4daf05df-ed20-728c-996b-be79bded3037.png)


5. 完成です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408585/cd2127a4-0d0c-83f5-d3c3-e797c6f880cf.png)


# いろいろ確認してみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408585/0a1c3a31-1c16-bd7d-fc1d-279b196faf4e.png)
`=A1=B1`してみましょう。どちらもシングルクオートなので、戻り値は `TRUE` になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408585/48eb75c5-bed1-549c-5f5b-3ac4499a844c.png)
空白でないセルをカウントするCOUNTA関数、結果は2になりました。どちらのセルにも文字列が入っていることになります。

# なぜ、見えないシングルクオートが作れるのか
わかりません。おそらくエクセルの仕様だと思いますが、一体なんのために…。
知ってる方、いたら教えてください。

（2019/7/10 追記）
コメントいただき解明いたしました。

A1セルにシングルクオートを入力したことにより、「空テキスト」が生成されました。
B1セルへは空テキストをコピーした、ということです。

`=A1=B1` がtrueになるのはどちらも空テキストが入っているからであり、
空テキストが入っている、ということは空セルではないので、ISBLANK関数ではfalseが返りました。

空セルと空テキスト、同じようで違う…ここを突っ込んでいくとエクセルの沼にハマりそうです。
調査・コメントしてくださったryo_ryo様、ありがとうございます。
javascript 便利メソッド[forEach,map,filter,find,every,some,reduce] 使い方について

##記事を書こうと思った経緯
**javascript**のスキルはwebのライブラリやフレームワークを扱う上で必須のスキルのため。
以前にjavascriptを学んだが、だいぶ時間がたってしまったので、最初から学びたいと思いました。

今回使用した教材
>Udemy JavaScriptエンジニアのためのES６完全ガイド　講師　Ken Fukuyamaさん

##ES6とは
ECMAScript(標準規格)の６番目のバージョンのこと。次世代javascript。ES6とES2015は同じもの。
*注意事項*
EC6は全てのブラウザで動くわけではないので、そのままでは動かないブラウザも多い。エラーになる場合も多い。そのため、Babelというツールを使ってES5のコードに変換してあげる必要がある。

##配列メソッド

|配列の便利メソッド一覧|
|:----------------|
|forEach|
|map|
|filter|
|find|
|every|
|some|
|reduce|

###forEach
```forEach.js
//数字の配列
var numbers = [1, 2, 3, 4, 5];
//合計を保持する変数
var sum = 0;
//配列の数字を合計に一つずつ足していく
numbers.forEach(function(number){
 sum += number;
});
sum;
//=> 15
```
###map (配列のある値を指定したい場合に使用する)
```map.js
配列の値を２倍にする処理

var numbers = [1, 2, 3, 4, 5];
//新しい配列を用意する
var doubledNumbers = [];
//数字を２倍にした値を配列に戻す
var doubled = numbers.map(function(number) {
 return bumber * 2;
});
doubled;
//=>[2,4,6,8,10]
//returnは必ずつける
```

###filter (データの一覧から必要な情報を選択して絞り込みたい場合に使用する)
```filter.js
var products = [
{ name: 'トマト', type: '野菜', quantity: 0, price: 6 },
{ name: 'りんご', type: 'フルーツ', quantity: 10, price: 16 },
{ name: 'なす', type: '野菜', quantity: 20, price: 6 },
{ name: 'レモン', type: 'フルーツ', quantity: 3, price: 6 }
];
//種類がフルーツ、量が１個より多く、値段が９より小さいものを配列から取り出す
products.filter(function(product){
  return product.type === 'フルーツ'
  && product.quantity > 1
  && product.price < 9;
});

//=>[{"name":"レモン","type":"フルーツ","quantity":3,"price":6}]
```

###find(特定のデータを取り出す場合に使用する)
```find.js
var users = [
  { name: '鈴木' },
  { name: '佐藤' },
  { name: '田中' }
  ];

var users;
//配列からuser.nameが田中を見つけて取り出す
users.find(function(user) {
           return user.name === '田中';
           });

//=>{"name":"田中"}
//findでは最初に見つけた要素を取り出す
```
###every(条件を全て検証し全て条件があてはまるとき。　論理積)
```every.js
var computers = [
  { name: 'ASUS', ram: 25 },
  { name: 'TOSHIBA', ram: 14 },
  { name: 'mac', ram: 5 }
  ];
//全てのramが１５以上であるか？
computers.every(function(computer) {
  return computer.ram>= 15;
});

//=>False
```

###some(条件を全て検証して、どれか一つでも条件が当てはまる場合。　論理和)
```some.js
var computers = [
  { name: 'ASUS', ram: 25 },
  { name: 'TOSHIBA', ram: 14 },
  { name: 'mac', ram: 5 }
  ];
//一つでもramが１５以上であるか？
computers.some(function(computer) {
  return computer.ram>= 15;
});

//=>True
```

###reduce(プロパティの集約)
```redue.js
var numbers = [ 3, 5, 4 ];
var sum = 0;

numbers.reduce(function(sum, number) {
   return sum + number;
}, 0);
//０は初期値。
//=> 12
```
Jiraのエピックバーンダウンがプロジェクトマネジメントを助ける

# はじめに
[以前の記事][1]で、Jiraスクラムボードの簡単な使い方を紹介しました。
今回の記事ではエピックやストーリーポイントを使用し、「エピックバーンダウン」というチャートで
プロジェクトの着地点を見極める方法を紹介します。
# 準備
今回は「見積もりをする」「実績から終了スプリントを予想する」といったことを実施していきます。
そのために、前もって「エピック」を作成しておきます。
※エピックという概念を知らない、という方はある程度まとまったストーリーの塊だと考えてください。

## エピックの作成
エピックはバックログの管理画面から発行できます。
![2019-07-08_12h16_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/73fd8d63-7b9c-6bac-9561-687bf9b1d721.png)
「エピックの作成」から新規作成します。
![2019-07-08_12h16_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/d8f42c9b-f906-6f05-d998-0ef1a9446d58.png)
エピック名と要約を入力し発行します。
![2019-07-08_12h17_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/550af3da-7051-5d34-e42b-0663e37486ca.png)
エピックに紐付いたバックログは、このように表示されます。
![2019-07-08_12h18_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/f2e5fc8c-de74-0406-b1b2-551cfa40ba53.png)

## なぜエピックを使用するのか
エピックというものは、ストーリーより大きい単位になります。

図: エピック、ストーリー、バージョン、スプリントの関係を表したもの。図中のtask、subtaskがストーリーに相当する
![JIRAによる開発管理 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/bb299361-3f64-7f63-ac1a-1a3f905ef5fe.png)

複数スプリントにまたがる開発がいつごろ収束するのか、というのはプロジェクトマネジメントにおける関心事の一つですが
エピックバーンダウンを使うことでその予測を立てやすくなります。

エピックの全体像を描く前に、個別のストーリーの見積もりを行っていきます。

## 見積もりをする
### ストーリーポイントの追加
バックログにある「見積もり」の領域がストーリーポイントを入力する箇所になります。
![2019-07-08_12h14_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/2e176ee6-13d3-ed66-ac69-90d1d42643e2.png)

入力します。
![2019-07-08_12h14_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/a48ead04-37ab-253d-3f54-c5975aacf9ca.png)


# エピックバーンダウンを表示する
エピックバーンダウンですが、数スプリントをストーリーポイント付きで完了させたあとに使用できるようになります。

まずレポートを開きます。
![2019-07-08_15h46_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/b84656fb-1c64-1998-3a60-b78234bf55b7.png)

続いて「エピックバーンダウン」を開きます。
![2019-07-08_15h47_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/76ca0303-3a74-8d15-959b-42f5e6aa970a.png)

すると、このような画面が表示され「あと何スプリントでこのエピックは完了見込みか」を確認することができます。
![2019-07-08_13h57_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/6897573e-b655-6750-6a01-8f20bde97fcc.png)

各スプリントでのベロシティが計測されていることが前提ですので、
まずは「ストーリーポイントを入れてスプリントを回す」ことから始めてください。


# バーンダウンで先回りしたマネジメントを
今回紹介したエピックバーンダウンを使うことでエピックの開発完了スプリントを予想することができます。
求められているスケジュールにミートしない、途中からストーリーが増えて先が見えない…そんな危険な状況を、エピックバーンダウンはプロジェクトの実績から定量的に可視化してくれます。
スクラムボードを使っている方はぜひ試してみてください。


[1]:https://qiita.com/navitime_tech/items/602e60c41c036d8eae97
Javaで読み込みできる形式のecdsaのkey pairの作り方

# はじめに

JWTなどで、サーバ上にある公開鍵・秘密鍵を使って署名・検証したいケースがあります。
JWTのライブラリ側で、キーペア作るメソッドを提供していると思いますが、それを使った場合、アプリを起動をする度にキーペアが生成されます。起動のたびに、直前に発行したJWTを無効にできない場合は、固定のキーペアを使うことになります。


このごろは、RSAよりECDSAの方が、小さいサイズで同程度の暗号の強度が得られることから、使われるケースが増えてるようです。

# keyの作成

pem形式で作成します。

```
openssl ecparam -genkey -name secp256k1 -out key-pair.pem
openssl pkcs8 -topk8 -inform pem -in key-pair.pem -outform pem -nocrypt -out private.pem
openssl ec -in key-pair.pem -pubout -outform pem -out public.pem
```

# private key

private keyは　

*  `-----BEGIN PRIVATE KEY-----`、 `-----END PRIVATE KEY-----`と改行コード をtrim
* Base64でdecode 
* PKCS8EncodedKeySpec を生成
* KeyFactoryでアルゴリズム指定して生成

```
import java.nio.file.Files;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

String privatePem = new String(Files.readAllBytes(path))
                    .replaceAll("\\r\\n", "")
                    .replaceAll("\\n", "")
                    .replaceAll("-----BEGIN PRIVATE KEY-----", "")
                    .replaceAll("-----END PRIVATE KEY-----", "");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privatePem));
PrivateKey privateKey = KeyFactory.getInstance("EC").generatePrivate(keySpec);
``` 


# public key

*  `-----BEGIN PUBLIC KEY-----`、 `-----END PUBLIC KEY-----`と改行コード をtrim
* Base64でdecode 
* X509EncodedKeySpecを生成
* KeyFactoryでアルゴリズム指定して生成

```
String publicPem = new String(Files.readAllBytes(jwtSettings.getPublicKeyAsPath()))
                    .replaceAll("\\r\\n", "")
                    .replaceAll("\\n", "")
                    .replaceAll("-----BEGIN PUBLIC KEY-----", "")
                    .replaceAll("-----END PUBLIC KEY-----", "");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicPem));
PublicKey publicKey =  KeyFactory.getInstance(jwtSettings.getAlgorithm()).generatePublic(keySpec);
```

# 参考リンク

* https://stackoverflow.com/questions/11410770/load-rsa-public-key-from-file
* https://metamug.com/article/security/sign-verify-digital-signature-ecdsa-java.html
* https://howtodoinjava.com/java/io/java-read-file-to-string-examples/
* https://howtodoinjava.com/java11/files-readstring-read-file-to-string/
* http://blog.livedoor.jp/k_urushima/archives/1721840.html
* https://qiita.com/wnoguchi/items/a72a042bb8159c35d056
* https://jwt.io/
* https://qiita.com/TakahikoKawasaki/items/4c35ac38c52978805c69
【Git】.gitignoreを反映させるために管理対象ファイルのキャッシュを消すスクリプト

#概要
.gitignoreに追加したけど、反映されないときに行うコマンドをまとめた

これで1発

#スクリプト
```shell:clearCache.sh
git rm -r --cached .
git add .
git commit -m 'cache clear'
```

#Happy Hacking :sunglasses: !
indexOfとspliceメソッドを使った削除方法　JavaScript　【Snippets】

# 概要

JavaScriptで特定の要素を削除（配列から取り除く）方法がいくつかあるので、今回は`splice`の書き方例をメモします。

[MDN: splice](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)

[MDN: indexOf](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)

## コード

```javascript:index.js
const userLists = [
  { id: 1, name: 'Mike' },
  { id: 2, name: 'Taro' },
  { id: 3, name: 'John' }
];

const user = userLists.find(user => user.id === 3);
// 'John'を取得

const index = userLists.indexOf(user);
// 'John'は２番目のユーザー

userLists.splice(index, 1);  
// ２番目から、1つの要素を取り除きます

console.log(userLists); 
// 残りの要素（ユーザー）は{ id: 1, name: 'Mike' }, { id: 2, name: 'Taro' }
```

※`userLists.find(user => user.id === 3)`の「３」は、Node.jsで`req.params.id`で「３」を取得したと想定しています。

## 削除するまでの流れ

これらの流れを言葉にして読み上げると、記憶に残りやすかったのでメモ。

- 配列リストから特定の要素を取得する 例： `{ id: 3, name: 'John' }`
- indexOfで配列の何番目の要素か調べる。　例： `name: 'John'`は2番目のユーザー
- `splice(index, 1)`　で、index番目の要素を1つ取り除く
- 残った要素（ユーザー）は`{ id: 1, name: 'Mike' }, { id: 2, name: 'Taro' }`です。
Spring gradleでサーバー実行可能JAR作成とWAR作成の仕方

#Spring boot 実行可能Jar
環境:macOS, Spring Tools
Package Explorerのプロジェクト名を右クリック。

Run as ⇨ Run Configuration
Gradele Projectを右クリック。
Gradle Tasksタブをクリック。
Gradle Tasks: 欄に build と記述。

Working Directory欄に プロジェクトのルートフォルダを指定。
右下の Run をクリック。

すると

プロジェクトのルート/build/libs

に プロジェクト名.jar が出来ている。

（以下試行中）サーバにアップロード　
上記の任意のフォルダにアップロード。

```terminal:terminal
java -jar test.jar  
``` 

で実行するとjarに内臓されたtomcatが立ち上がる。
サーバーを止めるときはcontrol + c
でも私の場合、これで実行してもアプリが立ち上がって一見動いているだけで、ページにアクセスしても反応がなかった。

#Spring Boot 実行可能War
プロジェクトを新規で作るときのメニューかbuild.gradleでjarが指定されているところをwarに変える。
build.gradleに

```gradle:build.gradle
apply plugin:'war'
war {
        enabled = true
        archiveName 'sample.war'
    }
```
を追加
gradleをリフレッシュして、jarの時と同じ手順でconfigurationを開き

Gradle Tasks:欄に war と記述。
すると同じように

プロジェクトルート/build/libs に warファイルが出来ている。
Observerを使ってDOMを監視するサンプル めも

```
Observerをつかて、要素を監視して
gdpがshowになったら何かするサンプルっぽい
<script>

//  observeForTargetElement = document.getElementById("div-gpt-ad-1733-0");
//  // intersection
//  let intersection = new IntersectionObserver(function(entry) {
//    console.log(entry[0].intersectionRatio)
//
//    //googletag.cmd.push(function() {
//    //  googletag.display('div-gpt-ad-1733-0');
//    //})
//
//    //監視の停止（実際には特定条件下で実行）
//    let shouldStopObserving = false;
//    if (shouldStopObserving) {
//      intersection.disconnect();
//    }
//
//  }, {root: null, rootMargin: "0px", threshold: buildThresholdList()});
//  intersection.observe(observeForTargetElement);
//
//
//  function buildThresholdList() {
//    let thresholds = [];
//    for (let i = 1.0; i <= 10; i++) {
//      thresholds.push(i / 10);
//    }
//    thresholds.push(0);
//    return thresholds;
//  }


</script>
```
Ren'Py 製ゲームのソースコードを覗く

翻訳のため、あるいは純粋な興味のために Ren'Py 製ゲームをアンパック・デコンパイルし、ソースコードを取り出す方法です。

# Ren'Py 製ゲームであることの確認方法

PC 版の場合、`exe` と同じ階層に `renpy` フォルダがあります。

```
[Ren'Py Game]
+ game/ 
+ lib/
+ renpy/
+ [Ren'Py Game].exe
+ [Ren'Py Game].sh
```

# Windows の場合

## 1. UnRen.bat を配置

[UnRen.bat](https://f95zone.to/threads/unren-bat-v0-7-rpa-extractor-rpyc-decompiler-console-developer-menu-enabler.3083/) をダウンロードし、 `game` フォルダに配置します。
この時、PowerShell が無い、または `..\lib\windows-i686\python.exe` が存在しない場合、エラーとなるので注意してください。


## 2. `.rpa` ファイルをアンパック

UnRen.bat を起動し、`Enter a number:` が表示されたら、`1` を入力して `Enter` を押します。
すると `game` フォルダ内の `.rpa` ファイルがアンパックされ、中の `.rpyc` ファイルやリソースファイルが展開されます。


## 3. `.rpyc` ファイルをデコンパイル

-続けて `key to exit:` で `1` を入力し、`Enter a number:` が表示されたら、`2` を入力して `Enter` を押します。
すると `game` フォルダ内の `.rpyc` ファイルがデコンパイルされ、`.rpy` ファイルが展開されます。



# Mac/Linux の場合

## 1. rpatool と unrpyc のダウンロード

[Shizmob/rpatool](https://github.com/Shizmob/rpatool) と [CensoredUsername/unrpyc](https://github.com/CensoredUsername/unrpyc) をダウンロードします。


## 2. `.rpa` ファイルをアンパック

以下のようなコマンドで rpatool を実行します。

```bash
python rpatool -x アンパックするrpaファイル
```

**注意点**
- python2 をインストールしていない場合は Ren'Py に同梱されている Python2 を利用してください。(`./lib/linux-x86_64/python`)
- rpatool に path を通していない場合は相対パスに直してください。


### 3. `.rpyc` ファイルをデコンパイル

同様に unrpyc も実行します。

```bash
python un.rpyc [デコンパイルしたいrpycファイル]
```

**注意点**
- こちらも Python2 で実行してください
- un.rpyc に path を通していない場合は相対パスに直してください。
- エラーになってしまう場合、ソースコードをダウンロードして実行するとうまくいくことがあります。



# ソースコードを覗く

`.rpy` ファイルは普通のテキストファイルなので、好きなエディタで編集できます。
 Ren'Py 用の拡張機能がある以下のエディタがおすすめです。

- [Atom](https://atom.io/) - [language-renpy](https://atom.io/packages/language-renpy)
- [VSCode](https://visualstudio.microsoft.com/ja/) - [Ren'Py Language](https://marketplace.visualstudio.com/items?itemName=LuqueDaniel.languague-renpy)
- [Sublime Text](https://www.sublimetext.com/) - [Renpy Language](https://packagecontrol.io/packages/Renpy%20Language)

## 参考

- [Ren'Py製ゲームの翻訳パッチ作成方法](https://steamcommunity.com/sharedfiles/filedetails/?id=1198526520)
AccessでコピーしたデータをExcelに貼り付けるVBA

AccessでコピーしたデータをExcelに貼り付ける際、思い通りに貼り付けられないことが多々ある。
これはクリップボード内のAccessデータを文字列形式でExcelに貼り付けるためのスクリプト。
パフォーマンスがあまり良くないところが問題。

```vb
Option Explicit

Sub AccessTablePaste()
    Application.ScreenUpdating = False
    
    Dim DObj As New DataObject
    DObj.GetFromClipboard
    
    Dim curRow As Long, curCol As Long
    curRow = ActiveCell.Row
    curCol = ActiveCell.Column
    
    Dim rows() As String
    Dim fields() As String
    Dim rIdx As Long, cIdx As Long
    
    rows = Split(DObj.GetText, vbCrLf)
    For rIdx = 0 To UBound(rows)
    
        fields = Split(rows(rIdx), vbTab)
        For cIdx = 0 To UBound(fields)
            
            With Cells(curRow + rIdx, curCol + cIdx)
                .NumberFormatLocal = "@"
                .value = fields(cIdx)
            End With
            
        Next
    Next
    
    Application.ScreenUpdating = True
End Sub

```
mqlめも

```
db.getCollection('referrer').aggregate(
  [
    { $match : { "epoch": { $gte: (new Date() -12333232 )} } },
    { $group : {
      _id : "$domain",
      count: { $sum: "$count" },
      domain: {$first: "$domain"},
      ref: {$first: "$ref"}
    }
    },
    { $sort: { count: -1 } },
    { $limit : 1113},
    //     { $listLocalSessions: { allUsers: true } } ,
    //     { $out : "authors" },
    { $unwind: { path: "$count", includeArrayIndex: "arrayIndex" } }
    //     { $indexStats: { } }
  ]
)

// ドメインごとの
//     アクセス数
//     指定時間
//　アクセス数順
```
Ruby で [-1, -2, -3].map(&:succ >> :to_s)  という感じで書きたい

# `[-1, -2, -3].map(&:succ >> :to_s)` という関数型を意識した記述

`&` を使いブロック渡しで任意のオブジェクトを渡す仕組みがあります。
カラクリについては https://qiita.com/hamajyotan/items/f2a96bbb1ccc60a06053 に記述。

```ruby
[-1, -2, -3].map(&:succ)  #=> [0, -1, -2]
```


上記記述に対して、
`Proc#>>` と同じ要領で `succ` を実施した結果に更に `to_s` を実施できたら嬉しいですね。
けど、できません。。 :sweat_drops: 
この記事はこれをできるようにするための実装の話です。

```ruby
[-1, -2, -3].map(&:succ >> :to_s)  #=> NoMethodError: undefined method `>>' for :succ:Symbol
```

# Proc#>> および Proc#<<

Ruby 2.6 から、 Proc#>> および Proc#<< が追加されました。いわゆる関数合成と言われる仕組みです。

```ruby
f1 = -> x { x.succ }
f2 = -> x { x.to_s }

f3 = f1 >> f2
f3.call(-3) # f1 の実行結果を f2 の引数として渡す。 f2.call(f1.call(-3))
#=> "-2"

f4 = f1 << f2
f4.call(-3) # >> とは逆順に合成される。 f1.call(f2.call(-3))
#=> "-4"
```

# Symbol#>> と Symbol#<< があったら嬉しい

自分自身を `to_proc` により Proc オブジェクトに変換、そこに更に `>>` で合成すればよさそうです。

```ruby
# >> および << メソッドを生やす
module SymbolComposeToLeftAndRight
  def >>(g)
    to_proc >> g
  end

  def <<(g)
    to_proc << g
  end
end
Symbol.prepend(SymbolComposeToLeftAndRight)

# どうだ！？。。。残念
[-1, -2, -3].map(&:succ >> :to_s)  #=> NoMethodError: undefined method `call' for :to_s:Symbol
```

どうやら `Proc#>>` の引数に対して `call` を要求しているようです。

# Proc の >> および << の引数側も to_proc するようになれば嬉しい

`Proc#>>` および `Proc#<<` の引数は Proc オブジェクトであることが期待されています。
もう少し正確に言うと、 `call` に反応するオブジェクトであることが期待されています。

```ruby
class Callable
  def call(x)
    x + 5
  end
end

proc1 = proc { |x| x + 1 }
proc2 = proc1 << Callable.new

# 引数に 1加算され、更にその結果に 5加算。
proc2.call(3)  #=> 9
```

ここが拡張されて、引数自体に `to_proc` がかかってから既存の処理となるようにならないでしょうか？
言い換えると、 `.call` を期待するオブジェクト改め、 `.to_proc.call` を期待するオブジェクトと言っても良いです。

```ruby
module ProcComposeToLeftAndRightWithToProc
  def >>(g)
    super(g.to_proc)  #=> 引数オブジェクトを to_proc してから既存の処理
  end

  def <<(g)
    super(g.to_proc)
  end
end
Proc.prepend(ProcComposeToLeftAndRightWithToProc)
```

これで上記エラーも回避できるはず。

# 実装した (まとめ)

```ruby
module ProcComposeToLeftAndRightWithToProc
  def >>(g)
    super(g.to_proc)
  end

  def <<(g)
    super(g.to_proc)
  end
end
Proc.prepend(ProcComposeToLeftAndRightWithToProc)

module SymbolComposeToLeftAndRight
  def >>(g)
    to_proc >> g
  end

  def <<(g)
    to_proc << g
  end
end
Symbol.prepend(SymbolComposeToLeftAndRight)

# succ してから to_s
[-1, -2, -3].map(&:succ >> :to_s)  #=> ["0", "-1", "-2"]

# succ してから to_s, さらに length
[-1, -2, -3].map(&:succ >> :to_s >> :length)  #=> [1, 2, 2]

# 逆側の合成。 to_s してから succ
[-1, -2, -3].map(&:succ << :to_s)  #=> ["-2", "-3", "-4"]
```

関数型っぽい！
既存 2.6 とも互換はあるし、 Ruby の自体がこうなってたら嬉しい人は少なくないんじゃないかと思うけどどうでしょう？
JavaインタフェースのgetterをKotlinクラスのプロパティで実装済みとは見做してくれない

きっかけはGraphQLでエラー処理を実装するにあたり[Exceptions while fetching data](https://www.graphql-java.com/documentation/v13/execution/)を参考にしてKotlinで以下のクラスを作成した時だった。

```kotlin
class NotFoundException : RuntimeException(), GraphQLError {
  override fun getErrorType(): ErrorType {
    TODO("not implemented")
  }
  override fun getLocations(): MutableList<SourceLocation> {
    TODO("not implemented")
  }
}

エラー:(5, 1) Kotlin: Class 'NotFoundException' is not abstract and does not implement 
abstract member public abstract fun getMessage(): String! defined in graphql.GraphQLError

```
GraphQLErrorはJavaインタフェースクラスで、例外の基底クラスであるThrowableと同じシグネチャのgetMessageメソッドが定義されている。ドキュメントでも例示されているようにJavaであればRuntimeExceptionで実装済みと見做してくれる筈だが、コンパイルエラーが発生する。

getMessageメソッドが実装されていないというのだ。不思議に思いつつgetMessageメソッドを書いてみた。

```kotlin
class NotFoundException : RuntimeException(), GraphQLError {
  // 省略

  override fun getMessage(): String {
    TODO("not implemented")
  }
}

エラー:(14, 3) Kotlin: Accidental override: The following declarations have the same JVM signature (getMessage()Ljava/lang/String;):
    fun <get-message>(): String? defined in quo.vadis.megasys.NotFoundException
    fun getMessage(): String defined in quo.vadis.megasys.NotFoundException
```

すると今度はJVMで同じシグネチャというコンパイルエラー。もう訳がわからないよ。

ネットで調べてみると[GraphQLのissue](https://github.com/graphql-java/graphql-java/issues/1022)を見るとKotlinの問題ってことでクローズしていた。
[Kotlinのissue](https://youtrack.jetbrains.com/issue/KT-6653)を見てみると、かなり根深い問題のようで、4年も議論されていた。

当面は治りそうもないので回避策として例外クラスはJavaで実装することにしました。

```java
import graphql.ErrorClassification;
import graphql.GraphQLError;
import graphql.language.SourceLocation;
import java.util.List;
import java.util.Map;
import lombok.Data;

@Data
public class GraphQLException extends RuntimeException implements GraphQLError {
  private Map<String, Object> extensions;

  public GraphQLException(String message) {
    super(message);
  }

  public GraphQLException(String message, Throwable cause) {
    super(message, cause);
  }

  public GraphQLException(Throwable cause) {
    super(cause);
  }

  public GraphQLException(String message, Map<String, Object> extensions) {
    super(message);
    this.extensions = extensions;
  }
  
  public GraphQLException(Throwable cause, Map<String, Object> extensions) {
    super(cause);
    this.extensions = extensions;
  }

  public GraphQLException(String message, Throwable cause, Map<String, Object> extensions) {
    super(message, cause);
    this.extensions = extensions;
  }

  @Override
  public List<SourceLocation> getLocations() {
    return null;
  }

  @Override
  public ErrorClassification getErrorType() {
    return null;
  }

  @Override
  public List<Object> getPath() {
    return null;
  }
}
```
この例外を返すとSimpleDataFetcherExceptionHandler等でデータが加工されるのですが、getLocations, getErrorType, getPathは使われない(他からデータを持ってくる)のでnullにしておきました。
Android Architecture Components 勉強会  資料まとめ

Android Architecture Components 勉強会 とは 

GDG Tokyo が開催している、Google社員 と Google Developer Expertによる Android（特に Android Architecture Components） 勉強会です。

この勉強会で使われている資料が、実際に手を動かしながら AAC を学べる素晴らしい資料なので、まとめました。
※ 勉強会当時の資料なので、情報が古い場合があるのでご注意ください

# #1 Handling Lifecycles

[Android Architecture Components 勉強会 #1](https://gdg-tokyo.connpass.com/event/73894/)

↓ 資料 ↓
https://speakerdeck.com/yanzm/architecture-components-mian-qiang-hui-di-1hui-mu-lifecycles

# #2 LiveData

[Android Architecture Components 勉強会 #2](https://gdg-tokyo.connpass.com/event/75703/)

↓ 資料 ↓
https://speakerdeck.com/t_egg/gdg-tokyo-android-architecture-components-livedata

# #3 ViewModel

[Android Architecture Components 勉強会 #3](https://gdg-tokyo.connpass.com/event/79370/)

↓ 資料 ↓
https://speakerdeck.com/wasabeef/viewmodel-of-aac

# #4 Room

[Android Architecture Components 勉強会 #4](https://gdg-tokyo.connpass.com/event/80500/)

↓ 資料 ↓
http://yaraki.github.io/slides/aac-room

# #5 Lifecycle, ViewModel, LiveData の復習

[Android Architecture Components 勉強会 #5](https://gdg-tokyo.connpass.com/event/123068/)

↓ 資料 ↓
https://speakerdeck.com/yanzm/lifecycle-viewmodel-livedata-falsefu-xi

# #6 Room の復習、Paging

[Android Architecture Components 勉強会 #6](https://gdg-tokyo.connpass.com/event/127484/)

↓ 資料 ↓
http://yaraki.github.io/slides/aac-paging/index.html

# #7 WorkManager

[Android Architecture Components 勉強会 #7](https://gdg-tokyo.connpass.com/event/134258/)

↓ 資料 ↓
https://drive.google.com/open?id=1eLgnzTMo6jXZgKShg0O1ZjhOcIBVGXnT

# #8 Navigation 

[Android Architecture Components 勉強会 #8](https://gdg-tokyo.connpass.com/event/138178/)

↓ 資料 ↓
https://speakerdeck.com/wasabeef/navigation-android-architecture-components