OmniAICreator/Qiita-1.07M huggingface dataset:
HerokuAppへのカスタムドメインの設定方法

### お名前ドットコムでドメインを取得してから設定する手順です。

####①ネームサーバを設定する。

1.ドメインNAVIを開く。
https://www.onamae.com/domain/navi/domain

2.DNS関連機能設定を押下して一覧を表示する。

3.対象の内部ドメインを選択して「次へ進む」を押下する。

4.DNSレコード設定を利用するの「設定する」を押下する。

5.入力欄のホスト名等に設定値を入力する。
※右横に画面が長いため、横にスクロールして見ないと一見して入力欄がひとつしか無いと思ってしまうので要注意！

入力例：
ホスト名＝NAME：www
TYPE：CNAME
TTL：3600（デフォルト）
VALUE：[アプリケーション名].herokuapp.com

6.追加ボタンを押下する。

7.登録済み欄に入力値が登録されたことを確認する。

8.確認画面へ進むを押下して登録完了。

####②Herokuへ登録する

1.ドメイン追加
 ```
 heroku domains:add www.ドメイン名.xxx
 ```
コマンド実行結果
 ```
Adding www.ドメイン名.xxx to [アプリケーション名]... done
 ```

####③その他
facebookアプリとして連携をログイン認証を実装している場合は、
URL登録をし直す必要があります。

以上

####【参考情報】
プロフェッショナルのための 実践Heroku入門 プラットフォーム・クラウドを活用したアプリケーション開発と運用 (書籍) P.112-114
http://www.amazon.co.jp/dp/4048915134
Clojure × Scala （さいきょうタッグの連携技）

なんと Clojure から Scala で書いたコードも使えるようで、試してみました。

# 使用するもの
- [lein-scalac](https://github.com/tomwans/lein-scalac)

# ディレクトリ構成
![スクリーンショット 2014-10-04 13.19.44.png](https://qiita-image-store.s3.amazonaws.com/0/39243/94cbdba8-3eb7-ad46-e7c8-e888fc493679.png)

# 試してみる

## 下準備

- dependencies に scala のライブラリを指定します。
- plugins を書きます。
- scala-source-path を書きます。  
（今回はscalaというディレクトリに.scalaをおいているので scala を指定してやります。）
- scalaのバージョンを指定します。  
ライブラリに2.10.3を指定しているので、ここも2.10.3を指定します。
- pre-tasks を設定します。  
（こうすることでいちいち lein scalac と叩かなくて済みます。）

```clj:project.clj
(defproject scala-clj "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [org.scala-lang/scala-library "2.10.3"]]
  :plugins [[io.tomw/lein-scalac "0.1.2"]]
  :scala-source-path "scala"
  :scala-version "2.10.3"
  :prep-tasks ["scalac"]
  :main scala-clj.core)
```

## Scala のコードを記述
みんなscala書けるでしょ？
clojureに比べれば俄然理解は簡単なので、説明は省きます。
（説明するまでもないくらい簡単なコードですしお寿司）

```scala:Main.scala
object Main {
 def clojure(txt: String) = {
   println("hello Scala World> txt is " + txt)
 }
}
```

## Clojure から Scala の呼び出し

```clj:core.clj
(ns scala-clj.core)

(defn -main []
  (Main/clojure "clojure"))
```

実行結果

```csh
$ lein run
Element '/Users/秘密♥/秘密♥/scala-clj/dev-resources' does not exist.
hello Scala World> txt is clojure
```
なんか/dev-resourcesとか言われてますが、無視。

# 終わりに
実に簡単です。

「Clojureで書きました！」とか言って、表面だけClojureで書いてあとは全部Scalaで書いても嘘じゃない！

Clojureなんて書かんくてよかったんや！！！黙ってみんなScala使ったらええんや！！！（違う
PHP7調査(3)整数キャストとシフトの仕様整理

PHP7に採用される予定の修正のうち、次のRFCの内容を紹介します。

https://wiki.php.net/rfc/integer_semantics

## 修正その1

浮動小数点数のNaN、INF、-INFの3つを整数にキャストすると今までは環境依存だったのが（Cの仕様としてキャスト結果が不定）、PHP7から0になるようになりました。

```php
<?php
var_dump((int)INF); // PHP7からはint(0)
```

誰得な変更ですね。

## 修正その2

負の右シフト・左シフトが禁止されました。

```php
<?php
var_dump(4<<-1);
```

実行すると次のようにWarningが出てfalseが返ってきます。

```
PHP Warning:  Bit shift by negative number in /private/tmp/foo.php on line 2
bool(false)
```

Cでも結果は不定になるはずなので、今まで認められていたのが少し変だったと言えます。とはいえ、今まで動いていたコードが動かなくなることがあるかもしれません。

## 修正その3

整数のビット幅を超える数のシフト結果は0（負の数に対する右シフトの場合だけ-1）になります。

```php
<?php
var_dump(4<<64); // PHP7ではint(0)
```

Intel系CPUではシフト幅の指定がビット幅を超えた場合には「回り込み」が起こるようです。つまり、65bitシフトを指定すると1bitシフトの意味になるそうです。しかし、これはCPU依存の挙動なので修正したということのようです。
InDesign を JavaScript で自動化する

Adobe InDesign (Photoshop や Illustrator も含む一式) は JavaScript を使って自動化できる。ExtendedScript と呼ぶそうな。

(Mac 版だと AppleScript、Windows 版だと VBScript も使える。未確認)


要るもの
--------
 * Adobe InDesign
 * [Adobe ExtendedScript Toolkit](https://creative.adobe.com/ja/products/estk) …標準ではインストールされないので、要ダウンロード。([CS5〜CS1向けのはここ](http://www.adobe.com/devnet/scripting/estk.html)、[CS6向けのはここ](http://www.adobe.com/devnet/scripting.html))
 * 知識
   * JavaScript (ECMA-262, Edition 3 相当) の知識
   * DTP の知識 (InDesign)


資料
----

 * [Adobe 公式ドキュメント一式](http://www.adobe.com/devnet/indesign/documentation.html) (一通りダウンロードしておくと良い)
   * [Adobe InDesign CS6 スクリプティングガイド:JavaScript]( :http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/indesign/sdk/cs6/scripting/InDesign_ScriptingGuide_JS_JP.pdf)
   * [Adobe InDesing CS6 スクリプティングチュートリアル](http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/indesign/sdk/cs6/scripting/InDesign_ScriptingGuide_JS_JP.pdf)
   * 日本語版の翻訳の品質がアレだと思った人は、英語版をどうぞ
 * [InDesign CS6自動化作戦 with JavaScript](http://www.openspc2.org/book/InDesignCS6/) (リファレンス的に使える)
 * [InDesign Object Model について](http://www15.ocn.ne.jp/~preopen/dom_about.html)
 * [Adobe InDesign CS6 (8.0) Object Model](http://jongware.mit.edu/idcs6js/)

プログラマから見るとたいへん拙い感じのするコードが多くて残念な感じがする。グローバル変数をいっぱい使ってたりとか……。

デバッガ
---------

ExtendedScript Toolkit 上で動作させることでブレークポイントデバッグができる。ブレークポイントはコード上に

```
$.bp();
````

と書いて仕掛ける。


コンソールへの出力
--------------

```
$.write("hogehoge");
$.writeln("hogehoge");
```


高速化
------

「スクリプト」パネルのメニューから「再描画を有効にする」をオフにする。これで20%くらい早くなる。

「取り消す」機能を無効にしてさらに高速化できる (20%くらい)。

```
var main = function() {
  // ここにプログラムを記述
}

app.doScript(main, ScriptLanguage.javascript, [], UndoModes.fastEntireScript);

```

JavaScript の処理系があまり賢くないので、古典的な最適化手法が意外に効くのでバカにできない。手元のコードで以下の最適化をしたら1割くらい早くなった。

```
// Before
for(var i = 0; i < doc.pages.length; i++) {
}

// After
var pages_total = doc.pages.length;
for(var i = 0; i < pages_total; i++) {
}
```

```
// 遅い (変数 'a' の探索のせい)
var a = 1;
var hoge = function() {
  return a + 1;
}
hoge();

// 早い
var a = 1;
var hoge = function(a) {
  return a + 1
}
hoge(a);
```

ExtendedScript Toolkit を使ってコンパイルするとさらに早くなるかもしれないが、デバッグが面倒になるので私は使ってない。
ReorderableList を使ってインスペクタ上でリストや配列の順番を変更する


`ReorderableList`を使うと、Unity組込みのインスペクタでよくあるこんな感じのUIを独自のクラスに適用することができます。

![スクリーンショット 2014-10-04 12.28.13.png](https://qiita-image-store.s3.amazonaws.com/0/8219/0c71672a-797f-0eb0-5df2-f932b03cfbe9.png "スクリーンショット 2014-10-04 12.28.13.png")

例えば、以下のようなクラスが定義されていて、`HogeList` というプロパティをインスペクタ上で順番変更したいとする

```csharp:Hoge.cs
public class Hoge : MonoBehaviour {
	public List<string> HogeList;

	// ... snip ...
}
```


以下のようにカスタムエディタを定義する

```csharp:HogeEditor.cs
using UnityEditor;
using UnityEditorInternal;

[CustomEditor(typeof(Hoge))]
public class HogeEditor : Editor {

	ReorderableList m_list;
	
	void OnEnable() {
		m_list = new ReorderableList (
			serializedObject,
			serializedObject.FindPropertyRelative("HogeList")
		);
	}

	// 変更可能なリストを表示
	public override void OnInspectorGUI () {
		// とりあえず元のプロパティ表示はしておく
		DrawDefaultInspector();

		serializedObject.Update ();

		// リスト・配列の変更可能なリストの表示
		m_list.DoLayoutList();

		serializedObject.ApplyModifiedProperties();
    }

```

以上が最低限の実装

ヘッダの文字を変更するには、`OnEnable()`に以下を追加

```csharp:HogeEditor(1).cs
	m_list.drawHeaderCallback = (rect) => {
		EditorGUI.LabelField(rect, "ほげほげ一覧");
	};
```

リストの個々の要素の描画内容を変更するには以下を追加

```csharp:HogeEditor(2).cs
	m_list.drawElementCallback = (rect, index, isActive, isFocused) => {
		var motion = m_motionsList.serializedProperty.GetArrayElementAtIndex(index);
		var displayName = string.Format ("{0} : {1}",
			motion.FindPropertyRelative("Name").intValue,
			motion.FindPropertyRelative("Age").stringValue
		);
		EditorGUI.LabelField(rect, displayName);
	};
```

# Tips

## 1行の高さを変更する

```csharp
// 2行分の高さに設定する
m_list.elementHeight = EditorGUIUtility.singleLineHeight * 2;
```

## drawElementCallback の中で配列の要素にアクセスする

```csharp
// callbackが呼び出されるときに渡される index を使って配列の要素を取得
var element = m_list.serializedProperty.GetArrayElementAtIndex(index);
// 配列の要素の"Name"プロパティの値を取得
var name = element.FindPropertyRelative("Word");
// ラベルを描画
EditorGUI.LabelField(rect, string.Format ("{0}:{1}", index, name.stringValue));
```


# 参考

* [Unity: make your lists functional with ReorderableList](http://va.lent.in/unity-make-your-lists-functional-with-reorderablelist/)
* [rotorz / Reorderable List Editor Field for Unity — Bitbucket](https://bitbucket.org/rotorz/reorderable-list-editor-field-for-unity)
* [Interesting things in Unity 4.5 you probably didn't know about](http://va.lent.in/interesting-things-in-unity-4-5-you-probably-didnt-know-about/)
* [array inspector reordering - Unity Answers](http://answers.unity3d.com/questions/32275/array-inspector-reordering.html)
今日放送のアニメをメールで送る

# 使用したもの
- メール送信
    - [postal](https://github.com/drewr/postal)

- アニメの放送情報
    - [アニメマップ](http://animemap.net/pages/api/)

- json パース
    - [data.json](https://github.com/clojure/data.json)

# ソースコード
```clj:project.clj
(defproject animemap-clj "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [org.clojure/data.json "0.2.5"]
                 [com.draines/postal "1.11.1"]]
  :main animemap-clj.core)
```

```clj:core.clj

(ns animemap-clj.core
  (:require [clojure.data.json :as json]
            [postal.core :as postal]))

(def anime (slurp "http://animemap.net/api/table/tokyo.json"))
(def anime-map (:item (:response (json/read-str anime :key-fn keyword))))
(def today (filter #(= (:today %) "1") anime-map))

(defn make-email-txt [source]
  (str "[title] " (:title source)
       " [time] " (:time source)
       "\n"))

(defn send-email [subject txt]
  (postal/send-message {:host "smtp.gmail.com"
                 :user "<username>"
                 :pass "<password>"
                 :ssl :yes}
                {:from "<from address>"
                 :to "<to address>"
                 :subject subject
                 :body txt})
  {:code 0, :error :SUCCESS, :message "message sent"})

(def body (map #(make-email-txt %) today))

(defn -main []
  (send-email "今日のアニメ" (apply str body)))

```

# 感想

data.json を使えば簡単にjsonの内容を取得できるし、メール送信もpostalで簡単に出来ていいですね。
開いたモーダルダイアログを全部閉じる


セットアップなんかで次々とウィザードっぽくダイアログを開く時があると思いますが、最後の画面で、今まで開いたダイアログを全部閉じたい場合があると思います。UI上良い、悪いというのはこの際省きます。

	HogeViewController *viewController = [[HogeViewController alloc] initWithNibName:@"HogeViewController" bundle:nil];
			
	UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];
    [self presentViewController:nav animated:YES completion:^{
		}
	];

こんな感じで、次々と開きますよね。
今まではdelegateかなんかで覚えておいて、一つ前のViewControllerのクラスを呼び出して

    [self dismissViewControllerAnimated:NO completion:NULL];

とかやっていたんですが、下の階層に遡っていってしまってうまく全部閉じれないんですね。
そんなときは、下記のコード一発で全部閉じれちゃいます。

    [[UIApplication sharedApplication].delegate.window.rootViewController dismissViewControllerAnimated:YES completion:nil];

ううむ、もっとはやく知っていればもっとスッキリかけたのに、、
というわけで書き直し中。
Aura.Filter クロージャを使ったカスタムバリデーション


汎用バリデーションライブラリとして Aura.Filter を使います。
https://github.com/auraphp/Aura.Filter#creating-and-using-custom-rules

## Composer でインストール

```composer.json
{
    "require": {
        "aura/filter": "~1.0"
    }
}
```

インストールします。

```
$ composer install
```

## クロージャを使ったカスタムバリデーション

Aura.Filter でクロージャを使ったカスタムバリデーションを実装します。

Aura\Filter\RuleCollection クラスの `setRule` メソッドで、バリデーションルールを設定します。引数は、先頭から順に、対象フィールド名、エラーメッセージ、バリデーションルールとなります。バリデーションルールでは、引数の値がルールに適合すれば `true` 、それでなければ `false` を返します。

`values` メソッドで、バリデーションを実行します。全てのルールに適合すれば `true` 、そうでなければ `false` を返します。

```aura.php
<?php
require_once __DIR__ . '/vendor/autoload.php';

$filter = (new \Aura\Filter\FilterFactory())->newInstance();

$filter->setRule(
    'foo',
    'エラー！！',
    function($data) {
        return $data === 'ok';
    }
);

$inputs = [
    'foo' => 'ng',
];

if ($filter->values($inputs) !== true) {
    print_r($filter->getMessages());
} else {
    echo 'valid' . PHP_EOL;
}
```

実行すると下記のようになります。

```bash
$ php aura.php
Array
(
    [foo] => Array
        (
            [0] => エラー！！
        )

)
```
lazy-seq を string に変換

lazy-seq を 文字列に変換したくなった

でも、単純に `(str lazy-seq)` としてもうまくいかない

じゃあ、どうするか

`(apply str lazy-seq)`

としてやればいいらしい

もしくは

`(reduce str lazy-seq)`


でもいけるっていうね

http://clojuredocs.org/clojure.core/apply

apply は シーケンスから取り出して適用っていう感じの理解でいいんですかね？
HackerNewsで話題になったアジャイル専用プロジェクトマネジメントツールTAIGAを勝手に導入してみた


開発プロセスはアジャイルだけどマネジメントツールはRedmineという方は特に知っておいた方が良さそうです。

# TAIGAってなに？

TAIGAと聞いて真っ先にトラどらが思い浮かんだあなたとは友達になれる気がしますが、トラどらではありません。

詳しくは下記にあります。

https://taiga.io/

Public Projectなら無料で上のサイトでも使えます。

TAIGAとはアジャイルに最適化されたマネジメントツールです。

バックログ、スプリント、バーンチャート、かんばんなどの機能がそろっているのですが、
なにより他のツールに比べて圧倒的にデザインがきれい。

<span style="color:red;">ただし、まだベータ版です</span>

# AWSに構築する

## 1, AWSのインスタンスを立ち上げる

ざっくりいうと<span style="color:red;">Ubuntu</span>のインスタンスを立ち上げて、Security GroupsにHTTPを追加、Elastic IPを設定まで行います。

## 2, TAIGAを立ち上げる

sshでログイン後、下記のようにgitをインストールしてスクリプトを落として叩くだけで設定完了です。

```
# gitのinstall
$ sudo apt-get install git

# Taigaioのセットアップ
$ git clone https://github.com/taigaio/taiga-scripts.git
$ cd taiga-scripts
$ bash setup-server.sh

# httpでいいのか聞かれるのでEnter
Scheme (default http): 
# Hostnameを聞かれる
Hostname (default: localhost:8000): (とりあえずElastic IPに設定したIPを入力)
```

たったこれだけで設定完了です。

設定したIPにアクセスすると、無事ログイン画面！！！

<img src="https://qiita-image-store.s3.amazonaws.com/0/47114/d7c9de71-ac98-2199-53c5-56802c39eda9.png" width=300 />

## 3, ログインする

<span style="color:red;">初期ユーザ名は admin、パスワードは 123123 となっています。</span>

## 4, あとは使ってみるだけ！

なんかめっちゃきれい！

<img src="https://qiita-image-store.s3.amazonaws.com/0/47114/96125327-76e4-bfe2-0bd1-55640503cfe9.png" width=500 />

<img src="https://qiita-image-store.s3.amazonaws.com/0/47114/9516bb39-569e-55bf-8816-a843e57868d3.png" width=300 />

以上で構築は完了です！

## 5, なんだかよくわからないバグ？

・Emailが届かない。

解決次第、追記します！
Cisco ACL用syntax hilightingを使ってみた

* [Cisco ACL syntax highlighting rules - provides highlighting for files with Cisco ACLs : vim online](http://www.vim.org/scripts/script.php?script_id=1141)を入れる。


```vim:~/.vimrc
augroup filetype 
        au! BufRead,BufNewFile *.acl        set filetype=ciscoacl 
augroup END
```

拡張子.aclのファイルを開くと色がついたがそこまで行けるものではない。
Unityアプリからソーシャルメディアと連携する



情報収集中...


LINE/Twitter/Facebook

* [anchan828/social-connector](https://github.com/anchan828/social-connector)

* [Unity から各種 SNS へ共有を行う SocialConnector | Lonely Mobiler](http://loumo.jp/wp/archive/20140619084536/)

* [Unityでお手軽にTwitter・Line投稿機能をつくる - タカシカンパニーブログ](http://takashicompany.hatenablog.com/entry/2014/06/19/031810)


Mail

* [Sending Mobile Email via Unity - Unity Answers](http://answers.unity3d.com/questions/63412/sending-mobile-email-via-unity.html)

* [E-mailのエスケープについて　Unity - 万年素人からGeekへの道](http://d.hatena.ne.jp/shinriyo/20130213/p2)

* [Unityで日本語メール - 万年素人からGeekへの道](http://d.hatena.ne.jp/shinriyo/20120618/p3)

* [How do I send an email on IOS using Application.OpenURL with more than one line of body text? - Unity Answers](http://answers.unity3d.com/questions/358635/how-do-i-send-an-email-on-ios-using-applicationope.html)


Apple App Store review page

* [Unity3D:アプリのレビューページを直接開く - devlog [naru design]](http://narudesign.com/devlog/unity-open-app-review-page/)

* [iphone - iTunes review URL and iOS 7 (ask user to rate our app) AppStore show a blank page - Stack Overflow](http://stackoverflow.com/questions/18905686/itunes-review-url-and-ios-7-ask-user-to-rate-our-app-appstore-show-a-blank-pag)


Google Play store

* [playgameservices/play-games-plugin-for-unity](https://github.com/playgameservices/play-games-plugin-for-unity)

* [Google Play link in GAME | Unity Community](http://forum.unity3d.com/threads/google-play-link-in-game.140993/)
ARGV と gets を併用


参考： [ARGVとgetsの併用 - ぽひゅっとメモ](http://d.hatena.ne.jp/fre_oik/20110616/1308221136)

STDIN#gets を使うと良い

```
flag = (ARGV[0] == '--hoge')
while line = STDIN.gets
   #  ....
end
```
CullingMask が特定のレイヤーを対象としているか判定する


```
// Layer 18 を表すビットフラグ
var layer = 1 << 18;

// カメラのcullingMaskとビットフラグのビット演算の結果0以外かどうかで判定
if ((layer & camera.cullingMask) != 0) {
  Debug.Log("対象");
}

```
AWS CLIを使ってEC2インスタンスの情報を取得する


## はじめに

AWS CLIの __ec2 describe-instances__ コマンドを使用してインスタンスの情報を取得する方法を記述します。

## 環境

* Amazon Linux AMI release 2014.03
* aws-cli 1.4.4
* jq 1.4

## AWS CLIの設定

```shell
$ aws configure
```

※ 「AWS Access Key ID」「AWS Secret Access Key」「Default region name」「Default output format」を指定しておきます。

## AWS CLIでEC2インスタンスの情報を取得する

* リージョン内で稼働している全インスタンスの情報を取得する場合

```shell
$ aws ec2 describe-instances
```

* インスタンスIDを指定して取得する場合

```shell
$ aws ec2 describe-instances --instance-ids ${instance-id}
```

複数指定する場合はインスタンスIDをスペースで区切ります。

```shell
$ aws ec2 describe-instances --instance-ids ${instance-id} ${instance-id-2} ${instance-id-3}
```

* インスタンスの状態が「running」のもののみ取得する場合

```shell
$ aws ec2 describe-instances --filter "Name=instance-state-name,Values=running"
```

runningのほかには、「pending」「shutting-down」「terminated」「stopping」「stopped」を指定することができます。

* 特定のインスタンスタイプのインスタンスの情報を取得する場合

```shell
$ aws ec2 describe-instances --filter "Name=instance-type,Values=m3.xlarge"
```

上記の場合は、インスタンスタイプが「m3.xlarge」のインスタンスの一覧を取得できます。

* 複数の条件を指定する場合

```shell
$ aws ec2 describe-instances --filter "Name=instance-state-name,Values=running" "Name=instance-type,Values=m3.xlarge"
```

filterに複数の条件をスペース区切りで指定します。


* タグを条件に指定する場合

```shell
$ aws ec2 describe-instances --filter "Name=tag:Name,Values=web001"
```

上記の場合は、タグ 「Key : Name, Value : web001」のインスタンスの情報を取得します。


## 取得するインスタンスの情報を絞りこむ

describe-instancesコマンドにより取得したインスタンス情報をjqコマンドでさらにしぼりこみます。

* jqコマンドのインストール

```shell
$ sudo yum install jq
```

* インスタンスIDのみ取得する場合

```shell
$ aws ec2 describe-instances | jq '.Reservations[].Instances[].InstanceId'
```

* インスタンスID、インスタンスタイプ、プライベートIPを取得する場合

```
$ aws ec2 describe-instances | jq '.Reservations[].Instances[] | {InstanceId, InstanceType, PrivateIpAddress}'
```

* インスタンスID、プライベートIP、タグ名(Key=Name)を取得する場合

```
$ aws ec2 describe-instances | jq '.Reservations[].Instances[] | {InstanceId, PrivateIpAddress, InstanceName: (.Tags[] | select(.Key=="Name").Value)}'
```

## 参考

* [aws - AWS CLI 1.4.2 documentation](http://docs.aws.amazon.com/cli/latest/reference/)
* [describe-instances - AWS CLI 1.4.2 documentation](http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)
* [AWS CLIのフィルターとクエリーの使い方についてまとめてみた ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/aws-cli-filter-and-query-howto/)
* [jq](http://stedolan.github.io/jq/)
* [軽量JSONパーサー『jq』のドキュメント：『jq Manual』をざっくり日本語訳してみました ｜ Developers.IO](http://dev.classmethod.jp/tool/jq-manual-japanese-translation-roughly/)
OS X の pryで `reverse-i-search`が使えない時の対処法

`readline`が`libedit`っライブラリに置き換えられたらしい。

`libedit`の設定は `~/.editrc`で行うとのこと。

```~/.editrc
bind "^R" em-inc-search-prev
bind "^S" em-inc-search-next
```

でOK。

### 参考

<a href="http://stackoverflow.com/questions/26159564/cant-call-history-search-in-pry/26163108#26163108">ruby - Can&apos;t call history search in pry - Stack Overflow</a>
Start-Processで実行すると$MyInvocationがnullになる

情報を探すのに苦労したので、ココにメモ。
##概要
`Start-Process`で`$MyInvocation`を使用しているスクリプトを実行すると、`$MyInvocation`がnullになる。
スクリプトを実行 ＆ 戻り値取得 ＆ 実行スクリプト内でスクリプト自身のパス取得、をやろうとするとハマる。

Power Shell v3.0で確認。参照元情報ではPower Shell v2.0で確認。
##発生例
`Script2.ps1`はスクリプトのパス取得に`$MyInvocation`を使用しており、`Script1.ps1`から`Script2.ps1`を`Start-Job`で実行する。

``` lang:Script1.ps1
function PSScriptRoot { $MyInvocation.ScriptName | Split-Path }
 	
$job = Start-Job -FilePath "$(PSScriptRoot)\Script2.ps1"
$job | Wait-Job | Receive-Job

```
``` lang:Script2.ps1

function PSScriptRoot { $MyInvocation.ScriptName | Split-Path }
Trap { throw $_ }
"Invoking Script2.ps1"
```

`Script1.ps1`を実行すると、エラーになる。

```
Receive-Job : Cannot bind argument to parameter 'Path' because it is an empty string.
At C:\dev\Script1.ps1:4 char:30
+ $job | Wait-Job | Receive-Job <<<<
    + CategoryInfo          : InvalidData: (:String) [Split-Path], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.SplitPathCommand
```

`Script2.ps1`の`$MyInvocation.ScriptName`がnullになっている。
スコープがはずれてしまう。

##対処法
ScriptBlockを作成した上で呼び出す。

```lang:分かりやすくと
$script2 = "$(PSScriptRoot)\Script2.ps1"
$scriptBlock = [ScriptBlock]::Create($script2)
$job = Start-Job -ScriptBlock $scriptBlock
$job | Wait-Job | Receive-Job
```
```lang:実際はこんな感じで
$job = Start-Job -ScriptBlock ([ScriptBlock]::Create("$(PSScriptRoot)\Script2.ps1"))
$job | Wait-Job | Receive-Job
```

・・・こんなの絶対わかんねぇよ(；´Д`)

##参照元
* [PowerShell Start-Job WTF](http://mnaoumov.wordpress.com/2014/06/21/powershell-start-job-wtf/)
ブラウザからjsの配列をcsvとしてダウンロードする。



### 準備

以下を開発者ツールなどのコンソールで実行。

```js
var downloadCsv = (function() {

    var tableToCsvString = function(table) {
        var str = '\uFEFF';
        for (var i = 0, imax = table.length - 1; i <= imax; ++i) {
            var row = table[i];
            for (var j = 0, jmax = row.length - 1; j <= jmax; ++j) {
                str += '"' + row[j].replace('"', '""') + '"';
                if (j !== jmax) {
                    str += ',';
                }
            }
            str += '\n';
        }
        return str;
    };

    var createDataUriFromString = function(str) {
        return 'data:text/csv,' + encodeURIComponent(str);
    }

    var downloadDataUri = function(uri, filename) {
        var link = document.createElement('a');
        link.download = filename;
        link.href = uri;
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    };

    return function(table, filename) {
        if (!filename) {
            filename = 'output.csv';
        }
        var uri = createDataUriFromString(tableToCsvString(table));
        downloadDataUri(uri, filename);
    };

})();
```

### 使い方

```js
var table = [['あ', 'い'], ['a', 'i']];
downloadCsv(table);
```

### 結果

```csv
"あ","い"
"a","i"
```

## 注意点

* ~~文字列をbase64でエンコードするbtoaがマルチバイト対応していないため、日本語の文字列は非対応です。~~(mpywさんに修正していだきました）
* 2次元配列以外は考慮していません。
* IE非対応
RustでOpenGLをやる

# Cargo.tomlに以下を追加するだけ

嘘です。コード書かないといけません。

```
[dependencies.gl]
git = "https://github.com/bjz/gl-rs"

[dependencies.glfw]
git = "https://github.com/bjz/glfw-rs.git"
```

あとは、gl-rsのexamplesを眺めながらゴリゴリ書けばOKです。


# 関連記事
- [RustでOpenGLやGLSLやる準備](http://abrakatabura.hatenablog.com/entry/2014/10/04/080151)
- [RustでWebカメラの映像をコマンドプロンプトに出すコマンドを作った](http://abrakatabura.hatenablog.com/entry/2017/09/21/064630)
PackerでDebian7.6 (Wheezy)のbox作った

* [my-packer-template-files / wheezy](https://github.com/tukiyo/my-packer-template-files/tree/master/wheezy)

# 使い方

```bash:
git clone https://github.com/tukiyo/my-packer-template-files.git
cd my-packer-template-files/wheezy
sh iso_download.sh
packer build wheezy-amd64.json
```

* debian-amd64_virtualbox.box が作成されます。

# ビルド済みbox

* [debian-amd64_virtualbox.box](https://www.dropbox.com/s/esz7ouliip2324r/debian-amd64_virtualbox.box?dl=0)
MakeSlice と CanAddr


# つまったこと

ORMとかで引数にmapやsliceのポインタをinterface{}で受け付ける関数(Findなど)がある
⬇みたいなイメージ

``` go
results := make([]Users, 0, 16)
repository.Find(condition, &results)
```

reflect.Typeを使って、型を変えればデータ取得処理を使い回せる仕組みを実装しようとおもったら
reflect.MakeSliceで作ったSliceはCanAddr()がfalseになってしまうので、Addr()がつかえない
(中でappendとかされっかんね

## samplse

``` go
package main

import "fmt"
import "reflect"


type User struct{}

func main() {

	userType := reflect.TypeOf(User{})

	userSlice := reflect.MakeSlice(reflect.SliceOf(userType), 0, 16)
	
	fmt.Printf("%#v\n", userSlice.CanAddr())
	// Output: false

	// panic !	
	//fmt.Printf("%#v\n", userSlice.Addr())
}
```
http://play.golang.org/p/e1kUfIzaAS


# 対応

ポインタを別途つくってやればよかった
reflectで操作をしていると、まだこの辺が混乱する

## sample

``` go
package main

import "fmt"
import "reflect"


type User struct{}

func main() {

	userType := reflect.TypeOf(User{})

	userSlice := reflect.MakeSlice(reflect.SliceOf(userType), 0, 16)
	
	userSlicePointer := reflect.New(userSlice.Type())
	
	userSlicePointer.Elem().Set(userSlice)
	
	fmt.Printf("%#v\n", userSlicePointer.Interface())
	// Output: &[]main.User{}
}
```
http://play.golang.org/p/XSbRpsnE3d


# チラ裏

reflectを多用すると、なぜか後ろめたい
眠いときは寝た方が良い

あえて…
＿人人人人人＿
＞ 寝るっ!! ＜
￣^Y^Y^Y^Y^￣
ESX/ESXiのrootパスワードを忘れた時の対処

## 概要

VMware ESX/ESXiのrootパスワードを忘れた場合、ESXではシングルユーザーモードで変更が可能。ESXiでは、再インストールが唯一の対応方法になる。

## 詳細

VMware ESX/ESXiのrootパスワードを忘れた場合の対処方法は「[VMware KB: Changing a forgotten root password on an ESX/ESXi host (1317898)](http://kb.vmware.com/kb/1317898)」にまとめられている。大まかに言えば、下記の対処になる。

* ESXi 3.5.x～5.5.xでは、再インストールが唯一の対応方法。
* ESX 2.x～4.xでは、シングルユーザーモードで起動して変更。

## 参考

* [VMware KB: Changing a forgotten root password on an ESX/ESXi host (1317898)](http://kb.vmware.com/kb/1317898)

本投稿内容も、本文中に説明しているように、上記参考先の情報に基づいて作成した。正確な情報が必要な場合は、必ずこれらの一次情報を確認すること。
文字の縦横の中央配置

文字の縦横の中央配置を行いたい場面があるのだが、どうやればよいかわからなくなるので、メモ。


````css:CSS
#wappper{
	height:100%;
	width:100%;
}
#center{
	display: table;
	width: 100%;
	height: 100%;
}
#center_cell{
	color: red;
	text-align: center;
	display: table-cell;
	vertical-align: middle;
}

```

```html:HTML
<div id="wappper">
	<div id="center">
		<div id="center_cell">
			center
		</div>
	</div>
</div>
```

デモ
https://dl.dropboxusercontent.com/u/3482475/index.html
ESXiからの5分毎に送られるSNMPトラップの抑制

## 概要

CIMプロバイダがインストールされたVMware vSphere ESXiから、5分毎に送信されるSNMPトラップの抑制方法。

## このトラップについて

VMware vSphere ESXiにCIMプロバイダがインストールされた環境（ベンダのカスタムISOイメージで構築された環境も含む）では、5分毎にESXiからSNMPトラップが送られる。このトラップは、CIMプロバイダの生存を知らせるハートビートの役割を果たす。

したがって、このトラップは受信ではなく途絶が異常を示す性格のものになる。SNMPマネージャ側に、このトラップの受信自体では通知などのアクションを起こさない、また一定時間途絶した場合にアクションを起こすといったインテリジェントな処理ができる場合には、問題なく、有用な仕組みである。

ただし、SNMPマネージャにこうした機能を持たない、単純に記録と通知だけを行うような製品を使用している場合、異常発生を把握しにくい。一方で、5分に一回、すなわち24時間で284回の「正常」トラップが記録されるため、データ件数をいたずらに増やす、と受け取られることもある。こうした環境では、このトラップの送信自体を抑制するよう希望されることがある。

## トラップの抑制

vSphere ESXi 5.1では、VMware社のナレッジ「[VMware KB: SNMP Trap is repeated every 5 minutes (2020271)](http://kb.vmware.com/kb/2020271)」の「Mask out the SNMP trap」項にしたがって、ESXi Shellまたはsshで、以下のコマンドを実行すればトラップを抑制できる。

    esxcli system snmp set —notraps 1.3.6.1.4.1.6876.4.90.0.401

なお、ナレッジはESXi 5.0が対象に入っているが、実施者によれば上記コマンドでは設定できない（ESXi 5.0のesxcliコマンドには「system snmp」名前空間がなかった）とのこと。この時は「[snmp traps every 5 min | VMware Communities](https://communities.vmware.com/thread/417164)」を参考に、vicfg-snmpコマンドで設定することができる。

## 参考

* [VMware KB: SNMP Trap is repeated every 5 minutes (2020271)](http://kb.vmware.com/kb/2020271)
* [snmp traps every 5 min | VMware Communities](https://communities.vmware.com/thread/417164)

本投稿内容も、本文中に説明しているように、上記参考先の情報に基づいて作成した。正確な情報が必要な場合は、必ずこれらの一次情報を確認すること。
Bitcasaの暗号化と重複排除の概要

# Bitcasaの暗号化と重複排除の概要

訳注: これは[Overview on encryption and deduplication](https://support.bitcasa.com/entries/24634447-Overview-on-encryption-and-deduplication)をBitcasa社から許諾を得て和訳したものである。</p>

## データはどのように暗号化されるのか

ユーザーがデスクトップアプリケーションを使ってコンテンツをBitcasa Driveにコピーしたとき、まずクライアント側でconvergent encryptionと呼ばれる手法で暗号化され、小さなブロックに分割してキャッシュにコピーされる。convergent encryptionではファイルのハッシュ値を用いて、ファイルの暗号化のための一意な鍵集合を生成する。convergent encryptionについては[Wikipedia](http://en.wikipedia.org/wiki/Convergent_encryption)に詳しい説明がある。データがキャッシュにコピーされてから、Bitcasaに同期プロトコルでアップロードされる。ユーザーのファイルシステムは、Bitcasaアカウントを作ったときに生成されたユーザーキーで暗号化される。

この段階の暗号化によって、ユーザーのアカウントの中にあるあらゆるデータ(ファイル名を含む)を我々がまったく見られなくなる。我々の側から見えるのは、何の意味もないデータのブロックと、それがユーザーのBitcasa Driveの中でどれくらい容量を使っているかだけである。データが復号化されて再構築されるのは、ユーザーがユーザー名とパスワードを使ってアカウントにログインしたときだけだ。我々は暗号鍵や生のままのパスワードはサーバーにまったく保存しない。

## 重複排除はどのように行うのか

ユーザーのデータが暗号化されてキャッシュに入ったら、Bitcasaはこれからアップロードする暗号化されたデータのブロックが、サーバーに既に存在しているかを確認する。アップロード済みのブロックがあったら、Bitcasaはそれをスキップして次のブロックの検査に進む。サーバーに既に存在するファイルをアップロードしたときには、ファイルがユーザーのBitcada Driveに現れる前に、Bitcasaはすべてのブロックがアップロード済みであることを確認する。
Mercurial(Python 2.7 on Windows x64)にhg-gitをインストールする

大変なのは…
==========
dulwichのインストールに必要な64ビット版VisualCのインストールでした！
こちらに備忘録を書きましたので、参考になれば幸いです。
[Windows7/8.1(x64)にVC10(64bitアプリコンパイル用)をインストーラーを使わずインストールする](http://qiita.com/nocd5/items/58396d782f1bca6f781f)

必要なものをいろいろインストールする
===============================
* easy_install(setuptools)  
    => `python ez_setup.py`
* pip(あれ？これは必要じゃなかったかも)  
    => `easy_install pip`

hg-gitのインストール
==================
の前にやっちゃいます。
よく分からないし、面倒臭いので
`(Pythonパス)/Lib/distutils/msvc9compiler.py`
を直に弄っちゃいます。VCのパスやinclude, libなどを直接設定します。

```diff
diff -r 59032f1c6c69 msvc9compiler.py
--- a/msvc9compiler.py	Thu Oct 23 21:13:44 2014 +0900
+++ b/msvc9compiler.py	Thu Oct 23 23:11:45 2014 +0900
@@ -380,12 +380,10 @@
                 plat_spec = PLAT_TO_VCVARS[get_platform()] + '_' + \
                             PLAT_TO_VCVARS[plat_name]
 
-            vc_env = query_vcvarsall(VERSION, plat_spec)
-
             # take care to only use strings in the environment.
-            self.__paths = vc_env['path'].encode('mbcs').split(os.pathsep)
-            os.environ['lib'] = vc_env['lib'].encode('mbcs')
-            os.environ['include'] = vc_env['include'].encode('mbcs')
+            self.__paths = ["C:/Tools/VC10x64/bin/amd64;C:/Tools/VC10x64/bin/x64"]
+            os.environ['lib'] = "C:/Tools/VC10x64/lib/amd64;C:/Tools/VC10x64/lib/x64"
+            os.environ['include'] = "C:/Tools/VC10x64/include"
 
             if len(self.__paths) == 0:
                 raise DistutilsPlatformError("Python was built with %s, "
```

あとは

```
easy_install -Z hg-git
```
すればインストールが開始されます。

おしまい
Ruboty | Handlers と Actions #ruboty #chatops

# Ruboty | Handlers と Actions #ruboty #chatops
## 概要
Ruboty の Handlers と Actions に関して。

## 資料
Ruboty の構成要素については、下記記事を参照
[Ruboty | 基本構成図解](http://qiita.com/tbpgr/items/7f08569dd8828bae6527)

## 詳細
### Handler
Handler は Ruboty の振る舞いをハンドリングします。
[Ruboty::Handlers::Base](https://github.com/r7kamura/ruboty/blob/master/lib/ruboty/handlers/base.rb) を継承して作成され、
組み込みでは以下の3つがあります

* [Ruboty::Handlers::Help](https://github.com/r7kamura/ruboty/blob/master/lib/ruboty/handlers/help.rb)
* [Ruboty::Handlers::Ping](https://github.com/r7kamura/ruboty/blob/master/lib/ruboty/handlers/ping.rb)
* [Ruboty::Handlers::Whoami](https://github.com/r7kamura/ruboty/blob/master/lib/ruboty/handlers/whoami.rb)

Handler では on クラスメソッドによって

|key|value|
|:--|:--|
|pattern|正規表現によるパターン|
|description|help に表示される説明文|
|name|振る舞いの名前＝メソッド名|

を定義します。
そして、 name で指定した名前のインスタンスメソッドを作成し、
正規表現のパターンに一致した場合の処理＝ Action を呼び出します。

### Actions
Actions は [Ruboty::Actions::Base](https://github.com/r7kamura/ruboty/blob/master/lib/ruboty/actions/base.rb) を継承して作成し、
call メソッドに正規表現に一致した際に呼び出される具体的な処理を記述します。

先述の Handler に対応する Action は以下です。

* [Ruboty::Actions::Help](https://github.com/r7kamura/ruboty/blob/master/lib/ruboty/actions/help.rb)
* [Ruboty::Actions::Ping](https://github.com/r7kamura/ruboty/blob/master/lib/ruboty/actions/ping.rb)
* [Ruboty::Actions::Whoami](https://github.com/r7kamura/ruboty/blob/master/lib/ruboty/actions/whoami.rb)

## 参照
[Ruboty GitHub](https://github.com/r7kamura/ruboty)
[Ruboty RubyGems](https://github.com/r7kamura/ruboty)
Windows7/8.1(x64)にVC10(64bitアプリコンパイル用)をインストーラーを使わずインストールする

ターゲット
=========
* アンチインストーラー主義者
* 既にインストール済みのVC10や再頒布可能パッケージのバージョンのせいで、インストールに失敗する人
など

必要なツール
==========
ファイルの展開に**Universal Extractor**を使用します。

事前にDLしておくファイル
=====================
* GRMSDKX_EN_DVD.iso
* dotNetFx40_Full_x86_x64.exe(Windows8.1では不要かも)

**dotNetFx40_Full_x86_x64.exe**はWindows8.1では不要かもしれません。
僕の環境ではWindows7では必要でしたが、Windows8.1の方では不要でした。

ググればすぐ出てきますがリンクはこの辺です
[Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO)](http://www.microsoft.com/en-us/download/details.aspx?id=8442)
[Microsoft .NET Framework 4 (スタンドアロンのインストーラー)](http://www.microsoft.com/ja-jp/download/details.aspx?id=17718)

作業に当っての注意点
=================
展開後のファイルパスが_そこそこ_長くなるので、なるべく浅いディレクトリで作業を行ってください。
ファイルパスが260文字を超えてしまい、展開できない場合があります。

さぁ展開作業の始まりです
=====================
展開は全てUniversal Extractorで行います。

1. まずGRMSDKX_EN_DVD.isoを展開します。
2. 展開してできたGRMSDKX_EN_DVD/Setup内の以下のファイルを展開していきます。
  * vc_stdamd64/vc_stdamd64.msi
  * vc_stdx86/vc_stdx86.msi
  * WinSDKBuild_amd64/WinSDKBuild_amd64.msi
  * WinSDKWin32Tools_amd64/WinSDKWin32Tools_amd64.msi
3. インストールディレクトリを決め(C:/Tools/vc10x64など)、  
そこに2.で展開した以下のディレクトリ内のファイル・フォルダを移動していきます。  
上書きされるファイルはvcvarsall.batだけだったと思いますが、移動は下記の順番で行います。
  * vc_stdx86/vc_stdx86/Program Files/Microsoft Visual Studio 10.0/VC/*
  * vc_stdamd64/vc_stdamd64/Program Files(64)/Microsoft Visual Studio 10.0/VC/*
  * WinSDKBuild_amd64/WinSDKBuild_amd64/Program Files/Microsoft SDKs/Windows/v7.1/*
  * WinSDKWin32Tools_amd64/WinSDKWin32Tools_amd64/Program Files/Microsoft SDKs/Windows/v7.1/*
4. `(インストールディレクトリ)/bin/cl.exe`を起動してみて、**mspdb100.dll**が必要と言われた場合は
**vc_stdx86/vc_stdx86/Program Files/Microsoft Visual Studio 10.0/Common7/IDE/mspdb100.dll**
を(インストールディレクトリ)/binにコピーしてください。
また、コンパイル時に`C1902`のエラーが出る場合は以下も**(インストールディレクトリ)/bin**にコピーしてください。なお、32bitアプリをコンパイルしない場合はこれらは必要ありません。  
  * vc_stdx86/vc_stdx86/Program Files/Microsoft Visual Studio 10.0/Common7/IDE/mspdbsrv.exe
  * vc_stdx86/vc_stdx86/Program Files/Microsoft Visual Studio 10.0/Common7/IDE/mspdbcore.dll
  * vc_stdx86/vc_stdx86/Program Files/Microsoft Visual Studio 10.0/Common7/IDE/msobj100.dll  

5. 上述のように、Windows8.1では不要かもしれないファイルの展開作業です。
`(インストールディレクトリ)/bin/cvtres.exe`と`(インストールディレクトリ)/bin/amd64/cvtres.exe`が起動しない場合は必要です。
  1. dotNetFx40_full_x86_x64.exeを展開
  2. 上記を展開してできたdotNetFx40_full_x86_x64/netfx_Core_x64.msiを展開
  3. **dotNetFx40_Full_x86_x64/netfx_Core_x64/Windows/System/msvcr100_clr0400.dll**を**(インストールディレクトリ)/bin**にコピー
  4. **dotNetFx40_Full_x86_x64/netfx_Core_x64/Windows/System64/msvcr100_clr0400.dll**を**(インストールディレクトリ)/bin/amd64**にコピー

パスと環境変数の設定
=================
```bat:設定例
set PATH=C:/Tools/VC10x64/bin/amd64;C:/Tools/VC10x64/bin/x64;%PATH%
set INCLUDE=C:/Tools/VC10x64/include
set LIB=C:/Tools/VC10x64/lib/amd64;C:/Tools/VC10x64/lib/x64
```

おわりに
=======
以上でインストール作業は終わりです。
一応このvc10x64でgvim.exeのビルドができることは確認していますが
上手く行かなかったらごめんなさい。
[攻略済] ssh tunneling を使って 複数の踏み台を攻略するには？


下記のような構成の場合どうすればいいのか

```cs
client -> 踏み台１ -> 踏み台２ ->DBサーバ
```

sshだけなら`transparent multi-hop ssh`てなページにあったように、下記の多段sshでDBサーバのmysqlクライアントに接続できた筈（configにProxyCommandを書いた記憶がないが多段環境が手元に無いのでうろ覚え）。

```cs
[hoge@localhost] > ssh -A -t 踏み台１ ssh -A -t 踏み台２ ssh -A DBサーバ
```

- [OpenSSH-6.5p1 日本語マニュアルページ (2014/05/31)](http://www.unixuser.org/~euske/doc/openssh/jman/ssh.html)
  - Aとかtとかのオプションの説明

## 解決

- コメント欄の @ngyuki さんの方法で解決
- ssh鍵がある場合は、 http://qiita.com/yudoufu/items/82f752807893c63f06db で解決


## 推測(以下作業ログ扱い）

多段sshではなくて、sshポートフォワードをしないとworkbenchからは接続方法が多分ないので、参考の`Multi-hop ssh tunnel - howto : Creating a SSH tunnel with port forwarding between multiple hosts`に従って、下記のようなポートフォワード構成にすればOKの筈。

```cs
request
-> 93306:localhost:93306
-> 93306:踏み台１:93306
-> 93306:踏み台２:93306
-> 3306:DBサーバ 
```

### 1st tunnel

```cs
[hoge@localhost] > ssh -L93306:localhost:93306 fuga@踏み台１
```

### 2nd tunnel

```cs
[fuga@踏み台１] > ssh -L93306:localhost:93306 piyo@踏み台２
```

### 3rd tunnel

```cs
[piyo@踏み台２] > ssh -L93306:localhost:3306 poo@DBサーバ
```

## one line

```cs
[hoge@localhost] > ssh -v -L93306:localhost:93306 fiuga@踏み台１ -t ssh -v -L93306:localhost:93306 piyo@踏み台２ -t ssh -v -L93306:localhost:3306 poo@DBサーバ
```

~~あとはworkbenchからlocalhost:93306 に接続すればいい筈なんだけど・・~~

## 参考

- [Transparent Multi-hop SSH](http://sshmenu.sourceforge.net/articles/transparent-mulithop.html)
- [Multi-hop ssh tunnel - howto : Creating a SSH tunnel with port forwarding between multiple hosts](http://ufasoli.blogspot.jp/2013/11/multi-hop-ssh-tunnel-howto-creating-ssh.html)
- [ssh tunnel via multiple hops](http://superuser.com/questions/96489/ssh-tunnel-via-multiple-hops)
swiftで超簡易iOSアプリ作成（日時表示&スライダー数値）

本を見ながら、iPhoneアプリ（という程でもないが）作ってみた。
![シミュレーター画像](http://i.gyazo.com/463a3c498178d9fe1661a75fcad054dc.png)
・【ラベル】現在の日時を表示する
・【テキストボックス】初期入力値をプログラムで設定する
・【スライダー】スライダーを動かした位置を、2桁の数字で表示する
* * *
```swift:ViewController.swift

class ViewController: UIViewController {
    @IBOutlet weak var MyText: UITextField!
    @IBOutlet weak var LabelChan: UILabel!
    @IBOutlet weak var WataSliderVolume: UILabel!
    @IBOutlet weak var WataSlider: UISlider!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        // テキストボックスに初期入力する
        self.MyText.text = "マンハッタナー"
        self.MyText.textColor = UIColor.purpleColor()
        
        // 日時をラベルに表示する
        var ima = self.getDate()
        self.LabelChan.text = "日時： \(ima)"
        self.LabelChan.textColor = UIColor.purpleColor()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // スライダーを動かした時にこのメソッドを毎回呼び出す
    @IBAction func updateValue(sender: UISlider) {
        // スライダーの位置を取得する
        var level = String(Int(self.WataSlider.value * 10000 / 100))
        self.WataSliderVolume.text = level
        
    }
    
    // 日時を取得する
    func getDate()->NSString {
        let now = NSDate()
        let dateFormatter = NSDateFormatter()
        dateFormatter.locale = NSLocale(localeIdentifier: "en_US") // ロケールの設定
        dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" // 日付フォーマットの設定
        var thisDate = dateFormatter.stringFromDate(now)
        return thisDate
    }
}
```
* * *
日時表示はこちらを参考にさせてもらいました。
[Swiftで現在日時を取得し、独自のフォーマットで出力する方法](http://qiita.com/cotrpepe/items/261833c465af5d70f867)

読んでる本はこれです。
[詳細! Objective-C iPhoneアプリ開発 入門ノート](http://www.amazon.co.jp/Objective-C-iPhone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-%E5%85%A5%E9%96%80%E3%83%8E%E3%83%BC%E3%83%88-Xcode5-iOS7%E5%AF%BE%E5%BF%9C/dp/4800710227/ref=tmm_hrd_title_0)
Swiftじゃない！

こちらにソースをアップしました。
https://github.com/hanoopy/ios_study

投稿するほどのものでもないのだけど。
* * *



これを作る過程でいろいろやって見てたら、「Uncaught NSException」とか何とか出てビルド失敗した。
「アウトレット」（部品）をいくつも置いて、使わなかったりしてたら、エラーになるらしい。
【iOS】【swift】カメラ・アルバムへのアクセスし静止画の取得 UIImagePickerController

かなり基本的な事ですが、色々書き直しているので、メモがてら。


##SourceTypeの対応チェック

例えばシュミレータでカメラを起動しようすると落ちるので。

```swift

if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)
{
//camera ok

}

```

##カメラ・アルバムの起動


```swift

let ipc:UIImagePickerController = UIImagePickerController();
ipc.delegate = self
ipc.sourceType = UIImagePickerControllerSourceType.Camera
// UIImagePickerControllerSourceType.PhotoLibraryでアルバムへのアクセス
self.presentViewController(ipc, animated:true, completion:nil)

```



##プロトコルの指定

```swift

//ViewController内であれば
class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {

```

UINavigationControllerDelegateもいります。



##delegateで画像の取得


```swift

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
        if info[UIImagePickerControllerOriginalImage] != nil {
            let image:UIImage = info[UIImagePickerControllerOriginalImage]  as UIImage
        }
        //allowsEditingがtrueの場合 UIImagePickerControllerEditedImage
        //閉じる処理
        picker.dismissViewControllerAnimated(true, completion: nil);
}

```
fig少しだけ触ってみた

参考: [Getting started | Orchard](https://www.orchardup.com/docs)

# インストール

* [Installing Fig](http://www.fig.sh/install.html)

```bash:
curl -L https://github.com/docker/fig/releases/download/1.0.1/fig-`uname -s`-`uname -m` > /usr/local/bin/fig; chmod +x /usr/local/bin/fig
```
# fig.yml記述

```yml:fig.yml
www:
  image: centos:centos7
  privileged: true
  ports:
    - 22 # ssh
    - 80 # web
    - 443 # web
    - 8080 # web test
    - 25 # mail
    - 110 # mail
    - 587 # mail
    - 161 # snmp
    - 3306 # mysql
    - 5666 # nagios
    - 10050 # zabbix
    - 10051 # zabbix
  volumes:
    - log:/var/log/httpd
```

```bash:figからコンテナ生成しコマンド実行
fig run www ls -l
fig run www yum info vim
```


## apache + mysql

```yml:fig.yml
phpapache:
  image: php:5.6.3-apache
  ports:
    - '80:80'
mysql:
  image: mysql
  ports:
    - '3306:3306'
  environment:
    MYSQL_ROOT_PASSWORD: password
```
YosemiteでVMware Fusionが使えなくなったのでVirtualBoxに移行した話

##経緯

何も考えずにYosemiteにバージョンアップしたところ、
VMware Fusion 5が動作しなくなりました。

OSX 10.10ではVMware Fusion 5はサポート外になったということで、
これを機にVirtualBoxに移行することにします。

しかし、言及の多い[このページ](http://blog.csanchez.org/2011/08/01/migrating-windows-7-from-vmware-fusion-to-virtualbox/)をもとにVirtualBoxの設定をしても、
Windows 8起動時にブルースクリーンになってしまいます。

VMware上では、Windows 8はサスペンド状態のうえ自動スナップショットを取っていたので、
これが原因の可能性があります。
OSの終了とスナップショットの削除をしたいところです。

しかしVMware Fusionのアプリはもう何もできません。

##解決策

VMware Fusion 7ならYosemiteに対応しているため、評価版をダウンロードして使い、
Windows 8の終了とスナップ削除後にVirtualBoxで設定したところうまくいきました。

技術的に何かしたわけでないですが、こんな解決方法もあるということで。
【Rails】ActionMailer を用いて Gmail を使う際にハマった点

Rails でアプリを作成している際に、<a href="http://qiita.com/ytr_i/items/0907ee3312ed9d79c9e8">こちらの記事</a>を参考にしてメール送信機能を実装していたところ、一つ Gmail 側の設定でハマったので記録しておきます。

<h2>Gmail の2段階認証について</h2>
今回参考にしていた記事では、Rails アプリからメールを送信する方法については記述されていたものの、Gmail 側の設定にまでは話が及んでいませんでした。コメント欄でも言及されていますが、特定の場合には Gmail 側のセキュリティ設定まで合わせていじる必要があり、特に2段階認証を設定している場合は、アプリの登録とそれに伴うパスワードの発行を行い、それを Rails 側の `config/environments` に記載する必要ががあります。
参考: https://support.google.com/accounts/answer/6010255

細かな点ですが、今後他の人が少しでも困らなければと思います。
[Xcode6系][Xcode7系]アップデートしただけで実機確認中にエラーが出た。


### Xcodeの最新バージョンが出ています。
(10/20に出たみたいです。)


![スクリーンショット 2014-10-23 18.46.14.png](https://qiita-image-store.s3.amazonaws.com/0/15812/8964c64a-34c4-b362-bf5e-8498f8204a73.png "スクリーンショット 2014-10-23 18.46.14.png")


![スクリーンショット 2014-10-23 18.46.43.png](https://qiita-image-store.s3.amazonaws.com/0/15812/efe06861-bd5f-4597-c620-14096d718c99.png "スクリーンショット 2014-10-23 18.46.43.png")

僕のようなiOS開発経験が短いと自分のコードによるバグなのかXcodeのバージョンによるバグなのか判別がつかないため、
Xcodeが最新バージョンがで

その時に出たエラーは

<b>dyld dyld_fatal_error や EXC_BREAKPOINT </b>

といったエラー吐かれていました。

## 対処方法
以下のコマンドを実行しました。
(対象のビルドファイルだけにしたい方は「*.*」を対象のビルドファイル名に変更してください。)

```
rm -rf ~/Library/Developer/Xcode/DerivedData/*.*

```

##　結果
無事、実行できました。

![スクリーンショット 2014-10-23 21.45.16.png](https://qiita-image-store.s3.amazonaws.com/0/15812/ad998a40-03f3-5a79-e16f-2243553f35bd.png "スクリーンショット 2014-10-23 21.45.16.png")



##　原因
以前のXcodeで生成されたビルドファイルを再度読み込もうとしたことにより、エラーが発生していた。


## 再発防止策
xcodeのバージョンアップをした後は、

```
rm -rf ~/Library/Developer/Xcode/DerivedData/*

```

のコマンドを実行し、再度、ビルド&実行を心がける。

または
<b>XcodeでShit+Cmd+Kを実行してCleanな状態</b>
にして
再度、ビルド&実行を心がける。
githubの複数アカウントの扱い方


githubのアカウントを複数持っていて、意図と違うアカウントにpushされちゃってpermission deniedとかになって地味に解消するのに手間取ったので、今後そうならないようにメモっておきます。

##陥った現象

個人のアカウントとチームのアカウントを二つ持っていて、とあるアプリケーションをlocalで開発後、githubの個人アカウントにpushしようと思ったら、チームの方にpushされてpermission deniedとかになってしまってpushができない。。。

~/.ssh/configとかAPP_ROOT/.git/configとかを色々いじってみて、ようやく解消したので、そのプロセスをメモしておきます。

githubにsshで接続するために下記を実行

    ssh -T git@github.com

すると、認証が完了したときのメッセージが、

    Hi {チームのアカウント名}/{APP名}! You've successfully authenticated, but GitHub does not provide shell access.

ここで気づくべきだけど、認証した！と思って、意気揚々とgit pushまでしようとすると、push先がチームのアカウントなのでpermissionがないよと。

##対処法

git remoteの先を確認。

    git remote -v

    => origin	git@github.com:{個人のアカウント名}/{APP名}.git (fetch)
       origin	git@github.com:{個人のアカウント名}/{APP名}.git (push)

となる。

さっき接続したgithub.comでは、チームのアカウントがpush先になってしまうので、
remoteを書き換える。

    vi ~/.ssh/config

に以下の記述を追加する

    Host github-mine
      HostName github.com
      User git
      Port 22
      TCPKeepAlive yes
      IdentitiesOnly yes
      IdentityFile ~/.ssh/{秘密鍵の名前}

で、

    git remote remove origin
    git remote add origin git@github-mine:{個人のアカウント名}/{APP名}.git

とやると、

    git remote -v
    
    => origin	git@github-mine:{個人のアカウント名}/{APP名}.git (fetch)
       origin	git@github-mine:{個人のアカウント名}/{APP名}.git (push)

ってなるので、これでOK！！

git pushが通りましたとさ。

めでたし、めでたし。
Xcode6.1 にしたら Table View を表示しなくなった話

Xcode5 や Xcode6.0 では表示周りで苦労せずに作ってきた iOS アプリが、Xcode6.1 に乗り換えた途端に Table View が表示されなくなった件。

Table View にレイアウトの制約をかけない場合に、

- Xcode 6.1 でビルドすると iOS7 では表示されない
 - 行の敷居線も見えずに真っ白。
 - numberOfRowsInSection は呼ばれて 1 以上の値を返しても、その後で cellForRowAtIndexPath は呼ばれない。
- iOS8 では問題にならない。
- 多分、Xcode6.0 までは大丈夫。(特に困った記憶ないので)

という問題で、レイアウトの制約を上下左右0で設定したら回避できた。

テーブルを制約なしで使うのはお行儀が悪いので、そのケースで、かつ iOS7 の組み合わせでのテストを Apple さんがサボってデグレードしたのではないかと思ってる。iPhone6 + iOS8.1 がメインでしょうし。

回避策のあるものはバグとは思わないけど、同じようにハマってる人がいたら一助になれば幸いです。
KnockoutJs Tutorial｜シングルページアプリケーション



# KnockoutJs Tutorial｜Single page applications

knockout.js tutorial３こめhttp://learn.knockoutjs.com/#/?tutorial=collections Single page applicationsです。

# HTML

```
<script src="/scripts/lib/sammy.js" type="text/javascript"></script>

<!-- Folders -->
<ul class="folders" data-bind="foreach: folders">
    <li data-bind="text: $data, 
                   css: { selected: $data == $root.chosenFolderId() },
                   click: $root.goToFolder"></li>
</ul>


<!-- Mails grid -->
<table class="mails" data-bind="with: chosenFolderData">
    <thead><tr><th>From</th><th>To</th><th>Subject</th><th>Date</th></tr></thead>
    <tbody data-bind="foreach: mails">
        <tr data-bind="click: $root.goToMail">
            <td data-bind="text: from"></td>
            <td data-bind="text: to"></td>
            <td data-bind="text: subject"></td>
            <td data-bind="text: date"></td>
        </tr>     
    </tbody>
</table>

<!-- Chosen mail -->
<div class="viewMail" data-bind="with: chosenMailData">
    <div class="mailInfo">
        <h1 data-bind="text: subject"></h1>
        <p><label>From</label>: <span data-bind="text: from"></span></p>
        <p><label>To</label>: <span data-bind="text: to"></span></p>
        <p><label>Date</label>: <span data-bind="text: date"></span></p>
    </div>
    <p class="message" data-bind="html: messageContent" />
</div>
```


# JS

```
function WebmailViewModel() {
    // Data
    var self = this;
    self.folders = ['Inbox', 'Archive', 'Sent', 'Spam'];
    self.chosenFolderId = ko.observable();
    self.chosenFolderData = ko.observable();
    self.chosenMailData = ko.observable();
    
    // Behaviours    
    self.goToFolder = function(folder) { location.hash = folder };
    self.goToMail = function(mail) { location.hash = mail.folder + '/' + mail.id };

    // Behaviours    
/*    self.goToFolder = function(folder) {
        self.chosenFolderId(folder); 
        self.chosenMailData(null); // Stop showing a mail
        $.get('/mail', { folder: folder }, self.chosenFolderData);
    };   
    
    self.goToMail = function(mail) { 
        self.chosenFolderId(mail.folder);
        self.chosenFolderData(null); // Stop showing a folder
        $.get("/mail", { mailId: mail.id }, self.chosenMailData);
    };*/
    
    // Client-side routes    
    Sammy(function() {
        this.get('#:folder', function() {
            self.chosenFolderId(this.params.folder);
            self.chosenMailData(null);
            $.get("/mail", { folder: this.params.folder }, self.chosenFolderData);
        });

        this.get('#:folder/:mailId', function() {
            self.chosenFolderId(this.params.folder);
            self.chosenFolderData(null);
            $.get("/mail", { mailId: this.params.mailId }, self.chosenMailData);
        });
        
        this.get('', function() { this.app.runRoute('get', '#Inbox') });
    }).run();

   
    // Show inbox by default
    // self.goToFolder('Inbox');
    
};

ko.applyBindings(new WebmailViewModel());
```
OS X Yosemite でアップル特有文字を入力する

# 特殊文字の入力が必要な場合
Mac OS X でのショートカットキーなどの表現で ⌘S のような記述をマニュアルなどでする場合があるかと思います。そういった場合の「⌘」と「」の入力方法を備忘録として投稿します。

※ Mac OS X シリーズ以外では文字化けして読めない可能性があります。
※ Yosemite として書いていますが、他の Mac OS X でも同じと思います。

# コマンドマーク ⌘
こちらは簡単です。

```lang:出力の仕方
平仮名「こまんど」を変換する。
```

# アップルマーク 
こちらはショートカットキーです。

```lang:ショートカットキー
shift + option + K
```