OmniAICreator/Qiita-1.07M huggingface dataset:
KeepalivedからHipChatに通知を行う


DevOpsなみなさん、HipChat使ってますか？
僕は今日使い始めたのですが、こりゃーなかなか便利ですねぇ。

さて、僕が管理している環境ではLinuxのKeepalivedでサーバーの負荷分散をしていて、リアルサーバーのヘルスチェックの結果をメールで受けているのですが、なんかの拍子で大量にメールが来たりしてウザいのが悩みでした。
さっそく代わりにHipChatのメッセージが来るようしてみたいと思います。

## 環境

* CentOS 6.x
* Keepalived 1.2.x

## 下ごしらえ

まず、コマンドラインでHipChatのメッセージを送るため、hipchat_room_messageをダウンロードします。

```
$ curl -o /usr/local/bin/hipchat_room_message https://raw.github.com/hipchat/hipchat-cli/master/hipchat_room_message
$ chmod +x /usr/local/bin/hipchat_room_message 
```

## アプローチ

Keepalivedのヘルスチェックの結果を元にスクリプトを呼び出そうとすると、リアルサーバーの設定ひとつひとつにnotify_up/notify_downを指定しなければならなくなるので、グローバルで設定できる通知メール経由でHipChatにメッセージを送ることにします。

## スクリプト

まず、標準入力からメールのヘッダー部分を読み込みながら、メールのサブジェクトを取り出します。

```
while read LINE
do
    if [[ $LINE =~ ^Subject:\ (.*)$ ]] ; then
        SUBJECT="${BASH_REMATCH[1]}"
    elif [ -z "$LINE" ] ; then
        break
    fi 
done
```

取り出したサブジェクトは以下のような形になっています。

```
[ルーターID] Realserver [サーバー名]:ポート番号 - 状態
```

ここからルーターIDとその他の概要を分離します。

```
[[ $SUBJECT =~ ^\[(.*)\]\ (.*) ]]

ROUTER_ID="${BASH_REMATCH[1]}"
SUMMARY="${BASH_REMATCH[2]}"
```

リアルサーバーの状態を元にメッセージのレベルを変えます。
(HipChatクライアントで表示する際の色が変わり、分かりやすくなります。)

```
if [[ $SUMMARY =~ UP$ ]] ; then
    LEVEL=up
elif [[ $SUMMARY =~ DOWN$ ]] ; then
    LEVEL=down
fi
```

最後に、概要とヘルスチェック結果の詳細を含むメールの本文を連結して、HipChatのメッセージとして送信します。

```
( echo $SUMMARY && echo && cat - ) | /usr/local/bin/hipchat_room_message -n -t $TOKEN -r $ROOM_ID -f "Keepalived($ROUTER_ID)" -m text -l $LEVEL -n
```

できあがったスクリプトは下記のURLにアップロードしました。

https://gist.github.com/tnayuki/9391756

## 設定

メールを受け取って作成したスクリプトを呼び出すエイリアスを追加します。

```/etc/aliases
+ hipchat:        "|/usr/local/bin/hipchat_keepalived_notification"
```

反映を忘れずに。

```
$ newaliases
```

Keepalivedが追加したエイリアス宛に通知メールを送信するように設定を変更します。

```/etc/keepalived/keepalived.conf
  global_defs {
     notification_email {
-      notification@example.com
+      hipchat
     }
     smtp_server localhost 
     smtp_connect_timeout 30
     router_id ROUTER
  }
```

## 結果

来ました！

![HipChat.png](https://qiita-image-store.s3.amazonaws.com/0/38786/22e97de5-801c-39e2-d035-025cff9dcb0f.png "HipChat.png")
１行でtarball（.tar.gz）の圧縮、解凍をする


Solarisのtarコマンドにはgz圧縮、解凍の機能がない。
「-」オプションを利用すれば、１行で実現できる。

## 解凍

```
# gzip -dc hoge.tar.gz | tar xvf -
```

## 圧縮
```
# tar cvf - fuga/ | gzip -c > fuga.tar.gz
Mustache.jsからfunctionを呼び出す

https://github.com/janl/mustache.js のお話です。

## 条件式がかけない

Mustacheはテンプレートエンジンの一つでヒジョーにシンプルです。
しかし、シンプル故に条件分岐でできることが限られています。
```{{#...}} {{/...}}```この構文でIF分岐的なことはできます。 （[こちらを参照](https://github.com/janl/mustache.js#false-values-or-empty-lists)）

```javascript:JS
var attr = {
   data: {
     hoge: "aaa"
     ,fuga: "bbb"
   }
}

var output = Mustache.render($("#template").html() ,attr);
```

```html:テンプレート
<script type="text/template" id="template">
{{#data.hoge}}hogeがaaa{{/data.hoge}}
</script>
```

が、これってdata.hogeにnull,undefined,false,0以外の値が入っていれば真として評価されるだけで、```{{#data.hoge=="aaa"}}```とか```{{#data.hoge.indexOf("a")>-1}}```みたいないわゆる条件式が書けないんですね。

## functionを追加する

こんな時はどうするかというと、objectにfunctionをもたせます。

```javascript:JS
var attr = {
   data: {
     hoge: "aaa"
     ,fuga: "bbb"
     ,hogeIsAAA: function() {
         return this.hoge == "aaa";
      }
   }
}
```

こうすれば、

```html:テンプレート
{{#data.hogeIsAAA}}hogeがaaa{{/data.hogeIsAAA}}
```

こうかけます。

## じゃあ、functionの戻り値をテンプレートにバインドできるのか？

できます。

```html:テンプレート
目の付け所が{{data.hogeIsAAA}}
```

```html:結果
目の付け所がtrue
```

## functionに引数は渡せるの？

```javascript:JS
var attr = {
   data: {
     hoge: "aaa"
     ,fuga: "bbb"
     ,hogeIs: function(expect) {
         return this.hoge == expect;
      }
   }
}
```

```html:テンプレート
目の付け所が{{data.hogeIs("aaa")}}
```

できません。エラーになっちゃいます。

## functionの返り値がobject型だったら？

```javascript:JS
var attr = {
   data: {
     hoge: "aaa"
     ,fuga: "bbb"
     ,getObject: function() {
       return {
         attr1: "value1"
         ,attr2: "value2"
       };
     }
   }
}
```

```html:テンプレート
目の付け所が{{data.getObject.attr1}}
```

ダメです。。。
これができるもんだと思って結構ハマッてしまいました。
アイコン用文字＋フォントを32bitで表現

## 背景
[画像の代わりにフォントを使用](http://qiita.com/tomohisaota/items/14cd6b578140f6eb7735)に書いた通り、僕はベクター画像データとしてフォントを多用しています。フォントを使う場合に厄介なのが、文字(NSString)と、フォント(UIFont)を組み合わせないと適切なアイコンにならないことです。
アイコンは様々な種類を使うので、シンプルにアイコンを定義する方法が欲しくなりました。

## 文字＋フォント＝？
NSString + UIFontのテーブルを作るのはいけてません。。。そこで思いついたのが、Unicodeのコードポイント(32bit)を使う方法です。
基本的に「普通の１文字」は、32bit整数の「１コードポイント」で表現できます。そして、コードポイントは下位21ビットしか使用していないので、使われていない上位ビットにフォント情報を入れることができます。

この方法なら32bit整数で文字＋フォントが表現できるので、普通にenumとしてアイコンが定義できます。
あとは、このenumからNSAttributedStringや、UIImageを生成すれば良い訳です。

下記のように一度enumを定義すれば、あとはこのenumだけで一意にアイコンを決めることが出来ます。

```objc
typedef enum PPIconFontType : uint32_t{
    PPIconFontType_SS_PIKA                      = 1 << 24,
    //フォントも本当は数種類
}PPIconFontType;

typedef enum PPIconCodePoint : uint32_t{
    // SS-PIKA
    PPIconCodePoint_PIKA_CURSOR    = PPIconFontType_SS_PIKA | 0xE001,
    PPIconCodePoint_PIKA_CROSSHAIR = PPIconFontType_SS_PIKA | 0x2316,
    PPIconCodePoint_PIKA_SEARCH    = PPIconFontType_SS_PIKA | 0x1F50E,
    //以下定義が続く...
```

## Unicode Code PointからNSStringへの変換
32bitのコードポイントを16bitのunicharで表現すると１文字か、２文字になります。これは扱いにくいので、僕はNSStringに変換して使用しています。言うまでもないですが、フォント情報はマスクしてから処理する必要があります。

```objc:NSString+BTKUnicode.h
//
//  NSString+BTKUnicode.h
//  BTKCommons
//
//  Created by Tomohisa Ota on 3/5/14.
//
//

#import <Foundation/Foundation.h>

@interface NSString (BTKUnicode)

+ (NSString*) btkStringWithCodePoint : (int32_t) codePoint;

@end
```

```objc:NSString+BTKUnicode.m
//
//  NSString+BTKUnicode.m
//  BTKCommons
//
//  Created by Tomohisa Ota on 3/5/14.
//
//

#import "NSString+BTKUnicode.h"

@implementation NSString (BTKUnicode)

+ (NSString*) btkStringWithCodePoint : (int32_t)codePoint;

{
    unichar characters[2];
    NSUInteger length;
    if (codePoint <= 0xD7FF || (0xE000 <= codePoint && codePoint <= 0xFFFF) ) {
        characters[0] = codePoint;
        length = 1;
    }
    else if (0x10000 <= codePoint && codePoint <= 0x10ffff ) {
        codePoint -= 0x10000;
        characters[0] = 0xD800 + (codePoint >> 10);
        characters[1] = 0xDC00 + (codePoint & 0x3ff);
        length = 2;
    }
    else {
        return nil;
    }
    return [NSString stringWithCharacters:characters length:length];
}

@end
```
ファイル操作関連と注意事項、用語の説明

ファイル操作をする前に、このページをチェック！というものが欲しかったので、書いてみました。

# PHP関数を使ったファイル操作における注意事項

readdirについては、ファイルを再帰的に処理する場合に`.`と`..`を除外する必要がないか確認する必要があります。例えば、ディレクトリを丸ごと削除するような場合に、より深い階層を削除しているつもりが`..`を使って親ディレクトリへ制御が移ってゆき、場合によってはPHPファイルが自滅する場合もあります。。。
※追記：コメント頂いたようなクラス（SPL）を使った方法ではこの点をより安全に処理できるようです。

|関数名|用途|注意点|
|:----|:----|:----|
|[readdir](http://www.php.net/manual/ja/function.readdir.php)|エントリの取得|[opendir()](http://www.php.net/manual/ja/function.opendir.php)後に使用。ファイル名の他に`.`(カレントディレクトリ), `..`(親ディレクトリ)も返す|
|[scandir](http://www.php.net/manual/ja/function.scandir.php)|エントリ一覧の取得|ディレクトリを指定して使用。ファイル名の他に`.`(カレントディレクトリ), `..`(親ディレクトリ)も返す|
|[rmdir](http://www.php.net/manual/ja/function.rmdir.php)|ディレクトリ削除|削除対象のディレクトリが空である必要がある|
|[glob](http://jp2.php.net/manual/ja/function.glob.php)|パスの検索|パターンにマッチするパス名を検索|

他にも扱うファイルの名前が日本語の場合、上手く行かないことがあり、注意が必要との助言を頂きました。

# 使いやすいファイル操作関連関数

|関数名|用途|
|:----|:----|
|[is_dir](http://us3.php.net/manual/ja/function.is-dir.php)|パスがディレクトリであるかどうか調べる|
|[is_file](http://us3.php.net/manual/ja/function.is-file.php)|パスがファイルかどうか調べる|
|[file_exists](http://www.php.net/manual/ja/function.file-exists.php)|パスに **ファイルかディレクトリ** が存在するか調べる|
|[unlink](http://us3.php.net/manual/ja/function.unlink.php)|ファイル削除|
|[copy](http://us3.php.net/manual/ja/function.copy.php)|ファイルコピー|
|[rename](http://us3.php.net/manual/ja/function.rename.php)|ファイルの移動|
|[basename](http://us3.php.net/manual/ja/function.basename.php)|ファイルパスを渡した場合、ファイル名を返す|
|[dirname](http://us3.php.net/manual/ja/function.dirname.php)|ファイルパスを渡した場合、ディレクトリのパスを返す|
|[chmod](http://us3.php.net/manual/ja/function.chmod.php)|アクセス権限の変更(Unixシステム向け？)|
コメント頂いているように、 **クラスを使った方法** も良いみたいです！


# PHPマニュアルの気をつけたい用語

|用語|意味|
|:----|:----|
|エントリ|ファイルやディレクトリーなどを総称してentry(エントリ)と言うらしい|
|$filename|PHPマニュアルで$filenameと書かれている場合、ディレクトリも対象だったりする|
|file|ファイルとディレクトリを総称してfileと呼ぶ事がある|

PHPで使われる言葉はUNIXに関連しているというのがヒントだと思います。

# 関数の使用例（サンプルコード）

別記事にすべきかもしれませんが、量がないのでひとまずここに記載しておきます。

```php
<?php

/**
 * ディレクトリの中身が空か判定
 *
 * @param string $dir_path ディレクトリまでのパス
 * @return bool ディレクトリが空の場合、true
 */
function isEmptyDir($dir_path) {
    return (count(glob($dir_path . "/*")) == 0);
}
```

# クラスを使ってファイルの一覧を取得する (2015/05/19追記)

## 特定ディレクトリ以下のファイルのパス一覧を表示する

```php
$iteratorIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("path/to/directory"));

foreach ($iteratorIterator as $pathName => $file) {
    var_dump($file);
    echo "{$pathName}\n\n";
}
```

## 特定ディレクトリ以下のjpgファイルのパス一覧を表示する

```php
$iteratorIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("path/to/directory"));
$objects = new RegexIterator($iteratorIterator, '/^.+\.jpg$/i', RecursiveRegexIterator::ALL_MATCHES);

foreach ($objects as $pathName => $cur) {
    var_dump($cur);
    echo "{$pathName}\n\n";
}
```

この記事は今後も更新していこうと思います。
RaspberryPi(Raspbian)にoracle jdk7インストール


apt-getでjdkインストール。
例によってopenjdkしかないんでしょと思ったら、oracleのがあるんですね。

```shell-session
# apt-get update
# apt-get install oracle-java7-jdk
```

RaspberryPi用javaFXもあるんですね。なんかOracleさん随分力いれてますね。
そのうち触ってみます。
[Raspberry Pi で JavaFX - かんたん3ステップ](https://blogs.oracle.com/javajp/entry/javafx_on_raspberry_pi_3)

## 参考
[Oracle Java on Raspberry Pi](http://www.raspberrypi.org/archives/4920)
Twitterに共有するIntentの書き方


##やりたいこと
* Twitterに共有する機能を実装する
* そのためだけにTwitter認証したくない
* 普通の共有IntentだとTwitter関連に絞れない

##やり方
Twitterで共有する用のURLを使う

####`https://twitter.com/share?text=[共有したいテキスト]`

```java:sample
String url = "https://twitter.com/share?text=hogehoge"
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
```

このようにするとTwitter共有のリンクに対応するアプリのみ表示される。

簡単！
キッチンシンクの外へ出よう


ntmux (Network Terminal MUltipleXer) を使うと, 端末の入力と TCP クライアントから送られるバイトストリームを結合してコマンドに送ることができる.

ntmux を使うと,

* プログラミング言語 (ruby, python, 私の好きな clojure などなんでも) のインタープリタ
* vi
* shell

などを, 遠隔操作できる.

TCP 通信できる限りにおいてどこからでも, つまり

* vim のバッファ
* emacs のバッファ
* tmux の別ウィンドウ
* 他の端末
* 異なるコンピュータ

などから操作できる.

操作に使うソフトウェアは TCP クライアントの機能さえ持っていれば, なんでもいい.

* vim script
* emacs lisp
* telnet
* nc

その他, どんな TCP クライアントでも.

ソースコードはココ: https://github.com/kohyama/ntmux

あまり網羅的では無いが, 私が普段使っているもの

* MacOS X
* iTerm2
* tcsh
* vim
* clojure

を使い, デモ用のたどたどしい画面キャプチャ動画を撮ったので YouTube に上げておく:
<a href="https://www.youtube.com/watch?v=dKNr3rk58YI">![ss 2014-03-06 21.38.02.png](https://qiita-image-store.s3.amazonaws.com/0/12593/20ebc62f-a085-d708-143b-c49fde705802.png "ss 2014-03-06 21.38.02.png")</a>

現時点では

* 自分の環境でしか動作確認していない
* TCP クライアントがコマンドの出力を利用できない
* vim, emacs から本格的に使うには, vim script やら emacs lisp やらをもう少々書かないといけない

など, 制約だらけではあるが, キッチンシンクから一歩, 外に出れたという実感はある.

ご意見など頂戴できれば幸いである.
Import Jenkins Configuration to a dockerized jenkins

I have been maintaining a lightweight docker [container for
Jenkins](https://index.docker.io/u/aespinosa/jenkins/) recently.
Below is a tutorial on how to migrate using it.

First, create a "data volume".  In the following example, I named this source
"jenkins".  From the subsequent management, I will be referring to this
container.

```
docker run -v /jenkins -name jenkins busybox true
```

We then import our jenkins job by linking the volume to a tar command

```
tar -c jobs/*/config.xml | docker run -a stdin -i --volumes-from jenkins busybox tar -xC /jenkins
```

Now that the Jenkins workspace is pre-populated, the same volume can be referred
to when launching a container.

```
docker run --volumes-from jenkins -d aespinosa/jenkins
```

Originally posted in http://aespinosa.github.io/blog/2014-03-05-import-jenkins-configuration-to-docker.html
[Objective-C] UIViewをいい感じに上下左右センタリングする


いやーレイアウト大変ですね。HTMLのレイアウト能力の高さを実感する毎日です。
本当はAuto Layoutとか使えば解決するんだと思うんですが、現状の案件ではそれが使えないので色々試行錯誤中です。
（なのでこうやったら楽だゼ、ってことを知っていたら教えてください( ;´Д`)）

今回は内包する要素にフィットさせつつ、それを上下左右にセンタリングするのをメモしておきます。

```objc
// ベースのビュー（これをセンタリングする）
UIView *baseView = [[UIView alloc] init];
[baseView addSubview:label];


// アイコンビュー
UIImage image = [UIImage imageNamed:@"hoge"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[baseView addSubview:imageView];


// アイコンのラベル
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(imageView.frame), 0, 0)];
label.text = @"test";
[baseView addSubview:label];
[label sizeToFit]; // テキストにフィットさせる

// アイコン＋テキストの領域を内包するCGRectを生成
baseView.frame  = CGRectUnion(label.frame, imageView.frame);
baseView.center = CGPointMake(self.view.bounds.width / 2, self.view.bounds.height / 2);
imageView.center = CGPointMake(baseView.bounds.width / 2, imageView.bounds.size.height / 2);
```

##ポイント

ポイントは、`CGRectUnion`を使って、内包している要素の領域を結合したCGRectを生成している点です。
これで内包している要素にフィットするようになります。
サイズ変更後、改めて内部の要素をセンタリングして、最終的にアイコン＋テキストをセンタリングしつつ、画面中央にビューを配置する、という手順です。
Windows版JenkinsのVSS認証エラーに対応

VSSのフォルダに認証がかかっている場合
JenkinsのVSSプラグインを使うとエラーになる。
プラグインは諦め、バッチを作り、そこでVSSフォルダに対して認証しておくことで解決

@REM Jenkins実行ユーザがVSSフォルダにアクセスできるように
@REM バッチで認証し、アクセスできるようにする
net use \\domain\VSSフォルダ "password" /USER:"username"

@REM VSSのコマンド
path=%path%;C:\Program Files\Microsoft Visual SourceSafe

@REM VSS接続設定
set SSDIR=\\domain\VSSフォルダ
set SSUSER=vssuser
set SSPWD=vsspassword

@REM VSSのパスを設定
set VSSPROJECT=$/vss/src

@REM ローカルフォルダを設定
set LOCALPATH=C:\hoge\src

@REM ディレクトリを移動
%LOCALPATH:~0,2%
cd %LOCALPATH%
ss.exe Workfold %VSSPROJECT% %LOCALPATH%

@REM ソースを取得 オプションは適宜
ss.exe Get -o- -W- -GWS %VSSPROJECT% -R

exit /b 0
xbuild を使って AWS Elastic Beanstalk で任意のバージョンの Ruby を利用する方法 

カスタムAMIを使わずに .ruby-version を見て、バージョンを切り替える秘伝のタレ的な、.ebextensions を発明した。以下の様な設定ファイルを .ebextensions 配下に作って、デプロイするだけで良い。
とりあえず、2014/3/6 現在はこれで動く。ついでに、Rubyのビルドの高速化とgitからbundle installした場合にPassengerがgemを認識しない問題の修正も入っている。

[xbuild](https://github.com/tagomoris/xbuild) を使っているので、perl、python, php, node, ruby の全てに応用できるはず。t1.micro インスタンスだと起動に30分くらいかかるけど、そこは初回だけなんで我慢しよう。

```
option_settings:
  - namespace: aws:elasticbeanstalk:application:environment
    option_name: NOKOGIRI_USE_SYSTEM_LIBRARIES
    value: yes
  - namespace: aws:elasticbeanstalk:application:environment
    option_name: DEFAULT_RUBY_VERSION
    value: 2.1.0

packages:
  yum:
    git: []

files:
  /opt/elasticbeanstalk/hooks/appdeploy/pre/05_install_ruby.sh:
    mode: "000755"
    user: root
    group: root
    encoding: plain
    content: |
      #!/usr/bin/env bash
      ORG_PATH=$PATH
      . /opt/elasticbeanstalk/support/envvars
      cd $EB_CONFIG_APP_ONDECK
      export RUBY_VERSION=$DEFAULT_RUBY_VERSION
      if [ -f .ruby-version ]; then
        export RUBY_VERSION=`cat .ruby-version`
      fi
      echo "use ruby ${RUBY_VERSION}"
      export RUBY_PATH=/usr/local/bin/ruby-${RUBY_VERSION}
      if [ ! -e $RUBY_PATH/bin/ruby ]; then
        echo "install ruby-${RUBY_VERSION} start"
        CONFIGURE_OPTS='--disable-install-rdoc' /usr/local/bin/xbuild/ruby-install ${RUBY_VERSION} ${RUBY_PATH}
        if [ $? != 0 ]; then
          echo "ERROR: install ruby ${RUBY_VERSION} failed!"
          exit 1
        else
          echo "install ruby ${RUBY_VERSION} succeeded"
        fi
      fi
      ${RUBY_PATH}/bin/gem install bundler --no-ri --no-rdoc
      ${RUBY_PATH}/bin/gem install passenger --no-ri --no-rdoc
      export PATH=${RUBY_PATH}/bin:$ORG_PATH
      echo "export PATH=${PATH}" > /opt/elasticbeanstalk/support/envvars.d/appenv
      true

  /opt/elasticbeanstalk/hooks/appdeploy/pre/10_bundle_install.sh:
    #!/usr/bin/env bash
    . /opt/elasticbeanstalk/support/envvars
    cd $EB_CONFIG_APP_ONDECK
    if [ -f Gemfile ]; then
      echo "running 'bundle install' with Gemfile:"
      cat Gemfile
      bundle install --deployment
      if [ $? != 0 ]; then
        echo "ERROR: bundle install failed!"
        exit 1
      else
        echo "bundle install succeeded"
      fi
    else
      echo "no Gemfile found! Skipping bundle install stage!"
    fi
    if [ -f Gemfile.lock ]; then
      echo "encountered a Gemfile.lock, setting proper permissions"
      chown $EB_CONFIG_APP_USER:$EB_CONFIG_APP_USER Gemfile.lock
    else
      echo "no Gemfile.lock file found, so no permissions to set on it"
    fi
    true

commands:
  01_clone_xbuild:
    command: git clone https://github.com/tagomoris/xbuild.git
    cwd: /usr/local/bin
    ignoreErrors: true

container_commands:
  01_force_restart_passenger:
    command: /etc/init.d/passenger restart
```
keychainとssh-agentを使用しパスフレーズ無しにsshログイン


keychainとssh-agentを組み合わせると、一度ssh秘密鍵のパスフレーズの入力後、パスフレーズの入力無しにsshログインが可能になる。

- ssh-agentは、秘密鍵をキャッシュし、
- keychainは、ssh-agentを管理する。

# 前準備
## sshの秘密鍵・公開鍵の生成

```
$ ssh-keygen -t dsa    # 強力なパスフレーズを入力するべき
```

下記に秘密鍵と公開鍵が生成される。

+ ~/.ssh/id_dsa
+ ~/.ssh/id_dsa.pub

## 生成した公開鍵をログイン先に登録(ssh-copy-idを使用)

手動でログイン先に公開鍵を登録するのはめんどくさいので、ヘルパーコマンド(ssh-copy-id)を使用して公開鍵を登録

```
$ ssh-copy-id -i ~/.ssh/id_dsa.pub remote_host
```


# keychainの設定
~/.bash_profileや~/.zshenvなどのシェルのスタートアップスクリプトに下記設定を記述


``` .zshenv
keychain --nogui --quiet ~/.ssh/id_dsa
source ~/.keychain/$HOST-sh
```

次回のシェル起動時には下記の入力が指示される。
keychainは、デーモン動作するのでssh秘密鍵のパスフレーズの入力は最初のシェル起動時の一回だけですむ。

```
Enter passphrase for /home/your_name/.ssh/id_dsa: [パスフレーズを入力]
```

# パスフレーズ無しにsshログインできなかったときの確認事項

+ ログイン先の~/.ssh/authorized_keys に生成した公開鍵が登録されていることを確認。
+ keychainコマンドを実行し、ssh-agentが動作しているか確認。

# 参考
Gentoo Linux keychainガイド
http://www.gentoo.org/doc/ja/keychain-guide.xml

ssh-agent & keychain の勉強
http://www.hasta-pronto.org/2006/12/10/sshagent-keycha.html
HTMLタグやCSS,DOM要素の組合せの数を計算してみた

# はじめに
　むかし、「HTMLやCSS等の（ウェブページを構成する）主要技術をひとつひとつテストしたら母数はどれぐらいなのかが知りたい」と言われたときに計算した結果です。
簡単に言うと、HTMLタグ × CSS 1要素 × DOM 1要素 の組合せっていくつなの？　ということです。

# 注意点

+ **2010年の頃** に計算した結果です。HTMLなどの仕様は日に日に更新されています。最新の、或いは信頼できる情報は、W3Cなどをご参照ください
 + HTML5 ではなく、HTML4.01 です
+ **因子および水準はあくまで一例です** 。かなり簡略化しています（逆に、簡略化してこの結果です）
+ 本ページに記載している内容について、私は責任を持てません。。。

# 当時の結果
## 　472,587,930

# 計算方法
[HTML4.01] * [CSS2.1] * [DOM Level2] = 1530 * 499 * 619　=　472,587,930

+ [HTML4.01]

 = sum(1つのタグにつき適応できる属性 * 各属性が取り得る値の種類)
 = (Aタグの href が取り得る値の種類 + Aタグの name が取り得る値の種類 + Aタグの...) + (ABBRタグの... + ABBRタグの...) + (ACRONYMタグの... + ...) + ...
 = 1530

※タグは91種類、属性は105種類でしたが、例えば "color"属性は "BASEFONT"タグと "FONT"タグに適応できるので「2つ」とカウント
※今回「各属性が取り得る値の種類」は全て1種類とした
![bsc.png](https://qiita-image-store.s3.amazonaws.com/0/33811/6ed91858-3ab0-e91b-c54a-b8f67d0ce197.png)


+ [CSS2.1]

 = sum(1つのプロパティにつき、取り得る値の種類)
 = 499

※http://www.w3.org/TR/CSS21/propidx.html
※各プロパティが取り得る値の種類は499種類
※ただしBrackets ([ ])によるグルーピング、double bar（||）による複数の値の指定などは考慮していない。
　純粋にbar（|）またはBrackets（[ ]）で区切られたものを１つとカウント

+ [DOM Level2]

 = (DOM 2 Coreのメソッド+属性) + (DOM 2 HTMLのメソッド+属性) + (DOM 2 CSSのメソッド+属性)
 = 94 + 329 + 196 = 619

※http://www.w3.org/TR/DOM-Level-2-Core/idl/dom.idl
※http://www.w3.org/TR/DOM-Level-2-HTML/idl/html2.idl
※http://www.w3.org/TR/DOM-Level-2-Style/idl/stylesheets.idl
※http://www.w3.org/TR/DOM-Level-2-Style/idl/css.idl
※計算方法
　計算規則を作成し、機械的に算出。計算規則は割愛

# 結論
## 　むり。
動的な要素を含んでいない、静的な要素だけでこのオーダーのレベルになってしまう。
そもそも、CSS も DOM も取りうる値を 1要素ずつ取り出しているだけ。
ほんの少し計算方法を変更するだけで、簡単に発散してしまう。
Play2のテンプレートエンジン内でちょっとした変数を定義する

本来はAction側で定義するべきだとは思うが、ホントにちょっとした変数を定義して
使いたい場合。
例えば設定ファイルから値を読み込んで使いたい場合は、

```scala
@(id:Int)

@import com.typesafe.config.ConfigFactory; val hoge = ConfigFactory.load().getString("hogege")

<span>@hoge</span>
```

的な感じでイケるらしい。
aws cli導入メモ

#Ubuntu
pipでインストール
```bash
sudo apt-get install -y python-pip
sudo pip install awscli
sudo pip install --upgrade awscli
complete -C aws_completer aws
aws --version
```

#CentOS6.x
python設定後、pipでインストール
```bash
sudo yum -y install python python-devel --enablerepo=epel
sudo yum -y install python-setuptools
sudo easy_install pip
sudo pip install awscli
sudo pip install --upgrade awscli
complete -C aws_completer aws
aws --version
```

#CentOS5.x
epelレポジトリ追加、python26インストール
```bash
wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -ivh epel-release-5-4.noarch.rpm
sudo yum install python26
python26 --version
```bash

awscli（バンドル版）インストール
```bash
wget https://s3.amazonaws.com/aws-cli/awscli-bundle.zip
unzip awscli-bundle.zip
cd awscli-bundle
cat install > install.old
cat install.old | sed 's/#!\/usr\/bin\/env python/#!\/usr\/bin\/env python26/g' > install
diff install.old install
./install -i /usr/local/aws -b /usr/local/bin/aws
complete -C aws_completer aws
aws --version
```
aws-cliでdescribe-instances


#EC2インスタンス情報取得
```bash
aws ec2 describe-instances 
```

#タグ名でフィルタリング：relで前方一致
```bash
aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=rel*" 
```

#テーブル形式
```bash
aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=rel*" \
  --output table
```

#特定項目をテキスト出力：インスタンスIDとグローバルIP
```bash
aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=rel*" \
  --query "Reservations[*].Instances[*].[InstanceId,PublicIpAddress]"  \
  --output table
```

jq版
```
aws ec2 describe-instances | jq ".Reservations[].Instances[]" \
 | jq ". | select(.Tags[].Key==\"Name\") | select(.Tags[].Value|contains(\"rel\"))" \
 | jq --raw-output '"\(.InstanceId) \(.PublicIpAddress)"'
```
MacにPear, PHPUnitをインストールする


phpunitコマンドを叩いても「requireできないぜ！」ってエラーが消えなくてハマった。

```
PHP Warning:  require_once(PHPUnit/Autoload.php): failed to open stream: No such file or directory in /vagrant/public/local.dev/BFB_tool/cup_result/tests/CalculatorTest.php on line 2
```

調べてみるとPHPUnit自体はMacにインストールされているがPearはインストールされていなかった。
あと、ファイルの最初にPHPUnitをrequireしなくてよかった。

## MacにPearをインストールする

```
$ cd /tmp && mkdir pear && cd pear
$ curl -O http://pear.php.net/go-pear.phar
$ sudo php -d detect_unicode=0 go-pear.phar

#最後にphp.iniに設定書く？って文言が出るので「Y」
# Would you like to alter php.ini </private/etc/php.ini>? [Y/n] : Y
```

## MacにPHPUnitをインストールする

```
$ sudo pear channel-discover pear.phpunit.de
$ sudo pear channel-discover components.ez.no
$ sudo pear channel-discover pear.symfony-project.com
$ sudo pear install phpunit/PHPUnit
```

##参考
[[Mac] PEAR と PHPUnit のインストール方法 ](http://codenote.net/mac/1480.html)
IBM の BlueMix で golang

BlueMix は cloudfoundry 互換なので cf コマンドで操作する。

# cf をインストール

    gem install cf

# target を設定

    $ cf target https://api.ng.bluemix.net
    Setting target to https://api.ng.bluemix.net... OK

# ログイン

    $ cf login
    target: https://api.ng.bluemix.net
    
    Email> メールアドレス
    Password> ************
    Authenticating... OK

# go のコードを書く

簡単なやつ

```go
package main

import (
	"net/http"
	"os"
)

func main() {
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
	}
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello World"))
	})
	http.ListenAndServe(":"+port, nil)
}
```

# .godir を作る

    $ echo server > .godir

# Procfile を作る

    $ echo "web: server" > Procfile

# ビルドパックを指定して push する

    $ cf push --name mattn --buildpack https://github.com/michaljemala/cloudfoundry-buildpack-go.git
    Instances> 1
    
    1: 128M
    2: 256M
    3: 512M
    4: 1G
    Memory Limit> 256M
    
    Creating mattn... OK
    
    1: mattn
    2: none
    Subdomain> mattn
    
    1: ng.bluemix.net
    2: none
    Domain> ng.bluemix.net
    
    Creating route mattn.ng.bluemix.net... OK
    Binding mattn.ng.bluemix.net to mattn... OK
    Preparing to start mattn... OK
    Checking status of app 'mattn'...
      1 of 1 instances running (1 running)
    Push successful! App 'mattn' available at mattn.ng.bluemix.net

ソースは[ここ](https://github.com/mattn/mattn.ng.bluemix.net)に置いておきます。
MongoEngineでデータベースを切り替える


Django + MongoEngineで、MongoDBのデータベースを切り替えるメモ。

MongoDBの接続先を分ける場合、settings内の`connect()`に引数`alias`に値を渡して別名をつける。

```python:settings.py
from mongoengine import connect
connect("someproject", host="127.0.0.1:27017")
connect("someproject-log", host="127.0.0.1:27017", alias="log-db")  # ログ用データベース
```

ドキュメントクラス定義の`meta`に`db_alias`を記述する。

```python:documents.py
class AccessLogDocument(Document):
    time = DateTimeField()
    uri = StringField()
    status = IntField()
    reqtime = FloatField()
    upsttime = FloatField()

    meta = {
        "db_alias": "log-db",
    }
```
Push通知からアプリを開く


```java:GCMIntentService.java
	@Override
	protected void onMessage(Context context, Intent intent) {
		String ticker = intent.getStringExtra("ticker");
		String title = intent.getStringExtra("title");
		String message = intent.getStringExtra("message");

		// プロセスがあればそのまま復帰、なければ起動画面から開始する
		Intent ni = new Intent(Intent.ACTION_MAIN);
		ni.addCategory(Intent.CATEGORY_LAUNCHER);
		ni.setClassName(getApplicationContext().getPackageName(), SplashActivity.class.getName());
		ni.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);
		PendingIntent pi = PendingIntent.getActivity(context, 0, ni, PendingIntent.FLAG_CANCEL_CURRENT);

		// 通知を開いたときに表示されるアイコン
		NotificationCompat.Builder builder = new Builder(context);
		builder.setTicker(ticker); // ステータスバーに表示されるテキスト
		builder.setContentTitle(title); // 通知を開いたときに表示されるタイトル
		builder.setContentText(message);// 通知を開いたときに表示されるメッセージ
		builder.setSmallIcon(R.drawable.ic_launcher); // ステータスバーに表示されるアイコン設定
		builder.setAutoCancel(true); // 通知をクリックした時に自動的に通知を消すように設定
		builder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS);
		builder.setContentIntent(pi); // 通知が選択された時に起動するIntentを設定
		Notification notification = builder.build();
		NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
		manager.notify(0, notification);
	}
```
railsとmongoとmecab 環境構築編

rubyとrailsから、入力フォームに検索文字を入力し、
検索文字をmecabを使って、形態素解析を行い、名詞だけ抽出してmongoに検索をかけにいく
サンプルを作ってみた。

今回は環境構築編。

参考にした記事を貼付けておきます。


##まずは、rbenv ruby rails インストール。
※複数のバージョンを考慮してrbenvもインストール。


下記を参考にさせてもらいました。
・http://qiita.com/checkpoint/items/f8e65380d9cb0182218d
・http://qiita.com/pakiln/items/661a8a1c3ee13d9dbca3


##mecabのインストール
下記を参考にさせてもらいました。
・http://www.waseda-nishimura.jp/~kanzaki/diary/2012/07/03/mecab-ruby%E3%81%A7%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/
・http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html#install


インストール手順
```
 % tar zxfv mecab-X.X.tar.gz
 % cd mecab-X.X
 % ./configure --with-charset=utf8
 % make
 % make check
 % su
 # make install
```

辞書のインストール

```
% tar zxfv mecab-ipadic-2.7.0-XXXX.tar.gz
% mecab-ipadic-2.7.0-XXXX
% ./configure --with-charset=utf8
% make
% su
# make install
```

rubyとmecabを連携するためにSWIGが必要となるので、下記のURLからDLします。
・http://www.swig.org/download.html

```
tar -xvzof swig-2.0.1.tar.gz
cd swig-2.0.1
./configure
make
sudo make install
```

次にmecab-rubyのインストールです。
これはファイルを解凍するとこまでいったら
```
$ cd mecab-ruby-0.994
$ ruby extconf.rb
$ make
$ ruby test.rb
$ sudo make install
```

##mongoインストール
下記を参考にさせてもらいました。

```
$ brew install mongodb
```

これで、簡単ですが、環境構築は終了！

たぶん。
git pull --rebaseを使ってみた

ローカルブランチで開発して、むやみにマージコミットを作りたくないので毎回rebase -> mergeとやってた
毎回やるの面倒だなーと思ってたそんなとき、git pull --rebaseを見つけたんだっていうメモ
pullした時の挙動が fetch -> mergeから fetch -> rebaseになるらしい

いつもだとこうやってた
(git stash save / popを使えばもう少し短くはなる・・・かな)

```
(my-topic)$ git commit -am "my commit"
(my-topic)$ git checkout master
(master)$ git pull
(master)$ git checkout my-topic
(my-topic)$ git rebase master
(my-topic)$ git checkout master
(master)$ git merge my-topic
(master)$ git push origin master
```

git pull --rebase使うとこんな感じ

```
(my-topic)$ git commit -am "my commit"
(my-topic)$ git checkout master
(master)$ git merge my-topic
(master)$ git pull --rebase
(master)$ git push origin master
```
iBeacon 勉強会（入門編）の事前準備情報

下記イベント参加者向け告知です。
http://connpass.com/event/5274/

勉強会後半の体験コーナーで使いますので、

* Estimoteのアプリをインストールしておいてください
	* https://itunes.apple.com/jp/app/id686915066

* 自分でビルドできる環境がある方は下記アプリをビルドしておいてください
	* https://github.com/reinforce-lab/iBeaconMonitor
	* https://github.com/calmscape/iBeaconInfo
	* https://github.com/calmscape/iBeaconNotifier

できる方だけで大丈夫です。
なくても勉強会自体は楽しんでもらえると思います。
会議室リソースがコンフリクトするとどうなるか？メモ

## Q. 同じ時間帯で既に使用されているカレンダーリソースを、予定に追加できるか？

A. Calendarのイベント追加UI上は、カレンダーリソース一覧に一瞬表示されるが、すぐ消えて選択できなくなる。おっさんの反応速度ではどんなに急いでも追加できなかった。
もちろん、時刻をかぶらないようにずらすと、リアルタイムにカレンダーリソース一覧の選択候補として現れる。

## Q.同じカレンダーリソースを使用している、既存の別時間帯の予定を作ってから時刻をずらすとどうなる？

A. 問題なくそのまま保存できるが、予定編集画面上はカレンダーリソースに禁止マークがついた状態になり、一覧画面ではattendeeの該当カレンダーリソースに取り消し線が入る。取り消されるのは、後から作った方の予定で、先に作った予定でのリソース仕様は無効化されない。

![編集画面での表示](https://qiita-image-store.s3.amazonaws.com/0/1387/a6f2f0b8-6249-a549-6bcf-ab971ce4de7e.png)

![予定一覧画面での表示](https://qiita-image-store.s3.amazonaws.com/0/1387/e9b13002-4563-87eb-f0ab-08b133ac8ec6.png)

## Q. データ上はコンフリクトした状態になっているの？

A. なっていない。

- 時刻をずらすなどして無理やり同じカレンダーリソースを同じ時間内で選択して保存した場合、上述したように、後からコンフリクトさせた側の予定のカレンダーリソースの状態が変化する。このタイミングで、予定の作成者に対して、 `Declined: test2 @ Sat Mar 15, 2014 11am - 12pm (会議室A)` という、招待者からの拒否のようなメールが届く。

- またAPI経由で該当の予定データを見ると、`attendees`エントリ`responseStatus`の値として、予定の招待を拒否した場合と同じ値（declined）が入る。

![Screen Shot 2014-03-06 at 4.19.41 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1387/96711e9e-9a6f-a7f6-6e38-45e2cbef1e5b.png)
bashの数字

bash等で文字列から切り出した数字を演算して他の数字を作るときの注意

 **数字として扱うときに頭に0が付いているときは8進数を意味する!** 

このことすっかり忘れてて大量にJob流した後エラーを捨ててて後になって気がついた
どっかに書いておかないと忘れちゃう(´･ω･`)..ので書いておくw

ダメなケース

```bash
A="08"
B="01"
printf "%02d" $(($A + $B))
bash: 08: value too great for base (error token is "08")
```

そりゃ8進数で8ってあかんよね
というわけ10進数で扱いたいのでこう直す。 

```bash
printf "%02d" $((10#$A + 10#$B))
09
```

別の変数に代入するときは、

```bash
C=$(builtin printf "%02d" $((10#$A + 10#$B)))
echo ”$C”
”09”
```

[ジブンのBlog](http://highfrontier.ldblog.jp/archives/52263109.html "As mind is suitable...:bashの数字")に書いていたのだけど時々忘れて探すのが大変なのでこちらに。
"pod install"時のエラー（[!] The `master` repo requires CocoaPods 0.29.0 -）の対処法

タイトル通りです。
あまり仕組みが分かっていないので、上手くいった対処だけ記述します。

#状況

"pod install"時に以下のエラーが出ました。
[!] The `master` repo requires CocoaPods 0.29.0 -

#理由
どうやらCocoaPodsのバージョンが古いようです。

#解決策
"sudo gem install cocoapods"でアップデート

その後"pod install"コマンドを実行し、処理が始まると、
rake's executable "rake" conflicts with /usr/bin/rake
Overwrite the executable? [yN]  
という質問が出て、処理が止まりました。
以下のサイトを参考に、
https://github.com/CocoaPods/CocoaPods/issues/1564
y（つまりyes）を入力し、処理を継続しました。

それ以外特に止まった箇所等はなく、上手くいきました。

ほぼ解説無しの不親切な投稿になりますが、参考になれば幸いです。
<a href="#top">がHTML5で正式仕様になってた件

これなんだけども:

* [HTML - &lt;a href="#top"&gt;Top of the Page&lt;/a&gt;は該当するフラグメント（&lt;div id="top"&gt;や&lt;a name="name"&gt;）がなくても仕様的に正しい - Qiita](http://qiita.com/FiNGAHOLiC/items/aceb6b8c35ceb080b857)
    * [文書の先頭へのリンク · terkel.jp](http://terkel.jp/archives/2014/03/top-of-the-document/)

仕様についてあんまり書いてなかったので自分で読んでみたまとめ書く。

**`href="#top"`を指定すると自動的にページの先頭へのリンクになる** ……というブラウザーの独自仕様があったわけなんだけども、これが正式に仕様として明記されたとの事。

MDNの説明が一発で分かる。

* [a 要素 - HTML | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/a#attr-href)

> ### href
> これは、ハイパーリンクのソースを定義するアンカー要素で唯一必須の属性です。（中略）
>
> 補足: 特別なフラグメントである "top" を使用すると、ページの最上部に戻るリンクを作成できます。例: `<a href="#top">ページ上部へ戻る</a>`。[この動作は HTML5 で明記されました。](http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#scroll-to-fragid)

じゃあってんでリンク先を見てみると、ちょい先に書いてあった。

* 6.5 Session history and navigation — HTML Standard
  * [6.6.9 Navigating to a fragment identifier](http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#scroll-to-fragid) ※将来的にこのページのURLが変更になってるかもしれない

> ### 6.6.9 Navigating to a fragment identifier
>
> (snip)
>
> [The indicated part of the document](http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#the-indicated-part-of-the-document) is the one that the fragment identifier, if any, identifies.
> 
> (snip)
> 
> - 7. If fragid is an ASCII case-insensitive match for the string `top`, then the indicated part of the document is the top of the document; stop the algorithm here.

つまり`href="#xxx"`の`xxx`をfragidと呼ぶとして、 **「fragidが`top`と完全一致する場合、ページ内リンクの指示先はドキュメントの先頭とする」** という事らしい。

へえー。

※普通に飛び先の`#top`があればそっちに行きます。

> - 5. If there is an element in the DOM that has an ID exactly equal to decoded fragid, then the first such element in tree order is the indicated part of the document
Scala: 2つのリストから組み合わせを計算する


(a, b, c), (1, 2, 3)のような2つのリストを掛けあわせた組み合わせを計算する方法。

3 × 3 なので 9 とおりになるはず。

Scalaでは `for` と `yield` を組み合わせることで、簡単に計算できる。


```scala
val list1 = List("a", "b", "c")
val list2 = List("1", "2", "3")

val combination = for (v1 <- list1; v2 <- list2) yield (v1, v2)

//> combination: List[(String, String)] = List((a,1), (a,2), (a,3), (b,1), (b,2), (b,3), (c,1), (c,2), (c,3))
```

3次元の組み合わせも簡単

```scala
val list1 = List("a", "b", "c")
val list2 = List("1", "2", "3")
val list3 = List("X", "Y", "Z")

val combination = for(v1 <- list1; v2 <- list2; v3 <- list3) yield(v1, v2, v3)

println(combination.length) // 27通り
```
CSS の font-family で明朝指定


**Qiita 上では *sytle* タグが入れられないようなので URL末尾に `.md` を付加して手元の Markdown プレビュアーで確認することにする**

[CSSでキレイな日本語フォントの明朝とゴシック | Ri-mode Memo](http://ri-mode.com/memo/2013/11/08/japanese_font_family/)
 を参考にさせて頂いた。

分かりやすくするため、フォントサイズを `2.4rem` ぐらいで。

```css
.font-size-big {
	font-size: 2.4rem;
}

.mincho {
	font-family: "ヒラギノ明朝 ProN W6", "HiraMinProN-W6", "HG明朝E", "ＭＳ Ｐ明朝", "MS PMincho", "MS 明朝", serif;
	font-size: 2.4rem;
}

.bold {
	font-weight: bold;
}
.italic {
	font-style: italic;
}
```

<style>
.font-size-big {
	font-size: 2.4rem;
}
.mincho {
	font-family: "ヒラギノ明朝 ProN W6", "HiraMinProN-W6", "HG明朝E", "ＭＳ Ｐ明朝", "MS PMincho", "MS 明朝", serif;
}
.mincho-normal {
	font-family: "ヒラギノ明朝 ProN W3", "HiraMinProN-W3", "HG明朝E", "ＭＳ Ｐ明朝", "MS PMincho", "MS 明朝", serif;
}
.bold {
	font-weight: bold;
}
.italic {
	font-style: italic;
}

</style>


## .mincho ##

```html
<p class="font-size-big mincho">
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
</p>
```

<p class="font-size-big mincho">
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
</p>


## .mincho.bold ##

```html
<p class="font-size-big mincho bold">
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
</p>
```

<p class="font-size-big mincho bold">
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
</p>


* Mac 環境ではボールド指定しても効かない
* `ヒラギノ明朝 ProN W6` に太字フォントが無い？


## .mincho.italic ##

```html
<p class="font-size-big mincho italic">
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
</p>
```

<p class="font-size-big mincho italic">
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
</p>


## .mincho.bold.italic ##

```html
<p class="font-size-big mincho bold italic">
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
</p>
```

<p class="font-size-big mincho bold italic">
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
</p>

* イタリックすると、ボールドとノーマルの区別が付くようになってる
* 斜体があるフォントにスイッチしてこうなるのか？


## "ヒラギノ明朝 ProN W3", "HiraMinProN-W3" を使ってみる ##

```css
.mincho-normal {
	font-family: "ヒラギノ明朝 ProN W3", "HiraMinProN-W3", "HG明朝E", "ＭＳ Ｐ明朝", "MS PMincho", "MS 明朝", serif;
}
```

```html
<p class="font-size-big mincho-normal">
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
</p>
```

<p class="font-size-big mincho-normal">
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
</p>

### `ヒラギノ明朝 ProN W3` の方にボールド指定してみる ###

```html
<p class="font-size-big mincho-normal bold">
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
</p>
```

<p class="font-size-big mincho-normal bold">
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
</p>

* ボールドになった。


## 結論 ##

本来どうあるべきかはちゃんと調べてないので…アレですが…
`ヒラギノ明朝 ProN W6` が通常の状態でボールドであるなら、
使い勝手を考えると `ヒラギノ明朝 ProN W3` を指定したほうが
コントロールが効かせやすいような気がしました。
おわり。
console.log once

requestAnimationFrameなどで大量にループを実行させる時、初回のみconsole.logを実行したい場合がある。
そんな時は下記のように記述すればよい。

```js:JavaScript
(function frame() {
  !opener++ && console.log("log this once");
  requestAnimationFrame(frame);
})();
```

[Shorthand Javascript Console Log Once](http://forrst.com/posts/Shorthand_Javascript_Console_Log_Once-Jta)
NeoBundleのインストール


```bash
$ mkdir -p ~/.vim/bundle
$ git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

$ vim ~/.vimrc
set nocompatible
filetype off 

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim

  call neobundle#rc(expand('~/.vim/bundle'))
endif

#NeoBundle 'tpope/vim-surround'
#ここに行を追加していってプラグイン管理します。

filetype plugin on
filetype indent on
```

プラグインのインストールは`:NeoBundleInstall`、アンインストールは`:NeoBundleClean`です。

公式ページは [ここ](http://vim-users.jp/2011/10/hack238/) で良いんですかね？ ← 少し古いサイトなので注意したほうが良い旨のコメントをいただきました。ありがとうございます！
[GitHubのリポジトリ](https://github.com/Shougo/neobundle.vim)を見るのが確実ですね

[shoma2daをフォロー](https://twitter.com/intent/user?screen_name=shoma2da)
Jenkinsであるはずのジョブが表示されなくなったらやってみること

# こんなときに使えました
* Jenkinsのジョブがあるときを境にビューにも表示されなくなってしまった
* ジョブへのリンクを直接叩いても404
* ただ、マスター側の/var/lib/jenkins/jobsには存在している

# 対応
* [Jenkinsの管理] -> [設定の再読み込み]を実行するだけ

# 補足
* [ここに書いてある記事](http://www.zero4racer.com/blog/958)によればjenkins自体のアップグレード時に起こったらしい
* 私の環境ではアップグレードはしていないので、おそらくどれかのプラグインのインストールが関係しているのかもしれない

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Homebrewでサクッとpatchを当てる

Ambiguous Widthな文字の設定をしているiTerm2で、tmux-powerlineのステータスバーがおかしくなる現象が起きました。→ <http://qiita.com/macoshita/items/f7e0f5eda02f45736b52>

tmuxに[こちらのパッチ](https://gist.github.com/waltarix/1399751)を当てれば直る！　とのことで、こりゃありがたいとパッチを当てようとしてたら、「そういえばbrewだと簡単にpatchを当てられそうだったな」と思い出し、やってみました。

## 方法1: 直接いじる（簡単ではあるけど微妙）

`brew edit tmux`と叩いて下記の行を追加

```
def patches
    [
      "https://gist.githubusercontent.com/waltarix/1399751/raw/8c5f0018c901f151d39680ef85de6d22649b687a/tmux-ambiguous-width-cjk.patch",
      "https://gist.githubusercontent.com/waltarix/1399751/raw/dc11f40266d9371e730eff41c64a70c84d34484a/tmux-pane-border-ascii.patch"
    ]
  end
```

## 方法2: githubにリポジトリを作成

<https://github.com/macoshita/homebrew-custom>

上記のようなリポジトリを作ると、`brew tap macoshita/custom`でこのリポジトリ上にあるFormulaを使えるようになります。

あとは、本家のFormulaをコピペして上記のpatch部分を追記して、`brew install tmux-patched`でpatchを当てたものをインストールできます。

## どっち？

- 方法1はなんとなく気持ち悪いですね。ただ、本家のFormulaの更新を競合が発生しない限りは取り込みやすいのかな。
- 方法2はスッキリしてます。けど本家のFormulaの更新は自分が取り込む必要があります。私は他にもカスタムするものが出てきそうだと思ったのでこちら。

あ、上記のmacoshita/homebrew-customを使って頂いても構いませんが、予告なく変更とかするのでフォークしたりしたほうがよいと思います。
iOSの環境変数(Configuration, Build Settings, Plist)で知っておくべきこと


### Project > Info > Configuration 

* アプリ環境の使い分けを書く
* 例) DebugとかReleaseとかQA(Quality Assurance)

![スクリーンショット 2014-03-06 13.15.42.png](https://qiita-image-store.s3.amazonaws.com/0/4585/2f6c6adf-5613-8a34-3663-9d41927baa5c.png "スクリーンショット 2014-03-06 13.15.42.png")


### Project > Build Settings > Apple LLVM 5.0 - Preprocessing
* Preprocessor MacrosにそれぞれのConfigurationごとに定数を設定できる
* 例) Debugの項目にDEBUG=1、QAの項目にQA=1を入れる
* アプリの中では以下のように使う。(例でTestFlightをQAのときのみ読み込む)

```
#ifdef QA
    #import "TestFlight.h"
#endif
```

![スクリーンショット 2014-03-06 13.15.32.png](https://qiita-image-store.s3.amazonaws.com/0/4585/913672d7-2fe1-9578-36de-5695ecee08dc.png "スクリーンショット 2014-03-06 13.15.32.png")

### Target > Build Settings > User-Defined
* user定義の変数を書ける。configuretionごとに分けるときによい
* 例) API_URL, FACEBOOK_APP_IDなど
* build時にAPIのリンクを変えるのも便利。 http://powerful-code.com/blog/2013/11/script-for-debugging/

![スクリーンショット 2014-03-06 14.31.54.png](https://qiita-image-store.s3.amazonaws.com/0/4585/430be6b6-921b-49dd-2a1a-8839bf855178.png "スクリーンショット 2014-03-06 14.31.54.png")

### Supporting Files > Info.plist
* user定義から定数を作るときなどに使う

![スクリーンショット 2014-03-06 14.40.38.png](https://qiita-image-store.s3.amazonaws.com/0/4585/260ecf86-85ef-7cac-50c8-fb0b4eb1fcdd.png "スクリーンショット 2014-03-06 14.40.38.png")
pythonの正規表現における先頭・末尾マッチ

こんなエントリーを見ました。

[正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう](http://blog.tokumaru.org/2014/03/z.html)

へー、知らなかったなー、pythonではどうなんだろうなー、と思って試してみたメモ。バージョンは3.3。

## \z（小文字）ではなく\Z（大文字）
Rubyと同じように\zを指定してみたら思うように動かなかったのでなんでだろー、と思ってドキュメント見たら\Zでした。

```python
>>> import re
>>> re.match('\Aabc\Z', 'abc')
<_sre.SRE_Match object at 0x7f12f3d371d0>
>>> re.match('\Aabc\Z', 'abc\ndef')
>>>
```

ちなみにRubyでは\Zと\zは分かれている模様。\Zは末尾の改行を無視して判定するみたい。

## デフォルトは複数行モードではない
Rubyはデフォルトで複数行モードになっているから罠になるよ、という話でしたがpythonはそうではなかったので安心です。`re.MULTILINE`オプションをつけると複数行モードになります。

```python
>>> re.match('^abc$', 'abc\ndef')
>>>
>>> re.match('^abc$', 'abc\ndef', re.MULTILINE)
<_sre.SRE_Match object at 0x7f12f3d37168>
```


## 末尾の改行の扱い
複数行モードでなくとも$は末尾の改行を無視してマッチするので注意が必要ですね。\Zは末尾の改行は無視しません。

```python
>>> re.match('^abc$', 'abc\n')
<_sre.SRE_Match object at 0x7f12f3d371d0>
>>> re.match('\Aabc\Z', 'abc\n')
>>>
```

## javascriptでは・・・
どうなんだろうと思って調べてみましたがどうやら\Aや\zはない模様。（ちょこっと調べただけなので本当はあるのも。）
Angular vs Backbone


# ざっくり印象
- BackboneはJSでMVCアーキテクチャするための必要最低限だけサポート。Angularはフルスタック。
- まずBackboneを押さえて、それからAngularを覗いてみるというのがオススメの模様。
- Backboneの方が薄く、拡張の自由度高い。その代償として大人数では一定のアーキテクチャを縛るルール／構造を作らないと破綻するリスクあり。
    - テストは他のテスティングフレームワークをカスタムで組み合わせて使う必要あり。
    - Railsからの連携サポートは厚い。
- Angularは仕様が膨大だが、ハマる処理はとんでもなくシンプルに書ける。ただし、少し外れたことをしようとすると膨大な仕様の山を漁ることにはなる。フレームワークの縛りが大きく、人が違ってもかなりの程度、作りは統一される。
    - チュートリアルは、実は単純化されすぎていて、実際のアプリではもう少しいろいろ構造化等を施さないといけないらしい。
    - テスティングフレームワークがばっちり用意されている。Unitもe2eもOK。e2eまで用意されてるっていうのがすごく魅力的。UnitはKarmaでJasmineかけてファイル更新毎にすぐUnitTest実行、e2eはGruntでProtractor(Selenium WebdriverJSベース）回してテストケースのアサーションはJasmineで書くとか、萌えすぎる。
    - jQueryとの併用が推奨されない・・・？
    - 部品化機構が強力。
    - ちょっと見ただけではよくわからない概念が多くて、初期学習コスト高そう。
    - オープンな部品がたまって、日本語リソースも豊富になった頃のほうが手を出し時か？

# Articles
- [Backbone.js + Marionette.js / Angular.js 編 in 「Rails勉強会@東京 第88回」 - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/backbone-marionette-angular-js/)
    - ざっくり設計思想や適用範囲を整理してくれる良スライドへのリンク満載
- [BackboneとAngularを比較する](http://www.infoq.com/jp/articles/backbone-vs-angular)
    - ポイントをとても簡潔に説明してくれているっぽいのだが、たぶんそれぞれのチュートリアルをひと通り触るとか、ある程度は具体的なレベルでの理解を深めないと内容についていけない。また戻ってきたい。

- [Angular.jsとBackbone.jsのDOM依存を図解する - ジンジャー研究室](http://jinjor-labo.hatenablog.com/entry/2013/06/19/062931)
    - 基本アーキテクチャ構造の違いから、設計思想の違いが見れる

- [Protractor: AngularJSの次世代E2Eテストフレームワーク - Qiita](http://qiita.com/zoetro/items/b72130960c39055b8474)
- Angular以外でも使えないのかなコレ。本家WebDriverJSは公式ドキュメントわけわけめで泣きたい。
Picklesが動かないときのチェック項目

Pickles設置後、ブラウザから閲覧できなかった場合のチェック項目。

# apacheのVirtualHost設定


```httpd.conf
<VirtualHost _default_:0000>
 DocumentRoot "{$path}"
 ErrorLog logs/error.log
 CustomLog logs/access.log common
	<Directory "{$path}">
		Options Indexes MultiViews ExecCGI Includes
		AllowOverride All  ←★これがAllになっていないとだめ
		Order allow,deny
		Allow from all
	</Directory>
</VirtualHost>
```


# Pickles htdocs配下の .htaccess

Pickles前バージョンと .htaccessの内容を比較したところ
どうやらオプション設定に「FollowSymLinks」の設定のあるなしが影響している可能性あり。
このシンボリックリンク設定を記載すると問題なく閲覧できる。
FollowSymLinks設定がどう影響しているのかは要調査。

```.htaccess
Options -MultiViews +FollowSymLinks
```

<br><br>
- - -
![pickles.png](https://qiita-image-store.s3.amazonaws.com/0/39060/dee254d2-bc1a-f846-052d-f0c885b10ded.png)　[Picklesについてはこちら](http://pickles.pxt.jp/)
TypeScriptでSingletonパターンを実装する

TypeScriptでSingletonパターンを実装するメモです。
個人的にどの言語でもよく利用する構文です。

```js
class Singleton {
    private static _instance:Singleton = null;
    constructor() {
        if(Singleton._instance){
            throw new Error("must use the getInstance.");
        }
        Singleton._instance = this;
    }
    public static getInstance():Singleton {
        if(Singleton._instance === null) {
            Singleton._instance = new Singleton();
        }
        return Singleton._instance;
    }
}
```

インスタンス生成はstaticにgetInstanceで。

```js
var singleton=Singleton.getInstance();
```


もっと良い方法や指摘があれば是非教えて欲しいです。
[備忘録]nginxでデバッグ出力



log_formatを定義している所に、以下のように、debug_log_fmtを追加

```
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format debug_log_fmt "[DEBUG][$time_local] $dbg_v";
```

デバッグ出力したい所で、$dbg_vに値をセットし、access_logで指定パスに書き込む

```
         set $dbg_v "hoge hoge hoge...";
         access_log /var/log/nginx/debug.log debug_log_fmt;
```

すると、/var/log/nginx/debug.logに以下のように出力する。

```
[DEBUG][06/Mar/2014:12:30:16 +0900] hoge hoge hoge...
```
<a href="#top">Top of the Page</a>は該当するフラグメント（<div id="top">や<a name="name">）がなくても仕様的に正しい

知らなかった。。。

http://terkel.jp/archives/2014/03/top-of-the-document/
https://developer.mozilla.org/ja/docs/Web/HTML/Element/a#attr-href
Scala: 失敗したテストだけにしぼってテストを実行する


「前回コケたテストだけ再実行したい!」そんなときは `test-quick ` を使うと便利。このコマンドは、前回 fail で終わったテストだけを再実行してくれる。

```
sbt
> test

(すべてのテストが実行される)

[info] Run completed in 4 seconds, 920 milliseconds.
[info] Total number of tests run: 2
[info] Suites: completed 2, aborted 0
[info] Tests: succeeded 1, failed 1, canceled 0, ignored 0, pending 0

> test-quick

(コケたテストだけが実行される)

[info] Run completed in 3 seconds, 662 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 0, failed 1, canceled 0, ignored 0, pending 0


```

「Total number of tests」と実行時間に着目してほしい。実行したテストの数が減っているのと、実行時間が短縮できているのがわかる。
Scalatest: 特定のテストケースだけ実行したい


## 特定のテストクラスだけを実行する

`testOnly`コマンドを使う。

### 例: FooBarSpecを実行する

```
> testOnly FooBarSpec
```


### 例: FooBarSpecで終わるテストだけを実施する

```
> testOnly *FooBarSpec
```

### 例: foo.barパッケージ配下のテストだけを実行する

```
> testOnly foo.bar.*
```

## 特定のテストケースだけを実行する

テストクラスの中の特定のテストケースだけを実行するには、`-z`オプションを用いる。

### 例: テストケース名に「hoge」を含むものだけを実行する

```
> testOnly FooBarSpec -- -z hoge
```

## テストクラスを補完に出したい

`test:compile`を実行し、テストクラスをコンパイルしておくと、テストケースが補完されるようになる。

```
> test:compile
```
Scala: sbt+scalatestテストを並列実行する


build.sbtに下記のフラグを立てるだけで、テスト実行が並列化できる!

```scala:build.sbt
parallelExecution in Test := true
```

なお、並列実行したいテストスイートは `ParallelTestExecution` を継承する。

```
class StepSpec extends FlatSpec with ParallelTestExecution {
	// ...
}
```

SharedNothingでStatelessなテストは並列実行にするといいかも。

# 並列数を指定する

並列数はCPUの数などから自動的に算出されるらしい。

並列数の指定を行う場合は、 build.sbt に明示する。

10並列にする例:

```scala:build.sbt
concurrentRestrictions in Global := Seq(
  Tags.limit(Tags.Test, 10)
)
```
クライアントからやってくる本物のHTTPリクエストをダンプする

Rack限定ならむかし [rack-spyup](http://udzura.jp/rack-spyup/) というものを書いた。自分で使ってみたけどJSON APIのデバッグとかだと革命的に便利だと思う。

ただ、Rackに到達する前にリクエストがお亡くなりになったりとか、そもそもサーバルビーじゃないしとかあると思うので、もっと汎用的な感じでダンプする手順をメモしてみる。

### リクエストが来たら内容を全部ダンプするHTTPサーバを作る

Rubyに標準添付されている、WEBrickの基本的な機能で割と簡単に作れる。

```rb:http-dumper.rb
# -*- coding: utf-8 -*-
require 'optparse'
require 'webrick'
require 'json'
options = ARGV.getopts("p:", "port:")

# The :monkey: raises
# cf. http://d.hatena.ne.jp/vividcode/20110505/1304618393
class WEBrick::HTTPServlet::ProcHandler
  alias do_PUT    do_POST
  alias do_DELETE do_POST
end

HORIZON = "\e[31m" + ("#" * 72) + "\e[0m"

def dump_http_request(req)
  puts HORIZON
  puts req.request_line
  puts req.raw_header
  puts
  if body = req.body
    puts body.lines.map{|line| line.gsub /[[:cntrl:]]/, '' }
  else
    puts "\e[35m*** Empty request body (maybe it is GET) ***\e[0m"
  end
  puts HORIZON
  puts
end

srv = WEBrick::HTTPServer.new(
  :BindAddress => "0.0.0.0",
  :Port => (options["p"] || options["port"] || raise("Need option -p=PORT")).to_i,
)

srv.mount_proc "/" do |req, res|
  dump_http_request(req)

  res.content_type = "application/json"
  res.body = {return: "OK"}.to_json
end

Signal.trap('INT') { srv.shutdown }
srv.start
```

`dump_http_request` が冗長だが（しょうがない）、WEBrick自体は簡単に扱えることが分かると思う。

これをターミナル（１）で起動しとく:

```bash
$ ruby http-dumper.rb  -p 3002
```

### リクエストをクローンして二つのサーバに送りつけるひとを作る

かっこ良くGoの [gor](https://github.com/buger/gor) を使おうとしたが、Macだとちゃんと動かない感じがする。

今回は手軽さ重視で [kage](https://github.com/cookpad/kage) を使い、`gor`コマンドと同じようなことをさせてみる。 `gem install kage` した後:

```rb:kage-front.rb
require 'optparse'
require 'kage'

options = ARGV.getopts("p:", "port:", "backend-port:", "dumper-port:")

Kage::ProxyServer.start do |server|
  server.port = (options["p"] || options["port"] || raise("Need option -p=PORT")).to_i
  server.host = '0.0.0.0'
  server.debug = false

  server.add_master_backend(:dev, 'localhost', options["backend-port"])
  server.add_backend(:dump, 'localhost', options["dumper-port"])

  server.on_select_backends do |request, headers|
    # アセットまでdump serverに送るのはうざったいので適当に振り分ける
    is_asset = request[:path] =~ /\.(ico|js|css|gif|png|jpe?g)$/
    is_asset ? [:dev] : [:dev, :dump]
  end

  puts "Server is listening 0.0.0.0:#{server.port}"
end
```

これもターミナル（２）で立ち上げ。

```bash
$ ruby kage-front.rb -p 3000 --backend-port=3001 --dumper-port=3002
```

### あとは分かるな

検査したいアプリを `3001` 番ポートでターミナル（３）に立ち上げること。Railsなら `rails s -p 3001`

### アクセスする

`http://localhost:3000` にいつも通りアクセスする。そうすると、いつも通りのウェブサービスが見える...

一方で、ターミナル（１）ではリクエストの内容がダンプされているのであった！

![httpdump.png](https://qiita-image-store.s3.amazonaws.com/0/569/db81da90-d3cd-b132-7705-c4bfb13db743.png)

### Usage

普通HTTPリクエストがそもそも壊れてるって少ないと思うけど、今回はジャバを触っていたらどうも壊れてしまっていたのでこういう感じでチェックしていた。参考にしてください。

ブラウザならデベロッパツールでいいけど、HTTPってやっぱいろんなクライアントから叩くと思うんで...。

## FAQ

### `ngrep` でいいじゃん

そうですね。tcpflowも便利でいいですね。

ただまあ、一応、そもそも「HTTPリクエストをクローンする」というのが便利かなと思ったのでメモがてら書いてみた感じでござる。あと、APIならともかくWebサービスだとアセットへのアクセスも全部出てしまってノイズっぽいし、このやりかただと正規表現などで適当に絞れると思う。

## 追記

[gemの形でインストールできるようにした](https://github.com/udzura/http-debug-utils) ので、bundlerなど使って入れてみて利用できるようになりました（rubygems.org には置かない予定です）。