OmniAICreator/Qiita-1.07M huggingface dataset:
濾過 in シェル


## 濾過演算とは

UNIX 文化では, パイプやリダイレクトで連結することで組み合わせ可能な, 入力を加工して出力する (比較的) 小さな機能のプログラムのことを総じて「フィルタ(濾過器)」と呼びます.

が,

ここで, 題材にする演算は上記の意味ではありません.
引数を一つとり, 真偽値を返す演算「述語 (predicate)」と, 「データ列」を与えると, データ列のうち「述語」が真を返す要素のみ取り出したデータ列を返すような演算は, 多くのプログラミング言語において, 組み込みで, または, 基本ライブラリで提供される大変汎用的な演算です.

言語によって `filter`, `select` などの名前で提供されています. 本記事では, 便宜的に「濾過演算」と呼びますが, この日本語名称が一般的という訳でもありません.

多くの繰り返し処理は濾過に抽象化されます.

```
a = <新しい空のデータ列>;
for (i = 0; i < <データ列>.長さ; i++) {
  if (<述語>(<データ列>[i])) {
    a.append(<データ列>[i]);
  }
}
return a;
```

のような形の演算は

```
<濾過> <述語> <データ列>
```

のように抽象化できます.

また, 濾過として抽象化すると, データ列全体を読み込んで処理する必要がなく, 非常に大きなデータ列に対してシーケンシャルに処理が可能であるという利点もあります. (実装によりますが, あくまでこの抽象化において原理的には.)

以下

* Ruby の `select`
* JavaScript の `filter`
* Clojure の `filter`

で例示します.

以下の環境で試験しました.

```
% irb --version
irb 0.9.6(09/06/30)

% node --version
v0.10.26

% java -jar clojure-1.7.0.jar
Clojure 1.7.0
user=>
```

### 数値の濾過

数値列中の偶数のみ抽出します.

#### Ruby

```irb:
irb(main):001:0> [3, 1, 4, 1, 5, 9, 2, 6].select{|i| i%2 == 0}
=> [4, 2, 6]
```

#### JavaScript

```js:
> [3, 1, 4, 1, 5, 9, 2, 6].filter(function(i){return i%2 == 0})
[ 4, 2, 6 ]
```

#### Clojure

```clj:
user=> (filter even? [3 1 4 1 5 9 2 6])
(4 2 6)
```

### 文字列の濾過

文字列の列から長さが 3 以上のものを抽出します.

#### Ruby

```irb:
irb(main):002:0> ["May", "I", "have", "a", "large", "container", "of", "coffee"].select{|i| 3 <= i.length}
=> ["May", "have", "large", "container", "coffee"]
```

#### JavaScript

```js:
> ["May", "I", "have", "a", "large", "container", "of", "coffee"].filter(function(i){return 3 <= i.length})
[ 'May',
  'have',
  'large',
  'container',
  'coffee' ]
```

#### Clojure

```clj:
user=> (filter #(<= 3 (count %)) ["May" "I" "have" "a" "large" "container" "of" "coffee"])
("May" "have" "large" "container" "coffee")
```

## シェルで

前置きが長くなりました. 濾過演算を実装する Bourne Shell スクリプトは以下のようになります.

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

f=$1
while read line
do
  set "$line"
  if `eval $f`
  then
    echo $line
  fi
done
```

* 述語は, 第一引数に「引数を一つとり真偽値を返すプログラム」を与えます.
* データ列は, 改行区切りで標準入力から与えられるものとします.

真偽値を返すプログラムは「Bourne Shell の　`if` にとって」の真偽ですので, 終了ステータス 0 で終了が真, 0 以外は偽とします. `if` に対して頻繁に行うように, `test` コマンド(
[MAN page of TEST](https://linuxjm.osdn.jp/html/GNU_sh-utils/man1/test.1.html)) のハードリンクである `[` を使うことで, 多くの場合は目的に適うでしょう.

上記を `filter` として PATH 環境変数に含まれるディレクトリに保存 (または保存したディレクトリを PATH に追加) し, 実行パーミッションを与えてある (`chmod +x filter` してある) ものとして, 以下使い方を例示します.

```sh:
$/bin/sh --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15)
Copyright (C) 2007 Free Software Foundation, Inc.
```

で試験しました.

### 数値の濾過

数値列中の偶数のみ抽出します.

```sh:
$ echo "3 1 4 1 5 9 2 6" | tr ' ' '\n' | filter '[ `expr $1 % 2` -eq 0 ]'
4
2
6
```

### 文字列の濾過

文字列の列から長さが 3 以上のものを抽出します.

```sh:
$ echo "May I have a large container of coffee" | tr ' ' '\n' | filter '[ 3 -le ${#1} ]'
May
have
large
container
coffee
```

お読みいただきありがとうございました.
Googleスプレッドシートで条件付き書式を使って行全体を色付けする

条件付き書式は普通に使うとそのセルを使った条件でしか色付けできなくてその行全体に適用できず不便だと思ってましたがカスタム条件で設定するとできました。

# 設定方法

A4:H50 までの範囲の表で、 F列が "done" だった時にその行を黒塗りにするケース

1. メニュー「表示形式」→「条件付き書式」→「新しい条件を追加」
2. 「範囲に適用」に「A4:H50」を指定
3. セル書式設定の条件で「カスタム設定」
4. **条件に `=($F4="done")` を設定**
4. 書式設定のスタイルをお好みな感じで設定
5. 完了
Homebrewを使ってRictyをインストール

タイトルにもあるようにHomebrewを使用しますので、事前にHomebrewがインストールされていることが前提です。 Homebrewのインストール方法は[こちら][1]から

## 1\.リポジトリ読み込み

<pre>brew tap sanemat/font
</pre>

## 2\.Rictyフォントをインストール

<pre>brew reinstall --powerline --vim-powerline ricty
</pre>

## オプション

<pre>--powerline
</pre>

https://github.com/Lokaltog/powerline のパッチを当てたRicty Regular for Powerline.ttfなどのフォントがインストールされます。

<pre>--vim-powerline
</pre>

https://github.com/Lokaltog/vim-powerline のパッチを当てたRicty-Regular-Powerline.ttfなどのフォントがインストールされます。

 [1]: http://blog.sims625.com/homebrew%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/
【Homebrew】YosemiteにしたらApache+PHPが動かない

MacOSをYosemiteに変更後Apacheを起動しようとしたらこんなエラーが出た。

<pre>httpd: Syntax error on line 117 of /usr/local/etc/apache2/2.2/httpd.conf: Cannot load /usr/local/opt/php53/libexec/apache2/libphp5.so into server: dlopen(/usr/local/opt/php53/libexec/apache2/libphp5.so, 10): Symbol not found: _ap_unixd_config\n  Referenced from: /usr/local/opt/php53/libexec/apache2/libphp5.so\n  Expected in: /usr/local/Cellar/httpd22/2.2.29/bin/httpd\n in /usr/local/opt/php53/libexec/apache2/libphp5.so
</pre>

いろいろ調べたところオプションをつけて再ビルドが必要とのこと。

<pre>brew reinstall php53 --homebrew-apxs
</pre>

その後普通にApacheの起動もできてphpも正常に稼働していることまで確認できました。
ローカルHTMLとメーラーを連動してみる

##はじめに

フレックスを前倒しに使う為、早い時間に出社し、早い時間に帰る
特に早起きに抵抗を感じない私としては、電車の混まない時間に移動出来るのは
非常に便利に使っている制度です。

ところが、大雨、大雪などの天候不順、人身事故による電車遅延などが発生すると
社内に電話が鳴り響き、「出社遅れます」などの電話をとるのは影響の出ない時間に
出社している私となり、その度に関係各所にメールを出すという余計な業務が
増えたのも事実です。

長い前置きすみません、というわけで、メールのテンプレとか作っちゃえばいいんじゃね
となり、最初はメーラーで考えていたんですが、いろいろと構想が広がり
ローカルHTML＋JavaScriptで作成ということになりました。

##mailtoスキーム

最近、ブラウザメールを使っていて、メーラーなんて会社のPCでしか使わなくなったなぁ
などと思いながら、HTMLからメーラーが起動する方法をちゃんと調べてみたところ
mailtoスキームってちゃんとIANAとかに登録されており、[RFC2368](https://tools.ietf.org/html/rfc2368)に規定されていました。

いくつか形式があるのですが、以下の形で、送信する事にしました。
mailto:?to=*{送信先メールアドレス}*&subject=*{タイトル}*&body=*{本文}*


##HTML

とりあえず、作成してみます。

```html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>メール作成</title>
	<style>
		* {font-family: monospace}
	</style>
	<script>
		function init() {
			document.getElementById("createbtn").addEventListener("click", createEmail, true);
		}
		function createEmail() {
			var toaddr = document.getElementById("toaddr").value;
			var subject = document.getElementById("subject").value;
			var body = document.getElementById("body").value;
			location.href = "mailto:?to=" + encodeURIComponent(toaddr)
			 + "&subject=" + encodeURIComponent(subject) + "&body=" + encodeURIComponent(body);
		};
		window.onload = init;
	</script>
</head>
<body>
	<table>
		<tr><td>宛先</td><td><input id="toaddr" type="text" value="サンプル <sample@email.com>" size="50" /></td></tr>
		<tr><td>件名</td><td><input id="subject" type="text" value="○○さん、遅刻" size="50" /></td></tr>
		<tr><td>本文</td><td>
<textarea id="body" cols="50" rows="10">
関係各位

○○さんが、電車遅延により、□□時に出社予定です。

以上
</textarea></td></tr>
		<tr><td colspan="2"<td><button id="createbtn">作成</button></td></tr>
	</table>
</body>
</html>
```

単純に、「宛先」「件名」「本文」を取得し、「mailto」スキーマに流しこむだけの
簡単なサンプルです。

##さいごに
今回はここで終わりとしますが、「件名」や「本文」の「○○」部分を置換できないかなぁとか
履歴とか残せないものかなぁと悩むわけです。

この記事に需要があるとは思えないわけですが、まずはここが起点だったので投稿してみました。

つづく
pythonで、変数名として使っちゃいけない33の文字列達

こんな感じの順番でいきます。

1. 使っちゃいけないものを列挙
2. 使っちゃいけないものをターミナルから知るには？
3. 使いたい変数名が使えるかどうかを確認するには？

#まずは、使っちゃいけないもの達を列挙

はじめに書いておきますが、覚える必要は無いです。使った時には「invalid syntax」とエラーが出ます。ただ、一回くらいみておいても損はないのでは？
1.  False
2.  None
3.  True
4.  and
5.  as
6.  assert
7.  break
8.  class
9.  continue
10. def
11. del
12. elif 
13. else
14. except
15. finally 
16. for
17. from 
18. global
19. if
20. import
21. in
22. is
23. lambda
24. nonlocal
25. not
26. or 
27. pass 
28. raise 
29. return
30. try
31. while
32. with 
33. yield


#どうやって呼び出す？

以下のコードを実行したらリスト型で一覧になってでてきてくれます。

```test.py
import keyword
keyword.kwlist
```

#変数名が使えるかどうか確認するには？
以下のコードを実行したらBoolean型で値が帰ってきます。注意したいのは、**Trueが使えない**という点です。


```
import keyword

keyword.iskeyword('def') #True
keyword.iskeyword('bag') #False

```

シンプルなメモ書きですが、大きいシステム開発には以外と大切？？
SpringのPageでのいろいろな数字の取り方について

# 概要
SpringでPageを使うとき、今、何ページ目だとか、何件中何件を表示していますだとか、そういった情報を出すときに、どれを見れば良いのかとわからなくなり、調べるので、それ用のまとめ。

# methods
<img width="530" alt="search.png" src="https://qiita-image-store.s3.amazonaws.com/0/36604/6cb0f74d-1f1e-dd70-350a-e68a1eb4c3d2.png">
<img width="332" alt="gooogle.png" src="https://qiita-image-store.s3.amazonaws.com/0/36604/107e5cec-3289-fc8d-150c-3fdc8dd13d22.png">

| method名 | やること | 例 |
|:-----------|:-------|:------------|
| getNumber() | 現在何ページ目にいるかを返す | goooooogleの何番目にいるか |
| getNumberOfElements() | いくつの要素があるかを返す |  一ページにいくつの検索結果があるか（最終ページ以外はgetSizeと同じ） |
| getSize() | いくつの要素をページで持つか | 一ページでいくつの要素を返せるか（googleだと10件ずつ） |
| getTotalPages() | 総ページ数を返す |  gooooooogleが何ページあるのか |
| getTotalElements() | 全要素数を返す | googleでは検索結果のトータル数を返す |


# reference
http://docs.spring.io/autorepo/docs/spring-data-commons/1.6.1.RELEASE/api/org/springframework/data/domain/Page.html
c++ builder / pop before smtp > SSL library not found > ssleay32.dll / libeay32.dll が必要

```txt:動作確認
Windows 7 Embedded
```

## 症状

Pop before smtpのソフトをC++ Builder XE4を使用しているWindows 7 Pro(64bit)で動作した時には正常動作した。
Embeddedで動かした時にpop接続時に以下のようなエラーが出た。

> SSLライブラリが見つかりません。

検索で以下を見つけた。
http://stackoverflow.com/questions/6683127/delphi-idhttpssl

- ssleay32.dll
- libeay32.dll

これらのファイル(OpenSSL import libraryという記載を見つけた)が必要のようだ。

自分の環境で検索すると以下のフォルダでssleay32.dllが見つかった。

- CollabNet (C:\Program Files)
- subversion(C:\Program Files\Embarcadero\RAD Studio...)
- Skitch (C:\Program Files\Evernote)

以下でも失敗した。

```
Windows 8.1 pro(64bit)
```

## 解決策

http://docwiki.embarcadero.com/RADStudio/XE8/ja/OpenSSL
> OpenSSL を 32 ビットまたは 64 ビット Windows にインストールするには、お使いのファイル システムにダイナミックリンク ライブラリ ファイル libeay32.dll および ssleay32.dll をコピーする必要があります。

２つのファイルを実行ファイルと同じフォルダにおいているとメール送信が成功した。

あとはこれらのファイルの置き場所を検討することになる。
XenからKVMへのゲストイメージ変換

RedHatがRHEL6系から仮想化ソフトウェアがXenからKVMに変更されたため
古いサーバで動作しているゲストOSを、KVMに変換しつつホストOSを引越しする。

旧ホスト（CentOS5）から新ホスト（CentOS7）へ移行する手順。

参考サイトに情報があったが、多少変わっている部分もあったので手順を載せておく。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Virtualization_for_Desktops/2.2/html/Administration_Guide/virt-v2v-scripts.html
http://blog.tsunokawa.net/entry/20111109/p1
https://blog.tnmt.info/2010/02/08/migrate-vm-xen-to-kvm-on-centos5/


### 旧ホスト（Xen）作業　「CentOS5」

#### 1.ミドルウェアインストール

Xenで動作しているゲストOSに、インストールしておく。

```
yum install kernel grub
```

#### 2.設定の変更

この設定を行った後シャットダウンすると、Xen側では起動しなくなるので注意。

`vi /boot/grub/grub.conf`

```
kernel /vmlinuz-2.6.18-238.el5xen ro root=/dev/VolGroup00/LogVol00 consoole=xvc0
↓
kernel /vmlinuz-2.6.18-238.el5xen ro root=/dev/VolGroup00/LogVol00 consoole=xvc0 console=ttyS0,115200n8
```

`vi /etc/inittab`

```
co:2345:respawn:/sbin/agetty xvc0 115200 vt100-nav
↓
co:2345:respawn:/sbin/agetty ttyS0 115200 vt100-nav

（もしくは追記）
```

`vi /etc/securetty`

```
ttyS0

（追記）
```

#### 3.定義ファイルの出力

`virsh dumpxml VM名 > /tmp/VM名.xml`

以上の３点を行い、ゲストOSをシャットダウンさせたら
xmlファイル、imgファイルを新ホストにコピーする。
（imgファイルを退避させる場所があれば、１台のサーバで新OSをインストールし直して移行する事も出来る）

### 新ホスト（KVM）作業　（CentOS7）

CentOS7をインストールする時に、パッケージ「仮想化」をインストールしておく。

#### 1.ストレージプールの作成

作成する

```
virsh pool-create-as default --print-xml dir null null null null /var/lib/libvirt/images > default.xml
virsh pool-create default.xml
```

確認する

```
virsh pool-list
```

#### 2.イメージのコンバート

旧OS側で作成した、xmlファイルを編集しておく。

- 新ホスト側のimgファイルのパスに変更する
- brigeの名前を変更する（xenbr0→virbr0など）

```
virt-v2v -v -x -i libvirtxml VM名.xml -os default
```

コンバートが終わったら起動するはず。

`virsh start VM名`
`virsh console VM名`
mysql.sockのパーミッション

## 現状確認

> ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)

```bash:権限を確認
$ ls -l /var/lib/mysql/mysql.sock
srwxr-xr-x 1 mysql mysql 0  1月 26 10:28 2016 /var/lib/mysql/mysql.sock
```

* 上記の状態ではmysqlユーザからのみmysql接続可能。

## 解決方法1

* mysqlグループに追加、書き込み権限付与

```bash:
chmod g+w /var/lib/mysql/mysql.sock
```

* この方法だとmysqlグループに属しているユーザからアクセス可能。

## 解決方法2

```bash:
chmod 777 /var/lib/mysql/mysql.sock
```

* これで一般ユーザやapache(php+mysql)などから接続ができる。

## その他面白そうな読み物

* [MySQL Reference Manual for version 3.22.21. - 18 問題とよくあるエラー](http://www.mysql.gr.jp/Manual/mysql-3.22.21/manual.ja_Problems.html)
ChoregrapheでPepperを初期化する方法（工場出荷時に戻す）

**(2016/01/26時点)**

・【ChoregrapheでPepperを初期化する方法（工場出荷時に戻す）】
------------------------------------------------------------------

なんらかの問題でご使用のPepperを初期化しなければならない場合には、Choregrapheという開発ツールを用いて作業を行う必要があります。

[初期化の手順](http://www.softbank.jp/robot/consumer/support/trouble/reset/)の手順はこちらを参考にして下さい。

基本的には上記サイトの手順に従えば基本的には問題なく初期化が行えると思います。

ただ、上記のサイトに記載されている以下の画像の場所に初期化に使用するためのシステムイメージのが見当たらない・・・・。

![fig_main.png](https://qiita-image-store.s3.amazonaws.com/0/41775/52ed2e33-910b-0755-c2b7-3ef5536001a0.png)


そのため、サポートセンターから連絡をいただいたリンク先をここに転記しておきます。

システムイメージのダウンロード先が見当たらない場合は、[こちらから「pepper-atom-system-image-2.4.2.26」のダウンロード](https://community-static.aldebaran.com/resources/2.4.2.26/images/pepper-atom-system-image-2.4.2.26_2015-10-21.opn)をしてみて下さい。


以上、参考まで。
Macでmodern.IEからダウンロードしたVirtualBox用Microsoft EdgeのVMのzipが解凍できず、.zip〜.cpgzの無限ループになる問題の解決法

いつも忘れるのでメモ

# 現象
.zip => .cpgz => .zip ...の拡張子を変えただけのファイル生成が繰り返され、一向にVIrtualBox用ファイルが取り出せない。

# 再現手順
1. VirtualBox用Microsoft EdgeのVMを[Virtual Machine (VM), Windows Virtual PC &amp; BrowserStack : Microsoft Edge Dev](https://dev.windows.com/en-us/microsoft-edge/tools/vms/mac/)(旧modern.IE、今は特に名前が無くなった)からダウンロードする。
2. .zipをダブルクリックで解凍すると.cpgzが生成される。
3. .cpgzをダブルクリックで解凍すると.zipが生成される。2へ戻る

# 解決方法
ターミナルでp7zipをインストールし、解凍

```
brew install p7zip
7z x Microsoft\ Edge.Win10.For.Windows.VirtualBox.zip 
```

# 検証環境
OS X EI Capitan バージョン10.11.2


# 参考
- [無限zip〜cpgzをTerminal（7-Zip）で解凍（Mac, OSX）](http://jp.kumi-log.com/entry/2014/11/27/zip-cpgz-and-p7zip)
Spring Bootアプリケーションのバージョン情報を外部から確認したい

動作しているSpring Bootアプリのバージョンが何かを外部から確認したい場合がありますが、infoエンドポイントで簡単にバージョン情報などを返すことができます。

今回のサンプルコードは[u6k/sample-display-version](https://github.com/u6k/sample-display-version)にあります。

<!-- more -->

## infoエンドポイントにアクセスしてみる

spring-boot-actuatorを有効化しただけの状態でinfoエンドポイントにアクセスすると、`200 OK`が返ってはきますが、ボディは空JSONになります。

```
$ curl -v http://localhost:8080/info
> GET /info HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.45.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< X-Application-Context: application
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Mon, 25 Jan 2016 08:21:37 GMT
<
{}
```

## 設定ファイルにinfoで返す値を記載する

infoエンドポイントで返す値は、`application.properties`に`info.`で始まるプロパティを記述することで設定できます。`maven-resources-plugin`で`pom.xml`のプロパティで`application.properties`を置換することで、アプリ名やバージョン情報をinfoエンドポイントで返すことが出来ます。

`application.properties`に以下を記載します。

```
info.name=${project.artifactId}
info.version=${project.version}
```

先程と同様にinfoエンドポイントにアクセスすると、今度はアプリ名とバージョン情報が返ることが確認できます。

```
$ curl -v http://localhost:8080/info
> GET /info HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.45.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< X-Application-Context: application
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Mon, 25 Jan 2016 08:26:15 GMT
<
{"name":"sample-display-version","version":"1.0-SNAPSHOT"}
```
{biOps} 画像のフィルタ操作

{biOps}インストールについては[前々回](http://qiita.com/kilometer/items/772e355b19ac810f71a6)を参照。

サンプル画像については[前回](http://qiita.com/kilometer/items/4f48bd50dd47cf6724c7)を参照。
ただし、今回はノイズが多めに載ってます。
[0, 90]の一様乱数。他は前回と同じ。

# ガウシアンフィルタ

結果から。
![gaussfilter_1.png](https://qiita-image-store.s3.amazonaws.com/0/92401/01584d43-a8f7-6f44-95f5-9c6926d805b1.png)
順調に背景ノイズが緩和されています。
が、細い線はブロードになります。


{biOps}では、

```r
imgConvolve(imgdata, mask)
```

として、maskの中にフィルタをmatrixで書く。
Gaussian filterの事は、[この素晴らしいページ](http://imagingsolution.blog107.fc2.com/blog-entry-165.html)に全て書いてあります。
要するに、ノイズはシグナルに比べて高周波でバラバラと入るわけだから、その成分をカットすれば良いという発想です。

Rで書くには、

```r
# これはσ ≒ 1.0の時
a <- c(1,4,6,4,1)
b <- NULL
for(i in 1:length(a)) b <- cbind(b, a*a[i])
fill_Gauss <- b/sum(b)

imgConvolve(imgdata, fill_Gauss)
```

という感じでゴリ押しで書けばよいだけ。

{biOps}では、

```r
plot(imgdata)
```
で、勝手に絵が出ます。


# 微分フィルタ

別にどうということもなく、ですが。
Y軸方向微分ですと、

```r
fil_y1 <- matrix(rep(c(-1,0, 1), 3), 3)
fil_y2 <- matrix(rep(c( 1,0,-1), 3), 3)
```
の2種類があるわけです。

```r
byrow=T
```
とすればX軸方向になりますね。


```r
y1  <- imgConvolve(dat, fil_y1)
y2  <- imgConvolve(dat, fil_y2)
y12 <- imgAdd(y1, y2)
```
という感じにすると、
![y_filter1.png](https://qiita-image-store.s3.amazonaws.com/0/92401/5ccd61b7-8066-796c-7803-edcdb7de0df8.png)

で、これをX軸にもやって、mergeするわけです。
![xy_filter.png](https://qiita-image-store.s3.amazonaws.com/0/92401/d2d5d881-88cf-133e-e6cc-7e97c3987b1e.png)

ふむ、で、最初にGaussian filter(σ≒1.3)をかけておくと、
![xyGau_filter.png](https://qiita-image-store.s3.amazonaws.com/0/92401/3af541cf-2c5a-6a56-84d9-66aa6cf1fbc2.png)

最後に、これ。
オリジナル、splineで3x3に拡張補間、Gaussian filter(σ≒1.3)、差分。
![xy_sp_Gau_filter.png](https://qiita-image-store.s3.amazonaws.com/0/92401/665df5d4-023f-1c4c-52a7-b2fa6cd6ba58.png)


# Canny Edge ditector
まぁ、出来合いのを使えばサクッと。

```r
dat <- readTiff("hoge")
dat3 <- imgScale(dat, 3, 3, interpolation="spline")
dat_Canny <- imgCanny(dat3, sigma=1)
```
![canny1.png](https://qiita-image-store.s3.amazonaws.com/0/92401/2bd146f3-a176-6ed4-4ea5-3701caace220.png)

Cannyフィルタは、Gaussianフィルタを掛けて差分をとって、二値化をする。
この二値化がやたら凝っていて、ちゃんとエッジになるらしい。
詳しくはグーグる。

このsigmaは、Gaussのsigmaなので変えると輪郭も変わる。

```r
par(mar=c(0,0,0,0), mfrow=c(4,4))
for(sigma in seq(0.5, 2, by=0.1)){
  dat_Canny <- imgCanny(dat3, sigma=sigma)
  plot(dat_Canny)
}
```

![canny2.png](https://qiita-image-store.s3.amazonaws.com/0/92401/7f769693-fc4c-3f76-2b68-c005675a2f28.png)

という事で、最後までゴリ押しでした。

{EBImage}については、まぁ、そのうちに。
勉強会JS編＜2＞ クライアントサイドMVCフレームワーク


## 関連記事

* [勉強会JS編＜1＞ オブジェクト指向言語としてのJavaScriptを理解](http://qiita.com/park-jh/items/1887d87f33474cf7d733)
* 勉強会JS編＜2＞ クライアントサイドMVCフレームワーク
* [勉強会JS編＜3＞ フロントエンド開発環境構築](http://qiita.com/park-jh/items/319cacc28850c9fd4898)
* [勉強会JS編＜4＞ yeoman + backbone.model + grunt](http://qiita.com/park-jh/items/78bc01b93fe6d4167624)
* [勉強会JS編＜5＞ yeoman + backbone.collection + backbone.localStorage](http://qiita.com/park-jh/items/49fefe30cdf57de7b6f0)
* [勉強会JS編＜6＞ yeoman + backbone.view](http://qiita.com/park-jh/items/44fb4faac997c71201a0)
* [勉強会JS編＜7＞ yeoman + backbone.router](http://qiita.com/park-jh/items/8f7d4275279201d5796b)
* [勉強会JS編＜8＞ yeoman + backbone.js 実践 - その１](http://qiita.com/park-jh/items/bad19e1c6b502ef0d0fa) 
* [勉強会JS編＜9＞ yeoman + backbone.js 実践 - その２](http://qiita.com/park-jh/items/55d62bc58b94b12835c3)

## 背景

### アプリケーションの変遷

* スタンドアロンアプリケーション
  - Webアプリケーションではなく、スタンドアロン環境で動くGUIアプリケーション。
  - クライアント・サーバ方式（多数のスタンドアロンアプリケーションがDBサーバとSQLで通信）
* シンプルWebアプリケーション
  - サーバ側でのプログラミングを中心にしたWebアプリケーション
  - 画面遷移とGUIの状態を一致させることで、状態を意識しないプログラム実行環境が実現
  - HTMLのGUI部品により、表現力や操作性はスタンドアロンアプリケーションに比べて低下したが、アプリケーション開発の生産性は大きく向上
* リッチWebアプリケーション
  - リッチなGUIを持つWebアプリケーション
  - 画面遷移はほとんどない。
  - 裏でサーバと通信する必要があるデータだけリアルタイムでやりとりしたり、リッチなモーダルダイアログを表示する。
  - GUI制御のプログラムをJavaScriptで書く必要がある。

### 複雑化するクライアント側のJavaScript

* jQueryによってAjaxやDOM操作によるページの更新が簡単になったが、増大していくコードを管理する仕組みは提供していない。
* 大規模なアプリケーションのコードを管理しやすくするためフレームワークが必要になる。

## クライアント側フレームワークの種類

* React.js
* Angular.js
* Angular.js 2.0
* Backbone.js
* Vue.js
* Mithril.js
* Aurelia.js
* Knockout.js
* Ember.js
* Riot.js
* Ractive.js

## Backbone.js

JavaScriptをより良く構造化するためのフレームワーク

### Backbone.jsを使っているところ

* Hulu(http://www.hulu.jp)
* Bitbucket(https://bitbucket.org)
* Disqus(http://www.disqus.com)
* Airbnb(https://www.airbnb.jp)
* Trello(https://trello.com)
* Wantedly(https://www.wantedly.com)
* schoo(http://schoo.jp)
* Sumally(https://sumally.com)
* connpass(http://connpass.com/highlight)
* miil(http://www.miil.jp)
* http://backbonejs.org/#examples

### 機能

* Key-Value型のデータとカスタムイベントを持つモデル
* 複数のモデルをリスト化し、リストを操作するAPIが整ったコレクション
* HTMLの描画とイベントハンドリングを担当するビュー
* サーバとJSON（JavaScript Object Notation）をやりとりするRESTfulインタフェース

### 主要なクラス

* Backbone.Model
    - Key-Value型のデータ構造
    - 通常JSON APIを通じてサーバから受け取ったものを扱う。
    - データを処理するための各種メソッドが実装
    - サーバサイドとデータのやりとり
    - データ更新にカスタムイベントを発火するなど
* Backbone.Collection
    - 一連のモデルを扱うためのクラス
    - コレクションはモデルを配列のようにグループ化して保持する。
    - モデルの追加・削除
    - サーバからまとめてモデルを取得
* Backbone.View
    - モデルに格納されたデータを表示するためのクラス
    - HTMLを描いたり、モデルの更新やDOMのイベントを監視してHTMLを更新する。
* Backbone.Router
    - URLのハッシュフラグメント（#以降）を管理するためのクラス
    - 特定のページや状態をハッシュフラグメントに対応させて管理することで、ユーザがブックマークしたりパーマリンクで共有するようになる。

## 参考書籍

* JavaScript徹底攻略
* JavaScriptエンジニア養成読本
AWS SDKv2 Ruby CloudSearch

# AWSのSDKv2でCloudSearchを操作しよう(Ruby) 
## バージョン2の注意点
Module名がAWSではなく、**Aws**


# 接続設定
## 定義系 インデックス作成や辞書登録など
[CloudSearch::Client] (http://docs.aws.amazon.com/sdkforruby/api/Aws/CloudSearch/Client.html) 

```rb
    client = Aws::CloudSearch::Client.new(
      access_key_id: [AccessKey],
      secret_access_key: [SecretAccessKey]
    )
```

## 検索系
[CloudSearchDomain::Client] (http://docs.aws.amazon.com/sdkforruby/api/Aws/CloudSearchDomain/Client.html) 

```rb
    client = Aws::CloudSearchDomain::Client.new(
      endpoint: [Endpoint]
    )
```
自分用Gitデーモン作成

#Gitリポジトリの作成

##Gitリポジトリ用のフォルダ作成
```
$ mkdir sample.git
```

##空のGitリポジトリを作成
```
$ cd sample.git
$ git init --bare --shared=true
```

- --bareオプション
bareリポジトリ (作業ディレクトリを持たないリポジトリ) を作成する。
参考：[ベアリポジトリとノンベアリポジトリ：理論編〜GitでWordpressのテーマを管理](http://www.nekotricolor.com/entry/theory-of-bare-and-non-bare-repository-manage-wordpress-themes-with-git)

- --shared=trueオプション
リポジトリを共有するための設定

##Gitの公開設定
```
$ touch git-daemon-export-ok
```
git-daemon-export-okファイルを作成
認証なしで公開するための設定

##Gitデーモンの起動
```
$ git daemon --export-all --enable=receive-pack
```
デーモンの起動
Nodejs & raspberry pi でLEDをチカチカさせる

1．Nodejsをインストールします。

Nodejsのインストーラーをダウンロードする

```
$ wget https://s3-eu-west-1.amazonaws.com/conoroneill.net/wp-content/uploads/2015/02/node-v0.12.0-linux-arm-pi.tar.gz
```

ダウンロードしたファイルを解凍させる。

```
$ tar -zxvf node-v0.12.0-linux-arm-pi.tar.gz
```

解凍したフォルダの中身をすべて/usr/local/に移動させます。これでNode.jsが使用できる状態になります。

```
$ cd node-v0.12.0-linux-arm-pi
$ sudo cp -R * /usr/local/
```

Nodejsが使えるかどうか確認する。

```
$ node -v
v0.12.0
```

2．LED点滅するコード

ledというフォルダを作成

```
mkdir led
```

onoffのモジュールをインストール

```
npm install onoff --save
```
index.jsファイルを作成

```
touch index.js
```

index.jsに制御コードを書き出す。

```js
var Gpio = require('onoff').Gpio,
led = new Gpio(18, 'out');
// 1秒点滅
var iv = setInterval(function(){
led.writeSync(led.readSync() === 0 ? 1 : 0)
}, 1000);

// 10秒後点滅LEDをストップさせる。
setTimeout(function() {
clearInterval(iv); // 点滅LEDをストップ
led.writeSync(0); // LEDをOFF
led.unexport(); // GPIOポートを解放
}, 10000);
```

書いたコードを実行する。

```
node index.js
```
rbenv で Ruby2.1.2 がインストールできなかった話

# なにが起きたの？
[lodge](http://qiita.com/m-yamashita/items/d6f64db461acd54095f7)を使ってみようと思い、`Ruby`と`Rails`をインストールしたのだが、
`Ruby2.2.x`ではエラーが出るとの[情報](http://qiita.com/shu920921/items/1cc92f2958ff13602781)を発見。
既に`Ruby2.2.3`をインストールしてしまっていたので、`Ruby2.1.2`をインストールしようとしたところ。。。


```shell-session
[root@lodge lodge]# rbenv install 2.1.2
Downloading ruby-2.1.2.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/f22a6447811a81f3c808d1c2a5ce3b5f5f0955c68c9a749182feb425589e6635
Installing ruby-2.1.2...

BUILD FAILED (CentOS 6.7 using ruby-build 20151028-11-gbd22205)

Inspect or clean up the working tree at /tmp/ruby-build.20151125183251.20710
Results logged to /tmp/ruby-build.20151125183251.20710.log

Last 10 log lines:
installing rdoc:              /opt/rbenv/versions/2.1.2/share/ri/2.1.0/system
installing capi-docs:         /opt/rbenv/versions/2.1.2/share/doc/ruby
The Ruby readline extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
Try running `yum install -y readline-devel` to fetch missing dependencies.

Configure options used:
  --prefix=/opt/rbenv/versions/2.1.2
  LDFLAGS=-L/opt/rbenv/versions/2.1.2/lib
  CPPFLAGS=-I/opt/rbenv/versions/2.1.2/include
```

# 解決策
**下記メッセージにあるように`readline-devel`をインストール**

```shell-session
ERROR: Ruby install aborted due to missing extensions
Try running `yum install -y readline-devel` to fetch missing dependencies.
```

```shell-session
[root@lodge lodge]# yum install readline-devel
```

**再度、`Ruby2.1.2`のインストールを実施**

```shell-session
[root@lodge lodge]# rbenv install 2.1.2
Downloading ruby-2.1.2.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/f22a6447811a81f3c808d1c2a5ce3b5f5f0955c68c9a749182feb425589e6635
Installing ruby-2.1.2...
Installed ruby-2.1.2 to /opt/rbenv/versions/2.1.2
```

**現在どのバージョンのRubyが使用されているか確認**

```shell-session
[root@lodge rails]# rbenv versions
  system
  2.1.2
* 2.2.3 (set by /opt/rbenv/version)
```

**インストールした`Ruby2.1.2`に切り換える**

```shell-session
[root@lodge rails]# rbenv global 2.1.2
```

**切り替わっているか確認**

```shell-session
[root@lodge rails]# rbenv versions
  system
* 2.1.2 (set by /opt/rbenv/version)
  2.2.3
```

### でけた！
Rails + Capistrano 3 でデプロイ日時を取得

初めに
------

アップデートサイクルが早いWebアプリでは、ときどきデプロイ日時を取得したいときがあります。特に身内で使っているものに関しては。Railsそのものにはデプロイ日時を記録する機構はないですが、Capistranoにタスクを追加することで、簡単にデプロイ日時を取得できます。

Capistranoにタスクを追加
------------------------

デプロイ時の時刻をファイルに記録する処理を、`:publishing` タスクの after に登録します。`deploy:update_deployed_date` というタスクを追加して、`web` role の、プロジェクトのルートに `last_deploy` というファイルをtouchします。touch時にファイルのatimeとmtimeが現在時刻に更新されるので、Railsアプリ側からはこのファイルのatimeまたはmtimeを読み取ることで、デプロイ時の日時を取得できます。

```rb:config/deploy.rb
namespace :deploy do
  desc 'Update deployed date'
  task :update_deployed_date do
    on roles(:web) do
      execute :touch File.join(current_path, "last_deploy")
    end
  end
  after :publishing, :update_deployed_date
end
```

Railsアプリ側の設定
-------------------

Railsアプリ側では、プロジェクトのルートにある`last_deploy`ファイルのatimeをinitializersで取得します。

```rb:config/initializers/deployed_date.rb
Rails.application.config.deploied_at = begin
  last_deploy_path = Rails.root.join("last_deploy")
  File.new(last_deploy_path).atime
rescue
  nil
end
```

これでRailsアプリ内のどこからでも `Rails.application.config.deploied_at` からデプロイ日時を取得できます。ただこれだとviewに`Rails`オブジェクトを参照するコードを書くことになり若干つらいので、ヘルパメソッドに記述します。

```rb:app/helpers/application_helper.rb
module ApplicationHelper
  def deploied_at
    begin
      Rails.application.config.deploied_at.strftime("%Y-%m-%d")
    rescue
      nil 
    end 
  end 
end
```

```erb:app/views/layouts/application.html.erb
<p>Deployed on <%= deploied_at %></p>
```

おわりに
--------
この記事を書いてから調べてわかったのですが、Capistranoの `release_name` メソッドでリリース日時を `"%Y%m%d%H%M%S"` で取得できるんですね．．．

参考
---- 

* [Last deployment date with Rails and Capistrano | Ruby Fleebie](http://www.rubyfleebie.com/last-deployment-date/)
* [Capistrano Variables | theAdmin](http://blog.44uk.net/2012/04/06/capistrano-variables/)
wordpressインストールディレクトリではなく、独自ドメイン直下でアクセスできるようにする

sakuraサーバにWPをインストール（/wp/等のサブディレクトリに）
独自ドメイン取得
独自ドメイントップに表示させたい

#サブディレクトリにインストールしたWordPressをルートディレクトリ表示に変更（さくらインターネット編）
http://www.nishi2002.com/4718.html
#サブディレクトリ(/wp/)にインストールしたwordpressをドメイン直下に表示する方法【ルートディレクトリを変更】(kawatama.net)
http://kawatama.net/web/974

http://itstudio.co/2015/09/09/4696/
pythonで、無駄がなく、すごく省エネなオブジェクトの保存方法にびっくりした話

#びっくりした話

以下のように記述した際、aとbは全く同じオブジェクト(ここでは２)を指しているらしい。

```
a = 2
b = 2
```

全く同じ。英語で言うと*"the same object"*。色々と疑問が生じたので調べてみた。
まずは、疑問を箇条書きにしてみます。

1. 同じところを指してたらaを変更した時に、bも変わっちゃわない？
2. てかそれ本当なの？


#疑問１：書き変わらない？

これはよく考えれば、[一個前の記事](http://qiita.com/KanChin/items/58307237c6148ec3f4ba)で調べてた内容でした。

簡単にまとめると、

```
全く同じオブジェクトが既に存在している場合には、
メモリの節約のために、その同じオブジェクト参照する。

同じオブジェクトが存在しなければ、新しく作成される。
```
つまり、```a=3```と新しく入力された場合、新規にオブジェクトを作成する。そして、```b=2```はそのまま保存される、というところでしょうか。

もちろん初心者のメモ書きなので、根本的な部分ではもっと複雑なことが起こってるのでしょうが、この定義でも矛盾なく説明できるので、とりあえずこのまま進んでみます。

#疑問２：本当かどうか確かめる（id関数の使用）

本当かどうか確かめるために、メモリ空間のアドレスと言われるものを直接見られるid関数を使って見る。

id() について調べてみると分かるのですが、どうやら識別値を戻り値とするようです。つまり、同じオブジェクトを指していれば、戻り値は同じで、違うものであれば、戻り値も違うってことですね。

では、本題の***本当に一緒***のものなのかを調べていきます。

```lang:test.py

a = 2
b = 2

id(a) #4401166416

id(b) #4401166416

id(a) == id(b) #True 数字を見るのが面倒なので==使ってみた。

```

どうやら本当らしい。つまり、オブジェクトが新しく生成される時のルールは以下の通りになっているんだろう。

まだ疑い深いKanChinは新しく```c=3```を定義して、もう一回実験をしてみた。

```lang:test.py
c = 3 

id(c) #4401166448

id(a) == id(c) #False 

#この後、aを３に書き換えてcと同じになるか確かめる。

a = 3

id(a) #4401166448

id(a) == id(c) #True

```
と見事一緒になりました。つまり、
```
同一のオブジェクトが存在してれば、
新しいオブジェクトは作られない。
```

みたいですね。（※追記にて、一部訂正あり）

何の役に立つかわからないけど、内容的には不思議で面白いですねぇ

#追記

##[yuba](http://qiita.com/yuba)さんより

>このような設計手法のことをFlyweightパターンと呼びます(メモリ消費が軽くなるから「フライ級」です)。ご参考に。

とのことです。ありがとうございます。

##[shiracamus](http://qiita.com/shiracamus)さんからコメントにて訂正を頂きました。

どうやら大きな値である場合には、値が全く同じオブジェクトであっても、新しいオブジェクトは作られるみたいです。

てことで実行してみたのがこちら。

```lang:test

d = 50000
e = 50000

id(d) #4406088592
id(e) #4404350832

id(d) == id(e) #False


```

システムの中身のしまわれ方とか見るのも、意外と面白いですね
UIImagePickerControllerでフォトストリームの写真を選択した場合


Xcode 7.2
Swift 2.1.1

assetURLは取れるんですが、
Imageがついてきません

※訂正:「assetURLから PHAsset.fetchAssetsWithALAssetURLで取得出来ない」でした。m(_ _)m

```swift
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

    if(info[UIImagePickerControllerOriginalImage] != nil){
        //カメラ撮影、カメラロールなどから選択した場合はこちら
        //〜省略
    } else {
        // フォトストリームから選択した場合はここに入る
        //assetURLは取得可能
        let path:NSURL = info[UIImagePickerControllerReferenceURL] as! NSURL;
     // 以下の様にPHAssetとして取得しようとするとnilとなる
        let fetchResult: PHFetchResult = PHAsset.fetchAssetsWithALAssetURLs([path], options: optionsForFetch)
    }
}
```

色々と調べたり聞いたりしたものの、以下の方法で解決することにしました。
やっていることはassetUrlから識別IDだけ抜き出し。
Photos frameworkのPHFetchResultとしてはフォトストリームの写真が取得できるので、その全数をループで回して識別IDの一致をチェックする泥臭い方法。

```swift
func searchPHAsset(alURL:NSURL) -> PHAsset? {
    var phAsset : PHAsset?
    let str = alURL.absoluteString.characters.split("=").map(String.init)[1]

    let startIndex = 0
    let startOfString = str.startIndex.advancedBy(startIndex)
    let endOfString = str.startIndex.advancedBy(36)

    let range = Range(start:startOfString,end:endOfString)
    let localIDFragment = str.substringWithRange(range)

    let optionsForFetch = PHFetchOptions()
    optionsForFetch.includeHiddenAssets = true

    let fetchResultForPhotostream = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album,subtype:PHAssetCollectionSubtype.AlbumMyPhotoStream, options: nil)
    if fetchResultForPhotostream.count > 0 {
        let photostream = fetchResultForPhotostream[0] as! PHAssetCollection
        let fetchResultForPhotostreamAssets = PHAsset.fetchAssetsInAssetCollection(photostream, options: optionsForFetch)
        if fetchResultForPhotostreamAssets.count >= 0 {
         var stop : Bool = false
         for var i = 0; i < fetchResultForPhotostreamAssets.count && !stop; i++ {
             let phAssetBeingCompared = fetcsultForPhotostreamAssets[i] as! PHAsset
                if phAssetBeingCompared.localIdentifier.rangeOfString(localIDFragment) != nil {
                    phAsset = phAssetBeingCompared
                    stop = true
                }
            }
            return phAsset
        }
    }
    return phAsset
}
```
Ui Autometor Viewで他のアプリのUI構造を調べる


Android SDKに標準で付いているUi Autometor Viewを使うと他のアプリのView構造を知ることができました。

```bash
# 起動
$ $ANDROID_SDK/tools/uiautomatorviewer
```

これで画面が起動するので、あとは右上のアイコンをクリックすればOKです。
画面右上にUIの階層、右下に選択したViewの詳細が表示されます。
試しにGoogle Playのトップ画面を表示してみました。
（Google Playの最初の検索ボックスがImageViewだったとは...！）

![スクリーンショット_2016-01-26_8_21_10.png](https://qiita-image-store.s3.amazonaws.com/0/6061/f23e09b7-3a55-e6ee-2957-8f9cf0fd2414.png "スクリーンショット_2016-01-26_8_21_10.png")

これでかなりお手軽に他のアプリのUI構造を知ることができます！
UIを参考にしたいときに便利ですね！
pacman -Syuでハマった点(2016/1/26) php7,mysql

> 警告: /etc/httpd/conf/httpd.conf は /etc/httpd/conf/httpd.conf.pacnew としてインストールされました
> 警告: /etc/pacman.d/mirrorlist は /etc/pacman.d/mirrorlist.pacnew としてインストールされました
> 警告: /etc/php/php.ini は /etc/php/php.ini.pacnew としてインストールされました
> 警告: /etc/powerdns/recursor.conf は /etc/powerdns/recursor.conf.pacnew としてインストールされました


## php5が消されてphp7が入った

```bash:読み込まれているモジュール一覧確認
httpd -M
```

* phpが無いことがわかる。


## php7用に修正

* そのままだとlibphp5.soが無いためphpが動かない

```diff:/etc/httpd/conf/httpd.conf
  LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
  LoadModule rewrite_module modules/mod_rewrite.so

- LoadModule php5_module modules/libphp5.so
+ LoadModule php7_module modules/libphp7.so
  AddHandler php7-script php
- Include conf/extra/php5_module.conf
+ Include conf/extra/php7_module.conf
```

## phpからmysql接続

```bash:/etc/php/php.ini
extension=mysqli.so

extension=pdo_mysql.so
```

```bash:以下は好み
extension=gd.so
extension=gettext.so

extension=iconv.so

extension=mcrypt.so
```
技術英語 > It's a long story. / To make a long story short, ...

@ Star Trek Voyager > NON SEQUITUR

色々あって戻ってきたキムが、「何があったのか」と聞かれて

> It's a long story.

<hr>
関連して思い出したのは

> To make a long story short

http://eow.alc.co.jp/search?q=make+a+long+story+short
> 1. かいつまんで話す、手短に［簡単に］言う◆【直訳】長い話を短くする

In brief, や In short, でも意味は通じると思うが、To make a long story short, を使うほうが印象的になる感じがする。
自前でActionView::Baseを使ってrenderする時の罠

ポイントを先に言いますと、**`action_view.render`の戻り値は文字列ではない、尚且つ、`to_s`しても文字列にならないこと** です。

## 前提
- `Job`処理の中、HTMLを生成したいので、`ActionView`を直接に使う

```ruby
def notification_body
  users = ...
  action_view = ActionView::Base.new(Rails.root.join('app', 'views'))
  action_view.assign users: users
  action_view.render(template: 'users/published.text.erb')
end
```

## 問題
- 外部APIを呼び出す為`notification_body`をエスケープしようとするタイミングで、よく分からない下記のエラーになってしまった

```ruby
NoMethodError: undefined method `each_byte' for nil:NilClass
from /Users/blueplanet/.rbenv/versions/2.1.5/lib/ruby/2.1.0/uri/common.rb:307:in `block in escape'
```

## 原因
- 最初に書いたんですが、`ActionView.render(...)`の戻り値は文字列ではないから`escape`がエラーになった

```ruby
[23] pry(main)> result = action_view.render(template: 'users/published.text.erb')
...
[24] pry(main)> result.class
=> ActionView::OutputBuffer
[25] pry(main)> result.to_s.class
=> ActionView::OutputBuffer
[26] pry(main)>
```

- さらに、**`result.to_s`しても文字列にならない！！！**

## 解決
- `to_str`メソッドを使えば、文字列になります。

```ruby
[27] pry(main)> result.to_str.class
=> String
[28] pry(main)>
```

## 参考記事
- [render_to_string の罠 - サッカーカレンダー(beta)の日記](http://d.hatena.ne.jp/scalendar/20140806/1407322110)
- [ActionView を単体で使ってみる | そんなこと覚えてない](http://blog.eiel.info/blog/2014/07/18/action-view/)

## 後で調査
- [ ] `ActionView::OutputBuffer`とは？
- [ ] `rake`の中で`mailer`を呼び出す際の処理は`ActionView`を使ってる？
pythonでの、変数の処理について詳しく調べてみた

運営ブログの記事はこちら[pythonの秀逸なオブジェクト保存方法の設計](http://u-kan.hatenadiary.jp/entry/2017/10/09/080000)


ここでは、インタープリタで見る、python変数の処理について書いていきます。ファイルから実行する場合には、うまいことググってみてください。

主に、やることとしては「変数を呼び出したいところ（varとかってやってるところ）で、『print var』ってやる」くらいだと思いますが、、

#変数の作り方

「変数 = オブジェクト」の順に記入するだけです。

```lang:test
var = 9
```
 

#呼び出し方

　ただ、「var」ってうつ

```lang:test
var #9
```

#変数を定義する時に裏側で行われてる	事（多分）

1. 変数を保存（var）
2. ポインタ(=の仕事)を用意して、オブジェクトの保存先を変数に記憶
3.  実際の値（オブジェクト）の割り当て（ここでは9）
Objectのメモリ空間に含まれる者は、

    1. オブジェクトの値(9)
    2. Type Information(つまりデータ型、Integer)
    3. Reference Counter(変数の入っているアドレス)」

4. 呼び出す時は、”Pointer”を使ってObjectを参照するだけ
Pointerは「=」によって定義されてます。= がないとsyntax errorが出ます

#具体例var1 = var とした時に何が起こっているのか

	間違い
		「var1 は var を呼び出す。そのあと、var がオブジェクト 9 を呼び出している」
	正しい
		「var1 は var と同じオブジェクトを参照する。 var1 は直接 オブジェクト9を呼び出している」


##確認① var1 = var 

まず、var1 = var とする。ここで、仮説を以下のように置く（めっちゃ理系だ。。）
	
```
var1 が**直接**オブジェクトのアドレスを参照しているということは
var1 と varは完全に独立（なはず）。
varに新しく何かを**代入(=)**して見る。
varがvar1と完全に独立ならば、varに新しいオブジェクトを代入しても
var1の値は変わらないはず
```

試してみる。

```lang:test
var = 20
var1 = var

var = 30 #var1はvarとは無関係なので、var1の値はそのままのはず。

var #30
var1 = 20
```

##確認②listのappendで新しい値を**追加**してみる。

同じ値を参照しているはずだから、**代入（ = ）**じゃなくて**追加（ append ）**の場合ならば、両方とも値は変化するはず。


```lang:test
list1 = [1,2]  #list1 [1,2]
list2 = list1  #list2 [1,2]
		
list1.append(3) # " = " は使ってないからlist2の参照先に新しい値が追加される

list1 #[1,2,3]
list2 #[1,2,3]
```

やっぱり、代入じゃない限り、変数の参照する先はまったく同じになるらしい。**追加とかスライス**を行った場合には、変数（ここでは、list1とlist2）は両方とも変更される。（こんがらがってきた、、）


##つまり、
1. 新しく変数に値を代入（ ＝ を使う）ー＞新しくオブジェクトを作成するので、互いに完全に独立になる。
2. 新しく変数に値を代入しない（ = 使わない）ー＞参照している先は同じなので、どっちかを変更すると両方値が変わる



てことは、途中に`list1 = [1,2]`とかってのを足してあげると、**list1とlist2は完全に独立になる**ので、結果は変わるはず！

```lang:test
list1 = [1,2]  #list1 [1,2]
list2 = list1  #list2 [1,2]

list = [1,2]  #値が同じだけど、" = "を使っているので、全く新しいオブジェクトが作成され、list2とは独立（無関係になる）

list1.append(3) # " = "は使っていないが、新しく作成されたlist1のオブジェクトに値が追加される。list2は無関係なので、そのまま

list1 #[1,2,3]
list2 #[1,2]
```
ということで個人的には腑に落ちたのでした。（自分の頭でしっかり理解しないと、読んでも絶対わからなそう、、）
pymongoを使ってみた

pymongoで検索すると、下記のページがヒット。
https://docs.mongodb.org/ecosystem/drivers/python/
installationをクリック。
指示に従って、python -m pip install pymongo を実行。なんかエラーが出たので、色々調べた結果、下記のページを見てpipをインストール。
https://packaging.python.org/en/latest/install_requirements_linux/#installing-pip-setuptools-wheel-with-linux-package-managers
実際に実行したのは以下。
sudo apt-get install python-pip

再度、python -m pip install pymongo を実行。成功。

次に下記のコマンドを実行。＃関係するライブラリをインストールする必要があるみたい。
sudo apt-get install build-essential python-dev

その後、Tutrialに従って、サンプルコードを記述。
http://api.mongodb.org/python/current/tutorial.html?_ga=1.45218724.1893331206.1453483295
こっちも参照。
http://www.atmarkit.co.jp/ait/articles/1507/14/news029_2.html
http://qiita.com/mzmttks/items/052a8de5e943501b5ce7

リモートからのアクセスでエラーになったので、confファイルを書き替えた。デフォルトだとリモートアクセス不可の模様。
http://qiita.com/Chan_moro/items/cbf4e451d0a89f4d7c1a
swiftでUITabBarItemをクリックしたらpopToRootViewControllerAnimatedで一気に戻る


## デフォルトでもダブルクリックすれば戻れる
UITabbarControllerを使って、UINavigationControllerを接続している場合、UITabBarItemをダブルクリックすると、UINavigationControllerのRootViewControllerに戻ることができる。
しかし、iOSでダブルクリックするというのは不自然なので、ワンタップでRootViewControllerに戻りたい。

## 1. UITabBarControllerDelegateを設定

UITabBarControllerDelegateを継承した上で、 `self.delegate = self`を追記

```:GlobalFooterNaviController.swift
class GlobalFooterNaviController: UITabBarController, UITabBarControllerDelegate {
   override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
   }
}
```

## 2. didSelectViewControllerを設定

didSelectViewController内で、popToRootViewControllerAnimatedを呼ぶ
この時、viewControllerという変数は、UIViewController担っている。UINavigationControllerにキャストしてあげないと、メソッドないよと怒られる

```:GlobalFooterNaviController.swift
func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
    if let navigationController = viewController as? UINavigationController {
        navigationController.popToRootViewControllerAnimated(true)
    }   
}
```
タグの入れ子内にある<script>がmarkedで変換すると実行されないのを回避する方法

マークダウンファイル中の以下のような記述をmarked.jsで変換すると・・・

```html
<div>
  <script>alert('bar');</script>
</div>
```

エスケープされてしまいJavaScriptが実行されない。

```html
<div>
  <script>alert(&#39;bar&#39;);</script>
</div>
```

タグの入れ子だとダメで以下のように書けば実行される。

```html
<script>alert('bar');</script>
```

以下のようにソースをいじることで入れ子内の`<script>`でも実行できるようになる。
https://github.com/chjj/marked/blob/88ce4df47c4d994dc1b1df1477a21fb893e11ddc/lib/marked.js#L364

```
pre: !this.options.sanitizer,
//↓コメントアウト
// && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
```
mongoDBのUbuntuへのインストール

mongoDBのダウンロードページに行くと、UbuntuはLTS版のみサポートとある。Linux 64-bit legacyのtarボールをダウンロードしてUbuntu 15.10へのインストールを試みたがうまくいかず。。＃たぶんパスの設定等でつまずいた。
CentOS等にインストールしようと思ったが、RHELはあるが、CentOSはない。。
しょうがないので、Ubuntu LTS版（14.04）を建てて、そこにインストール。

このページの指示に従ってインストール。
https://docs.mongodb.org/master/tutorial/install-mongodb-on-ubuntu/?_ga=1.72407251.1551234246.1453483329

手順２で、echo..を入力するが、入力内容の右端が途切れているので、スクロールすること。
手順４では、latest stable versionを選択。普通に V3.2.1 がインストールされた。

あとは、データを外付けディスクに保管したかったので、保管場所を変更。
下記のページに従って、confファイルを書き換えた。
https://docs.mongodb.org/master/reference/configuration-options/#storage.dbPath
私の環境では、confファイルが /etc/mongod.conf ではなく、/etc/mongodb.conf の模様。
理由はわからない。。
なお、保管場所のディレクトリのownerをmongodbに変えておくこと。
まさかの親ディレクトリのownerもmongodbに変える必要があった。。　ハマった。
http://stackoverflow.com/questions/6971634/unable-to-change-the-dbpath-in-mongodb-through-mongodb-conf

リモート接続を可能にするために以下のページを参照して、bindIpに0.0.0.0を設定。
http://qiita.com/Chan_moro/items/cbf4e451d0a89f4d7c1a

mongodbの動作確認には、下記のページを参照。簡単なスクリプトを実行して、動作を確認。
http://www.atmarkit.co.jp/ait/articles/1507/14/news029.html

以上で終了。
ビットコイン周りの取り扱いで気を付けること

# ビットコイン周りの取り扱いで気を付けること

## ダブルスペンディング

二重支払い。
ブロックに取り込まれたのを確認してから受け取り完了とすればビットコインのネットワークが無効化してくれる。
ごくたまにブロックが分岐すると一認証とれていてもあとで無効になったりするのでブロック数回は認証したほうがいい。

## ダスト

ゴミのトランザクション。いわゆるスパム。
手数料以下の値を送り付けてくる場合は無視する必要がある。
~~そうでないと手数料無料で送れるようになるまでその残高は塩漬けになる~~
送金するには額面以上の手数料が必要になり実質塩漬けになる
また大量に送られた場合は受け取り完了処理を都度するはめになるのでサーバーの負荷があがることになる

ビットコインネットワーク的には546satoshi以下はゴミと定義されているのでトランザクションが通らないが
1000satoshiでもゴミだと思われるのでサービスによって受け取る量を自分で定義して制限したほうがいいだろう

## トランザクションマリアビリティ

第三者が秘密鍵を持ってなくてもトランザクションを一度展開して署名のいらない一部を書き換えて送信しなおしtxidを別のidにすることで
送信時のtxidと実際に届いたtxidが別idになってしまう攻撃。

受け取り側はダブルスペンディングに見えるのと送金側は送ったトランザクションが消えてしまう現象にみえる。

ビットコインの仕様のバグでそのうち治る？

# 参考資料

[What is meant by Bitcoin dust?](http://bitcoin.stackexchange.com/questions/10986/what-is-meant-by-bitcoin-dust)

[ビットコイン ～ トランザクション展性について](http://www.slideshare.net/JonathanUnderwood/ss-43833255)
pythonのデータ型についてシンプルにまとめてみる

pythonのデータ型について少し勉強したので、スーパーsimpleにまとめます。順番は以下の通りです。随時更新していきます。（多分）

# string(文字型)
Stringでデータ型を使う時には、
「''（シングルクォート）」
「""（ダブルクォート）」
「''' aaa '''（トリプルシングルクォート）」
「"""（トリプルダブルクォート）」
の４種類が主に挙げられます。

どれを使ってもstring型を定義できるのですが、少し細かいルールがそれぞれあるので、またそれは随時追加していきます。

# number（数字）
Number型を定義したい時は、何も打たずにただただ数字を打てばオッケーです。例としては以下の感じ。ここでは変数として「var」を使います。
```
var1 = 6
var2 = 897.33
```
などなど。

ここで、注意したいのは、Numberは以下の３種類からなるということ。
- Integer（整数型）
- Float（小数点）
- Boolean（True / False）

簡単にFloatとBooleanについて記述。Integerは普通に日々やってる整数の足し算引き算ですので、省略。

**Float**

Floatの特徴について箇条書き。

'''lang:test
6.0 + 4 = 10.0 (Float型(ここでは6.0)が１つでも入ってれば答えは*Float*)
6.0 * 4 = 24.0（掛け算引き算も同じ）
6.0 / 2 = 3.0 （割り算も同じかと思いきや） 
6 / 2 = 3.0 (割り算だけはいつも結果はFloat型のようです。)
'''

**Boolean**

Boolean はStringかと思いきや、「0と１で定義」されています。なので、以下のような足し算が可能です。

'''lang:test
False + 1 = 1 (Falseはコンピューター的には0と保存されいるので)
True  + 1 = 2 (Trueは1なんですね。)
'''

まぁ、あんまりこんな書き方しないだろうから、気にしなくてもいいだろうけど。

# list（リスト）

list は次のように **[ ]** を使って定義できる。

*list = [7, 'aa', False]*

特徴としては、、
1. 中身の書き換えが可能（tupleとの違い）
2. 入力した順番で保存されるため、indexでよびだせる(list[0]とうつと*7*が返ってくる)。(Dictionaryとの違い)


# tuple（タプル）

tuple は以下のように **( )** を使って定義できる。

*tuple = (123,456,789)*

特徴としては、、
1. 中身の書き換えが不可能(listとの違い)
2. 入力した順番で保存されるため、indexでよびだせる(tuple[0]とうつと 123* が返ってくる)。(Dictionaryとの違い)

# dictionary（辞書型配列）

Dictionary は以下のように ** { } ** を使って定義できる。

*Dictionary = {"key" : "Value", "age" : "8"} *

特徴としては、、
1. 中身の書き換えは可能。(tupleとの違い)
2. 入力された順番で保存されないため、indexで呼び出せない。(list,tupleとの違い)
3. そのかわり、** key **を使ってよびだせる。

例えば、、

Dictionary["key"] と打つと"Value"が返ってきたり、Dictionary["age"]と打つと"8"が返ってくる
Arukas.io で Slack 自動招待フォーム

ChatOps ファンのみなさんこんにちは。今日も Slack してますか？
先日これを読んで、Slack、この先生きのこると確信しました。
[Slackがカップル専用アプリだった件 - くまのからあげ](http://kuma-no-kara-age.hatenablog.com/entry/2016/01/10/212347)

さてそんな Slack、
`チームを公開して 参加希望者に自由に参加してもらう` には
[公開Slack用 自動招待フォーム by GAS](/atusi/items/c2669add8038c43efff3)[^1] などの方法で
あれこれ準備せねばなりません。
他に [Heroku の例](/r7kamura/items/0b0a2a2d536907816b0d) などもありますが、**無料[^2]で簡単に** 実現すべく
今回は β公開中の [Arukas.io](https://arukas.io/) でやってみたいと思います。


# 手順

## 1. Arukas.io でアカウント作成

https://arukas.io/
支払方法の登録もなく。シンプルすぎる。

## 2. 新しいアプリケーションの作成

https://app.arukas.io/ の以下の画面で
「新しいアプリケーションを作成」

<img width="500" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/66457/5c64b3ae-70ae-047a-ef9d-680b5bca0ab5.png">

## 3. アプリケーションの設定

↓こんな感じで埋めて、作成ボタンを押します。

| 項目 | 値 | 　
|:-----------|:------------|:------------|
| Name | てきとうに
| Image | pottava/slack-invite:ja
| Instances | そのままでOK
| Memory | どちらでも
| Port | 80 TCP
| ENV | SLACK_TEAM_NAME | チーム名
| | SLACK_TEAM_DOMAIN | https://＊.slack.com/ の ＊ 部分
| | SLACK_TOKEN | https://api.slack.com/web で生成したトークン

<img width="700" alt="02.png" src="https://qiita-image-store.s3.amazonaws.com/0/66457/8f64b1ce-c5f9-e6fb-deaa-96f1d1c11b3c.png">

## 4. 公開サイト URL の確認

しばらく待つと「アプリは起動状態です」と表示されるので
以下の URL にアクセスしてみます。

<img width="700" alt="03.png" src="https://qiita-image-store.s3.amazonaws.com/0/66457/6d112a0d-c13b-0e31-618e-ff5b5fec751a.png">

繋がったー！！！

<img width="500" alt="05.png" src="https://qiita-image-store.s3.amazonaws.com/0/66457/515ac0ba-8bf8-ef51-76c4-f112d627aabe.png">


## 5. 短縮 URL とか

Arukas.io の URL は Heroku のようにかっこよくできないばかりか
ポート番号も動的に割り当てられた Docker 感あふれたものなので
関係者に共有するときは [goo.gl](https://goo.gl/) あたりで短縮したほうがよいかも。


おわり
　  

[^1]: Google フォームの新バージョンだと 1/26 現在アドオンが使えない。かなしい・・
[^2]: Arukas.io がいつまで無料なのかはさくらさん次第ですが。
実行した日が誕生日だったらHappy Birthdayとprintするだけのスクリプト


知り合いが誕生日だったので書いてみたら意外とめんどくさかった。
日付処理だからしょうがないか〜と思いつつすごく簡単な方法があったりして。。。

```Swift
let name = "俺様"

let birthdayComponents = NSDateComponents()
birthdayComponents.year = 1982
birthdayComponents.month = 1
birthdayComponents.day = 18

if let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) {
    if let birthday = calendar.dateFromComponents(birthdayComponents) {
        let now = NSDate()
        let elapsed = calendar.components(([.Year, .Month, .Day]), fromDate: birthday, toDate: now, options: [])

        let year = elapsed.year
        let month = elapsed.month
        let day = elapsed.day

        switch (month, day) {
        case (0, 0):
            print("A Happy \(year)th birthday to \(name)🎉")
        default:
            print("A very mery unbirthday to you!")
        }
    }
}
```
hubot-heroku-keepaliveの導入

heroku上にhubotをデプロイした時に、free-dynoで自動停止させないように
hubot-heroku-keepaliveの導入を行ったので下記記事にまとめました。
http://kakts-log.blogspot.jp/2016/01/hubot-heroku-keepalive-herokudynosleep.html
ビットコインのブロックチェーンへのアクセス方法


# ビットコインのブロックチェーンへのアクセス方法

ビットコインのブロックチェーンにアクセスするにはbitcoindのJSON-RPCを用いるのが一般的ですが
ブロックエクスプローラのREST-APIがお手軽で扱いやすいです
ここでは[insight](https://insight.bitpay.com/)というOSSのブロックエクスプローラを紹介します

## api

bitpay公式の[webapiアクセスライブラリ](https://www.npmjs.com/package/bitcore-explorers)があるのですがコールバック地獄になるので
[promiseでアクセスできるモジュール](https://www.npmjs.com/package/insight-cli)を作ったのでそれを使います

### インストール

```:console
npm i insight-cli
```

### ビットコインアドレスの残高を取得

```:javascript
var RestClient = require('insight-cli').RestClient;
var timeout = 300;
var url = 'https://insight.bitpay.com/api';
var cli = new RestClient(url, timeout);
cli.addr('12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX').then(function(data){
    console.log(data.balance);
})
```

### ビットコインアドレスにある未使用トランザクション一覧を取得

```:javascript
var RestClient = require('insight-cli').RestClient;
var timeout = 300;
var url = 'https://insight.bitpay.com/api';
var cli = new RestClient(url, timeout);
cli.utxo(['12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX']).then(function(utxos){
    console.log(utxos);
})
```


追記するかも
Oracle Cloud (DBaaS) で用意されるデータベース

#Oracle Cloud で構築できるデータベースエディションは Public Cloud 専用のもの
`Oracle Database Public Cloud Service(DBaaS) バージョン　14.1.0.0.0`

Oracle Cloud で作れるデータベースのエディションは、Cloud で用意されたデータベースエディションになります。

Oracle Public Cloud 上で、DBインスタンスを作成するときに、

>*参考：Database Cloud Serviceインスタンスの作成画面*
>![Database Cloud Serviceインスタンスの作成画面](https://qiita-image-store.s3.amazonaws.com/0/108642/8b9efbc9-71b9-4f9c-e403-cb65424e881e.png "Database Cloud Serviceインスタンスの作成画面")

上記のような画面でソフトウェア・エディションを選択しますが、ここで選択したソフトウェア・エディション名になります。

例えば「Enterprise Edition - High Performance」で、構築したデータベースで v$version を確認するとこんな感じです。

```sql
SQL> select BANNER from V$VERSION where BANNER like '%Database%';

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c EE High Perf Release 12.1.0.2.0 - 64bit Production
```
Oracle Database 12c EE **<font color="red">High Perf</font>** Release 12.1.0.2.0 - 64bit Production
「**High Perf**」になっています。

##想定される影響
Oracle Database を利用するパッケージソフトで、Oracle Cloud (DBaaS) 上で構築する際、**Oracleのエディションをチェックする** 仕組みがあるものは影響しそうです。