OmniAICreator/Qiita-1.07M huggingface dataset:
KeyRemap4MacBookでcaps lock+hjklをカーソル移動に設定する方法


タイトルの通りcaps lockとhjklで上下左右に移動させます。
[Control+hjklで移動](http://qiita.com/exilias/items/d2f0114d41585fed6edf) のcaps lock版です。
## 準備
"KeyRemap4MacBookで〜"とタイトルに書きましたが実はこれ単体では
caps lockのキーリマップは書けないので[PCKeyboardHack](https://pqrs.org/macosx/keyremap4macbook/pckeyboardhack.html.ja)も使用します。
## PCKeyboardHackの設定
下記のように **Change Caps lock** にチェックを入れ **keycode** を **110** にします。
110(=PC Application Key)にしてる理由は最も無害で無難そうなので。。。
![PCKeyboardHack1.png](https://qiita-image-store.s3.amazonaws.com/0/39026/b93a7b40-792a-577b-400d-6aebb5d7bb83.png "PCKeyboardHack1.png")
## KeyRemap4MacBookの設定
private.xml下記のように設定します。

```xml:private.xml
<item>
    <name>PC_APPLICATION(EXTRA1)+hjklで上下左右移動(どこでもvim)等</name>
    <name>CapsLockを使う場合はPCKeyboardHackでCapsLock->110(PC_APPLICATION)の設定をする</name>
    <appendix>(PC_APPLICATION+H to CURSOR_LEFT)</appendix>
    <appendix>(PC_APPLICATION+J to CURSOR_DOWN)</appendix>
    <appendix>(PC_APPLICATION+K to CURSOR_UP)</appendix>
    <appendix>(PC_APPLICATION+L to CURSOR_RIGHT)</appendix>
    <identifier>private.99</identifier>
    <autogen>__KeyToKey__ KeyCode::PC_APPLICATION, KeyCode::VK_MODIFIER_EXTRA1</autogen>
    <autogen>__KeyToKey__ KeyCode::H, ModifierFlag::EXTRA1, KeyCode::CURSOR_LEFT</autogen>
    <autogen>__KeyToKey__ KeyCode::J, ModifierFlag::EXTRA1, KeyCode::CURSOR_DOWN</autogen>
    <autogen>__KeyToKey__ KeyCode::K, ModifierFlag::EXTRA1, KeyCode::CURSOR_UP</autogen>
    <autogen>__KeyToKey__ KeyCode::L, ModifierFlag::EXTRA1, KeyCode::CURSOR_RIGHT</autogen>
</item>
```

ポイントはPC_APPLICATIONのままでは修飾キーっぽい振る舞い
(ex 先にcaps lockを押してからhを押し、その後caps lockを離す)が
できないので一旦下記のように架空の修飾キーに割り当ててます。

```
<autogen>__KeyToKey__ KeyCode::PC_APPLICATION, KeyCode::VK_MODIFIER_EXTRA1</autogen>
```

その後で割り当てた架空の修飾キーとhjklそれぞれを押した時の挙動を記述してます。

```
<autogen>__KeyToKey__ KeyCode::H, ModifierFlag::EXTRA1, KeyCode::CURSOR_LEFT</autogen>
```

## まとめ
これでめでたくcaps lockとhjklで上下左右に移動ができます!
他にもcaps lock+dとかでシェル呼んで日付入れるとかいろいろできますよ!
caps lock超便利!
// JIS配列のcaps lockで同じような挙動をさせられるかは不明です。
->JIS配列でも大丈夫そうです。
lessで空行の検索を行なう

lessで空行を検索しようと思って`/\n\n`で検索すると`nn`にヒットする。
じゃあどうしたらいいんだと言うと、こう`/^$`。
`$`と`^`は正規表現のアレ。複数行に渡る検索も出来たら良かったんだけれど調べた感じ無理っぽい。
まぁ、そういう時は`view`使えって話ですね。`view`なら`\n`が改行として評価されるので。
GitHubでテキストドキュメントを公開する


こちらの [ゆめみスタッフブログ](http://staffblog.yumemi.jp/) にも書きましたが、Qiitaにも投稿します。

***
﻿
GitHubは、プログラムのソースを公開するだけでなく、テキストドキュメントを置くことができます。

例えば、こういうものです ⇒ https://github.com/hkusu/github_document_demo/blob/master/README.md

プログラマの方でなくても手順やガイドラインなどを公開したり、またドキュメントを複数人で書いたりバージョン管理するのに活用できます。

## 必要なもの

- GitHubのアカウント
	- https://github.com で取得
- Gitのクライアント環境
	- ここが分かりやすいです。
		- http://www.backlog.jp/git-guide/

## リポジトリ内のファイルの構成

とくに決まりはないのですが、こういう構成がいいんじゃないかというものです。
（ボリュームがなければ README.md ひとつだけでもいいと思います。）

```
リポジトリTOP
│
├ README.md .. 目次を書く
│
├ ○○.md
├ ○○.md
├ ○○.md
│
├ 第１章 .. フォルダを作成
│　├ ○○.md
│　├ ○○.md
│　└ ○○.md
│
├ 第２章 .. フォルダを作成

　　～

└ 画像用フォルダ .. 細分化してもよい
　　├ ○○.jpg
　　├ ○○.png
　　└ ○○.xxx
```

## ドキュメントの記法

Qiitaのマークダウン記法がそのまま使えるので、ここでは割愛します^^;

## ページを作ってリンクを張る

- 適当にファイルを `○○.md` として作成してコミット＆プッシュします。
- リンクを張りたい場合は
	- `[リンク名](○○.md)` と記載します。
- フォルダ作って階層を分けてもＯＫです。
	- `[リンク名](△△/○○.md)` と記載します。
- 日本語のフォルダ名、ファイル名も使えます。

## 画像を張る

- まず利用する画像もこのリポジトリにコミット＆プッシュしておきます。
	- 仮に `images` フォルダに格納するとします。
- こういう風にリンクを張ります。
	- `![alt内容（マウスカーソルが当たったときの表示テキスト）](images/○○.jpg)`

## ほか

- リンクや画像は `http(s)://～` で書けばリポジトリ外のものでもＯＫです。
- 絵文字も使えます。
	- 使える絵文字はこちら
		- http://www.emoji-cheat-sheet.com/
	- 例えばこういう風に書けばＯＫです。
		- `:smile:` → :smile:
- 個人的に参考になるGitHub上のドキュメント
	- [cookpadさんのコーディングガイドライン](https://github.com/cookpad/styleguide)
	- [mixiさんのトレーニング資料](https://github.com/mixi-inc/iOSTraining)
		- いろいろありますが、これはiOSのもの
		- こちらは目次だけリポジトリで管理して、各ページはそのリポジトリのWikiで管理するタイプです。

## おわりに

最近はGitHubで小説を書いたりする人もいるようですね。本記事がGitHubの導入の参考になれば幸いです^^
VMware Player to VirtualBox for Windows7 移行メモ

今まで VMware Player で幸せに開発環境を維持ってきた。Workstation と違い、標準ではスナップショットが取れないけど、NHM ( http://euee.web.fc2.com/tool/nhm/nhm.html )というソフトウェアを併用すると、スナップショットが取れるので、まぁ、遜色なかった。

だが、いつの間にか、VMware Player の商業利用の制限が広がってしまった。前は仮想環境を売ってはいけない程度だったのに、今は仕事で使うこと自体ダメになってしまったようだ。

つーことで、前職で Linux 用に利用していた VirtualBox に移行したいなと思っていたんだが、今はWindows。アクティベーションで面倒なことになるのも嫌なので二の足を踏んでいた。が、英語の記事だけど、ハードウェアの変更にならずに、綺麗に移行する方法があるようなので、さっそく試してみた。

* [Migrating Windows 7 from VMWare Fusion to VirtualBox](http://blog.csanchez.org/2011/08/01/migrating-windows-7-from-vmware-fusion-to-virtualbox/)

これに従ってやってみたら、ほぼ問題なくうまくでけた。記憶と記事を頼りに振り返ってみると：

* 移行前に VMware Player 上で、ゲストOS内の Addition をアンインストールしておく
* ゲストOSをシャットダウンして、*.vmdk を VirtualBox 用に全てコピーしとく
* VirtualBox では、ゲスト OS を起動する前に以下をやっておく
  * ハードディスクを SATA から外し、IDE のプライマリに付け直す。
     * あと、IDE を PIIX4 without host I/O cache とやらにしないといけなかったらしかったが、ちゃんと設定したか覚えていない。
  * メモリは VMware の時と同じサイズに設定し直す
  * IO APIC とやらを Enable にしておく
  * 記事だと、OS設定は Windows7 64bit とあったが、自分のイメージは32bitなので、Windows7 32bit にした。

元の VM イメージにもよると思うが、自分の場合、一応、できたという事例ということで。
rails generateで参照フィールドを作る

たまにしかrailsしていない自分用のメモ。

# model

参照オブジェクトもつモデルをgenerateする例.
(既にCompanyクラスはあるものとします。)

|Company|
---------
|id|
|name|

```bash
# これからPersonを作る場合
rails g model Person name:string company:references
# 既にPersonがある場合
# この場合は、modelにbelongs_to :companyを明示する.
rails g migration addCompanyIdToPerson company_id:integer
```

これでDB上には、Person::company_idが生成されます。

|Person|
--------
|id|
|name|
|company_id|

## 補足:関連づけるクラス名や関連先のキーがid以外の場合
[参考 既存DBをrailsしてみた](http://hmu29.hatenablog.com/entry/2014/02/14/001513)

belongs_toのoptionで明示します。

```rb
class Person<ActiveRecord::Base
  belongs_to company, class_name: :m_company, foreign_key: :company_id
end
```

# view

rails generateで自動生成した入力フォームのcompanyフィールドは、idが:companyとなるけど、:company_idに変更する必要有り.(自動的にcompanyをcompany_idに変換とかはしてくれない模様)
ターミナルでゆのっちが降る

辛いことがあったときに、どうぞ。ひだまり荘で、待ってます。

```bash
$ ruby -e 'Y="X / _ / X";S=Y.size;C=`stty size`.scan(/\d+/)[1].to_i/S;a={};c={};puts "\033[2J";loop{r=rand(C);a[r]=0;c[r]=[*30..37].sample;a.each{|x,o|;a[x]+=1;print "\033[#{o};#{x*S+1}H#{" "*S}\033[#{c[x]}m\033[#{a[x]};#{x*S+1}H#{Y}\033[0;0H\033[0m"};$stdout.flush;sleep 0.05}'
```

(Mac の絵文字は使用していないので) Mac のターミナルじゃなくても恥ずかしくないもん！

### 参考

* [Let it Snow in the Terminal of Mac OS X with This Command](http://osxdaily.com/2013/12/06/snow-terminal-mac-os-x-command/)
* [Macのターミナルでビールが降る](http://deeeet.com/writing/2014/04/30/beer-on-terminal/)
* [「Macのターミナルで雪が降る」をカラー化した。翻訳した。](http://melborne.github.io/2013/12/13/translate-let-it-snow-in-the-terminal/)
Cocos2d-js 3.0 をminify化して使う

## 動機
cocos2d-jsで作ったものを公開するのにひとつにまとまった cocos2d-****.min.js が欲しかった。

## 作り方
Cocos2d-js 3.0alpha2 だとminifyできなかったので、developの最新を使う。
自分が使ったのはこれ→ 
https://github.com/cocos2d/cocos2d-html5/commit/4bf7d102cb8ed2f4ca1265923c082cd8fbfbb93d

だけど、これ以降ならなんでもいけるはず。
ant が必要なのでhomebrewなりyumなりapt-getなりでいれておく。あとJavaも。

```bash
git clone git@github.com:cocos2d-html5/
git checkout develop
cd tools
ant
```

すると、cocos2d-html5/lib にcocos2d-html5-v3.0-alpha2-min.jsというminify化されたファイルができている。

が、このままこのmin.jsを使うとエラーが出るのでbuild.xmlを変更する必要がある。
実はminify化するのにいくつかファイルが足りてない。
次のように変更して、antしよう。

```diff
diff --git a/tools/build.xml b/tools/build.xml
index 4b76a9f..580f008 100644
--- a/tools/build.xml
+++ b/tools/build.xml
@@ -21,6 +21,7 @@
                 <file name="cocos2d/core/platform/CCConfig.js"/>
                 <file name="cocos2d/core/platform/miniFramework.js"/>
                 <file name="cocos2d/core/platform/CCMacro.js"/>
+                <file name="cocos2d/core/platform/CCTypesWebGL.js"/>
                 <file name="cocos2d/core/platform/CCTypes.js"/>
                 <file name="cocos2d/core/platform/CCEGLView.js"/>
                 <file name="cocos2d/core/platform/CCScreen.js"/>
@@ -65,6 +66,7 @@
                 <file name="cocos2d/core/CCDrawingPrimitivesCanvas.js"/>
                 <file name="cocos2d/core/CCDrawingPrimitivesWebGL.js"/>
                 <file name="cocos2d/core/labelttf/LabelTTFPropertyDefine.js"/>
+                <file name="cocos2d/core/labelttf/LabelTTFWebGL.js"/>
                 <file name="cocos2d/core/labelttf/CCLabelTTF.js"/>
                 <file name="cocos2d/core/CCActionManager.js"/>
                 <file name="cocos2d/kazmath/utility.js"/>
@@ -245,6 +247,7 @@
                 <file name="cocos2d/core/platform/miniFramework.js"/>
                 <file name="cocos2d/core/platform/CCMacro.js"/>
                 <file name="cocos2d/core/platform/CCTypesPropertyDefine.js"/>
+                <file name="cocos2d/core/platform/CCTypesWebGL.js"/>
                 <file name="cocos2d/core/platform/CCTypes.js"/>
                 <file name="cocos2d/core/platform/CCEGLView.js"/>
                 <file name="cocos2d/core/platform/CCInputManager.js"/>
@@ -289,4 +292,4 @@
             </sources>
```

TODO：ﾌﾟﾙﾘｸ出す

## 使い方

使用する際は、index.html でscriptで指定するロードするファイルをcocos2d-html5-v3.0-alpha2-min.jsに変えるといい。もちろんcocos2d-js/libから使いたいディレクトリにコピーする。

```diff
-    <script src="../cocos2d-html5/CCBoot.js"></script>
+    <script src="./cocos2d-html5-v3.0-alpha2-min.js"></script>
    <script src="main.js"></script>
```

cocos2d-js 2 系はconfigにSingleEngineFile:"cocos2d.min.js" みたいに指定してたけど、3.0からはconfigに書けなくなっている（ちなみに、cocos2d.jsに書いていた設定自体が3.0からはproject.jsonに書くことになっている http://www.cocos2d-x.org/docs/manual/framework/html5/v3.0/project-json/en )。
だが、試行錯誤でうまくいっただけなんで正しくないかも…（ただしぐぐっても情報がない）。

### 感想
cocos2d-js 3.0 の変更箇所はこのページにまとまってる。けっこうかわってるなー
http://www.cocos2d-x.org/docs/manual/framework/html5/release-notes/v3.0a/upgrade-guide/en
テキスト罫線の記号(コピペ用)

プログラムには関係ありませんが、なんか半年に一回ぐらいのペースで探している気がするのでメモ。

# 用途

┏━┳━┳━┳━┓
┃表┃を┃書┃い┃
┣━╋━╋━╋━┫
┃た┃り┃　┃　┃
┗━┻━┻━┻━┛

ツリーを書いたり
┃ ┃
┃ ┣ あああ
┃ ┣ いいい
┃ ┗ ううう
┗ えええ

# コピペ用の記号

- 細い方

    ```
    ─
    │
    ┌
    ┐
    ┘
    └
    ├
    ┬
    ┤
    ┴
    ┼
    ```

- 太い方

    ```
    ━
    ┃
    ┏
    ┓
    ┛
    ┗
    ┣
    ┳
    ┫
    ┻
    ╋
    ```
特定のHostのみからRootLoginを許可する


# Goal

```
* chefリポジトリサーバを作成し、knife soloで実行できるようにしたい
* chef soloの実行ユーザは各サーバのrootユーザとしたい
* 各サーバのrootログインをchefリポジトリサーバのみに絞りたい
* 前提として、VPN環境は持っておらず、さくらVPSやAmazon EC2など様々なサービスでサーバを運用していて、さらに様々な場所でwifiを切り替えてそれらサーバを管理している
```

# Plan

![chef_execute_constitution.001.jpg](https://qiita-image-store.s3.amazonaws.com/0/36978/afd57f2d-7230-4697-0b86-7271fc250475.jpeg "chef_execute_constitution.001.jpg")

![chef_execute_constitution.002.jpg](https://qiita-image-store.s3.amazonaws.com/0/36978/412ba7cb-a1da-16c1-65ed-3eaecacbedab.jpeg "chef_execute_constitution.002.jpg")

```
* chefリポジトリサーバにnomaduserを作成
　（自分自身以外すべてのサーバにrootログインできる権限を持つ最強ユーザ.遊牧民のようにいろんなサーバを渡り歩くことを仕事とするのでnomadと名づけた.）
* nomaduserのpublic keyを全サーバのrootユーザに配り、sshd_config設定でchefリポジトリのIPアドレスのみPermitRootLoginを許可する
* これで、通常ユーザは通常通りssh鍵認証でログイン可能になり、なんらかの理由で何者かがnomaduserのprivate keyを手に入れても、chefリポジトリサーバ上からしかsshすることはできない
* chefリポジトリサーバのnomaduserは厳重管理する必要がある
* この方法でchefリポジトリサーバを踏み台サーバとすることもできるはず
```

# Manual

#### sshd_config

```/etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no

## ...

# Permit root ssh login for only chef admin servers
Match Address <chefリポジトリサーバIPアドレス（ssh接続元）>
    PermitRootLogin yes
```

```設定反映のためsshd再起動する
/etc/init.d/sshd restart
```

※ Matchコマンドで例外をつくることができる項目一覧
http://www.unixuser.org/~euske/doc/openssh/jman/sshd_config.html

> すべての設定項目にMatch指令が適用されるわけではありません。使用できる項目は、AcceptEnv ,AllowAgentForwarding ,AllowGroups ,AllowTcpForwarding ,AllowUsers ,AuthenticationMethods ,AuthorizedKeysCommand ,AuthorizedKeysCommandUser ,AuthorizedKeysFile ,AuthorizedPrincipalsFile ,Banner ,ChrootDirectory ,DenyGroups ,DenyUsers ,ForceCommand ,GatewayPorts ,GSSAPIAuthentication ,HostbasedAuthentication ,HostbasedUsesNameFromPacketOnly ,KbdInteractiveAuthentication ,KerberosAuthentication ,MaxAuthTries ,MaxSessions ,PasswordAuthentication ,PermitEmptyPasswords ,PermitOpen ,PermitRootLogin ,PermitTTY ,PermitTunnel ,PubkeyAuthentication ,RekeyLimit ,RhostsRSAAuthentication ,RSAAuthentication ,X11DisplayOffset ,X11ForwardingおよびX11UseLocalHostです。

#### 公開鍵共有

```
## root user of chef target server

echo "<public key of nomaduser>" >> ~/.ssh/authorized_keys
```

# Alternatives

踏み台サーバを作るならiptables, hosts.allow/hosts.denyなどでACLをかけるのもあり
sshd_configの"PermitRootLogin forced-commands-only"とすると、リモートコマンド実行モードでのみroot ssh可能になるらしいが、これだとknife soloは実行できなかった
vagrantでguest additionsエラー


vagrant boxにubuntuを追加してvagrant sshしたところ、
以下のエラーが出力された

```
$ vagrant ssh
・・・
The guest additions on this VM do not match the installed version of
VirtualBox! In most cases this is fine, but in rare cases it can
cause things such as shared folders to not work properly. If you see
shared folder errors, please update the guest additions within the
virtual machine and reload your VM.

Guest Additions Version: 4.3.10
VirtualBox Version: 4.2
```

Virtual Boxをアップデートして、バージョンを一致させる
https://www.virtualbox.org/wiki/Downloads から
欲しいバージョン（今回は4.3.10）をダウンロード・インストール

アップデート後に再挑戦したら、
今のvagrantバージョンではVirtual Box4.3.10には対応してないと怒られた

```
$ vagrant up
Vagrant has detected that you have a version of VirtualBox installed
that is not supported. Please install one of the supported versions
listed below to use Vagrant:

4.0, 4.1, 4.2
```

ちなみに今のvagrantバージョン

```
$ vagrant -v

Vagrant 1.3.1
```

http://pxp-ss.hatenablog.com/entry/2013/10/31/020025 によると
[1.3.5](http://downloads.vagrantup.com/tags/v1.3.5)なら対応しているらしいのでダウンロード・インストール

成功！と思いきや、再びエラー

```
$ vagrant up
・・・
The guest additions on this VM do not match the installed version of
VirtualBox! In most cases this is fine, but in rare cases it can
cause things such as shared folders to not work properly. If you see
shared folder errors, please update the guest additions within the
virtual machine and reload your VM.

Guest Additions Version: 4.2.16
VirtualBox Version: 4.3
```

結局Guest Additionsも上げないとダメっぽい
[ここ](http://qiita.com/isaoshimizu/items/e217008b8f6e79eccc85)を参考にアップデート

```
$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.10.0)'!

$ vagrant vbguest

$ vagrant vbguest --status
GuestAdditions 4.3.10 running --- OK.
GuestAdditions 4.3.10 running --- OK.
```

これでエラーが出なくなった(∩´∀｀)∩ﾜｰｲ
matplotlib によるデータ可視化の方法 (1)

[matplotlib](http://matplotlib.org/) と [pandas](http://pandas.pydata.org/) によるさまざまな[図の描画方法を以前に紹介](http://qiita.com/ynakayama/items/68eff3cb146181329b48)しました。しかしその具体的なパラメーターについては触れませんでした。今回から数回に渡り matplotlib による図形描画について追っていこうと思います。

## 図とサブプロット

matplotlib の Figure オブジェクトはプロット機能を提供します。 plt.figure() メソッドは何も描画されていない新しいウィンドウを描画します。 add_subplot() メソッドはその内部にサブプロットを生成します。

```py3
import numpy as np
from pandas import *
from pylab import *
import matplotlib.pyplot as plt
from matplotlib import font_manager
from numpy.random import randn

# 日本語を使うため必要
fontprop = matplotlib.font_manager.FontProperties(fname="/usr/share/fonts/truetype/fonts-japanese-gothic.ttf")

# 新規のウィンドウを描画
fig = plt.figure()

# サブプロットを追加
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)

plt.show()
plt.savefig("image.png")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/ed527352-a00d-0a21-a89c-306a427ca7fa.png)

### サブプロットへのデータ描画

plot をすると matplotlib は使用した図やサブプロットのうち一番最後のものに描画します。

```py3
ran = randn(50).cumsum()
# 黒色 (k) の破線で描画する
plt.plot(ran, 'k--')

plt.show()
plt.savefig("image2.png")
```

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/4a8f97c1-7c97-4d0e-0ceb-6d519775412e.png)

サブプロットのインスタンスメソッドを明示的に呼び出すことで、任意のサブプロットに描画できます。

```py3
ax1.hist(rand(100), bins=20, color='k', alpha=0.3)
ax2.scatter(np.arange(30), np.arange(30) + 3 * randn(30))

plt.show()
plt.savefig("image3.png")
```

![image3.png](https://qiita-image-store.s3.amazonaws.com/0/38501/2476ce6e-e0c6-ec86-1fa6-0a6ac248608d.png)

### スペースの調整をする

サブプロット間のスペースの調整には subplots_adjust メソッドを使います。

```py3
fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
for i in range(2):
    for j in range(2):
        axes[i, j].hist(randn(500), bins=50, color='k', alpha=0.5)

# サブプロット間の空白を詰めてみる
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0, hspace=0)

plt.show()
plt.savefig("image4.png")
```

![image4.png](https://qiita-image-store.s3.amazonaws.com/0/38501/0f3ed611-1d1b-f34a-54c5-c56dcb6a7e20.png)


## 参考

Pythonによるデータ分析入門――NumPy、pandasを使ったデータ処理
http://www.oreilly.co.jp/books/9784873116556/
railsモデルを削除して新しくmodelを追加したらIDが飛ばされることなく削除したモデルのIDが設定されてしまった。



`Category has_many goods`のような関連のデータでCategoryモデルを削除し、新規に作成した場合、削除したIDの次の数値がIDとなるのが期待される挙動です。(例 ID=23のモデルを削除したら次に作成されるモデルのIDは24)

しかし特定の状況下ではそうならずに削除したIDが新規に作成したモデルに割り振られる事があるようです。(例 ID=23のモデルを削除したら次に作成されるモデルのIDに23が割り振られる)

こうなると思わぬ関連付けされてしまうので困ります。

```
> Category.find(23).destroy
  Category Load (0.7ms)  SELECT `categories`.* FROM `categories` WHERE `categories`.`id` = 23 LIMIT 1
   (0.1ms)  BEGIN
  SQL (0.3ms)  DELETE FROM `categories` WHERE `categories`.`id` = 23
```

下に自分が起きたとき原因だろうと思われるところを上げてみます。


1. railsはmysqlを使う際InnoDBをデフォルトで使う
[Ruby on Rails : migration 機能リファレンス](http://webos-goodies.jp/archives/50741819.html)
  >なお、バックエンドデータベースとして MySQL を使用している場合、:options を指定しないと "ENGINE=InnoDB" がデフォルトで指定されます。

1. mysqlのInnoDBは外部key制約で参照されているtableのデータを削除するときはTRUNCATEが使用される。
[12.2.9. TRUNCATE 構文](http://dev.mysql.com/doc/refman/5.1/ja/truncate.html)

  >もしテーブルを参照する外部キー制約があれば、InnoDB テーブルに対しては、TRUNCATE TABLE が DELETE にマップされ、そうでなければ、高速切断(テーブルのドロップと再作成)が利用されます。外部キー制約の有無に関わらず、AUTO_INCREMENT カウンタが TRUNCATE TABLE によってリセットされます。

1. テーブルでTRUNCATEを使用するとauto incrementがリセットされる。

  [メッチャ役に立つauto_incrementの話](http://www.slideshare.net/kitakoh/autoincrement-13480112)のスライド21~23ページ目を参考にした。

  >21\. テーブルをTRUNCATEするとどうなる？（シーケンスが12まで振られてる状態で）TRUNCATE TABLE tbl;INSERT INTOtbl(user_name)VALUES(‘userXX’);
  >22\. シーケンスが巻き戻った 
  >23\. DELETEでは巻き戻らないが、 TRUNCATEだと巻き戻る


上記の３つの条件が同時に起こっているとオートインクリメントの挙動が期待されていないものになるようです。

対策としてはrailsのhas_manyにはdependent オプションがあるのでそれを設定しとくべきだと思います。
設定すると親モデルを削除した際に子モデルも同時に削除されるというものです。

http://guides.rubyonrails.org/association_basics.html#options-for-belongs-to-dependent

[railsでhas_manyで関連したモデルのデータを一気に消すとき](http://kingyo-bachi.blogspot.jp/2012/05/railshasmany.html)
IntelliJでコピペしたパスからファイルを開く



[Eclipseでターミナルでコピペしたパスからファイルを開く](http://qiita.com/fieldville/items/3070c8add1d5b2cc62bc)
のIntelliJ版です。
（要はiTerm2とかでコピーしたパスをIDE上でサクっと開きたい方法です）

### 前提
`Command + 3` → `Create Command Line Launcher` をしておいて
`idea`というコマンドを/usr/local/binに置いておく。

### 方法
Terminalウィンドウからパスをコピペするだけ。その際開くコマンドは`idea`で。

```
idea src/main/java/.../Hoge.java
```
のような感じで叩くと、(既に開いているIDE上の)IntelliJのエディタが開く。


### 参考
[intellij idea - IntellijIdea 13: use terminal window to open file in the IDE - Stack Overflow](http://stackoverflow.com/questions/21261460/intellijidea-13-use-terminal-window-to-open-file-in-the-ide)
#さくらのクラウド にMacからFTPSでISOイメージをアップロードする

## 2016.11 追記

Homebrewから`lftp`パッケージが消えた..

```shell-session
$ brew search lftp
homebrew/x11/curlftpfs
```

どうやらlftp自体がOSXでビルドできなくなった模様。

* [How do I get latest version of `lftp`?](https://github.com/Homebrew/brew/issues/1387)
* [lftp 4.7.0 build error under OS X](https://github.com/lavv17/lftp/issues/223)

しかしlftp本家では修正されているように見える。

### 私家版で回避

雑にリポジトリを作って`formula`をpushしたのでtapしてみる。

```shell-session
$ brew tap mazgi/betagarden
$ brew search lftp
mazgi/betagarden/lftp
homebrew/x11/curlftpfs
$ brew install lftp
$ lftp --version
LFTP | Version 4.7.4 | Copyright (c) 1996-2016 Alexander V. Lukyanov
```

インストールできた！

----

## 本文

さくらのクラウドにISOイメージをアップロードするときにいつもFTPSで悩むのでメモ。

----

なにはともあれFTPSをしゃべれるクライアントが必要なので `lftp` をインストールする。

```shell-session
[mazgi@BRUICHLADDICH] $ brew install lftp
```

さくらのクラウドでISOイメージを作るとこんな画面になる。
ユーザー名とパスワードが必要なので開いたままにしておく。
もし閉じてしまった場合は[FTP接続情報をリセットすると新しいユーザー名とパスワードを再発行できる](http://support.sakura.ad.jp/manual/cloud/basic/iso.html)。

![Screen Shot 2014-05-01 at 4.50.46 PM.png](https://qiita-image-store.s3.amazonaws.com/0/9676/df810bdb-793c-ce08-185b-cfb639892109.png)

FTPSでISOイメージをアップロードする。
ポイントは `ftp:passive-mode` と `ftp:ssl-protect-data` 。これをいつも忘れてハマる。

```shell-session
[mazgi@BRUICHLADDICH] $ lftp cdromXXXXXXXX@sac-is1a-ssl.sakura.ad.jp
Password: 
lftp cdromXXXXXXXX@sac-is1a-ssl.sakura.ad.jp:/> set ftp:passive-mode on
lftp cdromXXXXXXXX@sac-is1a-ssl.sakura.ad.jp:/> set ftp:ssl-protect-data true
lftp cdromXXXXXXXX@sac-is1a-ssl.sakura.ad.jp:/> lcd ~/Downloads/
lcd ok, local cwd=/Users/mazgi/Downloads
lftp cdromXXXXXXXX@sac-is1a-ssl.sakura.ad.jp:/> put install-amd64-minimal-20140403.iso 
268435456 bytes transferred in 29 seconds (8.95M/s)                                                         
```
RSpecのベストプラクティス集（Better Specs）の日本語まとめ


[5/1追記]日本語版あったようですorz [Better Specs](http://betterspecs.org/jp/)


[Better Specs](http://betterspecs.org/)から項目と簡単な説明をピックアップしています。

何点か似てるのあったのでマージしてます。


# テストコードの書き方

## describeでは対象メソッド名を明確にして、文章も短くしよっ

describeは長々文章で書くと読みにくいよ
メソッド名で簡潔に表現してね

```
# .はクラスメソッド、#はインスタンスメソッド
 describe '.authenticate' do 
 describe '#admin?' do 
```

## contextを積極活用して、whenやwithで始まるような文章にしてね

context＋when/withで読みやすさが全然ちがうね

```
context 'when logged in' do
  it { should respond_with 200 }
end
```

## 各テストでは１アサーションのみ実施しないとね

１つになんでもかんでも詰め込んじゃうとどこで失敗したかわかんないよー＞＜

```
it { should respond_with_content_type(:json) }
it { should assign_to(:resource) }
```


## 可能性のあるケースはすべてテストしなきゃね

いい大人なんですから、成功ケース、境界値ケース、無効ケースなどはちゃんとテストしてね

```
describe '#destroy' do
  context 'when resource is found' do
    it 'responds with 200'
    it 'shows the resource'
  end
  context 'when resource is not found' do
    it 'responds with 404'
  end
  context 'when resource is not owned' do
    it 'responds with 404'
  end
end
```

## 基本はShouldよりもExpectを使った方がいいよ

古臭いshouldなんかやめて新しいexpectを使おうよ
ただ、subjectなどを使ってる場合はshouldを使ってもいいよ
でもね、全体的にshouldはなくしていく傾向にあるよ



## 関係するテストがいくつかあるならSubjectを活用しよう

同じものを複数のテストで使う場合はsubject{}を使った方がいいんだよ
あれ、subjectを使う・・・shouldを使う・・・expectは・・あれれ？？



## 変数を使うならbeforeよりもletやlet!を使ったほうがいいよ

読みやすくなるし、何より遅延ロード(let)と即ロード(let!)を使い分けられるしね。
詳細はstack overflowの[この回答](http://stackoverflow.com/questions/5359558/when-to-use-rspec-let/5359979#5359979)参照してね


## Mock（ダミーケース）は過度に使わないようにしてね

極力実際のケースでテストするのがオススメですっ

```
context "when not found" do
  before { Resource.stub(:where).with(created_from: params[:id]).and_return(false) }
  it { should respond_with 404 }
end
```

## テストに必要なデータだけロードしようね

必要以上にたくさんのデータをロードしちゃうと時間や負荷がかかっちゃいます
たくさんのレコードが必要と思うかもだけどそれは間違いだよっ

```
describe "User"
  describe ".top" do
    before { FactoryGirl.create_list(:user, 3) }
    it { expect(User.top(2)).to have(2).item }
  end
end
```

## fixturesじゃなくてfactoriesを使おうね

fixturesは管理が大変だからfactories(FactoriGirl)使うのがいいよ

```
# BAD
user = User.create(
  name: 'Genoveffa',
  surname: 'Piccolina',
  city: 'Billyville',
  birth: '17 Agoust 1982',
  active: true
)
# GOOD
user = FactoryGirl.create :user
```

## マッチャーは極力標準のものをつかいましょ

[ここ](https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers)でいいマッチャーがないか２重確認してね


## テストが膨れて重複してきたら共通化しようね

テストを書いていくうちにコード重複おこっちゃうけど、テストもDRYだよねっ

## コントローラのテストはいらないよ、そのかわりインテグレーションテストしようね

モデルのテストしたらつぎはcapybaraなんかを使ってインテグレーションすればいいよ。
コントローラのテストって複雑だし無意味っぽいからさっ


# テスト実行の仕方

## guardをつかって自動テストしちゃおうよ

毎回テストを手動でやるのは飽きちゃうよね。だったらさguardで自動化しよっ。
そうすれば更新されたものに関する差分テストもできちゃうし一石二鳥だよ

## プリロードしてテストを高速化しちゃおっかな

ZeusやZpinやSportなんかを使えばライブラリをプリロードしてくれて
コントローラ、モデル、ビュー、ファクトリ・・・なんかをリロードしてくれるよ

どれでもいいんだけど、Zeusは制約ちょっときついので気をつけてね。
（ruby2.0以上推奨でOSがFSEventかinotifyサポートしてないといけないよ）

もっと知りたいなら[ここ](https://github.com/andreareginato/betterspecs/issues/17)みてね

## 外部サービスを使うならHTTPリクエストはスタブ化しようね

外部サービスに依存したテストなんてもっての外だよ。
落ちたらテストできないし負荷もかけちゃうしね。
webmockのようなものを用いてスタブ化すべきだよ

[ここ](http://marnen.github.com/webmock-presentation/webmock.html)らへん参考になるよ

## フォーマッターで進捗のフォーマットを変更しちゃおっと

fuubarっていうgemを使えばテストの進捗を見やすくしてくれるよ
Defineの設定場所


[File]-[Build Settings...] から [Player Settings...] を開くと、デバイス毎に"Scripting Define Symbols" を定義できるようになっている。

![スクリーンショット 2014-05-01 16.49.33.png](https://qiita-image-store.s3.amazonaws.com/0/8219/d1c204e3-9cce-69b7-eb02-53b619e83d75.png "スクリーンショット 2014-05-01 16.49.33.png")

# 参考

[けいごのなんとか • Defineをプラットフォーム別に行いたい 今まで(私が知っているやり方です) ...](http://anchan828.tumblr.com/post/32669868103/define)
has_secure_passwordでpassword_confimationを使用しないようにする


これがBestがどうかわかりませんが、メモ。

```
has_secure_password validations: false
```

として、バリデーションのエラーをでないようにします。

これだと、passwordのバリデーションが掛からないので、

```
validates :password, presence: true, length: {minimum: 8}
```

こんな感じでpasswordのバリデーションを自分で書いてあげれば、おｋ。
iOSシミュレータとAndroid仮想デバイスで確認する


# iOSシミュレータ向けビルド手順

## Unity側設定

[File]-[Build Settings...] を開き、Platform で iOS を選択し [Switch Platform] ボタンをクリック。

(数分待つ...)

[Player Settings...] ボタンをクリック、すると、Inspector に PlayerSettings が表示されるので、Settings for iOS の中の [Other Settings] を開き、[SDK Version]を[Simulator SDK]に変更。

![スクリーンショット 2014-05-01 16.54.01.png](https://qiita-image-store.s3.amazonaws.com/0/8219/e9e1bbd2-512b-4c8b-ad76-de995bdffdf8.png "スクリーンショット 2014-05-01 16.54.01.png")



その後、Build Settings の画面に戻り[Build]ボタンをクリック

XCodeプロジェクトの保存先を聞かれるので適当な場所を指定。


## Xcode 側

先ほどのビルドが完了すると、Xcodeでビルド可能なプロジェクトが生成されているので、.xcodeproj ファイルをダブルクリックしXcodeを開く。

ツールバー上にビルドターゲットが表示されているので、それが、シミュレータであることを確認


![スクリーンショット 2014-05-01 14.06.15.png](https://qiita-image-store.s3.amazonaws.com/0/8219/6b6c3c99-54a4-f388-9776-a947a49815ca.png "スクリーンショット 2014-05-01 14.06.15.png")

この状態で、メニューから[Product]-[Build]を選択。
正常にビルドが完了したら、[Product]-[Run]で実行。

# Androidシミュレータ向けビルド手順

## Unity側設定

### Android SDK の場所を指定

[Unity]-[Preferences] を開き、[External Tools] を選択し、Android SDK Location に Android SDK の場所を入力する。

![スクリーンショット 2014-05-01 16.55.03.png](https://qiita-image-store.s3.amazonaws.com/0/8219/627d6ecb-c018-3dcb-542e-2437904c6970.png "スクリーンショット 2014-05-01 16.55.03.png")


例）~/Development/adt/sdk

### ビルド

[File]-[Build Settings...] を開き、Platform で Android を選択し [Switch Platform] ボタンをクリック。

(数分待つ...)

[Build]ボタンをクリックすると apk ファイルの格納場所を聞いてくるので適当なフォルダを指定する。

## Android仮想デバイスへの.apkのインストール

以下のようにAndroid仮想デバイスマネージャを起動し、適当な仮想デバイスを起動する。

```
$ ~/Development/adt/sdk/tools/android avd
```

![スクリーンショット 2014-05-01 16.10.31.png](https://qiita-image-store.s3.amazonaws.com/0/8219/5b533b61-b639-a371-f32d-90ddc25c0411.png "スクリーンショット 2014-05-01 16.10.31.png")

仮想デバイスが起動したら、以下のように.apkファイルをインストールする。

```
$ ~/Development/adt/sdk/platform-tools/adb install hogehoge.apk
2163 KB/s (67235096 bytes in 30.347s)
        pkg: /data/local/tmp/hogehoge.apk
Success
```

しばらく待って "Success" とか出てきたらインストール完了。

## Androidインストール時のトラブルシュート

### Failure [INSTALL_FAILED_MEDIA_UNAVAILABLE]

と出てきたら、仮想デバイスマネージャから仮想デバイスのストレージ容量を増やす。

参考: [Android INSTALL_FAILED_MEDIA_UNAVAILABLE を更新しました -でじうぃき](http://onlineconsultant.jp/pukiwiki/)

### Failure [INSTALL_FAILED_CONTAINER_ERROR]

と出てきたら、Unity の Player Setting で、
 
![スクリーンショット 2014-05-01 16.42.15.png](https://qiita-image-store.s3.amazonaws.com/0/8219/ed028833-4683-f838-dcf1-78d3d9c21dfc.png "スクリーンショット 2014-05-01 16.42.15.png")

Install Location を "Automatic" に設定。

参考: [Failure [INSTALL_FAILED_CONTAINER_ERROR]](http://forum.unity3d.com/threads/210920-Failure-INSTALL_FAILED_CONTAINER_ERROR)
Express 事始め


express + mongoose


## Express

Shinatra / Flask / Laravel みたいな軽量系 Web Framework

... Laravelはちょっと違うかもだけどまぁそんな感じ。

MySpaceが使ってるっぽい。 http://expressjs.com/applications.html

## install

```shell
$ npm install -g express
```

## Project の作成

```shell
$ express --css stylus myapp 
$ tree myapp
myapp
├── app.js
├── node_modules
...
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       ├── style.css
│       └── style.styl
├── routes
│   ├── index.js
│   └── user.js
└── views
    ├── index.jade
    └── layout.jade
```

## アプリケーション構成

app.js がメインファイルになり、ここにルーティングを書く。

```app.js
/**
 * Module dependencies.
 */

// ライブラリの読み込み
var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

// ルーティングの設定
app.get('/', routes.index);
app.get('/users', user.list);

// サーバの起動
http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});
```

`app.get('/', routes.index);`の`routes`は`var routes = require('./routes');`で定義されており、`routes/index.js`を指していることになる？。`routes.index`は`routes/index.js`の`exports.index`メソッド？関数？を呼び出す？

`app.get('/users', user.list);`の`user`は、上記の`var user = require('./routes/user');`で定義されており、`routes/user.js`の`exports.list`メソッド？関数？が呼び出される。

## Controller と View

`routes/index.js`をみるとこんな感じ。

```index.js

/*
 * GET home page.
 */

exports.index = function(req, res){
  res.render('index', { title: 'Express' });
};
```

`res.render`メソッドで`views/`にあるテンプレファイルを読み込んで出力するみたい。

`res.render(file, kv)`: file にはファイル名（拡張子抜き）、kvでテンプレに渡す変数を設定するっぽい。

## View とか

標準では Jade というエンジンが動いてるっぽい。

Jade 文法はこんな感じ。

```view/index.jade
extends layout

block content
  h1= title
  p Welcome to #{title}
```

```view/layout.jade
doctype html
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    block content
```

インデントと関数っぽい要素の渡し方でHTMLを生成するっぽい

## Deploy

forever を使うのがいいっぽい

``` shell
$ pwd 
/path/to/myapp
$ forever start app.js
```

## 参考とか

- http://expressjs.com
- https://github.com/nodejitsu/forever
- http://blog.nodejitsu.com/keep-a-nodejs-server-up-with-forever/
ネット接続なしのLinuxへscipyをインストール


ソースコードをコピーすることは可能だが，ネット接続前提のインストール・ツールなどは使えないと仮定して，ソースからのインストール．

```python
$ python
Python 2.7.6 (default, May  1 2014, 11:34:02) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
```

のように，pythonのバージョンは 2.7.6．

## numpy
まずはnumpyからインストールする．

* numpy-1.8.1.tar.gz

をダウンロードしてくる．


```bash
$ tar xvzf numpy-1.8.1.tar.gz
$ cd numpy-1.8.1/
$ python setup.py build --fcompiler=gnu95
# python setup.py install
```

Fortranコンパイラとして， ``gfortran`` を指定したことになるらしい．
最後のインストールコマンドはsuper-user権限で行った．

```bash
$ python
>>> import numpy
```

とやって，エラーが出なければ問題ない．

## Cython
どうもCythonというものが必要なようなので，それをインストールしておく．

* Cython-0.20.1.zip

をダウンロードしてきて，コピーする．

```bash
$ unzip Cython-0.20.1.zip
$ cd Cython-0.20.1/
# python setup.py install
```

ここでも，最後のコマンドはsuper-user権限で行った．


## lapack
lapackも必要みたいだからインストールする．

make.incファイルの中をいくつか編集する．

```bash
FORTRAN= gfortran -m64 -fPIC
```

ここで，``-m64``は64ビットを，``-fPIC``はshared libraryを作るためには必要らしい．

```bash
$ make
```

最終的に，

```bash
# cp liblapack.a libtmglib.a /usr/local/lib/
```

のように， ``liblapack.a`` と ``libtmglib.a`` を手動コピーでインストール．

## scipy
以下のコマンドでインストールする．

```bash
# python setup.py install
```

以下のようにしてエラーが出なければインストールは上手くいったと思ってよい．

```python
>>> import scipy
```

### ImportError: libblas.so: cannot open shared object file: No such file or directory

```python
>>> import scipy.optimize
```

としたときに上記のようなエラーがでる場合は，ライブラリパス内にlibblas.soが見つからないことが原因と思われるので，

```bash
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
```

のように，`LD_LIBRARY_PATH`の値にlibblas.soへのパスを追加してやるとよい．




## matplotlib
以下のようにしてインストール．

```bash
$ tar xvzf matplotlib-1.3.1.tar.gz
$ cd matplotlib-1.3.1/
$ cp ../distribute-0.6.28.tar.gz ./
$ python setup.py build
# python setup.py install
```

distribute-0.6.28.tar.gz に依存しているようなので，それを matplotlib-1.3.1/ ディレクトリに置いておかなければならない．

他にも，nose, dateutil, pyparsing, six, tornado, backportsなどが依存関係で必要になった．
これらは，依存関係さえ解消されていれば，

```bash
# python setup.py install
```

でインストールできた．

## ipython

ipython-1.2.1.tar.gz をダウンロードして解凍および展開して，

```bash
# python setup.py install
```

でＯＫだった．
svnで特定のパスだけco

cd チェックアウト用のディレクトリ
svn co --depth empty ＜URL＞ .
svn up --set-depth infinity ./欲しいパス

このとき

svn up --set-depth infinity ./欲しいパス/さらにもう１階層

はできない。


svn up --set-depth empty ./欲しいパス

とか

svn up --set-depth immediates ./欲しいパス

とかしてから

svn up --set-depth infinity ./欲しいパス/さらにもう１階層

する。
CentOSでセキュリティを気にする

Red Hatが提供するパッケージのアップデートは3種類あります

RHSA (Red Hat Security Advisory) セキュリティ
RHBA (Red Hat Bug Fix Advisory) バグ
RHEA (Red Hat Enhancement Advisory) 機能強化など

この情報は下記のページなどで調べることができます
https://rhn.redhat.com/errata/rhel-server-6-errata.html

YUMでセキュリティに関するアップデートのみ更新する場合は --security オプションが便利です。
CentOSでは下記のYUMプラグインをインストールすると、セキュリティに関するRHSAパッケージのみアップデートすることができます。

`$ sudo yum install yum-plugin-security`

使い方はこんな感じでオプションを付けるだけです。

`$ sudo yum --security check-update`
`$ sudo yum --security update`

便利です
SailsのRoutes定義方法まとめ

Sailsバージョン：0.9.16

``config/routes.js``でroutesを定義する際、やり方がいろいろあったのでちょっとまとめてみる。

```js:config/routes.js
// /users => {method: get, controller: users, action: index} をいろんな方法で定義
module.exports.routes = {
  'get /users': {
    controller: 'users',
    action: 'index'
  },
  'get /users': {
    controller: 'UsersController',
    action: 'index'
  },
  '/users': { // メソッド指定を省略すると自動で"get"メソッドが設定される
    controller: 'users',
    action: 'index'
  },
  'get /users': 'users.index',
  'get /users': 'UsersController.index',
  'get /users': 'UsersController', // アクション指定を省略すると自動で"index"がアクションに設定される,
  'get /user*': { // wildcardで指定
    controller: 'users',
    action: 'index'
  }
};
```
SFTPサーバを用意する


**環境**
- Ubuntu 12.10 64bit

**要求**
- 専用のユーザを作成して、SFTP 接続のみ利用可能で、SSH 接続を許可しない。
- アップロード先のディレクトリだけアクセス可能にしたい。

[（参考）SSH（シェル）の制限かけてchrootの設定を有効にしたSFTPサーバを提供する方法](http://d.hatena.ne.jp/candinmarruh/20130226/p2)

-
**SFTP専用のユーザを作成してパスワードを設定する**

```bash
$ sudo useradd sftp-user
$ sudo passwd sftp-user 
```

**SFTP専用ユーザのホームディレクトリを /（rootディレクトリ）に設定する**
ChrootDirectory を使うと見かけ上ホームディレクトリは / になるため。

```bash
$ sudo usermod -d / sftp-user 
```

**実際にファイルを読み書きするディレクトリを作成する**

```bash
$ sudo chown root:root /home/
$ sudo mkdir /home/sftp-user
$ sudo chown root:root /home/sftp-user
$ sudo chmod 755 /home/sftp-user
```

**SFTP専用ユーザーのグループを作成する**

```bash
$ sudo groupadd sftponly
```

**SFTP専用ユーザーのグループを設定を変更する**

```bash
$ id sftp-user 
uid=1001(sftp-user) gid=1001(sftp-user) groups=1001(sftp-user)
```

```bash
$ sudo usermod -G sftponly sftp-user
```

```bash
$ id sftp-user 
uid=1001(sftp-user) gid=1001(sftp-user) groups=1001(sftp-user),1002(sftponly)
```

**sshd設定、internal-sftpを使用する**

```bash
$ sudo vim /etc/ssh/sshd_config 
```

/usr/lib/openssh/sftp-serverをコメントアウトし、 **internal-sftp** を追加する

```sshd_config
#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
```

**SFTP専用ユーザが読み書きするディレクトリを作成する**
下記の例では、接続すると test ディレクトリのみが表示されるようになる。

```bash
$ cd /home/sftp-user
$ sudo mkdir test
$ sudo chown sftp-user:sftp-user test
```

**SFTP専用ユーザをchrootに閉じ込める**

```bash
$ sudo vim /etc/ssh/sshd_config 
```

下記の設定を追加する。

```sshd_config
Match group sftponly
  ChrootDirectory /home/%u
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp
```

**sshdを再起動する**

```bash
$ sudo service sshd restart
```

-

**ssh（シェル）が実行できないことを確認する**

```bash
$ ssh sftp-user@123.45.67.890 
sftp-user@123.45.67.890's password: 
This service allows sftp connections only.
Connection to 123.45.67.890 closed.
```
Nokogiriによるスクレイピング(YahooFinance)

```rb
require 'open-uri'
require 'nokogiri'

#スクレイピング先のURL
url = 'http://finance.yahoo.com/q/cf?s=KO+Cash+Flow&annual'#米コカコーラ

charset = nil
html = open(url) do |f|
  charset = f.charset #文字種別を取得
  f.read #htmlを読み込んで変数htmlに渡す
end

#htmlをパース(解析)してオブジェクトを作成
doc = Nokogiri::HTML.parse(html, nil, charset)
#抽出したいデータノードを取り出す
mainNode = doc.css("table#yfncsumtab")
##ループの行が長くなるので代入
trs = mainNode.css('tr > td > table > tr > td > table > tr')

#抽出後のデータ格納
cashHash = trs.inject({}) do |hash, tr|
  
  ##tr.textが空文字列であれば次のループへ
  next hash if tr.text.empty?

  dataAry = tr.css('td').map do |td|
    #データ配列に追加
    data = td.text.gsub(/[\u00A0\n]/, '').strip
  end
  ##暫定的にdataAry[0]に突っ込んでいたkeyNmを取り出す
  keyNm = dataAry.shift
  #ハッシュに追加後にキーで取り出して使う予定
  hash[keyNm] = dataAry

  hash
end

#データ確認
cashHash.each do |key, value|
  puts "---------------------"
  puts key
  puts "---------------------"
  value.each do |data|
    puts data 
  end
end
```
Yahooのアカウントと連携する場合、ユーザ同意画面で「同意しない」ボタン押したら、Yahooのホームページに戻らせない方法

自分のサイトのユーザ登録時、Yahooのアカウントと連携することになりました。しかし、ユーザ同意画面で「同意しない」ボタンを押したら、Yahooのホームページに遷移してしまったのです。自分のサイト（一個前のユーザ登録画面）に遷移させたい場合はどうすれば良いですか？
ご回答よろしくお願いいたします。
Travs Proのプランを切り替えるには

プランの切り替えはメールを送る。

## 1. 問い合わせを送る

![Travis_CI_-_Hosted_Continuous_Integration_That_Just_Works.png](https://qiita-image-store.s3.amazonaws.com/0/42766/85b2861d-decc-7ca5-7a1f-da58f9489b94.png)

適当にメッセージを書く。

> We are planning to upgrade from Startup plan to Small Business plan. Could you tell me how can I do that?

## 2. Travisの人から返事が来る

> I can take care of the upgrade for you right now, if you'd like?

## 3. やっちゃってー！って返事する

> Yes. Please upgrade our plan!

## 4. 5個、並列でビルドされてるのを見て喜ぶ

![Travis_CI_-_Hosted_Continuous_Integration_That_Just_Works.png](https://qiita-image-store.s3.amazonaws.com/0/42766/4558ea9f-eb81-00d0-3bcf-93f6ad362623.png)
attr_changed?メソッドはfromとtoオプションで変化を指定できる

`#attr_changed?` メソッドでその属性が変化したかどうか知ることができますが、さらにfromとtoオプションを使うとその値の変化を明示的に指定できます。

例えば `Article` モデルがいて、public属性が `false` から `true` になったら `#publish` メソッドを実行したい場合はこんな感じで書くことができます。

```rb
class Article < ActiveRecord::Base
  after_update :publish, if: proc { public_changed? from: false, to: true }

  def publish
    # public属性がfalseからtrueになった時に実行される
  end
end
```

今まで律儀に

```rb
public_changed? && !public_was && self.public
```

みたいに書いてた...

### 参考

[ActiveModel::Dirty](http://api.rubyonrails.org/classes/ActiveModel/Dirty.html)
CoreDataのリレーションシップをNSValueTransfomerで擬似的に実現する

サーバーサイドに問い合わせてテーブルをJSONで取得しているとします。
データの例

```
Product
 id
 name
 typeId

Type
 id
 name
```
ProductのtypeIdはTypeのidを参照しています。

このデータをCoreDataに登録してCocoaBindingsでUIに表示するとしましょう。
通常はProductを登録するときにRelationを使用してtypeIdを差し替えると思います。（Typeの方も）

CoreData Entity

```
Product
 id
 name
 type <--> Type

Type
 id
 name
 products <--> Product
```
これでわかりますかね。ProductのtypeがRelationになっていて、Typeのインスタンスが登録されます。

ところがこれ登録するのが結構面倒です。

ですので、これをNSValueTransFormer を使って擬似的に実装します。

CoreData Entityは

```
Product
 id
 name
 typeId

Type
 id
 name
```

JSONをそのまま登録。


Typeのidをnameに変換するValue Transformerを作成。

```objc
@interface TypeTransformer : NSValueTransformer
@end
```

```objc
@implementation TypeTransformer
+ (void)load
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [NSValueTransformer setValueTransformer:[self new] forName:@"TypeTransformer"];
    });
}
- (id)transformedValue:(id)value
{
    if(![value isKindOfClass:[NSNumber class]]) return nil;
    
    NSManagedObjectContext *context; // ManagedObjectContextがここに入っているとします
    
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Type"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id = %@", value];
    [request setPredicate:predicate];
    NSArray *array = [context executeFetchRequest:request error:NULL];
    if([array count] == 0) return nil;
    
    return [array[0] valueForKey:@"name"];
}
@end
```

これで、CocoaBindingsのkeyPathにtypeIdを指定し、ValueTransformerにTypeTransformerを指定すれば、そのidのTypeのnameが取得（表示）できるようになります。

Typeに複数のカラムがある場合はその数だけNSValueTransformerを作成すればＯＫです。
PhotoAlbumにアクセス出来るか確認する


ALAssetsLibraryフレームワークから認可状態を取得できる（iOS 6.0以降）。

```objectivec
#import <AssetsLibrary/AssetsLibrary.h>

// 認可状態の取得
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];

if (status == ALAuthorizationStatusAuthorized) {
  // 認可されている
} else {
  // 認可されていない
}

```

`ALAssetsLibrary:authorizationStatus`は`ALAuthorizationStatus`を返すので、状態に応じてハンドリングをする。
iOS 7.1 SDKでの`ALAuthorizationStatus`の値は次のようになっている。

```objectivec
typedef NS_ENUM(NSInteger, ALAuthorizationStatus) {
    ALAuthorizationStatusNotDetermined = 0, // アプリで認可 / 拒否を行ったことがない
    ALAuthorizationStatusRestricted,        // ペアレンタル・コントロールやプロファイル定義によって制限されている。
    ALAuthorizationStatusDenied,            // 拒否。
    ALAuthorizationStatusAuthorized         // 認可済み。
} __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0);
```

----

参考。

* [Ask permission to access Camera Roll](http://stackoverflow.com/questions/13572220/ask-permission-to-access-camera-roll)
* [ALAssetsLibrary:authorizationStatus](https://developer.apple.com/library/ios/documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/Reference/Reference.html#//apple_ref/occ/clm/ALAssetsLibrary/authorizationStatus)
Mac OS X 起動時・スリープ復帰時にAFPボリュームを自動マウント

## Install terminal-notifier

```bash
$ brew install terminal-notifier
```

## Create Automator App which automatically mount afp volume

Automator enables a shell script to run silently.

![mount_all.app](https://qiita-image-store.s3.amazonaws.com/0/22048/28f6a62f-e8bb-0639-d7e1-8e9a27d37740.jpeg)

### Content of shell script

```bash
function mount_afp_volume()
{
	host=HOSTNAME_OR_IPADDRESS
	username=AFP_USERNAME
	password=AFP_PASSWORD
	mount_point=$1
	if [ ! -d /Volumes/$mount_point ]
	then
		mkdir -p /Volumes/$mount_point
		mount_afp afp://$username:$password@$host/$mount_point /Volumes/$mount_point
		/usr/local/bin/terminal-notifier -title "Mount" -message "/Volumes/"$mount_point" is now mounted." -sound Submarine
	fi
}

mount_afp_volume Data
mount_afp_volume TimeMachine
```

## Install SleepWatcher

http://www.bernhard-baehr.de/

```bash
$ brew install SleepWatcher
==> Downloading http://www.bernhard-baehr.de/sleepwatcher_2.2.tgz
######################################################################## 100.0%
==> mv ../sleepwatcher.8 .
==> make install PREFIX=/usr/local/Cellar/sleepwatcher/2.2
 .
 .
 .
$ /usr/local/sbin/sleepwatcher
$ sudo cp /usr/local/Cellar/sleepwatcher/2.2/de.bernhard-baehr.sleepwatcher-20compatibility.plist /Library/LaunchDaemons/de.bernhard-baehr.sleepwatcher.plist
$ launchctl load /Library/LaunchDaemons/de.bernhard-baehr.sleepwatcher.plist
$ cat /Library/LaunchDaemons/de.bernhard-baehr.sleepwatcher.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>de.bernhard-baehr.sleepwatcher</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/local/sbin/sleepwatcher</string>
		<string>-V</string>
		<string>-s /usr/local/etc/sleepwatcher/rc.sleep</string>
		<string>-w /usr/local/etc/sleepwatcher/rc.wakeup</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
	<key>KeepAlive</key>
	<true/>
</dict>
</plist>
$ sudo cat >> /usr/local/etc/sleepwatcher/rc.wakeup << EOF
# Mount AFP Volume
sleep 5
open -a /Users/gumob/Applications/mount_all.app

EOF
```
JQueryでの値の変更をJQeury上で検知するようにする


JQuery上でセレクタの値を変更するのはよくやると思いますが、それはJQueryのChangeイベントで検知されません。

```javascript:

//値をIDがhogeの値をtestに変更
$('#hoge').val('test'); 

//検知できない
$('on).change(function() {
	window.confirm('testにメソッドが変更されましたか？');
});

```

そんなときはchangeメソッドでイベント発生させちゃいます。

```javascript:

//値をIDがhogeの値をtestに変更してchangeイベントを発生させる
$('#hoge').val('test').change(); 

//検知できた
$('on).change(function() {
	window.confirm('testにメソッドが変更されましたか？');
});
```


参考記事を見てみると、triggerを使うのが今どきっぽいです。

[参考記事1](http://qiita.com/foo9/items/51ffdaa5305fbc4efa58)
[参考記事2](http://js.studio-kingdom.com/jquery/events/change)
[参考記事3](http://semooh.jp/jquery/api/events/trigger/type,+%5Bdata%5D/)
Marionette.jsで動的にitemViewContainerを切り替える

特定のイベントをCompositeViewで受け取ってitemViewContainerを切り替えたかったんだけど、itemViewContainerの値を変えるだけだと動かなかったのでちょっと調べた。

appendHtmlメソッドをオーバーライドすることで解決。

javascript - How to change item view container value according to collections in Marionette.CompositeView - Stack Overflow
http://stackoverflow.com/questions/18252951/how-to-change-item-view-container-value-according-to-collections-in-marionette-c
BacklogのタスクをSlackに通知する

# やりたいこと
backlogに新規タスクが追加されたら、slackに通知ポストする

# 使ったもの
xmlrpc
slack-notify

slackはclientはたくさんありますが、どれでやっても同じような感じだと思います

# サンプルコード

```rb
require 'xmlrpc/client'
require "slack-notify"

class BacklogClient
  BACKLOG_HOST = 'xxxxxxxx'
  BACKLOG_USER = 'user'
  BACKLOG_PASS = 'pass'

  def initialize
    @client = XMLRPC::Client.new(BACKLOG_HOST, '/XML-RPC', 443, nil, nil, BACKLOG_USER, BACKLOG_PASS, true, 60)
  end

  def projectlist
    @client.call('backlog.getProjects')
  end

  def issuelist(project_id)
    @client.call('backlog.findIssue', {"projectId" => project_id})
  end

end

class SlackClient
  SLACK_TEAM  = 'test'
  SLACK_ROOM  = '#hoge'
  SLACK_NAME  = 'backlog'
  SLACK_TOKEN = 'xxxxxxxxxxx'

  def initialize
    @client = SlackNotify::Client.new(SLACK_TEAM, SLACK_TOKEN, {
      channel: SLACK_ROOM,
      username: SLACK_NAME,
    })
  end

  def message(msg, room = nil)
    @client.notify(msg, room)
  end
end

last_sent_date = Time.now.strftime("%Y%m%d%H%M%S").to_i

backlog = BacklogClient.new
slack = SlackClient.new
while true
  begin
    projects = backlog.projectlist
    projects.each{|project|
      issues = backlog.issuelist(project["id"])
      issues.each{|issue|
        if last_sent_date < issue["updated_on"].to_i
          action = (issue["created_on"] == issue["updated_on"]) ? "created" : "updated"
          mes = "[" + project["name"] + "]" + issue['summary'] + "(" + issue['url'] + ") " + action
          slack.message(mes)
          last_sent_date = issue["updated_on"].to_i
        end
      }
    }
  rescue => e
    puts e.message
  end
  sleep(10.0)
end
```

あくまでもサンプルです。

# 参照

[こちらに続きます](http://qiita.com/masuyama/items/72160c496bb0f7edf471)
[Ruby on Rails]foremanを使ってrake taskを起動する方法

usageの説明がちょっと分かり辛いので備忘録・・

```lang:bash
foreman run rake tasknamespace:task
```

ついでにざっくりとforemanをインストールして使うまでメモ

```lang:Gemfile
gem 'foreman'
gem 'thin'
```

```lang:bash
bundle install
```

```lang:.env
PORT=3000
AWS_ACCESS=aaaaaa
AWS_SECRET=bbbbbb
```

```lang:Procfile
web:bundle exec thin start -p $PORT
```

```bash
foreman start
```
nginxでリバースプロキシ時のエラーページを設定する

nginxで`proxy_pass`を使った時、通常は`error_page`指定を無視してそのままのレスポンスを返す。

```nginx
server {
  listen 80;
  server_name somewhere;

  error_page 404 /notfound.html; # 見に行かない

  location /app/ {
    proxy_pass http://internal/app/;
  }
}
```

これをカスタマイズするためには、`proxy_intercept_errors on;` を追加する。

参照：http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors

```nginx
server {
  listen 80;
  server_name somewhere;

  error_page 404 /notfound.html; # 404の場合参照される。
  error_page 403 =404 /notfound.html; # 403の場合404に変換される。

  location /app/ {
    proxy_pass http://internal/app/;
    proxy_intercept_errors on;
  }
}
```
presentingViewControllerの寿命

ただの覚え書きです。

#log

```text
-[ModalViewController viewDidLoad] (null)
-[ModalViewController viewWillAppear:] <ViewController: 0x8d7ecd0>
-[ModalViewController viewWillLayoutSubviews] <ViewController: 0x8d7ecd0>
-[ModalViewController viewDidLayoutSubviews] <ViewController: 0x8d7ecd0>
-[ModalViewController viewDidAppear:] <ViewController: 0x8d7ecd0>
-[ModalViewController viewWillDisappear:] <ViewController: 0x8d7ecd0>
-[ModalViewController viewDidDisappear:] (null)
```

#ModalViewController

```objc
@implementation ModalViewController
#define LOG NSLog( @"%s %@", __PRETTY_FUNCTION__, self.presentingViewController )
- (void)viewDidLoad
{
  LOG;
  [super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated
{
  LOG;
  [super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
  LOG;
  [super viewDidAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated
{
  LOG;
  [super viewWillDisappear:animated];
}
-(void)viewDidDisappear:(BOOL)animated
{
  LOG;
  [super viewDidDisappear:animated];
}
-(void)viewWillLayoutSubviews
{
  LOG;
  [super viewWillLayoutSubviews];
}
-(void)viewDidLayoutSubviews
{
  LOG;
  [super viewDidLayoutSubviews];
}
@end
```
Git 特定のフォルダのみcloneする submodule編

[前回](http://qiita.com/icoxfog417/items/8b16681213d0fd33602c)Gitで特定フォルダのみクローンする方法を書いたが、これはsubmoduleの場合も使用可能。というか、submoduleの時にこそ使用する機会が多いだろう(dllだけ取るなど)。

ただ、ファイルを置く場所がちょっと異なる。submodule関連の設定は`.git/modules`配下にあるため、sparse-checkoutもこちらに置く必要があるのだ。

1.`git submodule add https://some/module.git somemodule`
2.`git commit -m "add module"`
3.`cd somemodule`
4.`git config core.sparsecheckout true`
5.`echo I_want/this_folder/ > ../.git/modules/somemodule/info/sparse-checkout`
6.`echo need/this_folder_too/ >> ../.git/modules/somemodule/info/sparse-checkout`
7.`git read-tree -mu HEAD`

2のcommitは、この段階でまだコミットが一回もないなら必要。最後の`read-tree`でHEADを読むため、一回はcommitしておかないとうまく動かない。

3以降の設定は、サブモジュールのフォルダ内で行う。sparse-checkoutで指定するのも、ルートからではなくサブモジュール内でのパスになる(上記でも、somemodule/I_want/this_folder/とはしていない)。

ポイントは5番で、modules配下にある各モジュールの設定に対しsparse-checkoutを書き込んでいる。追加するパスがさらにある場合は、6番(ファイルへの追記)を繰り返す。

これで、必要な部分だけ使いリポジトリを構成できて一安心。。。と思いきや、この設定(`.git`内の設定)はcommitして記録することができないので、チームで共有するということができない。つまり各人が上記のコマンドを打っていく必要があり、サブモジュールが多い場合めげるだろう。

この点についてはうまい方法がないか調査中。

＜参考＞
[How to use Git Submodules](http://kshmakov.org/notes/th/2/)