OmniAICreator/Qiita-1.07M huggingface dataset:
Cloud9を使ってRailsをやってみる

## Cloud９って
ブラウザ上で動かすIDE。
ローカルに開発環境を構築しなくても、ブラウザ上でプログラミングができる！
素敵。
しかも、無料でNode.js、HTML5、Wordpress、PHP、Python/Django、Ruby/Ruby on Rails、C/C++、StrongLoopの開発ができるらしい。

## さっそくやってみる
Windowsユーザーのわたし。
Railsとかそういうモダンな感じの言語はみんなMacで開発してるから、環境構築の段階でやる気が失せてたのよね。

さっそくChromeちゃんを立ち上げてCloud９のトップページへ

https://c9.io/

トップページからアカウントを作成したら、ダッシュボードに誘われる。

## ダッシュボード

ダッシュボードのトップ画面はWorkSpacesって書いてあって、Create a new workspaceを押してみると・・・

アプリケーション名を適当に入力して、開発したい言語を選択すると、
おおすごい。一気にIDEがブラウザ上に登場！

## エディタを触ってみる
Eclipseとかローカルで動かしてもあんなに遅いのに（俺のPCのスペックのせいか）、ブラウザ上で動かすなんて、と期待してなかったのに。

何、これ凄いサックサク。Ctrl+Spaceでコードも補完されるし。。
エディタの特徴はコードを書いていくにつれて、追記します。

## 簡単にアプリを作ってみる
Railsといえば、scaffoldってのを使うと、超簡単にCRUD機能を兼ね備えたアプリが作れるよってprogateとかでやった気がするので、早速やる。本当のRubyとかRailsのことはこれからちゃんと勉強するから、ね、お願いだからとりあえず一発やらせて。

* ターミナルからコマンドを打つよ
これも便利。クラウド9様。
エディタの下のほうにターミナルがあるので、以下のコマンドを打つ。


    rails g scaffold RailsNote title:string body:text

コマンドが実行されると、コントローラファイルとモデルファイルとビューファイルが自動的に作成されている。
まじでできてる。すげえ。

* データベースを作るよ
以下のコマンドを打って、データベースを作る。


    rake db:migrate
    
できた。

* routes.rbの設定を編集
これやらないと、ルーティングがうまくいかないので、以下のように編集。


        root 'welcome#index'

↓

    root 'rails_notes（resources : xxxxxxのxxxxx部分)#index'

## 動かしてみる
* サーバーを立ち上げる
確か、サーバーを上げるコマンドは   rails  s だったはず。
・・・・立ち上がらない。なんかターミナルの右上にHELPが出ている。
PortとIPの設定ができていない（？）っぽい。
けど、安心。代替のコマンドも教えてくれている。かしこい。
改めて、教えられたコマンドを入力


        rails s -p $PORT -b $IP


（PORTとIPは大文字）

できた。

* アクセス
サーバが無事立ち上がると、『おまえのコードはこのアドレスでアプリケーションとして動いているぞ』というメッセージがターミナルに表示されるので、クリック。

**動いた**

## まとめと今後の抱負
とりあえず、とっかかりやすいし、会社でも自宅でもネカフェでも友達の家でもブラウザさえあれば、開発ができるのはすごい。
これでやるやる詐欺が多い俺でもRails勉強しようという気になるるる。

とりあえず、次からはprogateとかドットインストールとかで基本に立ち返って覚えたポイントをメモる。で、一通りやったら、簡単なSNSとか作りたい。

あと、はじめてQuiitaに投稿しました。こんな個人的なメモをネットに晒してよいのか不安。マークアップ記法おもしろい。
[PHP] XML⇒JSON変換（名前空間、属性、CDATAも考慮）

**ネット検索でよく見かける方法では、XMLタグ名にコロン（名前空間）や属性が含まれる場合には、JSON化した時に抜け落ちます。（ただし、PHPのバージョンにかなり依存するようです）**

例）以下をJSON化すると「コロンを含んだ名前空間タグ」「属性名="属性値"」「CDATA」がごっそり消えてしまいます…

```xml:xml
<root>
    <test1:abc>値1</test1:abc>
    <test2 属性名="属性値">値2</test2>
    <test3><![CDATA[値3]]></test3>
</root>
```

```json:json
{
    "test2": "値2",
    "test3": {},
}
```

**<font color="blue">なお、環境は PHP5.4 です。</font>** （JSON_XXX定数を使わなければPHP5.3でも動作可）

# ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) サンプルコード

**以下、急場しのぎ的な部分もありますが、『XML⇒JSON変換』関数を自作してみました。**

```php:php
// XML(RSSなど)を取得
$strXml = file_get_contents("http://xxx.com/rss");
// XML⇒JSONに変換
$strJson = xml_to_json($strXml);
// 出力
echo $strJson;

//**********************************
// XML ⇒ JSONに変換する関数
//**********************************
function xml_to_json($xml)
{
	// コロンをアンダーバーに（名前空間対策）
	$xml = preg_replace("/<([^>]+?):([^>]+?)>/", "<$1_$2>", $xml);
	// プロトコルのは元に戻す
	$xml = preg_replace("/_\/\//", "://", $xml);
	// XML文字列をオブジェクトに変換（CDATAも対象とする）
	$objXml = simplexml_load_string($xml, NULL, LIBXML_NOCDATA);
	// 属性を展開する
	xml_expand_attributes($objXml);
	// JSON形式の文字列に変換
	$json = json_encode($objXml, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
	// "\/" ⇒ "/" に置換
	return preg_replace('/\\\\\//', '/', $json);
}

//**********************************
// XMLタグの属性を展開する関数
//**********************************
function xml_expand_attributes($node)
{
	if($node->count() > 0) {
		foreach($node->children() as $child)
		{
			foreach($child->attributes() as $key => $val) {
				$node->addChild($child->getName()."@".$key, $val);
			}
			xml_expand_attributes($child); // 再帰呼出
		}
	}
}
```

<font color="#cc0000">※ソース内の json_encode() 関数の第２引数にある JSON_XXX の定数は、PHP5.4.0以降でしか使えませんのでご注意下さい</font>

上記を実行すると、たとえばこういうXMLが、

```xml:xml
<root>
    <test1:abc>値1</test1:abc>
    <test2 属性名="属性値">値2</test2>
    <test3><![CDATA[値3]]></test3>
</root>
```

こういうJSONに変換されます。

```json:json
{
    "test1_abc": "値1",
    "test2": "値2",
    "test3": "値3",
    "test2@属性名": "属性値"
}
```

# ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) 解説

- 名前空間については、コロンをアンダーバーに置換することで対応
- 属性については、親要素の子要素となる形で外出しすることで対応
- CDATAについては、`simplexml_load_string()`関数の第3引数に`LIBXML_NOCDATA`を指定すればOK

⇒ <a href="http://ideone.com/fKJhoB" target="_blank">一応、ソースデモはこちら</a>

(･o･ゞ いじょー。


# ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) 参考URL

- <a href="http://qiita.com/kimihiro_n/items/7cfcd4ccb91c6f4c43e9" target="_blank">XMLからJSON形式への変換メモ(PHP)</a>
- <a href="http://fdays.blogspot.jp/2011/03/php-simplexml.html" target="_blank">PHPのSimpleXMLを配列に変換する</a>
- <a href="http://qiita.com/miiitaka/items/1607c007e096bca04890" target="_blank">RSS（XML）の名前空間やCDATAの値を取得する方法</a>
- <a href="http://php.net/manual/ja/function.simplexml-load-string.php" target="_blank">simplexml_load_string</a>
- <a href="http://php.net/manual/ja/function.json-encode.php" target="_blank">json_encode</a>
- <a href="http://php.net/manual/ja/function.json-decode.php" target="_blank">json_decode</a>
rails new

プロジェクト作成
$ gem install bundler
$ mkdir project
$ cd project
$ bundle init
Writing new Gemfile to /path/to/project/Gemfile
$ vi Gemfile
A sample Gemfile

source "https://rubygems.org"
gem "rails"
$ bundle install --path vendor/bundle
$ bundle exec rails new . --skip-test-unit --skip-bundle -d mysql
Gitにプロジェクトを登録
git init
git add .
git c -m "initial commit"
Gemを導入
cp gem file
bundle install --path vendor/bundle
gemの設定
rails g config:install
development.rbを更新
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "localhost",
port: 25,
domain: "localhost.localdomain"
}
# Specify what domain to use for mailer URLs
config.action_mailer.default_url_options = {host: "localhost:3000"}
config.after_initialize do
Bullet.enable = true
Bullet.alert = true
Bullet.bullet_logger = true
Bullet.console = true
Bullet.raise = true
Bullet.add_footer = true
end
6.規約準拠確認
bundle exec rubocop
--auto-correct
必須jquery
jquery.bootstrap-growl.min
jquery.livequery.min
rails g scaffold user --skip-view-specs --skip-controller-specs --skip-routing-specs --skip-request-specs --skip-jbuilder --skip-stylesheets
RiakCSにアタッチして、簡単なAPIを検証する

RiakCSは大量なデータを保存する手段の一つで、プライベートストレージに使うのはいい選択でもあります。

RiakCSを動かすにはRiak, Stanchion, RiakCSが必要です。

RiakCSのインストールに関しては[ここ](http://docs.basho.com/riakcs/latest/cookbooks/installing/Installing-Riak-CS/)に記述されています。

RiakCSはErlangに書かれているため、起動されると、ErlangのRuntime Systemが動きます。

RiakCSにアタッチするとRiakCSが提供している全てのPublic APIが使えるようになります。

いくつかのAPIを試してみたいと思います。まずRiakCSにアタッチします。

```
# sudo su
# riak-cs attach
```

まずユーザー作成します。

```
1> {ok, User} = riak_cs_user:create_user("fake-name", "fake-name@example.com").
{ok,{rcs_user_v2,"fake-name","fake-name",
                 "fake-name@example.com","LIF-FUEJDLPZWENSZEGH",
                 "MaWqrVs04OEVUPn9oGbu4ov-BSsh01v12LWUiw==",
                 "3fcf010cfbc6baa2c8dae4857b4399498f015f373cb3ca46ac1bb15ef69e2b44",
                 [],enabled}}

2> User.
{rcs_user_v2,"fake-name","fake-name",
             "fake-name@example.com","LIF-FUEJDLPZWENSZEGH",
             "MaWqrVs04OEVUPn9oGbu4ov-BSsh01v12LWUiw==",
             "3fcf010cfbc6baa2c8dae4857b4399498f015f373cb3ca46ac1bb15ef69e2b44",
             [],enabled}
```

上に作成されている`User`はいろんなところで使うことができます。
このユーザーは管理者であるかどうかをチェックします。

```
3> riak_cs_user:is_admin(User).
false
```
`false`なので、一般ユーザーになっています。

すべてのユーザーののキーをリストアップしてみます。

```
4> {ok, RcPid} = riak_cs_riak_client:checkout().
{ok,<0.571.0>}
5> riak_cs_user:fetch_user_keys(RcPid).
{ok,[<<"0HXABCDEFJ-BR4LQ9SCF">>,<<"2UEQRP_ABCDEFRKOEKOY">>,
     <<"COW-7ABCDEFAWY4H3-PN">>,<<"CZOCABCDEFWA_STA_UWK">>,
     <<"LIF-FUEJDLPABCDEFEGH">>,<<"WU2OZPPF-ABCDEFXRX7A">>]}
```

RiakCS中の特定のユーザーの情報を取得してみます。

```
6> riak_cs_user:get_user("LIF-FUEJDLPZWENSZEGH", RcPid).
{ok,{{rcs_user_v2,"fake-name","fake-name",
                  "fake-name@example.com","LIF-FUEJDLPZWENSZEGH",
                  "MaWqrVs04OEVUPn9oGbu4ov-BSsh01v12LWUiw==",
                  "3fcf010cfbc6baa2c8dae4857b4399498f015f373cb3ca46ac1bb15ef69e2b44",
                  [],enabled},
     {riakc_obj,<<"moss.users">>,<<"LIF-FUEJDLPZWENSZEGH">>,
                <<107,206,97,96,96,96,204,96,202,5,82,60,202,156,255,126,
                  206,176,251,162,194,...>>,
                [{{dict,3,16,16,8,80,48,
                        {[],[],[],[],[],[],[],[],[],[],...},
                        {{[],[],[],[],[],[],[],[],...}}},
                  <<131,104,9,100,0,11,114,99,115,95,117,115,101,114,95,
                    118,50,...>>}],
                undefined,undefined}}}
```

バケットのアクセス権限を取得してみます。

```
riak_cs_acl:fetch_bucket_acl(<<"test9">>, RcPid).
{ok,{acl_v2,{"madfrogme001",
             "98e7c6cfe1a1bcbc85c2befdbfb43fe0b8339379d5cc0f2160fabc055039440a",
             "CZOC9SNTQRWA_STA_UWK"},
            [{{"madfrogme001",
               "98e7c6cfe1a1bcbc85c2befdbfb43fe0b8339379d5cc0f2160fabc055039440a"},
              ['FULL_CONTROL']}],
            {1445,953267,673635}}}
```

実際これらのAPIを使うにはソースコードの参照が必要で、
https://github.com/basho/riak_cs/tree/develop/src


実際にRiakCSがRiakと通信する時にriak-erlang-clientを大いに頼っています。
https://github.com/basho/riak-erlang-client/blob/master/src/riakc_pb_socket.erl
[Swift]AlamofireのスペースをURLにクラッシュするのを直す

#開発環境
Xcode 7.1.1
Swift 2
Cocoapods

#クラッシュ内容

いわずと知れたHTTP通信のライブラリAlamofireであるが、アクセスするURLにスペースが入ってしまうとクラッシュしてしまうこの記事ではそのクラッシュへの対処法を記載する。

Alamofire
https://github.com/Alamofire/Alamofire
https://cocoapods.org/pods/Alamofire

#対処法
対処法は簡単でスペースを"%20"で置き換えてしまえばいい。
つまり事前にスペースを入れたり、入ってしまうところで%20に置き換えてURLを指定すればいい。

# 具体例
今回私がなぜこのクラッシュに気づいたかというと、Dwangoさんが提供してくれているAPIで複数の単語を検索する場合単語と単語の間にORとスペースを入れなければならないためクラッシュしてしまった
UIScrollViewでピンチ量を計算してズームするありがちな画像表示ビューを作る時代は終わった！！

ピンチしてズームするありがちな画像表示ビューコントローラを作る。よくある話だと思います。
元来、これを作るのは非常にめんどくさくlocationInViewだのzoomRectForScaleだのというメソッドを作っては投げていました。

でも、それも今日まで！

**AutolayoutにUIScrollViewとUIImageViewを乗せて数行コードを書けば、ピンチで画像ズーム出来るビューコントローラが作れます！！３分くらいで！**


#Autolayout

1.UIScrollViewを乗せて、上下左右にマージン0を指定して画面いっぱいにレイアウト
2.UIScrollViewの中にUIImageViewを乗せて上下左右にマージン0、高さと幅をUIScrollViewと同じ（Equal Width/Equal Height）にします。
3.IBOutletでひも付け

#コード
1.UIScrollViewDelegateを設定
2.ズームの設定を記述

```swift
imageScrollView.minimumZoomScale = 1.0
imageScrollView.maximumZoomScale = 4.0
imageScrollView.delegate = self
```

3.zoom用のビューを指定

```swift
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
   return imageView
}
```

#ハイ完成！！！！！！！！！


#おまけ
contentModeをAspectFitにすると見栄えがいい
ピンチアウトする時の中心が若干ずれて気持ち悪い。
viewForZoomingInScrollViewのおかげ。なんだこいついつからいたんだ…。
初めてQiitaに投稿すると1ヶ月の画像アップロード制限が2MB→100MBにアップしま（した）

ずっと下書き書いて、やたら画像で撥ねられるなとおもってたら
[この件](http://blog.qiita.com/post/75674629515/image-capacity-expansion)
知りませんでしたので、そのために投稿します（ぇ
Railsのsession_storeをRedisで設定している場合のWercker設定方法


今のところ無料で使えるCIツールWerckerで、Redisをsessionストアとして使っている場合の設定方法にややハマったのでメモ


Werckerの設定ファイルにredisを追加

```wercker.yml
box: wercker/rvm
services:
  - wercker/postgresql

  # ここがキモ redisのボックスを追加
  - wercker/redis

build:
    steps:
        - rvm-use:
以下省略


```

testの実行用設定ファイルを以下のよう、WERCKER_REDIS_HOSTの環境変数を先に読ませるように変更する。
こうすることで、ローカル環境で設定していないWERCKER_REDIS_HOSTがないと、固定値のlocalhoset~~が読み込まれるのでlocalでも動作可能となる

旧

```test.rb
 config.session_store_servers = "redis://localhost:6379/0"
```

新

```test.rb
 redis_url = ENV["WERCKER_REDIS_HOST"] || "redis://localhost:6379/0"
  config.session_store_servers = redis_url
```
MODXのDittoで処理が終わるまでローディング画面を表示する

MODX上でDittoでデータを抽出する場合、時間がかかる場合があります。
jQueryなどでローディング画面を表示しようと思っても、Dittoから処理が帰ってくるまで、画面表示が切り替わらないので、ローディング画面が表示できません。

そのような場合は別にローディング画面用のリソースを用意して、そこからjavascriptで本来表示したい結果ページヘリダイレクトする方法があります。
ただし、スクリプトはチャンクにして呼び込まないとリダイレクトしないようです。

例---

{{ロード後リダイレクト}}

```
<SCRIPT type="text/javascript">
setTimeout("link()", 1000);
function link(){
location.href="[~**~]";
}
</SCRIPT>
```

上記は1秒後にリダイレクトになっていますが、実際は1秒後でなくDittoの処理が終わるとリダイレクトします。
naming > OutOfRangeException() / OutOfBoundsException() > compile timeエラーかどうか @ PHP

Grenningの本を読んでいる中、IsOutOfBound()という関数が出てきた。

一方で、自分がよく使うnamingとしてはIsOutOfRange()。

違いについて調べてみたら、以下が見つかった (PHPの例)。

http://stackoverflow.com/questions/8193798/outofrangeexception-vs-outofboundsexception

> OutOfRangeException: Exception thrown when an illegal index was requested. This represents errors that <font color=red>should be detected at compile time</font>.
>
>OutOfBoundsException: Exception thrown if a value is not a valid key. This represents errors that <font color=red>cannot be detected at compile time</font>.


他の言語での使い分けは未調査。


## 検索用キーワード
Qiitaの検索で見つけられなかったので、以下のキーワードを付加しておく

- OutOfRange
- OutOfBound
- OutOfBounds
mysqlのmysqldumpからテーブル指定で復元

## 概要
mysqldump取った！リリースした！バグってた！復元だ！復元は1テーブルだけでいい。他のテーブルは復元したくない！
って時のためのテーブル単位復元方法。

## mysqldumpの取得
```
mysqldump -u user_name -t schema_name > 20151201.sqldump
```

## sqldumpファイルをテーブル名ごとに別ファイルに出力
```
csplit backup_20151201.sql '/DROP TABLE IF EXISTS/' {*}
```
これで、DROP TABLE IF EXISTが最初の行のファイルが実行ディレクトリに分割されて出来上がる。
ファイル名は「xx01」のような形の連番。

## 復元したいテーブルのファイルを探す。
```
grep -il 'create table `TARGET_TABLE_NAME`' ./xx*
```

## 復元
```
mysql -u user_name -t schema_name < xx0N
```

でOK。
オートフィルタしたセル内容を、フィルタしたセルに貼り付ける

Excelで、オートフィルタをかけたまま、その内容を別の列にコピーしたい
ということがありますが、普通にはどうしてもできないので、マクロで可能にしました。
こちらをアドインに登録しておくと便利です。
（自分用につき変数宣言無しの酷いコードですが、ご容赦下さい）

    'フィルタしたまま貼り付け
    'フィルタされた内容を、フィルタしたまま、他の列に値貼り付けするマクロです。
    Sub PastetoFilterCells()
    If Application.CutCopyMode <> False Then
        Call AlertStop("このボタンは、元のセルをコピーではなく選択した状態で実行して下さい")
    End If
    '選択範囲のフィルターされたセル（可視セル）のみ選択する
    Set motorange = Selection.SpecialCells(xlCellTypeVisible)
    If motorange.Columns.Count > 1 Then
        Call AlertStop("このボタンは、１列かつ２行以上選択して実行して下さい")
    End If
    
    '全行・全列に処理すると時間がかかるので、しないようにチェック
    If Selection(Selection.Count).Row = Cells.Rows.Count Or _
        Selection(Selection.Count).Column = Cells.Columns.Count Then
        MsgBox "このボタンは列全体・行全体に処理はできません", vbInformation
        End
    End If    

    '貼り付け先の列を選択してもらう。行はどこでもいい。
    On Error Resume Next
    Set buf = Application.InputBox("貼り付け先の列のセル（どこでも可）を選んで下さい。", "コピー先列選択", Type:=8)
    If buf Is Nothing Then End
    On Error GoTo 0
    
    '貼り付け元を、貼り付け先に入力していく。（DoEvents無い方が早いかも？）
    mycolcnt = buf.Column - motorange.Column
    Application.ScreenUpdating = False
    For Each hoge In motorange
        hoge.Offset(, mycolcnt).Value = hoge.Value
        DoEvents
    Next
    Application.ScreenUpdating = True   
    End Sub
データ可視化超入門 ~データ分析のための可視化~

# はじめに
@dr_paradiと申します。最近はデータ分析などをしつつ、E2D3のエバンジェリストとしてデータ可視化のためのOSSのグラフを作成しています。

勢い余って今年のAdvent Calendarを作成しました。(昨年のAdvent Calendarの作成者もは@osokenさんが作成してくれました。)
本業ではデータ分析もしているので、初回ということもあり、とりあえずゆるくデータ分析と可視化の話を書こうと思います。
エストレーラにも寄稿しました

# データ分析のためのデータ可視化
## 比較対象に応じての可視化
個人的なデータ分析の名著「イシューからはじめよ」によると、分析とは「比較すること」と書いてあります。分析が「比較すること」であるとすると、可視化の役割は、「分析対象をより比較しやすくする」ことだといえます。比較の対象によって可視化の手法を変化させることで、より効果を高めることができます。


分析の対象によるグラフの使い分けはこのWebサイトがわかりやすく書いてあります。
http://extremepresentation.typepad.com/blog/2006/09/choosing_a_good.html

### 可視化例
今回は私が作成し、gooスマホ部に寄稿した、レーダーチャートを例にしてお話しします。
http://sp.oshiete.goo.ne.jp/club/view/3edaba8975a47f1d003c6959b7d4c9aa/
<img width="644" alt="スクリーンショット 2015-12-01 16.36.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/17505/59d17d60-27c0-816e-c9a1-cc61aa44281c.png">

複数の携帯キャリアの速度を比較することができます(次のページ)。

上記のChart ChooserだとComparison -> OverTime -> Many Periods -> Cycle Data
のCircular Area Chartにあたります。

環状線でのデータであるため、(時系列のデータではないものの)Cycle Dataにはなっていますので、数値で比較したり、単純な棒グラフで比較するよりもわかりやすくなっているかと思います。山手線などでも応用できそうです。

ソースコードは下記を参考にしてください(汚くてすみません)。
https://github.com/e2d3/e2d3-contrib/tree/master/multi-series-radar-chart

## コードについて
せっかくQiitaですので、軽くコードについて触れます。D3.jsは可視化ライブラリですが、データを変換する関数などが豊富です。

E2D3ではExcelで表形式のデータを扱うため、木構造データは変換する必要があります。
jsonのようなその際にはnest関数を使うと便利です。

```
var datalist = d3.nest()
        .key(function(d) { return d[0]; })
        .entries(data.transpose());
```

nest関数についてはこちらが参考にしてください。
http://qiita.com/_shimizu/items/81e2b00da6c593ec19bf

## E2D3での可視化
分析に用いる可視化手法の多くは、Excelに代表される既存の表計算ソフトウェアで実現可能です。我々が開発しているE2D3では、Excel上で、インタラクティブ(対話的)、ダイナミック(動的)な表現を手軽に使うことができます。
導入は公式のWebサイトhttp://e2d3.org/ja/を参考にしてください。

E2D3はOSSとして公開しているので、自信が作成したグラフを配布することができます。開発環境の作成方法に関しては下記をご覧ください。
https://github.com/e2d3/e2d3

# おわりに
今回は私が参加している、「E2D3」中心のお話しをしました。
E2D3に関わらず、今後もデータ可視化は分析のため、あるいは分析結果を説明するのに非常に重要な役割を果たすことと思います。

# 宣伝
統計と情報の専門誌「エストレーラ」12月号にもデータ可視化とE2D3について寄稿しましたのでよろしくお願いいたします。http://www.sinfonica.or.jp/kanko/estrela/estrela.htm
【メモ】scala における case class

便利なことで有名な case class はなんと Serializable も mix-inしていた。

ひしだまさんのところにも書いてあった。
http://www.ne.jp/asahi/hishidama/home/tech/scala/class.html#h_case_class

# class files で確認
http://alvinalexander.com/scala/scala-class-examples-constructors-case-classes-parameters
RubyのTimeクラスとDateクラスの使い分け

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

上記記事ではTimeクラスを使おうと結論付けられていて、基本は自分もそうしているのだけれど、当然クラスが違えば振る舞いも違ってくるので、あえてDateクラスを遣う場面もあるなぁという話。

## 日付処理はDateクラス便利

日付に関係した処理はかなり充実している。

```ruby
[1] pry(main)> Date.today
=> #<Date: 2015-12-01 ((2457358j,0s,0n),+0s,2299161j)>
[2] pry(main)> Date.today.next_month
=> #<Date: 2016-01-01 ((2457389j,0s,0n),+0s,2299161j)>
[3] pry(main)> Date.today.tuesday?
=> true
[4] pry(main)> Date.today.next_year.leap?
=> true
```

特に`#leap?`なんぞはよくある閏年の計算を書かずに済むので便利だったり。また日付のインクリメント、デクリメントに相当する操作も楽にできる。Timeクラスだとこのあたりの操作は秒が基本単位になるので、日付の処理であれば個人的にはDateクラスを遣うほうが楽。

```ruby
[5] pry(main)> Date.today >> 2
=> #<Date: 2016-02-01 ((2457420j,0s,0n),+0s,2299161j)>
[6] pry(main)> Date.today << 1
=> #<Date: 2015-11-01 ((2457328j,0s,0n),+0s,2299161j)>
[7] pry(main)> Date.today + 1
=> #<Date: 2015-12-02 ((2457359j,0s,0n),+0s,2299161j)>
[8] pry(main)> Date.today - 1
=> #<Date: 2015-11-30 ((2457357j,0s,0n),+0s,2299161j)>
```

## 現在(日付|時刻)を取得するときの相違

TimeクラスとDateクラスで混同しやすいのが現在日時の取得方法。例えば引数なしの`.new`でTimeクラスは現在日時を返すが、Dateクラスは返してくれない。

```ruby
[9] pry(main)> Time.new
=> 2015-12-01 00:00:00 +0900
[10] pry(main)> Date.new
=> #<Date: -4712-01-01 ((0j,0s,0n),+0s,2299161j)>
```

**いつやねん** って話だが、イタリアがグレゴリオ暦を用い始めた日らしい。何か特別な呼び方がありそうなものだが、少し探した範囲では見つからず。

* [constant Date::ITALY (Ruby 2.2.0)](http://docs.ruby-lang.org/ja/2.2.0/method/Date/c/ITALY.html)
* [グレゴリオ暦 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%82%AA%E6%9A%A6)

Dateクラスで実行日の日付を取得するには`.today`。またTimeクラスでは`.new`の他に`.now`も使うことができる。

```ruby
[11] pry(main)> Date.today
=> #<Date: 2015-12-01 ((2457358j,0s,0n),+0s,2299161j)>
[12] pry(main)> Time.now
=> 2015-12-01 00:00:00 +0900
```

## 特定フォーマットで日時を出力する

これはいずれも`#strftime`が使える。よく日付を二桁で取得したいことがあるので便利。ただし`#month`などで出力した場合はIntegerで返されるのに対し、`#strftime`はStringで返されるという違いはある。

```ruby
[13] pry(main)> Date.today.prev_month(4).mon
=> 8
[14] pry(main)> Date.today.prev_month(4).strftime('%m')
=> "08"
```

## 結論

RubyでもTimeWithZoneで`1.weeks.ago`とかやりたい。
Jupyter Notebookでブログ書きたい

Markdownでブログを書いている方は多いと思いますが、Jupyter Notebookで作成したnotebookをそのままブログに投稿したいということもあるかと思います。

静的サイトジェネレータPelicanとそのプラグイン[pelican-ipynb](https://github.com/danielfrg/pelican-ipynb "pelican-ipynb")を使ってこれを実現してみます。

## インストール

virtualenv上に環境を作るのがよいかと思います。

* jupyter、nbconvertをインストール(入ってない場合)

```bash
$ pip install jupyter
```

* PelicanとMarkdownをインストール(入ってない場合)

```bash
$ pip install pytz
$ pip install Markdown pelican
```

## プロジェクトの作成
今回はテスト用にmy_projectというディレクトリを作成します。

```bash
$ mkdir my_project
$ cd my_project/
$ pelican-quickstart
```

quickstartは[こちら](http://qiita.com/5t111111/items/c5d261941f4d8440288e "Pelican ブログのインストール方法")を参考にしました。
titleやauthor、その他設定等はご自身のものに置き換えてください。

```
> Where do you want to create your new web site? [.] 
> What will be the title of this web site? my project
> Who will be the author of this web site? patraqushe
> What will be the default language of this web site? [en] ja
> Do you want to specify a URL prefix? e.g., http://example.com   (Y/n) n
> Do you want to enable article pagination? (Y/n) n
> What is your time zone? [Europe/Paris] Asia/Tokyo
> Do you want to generate a Fabfile/Makefile to automate generation and publishing? (Y/n) y
> Do you want an auto-reload & simpleHTTP script to assist with theme and site development? (Y/n) y
> Do you want to upload your website using FTP? (y/N) n
> Do you want to upload your website using SSH? (y/N) n
> Do you want to upload your website using Dropbox? (y/N) n
> Do you want to upload your website using S3? (y/N) n
> Do you want to upload your website using Rackspace Cloud Files? (y/N) n
> Do you want to upload your website using GitHub Pages? (y/N) n
Done. Your new project is available at /home/driller/pelican/my_project
```

## pelican-ipynbをインストール

my_projectディレクトリにて

```bash
$ mkdir plugins
$ git clone https://github.com/danielfrg/pelican-ipynb.git plugins/ipynb
$ vi pelicanconf.py
```

pelicanconf.pyに以下を追記

```
MARKUP = ('md', 'ipynb')

PLUGIN_PATH = './plugins'
PLUGINS = ['ipynb']
```

## 作成したnotebookを配置
今回はcontentディレクトリに.ipynbファイル用のディレクトリを用意します。
contentディレクトリ直下でも構いません。

my_projectディレクトリにて

```bash
$ cd content/
$ mkdir notebook

```

jupyter notebookにて作成した.ipynbファイルをmy_project/content/notebookディレクトリに置きます。
そして、<同名のファイル名>-metaというファイルを作成します。
今回はtest01.ipynbというファイル名で用意しました。

```bash
$ cd notebook/
$ ls
test01.ipynb
$ vi test01.ipynb-meta
```

test01.ipynb-metaの内容

```
Title: notebook test
Slug: test01
Date: 2015-12-18 0:00
Category: Pelican
Tags: Python, Pelican, Jupyter
Author: patraqushe
Summary: jupyter notebook article
```

## サイトのビルド/確認

my_projectディレクトリに戻って、make htmlでサイトをビルドし、make serveでサーバを起動します。

```bash
$ ls
test01.ipynb  test01.ipynb-meta
$ cd ../..
$ make html
$ make serve
```

ブラウザで```http://localhost:8000```にアクセスするとこのような画面になります。

![pelican-ipynb.PNG](https://qiita-image-store.s3.amazonaws.com/0/22023/f9b67bfc-bdd9-c9dd-cfd9-314446e1c6aa.png)

あとはテーマや設定を色々と変えてお好みに調整します。
ActionMailer をいい具合にちょめちょめする

Rails 4.2.3
## 設定
設定は標準だと `config/enviromnents/{env}.rb` の中に記述する。新規作成の時に自動で幾つか書いてある。

環境ごとにしかわけないなら十分だけど、例えば「ステージングがAlphaサーバーとBetaサーバーに分かれてる」とかそういうのがある。だから ActionMailer の設定も yml に出したい。

```config/initializers/action_mailer.rb
unless MyApp::Application.config.action_mailer.nil?

  options = YAML.load_file(Rails.root.join('config', 'mailer.yml'))[Rails.env]

  MyApp::Application.config.action_mailer.merge! options.deep_symbolize_keys! unless options.nil?

end
```

これで `config/mailer.yml` をロードしてくれる。マージなので、`config/environments/{env}.rb` に書いてあるやつが消えるわけじゃない感じ。

`config.action_mailer` は（ていうか `config` 以下全部）シンボルのキーしか読まない感じでハッシュを取り扱ってるけど、yml からロードしたのはキーが文字列なので、`deep_symbolize_keys!` してる。再帰的に `symbolize_keys` する奴だと思う。

http://apidock.com/rails/v4.0.2/Hash/deep_symbolize_keys

> Return a new hash with all keys converted to symbols, as long as they respond to to_sym. This includes the keys from the root hash and from all nested hashes.

だそうです。

```config/mailer.yml
defaults: &defaults

staging:
  delivery_method: :smtp
  default_url_options:
    host: "staging.example.com"
  smtp_settings:
    address: "localhost"

production:
  delivery_method: :smtp
  default_url_options:
    host: "example.com"
  smtp_settings:
    address: "localhost"

development:
  smtp_settings:
    host: "127.0.0.1"
    port: "1025"
  default_url_options:
    host: "0.0.0.0"
    port: "3000"
```

まあなんかこんな感じ。

http://guides.rubyonrails.org/action_mailer_basics.html#action-mailer-configuration

に ActionMailer の設定について書いてある。普通のメール周りの知識でだいたいなんとかなると思う。

# MailCatcher

MailCatcher ってのが便利。ローカルで動く仮想 SMTP サーバーで、受け取ったメール配信リクエストを Virtual 受信ボックスで表示してくれる。Plane と HTML の表示切り替えとかもできるので、両方のフォーマットに対応したメールをチェックする時とかも便利。

```shell
gem install mailcatcher
mailcatcher
```

以上。古い人なので rvm つかってるので、gemset で mailcatcher のやつ作ってインストールしてる。

http://mailcatcher.me

ここに MailCatcher について書いてる。こんな雑記読むより公式のテキスト読んだほうが良い。

`http://localhost:1080` が Virtual 受信トレイ。

# Postfix

普通にインストールしたら動いたので特に書くこと無い。

```shell
yum install -y postfix
systemctl enable postfix
systemctl start postfix
```

CentOS 7 だと不要な感じがするけど、postfix の設定はちゃんとしとかないと困る。ガチSAPMられる。

# 終わり

他になんかメモったほうがいいことあるかな……。Gmail周りは（正直そう複雑なことはないけど）細かく調べて書いておくと便利そうな気はするけど、すでに調べてる人たくさんいる案件だしわざわざ書き直すほどのことかと言われるとかなり疑問。

ていうか送信だけなら普通自前のSMTPサーバー使うだろうし、Gmail 使うのって開発時だけな気がする。で、開発時は MailCatcher の方が便利なので Gmail 不要だよね。
正規表現を使って特定条件を満たす行頭にタブ区切りを挿入する

#やりたかったこと
Skypeのやり取りをテキストエディタにコピペした時、行頭処理がなく見づらいため行頭にタブ区切りを挿入して見やすくしたかった
##検索ワード
正規表現　行頭　挿入
#やったこと
##サンプル
これを
[2015/07/23 14:41:43] hoge1: 桃太郎はカブをひっぱります。
[2015/07/23 14:45:08] hoge1: シンデレラは12時の鐘を聞いて真っ青になりました。
浦島は一日ずれます
正常に金太郎するためには、まさかりをかついでくまを。
おやゆび姫はキャベツ太郎をもぐもぐしました。
[2015/07/23 14:50:19] hoge2: ＞hoge1
↓
こうしたい
[2015/07/23 14:41:43] hoge1: 桃太郎はカブをひっぱります。
[2015/07/23 14:45:08] hoge1: シンデレラは12時の鐘を聞いて真っ青になりました。
　　　　　　　　　　　　　　浦島は一日ずれます
　　　　　　　　　　　　　　正常に金太郎するためには、まさかりをかついでくまを。
　　　　　　　　　　　　　　おやゆび姫はキャベツ太郎をもぐもぐしました。
[2015/07/23 14:50:19] hoge2: ＞hoge1
##試した置換（サクラエディタ）
検索：^[^\\[\]
置換：\t
→検索対象としては間違いないが、行頭1文字目がタブに置換されてしまう

検索：^[^\\[\]
置換：\t$&
→必要な箇所だけにタブ区切りを挿入することができた

利用可能な正規表現
http://sakura-editor.sourceforge.net/htmlhelp/HLP000089.html
##秀丸での確認
置換後の「$&」はサクラエディタ依存のため秀丸でも確認した。

検索：^[^\\[]
置換：\t$&
→ダメだった（あたりまえか）

検索：^[^\\[\](.+)
置換：\t\1
→うまくできた
#結論
検索：^[^\\[\](.+)
置換：\t\1
が汎用性高くて良い感じ

置換：\tだけではなぜだめだったかは追って調査して考えることにする。
#※追加検索ワード
正規表現 特定行 行頭 挿入 秀丸


##
postgreSQLにコマンドラインからSQLファイルを実行

2通りあるようです。

１ DBログイン後SQLファイルを実行
$ psql -U user_name -d db_name (-h ホスト名) にてDBにログイン
$ postgres=> \i ../dump_in.sql

２ DBに一時的にログインしSQLファイルを実行
$ psql -f ../dump_in.sql -U user_name -d db_name (-h ホスト名)

ちなみにどちらの方法でもDBのユーザに権限がない場合、
「許可がありません」の警告が出て実行できません。
よし、まずはEaselJSで四角を描いてみる

```html:sample
<!DOCTYPE html>
<html lang="jp">
<head>
	<meta charset="UTF-8">
	<title>EaselJSで四角を描く</title>
</head>
<body>
	
	<canvas id="canvas" width="1920" height="1140"></canvas>
	<script src="https://code.createjs.com/createjs-2015.05.21.min.js"></script>

	<script type="text/javascript">
		document.addEventListener('DOMContentLoaded', function(){
			create();
		}, false);


		function create(){
			// stage生成
			var stageElm = document.querySelector('#canvas');
			var stage = new createjs.Stage(stageElm);
		    // フレームレート設定
		    createjs.Ticker.setFPS(30);
		    // 1フレームごとに実行される
		    createjs.Ticker.addEventListener('tick', function(){
		        stage.update();
		    });

			// 四角を描画
			var graphic = new createjs.Graphics();
			graphic.beginStroke('#000') // 線の色
			.beginFill('red') // 色
			.drawRect(0, 0, 100, 100); // 四角のサイズ (x1,y1, x2, y2)
			var shape = new createjs.Shape(graphic);
			stage.addChild(shape);
		}
	</script>
</body>
</html>
```
GAE/Jでコマンドラインからデプロイする

Google App Engine 、通称 GAE 便利ですね。
アプリよりのエンジニアからすればさほど苦労しなくてもサーバー側を構築できるPaaSなサービスはもっと流行ってしかるべきだと思います。
しかしサーバー側の仕組みが高度に抽象化、隠蔽化されているがために、一度うまく動かなくなると、分厚いPaaSの壁に阻まれ原因を追求できず、という弊害もあります。


で、SDKをアップデートした時にぶちあたった問題

<img width="574" alt="Screen Shot 2015-12-01 at 15.15.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/7bc693e0-adf4-c318-e714-35b3b634c8ed.png">


いやログでてないし。

**ログが出力されている場所をご存知の方はぜひ教えてください！**


こんな時は慌てず騒がずコマンドラインからデプロイ。

```sh
cd [appengineのSDKをインストールしたディレクトリ]/bin
sh ./appcfg.sh update [warのディレクトリ]
```

例

```sh
cd ~/Downloads/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.9.21/appengine-java-sdk-1.9.21/bin/
sh ./appcfg.sh update /Users/hogehoge/test_project/war
```

問題なくデプロイできます。

では良いGAEライフを。
toggleの表示・非表示の状態判定

jqueryにてtoggleの状態判定に悩んだので備忘録です。

```

    $("#hogehoge").toggle(function () {
        if ($(this).is(':visible')) {
            // 非表示中の処理
            hogehoge;
        } else {
            // 表示中の処理
            hogehoge;
        }
    });

```
Handsontableのマルチバイト(IME)バグ

※執筆時点のバージョンは0.20.1です。


ExcelライクなグリッドUIライブラリとして良く利用されるHandsontableですが、

以外とバグが多く、公式で放置されていることも多い。それがこのIME問題だ。

[公式ページ](http://handsontable.com/)のサンプルを見てもらうとわかるが、

キーボードを全角状態でセルにフォーカスを合わせて(入力状態ではない)、

例えば「てすと」と日本語入力をすると、【tえすと】という感じで

一文字目がアルファベットになってしまう。

公式ページの[issues](https://github.com/handsontable/handsontable/issues/839)でもまだ未解決。



ソースをアレコレ解析して試行錯誤・・・。




セルのフォーカス状態(≠入力状態)ではWindowsのIMEが無効(非活性)になっていて、

HTML/Javascriptのソースコード上ではinput type=textが存在していないので

このライブラリでは物理的に無理かもしれない。

・・・なのでEnterボタンで入力状態にする代替で回避することにしました。

```handsontable.full.js

BaseEditor.prototype.beginEditing = function(initialValue, event) {
  // ここから
  if (this.instance.getSelected()) {
    if (event.realTarget.className != "handsontableInput" && event.realTarget.className != "copyPaste" && event.keyCode != 13){
      event.preventDefault();
      return;
    }
  }
  // ここまで

```

Enter以外で入力モードにしたいときは「event.keyCode != 13」を外してください。

＃ その場合はEnter以外のKeyを押すとテキストがクリアされます。


いくつかやり方はあったんだけど、

コピペができなくなる・・・とか、内部でカスタマイズした独自機能が動かなくなる・・・とか

対応の影響を受けて動作しなくなる機能があったので結局この方法に落ち着きました。ご参考まで。
gsubで正規表現を使ったら処理が終わらなくなって止まってしまった

本文中に含まれている```<style>```タグの中身を削除しようとして、

```
str.gsub(/<style(.|\n|\r)*<\/style>/,"")
```
こんなん書いたらレスポンス返ってこなくなってタイムアウトしてしまった。

そもそも

```
str.gsub(/<style(.|\n)*<\/style>/,"")
```

で意図していた動きは実現できるとして(```.```はメタ文字に反応しないのではなくて改行に反応しないだけっぽい)、どうしてそういう挙動になったんだろう。
開会宣言: さだまさし x IT アドベントカレンダーについて

**「さだまさし x IT」**という謎すぎるテーマでアドベントカレンダーを始めます。

私の居る会社内では**「サダベントカレンダー」**と通称されていますが、私は節度のある大人のつもりなのでダジャレ/オヤジギャグは自重します。

> プログラミングに関係のない Advent Calendar は運営者の判断により削除されることがありますので予めご了承ください

という運営規約があるなか、このアドベントカレンダーが削除されずにすむのか戦々恐々する日々でしたが、存続しているということは **「さだまさしはIT技術のテーマとして語るに足るテーマである」** と運営からお墨付きをいただいたということですので、大手を振って開始させていただきます。

ということで、この記事は巻頭言的な形で。
技術の話はこの記事ではほとんど出てこないのですみません。次以降をお楽しみに。

# さだまさし
この Qiita をご覧の方は当然ご存知と思いますが、さだまさし氏は日本を代表する歌手のひとりです。

代表的な事案をいくつか挙げると

* **40年以上**第一線で活躍
  * グレープ 〜 ソロ活動 
* 世の中に発表された楽曲は**500曲以上**
  * 毎年ほぼ必ず1枚以上アルバムを作成している 
  * [さだまさし - ディスコグラフィ](https://ja.wikipedia.org/wiki/%E3%81%95%E3%81%A0%E3%81%BE%E3%81%95%E3%81%97%E3%81%AE%E3%83%87%E3%82%A3%E3%82%B9%E3%82%B3%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3) 
* それなりに知名度のある楽曲が、各年代に存在する
  * 一番古いヒット曲は「精霊流し(1973年)」
  * 一番有名な曲は「関白宣言(1979年)」
  * あまりさだまさしの曲だと認知されて無いが実は一番皆に知られている曲は「北の国から(1982年)」のテーマ曲
  * 最近はドラマ「天皇の料理番」の主題歌だった「夢見る人(2015年)」
  * 今年映画化された「風に立つライオン(1987年)」など、時間を経て再度脚光を浴びる曲もある
* 実施したコンサート回数は**4000回以上**
  * 日本のプロシンガーの中ではダントツのNo.1 
* [映画](https://ja.wikipedia.org/wiki/%E9%95%B7%E6%B1%9F_(%E6%98%A0%E7%94%BB))の撮影で抱えた借金が**28億円**(金利を含めて**35億円**とは本人の弁)
  * そして完済

借金の額も相当に**ビッグデータ**な感じはしますが、活動期間が長く、かつ長期に渡りムラなく安定して活動をされており、作られた作品も多いことから、なにかしらの解析を行うにはふさわしい対象であると言えるかもしれません。

# 「さだまさし x IT」 の理由
このアドベントカレンダーを始めようと思った理由は、３つほどあります。

* 個人的にさだまさしが好きだった
  * 好きというか、大好き 
* 40数年一線級で活躍をされており、膨大な作品群、著作群があるなか、コンピュータ世代の若い人にとってはちょっと昔の人という印象もあり、ITを用いた解析・分析の対象とされてこなかったように思える。
  * なにかやってみよう
  * IT関連の技術の進歩がここ10数年来起こり続けており、それらを用いることで昔はできなかったような文学的・芸術的な対象についての解析が何かしら行えるのではないかという期待値もある。
* ネタ

# 文学・詩作 x IT
個人的な話ですが、私は文学部出身で、学生時代は論語などの古典中国哲学・文学の書籍をを原文で読む生活をしていました。
そのなかで、研究の材料とする調査として、例えば

* 論語の中に「曰」という言葉は何回出現するのか
* その傾向は前半と後半で変わるのか
* 子路、子贡、颜回といった主要な孔子の弟子たちの篇毎の言及回数や、それぞれの弟子にかける言葉の特徴はどんなものか

といったことを把握したりする事が必要なケースもあったりしましたが、昔は書籍を開いて一つづつ手で数えていく必要がありました。今であればコンピュータ技術の力を使って手軽に定量的に機械的に解析することができるわけです。

コンピュータの世界と、コンピュータと無縁そうな情緒的な世界をも扱う文学的な世界は、相反するものと捉える人が多いですが（コンピュータ業界における文系蔑視に代表されるように）、実際はもっと融合することで面白い事ができるのではないかと思っています。

とはいえ、そこまで気合いを入れすぎると空回りしてしまうので、まずは**「さだまさし」** という言葉を拠り所に、IT を使っていろいろな切り口で実験をできる場、そんな場にこのアドベントカレンダーがなれば良いな、と思っています。

# 参加者
このアドベントカレンダーに私以外の方が参加することは正直想像もしていなかったですが💦、IT 業界におけるさだまさし氏の**絶大なる人気**を反映してか、多くの方が参加を表明されています。
それぞれ、様々な切り口のテーマを掲げられており、私もとても楽しみです。

私は、NLP 関連の初歩の初歩的なアプローチを基に、いくつか分析した内容を書ければ良いかなと思っています。

# まとめ
> 映像は、人類が蓄積した膨大な「記憶」である

とは、10月より放送されている NHK スペシャル「新・映像の世紀」で語られている言葉です。

[NHKスペシャル 新・映像の世紀](http://www.nhk.or.jp/special/eizo/)

そのような文脈で捉えると、40年を超える長い時間を一線級の立場で、500を超える膨大な楽曲（まさにビッグデータ）を作り続けているさだまさし氏の作品群も、人類にとって貴重な「記憶」のひとつであるといえるかもしれません。

もちろん本気でそんなところまで思い込みが激しいわけではないですが......いずれにせよ、よろしくお願いします。
MySQL InnoDBのフルテキストインデックスで、ストップワードフィルタを無効にする (in, by, is などで検索できるようにする)

# 経緯

MySQL5.6 の、InnoDB にバイグラムでフルテキストインデックスを作っているのですが、
**TWIN** という文字を検索しようとした所、

```mysql
SELECT COUNT(*) FROM ...
WHERE MATCH(search_text) AGAINST ('+tw +wi +in' IN BOOLEAN MODE)
```

... 結果が出てきません。

'+tw +wi' だと結果があります(twin がヒットします)。

調査した所、「ストップワード」という機能があり、in や by, is なんかは検索インデックスが作られないようになっている仕様でした。

※ InnoDB のフルテキストインデックスの場合のみ。MyISAM の場合は、デフォルトはストップワードテーブルは使われない。

## ストップワードの内容を表示するには

```mysql
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
```

in, is, it, la, of, on などが入ってます。

このテーブルは、自分で別のテーブルを作ってそちらを使うように設定もできますが、今回はそもそもストップワードテーブルを使ってのインデックス生成フィルタリングを無効にします。

無効にせず、ストップワードテーブルを差し替えるにはこちらのページが参考になります。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.9.4 全文ストップワード
https://dev.mysql.com/doc/refman/5.6/ja/fulltext-stopwords.html


# ストップワードを無効にする設定


InnoDB でのストップワード判定を無効にするには、設定の innodb_ft_enable_stopword を変更します。

現状の確認

```mysql
SHOW VARIABLES LIKE 'innodb_ft_enable_stopword';
```

```
innodb_ft_enable_stopword	ON
```

デフォルトでは有効になっています。

なので、my.cnf などの設定ファイルに

```
[mysqld]
innodb_ft_enable_stopword = OFF
```

として、MySQL を再起動すると

```mysql
SHOW VARIABLES LIKE 'innodb_ft_enable_stopword';
```

```
innodb_ft_enable_stopword	OFF
```

反映されます。

Ubuntu なんかでは、 /etc/mysql/conf.d/ ディレクトリが用意されているので、その中に設定ファイルを放り込むと良いでしょう。

僕のはこんな感じ

/etc/mysql/conf.d/fulltext_search.cnf

```
[mysqld]
# Fulltext search bigram settings.
ft_min_word_len = 2
innodb_ft_min_token_size = 2
innodb_ft_enable_stopword = OFF
```


# 検索インデックスの再生成

インデックスの再生成は、

REPAIR TABLE table_name QUICK; ではなく (これは MyISAM の場合)

InnoDB の場合は

```mysql
ALTER TABLE table_name FORCE;
```

で行えます。

```mysql
SELECT COUNT(*) FROM ...
WHERE MATCH(search_text) AGAINST ('+tw +wi +in' IN BOOLEAN MODE)
```

→ 結果でました!
"Unity"+"leap motion" [練習八つ]: VRGUI Project

<h2>VRGUI Project： 「uGUIを作りましょう」</h2>
<h3>Goal: 空間に浮かぶGUIを作る</h3><ul>
<li>Step 1: UnityでLeap Motionを使ってGesture Motion認識ができる。</font></li>
<li>Step 2: uGUIでメニューを作って空間に浮かべる </li>
<li><font color=red>Step 3:メニュー選択。任意のGameObjectからRaycastを飛ばしてメニューを選択できる。選択状態で色を変える。できたら音も。</font></li>
<li>Step 4:メニューで選択した項目を実行。メニューに任意のアクションを割り当てられるように実行する。</li>
</ul>

<hr/>

- Sword of Art Onlineで出るメニュのイメージを[Download](http://arkblackswords.deviantart.com/art/Sword-Art-Online-Vector-Icons-434245957)する。

<img width="529" alt="Screen Shot 2015-12-01 at 14.45.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/0ffd81c1-e174-36ba-fef1-b3e7750c9656.png">
<br/>

- Unityで前に作ったButton Menu demoにon/offのイメージをAdd

![Screen Shot 2015-12-01 at 14.36.13.png](https://qiita-image-store.s3.amazonaws.com/0/99307/cd338d9a-12fd-9501-9081-562503e058fe.png)

on image 列
![Screen Shot 2015-12-01 at 14.36.32.png](https://qiita-image-store.s3.amazonaws.com/0/99307/d6d99868-a759-902c-fda7-678cee5d2701.png)

off image 列
![Screen Shot 2015-12-01 at 14.56.56.png](https://qiita-image-store.s3.amazonaws.com/0/99307/c7c691ac-abd8-280a-d85e-4222f883b1cf.png)

![Screen Shot 2015-12-01 at 15.54.45.png](https://qiita-image-store.s3.amazonaws.com/0/99307/d4264992-0baf-234e-1e0b-1c0d67237db6.png)

<br/>

- scriptでraw_imageを追加する

```lang:button-demo
RawImage[] GUIimages = GetComponentsInChildren<RawImage>();
foreach(RawImage image in GUIimages){
			image.enabled = status;
		}
```

- set Activeを利用して、toggle効果を適用する。

```lang:setActive
public ButtonDemoGraphics onGraphics;
public ButtonDemoGraphics offGraphics;

private void TurnsOnGraphics()
  {
    onGraphics.SetActive(true);
    offGraphics.SetActive(false);
  }

  private void TurnsOffGraphics()
  {
    onGraphics.SetActive(false);
    offGraphics.SetActive(true);
  }
```
<br/>

- 結果

[結果見る](https://youtu.be/Y5Zkm06tmLE)
今どきVMwareでゲストOSを入れたら、VMware Toolsじゃくてopen-vm-toolsらしい。

Linuxのデスクトップ環境が欲しくてUbuntuをVMware仮想マシン上にインストールしました。インストール後、いつもの流れでVMware toolsをインストールしようとしたのですが、以下のメッセージが表示されます。

```bash
yuichi@yuichi-virtual-machine:~/tmp/vmware-tools-distrib$ sudo ./vmware-install.pl 
[sudo] password for yuichi: 
open-vm-tools are available from the OS vendor and VMware recommends using 
open-vm-tools. See http://kb.vmware.com/kb/2073803 for more information.
Do you still want to proceed with this legacy installer? [no] no
```

今はVMwareはVMware Toolsより、各OSベンダが提供しているopen-vm-toolsの使用が推奨されているとのこと。へえー。ちなみにVMware Toolsのオープンソース実装らしいです。


インストールは極めて簡単。パッケージをインストールするだけです。

```
sudo apt-get install open-vm-tools
```

デスクトップの拡張を入れたい人はこちらもお忘れなく。

```bash
sudo apt-get install open-vm-tools-desktop
```

再起動すれば、便利に使えてます。日々進化しているなあ。
Let's note のホイールパッドが使えないのはどうにかできないものか、、

2017/12/19
Ubuntu 16.04に対して実行してOKでした

2018/09/29
Ubuntu 18.04.1 をインストール時に実施
Let's note SV7に変更したら、VMWare上のUbuntuでホイールパッドが使えて最高！
#東京都の隣接都道府県のリスト

select distinct ?pref ?label where { 
<http://ja.dbpedia.org/resource/東京都> <http://ja.dbpedia.org/property/隣接都道府県>  ?pref . 
?pref <http://www.w3.org/2000/01/rdf-schema#label> ?label
}



#東証一部上場企業
select distinct ?name ?abstract where {
    ?company <http://dbpedia.org/ontology/wikiPageWikiLink> <http://ja.dbpedia.org/resource/Category:東証一部上場企業> .
    ?company rdfs:label ?name .
    ?company <http://dbpedia.org/ontology/abstract> ?abstract .
}

#都道府県名と概要
select distinct * where { 
?company <http://dbpedia.org/ontology/wikiPageWikiLink> <http://ja.dbpedia.org/resource/Category:日本の都道府県> . 
?company rdfs:label ?name . 
?company <http://dbpedia.org/ontology/abstract> ?abstract .
}




#日本の都道府県，市町村リスト
 select distinct ?prefectureName ?cityName where {
    ?prefecture <http://dbpedia.org/ontology/wikiPageWikiLink> <http://ja.dbpedia.org/resource/Category:日本の都道府県> .
    ?prefecture a <http://schema.org/AdministrativeArea> .
    ?city <http://dbpedia.org/ontology/location> ?prefecture .
    ?prefecture rdfs:label ?prefectureName .
    ?city a <http://dbpedia.org/ontology/City> .
    ?city rdfs:label ?cityName .
}



#media wiki api 仕様
http://qiita.com/yubessy/items/16d2a074be84ee67c01f
Maxima 覚書

# はじめに

```lang:Maxima
$ rmaxima
Maxima 5.36.1 http://maxima.sourceforge.net
using Lisp SBCL 1.2.11
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
(%i1)
```

基本的には使いたい数学関数の名前で検索

```lang:Maxima ?
(%i1) ? expand


 -- Function: expand

説明の山
```

して、例題を見て実際に使うという流れでやってるのですが、よく使う事柄（特に入出力）をまとめておこうと思った個人的な覚書です。
が、一応人が見ても良いように最低限の体裁だけ整えておくつもりです。
少しづつでも内容が増やせたら良いなぁなんて思ってます。


## 読むべき日本語の資料
[はじめてのMaxima](http://fe.math.kobe-u.ac.jp/MathLibre-doc/ponpoko/MaximaBook.pdf)
辞書代わりに使っています、あと、三章と四章は少なくとも読んでみたいと思ってはや数年。

[Maxima 入門ノート 1.2.1](http://www.eonet.ne.jp/~kyo-ju/maxima.pdf)
最初に通読し(ようと試みて途中で放置し）たのはこの”ささやか”な備忘録ことこの入門ノート。
個人的にgnuplotを先に少し触ったので連動させる章をよく読んだ記憶が。
Mathematica触った事ある人なら、付録をちらっと眺めたらもういろいろ出来ると思う。
（表計算ソフトとの連携もまじめに読んだら面白そう。）
演習問題と解答がセットなのでやはりどこかできちんと体系的に勉強しよう。

[Professional Maxima](http://www.muskmelon.jp/maxima/pro-maxima-20080303.pdf)
刺激的なタイトル、あと短い分量と実践よりの題材（センター試験を例題に取り上げる）のチョイス、大好きです。
これまた通読できずにつまみ食いだけなのでどこかで。

# 終わり方

```lang:quit
quit();
```

# 入出力
## batch とload
load は黙って読み込み、batchは読み込んだ内容を逐次実行、結果を画面に出力。

```lang:load_and_batch
(%i1) load("problem11_2.mac");
(%o1)                           problem11_2.mac
(%i2) batch("problem11_2.mac");
延々と実行結果
```

## writefile と closefile でそのまま保存

```lang:writefile_closefile

(%i1) writefile ("filename.out");

NIL
(%o1)                                done

保存される部分

(%i2) closefile();

NIL
(%o2)                                done
```

これでinterpreter上の表示”そのまま”に保存される。
人に見せたりノート代わりに。

## save と loadfile, playback(all)で中断再開
使ったことないけれど、（Lisp に似た独自形式で）入出力をそのまま保存して後日再開できる形式らしい。
storyboardのあれやこれ

## 初めに
[CYBIRDエンジニア Advent Calendar](http://qiita.com/advent-calendar/2015/cybird)
3日目の@cy-kenta-takahashiです。
CYBIRD2015年入社の新卒で今はiOSアプリ開発を担当しております。

2日目は（@keitarou）さんの「[俺たちはJavaScriptの非同期処理とどう付き合っていけば良いのだろうか](http://qiita.com/keitarou/items/79a038a29e1f8e39573b)」でした。
@keitarouさんは凄すぎて僕が爪の垢に感じますね。
僕もプログラムの可読性を向上するよう努力しないといけませんね。

## 内容について
今回はXcode（ver7.1現在）のstoryboardについて記載します。
というのも私はXcodeに触れてまだ6ヶ月なのですが、初めて触った際にレイアウトの作成方法が分からず苦戦しました。
ので初心者の方向けとはなりますが、簡単なレイアウトの作成とちょっとした応用を記載したいと思います。

## storyboardって？
まず初めにstoryboardとは、Xcodeでプロジェクト作成時に自動生成される「Main.storyboard」というファイルのことです。画面のレイアウトからアプリ全体の遷移までプログラムを組むことなく作成が可能なので、簡単な画面遷移図やプロトタイプを作成する際にも便利だと思います。もちろんプログラムと組み合わせれば、しっかりとしたアプリを作成できます。

## 実装してみよう
まずは画面内コンテンツの説明です。
![スクリーンショット 2015-12-01 13.59.43.png](https://qiita-image-store.s3.amazonaws.com/0/101229/b75af5c9-87f4-5cf5-f191-449f42927375.png)

手始めにボタンを画面中央へ置いてみましょう。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/101229/d3095d7d-45de-3144-04b9-44584a183af6.png)

このままでは画面サイズによって位置が変わってしますので下図のように制約をつけます。
これだけの操作でどの端末で見た場合でも画面中央にボタンが表示されます。
基本的な手順は以上となります。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/101229/cf94c0f3-bba9-4685-e0bb-8aa78990b784.png)

##簡単なレイアウトを作成してみよう
次はよく使用するであろう簡単なレイアウトを紹介します。
まずは灰色のブロック内にサイズが等しいボタンを4つ置いてみます。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/101229/896e6440-f7c1-562d-536f-fd1302182036.png)

並び順を意識しながら大雑把にボタンを配置します。
今回はタップ範囲が分かりやすいよう背景色をつけました。
配置した4つのボタンを選択し制約を2つ設定します。
　赤枠：選択した要素の上下左右マージンを0にする。
　青枠：選択した要素の高さ（height）を同じにする。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/101229/979bc2cd-e852-e409-fdc6-05eaf5a93223.png)

この状態で「update frames」をすると完了です。
この制約ではタップ範囲がボタンの文字より大きくなります。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/101229/0233a699-c819-6de6-781a-5a7255bb5b7a.png)
***
さて、次は上記の応用でボタンのタップ範囲を変えず、ボタンを等間隔に並べる方法です。
[公式ドキュメント](https://developer.apple.com/jp/devcenter/ios/library/documentation/AutolayoutPG.pdf)にも記載はありますが、これが少しややこしく苦戦しました。

まず初めに各隙間を可変にするため、viewを用意しましょう。
その後、ボタンに対して下記制約を付けます。
1.ボタンの横幅（width）と高さ（height）を固定する。
2.ボタンを中央揃えにする。
![07.png](https://qiita-image-store.s3.amazonaws.com/0/101229/bfa3a9f0-7c05-9a12-096c-4463c25b213d.png)

次に可変スペース用viewに下記制約を付けます。
1.上下左右マージン（今回は3で設定）
2.可変スペース用viewの高さを同じにする
![08.png](https://qiita-image-store.s3.amazonaws.com/0/101229/3c0abe64-6b7a-eb57-cd84-61d0ba177fb5.png)

これで等間隔に並べることが出来ました。
![09.png](https://qiita-image-store.s3.amazonaws.com/0/101229/18727ee0-fa65-7c93-b289-708739c37ea1.png)

ボタンの高さを変えると可変viewの大きさが自動で変わることが確認できます。
![10.png](https://qiita-image-store.s3.amazonaws.com/0/101229/d4c95b1a-7751-36dd-20cf-3494194c61a4.png)

基本的に可変スペース用viewは透明にします。
すると等間隔でボタンが綺麗に並びます。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/101229/8634a394-1e52-1709-9cad-b2128188f63f.png)

## まとめ

* storyboardを使用すれば感覚的にレイアウトの作成が出来る。
* 制約を上手く組み合わせることで様々な形式に対応可能。
* 色んな端末サイズでも可変に対応可能。
* 一部プログラムを組むことで更に正確なものに仕上がる。
* ね、簡単でしょ？

## 最後に
掘り下げればまだまだ設定するべき制約がありますが、
今回は初心者の方向けに簡単な制約の紹介をしました。
今からXcodeを使い始める方のお役に立てれば幸いです。
[CYBIRD エンジニア Advent Calendar](http://qiita.com/advent-calendar/2015/cybird) 明日は、（@kanacha）くんの「cocos2d-x超入門 そもそも何からはじめればいいの？」です！
彼は僕と同じ新卒であり、業務では全く違う言語を使っているので、とても楽しみですね！
早く帰ってモンハンやりたい。それでは！
HerokuでLaravel

# HerokuにLaravel5.1をデプロイのメモ。

## ComposerでLaravel5をGet!

```shell-session
% composer create-project laravel/laravel --prefer-dist heroku-laravel5
Installing laravel/laravel (v5.1.11)
  - Installing laravel/laravel (v5.1.11)
    Loading from cache
    省略...
```

## 直下にApacheなProcfileを作る!

```shell-session
% cd heroku-laravel5
% ls
app		bootstrap	composer.lock	database	package.json	phpunit.xml	readme.md	server.php	tests
artisan		composer.json	config		gulpfile.js	phpspec.yml	public		resources	storage		vendor
```

```shell-session
% touch Procfile
% echo 'web: vendor/bin/heroku-php-apache2 public' >> Procfile
```

## Gitの初期化

```shell-session
% git init
Initialized empty Git repository in /Users/tetsuya/Project/heroku-laravel5/.git/
% git add .
% git commit -m 'init laravel5'
```

## Herokuアプリを作成（ビルドパックはPHP）

```shell-session
% heroku create heroku-laravel5 --buildpack https://github.com/heroku/heroku-buildpack-php
Creating heroku-laravel5... done, stack is cedar-14
Buildpack set. Next release on heroku-laravel5 will use https://github.com/heroku/heroku-buildpack-php.
https://heroku-laravel5.herokuapp.com/ | https://git.heroku.com/heroku-laravel5.git
Git remote heroku added
```

## Herokuへpushしてブラウザで見る！

```
% git push heroku master
% heroku open
```

- エラー画面の出現!

## ビルドパックの確認！

```shell-session
% heroku buildpacks
=== heroku-laravel5 Buildpack URL
https://github.com/heroku/heroku-buildpack-php
```

## nodeの方のビルドパックも追加してやる！

```shell-session
% heroku buildpacks:add heroku/nodejs
Buildpack added. Next release on heroku-laravel5 will use:
  1. https://github.com/heroku/heroku-buildpack-php
  2. heroku/nodejs
Run git push heroku master to create a new release using these buildpacks.
```

## Herokuへpushしてブラウザで見る2！

```
% git push heroku master
% heroku open
```

- エラー画面の出現2!

## APP_KEYを設定！

```shell-session
heroku config:set APP_KEY=$(php artisan key:generate --show)
```

## Herokuへpushしてブラウザで見る3！

```
% git push heroku master
% heroku open
```

- 見れましたー
AWS x Xcode: Amazon Mobile hubを使ってみた。


AWSとXcode/Swiftの勉強をしていくに伴い、
「なんでもいいからとにかく両方を接続してつかってみたい！！」
という子供みたいな欲求が出てきた。

調べてみたら、iOS / Android共に使えるAmazon MobileHubなるサービスが。
AWS各種サービスの、モバイル（iOS/Android)開発をするため、
目的にあわせたサンプルコードを出力してくれるようだ。

S3,Lambdaを始め各種サービスに接続可能とのこと。
試してみようじゃないですか。

今回はまずサンプルコードを実行するところまで。


---

https://aws.amazon.com/jp/mobile/

---


### 手順：

####(1)プロジェクトを作成し、プロジェクト名を入力

![Kobito.ApoFnY.png](https://qiita-image-store.s3.amazonaws.com/0/103163/c115ceb0-c36c-4509-3a45-29ba6b22ebfa.png "Kobito.ApoFnY.png")

####(2)プロジェクトの種類を選択。以下のような種類がある。
 
![Kobito.mTbAvi.png](https://qiita-image-store.s3.amazonaws.com/0/103163/04f4918c-320f-ef34-51c1-1e6b715e7f2d.png "Kobito.mTbAvi.png")

AWSの各種サービスに紐付いているようです。

- ユーザサインイン/認証 > Cognito
- プッシュ通知 > SNS
- ストレージ > S3
- コンテンツ配信 > CloudFrond
- アプリケーション分析 > Amazon Mobile Analytics
- クラウドロジック > Lambda

![Kobito.RgOcz6.png](https://qiita-image-store.s3.amazonaws.com/0/103163/3c39cc15-8d55-b979-b9da-b4452a6d6b57.png "Kobito.RgOcz6.png")

Cloud Logicを選択すると
####「あなたはクラウド上でコードを走らせたいんですか？（小並訳）」
というような確認メッセージが出てくる。

「Enable logic」を選ぶとLambdaに飛んでfunctionを作成できる。
今回はテスト実行が目的なので、何もせずに実行。
「Build your app」へ。

####(3)プラットフォーム選択

iOS or Android。
今回はiOSのため林檎マークを選択。

![Kobito.5N8co8.png](https://qiita-image-store.s3.amazonaws.com/0/103163/0511f313-0dc5-0171-bead-6be623a87487.png "Kobito.5N8co8.png")

システム構成の確認。

####「Xcode7入ってる？無かったらいれといてね。」

とあり、OKなら次のステップへ。

####(4)サンプルコードのダウンロード、及びコードの実行

![Kobito.TK0Egs.png](https://qiita-image-store.s3.amazonaws.com/0/103163/a42a3046-8cb4-5ee2-a200-3efb5a5fec7a.png "Kobito.TK0Egs.png")

####「サンプルプロジェクトダウンロードしてね。」
####「ダウンロードしたプロジェクトをXcodeで立ち上げてね。」
####「実行しちゃって！」

これでシミュレータで以下のようなアプリが立ち上がる。
サンプルfunctionは、デフォルトでは米国東部のバージニアリージョンに保存されているので注意。


![Kobito.3s9HMs.png](https://qiita-image-store.s3.amazonaws.com/0/103163/9fc039b0-cb5e-3e6c-6162-ce94f6920856.png "Kobito.3s9HMs.png")   ![Kobito.TM3E7d.png](https://qiita-image-store.s3.amazonaws.com/0/103163/6b5d97ae-f005-97ba-b403-9173c0cb627b.png "Kobito.TM3E7d.png")


AWS,XCodeの初学者としてとりあえず触ってみたい、という欲求は満足したものの、ここからこれを解析していくのが重要ですね。

さてがんばろう。
Django：templates設定したらTemplateDoesNotExist at /admin/ってなった場合の対応

ノリノリでsetting.pyにテンプレート設定してヤッホイした後で、
「あっ！そうだ！管理画面使おう」って思ったら、「TemplateDoesNotExist at /admin/」エラー発生...。

# 解決法
/virtualenv/lib/python2.7/site-packages/django/contrib/admin/templates
配下の
admin
registration
フォルダをDjangoプロジェクトのtemplatesフォルダ内にコピー。
これで127.0.0.1:8000/admin復活！

詳細はこちら参照
[リンク]http://righthelp.xyz/question/8996549/admin-site-templatedoesnotexist-at-admin




以上、初投稿＼(^o^)／
Grunt-CacheBreakerの使い方


[自分のサイト](http://td-inc.jp/)に[CloudFlare](https://www.cloudflare.com/)を導入するにあたり、JS, CSSのファイルを更新した時に都度古いキャッシュを無効化できるよう、 [Grunt-CacheBreaker](https://github.com/shakyshane/grunt-cache-breaker) を導入してみた。

Caching LevelをStandard(*1)にしている場合は、Gruntでコードをデプロイ用にビルドする時に、クエリ値にタイムスタンプを与えられれば良い。

```Gruntfile.coffee
cachebreaker: 
  dev: 
    options: 
      match: ['styles/scritps/main.js', 'assets/styles/styles.css']
    files: 
      src: ['head.php']
        
```

`options > match` でロード時にクエリを加えたいファイル名を列挙。
`files > src` でそれらのファイルへの参照を持つファイルを指定 

他にもオプションはあるので、クエリ値をファイル名に加えたい場合などは、[ドキュメント](https://github.com/shakyshane/grunt-cache-breaker)参照。

---

*1 Caching Levelについてのヘルプ抜粋

> ###What are CloudFlare's Caching Levels?
> 
> You can set CloudFlare's CDN to cache static content according to these levels:
> 
> **No Query String**: Only delivers files from cache when there is no query string.
>
> **Ignore Query String**: Delivers the same resource to everyone independent of the query string.
>
> **Standard**: Delivers a different resource each time the query string changes.
rails runnerやmodelからapp/views/に有るテンプレートを使ってhtmlを生成したい

バッチ処理でhtmlを生成したかったのですが、controllerではなく、rakeやrunnerでhtmlを出力したかったので調べました。

結論だけを書くと

```ruby
    # HTML生成用のクラス
    class ArticleView < ActionView::Base
      include Rails.application.routes.url_helpers
      include ActionView::Helpers::TagHelper

      def defalt_url_options
        {}
      end
    end

    def html_make
      @records = Article.all # 適当にインスタンス変数を呼び出す例
      action_view = ArticleView.new(Rails.root.join("app", "views"))
      action_view.assign instance_variables.each_with_object({}) { |name, hash| hash[name.slice(1, name.length)] = instance_variable_get(name)} # インスタンス変数全部をレンダリングする用に渡す
      action_view.render(:template => "articles/index", format: "html") 
    end
    
    puts html_make
```
こんな感じです。
最初、参考にした[ActionView を単体で使ってみる]をそのまま使っていたのですが、
defalt_url_optionsがないとurl_forが動かなかったのでこんな感じにしてみました。

参考:
ActionView を単体で使ってみる - http://blog.eiel.info/blog/2014/07/18/action-view/
Rails 3: How to render ERb template in rake task? - Stack Overflow - http://stackoverflow.com/questions/4262044/rails-3-how-to-render-erb-template-in-rake-task