OmniAICreator/Qiita-1.07M huggingface dataset:
ユニットテスト用のActiveDirectoryサーバをVagrantで構築しました

JavaからActive Directoryの認証を使うプログラムをテストしたくて、代替品としてSamba4サーバを立てました。いちから構築するのではなく、既にネット上にあるVagrant BaseBoxを利用させていただいたため、ほとんど自動で構築することができました。

#環境

- Windows 7 64bit
- [Vagrant](https://www.vagrantup.com/ ) 1.7.2（[vagrant_1.7.2.msi](https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2.msi)）

#手順

##AD DC代替マシン構築＆起動

vagrant upから起動するまではとても時間がかかります。

```shell-session:Vagrantに同梱されているMinGWにて
$ git clone https://github.com/xnandersson/dcpromo-vagrant.git
$ cd dcpromo-vagrant/
$ vagrant up
```

##ホストOSからアクセスするためNICを追加

BaseBoxのままではホストOSからアクセスできないためNICを追加します。

先の手順で起動しているゲストOSを一旦シャットダウンします。

シャットダウン後、ホストOSのVirtualBoxマネージャにて、ホストオンリー・ネットワークアダプタのNICを追加した後、ゲストを再起動します。

ゲストOSで追加したNICにIPアドレスを割り当てネットワーク・サービスを再起動するか、マシンを再起動します。

##Apache Direcotory Studioからアクセスしてみる

- Connectionsビューにて、New Connection...します。
-  Network ParameterのHostnameには、ホストオンリー・ネットワークアダプタに``` 割り当てたIPアドレス ```を入力します。
-  Portには``` 389 ```を入力します。
-  AuthenticationタブのBind DN or userには``` administrator@openforce.org ```を入力します。
- Bind Passwordは「``` Secret007! ```」に設定されているので、それを入力します。
- Browser OptionsのBase DNには、「``` CN=MicrosoftDNS,CN=System,DC=openforce,DC=org ```」を入力しました。 
- ``` Guest ```ユーザがあらかじめ登録されているので、Searchesから検索してみます。

#参考

- [Samba4 AD DC - Automated provisioning](https://lists.samba.org/archive/samba-technical/2014-May/099369.html)
CentOS6.5でDockerがディスクを開放してくれない件

ボチボチとDockerを実戦投入（と言ってもまだプロダクション用途ではないですが）しているのですが、なかなかにつらい事象に遭遇してしまいました。dockerコンテナの作成、削除を繰り返しているとどんどんディスク残量が減っていくのです。

今回の使用の仕方はJenkinsでDBに接続する結合テストを実行するというものです。
MySQLイメージはDocker公式のやつを使っています。
https://registry.hub.docker.com/_/mysql/

流れとしては、Jenkinsを用いて、

1. テスト実行の前処理として```docker run mysql```する
2. flywayでマイグレーションしてテーブルなどを作成
3. テストを実行するとデータのCURDが行われる
4. テスト終了後に```docker rm -f```

こんな流れでJenkinsジョブを１回動かすと大体500MB弱くらいはディスク残量が減っていくという・・・。


結構前から一部で話題にはなっているのですね。
https://github.com/docker/docker/issues/3182

要はDockerをまともに使おうと思ったらLinux Kernel 

下記には2.6.32-432以降とあるのですけどね。
http://docs.docker.com/installation/centos/

>To run Docker on CentOS-6.5 or later, you will need kernel version 2.6.32-431 or higher as this has specific kernel fixes to allow Docker to run.

一方でこちらを見るとなんだかんだと3.10以降ってことなんでしょうね。
http://docs.docker.com/installation/binaries/

> A 3.10 Linux kernel is the minimum requirement for Docker. Kernels older than 3.10 lack some of the features required to run Docker containers. These older versions are known to have bugs which cause data loss and frequently panic under certain conditions.
Swift 1.2でスマートにOptionalをUnwrap (複数let, where)

Xcode 6.3 betaから触ってるひとには今更感ありありですが^^;

# サンプル

```swift
class HogeHogeViewController {
    var textField: UITextField?
    var button: UIButton?

    ...

    func event() {
        ...
    }
}
```

例として、Optional型でtextFieldとbuttonを保持していて、event()が実行された時に、それぞれの状態をチェックしたい的な状況

# 1.2以前

```swift
func event() {
    if let textField = self.textField {
        if textField.isFirstResponder() {
            if let button = self.button {
                if button.enabled {
                    // Do something
                }
            }
        }
    }
}
```

Optional Bindingでアンラップしようとするとネストのお化けに・・・

もしくは、

```swift
func event() {
    if self.textField != nil && self.textField!.isFirstResponder() &&
      self.button != nil && self.button!.enabled {
        // Do something
    }
}
```

こう書けばネストは無くせるけど、自分でnilチェックしてから暗黙的アンラップ(!)っていうのがなんか強引な気がしないでもない

# Swift 1.2

- 一つのif文内で、複数変数がOptional Bindingが可能
- where句をつかってBindされた変数に対して評価が可能

という改善がされたので、以下のように（個人的には）スマートに書けるようになった模様

```swift
func event() {
    if let textField = self.textField, let button = self.button where textField.isFirstResponder() && button.enabled {
        // Do something
    }
}
```

# 蛇足

例のために１個のifにまとめたけど、whereで2つの条件をチェックしてるのは詰め込み過ぎに感じるので

```swift
func event() {
    if let textField = self.textField where textField.isFirstResponder() {
        if let button = self.button where button.enabled {
            // Do something
        }
    }
}
```

２つに分けるほうが好み
Array#eachからRubyのブロックを理解する


RubyのブロックとかProc.newとかがいまいち分かってなかったので調べてみました。

## 文法上の説明

まずは次のブロックを使った基本的なプログラムを文法的に説明します。

```ruby
[1,2,3].each do |i|
  puts i
end
```

- [1,2,3]はArrayクラスのインスタンスオブジェクトです。
- .eachはArrayクラスのインスタンスメソッドです。
- do~endはブロックで、メソッドはブロックを受け取ることができます。ただしブロックは引数ではないので、ブロックをカッコで囲むと`syntax error`になりますので注意してください。
- |i|はブロックの変数（ブロックパラメータ）です。

## ブロックの書き換え

ブロックはdo~endでも{~}でもどちらでも書くことができます。一般的に1行で書く場合は{~}を、複数行にわたる場合はdo~endで書きます。最初の例は、以下のように書き換え可能です。

```ruby
[1,2,3].each { |i|
  puts i
}
```

補足: do~endと{~}は場合によって解釈が異なるので完全に書き換えが可能というわけではないようです。（参考: [ブロックをdo…endで書くか{…}で書くかにより挙動が変わる例](http://qiita.com/riocampos/items/43e4431ddff93e01a18d)）

## Procオブジェクト

ブロックをオブジェクト化したものとしてProcオブジェクトがあります。Procオブジェクトは変数に代入することができるブロックのようなものです。最初の例は、以下のように書き換え可能です。メソッドにProcオブジェクトをブロックとして渡すときは&修飾が必要なことに注意してください。

```ruby
block = Proc.new {|i| puts i}
[1,2,3].each &block
```

ちなみに、メソッドはブロックを1つしか受け取れないので、メソッドに複数のブロックを渡したいときは、Procオブジェクトにすることで、メソッド引数として複数のProcオブジェクトを渡すことができます。

また、他の書き方として`Kernel.#procメソッド`や`Kernel.#lambdaメソッド`、そのシンタックスシュガーの`->`を使っても書くことができます。

```ruby
block = proc {|i| puts i}
[1,2,3].each(&block)

block = lambda {|i| puts i}
[1,2,3].each(&block)

block = ->(i) {puts i}
[1,2,3].each(&block)
```

ちなみにprocとlambdaは基本的には同じ動きをしますが、引数の扱いやジャンプ構文（returnとbreak）で動作が異なるようです。

参考: http://docs.ruby-lang.org/ja/2.1.0/class/Proc.html
参考: http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/m/proc.html

## ブロックの実行

次にeachメソッドの中でブロックがどのように処理されているのかを再現してみます。eachメソッドに限らず、メソッド内で受け取ったブロックを実行するには2つの方法があります。以下に、2つそれぞれの方法でeachメソッドもどきをArrayクラスに追加してみます。

ちなみに実際のeachメソッドのソースコードは以下のサイト（```click to toggle source```を押すとソースコードが表示されます）で確認できまが、Cで書かれているので、ここだけを見ても私には理解できませんでした。

http://ruby-doc.org/core-2.2.0/Array.html#method-i-each

### yield

1つめの方法はyieldを使います。yieldはメソッドに渡されたブロックを実行します。実際にyieldを使ってeachメソッドを作ってみると、次のようになります。（eachメソッドを上書きしようとしたら`stack level too deep (SystemStackError)`になってしまいましたので、each2という名前にしています。理由が分かる方がいましたら教えてほしいです。[追記: 理由はコメント#2を参照]）

```ruby
class Array
  def each2
    for i in self
      yield i
    end
  end
end

[1,2,3].each2 do |i|
  puts i
end
```

yieldの部分ではブロックの内部が実行されます。yieldに渡した引数は、ブロックパラメータ（|i|）に渡されます。この引数は複数指定することも可能です。

### Proc#call

2つめの方法は、メソッドに渡されたブロックを引数（Procオブジェクト）として受け取り、Procオブジェクトのcallメソッドを使います。ブロックを引数として受け取るには&修飾が必要で、メソッドに1つだけ設定できます。これも同様にeachメソッドを作ってみると、次のようになります。

```ruby
class Array
  def each3(&block)
    for i in self
      block.call i
    end
  end
end

[1,2,3].each3 do |i|
  puts i
end
```

callメソッドの部分でブロックの内部が実行されます。callメソッドに渡した引数は、yieldと同様に、ブロックパラメータ（|i|）に渡されます。この引数は複数指定することも可能です。

---

説明は以上です。

何か間違いがありましたら、ご指摘いただけると幸いです。

---

1つめのコメントの指摘事項を修正しました。@scivolaさんありがとうございます。
KVM(DNVM)をWindows7にインストールする

# KVMとは
- コマンドプロンプトとテキストエディタからASP.NET 5アプリを作成できるようにするためのツール
- Windowsに限らずMacやLinux上でも動かせる
- [OmniSharp](http://www.omnisharp.net/)を動かすために必要
- 今後DNVM（.NET Version Manager）に呼称が変わる

# 必要要件
以下の要件とは別に，ここではサンプルファイルを動かす手順でgitコマンドを利用しています．

- Windows 7 or Windows Server 2008 R2.
- .NET 4.5.1 for hosting in IIS

# インストール手順
1 . 管理者権限付きのコマンドプロンプト上で以下のコマンドを実行．

```ps1
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/aspnet/Home/master/kvminstall.ps1'))"
```

2 . 以下，普通のコマンドプロンプトで実行．

```
kvm upgrade
```

# サンプルを動かす

サンプルファイルを用意する．

```
git clone https://github.com/aspnet/Home.git
```

## ConsoleApp
所定のフォルダまで移動してを実行し，必要なパッケージをDL＆インストール．

```
kpm restore
```

以下のコマンドで実行を確認する．

```
k run
```

## WebApp
所定のフォルダまで移動してを実行し，必要なパッケージをDL＆インストール．

```
kpm restore
```

以下のコマンドでアプリケーションを実行．

```
k web
```

[http://localhost:5001/](http://localhost:5001/)にアクセスすると起動が確認できます．
Windowsから送られてきたzipファイルを解凍する（日本語ファイル名が含まれている場合）

##概要
Windowsで作成したzipファイルをlinux上で解凍する際、日本語ファイル名やフォルダ名が文字化けする問題が発生。
Windowsサーバでzip圧縮したファイルをLinuxサーバで解凍することが何度かあったので備忘録として記しておきます。

##原因
Windowsで作成したzip圧縮のファイル名エンコードはCP932(Shift_JIS)となっているため。
CP932とは: [Microsoftコードページ932](http://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932 "Microsoftコードページ932")

Mac,Linuxでのzip圧縮のエンコードはUTF-8。Macでのunzipコマンドでの解凍では文字コードを自動判別してくれるので、問題ないが、linuxでのunzipコマンドでは文字化けしてしまうので、パッチをあてて修正版unzipつくる必要がある。ディストリビューションによって対処方法がまちまちなので、ここではその対処法はとりません。

##対処法

```pl:unzip-cp932.pl

#!/usr/bin/perl
use Archive::Zip;
use Encode;
use Encode::Guess qw/CP932/;
 
my $zip = Archive::Zip->new($ARGV[0]) or die;
 
#print $ARGV[1];
chdir $ARGV[1];
 
for ($zip->members) {
	$zip->extractMember($_, encode('UTF-8', decode('CP932', $_->fileName)));
}

```

引数に与えたzipファイルを解凍する際にエンコードを変更するのみ

##使用方法
上記perlスクリプトをファイル名`unzip-cp932`にてパスのあたっている`/usr/bin`以下に作成
そして実行モードに変更 `chmod +x unzip-cp932`
`unzip-cp932 hoge.zip`

##注意
CP932(Shift_JIS)以外のエンコードは化けるので注意。
Mac,Linuxで作成したzip圧縮のフォルダやファイル名のエンコードはUTF-8なので、`unzip-cp932`は使えません。
あくまでWindowsで作成されたzipファイルを解凍する際に使用。

##他の例
[windowsから送られてきたzipファイルを解凍するとファイル名が大変なことになっている時](http://qiita.com/Hi-king/items/d2ab7df3511e75fc8318 )
上記の`unzip -O cp932`のOcp932オプションを使用できず、解凍できない場合があった。

[WinからLinuxへzipファイルなど持ってきた時の文字化け対処方法](http://www.kurobuti.com/blog/?p=3417)
上記、convmvを使用する場合
ReactNative:Images.xcassetsに登録した画像の読み込みに失敗する

ReactNativeのアプリで、ImageSetの画像の読み込みに失敗した。
読み込む画像の名前を見直したことで解決したので、解決方法をまとめる。
iOSアプリ詳しくないので間違ってたらツッコミお願いします。。

[2015/04/11 追記]
issueありました。。
- [require('image!name') assets should use virtual/Image Set name instead of filesystem file names #365]
(https://github.com/facebook/react-native/issues/365)

## TL;DR
ImageSetの名前と、登録する画像ファイル名は、大文字小文字含めて一致させること！

＜ImageSetの名前（大文字小文字一致）＞＋＜なんでもいい＞＋＜拡張子＞

## 発生した問題
Imageコンポーネントに```source={require('image!＜名前＞')}```を指定すると、以下のエラーになった。

```Requiring unknown module "image!＜名前＞" .```

参考にしたstackoverflowのページに、発生した問題のスクリーンショットがあるので、そちらを見れば分かやすいです。

## ソース
読み込もうとしたImageSetは"aws_icon_iam"という名前。登録したファイル名は以下通り。

- Deployment_Management_IAM.png
- Deployment_Management_IAM_1.png
- Deployment_Management_IAM_2.png

## 解決
この回答に従った。
[Trouble requiring image module in React Native - stackoverflow]
(http://stackoverflow.com/questions/29308937/trouble-requiring-image-module-in-react-native/29381280#29381280)

> I had similar problem, then renamed the image files in file system under the xcode project's Images.xcassets directories with suffixes and capitalization to match the image I'm loading.
> 
>For example, if source={require('image!Villagers')} it required the image files named precisely as Villagers.png, Villagers@2x.png and Villagers@3x.png. If the '@3x' part of filename wasn't there, the image would not get found.


回答によれば、（ファイルシステム上の）ファイル名と、ImageSetの名前が（大文字小文字含め）一致しないと駄目らしい。
そのため、以下のようにファイル名とImageSetの名前を同じにしたところ、問題が解決した。

### 差分

```
diff --git a/iOS/Images.xcassets/aws_icon_iam.imageset/Contents.json b/iOS/Images.xcassets/aws_icon_iam.imageset/Contents.json
index 5d728bb..2557241 100644
--- a/iOS/Images.xcassets/aws_icon_iam.imageset/Contents.json
+++ b/iOS/Images.xcassets/aws_icon_iam.imageset/Contents.json
@@ -3,21 +3,21 @@
     {
       "idiom" : "universal",
       "scale" : "1x",
-      "filename" : "Deployment_Management_IAM-1.png"
+      "filename" : "aws_icon_iam.png"
     },
     {
       "idiom" : "universal",
       "scale" : "2x",
-      "filename" : "Deployment_Management_IAM.png"
+      "filename" : "aws_icon_iam@2x.png"
     },
     {
       "idiom" : "universal",
       "scale" : "3x",
-      "filename" : "Deployment_Management_IAM-2.png"
+      "filename" : "aws_icon_iam@3x.png"
     }
   ],
   "info" : {
     "version" : 1,
     "author" : "xcode"
   }
-}
```

### 補足

- 大文字小文字の一致は必要。"aws_icon_iam"というImageSetに対し、"aws_icon_Iam.png","aws_icon_Iam@2x.png","aws_icon_Iam@3x.png"を登録したら同じエラーが発生した。
- ファイル名の末尾は"_1", "@2x", "__1"などにしても大丈夫だった。
ipの固定とホスト名の設定

#IPの固定
```ini:/etc/sysconfig/network-scripts/ifcfg-eth0
#...
#ONBOOT=no
ONBOOT=yes
#BOOTPROTO=dhcp
BOOTPROTO=static
IPADDR=aaa.bbb.ccc.ddd
NETMASK=eee.fff.ggg.hhh
GATEWAY=iii.jjj.kkk.lll
DNS1=iii.jjj.kkk.lll
```

#ホスト名の設定
```ini:/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hogehoge
```
```text:/etc/hosts
127.0.0.1   hogehoge localhost
::1         hogehoge localhost
```
Visual Studio Tools for Unity で開発するときの .gitignore

Visual Studio Tools for Unity
http://unityvs.com/

これ、便利。Mac にもほしい。
んで、まー、git にいれんでいい個人設定ファイルとかは .gitignore に書きますよね。自分で書くのめんどいからって [Visual Studio 用の .gitignore](https://github.com/github/gitignore/blob/master/VisualStudio.gitignore) をひろってきていれたりすると *.meta が含まれてていくらコミットしても微妙に変更が共有されなくってすんごい困るので気をつけましょう。（気づくまで 3 日ぐらいかかった、、、）
Unity シーン間で変数を共有する方法


シーン間で変数をやり取りしたいケースがママあります。
例えば、メインゲームシーンの結果をリザルトシーンで参照したり...


そのやり方を幾つかのメモ。
(SampleはC#です)

# static変数でのやり取りする

クラスのメンバ変数をpublic staticで宣言しておくと、他のオブジェクトから参照ができるようになります。

また、これで宣言した変数がゲームを終了させるまで継続して保持されます。

下記SampleはMainGameシーンのhitpoint変数を、Resultシーンで取得しています。

```csharp
/// -----------------------------------------
///	MainGame Scene
/// -----------------------------------------

public class MainGameController : MonoBehaviour {
	public static int hitpoint = 0;
	
	// getter
	public static int getHitPoint() {
		return hitpoint;
	}
	
    void Start () {
    }

    void Update () {
    }
}
```

```csharp
/// -----------------------------------------
/// Result Scene
/// -----------------------------------------

public class ResultController : MonoBehaviour {
    void Start () {
    	int resultHitpoint = MainGameController. getHitPoint()
    }

    void Update () {
    }
}
```


# DontDestroyOnLoad()を使う

DontDestroyOnLoadを使うことで、Sceneを切り替えてもGameObjectが破棄されなくなります。

```csharp

/// -----------------------------------------
/// MainGame Scene
/// -----------------------------------------

public class MainGameController :MonoBehaviour {
	public static int hitpoint = 0;
	void Start() {
		DontDestroyOnLoad(this);
	}
}

```

```csharp
/// -----------------------------------------
/// Result Scene
/// -----------------------------------------

public class ResultController : MonoBehaviour {
    void Start () {
		int resultHitPoint = MainGameController.hitpoint;
    }

    void Update () {
    }
}
```
UnityのC#スクリプトテンプレートおすすめ

##UnityのC#スクリプトテンプレートおすすめ

スクリプトテンプレートファイルがある場所(C#は81-C# Script-NewBehaviourScript.cs.txt)
```Unity.app\Contents\Resources\ScriptTemplates
```

C#テンプレート

```
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UniRx;
using UniRx.Triggers;

public class #SCRIPTNAME# : MonoBehaviour 
{

	void Start ()
	{
		
	}
	

}

```
開眼！JavaScriptの2.5のまとめ　プロパティへの参照の解決

開眼！JavaScriptの2.5のまとめです。

##2.5　プロパティへの参照はどのように解決されるのか
*オブジェクト内に存在しないプロパティにアクセスしようとする場合、JavaScriptではそのオブジェクトのコンストラクタ関数のprototypeオブジェクトを参照して（遡っていって）探し当てようとする。*

配列オブジェクトを作成して、定義されていないtoLocaleString()にアクセスすると、定義されていないにも関わらず結果が返されます。

```
var myArray= ['foo', 'bar'];

console.log(myArray.toLocaleString());

```
結果
foo,bar

ここでの動作としては、myArrayにtoLocaleString()プロパティがあるかを探しに行きますが無いため、そのオブジェクトのコンストラクタ関数（ここではArray()）のprototypeオブジェクトを参照しています。

```
//myArrayのコンストラクタ関数はArray()
console.log(myArray instanceof Array); →true
```

しかしArray()にもtoLocaleString()は無いため、さらにそのコンストラクタ関数のprototypeオブジェクトを参照しにいきます。
Array.prototypeのコンストラクタ関数はObject()なのでObject.prototypeを参照しに行きます。ここでtoLocaleStringが見つかったためメソッドが実行され、結果が返されました。

もしObject.prototypeにもなければundefinedを返します。

```
var myArray= ['foo', 'bar'];

console.log(myArray.hoge);
```
結果
undefined
UITextView が初期表示時に勝手にスクロールする


# 問題
黄色の領域がUITextView。
viewcontrollerでautomaticallyAdjustsScrollViewInsetsはfalseにしてある。

下記の例だと、2行目までがframeより上にはみだしてしまう。
![UITextViewが勝手にスクロールする](https://qiita-image-store.s3.amazonaws.com/0/35008/38791e5f-a32d-b4c5-36b2-6d9960c5d356.png "textview.png")
contentOffsetをとると、43.5point。
UserInteractionEnabledとかパラメータをいじっても変わらなかった。
表示されたときにUIScrollViewDelegateのscrollViewDidScrollが呼ばれているので、勝手にスクロールされるということで間違いなさそう。
InsetsはadjustしないけどOffsetはいじってるとかそういうこと？
scrollViewDidScrollはviewWillLayoutSubviewsの後に呼ばれていた。

Xcode6.2でiOS8.2のシミュレータでしか確認してない。

# 回避
挙動の意味が全く分からないがひとまず。
~~layoutSubviewでsetContentOffsetすることで逃げた。~~
viewDidLayoutSubview でanimated:falseでsetContentOffsetすることで逃げた。

```swift
override func viewDidLayoutSubviews() {
  super.viewDidLayoutSubviews()
  textview.setContentOffset(CGPointZero, animated: false)
}
```

なおviewDidAppearにanimated:trueで書くと、表示されてからスクロールがアニメーションするようになる。
Xcode 6.3 で UITableViewAutomaticDimension が有効にならない場合


これまではUITableViewCellの高さの自動計算は、以下のようにUITableViewのrowHeightで設定できましたが、Xcode 6.3 & iOS 8.3 & Swift 1.2 & iOS Simulator 8.3環境(どれが原因か不明)で動作しなくなっていました。

    self.tableView.rowHeight = UITableViewAutomaticDimension

原因はよくわかりませんが、とりあえず以下で動作しています。

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

    override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

- 参考
    - [UITableViewAutomaticDimension not working in Xcode 6.3](http://stackoverflow.com/questions/29565078/uitableviewautomaticdimension-not-working-in-xcode-6-3)
Ubuntu 14.xにOpenJDK 8環境を構築

Oracle JDK 8の入れ方はいくつかありますが、OpenJDK 8のインストール方法はなかったので。

# インストール
## 14.04
http://sourcedigit.com/14692-install-openjdk-8-ubuntu-14-10-ubuntu-14-04-ubuntu-12-04-systems/

にあるように、PPAリポジトリに組み込まれました。

```
$ sudo add-apt-repository ppa:openjdk-r/ppa
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk
```

## 14.10
http://www.2daygeek.com/openjdk-8-installation-ubuntu/

で示されているように、メインリポジトリに組み込まれました。

よって普通に

```
$ sudo apt-get install openjdk-8-jdk
```

でインストールできます。

> 確認はしていませんが、15.04以降も同様のはすです。

# インストール後（共通）
```
$ sudo update-alternatives --config java
```
でデフォルトのランタイムとしてOpenJDK8を選択し、

```
$ sudo update-alternatives --config javac
```
でデフォルトコンパイラも同様に設定します。

あとは、

```
$ java -version
```
で設定通りOpenJDK8になっているか確認します。

# 余談（2016-3-20 追記）
~~あまりなさそうな気はするのですが、~~開発用途ではなくランタイムだけという場合は
```
$ sudo apt-get install openjdk-8-jre
```
とします。
シェル: n 個ずつ畳む時に xargs -L よりも paste （速い・低コスト）

シェルで縦にずらっと出るものを、一定個ずつ横に並べたい話をします。

こんな入力

```
1
2
3
4
5
6
7
8
9
```

を

```
1 2 3
4 5 6
7 8 9
```

な感じにしたい。

## xargs -L の場合

xargs を使って、引数を畳むテクニックがある。
```-L``` オプションで引数の個数を指定している。
xargs から入力を渡すコマンドを指定していない時、渡すコマンドは echo になる。
そのため「標準入力から読んで 1 行に n 個ずつ出力」ができる。


```shell-session:xargs
$ seq 1 9 | xargs -L 3
1 2 3
4 5 6
7 8 9
$
```

## paste の場合

paste を使っても同じことができる。
paste は複数のファイルを 1 行に横につなげるコマンドで、
```-``` を指定した場合は標準入力から読む。
これが複数指定されると、標準入力から複数個ずつ取り出して出力する。
ただし区切り文字はタブなので、 ```-d' '``` で区切り文字を指定する。

```shell-session:paste
$ seq 1 9 | paste -d' ' - - -
1 2 3
4 5 6
7 8 9
$
```

# もっと大きな件数でやってみる

4096 件を 4 つずつ出力してみる。
自分の手元の環境だと大きな差がでた。

## xargs -L の場合

```shell-session:xargs計測
$ time seq 1 4096 | xargs -L 4 > /dev/null

real	0m1.355s
user	0m0.592s
sys	0m0.648s
$
```

## paste の場合

```shell-session:paste計測
$ time seq 1 4096 | paste -d' ' - - - - > /dev/null

real	0m0.007s
user	0m0.006s
sys	0m0.003s
$
```

# 理由
別シェルで ps してみたところ

```txt:psした時のある出力行
79968 ttys000    0:00.00 (echo)
```

のように echo が頻繁に表れ・消えしていた。
man ページを読んだ所、 xargs が使う echo は ```/bin/echo``` のようだ。
xargs は必ず 1 プロセスを生成してしまうということ。
paste の方が速いのはこの差だと思う。

# 実験に使ったバージョン

- xargs (GNU findutils) 4.4.2
- paste (GNU coreutils) 8.21
[Objective-C] NS_ENUM のシンボルが重複する場合


酷い例だけど、取り敢えず、こんなコードがあったとします。

```
NS_ENUM(NSInteger, NAME)
  ELEMENT1,
  ELEMENT2,
  ELEMENT3
```

#### 対処法
1. 対応する括弧を付けましょう
2. ちゃんと Typedef しましょう

```
typedef NS_ENUM(NSInteger, NAME){
  ELEMENT1,
  ELEMENT2,
  ELEMENT3
};
```

以上。
開眼！JavaScriptの2.4のまとめ　プロパティの削除

開眼！JavaScriptの2.4のまとめです。

##2.4　delete演算子でプロパティを削除する。
*delete演算子で、指定したプロパティをオブジェクトから削除することができる。（ただし、プロトタイプチェーンで継承するプロパティは削除しない。）*

プロパティを指定して削除を実行。（プロトタイプチェーンで継承するプロパティは削除できていない。）

```
var foo = {bar:'bar'};
delete foo.bar;
console.log('bar' in foo);
delete foo.toString;
console.log('toString' in foo);
```
結果
false
true
GooglePlayのアプリ説明のURLリンクの仕方について


playストアのアプリの説明ではURLを貼ることが出来ます。
ただちょっと癖があったのでメモ

##Playストア外部へリンクを貼る場合##
説明に普通にURLを貼るだけでOK

```text:例
詳しくは→ http://qiita.com/
```
の様に、普通にURLを書くだけで自動的にURLにリンクを生成してくれます。

##playストア内部へのリンク##
例えば有料版のアプリへのリンクなど、playストアの説明欄から別のアプリへのリンクを作りたい場合

```text:例
有料版の<a href="https://play.google.com/store/apps/details?id=com.sample.pro">sample pro</a>はこちら
```
の様にaタグでリンクをしてあげる必要があります。
開眼！JavaScriptの2.3のまとめ　ドット記法とブラケット記法

開眼！JavaScriptの2.3のまとめです。

##2.3　ドット記法とブラケット記法でオブジェクトのプロパティにアクセス
*オブジェクトのプロパティは、ドット記法もしくはブラケット記法で取得・設定・更新することができる。
ブラケット記法は、変数に格納された文字列を使ってプロパティにアクセスできる。また不正なプロパティ名を持つプロパティの値にもアクセスできる。*

ドット記法を使用

```
var cody = new Object();
//ドット記法でプロパティ設定
cody.human = true;
//プロパティを取得
console.log(cody.human);
//プロパティを更新
cody.human = false;
console.log(cody.human);
```
結果
true
false

ブラケット記法を使用

```
var cody = new Object();
//ブラケット記法でプロパティ設定
cody['human'] = true;
//プロパティを取得
console.log(cody['human']);
//プロパティを更新
cody['human'] = false;
console.log(cody['human']);
```
結果（見やすいように改行しています）
true
false

変数に格納された文字列を使ってプロパティにアクセス

```
var foobarObject= {foobar:'foobar};
var string1 = 'foo';
var string2 = 'bar';

console.log(foobarObject[string1 + string2]);
```
結果
foobar

不正なプロパティ名を持つプロパティの値にアクセス

```
var myObject = {'123':'zero', 'class':'foo'};
console.log(myObject['123'], myObject['class']);
```
結果（見やすいように改行しています）
zero
foo
Handsontableで日本語入力関連キーを無視する

[Handsontable](http://handsontable.com/)で漢字キーなどの日本語入力関連キーを押すとセルへの入力開始とみなされ、既存のセル内容がクリアされてしまいます。

![漢字キー.png](https://qiita-image-store.s3.amazonaws.com/0/25938/f4749361-a376-5740-7d1c-f02c5c838d6c.png)

以下のようにすることで、日本語入力関連キーを無視させることができます。

```js:ignoreimekey.js
var hot = new Handsontable(container, {
  // ...
  // Handsontableのオプション指定
  // ...
});

hot.updateSettings({
  beforeKeyDown: function (e) {
    if ([28,29,241,242,243,244].indexOf(e.keyCode) >= 0) {
      e.isImmediatePropagationEnabled = false;
      e.isImmediatePropagationStopped = function(){
        return true;
      }
    }
  }
});
```

[jsFiddleのデモ](http://jsfiddle.net/pazworld/uc3xbu7x/2/)

以下のキーを無視しています。

- 変換 (28)
- 無変換 (29)
- カタカナ (241)
- ひらがな (242)
- 漢字キー (243, 244)
Swift で UIViewController のサブクラスを引数なしの -init でインスタンス化する

Objective-C ではなにも特別なことをせずに引数なしのイニシャライザで UIViewController のサブクラスをインスタンス化できたんだけど、 Swift では `-init` をオーバーライドするときは指定イニシャライザを使えと言われる。

StoryBoard を使わないで、かつ AutoLayout を使うときは frame とか渡してもしょうがないでしょ、と思ったので、引数なしの `-init` を使おうと思ったんだけど、これがなかなか手こずった。

結局以下のように、引数なしの方を `convenience` にして、そっちから指定イニシャライザを呼んでやることで解決した。よく考えれば Swift ではこう書くしかないというか、 Swift っぽい書き方。(参考: [Initializing View Controllers in Swift · The Main Thread](http://themainthread.com/blog/2014/08/initializing-view-controllers-in-swift.html))

```swift
import UIKit
 
class ViewController: UIViewController {
  
  
  required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setup()
  }
  
  override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
    super.init(nibName: nil, bundle: nil)
    setup()
  }
  
  convenience init() {
    self.init(nibName: nil, bundle: nil)
  }

  func setup() {
    // init のなかみ
  }
 
  
}
```
開眼！JavaScriptの2.2のまとめ　ツリー構造や多次元配列の実現

開眼！JavaScriptの2.2のまとめです。

##2.2　オブジェクトと配列でツリー構造や多次元配列を実現
*Object()、Array()、Function()オブジェクトは他のオブジェクト（配列を含む）を格納することで、ツリー構造を持ったオブジェクトや多次元配列のようなふるまいを実現することができる。*

オブジェクトにオブジェクトを格納して、ツリー構造を実現

```
var object1 = {
    object1_1:{
        object1_1_1:{foo:'bar'},
        object1_1_2:{}
    },
    object1_2:{
        object1_2_1:{foo:'hoge'},
        object1_2_2:{}
    }
};


console.log(
object1.object1_1.object1_1_1.foo, 
object1.object1_1.object1_1_2, 
object1.object1_2.object1_2_1.foo, 
object1.object1_2.object1_2_2.foo
)
```
**結果**（見やすいように改行しています）
bar 
Object {} 
hoge 
undefined


配列を使って擬似的な多次元配列を実現

```
var myArray = [[[0,1],[2,3]],[[4,5],[6,7]]];
console.log(myArray[0][0], myArray[1][1]);
```
**結果**（見やすいように改行しています）
[0, 1]
[6, 7]
pyvenvをWindowsで使う

# はじめに

　 [Pythonもくもく会 @アライドアーキテクツ（恵比寿）](http://mokupy.connpass.com/)に参加したとき「pyenvとか使ってみたい」とつぶやいたら親切な人が教えてくれたのでメモ。

　[当時、pyenvとかpyvenvとかvirtualenvとかの違いがわかっていなかった](http://qiita.com/nobolis/items/12a464557f2ae007e9a1)状態での発言だったので、その親切な人は、自分も初心者なので正しいことを言っているかわかりませんが、と前置きをしてから「利用目的が一つであればvirtualenvは不要では」「あなたがやりたいのはたぶんvirtualenv」といったことを言って、下記やり方を教えてくれました。

  そして話を聞いて実際に作業してみて自分の発言はかなり謎な内容だったことに気がつき、さらに教えてもらったのはpyvenvであることに今日（2015/04/11）気がつきました。


※pyenvとかvirtualenvのことについては[こちらの記事 ](http://qiita.com/nobolis/items/12a464557f2ae007e9a1)に書きました。

# 環境
* Windows7 32bit/64bit
* Python3.4.3
 
# pyvenvの使い方 for Windows
### 1. プロジェクトを作りたいフォルダに移動。
たとえば
```
C:\> cd C:\Users\username\Documents
```

* usernameはユーザー名  
  

### 2. pyvenv.pyを実行
```
C:\Users\username\Documents> Python C:\Python34\Tools\Scripts\pyvenv.py venvtest
```

* "venvtest"は環境フォルダ名なので任意  
* 成功したら指定したフォルダ(C:\Users\username\Documents\venvtest) 内にInclude, Lib, Scriptsフォルダとpyvenv.cfgが生成される。  

(2015/04/13加筆)
shimizukawa氏より、pyvenvはpythonモジュールとして実行可能なように作られているので、以下のコマンドで同じ結果を得られますとのコメントを頂きました。

```
C:\Users\username\Documents> python -m venv venvtest
```

  
### 3. 環境の使用開始（activate）
```
C:\Users\username\Documents\venvtest\Scripts\activate
```

(activate後)
```
(venvtest)C:\Users\username\Documents>
```

* 行頭に「(venvtest)」（環境フォルダ名が括弧で囲まれて示される）と表示される。
* この状態でプロジェクトに特化したvenv環境が利用できる

### 4. 環境の使用終了（deactivate）
（2015/05/10 修正 Thanks to furico氏）
```
(venvtest)C:\Users\username\Documents> deactivate
```
(deactivate後)
```
C:\Users\username\Documents>
```

# 参考URL
[https://docs.python.org/3/library/venv.html#module-venv](https://docs.python.org/3/library/venv.html#module-venv)
[http://docs.python.jp/3.3/library/venv.html](http://docs.python.jp/3.3/library/venv.html)

# Special Thanks
 [Pythonもくもく会 @アライドアーキテクツ（恵比寿）](http://mokupy.connpass.com/)
 [python mini-hack-a-thon](http://pyhack.connpass.com/)
Vagrantは同梱されているMinGW下で使用することにしました

Cygwin下でVagrantを使おうとして、Rubyのエラーに遭遇したのためあきらめました。その代わり、VagrantにはMinGWが同梱されているされているのでそれを使うことにしました。

##環境

- Windows 7 (64bit)
- Cygwin 1.7.33 (X86_64)
- Vagrant 1.7.2

##Cygwin下で遭遇したエラー

```
C:/Vagrant/embedded/lib/ruby/2.0.0/rubygems/config_file.rb:89:in `join': no implicit conversion of nil into String (TypeError)
        from C:/Vagrant/embedded/lib/ruby/2.0.0/rubygems/config_file.rb:89:in `<class:ConfigFile>'
        from C:/Vagrant/embedded/lib/ruby/2.0.0/rubygems/config_file.rb:37:in `<top (required)>'
        from C:/Vagrant/embedded/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:53:in `require'
        from C:/Vagrant/embedded/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:53:in `require'
        from C:/Vagrant/embedded/gems/gems/bundler-1.7.11/lib/bundler/rubygems_integration.rb:2:in `<top (required)>'
        from C:/Vagrant/embedded/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:53:in `require'
        from C:/Vagrant/embedded/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:53:in `require'
        from C:/Vagrant/embedded/gems/gems/bundler-1.7.11/lib/bundler.rb:6:in `<top (required)>'
        from C:/Vagrant/embedded/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:118:in `require'
        from C:/Vagrant/embedded/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:118:in `rescue in require'
        from C:/Vagrant/embedded/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:124:in `require'
        from C:/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/bundler.rb:6:in `<top (required)>'
        from C:/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/pre-rubygems.rb:19:in `require_relative'
        from C:/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/pre-rubygems.rb:19:in `<main>'
```

##同梱されているMinGW

%VAGRANT_HOME%\embedded\にはMinGWが同梱されていました。せっかくなのでこれを使います。

%VAGRANT_HOME%\embedded\msys.batでbashを起動しました。
Sailsのアプリケーションをnpm化し複数のSailsアプリケーションで共有する

目的
----

Node.jsの開発でSails.jsを使ってます。複数のアプリケーションでModel/Serviceを共有したい時があると思うんですが、npm化して共有するにはどうしたら良いか調べました。

前提
----

sails-generate-entitiesというnpmを利用して継承コピーするような形で複数アプリケーションで共有します。最初はSailsのinstallable hookの仕組みを使ってModelやServiceを差し込もうとしていたんですが、どうも安定して動かないのでこの方法に落ち着きました。

手順
----

### sails-generate-entitiesをインストールする

複数のアプリケーションで共有したいModel等を持っているアプリケーションにsails-generate-entitiesをインストールします。

```
$ npm install --save sails-generate-entities
```

### index.jsを記述する

書き方はこちらが参考になる。
https://github.com/tjwebb/sails-permissions/blob/master/index.js

モジュール名にはこのアプリケーションの名称というかnpmの名称を入れるイメージで、IDにはsails generate \<ID\>というイメージで呼び出すくらいの感じで理解しておく。下記はModelとServiceだけを対象にするindex.jsです。

```js:index.js
module.exports = require('sails-generate-entities')({
  module: '<モジュール名>',
  id: '<ID>',
  statics: [
    'api/models/Article.js',
    'api/models/ArticleTag.js',
    'api/models/Comment.js',
    'api/models/Tag.js',
  ],
  classes: [
    'api/services/ArticleService.js',
  ],
  functions: [
  ]
});

```

ちなみに直接モデル名とか指定しなきゃいけないのがややイケてないですが…。module.exportsの手前でフォルダの中身調べて〜というようなプログラムを書いたんですが、exportsが読まれるタイミングに間に合わないのか全くうまくいきませんでした。

### npmをGitHubでホストする

作ったSailsアプリケーションをnpmとしてGitHubでホストします。いつもどおりリポジトリを作っておくだけで良かったと思います。プライベートでももちろん大丈夫です。

### 利用するアプリケーション側でnpmをインストールする

package.jsonの書き方は下記のような感じです。Publicなリポジトリの場合は普通にhttpでも大丈夫です。Privateの場合は、git+sshでやると良いようです。ちなみにこの場合は、npm installするユーザーの.sshにGitHubで作成したSSH Key（公開鍵）に対応する秘密鍵をid_rsaという名称で保存しておくとスムーズにいくようです。

```js:package.json
{
  "name": "hoge",
  "private": true,
  "version": "0.0.0",
  "description": "a Sails application",
  "keywords": [],
  "dependencies": {
    "<npm名>": "git+ssh://git@github.com:<個人orチームアカウント>/<リポジトリ名>.git",
    "bluebird": "^2.9.14",
    ...
    "lodash": "^3.6.0",
    "rc": "~0.5.0",
    "sails": "~0.11.0",
    "sails-disk": "~0.10.0",
    "sails-mysql": "^0.10.11"
  },
  "scripts": {
    "start": "node app.js",
    "debug": "node debug app.js",
  },
  "main": "app.js",
  "devDependencies": {
    ...
  }
}
```

ここを見ると、npmのバージョン番号の指定などいろいろ設定できそうな事が分かります。
https://docs.npmjs.com/cli/install

ちなみにsails-generate-entitiesがlodashを使う関係上、lodashは入れておく必要があります。

### .sailsrcを編集する

.sailsrcファイルを編集します。

```js:.sailsrc
{
  "generators": {
    "modules": {
      "<Generatorの引数として受けたい名称>": "<npmモジュール名称>"
    }
  }
}
```

### ジェネレータを実行しnpmから継承コピーする

```
$ sails generate <Generatorの引数として受けたい名称>
```

これでnpm内部のindex.jsで指定されたファイルが、アプリケーションの中でコピーされます。コピーされたファイルはこのような感じになっています。「これしか方法はないのか…」という感じですが、コピーされたファイルを見てもまあ一番安全で確実な方法だとは思います。。

```
// api/models/Article.js

var _ = require('lodash');
var _super = require('SELECK_models/api/models/Article');

_.merge(exports, _super);
_.merge(exports, {

  // Extend with custom logic here by adding additional fields, methods, etc.

  /**
   * For example:
   *
   * foo: function (bar) {
   *   bar.x = 1;
   *   bar.y = 2;
   *   return _super.foo(bar);
   * }
   */
});
```

もちろん普通にsails liftできて、普通に動きます。
CakePHP 共通処理の扱い方（module） まとめ 

開発において、コードをモジュール化することはとても大切です。

・開発の効率化
- モジュールにすれば、必要なときに呼び出すだけ。
- 問題を一意に解決出来る。

・運用しやすい
- モジュール部分の変更で全箇所のアップデートが出来る。

・コードの質向上
- 冗長をなくせるので、コードの質が上がります。

…etc

というわけで、CakePHPにおけるモジュールの扱い方をまとめたいと思います。

***
1.Controllerにおけるモジュール
2.Modelにおけるモジュール
3.Viewにおけるモジュール

4.Controller、Model、Viewに共通する処理のモジュール
***

# 1.Controllerにおけるモジュール


/app/Controller/Component/　ディレクトリにモジュールにしたいファイルを入れていく。


```php:/app/Controller/Component/ResponseComponent.php
<?php

class ResposeComponent extends Component {
     public function getHello() {
          return "hello world!";
     }
}
```

Responseのところは適宜変えて使う。

```php:/app/Controller/TestsController.php
<?php

App::uses('AppController', 'Controller');

class TestsController extends AppController {

     public $name = 'Tests';
     public $components = array(‘Response');

     public function index() {
          $hello = $this->Response->getHello();     
     }
}

```

Controllerでコンポーネントを使うときは$componentで使いたいコンポーネントを呼び出せば利用可能。

# 2.Modelにおけるモジュール

AppModelを作ってそれを継承する。

AppModelを作ってその中に、必要な関数等をかいていく。

それを継承する各Modelに下記記載。

```php
<?php
  App::uses('AppModel', 'Model');

  class …
```
ちなみに、他のモデルをモデル内で使うときは
[CakePHP Modelの中で他のモデルを使う(App:import を作ってクラスを読み込む)](http://qiita.com/shizuma/items/32b4b86a55cd0e6bbda9)
を参照して下さい。

# 3.Viewにおけるモジュール

・app/View/Elements/以下に.ctpファイルを作成して、下記で呼び出し。

```php
echo $this->element('エレメント名');
```

・app/View/Elements/mypages/module.ctpの呼び出し。

```php
echo $this->element('mypages/module');
```

・```$comment```の中に```'hogehoge'```を入れて受け渡す。

```php
echo $this->element('mypages/module', array('comment'=>'hogehoge');
```

・```$comment```の中に```$hogehoge```を入れて受け渡す。

```php
echo $this->element('mypages/module', array('comment'=>$hogehoge);
```

# 4.Controller、Model、Viewに共通する処理のモジュール

Vendorを利用すると、共通のモジュールを作成することが出来る。

```php:/app/Vendor/util/test.php
namespace Util;

class Test {
    public function sayHello() {
       return 'Hello world';
    }
}
```

```php:/app/controller/MypageController.php
App::uses('AppController', 'Controller');
App::import('Vendor', 'util/test');

class MypageController extends AppController {
    public function index() {
        $test = new Util\Test();
        $test->sayHello();
    }
}
```

上記のように
Model、Viewに関しても同様にファイルの最初に以下を加え、

```php
App::uses('AppController', 'Controller');
App::import('Vendor', 'util/test');
```

適当な位置で下記で呼び出せる。

```php
 $test = new Util\Test();
 $test->sayHello();
```

＊Vendorのファイル名は小文字だということです。

#参考

[CakePHPの共通のライブラリの作り方](http://ameblo.jp/itboy/entry-11354038711.html)
[cakephp elementの使い方について](http://realid-inc.com/column/2014/07/04-164752.html)
[[CakePHP 2.x]Model,View,Controllerで共通する処理](http://qiita.com/Noface/items/8f995b49d957d0c85baa)
TypeScript x GulpでHello world

# リポジトリ準備

```bash
$ mkdir GulpTypeScript; cd GulpReactTypeScript
$ git init
$ npm init
$ npm install --save-dev gulp gulp-typescript
```

# Gulpfile, index.html, index.tsを用意

```gulpfile.js
'use strict';

var gulp = require('gulp');
var typescript = require('gulp-typescript');

gulp.task('build', function() {
  gulp.src('index.ts').pipe(typescript()).pipe(gulp.dest('.'));
});
```

```index.html
<html>
  <head>
  </head>
  <body>
    <section id="hello-world"></section>
    <script src="index.js"></script>
  </body>
</html>
```

```index.ts
// TypeScriptで書く意味ないけど
var elem = document.getElementById('hello-world');
elem.innerHTML = 'Hello, world!';
```

# 確認

```bash
$ gulp build
$ open index.html
```
AWS AutoScalingGroup内のInstance手動作業時の注意点


# Auto Scaling Group 内 EC2 Instance　操作とその挙動まとめ

## 背景
ASG内のEC2 Instanceでいろいろ操作してみてうっかり、Stopしたりして思わずな挙動にでくわせた経験があったので、挙動をまとめてみました。
間違いがあれば、ご指摘ください。

## Auto Scaling Group とは
http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/WhatIsAutoScaling.html
![as-basic-diagram.png](https://qiita-image-store.s3.amazonaws.com/0/70901/59ce5f23-e5c9-cfce-e589-57f2e7abf358.png)

## EC2 Instance操作によるASG挙動まとめ

| Action | Option | Auto Scaling Group | EC2 Instance | Remark | |
|:-------|:------:|:------------------:|:-------------|:-------|:--------|
|Attach||Desired:<font color=blue>**+1**</font>|<font color=green>Running</font>|ASGにInstanceが追加される||
|Detach||Desired:<font color=blue>**-1**</font><br/>or<br/>Desired:維持|<font color=green>Running</font>|ASGとELBから削除される。但し、Min == Desiredの場合は別のInstanceが立ち上りASG内のDesired数は維持される|Min == Desiredの場合はASG内のInstance Replace効果|
|Detach|Add a new instance to the Auto Scaling group to balance the load|	Desired:維持|<font color=green>Running</font>|ASGとELBから削除される。別のInstanceが立ち上りASG内のDesired数は維持される|ASGからあるInstanceを外し、別のInstanceを追加したい|
|Set to Standby||Desired:<font color="blue">**-1**</font>|<font color=green>Running</font>|Increases the load on other instances in ASG as no traffic will be routed to this instance from the load balancer. <br/><br/>ELBからは削除されるが、ASGには属している。但し、Instance数が Desired == Min の場合はStandbyできない.|一時的にASGから退避|
|Set to Standby|Add a new instance to the Auto Scaling group to balance the load|Desired:維持|<font color=green>Running</font>|Adding a new instance to the ASG will keep the group at its current capacity thereby preventing extra load on the instances within the ASG<br/><br/>ELBからは削除されるが、ASGには属している。Standbyになる代わりにDesired数に合わせて新たなInstanceが起動される|一時的にASGから退避するが、Capacityは維持|
|ASGを削除||<font color="red">削除</font>|<font color=red>**Terminate**</font>|<font color=red>ASG内の全InstanceがTerminateされる</font>|<font color=red>ASG設定だけを削除するには、まず、ASG内の全InstanceをASGから外してからじゃないと大変な目にあうので要注意</font>|
|Terminate Instance within ASG||Desired:維持|<font color=red>**Terminate**</font>|TerminateされるとDesired数を維持するため、別のInstanceが起動される。<br/> <font color=purple>**Terminate Protection設定は効かない**</font>|<font color=red>ただInstanceをTerminateしたつもりでもASGのDesired数まで新たなInstanceが起動される</font>|
|Stop Instance within ASG||Desired:維持|<font color=orange>Stop</font> ⇒ <font color="red">**Terminate**</font>|StopされるとDesired数を維持するため、別のInstanceが起動されて、StopしたつもりのInstanceはTerminateされる（Standby状態にはならない）<br/><font color=purple>**Terminate Protection効かない**</font>|<font color=red>StopしたつもりのInstanceが全て無くなるので要注意</font>|

* 因みに、Desired数を変更してASG内のInstance数を調整することは可能だが、その場合でも、ASGに設定されているTermination PolicyによってどのInstanceがTerminateされるか決まる
Scalaのリストとタプル

# 結論
タプルは型に関係無くまとめられるがリストは型に注意すべき。
## 例
同じ型をまとめたい時はタプルでもリストでもまとめられる。

```scala
case class Parson(first: String , last: String)

val me = new Parson("hiro", "t")
val you = new Parson("foo", "bar")
val tuple = (me, you)
// tuple: (Parson, Parson) = (Parson(hiro,t),Parson(foo,bar))
val list = List(me, you)
// list: List[Parson] = List(Parson(hiro,t), Parson(foo,bar))
```

しかし他の型も一緒にまとめたい時下記のようにしてしまうとタプルでは問題ないのに対しリストでは型の不一致によりうまくいかない。

```scala
case class Parson(first: String , last: String)
case class Baz(qux: Int)

val me = new Parson("hiro", "t")
val you = new Parson("foo", "bar")
val quxx = new Baz(777)
val tuple = (me, you, quxx)
// tuple: (Parson, Parson, Baz) = (Parson(hiro,t),Parson(foo,bar),Baz(777))
val list = List(me, you, quxx)
// list: List[Product with Serializable] = List(Parson(hiro,t), Parson(foo,bar), Baz(777))

tuple._1.first
// String = hiro
tuple._3.quzz
// Int = 777
list.head.first
// Product with Serializable = Parson(hiro,t)
list.last.quz
// Product with Serializable = Parson(hiro,t)
```

リストで違う型のものをまとめようとすると自動で型変換をしようとしてくれるみたいだけどそれがうまくいってないとこうなってしまうのかな？
RxCppを使うまで

https://github.com/Reactive-Extensions/RxCpp

# git clone
```
git clone --recursive git@github.com:Reactive-Extensions/RxCpp.git
```

# Makefile
```
CC :=g++
INCDIR := -I<rxcpp/RxCpp/Rx/v2/srcへのフルパス>
SOURCES :=$(wildcard *.cpp)
EXECUTABLE :=$(SOURCES:.cpp=)
 
all:$(EXECUTABLE)

$(EXECUTABLE):$(SOURCES)
	$(CC) $< $(INCDIR) -std=c++11 -pthread -o $@

clean:
	rm -rf $(EXECUTABLE)
```

# RxCpp/Rx/v2/examples/println/main.cpp を実行する

```
$ make
$ ./main
===== println stream of std::string =====
Hello, Matthew!
...
```
Windowsでpyenvとかvirtualenvを使おうと思ったときに学んだことのメモ

2018/01/28 この記事を書いてから3年近くが経ち、新たな仮想環境ツールが出てきたこともあって、頭の整理に[別記事](https://qiita.com/nobolis/items/9edcc9adca302f2959c7)を書きました。仮想環境構築に興味のある方はそちらの記事をご参照ください。
2017/10/22 [masmatsum](https://qiita.com/masmatsum)さんが追記を書いてくださいました。どうもありがとうございました。

# はじめに
　Pythonを始めてからpyenvとかvirtualenvとかいう単語を聞くようになって、その違いが全然理解できなかったときにいろいろと教えてもらったことのメモ。

　2015年1月頃に教えてもらったことに今日（2015/04/11）[PyHack]("http://pyhack.connpass.com/event/13504/")で教えてもらったことを追加しました。今日までpyenvとpyvenvの違いを認識してなかった。

# ざっくりまとめると
* pyenvはPython自体のバージョン管理ツール、virtualenvとpyvenvはPythonのパッケージ管理ツール
* pyenvはWindowsでは使えない
* Python2系・3.2系以前を使っている人はvirtualenvを利用している
* pyvenvはPython3.3系以降で利用可能（最初から含まれている）

# 各ツールについて
## pyenv
* 様々なバージョンのPythonを管理するためのツール
* Python2系とか3系とか、好きなバージョンを指定して実行できる
* Windowsでは使えない  
     参考: [ https://github.com/yyuu/pyenv/issues/62](" https://github.com/yyuu/pyenv/issues/62")

## virtualenv
* Pythonのパッケージ管理ツール
* 指定したPythonを利用して，作成するプロジェクト毎にパッケージを導入して環境を作成できる
* プロジェクト毎に入れるパッケージを変えたい時に利用
* 2系・3.2系以前を使っている人はvirtualenvを使っている。
* バージョンによってツールの使い分けが面倒とかいろいろな事情を考えると、3.3系以降を使っている人も当面はこちらを使うのがオススメ（2015/04/11現在） by @aodag氏

## pyvenv
* Pythonのパッケージ管理ツール
* 3.3系以降で利用可能
* 3.3系以降には最初から入ってる
* 指定したPythonを利用して，作成するプロジェクト毎にパッケージを導入して環境を作成できる
* プロジェクト毎に入れるパッケージを変えたい時に利用
* 3.3系以降を使っている人は最初から入っているため使いやすい

※下の「追記」にあるように、 Python 3.6 以降は pyvenv ではなく venv を使いましょう。

# まとめ
* Windowsユーザーはとりあえずvirtualenvかpyvenvが使えるが、当面のオススメはvirtualenv。  
* 開発環境を使い分けたい場合は利用は必須。  

# おまけ
私は3.4系以降の人＋最初に教えてもらったのがpyvenvなので、pyvenvを使っています。


# 追記 

Python 3.6 から pyvenv は非推奨になりました。
代わりに `python3 -m venv` を使いましょう。

参考：
https://stackoverflow.com/questions/41573587/what-is-the-difference-between-venv-pyvenv-pyenv-virtualenv-virtualenvwrappe/41573588#41573588
https://docs.python.org/dev/whatsnew/3.6.html#id8


# Special Thanks
 [python mini-hack-a-thon]("http://pyhack.connpass.com/")
 [Pythonもくもく会 @アライドアーキテクツ（恵比寿）]("http://mokupy.connpass.com/")
[PyLadies Tokyo]("http://pyladies-tokyo.connpass.com/")
Go言語でフォルダ内のhtmlファイルにメタタグを追加するコマンドラインツールを作る

## やりたいこと
* バイナリファイルと同じフォルダ内にあるhtmlファイルすべてに特定のメタタグを追加したい。
* コマンドラインツールを使えない人に使ってもらう予定なので、実行するだけでいいようにしたい

## 実際のコード

```
package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"regexp"
	"strings"
	"path"
)

type FileInfos []os.FileInfo
type ByName struct{ FileInfos }

func main() {
	var arg string
	
	dir := path.Dir(os.Args[0])
    fmt.Println(dir)
    os.Chdir(dir)
    
	// カレントディレクトリの取得
	var curDir, _ = os.Getwd()
	curDir += "/"
	arg = curDir
	

	

	// ディレクトリ内のファイル情報の読み込み[] *os.FileInfoが返る。
	fileInfos, err := ioutil.ReadDir(arg)

	// ディレクトリの読み込みに失敗したらエラーで終了
	if err != nil {
		fmt.Errorf("Directory cannot read %s\n", err)
		os.Exit(1)
	}

	htmlFiles := regexp.MustCompile("(.*).htm")

	// ファイル情報を一つずつ表示する
	for _, fileInfo := range fileInfos {
		var findName = (fileInfo).Name()
		findhtmlFiles := htmlFiles.FindAllString(findName, -1)
		if len(findhtmlFiles) > 0 {
			contents, err := ioutil.ReadFile((fileInfo).Name())
			fmt.Println(findhtmlFiles)
			if err != nil {
				panic(err)
			}

			content := strings.Replace(string(contents), "<meta http", "<meta name=\"viewport\" content=\"width=device-width\"><meta http", 1)
			fmt.Println(content)

			err = ioutil.WriteFile((fileInfo).Name(), []byte(content), 0644)
			if err != nil {
				panic(err)
			}

		}

	}
}

```


## 未解決事項
*  ```go run```で走らせるとtmpフォルダで実行することになるので、毎回buildが必要になる。
*  もっと綺麗に書きたい。。。

## 参考
* http://d.hatena.ne.jp/emucyo/20110424/1303625646
* http://qiita.com/shinofara/items/e5e78e6864a60dc851a6
CSSで文字列の内側に影をつける

box-shadowにはinsetがあるが text-shadowには存在しないので外側に影をつけることしか出来ない

だが、透明度と背景色をうまく使うことで内側に影をつけることが出来る

例として「龍■」はこんな感じ
![Screen Shot 2015-04-11 at 13.59.52.png](https://qiita-image-store.s3.amazonaws.com/0/40717/aacd4e7e-f2b9-b25f-e31b-46a12f739be7.png)


##方法
とりあえずhtmlとcss

```html
  <div class="row">
    <div>
      <p>1. <br /><span class="shadow shadow-l1">龍■</span></p>
    </div>
    <div>
      <p>2. <br /><span class="shadow shadow-l2">龍■</span></p>
    </div>
    <div>
      <p>3. <br /><span class="shadow shadow-l3">龍■</span></p>
    </div>
    <div>
      <p>4. <br /><span class="shadow shadow-l4">龍■</span></p>
    </div>
  </div>

  <div class="row row2">
    <div>
      <p>1. <br /><span class="shadow shadow-l1">龍■</span></p>
    </div>
    <div>
      <p>2. <br /><span class="shadow shadow-l2">龍■</span></p>
    </div>
    <div>
      <p>3. <br /><span class="shadow shadow-l3">龍■</span></p>
    </div>
    <div>
      <p>4. <br /><span class="shadow shadow-l4">龍■</span></p>
    </div>
  </div>
```

```css
    .row {
      display: -webkit-flex;
      display: -moz-flex;
      display: -ms-flex;
      display: -o-flex;
      display: flex;
      width: 80%;
      margin: 0 auto;
    }

    .row2 {
      background: black;
    }

    .row > div {
      width: 25%;
    }

    .shadow {
      font-size: 10rem;
    }

    .shadow.shadow-l1 {
      color: green;
    }

    .shadow.shadow-l2 {
      color: rgba(0, 128, 0, 0.5);
    }

    .shadow.shadow-l3 {
      color: rgba(0, 128, 0, 0.5);
      text-shadow: 0 0 0 #000;

    }

    .shadow.shadow-l4 {
      color: rgba(0, 128, 0, 0.5);
      text-shadow: 10px 10px 10px #fff, 0 0 0 #000;
    }
```

Gist: [https://gist.github.com/elzzup/00ed2e8d3eb79a85417b](https://gist.github.com/elzzup/00ed2e8d3eb79a85417b)


##解説

(1) 文字の描画

```css
.shadow.shadow-l1 {
  color: green;
}
```

![Screen Shot 2015-04-11 at 14.01.39.png](https://qiita-image-store.s3.amazonaws.com/0/40717/92a6abc1-93fd-726a-8547-94b9fec7bec6.png)


(2) 透明度をつける

```css
.shadow.shadow-l2 {
  color: rgba(0, 128, 0, 0.5);
}
```

背景色が反映される

![Screen Shot 2015-04-11 at 14.01.44.png](https://qiita-image-store.s3.amazonaws.com/0/40717/9e80ae89-e36d-60c3-79c3-d6d3dbaa5b18.png)


(3) 濃い影をつける

```css
.shadow.shadow-l3 {
  color: rgba(0, 128, 0, 0.5);
  text-shadow: 0 0 0 #000;
}
```

![Screen Shot 2015-04-11 at 14.01.39.png](https://qiita-image-store.s3.amazonaws.com/0/40717/86d8e07f-aa0c-2a38-9bf4-78f2820a343b.png)


(4) 薄い影をずらして重ねる

```css
.shadow.shadow-l4 {
  color: rgba(0, 128, 0, 0.5);
  text-shadow: 10px 10px 10px #fff, 0 0 0 #000;
}
```

すると薄い影がかぶらなかった部分が影のように見える

![Screen Shot 2015-04-11 at 14.02.24.png](https://qiita-image-store.s3.amazonaws.com/0/40717/77e5f7fe-2466-095a-1362-59c24268eac9.png)


フォントアイコンなどに使うといい感じになる
ここ[http://zurb.com/playground/foundation-icon-fonts-3](http://zurb.com/playground/foundation-icon-fonts-3) の↓など
![Screen Shot 2015-04-11 at 14.15.40.png](https://qiita-image-store.s3.amazonaws.com/0/40717/e431870d-38bb-6e29-10b7-7d1b938ffdd2.png)

Gist: [https://gist.github.com/elzzup/00ed2e8d3eb79a85417b](https://gist.github.com/elzzup/00ed2e8d3eb79a85417b)
Unityにおけるコルーチンの性質まとめ


## コルーチンとは？
コルーチンとはプログラミングの構造の一種。コルーチンの特徴は処理の途中で一旦中断したりあとからその行から再開できたりすることだ。C#では以下の様な実装の仕方をする。

## コルーチンの実装の例
コルーチンは以下のような宣言をします。

```csharp
IEnumerator coRoutine(){
	msgText.text += "1 ";
	yield return null;
	msgText.text += "2 ";
	yield return null;
	msgText.text += "3 ";
}
```

**IEnumerator**はコルーチンのインターフェースという意味です。とりあえずコルーチンを作るには型を**IEnumerator**にすれば作れるということです。（この表現正確にはおかしいんだけどね。）**yield return null** はココで処理を中断するということです。Unityでは、1フレーム分中断して、次のフレームで続きの行の処理を行います。つまりココでは"1 "を出力したら１フレーム待って"2 "を出力し、さらに1フレーム待って"3 "を出力します。

**コルーチンを使う(Unity only)**

```csharp
//例えばStart()関数で使いたい時
void Start(){
	StartCoroutine("coRoutine");
}
```

コルーチンは「coRoutine();」という書き方をしても動きません。そもそもこいつはインターフェースだしね。コルーチンを動かしたいときは、**StartCoroutine()**を使います。**StartCoroutine("coRoutine")**は「"coRoutine"というコルーチンを開始する」という意味の関数です。まんまですね。

この場合出力結果は以下のようになります。
> 1 2 3

「**あれ？ yield return null 働いてなくね？**」って思った方。ちゃんと働いています。ではStart()関数を以下のように変更してみてください。

```csharp
//例えばStart()関数で使いたい時
void Start(){
	StartCoroutine("coRoutine");
	StartCoroutine("coRoutine");
}
```

出力結果はこうです。
> 1 1 2 2 3 3

もし yield return null が働いていないなら出力は
> 1 2 3 1 2 3

となるはずですよね。どういうことかというと、まず最初のStartCoroutineが始まって"1 "を出力します。その後 yield return null で"coRoutine"の処理は中断されます。次のStartCoroutineでまた"1 "が出力されて、同じように yield return null で"coRoutine"の処理は中断されます。そこでStart()関数は終了しますが、1フレーム待って2つの"coRoutine"が再開されるので"2 ","2 "と数字が出力されるわけです。それが３まで繰り返され、コルーチンが終了します。

コルーチンの処理の中断と再開のメカニズムが分かったでしょうか？

## コルーチンの中断・終了の仕方いろいろ

###yield return null;
1フレーム処理を中断し、再開します。
###yield return new WaitForSeconds( num );
num秒間の間処理を中断します。
### yield break;
コルーチンを途中で終了します。中断ではないので再開はされません。

## Update()内でStartCoroutine()を使うときの注意
Update()内でStartCoroutine()を使うときは注意が必要です。Update()は毎フレームごとに処理される関数なので、スタートさせるコルーチンが１フレームで終了しない場合だと、毎フレームごとにどんどん増えていきます。コルーチンの唯一性を保ちたい場合は以下のように記述します。

```csharp
bool isRunning = false;

IEnumerator coRoutine(){
	if (isRunning)
        yield break;
    isRunning = true;
	
	msgText.text += "1 ";
	yield return null;
	msgText.text += "2 ";
	yield return null;
	msgText.text += "3 ";

	isRunning = false;
}
```

isRunningでコルーチンの動作状態を保持し、動いている場合はyield breakして、余計なコルーチンが作られるのを阻止します。
Ansibleでansible_lsbがないと言われたときの対処


非常に簡単では有りますがメモ。
Ansibleでansible_lsbという変数がないと言われた時の対処。

```
fatal: [*****test] => {'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'ansible_lsb' is undefined", 'failed': True}
```

結論からいうとCentOSでは```redhat-lsb-core```、Ubuntuでは```lsb-core```パッケージが必要です。
minimalなんかから固めに作る人はこれに当たりますが、Basicとか選んでいると大丈夫なはず。

AnsibleはChefと違ってエージェントがいらないとかいうけど、lsbは必要だし、SELinuxを有効にしていればlibselinux-pythonがサーバー側に必要だったりします。
websocket-rails: standaloneモードのサーバでSSL通信


### 動作環境
 * rails 4.1.0
 * websocket-rails 0.7.0


websocket-railsを使ったところ、SSLのところでつまずいたのですがあまり情報もなかったのでメモしておきます。

### standaloneモード
* githubのwikiに記載されているように、PassengerでRailsアプリを起動している場合には、Railsアプリとは別にサーバを起動する必要があります。
 * [Standalone server mode](https://github.com/websocket-rails/websocket-rails/wiki/Standalone-Server-Mode)



* しかし、websocketを利用しているページのプロトコルがhttpsの場合、websocketのプロトコルもSSL通信にする必要があります。
仮に、websocketを利用しているページのURL（ここでは`https://example.com/dashboard`とする）にアクセスした場合、次のようなエラーが出力されます。

```javascript:ブラウザconsole
WebSocket connection to 'wss://example.com:3001/websocket' failed: Error in connection establishment: net::ERR_SSL_PROTOCOL_ERROR
```


### standaloneモードのサーバにSSLの設定
* gemに用意されているrakeタスクを使うと、thinが起動します。このままだとSSL通信できません。

```bash
bundle exec rake websocket_rails:start_server
```

* SSL通信をできるようにするには、websocketのconfigurationで、thinの起動オプションに次の設定を行います。

```config/initializers/websocket_rails.rb
  config.thin_options = {
    ssl: true,
    ssl_key_file: 'path_to_ssl_key_file',
    ssl_cert_file: 'path_to_ssl_cert_file',
    ssl_disable_verify: true,
  }
```

こちらを設定したあとに、rakeタスクでサーバを起動すればhttpsのサイトでも、standaloneモードのサーバで、websocketが利用できるようになりました。

---
機会があれば、Apache側で一旦、wssの通信を受けて、reverse proxyでthinにはSSL無しでつなぐということも試してみたいと思っています。