OmniAICreator/Qiita-1.07M huggingface dataset:
dateコマンドでミリ秒巻き戻しができないみたいなので、C言語で書いてみました。

こんばんは、北国のインフラエンジニアkirksenchoです。
先日うるう秒対策について頭の中に入っていた情報を吐き出してみたのですが、思いのほか沢山のアクセスとストックを頂いて驚いております。

タイムリーな話題だったので、割と興味を持っている方が多かったのかもしれません。

今回はそのうるう秒対策絡みの調査の副産物を、最近始めたGitHubにコミットしてみたので、ご紹介してみたいと思います。

今回のうるう秒では1秒挿入されるので、そのうるう秒通知を受け取らないようにすると、そのサーバだけ1秒時間が進んでしまいます。
1秒位ならntpdやchronydなどに任せて時間調整はできますが、ある程度時間がかかるので、任意にコマンドを発行してミリ秒単位で戻せたら、何かあった時に安心です。

でもlinuxコマンドのdateは、1秒単位で指定して時間を巻き戻す事はできますが、ミリ秒やマイクロ秒での指定はできなさそうです。
以下のように現在時間をミリ秒単位で表示する事はできるんですが。

date +"%Y-%m-%d %H:%M:%S.%3N"
※Nはナノ秒の事です。３を付けないとナノ秒で表示されます。

無いものは作ってしまえばいいだろう、という事で簡単なC言語で書いてみました。

とりあえず、プログラム実行する度に100ミリ秒づつ戻ればいいかなという事で、引数指定とかは作ってません。

[GitHubへのリンク](https://github.com/kirksencho/Rewind-100-mili-sec-now/blob/master/rewind100milisec.c)

```c:rewind100milisec.c
#include <stdio.h>
#include <sys/time.h>

/* Rewind 100mili sec program */

int main(void)
{
    struct timeval t0;

    gettimeofday(&t0, NULL);

    /* Display now time */
    printf("Now time: %dusec\n", t0.tv_sec, t0.tv_usec);

    if ( t0.tv_usec >= 100000 ) {
        t0.tv_usec = t0.tv_usec - 100000;
    } else {
        t0.tv_sec = t0.tv_sec - 1;
        t0.tv_usec = t0.tv_usec + 900000;
    }

    settimeofday(&t0, NULL);

    /* Display after sub time */
    gettimeofday(&t0, NULL);
    printf("After sub 100mili seconds: %dsec %dusec\n", t0.tv_sec, t0.tv_usec);

    return 0;
}
```

作りは簡単で、現在時間をgettimeofday()で取ってきて、そのエポックタイムから100ミリ秒引き算して、settimeofday()で設定してあげてるだけです。

if文が一個ある理由は、ミリ秒の端数が100ミリ秒未満だった時に、何も考えずに100ミリ秒引いちゃうと、構造体のusecが負の値になってしまうので、もし端数が100ミリ秒無かったら、構造体のsecから1秒引いてから、usecに逆に900ミリ秒足してあげたら結果的に100ミリ秒引いたことになるという調整をしているからです。

こうすることによって、このプログラムを実行する度に、サーバの時間が100ミリ秒づつ巻き戻っていきます。

最近はインフラ構築系のお仕事なので、プログラムを書く機会がグッと減ったのですが、たまにコマンドだけで実現できないという状況になると、堂々とプログラムが書けるので、ちょっと楽しくなっちゃいました。

プログラムって面白いですね。
AWS EC2で複数ENIをLinux系OSでもっと手軽に扱うための何か

# 実現すべき目標
AWS EC2として動くCentOS/RHELにてENIの追加削除を行った際に手放しで利用が出来る状態にすることが目的です。
## 事の発端
ENIを付け替えることによるfailoverを実装しようとしていました。
Amazon Linuxであれば手放しですが、CentOSで稼働しているインスタンス群で実現する必要がありました。
## 先人の苦悩
すでに悩んでい(る|た)方の試行錯誤をなぞります。
汎用的に落としこむ部分がやはりみなさん悩ましかったようです。 [^1]。
[^1]: 案外最近の記事がないので、すでに興味の持たれない分野なのでしょうか

[もう一度ENIについて考えてみた(Linux編)](http://d.hatena.ne.jp/j3tm0t0/20121217/1355774969)
[EC2(CentOS6)起動時に2つの別々サブネットのENIと通信できるようにしてみた](http://blog.suz-lab.com/2013/07/ec2centos62eni.html)

# Amazon Linuxはどうやって実現しているか
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-eni.html
ec2-utilsというツールが実装されていて、そのスクリプト群でENIのアタッチ・デタッチを認識して処理を行っているようです。

# 実践
## ソースコードの入手
Amazon Linuxが稼働しているインスタンスでソースコードを取得します。
```
get_reference_source -p ec2-utils
```
ec2-utils-0.4-1.22.amzn1.src.rpm (2015年6月16日現在)をどうにかして作業環境へ移します。

## ソースコードの展開
```
rpm -ivh ec2-utils-0.4-1.22.amzn1.src.rpm
```
rpmbuild/ が作成され、rpmbuildを実施するファイル群が設置されます。

## rpmbuildを実施する
rpmbuildでrpmを作成します。
### CentOS6/RHEL6の場合のコマンド
```
rpmbuild -ba SPECS/ec2-utils.spec
```
### CentOS7/RHEL7の場合のコマンド
CentOS7はsystemdで稼働しますので、以下のように指示します。
```
rpmbuild -ba --without upstart SPECS/ec2-utils.spec
```
specファイルにも以下のような記述がありました(抜粋)。

```
%bcond_without upstart
```

```
%if %{with upstart}
Requires:  upstart
%endif
```

## rpmをインストールする
作成されたrpmをEC2インスタンスで動くCentOS/RHELへインストールします。
以下にCentOS6での実施例を示します。

```
rpm -ivh ec2-utils-0.4-1.22.el6.noarch.rpm ec2-net-utils-0.4-1.22.el6.noarch.rpm 
```

Enjoy!
gem installでpermission deniedされました

頭悪そうなタイトルですみません。
再びPCのセットアップをしたので、未来の自分のためにメモ。

## 問題

```$ gem install hoge``` で ```Permission denied``` と言われる。
sudoなしにhoge入れたい。


（Permission Deniedのときは、sudo使うと便利〜というくらいが初期の認識でしたが、ことあるごとに「sudoを使ってはいけない」局面に陥ったので、sudoを使わずになんとかinstallしたい。）

ググる。

→ sudoつけてとかgem入れ直してとか出てくるけど違いそう


### そもそもなにがおこってるか

* systemのrubyを使っている
* sudo権限の必要な領域に色々installしようとしている（→ sudo付けろと言われる）

→ sudoのいらない、 ```/usr``` 領域にrubyを置くと良い。
（systemのrubyを使うこと自体は問題はないが、このままinstallすると全てのuserに影響を与えてしまう）


### 環境

* OS X Yosemite  v10.10.3
* rbenv v0.4.0
* Homebrew v0.9.5



## 手順ログ

すごい先輩が色々やって下さったので手順を。
デバッグ力というか・・・

```zsh
$ gem install compass
ERROR:  While executing gem … (Errno::EACCES)
    Permission denied - /Library/Ruby/Gems/2.0.0  # compass以外でもこういうエラーが出ていた

$ which gem
/usr/bin/gem  # /usr/binはsystemの権限の領域

$ rbenv versions
* system (set by /usr/local/rbenv/version)   # systemのrubyを使ってた

$ which ruby                                                                                                   /usr/bin/ruby  # systemのruby使ってる

$ rbenv install -l  # install可能なrubyのバージョン

$ rbenv install  2.2.2
```

rbenvを使ってrubyを入れ直すことで、systemではなくuser権限の配下にinstallすることができる
→ sudoつけなくて良くなる

そもそも ```/usr/bin/``` 以下がsuper user権限のものってのも分かっていなかったです。
```/usr/local/bin/``` 以下が私が使える領域だそうです。

```zsh
$ rbenv rehash

$ which ruby
/usr/local/rbenv/shims/ruby  # usr領域に入った

$ which gem
/usr/local/rbenv/shims/gem

$ gem install compass
ERROR:  While executing gem … (Errno::EACCES)
    Permission denied - /Library/Ruby/Gems/2.0.0  # まだ出る

$ rbenv versions
* system (set by /usr/local/rbenv/version)  # installしただけでsystemのrubyから切り替えてなかった
  2.2.2

$ rbenv global 2.2.2  # rubyのバージョン切り替え

$ rbenv versions
  system
* 2.2.2 (set by /usr/local/rbenv/version)

$ gem install compass
Fetching: ffi-1.9.8.gem (100%)
…
9 gems installed
```


1つのrubyに対して1つのgemがある（この表現でいいのか怪しい）
→ 「使ってるrubyがおかしいんじゃないか」

という発想に自分で至らなかったので、ひたすらgemとかrbenvとかの対処を探していました。
根本的にエンジニア向いていない感のする3年目…。
裏側の理解が怪しいと全体的に怪しい。危ない。


3年目でこれかよ〜的なことを（やさしく）言われたので、次移行するときは記事を探してパパッとできるようになりたいです（希望）
移行の度に必要なものが違ったり、間違って入れたいらんものとかある気がして躊躇してましたが、Brewfileを使えるように用意しようと思いました。。
UbuntuにTeX環境をインストールするための覚書

10年ぶりくらいにTeXを書く機会があり調べてみた。最近では、TeXLiveというものを使うらしい。このTeXLiveには日本語LaTeX環境が備わっているそうで安心できる。
以下のコマンドで、Ubuntu14.04にTexLiveをインストールできる。

```bash
sudo apt-get install texlive-full
```

他にも必要なパッケージがあるかもしれないが、ひとまず事足りる。すごい時代になったもんだ。

CentOS 7.2でインストールする場合のコマンドはこれである。

```bash
sudo yum install texlive-*
```
parent連打やめろ

## はじめに

* `jQuery`に不慣れな方向けにアンチパターンを紹介する記事です。
* 親の要素を取得する`parent`はメソッドチェーンが可能で親の親の要素を取得できます。
* その感覚で親の親の親の親の…とやってしまいがちですが、今すぐやめましょう。

## アンチパターン

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
  </head>

  <body>
    <div data='div1' class='div1'>
      div1
      <div data='div2' class='div2'>
        div2
        <div data='div3' class='div3'>
          div3
          <div data='div4' class='div4'>
            div4
            <div data='div5' class='div5'>
              div5
              <div data='div6' class='div6'>
                <button id='sample'>SAMPLE</button>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <script type="text/javascript" src="sample.js"></script>
  </body>
</html>
```

```js
$(function(){
    $('#sample').on('click', function(){
      var div6 = $(this).parent().attr('data');
      var div5 = $(this).parent().parent().attr('data');
      var div4 = $(this).parent().parent().parent().attr('data');
      var div3 = $(this).parent().parent().parent().parent().attr('data');
      var div2 = $(this).parent().parent().parent().parent().parent().attr('data');
      var div1 = $(this).parent().parent().parent().parent().parent().parent().attr('data');
      console.log(div6);
      console.log(div5);
      console.log(div4);
      console.log(div3);
      console.log(div2);
      console.log(div1);

      alert('please check console log');
    });

});
```

## 何故ダメか

* `div`が入れ子になって6段ネストしている`html`があり、最も親の要素を取得する場合
* `parent`を連打すると`DOM`の構造が変わった時に修正がとても大変
* 上記の例で言うと例えば`div`のネストが1段増えるとか、途中の`div`が`p`タグになるとか…
* あとは単純にコードが読みにくい（この`parent`は何個上の親を指している？など）

## 改善コード

```js
$(function(){
    $('#sample').on('click', function(){
      var div6 = $(this).parents('.div6').attr('data');
      var div5 = $(this).parents('.div5').attr('data');
      var div4 = $(this).parents('.div4').attr('data');
      var div3 = $(this).parents('.div3').attr('data');
      var div2 = $(this).parents('.div2').attr('data');
      var div1 = $(this).parents('.div1').attr('data');
      console.log(div6);
      console.log(div5);
      console.log(div4);
      console.log(div3);
      console.log(div2);
      console.log(div1);

      alert('please check console log');
    });

});
```

## 解説

* `parents`メソッドはセレクトした要素の親要素を全て取得する。
* `parents(条件)`のように条件を指定すると親要素内のその要素を取得する。
* `DOM`構造の変化に強い（`div`のネストが増えても修正が容易）
* 先程のものと比べてコードが読みやすい。

## おまけ

```js
$(function(){
    $('#sample').on('click', function(){
      var div = $(this).closest('div').attr('data');
      console.log(div);

      alert('please check console log');
    });

});
```

* `closest`はその要素の最も近い親要素を1つ取得する。
* 条件も指定可能なので使い勝手が良い。

## おわりに

* 今回の例では「クラス指定してあんだから普通にクラスでセレクトすればいいだろ！」と思われるかもしれませんが、クリックした要素の親の親の親の…とやりたくなるケースも多々存在します。
* ループを回して要素を作成していて、その中の1つの要素がクリックされたらその親を辿った要素のテーブルの列をhideにする…などのケースですね（というかそういう例にすれば良かったですね…）
* とにかく今すぐ`parent`連打はやめましょう。
[Swift] UIColor を 'FF8800' のような RGB の文字列から生成する


iOS アプリを開発している時の色の指定ってめんどくさいですよね。

Color picker を使って色を取ってきた時やデザイナーさんが指定する色は '001122' のような指定方法がほとんど。
それなのに iOS アプリでの色の指定の仕方は rgba それぞれを 0-1 の小数点で指定。。

いちいち変換するのがめんどかったので変換用 extension を Swift 書いてみました。
文字列のパース、数値への変更は NSScanner が便利です。

```
extension UIColor {
    class func colorFromRGB(rgb: String, alpha: CGFloat) -> UIColor {
        let scanner = NSScanner(string: rgb)
        var rgbInt: UInt32 = 0
        scanner.scanHexInt(&rgbInt)

        let r = CGFloat(((rgbInt & 0xFF0000) >> 16)) / 255.0
        let g = CGFloat(((rgbInt & 0x00FF00) >> 8)) / 255.0
        let b = CGFloat(rgbInt & 0x0000FF) / 255.0

        return UIColor(red: r, green: g, blue: b, alpha: alpha)
    }
}
```

使い方は下記の通りです。

```
使い方
let color = UIColor.colorFromRGB("FC6453", alpha: 1)
```

かなり楽になりました。

余談ですが extension のファイル名は Objective-c の category と同様に UIColor+rgbstring.swfit のように + をいれるのが一般的のようです。
VPSのUbuntuにWindowMaker入れてSSHのX11転送にXmingで接続するまで


Wimax2+の回線が遅すぎるのでVPS生活しようと思ってServersMan@VPSを契約しました。

プラン：Entry(メモリ1GB)、Ubuntu 64bit

GUI使えたらいいなーっていうことで、最小限のX環境を整えました。
後から何かの役に立つかもしれないのでセットアップ手順をメモしておきます。

## 手順
### ユーザー関連
#### ユーザー作成

```bash
useradd -p `mkpasswd ＜パスワード＞ -m sha-512` -s /bin/bash -m ＜ユーザー名＞
```

#### sudoers設定

```bash
cat <<EOS>/etc/sudoers.d/＜ユーザー名＞
＜ユーザー名＞ ALL=(ALL) NOPASSWD: ALL
Defaults:kunst !requiretty
EOS
```

### サービスの設定
#### 管理用パッケージのインストール

```bash
apt-get update
apt-get install -y sysv-rc-conf iptables-persistent
```

#### 不要サービスの停止

```bash
cat <<EOS | xargs -I@ echo 'service @ stop ; update-rc.d -f @ remove' | sh
apache2
ajaxterm
saslauthd
screen-cl$
EOS
```

#### iptablesの設定

```bash
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport ＜SSHポート番号＞ -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables-save > /etc/iptables/rules.v4
```

#### sshd設定

```bash
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
sed -i"" -e 's/^AcceptEnv .*/#AcceptEnv LANG LC_*/' /etc/ssh/sshd_config

service ssh restart
```

### X11環境の設定　※ここから一般ユーザ

#### Xクライアント環境の作成

```bash
sudo apt-get install -y xauth xterm
sudo apt-get install -y wmaker chromium-browser

cat <<EOS > xstart.sh
#!/bin/bash
exec wmaker
EOS

chmod +x xstart.sh
```
※xauthは必須


### サーバ(Xming)の設定

Xmingを普通にインストールしてから、それから
* ユーザーは、pagent経由でssh公開鍵でログインできるようにしておく
* puttyを使って1回ログインしておく

config.xlaunchの設定について
* Display settings → One window(別にどれでもいい)
* Session type → Start a program
* Start program
    * Start program → ./xstart.sh
    * RunRemote → Using PuTTY(plink.exe)
    * Connect to computer → 接続先のIPアドレス
    * Login as user → ユーザ名
* Additional parameters
    * SSHのポートが22以外の場合、「Additional parameter for PuTTY or SSH」に「-P ポート番号」を入れる


## 接続後の状態
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/42741/143a728a-5949-be41-4ab7-329952f4625c.png)

ネットワーク越しのためかなんだかもっさりする && Chrome起動しないんですが…
イマドキJavaScriptにキャッチアップを試みる（１）


Ubuntuではパッケージでnodejsとnpmを入れる。パッケージが存在すれば、原則それを使う。それ以外の個別のものはnpmでglobalインストールするのは気が引けるので、環境変数をやりくりしつつ、ひとまずlocalインストールでしのぐ方向。

Ubuntuは`node`ではなく`nodejs`にリネームされているので、`$HOME/bin` にsymlinkを置く（そうするとデフォルトでは`PATH`に追加されるように`.profile`が書いてある）。ちなみに`node`をインストールすると、node.jsとは全く関係が無い`ax25-node`という`inetd`起動のデーモンがインストールされる。

```bash
$ ln -s /usr/bin/nodejs $HOME/bin/node
```

それから`PATH`にnpmでインストールしたコマンドが検索されるようにする。相対パスにしたのは意図的なもの。

```bash
$ export PATH=$PATH:node_modules/.bin
```

作業場のディレクトリを作って、その中に移動する。

```bash
mkdir testapp && cd testapp
```

jspmをインストールし、github用のtoken設定を入れておく。そうしないと、怒涛のgithubアクセスで、レートリミットに引っかかる。tokenを与えるとanonymousアクセスではなくなるので、上限が引き上げられる。

```bash
npm install jspm
jspm registry config github
# この後は対話シェルになる
```

jspm の設定を作る。yeomanなどを使うと、この辺がすっ飛ばされる。

```bash
jspm init
```

`index.html` と `app.js` を作り、jspm init で作った public ディレクトリに置く。

```html:index.html
<html>
<script src="jspm_packages/system.js"></script>
<script src="config.js"></script>
<script>
  System.import("app");
</script>
</html>
```

```js:app.js
console.log("hello");
```

public ディレクトリがドキュメントルートに見えるようにwebサーバを起動する。何を使ってやっても構わないけれど、例えばここではpythonで。

```bash
python3 -m http.server
```

ブラウザで開くと、javascript console に hello と出力されているのが確認できる。これだけだとモジュールシステムのありがたみ皆無なので、`npm:base64-js`を使ってみる。

```bash
jspm install npm:base64-js
```

そして`app.js`側からそれを使う。import文いくつか試行錯誤して、system.jsの期待する方式はこれだなとあたりを付けた。

```js:app.js
import base64 from 'base64-js'
console.log(base64);
```

ということで、javascript のモジュールの使い方は分かった気分になった。このままだと大量のファイルを読み込むことになるので、最後にまとめる。

```bash
jspm bundle app --inject --minify
```

app.js でインポートしている依存ライブラリがまとめてbuild.jsに取り込まれてminifyされる。injectを指定すると、ローダが`build.js`から最初に見つけてくれるようになるので、追加の読み込みが発生しない、ということかな。ブラウザをリロードしても`app.js`や`base64-js@0.0.8.js`へのアクセスは発生しないはず。`system.js`や`config.js`は相変わらず個別に読み込まれるけど、そこは目をつむる。

つづく
Homebrew の Python をアップグレードした後に virtualenv の python も再リンクする

`brew cleanup` とかでリンクがキレて

```console
app: source venv/bin/activate
[venv] app: python
dyld: Library not loaded: @executable_path/../.Python
  Referenced from: /path/to/app/venv/bin/python
  Reason: image not found
```

## Python 3.x 系

**アプリケーションディレクトリー内に `venv` ディレクトリーを利用している場合**

```console
find ./.venv -type l -delete && python3 -m venv ./.venv
```

※ `.venv` は適宜仮想環境ディレクトリーを指定してください

## Python 2.x 系

**`virtualenv` を利用している場合**

みたいになったやつの再リンク。方法は `env` ディレクトリのリンクを消して、 `virtualenv` コマンドで再リンクするだけ

```console
find ./venv -type l -delete && virtualenv ./venv
```

1個1個再リンクするのめんどい。 `virtualenvwrapper` 使ってることと以下のように一括で更新できる

```console
workon | xargs -L 1 -t -P 4 -I % -- sh -c 'find $WORKON_HOME/% -type l -delete && virtualenv $WORKON_HOME/%'
```

* `-P 4` を作成している `virtualenv` の個数分ぐらいに増やして並列処理すると早い.
PHPで文字列検索のBoyer Moore法

#PHPで文字列検索のBoyer Moore法

戻り量を考慮していなかったので無限ループや末尾の取り扱いで苦戦した。

```php


/*
Boyer Moore法
見つけたい文字(パターン)の末尾から探していく
テキストの頭から進める。
パターンに含まれて居ない文字の場合はパターンの数分ずらす
パターンに含まれている場合は、最小限の移動
 */
mb_internal_encoding("UTF-8");
//日本語
//①全部同じ
var_dump(bMSearch('テストトテスト', 'テストトテスト'));                            //true
echo '<br>';
//②最初でマッチ
var_dump(bMSearch('テストトテストトトト', 'テストトテスト'));                      //true
echo '<br>';
//③途中でマッチ
var_dump(bMSearch('テストトテストストトテストテテテテテ', 'テストトテスト'));       //true
echo '<br>';
//④途中でマッチ
var_dump(bMSearch('aaaabdfdsrtatテストトテストストトテストテ', 'テストトテスト')); //true
echo '<br>';
//⑤最後でマッチ
var_dump(bMSearch('テストトテテストトテスト', 'テストトテスト'));                  //true
echo '<br>';
//⑥最後でマッチ2
var_dump(bMSearch('テストトテnトテストトテスト', 'テストトテスト'));               //true
echo '<br>';
//⑦最後でマッチ3
var_dump(bMSearch('テストトテスnテストトテスト', 'テストトテスト'));               //true
echo '<br>';
//⑧見つけたい文字よりも短い
var_dump(bMSearch('テスト', 'テストトテスト'));                                   //false
echo '<br>';
//⑨一致しない
var_dump(bMSearch('テストトテス', 'テストトテスト'));                             //false
echo '<br>';
//⑩一致しない
var_dump(bMSearch('後戻りを考慮せず無限ループではまる', 'テストトテスト'));                             //false

function bMSearch($text, $pattern) {
    $tLength   = mb_strlen($text);    //テキストの長さ
    $pLength   = mb_strlen($pattern); //パターンの長さ
    $shifTable = array();             //シフトする量のマスタテーブル

    //シフトテーブルの作成。末尾の１個前まで実施
    for ($i = 0; $i < $pLength - 1; $i++) {
        //キーはパターンの文字。値はシフト量
        $shifTable[mb_substr($pattern, $i, 1, 'UTF-8')] = $pLength - $i -1;
    }
    //パターンの末尾のみの計算。もし、既に文字がある場合は何もしない。最初のfor分でやるとシフト量が0になるため
    if (!array_key_exists(mb_substr($pattern, $pLength-1, 1, 'UTF-8'), $shifTable)) {
        $shifTable[mb_substr($pattern, $pLength-1, 1, 'UTF-8')] = $pLength;
    }

    //var_dump($shifTable);
    //exit('');
    //探索する
    //テキストのindexをパターンの末尾とあわせる。末尾から探索していく
    $tIndex = $pLength -1;
    while ($tIndex < $tLength) {
        //パターンの末尾位置
        $pp = $pLength - 1;
        //文字が一致している間実施
        while (mb_substr($text, $tIndex, 1, 'UTF-8') == mb_substr($pattern, $pp, 1, 'UTF-8')) {
            if ($pp == 0) {
                //探索成功
                return true;
            }
            $tIndex--;
            $pp--;
        }
        //移動する
        if (isset($shifTable[mb_substr($text, $tIndex, 1, 'UTF-8')])) {
            //後戻り対策。大きい方を取る
            $tIndex = $tIndex + MAX($shifTable[mb_substr($text, $tIndex, 1, 'UTF-8')], $pLength - $pp);
        } else {
            //パターン以外の文字の時
            $tIndex = $tIndex + $pLength;
        }
    }
    //探索失敗
    return false;
}



```
##参考サイト
http://tokyo-ct.net/usr/kosaka/for_students/jissen1/akiyojissen1/kougi17.html
http://www.comp.cs.gunma-u.ac.jp/~koichi/ALG2/9beamerBM.pdf
http://www.comp.cs.gunma-u.ac.jp/~koichi/ALG2/ALG2.html
PostgreSQLでの暗黙の型変換メモ（文字列<->数値）

## そういうもんかと諦めていました
以前から不便だなーと思っていたけど

```sql
drop table test;
create table test(
  col1 text
);
insert into test values(1);

select * from test where col1 = 1;

#ERROR:  operator does not exist: text = integer
#LINE 7: select * from test where col1 = 1;
                                      ^
#HINT:  No operator matches the given name and #argument type(s). You might need to add explicit type casts.

```

## やれば出来る子
暗黙の型変換を登録してあげると、エラーが出なくなるようです。

```sql
-- 数値 <-> 文字列変換
CREATE CAST (int4 AS text) WITH INOUT AS IMPLICIT;
CREATE CAST (text as numeric) WITH INOUT AS IMPLICIT;

-- || 演算子の定義
CREATE FUNCTION textint4cat(text, int4) RETURNS text
   AS 'SELECT $1 || $2::pg_catalog.text' LANGUAGE sql IMMUTABLE STRICT;

CREATE OPERATOR || (PROCEDURE = textint4cat,LEFTARG = text, RIGHTARG = int4);
```


## 参考
http://lets.postgresql.jp/documents/tutorial/cast/
slackで楽しくメンションを送る方法

## 概要

Slack、便利ですよね。

しかし、連絡等でメンションを送る際に、`@name`と打つのは非常にダサいと思ったことはないでしょうか。いや、だれもが思うはずです。

このようなダサい方法でメンションでもし作業が中断されたりすれば、きっとイライラもmaxになってしまうことでしょう。チーム内の人間関係を壊してしまうことだってあるかもしれません。

そこで、`@name`よりも楽しくメンションを送る方法を紹介します。

## 方法

0. メンションを送りたいアカウントのアイコンをダウンロードします。
0. ダウンロードしたアイコンを128x128にリサイズします。imagemagickが入っているなら以下のコマンドが使用できます。

    ```sh
    $ convert -resize 128x128 input.png output.png
    ```

0. https://team-name.slack.com/customize/emoji に移動します。
0. 変換した画像をemojiにします。emojiの名前はアカウント名と同じにします。
0. `:account-name:` のように、アカウント名のemojiを使用すると、メンションを飛ばすことができます。

全員分一人でやるのは面倒なので、全員が自分のアイコンをemoji化するなどして分担するのもいいかもしれません。

## まとめ

emojiを使用することによって、楽しくにメンションを送る方法を紹介しました。これなら作業を中断されても思わず草を生やしてしまうのではないでしょうか。

緑と笑顔あふれるチームを目指しましょう！

![ping.png](https://qiita-image-store.s3.amazonaws.com/0/59571/9764e7b1-e1d9-f6e0-bacc-2b520d28a8b2.png)

## その後

この記事を書いた当初はネタのつもりだったのですが、幾つかの slack ではかなり本格的に運用されており、mention は emoji を使うのが当たり前にすらなっています。

ただ、やはり emoji を作成するのはそれなりに手間なので、bot 等で自動化してみたいと思います。
Gradle で Fat Jar

[Gradle FatJar](https://github.com/musketyr/gradle-fatjar-plugin) プラグインを使う。

```groovy:build.gradle
buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'eu.appsatori:gradle-fatjar-plugin:0.3'
    }
}

apply plugin: 'eu.appsatori.fatjar'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.apache.commons:commons-lang3:3.4'
}

fatJar {
    baseName = 'fatjar'
    manifest {
        attributes('Main-Class': 'sample.fatjar.Main')
    }
}
```

```java:Main.java
package sample.fatjar;

import org.apache.commons.lang3.StringUtils;

public class Main {

    public static void main(String... args) {
        System.out.println(StringUtils.join(args, " -> "));
    }
}
```

```text:Jar作成
> gradle fatJar
```

```text:実行
> java -jar build\libs\fatjar.jar hoge fuga piyo
hoge -> fuga -> piyo
```

```text:Jarの中身
fatjar.jar
  |-META-INF/
  |  :
  |-org/apache/commons/lang3/
  |  :
  `-sample/fatjar/
     :
```

`fatJar` タスクは、 `Jar` タスクを継承しているので、 `Jar` と同じオプションを指定できる。
ntpdのうるう秒対応(2015/07/01)

# 概要
直近のうるう秒(2015/06/30 23:59:60 UTC)の挿入について。
OSやサービスごとに対応が結構違うので情報を得るのが少し大変。
もろもろの原理を理解する前にとりあえずOSの対策だけしておきたい人用に
Linuxで広く使われるntpdの対応方法を書いておく。
一先ずCentos5,6, AmazonLinuxでの対応方法を下記する。

# やるべきこと
- ntp-4.2.6p5-3 以降にバージョンアップ (201506現在最新)  
- ntpdをslewモードで動かす

## ntpdのslewモードって何
緩やかな時刻同期を実行するntpdの起動モード。
1秒間のズレを約2000秒(33分)かけて修正する。

slewモードで動くntpdはうるう秒そのものは無視して、1秒先に進む。そして緩やかに挿入後の時間に同期していく。今のところOSやアプリケーションに影響を与えない対策としてslewモードへの移行が推奨されてる。
なお、ntp-4.2.6p5-3(2015/03/09リリース)以前のntpdはslewモードで動作しないバグが有るのでうるう秒対策をする場合は基本的にバージョンアップしたほうが良い。

## CentOS5 & 6の場合
```
1. ntpdのバージョンアップ
# yum update ntp

2. ntpdを停止する
# service ntpd stop

3. kernelの保持時刻・周波数オフセットをクリアする
# ntptime -s 0 -f 0

4. ntpdをslewモードで起動するようセット
# vi /etc/sysconfig/ntpd
- OPTIONS="u ntp:ntp -p /var/run/ntpd.pid -g"
+ OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid -g"
 -xオプションを追記して保存

5. ntpd を起動
# service ntpd start
```


## AmazonLinuxの場合
https://forums.aws.amazon.com/ann.jspa?annID=3064
公式の見解を参考にすると基本的に下記をやっとけば良い感じ。
細かい違いだが、AmazonLinuxのntpは`ntp-4.2.6p5-30.24.amzn1` 以降が望ましい。

```
1. ntpdのバージョンアップ
# yum --releasever=latest install ntp

2. ntpdを停止する
# service ntpd stop

3. kernelの保持時刻・周波数オフセットをクリアする
# ntptime -s 0 -f 0

4. ntpdをslewモードで起動するようセット
# vi /etc/sysconfig/ntpd
- OPTIONS="-g"
+ OPTIONS="-g -x"
 -xオプションを追記して保存

5. ntpd を起動
# service ntpd start
```

# 余談: その他のOS, NTPクライアント
#### Windows OS
基本的に対応不要

- https://support.microsoft.com/en-us/kb/2722715/ja

### CentOS7以降で標準化された"chronyd"
基本的にchronydはslewモードで動作するので対応不要(と思ってる)。
ただし、デフォルト設定ではntpdのslewモードと比べて同期完了までの速度が早い。
slewの調整速度は"maxslewrate"で指定出来る。気になる場合は調整したほうがよいかもしれない。

chronydはこちらが参考になる

- http://qiita.com/yunano/items/7883cf295f91f4ef716b
特定のフォーム要素を飛ばしてGETで送信する

入力フォームを作っていると、よく「入力の便宜上必要だけど、JavaScript制御にしか使わないので、サーバ側に送信しなくてもいい」フォーム要素を置くことがあります。POSTなら余計な要素が多少増えてもそんなに困ることもないのですが、GETで送信する場合には余計な要素があるとURLも長くなって、見栄えも悪いしハンドリングもしづらいということになってしまいます。

さて、そんなフォーム要素を送信から外すには、どのような手段があるのでしょうか。

# 1. jQueryを使って解決

jQueryには、[`.serialize()`](https://api.jquery.com/serialize/)というメソッドがあって、フォームの中身をクエリ文字列に起こしてくれます。Qiitaにも[値が空のものを削る例](http://qiita.com/guimihanui/items/1aeab53b3776ebec97ab)がありますが、これと同様に特定の項目だけ削減、ということも可能です。

…とはいえ、たかだか見栄え程度の問題でコードを書くのは面倒くさい話です。

# 2. `name`の省略
`<input>`などが送信される際には、`name=value`という形式になります。ここで`name`を削ってしまえば、値として起こせなくなるのでGET送信に加えられなくなります。JavaScriptからのアクセスには`id`などを使えば特段問題ありません。なお、[HTML5の勧告](http://www.w3.org/TR/html5/forms.html#attr-fe-name)によれば、`name`を設定しないことは可能だけど空文字列にはできない、とのことです。

大半のフォーム要素はこれで対応可能なのですが、1つ例外になるのが**ラジオボタン**です。ラジオボタンの`name`はグループ化にも使われているものですので、省略してしまうとうまくグループ化ができなくて、使い物にならなくなります。

# 3. `form`属性の設定
ラジオボタンを送信させないようにする方法はないものかと調べてみたところ、HTML5から追加された`form`属性というものがありました。

この属性は、包含関係で決まっていた`<form>`が送信する範囲を、プロパティとして設定できるようにするものです。`<form id='form1'>`の中にある`<input>`でも、`form='form2'`と設定しておけば、form1のsubmitでは送信されず、form2のsubmitで送信されるようになります。

つまり、適当なダミーフォームをどこかに置いておいて、`form`属性でそっちを向けるようにしておけば、本来のフォーム送信時には反応しないことになります。

ただし、IEではこの方法は動かないようです（[MDN情報](https://developer.mozilla.org/ja/docs/Web/HTML/Element/Input#Browser_compatibility)をみましたが、IEの対応が?となっていました）。
nginxでBasic認証をかけるとき平文パスワードにしたい

NginxでBasic認証をかける際、パスワードファイルに平文でパスワードを書く方法です。Nginxでは`{PLAIN}`で始めると平文パスワードとして解釈されます。

```txt:.htpasswd
alice:{PLAIN}p@ssW0rd
````
Source Han Code JPを使ってみて感じたこと


Source Han Code JPとは、Adobe Fontsで無償公開されている
コーディングに最適化された日本語フォントです。
Mac OSXからはhomebrew-caskからインストールできますし、
Windowsなら以下のページからダウンロードして利用できます。
https://github.com/adobe-fonts/source-han-code-jp

数日間使ってみて、自分なりに良かった点と悪かった点が
いくつか見つかったので書いていきます。

## 良い点

* フォントのウェイト（太さ）設定の幅が広い
* 全角文字がポップすぎない
* 漢字にアンチエイリアスが掛かっても消えたり潰れたりしにくい
* 「アルファベットの中に少しだけ日本語」の状態の見た目の調和が取れている

## 悪い点

* 全角文字が中心のドキュメントでは文字が小さく見える
* 半角文字が全角文字よりも全体的に太く見える
* 半角文字と全角文字が1行の中にあると文末が不揃いに見える
* エディタのruler機能があてにならない

### これらの原因

このフォントは一般の等幅フォントと違って
半角文字と全角文字の幅の比率が2:3になっています。
そのため、半角文字が中心のコードでは
字間がゆったりと取れ、見やすくなっているわけです。

しかしその弊害で、これまでの等幅フォントに慣れていればいるほど、
全角文字と比較して半角文字の幅が広く、
半角文字と比較して全角文字が小さく見えてしまう、
ということが起きてるのではないかと思います。
この辺は慣れでカバーできる部分かなと。
Fx0でVibration API

[WebAPI](https://developer.mozilla.org/ja/docs/WebAPI)の[Fx0](http://au-fx.kddi.com/products/index.html)での動作確認。

# [Vibration API](https://developer.mozilla.org/ja/docs/Web/Guide/API/Vibration)
```js:
navigator.vibrate(1000);
```
1000ミリ秒振動させる。

```js:
navigator.vibrate([50, 100, 150]);
```
50ミリ秒振動させて100ミリ秒止めて150ミリ秒振動させる。

```js:
navigator.vibrate(0);
```
振動をすべて止める。

# Fx0で動作確認
Firefox WebIDEのHello Worldテンプレで確認してみます。

```js:app.js
window.addEventListener("load", function() {
  navigator.vibrate(1000);
});
```

と修正してFx0にインストールするとブーンと１秒間振動。

```js:app.js
window.addEventListener("load", function() {
  navigator.vibrate([50, 100, 150]);
});
```

と修正してFx0にインストールするとブブンと振動。

```js:app.js
window.addEventListener("load", function() {
  navigator.vibrate(-1);
});
```

と修正してFx0にインストールするとずっと振動しつづける。
そもそも渡す値は`unsigned long`とされているので`-1`を渡すと`0xffffffff`となるのかな？

```js:app.js
window.addEventListener("load", function() {
  document.addEventListener("touchstart", function(){
    navigator.vibrate(-1);
  });
  
  document.addEventListener("touchend", function(){
    navigator.vibrate(0);
  });
});
```

とするとタッチした間だけ振動する。
コンソール上からGrapeのroutesを確認する

普通のRailsのルーティングなら`pry`を使っている場合以下のように簡単に確認できる。

```rb
> show-routes
```

Grapeの場合はうまい方法が見当たらなかったのでとりあえず以下のようにやった。

```rb
> pp Api.routes.select {|r| r.instance_variable_get(:@options)[:description] =~ /Login/ }
[#<Grape::Route:0x007fdd5a2c32a8
  @options=
   {:params=>
     {"mail"=>{:required=>true, :type=>"String"},
      "password"=>{:required=>true, :type=>"String"}},
    :description=>"Login",
    :prefix=>nil,
    :version=>"v1",
    :namespace=>"/",
    :method=>"POST",
    :path=>"/:version/login(.:format)",
    :compiled=>/\A\/(?<version>v1)\/login(?:\.(?<format>[^\/.?]+))?\Z/,
    :settings=>
     {:description=>
       {:description=>"Login",
        :params=>
         {"mail"=>{:required=>true, :type=>"String"},
          "password"=>{:required=>true, :type=>"String"}}},
      :declared_params=>[:mail, :password]}}>]
```

Grapeのパラメータの指定とか書く位置間違えて（ネスト間違えたり）して意図しないことになってたりしたことがあったので、作ってる最中はまめに確認したい。

beforeとかafterがどの単位に効いているかも確認できたら良いんだけどなー
どうしたらいいんだろう？
Vue.js 0.12.1 になって、改善されたこと。

ver 0.12.1 になって、 component の中で使う props の validation の記述ができるようになったのは便利そう。他にも変更点はいくつかあるけど、中でも困っていた``<content>``のエラーが改善されたのでメモしておく。

## 0.12.0系ではエラーになる書き方。

[demo](https://jsfiddle.net/akiho/Lp6aws1h/)

```html:html
<div id="app">
    <cmpo>this is app message</cmpo>
    <cmpo></cmpo>
</div>

<template id="cmpo">
    <p>this is cmpo message</p>
    <content></content>
</template>
```


```javascript:javascript
Vue.component('cmpo', {
    template: '#cmpo',
});

new Vue({
    el: '#app',
});
```

```:結果
this is cmpo message
this is app message
```

``this is cmpo message``がもうひとつ表示されて欲しかった。
この問題は v0.12.1 になって改善されたみたい。
編集中のUITableViewController でセルの順番入れ替えを制限する

セル移動の際に呼ばれるデリゲートメソッドを使用する。

```objc:method
- (NSIndexPath * nonnull)tableView:(UITableView * nonnull)tableView
    targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath * nonnull)sourceIndexPath
    toProposedIndexPath:(NSIndexPath * nonnull)proposedDestinationIndexPath
```

入れ替えていいインデックスと入れ替えてはいけないインデックスを指定することで、移動禁止のセルの移動を抑制できる。



実装例

```objc:example
- (NSIndexPath *)tableView:(UITableView *)tableView
targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath
       toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath{
    if (proposedDestinationIndexPath.section==0 && proposedDestinationIndexPath.row==0) {
        return [NSIndexPath indexPathForRow:0 inSection:1];
    }
    return proposedDestinationIndexPath;
}

```

上記コードは、テーブルの中でsection:0 row:0 のセルの移動を制限している。
制限されている場所にセルを移動しようとすると、その真下(section:0 row:1)に移動するようにしている。




参考
[UITableViewDelegate Protocol Reference](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/#//apple_ref/occ/intfm/UITableViewDelegate/tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:)
Pythonの「*」文字出力を他の言語でやってみた

Pythonを始めてみたのですが、以下の記法にちょっぴり感激いたしました。

```Python:hoge.py
print u"失敗した。" * 5 # 結果：失敗した。失敗した。失敗した。失敗した。失敗した。
```

そこで、他の言語でも同様の記法で同様の結果が得られるのか気になったので試してみました。
***

* Ruby -> イケました!

```Ruby:hoge.rb
puts "失敗した。" * 5 # 結果：失敗した。失敗した。失敗した。失敗した。失敗した。
```

* Elixir -> ダメでした…

```Elixir:hoge.exs
IO.puts "失敗した。" * 5 # 結果：warning: this expression will fail with ArithmeticError
```

* Perl -> ダメでした…

```Perl:hoge.pl
print "失敗した。" * 5; # 結果：0
```

* PHP -> ダメでした…

```php:hoge.php
print "失敗した。" * 5; // 結果：0
```

* Swift -> ダメでした…

```Swift:hoge.playground
println("失敗した。" * 5) // 結果：実行不可
```
***

意外とダメなものなのですね。
今回試していない言語を触る機会があれば、同様の記法でイケるか試してみたいと思います!
CodeBehind vs CodeFile (2) 

#背景
[前回](http://qiita.com/Mr_K/items/c092295379fe1dda6211)の続き。
CodeFileにしているcsファイルから、DLLのクラスを呼び出せるかが気になった。

#準備
1) 前回のソリューションにクラスライブラリのプロジェクトを追加する。（名前はClassLibrary）
2) 既定で存在するClass1.csを以下のように修正する。
●Class1.aspx

```csharp
namespace ClassLibrary {
    public class Class1 {
        public Class1() { }
        public string GetKaomoji(int num) {
            switch (num) {
                case 1: return "(´∀｀)";
                case 2: return "(　・ω・)";
                default: return "(・∀・)";
            }
        }
    }
}
```
3) WebApplicationプロジェクトの参照設定で、ClassLibraryを追加する。

#実験と結果
## CodeFile.aspx.csから別DLLのクラスを呼んでみる。
CodeFile.aspx.csを以下のように修正する。
●CodeFile.aspx.cs

```csharp
using System;

namespace WebApplication {
    public partial class CodeFile : System.Web.UI.Page {
        protected void Page_Load(object sender, EventArgs e) {
            var sample = new ClassLibrary.Class1(); //←別DLLのクラスを呼ぶよ!
            lbl.Text = "code file!!" + sample.GetKaomoji(1);
        }
    }
}
```
**→　CodeBehindのようにintellisenseから別DLLのクラス呼び出せた**

##ビルドしてない状態でブラウザでリクエストしてみる
→　エラーとなる。(DLLが見つからないと怒られる)
![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/82737/84a25ca1-71ae-2fd4-f466-103fb0076b84.png)

###ビルドした後、リクエストしてみる
→　正しく表示できる。
![12.PNG](https://qiita-image-store.s3.amazonaws.com/0/82737/a26e93b4-ae83-ba4e-669a-5d8101b5eda7.png)
**→CodeFile属性の場合、CodeBehindと同様に、リクエスト時に参照するクラスライブラリのDLLファイルをbinフォルダに配置しておく必要がある**

#まとめ
1. 別DLL内のクラスの呼び出し方は、CodeBehind属性・CodeFile属性ともに同じである。 
1. CodeBehind属性・CodeFile属性の両方とも、別のDLL内のクラスを参照する場合は、参照するDLLファイルをbinフォルダに配置しておく必要がある。

#関連
[CodeBehind vs CodeFile (1)](http://qiita.com/Mr_K/items/c092295379fe1dda6211)
switch(true) が嫌な理由、説明しにくい

#うおー！
「[switch(true) イディオム考察](http://qiita.com/t_uda/items/1969e09a970d71e4cfd6)」とゆー記事を読んだ。とりあえず、心の中で即答した上で、「うおー説明しにくい！」ってなったので書いておく。「switch(true)って何？」という向きは、リンク先をご覧あれ。

#論理値の比較はやめておけ
私が心の中で即答したのは、「論理値の比較はやめておけ」ということだ。論理値の比較は、そして特にリテラルとの比較はやめておけ、ということだ。つまり、下記みたいなもん全部だ。

```
// 1
if(true === bJudge){}

// 2
if(bFlag === (c===d)){}

// 3
if((a===b)===(c===d)){}

// 4
switch(true){
  case a < 0:
    break;
  case b > c:
    break;
}

// 5
switch(a > b)
  case c > d:
    break;
  default:
    break;
}
```

でもね。「これって、何で？」という純真でおめめキラキラな問いには、答えられそうで根拠が足りない。1なんかは、無意味だからやめれ、とよく言うけど、1回のムダは理由次第で許される場合もある。例えば、あまり自明でない演算子の優先順位を強調するために、言語仕様上は無意味な「念のためカッコ」を付けるのは、可読性の上から許されるだろう。では、なぜコレがいけないのか。うまく答えられない。2なんかは、場合によっては本質だったりする。bFlagがconfigで設定された値で、条件を反転させる機能がある場合だ。でも、心の中でやめれと叫ぶ声がする。3と5はまあ、分かりにくいよね。これは説明の必要は無いだろう。多くの人とは合意できそうな気がする。何となれば、多数決でも良さそうだ。こう書ける場面に遭遇したことはあるけれど、まあ書かん方が良い。

では、4。やめて欲しいけど、やっぱり「なぜ」をうまく主張できない。可読性の話は、多数決で圧勝できそうな時くらいしか主張できない。それなりにたくさんの実例が存在してしまうと、「要は慣れればOK」という主張に反駁できる何かが必要になってしまう。論理的な段階の数とか、依拠する数学的なモデルとか、そういうところに帰着できないと、なかなかうまく主張できた気がしないのだ。

#ループは事情が違うよ
なお、上の例にループが一切無いけど、ループ条件にtrueを入れるのは、真偽値の比較をしているわけではなく、単に評価させているだけなので別に違和感を感じない。特に、while(true)なんかにはキモさは感じない。あくまで「感じない」というだけで、これも明確に説明できるわけじゃないんだけどね。

不思議なもんだね。

でも、感覚的ないやーんって、突き詰めると単なる感情であることが判る時もあるし、無意識ではあるけど真っ当な理由が存在する時もある。だから、考える価値はあると思うんだ。どっちなのか未だわからないので、もう少し考えたい。

#フォールスルーの問題はまた別なんじゃないかな
switchが「ラベル」を選択するのか「ブロック」を選択するのかが言語によって無茶苦茶ぶれるんだよね。そして、直感的に「ブロック」を選択するように感じやすい。ツールによるフォールスルーの表示の仕方も、「ブロック」として認識している表れだ。やっぱり選んでいるのは「ラベル」だとはわかりにくいんだよ。そして、ブロックとして認識していると、各ブロックの順序は交換可能だと錯覚しかねない。まあ、それは避けられたとしても、フォールスルー先のロジックを修正した時、フォールスルーによって到達するパスに対する望ましくない影響を過小評価しがちだ。フォールスルーだと判っていてもね。

あとさ、「ラベル」を選択しているということは、コレってGOTOなんだぜ？
zabbixで指定したマクロの値をマスクする

zabbixのマクロの値をそのまま表示したくない場合にアスタリスク表示する。
とりあえずのやっつけjavascript.

- マクロ作成時はマスクしない。
- すでに作成されている場合はアスタリスク表示になる。

# 0 環境
- centos 6.6 64bit
- zabbix 2.2


# 1. /usr/share/zabbix/js/browser.jsの最後に以下を追加

passwordの箇所にマクロ名を指定
//iのiオプションは大文字、小文字を無視

```js


window.onload = function(){
set_mask();
};

function set_mask (){

var base = document.getElementsByClassName("form_row");
console.log('set_mask');
for(var i=0; i< base.length; i++){
    if ( base[i].children[0].children[0].value.match(/password/i)){
        //console.log(base[i].children[2]);
        base[i].children[2].children[0].setAttribute("type", "password");
    }
}
};


```
iOSアプリのビルドに使ったXcodeのバージョンを調べる方法

昔リリースしたアプリが、どのバージョンのXcodeでビルドされたものなのか調べる必要があったので、その方法をまとめておきます。

# 結論

ipaファイルを解凍すると出てくるInfo.plistの`DTXcode`を見ればOKでした。

# 手順
1. iTunesでダウンロードするなりして、調べたいアプリのipaファイルを手に入れる
2. 念のためコピーしてから、拡張子を.ipaから.zipに変更する
3. ダブルクリックして解凍する
4. Payloadフォルダの中にあるアプリを右クリックして「パッケージの内容を表示」する
5. 中に入っているInfo.plistをダブルクリックで開く（要Xcode）
6. `DTXcode`の値を見る。`0632`だったらXcode 6.3.2でビルドされている

# 備考

アプリをiTunesでダウンロードした場合、iTunesの「マイ App」の中から該当アプリを右クリックして「Finder で表示」でipaファイルを探せます。

# 他の便利そうなキーと値の例
キー|値の例
---|---
BuildMachineOSBuild|14D136
DTCompiler|com.apple.compilers.llvm.clang.1_0
DTPlatformBuild|12F69
DTPlatformVersion|8.3
DTSDKBuild|12F69
DTSDKName|iphoneos8.3
DTXcode|0632
DTXcodeBuild|6D2105
CI用にヘッドレスなAndroidエミュレータを複数台立ち上げるシェルスクリプト


# やりたいこと

* AndroidのUIテストをやりたい。
    * 複数バージョンまとめてテストしたい。
    * CI環境で動かせるようにヘッドレスなエミュレータで実行したい。
    * シェルスクリプトでまとめてかけたら良いな。

いや、まてよ・・・・

* テストを流し込むのは起動待ちした後にしないといけないけどどうやるんだ？
    * adb wait-for-deviceってたしかうまくいかないよな
    * そもそも、複数台立ち上げたときにエミュレータの起動待ちってどうやんの？？


# スクリプト本体

android sdkは事前に導入しておいてください。

```start-multi-emulator.sh

#!/bin/sh

# android-19とandroid-22のエミュレータを作成
echo n | android create avd --force --name emulator-android-21 --target android-21 -c 50M -s WXGA800 --abi armeabi-v7a
echo n | android create avd --force --name emulator-android-19 --target android-19 -c 50M -s WXGA800 --abi armeabi-v7a

# エミュレータを実行
emulator -avd emulator-android-21 -no-skin -no-audio -no-window &
emulator -avd emulator-android-19 -no-skin -no-audio -no-window &

# 起動監視スクリプトを実行
./wait-for-boot.sh
```

```wait-for-boot.sh
#!/bin/sh
 
spinstr='|/-\'
spin_index=0
 
spin_until () {
    while ! $@
    do
        spin_index=$(expr $(expr $spin_index + 1) % 4)
        printf "\r${spinstr:spin_index:1} "
        sleep 0.5
    done
    printf "\r"
}
 
adb_shell_getprop () {
    adb -s $1 shell getprop $2 | tr -d [:space:] # delete the whitespace
}
 
device_actually_ready () {
    [ "$(adb_shell_getprop $1 init.svc.bootanim)" = "stopped" ]
}
 
# エミュレータ一覧取得
adb start-server
DEVICES=$(adb devices | sed "1d;s/[[:space:]].*$//")

# エミュレータ毎に起動監視
for device in $DEVICES
do
    spin_until adb -s $device shell true 2> /dev/null
    # 起動確認するまでまつ
    spin_until device_actually_ready $device
    echo "$device is started"
    sleep 5
    # 起動後にロック解除
    adb -s $device shell input keyevent 82
done
```

# 実行方法

```
$ ./start-multi-emulator.sh
```


# 余談

* CircleCIのVM内にcircle-androidってシェルスクリプトがあってそれが１台分のエミュレータ起動待ち処理を実装してたのでそれを流用しました
* 複数台対応しないのかと問い合わせたところ自分でシェルスクリプト作れよ！って言われたので作りました。
Meteor はじめの一歩 Pert 1

# Meteor はじめの一歩 Pert 1

MeteorはオープンソースのNode.jsとMongoDBを基盤としたプラットフォームです。

今回は、MeteorをLinuxマシンにインストールして使えるところまで紹介してみます。

## インストール

Meteorインストールの前に最新のNodeJSとMongoDBをインストールしておいてください。

Meteorのインストールは簡単です。以下のコマンドを実行します。

```sh
$ curl https://install.meteor.com/ | sh
Meteor 1.1.0.2 has been installed in your home directory 
```

ホームディレクトリの~/.memteorにインストールされるようです。

以下のようにバージョンが表示されればインストール成功です。

```sh
$ meteor --version
Meteor 1.1.0.2
```

## デモアプリ

Meteorにはいくつかのデモアプリが用意されているようです。
ここでは、その中のTODOアプリをセットアップしてみます。

```sh
$ meteor create --example todos
todos: created.
```

meteor createした後に出力される説明とおりにtodosディレクトリへcdして、単にmeteorと打つだけ。

```sh
$ todos
$ meteor
```

そうすると、必要なパッケージ、バンドル、CSS、JSが用意され、Node Serverが起動してアプリをブラウザで確認することができます。

```sh
http://localhost:3000
```

![todos01.png](https://qiita-image-store.s3.amazonaws.com/0/11224/c7ac2deb-b296-180a-715c-41d54ada8a0e.png)


洗練されたUIです。タスク内容もセンスありです。

すでに動くアプリなので、新しいタスクリストを作成したりして、動作を確認してみましょう。

[Meteor はじめの一歩 Pert 2](http://qiita.com/lemonjp/items/1d643e6f12f7255a116a)
さくらレンタルサーバ（スタンダード）にvimいれたった

##vim入れる前に、下準備

表題入る前に、一先ずbashに変えておく。

```
chsh -s /usr/local/bin/bash
```

実行するとパスワードを聞かれるので、パスワードを入力。

ついでに、ファイルを２つ作っておく

```
touch ~/.bash_profile
touch ~/.bashrc
```

.bash_profileの中身を書く

```
vi ~/.bash_profile
if [ -f $HOME/.bashrc ]; then
    source $HOME/.bashrc
fi
```

.bash_profileの中はこれだけ書いておいて、あとは.bashrcにガリガリ書いていく




.bashrc の中身を書く
ここの中身は個人の好みなので、参考にならないかも。
一先ず、赤帽系の僕は、llが無いと落ち着かないので、alias張っておく。

```
vi ~/.bashrc
alias ll='ls -lG'
alias la='ls -laG'
```

##vimのインストール

1.コンパイル用のフォルダを作成する

```
mkdir -p $HOME/local/src
```

2.作ったフォルダへ移動

```
cd $HOME/local/src
```

3.vim本体をダウンロードしてくる

```
wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
```

4.展開

```
tar jxf vim-7.4.tar.bz2
```

5.ディレクトリ移動

```
cd vim74
```

6.パッチをダウンロードしてくるフォルダを作成する

```
mkdir patches
```

7.ディレクトリ移動

```
cd patches
```

8.パッチのダウンロード
※以下、URLにアクセスして、最終パッチの番号を控えておく。
　ftp://ftp.vim.org/pub/vim/patches/7.4/
※結構数あるので、時間かかる

```
curl -O 'ftp://ftp.vim.org/pub/vim/patches/7.4/7.4.[001-738]'
```
2015.06.16 時点での最終パッチは738


9.ディレクトリ移動（１階層上へ）

```
cd ..
```

10.パッチの適用

```
cat patches/7.4.* | patch -p0
```

11.configure

```
./configure --enable-multibyte --enable-xim --enable-fontset \
>--with-features=big --prefix=$HOME/local
```

12.make

```
make
```

13.make install

```
make install
```

14..bashrcに追記
※<id>は、適宜変更
 /home/<id> は $HOME でもいけるかも。

```
vi ~/.bashrc
alias vim='/home/<id>/local/bin/vim'
alias vi='/home/<id>/local/bin/vim'
```

15..bashrcを再読み込み

```
source ~/.bashrc
```

16.vim起動確認

```
vim
```

インストールしたvimのバージョンが表示されればOK。
表示されない場合、aliasの設定を今一度確認。

多分、上から順番にやっていくとうまく入るはず。

参考：
http://sekki.org/wordpress/?p=413
http://www.hazama.nu/t2o2/archives/002696.shtml
elastic beanstalk環境をurlから解決する

elastic beanstalkを使ってダウンタイムなしの更新を実現するときはswap urlを使うのが一般的なようです。
*参考: [Deploying a new Application Version with Zero Downtime](http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.CNAMESwap.html)*

しかし、[eb deployコマンドはurlではなく環境名を指定します](http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb3-deploy.html)。

swapをすると当然、特定のurlに関連付けられた環境が入れ替わります。
人間の関心はelastic beanstalkの環境よりもurlのほうに向いているので（本番、staging用のurlなど）、更新したいurlがどちらの環境に向いているかelastic beanstalkコンソールなどから確認する手間がありました。

そこで、

```
aws elasticbeanstalk describe-environments --application-name $APP_NAME --environment-names $ENV1 $ENV2 | python -c  "exec(\"import json,sys\\nobj=json.load(sys.stdin)\\nfor env in obj['Environments']:\\n if env['CNAME'] == '$URL': print env['EnvironmentName']\")"

```

```
eb deploy $(上記のやつ)
```

という感じにしました。
Swiftにおける関数定義の基本

#inout
Swiftにはポインタという概念がありませんが、inoutを使うことで、関数の引数をポインタとして受け取り値を直接いじるCのような書き方ができます。
inoutを使用した関数の呼び出し方は、普通の関数と違って以下のように実引数の変数の前に&をつけて呼ぶことになります（ただし、&はC言語と同じようにアドレスを示すものではありません）。

```swift
func square(inout x:Int, inout y:Int) {
    x = x * x
    y = y * y
}

/* 以下呼び出し側 */
var x = 2
var y = 4
square(&x, &y) // x=4, y=16になる
```

しかし、Swiftはタプルを使うことによって、返り値を複数指定できるため、inoutを使わなくても複数の値を返す関数を定義することができます（引数に構造体を指定することでも、複数の値を返すことができます）。

```swift
func square(x:Int, y:Int) -> (Int, Int) {
    return (x * x, y * y)
}

/* 以下呼び出し側 */
var x = 2
var y = 4
var res = square(x, y) // res.0=4, res.1=16になる
```

#外部引数名
Swiftでは、関数を呼び出す際に引数の意味が伝わるよう、引数にキーワード（外部引数名）をつけることができます。

```swift
// 以下のように外部引数名（widthとheight）をつけることができる。
// wとhを内部引数名と呼ぶ。
func area(width w:Int, height h:Int) -> Int {
    return w * h
}

/* 以下呼び出し側 */
// 呼び出し側の実引数が何を表しているのかが明確になる。
let res = area(width: 5, height: 6)
```

また、以下のように仮引数の前に`#`を書くことで、内部引数名と外部引数名を同じにすることもできます。

```swift
func area(#width:Int, #height:Int) -> Int {
    return width * height
}

/* 以下呼び出し側 */
let res = area(width: 5, height: 6)
```

#引数に用いるvar
Swiftでは、基本的に関数の引数の値を関数内で変更することができません。
しかし、仮引数の前に`var`を書くことで変更可能になります。

```swift
func area(var width:Int, var height:Int) -> Int {
    // 引数の値を変更できる。
    width += 1
    height += 1
    
    return width * height
}

/* 以下呼び出し側 */
var w = 5
var h = 6
let res = area(w, h) // res=42
// w, hはそれぞれ5, 6のまま
```

同様に`let`を書くこともできますが、これは何も書かないときと同じなので、変更しないことを明示的に示したいときに使います。

#オーバーロード
Swiftでは、以下のいずれかが異なれば、同名の関数を定義することができます。

- 引数の個数
- 引数の型
- 返り値の型
- 外部引数名

したがって、以下のすべてを定義してもコンパイルエラーになりません。

```swift
func area(w:Int, h:Int) -> Int {
    ...
}

// 引数の個数が異なる
func area(a:Int, b:Int, h:Int) -> Int {
    ...
}

// 引数の型が異なる
func area(w:Double, h:Double) -> Int {
    ...
}

// 返り値の型が異なる
func area(w:Int, h:Int) -> Double {
    ...
}

// 外部引数名が異なる
func area(width w:Int, height h:Int) -> Int {
    ...
}

// 外部引数名が異なる
func area(hoge w:Int, foo h:Int) -> Int {
    ...
}
```

ただし、呼び出し側で引数や返り値の型を意識する必要があります。

```swift
var w = 5
var h = 6
// let res = area(w, h) コンパイルエラー
// area関数にはIntを返すものとDoubleを返すものとがあるため、
// resの型がわからないとどの関数を呼べばいいかわからない

// 型をちゃんと指定する
let res : Int = area(w, h)
```
FactoryGirl周りでrake db:migrateがこける場合

`be rake db:migrate RAILS_ENV=development`が以下エラーを吐いてこけるので原因を調査。  

```
ActiveRecord::StatementInvalid: Mysql2::Error: Table 'polaris_db2.leveled_experiences' doesn't exist: SHOW FULL FIELDS FROM `leveled_experiences`
```

## workaround
取り敢えずdevelopmentからfactory_girl_railsのgemを外すだけでdb:migrateは通るようになった

## 根本原因は？

この[回答](https://github.com/thoughtbot/factory_girl_rails/issues/20)を引用すると、{}でくくり遅延評価属性を利用しないといけないものがあったみたい、もう少し基礎知識つけないとなぁ

```lang:
Factory.define :hat do |h|
  h.person { Factory(:person) }
end
```

参考
[RSpecにおけるFactoryGirlの使い方まとめ](http://qiita.com/muran001/items/436fd07eba1db18ed622#2-5)

[Railsのrake db:xxxコマンドでtable doesn't existのエラーが出る際の対処](http://qiita.com/k_yagisan9/items/ec0c26abbe82cf656ed2)

[FactoryGirl screws up rake db:migrate process](http://stackoverflow.com/questions/12423273/factorygirl-screws-up-rake-dbmigrate-process)
FxCop / StyleCop のカスタムルールを作成する

コーディングガイドラインの遵守のために自動チェックを導入しようとしてちょっとはまったのでメモ。

# FxCop のカスタムルールの作り方

http://koty.hatenablog.com/entry/20110316/1300281453 とかを参照して適当に作る。
ただし、いろいろめんどい決まりごとがある。

* BaseIntrospectionRuleを継承したクラスのコンストラクタで、基底クラスのコンストラクタを呼ぶときの第2引数に「Namespace.RuleXMLFilename」を渡してやる
* x86でコンパイルする
* Framework バージョンはわかんない。適当に4.0でいけたような・・・
* 出来上がった DLL を FxCop のディレクトリの下の Rules 以下に置く

1番目と2番目がなかなかトラップ。

# StyleCop のカスタムルールの作り方

http://scottwhite.blogspot.jp/2008/11/creating-custom-stylecop-rules-in-c.html とかを参照して適当に作る。
ただし、こっちもトラップが色々。

* ルールを記載した XML ファイルの名前を、クラス名と一致させる
* Framework バージョンは3.5にする
* Any CPUでビルドする

このうちの3つ目がわからなくてはまった。Program Files(x86)にインストールするんだから、x86 かと思っちゃうじゃないか・・・
開発時の動作確認に、Dockerを利用してみたメモ

dockerのバージョンは1.6.2。
phpプロジェクトのディレクトリ構成は以下。

```
+ ./
  + src/
    - index.php
  + conf/
    - php.ini
  + vendor/
  - composer.json
  - composer.lock
  - composer.phar
```

以下のコマンドで動作確認まで一気にできる。

```
$ brew install boot2docker
$ boot2docker init
$ boot2docker up
$ eval `boot2docker shellinit`
$ docker pull php:5.6-apache
$ docker run \
    --rm \
    --name php \
    -p 80:80 \
    -v `pwd`/src/:/var/www/html/ \
    -v `pwd`/vendor/:/var/www/html/vendor/ \
    -v `pwd`/conf/:/usr/local/etc/php/ \
    php:5.6-apache
```

後は `boot2docker ip` に対して、ブラウザからアクセスすればOK。
公式イメージはとてもありがたいですね。
Mac OSXにLaravel 5.1をインストール記録

phpのbuild-inサーバーを遊びたいということで、Mac OS XにLaravelをインストールしてみました。composerのインストールのところから、localhostが確認されるまでの過程を記録しました。

ちなみに、php 5.5.20が入っている前提で話を進みます。
もし、phpともろもろのインストールについて気になる方は↓のリンクへどうぞ
http://qiita.com/edisonthk/items/8b015d5bd431aefaf411

![スクリーンショット 2015-06-16 午後7.06.24.png](https://qiita-image-store.s3.amazonaws.com/0/60849/3b4b14ac-c6dc-c402-9289-76cbe88c78bb.png)

### Step 1 : Composerをインストール

まず、この[ページ](https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx)の通りにcomposerをダウンロードします。

```
curl -sS https://getcomposer.org/installer | php
```

`composer.phar`というのはダウンロードされました。次に、環境変数に登録したフォルダの場所を確認します。

```
echo $PATH
```

![スクリーンショット 2015-06-16 午後7.11.12.png](https://qiita-image-store.s3.amazonaws.com/0/60849/429b0cfb-7a13-b378-3fdb-e57d860887d5.png)

`/usr/local/bin`が環境変数のフォルダになっていることがわかりました。そのフォルダに先ほどダウンロードした`composer.phar`を移動します。

```
mv composer.phar /usr/local/bin/composer
```

これで、`composer -V`を実行してみて、次のような結果が得られたらインストールが完了しました。

![スクリーンショット 2015-06-16 午後7.17.07.png](https://qiita-image-store.s3.amazonaws.com/0/60849/ed904c89-7eee-2c28-5fe7-59b89b7c868f.png)

### Step 2 : Laravelをインストール

composerでlaravelをインストールします。

```
composer global require "laravel/installer=~1.1"
```

最後に、composerのvendorフォルダを環境変数にsymbolicリンクを作りましょう。
```
sudo ln -s $HOME/.composer/vendor/bin/laravel /usr/bin/laravel
```

### Step 3 : Laravelプロジェクトを始めましょう

次のmysiteというLaravelプロジェクトを作成します。

```
laravel new mysite
```

最後に、サーバーを起動してブラウザでlocalhost:8000を確認しましょう。
```
php artisan serve
```

![スクリーンショット 2015-06-16 午後7.46.01.png](https://qiita-image-store.s3.amazonaws.com/0/60849/35853174-39af-5372-42bf-241be814a939.png)

### 補足

もともとの予定はYosemiteに環境変数を登録しようと思いましたが、exportの場合はテーミナルのsessionが切れると、登録したものがなくなります。Googleですこし探してみましたが、なかなかいいアプローチが見つかりませんでした。もし、いいリンクを持っている方がいればぜひ教えてください。
deku with JSX を試してみた


[dekujs/deku](https://github.com/dekujs/deku "dekujs/deku")

プロジェクトはここ。
[mizchi-sandbox/deku-test](https://github.com/mizchi-sandbox/deku-test "mizchi-sandbox/deku-test")

サンプルを見ながら適当に書いた。

```js
// define component
let Button = {
  propTypes: {
    kind: {
      type: 'string',
      expects: ['submit', 'button']
    }
  },
  render(component) {
    let {props, state} = component;
    return <button class="Button" type={props.kind}>{props.children}</button>
  },
  afterUpdate(component, prevProps, prevState, updateState) {
    let {props, state} = component;
    if (!state.clicked) {
      updateState({ clicked: true })
    }
  }
};

// use
import {tree,render,renderString, element} from 'deku'
let app = tree(
  <Button kind="submit">Hello World!</Button>
);
//server side rendering
console.log(renderString(app));
// render(app, document.body)

```


[deku/jsx.md at master · dekujs/deku](https://github.com/dekujs/deku/blob/master/docs/guides/jsx.md "deku/jsx.md at master · dekujs/deku") を参考に、`.babelrc` に次のような設定を書く。

```
{
  "jsxPragma": "element"
}
```

これでJSXリテラルのコンパイル後のReact.createElementがelementに変換される。この場合、elementはスコープよりdeku.elementを参照する。

## サイズ

似たようなコードをReactでビルドすると130kbほどになるのだが、dekuだとどうなるか。

browserify with babelifyで圧縮したものをさらにuglifyjsにかけてみた。

index.js -> bundle.js -> bundle.min.js

```
-rw-r--r--   1 mizchi  staff    29B  6 16 19:00 .babelrc
-rw-r--r--   1 mizchi  staff    73K  6 16 19:07 bundle.js
-rw-r--r--   1 mizchi  staff    24K  6 16 19:12 bundle.min.js
-rw-r--r--   1 mizchi  staff   637B  6 16 19:05 index.js
-rw-r--r--   1 mizchi  staff   442B  6 16 19:07 package.json
```

これだとそこそこサイズ少なくてReactからの移行も少なくてよいのではないか。

Reactがデカくて採用しにくい！って人はここらへん挑戦するといいと思います。
goでLチカの練習

スペースキーを押すとグリーンの点滅からレッドの点滅に変わる。

```
package main
import(
	"fmt"
	"time"
	"syscall"
)
var ch chan int;
func A() {
	for {
		c := <- ch
		if c == 1 {
			time.Sleep(500 * time.Millisecond)
			fmt.Println("green on")
			time.Sleep(500 * time.Millisecond)
			fmt.Println("green off")
		}
	}
}
func B() {
	for {
		c := <- ch
		if c == 0 {
			time.Sleep(500 * time.Millisecond)
			fmt.Println("red on")
			time.Sleep(500 * time.Millisecond)
			fmt.Println("red off")
		}
	}
}
func C() {
	for {
		if GetKeyState(0x20) < 0 {
			//fmt.Println("sw on")
			ch <- 1
		} else {
			//fmt.Println("sw off")
			ch <- 0
		}
		time.Sleep(200 * time.Millisecond)
	}
}
var moduser32 = syscall.NewLazyDLL("user32.dll")
var procGetKeyState = moduser32.NewProc("GetKeyState")
func GetKeyState(nVirtKey int) int16 {
	ret, _, _ := procGetKeyState.Call(uintptr(nVirtKey))
	return int16(ret)
}
func main() {
	ch = make(chan int)
	go A()
	go B()
	go C()
	for {
		<- ch
	}
}
```