OmniAICreator/Qiita-1.07M huggingface dataset:
[TensorFlowで株価予想] 1 - 終値が始値よりも高くなるかで判定してみる

# TensorFlowで株価予想シリーズ

+ [0 - Google のサンプルコードを動かしてみる](http://qiita.com/akiraak/items/b27a5616a94cd64a8653)
+ [1 - 終値が始値よりも高くなるかで判定してみる](http://qiita.com/akiraak/items/52aebc558ee312dba2b5)
+ [2 - 日経平均225銘柄の株価予想正解率ランキング〜](http://qiita.com/akiraak/items/706f74eeba95ec32cf16)
+ [3 - 日本3506銘柄の株価予想ランキング](http://qiita.com/akiraak/items/3e1ecbb9acfd872b944a)
+ [4 - 実際に売買したら儲かるのかシミュレーションしてみる](http://qiita.com/akiraak/items/27d8e91982d3322873c3)
+ [5 - 大きく上がると予想されたときだけ買ってみるシミュレーション](http://qiita.com/akiraak/items/fe45001ad011178fae5e)
+ [6 - 学習データの項目を増やす！隠れ層のサイズも増やす！](http://qiita.com/akiraak/items/61def86cc8070d0fa4b2)
+ [7 - 株価が何%上昇すると予測したら買えばいいのか？](http://qiita.com/akiraak/items/5d08587ac460c253492d)
+ [8 - どの銘柄を買うか](http://qiita.com/akiraak/items/5e8a8c761f098a4a68fb)
+ [9 - 年利6.79%](http://qiita.com/akiraak/items/8eec7ed4ec0b383f6592)

# 前置き

前回はGoogleのコードをそのまま動かして、株価予想ができるのかどうか見てみました。結果 73% で前日終値よりも高くなるかの判定ができました。でも前日終値からの判定だといつ買えばよいのか分かりにくいんだよねぇー。って事で今回は当日の終値が当日の始値よりも高くなるかで判定してみます。

# コード

[github](https://github.com/akiraak/tensorflow-stock-index/tree/1.1) にどーんと置いてあるよ

# 解説

コードにコメント書いたから見てね。前回と違うところは答を「終値-始値」で出しているところだけで、学習方法とかは何も変えてないっす。

前回同様にデータ操作に Pandas を使っているからこことか参考になるよ。「[Python Pandasでのデータ操作の初歩まとめ − 前半：データ作成＆操作編](http://qiita.com/hik0107/items/d991cc44c2d1778bb82e)」

# 実行

環境構築とかは[前回の記事](http://qiita.com/drafts/b27a5616a94cd64a8653)を見てねん。
これで実行

```
$ python goognet.py SP500
...
1000 0.532328
2000 0.543299
3000 0.642241
4000 0.654976
5000 0.655956
6000 0.65576
7000 0.656152
8000 0.656152
9000 0.656152
10000 0.656152
Precision =  0.730696798493
Recall =  0.657627118644
F1 Score =  0.692239072257
Accuracy =  0.729835552075
```

ふむふむ 72% ですか。前回より 1% 落ちた。

# いつ何を買えばいいのか？

SP500の予想をしてるけど、予想に使ってる指標の中でFTSE（ロンドン証券取引所の株価指数）が日本時間午前1:30と一番最後に閉まります。そして、SP500は夏なら日本時間午前6:00、夏以外は午前5:00に閉まります。午前1:30過ぎに学習器を回して、SP500が閉まる午前5:00までの間に何かを買うことになるかな。そして買う金額は当日の始値以下。前回は前日の終値で判定したので、それを使えば前日の終値以下で買うというのも合わせられる（売る場合はその逆）。前回の記事を書いたら暴落を予測できないと危ないという声があったので、暴落予想の学習器も合わせて作ったほうがよいのかもね。

ところで何を買うんだろう？SP500のオプション？GMOのオプション手数料をみたら取引額の何%かを手数料に支払うみたいなんで（[0.15%って書いてある](https://www.click-sec.com/corp/guide/fuop/rule/rule_op.html)）株価の変動率が手数料よりも大きくないと負けちゃうね。

# 次はなにしようか

為替情報とか原油価格とかを学習データに入れたいよね。あとは指標じゃなくて普通に企業名柄で遊んでみたい。
ViewHolderパターンを使っている場合、getView()の実装を一行にできるという話


最初におことわりですが、実用的な話ではないです。

### AdapterのgetView()

Javaで書く場合は、だいたいこんな風になると思います。

```java
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            View view = convertView;

            if (view == null) {
                view = getLayoutInflater().inflate(R.layout.hoge, parent, false);
                view.setTag(new ViewHolder(view));
            }
            ViewHolder holder = (ViewHolder) view.getTag();
            holder.update((Hoge) getItem(position));

            return view;
        }
```

これを、素直にKotlinにすると

```Kotlin
        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
            var view = convertView
            
            if (view == null) {
                view = getLayoutInflater().inflate(R.layout.hoge, parent, false)
                view!!.tag = ViewHolder(view)
            }
            val holder = view.tag as ViewHolder
            holder.update(getItem(position) as Hoge)

            return view
        }
```

となります。

### Nullableなvarはイヤん

このなかの、viewという変数は、varなView?型の変数です。
Kotlinの哲学は、valであるべき、NonNullであるべきというところにあると思うので、これをやっつけます。

```Kotlin
        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
            val view = convertView ?: getLayoutInflater().inflate(R.layout.hoge, parent, false).apply { tag = ViewHolder(this) }

            val holder = view.tag as ViewHolder
            holder.update(getItem(position) as Hoge)

            return view
        }
```

いい感じです。
エルビス演算子とか、applyメソッドとかは便利です。
*厳密に言えば、inflate()の返値がnullでないということは言語的に保証されているわけではないのですが、実用上、差し支えないでしょう。*

実用的なのはこのあたりまでで、ここから先は、やればできるよという領域になります。
*実際、自分で使っているのはこの形です。*

### asは()でくくりやすい

Javaのキャストと異なり、Kotlinのasを使ったキャストは、カッコでくくっても可読性が悪くならないので、やってみます。

```Kotlin
        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
            val view = convertView ?: getLayoutInflater().inflate(R.layout.hoge, parent, false).apply { tag = ViewHolder(this) }
            
            (view.tag as ViewHolder).update(getItem(position) as Hoge)

            return view
        }
```

これがJavaだと、

```java
            ((ViewHolder) view.getTag()).update((Hoge) getItem(position));
```

カッコが多くなりすぎて使う気になれません。

### 仕上げのapply

ここまで来れば、一行でまとめたくなるのもやむなしです。（ *なくない* ）

```Kotlin
        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View = (convertView ?: getLayoutInflater().inflate(R.layout.hoge, parent, false).apply { tag = ViewHolder(this) }).apply { (tag as ViewHolder).update(getItem(position) as Hoge) }
```

どやぁ！


*やり過ぎですね。*

### まとめ

* ?: は気が利くやつ
* apply{} は便利
* as はビューリホー

みんなもKotlinに乗り換えよう！
サロゲートペア文字からsubStringの取得

#問題の由来
Java言語は、内部の文字コードに16ビット固定長のUnicodeを採用していたが、将来収録予定の文字に対して、16ビット固定長で表現できる 65536個の領域では不足してしまいました。その問題を解決するために、サロゲートペア(Surrogate Pair)が導入されました。サロゲートペアとは、16ビット表現できる領域に、ハイサロゲート(High Surrogate)を1024個、ローサロゲート(Low Surrogate)を1024個定義し、両者を組み合わせることで、約100万個(=1024x1024個)のコードポイントを表現する方式です。それ以外の領域には変更はなく、従来通り 16ビットで表現されるので、1個のコードポイントを表現するために、16ビットと 32ビットの表現形式が混在することになってしまいました。

`String#length()`、`String#subString()`で文字を操作する際に、サロゲートペアの１文字に対して１つのchar値が対応するわけではなく、2つのchar値が対応する形になっているため、正しい文字数やsubStringを取得できなくなります。
例：

```java
// 検証対象文字：「𪛉𠀑𠀃」がサロゲートペア文字
String target = "𪛉𠀑𠀃の文字";

// 文字数取得
int len = target.length();     // 結果：9文字
// 最初から４文字の取得
String subTarget = target.substring(0, 4)     // 結果：𪛉𠀑
```

#解決方法１
`java.text.BreakIterator`クラスを利用します。BreakIterator クラスは、人が認識するテキスト内の境界位置を見つけるメソッドを実装しています。
下記は、BreakIteratorを利用する場合にsubStringの取得例です。

```java
/**
 * サロゲートペアのsubString文字の取得
 * 
 * @param target 対象文字列
 * @param startIndex 開始位置（0から）
 * @param endIndex 終了位置
 * @return
 */
public String subString(String target, int startIndex, int endIndex) {

	// 入力値の妥当性チェック省略
	
	BreakIterator bi = BreakIterator.getCharacterInstance();
	bi.setText(target);
	
	StringBuffer sb = new StringBuffer(); 
	
	// 繰り返し用開始位置
	int start = bi.first();
	// 繰り返し用終了位置
	int end = 0;
	// 文字数
	int count = 0;
	
	// 文字の最後まで繰り返し
	while (bi.next() != BreakIterator.DONE) {
		
		end = bi.current();
		
		// 文字数カウントアップ
		count++;
		
		// 引数の開始位置と終了位置の間に文字を取得する
		if (count >= (startIndex + 1) && count<= endIndex) {
			
			sb.append(target.substring(start, end));
		}
		
		start = end;
		
	}
	
	return sb.toString();
}
```

#解決方法２
コードポイントを利用する方法です。コードポイントとは、Unicodeで1文字分のコード（int型）を示しています。
例：サロゲート文字「𪛉」のコードポイントは173769
　非サロゲート文字「の」のコードポイントは12398
コードポイントにを表現するには必要なchar値の数をわかれば、正しい文字数やsubStringを取得できます。

以下のAPIを利用し、subStringを取得します。
・`Character#codePointAt(char[] a, int index)`：char 配列の指定されたインデックスにあるコードポイントを返します。
・`Character#charCount(int codePoint)`：コードポイントを表すのに必要な char 値の数を判定します。サロゲートペアの場合は、2 を返し、そうでない場合は、1 を返します。 
・`Character#toChars(int codePoint)`：コードポイントを UTF-16 表現に変換します。

下記は、コードポイントを利用する場合にsubStringの取得例です。


```java
/**
 * サロゲートペアのsubString文字の取得
 * 
 * @param target 対象文字列
 * @param startIndex 開始位置（0から）
 * @param endIndex 終了位置
 * @return
 */
public String subString(String target, int startIndex, int endIndex) {

	// 入力値の妥当性チェック省略

	// char配列の取得
	char[] charArray = target.toCharArray();
	
	// コードポイント分だけの開始位置インデックスの取得（繰り返し用）
	int offsetStart = target.offsetByCodePoints(0, startIndex);
	// コードポイント分だけの終了位置インデックスの取得（繰り返し用）
	int offsetEnd = target.offsetByCodePoints(0, endIndex);
	// コードポイント初期値
	int codePoint = 0;
	
	StringBuffer sb = new StringBuffer(); 
	
	for (int i = offsetStart; i < offsetEnd; i += Character.charCount(codePoint)) {
	
		// カレント文字のコードポイントの取得
		codePoint = Character.codePointAt(charArray, i);
		sb.append(String.valueOf(Character.toChars(codePoint)));
	}
	
	return sb.toString();
}
```
Petalinux > メモリサイズを512MBに変更 > system-conf.dtsiを編集

```txt:動作確認
CentOS 6.5
PetaLinux v2014.4
```

関連 http://qiita.com/7of9/items/ffcf537a8d5cfbf31b40

## BSP (Board Support Package)

PetaLinux v2014.4のMicrozed用BSPは以下から入手 (会員登録が必要)
http://microzed.org/reference-designs-categories/petalinux-board-support-packages

作業するフォルダに移動して、解凍したmz_7z010.bspファイルを置く。
以下のコマンドでプロジェクトフォルダを作成

```
$ petalinux-create -t project -s mz_7z010.bsp
$ ls
$ mz-7z010 mz_7z010.bsp
```

## メモリ設定変更

色々見た情報を試しても、起動時のメモリサイズ変更は成功しなかった。

ふと見つけたのが system-conf.dtsi というファイル。これはsystem-top.dtsファイルからincludeされている (`/include/ "system-conf.dtsi"`)。

`system-top.dtsi`ファイルには以下の記載が見つかった。以下の0x40000000を0x20000000にしてみた。

```
    memory {
        device_type = "memory";
        reg = <0x0 0x40000000>;
    };
```

## ビルド、QEMU実行

### ビルド

```
$ petalinux-build
```

### QEMU実行

```
$ petalinux-boot --qemu --kernel
```

メモリサイズ確認

```
$ cat /proc/meminfo

MemTotal:         512664 kB
MemFree:          495512 kB
MemAvailable:     492268 kB
Buffers:               0 kB
Cached:             9240 kB
SwapCached:            0 kB
Active:             4020 kB
Inactive:           5580 kB
Active(anon):       4020 kB
Inactive(anon):     5580 kB
Active(file):          0 kB
Inactive(file):        0 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:             0 kB
HighFree:              0 kB
LowTotal:         512664 kB
LowFree:          495512 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:           348 kB
Mapped:             2408 kB
Shmem:              9240 kB
Slab:               4240 kB
SReclaimable:       1152 kB
SUnreclaim:         3088 kB
KernelStack:         312 kB
PageTables:           80 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      256332 kB
Committed_AS:      11212 kB
VmallocTotal:    2596864 kB
VmallocUsed:        2464 kB
VmallocChunk:    2496568 kB
```

とりあえず512MBにすることはできた。

system-conf.dtsiは「DO NOT modify this file」という記載があるので、正しいやり方ではないかもしれない。

実機でも動作確認できた。
Linuxでpythonからdmesg(/dev/kmsg)の更新監視

`dmesg` で確認できるログを `tail -F` のように末尾更新の監視をするサンプル実装。
`dmesg` で出力されるリングバッファは `/dev/kmsg` または `/proc/kmsg` でファイルとしてオープンできる。
最終行の `read` でブロックしてしまうため、読み飛ばしの処理の時のみ `O_NONBLOCK` を指定している。

# 実装

```py:dmesg(/dev/kmsg)の更新監視
#!/usr/bin/env python2
# cofing: UTF-8

import os
import fcntl
import time

def readLines(path):
    with open(path, "r") as fp:
        stat = os.stat(path)
        fp.seek(stat[6])

        where = None

        # =================
        # seek to last line
        # =================
        fd   = fp.fileno()
        flag = fcntl.fcntl(fd, fcntl.F_GETFL)
        fcntl.fcntl(fd, fcntl.F_SETFL, flag | os.O_NONBLOCK)

        try:
            # FIXME
            for last in fp:
                pass
        except IOError as e:
            if e.errno != 11:
                raise

        fcntl.fcntl(fd, fcntl.F_SETFL, flag)

        # =================
        # tailf impl
        # =================
        try:
            while True:
                where = fp.tell()
                line  = fp.readline()
                yield line
        except KeyboardInterrupt:
            pass

if __name__ == "__main__":
    import sys
    for line in readLines("/dev/kmsg"):
        if str(line).find("stop tailf") >= 0:
            print "### stop watch tailf ###"
            break
        else:
            print line,
```

※通常のファイルの更新監視の場合は、最終行到達時に `fp.readline()` で止まらないため修正が必要

実行とその結果は以下のようになる。

```shell-session:実行結果と終了(監視側)
$ ./tailf.py
12,642,9584294872,-;aaa
12,643,9588998703,-;bbb
12,644,9593362017,-;ccc
### stop watch tailf ###
```

`/dev/kmsg` にリダイレクトすることで、擬似的にドライバのログの出力を確認している

```shell-session:実行結果と終了(更新側サンプル)
$ sudo sh -c "echo aaa > /dev/kmsg"
$ sudo sh -c "echo bbb > /dev/kmsg"
$ sudo sh -c "echo ccc > /dev/kmsg"
$ sudo sh -c "echo stop tailf > /dev/kmsg"
```

# TODO

pythonでファイルの最終行にseekする良い方法がいまいち分からなかったため、最終行まですべて読みだす方法で実装してしまっている。
巨大なファイルの場合、読み飛ばしだけで地味に時間がかかる可能性がある。(リングバッファのサイズを変更している場合等)

```python
# FIXME
for last in fp:
    pass
```

# 参考
[Emerge Technology: Pythonでtailもどき](http://blog.liris.org/2010/01/pythontail.html)
[テキストファイルから指定した文字列を含む行を出力する - Qiita](http://qiita.com/qt-luigi/items/76f7955d68418f967efb)
[python - What is the most efficient way to get first and last line of a text file? - Stack Overflow](http://stackoverflow.com/questions/3346430/what-is-the-most-efficient-way-to-get-first-and-last-line-of-a-text-file)
[Get last n lines of a file with Python, similar to tail - Stack Overflow](http://stackoverflow.com/questions/136168/get-last-n-lines-of-a-file-with-python-similar-to-tail)
[python Non-block read file - Stack Overflow](http://stackoverflow.com/questions/30172428/python-non-block-read-file)
findで見つかったファイルをリネームして同じディレクトリにコピーする

ファイル名の一部を置換しつつ、同一ディレクトリ内にコピーする方法。

```bash
$ ls -al
total 0
drwxr-xr-x   5 goto  staff  170  6  3 13:07 .
drwxr-xr-x  18 goto  staff  612  6  3 13:06 ..
-rw-r--r--   1 goto  staff    0  6  3 13:07 foo_1.txt
-rw-r--r--   1 goto  staff    0  6  3 13:07 foo_2.txt
-rw-r--r--   1 goto  staff    0  6  3 13:07 foo_3.txt

$ find . -name "foo*" -exec bash -c 'cp $0 ${0/foo/bar}' {} \;

$ ls -al
total 0
drwxr-xr-x   8 goto  staff  272  6  3 13:08 .
drwxr-xr-x  18 goto  staff  612  6  3 13:06 ..
-rw-r--r--   1 goto  staff    0  6  3 13:08 bar_1.txt
-rw-r--r--   1 goto  staff    0  6  3 13:08 bar_2.txt
-rw-r--r--   1 goto  staff    0  6  3 13:08 bar_3.txt
-rw-r--r--   1 goto  staff    0  6  3 13:07 foo_1.txt
-rw-r--r--   1 goto  staff    0  6  3 13:07 foo_2.txt
-rw-r--r--   1 goto  staff    0  6  3 13:07 foo_3.txt

```
Windows ServerのDNSサービスで連番がついたホストを追加する


#前提
- example.localというゾーンにwww101～110というホストを追加し、IPアドレス：192.168.101.101～110を割り当てる。
- 逆引きゾーンにもレコードを追加する。
- サーバーのアドレスは192.168.101.100である。
- dnsadd.batという名前のバッチファイルを作成し、これを実行し、追加する。

#サンプル
```dnsadd.bat
for /l %%i in (101,1,110) do (
    dnscmd 192.168.101.100 /recordadd example.local www%%i A 192.168.101.%%i
    dnscmd 192.168.101.100 /recordadd 101.168.192.in-addr.arpa %%i PTR www%%i.example.local
)
```

#参考
.bat（バッチファイル）のforコマンド解説。 http://qiita.com/sawa_tsuka/items/67be34bab1fdf3fb87f9
[SQL]ユーザ管理テーブル作成クエリ

MySQLのテーブル作成用クエリ。ユーザ管理テーブル（ログイン機能を想定）

	create table user(
	 user_id int auto_increment primary key
	,activation_id varchar(128) UNIQUE
	,password varchar(256)
	,last_name varchar(100)
	,first_name varchar(100)
	,last_name_kana varchar(100)
	,first_name_kana varchar(100)
	,sex tinyint(1)
	,job_id smallint
	,zip_upper varchar(10)
	,zip_lower varchar(10)
	,pref_id smallint
	,address varchar(256)
	,email varchar(128) UNIQUE
	,phone varchar(20)
	,comment text
	,create_date datetime
	,update_date timestamp
	,user_status smallint
	,delete_flag tinyint(1)
	)
VisualStudio2012でMDIのプロジェクトを作った時

#デフォルトでなんかドキュメント開くよね
意味ないので消したいけどどこから呼ばれてるのかよくわからん

```
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;
```

これが呼び出してるみたいだったのでコメントアウトして解決。

###呼び出し元の特定方法
ドキュメントクラスのコンストラクタにブレークポイント貼って
呼び出し元を辿った。
この方法を思いつくまでに結構時間かかってしまった…はずかしい
canvasでWebフォントを読み込む前にデバイスフォントが表示されてしまう問題


[Web Font Loader](https://github.com/typekit/webfontloader)を使用
この手法だとcanvasとか関係ないけど。

```html
<script src="//ajax.googleapis.com/ajax/libs/webfont/1.6.16/webfont.js"></script>
```

Webフォントが読み込まれるまではbodyを表示しない

```css
@font-face {
    font-family:"MyFont";
    src:url("./fonts/GillSansMTStd-UltraBold.otf") format("opentype");
}
.font-loading{
    opacity: 0;
}
```

以下をindex.jsなどにimport

```javascript:WebFontChecker.js
export default class WebFontChecker {

    constructor () {}

    start(){

        WebFont.load({
            custom: {
                families: [ 'MyFont' ],
                urls: [
                    './fonts/GillSansMTStd-UltraBold.otf'
                ]
            },
            loading: function() {
                // load start
                console.log("web font load start");
            },
            active: function() {
                // ok
                console.log("web font available");
                $('body').removeClass('font-loading'); // body表示
            },
            inactive: function() {
                // not support
                console.log("not suppport");
            },
            fontloading: function(fontFamily, fontDescription) {
                // load start
                console.log("font-family load start");
            },
            fontactive: function(fontFamily, fontDescription) {
                // ok
                console.log("font-family available");
            },
            fontinactive: function(fontFamily, fontDescription) {
                // not support
                console.log("not suppport");
            }
        });
        
    }

}
```


> 参考
[ウェブ・フォントの読み込み](https://hail2u.net/blog/webdesign/loading-web-fonts.html)
[Webフォントがいつ読み込まれたかを判断したい場合は、WebFont Loaderを使おう](http://w3q.jp/t/95)
↓ measureText()を使えばこうなる
[canvas要素にwebフォントを確実に描画する方法](http://defghi1977-onblog.blogspot.jp/2013/02/canvasweb.html)
FreeBSD pkg コマンドチート

# FreeBSD Pkg CheatSheet

pkgngの基本は、[5.4. pkgng によるバイナリ package の管理](https://www.freebsd.org/doc/ja/books/handbook/pkgng-intro.html)から。

よく使うコマンドをまとめた。


## pkg info

インストールされているパッケージから情報を取得する

-r
このパッケージに依存しているパッケージ

```
> pkg info -r node
node-0.10.26:
        npm-1.3.11
```

-d
このパッケージが依存しているパッケージ

```
> pkg info -d tig
tig-2.0.2:
        readline-6.3.3_1
        git-1.9.3
```

-l
ファイル一覧

```
> pkg info -l ja-nkf
ja-nkf-2.1.3,1:
        /usr/local/bin/nkf
        /usr/local/man/ja/man1/nkf.1.gz
        /usr/local/man/man1/nkf.1.gz
        /usr/local/share/licenses/ja-nkf-2.1.3,1/LICENSE
        /usr/local/share/licenses/ja-nkf-2.1.3,1/ZLIB
        /usr/local/share/licenses/ja-nkf-2.1.3,1/catalog.mk
```

-D
pkg-message表示

```
> pkg info -D pam_mkhomedir
pam_mkhomedir-0.2:
You may want to add something like this to your /etc/pam.d/login
or /etc/pam.d/sshd ( when you've configured ssh with PAM )
file to use this module:

session         required       /usr/local/lib/pam_mkhomedir.so
```

-R
全マニフェストをダンプする

## pkg prime-list
pkgコマンドで明示的にインストールされたパッケージの一覧。依存でインストールしたパッケージを含まない


## pkg search

pkgリポジトリから情報を取得する

-d
このパッケージが依存しているパッケージ

```
> pkg search -d curl-7.38
curl-7.38.0_1:
        ca_root_nss-3.17.1
```

-f
すべての情報を表示する


## pkg install

-U
自動アップデートを禁止

-y
対話入力でyesにする

`> pkg install -y postfix`

## pkg upgrade

インストールされているパッケージの更新

`> pkg upgrade`

## pkg lock/unlock

パッケージのバージョンが変化しないようにロック/アンロックする

-l
ロック一覧

```
> pkg lock -l
Currently locked packages:
sqlite3-3.8.6
```

## pkg autoremove

参照されていないパッケージを削除する

## pkg set

autoremove/originの修正

`> pkg set -o lang/ruby18:lang/ruby19`


## 小ネタ

- pkgバイナリは週1回更新なのでportsが更新してからpkgバイナリが出来るまでラグがある。
- -j オプションでjail環境のパッケージが操作出来て便利。
- /usr/local/etc/periodicに便利タスクがある。
railsのapp作成でmysqlを使用する時の導入とハマるところ　rake db:createができるまでの流れ　　　

#アプリの作成

もともと作ってあったアプリをmysqlに変更するにはこちらのページが参考になるかと思います。
http://qiita.com/pchatsu/items/a7f53da2e57ae4aca065


`$ rails new app-name --skip-bundle -d mysql`


#はまるところ1   rake db:create
 `$ bundle exec rake db:create`

このエラーが出る

```
#<Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)>
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost", "database"=>"app_name_development"}, {:charset=>"utf8", :collation=>"utf8_unicode_ci"}
(If you set the charset manually, make sure you have a matching collation)
#<Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)>
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost", "database"=>"app_name_test"}, {:charset=>"utf8", :collation=>"utf8_unicode_ci"}
(If you set the charset manually, make sure you have a matching collation)
```
これはmysqlのサーバーが起動していないから。
結構見落としがちだから気をつける。

```$ mysql.server start```

```
Starting MySQL
. SUCCESS!
```

これでサーバーを立ち上げる。

# はまるところ2  Access denied for user 'root'@'localhost' (using password: NO)


```
Access denied for user 'root'@'localhost' (using password: NO)
Access denied for user 'root'@'localhost' (using password: NO)Please provide the root password for your MySQL installation
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost", "database"=>"app_name_development"}
```


このエラーは知ってれば意外と簡単に直せるんだけど、ググってもなかなかでてこない。
というかググって出て来る記事はわけわからない対処の仕方をしている人が多い気がする・・・。

というかもろ２文目に対処法書いてある。

これは単純にパスワードが設定されていないために起こるエラー。
`config/database.yml`にあるファイルにあるパスワードの欄が空白なので自分で値を入れて設定する。

```database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root      
  password: password　　　　　　　#　← ここの欄が空白なので任意のパスワードを設定する 
  host: localhost
```


これでok!!!!!

```
MacBook-Pro:app_name user_name$ rake db:create
MacBook-Pro:app_name user_name$ rails db

Enter password: 先ほど作成したパスワードの入力

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.9 Homebrew

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+----------------------------+
| Database                   |
+----------------------------+
| 　  　                        |
|　　　データベースがちゃんとつくられている|
| ことを確認する   　 　 　 　　　　　　　　　　　    |
|                            |
|                            |
|                            |
|                            |
|                            |
+----------------------------+
8 rows in set (0.01 sec)

mysql>

```


おしまいです。
ng-clickは複数 置けない

###ng-clickは複数配置すると、一番目に記載したものしか実行されません。

例えば下記コードの場合
```<button ng-click="hoge()" ng-click="piyo()">```
→ $scope.hoge()のみ発火します。


ng-clickの順番を逆にした場合
```<button ng-click="piyo()" ng-click="hoge()">```
→ $scope.piyo()のみ発火します。


ちなみに```<button ng-click="hoge(), piyo()">```みたいに書くと構文エラーで怒られます。


### そういう時は
```
<button ng-click="wrapHogePiyo()">
```
```
$scope.wrapHogePiyo = function() {
  $scope.hoge();
  $scppe.piyo();
}
```
めざせpythonライブラリマスター （９）WebHelpers

#【ライブラリ説明】
　pythonを使ってHTMLを書けます。
　webフレームワークの手助けとなります。

#【プログラム】
```py:WebHelpers.py
# -*- coding: utf-8 -*-

import webhelpers.html.tags as fm
import webhelpers.html.builder as html

print fm.form("/submit")
# <form action="/submit" method="post">

print fm.form("/submit", method="get")
# <form action="/submit" method="get">

print fm.text("address")
# <input id="address" name="address" type="text" />

print fm.text("color", type="color")
# <input id="color" name="color" type="color" />

print fm.textarea("body", "", cols=25, rows=10)
# <textarea cols="25" id="body" name="body" rows="10"></textarea>

print html.HTML.a("Foo", href="http://example.com/", class_="important")
# <a class="important" href="http://example.com/">Foo</a>
```

#【参考サイト】
　[WebHelpers](https://pypi.python.org/pypi/WebHelpers/1.2)
　[document](http://sluggo.scrapping.cc/python/WebHelpers/index.html)
なめらかに動作するアプリのColor Blended Layersを確認する

# 各社のアプリの状況

facebook
<img width="320" alt="facebook.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/16400/185f5caf-b3b0-6ff9-1c7c-0cb9528bd9aa.png">

instagram
<img width="320" alt="instagram.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/16400/5b435f27-cf6e-fc01-1546-0a6428eabeab.png">

pinterest
<img width="320" alt="pinterest.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/16400/a9dff6f3-f14e-bd13-4e2c-6680c67fc639.png">

tumblr
<img width="320" alt="tumblr.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/16400/cf77a5a4-dc3a-b84e-c260-5c6e9255dd18.png">

wantedly
<img width="320" alt="wantedly.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/16400/154250d2-6c95-ca07-d097-76258f32d734.png">

# 念のため

- 各社UILabelの背景色は透過にしていない
- 最初からなめらかに動作していたわけではなく、改善していったモノが多い

# 手順

Xcodeツールバーの[Profile]から[CoreAnimation]を選びInstrumentsを起動、Debug Optionsから `Color Blended Layers`のチェックをオンにすると確認できる。
![instrumentes.png](https://qiita-image-store.s3.amazonaws.com/0/16400/8c87dbf7-5b0b-b77d-4338-48bf78c5974f.png)
ATOMであんまり知られてない便利キーボードショートカット4選 + 2おまけ


<del>windows環境でしか試してないです。</del>
<del>MacはCtrlの部分をcmdにして試してみてください。</del>
macとwin両方で検証して、キーボードショートカットは両方載せました。

#  <i class="fa fa-pencil" aria-hidden="true"></i> 選択した文字を検索フィールドに追加
> mac: `command + E`　
> win: `Ctrl + E`　


どこでも良いので単語にカーソルを合わせ、`command + E`します。
すると単語がハイライトされ、画面下の検索フィールドに単語が追加されます。
必要であれば、そのあと`command + F`でガチ検索で勝利(・ω・)

![ctrle.gif](https://qiita-image-store.s3.amazonaws.com/0/96220/765ad6f0-6631-ace2-5d25-254a508977cd.gif)


#  <i class="fa fa-pencil" aria-hidden="true"></i> 要素や変数(シンボル)を検索&JUMP
> mac: `command + R`　
> win: `Ctrl + R` 　


変数や、HTML要素などの一覧が表示されます。
選択するとその要素が存在する行へJUMPできます。


![ctrlr.gif](https://qiita-image-store.s3.amazonaws.com/0/96220/dd75f8ca-978e-edf2-36fe-fc31fc7ea6e9.gif)

#  <i class="fa fa-pencil" aria-hidden="true"></i> タブで開かれているファイルの一覧を表示
> mac: `command + B`　
> win: `Ctrl + B` 　

ファイルの右オレンジのマークがついてますが、そのマークは更新かけた印です。カキカキ

![ctrlb.gif](https://qiita-image-store.s3.amazonaws.com/0/96220/6f31c90c-a502-444b-a8ef-d5e0d8d2be4b.gif)

#  <i class="fa fa-pencil" aria-hidden="true"></i> 行を詰める
> mac: `command + J`　
> win: `Ctrl + J` 　


![ctrlj.gif](https://qiita-image-store.s3.amazonaws.com/0/96220/bbe91e81-06b5-8344-16e2-fc92fb2fdfa3.gif)
  
<br><br><br><br>
おまけ：結構知られてるやつ2個
#  <i class="fa fa-pencil" aria-hidden="true"></i> 現在カーソルがある行を複製
> mac: `command + Shift + D`
> win: `Crtl + Shift + D`　　


複数選択しても増やせます. めっちゃ便利ですよね！
![ctrlShiftD.gif](https://qiita-image-store.s3.amazonaws.com/0/96220/6fa84d56-affa-0a7b-908d-54dc450b7514.gif)

#  <i class="fa fa-pencil" aria-hidden="true"></i> 現在カーソルがある行を移動
> mac:  `command + control + ↑ ` もしくは `command + control + ↓`
> win:  `Ctrl + ↑ ` もしくは `Ctrl + ↓`


めっちゃめっちゃ![ctrlUpDown.gif](https://qiita-image-store.s3.amazonaws.com/0/96220/9876976a-50c4-ebd0-4609-f05bf50c03e8.gif)
便利ですよね！( これも複数行いけます。 )
JSON to CSV (for Excel)

CSV（**C**haracter-**S**eparated **V**alues）ってなんだかとってもアレですよね！
某Excelの場合、Tab区切りのUTF-16LE with BOMじゃないと素直には開けなかったりするし。

## JSON to CSV(TSV)

ツールは色々あるけど、[jq](https://stedolan.github.io/jq/) か [csvkit](http://csvkit.readthedocs.io/) がよさげ。

1. `jq -r '(.[]|[.name,.age])|@tsv'`
2. `in2csv -fjson|csvformat -TU1'`
    * ただのCSVにするなら、`in2csv -fjson` だけでいい

## utf-8 to utf-16LEBOM

`nkf` または `iconv` 

1. `nkf -W8 -w16L`
2. `iconv -f UTF-8 -t UTF-16`


## 繋げば・・・

`csvkit`×`nkf`の例：

`cat hoge.json|in2csv -fjson|csvformat -TU1|nkf -W8 -w16L>hoge.csv'`

ってな感じ。

## 某M$

utf-8のCSV(**C**omma-**S**eparated **V**alues)をもっと素直に開けるように対応してくれないかなあ。
ボーダーの上に見出し数字を入れた流れ図っぽいリスト

[CSSでborderの上に見出しを重ねたボックスを作る](http://qiita.com/junya/items/da1b16b7590b48812bf4)を拝見しまして、そういやこんなの作ってたことを思い出した。

![スクリーンショット 2016-06-03 15.56.31.png](https://qiita-image-store.s3.amazonaws.com/0/21634/07d537d7-b3ed-5344-60be-d5f5b84d372e.png)

背景に画像使ってくれというのがオーダー。
ありがちっぽいのにこれといって類似のコードも見当たらず、結構試行錯誤したのに、いざもっかいやれと言われると忘れてそうなので、メモ。

```html
<ol>
  <li>
    <div><span></span></div>
    item1
  </li>
  <li>
    <div><span></span></div>
    item2
  </li>
  <li>
    <div><span></span></div>
    item3
  </li>
</ol>
```

```css
* {
  box-sizing: border-box;
}
ol {
  counter-reset: i;
}
li {
  list-style: none;
  position: relative;
  margin-top: 20px;
  padding: 20px;
  border-width: 0 1px 1px;
  border-style: solid;
  border-color: #fff;
  font-size: 30px;
  counter-increment: i;
}
li::before,
li::after {
  content: "";
  position: absolute;
  margin: auto;
}
li::before {
  right: 0;
  bottom: -15px;
  left: 0;
  width: 40px;
  height: 15px;
  background-color: #fff;
}
li::after {
  border-width: 20px 30px 0;
  border-style: solid;
  border-color: #fff transparent;
  width: 0;
  right: 0;
  bottom: -35px;
  left: 0;
}
li:last-of-type::before,
li:last-of-type::after {
  content: none;
}
li div {
  position: absolute;
  overflow: hidden;
  margin-right: -20px;
  margin-left: -20px;
  width: 100%;
  color: #fff;
  top: 1px;
  -webkit-transform: translateY(-50%);
          transform: translateY(-50%);
}
li div::before,
li div::after {
  position: absolute;
  top: 50%;
  margin-top: -1px;
  height: 1px;
  background-color: #fff;
  content: "";
}
li div::before {
  left: 0;
  width: 2%;
}
li div::after {
  right: 0;
  width: 93%;
}
li div span {
  display: inline-block;
  width: 5%;
  text-align: center;
  margin-left: 2%;
}
li div span::before {
  content: counter(i);
}
```

案外力技だった。
調整のしようはいくらでもあると思うのでどうぞ。

http://codepen.io/kobaatsu/pen/OXVNXK
Pumaをsystemdで起動するメモ

これは
---

pumaをcentos7のsystemdで起動させたメモです。

スニペット
---

```:/etc/systemd/system/puma.service
[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/rails
Environment=RAILS_ENV=production
ExecStart=/usr/local/rvm/bin/rvm-exec 2.2.3 bundle exec puma -b tcp://0.0.0.0 -e production -p 80
TimeoutSec=300
Restart=always

[Install]
WantedBy=multi-user.target
```

実行
---

```
# systemctl enable puma.service
# systemctl start puma.service
# systemctl status puma.service
● puma.service - Puma HTTP Server
   Loaded: loaded (/etc/systemd/system/puma.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2016-06-03 10:43:04 JST; 10min ago
 Main PID: 6125 (ruby)
   CGroup: /system.slice/puma.service
           └─6125 puma 3.4.0 (tcp://0.0.0.0,tcp://0.0.0.0:80) [rails]

 6月 03 10:43:04 localhost.localdomain systemd[1]: Started Puma HTTP Server.
 6月 03 10:43:04 localhost.localdomain systemd[1]: Starting Puma HTTP Server...
 6月 03 10:43:05 localhost.localdomain rvm-exec[6125]: Puma starting in single mode...
 6月 03 10:43:05 localhost.localdomain rvm-exec[6125]: * Version 3.4.0 (ruby 2.2.3-p173), codename: Owl Bowl Brawl
 6月 03 10:43:05 localhost.localdomain rvm-exec[6125]: * Min threads: 8, max threads: 250
 6月 03 10:43:05 localhost.localdomain rvm-exec[6125]: * Environment: production
 6月 03 10:43:10 localhost.localdomain rvm-exec[6125]: * Listening on tcp://0.0.0.0
 6月 03 10:43:10 localhost.localdomain rvm-exec[6125]: * Listening on tcp://0.0.0.0:80
 6月 03 10:43:10 localhost.localdomain rvm-exec[6125]: Use Ctrl-C to stop
```

メモ
---

* ExecStartの一番初めのコマンドはフルパスで記述する必要がある
    * パスをつけないとsystemdがエラーを出して起動しない
* WorkingDirectoryでカレントパスを明示できる
    *  bundlerを使っている場合カレントパスが重要なので指定が必要
* プロセスをデーモンに明示的にする必要はない
    * systemdが勝手にバックグラウンドにしてくれるっぽい
* 設定ファイルを変更したら```systemctl daemon-reload```を実行しないと反映されない 
* rvmを使ってるのでrvm-execでRubyのバージョンを指定する必要がある
JavaでiPhone絵文字


iPhone とは限らないが、Unicode絵文字の取り扱い

```java
package emoji.test;
public class EmojiUtil {
	static public String EMOJI_SMILE = codePointToString((int) 0x1F603);
	static public String EMOJI_CRY = codePointToString((int) 0x1F622);
	public static final String codePointToString(int codepoint) {
		// コードポイントからchar[]への変換
		char[] chars = java.lang.Character.toChars(codepoint); // java.lang.Character
		return new String(chars);
	}
}
```

以下、参考リンク

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Character.html#toChars-int-

```
toChars

public static char[] toChars(int codePoint)
    指定された文字(Unicodeコード・ポイント)をchar配列に格納されるUTF-16表現に変換します。
    指定されたコード・ポイントがBMP (基本多言語面または第0面)値の場合、結果として得られる
    char配列はcodePointと同じ値を持ちます。指定されたコード・ポイントが補助コード・ポイント
    の場合は、結果として得られるchar配列は対応するサロゲート・ペアを持ちます。

パラメータ:
    codePoint - Unicodeコード・ポイント
戻り値:
    codePointのUTF-16表現を持つchar配列。
例外:
    IllegalArgumentException - 指定されたcodePointが有効なUnicodeコード・ポイントでない場合。
導入されたバージョン:
    1.5

```


http://www.isthisthingon.org/unicode/index.phtml?glyph=1F603

```
Smiling Face With Open Mouth
Unicode (Hex): 1F603
UTF-8 (Hex): F09F9883
Shift-JIS (Hex): None
Unicode (HTML): &#128515;
Emoticons (0x1F600-0x1F64F)
```
Apache PDFBoxが日本語出力できるようになった件

Apache PDFBoxはjavaでPDFをごにょごにょできるライブラリです。
https://pdfbox.apache.org/

2016年3月に2.0系がリリースされ日本語が出力できるようになってました。

以前からSNAPSHOT版が出ており、試している人がいたので下記参考に試してみた結果を書きます。
http://symfoware.blog68.fc2.com/blog-entry-1777.html

# 試したソースコード

pom.xmlに下記を追記。

```xml
		<dependency>
			<groupId>org.apache.pdfbox</groupId>
			<artifactId>pdfbox</artifactId>
			<version>2.0.1</version>
		</dependency>
```

下記が実行してみたソースコード

```java
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;

//・・・

	public static void main(String[] args) throws IOException {
		//Windowsで、C:/Windows/Fonts/ARIALUNI.TTFにフォントがないと動きません。
		Path path = Paths.get("pdf.pdf");
		try (OutputStream out = Files.newOutputStream(path)) {
			make(out);
		}

		System.out.println(path.toAbsolutePath());
	}

	public static void make(OutputStream out) throws IOException {

		try (PDDocument doc = new PDDocument()) {
			float fontSize = 50;
			PDRectangle rectangle = PDRectangle.A6;
			PDPage page = new PDPage(rectangle);
			doc.addPage(page);

			// フォントファイルを読み込み（2.0系から追加されたメソッド）
			PDFont font = PDType0Font.load(doc, new File("C:/Windows/Fonts/ARIALUNI.TTF"));

			try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
				contents.beginText();

				contents.setFont(font, fontSize);

				contents.newLineAtOffset(10, rectangle.getHeight() - fontSize - 10);
				contents.showText("こんにちは");
				contents.newLineAtOffset(0, -fontSize);
				contents.showText("世界");

				contents.endText();
			}
			doc.save(out);
		}
	}
```


# 結果
こんな感じ。

![image](https://qiita-image-store.s3.amazonaws.com/0/84259/383b6edf-91a8-2c12-9e02-39cb3b92a01c.png)

# あとがき
僕はApache大好きなので、もうiTextの時代は終わったと勝手に思っています。
Javaでツイート



#Twitter アプリの定義

Create an app のリンクから作成する。

https://apps.twitter.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/2abf2e59-e83a-c74c-dfd9-cc28b4c4fdd9.png)


##キーの取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/999528de-2b3a-9123-a1e4-85c8b83d328c.png)


apps.twitter.com にて

Application Settings
Consumer Key (API Key) --> (1)としてメモ
Consumer Secret (API Secret) --> (2)としてメモ

Your Access Token
Access Token --> (3)としてメモ
Access Token Secret --(4)としてメモ

#Twitter4J のライブラリ (.jarファイル) をダウンロード

http://twitter4j.org/ja/

またはMavenなどを利用する。
https://mvnrepository.com/artifact/org.twitter4j/twitter4j-core

##twitter4j.properties の準備 (クラスパスに通す)

```properties
debug=false
http.prettyDebug=false

oauth.consumerKey= (1)で取得した値
oauth.consumerSecret= (2)で取得した値
oauth.accessToken= (3)で取得した値
oauth.accessTokenSecret= (4)で取得した値
jsonStoreEnabled=true
```

#Java の用意

```java
package twtr.test;

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;

public class UpdateStatusMain {

	public static void main(String[] args) throws Exception {

		String latestStatus = "This is test";
		Twitter twitter = TwitterFactory.getSingleton();
		Status status = twitter.updateStatus(latestStatus); // throws
															// TwitterException
		System.out.println("Successfully updated the status to ["
				+ status.getText() + "].");
	}

}
```
ES6でオブジェクトのコピー


ES6ではObject.assign()でオブジェクトのコピーができるようになったのでメモ。

### これまでのオブジェクトのコピー
普通に代入しただけではコピーされない。（jsをやられている方はご存知かとは思いますが。。。）

```js:sampe
var obj = {a: '1'};
var obj1 = obj;

obj.b = '2';

console.log(obj1);
// => { a: '1', b: '2' }
    
console.log(obj);
// => 期待値としては {a: '1'}だが実際には { a: '1', b: '2' }となる
```

これを避けるためには、これまではライブラリ(jqueryやlodashなど)を使ってオブジェクトをコピーしていた。

### ES6でのオブジェクトのコピー
ES6ではObject.assignという関数を使ってコピーが出来るようになったみたい。

[Object.assign()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)

これを使うと...

```js:es6
let obj = {a: '1'};

let obj1 = Object.assign({}, obj);

obj.b = '2';

console.log(obj1);
// => { a: '1' }

console.log(obj);
// => { a: '1', b: '2' }
```

期待どおりの結果になった！

とりあえず、今回はここまで。

ドキュメントを見ると、Object.assign()でマージできたり、ケースによってはObject.getOwnPropertyDescriptor()とかObject.defineProperty()を使った方がいいケースがあったりとかあるみたいなので今度詳しく調べる！
めざせpythonライブラリマスター （８）rolex

#【ライブラリ説明】
　日時を操れます。

#【プログラム】
```py:rolex.py
# -*- coding: utf-8 -*-

from rolex import rolex
from datetime import datetime, date


print rolex.parse_datetime(0) 
# 1970-01-01 00:00:00

print rolex.parse_datetime(1234567890)
# 2009-02-13 23:31:30

print rolex.parse_datetime(date(2015, 12, 24))
# 2015-12-24 00:00:00

print rolex.parse_datetime(datetime(2015, 11, 24, 20, 30))
# 2015-11-24 20:30:00

# 5分おきのタイム表示
start = "2014-01-01 03:00:00"
end = "2014-01-01 03:10:00"
print rolex.time_series(start=start, end=end, freq="5min")
# [datetime.datetime(2014, 1, 1, 3, 0), datetime.datetime(2014, 1, 1, 3, 5), datetime.datetime(2014, 1, 1, 3, 10)]

```

#【参考サイト】
　[rolex](https://pypi.python.org/pypi/rolex/0.0.2)
　[github](https://github.com/MacHu-GWU/rolex-project)
　[document](http://pythonhosted.org/rolex/index.html)
ローカルにwikiを立てたい時にGollumを使ってみた



 今回はローカルにGitHubのようなwikiが欲しいなと思って調べたGollumというwikiをDockerで立ててみます。
 
 
 
## インストール
 
gollumを立てるdocker containerを起動

```
docker run --rm -it -p 4567:4567 --name gollum-container takashioshikawa/ruby-native-2.2.4
```

container内で

```
yum -y groupinstall "Development Tools"
```

```
yum -y install libicu libicu-devel zlib zlib-devel
```

```
gem install gollum
```



## 使い方

container内の好きなディレクトリにgit repositoryを作成します
例: /home/wiki

その中にMarkDownファイルを作成
/home/wiki/main.md

git repositoryで`gollum`と入力して実行
 #wiki> gollum
 
これでwikiサーバーが起動します


http://docker-machineのIP:4567 にアクセス
docker-machineのIP確認方法は`docker-machine ip VM名`


起動画面

![スクリーンショット 2016-06-03 10.14.18.png](https://qiita-image-store.s3.amazonaws.com/0/36871/ce6bc075-1aa9-0157-b06b-e355161b6dcc.png "スクリーンショット 2016-06-03 10.14.18.png")


こんな感じでwikiが見れます

今回はちょっと時間がないのでページ作成はしていませんが多分出来ます

今度gollum用のDocker Image作成しようと思います
今回のcontainer起動は--rmオプションつけているのでstopするとwikiの内容が全て消えるので、インストールが出来て保持したい内容があれば--rmを消してrunしてみてください

というかMacローカルにマウントするようにすればいちいちcontainer内で編集しなくていいのでそうします…

とりあえずここまで



## 所感

非公開にしたいけどWikiは欲しい時に手軽にローカルに作れるのは嬉しい
活用していきたい
Railsの `rake db:create` をリモートでもできるようにする

`rake db:create` は`localhost`のDBの作成をしてくれるがリモートのDBでは利用できない.
ただ設定で１行追加するだけでリモートのDBでもこのタスクが使える様になります.

以下の例はリモートのDBのIPが`192.168.99.100`の場合の例です.

```ruby:config/initializers/localhosts.rb
ActiveRecord::Tasks::DatabaseTasks::LOCAL_HOSTS << '192.168.99.100'
```


具体的には[database_tasks.rb](https://github.com/rails/rails/blob/080265dedbffda29d1babb3cb141238569cf2e30/activerecord/lib/active_record/tasks/database_tasks.rb#L55)で以下の様に定義されています。
この定義を良く見ると`freeze`しているわけではないので追加できます.

```rb:/activerecord/lib/active_record/tasks/database_tasks.rb#L55
LOCAL_HOSTS = ["127.0.0.1", "localhost"]
```


Githubのmasterブランチでも使える感じだったので、Rails6系でも使えると思う.
rails関係のメモ

## railsで自作のスクリプトを走らせたいとき
[ここ](http://qiita.com/mosson/items/9a9b0703ac4c76ebfd4e)が参考になる

`rails g tasks hoge`
libのtasks以下にhoge.rakeができる

```rb:hoge.rake
namespace :hoge do
    desc "hogeの説明を書く。何をするスクリプトか"
    task foo: :environment do
        # ここにやりたい処理を書く
    end
end
```

### 自作のクラスとかmoduleとかをこの中で使いたいなら

```rb:config/application.rb
config.autoload_paths += %W(#{config.root}/lib)
```

を書いて、lib以下に置く
ディレクトリ構造とmoduleのネスト構造は一致させるべし
`lib/hoge/foo/fuwa_fuwa.rb`なら`module Hoge::Foo`内で`class FuwaFuwa`
「array.pushが遅い」という記事を見かけたので試してみた


### 検証コード
```:javascript
(function() {
  console.time('push');
  var array = [];
  for (var i=0;i<100000000;i++) {
    array.push(i);
  }
  console.timeEnd('push');
})();

(function() {
  console.time('length');
  var array = [];
  for (var i=0;i<100000000;i++) {
    array[array.length] = i;
  }
  console.timeEnd('length');
})();
```

### 結果
Chrome 51.0.2704.63 (64-bit)
push: 1577.093ms
length: 1537.691ms

Firefox 46.0.1
push: 1812.18ms
length: 1866.65ms
Elixirでメールを送信


[kamilc/mailman](https://github.com/kamilc/mailman)を利用します。

Githubに[サンプルプロジェクト](https://github.com/tanaka0x/elixir-mailman-example)

# ソースコード
```lib/mailer.ex
defmodule Mailer do
  def deliver(email) do
    # CC or BCCを利用する場合、:send_cc_and_bccが必要
    Mailman.deliver(email, config, :send_cc_and_bcc)
  end

  def config do
    %Mailman.Context{
      config: %Mailman.SmtpConfig{
        relay: "smtp.gmail.com",
        username: "MAILADDRESS",
        password: "PASSWORD",
        port: 587,
        auth: :always,
        tls: :always
      },
      composer: %Mailman.EexComposeConfig{
        html_file: false,
        text_file: true,
        text_file_path: "lib/templates/"
      }
    }
  end
end

defmodule Mail do
  def run do
    send
  end

  def send do
    Mailer.deliver(contents)
  end

  def contents do
    %Mailman.Email{
      subject: "subject",
      from: "FROM",
      to: ["TO"],
      bcc: ["BCC"],
      data: [], # テンプレートを使う場合、必須
      text: "mailer.txt.eex"
    }
  end
end

```

```lib/templates/mailer.txt.eex
Hoge
```

```mix.exs
  # 省略
  defp deps do
    [{:mailman, "~> 0.2.2"}]
  end
  # 省略
```

# 実行
```
$ mix run -e Mail.run
```
Ubuntu 14.04 LTSでGUIログインがループする

おそらくLinuxディストリビューションとは無関係な話題です。

Ubuntu 14.04 LTSで、GUIからログインすると認証には成功している気配なのになぜかデスクトップ環境が表示されず、Xが再起動して再度ログイン画面が出てくる状況になりました。

原因を切り分けてみると

* 問題のアカウントでGUIのログイン画面を無視してCtrl+Alt+F1でCUIからのログインには成功
* 新規ユーザーを作って試すとGUI経由でのログインも成功

という状況でした。

## xsession経由で起動されるログインシェルの起動スクリプト中でexecしてはいけないらしい

原因は僕のシェル初期化スクリプトでした。

僕はログインシェルをbashにしつつ、zshが見つかった場合は`.profile`中でzshをexecするよう設定していました。ところが、Xからのログイン時に別シェルを起動するとログインシェルに異常があったとみなされるのか、xsession自体が終了してしまって再度ログイン画面に戻っていました。

対策として`.profile`先頭に次のように追加してttyが無い環境では別シェルを起動しないようにしたところ、無事GUIからもログインできるようになりました。

```
# If no tty present, exit immediately
[ -z "$PS1" ] && return
```

同じ状況になる人は極めて少数だと思いますが、僕は割と悩んだのでメモとして残しておきます。
Unihanを元にしたと思われるユニコードの読み検索が大変なことになっていた

自動処理したデータは、とりあえず検証しようね的な話をちょっくら。これは趣味の範囲で、漢字の読みを探していたのだけれど、Unihanデータベースを元にしたと思われるユニコードの読み検索サイトがちょぼちょぼ見つかった。でも、なんかちょぼちょぼ変なコトバが目に入ったので、「読み」だけ抽出して試しに校正ソフトウェア（Just Right!）にかけてみてわっはっは。

「あにょめ」って、「あによめ」だよね？　「あかあるむ」って「あかるむ」だよね？　旧仮名遣いについては、漢文訓読とか旧仮名遣いでしか用例がないからそうしているのかも知れないから迂闊に笑えないけれど、それにしてもなんだかな、という感じ。Unihanがおかしいのか、それを加工した人がやっちゃったのかは確かめていないけれど、ともかくわっはっは。1267件の指摘という、微妙に手作業で直す見通しが立つくらいの量なのがまた……。
SQLAlchemy で Alter するには？

**SQLAlchemy** で **Alter** のやり方を調べたので、忘備録的に書いておきたいと思います。

しかし残念なことに SQLAlchemy には、Alter を実行するための特別な機能はサポートされていないようです。

一般的には、[Alembic](https://alembic.readthedocs.io/) や [SQLAlchemy-Migrate ](https://github.com/openstack/sqlalchemy-migrate) といったマイグレーションツールを使ってスキーマを変更します。

また、どうしても動的にスキーマを変更したい場合は、[Connection.execute()](http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.Connection.execute) または [DDL](http://docs.sqlalchemy.org/en/latest/core/ddl.html#sqlalchemy.schema.DDL)を使います。

公式ドキュメント＞Altering Schemas through Migrations
http://docs.sqlalchemy.org/en/latest/core/metadata.html#altering-schemas-through-migrations

## 動作環境
- Mac OS X 10.11.5
- Python 3.5.1
- MySQL Ver 14.14 Distrib 5.7.11, for osx10.11 (x86_64) using  EditLine wrapper
- SQLAlchemy 1.1.0
- PyMySQL 0.7.4

## サンプルコード
テーブルに新しいカラム「kana」を追加するサンプルコードです。

```py3:sqlalchemy_alter.py
# -*- coding:utf-8 -*-
import sqlalchemy
import sqlalchemy.ext.declarative

Base = sqlalchemy.ext.declarative.declarative_base()

class Student(Base):
    __tablename__ = 'students'
    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
    name = sqlalchemy.Column(sqlalchemy.String(20))

    @staticmethod
    def add_column(engine, column):
        column_name = column.compile(dialect=engine.dialect)
        column_type = column.type.compile(engine.dialect)
        engine.execute('ALTER TABLE %s ADD COLUMN %s %s' % (Student.__tablename__, column_name, column_type))

def main():
    url = 'mysql+pymysql://root:@localhost/test_db?charset=utf8'

    engine = sqlalchemy.create_engine(url, echo=True)

    # テーブルをドロップ
    Base.metadata.drop_all(engine)

    # テーブルを作成
    Base.metadata.create_all(engine)

    # テーブルにカラムを追加
    column = sqlalchemy.Column('kana', sqlalchemy.String(40), primary_key=False)
    Student.add_column(engine, column)

if __name__ == '__main__':
    main()
```
AWS Summit Tokyo 2016 / 聴講メモ / SaaS on AWS アーキテクチャと 7 つのベストプラクティス

## ■概要
* AWS 上で展開する上で役に立つ技術的なベストプラクティスやビジネスモデルの考え方および事例紹介

## ■登壇者
* 松本 大樹さん（アマゾン ウェブ サービス ジャパン株式会社 エコシステムソリューション部 部長)

## ■SaaSビジネスの現状
* 提供形態が進化している
	* オンプレ -> アプリホスティング -> AWS -> SaaS on AWS
* SaaSとは
	* (ry
* SaaS市場の予測
	* 2018まで年率20%成長
	* 世界市場で2018年までに/3マーケット占める
	* 世界市場で2018年までに$82billion
* なぜSaaSに向かうのか
	* ユーザ
		* 本来業務に集中
		* 短期利用、短期導入
		* 法改正への迅速な対応
		* カスタマイズより標準モデルで低価格を好むようになった
	* ベンダー
		* 効率的なビジネスモデル
		* 飽和した市場、競合に対抗
		* SAP、Infor、MSといったビッグプレイヤーも展開
		* グローバル展開を含めた販売チャネルの拡大
		* IasSの普及によっって参入障壁が下がった
	* ISVパートナー数240%、SaaS提供パートナー数680%
* なぜSaaSはAWSが向いているのか
	* 初期投資コストや事業リスクの提言
	* 構築、運用、管理の簡便性
	* ビジネスのスケール
	* すでに多くの成功ベンダー
* SaaS on AWSの基本構成
	* アプリケーション部分: Delivery - Integration - Authn/Authz - App - Data
	* SaaSプラットフォーム部分: Ordering - Provisioning - Metering | Billing - Monitoring - Authn/Authz
* SaaSプラットフォーム部分には機能に対応するAWSサービスがある
	* Marketprace, CloudFormation, CloudWatch, IAM, Directory Service, Detailed Billing, EMR, Redshift etc...
* SaaSを始める上での不安: テクニカル面
	* 自社アプリに対してどのような構成が適切かわからない
	* SaaS向けの回収が
	* ガイドラインが欲しい

## ■SaaS on AWS: 4つのアーキテクチャアプローチ
* シングルテナント <=> マルチテナントは、運用・コスト・移行で向き不向きがある
* 個別要件への対応 <=> コスト・運用の効率化 / AWSロックイン回避 <=> 運用効率化・拡張性
	* A: シングルテナント
	* B: シングルテナント + クラウドネイティブ(Aurora + Beanstalk)
	* C: マルチテナント
	* D: マルチテナント + クラウドネイティブ(Beanstalk + API GW + OpsWorks + Lambda + ECS + Aurora + DynamoDB)

## ■SaaS on AWS: 7つのベストプラクティス
* アプリケーションとSaaSプラットフォームの分離
	* メータリング、モニタリング、ビリングなど、SaaSとして必要な機能はアプリケーション部分と分離し、かつ共有して利用する
	* アプリケーション部分は時間をかけて進化させるが、コア機能は流用できるようにしておく
* 機能は抽象化してサービス化する
	* データの再利用や機能追加を用意に
	* 最適化されえたスケールも可能となる
	* AWS Managed Serviceが効果的
	* AWS のマネージドサービスを利用することで自ら構築することなく最新の技術スタックを用意に利用できる
* 可能な部分はマルチテナントで構成でする
	* アカウント -> ユーザ -> ロール
	* 要望に応じて優先順位付けできるよういティア化
	* 運用できちんとモニタリングし、リソースの適切化
* データのライフサイクルに最適化
	* 分単位: Kinesis
	* 時間単位: EMR
	* 日単位: Redshift
	* 週単位: EMR
	* 月単位: S3
	* 年単位: Gracier
* すべての情報を収集してそこから学ぶ
	* インフラからソフトウェアの情報まで正確な情報を確実にモニタリングし保存しておく
	* 分析により、顧客をさらに知る
		* 常に自動的にユーザー満足度やインフラを調整するしくにを作る
		* 利用状況からビジネスモデルを進化させる
		* おれらを収益に変える
* コストと性能の最適化を行う
	* 両立しない。優先順位決める
	* 全レイヤでスケール可能にする
	* より小さいリソース単位でスケールできると効果的
	* 可能であれば、スケーラブルなサービス(Dyan
* 高セキュリティと権限分離を意識する
	* 最低限の権限とする
		* 一時権限や認証連携の活用
		* IDやアプリケーションの権限管理の粒度を適切にする
		* ネットワークも可能な限り分離する
		* _

## ■SaaSを始める上での不安: ビジネス面
* _
	* 既存の商流を壊す
	* SIパートナーの領域を狭めてしまう
	* 運用体制の構築や経験やノウハウが無い
	* 直販となり拡販のノウハウやチャネルが無い
* SaaS商流の定義
	* (ry
* SaaSビジネスにとって課金方法は非常に重要
	* (ry

## ■SaaSの成功事例
* 株式会社ワークスアプリケーション
	* MKS: マイナンバー管理プラトフォーム
		* 個人番号管理に耐えうるセキュリティ(SOCK認証)
		* マネージドサービスで短期開発
		* マネージドサービスで運用最小限
		* EC2使わない、Beanstalk、
		* 結果と展開
			* 障害ゼロ
			* 450万件の個人番号を管理しているが急激な利用増加にもトラブルなし
			* 高度なセキュリティが求められるEnt 領域に使えることが実証でき、今後もAWS活用で展開する
* ウィングアーク 1st 株式会社
	* SWF
		* Auroraで可用性の向上
		* SWF/SQSで疎結合化
		* ECS ActivityとDeciderをDockerで
		* (ry
	* ポイント
		* 買収により分社化、SaaS専門会社分離
		* 売り方を自社で固めてから展開した
	* メモ
		* 閲覧ユーザ 3,000円/月

## ■まとめ
* ここ数年で増加
* 早期参入が有利
* AWS利用で色々なメリットがあります
* AWSエコシステムの様々な支援が得られる

---
※当日の生メモです(ほぼ校正していませんm(_ _)m
※登壇者の方の情報など一部 http://www.awssummit.tokyo/devcon/index.html から引用させて頂きました