OmniAICreator/Qiita-1.07M huggingface dataset:
DXライブラリで色コードを使う

色コード調べてるうちに色コード使ってGetColor関数使えたらいいなとか思い始めて作ってみました。

```cpp:color.cpp
#include "DxLib.h"
#include <string>
#include <stdexcept>
unsigned int GetColor(const std::string& code) {
	if (code.size() != 7 || '#' != code.at(0)) throw std::runtime_error("色コードが不正です。");
	auto change_str_to_num = [code](const size_t start) {
		return std::stoi(std::string(code.begin() + start, code.begin() + start + 2), nullptr, 16);
	};
	return DxLib::GetColor(change_str_to_num(1), change_str_to_num(3), change_str_to_num(5));
}
```

もう少しきれいに書きたいという気持ちがあるので現在も改良中です。
Mapboxで建物の3D表示ができるみたいなので、軽く触ってみた

Mapboxで建物の3D表示ができるみたいなので、軽く触ってみました＼(^o^)／
※建物の3D表示については、[こちら](https://www.mapbox.com/blog/3d-features-in-mapbox-gl-js/)の記事に詳しく書かれています。


## 3D描画

```html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Display buildings in 3D</title>
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
    <script src="https://api.tiles.mapbox.com/mapbox-gl-js/v0.26.0/mapbox-gl.js"></script>
    <link href="https://api.tiles.mapbox.com/mapbox-gl-js/v0.26.0/mapbox-gl.css" rel="stylesheet" />
    <style>
        body { margin:0; padding:0; }
        #map { position:absolute; top:0; bottom:0; width:100%; }
    </style>
</head>
<body>

<div id="map"></div>
<script>
mapboxgl.accessToken = 'APIとーくん';
var map = new mapboxgl.Map({
    style: 'mapbox://styles/mapbox/light-v9',
    center: [139.766247, 35.681298],
    zoom: 16,
    pitch: 45,
    bearing: -17.6,
    container: 'map'
});

map.on('load', function() {
    map.addLayer({
        'id': '3d-buildings',
        'source': 'composite',
        'source-layer': 'building',
        'filter': ['==', 'extrude', 'true'],
        'type': 'fill',
        'minzoom': 16,
        'paint': {
            'fill-color': '#42A5F5',
            'fill-extrude-height': {
                'type': 'identity',
                'property': 'height'
            },
            'fill-extrude-base': {
                'type': 'identity',
                'property': 'min_height'
            },
            'fill-opacity': .6
        }
    });

});
</script>

</body>
</html>
```

![agagas.png](https://qiita-image-store.s3.amazonaws.com/0/53996/31a64be1-ec87-7f8f-c697-0d8115267e00.png)

## 色の変更

建物の色は、`paint`の`fill-color`を設定すると変更できます。

```js
 'fill-color': '#42A5F5'
```

## 光の調整

全体の光の調整とかは、`setLight`を使うと変更できます。

```js
map.on('load', function() {
    map.setLight({color: "#42A5F5", intensity: 0.8, position: [1.15, 135, 145]});
    map.addLayer({
        'id': '3d-buildings',
        //以下略
```

![screencapture-localhost-3000-1477228177506.png](https://qiita-image-store.s3.amazonaws.com/0/53996/59e14acd-6a98-8590-6df7-65fcabb79ecc.png)


## まとめ

APIについては、こちらに詳しく書かれています。
https://www.mapbox.com/mapbox-gl-js/api/


あ！　
Mapboxはnpmやyarnでも入れることができます(^O^)v

```
npm install --save mapbox-gl
```

```
yarn add mapbox-gl
```
VPNコネクションの確認 (東京)

マネージメントコンソール (VPC 東京リージョン)
=============================================

https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1#vpns:

* トンネル詳細(タグ)

  * 2つのVPNトンネルのステータスが'UP'になっていればOKです。
VyOSの設定 (EC2: Oregon)

この手順は、Lambda関数「vpn-conn-monitor」の検証用手順です。

正しいネットワーク疎通には、この他にも設定が必要になります。


# VyOSでの作業

```bash:コマンド:
configure
```

```text:結果:
   [edit]
```

* ダウンロードしたファイルの ! で始まる行以外を貼り付けます。

```bash:コマンド:
commit
```

```text:結果:
   [ vpn ]
   Warning: Local address ggg.ggg.ggg.ggg specified for peer "xxx.xxx.xxx.xxx"
   is not configured on any of the ipsec-interfaces and is not the
   clustering address.  IPsec must be re-started after address
   has been configured.

   Warning: Local address ggg.ggg.ggg.ggg specified for peer "xxx.xxx.xxx.xxx"
   is not configured on any of the ipsec-interfaces and is not the
   clustering address.  IPsec must be re-started after address
   has been configured.
```

以下の行のグローバルアドレス(ggg.ggg.ggg.ggg)をプライベートアドレスに書き換えます。

```bash:コマンド(例):
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx local-address 'ggg.ggg.ggg.ggg'
set vpn ipsec site-to-site peer yyy.yyy.yyy.yyy local-address 'ggg.ggg.ggg.ggg'
```

- ggg.ggg.ggg.gggをVyOSインスタンスのプライベートアドレスに書き換えます。
- xxx.xxx.xxx.xxxとyyy.yyy.yyy.yyyは書き換えないでください。


プライベートアドレスは、下記で確認できます。

```bash:コマンド:
ip addr |grep eth0
```

再度コミットします。

```bash:コマンド:
commit
```

```text:結果:
   (戻り値なし)
```

エラーが出なければOKです。

保存します。

```bash:コマンド:
save
```

```text:結果:
   Saving configuration to '/config/config.boot'...
   Done
   [edit]
```

設置モードから抜けます。

```bash:コマンド:
exit
```

ログアウトします。

```bash:コマンド:
exit
```

# 完了
VPNコネクションの作成

この手順は、Lambda関数「vpn-conn-monitor」の検証用手順です。

正しいネットワーク疎通には、この他にも設定が必要になります。


VPC (東京リージョン)
====================

* https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1# にアクセスします。


1. VPN Gatewayの構築 (Tokyo) [GUI]
----------------------------------

* (左メニュー) VPN 接続 > 「仮想プライベートゲートウェイの作成」をクリックします。

* 「仮想プライベートゲートウェイの作成」ボタンをクリックします。

  * ネームタグ: vpn-conn-monitor

* 「作成」ボタンをクリックします。


2. VPN Connectionの構築 (Tokyo) [GUI]
-------------------------------------

* (左メニュー) VPN 接続 > 「VPN接続」をクリックします。

* 「VPN接続の作成」ボタンをクリックする。

  * 仮想プライベートゲートウェイ: (作成した仮想プライベートゲートウェイを選択します)

  * カスタマゲートウェイ: 新規

  * IPアドレス: (EIP(オレゴン)のIPアドレスを指定します。)

  * BGP ASN: 65000

  * ルーティングオプション: 動的

* 「作成」ボタンをクリックします。

* 状態が「available」になるまで待ちます。

  * 2分くらいかかります。

* 「設定のダウンロード」をクリックします。

  * ベンダー: Vyatta

* 「ダウンロード」をクリックします。

# 完了
TDA mapper and diabetes data

RでTopological data analysis
mclustのdiabeesデータを試してみる。
filter functionは以下のようにしてみた

```math
f(x)=\sum_y exp\frac{-(distance(y-x))^2}{\epsilon}  
```

```math
(\epsilon=130000)
```

```r
library(mclust)
library(TDAmapper)
library(igraph)

data(diabetes)
.data <- diabetes[,2:4]
.dist <- dist(.data, diag=T, upper=T)
.mat <- as.matrix(.dist)
.kernel <- function(d) sum(exp(-(d^2)/130000))
.filter <- apply(.mat, 2, .kernel)

#
map <- mapper1D(.dist, filter=.filter, num_intervals=5, percent_overlap = 50)
g <- graph.adjacency(map$adjacency, mode="undirected")

#ノード内のデータ数に応じてノードサイズを変更
V(g)$size <- 5*sqrt(sapply(map$points_in_vertex, length))

.col <- c()
N <- length(V(g))
for(i in 1:N){
  tmp <- as.numeric((table(diabetes[map$points_in_vertex[[i]], 1])))
  t <- tmp/sum(tmp)
  .col[i] <- rgb(t[1], t[2], t[3])
}
V(g)$color <- .col
plot(g)
```

![TDA (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/145593/fa8fa35d-2bc4-487a-ec23-d6a161f366f3.jpeg)

```r
> pv <- map$points_in_vertex
> labels <- diabetes[,1]
> glucose <- diabetes[,2]
> insulin <- diabetes[,3]
> sspg <- diabetes[,4]

> rbind(
+   table(labels[pv[[9]]]),
+   table(labels[pv[[1]]]),
+   table(labels[pv[[3]]])
+ )
     Chemical Normal Overt
[1,]       29     75     2
[2,]        4      0     0
[3,]        0      0    26

> summary(diabetes[map$points_in_vertex[[9]], 2:4])
    glucose          insulin           sspg      
 Min.   : 70.00   Min.   :269.0   Min.   : 73.0  
 1st Qu.: 87.25   1st Qu.:333.2   1st Qu.:131.2  
 Median : 93.00   Median :372.0   Median :167.0  
 Mean   : 94.27   Mean   :392.6   Mean   :183.2  
 3rd Qu.: 99.75   3rd Qu.:428.2   3rd Qu.:221.0  
 Max.   :140.00   Max.   :643.0   Max.   :408.0  
> summary(diabetes[map$points_in_vertex[[1]], 2:4])
    glucose         insulin           sspg      
 Min.   : 95.0   Min.   :469.0   Min.   :564.0  
 1st Qu.: 99.5   1st Qu.:505.0   1st Qu.:596.2  
 Median :102.0   Median :527.0   Median :614.5  
 Mean   :102.5   Mean   :520.2   Mean   :635.2  
 3rd Qu.:105.0   3rd Qu.:542.2   3rd Qu.:653.5  
 Max.   :111.0   Max.   :558.0   Max.   :748.0  
> summary(diabetes[map$points_in_vertex[[3]], 2:4])
    glucose         insulin            sspg       
 Min.   :146.0   Min.   : 832.0   Min.   : 10.00  
 1st Qu.:188.5   1st Qu.: 931.8   1st Qu.: 41.25  
 Median :224.5   Median :1123.0   Median : 76.50  
 Mean   :241.7   Mean   :1152.9   Mean   : 75.69  
 3rd Qu.:302.2   3rd Qu.:1370.8   3rd Qu.:102.75  
 Max.   :353.0   Max.   :1568.0   Max.   :160.00  
```
もう少しchemicalの分離をよくしたいが、一応overtとその他の分類はできている。
UWP で Socket.IO を利用してメッセージを受信する


Socket.IO を利用してデータを配信している機器などから、C# を利用して、値を受信するためには、SocketIoClientDotNet が便利です。サンプルを短くするためコードビハインドに書いていますが、実際は MVVM してください。

# 手順
### 1. UWP プロジェクトの作成と参照の追加
Windows > Universal > Blank App からプロジェクトを作成し、プロジェクトの 参照 > NuGet パッケージの管理 > 参照 で SocketIoClientDotNet を検索してインストールします。

### 2. UI の変更
MainPage.xaml を下記のように書き換えます。2行目の x:Class="App1.MainPage" は適宜作成したプロジェクト名に合わせて変更してください。

```xml:MainPage.xaml
<Page
    x:Class="App1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock x:Name="ReceivedText" FontSize="30" >---</TextBlock>
    </Grid>
</Page>
```

ここでは、ReceivedText という名前の TextBlock を作成しました。

### 3. コードビハインドの更新
MainPage.xaml.cs を下記のように書き換えます。IPアドレス等は適宜書き換えてください。

```csharp:MainPage.xaml.cs
using Quobject.SocketIoClientDotNet.Client;
using System;
using Windows.UI.Core;
using Windows.UI.Xaml.Controls;

namespace App1
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            SetSocket();
            ReceivedText.Text = "接続を待っています";
        }

        private void SetSocket()
        {
            var socket = IO.Socket("http://192.168.1.3:3000");

            // 接続時のイベント
            socket.On(Socket.EVENT_CONNECT, async () =>
            {
                // UIとは別スレッドなので Dispatcher を利用する
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    ReceivedText.Text = "接続しました";
                });
            });

            // "msg" 受信時
            socket.On("msg", async (data) =>
            {
                // UIとは別スレッドなので Dispatcher を利用する
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    ReceivedText.Text = Convert.ToString(data);
                });
            });
        }
    }
}
```

### 4. Package.appxmanifest の更新
プライベートネットワーク上でサーバとのやり取りが必要な場合は、Package.appxmanifest を開き、Private Networks (Client & Server) にチェックを入れます。このチェックをしないとプライベートネットワークではデータを送受信できません。

### 5. 接続の確認
ビルドを行いアプリケーションを実行します。あらかじめ Socket.IO のサーバを起動しておいてください。
[Lazurite 920J #3] Lチカ

Lazurite IDEに同封のblue_led.cを動かして、Lazurite 920Jの取り扱いとLazurite IDEの基本操作をやってみましょう。

#結線
Lazurite mini writerと、同封のフラットケーブルを接続します。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/f1cb8036-51c0-1412-41ee-2d2f897ee4d1.jpeg)

フラットケーブルの赤いライン側を、基板に**12**と印刷されている側に合わせて、ピン位置がズレないように注意しながら接続してください。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/8d6fb52e-085e-5fa1-52fa-baf76f793bad.jpeg)

次に、Lazurite 920Jと、フラットケーブルを接続します。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/116de60f-8354-027d-ecbc-184097fc3be3.jpeg)

フラットケーブルの赤いライン側を、基板に**▼**と印刷されている側に合わせて、ピン位置がズレないように注意しながら接続してください。
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/3f6fef68-5297-f667-a5fd-2c491ef3f764.jpeg)

Lazurite mini writerにA-MicroB USBケーブルを接続して、パソコンのUSBコネクタに差せばOKです。
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/cd368fa2-723b-bcff-0c7d-8afbcfa1e0c3.jpeg)

![6.png](https://qiita-image-store.s3.amazonaws.com/0/109634/7b6f8e88-152d-34ac-375c-ceff913cef51.png)

#通信設定
Lazurite IDEを起動して、メニューの**ツール**で、

* マイコンボード = LAZURITE mini
* 通信ポート = COMx （今回はCOM7）
* ボーレート = 115200

にします。
![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/ab0c902f-274a-de0e-d7cb-320766be5966.png)

![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/c1a13082-e4c3-132a-8cae-4aba82372ce7.png)

![9.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/2e32b9ac-b3ce-0629-b8b2-3c4790c264c8.png)

#プログラム書き込み
メニューの**ファイル->開く**で、C:\LazuriteIDE\examples\01.Basics\blue_led\blue_led.c を開きます。
![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/35e04910-b5f6-66c8-899b-01d2ac2a64ac.png)

メニューの**プロジェクト->マイコンボードに転送**を実行します。すると、プログラムがビルドされてLazurite 920Jへ転送されます。
![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/41bbc716-8dd2-b10a-7255-9d9912280060.png)

![13.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/773dc0a1-8967-8789-a58d-36b009a79207.png)

真ん中の青いLEDが点滅すれば成功です。

![14.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/64ce9eb8-52e7-274f-9cff-4109f9b3db86.jpeg)

#あとがき
* Lazurite 920Jへプログラムを書き込むには、Lazurite mini writerとA-MicroB USBケーブルが必要でした。
* フラットケーブルは逆差し出来てしまうので、注意して接続しなければいけない。
* Lazurite IDEの操作は、特に難しいことは無かった。あえて言えば、マイコンボード名がLazurite 920JではなくLAZURITE mini。
* プログラムのビルド、転送とも、結構時間がかかると感じた。
Rcpp: 引数は参照渡しかコピー渡しか

R言語では、関数の引数は原則すべて値渡し。なので、関数を呼ぶたびに変数のコピーが作られている。
C++でも原則は値渡しで、参照渡しにするには"&"をつけて指定する。

とすればRcppで関数を作った場合もそうか思っていたが、違った。

- `IntegerVector` `NumericMatrix`など、Rcppで定義されたクラスの変数は**参照渡し**になる
- ただし、変数の型変換が必要なケース、たとえば、`IntegerVector`で定義されている引数に実数ベクトルを与えると、参照が崩れて**値渡し**になる

Rユーザーは普段、実数と整数を意識していないことも多いので場合によっては想定外の挙動をする可能性がある。ご注意あれ。


##例

与えられた引数の第1要素を２に変更するという関数をRcppを用いて定義している。引数が値渡しであればこの結果は関数の呼び出し元には影響せず、参照渡しであればもとの変数も変更される。

比較のために色々なタイプの引数を用いている。
要約すると

- C++由来のタイプの引数については、すべて値渡し。関数内の変更は呼び出し元へは**影響しない**
- タイプ通りの引数、つまり、`IntegerVector`の引数に整数ベクトルを与えたり、`NumericVector`の引数に実数ベクトルを与えると、参照渡しになり、関数内の変更が呼び出し元へ**影響する**
- 異なるタイプの引数、つまり、`IntegerVector`の引数に実数ベクトルを与えたり、`NumericVector`の引数に整数ベクトルを与えると、値渡しになり、関数内の変更が呼び出し元へ**影響しない**

[テストコード](https://gist.github.com/kota7/0e2270aaca605808ee7eccc721c91ce9)



```r
library(Rcpp)

cppFunction(
"
void argument_reference(int x, double y,
                        IntegerVector z, NumericVector w,
                        std::vector<int> v, std::vector<double> u) {
  x = 2;
  y = 2;
  z(0) = 2;
  w(0) = 2;
  v[0] = 2;
  u[0] = 2;
}
"
)

## input real
x <- 1
y <- 1
z <- c(1, 1, 1)
w <- c(1, 1, 1)
v <- c(1, 1, 1)
u <- c(1, 1, 1)
argument_reference(x, y, z, w, v, u)
x
##[1] 1
y
##[1] 1
z
##[1] 1 1 1
w
##[1] 2 1 1
v
##[1] 1 1 1
u
##[1] 1 1 1


## input integer
x <- 1L
y <- 1L
z <- c(1L, 1L, 1L)
w <- c(1L, 1L, 1L)
v <- c(1L, 1L, 1L)
u <- c(1L, 1L, 1L)
argument_reference(x, y, z, w, v, u)
x
##[1] 1
y
##[1] 1
z
##[1] 2 1 1
w
##[1] 1 1 1
v
##[1] 1 1 1
u
##[1] 1 1 1
```
Electron の Renderer Process でデバッグ実行

# Electron の デバッグ実行
ElectronのProcessはMain Process, Renderer Processの二種類あります。
Visual Studio Codeのデバッグ機能でMain ProcessとRenderer Processデバッグ実行が可能です。

##  Main Process でのデバッグ実行
Electron の Main Process でのデバッグ実行は下記の資料が参考になります。
[こちら](http://qiita.com/Quramy/items/a4be32769366cfe55778#remote%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

nodejsデバッグの基本設定で実現できます。
launch.jsonに設定追加

```json
{
    "name": "Debug Main Process",
    "type": "node",
    "request": "launch",
    "cwd": "${workspaceRoot}",
    // "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron",
    // Use the following for Windows
    "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd",
    "program": "${workspaceRoot}/main.js"
}        
```

## **Render Process でのデバッグ実行**
Render Processは画面のレンダリングを担うProcessで、Electronのコードの多数がこのProcessで実行されるので、Render Processでデバッグ実行ができれば結構役に立ちます。

Render Processでデバッグ実行する方法は下記の英文資料で紹介されました。
[こちら](http://code.matsu.io/1)

### **原理**
Electronには実行フラグ(launch flag) `--remote-debugging-port`があり、リモートデバッグのポートを指定できます。こちらのポートで[Chrome Debugging Protocol](https://developer.chrome.com/devtools/docs/debugger-protocol)が利用できます。
Visual Studio Codeではこれを扱う拡張[Debugger for Chrome](https://marketplace.visualstudio.com/items/msjsdiag.debugger-for-chrome)があります。

### **設定**
#### **main.js編集**
下記の内容を無効にします。

```js
mainWindow.webContents.openDevTools()
```
#### **Debugger for Chromeインストール**
Visual Studio Codeの拡張機能ビューでdebugger-for-chromeをインストールします。
#### **`launch.json`に設定追加**
```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Renderer Process",
      "type": "chrome",
      "request": "launch",
      "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron",
      // Use the following for Windows
      // "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd",
      "runtimeArgs": [
        "${workspaceRoot}/main.js",
        "--remote-debugging-port=9222"
      ],
      "webRoot": "${workspaceRoot}"
    }
  ]
}
```
Windows環境ではruntimeExecutableは`${workspaceRoot}/node_modules/.bin/electron.cmd`
非Windows環境は`${workspaceRoot}/node_modules/.bin/electron`
Debugger for Chrome関連設定で
ポートは通常9222で、
`webRoot`はアプリフォルダーを指定します。


### **実行**
サンプルコードは
[こちらに](https://github.com/octref/vscode-electron-debug)
Visual Studio CodeのデバッグビューでDebug Renderer Process設定で実行します。
![image](https://qiita-image-store.s3.amazonaws.com/0/11728/5ed0c8b8-428e-3e5c-61a0-7573d8159523.png)
一回目は一つ目の`console.log`関数にあるブレークポイントは発動しなく、一回クリックすると`click`イベント内二つ目の`console.log`関数にあるブレークポイントが発動します。

また、cmd/control+rで画面を再読み込みすると一つ目の`console.log`関数にあるブレークポイントが発動します。

### 以上
Electron の Renderer Process をデバッグ実行ができるようになりました。
機械学習  特徴選択

#1.特徴選択
特徴選択の目的は、どの説明変数がどの程度目的変数の値に影響するか調べること（説明変数影響解析）。

##1.1.線形回帰モデルによる特徴選択
線形回帰分析の結果を基にした特徴選択は、得られた線形回帰モデルの係数を見ることである程度議論できる（係数が大きな説明変数は影響が大きいなど）が、係数を比較する前に正規化が必要。

データの正規化とは、各変数（目的変数、説明変数）の大きさやばらつき具合の違いの影響をなくすために行う前処理。主に以下の２つの方法がとられる。

- 平均0,分散1になるようにスケールする
- 最小値0,最大値1になるようにスケールする

scaleは平均値0、分散が1になるようにデータをスケールする関数。
pythonではsklearnに関数が含まれている。詳細は以下を参照
http://scikit-learn.org/stable/modules/preprocessing.html

線形回帰モデルを説明変数を使って学習させて、summaryでモデルの中身を確認することにより、各説明変数の僻陬の信頼を確認することができる。

２つの変数の間の線形関係の強さを表す指標として”相関係数”がある。相関係数は-1から１の値を持ち、絶対値が１に近いほど２つの変数間の相関関係が高いことを意味する。
Rではcorコマンド、Pythonではnumpyのcorrcoef、scipyのstats.pearsonr。

##1.2.MARによる説明変数影響解析
MARSで学習したモデルはsummary関数にかけると色々な情報が表示される。
Importance行にモデルに影響のある説明変数が大きな順から列挙される。

##1.3.決定木（回帰木、分類木）による特徴選択
決定木が作るツリー構造は特徴選択の際に分かりやすい。ツリー構造を可視化すると”判断に必要な説明変数がどれか”、”説明変数をどのように解釈すれば予測できるか”の知見がえられる。

##1.4.オーバーフィットに注意
学習データと検定データを分けて、モデルがオーバーフィットしてないかどうか確認した方がよい。
コードリーディング Parallel gem (Process)


前回の[コードリーディング Parallel gem (Thread)](http://qiita.com/satoruk/items/4402231ae14a8e0ce73b)でThreadベースでの並列処理を追っていきましたが今回はProcessベースの方を追っていきます.

## 対象

- Parallel
	- https://github.com/grosser/parallel
	- v1.9.0
- MRI 2.3
- MacOS

ThreadとProcessの違いと其々どうゆうものかを知ってる人向けです.
その辺は何処かの記事を読んで置いてください.


## ユースケース

コードを読むにあたり以下のコードがどのように実行されるか追うことにしました.

```ruby
list = ['a','b','c']
log.info 'start'
Parallel.map(list, in_processes: 2) do |one_letter|
  log.info one_letter
end
log.info 'finish'
```

実行結果は以下のようになります.

- `pid`は`Process.pid`
- `tid`は`Thread.current.object_id`

![parallel_processes.png](https://qiita-image-store.s3.amazonaws.com/0/21086/8086e3b5-6913-5b10-56b1-8a036ecc4aa7.png "parallel_processes.png")

## Parallel.map

ここは前回読んでしまったので概要だけ箇条書きにしておきます.

- 並列数を処理するJobの数かCPUのコア数から少ない方を選択
- ThreadまたはProcessのどちらかを選択
	- 今回はオプションで`in_processes`を指定したので`Parallel.work_in_processes`を実行

## Parallel.work_in_processes


ここから先は複雑すぎて文章じゃ説明できなかったので図を描いてみた.

<img width="500" alt="work_in_processes.png" src="https://qiita-image-store.s3.amazonaws.com/0/21086/55d66496-2b5b-7835-b51c-4fc48da8f03c.png">

#### 1. new - JobFactory.new

まずメインスレッドでJobFactory.newをしています

```ruby:parallel.rb#L230
def map(source, options = {}, &block)
  # ...
  
  job_factory = JobFactory.new(source, options[:mutex])
```

#### 2. option[:size]の数だけfork - 事前にProcessを作成

事前にProcessをForkしています.
余談ですがApacheとかでPreforkとか呼ばれるものが同じようにしています.

ProcessをForkするとメモリ空間自体が共有できないので[プロセス間通信](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E9%96%93%E9%80%9A%E4%BF%A1)の問題があります.
Parallelではパイプを使って解決しています.

具体的には`work_in_processes`内で`create_workers`を呼び出すことで並列数分のWorkerオブジェクトを作成しています.

```ruby:parallel.rb#L324
def work_in_processes(job_factory, options, &blk)
  workers = if options[:isolation]
    [] # we create workers per job and not beforehand
  else
    create_workers(job_factory, options, &blk)
  end
```

`isolation`はワーカーを事前に作らずスレッド呼び出し毎に逐次ワーカーを作成していくものです. 今回のユースケースには無いので無視します.

`create_workers`で`job_factory`からジョブを取得しワーカーに割り当てます.
内部で具体的に何をしてるかは後で書きます.

#### 3. newでpidと紐付け - 子プロセスを管理するworkerインスタンスの作成

`worker`メソッドで子プロセスのforkとWorkerオブジェクトを作成しています.

```ruby:parallel.rb#L391
def worker(job_factory, options, &block)
  # ...

  pid = Process.fork do
    # ...
  end
  # ...

  Worker.new(parent_read, parent_write, pid)
end
```

Workerオブジェクトは親プロセスとの`in`と`out`のIOオブジェクトが渡され、親と子プロセスのデータのやり取りをしています.

データのフォーマットはRubyに用意されている[Marshal](https://docs.ruby-lang.org/ja/latest/class/Marshal.html)を使って`dump`/`load`されます(図の9を参照）


#### 5. option[:size]の数だけスレッド起動 - 親プロセスの１スレッドに対して子プロセスを割り当て

親プロセスがシングルスレッドでは子プロセスが複数あると同時に子プロセスにデータや処理の同期ができません.
そこで親プロセスをマルチスレッドにすることで１スレッドに対して子プロセスを割り当てて並列に処理できるようにしていきます.


```ruby:parallel.rb#L334
UserInterruptHandler.kill_on_ctrl_c(workers.map(&:pid), options) do
  in_threads(options) do |i|
    worker = workers[i]

    # ....
  end
end
```

`UserInterruptHandler.kill_on_ctrl_c`はシグナルを送って処理に割り込む仕組みです.
以下の処理で`SIGINT`(<kbd>Control</kbd>-<kbd>C</kbd>)でProcessを全て殺します.

シグナル自体は`:interrupt_signal`オプションで変更可能です.
Maya UE4 FBXのExport/Import

# Maya UE4 FBXのExport/Import

## UE4の単位
**基本のキューブの大きさ**
基本の1辺100cm（1m）
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/e71fe244-e69b-343f-4de9-1b55dbf610ea.png)

## MayaからFBXのExport

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/f37e9a13-c070-6633-2317-2fb2a67e86f4.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/bccbed08-a454-db57-6a73-f4b22a791cf8.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/2dff25ae-2cb0-9e30-7c71-0151be59fffb.png)

## UnrealEngineへImport
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/04d3183a-46d9-79d3-4742-8d38bf51f99f.png)

警告が表示される
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/9d3dba3f-9bc6-1991-c8b6-840c6bdbab00.png)

FBX インポート エラー(その他のエラー・警告への対応)
http://docs.unrealengine.com/latest/JPN/Shared/Editor/FbxErrors/index.html?utm_source=editor&utm_medium=docs&utm_campaign=msg_log

スケールを100倍にすることで、基本のキューブと同じ大きさになる。
同じ大きさにするには、Maya上で100倍してから書き出しする
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/d9db8f57-d5da-3c17-98f1-8156c26ea79d.png)


## 参考URL
FBX import-export gives wrong scale
https://answers.unrealengine.com/questions/391894/fbx-import-export-gives-wrong-scale.html
MacOSを上げたら注意！ gem native extensionのエラー対策

#環境
>```
MacOS: 10.12 Sierra
Ruby: 2.1.0
Homebrew: 1.0.8
```

#状況
bundle installをすると、gemを入れろと怒られる。
しかし、gemを入れるとgem native extensionのエラーが出る。
>
```
$ bundle install

> An error occurred while installing bcrypt (3.1.11), and Bundler cannot continue.
Make sure that `gem install bcrypt -v '3.1.11'` succeeds before bundling.

> $ gem install crypt -v ‘3.1.11’

> ERROR:  Error installing bcrypt:
> ERROR: Failed to build gem native extension.
```

ググると、このエラーでハマる人が結構いる模様。

#結論

私の場合、**native extensionは罠**でした。
(bundlerを消したり、installしたりするも、行き詰まる。
約５時間格闘...。)

エラー文中の赤や黄色の文字に目を奪われていましたが、
文中に目を移すと以下のエラー。
>
```
compiling generator.c
couldn't understand kern.osversion `16.0.0'
```

osversion...
ここで、MacOSをYosemiteからSierraにアップデートしていたことを思い出す。

上記のエラーを検索すると、、、
あったあった、先人の知恵が。

> [`couldn't understand kern.osversion '14.5.0'` でコンパイルエラーするときの対処法](http://qiita.com/d_forest/items/e285d33b047e73ebbfcd)
[OS X Mountain Lion: gcc-4.2 No such file or directory](https://goo.gl/Rs3hKz)

apple-gcc42が悪さをしていた模様。
インストールをし直して、解決！
>
```
$ brew uninstall apple-gcc42
$ brew install apple-gcc42
```

#関連記事
[gem インストール時に発生したエラーとその解決方法まとめ](https://goo.gl/CdvJrO)
[Why won't the bcrypt ruby gem install properly?](https://goo.gl/VZzfKi)
既存のワードプレスをローカル環境(MAMP)で動かす

久しぶりに詰まった点があったので投稿します。
すでに公開されているワードプレスサイトの編集、エンハンスを行うこととなりました。
そこで、公開中の本番サイトをそのまま編集するのは難しいため、ローカルに環境を作ることにしました。
ワードプレスについては完全に初心者なので、間違いがあればご指摘ください。


##MAMPのダウンロード
まず、ローカル（パソコン内）にphpとApacheの環境を簡単にセットできるMAMPをダウンロードし、基板の環境を整えます。
MAMPは[こちら](https://www.mamp.info/en/)からダウンロードできます。

![スクリーンショット 2016-10-23 20.12.55.png](https://qiita-image-store.s3.amazonaws.com/0/109034/0e19b6fc-41a3-392c-ddd4-658b16c2880d.png)

今回はFREEバージョンをダウンロードしました。
象のロゴ下の[DOWNLOAD](https://www.mamp.info/en/downloads/)からダウンロードページへ飛び、バージョンを選択します。

![スクリーンショット 2016-10-23 20.15.07.png](https://qiita-image-store.s3.amazonaws.com/0/109034/7c880f5f-f0d3-5d9b-b550-5349b194340d.png)

指定がなければ最新バージョンで良いかと思いますが、wordpress自体のPHPのバージョンやMySQLのバージョンに合わせて古いものも選べますので確認をしてください。
以下pkgファイルやdmgファイルをダウンロードしたらソフトの解凍をすすめてください。


##MAMPの初回起動
Macの場合はデフォルトで/Applications/MAMPにソフトが入ると思います。
実行するとこのような操作画面が現れますのでサーバーを起動させてください。

![スクリーンショット 2016-10-23 20.19.33.png](https://qiita-image-store.s3.amazonaws.com/0/109034/b9cc03de-5db6-45af-846a-f9173a9efea3.png)

ブラウザで http://localhost:8888 にアクセスし以下のような画面が出たら成功です。

![スクリーンショット 2016-10-23 20.23.12.png](https://qiita-image-store.s3.amazonaws.com/0/109034/b2f82f46-476a-9d68-0850-7822ffe27631.png)

これでパソコン上にローカル環境を作ることができました。

##現行環境のファイルを揃える(準備)
- 既存のデータベースをSQL形式でエクスポートしておく
 (サーバーなどに置いている現行のデータベースを、phpMyadminのエクスポート機能などを使用して.sql形式でエクスポートしておきます。)

- cssやjavascriptのデータをサーバーから取り、MAMP/htdocsの下に保存する。
 (使用していたのがロリポップサーバーだったので、FTPでFilezillaを使用してデータを取ってきました。
 その方法はこちらの[FileZillaのFTPS設定（ロリポップ）](http://h-mkt.com/archives/1214)を参考にさせていただきました。)



##データベースの接続

次はMAMPにデータベースをインポートします。

MAMP (http://localhost:8888) ページ内にあるリンクからphpMyadminに入り、新しいデータベースを任意の名前で作成します。
ここに既存のデータベース(準備でエクスポートしたもの)を丸ごと移動してしまいましょう。

![スクリーンショット 2016-10-23 20.27.11.png](https://qiita-image-store.s3.amazonaws.com/0/109034/026da665-8726-6120-314a-482d6a909fa5.png)


インポートは上の画像の上の方のタブを探したら見つかると思います。
.sqlという名前になっているはずですのでエクスポートデータを選択してインポート。

##configの設定(ローカルファイル)

準備でMAMP/htdocsの下に保存したcss,phpなど諸々のデータの中から
htdocs/wp_config.phpを以下のように編集します。

```
define('DB_NAME', ‘新しく作成したデータベース名’);
define('DB_USER', 'root');
define('DB_PASSWORD', 'root');
define('DB_HOST', 'localhost');
```

もともとあった行を消すのは怖い(><)
という場合は//でコメントアウトしておきましょう。


##MAMPでの設定(データベースファイル)

次はMAMPのphpMyAdminに今インポートしてきたしたデータベース (私の場合はmedia)直下のwp5_option(数字は違う場合があります)の内容を編集します。

下のような30ほどのrowがあるテーブルのsiteurlの項目のedit(または編集)を選択し、option_valueを http://loalhost:8888 へ変更し、保存します。

![スクリーンショット 2016-10-23 20.51.03.png](https://qiita-image-store.s3.amazonaws.com/0/109034/6c54f848-032d-68c8-d7d4-e4d7c204439b.png)


##完了
これで手順は完了するかと思われます。
もしブラウザでlocalhostにアクセスしてもまだうまくいかない場合はMAMPの再起動などをためすなどしてみると良いでしょう。


##参考にした本はこちらです。
[一歩先にいくWordPressのカスタマイズがわかる本(Amazon)](https://www.amazon.co.jp/dp/B01DZXAHV0/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

ありがとうございました。
日常生活で行う標準化


# はじめに
この記事は[「標準化のススメ」](http://qiita.com/yuuta/items/47c8fd238d822acc3de6)の続きです

- 「標準化しよう」といってみたもののやり方がわからない。
- 何か標準化した実績もないのに、仕事で標準化を提案できない

といった問題を解決するための記事です。

まずは個人的に、仕事とは関係ないプライベートな生活の中から標準化していこう。
それで成果がでたら、自信をもって仕事の中でも実施、提案していこう
というものです。

# どんなものを標準化すべき？

標準化するとその標準の作成、メンテ、実施するコストがかかります。
標準化するメリットが、標準を作成、メンテ、実施するコストを上回るか？
考えた上で標準化しましょう。


サンプルで「朝の準備」を例に上げて考えます。
## 朝の準備リスト（例）

- [x] 顔洗う
- [x] 剃り残し、鼻毛がみえていないよう気をつける
- [x] 髪整える
- [x] 手洗い・うがいをよくしている
- [ ] 毎朝、トイレで大を済ます
- [ ] 朝ごはんを食べる
- [ ] 歯磨きする
- [ ] ハンカチ・タオル・ティシュを持っている
- [ ] 汚れ、シワに気をつける
- [ ] 上着 肩のフケ・シミに気をつける
- [ ] ポケットがふくらむほど物を入れない
- [ ] ベルトは痛んでいないものをする清潔でゆるみのないものをする
- [x] シャツは中まで入れてベルトする
- [ ] ベルトはバックルを真ん中にする
- [ ] 水筒持つ
- [ ] 鞄のチャック確認
- [ ] きちんと磨かれ手入れした靴を1日ごとにかえてはく


## 失敗したら
### 失敗したことを再発防止のため、リストを改定する
失敗したら、標準改定していきましょう。
しつこいですが、このときも
標準化するメリットが、標準を作成、メンテ、実施するコストを上回るか？
考えた上で改定しましょう。

改定例：

・予定にあわせて準備するものがあったのに忘れ物した。
→「水筒を持つ」の前に「タスクリスト、予定表を確認する」「忘れ物ないか確認する」
・ゴミ出し忘れた。
→「水筒を持つ」の前に「ゴミをもったか」
・傘を忘れて、ずぶ濡れになった。
→「天気チェックし、雨なら折りたたみ傘をもっていく」を追加

※）ホントは夜やることリストも作成し、夜のうちに準備したほうがいいかもしれません。そうすると運用コストも上がりますが。

### リスト更新だけじゃなく、自動化も考えよう
繰り返す作業は人間より、コンピュータがやったほうがコストが低い

・傘を忘れて、ずぶ濡れになった。
　→IFTTTアプリで雨なら通知がくるように設定する
　　→「雨なら折りたたみ傘をもっていく」を追加
※折りたたみ傘をカバンに入れっぱなしにすればいいんですけどね。

その他、生活の中で繰り返すことは標準化、自動化していきましょう。
・季節ごとの模様替え
・年中行事

# 標準化することのメリット
成長の履歴がのこる。失敗しても、これは次活かせばいいと思える。
実行し、失敗することの怖さが、軽減する。

**成功の反対は、失敗ではなく挑戦しないこと。
失敗には学びがあり、そこで諦めなければ成功への通過点**
地球を真球と仮定して2地点間の距離を算出する

忙しい人のために
--

```
distance_km = 6371 * acos(
  cos(latA/180*pi) * cos((lonB - lonA)/180*pi) * cos(latB/180*pi) +
  sin(latA/180*pi) * sin(latB/180*pi)
);
```

さて
--
緯度経度で表される位置情報を二つもらったとき、2地点間の距離を求めるにはどうすればいいでしょう。
地球は真球ではなく回転楕円体であることを真面目に反映しようとすると、非常に難しいアルゴリズムを使う必要があります。 [Vincenty法](https://ja.wikipedia.org/wiki/Vincenty%E6%B3%95)といい、収束するまで計算を繰り返して精度を高めていくタイプのアルゴリズムで、地点によっては収束しないことがあるという厄介なもの。

さてこのVincenty法のことは知識としてだけ頭に入れておいて、地球を真球、半径6371kmの球と仮定しますと、距離を求めるのは非常に容易になります。使うのは、高校の代数幾何で習ったベクトルの知識。そう、これは「[図形情報を扱うのに大事なことは、全部高校で教わった](http://qiita.com/yuba/items/2f35d1e5e162f44fc1b3)」の続編となります。

2地点間の距離をベクトル計算で求める
--
2地点間を最短距離で結ぶ球面上の線、大圏航路と呼んだり測地線と呼んだりするものは、真球上においては必ず、地球半径と同じ半径の円、大円の一部です。


大円の中だけで考えれば、これは立体図形の問題ではありません。扇形の弧の長さを求めるだけという平面の問題です。


扇形の半径は？　そう6371km。扇形のなす角度は？　それをθと呼ぶことにしてこれから求めていきます。θがラジアンで求まれば、弧の長さは6371・θkmと決定できますから。では、答えの方から順を追っていきましょう。

- cosθかsinθが求まれば、θは算出できます。コンピュータには`sin`, `cos`の逆関数`asin`, `acos`が使えますから。
- cosθは簡単に求まります。内積です。<BR>
地球中心から見たA地点、B地点の座標をベクトルa, bとすると、その内積abは 【aの長さ】・【bの長さ】・cosθ ですから。そして、両地点の座標ベクトルを最初から長さ1に正規化しておけば、内積は cosθ そのものです。<br>
内積を求める計算は簡単でした。`(x,y,z)`と`(u,v,w)`の内積だったら`xu+yv+zw`です。
- 地点は緯度経度で表されています。これを（地球中心が原点になり、ベクトルの長さが1であるような）三次元座標に変換しないといけません。<BR>
XYZ軸の置き方は地球固定座標系というのを使いましょう。X軸が経度0緯度0のギニア湾方向、Y軸が東経90度緯度0度のスマトラ沖方向。Z軸が北極方向。するとこうです。`(cos東経・cos北緯, sin東経・cos北緯, sin北緯)`<BR>
ただし、経度・緯度は通常ラジアンではないので、cos, sin関数に渡すにはラジアンに変換する必要があります。そこまでちゃんと書くとこう。`(cos(東経/180*π)cos(北緯/180*π), sin(東経/180*π)cos(北緯/180*π), sin(北緯/180*π))`

一本の式にまとめると
--
以上の考え方を一本の式にまとめると、こうなります。
地点A（北緯latA, 東経lonA）, 地点B(北緯latB, 東経lonB)間の距離は、

```
distance_km = 6371 * acos(
  cos(lonA/180*pi) * cos(latA/180*pi) * cos(lonB/180*pi) * cos(latB/180*pi) +
  sin(lonA/180*pi) * cos(latA/180*pi) * sin(lonB/180*pi) * cos(latB/180*pi) +
  sin(latA/180*pi) * sin(latB/180*pi)
);
```

と記述できます。そしてこの式は簡単にできます。始点終点を並行移動して、片方が経度0にくるように持ってきてあげましょう。`lonA`と`lonB`からそれぞれ`lonA`を引いて`0`と`(lonB - lonA)`にしてあげるのです。すると、`cos 0 == 1`と`sin 0 == 0`が出てくるので

```
distance_km = 6371 * acos(
  cos(latA/180*pi) * cos((lonB - lonA)/180*pi) * cos(latB/180*pi) +
  sin(latA/180*pi) * sin(latB/180*pi)
);
```
冒頭のこの式になりました。
ruby optionparser  double hyphen

http://optionparser.rubyforge.org/

The — argument terminates options.

https://github.com/sonots/alerty/blob/master/lib/alerty/cli.rb#L53-L54

argv和option的区别

ARGV

```rb
require 'optparse'

OptionParser.new do |opts|
  opts.on("--dangerous-option", "Set dangerous option") do |v|
    puts "dangerous option set to #{v}"
  end
end.parse!

puts ARGV
```

```bash
vagrant@precise64:~/data$ ruby 2.rb --dangerous-option -- lala
dangerous option set to true
lala
```
ebitenライブラリを使ってゲームを作ってみた

ebitenライブラリを使ってゲームの雛形？を作ってみました。

> ebitenライブラリ
> http://qiita.com/hajimehoshi/items/d531f0c0e3f5ec5287c3

ソースコードはこちら

> シューティングゲーム
> https://github.com/ikuo0/game/tree/master/ebiten_stg
> ebiten_stg_release.zip がWindows用バイナリです 


> アクションゲーム
> https://github.com/ikuo0/game/tree/master/ebiten_act
> ebiten_act_release.zip がWindows用バイナリです


# ebiten_stg、ebiten_act について
使えるところがあれば自由にコピペして使って頂いて構いません、質問やバグ等についてはコメント欄からどうぞ。
基本的にWindowsでしか開発を行っていませんので内容はWindows版のお話になります。

# ebitenライブラリでゲームを作る際の注意点とか

## 基本的な使い方
https://hajimehoshi.github.io/ebiten/
公式のサンプルで一通りのことやってますのでまずはサンプルを一通り動かして関数を把握しましょう

## 画像はgimpで作ろう
Windowsペイント、フリーの画像ビューア（VIX）で透過色PNGを作成した所画像の読み込み処理でエラーとなり読み込めませんでした
gimpで作成し透過色指定してエクスポートした物を素材として使用しましょう

## SE・BGMの サンプリングレートは一定、ステレオ形式で
サンプリングレートの異なるWAV、OGGを混在させることはできません、モノラルのWAVは再生できません、
ということなのでゲーム素材のWAV、OGGはサンプリングレートを統一し、全部ステレオ音源で準備しましょう
参考までに私は[SoundEngine Free](http://soundengine.jp/software/soundengine/)を使用して音源を加工しました。

## SE・BGM再生時に audio.Context のインスタンスはプログラム全体で一つだけ
ebiten のSE、BGMの再生は audio.Context を作成し毎フレーム audio.Context.Update を呼ぶことで再生されます。
audio.Context のインスタンスは複数作ってはいけません、プログラム全体で一つだけです。
複数作って実行してもとりあえず音は出るのですが公式で一つにしてと書いてあるのでそうしましょう

## 初期化処理について
リソース周りの初期化についてですが音声の初期化は ebiten.Run の前でも可能、ジョイパッドの初期設定は ebiten.Run の中で行わないと機能しません 

* 例

音声周りの初期化を ebiten.Run の前に行う
> https://github.com/ikuo0/game/blob/master/ebiten_act/main.go 
> sound.Initialize(global.SampleRate, 20, 20) 

ジョイパッドの初期化（カウント）を ebiten.Run の中で行う 
> https://github.com/ikuo0/game/blob/master/ebiten_act/main.go 
> ginput.Initialize() 


## ジョイパッドのカウンタが無いので自分でカウントしましょう
ジョイパッドの数をカウントする関数（GedPadNum()みたいな）物が無いので下記のようなコードを作って自分でカウントしましょう

```
func PadCount() (int) {
	res := 0
	for i := 0; i < 16; i++ {
		if cnt := ebiten.GamepadButtonNum(i); cnt < 1 {
			break
		} else {
			res++
		}
	}
	return res
}
```

## 仮想環境Linuxでも動きました
25フレーム程度しか出ませんでしたがWindows上のLinux仮想環境で動作しました、仮想環境で動かした時の環境メモを記します

仮想マシン: VirtualBox 
ホスト: Windows10 
ゲスト: ubuntu 16 

golang 1.7以上をソースからインストール、ubuntu16はgolang1.6であったためgo言語をソースからインストールする必要がありました
 
下記URLを参考にして必要なライブラリをインストールする 
https://github.com/hajimehoshi/ebiten/wiki/Linux  

## 不具合とか
知り合いに配って試験してもらいました、Radeonで3年ほど前（2013年）のドライバ使ってる方が表示不具合ありましたが、それ以外の環境では問題なく動いています
もし表示おかしい場合は環境の確認をしましょう。

***

他になにかあればまた追記編集していきます。

ebiten作者のHoshiさんに感謝です、go言語でゲーム作れるの楽しいです。
Material なアニメーションがやりたくてメモ

ぽわわんわんって動くアニメーションとか、アイコンがぐにゃんと違うアイコンになるとか、昔の知識だとそんなんなかったし、どうやってやるかもわからなかったので、調べてみたのでそのときのメモです。

ネタバレするとちゃんと公式ドキュメント読めってことでした。
https://material.google.com/motion/material-motion.html

＃個人的にはアニメーションは嫌いです。ぐわんぐわんされるより、ぱっと出して欲しいタイプです。

# ぽわわんわん
要は、物理法則にしたがったアニメーションってことです。伸びたものは縮まろうとするし、加速度は一定ではないし、ぶつかれば跳ね返るしといったところでしょうか。

以前からやっているアニメーションの作成方法は、こちらの記事で説明されている方法が多かったです。
http://qiita.com/glayash/items/1822a852ebaa7d26a53e

ただ、この方法だとどうしても線形になってしまい、グラデーションがかからないし、どうにかして複数のアニメーションをつくって、前のアニメーションが終了したら次のアニメーションへとって感じでやるのが精いっぱいでした。

じゃあどうすればいいのか。
答えはInterpolator というのを使うようです。

単語の意味通り、処理を補完します。
詳しくはこちらを見てください。アニメーションに強弱をつけることができます。
http://qiita.com/suzukihr/items/5c8b0d3d1d0353719f46

ただ、ちょっとオリジナルのInterpolatorをつくるのは難しそうですよね。
いいのないかなと思ったらありました。
https://material.google.com/motion/duration-easing.html#duration-easing-natural-easing-curves

Googleさんが提供していました。
3つしかないですが、十分かと思います。
https://developer.android.com/reference/android/support/v4/view/animation/package-summary.html

API22以上だともっといろいろあります。
https://developer.android.com/reference/android/view/animation/BaseInterpolator.html

# ぐにゃんと変形
今はもうなくなってしまいましたが、Google Playのハンバーガーアイコンが左矢印アイコンになるあれですね。

API22以上だとAnimatedVectorDrawableというのがあるみたいです。
https://developer.android.com/reference/android/graphics/drawable/AnimatedVectorDrawable.html

vector画像からvector画像に変形させることができ、その変形している途中の画像もvectorで表現できるようです。これもInterpolatorで非線形にできるのかな？

こちらはちょっと読めてないので別の機会にちゃんと読んでみたいと思います。

またこちらでvectorファイルが動画編集のように作成できるようです。
https://romannurik.github.io/AndroidIconAnimator/


API22未満だとどうやるのかはいまだにわかりません。

♯ おわりに
英語でもちゃんとドキュメントは読んだ方がいいですね。どうしても絵に目がいって文字に目がいかない。。。
CentOS 7にmecab-ipadic-NEologdを入れて動かすまで

# とりあえず
yumでmecabを入れると何故かmecab-configが入らないので最初から素直にmakeしましょう。

# 準備
念のためいろいろ入れておきます。
NEologdを入れる際にpatchが入ってないって怒られたので追加しています。

```bash
$ yum install gcc-c++ libiconv patch
```

## MeCabをインストール
MeCabは以前Google Codeにありましたが、今はGoogle Driveにあるのでこっちから持って来ます。

```bash
$ wget --no-check-certificate 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE' -O mecab-0.996.tar.gz
$ tar zvxf mecab-0.996.tar.gz
$ cd mecab-0.996
$ sudo ./configure --enable-utf8-only
$ make
$ sudo make install
$ sudo sh -c "echo '/usr/local/lib' >> /etc/ld.so.conf"
$ sudo ldconfig
```

## ipadicをインストール
上と同様の理由でGoogle Driveから持って来ます。

```bash
$ wget --no-check-certificate 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM' -O mecab-ipadic-2.7.0-20070801.tar.gz
$ tar zvxf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf8
$ make
$ sudo make install
```

## mecab-ipadic-NEologdをインストール
これはGitHubに書いてある通りで、

```bash
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n
```

でインストール完了

```bash
$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/
```
で動いた！やったー！！
いくつかの条件ごとに更新する行や内容を切り替える


同一テーブル内の複数の行を更新する際、行ごとに更新する内容を切り替えたい場合は`UPDATE`と`CASE`の合わせ技を用います。

たとえばユーザの個人情報を格納したテーブルがあるとします。このとき「AさんとBさんのパスワードと生年月日を更新したい、そしてそれ以外のユーザの個人情報はそのままにしておきたい」というときは次のようなSQLにより実現することができます。

```sql
UPDATE table
SET
    password = CASE name
        WHEN 'Aさん' THEN 'password_a'
        WHEN 'Bさん' THEN 'password_b'
        ELSE password
    END,
    
    birthday = CASE name
        WHEN 'Aさん' THEN 'birthday_a'
        WHEN 'Bさん' THEN 'birthday_b'
        ELSE birthday
    END
```

注意すべきは`ELSE`です。`UPDATE`はテーブル全体、あるいは`WHERE`によって限定された範囲全体に対して更新処理を行おうとします。上述の例の場合は「AさんとBさん以外は更新しない」、つまり「AさんとBさん以外は現在のパスワードと生年月日のままにする」ということを明示的に宣言してやらねばなりません。

上記のようなSQLがわかりづらいのは「条件節が戻り値を持つ」という点でしょうか。Lispなどの関数型言語に慣れていると、特に違和感なく受け入れられると思いますが……。
Google Chart Toolsで人口ピラミッドのグラフを描画する

# はじめに
[前回](http://qiita.com/hippocampus-coronatus/items/3f31148ab538eb4d1bd0)と同じくGoogle Chart Toolsを使ってグラフを描いていきます。

今回は[BarChart](https://developers.google.com/chart/interactive/docs/gallery/barchart)で人口ピラミッドのグラフを描きます。

# 今回の完成形
<img width="931" alt="pyramid_sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/118801/c2757527-fcdd-47c3-a94e-0e23929edaf3.png">


ただ積み上げ棒グラフでピラミッドを作ろうとするとmaleかfemaleの値がマイナス値になってしまいますのでその設定をしました。

それとtooltipを半透明にしてみました。
実際の動きは [JSFiddle](https://jsfiddle.net/hippocampuscoronatus/rxg07bxy/) で確認できます。

# コードの中身
```html:html
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>
```

```css:css
.google-visualization-tooltip {
  opacity: 0.9;
}
```

```javascript:javascript
google.charts.load('current', {packages: ['corechart', 'bar']});
google.charts.setOnLoadCallback(drawPyramid);

function drawPyramid() {
      
  var data = new google.visualization.DataTable();
  data.addColumn('string', 'City');
  data.addColumn('number', 'male');
  data.addColumn('number', 'female');
      
  data.addRows([
      ['A', 81750, -80080],
      ['B', 37920, -36940],
      ['C', 26950, -28960],
      ['D', 20990, -19530],
      ['E', 15260, -15170]
  ]);

  var options = {
    title: 'people',
    isStacked: true,
    hAxis: {
      format: ';',
      direction: -1
    },
    vAxis: {
      direction: -1
    },
    legend: {
      position: 'bottom',
      maxLines: 3
    },
    tooltip: {
      isHtml: true
    },
    focusTarget: 'category'
  };

  var chart = new google.visualization.BarChart(document.getElementById('chart_div'));

  var formatter = new google.visualization.NumberFormat({
      pattern: '#,###;'
  });
  formatter.format(data, 2);

  chart.draw(data, options);
}
```

## Optionsについて
### hAxis
**format**で表示上も絶対値にしています。
**direction**でmaleとfemaleの伸びる方向を逆にしています。

```javascript
hAxis: {
  format: ';',
  direction: -1
},
```

### vAxis
**direction**でaddRowしたデータを下から設定するようにしています。

```javascript
vAxis: {
  direction: -1
},
```

### tooltip
**isHtml**をtrueにすることでツールチップにCSSの設定が反映されます。

```javascript
tooltip: {
  isHtml: true
},
```

## NumberFormatについて
ツールチップで表示される値はこのフォーマットで設定しないとマイナス値を表示してしまうので、設定します。

```javascript
var formatter = new google.visualization.NumberFormat({
  pattern: '#,###;'
});
formatter.format(data, 2);
```

## Tooltipの半透明の設定
CSSで透明度を設定しています。グラフオプションの**tooltip.isHtml**をtrueにしないと効かないので必ず設定が必要です。

```css
.google-visualization-tooltip {
  opacity: 0.9;
}
```

# 最後に

今回はピラミッドのグラフを描画しました。
データにマイナス値を用意しないといけないのでCSVやJSONから値を入れるときは一度マイナス値にする関数を用意しないといけないなと思いました。
UIColor 1000色分のライブラリーと型安全な仕組みを作った

[いちいち `#FF00FF` とか書いて、あーでもない、こーでもないと言いながらUIColorを作る日々](http://qiita.com/tottokotkd/items/23bf03b32da6f024f694)にオサラバ！

(注記: RGB入力をサボる仕組みに過ぎないので、高度な色管理とかは全然ありません)

## そーす
[github.com](https://github.com/tottokotkd/ColorPack)

## 要旨

![p1.png](https://qiita-image-store.s3.amazonaws.com/0/17957/8ded6087-edd2-9462-3322-dfde222eab2d.png)

## 使い方

### オブジェクト生成 (危険)

sRGBもしくは16進数6桁のリテラルを使って `Color` 構造体を作ります。RGBは `0...255`、16進数は `0x0...0xFFFFFF`、アルファ値は `0...1.0` にそれぞれ収まる値で指定してください。

なお `Color` 構造体はゆとり世代のため、イニシャライザに `red: 256` とか `alpha: 100` などの無理難題を指定するとnilを投げ返します。

（Doubleで指定する仕組みは）ないです

```swift
import ColorPack

// init? (RGB)
Color(red: 100, green: 200, blue: 50)
Color(red: 100, green: 200, blue: 50, alpha: 0.3)
Color(red: 100, green: 200, blue: 350)            // nil
Color(red: 100, green: 200, blue: 50, alpha: 1.3) // nil

// init? (Hex)
Color(hex: 0xFFcc44)
Color(hex: 0xFFcc44, alpha: 0.6)
```

`"FFFFFF"` などの文字列から変換したい場合は `Int(hoge, radix: 16)` でなんとか頑張ってください。

* [十六進数の文字列から実際の数値を取得する](http://qiita.com/lovee/items/eac017d1dcaf52541d3d)

### オブジェクト生成 (安全)

失敗するかもしれないイニシャライザーは嫌だなあ… というケースのために、列挙型しか受け付けないファクトリもあります。RGBは `.d0` ~ `.d255`、Hexは `.x00` ~ `.xFF`を引数に取ります。

```swift
// init (type safe: RGB, Hex, Web safe)
Color.RGB(red: .d0, green: .d100, blue: .d180)
Color.Hex(red: .x77, green: .xC2, blue: .xF9)

```

### UIColor / NSColor に変換
`toUIColor` または `toNSColor` を通じてオブジェクトを変換できます。

```swift
Color(red: 100, green: 200, blue: 50, alpha: 0.3)?.toUIColor
```

### 色ライブラリー

今回の本題はこちら。

UIColorもいくつかの色をプロパティとして提供していますが、率直に申し上げてショボいんですよね。ちょっとでも色を使おうと思ったら、いちいちネットで検索して自分で作らないといけません。

ガチガチの設計書に基づいて着色する時はまだしも、「ちょっとここ色つけたいなー」という程度の動機しかないとき、これは非常にめんどくさいです。そして赤と青でベタ塗りされたドギツイ色のUIサンプルが量産されます。

で、これじゃちょっとなあ… とテンション下がったので1000色ほど並べてみました。

* [CSS Color Module Level 4](https://drafts.csswg.org/css-color-4/#named-colors): 148色
* [Webセーフカラー](https://ja.wikipedia.org/wiki/ウェブカラー#.E3.82.A6.E3.82.A7.E3.83.96.E3.82.BB.E3.83.BC.E3.83.95.E3.82.AB.E3.83.A9.E3.83.BC): 216色
* クレヨン: 48色
* 日本の色 ([参考](http://irononamae.web.fc2.com/colorlist/wa.html)): だいたい700色くらい

プロパティを取ってくるだけで、あの色もこの色も使えます。

```swift
// CSS4: 148 colors
CSS4Colors.beige.toUIColor
CSS4Colors.dimGray.toUIColor
CSS4Colors.rebeccaPurple.toUIColor

// web safe colors: 216
WebSafeColors.x0000CC.toUIColor
WebSafeColors.x00CC33.toUIColor
WebSafeColors.xFF0099.toUIColor

// 'crayon' set: 48
CrayonColors.aluminum.toUIColor
CrayonColors.banana.toUIColor
CrayonColors.flora.toUIColor

// japanese colors: roughly 700
JapaneseColors.ao.toUIColor
JapaneseColors.藍.toUIColor
JapaneseColors.sabionando.toUIColor
JapaneseColors.錆御納戸.toUIColor
```

**殆ど日本の色による水増しじゃねーか！**という抗議は現在受け付けておりません。ご了承ください。

日本の色に関しては「ローマ字つづりの変数」と「漢字そのままの変数」をどちらも用意してあるので、サジェストで色を探すと愉しいかもしれません。なお「変数が700個」ではなく「色が700色」ですので、変数としては計1400個くらいあります。

それが何の役に立つのかというと、そこは正直、ちょっとその… 国際交流ですとか…？

## 付記
Frameworkの作り方が分かりにくすぎて涙がこぼれました。おしまい。
超音波距離センサとサーボでROSで使えるレンジスキャナを作ってみた

​
HC-SR04の超音波の距離センサ（ultrasonic sensor）をサーボで左右に振ってROSで使える平面のレンジスキャナを作ってみます。
一般的なスキャナはレーザーレンジファインダ（LRF）ですが、定番である[hokuyoのURG](https://www.amazon.co.jp/dp/B00FJW8GC8)などは個人で遊ぶには高価で手が届きません。。（誰かちょうだい！）

![scanner](https://github.com/atotto/ultrasonic_scanner/raw/master/overview.jpg)

作ってはみたものの、超音波センサの特徴として点ではなく面で応答が返ってくるため、部屋の角などを正確に計測することはできませんでした。
何かの参考になればと思い、記録として残しておきます。

コードは https://github.com/atotto/ultrasonic_scanner に置いておきました。

# 前提

- [ROSがセットアップ済み](http://wiki.ros.org/kinetic/Installation/Ubuntu)であること
 - 本記事ではubuntu 16.04、ROS kinetic (ros-kinetic-desktop-full)を利用
- arduinoが使えること

# 材料

- HC-SR04
- サーボ
- HC-04をサーボに取り付けるためのマウント
 - HC-SR04とサーボ、マウントがセットになったのがあります→ [amazon](https://www.amazon.co.jp/dp/B00ZIGLP96)
- arduino (本記事ではUNO)


# 作り方

0. HC-SR04をサーボに対して直角に取り付ける
0. 図の通りに配線する ![fritzing](https://github.com/atotto/ultrasonic_scanner/raw/master/arduino/hcsr04-servo-arduino_bb.png)
0. [スケッチ](https://github.com/atotto/ultrasonic_scanner/blob/master/arduino/ultrasonic_scanner/ultrasonic_scanner.ino)をarduinoにアップロードする

# 動作確認

    $ cd <your_catkin_ws>/src
    $ git clone https://github.com/atotto/ultrasonic_scanner.git
    $ cd ..
    $ catkin_make
    $ roslaunch ultrasonic_scanner ultrasonic_scanner_demo.launch

![demo.rviz](https://github.com/atotto/ultrasonic_scanner/raw/master/rviz_cfg/demo.rviz.png)

注意:

- `/dev/ttyUSB0` にパーミッションがない場合は `sudo chmod 666 /dev/ttyUSB0` を実施してください

# 解説

arduinoでサーボを-90〜90の間を2度ずつ振り、90点のデータをシリアルでホストPCへ送信します。
ホストPCでarduinoからシリアルで送られてくるデータをROSのLaserScanのデータへ変換します。
（arduinoでROSSerialを使いたかったのですが、kineticのためかうまく動かせませんでした）
LaserScanデータを`/scan`トピックでpublishし、rvizを使って視覚化します。

センサをサーボで左右に振るため、スキャンの方向をLaserScanのヘッダ情報を反転することで左右どちらからのスキャンデータでも活用できるようにしています。
1スキャンに4sec程度かかります。チューニング次第ではもう少し速くなるかも？

[LaserScan](http://docs.ros.org/api/sensor_msgs/html/msg/LaserScan.html)型を利用し、`/scan`トピックでpublishしているので、ROS上からはURGと同じように利用できます。

# なんで作ったの？

ROS勉強してみた→せっかくだし自分で移動ロボットを組んでみよう→平面スキャナないとSLAMできないやん→LRF高い…→子供いるし安全な超音波の距離センサええやん→イマココ


# 独り言

LRF、なんで安くならないの。
【TechShop Tokyo】大判プリンターのプリント Tips集

# 本Qiitaについて

TechShop Tokyoに置いてあるMutoh ValueJet(VJ1617H)のプリントに関して記載しています。

# 関連Qiita

[【TechShop Tokyo】大判プリンターのプリント](http://qiita.com/akira-sasaki/items/c89b6cc2701547339b0d)


# 印刷するオブジェクトを回転させる

![direct001.png](https://qiita-image-store.s3.amazonaws.com/0/63450/96c0bb87-c14a-4ce2-6b9f-ae42ffb3cad9.png)

![direct002.png](https://qiita-image-store.s3.amazonaws.com/0/63450/50cc836f-ddd4-4955-ef5f-f69b61c16ba0.png)

# 反転させる

![mirror001.png](https://qiita-image-store.s3.amazonaws.com/0/63450/741ce6d4-5ba7-9d6e-7f00-1ac44b3c1de4.png)

![mirror002.png](https://qiita-image-store.s3.amazonaws.com/0/63450/90a66561-ed21-1f99-f974-f7319dbd4d5e.png)
俺のzshチートシート

自分用のzshチートシート。`.zshrc`でキーバインドがカスタマイズされているため、あくまで自分用になります。
`.zshrc`は[ここ](https://github.com/dondoko-susumu/dotfiles/blob/master/zsh/.zshrc)にあります。（随時更新）

# コマンドライン 
|コマンド | 効果 |
|--------|--------|
| Tab | とにかく補完 |
| <ディレクトリ名> | ディレクトリ名だけでディレクトリ移動 |
| Ctrl + f | 前方に1文字分移動 |
| Ctrl + b | 後方に1文字分移動 |
| Ctrl + a | 行頭に移動 |
| Ctrl + e | 行末に移動 |
| Ctrl + p | コマンドライン履歴の前の行へ移動 |
| Ctrl + n | コマンドライン履歴の次の行へ移動 |
| Ctrl + w | カーソル位置から左に単語を1つ削除 |
| Ctrl + r | コマンド履歴をインクリメンタル検索。※1 |
| Ctrl + s | `Ctrl + r`で行きすぎた場合に巻き戻す |
| (コマンド入力途中で) Ctrl + p | すでに入力した内容を使ってコマンド履歴を検索 |
| ** | `*` `*/*` `*/*/*` ... と任意の回数繰り返したパターン[※](http://qiita.com/dondoko-susumu/items/238bac310d6bd901013d)|
| {,} | 複数の文字列をOR条件のように指定 [※](http://qiita.com/dondoko-susumu/items/238bac310d6bd901013d)|
| 例) rm *.txt [Tab] | パターンマッチを展開し実際のファイル名に置き換える |
| Ctrl + xu , Ctrl + x Ctrl + u | ワイルドカードをtabキーで展開されたパラメータを元に戻す |

※1 マッチする履歴が複数ある場合は新しいものから順に表示され`Ctrl + r`を押すたびに順次古いものに変わる。希望のコマンドが出てきたら`Ctrl + e`などでカーソル移動で編集開始。`*` `?` `^` などのパターンマッチも可

# cdr（最近移動したファイルに移動する）
| コマンド | 効果 |
|--------|--------|
| cdr -l | 移動したディレクトリ履歴を表示 |
| cdr [Tab] | 移動したディレクトリ履歴を表示 |


# zmv（ファイル名一括変換）
| コマンド | 効果 |
|--------|--------|
| zmv *.txt *.html | *.txtを*.htmlファイル名を一括変換 |

# peco + anyframe
| コマンド | 効果 |
|--------|--------|
| Ctrl + j | pecoのリストのカーソルを下に移動 |
| Ctrl + k | pecoのリストのカーソルを上に移動 |
| Ctrl + xb | 過去に移動したことのあるディレクトリに移動する |
| Ctrl + x Ctrl + b | Gitブランチを切り替える |
| Ctrl + xi , Ctrl + x Ctrl + i | Gitブランチ名をコマンドラインに挿入する |
| Ctrl + xr , Ctrl + x Ctrl + r | コマンドライン履歴から選んで実行する |
| Ctrl + xp , Ctrl + x Ctrl + p | コマンドライン履歴から選んでコマンドラインに挿入する |
| Ctrl + xg , Ctrl + x Ctrl + g | ghqコマンドで管理しているリポジトリに移動する |
| Ctrl + xk , Ctrl + x Ctrl + k | プロセスをkillする |
| Ctrl + xf , Ctrl + x Ctrl + f | ファイル名をコマンドラインに挿入する |

# global alias
| コマンド | 効果 |
|--------|--------|
| B | Gitカレントブランチ名 |
| L | '(パイプ) less' |
| H | '(パイプ) head' |
| T | '(パイプ) tail' |
| G | '(パイプ) grep' |
| N | '> /dev/null' |
| V | '(パイプ) vim -R -' 読み込み専用で標準入力をvimで開く |
| P | ' --help (パイプ) less' |


### 参考
zshの初期設定など
[zshのインストール](http://qiita.com/dondoko-susumu/items/dda074e1b46fe7ac85da)
[.zshenvと.zshrcの役割](http://qiita.com/dondoko-
susumu/items/1cbf7f8aff8c7fb6113f)

`.zshrc`の記述は、以下の記事からまるっと参考させて頂いています。感謝です。
[WEB+DB PRESS vol.83](http://mollifier.hatenablog.com/entry/2014/10/20/191511)
[zsh の vcs_info に独自の処理を追加して stash 数とか push していない件数とか何でも表示する](http://qiita.com/mollifier/items/8d5a627d773758dd8078)
[zshでpecoと連携するためのanyframeというプラグインを作った](http://qiita.com/mollifier/items/81b18c012d7841ab33c3)
[zshでGitのカレントブランチ名を簡単に入力するalias](http://qiita.com/mollifier/items/370e963a60ae433855c8)
Retrieve and Rank で confidenceを取得する方法

flパラメータに追加する。
&fl=id,title,ranker.confidence

  {
    "id": "773",
    "title": [
      "q . app . math . 7, 1950, 381 . experiments on porous-wall cooling and flow separation control in a supersonic nozzle ."
    ],
    "ranker.confidence": 0.4921862317121547
  },
  {
    "id": "331",
    "title": [
      "effects of surface tension and viscosity on taylor instability ."
    ],
    "ranker.confidence": 0.3309682122734283
  },

Retrieve and Rank service documentation | Watson Developer Cloud
https://www.ibm.com/watson/developercloud/doc/retrieve-rank/training_data.shtml