OmniAICreator/Qiita-1.07M huggingface dataset:
Fabric で fabric.api.abort に unicode が渡せない問題に対応する

Fabric 便利ですよね。
便利すぎて大抵のことは Fabric で済ませることができます。

ただ Fabric は Python 製なので、 unicode の扱いでたまに困ることがあります。
具体的には fabric.api.abort や fabric.api.puts に unicode が渡せないこと。
abort は sys.stderr に、 puts は sys.stdout に str を書き込んでしまうため、
unicode を渡すと UnicodeEncodeError が発生します。

これを避けるためには、あらかじめ unicode ではなく str に変換しておく必要があります。

```py
from fabric.api import abort, task

@task
def abort_test():
    abort(u"日本語のエラーメッセージ".encode('CP932'))
```

これでも大丈夫ですが、すべての使用箇所でエンコードするのはダサいです。

abort に渡される引数が unicode だったら、出力先のエンコードに応じて変換するようにしてみましょう。

```py:fabric_patch.py
# -*- encoding: utf-8 -*-
import sys
import fabric
from fabric.api import abort, puts


encodings = {
    abort: sys.stderr.encoding,
    puts: sys.stdout.encoding,
}


def safe_msg(original):
    u"""
    fabric.api.abort/puts に unicode を渡すと出力時に UnicodeEncodeError が発生するので、
    それを回避するためのデコレータ
    """
    def revised(msg, *args, **kwargs):
        if isinstance(msg, unicode):
            encoding = encodings.get(original, None)
            if encoding:
                msg = msg.encode(encoding)
        return original(msg, *args, **kwargs)
    return revised


setattr(fabric.api, "abort", safe_msg(abort))
setattr(fabric.api, "puts", safe_msg(puts))
```

fabfile.py と同じディレクトリに fabric_patch.py を配置して、 abort の前にインポートしましょう。
これで unicode を変換しなくても、何の問題もなく日本語のエラーメッセージが出力できるようになります。

```py:fabfile.py
# -*- encoding: utf-8 -*-
from __future__ import absolute_import
from . import fabric_patch
from fabric.api import abort, task

@task
def abort_test():
    abort(u"日本語のエラーメッセージ")
```
2014/02/28 #ssmjp でデモした内容まとめ、その１

Pingを1回、Echo Request1つ、Echo Reply1つのpcapファイルを用意して、こんなコトができます、というのを紹介しました。

#ssmjp での発表についてはBlogに書きました

http://th0x0472.at.webry.info/201403/article_1.html

まず何はともあれライブラリ読み込み。

```py
import dpkt
```

pcapファイルを開きます。

```py
>>> p=dpkt.pcap.Reader(open("demo.pcap","r"))
>>> p
<dpkt.pcap.Reader object at 0xfc1f10>
```

readpkts()でタイムスタンプとパケットデータのタプルのリストを得られます。

```py
>>> len(p.readpkts())
2
>>> p.readpkts()
[(1393533576.809375, '\x00:\x9d\xbd5\xcc\x08\x00\'\xca\xd8\xe2\x08\x00E\x00\x00T\x17\xcd@\x00@\x01*\xef\xc0\xa8\x01\x10J}\xeb\xb7\x08\x00\xfc\xa1\x1a;\x00\x01\x88\xa2\x0fS\x00\x00\x00\x00~Y\x0c\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567'), (1393533577.117797, '\x08\x00\'\xca\xd8\xe2\x00:\x9d\xbd5\xcc\x08\x00E\x00\x00T\x9c\xfe\x00\x008\x01\xed\xbdJ}\xeb\xb7\xc0\xa8\x01\x10\x00\x00\x04\xa2\x1a;\x00\x01\x88\xa2\x0fS\x00\x00\x00\x00~Y\x0c\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567')]
```

こんな風に任意のパケットデータにアクセスできます。

```py
>>> p.readpkts()[0][1]
'\x00:\x9d\xbd5\xcc\x08\x00\'\xca\xd8\xe2\x08\x00E\x00\x00T\x17\xcd@\x00@\x01*\xef\xc0\xa8\x01\x10J}\xeb\xb7\x08\x00\xfc\xa1\x1a;\x00\x01\x88\xa2\x0fS\x00\x00\x00\x00~Y\x0c\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567'
```

パケットデータをEthernetクラスのオブジェクトにします。

```py
>>> dpkt.ethernet.Ethernet((p.readpkts()[0][1]))
Ethernet(src="\x08\x00'\xca\xd8\xe2", dst='\x00:\x9d\xbd5\xcc', data=IP(src='\xc0\xa8\x01\x10', off=16384, dst='J}\xeb\xb7', sum=10991, len=84, p=1, id=6093, data=ICMP(sum=64673, data=Echo(id=6715, seq=1, data='\x88\xa2\x0fS\x00\x00\x00\x00~Y\x0c\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567'))))
>>> dpkt.ethernet.Ethernet((p.readpkts()[0][1])).data
IP(src='\xc0\xa8\x01\x10', off=16384, dst='J}\xeb\xb7', sum=10991, len=84, p=1, id=6093, data=ICMP(sum=64673, data=Echo(id=6715, seq=1, data='\x88\xa2\x0fS\x00\x00\x00\x00~Y\x0c\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567')))
```

IPパケットを取り出して、ソースIPアドレスを見てみます。

```py
>>> req=dpkt.ethernet.Ethernet((p.readpkts()[0][1])).data
>>> req.src
'\xc0\xa8\x01\x10'
```

このままだと見難いですが、socketライブラリを使うと見やすくなります。

```py
>>> import socket
>>> socket.inet_ntoa(req.src)
'192.168.1.16'
```
Debianでbondingの設定を行う


DebianでLACP(IEEE802.3ad)を使ってbondingの設定をしたときのメモ

# 環境
OSはDebian 7.4(wheezy)また、LACPを使用するので対応したスイッチが必要。
また、bondingを行うので2つ以上のネットワークインタフェースが必要。

# セットアップ

まず、インタフェースの設定変更を行うためのコマンドをインストールする。

```sh:コマンドのインストール
$ aptitude install ifenslave-2.6
```

次にネットワークインタフェースを停止させる。

```sh:ネットワークの停止
$ /etc/init.d/networking stop
```

次にbondingモジュールの設定を行う。

```sh:bondingモジュールの設定
$ vi /etc/modprobe.d/bonding.conf
alias bond0 bonding
        options bonding mode=4 miimon=100 lacp_rate=1
```

次にbondingインタフェースの設定を行う。

```sh:ボンディングインタフェースの設定(例)
$ vi /etc/network/interfaces
auto eth0
   iface eth0 inet manual
   bond-master bond0

auto eth1
    iface eth1 inet manual
    bond-master bond0

auto bond0
iface bond0 inet static
    address 192.168.1.1
    netmask 255.255.255.0
    gateway 192.168.1.254
    slaves eth0 eth1
    bond_mode 802.3ad
    bond_miimon 100
    bond_downdelay 200
    bond_updelay 200
    bond-lacp-rate 4
    bond-slaves none
    dns-nameservers 192.168.1.254
    dns-search example.jp
```

上記の設定が終わったら下記のコマンドでネットワークインタフェースを開始する。

```sh:ネットワークの開始
$ /etc/init.d/networking start
```


# 動作状態のチェック

下記のコマンドを実行して、インタフェースが作成されているかと、正しくIPアドレスは振られているか
またbondingがLCAPで動いているか調べる。

```sh:チェック用
$ ifconfig
$ cat /sys/class/net/bond0/bonding/mode
```

# 参考
https://wiki.debian.org/Bonding
http://crashmag.net/how-to-configure-network-bonding-lacp-on-debian-wheezy
http://www.cyberciti.biz/tips/debian-ubuntu-teaming-aggregating-multiple-network-connections.html
http://www.tokiwinter.com/configuring-interface-bonding-on-debian-wheezy/
Cocos2d-xをEclipseを使わずにビルド＆実行する

Cocos2d-xのプロジェクトをEclipseを使わずにビルドしたい場合の手順をまとめました。

* これはEclipseを始めから一切使わない方法ではありません
* 使用するcocos2d-xのプロジェクトは既にEclipseでビルド、実行まで動作する状態の物が用意されている事が前提です
* 以降もプロジェクトのビルドがEclipse上、コマンドプロンプト上のどちらからも自由に行える環境を目指します
* **ant** と **adb** のセットアップが必要になります
* インストールするファイルや展開先は具体性の為に一例を書いています

# antのセットアップ

antをダウンロードします

* http://ant.apache.org/bindownload.cgi
* apache-ant-1.9.3-bin.zip をダウンロード
* C:\project\library\apache-ant-1.9.3 に展開

もしJavaをインストールしていない場合はこちらもダウンロードします（恐らくしていると思います）

* http://www.oracle.com/technetwork/java/javase/downloads/index.html
* jdk-7u51-windows-x64.exe をダウンロード
* インストーラーの指定通りの場所 C:\Program Files\Java\jdk1.7.0_51 に展開

# 環境変数の追加

Windowsの環境変数に以下の項目を追加します
※値は一例です

|変数|値|
|:-----|:------|
|JAVA_HOME|C:\Program Files\Java\jdk1.7.0_51|
|ANDROID_SDK|C:\project\cocos2d-x\adt-bundle-windows-x86_64-20131030\sdk|

合わせて環境変数のPATHに以下を追加し、adbやantが呼び出せるようにします

```
%ANDROID_SDK%\platform-tools;
%ANDROID_SDK%\tools;
C:\project\library\apache-ant-1.9.3\bin;
```

# build_native.shの編集

build_native.sh を開き、Eclipse以外からでも実行ができるように #pathsの下にNDK_ROOTを追加指定します

```
# paths
NDK_ROOT="/cygdrive/c/project/library/android-ndk-r9c"
```

#batファイルの作成
proj.android のフォルダに以下のbatファイルを用意します

## build.bat
プロジェクトのビルドを行うbatファイルです

```
bash -e build_native.sh
ant debug -Dsdk.dir=%ANDROID_SDK%
```
* ant debugの代わりに ant releaseとすればReleaseビルドも作成できます

## clean.bat
クリーンビルド用batも作ります
上手くBuildが通らない時は一度clean.batを呼び出すと解決する事があります

```
ant clean -Dsdk.dir=%ANDROID_SDK%
```

## debug.bat
パッケージのインストールと起動までを行うbatです
このファイルには簡単の為にパッケージ名やアクティビティ名を直接記述しています

```
adb install -r bin/TestProject-debug.apk
adb shell am start -n com.test.testproject/.TestProject
```

* apk パッケージ名は proj.android/bin ディレクトリの下に **[プロジェクト名]-debug.apk** のファイル名で作成されています(debugビルドの場合)
* プロジェクト名は proj.android/build_native.sh の一番上にも書かれています

* 2行目の書式は ```adb shell am start -n [パッケージ名]/[アクティビティ]``` となっています。
* アクティビティ名は proj.android/AndroidManifest.xml の activity の項目から確認する事ができます
* パッケージ名も proj.android/AndroidManifest.xml の packageから確認できます

# 実行

上記batファイルを呼び出す事で直接プロジェクトのビルド、インストール、起動が可能になります
また、変わらず同じプロジェクトをEclipse上でビルドする事もできます
数値積分を実行する

数値積分を実行する。

被積分関数までは解析的に書けているけれど、
積分が解析的に実行できず、さらにその値が他の計算に必要な場合。
しかも高精度に。

参考：[ニュートン・コーツの公式(Wikipedia)](http://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E3%83%BB%E3%82%B3%E3%83%BC%E3%83%84%E3%81%AE%E5%85%AC%E5%BC%8F)

```cpp
#include <functional>
#include <iostream>
#include <cmath>

enum IntegralMethod{
    Trapezoidal = 0,
    Simpson = 1,
    Boole = 2,
};

template<IntegralMethod>
class Integrater{
public:
    /** 一次元定積分 @f$ \int_a^b f(x) dx @f$ を積分する */
    static double calc(int N /** 空間刻み */,
                       double a /** 下限 */, double b /** 上限 */,
                       std::function<double(double)> f /** 積分する関数 */);
    /** 一次元定積分 @f$ \int_a^b f(x) dx @f$ を積分する(精度保証付き)。
     *  ただし打ち消して0になる場合は使えない。 */
    static double accurate(double a /** 下限 */, double b /** 上限 */,
                           std::function<double(double)> f /** integrand */,
                           double threshold=1e-9 /** 収束の閾値 */,
                           std::ostream* report = nullptr /** 収束の過程を表示 */)
    {
        int N = 128;
        double result_p = calc(N, a, b, f);
        double result_n;
        while(true){
            N *= 2;
            result_n = calc(N, a, b, f);
            if(report){
                *report << N << " " << result_n << std::endl;
            }
            if(std::abs(result_n - result_p) / std::abs(result_n) < threshold){
                break;
            }
            result_p = result_n;
        }
        return result_n;
    }
};

template<>
double Integrater<Trapezoidal>::calc(int N, double a, double b, std::function<double(double)> f) {
    long double sum = 0.0;
    double dx = (b - a) / N;
    for(int i=0;i<N;++i){
        double x_l = a + dx*i;
        double x_r = a + dx*(i+1);
        sum += f(x_l) + f(x_r);
    }
    return sum * dx / 2;
}

template<>
double Integrater<Simpson>::calc(int N, double a, double b, std::function<double(double)> f) {
    long double sum = 0.0;
    double dx = (b - a) / N;
    for(int i=0;i<N;++i){
        double x_l = a + dx*i;
        double x_r = a + dx*(i+1);
        double x_m = (x_l + x_r) / 2;
        sum += f(x_l) + 4*f(x_m) + f(x_r);
    }
    return sum * dx / 6;
}

template<>
double Integrater<Boole>::calc(int N, double a, double b, std::function<double(double)> f) {
    long double sum = 0.0;
    double dx = (b - a) / N;
    for(int i=0;i<N;++i){
        double x_l = a + dx*i;
        double x_r = a + dx*(i+1);
        double x_m = (x_l + x_r) / 2;
        double x_lm = (x_l + x_m) / 2;
        double x_rm = (x_r + x_m) / 2;
        sum += 7*f(x_l) + 32*f(x_lm) + 12*f(x_m) + 32*f(x_rm) + 7*f(x_r);
    }
    return sum * dx / (7+32+12+32+7);
}
```
台形公式(Trapezoidal)で行くつもりだったけど、
高精度を出そうとすると、台形公式は非常に効率がわるい。
そこで高次のアルゴリズムとしてSimpson, Booleを実装した。

最初は`accurate`の引数に`std::function`で計算手法(Trapezoidal,...)を貰おうかと思ったけど、
この方がすっきりする。`calc`を`virtual`にして継承するよりは、こちらの方が好み。

地味なこだわりは

```cpp
std::ostream* report = nullptr
```

でstreamをもらう事。これなら必ずしも出力する必要がない。

```cpp
if(report){
...
}
```

の評価は通常非常に軽いはず。

もっといい実装キボンヌ
[PureData]Pdのパッチカラースキームを変更する

Pd の小ネタで、パッチのカラースキームを変更する方法。

Pd-Extended の以下のソースファイルに、GUI部品の描画色を変数で持っているので、
これらの値を上書きすればOK.

```tcl:Pd-extended.app/Contents/Resources/tcl/pd-gui.tcl
# color scheme
set ::canvas_fill "white"
set ::text_color "#000"
set ::select_color "#00f"
set ::dash_outline "#f00"
set ::dash_fill "#fff"
set ::box_outline "#ccc"
set ::graph_outline "#777"
set ::atom_box_fill "#eee"
set ::msg_box_fill "#f8f8f6"
set ::obj_box_fill "#f6f8f8"
set ::signal_cord_highlight "#58a"
set ::signal_cord "#558"
set ::signal_nlet $signal_cord
set ::msg_cord_highlight "#474"
set ::msg_cord "#121"
set ::msg_nlet "#fff"
set :mixed_nlet "#88aaff"
```

少々乱暴ですが、上記パスのソースを管理者権限で書き換えて、
Pd-Extended を再起動すれば変更が適用されます。

![Pd-ExtendedColorScheme.png](https://qiita-image-store.s3.amazonaws.com/0/8510/972b5908-65f6-5b63-498e-efb9dbdaab7b.png)

アプリケーションの設定であるため、パッチ毎にスキームを持つことができない、
というのは Max との大きな違いどころ。

#### 参考
GUI default colors in pd-gui.tcl
http://puredata.hurleur.com/sujet-8020-gui-default-colors-gui-tcl

上記フォーラムの記事での推奨は、ソース直編集ではなく「GuiPluginを各自で作りなさい」とのこと。
[解決済み] Markdown で ~~strike~~ とやると取り消し線にできるようになってほしい

# 追記
http://qiita.com/Qiita/items/c686397e4a0f4f11683d#strikethrough---打ち消し線
できるようになってた！！

# ~~strike~~

* Strikethrough with GitHub Markdown - Web Applications Stack Exchange
http://webapps.stackexchange.com/questions/14986/strikethrough-with-github-markdown

* markdown - Is it possible to use strikethrough in Trello? - Web Applications Stack Exchange
http://webapps.stackexchange.com/a/56851

`~~strike~~` とやると <del>strike</del> にできるらしいです。
とりあえず、 GitHub と Trello はできるっぽいので、できるようになるとうれしいです。
~~Qiita では取り消し線にならないようなので。~~
cocos2d-xのプロジェクトを自由な位置に移動させる

Cocos2d-xのプロジェクトをcreate_project.pyで作成した場合、プロジェクトは自動でcocos2d-xのprojects下に展開されます。それを後から好きな位置に移動させる際の変更手順です。
以降は便宜上cocos2d-xを **cocos2d-x-2.2.2** というフォルダに展開しているものとして説明します

# create_project.pyでプロジェクトを作る
cocos2d-x-2.2.2\tools\project-creator に移動し、create_project.py を使ってプロジェクトを作成します

```
例）
create_project.py -project TestProject -package com.test.testproject -language cpp
```

実行後 cocos2d-x-2.2.2\projects\ 直下に該当プロジェクトが作成されているので、これを任意のフォルダに丸ごと移動させます（例えばローカルのgitのリポジトリ下とか）

# EclipseのWorkSpaceにプロジェクトを追加
Eclipseを起動し、移動させたプロジェクトを追加します

* メニューから「File→New→Project…」を開く
* 「Android->Android Project from Existion Code」を選んで「Next」
* RootDirectoryにプロジェクトのパスを追加→「Refresh」
* 「Finish」ボタンを押して追加

※この時点ではBuildは失敗します

## build_native.shの編集
プロジェクトフォルダの下の proj.android\build_native.sh を開く
COCOS2DX_ROOT の位置を修正し、正しく cocos2d-x-2.2.2 の位置を示せるようにします
↓

```
例）
COCOS2DX_ROOT="$DIR/../../cocos2d-x-2.2.2"
```

## プロジェクトの編集
* Eclipseでプロジェクトを選択し、「Project→Properties」を開く
* 「Android」の項目を開く
* Library内、libcocos2dxの接続が切れているのでこれを修正する
 * 「Add...」で libcocos2dxを選べばOK
 * 既にあるエラーになっているものはRemoveで消して下さい

※この同じ画面内のProjectBuildTargerで選択されているAndroidのバージョンが古すぎるとビルドに失敗する事があります。その場合は新しいバージョンを指定し直して下さい

# Eclipseでビルド＆実行

以上で変更作業は終了です
PHP5.5 Source Install

# Goal

```
* PHP5.5をCentOSにソースからインストールする
* Apacheは2.4系がソースからインストールされている前提
* （mySQLをPDOを使って接続する前提でビルドする）
```

# Preparation

```
$> uname -a
Linux *** 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

$> cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m

$> /usr/local/apache/bin/apachectl -V | head -n 1
Server version: Apache/2.4.7 (Unix)
```

# Manual

## Download

```shell-session
## 
## http://php.net/downloads.php
## 上記URLから任意のバージョンのダウンロードURLを確認
## 過去バージョンをもってきたい場合は、ページ右カラムのOld archiveから
## (http://www.php.net/releases/)
## 

## root user
cd /usr/local/src
wget "http://museum.php.net/php5/php-5.5.4.tar.gz"
tar zxvf php-5.5.4.tar.gz
ls -l php-5.5.4
```

## Build / Install

```shell-session
cd /usr/local/src/php-5.5.4

yum install libxml2-devel libcurl-devel libmcrypt-devel

./configure \
--prefix=/usr/local/php-5.5.4 \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-mysql=/usr/local/mysql \
--with-pdo-mysql=/usr/local/mysql \
--with-mysqli=mysqlnd \
--enable-mbstring \
--enable-libgcc \
--enable-pcntl \
--with-zlib \
--with-openssl \
--with-zlib \
--with-config-file-scan-dir=/usr/local/php-5.5.4/lib/conf.d

make
make test
make install
```

## Check Install

```shell-session
ls -l /usr/local/php-5.5.4
/usr/local/php-5.5.4/bin/php -v
  # PHP 5.5.4 (cli) (built: Mar  1 2014 20:26:49)
  # Copyright (c) 1997-2013 The PHP Group
  # Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
```

## Other Initial Setup

```
シムリンク
  # /usr/local/php-5.5.4 => /usr/local/php
php.ini
LoadModule
  # Apacheにphpモジュールを組み込む
AddType
  # Apacheに.phpのファイルをphpアプリケーションとして認識させる
DirectoryIndex
  # http://example.com/でアクセスするとindex.phpが配置されていればそのプログラムをよびだすように設定
Apache再起動
```

```shell-session
cd /usr/local
ln -s php-5.5.4 php

cd /usr/local/src/php-5.5.4
cp -i php.ini-production /usr/local/php-5.5.4/lib/php.ini
vi /usr/local/php-5.5.4/lib/php.ini
  # date.timezone = 'Asia/Tokyo'
  # (エラー設定：本番用)(/var/log/php/error.logはapacheのユーザが書き込める必要あり)
  # error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
  # display_errors = Off
  # log_errors = On
  # error_log = /var/log/php/error.log

vi /usr/local/apache/conf/httpd.conf
  # コメントアウトまたは追加
  # LoadModule php5_module        modules/libphp5.so

## 
## Apacheでphpアプリを動かしたいvirtual hostに以下の設定を追加
## 
AddType application/x-httpd-php .php
DirectoryIndex index.php index.html

/usr/local/apache/bin/apachectl graceful
```

# Others

mysql系インストールオプションをつけずにPHPビルドして、あとからPDOドライバをインストールしたい場合
* http://qiita.com/metheglin/items/d0bd108e72168b714014
さくらエディタのキーコマンド操作


**さくらエディタ** の便利なショートカットキー等についてまとめます。
注）私の良く使うものだけです

----
| キー | 機能名 |
|--------|--------|
| ダブルクリック | 現在位置の単語選択 |
| トリプルクリッック | １行選択 |
| クアドラプルクリック | 全選択 |
| F3 | 次検索（検索実行時） |
| F4 | 上下画面分割/分割解除 |
| F6 | 範囲選択開始 |
| F7 | 切り取り（カット） |
| F8 | コピー |
| F9 | 貼り付け（ペースト） |
| Tab | Tabインデント |
| Esc | 各種モードの取り消し |
| Home | 行頭移動 |
| End | 行末移動 |
| PgDn | １ページダウン |
| PgUp | １ページアップ |
| Shift+F3 | 前検索（検索実行時） |
| Shift+F4 | 左右画面分割/分割解除 |
| Ctrl+Alt+X | 折り返し無効 |

----
もし、 **さくらエディタ** を使いたい人は、下記からDL
[さくらエディタDLサイト](http://sakura-editor.sourceforge.net/index.html.ja)
ELB 経由で EC2 にアクセスする

# 目的
* AWS の EC2 に ELB 経由でアクセスすること
* AWS : http://aws.amazon.com/jp/

# EC2 を作成する
* AWS のマネジメントコンソールから EC2 Service を選択し、"Launch Instance" から作成する
* 詳細は下記の通り
    * OS : Ubuntu Server
    * Name : MyWeb1
    * Security Group を新たに作成し、 Inbound に 22, 80 を設定する(testsg)
    * security key を新たに作成する(testkey とする)
* 作成後は以下のようになる
![EC2インスタンス.png](https://qiita-image-store.s3.amazonaws.com/0/28573/37ff2ba5-16c1-d5b7-574c-c479cffa557d.png)

# ssh でターミナルからログインする
* 上の図の作成した MyWeb1 にチェックし、"Connect" を押すと接続の方法が表示される
    * 今回は、"ssh -i testkey.pem ubuntu@54.199.147.53" でログイン
![connect.png](https://qiita-image-store.s3.amazonaws.com/0/28573/14258674-68f1-0378-4692-09f71b75b4bb.png)
* ubuntu にログインしたら apache をインストールする
    * sudo apt-get update
    * sudo apt-get install apache2
* apache をインストールしたら、ブラウザからアクセスする
    * 今回は "54.199.147.53" にアクセスし、下記ページが表示できることを確認
![EC2アクセス.png](https://qiita-image-store.s3.amazonaws.com/0/28573/9af6ed52-858f-9e8c-8e5e-35e02697fd0f.png)

# ELB の作成
* EC2 のページから左下の Load Balancers を選択し、"Create Load Balancer" から作成する
* 詳細は下記の通り
    * Name : MyLoadBalancer
    * Security Group : quick-create-1 (default)
* 残りはそのままで作成を行い、最後に EC2(MyWeb1) ひもづける
* 作成後は以下のようになる
![ELBインスタンス.png](https://qiita-image-store.s3.amazonaws.com/0/28573/48e80dd0-ee46-2028-c25f-a2a16c455958.png)
* ELB の DNS を使用して、ブラウザからアクセスする
    * 今回は、"MyLoadBalancer-2144758831.ap-northeast-1.elb.amazonaws.com"
![ELBアクセス.png](https://qiita-image-store.s3.amazonaws.com/0/28573/d9102000-6d73-3353-7c35-fd75966c9bfa.png)
* EC2 のページが表示できることが確認できる

# セキュリティを高めるために
* EC2 と ELB の Security Group を制限する
    * ELB の Security Group に使用している quick-create-1 の Outbound を下記のように設定する
        * (Destination に testsg の Group ID を指定)
![sg-elb.png](https://qiita-image-store.s3.amazonaws.com/0/28573/0df5e631-b2f7-924e-7612-140dd30559e8.png)
    * EC2 の Security Group に使用している testsg の Inbound を下記のように設定する
        * (Source に quick-create-1 の Group ID を指定)
![sg-ec2.png](https://qiita-image-store.s3.amazonaws.com/0/28573/e535a27b-c935-d106-19d8-92f824a5a329.png)
* 上記のように設定することで、直接 EC2 にアクセスできず、必ず ELB を介すようにできる
SigilをWindowsでビルドする

環境はWindows8.1/VC++2010Express

1. SigilのソースコードをGitHubから取得
1. CMakeをインストール
1. QTをインストール
1. WindowsSDK8.0をインストール
1. Sigilのソースコードとは別のディレクトリにCMakeLists.txtをコピー(ここが作業場所になる)
1. CMakeの設定。
 
- Qt5_DIRにC:/Qt/5.2.1/msvc2010_opengl/lib/cmake/Qt5
- CMAKE_INSTALL_PREFIXにC:/Program Files (x86)/Windows Kits/8.0/Lib/Win8/um/x86

この設定でslnファイルができます。
起動(デバッグ)にはQtのdllが必要になりますので、C:\Qt\5.2.1\msvc2010_opengl\binからコピーしておいてください。
iPhoneアプリをGradleでビルドしてDeployGateで自動配布する方法

iOSアプリをビルドする際に、普通だったらxcodeでボタンぽちぽちしてビルドして〜ってやると思います
このやり方だと、xcodeのUIがある日突然変わった時など、結構困りますよね(自分だけ？)
そんなとき、コマンドでビルドからその先まで出来たら簡単ってこと、あると思います！
ってことで今回は[Gradle](http://www.gradle.org/)でビルドから[DeployGate](https://deploygate.com)にアップロードするまでを自動化してみたいと思います

# DeployGateの準備
DeployGateがつい先日iOS対応しましたね
ただ、普通にアカウント作ってもipaファイルをアップロードすることは今の所出来ません
beta programというものに入るとアップロード出来るようになります
まだアカウント持ってない人やbeta programに入ってない方は先にやっておいて下さい
https://deploygate.com/beta_program

# gradleの準備
まずは今回使うビルドシステムであるgradleを準備しないと始まりませんね
OSXだとhomebrewで入ります、入れましょう

```shell-session
$ brew install gradle
```
ちなみに、今だとgradle-1.10がインストールされました

# build.gradleの準備
次に、ビルドしたいiOSアプリのプロジェクト直下にbuild.gradleファイルを作ります
こんな感じになりました
ちなみに、Testっていう名前のプロジェクトです

```groovy
buildscript {
    repositories {
        maven {
            url('http://openbakery.org/repository/')
        }
        mavenCentral()
    }
    dependencies {
        classpath group: 'org.openbakery', name: 'xcodePlugin', version: '0.9.+'
        classpath 'com.deploygate:gradle:0.5'
    }
}
apply plugin: 'xcode'
apply plugin: 'deploygate'

xcodebuild {
    sdk = 'iphoneos'
    target = 'Test'
    scheme = 'Test'
    workspace = 'Test.xcworkspace' //cocoapodを使用している時のみ指定
    signing {
        identity = 'iPhone Distribution: NAME (...)' //キーチェーンアクセスの証明書に載っているのを書く
        mobileProvisionURI = 'file://localhost/(.mobileprovisionまでのfile path)' //プロジェクト直下にデベロッパーサイトからダウンロードしたTest.mobileprovisionを置いておくと便利
    }
}

deploygate {
    userName = 'deploygateのユーザー名'
    token = 'deploygateのapi token'

    apks {
        ios {
            sourceFile = file("ipaファイルまでのfile path")
            message = "message"
        }
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.10'
}
```
個別に詳しくはコメントで書いてあります

# wrapperのダウンロード
用意したら、次にwrapperタスクを実行しましょう
これで他の人も同じバージョンのgradleを使用することが出来て便利ですね

```shell-session
$ gradle wrapper
```
以後は作成した./gradlewをgradleコマンドの変わりに使用します

# ビルドの実行
さてビルドをしましょう！

```shell-session
$ ./gradlew codesign
```
これで問題なければipaファイルが作成されます！
そのfile pathをdeploygate内のsourceFileに書きましょう
これで以後、このように一発でDeployGateにアップロード出来ます

```shell-session
$ ./gradlew codesign uploadDeployGate
```
便利！！！！！！！！！！！！！！！！！！

# おわりに
build.gradle内のコメントにも書いてありますが、テスト端末が増えて来てUDIDが増えてくると.mobileprovisionの管理が大変になってくる気がします
そんな時はプロジェクト直下に.mobileprovisionを置いておき、UDIDが増減して新しくなるたびに上書きして保存すれば常に一個で管理出来るので便利かなと思いました

あと、今回使った便利なgradleプラグインのgradle-xcodePluginにDeployGateも組込みたいですね

# 参考
https://github.com/openbakery/gradle-xcodePlugin  
https://github.com/DeployGate/gradle-deploygate-plugin  
[iPhoneアプリをmakeコマンド一発でビルドしてDeployGateで自動配布する方法](http://qiita.com/k_kinukawa/items/42c240a9e9e8b6cb4923)  
[ipaファイル生成とDeployGateへのアップロードをXcode上で自動化する](http://qiita.com/kaz3439/items/503bb16548b395eef155)
Vyattaでフレッツ光ネクストにPPPoE接続する

#ぼやき。。。
VMware ESXi5.1環境ではどうしてもつながらなくて大はまりしました。結局ESXiのバージョンを5.5に上げてVyattaを再インストールし、VMware Toolsをアップデートしたらすんなり動きました。[^1]
簡単なところでちょっとむなしい時間を過ごしてしまいました。。。

#構成
まだ図の載せ方がわからないので、えいやっとテキストで書くとこんな感じです。

```
ONU --- eth0:Vyatta:eth1 --- 無線AP --- PC
```

##eth0
WAN側のNICです。
ONUとTP線でつないでPPPoEでグローバルIPアドレスを取得します。

##eth1
LAN側のNICです。
こちらにはローカルIPアドレス 192.168.3.1/24 を振りました。
BuffaloのWZR-HP-G302Hをブリッジモードでつなぎ、無線でノートPCを接続できるようにします。
IPアドレスはVyattaのDHCPで割り振ります。

#設定手順
##SSH接続できるようにする
インストール直後のVyattaにまずはESXiのコンソールからログインしますが、コピペができないしマウスカーソルがいちいち捕獲されて使いづらいのでまずはSSHログインをできるようにします。
設定を始める時のお約束、設定モードに切り替えます。

```bash
$ configure
```
プロンプトが#に変わり、設定モードに入ったことを教えてくれます。
通常モードに戻るときは、

```
# exit
```
です。
で、一気にSSHを有効化してコミットしてセーブ。

```
# set service ssh port 22
# set interfaces ethernet eth1 address 192.168.3.1/24
# commit
# save
```

ふう。ここから先はSSHクライアントで作業しましょう。
##PPPoEの設定
###接続設定
プロバイダから発行されたuser-idとpasswordを使います。

```
# show interfaces
# set interfaces ethernet eth0 pppoe 0
# set interfaces ethernet eth0 pppoe 0 user-id ********
# set interfaces ethernet eth0 pppoe 0 password ********
# set interfaces ethernet eth0 pppoe 0 default-route auto
# set interfaces ethernet eth0 pppoe 0 name-server auto
# commit
# save
```
###接続確認
```bash
$ show interfaces pppoe
```
で、ずらずら接続情報が出てくれば一安心です。私はここで、

```
pppoe0: Coming up
```
となってしまい、冒頭の大はまりをしたのでした。[^1]
##無線でぶら下がるノートPCのための設定
###DNS
```
# set service dns forwarding listen-on eth1
```
###DHCP
とりあえずIPアドレス100個プールします。

```
# set service dhcp-server shared-network-name MY_POOL subnet 192.168.3.0/24
# set service dhcp-server shared-network-name MY_POOL subnet 192.168.3.0/24 start 192.168.3.100 stop 192.168.3.199
# set service dhcp-server shared-network-name MY_POOL subnet 192.168.3.0/24 default-router 192.168.3.1
# set service dhcp-server shared-network-name MY_POOL subnet 192.168.3.0/24 dns-server 192.168.3.1
```
###DNS転送
Vyattaに来たDNSリクエストを全部PPPoEでもらったDNSサーバに転送します。

```
# set service dns forwarding listen-on eth1
```
###NAT
DHCPクライアントが外に出るためにNATの設定をします。Vyatta6.6ではだいぶコマンドが変わっていました。

```
# set nat source rule 10 translation address masquerade
# set nat source rule 10 source address 192.168.3.0/24
# set nat source rule 10 outbound-interface pppoe0
```
##Firewallの設定
最低限ですが、外からSSHできないようにしておきます。

```
# set firewall name LOCAL_RULES default-action accept
# set firewall name LOCAL_RULES rule 10 protocol tcp
# set firewall name LOCAL_RULES rule 10 destination port ssh
# set firewall name LOCAL_RULES rule 10 action reject
```
でもって、eth0に適用します。

```
# set interfaces ethernet eth0 pppoe 0 firewall local name LOCAL_RULES`
```
#まとめ
5時間くらいかかりましたが、なんとかVyattaがブロードバンドルータとして動作しました。速度は無線で20Mbps程度なので、少し遅いですかね。これでVyatta入門の第3章が完了したことになります。明日は仕事だから、次は来週の週末に4章を流してみます。

注釈
[^1]: その後VMware ESXi6.0U1環境で再現、どうやらpppoeのID/PWを間違えていただけのようです。（2016/2/13追記）
HTML5でファイルをドラッグして読み込むやつ

（2018年追記: 自分で必要になって見返してみて、古い記事だけどまだ内容は大丈夫でした。）

## サンプル

* デモ: http://jsfiddle.net/ginpei/bSF9z/
* GitHub: https://github.com/ginpei/sample-for-html5-drop-files

こんなん:
![3.png](https://qiita-image-store.s3.amazonaws.com/0/10765/d728b167-f745-804e-38d8-ef7d93b17d6b.png)



## ブラウザーでファイルを開かないようにする

* 受け付けたい要素の`dragover`イベントと`drop`イベントを監視する。
* それぞれで`event.preventDefault()`する。

## ファイルをドラッグしてきたら見た目を変える

* 要素のクラスをon/offする場合。
* `dragover`でonにする。
* `dragleave`と`drop`でoffにする。

## ドロップされたファイルの情報を取得する

* `drop`イベントの`event.dataTransfer.files`にファイル情報が入る。
* 形式は`File`オブジェクトの配列。
* `File`オブジェクト:
  * `name`
  * `size`
  * `type` … (ex: `"image/png"`)

## ドロップされたものが画像であるか判別する

* `File`オブジェクトの`type`を確認する。
* `type.indexOf('image/')===0`なら画像。

## 画像だったら表示する

* `File`オブジェクトから`FileReader`オブジェクトの`readAsDataURL()`メソッドを使って読み込む。
* 読み込み成功すると`load`イベントが発火し、その`event.target.result`に画像のData-URIが格納されている。

## 参考

* [JavaScript でのローカル ファイルの読み込み - HTML5 Rocks](http://www.html5rocks.com/ja/tutorials/file/dndfiles/)
Pythonの組み込み関数をラップする

Python で組み込み関数と同じ名前の関数を作成したときに、その関数の中で本来の組み込み関数を呼び出したい場合、 `builtins` モジュール（ [マニュアル](http://docs.python.jp/3.3/library/builtins.html) ）を使うことで組み込みの関数を呼び出すことができる。

例えば組み込み関数 `max` をラップして使いたい場合は以下のように書ける。

```py3:sample.py
# -*- coding: utf-8-unix -*-
import builtins

class Foo(object):
    pass

def max(a, b):
    u"""組み込み関数をラップした関数
    """
    v1, v2 = a, b

    if isinstance(a, Foo):
        v1 = a.value

    if isinstance(b, Foo):
        v2 = b.value

    # 組み込み関数の呼び出し
    return builtins.max(v1, v2)

if __name__ == '__main__':
    obj = Foo()
    obj.value = 10

    print(max(20, obj))  # >>> 20
    print(max(5, obj))  # >>> 10
    print(max(5, 20))  # >>> 20
```

なお、 Python 2系では `__builtin__` モジュール（ **'s'は付かない！** ）を使用することで同様のことが実現できる。

Python 2系と3系のどちらでも実行できるようにしたい場合は、モジュールのロード部分を以下のようにすればよい。

```py3
try:
    # Python 3.X 用
    import builtins
except ImportError:
    # Python 2.X 用
    import __builtin__ as builtins
```
select + mapを色々な手段で実装する


[select + mapを一つのメソッドで](http://qiita.com/crispy/items/de72b1619a24683eb96f)の続き。
さしあたって５個書いてみました。

# 設定課題

- 絞込：文字列から数値をてきとうに抽出する
- 加工：数値に変換。+1して返す。

# each
他の言語から移ったばかりにとってはまぁ標準的なスタイルかと思います。

```rb
def filter_number_and_succ(xs)
	res = []
	xs.each do |x|
		res << $&.to_i.succ if /\d+/ =~ x
	end
	return res
end

p filter_number_and_succ(%w(test-101 102 hoge 003 a002))
```

##Pros
- 初心者でもわかりやすい
- 色々と処理を詰め込める

## Cons
- eachという単語から"配列を変更して返す"という意味が期待できない(resという変数名があるけど・・・)
- 副作用があるコードが違和感なく書ける

# select + map
Ruby初心者脱出した辺りで書きたくなるコードかと思います。

```rb
def filter_number_and_succ(xs)
	xs.select { |x|
		/\d+/ =~ x
	}.map { |x|
		$&.to_i.succ if /\d+/ =~ x
	}
end
```

## Pros
- 初心者でも勉強してもらえば分かってもらえる
- 絞込と加工が別フェーズになっていて処理が明確

## Cons
- (この例のように)絞込と加工が同じ動作を兼ねる場合は処理が冗長になる
- 絞込方法、加工方法を外からブロックなどで渡そうとした際にキモいことになる


# flat_map
flat_mapは空配列を除去する、という性質があることを利用した方法です。MayBeモナ・・・？

```rb
def filter_number_and_succ(xs)
	xs.flat_map { |x|
		next [] unless /\d+/ =~ x
		$&.to_i.succ
	}
end
```

## Pros
- 一回のループで複数の結果を返すことが出来る
- nextで空配列を返せば、「結果はいらないよ」ということをそれなりに表現できる

## Cons
- 本当に配列を返したい時は、```[[x, y, z]]```とか書かなきゃダメでぱっと見よくわからない。

# map + compact
結果がいらない場合はnilを返して、compactで皆殺しにする作戦です。

```rb
def filter_number_and_succ(xs)
	xs.map { |x|
		$&.to_i.succ if /\d+/ =~ x
	}.compact
end
```

## Pros
- nilを返せば(または戻り値を指定しなければ)、「結果はいらないよ」ということをそれなりに表現できる

## Cons
- 本当にnilを返したい時はどうにもならない

# inject
関数型言語のサンプルで見るやつです。

```rb
def filter_number_and_succ(xs)
	xs.inject([]) { |acc, x|
		if /\d+/ =~ x 
			acc + [$&.to_i.succ]
		else
			acc
		end
	}
end
```

## Pros
- それなりに直感的

## Cons
- ブロックが「Array#+で配列の連結ができる」ということを知ってなければならず、配列がデータ構造の組み立て方を意識しなればならない。
- その気になれば、ブロック側が途中の計算結果を破壊できるわけで
NSUserDefaultsを使う際の注意点


アプリの設定などを保存させたいときなどによく使うNSUserDefaults。
NSUserDefaultsを使う際の注意点を何点かメモっておきます。

## (1) 値の即時反映
単に単純な話で、値を即時反映させたい場合は"synchronize"を使いましょうということ。


例えば、設定画面とかでSliderの変化に応じて値を保存したい場合、"synchronize"を使って即時反映させないと値の保存が遅れてしまいます。
なので、自動的な保存を待てない場合は以下のように"synchronize"を使います。

```objectivec:サンプルコード
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud setFloat:value forKey:"ShowValue"];
BOOL successful = [ud synchronize];
```

### 参考資料
 - [Appleリファレンス](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsuserdefaults_Class/Reference/Reference.html#//apple_ref/occ/instm/NSUserDefaults/synchronize)

## (2) immutable/mutable
NSUserDefaultsはimmutableな値を返します。

````
Values returned from NSUserDefaults are immutable, even if you set a mutable object as the value
````


なので、以下のようにNSUserDefaultsを使って保存していた値を取り出して変更を加えて、再度保存しようとしたとするとエラーになります。

```objectivec:サンプルコード
NSUserDefaults *ud  = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *userInfo = [ud valueForKey:@"USER_INFO"];
[userInfo setObject:@"SAMPLE" forKey:@"A"];
[ud setValue:userInfo forKey:@"USER_INFO"];
````

````エラーメッセージ
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'
````

なので、以下のようにmutableCopyで作り直せば解決。

```objectivec:サンプルコード
NSUserDefaults *ud  = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *userInfo = [[ud valueForKey:@"USER_INFO"] mutableCopy];
[userInfo setObject:@"SAMPLE" forKey:@"A"];
[ud setValue:userInfo forKey:@"USER_INFO"];
````


### 参考資料
 - [Appleリファレンス](https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSUserDefaults_Class/Reference/Reference.html)
VimShellを使おうとした時に「Please install vimproc Ver.6.0 or above.」と出た時の対処法


##解決法
vimprocのdirectoryに行ってmakeする。

```
$ cd {vimproc-directory}
$ make
```

##参考
[Installing vimproc and vimshell using Vundle. · Issue #108 · Shougo/vimproc.vim](https://github.com/Shougo/vimproc.vim/issues/108)
RubyでHTTPリクエストの通信内容を確認する

set_debug_outputでnet/httpの通信内容を確認できる。
これを用いてgemの中でもnet/httpを使っていれば通信内容を確認できる方法をメモする。

## スクリプトで確認する方法

* スクリプトで確認する際は下記のようなコードを先頭に配置する。

```rb
require 'net/http'

class Net::HTTP
  alias :create :initialize

  def initialize(*args)
    create(*args)
    self.set_debug_output $stderr
    $stderr.sync = true
  end
end
```

## railsで確認する方法

* passengerにおいてapacheのerror_logに出力
 * 上記のコードをconfig/initializers/http.rbあたりに配置

* railsログに出力
 * 以下のようなコードを配置

```rb
require 'net/http'

class Net::HTTP
  alias :create :initialize

  def initialize(*args)
    logger = Rails.logger
    def logger.<< log
      info "HTTP_LOG:#{log}"
    end
    create(*args)
    self.set_debug_output logger
  end
end
```

## 出力内容

以下のような感じで通信のデバッグログが出力される

```bash
opening connection to www.google.co.jp...
opened
<- "GET / HTTP/1.1\r\nConnection: close\r\nHost: www.google.co.jp\r\nAccept: */*\r\n\r\n"
-> "HTTP/1.1 200 OK\r\n"
-> "Date: Sun, 30 Sep 2012 01:49:21 GMT\r\n"
-> "Expires: -1\r\n"
-> "Cache-Control: private, max-age=0\r\n"
-> "Content-Type: text/html; charset=Shift_JIS\r\n"
-> "Set-Cookie: PREF=ID=be9181a7dc77ebf4:FF=0:TM=1348969761:LM=1348969761:S=bvbJqDikB9M8WLUZ; expires=Tue, 30-Sep-2014 01:49:21 GMT; path=/; domain=.google.co.jp\r\n"
-> "Set-Cookie: NID=64=kBPaI8UJL-M-Q_EBwtwutN_hVKOV2JYL6w-2lNpNGya83gDk2bLmUu6IkvrSE3lbDbVCpxcDciGHcdcd0TxlOyIrT34AOJdo_gUALHHJ6aVu0O75QscfZkchFxPWO-3W; expires=Mon, 01-Apr-2013 01:49:21 GMT; path=/; domain=.google.co.jp; HttpOnly\r\n"
-> "P3P: CP=\"This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info.\"\r\n"
-> "Server: gws\r\n"
-> "X-XSS-Protection: 1; mode=block\r\n"
-> "X-Frame-Options: SAMEORIGIN\r\n"
-> "Connection: close\r\n"
-> "\r\n"
reading all...
-> "[GETしたbody]"
read 43792 bytes
Conn close
```
Dockerコンテナのファイルディスクリプタ設定


# やりたいこと
fluentdを使うには[ファイルディスクリプタ（FD）の数を増やしておく必要がある](http://docs.fluentd.org/ja/articles/before-install)。これをdockerコンテナに対して設定したい。しかしこれは残念ながらホスト側やdocker側の設定が必要になりDockerfileには書けない。[ここ](http://qiita.com/gitcell/items/7cfde70e7a73fa1d2f7b#3-4)を参考に設定してみた。fluentdに限った設定ではないので、いろいろな用途に使えるはず。

# とりあえずこうしてる
どなたかもっとよい手順があれば教えてくだされ。

* ホスト：Debian 7 on Google Compute Engine
* ゲスト：Ubuntu 12.04
* Docker v0.8.1

## ホスト側のFDを増やす
`/etc/security/limits.conf`でFDを増やしても自動起動スクリプトには効いてくれないので困っていた。[外道父さんのエントリ](http://blog.father.gedow.net/2012/08/08/ulimit-configuration/)を参考に、`/etc/initscript`を以下のように書いて追加したらうまく動いた。外道父さんthx！

```/etc/initscript
ulimit -n 65536
eval exec "$4"
```

## カーネルパラメータ調整
これはfluentd/td-agentを使う場合のみ。

```/etc/sysctl.conf
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10240    65535
```

## dockerコンテナのFDを増やす

```/etc/init/docker.conf
limit nofile unlimited unlimited
```

## ホストを再起動してFDが増えてるか確認

```
$ sudo docker run ubuntu sh -c 'ulimit -n'
```

これで65536と出ればOK。
git rmし忘れたファイルを一括処理する


gitでいつも忘れてしまうのが`git rm`コマンド。

気づいた時にはこんなことになってることが多いのではないでしょうか。

```Bash
$ git status
# On branch hogehoge
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    hello/1
#       deleted:    hello/2
#       deleted:    hello/3
#       deleted:    hello/world/1
#       deleted:    hello/world/2
#       deleted:    hello/world/3
```

こんな時は以下のコマンドを使ってdeletedとなっているファイルを一括で`git rm`しています。

```Bash
$ git status | grep deleted | awk '{print $3}' | xargs rm
```

もう少しいい方法があれば知りたいです！
ChromeApp開発時に役立つ機能1

Chromeで拡張機能を作ってる方々ならすでに知っているかもしれないが、
これから始める方はこれを覚えておくと非常に便利だという機能の紹介。
自分もついこの間知った。

# Developer Tools(開発者ツール)
デバッグ中のアプリの適当なところを右クリックし、 **要素を検証** で表示されるこのツール。
これならば以前の投稿でも触れたが、このツールのコンソールの部分でワンポイント。

このコンソール、何もアプリからのデバッグ目的で出力されるだけのページではない。
実は一番最後の > となっている箇所では、 **入力してコード補完しつつjavascriptが実行できる** のだ。
こんな感じ（一番下の行）。
![win8_devcap007.PNG](https://qiita-image-store.s3.amazonaws.com/0/38416/90d1764f-3c0a-5fa6-e1f4-fced88739c55.png)

画像の例では、Chrome Platform APIのchrome.storageを入力している。
公式のリファレンスのページを見ないとわからなかった機能の全てが、 **ここで確認できる** のだ。
さすがに機能の説明までは出ないようだが、名前だけでも想像できるメソッドやプロパティなら
ここに出てくるだけでも十分、理解・確認するのに活用できるだろう。

これから開発する方、作ってはいたけど知らなかったよ！という方はぜひとも
これを活用して開発をスムーズに進めましょう！
OS X Spotlight Tips

###1.start Spotlight

`ctrl + space`

###2.NOT search

>keyword1 -keyword2

###3.search by file type

using **kind**

>keyword kind:pdf

text(html/css/txt)

>keyword kind:text

###4.search by file extension

text(txt file only)

>keyword name:.txt

html file only

>keyword name:.html

###5. Open by other applications

>drag filename to icon in dock

###6. Show in finder

`command + Enter` or `command + R` or `command + click`
capybara で $.ajax [DELETE|PUT|PATCH] request をテストしたい時に気をつけること


要はこういうやつです。
[$.ajax delete request not sending data parameters in capybara-webkit #512](https://github.com/thoughtbot/capybara-webkit/issues/512)


## やりたかったこと
Rails アプリで（js から） Ajax でレコードを削除したかったんです。
こういう感じになってました。

```ruby
  $.ajax 'url',
    type: 'DELETE'
    data: { hoge_id: "hoge_id" }
```

これはだいたいのブラウザ動きます。 [PUT/DELETEメソッド - hokaccha.hamalog v2](http://d.hatena.ne.jp/hokaccha/20110702/1309593231)
コントローラで見てみると、ちゃんと `hoge_id` というパラメータが渡ってくる。
だからふつうに動く！；ｘ；

## でもテストではパラメータが渡ってこない

でも、テスト走らせると、途中でコケる。
log/test.log をみながらデバッグすると、削除対象が取得できてない。
コントローラに渡ってくるパラメータに hoge_id がない。

## 解決
```ruby
  $.ajax 'url',
    type: 'POST'
    data: { hoge_id: "hoge_id", _method: 'DELETE' }
```

こうしたらいいよって @uu59 先生が教えてくれた。
うお〜、なるほどすぎる。。。頭固くなっちゃいけませんね＞＜


## 気をつけること
- ajax request の DELETE/PUT/PATCH は
  - だいたいのWebブラウザでは動く（でも HTML form の method属性値は違う）
  - ブラウザ依存なので、対応してないことがある（テストでよく使う headless 系ブラウザは特に）から POST + _method 使うといいですね。

## ちょっと整理
  - capybara の javascript_driver で js ドライバを設定してる
  - ドライバが capybara-webkit だったらブラウザは QtWebKit
  - ドライバが Poltergeist だったらブラウザは PhantomJS
もっと気軽にEachしたい！Mapもしたい！

#背景
タイトルにある通り。enumerateObjectsUsingBlockって、なんか気軽じゃない。
filteredArrayUsingPredicate + predicateWithBlockなんて、書いたことも無い。

ほぼ純粋なシンタックスシュガーですが、特にmapは手放せなくなります。

## mapについて
返り値がnilの場合には結果から除外されます。これを利用すると、簡単なフィルターとして使用できます。
nilを返す必要がある場合には、[NSNull null]を使用してください。

#実装
## NSArray用カテゴリ

```objc:NSArray+BTKCollection.h
//
//  NSArray+BTKCollection.h
//  BTKCommons
//
//  Created by Tomohisa Ota on 2/28/14.
//  Copyright (c) 2014 Tomohisa Ota. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSArray (BTKCollection)

- (void) btk_each:(void (^)(id obj, NSUInteger idx, BOOL *stop))block;

- (NSArray*) btk_map:(id (^)(id obj, NSUInteger idx, BOOL *stop))block;

@end
```

```objc:NSArray+BTKCollection.m
//
//  NSArray+BTKCollection.m
//  BTKCommons
//
//  Created by Tomohisa Ota on 2/28/14.
//  Copyright (c) 2014 Tomohisa Ota. All rights reserved.
//

#import "NSArray+BTKCollection.h"

@implementation NSArray (BTKCollection)

- (void) btk_each:(void (^)(id obj, NSUInteger idx, BOOL *stop))block
{
    if(block == nil){
        return;
    }
    [self enumerateObjectsUsingBlock:block];
}

- (NSArray*) btk_map:(id (^)(id obj, NSUInteger idx, BOOL *stop))block;
{
    if(block == nil){
        return nil;
    }
    NSMutableArray *mArray = [[NSMutableArray alloc]initWithCapacity:self.count];
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        id mappedObj = block(obj,idx,stop);
        if(mappedObj){
            [mArray addObject:mappedObj];
        }
    }];
    return mArray.copy;
}

@end
```


## NSDictionary用カテゴリ

```objc:NSDictionary+BTKCollection.h
//
//  NSDictionary+BTKCollection.h
//  BTKCommons
//
//  Created by Tomohisa Ota on 2/28/14.
//  Copyright (c) 2014 Tomohisa Ota. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSDictionary (BTKCollection)

- (void) btk_each:(void (^)(id key, id obj, BOOL *stop))block;

@end
```

```objc:NSDictionary+BTKCollection.m
//
//  NSDictionary+BTKCollection.m
//  BTKCommons
//
//  Created by Tomohisa Ota on 2/28/14.
//  Copyright (c) 2014 Tomohisa Ota. All rights reserved.
//

#import "NSDictionary+BTKCollection.h"

@implementation NSDictionary (BTKCollection)

- (void) btk_each:(void (^)(id key, id obj, BOOL *stop))block
{
    if(block == nil){
        return;
    }
    [self enumerateKeysAndObjectsUsingBlock:block];
}

@end
```
javaのGCのログ関連の設定

# javaのGCのログ関連の設定

環境変数のJAVA_OPTSか起動時にオプションで設定する


## gcのログを出力する

```
-verbose:gc
```
出力内容
[GC GCする前のオブジェクトのサイズ -> GCした後のオブジェクトのサイズ(ヒープ領域のサイズ),処理時間]


## gcのログの出力先の指定

```
-Xloggc:/file/to/path/gc.log.$TODAY
```

## gcログに時間を表示する

```
-XX:+PrintGCDateStamps
```

出力内容
時間:jvm起動からの時間[GCのログ]

## gcログを詳細に出力する

```
-XX:+PrintGCDetails
```

領域毎にログが出力される

出力内容

[GC[該当領域:該当領域のGCする前のオブジェクトのサイズ -> 該当領域のGCした後のオブジェクトのサイズ(該当領域のサイズ),該当領域の処理時間]GCする前のオブジェクトのサイズ -> GCした後のオブジェクトのサイズ(ヒープ領域のサイズ),処理時間]


## OutOfMemoryErrorが発生したらHeapDumpする

```
-XX:+HeapDumpOnOutOfMemoryError
```

## スレッドダンプした時にヒープ内部のオブジェクトの統計情報を出力する

```
-XX:+PrintClassHistogram
```
Could not find a storyboard named 'Main' in bundle NSBundle 対処方法


```
2014-03-01 11:15:09.237 xxxx [5103:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'Main' in bundle NSBundle
```

Storyboard を消した場合に `Could not find a storyboard named 'Main' in bundle NSBundle` というエラーになった場合の対処方法。

Project settings
↓
Info
↓
Custom iOS Target Properties

から以下を削除する

`Main storyboard file base name`




出典: [Could not find a storyboard named ‘Main’ in bundle NSBundle | Random ramblings](http://kmdarshan.wordpress.com/2013/07/15/could-not-find-a-storyboard-named-main-in-bundle-nsbundle/)
インナークラスのコンストラクタを外から無名クラスとして継承できるようになったeclipse

ふと [ECJ (eclipse compiler for Java) bug. インナークラスのコンストラクタを外から無名クラスとして継承すると型エラー](http://qiita.com/keigoi/items/06ff1ca1ec7b01c276cc) のことを思い出した。
JavaコンパイラECJのインナークラスに関するバグを2件見つけて、パッチを送ったのだった。
現在のバージョンKepler Service Release 2 ではパッチが反映されていることを確認した。

これは、Java7以前でモナドをいかに軽量に書けるか？ということを試していて発見したのだった。

せっかくなので、全く意味のない例ではあるが、 これを使って State モナドを書いてみた。 ほげほげ.new Bind<..>(){...}.run() と書けるようになった、というところ(だけ)がポイントだ。

Java 7 ではこれが限界だけど、 Java 8 ではどれくらい軽量に書けるだろうか？

```java:StateSample.java
package _sandbox;

import static _sandbox.State.*;

public class StateSample {
	public static void main(String args[]) {
		
		// in Haskell: snd . runState (get >>= \s -> put (s+1) >>= \_ -> get) 100
		
		Integer x = new Get<Integer>().new Bind<Unit>(){
			public State<Integer,Unit> f(Integer s) {
				return new Put<>(s+1);
			}
		}.new Bind<Integer>(){
			public State<Integer, Integer> f(Unit _) {
				return new Get<>();
			}
		}.run(100).snd;
		
		System.out.println(x); // 101
	}	
}
```

```java:State.java
package _sandbox;

final class Pair<X,Y> {
	public final X fst;
	public final Y snd;
	public Pair(X fst, Y snd) {
		this.fst = fst;
		this.snd = snd;
	}
}

final class Unit{
	public static final Unit unit = new Unit();
	private Unit() {}
}

public abstract class State<S,A> {
	
	public abstract Pair<S,A> run(S s);

	// return
	public static final class Return<S,A> extends State<S,A> {
		public final A ret; 
		public Return(A ret) {
			this.ret = ret;
		}
		public final Pair<S,A> run(S s) {
			return new Pair<>(s,this.ret);
		}
	}
	
	// bind (>>=)
	public abstract class Bind<B> extends State<S,B> {
		public abstract State<S,B> f(A a); // override this
		public final Pair<S,B> run(S s) {
			Pair<S,A> result = State.this.run(s);
			return this.f(result.snd).run(result.fst);
		}
	}
	
	// get
	public static final class Get<S> extends State<S,S> {
		public Get() {}
		public final Pair<S,S> run(S s) {
			return new Pair<>(s,s);
		}
	}
	
	// put
	public static final class Put<S> extends State<S,Unit> {
		public final S newState;
		public Put(S newState) {
			this.newState = newState;
		}
		public final Pair<S,Unit> run(S _) {
			return new Pair<>(this.newState,Unit.unit);
		}
	}	
}
```
Activity起動の時点でソフトウェアキーボードを表示する

# ソフトウェアキーボードの常時表示
EditTextなどを使うアプリを作るときに、
編集する部分をタップしてからキーボード(IME)を出すのではなく、
最初からキーボードを出しておきたい時があります。

初めはEditTextの属性やらInputMethodManagerの設定やらを変えて
起動時に表示できるよう格闘していたのですがなかなかうまく行きませんでした。

いろいろ調べてみた結果、

```java
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
```
で起動時のソフトウェアキーボード表示が出来ました。
Windowに対してキーボードを出すよう指定してあげないと行けないみたいです。

## 参考
http://stackoverflow.com/questions/2403632/android-show-soft-keyboard-automatically-when-focus-is-on-an-edittext
英語でググってみるのは大事ですね‥
Vyattaをインストールする

Vyattaをインストールします。
http://www.vyatta.org/downloads からダウンロードします。
ユーザ登録（無料）が必要です。

無償で利用できるのは、Vyatta Core。テストや開発環境用のオープンソースソフトウェアになっています。
商用利用では有償で Vyatta Subscription Edition を利用することになります。

仮想環境で学習用途で利用しますので、仮想環境に最適化された、VC6.6 - Virtualization ISO をダウンロードしてインストールすることにします。もちろん 32bit版で充分。

VMware ESXiへのインストール手順は割愛しますが、パラメータは少し余裕を見て以下で設定しました。

* ゲストOS：Debian GNU/Linux5 (32ビット)
* NIC: 2枚接続（1枚目はブリッジ、2枚目はNAT）
* 仮想ディスクサイズ：2GB
* メモリ: 512MB

ダウンロードしたCDイメージで仮想マシンをブートします。初期ユーザVyatta、パスワードVyattaでログインします。さて、インストールですが、ログイン後のコンソール画面で、
`install system`
というコマンドを実行します。いくつか質問されますが、基本デフォルト設定と yes でOKです。
あと、この手順の中で初期ユーザVyattaのパスワードを適切に設定します。
リブートしてインストールは完了です。
虫食いコードクイズ

# 虫食いコード
```rb
def foo(n)

  s = n.??????

  s.gsub(/./){|c|c.to_i>0?"*":"\n"}

end
```

上のようなメソッドがあります。
引数`n`には、数値が渡されることを期待しています。
`n.??????`では、あるメソッドを呼んでいます。

## 引数と戻り値
`foo 975`では、以下の文字列が返ります。

```
****

****
```

`foo 3006189`では、以下の文字列が返ります。

```
*
**
***
****
***
**
*
```

`foo 8791795956735`では、以下の文字列が返ります。

```
**********
**********
**********
**********
```

## 問題
`foo 39699650524203608556267005547831588735`だと、何て返るんでしょう。

# 一言
[コードゴルフ的なもの](http://qiita.com/blurblue/items/3e322d0189cae589cffb)を解いてたら思いついたのでクイズにしてみました。
Ruby以外では、大きな数値を扱うのが難しいのでRubyにしました。

(gsubの部分はぶっちゃけ少し分かりにくくしてます。素直に書いたらすぐに答え分かるし。)

## ヒントのようなもの
- `foo 1`では`*`が返りますが、`foo 2`でも`*`が返ります。

## おまけ: 別バージョン
コメントでアドバイスをいただき(ありがとうございます！)、別バージョンが出来たのでこちらにも追記します。

```rb
def foo(n)

  s = n.??????

  s.gsub(/./){|c|c=c.to_i;c>0?(c>1?"L"*(c-1):" "):"\n"}

end
```

`n.??????`の部分は、上のと少し違います。
`foo 221607684358918433469140214100113483789619871671261045176200726322239151137507466750261989293139198188272371638628418943901601268`とすると、以下の文字列が返ります。

```
LLLLLLLL    LLL   LLL  LLLLLLLL   LLL   LLL
LLL   LLL   LLL   LLL  LLL   LLL  LLL   LLL
LLL   LLL   LLL   LLL  LLLLLLLL   LLL   LLL
LLLLLLL     LLL   LLL  LLL   LLL   LLLLLLL
LLL   LLL   LLL   LLL  LLL   LLL     LLL
LLL   LLLL   LLLLLLL   LLLLLLLL      LLL
```
Array#duplicate(Array#uniqの逆)

#Array#duplicate

Array#uniqの逆のことをやりたかった。

ついでに要素を1つだけ削除する`delete_first`と`delete_last`も定義。
(Array#deleteだと全ての要素が削除される。)

```rb
class Array
  def delete_first(obj)
    if i = index(obj)
      delete_at(i)
    end
  end
  
  def delete_last(obj)
    if i = rindex(obj)
      delete_at(i)
    end
  end
  
  def duplicate!
    unless (u = uniq).size == size
      u.each do |obj|
        delete_first(obj)
      end
      self
    end
  end
  
  def duplicate
    clone.duplicate! || []
  end
end
```

```rb:sample
a = [1,'x',2,'x','y','y',3,'x']
p a
p a.duplicate
p a
p a.duplicate!
p a
```

```text:result
[1, "x", 2, "x", "y", "y", 3, "x"]
["x", "y", "x"]
[1, "x", 2, "x", "y", "y", 3, "x"]
["x", "y", "x"]
["x", "y", "x"]
```

n個重複してる要素はn個返ってきます。


#to do
- ブロック渡せるようにする。(Array#uniqだと渡せる)
- "duplicate"は複製という意味もあるので紛らわしい気がする。実際にObject#dupあるし。
「ホームへ追加」のtouch iconが反映されない

http://mathiasbynens.be/notes/touch-icons

などのサイトを参考にしてtouch iconを指定したのだけど、「ホームへ追加」を何度してもアイコンが適用されない端末がある。

- iOS 7.0.? (iPhone5)

適用されない端末がある一方で、

- iOS 7.0.4 (iPod touch 5th)
- iOS 5.?.? (iPhone 4)
- iOS 4.?.? (iPhone 3G)

は適用されたりする。

原因不明だ……といろいろ調べてみると。

---

http://stackoverflow.com/questions/7885393/apple-touch-icon-isnt-showing-up-on-the-home-screen

にある

```:quote
I had the same problem. The solution is to remove the password protection on the website.
```

この一文を見つけました。BASIC認証がかかってない環境で試したら適用されました。

ちなみに、この数時間前に同じくBASIC認証で動画ファイルの扱いにはまっていたりしました。BASIC認証嫌い。
まあ、動画の方は周囲にBASIC認証だと再生できないよと言われていたにも関わらず、何故かBASIC認証の環境でないと答えていた自分が悪いのだけど……
Atom で Package のインストールに失敗する件と解決方法

# 背景

vim-mode 入れたかったんだけど、node 弱者のためすんなり行かなかったのでメモしておく。

# 問題

自分の環境だと Preferences -> Packages で install ボタンを押しても、`apm install <package>`でも上手く行かず、以下のエラーログが表示された。
どうもオレオレ証明書があるらしくて動かないっぽい。

```
Installing “command-logger@0.15.0” failed. Less…

npm http GET https://registry.npmjs.org/d3-browserify/3.3.13
npm http GET https://registry.npmjs.org/humanize-plus
npm http GET https://registry.npmjs.org/underscore-plus
npm http GET https://registry.npmjs.org/humanize-plus
npm http GET https://registry.npmjs.org/underscore-plus
npm http GET https://registry.npmjs.org/d3-browserify/3.3.13
npm http GET https://registry.npmjs.org/humanize-plus
npm http GET https://registry.npmjs.org/underscore-plus
npm http GET https://registry.npmjs.org/d3-browserify/3.3.13
npm ERR! Error: SELF_SIGNED_CERT_IN_CHAIN
npm ERR!     at TLSSocket.<anonymous> (_tls_wrap.js:777:36)
npm ERR!     at TLSSocket.EventEmitter.emit (events.js:98:17)
npm ERR!     at TLSSocket._finishInit (_tls_wrap.js:337:8)
npm ERR! If you need help, you may report this *entire* log,
npm ERR! including the npm and node versions, at:
npm ERR!     <http://github.com/isaacs/npm/issues>
```

# 解法

追記：オレオレ証明書を使わない方法が[公式](http://blog.npmjs.org/post/78085451721/npms-self-signed-certificate-is-no-more)にありました(Thanks @shuhei@github)。
ということで以下２つのどちらかで解決できます。

- npm のバージョンを上げる
`npm install npm -g --ca=""`

- npm にオレオレ証明書を使わないように設定する
`npm config set ca=""`

# まとめ

ということで無事 vim-mode が使えるようになった。これで使える！
Chrome のデベロッパーツールが表示されたりして中々面白いエディタかも。

# 参考リンク

http://blog.npmjs.org/post/78085451721/npms-self-signed-certificate-is-no-more
http://discuss.atom.io/t/apm-npm-issue-installing-packages/1715/5
http://stackoverflow.com/questions/9626990/receiving-error-error-ssl-error-self-signed-cert-in-chain-while-using-npm
エンジニアのための音声アウトプット(仮)

エンジニアにとって、アウトプットは大事だと言われます。なぜでしょうか。

結論から申すと、それは __考えるのを辞めないため__ だと思っています。

# Fuck な脳味噌
先日、開発しているサービスについて共同経営者と会話していましたが、その中で自分は技術についてのみ注目していて __何のために作るのか__ をまったく考えていませんでした。

 __我ながら、とてもFuckです__ 

ソフトウェアも、システムも、サービスも、やることは突き詰めれば価値の提供であることに変わりはないはずです。それを他人が金銭という対価を払って手に入れる。なら、どうやって作るかと同じくらいになぜ作るかを大事にするのは今更議論するまでもありません。

って、よくノウハウ本に書いてあったはずなんですけどねえ。。。

# 眺めるだけならカメラでおｋ
では、そこでなぜアウトプットか。しかもエンジニア限定で。

それは、アウトプット　＝＝　形作る　という行為がプログラミングチックであり、エンジニアが手馴れていることだからです。で、意外とその中でも｢考えを自分の言葉でしゃべる」行為は難易度が高いと思います。

いや、本当のことを申すと実際難しかったです。今まで自分の頭で如何に考えていなかったかを痛感しました。

プログラミングも、ドキュメント書きも、手順書作成も、ほとんどテンプレートをコピペして作っていたような自分にとっては激烈に難しいことでした。

アイデアを言葉に出すのにテンプレートは使えません。ノウハウなんてタグを貼っていますが、自分の言葉で考えてしゃべるのは __こうしてさえいればできる__ なんてのが通用しないわけです。それこそ、銀の弾丸はない。

意識していても難しい考えるという行為は、 __自分できちんと声にする__ ことで、 __自分が如何にわかっていないかがわかる__ と思いました。

ついでに、わかりやすく話すように心掛けると難易度がさらに上がります。

# 最後に、自戒として
知ってるだけでは分からないのと同じ。考え、行動することで、脳味噌に負荷をかけ続けましょう。