OmniAICreator/Qiita-1.07M huggingface dataset:
pyrtm と RTM CLI を使う

コマンドラインから [Remember The Milk](https://www.rememberthemilk.com/) を使う方法です

# First
API KEY と SHARED SECRET  を取得
Non-commercial use
[https://www.rememberthemilk.com/services/api/keys.rtm](https://www.rememberthemilk.com/services/api/keys.rtm)

# pyrtm
```
% pip install pyrtm
% cd ./rtm/samples
% python app.py [API KEY] [SHARED SECRET]
```
url が出てくるのでそれをブラウザで開く 認証ボタンをクリックするとプロンプトに token が発行される

# pyrtm test
`% python app.py [API KEY] [SHARED SECRET] [TOKEN]`
ウインドウが出てきたら成功

# RTM CLI
[http://www.davidwaring.net/projects/rtm.html](http://www.davidwaring.net/projects/rtm.html)

ここからダウンロード
[https://bitbucket.org/dwaring87/rtm-cli/overview](https://bitbucket.org/dwaring87/rtm-cli/overview)
![2014-01-14 21 59 58](https://f.cloud.github.com/assets/1648206/1910614/d9d35f48-7d1b-11e3-9798-47be401807e7.png)

解答したフォルダに exec があるので `usr/local/bin` とかに置く

置いたディレクトリに移動してコマンド指定

```
% cd /usr/local/bin
% sudo chmod +x rtm
% rtm 
```

また url が出てくるのでアクセスして認証して enter  
`>> today`
で今日のリストが出てくる

![2014-01-14 21 32 31](https://f.cloud.github.com/assets/1648206/1910565/730e6c54-7d1a-11e3-8f0f-d127843eb902.png)


### cf. 
[http://t2y.hatenablog.jp/category/pyrtm](http://t2y.hatenablog.jp/category/pyrtm)
homebrew-caskとbrewfileを使ってみた


最近はインフラであってもテキストファイルをコマンドラインを使って操作して環境構築していくという流れが出てきていますが、その流れは当然開発環境にも及んでいます。

で、Qiita上でも他に色々記事があるのですが、重い腰を上げてhomebrew-caskとbrewfileを試してみたのでメモ残します。

# homebrew-caskとbrewfileって何よ？

一言でいうと以下のようなものです。

## [homebrew-cask](https://github.com/phinze/homebrew-cask)

バイナリ形式で配布されているMac用アプリケーションをhomebrewで管理できるようにしたツールのことです。

```
$ brew tap phinze/cask
$ brew install brew-cask
$ brew cask install google-chrome
```

公式リポジトリの説明そのままの引用ですが、こうしただけでChromeがMacにインストールすることが出来るようになります。VagrantやVirtualboxなど、普段dmg形式で配布されているものでも多数管理できるようなので、いちいち配布元に訪れてリンク探したりしなくても済むようになります。

## brewfile

homebrew経由でインストールするソフトウェア群を定義するファイル。homebrew版のBundlerと言った方が分かりやすいかもしれないですね。というか、もともとは[brewdler](https://github.com/andrew/brewdler)というものから生まれたもので、いつの間にかhomebrew側に機能が取り込まれたみたいです。

公式サイトからの引用になりますが、brewfileに以下のような記述をした後に`brew bundle`とコマンドを実行すると対応したソフトウェアがインストールされます。

```
tap 'phinze/cask'
install brew-cask

cask install vagrant
cask install virtualbox
```

ここで注目して欲しいのは、brewfileにはhomebrew-caskのコマンド(cask)も書けるので、dmg形式で配られているソフトウェアとかも一括して管理できるというところですよ。

私が参考にした記事は以下の通り。というかこれらの記事を参考にした方がもっといいと思う。

- http://deeeet.com/writing/2013/12/23/brewfile/
- http://blog.livedoor.jp/sonots/archives/35251881.html
- http://robandlauren.com/2013/11/27/homebrew-brewfile/

Boxenは敷居が何となく高いように感じられたので手を出せていなかったのですが、homebrew-caskとbrewfileは今まで使っていたhomebrewの感覚をそのまま延長して使えるので、気軽に導入できました。もしまだこういった開発環境再現系のツールを試していないMacユーザーは試してみると良いかもしれません。
【MySQL Cluster構築:3】データー/SQLノード編

[1.準備編](http://qiita.com/mykysyk@github/items/ec83fe903bc5b414effc) → [2.管理ノード編](http://qiita.com/mykysyk@github/items/f324ead7acab472a302f) → 3.データー/SQLノード編
#データー/SQLノードインストール＆設定

##MySQLクラスタのrpmを[本家](http://dev.mysql.com/downloads/cluster/)から拾ってきてインストール

cent6-cluster-1とcent6-cluster-2両方で実施

```sh:shell
cd /usr/local/src/
wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.3/MySQL-Cluster-server-gpl-7.3.3-1.el6.x86_64.rpm
wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.3/MySQL-Cluster-client-gpl-7.3.3-1.el6.x86_64.rpm
rpm -ivh MySQL-Cluster*.rpm
```
>
```text:結果
準備中...                ########################################### [100%]
   1:MySQL-Cluster-server-gp########################################### [ 50%]
   2:MySQL-Cluster-client-gp########################################### [100%]
```

##MySQLパスワード確認

cent6-cluster-1とcent6-cluster-2両方で実施

```sh:shell
cat /root/.mysql_secret
# The random password set for the root user at Tue Jan 14 09:20:12 2014 (local time): 5jDoixlD
```

##一旦起動

cent6-cluster-1とcent6-cluster-2両方で実施

```sh:shell
/etc/init.d/mysql start
```
>
```sh:result
Starting MySQL..... SUCCESS!
```

##セキュリティ回りの設定を行い停止する

(ここでMySQLのパスワード変更する)

cent6-cluster-1とcent6-cluster-2両方で実施

```sh:shell
mysql_secure_installation
rm /root/.mysql_secret
/etc/init.d/mysql stop
```
>
```sh:result
Shutting down MySQL.. SUCCESS!
```

##設定ファイルの編集

cent6-cluster-1とcent6-cluster-2両方で実施

```sh:shell
vi /etc/my.cnf
```
>
```ini:/etc/my.cnf
[mysqld]
ndbcluster
ndb-connectstring=192.168.1.100
>
[mysql_cluster]
ndb-connectstring=192.168.1.100
```

##ndbを起動起動

cent6-cluster-1とcent6-cluster-2両方で実施

```sh:shell
ndbd --initial
```
>
```sh:結果
2014-01-14 17:56:27 [ndbd] INFO     -- Angel connected to '192.168.1.100:1186'
2014-01-14 17:56:27 [ndbd] INFO     -- Angel allocated nodeid: 11
```

##確認

```sh:shell
ndb_mgm -e show
```
>
```text:結果
Connected to Management Server at: 192.168.1.100:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=11   @192.168.1.101  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0, *)
id=12   @192.168.1.102  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0)
>
[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.1.100  (mysql-5.6.14 ndb-7.3.3)
>
[mysqld(API)]   2 node(s)
id=21 (not connected, accepting connect from 192.168.1.101)
id=22 (not connected, accepting connect from 192.168.1.102)
```

##MySQL起動

cent6-cluster-1とcent6-cluster-2両方で実施

```sh:shell
/etc/init.d/mysql start
```
>
```sh:結果
Starting MySQL............................................. SUCCESS!
```

##確認

```sh:shell
ndb_mgm -e show
```
>
```text:結果
Connected to Management Server at: 192.168.1.100:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=11   @192.168.1.101  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0, *)
id=12   @192.168.1.102  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0)
>
[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.1.100  (mysql-5.6.14 ndb-7.3.3)
>
[mysqld(API)]   2 node(s)
id=21   @192.168.1.101  (mysql-5.6.14 ndb-7.3.3)
id=22   @192.168.1.102  (mysql-5.6.14 ndb-7.3.3)
```

おしまい
【MySQL Cluster構築:2】管理ノード編

[1.準備編](http://qiita.com/mykysyk@github/items/ec83fe903bc5b414effc) → 2.管理ノード編 → [3.データー/SQLノード編](http://qiita.com/mykysyk@github/items/fb792c54d1b8a5d6874c)

##MySQLクラスタのrpmを[本家](http://dev.mysql.com/downloads/cluster/)から拾ってきてインストール

cent6-cluster-mgrで実施

```sh:shell
cd /usr/local/src/
wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.3/MySQL-Cluster-server-gpl-7.3.3-1.el6.x86_64.rpm
rpm -ivh MySQL-Cluster-server-gpl-7.3.3-1.el6.x86_64.rpm
```
>
```text:結果
準備中...                ########################################### [100%]
   1:MySQL-Cluster-server-gp########################################### [100%]
```

##管理ノードのデータディレクトリと設定ファイルの作成

cent6-cluster-mgrで実施


```sh:shell
mkdir -p /var/lib/mysql-cluster
vi /var/lib/mysql-cluster/config.ini

```
>
```ini:/var/lib/mysql-cluster/config.ini
[NDB_MGMD DEFAULT]
Portnumber=1186
>
[NDB_MGMD]
NodeId=1
HostName=192.168.1.100
DataDir=/var/lib/mysql-cluster
Portnumber=1186
>
[TCP DEFAULT]
SendBufferMemory=2M
ReceiveBufferMemory=2M
>
[NDBD DEFAULT]
BackupMaxWriteSize=1M
BackupDataBufferSize=16M
BackupLogBufferSize=4M
BackupMemory=20M
BackupReportFrequency=10
MemReportFrequency=30
LogLevelStartup=15
LogLevelShutdown=15
LogLevelCheckpoint=8
LogLevelNodeRestart=15
DataMemory=1M
IndexMemory=1M
MaxNoOfTables=4096
MaxNoOfTriggers=3500
NoOfReplicas=2
StringMemory=25
DiskPageBufferMemory=64M
SharedGlobalMemory=20M
LongMessageBuffer=32M
MaxNoOfConcurrentTransactions=16384
BatchSizePerLocalScan=512
FragmentLogFileSize=64M
NoOfFragmentLogFiles=16
RedoBuffer=32M
MaxNoOfExecutionThreads=2
StopOnError=false
LockPagesInMainMemory=1
TimeBetweenEpochsTimeout=32000
TimeBetweenWatchdogCheckInitial=60000
TransactionInactiveTimeout=60000
HeartbeatIntervalDbDb=15000
HeartbeatIntervalDbApi=15000
>
[NDBD]
NodeId=11
HostName=192.168.1.101
>
[NDBD]
NodeId=12
HostName=192.168.1.102
>
[MYSQLD DEFAULT]
>
[MYSQLD]
NodeId=21
HostName=192.168.1.101
>
[MYSQLD]
NodeId=22
HostName=192.168.1.102
```

##管理ノード起動

cent6-cluster-mgrで実施

```sh:shell
ndb_mgmd -f /var/lib/mysql-cluster/config.ini
```
>
```sh:結果
MySQL Cluster Management Server mysql-5.6.14 ndb-7.3.3
```

##確認
```sh:shell
ndb_mgm -e show
```
>
```sh:結果
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=11 (not connected, accepting connect from 192.168.1.101)
id=12 (not connected, accepting connect from 192.168.1.102)
>
[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.1.100  (mysql-5.6.14 ndb-7.3.3)
>
[mysqld(API)]   2 node(s)
id=21 (not connected, accepting connect from 192.168.1.101)
id=22 (not connected, accepting connect from 192.168.1.102)
```
【MySQL Cluster構築:1】準備編

1.準備編 → [2.管理ノード編](http://qiita.com/mykysyk@github/items/f324ead7acab472a302f) → [3.データー/SQLノード編](http://qiita.com/mykysyk@github/items/fb792c54d1b8a5d6874c)

#管理ノードとクラスタノードの用意

現時点で最新のMySQL Cluster 7.3.3をインストールする。
KVM上に3台仮想サーバーを用意する。

| 用途                      | ホスト名          | OS         | IP            | CPU | メモリ |
|:--                        |:--                |:--         | :--           |:---:|     --:|
| 管理ノード                | cent6-cluster-mgr | CentOS 6.4 | 192.168.1.100 |1    | 512MB  |
| データー/SQLノードノード1 | cent6-cluster-1   | CentOS 6.4 | 192.168.1.101 |1    | 512MB  |
| データー/SQLノードノード2 | cent6-cluster-2   | CentOS 6.4 | 192.168.1.102 |1    | 512MB  |

##不要パッケージ削除

cent6-cluster-mgr/cent6-cluster-1/cent6-cluster-2で実施

CentOS6系にはいっているmysql-libsは5.1系のため一旦削除しておく。

```sh:shell
yum remove mysql-libs
```
>
依存関係で cronie cronie-anacron crontabs postfix が削除されるので注意
>
```sh:結果
Dependencies Resolved
>
================================================================================
 Package  Arch   Version         Repository                                Size
================================================================================
Removing:
 mysql-libs
          x86_64 5.1.66-2.el6_3  @anaconda-CentOS-201303050102.x86_64/6.4 4.0 M
Removing for dependencies:
 cronie   x86_64 1.4.4-7.el6     @anaconda-CentOS-201303050102.x86_64/6.4 166 k
 cronie-anacron
          x86_64 1.4.4-7.el6     @anaconda-CentOS-201303050102.x86_64/6.4  43 k
 crontabs noarch 1.10-33.el6     @anaconda-CentOS-201303050102.x86_64/6.4 2.4 k
 postfix  x86_64 2:2.6.6-2.2.el6_1
                                 @anaconda-CentOS-201303050102.x86_64/6.4 9.7 M
>
Transaction Summary
================================================================================
Remove        5 Package(s)
```

##必須パッケージインストール

cent6-cluster-mgr/cent6-cluster-1/cent6-cluster-2で実施

```sh:shell
yum install libaio perl wget
```

##管理/データー/SQLノードノードをインストール

cent6-cluster-mgrで実施

* [管理ノードインストール](http://qiita.com/mykysyk@github/items/f324ead7acab472a302f)

cent6-cluster-1/cent6-cluster-2で実施

* [データー/SQLノードインストール](http://qiita.com/mykysyk@github/items/fb792c54d1b8a5d6874c)

##管理/データー/SQLノードノードをインストール後に実施

cent6-cluster-mgr/cent6-cluster-1/cent6-cluster-2で実施

mysql-libsの依存関係で削除されたものを再度インストールする。
不要であればインストールする必要はない。

```sh:shell
yum install cronie cronie-anacron crontabs postfix
```
ghostをインストールしようとしてnpm install --productionでエラー

ghostはnode.jsで出来てるブログエンジンで注目されているみたいです．
インストール手順がここに
http://docs.ghost.org/ja/installation/mac/
載っていたのでそのままやろうとしたらかなり最初からエラーが出て困りました汗


```エラー内容はこんな感じ
$ npm install –-production
npm http GET https://registry.npmjs.org/%E2%80%93-production
npm http 404 https://registry.npmjs.org/%E2%80%93-production
npm ERR! 404 '%E2%80%93-production' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it
npm ERR! 404 It was specified as a dependency of 'ghost'
npm ERR! 404 
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, or http url, or git url.

npm ERR! System Darwin 11.4.2
npm ERR! command "node" "/Users/ryousuke/.nvm/v0.11.10/bin/npm" "install" "–-production"
npm ERR! cwd /Users/ryousuke/Sites/node/ghost-0.4.0
npm ERR! node -v v0.11.10
npm ERR! npm -v 1.3.23
npm ERR! code E404
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/ryousuke/Sites/node/ghost-0.4.0/npm-debug.log
npm ERR! not ok code 0
```

このとき使っていたnode.jsのバージョンは0.11.10だったのですが，
バージョンを下げたらエラーが消えました．

```
$nvm use 0.10.22
$node -v
v0.10.22
```
0.10.22にバージョンを下げた後，もう一度npm installを実行したらウマくインストールされました．

```
$ npm install --production
npm http GET https://registry.npmjs.org/bcryptjs/0.7.10
npm http GET https://registry.npmjs.org/bookshelf/0.6.1
npm http GET https://registry.npmjs.org/downsize/0.0.4
・
・
・
r@0.3.0, multiparty@2.2.0)
mysql@2.0.0-alpha9 node_modules/mysql
├── require-all@0.0.3
└── bignumber.js@1.0.1
```

最後に起動させてみます．

```
$ npm start

> ghost@0.4.0 start /Users/ryousuke/Sites/node/ghost-0.4.0
> node index

Ghost is running in development... 
Listening on 127.0.0.1:2368 
Url configured as: http://my-ghost-blog.com 
```

うまくいったみたい．
htttp://127.0.0.1:2368
にアクセスしてみるとghostのトップ画面にアクセス出来ました^^;

![トップ画像](http://gyazo.com/7d54820de32ce58b6f7d14d45e0fa0a0.png)
optimaクローン つくりました

論文の締め切りが思っていたより先だったので気が抜けてしまい、こんなのつくっていました。

https://github.com/guicho271828/optima2

なぜ作ったのかというと、主に遅延評価オブジェクトをoptimaで簡単にマッチさせたかったからですね。

自分の作業中、
n要素の集合からm要素の集合への適切な対応付けが欲しかったのですが、(n,mは5~15程度)
気張った枝刈りとかは面倒くさかったので、全探索でやろうとしたんですね。
そう、permutationを作ったんです。n個からm個への。そしたら、簡単に想像が付くとおり、
メモリが爆発して処理系がハングアップします。
でも枝刈りのことを考えるのは面倒、遅延評価にすればとりあえずメモリ爆発は逃れられる。

しかし、optimaでthunkをマッチさせるのは[こういう](http://qiita.com/guicho271828/items/c51cb19ce3736c0f6c4c)hackをするか、あるいはoptima.ppcreのようにoptima内部オブジェクトを触らないといけなかったわけです。クリーンじゃない。よしつくろう！と、まあそういう感じです。

あとは・・・

+ 以前からoptimaベースのユニフィケーションライブラリを作りたいと思っていたのですが、optimaはエラー処理・リスタートがそんなにたくさん準備されているわけではないので、pullreqを投げてみたりしてみたものの、実装もそんなに綺麗ではなく、受理されませんでした。自分で書けばそういう問題は起こらない、と。

+ ほかにも、ARRAYのマッチングがあります。これもつくってみてpullreq投げたのですが・・・。


コードを殆ど一から書きなおしたので、最適化度合いはoptimaにまったく及びません。従って、実用には
まだ辛いかと思います。ただ、optima付属のtestは(ほぼ)全部通りました。test scriptは無断でマルマル借り物なので、m2ymさんには感謝です。テストスクリプトってユーザからのissuesの反映の積み重ねなので、LLGPLとはいえこれを丸パクしてしまったのはすこしズルをしている感があります。

主な違いについてはリンク先をどうぞ。

追記：thunk は optima2では[このように](https://github.com/guicho271828/optima2#constructor-pattern)書けます:

```cl
(defpattern thunk (forced-var)
  `(constructor (function () t) #'functionp
                ,(if (place-pattern-p car)
                     (error "thunk object cannot be overwritten")
                     `(:reader #'funcall ,forced-var))))
```

constructor パターンは type と predicate の両方を指定するようになっていますが、
typeをチェックした後に predicate を呼び出します。
ただし、predicate呼び出し部分はlocally にtype指定、inline指定かつ(optimize (speed 3))指定されるので、sbclなどの速い実装では呼び出しを消してくれる可能性もあります。

今後の課題は、fabrice et.al. の4,5,6章にみられる以下の手法の実装。

+ optimized mixture rule
+ Using exhaustiveness information
+ Optimizing exits
+ Aggressive control flow optimization
+ Better OR pattern compilation
styledoccoでstylusのスタイルガイド作った結果www

スタイルガイドのDOMにスタイルが当たってない…。本当は該当のCSSが当たった状態でボタンが表示されるはずなのに、普通のリンクになってる…。

![ボタン1](https://qiita-image-store.s3.amazonaws.com/0/1008/460c5422-7589-e463-669a-150d0ad97535.png)

原因はどうやらこれだった。

[Error in resulted files when using the --preprocessor option on stylus files · Issue #25 · jacobrask/styledocco](https://github.com/jacobrask/styledocco/issues/25)

2年前のissueなのに4ヶ月前の返答。要は`styledocco --preprocessor "stylus -p"`を渡してあげれという事ですね。`stylus -p`とpオプション渡さないと、標準出力でのメッセージをそのまま渡してしまうので、CSSとして読み込めないということらしい。

おかげで、ちゃんとDOMにスタイルが当たるようになりました!

![ボタン2](https://qiita-image-store.s3.amazonaws.com/0/1008/5e1acf8f-12ec-0fe5-96b8-c028675bd959.png)

あともうissueがcloseされてはいるんですが、Chrome Canary 34.0.1783.0 (Official Build 244475)では、このDOM部分がまったく表示されないというバグがあります。
普通のChromeだと大丈夫です。iframeが悪さしてるらしい気がする。ちゃんと調べてないけど。

[Preview iframes blocked in Chrome 33 · Issue #100 · jacobrask/styledocco](https://github.com/jacobrask/styledocco/issues/100)

【追記】
上で言ってたプレビュー部分のDOMが見れない件が、Chromeの32.0.1700.77 (Official Build 244503) でも起きたので、issueを投げておいた。対応してほしいものですね。

[Preview iframe can't render in Chrome 33 · Issue #111 · jacobrask/styledocco](https://github.com/jacobrask/styledocco/issues/111)
MySQL 最適なテーブル構造解析

#### テーブル構造は最適なのか?

##### Q. EXPLAINでINDEXの付け方をチェックする他に何かないのか?

##### A. 下記Queryを発行することで解析してくれる!!!(sql_analyse.cc で定義されている)

```query:query
SELECT * FROM `table` PROCEDURE ANALYSE();
```

| Field_name | Min_value | Max_value | Min_length | Max_length | Empties_or_zeros | Nulls | Avgvalue_or_avg_length | Std | Optimal_fieldtype |
|:-----------:|:------------:|:------------:|:-----------:|:------------:|:------------:|:-----------:|:------------:|:------------:|:------------:|
| フィールド名 | 最小値 | 最大値 | 最短の長さ | 最長の長さ | 空や0のフィールド数 | NULL数 | 平均値や平均の長さ | ? | 最適なタイプ |

これで構造を見直せるので参考にできます!!!
Stdの意味が良く分からない…。
macOSでDVDの中身をコピーするシェルスクリプト

#!/bin/bash
アクセスログをくれと言ったらDVDボックス化して送ってきてくれたので、こまったので

サーバにコピーする

終了したら音で知らせてくれて、diskトレイが自動で開きます。



DIR_NAME=`ls -la /Volumes/DISC名

PASS＝保存したい場所

if [ -d /PASS/${DIR_NAME}/ ]
then
  echo "Directory already exists."
else
  mkdir /PASS/${DIR_NAME}/
fi


echo "Copy started!!"
date


text="cp ${DIR_NAME}/* /${PASS}/${DIR_NAME}/"

$text

echo "Copy finished!!"
date

afplay /System/Library/Sounds/Glass.aiff
afplay /System/Library/Sounds/Glass.aiff
drutil eject




コピーガードとか対応してないから、

そーゆーのしてないんだから！
scpコマンドの使い方メモ


scpでサーバーにファイル転送するときにポート指定のやり方を結構忘れるので自分用メモ


```書式
$ scp -P ポート番号 ローカルマシンファイルパス ユーザー名@ホスト名:サーバー側の転送先ファイルパス
```

```例
$ scp -P 3000 sample.png admin@exsample.com:/var/www/html/
```
WebSocketでPC×SP連携、事例メモ


がんがんに使ったコンテンツいっぱいあるようなイメージだったけど、案外有名なものは少ない。

まだ攻めがいがある分野なのかなー。

### World Wide Maze

ばっちりバズったgoogleコンテンツ。
サイトを迷路におこす時点ですごい。
スマホの加速度センサー(傾き)利用。

 - http://chrome.com/maze/
 - http://www.youtube.com/watch?v=7AvTl9aU5D8

### 株式会社キャッチボール

コーポレートサイトのトップにぶちこむのがすごい。
投げる動作きもちよい。

 - http://catch-ball.co.jp/
 - http://appllio.com/news/20130425-3521-catch-ball

### EBICHU CUBE

サイト自体はクローズしちゃったので情報すくない…。

 - http://kai-you.net/article/614
 - http://memotte.blog.fc2.com/blog-entry-1.html

### googleサーチすくい

金魚すくいの動きをスマホで再現。
PC側はリッチバナーというところが独特。
スマホのみ版もある。

 - http://www.sagasou.withgoogle.com/pc.html
ruby-buildはパッチを当ててビルドができる

https://github.com/sstephenson/ruby-build#applying-patches-to-ruby-before-compiling

```bash
# applying a single patch
$ rbenv install --patch 1.9.3-p429 < /path/to/ruby.patch

# applying a patch from HTTP
$ rbenv install --patch 1.9.3-p429 < <(curl -sSL http://git.io/ruby.patch)

# applying multiple patches
$ cat fix1.patch fix2.patch | rbenv install --patch 1.9.3-p429
```

知らなかった。こりゃ便利。
Ubuntu 13.10にruby 1.9.2をインストールする時にSSLv2のエラーが出たら

http://deadmemes.net/2011/10/28/rvm-install-fails-on-ubuntu-11-10/

```rbenv install 1.9.2-p180``` すると、rubyのビルド時にエラーが出てしまった。

```
ossl_ssl.c:110:1: error: ‘SSLv2_method’ undeclared here (not in a function)
ossl_ssl.c:111:1: error: ‘SSLv2_server_method’ undeclared here (not in a function)
ossl_ssl.c:112:1: error: ‘SSLv2_client_method’ undeclared here (not in a function)
```

どうせ```aptitude install openssl```するんだろ、と思いきや、実は脆弱性のあるSSLv2は最近opensslライブラリから消されてしまっているらしい。
http://ja.wikipedia.org/wiki/Transport_Layer_Security#SSL_2.0
つまり文字通り、undeclaredというエラーでした。

どうせ脆弱性があるならそんなものはいらん、というわけでソースにパッチを当ててしまう。

```
--- ruby-1.9.2-p180/ext/openssl/ossl_ssl.c	2010-12-23 22:24:00.000000000 -0500
+++ ruby-1.9.2-p180/ext/openssl/ossl_ssl_fixed.c	2011-10-28 11:39:30.265970001 -0400
@@ -107,9 +107,9 @@
     OSSL_SSL_METHOD_ENTRY(TLSv1),
     OSSL_SSL_METHOD_ENTRY(TLSv1_server),
     OSSL_SSL_METHOD_ENTRY(TLSv1_client),
-    OSSL_SSL_METHOD_ENTRY(SSLv2),
-    OSSL_SSL_METHOD_ENTRY(SSLv2_server),
-    OSSL_SSL_METHOD_ENTRY(SSLv2_client),
+    // OSSL_SSL_METHOD_ENTRY(SSLv2),
+    // OSSL_SSL_METHOD_ENTRY(SSLv2_server),
+    // OSSL_SSL_METHOD_ENTRY(SSLv2_client),
     OSSL_SSL_METHOD_ENTRY(SSLv3),
     OSSL_SSL_METHOD_ENTRY(SSLv3_server),
     OSSL_SSL_METHOD_ENTRY(SSLv3_client),
```

をopenssl.patchなどで保存し、

```
rbenv install --patch 1.9.2-p180 < ./openssl.patch
```

とする。
途中、ruby-1.9.2-p180/ext/openssl/ossl_ssl.cの場所を聞かれるが、ruby-buildはダウンロードしたソースファイルを/tmp/ruby-build.(DateTime).(pid)下に置くので、/tmp/ruby-build.hogehoge.brabra/ruby-1.9.2-p180/ext/openssl/ossl_ssl.cとか答えると、パッチが自動的に当たり、ビルドが通る。
画像が奇数ピクセルだとスマホ表示でにじむので、偶数に変更するnodeスクリプト


## 奇数ピクセルだとスマホ表示でにじんだり、Chromeで`text-align:center`しているときにフェードするとビクっとしたりします。

[Slicy](http://macrabbit.com/slicy/)でオシャレにスライスを自動化していると、奇数ピクセルのスライスになったりします。

いちいちPhotoshopでスライスしなおしたりするのはめんどくさいです。

それをImageMagickでちゃちゃっとやってもらいましょう！



## 使い方
* 要ImageMagick
* package.jsonからnpm install
* convert.coffee を置いて、適当なpngへのパスを渡してください！


``` zsh
 coffee convert.coffee -i hogehoge/*.png
```


``` package.json
{
  "name": "setEvenPixel",
  "version": "0.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": ""
  },
  "author": "katapad",
  "license": "none",
  "devDependencies": {
    "imagemagick": "~0.1.3",
    "optimist": "~0.6.0"
  },
  "dependencies": {}
}

```

``` convert.coffee
###
  set even pixel

  @use
  https://github.com/rsms/node-imagemagick

  @see
  画像処理についてあれこれ: ImageMagickで、画像の上下左右に余白を追加する
  http://goo.gl/kVfP9Q

###
argv = require('optimist').argv
if not argv.i
  console.log 'file not found'
  return

if argv.i
  fileList = [argv.i]
if argv._
  fileList = fileList.concat(argv._)
if fileList?.length == 0
  console.log 'file not found'
  return

im = require('imagemagick')

evenize = (fileName)=>
  im.identify fileName, (err, features) ->
    throw err  if err

    direction1 = ''
    direction2 = ''
    south = 0
    east = 0

    if features.height % 2 == 1
      direction1 = 'south'
      south = 1

    if features.width % 2 == 1
      direction2 = 'east'
      east = 1

    direction = "#{direction1}#{direction2}"
    #-background #e2ddd4 -gravity southeast -splice 1999x25 sample367e.png

    if south or east
      im.convert([fileName, '-background', 'rgba(0, 0, 0, 0)','-gravity', direction, '-splice',  "#{east}x#{south}", fileName], (err, stdout) ->
        throw err  if err
        console.log "complete:", fileName
      )

for fileName in fileList
  evenize(fileName)

```
update_optionでautoloadがyesになってしまう問題

`update_option()`、超便利ですよね。
値が既に入っていればupdateしてくれて、新規だったら自動的にaddしてくれる。
素晴らしい関数です。

しかしながら惜しいことに、全ての値がデフォルトで`autoload=yes`に設定されてしまいます。
リソースの無駄遣い！

そういう時は、面倒くさいですが、丁寧に`add_option()`しましょう、
というすげープチTIPSでした。

```php
$key = 'option_key';
if (get_option($key) !== false)
{
  update_option($key, $value);
}
else
{
  $autoload = 'no';
  add_option($key, $value, null, $autoload);
}
```

で、まあ、大体こんな感じでワンラインにしてしまうという…。

```php
(get_option($k) !== false) ? update_option($k, $v) : add_option($k, $v, null, 'no');
```
Pythonの配列処理をJavaで書く


## 最後尾の要素を持ってくる

Pythonでは以下のコードで書けるものが

```python
a = [1,2,3,4,5]
a[-1]
```

javaならこうなる．

```java
int[] a = {1,2,3,4,5};
a[a.length - 1];
```

## 配列の結合

Pythonでは以下のコードで書けるものが

```python
a = [1,2,3,4,5]
b = [6,7,8]
concat = a + b
```

javaならこうなる．

```java
int[] a = {1,2,3,4,5};
int[] b = {6,7,8};
int[] concat = new int[a.length + b.length];

int pos = 0;
System.arraycopy(a, 0, concat, pos, a.length);
pos += a.length;
System.arraycopy(b, 0, concat, pos, b.length);
```

System.arraycopyの引数の順番と役割を覚えておこう．

## 部分配列の作成

Pythonでは以下のコードで書けるものが

```python
a = [1,2,3,4,5]
a[1:]
```

javaならこうなる．

```java
import java.util.Arrays;
…
int[] a = {1,2,3,4,5};
int[] b1 = Arrays.copyOfRange(a, 1, a.length);
```

## map関数

Pythonのmap関数は配列の各要素に適用したい処理をループを使わずに実装できる。コード数が節約でき、コーディングスタンダードとすれば可読性も上がる。ただ、処理スピードに関しては、リスト内包表記の方が早いという報告があるので注意すること。また、itertools.imapを使える状況ならそちらを使う方が高速である場合が多い。ただ、ここでは、map関数をjavaで書くとどうなるのかという点に焦点を当てる．

Pythonでは以下のコードで書けるものが

```python
a = [1,2,3,4,5]
map(lamba x: x+1, a)
```

javaならこうなる。

```java
import java.util.Arrays;
import com.apache.commons.lang3.ArrayUtils;
import com.google.common.base.Function;
import com.google.common.collect.Collections2;
…
int[] a = {1,2,3,4,5};
Collection<Integer> b = Collections2.transform(
		Arrays.asList(ArraysUtils.toObject(a)),
		new Function<Integer, Integer>() {
			@Override
			public Integer apply (Integer x) { 
				return x+1;
			}
		}
	);
```

Collectionになってしまうのはご愛嬌。なお、この表現を使うには、

* commons-lang.jar
* guava.jar

が必要であり、それぞれ以下から取得できる．

* Apache Commons Lang: http://commons.apache.org/proper/commons-lang/
* guava-libraries: https://code.google.com/p/guava-libraries/

※apache commons langのArrayUtilsは、guava中の他のパッケージにある機能で置き換えられる可能性が高い（まだ不勉強なので、今回はcommons-langを使う．）。

簡単にコード中の処理について解説する．

```
Collection<Integer> b = Collections2.transform(
	…
	);
```

Collections2.transform()関数は、map関数に当たる．第一引数で与えられた配列の各要素に対して、Functionの処理を適用する．

```
		Arrays.asList(ArraysUtils.toObject(a)),
```

この部分は、commons-langを使って、intの配列をprimitive型からobject型に変換した後に、List化している．



```
		new Function<Integer, Integer>() {
			…
		}
```

Functionのgeneric表現は、左が返り値、右が引数・配列の要素を表し，applyの返り値、引数はこれに対応していなければいけない．pythonのlambda関数に当たる．

これでは、for文を回した方が早いような気がするが、より複雑な処理をしたくなる（例えば、オブジェクトの中の特定のフィールド値に処理をかけ、その結果配列を得たい場合）と初めてこの表現が生きてくる．

## おわりに

意外とjavaでも簡単に書けるものも多い．これからも気づいたらこのページに互換のコードをアップしていこうと思う．

## 両方の言語の動作確認のために

Pythonはインタラクティブシェルが存在するが、Javaには存在しない．ただ、この程度のサンプルを試すためにクラスの記述をいちいちするのも面倒だ．そのようなニーズのために，BeanShellというプログラムが公開されており，Javaの文法に基づいたスクリプティングができるツールが提供されている．Macには以下のサイトからインストールパッケージが提供されている．

* https://github.com/mcandre/beanshell-mac
【koding.com】C++勉強のために、簡単的に環境構築する

## 背景
* 入門レベルで、C++を勉強する
* 各場所に、C++を勉強できるようにしたい
* VCなど重いIDEを使わない

## 参照
* [koding](https://koding.com)
 * ブラウザでubuntu上に軽く開発できるサイト
* [Ubuntu/Ubuntu Serverにgccをインストールしてみた](http://linux.just4fun.biz/?Ubuntu%2FUbuntu%20Server%E3%81%ABgcc%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F)
* [■[C++][開発環境][vim]Vim で C++ のコーディングを行うなら知っておきたい10のこと](http://d.hatena.ne.jp/osyo-manga/20110530/1306715525)
* [Use SingleCompile to Compile and Run a Source File](http://www.topbug.net/blog/2012/03/07/use-singlecompile-to-compile-and-run-a-single-source-file-easily-in-vim/)
* [vim-pathogenのインストール](https://github.com/tpope/vim-pathogen)

## 環境構築
* kodingにログインして、https://koding.com/Terminalでterminalを使える
* gccとかg++とかがインストールされたので、確認のみ

```bash
$ gcc --version                                                                                                                                     
gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
$ g++ --version
g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

* vim-pathogenのインストール

```bash
$ mkdir -p ~/.vim/autoload ~/.vim/bundle; \
$ curl -Sso ~/.vim/autoload/pathogen.vim \
    https://raw.github.com/tpope/vim-pathogen/master/autoload/pathogen.vim

$ vi .vimrc
-------------
execute pathogen#infect()
syntax on
filetype plugin indent on
```

* SingleCompileのインストール

```bash
cd ~/.vim/bundle
git clone git://github.com/xuhdev/SingleCompile.git
```

* cppファイルをコンパイルして、実行する

```text
:SCCompile<cr>
:SCCompileRun<cr>
```
配列へ要素を追加する

配列の先頭、末尾に要素を追加するには下のようにします。

```ruby:insert1.rb
array = [1, 2, 3]

# 先頭に要素を追加
array.unshift(0)                  # => [0, 1, 2, 3]

array.push(4)                     # => [0, 1, 2, 3, 4]
```

ただしunshift、pushは破壊的メソッドなので元の配列を書き換えてしまいます。
元の配列を変更したくない場合は下のようにdupまたはcloneを使用します。

```ruby:insert2.rb
array = [1, 2, 3]
insert_array = array.dup.unshift(0)

p insert_array                  # => [0, 1, 2, 3]
p array                         # => [1, 2, 3]


insert_array2 = array.clone.push(4)
p insert_array2                 # => [1, 2, 3, 4]
p array                         # => [1, 2, 3]
```

また先頭、末尾以外に要素を追加したい場合は下のようにします。

```ruby:insert3.rb
array = [0, 1, 2, 4, 5]
array[3, 0] = 3

p array                         # => [0, 1, 2, 3, 4, 5]

array = [0, 1, 2, 3, 6]
array[4, 0] = [4, 5]

p array                         # => [0, 1, 2, 3, 4, 5, 6]
```

[]の1つ目に挿入したい場所の添字(0から始まる)を指定します。
2つ目は置き換えたい配列の長さを指定します。
0だと何も置き換えないので結果的にその場所に要素を挿入することになります。

-----------------------------------------------------------------------
追記
配列への要素の挿入は次の方法でも可能なので追加します。

```ruby:insert4.rb
array = [0, 1, 2, 4, 5]
array.insert(3, 3)

p array                         # => [0, 1, 2, 3, 4, 5]

array = [0, 1, 2, 3, 6]
array.insert(4, 4, 5)
p array                         # => [0, 1, 2, 3, 4, 5, 6]
```

また末尾への要素の追加はpushよりも<<を使う方が楽です。

```ruby:insert5.rb
array = [1, 2, 3]
array << 4

p array                         # => [1, 2, 3, 4]
```
変数の変数名を文字列で取得する。

ちょっとデバッグ用に欲しかったので自作。
pythonなら、名前空間の組み込み変数が用意されているのでそれに検索をかける。
（名前空間の変数``locals()``や``globals()``を使う。）
変数の参照は一意ではないが、変数の参照先は一意（・・・ですよね？）であることを利用する。
（識別子関数``id()``を使う。）

```py
def getVarsNames( _vars, symboltable ) :
    """
    This is wrapper of getVarName() for a list references.
    """
    return [ getVarName( var, symboltable ) for var in _vars ]

def getVarName( var, symboltable, error=None ) :
    """
    Return a var's name as a string.\nThis funciton require a symboltable(returned value of globals() or locals()) in the name space where you search the var's name.\nIf you set error='exception', this raise a ValueError when the searching failed.
    """
    for k,v in symboltable.iteritems() :
        if id(v) == id(var) :
            return k
    else :
        if error == "exception" :
            raise ValueError("Undefined function is mixed in subspace?")
        else:
            return error

if __name__ == "__main__":
    a = 4
    b = "ahoo"
    print getVarsNames([a,b,"c"],locals())
```

返り値はこれ。

```py
['a', 'b', None]
```

どうだろう？重ねてネストした関数の中から呼び出したりすると、どうなるかな？

追記：例外送出のところは、ご自由にｗ
【gnavi】位置情報を取得し、初期位置に反映するPart1

昨日澤田さんに教えて頂いて今Gnaviに接続時にブラウザ上で位置情報を取得する機能を追加しようとしているのですが、
myLatlngに値が渡せていないのか、初期表示のままでした。

http://www.atmarkit.co.jp/ait/articles/1107/14/news119.html

http://furudate.hatenablog.com/entry/2013/07/08/103214

http://www.yoheim.net/blog.php?q=20120413

上記のサイトを参考にコードを書いているのですがなかなかうまく行かず、位置情報の許可をどうするかってところまではいくのですがその後初期位置に反映させるのができず苦戦中

`uncaught syntaxerror: unexpected end of input`

と出てきて}閉じが足りないらしいのだがどこだか特定できず編集前に戻しました

参考にしたサイトの通りにコピペしてやってみたんですが、データ挿入がうまくいっていないのか、データ入れられても初期位置が上書きされているのか

因みに僕が書いてみたのはこちらです

```js:
//位置情報取得成功時
function success(position){
var myLatLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
return myLatLng;
}
```

ここをどうこうするのかと考えましたが未だに解決できず。orz

gnaviの初期位置に反映したいのですがmyLatlngではないようで

恐縮ですが、ご教示願えませんでしょうか。
jQueryでShiftJISエンコードされたCSVを処理する

## 想定状況

###### jquery（1.10）を用いてajaxでCSV(Shift-JIS)を取得する

## 問題点と解決方法

### 問題：Shift-JISがうまくエンコードできずに文字化けする

### 解決方法

#### 1)ファイルのエンコードを変更する

ShiftJISエンコードできるようにまずhtmlとjsをShiftJISにエンコードします。
エンコードにはDreamweaverを使いました。

* JSファイル（Shift-JIS）
* HTMLファイル（Shift-JIS）
※meta charset=utf-8になっていないか注意

#### 2)サーバサイドで送出文字コードを指定する

.htaccess

```
AddDefaultCharset Shift-JIS
```

#### 補足

overrideMimeTypeが実装されているブラウザ（IE10+,Chrome,Firefox）であれば
以下のようにajax側でmimetypeをオーバーライドすれば対応できます。

```js
$.ajax({
    beforeSend : function(xhr) {
        xhr.overrideMimeType("text/plain; charset=shift_jis");
    },
    url : 'dummy.csv',
    dataType : 'text'
}).done(function(text) {
    //処理
});
```

参考 [IEでもできた！　jQuery.ajaxでShift JIS（sjis）の外部HTMLを読み込む時の文字化け回避方法](http://hcondo2000.blogspot.jp/2012/10/jqueryajaxshift-jissjishtml.html)
nginxでURLのwww -> non-www


```
# nginx.conf
server {
  server_name "~^www\.(.*)$";
  return 301 $scheme://$1$request_uri;
}
```

https://rtcamp.com/tutorials/nginx/www-non-www-redirection/
http://www.engineyard.co.jp/blog/2013/useful-rewrites-for-nginx/
デバッグ出力とか

#デバッグストリング保存とか取得
##共通インクルードファイルとかに書いておけばいいかと
```php:include.php
<?php
function SaveDebugString($str="")
{
	if(!isset($GLOBALS["_CONTENTS"]["DEBUG_STRING"])){
		$GLOBALS["_CONTENTS"]["DEBUG_STRING"] = "";
	}
	$GLOBALS["_CONTENTS"]["DEBUG_STRING"].= $str."\n";
}
function SaveDebugStringDump($str="")
{
	if(!isset($GLOBALS["_CONTENTS"]["DEBUG_STRING"])){
		$GLOBALS["_CONTENTS"]["DEBUG_STRING"] = "";
	}
	$GLOBALS["_CONTENTS"]["DEBUG_STRING"].= print_r($str,TRUE)."\n";
}
function getDebugString()
{
	return $GLOBALS["_CONTENTS"]["DEBUG_STRING"];
}
```

#共通フッターとかに書いておけば楽になるかもね
##ちゃんと許可したIPからだけ見れるようにしてね
```php:footer.tpl
<div style="position:absolute;_position:absolute;z-index:10000000;top: 20px;text-align: left;">
<span id="debugButton" style="width:40;height:40;background-color:#66CCFF;color:#FFFFFF;font-size:20px;">でばっぐ</span>
<br>
<textarea rows="20" cols="160" style="display:none;" id="debugString">
<?php
if(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] == 'XXXXXXXX'){
    echo str_replace("\t","  ",getDebugString());
    $data = debug_backtrace();
    array_reverse($data);
    echo '■■■PROCESS_FLOW■■■'.PHP_EOL;
    foreach($data as $key => $val){
        echo $val['file'].PHP_EOL;
    }
    echo PHP_EOL;
    echo '■■■ALL_SESSION■■■'.PHP_EOL;
    print_r(str_replace("\t","  ",$_SESSION));
    echo PHP_EOL;
}
?>
</textarea>
</div>
<script type="text/javascript">
    $(document).ready(function(){
        $(function(){
            $("#debugButton").click(function(){
                    $("#debugString").toggle();
            });
            
        });
    });
</script>
</div>
How to access Ruby1.8/Java6 on OSX directly


You can use following to have a symlink for Ruby1.8/Java6 directly.

```sh
DIR=$HOME/bin

for file in erb gem irb rake rdoc ri ruby testrb;do
  sudo ln -s /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/${file} $DIR/${file}1.8
done

for file in java javac javaws;do
  sudo ln -s /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Commands/${file} $DIR/${file}6
done
```

Well, there are

```
/usr/bin/perl5.12
/usr/bin/perl5.16
/usr/bin/python2.5
/usr/bin/python2.6
/usr/bin/python2.7
```

but there are no such kind of stuff about Ruby/Java. Sad.
環境変数を利用するRails4プロジェクトでGuardによる自動テスト環境を作る

Rails 4.0.2でプロジェクトを進めているのですが、Spring + Guardでテスト環境を作ろうとしたところちょっと手間取ったのでそのメモを。先に利用したgemのバージョン番号を明記しておきます。

```
guard-rspec (4.2.4)
spring (1.0.0)
spring-commands-rspec (1.0.1)
dotenv-rails (0.9.0)
```

## 初期状態＆Guardのインストール

まず作業開始前の状況を。rspecは以下のように環境変数を読み込んで動作してました。具体的にはAWS関連の情報をconfig.shに入れてあります。

```bash
$ source ~/path/to/this_project_env.sh
$ RAILS_ENV=test bundle exec rspec
```

この状態からまずguardのセットアップを行いました。

```bash
$ bundle exec guard init
```

## spring-commands-rspec の導入

ここで[GuardのREADME](https://github.com/guard/guard-rspec#options)に書かれているように生成された`Guardfile`にオプションを引き渡しました。

```rb
guard :rspec, cmd: 'spring rspec' do
```

しかし、これで実行するとなぜか以下のようなエラーが

```
Version: 1.0.0

Usage: spring COMMAND [ARGS]

Commands for spring itself:

  binstub         Generate spring based binstubs. Use --all to generate a binstub for all known commands.
  help            Print available commands.
  status          Show current status.
  stop            Stop all spring processes for this project.

Commands for your application:

  rails           Run a rails command. The following sub commands will use spring: console, runner, generate, destroy.
  rake            Runs the rake command
```

どうもspringが受け付けるコマンドにrspecが登録されていないようです。`bundle exec spring` とすると上記のエラーが再度表示されます。そこで、いろいろ調べて`spring-commands-rspec`を導入。すると、今度は`bundle exec spring`実行時にサポートされるコマンドにrspecがリストアップされました。

```
Version: 1.0.0

Usage: spring COMMAND [ARGS]

Commands for spring itself:

（中略）

Commands for your application:

  rails           Run a rails command. The following sub commands will use spring: console, runner, generate, destroy.
  rake            Runs the rake command
  rspec           Runs the rspec command
```

これでGuardがrspecをspring経由で走らせてくれるようになりました。なお、springで動作しているかどうかは、一度springを停止した上でそれをstatusコマンドで確認し、guard実行後に再度statusを見てspringが立ち上がっているかどうかでわかります。

```bash
spring stop
spring status
```

## dotenv gem

さて、これでテストは全部走るのですが、環境変数の読み込みが行われていないのでエラーが発生します。環境変数は`bundle exec guard`で引き継がれないので、guard実行時に読み込むようにする必要があります。Googleで調べると`dotenv`というgemが見つかりました。これはプロジェクトルートに`.env`というファイルを設置すると、そこからRails実行時に環境変数を読み込んでくれるものです。このgemをGemfileに記載して`bundle install`し、`.env`ファイルに環境変数を記述すると上述したコマンドライン経由でのrspecと同様の実行結果となりました。
sql*plusからOSコマンド呼び出す

#環境

- [CentOS-6.4-x86_64](http://www.centos.org/)
- [Oracle Database Express Edition 11g Release 2](http://www.oracle.com/technetwork/jp/products/express-edition/overview/index.html)

#サンプルとか
sqlplusでログインしたあとhostに続けてOSコマンドを実行できる

```bash
$ sqlplus kagamihoge/xxxx
SQL> host ls
```

UNIX系OSでは!（エクスクラメーション）、Windowsでは$（ドル）の短縮記号も使える。

```bash
SQL> !ls
```

```bash
SQL> $dir
```

#参考URLとか
-http://www.shift-the-oracle.com/sqlplus/command/host.html
shell で4文字づつ切り出す方法


* シェルスクリプト総合スレより

## fold
* お手軽
* 出力を加工するのは xargs などでおこなうのかな

```
$ echo "hogefuga" | fold -s4
hoge
fuga

$ echo "hogefuga" | fold -s4 | xargs -I {} echo A:{}
A:hoge
A:fuga
```

## while read
* read -N が環境によってはない
* 出力の加工や利用が簡単そう
* 多分大丈夫だけど、サブシェル問題は忘れずに

```
$ echo "hogefuga" | while read -N 4 i;do echo ${i};done
hoge
fuga

$ echo "hogefuga" | while read -N 4 i;do echo A:${i};done
A:hoge
A:fuga
```

## 参考スレ

[シェルスクリプト総合 その22](http://toro.2ch.net/test/read.cgi/unix/1383260330/107-114)

```
107 ：名無しさん＠お腹いっぱい。 ：sage ：2014/01/11(土) 12:07:28.33
標準入力(od -xが出力した文字列)の文字列を4バイトごと切り取り、 
それをforループで処理させたい思っており、現在はこんな感じのスクリプト作ってます 
OSはCentOS、シェルはbashです 

#!/bin/sh 
for STR in `4バイトごとに切り取る処理` 
do 
hogehoge $STR 
done 

この「4バイトごとに切り取る処理」ですが、現在はsplitで4バイト単位に切り取り、 
分割後のファイルを順次読み込ませるということにしているのですが、 
分割後のファイルが沢山作られるので遅くなり、またやりたい事の割にやってることが 
複雑すぎるので、なんとか改善したいと思ってます 

そういうことをしてくれる、いい方法はありますでしょうか 
標準出力を、指定したバイト数単位にセパレータを挟んで出力してくれるコマンド、みたいな 

cutでやってみようと思ったのですが、これだとオフセットを4バイトずつずらしながら 
切り出していく処理となりそうで、これもまた複雑だなぁ、と… 

108 ：名無しさん＠お腹いっぱい。 ：sage ：2014/01/11(土) 12:14:05.59
$ echo 'hogefugapiyo' | while read -N 4 STR; do echo $STR; done 

109 ：名無しさん＠お腹いっぱい。 ：sage ：2014/01/11(土) 12:38:48.75
ふらっと通りがかったが感動した！ 

110 ：名無しさん＠お腹いっぱい。 ：sage ：2014/01/11(土) 13:01:14.29


107です 

>>108 
なるほどreadでやるのですね 
バイト数も任意で変更できそうで、柔軟性もありますね 

ありがとうございました 

111 ：名無しさん＠お腹いっぱい。 ：sage ：2014/01/11(土) 13:41:30.36
>>108 
つfold 
じゃだめなんだっけ？ 
forをwhileに書き換えるのはおすすめしない。 

112 ：名無しさん＠お腹いっぱい。 ：sage ：2014/01/11(土) 14:35:27.41
>>108 
read: Illegal option -N 

113 ：名無しさん＠お腹いっぱい。 ：2014/01/11(土) 15:13:02.47
dd bs=1 count=切り出しバイト数 skip=オフセットバイト数 
でなんとかならんかい? 

114 ：名無しさん＠お腹いっぱい。 ：sage ：2014/01/11(土) 15:16:16.51
> 標準出力を、指定したバイト数単位にセパレータを挟んで出力 

fold だとセパレータの指定はできないんじゃない？ 

　$ sep="@"; echo 'hogefugapiyo' | while read -N 4 str; do echo -en "${str}${sep}";done 

とかしたいのかと思ったけど… 

# 最後にセパレータがくっついちゃうけどね
```
mecab-rubyをインストールしようとしたが、'mecab.h' not found のようなエラーが出てうまくいかなかった。

MeCabをRubyから使おうとしてうまくいかなかったのでメモ。

以下のページを参考に手元のMac OSX(Mavericks)にMeCabをインストールしていた。
http://qiita.com/tstomoki/items/f17c04bd18699a6465be

参考ページを見ながら、

```bash
$ brew install mecab
$ brew install mecab-ipadic
```

とすることでMeCabは使えるようになったが、
参考ページの通りにやってもエラーが出て、mecab-rubyが使えるようにならない。

エラーが 

```bash
'mecab.h' not found
```

のようなものだったので（正確には覚えてない）、
MeCabのソースコードを以下のページからダウンロードしてきて、
( http://code.google.com/p/mecab/downloads/detail?name=mecab-0.996.tar.gz )
mecab-0.996/src 内にある mecab.h を、mecab-ruby-0.994 内にコピーすることで解決した。

```bash 
$ cp mecab-0.996/src/mecab.h mecab-ruby-0.994/
$ cd mecab-ruby-0.994
$ ruby extconf.rb
$ make
$ sudo make install
```
git コマンド　メモ

git add したくないファイルがあるときの対応
---
* 基本的にはアプリの中の ` .gitignore ` に記述する。
* ローカルにある ` .gitconfig ` の　_global　けして ` .gitignore ` 設定ファイルを有効化させる。

<pre>
git rm --cached ファイル名
</pre>
既にコミット済みのやつは ` .gitignore ` で反映されないのでキャッシュを消す必要がある。

<pre>
git update-index --assume-unchanged ファイル名
</pre>
で  modified になっているファイルをなくせる。` .gitignore `ファイルは基本的に push したくないんだ

git add 戻る
---

<pre>
git reset HEAD ファイル名
</pre>

git log 
---
<pre>
git log --oneline
</pre>
１行で簡単に表示する。

<pre>
git log --stat
</pre>
変更したファイルまで確認できる。

<pre>
git log -U1 --word-diff
</pre>
より詳細に見る。  
コミットを操作
---
<pre>
git reset --hard ID(git logで確認)
</pre>
コミット取り消した上でワークディレクトリの内容も書き換える。

<pre>
git reset --soft ID
</pre>
ワークディレクトリの内容はそのままでコミットだけを取り消す。

リモートにpushしてしまったものを消す
---
<pre>
git push -f origin HEAD^:master
</pre>

pushの流れ
---
<pre>
git add ファイル名
git commit -m "どこどこ変更したお(´-ω-｀)"
git fetch origin
git merge origin ブランチ名
git push origin ブランチ名

git status ➡その都度状況を確認
</pre> 


commitをまとめる
---
例:直近3回分のコミットをまとめる

<pre>
git rebase -i HEAD~3
</pre>

pushの前にこまめにcommitしてたものをまとめるべき 

直前のcommitの名前を変更する
---

<pre>
git commit --amend -m "新しいコミット名"
</pre> 

以前のcommitの名前を変更する
---

<pre>
git log --oneline
git rebase -i ID
pickをrewordに変更して、コミット名を変える
</pre>


ファイルの変更履歴みる
---

<pre>
git diff
</pre>

特定のファイルの変更履歴みる
---

<pre>
git log --follow -p filename
git log -p filename
</pre>

消したファイルふっっかあああああつ
---
<pre>
git checkout HEAD -- 消したファイル名
</pre>

ブランチ確認、移動
---
<pre>
git branch ➡確認
git checkout ぶらん地名　➡ぶらん地名に移動
</pre>

過去のコミットの変更履歴をみる
---
<pre>
git show commitID
</pre>

とにかく戻したい
---

<pre>
git reflog
git reset --hard HEAD@{1}
</pre>

http://yanor.net/wiki/?Git%2Fgit%20reflog%20%EF%BC%88git%20reset%E3%82%92%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%99%EF%BC%89

リモートにpushしてしまったものを.gitignoreで管理したい
---

<pre>
git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master
</pre>


gitより安全に操作
---
http://tmtms.hatenablog.com/entry/20101221/git

ブランチ削除
---

<pre>
全ブランチ確認
$ git branch -a
* master
  ios7
  remotes/origin/HEAD -> origin/master
  remotes/origin/ios7
  remotes/origin/master

ローカルブランチ削除
$ git branch -d ios7
Deleted branch ios7 (was 57c1b0b).

リモートブランチ削除
$ git push origin :ios7
To https://xxx.git
- [deleted]         ios7

</pre>
http://blog.koogawa.com/entry/2014/03/08/121751

ブランチ作成
---
```
git checkout -b new_branch
```

リモートにあるブランチをローカルにもってくる

```
git checkout <branch>
```

リモートpush(そのブランチで初)
---
```
git push -u origin new_branch
```

過去のコミットの変更履歴をみる
---
```
git log -p
```
git log -p コミットID
git log -p -2  ... 直近２つ
Facebookアプリ作ったり消したり作ったり

# 背景

1. Facebookアプリ作るー
1. 本番作る前に練習するー
1. 本番作るー
1. さっき消したのにhogehogeが重複して作れないー
 * なんてことがあるのかななと思いまして。


# まとめ

* 重複OK
 * Display Name
 * App Domains
 * ウェブサイトのサイトURL
 * iOSのバンドルID


* 重複不可
 * Namespace <- そりゃそうだよね。URLになるんだもの。
  * **※重複元消しちゃえば、再利用は可能！**



# やったこと

1. FacebookアプリA作るー
1. Aと同じパラメタでFacebookアプリ作るー
 * Namespaceは重複ダメ。それ以外は重複OKそう
  ![screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/19953/2ab854dd-1ffa-b904-5f67-a5a1bc71cc3c.jpeg)
1. A消すー
1. Aと同じパラメタでFacebookアプリ作るー
 * 同じNamespace使えた再利用できるー
AWS SDK for Rubyを使ってS3オブジェクトにCache-Controlヘッダを追加する

S3オブジェクトにCache-Controlヘッダを追加したいんだけど、AWS::S3::Object#metadataだとx-amz-metaってprefixが付いて困った。
解決策はObject#writeのオプションに指定すればよかった。
 #move_toや#copy_toでも同じようにオプション指定ができる。

コードはざっくりこんな感じ

```sample.rb
require "aws"
s3 = AWS::S3.new
bucket = s3.buckets["my-bucket"]
object = bucket.objects["obj-key"]

object.write(data, cache_control: "max-age=3600")
```

これだとデータのアップロードも走るんだけど、すでにS3に上がってるオブジェクトに対してCache-Controlだけ追加したいと思ったらどうするんだろ・・・。object.write(object.read, cache_control: "max-age=...")　・・・？まさかね。
今度調べてみよう。

**追記**
 #copy_fromを使ってsourceに同一objectを指定することで、アップロードせずにCache-Controlを付けることが出来た

```sample2.rb
require "aws"
s3 = AWS::S3.new
bucket = s3.buckets["my-bucket"]
object = bucket.objects["obj-key"]

object.copy_from(object, cache_control: "max-age=3600")
```
Vim以外でVimっぽくctrl+hjklカーソル移動する。(Macのみ）

新参弱Vimmerなのでお手柔らかに…
タイトルにあるように、Macユーザー向けです。
hjklじゃなくて、ctrl+hjkl です。悪しからず。

vim使い始めるとhjklでのカーソル移動に慣れてしまって、カーソルキーまで移動するのが億劫に…
ブラウザはChromeなので[Vimium](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)はもちろん導入しました。

で、当然ながら他の環境でもhjklしたくなるじゃないですか？


そこで、登場するのが[KeyRemap4MacBook](https://pqrs.org/macosx/keyremap4macbook/index.html.ja)です。
名前にMacBookって入ってますが他のMacでもいけます。


名前の通りKeyをremapするものです。
そもそもKeyRemap4MacBookには
normal mode,visual modeとかが簡単に利用できる設定も存在します。

僕の場合は、normal modeに入ったりしないでctrl+hjklでのカーソル移動だけ使えりゃいい && MacVim使ってる時は無効化したいので自分で書きました。如何にも新参弱Vimmerっぽいですね！！


```xml:private.xml
<?xml version="1.0"?>
<root>
  <appdef>
    <appname>MACVIM</appname>
    <equal>org.vim.MacVim</equal>
  </appdef>

  <item>
    <name>Control_L + hjkl to Left/Down/Up/Right except MacVim</name>
    <identifier>private.vim_mode_except_vim</identifier>
    <not>MACVIM</not>
    <autogen>__KeyToKey__ KeyCode::H, ModifierFlag::CONTROL_L, KeyCode::CURSOR_LEFT</autogen>
    <autogen>__KeyToKey__ KeyCode::J, ModifierFlag::CONTROL_L, KeyCode::CURSOR_DOWN</autogen>
    <autogen>__KeyToKey__ KeyCode::K, ModifierFlag::CONTROL_L, KeyCode::CURSOR_UP</autogen>
    <autogen>__KeyToKey__ KeyCode::L, ModifierFlag::CONTROL_L, KeyCode::CURSOR_RIGHT</autogen>
  </item>
</root>
```


自分で設定を追加する手順は[公式にある通り](https://pqrs.org/macosx/keyremap4macbook/document.html.ja#privatexml)です。

*****

備忘録的にちょっと解説書くと
下記部分が設定内で指定したいアプリケーションの割り当て。

```xml
  <appdef>
    <appname>MACVIM</appname>
    <equal>org.vim.MacVim</equal>
  </appdef>
```

`appname`は自分のわかりやすいように決めて大丈夫。あとで使う。
`equal`はKeyRemap4MacBook同梱アプリのEventViewerで確認します。


1. KeyRemap4MacBook上部の Misc&Uninstallタブ を選択。
2. Launch EventViewerで起動。
3. 上部appタブを選択してからアプリを切り替えると、切り替えたアプリの履歴が出るのでApplication Bundle Identifier を確認。


といった感じです。
で、下記で具体的なremapの指定。

```xml
  <item>
    <name>Control_L + hjkl to Left/Down/Up/Right except MacVim</name>
    <identifier>private.vim_mode_except_vim</identifier>
    <not>MACVIM</not>
    <autogen>__KeyToKey__ KeyCode::H, ModifierFlag::CONTROL_L, KeyCode::CURSOR_LEFT</autogen>
    <autogen>__KeyToKey__ KeyCode::J, ModifierFlag::CONTROL_L, KeyCode::CURSOR_DOWN</autogen>
    <autogen>__KeyToKey__ KeyCode::K, ModifierFlag::CONTROL_L, KeyCode::CURSOR_UP</autogen>
    <autogen>__KeyToKey__ KeyCode::L, ModifierFlag::CONTROL_L, KeyCode::CURSOR_RIGHT</autogen>
  </item>
```

`name`はremapの名前。そのまんまですね。この名前が設定画面に表示されます。
`identifier`は…忘れたw
`not`はこのremapを除外するアプリを指定します。ここでさっき`appdef`で割り当てた`name`を書いてやります。
最後に`autogen`に肝心のremapを書きます。ここの書き方はググるといっぱい出てくるので割愛。

このファイルを読み込んでやると、設定一覧に出てくるのでチェックを入れるだけです！


![スクリーンショット 2014-01-14 4.11.01.jpg](https://qiita-image-store.s3.amazonaws.com/0/15180/d149ebc7-ad52-9e97-caea-ee5f54cec07f.jpeg)

これでカーソルキーまで手を伸ばさなくても！カーソルが！移動！で！き！r！u！

### 最後に一言
exceptって単語使い方あってるのかな…間違ってたら指摘して下さい…
カーソル位置の単語をOSXの辞書で調べて、Emacs上にポップアップ表示する

SDIC使うのもありだけど、せっかくOSXに辞書があるので、その辞書を利用して、
Emacs上に結果をポップアップ表示する。

## 準備
dictionary-app を clone する。
`$ hg clone http://hg.pqrs.org/commandline-dictionary-app`

または、以下のページの左側にある gz からダウンロードする。
http://hg.pqrs.org/commandline-dictionary-app/

make を叩いて作成された dict を任意のディレクトリに置く。
(ここでは ~/.emacs.d/bin/dict とした)

dictionary-app.el を load-path の通ってる場所に置く。

## 設定

```el:dictionary-app-setting.el
(defun ns-popup-dictionary ()
   "カーソル付近の単語を OSX の辞書でひく"
   (interactive)
   (let ((word (substring-no-properties (thing-at-point 'word)))
	 (old-buf (current-buffer))
	 (dict-buf (get-buffer-create "*dictionary.app*"))
	 (view-mode-p)
	 (dict))
     (set-buffer dict-buf)
     (erase-buffer)
     (call-process "~/.emacs.d/bin/dict"
		   nil "*dictionary.app*" t word
		   "Japanese-English" "Japanese" "Japanese Synonyms")
     (setq dict (buffer-string))
     (set-buffer old-buf)
     (when view-mode
       (view-mode)
       (setq view-mode-p t))
     (popup-tip dict)
     (when view-mode-p
       (view-mode))))

(define-key global-map (kbd "C-M-d") 'ns-popup-dictionary)
```

\C-\M-d で、カーソル位置の単語を辞書でひいた結果がポップアップされる。
1回目は結構時間かかるかも。

ポップアップされた内容からコピペしたくなるが、残念ながら出来ない...
PhpStormの設定

# 初期設定

## IDEのカラースキーマを変更
[Preferences] - [Appearance] - [UI Options] - [Theme] - Darculaを選択

## Editorのカラースキーマを変更
[Preferences] - [Editor] - [Colors & Fonts] - Monokaiを選択後、
Save As...で[My Monokai]で保存

## Editorのフォントサイズを変更
[Preferences] - [Editor] - [Colors & Fonts] - [Font]で、
Size14
Line spacin: 1.0

## Code Complete系の表示を速くする
[Preferences] - [Editor] - [Code Completion]で、
Autopopup documentation in (ms): 10
Autopopup in (ms): 10

## 行番号と改行を表示
[Preferences] - [Editor] - [Appearance]で、
Show line numbers
Show whitespaces
にチェック。

# よく使うであろう機能

## ステートメント補完
function Hogeで⇧⌘⏎

## 最近開いたファイル
⌘E

## クラス名で検索
⌘O

## ファイル名で検索
⌘⇧O

## シンボル(変数名、メソッド名、定数名etc)で検索
⌘⌥O

## 行番号を指定して移動
⌘L

## 定義元へ移動
⌘B

## 選択
Alt + ↑ or Alt + ↓

## コード整形
⌘⌥L
細かい設定は下記参照。
http://qiita.com/Vexus2/items/7adbf5c00ddd1e570f45
ChefとVagrantで楽しいクッキング

### 素材
`Vagrant`: 開発環境を簡単に構築・管理し、配布することができる開発環境作成ツール
`Virtual Box`: 仮想化ソフトウェア、Vagrantのプロバイダとして使用
`Chef`: 設定ファイルCookbookに従って、自動的にユーザやパッケージの追加を行うサーバー設定管理ツール
`berkshelf`: アプリケーションの依存関係とCookbookの管理をしてくれる

### 0. ホストマシン前提環境
Ruby 1.9以降

### 1. Vagrantインストール
http://www.vagrantup.com/downloads.html よりホストマシンOSのパッケージを
ダウンロードしてインストール、バージョンが表示されればOK

```
$ vagrant -v
Vagrant 1.4.1
```

### 2. Virtual Boxインストール
https://www.virtualbox.org/wiki/Downloads よりホストマシンOSのパッケージを
ダウンロードしてインストール
Vagrant が求めるVirtual Box のバージョンは、`4.0.x` `4.1.x` `4.2.x` `4.3.x`.

### 3. VagrantからVMを起動準備
ChefプリインストールのCentOS6.3のBoxを設定

```
$ mkdir vagrant-centos
$ cd vagrant-centos
$ vagrant init centos-chef https://s3.amazonaws.com/itmat-public/centos-6.3-chef-10.14.2.box
```

### 4. BerkshelfでCookbook管理
Berkshelfをインストールし、設定Berskfileを編集

```
$ vagrant plugin install vagrant-berkshelf
$ gem install berkshelf
$ vi Berksfile
```

```:Berksfile
site :opscode

cookbook 'nginx'
```

```
$ berks install --path=vendor/cookbooks
```

### 5. Vagrantでレシピを追加してプロビジョニングから起動まで
Vagrantfileにレシピを追加します。

```:Vagrantfile
......
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  ......
  ......
  config.berkshelf.enabled = true
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "./vendor/cookbooks"
    chef.add_recipe "nginx"
  end
end
......
```

あとは3分ほど待つだけ！

```
$ vagrant up
```
ffmpegで動画から音声やサムネイルを取得

```bash:音声を抽出
for VIDEO in $(ls *.mp4 | sed 's/.mp4//')
do
    ffmpeg -i ${VIDEO}.mp4 -acodec copy ${VIDEO}.aac
done
```

```bash:6秒の位置で320x240のサムネイルを取得
ffmpeg -i ${VIDEO}.mp4 -ss 6 -vframes 1 -f image2 -s 320x240 ${VIDEO}.jpg
```