OmniAICreator/Qiita-1.07M huggingface dataset:
Look into Elixir(Erlang)'s lightweight process. ( #quick_elixir LT )

# TL;DR

```elixir
iex> :observer.start()
```
observerを使って軽量プロセスを具体的に見れる。

---

# about me

issei (Takano Issei)

## official
NALGO Co., LTD.
※ここでの発言は会社とは関係ありません

## language
natural：日本語、English、Hanyu(a bit)、Espanol(a bit)
work：SAStruts、BackboneJS、Groovy
favorite：Ruby、Groovy
interested in：Phoenix、React、Angular2

## private
twitter: it__ssei
slack: ssmjp, ng-japan, ...
game: PSO2, FF14

## icons
![d082643c2f0da08685452d2ef420dd21.png](https://qiita-image-store.s3.amazonaws.com/0/31245/8bc6ab0c-8800-2d68-ac04-ea04a3add37e.png)
((c) ギルティクラウン製作委員会)
![miuna.jpg](https://qiita-image-store.s3.amazonaws.com/0/31245/f1478d06-b03c-6961-1823-d7c7cabc0b0a.jpeg)
((c) Project-118/凪のあすから製作委員会)

---

# summary of lightweight process

* 起動・終了が軽いスレッドのようなもの
* Erlang VM上で動いている
* OSのプロセスよりも非常に沢山、起動できる

しかし、当然のことながら
* タスクマネージャからは見えない

---

# If you want to watch Erlang process

```elixir
iex> :observer.start()
```
(need OTP ver. 18 or latest)

![erlang_process.png](https://qiita-image-store.s3.amazonaws.com/0/31245/c4cdb70e-5fb9-45a5-2664-f9169f5fbf66.png)

## document of observer

タブ毎の簡単な説明など
http://erlang.org/doc/apps/observer/observer_ug.html

---

# Thanks for

## #quick_elixirの主催者さん、参加者のみなさん。

http://connpass.com/event/43633/

## 参考文献

「Observer in Erlang/Elixir release」
https://tkowal.wordpress.com/2016/04/23/observer-in-erlangelixir-release/
技術英語 > Keep a notepad by your desk, and make a list of things to try.

@ Code Complete (No. 17617 / 36077)

> Keep a notepad by your desk, and make a list of things to try.

http://lifehacking.jp/2008/03/doing-list/
> 面白かったのは次の一瞬でした。12年前の記憶を呼び起こしながらファイルを探していると、探していたのとは別のファイルのディレクトリを発見したのです。

> 彼はちょっと顔を曇らせると「こんなところにあったのか…」とつぶやき、「でも今やっていることから離れるのはいやだな」と言ってリーガルパッドの方に、ディレクトリの情報をささっとリストの最後に付け加え、それまでやっていた作業を続行したのでした。

作業をしていく中で、やりたいことが分岐しそうになる時がある。その分岐を一つ一つ処理していくと、メインの作業から離れすぎる場合がある。

最近は分岐事項が出てきたら、とりあえずTODOリストに放り込んで、本当にその場ですぐに対処すべき事項を優先するようにしている。
asset_sync で '[fog][WARNING] fog: followed redirect to xxxx.s3.amazonaws.com, connecting to the matching region will be more performant' と言われる場合


'us-east-1' のバケットに precompile した assets をアップロードする場合に表題の問題が発生した。

s3 の url に問題があるらしい。

以下のように asset_sync の設定で fog_path_style を true に設定すれば解決する。

```config/initializers/asset_sync.rb
  config.fog_path_style = true
```
PHP+MySQLで画像保存と画像表示（備忘録）

# 概要
PHPを用いMySQLへ画像保存し今度はそのMySQLに保存された画像データを表示する際に
![google_chrome.png](https://qiita-image-store.s3.amazonaws.com/0/129578/428cd97f-124f-28bb-2900-1a60c785474c.png)
とか
![firefox.png](https://qiita-image-store.s3.amazonaws.com/0/129578/7dac3c81-d007-95f3-1833-aa626d53f378.png)
とか
![Edge.png](https://qiita-image-store.s3.amazonaws.com/0/129578/92e55727-ac3f-18dc-d2f8-35ea17cc38eb.png)
とかで画像表示ができなくなってしまいました。
これを解決するためのポイントを備忘録としてメモしておきます。

# 実施環境
PHP/5.2.4
DB/MySQL

# 事前準備
http://d.hatena.ne.jp/steel-plate/20070910/1201454906
こちらを大変参考にさせていただきました。ありがとうございました。:thinking:
いい感じに実装させていざ画像出力!!!
![google_chrome.png](https://qiita-image-store.s3.amazonaws.com/0/129578/b5f8b6ef-7d09-0704-c4dc-2cefc7919e6a.png)
..........:cry:

# 解決策1　PHPファイルをUTF-8(BOM無し)で保存する
UTF-8にはBOM有りとBOM無しがあります。
BOM有のままファイルを保存してMySQLのデータベースに画像データのバイナリを保存すると画像の最初３バイトに 画像としてふさわしくない情報が追加されるみたいです。

http://dotnsf.blog.jp/archives/1041643802.html
こちらが大変参考になりました。ありがとうございました。:thinking:

# 解決策2　テーブルの型に注意する
BLOB型とTEXT型がぐちゃぐちゃになっていました。
## テーブル1

|レコード|id|name|data|
|:-----------------|------------------:|:------------------:|:---------:|
| 型 | INTEGER |CHAR|MEDIUMBLOB|

BLOB型はバイナリデータを格納する。
つまり、画像のバイナリデータを直接INSERTすれば良い。

## テーブル2
|レコード|id|name|data|
|:-----------------|------------------:|:------------------:|:---------:|
| 型 | INTEGER |CHAR|MEDIUMTEXT|

TEXT型は文字列を格納する。
つまり、画像のバイナリデータをbase64encode("画像のバイナリデータ")を用い文字列型に変換しINSERTを行う。
また、画像表示するときはbase64decode("文字列")を用い元の画像のバイナリデータに戻す。

http://www.dbonline.jp/mysql/type/index6.html
こちらを大変参考にさせていただきました。ありがとうございました。:thinking:

# 解決策3　文字のエスケープにはquotemeta(文字列)を用いる
addslashes(文字列)は文字列の中の「\」「NULL」「"」「'」の4種類の文字しかエスケープできません。
quotemeta(文字列)は文字列の中の「^」「(」「)」「$」「+」「*」「?」「[」「]」「.」「\」の11種類の文字をエスケープします。

base64encodeした後はエスケープしてください。

なぜかaddslashes(文字列)では出来なかったです。
しかしquotemeta(文字列)では表示できるようになりました。
推測では、前者では4文字しかエスケープ出来ないという事で中途半端にエスケープされていたのかなと考えています。

http://www.php-ref.com/bapi/02_addcslashes.html
こちらを大変参考にさせていただきました。ありがとうございました。:thinking:


# 解決策4　解決策1～3を用いた後ブラウザのキャッシュを更新する

解決策1～3をして[img_display.php]を更新しても何故か反応しない場合があります。
その時は、
![google_chrome.png](https://qiita-image-store.s3.amazonaws.com/0/129578/428cd97f-124f-28bb-2900-1a60c785474c.png)
を右クリック→新しいタブで画像を開く→更新(F5)
を押してください。
これでなんとか読み込むことができました。

推測としては、[img_display.php]は更新されているが、画像として認識されている[get_img.php]は前のキャッシュのままであると考えています。
したがって、[get_img.php]を更新してあげることによって画像を取得することができました。

# まとめ
MySQLに画像データを上げる場合に画像データが壊れてしまうという点を解消しました。
貴重な時間を割き、お読み下さいましてありがとうございました。
WP-CLIでVCCW環境をほいほい作る


VCCWのサイトを立ち上げるには、公式サイトから.zipをダウンロードして、解凍してターミナルを開いてって感じで一手間ありますよね。

先日リリースしたWP-CLIコマンドをセットアップすれば以下のようにわずかなコマンドで新しいVCCW環境を作ることができます。

```
$ wp scaffold vccw wordpress.dev --lang=ja
$ cd wordpress.dev
$ vagrant up
```

https://github.com/vccw-team/scaffold-vccw

## インストール方法

以下のコマンドを実行してください。

```
$ wp package install vccw/scaffold-vccw:@stable
```

## 使用方法

任意のディレクトリに移動して以下のようにコマンドを実行してください。


```
$ wp scaffold vccw <ディレクトリ名>
```

以上で以下のような感じでVCCWの最新版がダウンロードされます。

```
├── .editorconfig
├── .gitignore
├── LICENSE
├── README.md
├── Vagrantfile
├── ansible.cfg
├── provision/
└── site.yml
```

あとは、そのディレクトリに移動して `vagrant up` するだけ。

必要に応じて `site.yml` を編集してください。

## コマンドラインオプション

このコマンドにはいくつかのコマンドラインオプションがあります。

* `--host=<ホスト名>` - ホスト名を指定してください。デフォルトは `vccw.dev` です。
* `--ip=<IP>` - IPアドレスを指定してください。デフォルトは `192.168.33.10` です。
* `--lang=<language>` - 言語を指定してください。デフォルトは `en_US` です。
* `--update` - VCCWのファイルを最新版にアップデートします。

## help

`wp help scaffold vccw` でヘルプを見ることができます。

```
NAME

  wp scaffold vccw

DESCRIPTION

  Generate a new VCCW environment. bHHHH

SYNOPSIS

  wp scaffold vccw <directory> [--host=<hostname>] [--ip=<ip-address>] [--lang=<language>]
  [--update]

OPTIONS

  <directory>
    The directory of the new VCCW based guest machine.

  [--host=<hostname>]
    Hostname of the guest machine. Default is `vccw.test`.

  [--ip=<ip-address>]
    IP address of the guest machine. Default is `192.168.33.10`.

  [--lang=<language>]
    Language of the WordPress. Default is `en_US`.

  [--update]
    Update files of the VCCW to latest version.

EXAMPLES

    $ wp scaffold vccw wordpress.dev
    Generating:   100% [===========================] 0:03 / 0:06
    Success: Generated.

    $ wp scaffold vccw wordpress.dev --lang=ja
    Generating:   100% [===========================] 0:03 / 0:06
    Success: Generated.
```
【Git】よく使うコマンドまとめ

Gitフロー（っぽい）開発をしている
それに沿ってよく使うコマンドをまとめてみた

**これをみてこういうやりかたもあるよとか、こっちのほうがいいよというのがあれば教えてほしい**

#開発開始

##featureブランチ作成
developを最新にしてそこからブランチを作る

```
git checkout develop
git pull origin develop
git branch -b feature/xxx
git checkout feature/xxx
```

##ブランチ名変えたいとき
タイプミスややっぱこっちかなってとき

```
git branch -m <変更後のブランチ名>
```

#開発中

##修正前に戻す
add前でこのファイル修正必要ないじゃんってとき

```
git checkout ファイル名
```

##他人の修正を自分のブランチへ取り込む
開発中をstashして、ローカルdevelopを最新にして、自分のブランチへマージする
**もしかしてここってリモートdevelopを直接自分のブランチへpullしたほうが早いのか？**

```
git stash
git checkout develop
git pull origin develop
git checkout feature/開発中
git stash pop
git merge develop
```

##開発中にレビュー依頼されたとき
動作確認も行いたいので、開発中のものはstashして、確認するブランチへcheckoutする

```
git stash

#developを経由してレビュー依頼へ行くことでdevelopとマージした状態で動作確認できる
git checkout develop
git pull origin develop

#レビュー依頼へ
git checkout -b feature/レビュー依頼
git pull origin feature/レビュー依頼

#レビュー

#開発中へ戻る
git checkout feature/開発中
git stash pop
```

#開発終了

##変更したファイルの一覧
新規作成/編集でadd前は赤色、add後は緑色

```
git status
```

##git addする前に変更箇所を確認
ワーキングツリーとインデックスの差分

```
git diff
```

##git commitする前に変更箇所を確認

```
git diff --cashed
```

##リモートへpush
開発すべて終わってからadd/commitする派

```
#addはひとつづつ丁寧に
git add xxx xxx xxx   
git commit 
git push origin feature/xxx
```

##プルリクマージの際にコンフリクトを起こしている場合

ローカルでコンフリクトを直す

```
git checkout develop
git pull origin develop
git checkout feature/xxx
```

#ここでboth modifiedと出ているファイルがコンフリクト vimで修正する
```
git status

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      XXXXX
```

```
<<<<<<< HEAD
自分の環境の変更点
=======
マージを試みた他の環境での変更点
>>>>>>> [commit id]
```

修正したらadd/commit/pushする

```
git add XXX
git commit
git push origin feature/xxx
```
FreeBSD 11.0-RELEASEをRaspberry Pi2で動かす

#FreeBSDをRaspberry Pi2で動かすメリット
適度に(実用という意味で）高速だが、適度に低速
電力がめちゃくちゃ食わない

##インストールをしてみる
###FreeBSD RPI2のダウンロード
http://ftp.jp.freebsd.org/pub/FreeBSD/releases/arm/armv6/ISO-IMAGES/11.0/FreeBSD-11.0-RELEASE-arm-armv6-RPI2.img.xz

ちなみに、Raspberry Pi版は
http://ftp.jp.freebsd.org/pub/FreeBSD/releases/arm/armv6/ISO-IMAGES/11.0/FreeBSD-11.0-RELEASE-arm-armv6-RPI-B.img.xz

バイナリが異なるので注意

###7zipでxzを展開する
https://sevenzip.osdn.jp/

###MicroSDを用意する
Class10のMicroSDがおすすめですが、読み込み速度80Mbytes/secとかいう超高速なものは、すぐにハングアップしてしまいます。安価な物でOKです。
>超高速なものは、素直にスマホで使うか他のOSで使用しましょう。

###WindowsでMicroSDを焼く
https://sourceforge.net/projects/win32diskimager/

Win32DiskImagerは管理者権限で操作させる必要があります。

###MicroSDを焼いたら、CONFIG.TXT をメモ帳等で書き換える

今、うちが使用しているのは

```CONFIG.TXT
disable_commandline_tags=0
device_tree_address=0x100
device_tree=rpi2.dtb
kernel=u-boot.bin
gpu_mem=64

disable_camera_led=1
force_turbo=1
arm_freq=900
arm_freq_min=700
core_freq=250
core_freq_min=250
sdram_freq=400
sdram_freq_min=400
```

最低でも
```
arm_freq=900
```
は追加しないと、600MHz と性能を活かせません。

###電源を投入する前に、HDMI、USBキーボード、LANを接続する

###2.1Aの強力な電源とMicroUSBケーブルを用意して、接続する。
>最近になって、MicroUSBケーブルに限っては、100円ショップでも売ってるようです。


###しばらくフリーズしたかのようになりますが、そのまま待ちます。
ファイルシステムをリサイズしていますので、ログインプロンプトが出るまで待ちます。

###ログインします。
root のパスワードは、root です。

###wheelグループのユーザーを追加します。
```
#adduser
```
>sshからrootになれる必要があります。

###ネットワークが有効になっているか、確認します。
```
ping 8.8.8.8
```
###ネットワークを固定IPにします。
>ルーターが192.168.0.254、ネームサーバーが192.168.0.254、フレッツギガの場合を想定

```/etc/rc.conf
#ifconfig_DEFAULT="DHCP"
ifconfig_ue0="inet 192.168.0.1 netmask 255.255.255.0"
defaultrouter="192.168.0.254"
ifconfig_ue0_ipv6="inet6 accept_rtadv"
```
```/etc/resolv.conf
nameserver 192.168.0.254
```

###sshdが有効かどうか確認します。
```
#ps ax|grep sshd
```

###rebootします
```
#reboot
```

###お好きなsshクライアントで接続してみます。
![mari.png](https://qiita-image-store.s3.amazonaws.com/0/149448/4fb2eb22-3b7c-6918-f2d1-020197df1e36.png)

###タイムゾーンをコピーします。
>日本の場合
```
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

##portsとかは？
昔は1GHz未満でもportsは実用でしたが、今本格的にportsだけで構築しようとすると、非常に苦しいかもしれません。

なるだけ pkg だけでシステムを構築するか、クロスコンパイルすることをお勧めします。

##時計は？
ntpdを設置してもよいですが、ntpdを動かす前に、必ず、どこかのサーバーにntpdateをするようにしましょう。

私の場合の openntpd on runit のスクリプトです

```/service/optnntpd/run
#!/bin/sh
/bin/sleep 5
/usr/sbin/ntpdate ntp.jst.mfeed.ad.jp 2>&1
/bin/sleep 5
/usr/local/sbin/ntpd -d 2>&1
```

##追記 2019/05/07
MicroSDの書き込み制限が厳しい為、極力セキュリティーアップデート等は避けてください。あまりに頻繁にアップデートをしますと、MicroSDの寿命によりいつか起動しなくなります。

OSメジャーアップグレードを過去に使用したMicroSDを使用するのは、MicroSDの書き込み制限により不適切です。いつか起動しなくなります。新品のMicroSDを購入するようにしましょう。

頻繁に書き込みする必要性があるファイルがある場合、外付けUSB接続のHDD等を利用するようにしてください。うちはこのおかげで、MicroSDをわずか4か月で死亡させました。
【Fluentd】Ubuntu14.04でFluentdを動かしNginxのアクセスログを出すところまで

Fluentdの初歩の初歩。

# 環境

Ubuntu14.04 trusty

# インストール

[公式ページのInstallation](http://docs.fluentd.org/articles/install-by-deb)から使うUbuntuのバージョンのコマンドを見つけて実行。
今回は14.04なので以下を実行する。

```
$curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
```

# 起動確認

インストールが完了したら起動してるか確認する

```
sudo apt-get update
sudo apt-get install nginx
```

```
$sudo service nginx status
 * nginx is running
```

# `td-agent.conf`の設定

一旦インストール時の設定を全て消す（サンプルの設定がエラー吐くので）

nginxのaccess.logをtailして標準出力に出す。

```
<source>
  type tail
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx-access.pos
  format /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwarder>[^\"]*)")?/
  time_format %d/%b/%Y:%H:%M:%S %z
  tag nginx.access
</source>

<match nginx.access>
  @type stdout
</match>
```

td-agentを再起動する

```
sudo service td-agent restart
```

td-agentに`/var/log/nginx/access.log`のPermissionがないので`/var/log/td-agent.log`にエラーログが流れた。

```
2016-11-14 16:57:08 +0000 [error]: Permission denied @ rb_sysopen - /var/log/nginx/access.log
  2016-11-14 16:57:08 +0000 [error]: suppressed same stacktrace
```

# td-agentの実行ユーザーを変える

`/etc/init.d/td-agent`にtd-agentの実行ユーザーを変更する設定があるので思い切ってrootにする。

```
$ sudo vim /etc/init.d/td-agent
```

```
TD_AGENT_USER=root
TD_AGENT_GROUP=root
```

# 実行確認

再起動する。

```
sudo service td-agent restart
```

nginxにアクセスする度に`/var/log/td-agent/td-agent.log`にログが出力されるようになった！

```
vagrant@vagrant-ubuntu-trusty-64:~$ sudo tail -f /var/log/td-agent/td-agent.log
2016-11-14 17:02:05 +0000 nginx.access: {"remote":"192.168.33.1","host":"-","user":"-","method":"GET","path":"/","code":"304","size":"0"}
2016-11-14 17:02:14 +0000 nginx.access: {"remote":"192.168.33.1","host":"-","user":"-","method":"GET","path":"/","code":"304","size":"0"}
2016-11-14 17:04:03 +0000 nginx.access: {"remote":"192.168.33.1","host":"-","user":"-","method":"GET","path":"/","code":"304","size":"0"}
```
swift3.0でUIColorの取得法が変わったのでよく使ってるExtentionも書き換えておく。


Swift3系になってからUIColorがクラス変数になりましたよね。
UIColor.white() →　UIColor.whiteみたいな。
Extentionを昔のまま使い回すと、UIColor.baseBlue()みたいになって統一感でないので、Swift3.x系のプロジェクトに入れる分は書き換えておきました。


```UIColor+AppColor.swift(Swift3.x)
import UIKit
import Foundation

extension UIColor {
    
    open class var baseBlue: UIColor {
        return UIColor.rgbColor(0x289BCC)
    }
    
    open class var baseOrange: UIColor {
        return UIColor.rgbColor(0x289BCC)
    }
    open class var darkOrange: UIColor {
        return UIColor.rgbColor(0x289BCC)
    }
    open class var lightOrange: UIColor {
        return UIColor.rgbColor(0x289BCC)
    }
    
    class func rgbColor(_ rgbValue: UInt) -> UIColor{
        return UIColor(
            red:   CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgbValue & 0x00FF00) >>  8) / 255.0,
            blue:  CGFloat( rgbValue & 0x0000FF)        / 255.0,
            alpha: CGFloat(1.0)
        )
    }
}
```


ちなみにSwift2.x系のプロジェクトで使ってた方。
まだまだ2.xで開発するなら、コードの統一感的にこっち入れたほうがいいです。

```UIColor+AppColor.swift(Swift2.x)
import UIKit
import Foundation

extension UIColor {
    
    class func baseBlue()->UIColor{
        return UIColor.rgbColor(0x289BCC)
    }
    
    class func baseOrange()->UIColor{
        return UIColor.rgbColor(0xFFA700)
    }
    
    class func darkOrange()->UIColor{
        return UIColor.rgbColor(0xD25B00)
    }
    
    class func lightOrange()->UIColor{
        return UIColor.rgbColor(0xFFBD3F)
    }
    
    class func rgbColor(rgbValue: UInt) -> UIColor{
        return UIColor(
            red:   CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgbValue & 0x00FF00) >>  8) / 255.0,
            blue:  CGFloat( rgbValue & 0x0000FF)        / 255.0,
            alpha: CGFloat(1.0)
        )
    }
}

```
TEMPer + Arch Linux + Muninで温度監視

Yet Another TEMPer.

# やりたいこと

- Arch Linuxでやりたい
    - たまたまDebianじゃないんです、すいません
    - apt-getは使えないんです、すいません
- Muninでグラフにしたい
    - たまたまZabbixじゃないんです、すいません
- **簡単に**入れたい
    - 手抜きします、すいません

# 対象センサーデバイス

どこにでも売っている、1000円くらいの[Gold TEMPer](http://www.pcsensor.com/usb-thermometers/gold-temper.html)。
[RPiでキャリブレーションの記事](http://www.okahiro.info/gd/2016/04/02/post-1452/)が、とても参考になる。精度はいまいちっぽい。

# TEMPerドライバ

とにかくいろいろある。

1. [Arch LinuxのAURのpython2-temper](https://aur.archlinux.org/packages/python2-temper/)
依存関係が複雑でPKGBUILDによるbuildに失敗、断念

2. キャリブレーションの記事でも紹介されていたhttps://github.com/bitplane/temper
libusbがあればmake一発だが、Muninで使うには別途スクリプト必要?

3. SNMPもあって高機能そうなhttps://github.com/padelt/temper-python
PKGBUILD見つからず…python-usbも面倒そう…いやいやPyPIなら簡単?

4. [ここ](http://lee.smallbone.com/2014/10/using-temper1f-usb-temperature-probe-on-raspberry-pi/)で推されていたhttps://github.com/petechap/usb-thermometer
[Muninプラグイン](https://github.com/cmur2/munin-pcsensor)がある

その他forkも含めて、カオス。

# デバイスのバグ

[こちら](http://blog.osakana.net/archives/category/minor/usbtemper)によると、このデバイスには連続使用に問題がありそうだ。4.の[Muninプラグイン](https://github.com/cmur2/munin-pcsensor)には、

> This script compensates this by a retry after a second after a failed invocation of pcsensor.

とあり、workaroundが入っていそうなので、4.の組み合わせにしてみよう。

# 設置
## usb-thermometer

もう忘れてしまったが、

```shell-session
$ pacman -S libusb
$ git clone https://github.com/petechap/usb-thermometer.git
$ cd usb-thermometer
$ make
$ sudo ./pcsensor
$ sudo install -s pcsensor /usr/local/bin/pcsensor
```

だったと思う。

## munin-pcsensor

こちらも記憶が無いが、本当はudevと組み合わせてuser=muninで走らせたりするところを手抜きして、

```/etc/munin/plugin-conf.d/pcsensor
[pcsensor*]
user root
```

```shell-session
$ git clone https://github.com/cmur2/munin-pcsensor.git
$ sudo cp munin-pcsensor/pcsensor /usr/lib/munin/plugins/
$ sudo ln -s /usr/lib/munin/plugins/pcsensor /etc/munin/plugins/pcsensor
$ sudo systemctl restart munin-node
```

なんかをした気がする。

# 結果
## 温度
![pcsensor-week.png](https://qiita-image-store.s3.amazonaws.com/0/104225/59c0770b-6eef-ddc9-8c62-814818973f81.png)

パラメーター調整を何もしていないが、カーブはきれいな感じ。
合っているかは不明だが…。

## おまけ::NTPのPLL
![ntp_kernel_pll_freq-week.png](https://qiita-image-store.s3.amazonaws.com/0/104225/65de4f8e-e353-4581-e85d-147e718c395f.png)

相似!

# 自由研究
VMware vSphere ESXiでUSBのHIDって使えない? Passthrough?

# 追記
ある日4.が動かなくなり、2.にお引越し。失敗時のリトライなども入っているように見える。
muninのpluginは[こちら](http://qiita.com/zembutsu/items/0f8e570c4016ddb4aefa)でばっちり。
Postgresqlで新規にDBを作成する流れ(備忘録)

毎回手順を忘れてしまうダメ人間なので、メモっておきます。 ORMに慣れた現代っ子です。

### ユーザーの作成

`createuser -d -P [user名]` 

( `-a` をつけるとスーパーユーザーとして作成できる)

間違えたときは:  `dropuser [user名]`

### Databaseの作成

`createdb -O [user名] [db名]`

間違えたときは: `dropdb [db名]`

### ログイン

`psql -d [db名] -U [user名]`

### Tableの作成

`\i [定義※]` or ログイン後作業

※に関しては `.sql` ファイルを読み込ませてもいいし、クリップボードから流し込んでもいい。

### ログイン後の作業

[PostgreSQLコマンドチートシート](http://qiita.com/Shitimi_613/items/bcd6a7f4134e6a8f0621)

### Database一覧

`psql -l` (DB一覧)
PLANEX GW-450D KATANAをRaspberry Pi 2/3で使う

# Cross Compile MT7610U Driver for RPi2/3
PLANEX製のGW-450DはMT7610Uというチップを使っていますが、Linuxドライバは公開されているため、RaspberryPiでも使うことが出来ます。

ネイティブビルドの情報はたくさんありましたが、クロスコンパイルの情報がなかったので作りました。ネイティブビルドだと下手すると数時間かかってしまいますので、こちらの方法の方が楽だと思います。

RaspberryPi3とカーネルバージョン4.4の環境でテストしています。

まず作業用のディレクトリを作っておきます。

```
$ mkdir bcm-staging
$ export WORK=`pwd`/bcm-staging
```
## RPi2/3 Kernel
まずカーネルをクロスコンパイルします。基本的に公式で公開されている手順と一緒です。

### Setup toolchain
公式のツールチェインを落としてきてPATHを設定します。

```
$ cd ${WORK}
$ git clone https://github.com/raspberrypi/tools
$ export PATH=${PATH}:`pwd`/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
```
### Build
こちらのビルド方法は公式で公開されている手順と一緒です。

```
$ cd ${WORK}
$ git clone -b rpi-4.4.y https://github.com/raspberrypi/linux.git
$ cd linux
$ export KERNEL=kernel7
$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ make bcm2709_defconfig
$ make -j 4 zImage modules dtbs
```
## MT7610U Driver
### Build
公式で公開されているドライバにRPi用にすこし手を加えたものを落としてきてビルドします。（ツールチェインのPATHが通っている必要があります。）

```
$ cd ${WORK}
$ git clone -b rpi https://github.com/FantomJAC/mt7610u_wifi_sta_v3002_dpo_20130916.git
$ cd mt7610u_wifi_sta_v3002_dpo_20130916
$ export PI_SRC=${WORK}/linux
$ make
```
### Install
ドライバファイルをRaspberryPiのrootfsにコピーします。（${RPI_ROOTFS}は適時設定して下さい。）

*本来であれば上記手順でビルドしたカーネルを一緒に使用すべきですが、カーネルのバージョンが4.4まで一致していれば大体動きます。*

```
$ cp ./os/linux/mt7650u_sta.ko ${RPI_ROOTFS}/modules/4.4.21-v7+
$ mkdir -p ${RPI_ROOTFS}/etc/Wireless/RT2870STA
$ cp RT2870STA.dat ${RPI_ROOTFS}/etc/Wireless/RT2870STA
```

/etc/network/interfacesに以下の行を追加します。

```
allow-hotplug ra0
iface ra0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

RaspberryPi上で以下のコマンドを実行します。

```
# depmod -a
```
C#でdumpするライブラリ MemberValueを作ってみた

C#でdumpするライブラリ MemberValueを作ってみました。
https://github.com/oo2kazuma/MemberValue

## 説明
C#にはオブジェクトの詳細を文字列でダンプする方法が備わっていません。
このライブラリはこれを可能にするものです。
どんなオブジェクトでもそのクラスのToStringメソッドに依存することなく自動で各フィールド・メソッドの値を文字列出力します。
デバッグログでご利用ください。

## 最新DLLファイル
https://github.com/oo2kazuma/MemberValue/releases/tag/0.9.8
・MemberValue.dll
・MemberValue.XML

## Example

###Code


        private void NewMethod()
        {
            var dumper = new OHLibrary.MemberValue("TestClassObject", new TestClass());
            Console.WriteLine(dumper.Dump());
        }

        public class TestClass
        {
            public string StringValue="StringValue";
            public int IntValue = 1;
        }

### Result
```
Name[TestClassObject] Value[WindowsFormsApplication1.Form1+TestClass] Type[WindowsFormsApplication1.Form1+TestClass] ThrewException[False]
-Name[StringValue] Value[StringValue] Type[System.String] ThrewException[False]
-Name[IntValue] Value[1] Type[System.Int32] ThrewException[False]
```

# 作成した経緯
プロダクト環境でオブジェクトの詳細な状態を見たかった。
しかし、自作クラスが多いプロジェクトでそれぞれのクラスのToStringメソッドをオーバーライドする労力は膨大。
なら、各フィールドを自動検知してその値を出力できるライブラリを作れば幸せになれるのでは。。
ということで作りました。

# ライセンス
MITです。
ご利用の際は、利用者から見える画面、または同梱ファイルに下記の文字列を記載してください。

```
MIT License
Copyright (c) 2016 oo2kazuma
https://github.com/oo2kazuma/MemberValue/blob/master/LICENCE
```
Linux: inotify-toolsでダウンロードしたファイルのパーミッションを自動で変更する

以下のエントリでダウンロードしたファイルの実行権限を自動で変更する方法を質問されたのですが、知らなかったので調べてみました。
[Linuxの権限確認と変更（超初心者向け）](http://qiita.com/masashi-t-h/items/5f4c4fa768642aad9e06#comment-8fc30fc534a65ddc77ab)

## inotify-tools
inotify-toolsを使うとディレクトリを監視するツールがあるようです。
### インストール
`sudo apt-get install inotify-tools`
### 実践
色々調べた結果、任意のディレクトリ内に新しく作られたファイルのパーミッションを自動で変更するシェルを常時起動させることでダウンロードしたファイルの権限を自動で変更できるようになりました。

autopermission.shなど名前をつけたシェルを作成。
<pre>
#!/bin/bash

DIR="/home/user/ダウンロード" #ここを任意のディレクトリに変更

inotifywait -m --format "%e %f" "$DIR" | awk '$1 ~ "CREATE" { print $2; fflush() }' | 
while read file
do
    FILE="${DIR}"/"${file}"
    chmod ugo+rwx "${FILE}" # ここで付与する権限を設定
done
</pre>

起動します。

```
$ sh ./autochangepermission.sh 
Setting up watches.
Watches established.
```

試しにtouchで新しくファイルを作って
`touch ~/ダウンロード/test.sh`
確認します。
<pre>
$ ll ./ダウンロード/* | grep test
-rwxrwxrwx  1 user user         0 11月 15 00:00 ./ダウンロード/test.sh*
</pre>
ちゃんと777になっている。。

本題のダウンロードした際にパーミッションが変更されるのか検証してみます。react.jsをダウンロードしてみます。
まずは先ほどのシェルを起動せずにダウンロード
`wget https://unpkg.com/react@15/dist/react.js`

確認してみます。
<pre>
$ ll | grep react.js 
-rw-rw-rw-   1 user user    701412 11月 15 00:21 react.js
</pre>
パーミッションは666となっています。

次に先ほどのシェルを起動させておいてダウンロードしてみます。

<pre>
$ sh ./autochangepermission.sh 
Setting up watches.
Watches established.
</pre>
で起動させておいて別タブで
`wget https://unpkg.com/react@15/dist/react.js`
を実行して確認してみます。
<pre>
$ ll | grep react.js
-rwxrwxrwx   1 user user    701412 11月 15 00:26 react.js*
</pre>

ちゃんとパーミッションが自動で変更されています。

# まとめ 

- 任意のディレクトリにて実行権限を制限したい時には便利かもしれません。
- シェルを起動し続けなければならないのが微妙・・・
- inotify-toolsは他にも応用できそう。ファイル更新したら自動でサーバー再起動とか使えそう。近々やってみよう。

以上になります。
最後までお読みいただきありがとうございました。

# 参考
参考にさせていただきました。ありがとうございました。
http://qiita.com/stc1988/items/464410382f8425681c20
https://orebibou.com/2015/04/linuxでファイル・ディレクトリ監視を行う『inotify』/
ネットワーク基礎知識「プロトコル」

--まえおき--
間違った日本語や知識を書いていたらごめんなさい。

コンピュータネットワークや情報通信の世界では"プロトコル"という言葉が頻繁に使われいます。

プロトコルを簡単に説明しちゃいますとコンピュータとコンピュータがネットワークを利用して通信するために決められた「約束ごと」という意味になるらしいです。
普段私達が意識してネットワークを使うことはありません。しかし、ネットワークを利用してコミュニケーションをとるためには、とても重要なものです。

プロトコルはいくつもの種類があり、それぞれ仕組みが明確に決められています。
コンピュータ同士がお互いに通信するためには、両者がお互いにプロトコルを理解し、処理できなければなりません。

--プロトコルのイメージ--
会話で例えると…

・日本語や英語（言語）を「プロトコル」とする
・言語によってコミュニケーションする事を「通信」
・会話の内容を「データ」

登場人物
Aさん（日本人）
Bさん（アメリカ人）
Cさん（日本人）

AさんとBさんが会話した場合
![test5.png](https://qiita-image-store.s3.amazonaws.com/0/146678/c26d394b-37a2-b263-0828-bde5622da9d2.png)
言語のプロトコルが異なるのでコミュニケーション不成立。
双方ともに言語（プロトコル）を理解していないのでコミュニケーション（通信）が成立せず会話の内容（データ）が相手に伝わりませんでした。

AさんとCさんが会話した場合
![test6.png](https://qiita-image-store.s3.amazonaws.com/0/146678/389cc349-4c05-6206-a29f-a922814bb331.png)
言語のプロトコルが一致してコミュニケーション成立
双方が言語（プロトコル）を理解しているためコミュニケーション（通信）が成立し会話の内容（データ）が相手に伝わります。

コンピュータとコンピュータがネットワークを介して通信するときもほとんど同じように考えてもらって大丈夫だそうです。

人間には知能、応用力、理解力を持っているので、ある程度ルールから外れていても、意思の疎通ができるはずです。
ですが、コンピュータはそうはいきません。
途中で障害が発生した場合にどう処理するかなど、通信中に起こりうるさまざまな問題をあらかじめ想定しておかなければなりません。
コンピュータ通信では、コンピュータ同士で約束ごとをきめ細やかく決めて、それを守れることがたいせつです。この約束ごとが「プロトコル」です。

さまざまなプロトコルを体系的にまとめたものを「ネットワークアーキテクチャ」ということがあります。

--コンピュータ通信の登場から標準化へ--
コンピュータ通信が始まった当初は、体系や標準化が重要だとは考えられていませんでした。
そのため各コンピュータメーカーは、それぞれの会社独自のネットワークアーキテクチャを発表し、プロトコル群の体系化を行いました。
ここで問題がおきるわけです。各社独自のネットワークアーキテクチャ、プロトコルには互換性がなく、異なる製品を物理的に接続しても、ただしく通信されませんでした。

これは利用者にとってとても不便でした。
・最初にコンピュータネットワークを導入したら、いつまでも同じメーカーの製品を買い続けなければならなかったこと。
・メーカーが消滅したり、その製品がサポートされなくなったりしたら、すべての機器を入れ換えなければならなかった。
・違う部署で別のメーカーの製品を導入していた場合、それぞれの部署のネットワークを互いに接続しても、プロトコルが違うために通信ができない場合が多かった。

しかしコンピュータの重要性が増し、多くの企業でコンピュータネットワークが導入されていくと、メーカーが違えどお互いに通信できるような互換性が重要であると、認識されるようになりました。
これが、ネットワークの「オープン化」、「マルチベンダ化」です。

プロトコルが標準化されてすべての機器が１つのネットワークアーキテクチャに準拠すれば、コンピュータのハードウェアやOSの違いを意識することなくネットワークに接続されたコンピュータと通信できるようになります。

コンピュータは標準化によって、コンピュータネットワークは便利なものになったわけです。
ゲームっぽい何かを作りながらRubyを勉強する　その２　〜ファイル保存〜

「ゲームっぽい何かを作りながらRubyを勉強する」シリーズ、第２回は入出力ファイルの保存先についてです。

前回、セーブデータを保存する簡単なプログラムを書いてtest-unitで実行するということを試してみました。
実際に動いてファイルが出力されたのは良いのですが、そのままではファイルの出力先がプログラムの実行時のカレントディレクトリ、という残念な感じでした。

今回は、そのファイルの出力先問題を解決すべく、出力ファイルはすべてプロジェクト直下の`data`ディレクトりに保存されるようプログラムを修正してみます。

# シリーズ一覧

* [ゲームっぽい何かを作りながらRubyを勉強する　その１　〜ディレクトリ構成とかtest-unitとかRakeとか〜](http://qiita.com/chooyan_eng/items/c85466d0a744161a5a2e)
* ゲームっぽい何かを作りながらRubyを勉強する　その２　〜ファイル保存〜

# 本文

まず、常に`data`ディレクトリにファイルを保存するためにはどのような要素が必要かを考えてみます。

1. プログラム実行時のカレントディレクトリを取得する
2. カレントディレクトリと`data`ディレクトリ名、ファイル名を連結する。

これだけですね。

では一つずつ見ていきます。

## プログラム実行時のカレントディレクトリを取得する

まず、このプロジェクトの実行は必ずプロジェクト直下と決めておきます。
これによって、プログラム実行時のカレントディレクトリを固定し、そのパスをプログラム中で取得することで、どのプログラムファイルから実行されても同じ場所にファイルを保存できるようにします。

プログラム中でカレントディレクトリを取得するには以下のメソッドを使います。

```ruby
Dir.pwd
```

念のため、このメソッドで実際に取得できる文字列がどのようなものか、`irb`を使って確認します。

```bash
$ pwd
/usr/local/workdir/ruby/mygame

$ irb
irb(main):001:0>p Dir.pwd
"/usr/local/workdir/ruby/mygame"
=> "/usr/local/workdir/ruby/mygame"
```

Bashで`pwd`コマンドを実行した時と同じ文字列が取得できますね。

### 参考
[Ruby 2.3.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Dirクラス](https://docs.ruby-lang.org/ja/latest/class/Dir.html#S_GETWD)

## カレントディレクトリと`data`ディレクトリ名、ファイル名を連結する。

さて、`Dir.pwd`でカレントディレクトリが取得できたら、あとは`data`とファイル名を連結していくだけなのですが、この時以下のように単純に`+`で連結するのはイケていないです。

```ruby:
Dir.pwd + '/data/' + file_name
```

パスを区切るための`/`がそれぞれの変数についているのかどうか、そもそも区切り文字は`/`でいいのか（Windowsでは`¥`）など、いろいろと考慮しなければならない点が出てくるからです。考慮しなければならない、ということは懸念点も増え、実装量も増え、バグが生まれる原因になってしまいます。

こんな時、Javaの`Paths`クラスのように、大体の言語は「ファイルパスを組み立てる」ためのAPIが用意されています。Rubyでは`Pathname`というクラスが使えます。

というわけで、先ほどの例を`Pathname`を使って書き直したのがこちらです。

```ruby:
Pathname.new(Dir.pwd).join(DATA_DIR, file_name).to_s
```

`/`も区切り文字も全く使わず、配列だけでパスをすべて表せていますね。これなら環境依存のバグも少なそうです。

### 参考
[Ruby 2.3.0 リファレンスマニュアル > ライブラリ一覧 > pathnameライブラリ > Pathnameクラス](https://docs.ruby-lang.org/ja/latest/class/Pathname.html)

## 結果

以上で、「セーブファイルは常に`data`ディレクトリ内に保存する」という仕組みを実現することができました。
修正後の`save_manager.rb`は以下になります。

```ruby:save_manager.rb
require 'pathname'

module MyGame
  # module for managing game data
  module SaveManager
    DATA_DIR = 'data'

    # save given data into given file at data/
    def self.save(file_name, data)
      File.open(Pathname.new(Dir.pwd).join(DATA_DIR, file_name).to_s, 'w') do |f|
        f.puts(data)
      end
    end
  end
end
```

# まとめ

今回はファイル入出力時のパス指定について調べてみました。
言語に関係なく、ファイルの入出力は実行環境によって結果が変わらないようにするのが重要かと思います。文字列の加算でも動いてしまいますが、マシンのOSが違う可能性のある他の人の環境でもちゃんと動くことを意識することで、より安定したプログラムになるのではないかと思います。

なお、この記事は、以下の時点までの変更を元に書いています。

https://github.com/chooyan-eng/mygame/tree/6292d92bf183126a224e0b3cf51d226116c0fbe4
Chrome拡張でruntime.sendMessageのコールバックがうまく動作しない理由

#状況
Chrome拡張で、content_scripts側からBackgroundPage側へsendMessageした時、コールバックの引数がundefinedになってしまう

#症状
![sendMessage.jpg](https://qiita-image-store.s3.amazonaws.com/0/47220/a887ab2b-53bb-3ba1-e105-1f3bef1d5e62.jpeg)
上図のように、backgroundPageで非同期処理（今回はchrome.tabs.getSelected）を行い、その結果をコールバック関数の引数に入れたいのですが……

``` json:manifest.json
{
    "manifest_version": 2,
    "name": "sendMessage Test",
    "version": "0.1",
    "author": "Tachibana446",
    "description": "hoge",
    "browser_action": {
        "default_icon": {
            "38": "icon_38.png"
        },
        "default_title": "Do it！"
    },
    "permissions": ["tabs", "http://*/*", "https://*/*"],
    "background": {
        "scripts": ["background.js"],
        "presistent": false
    },
    "content_scripts": [{
        "matches": ["https://www.google.co.jp/*"],
        "js": ["content.js"]
    }]
}
```

``` js:content.js
chrome.runtime.sendMessage({
    message: "message"
}, function(response) {
    console.log(response);
    alert(response);
});

```

``` js:background.js
chrome.runtime.onMessage.addListener(
    function(request, sender, callback) {  // 1
        chrome.tabs.getSelected(function(tab) {  // 2
            callback(tab.title);
        });
        // 3
    }
);

```

（chrome.tabs.getSelectedは現在開いているタブを取得する関数です）
上のサンプルは現在のタブのタイトルをアラートダイアログで表示するだけのプログラムですが、実際に実行するとアラートにはundefinedと表示されてしまいます。

#解説
まず、大前提としてjavascriptのなんか引数にfunction渡したりする系のものは非同期なんですね。
その辺を理解していなかったのでなかなかわかりませんでした。

https://developer.chrome.com/extensions/runtime#event-onMessage
そして上のこのページに解説がちゃんとあるんですよね。

>Function to call (at most once) when you have a response. The argument should be any JSON-ifiable object. If you have more than one onMessage listener in the same document, then only one may send a response. This function becomes invalid when the event listener returns, unless you return true from the event listener to indicate you wish to send a response asynchronously (this will keep the message channel open to the other end until sendResponse is called).

>The sendResponse parameter should be a function that looks like this:

>function() {...};

**unless you return true**のところを見てください。とは言え筆者は英語ができないのでざっくりですが、
「この（sendMessageの引数として与えられるコールバック）関数は、値を返した時点で無効になります。非同期の処理を同期的に待つときはtrueを返してください。」
というようなことが書いてあります。
つまり、非同期的な処理を行う前に関数の最後に到達してしまい、値（この場合明示的にreturnされていないのでundef）が返されるのでそこで処理が無効になってしまっていたのです。

具体的に説明しましょう。
先ほどのbackground.jsをご覧ください。
`// 1`のところで、リスナーの匿名関数がスタートします。
`// 2`のところで、getSelected関数（の引数に与えられた匿名関数）が非同期で行われます。
しかし非同期なので、その処理は一旦おいておいて、そのまま`// 3`のところへ行きます。
`// 3`以降、リスナーの関数は続きがないので、ここでリスナーの関数が終了し、既定値（たぶんundefined）が返戻されます。
値が返戻されたので、このリスナー関数は無効になり、待機していた非同期のgetSelectedの引数の匿名関数も処理されません。
そのままコールバックが呼び出されるので、期待していたタブのタイトルを取得できませんでした。

#解決法
公式ドキュメントの通り、明示的にtrueを返してあげましょう。
先ほどの`// 3`のところに`return true`と書くだけです。

``` js:background.js
chrome.runtime.onMessage.addListener(
    function(request, sender, callback) {  // 1
        chrome.tabs.getSelected(function(tab) {  // 2 
            callback(tab.title);
        });
        // 3
        return true;
    }
);
```
vue-onsenui-navigator使ってサーバーに置く際の注意

Vue + OnsenUI開発のテンプレと思われる

https://github.com/argelius/vue-onsenui-navigator

においてnpm run buildで作成されたファイルをApacheなどが動いてるサーバーに配布する際の注意

```vue-onsenui-navigator/config/index.js
    assetsPublicPath: '/',
```

を設定しましょう。

http://hoge/~hoge/
でアクセスできるならば

```vue-onsenui-navigator/config/index.js
    assetsPublicPath: '/~hoge/',
```

って言う感じにしてnpm run buildして配布しましょう。(最初の/重要です)

JavaScript開発慣れてる方なら当たり前なんでしょうが、私はこれで1時間悩みましたので書いておきます～
Visualforce ページで <apex:insert> に対して <apex:define> しなかった時にデフォルトで表示されるものを指定する

# 指定方法

　Visualforce では以下のような書き方でテンプレートに対してデータの埋め込みを行うことができる。

```xml:parent
<apex:page>
  <apex:outputText value="Hello, " />
  <apex:insert name="name" />
</apex:page>
```

```xml:child
<apex:page>
  <apex:composition template="parent">
    <apex:define name="name">Taro</apex:define>
  </apex:composition>
</apex:page>
```

結果
> Hello, Taro

　この方法では基本的に <<apex:define>> を記述しないと <<apex:insert>> の部分には何も出力されない。だが、<<apex:insert>> タグの中に記述を入れると <<apex:define>> を書かなかった時にその記述が採用されるという仕様があるようだ。

```xml:parent
<apex:page>
  <apex:outputText value="Hello, " />
  <apex:insert name="name1">Taro</apex:insert>
  <apex:outputText value=" and " />
  <apex:insert name="name2">Hanako</apex:insert>
</apex:page>
</apex:page>
```

結果
>Hello, Jiro and Hanako

　ただし、この方法は Salesforce の公式ドキュメント上に仕様として記されているものではないことに注意する。
BigQuery Standard SQLで配列内の各要素に対して操作をする方法


以下のような各要素が配列になっているテーブルに対して、配列内の各要素に+1することを考えます。

| arr              |
|------------------|
| [1, 2, 3, 4, 5]  |
| [6, 7, 8, 9, 10] |


単純に以下のようにしてしまうと、ARRAY\<INT64\>とINT64の間で加算ができないというエラーが出てしまいます。

```sql
WITH T AS(
  SELECT [1, 2, 3, 4, 5] AS arr UNION ALL
  SELECT [6, 7, 8, 9, 10]
)
SELECT arr + 1 FROM T
```

なので、一旦、UNNESTしてスカラー型にした後に加算し、それらをARRAYで配列に変換する必要があります。
このようにすれば、問題なく各要素対して+1をすることができます。

```sql
WITH T AS(
  SELECT [1, 2, 3, 4, 5] AS arr UNION ALL
  SELECT [6, 7, 8, 9, 10]
)
SELECT ARRAY(SELECT elem + 1 FROM UNNEST(T.arr) AS elem) AS mapped FROM T
```
# 2016/11/15 追記
yancyaさんからコメントがありましたが、以下のようなUDFを作ると、SQL本体がすっきりして非常に見やすくなります。

```sql
#standardSQL
CREATE TEMPORARY FUNCTION MAP_ADD(ary ARRAY<INT64>, n INT64)
RETURNS ARRAY<INT64> AS ((SELECT ARRAY_AGG(_n + n) FROM UNNEST(ary) AS _n));

WITH T AS(
SELECT [1, 2, 3, 4, 5] AS arr UNION ALL
SELECT [6, 7, 8, 9, 10]
)
SELECT MAP_ADD(arr, 1) AS mapped FROM T
```
plistファイルから配列を取得するスニペット

```swift:plist
guard let plistPath:String = Bundle.main.path(forResource: "FileName", ofType: "plist") else{return}
guard let array: NSArray = NSArray(contentsOfFile: plistPath) else {return}
```

上記のコードで下に示すようなplistから配列を生成できる。

<img width="554" alt="スクリーンショット 2016-11-14 23.10.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/37053/bd4b1847-94c1-c932-8c07-fee06637816a.png">



ソース内に長い配列を含めたくない時に便利。
Dockerを使ってMysql

#やりたいこと
Dockerを使ってDBサーバーを立ててみる
公式のほぼまんま。メモ程度で

#ホスト環境
foderaつかってます

```
cat /etc/redhat-release
```
->Fedora release 24 (Twenty Four)

#DBサーバー
##Dockerfileはとりあえずこんな感じ

（こんなのも必要なさそうだが。。）

```
FROM mysql:latest

ENV MYSQL_ROOT_PASSWORD mrootpass
ENV MYSQL_DATABASE mdb
ENV MYSQL_USER muser
ENV MYSQL_PASSWORD mpass

EXPOSE 3306

```

##buildしてみる

```
docker build -t test/mysql ./
```

##コンテナーを作る

```
docker run --name test -d test/mysql
```

##シェル起動

```
docker exec -it test bash
```

##envで環境変数っぷりを確認

```
env
```

##mysql接続

```
mysql -u muser -D mdb -p
```
※パスワードはmpassを入力

##db確認

```
show databases;
```

mdbが出てくればOK!
##ついでにトランザクションとか試してみる。
てきとーにテーブル作成

```
create table mdb.personal(id int, name varchar(20));
```

テーブル確認

```
show tables;
```

いんさーと

```
insert into mdb.personal(id,name) values(1,'meidaimae');
```

select

```
select * from personal;
```

トランザクション確認。まずは、ロールバック。

```
-- トランザクション開始

start transaction;

-- update
update mdb.personal set name = 'sinjuku' where id = 1;

-- 新宿に変わっている
select * from personal;

-- ロールバック

rollback;

-- meidaimaeになっている
select * from personal;

```

コミット

```
-- トランザクション開始

start transaction;

-- update
update mdb.personal set name = 'sinjuku' where id = 1;

-- 新宿に変わっている
select * from personal;

-- コミット

commit;

-- 新宿になっている
select * from personal;
```

次回はアプリケーションとDBサーバーをリンクさせるつもりです！
APIサーバー作れるようになりたい。。
終わり！
まっさらな環境を渡されて、Ruby on Railsの実行環境を作るまで。



まっさらな環境を渡されて、`Ruby on Rails`（以下RoR）が動くようになるまでの手順の備忘録。

RoRアプリのHello worldまでは書いてないので、そこはご容赦。


##SELinux
RoRとは関係ないけど、こいつが環境構築の邪魔をする事が多々あったので一応。

SELinuxの設定を`disabled`にして、再起動。**（再起動しないと反映されない←超重要）**
https://eng-entrance.com/linux-selinux

##iptable
これもRoRとは関係ないけど、三層構造にするなら必要だよね。
80と443の許可しとかなきゃね

http://andosho.blog.fc2.com/blog-entry-16.html
http://te2u.hatenablog.jp/entry/2013/09/12/215031


##Ruby
https://centos.bungu-do.jp/archives/34

```sh
# Rubyをコンパイルするためのパッケージ群を取得
$ yum install gcc zlib-devel openssl-devel readline-devel libffi-devel

# Rubyをソースからコンパイルするため、ディレクトリ移動→wgetでソースを取得
# 以下の例だと2.4.1を取得
$ cd /usr/local/src
$ wget https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz

# tar.gzを解凍し、中に入る
$ tar zxvf ruby-2.4.1.tar.gz 
$ cd ruby-2.4.1

# OSやCPUなどを調べて、Makefileを作ってくれる魔法の言葉
$ ./configure

# Makefileを基にしてソースコードをコンパイル
$ make

# makeで生成されたバイナリファイルなどを規定のディレクトリにインストール
$ make install

# バージョン確認
$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
```

## Rails
https://qiita.com/tanakayo/items/7b85261924eca1a5a3d6

```sh
# 使用できるRailsのバージョン一覧を取得
$ gem list rails

*** LOCAL GEMS ***

rails (5.1.5, 4.2.8, 4.2.6)

# 該当バージョンがない時は、新規にインストール(以下の例だと5.1.3)
$ gem install -v 5.1.3 rails

# バージョン確認
$ rails -v
Rails 5.1.3
```

## MySQL
基本設定：http://www.s-runoa.com/465
チェック無効化：https://qiita.com/panappe/items/a4fdf8c8646802fceac0
パスワードなし：https://qiita.com/saicologic/items/4c103a399cffa4432635

```sh
# 〜インストールまで

# yumリポジトリからrpmを取得：https://dev.mysql.com/downloads/repo/yum/
# 以下の例では5.7
$ yum install http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

# MySQLのインストール
$ yum install mysql-community-server

# バージョン確認
$ mysql -V
mysql  Ver 14.14 Distrib 5.7.19, for Linux (x86_64) using  EditLine wrapper

# 〜空文字のパスワード設定まで

# 初期パスワードの確認
$ cat /var/log/mysqld.log | grep password
yyyy-MM-ddThh:mm:ss.msZ 1 [Note] A temporary password is generated for root@localhost: PASSWORD

# パスワード変更の厳密チェックを外す
$ vim /etc/my.cnf

# validate-password=OFF
# にコメントアウトが付いてるはずなので、外す
# 付いてなければそのままでOK

# 設定反映のため再起動
$ systemctl restart mysqld.service

$ ログイン(先ほど取得した初期パスワードを使用)
$ mysql -u root -p

$ rootユーザのパスワードを空文字に設定(厳密チェックしないようにしたので通るようになる)
$ use mysql;
$ update user set password='' where User='root';
$ flush privileges;
$ exit

# パスワード変更の厳密チェックを戻す
$ vim /etc/my.cnf

# validate-password=OFF
# にコメントアウトを付ける

# 設定反映のため再起動
$ systemctl restart mysqld.service
```


## Nginx
https://qiita.com/noraworld/items/1aae57dcbe428089c7d5

```sh
# yumリポジトリの設定(先頭の#は外して下さい)
# 設定ファイルに書き出しておくことで、yum installを走らせた時にここを見てくれる
$ vim /etc/yum.repos.d/nginx.repo

#[nginx]
#name=nginx repo
#baseurl=http://nginx.org/packages/centos/7/$basearch/
#gpgcheck=0
#enabled=1

# yumリポジトリを使ってインストール
$  yum --enablerepo=nginx install nginx

# バージョン確認
$ nginx -v
nginx version: nginx/1.12.1
```

## Gem
`gem install`で引っかかったことがあるので備忘録。

引っかかったのは「`nokogiri`」と「`rails`」。

https://teratail.com/questions/92661
https://stackoverflow.com/questions/43971459/in-classnumeric-stack-level-too-deep-systemstackerror
ブランチのプロテクトの設定

ブランチにプロテクトが掛かっていてpushできずにはまったので
画面を次のように進めるとでる。
1. プロジェクトのエディット画面
2. 左のメニューの「protected branches」 

ここでプロテクトされているものに
Developerでもpushできる権限を与えることも可能
CentOS 7.2 で Oracle Database Express Edition(11.2) インストール時の integer expression expected

無料で使えるOracle Database Express Editionを CentOS 7.2にrpmインストールする際、ちょっとしたエラーが出ます。結論から言うと実害はないのですが、原因についてまとめておきます。

# インストールバイナリ
Oracle Database Express Edition 11.2(x86_64)は、Oracleの公式サイトからrpmファイルをダウンロード、インストールすることができます。インストールマニュアルではRHEL4,5がインストール要件となっていますが、一応RHEL7でもインストール・動作させることは可能です。

http://www.oracle.com/technetwork/jp/database/database-technologies/express-edition/downloads/index.html

# 発生事象
必要なパッケージをインストールした上で、Oracle Database Express Editionのrpmファイルをインストールするわけですが、CentOS 7.2のデフォルト設定の場合、「integer expression expected」というエラーが出ます。
<pre>
/var/tmp/rpm-tmp.djOKcn: line 257: [: 18446744073692774399: integer expression expected
/var/tmp/rpm-tmp.djOKcn: line 271: [: 18446744073692774399: integer expression expected
Executing post-install steps...
You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.
</pre>

# 原因
Oracle Databaseは、インストール時に要件となるカーネルパラメータをチェックしています。このエラーは、チェック処理のうちkernel.shmallとkernel.shmmaxの値をチェックする際のエラーです。

RHEL7.2(CentOS7.2)から、kernel.shmallとkernel.shmmaxのデフォルト値に非常に大きな値が設定されるようになったことに起因しています。以下の通り、bashの数値比較で扱える値を超えてしまっています。

<pre>
# sysctl -a | grep kernel.shm
kernel.shmall = 18446744073692774399
kernel.shmmax = 18446744073692774399
</pre>

インストール要件としては、kernel.shmmax=4294967295 kernel.shmall=2097152 よりも大きな値が設定されていること、となっているため、例えばkernel.shmmaxの値をチェックする場合以下のような比較処理になりますが、実際にbashで実行してみると、値が大きすぎてエラーとなることが確認できます。
<pre>
# [ 4294967295 -gt 18446744073692774399 ]; echo $?
bash: [: 18446744073692774399: integer expression expected
2
</pre>

bashの比較で扱えるのは2の63乗-1までで、それ以上はエラーになるようですね。

<pre>
[ 4294967295 -gt 9223372036854775808 ]; echo $? 
bash: [: 9223372036854775808: integer expression expected
2

[ 4294967295 -gt 9223372036854775807 ]; echo $?
1
</pre>

# 対処
OSのkernel.shmmaxとkernel.shmallの値を小さくすればエラーは出なくなります。が、あくまでチェック処理でエラーとなっているだけで、Oracleのインストール要件は満たしているため、デフォルト設定のままでも問題ないと思われます。

# 補足
https://github.com/oracle/docker-images
Oracleが提供しているdocker-imagesを用いて、Oracle Database Express EditionのDockerイメージを作成した際にも同様のエラーがでます。これも、無視して問題ないでしょう。
grubでパーティションの存在に応じて分岐

grubではシェルスクリプトのように、ファイルがある場合分岐するという処理を書くことができます。

```bash
if [ -e /hoge ]; then
  echo "found hoge"
fi
```

しかしながらパーティションが存在する場合分岐したい場合は一工夫必要です。
例えば`(hd0,msdos3)`が存在する場合は以下のように書きます。

```bash
cat (hd0,msdos3)/
if [ $? -ne 12 ]; then
  echo "found (hd0,msdos3)"
fi
```

ポイントは`cat`コマンドを実行して、その終了ステータスコードを利用するところです。
パーティションがない場合は終了ステータスとして`12`が返ってきます。

grubには`ls`コマンドがあり、`ls`コマンドでもパーティションの存在を確認できますが、
結果は標準出力にしか表示されず、終了ステータスコードは常に0なのでスクリプトには使えないです。
個人的に見た目が気に入ってる下線引く方法

自分用メモ


> ![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/92042/8b9065e0-abb6-2f85-b5a1-6dc889ac1837.png)


```HTML:HTML
<p>
    このクラス当てたら、<span class="underline">underlineと違って太さも変えられる</span>し、蛍光ペンみたいで好き。
</p>
```

```CSS:CSS
p span.underline{
    display:inline-block;
    box-shadow:0 -10px 0 -4px rgba(255,0,0,0.4) inset;
    /*             ↑　ここのサイズ変えたら色々 */
}
```
PerlでCSVファイルとかを扱っているときに、splitを使っていると嵌まる罠

皆さんこんにちは。

Perl、使ってますか？
私は今の案件で初めて触ったのですが、半年以上触った今でさえ、使いやすいシェルスクリプト程度にしか使えてないです。

そんなperlを使ってたら`chomp`と`split`のあわせ技でとんでもないことになったので、それを書きなぐってみようと思います。

# split関数と言うもの

perlにはsplit関数というものがあります。PHPとかにもありますが、これは文字列を区切り文字に従って配列に分割する関数です。

```split.pl
use strict;
use warnings;
use utf8;

my $str = 'a,b,c,d,e';
my @arr = split(/,/, $str);

print $_ . "\n" for @arr;
```

```
$ perl split.pl
a
b
c
d
e
```
この関数には実は第３引数があって、文字列をいくつの配列に分割するかを指定するものです。
例えば`split(/,/, $str, 2)`に書き換えてみると、実行結果は以下のようになります。

```
$perl split.pl
a
b,c,d,e
```
この第３引数の数の配列に分けるようです。
第３引数に負の値を入れると、出来る限り分割するようになります。
省略した場合は負の値を入れたのと同じなります。

通常は。

# CSVを処理してみよう
CSVデータをこのsplitで処理してみましょう。
以下のようなデータを用意します。

```data.csv
a,b,,d,e
f,g,h,,
i,,k,,
```
ちょっと足りないデータがありますが、よくあることです。
これを以下のファイルで処理してみます。

```read.pl
use strict;
use warnings;
use utf8;

open(FH, 'data.csv');

while(<FH>) {
    chomp($_);
    my @data = split(/,/, $_);
    print $_ . "\n" for @data;
}
```
ファイルの各行を取り出し、まず改行コードを取り除いた(`chomp`)あと、`,`を区切り文字として配列に分解し、各要素をプリントするという簡単なコードです。
実際に処理してみましょう。

```
$ perl read.pl
a
b

d
e
f
g
h
i

k
```
一見しておかしなところはどこにもなさそうですね。

しかし、よく考えてみましょう。
bとdの間に一行空行がありますが、これはその部分のデータがないためにこのようになっています。
一方、元データ上ではhとiの間に2つのデータが存在していなければなりません。
ということは、hとiの間の少なくとも２つの(空の)配列要素が作られなかったことになります。

# 何が起こっているのか
CSVでは各要素が個別に意味を持っている場合がほとんどのため、例え空の要素であろうとそれがなんの脈絡もなく消し飛んでしまうと非常に困ります。
実際困りましたし。

これの原因はperldocにあります

> If LIMIT is omitted (or, equivalently, zero), then it is usually
            treated as if it were instead negative but with the exception that
            trailing empty fields are stripped (empty leading fields are
            always preserved); if all fields are empty, then all fields are
            considered to be trailing (and are thus stripped in this case).
            Thus, the following:

 >               print join(':', split(/,/, 'a,b,c,,,')), "\n";

 > produces the output `"a:b:c"`, but the following:

 >               print join(':', split(/,/, 'a,b,c,,,', -1)), "\n";

 > produces the output `"a:b:c:::"`.

これを拙いながらも訳してみますと

> LIMIT(第3引数)が省略された場合(もしくはゼロの場合)、大体負の値を指定した場合と同じ挙動を示すのだけど、末尾の空の要素は**削除**されます(戦闘の空の要素は常に保持されます。)。もし、すべての要素が空の場合、全ての要素が末尾として扱われます(そして削除されます)
つまり、以下のようになります

> ```
print join(':', split(/,/, 'a,b,c,,,')), "\n";
```
> これを実行すると`"a:b:c"`となりますが、

>```
print join(':', split(/,/, 'a,b,c,,,', -1)), "\n";
```
これを実行すると`"a:b:c:::"`が得られます

どういうことやねん。。。
末尾の空の要素は削除されると。。。
それはどんどん連鎖的に適用されていくと。。。

この謎仕様を知らないと、splitした際に要素が少なくなったことに気づかず、不気味なバグを生む可能性がありますのでご注意を

# 対応策

末尾に何らかの文字列があった場合は、これは発生しません。
実は、chomp関数を使わず、改行コードをとらなかった場合は**改行コードが末尾の文字列となるため削除されません**。が、普通は行末の改行コードは取り除いておきたいので、chomp関数を使わないというのは対応としてはよろしくありません。

というわけで、split関数の第３引数に-1を指定してあげましょう。

```read.pl
use strict;
use warnings;
use utf8;

open(FH, 'data.csv');

while(<FH>) {
    chomp($_);
    my @data = split(/,/, $_, -1);
    print $_ . "\n" for @data;
}
```
こいつを実行してあげると

```
$ perl read.pl
a
b

d
e
f
g
h


i

k


```
空データの部分も省略せずにプリントされるようになりました。

# まとめ

何でこんな変な仕様なのか。。。
perlの深淵はまだまだ深いのかもしれません。

今回は短いですが、こんなところで失礼します。

# 参考
http://perldoc.perl.org/functions/split.html
http://d.hatena.ne.jp/dayflower/20101105/1288942018
年月日と時分秒が別れたcsvをPOSIXct形式で結合する

年月日と時分秒のセルがわかれたcsvから1つのセルに結合する方法


例えば

| Date       | Time        | Data1 |
|:-----------|:------------|:------------|
| 2017/11/14 | 12:34:12    |     0.333   |
| 2017/11/14 | 12:34:22    |     0.335   |
| 2017/11/14 | 12:34:32    |     0.343   |
| 2017/11/14 | 12:34:42    |     0.363   |

こういうcsvファイルのDateとTimeをまとめたい。

csvをデータフレームで読込み，それぞれをPOSIXctにすると

```r:
as.POSIXct(data$Date)
#[1]  "2017-11-14"
as.POSIXct(data$Time,format="%H:%M:%S")
#[1]  "2017-11-14 12:34:12"
```

こんな感じになり，時分秒には実行した日の日付が入る。
ちなみにPOSIX同士の+演算はできない。

そこで

```r:
#列生成
data$DateandTime <- 0
data$sec <- 0

#Timeを秒にする
data$sec <- difftime(as.POSIXct(data$Time,format="%H:%M:%S"),Sys.Date(),units = "sec") + 32400 
#Sys.Date()は現在日付の9:00:00

data$DateandTime <- as.POSIXct(data$Date) + data$sec

```

POSIXct化したTimeから現在の日付を引く。
ただし，Sys.Date()は9:00:00なので32400sec（9時間）を足す。

その後，Dateとsecを足して日時にする。


他にもっと良いやり方がある気がする。
間に合わせではあるが，解決したので備忘録まで
OpsWorks Instancesで起動したEC2から作成したカスタムAMIをOpsWorks Instancesで利用する際の注意点

#1. はじめに
* OpsWorks Instances で起動した EC2 をイメージ（AMI）化して、それを OpsWorks Instances のカスタムAMIとして利用する際の注意点。
* EC2は、"Amazon Linux 2016.09", "Amazon Linux instance Chef 12 stack", "Amazon EBS-backed" で作成している。
* 下記の作法の通りに作成していないカスタムAMIを利用して OpsWorks Instances で EC2 を起動すると、Status が "running_setup" 中のままとなり、作成が完了しない。

#2. OpsWorks Instances で起動した EC2 から カスタムAMI を作成する
（参考：[本家ドキュメント](http://docs.aws.amazon.com/opsworks/latest/userguide/workinginstances-custom-ami.html) →　"To create a custom AMI from an AWS OpsWorks instance"）
* AMI を作成する EC2 を起動した OpwsWorks Layers の "Auto healing enabled" を "No" へ変更する

* AMI を作成する EC2 へ SSH ログインして、次のコマンドを実行する

```
$ sudo /etc/init.d/monit stop

$ sudo /etc/init.d/opsworks-agent stop

$ sudo rm -rf /etc/aws/opsworks/
$ sudo rm -rf /opt/aws/opsworks/
$ sudo rm -rf /var/log/aws/opsworks/
$ sudo rm -rf /var/lib/aws/opsworks/
$ sudo rm -rf /var/lib/cloud/
$ sudo rm -rf /etc/chef
$ sudo rm -rf /var/chef
$ sudo rm -rf /opt/chef
$ sudo rm -f /etc/monit.d/opsworks-agent.monitrc
$ sudo rm -f /etc/monit/conf.d/opsworks-agent.monitrc

$ sudo rpm -e opsworks-agent-ruby
$ sudo rpm -e chef
```

* OpsWorks のコンパネから、AMI を作成する EC2 インスタンスを停止(Actions:stop)する
↓
Status が stopped となったことを確認

* イメージ（AMI）を作成する

#3. OpsWorks Instance でカスタムAMI から EC2 を起動する CloudFormation の例
```
"Resources": {
    "OpsWorksStack": {
        "Type": "AWS::OpsWorks::Stack",
        "Properties": {
            "Name": "example",
            "ConfigurationManager": {
                "Name": "Chef",
                "Version": "12"
            },
            "VpcId": "vpc-********",
            "DefaultSubnetId": "subnet-********",
            "DefaultInstanceProfileArn": "arn:aws:iam::************:instance-profile/**********",
            "ServiceRoleArn": "arn:aws:iam::************:role/**********",
            "DefaultOs": "Custom",
            "DefaultRootDeviceType": "ebs",
            "DefaultSshKeyName": "aws-tonishy",
            "HostnameTheme": "Layer_Dependent",
            "UseOpsworksSecurityGroups": "false"
        }
    },
    "OpsWorksLayer": {
        "Type": "AWS::OpsWorks::Layer",
        "Properties": {
            "Type": "custom",
            "Name": "example",
            "Shortname": "example",
            "StackId": {
                "Ref": "OpsWorksStack"
            },
            "EnableAutoHealing": "true",
            "AutoAssignPublicIps": "true",
            "AutoAssignElasticIps": "false",
            "CustomSecurityGroupIds": [
                "sg-********"
            ],
            "CustomInstanceProfileArn": "arn:aws:iam::************:instance-profile/**********"
        }
    },
    "OpsWorksInstance": {
        "Type": "AWS::OpsWorks::Instance",
        "Properties": {
            "AmiId": "ami-********",
            "Os": "Custom",
            "StackId": {
                "Ref": "OpsWorksStack"
            },
            "LayerIds": [
                {
                    "Ref": "OpsWorksLayer"
                }
            ],
            "InstanceType": "t2.micro"
        }
    }
}
```

※ AWS::OpsWorks::Instance　の AmiId に、カスタムAMIの id を設定する