OmniAICreator/Qiita-1.07M huggingface dataset:
GitLab on docker でLDAP認証を利用する

# はじめに
仕事でもGitHubなどでリポジトリ管理を行いたいのですが、セキュリティの観点上なかなかそういうわけにもいきません。そこでGitLabを使おうと思い調べてみると、[sameersbn/docker-gitlab](https://github.com/sameersbn/docker-gitlab)といった便利なものを作られている方がいました。

下記の記事では、これをもう少し使いやすくする方法が書かれています。
[Dockerで5分くらいでGitLabを試す](http://qiita.com/yacchin1205/items/fa774011d72ead599eb5)

今回は[Dockerで5分くらいでGitLabを試す](http://qiita.com/yacchin1205/items/fa774011d72ead599eb5)を元に、LDAP認証を行うGitLabコンテナを作ってみようと思います。
※LDAPサーバーは既にあるものとします。

# 環境

* OS: ubuntu14.04
* docker version: 1.4.1

# 前準備
```bash
$ git clone https://github.com/doragon/Dockerfile.git
$ mv Dockerfile/ubuntu/14.04/gitlab/ ./
$ rm -rf ./Dockerfile
$ cd gitlab/
$ mkdir git
$ mkdir log
$ mkdir mysql
$ chmod 777 git/
$ chmod 777 log/
$ chmod 777 mysql/
```

# コンテナ起動
## Redis Container
```bash
$ sudo docker run --name gitlab-redis -d sameersbn/redis:latest
```

## MySQL Container
```bash
$ sudo docker run --name gitlab-mysql -d \
 -e 'DB_NAME=gitlabhq_production' \
 -e 'DB_USER=gitlab' \
 -e 'DB_PASS=password' \
 -v [PATH]/gitlab/mysql:/var/lib/mysql \
 sameersbn/mysql:latest
```
※[PATH]は適宜修正して下さい。

## GitLab Container
### LDAP認証を行わない場合
```bash
$ sudo docker run -d -p 10022:22 -p 10080:80 \
 -e "GITLAB_HOST=localhost" \
 -v [PATH]/gitlab/git:/home/git/data \
 -v [PATH]/gitlab/log:/var/log/gitlab \
 --link gitlab-mysql:mysql \
 --link gitlab-redis:redisio \
 sameersbn/gitlab:latest
```

内部の起動に数分かかるので、それを待ってからブラウザにて下記にアクセスする。

```URL
http://(dockerホストのIPアドレス):10080
```

デフォルトのユーザー名、パスワードはこちら。（ログイン後、すぐに変更指示が出ます）

* username: root
* password: 5iveL!fe

### LDAP認証を行う場合
LDAPの設定を行う。修正及び、空欄箇所を埋めるようにする。

```conf:code/conf/env
GITLAB_HOST=
LDAP_ENABLED=true
LDAP_HOST=
LDAP_PORT=389
LDAP_UID=uid
LDAP_METHOD=plain
LDAP_BIND_DN=
LDAP_PASS=
LDAP_ACTIVE_DIRECTORY=false
LDAP_ALLOW_USERNAME_OR_EMAIL_LOGIN=false
LDAP_BASE=
```

```bash
$ cd code
$ sudo docker build -t koide/gitlab:latest .
$ cd ../
$ sudo docker run -d -p 10022:22 -p 10080:80 \
 --env-file ./code/conf/env \
 -v [PATH]/gitlab/git:/home/git/data \
 -v [PATH]/gitlab/log:/var/log/gitlab \
 --link gitlab-mysql:mysql \
 --link gitlab-redis:redisio \
 koide/gitlab:latest
```

# おわりに
LDAPを使用する、しないに関わらず、GitLabコンテナを簡単に作ることができます。
もう少し、詳細な説明をご希望の方は下記を参照して下さい。

* [sameersbn/docker-gitlab](https://github.com/sameersbn/docker-gitlab)
* [Dockerで5分くらいでGitLabを試す](http://qiita.com/yacchin1205/items/fa774011d72ead599eb5)
Slack に今見ている URL を投稿する Chrome Extension を作った

Advent Calendar の日付を完全に勘違いしていました…

それはさておき Slack へ現在見ている URL を Slack へ投稿するブックマークレットがあったので、それを Extension にしてみよう！という感じで作ってみました！

# Slack への投稿方法

## 投稿用の channel を作成
ここでは #extensions とします。

## Incoming WebHooks の有効化
まず Slack へ投稿を行うには、Slack の Integrations の Incoming WebHooks を利用します。

左上の矢印から Configure Integrations を選択して設定します。

Post to Channel に #extensions を指定します。

![Screen Shot 2014-12-22 at 23.09.20.png](https://qiita-image-store.s3.amazonaws.com/0/26206/b2e85aaf-b0f3-e24b-e1a2-173d117178db.png)

そして WebHookURL の所を控えておきます。
Slack へ投稿を行うには、この URL へ JSON 形式の値を payload というパラメータで与えてあげると投稿が行われます。

{"text": "テスト投稿"} という JSON を送ると テスト投稿 という文字列が投稿されます。
詳しくは Webhook URL の Show setup instructions を参照してください。


# extension の作成

これで Slack へ投稿できるようになったので、後は extension を作成するだけです。

本当はもっと綺麗に作る予定だったのですが、時間がなかった + Advent Calendar の日を勘違いしていた 為に非常に簡易的な作りになっています。

extension は html, css, js で作成することができるのでとてもお手軽です。

extension で行なっていることを簡単に解説します。

## manifest.json へ設定情報
extension のタイプ(?)等の設定情報を記述します。

ここで設定すると Chrome の右上にアイコンが表示されます。

![Screen_Shot_2014-12-22_at_23_31_50.png](https://qiita-image-store.s3.amazonaws.com/0/26206/1be77119-6d52-3596-a386-0a15eb7df879.png)

ここを押した際に実行される JS は以下の用にします。

```js
$(function() {
    chrome.tabs.getSelected(null, function(tab) {
        var requestURL = localStorage.getItem('request_url');
        var channel    = localStorage.getItem('channel');
        var username   = localStorage.getItem('username');
        var text       = tab.title + ' : ' + tab.url;

        $.ajax({
            url: requestURL,
            type: 'post',
            data: 'payload=' + JSON.stringify({
                "channel": channel,
                "username": username,
                "text": text
            })
        });
    });
});
```

Extension なので jQuery なんか使わない方が良さそうなのですが、時間がないため簡単に済まします。

これで押した際にこの JS が実行されて Slack への投稿が行われます。


# Extension の使い方

この extension の導入方法、使い方を軽く解説します。

## 導入方法

まず、これは開発中なので extension の公式にはありませんので以下の github からソースを落としてきます。
https://github.com/kazunari-yamashiro/slack-it-later

これを解凍して Chrome のハンバーガーメニュー -> 設定 -> 拡張機能 と進みます。

右上の 開発モード にチェックを入れます。そうすると以下のような画面になります。

![Screen Shot 2014-12-22 at 23.44.00.png](https://qiita-image-store.s3.amazonaws.com/0/26206/638cabff-eab3-aeb0-d91a-83d2aae11a03.png)

Load unpacked extension... を押して、先ほど解凍したディレクトリを指定します。

これで拡張機能を取り込めました。

※ Windows 版の Chrome だと Beta channel に設定しないと自分が追加した拡張機能は削除されてしまうらしいです。(Mac なので未確認)


## 設定

追加が完了すると拡張機能一覧へ Post to slack というものが表示されるようになるので、Options をクリックします。

![Screen_Shot_2014-12-22_at_23_44_00.png](https://qiita-image-store.s3.amazonaws.com/0/26206/02d8a78f-1ae8-4856-29dd-888db1cdb4dd.png)

すると以下の画面が表示されるので、必要な情報を入力します。

![Screen Shot 2014-12-22 at 23.50.07.png](https://qiita-image-store.s3.amazonaws.com/0/26206/5c33462d-c2ae-1410-9cc9-971ee5f3cc60.png)

リクエスト URL には始めの方で控えた Slack の URL を貼り付けます。
チャンネルには #(シャープ) 付きの Channel 名 (ここでは #extensions)
ユーザー名に入力した値が Slack 書き込み時のユーザー名の所に表示されます。
最後にメッセージは今は使われていません……

ここまで入力して保存を押して設定を保存します。

## 使い方
投稿したい URL を閲覧中に 右上のアイコンをクリックすると Extensions という文字が現れるとともに Slack への投稿が行われます。


# 最後に

もっといい感じのものを作る予定でしたが、結構粗悪な、そして Calendar の日付を間違えるというぐだぐだでしたが、ちょっとだけ いいね！ っと思ってもらえると幸いです。
Debian GNU / Linux Version 7.7のMicrosoft Azure向けイメージ

# Debian GNU / Linux Version 7.7のMicrosoft Azure向けイメージを公開しました #

しばらく間が空いてしまっていたのですが、Microsoft Azureで改めてDebian7 Release7のイメージを提供します。
私も昔からDebianには相当お世話になってきたので、少しでも役に立てたり、少しでも多くのMicrosoft Azure on Debianな人が使ってくれたら幸いです。

## 提供場所 ##

![](http://quickpress.blob.core.windows.net/kzmx/2015/01/vmdepot-debian.png)

Microsoft Azureは**VMDepot**というコミュニティ向けに、Microsoft Azure VirtualMachine用のイメージを共有する場所を[MS Open Technologies  https://msopentech.com/](https://msopentech.com/ "MS Open Technologies")が提供しています。

このイメージは、**VMDepot**の以下URLにて提供しています。

[https://vmdepot.msopentech.com/Vhd/Show?vhdId=50175&version=51305](https://vmdepot.msopentech.com/Vhd/Show?vhdId=50175&version=51305)

- Name : Debian7.7 20150111 Wheezy
- Categories : Developer Tools
- Platform : debian
- Tags : debian   linux   wheezy
- Regions : All
- Available in future regions : yes
- イメージサイズ 49GB

| Public Port | Local Port |
|:-----------|------------:|
| 22 | 22 |

## Imageの内容 ##

### WALinuxAgentの導入 ###

WALinuxAgentはマニュアルでインストールしてあります、これに伴い必要な依存関係のパッケージを事前に導入済みです。このスクリプトはMicrosoft Azure PortalへCPUやメモリなどのステータスや起動時のユーザー追加などを行ってくれています。

詳しくは、以下のGithubを参照ください。
[https://github.com/Azure/WALinuxAgent](https://github.com/Azure/WALinuxAgent)

### sudo ###

一般ユーザーに予め、usersのグループに昇格権限を付与しています。
一般ユーザーでログインしてもらい、必要に応じてsudoでroot権限に昇格可能です。
また、rootはパスワードがwa-agent --deprovitionによりランダムにされています。

##フィードバックその他 ##

SNSででも、ほかの方法でも直接聞いてもらえればと思います。可能な限り時間があれば対応しますが、原則的に「At Your Own Risk」です。
Amazon VPC特徴一覧

Amazon VPCまわりをまとめてみる自分メモです。機能一覧というか特徴を程よく一覧にしたかったのですが、そういうのって難しいですね、ええ。VPCとはAWS上にプライベートネットワーク空間を構築できるネットワークサービスで、以前はEC2 Classicとの併用だったんですが、今アカウントを登録したら、自動的にVPCのみを使用するようになっているというものです。

## Amazon VPC特徴一覧

|項目|内容|補足|
|:---|:---|:---|
|料金|VPN 接続 1 時間当たり0.048 USD（東京リージョンへの接続）VPC自体の料金は無料|http://aws.amazon.com/jp/vpc/pricing/|
|VPC制限|http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html|一部パラメータは上限緩和申請することができる|
|VPC CIDR|CIDR範囲は/16(65534)～/28(14)/MultiAZで設定可能|VPC作成後に範囲やアドレスブロック変更不可|
|Subnet|VPC CIDR範囲内で指定|AZをまたがったSubnetは作成できない|
|Route Table|Subnetに紐づけ、データの流れを制御する/LocalはVPC内Subnet全ての意味||
|Internet Gateway|Internetに接続するためのゲートウェイ/Route Table内でターゲットとして指定する|IGWはVPCで一つだけ取得可能|
|Private Subnet|IGWへのルーティング設定がないRoute Tableを使用したSubnet||
|Public Subnet|IGWへのルーティング設定があるRoute Tableを使用したSubnet||
|NATインスタンス|Private Subnetからインターネットへアクセスするのに使用|Public Subnetに配置/Patch適用時/Private Subnet→Amazon S3には別途記述のVPCエンドポイントが使用できる|
|NAT Gateway(Managed NAT GW)|Private Subnetからインターネットへアクセスするのに使用|ゲートウェイは高可用性のための冗長機能あり/それぞれのゲートウェイは最大10GbpsまでのTCP, UDP, ICMPトラフィックを扱える|
|VPC Security Group|EC2インスタンスなどへのInbound,Outboundアクセスを制御/許可する対象を指定(デフォルト拒否)|ステートフル(許可されたInboundへの応答は、OutboundルールにかかわらずOutboundに流れる)|
|NACL(Network Access Control)|SubnetへのInbound,Outboundアクセスを制御/Allow,Denyを指定/Inboundに対してアクセス元,Outboundに対してアクセス先を指定|ステートレス|
|DNS resolution|VPC内のDNS名前解決機能|基本的には有効にする|
|DNS hostnames|VPC内のDNS名割り当て機能|DNS resolutionが有効でないと有効にできない|
|DHCP options sets|ドメイン名,DNSサーバ名,NTPサーバ名,NetBIOSサーバ指定,NetBIOSノードタイプ指定が可能|
|Public IP|EC2へ割り当て有無変更可能/stop→startで値変わる/値はランダム/EC2起動時に割り当て可能かどうかを選択できる||
|Private IP|EC2へ必ず割り当て/stop→startで値変わらない/値は指定可能||
|Elastic IP|Public IPを固定して使いたいときに取得|使用していないElastic IPは課金対象/使用していれば無料|
|ENI(Elastic Network Interfaces)|VPC上の仮想NIC/Private IP,Public IP,MACADDR,Security Groupに紐づける/|インスタンスによって割り当て可能数が異なる/MACADDRのライセンス認証やメール配信システムでの送信元アドレスとして利用可能/複数指定すると個々のネットワークIO性能は低下|
|EC2 Dedicated Instance|インスタンスのテナント属性をハードウェア専有にしたもの(別アカウント,共有EC2インスタンスと別ハードウェアで動作)|dedicatedに設定されたVPCでは動作しないサービスあり(Amazon RDSなど),インスタンスの料金が異なる|
|VPN(Virtual Private Network)?|VPCとオンプレミス環境をインターネットでセキュアに接続/IPsec VPN||
|VPN Connection|VPN Gateway(AWS側),Customer Gateway(利用者側)を設定/VPN Routerの設定はAWS側でConfigurationファイルを提供|
|AWS Dirrect Connect|VPCと利用者環境を専用線で接続可能|http://aws.amazon.com/jp/directconnect/|
|VPC Peering|VPC間を繋げてPrivate IPで通信する機能/別アカウント間でも可能|CIDRが重複している場合はNG/同Region内のみ/2ホップ以上のRoutingはできない/Route TableのTargetにPeering Connection IDを指定/1:1の接続となるが、複数のVPCと個々に接続することは可能|
|ClassicLink|VPC内リソースと特定のEC2-Classicインスタンスとを通信させる機能/VPCのセキュリティグループにEC2-Classicインスタンスを加えることが可能/インターネットを介さず相互接続ができる|VPCのIPアドレス範囲が10.2.0.0/16〜10.255.0.0/16の場合は利用不可|
|VPCエンドポイント|VPCと他のサービスをプライベート接続するためのエンドポイント/プライベートサブネット→パブリックサブネットのNAT→S3といった経路が不要になった|今はS3-VPCのみ/同じリージョン内に限られる|
|tag|VPC,subnet,VPNなどにも設定可能||
|AWS CloudFormation|Amazon VPCに対応||
|AWS OpsWorks|Amazon VPCに対応||
|VPC Flow Logs|VPCサブネットやENIのネットワークトラフィックがCloudWatch Logsへ保存される|フローは約10分間隔/以下は含まれない1.プライベートホストゾーンへのクエリを含む、Amazon DNSサーバへのトラフィック2.Amazonが提供するWindowsライセンスのアクティベーションのトラフィック3.インスタンスメタデータのリクエスト4.DHCPリクエストとレスポンス|

*間違っていたらご指摘お願いいたします
Javaジェネリクス：PECSって何？

StackOverflowで見かけた質問とステキな回答。

質問：[Java Generics: What is PECS?](http://stackoverflow.com/questions/2723397/)
回答：[ファンシー図解](http://stackoverflow.com/questions/2723397/19739576#19739576)

（PECS＝Producer `extends` and Consumer `super`）
Xamarin StudioとGenymotionでAndroid開発 - Part1: インストール

Xamarin.Androidを開発するための環境をWindows7に用意します。続きはOSXでも開発をしたいのでIDEはXamarin Studioを単体で使うことにします。Androidエミュレータは[Genymotion](https://www.genymotion.com)を使います。Xamarinアカウントは無料のSTARTERプランではサブスクリプションがないので、[Xamarin Android Player]( http://developer.xamarin.com/guides/android/getting_started/installation/android-player/)は使えません。INDIE以上の有料サブスクリプションが必要になります。

## Xamarin Android Player

無料のSTARTERプランではXamarin Android Playerが使えません。OpenGLに対応しているなど高機能なので使いたいのですが、学習段階では無料プランで試したいです。他のAndroidエミュレータを探しているとGenymotionがよさそうです。

## Genymotion

[Genymotion](https://www.genymotion.com)はVirtualBox上で動作します。あらかじめVirtualBoxの最新バージョンをインストールしておきます。今回は4.3.20を使います。Genymotionのサイトで無料アカウントを作成してからインストーラーをダウンロードします。VirtualBoxはインストール済みなので、`Get Genymotion (without VirtualBox) (25.39MB)`をダウンロードします。


Genymotionのバージョンは2.3.1です。

![genymotion-version.png](https://qiita-image-store.s3.amazonaws.com/0/43745/7e3abee5-7676-06b3-8c68-7dab6124fd4d.png)



## Google Nexus 4 - 4.4.4 - (API19) - 768x1280

Genymotionを起動すると初回に`Add a first virtual device`のダイアログが表示されます。

![genymotion-add-first-device.png](https://qiita-image-store.s3.amazonaws.com/0/43745/33824a04-045a-0154-7987-067e5df5831d.png)


VirtualBoxが起動していない状態で、Genymotionを起動します。ログインして`Availavle virtual devices`を表示します。`Google Nexus 4 - 4.4.4 - (API19) - 768x1280`のvirtual deviceを追加します。


![genymotion-list.png](https://qiita-image-store.s3.amazonaws.com/0/43745/59791d5e-0dbd-e31d-502c-8fd0d962f1e2.png)


`Your virtual devices`からインストールしたデバイスを選択して起動します。

![genymotion-nexus4-virtual-device.png](https://qiita-image-store.s3.amazonaws.com/0/43745/f1c99930-f34a-5a28-ddb5-448cf15f127a.png)


## Xamarinアカウント

[Xamarin](http://xamarin.com/)のサイトからアカウントを作成します。最初なので無料のSTARTERプランのまま続けます。

## Xamarinのインストール

[Download](http://xamarin.com/download)ページからXamarinInstaller.exeをダウンロードして実行します。Requirementsも自動でダウンロードしてくれます。

* Java JDK 1.7
* Android SDK 22.0.0
* GTK# 2.12.25
* Xamarin Studio 5.5.4
* Xamarin 3.8.150

環境に依存しますが1時間くらいすべてインストールにかかりました。Xamarin Studioを起動して右上の`Log in`からXamarinアカウントにログインします。

![xamarin-studio-windows-login.png](https://qiita-image-store.s3.amazonaws.com/0/43745/f6d358e6-db45-1d84-faa9-6d259f5dfcb9.png)


Xamarin Studioのバージョンは5.5.4です。


![xamarin-studio-version.png](https://qiita-image-store.s3.amazonaws.com/0/43745/a95d0c50-47e5-1b69-8bbe-3b5e61aff602.png)
swiftでS3のマルチパートアップロード時のETagを計算する


## CommonCrypto.hインポート
ブリッジヘッダにCommonCrypto.hをインポートする。
このファイルはswiftプロジェクトでObjective-Cのファイルを作成すると作れる。作ったObjective-Cのファイルは削除してOK。

```objective-c:project-Bridging-Header.h
#import <CommonCrypto/CommonCrypto.h>
```

##extension作成
別ファイルにするやり方がわからなかったのでメソッドを使うファイルに書いてます
別ファイルにするやり方誰か教えてください ;-(

```swift:extensions.swift
extension NSData {
    func s3etag(minimumPartSize: UInt64 = 5 * 1024 * 1024) -> String {
        func md5digest(data: NSData) -> NSData {
            let digestLength = Int(CC_MD5_DIGEST_LENGTH)
            let md5Buffer = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLength)
            
            CC_MD5(data.bytes, CC_LONG(data.length), md5Buffer)
            return NSMutableData(bytesNoCopy: md5Buffer, length: digestLength)
        }
        func md5hexdigext(data: NSData) -> String {
            let digestLength = Int(CC_MD5_DIGEST_LENGTH)
            let md5Buffer = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLength)
            CC_MD5(data.bytes, CC_LONG(data.length), md5Buffer)
            var output = NSMutableString(capacity: Int(CC_MD5_DIGEST_LENGTH * 2))
            for i in 0..<digestLength {
                output.appendFormat("%02x", md5Buffer[i])
            }
            return String(format: output)
        }
        var size = UInt64(self.length)
        if size > minimumPartSize {
            var md5s = NSMutableData()
            var partCount = UInt64((size + (minimumPartSize / 2)) / minimumPartSize)
            for var i:UInt64=0; i<partCount; i++ {
                var dataStart  = Int(i * minimumPartSize);
                var dataLength = Int((i == (partCount - 1)) ? (size - (i * minimumPartSize)) : minimumPartSize)
                md5s.appendData(md5digest(self.subdataWithRange(NSMakeRange(dataStart, dataLength))))
            }
            return md5hexdigext(md5s) + "-" + String(partCount);
        } else {
            return md5hexdigext(self)
        }
    }
}

```

swift的にバイナリデータ扱うのはNSData使えばいいのか、全然違う方法があるのか、、、うーん。。。


こちら参考にさせてもらいました。
http://stackoverflow.com/questions/24123518/how-to-use-cc-md5-method-in-swift-language
FASTAQ => FASTA


perl のワンライナーに関しての、適当な解説 [#1](http://qiita.com/bunzaemon/items/fdb1115ac97fc0955236)/[#2](http://qiita.com/bunzaemon/items/e63947c7e59e0fe4ce3d)/[#3](http://qiita.com/bunzaemon/items/efcb3f20329bc68bb8bc)/#4


##### FASTQ と FASTA について
201501 現在 

FASTQ に関しては、リードの配列と qual はそれぞれ一行に表示されています。従って複数行になっている場合は考慮しません。
逆に FASTA に関しては複数行の可能性があるものに関しては、その旨明記の上、コードを書きます。


## FASTQ => FASTA
fasta のみ出力したいなら話は簡単です。

fastq.fq => seq.fa にします。

なんか、[こんなの](http://sourceforge.jp/projects/sfnet_ngs-toolbox/)（リンク先の FASTQ_to_FASTA.pl ）もあるみたいですが、、、


### ワンライナー

```bash:
$ perl -lne 'next if ( $. - 1 ) % 4 >= 2 ; s/^\@/>/ if $. % 4 == 1 ; print' fastq.fq > seq.fa
```
`$.` で、読んでる行番号が把握出来ます。
従って、`( $. - 1 ) % 4` によって場合分けをして、2 以上であれば、qual なので無視します。

で、ヘッダ行の @ を > に置換して出力するだけです。

#### 60 塩基毎に改行

FASTQ を FASTA にした場合に、本来の FASTA 書式（即ち一定塩基長で改行を入れる事）に従う人はあまりいないでしょうし、する必要も無いと思います。

しかし、一定塩基毎に改行を入れる例として、、、

```bash:
$ perl -lne 'next if ( $. - 1 ) % 4 >= 2 ; s/^\@/>/ if $. % 4 == 1 ; s/(.{1,60})/$1\n/g if $. % 4 == 2 ; print' fastq.fq > seq.fa
```
以下が新たに加わりました。
`s/(.{1,60})/$1\n/g if $. % 4 == 2` 

## FASTAQ => FASTA, QUAL
ツールを使いたい方は[こちら](http://hannonlab.cshl.edu/fastx_toolkit/)へ


fastq.fq => seq.fa, seq.qual に分割します。

### ワンライナー

```bash:
$ perl -Mvars='$f,$n' -lne 'open $f, q{>>}, ( $. - 1 ) % 4 < 2 ? q{seq.fa} : q{seq.qual} ; $n = ( /\@(.*?)$/ )[0] if $. % 4 == 1 ; print {$f} $. % 2 == 1 ? ">$n" : $_ ' fastq.fq
```


* 追加書き。複数回実行する場合は、前のデータをリネームしてから実行。
* ファイルハンドルの切り替えと、ヘッダ出力の判断に三項演算子をつかっています。

### 別解

```bash:
$ perl -Mvars='@f,$n' -lne 'BEGIN{ open $f[$_], q{>}, $_  ? q{seq.qual} : q{seq.fa} for 0 .. 1 }  $n = ( /\@(.*?)$/ )[0] if $. % 4 == 1 ; print { $f[ int ( ($. - 1) % 4 / 2 ) ] } $. % 2 == 1 ? ">$n" : $_ ' fastq.fq
```

* 追加書きじゃないコードを書くと途端に煩雑になる。
* `BEGIN{}` でファイルハンドルを二つ開いて
* ファイルハンドルの切り替えを `int ( ($. - 1) % 4 / 2 )` に託す

実の所、配列のインデクスは、自動的に `int` されてるっぽいんですよね。
`$f[ ($. - 1) % 4 / 2 ]` でもきちんと動くって言う、、、

```bash:
$ perl -le '$a = [ 10, 20] ; print @{$a}[0.99,1.55]'
1020
```
mac で perl のワンライナー #1


perl のワンライナーに関しての、適当な解説 [#1](http://qiita.com/bunzaemon/items/fdb1115ac97fc0955236)/[#2](http://qiita.com/bunzaemon/items/e63947c7e59e0fe4ce3d)/[#3](http://qiita.com/bunzaemon/items/efcb3f20329bc68bb8bc)/#4


##### 一般的な事
ワンライナーは、コマンドラインフィルターの常套手段。
つーことで、初歩的なコマンドラインフィルターを2、3
ああ、当然 `perl` で説明しますが、 `awk` でも普通に出来ることも

mac only

## pbpaste
もちろんご存知 `pbpaste`

### s/\r/\n/g 
```bash:
$ pbpaste | perl -lpe 's/\r/\n/g' | pbcopy
```

`nkf` 使いたいけどね

### URL

例えば、URL 引っ込ぬくのに

```bash:
$ pbpaste | perl -lpe 's/^/curl -O /' | sh
#$ pbpaste | perl -lne 'qx{curl -O $_}' # 別解
```

なんてして、`sh` に食わせるのは基本

ファイルに一々保存して、`cat SOMETING.txt | perl ...` なんて事はやりたくない、、、


### URL と他の文が混っているならば、

```bash:
$ pbpaste | perl -lne 'qx{curl -O $1} if /(http.*?jpg)/' 
# 正規表現部分は、本来はもっとしっかりと書くべき
```

### URL が一行一サイトに限らないのであれば、

```bash:
$ pbpaste | perl -lne 'qx{curl -O $1} while /(http*?.jpg)/g'
```

Automator でサービス化するんだったらもちょっと正規表現には手を加えないといけない、、、

## tree もどき
mac には存在しない `tree` コマンド
perl で実装するとこんな感じ

```bash:
find . | perl -MCwd -lpe 'my $f = -d ; s{[^/]*/}{+--}g;s{\+--(?=\+)}{   }g;s/^\.$/getcwd/e ; $_ .= q{/} if $f'
```

ネットのどこかで拾ったものを改造

実際の運用では、`.bashrc` に

```bash:
function tree () {
	find . "$@" | perl -MCwd -lpe 'my $f = -d ; s{[^/]*/}{+--}g;s{\+--(?=\+)}{   }g;s/^\.$/getcwd/e ; $_ .= q{/} if $f'
}
```
とでも書いて、

```bash:
$ tree -maxdepth 2
```

などとする

### 2019/02/21 追記

現状では、

```
function tree () {
    find $(pwd) "$@" | \
        perl -lpe '$a //= $_ ; my $f = -d ;' \
            -e 's{$a}{} ; s{[^/]*/}{+--}g; s{\+--(?=\+)}{   }g; ' \
            -e '$_ ||= $a  ; ' \
            -e '$_  .= q{/} if $f'
}
```

こっちだと -name '.*' -prune -o -print が効く。


```
$ tree -maxdepth 2 -name '.*' -prune -o -print | head
/Users/bunzaemon/
+--Music/
   +--iTunes/
+--cmd/
   +--homebrew/
+--Pictures/
   +--写真 Library.photoslibrary/
+--Library/
   +--Application Support/
   +--Maps/
```

不可視ファイルが見えなくなってすっきり。
randomの動かし方

すごいH本を写経していて9.6ランダム性の部分がGHC7.8.3では動かなかった

```
Prelude> random (mkStdGen 100) :: (Int, StdGen)

<interactive>:6:1: Not in scope: ‘random’

<interactive>:6:9: Not in scope: ‘mkStdGen’

<interactive>:6:32:
    Not in scope: type constructor or class ‘StdGen’
```

importしてみてもダメだった

```
Prelude> import System.Random

<no location info>:
    Could not find module ‘System.Random’
    It is not a module in the current program, or in any known package.
Prelude> import System.Random

<no location info>:
    Could not find module ‘System.Random’
    It is not a module in the current program, or in any known package.

```

どうやらrandomというパッケージを入れれば良いみたい


```bash
$ brew install cabal-install
$ cabal update
$ cabal install random
```

無事動いた

```
relude> import System.Random                                                                               
Prelude System.Random> random (mkStdGen 100) :: (Int, StdGen)                                               
Loading package array-0.5.0.0 ... linking ... done.                                                         
Loading package deepseq-1.3.0.2 ... linking ... done.                                                       
Loading package old-locale-1.0.0.6 ... linking ... done.                                                    
Loading package time-1.4.2 ... linking ... done.                                                            
Loading package random-1.1 ... linking ... done.                                                            
(-3633736515773289454,693699796 2103410263)

```
Swift 対応版 CocoaPods を使う


## 対応バージョン

CocoaPods が [v0.36.0](https://github.com/CocoaPods/CocoaPods/releases/tag/0.36.0) より、Swift に対応しています。

## Install

```sh
$ gem install cocoapods
```

## Podfile

`Podfile` の記法は変わりないです。

```
pod 'Alamofire', '~> 1.1.3'
pod 'HanekeSwift', git: 'https://github.com/Haneke/HanekeSwift', branch: 'podspec'
```

気をつける事としては従来通り `.podspec` ファイルが必要ですので、podspec が別ブランチで用意してあるライブラリの場合は上記の様に指定が必要です。

また、Swiftライブラリを利用する場合は、以下２点の対応が必要です。

- `Deployment Target` が `8.0` 以上であること。
- Podfile に `use_frameworks!` の記述を加えること。[参考issue](https://github.com/CocoaPods/CocoaPods/issues/3029)


## Usage

`pod install` を実行すると、Swift ライブラリを含む場合（iOS8.0 以上）は `Pods_{app_name}.framework` といった名前の Dynamic Framework を作成してリンクします。

この場合はライブラリを利用するファイルの先頭で `import hoge` と記述する事で、ライブラリの利用ができます。

また、Objective-C のライブラリを含む場合で Swift から Objective-C ライブラリを利用する際、`Bridging-Header` の記述不要で、`import hoge` の記述のみで利用できます。

Swift ライブラリを含まない場合は従来の `libPods-{app_name}.a` といった名前の Static Link Library が作られます。

## まとめ

一足早く Swift 対応した https://github.com/Carthage/Carthage と比較して、今までの Objective-C ライブラリなど利用できるライブラリ数も多いので、大変助かります。
シンボリックリンクを貼る

vagrantだと/vagrant以下が共有ディレクトリになっておりローカルからいじれる。
しかしterminalから操作するときに毎回ホームディレクトリから

```
$ vagrant ssh
$ cd /vagrant/traintrack 
```

とルートディレクトリに移動するのがめんどくさくなった。そこで、

```
$ ln -s /vagrant/traintrack/ /home/vagrant/traintrak
```

としてやることで

```
$ vagrant ssh
$ cd traintrack 
```

でokとなった。微々たる違いだけど。
Rails new でいつもの準備を済ませる

詳細は [Rails Application Templates — Ruby on Rails Guides](http://guides.rubyonrails.org/rails_application_templates.html) 参照のこと

下の設定で：

* .gitignore にvim, rails 用の記述を追加
* Guardfile の初期化
* Gemfile に各種gem を追記
* Rails 向けRSpec の初期化
* Rubocop 設定ファイルの配置
* git add . & commit -m 'Initial commit' 済

から作業を始められる

※テンプレートの名称は自由。`rails new` のときに別にテンプレートを指定した場合はそちらが優先される

```bash:~/.railsrc
--skip-test-unit
--template=https://github.com/**user_name/repo_name**/raw/master/.rails_application_template.rb # remote url or local path
```

```ruby:some_where_to_github_repo/.rails_application_template.rb
gem_group :doc do
  gem 'yard'
end

gem 'rb-readline'
gem 'slim-rails'

gem_group :development do
  gem 'rubocop', require: false
  gem 'guard'
# ...
end

gem_group :development, :test do
  gem 'rspec-rails'
# ...
end

gem_group :test do
  gem 'timecop'
# ...
end

after_bundle do
  run 'mv README.rdoc README.md'
  run 'curl https://www.gitignore.io/api/vim,rails > .gitignore'
  run 'curl -L https://github.com/gouf/dotfiles/raw/master/.rubocop.yml > .rubocop.yml'
  run 'bundle exec guard init rspec'
  run 'bundle exec guard init rails_best_practices'
  run 'bundle exec guard init rubocop'
  run 'bundle exec rails generate rspec:install'

  git :init
  git add: '.'
  git commit: "-a -m 'Initial Commit'"
end
```
FragmentからintentしたactivityのonActivityResultをActivity側で取る

もうタイトルがよくわからない事になってますが、個人的に変な実装をしていたのでメモがてら

ViewPager等でActivityの中にfragmentを入れて管理している場合、fragmentのコード上で`startActivityForResult`をすると、当然fragmentコード内の`onActivityResult`が呼ばれます。
これを親側のActivityの`onActivityResult`が呼ばれるようにしたかったので、リスナーを実装して無理矢理送りつけていたのですが、これは間違いでした。
よく考えれば当然のことなのですが`getActivity().startActivityForResult`することで、fragment上でも親Activityから`startActivityForResult`することが出来、これでActivity側の`onActivityResult`が呼ばれます。
Rails4.0 -> 4.1 で 出会った修正

基本は下記を見る。

http://railsguides.jp/upgrading_ruby_on_rails.html#rails-4.0%E3%81%8B%E3%82%89rails-4.1%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89

以下の `<<`を使った親子関係の子を挿入してsave!したところでnull例外。`parent_children.parent_id`がnullと言う。

```:rb
child = FactoryGirl.create(:child)
parent.child << child
stage.save!
```

下記のように命じする事で回避。

```:rb
child = FactoryGirl.build(:child)
parent.parent_children.build(parent:parent, child: child)
stage.save!
```

本当の原因を探っていないがこういうことがあった記録を取っておく。
Raspberry Piのビデオ出力を有効にする

# はじめに

Raspberry Piは、Linuxベースで動作する低価格の名刺サイズコンピュータで、ARMベースのプロセッサ、グラフィックス機能、HDMIとビデオ出力コネクタ、USB2.0、イーサネットコネクタなどの基本的なインターフェースを搭載しています。

![スライド](https://qiita-image-store.s3.amazonaws.com/0/3862/3e45d3ad-9c59-1203-236c-6371f0bed0c0.jpeg)

必要なものは以下のとおりです。

* Raspberry Pi Type B 512MB
* USB2.0ケーブル A-microBタイプ50cm
* Raspberry Pi用のOSインストーラー入りSDカード
* USBマウス
* USBキーボード
* HDMI対応のディスプレイ
* HDMIケーブル
* LANケーブル

Raspberry PiにはOSが未インストールの状態のため、SDカードにOSをインストールする必要があります。
今回は、[Raspberry Pi用のOSインストーラー入りSDカード](http://www.switch-science.com/catalog/1472/)を購入しました。

Raspberry Pi用のOSインストーラー入りSDカードには、NOOBS (New Out of Box Software)というOSインストーラがインストールされています。
このインストーラを利用して好きなOSのイメージをネットワークからダウンロードしてインストールします。
今回はRaspbianというOSをインストールしました。

# ビデオ出力の有効


インストール後、HDMIケーブルを抜いてビデオ出力ケーブルを接続しても有効にならなかったため、/boot/config.txtを編集しました。
最終的に、以下の内容でビデオ出力を有効にしました。

```text:/boot/config.txt
# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
#disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
#hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)

hdmi_group=2
hdmi_mode=82


# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2
sdtv_mode=1
#sdtv_aspect=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# for more options see http://elinux.org/RPi_config.txt

# NOOBS Auto-generated Settings:
#hdmi_force_hotplug=1
config_hdmi_boost=4
overscan_left=24
overscan_right=24
overscan_top=16
overscan_bottom=16
disable_overscan=0

```
python3向けのkii cloudライブラリ書きました。

たまたまkii cloudを使う機会があってサーバーはpyramidで作っていたのでpython3向けのライブラリを書きました。
既に他に作っている人のライブラリはあったんですがpython3のシンタックスで書き直したかった為ゼロから書きました。

https://github.com/ta2xeo/python3-kii

enumを使用しているので3.4以上じゃないと動きません。

公式ドキュメントに出来るだけ沿って書いているのがウリです。
メソッド名もドキュメントと全く同じにしてあります。
あとQuery for objectsがSQLAlchemyっぽく引けるのもウリです。

まだ全ての機能が実装できておらず特にACL周りは全く対応していないのでこれからちょっとずつやっていく予定です。

インストール方法

    $ git clone https://github.com/ta2xeo/python3-kii
    $ python setup.py install

使用方法

```py3

>>> from kii import KiiAPI, KiiAdminAPI
>>> api = KiiAPI(app_id, app_key, region='JP')  # 通常ユーザー向け
>>> admin_api = KiiAdminAPI(app_id, app_key, client_id, client_secret, region='JP')  # 管理者向け

```

管理者向けと分けてあるのはusersスコープのmeリテラルでアクセスすることを禁止する為です。
アクセストークンのみでは通常ユーザーと管理者を区別することが（多分）出来ない為このような方法を取っています。

生成したインスタンスには各Managementへの属性が用意されていてそれを経由することで実行できます。

```py3

>>> api.users   # http://documentation.kii.com/rest/#user_management
<kii.users.Users object at 0x1020424a8>
>>> api.groups  # http://documentation.kii.com/rest/#group_management
<kii.groups.Groups object at 0x1020590f0>
>>> api.buckets # http://documentation.kii.com/rest/#data_management
<kii.buckets.Buckets object at 0x102059198>

# 例えばCreate a user and obtain access tokenなら

>>> user = api.users.create_a_user_and_obtain_access_token(login_name='qiita', password='test1234')
>>> user
<kii.results.UserResult at 0x105e790b8>
>>> user.access_token
'Sasdfe2wov5ofKLKflmsdwe8L93I20tflkjjoil'
>>> user.login_name
'qiita'
>>> user.password
AttributeError: 'UserResult' object has no attribute 'password'

```

ドキュメントと同じにしているせいでメソッド名がかなり長いのですがわかりやすいとは思うのでこのようにしています。
一部ショートカットを用意してたりもしますが利便性を考え今後はもっと増やすかもしれません。

バケットの基本操作について

```py

>>> api.buckets.application # Application Scope
>>> api.buckets.group       # Group Scope
>>> api.buckets.user        # User Scope

>>> test = api.with_access_token(user.access_token).buckets.application('test')  # application scopeのtestというbucket名
>>> obj = test.create_an_object({'key': 'value'})
>>> obj
<kii.results.CreateResult at 0x103d4f2b0>
>>> obj.object_id
'b3c33b20-8761-11e4-acf1-55666a765afd'
>>> same = test.retrieve_an_object(obj.object_id) # オブジェクトの取得
>>> body = 'plain text'
>>> same.add_or_replace_body(body, 'text/plain')  # bodyへのアップロード
# 結果として取得したオブジェクトのメソッド名は少し短くなっています。

```

クエリを使用した検索について

```py3

>>> from kii import Clause, RangeClause
>>> eq = Clause.eq('_id', 'object_id')
>>> result = test.query(eq).one()
>>> and_ = Clause.and_(Clause.eq('from', 'Tokyo'), RangeClause('age').ge(20))
>>> result = test.query(and_).all()
>>> result_by_order = test.query(and_).order_by('age').all()
>>> result_limit = test.query(and_).limit(5).all()

```

ドキュメントはまだ用意していないのでサンプルはテストコードを見てもらうのが一番早いと思います。
Jekyllでpostsをpluginの力を借りずにJSONに変換

# はじめに
静的サイトでそこまでやるの？って思われるかもしれませんが、きっと使い道は無いわけではないはず。Jekyllで作っているサイトの為に投稿(posts)をJSONに変換したいのでやり方を調べました。（ソースはこちら"[JSONify your Jekyll site](http://jekyllsnippets.com/excluding-jsonify-your-site/)"）

# JSON作成用のJSONを作る
pluginでgeneraterやらconverterやらを使えばおそらく簡単に作れるとは思うのですが、今回はpluginを使わずに変換する方法です。Github Pagesでも使えるはず（？）です。まず流用元は以下のようなコードになっています。

```
---
layout: nil
---

[
{% for post in site.posts %}
    {
      "title"    : "{{ post.title }}",
      "url"     : "{{ post.url }}",
      "date"     : "{{ post.date | date: "%B %d, %Y" }}",
      "content"  : "{{ post.content | escape }}"
    } {% if forloop.last %}{% else %},{% endif %}
{% endfor %}
] 
```
これをそのまま使ってもエラーが出てしまいました（バージョンの違いのせい？）。それに加えて「content」までは必要なかったっていうのとどちらかというと「tags」情報がほしかったので以下に書き換え。

```
---
---

[{% for post in site.posts %}{
"title":"{{ post.title }}",
"url":"{{ post.url }}",
"date":"{{ post.date | date: "%B %d, %Y" }}",
"tags":[{% for tag in post.tags %}"{{ tag }}"{% if forloop.last %}{% else %},{% endif %}{% endfor %}]
}{% if forloop.last %}{% else %},{% endif %}{% endfor %}]
```

汚い！すごく汚いですね。けど、この文法にしないと出力されたJSONに無駄に改行とかがまぎれこんでしまうのでやむを得ず。。。（もっと綺麗に書ける方法を知っている方がいましたらご教示願いますm(__)m）
以下、_sites配下に出力されたJSONです。

```json
[{
"title":"たいとる",
"url":"path/to/post.html",
"date":"January 11, 2015",
"tags":["たぐ１","たぐ２"]
}]
```

このJSONを使って何かしらのスクリプトが書けそうです。
PDOのfetchModeを比較してみた

PDOはfetchModeを指定してデータを扱いやすい形に変換することができる。

fetchModeのデフォルトは```$PDO::FETCH_BOTH```に設定されている。
今回は下記5つについて表示させてみる。
1. FETCH_BOTH
2. FETCH_COLUMN
3. FETCH_CLASS
4. FETCH_INTO
5. FETCH_ASSOC

下記のようなデータをそれぞれのfetchModeでフェッチして表示させてみた。

```sql
nyc=# SELECT * FROM pdo_study;
 id |  name  
----+--------
  1 | りんご
  2 | みかん
(2 行)
```


```php
// $stmt->setFetchMode(PDO::FETCH_BOTH); 
// これがデフォルト
array(4) {
  ["id"]=>
  int(1)
  [0]=>
  int(1)
  ["name"]=>
  string(9) "りんご"
  [1]=>
  string(9) "りんご"
}
array(4) {
  ["id"]=>
  int(2)
  [0]=>
  int(2)
  ["name"]=>
  string(9) "みかん"
  [1]=>
  string(9) "みかん"
}
```

```php
// $stmt->setFetchMode(PDO::FETCH_COLUMN, 1);
// 第二引数はカラム番号
string(9) "りんご"
string(9) "みかん"
```

```php
// $stmt->setFetchMode(PDO::FETCH_CLASS, 'stdClass');
object(stdClass)#3 (2) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(9) "りんご"
}
object(stdClass)#5 (2) {
  ["id"]=>
  int(2)
  ["name"]=>
  string(9) "みかん"
}
```

```php
// $stmt->setFetchMode(PDO::FETCH_INTO, $obj);
// 今回は適当なTest Classを作成した
object(Test)#3 (1) {
  ["cols":protected]=>
  array(2) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(9) "りんご"
  }
}
object(Test)#3 (1) {
  ["cols":protected]=>
  array(2) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(9) "みかん"
  }
}
```

```php
// $stmt->setFetchMode(PDO::FETCH_ASSOC);
array(2) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(9) "りんご"
}
array(2) {
  ["id"]=>
  int(2)
  ["name"]=>
  string(9) "みかん"
}
```


デフォルト状態はなんとも使いづらい（なぜこれがデフォルト・・？）ので、いつもはPDO::FETCH_CLASSにして使っています。

参考：http://php.net/manual/ja/pdostatement.setfetchmode.php
[Rails] Custom Validator

If you want to make the custom validator in your model.

### Validate With
```rb
class MyValidator < ActiveModel::Validator
  def validate(record)
    unless record.name.starts_with? 'X'
      record.errors[:name] << 'Need a name starting with X please!'
    end
  end
end
 
class Person
  include ActiveModel::Validations
  validates_with MyValidator
end
```

If error occurred, the person.errors.message[:name] will have the error message.

### Validate Each

```rb
class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      record.errors[attribute] << (options[:message] || "is not an email")
    end
  end
end
 
class Person < ActiveRecord::Base
  validates :email, presence: true, email: true
end
```

For more information, see [rails guides](http://guides.rubyonrails.org/active_record_validations.html#custom-validators)
Vim操作の基本の「き」 −「実践Vim」まとめ(その０) -


〜「[実践Vim 思考のスピードで編集しよう！](http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Vim-%E6%80%9D%E8%80%83%E3%81%AE%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%81%A7%E7%B7%A8%E9%9B%86%E3%81%97%E3%82%88%E3%81%86-Drew-Neil/dp/4048916599)」を読んでVimの基本をまとめ中〜

## 0. Vimのやり方
普段コードを書く中では、同じ編集を繰り返すシーンが多い。この繰り返しの編集を、Vimでは効率的に実現してくれる。Vimの操作を身につけるためのファーストステップは「ドットの公式 Dot Formula」による繰り返し編集をマスターすること。

### 0-1. Vim以前の大前提
> DRY（Don't Repeat Yourself）

* Vimに限らず言わずもがな。

### 0-2. ドットの公式 Dot Formula（キー入力の理想型）
> カーソル移動用のキー入力が１つ、何かを実行するキー入力がもう一つ。何かをするにはこれが一番だ！

* 繰り返しの変更にはドットコマンド`.`を使用する
* 合計２つ（移動に１回＋テキスト変更に１回）のキー入力が理想系（移動と変更を含めて記憶したい場合はマクロ使う）

### 0-3. ドットコマンドとは？
> Vimのドキュメントではドットコマンドについてシンプルに「直前の変更を繰り返す」と書かれている。
（中略）最初に問うべきはこれだ。「変更ってなに？」

>[Vim documentation: repeat]
(http://vim-jp.org/vimdoc-ja/repeat.html)

* 変更とは？
  *  ノーマルモードでのテキストを変更するコマンド１つ分
  * 挿入モードに入ってからノーマルモードに戻るまでのテキスト変更


### 0-4. 余計な移動をなくす
ドットコマンドを効率的に使うために、移動用のキー入力を最小限に抑える。（理想は１回のキー入力で目的の箇所に移動する）着目すべきは下記の２点。

* ノーマルモードでの検索による移動

目的の編集箇所に移動するために`h`,`j`,`k`,`l`を連打するのはかっこわるい。下記の検索コマンドを利用して少ないキー入力で移動する。

| 検索コマンド | 内容 |次検索|前検索|最小キー入力数
|:-----------|:------------|:------------|:------------|:------:|
| `f`{検索文字}          | 一番近い{検索文字}まで移動（前方検索）          |`;`|`,`|2|
| `F`{検索文字}          | 一番近い{検索文字}まで移動（後方検索）          |`;`|`,`|2|
|`/`{検索文字列}`<CR>`|一番近い{検索文字列}まで移動（前方検索）|`n`|`N`|3|
|`?`{検索文字列}`<CR>`|一番近い{検索文字列}まで移動（後方検索）|`n`|`N`|3|
| `*`          | 現在のカーソル下の単語を検索          |`n`|`N`|1|



* 挿入モードへ入る方法

挿入モードに入るために、移動用のキーを押してから`i`または`a`を押すと、それだけで２回以上のキー入力になってしまう。Vimの複合コマンドを利用することで１回のキー入力でカーソルを移動させてかつ挿入モードに入ることができる。

> Vimの１キーコマンドには、２つ以上の他のコマンドを纏めたバージョンと考えられるものがたくさんある。以下の表に、例をいくつか掲載する。
>
| 複合コマンド | 同じことをする長いコマンド |内容（※引用外）|
|:-----------|:------------|:-----------------|
| `C`          | `c$`          |カーソルから末尾までを削除して挿入モードに入る |
| `s`          | `cl`          |カーソル下の文字を削除して挿入モードに入る | 
| `S`          | `^C`          |カーソル行を削除して挿入モードに入る |
| `I`          | `^i`          |カーソル行の先頭に移動して挿入モードに入る |
| `A`          | `$a`          |カーソル行の末尾に移動して挿入モードに入る |
| `o`          | `A<CR>`       |カーソル行を下に改行して挿入モードに入る |
| `O`          | `ko`          |カーソル行を上に改行して挿入モードに入る |

### 0-5. まとめ
まずはドットの公式を徹底する。移動に１回のキー入力、変更にはドットコマンドを使用！
Ruby on RailsからLambdaをキックしてOpsWorks管理のEC2を起動させる

![スクリーンショット 2015-01-11 17.14.15.png](https://qiita-image-store.s3.amazonaws.com/0/65478/978d22d4-7976-85cc-6464-3d43a06f51ff.png)

上記の図の通り、Railsの専用アプリケーションからlambdaをキックして、OpsWorksで管理されているEC2の管理メンテナンスを行うアプリを想定しています。

以下が、RailsからLambdaで作成した関数をキックするコードです。jsonで引数となるinstance_idを生成して、invoke_asyncメソッドで、Lambdaの関数を実行します。

```ruby:RailsのController
# coding: utf-8

class ItemsController < ApplicationController
  def index
  	Aws.config[:region] = "us-east-1"
    lambda = Aws::Lambda::Client.new;
    if params[:instance_status_toggle]
      param = { instance_id: "<インスタンスID>"}.to_json # lambdaに渡す引数をjsonで生成
      resp = lambda.invoke_async(function_name: "start-incetance", invoke_args: param) # lambdaのstart-incetance関数を実行
    end
  end
 
end
```

以下がLambdaからOpsWorksで管理されたEC2インスタンスを起動させるためのファンクションです。

```js:Lambdaのstart-incetanceファンクション
const ACCESS_KEY = '<ACCESS_KEY>';
const SECRET_KEY = '<SECRET_KEY>';

var AWS = require('aws-sdk');
AWS.config.update({accessKeyId: ACCESS_KEY, secretAccessKey: SECRET_KEY});

exports.handler = function(event, context) {
    var opsworks = new AWS.OpsWorks();
     opsworks.describeInstances( {InstanceIds : [event.instance_id]},function(err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            if ( data.Instances[0].Status == 'stopped' ) {
                opsworks.startInstance({InstanceId : event.instance_id}, function(err, data) {
                    if (err) {
                        console.log(err, err.stack);
                    } else {
                        context.done(null, 'Update Online Success');
                    }
                });
            } else if ( data.Instances[0].Status == 'online' ) {
                context.done(null, 'Now Online');
            } else {
                context.done(null, 'Other Status');
            }
        }
    });
};
```
こういった形で、必要な機能をLambdaをAPIの形式でまとめておくと様々な言語やインターフェイスを変えて活用することが出来そうです。
Docker のソースの構成についてのメモ


Go 言語が読めるようになってきたので、早速 Docker のソース（[docker/docker](https://github.com/docker/docker)）を読んで行こうかなと。上モノでピンと来ていないところを確認しつつ、早めにカーネルの方で対応する機能のコードを、あわせて読みたい。

そこで、まずはトップディレクトリを、とりあえず分類してみる。

分類はザッと見で以下のよう。間違いがあるかも知れないので、読みながら追っかけ修正する。

今日（Jan 11 2015）時点で、バージョンは 1.4.1。

# クライアントサイドのコード

Docker クライアントのコマンドと、ライブラリ。

* api/ クライアント側の Web API（client）
* runconfig/ `run`サブコマンドの設定かな？ コンテナや、コンテナを管理するホストの情報を保持する構造のようだ
* opts/ 各種サブコマンドのオプションを validate したりする
* nat/ NAT 構成指示の文字列を操作する（これは engine かな？）

# Docker Engine 本体のコード

Docker 1.0 以降では、Docker 本体に「Docker Engine」の名前がつけられている。「Docker」ブランドのコアとしての「Docker Engine」ということなんだろうな。 ∥ [いまさら聞けないDocker入門（2）：ついに1.0がリリース！ Dockerのインストールと主なコマンドの使い方 (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1406/10/news031.html)

hack/make/cross を見ると分かるように、現状でサーバになれるのは「linux/amd64」のみである。

* engine/ Docker のコアだと言う。ストレージ・エンジンとは関係が無さそう。
	* main.mainDaemon() から engine.New() している
	* サーバの機能そのもののように見える。`builtins.Register(eng)` や `registry.NewService(daemonCfg.InsecureRegistries).Install(eng)` などをしている。気になる
* builder/ Dockerfile のパーサ。実行もか？
* daemon/ イメージ操作とコンテナ管理
* builtins/ ？（たぶん engine）
* events/ engine 内で用いられる `Event` 型のようだ
* graph/ versioned な差分ファイルシステムのグラフ構造を保持する
* image/ graph を操作するコードに見える。なぜ `graph` と別になっている？
* volumes/ コンテナに bind 等される「volume」のことだろう
* links/ 多分、`--link` のコンテナ間リンク機能
* registry/ イメージのレジストリに関するコード

# クライアント, Engine 共通のコード

* dockerversion/ バージョン情報。docker/ に入れたいが、dockerinit/ が要するのでこの階層に置くとある
* docker/ バイナリのフロント。Docker は、cli クライアントとデーモンとがワンバイナリである
* vendor/ たとえば github.com/docker/libtrust であれば vendor/src/github.com/docker/libtrust/ に入る
* trust/ これ（[docker/libtrust](https://github.com/docker/libtrust)）のフロントかな？ 証明書や署名の validattion 等を扱う模様
* utils/ いろいろ
* pkg/ 汎用の（Docker に依存しない）ライブラリ

# その他

それ以外はボチボチ見る。

* ビルド関連
	* hack/ もしくは project/ ビルドと配布に関するリソース
	* bundles/ バイナリの出力先
* dockerinit/ pkg/reexec/ を使っている。コンテナ用の init(8) か？ 後で見る
* integration-cli/ 統合テストか？
* docs/ 文書。最新版の出力は [Docker Documentation](https://docs.docker.com/) にある
	* sources/ 文書本体
* contrib/ もろもろ。あまりメンテされていないかも知れない？
* integration/ 旧統合テスト。deprecated 予定
[自分の]Atom Package List 

# [自分の]Atom Package List (2015/01/11)
  
  
## テーマ
* seti-ui
* file-icons
* monokai
　　
  
## 共通
* docblockr
* japanese-wrap
* atom-beautify
* project-manager
* emmet
* autocomplete-plus
  
  
* color-picker
* web-view

## rails
* atom-rails
* rails-snippets
* rails-partials
  
  
## haml
* language-haml
* html2haml
  
  
## Sass
* Atom-Syntax-highlighting-for-Sass
* sassbeautify
  
  
## git
* git-plus
* merge-conflicts
  
  
## その他
* vim-mode
* term2
enthumble キーカスタマイズ【応用編】

# <i class="fa fa-check-circle-o"></i> はじめに
## <i class="fa fa-check-square-o"></i> キーボード快適化ソフト | enthumble
[https://jp.enthumble.com/](http://jp.enthumble.com/  "enthumble")
使用頻度の高いキー操作を手もとで行えるようにする、簡単設定のカスタマイズソフト
Windows用フリーソフト | インストール不要 | 商用利用可 | 有料版はキーカスタマイズ可能

# <i class="fa fa-check-circle-o"></i> キーカスタマイズの解説
<b>有料版のみ、キーカスタマイズが可能です</b>。有料版は、Keylist内の設定ファイル変更により、オリジナルのキーカスタマイズが可能です。

[キーカスタマイズ【基本編】](https://qiita.com/enthumble/items/44064da2d77ddbd258b7  "キーカスタマイズ【基本編】")に引き続き、応用編をお送りします。

## <i class="fa fa-check-square-o"></i> 絶対半角入力
```ini
Q={vkF2sc070B}{vkF3sc029}{1}
```
無変換+qキーで、数字の1を<b>必ず半角数字</b>入力。IMEの状態によらず、常に半角で入力したいときに有効でう。WindowsにはIME OFFキーがないため、2つのアクションで実現しています。

MS-IMEでは、{vkF2sc070B}はひらがな/カタカナキー、つまりIME ONのアクションです。{vkF3sc029}は、半角/全角キー、つまりIMEの反転切り替えのアクションです。つまり、IMEの状態によらずにIME OFFキーの動作を実現するために、IME ON → 反転 → IME OFFとしています。上記設定は、IME Offの状態で数字を入力しています。

*ATOKなどのIMEをお使いの方は、そのソフトウェア上でのIME ONキーや反転キーを設定してください。

## <i class="fa fa-check-square-o"></i> 括弧入力後、内部へカーソル移動
```ini
8={vkF2sc070B}{vkF3sc029}(){left}
```
無変換+8キーで、括弧記号を入力し、キーカーソルを括弧の内側に移動。大括弧や中括弧等へも応用可能。プログラミングにもビジネス文章作成にも便利です。

絶対半角状態で括弧記号を入力し、キーカーソルを左に動かしています。

## <i class="fa fa-check-square-o"></i> 音量調整
```ini
F10={Volume_Mute}
F11={Volume_Down}{Volume_Down}
F12={Volume_Up}{Volume_Up}
```
音量の増減、ミュートの設定です。Mac OSを真似た配置にしてみました。

## <i class="fa fa-check-square-o"></i> Altメニューの自動入力(色をRGB指定した例)
```ini
F5={vkF2sc070B}{vkF3sc029}!{j}{t}{h}{m}{right}{tab}{tab}{tab}{tab}255{tab}150{tab}150{tab}70{enter}
F6={vkF2sc070B}{vkF3sc029}!{j}{t}{h}{n}
```
無変換+F5キー: PowerPoint上のテーブル(セル)を薄ピンク色に塗りつぶし
無変換+F6キー: 塗りつぶしなし

・絶対半角入力
・{!}でリボンメニューにフォーカス遷移
・表ツール > 塗りつぶし > その他の色 > ユーザー設定
・RGB、透過性を入力(下図参照)

![image](https://qiita-image-store.s3.amazonaws.com/0/1582/fd075f93-bb85-505d-0231-4f7ea28b2495.png)

セルを強調したいときや、自社や客先のテーマカラー(コーポレートカラー)の設定に使っています。標準機能であるAltメニューを入力しているだけですので、フォントや罫線設定などにも応用できます。


## <i class="fa fa-check-square-o"></i> 漢字入力(文字コード指定)
```ini
Home={ASC 36560}{ASC 35407}{ASC 38121} 
Home={ASC 31038}{ASC 22806}{ASC 31192} ;word, powrpointのみ
```
無変換+Homeキー: 社外秘 と漢字で入力

キーボード操作のみでは、変換操作を伴う漢字の自動入力は難しいです。そこで、文字を<b>コード指定入力</b>する方法を紹介します。文字コードを調べるのが手間ですが、漢字も一発で入力できます。

例えば、'社外秘'という文字を入力したい場合。まず、こちらの表をチェックします。
・[enthumble 文字コード変換表](https://docs.google.com/spreadsheets/d/1W93nVIYwRSDwHQXUTZYnSljhV-AO-uBpzEK0K_VOaDE/edit?usp=sharing) 
>社	36560	31038

"社"の漢字の文字コードは36560(2列目の数字)なので、{ASC 36560}を指定すると'社'を入力します。応用すれば、会社名・名前なども一発で入力できます。

Wordなど一部のソフトウェアでは上記指定方法では文字化けします。この場合は3列目の数字、31038を指定してください。


# <i class="fa fa-check-circle-o"></i> リンク
こちらもご参照ください。

・[Readme 【説明書】](http://qiita.com/mhara/items/d2d072592a4db9243c99  "Readme 【説明書】") 
・[キーカスタマイズ【基本編】](http://qiita.com/enthumble/items/44064da2d77ddbd258b7  "キーカスタマイズ【基本編】")
・[キーカスタマイズ【応用編】](http://qiita.com/mhara/items/5ea8de992e8f99fce829  "キーカスタマイズ【応用編】")★現在のページ
・[キーカスタマイズ例 【開発者本人】](http://qiita.com/mhara/items/c666b487fbd06805527b  "キーカスタマイズ例 【開発者本人】")
・[キーカスタマイズ例 【ユーザー投稿】](http://qiita.com/tags/enthumble  "キーカスタマイズ例 【ユーザー投稿】")

以上
よく使うJenkinsのPlugin



名前 | 概要 | 使い方 | 備考
---|---|---|---
Jenkins GIT Plugin | その名のとおり、Gitのプラグイン | Jenkinsの管理=>システムの設定=>Git plugin=>nameとemailを設定 | Gitのプラグインは色々あるけど、紹介されたのは「Git Plugin」という名前のやつ
Checkstyle Plugin | その名のとおり、静的コード解析Checkstyleのプラグイン | ビルド設定=>Checkstyle警告の集計 | 
Cobertura Plugin | その名のとおり、カバレッジ集計Coberturaのプラグイン | ビルド後の処理の追加=>Coberturaカバレッジ・レポートの集計=>Cobertura XMLレポートパターン：**/target/site/covertura/coverage.xml | 設定値は例。Mavenの設定は別途必要で、設定値はMavenの設定に基づく。
Copy Artifact Plugin | 別プロジェクトの成果物をコピーするプラグイン | Fingerprint files=>記録するファイル:**/foo.war | 記録するファイルは例。"**"は間にフォルダがあってもいいという意味。
Fingerprint Plugin | ビルドで生成した成果物にハッシュ値をつけて、ジョブ間で受け渡す成果物を追跡できるようにする | ビルド後の処理の追加=>成果物を保存=>保存するファイル:**/foo.war | 保存するファイルは例。"**"は間にフォルダがあってもいいという意味。
Xvfb Plugin | X11を立ち上げるプラグイン。GUIテストなどのときに便利。 | 1. Jenkinsの管理=>システムの設定=>Xvfb installation=> Name:Xvm, Directory in which to find Xvm executable:/usr/bin <br> 2. ビルド環境=>Start Xvfb before the build, and shut it down after. | 設定値は例。
Promoted Builds Plugin | ジョブの依存関係を定義するプラグイン | Promote builds when…=>Promotion process=> <br> Name:IntegrationTestSuccess, <br> Icon:Gold star, <br> Criteria=>When the following downstream projects build successfully=>Job names:テストのジョブなど, <br> Action=>他のプロジェクトのビルド=>ビルドするプロジェクト=>ビルドのジョブなど | 
Build Pipeline Plugin | ビルドパイプラインを可視化するプラグイン | ジョブの一覧で[+]ボタンを押す | 
Backup Plugin| Jenkins自体をバックアップ・リストアするプラグイン | Jenkinsの管理=> Backup manager=>Setup |
Markdown簡易チートシート（テキスト版）

```

Markdown簡易チートシート

リンク
[リンクテキスト](URL) 
[リンクテキスト](URL "タイトル") 

画像埋め込み	
![代替テキスト](画像のURL) 
![代替テキスト](画像のURL "画像タイトル") 


コードの複数行表示
qiita.rb								```lang:filename
puts 'code with syntax'				code
									```

(空行)
	```ruby:qiita.rb
puts 'The best way to log and share programmers knowledge.'
	```
(空行)


コード
コードのインライン表示				`code`

見出し (h1~h6)						#
									##
									###
									####
									#####
									######

強調表示（イタリック体）			*text*
太字								**text**
水平線
* * *
***
*****
- - -
---------------------------------------

Markdownのエスケープ			\

引用								> text
文頭に>を置く、複数行は改行のたびに>が必要
上下に空行が必要
引用の中に別のMarkdownが利用可能

打ち消し線							 ~~打ち消し線~~ 
前後に 半角スペース か 改行文字 が必要

リスト
Disc型（行頭が●）
文頭にいずれかを入れる
* 文章
+ 文章
- 文章
リストの上下に空行が必要
「*」「+」「-」の後にはスペースが必要

Decimal型（行頭が数字）
文頭に「数字.」を入れるとDecimal型リストになります
1. 文章
1. 文章
1. 文章
リストの上下に空行が必要
「数字.」の後にはスペースが必要

※テクニック
1. 2. 3. と順番にするのではなく、
後からの挿入/移動を考慮して1. 1. 1. という風に同じ数字にしておく。

Definition型
HTMLの<dl>タグをそのまま使うことで実現できます。
<dl>
  <dt>リンゴ</dt>
  <dd>赤いフルーツ</dd>
  <dt>オレンジ</dt>
  <dd>橙色のフルーツ</dd>
</dl>

テーブル記法

| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| This       |        This |     This     |
| column     |      column |    column    |
| will       |        will |     will     |
| be         |          be |      be      |
| left       |       right |    center    |
| aligned    |     aligned |   aligned    |

| Left align | Right align | Center align |
|:---------|---------:|:-----------:|
| This        |         This |      This      |
| column    |      column |    column    |
| will         |            will |       will      |
| be          |             be |      be        |
| left         |          right |     center   |
| aligned    |       aligned |    aligned    |


```
Padrinoで環境毎にコンテキストパスを切り替える方法

# 目的
Padrinoでアプリを作成する場合に、 development環境では「localhost/」で動かしたいけど、production環境では「mydomain.com/projectname/」で動かしたい場合の対応方法

# app.rbを修正
app/app.rbに以下を追加します。

```lang:app.rb
    // production環境ではコンテキストパスを「projectname」にする
    configure :production do
        ENV['RACK_BASE_URI'] = '/projectname'
    end
```

この記述をしておくと、 `bundle exec padrino s -e production` した場合に
`url_for`等を使用した場合に、pathの先頭に「/projectname」を付与してくれます。

# jsで使用する場合
APIをjsから使用している場合はHTMLに以下みたいなのを埋め込んでおいて、jsでURLを組み立てる際に使用すればいいと思います。

```lang:html
<input type="hidden" id="contextpath" value="<%= ENV['RACK_BASE_URI']  %>" />
```
【Swift】オートレイアウトの出し方がObjective-Cと違うとは！？やり方

Objective-Cでデビューソフトを書いた私は現在Swiftの練習中なのだが
前作は医療用語入力支援ツールなので、ボタンやピッカーの配置をデバイスによってかなり工夫した。
それ故Update版ではデバイスの種類や向きによってボタンの配置を全て事細かに指定している。
iOS　→　http://bit.ly/ICFinputteriOS
（iOS無償版　→　http://bit.ly/iOSICFfree も後日対応予定）

しかし今回作ろうとしているものは、特にレイアウトにこだわる必要のないソフト。
なるべく楽に済ませたいんだが
Swiftでプロジェクトを立ち上げたところ
![Main_storyboard_—_Edited.jpg](https://qiita-image-store.s3.amazonaws.com/0/58253/b8e10ae9-12f1-4932-afd0-7885f1f8a797.jpeg)

おなじみのこの画面が出ないのだ！！
定規を押してもダメ…
ちなみに、同じXcode6.1.1を使っているのにこのような現象が起こる。

途方に暮れていたところ、<a href="http://utage.headwaters.co.jp/blog/?p=3649" target="_blank">荒井雄治朗さんの記事</a>が目に入った。
これで多分大丈夫だろう。荒井さんに大感謝！ありがとうございます！！

というか、手許のこの参考書にも書いてあったのに、すっかり忘れていた…。
<a href="http://www.amazon.co.jp/gp/product/4839953538/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4839953538&linkCode=as2&tag=ssg0c-22">Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=ssg0c-22&l=as2&o=9&a=4839953538" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


私はもちろん、ドラクエを買ってきたらいきなりファミコンに挿して始めるタイプである。
説明書？読まないな…。

…これからはちゃんと読むようにしようっと。