OmniAICreator/Qiita-1.07M huggingface dataset:
CoreAudio関連のAppleのサンプルプロジェクト、ドキュメント

自分のメモ用として、iOSのCoreAudio関連のAppleのサンプルプロジェクトへのリンクをまとめていきます。

#System Sound Services

| プロジェクト名 | 内容 |
|:-----------|:------------|
|[Audio UI Sounds (SysSound)](https://developer.apple.com/library/ios/samplecode/SysSound/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008018)|        「System Sound Services」のデモ。アラートの再生やUIのサウンドエフェクトの再生、バイブレーションの使用。 |
|[aurioTouch2](https://developer.apple.com/library/ios/samplecode/aurioTouch2/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011369) |オーディオ入出力を処理するための「AURemoteIO」のデモ。 | 
|[GLPaint](https://developer.apple.com/library/ios/samplecode/GLPaint/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007328)|「OpenGL ES」を使用したペイントアプリのデモ。(サウンドエフェクトの再生に「System Sound Services」を使用)| 

#audio processing graph

| プロジェクト名 | 内容 |
|:-----------|:------------|
|[Sampler Unit Presets (LoadPresetDemo)](https://developer.apple.com/library/ios/samplecode/LoadPresetDemo/Introduction/Intro.html)|サンプラーAudioUnitを含むAUGraphの作り方のサンプル|

#ドキュメント 
* [Core Audio Glossary (用語集)](https://developer.apple.com/library/ios/documentation/MusicAudio/Reference/CoreAudioGlossary/Introduction/Introduction.html)

* [System Sound Services Reference](https://developer.apple.com/library/ios/documentation/AudioToolbox/Reference/SystemSoundServicesReference/Reference/reference.html)

* [“Using Audio” in Multimedia Programming Guide](https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html#//apple_ref/doc/uid/TP40009767-CH2)

## Audio Unit Hosting Guide for iOS
* [Audio Unit Hosting Guide for iOS](https://developer.apple.com/library/ios/documentation/MusicAudio/Conceptual/AudioUnitHostingGuide_iOS/Introduction/Introduction.html)

>iOSは、ミキシング、イコライジング、フォーマット変換、記録、再生、オフラインレンダリング、およびVoIPをサポートするためのオーディオ処理プラグインを提供しています。「audio unit」と呼ばれる強力で柔軟なプラグインを動的にロードして、使用することができます。


## Core MIDI Framework Reference
* [Core MIDI Framework Reference](https://developer.apple.com/library/ios/documentation/MusicAudio/Reference/CACoreMIDIRef/_index.html)

>コアのMIDIフレームワークは、MIDIハードウェアのキーボードやシンセサイザーなどのデバイスと通信するためのAPIが用意されています。 

#ドキュメント(日本語)
* [Core Audioの概要](https://developer.apple.com/jp/devcenter/ios/library/documentation/CoreAudioOverview.pdf)

>Core Audioはバージョン2.0以降のiOSで使用できます。 この文書では、iOS 2.2およびOS X v10.5の時点で使用できるCore Audioの機能について説明します。 

#ドキュメント(Mac Developer Library)
* [Audio Unit Programming Guide](https://developer.apple.com/library/mac/documentation/musicaudio/Conceptual/AudioUnitProgrammingGuide/TheAudioUnit/TheAudioUnit.html)

#関連記事

* [ダウンロード可能な Audio Unit 関連のサンプルコード11個](http://qiita.com/shu223/items/cd612613761720ccc059)
Twitterクライアント作るよ（進捗）

##あらすじ
なんかTLっぽいものをver_dumpすることに成功
##現状
TL整形したい
-------

#目標
ブラウザで動くUserStream対応クライアント！

#ざっくり手順
1. htmlでざっくり見た目を作る
2. TL表示、ツイート送信などの関数をjQueryで作る
3. Ajax+TwistOAuthでTLをリアルタイム更新できるようにする

#0. atpagesのアカウントを作る
作りました。
[ぼにょつい](http://www55.atpages.jp/bonyotwi/)

#1. 見た目を決める
シンプルなのが好きなのでシンプルに
YUIのpureを使います
galatwiとかtwicliとかに近い感じになったけどまあよい
[bonyotwi](http://www55.atpages.jp/bonyotwi/bonyotwi.php)
あっ、送信ボタン無いや

#2. TL表示
認証はサンプルを丸写し

```php:printTL
function printTL($TwistOAuth){
  $homejson = $TwistOAuth->getAuto('statuses/home_timeline');
  $home = json_decode($homejson, true);
  foreach($home as $key => $status)
    h('<p>'.$status['text'].'</p>');
}
```

動かない
Mojolicious::Plugin::Authenticationの使い方


[Mojolicious::Plugin::Authentication](
https://metacpan.org/pod/Mojolicious::Plugin::Authentication)の使い方を書いてみる。
[Mojoliciousでユーザー認証 - Qiita](http://qiita.com/ymko/items/50dde69899633674b1d3)と組み合わせればもうちょっといいのができるかな？

## 必須パラメータの説明

| パラメータ     | 意味     |
|:--------------|---------|
| autoload_user | hookでbefore_dispatchしてるので場合によってはサイトの反応がよくなるかも？ とりあえず1にしておけば良い。 |
| validate_user | authenticate()が呼ばれた場合に認証処理を行うコールバック関数を記述する。uidを返すこと。 |
| load_user     | current_user()が呼ばれた場合にユーザーオブジェクトを返すコールバック関数を記述する（引数として上記で返したuidが渡される） |
※これ以外にもあるけど、[こまけぇこたぁいいんだよ！](http://www.paradisearmy.com/doujin/pasok_komakei.htm)

## スクリプトサンプル

```pl:mysample.pl
use Mojolicious::Lite;

{
  package Database;
  my %data = (
    1 => {
      username => "foo",
      password => "bar",
      nickname => "baz",
    },
  );

  sub auth {
    my ($self, $username, $password) = @_;
    foreach my $uid (keys %data) {
      next unless $data{$uid}{username} eq $username;
      last unless $data{$uid}{password} eq $password;
      return $uid;
    }
    return undef;
  }
  sub userdata {
    my ($self, $uid) = @_;
    return $data{$uid};
  }
}

app->secrets(['test']);
plugin 'authentication', {
  autoload_user => 1,
  load_user => sub {
    my $self = shift;
    my $uid  = shift;
    return Database->userdata($uid);
  },
  validate_user => sub {
    my $self      = shift;
    my $username  = shift || '';
    my $password  = shift || '';
    return Database->auth($username, $password);
  },
};

post '/' => sub {
  my $self = shift;
  my $u    = $self->req->param('u');
  my $p    = $self->req->param('p');
  $self->render(text => ($self->authenticate($u, $p)) ? "ok" : "failed");
};

get '/get' => sub {
  my $self = shift;
  $self->render(text => ($self->is_user_authenticated) ? "ok" : "denied");
};

get '/logout' => sub {
  my $self = shift;
  $self->logout();
  $self->render( text => "logout" );
};

get '/info' => sub {
  my $self = shift;
  my $info = $self->current_user;
  $self->render( text => ($info) ? $info->{nickname} : "not login" );
};

use Test::More;
use Test::Mojo;
my $t = Test::Mojo->new;

$t->post_ok('/' => form => { u => "foo", p => "bar" })->status_is(200)->content_is("ok");
$t->get_ok('/get')->status_is(200)->content_is("ok");
$t->get_ok('/info')->status_is(200)->content_is("baz");

$t->get_ok('/logout')->status_is(200)->content_is("logout");
$t->get_ok('/info')->status_is(200)->content_is("not login");

$t->get_ok('/get')->status_is(200)->content_is("denied");

done_testing;

```


## 参考
* [Mojolicious::Plugin::Authentication](
https://metacpan.org/pod/Mojolicious::Plugin::Authentication)
* [showoff-authentication.pl](http://cpansearch.perl.org/src/MADCAT/Mojolicious-Plugin-Authentication-1.23/example/showoff-authentication.pl)－削られてしまったサンプル
mailcatcher を使って PHP のメール送信内容をテストする

ダミーの SMTP サーバーを簡単に立てることができる gem に mailcatcher というものがあります。

http://mailcatcher.me/

mailcatcher は受け取ったメッセージを API 経由で取得することができます。これを使って `mb_send_mail` 関数で想定した内容でメールが送信されているかテストします。

まずは mailcatcher をインストールして、PHP が mailcatcher を使うように設定します。設定方法は[こちら](http://mailcatcher.me/)の中ほど以降に書いてあります。

下記はテスト対象とするメール送信を行うだけのクラスです。

```Mail.php
<?php

class Mail{
  public function send($to, $subject, $body){
    mb_language('ja');
    mb_internal_encoding('UTF-8');
    mb_send_mail($to, $subject, $body);
  }
}
```

そして下記は Mail クラスをテストする PHPUnit のテストコードです。

```MailTest.php
<?php

require_once 'Mail.php';

class MailTest extends PHPUnit_Framework_TestCase{
  public function testSend(){
    /**
     * メールを送信する。
     */
    $mail = new Mail();
    $mail->send('email@example.com', 'タイトルです', '本文です。');

    /**
     * mailcatcher の API 経由でメッセージの一覧を取得する。
     */
    $messages = json_decode(file_get_contents('http://127.0.0.1:1080/messages'));

    /**
     * 一番新しいメッセージの詳細を取得する。
     */
    $message = json_decode(file_get_contents('http://127.0.0.1:1080/messages/' . $messages[0]->id . '.json'));

    /**
     * 宛先、タイトル、本文などをテストする。
     */
    $this->assertEquals('<email@example.com>', $message->recipients[0]);
    $this->assertEquals('タイトルです', $message->subject);
    preg_match_all('/\n\n(.*)/', $message->source, $matches);
    $this->assertEquals('本文です。', mb_convert_encoding($matches[1][0], 'UTF-8', 'ISO-2022-JP'));
  }
}
```

localhost の 1080 ポートの /messages にアクセスすると、mailcatcher が受け取ったメッセージの一覧を JSON で出力してくれます。また、 /messages/11.json のようにメッセージ ID を指定してアクセスすると、その ID のメッセージの詳細を出力してくれます。
AFNetworking で Qiita API を操作

原文: http://snippets.feb19.jp/?p=1300

Qiita API に言及した記事なのでこちらにもぺたり

-

# AFNetworking

http://afnetworking.com

AFNetworking とは Objective-C 周りでのめんどくさい WebAPI 操作やデータアップロード・ダウンロードをシンプルにしてくれるライブラリ。

Qiita API を例にして Web API 操作を行ってみます。

[Qiita API](https://qiita.com/docs)

 

# インストール

Podfile からインストール

```
platform :ios, '7.0'
pod "AFNetworking", "~> 2.0"
```


# 宣言

```
#import <AFNetworking/AFNetworking.h>
``` 

# GET: Qiita の特定ユーザーの情報を取得する

https://qiita.com/docs#5

```objc
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"https://qiita.com/api/v1/users/ユーザー名" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
    NSLog(@"Website URL: %@", [responseObject objectForKey:@"website_url"]);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
```

# POST: Qiita API を操作する token の取得

 https://qiita.com/docs#3

```objc
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *params = @{@"url_name": @"ユーザー名",
                         @"password": @"パスワード"};
[manager POST:@"https://qiita.com/api/v1/auth" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
    NSLog(@"Token: %@", [responseObject objectForKey:@"token"]);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
```
【解決】【質問です】three.jsでViewportおよびScissorを設定しカメラの位置をある位置にするとオブジェクトが消えてしまう理由

three.jsでViewportおよびScissorを設定してマルチカメラのプログラムを組んでみようとしたのですが、カメラの位置を変えるととたんにオブジェクトが表示されなくなってしまいます。

[サンプルプログラム](http://www.gtk2k.net/viewporttest/test2.html)
サンプルプログラムは、地球を2つ(右の地球は色を反転したもの)横に並べており、最初は左の地球の中にカメラがあります。
→キーを押し続けるとカメラが右に移動し続けますが、カメラの座標が415,0,0となったとたんに3Dオブジェクトが表示されなくなってしまいます。
もしこの理由がわかる方がいらっしゃればご教授願えませんでしょうか。よろしくお願いします。

解決しました。
カメラを移動したときにmeshのupdateMatrix()を実行すると問題が解決しました。
rvm complain of "PATH is not properly set up"

rvm complains 

```bash
Warning! PATH is not properly set up, 
'/home/me/.rvm/gems/ruby-2.1.1/bin' is not at first place, usually this is caused by shell initialization files - check them for 'PATH=...' entries, it might also help to re-add RVM to your dotfiles: 'rvm get stable --auto-dotfiles', to fix temporarily in this shell session run: 'rvm use ruby-2.1.1'.
```

 whenever rvm(v1.25.21) is called, though rvm works perfectly as expected.

By tracing back the message, I figured out the problem lies in

```bash:$HOME/.rvm/script/cli
rvm()
{
   ...
   __rvm_path_match_gem_home_check;
   ...
}
```

```bash:$HOME/.rvm/script/functions/cli
__rvm_path_match_gem_home_check_warning()
{
  rvm_warn "\
  Warning! PATH is not properly set up, '$GEM_HOME/bin' $1, usually this is caused by shell initialization files - check them for 'PATH=...' entries, it might also help to re-add RVM to your dotfiles: 'rvm get stable --auto-dotfiles',to fix temporarily in this shell session run: 'rvm use ${GEM_HOME##*/}'."
}

__rvm_path_match_gem_home_check()
{
  (( ${rvm_silence_path_mismatch_check_flag:-0} == 0 )) || return 0
  [[ -n "${GEM_HOME:-}" ]] || return 0
  case "$PATH:" in
    ($GEM_HOME/bin:*) true ;; # all fine here
    (*:$GEM_HOME/bin:*)
      __rvm_path_match_gem_home_check_warning "is not at first place"
      ;;
    (*)
      __rvm_path_match_gem_home_check_warning "is not available"
      ;;
  esac
}
```
Now it is clear.
This line is the trigger.
```($GEM_HOME/bin:*) true ;; # all fine here```
Whenever the ```$PATH``` does not START WITH ```$GEM_HOME/bin```, the error message is fired.

So...the solution, I now ```source $HOME/.rvm/script/rvm``` after any other scripts finish modifying the path.
Gistを取得してくる、Atom用のプラグイン作ってみた


[Atom](https://atom.io/)は、Githubが開発しているエディタ！？
面白いのが、chromium上で作られている。
私的には、流行ると思っております。

まだ、招待されないと使えないのですが、招待状が私の所に来たのでプラグイン作ってみた。

CoffeeScriptで作るので、結構簡単に作れました。

![createPackage](https://dl.dropboxusercontent.com/s/ckxqamljbvkj256/gistom.gif)


## 使い方
control + alt + g でgist一覧メニューがメニューが開きます。
それを選んで、エンター押すだけで新しいタブが開きGists内容が表示されます。

## 使うにはTokenを設定してね
使うには、あらかじめGitbubにTokenを作っておく必要があります、

Tokenを作ったら、Atomの設定画面で、Gistomを選択してTokenとユーザー名を入力して下さい。

![settings.gif](https://qiita-image-store.s3.amazonaws.com/0/40099/d4aa7012-7eac-8936-192e-2e005a9522b5.gif "settings.gif")

## 問題点
~~作ったパッケージのバージョンアップができない、、、、、~~

~~ここで、議論しております。~~
~~ http://discuss.atom.io/t/cant-publish-package/4890/4 ~~

バージョンアップの問題解決できた。

apmコマンドで再度ログインしたら直ったみたい。

$apm login

## 情報

Gistomのページ
https://atom.io/packages/gistom
Railsアプリで Cal-Heatmap を表示してみる

[Cal-Heatmap](https://github.com/kamisama/cal-heatmap) が GitHub の緑のっぽくて便利そうだったので[コタれん](http://kotaren.heroku.com/)で使ってみたメモ。

![コタれんでheatmap.png](https://qiita-image-store.s3.amazonaws.com/0/4195/d372de9d-53c5-b302-c6ed-aed061792a52.png)
過去半年分の練習記録した日に色がつく

## html に heatmap のタグを追加する
表示したい html.erb に以下のタグを追加する。 id は任意

```html:index.heml.erb
<div id="heatmap"></div>
```

## heatmap の初期化、適用の javascript を書く
html.erb または js ファイルに CalHeatMap の生成と初期化を記述。
各オプションの詳細は公式ドキュメント参照する。

以下はポイント

- itemSelector は div の id と合わせる
- data に Rails で定義する API を記述する
- rails から json で返したデータをパースするメソッドを定義して afterLoadData に設定する(eval しないと json として読み込めなかったので)

```js:index.heml.erb
  var startDate = new Date();
  startDate.setMonth(startDate.getMonth() - 5);

  var parser = function(data) {
    return eval("(" + data + ")");
  };

  var cal = new CalHeatMap();
  cal.init({
    itemSelector: "#heatmap",
    data: "/api/comments?user_id=<%= @user.id %>&start={{d:start}}&stop={{d:end}}",
    afterLoadData: parser,
    cellSize: 7,
    domain: "month",
    subDomain: "day",
    range: 6,
    tooltip: true,
    start: startDate,
    legendColors: ["white","green"],
    domainLabelFormat: “%b",
    legend: [1,2,3,4]
   });
```

## Railsに json を返すAPIを追加する
[grape](https://github.com/intridea/grape) を利用して rails に json を返すAPIを追加する。
heatmap が受け付けるデータフォーマットは timepoint と値のハッシュなので、DateTimeの変数を to_i した値をハッシュキーにする。

```rb:tunes_api.rb
module Api
  class TunesApi < Grape::API
    resource :comments do
      get do
        user = User.find_by_id(params[:user_id])
        from = params[:start]
        to = params[:stop]

        comments = user.comments.where(created_at: from..to)
        comments.map{|c| c.created_at.to_i}.inject(Hash.new(0)){|h, tm| h[tm] += 1; h}.to_json
      end
    end
  end
end
```

## まとめ
heatmap のデータフォーマットに合うように json を返してしまえば簡単に GitHub風のカレンダーを表示できた。
ただ、月表示をすると月同士の隙間ができてしまうのと、item が無いセルの色を変えようとすると既存のオプション(legendColors)では思うようにいかなかったので、直接 css を再定義したりした。(今後の改善に期待)

応用すればいろんなところで蓄積データの見える化に使えそう。
sshの暗号化はRSAでいいのか？


```shell
ssh-keygen -t rsa
```

で生成されるkeyはデフォルトで2048bitです(最小が768bit)。
この暗号はどのくらい強力なのか？
ざっくりいって、この暗号はいつまで使えるのか？
という事を調べます。

## 免責
以下の解析は非常にざっくりしているので参考程度に考えてください。
私は一切の責任を負えません。

## RSA Factoring Challenge

[RSA Factoring Challenge(Wikipadia)](http://en.wikipedia.org/wiki/RSA_Factoring_Challenge)にRSA secuirty (株)の実施した
RSAの暗号解読チャレンジの記録が載っています。このチャレンジは1991から2007まで開催されたそうです。

ここの表から単にkeyの長さ(bit)と解読された年を切り出します：

```:rsa.dat
330 1991
364 1992
397 1993
426 1994
426 1996
463 1999
496 2004
512 1999
563 2009
576 2003
596 2010
629 2010
640 2005
663 2005
696 2013
704 2012
768 2009
```

これを元に外挿する事で、2048bitのキーが解読される年代を見積ろうという記事です。
512や768のような特徴的な長さと他のキーで年代がすこしずれる(under estimate)のと、
これらの計算は限界を攻めているので、実際にkeyがあぶなくなるまでにLagがある(over estimate)が打ち消すと思って
特になにも考えす、最小二乗法でfitします(いいわけ)。

```gnuplot
set xlabel "Year"
set ylabel "Digits"

a = 15 # 目測で見積り
b = 300 - 15*1990
f(x) = a*x + b
fit f(x) "rsa.dat" u 2:1 via a,b

set term png
set output "rsa.png"

plot "rsa.dat" u 2:1 t "", f(x) t ""
print (2048 - b) / a
```
![rsa.png](https://qiita-image-store.s3.amazonaws.com/0/30426/5e438f5f-5b7a-822c-0f06-501c61bac52d.png)

この結果2048の長さのkeyのセキュリティが問題になるのは2100年頃となります。
標準偏差で、`a = 15.03 +/- 1.9`, `b = -29550 +/- 3750` となるので、`2100 +/- 10`くらいです。

なにか技術革新がないと80年は大丈夫ですね。
すぐ作ってすぐ壊せるFTPサーバーを立てる (Pythonで)

pythonに[pyftpdlib] (https://code.google.com/p/pyftpdlib/)という便利そうなFTPサーバーライブラリがあったので使ってみました。

pyftpdlibをインストールする
---------------------------
[pyftpdlibのサイト] (https://code.google.com/p/pyftpdlib/)からダウンロードできるようですが・・・
pipを使うとコマンド1つでインストールできるのでおすすめ。

```
pip install pyftpdlib
```

ついでに、[PyCharm] (http://www.jetbrains.com/pycharm/)を使えばGUIを使ってpipの実行ができます！（宣伝）
![rapture_20140323171404.png](https://qiita-image-store.s3.amazonaws.com/0/10713/f33258a0-ff20-ce7a-b139-91792f7e572b.png)

簡単なFTPサーバーを作る
-----------------------
基本は[公式サイトのクイックスタート] (https://code.google.com/p/pyftpdlib/)の通り。

自分はWindows環境でやりましたが、他のOSでもできると思います

```py
# -*- coding: utf8 -*-
import pyftpdlib.authorizers
import pyftpdlib.handlers
import pyftpdlib.servers

# 認証ユーザーを作る
authorizer = pyftpdlib.authorizers.DummyAuthorizer()
authorizer.add_user('user', 'password', 'C:\\Users\\username\\Pictures', perm='elradfmw')

# 個々の接続を管理するハンドラーを作る
handler = pyftpdlib.handlers.FTPHandler
handler.authorizer = authorizer

# FTPサーバーを立ち上げる
server = pyftpdlib.servers.FTPServer(("127.0.0.1", 21), handler)
server.serve_forever()
```

この例だと、C:\Users\username\Picturesがルート・ディレクトリとなったFTPサーバーが立ち上がります。

ユーザー名：user, パスワード:password
でログインできます。

試しに、WinSCPでつないでみると、ちゃんと画像フォルダの中身が表示されました。

その他いろいろな拡張
---------------------
まだ自分は見ていませんが、[公式サイトのチュートリアル] (https://code.google.com/p/pyftpdlib/wiki/Tutorial#4.0_-_Customizing_your_FTP_server)に様々な例が載っているようです。
Mac OS Xのバージョンがあげたらhomebrewでnpmが使えなくなる問題の解消方法


LionからMarvericksにバージョンをあげたら、coffeescriptが動かなくなっていた。再度coffee scriptをinstallしようとnpmを叩いたが、no such file or directoryと言われた。npmをインストールしようとして、brew install nodeしたが、下記のようなエラーが出た。

```node: Beginning with 0.8.0, this recipe now comes with npm.
It appears you already have npm installed at /usr/local/lib/node_modules/npm.
To use the npm that comes with this recipe, first uninstall npm with
`npm uninstall npm -g`, then run this command again.

If you would like to keep your installation of npm instead of
using the one provided with homebrew, install the formula with
the `--without-npm` option.
Error: An unsatisfied requirement failed this build.
```下記の通り、問題の原因になっているっぽいディレクトリを削除したらうまく通るようになった。

```
rm -fr /usr/local/lib/nodemodules
brew install node
npm install coffee-script -g
```


あと、pathに下記を追加した。

```/usr/local/lib/node_modules/coffee-script/bin
```

##参考

http://stackoverflow.com/questions/21223168/brew-install-node-error
JavaScriptでJavaFXを動かす


Java7でもできるかと思いますが、Java8からはJavaFXが標準ライブラリとして含まれるようになりましたので、新しいJavaScriptのライブラリのNashornと共に動かしてみます。

##まずはNetBeansの最新版を入手
※もう環境がある人は読み飛ばしてください。


私はEclipse派なので、最低限の環境のNetBeans8.0をインストールします。
https://netbeans.org/downloads/?pagelang=ja
こちらから、Java SE版を入手してインストールしてください。


##JDK8のインストール

略・・・

##プロジェクトの構成
適当なJavaプロジェクトを作成し、適当なパッケージを作成してください。今回の例ではsampleパッケージです。

![スクリーンショット 2014-03-23 16.17.34.png](https://qiita-image-store.s3.amazonaws.com/0/3057/893dd97d-2d4b-3944-8f0d-14e8447376d8.png "スクリーンショット 2014-03-23 16.17.34.png")

## Javaプログラム
Java側はJavaFXのブートストラップとして実行します。JavaFXアプリケーションの起動、スクリプトエンジンの取得、実行がメインです。

```java:Sample.java
package sample;

import java.io.InputStream;
import java.io.InputStreamReader;
import javafx.application.Application;
import javafx.stage.Stage;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Sample extends Application {

    public static void main(String[] args) throws Exception {
        launch();
    }

    @Override
    public void start(Stage stage) throws Exception {
        //スクリプトエンジンを取得
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");

        //ステージをバインディングする設定
        Bindings bindings = engine.createBindings();
        bindings.put("stage", stage);

        //スクリプトを読み込んで取得
        InputStream in = Sample.class.getResourceAsStream("fx.js");
        InputStreamReader reader = new InputStreamReader(in, "UTF-8");
        engine.eval(reader, bindings);

        //ステージを表示
        stage.show();
    }
}
```

今回は意図的にステージの表示をJava側で行っています。

##JavaScriptプログラム
Javaのソースと同じところにfx.jsというファイル名でJavaScriptファイルを配置します。UIの操作はここで行います。

```js:fx.js
//ルートのコンテナ作成
var root = new javafx.scene.layout.VBox();

//シーンを作成
var scene = new javafx.scene.Scene(root, 300, 300);

//ラベルを作成
var label = new javafx.scene.control.Label();
root.children.add(label);

//ボタンを作成
var button = new javafx.scene.control.Button();
root.children.add(button);
button.text = "Hello World!!";

//ボタンにイベントハンドラを設定
var count = 0;
button.onAction = function(e){
    label.text = String(++count);
};

//ステージのセットアップ
stage.scene = scene;
stage.title = "Hello World Sample";
```

特筆すべきなのは、onActionに関数を渡せるというところですね。EventHandlerのインスタンスを渡す必要あるのかなと思いましたが、関数オブジェクトでOKでした。FXML内でJavaScriptを書けますので、サポートされているのでしょう。

##動かしてみる
ボタンをクリックすると、カウントアップされます。
![スクリーンショット 2014-03-23 16.26.30.png](https://qiita-image-store.s3.amazonaws.com/0/3057/3aeb151f-9ebe-a9dd-699b-d050e03052f7.png "スクリーンショット 2014-03-23 16.26.30.png")

##最後に
JavaFXとJavaScriptの親和性が思った以上に高いので、HaxeやJSX等と組み合わせると面白いかもしれません。
Docker で apt-cacher-ngを使ってcontainer作成を高速化

Dockerでcontainerを頻繁に更新するときに、毎回apt-getがネットワークに取りに行くと遅いので、Docker host側でキャッシュする方法。

1. Docker host 側で
`$ apt-get install apt-cacher-ng`


2. /etc/apt-cacher-ng/acng.conf に次の行を追加　（172.17.42.1 はDocker host側のネットワークインターフェース docker0 のモノ）
`BindAddress: localhost 172.17.42.1`

3. Docker Containerを作るときのDockerfileに次の行を追加
```RUN apt-get install -y apt-cacher-ng
RUN echo 'Acquire::http::Proxy "http://172.17.42.1:3142";' > /etc/apt/apt.conf.d/02proxy.conf
```

4. Cacheされているかどうかは、docker host側で次で確認できる。
`$cat /var/log/apt-cacher-ng/apt-cacher.log`
RethinkDB vs MongoDB 性能比較


最近 [RethinkDB](http://rethinkdb.com/) がいいらしいと聞いたので、MongoDB と性能面で比べてみました。機能的な比較は公式サイトの [Technical comparison: RethinkDB and MongoDB](http://rethinkdb.com/docs/comparison-tables/) を参照してください。

**重要: RethinkDB はまだベータ扱いなので、開発中のものとして見てください。正式リリースまでに性能が変化する可能性もあります。**

## テスト
テスト環境は CoreOS on VMware Fusion で、それぞれ別の Docker コンテナで起動させました。バイナリは公式提供されているものを使用。シングル構成でクラスタリングはしていません。

* ベースコンテナ: ubuntu:saucy
* Linux Kernel: 3.13.6+
* RethinkDB: 1.11.3
* MongoDB: 2.4.9

クライアントは Go 1.2.1 で書いて、CoreOS 上で動かしました（[ソースコード](https://gist.github.com/yosisa/9719010)）。[MongoDB のドキュメント](http://docs.mongodb.org/manual/tutorial/aggregation-zip-code-data-set/)で使われている zips.json にある 29469 件の zip コードの JSON を投入するのにかかった時間と、読み込みにかかった時間を計測しました。

## 結果
|           | Write      | Read      |
|-----------|-----------:|----------:|
| RethinkDB | 19.914507s | 0.928185s |
| MongoDB   |  5.040683s | 0.167371s |

圧倒的ではないか、MongoDB は。

というわけで、単純に読み書き性能を期待するなら MongoDB を選ぶべきです。

ただ、RethinkDB には面白い機能がいくつかあって、テーブルの join ができたり、ReQL を組み立てることでサーバサイドでデータを変形したり、sharding や replication を簡単に構成できたりします。MongoDB のように最初にでっかいファイルを allocate することも、3台以上の奇数台じゃないと replication をうまく構成できないなんてこともありません。

そういうところに魅力を感じるのであれば、RethinkDB を試してみるのもいいでしょう。とはいえ、自動フェイルオーバーはまだできないんですけどね...。

今後の RethinkDB に期待ですね！

## 参考
* https://github.com/rethinkdb/rethinkdb/issues/1777
* https://github.com/dancannon/gorethink/issues/57
* [自動フェイルオーバーの管理 issue](https://github.com/rethinkdb/rethinkdb/issues/223)
CMYKカラーを全て書き出す

Photoshop「カラー設定」で色域を書き出したいCMYKプロファイルを選択しておき、以下を実行

```javascript:lab2cmyk.jsx

var myFile = new File('~/Desktop/labcmyk.txt');
myFile.open("w");
myFile.encoding='BINARY';



myColor = new SolidColor;
for (var myL = 0; myL<=100;myL++){
    for (var myA = -128 ; myA <=127;myA++){
        for (var myB = -128 ; myB <=127;myB++){
        myColor.lab.l = myL;
        myColor.lab.a = myA;
        myColor.lab.b = myB;
        myC = Math.round(myColor.cmyk.cyan);
        myM = Math.round(myColor.cmyk.magenta);
        myY = Math.round(myColor.cmyk.yellow);
        myK = Math.round(myColor.cmyk.black);
        
        myWrite = myC + '\t' + myM + '\t' + myY +'\t' + myK
        myFile.writeln(myWrite);
        }
    }
}
myFile.close();
```

Labスペース全てでCMYK値が書き出される。
sortし、uniqで同一のCMYK値を削除→色域外が削除される。
CMYKを0-100で単純に描画しても意味が無い…CMYK400%はありえない…のでLabから削り取る。ただし面積比率は評価していない。
処理したテキストを読み込んでPhotoshopで描画

```js:CMYKALLColors.jsx
app.preferences.rulerUnits = Units.PIXELS;
var myDoc = app.documents.add(872,872,72,"CMYK ALL Colors",NewDocumentMode.CMYK);


var myFile = new File('~/Desktop/labcmyksortuniq.txt');
myFile.open('r');
var myText = myFile.readln();

myX =0;
myY =0;
myColor=new SolidColor();
while ( myText !=''){
    var myColorText=myText.split ("\t");
    
    myColor.cmyk.cyan=myColorText[0];
    myColor.cmyk.magenta=myColorText[1];
    myColor.cmyk.yellow=myColorText[2];
    myColor.cmyk.black=myColorText[3];
    
  myDoc.selection.select([[myX,myY],[myX+1,myY],[myX+1,myY+1],[myX,myY+1]]);
  myDoc.selection.fill(myColor,ColorBlendMode.NORMAL,100,false);
myX=myX+1;
if (myX >= 873){
    myY=myY+1;
    myX=0;
    }


myText = myFile.readln();
}
```
ちょう遅い。selection&fillが遅い。CCだとさらに遅いので、CS6で実行して5時間以内（i7)

あまりに遅いのでIllustratorで描画して書き出すことにした

```js:CMYKALLCOLORSAI.jsx

var myDoc = activeDocument;
var myFile = new File('~/Desktop/labcmyksortuniq.txt');
myFile.open('r');
var myText = myFile.readln();

myX =0;
myY =0;
function setColor(c,m,y,k){
var myColor=new CMYKColor();
myColor.cyan=c;
myColor.magenta=m;
myColor.yellow=y;
myColor.black=k;
return myColor;
}

while ( myText !=''){
    var myColorText=myText.split ('\t');
    

    myColor=setColor(myColorText[0],myColorText[1],myColorText[2],myColorText[3]);
    
    myPath=myDoc.pathItems.rectangle(myY,myX,1,1);
    myPath.filled=true;
    myPath.stroked =false;
    myPath.fillColor=myColor;
myX=myX+1;
if (myX >= 850){
   myY=myY-1;
   myX=0;
    }


myText = myFile.readln();
}
```
ssh接続のまとめ

毎回忘れるので、まとめます
client側
```bash
$ cd ~/.ssh
$ ssh-keygen -f client_rsa -t rsa
$ scp ~/.ssh/client_rsa.pub admin@192.168.1.100:~
$ ssh admin@192.168.1.100
```

server側
```bash
[admin@centos ~]$ cd ~
[admin@centos ~]$ mkdir .ssh
[admin@centos ~]$ chmod 700 .ssh
[admin@centos ~]$ mv ~/client_rsa.pub ~/.ssh
[admin@centos ~]$ cat ~/.ssh/client_rsa.pub >> authorized_keys
[admin@centos ~]$ chmod 600 authorized_keys
```

client側
```bash
$ ssh -i ~/.ssh/client_rsa admin@192.168.1.100
```

server側
```bash
[root@centos ~]# vi /etc/ssh/sshd_config
PasswordAuthentication yes
↓
PasswordAuthentication no
[root@centos ~]# service sshd restart
```

可能のエラー：
```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```
対策：knownhostでサーバの既存接続を削除したら大丈夫


-------------------------------------
@termoshtt さんのコメントにより、ssh-copy-idで簡単にできます。

まずはclient側でssh-copy-id設定（mac利用者なら）
```
$ brew install ssh-copy-id
```

client側でキー生成とssh-copy-idを利用してserver 側にコピー
```
$ ssh-keygen -t rsa
$ ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<host>
```
それで簡単に終わります
静的サイトジェネレーター「roots」




## 静的サイトジェネレータ
新しくブログを作るにあたって、静的サイトジェネレータなるものを使うことにした。[jekyll](http://jekyllrb.com/)はいろんな人が使ってるし、1番有名な気がしてる。

他には、[middleman](http://middlemanapp.com/)も日本語の情報が多くて良さそう。
でも、なんとなくgemに頼りたくなかったので（普段Sass使ってるけど）、[roots](http://roots.cx/)というものを使った。


## roots
rootsはnode製の静的サイトジェネレーター。

公式サイト: [roots | where it all begins](http://roots.cx)

npmでインストールできる。

```
$ npm install -g roots
```

npmが入っていない人は[ここ](http://nodejs.org/download/)からnode.jsをインストールする。

```
$ roots new project-name
```

でプロジェクトのテンプレートを作成できる。

ブログのテンプレートは

```
$ roots new blog-name --blog
```

で、作成。

***

  rootsは、デフォルトで[Jade](http://jade-lang.com/)、[Stylus](http://learnboost.github.io/stylus/)、[CoffeeScript](coffeescript.org/)が使える。ファイルのコンパイルは

```
$ roots compile
```

Jade, Stylus, CoffeeScriptをコンパイルして/publicに出力される。ついでに、HTML, CSS, JavaScriptのMinifyもしてくれる。また、

```
$ roots watch
```

で、ファイルを監視して保存時に自動的にコンパイルできる。ローカルサーバーがデフォルトでポート1111番で起動する。watchではMinifyはされない。watchしてると、保存時に自動でブラウザがリロードするのが気持ちいい。

他にも、[heroku toolbelt](https://toolbelt.heroku.com/)をインストールしていると、

```
$ roots deploy
```

で、一発でherokuにデプロイできる。


また、rootsでは、[axis](http://roots.cx/axis/)というStylusのMixin集が使える。normalize.cssをインクルードできたり、gridも設定できる。

```stylus
grid()

column-width = 60px
gutter-width = 20px
columns = 12
total-width = 100%

  .main
     column(9)

  .sidebar
     column(3)
```

columnsでgridの分割数を設定して、column()で使える。他にも、ベンダープレフィックスが自動で付けれたり、ボタンとか通知とかのUIパーツもある。

rootsは、[公式サイト](http://roots.cx)に[チュートリアル動画](http://www.youtube.com/watch?v=47Qv6djtKlY&feature=youtu.be)のリンクがあるので、見てみるといいかも。

## 最後に
rootsを使って[ブログを作った](http://blog.morishitter.com)。簡単なサイトを作るのにはすごく便利で、どれか使えるようにしておくといい気がする。
WordpressのようなCMSとは違い、シンプルでカスタマイズしやすかった。
tomcatのManagerGUIを利用するための設定

```diff
--- tomcat-users.xml.back	2014-03-23 01:08:04.000000000 +0900
+++ tomcat-users.xml	2014-03-23 01:09:27.000000000 +0900
@@ -33,4 +33,6 @@
   <user username="both" password="tomcat" roles="tomcat,role1"/>
   <user username="role1" password="tomcat" roles="role1"/>
 -->
+  <role rolename="manager-gui"/>
+  <user username="< username >" password="< password >" roles="manager-gui"/>
 </tomcat-users>
```
CygwinでMSBuildを実行する

Cygwinの文字コードをUTF-8にしているとMSBuildの出力がShift-JISなので文字化けしてしまいます。

    $ "/cygdrive/c/Program Files (x86)/MSBuild/12.0/Bin/MSBuild.exe" /version
    Microsoft (R) Build Engine ▒o▒[▒W▒▒▒▒ 4.0.30319.18408
    [Microsoft .NET Framework▒A▒o▒[▒W▒▒▒▒ 4.0.30319.18444]
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    4.0.30319.18408

これは出力をnkfを使ってUTF-8に変換すると解決できます。

nkfのインストール手順は以下のとおり。

1. Cygwinで適当なディレクトリを作成して移動する。
 
    $ mkdir nkf-build
    $ cd nkf-build

2. [nkf](http://sourceforge.jp/projects/nkf/releases/)をダウンロードして1のディレクトリに保存する。
3. 解凍する。

    $ tar -zxvf nkf-2.1.3.tar.gz

4. インストールする。

    $ cd nkf-2.1.3
    $ make
    $ make install

5. インストールできたか確認する。

    $ nkf --version

あとはMSBuildの出力をnkfに通せば文字化けせずに出力されます。

    $ "/cygdrive/c/Program Files (x86)/MSBuild/12.0/Bin/MSBuild.exe" /version | nkf -w
    Microsoft (R) Build Engine バージョン 4.0.30319.18408
    [Microsoft .NET Framework、バージョン 4.0.30319.18444]
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    4.0.30319.18408
vfsStream を使って PHP のファイル書き込み、読み込みをテストする

PHP のファイルの読み書きをユニットテストする方法を探していたところ `vfsStream` という仮想のファイルシステムを提供してくれるツールを見つけました。

https://github.com/mikey179/vfsStream

例えば下記のようなファイルの内容を1行ずつ読み取って配列に格納するメソッド `read` をもった `Hoge` クラスをテストの対象とします。

```Hoge.php
<?php

class Hoge{
  public function read($filename){
    $fh = fopen($filename, 'r');
    $terms = array();
    while($term = fgets($fh, 1024)){
      $terms[] = $term;
    }   
    return $terms;
  }
}
```

そして下記は `Hoge` クラスの `read` メソッドを、vfsStream を使ってテストする PHPUnit のテストコードです。なお、vfsStream は composer でインストールしています。

```HogeTest.php
<?php

require 'Hoge.php';
require 'vendor/autoload.php';

use org\bovigo\vfs\vfsStream;

class HogeTest extends PHPUnit_Framework_TestCase{
  public function testRead(){

    /** 
     * 仮想のファイルを生成する。
     */
    vfsStream::setup();
    $path = vfsStream::url('root/sample.txt');
    $fh = fopen($path, 'w');
    fwrite($fh, '東京' . PHP_EOL . '埼玉' . PHP_EOL . '大阪' . PHP_EOL);
    fclose($fh);

    /** 
     * 仮想のファイルを使って Hoge クラスの
     * read メソッドが正しく動作するか確かめる。
     */
    $hoge = new Hoge();
    $this->assertEquals(
      array('東京' . PHP_EOL, '埼玉' . PHP_EOL, '大阪' . PHP_EOL),
      $hoge->read($path)
    );  
  }
}
```

仮想のファイルを作り、任意のテキストを書き込んでおき、それを想定通りに読み込めるかをテストすることができました。書き込みをテストしたい場合はこの手順を逆にして、最初に仮想ファイルに対して書き込みのメソッドを実行して、その仮想ファイルの中身を検証すれば書き込みのテストもできますね。
ActiveRecordのbefore_saveでうっかり

問題

ActiveRecordの `before_save` 、`before_update` コールバックに、クライアントコードが直接操作しない属性を設定する処理を書くような機会が結構あると思います。
そこで、次のようなコードを書くわけですが、このコードは意図したどおりに動作しません。理由がすぐにわかるでしょうか？

```rb
class Item < ActiveRecord::Base

  before_save :prepare_save # This callback doesn't validate

  def prepare_save
    if hoge_check_ok?
      self.checked = true
    else
      self.checked = false
    end
  end
end
```

解答

- `prepare_save` メソッド内で `else` を通ったとき、`self.checked = false` の評価値は `false`
- `prepare_save` メソッドの戻り値が `false`
- `before_save` で指定したコールバックの戻り値が `false` なので `save` がキャンセルされて DB に保存されない！

教訓

`before_xxx` コールバックの最後では `self` か `true` を返そう。

```rb
  def prepare_save
    if hoge_check_ok?
      self.checked = true
    else
      self.checked = false
    end
    self
  end
```
rakeでcoco2dx-3.0rc0用のstaticライブラリを作成する

cocos2d-xのsetup.pyでプロジェクトを作成すると便利なんですが、プロジェクトに全モジュールが階層的に組み込まれてしまい、Xcodeでのリビルドが非常に重くなるので、普段弄ることが少ないcocos2d_libs.xcodeprojはstaticライブラリ化するのが快適なビルド環境を作るのに一番手っ取り早いです。

cocos2d_libs.xcodeprojはたくさんのターゲットを持っているので、若干ライブラリを作成するのが面倒なこともあり、なるべくプロジェクト本体に手を入れずにビルドするために、次のようなRakefileを用意しました。

```lang:Rakefile
PROJECT_PATH = "../cocos2d/build/cocos2d_libs.xcodeproj"
TARGET_NAME="'build all libs iOS'"
OUTPUT_DEBUG="tmp/iphonesimulator"
OUTPUT_RELEASE="tmp/iphoneos"
OUTPUT_LIB="../lib"

desc "静的ライブラリをビルドします"
task "lib" do
	sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphonesimulator7.1 -target #{TARGET_NAME} TARGET_BUILD_DIR=../../build/#{OUTPUT_DEBUG} BUILT_PRODUCTS_DIR=../../build/#{OUTPUT_DEBUG} clean build"

	sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphoneos7.1 -target #{TARGET_NAME} TARGET_BUILD_DIR=../../build/#{OUTPUT_RELEASE} BUILT_PRODUCTS_DIR=../../build/#{OUTPUT_RELEASE} clean build"
end

desc "lipoコマンドで各デバイス向けの静的ライブラリをひとつのバイナリにします"
task "lipo" do
	
	Dir.glob("#{OUTPUT_RELEASE}/*"){|path|
		p path
		file = File.basename(path)

		sh "lipo '#{OUTPUT_DEBUG}/#{file}' '#{OUTPUT_RELEASE}/#{file}' -create -output '#{OUTPUT_LIB}/#{file}'"
	}
end
```

実機でもシミュレーターでも確認できるように、各デバイスターゲット向けにstaticライブラリでビルドして、lipoコマンドで１ファイルにまとめておきます。

出力先などは各々の環境に合わせて変更してください。
上記はトップディレクトリにビルド環境用にbuildディレクトリとstaticライブラリの出力先としてlibディレクトリを作成してます。
Rakefileはbuildディレクトリの下において、このディレクトリ内でrakeを実行しています。

*補足*
cocos2d_libsプロジェクトには少しだけ前処理を加えています。
[Xcode5.1でarm64を外す方法](http://qiita.com/ux_design_tokyo/items/45943a836f8394836948)

多謝
DoxygenコメントをClangFormatに破壊されないようにする

ClangFormatではコメントも自動フォーマッティングの対象になるため、C++やObjective-CのコードにDoxygen形式でコメントを埋め込んでいる場合、Doxygenでドキュメントを生成した際にドキュメントが崩れてしまうことがあります。

例えば次のようなファイルがあったとします：

```cpp:Hoe.cpp
/**
 kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?
 */
Hoe::Fuga()
{
    ...
}
```

これを例えば次のようなコマンドで自動フォーマットすると、コメントが崩れてしまいます：

```sh
$ clang-format -style=Google Hoe.cpp
/**
 kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?
 kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?
 */
Hoe::Fuga() {
    ...
}
```

これを避けるためには、ClangFormatの`CommentPragmas`スタイルオプションを利用します。

例えばDoxygenコメントを「`/**`」で開始しているなら、例えば次のようにすればOKです：

```sh
$ clang-format -style="{ BasedOnStyle: Google, CommentPragmas: '\*' }" Hoe.cpp
/**
 kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?  kore wa daijoubu?
 */
Hoe::Fuga() {
    ...
}
```

`CommentPragmas`には「`/*`」の次に続く文字列にマッチする正規表現パターンを指定することに注意して下さい。
pgmagickをMac OS X 10.9にインストールする

##pgmagickってなに

<a href="https://pypi.python.org/pypi/pgmagick/" target="_blank">pgmagick</a>

pgmagickは、pythonで画像を加工するときに便利なパッケージです。
GraphicsMagickという画像加工ツールをラップしているようです。（ImageMagickでも動くみたいですけど試していません。）

##pgmagickのインストール

環境は

* Mac book Air 2012 mid
* OSは10.9.2
* Python 2.7.5

です

```
$ brew install graphicsmagick     # or imagemagick
$ brew install boost --with-thread-unsafe --build-from-source
$ pip install pgmagick
```

上記でインストールできるのですが、うまくインストール出来ませんでした。

###homebrewの設定

brew doctorでhomebrewの調子が悪くなっていないか確認して下さい。

###pip install pgmagickがうまく動かない

pip install pgmagickを実行すると、

```py
clang: error: unknown argument: '-mno-fused-madd
```

というエラーが表示されてしまいうまくインストールすることができませんでした。

環境変数をセットすると動くということで、環境変数をセットしてみたのですがこれもまた動かなかったので、stackoverflowの力を借りてインストールしました。

```
ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install pgmagick

```

<a href="http://stackoverflow.com/questions/22313407/clang-error-unknown-argument-mno-fused-madd-python-package-installation-fa" target="_blank">clang error: unknown argument: '-mno-fused-madd' (python package installation failure)</a>

###インストールに時間がかかる

brew install boost --with-thread-unsafe --build-from-source
のコマンドがめちゃくちゃ時間がかかるので、<strong>35分</strong>ぐらいかかります。

---

##動かしてみよう

```py
>>> from pgmagick import gminfo
>>> gminfo.library
'GraphicsMagick'    # or 'ImageMagick'
>>> gminfo.version
'1.3.x'
>>>
```

バージョンなどが表示されればOK。

サンプル

```py
>>> from pgmagick import Image, FilterTypes
>>> im = Image('input.jpg')
>>> im.quality(100)
>>> im.filterType(FilterTypes.SincFilter)
>>> im.scale('100x100')
>>> im.sharpen(1.0)
>>> im.write('output.jpg')
```
フォルダ上の画像を100px(縦か横の長い方どちらか)に縮小します。

![output.jpg](https://qiita-image-store.s3.amazonaws.com/0/39134/72fa71be-17f9-f16b-11d4-d75012d6aac9.jpeg)

100pxに縮小したサンプル画像。

---

##おわり

画像関連のものはたくさんありますが、比較的簡単かつ便利なので是非試してみてください。
注目のiBeacomなどの波に乗り遅れないために！iOSのBluetooth開発を容易にするライブラリを書きました。

by @mixiappwchr　http://youtu.be/l0EUo7nGNDg




![index.jpg](https://qiita-image-store.s3.amazonaws.com/0/37731/a5eff6c0-c832-6831-702b-97895571443d.jpeg)

最近iBeacomなどBluetooth LE周りの技術に感心が集まっており、iOSでの開発も活発になってきていると思います。

iOSではCoreBluetoothをはじめとしたBluetoothを扱うためのフレームワークが複数存在し、用途別に選べるくらい充実しています。

[iOSでBluetoohLE アプリを作るための基礎知識]
(http://qiita.com/appwatcher/items/5c4585f61fc0a0d6269b)

その中でも一番低レベルの部分まで扱うCoreBluetoothフレームワークは本格的にBluetooth LEを扱うにはさけては通れません。

しかし、このフレームワークはdelegateの嵐で扱うのに一苦労です。
そこで、もっと簡単に扱えるようにBlocksで処理がかけるようし、さらにもう少し簡単に扱えるようにしたライブラリを書きました。
Beaconとして動かすクラスやCLLocationManagerによるBeaconモニタリングクラスのラッパーも用意しています。

https://github.com/nyankichi820/MYBluetoothBlocks

サンプルプロジェクト動画

![スクリーンショット 2014-03-23 15.25.25_120.png](https://qiita-image-store.s3.amazonaws.com/0/37731/ec63880b-ed86-7b19-287c-ba0b6327cf82.png)


http://youtu.be/l0EUo7nGNDg





結構癖のあるフレームワークなのでこれでBluetooth開発に弾みを付けてもらえればと思います。


##### appwchr post
----

[iOSの開発をする上で絶対に使うべき！外せない！webサービス、開発ツール集](http://qiita.com/appwatcher/items/07a3babcb9b6cefb307e)

[iOSでこんなアプリ,こんな機能を作りたかったらこれを見ろ！作りたいアプリに対応するクラス、フレームワーク、ライブラリのまとめ！]
(http://qiita.com/appwatcher/items/b02255026a3ee6d95142)

[注目のiBeacomなどの波に乗り遅れないために！iOSのBluetooth開発を容易にするライブラリを書きました。]
(http://qiita.com/appwatcher/items/7491beffd7260b713542)

[まだまだあった！iOSの開発を劇的に改善する最新のwebサービス、開発ツール集１]
(http://qiita.com/appwatcher/items/f0024fe2ac34da345f04)

[さらに快適なアプリ開発を！iOSの開発をもっと劇的に改善する最新のwebサービス、開発ツール集2]
(http://qiita.com/appwatcher/items/c15d7311e71b4c2b77f1)

[スパゲッティから脱出！iOS開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介]
(http://qiita.com/appwatcher/items/259e8d13fff0547e90af)
バッチファイルでgrepっぽいことをする

ひとつ前にメールに添付されたPDFをテキスト化する方法について書いたが、そのテキストファイルを検索する方法について考える。

もちろんCygwinを入れてるのだからgrepで探せばいいのだが、ここはあえてバッチファイルで試してみる。

```bat:search.bat
@set /p keyword="Enter KEYWORD:"
if "%keyword%"=="q" exit
findstr %keyword% *.txt > temp
chcp 65001
cls
@type temp
@set /p answer="[Q]uit [O]pen:"
if "%answer%"=="o" notepad temp
if "%answer%"=="q" exit
@search.bat
```

ポイントは幾つかあって

+ set /pでキーワードを入力
+ grep相当の機能を持つfindstrを使う
+ chcpでUTF-8も表示できるようにする
+ clsして画面をクリア
+ メニュー表示し、qを入力すると終了。oを入力すると検索結果をコピペしやすいようメモ帳で開く。
+ 自分自身を呼び出し、繰り返し検索できるようにする

と、最近やってる姑息な手法を多く盛り込んでる。

なお、このバッチファイルは直接クリックするのではなく、ショートカットを作っておいて、そのショートカットの方を右クリックしてプロパティからフォントをMSゴシックに設定しておくと日本語も表示できる。
Python 3 で日本語ファイル名が入った zip ファイルを扱う


zip ファイルは最近の仕様では UTF-8 でファイル名を格納できるのですが、多くの場合レガシーな環境依存文字コードでファイル名が格納された形式が使われています。日本語の場合は Windows に合わせて Shift-JIS (cp932) が使われることが多いです。

Python 2 では zipfile モジュールが返すファイル名はバイト文字列だったのでそのまま cp932 のファイル名が返ってきたのですが、 Python 3 では文字列が Unicode に統一されたため、 zip ファイルを読み込むとファイル名がデコードされて文字列になって返ってきます。
が、もちろん日本語の慣習がデフォルトの挙動になってるわけではないので、このままでは文字化けしてしまいます。

Python 3.4 の zipfile モジュールを読むと次のようになっていました。

```python
            if flags & 0x800:
                # UTF-8 file names extension
                filename = filename.decode('utf-8')
            else:
                # Historical ZIP filename encoding
                filename = filename.decode('cp437')
```

cp932 でエンコードされた文字列をデコードして、 UnicodeDecodeError が起きないでしょうか。

```python
>>> len(bytes(range(256)).decode('cp437'))
256
```

cp437 は全てのバイトを1文字に1対1でデコードするようです。
ということで、一旦 cp437 でエンコードしなおしてから改めて cp932 でデコードすれば良さそうです。

```python
import zipfile
zf = zipfile.ZipFile('foo.zip')
for name in zf.namelist():
    print(name.encode('cp437').decode('cp932')
```
background-size: coverの勘所

background-size: coverを使った背景画像を拡大縮小して背景を覆う方法は、スクロールが生じるページだと下部に背景色の帯が生じることがある。

#修正方法
bodyに指定するとこれが起きなくなる。

```lang:filename
body {
	width: 100%;
	height: 100%;
	background: url(背景画像のパス) left top no-repeat fixed;
	background-size: cover;
}
```

##【要注意】対応ブラウザはIE9以上
IE8以下に対応するときは、下記のような方法がある。

- [css3pie](http://css3pie.com/)を使ってハック
- jQueryプラグインの[jquery.backgroundSize.js](http://louisremi.github.com/jquery.backgroundSize.js/demo/)を使う
- 背景画像をimgタグに変換して、同じ位置に配置する方法（不具合多いらしい）
The directory ~/.emacs.d/server is unsafeの対処法

# 環境

```
This is GNU Emacs 24.3.1 (i386-mingw-nt6.1.7601)
 of 2013-03-17 on GNUPACK
```

# 現象

emacs用serverが立ち上がらず、`*init log*`に次のようなログが残る。

```
------- error log -------

 The directory `~/.emacs.d/server` is unsafe
```

# 対処法

`~/.emacs.d/server`ディレクトリの所有者を、ログインユーザーに変える。

# 参考
http://stackoverflow.com/questions/885793/emacs-error-when-calling-server-start
http://d.hatena.ne.jp/debiandebian/20101122/1290371677
StateモナドでBrainf*ckパーサ


まずBrainf*ckの各命令に対応した値コンストラクタを持つ代数的データ型を定義する。
単純に考えるとcommand.hsのようになるが、これだとJump,Backに対応する位置を持つ必要があるので評価器が複雑になってちょっと面倒だ。
そこで少し工夫してcommand1.hsのように一つのループをまとめて持つようにする。

```command.hs
data Cmd = Inc | Dec | PInc | PDec | Put | Get | Jump | Back
``` 
```command1.hs
data Cmd = Inc | Dec | PInc | PDec | Put | Get | Loop [Cmd]
```

これでBrainf*ckの各命令を代数的データ型で表せた。
Brainf*ckのプログラムは各命令の列、型でいえば[Cmd]で表すことにする。
Brainf*ckのプログラムをHaskellで表せるようになったので、肝心のパーサを考えよう。
まず型について考えると型は String -> [Cmd] になる。
ループ以外の命令は文字をパターンマッチして該当する命令を返せばよいが、ループは終わりまでプログラムをコンパイルし、その次の文字列からまたコンパイルする必要がある。
そうすると型は String -> ([Cmd], String) になる。
ここであることに気付くだろう。(まあ答えはタイトルにあるが...)
この型はそのまま State String [Cmd] じゃないか!!
そして必要なのは結果の[Cmd]だけなので作成したモナドにevalStateを適用すればよい。
まあそんなわけでStateモナドを使ったBrainf*ckパーサは以下のようになる。

```parse.hs
parseBf :: String -> [Cmd]
parseBf = evalState parseBf' where
    parseBf' :: State String [Cmd]
    parseBf' = do
        xs <- get
        if null xs
            then return []
            else do
                put $ tail xs
                case head xs of
                    '>' -> (:) <$> pure PInc <*> parseBf'
                    '<' -> (:) <$> pure PDec <*> parseBf'
                    '+' -> (:) <$> pure Inc  <*> parseBf'
                    '-' -> (:) <$> pure Dec  <*> parseBf'
                    '.' -> (:) <$> pure Put  <*> parseBf'
                    ',' -> (:) <$> pure Get  <*> parseBf'
                    '[' -> (:) <$> (Loop <$> parseBf') <*> parseBf'
                    ']' -> return []
                    _ -> parseBf'
```

#まとめ

###Stateモナド使い易い!!
###Stateモナド大好き!!
raspbianの起動プロセスを見てみる


Raspberry Pi(Model B)を買って早速raspbianを入れてみた。
色々入れてみるか高速化しようか迷う前に、とりあえず素の環境でbootchartで計測してみます。

bootchartはLinuxの起動プロセスを可視化するツールです。

## bootchartのインストール〜計測

### インストール
bootchartはapt-getでサクッと入れてしまいます。
`# apt-get install bootchart`

### bootchartの設定
Raspberry Pi起動時にbootchartが起動するように、起動パラメータを修正します。
init=に/sbin/bootchartdを指定します。bootchartdが一番最初に起動後に/sbin/initを起動してくれます。

```/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait init=/sbin/bootchartd
```

### 起動プロセス情報の取得
Raspberry Piを再起動し、起動プロセスが完了するまで放置します。
起動プロセス完了後に/var/log配下に起動プロセスの情報が入ったbootchart.tgzというファイルが生成されます。


## 起動プロセスの可視化
先ほどまでの作業で取得したbootchart.tgzは数値データで分かりずらいのでグラフ化します。

ここから先の作業はRaspberry Piである必要はありません。
※筆者はMBA上で作業しました。

### グラフ生成ツールの準備
公式サイトよりソースコード[bootchart-0.9.tar.bz2](http://prdownloads.sourceforge.net/bootchart/bootchart-0.9.tar.bz2)をダウンロードします。

bootchart-0.9.tar.bz2を展開したら、bootchart-0.9に移動しantでビルドします。
bootchart.jarが生成されているはずです。

```
$ tar xvf bootchart-0.9.tar.bz2
$ cd bootchart-0.9
$ ant
```

### グラフ生成
先ほど生成したbootchart.tgzとbootchart.jarを使用してグラフ画像を生成します。
下記コマンドでbootchart.pngというグラフ画像が生成されます。
`$ java -jar bootchart.jar bootchart.tgz`


## 生成された起動プロセスのグラフ
![bootchart.png](https://qiita-image-store.s3.amazonaws.com/0/13343/53ade1c1-f8ae-c511-54fe-bf39ee9748e6.png "bootchart.png")


グラフの見方は見たまんまです。
不要であっったり、ボトルネックとなってる処理は無いか確認したりします。
SQLビルダ「FluentPDO」を試してみた


PHPのSQLビルダライブラリ[FluentPDO](http://fluentpdo.com/)を試してみた。

## 試してみようと思った動機

いままで文字列操作でSQLを組み立ててたけど、
検索条件によってSQLを組み立てるときにスペースやコンマが抜けててシンタックスエラーになったり、

```php
$sql = 'select * from foo';
if ($condition) {
    $sql = 'where column = ?';
	// whereの前にスペースがなくてエラー！
}
```

IN句の組み立てがつらかったりした。

```php
$values = ['val1', 'val2', 'val3'];
$sql = 'select * from foo where column in (' . implode(',', array_fill(0, count($values), '?')) . ')';
// つらい！
```

世の中にはSQLビルダとかいう便利なものがあるらしいので、調べてみた。

## SQLビルダに求めるもの

- シンプルなシンタックス
- DBアクセスは外部から設定できること

いろいろ見た結果FluentPDOが要件を満たしていた。

## 使い方

[公式ドキュメント](http://fluentpdo.com/documentation.html)に詳しく書かれているのでそちらを見るのが早いけど、こんな感じで使える。

```php
$pdo = new PDO("mysql:dbname=fblog", "root", "password");
$fpdo = new FluentPDO($pdo);

$query = $fpdo->from('article')
              ->where('published_at > ?', $date)
              ->orderBy('published_at DESC')
              ->limit(5);
if ($user_id) {
    $query = $query->where('user_id', $user_id);
}
foreach ($query as $row) {
    echo "$row[title]\n";
}
```

## FluentPDOのいいところ

- DBアクセスをPDOに任せている
  - ライブラリ自体はSQLの組み立てに専念しているため、シンプルな構成になっている
- 呼び出し側のコードがシンプル

## FluentPDOのよくないところ

PHP 5.1から対応してるので、コードベースが古い。
なのでforkしていじってみた。

https://github.com/okonomi/fluentpdo/tree/modernize

- PSR準拠
- namespace化、autoload対応
- short array syntax使用

## まとめ

やり過ぎない感じで良いライブラリだと感じた。
今度実戦投入してみようと思う。
UITextViewでフォーカスが外れた時キーボードを隠す

簡単なことのようだけどよく忘れるのでメモ。
UITextFieldと同じく、フォーカスが外れたときにキーボードは自動でかくしてくれる。
しかし「入力完了」の判定は「改行」ボタンを「完了」にするか、
他に「入力完了」ボタンなどを設置してそこに処理を書く必要があるみたい。

//キーボードを隠すとき
`[_TextView resignFirstResponder];`

//なお、逆に出したいとき
`[_TextView becomeFirstResponder];`
ALAssetsLibrary を触るときの権限取得を事前に確認する


## ちょっと不便

`ALAssetsLibrary` を触るときにはユーザーに AssetsLibary へのアクセスを許可してもらわないといけません。個人的には先にアクセス許可の伺いを立ててからその結果に応じてアプリとしての振る舞いを切り分けたいと思います。しかし、`ALAssetsLibary` にはそのようなメソッドは提供されていません。似たようなアクセス許可を得るものには `ACAccountStore` がありますが、こちらはこのようなメソッドがあり結果に応じて振り分け可能になっています。

```Objective-C
- (void)requestAccessToAccountsWithType:(ACAccountType *)accountType options:(NSDictionary *)options completion:(ACAccountStoreRequestAccessCompletionHandler)completion
```

[ACAccountStore Class Reference](https://developer.apple.com/library/ios/documentation/Accounts/Reference/ACAccountStoreClassRef/ACAccountStore.html)

## カテゴリメソッドを書いてみた

ALAssetsLibrary でも同様の振る舞いができるようなカテゴリメソッドを書いてみました。

<script src="https://gist.github.com/griffin-stewie/9705034.js"></script>

[Category method to get permission before using ALA ...](https://gist.github.com/9705034)

### 使用例

```objc
- (void)viewDidLoad
{
    [super viewDidLoad];

    [ALAssetsLibrary csn_requestAccessToAssetsLibraryWithCompletionBlock:^(BOOL granted, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if (granted && error == nil) {
                UIImagePickerController *picker = [[UIImagePickerController alloc] init];
                [self presentViewController:picker animated:YES completion:NULL];
            } else {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Needs Permission" message:nil delegate:nil cancelButtonTitle:@"close" otherButtonTitles:nil];
                [alert show];
            }
        });
    }];
}
```

エラー処理は適当に書いていますがこれで事前にアクセス権を確認したのちに任意の処理にすすめられます。

## 実装のポイント

アクセス許可のアラートは実際に ALAssetsLibrary に触らないと出ません。ですので、`- (void)enumerateGroupsWithTypes:(ALAssetsGroupType)types usingBlock:(ALAssetsLibraryGroupsEnumerationResultsBlock)enumerationBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock` で触ってしまいます。アラートを出してもらうのが目的なので得られた ALAssetsGroup には何もせずに即座に *stop に YES を代入して enumeration を止めつつ呼び出し元にコールバックします。

ユーザーが拒否した場合には failureBlock が呼ばれるのでそこで呼び出し元にコールバックします。

ハマったのが、この enumeration は `NSArray` の enumeration と違い *stop に YES を代入しても即座にループは止まらず都合2回 `usingBlock` が呼び出されます。推測ではありますが、`- (void)enumerateGroupsWithTypes:(ALAssetsGroupType)types usingBlock:(ALAssetsLibraryGroupsEnumerationResultsBlock)enumerationBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock` は「列挙すべき `group` がなくなった場合には `group` が nil の状態で `usingBlock` が呼び出される」というデザインになっています。この API デザインを踏襲するために *stop に YES が代入されてももう一度 `usingBlock` が呼び出されるのだと思います。

## まとめ

少しトリッキーな実装になっていますが、リファレンスやヘッダファイルに書かれていることをベースにして実装しているので特に害はないと思います。使いやすいと思うので良かったら使ってみてください。