OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby】ローカル変数の小さなサンプルメモ

- スコープ：クラス、モジュール、メソッド定義の本体
- 小文字
- _で始まる
- 「オブジェクトの壁やメソッドの壁を超えては参照できず、それが定義された場所でしか通用しない」↓リンク曰く
        - https://qiita.com/kansiho/items/f5ab9b6eeb990e6af327


```ruby:local_variable.rb
num0 = 0

module Kure1
  num1 = 100
  p num1

  def test
    p num1
    num2 = 200
  end

end

def test_method
  num3 = 300
end

class TestClass
  num4 = 400
  p num4
#  p num0 # Error(ndefined local variable or method)
  def test
    num5 = 500
    p num5
#    p num4 # Error(undefined local variable or method)
  end
end

test_class = TestClass.new
test_class.test

# Kure1.num1 # Error(undefined method)

# test_method.num3 # Error(undefined method)
# test_class.num4 Error(undefined method)
# test_class.num5 Error(undefined method)
```
WindowsでEdisonのファームウェアを更新するときに詰まったとこ（2018/4/1時点）


指示語使うと齟齬が生まれる可能性があるため極力使わないことにする。
なので若干冗長。

# 使ったもの
* Intel® Edison Breakout Board
* USB miniB ケーブル
* intel_edison_setup_win_v◯◯◯◯.exe
* IntelEdisonDriverSetup◯.◯.◯.exe
* iotdk_win_installer_◯.◯.◯.exe
* iot-devkit-prof-dev-image-edison-◯◯◯


ダウンロード元は
intel_edison_setup_win_v◯◯◯◯.exe
と
IntelEdisonDriverSetup◯.◯.◯.exe
が
https://downloadcenter.intel.com/download/26993/Intel-Edison-Configuration-Tool

iotdk_win_installer_◯.◯.◯.exe
が
https://downloadcenter.intel.com/download/25028/Intel-Edison-Board-Support-Package

iot-devkit-prof-dev-image-edison-◯◯◯
が
https://downloadcenter.intel.com/download/27074/Intel-Edison-Yocto-Poky-image

#全体の流れとしては
1. intel_edison_setup_win_v◯◯◯◯.exeでドライバをインストール
2. IntelEdisonDriverSetup◯.◯.◯.exeでドライバを個別にインストール
3. iotdk_win_installer_◯.◯.◯.exeでIntel Phone Flash Tool Lite ◯.◯.◯.◯をインストール
4. iot-devkit-prof-dev-image-edison-◯◯◯をダウンロード
5. インストールしたFlash Tool Liteでiot-devkit-prof-dev-image-edison-◯◯◯を書き込む

これだけなのに色々詰まって3時間強も掛かったので大体の詰まったところを書いておく

#ドライバのインストール
色々なサイトを参考にすると、「intel_edison_setup_win_v◯◯◯◯.exe」というプログラムがうまく行けば、勝手にいくらかのドライバやソフトウェアをインストールし、Wifiなんかの設定をGUI上で楽に行ってくれるんだと思う。
しかし現時点でこのプログラムを使うとドライバインストール中に「IntelEdisonDriverSetup◯.◯.◯.exe」が自動的にダウンロードされるはずの所でエラーが発生した。（そのせいでその後の設定まで行くことが出来ない。）

![edison.PNG](https://qiita-image-store.s3.amazonaws.com/0/136332/beecb276-32e7-ee60-9661-3d6d09b90e5a.png)

なのでこのファイルは個別にダウンロード・インストールした。

intel_edison_setup_win_v◯◯◯◯.exe
と
IntelEdisonDriverSetup◯.◯.◯.exe
は以下のURLからダウンロードすることが出来る。
https://downloadcenter.intel.com/download/26993/Intel-Edison-Configuration-Tool

ただしFTDI用のドライバなどをインストールする必要があるため、上記のエラーはおきるが、intel_edison_setup_win_v◯◯◯◯.exeでもドライバをインストールすることを忘れないこと。

後、Edisonを接続しながらドライバを更新すると<font color="Blue">ブルースクリーン</font>になった。
忘れずに接続を解除してからドライバを更新すること。

#Intel Phone Flash Tool Lite ◯.◯.◯.◯のインストール
Intel Phone Flash Tool Liteの項目が出てくるのでそれにチェックを入れれば良い。
ドライバの項目もあるが、ファイルの更新日的にiotdk_win_installer_◯.◯.◯.exeよりintel_edison_setup_win_v◯◯◯◯.exeの方が新しいのでチェックは入れないほうが良いと思う。

#ファームウェアファイルのダウンロード

再び色々なサイトを参考にすると「Yocto complete image」というファイル群が必要そうだ。
ただし、現在そのようなファイルは存在しない。
今はiot-devkit-prof-dev-image-edison-◯◯◯と名前を変えている。
ちなみに同じ場所にiot-devkit-yp-poky-edison-◯◯◯とあるが、これはアーカイブなのでここで間違うと非常に時間を食う。（実話）

iot-devkit-prof-dev-image-edison-◯◯◯
は以下
https://downloadcenter.intel.com/download/27074/Intel-Edison-Yocto-Poky-image

#Flash Tool Liteでファームウェアを書き込む
https://qiita.com/widret/items/5939af7aed155760abbb
のままやれば良い。

ここで注意するべきなのはこの記事でも強調されているようにこの時点ではまだMicroUSBケーブルはつながないこと。

繋ぐと一定時間後DISCONNECTEDとかになると思う。
Chromeの場合、submitボタン押下時にボタンをdisabledにすると、フォームデータが送信されない。

クライアントからデータが多重送信されることを防止するため、submitボタンを押下した瞬間にそのボタン自体を押下不能にすることを考えます。

```html
<form id='form'>
  <input type='submit' id='submit' />
</form>

<script>
let submit = document.getElementById('submit');
submit.addEventListener('click', (evt) => {
  submit.disabled = true;
}, false);
</script>
```

Google Chromeだと上記のコードは想定通りに動作しません。つまりフォームデータ自体がサーバに送信されなくなってしまいます(´・ω・｀) ネットワークコンソールを見ている限りだと、submitイベントが中断されているような挙動を示していたのですが、詳細は不明(フロントエンドマンわからないマンの限界)。なおFireFoxとMicrosoft Edgeでは正常に動作したので、Chrome特有の仕様・挙動の可能性があります。

「Chromeだけ動かない」事象だったので、デバッグには苦労したのですが、とりあえず以下のように書き換えることで、同様の機能を実装することができました。なおこのコードはChrome,FireFox,Edgeすべてで正常に動作しました。

```html
<form id='form'>
  <input type='submit' id='submit' />
</form>

<script>
let form = document.getElementById('form');
form.addEventListener('submit', (evt) => {
  let submit = document.getElementById('submit');
  submit.disabled = true;
}, false);
</script>
```
リアクションされたコメントを自動翻訳するSlack BotをZapierで作った

自動翻訳してくれるSlack Botを [Zapier](https://zapier.com) で作ったので紹介です。
これは [Auto translation bot for Slack using Zapier](https://dev.to/rkowase/auto-translation-bot-for-slack-using-zapier-3fgj) を翻訳したものです。

（2018/07/10 追記）[Zapier Automation Meetup Tokyo #0](https://zapier.connpass.com/event/92223/) のLT用に少し編集しました。

---

## 使い方
翻訳したいコメントにZapierで指定したリアクションをつける。

---

## 動作イメージ
Slack Botがリアクションをつけたコメントを翻訳してくれる。
![](https://thepracticaldev.s3.amazonaws.com/i/6lobrdult35e1kwlp4g7.png)

---

## このZapの作り方

### 概要
![](https://thepracticaldev.s3.amazonaws.com/i/905wdixupisun4yip3g4.png)

---

### 1. Add TRIGGER - Slack (New Reaction Added)
トリガーとなるリアクションを設定します。
- Reaction: `2en` (Specify any Emoji)
- Channel: (Not specified)
- User: (Not specified)
![](https://thepracticaldev.s3.amazonaws.com/i/au57e4p0ddqe0bqjpjw6.png)

---

### 2. Add FILTER - Filter by Zapier (Only continue if...)
Botを発動させたくないチャンネルを追加（これはオプションです）
![](https://thepracticaldev.s3.amazonaws.com/i/tdn6za8zrqkg66tlvfzt.png)

---

### 3. Add ACTION - Formatter by Zapier (Text)
多重投稿を制御するためにリアクションされたコメントのIDを抽出。
- Transform: Extract Pattern
- Values (Input): The `Message Permalink` of Step 1
- Pattern: `.*/(.*)(\?.*)?`
![](https://thepracticaldev.s3.amazonaws.com/i/ufp2wr3twmq9ugkh4wdx.png)

---

### 4. Add SEARCH - Slack (Find Message)
多重投稿を制御するためにコメント検索。
- Search Query: `in:#<MESSAGE_CHANNEL_NAME> from:2en <OUTPUT_OF_STEP3>`
- Sort By: (Not specified)
- Sort Direction: (Not specified)
![](https://thepracticaldev.s3.amazonaws.com/i/r7meo9apra27qftvryx4.png)

---

### 5. Add FILTER - Filter by Zapier (Only continue if...)
多重投稿を制御するために翻訳済みコメントがあればフィルター（スキップ）
![](https://thepracticaldev.s3.amazonaws.com/i/xz6a41mmqr7xtvek79ij.png)

---

### 6. Add ACTION - Translate by Zapier (Translate Text)
元のコメントを英語に翻訳。
- Source Language: (Not specified)
- Text: The `Message Text` of Step 1
- Target Language: English
![](https://thepracticaldev.s3.amazonaws.com/i/a6ltm9uf6uzb4zqkd8r5.png)

---

### 7. Add ACTION - Slack (Send Channel Message)
翻訳されたコメントを投稿。
- Channel: Use a Custom Value
- Custom Value for Channel ID: The `Message Channel Name` of Step 1
- Message Text: `<TRANSLATION_OF_STEP6> <PERMALINK_OF_STEP1> original comment (<OUTPUT_OF_STEP3>) (<SOURCE_LANGUAGE_OF_STEP6>)`
![](https://thepracticaldev.s3.amazonaws.com/i/neeiv683r87tfy35w03e.png)

スレッドとして投稿。
- Thread: Use a Custom Value
- Custom Value for Thread Timestamp: The `Message Ts` of Step 1
![](https://thepracticaldev.s3.amazonaws.com/i/w2g3vf0fwdb4hh9q1zcg.png)

---

## DEMO
AzureFunctionsでHTMLやJSONを返す。HTTPヘッダに手を加える。

AzureFunctionsの出力にHTTPを選んだとき、resメソッドにコンテンツを直接代入する形になりますが、これにHTMLやJSONを突っ込む時に上手く解釈してくれなかったので、それについての解決策をメモ。

## 解決
`headers`オブジェクト内でContent-Typeを明示的に指定する必要がある。

```javascript
context.res = {
    status: 200,
    headers: { 'Content-Type': 'application/json' },
    body : { message : 'Hello World!'}
};
```
### 結果
![スクリーンショット (3).png](https://qiita-image-store.s3.amazonaws.com/0/150188/d99c5104-6ccd-ef99-a328-f439194321d7.png)
ブラウザ側でもちゃんとJSONだと認識してくれます。

## 症状
```javascript
context.res = {
    status: 200,
    body : { message : 'Hello World!'}
    // Headerを指定していない
};
```

### 結果
![スクリーンショット (4).png](https://qiita-image-store.s3.amazonaws.com/0/150188/eaafece8-e6d3-d3f4-f9ab-3f9a5dd6fd85.png)
クライアントによって解釈の方法がまちまちになる。

## 終わりに
ヘッダの指定ができるのでクロスオリジン要求にも対応が出来ますね。
JavaScriptを使っていますが、他の言語でも同じように対応できると思います。
交差した線分を取得

2つのLINESTRINGのa,bのうち、aとbが交差しているaの線分を特定して、線分を返却するプログラム

```sql
DROP FUNCTION IF EXISTS get_line_segment(geometry(LineString,4612), geometry(LineString,4612));
CREATE OR REPLACE FUNCTION get_line_segment(base_geom geometry(LineString,4612), target_geom geometry(LineString,4612))
RETURNS geometry(LineString,4612) AS $$
declare
	is_cross boolean := false;
	geom_tmp geometry(LineString,4612);
begin
	FOR i IN 1 .. ST_NumPoints(base_geom) - 1 LOOP
		geom_tmp := ST_GeomFromText('LINESTRING(' || ST_X(ST_PointN(base_geom,i)) || ' ' || ST_Y(ST_PointN(base_geom,i)) || ',' || ST_X(ST_PointN(base_geom,i + 1)) || ' ' || ST_Y(ST_PointN(base_geom,i + 1)) || ')',4612);
		SELECT ST_Intersects(geom_tmp, target_geom)
		INTO is_cross;
		
		IF is_cross = true THEN
			return geom_tmp;
		END IF;
	END LOOP;
	return NULL;
end;
$$ LANGUAGE plpgsql;
```

さらに交差していなかった場合に、再近傍の線分を特定して、線分を返却するプログラムは以下

```sql

DROP FUNCTION IF EXISTS get_line_segment(geometry(LineString,4612), geometry(LineString,4612));
CREATE OR REPLACE FUNCTION get_line_segment(base_geom geometry(LineString,4612), target_geom geometry(LineString,4612))
RETURNS geometry(LineString,4612) AS $$
declare
	is_cross boolean := false;
	dist double precision := 0.0;
	dist_min double precision := 999999.0;
	geom_tmp geometry(LineString,4612) := NULL;
	dist_min_geom geometry(LineString,4612) := NULL;
begin
	FOR i IN 1 .. ST_NumPoints(base_geom) - 1 LOOP
		geom_tmp := ST_GeomFromText('LINESTRING(' || ST_X(ST_PointN(base_geom,i)) || ' ' || ST_Y(ST_PointN(base_geom,i)) || ',' || ST_X(ST_PointN(base_geom,i + 1)) || ' ' || ST_Y(ST_PointN(base_geom,i + 1)) || ')',4612);
		SELECT ST_Intersects(geom_tmp, target_geom), ST_Distance(geom_tmp, target_geom)
		INTO is_cross, dist;

		IF is_cross = true THEN
			return geom_tmp;
		END IF;

		IF dist < dist_min THEN
			dist_min = dist;
			dist_min_geom = geom_tmp;
		END IF;
		
	END LOOP;
	return dist_min_geom;
end;
$$ LANGUAGE plpgsql;
```
ASK-CLIでnewやcloneしたときの注意事項

[Alexa Skills Kitコマンドラインインターフェース（ASK CLI）](https://developer.amazon.com/ja/docs/smapi/ask-cli-command-reference.html)

"ask new -n [skill_name] -p profile_name"や"ask clone -s [skill_id] -p profile_name"でスキルを作成したときに、↓のような感じで作成されます。

~~~
├── .ask
├── lambda
│   └── custom
│       ├── index.js
│       ├── node_modules（以下省略)
│       ├── package-lock.json
│       └── package.json
├── models
│   └── en-US.json
└── skill.json
~~~

とりあえず今のところは、以下のあたりを気をつけておけば良さそうです。

* ".ask"の中にはスキルIDやlambdaのendpointが含まれているので、このファイルはコミットしないように".gitignore"に追加するのを忘れないようにする。
* "node_modules"も"new"したときにデフォルトで入るような気がするので、".gitignore"に追加するのを忘れないようにする。
* "new"の場合はロケールがUSで作成されるので日本語に直す（cloneの場合はちゃんと日本語になっているはず）。

結構簡単に使えるので、そんなにハードル高くない気がします（というよりは基本こっちで良いような気がする…）。
そのうち"new"や"clone"したときに.gitignoreも勝手に作成してくれることを期待してます。
[MQL5]クリックした場所に横線を引くスクリプト

```
//+------------------------------------------------------------------+
//|                                                   LineRedraw.mq5 |
//|                                                Shintaro Tanikawa |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Shintaro Tanikawa"
#property link      "https://www.mql5.com"
#property version   "1.00"

static const string vLineName = "V-Line";
static const string hLineName = "H-Line";

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
  if (id == CHARTEVENT_CLICK)
  {
    const int x = (int)lparam;
    const int y = (int)dparam;
    datetime dt = 0;
    double price = 0;
    int window = 0;
    long chartId = ChartID();
    if (ChartXYToTimePrice(chartId, x, y, window, dt, price))
    {
      CreateHLine(chartId, window, dt, price);
      //CreateVLine(chartId, window, dt, price);
      
      ChartRedraw(chartId);
    }
  }
}

void CreateHLine(long chartId, int window, datetime dt, double price)
{
  if (ObjectFind(chartId, hLineName))
  {
    ObjectDelete(chartId, hLineName);
  }
  
  ObjectCreate(chartId, hLineName, OBJ_HLINE, 0, dt, price);
  ObjectSetInteger(chartId, hLineName, OBJPROP_COLOR, clrRed);
}

void CreateVLine(long chartId, int window, datetime dt, double price)
{
  if (ObjectFind(chartId, vLineName))
  {
    ObjectDelete(chartId, vLineName);
  }
  
  ObjectCreate(chartId, vLineName, OBJ_VLINE, 0, dt, price);
  ObjectSetInteger(chartId, vLineName, OBJPROP_COLOR, clrRed);
}
//+------------------------------------------------------------------+

```
PyMC3でベイズ推論入門

# 概要
ベイズ推論の考え方の説明とそれを行うことのできるPythonライブラリPyMC3を使って例題を解いてみる。
例題等はこちらのリポジトリを参考にしています。
https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers

# ベイズ推論の考え方
#### 例
*あなたは野クルの部員です。ある友達に一緒にキャンプに行こうと誘いました。*
*以下の結果が得られる時、友達が誘いにYESと言ってくれる確率はいくらでしょうか？*

#### 結果
1回目のお誘い=>NO
2回目のお誘い=>NO
3回目のお誘い=>NO

この時、頻度主義の考え方だと、友達がYESと言ってくれる確率は`0/3=0%`となります。
一方ベイズ的な考え方では、**確率を信念の度合いで表すこと**としています。
確率を「ある出来事がどれくらい信頼できるか」を示す指標と解釈することがベイズ主義です。
この例だと、「誘っている友達が一緒にキャンプしてくれることをどれくらい信頼できるか」と言い換えられます。（なので、友達がYESと言ってくれるという信念が強ければ4回目にYESと言ってくれる確率は100%と考えることもできる）
人によって信念（確率）が異なることを定義が許しているのが特徴です。

# Pythonライブラリ **PyMC**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217930/67ef35be-4b48-6fc8-f9ee-7d84e5c91066.png)

ベイズ推論をすることのできるPythonライブラリ。
マルコフ連鎖モンテカルロ法(MCMC)アルゴリズムを用いて値を収束させています。
Python3系のPyMC3とPython2系のPyMC2がありますが、PyMC3の方が高速で、さらに2と3ではモデルの書き方などに差異があって両方触るのは学習コストがかかるため、基本的にはPyMC3を使っておけば良いと思います。（ただし本や記事によってはPyMC2の記述しかないものもあります）

## ベイズ推論の例
0から1の連続値で等確率の事前分布を0か1が50%の確率で決まる100,000個の観測値から事後分布を推論します。
以下の画像のように、`pm.Model()`をインスタンス化して、Modelを定義して`pm.sample()`でサンプリングを行います。
この画像では100,000回サンプリングを行なっています。（約10分ほど実行に時間がかかりました）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217930/acdc48a8-218c-8c86-a1c5-a53d8c5c1630.png)

### サンプリング数による事後分布の比較
基本的にサンプリング数が多いほど正確な結果となります。
サンプル数: 100,000
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217930/6ab7b427-ddcf-2332-4ac4-ef1da682c7a2.png)
サンプル数: 1,000
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217930/12f25b12-33dc-d756-9fad-8acc7071c050.png)
このように、サンプリング数100,000回だと分布の平均が0.499と正解の50%にかなり近い値になっています。
1,000回だとかなりばらつきが目立ち、分布の平均も0.467とやや正解とは外れた値となりました。

# 実際の課題を解いてみよう
ベイズ推論を実際の現場でどのように使えばいいのか考えてみます。
今回はWebサービスでよく行われるABテストの結果を元に分析を行う例を取り上げます。

### 例題: サイトAとBどちらがよりコンバージョンに繋がる？
◯求め方
1. コンバージョンの是非で０か１の２値の観測データを用意する
2. サイトABのコンバージョン率の事前分布を決める
3. サイトABのコンバージョン率の事後分布を観測データを元にサンプリングする
4. 事後分布の差を元にサイトABどちらがよりコンバージョンに繋がりそうか分析する

1. コンバージョンの是非で０か１の２値の観測データを用意する

今回は事前データを自作します。
サイトAのコンバージョン率を5%, サイトBのコンバージョン率を4%とします。（なのでこの分析の結果としてはサイトAのコンバージョン率の方が良い、という結果が得られると良い）
観測データを作成し、そのデータの平均がそれぞれ約5%と約4%であることを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217930/bb3e235f-a07c-3720-1551-bc4a2b661082.png)


2.サイトABのコンバージョン率の事前分布を決める
3.サイトABのコンバージョン率の事後分布を観測データを元にサンプリングする
今回は事前分布を0〜1の一様分布としました。
モデル化して、20,000回サンプリングを実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217930/b9c91904-9bd7-33d1-ca8f-b4555c320a43.png)

4.事後分布の差を元にサイトABどちらがよりコンバージョンに繋がりそうか分析する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217930/5d763e67-0e60-792a-3be5-070aea18bff4.png)
1番上のグラフがサイトAの事後分布で、正しい値である0.05に近い値の分布になっていることがわかります。
真ん中のグラフがサイトBの事後分布で、正しい値である0.04に近い値の分布になっていることがわかります。
1番下のグラフは、`サイトAの事後分布-サイトBの事後分布`をグラフ化したものです。
このグラフの0より小さい面積が`サイトAがサイトBより悪い確率`、0より大きい面積が`サイトBがサイトAより悪い確率`ということができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217930/3750d466-2117-1e02-b1d9-bc7667ab3d38.png)
このように、**サイトBがサイトAよりコンバージョンが悪い(サイトAよりサイトBの方がコンバージョンが良い)と83%くらいの確率で言える**という結論を得ることができました。

## まとめと今後
PyMC3を用いて実際の問題の分析をすることができました。
今回は2値の事前分布のデータ分析を行いましたが、他の確率分布についてもモデル化して推論を行なっていきたいです。
WordPressテーマを一般ファイルで使う

2018-04-04
この記事の方法では`<title>`タグが「ページが見つかりませんでした」になるので、[改訂版](https://qiita.com/cellolism/items/4d06ff73779c8da2e170)を投稿しました。

---

- ブログ的記事投稿はWordPressを使っている
- WordPressの管理画面が鬱陶しいから、静的ページは直接htmlファイルを使いたい
- だけどヘッダ、フッタ、サイドバーはWordPressのテーマを流用したい

ていう要望があった。要するに、「固定ページは静的htmlファイルでつくりたい」て要望。

案外かんたんにできたので、作業記録をここに。前提として、`.htaccess`が使えること。

# 仕組み
1. 静的htmlファイルをを作る。
1. htaccessで静的ファイルへのアクセスをレンダリング用phpスクリプトへ集める

# .htaccess
静的htmlファイルへのアクセスが後述するphpスクリプトへリライトされるようにする。

```apache:.htaccess
<IfModule mod_rewrite.c>
### WordPress 用 ####
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^index\.php$ - [L]
#####################

#### ハンドラファイル用 ####
# http://hoge.com/foo.htmlをhttp://hoge.com/foo/でアクセスさせる
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule . /render.php [L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . /render.php [L]
#######################
</IfModule>
```
要は、存在しないファイル・ディレクトリにアクセスがあった場合はWordPressに、それ以外はphpスクリプトへそれぞれ処理を任せるイメージ。

`{REQUEST_FILENAME}\.html -f`の部分はWordPressの記事とリンクの形式を合わせてみた。

# phpスクリプト

`render.php`を作成して、ドキュメントルートへ置く。静的htmlファイルへのアクセスはこのプログラムが処理する。

`wp-blog-header.php`を読み込むことで、WordPress内の一連の関数が使えるようになることを利用する。

```php:render.php

<?php
  require_once ('./wp-blog-header.php');

  $dir = dirname($_SERVER['REQUEST_URI']);
  if (strlen($dir) != 1) { # $dir == '/'の場合を考慮したけれどいらないかも
    $dir .= '/';
  }
  $file = basename($_SERVER['REQUEST_URI']);
  $filepath = dirname(__FILE__) . $dir . $file;

  $load_file = '';
  # htaccessの設定に合わせ拡張子を考慮
  if(file_exists($filepath . '.html'))
  { 
    $load_file = $filepath . '.html';
  }
  # ディレクトリへのアクセスはindexファイルを読み込む
  else if(file_exists($filepath))
  {
    $load_file = $filepath . '/index.html';
  }

  get_header();
?>

<div id="primary" class="content-area">
        <main id="main" class="site-main" role="main">

        <?php include($load_file); ?>

        </main><!-- .site-main -->

        <?php get_sidebar( 'content-bottom' ); ?>

</div><!-- .content-area -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>
```
上記はTwenty Sixteenでのテーマでの例。テーマの`page.php`の中身を参考にした。コンテンツ部分だけ`<?php include($load_file); ?>`で静的htmlファイルを読み込ませている。

プログラムが多少雑だけれど、上記の基本を抑えればいろいろいじれるんじゃないかな。
[備忘録]自作コードトレース履歴　クラス～メソッド

-------------------------------

public class 

	全てのクラスからアクセス可能

-------------------------------

extends

	クラスを継承する為の機能
	継承とはなんだろうか？
	継承をするにあたって、基本となるクラス=スーパークラス　が存在する。
	そこのクラスをそのまま使用、そして機能を付け足す事が出来る。
	それが継承という事。

-------------------------------

implements　

<書き方>
[modifier] class name implemets iname,… {definition}
modifier：修飾子
name：クラス名
iname：インターフェイス名
definition：メンバーの定義

	インタフェースをクラスに定義する機能で、1つのクラスに対して複数の実装が可能
	そもそもインタフェースとは？
	→あくまで現状の理解だと
	定数をとあるメソッドに定義する機能。
	それをクラスにて使用をするって訳。

-------------------------------

アクセス修飾師private

	そのクラスからのみアクセスが可能
	例)
	public class MainActivity extends AppCompatActivity
	private int quantity = 0;
		MainActivityクラス内のみquantity = 0という扱いになる。
		なんて感じ！！
	
-------------------------------

メソッド内で使用するfinal

	そのメソッドを持つ、クラスを継承したクラスにてメソッドをオーバーライドする事が出来なくなる。
	オーバーライドとは？
	クラス継承した際に、メソッドの内容を引き継ぎ再定義出来るという機能(なはず)

-------------------------------

メソッド内で使用するnew

	インスタンスを生成している。
	インスタンスとは？
	例)
	private final SimpleDateFormat formatter = new SimpleDateFormat("kk:mm:ss");

	SimpleDateFormatクラスの中で定義されているプログラムに
	formatter=("kk:mm:ss")を与えてあげることで、kk:mm:ss形式で時刻を表示することが出来る。

-------------------------------
RailsでHTTP APIのエラーレスポンスを "problem detail" 形式で返却する

Web API開発において、エラーをどういう形式で返却するか、というのは設計する際の悩みポイントかもしれません。エラーレスポンスの仕様の1つとして [RFC7807 Problem Details for HTTP APIs](https://tools.ietf.org/html/rfc7807) があります。

この形式をサポートしつつ Rails や Sinatra でも使える Ruby ライブラリをこの度作りましたのでそのご紹介。その名も [ProblemDetails](https://github.com/nikushi/problem_details). 

本記事では Rails での使い方について。

##  ProblemDetailsの機能概要

gem では以下の機能をサポートしています。

* RFC7807形式を実装したオブジェクトクラス
* Railsサポート: problem detail 形式でレスポンスする problem renderer 
* Sinatraサポート: problem render function

## problem details 形式とは?

実際のレスポンスは以下のようになります。`Content-Type: application/problem+json` というのが特徴的。レスポンスボディ自体はJSON形式です。type, title, detail, instance はRFCで規定された予約キー。追加で任意のキー(下の例ではbalance, accounts)も入れることは可能です。

```http
HTTP/1.1 403 Forbidden
Content-Type: application/problem+json
Content-Language: en

{
  "type": "https://example.com/probs/out-of-credit",
  "title": "You do not have enough credit.",
  "detail": "Your current balance is 30, but that costs 50.",
  "instance": "/account/12345/msgs/abc",
  "balance": 30,
  "accounts": ["/account/12345",
               "/account/67890"]
}
```

仕様の詳細はRFCか、日本語の記事では[HTTP APIの詳細なエラー情報をレスポンスに持たせるための仕様](https://www.eisbahn.jp/yoichiro/2017/01/rfc_7807.html)が詳しいです。

## Rails で problem detail 形式のエラーを返却する

### インストール

`problem_details-rails` gem をインストールしてください。

```ruby
# Gemfile

gem 'problem_details-rails'
```

### 使い方

コントローラで `render` メソッドに `problem:` オプションを渡せるようになります。 `problem:` の値は Hash にする必要があります。与えられた Hash に加え、RFCで規定された予約キーが自動的にマージされた値がエラーメッセージとしてレンダリングされます。

例えば以下の例ではバリデーションに失敗すると problem detail 形式でエラーレスポンスが返却されます。

```ruby
# app/controllers/api/posts_controller.rb

class Api::PostsController < ApplicationController
  def create
    @post = Post.new(params[:post])
    if @post.save
      render json: @post
    else
      render problem: { errors: @post.errors }, status: :unprocessable_entity
    end
  end
end
```


```http
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/problem+json; charset=utf-8

{
  "type": "about:blank",
  "title": "Unprocessable Entity",
  "status": 422,
  "errors": {
    "body": [
      "can't be blank"
    ]
  }
}
```

gem を使う便利ポイントとしては、 明示的にproblem detailで返却することがアプリケーションのコード上に宣言できている点。また、`problem:` に任意のエラーメッセージを入れるだけで problem detail 形式で適宜デフォルト値がセットされた形で返却される点です。以下の処理が自動的に行われます。


* Content-Typeがセットされる
* RFCで規定された予約キー status, type, title が自動セットされる
    * HTTPのレスポンスコードと同じ値がボディにもセットされる
    * type が自動的にセットされる(RFCで規定されているデフォルト値 `abount:blank` が入る)
    * status コードから自動で title がセットされる
* RFCで予約されていないキー(例: errors) はトップレベルのキーとしてマージされる

なお、type, title 等の予約キーは `problem: {...}` の中で明示的に指定することで上書くことは可能です。

## まとめ

problem detail　形式をサポートするライブラリ　[ProblemDetails](https://github.com/nikushi/problem_details)　の Rails での使い方を紹介しました。

Happy API life!!

## こう思う

problem details 形式の記事はサーバサイドのはあるけど、クライアントサイドの記事は見たことないなあ、、という感想で problem details を使ってどうクライアントサイドがレバレッジされてるか気になります。そしてその他のエラー形式を使っているなど、皆様どう運用されているのかな...? 気になることろです。
Play Framework 2.6 で実装編 part1

#【前置き】
一週間空いてPlayFramework実装編
前回嵌ってそもそも実装できねぇ！って状態でしたが動かす事が出来たのでぽちぽちやっていこうかと思います。

綺麗にしていなかったりwebデザインはまだ考慮してなくて張りぼてですが、時間かけてやっていこうかと思います。作ったものはgitに置いてあるのでアドバイスとか頂けると幸いです。
https://github.com/lunalice/bookmaker

要件のおさらいですが、ユーザーアカウント毎にブックマークを管理したいという事で、
必要な機能、ユーザー登録画面を作っていきます。

で、そこに行くまでにいくらかはまってしまったので備忘録を残すことにします。
①PC2台別環境で作成していて、ひとつの環境で正常に作成したものをgit登録し別環境に取り込んで動かそうとした際発生したエラー。runした際、いろんな部分でnullぽが発生して動作してくれません。

【対処】
sbt clean compileを実行。

上記対応で無事動作してくれました。
別環境から別環境に移す時に上記心当たりがないエラーが出た際はクリーンしてみるというナレッジが溜まりました。

②eclipseにプロジェクトを取り込んだ際いろんなパスが行方不明になる。

【対処】
sbt "eclipse with-source=true"を実行する。

sbt eclipseで取り込める状態にはなりますが上記コマンドを実行しないとソースがダウンロードされずに何かとeclipseが赤字をはくようになります。とりあえず上記コマンド実行しておけば間違いないと思います。

#【本編】
本編といいつつそこそこ省略しちゃいます。
面談準備とぽちぽち作ったり本読んだり、qiitaまとめたりとスキルアップに時間がかかる為定時ダッシュ出来るような環境じゃないと人は育たないですね（白目

![イメージ145.jpg](https://qiita-image-store.s3.amazonaws.com/0/241708/00a897f8-9c55-74a2-524f-df8174f6f2b8.jpeg)

作成した画面になります。
今はユーザー名とパスワードとフルネームになっていますが、パスワード再確認に二重入力にするのとフルネームはいらないかなと考えています。

mainテンプレートにナビゲート、フッター（コピーライト）、フラッシュメッセージと上下に配置してユーザー登録をセンターに配置するつもりではいますが、レイアウトは追いついていません。

課題ですが、ユーザー名はユニークではあるんですが、空白入力を許してしまっていたりしてよろしくないので対処しないといけません。動くかす事が第一優先ですが結構ヤバミなバグなので直します。

![イメージ146.jpg](https://qiita-image-store.s3.amazonaws.com/0/241708/9552e3a0-24cf-d79d-c445-e695d39963cd.jpeg)

ユーザー登録が完了した場合TOP画面に戻りフラッシュが表示されるようになってます。
正直ダサいのでレイアウトをどうにかしたいですが、機能も作らないとでこんな感じに。

今回はこんな感じ、次はログインについてまとめたいと思います。
既に課題としてセッションと一覧をどう表示するかという部分が悩ましい感じになってます。

#【後書き】
のちのちやる事とやってみたい事も視野に含めいろいろ本を買いました。
Ruby本・Ruby on rails本・PHP本
cakephp本・androidsdk本・unity with c#本
aws本・python本・django本
結構買いました。幅広すぎだろ無理じゃね？とか思われるかもしれませんが、
一日だと100％無理なので日々使って読みます。読むかつ使ってみます。
一つ言語使って最低限のプログラミングが出来てるので言語の違いは書き方の癖くらいでフレームワークがきつそうだなぁって思ってます。平日業務、転職活動、スキルアップと頑張って行きますよ！脱人売りブラック
React16 最小構成のビルド環境 browserify reactify JSXあり

# 関連記事

ビルドせずに CDN でReactを使いたい場合は、こちらの記事

・React16 CDN でHelloWorld JSXありなし両方 - Qiita
https://qiita.com/standard-software/items/0cdbcdb2a6d6355c946b

JSX無しで最小構成のビルド環境を作る場合は、こちらの記事

・React16 最小構成のビルド環境 browserify JSX無し - Qiita
https://qiita.com/standard-software/items/87c4a0dc3c67c426c31f

それぞれ参考にしてください。

# はじめに

環境は Windows 。 node.js インストール済みとします。

# インストール

今回は browserify と reactify を使います。フォルダを決めてローカルインストールします。

```
  npm init -y
  npm install --save react
  npm install --save react-dom
  npm install --save browserify
  npm install --save reactify
```

フォルダに、package.json が作られてその中身の一部はこのようになります。

```
  "dependencies": {
    "browserify": "^16.1.1",
    "react": "^16.3.0",
    "react-dom": "^16.3.0",
    "reactify": "^1.1.1"
  },
```

# ファイル

次の構成にします。決めたフォルダの中に次のファイルがある状態にしてください。

```
  index.html
  src フォルダ
    hello.jsx
  build フォルダ
    build.js
```

用意するのは、index.html と hello.jsx で、build.js は browserify によって生成されます。

```index.html
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <div id="app01"></div>
    <div id="app02"></div>
  <script src="./build/build.js"></script>
  </body>
</html>
```

```jsx:hello.jsx
const React = require('react');
const ReactDOM = require('react-dom');

class HelloWorld extends React.Component {
  render() {
    return <div>Hello World {this.props.name}</div>;
  }
}

const hwElement = <HelloWorld name="01" />;
ReactDOM.render(hwElement,
  document.getElementById('app01'));

const hwFactory = React.createFactory(HelloWorld);
 ReactDOM.render(
  hwFactory({name: '02'}),
  document.getElementById('app02')
);
```
[前の記事](https://qiita.com/standard-software/items/87c4a0dc3c67c426c31f)と比べてほんの少しだけ変化しています。


# 実行

ビルドコマンドは次のとおりです。決めたフォルダをカレントディレクトリにしてコマンド実行してください。

```
.\node_modules\.bin\browserify -t reactify .\src\hello.jsx -o .\build\build.js
```

実行結果は次のとおりになります。

```
<body>
    <div id="app01"><div data-reactroot="">Hello World 01</div></div>
    <div id="app02"><div data-reactroot="">Hello World 02</div></div>
```

これで、React の最小構成の動作確認がとれます。

# GitHub
2018/04/08追記

少しソースコードをシンプルにして次の場所に配置しました。
https://github.com/standard-software/React_Hello-World_Sample
CDN版 Reactのみ / React+JSX
Browserify版 Reactのみ / React+JSX Reactify / React+JSX Babelify
WebPack版 Reactのみ / React+JSX
これらが全て含まれています。
Ruby on Rails チュートリアル（１章）

以下のコマンドをすると何故かエラーがでてしまいました。

$ npm install -g n

結局以下のサイトからパッケージをインストールして次にすすみました。

https://github.com/tj/n

こんなことで時間がとられるのはつらい、、、
フリーSQL開発ツール【A5:SQL Mk-2】を使ってLinux上のDb2（Express-C）に接続する

業務でDb2を使っているのですが、サーバーにTeraTermでアクセスしてSQLを実行するのが面倒で。
頭に”db2”って入れないとダメだし。
なので、mk2を使ってアクセスしたい！ということでその練習をしましたので、備忘録残します。

#目次
1.まずはLinuxサーバーを準備！
2.Db2構築！（Express-C）
3.ODBCドライバの設定！
4.mk2でアクセス！

#使用環境
- ホスト：Windows 10 Home
- ゲスト：CentOS7
- DB：Db2 Express-C v11.1
- 使用アプリ①：VirtualBox 5.2.8
- 使用アプリ②：mk2 2.12.3

#1.まずはLinuxサーバーを準備！
もともとVirtualBoxにCentOS7を入れていたのですが、久々に動かそうとしたらVirtualBoxのエラーで動かせませんでした。
なので最新版のVirtualBoxを入れ直しました。
ただ、FFFTPでアクセスできず。TeraTermもつながらず。ネットワーク設定変わってる・・・。
とりあえずIPアドレス調べました。

```batch:VBoxManage
VBoxManage list hostonlyifs
```

CentOS7のネットワーク設定は、アダプタ1にNAT、アダプタ2にホストオンリーアダプタを割り当ててます。
そのホストオンリーアダプタのIPはこのコマンドで確認できます。これはホスト側かな？
そしてNATのポートフォワーディングにポート22を開けるルールを書けばTeraTerm接続は可能です。
ホストIPに先ほどのコマンドで確認したもの。ゲストIPにifconfigコマンドで確認できるenp0s8に書かれたもの。
FTPまで設定するのは面倒だったので、今回はSSHだけにしました。（SCP使います）
後々のために、50000番ポートも開けておきます。Db2にアクセスするのに使います。

ネットワーク分かりづらくて苦手です。

っていうかVBoxManageの使わなくてもWindowsのipconfigでも分かりますね。

#2.Db2構築！（Express-C）
こちらは[enterprisezine](https://enterprisezine.jp)様の記事を参考にしました。

[DB2、基本の「き」－コマンド環境を使ったインストールから手動セットアップまで。](https://enterprisezine.jp/dbonline/detail/4131)

データベースSAMPLEを作成するまでの道のりを丁寧に説明していただいております。（バージョン違うけど）
注意点としては、応答ファイルを作成する箇所があるのですが、そのページの最後にある応答ファイルの例を使って方が良いかもしれません。
（groupaddですでに番号が使われていたりしました。）
（db2 update xxxxxっていうコマンドはsu - db2inst1してから使うみたいです。）
（多分細かいところでつまずいていたみたいです。）

#3.ODBCドライバの設定！
これは[symfo](https://symfoware.blog.fc2.com)様の記事を参考にしました。

[DB2 10.5 ODBCドライバーのインストールと接続設定](https://symfoware.blog.fc2.com/blog-entry-1327.html)

バージョンは違いますが、基本的に同じです。
注意点としては、途中ODBC設定のところでユーザーにAdministratorと設定するところがありますが、上手くいかず、db2inst1を設定したところ、上手くいきました。Db2の偉いユーザーを入れればいいのかな？

#4.mk2でアクセス！
こちらは[FreeBSD あれこれ](https://freebsd.sing.ne.jp)様を参考にしました。

[3.　データベース - A5:SQL Mk2 - IBM DB2 への接続](https://freebsd.sing.ne.jp/db/07/03.html)

注意点としては、設定方法が若干異なることです。
mk2の設定画面で、Db2のドライバを選択してから、「次へ」を押すと、「詳細」タブに飛びます。
参考ページでは「接続」タブになってましたが。
「詳細」タブの設定は次のようにすればOKでした。

- DataSorce：接続するデータベース名
- Location：1のコマンドで確認できるIPアドレス
- Password：db2inst1のパスワード
- UserID：db2inst1

#お疲れ様でした
以上でセットアップから接続まで完了です。
僕自身よく分かっていない箇所もあります。後々あれはこういうことか！と気づけたらいいなと思います。
御教示いただける方、ぜひコメントお願いします・・・。

###参考文献（閲覧日：2018/03/31）
[Oracle VM VirtualBox(R) User Manual](http://download.virtualbox.org/virtualbox/UserManual.pdf) - Oracle Corporation
[DB2、基本の「き」－コマンド環境を使ったインストールから手動セットアップまで。](https://enterprisezine.jp/dbonline/detail/4131) - enterprisezine.jp
[DB2 10.5 ODBCドライバーのインストールと接続設定](https://symfoware.blog.fc2.com/blog-entry-1327.html) - symfo
[3.　データベース - A5:SQL Mk2 - IBM DB2 への接続](https://freebsd.sing.ne.jp/db/07/03.html) - FreeBSD あれこれ
インターリンクの マイIP（PPTP版）に Arch Linux で接続

インターリンクの次のサービスに Arch Linux で接続する方法です。
[Linux（CentOS）＋ルータ経由 の設定　■マイIP■ ](https://faq.interlink.or.jp/faq2/View/wcDisplayContent.aspx?id=754)

Arch Linux の参考ページ
[PPTP クライアント](https://wiki.archlinux.jp/index.php/PPTP_%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88)

PPTP クライアントのインストール

```bash
sudo pacman -S pptpclient
```

トンネルの作成 (トンネルの名前は my_tunnel)

```bash
sudo pptpsetup --create my_tunnel --server myip12.interlink.or.jp--username mi12345 --password foo --encrypt
```

接続

```bash
sudo pon my_tunnel debug dump logfd 2 nodetach
```

>ppp0 が出来ていることを確認

```bash
ip addr
```

>ルーティングテーブルの修正
>>default を、ppp0 にします。

```bash
sudo ip route del default
sudo ip route add default via  219.5.18.1 dev ppp0
```

>ルーティングテーブルの確認

```bash
ip route
```

RDP のクライアントソフトは、Remmina を使いました。
Ruby on Rails チュートリアル

webアプリを開発してみたかったので、Ruby on Railsを以下のサイトで勉強してます。
https://railstutorial.jp/chapters/beginning?version=5.1#cha-beginning

内容は以下のようになってます。

１章　ゼロからデプロイ
２章　Toyアプリケーション
３章　ほぼ静的なページの作成
４章　Rails風味のRuby
５章　レイアウトを作成する
６章　ユーザーのモデルを作成する
７章　ユーザー登録
８章　基本的なログイン機構
９章　発展的なログイン機構
１０章　ユーザーの更新・表示・削除
１１章　アカウントの有効化
１２章　パスワードの再設定
１３章　ユーザーのマイクロポスト
１４章　ユーザーをフォローする

作業予定としてはこんな感じ
４月　１〜４章
５月　５〜７章
６月　８〜１０章
７月　１１〜１４章
React16 最小構成のビルド環境 browserify JSX無し

# 関連記事

ビルドせずに CDN でReactを使いたい場合は、こちらの記事

・React16 CDN でHelloWorld JSXありなし両方 - Qiita
https://qiita.com/standard-software/items/0cdbcdb2a6d6355c946b

JSXありで最小構成のビルド環境を作る場合は、こちらの記事

・React16 最小構成のビルド環境 broserify reactify JSXあり - Qiita
https://qiita.com/standard-software/items/781ec3f491f4f1bea7b6

それぞれ参考にしてください。

# はじめに

最小構成の React 16 のビルド環境を作ります。

環境は、Windows 。 node.js インストールしておいてください。

# インストール

今回は browserify を使います。フォルダを決めてローカルインストールします。

```
  npm init -y
  npm install --save browserify
  npm install --save react
  npm install --save react-dom
```

フォルダに、package.json が作られてその中身の一部はこのようになります。

```
  "dependencies": {
    "browserify": "^16.1.1",
    "react": "^16.3.0",
    "react-dom": "^16.3.0",
```

# ファイル

次の構成にします。決めたフォルダの中に次のファイルがある状態にしてください。

```
  index.html
  src フォルダ
    hello.js
  build フォルダ
    build.js
```

用意するのは、index.html と hello.js で、build.js は browserify によって生成されます。

```index.html
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <div id="app01"></div>
    <div id="app02"></div>
  <script src="./build/build.js"></script>
  </body>
</html>
```

```js:hello.js
const React = require('react');
const ReactDOM = require('react-dom');

class HelloWorld extends React.Component {
  render() {
    return React.createElement('div', null, `Hello World ${this.props.name}`);
  }
}

const hwElement = React.createElement(HelloWorld, {name: '01'}, null);
ReactDOM.render(
  hwElement,
  document.getElementById('app01')
);

const hwFactory = React.createFactory(HelloWorld);
 ReactDOM.render(
  hwFactory({name: '02'}),
  document.getElementById('app02')
);
```

# 実行

ビルドコマンドは次のとおりです。決めたフォルダをカレントディレクトリにしてコマンド実行してください。

```
.\node_modules\.bin\browserify .\src\hello.js -o .\build\build.js
```

実行結果は次のとおりになります。

```
<body>
    <div id="app01"><div data-reactroot="">Hello World 01</div></div>
    <div id="app02"><div data-reactroot="">Hello World 02</div></div>
```

# GitHub
2018/04/08追記

少しソースコードをシンプルにして次の場所に配置しました。
https://github.com/standard-software/React_Hello-World_Sample
CDN版 Reactのみ / React+JSX
Browserify版 Reactのみ / React+JSX Reactify / React+JSX Babelify
WebPack版 Reactのみ / React+JSX
これらが全て含まれています。
Scalaで素数のサンプル

少し古いが[こちら](https://www.scala-lang.org/old/node/47.html)を参考に。

```
Scala 2.12.4
```

```scala
object PrimeNumber {
  // 約数を求める
  def divisors(n: Int): List[Int] =
    for (i <- (1 to n).toList if n % i == 0) yield i

  // 約数が2のときは素数
  def isPrime(n: Int): Boolean = divisors(n).lengthCompare(2) == 0

  // 与えられた整数までの素数のリストを返す
  def findPrimeUntil(n: Int): Iterable[Int] = {
    for (i <- 1 to n if isPrime(i)) yield i
  }

  def main(args: Array[String]) {
    val l = findPrimeUntil(30)
    println(l)
  }
}
// Vector(2, 3, 5, 7, 11, 13, 17, 19, 23, 29)
```
VSCode インデントの設定

VSCodeのインデントがコピペでぐちゃぐちゃになりかけた人用

## インデントの設定
ユーザ設定で[settings.json]を編集

```json:settings.json
"editor.tabSize": 4
```
作業ディレクトリの設定は、完了

右下のバーの
<img width="550" alt="スクリーンショット 2018-04-01 20.58.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/205341/1e71bf62-43f7-6b06-666f-de1253be0dd1.png">
「スペース」の値でインデント数を確認。

これでもインデントが変更しない場合は、
全てのインデントを消して一旦切り取り、
ファイルを閉じて再度開くと
「スペース」の値が変わったと思います。
そこで貼り付けすれば良いです。

また、自動インデントも追記しておきます。
## 自動インデント
名前：Format Document

ショートカット

- Windows [Shift] + [Alt] + [F]
- Mac [Shift] + [Alt] + [F]
- Ubuntu [Shift] + [Ctrl] + [I]
Node.jsでハマったことまとめ

# Node.jsでハマったことまとめ


## 初期設定

### package.jsonの作成に失敗する（Windows）

　package.jsonの作成手順は以下の通りなのですが、エラーが出てpackage.jsonが作成できないことがあります。
　WindowsのC:\ドライブ直下にファイルが作れないのが原因。コマンドプロンプトを管理者として実行することで回避できます。

```cmd:作成失敗例
C:\>npm init

（中略）

package name: package_list
version: (1.0.0) 0.0.0
description:
entry point: (index.js)
test command:
git repository:
keywords:
author: fummimix
license: (ISC)
About to write to C:\package.json:

（中略）

Is this ok? (yes)
npm ERR! path C:\package.json
npm ERR! code EPERM
（以下略）
```


## モジュール関連

### モジュールを外部ファイルから呼び出す
[node\.jsで外部ファイルのJavaScriptを呼び出す \- Node\.js/JavaScript入門](http://kaworu.jpn.org/javascript/node.js%E3%81%A7%E5%A4%96%E9%83%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AEJavaScript%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99)

### HTTP/HTTPSリクエストを楽にやりたいので、requestモジュールを使いたいのだが……

　requestモジュールを入れないと当然ながら使えないので、"npm install request"してから使いましょう。requestを使うことでGET/POSTがかなり楽にできるので入れておくと良いです。

```cmd:エラー例
C:\node>node app.js
module.js:545
    throw err;
    ^

Error: Cannot find module 'request'
（以下略）
```

```cmd:インストール例
C:\>npm install request
npm WARN package_list@0.0.0 No description
npm WARN package_list@0.0.0 No repository field.

+ request@2.85.0
added 1 package in 1.876s
```

### node.jsでjsonファイル読み込んだらキャッシュされて困った
　常にキャッシュなしで読み込む場合は、fs.readFileSyncを使う。[^NCH]


## 制御

### 特定の処理を一定間隔でやりたい
　while(1) {}と自作のsleep関数で……いやいやsetIntervalが便利ですね！！[^c5e]

```javascript:30秒おきに特定のURLのBodyを取ってくる例
var webclient = require("request");

setInterval(function () {
  webclient.get({
    url: "（対象のURL）",
  }, function (error, response, body) {
    console.log(body);
  });
}, 3000);
```



## 参考文献

- [npmでnode\.jsのpackageを管理する \- Qiita](https://qiita.com/sinmetal/items/395edf1d195382cfd8bc)
- [初期化処理を行う！npm initの使い方【初心者向け】](https://techacademy.jp/magazine/16151)
- [Node\.js で HTTP/HTTPS リクエスト を行う方法 \- galife](https://garafu.blogspot.jp/2017/05/node-http-httpss-request.html)


[^c5e]: [Node\.jsで定期的に実行 \- Qiita](https://qiita.com/tq_jappy/items/c5ebfdb30dc90617414f)
[^NCH]: [node\.jsで常にキャッシュなしでjsonファイルを読み込む方法](http://www.mpon.me/entry/2014/03/10/001214)
[MQL5]全チャートの時間足を変更するショートカットを追加するスクリプト

```
//+------------------------------------------------------------------+
//|                                           AdditinalShortCuts.mq5 |
//|                                Copyright 2018, Shintaro Tanikawa |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Shintaro Tanikawa"

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
  if (id == CHARTEVENT_KEYDOWN)
  {
    ENUM_TIMEFRAMES timeframes = GetTimeFramesByKey(lparam);
    if (timeframes != -1)
    {
      long chartId = ChartFirst();
      for (int i = 0; i < CHARTS_MAX; ++i)
      {
        if (ChartPeriod(chartId) != timeframes)
        {
          ChartSetSymbolPeriod(chartId, ChartSymbol(chartId), timeframes);
        }
        chartId = ChartNext(chartId);
      }
    }

  }
}

ENUM_TIMEFRAMES GetTimeFramesByKey(const long &key)
{
  switch (key)
  {
    case 49: // Pressed Key 1
      return PERIOD_M1;
    case 50: // Pressed Key 2
      return PERIOD_M5;
    case 51: // Pressed Key 3
      return PERIOD_M15;
    case 52: // Pressed Key 4
      return PERIOD_M30;
    case 53: // Pressed Key 5
      return PERIOD_H1;
    case 54: // Pressed Key 6
      return PERIOD_H4;
    case 55: // Pressed Key 7
      return PERIOD_D1;
    case 56: // Pressed Key 8
      return PERIOD_W1;
    case 57:
      return PERIOD_MN1;
    default:
      return -1;
  }
}
//+------------------------------------------------------------------+
```
Julia を使って計算の高速化

# 経緯

これまで Python で小規模な数値計算をやってきたが、

- 高速らしい
- 可視化も良さそう

なので Julia を試してみる

# インストール

JuliaPro （ディストリビューション）
https://juliacomputing.com/products/juliapro.html
Personal は無料、要ユーザー登録

インストール後、 anaconda の Jupyter notebook を起動すると Julia のカーネルが利用できるようになっている

```julia:REPL
Pkg.update()     # けっこうかかる
Pkg.add("Plots") # 可視化、フロントエンド
Pkg.add("GR")    # 可視化、バックエンド
```

# 基本的なこと

- （コンマかセミコロンで区切った）一次元配列は縦ベクトル
- 1-origin
- 配列入力に対してはドット（自動的にブロードキャストされる） `sin.( [1, 3, 7] )`


Julia言語で計算が遅くなった場合の解決法
http://nbviewer.jupyter.org/gist/genkuroki/1ac59bb3e03eac12945d7040d4f98246

## 引数渡しの挙動

- 配列はポインタ（参照？）渡し
- 引数が変更される関数には！をつける

実は NumPy でも同じだが、これまで気づいていなかった

```julia

# 数字
function f(x)　　　# コピーが渡される
    x += 100　  # コピーに変更を加える
end

x = 1
f(x)
x           　　　　# 1 呼び出し元は変更されない

# 配列
function g!(arr)　　　　# アドレス（のコピー？）が渡される
    arr[:] += 100　　# 呼び出し元に変更を加える
end

arr = [1]
g!(arr)
arr         　　　　　　　　　　　　# [101] 呼び出し元が変更されている
```

## 関数は遅延評価

これも Python と同じ（だが、以下略）

```julia
a = 1
return_a() = a    # 関数の短い書き方

a = 2
return_a()        # 2
```

# 様々な実装と処理時間

KdV 方程式 t=1.2 まで計算
Walkley Scheme, Δt = 1e-5
![kdv.png](https://qiita-image-store.s3.amazonaws.com/0/202534/5fcf0c83-1508-e37b-1129-450d0536ce8b.png)

|言語|処理時間|倍率|  詳細 |
|:-:|--------:|:-:|:------------------|
|Python|19 sec|1.0x| NumPy　convolve[^kdv_np] |
|Julia| 50 sec|0.4x| デフォルトの conv     |
|Julia| 7.0 sec |2.7x| FastConv[^fastconv] |
|Julia| 5.6 sec |3.4x| FastConv + 関数化 |
|Julia| 2.9 sec |6.6x| FastConv + 関数化 + 型指定　|
|Julia| 3.1 sec |6.1x| ベクトルの内積 |
|Julia| 230 ms |82x| for文 |
|Julia| 92 ms |206x| for文 + SIMD |

[^kdv_np]: https://qiita.com/Lirimy/items/5f598fb8eeaf83924caa
[^fastconv]: https://github.com/aamini/FastConv.jl
cocos2d-xの動作環境を作ろうとした時にぶつかった問題達

### 環境

- Windows10 (Fall Creators Update)
- Surface Pro (2017年モデル)
- Android Studio 3.1
- cocos2d-x 3.16

### 発生した問題達

原因が特定出来ていない物もあるけど時系列で発生した内容と回避策をメモ。

#### ビルド時にエラーが出る

- 以下、Android Studio上でのビルド及び、cocos compile コマンドの両方で同じ状態だった
- Android Studioでインストール出来るNDK(16.1)だと問題がある?模様
    - Webで調べて動作実績があるNDK(r10e)を別ディレクトリに入れてそちらを使うように変更
    - **(2018/04/03追記) その後諸々確認した所、最新のNDK 16.1でも問題無かったようです。後述のパス名が長すぎる件及び、ABIとしてx86が無かったことが原因だったようです。**
- NDK(r10e)でもJNI配下の〜main.o.d が見つからないというエラーが出る
    - cocos2d-xのプロジェクトを配置していたパス名が長すぎた(70文字程度)模様
    - c:¥cocos¥test みたいなディレクトリにプロジェクトを移動してビルドしたら解決した
        - エラーログに表示されていたパスが妙に長かったので変更してみたら通った

#### Android Studioからの実行時にエラーが出る

- INSTALL_FAILED_NO_MATCHING_ABIS とのエラーが出る
    - 自分が用意していたAVDのCPUがarm系ではなくx86系だった
    - gradle.properties と Application.mk でABIに関する設定に"x86"を追加して再ビルド

#### AVD上で表示が真っ黒になる

- 起動したエミュレータ上で何も表示されない
    - アプリ自体はちゃんとAVD上にデプロイされて実行されている模様
    - ログにGLES_V2系のエラーが出ている
    - AVDの「Graphincs」が「Automatic」か「Hardware - GLES2.0」だと発生する模様
    - 「Software - GLES2.0」を選択すれば表示は出来るようになる(但し速度が全然出ない)
        - Surface ProのGPUのせい?詳細は深追いしてない。
    - Genymotionなら問題なく表示出来るようなのでAVDではなくそちらを利用した方が良さそう
- とは言え、やっぱりAndroid実機でUSBデバッグしてしまった方が速度とか諸々有利そう
Raspberry Pi 3 AI実装: Deep Learningによるリアルタイムキャプション生成と音声発話

[![](https://img.youtube.com/vi/ZksVPw-LPbw/0.jpg)](https://www.youtube.com/watch?v=ZksVPw-LPbw)

Raspberry Pi3にディープラーニングを実装し、カメラ映像からリアルタイムにキャプションを生成・発話するトイガジェットを作りました。
生成されるキャプション文章の品質はまだまだ改善の余地ありのレベルではありますが、Raspberry Piのような小型PCでもここまでできるというご参考としてもご覧いただければと思います。

セットアップついての詳細はGitHub repoに掲載しております。
https://github.com/yoshihiroo/programming-workshop/tree/master/image_captioning_and_speech

また、当プロジェクトでは、Indiana Universityの筒井氏の[ソースコード](https://github.com/apple2373/chainer-caption)をご本人のご了承のもとで使用しています。同氏による関連論文[Using Artificial Tokens to Control Languages for Multilingual
Image Caption Generation: arXiv:1706.06275](https://arxiv.org/abs/1706.06275)についても合わせてご参照ください。
windowsからMacに移行するときの文字コードに関するメモ

windowsからmacに移行するとき、Javaファイルの文字コードがsjisだとMacでコンパイルエラーになります。

Mac用にファイルを変換する手順をまとめておきます。

# NKFのインストール

nkfで検索します。
多分、ベクターからダウンロードできます

# 使い方
nkf -wLm --overwrite **/*.java
Mac用の改行コードで、Utf8に変換
ですが、カレントフォルダのファイルしか変換されません(多分)

# カレントフォルダ以下の全フォルダで変換する
windowsではバッチファイルで対応します
for /r %%i in (*.java) do nkf -wLm --overwrite %%i

%%iがファイル名のフルパスとなります。
使う前に一応調べてから使ってください。
Raspberry PiにGo言語をインストールする

# はじめに
Raspberry PiにGo言語をインストールする手順について簡単にまとめました。
Go言語をインストールすることでGo言語で書かれたプログラムを使うことができます。

## Go言語とは？
[Go言語](https://ja.wikipedia.org/wiki/Go_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))はGoogleによって開発されているプログラミング言語の一つです。
UNIX、Linux、Windows等各種プラットフォームで動作します。実用例としては、Dockerは殆どGo言語でコーディングされているようです。

- [Go言語公式サイト](https://golang.org/)
![スクリーンショット 2018-04-01 19.24.13.png](https://qiita-image-store.s3.amazonaws.com/0/221759/baa3f7e9-ea72-e7c7-a091-b0431eaf0f47.png)

### Go言語のインストール
Raspberry PiにGo言語をインストールする場合はリポジトリからは取得できないので、wget等を利用しパッケージをダウンロードします。ダウンロード後は展開するだけです。

**※本記事のコマンドの左に記載している"$"は、プロンプトを意味しています**

- パッケージの取得　※Raspberry PiのCPUアーキテクチャに合わせてarmを選択
`$ wget https://golang.org/dl/go1.10.1.linux-armv6l.tar.gz`

- パッケージの展開　※本記事の例ではパッケージの展開先はデフォルト
`$ sudo tar -C /usr/local -xzf go1.10.1.linux-armv6l.tar.gz`

- インストール確認
`$ ls -l /usr/local/go`

- バージョン確認
`$ cat /usr/local/go/VERSION`

### Go言語の設定
インストールしただけではパスが通ってないため、Go言語のパスを通します。

- パスの追加　   
`$ vi ~/.bashrc`


```bash
# Go言語のPATHを通すためファイル末尾に以下を追記
export PATH=$PATH:/usr/local/go/bin
```

- パスの確認
`$ echo $PATH`
`$ which go`

- パスの有効化
`$ source .bashrc`

### Go言語の動作確認
Go言語が動くか簡単にテストします。

- テスト用プログラムの作成   
`$ vi hello.go`

```go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
```

- 直接実行する場合   
`$ go run hello.go`

![スクリーンショット 2018-04-01 19.08.54.png](https://qiita-image-store.s3.amazonaws.com/0/221759/03393277-b8a2-16d6-26c7-7ca1777634c4.png)

- ビルドして実行する場合   
`$ go build hello.go`  
`$ ./hello`

![スクリーンショット 2018-04-01 19.15.25.png](https://qiita-image-store.s3.amazonaws.com/0/221759/f2f3f06e-09da-1bf3-41d6-df965a993244.png)


## おわりに
Raspberry PiやPythonと相性がいいことや、これからきそうなので、少しずつ勉強していきたいです。

**Let's Go**

### 参考
- [Go言語ダウンロード](https://golang.org/dl/)
- [Go言語インストール](https://golang.org/doc/install)
- [Go言語リポジトリ](https://github.com/golang/go)
Ruby 正規表現について

#はじめに
正規表現（主にRuby）とは何か、について調べたことをここにまとめます。

##正規表現とは

色々調べてみた中で私なりに、
**たくさんある文字列の中からある一定のパターンで記述されている文字列を探し出すための表現**
ということなのかな、と理解しました。

###Rubyにおける正規表現

正規表現は英語でRegular Expressionと言い、Rubyでは**Regexpクラス**というものが正規表現を扱うためのクラスになります。
また、正規表現と組み合わせて使えるStringクラスのメソッドがいくつかあり、今回は下記2つのメソッドについて簡単な使い方を実践しながらまとめてみました。

##gsub

**第一引数の正規表現にマッチした文字列を第二引数の文字列で置き換える**

- 「1+10-100」という文字列の「+」と「-」を「,」に置き換えてみたいと思います。

ここで使った//の中が正規表現となっており、「｜」はメタ文字[^1]で“または”という意味。
また、「+」は文字列での「+」を表したいのですが、これもメタ文字で“直前の文字やパターンが1回以上連続する”という意味を持っているため、そのまま書くとメタ文字として扱われてしまいます。
そのため、直前に「\」を付けることによってエスケープ[^2]させています。

```sample.rb
str = '1+10-100'
str.gsub(/\+|-/,',')
#=> 1,10,100
```

## [],slice

**正規表現にマッチする部分を抜き出す**

- 「誕生日は2000年12月31日です」という文字列から[]を使って生年月日だけ抜き出します。

前述の通り、//の中身が正規表現で、「\d」は“半角数字1文字”を、「+」は“直前の文字やパターンが1回以上連続する”という意味を持っています。

```sample.rb
str = '誕生日は2000年12月31日です'
str[/\d+年\d+月\d+日/] 
#=> 2000年12月31日
```

- 「私のメールアドレスはaddress_0123＠mail.comです」という文字列からsliceを使ってメールアドレスの部分だけ抜き出します。（メールアドレスの部分がリンクになってしまうのでここでは＠を全角にしました。）

「\w」は半角英数字と「_」を表します。
「.」は“任意の1文字”というメタ文字なので「\」でエスケープしています。

```sample.rb
str1 = '私のメールアドレスはaddress_0123@mail.comです'
str1.slice(/\w+@\w+\.\w+/) 
#=> address_0123@mail.com
```

- 「今日の運勢は大吉です！」という文字列の今日の運勢にあたる部分だけをsliceを使って抜き出します。ただし運勢の部分は文字数が変わります。

()でキャプチャする部分を指定し、第二引数で何番目かを指定することでその部分だけを抜き出すことができる。


```sample.rb
str2 = '今日の運勢は大吉です！'
str2.slice(/今日の運勢は(.+)です！/,1)
#=> 大吉
```

##まとめ

初めて正規表現という言葉を調べた時はよくわからなくて飛ばしてしまったのですが、今回改めて調べてみることで、使い方によってはとても便利なものなのだと感じました。
今後も少しずつ理解を深めていきたいと思います。

[^1]: 正規表現において、特別な意味を持つ文字のこと
[^2]: エスケープさせることによりメタ文字の特殊動作を無効にする
Go言語でAWKを作ってみました

Go言語の勉強目的で、昔色々とお世話になったAWKの基本機能を作ってみました。
Go言語の特徴としてコンパイルしてコマンド化することができたり、Go言語の豊富なライブラリが使えたりします。

AWKって何？という方のために簡単に説明しますと、入力ファイルや標準入力から１行ずつ文字列を読み込んで、アクションと呼ばれる処理に定義されているパターンにマッチしたらその処理が実行されるような簡易的なプログラミング言語です。簡易的とはいえ上手く使うと様々なテキスト処理が簡単にできます。　AWKは歴史のある言語でサンプルも豊富に見つけることができると思いますので、気になった方はぜひ探してみてください。

以下は簡単なサンプルで、カンマ区切りで数字が並んでいるテキストファイルを読み込んで、最後に合計値を出力するものです。

sample.txt

```
10,20,30
40,50,60
```

実行してみます。

```bash
$ go run sample.go -i sample.txt
Execute Begin
sample.txt
Execute Action1
Input file is processed one by one per line, then the text is splitted with field separator
"10"
"20"
"30"
Execute Action2
The text 10,20,30 matched with the patten .*20.*
Execute Action1
Input file is processed one by one per line, then the text is splitted with field separator
"40"
"50"
"60"
Execute Action2
Execute End
Sum of the input is 210
```

こちらはソースコードです。

```golang
package main

import (
	"fmt"
	"github.com/hideshi/goawk"
	"regexp"
	"strconv"
)

func Begin(app *goawk.App) {
	fmt.Println("Execute Begin")
	fmt.Println(app.Filename)
}

func Action1(app *goawk.App) {
	fmt.Println("Execute Action1")
	fmt.Println("Input file is processed one by one per line, then the text is splitted with field separator")
	for _, elem := range app.S[1:] {
		fmt.Printf("%#v\n", elem)
		v, err := strconv.Atoi(elem)
		if err != nil {
			fmt.Println(err)
		} else {
			app.VI["sum"] = app.VI["sum"] + v
		}
	}
}

func Action2(app *goawk.App) {
	fmt.Println("Execute Action2")
	pattern := ".*20.*"
	matched, _ := regexp.MatchString(pattern, app.S[0])
	if matched == true {
		fmt.Printf("The text %s matched with the patten %s\n", app.S[0], pattern)
	}
}

func End(app *goawk.App) {
	fmt.Println("Execute End")
	fmt.Printf("Sum of the input is %d\n", app.VI["sum"])
}

func main() {
	app := new(goawk.App)
	actions := []goawk.Action{Begin, Action1, Action2, End}
	app.Run(actions)
}
```
Optionalの使い方

久し振りにjava使い始めたのでjava8の新機能おさらいがてらの備忘録。

# Optinal

## Optinal.ofNullable, .of(Optinal<T> t), .empty

ofNullableが便利そう。

```sample.java

Optinal<String> _name;

public Optinal<String> getName(){
    return this._name;
};

public void setName(String name){
    // this._name = (name != null) 
    // ? Optional.of(name) 
    // : Optinal.empty;
    this._name = Optinal.ofNullable(name);
}

```

## isPresent, get, ifPresent

ifPresentが便利そう。

```sample2.java

public void print(Optinal<String> optinalName){
    // if(optinalName.isPresent()){
    //     SYstem.out.print(optionalName.get());
    // }
    optinalName.ifPresent(name -> System.out.print(name));
}

```
Rust by Examples のお勉強 - Hello World

[Rust by Examples - Hello World](https://rustbyexample.com/hello.html) を読んで、自分が重要だと思った点をまとめます。

## string formatting のコツ

*   `{:b}`で 2 進数表示（実際は`std::fmt::Binary`が適用されるだけ）
*   `{:03}`で 3 ケタまで 0 で padding できる
*   `{:03b}`のように組み合わせることもできる
*   `{.5}`で小数点以下 5 ケタまで表示する

## `std::fmt::Debug` vs. `std::fmt::Display`

`std::fmt::Debug` は全ての型に使える。`{:?}`を使って format する。

一方、自分で実装した型には自分で`std::fmt::Display`を実装する必要がある。これは`{}`を使って format する。ユーザー側としては、`{}`を使っていれば良いはず。

## `std::fmt::Display`の実装

```rust
use std::fmt;

struct Color3u { r: u8, g: u8, b: u8 }

impl fmt::Display for Color3u {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "({0}, {1}, {2})", self.r, self.g, self.b)
    }
}

impl fmt::LowerHex for Color3u {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "(0x{0:x}, 0x{1:x}, 0x{2:x})", self.r, self.g, self.b)
    }
}

struct RevIntList(Vec<i32>);

impl fmt::Display for RevIntList {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "[")?;
        for (index, value) in self.0.iter().rev().enumerate() {
            if index > 0 {
                write!(f, ", ")?;
            }
            write!(f, "{}", value)?;
        }
        write!(f, "]")
    }
}

fn main() {
    let c = Color3u { r: 255, g: 100, b: 50 };
    println!("{0} = {0:x}", c);

    let ril = RevIntList(vec![1, 2, 3, 4, 5]);
    println!("{}", ril);
}
```

*   `fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result`を実装すること。
*   `write!`は`fmt::Result`を返すので、最後の`write!`はそのまま、それまでの`write!`は`?`を使うとエラー処理が楽になる。`result?`は`result`が`Err(err)`だったら関数から`Err(err)`を返し、`Ok(val)`だったら`val`と評価される。
*   `{:x}`だと`fmt::LowerHex`だったり、`{:b}`だと`fmt::Binary`だったりと、formatter にも色々種類がある。それぞれの種類の trait を実装すると、このように使える。
*   `struct Aggregate(u64, u64, u64)`など data point に名前がない struct の場合、`self.0`、`self.1`、`self.2`のようにして指示できる。