OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EC2のSecurity GroupにSSHのインバウンドルールを追加・削除するスクリプト

# 概要
IPアドレスが変わる度にAWSのGUIで変更するのも面倒なので、自動でインバウンドルールを追加・削除スクリプト為のBashスクリプトを用意。
register/unregister関数の第1引数はSecurity GroupのGroupIdでは無く、GroupNameを指定する必要有り。また、unregister関数でSSHポートに登録されているIPは全て削除されてしまうので、register関数で固定IPの登録を行う事を忘れないように。

# スクリプト

~~~bash
#!/bin/sh

# Global variables
aws_profile='aws-profile'
aws_region='us-west-2'
ssh_protocol='tcp'
ssh_port=5252

function unregister () {

    sg_name=$1

    # Retrieve security groups
    sg_json=$(\
    	aws ec2 describe-security-groups \
    	--profile $aws_profile \
    	--region $aws_region \
        --query 'sort_by(SecurityGroups[?GroupName==`'${sg_name}'`].{name:Tags[?Key==`Name`].Value|[0],sg_id:GroupId,cidr:IpPermissions[?ToPort==`'${ssh_port}'`].IpRanges[].CidrIp},&name)' \
    )
    sg_json_len=$(echo $sg_json | jq length)

    for (( i=0; i < $sg_json_len; i++ )) {

    	name=$(echo $sg_json | jq -r .[$i].name)
    	sg_id=$(echo $sg_json | jq -r .[$i].sg_id)
    	cidrs_json=$(echo $sg_json | jq -r .[$i].cidr)
        cidrs_json_len=$(echo $cidrs_json | jq length)

        # Unregister
        for (( j=0; j < $cidrs_json_len; j++ )) {

            cidr=$(echo $cidrs_json | jq -r .[$j])
            echo "Security Group    : $sg_name"
            echo "Security Group ID : $sg_id"
            echo "CIDR              : $cidr"
            echo
            aws ec2 revoke-security-group-ingress --profile $aws_profile --group-id $sg_id --protocol $ssh_protocol --port $ssh_port --cidr $cidr

        }
    }
}

function register () {

    sg_name=$1
    cidr=$2

    # Retrieve security group id
    sg_id=$(\
    	aws ec2 describe-security-groups \
    	--profile $aws_profile \
    	--region $aws_region \
        --query 'SecurityGroups[?GroupName=='\'${sg_name}\''].GroupId|[0]' \
        --output text
    )

    # Unregister
    echo "Security Group    : $sg_name"
    echo "Security Group ID : $sg_id"
    echo "CIDR              : $cidr"
    echo
    aws ec2 authorize-security-group-ingress --profile $aws_profile --group-id $sg_id --protocol $ssh_protocol --port $ssh_port --cidr $cidr

}

echo
echo "######################################################"
echo "# Unregister Security Group"
echo "######################################################"
echo

# Unregister all ip addresses
unregister 'hostname-dev-ec2-sg'
unregister 'hostname-stg-ec2-sg'
unregister 'hostname-prd-ec2-sg'

echo
echo "######################################################"
echo "# Register Security Group"
echo "######################################################"
echo

# Register static ip addresses
ipaddr_static='XXX.XXX.XXX.XXX'
register 'hostname-dev-ec2-sg' $ipaddr_static'/32'
register 'hostname-stg-ec2-sg' $ipaddr_static'/32'
register 'hostname-prd-ec2-sg' $ipaddr_static'/32'

# Register dynamic ip addresses
ipaddr_dynamic=$(curl -s http://checkip.amazonaws.com/)
register 'hostname-dev-ec2-sg' $ipaddr_dynamic'/32'
register 'hostname-stg-ec2-sg' $ipaddr_dynamic'/32'
register 'hostname-prd-ec2-sg' $ipaddr_dynamic'/32'
~~~
Node.jsでリアルタイム為替データを取得してみる Oanda編

今回はOandaというサービスを使って、データを取得してみます。OandaはFX業者なのですが、簡単な登録のみでREST APIを使用でき、Node.jsから為替データを取ることができます。

## 登録
まずはOandaより、デモ口座を開設します。
https://www.oanda.jp/trade/practice/openaccountnew.do?p=0
![スクリーンショット 2016-02-08 12.25.45.png](https://qiita-image-store.s3.amazonaws.com/0/36652/a59bd509-2293-07a0-b829-e3d603116890.png)

面倒な入力項目はなく、メアドと電話番号だけで大丈夫です。電話番号を聞けれますが、SMS確認等はありません。完了すると登録したアドレスにIDとPWが送られてきます。
![スクリーンショット 2016-02-08 12.29.20.png](https://qiita-image-store.s3.amazonaws.com/0/36652/656e01ea-0a1f-7585-1b21-0b3332545b5a.png)
それをデモ口座ログインページに貼り付けて、ログイン。

## アクセストークンをげっちゅ
REST APIを使用するには、アクセストークンが必要です。まずはaccount_idをメモしておきます。この数字ですね。次にアクセストークンをゲットします。右下のリンクからどうぞ。
![スクリーンショット 2016-02-08 12.32.32.png](https://qiita-image-store.s3.amazonaws.com/0/36652/d9a2a1fa-bd13-8b18-8047-06df48d73a80.png)
から、発行ボタンをクリック。
![スクリーンショット 2016-02-08 12.35.33.png](https://qiita-image-store.s3.amazonaws.com/0/36652/13441060-11ed-4fc8-92ee-3089d93cf38c.png)
このアクセストークンをメモっておいてください。これで必要な情報は手に入りました。

## リアルタイムで株価データを取得
今回は[oanda-adapter](https://github.com/Cloud9Trader/oanda-adapter)というサードバーティライブラリを使います。RESTをラップしてくれている便利なツールです。今回は紹介しませんが、これだけで購買から過去データ取得までできます。
```
npm install oanda-adapter --save
```

```main.js
var OANDAAdapter = require('oanda-adapter');
var ACCESS_TOKEN = 
'a837f092...'
var ACCOUNT_ID = '1234567'
var client = new OANDAAdapter({
    // 'live', 'practice' or 'sandbox'
    environment: 'practice',
    // Generate your API access in the 'Manage API Access' section of 'My Account' on OANDA's website
    accessToken: ACCESS_TOKEN,
});

client.subscribePrice(ACCOUNT_ID, 'USD_JPY', function (tick) {
    console.log(tick)
}, this);
```
実行するとこんなかんじです。
![スクリーンショット 2016-02-08 13.24.32.png](https://qiita-image-store.s3.amazonaws.com/0/36652/882dbf80-0394-d9cd-0601-9b14b2642775.png)

コードをgithubにあげてありますので、そちらもあわせてご覧ください。
https://github.com/tkshi/oanda-sample-node.js
それでは、快適な為替ライフを。
他の人が作業中のブランチにpull Requestを送る

いままでずっとやり方をミスっていたのでメモ

# 前提
Aさんが作業していた`feature/hoge`ブランチがあるとする
このブランチはmasterよりだいぶ遅れている
このブランチに自分の作業分を足したい

# コマンド
1. いつものコマンド

```
 git checkout master
 git pull origin master
```

2. Aさんが作業しているブランチに切り替える

```
 git checkout -b feature/hoge origin/feature/hoge
```

3. AさんにPull Requestを送るため、ここからさらにブランチを切る

```
 git checkout -b feature/hoge_fuga
```

# 間違っていたこと
2の作業の時に

```
 git checkout -b feature/hoge
```

としていた。
これだとブランチの作成とチェックアウトを行ってしまうので、
masterからの遅れが差分として表示されてしまう
MySQL Workbench にメモリを食いつぶされた話と解決法

## 概要
MySQL workbenchを使っている際に、クエリ内に間違えて制御コードが入ってしまい
急にメモリを使い尽くしてPCがフリーズした。
さらに困ったことに、問題のクエリが auto savedで保存されてしまったため
コネクションをオープンするたびに毎回フリーズという最悪な状況に・・・

## 環境
Windows 7 Home Premium SP1
MySQL Workbench 6.2.x CE

※[追記] 6.3.6 build 511CE (64bit) 版で発生しなくなっているのを確認しました。

## 原因
クエリ内に制御文字が入ってしまった。
MySQL Workbench上の表示では、`ENQ`、文字コードは`0x05`
> `ENQ`←Ctrl+Eで入った模様

## 対処方法
ます、フリーズしてしまったらどうにかしてPCを再起動なりMySQL workbenchを落とすしかないです。
自分の場合は何とか再起動しました。

PCが正常に動くようになったら、workbenchを修正します。
auto saved にクエリが残っている限りおそらく復旧はムリなので該当の設定ファイルを探して削除しました。

> auto saved 情報の保存場所
`C:\Users\[ユーザー名]\AppData\Roaming\MySQL\Workbench\sql_workspaces\[コネクション名]`
ディレクトリの中に、下記の形式でファイルがいくつか入っています。
{9B4C8145-D1CC-431D-8911-45B0A2C9A644}.info
{9B4C8145-D1CC-431D-8911-45B0A2C9A644}.scratch

.scratch のほうにクエリ文が文字列入っているので、テキストエディタでひとつずつ開き該当のクエリを探します。
見つかったら、 .info と .scratchをセットで削除します。
※探すのが面倒な場合は、ディレクトリ内のファイルを全て消してもOKでした。

MySQL workbenchを起動し正常にコネクトできることを確認して終了です。
Hackaday.io > Skullの意味 > likeのようなもの?

https://hackaday.io/projects

hackaday.ioで髑髏のマークがある。Skullと呼ぶらしい。

Skullの機能がわからなかったが、以下にあった。

http://hackaday.com/2014/02/18/hackaday-launches-our-own-hosting-site/
> Okay, what does the “Jolly Wrencher” button do?
And what does “Most Skulled” mean?

...
> The Jolly Wrencher is a kind of ‘like’ button. Projects with the most skulls (jolly wrenchers) get featured.

dislike ボタンかと最初思っていた。likeの方だった。
AWS lambda で自前ライブラリを組み込む

aws lambda node.jsで自前ライブラリを組み込む方法。
普通に以下のような感じのフォルダ構成にしてモジュールと一緒にzip化すればよいです。

フォルダ構成

```
project
 - index.js
 - libs/lib1.js
 - configs/config.js
```

ソース上では以下のような感じに定義

```js:index.js

var lib1 = require('./libs/lib1');
var config = require('./libs/config');

```

ちなみにlambadの設定でhandlerを変えれば入り口変わるのでモジュールも一つにまとめて開発できると思う。

あとは開発環境と本番環境の切り分けをコンフィグでやれればDB等のアクセスを変えることもできるけど、
なんかメタ情報とか入れれないのかな・・・
非表示の要素があるjQuery UI Sortableは重い

jQuery-ui便利ですよね。
jQuery-uiのsortableで、順番を入れ替えられる様に実装していたのですが、検証中、チェックボックスのオンオフで一部要素を非表示にする機能と組み合わせるとドラッグが重いと言うチケットが回ってきました。

原因を調査した所、sortable.jsで最初に起動する_mouseStartメソッドの中で呼ばれているrefreshPositionsメソッドの以下の場所が重い用でした。

```javascript
			if ( !fast ) {
				item.width = t.outerWidth();
				item.height = t.outerHeight();
			}
```

非表示の要素をouterWidth()すると、他のより重い模様。
実際、以下の様な検証HTMLを作って確かめて見ると顕著でした

```html
<html lang="ja">
    <head>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
        <script>
$(function () {
    var display = $("#display");
    var hide = $("#hide");
    hide.hide();
    console.time("display");
    for ( var i = 0; i < 1000; i++ ) {
        display.outerHeight();
    }
    console.timeEnd("display");
    console.time("hide");
    for ( var i = 0; i < 1000; i++ ) {
        hide.outerHeight();
    }
    console.timeEnd("hide");
});
        </script>
    </head>
    <body>
        <hide id="display"> テスト </div>
        <div id="hide"> テスト </div>
    </body>
</html>
```

idがdisplayの要素は表示したまま、idがhideの要素は非表示にしたまま1000回ずつouterHeightを呼び出した所

display: 34.49ms
hide: 419.26ms

という結果になり、10倍の速度差が有りました。

回避方法思いつかなかったので、sortable.jsを以下の様にして対応しました。

```javascript
            if (!fast) { 
                if ( t.is(':visible') ) {
                    item.width = t.outerWidth();
                    item.height = t.outerHeight();
                } else {
                    item.width = 0;
                    item.height = 0;
                }
            }
```

何か良い回避方法があればご指摘ください。
Draw tool > Inkscape

```txt:動作確認
Windows 7 pro
```

絵心はないが、ロゴを作るとしたら、過去に使ったことがあるこのあたりか。
https://inkscape.org/ja/


Save asで選択できる`Inkscape SVG`にしておけば、編集内容が保持できたと思う（記憶違いかもしれない）。
MySQL Ver4.x.x（ver４系列）であいまい検索（LIKE '%...%'）できない（日本語・漢字・カタカナ）検索挙動が正確でない問題を解決

# 状況（環境）
- レンタルサーバー環境下で`.ini`も`.conf`変更できない
- phpMyAdminでの操作のみ権限がある。（CUIでアクセスや変更ができない）
- レンタルサーバー環境下でバージョンアップを期待できない
- IaaS（AWS等）に移行計画を期待できない

# 事象
- 日本語（漢字・カタカナ）をLIKEとワイルドカード（％）を利用した時の検索挙動がおかしい。

``` 
(例)
カラム名：name
　　　　：name_kana

データ　：name='女性テスト'
　　　　：name_kana='ジョセイテスト'
```
<dl>
  <dt>name LIKE '%女性%' OR name_kana like '%女性%';</dt>
  <dd>→検索OK</dd>

  <dt>name LIKE '%女性テスト%' OR name_kana like '%女性テスト%';</dt>
  <dd>→検索OK</dd>

  <dt>name LIKE '%ジョセイ%' OR name_kana like '%ジョセイ%';</dt>
  <dd>→検索OK</dd>

  <dt>name LIKE '%テスト%' OR name_kana like '%テスト%';</dt>
  <dd>→検索できない</dd>

  <dt>name LIKE '%セイ%' OR name_kana like '%セイ%';</dt>
  <dd>→検索できない</dd>
</dl>

# 対策
- `LIKE BINARY`を使用する

```
name LIKE '%テスト%' OR name_kana like '%テスト%';
```

これで解決します。

- ほかは照合順序などを`utf8_general_ci`などにする方法をお試しください。

以上です。
locomotiveCMSの`wagon push`時に`certificate verify failed`エラーが発生する時の対処法

# Problem

サイトをSSL化した後に、wagon pushコマンドを実行すると、以下のようなエラーが発生するようになった。

```
$ bundle exec wagon push staging
unable to get an API token: SSL_connect returned=1 errno=0 state=error: certificate verify failed
```

# Solution

## config/deploy.ymlにsslオプションを追加

```yaml
staging:
  host: hoge.huga
  api_key: xxxxxx
  ssl: true  # 追加
```

## bin/wagonスクリプトを作成

```rb
#!/Users/hoge/.rbenv/versions/2.1.1/bin/ruby
#
# This file was generated by RubyGems.
#
# The application 'locomotivecms_wagon' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'rubygems'

# sslの`certificate verify failed`を回避する
# 参考: http://d.hatena.ne.jp/komiyak/20130508/1367993536
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

version = ">= 0"

if ARGV.first
  str = ARGV.first
  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
    version = $1
    ARGV.shift
  end
end

gem 'locomotivecms_wagon', version
load Gem.bin_path('locomotivecms_wagon', 'wagon', version)
```

## デプロイ実行

```
$ bundle exec ./bin/wagon push staging
```

# 参考

- [エラー：OpenSSL::SSL::SSLError SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed](http://d.hatena.ne.jp/komiyak/20130508/1367993536)
Michael Abrash Interview 7

http://qiita.com/7of9/items/8a16ed313d63cd44dd7f
の続き

Michael Abrash Interview:
https://www.youtube.com/watch?v=a7My8zbDNRI&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4&index=2)

(3:11-)
In this industry, it's like a shark. You just keep moving. And so you really keep teaching yourself <font color=blue>that things</font>.

(3:19-)
Until recently, I would say the most difficult, and challenging, interesting one was Quake. Because so many different things had to be solved simultaneously.

(3:27-)
Six degree of freedom, and 3D, internet persistant server, scripting languages. All that stuff didn't exist yet. I mean heck, mouse got invented <font color=red>XXX1(for play?)</font>. Nobody really knew about <font color=blue>any of this</font>.

5分のリスニングとタイピング終わり。

赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

今回は赤文字は少なかった。と思っても聞き間違いはあるかも。

<hr>
ずっと動き続ける魚について上記ではsharkと僕には聞こえた。
以下が見つかった。

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1111739146
Dockerで簡単にSlackライクなmattermostを動かしてみよう！

mattermostというSlackライクなOSSのチャットツールを試してみました。

Slackを使いたいけど、企業として、センシティブな情報をどうしてもホスティングなサービスには公開できない。。
という方々にとっては一つの選択肢になるのではないでしょうか。

手動で今回は構築しましたが、Dockerのimageを作りこめば、もろもろ自動化や冗長化もできそうです。


# 1. mattermostのimageを取得する

```bash
docker pull mattermost/platform
```

```bash
docker run --name mattermost-dev -d --publish 8065:80 mattermost/platform
```


# 2. GitLab側で、mattermostをApplicationとして設定する

## Applicationの登録

以下のページを参考にしました。

https://github.com/mattermost/platform/blob/6ab7df3335d414ecf864972c817e3b37b3b01abf/doc/integrations/Single-Sign-On/Gitlab.md

GitLab > Admin > Applications で、新しいApplicationを追加して、IdとSecretを発行します。

その際に、利用するRedirectURlは

${あなたのGitLab}/signup/gitlab/complete

となります。


# 3. mattermost側での設定

コンテナに`/bin/bash`ではいって、

```bash
docker exec -it mattermost-dev /bin/bash
```

設定ファイルを編集します。`/mattermost/config/config.json`ではないのでご注意ください。

```bash
vi /config_docker.json
```

```/config_docker.json
    "GitLabSettings": {
        "Enable": false,
        "Secret": "取得したSecret",
        "Id": "取得したId",
        "Scope": "",
        "AuthEndpoint": "${あなたのGitLab}/oauth/authorize",
        "TokenEndpoint": "${あなたのGitLab}/oauth/token",
        "UserApiEndpoint": "${あなたのGitLab}/api/v3/user"
    },
```

## mattermostコンテナを再起動

設定ファイルを編集し終わったら、コンテナから抜けて、mattermostコンテナを再起動します。

```
docker restart mattermost-dev
```

# 4. Webブラウザでログインできる確認してみる


コンテナを作成したURLにウェブブラウザでアクセスしてみました。

![mattermost_login.png](https://qiita-image-store.s3.amazonaws.com/0/49547/3c879018-b24a-3bd1-5cae-d19cbe945e8e.png)

GitLab Accountでログインできそうなボタンが追加されてますね！

![mattermost_login2.png](https://qiita-image-store.s3.amazonaws.com/0/49547/67a804fb-b264-6ec6-069c-06477421f87b.png)


チーム名を入力して、ボタンを押下すると、、、

![mattermost_login3.png](https://qiita-image-store.s3.amazonaws.com/0/49547/70bfc5c5-11f2-7745-7642-74abf66eb6ed.png)

いけました！

![matter_most_home.png](https://qiita-image-store.s3.amazonaws.com/0/49547/70570c34-1f20-e644-04c8-de10cc2f73ff.png)

日本語入力や改行もできるし、よりSlackっぽくなってきましたね。

Dockerでお手軽にできるのも魅力的ですね。

以上となります。
jupyter notebook (IPython notebook) でapache Sparkを使う

# 結論

次のコマンドを実行すれば良い。

`PYSPARK_PYTHON=/Users/username/.pyenv/shims/python PYSPARK_DRIVER_PYTHON=ipython PYSPARK_DRIVER_PYTHON_OPTS="notebook" ~/somewhere/spark-1.5.2/bin/pyspark --master local[4]`

# 前提
- jupyter notebook と Apache Spark がインストールされている

# 起動方法

## 結論

- 基本的に，https://spark.apache.org/docs/latest/programming-guide.html#using-the-shell に書かれている通りに起動するだけです。

- `${PYSPARK_DRIVER_PYTHON}`と`${PYSPARK_DRIVER_PYTHON_OPTS}`の環境変数を正しくセットして，`pyspark`を起動するだけです。
- 今回は，手元のノードでテストするため，`--master local[4]`オプションをつけます。
- また，マスターとワーカーで同じバージョンのpythonを使うことを確認するため，`${PYSPARK_PYTHON}`にpythonのパスを指定しました。
    - 自分の環境の`python`へのパスは，`which python`などで調べるとわかります。
- 以上まとめて，下記のコマンドとなります。

`PYSPARK_PYTHON=/Users/username/.pyenv/shims/python PYSPARK_DRIVER_PYTHON=ipython PYSPARK_DRIVER_PYTHON_OPTS="notebook" ~/somewhere/spark-1.5.2/bin/pyspark --master local[4]`
visibilityで画像置換する

##html
```qiita.html
<div class="btn">
    <a href="#">
        <img src="btn_off.gif" width="110" height="50" alt="ボタン" />
    </a>
</div>
```

##css
```qiita.css
.btn a {
  display: block;
  width: 110px;
  height: 50px;
}
 
.btn a:hover {
  background: url(btn_on.gif) no-repeat;
}
 
.btn a:hover img {
  visibility: hidden;
}
```
リストの中央寄せ 

##css
```qiita.css
ul.center {
  text-align: center;
}
 
ul.center li {
  display: inline-block;
  vertical-align: top;
  margin: 0 10px 0 0;
}
 
/* IE6 */
ul.center li {
  _display: inline;
}
 
/* IE7 */
*:first-child+html ul.center li {
  display: inline;
}
```
windows > sublime text > ファイルを早く開く > 1. Ctrl+o / 2. ファイル名途中まで入力 / 3. カーソルで選択 / 4. Enter > プロジェクト選択して開く

```txt:動作環境
Windows 7 Pro + Sublime Text2
```

## 背景
1つのプロジェクトにファイル(.cppファイル, .hファイル, その他)が60程度ある時に、あるファイルを見たくなる度にいちいちスクロールしながらリストから選択していた。

こういうプロジェクトが多数あると、ファイルを開くという行為自体の時間が蓄積して無駄だ。

## 開く

以下としてみる。

1. Ctrl+o
  - ファイルを開くダイアログが表示される
2. ファイル名入力 (途中まででいい)
  - Main
3. 該当ファイルをリストから選択
4. Enter入力

これで早くファイルを開くことができるようになった。

なお、左側の「Folders」にファイルが見えていたら、そちらを選択するほうが早い。


## 閉じる

Ctrl+w

## 開く v0.2 (プロジェクト選択)

複数のプロジェクトのファイルを順番に開いていきたい時は、マウスを併用する

1. 左側のFoldersにおいてプロジェクトをクリック
  - プロジェクトのファイル一覧が表示される
2. 一覧のうちの任意のファイルをクリック (ダブルクリックでない)
3. Ctrl+o でファイルオープンダイアログを表示して、ファイル名を途中まで入力して、リストから選択

上記、手順2をすることで、Ctrl+oした時のフォルダがそのプロジェクトのフォルダとなるようだ。
横並びのリストタグの高さを揃える 

##html
```qiita.html
<ul class="inl_block">
    <li>
        1番1番1番1番1番1番1番1番1番1番1番1番1番1番1番1番1番1番1番1番
    </li>
    <li>
        2番
    </li>
    <li>
        3番
    </li>
</ul>
```

##css
```qiita.css
ul.inl_block li {
  display: inline-block;
  width: 148px;
  vertical-align: top;
  margin: 0 20px 20px 0;
  padding: 20px;
  border: 1px solid #CCC;
}
 
/* IE6 */
ul.inl_block li {
  _display: inline;
  _zoom: 1;
}
 
/* IE7 */
*:first-child+html ul.inl_block li {
  display: inline;
  zoom: 1;
}
```
テーブルセルの内側に1pxの線を表示

##html
```qiita.html
<table cellspacing="1" class="data">
    <tr>
        <th>
            見出し1
        </th>
        <td>
            データ1
        </td>
    </tr>
    <tr>
        <th>
            見出し2
        </th>
        <td>
            データ2
        </td>
    </tr>
</table>
```

##css
```qiita.css
table.data {
  width: 600px;
  border-spacing: 1px;
  background: #999;
}
 
table.data th,
table.data td {
  padding: 5px;
}
 
table.data th {
  width: 20%;
  border: 1px solid #FFF;
  background: #EEF1F4;
}
 
table.data td {
  width: 80%;
  background: #FFF;
}
```
[HTML] button要素をリンクにしたい[追記]

W3Cの仕様では、
**a要素の中に、インタラクティブコンテンツ（a要素やbutton要素など）を入れてはダメ**
なのだそうです。

実はずっと誤解してました…。
次のようなトラブルに出くわして調べてみたらそういうことなのだそうです。
そのトラブルとは…。

#IE11でa要素の中のbutton要素が動作しない

動かなかったのは次のようなコード。

```html:form内のa要素に囲まれたbutton
<!doctype html>
<form method="post" action="foo">
    <a href="bar><button type="button">戻る</button></a>
</form>
```

IE11以外では動作するのですが、IE11ではボタンが全く無反応になります。
Webで検索してみると、どうやらform要素の中にあるとダメなようです。

```html:form外のa要素に囲まれたbutton
<!doctype html>
<a href="bar><button type="button">戻る</button></a>
```

このようにしたら動作しました。

が、さらに調べてみると前述のように **a要素の中のbutton要素は御法度** とのこと。

#formのaction先以外にリンクしたい

でも、form要素のaction属性の先以外にリンクしたいボタンを作りたい場合どうすればいいのか。

##button要素のformaction属性

こんな属性があったのか！
恥ずかしながら全く知りませんでした。

この属性は、formのaction属性を上書きするもので、button要素毎に異なるaction先を指定できる、という便利な代物です。

具体的にはこんな感じになります。

```html:button要素のformaction属性
<!doctype html>
<form method="post" action="foo">
    <button>送信</button>
    <button formaction="bar">戻る</button>
</form>
```

1つ目の「送信」ボタンは、formのaction属性で指定された *foo* にsubmitします。
2つ目の「戻る」ボタンは、formaction属性で指定された *bar* にsubmitします。

#その他のformxxxx属性

ほかにも `formmethod` `formtarget` `formenctype` など、form要素での指定を上書きする属性があります。（※[参考](http://www.htmq.com/html5/button.shtml)）

#[追記]
せっかく凄く便利なbutton要素属性を見つけたと思ったのですが、なんと **〜IE10 では動かない！**
くれぐれもご注意を。
画像の垂直中央表示

##html##

```qiita.html
<div>
    <img src="img_hoge.png" alt="画像" />
</div>
```

##css##
```qiita.css
div {
  display: table-cell;
  width: 150px;
  height: 100px;
  line-height: 0;
  vertical-align: middle;
  border: 1px solid #CCC;
  text-align: center;
  layout-grid-line: 100px;
}
```
snmptrapdのtraphandleの設定と、受け取れる文字列を確認する

環境は、CentOS6
net-snmpは5.5
送信元、送信先ともに自分自身

※snmptrapdのオプションに、-Onを渡している

```txt:/etc/snmp/snmptrapd.conf
traphandle      default /root/traphandle.sh

snmpTrapdAddr udp:162
snmpTrapdAddr udp6:10162
authCommunity log,execute,net public

view    all     included        .1
group   public  v1      public
group   public  v2c     public
setaccess       public  ""      any     noauth  exact   log     all
setaccess       public  ""      any     noauth  exact   execute all
setaccess       public  ""      any     noauth  exact   net     all
```

```bash:/root/traphandle.sh
#!/bin/sh

while [ 1 ]
do
    read line || exit 0
    echo ${line} >> /tmp/traphandle.txt
done

```

```text:/root/v1trap.sh
#!/bin/sh
snmptrap -v 1 -c public 192.168.0.100 \
NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatNotification "" 6 17 "" \
netSnmpExampleHeartbeatRate i 123456
```

```text:/root/v2trap.sh
#!/bin/sh
snmptrap -v 2c -c public 192.168.0.100 \
"" NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatNotification \
netSnmpExampleHeartbeatRate i 123456
```

```text:/root/v1trap_ipv6.sh
#!/bin/sh
snmptrap -v 1 -c public 'udp6:[fe80::250:56ff:fe80:6278]:10162' \
NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatNotification "" 6 17 "" \
netSnmpExampleHeartbeatRate i 123456
```

```text:/root/v2trap_ipv6.sh
#!/bin/sh
snmptrap -v 2c -c public 'udp6:[fe80::250:56ff:fe80:6278]:10162' \
"" NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatNotification \
netSnmpExampleHeartbeatRate i 123456
```

```text:/tmp/traphandle.txt
<UNKNOWN>
UDP: [192.168.0.100]:45866->[192.168.0.100]
.1.3.6.1.2.1.1.3.0 89:0:23:16.28
.1.3.6.1.6.3.1.1.4.1.0 .1.3.6.1.4.1.8072.2.3.0.1.0.17
.1.3.6.1.4.1.8072.2.3.2.1 123456
.1.3.6.1.6.3.18.1.3.0 192.168.0.100
.1.3.6.1.6.3.18.1.4.0 "public"
.1.3.6.1.6.3.1.1.4.3.0 .1.3.6.1.4.1.8072.2.3.0.1
<UNKNOWN>
UDP: [192.168.0.100]:38635->[192.168.0.100]
.1.3.6.1.2.1.1.3.0 89:0:23:18.75
.1.3.6.1.6.3.1.1.4.1.0 .1.3.6.1.4.1.8072.2.3.0.1
.1.3.6.1.4.1.8072.2.3.2.1 123456
UDP/IPv6: [fe80::250:56ff:fe80:6278]:41740
UDP/IPv6: [fe80::250:56ff:fe80:6278]:41740
.1.3.6.1.2.1.1.3.0 89:0:23:21.62
.1.3.6.1.6.3.1.1.4.1.0 .1.3.6.1.4.1.8072.2.3.0.1.0.17
.1.3.6.1.4.1.8072.2.3.2.1 123456
.1.3.6.1.6.3.18.1.3.0 192.168.0.100
.1.3.6.1.6.3.18.1.4.0 "public"
.1.3.6.1.6.3.1.1.4.3.0 .1.3.6.1.4.1.8072.2.3.0.1
UDP/IPv6: [fe80::250:56ff:fe80:6278]:34879
UDP/IPv6: [fe80::250:56ff:fe80:6278]:34879
.1.3.6.1.2.1.1.3.0 89:0:23:24.12
.1.3.6.1.6.3.1.1.4.1.0 .1.3.6.1.4.1.8072.2.3.0.1
.1.3.6.1.4.1.8072.2.3.2.1 123456
```

UNKNOWNの部分は、名前解釈が出来れば、ホスト名になる
IPv6の場合は、名前解釈が出来ない場合でも、UNKNOWNではなくIPアドレスが出てくる・・・。うーん
IPv6で名前解釈が出来るパターンは試していない

上記内容だと分からないが、送信元を送信先と別にすると、
最初の1行目、および2行目に出てくる内容は、
送信元情報
送信元情報 -> 送信先情報　　　（IPv6の場合は、送信元のみ。うーん）
となる。


snmptrapdが渡してくる内容は、OSやnet-snmpのバージョンで
若干異なる。

以下のサイトにある内容だと、UDP: [IPアドレス]の部分が、
単にIPアドレスのみ、となっていたりする（うーん）

http://d.hatena.ne.jp/iww/20080703/snmp

traphandleを使いたいサーバーで、実際に受け取っている文字列を
確認してから、traphandleの内容を作りたい。

あと、snmptrapdに渡しているオプションによっても内容が異なる。
-Onを渡しているが、これが無い場合は、oid列が文字列に変換された内容が
渡されてくる。



多くのサイトで、udpとudp6を同じポート番号で指定しているけど、、、。
上記例で162と10162に分けているのは、同じポート番号ではIPv4とIPv6を
両方受信することができなかったため、です。
udp:162,udp6:10162と指定しても、IPv4のみ受信しました。
うーん。
Content Script内でwindow contextで実行した関数の結果を取得する

# Background

Chrome ExtensionのContent Scriptではcontextがページ上で実行されているJSとは違うため`window`経由で変数取得や関数実行ができません。

`window`コンテキストで関数を実行する方法は

http://qiita.com/suin/items/5e1aa942e654bce442f7
や
http://stackoverflow.com/questions/20499994/access-window-variable-from-content-script

などいろいろありますが、結果を取得する例は見つからなかったので自分で作ってみました。

# Solution

Gist: https://gist.github.com/dtaniwaki/b2b29a95b98f593ffd57

関数を実行した後でその結果を挿入した`script`タグの`dataset`にJSONにシリアライズして格納し、content script側から同じIDの`script`を探してデシリアライズしてコールバックに結果を渡しています。

```js:windowContextRunner.js
'use strict'

let waitScriptResult = function (id, timeout) {
  return new Promise(function (resolve, reject) {
    let timerId
    timerId = setInterval(function () {
      let elem = document.getElementById(id)
      if (typeof elem !== 'undefined' && typeof elem.dataset.done !== 'undefined') {
        clearInterval(timerId)
        timerId = null
        if (typeof elem.dataset.error !== 'undefined' && elem.dataset.error !== '') {
          reject(Error(elem.dataset.error))
        } else {
          resolve(JSON.parse(elem.dataset.result))
        }
        document.body.removeChild(elem)
      }
    }, 100)
    setTimeout(function () {
      if (timerId) {
        clearInterval(timerId)
        reject(Error('The injected script was timeout'))
      }
    }, timeout || 5000)
  })
}

let injectScript = function (promise) {
  let n = Math.floor(Math.random() * 1000000)
  let id = `kzaex_run_in_page_${n}`
  let s = document.createElement('script')
  s.id = id
  s.text = `
    (function() {
      var promise = ${promise.toString()};
      var script = document.getElementById("${id}");
      promise.then(function(result, reject) {
        script.dataset.result = JSON.stringify(result);
        script.dataset.done = 'true';
      }).catch(function(e) {
        script.dataset.error = e.message;
        script.dataset.done = 'true';
      })
    })();
    `
  document.body.appendChild(s)
  return id
}

export function run (script, timeout) {
  let id = injectScript(`
    new Promise(function(resolve, reject) {
      try {
        resolve((${script.toString()})());
      } catch(e) {
        reject(e);
      }
    });
    `)
  return waitScriptResult(id, timeout)
}

export function runWithCallback (script, timeout) {
  let id = injectScript(`
    new Promise(function(resolve, reject) {
      try {
        (${script.toString()})(function(result) {
          resolve(result);
        });
      } catch(e) {
        reject(e);
      }
    });
  `)
  return waitScriptResult(id, timeout)
}
```

使い方は以下のようになります。

```js
import * as windowContextRunner from './windowContextRunner.js'

windowContextRunner.run(function() {
  // Do something and return the result
  var result = 1;
  return result;
}).then(function(result) {
  // Use the result of the function above
  result == 1
});
```

エラーハンドリングなどは特にここでは深く実装していませんが、簡単に追加できると思うので用途に応じて追加してください！
clearfixプロパティ

##css##

```qiita.css
.clearfix:after {
    content: "";
    display: block;
    clear: both;
}

.clearfix {
    overflow: hidden;
    zoom: 1;
}
```

または

```qiita.css
.clearfix:after {
    content: "";
    display: block;
    clear: both;
}

.clearfix {
    overflow: visible;
    zoom: 1;
}
```
c++ builder > tool > madExcept > プログラムクラッシュ時のチェック?


[stackoverflow](http://stackoverflow.com/questions/35251103/how-to-capture-suddenly-destructed-tthread?noredirect=1#comment58234908_35251103)にてスレッドが突然終了する問題に関連して質問したら以下のツールを紹介された。

http://madshi.net/madExceptDescription.htm

フリー版もあるが、これを導入した時のIDEの挙動などを検討しないといけないので、すぐに使うわけにはいかない。
docker-1.10.0からデタッチキーが変更できるようになった

```docker run```, ```docker exec```, ``docker attach```でコンテナ内入った後、デタッチするにはCtrl-P, Ctrl-Qでデタッチできますが、このキーバインドが[1.10.0から変更できるようになっていました](https://github.com/docker/docker/blob/master/CHANGELOG.md#1100-2016-02-04)。Ctrl-PはEmacsキーバインドでシェル使う人の場合、「一つ前の履歴を表示する」操作に該当します。多用するので、コンテナ内でのシェル操作が非常にやりにくかったのです。

## 変更方法

~/.docker/config.jsonに```detachKeys```ディレクティブを追加します。

```json
{
        "auths": {
                "https://index.docker.io/v1/": {
                        "auth": "******************************",
                        "email": "********************"
                }
        },
        "detachKeys": "ctrl-e,e"        <======== これ
}
```

オフィシャルのドキュメントにも書いてあります。
https://docs.docker.com/engine/reference/commandline/cli/
HTTPのアクセスログをgawkを使ってsortする


参考 http://gihyo.jp/magazine/SD/archive/2015/201505

出力はCSVファイル、セパレータは＠になってます。

```
##===事前処理
BEGIN {
    FPAT="([^ ]+)|(\"[^\"]+\")|(\[[^\[]+[^\]]+\])"
}

##===本体処理

{
    freq_of[$1"@"$9]+=1
}

##===事後処理
END {
    OFS="@"
    for ( i in freq_of ) {
        if ( ! freq_of[i] ) {
            freq_of[i] = 0
        }
        print i, freq_of[i]
        total+=freq_of[i]
    }
    print "total " total
}
```
IPhoneのモニタリング

こんにちは
現在IOSで動作するアプリを作成しているのですが、XCodeで起動したときには発生せず、アイコンをクリックして起動したときにのみ発生するバグがあります
このような場合、Androidであれば適当なデバッグ文を打ち込み、AndroidStudioで表示されたデバッグ文の内容から動作を推測するということが可能なのですが、IOSで同様の方法がありますでしょうか？
また、これ以外にも良いデバッグの方法があればご教授お願いします
Mac | チルダが打ちにくい。コンソールで簡単にホームディレクトリを扱えるようにする。

# 解決

ホームディレクトリへのシンボリックリンクを、ルートに作る。

`$ sudo ln -s ~/ /a/`

これで解決！

`$ /a/`

でホームディレクトリを扱えるようになる。
めんどくささは、チルダの5分の1以下だ。(体感)

# 動作確認

ファイルでも作ってみよう。

```bash
$ touch /a/example.txt
$ ls ~/ | grep example.txt
example.txt
```

ちゃんとあるね。


# /a/ というシンボリックリンクにした理由

a がとても打ちやすいから。

home の頭文字で `h` でも良いけど、微妙にキーストロークが良くない。

# 問題

ホームディレクトリに移動するには単に `cd` と打てば良い。
( `cd` の後に何も渡さなくて良い )

```bash
$ cd 
$ pwd
/Users/yinaura
```

だがしかし。他のディレクトリ内から、ホームディレクトリを扱う場合は、チルダを打たなくてはいけない。

 `$ cat ~/example.text` 

めんどいよ。

# 環境

- Max OS X Yosemite



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Android WebView マルチタッチを有効にしたまま、zoom controlを消す[2016/02/04時点]

マルチタッチを有効にしたままzoom controlを消す方法が変わってました！
以下が**新しい方法**！

```lang:
    //マルチタッチを有効にしたまま、zoom controlを消す
    webView.getSettings().setDisplayZoomControls(false);
```

以下は**古い方法**！！気をつけなはれや！！

```lang:
 webView.getSettings().setBuiltInZoomControls(true);
 webView.getSettings().setSupportZoom(true);

 try{
 
     //マルチタッチを有効にしたまま、zoom controlを消す
     Field nameField = settings.getClass().getDeclaredField("mBuiltInZoomControls");
     nameField.setAccessible(true);
     nameField.set(settings, false);

 }catch(Exception e){

     e.printStackTrace();

 }
```
ServerspecでWindowsのレジストリやインストール済みソフトウェアをチェックしたい

俺です。
これです。


```
describe windows_registry_key('HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation') do
  it { should exist}
  it { should have_property('RealTimeIsUniversal') }
  it { should have_property_value('TimeZoneKeyName', :type_string, 'Tokyo Standard Time') }
end

describe windows_registry_key('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5\1041') do
  it { should exist }
end

['PowerShell Community Extensions 3.2.0','CodeDeploy Host Agent'].each do |pkg|
  describe package(pkg) do
    it { should be_installed }
  end
end
```
ちょっとまってくれKotterknife！俺はまだKotlin 1.0RCにアップデートしたくないんだ


[Kotlinが1.0 RCをリリースしました。](http://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-release-candidate-is-out/)祝

しかし、まだ作業中のコードがあり、まだ1.0RCへの移行は先送りしたい、という方もいるでしょう。
ただそういう方でも[kotterknife](https://github.com/JakeWharton/kotterknife)をインストールしているとkotterknifeのバージョンアップに引きずられてkotlinのバージョンのコンフリクトが起こり、ビルドが通らなくなってしまいます。

その場合は[JitPack.io](https://jitpack.io/)を参照しましょう。

KotterKnifeのRCアップデート前のコミットをパッケージしたものがこちらです。
https://jitpack.io/#JakeWharton/kotterknife/36ae6d5ecb

こちらの通りgradleの設定をすると、とりあえずKotlin 1.0RCに移行前のKotterknifeを取得することができます。


- ネタ元は以下のKotterknifeのissue
	- [Why does't upload kotterknife to Maven Central ?](https://github.com/JakeWharton/kotterknife/issues/36)
今こそRDBの時代だ！・・・


## 自己紹介
奥野みきや　・・・　漢のコンピュータ道の人！

## Vertica
・縦型カラムのストレージ
・分析・解析等で使われる
・書き込みには向いてない

## Actian Vector
・縦型カラムのストレージ
・分析型の用途
・CPUをうまく使って動くDB（無駄がない）

## スケールアップあるいはスケールアウト
・理論から学ぶデーターベース（本・奥野さん）
・コストと管理性
スケールアウトだと管理が大変
スケールアップだとコストがかかる

・スケールアウトのボトルネック
　・インターコネクト
　・大部分はソフトウェアてきなもの

・スケールアップ
　・ハード的なものによる
　・SpartkのM7（めちゃくちゃ良いらしいｗ）
　　・インメモリでいろいろできる
　　・コア数もすごい
　・ハードウェアだけの問題ではない
　　・コアをうまく使いきれていない
　　・ロックの粒度を小さく、かつ少なくしていかないとコアを使いきれない
　　・mysqlクラスター　ロックをあまり使用しない、CPUのリソースを使い切る

## 愛用している製品に足りない機能
・CHECK制約がない

## SQL標準に入れてほしい機能
・履歴機能
・多対多のテーブル契約
　・現状外部キー制約しかない
　・MOVEコマンド（テーブル間データ移動）
・Window関数（分析関数）

## RDBでは解けない問題あるある
・グラフDB
・履歴・グラフ・タグ
・階層型データベース

## RDBにJSON型ってどうなの？
・MySQL5.7
　・JSON型がサポートされようが、text型にJSONを入れることができる
・汎用されるとつらい

## RDBじゃなくてもよかったな


## リファクタリングに手を付けるべきか、先延ばしするか
・DBは長生き、DB構造はコピペされやすい
・DBのリファクタリングをコードのリファクタリングと同じぐらい気軽なものになっている
・データベースリファクタいリング（書籍）
・アプリケーションのコードと同時にDBのリファクタリングを行う
・アプリケーションとDBの関係性は1対1
・複数アプリケーションからDBを参照したいときはAPIで何とかする

## 注目しているDB関係のテクノロジ
・オープンソースのERDツール

## RDBはどう進化すべきか
・
OpenWrtで既存パッケージを再ビルドする

OpenWrtでipkパッケージを自前ビルドする際の手順を紹介します。

OpenWrt Wikiの「[Using the SDK](https://wiki.openwrt.org/doc/howto/obtain.firmware.sdk)」とほぼ重複する内容です。

# OpenWrt SDKの準備

OpenWrt SDKというのはOpenWrt用クロスコンパイル環境一式のことです。自分でビルドすることもできますが、Linux環境であればビルド済みのOpenWrt SDKを拾ってきて展開するのが一番ラクでしょう。

OpenWrt SDKのパッケージはバージョンごと・アーキテクチャごとに提供されています。たとえば、15.05のar71xx用のOpenWrt SDKは次のURLからダウンロードできます。

- https://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/generic/OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2

これを展開するとipkファイルのビルド環境が手に入ります。

```
$ cd $HOME/work
$ wget https://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/generic/OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2
$ tar xvjf OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2
```

# ソースコードしか提供されていないパッケージを自前ビルドする

OpenWrt 15.05になって、メンテナ不在のためバイナリ提供されなくなったパッケージがチラホラあるようです。しかし、実はそうしたパッケージでもソースコードは残っていて、簡単にビルドできたりします。今回は15.05からバイナリ提供されなくなったnetstat-natを自前ビルドしてみましょう。

```
$ cd $HOME/work
$ git clone git://git.openwrt.org/packages.git openwrt-trunk-packages
$ cd OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/package
$ ln -sn ../../openwrt-trunk-packages/net/netstat-nat
$ cd ..
$ make package/netstat-nat/{clean,compile} V=s
```

packagesリポジトリのtrunkを取得した上で、必要なディレクトリだけをSDKのpackageディレクトリ以下にシンボリックリンクして`make package/[パッケージ名]/{clean,compile}`すればビルドが走ります。

バイナリパッケージは`bin/ar71xx/packages/base/netstat-nat_1.4.10-1_ar71xx.ipk`のような場所に作られます。

# 標準インストールされているパッケージを再ビルドする

第二の例として、dnsmasqを自前ビルドしてみましょう。dnsmasqはpackagesリポジトリではなく本体リポジトリで管理されていますが、それ以外はnetstat-natと変わりません。

```
$ cd $HOME/work
$ git clone git://git.openwrt.org/openwrt.git openwrt-trunk
$ cd OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/package
$ ln -snf ../../openwrt-trunk/package/network/services/dnsmasq ./
```

上記のように、本体リポジトリの適切な場所からSDKのpackageディレクトリにシンボリックリンクを作ります。このあと先ほどと同様に`make`すればパッケージが作られるはずですが、その前に依存関係を確認しておきましょう。

```
$ grep -C2 DEPENDS dnsmasq/Makefile
PKG_INSTALL:=1
PKG_BUILD_PARALLEL:=1
PKG_CONFIG_DEPENDS:=CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dhcpv6 \
	CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dnssec \
	CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_auth \
--
$(call Package/dnsmasq/Default)
  TITLE += (with DHCPv6 support)
  DEPENDS:=@IPV6
  VARIANT:=dhcpv6
endef
--
$(call Package/dnsmasq/Default)
  TITLE += (with DNSSEC, DHCPv6, Auth DNS, IPset enabled by default)
  DEPENDS:=+PACKAGE_dnsmasq_full_dnssec:libnettle \
	+PACKAGE_dnsmasq_full_ipset:kmod-ipt-ipset
  VARIANT:=full
```

依存パッケージがある場合は`DEPENDS:=`以下に書かれているので、ビルド前に毎回調べる必要があります。

上記のgrep結果を見ると、`PACKAGE_dnsmasq_full_dnssec`を作るためにはlibnettleパッケージが、`PACKAGE_dnsmasq_full_ipset`を作るためにはkmod-ipt-ipsetパッケージがそれぞれ必要だとわかります。このように依存関係がある場合、それらのパッケージもpackageディレクトリ以下に配置する必要があります。依存先も更に依存パッケージがあったりするので、大物パッケージだとなかなか大変そうです。
nohupを使ってsshログアウト後もシェルスクリプトを動かす

既にたくさんの人が同じような記事を書いていましたが、自分メモ。

# 参考

+ [ログアウトしてもバックグラウンドジョブを継続する方法](http://www.codereading.com/nb/ignore-the-hangup-signal.html)

# 結論

以下のように`nohup`コマンドを使い、かつ`&`の指定によってシェルスクリプトをバックグラウンドで動かせば良い

```bash
$nohup ./batch.sh &
```

# sshログウアウトするとなぜ止まるのか

sshログインしている状態でバックグランドでシェルスクリプトを実行すると、sshdのログインシェル(bash)の子プロセスとしてシェルスクリプトが実行されます。

```bash
# プロセスの親子関係を確認
$pstree
init─┬─agetty
     ├─atd
     ├─auditd───{auditd}
     ├─crond
     ├─dbus-daemon
     ├─dhclient
     ├─6*[mingetty]
     ├─ntpd
     ├─rngd
     ├─rpc.statd
     ├─rpcbind
     ├─rsyslogd───3*[{rsyslogd}]
     ├─2*[sendmail]
     ├─sshd───sshd───sshd───bash───pstree


# バックグラウンドで./batchを実行
$./batch.sh &

# batch.shはsshdの子プロセスのbashプロセスの子プロセスとして実行されている
$pstree
init─┬─agetty
     ├─atd
     ├─auditd───{auditd}
     ├─crond
     ├─dbus-daemon
     ├─dhclient
     ├─6*[mingetty]
     ├─ntpd
     ├─rngd
     ├─rpc.statd
     ├─rpcbind
     ├─rsyslogd───3*[{rsyslogd}]
     ├─2*[sendmail]
     ├─sshd───sshd───sshd───bash─┬─batch.sh───sleep
     │                           └─pstree
     └─udevd───2*[udevd]

```

上記の場合に、sshのログアウトを行うとbatch.shにハングアップシグナル(HUP)を送信し、そのタイミングでシェルスクリプトが終了してしまうからです。

# nohupコマンドとは

`nohup`コマンドを使うことで上記のようにHUPシグナルがシェルスクリプトなどに送信された時でも無視するようにすることができます。
これによってsshログアウト後もシェルスクリプトの継続が可能です。

なお、nohupコマンドで実行されたスクリプトの標準出力及び標準エラー出力はプログラムを実行しているディレクトリに`nohup.out`というファイル名で保存されます。ディレクトリに書き込み権限がなければ`$HOME/nohup.out`として保存されます。

スクリプトで大量の標準出力、標準エラー出力がされる場合にはファイルが肥大化するので必要ないものは捨てるなり対処が必要です。

# そもそもシグナルとは

以下を参考にさせていただきました。

+ [シグナルと trap コマンド](http://shellscript.sunone.me/signal_and_trap.html)
+ [Ctrl+Cとkill -SIGINTの違いからLinuxプロセスグループを理解する](http://equj65.net/tech/linuxprocessgroup/)


実行中のプロセスに対して、様々なイベントを通知するために利用されるもの。

例えばあるプロセスを止めたい場合に`kill -KILL [ps number]`という感じでコマンドを使うことがあると思いますが、これも対象のプロセスにシグナル名KILL(9)を送信してプロセスを終了しています。
同じようにCtrl+Zよってプロセスを中断したり、Ctrl+Cによって終了したりすることもありますが、プロセスに該当するシグナルを送信して機能を実現しています。

今回のHUP(シグナル番号1)もシグナルの一つとして存在し、sshログアウトタイミングでHUPシグナルがシェルスクプトに送信されますが、nohupコマンドを使っていればHUPシグナルを受け取っても無視する挙動にすることができ、処理を継続することができていました。
電子工作 > チャージポンプ[負電源]用IC > NJU7660AM / LM2662

キャラクタディスプレイSD1602Xを使おうとしていたところVoに負電圧を印加しないといけないらしいことが分かった。

負電圧を入れるためにチャージポンプという方法があり、それにはMCUから1MHz程度のクロックを出すという例があった。

1MHzを出すのは今のところ失敗している。
http://qiita.com/7of9/items/c55023a4af15b83ac7e3

とりあえず100HzではCLKを出せるので、それで負電圧 -2.813Vは出力でき、それを使ってしまうというのも一つの手ではある。電圧の精度がそれほどいらないとしたら。
http://qiita.com/7of9/items/9cc0cb94118356898668

## 本題

負電圧を作るICを使うのが簡単、という情報を得た。確かに。

探してみた。

### ボルテージコンバータ NJU7660AM (2個入り) 140円
http://akizukidenshi.com/catalog/g/gI-08373/

### スイッチト・キャパシタ型電圧コンバータ
http://www.tij.co.jp/product/jp/LM2662
購入先は未調査。

どのICがどういいのか(利点、欠点)は今は分かっていない。
htmlのPOST用buttonで多重送信を防ぐ

POSTで送信中に再度ボタンを押され多重送信してしまうのを防ぎたい。

単純に以下で無効化すればよいのかと思ったが、少なくともchrome v47で試した所肝心のPOSTを実行してくれず、遷移もしない。
onclick時にdisabledにすることで、その後のonsubmitに進んでくれない？

```html
<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="upfile"/>
  <button type="submit" onclick="this.disabled=true;">送信</button>
</form>
```

また、onclick時ではなくdisabledにする処理をonsubmit時に書いても送信後に発火するのか送信中はボタンが無効になってくれない。

なので以下のようにする。送信ボタンが複数あってもどれか押されればすべて使えなくなる。

```html
<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="upfile"/>
  <button type="submit" onclick='if(typeof pressed != "undefined"){return false;}pressed=1;'>送信1</button>
  <button type="submit" onclick='if(typeof pressed != "undefined"){return false;}pressed=1;'>送信2</button>
</form>
```
巡視船の航路を最適化で求める

# <i class='fa fa-pencil' /> はじめに
不審船を見つけるために、巡視船を出航させます。
どのような、航路を選べばよいでしょうか？

# <i class='fa fa-pencil' /> 問題
エリアは、10×10の格子状としましょう。
各エリア間の移動は10分でできるとします。
時間帯(10分)ごと、エリアごとの発見確率は、過去の実績から推定しておきます。
1日走って、**見つからない確率**を最小化しましょう。

# <i class='fa fa-pencil' /> 考え方
このような問題は、**時空間ネットワーク**上での最短路問題として解くことができます。
最短路問題は、[組合せ最適化](http://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)の典型問題の1つです。

時空間ネットワークとは、各時間帯ごとのネットワークを時間に沿ってつなげたものです。

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/7ef6c6cd-2d90-b14d-ea8c-1644f84fb0ee.png)

見つからない確率は、各時間帯の見つからない確率の積で表されます。
[因子の部屋](http://qiita.com/SaitoTsutomu/items/cfa4c144ab7713766d48)のテクニックを使って、logを使えば、積を線形の式にできます。
また、確率のlogをとると負になりますが、最短路の[ホップ数](http://e-words.jp/w/%E3%83%9B%E3%83%83%E3%83%97%E6%95%B0.html)は同じなので、最小値を0にかさ上げすることにします。

# <i class='fa fa-pencil' /> Pythonで解く

最短路は、PythonのNetworkXのdijkstra_pathを使うと解くことができます。
やってみましょう。発見確率は、乱数で作ることにします。

```py3:python
import numpy as np, pandas as pd, networkx as nx
from itertools import product
from pulp import *

nt = 6*24 # 時間数(10分刻みで24時間分)
nn = 10 # 10x10のエリア
np.random.seed(1)
# 時間帯ごとエリアごとの発見確率
a = pd.DataFrame(np.random.rand(nt, nn*nn))
b = np.log(1-a) # 見つからない確率(1-a)のlogをとる
b -= b.min().min() # 最小値を0にする
g = nx.Graph() # ノード = 時刻×100＋エリア
for t, r in b.iterrows():
    for i, j in product(range(nn), range(nn)):
        k1 = t*100 + i*nn + j
        for di, dj in [(-1,0), (0,-1), (0,0), (0,1), (1,0)]:
            if 0<=i+di<nn and 0<=j+dj<nn:
                k2 = (i+di)*nn + j+dj
                # 時空間ネットワークの接続をする
                g.add_edge(k1, (t+1)*100 + k2, weight=r[k2])
# 最短路を求める
res = np.array(nx.dijkstra_path(g, 0, nt*100))
```

# <i class='fa fa-pencil' /> 結果の表示
時間を無視して表示してみます。

```py3:python
from more_itertools import pairwise
h = nx.Graph()
h.add_edges_from([(i, j) for i, j in pairwise(res%100)])
nx.draw(h, pos={(i*nn+j):(i, j) for i in range(nn) for j in range(nn)})
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/3c5e1e38-6e75-3038-50f1-a3030cd296a0.png)

以上
技術英語 > a small oversight / no pun intended

@ Star Trek Voyager > PERSISTENCE OF VISION

用意した装置が意図通りに動かない状況でキムとJaneway艦長のやりとり

キム: Just a small oversight.
Janeway: No pun intended.


## a small oversight

http://eow.alc.co.jp/search?q=oversight&ref=sa
> 1. 〔気付くべきことの〕見落とし、見過ごし

## no pun intended

Janewayの言っている方が未消化。

### link1 
pun intendedは
http://eow.alc.co.jp/search?q=pun
> しゃれですが、しゃれのつもりです

### link2
https://hinative.com/ja/questions/476
> What do people mean when they say 'no pun intended'
 
という質問に対して

> It means when something said has a joke in it that wasn't said to be a joke. 

しゃれのつもりではない、という意味なのかもしれないが、キムの発言の前を見なおさないと分からない。
mruby-cliのクロスコンパイル

## 参考

* [hone/mruby-cli: mruby-cli](https://github.com/hone/mruby-cli)

## 準備

* https://github.com/hone/mruby-cli/releases から `mruby-cli` バイナリをダウンロード

```bash:プロジェクト作成
mruby-cli --setup test1
```

```bash:コンパイラの取得
git clone git@github.com:hone/mruby-cli.git
cd mruby-cli.git
docker-compose run compile
```

初回は時間がかかるが二回目以降は早い。

```bash:バイナリ
$ find mruby/build | grep bin\/
./mruby/build/i686-w64-mingw32/bin/test1.exe
./mruby/build/i686-pc-linux-gnu/bin/test1
./mruby/build/x86_64-apple-darwin14/bin/test1
./mruby/build/x86_64-pc-linux-gnu/bin/test1
./mruby/build/i386-apple-darwin14/bin/test1
./mruby/build/x86_64-w64-mingw32/bin/test1.exe
```

## 編集

```diff:mrblib/test1.rb
 def __main__(argv)
   if argv[1] == "version"
     puts "v#{Test1::VERSION}"
   else
-    puts "Hello World"
+    puts "Hello 日本語"
   end
 end
```

```bash:
$ docker-compose run compiler
$ ./mruby/build/x86_64-pc-linux-gnu/bin/test1
Hello 日本語
```
Wordpressの編集画面をいじりたい


雑ですみません。

序章
----
ある日来た仕事は、Wordpressで特定のページを簡単に作れるようにしろ、という要件だった。

たとえばQ&Aのページを作るなら、規定のフォーマットに沿うよう書けるようにしろ、Q&Aのタイトルはテキストのみで本文はHTMLを許可するなどの入力規則を設けろ、とかそんな感じ。
フォームを用意してそれに値を埋めさせて記事として表示させる例はたくさんあるし、なんだちょろいなとか思ってた。

が、Google Siteみたいに見た通りのまま編集できるようにしてほしい、という要件が加わって雲行きが怪しくなる。フォームで必要項目を埋める形では、記事になったときのイメージができないからよくないとのこと。

そんな感じで、これらを満たせるようなプラグインもないし、これは自分で作るしかないのでは、と思い、頑張っている次第であります。

要件
------

1. 決まったフォーマット通り書かせたい
2. 入力規則を設けたい。テキストのみもあれば、WYSIWYGなエディタでの入力ができるようにしたり、画像も貼り付けたい。
3. **見た通りのまま編集ができるようにしたい**

1はテンプレートエンジンなり、htmlのclassの命名規則とjavascriptでフォーマットを決めて、入力させる箇所をcontenteditableにすればよさそう。(入力規則がめんどくさいけど。)

2はTinyMCEなりYUI-Editorを使えば良さそう。画像の貼り付けは頑張る。(wordpressに画像をuploadできるAPIを書いて、DnDでいい感じにやる。ハウスキープも考えないと・・・)

3についてはwordpressはさっぱりで全然わからない。今回はここを少し頑張った、という話。

で
------

自分のアイディアとしては・・・

- 編集画面のプレビューをiframe(子フレーム)で出して、
- プレビュー内のコンテンツをJavaScriptでcontenteditableにし、
- 親フレームの保存ボタンをadmin-barに置いておき、子フレーム中の記事部分(`the_content()`で表示させる部分)のDOMを切り取ってHTMLとして保存する。(`.entry-content`でとれるかなーと。)

完全にwordpressから切り離して考えたかったのだけど、その場合はガッツリwordpressのロジックは触る事になるか、独自のCMSを作るようなものになるのではと怖くなったので、既存の編集画面を奪うことにした。

- プレビュー画面をiframeで表示する
- プレビュー画面の表示の際だけ、scriptを埋め込む(プレビュー中で書き換えたり色々やるため。)
- 編集画面にはこのiframeをabsoluteでかぶせて表示する

まずはここまでやってみる・・・成果物はgistに捨てておきます。
プラグインとしてぶっこむと新規投稿・編集でいきなりプレビュー画面が出てきます。(動作を見るときのコードが残っているので、ゴミもいくつか出る。)

https://gist.github.com/ryozi-tn/ad4785bb44cf8e6c9e79

利用したフックのメモ。

- 編集画面のフック
    - `admin_head`と`admin_footer`があり、これにページのファイル名を付けると、管理者がそのページにアクセスしたときのみhead/footerの部分に作用するフックを仕込める
        - (例)新規投稿時のheadに何か仕込みたい場合
        - 新規投稿画面は`post-new.php`なので、`add_action('admin_head-post-new.php', '実行するfunction名')` みたいな書き方。気持ち悪い
    - 新規(`post-new.php`)と編集(`post.php`)であるが、画面の作りはかなり似ている
- プレビュー画面のフック
    - プレビュー時は `is_preview()` で判定できる。
    - これを真似てwp_head/wp_footerでプレビュー時のみ処理するactionフックを書く
    - プレビューのリンク先は `esc_url( get_preview_post_link( $post ) );` で作られる

見たところ、色々フックを書ける場所があるので、ある場所にこれを表示させたい、というのは意外と簡単なのかもしれない。
(Page Builderとか似たようなことやってる。)

Front-end-editorは、やりたいことにかなり近かったが、1,2の要件を満たせないのと、コードが多すぎて見たくなかったので、見送っている。
 
後は時間と努力で解決できるでしょう・・・きっと。
[Microsoft Edge]カスタムしたエラーページが表示されない

# 現象
タイトルの通りカスタムエラーページが表示されずシステムのエラーページがでてきてしまう。
例えばsinatraで以下のようなコードを書いて`/`にアクセスするとchromeでは`Sinatra doesn't know this ditty.`と書かれたページが表示されるがEdgeでは`Microsoft Edgeでこのページを表示できません`というページが表示されてしまう。

```rb:app.rb
require "sinatra"
```

![sinatraのエラー画面](https://qiita-image-store.s3.amazonaws.com/0/42193/a5564c5f-85ef-a0e3-0c29-4575a9112891.png)

![Edgeのエラー画面](https://qiita-image-store.s3.amazonaws.com/0/42193/d2be6623-59a9-3547-ac97-0c5fd0509be2.png)

## 確認したMicrosoft Edgeのバージョン
```
Microsoft Edge 25.10586.0.0
Microsoft EdgeHTML 13.10586
```


# 原因と対策
Microsoft Edgeでは`Content-Length`が`512`以下の場合システムのエラーページを出してしまうようである。
よって`Content-Length`を`513`以上にすればよい。

以下のコードを書いて`/512`にアクセスすると`Microsoft Edgeでこのページを表示できません`ページが表示されるが、`/513`にアクセスすると`aaaaaaaaaaaaa...`というページが表示されることが確認できる。

```rb:app.rb
require "sinatra"

get "/:num" do
  status 404
  "a" * params[:num].to_i
end
```

### /512にアクセスしたとき
![edge-512.png](https://qiita-image-store.s3.amazonaws.com/0/42193/8a41bd1c-62e5-0537-084e-1e99c48e5724.png)

### /513にアクセスしたとき
![edge-513.png](https://qiita-image-store.s3.amazonaws.com/0/42193/516c01d9-861e-377e-67f4-18ca51fca6e8.png)
OpenVPNサーバにMacOSXで接続(Tunnelblick)

## はじめに
前回投稿した[さくらのVPS512(月々税抜635円)で固定IPアドレスをゲットする(OpenVPNサーバを作る)](http://qiita.com/tool-taro/items/76cef0909c9b119d22b2)ではWindowsで接続する例を記載しました。
今回は追記として、MacOSXから接続する手順をまとめました。

なお、上記の投稿で設定したOpenVPNサーバとの接続を想定しており、他のサーバとの接続においては設定変更が必要となる可能性があります。

## 作業手順
### 設定ファイルの新規作成
各証明書・秘密鍵と同じディレクトリに設定ファイルを新規作成します。設定ファイルの内容は後述しますが、配置のイメージは下記の通りです。
![スクリーンショット 2016-02-08 2.44.47.png](https://qiita-image-store.s3.amazonaws.com/0/111947/574fdd7f-17d9-a819-5b68-29b1f5b73305.png)

ではテキストエディタ等で設定ファイルを作りましょう。今回は"**myvpn.ovpn**"とします。拡張子は必ず.ovpnとしてください。

```ovpn:myvpn.ovpn
client

dev tun
proto udp

remote ホスト名もしくはIPアドレス 1194

resolv-retry infinite
nobind

persist-key
persist-tun

ca ca.crt
cert user.crt
key user.key

fragment 1280
mssfix 1280
link-mtu 1400

comp-lzo

verb 3
```
### Tunnelblickのインストール
Tunnelblickをインストールしてください。
https://tunnelblick.net/downloads.html

### 設定ファイルの登録
先ほど作成した"**myvpn.ovpn**"をダブルクリックします。
Tunnelblickが設定のインストール方法を尋ねてきます。都合のよい範囲を指定してください。
<img width="578" alt="スクリーンショット 2016-02-08 2.45.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/e7328e92-a867-0580-a4f8-495c9039a274.png">
設定変更時の確認のダイアログが出たら認証してください。
<img width="555" alt="スクリーンショット 2016-02-08 2.45.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/9bd5e324-3b89-f768-6bfb-365fd0724756.png">
### 接続の確認
Tunnelblickを起動します。myvpnという設定が取り込まれていることを確認して「接続」します。
<img width="1028" alt="スクリーンショット 2016-02-08 2.47.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/52625aac-86b5-1ea5-768b-32a89100f5a2.png">

初回はパスワードを尋ねられますので、ユーザ個別のパスワードを入力してください。
<img width="524" alt="スクリーンショット 2016-02-08 2.49.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/5e9738b6-f3af-789f-8ad0-0c4c7ed94f51.png">

接続が完了したら、IPアドレス確認用のサイトに行って確認してみましょう。
さくらのVPSで与えられたサーバのIPアドレスになっていたら成功です。
[IPアドレス確認｜Web便利ツール@ツールタロウ](http://tool-taro.com/request_info/)
<img width="304" alt="dcffa2af-664e-06bd-b7da-7b09917c0fab.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/827c2fac-fe34-20c0-9c41-e90722efd0d4.png">

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
MySQLで集合差を出す

MySQL方言にはMINUSとかEXCEPTが無いので、集合の差分を表現するのが意外と面倒くさい。大抵の場合、相関サブクエリでNOT EXISTSを使ったSQLを書くことになる。

一般従業員を示すemployeeとリーダー職を示すleaderという二種類のテーブルがあるとする。

```sql
CREATE TABLE employee (
  id INT NOT NULL,
  PRIMARY KEY(id)
);
CREATE TABLE leader (
  id INT NOT NULL,
  PRIMARY KEY(id)
);
```

employeeにはleaderの中身も含まれているとする。さて問題。employeeではあるが、leaderではないidを洗い出したい。

employee集合からleader集合を引くことができれば、該当のid群を洗い出せる。

```sql
-- イメージ的にはこうしたいんよ
employee EXCEPT leader
```

## NOT IN (非推奨)
MySQLにEXCEPTのような機能はない。そこで素直に書くならNOT INになるけれどNOT INは遅いことが多い。

```sql
SELECT employee.id
  FROM employee
 WHERE employee.id NOT IN (
   SELECT leader.id
     FROM leader
)
```

## NOT EXISTS + 相関サブクエリ

そこで相関サブクエリの形に修正すると多少緩和される。

```sql
SELECT employee.id
  FROM employee
 WHERE NOT EXISTS (
   SELECT leader.id
     FROM leader
    WHERE leader.id = employee.id
    LIMIT 1
)
```

同じように複数の集合を引きたいのなら、AND NOT EXISTS ...というように続けていけば計算できる。


## LEFT JOIN + IS NULL

コメント欄で指摘いただいた方法。indexが使える場合、NOT EXISTSよりも更に速いことが多い。

```sql
SELECT employee.id
  FROM employee
  LEFT JOIN leader
         ON leader.id = employee.id
 WHERE leader.id IS NULL
```

leader側もデータがないものだけがleader.id IS NULLになる。つまり集合差になる。


基本的にLEFT JOIN + IS NULL方式、indexがない場合は NOT EXISTS方式、という感じだろうか。なんにせよ実行前にexplainするのが基本ですね