OmniAICreator/Qiita-1.07M huggingface dataset:
Kernel.#Array で型の差異を吸収する

### 概要

引数が配列でもそうでなくても動くようなメソッドを定義したいときってありますよね。
そんなとき if 文 や case 文を使って引数を加工していませんか？
Kernel.#Array を使うともっと便利になります！

### 使用例

しんどいコード
(本当は Range のままでも Enumerable#inject は使えますが説明のために入れています。)

``` rb
def sum(numbers)
  numbers = 
    case numbers
    when Array
      numbers
    when Fixnum
      [numbers]
    when Range
      numbers.to_a
    end
  
  numbers.inject(:+)
end

sum(15) #=> 15
sum([1,2,3,4,5]) #=> 15
sum(1..5) #=> 15
```

幸せなコード

``` rb
def sum(numbers)
  Array(numbers).inject(:+)
end

sum(15) #=> 15
sum([1,2,3,4,5]) #=> 15
sum(1..5) #=> 15
```

### 参考

[module function Kernel.#Array](http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/m/Array.html)
>arg に to_ary, to_a のいずれのメソッドも定義されていない場合は 一要素の配列 [arg] を返します。

ここがポイントですね。
仮想開発環境の構築 其の弐～開発ツールをインストールする

##ディベロップメントツールをインストールする

インストールには"yum"コマンドを使います。

[yum](http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/230999/)：パッケージのインストール，アップデート，アンインストールなどを行います。

```
# yum　-y groupinstall "Development tools"
```

ディベロップメントツールには様々な開発ツールが含まれています。
確認するためには以下のコマンドを実行してください。

```
# yum groupinfo 'Development tools'
```

##vim，git，readlineをインストールする

git：分散型バージョン管理システム
vim：テキストエディタ
readline：行入力支援ライブラリ（行頭移動，行末移動，Tab補間，etc...）

```
# yum -y install vim-enhanced git readline-devel
```

##アップデートする

とりあえず全てのパッケージをアップデートします。

```
# yum -y update
```
LLVM C API を使う.


LLVM には C++ と C API が用意されています. 最近は FTL http://blog.llvm.org/2014/07/ftl-webkits-llvm-based-jit.html のおかげで C API の整備が大分進み, 十分使える感じになっています. 

C API のほうがコンパイル時間も短くて済み, また言語バインディングを書くとなども, リンケージや ABI 問題に悩まされなくなります. これからは C API で書いておきたいですね.

## LLVM C API のサンプル

ひとつの大きな問題はドキュメントやサンプルコードがオフィシャルには無い事です.

幸い FTL(webkit) には RefucedFTL という謎(?)の LLVM C API を使ったサンプルがあります.

https://github.com/WebKit/webkit/blob/master/Tools/ReducedFTL/ReducedFTL.c

これをみれば大体わかりますね!

昨今の LLVM では MCJIT が推奨のようです. ExecutioEngine には MCJIT を使い, `LLVMLinkInMCJIT()` を忘れずに呼び出しておきましょう.
Swiftのアクセスコントロールを試してみた


今話題の アクセスコントロール(public/pirvate)を試してみた。

開発環境は、XCode6-Beta4 (2014/7/23時点)

最初、Playgroundにて、サンプルコードを記述してみたが、privateなプロパティやメソッドに、みんなアクセスできてしまった。

**Declaration.playground**
![スクリーンショット 2014-07-23 12.28.14.png](https://qiita-image-store.s3.amazonaws.com/0/3184/05377863-f19a-08a4-c030-e2a971eac94c.png "スクリーンショット 2014-07-23 12.28.14.png")



ということで、実際、UIViewControllerを使用して自作クラスの、privateなプロパティやメソッドにアクセスしてみた。

**DeclarationSample**

```MyDeclaration.swift
import Foundation

class MyDeclaration{
    
    private var valPrivate:String = "Private Value"
    public var valPublic:String = "Public Value"
    
    private func myPrivateFunc(){
        NSLog("Private Function executed!!")
    }
    
    public func myPublicFunc(){
        NSLog("Public Function executed!!")
    }
}
```


```ViewController.swift
import UIKit

class ViewController: UIViewController {
                            
    override func viewDidLoad() {
        super.viewDidLoad()

        
        var myClass:MyDeclaration = MyDeclaration()
        
        //Public Function
        myClass.myPublicFunc()
        
        //Set Public Property
        myClass.valPublic = "Set New Public Value!!"
        
        //Get Public Property
        NSLog("myClass.valPublic:%@", myClass.valPublic)

        
        //Private Function
        //myClass.myPrivateFunc()
        
        //Set Private Property
        //myClass.valPrivate = "Set New Private Value!!"
        
        //Get Private Property
        //NSLog("myClass.valPrivate:%@", myClass.valPrivate)
       
 }
}
```

以下のように、仕様の通りに外部からアクセスできないので、事前にエラーとなる。

![スクリーンショット 2014-07-23 12.30.11.png](https://qiita-image-store.s3.amazonaws.com/0/3184/729569ea-36ff-f509-a618-64940d60cef0.png "スクリーンショット 2014-07-23 12.30.11.png")




ちなみに、当然、同一クラス内からはprivate関数はコール可能。

```MyDeclaration.swift
class MyDeclaration{
    
    private var valPrivate:String = "Private Value"
    public var valPublic:String = "Public Value"
    
    private func myPrivateFunc(){
        NSLog("Private Function executed!!")
    }
    
    public func myPublicFunc(){
		//同一クラス内からはコール可能
        myPrivateFunc()
    }
}
```

Java出身の自分としては、C言語系のヘッダファイル等によるスコープ管理は非常に難解であったので、とてもわかりやすくなって嬉しい。

ちなみに、XCode6-Beta4になってからもコードアシスト機能が、更に実用的になってきて素晴らしい。今後、SwiftもXcodeも進化していくことを期待している。

Lovely!!
Xcode6-Beta4現在のSwiftで逆Rangeを適切に扱う

##はじめに

お断りしておきますと、「[Rangeを使ったforループは気をつけよう]」で指摘されている問題は、Appleも把握してます。

[Release Notes]
> More improvements are due in forthcoming betas, addressing a variety of issues iterating over floating point ranges, constructing negative ranges, and several other known range-related problems.

[Rangeを使ったforループは気をつけよう]: http://qiita.com/kiyoshih/items/519406d689cf1677a961
[Release Notes]: https://developer.apple.com/devcenter/download.action?path=/Developer_Tools/xcode_6_beta_4_o2p8fz/xcode_6_beta_4_release_notes.pdf

##Appleの対応を待てない人は

それを踏まえた上で、Appleの対応を待てない人向けの対策を。

````swift
@infix func ..< (lhs:Int, rhs:Int)->StrideTo<Int> {
    return stride(from:lhs, to:rhs, by:(lhs <= rhs ? 1 : -1 ))
}
@infix func ... (lhs:Int, rhs:Int)->StrideThrough<Int> {
    return stride(from:lhs, through:rhs, by:(lhs <= rhs ? 1 : -1 ))
}
````

動作確認用コード

````swift
for i in 0..<4 { println("0..<4: \(i)") }
for i in 4..<0 { println("4..<0: \(i)") }
for i in 0...4 { println("0...4: \(i)") }
for i in 4...0 { println("4...0: \(i)") }
````

本当は

````swift
@infix func ..< <T:Comparable>(lhs:Int, rhs:Int)->Range<T>
````

で定義したいところですが、それだと**ambiguous use of ..<**って怒られちゃうので、Non-Genericに`Int`決めうちで。

見ての通り、`..<`と`...`もただの演算子なので、当然Overloadの対象だということも覚えておくといいかも。

Dan the Bidirectional
iOSの"24時間表示"切り替えのワナ

ものすごいトラップに引っかかったのでメモ代わりに。

iOSで日付や時間を取り扱う際は`NSDate`クラスと`NSDateFormatter`を使用します。日付から文字列にする際はこのように出力フォーマットを指定します。

```objc
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";

NSDate *date = [NSDate date];
NSString *formatString = [dateFormatter stringFromDate:date];
```

逆に文字列から日付にする際はこんな感じです。

```objc
NSString *dateString = @"2014/07/23 12:00:00";

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";

NSDate *date = [dateFormatter dateFromString:dateString];
```

だいたいこんな感じで問題なく使っていると思います。

**が。**

実はこの変換がうまく行かない場合があります。
時間表示が**午前/午後表記=24時間表示がオフ**の場合です。


時間表記の切り替えは設定 > 一般 > 日付と時刻から選択できます。

デフォルトはこちら。
![timeformat_01.png](https://qiita-image-store.s3.amazonaws.com/0/45525/44bfae84-ff94-76fa-10d5-20505bcbf55e.png)

こちらがオフ。
![timeformat_02.png](https://qiita-image-store.s3.amazonaws.com/0/45525/0975bfa5-0b41-0659-bf5b-bc256623d978.png)

ステータスバーに表示されている時間を見ると分かりやすいと思います。

この設定をしたときに**文字列から日付への変換**がうまくいきません。`dateFromString`から`nil`が返ってきます。`NSDictionary`に入れようとすると最悪な事態になりますね。**落ちます。**


問題となるパターンとしては、日付のフォーマットを`@"yyyy/MM/dd HH:mm:ss"`のようにベタ打ちしているパターン、csvファイルなどに日付フォーマットを決めて書かれているものを読み込んで`NSDate`に変換しようとするパターンなど、フォーマットを固定して使用している場合がこれにあたります。

しかも困ったことに**シミュレーターは24時間表示切り替えができません。**実機で検証した上で、24時間表示の切り替えがあることを考慮してテストを行わないといけませんね。

で、これをどうやって解決したら良いか？[こちらのドキュメント](https://developer.apple.com/library/ios/qa/qa1480/_index.html)を参照してみましょう。ここにはこんなことが書かれています。

> On the other hand, if you're working with fixed-format dates, you should first set the locale of the date formatter to something appropriate for your fixed format. In most cases the best locale to choose is "en_US_POSIX", a locale that's specifically designed to yield US English results regardless of both user and system preferences.

Google翻訳してみます（翻訳原文ママ）。

> あなたは固定形式の日付で作業している一方、は、まず固定フォーマットに適したものに日付フォーマッタのロケールを設定する必要があります。ほとんどの場合、選択するのが最善のロケールが「en_US_POSIX」は、具体的に関係なく、ユーザとシステム環境の両方の米国英語の結果をもたらすように設計されていますロケールです。

ということなので、固定フォーマットの文字列を日付に変換する際は`en_US_POSIX`を`NSDateFormatter`のロケールに指定しましょう。

```objc
NSString *dateString = @"2014/07/23 12:00:00";

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];

NSDate *date = [dateFormatter dateFromString:dateString];
```

これで文字列から日付への変換は問題なくできるようになります。
UITableViewとUITableViewCellの背景を透明にする

なぜかXIBでUITableViewとUITableViewCellの背景色を半透明にするだけでは、セルを半透明にできなかったので備忘録として。

# UITableViewを半透明にする.

```objc
-(void)viewDidLoad {
  // 半透明にする.
  UIColor* tableBackgroundColor = [UIColor blackColor];
  tableBackgroundColor = [tableBackgroundColor colorWithAlphaComponent:0.5];

  [self.tableView setBackgroundColor:tableBackgroundColor];
}
```
# UITableViewCellを透明にする.

```objc

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyTableCellTableViewCell* cell = (MyTableCellTableViewCell*)
        [tableView dequeueReusableCellWithIdentifier:MY_TABLE_CELL];
    if( cell == nil ) {
        cell = [self createCustomCell];
        // なぜかXIB上でclearColorを設定していも、セルが透明にならず、
        //  ここで設定する事でセルが透明になった。
        [cell setBackgroundColor:[UIColor clearColor]];
    }
    return cell;
}

// テーブルセルを生成する
-(MyTableCell*)createCustomCell {
    MyTableCell* result = nil;
    NSArray* nibArray = [[NSBundle mainBundle] loadNibNamed:@"MyTableCell" owner:nil options:nil];
    for(id obj in nibArray) {
        if( [obj isMemberOfClass:[MyTableCell class]] ) {
            result = (MyTableCell*)obj;
            break;
        }
    }
    return result;
}

```


# 参考

[UITableViewの背景を透過色にする](http://qiita.com/shobyshoby/items/35c26783c861f28668eb)
肥大化したibdata1を縮小する

参考:[[MySQL] ibdata1のサイズを削減する手順 [InnoDB] | oshiire*BLOGoshiire*BLOG](http://oshiire.to/archives/1684)

* /var/lib/mysql/ibdata1

```bash:念のため全バックアップ
mysqldump -uroot -p --opt --all-databases > alldb.sql
```

```bash:mysqlを停止してファイルを移動し起動
/etc/init.d/mysql stop
cd /var/lib/mysql
```

```bash:ファイル削除
rm ib_logfile[01] ibdata1
```

```bash:mysql起動
/etc/init.d/mysql start
```

## /var/lib/mysql/ を削除する場合

* どうも調子が悪い場合は以下実施
  * `rm -r /var/lib/mysql/database名/`

```bash:
mysql -uroot -p < allldb.sql
```

```bash:
sudo -u mysql mysql_install_db
```
iTerm2の枠線表示について

-
iTermのバージョン Build1.0.0.20140629

> iTerm>Preferences>Apperance

の中の「Window」項目の「Show border around window」にチェックを入れればできた

![gazou2.png](https://qiita-image-store.s3.amazonaws.com/0/40340/2d544f4e-bb51-4174-2e46-e1a88e6e9247.png "gazou2.png")
ツールチップテキストの表示位置リセット

ToolTipManager#setEnabled(boolean flag)を以下のように実行する事で、
ツールチップテキストの表示位置をマウスカーソル直下に変更できる。

`ToolTipManager.sharedInstance().setEnabled( false );
ToolTipManager.sharedInstance().setEnabled( true );`
cd var etcでetcに移動できる

‏@p_ck_ 氏のtweetにて知った。

<blockquote class="twitter-tweet" lang="ja"><p>cd に引数を2つ与えると、カレントディレクトリのフルパスをs/$1/$2/したところにcdするのか…はじめて知った。</p>&mdash; ぽっけ (@p_ck_) <a href="https://twitter.com/p_ck_/statuses/491724775941615617">2014, 7月 22</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

```bash:
$ cd /var
$ cd var etc
$ pwd
/etc
```

使い道が微妙。
/home/以下で使えるかも？くらい
ImageIO経由で画像ファイルの拡張子を取得する

ImageIOを経由して画像ファイルのフォーマットを取得します。

```java:ImageUtil.java
/**
 * 指定した画像ファイルの内容から拡張子を取得する(対応フォーマット：jpg,bmp,png,gif)
 * @param target
 * @return
 * @throws IOException 
 */
public static String getImageFileExtensionByImageIO( File target ) throws IOException
{
	if( target == null || !target.exists() )
	{
		return "";
	}

	ImageInputStream iis = null;
	String ext = null;
	try
	{
		iis = ImageIO.createImageInputStream( target );
		Iterator<ImageReader> readers = ImageIO.getImageReaders( iis );
		if( !readers.hasNext() )
		{
			return "";
		}
		ImageReader reader = readers.next();
		String[] suffixes = reader.getOriginatingProvider().getFileSuffixes();
		if( suffixes == null || suffixes.length == 0 )
		{
			ext = suffixes[ 0 ];
		}
		else
		{
			ext = reader.getFormatName();
		}
	}
	finally
	{
		try
		{
			if( iis != null )
			{
				iis.close();
			}
		}
		catch( IOException e )
		{
		}
	}
	return ext;
}
```
XCode6βでのはまりメモ

#はじめに
順次更新していくメモです

#デバイスまわり
##iOS8β4をいれたiPod TouchがXcodeで認識できず
 + 端末を接続時にiTunesでまずアラート
 + XcodeのDevice無効なほげほげ〜なエラーがでて

###確認
別Macでの同じバージョンでのXcodeでの表示は正常
###対応
Devicesでの端末の選択から"Unrepairなんとか"な選択肢が選べたので
Unrepairをした後に再度接続
###結果
正常に認識

##変なところでクラッシュ
UIAlertShimPresentingViewControllerというのが悪さをしている模様
https://github.com/search?q=UIAlertShimPresentingViewController&ref=cmdform&type=Issues

#さいごに
β版でのできごとなので、正式版がでるころには直りますように
Nginx で Basic認証

#参考：http://bekkou68.hatenablog.com/entry/2013/10/05/232451
  
任意の場所へ
`cd /etc/nginx/conf.d/`

<pre>
sudo htpasswd -c .htpasswd username
</pre>

>ドットファイルにする方がセキュリティが良い気がする。

パスワードの設定を求められるので、パスワードを2回入力する(この入力したパスワードがログイン時に実際に使用するもので、ファイルに出力されるのはcrypt関数で暗号化されているので簡単に復号化はできないらしい。パスワード忘れてしまった場合はユーザー追加しか対応がないのかな。

ユーザーを追加したい場合、

<pre>
sudo htpasswd .htpasswd addusername
</pre>

  
###パスワード生成コマンドlinux
`mkpasswd`
`pwgen`
http://d.hatena.ne.jp/tkrd/20121111/1352645711
  
nginx設定例:

<pre>
server {
  listen 80;
  server_name <hogehoge.jp>;
  location / {
    # Passwd auth
    auth_basic            "Restricted";
    auth_basic_user_file  /etc/nginx/conf.d/.htpasswd;
    root <hogehoge_path>;
  }
  location /nginx_status {
    stub_status on;    # activate stub_status module
    access_log off;
    allow 127.0.0.1;   # restrict access to local only
    deny all;
  }
}
</pre>

設定反映

<pre>
nginx -t
sudo service nginx reload
</pre>
SwiftでInitとDeinit


クラスの初期化については、インスタンス化する際に、`init()`がコールされるので初期化処理を記述することができる。クラスの後始末処理については、`deinit`に処理を記述できるが、`ARC(Automatic Reference Counting)`によって自動的に呼ばれるために、プログラマが意図的にコールすることはできない。

とりあえずこんなメソッドもあるということで覚え書き。あまり使わないと思うが。

```
class MyDeclaration{
    init(){
        NSLog("Init!!")
    }
    
    deinit{
        NSLog("Deinit!!")
    }
}

var myClass:MyDeclaration = MyDeclaration()
```

![スクリーンショット 2014-07-23 11.40.46.png](https://qiita-image-store.s3.amazonaws.com/0/3184/b5f69db8-2312-2be8-61a6-5bf418212ded.png "スクリーンショット 2014-07-23 11.40.46.png")

余談だが、`init()`にはカッコ()が付き、`deinit`にはカッコ()が付かない理由は、よくわからない。
cocos2d-xのSprite3Dで3Dモデルの回転軸を変える


cocos2d-x 3.1から実装された`Sprite3D`を使ってて偶然発見したマニアックな知見を共有

## 3DSprite

例えば、歯車のようなモデルを表示して、回転させたいと思う。

モデルはBlenderで作成した。

![](http://i.gyazo.com/9d4550acfff0b9d7b0b1b2aa3e310dd8.gif)

```cpp
Size visibleSize = Director::getInstance()->getVisibleSize();
   
auto gear = Sprite3D::create("model/gear.obj");
gear->setPosition(visibleSize.width / 2.0, visibleSize.height / 2.0);
auto rotation = RotateBy::create(10, Vec3(0, 360, 0));
gear->runAction(RepeatForever::create(rotation));
this->addChild(gear);
```

うまく回転する


## 問題：傾けたモデルを回転させようとすると軸がおかしくなる

しかし、このままだと見栄えが悪いので、おもむろに歯車を傾けて回転するようにしたい。

そっちの方が立体感が出てカッコイイ

```cpp
Size visibleSize = Director::getInstance()->getVisibleSize();

auto gear = Sprite3D::create("model/gear.obj");
gear->setPosition(visibleSize.width / 2.0, visibleSize.height / 2.0);
    
// X軸、Z軸に対して30度ずつ回転
gear->setRotation3D(Vec3(30, 0, 30));
    
auto rotation = RotateBy::create(10, Vec3(0, 360, 0));
gear->runAction(RepeatForever::create(rotation));
this->addChild(gear);
```

![](http://i.gyazo.com/a409aa2973ac59cb4c9a43457d338299.gif)

回るけどなにやら回転軸がおかしい！

モデル自体のY軸ではなく、絶対座標のY軸が回転軸として使われてしまっているような挙動をする。これじゃない！


## 解決策

中のコード見て、なんとか解決しないかなぁとか、PR送ろうかなぁと思っていたんですが、なかなか手に負えず。
これは難しい問題だと思いきや、意外と簡単な方法で解決した。



```cpp
Size visibleSize = Director::getInstance()->getVisibleSize();

auto gear = Sprite3D::create("model/gear.obj");

// 空の親ノードを作る
auto wrapper = Node::create();    
wrapper->setPosition(visibleSize.width / 2.0, visibleSize.height / 2.0);

// 親ノードを回転させる
wrapper->setRotation3D(Vec3(30, 0, 30));
    
auto rotation = RotateBy::create(10, Vec3(0, 360, 0));
// 回転アニメーションは歯車に付ける
gear->runAction(RepeatForever::create(rotation));

wrapper->addChild(gear);
this->addChild(wrapper);
```

![](http://i.gyazo.com/578b6e84878f0319f2ef2bafa0dec95d.gif)
上手く行った！

空ノードを作り、そちらを回転させてから、子ノードに対して回転アニメーションを適応させたら上手く行った。

Unityとかで良くやる、Empty GameObjectでモデルをラップして回転させる、みたいなテクニックがほぼそのまま使えるようだ。
`position3D`や`rotation3D`は、なぜか`Sprite3D`ではなく`Node`のメソッドになっていたのはこういうことだったのか。


どうでもいいですけど、`cocos2d::Sprite3D`みたいなネームスペース気持ち悪いですね。3D機能が充実したら分離されるのだろうか･･････。
[Swift]Rangeを使ったforループは気をつけよう

環境：Xcode6 beta 4

```(a...b)``` や ```(a..<b)``` などのRange Operatorで、 ```startIndex``` が ```endIndex``` より大きい場合、forループで使うと無限ループになります

```swift
// 無限ループ
for i in 10..<9 {
  println(i)
}
```

直接リテラルでこのように書く人はいないでしょうが、こんなケースでは注意が必要です。

```swift
func copyArray<T>(source: [T], padding: T, length: Int) -> [T] {
  let sourceCount = source.count
  var result = [T]()
  
  for element in source {
    result.append(element)
  }
  
  // souceCount > lengthの時に無限ループ
  for _ in sourceCount..<length {
    result.append(padding)
  }
  return result
}

let threeWords = ["one", "two", "three"]
let fiveWords = copyArray(threeWords, "zero", 5) // ["one", "two", "three", "zero", "zero"]
let twoWords = copyArray(fiveWords, "zero", 2) // 無限ループ
```

こういう挙動って期待してないんですが、バグではなくて仕様なんでしょうか？
Bundler概要

---
bundlerについて分かってる風になっていたので、一度整理します。

###特徴
・Gemパッケージの種類やバージョンの管理
・複数PCで必要なGemパッケージをインストールする仕組みを提供
->チーム間で同一の開発環境を簡単に構築することが可能に。

###運用方針
基本的に、gemコマンドでインストールするのはBundlerのみで、その他のgemパッケージは、Bundler経由でインストールするという方針。

```Bash
gem install bundler
```

###Gemインストールの流れ
GemfileにインストールするGemパッケージを記述し、

```Bash
bundle install
```

を実行してインストールする。
※「Gemfile」に書かれたGemパッケージと、そのGemパッケージが依存しているGemパッケージを自動的に調べて全てインストールしてくれる。

###よく使うBundlerのサブコマンド
|コマンド| 概要|
|:--:|:--:|
|bundle init| Gemfileを生成|
|bundle install| Gemfileに書かれたgemパッケージをインストール|
|bundle exec| Bundlerでインストールされたgemパッケージを使用してコマンドを実行|
|bundle list | インストール済みのgemパッケージの一覧を表示|
|bundle update |インストール済みのgemパッケージのバージョンを更新|


###Gemパッケージの保存先

単純に

```Bash
bundle install
```

と実行されると、rbenv利用下の場合、/Users/ユーザー名/.rbenv/versions/バージョン名/lib/ruby/gems/...以下にインストールされる

bundle install --path <フォルダ名>
とすれば、指定のフォルダにインストール先を指定できる。
たとえば、

```Bash
bundle install --path vendor/bundle
```
と記述すると、railsアプリのルートディレクトリの下のvendor/bundleディレクトリにインストールされ、そのアプリケーションの中だけにインストールされる。
一度上のコマンドを実行すれば、Bundlerはインストール先を記憶するので次回以降は

```Bash
bundle install
```

を実行するだけで毎回vendor/bundleディレクトリにインストールされる。
因みに、Bundlerはgemのインストール先を、railsアプリのルートディレクトリの下の、.bundle/configというファイルで記憶している。

個別のRailsアプリにインストールされているgemの一覧を見るには以下のコマンドを使うといい。

```Bash
bundle list
```

###Gemfileとは
インストールするGemパッケージの名前とバージョンを記述するファイル。

###Gemfile.lockとは
インストールされたGemパッケージの名前とバージョンが記録されたファイル。
他の環境で同じアプリケーションの開発を行なう場合は、プログラムファイルに加えてこの「Gemfile.lock」ファイルを配布する。
そして他の環境で「bundle install」を実行すると、今度は「Gemfile.lock」ファイルが参照され、指定されたバージョンのGemパッケージがインストールされるようになる。

---

###例
Gemfileに

```Gemfile
source 'https://rubygems.org'

gem 'rails'
```
と記述し、

```Bash
bundle install
```
すると、

  * actionmailer (4.1.4)
  * actionpack (4.1.4)
  * actionview (4.1.4)
  * activemodel (4.1.4)
  * activerecord (4.1.4)
  * activesupport (4.1.4)
  * arel (5.0.1.20140414130214)
  * builder (3.2.2)
  * bundler (1.6.3)
  * erubis (2.7.0)
  * hike (1.2.3)
  * i18n (0.6.11)
  * json (1.8.1)
  * mail (2.5.4)
  * mime-types (1.25.1)
  * minitest (5.4.0)
  * multi_json (1.10.1)
  * polyglot (0.3.5)
  * rack (1.5.2)
  * rack-test (0.6.2)
  * rails (4.1.4)
  * railties (4.1.4)
  * rake (10.3.2)
  * sprockets (2.12.1)
  * sprockets-rails (2.1.3)
  * thor (0.19.1)
  * thread_safe (0.3.4)
  * tilt (1.4.1)
  * treetop (1.4.15)
  * tzinfo (1.2.1)

↑上記gemに必要な依存関係を持つこれだけのgemを勝手にインストールしてくれる。


###Railsアプリを作るとき
---
Railsアプリを作るとき、rails自体をbundleでインストールすると、railsを記述したGemfileと、railsアプリ内で作るGemfileの２つが存在することになってややこしいので、以下の手順でrails newすると良さげ。

```Bash
bundle init
```

でGemfileを生成し、Gemfileに
gem rails
を記述し、

```Bash
bundle install --path vendor/bundle
```
を実行。

ここで、

```Bash
bundle exec rails new . --skip-bundle
```

と入力すると、カレントディレクトリにrailsアプリが生成される（Gemfileは上書きされる）ので、

```Bash
bundle update
```

を実行すれば良い。

※「--skip-bundle」オプションをつけると、rails初期化時に余分なbundle installが走らないため、効率的なアプリ構築ができる。

###参考
パーフェクト Ruby on Rails
http://www.amazon.co.jp/パーフェクト-Ruby-Rails-すがわら-まさのり/dp/4774165166
【TravisCI高速化】bundle installを毎回走らせないようにキャッシュする

# はじめに
* TravisCIのbundle installに非常に時間を食ってるのでなんとかしたい
* と思ったら[こんな記事](http://bekkou68.hatenablog.com/entry/2014/04/02/210754)があったので、試してみました
* 公式文書は[こちら](http://docs.travis-ci.com/user/caching/)

# 効果
* 早くなりました！！！！
 * 16〜21分かかっていたビルドが12〜14分程度になりました

# やること
* 基本的には上にある記事のとおり、.travis.ymlに以下を追加するだけ
* ただ、bundle installをオーバーライドしているときは以下のように指定する必要がある
 * [公式サイト](http://docs.travis-ci.com/user/caching/)にも書いてあるがいくつか書き方がある
 * 必要ならばbundler_argsで--wihtoutオプションなども書いてよい

```:.travis.yml(Exsample1)
...
language: ruby
cache: bundler
bundler_args: --without production --deployment
...
```

```:.travis.yml(Exsample2)
...
language: ruby
install: bundle install --without production --deployment
cache:
  directories:
  - vendor/bundle
...
```

### bundle installをオーバーライドしているにもかかわらず、 cache: bundlerしか書いていない場合
* Travisのコンソールログの一部

```
...
setup build cache
attempting to download cache archive
could not download cache
...
```

### directoryをvender/bundleに指定した場合
* Travisのコンソールログの一部

```
...
setup build cache
attempting to download cache archive
found cache
adding /home/travis/build/[UserName]/[RepositoryName]/vendor/bundle to cache
...
```

### travisコマンドで確認
* travisコマンド入れてなければインストールしてください
 * ```$(sudo) gem install travis```

```
$ travis login
$ travis cache
On branch [BranchName]:
cache--rvm-1.9.3--gemfile-Gemfile  last modified: 2014-07-22 11:28:09  size: 156 B

Overall size of above caches: 156 B
```

# 最後に、、、一人ではまっていたところ
* キャッシュは見つかったしvendor/bundleにも配置も出来ているとコンソールには出ているのにキャッシュが効いてくれなかった
* 以下のような書き方をしていた

```:.travis.yml
...
language: ruby
install: bundle install --without production --path vendor/bundle
cache:
  directories:
  - vendor/bundle
...
```

* つまりは--deploymentオプションが必要だった
 * [bundlerでの運用方法](http://qiita.com/hazy_moon/items/ea6fdbc058256bbaafe0)に詳しく書いてあった

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Vagrant + VirtualBox ~ Centos6.5 64bit インストール　windows編

# WindowsへVagrantインストール

**前提条件**
VirtualBoxインストール済み。

* msiのダウンロード
以下からWindows用ファイルをダウンロードして実行して下さい。
> http://www.vagrantup.com/
 
* インストール確認
>$ vagrant -v
Vagrant 1.6.3

# 仮想マシンの作成
Vagrantでは[box]という仮想マシンのイメージを作成する事で簡単に複数の仮想マシンを作成できます。

* vagrantにcentosのboxを追加

* 追加したboxから仮想マシンを作成して起動

## boxの追加
* vagrantにCentos6.5のbox追加
以下から、作成したいOSを選択してURLをコピーします
> https://vagrantcloud.com/ 

* centos6.5の64bitがほしかった！
> https://vagrantcloud.com/nrel/CentOS-6.5-x86_64

* 必要なURL
[version]をクリックして
URLをコピーして下記コマンドを実行します。
※URLの前は、任意に設定できるBoxの名前です。
※今回は「centos6.5_x86_64」としてみました。
>$ vagrant box add centos6.5_x86_64 https://vagrantcloud.com/nrel/CentOS-6.5-x86_64/version/4/provider/virtualbox.box

* 確認
>$ vagrant box list
centos6.5_x86_64 (virtualbox,0)

### VMの作成

* 作成
VMを作成する場所へ移動し、以下のコマンドを実行。

> $ vagrant init centos6.5_x86_64

準備が完了!

### VMの起動
>$ vagrant up

* 接続
puttyで接続してみる。

> IP 127.0.0.1
PORT 2222

OK!!!

以下、その他のコマンドです。

* VMの再起動
>$ vagrant reload

* VMの終了
>$ vagrant halt

* VMの状況の確認
>$ vagrant status

お疲れ様でした♪

# 備考
その後、出会した現象と回避サイトの紹介

* vagrantで実行したrailsにhost側からアクセスする
ポートフォワーディングをしないといけないらしい。
http://harapeko.wktk.so/blog/ruby/2013-11-22/1715

* vagrantで起動中のmysql にアクセスする
http://terurou.hateblo.jp/entry/2013/09/10/151744
Java 1.6系でStringSwitch

```lang:StringSwitch.java
enum TEST
{
    TEST1, TEST2, TEST3
};

String s = "TEST1";
TEST hogeVal = null;
try
{
    hogeVal = TEST.valueOf( s );
    switch( hogeVal )
    {
        case TEST1:
            // "TEST.TEST1"の処理
            break;
        case TEST2:
            // "TEST.TEST2"の処理
            break;
        case TEST3:
            // "TEST.TEST3"の処理
            break;
        default:
            break;
    }
}
catch( IllegalArgumentException ex )
{
    // enumに無い文字列が含まれている場合の処理を記述
}
'''
Chrome で body のマージンがゼロで可視な要素がすべて fixed だと印刷できない

できません。

```html
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style>
        body {
            margin: 0;
        }
        .a {
            position: fixed;
            left: 20px;
        }
        .b {
            position: fixed;
            left: 40px;
        }
    </style>
</head>
<body>
    <div class="a">A</div>
    <div class="b">B</div>
</body>
</html>
```

どうやら body の高さ（あるいは html の高さ？）がゼロになるからのようです。

適当な縦のマージンを指定したり、

```html
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style>
        body {
            margin: 1px 0;
        }
        .a {
            position: fixed;
            left: 20px;
        }
        .b {
            position: fixed;
            left: 40px;
        }
    </style>
</head>
<body>
    <div class="a">A</div>
    <div class="b">B</div>
</body>
</html>
```

もしくは、なにかしら body の高さを伸ばす要素があれば印刷できます。

```html
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style>
        body {
            margin: 0;
        }
        .a {
            position: fixed;
            left: 20px;
        }
        .b {
            position: fixed;
            left: 40px;
        }
        .hidden {
            visibility: hidden;
            height: 1px;
        }
    </style>
</head>
<body>
    <div class="a">A</div>
    <div class="b">B</div>
    <div class="hidden"></div>
</body>
</html>
```
iOS対応ストリーミングをプライベート(制限付き)に対応

この記事は、 [AWS S3 + CloudFront で動画ストリーム](http://qiita.com/terapyon/items/b77ac981da790662e247) に関連する続きです。


# 目的

- ストリーミングをiOSに対応 [事前調査はこちら](http://qiita.com/terapyon/items/e4925c15c7ee58778f92)
- プライベート(閲覧制限あり)にCloudFrontで配信 [事前調査はこちら](http://qiita.com/terapyon/items/ff2dd73bd479fbd44e82)
- iOS用にHLSに対応させつつ、プライベート最新を実現 <今回はこれが主目的

# 方法

## JAWS Days 2014 の発表に方法が記載されています。

[CloudFrontで実現するセキュアコンテンツ配信と効果のトラッキング](http://www.slideshare.net/kkitasako/jawsdays2014-cf) のp17に記述があります。

## Signed URLの生成

Signed URLはURL個々にワンタイムURLを生成して、一定時間閲覧を解除しますが、ワイルドカードでURLを指定でき、それを用いることで、 .ts ファイルを含むディレクトリに対して有効な署名を手に入れることが出来るようです。

http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html

boto (Pythonモジュール)の場合、create_signed_urlメソッドに、policy_url (str)を与えれば生成可能。 
http://boto.readthedocs.org/en/latest/ref/cloudfront.html

## マニフェストファイルの書き換え

先に紹介した、JAWS Daysの資料によると、 .m3u8 という拡張子のマニュフェストファイル内の .tsファイルのURIを、ドメインを付加して、さらにSigned URLにして書き換えるというものです。

これを動画閲覧のタイミングで動的に行えば可能になる。

マニフェストファイルは以下の様な簡単なフォーマットだったので、 "#" から始まらない行を書き換えれば良さそう。(簡単なパーサで実現可能)

```マニフェストファイルの例.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:11
#EXTINF:10.866922,
hls_400_00000.ts
#EXTINF:10.817778,
hls_400_00001.ts
#EXTINF:10.815044,
hls_400_00002.ts
.
.
.
#EXT-X-ENDLIST
```

## マニフェストファイルの動的書き換え

これをどこで、どのタイミングで行うかが悩みどころ・・。

検討している方法としては、アプリケーションサーバ(今回はPloneを想定)で、S3(又はCloudFront)から、オリジナルマニフェストを取得し、Signed URLに書き換えて、それを配信。

URLにアクセスが有るたびに、毎回この書き換えを行う付加がどのくらいかの検討が必要そう。とくに、PCアクセスの場合は、HLSではなく、RTMPでの閲覧になるのでこの変換が不要。

アプリケーションサーバのマニフェストファイルへのアクセスが発生した時に行えば、RTMPの時は不用意に変換する必要がないので、問題が無いかも。(Video.jsが2つのSourceを選択してくれるので、これで大丈夫そうな気がしてきた)

# まとめ

各種技術を統合することで、希望の機能の実装が実現できそうな状況になったと思う。
実際には、この方法でストリーミングが出来るかどうかを実験してみようと思う。

# TODO

- Signed URL Custom Policy (ワイルドカードで許可コンテンツの指定) を試す
- マニフェストファイルを書き換えて対応可能かどうか実験
Underscore.jsのtemplateの埋め込み変数スニペット

Underscoreのtemplateを記述する際、変数を埋め込むためのタグを書くのが面倒だったので、SublimeTextのsnippetとして登録してみた。

```xml:underscore-template-with-escape.sublime-snippet
<snippet>
    <content>
        <![CDATA[<%- ${0:value} %>]]>
    </content>
    <tabTrigger>%-</tabTrigger>
    <scope>text.html</scope>
    <description>Underscore.js template with escape &lt;%- %&gt;</description>
</snippet>
```

僕はあまり使わないけど非エスケープの方も。

```xml:underscore-template.sublime-snippet
<snippet>
    <content>
        <![CDATA[<%= ${0:value} %>]]>
    </content>
    <tabTrigger>%=</tabTrigger>
    <scope>text.html</scope>
    <description>Underscore.js template &lt;%= %&gt;</description>
</snippet>
```
Docker Hub を始める - Docker User Guide


# Docker Hub を始める

Getting Started with Docker Hub - Docker Documentation
http://docs.docker.com/userguide/dockerhub/

## Docker Hub 入門

このセクションは、[Docker Hub](https://hub.docker.com/) の入門について、そして、どのようにアカウントを開設するかを扱います。

[Docker Hub](https://hub.docker.com/) は Docker とそのコンポーネントを使うために作られた中央集権型リソースです。Docker Hub は仲間と協力して、Docker を最大限に利用することを送信します。そこでは、例えば次のサービスを提供します。

* Docker イメージのホスティング
* ユーザ認証
* イメージの自動ビルドと、ビルドをトリガにしてウェブにフックするようなワークフロー・ツール
* GitHub と BitBucket の統合化

Docker Hub を使うためには、はじめに登録を行い、アカウントを作成する必要があります。心配しないでください、アカウント作成は簡単で無料です。

## Docker Hub アカウントの作成

Docker Hub アカウントを使うには２つの方法があります。

1. ウェブ経由、または
2. コマンドライン経由です。

### ウェブ経由の登録

[入力フォーム](https://hub.docker.com/account/signup/)に、ユーザ名とパスワード、指定のメールアドレスを全て記載します。Docker Weekly メーリングリストの購読も出来ます。内容は、Docker の世界で何が起こっているかという、様々な情報です。

### コマンドラインでの登録

Docker Hub アカウントを、コマンドライン上で docker login コマンドを使っても作成できます。

```
$ sudo docker login
```

### メールアドレスの確認

フォームに入力すると、ウェルカムメッセージや有効化の確認メールが、あなたのアカウントに届きます。

### ログイン

確認手続きが終われば、ウェブ・コンソールにログイン出来ます。
あるいは、`docker login` コマンドを使います：

```
$ sudo docker login
```

これで、あなたの Docker Hub アカウントは有効化され、自由に使えるようになります。

## 次のステップ

次は、どのように "Hello World" というアプリケーションを Docker 化するかの練習です。

[Dockerizing Application](http://docs.docker.com/userguide/dockerizing) に移動します。
ソフトウェア毎の脆弱性を調べるには CVE Details が便利

あるソフトウェアの脆弱性の履歴を調べたいときには
http://www.cvedetails.com/
が便利。
これの左カラムにある 「Product Search」で検索できる。

Product Nameはちょっと癖あるので注意
例えば Apache httpdなら「Http Server」
Javaなら「JDK」「JRE」
とか
Oracleの統計情報

# テーブルの統計情報作成

```sql
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(
      OWNNAME      => オーナー名
    , TABNAME      => テーブル名
    , METHOD_OPT   => 'FOR ALL INDEXED'
    , CASCADE      => TRUE or FALSE -- インデックス情報も同時に作成する場合は「TRUE」作成しない場合は「FALSE」
  );
END;
```

使用例：オーナー名がSAMPLEのFOOテーブルの統計情報を作成する場合(インデックス情報も同時に作成する)

```sql
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(
      OWNNAME      => 'SAMPLE'
    , TABNAME      => 'FOO'
    , METHOD_OPT   => 'FOR ALL INDEXED'
    , CASCADE      => TRUE
  );
END;
```

# テーブルの統計情報確認

```sql
SELECT
  TABLE_NAME NAME
  , LAST_ANALYZED
FROM
  USER_TABLES
WHERE
  TABLE_NAME = テーブル名
```

使用例：FOOテーブルの統計情報があるか確認する(LAST_ANALYZEDがNULLの場合は統計情報が存在しない)

```sql
SELECT
  TABLE_NAME NAME
  , LAST_ANALYZED
FROM
  USER_TABLES
WHERE
  TABLE_NAME = 'FOO'
```

# インデックスの統計情報確認

```sql
SELECT
  INDEX_NAME NAME
  , LAST_ANALYZED
FROM
  USER_INDEXES
WHERE
  INDEX_NAME IN (インデックス名1, インデックス名2)
```

使用例：IDX_FOO_PKとIDX_FOO_1のインデックス情報を確認する場合

```sql
SELECT
  INDEX_NAME NAME
  , LAST_ANALYZED
FROM
  USER_INDEXES
WHERE
  INDEX_NAME IN ('IDX_FOO_PK', 'IDX_FOO_1')
```

# テーブルの統計情報削除


```sql
BEGIN
  DBMS_STATS.DELETE_TABLE_STATS(オーナー名, テーブル名);
END;
```

使用例：オーナー名がSAMPLEのFOOテーブルの統計情報を削除する場合

```sql
BEGIN
  DBMS_STATS.DELETE_TABLE_STATS('SAMPLE', 'FOO');
END;
```
メモ：Gruntfileをいじったあと実行してエラーが出たときの対処

GruntFileをいじっていて

```
(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
```

のようなエラーが出たとき、grunt.registerTaskで登録したタスクの名前をが原因でエラーが出ているっぽい。
タスクの名前を変えると解消される。
何故そうなるかは調べられていない。
Eclipse が起動しない

時々Eclipseが起動しなくなることがあるのですが、
毎回Loading中の ...task.ui という箇所でフリーズしたままアプリが応答しなくなります。
なぜなのか？

発生条件
---

1. Mavenプロジェクトであること
2. プロジェクトのソースを１つ以上開きっぱなしにする
3. Eclipseを終了する


この条件の場合、結構な確率でEclipseが起動できなくなります。

MacのバージョンとEclipseのバージョンは関係ない気がします。(他のバージョンでも同じ現象が起きるので)
なぜ起きるのか不明です...

解決策(対処法)
---

Mavenが悪さをしているようなので.m2というMavenのリポジトリインデックスファイルを消します。

`% rm -rf .m2`

その後、Eclipseを起動するとMavenプロジェクトに「!」マークがついてるので、Mavenプロジェクトのアップデートをします。

>プロジェクト右クリック -> Maven -> Update Project

これで元通り。

ちゃんとした解決策があれば教えていただきたい。
exe実行時コマンドプロンプトを非表示

参考:[console - How do I create an executable from GoLang that doesn't open a command (cmd) window when run? - Stack Overflow](http://stackoverflow.com/questions/23250505/how-do-i-create-an-executable-from-golang-that-doesnt-open-a-command-cmd-wind)

```bash:
GOOS=windows GOARCH=386 go build -ldflags -H=windowsgui document_root.go
```

人のPCに[golangのwebサーバでDirectoryIndexを使う - Qiita](http://qiita.com/tukiyo3/items/3938a4a0c9a94bafb9f3)をこの方法でexe化しスタートアップに忍ばせることは辞めましょう。
古いディストロでGNU screenの表示が残念になったとき

古いディストロでGNU screenを使った時に256色表示がされず白黒になったので調べてみた結果。

* [Cent OS 5.8 に screen-256color を解釈させる](http://ks0608.hatenablog.com/entry/2012/04/28/145022)

どうやら`screen-256color`を認識していないらしい。

```text:.screenrc
term screen-256color
```

確認してみる。

```shell-session
$ infocmp screen-256color
```

見事に「そんなものはない」と言われたので自分で作る。適当なディレクトリに`screen-256color.terminfo`というファイルを書く。

```text:screen-256color.terminfo
screen-256color|GNU Screen with 256 colors,
  use=xterm-256color,
```

`tic`コマンドでコンパイルする。自動的に`$HOME/.terminfo/s/screen-256color`というファイルが作られて出来上がり。

```shell-session
tic screen-256color.terminfo
```

256表示は次のようにして確認できる。(はずだが、古いディストロではサーバー証明書が...)

```shell-session
wget https://github.com/zhengkai/config/raw/master/script/256colors2.pl
perl ./256colors2.pl
```
テストランナーkarmaをとりあえず使ってみる方法

AngularJSでよく使われている
テストランナー[karma](http://karma-runner.github.io/0.12/index.html)の使い方。

## install

```js
$ npm install -g karma
```

## configファイルの作成

```bash
$ karma init
Which testing framework do you want to use ?
Press tab to list possible options. Enter to move to the next question.
> jasmine # 選択肢がある場合は、タブで切り替えが出来る
```

### 用意するファイルの例

```js:karma.conf.js
module.exports = function(config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine'],
    files: [
      'app.js',
      'app_test.js'
    ],
    reporters: ['progress'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: true
  });
};
```

```js:app.js
var Foo = function() {
};
Foo.prototype.sum = function(x, y) {
  return x + y;
};
Foo.prototype.div = function(x, y) {
  return x / y;
};
```

```js:app_test.js
describe('Foo', function() {
  it("2 plus 3 is 5", function() {
    var foo = new Foo();
    expect(foo.sum(2,3)).toBe(5);
  });
  it("10 divided 5 is 2", function() {
    var foo = new Foo();
    expect(foo.div(10,5)).toBe(2);
  });
});
```

## 実行

```
$ karma start
```
Docker ドキュメント - Docker User Guide

# Docker ドキュメント

Docker Documentation
https://docs.docker.com/

## Docker について

開発して、移動して、実行する。あらるアプリケーションを、どこへでも。

Docker は、開発者やシステム管理者のためのオープンなプラットフォームで、構築、発送し、配付されたアプリケーションを実行します。Docker は、コンポーネントからアプリケーションの素早いアセンブルと、コードを発送するときに起こる摩擦を取り除きます。Docker によって、コードのテストや本番環境 ( production ) への展開を、可能な限り速く行います。

Docker の構成：

*　Docker エンジン - 軽量でパワフルなオープンソースのコンテナ仮装化技術を、アプリケーションの構築やコンテナ化の作業手順（ワークフロー）と連びつつけるものです。

* [Docker Hub](https://hub.docker.com/) - アプリケーション群を共有・管理する SaaS サービスです。


## なぜ Docker なのか？

なぜ Docker なのか？

アプリケーションの素早い移動

* 私たちは仕事の環境を良くしたい。Docker コンテナと作業手順にによって、簡単にコードを本番環境に持って行けるので、開発者、システム管理者、品質管理 forks、そしてリリースエンジニアが一緒に働けるようになります。私たちは標準的なコンテナ書式を作ったことで、開発者はコンテナの中のアプリケーションのみに注力し、システム管理者やオペレータが開発済みのコンテナを実行させられるようにします。この職掌分散の合理化と単純化は、コードの管理と展開を合理化します。

* 私たちは、新しいコンテナの構築を簡単にしますので、あなたのアプリケーションを迅速に繰り返したり、可視性を増やすことを容易にします。これにより、あなたの組織の誰もが、どのようにアプリケーションが動作し、どのように構築されたかが理解できるようになるのを助けます。

* Docker コンテナは軽量で速い！ コンテナは数秒で起動するので、開発のサイクル時間や、テスト、デプロイの時間を減らします。


デプロイ（展開）とスケールを簡単に

* Docker は、（ほとんど）どこでも動作します。コンテナをデスクトップ上や、物理サーバ、仮想マシン、データセンタ、あるいは公開・非公開クラド上で展開できます。

* Docker は多くのプラットフォームで動作するので、自分のアプリケーションを周辺に移動するのも容易です。必要があれば、いつでもクラウド上のテスト環境から、アプリケーションを簡単に差し戻せます。

* Docker 社の軽量コンテナ Docker はまた、スケールアップやダウンを迅速かつ簡単に行えます。迅速に沢山のコンテナを起動できますし、それらが必要なくなれば、シャットダウンさせることもできます。

高い密度と、より多くの作業手順（ワークフロー）

* Docker コンテナはハイパーバイザーを必要都しないので、ホスト上に多くを詰め込むことが出来ます。これが意味するところは、より各々のサーバの価値を上げ、機材やライセンスの浪費を減らすかもしれません。

より速い展開管理を簡単にする。

* Docker によって作業手順（ワークフロー）の速度が向上するので、ビッグバンのような巨大な更新を行うよりも、小さな変更を沢山行えます。小さな変更というのは、リスクの減少と、より稼動時間が増える事を意味します。
Docker とは - Docker User Guide

# Docker とは何か？

What Is Docker? An open platform for distributed apps
http://www.docker.com/whatisdocker/

## Docker とは

Docker は開発者やシステム管理者向けのオープンなプラットフォームであり、構築(build)・出荷(ship)し、配付されたアプリケーションを実行(run)します。Docker エンジンを構成するのは、ポータブルで、軽量なランタイムとパッケージング用のツールです。そして、Docker Hub というアプリケーション共有と自動化ワークフローを行うクラウドサービスによって、Docker はアプリケーションをコンポーネントから迅速に構成するようにしたり、開発・QA（品質）・本番環境（Production environments）それぞれの間の摩擦を取り除きます。その結果、IT によって(Dockerによって？)、ノート PC やデータセンタの仮想マシンや、その他のクラウドでも、迅速な配置や、同じアプリケーションを、変更せずに実行出来ます。

[Docker 社創設者＆CTO による Docker 紹介ビデオ 7分16秒](https://www.youtube.com/watch?v=ZzQfxoMFH0U)

## 開発(developers)から好かれる理由

開発者が Docker を使えば、あらゆる言語のアプリケーションや、様々な toolchain で構築できます。"Dockerized" (Docker 化) されたアプリケーションは、完全な携帯性（ポータビリティ）があるので、どこでも実行することができます。例えば、同僚の OS X と Windwos ノート PC や、クラウド上の Ubuntu で稼働する QA サーバや、プロダクション（本番用）のデータセンタで稼働する Red hat の仮想マシンです。

開発者は、Docker Hub 上で利用可能な、13,000 以上のアプリケーションのなかから１つのアプリを、迅速に使い始めることができます。Docker は、変更の追跡と依存関係を管理するので、システム管理者が、開発者がどのようにアプリケーションを構築しているかの理解が簡単になります。そして、Docker Hub を使う事で、開発者は構築パイプラインを自動化し、公開または非公開レポジトリを通して協力しながら、共有することができるのです。Docker は、開発者は高品質のアプリケーションの構築と出荷 (ship) を、素早く行えるのを助けます。

## システム管理者(sysadmins)から好かれる理由

どうしてシステム管理者が好むのか？システム管理者が Docker を使う事で、開発や、QA や、プロダクションチーム向けの標準化された環境を提供する事ができるので、「自分のマシンで仕事する」時の課題を減らす事ができます。Docker 化されたアプリケーションのプラットフォームと、依存関係によって、システム管理者は、OS ディストリビューションと、下で動く基盤を切り離して管理できます。

さらに、Docker エンジンによる標準化によって、デプロイ単位で、システム管理者は柔軟にワークロードを走らせることができます。オンプレミスのベアメタルや、データセンタの仮想マシンや、パブリッククラウドのいずれであっても、インフラ基盤技術と、そこに含まれるビジネス優先度とポリシーによる作業負荷に縛られるのを減らします。その上さらに、Docker エンジンは軽量なランタイムによって、迅速なスケールアップやスケールダウンを、需要の変化に応じて出来るようにします。

Docker は、システム管理者があらゆるインフラ基盤において、迅速かつ信頼をもって、あらゆるアプリの展開と実行ができるのです。

## 仮想マシンとの違いとは？

### 仮想マシン

仮想化されたアプリケーションの中には、10 MB 程度のアプリケーションだけではありません。必要なライブラリやバイナリだけでなく、10 GB 以上の、ゲスト OS 全体も必要になるのです。

### Docker

Docker エンジンが扱うコンテナは、アプリケーションと依存関係のあるもののみです。実行時のプロセスはホスト OS によって分離され、他のコンテナ間で kernel を共有します。つまり、リソースの分離と VM の便利さを持ちながら、可搬性（ポータビリティ）と効率性を持っています。
Windows Driver Kit (WDK) の取得先


[Windows SDK/Platform SDK の バージョン と ダウンロードURL [Windows 8.1対応版] | tech@winginfo](http://techwing.wordpress.com/2013/11/28/windows-sdkplatform-sdk-%e3%81%ae-%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3-%e3%81%a8-%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89url-windows-8-1%e5%af%be%e5%bf%9c/ "Windows SDK/Platform SDK の バージョン と ダウンロードURL [Windows 8.1対応版] | tech@winginfo")
がとても便利だったので Windows Driver Kit (WDK) のバージョンとダウンロード URL をまとめました。

| Version      | Build        | Name                                 | ダウンロード |
|--------------|--------------|--------------------------------------|------------|
|              | 6000         | Windows Driver Kit for Windows Vista | MSDN Subscriber Download |
|              | 6001.18001   | Windows Driver Kit – Server 2008     | MSDN Subscriber Download |
|              | 6001.18002   | Windows Driver Kit – Server 2008 Release SP1 | MSDN Subscriber Download |
| 7.0.0        | 7600         | Windows Driver Kit for Windows 7 and Windows Server 2008 R2 | MSDN Subscriber Download |
| 7.1.0        | 7600.16385.1 | Windows Driver Kit Version 7.1.0 | [ここから](http://www.microsoft.com/en-us/download/details.aspx?id=11800 "Download Windows Driver Kit Version 7.1.0 from Official Microsoft Download Center") |
| 8            |              | Windows Driver Kit 8             | [ここから](http://go.microsoft.com/fwlink/p/?LinkID=324284)
| 1            |              | Windows Driver Kit 8.1           | [ここから](http://www.microsoft.com/en-us/download/details.aspx?id=42644 "Download Windows Driver Kit (WDK) 8.1 from Official Microsoft Download Center") |
| 8.1 Update 1 |              | Windows Driver Kit 8.1 Update 1  | [ここから](http://www.microsoft.com/en-us/download/details.aspx?id=42273 "Windows Driver Kit 8.1 Update 1 ") |
|              |              | Windows Driver Kit (WDK) 10      | [ここから](https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk) |


WDK 8, WDK 8.1 はサポート対象外。WDK 8.1 Update 1 を利用することが推奨されている。


## 参考

* [Windows Driver Kit (WDK) (Windows Drivers)](http://msdn.microsoft.com/ja-jp/library/windows/hardware/ff557573(v=vs.85).aspx "Windows Driver Kit (WDK) (Windows Drivers)")
* [Windows Driver Kit (WDK) と Debugging Tools for Windows (WinDbg) のダウンロード](http://msdn.microsoft.com/ja-jp/windows/hardware/hh852365 "Windows Driver Kit (WDK) と Debugging Tools for Windows (WinDbg) のダウンロード")
ログアウト時にコマンドhistoryを取得

外部の人にsshさせるときhistoryが気になりますよね。
本番環境でわざわざchshする人はいないと思うので。

```bash:/home/チェック対象/.bash_logout
history | tac | mail -s "${HOSTNAME}: ${USER}" security
```

自分自身のログインにも仕込んでおいて、コマンドを思い出したりしています。
enumのコンストラクト、++演算、変換関数

列挙体にもコンストラクタがあるのを知った。

```cpp
enum Nums{ one = 1, two, three };
Nums( e + 1 ); // eはNums型の変数
```

これが便利なのは列挙型の戻り型、または参照仮引数をもつ関数で初期化できる。

```cpp
enum Nums{ one = 1, two, three };
Nums operator++( Nums& n )
{
	n = ( n == three ) ? three : Nums( n + 1 );
	return n;
}
```
注：このサンプルは「ストラウストラップのプログラミング入門」にあるサンプルと同じ内容のもの。


　決定的に重要なのは列挙型の戻り型、または参照仮引数をもつ関数で初期化できるということ。
つまり、代入演算子の左辺にある列挙型オブジェクトを右辺の列挙型を返す関数で初期化できる。
あるいは ()演算子で初期化できる。


簡単なサンプルを示す。

```cpp
struct Set
{
	enum Nums{ one = 1, two, three };
 
	// 変換関数(intに変換)
	int operator()( Set::Nums& n )
	{
		int c = n;
		return c;
	}
};

// 列挙子のインクリメント
Set::Nums operator++( Set::Nums& n )
{
	n = ( n == Set::three ) ? Set::three : Set::Nums( n + 1 );
	return n;
}

int main()
{

	Set::Nums n(Set::one);
	Set t;
 
	++n;
 
	//intに変換して出力
	std::cout << t(n) << std::endl;
 	return 0;
}
```
SkyDNS2のセットアップ方法

## 概要
SkyDNS2 の実行環境を構築し、実行するまでの手順のまとめ。前提条件としての Etcd の環境構築と、SkyDNS の構築手順を含む。ただし、SkyDNS の実行や Etcd の運用に関する技術は扱わない。

また、当文章における `SkyDNS` とは、特に明示が無い限り2014年6月に再構成された `SkyDNS2` を指す。SkyDNS2 は、サービス検出(Service Discovery)と告知(Announcement)をするシステムで、GitHub 上のプロジェクト https://github.com/skynetservices/skydns である。元々 SkyDNS として公開されていた [SkyDNS1](https://github.com/skynetservices/skydns1) とは構造が異なる。大きく違うのは、データ保存のバックエンド・システムは Etcd に全面依存している。

### Consul と SkyDNS の違い

Consul と SkyDNS は、どちらもサービス検出(Service Discovery)を行う事ができる。前者がオーケストレーションツールであるのに対し、SkyDNS はサービス検出と DNS 回答に特化している。Consul は独自で KVS を持つが、SkyDNS はバックエンドに Etcd を採用している。いずれも Raft プロトコルによるデータ永続性を保証。

詳細：Consul vs. SkyDNS - Consul
http://www.consul.io/intro/vs/skydns.html

## 構築に必要な環境

* Go 言語の開発環境 version 1.2 以上

## 構築手順

SkyDNS を実行する為には、バックエンドである Etcd のセットアップが必須である。そのため、作業の流れは Etcd の構築の後、SkyDNS を構築する。

### 1. Etcd のセットアップ

#### バイナリを使う方法(v.0.4.5 / x86_64)

```
curl -o etcd-v0.4.5-linux-amd64.tar.gz \
    -L https://github.com/coreos/etcd/releases/download/v0.4.5/etcd-v0.4.5-linux-amd64.tar.gz
tar xvfz etcd-v0.4.5-linux-amd64.tar.gz
sudo cp etcd-v0.4.5-linux-amd64/etcd /usr/bin/etcd
```


#### コードから構築する方法

```
git clone https://github.com/coreos/etcd
cd etcd
./build
sudo cp ./bin/etcd /usr/bin/etcd
```

### 2. SkyDNS のセットアップ

```shell-session
[zem@sakura1 go]$ go get -d -v github.com/coreos/go-etcd/etcd
github.com/coreos/go-etcd (download)
[zem@sakura1 go]$ go get -d -v github.com/skynetservices/skydns
github.com/skynetservices/skydns (download)
github.com/coreos/go-log (download)
bitbucket.org/kardianos/osext (download)
github.com/coreos/go-systemd (download)
github.com/miekg/dns (download)
github.com/miekg/go-metrics (download)
github.com/influxdb/influxdb (download)
github.com/rcrowley/go-metrics (download)
github.com/stathat/go (download)
[zem@sakura1 go]$ cd ~/go/src/github.com/skynetservices/skydns/
[zem@sakura1 skydns]$ go build
[zem@sakura1 skydns]$ sudo cp ./skydns /usr/bin/skydns
```

## 起動手順
Etcd が稼働した状態で、SkyDNS の起動を試みること。

```text:etcd起動例
# etcd -peer-addr 127.0.0.1:7001 -addr 127.0.0.1:4001 \
    -data-dir /opt/etcd -name machine1
```

```text:skydns起動例
# export ETCD_MACHINES='http://127.0.0.1:4001'
# skydns
```
なお、デフォルトでは Port 53 を使用とするが、ポート重複を避けたい場合は `skydns -addr=127.0.0.1:10053` のように実行する。

### skydns の起動時オプション

* `addr`: SkyDNS がリッスンする IP:port の情報で、デフォルトは `127.0.0.1:53`
* `domain`: SkyDNS に権威があるドメインで、デフォルトは `skydns.local.`
* `dnssec`: DNSSEC を有効化
* `hostmaster`: hostmaster(管理者)が使うメールアドレス
* `local`: skydns インスタンス向けの、オプションのユニーク値であり、デフォルトは none。この状態では `local.dns.skydns.local` を返す。
* `round_robbin`: A や AAAA レコードの応答をラウンドロビンによる並び替えを有効化します。デフォルトは true.
* `nameservers`: ドメインの権威が無い問い合わせが届いた時、DNS リクエストを指定したネームサーバ（IP:ポート の組み合わせの配列）に転送します。
* `read_timeout`: ネットワーク読み込みのタイムアウトで、etcd に DNS 問い合わせを行う時のもの
* `ttl`: ノードが etcd にセットされてから応答するまでのデフォルト TTL 秒で、デフォルトは 3600。
* `min_ttl`: NXDOMAIN 時の最小 TTL 秒を指定します。デフォルトは 30。
* `scache`: DNSSEC シグニチャ・キャッシュの上限値で、指定しない場合のデフォルとは 10,000 レコード。
* `rcache`: レスポンス・キャッシュの上下値で、指定しない場合のデフォルトは 0 。
* `rcache-ttl`: レスポンス・キャッシュの TTL で、指定しない場合のデフォルトは 0。
soxで全部の音をノーマライズ


## soxをインストール

	brew install sox

## スクリプト

```zsh:normalize.zsh
#!/bin/zsh

# NEED sox
# brew install sox

EXPORT_DIR=normalized

# input folder
function mkdir_ex() {
    # create folder
    if [ ! -d $1 ]
    then
        mkdir $1
    fi
}
# normalize
function normalize() {
  sox $1 $EXPORT_DIR/$1 norm -1
}

mkdir_ex $EXPORT_DIR

while [ "$1" != "" ]
do
  normalize $1
  shift
done

```

## 使い方

```zsh:usage.zsh
./normalize.zsh *.aif
```
C-x b で存在しないバッファを指定した時に新規バッファで開くようにする

# はじめに
GNU Emacs 24.3.1を使用しているが、C-x bで存在しないバッファを指定するとミニバッファにQuitと表示され、新規バッファを生成してくれなくなった。
以前は新規バッファを生成してくれたと思うんだが…

# 原因
いろいろ調べた結果、\*scratch\*バッファでswitch-to-bufferを評価すると新規バッファを生成してくれるのに対し、M-x switch-to-buffer や C-x b の時は生成してくれない事がわかった。
switch-to-buffer内で使用されている read-buffer-to-switch が原因っぽい。
代用として、read-buffer を使うと問題なさそうだ。
そこで新しい関数 switch-to-buffer-extension を作成し、その中でswitch-to-bufferを呼ぶことにした。

# .emacs.elに追加したもの
```el:.emacs.el
;; switch-to-buffer で 存在しないバッファ名を指定した時に新規バッファとして開けるようにする。
(defun switch-to-buffer-extension (prompt)
	(interactive
	 (list (read-buffer "Switch to buffer: " (other-buffer (current-buffer)))))
	(switch-to-buffer prompt))
(global-set-key "\C-xb" 'switch-to-buffer-extension)
```

# C-x bはそのままがいいけど新規バッファは簡単に作りたい方へ
http://noqisofon.hatenablog.com/entry/20101102/1288647885
のやり方でいいと思いますまる
Amazon Linux AMIにZabbix 2.2をRPMパッケージでインストールする

はじめに
========

[Zabbix開発元（Zabbix SIA.）が公開しているRed Hat Enterprise Linux 6用RPMパッケージ](http://repo.zabbix.com/zabbix/2.2/rhel/6/)のSPECファイルを基にして、Amazon Linux AMI 2014.03上でビルドしたZabbix 2.2系/x86_64のRPMパッケージを作成しました。

私個人が使うためにビルドしていますが、もしかしたら有意義かもしれないのでインターネット上に公開しています。もちろんyumリポジトリーもあります。

インストール
============

### yumリポジトリーの設定

はじめにyumリポジトリーの設定ファイルが含まれているRPMパッケージ「ec2-zabbix-release」をインストールします。

* http://www.beering.jp/repos/amzn/1/x86_64/Packages/ec2-zabbix-release-1.1-1.ec2.noarch.rpm

```shell-session:コマンドライン
$ sudo rpm -ivh http://www.beering.jp/repos/amzn/1/x86_64/Packages/ec2-zabbix-release-1.1-1.ec2.noarch.rpm
```

RPMパッケージに署名しているGnuPG鍵については後述。ec2-zabbix-releaseパッケージには（EPELなどと同じような形で）同梱済み。

または、/etc/yum.repos.d/ec2-zabbix.repoなどの適切な名前で次のようなファイルを作成します。（こちらはgpgcheckをしない設定例を挙げています）

```:/etc/yum.repos.d/ec2-zabbix.repo
[ec2-zabbix]
name=Zabbix for Amazon Linux AMI $releasever - $basearch - unofficial
baseurl=http://www.beering.jp/repos/amzn/1/$basearch/Packages
enabled=1
# gpgcheck=1
# gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ec2-zabbix-amzn1
gpgcheck=0

[ec2-zabbix-source]
name=Zabbix for Amazon Linux AMI $releasever - $basearch - Source - unofficial
baseurl=http://www.beering.jp/repos/amzn/1/Source/SPackages
enabled=1
# gpgcheck=1
# gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ec2-zabbix-amzn1
gpgcheck=0

```

### Zabbixサーバーのインストール（MySQLを使う場合）

ZabbixサーバーのデータベースとしてMySQLを使う場合は、zabbix-server-mysqlパッケージをインストールしてください。また、ウェブインタフェースのパッケージzabbix-web-mysqlもインストールしてください。

ウェブインタフェースの言語を「日本語」にする場合はzabbix-web-japaneseパッケージも併せてインストールすることをお薦めします。

```shell-session:コマンドライン
$ sudo yum install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese
```

あるいは次のURLからRPMパッケージを取得してください。

* http://www.beering.jp/repos/amzn/1/x86_64/Packages/

インストールした後はいつもの通り設定してください。Zabbix 2.2のドキュメント「[3.3 Installation from packages](https://www.zabbix.com/documentation/2.2/manual/installation/install_from_packages)」も参考になるはずです。

### Zabbixエージェントのインストール

Zabbixエージェントのパッケージはzabbix-agentです。これをインストールしてください。

```shell-session:コマンドライン
$ sudo yum install zabbix-agent
```

あるいは次のURLからRPMパッケージを取得してください。

* http://www.beering.jp/repos/amzn/1/x86_64/Packages/

インストールした後はいつもの通り設定してください。

おまけ
======

バージョンアップについて
------------------------

新しいバージョンが公開されていることに気づいたら、適当なタイミングでバージョンアップします。Zabbixサーバー（MySQL版）とZabbixエージェントについては軽く動作確認してからyumリポジトリーに配置しています。

また、パッケージ構成などについては、Zabbix開発元（Zabbix SIA.）が公開しているRPMパッケージに追従します。（例えば2.2.5-1では、zabbix-proxyの依存関係を調整しました）

いつまで公開するか
------------------

私がAmazon EC2を使っている限り公開は続ける予定です。Amazon Linux AMI用のzabbix関連パッケージがAmazonかZabbix SIA.が公開をはじめたら更新は停止するとは思います。（私もそっちを使います）

RPMパッケージへのGPG署名
------------------------

RPMパッケージ配布用のGnuPG鍵（指紋: 1F3D 0C6F 774C 4C2D 9E9A  366F 2E1F EEF4 01A1 0EBA）で署名しています。公開鍵はec2-zabbix-releaseパッケージに同梱している他、[鍵サーバーで公開](http://pgp.mit.edu/pks/lookup?search=packager%40beering.jp&op=index)しています。

また、この鍵には私が普段使っているGnuPG鍵で署名しています。（指紋をオフラインで取得したい場合は、どこかで私を捕まえてください）