OmniAICreator/Qiita-1.07M huggingface dataset:
RakeでS3上のファイルを一括ダウンロードする

## はじめに
RailsをAWSなどのクラウド上で動かしている場合、carrierwaveなどを使って、S3に画像をアップロードして、CloudFrontなどのCDNで配信するケースはよくあると思います。
こんなとき、別のテスト環境にデータと画像を移行したいとか、画像のバックアップをローカル・オンプレに取得しておきたい・・・なんてことが最近あり、rakeでタスク化して対処しました。

## 実装方法
```rb:Gemfile
gem 'aws-sdk'
```

```rb:lib/tasks/aws.rake
require 'aws-sdk'

AWS.config(
  access_key_id: '<Access Key Id>',
  secret_access_key: '<Secret Access Key>',
  s3_endpoint: "s3-ap-northeast-1.amazonaws.com")

namespace :aws do

  desc 'backup files in bucket.'
  task :s3backup => :environment do
    bucket_name = ENV['BUCKET']
    s3 = AWS::S3.new
    bucket = s3.buckets[bucket_name]
    raise "Not found bucket #{bucket_name}" if bucket.nil?

    backup_dir = File.expand_path("tmp/backup_#{Time.now.strftime("%Y-%m-%d_%H-%M-%S")}")
    bucket.objects.each do |obj|
      next if o.key.end_with?('/')

      puts "#{Time.now} writing #{o.key}"
      path = File.join(backup_dir, obj.key)
      dir = File.dirname(path)

      FileUtils.mkdir_p(dir) unless FileTest.exists?(dir)
      File.open(path, 'wb') do |file|
        obj.read do |chunk|
          file.write(chunk)
        end
      end
    end
  end

end
```

* バケット名はrakeコマンド実行時に渡します。
* Railsルートのtmp配下に現在日時つきのフォルダを作成する形としてます。
* サブフォルダがあっても、フォルダ構造を維持した状態でバックアップ可能です。
* Railsじゃなくても利用可能なように、あえてActiveSupportは利用してません。

## 使い方

<pre>
rake aws:s3backup BUCKET=my_bucket
</pre>

ちなみに、定期的にバックアップしたい場合は、rakeをジョブスケジューラに登録するのもよいですね。
Windows + Goutte 3.0でHTTPSでのリクエストで発生するSSL証明書のエラー

```php
$client = new \Goutte\Client();
$crawler = $client->request('GET', 'https://example.com');
$html = $crawler->filter('body')->html();
```

Windows環境にて、スクレイピングライブラリ Goutte ([FriendsOfPHP/Goutte](https://github.com/FriendsOfPHP/Goutte)) を使って、上記のようなコードでHTTPS経由でコンテンツを取得しようとしたところ、以下のようなメッセージで GuzzleHttp\Exception\RequestException がスローされました。

``"cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)"``

適当にWebで検索したところ、要はWindows環境のcURLでクライアント証明書が見つけられないために発生する問題のようです。


## 回避方法1 証明書の検証を行わない

今回は GuzzleHttp\Handler\CurlFactory で例外が発生しており、このクラスで生成されるcURLハンドラに、サーバー証明書の検証を行わないようオプションを設定すれば、例外の発生を回避できるようです。

ただ、 Goutte 3.0 が内部で利用している GuzzleHttp\Client のバージョンが 6.0 と最近のもので、オプションの設定方法がWebでよく紹介されているものから変わっています。

```php
$client = new \Goutte\Client();
$client->setClient(new \GuzzleHttp\Client([
    \GuzzleHttp\RequestOptions::VERIFY => false,
]));
$crawler = $client->request('GET', 'https://example.com');
$html = $crawler->filter('body')->html();
```

こうすることで回避できました。

なお、リクエスト時に使われるオプションの詳細については、オプションの定数のみが定義されているクラス GuzzleHttp\RequestOptions を見れば分かります。

```php
    /**
     * verify: (bool|string, default=true) Describes the SSL certificate
     * verification behavior of a request. Set to true to enable SSL
     * certificate verification using the system CA bundle when available
     * (the default). Set to false to disable certificate verification (this
     * is insecure!). Set to a string to provide the path to a CA bundle on
     * disk to enable verification using a custom certificate.
     */
    const VERIFY = 'verify';
```

trueでシステム依存、falseで検証しない、文字列でクライアント証明書のパスを指定できるようです。

コメントで警告されている通り、自社で運用しているドメインでない場合は、単純に検証を回避するのは危険ですので、念のため。

ちなみに Goutte 3.0 は PHP 5.5+ and Guzzle 6+ が必要ですが、Guzzle 6 は PSR-7 を採用した意欲的な作りのようで、Composerでインストールすると guzzlehttp/promises 1.0, psr/http-message 1.0, guzzlehttp/psr7 1.0 といったライブラリが一緒にインストールされました。

PHP 5.4系の場合は Goutte 2.x (Guzzle 4-5) を、5.3系の場合は Goutte 1.x (Guzzle 3) を使うしかないようです。


## 回避方法2 クライアント証明書を指定する

検証を回避したくない場合はクライアント証明書を調達するしかありませんが、私の環境では Git for Windows (Git Bash) に同梱されている curl コマンド用に証明書が付いてました。

試してみたところ、このように指定することでもエラーを回避できました。

```php
$client = new \Goutte\Client();
$client->setClient(new \GuzzleHttp\Client([
    \GuzzleHttp\RequestOptions::VERIFY => 'C:\Applications\Git\bin\curl-ca-bundle.crt',
]));
$crawler = $client->request('GET', 'https://example.com');
$html = $crawler->filter('body')->html();
```

この証明書の有効期間は2018年8月14日となってましたので、それまではこれで大丈夫ですね。ちゃんと Git for Windows を更新し続ければ問題ないのかな。

また、こちらに習って php.ini の設定ディレクティブで ``curl.cainfo ="C:\Applications\Git\bin\curl-ca-bundle.crt"`` としたところ、上記の ``\Goutte\Client::setClient()`` しなくてもOKでした。

* [Windows版PHPのcurlの証明書 - Qiita](http://qiita.com/iakio/items/71536dc5e615f03433a0)

GoutteやGuzzle以外でもcurl関数を使うことはあるでしょうし、できればこちらのディレクティブで対応した方が良さそうですね。

curl.cainfo ディレクティブは PHP_INI_SYSTEM となってますので、php.iniまたはhttpd.confのみで設定可能です。（要再起動）
「Page Plugin」（旧「Like Box」）を500px以上にできないかテスト【無理】

ダメなんだろうなーとは思いつつ、諦めきれず無駄に色々あがいてみたのでメモ。
（結論：無理でした。）


### ふつーにHTML内の横幅を変える
・data-width="500" → 500pxで表示
・data-width="100％" → 340pxで表示（※デフォルトサイズ）
・data-width="720" → 500pxで表示
↓
HTMLだけでは無理。


### CSSで横幅を変える
```.fb-page.fb_iframe_widget span { width: 100% !important; }```
で、外枠だけは大きくできたが、肝心の中身は変化なし。


### jQueryで親ページからiframe内にCSSを適用
親ページからiframe内の要素にCSSを適用させる方法: 小粋空間
http://www.koikikukan.com/archives/2015/03/03-005555.php
> クロスドメイン（親ページと子ページのドメインが異なる）の場合、この方法は適用できません。

↓
ドメイン違うから無理…。


### HTML5 で iframe 要素の属性として新たに追加された seamless 属性を使う
iframe 要素の seamless 属性を試してみた | WWW WATCH
http://hyper-text.org/archives/2012/05/iframe_seamless_attribute.shtml
↓
iframeのHTML触れないから無理…。


### デフォルトのLike BoxとjQueryのプラグイン「fb.wall」を組み合わせ
それでも、Facebook「Like Box」をカスタマイズしたかった。 - ウェブDeBLOG | トライデントコンピュータ専門学校 Webデザイン学科ブログ | Webデザイナー
http://tridentwebdesign.blog.fc2.com/blog-entry-379.html
↓
「fb.wall」の開発終わってた。＼(＾o＾)／


### 「LikeBox」のカスタマイズ方法（FBMLでCSSを追加）を流用できないか？
How To Add a Custom Facebook Like Box to Your Site（英語）
http://line25.com/tutorials/how-to-add-a-custom-facebook-like-box-to-your-site
↓
Facebook Markup Language in validem XHTML 1.1 - neue Version（ドイツ語）
http://www.ka-mediendesign.de/blog/post/facebook-markup-language-in-validem-xhtml-11-neue-version/
2010年で更新止まってるのであかんぽいが、検証してみる。
↓
動かん。
↓
Facebookの「Likebox」を自由にカスタマイズ｜Webディレクター・ハラヒロシのブログ
http://www.ultra-l.net/note/2011/07/facebooklixebox.php
2013年の段階で、動いたり動かなかったりしてたらしい。
↓
PC、iOS 8.ｘ～、Android 5.x～でうまくいったように見えたが、
iOS 7.ｘ～、Android 4.x～で妙に小さいサイズで表示された。（ちゃんと計ってないけど目視で200px程度？）
↓
この記述を外してデフォルトの記述にすると、一般的なスマホのバージョンで問題なく表示された。（＝いらなかった。）
bashでtsvをjsonにしたい

# bashでtsvをjsonにしたい

awk使えよって話はまぁ置いといて。

1行ずつ line delimited な json になるので、必要ならjqとかに流すとよいと思う。

```bash:tsv2json.sh
#!/bin/bash

IFS=$'\t' read -a COLUMNS
IDX_MX=$((${#COLUMNS[@]}-1))

while read line; do
    IFS=$'\t' read -a ROW <<< "$line"

    echo -n "{"
    for i in $(seq 0 $IDX_MX); do
        printf '"%s":"%s"' ${COLUMNS[$i]} ${ROW[$i]}

        if [ $i -ne $IDX_MX ] ; then
            echo -n ","
        fi
    done
    echo "}"
done
```

```bash:usage
cat hoge.tsv | ./tsv2json.sh
```
Google+ APIを使って、コマンドラインから JSON形式のデータを取得してみる

[Facebook APIを使って、コマンドラインから JSON形式のデータを取得してみる](http://dev.classmethod.jp/etc/retrieve-json-from-facebook-api/)

上記の記事を参考に Google+ API での JSON 取得をやってみた。

### クライアントの登録

1. Google+ にログインした状態で [https://console.developers.google.com/project](https://console.developers.google.com/project) を開き、 Create Project からプロジェクトを作成する。
2. 作成されたら APIs & auth の APIs から Google+ API を有効にする。
3. APIs & auth の Credentials から Create new Client ID でクライアント ID を作成。
    * Application Type = Web application
    * Authorized redirect URIs = http://localhost/
4. 作成された Client ID と Client secret を控えておく。

### aurl

aurl は元記事で導入されているものとします。

1. ~/.aurl/profiles を編集する。

    ```
    [google]
    client_id = 前節で控えておいた Client ID
    client_secret = 前節で控えておいた Client secret
    auth_server_auth_endpoint = https://accounts.google.com/o/oauth2/auth
    auth_server_token_endpoint = https://accounts.google.com/o/oauth2/token
    redirect = http://localhost/
    scopes = https://www.googleapis.com/auth/plus.login
    ```

2. コマンドを実行する。

    ```bash
    $ aurl --profile google get https://www.googleapis.com/plus/v1/people/me
    ```

3. 以下のようなメッセージが表示されて入力待ちとなるので、ブラウザで URL を開き承認する。

    ```
    Open https://accounts.google.com/o/oauth2/auth?(省略) and get code
    Enter code:
    ```

4. 承認後にリダイレクトされた URL から `code=` を抽出し、入力待ちとなっていたコンソールに入力する。

    ```
    {
     "kind": "plus#person",
     "etag": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
     "gender": "male",
     "objectType": "person",
     "id": "XXXXXXXXXXXXXXXXXXXXX",
     "displayName": "Taichi Sasaki",
     "name": {
      "familyName": "Sasaki",
      "givenName": "Taichi"
     },
     "url": "https://plus.google.com/XXXXXXXXXXXXXXXXXXXXX",
     "image": {
      "url": "https://lh3.googleusercontent.com/XXXXXXXXXXXX/XXXXXXXXXXX/XXXXXXXXXXX/XXXXXXXXXXX/photo.jpg?sz=XX",
      "isDefault": true
     },
     "isPlusUser": true,
     "language": "ja",
     "ageRange": {
      "min": XX
     },
     "circledByCount": 0,
     "verified": false
    }
    ```

    取れた！

### あとがき

元記事が非常にわかりやすかったので Goole+ でも簡単に出来ました。感謝です。
省略したＵＲＬをコピペしても完全なＵＲＬとして貼り付けられるようにするTwitterの心遣いがすごい

これを、
![image](https://qiita-image-store.s3.amazonaws.com/0/64098/55ed3304-d681-b3f9-7f6a-65d0274d4806.png)

コピペすると、

![image](https://qiita-image-store.s3.amazonaws.com/0/64098/8f828532-5994-d4f3-869b-4911cbad3d2a.png)

こうなる。

・・・

・・・なんでそんなことが起こるのかと色々考えたけど、調べてみると結局はTwitterの心遣いだった。

![image](https://qiita-image-store.s3.amazonaws.com/0/64098/5d38df39-c658-d3ca-3abe-ef8038aea915.png)

# い・・・invisible！！！ いんびずぃぼぅ！！

ちょっと感動した。
見習おう。

# 【追記】jQueryプラグインにしました

せっかくなのでjQueryのプラグインにしました。

ダウンロード
[jquery-twellipsis(Github)](https://github.com/goosys/jquery-twellipsis)

実行サンプル
[sample(jsbin)](http://jsbin.com/huzohu/edit?html,output)
Ubuntu14.04にnginxとpassengerをインストール

sinatraアプリケーションを動作させるためにnginxとpassengerをインストール・設定した際の作業メモです。
基本的にPassengerのユーザーガイドの通りに進めていけば大丈夫でした。
https://www.phusionpassenger.com/documentation/Users%20guide%20Nginx.html#install_on_debian_ubuntu

```bash
$sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
$sudo apt-get install apt-transport-https ca-certificates
$sudo vi /etc/apt/sources.list.d/passenger.list

# Ubuntu 14.04
# deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main

$sudo chown root: /etc/apt/sources.list.d/passenger.list
$sudo chmod 600 /etc/apt/sources.list.d/passenger.list
$sudo apt-get update
$sudo apt-get install nginx-extras passenger
$sudo passenger-config --root 
# 上の出力結果をnginx.confに記述
$sudo vi /etc/nginx/nginx.conf

# http {
#   passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
#   passenger_ruby /home/vagrant/.rbenv/shims/ruby;
# }

# シンタックスチェック
$sudo nginx -t
$sudo service nginx start
```
premiereでエンドロール作ろうぜ！


簡単に説明する！

タイトル→新規タイトル→ロールタイトル

これでenter押してひたすら入力するのだ！

横のスクロールバー使えば長い文章も完璧だ！

もうこれで主に教えるエンドロールはないぜ！
がんばれよ！
processingで木を描く

フラクタルでよく用いられる再帰関数を使い、枝が次の枝を生むようにして木を描画してみました。
![20150105.jpg](https://qiita-image-store.s3.amazonaws.com/0/75611/a8525702-f2c3-7a26-2a9d-5f4c0c541bab.jpeg)

~~~java
//繰り返す回数
int step = 12;
int count = 0;
 
float tr_scale;
float tr_angle;
float tr_length;
float tr_startd;
float tr_startx;
float tr_starty;
float offset = -90;
 
void setup () {
 
    size (1200, 1000);
    colorMode (RGB, 256);
    background (255);
 
    tr_scale = 0.99;
    tr_angle = 24.0;
    tr_length = 180.0;
    tr_startd = 0.0;
    tr_startx = width / 2;
    tr_starty = height;
 
    createTree (tr_startx, tr_starty, tr_length, tr_startd, step);
 
}
 
void draw () {
 
    fade ();
 
    if (count == step) {
 
        count = 0;
        createTree (random (0, width), tr_starty, random (tr_length), tr_startd, step);
         
    }
 
}
 
void createTree (float x01, float y01, float len, float deg, int n) {
 
    stroke (int (200 / (n + 1)));
    strokeWeight (int ((n + 1) / 4));
 
    //枝の始点（x01,y01）から枝の終点（x02,y02)を計算
    float x02 = x01 + len * cos (radians (deg + offset));
    float y02 = y01 + len * sin (radians (deg + offset));
 
    line (x01, y01, x02, y02);
 
    if (n > 0) {

        //枝1本につき新しい枝が2本作られる

        //1本目
        //次に伸びる枝の角度をランダムに
        float deg01 = random (-tr_angle, triangle);
        //次に伸びる枝の長さをランダムに（だんだん短く）
        float scl01 = random (random (10, 20), len * tr_scale);
        //現在の終点を次の始点として、新しい角度、長さで自分を再実行
        createTree (x02, y02, scl01, deg + deg01, n - 1);

         //2本目
        //次に伸びる枝の角度をランダムに
        float deg02 = random (-tr_angle, triangle);
        //次に伸びる枝の長さをランダムに（だんだん短く）
        //現在の終点を次の始点として、新しい角度、長さで自分を再実行
        float scl02 = random (random (10, 20), len * tr_scale);
        createTree (x02, y02, scl02, deg + deg02, n - 1);
 
    }
 
    count = n;
 
}
 
void fade () {
 
    noStroke ();
    fill (255, 2);
    rectMode (CORNER);
 
    rect (0, 0, width, height);
 
}
~~~
chibiosでLチカの練習　その４

## mutex使ってみた。
```
#include "ch.h"
#include "hal.h"

#define CONSOLE_WA_SIZE		 THD_WORKING_AREA_SIZE(4096)
#define cputs(msg)			  chMsgSend(cdtp, (msg_t) msg)
static MUTEX_DECL(m1);
static thread_t * cdtp;
static THD_FUNCTION(console_thread, arg)
{
	(void) arg;
	while (!chThdShouldTerminateX())
	{
		thread_t * tp = chMsgWait();
		puts((char *) chMsgGet(tp));
		fflush(stdout);
		chMsgRelease(tp, MSG_OK);
	}
}
static THD_WORKING_AREA(waThread1, 1024);
static THD_FUNCTION(Thread1, arg)
{
	(void) arg;
	chRegSetThreadName("green");
	while (TRUE)
	{
		chMtxLock(&m1);
		cputs("green on");
		chThdSleepMilliseconds(1000);
		cputs("green off");
		chMtxUnlock(&m1);
	}
}
static THD_WORKING_AREA(waThread2, 1024);
static THD_FUNCTION(Thread2, arg)
{
	(void) arg;
	chRegSetThreadName("yellow");
	while (TRUE)
	{
		chMtxLock(&m1);
		cputs("yellow on");
		chThdSleepMilliseconds(1000);
		cputs("yellow off");
		chMtxUnlock(&m1);
	}
}
static THD_WORKING_AREA(waThread3, 1024);
static THD_FUNCTION(Thread3, arg)
{
	(void) arg;
	chRegSetThreadName("red");
	while (TRUE)
	{
		chMtxLock(&m1);
		cputs("red on");
		chThdSleepMilliseconds(1000);
		cputs("red off");
		chMtxUnlock(&m1);
	}
}
int main(void)
{
	halInit();
	chSysInit();
	chMtxObjectInit(&m1);
	cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO, console_thread, NULL);
	chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO + 1, Thread1, NULL);
	chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO + 1, Thread2, NULL);
	chThdCreateStatic(waThread3, sizeof(waThread3), NORMALPRIO + 1, Thread3, NULL);
	while (!chThdShouldTerminateX())
	{
		chThdSleepMilliseconds(990);
	}
	return 0;
}

```
多段SSH環境かつパスワード認証でcookしたいとき

## About

何らかの理由で公開鍵が登録されておらず、パスワード認証でcookしないといけない場合の対応です。

## Environment
ローカルマシン --- 踏み台 --- 対象ホスト

※ 全てパスワード認証

## 対応前
* chefでcookする際に何度もパスワードを聞かれてしまいました。

```console
dev@192.168.1.2's password:
dev@10.0.0.2's password:
Uploading the kitchen...
dev@192.168.1.2's password:
dev@10.0.0.2's password:
Killed by signal 1.
dev@192.168.1.2's password:
dev@10.0.0.2's password:
Killed by signal 1.
dev@192.168.1.2's password:
dev@10.0.0.2's password:
Killed by signal 1.
```

* その時の`~/ssh/config`

```
Host target
 HostName 10.0.0.2
 User test
 UserKnownHostsFile /dev/null
 StrictHostKeyChecking no
 ProxyCommand ssh -CW %h:%p bastion
 LogLevel FATAL

Host bastion
  HostName 192.168.1.2
  User test
  ForwardAgent yes
```


## 対応後

* `~/.ssh/config`を修正する

```
Host target
 HostName 10.0.0.2
 User test
 UserKnownHostsFile /dev/null
 StrictHostKeyChecking no
 ProxyCommand ssh -CW %h:%p bastion
 LogLevel FATAL
 ControlMaster auto
 ControlPath ~/.ssh/mux-%r@%h:%p
 ControlPersist 30m

Host bastion
  HostName 192.168.1.2
  User test
  ForwardAgent yes
  ControlMaster auto
  ControlPath ~/.ssh/mux-%r@%h:%p
  ControlPersist 30m
```

ControlMasterはマスターのセッションを一つはり、それを使いまわす仕組みのようです。最初のログインの際にだけパスワードが聞かれ、その後はそのセッションを使いまわします。

公開鍵が登録されていないサーバに対し初回cookする時などに使うと便利かなと思います。
d3.jsで相関関係を可視化！！

d3.jsで公開されていたHierarchical Edge Bundlingを簡単に使用できるようにしました。

[Document](http://kyu999.github.io/d3-easy/hierarchical_edge.html)



d3.jsとは複雑なデータを比較的柔軟に描くことのできるデータビジュアライゼーションエンジンです。データビジュアライゼーションに精通した方であればとても使いやすいかもしれませんが、私も含め初心者には敷居が高いなと感じたのでd3.jsを簡単に使えるようにするライブラリであるd3-easyを目下開発中。。。

[d3-easy](https://github.com/kyu999/d3-easy)
![hierarchichy.png](https://qiita-image-store.s3.amazonaws.com/0/33227/3bcb9a43-4bfd-2450-5a0b-850f852fa20a.png)
chibiosでLチカの練習　その３

## semaphore使ってみました。
```
#include "ch.h"
#include "hal.h"

#define CONSOLE_WA_SIZE		 THD_WORKING_AREA_SIZE(4096)
#define cputs(msg)			  chMsgSend(cdtp, (msg_t) msg)
static semaphore_t sem1;
static thread_t * cdtp;
static THD_FUNCTION(console_thread, arg)
{
	(void) arg;
	while (!chThdShouldTerminateX())
	{
		thread_t * tp = chMsgWait();
		puts((char *) chMsgGet(tp));
		fflush(stdout);
		chMsgRelease(tp, MSG_OK);
	}
}
static THD_WORKING_AREA(waThread1, 1024);
static THD_FUNCTION(Thread1, arg)
{
	(void) arg;
	chRegSetThreadName("green");
	while (TRUE)
	{
		chSemWait(&sem1);
		cputs("green on");
		chThdSleepMilliseconds(1000);
		cputs("green off");
	}
}
static THD_WORKING_AREA(waThread2, 1024);
static THD_FUNCTION(Thread2, arg)
{
	(void) arg;
	chRegSetThreadName("yellow");
	while (TRUE)
	{
		chSemWait(&sem1);
		cputs("yellow on");
		chThdSleepMilliseconds(1000);
		cputs("yellow off");
	}
}
static THD_WORKING_AREA(waThread3, 1024);
static THD_FUNCTION(Thread3, arg)
{
	(void) arg;
	chRegSetThreadName("red");
	while (TRUE)
	{
		chSemWait(&sem1);
		cputs("red on");
		chThdSleepMilliseconds(1000);
		cputs("red off");
	}
}
int main(void)
{
	halInit();
	chSysInit();
	chSemObjectInit(&sem1, 0);
	cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO, console_thread, NULL);
	chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO + 1, Thread1, NULL);
	chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO + 1, Thread2, NULL);
	chThdCreateStatic(waThread3, sizeof(waThread3), NORMALPRIO + 1, Thread3, NULL);
	while (!chThdShouldTerminateX())
	{
		chThdSleepMilliseconds(1000);
		chSemSignal(&sem1);
	}
	return 0;
}

```
AWS EC2でELB配下のどれか１台でのみ実行

EC2をELB経由でウェブサーバとして、複数台使用しているときに、１台だけでバッチを実行したいとします。

いままでは、タグにBatchなどをつけることで、バッチを実行するサーバを識別していましたが、immutableな環境にして、サーバをいつでも廃棄できるようにすると、タグを付けるのを忘れたりと面倒です。

そこで、以下の条件で、そのサーバがバッチを実行するサーバかを判定するシェルスクリプトを作成しました。

条件は

* ELB配下のインスタンス
* 有効（InService）なインスタンス
* インスタンスIDを文字列比較して、最も小さなもの

以下のスクリプトを実行するには、IAMのロールなどでELBとEC2へのアクセス権をインスタンスへ付与する必要があります。もしくは、$ aws configure などを実行して、awsのcli環境が使用できるようにしてください。

```lang:shell
#!/bin/bash

LOAD_BALANCER_NAME="[ロードバランサ名]"

# Get self instance id and ip address.
MY_INSTANCE=`curl -s 169.254.169.254/latest/meta-data/instance-id/`


# ロードバランサ配下の有効なインスタンスの一覧を取得
INSTANCE_LIST=`aws elb describe-instance-health \
  --load-balancer-name ${LOAD_BALANCER_NAME} \
  --region ap-northeast-1 \
  --query 'InstanceStates[?State==\`InService\`].InstanceId' | jq -r '.[]'`

IS_ACTIVE=0

for INSTANCE in ${INSTANCE_LIST}
do
    if [ ${INSTANCE} = ${MY_INSTANCE} ]; then
        IS_ACTIVE=1
        continue
    fi

    if [ ${INSTANCE} \< ${MY_INSTANCE} ]; then
        exit 1
    fi
done

if [ ${IS_ACTIVE} -eq 1 ]; then
    exit 0
else
    exit 1
fi
```

このファイルを、check.shなどとして保存し、下記のようにバッチの実行スクリプトを書くことで、ELB配下のすべてのサーバでcronを登録しても、１つのサーバだけで処理が行われます。

```lang:shell
#!/bin/bash

check.sh
IS_RUN=$?

if [ IS_RUN -eq 0 ]; then
    [バッチの実行]
fi
```
画像コピー抑止の依頼が来たのでまとめ

# img タグへの各属性付与によるコピー抑止まとめ

ひとまず簡易的に画像コピー抑止をしたいという話が来たので、ざっと調べた内容の備忘録。

attr/event|effect|ie7|ie8|ie9|ie10|chrome|firefox|safari|
---|---|---|---|---|---|---|---|---
|user-select: none;|   マウスドラッグ等で要素選択できなくする|   x|   x|   x|   x|   o|   o|   o|
|draggable="false"|   要素をマウスでドラッグ＆コピーできなくする|   x|   x|   x|   o|   o|   o|   o|
|unselectable="on"|   上のdraggableのIE独自拡張版？|   o|   o|   o|   o|   x|   x|   x|
|oncontextmenu="return false;"|   イベントをバインドして、メニューを開かせない（属性）|   o|   o|   o|   o|   o|   o|   o|
|$('****').on('contextmenu', function(){ return false;});|   イベントをバインドして、メニューを開かせない（JS）|   o|   o|   o|   o|   o|   o|   o|

## img タグに追加する属性は以下。

何でもかんでも画像に入れるのはややナンセンスな気も。今回は「高解像度画像の自由なコピーをなるべく抑止」という温度感だったので、拡大画像のみ入れるとかそんな感じになりそう。適宜判断して必要な箇所のみに入れるのが良さげ。

#### イベントを直接 img タグに書く場合

```
&lt;img src="hoge.jpg" alt="hoge" **draggable="false" unselectable="on" oncontextmenu="return false;**"&gt;
```

#### JavaScript でまとめてイベント処理をする場合
&lt;img src="hoge.jpg" alt="hoge" **draggable="false" unselectable="on" class="js--no-contextmenu"**&gt;
&lt;script&gt;
  (function($){
    **$('.js--no-contextmenu').on('contextmenu', function(){**
      **return false;**
    **});**
  })(jQuery);
&lt;/script&gt;

## 結果として

* ○ マウスによるデスクトップへのドラッグコピーはできなくなる。
* ○ 右クリックで出るコンテキストメニューから、コピー及び保存はできなくなる。
* × 画面キャプチャによるコピーは依然可能
* × htmlソースコードから対象画像を保存する事は依然可能

##サンプル

[sample html](http://mijabi.github.io/stop-copy/)
pythonでハマった落とし穴をまとめる記事

# 分数

NG:

```py
def F(z, tau):
    return z + 1 / 2 * np.sin(2 * z) - pi / 2 * tau
```

OK:

```py
def F(z, tau):
    return z + 1. / 2. * np.sin(2 * z) - pi / 2 * tau
```

Cでもpythonでもrubyでも`1/2`は0です。JSerやPHPerは泣かない
Actionクラスが扱うメッセージの種類と出力

# Struts2が扱えるメッセージの種類

Struts2はアプリケーションが画面に表示するメッセージをいくつかの種類にわけて管理しています。メッセージは文字列で直接記述する方法やプロパティファイルにてメッセージコードを指定する方法が選べます。
複数のメッセージを設定できますし、複数の領域も同時に使えます。

## メッセージの種類

メッセージを出力するには、ActionクラスがActionSupportクラス（またはActionSupportを継承したクラス)を継承して、メッセージの種類ごとに用意されているActionSupportのメソッドを実行します。

Struts2が標準で扱えるメッセージの種類は以下のとおりです。

|種類|ActionSupportのメソッド|用途|
|:---|:---:|:---|
|通常メッセージ|addActionMessage|通常メッセージを設定|
|エラーメッセージ|addActionError|エラーメッセージを設定|
|項目エラーメッセージ|addFieldError|入力項目に対するエラーメッセージを設定|

## メッセージの設定方法

メッセージの本文を設定する方法は2種類あります。

* メソッドの引数に直接文字列を記述する
* プロパティファイルに定義した文字列を指定する

ActionSupportにはプロパティファイルから指定した文字列を取得するgetText(プロパティ名)があり、メッセージの本文をプロパティファイルに定義できます。メッセージの文言を別管理にして変更しやすくしています。

なお、読み込むプロパティファイルの指定方法は、struts.xmlにて次の設定を記載します。

```xml:struts.xml(抜粋)
<struts>
	<!-- アプリケーション共通プロパティファイル名。拡張子は不要。 -->
	<constant name="struts.custom.i18n.resources" value="commons,message,twitter" />
</struts>
```

* プロパティファイルは/WEB-INF/classesに配置
* プロパティファイルは必ず拡張子が .properties であること
* 複数のプロパティファイルを指定するにはカンマ区切りで指定

例えばmessage.propertiesに次のメッセージ文字列を登録しておき、

```properties:message.properties
register.complete=登録が完了しました。
```

Actionクラスからこのメッセージを出すには、

```java:MessageAction.java
public class MessageAction extends ActionSupport {
    public String start() throws Exception {
         // 通常メッセージを定義
         addActionMessage(getText("register.complete"));
         // SUCCESSの画面へフォワード
         return SUCCESS;
    }
}
```

のように、2つのメソッドを組み合わせます。

## 動的メッセージ、プレースホルダーの利用

メッセージの種類を問わず、プレースホルダーを使った動的メッセージも設定できます。

例えば同様にmessage.propertiesに以下のように定義しておき、

```properties:message.properties
register.complete={0}さん、タスク番号{1}の登録が完了しました。
```

{0}や{1}にはActionクラスから値を渡しておくと…

```java:MessageAction.java
public class MessageAction extends ActionSupport {
    public String start() throws Exception {
         // プレースホルダに指定する値
         List<String> holder = Arrays.asList("カピバラ","35");
         // 通常メッセージを定義
         addActionMessage(getText("register.complete" , holder));
         // SUCCESSの画面へフォワード
         return SUCCESS;
    }
}
```

こうすることで、通常メッセージは

```
カピバラさん、タスク番号35の登録が完了しました。
```

となります。

## 項目エラー(FieldError)の扱い方

項目エラー(FieldError)は、入力項目(リクエストパラメータ)ごとに指定可能です。例えば項目名(name)がusernameに対して項目エラーメッセージを追加するには、

```java
// 直接文字列を記載
addFieldError("username", "項目エラーです");

// プロパティから文字列を取得
addFieldError("username", getText("username.error"));
```

となります。

> ただしActionクラスで直接項目エラーを記述することは極めて稀なケースで、実際にはValidationによる自動設定をするか、またはCustomValidationを作成した中で、項目エラーの追加をする際に利用します。
GitHub のプライベートリポジトリを SSH key の登録なしで git clone する

### 手順
1. GitHub で Personal settings から Personal access tokens のページを開き、 Generate new token でトークンを発行する。
2. git clone する時、パスワードの代わりに上記トークンを入力する。

サクッと git clone したい時は SSH key を登録するより早いです。

### 注記
この方法は HTTPS でのみ有効です。 SSH の場合は SSH Key を登録して下さい。
Androidアプリでjdb


デバッグしたいアプリを起動する

```Bash:Bash
adb shell
am start -e debug true jp.co.package/.MainActivity
```

PID一覧を表示する

```Bash:Bash
adb jdwp
```
jdbできるPIDが表示されるのでコピー

```Bash:Bash
adb forward tcp:7777 jdwp:上記でコピーしたPID
jdb -sourcepath src -attach localhost:7777
```

JDBコマンド
https://docs.oracle.com/javase/jp/6/technotes/tools/windows/jdb.html
AngularJSのfactory内でHTTPリクエストサンプル

AngularJSのfactory内でHTTPリクエストを実行して、レスポンスが返ってきた後、controller側で継続の処理を実行する処理のサンプルです。備忘録として、残しておきます。

まずは、factory。ここでは、「dataService」という名前で作成しています。
appは通常通り、
`var app = angular.module("app",[]); `
で生成しています。

```lang:dataService.js
app.factory('dataService',['$http', '$q', function($http, $q){
    // Promiseオブジェクト
    var deffered = $q.defer();
    
    // ページ内のデータ
    var data = {};
    
    // ステータス
    var status = 'none';
    
    // メッセージ
    var message = '';
    
    var dataService = {};
    
    /**
     * ajaxで情報を取得
     * @param url
     */
    dataService.getData = function(url){
        //GETリクエスト
        $http.get(url, {
            headers: {
              'Content-type': 'application/json'
            }
        })
        
        .success(function(ret){
            if(ret['status']==='success'){
                data = ret['data'];
                status = ret['status'];
                // 成功
                deffered.resolve();
            } else {
                status = ret['status'];
                message = ret['message'];
                // エラー
                deffered.reject();
            }
        })
        .error(function(){
            status = 'error';
            message = '情報の取得に失敗しました';
            // エラー
            deffered.reject();
        });  
        return deffered.promise;
    };
    
    dataService.data = function(){
        return data;
    };
    
    dataService.status = function(){
        return status;
    };
    
    dataService.message = function(){
        return message;
    };
    
    return dataService;
    
}]);
```

続いて、このfactoryを利用するcontroller。

```lang:controller.js
app.controller("SampleController", ['$scope', '$rootScope', '$http', 'dataService', function ($scope, $rootScope, $http, dataService) {
    // リクエストのURL
    $scope.requestUrl = '/ajax_sample/getData';
    
    // dataServiceのgetDataを実行する処理
    $scope.getData = function(url){
        dataService.getData(url).then(function(){
            // service内のHTTP通信が終わったあとの処理
            $scope.data = dataService.data();
            $scope.status = dataService.status();
            $scope.message = dataService.message();
        });
    };
    
    $scope.getData($scope.requestUrl);
    
}]);
```

以上です！
コードを書く際の注意点

自責の念を込めて。
「プログラミング作法(第1章）」を読んでいて胸が痛くなった箇所を書き留めていく。

<h1>スタイル</h1>

<h2>変数</h2>
変数名や関数名は、オブジェクトのラベルである。
その目的についての情報を伝えるので簡潔で覚えやすい名前をつけるべき。
【基本】
グローバル変数にはわかりやすい名前。
ローカルには短い名前。
マジックナンバーには名前を付けよう

<h2>演算子</h2>
・（）を使って曖昧さを回避しよう
if( blockId>=3 || blockId<=8 )
if( (blockId>=3) || (blockId<=8) )
※演算子には優先順位があるので、意図しない結果にならないために明示的に（）で括ろう

<h2>コメント</h2>
・当たり前のことをいちいち書くな
・コードと矛盾させるな
→ほとんどのコメントはそれが書かれた時点ではコードと一致しているが、
バグが直されたりプログラムが進化してもコメントがほったらかしにされるケースが多い。
コードを変更したら、コメントがまだ正確かどうかきちんと確認するように！！！！
コメントはコードのなぜを説明するものであり、コードが何をしているかを説明するものではない

だらしないコードは悪いコード。
単に読みづらいだけでなく、問題を抱えているケースが多い。
秘密鍵・公開鍵関連のコマンドまとめ

## About
よく忘れるので、備忘録としてまとめておきます。

### 秘密鍵を作成する
まず作るところから

```
$ ssh-keygen -t rsa
```
* -t 暗号化の形式を指定
* -f 作成するファイルのパスとファイル名を指定
* -C 公開鍵ファイルのコメンtのを指定


### 秘密鍵から公開鍵を作成する
公開鍵を消してしまったり、どの秘密鍵に対応するかわからなくなったときに。

```
$ ssh-keygen -y -f <secret_key>
```

### 公開鍵の情報を参照する

```
$ ssh-keygen -l -f $HOME/.ssh/id_rsa.pub
```

鍵のビット数や暗号化形式などがわかる。-vをつけるとフィンガープリントをいい感じに出力できる。

### パスワードを暗号化する
生のパスワードをリポジトリにコミットしたくないときとか。

```
$ openssl passwd -1 aaa

```

`-1`はMD5での暗号化を指定しています。

※適宜更新したいと思います。
20150624 Aerospike Deep Dive 感想


イベント：
https://atnd.org/events/66877

スライド:
http://tech.im-dmp.net/archives/3971
- 貴重な活用事例

http://www.slideshare.net/makotouehara39/aerospike-migration
- 中身のハッシュテーブルだったりreplicationだったりの仕組みについて

http://www.slideshare.net/MasakiToyoshima/aerospike-deep-dive
- 最近追加されたデータ構造について


感想や知見：

##AerospikeはKVSである。
KVSとして使うとうまく動くし、もっと高機能な何かとしては使うと面倒なことになる。

Redisのように複数のデータ構造をサポートしていると思っていたがそうではない。最近LDT(3番めのスライドで解説されている）という機能が追加されたが使いやすいわけではないし、こなれていないためバグも多そう。

いくつかの講演でバグに引っかかった話などもされていて、
KVSとして使うならばCommunity Editionでサポートなしでもいいが、
枯れていない機能は危険でEnterprise Editionを使用してサポートしてもらう前提でないと使えないとのこと。

いかんせん使われている絶対数が少ないのでバグが見つかりにくいように見える。


##クラスタとしての動作は安定している。運用は楽
イベント終了後に実運用されている方にも伺ったが、自分が一番懸念していてた運用していてのトラブルなどはほとんどないということだった。
Aerospikeが最初からクラスタ構成を前提に設計されていること、SPOFがないこと、運用者が自分たちでコントロールできる項目が少なくデフォルトでいい感じの動作をしてくれる点が多いことなどから、運用はとても楽とのことだった。

##クライアントリッチ
partition tableをキャッシュしたり、node down時に自動で別のserverにretryしたり、データ格納時のserializeを担当するなど、他のKVSと比べて多くの処理をクライアントが担当している。
REST APIでアクセスできるRiakなどとは対極の思想だが、node故障時のretryなどの処理を自分で書かなくていいことはメリット。

##AWSでも高速、安価
https://www.aerospike.com/docs/deploy_guides/aws/tune/
この辺に載っているのですが、AWSではOn-Memory or Epehemeral Disk構成でオンプレと同等のパフォーマンスが出るとのこと

DynamoDBは高いのでそのあたりとの比較資料などがあると嬉しいっすねという話をした。

DynanoDBよりはずっと安くなるとのこと。（Dynamoが高いともいう）

##同期レプリケーションのため不安定なネットワーク(Multi-AZなど)では十分なパフォーマンスが出ないことがある

イベント終了後にAerospikeの人に伺ったのだが、Multi-AZでの動作はイマイチな点も多いとのことだった。

Aerospikeは同期レプリケーションを採用している（Enterprise版のみのCross Datacenter Replication機能を使わないと非同期レプリケーションはできないとのこと）。
またRack Awarenessに関する設定があり、これを使うと同じデータをなるべく別の場所に保存させることができる（つまりAZをRackに見立てて使う）

この2つの機能を組み合わせることで片方のAZが丸ごと落ちてもデータがロストしない安心設計となる。
しかし当然AZをまたぐとレイテンシは悪化する。
実際のMulti-AZでは酷いとAZ間のpingが200ms程になることもあるそうで（特にバッチやバックアップがたくさん走る深夜）
デフォルトのtimeoutしきい値150msを超えてdown判定されてしまったり、書き込みのレイテンシが悪化したりする。（なのでMulti-AZではしきい値250msくらいで運用してもらっているとのこと）

対策としてはtimeoutしきい値を長くしたり、レイテンシが重要な用途ではSingle-AZで構成したりするそう。

とはいえこのあたりの問題はRDSのMulti-AZなどでも起きている問題ですよねという話をした。

##Aerospike as a Service を計画中
詳細は言えないが秋ごろに何か発表があるとのこと。

世の中の流れとしてManaged Serviceを求められていますよねとのことだった。
Ansibleでタスクの実行中に確認や入力を行わせる裏技

裏技というのは釣りです。すみません。

[pause モジュールの prompt](http://docs.ansible.com/pause_module.html)でとった値を普通に register してしまえば入力値を処理できることに気がついて悔しかったのでここにメモしておきます。

あと終了させるのが fail だってのもさっき知りました。こんなことしてるとどんどん手続き的になっていきますね。すみません。

```
- local_action: shell cd work/myapps; git rev-parse master
  register: revision
  sudo: false

- debug: msg="HEADのリビジョンは{{revision.stdout_lines[0]}}だよ"

- pause: prompt="デプロイする? (Y/n)"
  register: inp

- fail: msg="you input text {{inp.user_input}}"
  when: inp.user_input != 'Y'
```
ghostブログで画像をアップロードする方法


記事に `![]`と書くと、プレビュー画面にアップロードフォームが現れて、そこに画像をドラッグ&ドロップするとアップロードできる。

![Editor_-_suin.png](https://qiita-image-store.s3.amazonaws.com/207/889/7fc1a318-9075-e588-90f5-82813c672621.png)
form.ajaxSubmit() でアップロード

# 概要
* `form.ajaxSubmit()` で画面遷移なしにアップロード
* ファイル選択をすると即アップロード
* アップロード受付側はなんでもいい

## コード

### HTML

```html:index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <script src="//code.jquery.com/jquery-2.1.4.min.js"></script>
  <script src="//malsup.github.com/jquery.form.js"></script>
  <script src="script.js"></script>
</head>
<body>
  <form action="upload.php" method="POST" id="form" enctype="multipart/form-data">
    <input id="file" type="file" name="myfile" accept="image/png">
  </form>
</body>
</html>
```

### PHP (アップロード待ち受け)

PHP マニュアルページからコピペ。必要最小限のアップロード待ち受け処理

```php:upload.php
<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['myfile']['name']);

if (move_uploaded_file($_FILES['myfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

// echo 'Here is some more debugging info:';
// print_r($_FILES);
```

### jQuery

```javascript:script.js
$(document).ready(function () {
  $('#file').on('change', function () {
    $('#form').submit();
  });

  $('#form').on('submit', function (e) {
    e.preventDefault();
    $(this).ajaxSubmit();
  });
});
```

## 試してみる

* ビルトインサーバ(`php -S localhost:3000`)を利用して接続を待ち受けさせる
* `localhost:3000/index.html` にアクセス
* アップロードするファイルを選択

## Links

* [jQuery Form Plugin](http://malsup.com/jquery/form/#getting-started)
* [PHP: Handling file uploads - Manual](http://php.net/manual/en/features.file-upload.php)
Swift2.0で追加された@testableはprivateにはアクセスできない

Swift2.0でUnit Testを書く際に`@testable`というattributeが追加されました。
この`@testable`を使用する際の注意事項です。

まずはアクセス制御について確認しましょう。[以前書いたもの](http://qiita.com/mo_to_44/items/d895aaa77476e312b9c5)から引っ張ってきました。

## アクセス制御

Swiftは **モジュール** と **ソースファイル** をアクセス制御の単位としています。

|   |アクセスレベル|用途|
|---|---|---|
|public|どこからでもアクセス可能|どこからでもアクセス可能なのでframeworkのAPIを定義する場合はこれを使う|
|internal|デフォルトのアクセスレベル|自身のモジュールと同じモジュールのソースファイル内であればアクセス可能。何も指定しない場合はこれが指定される。|
|private|最も厳しいアクセスレベル|モジュール内の同じソースファイルでなければアクセスできない。外部に隠蔽しておきたいものはこれを指定。|

## `@testable`の書き方

`@testable`は`import`と一緒に記載します。以下はProductKitというEmbedded Frameworkを作成し、そのUTを記述した際のものです。

```ProductKitTests.swift
import XCTest
@testable import ProductKit

class ProductKitTests: XCTestCase {
    
    override func setUp() {
        super.setUp()
    }
    
    override func tearDown() {
        super.tearDown()
    }
    
    func testExample() {
        let something = Something(publicName: "public", internalName: "internal")
        something.publicHello(something.publicName)
        something.internalHello(something.internalName)
    }
}
```

2行目の`import`の前に`@testable`を記述しています。`internal`なメソッドやプロパティに対してはこれでアクセス可能になります。

## 注意点

注意点としては、`@testable`をつけてもアクセス可能なのは**`internal`までで、`private`な関数、メソッド、プロパティにはアクセスできません。**

よく考えれば、外部モジュールにさえしておけば`internal`で十分隠蔽されている状態になります。モジュールが分かれていれば`internal`なプロパティやメソッドにはアクセスできないので。

いままで外部モジュールで作成したクラス内の、内部でしか使用しないメソッドなどは`private`にしていましたが、モジュールが分かれていれば参照不可能になるので`internal`で十分なのかもしれません。というか、そうしないとテスト不可能になります。

ただし同一モジュール内では`internal`なプロパティやメソッドにはアクセスできてしまうわけで、隠蔽したいからと`private`をつけてしまうと、外部モジュールであるテストターゲット内で参照不可能になってしまいます。

なんだか手が届かないところがかゆい感じです。
iOS9のSFSafariViewControllerを使ってアプリ初回起動時のブラウザリダイレクトを卒業しよう

**2017-07-25 追記**

App Store審査ガイドラインにおいて下記の方法でユーザのトラッキングを行うことは明確にNGとされたようです。

```
また、SafariViewControllerを使用して、ユーザーの認知や同意なしにアプリケーションでユーザーの追跡を行わないでください。
```

https://developer.apple.com/app-store/review/guidelines/jp/#other-business-model-issues

**######### 追記おわり ############**

広告トラッキングのために、アプリ初回起動直後に自動的にSafariが開いて、再度アプリに戻ってくる・・っていうやつありますよね。うざいですよね。
Safariのcookieをアプリ側から取れないので、ああいうダサいことを各広告SDK提供会社は採用していたわけです。

で、iOS9のSFSafariViewControllerを使えば、このダサイ挙動は改善できるんじゃない？ってことを同僚と話していたので、実験してみました。

```swift:ViewController.swift
import UIKit
import SafariServices

let kSafariViewControllerCloseNotificationName = "safariViewControllerCloseNotificationName"

class ViewController: UIViewController {
    
    lazy var safariVC:SFSafariViewController! = {
        let url = NSURL(string: "http://kenmaz.net/tmp/ios9_sample.html")!
        let vc = SFSafariViewController(URL:url)
        vc.delegate = self
        return vc
    }()
    
    var tracked = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        NSNotificationCenter.defaultCenter().addObserverForName(
            kSafariViewControllerCloseNotificationName,
            object: nil,
            queue: NSOperationQueue.mainQueue()) { [unowned self] (notification) -> Void in
                
                self.tracked = true
                self.safariVC.dismissViewControllerAnimated(true, completion: nil)
        }
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        
        if !tracked {
            presentViewController(safariVC, animated: true, completion: nil)
        }
    }
}

extension ViewController: SFSafariViewControllerDelegate {

    func safariViewControllerDidFinish(controller: SFSafariViewController) {
        controller.dismissViewControllerAnimated(true, completion: nil)
    }
}
```

```swift:AppDelegate.swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    func application(application: UIApplication, openURL url: NSURL,
        sourceApplication: String?, annotation: AnyObject) -> Bool {
            
            NSNotificationCenter.defaultCenter().postNotificationName(
                kSafariViewControllerCloseNotificationName,
                object: nil)
            
            return true
    }
}
```
```html:ios9_sample.html
<h1>踏み台ページ</h1>

<script>
  setTimeout(function() {
    document.location = 'ios9-safarivc://close'
  }, 3000);
</script>
```
NDAがあるのでスクショは載せられませんがサンプルコードだけアップしときました。
https://github.com/kenmaz/iOS9_safariVCSample


一瞬safariViewControllerがチラっと表示されるのがダサいですが、cookieはちゃんと共有されてます。
他にもクールなやり方があるかもしれませんが、各広告SDK提供会社に期待しましょう。。。
Laravel5のQueuesのlistenとwork --daemonを比較する

Laravel5のQueuesはメッセージキューを抽象化したフロントエンドで、バックエンドにRedis, Amazon SQS, IronMQなどが使える。
簡単な非同期ジョブをする分には便利そう。

使うときにはキューにpushするアプリ側と、非同期で処理するワーカー側を構成することになるが、ワーカーを走らせるときに大きく2種類あるようなことがドキュメントに書いてある。
http://laravel.com/docs/5.0/queues#running-the-queue-listener

基本がqueue:listenの方で
>Laravel includes an Artisan task that will run new jobs as they are pushed onto the queue. You may run this task using the queue:listen command:

>```
php artisan queue:listen
```

もう1つがqueue:work --daemon。

>The queue:work also includes a --daemon option for forcing the queue worker to continue processing jobs without ever re-booting the framework. This results in a significant reduction of CPU usage when compared to the queue:listen command, but at the added complexity of needing to drain the queues of currently executing jobs during your deployments.

>```
php artisan queue:work --daemon
```

「work --daemonの方がCPU使わないよ。でもデプロイ中に実行中のジョブをdrain（キューから取り出す？）するのがめんでぃーよ。」
と説明されているので試してみた。

# 環境
MBPでVagrant
CPU 1コア、メモリ2GB

# 検証
## queue:listenの場合
queue:listenはジョブが追加されるとワーカープロセスを立ち上げて処理する。
![スクリーンショット 2015-06-25 12.58.03.png](https://qiita-image-store.s3.amazonaws.com/0/2648/56083d30-87f5-17fc-c6ae-74f04e447936.png)

ワーカーは以下にオプションを付けて実行されている。

```
php artisan queue:work
```

## queue:work --daemonの場合
![スクリーンショット 2015-06-25 13.03.50.png](https://qiita-image-store.s3.amazonaws.com/0/2648/2356181d-3b32-1470-4719-dce0c90758d6.png)
デーモンで立ち上げたワーカーがジョブを処理し続ける。

## まとめ
queue:listenはその都度ワーカープロセスを立ち上げる分CPU喰う
queue:work --daemonは1プロセスだからCPU喰わないというおなじみのパターン。

並列に動かせるのか、などドキュメントに記載が見当たらないのでまた試そう。
power_assert.cr 作った

# TL;DR

https://github.com/rosylilly/power_assert.cr

```
F

Failures:

  1) MyLib .major_version should be equal 1
     Failure/Error: assert MyLib.major_version == 1

         MyLib.major_version == 1
         |                   |  |
         |                   |  1
         |                   false
         2

     # ./spec/my_lib_spec.cr:6
```

やったぜ

# power assert とは

ぐぐってくれ。

# 実装方法

Crystal には macro があって、大変めちゃカッコイイのだが、これをとにかく乱用して作り上げている。文字列生成周りがすごいハードコード感にあふれていて厳しいのでなんとかしたいのだが、うまくいく気がしない。

ちなみに、最初は Ruby の power-assert よろしく

```rb
assert { a == b }
```

という具合にとろうとしていたのだが、これだと macro 側で受ける時、

```
macro assert(&block)
```

と書くことになる。この `block` にわたってくるのは [Macros::Block](http://crystal-lang.org/api/Macros/Block.html) なんだけど、 `Macros::Block` からソースコードはとれても、その中身まで言及することが出来ない。ちなみに評価結果だけなら `{{ block }}` って書いときゃもらえる。

で、とにかくそのままな AST をゲットするためにはどうすれバインダーとバインバインしていたら、素直に

```
macro assert(expression)
```

と書いておけば、 `Macros::Call` なりが吹っ飛んでくることが判明。この時点でほぼ勝ち申した。

## Macros::Call

[Macros::Call](http://crystal-lang.org/api/Macros/Call.html) には `receiver` と `args` と `name` があるので、 power assert で出力を行う際に必要なものはほぼすべて手に入る。あとはこれをごちゃごちゃいじり回すだけなのだが、あんまりドキュメントが優しくないので少しむずかしい。気をつけよう。

## `a == b && c == d` に対応できない問題

既知の問題として `assert a == b && c == d` を上手く取り扱うことが出来ない。ちなみにこれ、どういう AST が飛んでくるかというと `Macros::If` が飛んでくる。なんでや！？と思ったら AST になる所で変形していて

```crystal
if temp = (a == b)
  c == d
end
```

という形で送っていますとのことでした。マジかよー。

うれしくないなぁと思いつつも、 assert に複雑な文を渡してる奴が悪いなこれは、ということであまり構わないことにしてリリースすることになりました。

## 今後の展望

Crystal の息が続く限り保守していくと思います。コンゴトモヨロシク。
[正規表現] Unicode コンソーシアムの正規表現仕様を広めよう

私事ではあるけれど、正規表現ライブラリの言語/フレームワークごとの仕様のばらつきにはいい加減うんざりさせられている。

特に先読み/後読み(look-ahead/look-behind) の実装のばらつきは本当に困る。どことは書かないけど、ライブラリを試すたびにだいたい以下のような目に遭う。

- 先読みと後読みの片方しか実装していない、あるいは未実装
- 先読み/後読みの中で並列`|`メタキャラクターを使うとがっつり例外で落ちる（あと`*`や`+`なども）

最近だと、Golang の正規表現ライブラリで使用されているRE2(https://github.com/google/re2/wiki/Syntax) という仕様では先読み/後読みをあっさり諦めていて、ちょっと凹んだ。JavaScript の正規表現ライブラリも後読みがない。

自分が使っている中で先読み/後読みがちゃんと動作するのは、Ruby の Onigmo、.NET Framework、PowerGrep という Windows アプリぐらい。perl や PHP は使ってないのでわからない。

多くのエンジニアは、先読み/後読みの不備をなまじコーディングでアドホックにカバーしてしまったりするので、ライブラリが洗練されない。自分はマルチプラットフォームでの正規表現そのものに用があるので、コーディングでカバーという選択肢はない。

先読み/後読みの実装がかなり面倒臭いこと、特にその中でメタキャラクターを使えるようにするのは大変であることは想像が付くのだけど、もう少しどうにかなって欲しい。少なくとも、各言語/フレームワークでばらつきまくっている仕様がせめてひとつにまとまる方向に少しずつでも動き出して欲しい。
どうぞよろしくお願いします。

http://unicode.org/reports/tr18/

あまり知られていないようなのでここにメモしておくけど、Unicode コンソーシアムは上のリンクにあるような Unicode 用の正規表現の仕様を公開している。ステータスを見るととっくに承認完了していて正式な仕様になっている。

とりあえず正規表現ライブラリを日夜メンテしている凄腕エンジニアの皆様には、今後この仕様に沿ったライブラリのアップデートを行っていただければと切に願う次第です。
hifiveが提供する多彩なUIコンポーネントを紹介（ボックス区切り）

[hifiveが提供する多彩なUIコンポーネントを紹介（ボックス区切り） | hifive開発者ブログ](http://blog.htmlhifive.com/2014/06/10/hifive%e3%81%8c%e6%8f%90%e4%be%9b%e3%81%99%e3%82%8b%e5%a4%9a%e5%bd%a9%e3%81%aaui%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%82%92%e7%b4%b9%e4%bb%8b%ef%bc%88%e3%83%9c%e3%83%83/)の転載です。

業務用Webアプリを開発する際にはプログラマーの方でも簡単に使えるUIコンポーネントの存在が必須です。特にカスタマイズ性の高さやフレームワークとの親和性が大事になります。

hifiveはフレームワークはもちろん、UIコンポーネントも合わせて提供しています。業務アプリで良くありがちなUIもhifiveを使うことで素早く実装ができるはずです。今回はまずボックス区切りを紹介します。

## ボックス区切りとは

まずは画像で見てもらった方が早いでしょう。

![](https://htmlhifive.files.wordpress.com/2014/06/hifive-html5-box2.png?w=400)

各ボックスにある区切りはマウスでドラッグして移動できます。

![](https://htmlhifive.files.wordpress.com/2014/06/hifive-html5-box3.png?w=400)

こちらが実際にブラウザで試しているところです。マウス操作でスムーズに幅を変更できます。

https://www.youtube.com/watch?v=RKmgbEv0ZOM

## よくあるニーズ

業務アプリを作る際には必要に応じて左右の幅を自分で変更したいと言ったニーズが出るかと思います。また、情報を動的に隠したり、その逆で表示したいと考える場合も多いでしょう。そんなときに使ってみてください。

## 使い方

では実際の使い方です。HTMLは次のようになります。

```
<div class="dividedBox horizontal">
  <div class="box fill"></div>
  <div class="box fill autoSize"></div>
  <div class="box fill "></div>
</div>
```

そしてJavaScriptは次のようになります。

```
$(function(){
  $('.dividedBox').each(function(){
    h5.core.controller(this, h5.ui.container.DividedBox);
  });
});
```

**h5.core.controller** に **h5.ui.container.DividedBox** として登録していくだけで使えます。

## 縦方向にも

クラスに horizontal を指定すると横方向に、vertical を指定すると縦方向にボックスが並びます。

```
<div class="dividedBox vertical">
  <div class="box fill"></div>
  <div class="box fill"></div>
  <div class="box fill"></div>
</div>
```

![](https://htmlhifive.files.wordpress.com/2014/06/hifive-html5-box4.png?w=400)

区切りは上下に動くようになります。

![](https://htmlhifive.files.wordpress.com/2014/06/hifive-html5-box5.png?w=400)

ボックスの幅は個別に指定できます。幅が足りない分は、親要素である dividedBox の内容が表示されます。

## スマートフォンにも対応

HTML5ということもあり、スマートフォンでの表示、操作にも対応しています。

![](https://htmlhifive.files.wordpress.com/2014/06/hifive-html5-box8.png?w=400)

タッチ操作で区切りを起動できます。

![](https://htmlhifive.files.wordpress.com/2014/06/hifive-html5-box9.png?w=400)

こちらはiPhoneで試したところです。

https://www.youtube.com/watch?v=3HROJjx7Ld8

## その他

変更した区切りを元の位置に戻す場合は dividedBoxController.refresh() のようにrefresh メソッドを使います。

```
dividedBoxController.refresh();
```

区切りを動的に追加する場合は insert メソッドを使います。

```
this.dividedBoxController.insert(1,	'<div class="box"></div>');
```

ボックスを追加することもできます。

```
dividedBox.append(addDiv)
```

[こちらにデモ](http://hifive.github.io/hifive-ui-library/hifive-ui-library/WebContent/components/dividedBox/index.html)がありますので実際に触れてみてください。

----

[ボックス区切り移動](http://hifive.github.io/hifive-ui-library/hifive-ui-library/WebContent/components/dividedBox/index.html)

[ボックス区切り移動サンプル(ボックス追加機能、リセット機能あり)](http://hifive.github.io/hifive-ui-library/hifive-ui-library/WebContent/components/dividedBox/sample/index.html)
processingで引力と粒子の動き

マウスの位置に向かって集まってきますが、引力・質量をパラメータにすることで
ちょっと面白い動きになります。
![20150210.jpg](https://qiita-image-store.s3.amazonaws.com/0/75611/de4d1c59-0b47-2568-1245-181dc9092b7b.jpeg)

~~~java
int p_num;
 
float offsetx;
float offsety;
 
ArrayList<Particles> p_set = new ArrayList<Particles> ();
 
void setup () {
 
    size (1920, 1080);
    colorMode (RGB, 256);
    background (255);
    frameRate (60);
 
    p_num = 1000;
 
    offsetx = width / 2;
    offsety = height / 2;
 
    for (int i = 0; i < p_num; i++) {
        p_set.add (new Particles ());
    }
 
}
 
void draw () {
 
    fade ();
 
    //background (255);
 
    //translate (offsetx, offsety);
 
    for (Particles p: p_set) {
        p.refresh ();
        p.draw ();
    }
 
    //saveFrame ();
 
}
 
void fade () {
 
    noStroke ();
    fill (255, 5);
    rectMode (CORNER);
    rect (0, 0, width, height);
 
}
 
class Particles {
 
    float mass;
    float px, py;
    float vx, vy;
    float ax, ay;
    float sc;
    float distance;
 
    Particles () {
 
        mass = 0;
        px = random (width);
        py = random (height);
        vx = random (-0.5, 0.5);
        vy = random (-0.5, 0.5);
        ax = 0;
        ay = 0;
        sc = 1;
 
    }
 
    void refresh () {
 
        mass = random (1.0, 10.0);
        ax = -1 * vx * 0.2;
        ay = -1 * vy * 0.2;
        ax += (mouseX - px) * 0.1;
        ay += (mouseY - py) * 0.1;
 
        distance = dist (mouseX, mouseY, px, py);
        if (distance < 10) {
            sc = 11;
        } else {
            sc = 1 / (distance / 100);
        }
 
        vx += ax / mass * 0.4;
        vy += ay / mass * 0.4;
        px += vx;
        py += vy;
 
    }
 
    void draw () {
 
        stroke (40);
        strokeWeight (1);
        fill (random (255));
        ellipseMode (CENTER);
        ellipse (px, py, 4 * sc, 4 * sc);
 
    }
 
}
~~~
Emberで特定の日付フォーマットのAPIとやりとりする

# やりたいこと
独自フォーマットの日付項目が含まれているデータをRESTfulなAPIでやりとりする。

# 環境/前提とか

ember-cliを使って Emberの開発をしていることとします。

* ember-cli
    * 0.2.7
* ember
    * 1.10.0
* ember-data
    * 1.0.0-beta.15

# 方法

`DS.attr`の種別を新しく用意して、その種別に対する`transform`を実装してあげれば実現できます。

* 参考
    * [DS.attr](http://emberjs.com/api/data/classes/DS.html#method_attr)
    * [DS.Transform](http://emberjs.com/api/data/classes/DS.Transform.html)

# 手順とか

1. 種別の名前を決めます。ここでは`myDatetime`とします。
2. transformのひな形を作成します。
3. transformを実装します。
4. model定義の際、決めた種別を利用します。

```
$ ember generate transform myDatetime
```
```js:transforms/my-datetime.js

// お好きなフォーマットをご利用下さい。
var FORMAT = 'YYYY-MM-DD HH:mm:ss';

export default DS.Transform.extend({
  deserialize: function(serialized) {
    if (serialized) {
      return moment(serialized, FORMAT).toDate();
    }
    return serialized;
  },

  serialize: function(deserialized) {
    if (deserialized) {
      return moment(deserialized).format(FORMAT);
    }
    return deserialized;
  }
});
``` 
```js:models/hoge.js
export default DS.Model.extend({
  created_at: DS.attr('myDatetime')
});
```

# 参考(いちおう)
ソースコード中のmomentとは[これ](http://momentjs.com/)です。
MongoDB2.6のクラスタを3.0+WiredTigerに移行する方法

#目的

v2.6で稼働中のreplicaSet+ShardingのMongoDBクラスタを3.0+WiredTigerにupgradeしてDisk使用量をダイエットさせること。replicaSetはprimary+secondary+arbiterの3台構成を想定。

#3.0に更新する手順
基本的には[公式ドキュメント](http://docs.mongodb.org/manual/release-notes/3.0-upgrade/#upgrade-a-sharded-cluster-to-3-0)に沿ってやればOK。まずはMMAPv1のまま3.0にし、その後WiredTigerを有効にする。

## Balancerの停止
mongosにつないで次のコマンドを発行する

```
sh.stopBanalcer()
```

確認は以下のコマンドで行う。

```
sh.getBalancerState()
```

## mongosの更新

まずはmetadataを更新する。***3.0***のmongosをconfigdbにつなげ、upgradeを発行する。画面にエラーログが出ていないことを確認。

```
mongos --configdb <configDB string> --upgrade
```

問題がなければ2.6で動いているmongosを1つずつ再起動して3.0のバイナリで動かす。(`--upgrade`はつけない)


## configdbの更新

configdbとして動いているmongodを停止し、v3.0のmongodで同一の設定で再起動する。mongosの起動オプションで`--copnfigdb <cfg1>,<cfg2>,<cfg3>`のように指定している時、`cfg1`を最後に更新する。

## shardの更新

各shardは`primary`, `secondary`, `arbiter`のmongodからなるreplica setであり、`arbiter`, `secondary`をまずは3.0のバイナリで再起動。その後、以下のコマンドで`primary`を`secondary`に降格し、同様に3.0のバイナリで再起動。

```
rs.stepDown()
```

## Balancerの再起動

mongosにつないで次のコマンドを発行する

```
sh.setBalancerState(true)
```

確認は以下のコマンドで行う。

```
sh.getBalancerState()
```


# WiredTigerに移行する手順

必ず3.0のMMAPv1に移行した後に行う。基本的には公式docの[Change Replica Set Storage Engine to WiredTiger](http://docs.mongodb.org/manual/release-notes/3.0-upgrade/#change-replica-set-storage-engine-to-wiredtiger)に従う。

まずはsecondaryのmongodを停止する。dbpathをバックアップし、元のディレクトリの中身を全て消去する。次に`--storageEngine wiredTiger`をつけて再起動する。設定はconfigファイルに書いても良い。特に同じサーバー上に複数のmongodインスタンスを起動する場合はWiredTigerの`cacheSizeGB`の設定には注意する。

`initial sync`が終了したら(どれくらいかかるか不明)primaryをstepDownし、同様の操作を行う。
電子回路 > テブナンの定理、ノートンの定理、ミルマンの定理

電子回路の計算で以下の定理がある。
- 鳳テブナンの定理
- ノートンの定理
- ミルマンの定理

3つが掲載されている本を見たが、パッと見てそれぞれの特徴を簡単にはわかりにくい記載だった。

こちらがわかりやすいかも。
http://plaza.rakuten.co.jp/yuzan60/diary/201403060001/
> テブナンの定理の、電圧と電流を入れ換えて、抵抗をアドミタンスに代えれば、ノートンの定理になります。
...
ミルマンの定理は、アドミタンスと電源が直列に接続されているものが、いくつか並列接続されているときの、回路の端子電圧を、求める式です。