OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7 へ Redmine をインストール

#目的
Redmine のインストール・検証

#前提
[link-1]:http://qiita.com/ikep-panda/items/c78be3d465256770f6a5
[CentOS7インストール][link-1] 済み
VirtualBOXで仮想マシン作った人は、事前にクローン作成をおすすめ

手順は Redmine.JP の [Redmine 3.0をCentOS 7.0にインストールする手順](http://blog.redmine.jp/articles/3_0/installation_centos/) を参照

特に記載ないものは **root** ユーザで実行

そのままの手順だとエラーが出る箇所のみ対応記述

#CentOSの設定
##firewalldでHTTPを許可
Redmine.JP の手順だと確かに httpサービス は起動するけど、ポートは閉じたままなので開け方

```shell-session
[root@centos7 ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
[root@centos7 ~]# firewall-cmd --reload
[root@centos7 ~]# firewall-cmd --zone=public --list-port
80/tcp
```

#必要なパッケージのインストール
##開発ツール(Cコンパイラ等)のインストール
[前回手順][link-1]で開発ツールをインストール済みなら不要

#Rubyのインストール
##libffi インストール
※Rubyインストール時にエラーが出るので、事前に **libffi-devel.x86_64** をインストールしておく

```shell-session
[root@centos7 ~]# yum list | grep libffi
libffi.x86_64                           3.0.13-11.el7                  @anaconda
libffi.i686                             3.0.13-11.el7                  base
[root@centos7 ~]# yum -y install libffi-devel.x86_64
　　～ 省略 ～
インストール:
  libffi-devel.x86_64 0:3.0.13-11.el7
　　～ 省略 ～
[root@centos7 ~]# yum list | grep libffi
libffi.x86_64                           3.0.13-11.el7                  @anaconda
libffi-devel.x86_64                     3.0.13-11.el7                  @base
libffi.i686                             3.0.13-11.el7                  base
libffi-devel.i686                       3.0.13-11.el7                  base
```

ちなみにこんなエラーが出る

```shell-session
linking shared-object fiddle.so
/bin/ld: ./libffi-3.2.1/.libs/libffi.a(raw_api.o): 再配置 R_X86_64_32S (`.rodata' に対する) は共有オブジェクト作成時には使用できません。-fPIC を付けて再コンパイルしてください。
./libffi-3.2.1/.libs/libffi.a: シンボルを読み込めませんでした: 不正な値です
```

#おわりに
基本的には Redmine.JP にある手順でオッケー
インストールが終わったら、ダウンロードした **～tar.gz** ファイルは消しましょう
何度もインストールを試したい人は、**～tar.gz** ファイルをホストPCに移しておくと便利

次はいろいろプラグインを試してみる
Macで外付けJISキーボードをいい感じに使いたい


## 近況

* （前提）自宅ではMacbook（USキー配列）、左右Cmdをカナかなとしても使う設定でしこたま慣れている
* 会社で支給されたノートPC（Win）のキー配置が絶妙に×

　　「.」が超ちっさい！とか「WindowsキーとFnの配置、普通逆じゃね？」とか
　　なので、自前のRealforce（JIS配列）を使用。IMEは変換・無変換でON/OFFするよう設定している

* 会社で最近Macbookが支給されたが強制的にJIS配列


##やりたいこと
「PC/Mac両方でRealforce（JIS）１つで済むようにしたい」

具体的には、MacbookにつないだRealforceで
・変換・無変換キーを有効にしたい
・その上でMacのUSキー配列（スペース両脇はCmd）に近い配置としたい →変換・無変換を左右Cmdにしたい

## 使うソフト
### Seil - OS X用のソフトウェア
>https://pqrs.org/osx/karabiner/seil.html.ja

外付けJISキーボードの変換無変換キーを有効にするために導入。
これで変換・無変換を有効にした上で、Karabinerで修飾キーの配置換えを設定する

CapsLockをFnキーとして使う際は、システム環境設定で「無効」にしてからやれという旨書かれている
Fnキーが無い状態になるが、使って行って必要になったらまた設定見直すということで。
ひとまずは変換・無変換・カナキーを有効化したのみ。

### Karabiner - OS X用のソフトウェア
>https://pqrs.org/osx/karabiner/index.html.ja

キーボードをMacに接続してKarabinerのEventViewerとにらめっこしながら所望のキーのリマップ設定すればおｋ

### 参考）
Karabinerでの設定はコマンドラインから設定エクスポート。他のMacへもインポート可能
（キーボード一旦持ち帰ってきて自宅でチクチクやったので）

`$ /Applications/Karabiner.app/Contents/Library/bin/karabiner export > ~/Desktop/karabiner-import.sh`

別Macではこれをインポートすればよい

`$ sh ~/Desktop/karabiner-import.sh`

Karabinerは設定を複数作れるので、２つにセッティングを分けておいた。
・デフォルト（Macのキーボード）
・Realforce（91UBK）

書いた時点での設定はこんな感じ。（コマンドラインでエクスポートしたもの）

```Default.sh
#!/bin/sh

cli=/Applications/Karabiner.app/Contents/Library/bin/karabiner

$cli set repeat.wait 53
/bin/echo -n .
$cli set repeat.initial_wait 200
/bin/echo -n .
$cli set remap.jis_command2eisuukana_prefer_command 1
/bin/echo -n .
/bin/echo
```

``` Realforce.sh
#!/bin/sh

cli=/Applications/Karabiner.app/Contents/Library/bin/karabiner

$cli set remap.jis_kana2commandR_kana 1
/bin/echo -n .
$cli set remap.jis_command2eisuukana_prefer_command 1
/bin/echo -n .
$cli set repeat.wait 53
/bin/echo -n .
$cli set repeat.initial_wait 200
/bin/echo -n .
$cli set remap.pclikehomeend_emacs 1
/bin/echo -n .
$cli set remap.jis_eisuu2commandL_eisuu 1
/bin/echo -n .
/bin/echo
```


3/17追記：

* Application→Fnキーに（実際にはほぼ押さないけど一応）
![363A6A8C-3E6E-4ACF-B32F-ACDF9586D58B.png](https://qiita-image-store.s3.amazonaws.com/0/9039/4a5ca8f4-3d85-5d70-f038-69c3af19d0f5.png)

* Windows風のコピー、カット、ペースト（Ctrl+c, v, x）を有効化
→Macのキーボード使うときはCmd＋c, v, xで違和感ないんだが、Realforece使ったときはやはりCtrl+〜のほうがしっくりくる
![66D67C41-5C95-403B-B104-BE84365C8D70.png](https://qiita-image-store.s3.amazonaws.com/0/9039/c3960afd-8365-0ee3-6d97-08dfd959c16a.png)
Looping idioms in Python


# Abstruction
Pythonのループの書き方を紹介していきます。 Pythonのinteractive shell の実行結果を最初に紹介していくので、実際に自分で書いて実行してみるとわかりやすいと思います。


```python
>>> # Let's create lists

>>> colors = "red blue green yellow".split()
>>> colors
['red', 'blue', 'green', 'yellow']

```

## Vanilla way to loop over data
listのindexを指定してデータを取り出す方法

```python
>>> for i in [0, 1, 2, 3]:
	print colors[i]

	
red
blue
green
yellow
```


## Classical way to loop over data


`[0, 1, 2, 3]` は `range(len(colors))`で取得できるのでrangeを使ったイテレーション

```python
>>> range(4)
[0, 1, 2, 3]
>>> for i in range(len(colors)):
	print colors[i]

	
red
blue
green
yellow

```

## Pythonic way to iterate data. 
iteratableなデータ（ループできるデータ）はindexを指定することなく、`in`のあとに書くことにより、すべてをイテレーションすることができる。下記のコードは上記の2つと等価です。

```python
>>> for i in colors:
	print i

	
red
blue
green
yellow

```


## Vanilla way to iterate data in reversed order

```python

>>> for i in [3, 2, 1, 0]:
	print colors[i]

	
yellow
green
blue
red
```

## Classical way to iterate data in reversed order

`range`は第一引数として、始まりの値、第二引数として終わりの値、第三引数として、増減の値を指定できる。これにより、indexの逆の順番のリストを生成できる。

```python
>>> range(3, 0, -1)
[3, 2, 1]
>>> range(3, -1, -1)
[3, 2, 1, 0]
>>> range(len(colors) - 1, -1, -1)
[3, 2, 1, 0]

```


```python
>>> for i in  range(len(colors) - 1, -1, -1):
	print colors[i]

	
yellow
green
blue
red

```

## Pythonic way way to iterate data in reversed order

逆の順番でやりたいのなら、reversedというbuild-in関数が使える。

```python
>>> for i in reversed(colors):
	print i

	
yellow
green
blue
red
```

`list[::-1]`という文法も使える. が,　reversedのほうが明示的であると思われる。

```
>>> for color in colors[::-1]:
     print color

yellow
green
blue
red
```

## Vanilla way to iterate data with index number

```python
>>> for i in range(len(colors)):
	print i, "-->", colors[i]

	
0 --> red
1 --> blue
2 --> green
3 --> yellow

```


## Pythonic way to iterate data with index number

`enumerate`は、index numberとvalueをtupleで返すiteratorを返す。

```python
>>> enumerate(colors)
<enumerate object at 0x106e55690>
>>> list(enumerate(colors))
[(0, 'red'), (1, 'blue'), (2, 'green'), (3, 'yellow')]
```


```python
>>> for i, color in enumerate(colors):
	print i, "-->", color

	
0 --> red
1 --> blue
2 --> green
3 --> yellow

```

## Iterate data with sorted function

文字列をソート

```python
>>> for color in sorted(colors):
     print color

blue
green
red
yellow

```

逆順でソート

```python
>>> for color in sorted(colors, reverse=True):
     print color

yellow
red
green
blue
```

文字の長さ順でソート

```python
>>> for color in sorted(colors, key=len):
     print color

red
blue
green
yellow

```
今更「1から10までの和の平均」とその実行速度

## はじめに

先日`python`にハローしたので初心に返って基礎演習みたいなことをしていた
今更ながら「1から10までの和の平均」なんてものをやってみました
その際の解法のご紹介


## 通常パターンのコード
```py
# -*- coding: utf-8 -*-
def normal_average(start, end):
    # averageの計算時にfloatになるように0.0という初期化をしている
    sum = 0.0
    size = end - start + 1
    for i in range(start, end + 1):
        sum += i
    else:
        print "normal_average = %f"%(sum/size)

start = 1
end = 10
normal_average(start, end)
```
<pre>
結果
normal_average = 5.500000
</pre>
`+1`の部分がいけてない感あるけどまぁ良しとする
`python`初心者なのでお作法悪いところはご愛嬌

## 別パターンのコード
```py
def another_average(start, end):
    print "another_average = %f"%((start + end)/2.0)

start = 1
end = 10
another_average(start, end)
```
<pre>
結果
another_average = 5.500000
</pre>
連続した整数の和の平均ってループなんて回さずともこれでいいんじゃないのとふと思ったので書いてみた
こんな解き方もアリかなと
これは数が多くなってくればそれだけ処理速度に差が出るはずだ

## 処理速度計測
数が多ければ多いほど差が出るはずなので、今回は`1から1億`までの和の平均を求めてみます

```py
# -*- coding: utf-8 -*-
import time

def normal_average(start, end):
    sum = 0.0
    size = end - start + 1
    for i in range(start, end + 1):
        sum += i
    else:
        print "normal_average = %f"%(sum/size)

def another_average(start, end):
    print "another_average = %f"%((start + end)/2.0)


# メイン実行部
start = 1
end = 100000000

# 実行時間の計測
normal_start_time = time.time()
normal_average(start, end)
normal_end_time = time.time()
print "execute time is %f"%(normal_end_time - normal_start_time)
print

another_start_time = time.time()
another_average(start, end)
another_end_time = time.time()
print "execute time is %f"%(another_end_time - another_start_time)
```
<pre>
結果
normal_average = 50000000.500000
execute time is 12.961456

another_average = 50000000.500000
execute time is 0.000006
</pre>
（圧倒的じゃないか我軍は…！）
当たり前ですが処理速度が段違いですね

## おわりに

そもそものロジックを変えれば圧倒的に早く結果を取れることもあるという話
もちろんこの解き方に問題がないわけではないですが、少なくとも「連続した整数の和の平均」を出すにはループ回すよりは早く求められますね
視点を変えて問題を解くのって大事という教訓でした
log4net覚え書き

ログ出力ライブラリであるlog4netを使うまでの準備をまとめる。

* Apacheのサイトからlog4netのバイナリをダウンロード。
 - 本投稿ではバージョン1.2.13 newkeyを使用。
* 任意のフォルダに展開。
* Visual Studioのプロジェクトにおいて、参照設定でdllを選択。
* AssemblyInfo.csにて次の記述を追加。ログ設定ファイル名の指定。
 - C#のプロジェクトを仮定。

```csharp:AssemblyInfo.cs
// Log4net用設定ファイル
[assembly: log4net.Config.XmlConfigurator(ConfigFile=@"Log4net.xml", Watch=true)]
```

* ログ出力フォーマットファイルを用意。

```xml:Log4net.xml
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<log4net>
		<appender name="MylogAppender" type="log4net.Appender.RollingFileAppender">
			<File value="LogSample.log" />
			<AppendToFile value="true" />
			<RollingStyle value="Size" />
			<maxSizeRollBackups value="10" />
			<maximumFileSize value="5KB" />
			<StaticLogFileName value="true" />
			<layout type="log4net.Layout.PatternLayout">
				<ConversionPattern value="%date [%thread] [%-5level] (%method) - %message%n" />
			</layout>
		</appender>

		<root>
			<level value="INFO" />

			<appender-ref ref="MylogAppender" />
		</root>
	</log4net>
</configuration>
```

* ロガーを提供するクラスを追加。

```csharp:Log.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;

    public class Log
    {
        private static ILog logger = null;

        public static ILog getLogger()
        {
            if (logger == null)
            {
                logger = LogManager.GetLogger(@"LogSample");
            }

            return logger;
        }
        
    }
```

* ログを出力したいクラスにて、上のロガー提供クラスからロガーを入手。
* そしてログ出力。

```csharp:Program.cs
using log4net;

    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            ILog log = Log.getLogger();

            log.Info("===== Program Start");

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

            log.Info("===== Program End");
        }
    }
```


```csharp:Form1.cs
using log4net;

    public partial class Form1 : Form
    {
        private ILog logger;

        public Form1()
        {
            InitializeComponent();

            logger = Log.getLogger();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            logger.Info("Button Clicked!");
        }
    }
```

* ログ出力例

```text:LogSample.log
2015-03-12 01:08:12,495 [1] [INFO ] (Main) - ===== Program Start
2015-03-12 01:08:14,792 [1] [INFO ] (button1_Click) - Button Clicked!
2015-03-12 01:08:15,034 [1] [INFO ] (button1_Click) - Button Clicked!
2015-03-12 01:08:15,760 [1] [INFO ] (Main) - ===== Program End
```
CapybaraからSeleniumを通してPhantomJSを使ってみる

# 概要

CapybaraからPhantomJSと言えばCapybara用のPhantomJSドライバのPoltergeistなのですが、
SeleniumからもPhantomJSを使えるので、CapybaraからSeleniumを通してPhantomJSを動かしてみました。
別のマシンでPhantomJSを動かすときに有用ではないでしょうか。

# PhantomJSとは

> PhantomJS はヘッドレスな（ブラウザ画面のない）QtWebKit ベースのブラウザで、JavaScript の API を通じて、そのブラウザを自由自在にあやつることが出来ます。使用シーンとしては、Jenkins などの CI ツールとの組み合わせによる Web ページの GUI の自動テストや、Web ページのスクリーンキャプチャ、スクレイピングなどが挙げられます。

[PhantomJS でログインが必要なページでも自由自在にスクレイピング - 凹みTips](http://tips.hecomi.com/entry/20121229/1356785834)



# 仕様
PhantomJSをSeleniumから使う場合には、リモートで起動しているPhantomJSに対して操作をする必要があるので、
PhantomJSサーバが起動してない場合には、別プロセスとしてPhantomJSのサーバを起動しています。
起動したリモートサーバに対してCapybara-Seleniumから操作を送っています。

# 実装

## PhantomJSが起動している環境で動作させる場合

```rb:phantomjs-use-remote.rb
require 'capybara'
require 'selenium-webdriver'
require 'capybara-webkit'

port = 8910
host = 'localhost'

Capybara.register_driver :phantomjs do |app|
  Capybara::Selenium::Driver.new(app, browser: :remote, url: "http://#{host}:#{port}")
end

browser = Capybara::Session.new(:phantomjs)

browser.visit 'http://qiita.com/'
browser.save_screenshot 'screenshot.png'
```

## PhantomJSが起動していない環境で動作させる場合


```rb:phantomjs-stand-alone.rb
require 'capybara'
require 'selenium-webdriver'
require 'capybara-webkit'

port = 8910
host = 'localhost'

sleep_time = 2

# phantomjsのリモートサーバを別プロセスで起動
pid = spawn 'phantomjs', '-w', port.to_s, :out => '/dev/null'
sleep sleep_time

Capybara.register_driver :phantomjs do |app|
  Capybara::Selenium::Driver.new(app, browser: :remote, url: "http://#{host}:#{port}")
end

browser = Capybara::Session.new(:phantomjs)

browser.visit 'http://qiita.com/'
browser.save_screenshot 'screenshot.png'

# phantomjsのリモートサーバを終了
Process.kill 'KILL', pid
```

# まとめ

ローカルで動作させるのであれば、Poltergeistを使った方がトリッキーなことをしなくて良さそうです。
Capybara資産を使ってリモートのサーバのPhantomJSを操作するときに有効かも。

# ライセンス
こちらのコードはMITライセンスです。
twitterカードの画像は絶対URIで指定しよう


twitterカードには `twitter:image` というメタ情報の設定がある。
ここに画像のURLを指定しておくと、下記のようにURLツイート時に画像が展開されるようになる。

![スクリーンショット 2015-03-13 0.10.24.png](https://qiita-image-store.s3.amazonaws.com/0/3251/81219319-3f8a-5d39-f6b0-0f767e31c8a3.png "スクリーンショット 2015-03-13 0.10.24.png")
※参考: https://dev.twitter.com/ja/cards/types/summary

## 問題

しかしながらこちらの設定には、普通に画像URLを渡すだけでいいものの、絶対URIで渡してあげないと画像を引っ張ってきてくれないというトラップがある。

例えばrailsとs3を使っている環境で、下記のような記述をしていた場合、 `//s3` で始まる参照URIがレンダリングされるようになる。

```rb
meta name="twitter:image" content="#{image_url('hoge.png')}"
```

このような `//` で始まるURLは、 `relative reference` と呼ばれており、[RFC3986](http://www.ietf.org/rfc/rfc3986.txt) にて定義されている。
`relative reference` そのものの説明は下記の記事がコンパクトにまとまっていて分かりやすい。
>If the browser is viewing that current page in through HTTPS, then it’ll request that asset with the HTTPS protocol, otherwise it’ll typically* request it with HTTP. 
[The Protocol-relative URL](http://www.paulirish.com/2010/the-protocol-relative-url/)

このような参照URIを利用している場合、twitterは指定した画像を引っ張ってきてくれない。
よってhttpsから始まる絶対URIを用意しておく必要がある。

## 解決方法

上記問題を解決するために今回は、下記のようなヘルパーメソッドを作成した。

```rb
meta name="twitter:image" content="#{twitter_image_url}"
```

```rb
def twitter_image_url
  url = image_url('hoge.png')
  url = "https:#{url}" if url =~ /\A\/\/s3/
  url
end
```

これで `image_url` が `//s3` で始まるパスを返したとしても、 `https:` を文頭に付与し、絶対URIを返すようになった。

facebookの `og:image` は上記のような設定をしなくても、いい感じに空気読んで引っ張ってきてくれるので、はまりやすいところだと思う。
vimのスワップファイルを一掃する


## 検出
findコマンドで検出する。

```
find . -name '.*.sw*'
```

## 削除
んでもって削除。

```
find . -name '.*.sw*'|xargs rm
```

## 参考
[vimのスワップファイルを掃除する方法](http://kaworu.jpn.org/kaworu/2007-10-22-1.php)
Goでブラウザの右クリックからコマンドを実行してみよう


毎日使うブラウザから、気軽にコマンドを呼び出せたら素敵でない?そんなことを思い、[kamakura.go #2](http://kamakura-go.connpass.com/event/12790/)でGoを使った方法を考えてみました。TL;DRという方は、[発表スライド](https://speakerdeck.com/lhside/right-click-to-go)をご覧ください。

## ポイント

今回のポイントは、Chromeとネイティブアプリで通信することです。幸い、ChromeはNative Messaging Host APIという、拡張機能とネイティブアプリで通信する機能を持っています。

利用するために、以下の3つの作業を行いました。しかし、Goと関係ないのでここでは取り上げません。

1. Native Messaging Hostの登録
2. 拡張機能の登録
3. Native Messaging Hostの配置

詳しくは、Googleのドキュメントを参照してください。

[Chrome Native Messaging](https://developer.chrome.com/extensions/nativeMessaging)

## 拡張機能とネイティブアプリの通信方法

通信は標準入力と標準出力を介して行われます。メッセージはJSONでシリアライズされており、その先頭に32ビットのメッセージ長が付加されます。

今回は、このプロトコルに従って通信するための小さなライブラリをGoで書きました。Native Messaging APIを介して、Chrome拡張機能と通信できます。

[lhside/chrome-go](https://github.com/lhside/chrome-go)

ライブラリのデモとして、ブラウザからRubyインタプリタを実行してみました。デモの流れは、次のとおりです。

1. Rubyスクリプトのテキストを選択する
2. 右クリックからRubyインタプリタを実行する
3. 実行結果をアラートダイアログが表示される

Goのソースコードは、以下のように短いものです。

```go
package chrome

import (
  "encoding/binary"
  "io"
)

var byteOrder binary.ByteOrder = binary.LittleEndian

func Post(msg []byte, writer io.Writer) error {
  // Post message length in native byte order
  header := make([]byte, 4)
  byteOrder.PutUint32(header, (uint32)(len(msg)))
  if n, err := writer.Write(header); err != nil || n != len(header) {
    return err
  }

  // Post message body
  if n, err := writer.Write(msg); err != nil || n != len(msg) {
    return err
  }
  return nil
}

func Receive(reader io.Reader) ([]byte, error) {
  // Read message length in native byte order
  var length uint32
  if err := binary.Read(reader, byteOrder, &length); err != nil {
    return nil, err
  }

  // Return if no message
  if length == 0 {
    return nil, nil
  }

  // Read message body
  received := make([]byte, length)
  if n, err := reader.Read(received); err != nil || n != len(received) {
    return nil, err
  }
  return received, nil
}
```

## まとめ

毎日利用するブラウザから、ターミナルへテキストをコピー&ペーストすることは手間です。そんな手間を最小にするための方法の一つを、Goで知ることができました。

Goには、バイナリデータを扱う標準パッケージが用意されています。bytesやencoding/binaryを学ぶ、よい題材でした。

最後に、kamakura.goは、Goについて学ぶ良い機会でした。鎌倉 小町通で、焼き鳥エンジニアから色々勉強させて頂きました。。。


### サンプルコード

```go
package main

import (
  "os"
  "os/exec"
  "log"
  "encoding/json"

  "github.com/lhside/chrome-go"
)

type Message struct {
  Text, Result string
}

func main() {
  // Receive message
  msg, err := chrome.Receive(os.Stdin)
  if err != nil {
    log.Fatal(err)
  }
  message := &Message{}
  if err := json.Unmarshal(msg, message); err != nil {
    log.Fatal(err)
  }
  log.Println(message.Text)

  // Execute message text as ruby script
  cmd:=exec.Command("ruby", "-e", message.Text)
  result, err := cmd.CombinedOutput()
  if err != nil {
    log.Fatal(err)
  }
  log.Printf("%s\n", result)

  // Post message with the result
  message.Result = string(result)
  body, err := json.Marshal(message)
  if err != nil {
    log.Fatal(err)
  }
  err = chrome.Post(body, os.Stdout)
  if err != nil {
    log.Fatal(err)
  }
}
```
AWSのEC2に基本的なLAMP環境を作ってみる(3)

[AWSのEC2に基本的なLAMP環境を作ってみる(2)](http://qiita.com/nakau1/items/a24571b374ad266c3f5e) にて、
EC2インスタンスにSSH接続して、
apache、PHP、MySQLなど色々とインストール/設定を行いました

ここでは、ここまで作ったWEBサーバのイメージ、いわゆるAMIを作ってみます

#AMIの作成

コンソール画面で、目的のインスタンスを選択した状態で、
`Actions` > `Image` > `Create Image` を選択しました

`Image Name`と`Image Description`には、任意の名前を入れました
(ここでは'LAMP-ON-AWS'という名前にしました)
 
それ以外の入力はせず、あとは`Create Image`ボタンを押すだけ

#AMIの確認
まずは、前回に作ったEC2インスタンスは`stop`しておきます

そして、左側の`AMIs`でAMI管理画面を開きます
注意:上項で作ったAMIはすぐにできるわけではないようで、しばらく`pending`になるようです

`available`になったら、左上の`Launch`を押下します

EBSとかセキュリティグループなどの設定は、前にやった通りなので、
EC2インスタンス起動までは割愛します

起動されたEC2インスタンスのグローバルIPを使って、
SSH接続してみました

```
ssh -i ~/.ssh/my-aws-key.pem ec2-user@(グローバルID)
```

SSH接続できたら、apacheは自動起動するようにしてあったはずなので、
早速ブラウザからアクセスしてみます

```
http://(グローバルID)
```
apacheの画面が出ました!

つまり、ちゃんと前回に作ったWEBサーバがAMI化(イメージ化)されて、
それを基に立ち上げた新しいEC2インスタンスには、
すでに基本的なLAMP環境が入っているということになりますね!
haml に HTML5 のカスタムデータ属性(data-*) を定義する方法


例えば、

```
<div data-id=“hoge”></div>
```

と定義したいときに、haml に

```
%div{data-id: “hoge”}
```

と書くと実行時に

```
syntax error, unexpected tLABEL
...ut.attributes({}, nil, data-id: "hoge")}></div>\n", 0, false...
```
と文法エラーになる。

## 解決方法

```
%div{data: {id: "hoge"}}
```

というように、``` - ``` で区切ってハッシュを定義すれば、

```
<div data-id="hoge"></div>
```
となる。

## 参考
http://haml.info/docs/yardoc/file.REFERENCE.html#html5_custom_data_attributes
Docker = AUFSという図式はもう忘れたほうがいいかもしれない、あるいはDockerとストレージドライバの話

2013年から2014年頃、空前のDocker大ブーム期に書かれたブログ記事には、よく「DockerはAUFSを使って差分イメージを実現している」と書かれてあります。

しかし最近のDockerではAUFSは使われていないのでもう忘れたほうがよいでしょう。(一応選択しようと思えばできます)

# Dockerとストレージドライバの話

Docker 0.7から、ストレージ層がプラガブルになって、ストレージドライバを自由に選択できるようになりました。
最新版のDocker(v1.5)では、 下記の5つを選択できるようになっています。

* aufs
* btrfs
* devicemapper
* overlay
* vfs

つまりaufsは選択肢のひとつにすぎないということです。

# 実際にどのストレージが使われているのか？

選択可能とは言え、大半のひとはデフォルトのまま使っていると思います。
ディストリビューションごとに、デフォルトのストレージドライバを調べてみました。

調査方法は、Dockerを標準的な方法でインストールして`docker info`を叩いた結果を見ました。

(2015/4/1現在)

| Distribution| Storage Driver|
|-----------|------------|
| CentOS 7    |        devicemapper |
| Ubuntu 14.04    |      devicemapper |
| CoreOS |overlay|
| OSX(boot2docker)|aufs |

というわけで、AUFSが使われているのはboot2dockerだけでした。

AUFSが使われなくなった理由としては、

> Unfortunately, AUFS is not part of the standard linux kernel and it’s unclear when it will be merged.

AUFSはLinux本体に含まれていないし、将来そうなる可能性も不明だから、だそうです。


# 参考
* http://enakai00.hatenablog.com/entry/20140420/1397981156
* http://enakai00.hatenablog.com/entry/20140802/1406958412
* http://www.1x1.jp/blog/2013/12/storage-driver-on-docker07.html
* http://blog.docker.com/2013/11/docker-0-7-docker-now-runs-on-any-linux-distribution/
DataBaseテスト

# データベーステスト　（MySQL)

## SQL
用意した **「テストデータ」** の動作を一通り確認する。
その前にDB環境の確認を行った上で進める。（ローカル環境）


>MySQLサーバの起動と停止
mysql.server startで起動
mysql.server stopで停止

入力した値、更新した値、削除した場合、問題がないか確認が必要です。

>ログイン
mysql -u [ユーザー名] -p

>エラーログの確認。
mysql> USE mysql
mysql> SELECT * FROM general_log\G


```lang:バージョン確認
共通テスト
・バージョンが正しいこと
mysql> mysql --version
```

```lang:対象のDB確認
・対象のDBがあること
mysql > show databases;
```

```lang:対象のDB確認
・対象のDBの選択
mysql > use test_db;
```

```lang:対象のテーブル確認
・対象のテーブルがあること（そもそも違っていたら）
mysql> SHOW TABLES;
```

```lang:対象のテーブルの詳細確認
・対象のテーブルの詳細確認
mysql > show table status;
```

```lang:対象のテーブル確認
・対象のテーブル確認
mysql > desc [テーブル名];
```


```lang:参照系テスト
・データの値が正しいこと
SELECT * FROM テーブル名　Where 列名 = 値；
```
```lang:データステータスが正しいこと
SELECT * FROM テーブル名　Where 列名 = ステータス値；
```
```lang:更新系テスト
・データの値が正しいこと
UPDATE テーブル名 SET 列名 = 値；
```
```lang:データステータスが正しいこと
UPDATE テーブル名 SET 列名 = ステータス値；
```

```lang:削除系テスト
・データの値が正しいこと
DELETE FROM テーブル名　Where 列名 = 値；
```

```lang:データステータスが正しいこと
DELETE FROM テーブル名　Where 列名 = ステータス値；
```
Yosemiteでlibv8をインストールする．


Railsで```bundle install```した時，libv8とtherubyracerでエラーが出たので，その時の対処法をまとめてみた．

# 環境
* OS
	* OS X Yosemite (10.10.2)
* Ruby
	* 2.1.0p0
* Rails
	* 4.0.2
* Gem
	* 2.2.0

# 状況
Railsプロジェクトの```bundle install```を実行した時，なんかのgemでlibv8もしくはtherubyracerがインストール出来ません．
エラー内容はbundle installする前にlibv8かtherubyracerのインストール完了させてから，もう一度bundle installしろと怒られます．

# 対処法
まず自分のOSのバージョンを次のコマンドを実行して確認します．
```
$ ruby -rubygems -e 'puts Gem::Platform.new(RUBY_PLATFORM)' - See more at: http://3.1415.jp/d3wpyqjr#sthash.kCD9jw8J.dpuf
```

私の環境では```x86_64-darwin-14```となりました．
次に，下の対応表でOSのバージョンとlibv8とtherubyracerのバージョンを確認します．

| CPU | OS | Version | libv8 | therubyracer|
|:----|:---|:--------|:------|:------------|
|amd64|freebsd|8     |3.3.10.4|0.10.2|
|amd64|freebsd|9     |3.3.10.4|0.10.2| 
|x86  |darwin |10    |3.3.10.4|0.10.2|
|x86  |darwin |11    |3.3.10.4|0.10.2|
|x86  |linux  |-------|3.3.10.4|0.10.2|
|x86  |freebsd|9     |3.11.8.3|0.11.0|
|x86_64|darwin|10    |3.11.8.3|0.11.0|
|x86_64|darwin|11    |3.3.10.4|0.10.2|
|x86_64|darwin|12    |3.11.8.3|0.11.0|
|x86_64|darwin|13    |3.16.14.3|0.12.1|
|x86_64|darwin|14    |3.16.14.7|0.12.1|
|x86_64|linux |-------|3.11.8.3 |0.11.0|

私の場合はOSのバージョンが```x86_64-darwin-14```だったので，libv8は3.16.14.7のバージョンでtherubyracerは0.12.1のバージョンを選択します．

自分のインストールすべきバージョンが分かったので，次はそのバージョンでインストールをします．
その時にあるオプションも書きます．それが```--with-system-v8```と```--with-v8-dir```です．
そのオプションも含めたインストール時のコマンドを下に挙げておきます．

``` libv8をインストールする時のコマンド
$ gem install libv8 -v '3.16.14.7' -- --with-system-v8
```

```therubyracerをインストールする時のコマンド
$ gem install therubyracer -v '0.12.1' -- --with-v8-dir
```

これで無事にインストールできると思います!

ただ，それぞれのオプションにどういう意味があるのかを調べていないので調べないといけませんね...
mongodb に geojson データを読み込み（mongoimport、jq 利用）＋近傍検索

こんにちは。
mongodb に geojson データ（Pointの集合）を import し、指定円内に含まれるものを検索してみました。

```
$ cat points.json
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [139.710001, 35.690283]
      },
      "properties": {
      },
    },
    :
    :
  ]
} 
$ cat points.json | jq -c '.features[]' | jq -c 'del(.type)' | mongoimport --db points --collection data --type json
$ mongo points
MongoDB shell version: 3.0.1
connecting to: points
> db.data.ensureIndex({"geometry.coordinates": "2dsphere"})
> db.data.getIndexes()
> db.data.find({"geometry.coordinates": {"$geoWithin": {"$centerSphere": [[139.710001, 35.690283] , 0.00000392]}}})
> db.data.find({"geometry.coordinates": {"$near": {"$maxDistance": 25.0, "$geometry": {"type": "Point", "coordinates": [139.710001, 35.690283]}}}})

{ "_id" : ObjectId("52fcf4611d41c875feaff3e3"), "geometry" : { "type" : "Point", "coordinates" : [ 139.710001, 35.690283 ] }, "properties" : {} }
>
```
注：```0.00000392 radians = 25.0/6378137.0```

また趣向を変えて jsonarray 形式のファイルで読み込みの方法も試しました。

```
$ tmpd=$(mktmp -d /tmp/tmpd.XXXXXX)
$ cat points.geojson | jq '.features' | jq 'del(.[].type)' > $tmpd/tmp.json
$ ls -ld $tmpd/tmp.json
  [16 MB 以下を確認]
$ jsonlint -v $tmpd/tmp.json
$ mongoimport -d points -c data --type json --jsonarray -f $tmpd/tmp.json
$ rm -r $tmpd
```
Laravel5にtwitter bootstrapを導入する

実はLaravel5には最初からBootstrap3が導入されています。

以下の場所に格納されています。

```linux
public/
└── css
     └── app.css

resources/
└── assets
     └── less
       └── bootstrap
           └── *.less
```

Bootstrapはlessというcssを拡張した言語で書かれており、そのlessファイルをcssにコンパイルしたものが`app.css`です。

Boostrapを使うためには、

```php
// resources/views/app.blade.php
 
<!DOCTYPE HTML>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>My Blog</title>
 
    <!-- CSS --><!-- 追加 -->
    <link href="/css/app.css" rel="stylesheet">
</head>
 
<body>     
    <!-- Scripts --><!-- 追加 -->
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</body>
</html>
```

とすればokです。
自己署名証明書の作成方法


# はじめに

自己認証局で認証されたSSL証明書を作成する必要があったのでメモしておく。

# 環境

- OS: CentOS7
- openssl: OpenSSL 1.0.1e-fips 11 Feb 2013

# 参考

以下を参考にした。
有り難うございます。

- https://supportforums.cisco.com/ja/document/137596
- https://kanasys.com/tech/47

# 手順

## 認証局側手順
### 秘密キーを作成

- 以下パスフレーズ有りの作成方法

```
$ openssl genrsa -des3 -out ca-privatekey_pass.pem 2048
Generating RSA private key, 2048 bit long modulus
...................................................+++
..................................+++
e is 65537 (0x10001)
Enter pass phrase for ca-privatekey_pass.key:
Verifying - Enter pass phrase for ca-privatekey_pass.key:
$
```

- 以下パスフレーズ無しの作成方法

```
$ openssl genrsa -out ca-privatekey.pem 2048
```


### CSR作成

```
$ openssl req -new -key ca-privatekey.pem -out ca-csr.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Shinjyuku-ku
Organization Name (eg, company) [Default Company Ltd]:IDCF
Organizational Unit Name (eg, section) []:Dev
Common Name (eg, your name or your server's hostname) []:ca-server
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
$
```

### 証明書作成

```
$ openssl req -x509 -key ca-privatekey.pem -in ca-csr.pem -out ca-crt.pem -days 3560
$
```

## サーバー側手順
認証局の手順と同様に秘密キーとCSRをまずは作成する。

### 秘密キー作成

```
$ openssl genrsa -out server-privatekey.pem
```

### CSR作成

```
$ openssl req -new -key server-privatekey.pem -out server-csr.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Shinjyuku-ku
Organization Name (eg, company) [Default Company Ltd]:IDCF
Organizational Unit Name (eg, section) []:Dev
Common Name (eg, your name or your server's hostname) []:haproxy01
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
$
```

### 証明書作成

以下認証局の証明書で署名したサーバー証明書を作成。
有効期限が3650日のserver-crt.pemというサーバー証明書が作成されます。

```
$ openssl x509 -req -CA ca-crt.pem -CAkey ca-privatekey.pem -CAcreateserial -in server-csr.pem -out server-crt.pem -days 3650
$
```

あとはサーバー側には、

- server-crt.pem
- server-privatekey.pem

を配置してクライアント側には、

- ca-crt.pem

認証局の証明書を配置すれば正常に接続できるはず。
【JavaScript】サブウインドウ


##サブウインドウの開き方

```js
// window.open( URL, ウィンドウ名 [,オプション] )
window.open( 'http://www.yahoo.co.jp/','yahoo',null)
```

オプションは、パラメータをカンマ区切りで設定する。
以下の例はwidth=400, height=300で開いている。

```js
window.open( 'http://www.yahoo.co.jp/','yahoo','width=400, height=300')
```

ちなみに、第二引数のウィンドウ名の箇所をnullにすると、新規タブになる。target="_blank" と同等。

参考：[window.open()で小窓](http://amenti.usamimi.info/windowopen.html)

##サブウインドウでPOST後に、親ウインドウを更新して、サブウインドウを閉じる。

```
$('form').submit(function(){
  $.ajax({
    url: $(this).attr('action'),
    type: 'get',
    data: $(this).serialize(),
    dataType: 'html'
  })
  //POSTが完了後に処理を行う。
  .always(function(){
    //親ウインドウの関数(func_update)を使い、親ウインドウを更新
    window.opener.func_update;
    //サブウインドウを閉じる
    window.close();
  })

  return false;
})
```

**window.openerで親ウインドウのwindowオブジェクトにアクセスできる。**
今回は親ウインドウを単に更新するわけでないので関数を呼び出しているが、単に更新ならばwindow.opener.location.reload()でも良い。


また、ネットでみつけた以下の例だとそもそもPOSTされなかったり、ポストできたとしても、ポストと親ウインドウの更新が同じタイミングになってしまうので、always()を使って、ポストが終わってから親ウインドウの更新と、サブウインドウを閉じている。

```js:うまくいかなかった例
$('form').submit();
window.opener.location.reload();
window.close();
```
３月１２日にサービス開始したNearLineの使い方


NearLineは、[Google Colund Storage ](https://cloud.google.com/storage/?hl=ja)のオプション的なものの一つです。

*※ 現在(2015年4月1日時点）、$300まで無料で使用可能ですがクレジットカードの登録が必要となります。*


以下、Near Lineの使い方です。
まずは、下記にアクセスし、プロジェクトを作成します。
https://console.developers.google.com/project

![スクリーンショット 2015-04-01 21.44.08.png](https://qiita-image-store.s3.amazonaws.com/0/73861/a3153e3b-ee1e-d5df-1ef7-abdd50b26d6a.png "スクリーンショット 2015-04-01 21.44.08.png")

　作成した「プロジェクト名」をクリックして
Storageバケットの作成の「バケットを作成」をクリックします。
![スクリーンショット 2015-04-01 21.44.35.png](https://qiita-image-store.s3.amazonaws.com/0/73861/7bd8f56f-d43f-aba6-f334-c7fd63d13ea1.png "スクリーンショット 2015-04-01 21.44.35.png")

　
ストレージクラスを 「Nearline」にしてバケットを作成します。
![スクリーンショット 2015-04-01 21.44.50.png](https://qiita-image-store.s3.amazonaws.com/0/73861/36f53489-0993-6151-8fb5-f8b5fc18c53b.png "スクリーンショット 2015-04-01 21.44.50.png")

あとは、お好きなファイル、ディレクトリをアップロード！
![スクリーンショット 2015-04-01 21.51.48.png](https://qiita-image-store.s3.amazonaws.com/0/73861/610ea82b-b56e-47c5-f304-67158500049f.png "スクリーンショット 2015-04-01 21.51.48.png")
私の場合は、写真のバックアップとかに使ってます
転送時間ですがざっくり1MB/秒（アップロード）な感じでした。


ちなみに、
gsutil を使ってファイル、ディレクトリのアップロード、ダウンロードが可能なので非常に便利です
（左ペインの権限からバケットに対するメンバを追加することができます）
rspec: controllerのテストで、render_viewsを使うとviewの内容を確認できる

便利だったので、備忘録として記録します。

#使いたい場合

`controller`のテストついでに、`view`の内容を確認したい場合。

#記述例
`render_views`と書いた後に`response.body`の内容を確認します。

````spec/controller/books_controller_spec.rb
RSpec.describe BooksController, type: :controller do
  describe 'GET #new'
    render_views

    before do
      get :new
    end

    it 'render_template :new' do
      expect(response).to render_template(:new)
    end

    it 'bodyに"新規作成"という記述があること' do
      expect(response.body).to include('新規作成')
    end

  end
end
````

以上です。

http://stackoverflow.com/questions/1063073/rspec-controller-testing-blank-response-body
https://www.relishapp.com/rspec/rspec-rails/v/2-1/docs/controller-specs/render-views
https://www.relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec
Apache JMeterをwebsocket対応させる


# 経緯
JMeterでwebsocketを話す必要性があったので導入しました。
https://github.com/maciejzaleski/JMeter-WebSocketSampler
このサンプラーを入れ、目的を達成する方法となります。

# 実施した環境
OS X(MacBook Pro 15")
homebrewでApache JMeterは導入済みです。

# 作業手順
## 必要なファイルなどの確認
### 設置すべきファイル
websocketサンプラーを設置する必要があります。

https://github.com/maciejzaleski/JMeter-WebSocketSampler/releases

また、依存するjarが必要です。

https://github.com/maciejzaleski/JMeter-WebSocketSampler/wiki/Dependencies

- jetty-http-9.1.1.v20140108.jar
- jetty-io-9.1.1.v20140108.jar
- jetty-util-9.1.1.v20140108.jar
- websocket-api-9.1.1.v20140108.jar
- websocket-client-9.1.1.v20140108.jar
- websocket-common-9.1.1.v20140108.jar

Repositoryより検索し、指定されたものないしはそれ以降のバージョンのjarを入手します。

http://search.maven.org/

### ファイル設置場所
https://github.com/maciejzaleski/JMeter-WebSocketSampler/wiki/Installation
必要なファイルを lib/ext/ に入れとけ、とのことです。
今回の場合、すでに導入されているJMeterは2.13でしたので `/usr/local/Cellar/jmeter/2.13/libexec/lib/ext ` がファイル設置場所となります。

先に挙げたファイルを入手し設置した後にJMeterを起動します。

# 作業後の確認

スレッドグループを右クリックし、「追加」→「サンプラー」で「websocket sampler」が出てくることを確認します。

![スクリーンショット 2015-04-01 21.10.35.png](https://qiita-image-store.s3.amazonaws.com/0/36942/e64d9492-57d5-0070-05d2-5a876917ff6a.png "スクリーンショット 2015-04-01 21.10.35.png")
NGUI の UIScrollView でスクロールした時にアイコンとかがない場所ができちゃう問題

UIWidget のWidget/Sizeの値がなんかでっかいと起きる。

コードでなおすときは

```csharp
var w = 480; // いい感じの横幅
var h = 480; // いい感じの縦幅
obj.GetComponent<UIWidget>().SetDimensions(w,h);
```
PHP5.6.7の新機能

[新機能](http://qiita.com/rana_kualu/items/ae125aedbe9b491b07af) / [変更点](http://qiita.com/rana_kualu/items/b2477d4981445a084adf)

PHP5.6.0以降[5.6.7](http://php.net/ChangeLog-5.php#5.6.7)までに出てきた新機能を試してみます。
なお5.6.1以降は基本バグフィックスなので、新機能はほとんどありません。

# PHP5.6.6

## DatePeriod#getStartDate()

これまでは一度[DatePeriod](http://php.net/manual/ja/class.dateperiod.php)を作ったら、そこから開始/終了日時を取得することはできませんでした。
PHP5.6.6でgetStartDate()とgetEndDate()、さらにgetDateInterval()が実装されました。

```php
	$period = new DatePeriod(new DateTime('2015/01/01'), new DateInterval('P1D'), new DateTime('2015/12/31'));
	var_dump($period->getStartDate());    // DateTime(2015-01-01)
	var_dump($period->getEndDate());      // DateTime(2015-12-31)
	var_dump($period->getDateInterval()); // DateInterval(P1D)
```

"Implemented FR"ってどういう意味でしょ？

# PHP5.6.3

## gmp_random_range()

http://php.net/manual/ja/function.gmp-random-range.php
ビット数ではなく、下限上限を直接指定できる[gmp_random()](http://php.net/manual/ja/function.gmp-random.php)。
引数はGMPですが、StringでもOKです。
PHP5.6以降のGMP追加機能で一番使える機能だと思います。

## gmp_random_bits()

http://php.net/manual/ja/function.gmp-random-bits.php
上限が2の$bits乗-1のgmp_random()。
gmp_random_bits(10)としたら2の10乗-1 = 1023までのランダム値を返します。
ちょっと何のために存在するのかよくわかりません。

```php
	var_dump(gmp_random_range('10000000000000000000', '99999999999999999999')); // ex:GMP(40445182984757184229)
	var_dump(gmp_random_bits(64)); // ex:GMP(13060287029377748532)
```

# PHP5.6.1

## gmp_export() / gmp_import()

http://php.net/manual/ja/function.gmp-import.php
http://php.net/manual/ja/function.gmp-export.php
GMPオブジェクトをバイナリ文字列として入出力します。

```php
	var_dump($a = gmp_random_range('10000000000000000000', '99999999999999999999')); // ex:GMP(69327770192105159292)
	var_dump($b = gmp_export($a)); // String(バイナリ文字列)
	var_dump($c = gmp_import($b)); // ex:GMP(69327770192105159292)
```

PHPならserialize()やそもそもStringでもいいし、他言語に渡すときとかに使うんですかね？
使い道がよくわかりません。

# 結論

新機能を目的としてバージョンアップするのは意味がなさそうです。
もっともセキュリティバグを含めたたくさんの修正が入っているので、バージョンアップ自体は行った方がよいでしょう。
"+"を使わないプログラミング

今日からプログラムに"+"を使えなくなるそうです。
このニュースを受けて、対策を考えました。

[Google、「+」の商標権を取得、数学界に衝撃](http://butchiy.tumblr.com/post/115198448132/google)

> 検索最大手のGoogle社が、「Google+」を商標を出願していたことが明らかになった。 それに伴い、2015年8月1日以降に流通する商品、出版物等に「+」を使う際、1文字あたり6.7ドルの使用料を支払う義務が生じる。

(中略)

>  「+」演算子を用いたプログラムも該当するため、 数学、工学の分野への影響が懸念される。

※ このニュースはエイプリルフールネタです。

## 加算
### 問題となるプログラム:

```js
function plus(x, y) {
  return x + y;
}

ans = plus(5, 3);
console.log(ans); // => 8
```

### 代替1

```js
function plus(x, y) {
  return x - -y;
}
```

__ひとこと解説__: マイナスはスペースで区切れば連続で使用できます（演算子の"-"と符号の"-"）。

### 代替2
```js
function plus(x, y) {
  return -(-x - y);
}
```

__ひとこと解説__: -(-x - y) = (+x) + (+y)

### 代替3
```js
function plus(x, y) {
  for(i=[]; i.length < x; i.push(1)){}
  for(j=[]; j.length < y; j.push(1)){}
  tmp = i.concat(j);
  return tmp.length;
}
```

__ひとこと解説__: 配列ゴリ押しです。自然数限定です。


### 代替4
```js
function plus(x, y) {
  return x-~y-1;
}
```

ひとこと解説: ビット毎論理否定で一旦負にします（~y = - 1 - y になる）。32ビット整数限定です。

## インクリメント
### 問題となるプログラム:

```js
function incr(x) {
  x++;
  return x;
}

var x, ans;
x = 5;
ans = incr(x);
console.log(ans); // => 6
```

### 代替1

```js
function incr(x) {
  x = -x;
  x--;
  x = -x;
  return x;
}
```

__ひとこと解説__: マイナスにしてからデクリメント演算子を使い、また戻します。

### 代替2

```js
function incr(n) {
  var tmp = [];
  while(tmp.length <= n) {
    tmp.push(1);
  }
  return tmp.length;
}
```

__ひとこと解説__: 空の配列から始めると、配列要素の数がn+1になります。（自然数限定）


## 文字列連結
### 問題となるプログラム:

```js
function strPlus() {
  return str1 + str2;
}

var str1, str2, ans;
str1 = 'Thanks, ';
str2 = 'world!';
ans = strPlus(str1, str2);
console.log(ans); // => "Thanks, world!"
```

### 代替1

```js
function strPlus(str1, str2) {
  return str1.concat(str2);
}
```

__ひとこと解説__: concatメソッドでつなげます。

### 代替2

```
function strPlus(str1, str2) {
  return [str1, str2].join('');
}
```

__ひとこと解説__: 空文字を間に挟んで（つまり何も挟まず）配列を連結します。ちょっと遅いです。


## 正規表現
### 問題となるプログラム:

```js
var re = /ab+c/;
console.log(re.test('ac')); // => false
console.log(re.test('abc')); // => true
```

### 代替1

```js
var re = /abb*c/;
console.log(re.test('ac')); // => false
console.log(re.test('abc')); // => true
```

__ひとこと解説__: 0回以上の繰り返しにもう1回、としてやります。

### 代替2

```js
var plusChar = decodeURIComponent('%2B');
var re = new RegExp('ab'.concat(plusChar).concat('c'));
console.log(re.test('ac')); // => false
console.log(re.test('abc')); // => true
```

__ひとこと解説__: URIエンコードを使って"+"という文字を直接書くのを回避しています。


### 代替3

```js
var plusChar = String.fromCharCode(43);
var re = new RegExp('ab'.concat(plusChar).concat('c'));
console.log(re.test('ac')); // => false
console.log(re.test('abc')); // => true
```

__ひとこと解説__: 文字コードを使って"+"という文字を直接書くのを回避しています。
Sphinx でドキュメントを作成して GitHub Pages で公開するまで

Python 製ドキュメンテーションツールの Sphinx を使ってドキュメントを作成し、GitHub Pagesに公開するまでの手続きです。
なお、[Sphinx-Users.jpによる手順](http://sphinx-users.jp/cookbook/hosting/index.html#github-pages)も公開されていますので、そちらを参照してもよいでしょう。

Mac OS X 上の pyenv 環境で実施しましたが、多くの手順は環境によらないでしょう。

## 事前準備

GitHub 上でドキュメント用のリポジトリを作成しておきます。
以降ではこのリポジトリを仮に `bob/foo-doc` として扱います。

## Sphinx Install

[チュートリアル](http://docs.sphinx-users.jp/tutorial.html)に従って、Sphinx のインストールから実施していきます。

```bash
% pip install Sphinx
```

## 雛形の生成

```bash
% sphinx-quickstart
```

いくつか(というかかなりの数の)オプションを訊かれます。
最低限、autodoc 拡張については "YES" と答えればいいようです。
また、ドキュメントのソースコードとビルド生成物のディレクトリを分けたかったので、_"Separate source and build directories (y/n) [n]?"_ という問いに対しても "YES" としました。

完了すると次のようなディレクトリ構造が生成されます。

```
% tree .
.
├── Makefile
├── build
├── make.bat
└── source
    ├── _static
    ├── _templates
    ├── conf.py
    └── index.rst
```

後で `build/html/` 以下を GitHub Pages で公開するために、予め .gitignore に設定しておきましょう。

```bash
% echo 'build/html/' >> .gitignore
```

ソースコードは適当なタイミングで GitHub に push しておくといいです。
`master` ブランチのままでも、`source` というブランチ名にしてもいいでしょう。

## build 実行

Makefile を見るといくつかのタスクが登録されていることがわかります。
ここではスタンドアローンのHTMLドキュメントを生成します。

```bash
% make html
```

build/html/ 以下に HTML 群が生成されます。

```bash
% tree build/
build/
├── doctrees
│   ├── environment.pickle
│   └── index.doctree
└── html
    ├── _sources
    │   └── index.txt
    ├── _static
    │   ├── ajax-loader.gif
    │   :
    │   ├── jquery.js
    │   :
    │   └── websupport.js
    ├── genindex.html
    ├── index.html
    ├── objects.inv
    ├── search.html
    └── searchindex.js
```

ローカルPC上で見るならこれだけでもいいのですが、今回は `build/html/` 以下を GitHub Pages で公開します。
`build/html/` 以下で `git init` し、リポジトリの gh-pages ブランチに push しましょう。

```bash
% cd build/html/
% git init
% git checkout -b gh-pages
% git commit -a -m "first commit"
% git remote add origin git@github.com:bob/foo-doc.git
% git push -u origin gh-pages
```

この結果、http://bob.github.io/foo-doc/ で HTML ドキュメントが閲覧可能になります。
ただし、このままでは GitHub Pages で使われている [Jekyll](http://jekyllrb.com/docs/github-pages/) の仕様で _static/ 配下の画像やCSSが読み込まれません。
この動作を抑制するため、`.nojekyll` というファイルを配置しておきましょう。

```bash
% touch .nojekyll
% git commit -a -m "Add .nojekyll"
% git push origin gh-pages
```

以上、Sphinx でドキュメントを作成して、GitHub Pages で公開するまでの流れでした。

## 参考

- [Sphinx-Users.jp — Python製ドキュメンテーションビルダー、Sphinxの日本ユーザ会](http://sphinx-users.jp/)
- [github のプロジェクトにSphinxドキュメントを良さげな感じにおきたい 其の一 - Study08.net 対シンバシ殲滅用人型機動兵器](http://tell-k.hatenablog.com/entry/2012/01/18/224126)
cocos2dx lua 雑メモ2



global変数を作りたいとき
config.luaに追加したくないときとか


```lua:src/app/models/Enemy.lua

local Enemy = class("Enemy")

function Enemy:ctor(params)
	self.name_ = params.name
	self.attack_ = params.attack
end

return Enemy
```

```lua:src/app/GlobalConfig.lua

local Enemy = import(".models.Enemy")

cc.exports.GlobalConfig = {
	enemylist = {
		Enemy:create({name = "a1", attack = 10}),
		Enemy:create({name = "a1", attack = 10}),
	},
}

```
けつカンマできるのが楽でいい!!


```lua:src/main.lua

cc.FileUtils:getInstance():setPopupNotify(false)
cc.FileUtils:getInstance():addSearchPath("src/")
cc.FileUtils:getInstance():addSearchPath("res/")

require "config"
require "cocos.init"
require "app.GlobalConfig"

local function main()
    require("app.MyApp"):create():run()
end

local status, msg = xpcall(main, __G__TRACKBACK__)
if not status then
    print(msg)
end
```

src/app/MyApp.luaにrequreしたほうがいいのかも


```lua:src/app/views/MainScene.lua

local scheduler = cc.Director:getInstance():getScheduler()

local MainScene = class("MainScene", cc.load("mvc").ViewBase)

MainScene.RESOURCE_FILENAME = "MainScene.csb"


function MainScene:onCreate()

	scheduler:scheduleScriptFunc(function(dt)
		GlobalConfig.enemylist[math.random(#GlobalConfig.enemylist)]
	end, 1.0, false)

end


return MainScene

```

とかつかえる

luaでsingletonとかだと

```lua:src/app/models/User.lua

local User = class("User")

User.LEVEL = "USER_LEVEL"
User.NAME = "USER_NAME"

local instance = nil

function User:ctor()
	self.level_ = cc.UserDefault:getInstance:getStringForKey(User.LEVEL, "1")
	self.name_ = cc.UserDefault:getInstance:getStringForKey(User.NAME, "dummy")
end


function User.getInstance()
	if not instance then
		instance = User:create()
	end

	return instance
end


function User:getLevel()
	return self.level_
end

function User:getName()
	return self.name_
end

return User

```

User.getInstance():getName()
UserDefaultとかで用意されているのと違って:ではなく.になる
この定義もいいのかわるいのか

endをよく忘れてsyntacs errorになってどこの行か表示されなくてつらい
コードチェックをしてくれるものが欲しくなってくる
PHPでメールを送る - SendGrid編


SendGrid https://sendgrid.kke.co.jp/

PHPサンプル http://github.com/sendgridjp/sendgridjp-php-example.git

## 環境構築

1. Sendgridアカウントの作成
2. `composer require sendgrid/sendgrid`でライブラリをインストール

## メール送信

````
$sg = new \SendGrid($username,$password,[
    "turn_off_ssl_verification" => true
]);

$mail = new \SendGrid\Email();
$mail->setTos([$to])
    ->setFrom("noreply@sample.com")
    ->setFromName("hogehoge")
    ->setSubject("メールタイトル")
    ->setText("hogehoge")
    ->setHtml("<strong>hogehoge</strong>")
    ->addCategory("テスト送信メール")
    ->addHeader("X-Sent-Using","SendGrid-API");
$sg->send($mail);
````

これだけで送信できる。認証はアカウントログイン情報をそのままコードに突っ込む形。
一応envファイルとか使ってバージョン管理に入れないよう推奨している。

## 所感

ざっくり使ってみた感想。

- メールの送信は非常に簡単にできる。
- gmailで受信を確認してみたが、そんなに違和感はなかった。
- Emailの本文中にlinkが含まれている場合,sendgridサーバ経由のリンクに自動的に差し替えられる。
  (そこそこな有料プランに変更することで、自分のリンクのままを保てるが…)
- 送信メールにカテゴリとかを付与して、後でトラッキングできるのはかなり便利そう。
S3上の特定ディレクトリ以下のファイルパスを取得する


S3にアップされているファイルのうち、特定ディレクトリ以下のファイルパスを[AWS SDK for Ruby](https://github.com/aws/aws-sdk-ruby)で取得するにはこう書けばOK。
SDKのVersionによって書き方がかなり違うので注意が必要。

```rb:Ver.1
require 'aws-sdk'

s3 = AWS::S3.new(
  :access_key_id => 'YOUR AWS ACCESS KEY',
  :secret_access_key => 'YOUR AWS SECRET',
)

bucket = s3.buckets['bucket-name']

# images以下のファイルに限定
bucket.objects.with_prefix('images/').each do |obj|
  puts "#{obj.key} => #{obj.etag}"
end
```

```rb:Ver.2
require 'aws-sdk'

s3 = Aws::S3::Resource.new(
  :region => 'YOUR REGION',
  :access_key_id => 'YOUR AWS ACCESS KEY',
  :secret_access_key => 'YOUR AWS SECRET',
)

bucket = s3.bucket('bucket-name')

# images以下のファイルに限定
bucket.objects(prefix: 'images/').each do |obj|
  puts "#{obj.key} => #{obj.etag}"
end
```

実行してみたらVer.2の方が断然早かったので、バージョンに指定がないようであればVer.2を使ったほうがいいのかも。
TrimEnablerを有効にしたままPRAMクリアしてしまった時の復旧方法備忘録

# 1. リカバリーモードで起動する
起動時に「**command + r**」を押しながら電源を入れる。

# 2. ターミナルを起動する
「**ユーティリティ**」メニューにある「**ターミナル**」を起動する。

#3. 起動モードの確認
下記コマンドで起動モードを確認します。

```shell-session
$ nvram boot-args
```
コマンドを実行した結果、

```shell-session
kext-dev-mode=1
```
と表示されたら「**4. 復旧に必要な空ファイルを作成する**」へ行く。

```shell-session
error getting variable
```
と表示されたら以下を実行する。

```shell-session
$ nvram boot-args=kext-dev-mode=1
```
コマンド実行後に再度リカバリモードで再起動する。

# 4. 復旧に必要な空ファイルを作成する

「**/Volumes/システムドライブ名/System/Library**」の下に「**Extensions**」という名前の空ファイルを作成する。

例）

```shell-session
$ cd /Volumes/Macintosh\ HD
$ touch System/Library/Extensions
```
# 5. KEXTCACHEを生成する
最後に以下のコマンドを実行して5分〜10分待つ。

```shell-session
$ kextcache -prelinked-kernel System/Library/Caches/com.apple.kext.caches/Startup/kernelcache -K System/Library/Kernels/kernel System/Library/Extensions
```
PHPで画像変換ができるImagemagicをインストールする

# PHPで画像変換ができるImagemagicをインストールする

最初、Windows8+xamppでインストールを試みましたが上手くいかなかったので、Linuxに変更してインストールしてみました。

## yumコマンドでImageMagick本体をインストールする

> yum -y install ImageMagick
> yum -y install ImageMagick-devel

## pear/peclインストール　[参考](https://pear.php.net/manual/ja/installation.getting.php)

> wget http://pear.php.net/go-pear.phar
> php go-pear.phar

## PHPからImageMagickをコールするimagickをインストールする

> pecl install imagick

## php.iniへ追記

> extension=imagick.so

## Apache再起動

> /etc/init.d/httpd restart

## phpinfo()でimagickがあることを確認してインストール終了です。

## 実際に使用する方法
[利用できる関数一覧](http://php.net/manual/ja/book.imagick.php)

他にも、[こちらのサイト様](http://memo.ark-under.net/memo/1017)の解説がわかりやすかったです。
Rails で YamlDb を使って MySQL から PostgreSQL へデータを移行する

## 目的

Rails のプロジェクト内で MySQL から PostgreSQL へのデータ移行を行う

## 前提条件

- 移行元・移行先のデータベースともに手元から接続するための設定は済ませておく
- MySQL 用の gem をインストールするのに必要なライブラリはインストールしておく

## 移行手順

移行に必要な gem を Gemfile に追加:

    # Gemfile
    gem 'yaml_db'
    gem 'mysql2'

移行元データベースの定義を追加する:

    # config/database.yml
    legacy:
      adapter: mysql2
      encoding: utf8
      database: legacy_production
      username: <%= ENV['LEGACY_DATABASE_USERNAME'] %>
      password: <%= ENV['LEGACY_DATABASE_PASSWORD'] %>
      host: <%= ENV['LEGACY_DATABASE_HOST'] %>

bundle する:

    $ bundle

移行元データベースからデータをエクスポートする:

    $ bin/rake db:data:dump_dir RAILS_ENV=legacy

移行先データベースへインポートする:

    $ bin/rake db:data:load_dir


## 参考

- [yamldb/yaml_db](https://github.com/yamldb/yaml_db)
- [yaml_dbでMySQLからPostgreSQLに移行した - @znz blog](http://blog.n-z.jp/blog/2014-01-28-yaml-db.html)
/usr/bin/docker: relocation error: /usr/bin/docker: symbol dm_task_get_info_with_deferred_remove, version Base not defined 

http://qiita.com/DQNEO/items/e9ef350a274817390445
こちらの方法でCentOS7にDocker1.5をインストールした後、Dockerデーモンが起動しないという現象に遭遇しました。

```
 4月 01 18:44:20 xx.xxx.jp docker[14546]: /usr/bin/docker: relocation error: /usr/bin/docker: symbol dm_task_get_info_with_deferred_remove, version Base not defined inie
 4月 01 18:44:20 xx.xxx.jp systemd[1]: docker.service: main process exited, code=exited, status=127/n/a
 4月 01 18:44:20 xx.xxx.jp systemd[1]: Failed to start Docker Application Container Engine.
-- Subject: Unit docker.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.service has failed.
--
-- The result is failed.
```

## 原因と対策
device-mapperのバージョンが古いために、Dockerが`dm_task_get_info_with_deferred_remove`というシンボルを見つけられないのが原因のようです。

```
sudo yum update device-mapper
```

でdevice-mapperをバージョンアップしたら直りました

## Thanks

http://stackoverflow.com/questions/27216473/docker-1-3-fails-to-start-on-rhel6-5
RSS2.0の最新情報を取得

RSSの最新だけを取得する方法。
とりあえず2.0の奴だけうまくいったのでメモ。
[修正＆加筆したものはコチラ](http://qiita.com/ao_love/items/98b9df05893a93f668e9)

```php

$RSS = simplexml_load_file($url);

foreach($RSS->channel AS $XML){

    $title = $XML->item[0]->title;
    $link  = $XML->item[0]->link;
    $date  = $XML->item[0]->pubDate;

}
```

何故か

```php
foreach($RSS->channel->item[0] AS $XML)
```

ってしたら取得できませんでした。

※追記※
この方法だと色々と問題があるらしいので、正しい方法はコメント欄にて。
ちなみに各所で`foreach`で回しているのは`$RSS->channel->item`の場合。
この場合`[item]`は複数あるので`foreach`する必要がある。