OmniAICreator/Qiita-1.07M huggingface dataset:
DB2のロックを取得する方法


障害系のテストをするときにテーブルにロックをかける方法。
DB2コマンド（db2cmd）を起動して以下のSQLを実行する。

## １．更新ロック（行単位）

### トランザクションA（ロックをかける側）
DB2コマンドを起動して以下のSQLを実行する。

```SQL:トランザクションA（ロックする側）
-- 最初にDB2のみ打ち込んで対話モードにする。
db2

connect to データソース名 user ユーザー名 using パスワード

-- 自動コミットをOFFにする。
update command options using c off

select * from テーブル名 where key = '111' for update with rs

-- ここまでの実行で key = '111' の行に更新ロックがかかるので、ロックされる側のトランザクションBを実行する。

-- コミットされるまでロックは続くので、トランザクションB（ロックで待たされる側）のテストが終わったら最後にコミットまたはロールバックでロック解除を忘れずに。

commit

```

### トランザクションB（ロックで待たされる側）
トランザクションAで行に更新ロックがかかったら、ロックされる側のトランザクションBを実行する。

```SQL:トランザクションB（ロックで待たされる側）
connect to データソース名 user ユーザー名 using パスワード

update テーブル名 set カラム名 = '222' where key = '111'

-- トランザクションAにより key = '111' の行に更新ロックがかかっているため、トランザクションBはここでロック待ち状態となる。

```

## ２．更新ロック（テーブル単位）

### トランザクションA（ロックをかける側）
DB2コマンドを起動して以下のSQLを実行する。

```SQL:トランザクションA（ロックする側）

-- 最初にDB2のみ打ち込んで対話モードにする。
db2

connect to データソース名 user ユーザー名 using パスワード

-- 自動コミットをOFFにする。
update command options using c off

lock table テーブル名 in share mode

-- ここまでの実行でテーブルに更新ロックがかかるので、ロックされる側のトランザクションBを実行する。

-- コミットされるまでロックは続くので、トランザクションB（ロックで待たされる側）のテストが終わったら最後にコミットまたはロールバックでロック解除を忘れずに。

commit

```

### トランザクションB（ロックで待たされる側）
トランザクションAでテーブルに更新ロックがかかったら、ロックされる側のトランザクションBを実行する。

```SQL:トランザクションB（ロックで待たされる側）

connect to データソース名 user ユーザー名 using パスワード

update テーブル名 set カラム名 = '222'

-- トランザクションAによりテーブルに更新ロックがかかっているため、トランザクションBはここでロック待ち状態となる。

```

## ３．排他ロック（テーブル単位）

### トランザクションA（ロックをかける側）
DB2コマンドを起動して以下のSQLを実行する。

```SQL:トランザクションA（ロックする側）

-- 最初にDB2のみ打ち込んで対話モードにする。
db2

connect to データソース名 user ユーザー名 using パスワード

-- 自動コミットをOFFにする。
update command options using c off

lock table テーブル名 in exclusive mode

-- ここまでの実行でテーブルに排他ロックがかかるので、ロックされる側のトランザクションBを実行する。

-- コミットされるまでロックは続くので、トランザクションB（ロックで待たされる側）のテストが終わったら最後にコミットまたはロールバックでロック解除を忘れずに。

commit

```

### トランザクションB（ロックで待たされる側）
トランザクションAでテーブルに排他ロックがかかったら、ロックされる側のトランザクションBを実行する。

```SQL:トランザクションB（ロックで待たされる側）

connect to データソース名 user ユーザー名 using パスワード

select * from テーブル名

-- トランザクションAによりテーブルに排他ロックがかかっているため、トランザクションBはここでロック待ち状態となる。

```

## ４．テーブルアクセス中にエラーを発生させる
上記１〜３のいずれかの方法でロック待ち状態の間に、テーブルスペースを排他モードで静止してエラーを発生させる。

### トランザクションA（ロックをかける側）

```SQL:トランザクションA（ロックする側）

-- トランザクジョンBがロック待ちの間にQUIESCEコマンドを実行し、テーブルスペースを排他モードで静止する。

QUIESCE TABLESPACES FOR TABLE テーブル名 EXCLUSIVE

-- トランザクションBでエラーが発生する。

-- テストが終わったら解除を忘れずに。

QUIESCE TABLESPACES FOR TABLE テーブル名 RESET

```

### トランザクションB（ロックで待たされる側）
トランザクションBでは以下のようなエラーが発生する。

```SQL:トランザクションB（ロックで待たされる側）

-- 更新ロックの場合

DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。

SQL0911N デッドロックまたはタイムアウトのため、現在のトランザクションが ロールバックされました。 理由コード "2"  SQLSTATE=4001


-- 排他ロックの場合

SQL0290N 表スペース・アクセスが許されていません。  SQLSTATE=55039

```
プラグイン「UploadPack」の保存場所をwebroot以上にする

デフォルトだとwebrootの下のフォルダにファイルが保存されてしまうので、
`path`を変更してwebrootより上の階層にファイルを保存したい。

やりたいことは簡単。`path`をwebrootより上に指定すればいい。

https://github.com/szajbus/uploadpack#you-can-change-the-path-where-the-files-are-saved
上記URLを参考に`CakePHP/data`にファイルを保存すべく設定してみる。

```php
var $actsAs = array(
    'UploadPack.Upload' => array(
        'item' => array(
            'path' => ':app/../data/img/:basename_:style.:extension'
        )
    )
);
```
`:app`はappディレクトリのこと。`CakePHP`はそれより上なので`../`を指定。
これで任意の場所に保存ができる。

ただし、これだけだと保存場所だけが変わってヘルパーとの連携がとれない。
`path`変更のところを読み進めていくとなにやら`You can change the url the helper points to when displaying or linking to uploaded files`と書いてある。
なんだか怪しい。

```php
var $actsAs = array(
    'UploadPack.Upload' => array(
        'item' => array(
            'url'  => '/view(任意のController名)/image(任意のアクション)/:id/:basename_:style.:extension',
            'path' => ':app/../data/img/:id/:basename_:style.:extension'
        )
    )
);
```
こんな感じにしてみる。
それからViewでドキュメント通り表示してみると↓

```php
echo $this->Upload->uploadImage($image['Image'], 'Image.item')；
```
HTMLが↓のように生成される。

```html
<img alt="" src="/view/image/6/test.png">
```
あとは、`/view/image`に引数を与えてアクセスした時に保存した場所から画像を出力できるようにすればいい。

画像の表示については[こちら](http://qiita.com/xx_small/items/1464bc38f6945a1829d2)
ローカル変数配列によるスタックオーバーフロー

地味にトラブルシューティングに迷ったので記事にしました。

# 問題

```[cpp]
printf("テストコードの開始")

BYTE	text[1024*1000] = {0};
if( x == y )
{
	strcpy( text, string1 );
}
else
{
	strcpy( text, string2 );
}

printf("テストコードの終了")
```

　テストコードとして上記の様なコードを書いて実行したところ、スタックオーバーフローが発生しました。
　ステップ実行で発生箇所を確認したところ、スタックオーバーフローが発生した位置はprintf("テストコードの開始")でした。
　<b>さて、このコードはなにが問題でしょうか？</b>

# 正解

　ローカル変数が確保されるスタック領域で1MBのような大きな変数を使用するとスタック領域なくなり、実行時に何らかのスタックを使用する機会があるとスタックオーバーフローを吐き出します。

　ちなみに、私が使用している環境(VS2010Pro)ではデフォルトのスタックサイズは1MBとなっていました。Linuxなどでは8MBぐらい確保されている場合もあるらしいのでどこまでスタックで確保していいのかは開発環境と相談するしかないでしょう。
　横着せずにヒープ領域からメモリを確保(malloc/new等）すれば問題ないんですけどね。
　ちなみにVisualStudioでは、ソリューションのプロパティから「構成プロパティ」>リンカ＞システムにある「スタックのサイズの設定」を指定してやればスタック容量を変更することができます。お勧めできませんが。
mysql 最短レプリケーション

メモです。
２手詰め的な。

とりあえず盛ってみたけどホントに最短かどうかは知らない。

真似してぶっ壊れても知りません。

# 必要

* slave -> master にsshできること
* mysqlにrootでログインできること


## master側 (192.168.0.180)

### server-id と log-bin の設定

```bash
echo "log-bin" >> /etc/my.cnf
echo "server-id = 1" >> /etc/my.cnf
service mysqld restart
```

### レプリケーション用ユーザ追加

```bash
cat <<'EOD' | mysql -uroot
GRANT REPLICATION SLAVE
  ON *.*
  TO repl@`192.168.%`
IDENTIFIED BY 'awesome_password';
EOD
```

## slave側 (192.168.0.181)

### server-id の設定

```bash
echo "server-id = 2" >> /etc/my.cnf
service mysqld restart
```

### `CHANGE MASTER TO` してmasterをdumpしてきたのを流す

```bash
(
echo "STOP SLAVE;"
cat <<EOD
CHANGE MASTER TO
  MASTER_HOST='192.168.0.180',
  MASTER_USER='repl',
  MASTER_PASSWORD='awesome_password';
EOD
ssh 192.168.0.180 <<< "mysqldump -uroot --all-databases --add-drop-table --master-data --single-transaction"
echo "START SLAVE;"
) | mysql -uroot
```
crontab に登録した Python 2.7 スクリプトから awscli を呼び出そうとして地味にハマっていたこと


# まとめ
- python から呼び出す時に `aws cli` のコマンドは絶対パスで入れる。
	- `/usr/local/bin/aws s3 cp s3://hoge/fuga/foo.txt bar.txt` とか。

`boto` 使わなかったのはバケットの下の方にしかアクセス権限がなくてエラー出た気がしたため。

# やりたいこと

```sh
$ aws s3 cp s3://hoge/fuga/foo_20160711.txt .
```
とかで S3 からファイルを持ってきたいわけです。ファイル名は日付とかで毎日変わる。ダウンロードに成功したら取り込みの処理をして、とか何とか。とりあえず python で呼び出すようにしようと思います。

# やってみた
```fetch.py
import datetime
import os
import stat
import subprocess
import tempfile


def main():
	fd, tmp = tempfile.mkstemp()
    os.close(fd)
    os.chmod(tmp, stat.S_IRWXU | stat.S_IROTH)
    filename = 'foo_{}.txt'.format(datetie.datetime.now().strftime('%Y%m%d'))
    subprocess.check_call([
	    'aws',
     	's3',
	    'cp',
	    's3://hoge/fuga/{}'.format(filename),
		tmp,
    	'--quiet',
    ])
	do_something(tmp)

if __name__ == '__main__':
	main()
```

みたいな感じでコードを組む。
コマンドラインから走らせて動作を確認したのでcrontab に放り込みます。

```crontab
0 1 * * * /usr/local/bin/python /home/vagrant/fetch.py
```

ダメだった。

# ダメな理由
実行履歴を見ると普通にエラーが出ます。`aws` コマンドが存在しないと言われている。そういえば `awscli` のコンフィグファイルがホームディレクトリにあるので、環境変数でホームディレクトリをキッチリ指定しておかないとコンフィグが読み込めないという話をどっかで聞きました。しかし、そもそも `aws` コマンドが無いと言われているわけだから、環境変数の問題に辿り着いていない。`PATH` がないのかもしれない。`PATH` を足すか、直接コマンドの場所を指定すると解決しそうな気がしますね。


# 修正
- crontab にホームディレクトリを追加
- `subprocess.check_call()` に環境変数を渡す
- aws コマンドを which とかで探して直接参照させる

```crontab
HOME=/home/vagrant
0 1 * * * /usr/local/bin/python /home/vagrant/fetch.py
```

```fetch.py
import datetime
import os
import stat
import subprocess
import tempfile


def do_something(name):
	return


def main():
	fd, tmp = tempfile.mkstemp()
    os.close(fd)
    os.chmod(tmp, stat.S_IRWXU | stat.S_IROTH)
    filename = 'foo_{}.txt'.format(datetie.datetime.now().strftime('%Y%m%d'))
    subprocess.check_call([
	    '/usr/local/bin/aws',
     	's3',
	    'cp',
	    's3://hoge/fuga/{}'.format(filename),
		tmp,
    	'--quiet',
    ], env=os.environ.copy())
	do_something(tmp)

if __name__ == '__main__':
	main()
```

だいたい動いた。
Sourcing Your Rails Environment

You may source your whole application's environment from environment.rb, here's an example:

```rb
$ irb
irb(main):001:0> require 'config/environment.rb'
=> true
irb(main):002:0> Thing.find(:first)
```


Your database config, and all of your models can be used in your program now.

http://runningrails.blogspot.com/2007/09/standalone-scripts.html
Docker beta for macをインストールしたらdocker psあたりでError response from daemon: Bad response from Docker engine

# TL;DR
Docker beta for macをインストールしたらdocker psあたりを実行すると

```
Error response from daemon: Bad response from Docker engine
```

となる。

# よくある原因
## docker toolboxがインストールされている場合
https://github.com/docker/toolbox/blob/master/osx/uninstall.sh
を使用してuninstallしましょう。

```bash
git clone https://github.com/docker/toolbox.git
sudo ./osx/uninstall.sh
```

このあとmacをrebootしてからdocker betaを起動すればOK.
petalinux / microzed > R. DHCPクライアントの起動解除 / デフォルトIP指定

```txt:動作環境
PetaLinux 2014.4
MicroZed
```

2014年の自分のメモより。

PetaLinuxではデフォルトでDHCPクライアントが起動するようになっている。
DHCPクライアントの起動を解除するには以下の変更をする。
build/linux/rootfs/targetroot/etc/network/interfaces ファイルの以下の行をコメントアウトする

```
auto eth0
iface eth0 inet dhcp
```


同じファイルにおいて起動時のデフォルトIPアドレスを指定できる

```
# The primary network interface
auto eth0
iface eth0 inet static
        address 192.168.1.111
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 192.168.1.11 192
```
petalinux / microzed > P. 自動ログイン設定

```txt:動作環境
PetaLinux 2014.4
MicroZed
```

2014年の自分のメモより

通常は起動の度にid:root, password:rootを入力してログインしないといけない。自動ログインは以下のようにして設定できる。

`1. autologin.shを以下の内容で作成する (/home/root以下に作るとする)

```
#!/bin/sh
exec /bin/login -f root
```

`2. chmod a+x autologin.sh にて実行権限をつけておく
`3. /etc/inittabの最後の方を以下のように変更する

```  
#PS0:2345:respawn:/sbin/getty -L 115200 ttyPS0 vt100
PS0:2345:respawn:/sbin/getty -l /home/root/autologin.sh -n -L 115200 ttyPS0 vt100
```

Petalinux-buildを行う場合は、 petalinux-build -x packageの前に以下を行う

- autologin.shを build/linux/rootfs/targetroot/home/root以下に上記の内容で作成
- build/linux/rootfs/targetroot/etc/inittab を上記のように変更する
 
build/linux/rootfs/targetroot/ 以下の編集でなく、別の方法としては、myapp/Makefileのinstallラベルに以下のような行を追加すること [forums.xilinx](https://forums.xilinx.com/t5/Embedded-Linux/Freeze-after-quot-INIT-no-more-processes-left-in-this-runlevel/td-p/497120)

```
install:
        $(TARGETINST) -a "PS0:2345:respawn:/sbin/getty -L 115200 ttyPS0 vt100" /etc/inittab
```

/etc/inittabに追加するような感じか。
ただ、この場合、元々あるPS0:2345:で始まる行が複数になるので、その影響を調べる必要がありそう。
Data.comクリーンアップを使った取引先地理コードの自動取得


従来、Data.comのライセンスを購入し、D&B社の持つ企業情報をData.comを通じて、Salesforce上のデータをより精緻化する、という使い方が知られていました。

Summer'16から、ライセンス未購入でも、Data.comのクリーンアップルールを使って、Salesforce上の取引先や取引先責任者、リードの地理情報(地理コード)を自動的にセットすることができるようになりました。

住所の地理コード情報の自動取得 (正式リリース) - Summer'16
http://releasenotes.docs.salesforce.com/ja-jp/summer16/release-notes/rn_general_geocodes_aloha.htm?edition=&impact=


## 1. クリーンアップルールの有効化
まずは、Data.comのクリーンアップルールの処理の有効化を行います。実際の案件では、トリガやワークフローなど、様々なレコードへの関連処理が紐付いています。この一覧画面で有効化しても良いのですが、詳細ページにまず移動し、オプションのチェック有無を検討してから、有効化をおすすめします。(ただ、Chromeだと詳細ページの有効化ボタンがうまく動かないかもしれないので、編集ボタンのみ使ってオプション編集し、有効化は一覧で。)

選択可能なオブジェクト・ルールは、
・ 取引先の請求先住所
・ 取引先の納入先住所
・ 取引先責任者の郵送先住所
・ リードの住所
の4つになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/32377/2fc81442-68a8-1dad-afd8-1ba2c0097089.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/20cbd41c-54ac-b232-0c43-546710219a33.png)

## 2. ページレイアウトにクリーンアップの関連リストを追加
ページレイアウトに、Data.comのクリーンアップ状況表示用の関連リストを追加します。
ここでは、テスト用に、通常ページレイアウトに追加できない、緯度経度の項目を確認するため、数式項目を作って配置しています。
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/b06ba52b-82e0-6f70-5ba5-d95476da636c.png)

## 3. 登録してみる
確認用に取引先を追加してみます。
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/2bb60490-2e5a-d1bb-191c-c99a2ab96888.png)
この段階では、インラインに地図は表示されていますが、確認セクションの地理情報はまだ格納されていません。(Developer Editionでは地図が表示できませんので、ご注意)

クリーンアップアクションをクリックしてみます。正常にクリーンアップされました、というメッセージが表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/413c44eb-7979-d7a9-7379-000db60d3597.png)

緯度と経度が更新されています。
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/4e4b9cbe-a7fa-d6a7-c494-9b6b73b67dad.png)


また、正確性という箇所には、"Address"と表示されています。どの程度の精度で、緯度と経度が求められたかを選択リスト値で結果を示しています。詳しくは、下記ヘルプを御覧ください。

*地理コード項目
https://help.salesforce.com/HTViewHelpDoc?id=data_dot_com_clean_geocode_information_fields.htm&language=ja*

## 留意事項
- 詳細レコードが更新される毎に評価されます。例えば上記の例では、「丸の内2-7-2」を「丸の内2」に変えた段階で、Data.comのデータとマッチしなくなるため、正確性・緯度・経度の部分はブランクになります。
- 国の項目には、「Japan」と入れた方が良さそうです。「日本」と入れると、マッチしません。
- Data.comのデータに依存するため、入力の仕方(例えば2-7-2を全て全角にするとか)によってすぐにマッチしなくなります。
- 同じく、オフィスが移転した場合、新規ビルのオフィス毎に割り振られた郵便番号を指定したり、事業所郵便番号を指定したりした場合に、Data.comにまだ存在しない場合はマッチしません。

そのため、上記のようなマッチしないという仕様を割り切るか、手動で上書きするような仕組みを用意するか、の検討が必要です。ただ、これでGoogle Mapライセンスを購入することなく、チェックインした場所の近くの取引先を、Salesforce1で表示する、といった仕組みがより作りやすくなったと言えます。
.cppファイルでObjective-C++を可能にする。

# 概要
基本的にObjective-CとC++を混在するファイルは.mmファイル内に記述し、iOSとAndroidで共通する処理は.cppファイルに記述すると自動的にXcodeがビルドオプションを設定してくれるのでベーシックな方法ではありますが、iOS firstで開発してる場合、ファイルの分離が面倒だったりすることもあります。
ファイル拡張子で区別するのではなく、自分でビルドオプションを設定してObjective-C++を可能にする方法を記載します。

## 方法1
1. Xcode上でObjective-C++を記述したいcppファイルを選択。
2. インスペクターの"Identity and Type"でTypeをC++ SourceからObjective-C++ Sourceに変更する。
3. クリーンビルドを実行する。

## 方法２
1. Build Settingsから"Other C++ Flags"を検索。
2. オプションにobjective-c++を追加

方法２では全てのcppファイルがObjective-C++を許可するので、気持ち悪い人は方法１で個別設定することをオススメします。
Alpine LinuxをVMWareで動かしDISKのバックアップリストア

* ISOイメージが小さかったので選んだ。

## Download

* [Downloads | Alpine Linux](https://alpinelinux.org/downloads/)

![iso.png](https://qiita-image-store.s3.amazonaws.com/0/25728/90d0fb21-59f5-cfa4-87f5-1c2167f2b239.png)

## ネットワーク設定

* [Configure Networking - Alpine Linux](https://wiki.alpinelinux.org/wiki/Configure_Networking#IPv4_DHCP_Configuration)

* root : パスワードなし でログイン。

![ip.png](https://qiita-image-store.s3.amazonaws.com/0/25728/40198109-3b72-33e1-dbda-c3957df2a6ba.png)

```bash:/etc/network/interfaces
auto eth0
iface eth0 inet dhcp
iface eth0 inet static
    address xxxxxxxxxxx
    netmask xxxxxxxxxxx
    gateway xxxxxxxxxxx
```

```bash:設定反映
/etc/init.d/networking restart
```

## sshd有効化

```bash:
apk update
apk add openssh
passwd root
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
/etc/init.d/sshd restart
```

* ssh root@ipaddress
    * ほかの端末から接続すること。`ssh localhost`はできなかった。

## ネットワーク経由でdd

* [[Linux]ネットワーク経由でHDDデータをダンプ | anopara](http://anopara.net/2013/11/28/linux%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E7%B5%8C%E7%94%B1%E3%81%A7hdd%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%83%80%E3%83%B3%E3%83%97/)
* windowsの場合は[busybox](https://frippery.org/busybox/)で代用。

### バックアップ

```bash:受信側
nc -l 12345 | bzip2 -d | dd bs=16M of=sda.dd
```

```bash:送信側
dd bs=16M if=/dev/sda | bzip2 -c | nc [受信側マシンのIPアドレス] 12345
```

### リストア

```bash:受信側
nc -l 12345 | bzip2 -d | dd bs=16M of=/dev/sda
```

```bash:送信側
dd bs=16M if=sda.dd | bzip2 -c | nc [受信側マシンのIPアドレス] 12345
```

----

## debian isoのrescue modeを使用する場合

### リストア

```bash:受信側
nc -l -p 12345 | dd bs=16M of=/dev/sda
```

```bash:送信側
dd bs=16M if=sda.dd | nc [受信側マシンのIPアドレス] 12345
```

----

## dd 

```bash:wgetでdd
wget -qO- http://myserver.com/clonezilla-live-2.4.7-8-i686.iso \
| dd if=/dev/stdin of=/dev/sda bs=16M
```
Sharing Debuggerを使ってFacebookのシェアダイアログで表示される情報を確認しよう


# 概要
はてなブログなどでブログ記事を公開した直後にFacebookでシェア使用とすると、設定した`og:image`や`og:title`、`og:description`などが上手く表示されない場合があります。このような時にはFacebookが開発者向けに用意しているツール「Sharing Debugger」を利用すると上手く表示させる事ができます。


# ツールの使用方法

## Facebook Developerにアクセス

[https://developers.facebook.com/](https://developers.facebook.com/)にアクセスします。開発者登録が済んでない場合は済ませましょう。

## Sharing Debuggerにアクセス

ツール&サポートから「Sharing Debugger」をクリックします。

![qiita_sharing_debugger_1.png](https://qiita-image-store.s3.amazonaws.com/0/43438/d0de07d7-84a2-f8bc-7844-c3cb1656c33d.png "qiita_sharing_debugger_1.png")


以下のようなページが表示されるはずです。これが「Sharing Debugger」です。

![qiita_sharing_debugger_2.png](https://qiita-image-store.s3.amazonaws.com/0/43438/f17dd789-07e8-2dd0-b0c4-53d7fdce5f93.png "qiita_sharing_debugger_2.png")


## Sharing Debuggerでウェブサイトの情報を取得

「URLを入力」というフォームに対象のウェブサイトのURLを貼ります。そして「デバッグをクリック」してください。すると様々な情報が表示されます。これらの情報がFacebookでコンテンツをシェアする際に表示される情報になります。

![qiita_sharing_debugger_gif.gif](https://qiita-image-store.s3.amazonaws.com/0/43438/ce23153f-8e61-3c3f-228c-256f75c2276d.gif "qiita_sharing_debugger_gif.gif")


## Sharing DebuggerでFacebookのクローラーにウェブサイトの情報を再取得させる

「Scrape Again」をクリックすることでFacebookのクローラーに情報を再取得させることができます。ogタグの内容を変更した場合や、ウェブサイトの情報が正しく取得されていない場合、これによって解決することができます。

![qiita_sharing_debugger_3.png](https://qiita-image-store.s3.amazonaws.com/0/43438/ca629238-d859-55d5-2287-66e8e9730d6d.png "qiita_sharing_debugger_3.png")
SQL Server2016 OPENJSON使い方

###SQL Server2016 OPENJSON使い方
```sample.sql
DECLATE @param1 navarchar(50);
DECLATE @param2 nvarchar(50);

SELECT @param1=myou, @param2=name FROM OPENJSON( N'{"myou":"山田","name":"太郎"}' )
 WITH ( myou nvarchar(50) '$.myou' , name nvarchar(50) '$.name' )
```
DockerのbuildでThe command 'apt-get install ' returned a non-zero code: 100 となった時の対処法

`docker-compose build`時に

```shell
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
The command '/bin/sh -c apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev git'
returned a non-zero code: 100
```

とエラーが出て困ったのでメモ。

該当コンテナのDockerfileの中から

```Dockerfile
RUN apt-get update

RUN apt-get install -y \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng12-dev \
    git
```

を見つけ出して

```Dockerfile
RUN apt-get update && apt-get install -y \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng12-dev \
    git
```

と変更してみたらうまくいきました。

参考: http://lenguyenthedat.com/docker-cache/
記事曰く、Dockerのコンテナでセットアップするときにキャッシュが悪さをしているようですがよくわかってません（よくわかってない）
現在のディレクトリ以下にあるファイルのパス一覧を取得するバッチファイルを書いた

一年近く前に書いた[現在のディレクトリ以下にあるファイルのパス一覧を取得](http://qiita.com/bl3utide/items/cf593f29e46fee7150d3)は、現在の業務で頻繁に使用しているコマンドだが、めんどくさい問題が2点あった。

- 本当はディレクトリの区切り文字をバックスラッシュじゃなくてスラッシュで取得したい。
- コマンドを実行したあとに別のファイルにコピペしなければいけない。

これまでは、コマンドの実行結果を矩形選択からコピーして、別のファイルにペーストして、それをGvimで置換処理するという作業をしていたが、一年近くこんなことを続けててそろそろ楽をしたくなってきたので、楽できるバッチファイルを書いた。

```bat:filelist.bat
::: カレントディレクトリ以下にあるファイルを全て取得
::: 相対パスでリスト出力する
@echo off
setlocal enabledelayedexpansion
set BSLASH=\
set CD_S=%CD%%BSLASH%
set RESULT=
for /f "usebackq tokens=*" %%i in (`dir /s /b /a-d`) do (
  set RESULT=!RESULT!^

%%i
)
set LIST_SUB=!RESULT:%CD_S%=!
set /p LIST=!LIST_SUB:\=/!<nul
endlocal
```

```bat:flcp.bat
::: filelistの結果をクリップボードにコピーする
@echo off
call filelist
call filelist | clip
echo;
echo;
echo ファイル一覧をクリップボードにコピーしました。
```

これらのファイルを、環境変数PATHが通っている任意のディレクトリに置く。
あとはファイル一覧を取得したいディレクトリをShift+右クリックでコマンドプロンプトを開き、上記のどっちかを実行するだけ。
filelist.batはスラッシュ区切りのパス一覧を標準出力するだけ。
flcp.batはfilelist.batの結果をクリップボードにコピーしてくれる。
これからはflcpを実行して任意のテキストファイルにペーストするだけになり、時間の短縮に成功した。
riot.jsでSPA開発をする際に、特定のURLだけSPAから除外したい時のTips

# 概要
## SPA前提で作っている時、api開発中などで特定のURLについてはフロント側(RIOT)ではなくサーバ側のルーティングで処理させたい

特定のURLへのアクセス時にはriotのルーティングを止めた上でアクセスさせてあげればOKです。その他のルーティングの場合に監視開始させてあげればルーティングはまたフロント側の制御に戻ります。

```hoge.js
riot.route('/hoge/*', function(path) {
  // ルーティング監視を停止させ、サーバののルーティングを呼ぶ
  riot.route.stop();
  // ワイルドカードは引数pathに入る。
  location.href='/hoge/' + path;
});
/*
以下、その他のルーティング
*/

// ルーティング監視開始
riot.route.start(true);
```

## この時にはまること
### URLを直接叩くとルーティングが機能せず404になる
SPAのルーティングはフロント側の担当なので、当然フロント側でルーティング用のファイルを読み込まないでURLを直接叩くと、サーバ側のルーティングを見に行くため404になります。
その場合は、どんなurlが来てもSPA用のテンプレートを呼べるようにし、そのテンプレート内でルーティングを行えばOKです。

```config/routes.rb
Rails.application.routes.draw do
  root to: 'home#spa'
  get '*path', to: 'home#spa'
end
```

### rails実装の参考
「その他全て」のルートを定義するには
http://qiita.com/takeyuweb/items/9c80daff796043798baa
Eclipseのプラグイン開発で、Hello,worldする。

#はじめに

Eclipseのプラグインを開発するためのプラグイン、Plug-in Development Environment(PDE)を使用してHello,worldする方法をまとめました。

#1.Eclipseをダウンロード、インストール

Eclipseをダウンロード、およびインストールします。

##1.1 ダウンロード
1. [公式サイト](http://www.eclipse.org/home/index.php)にアクセスし、右上にあるダウンロードをクリック。
2. Get Eclipse Neonとあるので、ダウンロードをクリック。
3. どこのサーバーからダウンロードするのかが決定されるので、続けてダウンロードをクリック。
4. ダウンロードが開始されます。

##1.2インストール
1. ダウンロードしたexeファイルを実行。
![temp001.PNG](https://qiita-image-store.s3.amazonaws.com/0/115251/4c995790-2d5b-833e-5ad9-237334f7dce7.png)
　

2. Eclipse IDE for Eclipse Committersをクリック。
![temp002.PNG](https://qiita-image-store.s3.amazonaws.com/0/115251/36c1f4ad-241e-550f-1371-bb4766b41ce3.png)
　
3.INSTALLをクリック
![temp003.PNG](https://qiita-image-store.s3.amazonaws.com/0/115251/72a068cf-5635-bde2-e51e-b74618750506.png)

##2.サンプルプロジェクトの作成と実行

サンプルプロジェクトを作成し、実行します。

1. インストールしたEclipseを起動後、File > New > Plug-in Project　を選択。
2. プロジェクトの名前を適当なものにしてNextをクリック。
![temp004.PNG](https://qiita-image-store.s3.amazonaws.com/0/115251/cd74821b-a6d4-967a-d7fa-e4abae9ada19.png)

3. そのままNextをクリック。 
![temp005.PNG](https://qiita-image-store.s3.amazonaws.com/0/115251/4898b3c2-915a-0578-959f-9b06ac3f0745.png)
 　
4. テンプレートの中からHello,World Commandを選択してFinishをクリック。 
![temp006.PNG](https://qiita-image-store.s3.amazonaws.com/0/115251/11ae7c4d-237d-1407-c92f-5f8ed8359363.png)

5.　以下のようにプロジェクトが作成されるので、pulgin.xmlをクリック。
![temp007.PNG](https://qiita-image-store.s3.amazonaws.com/0/115251/132fccff-8bbb-6c95-382c-5fa0e9348e37.png)
　
6. Overviewタブ内の、Testingカテゴリに、Launch an Eclipse applicationがあるのでクリック。![temp008.PNG](https://qiita-image-store.s3.amazonaws.com/0/115251/f38e638e-6e96-2b99-27f3-202034c1a152.png)
　
7. 開発しているプラグインを含むEclipseがもう1つ起動する。
8. 新たに起動したEclipseのメニューバーから、Sample Menu > Sample Commandをクリックすると、開発しているプラグインが実行される。

#3.注意点

PDEの使用に関する注意点をまとめました。

1.Target PlatformをRunning Platformにすること。デフォルトではそうなっていると思いますが、私の環境ではなぜか他のプラットフォームが選択されており、プラグイン開発のためのjarがBuild PathのLibraryに追加されていませんでした。
![temp009.PNG](https://qiita-image-store.s3.amazonaws.com/0/115251/6fe6c066-716f-4df6-ec54-e654dd602fb6.png)

#参考元
1. [Eclipse Plug-in Development Environment](http://www.eclipse.org/pde/)
libfreenect2をwindowsにインストール


#libfreenect2とは
libfreenect2とはKinect V2を使うためのマイクロソフト非公式ドライバーです。

このlibfreenect2を使うことで、linuxでKincet V2を使うことができるほか、複数のKinect V2を使うことができます。

今回公式サイト[libfreenect2](https://github.com/OpenKinect/libfreenect2)
を参考にwindows PCにlibfreenect2をインストールしたのでメモ

#UsbDk
[UsbDk](https://github.com/daynix/UsbDk/releases)のダウンロードサイトから最新のmsiファイルをダウンロードしてインストールします

#libfreenect2のダウンロード
libfreenect2のDOIから[こちらのサイト](https://zenodo.org/record/50641#.V3uNj7iLSUk)に飛んでlibfreenect2-v**.zipをダウンロードします。

ダウンロードしたzipファイルを解凍、CMakeを使ってインストールします

##CMakeのGUIを起動(必要ファイルの確認)
自分は以下の設定でビルドしました

ソースコードの場所: C:/libfreenect2
ビルドの場所:  C:/libfreenect2/build

ここでエラーが発生
以下のソフトが必要と出ます

 - TurboJPEG
 - GLFW
 - OpenNI2
 - OpenCL(一部のPCで)
 - CUDA (Nvidiaを使ってるPCで)

TurboJPEG以外のソフトはlibfreenect2のInstallationを参考にダウンロード

TurboJPEGは少々面倒だったので以下にメモ

#TurboJPEGのインストール
バイナリデータではなく、gitでソースコードごとダウンロードして作業しましょう
[ダウンロード](https://github.com/libjpeg-turbo/libjpeg-turbo)

これを使ってビルドします(解凍したときに出てくるBUILDING.md参照)

##Building.mdをつかったTurboJPEGのインストール
nasmをインストールして
C:\Users\jiroc_000\Desktop\Visual Studio Tools\Windows Desktop Command Prompts
のVS2015 x64 Native Tools Command Prompt
をつかってインストールしました

[nasmのインストール](http://bb-side.com/modules/side04/index.php?content_id=14)

#libfreenect2のビルド
ビルドの設定において、例えば

```
LibUSB_DLL: C:/libfreenect2/depends/libusb/MS64/dll
LibUSB_LIBRARIES: C:/libfreenect2/depends/libusb/MS64/dllに設定

TurboJGEG_DLL C:/libfreenect2/depends/libjpeg-turbo64/build/turbojpeg.dll
TurboJGEG_LIBRARIES C:/libfreenect2/depends/libjpeg-turbo64/build/turbojpeg.dll

その他インストールしたプログラムのパスを入力
```

というように設定してコンフィギュレーション→ジェネレーションしてください

するとBuildフォルダにソリューションファイルが出てくるのでVisual Studioで起動してビルドしてください

これでインストールは完了(のはず)お疲れさまでした。

サンプルプログラムを動かして確認してみましょう

#サンプルプログラムの起動
うまくビルドできていればbuild/bin/DebugにProtonect.exeができているはずです。Kinectv2をつないで動作を確認してみましょう

#USBDKの再インストール(任意)
うまくインストールできない場合は再インストールでうまくいくことが多いです


#C#で使う
[dbruning](https://github.com/dbruning/freenect2sharp)さんというかたがC#のラッパーを作っていました

Runtime Library -> /MDdで起動
XcodeのSimulatorが動かなくて泣いた話

XcodeのSimulatorが動かない、調べればたくさん解決法が出てきます。

* clean
* clean build folder
* DerivedData delete
* /Library/Debeloper/CoreSimulatorを削除
* OS再起動
* Xcode再インストール

ただ、最近Simulatorが動かなくなった時に、これらを全てやっても全く解消されず泣いていたのですが、作業ディレクトリ削除→git cloneからやり直しで解決しました。
詳しい原因はわからなかったのですが、上記で解消できない時は、まっさらにしてみるのがてっとり早いかもしれません。。
(xcodeに関するcleanばかり試していて盲点だったので書き残しておく)
Googleスプレッドシートで1行毎に白黒付けたい


## こうしたい

![スクリーンショット 2016-07-11 16.05.53.png](https://qiita-image-store.s3.amazonaws.com/0/43938/7da5bfca-924e-064c-7fc1-cc624e495d4d.png "スクリーンショット 2016-07-11 16.05.53.png")

## 1. 一番左上のCellで左クリックからの「条件付き書式」

![スクリーンショット 2016-07-11 16.06.56.png](https://qiita-image-store.s3.amazonaws.com/0/43938/800506bc-04cf-a527-cdae-b609478733e6.png "スクリーンショット 2016-07-11 16.06.56.png")

## 2. 「セルの書式設定の条件」を以下に設定

![スクリーンショット 2016-07-11 16.08.51.png](https://qiita-image-store.s3.amazonaws.com/0/43938/67b07619-e93d-fba4-928d-761c58f4cdb6.png "スクリーンショット 2016-07-11 16.08.51.png")

```
# 偶数行に色を付けたい場合
=MOD(ROW(), 2)=0

# 奇数行に色を付けたい場合
=MOD(ROW(), 2)=1
```

## 3. それっぽい色を設定して完了

![スクリーンショット 2016-07-11 16.11.56.png](https://qiita-image-store.s3.amazonaws.com/0/43938/67e121a9-4754-d482-fed9-a984c16f9ea4.png "スクリーンショット 2016-07-11 16.11.56.png")
組合せ最適化でグループ分け

# 問題
26個のグループがあり、それぞれ下記のような人数で構成されています。


```py3:python3
import numpy as np
n = 26 # グループ数
np.random.seed(11)
a = np.random.randint(10, 20, n) # グループごとの人数
for i in range(n):
    print('グループ%2d %d人'%(i, a[i]))
>>>
グループ 0 19人
グループ 1 10人
グループ 2 11人
グループ 3 17人
グループ 4 11人
グループ 5 17人
グループ 6 12人
グループ 7 18人
グループ 8 10人
グループ 9 10人
グループ10 14人
グループ11 12人
グループ12 11人
グループ13 15人
グループ14 15人
グループ15 17人
グループ16 14人
グループ17 11人
グループ18 18人
グループ19 18人
グループ20 11人
グループ21 13人
グループ22 16人
グループ23 12人
グループ24 12人
グループ25 10人
```

- 26グループを6部屋(0, 1, 2, 3, 4, 5)に分けます。(1部屋に複数グループ)
- 同じグループは、同じ部屋とします。
- グループ番号の若い順から、部屋番号の若い順に割当てます。
    - グループ a, b (a<b) を、それぞれ部屋番号 c, d に入れる場合、c <= d でないといけない。
- 1部屋は、63人まで。

グループをどこで分けたらいいでしょうか？

# Python で解いてみる

組合せ最適化問題に定式化して解きます。

```py3:python3
from pulp import *
limit = 63 # 部屋の容量
m = LpProblem() # 数理モデル
# そのグループまでの部屋の人数
x = [LpVariable('x%d'%i, lowBound=a[i], upBound=limit) for i in range(n)]
# 前後のグループで部屋を分けるかどうか
y = [LpVariable('y%d'%i, cat=LpBinary) for i in range(n-1)]
m += lpSum(x) # 目的関数
m += lpSum(y) <= 6-1 # 部屋数=6以下(区切りは6-1)
for i in range(n-1):
    m += x[i+1] >= x[i] + a[i+1] - limit * y[i] # 同じ部屋なら人数を加算
m.solve() # 求解
print(LpStatus[m.status])
print([int(value(x[i])) for i in range(n) if i==n-1 or value(y[i])])
>>>
Optimal
[57, 58, 57, 61, 58, 63]
```

- 分散最小だと、非線形になり解きづらい。
- 最大値の最小化だと、ソルバーは解きづらいので、制約としている。

CodeIQを参考にしました。
[【日常に潜む最適化問題】受験者をなるべく均等に試験会場に割り振るアルゴリズム](https://codeiq.jp/magazine/2014/06/10973/)

以上
[Windows]Windows 10への無償アップグレード関係

ただの備忘。

無償アップグレードのWindows 10をクリーンインストールする最強の方法
http://makeyoufree.net/windows10-clean-install-without-upgrade/

Windows 7を当面使い続けるつもりの人は注目！
Windows 10の“無償アップグレード権”だけを確保できる方法
http://forest.watch.impress.co.jp/docs/special/1005828.html

（7/28追記）
以下の記事がより正確と思われ。

Windows 10 無償期間が過ぎても無償アップグレードを維持する方法
http://tanweb.net/2016/05/12/7839/

続・Windows 10 無償期間が過ぎても無償アップグレードを維持する方法
http://tanweb.net/2016/06/03/8757/

（7/29追記）
Windows Updateがまともに動作してくれないと、Windows 10のアップグレードができないため、何らかの対策が必要。

「Windows 7」で「Windows Update」の確認が終わらない場合の対策方法について
http://www.japan-secure.com/entry/measures_method_in_the_case_of_confirmation_of_the_Windows_Update_does_not_end.html

（2017/11/27追記）
実質的にはまだ無償アップグレード可能なようです

Windows 10の無料アップグレードは2017年大晦日まで
https://www.lifehacker.jp/2017/11/171120-get-your-free-windows-10-upgrade-before-the-end-of-the.html
tcp socketを使っていて一生FIN_WAIT2が残ってしまう

Node.jsでTCPプロキシを作っていて以下の様にFIN_WAIT2が残り続けてしまう場合に遭遇したので。
環境は CL -> PROXY(node.js) -> ELB(TCP MODE) -> SV
SVは無言で再起動かかる環境。

```
tcp        0      0 ip-172-31-13-220.ap-n:41594 ec2-x-x-x-161.ap-:8333 FIN_WAIT2   
tcp        0      0 ip-172-31-13-220.ap-n:33570 ec2-x-x-x-177.ap-:8333 FIN_WAIT2   
tcp        0      0 ip-172-31-13-220.ap-n:41728 ec2-x-x-x-161.ap-:8333 FIN_WAIT2   
tcp        0      0 ip-172-31-13-220.ap-n:41724 ec2-x-x-x-161.ap-:8333 FIN_WAIT2  
```

切断にendのみ、使っていたがそれだと問題が起きる

```
socket.end(); // shutdownに相当？
```

ドキュメント読むとNode.jsのsocket.endはBSD SOCKETのshutdownに相当するようで
この段階ではまだhalfclose状態なので相手からACKが来るのを待っている
来なければ一生待つので破棄命令を付け加える

```
socket.end();
socket.destroy(); // closeに相当？
```

※ 呼ぶタイミングはend直後で大丈夫そうだが、どのタイミングでdestroyを呼べばいいのかあとでソース読んで検討。
※ OSのtcp_fin_timeoutパラメータで対応できると思ったがうまくいかない
※ プロキシ作った理由が元のjavaのプログラムが一度DNSを引いたらそのIPアドレスを永遠に使うのでELBと相性が悪かった

## Socket.destroySoon()を呼べばいいのだろうか？

```:node/lib/net.js
Socket.prototype.destroySoon = function() {
  if (this.writable)
    this.end();

  if (this._writableState.finished)
    this.destroy();
  else
    this.once('finish', this.destroy);
};
```
node_modules 以下のコードを直接修正した後に、修正したファイルの一覧を表示する方法

あるあるです。よく忘れるのでメモです。

> デバッグのために node_modules 以下のコードを直接修正していたが、途中で寝てしまい、どのコードを修正したのか良く覚えていない。困った…

といったタイミングで修正されているファイルをリストアップする方法です。

```sh
ls -tl `find . -regex ".*node_modules.*" -name "*.js" -type f -print` | head -20
```

> カレントディレクトリ以下から node_modules と *.js にマッチするファイルの先頭20行を表示します。
> 結果は更新日時でソートされています

```sh
-rw-rw-rw-  1 foo  Users   22562  7 11 14:40 ./node_modules/bar.js/lib/Bar.js
-rw-rw-rw-  1 foo  Users   13430  7 11 14:00 ./node_modules/hoge.js/node_modules/huga.js/lib/Huga.js
-rw-rw-rw-  1 foo  Users    7232  7 11 13:03 ./node_modules/tar.js/lib/TarZoo.js
-rw-rw-rw-  1 foo  Users     895  7  4 17:51 ./node_modules/tar.js/test/node/index.js
-rw-rw-rw-  1 foo  Users    8793  7  4 17:45 ./node_modules/tar.js/test/testcase.js
-rw-rw-rw-  1 foo  Users   13039  7  4 17:42 ./node_modules/tar.js/lib/TarBoo.js
-rw-rw-rw-  1 foo  Users   16096  7  4 17:39 ./node_modules/tar.js/lib/Tar.js
-rw-rw-rw-  1 foo  Users   12965  7  4 17:36 ./node_modules/tar.js/lib/TarGoo.js
-rw-rw-rw-  1 foo  Users     953  7  4 02:21 ./node_modules/piyo.js/test/node/index.js

```
さくらのクラウドでPodcastをしてみたらいくら掛かるか（試算


最近良く聞いているPodcastの[backspace.fm](http://backspace.fm/)にゲストに[電気屋ウォーカー](http://www.inst-web.com/denkiya_blog/)の方が出ていました。
さくらインターネットのプラットフォームを駆使してPodcastを配信していることに驚きとともに、この辺クラウドのオブジェクトストレージを利用したらどれくらいのコスト感になるのをちょっと試算してみました。


# 前提
簡単に試算するために以下の条件で考えてみました。
実際にはRSSフィードの配信などを行うためのサーバも必要になるかと思いますが、

- 1ヶ月の配信頻度2回/月
- 1話の容量 20 MiB/回
- 1話辺りのリスナー 100 人/回 （配信されたものをすぐに聞く人数）
- 過去エピソードの視聴 10 人/回/月 （過去配信されたものを聞く人数）


# 試算

||エピソード数|総容量（MB）|リスナー総数|転送量（MB）|
|---|---|---|---|---|
|1ヶ月目|2|40|200|4,000|
|2ヶ月目|4|80|220|4,400|
|3ヶ月目|6|120|240|4,800|
|4ヶ月目|8|160|260|5,200|
|5ヶ月目|10|200|280|5,600|
|6ヶ月目|12|240|300|6,000|
|7ヶ月目|14|280|320|6,400|
|8ヶ月目|16|320|340|6,800|
|9ヶ月目|18|360|360|7,200|
|10ヶ月目|20|400|380|7,600|
|11ヶ月目|22|440|400|8,000|
|12ヶ月目|24|480|420|8,400|
|13ヶ月目|26|520|440|8,800|
|14ヶ月目|28|560|460|9,200|
|15ヶ月目|30|600|480|9,600|
|16ヶ月目|32|640|500|10,000|
|17ヶ月目|34|680|520|10,400|
|18ヶ月目|36|720|540|10,800|
|19ヶ月目|38|760|560|11,200|
|20ヶ月目|40|800|580|11,600|
|21ヶ月目|42|840|600|12,000|
|22ヶ月目|44|880|620|12,400|
|23ヶ月目|46|920|640|12,800|
|24ヶ月目|48|960|660|13,200|
|25ヶ月目|50|1,000|680|13,600|
|26ヶ月目|52|1,040|700|14,000|
|27ヶ月目|54|1,080|720|14,400|
|28ヶ月目|56|1,120|740|14,800|
|29ヶ月目|58|1,160|760|15,200|
|30ヶ月目|60|1,200|780|15,600|
|31ヶ月目|62|1,240|800|16,000|
|32ヶ月目|64|1,280|820|16,400|
|33ヶ月目|66|1,320|840|16,800|
|34ヶ月目|68|1,360|860|17,200|
|35ヶ月目|70|1,400|880|17,600|
|36ヶ月目|72|1,440|900|18,000|

# 結果
[さくらのクラウドのオブジェクトストレージ](http://cloud.sakura.ad.jp/specification/option/index.html#option-content03)の場合、初期の540円の中に100GiBまでのディスク容量と、10GiBまでのデータ転送量が含まれています。
そのためざっくり16ヶ月目までは540円/月の料金だけでまかなえる計算になります。
それ以降もディスク容量は問題にならないので、転送料だけでまかなえる計算になります（転送料54円/10GiBあたり）

# 感想

音声データの配信なのでもう少しコストが嵩むかと重いましたが、思ったほどでもなかったというのが正直な感想です。
手軽（費用的な意味で）というのであれば月540円からサーバ設定なども不要で始められそうです。

国内ではそれほどでもないですが、海外ではかなりポットキャスト自体がメディアとして認識されておりかなりの規模となっているようです。流石にそれだけ規模が大きくなるようであればSoundCoudなどのSaaSを使ったほうがトータルでのコスト削減ができると思います。

今なら[2万円クーポンプレゼントキャンペーン](http://cloud-news.sakura.ad.jp/2016/07/07/summer_campaign_2016/)やってみるたいです。
Javaサンドボックスの中でJavaScriptを動かす

Javaのサンドボックスの中でJavaScript(Nashorn)を動かす。やってることはJSR223に対応しているスクリプト言語ならなんでも行けるはずである。


```java
package example.misc;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.io.FilePermission;
import java.security.AccessControlContext;
import java.security.AccessControlException;
import java.security.AccessController;
import java.security.AllPermission;
import java.security.CodeSource;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.Policy;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.security.ProtectionDomain;
import java.security.cert.Certificate;
import java.util.Arrays;

public class SandboxJSDemo {
    public static void main(final String[] args) {
        // 全許可にしておかないと本体のほうで何もできなくなる
        Policy.setPolicy(new Policy() {
            @Override
            public PermissionCollection getPermissions(
                    final ProtectionDomain domain) {
                final Permissions perms = new Permissions();
                perms.add(new AllPermission());
                return perms;
            }
        });
        // セキュリティマネージャーを有効にする
        System.setSecurityManager(new SecurityManager());

        // Nashornを呼出。JavaScript以外も行ける。
        final ScriptEngineManager engineManager = new ScriptEngineManager();
        final ScriptEngine engine = engineManager.getEngineByName("javascript");
        if (engine == null) {
            throw new RuntimeException("No engine");
        }

        // 空のパーミッションを作成
        final Permissions permissions = new Permissions();
        // /etc/groupの読み込みだけ許可
        permissions.add(new FilePermission("/etc/group", "read"));
        // sandboxの設定
        final ProtectionDomain domain = new ProtectionDomain(
                new CodeSource(null, (Certificate[]) null), permissions);
        final AccessControlContext ctx = new AccessControlContext(
                new ProtectionDomain[]{domain});

        // 色々動かす
        for (final String s : Arrays
                .asList("print('Hello JavaScript')", "load(\"hoge.js\")",
                        "load(\"http://example.org/\")",
                        "java.nio.file.Files.readAllLines(java.nio.file.Paths.get(\"/etc/passwd\"))",
                        "print(java.nio.file.Files.readAllLines(java.nio.file.Paths.get(\"/etc/group\"))[0])")) {
            try {
                AccessController.doPrivileged(
                        (PrivilegedExceptionAction<Object>) () -> engine
                                .eval(s), ctx);
            } catch (AccessControlException | PrivilegedActionException e) {
                System.out.println(e.getMessage());
            }

        }

    }
}
```

実行すると次のようになる。

```
Hello JavaScript
access denied ("java.io.FilePermission" "hoge.js" "read")
access denied ("java.net.SocketPermission" "example.org:80" "connect,resolve")
access denied ("java.io.FilePermission" "/etc/passwd" "read")
root:x:0:
```
`/etc/group`だけはアクセスが許可されているので読み取りができる。他のファイルの読み書きやネットワークアクセスは許可がないので拒否されて例外が発生する。

# 参考
* http://d.hatena.ne.jp/seraphy/20131220
型キャストの多いCコードをSwiftに移植する

Swiftでは既存のCライブラリコール・システムコールも普通に呼び出せるようになっています。これは過去の資産を生かす視点では正しいのですが、Cと比べてSwiftの方が型に厳密なので、C関数を呼び出すのに苦労することも珍しくありません。

今回、`pthread_create`の第3引数`start_routine`をC関数からSwiftのクロージャに書き換えてみました。Cで型キャストしまくるコードがSwiftでどうなるかの参考になれば幸いです。

（Swift初心者なので間違いがあれば教えてください）

# 前提知識

`pthread_create`は新たなスレッドを生成し、新スレッドで実行する関数の関数ポインタを第3引数`start_routine`で受け渡します。関数の引数および戻り値は`void *`となっているので、異なる型の引数や戻り値を利用したい場合は呼び出し元および呼び出し先の両方で型キャストを行う必要があります。

何でも`void *`にしちゃえ、というのはCっぽい発想ですが、当然ながらSwiftとの相性は悪いですね。

# 元のCソースコード

今回、`int`と`char**`を引数に取り、`int`を返すような関数（要は`main`関数ですね）を`pthread_create`から使いたくなったので、そのためのラッパー関数をCで書きました。

```c
void *pthread_main_routine(void *_arg)
{
    void **arg = (void **)_arg;
    int argc = (int)arg[0];
    char **argv = (char**)arg[1];
    void *retval = (void *)(long)orig_main(argc, argv);
    return retval;
}
```

これを、Swift側では次のように呼び出していました。

```swift
    var thread_arg = [
        UnsafeMutablePointer<Void>(bitPattern: args.pointers.count-1),
        UnsafeMutablePointer<Void>(args.pointers)
    ]
    pthread_create(&thread, nil, pthread_main_routine, &thread_arg)
```

# Swiftのクロージャで書き直してみた

上のコードでも動いていたんですが、色々あってC関数をSwiftのクロージャで置き換えてみました。

```swift
    typealias VoidPtr = UnsafeMutablePointer<Void>
    typealias VoidPtrArray = [UnsafeMutablePointer<Void>]
    typealias CharPtrArray = [UnsafeMutablePointer<CChar>]
    let thread_arg = [
        unsafeBitCast(args.pointers.count-1, VoidPtr.self),
        unsafeBitCast(args.pointers, VoidPtr.self),
    ]
    pthread_create(&thread, nil, {_arg in
        let arg = unsafeBitCast(_arg, VoidPtrArray.self)
        let argc = Int32(unsafeBitCast(arg[0], Int.self))
        let argv = unsafeBitCast(arg[1], CharPtrArray.self)
        let retval = unsafeBitCast(Int(orig_main(argc, argv)), VoidPtr.self)
        return retval
        }, unsafeBitCast(thread_arg, VoidPtr.self))
```

`unsafeBitCast`を多用して何とか動くものが作れましたが、かなり冗長で読みにくいコードになってしまいました。やはりCの方が書きやすいコードはCで書くべきでしょう。

ちなみに、2つのコードでSwiftのarrayのまま`void *`に変換するか`char**`を`void *`に変換するかでちょっとだけ受け渡す内容が変わっていることに注意してください。

# 文句など

Swift2におけるC関数の扱いはイマイチな印象で、この`pthread_create`の第3引数にはグローバル関数名そのものかクロージャリテラルしか置くことができません。関数を変数に代入してその変数を引数に与えると次のようにコンパイルエラーになります。

```
A C function pointer can only be formed from a reference to a 'func' or a literal closure
```

また、クロージャリテラルであっても環境に依存するようなコードを書いてはいけません。たとえば、クロージャ内からインスタンス変数などを参照すると次のようにコンパイルエラーになります。

```
A C function pointer cannot be formed from a closure that captures context
```

後者は仕方ない気もしますが、前者はどうにかなるのでは？という気持ちになります。Swift3ではこのあたりの扱いが楽になるといいですね。
Mac OSX の 拡張の大文字/小文字区別はEl Capitanだと使えない（Sierraも同様）

※ スライドにする意味のない記事だけど、やってみたかったのでスライド形式対応してみました。

---

El Captianでデスクトップユーティリティからイメージを作成する

<img width="600" alt="スクリーンショット 2016-07-11 11.28.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/9094/50348a99-4e8a-cfda-711f-63519ed36247.png">

---

作った環境を確認してみると...

<img width="483" alt="スクリーンショット 2016-07-11 14.43.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/9094/ae79f116-80b2-47e2-baa5-dbc90fdd9597.png">

---

大文字小文字が**区別されていない**！！

![6397729.png](https://qiita-image-store.s3.amazonaws.com/0/9094/c8f68b7f-2f7f-0270-8732-4e2dc176b694.png)

---

ちなみにForumにもあがってた
https://discussions.apple.com/thread/7395900
<img width="909" alt="スクリーンショット 2016-07-11 15.02.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/9094/95b0a688-241f-c011-6f9c-765585fbb0ee.png">

投稿日、去年！！
It's a bugってあんた...
直ってないじゃん(´・ω・`)

---

というわけで、El Captian使ってる方、気をつけなはれや！！

（もしSierraでなおっているなら... まぁ、いいかなぁ） <- 直らなかったっぽい

@poohtaro さんからターミナルでゴニョゴニョしたらできるというコメント頂きました。どうしてもやりたい人は抜け道はありそうです。
AWS CLI の認証情報を設定する

# 問題

AWS CLI の認証情報の設定方法を忘れた。

# 解決策

`aws configure` を使うと良い。

- `~/.aws/config` および `~/.aws/credentials` が生成される。
- `--profile` で複数 profile の管理ができる。

# 参考

- [Configuring the AWS Command Line Interface - AWS Command Line Interface](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)
- [configure — AWS CLI 1.10.46 Command Reference](http://docs.aws.amazon.com/cli/latest/reference/configure/)
- [aws cli の導入 - Qiita](http://qiita.com/mikakane/items/b7ea2f434814b1133810)
- [【AWS】CLIの初期設定について（認証情報とコマンド補完） - TASK NOTES](http://www.task-notes.com/entry/20141026/1414322858)
- [aws-cli複数環境を扱う時のルール - Qiita](http://qiita.com/maimai-swap/items/bb5bf766bd4a9ed83f8f)
- [AWS CLIで複数アカウントのアクセスキーを管理して扱う設定 - Qiita](http://qiita.com/kwsmkn/items/ce72d8e4cc35f1fc01b5)
c++ > コンストラクタでのtry, catch

```txt:動作環境
C++ Builder XE4
```

あるUDPポートを使う処理が実装されているフォームがある。

そのフォームを異なる２つのソフトで実装すると、２つのソフトは同時起動時に「アドレスとポートは既に使われています」のエラーが出る。

2つのソフト同時起動時に片方のソフトからのUDPポート使用をOFFにする、という方針であれば同時起動は可能となる。

このUDPポートを使う処理はフォームにおいてIndyのTIdUDPServerを使っている。「TIdUDPServerのActivateプロパティをtrueにする時にtry, catchでエラーがcatchされる時に、そのソフト側ではUDPを使わない」とすれば良いかと思う。

```
try {
    IdUDPServer->Active = true;
} catch (...) {
    // IdUDPServerを使わないフラグを立てる
}
```

気になったのは、「コンストラクタでtry, catch()を使っていいのかどうか」。

「コンストラクタで例外を送出する」件については禁止している本の記載があったり、以下のようなリンクの情報があったりする。
http://www.kijineko.co.jp/tech/superstitions/dont-throw-exception-from-constructor.html

上記のコードの場合は例外送出ではなくIdUDPServer不使用フラグを立てるだけなので問題ないかと考えているが、実際のところはどうなのだろうか。

問題がある場合はOnCreate()での対応も検討している。

以下も関連ありそう。
http://d.hatena.ne.jp/slayer845/20091228/1262012011
http://d.hatena.ne.jp/slayer845/20091231/1262235480
mariadbでテーブルのデータを他のテーブルに読み込む方法

例えば、Aというテーブルにデータがあって、
後日その更新版のA'というCSVデータが入手されたときに、

Aにキーが存在しないデータは追加、

Aにもともと存在しているデータで、
キーが一致するものに関してはA'のデータで更新

A'に存在しないデータはそのまま残しておく

というような運用がしたいことはままあると思います。
（残さなくてよければ TRUNCATE → LOAD DATA INFILE でいいのでしょうが）

データ量が多い場合は、
いちいち読み込ませるのも非効率ですので、

Aと同じ構造のA'テーブルにA'のデータを読み込ませて、

`REPLACE INTO table_A SELECT * FROM table_A' WHERE hoge_id IS NOT NULL;`

などとするのがいいのではないかと。
（今回利用したCSVデータはキーが入るべきところに空行が入っているようなお行儀の悪いCSVデータなので、table_Aは hoge_id を PRIMARY にしていますが、 table_A'はそのまま読み込ませています）

`INSERT IGNORE INTO`

とか

`INSERT INTO ON DUPLICATE KEY UPDATE`

とかよりドンピシャな動作だと思いました。

REPLACEは
MySQL拡張みたいですね。
（MySQLとMariaDB以外のデータベースエンジンでは利用できないらしい）

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.8 REPLACE 構文](https://dev.mysql.com/doc/refman/5.6/ja/replace.html)

[REPLACE - MariaDB Knowledge Base](https://mariadb.com/kb/en/mariadb/replace/)
Rails4からRails5にアップデートしたらDeviceでエラーが出た

Rails4で開発を始めたアプリケーションをRails5にアップデートしたら
```undefined method `for' for #<Devise::ParameterSanitizer:0x***>
```って出た。


原因のファイルは app/controllers/application_controller.rb で、

```rb:app/app/controllers/application_controller.rb
  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |user_params| user_params.permit(:username, :password, :password_confirmation) }
    devise_parameter_sanitizer.for(:sign_in) { |user_params| user_params.permit(:username, :password, :remember_me) }
  end 
```
と書いていたからだった。
[Deviseの公式](https://github.com/plataformatec/devise#strong-parameters)にあるように、forメソッドをpermitメソッドで書き換えてやるとうまくいった。

```rb:app/app/controllers/application_controller.rb
def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:sign_up) do |user_params|
    user_params.permit(:username, :password, :password_confirmation)
  end
  devise_parameter_sanitizer.permit(:sign_in) do |user_params|
    user_params.permit(:username, :password, :remember_me)
  end
end 
```

####参考にしたサイト
http://stackoverflow.com/questions/37341967/rails-5-undefined-method-for-for-devise-on-line-devise-parameter-sanitizer
WordPress 検索対象のあれこれ

基本的なフィルターフックなどで対応できるパターン。
SQL文を書く前に、本当にその実装でいいのかよく考えよう。

# カスタム投稿タイプ

https://developer.wordpress.org/reference/functions/register_post_type/

`public` の引数が `true`（デフォルト）であれば、検索ロジック周りであれこれする必要なし。
逆に公開しても検索の対象外とする場合は `exclude_from_search` の引数を `true` にする。

# 特定の条件を検索対象「外」とする

基本、上記のやり方でいいのですが、カテゴリーやタクソノミーなど条件を細かくしたい場合は `pre_get_posts` でやるのが一番簡単。
例は「特定のカテゴリーに属する投稿は検索対象にしない」

```php
<?php
function search_filter($query) {
	if ( is_admin() || ! $query->is_main_query() )
		return;

	if ( $query->is_search() ) {
		$query->set( 'category__not_in', array( 1 ) );
		return;
	}
}
add_action( 'pre_get_posts','search_filter' );
```

# 特定のカスタム投稿タイプを対象とした検索窓を別途作る

例えばFAQだけ検索する検索窓。

- `form` の `action` は `home_url( '/' ) `
- `<input type="hidden" name="post_type[]" value="{カスタム投稿タイプのスラッグ}" />`

試しにブラウザで直接 `http://example.com/?s=test&post_type[]=faq` とすると結果がわかるよ

```php
<form role="search" method="get" class="search-form" action="<?php echo esc_url( home_url( '/' ) ); ?>">
	<input type="hidden" name="post_type[]" value="faq" />
	<label>
		<span class="screen-reader-text">Search FAQ for:</span>
		<input type="search" class="search-field" placeholder="Search FAQ" value="<?php the_search_query(); ?>" name="s" title="Search FAQ" />
	</label>
	<input type="submit" class="search-submit" value="Search" />
</form>
```
検索結果を通常の検索結果用テンプレートと別にする場合は`template_include`で。
https://codex.wordpress.org/Plugin_API/Filter_Reference/template_include

```
function my_custom_search_template( $template ) {
	if ( is_search() ) {
		// 表示する投稿タイプを取得
		$post_types = get_query_var( 'post_type' );

		// search-{$post_type}.php の読み込みルールを追加
		foreach ( (array) $post_types as $post_type )
			$templates[] = "search-{$post_type}.php";

		$templates[] = 'search.php';

		$template = get_query_template( 'search', $templates );

	}
	return $template;
}
add_filter( 'template_include', 'my_custom_search_template' );
```

# 絞り込み検索したい

これもプラグイン使っったほうが楽。
とは言え、 `http://example.com/?s=test&post_type[]=faq&category_name=cat-a` となれば絞込はできるので、前述のフォームをカスタマイズして行けば自作でも可能。

# カスタムフィールド・・・

デフォルトでは検索対象「外」なのでこれが一番厄介。

## 仕様の見直し

本当にカスタムフィールドで実装するのか。カスタムタクソノミーなら検索対象になりつつ「アーカイブを作らない」事もできるので考慮すること

## プラグイン使う

カスタムフィールドも対象にするには最終的にSQL文を発行しないといけないので、いろいろ不安ならプラグインでサクッと実装したほうが楽。
2つのプルリクエストそれぞれでの変更内容を互いに比較する手順

* プルリク A での変更内容
* プルリク B での変更内容

を比較する手順です。

似た内容のプルリクが複数あるときに
それらを比較することでレビューの参考にできるので稀に便利です。

# 手順

1. プルリクエストの URL の末尾に .diff をつけて、片方のプルリクエストでの変更内容を diff 形式で表示させます
	* 例：https://github.com/foo/bar/pull/1.diff
2. もう一方のプルリクエストの diff も取得します
3. diff 同士を好きな diff ツールで比較するとそれぞれのプルリクエストでの変更内容の違いを確認できます
OpenType フォントのプロポーショナルメトリクス情報をぶっこぬく

Saqooshaさんの「[OpenType フォントのカーニング情報をぶっこぬく](http://qiita.com/Saqoosha/items/8a9bb825e02db770408e)」という記事の最後に

> palt があるならそれもちゃんと処理しないといけない。OTF 複雑すぎ、、、
 
と書いてあって。Saqooshaさんの記事を参考に、`palt`と、それに関連する`halt`テーブルの情報をとってみたログです。
 
 
## やりたいこと
Open Typeフォントのフォーマットからプロポーショナルメトリクス情報をとりだしたかったです。もっと直接的にいうと、paltとhaltのデータをぶっこぬきたかったです。

 
## paltとは？ haltとは？

両方とも、fontのGlyphの位置を調整するためのデータが入ったテーブルです。microsoft のページに書いてあるpaltとhaltの説明で重要そうな部分を抜いて以下にかきます。

### [palt](https://www.microsoft.com/typography/otspec/features_pt.htm#palt)
- Proportional Alternate Widths。Glyphの全角幅の代わりのメトリクスとして適用する。
- kernが有効なとき、paltが存在するなら、paltはマストで有効にするべき。
- この機能は他の全てのglyph幅にまつわる機能と相互に排他的。

### [halt](https://www.microsoft.com/typography/otspec/features_fj.htm#halt)
- Alternate Half Widths。カッコや句読点や記号などの半角幅のGlyphのメトリクスを全角幅にするために適用する。
- haltはdefaultはoff。
- カッコや句読点や記号などのときに限り有効にする
- haltがONのときはpaltやkernがOFF。逆に、kernやpaltがONの時にはhaltがOFF。
 
## Open Typeからどうやってpalt、haltにまつわる情報をとってくる？

microsoftの以下２つの英文がひたすら書かれてるページを、じーっと読んでるとなんとなく理解できました。

- [GPOS - The Glyph Positioning Table](https://www.microsoft.com/typography/otspec/gpos.htm) : palt、haltテーブルが入ってるGPOSテーブルの内部フォーマットについて書いてある
- [OpenType™ Layout Common Table Formats](https://www.microsoft.com/typography/otspec/chapter2.htm) : Open Typeの全テーブルで共通で使われてるフォーマットについて書いてある

Saqooshaさんのページにのってる`libotf`という OTF ファイルをパースできるツールを使って、以下の手順でOTFをdumpして、そのdump結果にそってみると、理解しやすかったです。

以下、libotfのotfdumpの使い方メモです。

- [このページ](http://www.nongnu.org/m17n/)から`The libotf library (0.9.13) `をダウンロード
- ダウンロードしたディレクトリへいき、いつもの`./configure` `make` `make install` する。 
- `cd example`すると、`otfdump`ができてる
- `./otfdump {任意のOTFフォントファイルへのパス} > output.txt` で、output.txtにdumpされた情報が出力される

このdumpしたデータに microsoft のページに書いてある paltテーブル ぶっこぬき方を、ざっくり書き込んでみると、以下のような感じです。

![Screen_Shot_2016-07-11_at_13_02_54_2.png](https://qiita-image-store.s3.amazonaws.com/0/30407/b57ed92f-e6ad-9504-a00d-c5884dcc1a34.png)

LookUpテーブルのSubtableの中のValueというところに、paltやhaltの情報が入ってるのですが、その数字が何を意味するかというと、ValueFormatに応じて以下のような値が入っています。

- ValueFormatが0x0001のときは、glyphのleft-side bearingを調整するために、XPlacementになる
- ValueFormatが0x0004のときは、別のglyphとのadvanceを調整するためにXAdvanceになる
- ValueFormatが0x0005のときは、XPlacementとXAdvanceになる

Advance、Bearingは、GlyphのPositionまわりの用語で、その用語については[freetypeのこのページ](https://www.freetype.org/freetype2/docs/tutorial/step2.html)がまとまっていました。

![metrics.png](https://qiita-image-store.s3.amazonaws.com/0/30407/a89496c8-6a6d-24ae-15fb-fbe15d279948.png)

![metrics2.png](https://qiita-image-store.s3.amazonaws.com/0/30407/f850a238-5689-c56d-3166-bbc2b3ad27c8.png)

これでpalt、haltの情報はとりだして、Glyphの各positionデータに反映することができるようになると思います。

## おまけ：フォント用語

- トラッキング : 文字間隔の「等間隔のアキ」の値。
- プロポーショナル : 字幅に合わせた文字（グリフ）の位置を調整するもの。OpenTypeでは、横組みの場合は「palt」、縦組みの場合は「vpal」がこれに当たる。以下の図でいうと、「仮想ボディ」のwidth,heightにあたる部分。
- カーニング : fontごとに、任意の文字ペアに対して登録された「文字間のアキ」の値。OpenTypeでは「kern」がこれに当たる。
- メトリクス : プロポーショナル情報で字幅を整え、カーニング情報により文字間隔（ツメ）を調整すること。この機能はプロポーショナルメトリクスとか、メトリクスカーニングとか、自動（メトリクス）とか、ソフトによって、いろんな記述されてるっぽい。（もしかしたら厳密には違うかも）
- オプティカル : イラレや、InDesignの独自機能。fontファイルに内蔵された情報を使わないで、文字の大きさを読み取り、文字間隔（ツメ）の調整を行う機能のこと。