OmniAICreator/Qiita-1.07M huggingface dataset:
XMLHttpRequestをもちいて、数値データを読み込もうpart2

part1のリンクを貼っておきます。
[part1](http://qiita.com/klme_u6/items/f66642d8942bb54c51ad)
##レスポンス処理
前回の続きです。
レスポンス処理にはonreadystatechangeプロパティをもちいます。onreadystatechangeプロパティはサーバ通信の変化を表すイベントです。onreadystatechangeプロパティはreadyStateプロパティを参考に発火します。

javascriptの連語は、文字の区切りを大文字にするのが通例です。
このonreadystatechangeは文字の区切りを大文字にしないのはなぜなのでしょうか。もしわかるかたコメントよろしくお願い致します。

| 値 | 通信状態 | 詳細         |
|:---|----:|:------------------:|
|0| UPSET |XMLHttpRequestオブジェクトが生成されたら        |
|1| OPENED |    open()メソッドが呼び出された   |
|2|  HEADER_RECEIVED |send()メソッドが呼び出せれて、レスポンスヘッダ(レスポンスデータのサイズ 、データ形式を受信した状態       |
|3|      LOADING |      データをダウンロード中    |
|4|  DONE |    データ通信完了    |

では、実際にどのように使うのか

```js:レスポンス処理
//通信状態が変化したときに実行される
xml.onreadystatechange= function(){
 //通信が完了したら以下をじっこうする
 if(xml.readyState == 4){
 alert("通信完了");
 }
}
```


このようにしてデータのやりとりができます。

```js:例
<script>
//XMLHttpRequestオブジェクトの生成
var xml = new XMLHttpRequest();
//通信方式,URL,非同期処理の有無を設定
xml.open("GET","sample.dat",true);
//通信状態が変化したときに呼び出される関数
xml.onreadystatechange = function(){
 if(xml.readyState == 4){
 alert("xml.responseText");
 }
}
//リクエストの送信
xml.send();
</script>
```
responseTextはプレーンテキスト形式のことです

```lang:sample.dat
Hello World
```

XMLHttpRequestを利用して外部ファイルからデータを取得することができました


#文字列データかた数値データへの変換



```lang:リスト
x,y
0,0
1,1
2,8
3,27
4,64
```
このリストのものを文字列であらわすと



```lang:文字列表現
"x,y\n0,0\n1,1\n2,8\n3,27\n4,64\n"
```
改行が含まれます。


文字列のデータを数値データに変換するには以下の様な処理が必要です。

1.外部ファイルからの収得
2.文字列データを一行ごとに分解
3.1行ごとに分解された文字列からx,y座標を抽出

#文字列データの分解の仕方

split()メソッドを利用というもので


```js:split()
"分解したい文字列".split("区切り文字");
```


```js:split()の例
var str = "1,2,3,4";
var ar = str.split(",");
alert("ar");
```
このようにして配列としてデータを保持できます




次回につづきます。
[WIP]VPSのCentOS6でdjangoの環境を整えるまでの道のり(個人メモ兼用)

# ローカル仮想環境で作業中・・・
作業終わったら適宜追記する予定

## まずはセキュリティ面での作業。
[VPS 借りたら、せめてこれくらいはやっとけというセキュリティ設定 | dogmap.jp](http://dogmap.jp/2011/05/12/vps-security/)

### SSHの鍵設定
```bash
cd .ssh/
touch authorized_keys
chmod 600 authorized_keys
cat id_rsa.pub >> authorized_keys
```

## Pythonの環境を整える

[PyenvをCentOS6.3でセットアップする（超かんたんリファレンス付き） - Qiita](http://qiita.com/yuta_h3/items/2988c4d0811bf8c344c0)


## pipを使えるようにする
### sudoでの実行が必要

```bash
sudo sh -c 'curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python'
```

[Python - いつの間にかpipのインストールが楽になってた件 - Qiita](http://qiita.com/who_you_me/items/831d62f396e6d66dda66)

##もうめんどいのでdjangoにする
[Djangoのインストールと起動 | みーのぺーじ](http://www.atsuhiro-me.net/python/dev/django-install)


## その他対応するかどうか不明
### MySQLのインストール
[mysql5.6 rpmインストール on CentOS6.5 - Qiita](http://qiita.com/icche/items/938290c8fce954c58abf)

[【シンプル】CentOS6にMySQL5.6をyumで簡単にインストールする手順田舎に住みたいエンジニアの日記 | 田舎に住みたいエンジニアの日記](http://blog.ybbo.net/2014/01/22/%E3%80%90%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%80%91centos6%E3%81%ABmysql5-6%E3%82%92yum%E3%81%A7%E7%B0%A1%E5%8D%98%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/)


### MySQLのセットアップ
django使うからいらない
~~[PythonからMySQLを使う - Qiita](http://qiita.com/ota42y/items/9918789e40f657494024)~~

### MySQLのORMセットアップとか
django使うからいらない
~~[紹介マニアどらふと版: Python の ORM 調査：SQLAlchemy編](http://www.sakito.com/2012/10/python-orm-sqlalchemy.html)~~

### Redisのインストール
[KVS | Librabuch](http://librabuch.jp/tag/kvs/)
Java開発するときはライブラリのソースをアタッチしよう!


EclipseでJava開発をする際には,まず標準ライブラリのソースを読めるように設定しておきましょう!

(他言語でも同様かとは思いますが)

###何が嬉しいの?

(英語が読めずとも)標準ライブラリのクラスやメソッドの挙動がより詳細にわかります,
例えば,

* StringやBigDecimalなどのクラスがImmutableである理由がわかる.
* メソッドが破壊的か非破壊的かがわかる.
* 標準メソッドが返すCollectionの実装がわかる.

などです.

###手順

1. Eclipse,JDKのセットアップをする.
2. ProjectExplorerからJRE System Libraryのrt.jarのPropertiesを開く.
3. Java Source Attachmentの項目で,JDK内のsrc.zipを設定する.


この設定以降,標準クラスやメソッドのソースへジャンプすることが可能になります.



EclipseでJava開発をする際は忘れずに設定しましょう!
docker buildしてもREPOSITORY/TAGがnoneになる


```:バージョン情報
$ docker version
Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.1
Git commit (client): a8a31ef
OS/Arch (client): darwin/amd64
Server version: 1.5.0
Server API version: 1.17
Go version (server): go1.4.1
Git commit (server): a8a31ef
```

タグ指定でビルドする。

```:docker&nbsp;buildしてみる
$ docker build -t uemura/mysql:1.0 .
```

つかねーじゃん・・・

```:なんでREPOSITORY/TAGがnone...orz
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              a26345e9996c        3 minutes ago       382.9 MB
centos              latest              dade6cb4530a        2 weeks ago         210.1 MB
```

使い方はあってるよな？

```shell-session:ヘルプ見てみる
$ docker build --help

Usage: docker build [OPTIONS] PATH | URL | -

Build a new image from the source code at PATH

  -f, --file=""        Name of the Dockerfile(Default is 'Dockerfile' at context root)
  --force-rm=false     Always remove intermediate containers, even after unsuccessful builds
  --help=false         Print usage
  --no-cache=false     Do not use cache when building the image
  --pull=false         Always attempt to pull a newer version of the image
  -q, --quiet=false    Suppress the verbose output generated by the containers
  --rm=true            Remove intermediate containers after a successful build
  -t, --tag=""         Repository name (and optionally a tag) to be applied to the resulting image in case of success
```

```:仕方ないのでdocker&nbsp;tagで付ける
$ docker tag a26345e9996c uemura/mysql:1.0
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
uemura/mysql        1.0                 a26345e9996c        9 minutes ago       382.9 MB
centos              latest              dade6cb4530a        2 weeks ago         210.1 MB
```
Windows 8.1 > リーダーがPDFを保持してしまう件の対応

技術資料をPDFで見る機会というのはよくある。win8.1には「リーダー」という標準ソフトがあり、PDFをこれで見る時に困ったことと、その解決方法。

困ったことは、リーダーでPDFを開いたあと、リーダーがPDFを保持してしまい、ファイルの移動や削除ができなくなること。

よくわからなかったので、いちいちリーダーのタスクをタスクマネージャーから終了してからファイルの移動や削除をしていた。

以下の手順で行うとリーダーがPDFを保持するのを回避できる

    1. リーダーにて右クリックする。左上に開いているファイルのリストが表示される。
    2. 左上のファイルリストにおいて「x」を押してファイルを閉じる。
    3. リーダーを終了する (リーダーの上部を手のマークが出た時に左クリックし、そのまま画面下まで持って行き、左クリックを離す)。

上記3の終了ではリーダー自体はタスクとして残ったままだが、ファイルを閉じた状態になっているので、ファイルの移動や削除ができる。
展示会で見せるデモ用アプリの「べからず」集

いわゆる完成度やユーザビリティ、セキュリティと相容れないところもあるが、不安定な環境で不特定多数の人にスピーディに理解してもらうためのノウハウというのも確立されるべきだと思ったので。

- 手で入力しないといけない項目が多い
- セッション・タイムアウトが短い（デモをしようとしたらログインしなおし）
- メニューが動的に生成され、待たされる
- 見せたい画面に辿り着くのに時間が掛かる
- 「この内容でよろしいですか？」とか、画面遷移がやけに多い
- ２カラムとか３カラムで、どこを見たらいいかわかりにくい
- 広告が掲載されてる

とか書いてみたけど、じゃあ、これらの逆を書けばデモ対策集になるかというと微妙なところ。

ただ、デフォルト値とかセッションタイムアウト、広告の有無は外部ファイルで制御できるようにしておくと、ちょっとは便利かな。
Github Wikiの印刷をキレイに

GithubのWikiを印刷やPDFへ出力したりすると、ページヘッダやメニューバーなんかが一緒に印刷されてしまって生きるのが辛いですよね。

そんな時は、ブラウザのJavaScriptコンソールを開いて以下のコードを実行することで余計な要素を非表示にしてキレイに印刷することができます。

```
[
  "header",
  "pagehead",
  "gh-header-actions",
  "wiki-rightbar",
  "site-footer",
  "wiki-footer",
  "gh-header-meta"
].forEach(function (className) {
  document.getElementsByClassName(className)[0].style.display = 'none';
});

document.getElementsByClassName("has-rightbar")[0].classList.remove("has-rightbar")

// コードの右端が切れてしまうので改行させる
var codeTags = Array.from(document.getElementsByClassName("markdown-body")[0].getElementsByTagName("code"));
codeTags.forEach(function (e) {
  e.style["word-wrap"] = "break-word";
  e.style["white-space"] = "pre-wrap";
});
```
git > サブフォルダだけのgit statusが見たい > git status . / 同様にgit diff HEAD . など



    WORK/
    WORK/SAMPLE1
    WORK/SAMPLE2
    ...
のようなフォルダ構成があるとする。

`WORK/SAMPLE1`におり、色々作業をした後で`git status`を実行すると`../WORK/`や`../WORK/SAMPLE2`のstatusまで表示されてわかりにくい時がある。

その場合は以下のようにすることで、現在のサブフォルダ( `WORK/SAMPLE1` )のstatusだけ見ることができる。

    git status .
同様に

    git diff HEAD .
なども使える。

<hr>
ただし、上位のフォルダ (`WORK/`)にいる時は`git status .`としてもサブフォルダのstatusまで見えてしまうようだ。
LaTeXを使わずにレポートを作る


# 経緯
emacs+YaTeXでレポートを書いていたのだけれど, `\section` とか `\subsection` とか `\subsubsection` とか長すぎるしもういや！あと数式つらい！ということで,簡単に使えるMarkdownをつかって作れないかなー

でも提出形式はLaTeXで作ったpdfが指定されてるしなー

# メリット

 * LaTeXの長いコマンドを使わなくていい(emacsのやてふコマンドを覚えなくていい)
 * 数式のリアルタイムプレビュー

# 必要なもの

 * github atom
 * pandoc
 * (emacs+YaTeX)

## atom
markdownの文に色をつけたりリアルタイムでプレビューしてくれるテキストエディタ.


## pandoc
ターミナルでtexやhtmlやmd形式のものを相互に変換したり,pdfに書き出したりする.超便利.
例えば, `text.md` を `text.tex` にしたいときは,

```bash
$ pandoc text.md -o text.tex
```

とする. `-o` 以下の拡張子で決まる. `-o text.pdf` とすればpdfになる.

## texで出力するとき
texで出力すると,記述した部分のみの出力になる.
なので,予めテンプレートを作っておいて,それに挿入すると便利.

```latex:template.tex
\documentclass[12pt]{jarticle}
% 略
\title{title}
\date{}
\begin{document}

\input{text}

\end{document}
```

こんなのを作っておく.

あとはplatexかYaTeXを使えばいいと思う.

emacsで **text.tex** を開き, `C-c t j` を押すと,

`Enter your main text:` と表示されるので,作った `template.tex` を指定するとそれをコンパイルするようになる.

# 注意点
1. pandocがゆるふわMarkdownを許さない時がある.
例えば, `#` の前の行を開けなくてもAtomやQiitaでは `<h1>` や `\section{}` として認識してくれるが,pandocはだめとかそういうのがある.
もしできたtexの表示が崩れたり `\#` のようにエスケープされていたらMarkdownがゆるふわなせいだと思う.
markdown-preview-plusの設定で記法をpandocの仕様に合わせることができるらしい.それやればうまくいくかも.


2. 表はたぶんうまく行くけどちょっと手直ししなきゃいけないとおもう.

# おまけ
いれると便利なAtomの拡張の話です
## markdown-preview-plus
LaTeX記法の数式もリアルタイムレンダリングすることができる.この機能めっちゃ便利.

もともと入っている `markdown-preview` をオフにして 設定の `EnableMath Rendering By Default` をチェックすればいい. `Ctrl-shift-M` で表示する.

いちいちコンパイルしてうまく動かなくてだめなところを直してまたコンパイル...を繰り返さなくていい！

## markdown-scrool-sync
エディタとプレビューのスクロールを同期するやつ.
cmakeでライブラリ名と実行ファイル名を同じにする

ライブラリのターゲット名をhoge、実行ファイルのターゲット名をhoge-binとして、実行ファイルの出力名を別途設定する。

以下の様なCMakeList.txtを作る。

```cmake
FILE(GLOB BASESRCS "src/*.cc")
ADD_LIBRARY(hoge SHARED ${BASESRCS})
ADD_EXECUTABLE(hoge-bin apps/cli.cc)
SET_TARGET_PROPERTIES(hoge-bin PROPERTIES OUTPUT_NAME hoge)
TARGET_LINK_LIBRARIES(hoge-bin hoge)

INSTALL(TARGETS hoge-bin RUNTIME DESTINATION bin)
INSTALL(TARGETS hoge LIBRARY DESTINATION lib)
```
sublime text 2 > エディタ内で計算する > Package: Inline Calculator

動作確認

    CentOS 6.5 on VMware
    Windows 8.1 on VMware

[noc06140728さんのvimの記事](http://qiita.com/noc06140728/items/429a7729ee7b42eef204?utm_source=stock_summary_mail&utm_medium=email&utm_term=7of9&utm_content=Vim%20%E3%81%AB%E6%83%9A%E3%82%8C%E3%82%8B%E3%82%B7%E3%83%BC%E3%83%B3%EF%BC%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E5%86%85%E3%81%A7%20%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E3%81%97%E3%81%9F%E8%A8%88%E7%AE%97%E3%82%92%E3%81%99%E3%82%8B%EF%BC%89&utm_campaign=stock_summary_mail_2015-02-21)に触発されて、sublime textでもinline calculationができないか探してみたら、見つかった。

Package: Inline Caclulator
をインストールする。

    5+3
のような数式を入力して選択したのち、`ctrl+alt+c`を入力すると、選択部分が計算結果となる。この後、右矢印などを押すと、入力が確定となる。


リンク：[Inline Calculator](https://packagecontrol.io/packages/Inline%20Calculator)
「You can perform any arithmetic operation following the syntax of Python.」との記載がある。

リンク : [Python as a Calculator](https://alexandria.astro.cf.ac.uk/Joomla-python/index.php/week1-pycalc)
上記にある式を色々やってみたが、実行できるのは、四則演算とべき乗(2^^3など)くらいの模様。三角関数や対数関数はできないみたい。
Enumerable モジュールを include して、eachによる繰り返し処理を用いたメソッドを利用する


```ruby
class FriendList
  include Enumerable

  def initialize(*friends)
    @friends = friends
  end

  def each
    for v in @friends
      yield v
    end
  end
end
```

Enumerable を include して each メソッドを定義すると、以下のようにmapやfindメソッドを使用できるようになる。

```ruby
friends = FriendList.new('Alice', 'Bob', 'Charlie')

friends.map { |v| v.upcase }
=> ["ALICE", "BOB", "CHARLIE"]

friends.find { |v| /b/ === v }
=> "Bob"
```
gnuplot-5.0 でデータを直書きする

# 目的
gnuplot でデータをスクリプトファイルに直接書きたい．

# 解決方法
`gnuplot-5.0` からデータを `sh` などでおなじみの here document 形式でスクリプトファイルに直書きすることができるようになりました．もちろんプロンプトから入力することもできます．要素数の少ないデータならスクリプトに含めてしまうことで，プロット用スクリプトの管理が簡単になります．gnuplot のドキュメントには以下のような例が挙げられています．
>```gnuplot:sample.gp
$Mydata << EOD
11 22 33 first line of data
44 55 66 second line of data
# comments work just as in a data file
77 88 99
EOD
stats $Mydata using 1:3
plot $Mydata using 1:3 with points, $Mydata using 1:2 with impulses
```
[gnuplot-5.0 document][gpdoc5] (pdf)

プロットだけでなく，データの統計量を計算する `stats` コマンドの引数としても使うことができます．

プロットの一部にラベルを貼り付けたり，プロットの端に典型的なエラーサイズを図示したりするときに便利かなと思っています．いかに簡単なサンプルを貼付します．

```gnuplot:heredocument.gp
$HOGEDATA << EOD
1 1
2 1
2 2
3 2
3 1
4 1
4 2
5 2
5 3
4 3
4 4
3 4
3 5
2 5
2 4
1 4
EOD

$FUGADATA << EOD
1 1 "1st"
4 1 "2nd"
4 4 "3rd"
1 4 "4th"
EOD

set xr [0:6]
set yr [0:6]
plot $HOGEDATA u 1:2 w l, \
     $FUGADATA u 1:2 w p, \
     $FUGADATA u 1:2:3 w labels offset 1.7,0.5 notitle
###
```
![hdplot.png](https://qiita-image-store.s3.amazonaws.com/0/46396/22f0bc20-888d-7c7c-dbf1-afe8c34d2964.png "plot with labels")

![typerr.png](https://qiita-image-store.s3.amazonaws.com/0/46396/025dbdcc-3604-6093-f21d-c429f9fe95e7.png "plot with error legend")


# 参考資料
* [gnuplot home page][gnuplot]
* [GNUPLOT Version 5.0 Release Notes][gp5.0]
* [gnuplot 5.0 document][gpdoc5] (pdf)

[gnuplot]: http://www.gnuplot.info/
[gp5.0]: http://www.gnuplot.info/ReleaseNotes_5_0.html
[gpdoc5]: http://www.gnuplot.info/docs_5.0/gnuplot.pdf
CloudWatch Logsでログを気軽にチェックする

CloudWatch Logs使ってますか？

filter + カスタムメトリックスで簡単な監視を設定できるし、色々と便利ですよね。

アプリでエラーが発生した時も、カスタムメトリックスのアラートを使えば、通知もしてくれるので簡単な監視のシステムはこれでなんとかなる感じです。

しかし、アラートを検知してもそのログを一緒に通知してくれれば便利なんですが（Amazonさんお願いします！！）、原因を調べるためにSSHでサーバに入ってログを確認する必要があります。

けど、その都度サーバにログインして調べるのも、開発者にアカウントを発行してと言った設定も出てくるし、間違えて変なコマンドを実行されたら大変な事になります。

そこで、もっと気軽にログを見れる方法がないか考えてみたところ、CloudWatch Logsに送り込んでるログを見れるようにすれば、わざわざサーバにSSHしなくてもできるんじゃないかと思いました。

そんな訳で、スクリプトを書いた。
https://github.com/sparkgene/cloudwatch_logs_tail



# 使い方

オプション一覧

```
% ruby tail_cwlog.rb --help

Usage: tail_cwlog [options]
        --use-iamrole                USE IAM ROLE
        --aws-region=[VALUE]         AWS REGION
        --aws-access-key=[VALUE]     AWS ACCESS KEY
        --aws-secret-key=[VALUE]     AWS SECRET KEY
        --discribe-groups            Describe log groups
        --discribe-streams           Describe log streams
        --tailf                      tail -f log stream
        --tail=[VALUE]               tail log stream
        --log-group=[VALUE]          log group name
        --log-stream=[VALUE]         log stream name
```

CloudWatch Logsに登録されているLog Groupの一覧表示

```
% ruby tail_cwlog.rb --aws-region=ap-northeast-1 --discribe-groups

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
```

Log Groupに含まれているLog Streamの一覧取得

```
% ruby tail_cwlog.rb --aws-region=ap-northeast-1 --discribe-streams --log-group=/var/log/cron

server-apps-1
server-apps-2
server-apps-3
```

tail -100 みたいに過去のログを表示したい場合

```
% ruby tail_cwlog.rb --aws-region=ap-northeast-1 --discribe-streams --log-group=/var/log/cron --log-stream=server-apps-3 --tail=100

Feb 21 01:22:01 server-apps-3 CROND[2837]: (root) CMD (/var/awslogs/bin/awslogs-nanny.sh > /dev/null 2>&1)
Feb 21 01:23:01 server-apps-3 CROND[2863]: (root) CMD (/var/awslogs/bin/awslogs-nanny.sh > /dev/null 2>&1)
Feb 21 01:24:01 server-apps-3 CROND[2890]: (root) CMD (/var/awslogs/bin/awslogs-nanny.sh > /dev/null 2>&1)
```

tail -fみたいにログを監視したい場合

```
% ruby tail_cwlog.rb --aws-region=ap-northeast-1 --discribe-streams --log-group=/var/log/cron --log-stream=server-apps-3 --tailf

Feb 21 01:22:01 server-apps-3 CROND[2837]: (root) CMD (/var/awslogs/bin/awslogs-nanny.sh > /dev/null 2>&1)
Feb 21 01:23:01 server-apps-3 CROND[2863]: (root) CMD (/var/awslogs/bin/awslogs-nanny.sh > /dev/null 2>&1)
Feb 21 01:24:01 server-apps-3 CROND[2890]: (root) CMD (/var/awslogs/bin/awslogs-nanny.sh > /dev/null 2>&1)
```

`--tailf` オプションでは、デフォルトで最後の20行を表示して、ログの監視を行います。
5秒に1回ログを見に行きますので、サーバからCloudWatch Logsにアップロードされ、手元に届くまでタイムラグがあります。
よりリアルタイムで監視したい場合は、 スクリプトの中の`sleep(5)`となっている部分、調整して使ってください。

### 注意
CloudWatch Logsに格納されているデータをダウンロードする場合は、AWSの転送料及びAPI利用料がかかります。

http://aws.amazon.com/cloudwatch/pricing/

> Amazon CloudWatch API Requests
> $0.01 per 1,000 GetMetricStatistics, ListMetrics, or PutMetricData requests

> Amazon CloudWatch Logs*
> $0.50 per GB ingested**
> $0.03 per GB archived per month***
> Data Transfer OUT from CloudWatch Logs is priced equivalent to the “Data Transfer OUT from Amazon EC2 To” and “Data Transfer OUT from Amazon EC2 to Internet” tables on the EC2 Pricing Page(http://aws.amazon.com/ec2/pricing/).

ご利用は計画的に。
rasbianにZiproxyをインストール

##インストール

```
$ sudo apt-get install ziproxy
```

##設定

```
$ sudo cp /etc/zaiproxy/zaiproxy.conf /etc/zaiproxy/zaiproxy.conf.bak
```
一応設定をファイルをバックアップ

```
$ sudo vi /etc/zaiproxy/zaiproxy.conf
```
ファイルを開く

```
# Example of ziproxy.conf for Debian

############################
# daemon mode-only options #
############################

## Port to listen for proxy connections
## default: 8080
Port = XXXX

## Local address to listen for proxy connections
## If you have more than one network interface,
## it's useful for restricting to which interface you want to bind to.
## By default Ziproxy binds to all interfaces.
Address = "xxx.xxx.xxx.xxx"
```
portを変更
Addressのコメントアウトを外し、端末のIPアドレスを入力

##起動
```
$ sudo service ziproxy start
```

##サービス登録
```
$ sudo update-rc.d ziproxy defaults
```

以上
AWS上高可用性redmineサーバ構築

##AWS上冗長化構成（高可用性）redmineサーバ構築##

###環境###

- AWS利用
- マルチAZでサーバ２台（AmazonLinux 64bit)
- RDS:mysql
- S3バケット（デレクトリ）：mybucket/redmine


###構築手順概要###

 1). IAMRole作成
 mybucket/redmineへのフルアクセス権限付与

 2). EC2、ELB、RDS、S3バケット（デレクトリ）作成
 1)で作成したIAMRoleを指定

 3). redmineインストール（Apache、ruby、Passengerを含む）
 参考手順：http://blog.redmine.jp/articles/2_6/installation_centos/

 インストール先：/opt/redmine
 DB接続   host: xxxxxxxx.ap-northeast-1.rds.amazonaws.com

 4). S3fs導入
 https://code.google.com/p/s3fs/wiki/InstallationNotes
 マウントポイント：/mnt/redmine
 /etc/rc.localに自動起動設定

        IAMROLE=`curl http://169.254.169.254/latest/meta-data/iam/security-credentials/`
        /usr/bin/s3fs mybucket:/redmine /mnt/redmine -o use_cache=/tmp,iam_role=${IAMROLE},rw,allow_other,uid=48,gid=48

 シンボリックリンク作成：
/opt/redmine/files -> /mnt/redmine/files

 5). セッション管理をDBに変更(ActiveRecord)
 https://github.com/pencil/redmine_activerecord_session_store

 6). DNS登録（ELB)
DWRのEnum Converter

以下のサイトを和訳します。
http://directwebremoting.org/dwr/documentation/server/configuration/dwrxml/converters/enum.html

# Enum Converter
Enum Converterはデフォルトでは無効です。
Java5のEnumをJavaScriptの文字列に変換し、再び元に戻します。
このaconverterはデフォルトで無効な理由は、DWR makes sure that is has permission before it touches any of your code.

次のように１個のクラスを指定して、Enum Converterを有効にできます。

```xml
<convert converter="enum" match="your.full.package.EnumName"/>
```

# JavaScriptの変数を設定
簡単な例を紹介します。次のJavaコードがあるとします。

```java
public class Remoted {
  public void setStatus(Status p) {
    // ...
  }
}

enum Status {
  PASS,
  FAIL,
}
```

`Remoted`がCreaator設定されていて、Enum Converterで`Status`が変換可能ならば、次のようにJavaScriptからJavaコードを実行することができます。

```java
Remoted.setStatus("PASS");
```

列挙項目以外が見つかれば、Exceptionが発生します。
外部JavaScript自身のファイルパスを取得する

わりと確立した方法がなくていままでモヤモヤしてたんだけど、良さそうな方法を見つけたので備忘。
**[StackOverflowの回答](http://stackoverflow.com/a/984656/3101326)そのまま**なんですけどねw

```js
var current = (function() {
	if (document.currentScript) {
		return document.currentScript.src;
	} else {
		var scripts = document.getElementsByTagName('script'),
		script = scripts[scripts.length-1];
		if (script.src) {
			return script.src;
		}
	}
})();
```

JavaScriptファイルは順番に読み込まれるので、「直近」を取得すれば自分自身の`<script>`タグが取れるという。
ぜんぜん思いつかなかった。

ちなみに以下のように複数の`<script>`タグがあっても動いた。

```html:HTMLの例
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Test!</title>
	<script>var hoge = 'this is test';</script>
</head>
<body>
	<!--
	いろんなコンテンツ
	-->

	<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>

	↓こういったスクリプトファイル内で、自身のファイルパスを取りたい時につかう
	<script src="kono_path_wo_toritai.js"></script>


	<script type="text/javascript">
		// Disqusとか・・・
		var disqus_shortname = 'namae_desu';
		(function () {...
	</script>
    
	<script>
		// Google Analyticsとか・・・
		(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']...
	</script>
</body>
</html>
```

StackOverflowの回答にあるコードそのままだと、

```js
if (script.getAttribute.length !== undefined)
```

の部分が（なぜ必要か）よくわからなくて、IE8では動かなかった。
ので、単純に

```js
if (script.src)
```

としておいた。
「Date.new > 0」はなぜfalseなのか


こちらの記事を見て気になったので調べました。

[Ruby で Date.new > 0 は true か？それとも false か？ - Qiita](http://qiita.com/suginoy/items/c248b8a5fb41cdcc3465)

# マニュアル読んでみる

`>` `<` の挙動は `<=>` で決まるので、`Date#<=>`のマニュアルを読んでみます。

[instance method Date#<=>](http://docs.ruby-lang.org/ja/2.1.0/method/Date/i/=3c=3d=3e.html)

>self <=> other -> Integer
ふたつを比較し、-1、零、あるいは 1 を返します。
other は日付オブジェクトか、 天文学的なユリウス日をあらわす数値でなければなりません。

[class Date](http://docs.ruby-lang.org/ja/2.2.0/class/Date.html)
>ユリウス日

>ユリウス日は紀元前4713年1月1日 (ユリウス暦) 正午 (グリニッジ平均時) を 暦元とした通日 (経過日数) です。

>この文書で、天文学的なユリウス日とは、本来のユリウス日と同じものです。 また、年代学的なユリウス日とは、地方時における零時を一日の始まりとする 流儀です。

>この文書で、単に「ユリウス日」といった場合、それは本来のユリウス日でな く、「年代学的なユリウス日」を意味しています。

なるほど分からん。

# ソース眺めてみる

ソースを眺めてみたら、引数が数値なら`Date#ajd`と比較してるっぽかった。

## [ruby/date_core.c#L6262-L6282](https://github.com/ruby/ruby/blob/6b6ba319ea4a5afe445bad918a214b7d5691fd7c/ext/date/date_core.c#L6262-L6282)

otherがDateクラスでないなら`cmp_gen`呼んでるっぽい。

```c:d_lite_cmp
/*
 * call-seq:
 *    d <=> other  -> -1, 0, +1 or nil
 *
 * Compares the two dates and returns -1, zero, 1 or nil.  The other
 * should be a date object or a numeric value as an astronomical
 * Julian day number.
 *
 *    Date.new(2001,2,3) <=> Date.new(2001,2,4)	#=> -1
 *    Date.new(2001,2,3) <=> Date.new(2001,2,3)	#=> 0
 *    Date.new(2001,2,3) <=> Date.new(2001,2,2)	#=> 1
 *    Date.new(2001,2,3) <=> Object.new		#=> nil
 *    Date.new(2001,2,3) <=> Rational(4903887,2)#=> 0
 *
 * See also Comparable.
 */
static VALUE
d_lite_cmp(VALUE self, VALUE other)
{
    if (!k_date_p(other))
	return cmp_gen(self, other);

...
```

## [ruby/date_core.c#L6193-L6199](https://github.com/ruby/ruby/blob/6b6ba319ea4a5afe445bad918a214b7d5691fd7c/ext/date/date_core.c#L6193-L6199)

`cmp_gen`ではotherがNumericクラスなら自身の`ajd`メソッドを呼んでotherと比較してるっぽい。

```c:cmp_gen
static VALUE
cmp_gen(VALUE self, VALUE other)
{
    get_d1(self);

    if (k_numeric_p(other))
	return f_cmp(m_ajd(dat), other);
...
```
ほんとに適当ですが。

# Date#ajd, Date#jd

またマニュアルを見てみる。
[instance method Date#ajd](http://docs.ruby-lang.org/ja/2.2.0/method/Date/i/ajd.html)
>このメソッドは Date#jd と似ていますが、天文学的なユリウス日を返します。 時刻を含みます。

[instance method Date#jd](http://docs.ruby-lang.org/ja/2.2.0/method/Date/i/jd.html)
>ユリウス日を返します。 時刻を含みません。
Date#ajd も参照してください。

`Date.new.ajd`を見てみたらRationalで(-1/2)でした。
これと比較してるので`Date.new > 0 #=> false`なのでした。

```rb
require 'date'

Date.new.ajd #=> (-1/2)

Date.new == Date.new.ajd #=> true

Date.new == -1/2r #=> true
Date.new == -0.5 #=> true
Date.new > 0 #=> false
```

初期値がなぜ(-1/2)なのか？
さぁ。

(追記: コメントにて理由を教えていただけました！)

ちなみに今日のajdは(4914149/2)でした。

```rb
today = Date.today
=> #<Date: 2015-02-21 ((2457075j,0s,0n),+0s,2299161j)>

today.ajd #=> (4914149/2)

today.jd #=> 2457075
today.ajd.to_f #=> 2457074.5

[*Date.new(-4712)..Date.today].size #=> 2457076
```

時刻も含むってかいてあるけどこれ12時間刻みの時刻しか取得できないんじゃ？意味あるの？
よく分かりませんがとりあえずもうタイトルの謎は分かったからおわり。

(追記: これも、たぶんコメントでいただいたことと同じ理由だと思います。)

# 参考
[ユリウス通日 - Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5)
DWRのConverter

DWRのConverterについて、公式サイトを和訳します。

http://directwebremoting.org/dwr/documentation/server/configuration/dwrxml/converters/index.html

# The Converters

ConverterはDWRの必須な部分で、クライアントーサーバ間のmarshaling dataを返します。
以下のConverterを定義しないといけません。

1. DWRで使いたいJavaメソッドの戻り値の型。ブラウザで使われるJavaScriptオブジェクトを返すために、DWRはJavaの戻り値型をJavaScriptオブジェクトに変換する方法を、知る必要があります。

2. DWRで使いたいJavaメソッドの入力引数の型。Javaメソッドを適切に実行するために、DWRはJavaScriptオブジェクトをJavaオブジェクトに適切に変換する方法を、知る必要があります。

〜　途中　〜
# Basic Converters
raspbianにzabbix2.2のインストール

##MySQLインストール
```
$ sudo apt-get install mysql-server
```
インストール時にrootパスワード聞かれる

##Zabbixインストール
```
$ wget http://packages.osnz.co.nz/debian/osnz-release-wheezy.deb
$ dpkg -i osnz-release-wheezy.deb
$ sudo apt-get update
$ sudo apt-get install zabbix-server-mysql zabbix-frontend-php zabbix-agent
```
そのままapt-getすると1.8がインストールされるので、wgetしてからインストールする。
選択肢はYes、MySQLのパスワードを聞かれるので、上で設定したパスワードを入力

##設定

```
$ sudo vi /etc/apache2/conf.d/zabbix
```
でファイルを開き`php_value date.timezone Asia/Tokyo`とする
```
$ sudo v/etc/init.d/apache2 restart
```
apache再起動

##Zabbixセットアップ
`http://localshot/zabbix`にアクセス

Configure DB connection 画面で、上で設定したMySQLのパスワードを設定

##Zabbixログイン
`admin/zabbix`でログイン

以上
配列いじりの練習

#問題
>
配列の先頭はそのままに、先頭以外の要素をすべて0に置き換える

※[こちらのサイト](http://vipprog.net/wiki/exercise.html)から引用

#解答
```ruby:
# 配列の要素の数を指定
# 今回は例に従い5
ARRAY_NUMBER = 5

# 入力となる配列
input_array = []

# 配列には0〜9の乱数を入れる
ARRAY_NUMBER.times do
  input_array.push(rand(0..9))
end

# 入力となる配列の表示
puts "入力となる配列"
print "#{input_array}\n"

puts "先頭以外の要素を全て0にします"

# 先頭以外の要素を全て0に置き換える
1.upto(ARRAY_NUMBER - 1) do |index|
  input_array[index] = 0
end

# 置き換えた配列を表示
print "#{input_array}\n"
```

#結果
```
入力となる配列
[6, 6, 5, 0, 3]
先頭以外の要素を全て0にします
[6, 0, 0, 0, 0]
```
メモ：デブサミ2015 20-E-4 こまで来た！Google Cloud Platformの真価と進化

Googleの方による Google Cloud Platformの解説スピーチのメモ。
見逃し、聞き逃し多数のため、間違いがあるかもしれないので参考程度。

Google Cloud Platform(GCP)は、グーグル社内のプラットフォームと同じものを利用している。グーグルのプラットフォームは、ノードは壊れるものだから、取り替えて止まらないようにするポリシー。

グーグルのデータセンターは世界に１３カ所あり、土地建物から、グーグルの所有。アジアには、シンガポールと台湾にある。日本からの RTTは、50-60ms。
バックボーンのエッジペアリングポイントは、３３カ国７０カ所にある。

GCPは、以下で構成される。
* コンピュート
* ネットワーク
* ビッグデータ
* マネジメント
* ストレージ
* モバイル
* 開発ツール

コンピュートは、Compute Engine、Container Engine、App Engineで構成される。
ネットワークは、リージョンを超えたVPNがある。
ビッグデータは、BigQuery、PubSub、データフローで構成される。データフローは、SQL以外のことでHadoopぽいことをするためのもの。現在はまだアルファで一般公開されていない。
マネジメントは、モニタリングで、STACKDRIVERを買収し、統合している。
ストレージは、Cloud Storage、Cloud SQL、Cloud Datastoreで構成される。
モバイルは、Firebaseを買収し、統合中。統合は、まずアカウント統合し、データを移行する。

ComputeEngine について、マーケティング的な言い方としては、クオリティ、スケール、低コスト。
ストレージは暗号化され、リージョンを超えてもプライベートネットワークが使え、ユーザーのVMを停止させずにメンテナンスされる。
5分間に、1000ノード起動できる。1VMは、20-40sec で起動する。
同じインスタンスタイプは、（他社と異なり）どれも同じ性能になっている。
１分単位で課金され、継続利用するほどにディスカウントがある。一時間以内に終了するバッチ処理のようなものでは、コストメリットがある。

永続化ディスクは、最大10TB、SSDや物理ローカルSSDなどもあり、680k READ IOPSを達成する。HadoopやCassandraなどのパフォーマンスがよい。

リージョン内のVM同士のネットワーク帯域は8Gbps。スタックは内製のアンドロメダ。TCPのスループットは、最初 2-3Gbpsだったが、現在は 7-8Gbps。

メンテナンスは、ライブマイグレーションを行っており、VM起動したまま、別のインスタンスに動かしている。厳密には、VMを停止して起動する瞬間があるが、アプリにはわからない。
コマンドラインは、わかりやすく HTTP JOSN API。
Web UI上から、SSHクライアントが起動でき、簡単にログインできる。
SyslogやMySQLなどのログもWeb UIから確認でき、Cloud Storageに転送したり、BigQuery にストリームできる。

アプリ開発者からすれば、IaaSは面倒なので、App Engineを使えば、グーグルが自動的にスケールアウトする。
BigQuery は、１秒間に１０万行インサートでき、容量無制限。

グーグルは、データセンターはコンピュータの集まりではなく、１つのコンピュータとして考えている。

登録から６０日間無料で、セミナーもやっている。
Android 画像の追加 超基礎

*正解か分からないので注意
drawable　右クリック
New>ImageAsset>適当に選ぶ>image fileを選択(右の…ボタン)>で必要な画像を選択
![Screen Shot 2015-02-20 at 20.11.38.png](https://qiita-image-store.s3.amazonaws.com/0/55731/98a4679d-13a6-301a-4ed4-c4dca89d3391.png)

![Screen Shot 2015-02-20 at 20.15.05.png](https://qiita-image-store.s3.amazonaws.com/0/55731/3f35020b-51f2-6fd1-5a78-2ee9aeb4bf9e.png)
gemを公開するまでのメモ


初めてgemを公開したので備忘録として．

# gemを作る

```ruby
bundle gem <なまえ> -t
```
<なまえ> に "-"(ハイフン)が入ってるとネストした構成で生成される．
プラグインなど既存のgemの拡張などは、"-"(ハイフン)で区切った名前にするとよい．
例) `capistrano` に対する `capistrano-ext`

単純に単語を区切る目的なら、"_"(アンダースコア) を使用するとよい.

次に `<なまえ>.gemspec` の以下を修正

- `spec.name` gemの名前． <なまえ> にあわせておけばOK
- `spec.summary` 超簡単な説明
- `spec.description` 簡単な説明
- `spec.homepage` 特に作ってない場合はGithubのページを指定とけばOK
- `spec.add_development_dependency` 開発で使うgems．必要な分だけ並べる
- `spec.add_dependency` このgemを利用する際に依存しているgem. 必要な分だけ並べる．

`spec.add_development_dependency`と`spec.add_dependency`は `Gemfile`から移動する．
代わりに、`Gemfile`はこんなかんじになる．

```ruby
source 'https://rubygems.org'
gemspec
```

肝心のコードは、`lib/<なまえ>.rb` に書く．
ちなみにいくつかgemを覗いてみたところ、`lib`以下にはロードパスが通るので、`lib/<なまえ>.rb` には `lib/<なまえ>/*.rb` を `require` するだけになっているgemも多かった．

## 試しにローカルにインストールしてみる
```
$ rake build
$ rake install
```

```
$ irb -r<なまえ> 
```

で、エラーがでなければ多分大丈夫．

参考: http://masarakki.github.io/blog/2014/02/15/how-to-create-gem/

# gemを公開する

## Githubの場合
ユーザ登録なりリポジトリ作ったりは省略．
公開はpushするだけでOK．ただし公開したgemsを利用する場合、`Gemfile`にはリポジトリのパスを書かなければならない．

```Gemfile
gem '<なまえ>', github: "<Githubのユーザ名>/<なまえ>"
```


## Rubygemsの場合
### 認証
pushするマシンで、認証情報を最初に1回だけ取得する．

```shell
$ curl -u <RubyGemsのユーザ名> https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials

Enter host password for user '<RubyGemsのユーザ名>':
```
で、RubyGemsのパスワードを入力する．

### 公開する
以下のコマンドで、現在のバージョンでタグ打ってRubygemsにpushしてくれる．

```
$ rake release
```

こっちで公開しておけば、`gem install <なまえ>` や、 `Gemfile`に `gem <なまえ>` と書くだけで利用できる．

参考: http://guides.rubygems.org/make-your-own-gem/
メモ：デブサミ2015 20-A-3 GitHub Isights from Researching Growth

Githubのアナリティクスチームで、人間行動を研究してる方と解析ツールを開発している方のスピーチのメモ。
見逃し、聞き逃し多数のため、間違いもあるかもしれない。あくまで参考程度。
スライドのURL (http://sssslide.com/speakerdeck.com/chrissiebrodigan/github-insights-from-researching-growth)


人間の体験について、数字から何かを見つける。
数字で見つけられないパターンを探す。

グロースための３つの考え
* 定量的と定性的を組み合わせる
* マイルストーンを設定する
* ツールを作成して自動化する

「プルリクエストが少ないのはなぜなのか」を課題とした。
トラフィックとサインナップは多いが、プルリクエストは多くない。

GitHubは、知り合いの開発者のために始めたので、初期ユーザーのことは
よくわかっていたが、現在のユーザーのことを知るのは、難しい。
現在は、開発者以外の人も使っている。GitHubに登録しても、頭のよい人でも、うまく使えず、二度と使われなくなる。新しいユーザーがどんな人なのか、何が欲しいのか、学ぶ必要がある。

５つの入力
* 定量的データ（アナリティクス）
* 定性的データ（ストーリー）
* A/Bテスト
* 直感と経験（専門性）
* 共感（ユーザーへの気遣い）

データには価値があるが、賢く使う必要がある。

簡単なプロジェクトでゆっくり慎重に始める。
GitHubとはワークフローであるので、将来のアクティビティを予測するワークフローに注目する。

マイルストーン
* ユーザーマイルストーン（アクティビティ）
* ソーシャルマイルストーン（スターやフォロー）
* ワークフローマイルストーン（コメント、イシュー、プルリクエスト）
* コードマイルストーン（リポジトリやプッシュ）

マイルストーンを共通ボキャブラリーとして（チームで）パフォーマンスについて話す。

ある時期の米国の登録ユーザー５％でのアンケート結果
* プログラミングしたい　６８％
* Git未経験　７６％
* コードが書ける　６０％
* オープンソースを開発したい　５０％
* プロジェクト持っていない　５８％

マイルストーンとアンケートデータとインタビューでペルソナを作る。

データが得られても分析が大変な作業だから、ツールが必要。
A/Bテストする内部ツールなどの開発。

（変更に際し）４つのキーになる質問
* それはいい変更か
* どのくらい、いい変更か
* 統計的には、どうか
* 全体像を把握しているか

統計ができない社員も含め、社員全員が、ユーザーを研究できるようにするツール（Frequency）を開発。

課題「登録から４週間以内にプルリクエストするユーザーを増やせるか」

ユーザーを３つのグループに分けてテスト実施
1. コントロール群（今までと同じ登録後の説明画面）
2. 新しいブートキャンプ（新しい登録後の説明画面）
3. Hello Worldチュートリアル（実際にやってみる説明）

3.は、２〜５％ほどスターをつけるのが下がるが、プルリクエストは７５〜８６％高くなる。
GitHub では、リテンション（戻ってくるユーザー数）よりプルリクエストが重要。

学んだこと
* 定量的と定性的を合わせる
* マイルストーンを作る
* ツールを開発する


３つのこと
* あなたのユーザーが使い続ける理由は何か
* あなたのマイルストーンは何か
* あなたに必要なツールは何か
Font Awesomeをコンポーネント化


Font Awesomeを普通に使うなら...

```html
<i class="fa fa-camera-retro"></i>
```

と書くわけですが、

```html
<fa icon="camera-retro" />
```
って書けると幸せだよね、ということで[Riot.js](https://muut.com/riotjs/)用に作ってみました。[コードの全体はこちら](https://github.com/cognitom/riot-kitchen/blob/master/components/fa.tag)。

```html
<fa>

  <style>
    @font-face {
      font-family: 'FontAwesome';
      src: url('<フォントのURL>') format('woff'), url('<フォントのURL>') format('svg');
      font-weight: normal;
      font-style: normal;
    }
    fa {
      display: inline-block;
      font: normal normal normal 14px/1 FontAwesome;
      font-size: inherit;
      text-rendering: auto;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      transform: translate(0, 0);
    }
  </style>

  <script>
    GLYPHS = {
      'glass': 'f000',
      'music': 'f001',
      'search': 'f002',
      'envelope-o': 'f003',
      'heart': 'f004',
      'star': 'f005',
      ...
    }

    this.root.innerHTML = '&#x' + GLYPHS[opts.icon] + ';'
  </script>
  
</fa>
```

2倍3倍表示とか回転とかは省いていますが、このシンプルさ、伝わるでしょうか...?

## 使ってみます

Riot.jsの作法に従ってマウントします。この例では、ブラウザ内でコンパイルしていますが、他のコンポーネントとまとめてプリコンパイルする方がオススメです。

```html
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>Font Awesome is awesome!</title>
</head>

<body>
  This is my <fa icon="camera-retro"></fa>.
  
  <script src="components/fa.tag" type="riot/tag"></script>
  <script src="https://cdn.jsdelivr.net/g/riot@2.0(riot.min.js+compiler.min.js)"></script>
  <script>riot.mount('*')</script>
</body>

</html>
```

![Font Awesome is awesome!.png](https://qiita-image-store.s3.amazonaws.com/0/1858/829d8a87-0b5d-b3be-5310-ac1ffc573a27.png "Font Awesome is awesome!.png")

## 参考

参考にPolymerとReactによる実装のリンクも。どちらも、Font AwesomeのCSSを別途読み込む形になっています。バージョンの追従を考えるといたしかたないのかなとも思いつつ、ただラッピングしてるだけって「コンポーネント」としてはどうなんだろう。

- [polymer-fontawesome](https://github.com/code-maverick/polymer-fontawesome) - Polymerによる実装例
- [react-fa](https://github.com/andreypopp/react-fa) - Reactによる実装例
世界のクラウド市場はどうなってる？

#はじめに

実は２か月ちょっと前（２０１４年の年末）から、AWS (Amazon Web Service) の無料枠を使ってウェブサイト[(よろしければお立ち寄りください。)](http://bonk.red) を立ち上げてみました。最近ではコンテンツも増えてますます嵌っています。

ところで、クラウドと言う言葉ですが、割と新しい言葉です。昔から似たようなサービスはありましたが、Wikipedia によると「2006年のGoogleのCEOであるエリック・シュミットによる発言が最初とされ、Google App EngineやAmazon EC2などが登場した2006年から2008年頃にかけて普及した。」となってます。

ということで、気になるクラウドの世界シェアはどうなっているか調べてみました。

 
#クラウドのシェアはこうなっていた

下のグラフは、["atoll project"](http://www.atoll.jp/2014/08/2014q2.html) というサイトに出ていたものです。

![cloud_share.png](https://qiita-image-store.s3.amazonaws.com/0/62802/902ef55e-e370-59eb-ebc8-b025520455f7.png)


##第１位 AWS

やはりと言うか、AWS (Amazon Web Service) が強いですね。ダントツの一位で他を引き離しています。サービスの充実度、実績、料金、どれをとっても AWS が優位ですからね。何しろ、無料で１年間使い放題（ただしすべてのサービスではない）と太っ腹ですが、たぶん１年間使うと手放せなくなる人が多いんじゃないでしょうか。

##第２位 Microsoft Azure

２位は Microsoft Azure です。Azure は「空色の」という意味ですが、クラウド（雲）を包み込む大きな野望を抱いているんでしょうか。ところで、Azure の発音ですが、カタカナであえて書くと「アージュウ」みたいに聞こえます。

Azure ですが、Windows だけのサービスかと思いきや Linux もサポートしているんですね。次期 Visual Studio にはこの Linux で動作するアプリ開発機能も盛り込まれるとかどこかに書いてありました。

##第３位 Salesforce

Web 広告も見たことないし Salesforce が３位とは知りませんでした。しかも、Microsoft に肉薄しています。会社案内には「セールスフォース・ドットコムは、世界最大のクラウド型 CRM（顧客管理） ベンダーです」と書いてあります。社名の通り「営業支援」を通したクラウドサービスを提供しているようです。

##第４位 IBM

Salesforce からちょっと引き離されての第４位です。IBM の性格からいって、たぶん、顧客は大企業でしょうし、システム開発と込みでクラウドサービスを展開してるんでしょうね。シェアは４位でも儲けはすごいのかもしれません。

##第５位 Google

Google もクラウドをやっているのは知っていましたが、第５位に甘んじています。企業向けだけでなく、個人向けのサービスにも力を入れているようです。料金は AWS 並みで安めですが、サービスや性能は見劣りしますね。

##第６位 富士通

第６位に日本の富士通が入っていました。主に国内向けのサービスでしょうけど、企業の性格からいって、IBM のような大企業相手の商売だと思われます。システム開発込みでサービスを提供して儲けてるんでしょうね。

##第７位 NTT

日本の NTT が第７位に入ってました。NTT と言ってもたぶん NTT Com でしょうか。こちらも主に国内向けのはずですが、やはり企業向けだと思います。


[原文はこちら](http://bonk.red/php/jiki/show.php?id=14) リンク、引用は原文にお願いします。
必須と必要の違い

仕様書を書いていると「必須入力」というように「必須」という言葉をよく使ったり聞いたりします。
しかしながら、必須って学校で習った記憶がなく、しいていえば「必須科目」くらいを聞く程度だったします。
ふと、必須と必要の違いって何だろう？　と早速検索してみました。

すると、同じ疑問をもたれた方がすでに質問されていて回答もついておりました。
[「必要」と「必須」の違い？？？](http://questionbox.jp.msn.com/qa815460.html)

ひっ‐す【必須】
(ヒッシュの慣用読み。ヒッスウとも) 必ず須いる（もちいる、と読みます）べきこと。必ずなくてはならないこと。「―の条件」「―科目」

ひつ‐よう【必要】‥エウ
(幕末・明治期につくられた語) 必ず要すること。欠くことのできないこと。なくてはならないこと。必用。必須。「―にせまられる」「―不可欠」


へー、必要って幕末・明治期につくられた語で新しい言葉だったんですね。
必須と必要は意味合い的には同じであるけれど、必須は「必要の中の必要」、必要だけどなくてもいい場合もあるので、そういう時は「必須」とはいわない。「必須＞必要」

必須と必要を英訳でみると、必須は「must」で必要は「need」となっております。

さらに、必須って学校で習ってないなと思って調べてみると、【須】の漢字は実は2010年に29年ぶりに常用漢字が改訂されたことで初めて常用漢字となったのです。それまで常用漢字でなかったが為に、学生時代に習ってないわけです。
しかしながら、新聞協会では常用漢字以外にも新聞に用いることができる漢字を独自に39文字定めていて、その中に【須】は含まれていました。
http://www.taishukan.co.jp/kanji/qa02.html#Q0068
そうしないと、横須賀とは那須高原とかが使えないですからね。

[新常用漢字で追加された129文字](http://dictionary.sanseido-publ.co.jp/wp/2010/06/18/joyo2/)
茨城の「茨」・岡山や福岡の「岡」・埼玉の「埼」・大阪の「阪」・熊本の「熊」・鹿児島の「鹿」・栃木の「栃」・奈良の「奈」・山梨の「梨」・愛媛の「媛」・岐阜の「阜」も常用漢字となり、全都道府県名の漢字が常用漢字となりました。でも、今までなぜこれらの漢字が常用漢字でなかったのかにびっくり。

[「須」という漢字の左側にある部首名を教えて下さい。](http://www.taishukan.co.jp/kanji/qa02.html#Q0062)
「彡」(さんづくり)というのは、もともと、模様を表す漢字です。
「形」「彩」「彫」「影」など、「彡」を部首に持つ漢字には、模様に関係する意味を持つものが多いのです。
一方、「須」は、もともと「あごひげ」を表す漢字です。
あごひげは顔に生えるものですから、もともと頭とか顔とかいう意味を持つ「頁」の部首に所属する、ということになるのです。
変数名やDBカラム名での連番の付与方法

保守作業をしていて、定義済みの変数名やDBカラム名にやむなく連番に付与して対処することがままあります。
例えば、あるテーブルのカラム名にcommentがあり、もう１つcomment列を追加する場合、単純に連番で対応したります。
その時に連番を付与するとしたら、どのように付けるのか？ 既存の名称は変更出来ないものとする。

例1
comment
comment1

例2
comment
comment2

やはり例2のように、commentの次はcomment2にするのが一般的なのかと。
映画のタイトルを考えてみても、「エイリアン」の次は「エイリアン２」だし、「バイオハザード」の次は「バイオハザード２」である。「エイリアン」の次に「エイリアン１」とは付けない、それだと同じ物として扱いと思われてしまうのだから。
プログラムの変数名であってもこれと同じ考えで付ければいい。

既存の名称を変更可能であるということであれば、commentをcomment1に変更して
comment1
comment2
としてしまえば、名前＋連番で処理するような時には便利である。
NumberのスペルとＮｏ.の表記の違い

とある仕事で、日本語からプログラムの変数名に変換していた時に、「Number」の略が「Nu」ではなく「No」になっていることに今更気が付き、おもわず検索してみた。

『NUMBER』の語源である『NUMERO』はラテン語で「数字」を意味するそうです。
『NUMBER』を省略した際に、「NO.」と記入するのは、この『NUMERO』という単語の先頭の「N」と最後の「O」を取り、さらに省略したという意味のピリオドをつけるため「NO.」と書くのだそうです。 
または、日本の製本関係でのページ番号を示すノンブル(Nombre)がフランス語由来で、フランス語のNombre(数)の省略形の「No.」が一般に浸透した。

ラテン語やイタリア語，フランス語など，ラテン系の言語は，ときどき頭と終わりで略語を作る。Mr. (mister) Mrs. (mistress) Dr. など。

【参照】
[ナンハ゛ーのスペルに「Ｏ（オー）」は無いのに、なぜ Ｎｏ．と書くのでしょう](https://web.archive.org/web/20120808184529/http://www2.plala.or.jp/kamkamkam/gimon7/310/310.htm)
[NumberのスペルとＮｏ.の表記の違い](http://oshiete.goo.ne.jp/qa/24290.html)
送ってしまったメールを破棄したい(自前のメールサーバでの話)

## 課題

メールを送ったがやっぱりなかったことにしたい。

## 前提

* 自分がsudoできて、そのメールサーバを自由に操作できること
* Maildir形式でのお話。
* 相手がまだメールクライアントで受信していないこと。

## 方法

* /home/相手のユーザ名/Maidir/new/`タイムスタンプ.ホスト名`

のsubjectを読んで対象メールを確認し、さっくり`rm`すればよい。
1年間に存在する金曜日と土曜日の日数を簡単にカウントする方法


## やりたいこと

2014年に存在する金曜日と土曜日の日数を数えたい。

## 方法

rails consoleでこんなふうにコードを打ち込みます。

````ruby
cd (Railsアプリがあるディレクトリ)
rails c
Loading development environment (Rails 4.2.0)
irb(main):001:0> '2014-01-01'.to_date.all_year.count{|d| d.friday? or d.saturday? }
=> 104
````

どうやら2014年の金曜日と土曜日は **104日** あるみたいです！

## コードの解説

`String#to_date`と`Date#all_year`はRailsで提供されている便利メソッドです。

`to_date`は文字列をDate型に変換し、`all_year`はその年の1月1日から12月31日までのRangeを返します。

```ruby
irb(main):018:0> date = '2014-01-01'.to_date
=> Wed, 01 Jan 2014
irb(main):019:0> range = date.all_year
=> Wed, 01 Jan 2014..Wed, 31 Dec 2014
```

`Enumerable#count`はその名の通り、コレクションの中から特定の条件に合致するオブジェクトの個数を数えるRubyの標準メソッドです。

また、`Date#friday?`と`Date#saturday?`もその名の通り、金曜日、もしくは土曜日であれば`true`を返すRubyの標準メソッドです。

つまり、以下のコードは1年間の日付の中で、金曜日、または土曜日に合致する日付の個数を数えるコードになります。

```ruby
irb(main):021:0> range.count{|d| d.friday? or d.saturday? }
=> 104
```

上記のコードをひとまとめに書くと最初に示したコードができあがります。

```ruby
irb(main):001:0> '2014-01-01'.to_date.all_year.count{|d| d.friday? or d.saturday? }
=> 104
```

## まとめ

RubyとRailsのメソッドって本当に便利！！

日常的なちょっとした疑問にも簡単に答えが出せますね～。

### あわせて読みたい

以下の記事では日付や日時の扱いの注意事項をまとめています。

- [RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い](http://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c)

### おまけ：なんで金曜日と土曜日の日数を数えてるの？

なぜ金曜日と土曜日の日数を数えようと思ったのか？
それは僕の妻がやっているパン屋さんの営業日が金曜日と土曜日だからです・・・。

ちょっと所用で営業日の日数を数える必要があったのでこんなコードを書いていたのでした。

http://coupe-baguette.com/
![Screen Shot 2015-02-21 at 8.00.21.png](https://qiita-image-store.s3.amazonaws.com/0/7465/5058217d-50f5-c62e-3850-afb1971bbd58.png "Screen Shot 2015-02-21 at 8.00.21.png")
JaSST 2015 Michael Bolton の基調講演を一言でまとめると...

JaSSTの基調講演 Michael Bolton の「How to Get What You Want From Testing」のまとめ。

![TestersLightTheWay.png](https://qiita-image-store.s3.amazonaws.com/0/51055/c163c498-d147-9616-35da-be24885123bf.png)

（※写真は実行委員会の許可を得て掲載）


の内容をざっくりまとめると、

>**テストの中心はテスター（人間）だ。例えばテストが退屈だと感じたら何かが間違っている。我々の仕事は工場の組み立てラインとは違う。テストケース、という言葉が「数えられる」ために管理者は好きだ。でも、大切なものには数えられないものもある。例えば子供を育てること。「ペアレントケース」で測ったりしない。Checking と Testing を分けたい。Checking は機械的に可能なこと。これをやると飽きる。Testing は人間にしかできないこと。Testing は学習プロセスであり、フィードバックと適応の繰り返しである。テストにおいてバグでなくても「何かがしっくりこない」という「感情」を大切に。心配事。それを「物語」にして伝えよう。単なる「データ」でなく「情報」としてプロダクトオーナに伝えるのだ。**

です。マインドマップ付けておきます。英語ですけど。。。関さんの記事のお役にたてれば。

ぼくが会場で講演の後にした質問は、「別の組織としてテスト部門や品質保証部門は必要か」です。長く答えてくれてありがとう、答えは、、、別記事にて。


![MichaelBolton.png](https://qiita-image-store.s3.amazonaws.com/0/51055/dd708214-4334-b2ef-44d8-4f92cbd7b1b9.png)

画像: https://qiita-image-store.s3.amazonaws.com/0/51055/dd708214-4334-b2ef-44d8-4f92cbd7b1b9.png
Illustratorファイルのバージョン情報を整理してみる

[ExifToolでIllustratorファイルのバージョンを調べる方法](http://qiita.com/monokano/items/e5b29c32a2e331e93985)の続きです。
各バージョンのIllustratorファイル（ai、eps、下位バージョン保存）を用意して、上記の方法で情報を取得してみました。
その結果を整理してみます。

##CreatorTool（作成バージョン）
* .aiはv9以降、.epsはv11以降に存在する。
* 記述は保存バージョンというより保存アプリ名。とくにv16以降はCSやCCの呼称で記述される。
* v16以降はOSの情報（MacintoshまたはWindows）がある。
* 例：Adobe Illustrator 10.0.3／Adobe Illustrator CS2／Adobe Illustrator CC 2014 (Macintosh)
* Bridgeの「アプリケーション」に表示されるのはここの記述。
* **要注意** 別名保存をしないと更新されない致命的な欠点がある。

##AI8_CreatorVersion（作成バージョン）
* v8以降に存在する。
* v8未満でも、v8以降で下位バージョン保存したものには存在する。
* aiとepsの両方に存在する。どちらも同じ記述。
* 詳細なバージョン情報。
* 例：8.0.1／13.0.3／15.1.0／18.1.1

##Creator（保存バージョン）
* すべてのバージョンに存在する。
* aiとepsの両方に存在する。どちらも同じ記述。
* 記述は保存バージョンというより保存アプリ名。CreatorToolと違い、呼称ではなくバージョン番号で記述される。
* v9以降のepsファイル。
  * Creatorは2箇所あり、「1番目＝作成バージョン、2番目＝互換バージョン」と考えられる。
  * 下位バージョン保存した場合、2番目は実質的に保存バージョンと見なせる。
  * しかし、同バージョン保存した場合、例えば「1番目：v15.1、2番目：15.0」となるので、2番目を保存バージョンと見なすのは不可。
  * 2番目のCreatorのメジャーバージョンが作成バージョンと同じなら、保存バージョンは作成バージョンと同じと見なせる。
* aiファイル
  * Creatorは1箇所のみで、互換バージョンである。
  * 下位バージョン保存した場合、実質的に保存バージョンと見なせる。
  * 同バージョン保存した場合、保存バージョンと見なすのは不可。メジャーバージョンが作成バージョンと同じなら、保存バージョンは作成バージョンと同じと見なせる。
* 例：Adobe Illustrator(TM) 5.5J 95.01.01／Adobe Illustrator(R) 8.0／Adobe Illustrator(R) 15.0／Adobe Illustrator(R) 17.0

##考察
* CreatorToolはCS以前の作成バージョン取得に難がある。さらに別名保存をしないと更新されないのが致命的。
* AI8_CreatorVersionは作成バージョンを詳細に安定して取得できる。
* Creatorをそのまま保存バージョンと見なすことはできない。

##その他
* ExifToolを利用したバージョン取得は、aiなら速いが、epsはファイルサイズが増えると幾何級数的に遅くなる。

##作成バージョン取得に利用できるタグの有効範囲
![tag_table.jpg](https://qiita-image-store.s3.amazonaws.com/0/27806/08416082-1ba7-7741-8e6f-8a1f3185b6ea.jpeg)

##Mac版アプリ
この記事を書いた後に、Illustratorファイルのバージョン情報を検出するMac版アプリを作って公開しています。

* [Glee Ai](https://hackmd.io/s/Hy9qg7G3M)
* [Ai File Version](https://hackmd.io/s/HkBD8xXhG)
mrubyにCで追加したメソッドで文字列を返すには

# 背景

C言語で文字列を扱う場合、char*型を使うが、mrubyにC言語でメソッドを追加するような
場面では、当然mruby内で扱える型mrb_valueを返す必要がある。

要するにこのchar*からmruby内で扱える文字列型に変換する方法が、自分のGoogle力ではなかなか探しだせなかった。

メソッドで受け取った引数を加工して返す系のコードはごっそり見つかったけど、メソッド内のCの文字列を単純に返すというものがなかなか見つからなかった。

# mrubyでC APIで取得した文字列を返すには

## mrb_str_newを使えば出来た。

文字列の先頭アドレスと長さを指定する必要ある。

以下、謎のサンプルコード。

```c
#ifdef __APPLE__
mrb_value get_procpathname(mrb_state* mrb, mrb_value self)
{
	int ret;
	pid_t pid;
	char pathbuf[PROC_PIDPATHINFO_MAXSIZE];

	pid = getpid();
	ret = proc_pidpath(pid, pathbuf, sizeof(pathbuf));

	return mrb_str_new(mrb,pathbuf,strlen(pathbuf));
}
#endif
```

# 関連記事

- [mrubyでselfを呼び出されたメソッドのインスタンスとして実行するには](http://abrakatabura.hatenablog.com/entry/2015/05/08/192104)
- [rubyの代わりにmrubyをつかう→はやくならなかったorz](http://abrakatabura.hatenablog.com/entry/2016/01/18/094003)
- [mrubyでPostgres.appを使って、LOBも扱ってみた](http://abrakatabura.hatenablog.com/entry/2016/06/14/222417)
- [mruby-juliaでPythonもmrubyから呼び出せるようになった](http://abrakatabura.hatenablog.com/entry/2016/07/02/183532)
- [TLで「mruby」を検索したらmrubyのコントリビュータになれた](http://abrakatabura.hatenablog.com/entry/2016/07/08/200924)
- [mrubyでaobenchを動かし、GIFアニメを出力できるようにした](http://abrakatabura.hatenablog.com/entry/2016/07/23/175937)
- [GPUを使って、mrubyでのaobenchを更に速くした](http://abrakatabura.hatenablog.com/entry/2016/08/09/072405)
- [mrubyでHTTP/1.1のKeep-Aliveで複数回リクエストを出してみた](http://abrakatabura.hatenablog.com/entry/2016/08/31/073055)
- [cordovaのプラグインを作ってkindle fireでmrubyを動かしてみた](http://abrakatabura.hatenablog.com/entry/2016/09/21/070123)
- [mrubyのFile.openをちょっと調べたメモ](http://abrakatabura.hatenablog.com/entry/2016/10/04/065646)
- [iOSでもCordovaプラグインを作ってmrubyを動かした](http://abrakatabura.hatenablog.com/entry/2016/10/08/072147)
- [mruby-ioでclose_writeを実装したが、不要だった件](http://abrakatabura.hatenablog.com/entry/2016/11/08/203704)

- [Windowsでmruby-http2を動かした](http://abrakatabura.hatenablog.com/entry/2017/01/24/121826)
- [Windows(MSVC)でmrubyからGPU対応のTensorflowを動かせた](http://abrakatabura.hatenablog.com/entry/2017/01/28/125353)
- [mrubyでWebカメラを黒い画面にそのまま表示できるようにした](http://abrakatabura.hatenablog.com/entry/2017/02/25/080830)
- [WindowsでDLLを作ろうとしてmrb_context_runの歴史を調べた](http://abrakatabura.hatenablog.com/entry/2017/06/25/094547)
- [WindowsでmrubyからGoで作ったライブラリを呼び出して、Webカメラの画像をコマンドプロンプトに表示した](http://abrakatabura.hatenablog.com/entry/2017/09/01/072123)
Gmailアプリをインテントで呼び出す

自作のアプリからGmailアプリにファイル添付などして起動させたい場合。setPackageでできました。

```
Intent intent = new Intent(Intent.ACTION_SEND);
String[] strTo = { getString(R.string.mailto) };

intent.putExtra(Intent.EXTRA_EMAIL, strTo);
intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.mail_subject));
intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.mail_body));

Uri attachments = Uri.parse(image_path);
intent.putExtra(Intent.EXTRA_STREAM, attachments);

intent.setType("message/rfc822");

intent.setPackage("com.google.android.gm");

startActivity(intent);
```
%%%%%%%%%%%%%%% == 空文字列


Rubyで`%%%%%%%%%%%%%%%`を実行すると空文字列(`""`)が得られる。
ちなみに`%`の数は15個。

# 他の数のときは？

`%`を1つずつ増やしてevalさせてみると、最初は3つの時に空文字列を得られた。
以降は4ずつ増えたときにも得られる。
数が違うと`SyntaxError`。

```rb
def eval_p(n)
  eval "%" * n
rescue SyntaxError
end

(1..100).select{|n| eval_p n }
#=> [3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63, 67, 71, 75, 79, 83, 87, 91, 95, 99]
# 最初だけ3、以降は4ずつ増えてる

(1..100).map{|n| eval_p n }.compact
#=> ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]
# ぜんぶ空文字列
```

# 理由

`%%%`が空文字列だった。
これはよく考えたら`%||`とかと同じ。(→[リテラル > %記法](http://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fliteral.html#percent))

じゃぁ4増えたときは？

`%%%%%%%`はまず最初の`%%%`で空文字列ができる。
その空文字列に`%`メソッドが呼ばれる。(→[instance method String#%](http://docs.ruby-lang.org/ja/2.2.0/method/String/i/=25.html))
引数は空文字列`%%%`。

だから`"" % ""`と同じ。
その後もずっと`"" % "" % "" % ""`と連鎖してくだけ。

ためしに`%`メソッドにちゃんとした文字列を渡してみる。

```rb
puts %%\%s% % %%まうまう%
#=> まうまう
```
`%%hoge%`の中で`%`を使う場合は`""`とかと同じく`\`でエスケープする。

他にも`%--%%--%%--%%--%%--`みたいにいくつもパターンある。

# おまけ

`puts`のキモい代替。

```rb
$><<%%\%s\n%% "hello world"
#=> hello world
```

今回のことを応用して無限に伸ばせる。

```rb
$><<%%\%s\n%%%%\%s%%%%\%s%%%%\%s%%%%\%s%%%%\%s%%%%\%s%%%%\%s%% "hello world"
#=> hello world
```

ちなみに最後の`%`を5個にしても動く。

```rb
$><<%%\%s\n%%%%% "hello world"
#=> hello world
```
これは今までとまた違った理由で、`"a" "b"`みたく文字列リテラルが連続してると連結されるため。

- [ruby の 文字列の連接 - Qiita](http://qiita.com/Nabetani/items/29a82811e95f80edbb27)
- [文字列リテラル同士の標準的な結合方法と標準的ではない結合方法 - Qiita](http://qiita.com/tbpgr/items/08014f867f7d8cc1200f)

つまり以下と同じ。

```rb
$><<%%\%s\n%%"" "hello world"
```

# 全然関係ないけど%記法のカッコの対応について疑問

%記法は始まりと終わりの区切り文字を、単一の文字か対応するカッコで指定する。

[リテラル > %記法](http://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fliteral.html#percent)

`%|abc|`で`abc`を得られる。
`%(abc)`で`abc`を得られる。

それで
`%)abc)`も`abc`を得られる。
これはカッコは関係なくて「`)`」という文字を指定してると思う。

だけどその文字列の中に`(`を書いてしまうと、文字列を閉じることが出来なくなる。
irbでいろいろ試してみたけどダメだった。

`%)abc()`だと閉じられず、文字列が続く。
`%)abc())`だとエラー。

>SyntaxError: (irb):202: syntax error, unexpected ')', expecting end-of-input	from /usr/local/bin/irb:11:in `\<main>'

たぶん`$(()) #=> "()"`みたいに、カッコの対応が取れていれば区切り文字と同じでも文字列に含められる仕様の影響と思う。

エスケープして`%)abc\()`って書いたらいけた。
エスケープしないで書いた場合に閉じる方法ってないのかな。

変なエラーを避けるため変な書き方は控えようと思っっ他。

# 参考
- [リテラル](http://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fliteral.html#percent)
- [instance method String#%](http://docs.ruby-lang.org/ja/2.2.0/method/String/i/=25.html)
イテレータ破壊の追記

以前、[イテレータ破壊](http://qiita.com/izmktr/items/0c95aff5ba7554afcaa7)の事を書いたのですが、
あれから色々と追加されたものを書いていきます。

_GLIBCXX_DEBUGというものがあります。

C++はゼロオーバーヘッドを謳っているので、
vectorの範囲外アクセスをした時は危険な挙動をしながらも動き続けようとします。
本来であれば、範囲チェックをした上で呼び出しているはずなので、
関数内でもう一度チェックする必要はないという考えです。

ですが、エラーになるべきものがチェックされないのもまずいです。
そこで、_GLIBCXX_DEBUGをdefineしてヘッダファイルを読み込むと、
いろんな箇所でチェックしてくれて、エラーになるとアサートされます。

_GLIBCXX_DEBUGはイテレータ破壊の検出にも有効なようです。
gcc 4.9.1とVisualStudio 2013では下記ソースでアサートが検出されます。

```cpp:cxxdebug.cpp
#define _GLIBCXX_DEBUG
#include <vector>

int main() {
  std::vector<int> x;
  x.reserve(10);
  auto it = x.begin();
  x.insert(it, 10);
  *it = 20;
}

```
gcc実行結果：[wandbox](http://melpon.org/wandbox/permlink/7tjgxhywlCTaZ2Pr)

ただ、アサートが有効なのは実際に破壊された場合だけであり、
破壊されなかった時は素通りされます。

```cpp:cxxdebug.cpp
#define _GLIBCXX_DEBUG
#include <vector>

int main() {
  std::vector<int> x;
  x.reserve(10);
  x.push_back(1);
  auto it = x.begin();
  x.insert(x.end(), 10);
  *it = 20;
}
```
gcc実行結果：[wandbox](http://melpon.org/wandbox/permlink/IIcXv57n6ZzVUswQ)

標準ライブラリとしては、エラーが起きてないのにアサートするのは問題ということみたいです。
ただ、意図的にこういう書き方をするのは稀なので、
何らかの方法で検出できると自分で作らなくて助かるんですけどね…。

さて、話は代わり、イテレータ破壊を起こしていたソースの例です。
過去にバグの履歴を見ているとこういう関数を作っていました。

```cpp:foomap.cpp
class Foo{};
typedef std::map<int, Foo> FooMap;
FooMap foomap;

Foo *GetFoo(int id){
	auto it = foomap.find(id);
	return it == foomap.end() ? NULL : &it->second;
}
```
このGetFooの戻り値を保持したまま、foomapに変更を加える、という感じです。

コンテナそのものがprivateでアクセス出来ない場合だと、
map.end()にもアクセス出来ないので、無効値としてはNULLの方が使いやすいです。
ですが、イテレータ経由でアクセスしていないので、前回のクラスでも検出できませんし、
今回の冒頭で紹介した_GLIBCXX_DEBUGの方法でも検出されません。

これの対策は色々考えられるのですが、現段階で一番妥当なのはスマートポインタを使う方法でしょうか。

```cpp:foomap.cpp
class Foo{};
typedef std::shared_ptr<Foo> FooPtr;
typedef std::map<int, FooPtr> FooMap;
FooMap foomap;

FooPtr GetFoo(int id){
	auto it = foomap.find(id);
	return it == foomap.end() ? FooPtr() : it->second;
}
```

C++14ではnull iteratorというのが規定されるらしいので、
これが解決案になるかもしれません。

```cpp:foomap14.cpp
class Foo{};
typedef std::map<int, Foo> FooMap;
FooMap foomap;

FooMap::iterator GetFoo(int id){
	auto it = foomap.find(id);
	return it == foomap.end() ? FooMap::iterator() : it;
}
```