OmniAICreator/Qiita-1.07M huggingface dataset:
Unicode と UTF-8 (とその仲間たち) のざっくりした違い

![Unicode and UTF-8.png](https://qiita-image-store.s3.amazonaws.com/0/6697/cb7b2d5a-978b-e5d4-7ace-edb9e8c58f81.png)


# Unicode とは

文字集合のこと。ひとつひとつの文字に [符号位置](https://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E7%82%B9) と呼ばれる整数値を付けて管理している。


# UTF-8, UTF-16, UTF-32 とは

[文字符号化方式](https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E7%AC%A6%E5%8F%B7%E5%8C%96%E6%96%B9%E5%BC%8F) のこと。符号位置の整数値をコンピュータが使用できるようにバイト列に変換する。

# エンディアンとは

複数のバイトからなるデータをメモリに記録する際やネットワークで送受信する際などに、バイトを並べる順番のこと。**バイトオーダ** と呼ぶこともある。ビッグエンディアンでは上位側から、リトルエンディアンでは下位側から並べる。

![エンディアン.png](https://qiita-image-store.s3.amazonaws.com/0/6697/3f715d47-c490-b8d8-4a9f-de43954a6b93.png)


# 検証用コード

この記事を書くにあたって Python で検証したときのコードです。

```python
In [1]: import unicodedata

In [2]: import binascii

In [3]: unicodedata.name('鬱') # 名前を調べる
Out[3]: 'CJK UNIFIED IDEOGRAPH-9B31'

In [4]: ord('鬱') # 符号位置を調べる
Out[4]: 39729

In [5]: binascii.hexlify('鬱'.encode('UTF-8')) # UTF-8 でバイト列にエンコードしてから 16 進数表現に変換する
Out[5]: b'e9acb1'

In [6]: binascii.hexlify('鬱'.encode('UTF-16'))
Out[6]: b'fffe319b'

In [7]: binascii.hexlify('鬱'.encode('UTF-16LE'))
Out[7]: b'319b'

In [8]: binascii.hexlify('鬱'.encode('UTF-16BE'))
Out[8]: b'9b31'

In [9]: binascii.hexlify('鬱'.encode('UTF-32'))
Out[9]: b'fffe0000319b0000'

In [10]: binascii.hexlify('鬱'.encode('UTF-32LE'))
Out[10]: b'319b0000'

In [11]: binascii.hexlify('鬱'.encode('UTF-32BE'))
Out[11]: b'00009b31'

In [12]: binascii.hexlify('快感'.encode('UTF-16'))
Out[12]: b'fffeeb5f1f61'

In [13]: binascii.hexlify('快感'.encode('UTF-16LE'))
Out[13]: b'eb5f1f61'

In [14]: binascii.hexlify('快感'.encode('UTF-16BE'))
Out[14]: b'5feb611f'

```
htmlでテキストの省略

文字が枠に収まらない場合に…等で省略する方法ですが
CSSで出来ることを最近初めて知りました・・・

今まではサーバー側で文字数を調整したりjavascriptで調整していたりしていましたので
衝撃でした。

```css
div {
  width: 100px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
```

```html
<div>ああああああああああああああああああああ</div>
```

上のように設定するとdivのwidthをオーバーフローした時点で
ああああああああああああ…
と表示されるようになります。

https://jsfiddle.net/5Lbb8673/

**複数行には対応していません。**
SQLServer 秒部分を取り除く（HH:MM）

conertでhh:mi:ssにして、SUBSTRINGを使うという意外に単純な方法だが日本語の記事がなかったので、記載しました。

```
// GETDATE() から hh:mm

SUBSTRING(convert(varchar, GETDATE(),108),1,5)
```
### 参考
[HH:MM Format in SQL Server [duplicate]](https://stackoverflow.com/questions/11167903/hhmm-format-in-sql-server)
蟻本をpythonで: Sec. 2-5 グラフ


#page93: 二部グラフ判定

```py3

from Graph import join_dic  # 中身は下準備の記事参照
from Graph import d_to_ud  # 中身は下準備の記事参照

#############　有向グラフを作る ###########
N = int(input())
graph = {}
while 1:
    edge = input()
    if edge == "":
        break

    edge = list(map(int, edge.split()))
    dic = {edge[0]: edge[1]}
    graph = join_dic(graph, dic)
##########################################

graph = d_to_ud(graph)   ###再帰で処理したいので、無向グラフに

for i in graph:
    if isinstance(graph[i], list):
        continue
    else:
        graph[i] = [graph[i]]   #### for i in graph[hoge]で処理を統一できるように, 

# 追記) if not isinstance(graph[i],list) とすればよかった。

color = (N) * [0]

def coloring(start, col):  ## node start が属する連結成分を塗れるか

    color[start] = col

    for i in graph[start]:
        if color[i] == col:  ##隣接サイトが同じ色だったらアウト
            return False
        if color[i] == 0 and (not coloring(i, -col)):　 ##隣接サイトが無色だったらそこからstartと逆の色で塗り始める
            return False

    return True


def solve():
    for i in graph:
        if color[i] == 0:
            if not coloring(i, 1):    ## iからスタートしてその連結成分を塗れるか
                print("No")
                return 0

    print("Yes")
    return 0


solve()


```

入力:

```py3
4  
0 1
1 2
2 3
0 3
```

出力:

```py3
Yes
```


入力:

```py3
3
0 1
1 2
2 0
```

出力:

```py3
No
```

グラフが連結とは限らないので全てのnodeについて見ていく必要がある。



#page95: ベルマンフォード法

入力:

```py3

3

0 1 1
1 2 1
0 2 3

0

2
```

出力: 

```py3

2

```


```py3

import mygraph

print("number of nodes")
N = int(input())

print("input graph")
graph = mygraph.WeightedGraph()

while 1:

    inputline = input()

    if inputline == "":
        break

    inputline = list(map(int, inputline.split()))

    graph.join(inputline[0], inputline[1], inputline[2])

graph = graph.undirected()


for node in graph:
    if not isinstance(graph[node][0], list):
        graph[node] = [graph[node]]

print("Start?")
startpos = int(input())
print("Goal?")
goalpos = int(input())


dp = N * [float("INF")]


while 1:

    update = False

    dp[startpos] = 0

    for from_node in graph:

        neighbors = graph[from_node]

        for [to_node, weight] in neighbors:

            if dp[from_node] != float("INF") and dp[to_node] > dp[from_node] + weight:

                dp[to_node] = dp[from_node] + weight

                update = True

    if not update:
        break

print(dp[goalpos])

```

mygraph.py は下準備の記事のコメントで@sishiracamusさんに書いて頂いたクラス化したもの。
Shell　メモ書き


shellでファイルを読み込んで　置換したり、検索したりする時に便利。


# まずファイルを読む

## 読ませるファイル
```text:test.txt
hoge
piyo
huga

piyos
hoges
hugas

piyoing
hogeing
hugaing

```

## shellの使い方

### 変数に代入し表示

```sh:read.sh
#!/bin/sh

text=`cat test.txt`
echo $text

```

```結果
hoge piyo huga piyos hoges hugas piyoing hogeing hugaing
```

### 結果を複数行で表示
```sh:read.sh
#!/bin/sh

text=`cat test.txt`
echo "$text"
```

```結果
hoge
piyo
huga

piyos
hoges
hugas

piyoing
hogeing
hugaing
```

### 指定した文字列の行を表示

```sh:read.sh
#!/bin/sh

text=`cat test.txt | grep hoge`
echo "$text"
```

```結果
hoge
hoges
hogeing
```

### 指定した文字列のみを表示、重複を一括表示

```sh:read.sh
#!/bin/sh

text=`cat test.txt | grep -o hoge | uniq`
echo "$text"
```

```結果
hoge
```


## 最後
なんかつかえそう
miraweb, max, ブラウザで操作

maxのmirawebを使って, ブラウザから操作できるようにする. 
同じネットワークにいるブラウザが使用可能なデバイスであれば, ipadでもpcでも何からでも操作可能になる. 

# 導入
maxで
https://cycling74.com/articles/content-you-need-miraweb
の
>
Miraweb is available in the Max 7 Package Manager (Max 7 > File > Show Package Manager) and will require installing the latest Mira package update from the Package Manager. 

で書かれている通りにinstallするだけ. 

# codes
https://github.com/keitasumiya/max/tree/master/miraweb

# result
https://www.youtube.com/watch?v=BT7alcNWfxg

# refs
https://cycling74.com/articles/content-you-need-miraweb
http://blog.antymark.com/2016/12/mira-web-launcher/
Bash on Ubuntu on Windowsで「名前が解決できません」を解決する方法

# 概要
* Bash on Ubuntu on Windows(以降BOW)にて、sudoコマンドのたびに「名前が解決できません」と表示される問題
* 特に表示されるだけで大した影響もないし放置していたのだが、sudoコマンドのあとのレスポンスが非常に悪くなった
* sudoコマンドを使った後、パスワード入力になるまで非常に時間がかかるようになった
* 最初は止まってしまったのかと思うほどレスポンスが悪い
* この「名前が解決できません」を直したらそのレスポンスも治ったのでこれが原因かも

# 原因
* Ubuntuに設定されているホスト名にWindowsのホスト名が設定されていないことが原因
* Windowsのホスト名っていうのはPC名のこと

# 解決手順
## ホスト名の確認
* まずはホスト名を確認する
* Bashを起動して`○○@○○○:~$`と表示されているところの@のあとのPC名がホスト名
* 例えば、`yasu@DESKTOP001:~$`のDESKTOP001の部分
* 記憶するなりメモるなりする

## ホスト名の設定
* 設定ファイルに記載する
* Ubuntuのコンソール上で使えるVimというエディタを使って、`/etc/hosts`ファイルを開く
* vimコマンドで普通に開いても、読み込み専用で開かれてしまうため、sudoコマンドを使って開く
* vimを使ったことのない人はこれを機会にVimのことを知ってみよう。そしてVimmerになろう。

```bash
$ sudo vim /etc/hosts
```

* 開いたファイルにはおそらく自分のPC名が記載されていないと思う

```
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
// ...以下省略
```

* 下のように自分のホスト名を追加して完了

```
127.0.0.1 localhost
127.0.0.1 pc-name

# The following lines are desirable for IPv6 capable hosts
// ...以下省略
```

## 動作確認
* Ubuntuを再起動する。BOWの場合は、一度exitしてもう一度bashコマンドで入ればいい。
* もしくは右上の☓でとじて、また開けばいい
* 適当にsudoコマンドを使ってみる。`sudo apt-get update`とかで良いんじゃないかな。
* 「名前が解決できません」と表示されなければOK！

# 所感
* 毎回エラーメッセージが表示されていたのがなくなったので良かった。
* sudoコマンドのレスポンスも通常のLinux端末と同様になったので良かった
* これってほぼすべての人が発生するんじゃないの？なんとかしてほしいなぁ。B
CentOS7において「ip addr show」の結果をちょっと理解できるように調べた記録

ネットワークの基本的なことがわかっていません。
けれども構築した仮想マシンのCentOSをちょっとだけでも理解できるようにしたいので調べました。

- 環境
    - OS : macOS Sierra Version10.12.4
    - VirtualBox : Version 5.1.22 r115126 (Qt5.6.2)
        - 仮想マシンのOS : CentOS Linux release 7.3.1611(Core)

「ip addr show」の結果![Screen Shot 2017-06-01 at 22.21.03.png](https://qiita-image-store.s3.amazonaws.com/0/159761/9b83bc82-e4f6-3b3e-009f-4ddcc48bf892.png)

### 「lo」と「enp0s3」は **ネットワークインターフェース名**
![Screen Shot 2017-06-01 at 22.21.03.png](https://qiita-image-store.s3.amazonaws.com/0/159761/11b0e94f-18d6-0a78-450e-61c86614d4d2.png)

<details><summary>ネットワークインターフェースとは</summary>
広域ネットワーク同士を接続するためのインターフェース仕様のこと
 [ネットワーク・ネットワーク・インターフェースとは - IT用語辞典 Weblio辞書](http://www.weblio.jp/content/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%BB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%BB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9)</details>

### 「lo」 は **ローカルループバック**
「lo」のところに `link/loopback` と `inet 172.0.0.1` と `scope host`が出力されている。
![Screen Shot 2017-06-01 at 22.21.03 2.png](https://qiita-image-store.s3.amazonaws.com/0/159761/5bc3c8ee-ea29-f21b-0023-6529db20457c.png)

<details><summary>ローカルループバックとは</summary>
自分自身を示す仮想的なIPアドレスです。「127.0.0.1～127.255.255.254」の範囲内ならば、どのIPアドレスでも利用できます。
[ローカルループバックアドレス　TCP/IP入門](http://atnetwork.info/tcpip/tcpip57.html)
</details>

### CentOS7におけるネットワークインターフェース名の決まり
「enp0s3」は、{en:イーサネット} + {p0:最初のバス} + {3番目のホットプラグ}ということらしい。
「enp0s3」のところに `link/ether` と `scope grobal`が出力されている。
![Screen Shot 2017-06-01 at 22.21.03 3.png](https://qiita-image-store.s3.amazonaws.com/0/159761/9afee0a4-8040-546b-3179-6a5c08ef03f6.png)

> CentOS5.xや6.xではNICデバイス名はethXという名称が使われるのが一般的でしたが、udevのバージョン197より予測可能なネットワークインタフェース名に設定されるようになり、enoXやenpXが使われるようになりました。デバイス名は接頭語ならびにデバイス種別によって決まります。
> [CentOS7におけるNIC命名ルール - 雑木林](http://zokibayashi.hatenablog.com/entry/2015/04/05/035642)

```
 * Two character prefixes based on the type of interface:
 *   en -- ethernet
 *   sl -- serial line IP (slip)
 *   wl -- wlan
 *   ww -- wwan
 *
 * Type of names:
 *   b<number>                             -- BCMA bus core number
 *   ccw<name>                             -- CCW bus group name
 *   o<index>[d<dev_port>]                 -- on-board device index number
 *   s<slot>[f<function>][d<dev_port>]     -- hotplug slot index number
 *   x<MAC>                                -- MAC address
 *   [P<domain>]p<bus>s<slot>[f<function>][d<dev_port>]
 *                                         -- PCI geographical location
 *   [P<domain>]p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>]
 *                                         -- USB port number chain
```
[systemd/systemd - System and Session Manager](https://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c#n20)

<details><summary>ホットプラグとは</summary>
機器の電源を入れ稼動状態を保ったまま、部品やケーブルなどを交換、装着、抜去すること。また、そのような仕組みやコネクタなどの構造のこと。
[ホットプラグとは - IT用語辞典](http://e-words.jp/w/%E3%83%9B%E3%83%83%E3%83%88%E3%83%97%E3%83%A9%E3%82%B0.html)</details>



ちょっとだけ自分のCentOSに近づけた気がする。
Cakephp3のAuthComponent

備忘録
タイトル通りCakephp3のAuthComponentを使ってみた
# 読み込み

```php:AppController.php
public function initialize() {
    parent::initialize();
    .
    .
    .
        $this->loadComponent('Auth', array(
            'authenticate' => array(
                'Form' => array(
                    'fields' => array(
                        'username' => 'user_id', // ユーザIDに該当するもの
                        'password' => 'pass' // パスワード
                    )
                )
            ),
            // 認証するアクション
            'loginAction' => array(
                'controller' => 'Users',
                'action' => 'login',
                'prefix' => false
            ),
            // ログイン成功時のリダイレクト先
            'loginRedirect' => array(
                'controller' => 'Dashboards',
                'action' => 'index',
                'prefix' => false
            ),
            // ログアウト後のリダイレクト先
            'logoutRedirect' => array(
                'controller' => 'Users',
                'action' => 'login',
                'prefix' => false
            ),
            'authError' => 'アクセス権限がありません' // アクセス制御した時のメッセージ
        ));
}
```

# ログアウト用設定
ログアウトするアクションへの許可を書いておかないと
セッション切れ => ログアウトボタンおす => 'アクセス権限がありません'
ってなったので書いておく

```php:UsersController.php
public function initialize() {
    parent::initialize();
    .
    .
    .
    $this->Auth->allow('logout');
}
```

# 参考
git : https://github.com/cakephp/cakephp/blob/master/src/Controller/Component/AuthComponent.php
公式 : https://book.cakephp.org/3.0/ja/controllers/components/authentication.html
Go言語のWebフレームワーク「Echo」を使ってみる ①（Hello World的な）

> すべての記事の一覧はこちら。
**Go言語でWebサイトを作ってみる：目次**
http://qiita.com/y_ussie/items/8fcc3077274449478bc9

初Qiita投稿になります。

GoのWebフレームワークを使ってみようと思いMartiniやらGinやらを調べていたのですが、Echoがそこそこ新しめのフレームワークで開発も活発なようなので、基本的な使い方を試してみることにしました。

#やりたいこと
以下のリクエストを処理する。
## GET /
以下のテンプレートを使用して生成したHTMLを返す。

全ページ共通のレイアウトテンプレート

```html:templates/layout.html
<html>
  <head>
    <title>Echo HTML Server Sample</title>
  </head>
  <body>
    <!-- Render the current template here -->
    {{template "content" .}}
  </body>
</html>
```

コンテンツ毎のテンプレート

```html:templates/hello.html
{{define "content"}}
<h2>Hello {{.}}!</h2>
{{end}}
```

## GET /api/hello
以下のJSONを返す。

```JSON
{"hello": "world"}
```

## GET /public/css | js | img
静的ファイルを返す。


# ということでいろいろと調べながら書いてみた

```go:main.go
package main

import (
	"html/template"
	"io"
	"net/http"

	"github.com/labstack/echo"
	"github.com/labstack/echo/middleware"
)

// レイアウト適用済のテンプレートを保存するmap
var templates map[string]*template.Template

// Template はHTMLテンプレートを利用するためのRenderer Interfaceです。
type Template struct {
}

// Render はHTMLテンプレートにデータを埋め込んだ結果をWriterに書き込みます。
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
	return templates[name].ExecuteTemplate(w, "layout.html", data)
}

func main() {
	// Echoのインスタンスを生成
	e := echo.New()

	// テンプレートを利用するためのRendererの設定
	t := &Template{}
	e.Renderer = t

	// ミドルウェアを設定
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())

	// 静的ファイルのパスを設定
	e.Static("/public/css/", "./public/css")
	e.Static("/public/js/", "./public/js/")
	e.Static("/public/img/", "./public/img/")

	// 各ルーティングに対するハンドラを設定
	e.GET("/", HandleIndexGet)
	e.GET("/api/hello", HandleAPIHelloGet)

	// サーバーを開始
	e.Logger.Fatal(e.Start(":3000"))
}

// 初期化を行います。
func init() {
	loadTemplates()
}

// 各HTMLテンプレートに共通レイアウトを適用した結果を保存します（初期化時に実行）。
func loadTemplates() {
	var baseTemplate = "templates/layout.html"
	templates = make(map[string]*template.Template)
	templates["index"] = template.Must(
		template.ParseFiles(baseTemplate, "templates/hello.html"))
}

// HandleIndexGet は Index のGet時のHTMLデータ生成処理を行います。
func HandleIndexGet(c echo.Context) error {
	return c.Render(http.StatusOK, "index", "World")
}

// HandleAPIHelloGet は /api/hello のGet時のJSONデータ生成処理を行います。
func HandleAPIHelloGet(c echo.Context) error {
	return c.JSON(http.StatusOK, map[string]interface{}{"hello": "world"})
}
```

最初はEchoのGuide https://echo.labstack.com/guide を見ながら書き始めましたが、共通レイアウトテンプレートの適用部分などはこちら https://github.com/vitorsvieira/go-gin-boilerplate のGinのサンプルからEcho向けに移植したりしています。

ほぼコメントを読めばわかるコードですが、ポイントは最初に loadTemplates() で事前にレイアウトを適用したテンプレートをmapに突っ込んでいるところと、Template#Render()にてmapからテンプレートを引っ張りだして処理してるところでしょうか。。

Go自体最近勉強中ですのでいろいろと間違ってるところがあるかもしれません。

# 実行結果
## GET /
![1.png](https://qiita-image-store.s3.amazonaws.com/0/70686/85e0d6c5-e5b2-9a59-7f33-fcb1097a476d.png)
## GET /api/hello
![2.png](https://qiita-image-store.s3.amazonaws.com/0/70686/1da5ce85-0577-989f-4c71-6d480a34b039.png)

# 今後の展開
* セッション管理
* フォームの扱い
* ファイルアップロード

など。
FreeBSDでADS-B

確かAitendoがまだ古い店の頃に買った、RealtekのSDRなモジュールがあり放置していたのですが、今日(6/1)は電波の日という事なので、使ってみる事しました。

![70726f647563742f32303134303930385f6437353366392e706e67003235300000660066.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/81336436-6f34-b290-0095-a565fa2bf535.jpeg)

調べてみたところこれに対応したrtl-sdrというライブラリとコマンドのオープンソースがあるようです。とりあえずこれをコンパイルしてみました。ソースをgitでタウンロードしてビルドしてinstallしましたが、portsにもあるようです。FMを受信するコマンドなどもあるようですが、私の環境にはサウンド出力がなかったので、試していません。

このライブラリを使ったADS-B(航空機が出している1090MHzの衝突防止用の無線信号)を処理してくれる[dump1090](https://github.com/antirez/dump1090)というコマンドラインツールがあります。これもportsにあります。

![dump1090.png](https://qiita-image-store.s3.amazonaws.com/0/104066/6337f3f7-6b54-ab61-4434-6c7a025fcc0a.png)


前々から自宅付近から航空機が飛んでいくのが見えてどこに行くのかなと興味がありました。

dump1090は[forkしたもの](https://github.com/MalcolmRobb/dump1090)の方が、高機能なのですがとりあえずportsにあるオリジナルをコンパイルして使ってみました。

dump1090コマンドラインのUIとブラウザでの表示機能があります。

dump1090に--netオプションを指定して起動して、そのホストの8080ポートをブラウザでアクセスするとこんな感じです。

![スクリーンショット（2017-06-01 20.00.49）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/d7e01436-d971-dd3a-cbcd-c5568279ba41.png)

とあり合えずamd64で確認をして動作したのでZRouterのprofileに追加して、mipsなターゲットで試してみました。最初RT3050で試したのですが、うまく動かずAtherosのAR9なモジュールで試したところちゃんと動きました。RT3050のUSBはあまり調子が良くないです。

rtl-sdrは、gitのsubmoduleでcontribにいれてdump1090はports形式で放り込みました。

製品に付属のアンテナはADS-B用ではないので、[ここ](http://antirez.com/news/46)を参考にとりあえず有り合わせの部品でこんなものを作ってみました。

![IMGP0541.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/bfd004b6-5d2d-7a0d-b1ea-adf842c9a51a.jpeg)

いわゆる垂直ダイポールアンテナで二分の一波長の140mmくらいのものです。こんなチープなアンテナでも自宅の木造家屋の1階においておくと北側は入るのですが、南側は1mくらいの土留めで塀があるので入りが悪いです。とはいえ2階で試したらざっくり2倍くらい良く入ります。やはりアンテナが重要です。周波数が高いので、波長が短く小さいアンテナで良いのですが、いろいろ工夫の仕方で効率が変わってくるようです。

[アンテナの詳しい解説のページ](http://www.interq.or.jp/blue/rhf333/ANT-K.htm)

後日追記：[コリニアアンテナ](http://www.balarad.net/)も作ってみました。

蟹さんのSDRができるUSBモジュールはもう一つ持っていたのですが、認識はされるのですが、チップの構成が違うためか、まったくデータが出力されませんでした。蟹さんだからすべて使える訳ではないようです。使えてる方はtunerがR820Tで使えない方はFC0012でした。

アンテナ線との接続は使えないモジュールに付属していたFコネクタへの変換を使っています。

[flightradar24](https://www.flightradar24.com/)は個人が収集したデータをまとめて使用しているようです。このためのサーバにアップするコマンドはバイナリで提供されていてLinux版しか無いようです。オープンソースでもなく、APIの公開も無くなんか前時代的な感じです。

googlemapのjsでのアクセスにAPI Keyが必須になったようです。

![スクリーンショット（2018-06-15 15.47.09）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/e34399ff-d9f3-d05e-f3c9-b5ba3772ea43.png)

正しく表示するためにはgmap.htmlのmaps.googleapis.comへのアクセス部分にkeyを取得して設定する必要があります。

2018/7にgoogle map javascript apiはkeyの支払い登録をしないと機能しなくなったようです。

仕方がないので、[国土地理院の地図を使ったJS](https://qiita.com/yamori813/items/98e161cf3f9f5007f345)を書いてみました。

このモジュールは蟹さんのチップとチューナのチップが入っているのですが、チューナのチップがFC0012の物ではADS-Bは受信できませんでした。
Laravel5.4でgulpする

laravel-elixirを入れてgulpするまでの紹介です。
私は開発時にresource/assetsにsassやjs,imgなどを置きソース管理を行っています。
これを各環境でgulpして、public配下に移動するという方法を採用しています。

#CentOS7にnodejsとnpmを入れる
特に気にせず入れたので以下のバージョンになりました。
node : v6.10.2
npm  : 3.10.10

```# yum -y install epel-release```
```# yum -y install nodejs npm```
```# node -v```
```# npm -v```
![1.png](https://qiita-image-store.s3.amazonaws.com/0/183427/f078ea4b-ddd3-10f3-bc89-a880b49195e9.png)

#bowerとgulpを入れる
npmでbowerとgulpを入れます。
-gを付けてインストールします。

```# npm install -g gulp bower```

#Laravel側の準備
ここからがLaravelでの導入部分になります。
既にbowerやgulpが入っている方はここからスタートで大丈夫です。

##laravel-elixirをインストール
laravel/package.jsonを書き換えます。
jqueryやbootstrapの行を削除し、laravel-elixirとgulpを追加します。

```
  "devDependencies": {
    "laravel-elixir": "^5.*",
    "gulp": "^3.*",
    "axios": "^0.15.3",
    "cross-env": "^3.2.3",
    "laravel-mix": "0.*",
    "lodash": "^4.17.4",
    "vue": "^2.1.10"
  }
```

![2.png](https://qiita-image-store.s3.amazonaws.com/0/183427/86f6ce8f-8645-3f73-038a-c56738cbf7a2.png)

そしてnpm installをします。
-g無しです。
```# npm install```

##laravelにbowerを入れる
laravel/bower.jsonを作成します。

```
 {
   "name": "mylaravel",
   "description": "",
   "main": "",
	
   "license": "MIT",
   "homepage": "",
   "ignore": [
     "**/.*",
     "node_modules",
     "bower_components",
     "test",
     "tests"
   ],
   "dependencies": {
     "jquery": "3.*",
     "bootstrap-sass": "^3.*"
   }
 }
```

コマンドでbowerをインストールします。
今度は-g無しです。
※windowsだと--allow-rootが無くても良かったりします。

```# npm install bower```
```# bower install --allow-root```

##laravelにgulpを入れる
laravel/gulpfile.jsを作成します。
このgulpfile.jsで、gulp時に行う処理を書きます。
今回はsassとjsをコンパイルして、resourceのcssとjs,imgをpublicにコピーしています。

```
 var elixir = require('laravel-elixir');
 
 var paths = {
     'jquery' : 'bower_components/jquery/',
     'bootstrap' : 'bower_components/bootstrap-sass/assets/'
 };

 elixir(function(mix) {
     mix.sass('app.scss')
        .copy(paths.bootstrap + 'fonts/bootstrap/**', 'public/fonts/bootstrap')
        .copy('resources/js', 'public/js/')
        .copy('resources/css', 'public/css/')
 	    .copy('resources/image', 'public/img/')
        .scripts([
             paths.jquery + "dist/jquery.js",
             paths.bootstrap + "javascripts/bootstrap.js",
         ], 'public/js/app.js', './')
         .version(['css/app.css', 'js/app.js']);
 });
```

コマンドでgulpをインストールします。
```# npm install gulp```

##gulpする
作成しておいたgulpタスクを実行します。
今回はpublicディレクトリに正しくファイルが配置されていれば成功です。

```# gulp```

##エラー対応
Error in plugin 'gulp-notify'
エラーが発生したので対応内容を記載します。
```# yum -y install libnotify```

[20:56:54] gulp-notify: [Laravel Elixir] Scripts Merged!
[20:56:54] gulp-notify: [Error in notifier] Error in plugin 'gulp-notify'
Message:
    notify-send must be installed on the system.
![3.png](https://qiita-image-store.s3.amazonaws.com/0/183427/4d0a5817-3930-378b-d3fc-0a3e2b721abd.png)

yumでlibnotifyを入れたら解決しました。
再びgulpして動けば成功です！

以上です。
Heroku で slackin 環境を構築してScalaのSlack日本語コミュニティに誰でも参加できるようにした

# 目的
[ocaml-jp](http://ocaml-jp.slack.com)に触発されて、[scala-jp](https://scala-jp.slack.com/) という誰でも参加できるScalaのユーザーSlackコミュニティのためのチームを立ち上げてみましたのですが、参加方法がない！ということで、[slackin](https://github.com/rauchg/slackin)を使って、誰でもも参加出来るようにしてみました。
Joinは https://scala-jp-slackin.herokuapp.com から


# 手順
[SlackinでSlackに誰でも参加できるチームをつくる](http://qiita.com/r7kamura/items/0b0a2a2d536907816b0d)の手順通りに進めていっただけなのですが、SlackのAPI Tokenの取得がわからなくてちょっと苦労しました。
[Slack APIのTokenの取得・場所](http://qiita.com/ykhirao/items/0d6b9f4a0cc626884dbb)にまとめてくださっているので、その手順で解決できました。

# 感想
Herokuすごいですね！slackinもすごいですが、ワンクリックデプロイというのを初めて体験したもので（うちの現場だと、デプロイ用の設定書いて、その上でJenkinsで2〜3回はクリックしないとならなかったり、下手するとJenkinsでビルドしたファイルをダウンロードしてきて手で配置してからCLIでデプロイするとかしてたり。。。）
データフレームである列で重複がある行だけを残す

以前r-wakalangで教えてもらったのを忘れそうだったのでメモ．

以下のようなデータフレームを準備:

``` r
df <- data.frame(
  id = 1:6,
  value = c("a", "b", "b", NA, "c", NA)
)
```

この時，`df$value`で重複が存在する行**だけ**を残したい場合のコードです．

``` r
df %>% 
  group_by(value) %>% 
  filter(n() > 1) %>% 
  ungroup()
#> # A tibble: 4 x 2
#>      id  value
#>   <int> <fctr>
#> 1     2      b
#> 2     3      b
#> 3     4     NA
#> 4     6     NA
```

また，逆に重複が存在する行を全て削除する場合は以下のような感じ:

``` r
df %>% 
  group_by(value) %>% 
  filter(n() == 1) %>% 
  ungroup()
#> # A tibble: 2 x 2
#>      id  value
#>   <int> <fctr>
#> 1     1      a
#> 2     5      c
```

filterの条件を書き換えればOK．

NAが不要ならNAを除去するように処理すればOK．教えていただきありがとうございました．

**Enjoy!**
WindowsでOpenPoseを動かしてみた。

#目次
[1.OpenPoseを動かしてみた。](http://qiita.com/nnn112358/items/a4490d85dac5827db53b)
[2.OpenPoseチュートリアルのソースコードを読む。](http://qiita.com/nnn112358/items/ccd6330bed1e253d5ef9)
[3.WindowsでOpenPoseを動かしてみた。](http://qiita.com/nnn112358/items/121dc36c3c1752a00276)
[4.OpenPoseのFace Estimationを動かしてみた。](http://qiita.com/nnn112358/items/398765b5a4e5158b9ba2)
[5.OpenPoseのHand Estimationを動かしてみた。](http://qiita.com/nnn112358/items/713b4b8de25318fb1afc)
##目的
Ubuntuで[OpenPoseを動かしてみた](http://qiita.com/nnn112358/items/a4490d85dac5827db53b)に続き、[Windows版OpenPoseが公開された](https://github.com/CMU-Perceptual-Computing-Lab/openpose/pull/28)ため
WindowsでOpenPoseのデモを動かす手順を説明する。

OpenPose:
https://github.com/CMU-Perceptual-Computing-Lab/openpose


![MEMO.png](https://qiita-image-store.s3.amazonaws.com/0/73020/9cadc996-69dc-8392-2678-ffb5c44bf5fc.png)



##環境
以下の環境で動作確認した。
・Windows10 (64bit)
・CUDA-8.0
・cuDNN v5.1
・Python2.7.13
GPU:NVIDIA GeForce GTX1050 

###WindowsでOpenPoseのデモを動かす手順
まずは、CUDA-8.0・cuDNN 5.1・Visual C++ 2015のランタイム・Python2.7.13をインストールする。

####[CUDA-8.0](https://developer.nvidia.com/cuda-downloads)
　デフォルトのインストール場所「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0」に入れること。
　デフォルトでない場合は、 Visual Studioの設定を変える必要がある。
 
####[cuDNN 5.1](https://developer.nvidia.com/cudnn)
　ユーザー登録して、「cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0」→「cuDNN v5.1 Library for Windows 10」をダウンロードする。ダウンロードしたファイルを解凍して、「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0」以下にcudnn64_5.dll/cudnn.h/cudnn.libをコピーする

####[Visual C++ 2015ランタイム](https://www.microsoft.com/en-us/download/details.aspx?id=53587)  or  [Visual Studio 2015 Community](https://www.visualstudio.com/ja/vs/older-downloads/)
 Visual C++ 2015のランタイムをインストールする。
 開発をするなら、Visual Studio 2015 Communityをインストールしてもよい。


####Python2.7.13
[Python 2.7.13](https://www.python.org/downloads/release/python-2713/)を C:\Python27 (default)へインストール


###DEMOの実行
コンパイル済みのDEMOの実行ファイルをダウンロード・解凍する。
http://posefs1.perception.cs.cmu.edu/OpenPose/OpenPose_demo_1.0.1.zip


####1. サンプル動画で動かしてみる

```
cd openpose_1.0.0rc2
.\bin\OpenPoseDemo.exe --video examples\media\video.avi
```

####2. Webカメラで動かしてみる

```
cd openpose_1.0.0rc2
.\bin\OpenPoseDemo.exe
```

####3. サンプル静止画で動かしてみる

```
cd openpose_1.0.0rc2
.\bin\OpenPoseDemo.exe --image_dir examples\media\
```



####追加ライブラリのコンパイル
OpenPoseの[Windows branch](https://github.com/CMU-Perceptual-Computing-Lab/openpose/tree/windows)をCmake・Ninjaをインストールした上で、コンパイルする手順を記載する。


####Cmakeのインストール
[Cmake]([https://cmake.org/download/)をインストールし、Windowsの環境変数に登録する。
システムのプロパティ→詳細設定→環境変数→Pathに「C:\Program Files\CMake\bin」を追加

####Ninjaのインストール
[Ninja](https://ninja-build.org/)をダウンロード、「C:\Program Files\CMake\bin」にコピーする

###OpenPoseのWindows branchからダウンロード
OpenPoseの[Windows branch](https://github.com/CMU-Perceptual-Computing-Lab/openpose/tree/windows)をダウンロード、「C:\openpose」に設置する。

```
cd C:\openpose\3rdparty\caffe\caffe-windows.
scripts\build_win.cmd
```
GAE/GoだとStackdriverErrorReportingの通知のStacktraceからSourceRepositoryのソースコードに直接飛べる

昨日ふと投稿したtwitterが結構RTやイイネが付いたのだけど、twitterの長さの制約の関係でちょっとした注意点が漏れていたので記事にしてみた。

twitterの投稿内容はこんな感じ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">GAE/Goだと、Stackdriver Error Reportingに通知されたStacktraceのHoge.go:90などのようなリンクからCloud Source Repositories のコードに直接飛べるので、どの行でエラー出たのかすぐわかるのでもう手放せない。 <a href="https://t.co/MfTnizr5tX">https://t.co/MfTnizr5tX</a></p>&mdash; kiyo (@chidakiyo) <a href="https://twitter.com/chidakiyo/status/869725056246530048">2017年5月31日</a></blockquote>

`GAE/Goだと` で書き始めているので何もしなくて実現できているのかと誤解されそうだったので、
注意点を下記します。

## Stackdriver Error Reporting とはなに？

```Googleのサイトより.
Stackdriver Error Reporting は、実行中のクラウド サービスで発生したクラッシュをカウントして、
分析と集計を実施します。
結果は一元化されたエラー管理インターフェースに表示され、並べ替えやフィルタリングも行えます。
専用のビューには、タイムチャート、発生回数、影響を受けたユーザー数、最初または最後の発生日時、
削除された例外スタック トレースといったエラー詳細が表示されます。
また、新しいエラーの発生時にメールアラートやモバイル アラートを受信することもできます。
```

エラーをよしなに通知しますよ。というもので、詳しくは [こちら](https://cloud.google.com/error-reporting/) を。

## Cloud Source Repositories とはなに？

```Googleのサイトより.
Cloud Source Repositories では、プライベート Git レポジトリをいくつでも持つことができ、
お客様に最適な方法でクラウド プロジェクトに関連付けられているコードを整理することができます。
```
簡単に言うとgitのリポジトリですよ、と。


## さっそく、注意点

ただ普通に Go で書いて Appengine にデプロイしただけでは `使えません!!`

1点だけ注意点があって、ログの中にStackdriver Error Reportingが `Stacktraceだと認識できる形式の文字列` を出力する必要があります。

## どうすればいいか

サンプルコードですが、
エラー発生箇所でログに以下のようなロジックで生成したStacktraceを含めれば良いです。
（ユーティリティ化して使うのが良いと思いますが、その際にStackを剥がす処理をしたくなると思いますのでそのあたりは頑張ってみてください）

```go:サンプル

c := appengine.NewContext(r)　// appengineのcontextを生成する

buf := make([]byte, 1<<16)
runtime.Stack(buf, true)
s := fmt.Sprintf("%s", buf)

log.Errorf(c, s) // ログを出力する
```
GAE/Goを書いたことがある人はわかると思いますが、Stacktraceを普通にログとして出力しているだけです。

## どのようになるか

上記のようにStacktraceを含むログを出力した際に、Error Reportingはエラーを認識してエラーを通知します。

![サンプル1.png](https://qiita-image-store.s3.amazonaws.com/0/28681/7f94ce6d-01cb-3a61-8e2e-9a0d32b1fb77.png)

上の例は殆どモザイクで見えないと思いますが、ErrorReportingで通知されたエラーの1件を選択すると以下のようなエラーの詳細画面へと遷移します。

![サンプル2.png](https://qiita-image-store.s3.amazonaws.com/0/28681/e1f2bf1c-276d-388f-ec27-bdecf8562d48.png)

エラー詳細画面に Go の Stacktrace が表示されるので、 `gin.go:265` のようなリンクになっている部分をクリックします。

![サンプル3.png](https://qiita-image-store.s3.amazonaws.com/0/28681/86cda9f0-a8bb-f644-d79b-3c8059f241a1.png)

リンクから遷移すると Source Repository のコードへ飛び、ここまでのことがブラウザの中で一発で出来ます。
（この例はginというgoのライブラリのコードに飛んでいる例なのですが、実際には実装したアプリケーションのソースコードに飛んで確認ができます。）

ちなみに、Go のコードは Source Repository でわざわざホストする必要は無いと思います。
agppengineにデプロイするだけ。ちなみに、Source Repositoryの参照権限の付与は忘れないようにしましょう。
Vim neosnippetでスニペットを作ろうとした時に発生した問題と解決方法

#問題点
自分でsnippetを作成しようとしたらインデントが反映されない問題が発生した。

python.snippet
![1496317609537.jpg](https://qiita-image-store.s3.amazonaws.com/0/183325/8e95437e-5afe-4a9f-2b4e-f04cf94bb167.jpeg)


neosnippetを使用した際の出力
![1496317749880.jpg](https://qiita-image-store.s3.amazonaws.com/0/183325/4c491ce9-45d7-69ab-fd2f-a1790a8fbcc7.jpeg)

Pythonでインデントされないのはかなり致命的...

#原因
snippet内でインデントが深くなるものを使用するときは、ハードタブで書かないとダメらしい... つまり 'set expandtab'を使用しているとインデントされない

#解決方法
':setl noexpandtab'をしてハードタブを使用すればうまくいく。
snippet.vimに上記のものを書いておくと、スニペットファイル編集時にはハードタブを使うようになるらしい。

setlはsetl(ocal)

#最後に
pythonでは必要不可欠なexpandtabに逆に苦しめられるとは...
 python3ではtabとspaceの混合インデントはエラーが発生するから、入れ替えてる人が多数だろうし、pep8ではインデントのスペース幅は4個分が推奨されてるからこれは盲点だった。
あと、snippetでtabつかってるのに、なんで混合インデントでエラーが起きないのか気になったから調べてみたら、コード全体で一つのインデント幅に固定されてるわけじゃなく、ブロックごとに統一されてればいいらしい。これは知らなかった...

#参考文献
neosnippet のスニペットファイルを書く上での注意点
http://rhysd.hatenablog.com/entry/2012/11/11/222150

pythonのインデント
http://studylog.hateblo.jp/entry/2015/10/22/043739

↓こんな事例もあるらしい
vimでMakefileだけTabスペースではなくTabとして入力する
http://qiita.com/Lacty/items/23a89d2b999cb0e9fae1
nodeセットアップ用コマンドメモ

※nodeが入ってる場合は別途削除している必要あり。

nodebrewインストール
`curl -L git.io/nodebrew | perl - setup`

.bash_profileに追記
`export PATH=$HOME/.nodebrew/current/bin:$PATH`

ヘルプ
`nodebrew help`

インストールされたnodeの確認
`nodebrew ls`

インストール可能なnodeの確認
`nodebrew ls-remote`

指定バージョンのインストール
`nodebrew install-binary v8.0.0`

インストールしたnodeを利用可能にする
`nodebrew use v8.0.0`

nodeのバージョン確認
`node -v`
ActiveSupport::TimeWithZone.xmlschemaの戻り値がTimeやDateTimeと異なる

```console
$ ruby --version
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]
$ gem list activesupport

*** LOCAL GEMS ***

activesupport (5.1.1)
$ irb -r 'rubygems'
```
という環境において、

```ruby
irb(main):001:0> require 'active_support'
=> true
irb(main):002:0> require 'active_support/time_with_zone'
=> true
irb(main):003:0> require 'active_support/core_ext/time/zones'
=> true
irb(main):004:0> Time.zone = "UTC"
=> "UTC"
```

UTCタイムゾーンで `TimeWithZone`, `Time`, `DateTime` それぞれの `xmlschema` を見ると、

```ruby
irb(main):014:0> t = Time.zone.now
=> Thu, 01 Jun 2017 11:54:06 UTC +00:00
irb(main):015:0> t.xmlschema
=> "2017-06-01T11:54:06Z"
irb(main):016:0> t.to_time.xmlschema
=> "2017-06-01T11:54:06+00:00"
irb(main):017:0> t.to_datetime.xmlschema
=> "2017-06-01T11:54:06+00:00"
```

TimeWithZoneの場合だけタイムゾーンが Z となるんだけど、こういうもの?

文字列比較として使いたいため、xmlschema信用できないのは困るので、
strftimeを使うほうがよいのかな..

```ruby
irb(main):018:0> t.strftime("%Y-%m-%dT%H:%M:%S%:z")
=> "2017-06-01T11:54:06+00:00"
```
Reduxをイメージで理解する（ちょっとだけRedux勉強した人向け）

ReactとRedux勉強中。
イメージわかなかったのでイメージで理解しようとしました。
理解が間違っていましたらご指摘お願い致します。


## Actions（積載車）
商品を積む積載車。
ここで作られる商品だけが倉庫の商品になる。
ここでしか作られない貴重な商品のようだ。
Actionはstoreにデータを送るための積載車。
Actionsで作られるObjectだけが、Storeのソースになる。Storeで全Objectを管理する。


## Action Creators（工場）
Actions をつくってくれるのがAction Creators. Function（工場）でActions と呼ばれるオブジェクトを作る。
Actions が作られてもこの工場は運んでくれない。でも消費者に届けるには倉庫に送らないと！倉庫に積載物を出荷したいけど道がない。道と倉庫を作らないと。

Reduxのaction creators によって作られたactionはdispatchに送られない。その代わり、actionによって作り出されたobjectを返す。


```actionCreators.js
export function addTodo(text) {
  return {
    type: 'ADD_TODO',
    text
  }
}

export function editTodo(id, text) {
  return {
    type: 'EDIT_TODO',
    id,
    text
  }
}

export function removeTodo(id) {
  return {
    type: 'REMOVE_TODO',
    id
  }
}

```

## Store （倉庫）
工場で作られたオブジェクト（商品）を一時保管しておく倉庫。お店に配送する前に商品を一括で倉庫にためておく。出荷前の最新版への作り変えもしてくれる。

Action Creatorsで作られたActionsがActionsで運ばれてStoreに入る。
StoreではActionsがReducersに通る。
このときまだdispatchでとことこ動いている。

倉庫を作ろう！
まず倉庫になる箱を用意。
倉庫の中にいれるものは
・最終チェックシステム
・最初の在庫

Storeでは
ReducerにActionsが通される。
そのため、
・Storeの倉庫
　　import { store } from 'redux';
・Reducers（new stateができる）の定義
・最初にobjectが入荷されていないときの状態の設定（createStoreの第二引数）
が必要

Reduxを使う場合はdispatchがないらしい。
stateそれ自身は直接操作されることはない
そのかわり、storeをスライスして新しい適切なobjectを作る。



```reducer1.js
import { createStore } from 'redux';

const initialState = {
  VisibilityFilter: VisibilityFilters.SHOW_ALL
  todos: []
}

function reducer( state, action) {
  if(typeof state === 'undefined') {
    return initialState
  }
  return state;
}

const store = createStore(reducer, { todo: []});
```
```reducer2.js
import { createStore } from 'redux';

const initialState = {
  VisibilityFilter: VisibilityFilters.SHOW_ALL
  todos: []
}

function reducer( state = initialState, action) {
 
  return state;
}

const store = createStore(reducer, { todo: []});
```

最終チェックシステムでは、
最新の全くデザインが変わらない商品と交換可能。特定の工場でしか作られない商品を運んできたのにお店に並ぶ前に更に最新版に作り変えてくれる。
システムに流しいれると、必要なものだけが新しくなってでてくる。システムはコストの関係上、ひとつしか置けない。

const store = createStore(A, B);
はAがreducer（new stateを作る最終チェックシステム）、Bが最初の在庫。

## dispatch (出荷用の流通ルート）
積載車が通る道。
倉庫までアクセスできる。
StoreまでActionsを送る。
store.dispatch(action);
と使う。車と倉庫をつなげてあげる。

```js
store.dispatch(actions);
```

![6173988224486.LINE.jpg](https://qiita-image-store.s3.amazonaws.com/0/157309/c356aa4d-018f-a66d-c70a-edc814969067.jpeg)
列に含まれる値によってエラーになったりならなかったりする暗黙の型変換【ORA-01722】


oracle のバージョン:11g

調査の時にその場で作るSQLでは暗黙の型変換に頼ることがよくあるが、
カラムの型等が成功するものと変わらないのに何故か失敗するテーブルがいくつかあり、困惑することがあった。


**暗黙の型変換を含むSQLは、検索対象に含まれるデータによってエラーになる恐れがある。**

```
create table m_item{
 item_cd int,
 --省略
};

select * from m_item
Where item_cd = '2121032';
```

# 原因
検索対象のカラムにキャスト不可能な値が入っている。

# 解説

SQL上で型が違う2つの要素を比較するとき、暗黙の型変換が行われる
例えば以下のようなSQLの場合、

```
Where item_cd = '2121032'
```

内部的に以下の変換が行われている

```
Where item_cd = to_number('2121032')
```

変換が行われるのは必ず定数側とは限らない。
公式のSQLリファレンスによると
http://docs.oracle.com/cd/E16338_01/server.112/b56299/sql_elements002.htm#i46862
>数値と文字値を比較する場合、Oracleは文字データを数値に変換します。

とある。ので列側の方がcharの場合

```
Where to_number(item_cd) = 2121032
```

のような変換が起こる。
※ちなみに列側を演算しているので、item_cdのインデックスが使われないため、パフォーマンス低下を引き起こす。

この時列側の値の中に、1件でもキャスト不可能な値、
数値型へのキャストであれば、空白や数字以外の文字等があれば、暗黙のキャストは失敗する。

# 調査方法
正規表現を利用した条件指定で該当データを探す。
数値型へのキャスト失敗の場合

```
where not (regexp_like(item_cd, '[0-9]'))
```

で条件指定したSELECT文を発行することにより、
数字以外の項目を含む行を検索可能。
・大抵手作業でinsertした不正な項目を持つ行
・謎の空白を含む行
等がヒットするかと思う。そのデータが原因。

データによって処理が失敗してしまうので、暗黙の型変換には気を付けよう。
PHPMailerでGmail経由でメールを送ってみる

参考になった記事
[メール送信がうまくいかないときに読む記事（そういう質問をされたときに読ませる記事）](http://qiita.com/ShibuyaKosuke/items/309c0a7d969baf0ea8d1)

### まずメール送信の仕組み
---
クライアントPC→SMTPサーバ(Gmailの)に認証→送りたいアドレスに送る。

この時SMTP経由でなければスパムとして弾かれてしまうということを知った。
よって通常のPHPのmail()は使えないらしい。

### PHPMailerを使ってみる
---
``` 
$ git clone https://github.com/PHPMailer/PHPMailer.git
```

その中にあるexamples/gmail.phpsを参考にソースを書いた。

``` php:gmail.phps
<?php
/**
 * This example shows settings to use when sending via Google's Gmail servers.
 */
//SMTP needs accurate times, and the PHP time zone MUST be set
//This should be done in your php.ini, but this is how to do it if you don't have access to that
date_default_timezone_set('Etc/UTC');
require '../PHPMailerAutoload.php';
//Create a new PHPMailer instance
$mail = new PHPMailer;
//Tell PHPMailer to use SMTP
$mail->isSMTP();
//Enable SMTP debugging
// 0 = off (for production use)
// 1 = client messages
// 2 = client and server messages
$mail->SMTPDebug = 2;
//Ask for HTML-friendly debug output
$mail->Debugoutput = 'html';
//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';
// use
// $mail->Host = gethostbyname('smtp.gmail.com');
// if your network does not support SMTP over IPv6
//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
$mail->Port = 587;
//Set the encryption system to use - ssl (deprecated) or tls
$mail->SMTPSecure = 'tls';
//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Username to use for SMTP authentication - use full email address for gmail
$mail->Username = "username@gmail.com";
//Password to use for SMTP authentication
$mail->Password = "yourpassword";
//Set who the message is to be sent from
$mail->setFrom('from@example.com', 'First Last');
//Set an alternative reply-to address
$mail->addReplyTo('replyto@example.com', 'First Last');
//Set who the message is to be sent to
$mail->addAddress('whoto@example.com', 'John Doe');
//Set the subject line
$mail->Subject = 'PHPMailer GMail SMTP test';
//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';
//Attach an image file
$mail->addAttachment('images/phpmailer_mini.png');
//send the message, check for errors
if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}

```
色々なサイトのソースコードを見てみたが、PHPMailerのサンプルで動いたので公式のコードを見るのが一番早いと思いました。

初投稿なのでグダグダかもしれませんがとりあえずこのくらいにしておこうと思います。
メモ代わりに使おうと考えているのですが、プログラミングもQiitaもド素人のため何か問題等あればどうぞご指導のほどよろしくお願いいたします。
RHEL7の/etc/localtimeのリンク先が変わっちゃう問題

# 結論
タイムゾーンを変更する時は、timedatectlを使いましょう
/etc/localtimeにリンク貼っちゃいかん

# 対象環境
RHEL7
CentOS7
on ESXi

# 問題

最初は下記を設定してたのに、

```
# ll /etc/localtime
lrwxrwxrwx 1 root root 25  6月  1 17:55 /etc/localtime -> /usr/share/zoneinfo/Japan
```

VMでテンプレートから上げ直すと下記のようになってた

```
# ll /etc/localtime
lrwxrwxrwx 1 root root 30  5月 30 17:33 /etc/localtime -> /usr/share/zoneinfo/Asia/Tokyo
```

# 原因

### 1. そもそもタイムゾーンにJapanがない
下記のようにタイムゾーンのリストにAsia/Tokyoはあるが、Japanはなかった

```
# timedatectl list-timezones | grep Tokyo
Asia/Tokyo
```
```
# timedatectl list-timezones | grep Japan
# 
```

### 2. 設定方法が違う
設定を下記のようにしたが、テンプレートから起動した際に、glibcが更新された時に/etc/localtimeが上書きされた
多分、JapanないからTokyoに上書きされたっぽい
リンクを貼ってゾーンを変更するやり方は推奨されていない

```
# ln -sf /usr/share/zoneinfo/Japan /etc/localtime
```

# 対策
timedatectlでゾーン変更を行う

### 事前確認
現在のゾーン確認

```
# timedatectl | grep zone
       Time zone: Japan (JST, +0900)
```
リンク先確認

```
# ls -l /etc/localtime
lrwxrwxrwx. 1 root root 25  4月 10 15:53 /etc/localtime -> /usr/share/zoneinfo/Japan
```
ゾーンリストにあるよね確認

```
# timedatectl list-timezones | grep Asia/Tokyo
Asia/Tokyo
```

### ゾーン設定

```
# timedatectl set-timezone Asia/Tokyo
```

### 事後確認
現在のゾーン確認

```
# timedatectl | grep zone
       Time zone: Japan (JST, +0900)
```
リンク先確認

```
# ls -l /etc/localtime
lrwxrwxrwx. 1 root root 25  4月 10 15:53 /etc/localtime -> /usr/share/zoneinfo/Japan
```

# 参考
1. glibcを更新しても大丈夫な「正しい」タイムゾーンの設定方法
http://d.hatena.ne.jp/nekoruri/20150130/glibclocaltime
2. 日付と時刻の設定
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/chap-Configuring_the_Date_and_Time.html#sect-Configuring_the_Date_and_Time-timedatectl-Time_Zone
Travis CI でビルドが成功した場合だけ Netlify にデプロイ

# やりたいこと
* [Travis CI](https://travis-ci.org/) で Jekyll のテストをする
* [Travis CI](https://travis-ci.org/) で ビルドが成功した場合だけ Netlify でデプロイ

（追記）
ビルドが成功したあとで実行される `deploy` イベントで対応してるプラットフォーム（GitHub PagesやAWS S3など）にデプロイするのであればそちらを使ったほうが楽
https://docs.travis-ci.com/user/deployment/

# 仕様

* デプロイする専用ブランチ release を作っておく
* Travis CI で master ブランチのビルドが成功した場合、release ブランチにマージ push
    * 前提条件としてプルリクエストもTravis CI で ビルドが成功したものだけマージするようにしておく
* Travis CI で release ブランチのテストは除外しておく
* Netlify では release がデプロイされるようにしておく

# ソース
SSH鍵を入れないように `.gitignore` に記載しておくこと

（追記）
プルリクエストの場合、 opensslコマンドが使えずエラーが起きる。
今回の場合 master ブランチでビルドが成功した場合のみ git コマンドを使うので条件分岐を追加。

```:.gitignore
id_rsa
id_rsa.pub
```

```yaml:.travis.yml
language: ruby
rvm:
- 2.3.3

before_install:
  - 'if [ "$TRAVIS_BRANCH" == master ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then bash ./script/before_install.sh; fi'

before_script:
 - chmod +x ./script/cibuild # or do this locally and commit

script: ./script/cibuild

# blocklist
branches:
  except:
    - release

after_success:
  - '[ "$TRAVIS_BRANCH" == master ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && bash ./script/deploy.sh'

env:
  global:
    - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer

sudo: false # route your build to the container-based infrastructure for a faster build
```

```bash:before_install.sh
#!/bin/bash

openssl aes-256-cbc -K $encrypted_xxxx_key -iv $encrypted_xxxx_iv -in travis_key.enc -out id_rsa -d
cp id_rsa ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
echo -e "Host github.com\n\tStrictHostKeyChecking no\nHost github github.com\n\tHostName github.com\n\tIdentityFile ~/.ssh/id_rsa\n\tUser git\n" >> ~/.ssh/config
git config --global user.email "example@example.com"
git config --global user.name "example user"
```

SSH鍵の部分などは以下を参考に

* https://www.tam-tam.co.jp/tipsnote/program/post11795.html
* http://qiita.com/aqz/items/937129667bb606d876ee

「Please add the following to your build script (before_install stage in your .travis.yml, for instance):」とあるので before_install に入れましょう。

script で実行してるのは Jekyll のテストで中身は以下を参考に。

* http://jekyllrb.com/docs/continuous-integration/travis-ci/
* http://qiita.com/gatespace/items/ba124b991c622dc633df

after_success では master ブランチかつプルリクエスト以外で deploy.sh が実行されるようにしておく。

```bash:deploy.sh
#!/bin/bash

git config --replace-all remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git config core.filemode false
git fetch
git checkout -b release origin/release
git merge origin/master
git push git@github.com:example/example.git release
```

`git config` してる理由は以下を参照に。（`git fetch` だけではあかんよってことです）

* https://stackoverflow.com/questions/34405047/how-do-you-merge-into-another-branch-using-travis-with-git-commands

`git config core.filemode false` で `before_script` でのパーミション変更を無視するようにしてます。

GitHubの設定でmasterブランチへのマージを制限したりreleaseブランチを削除しないように保護しておくとベスト。

現場からは以上です。
HiKey 960 + Mali Graphics Debugger で Android GLES アプリをデバッグする

漢なら Android で GLES ですね!

<img width="971" alt="Screen Shot 2017-06-01 at 20.11.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/d949a6e6-46df-3f50-8f49-858b0f0a2362.png">

しかし, Nexus9(NVIDA Tegra)以外では, どうも non rooted な Android スマホではデバッガーが動かなくてつらい. 

そんなとき, Cortex-A73 デバイスとして調達してみた HiKey 960

http://www.96boards.org/product/hikey960/

が rooted な Android デバイスでした(Android O 搭載). GPU は Mali で, Mali Graphics Debugger でデバッグできることを確認しました.

https://developer.arm.com/products/software-development-tools/graphics-development-tools/mali-graphics-debugger

途中, インストールマニュアルで

```
# mount -o remount /system 
```

が, Android O では,

```
# mount -o rw,remount /system 
```

に変更必要でした.

Happy GLES デバッギング!

# TODO

* HiKey 960 に Linux 入れて Mali Graphics Debugger ARM64 Linux 版が動かせるかどうか確認する
* GLESv3.1(Compute Shader) や Vulkan のデバッグを確認する
* GLES デバッガーで, 優秀な GLES 若人が人類史上最速で育成されるスキームを確立したい.
CarrierWaveでファイルサイズをバリデーションする（3行で）

アップローダーに以下3行を入れてください。

```ruby
def size_range
  1..10.megabytes
end
```

※ CarrierWave version 1.0.0.beta (2016-09-08) 以上の場合だけです


参考
https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Validate-image-file-size
webpackでcssを最小化してimportする

webpack環境下でReact実装しているときに、Componentのソースファイル内でcssを読み込みたいときに使える設定。

## 必要なもの
- css-loader
- style-loader

## インストール方法
`npm install --save-dev css-loader style-loader`

## webpackの設定ファイル
```javascript:webpack.config.js
const webpack = require('webpack')
const path = require('path')

const config = {
  context: path.resolve(__dirname, 'public'),
  entry: './scripts/index.js',
  output: {
    path: path.resolve(__dirname, 'public'),
    filename: 'build/app.js'
  },
  module: {
    loaders: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        query: {
          presets: ['es2015']
        }
      },
      {
        test: /\.css$/,
        loaders: ["style-loader", "css-loader?minimize"]
      },
    ]
  }
}

module.exports = config
```

## css最小化の設定
css-loaderの引数に`minimize`を設定する。
`loaders: ["style-loader", "css-loader?minimize"]`


## Componentからのimport
相対パスでcssをimportする

```javascript:component.js
import React, { Component } from 'react';
import './css/style.css';

class Hoge extends Component {
  constructor(props) {
    super(props);
  }
  
  render() {
    return (
      <div
        className="fuga">
		ほげほげコンポーネント
      </div>
    );
  }
}

export default Hoge;
```

## レンダリングされるHTML
実際にレンダリングすると、`<head>`タグ内にimportしたcssの内容が`<style>`タグとして埋め込まれる。
東京リージョンでLightsailを立てた（立てただけ）

[前にバージニアリージョンで構築した](http://qiita.com/VTRyo/items/28c31f1fe8edb3f96e80)わけですが、昨日東京リージョンがローンチされたので適当に東京に立ててみました。（業務依頼でLightsail立ててよと言われたというのもありますが・・・）

## 速い！！
当たり前ですけど東京で立ち上げてるのでコマンド打つときにレスが速いです。ストレスがない。

## 他は特にかわりなし？
AWSの他のリソースと連携するには結局Peeringとか必要っぽいのでやっぱり本番で動かすのは躊躇われますなー

## 感想
監視とかバックアップとか細かいことやらない検証サーバ一択！
JobScheduler JobChain内でのエラー発生時の再実行処理

ジョブフロー(JobChain)の各ジョブの中で異常が発生した時に少し時間を置いて再実行したいケースがあると思います。
JobSchedulerではその辺りも非常に柔軟に対応することが可能です。

必要な設定は以下の2箇所。

* JobChainのノード設定のon_error
* Order Jobのdelay_after_error

この2つが設定されて始めて再実行処理が行われます。

## JobChainのノード設定のon_error

JobChainの各ステップを示すノード設定のところにそのノードに該当するジョブの実行が失敗した時の挙動を指定することができます。
それがon_errorの設定です。

on_errorにはsuspend(処理を保留にする)とsetback(繰り返し処理する)の2種類の設定が可能です。

例えば、以下のようなフローのJobChainを参考に解説します。


**Node1(job1実行)→Node2(job2実行)→SuccessNode(終端ノード)**


ここでNode1のjob1に異常が発生した時にsetback(再実行)するには以下のようなXML定義となります。

```xml:test_jobchain.job_chain.xml
<job_chain  name="test_jobchain">
    <job_chain_node  state="Node1" job="job1" next_state="Node2" error_state="error" on_error="setback"/>

    <job_chain_node  state="Node2" job="job2" next_state="SuccessNode" error_state="error" on_error="setback"/>

    <job_chain_node  state="SuccessNode"/>

    <job_chain_node  state="error"/>
</job_chain>
```
JobChainのノードの部分のon_error=のところにsetbackを指定しています。

## Order Jobのdelay_after_error

上記のようにJobChainでsetbackを行う設定を入れた上で各Jobの定義内に繰り返し処理するときの挙動を指定します。
繰り返しの挙動は様々設定可能です。
以下、2つほど参考例を紹介します。

### 例1: job1の異常時にでも3回まで繰り返し処理(10秒間隔で)

例えば、異常が発生した場合、最初の実行も含めて3回まで処理を繰り返し実行し、エラーならerror_stateで指定したノードに移動する場合です。

```xml:job1.job.xml
<job  name="job1">
    <script  language="shell">
        <![CDATA[
ジョブの中身
        ]]>
    </script>

    <delay_after_error  error_count="1" delay="10"/>
    <delay_after_error  error_count="3" delay="stop"/>
    <run_time />
</job>
```

delay_after_errorで異常発生時の繰り返しの挙動を指定可能です。

error_countで何回目のエラー発生時以降の挙動を定義するかを指定し、
delayでその時の挙動を定義します。

ここでは、まず、error_count=1なので1回目のエラーが発生した以降、delay=10なので10秒後に再実行をかける定義が書かれています。
その次の行で、error_count=3なので3回目のエラーが発生した後は、delay=stopなのでこのジョブを停止するといった指定になります。

delayは以下の3パターンで指定可能です。

* 秒数で指定
* 時刻(HH:MM:SS)で指定
* stopを指定

これを使えば、例えば次のようにまずはすぐに何度か繰り返すが、それでもうまくいかなければ翌日実行するといったことも可能です。

### 例2: 最初3回は10秒間隔で繰り返し、その後は1日おきに繰り返し実行

```xml:job1.job.xml
<job  name="job1">
    <script  language="shell">
        <![CDATA[
ジョブの中身
        ]]>
    </script>

    <delay_after_error  error_count="1" delay="10"/>
    <delay_after_error  error_count="3" delay="24:00:00"/>
    <delay_after_error  error_count="5" delay="stop"/>
    <run_time />
</job>
```

これで
1: エラー発生
↓10秒後
2: 再実行
↓10秒後
3: 再実行
↓24時間後
4: 再実行
↓24時間後
5: 再実行←ここで停止

こんな流れが実行できます。

## ※注意: デフォルトの場合、ジョブの状態は『停止』になってしまう

この時注意が必要な点としては、上記の設定の場合、setbackの処理が終わった後、ジョブは**停止**状態となることです。
Jobの定義の中でstop_on_errorという設定項目があります。
ここの設定をnoに設定しておかないと、JobChainの定義でerrorノードへの遷移を定義しているにもかかわらず、ノード自体が停止状態となり先に進まなくなるので注意が必要です。

例1の場合、以下のように設定することで3回エラーした後はerrorの終端ノードにJobChainが遷移し終了します。
あとから手作業で再実行させたり、手作業でジョブをスキップさせたい場合にはstop_on_error=yesと設定し停止状態に遷移させる運用が良いです。

```xml:job1.job.xml
<job  name="job1" stop_on_error="no">
    <script  language="shell">
        <![CDATA[
ジョブの中身
        ]]>
    </script>

    <delay_after_error  error_count="1" delay="10"/>
    <delay_after_error  error_count="3" delay="stop"/>
    <run_time />
</job>
```