OmniAICreator/Qiita-1.07M huggingface dataset:
redux-observableで作ったintervalのobservableをHot Module Replacementで止まるようにする


epicでintervalを利用するような場合、HMRが効いてるとそのまま動いてしまう。
storeはHMRで更新されるので影響は無いが、consoleなどで追っかけているとObserverが動いていてちょっと気持ち悪い

# 解決方法： Subjectを利用して`module.hot.dispose`で発火して止める

```js
import { combineEpics } from "redux-observable"
import { interval, Subject } from "rxjs"
import { map, takeUntil } from "rxjs/operators"

const disposer = new Subject()

export const timerEpic = () => {
  return interval(1000).pipe(
    takeUntil(disposer), // disposerが動くまでtimerを動かす
    map((time) => ({
      type: "TIMER",
      value: time
    }))
  )
}

if (module.hot) {
  module.hot.dispose((data) => {
    disposer.next()
  })
}

```

typescriptの場合、`module.hot`は`@types/webpack-env`に定義されているので入れると良い

### HMR部分を分離する

こんな感じにHot Reload関連の部分を切り出しておくのも良いだろう。

```ts
// hotReload.ts
import { Subject } from "rxjs"
import { takeUntil } from "rxjs/operators"

const hmrDisposer = new Subject()

export const registerDisposeHandler = (module) => {
  if (module.hot) {
    module.hot.dispose(() => hmrDisposer.next())
  }
}

export const takeUntilHotReload = () => takeUntil(hmrDisposer)
```

ただし`module.hot`のフックは全てのdependencyのルートであるrootEpicの記述箇所と一緒にしておかないと上手く発火されないので注意

```ts
export const rootEpic = combineEpics(pingEpic)

// 全てのepicが更新されたタイミングでdisposeを呼び出すように仕掛ける
registerDisposeHandler(module)
```
ターミナルの基本コマンド覚書

#ターミナル超初心者がコマンドを覚書するだけの記事
タイトルの通りです。Windowsを使っています。
ターミナルだかコンソールだかなんだかよくわからないので
ここでは黒い画面の総称を「ターミナル」として書いています。

#コマンド
※コマンド例の `$ ` はターミナルでの入力だと
わかりやすくするために使われる表記です。
コマンドプロンプトなど表示されないものもあります。
コマンド入力する際は `$ ` の後から記述します。

##cd
```
$ cd 移動先ディレクトリ
```
ディレクトリを移動する。
相対パス、絶対パス両方使用可能。

デフォルトでは「C:\Users\ユーザー名」となっている。
コマンドプロンプトでは、あるディレクトリを起点に操作するので
動かしたいファイルのあるディレクトリに移動してから以下のコマンドを操作する。
（任意のファイルが置いてあるフォルダを開くイメージ）
今いるディレクトリのことをカレントディレクトリと呼ぶ。

ハウツー記事はこのディレクトリの移動を
当たり前に省略していたりするので超初心者の第一関門である。

##mkdir
```
$ mkdir 新しいディレクトリ名
```
新規ディレクトリを追加する。
カレントディレクトリの直下に作成される。

##ls
```
$ ls
```
ディレクトリの内容を表示する。
`ls -a`とすれば隠しファイルも表示可能。

##rm
```
$ rm 削除するファイル
```
ファイルを削除する。
ディレクトリを削除したい場合は
`rm -r ディレクトリ名`

##cp
```
$ cp コピー元ファイル コピー先ファイルの名前
```
ファイルをコピーする。
別ディレクトリにコピーしたい場合は
`ディレクトリ/コピー先ファイルの名前`
とパスで指定する。
ディレクトリをコピーする場合は
`cp -r コピー元ディレクトリ コピー先ディレクトリの名前`

##mv
```
$ mv 移動するファイル 移動先ディレクトリ
```
任意のディレクトリにファイルを移動する。

```
$ mv リネームするファイル 新しいファイル名
```
ファイル名を変更する。

mvコマンドは移動/リネーム両方行えるので注意。
上記を組み合わせて移動しつつリネームする場合は
`mv リネームするファイル 移動先ディレクトリ/新しいファイル名`


随時追加予定...
@line/bot-sdkとbody-parserの競合回避

#LINEボットむずい
LINE-botは[こちら](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d)を参考に製作中ですが，
LINE以外からPOSTを受け取り処理をしたいのに
@line/bot-sdkとbody-parserが競合するため悩んでいたところ，
[こちら](https://trueman-developer.blogspot.com/2018/05/nodejs-linebotmessaging-apiwebhook.html)のページからヒントを得て解決したのでメモ．

#解決策
body-parserを使いたいPOST処理だけapp.use(bodyParser.json())する

##実装例
いろいろ省略してます

```index.js
const line = require('@line/bot-sdk');
const bp = require('body-parser');

app.use('/else',bp.json());

//webhookにはbody-parserが効かない
app.post('/webhook', line.middleware(config), (req, res) => {
  Promise
    .all(req.body.events.map(handleEvent))
    .then((result) => res.json(result));
});

//parseできる
app.post('/else', function(req, res) {
  user_input = req.body.message;
  res.json(user_input);
}

```
もっと賢いやり方あれば教えてください．
Node.js簡易HTTPサーバー ログつき

# コード

HTTPサーバー置きたい場所に下記を置いて実行

```js:app.js
const app = require('connect')();
const morgan = require('morgan');
app.use(morgan(':remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer"'));
app.use(require('serve-static')(__dirname))
app.listen(3000);
```

```shell-session
 $ npm install connect serve-static morgan
 $ node app.js
```

他のターミナルから `curl localhost:3000` とか叩くと

```shell-session
 $ node app.js
::1 - - [28/Sep/2018:12:40:16 +0000] "GET / HTTP/1.1" 404 139 "-"
```

こんなログが出る(ログフォーマットの詳細は[こちら](https://github.com/expressjs/morgan)を)

# 確認環境
Node v8.11.1
connect@3.6.6
serve-static@1.13.2
morgan@1.9.1
Mac OS 10.13.4

Node.jsは公式(https://nodejs.org/en/ ) からインストーラー(LTSを選択)
その後下記ターミナルからコマンド叩いてインストール
`npm install connect serve-static morgan`


# リクエストHTTPヘッダー見たい

こう書き換える

```js:app.js
const app = require('connect')();
const morgan = require('morgan');
morgan.token('rawHeaders', function (req, res) {
  return JSON.stringify(req.headers)
})
app.use(morgan(':remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" :rawHeaders'));
app.use(require('serve-static')(__dirname))
app.listen(3000);
```

JSON形式で出力

```shell-session
 $ node node app.js
::1 - - [28/Sep/2018:12:42:45 +0000] "GET / HTTP/1.1" 404 139 "-" {"host":"localhost:3000","user-agent":"curl/7.54.0","accept":"*/*"}
```

## ユースケース

OpenAPIのモックサーバー立てて開発してた時にこれを組み込んでた。
Elixir Concurrent Programming(4) - Task and Agent

**■ ElixirのConcurrent Programmingについてまとめた過去記事**
[Elixir Concurrent Programming(1) - Spawn - Qiita](https://qiita.com/sand/items/d7fda56fe2fef0f4a24d)
[Elixir Concurrent Programming(2) - GenServer - Qiita](https://qiita.com/sand/items/5fd91c0b86b4919d7cc9)
[Elixir Concurrent Programming(3) - Supervisors - Qiita](https://qiita.com/sand/items/3075b909b65c2fa2fc23)
[Elixir Concurrent Programming(4) - Task and Agent　-Qiita](https://qiita.com/sand/items/244f060555d106a923d8)


　SpawnやGenServerなどより、簡単にバックグランド・プロセスをつくるための仕組みである、TaskとAgentについてみてみます。


# １．Task

　GenServerはサーバとして働き、永続的にリクエストを受け付け、処理を行うというものでした。これに反してTaskはworkerプロセスとして起動され、リクエストを受け取ることもなく、与えられた仕事が終了したら停止しするものです。具体的には、Taskは関数をバックグラウンドのプロセスとして走らせます。Taskには2種類あって、resultを返すものと返さないものがあります。前者を**awaited task**と呼びます。

　（補足）ここで述べるのは基本的な事柄ですので必要に応じて[「Task - Hexdocs」](https://hexdocs.pm/elixir/Task.html)を参照してください。

　**awaited task**は**Task.async**で起動し、**Task.await**で返答を受け取ります。

　以下に簡単な例を示します。特に次のことに注目します。Task.awaitの順番に関して、worker40とworker37を入れ替えます。当然、worker37の方が完了が早いはずですが、上から順番に実行されるので、worker40のawaitを待ってworker37のawaitが実行されます。

```elixir:mytask.ex
defmodule Fib do
  def fib(0), do: 0
  def fib(1), do: 1
  def fib(n), do: Fib.fib(n-1) + Fib.fib(n-2)
end

### 関数Fib.fibに引数を与えて起動します
worker35 = Task.async(fn -> Fib.fib(35) end)
worker37 = Task.async(fn -> Fib.fib(37) end)
worker40 = Task.async(fn -> Fib.fib(40) end)

### Task.awaitはworkerの仕事の完了を待ちます。
IO.puts "worker35を待つ"
result35 = Task.await(worker35,50000) ### timeout=500000
IO.puts "worker35の結果 = #{result35}"

IO.puts "worker40を待つ"
result40 = Task.await(worker40,50000) ### timeout=500000
IO.puts "worker40の結果 = #{result40}"

IO.puts "worker37を待つ"
result37 = Task.await(worker37,50000) ### timeout=500000
IO.puts "worker37の結果 = #{result37}"
```

　以下が実行結果です。

```
# elixir mytask.ex
worker35を待つ ### ちょっと待って表示されます
worker35の結果 = 9227465
worker40を待つ ### 結構待ちます
worker40の結果 = 102334155
worker37を待つ ### 既に結果が出ているのですぐ表示されます
worker37の結果 = 24157817
```


　**Non-awaited task**はTask.asyncでなく、**Task.start_link**で呼び出されます。簡単に以下のような感じです。

```
iex(1)> Task.start_link(fn -> IO.puts("Something done!") end)
Something done!
{:ok, #PID<0.86.0>}
```


**【2022/10/23】Task.async を使った負荷試験ツールを見つけました**
[Elixirでパラレルな負荷試験ツールを作る](https://blog.tubone-project24.xyz/2020/1/24/elixir-loadtest)


# ２．Agent

　Agentはstateを持ったバックグラウンドのプロセスです。stateは、あるプロセスやnode内のいろいろな場所からアクセスされます。他のnodeからアクセスされることもあります。ザックリ言えばGenServerをお手軽に使うイメージですかね。

　（補足）ここで述べるのは基本的な事柄ですので必要に応じて[「Agent - Hexdocs」](https://hexdocs.pm/elixir/Agent.html)を参照してください。

　簡単な使い方です。

```
# iex
iex(1)> {:ok, pid} = Agent.start_link(fn -> %{name: "Yamada", age: 30} end)
{:ok, #PID<0.86.0>}
iex(2)> Agent.get(pid, fn state -> state.name end)
"Yamada"
iex(3)> Agent.update(pid, fn state -> %{state | age: state.age + 1} end)
:ok
iex(4)> Agent.get(pid, fn state -> state end)
%{age: 31, name: "Yamada"}
```


今回は以上です。
【Kotlin】コンストラクタの書き方

# 【経緯】
[これ](
https://qiita.com/siroykht/items/f67b2c111e9b3b424f1e)でKotlinに四苦八苦している中で、コンストラクタで困ることが何度かあったので記載します。
先人たちがもっと詳しくて分かりやすく書いてくれているので、自分用メモ程度です。

#【プライマリコンストラクタ】
クラス定義と一緒に定義されるコンストラクタ。
Kotlinではコンストラクタだと意識しないような記載になっているので、初見は「？？？」って感じです。
そもそも型宣言をゴリゴリ行う言語ばかりをやってきた所為で（おかげで？）、型推論を行ってくれる言語に慣れていないというのも一因なんですが。

##  【引数なし】
```kotlin:
public class Book() {}
```

## 【引数あり】
```kotlin:
public class Book(textStr:String) {
    private  var txt:String = textStr
}
```

# 【セカンダリコンストラクタ】
2つ目以降のコンストラクタ。必ずプライマリコンストラクタを呼ぶ必要があり、thisキーワードで呼び出しを行います。

## 【引数なし】
```kotlin:
public class Book() {
    constructor(title:String, creator:String) : this() {}
}
```

## 【引数あり】
```kotlin:
public class Book(title:String) {

    constructor(title:String, creator:String) : this(title) {}
}
```

# 【おまけ】
コンストラクタや初期化に関係する色々。
## 【初期化処理(init)を入れたい！】
```kotlin:
public class Book(textStr:String) {
    private  var txt:String = textStr
    
    init {
        println(txt)
    }
}
```

## 【継承あり(コンストラクタに引数なし)】
```kotlin:
public open class Item() {
    init {
        println("Item init!")
    }

}

public class Book(textStr:String):Item() {
    private  var txt:String = textStr
}
```

## 【継承あり(コンストラクタに引数あり)】
```kotlin:
public open class Item(title:String) {
    var titleStr:String = title
    init {
        println("Item init!")
    }
}

public class Book(title:String):Item(title) {
    private  var str:String = title
}
```

# 【参考】
https://qiita.com/alt_yamamoto/items/f5df6434e122859f2d65
https://qiita.com/k5n/items/35e76d79ee9de4effb89#%E3%82%AF%E3%83%A9%E3%82%B9
http://www.atmarkit.co.jp/ait/articles/1804/02/news009_2.html
見たくない広告を表示させない方法（Windows編）

## tl, dr
広告を見たくなければアドブロッカーを使えば良い、でもそのアドブロッカーを導入することによるトラブルも嫌、という方向けに、特定のドメインのDNSをローカルにご案内するという方法を提案しています。

## Web広告に関する憂鬱

パソコンでWebブラウジングしていると、広告を表示するサイトに出くわします。最近では、訪れたページに応じて、「興味あるんでしょ？」とばかりに、過去に訪れたサイトの関連商品を表示するバナー広告が多いです。

ただ、「もう用がないから見たくない」と思っても、GoogleAdsのように「もう表示させないでくれ」と操作すると別の広告を表示する、節度のある広告業者もいれば、そのような **オプトアウト** の手段を用意していない広告業者もいます。

そのような場合には、Windowsのローカルホストのファイルを書き換えることで、表示させなくすることができます（必ずではないかもしれません）。

Windows10では、「C:\Windows\System32\drivers\etc\hosts」が該当するファイルなので、メモ帳を管理者権限で起動後、該当ファイルを開き、その広告配信業者のドメインを127.0.0.1に紐づけていきます。

# 記入例
```
127.0.0.1 static.criteo.net privacy.as.criteo.com cat.jp.as.criteo.com ads.as.criteo.com
```

保存後、ブラウザをリロードして広告が表示されなくなれば、ひとまず成功です。

# 注意
ローカルでWebサーバを立ち上げている場合、アクセスログに上記広告関連のログが現れるようになります。
Unity Hub beta版をUbuntu16.04で使ってみる

なんかUnity Hubというサービスが出ていました。詳しくは以下のツイートのリンクからどうぞ。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">しらなかた<br>Unity Hub v1.0 is now available! <a href="https://t.co/5J9w83VBBR">https://t.co/5J9w83VBBR</a> <a href="https://twitter.com/unity3d?ref_src=twsrc%5Etfw">@unity3d</a>さんから</p>&mdash; pollenJP(@&#39;ω&#39;@)強化学習の修行中 (@polleninjp) <a href="https://twitter.com/polleninjp/status/1045571729177829376?ref_src=twsrc%5Etfw">2018年9月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

というわけで、Linuxでもベータ版でしたが使えるようだったのでUbuntu16.04にインストールする手順などを載せたいと思います。

※個別にインストールしたい方は次の記事をどうぞ。([Unity3DゲームエンジンをUbuntu16.04にインストール](https://qiita.com/pollenjp/items/df7679ba5a537bb7f295))

## Downloadページ
以下のサイトにダウンロードリンクがあります。
[Unity Hub Release Candidate (0.20.1) is now available - Unity Forum](https://forum.unity.com/threads/unity-hub-release-candidate-0-20-1-is-now-available.546315/)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/90c1b1f2-f587-bcc4-e1cc-cc8328941853.png)

### ドキュメント
ちなみに僕は[こちら](https://forum.unity.com/threads/unity-on-linux-release-notes-and-known-issues.350256/page-2#post-3625345)から上のページに飛びました。ドキュメントもあるみたいですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/bb2755b9-1c67-a2a4-bcd6-756efd0b6e95.png)

**ドキュメント**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/c741179c-6995-19ce-89b6-10efbd074f02.png)
どうやら現在(2018/09/28)はグーグルドキュメントのようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/9220730e-192b-1bf7-dec6-b366962057da.png)

## インストール
ここでは`UnityHubSetup.AppImage`をダウンロードしたと想定しています。
インストールしたディレクトリに移動して実行権限を与えます。デフォルトだとダウンロードしたユーザに対して実行権限を与えれば良いので以下で大丈夫です。

```
$ chmod 764 UnityHubSetup.AppImage
($ chmod +x UnityHubSetup.AppImage)
```

実行権限を与えたら実行しましょう。

```
$ ./UnityHubSetup.AppImage
```

すると何かしらの質問に同意した後に以下のような画面が開きます。（ここでは既にインストールしているため2018.2.10f1が表示されていますが最初は何もありません。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/c9000796-317c-0db9-1530-c1e7ca2aa1d7.png)


あとはOfficieal Releaseからダウンロードしてインストールされます。

ちなみにこのときデフォルトでホーム下のUnityディレクトリにダウンロードされます。

## 実行
Unity Hubのプロジェクトから直接選択すれば、Preferedとなっているバージョンが選ばれます。Preferedはいつでも変更できます。

他に保存場所のバージョンのUnityを直接起動する方法もあります。
例えば`2018.2.10f1`のバージョンを起動したい場合は以下を入力して直接実行することで立ち上がります。バージョンに応じて変更してください。

```
$ ~/Unity/Hub/Editor/2018.2.10f1/Editor/Unity
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/30207e47-561d-62af-ca9d-7d4ae0f0d090.png)
仮想環境 Parallels に、Ubuntu16.04 をインストールした

# 概要
Mac HighSierra にインストールしてある 仮想環境 Parallel で、Ubuntu 16.04 をインストールしました。

# 参考URL
主にこちらのブログを参考にしました。
[jittodesign blog: Parallels Desktop 12 for MacにUbuntu16.04をインストールする(2016/12/25 投稿)](https://jittodesign.org/parallels-2-10129/)

# インストール手順

Parallels の 簡易インストールでは 現時点で最新バージョンのUbuntu18 しかインストールできないので、今回はディスクイメージからインストールしていきます。

## Ubuntu16.04 ISOファイル(ディスクイメージ)取得
Ubuntu の公式ページからダウンロードします。
ダウンロードページ → [http://releases.ubuntu.com/16.04.5/](http://releases.ubuntu.com/16.04.5/)

64bit用のデスクトップイメージのを選択します（下図）。
**[64-bit PC (AMD64) desktop image](http://releases.ubuntu.com/16.04.5/ubuntu-16.04.5-desktop-amd64.iso)** 


<img width="1188" alt="Screenshot 2018-09-28 19.33.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/287890/f7b1d257-677f-e5b8-5350-7a0f62392eb1.png">

ちなみに、上図では、**Desktop Image** の下に **Server Image** も見えますが、これは、複数ユーザーが、GUI (デスクトップとか) を使わずに、コンソールからアクセスして使用する場合(サーバーなど)に使用します。今回は、個人ユーザーのみが使うので、GUIありの(一般的な)ディスクイメージを使用します。

**おまけ**：Ubuntu 16.04は “Xenial Xerus”と名前がつけられています。この Xerus はアフリカに生息するジリス（地面で生活するリス）の仲間で，「⁠俊敏であり」「⁠高い社会性を持ち」「⁠重複する縄張りの中で折り合いを付けながら暮らす」能力に長けた小動物です。

イメージディスクは容量 1.5 GB あるので、ダウンロードに時間がかかります。少し待ちましょう。ちなみに、ダウンロードが完了したら、**このディスクイメージ ubuntu-16.04.5-desktop-amd64.iso を、ホームディレクトリ(あるいは安全な場所)に移動しておきましょう。**
（このイメージディスクをダウンロードに入れたままにしておくと、**間違えてディスクイメージを削除した時に仮想マシンも削除されます**。）

## Parallels Desktop 14 for Mac 起動
Docs にある「Parallels Desktop」を右クリック>「Control Center」を選択する。


### 新規仮想マシンの作成

<img width="535" alt="Screenshot 2018-09-28 19.47.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/287890/207a90f9-9dd8-43d4-3a17-27b0a52116c9.png">

この図の右上の「**＋**」ボタン（Create a virtual machine）を押して、新しい仮想環境を追加する。

### 仮想マシンの構築方法の選択
<img width="867" alt="Screenshot 2018-09-28 19.56.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/287890/f5e8b372-2303-f060-0151-af5b54377cc4.png">

ここで、真ん中の「Install Windows or another OS from a DVD or image file」を選択し、先ほどダウンロードしたディスクイメージをドラッグしてくる。

## Ubuntu のインストール
<img width="636" alt="Screenshot 2018-09-28 20.17.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/287890/3ae9ff18-96dc-1a83-9d96-38704f2c273c.png">

ユーザー名など登録したら、上の画面が現れるので、上から二番目の Install Ubuntu を選択する。

### インストールの準備
![Screenshot 2018-09-28 20.18.23(2).png](https://qiita-image-store.s3.amazonaws.com/0/287890/c1aa059b-25ba-7247-490c-44f721e979a8.png)
図の二つのチェックボックスにチェックを入れる。

あとは全部変更せずに、「Continue」を押せばインストールされる。

### インストール完了後

<img width="983" alt="Screenshot 2018-09-28 20.40.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/287890/d5360fce-f709-656a-e586-7e2497446193.png">


インストール後、再起動をかけると、永遠に起動しないので、
Actions>Reset を選ぶと、画面が正常に開きます（上図は端が切れているけど...）。

---
以上です！
質問などあれば、気軽にご連絡ください。

(2018.9.28作成)
pythonエラーまとめ

#'int' object is not callable :
原因   : classオブジェクトの呼び出しのとき、呼び出す対象が整数のときに()を付けるとエラーとなる。
解決策 : ()を外す

```py

from datetime import datetime 
t = datetime.now()
#ty = t.year()                #エラーになる
ty = t.year 
``` 

#invalid literal for int() with base 10: ''
''を整数に変換できない。

```py

lastday[i] = int((lastday[i].split(","))[0])
```

#unsupported operand type(s) for -: 'str' and 'int'
マイナス（-）という演算子(operand)に対して間違った対象(この場合、文字列と整数)を用いていたため。直すには、int関数などを用いて、文字列と文字列相手にするか、整数と整数相手に行う。

```py

step = "1"
step = step - 1
#直すにはint(step)を2行目に挟めばよい
```

#list indices must be integers or slices, not tuple

```py

D = np.array([[1,v1,v1,0,0,0],[v1,1,v1,0,0,0],[v1,v1,1,0,0,0] \
              [0,0,0,v2,0,0],[0,0,0,0,v2,0],[0,0,0,0,0,v2]])

#np arrayに対応していない形式になっている。（一行目の,が不足している）
#以下の形にすればよい(リスト形式になる。)
#D = np.array([[1,v1,v1,0,0,0],[v1,1,v1,0,0,0],[v1,v1,1,0,0,0], \
#              [0,0,0,v2,0,0],[0,0,0,0,v2,0],[0,0,0,0,0,v2]])

```

#'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
os.chdir("")でのエラー
不要なスペースや不適切な区切り文字がディレクトリの名前に入っていることが原因だと思われる．区切り文字```\```を```\\```など，別の文字にすると解決できることがある．
PostgreSQL on EC2 から Amazon RDS for PostgreSQL に移行した時にハマった闇 10選

# 移行 への 道のり 

- 社内で初めてのAWS商用利用サービス
  - 単一 availability zone
- ほぼメンテされなくなっている自社HA構成

→ なんとかしたい

- from : PostgreSQL 9.3 on EC2 
- to : Amazon RDS for PostgreSQL (9.4) Multi-AZ!  
  
  これを達成するために、いくつもの闇を垣間見ることになりました。  

---


# Amazon DMS の 闇 

---

# 1. ソースDB PostgreSQL 9.4 or later 

- ソース側にレプリケーションスロットの設定が必要
  - （つまり、そのあたりの機能を使っている）ということでここを回避するのは難しい

- 私たちは、事前にアップグレードメンテをやりました（することができました）

---

# upgradeも時間を短縮したい！

### ` pg_upgrade -k ` 

- ハードリンクで移行をすることによって、アップデートにかかる時間は大幅に短縮
- 旧バージョンの `PGDATA` 領域にあるgarbageは `VACUUM` でも回収されない部分がでてきてしまう
  - ストレージ領域の余剰に注意

---

# 2. 謎のエラー終了（テーブル単位）

どうしてもエラー終了になってしまうテーブルが存在した。
  → マニュアルをみても、ログを見ても理由が不明で解消しきらない
  → 「がんばってしまう」のか、これらがあるとタスク完了までの時間も延びる

DMSタスクで「除外」に設定して、テーブルダンプで対応
  → データベース全体からみれば小さい話なので、がんばりすぎないで割り切る。

---


# Amazon RDS for PostgreSQL の 闇との 合わせ技

---

# 3. superuser の 闇

 **Amazon RDS for PostgreSQL では superuser は使えません**  
   
（正直な話、superuserさえ使えていれば特に問題にならない話が多いです）  

---

# 4. pg_dumpall は 使えない

当たり前ですが特権的なデータベースオブジェクトを含むpg_dumpallは、superuserがつかえないのでまともに使えません。

## pg_dump は `-x ` `-O` オプションをつける

データベースオブジェクトのオーナー毎に DMS タスクを作ればいけるかも？

---

## 5. large object の 闇

### ラージオブジェクトはDMSの移行サポート外

- 某サービスでは、このlarge object をかなり重要なデータに使っている。
- pg_largeobjectテーブルは superuser でないと直接扱えない
- どうするか…… 

### `-O -x` オプションでテーブルダンプする ← 結論

---
# 6. timestamp型の闇 
  
  
#### `timestamp with time zone`  型のカラムの値が、9時間ずれている！

- `2018/09/18 18:00+09` → `2018/09/18 09:00+09` のようなズレ
  - 一見すると不可解。

#### `timestamp with time zone` はDMSのサポート対象外

- ドキュメントには確かに書いてある（マジかよ）
- 困ってサポートに泣きついた
  - 「パラメータグループで、RDSのタイムゾーンをUTCにして、移行が完了したらRDSのタイムゾーンをAsia/Tokyoにするという方法で回避できないか」
  - → 無事回避

（言われてみれば、一旦UTCにしてデータを転送したあと、時刻表記をずらさずにタイムゾーン情報だけ後付けしているみたいなズレ）

---


#金の弾丸強い


---

# 7. テーブル継承の闇

#### テーブル継承をつかった同一ノード内で水平分割をしているテーブルがある

- 親テーブルに対するSELECT文の発行で、子テーブルを走査して結果を返してくれる
- 移行元では子テーブルにだけあるデータが、子テーブルのデータのみならず親テーブルのデータとしても抽出される
  - データが二重に移行されてしまう
- 親テーブルはデータ移行対象から除外する必要がある。

---

# 8.  スキーマと所有権の闇

#### ベーシックスキーマコピーの闇

- 元テーブルの定義をきちんと読んでくれるわけではなく、入っているデータを見ている
  - character varying （制限なし） は 既存カラムの最大長に合わせて最大文字列長が設定される。
- DMSはあくまで「データをコピーするためのマネージドサービス」と割り切って使う

---
## pg_dumpにオプションを付ける

### ` pg_dump -d <database_name> -s -o -O -x `


- `-s` でスキーマのみダンプ
- `-O` で 所有権情報を出力しない
- `-x` で アクセス権情報を出力しない。
- `-o` はoid情報の出力で、large objectを使っているので念のため。

---

# 所有権 の闇

superuserに頼った運用をしていると、以下の様な闇を踏むかもしれません。

## Materialized Viewの闇
Materialized ViewのREFRESHはMVの所有者でないと実施できません。

## テーブル継承の闇 パート2 
子テーブルが増えるタイミングのトリガーは、テーブルの所有者でないと実施できません。

---

# 9. 制約の闇

## 外部キー制約、つけていますか？

- （SQLアンチパターン第4章：キーレスエントリも読もう！）  

## 制約がついていると移行が難しい。

- FKやCHECK制約などはつけていない、シンプルなCREATE TABLE文だけを先にRDSインスタンスに適用
- DMSによるデータ移行を済ませた後に制約をつけたりインデックスを追加したり

---

# 10. sequenceの闇 

- シーケンスがどこまで進んでいるかはDMSによる移行対象になりません。

- 困ったときのQiita記事（ありがとうございます！）
  - [PostgreSQLでシーケンスを今の最大値にリセットする](https://qiita.com/unarist/items/1ef370933d5745d9c336)

## 落とし穴

- どこのカラムとも関連付けせずにアプリケーションから使っているシーケンスの存在
  - そんなものに限ってテストしづらい外部連携機能で使っていたりする。
  - つらい

---

# 終わりに

それでもAmazon DMSは便利でした。
いまではRDSで幸せに運用しています。
証明書認証が必要なgitリポジトリに対してpem秘密キー使って認証しようとしたら拒否されて困った話

# gitがpemを嫌がる
## 背景
* 証明書認証が必要なgitリポジトリへ、dockerコンテナ内部からコマンドでgit cloneをしたかった

## 解決までの流れ

### 問題発生
~~~
git clone https://ほにゃらら
～
Unable to 証明書
~~~

Unable to ~エラーメッセージを吐いてcloneが成功しない！
証明書が参照できないと言っているため、署名済みまで含めてすべてgit globalでパスを指定
改めてチャレンジ

~~~console
$ git config --local http.sslCert /hogehoge.cert.pem
$ git config --local http.sslKey /hogehoge.key.pem
$ git config --local http.sslCaInfo /hogehoge.cert.pem
~~~
参考:http://aki2o.hatenablog.jp/entry/2015/01/15/053351


### 設定を変更後、再チャレンジ

~~~
git clone https://ほにゃらら
～
Unable to 証明書
~~~
結果：無事死亡:smile:

まったく同じエラーを吐かれ原因もわからないのでググったところ、
以下ページにて、pem形式だと拒否されることがあることを知る
参考 : https://code-examples.net/en/q/13ff719

pem形式から普通のrsa形式へと変換！！
参考 : http://d.hatena.ne.jp/ozuma/20130510/1368114329

~~~sh
openssl rsa -in hogehoge.key.pem -text > hogehoge.key
~~~

さらにヘッダーとフッターを直書きで修正する。

~~~
-----BEGIN PRIVATE KEY-----
↓
-----BEGIN RSA PRIVATE KEY-----
~~~
~~~
-----END PRIVATE KEY-----
↓
-----END RSA PRIVATE KEY-----
~~~

### 結果：clone成功！！！
キーだけこの形式にしておけば後はpemでおｋだった

## 学び
* 認証局とは、秘密鍵と証明書が発行者によって発行されたことを証明するやつ

* オレオレ証明書は認証局を自分自身にして作ったのは俺だよ！って叫んで認めさせるやべえやつ

* 証明書は変換できるが、暗号化形式によっては面倒くさそう。

* 暗号化したkeyはずっと見てるとかわいく見えてくる

* 結局gitが何したいのかはおざなり

* 直書き修正が正しいのかは最後まで分からなかった、cloneできたからいいよね
Vueコンポーネント間の通信

#Vueコンポーネント間の通信
呼び出し元→子コンポーネントへの値の渡し方です。
##propsを用いた通信
```html:html
<div id="app">
  <child-component val="test"></child-component>
  <child-component val="hoge"></child-component>
  <child-component val="geho"></child-component>
</div>
```

```javascript:javascript
// 子コンポーネント
Vue.component('child-component', {
  template: '<div>{{val}}</div>',
  props: ['val']
});

// ルートインスタンス
new Vue({
  el: '#app'
})
```

```text:結果
test
hoge
geho
```

###解説
子コンポーネントが受け取りたい値を「**props**」プロパティで指定することができます。
親コンポーネントで記述する際に属性（<>の間の部分）で渡す値の中身を指定してあげてください。

##リアクティブデータを渡す
上記では属性の部分に直接、渡したいデータを記述しましたが
ルートインスタンス内で扱うデータ（リアクティブデータ）を渡すこともできます。
この場合は「**v-bind**」を用いて渡したいリアクティブデータとpropsで指定した値を紐づける（バインドする）必要があります。

```html:html
<div id="app">
  <child-component v-bind:val="value"></child-component>
</div>
```

```javascript:javascript
// 子コンポーネント
Vue.component('child-component', {
  template: '<div>{{val}}</div>',
  props: ['val']
});

// ルートインスタンス
new Vue({
  el: '#app',
  data: {
    value: 'hogehoge'
  }
})
```

```text:結果
hogehoge
```

###解説
これでルートインスタンスのvalueを子コンポーネントのvalまで渡すことができました。
ここでvalueへ変更を加えるとvalにも即反映されます。

が、逆にvalへ変更を加えると一応valueにも変更は反映されますがコンソール上ではwarmが表示されます。


```javascript:javascript
// 子コンポーネント
Vue.component('child-component', {
  template: '<div>{{val}}<button @click="addValue">add</button></div>',
  props: ['val'],
  methods: {
    addValue: function(){
      this.val += 10
    }
  }
});

// ルートインスタンス
new Vue({
  el: '#app',
  data: {
    value: 100
  }
})
```

```text:warm
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "val"
```
「親コンポーネント(ここではnew Vueしたインスタンスのことです)の値を子コンポーネントが書き換えるのはあかんやで」
コンポーネントは多くの場所で使いまわされます。
使われ先で一斉に元の値を書き換えられるとバグのもとになってしまうので避けなければなりません。
どうしても書き換えが必要になった場合は算出プロパティで新しくデータを作成するか$emitを使います。
（記事かみんぐすーん）

##まとめ
文才がねぇ
後は
子コンポーネントでのデータ加工（いつかここにりんくがつく）
受け取る値への制御（いつかここにりんくがつく）
を書きたいと思います。
記事へ間違いやご指摘あればお願いします。
Rails Tutorial6.2.5 補足

##演習２

>テストスイートの実行結果を確認しながら、before_saveコールバックをemail.downcase!に書き換えてみましょう。ヒント: メソッドの末尾に!を付け足すことにより、email属性を直接変更できるようになります (リスト 6.34)。
>
```ruby
class User < ApplicationRecord
  before_save { email.downcase! } #ココ！
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
end
```

コールバックメソッドを用いて、データベースに保存する前に`downcase!`で`!`を使用する演習です。
演習を行った後に、そのまま6.3/6.3.2に行くと新たな設定を加えた後にリスト6.40にてテスト結果がGreenになることを想定しているのですが、当然ながら、結果はRedとなり帰ってきます。

##対処
terminalにて返ってくるエラーより、問題となる箇所は`email address should be unique`になります。
そこで`/test/models/user_test.rb`に移動して

```ruby
	test "email addresses should be unique" do
	 duplicate_user = @user.dup
	 duplicate_user.email = @user.email.upcase! #ココ！　"!"を加える
	 @user.save
	 assert_not duplicate_user.valid?
  end
```

`/models/user.rb`にてコールバックメソッドにて`!`を用いた書き換えを行っているので、それに対応するようにテストコードにも`!`を記述しなければいけないのですが、演習では「書き換えてみましょう！」で確認することまでは記述されていないので忘れてしまってはいけないわけですね。
さして引っかかることもないかと思いますがテストを書き慣れていないので、備忘録になります・・。
KotlinからJavaにDecompileする

自分が書いたKotlinがJavaではどうなるか気になりませんか？

Android Studioが提供するbyteコードのDecompileでJavaのコードが確認できますので、そのやり方を調べます。

#Kotlin Decomplie
Android StudioでKotlinプラグインがインストールされていれば、Kotlin Bytecodeの確認ができます。

`Tools` > `Kotlin` > `Show Kotlin Bytecode`
<img width="508" alt="スクリーンショット 2018-09-27 23.54.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/269837/d5e951aa-5bde-3993-a0cd-8e8f3fdee986.png">

`Show Kotlin Bytecode`をクリックすると下記のようにKotlin Bytecodeが確認できます。Bytecodeを確認したりJavaコードでの確認が可能です。
<img width="559" alt="スクリーンショット 2018-09-27 23.57.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/269837/97614d1c-93b7-fa6c-7185-9ae62d0b9eca.png">

上記の画像で`Decompile`をクリックするとJavaコードでデコンパイルの結果が確認できます。

#デコンパイルしてJavaで確認
下記はwhenで作成したサンプルコードです。

```kotlin
when (item.itemId) {
    R.id.navigation_home -> {
        message.setText(R.string.title_home)
        return@OnNavigationItemSelectedListener true
    }
    R.id.navigation_dashboard -> {
        message.setText(R.string.title_dashboard)
        return@OnNavigationItemSelectedListener true
    }
    R.id.navigation_notifications -> {
        message.setText(R.string.title_notifications)
        return@OnNavigationItemSelectedListener true
    }
}
```

デコンパイルしてJavaコードの確認できます。

```Java
switch(item.getItemId()) {
    case 2131230822:
    ((TextView)MainActivity.this._$_findCachedViewById(id.message)).setText(2131623990);
    return true;
    case 2131230823:
    default:
    return false;
    case 2131230824:
    ((TextView)MainActivity.this._$_findCachedViewById(id.message)).setText(2131623991);
    return true;
    case 2131230825:
    ((TextView)MainActivity.this._$_findCachedViewById(id.message)).setText(2131623992);
    return true;
}
```

Bytecodeが読めたらいいですが、慣れないので`Decomplie`ボタンをクリックして上記のようにJavaで確認した方が良いと思います。
XPS 13 9370 (2018) にUbuntuとWindowsのマルチブート環境を構築するメモ

## 目的
Linuxデスクトップとして使いつついざというときのためにWindowsも残す

## 注意点
### 高速スタートアップ
#### 高速スタートアップがオンだと起動しない
Windows側から高速スタートアップをオフに
セキュアブートと混同して忘れがち
### SATA Controllerの設定
#### RAIDにするとUbuntuが起動せずAHCIにするとWindowsが起動しない
AHCIに設定してWindows 10をセーフモードで1度起動させると、ドライバがインストール(?)されてAHCIでもWindowsが起動するようになる
### Ubuntuのインストール先
#### ボリュームを分割しただけでは認識しない
NTFSで良いので削って新規作成したあとフォーマットしておく
### Windows Boot Managerを残す
#### そのままだとgrubに上書きされる
インストールの際にgrubのインストール先をUbuntuをインストールしたパーティションにする

## 参考URL
[Linux/Windows dual boot on the XPS 13 9370 (2018)](https://promethe.io/2018/03/15/linux-windows-dual-boot-on-the-xps-13-9370-2018/)
hyper(hyperterm) 2.0 を日本語対応する

hyper(term) 2.0 以上で日本語化する

hypertermが日本語対応ずっとされてなかったのが

https://github.com/zeit/hyper/issues/2322
https://github.com/zeit/hyper/pull/2913

このへんで解決されたようだが、デフォルトではやはりうまく対応されてなかった

# 答え：localeは設定する必要があった。
.bashrcや.zshrcに設定していれば不要。今回はhyperterm用に設定する

メニューから `hyper` -> `preferences` で、.hyper.jsファイルを開いて、envに下記を設定

```.hyper.js
env: {
  LANG: "ja_JP.UTF-8",
  LC_ALL: "ja_JP.UTF-8"
},
```

この後、**hyperのプロセスを完全に落として再起動**する

localeを実行して下記のようになっていれば成功

```
% locale
LANG="ja_JP.utf8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL="ja_JP.UTF-8"
```

日本語入力も表示もできるはず
thymeleaf : TemplateInputException でハマった件

th:replace を使いたいと思って、ちょっとだけハマりました。

失敗したやり方
----
/templates/admin/input.html で利用するために、以下の部品テンプレートを作成した。

```/templates/components/buhin.html
<body>
    <input type="hidden" name="mode" th:value="${mode}" />
</body>
```

本体のテンプレートファイルが、

```/templates/admin/input.html
<div th:replace="${components/buhin}"></div>
```
↓↓↓↓↓
以下のエラーが出た

```
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/admin/input.html]")
	at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241)
	at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100)
	at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666)
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098)
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072)
	at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:354)
	at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:187)
（中略）
Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "components/buhin" (template: "admin/input" - line 30, col 7)
	at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393)
	at org.attoparser.MarkupParser.parse(MarkupParser.java:257)
	at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230)
	... 86 common frames omitted
（後略）
```

修正した内容
----

```/templates/components/buhin.html
<body>
    <div th:replace="components/buhin"></div>
</body>
```
これでOKだった。
【C#】Queueに複数の要素を1行でEnqueue

こんなの誰得か分かりませんが、ちょっと悩んでしまったのでメモ。
しかもパフォーマンスはよろしくなさそうです。

```C#
var queue = new Queue<hoge>();

//事前処理でQueueには何か入ってる
var hoge1 = new hoge();
hoge1.fuga = fugafuga();
queue.Enqueue(hoge1);

//まとめて突っ込みたいコレクションが出来てしまった。
hoge[] array = hogehoge();

//forでなくQueueに1行で突っ込む
//重複を除きたいならUnion 今回のケースでは冗長だった・・・。
//queue = new Queue<hoge>(queue.ToArray().Union(array));
//重複を許容するならConcat↓
queue = new Queue<hoge>(queue.ToArray().Concat(array));
```

QueueやStackは今やほとんど使い道がなくなってしまったように感じます。
LINQのおかげもあるんでしょうか。

昔ながらのASCIIメッセージ通信をバッファっぽく使ってやりたかったのでQueueが適してるかと思ったんですが、まとまって突っ込みたいタイミングが出てきてしまい、なんとなくforeachを避けてみようと思ったらこんなことに・・・。

ListにDequeueっぽい機能を拡張した方が幸せなのかな、と言う気がしますね。


(2018/10/02 追記)
Queueにまとめて突っ込みたい場合はコメント頂いた拡張メソッドの適用を検討してください。
add_headerを使ってnginxをデバッグする

「このlocationディレクティブってちゃんと動いてんのかな・・・ :thinking: 」
みたいな確認は`add_header`を使うと便利です。

```conf:nginx.conf
location = / {
  add_header X-debug-message "this location is /";
  ...
}
```

Developer consoleで確認してみると、、、

![スクリーンショット_2018-09-28_13_13_11.png](https://qiita-image-store.s3.amazonaws.com/0/611/11a5fe39-239f-3723-3202-556a4f6c0ec6.png)

Response Headerにちゃんと反映されてますね :tada: 

以上です。

参考
---
- [How to output variable in nginx log for debugging - Server Fault](https://serverfault.com/questions/404626/how-to-output-variable-in-nginx-log-for-debugging)
- [Module ngx_http_headers_module](http://nginx.org/en/docs/http/ngx_http_headers_module.html)
[Google API] 無料版だとgeocodeが取得できないので修正した

```
/**
 * 住所からgooglemapデータを取得する
 * */
function get_google_map_data_by_address(address){
    var api_url = "https://maps.googleapis.com/maps/api/geocode/json?address="+address+"&language=ja&sensor=false";
    var result;
    var json = $.ajax({
    	type: 'GET',
		url: api_url,
    	async: false,
    }).responseText;
    result = JSON.parse(json).results[0];
    return result;
}
```
最初は順調に動いていたのに突然取得できなくなったorz

```
{
   "error_message" : "Keyless access to Google Maps Platform is deprecated. Please use an API key with all your API calls to avoid service interruption. For further details please refer to http://g.co/dev/maps-no-account",
   "results" : [],
   "status" : "OVER_QUERY_LIMIT"
}
```

無課金は5件/日しか取得できない模様（少なっ！！

じゃあ、キーを付けてみよう

```
    var api_url = "https://maps.googleapis.com/maps/api/geocode/json?address="+address+"&language=ja&sensor=false&key=[API_KEY]";
```
```
API keys with referer restrictions cannot be used with this API
```
リファラ制限付きのAPIキーはこのAPIでは使用できません

仕方ないのでHTTPリファラ制限のないAPIキーを新規作成しよう。


とりあえず開発環境のIPだけを通して実行。

```
{
   "error_message" : "This IP, site or mobile application is not authorized to use this API key. Request received from IP address [知らないIPアドレス], with referer: [リファラ]",
   "results" : [],
   "status" : "REQUEST_DENIED"
}
```
知らないIPアドレスは会社のIPアドレスだった。
javascriptで実行する際にはIP addressがブラウザのIPアドレスになるらしい。

phpに変更しよう。

```
$url = "https://maps.googleapis.com/maps/api/geocode/json?address=".urlencode($address)."&language=ja&sensor=false&key=[API_KEY];
$json = file_get_contents($url);
echo json_decode($json, true);
```

```
/**
 * 住所からgooglemapデータを取得する
 * */
function get_google_map_data_by_address(address){
    var api_url = '/get_geocode.php?address='+address;
    var result;
    var json = $.ajax({
    	type: 'GET',
		url: api_url,
    	async: false,
    }).responseText;
    result = JSON.parse(json).results[0];
    return result;
}
```


取れた取れた♪

リファラ問題は色々と難しいな…。
Google Spreadsheet 半角から全角に変換


```javascript:GAS.gs
function toFullWidth(value) {
  if (!value) return value;
  return String(value).replace(/[!-~]/g, function(all) {
    return String.fromCharCode(all.charCodeAt(0) + 0xFEE0);
  });
}
```

使い方は、セルに

=toFullWidth(123)

みたいに入力してください

123 ▶ １２３

で表示されます。

全角▶半角は、GSでは無いとされてる？ ASC() で出来ました。
しかし、テストは英数のみ。カタカナとかできなさそうです


丸コピです、m(__)m。
http://shanabrian.com/web/javascript/to-full-width.php
libGDXでTiledのマップを描画した上に画像を描画する方法

# 前回記事
[libGDXでTiled Map Editorのtmxファイルを読み込み、描画ずる方法](https://qiita.com/ibuki0828ta/items/9990baf48b4e6b2870f4)

# やること
前回表示したマップの上に画像を表示させる。

#　重要なソースコード
```
tiledrenderer.getBatch().begin();
tiledrenderer.getBatch().draw( imagePass, positionX, positionY );
tiledrenderer.getBatch().end();
```

Tiledを使わない通常の画像表示の場合batch().begin();からbatch().end();の間に書く決まりがある。
しかしTiledを使うと少し記述が変わってくる。

**renderer.getBatch().begin();からrenderer.getBatch().end();の間に書かなくてはいけない。
今まで通りのやり方だとおかしな実行結果になってしまいますので注意してください。**

私はこの情報を見つけるまでに2週間かかりました。しかもネット上に情報が無かったので、エクリプスの予測変換で探しました（疲）。
私と同じように、この情報を見つけることが出来ずに諦めている人がいるかもしれませんが、大丈夫です！
これからはこれを使えば問題ありません！

# 実際に使う方法
Mainのrenderに記述しています。

```Main.java

iledMap tiledMap;
OrthogonalTiledMapRenderer tiledRenderer;
OrthographicCamera camera;

public void create() {
        camera = new OrthographicCamera();
        camera.setToOrtho(false, WIDTH, HEIGHT);

        /* TiledMapの読込みとRendererの初期化 */
        tiledMap = new TmxMapLoader().load("map.tmx");
        tiledRenderer = new OrthoCachedTiledMapRenderer(tiledMap);
}

@Override public void render(){
        /* TiledMapの描画 */
        camera.update();
        tiledRenderer.setView(camera);
        tiledRenderer.render();

        /*マップの上に画像を描画*/
        tiledrenderer.getBatch().begin();
        tiledrenderer.getBatch().draw( imagePass, positionX, positionY );
        tiledrenderer.getBatch().end();
}
```

# まとめ
これで表示できると思います。
画像以外にもフォントやエフェクトも同じような感じで出来ます。
情報は見つからない割に簡単なことでした。

# 参考URL
今回は参考になるサイトは見つかりませんでした。
新しいExcelでテストデータを作ろう

新しいExcelに搭載される関数を使うと、いろいろなテスト自動化に使えそうなテストデータを量産できそうなので方法を紹介します。
OfficeInsider環境で調べております。
# SEQUENCE関数
SEQUENCE関数は一覧表を作る関数です。
「一覧表を作る？Excel関数で？何言ってるかよくわからないんですけど」
みたいに思うと思いますが、実際に一覧表が出来上がります。
書式は

```
=SEQUENCE(一覧表の縦サイズ,一覧表の横サイズ,開始値,増減値)
```

です。
セルA1に次の計算式を入れてみます。

```
=SEQUENCE(5,5,101,1)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/327dd46a-c199-0d6c-59f3-c420921835b9.png)
これ、セルA1に入れただけです。
新しいExcelはこんな感じで、範囲に出力できる計算式を作ることができるようになりました。
この機能を「スピル」と呼びます。
スピルに関してはこちら↓
<a href="https://qiita.com/yosatonet/items/2fc441343d210a484789">新しいExcelの一番の変更点は「スピル」？</a>

#RANDARRAY関数
同じようにスピルする関数で、乱数の一覧表を作成するRANDARRAY関数があります。
書式は

```
=RANDARRAY(一覧表の縦サイズ,一覧表の横サイズ)
```

です。
出力値は0以上1未満（検証して以内ではなさそう）です。
セルA1に次の計算式を入れてみます。

```
=RANDARRAY(3,5)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/0d107564-26de-22db-ee20-e65102dda01f.png)
という乱数一覧が表示されます。
「整数を入れたい」と？
関数を整数になる関数でくくればいいのです。

```
=INT(RANDARRAY(3,5))
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/7c044697-d6be-05c1-3bc9-ea74134424fc.png)
「それじゃ0にしかならない？100から200の値を入れたい」と？
乱数に100かけて100を足せばいいです。

```
=INT(RANDARRAY(3,5)*100)+100
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/7fdc3aa5-287b-85d3-c3f7-5137bbf42b03.png)
「16進数でほしい」と？
16進数に変換する関数を使えばよいです。

```
=DEC2HEX(INT(RANDARRAY(3,5)*100)+100)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/57491841-76a5-66bf-72c6-5f4af063f6c4.png)
といったように、このようなスピルする関数も他の関数と組み合わせができます。
#関数の組み合わせでテストデータを作る
さて、ここから、他の関数と徹底的に組み合わせて一覧表を作成したいと思います。
まず、１行目はフィールド名にしましょう。
今回は、学校のテストの成績表を作ってみます。
フィールドは、生徒名、国語、英語、数学、理科、社会の６つとします。
生徒名は、生徒1から始め、9人分のデータを作成します。
###項目名
1行目は数値の順に文字列を出していくCHOOSE関数を使います。

```
=SEQUENCE(1,6,1,1)
```

で1行に1～6の数値が求まります。
それにCHOOSE関数を組み合わせます。

```
=CHOOSE(SEQUENCE(1,6,1,1),"生徒","国語","英語","数学","理科","社会")
```

これで1行目を項目名とすることができます。
###生徒名
次に2行目以降の1列目に生徒名を「生徒」と行番号を組み合わせていきます。
SEQUENCE関数の値を6で割って整数にすればこの行番号になります。なんか行番号を求めるROW関数ではうまく動かないので使いません。

```
="生徒"&INT(SEQUENCE(9,6,1,1)/6)
```

###点数
最後に2行目以降のランダムな点数を求めます。0から99点でよければ、次の計算式です。

```
=INT(RANDARRAY(10,6)*100)
```

9人分なのですが、表の範囲全ての分を入れないと、データがないよと言われたので、10行分作ります。
これで求めるものすべてが出来ました。
###1行目の検出
今度はそれを条件で分けていかなければなりません。
1行目を検出するには、次の数式で検出できます。

```
=SEQUENCE(10,6,1,1)<=6
```

やはり10行分用意しています。安全を見ています。
で、6以内であれば1行目と判断しています。
###1列目の検出
次は生徒名を入れる1列目の検出ですが次の計算式です。

```
=MOD(SEQUENCE(10,6,1,1),6)=1
```

MOD関数で6で割った余りを求め、その値が1ならば1列目です。
###IF関数でジョイントする
以上をIF関数で分岐させていきます。
1列目ならば項目名、1列目なら生徒名、それ以外は点数となります。

```
=IF(1行目なら,項目名,IF(1列目なら,生徒名,点数))
```

という式に上記のものを組み合わせると次のようになります。

```
=IF(SEQUENCE(10,6,1,1)<=6,CHOOSE(SEQUENCE(1,6,1,1),"生徒","国語","英語","数学","理科","社会"),IF(MOD(SEQUENCE(10,6,1,1),6)=1,"生徒"&INT(SEQUENCE(10,6,1,1)/6),INT(RANDARRAY(10,6)*100)))
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/416ae5ee-f03f-de09-3da2-c0312a0e49b4.png)

ということで出来上がりです。
#まとめ
なんと一覧表が1つの計算式で出来てしまったのです。
これが新しいExcelの目玉中の大目玉かもしれません。
組み合わせることができる関数とそうではない関数がありますので、作成し試しながら作っていくことになるでしょう。
ランダムなテストデータを作る時は、n進数を求める関数や、値を様々なフォーマットに変換できるTEXT関数などと相性がいいかと。
PR は WIP で出した方がいいから git とは仲良くなっておきたい

# 言い訳

最初は、fixup とか rebase -i の話をしようとおもったのですが。

やめました。

----

# その代わり

ひとつでもいいから git の tips を提供したいと思います。

----

# まずはじめに TIPS
HEAD はもう書いていません @ がいるから

[Release note 1.8.5](https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.5.txt#L100-L101)

----

# 作業をなかったことにする

あなたは作業をして、コードにいくつかの変更を加えました。つまり Working directory に変更がいくつかある状態です。しばらくしてこの変更はまずいことに気づきました。Working directory の変更を全てなかったことにするために、どんな git コマンドを打ちますか？

![chart.png](https://qiita-image-store.s3.amazonaws.com/0/45822/0bec2e70-de6c-8b68-1739-668b97e91c0c.png)

```
$ git reset --hard

or

$ git checkout .

or

$ git stash
```

質問です。
reset と checkout の違いはなんですか？

質問です。以下の違いはなんですか？

```
$ git stash 
$ git stash -u
$ git stash --all
```

----

# いくつか前のコミットの状態にしたい
いまこのような状態です。

```
$ git log --oneline
c1dec0f (HEAD -> master) Add D
658fa0d Add C
5dfec5e Add B
07db11b Add A
```

4回コミットしました。A-B-C-D。今は最新のDの状態です。しばらくしてまずいことに気づきました。Bの状態から作業をやり直したいと思ったあなたは、どんな git コマンドを打ちますか？

![chart.png](https://qiita-image-store.s3.amazonaws.com/0/45822/bcee0bfe-4bde-d0f7-9c9c-fc1e13659141.png)


```
$ git reset @^^

or

$ git checkout @^^
```

質問です。
特定のファイルのみ B の状態にしたいときはどうしますか？

----

# あるファイルのみを、いくつか前のコミットの状態にしたい

どうしますか？

```
$ git checkout @^^ hoge.txt
```

質問です。
checkout にパスを渡すときと渡さないときでは何が変わりますか？

----

# reset と checkout の違いについて

網羅的に説明するのは難しいので、いくつかのポイントを紹介します。

なぜ、網羅的に説明するのが難しいかというと、reset, checkout ともに、
path を引数で持っているか否かで動きが異なるからです。

----

## reset --hard は path を指定できない 

```
$ g reset --hard @^^ hoge.txt
fatal: Cannot do hard reset with paths.
```

----

## checkout @^^ とすると detached HEAD になる

```
$ g checkout @^^
Note: checking out '@^^'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 5dfec5e Add B
```

git 使いたてで、これを知らないとパニックになります。

graph はこんな感じ。

```
$ git log --graph --branches --oneline
* c1dec0f (master) Add D
* 658fa0d Add C
* 5dfec5e (HEAD) Add B
* 07db11b Add A
```

そして、 `.git/HEAD` をみてみると以下のようになっています。

```
$ cat .git/HEAD
5dfec5ea84035e05983e40e30adabe949325e768
```

通常は以下。

```
$ cat .git/HEAD
ref: refs/heads/master
```

つまり、HEAD にブランチではなく、直接 SHA-1 ハッシュ値が記載されている状態が `detached HEAD` です。

ですから、おちついてその場所から `git checkout -b <new-branch-name>` しておけば OK です。

----

# checkout は staging area を無視する

なにかしらの変更を add している状態で、Working directory を HEAD の状態にしたい場合、
`git checkout @ .` では望んだ結果は得られません。

----
ZEAM開発ログ v.0.4.9 助言を受けて研究計画について再考する

ZACKYこと山崎進です。

私たちはFAISの研究助成金を受けて研究を進めています！ 今日はFAISの谷口コーディネーターとミーティングでした。とても貴重なご意見をいただけて，前向きに研究計画を修正することにしました！

[「ZEAM開発ログ 目次」はこちら](https://qiita.com/zacky1972/items/70593ab2b70d192813df)

# 今までの研究計画について

[「micro Elixir / ZEAM ロードマップ(2018年度)」](https://zacky1972.github.io/blog/2018/09/16/micro-elixir-zeam-loadmap.html) に書きましたが，今までは次の4段階のロードマップからなる計画でした。

**今までの研究計画**
|> ロードマップ第1段階: Polymorphic LLVM インラインアセンブラによる型多相・型安全なコード生成 (2018年10月リリース)
|> ロードマップ第2段階: Elixir制御構造のサポート (2018年12月リリース)
|> ロードマップ第3段階: リスト構造と Enum.map のサポート (2019年1月リリース)
|> ロードマップ第4段階: Enum.map による SIMD 命令のサポート(Hastega: ヘイスガ) (2018年2月リリース)

# 谷口コーディネーターの指摘

谷口コーディネーターは一通り話しを頷きながら聞いてくださった上で，次のように指摘しました。

**「Hastega の実現によって高速化することが目的であれば，ロードマップ第2段階はパスできるのでは？」**

この言葉に「ハッ」となりました。確かに，現在開発しているロジスティック写像のGPUベンチマークや，線形回帰，ディープラーニングの範囲であれば，制御構造なしでも **Enum 推しで行ける！！**

# さらなる考察

谷口コーディネーターの言葉を受けて，さらに @piacere_ex さんの[「Elixirは何故whileやメンバー変数が無いの？」に答えてみる①]
(https://qiita.com/piacere_ex/items/11cd08c1a74694309482)の考察も受けて，計画の見直しをかけました。

1. x86_64アーキテクチャが前提であれば SIMD 命令を前提にできることもあり，ロードマップ第3段階とロードマップ第4段階を最初から統合した形で研究・開発を進められそうです。
2. case や cond などの制御構造を含む関数は，その関数を呼び出す関数とインライン展開し，さらに定数伝播などを行うことで，制御構造の制御式を確定できて結果として制御構造を不要にできる可能性が高いです。ガード条件についても同様の最適化をかけることができそうです。
3. 制御構造を使うよりも，Enum.filter を推した方が，スッキリ最適化できそうな感じ。


# ロードマップを見直した結果

**新しい研究計画**
|> ロードマップ第1段階: Polymorphic LLVM インラインアセンブラによる型多相・型安全なコード生成 (2018年10月リリース)
|> ロードマップ第2段階: リスト構造と Enum.map，SIMD命令のサポート (Hastega: ヘイスガ) (2018年12月リリース)
|> ロードマップ第3段階: インライン展開・定数伝播と，最適化前提のElixir制御構造のサポート (2018年3月リリース)

FAISの研究「機械学習ライブラリの研究開発」に必要なロードマップ第2段階までが年内に終わりそうな見通しとなりました。

次回は[「ZEAM開発ログ v.0.4.10 マクロを使って micro Elixir のフロントエンドを作ってみる (試行錯誤編)」](https://qiita.com/zacky1972/items/101311574e2aacb243d4)です。お楽しみに！
Db2: 2つの期間が重なり合っているかどうかを判別するOVERLAPS述部

Db2 11.1の新機能から、日付がらみの新しい関数や新機能の紹介を続けます。

Db2 11.1では、日付・時刻操作に関して、Oracle, Netteza, PostgreSQL, MySQLなど、他のデータベース製品で使用されるSQLも簡単にDb2環境で実行できるよう、SQLの互換性がより強化されています。


参考(前回までの日付がらみの新しい組込み関数に関する記事) 
[Db2:日付,時刻の操作を行う関数(NOW,EXTRACT)](https://qiita.com/camp07/items/c07c662bfbbdbad73f24)
[Db2:日付,時刻の操作を行う関数(DATE_PART)](https://qiita.com/camp07/items/8bec02c01f6d7968d00a)
[Db2:日付,時刻の操作を行う関数(DATE_TRUNC)](https://qiita.com/camp07/items/12ecc353d3b8acce6733)
[Db2:その月から特定の日を取り出す関数(DAYOFMONTH,FIRST_DAY,DAYS_TO_END_OF_MONTH)](https://qiita.com/camp07/items/86966b742e1f6a320985)
[Db2:日付操作で任意の日を加える(ADD_DAYS,ADD_MONTHS 他)]
(https://qiita.com/camp07/items/9f1efda346f6b5556a8e)
[Db2:日付から異なる値を戻す関数(THIS_WEEK,THIS_MONTH,NEXT_WEEK,NEXT_MONTH 他)]
(https://qiita.com/camp07/items/8cc796d53bfbf2ab32c6)

# OVERLAPS 述語

OVERLAPS述部は、2つの期間が重なり合っているかどうかを判別するために使用します。
これは、Db2内部の関数というよりも、特別なSQLシンタックスの拡張として使えるようになっています。

時系列の期間は、日時式のペアによって指定されます。
最初の式は期間の開始を指定し、2 番目はその終了を指定します。

開始値と終了値は、期間に含まれません。
例えば、期間 2018-10-19 から 2018-10-20 と 2018-10-20 から 2018-10-21 は重なり合いません。





Db2のSAMPLEデータベースに接続して、実行してみましょう。

例えば、以下の例はオーバーラップしません。

```
VALUES
  CASE
    WHEN 
      (NOW, NOW + 1 DAY) OVERLAPS (NOW + 1 DAY, NOW + 2 DAYS) THEN 'Overlaps'
    ELSE
      'No Overlap'
  END;
```

```
1
----------
No Overlap

  1 レコードが選択されました。
```

しかし、最初の日付の範囲が一日延びると、以下の例のようにオーバーラップすることになります。



```
VALUES
  CASE
    WHEN 
      (NOW, NOW + 2 DAYS) OVERLAPS (NOW + 1 DAY, NOW + 2 DAYS) THEN 'Overlaps'
    ELSE
      'No Overlap'
  END;
```
```

1
----------
Overlaps

  1 レコードが選択されました。
```






#参考資料



- [Db2 11.1 Knowledge Center](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.welcome.doc/doc/welcome.html)

    - [SQL の互換性の機能拡張](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.wn.doc/doc/c0054107.html)
        - 新しい組み込み集約関数およびスカラー関数
    - [OVERLAPS 述語](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r_overlaps_predicate.html)
XcodeでOpenCV① とりあえず画像の読み込み

##はじめに

C++を用いてOpenCVで画像処理の勉強を始めるにあたって備忘録として投稿します．
Qiitaに投稿するのは初めてのため，表記の仕方などおかしい部分があるかもしれないのでアドバイスなど頂けたら嬉しいです．


##画像の読み込み
XcodeでのC++およびOpenCVの環境設定については他の方の投稿を参考にしてください．

今回は環境が構築できているという前提で画像の表示を行っていきます．

####コード
```c++:test.cpp

#include <opencv2/opencv.hpp>
#pragma comment(lib, "opencv_world342d.lib")
using namespace std;
using namespace cv;

int main()
{
    Mat img;
    img = imread("/Users/○○ユーザ名○○/Pictures/lena.png");
    if(img.empty()){
        cout << "Not Found";
        cin.get();
        return -1;
    }
    imshow("Input Image", img);
    waitKey();
    return 0;
}
```
　　
##解説

```
#include <opencv2/opencv.hpp>
#pragma comment(lib, "opencv_world342d.lib")
```

はじめの２つの行ではそれぞれOpenCVのヘッダのインクルード，ライブラリファイルの指示を行っています．これらを入力しないとXcodeでOpenCVを使うことができません．
"opencv_world342d.lib"の数字部分は自分のインストールしたバージョンに合わせたものを入力してください．(ver 3.4.1 → "opencv_world341d.lib")
　　
　　

```
using namespace std;
using namespace cv;
```

次の2行ではC++標準ライブラリ，OpenCVそれぞれの名前空間(関数やクラスのまとまり)の使用を許可します．
　　
　　

```
Mat img;
```
次の行ではMatクラスのオブジェクトを宣言します．
　　
　　

```
img = imread("/Users/○○ユーザ名○○/Pictures/lena.png");
```


さきほど宣言したMatオブジェクトに画像データそのものを格納していきます．
今回は画像ファイル"lena.png"を読み込みますが，個人的に，OpenCVで扱うデータはまとまったところで管理したいためフォルダを指定して読み込んでいます．ファイルがプロジェクトフォルダにある場合は直接"lena.png"とかで大丈夫だと思います．
　　
　　

```
if(img.empty()){
        cout << "Not Found";
        cin.get();
        return -1;
    }
```

この部分は画像を読み込めなかった時のエラー文表示処理です．
なくても動きますが一応．
詠み込まれなかった時に"Not Found"と表示されない場合，上のタブのView → Debug Area → Activate Console で表示されると思います．
　　
　　

```
imshow("Input Image", img);
```
imshow関数でウィンドウにMatオブジェクトを表示します．
第1因数にはウィンドウの識別名，第2因数には表示したいMatオブジェクトを入力します．
Xcodeでは日本語入力を行えないので識別名などには注意してください．

　　
　　

```
waitKey();
```
キー入力の待機時間(ミリ秒)を設定します．()に何も入力しないとデフォルト値の0になります．
0の場合，何かキー入力があるまで待ちます．


##おわりに
今回は初回ということで，OpenCVを使って画像の読み込みを行いました．
今後段階を踏んで画像認識などにも触れていくつもりです．
JSON-RPC使って、gethを動かしてみた

公式サイトをみながらgethを動かして行こうと思います。
https://github.com/ethereum/wiki/wiki/JSON-RPC



# 必須
こちらを参考にgethのインストールやmyGenesis.jsonファイルを準備してください。
[Ethereum [Solidity 開発環境準備]](https://qiita.com/kagami-r0927/items/1c24a8b461ac4a6396a8)
[Ethereum [プライベートネットワークに接続する]](https://qiita.com/kagami-r0927/items/af31aa6d51053787de43)
[Ethereum [etherの採掘]](https://qiita.com/kagami-r0927/items/6bfe493c49f713ca6331)




# Json RPC

こちらを実行してください。

```
$ geth --rpc --networkid 15 --nodiscover --datadir "ethereum-rpc" console
// Result
<略>
INFO [09-28|16:49:25.542] HTTP endpoint opened         url=http://127.0.0.1:8545       cors= vhosts=localhost
Welcome to the Geth JavaScript console!

instance: Geth/v1.8.14-stable/darwin-amd64/go1.10.3
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
```

となっていればおkです。

### --rpcの説明

gethのオプションで--rpcをつければrpc接続できます。

```
$ geth --rpc --rpcaddr "0.0.0.0" --rpcport "8545"　--rpcapi "web3,eth,net,personal" 
```
ブラウザからRPCにアクセスする場合は、適切なドメインを設定してCORSを有効にする必要があります。
また、--rpcapi "web3,eth,net" をつけることによって、利用する機能を個別に指定するオプションを追加することができます。

- --rpc:　HTTP-RPCサーバを有効にする。
- --rpcaddr "0.0.0.0"：　エンドポイントのホストアドレスの指定。無指定の場合、"localhost"。
- --rpcport "8545": エンドポイントのポート番号の指定。無指定の場合、8545。
- --rpcapi "web3,eth,net,personal"：　APIで受け付けるHTTP-RPCインターフェースの種類の指定。インターフェース名をコンマ区切りのリストで記述する。無指定の場合、"eth,net,web3"。
- –rpccorsdomain：クロスドメインを許可する設定。

# JSON-RPC Errors

| Code | Message | Meaning |
|:---- |:----|:----|
| -32700 | Parse error | Invalid JSON was received by the server.An error occurred on the server while parsing the JSON text. |
| -32600 | Invalid Request | The JSON sent is not a valid Request object. |
| -32601 | Method not found | The method does not exist / is not available. |
| -32602 | Invalid params | Invalid method parameter(s). |
| -32603 | Internal error | Internal JSON-RPC error. |
| -32000 to -32099 | Server error | Reserved for implementation-defined server-errors. |




# Versionの取得
web3_clientVersionで現在のクライアントのバージョンを返してもらいます。
新しいタブを開いて以下を実行してください。

```
$ curl -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' http://localhost:8545
// Result
{"jsonrpc":"2.0","id":67,"result":"Geth/v1.8.14-stable/darwin-amd64/go1.10.3"}
```

このように返ってきたと思います。




# 直前のブロックの数を返す

eth_blockNumberを使って直前のブロック数を表示します。

```
$ curl -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}' http://localhost:8545
// Result
{"jsonrpc":"2.0","id":83,"result":"0x0"}
```

採掘をしていないので、0が16進数で返されます。
16進数を10進数にする場合は、このようにします。

```
$ echo $((0x0))
// Result
0
```

このようにして、JSON-RPCを使っていきます。
もっといろんなメソッドを使いたい方は、[公式サイト](https://github.com/ethereum/wiki/wiki/JSON-RPC#web3_clientversion)を参考にしてください。