OmniAICreator/Qiita-1.07M huggingface dataset:
Backbone-Mediatorプラグインについて

# Backbone-Mediator
[https://github.com/chalbert/Backbone-Mediator](https://github.com/chalbert/Backbone-Mediator)
Backboneにpub/sub[?](http://ja.wikipedia.org/wiki/%E5%87%BA%E7%89%88-%E8%B3%BC%E8%AA%AD%E5%9E%8B%E3%83%A2%E3%83%87%E3%83%AB)を追加するプラグイン

# API

## publish(channel)
### channel `string` 
メッセージ（チャネル）の名前

```js:
// メッセージを発行
Backbone.Mediator.publish(channel);
// 上記と同じ
Backbone.Mediator.pub(channel);

// 引数も渡せる
// subscribe()のsubscriptionで指定した関数に渡される
Backbone.Mediator.publish(channel, 'foo', 'bar');
```
jQueryのtrigger()みたいなやつ


## subscribe(channel, subscription, context, once)
### channel `string`
メッセージ（チャネル）の名前

### subscription `function` 
メッセージ（チャネル）を購読した際に実行する関数

### context `object` 
subscription実行時のthis

### once `boolean` 
一回だけの実行かどうか

```js:
// メッセージ（チャネル）を購読
Backbone.Mediator.subscribe(channel, subscription, context, once);
// 上記と同じ
Backbone.Mediator.sub(channel, subscription, context, once);
```
jQueryのon()みたいなやつ


## subscribeOnce(channel, subscription, context)
### channel `string`
メッセージ（チャネル）の名前

### subscription `function`
メッセージ（チャネル）を購読した際に実行する関数

### context `object`
subscription実行時のthis

```js:
// 一度だけメッセージ（チャネル）を購読
Backbone.Mediator.subscribeOnce(channel, subscription, context);
// 上記と同じ
Backbone.Mediator.subscribe(channel, subscription, context, true);
Backbone.Mediator.sub(channel, subscription, context, true);
```
jQueryのone()みたいなやつ


## unsubscribe(channel, subscription, context)
### channel `string` 
メッセージ（チャネル）の名前

### subscription `function` 
メッセージ（チャネル）を購読した際に実行する関数

### context `object` 
subscription実行時のthis

```js:
// メッセージ（チャネル）の購読を終了
Backbone.Mediator.unsubscribe(channel, subscription, context);
```
jQueryのoff()みたいなやつ


## subscriptions
delegateEvents()が呼ばれた時に自動的にsubscriptionsがsetされる
undelegateEvents()が呼ばれた時に自動的にsubscriptionsがunsetされる

```js:
var MyView = Backbone.View.extend({
    // まとめてチャネルの購読を設定
    subscriptions: {
        'hoge:fuga': 'doFuga', // 'hoge:fuga'チャネルが発行されたらthis.doFugaを実行
        'hoge:piyo': function() {
            // ...
        }
    }
});
```
Backbone-MediatorがBackbone.Viewに追加した機能
ちなみにdelegateEvents()はView生成時に呼ばれてる
Asset Pipelineで生成されるjsを分割する

# 背景
- 特定のユーザにだけ必要なライブラリを`application.js`とは別に読み込みたい

# やりかた 

```ruby:application.rb
    # Precompile additional assets.
    config.assets.precompile += %w(foobar.js)
```
↑ `foobar.js`を出力する場合

```js:app/assets/javascripts/foobar.js
//= require foo
//= require bar
//= require baz
```
↑ `foo.js`とか`bar.js`は`vendor/assets/javascripts`に入っている想定

```js:app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
//= require turbolinks

//= stub foobar

//= require_tree .
```
↑ `//= stub foobar`で`foobar`が含まれるのを防ぐ。`//= require_tree .`を使わなければ不要

# 参考
- [javascript - Rails 3.1 Sprockets require directives - is there a way to exclude particular files? - Stack Overflow](http://stackoverflow.com/questions/7602393/rails-3-1-sprockets-require-directives-is-there-a-way-to-exclude-particular-fi)
正規表現クラス[:alnum:]の罠


[:alnum:] って a-zA-Z0-9 と等価だと思っていたが違う。

てっきり

```
"ほげ".match(/[[:alnum:]]+/)   # => nil
```

となるのを期待していたのに、

```
"ほげ".match(/[[:alnum:]]+/)   # => #<MatchData "ほげ">
```

となる…なんだこれ？
StoryboardでUITableViewControllerにUIViewをねじ込む

UITableViewの上部に、自由に使えるView領域を追加したいとき。
[UIViewControllerにTableViewを追加したり](http://d.hatena.ne.jp/hoshi_takanori/20111109/p1)、[UITableViewのheaderViewを使ったり](http://developer.apple.com/library/ios/#samplecode/iPhoneCoreDataRecipes/Introduction/Intro.html)する方法などがありますが、もっと簡単に実現する方法があることが昨日分かりました。

UITableViewControllerの、Tableviewの上端にUIViewをドラッグしてねじ込むだけです。

![スクリーンショット 2013-06-07 10.14.22.png](https://qiita-image-store.s3.amazonaws.com/0/6688/43d7e162-d4c6-d50d-39e5-5c0c7229b56b.png)

![スクリーンショット 2013-06-07 10.15.02.png](https://qiita-image-store.s3.amazonaws.com/0/6688/73f779b1-6f03-29d1-866e-78f679443127.png)

こんな強引なやり方が普通にできたなんて…。
いままでの苦労は何だったのか…。
bundle installでNoMethodErrorが発生する場合の回避方法

備忘録的なメモとして。

bundle install実行時に
`NoMethodError: undefined method 'write' for ～`みたいなエラーが発生して
インストールが完了出来ない場合は

```bash:
RUBYOPT='-rpsych' bundle install
```

こんな感じで実行し直せばOK。
原因とかなんでこれで解決するかって事は面倒なので調べて無い。
一番簡単にLaravel4をはじめる方法


## 条件

* PHP5.4以上
* [Composer](http://getcomposer.org/ "Composer")

## PHPのバージョンを確認

	$ php -v
	PHP 5.4.9 (cli) (built: Mar 22 2013 16:17:58)
	Copyright (c) 1997-2012 The PHP Group
	Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    	with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans

この記事はPHPのビルトインサーバを利用するので**PHP5.4**以上が必須です。複数バージョンのPHPをインストールしたい方はこちらなどを見てみてください。

[phpenv-apache-versionとHomebrewで作るモダンなphp環境 | bulblub](http://bulblub.com/2013/03/22/phpenv-apache-version_homebrew/ "phpenv-apache-versionとHomebrewで作るモダンなphp環境 | bulblub")

## Composerのインストール

公式を参考に:[Installation - *nix](http://getcomposer.org/doc/00-intro.md#installation-nix "Installation - *nix") Windowsな方は[Installation - Windows](http://getcomposer.org/doc/00-intro.md#installation-windows "Installation - Windows")

## Laravel4インストール

コマンド一発インストール

	$ composer create-project laravel/laravel
	
	# Composerをシステムにインストールしなかった場合は
	$ php composer.phar create-project laravel/laravel

インストールしたディレクトリに移動してPHPサーバを起動

	# インストールしたディレクトリに移動
	$ cd laravel
	# ビルトインサーバを起動
	$ php -S localhost:8000 -t public/

以下にアクセスできたら成功です。

[http://localhost:8000/](http://localhost:8000/ "Laravel PHP Framework")

こんなのが表示されたら成功

![Laravel_PHP_Framework-2.png](https://qiita-image-store.s3.amazonaws.com/0/4319/ab53f0a7-da97-dc46-dc53-e04dfb63101b.png "Laravel_PHP_Framework-2.png")

ローカル環境でのお試しにはビルトインサーバは便利ですね。
以上です。
testコマンドとcronを組み合わせ、月末にバッチを動かす


```cron:
 0 0 * * * /usr/bin/test $( date -d '+1 day' +\%d ) -eq 1 && /home/hoge/cron/foo.sh
```

↑で、毎月月末日の零時にfoo.shが実行されるようになります。

####testコマンド

条件式を評価して、真(0)偽(1)を終了ステータスとして返す

>　date -d '+1 day' +\%d  のコマンドの実行結果(翌日の日付)と1  を比較する 

例えば、今日は7日なので…$?を出力して条件式の評価をみてみる

```shell:
 test  $( date -d '+1 day' +\%d ) -eq 1;  echo $?;
=>1
```
明日は1日ではないので、偽

```shell:
 test  $( date -d '+1 day' +\%d ) -eq 8;  echo $?;
=>0
```
明日は8日でなので、真

####&&

一つめのコマンドが正常終了した場合に2つめのコマンドを実行する

> testコマンドのステータスが真（0）になる場合のみ、/home/hoge/cron/foo.sh　が実行される


* * *
<br>

testコマンドに渡す条件式を工夫すれば、もっと色々できそうですね
【要望】タグごとの人気投稿一覧、関連度が高いユーザ一覧がほしい

1. 特定のタグの投稿を人気の高い順で見たい

2. 特定のタグに関連度が高いユーザ一覧を見たい

関連度: 個人が特定のタグに関心が高かったり、専門的だったり、詳しかったりする度合い
関連度の評価方法はいろいろありそうですが、投稿している数(アウトプット量)、投稿がストックされた数・LGTM(品質)などのパラメータが使えると思います。

「Rubyならこの人!」というのを知れたら面白そうだと思いました。

ランキングのようなものだと、古い情報が上に固まりそうなので、
週次・月次などもあるといいですね。
RubyMotionでSingleton

こんな感じのコードを書いてSingletonにしたいクラスでinclude

```rb:
module SingletonClass
  def self.included(base)
    base.extend(ClassMethods)
  end
 
  module ClassMethods
    def new
      super
      instance
    end
 
    def instance
      Dispatch.once { @instance ||= alloc.init }
      @instance
    end
  end
end
```

>Executes a block object once and only once for the lifetime of an application.

Dispatch.onceにブロックで渡した処理は、アプリのライフサイクル中一回しか実行されないらしrい

これを使うと、クライアントのControllerをinteractive debuggerでデバッグする時便利です。
以下は、ProMotionというgemを独自に拡張したコードで、self.viewにUIWebViewが入ってます。

```rb:
class GithubScreen < ProMotion::WebViewScreen
  include SingletonClass
 
  def on_load
    open_url 'http://github.com'
  end
 
end
```

シングルトンなので、以下のようにrake実行してシミュレーター起動させてから、
Controller部分のインスタンスが、シミュレーター上に表示されているものと共有できるので、
以下のように実行するとWebViewのリロードができます。

```rb:
$ rake
....
> g = GithubScreen.new
> g.view.reload
```

どうでしょ？
Android r22 から mvn コマンドでエラーが出るようになりまして

# はじめに
Windows 環境にて Android SDK を r22 へバージョンアップしたところ maven の mvn コマンドがエラー発生するようになってしまいハマったのでメモしておきます。

# Android SDK って？
http://developer.android.com/tools/sdk/tools-notes.html

Android アプリを作るための SDK です。Android App も作れるし、 NDK も作れちゃうし。その上 Eclipse がベースになってなじみ易いのに加えて、Windows, MacOS, Linux で動作する開発環境です。 

# [maven]((http://maven.apache.org/)  って?
Apache プロジェクトで作られている包含ツール。POM(Project Object Model) に則って色々できるようにしているみたいです。

Java 界隈ではスタンダードなプロジェクト管理ツールなんですかね？(ごめんなさい、Java 界隈は詳しくないものでして･･･)

# 原因と解決方法
mvn コマンドでビルドしてみると aapt.exe が無いと言われちゃいます。
Android SDK r22 からは、従来 ${ANDROID_HOME}/platform-tools に置かれていた一部コマンドプログラムを ${ANDROID_HOME}/build-tools 以下に配置するようになったようです。この構造変更で aapt.exe が ${ANDROID_HOME}/build-tools 以下に変更されて mvn コマンドが aapt.exe が見つけられないのが問題の原因でした。

当初は環境変数 path へ aapt.exe が配置されているフォルダを追加したんですが、なぜかうまくいかず。
次に ${ANDROID_HOME}/build-tools/**/ の中身を ${ANDROID_HOME}/platform-tools 以下にコピーすることで mvn コマンドでビルドができるようになりました。
(Windows ってシンボリックリンクがないのでコピーするしかないのよね(;_;))

# おわりに
ここで提示した解決方法はアドホックなものとなります。

おそらく maven のバージョンアップやら pom.xml を見直せば解決できるとは思うのですが、私にはそのようなスキルや調査する時間が無いので build-tools の中身を platform-tool へコピーする手法をとりました。

どなたか、筋の良い解決方法を提示していただけたら幸いです。

# おまけ
Android SDK r22 の aapt.exe の引っ越し問題で Unity もビルドできなくなったようでフォーラムにスレッドが立てられていました。

http://forum.unity3d.com/threads/176737-unknown-error-when-building-simple-scene

結構影響範囲大きいのかな？
Backbone.jsを使ったシングルトンについての考察


# シングルトンクラスを量産する

Backbone.jsを使ってシングルトンパターンを作る場合、
以下のようにconstructorを書いてやるといいらしい。

```js:
    var Singleton = Backbone.Model.extend({
        constructor: function(){
            if(!Singleton.instance){
                Singleton.instance = this;
                Backbone.Model.apply(Singleton.instance, arguments);
            }
            return Singleton.instance;
        }
    });
```

そして、以下のようにしてChromeか何かでコンソールを表示して確認するとうまくいっているのがわかる。

```js:
    var obj = new Singleton({
        foo: "foo"
    });
    var obj2 = new Singleton();

    console.log(obj.toJSON());
    console.log(obj2.toJSON());
```

毎回、シングルトンを書くのが面倒くさいという場合は、
クラスSingletonを以下のように変更して、

```js:
    var Singleton = Backbone.Model.extend({
        constructor: function(){
            var self = this.__proto__.constructor;
            if(!self.instance){
                self.instance = this;
                Backbone.Model.apply(self.instance, arguments);
            }
            return self.instance;
        }
    });
```

以下のように使えば、シングルトンクラスを量産可能ではある…。

```js:
    var AnotherSingleton = Singleton.extend();
    var s1 = new Singleton({foo: "Singleton"});
    var s2 = new Singleton();
    var a1 = new AnotherSingleton({foo: "AnotherSingleton"});
    var a2 = new AnotherSingleton();
    console.log(s1.toJSON());
    console.log(s2.toJSON());
    console.log(a1.toJSON());
    console.log(a2.toJSON());
```

# シングルトンクラスと継承

Javaなどのシングルトンパターンでは、シングルトンクラスから
子クラスを作ることはない。
大抵は、シングルトンクラスのコンストラクタメソッド自体を
privateにして子クラスを作成できなくしてしまう。

なぜ、子クラスを作れなくしてしまうかというと、
思うに、

・シングルトンとはただ１つのインスタンスしか持たない

というのと、

・子クラスで（親クラスとは）別のインスタンスを作りたい

という考えの整合がとれないからだろう。
もし、子クラスが作れたとして、その子クラスのインスタンスも
親クラスのインスタンスとみなせるので、
「親クラスのインスタンスは１つだけ」という原理原則から考えると、
子クラスのインスタンスも親クラスのインスタンスと同一のもので
なければいけなくなる。
そうなると、そもそも子クラスを作る必要がなくなる。
（子クラスでインスタンスを作っても、親クラスでインスタンスを
作っても同じインスタンスになるなら、子クラスは必要ない。）

では、子クラスでは親クラスとは別の属性を付け加えたい場合は
どうすればよいのだろう？

これは、シングルトンクラスを継承して属性を追加したい、
という意味になる。
なんか混乱してくるけど、これは、ずばりクラスの設計がおかしい。

この場合の解決策は、シングルトンクラスのインスタンスを
メンバーに持った新たなクラスを作るのが正解だろう。
つまり、こんな感じ。

```js:
   var Singleton = Backbone.Model.extend({
        constructor: function(){
            if(!Singleton.instance){
                Singleton.instance = this;
                Backbone.Model.apply(Singleton.instance, arguments);
            }
            return Singleton.instance;
        }
    });

    var obj = new Singleton({
        type: "singleton"
    });

    var MyClass = Backbone.Model.extend({
        singleton: new Singleton(),
        defaults: {
            item1: "foo",
            item2: "bar"
        }
    })
    var MyClass2 = MyClass.extend();
 
    var obj2 = new MyClass();
    var obj3 = new MyClass2({
        item1: "zot"
    });

    console.log(obj.toJSON());
    console.log(obj2.toJSON());
    console.log(obj3.toJSON());
    console.log(obj2.singleton.toJSON());
    console.log(obj3.singleton.toJSON());
```
KVM CentOS6.4 仮想マシン最小インストールスクリプト

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

function main(){

    local NAME=$1

    if [ -z ${NAME} ]
    then
        echo $0 [NAME]
    else
        create_img ${NAME}
        create_kvm ${NAME}
    fi
}

function create_img(){

    local NAME=$1

    qemu-img create -f qcow2 /var/lib/libvirt/images/${NAME}.img 10GB
}

function create_kvm(){

    local NAME=$1

    virt-install \
    --connect qemu:///system \
    --name=${NAME} \
    --ram=512 \
    --disk path=/var/lib/libvirt/images/${NAME}.img \
    --vcpus=1 \
    --os-type=linux \
    --os-variant=virtio26 \
    --network bridge=br0 \
    --nographics \
    --accelerate \
    --hvm \
    --location=http://ftp.riken.jp/Linux/centos/6.4/os/x86_64/ \
    --extra-args='console=tty0 console=ttyS0,115200n8'

}

main ${@}
```
Watirで自動テストを書いてみた

## はじめに
* 私最近、SeleniumWebDriver+capybara+cucumberでテストをゴリゴリ書いています
* しかし今や骨董品なのかもしれないWatirを使って自動テストを書いてみようと思ったので、導入手順 / テスト作成 / 実行方法のメモを残してみた
* 正直Seleniumとできることは似ていると思ったが、手軽さはなんとなくこっちかな
* [ここ](http://d.hatena.ne.jp/ninoseki/20111003/1317650033)にも書いてあるが確かに5分でテストが書ける！
* JavascriptベースのSeleniumとなら、いくつか使うメリットがあるかもしれない
 * 例えば、セキュリティ上の都合でJavascriptでは難しい操作が可能など
 * 比較されている[記事](http://narayanraman.blogspot.jp/2006/03/sahi-vs-selenium-vs-watir.html)があった
* しかし、Selenium 2.0（Selenium WebDriver）があるので、あえてWatirを使う人は少ないだろうと感じた
* 検証環境は以下の通り
 * OS： Windows7
 * Ruby： 1.9.3 
 * gem： watir 4.0.2, mini_magick 3.5.0

## Watirとは
* Watirは自動的にブラウザを操作してテストを行うためのツール
 * http://watir.com/documentation/
* ダウンロード数(2013/06/06時点)
 * 155,776 (https://rubygems.org/gems/watir)
* 最終更新日時
 * 2012/10/31 (Version 4.0.2)
* 「Web Application Testing in Ruby」の頭字語で「ウォーター（water）」と読む
* サポートされているブラウザ
 * Internet Explorer
 * Firefox
 * Chrome
 * Safari
 * Opera

## Watirのインストール
* gemインストール
 * ```gem install watir``` (selenium-webdriverもインストールされる)
 * ```gem install mini_magick``` (依存パッケージ：インストールされていなければ入れる必要あり)

## Watirを使ってできるブラウザ操作
* 全部試したわけではないが、簡単なブラウザ操作くらいはできそう
* 下記サイトにできることの一覧がまとめてあった
 * http://wiki.openqa.org/display/WTR/Cheat+Sheet

## テスト作成
* Rubyとググってみるテストを作成

```rb:watir_test.rb
require "watir"

browser = Watir::Browser.new :ie
browser.goto('https://www.google.co.jp') # https://www.google.co.jpにアクセスする
browser.text_field(:name, 'q').set('Ruby') # googleの検索ボックスにRubyと入力する
browser.button(:name, 'btnG').click # btnGというname属性を持つボタンを押す
sleep 5
browser.close # ブラウザを閉じる
```

* [ここ](http://codecentrix.blogspot.jp/)によるとブラウザ操作で自動記録してくれるツールがあると書いてあった
 * Selenium IDE的な感じの代物でしょう
 * ただ、これがなければ書けないレベルではないので今回は無視

## テスト実行
* rubyコマンドで実行するだけ
 * ```ruby watir_test.rb```
* ブラウザが立ち上がってRubyとググってくれる

## その他
* もちろんcucumberを導入しても実行可能

----

### 参考文献
* http://wiki.openqa.org/display/WTR/Cheat+Sheet
* http://wtr.rubyforge.org/rdoc/1.6.5/

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Scala Templateの関数で少し簡単にCSSファイルへの参照を記述する

```scala:
@(content: Html)
@style(asset: String) = {
 <link rel="stylesheet" href="@routes.Assets.at(asset)">
}
<!DOCTYPE html>
<head>
  <title>sample</title>
  @style("bootstrap/css/bootstrap.css")
  @style("stylesheets/main.css")
</head>
  <body>
  </body>
</html>
```
[Instant Play Framework Starter](http://www.packtpub.com/play-framework-starter/book)に掲載されていた方法、こうすると少しらくちん。
twitter-bootstrap-railsを触ってみる

## 概要
* リンク：https://github.com/seyhunak/twitter-bootstrap-rails
* Twitter Bootstrapをrailsで使うことに便利になる

## bootstrapをrailsに追加
```bash
$ rails new mahjong
$ cd mahjong
$ rails g scaffold game number:integer result:string --skip-stylesheets
$ rake db:migrate 
```

```ruby:Gemfile
group :assets do
  ......
  gem 'uglifier', '>= 1.0.3'
+ gem 'therubyracer'
+ gem 'less-rails' 
+ gem 'twitter-bootstrap-rails'
end
```

```bash
$ bundle install
$ rails g bootstrap:install
      insert  app/assets/javascripts/application.js
      create  app/assets/javascripts/bootstrap.js.coffee
      create  app/assets/stylesheets/bootstrap_and_overrides.css.less
      create config/locales/en.bootstrap.yml
        gsub  app/assets/stylesheets/application.css
        gsub  app/assets/stylesheets/application.css 
```

## bootstrap layoutでレイアウトのスタイルを変更
```bash
$ rails g bootstrap:layout application fluid -f
 　force  app/views/layouts/application.html.erb
```

##### 何を変更されるか？
* 参照：http://twitter.github.io/bootstrap/scaffolding.html

###### Fluid layout

```html:application.html.erb
 <div class="container-fluid">
```

###### Fluid grid system
```html:application.html.erb
<div class="container-fluid">
  <div class="row-fluid">
    <div class="span3">
      <!--Sidebar content-->
    </div>
    <div class="span9">
      <!--Body content-->
    </div>
  </div>
</div>
```
###### Fixed layout vs. Fluid layout

###### Fixed grid system vs. Fluid grid system
* pixelsからパーセントに変わりに

## bootstrap themedでビューのスタイルを変更
```bash
$ rails g bootstrap:themed games -f
```
##### ボタン
* http://twitter.github.io/bootstrap/base-css.html#buttons

##### テーブル
* http://twitter.github.io/bootstrap/base-css.html#tables


***
# メモ
```bash
$ rails g bootstrap:layout application fixed -f
```
Chefでディレクトリを作成する時に action :create してはいけない?

詳細調査中ーーー

下記は /var/run/hoge にディレクトリを作成するレシピである。


<pre>
directory "/var/run/hoge" do
  owner "fuga"
  group "fuga"
  recursive true
  mode 0755
  action :create
end
</pre>

ただし稼働中のシステムで該当のディレクトリの配下にファイルが存在していても、新規作成を試みる。
actionに条件付きアクションを使うとこの問題に対処できる。

<pre>
directory "/var/run/hoge" do
  owner "fuga"
  group "fuga"
  recursive true
  mode 0755
  action :create
  not_if { File.exists "/var/run/hoge" }
end
</pre>

:create_if_missing というドキュメントされていないアクションもあるが、使わないほうが無難。
https://tickets.opscode.com/browse/CHEF-1959

<pre>
directory "/var/run/hoge" do
  owner "fuga"
  group "fuga"
  recursive true
  mode 0755
  action :create_if_missing
end
</pre>
コマンドプロンプトで文字コードがUTF-8なテキストを表示する

コマンドプロンプトで文字コードがUTF-8なテキストを表示するため、メモします。

まず、コマンドプロンプトを起動します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/22465/6a0eeb8e-33da-96f3-2d8c-2df5474cfed2.png)

上のバーの所で、右クリック⇒プロパティをクリックします。
プロパティを開いたら、フォントを「MSゴシック」に変更して、OKをクリックします。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/22465/0d0650b9-d6d1-66db-01a9-addfa7b279f4.png)


コマンドプロンプト上で

```
 chcp 65001
```

と入力します。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/22465/1d75b4fd-4306-ca76-3359-4fca4c91de70.png)



以上です。
VagrantでCSSの更新が反映されない場合の対処法

Vagrantで作成した開発環境でCSSの更新が反映されない現象が起こることがあります。

なぜこのような現象が発生するかというと、静的なファイルのようにリクエストの処理にデータのアクセスを必要としないときには、ファイルを読み込むことなくカーネルの sendfile を使って ファイルを送るようになっているからです。

以下のようにして sendfileを使わないようにします。

## apacheの場合

```apache:httpd.conf
EnableSendfile off
```

## nginxの場合

```nginx:nginx.conf
sendfile off;
```

Webサーバーを再起動すればCSSの更新が適応されるようになると思います。
Compassでconfig.rbの名前や場所を指定したい場合のオプション

いっつも忘れるので。

**-c オプションです**

```shell-session:
compass -c PATH_TO_CONFIG_FILE
```

で、この場合コマンドを叩いた場所基準でconfig.rb内に設定したパスが適用されるので注意。

プロジェクトのルートなんかでやるといいと思います。
Zabbix APIをたたく (1.8, 2.0)

評価したいんだか酷評したいんだか良くわからないタイトルです

# Zabbix APIって何

Web上で出来る作業の大方をプログラム上からも行えるようにする、というものです。

ただし全て出来るわけではありません。

> Web items cannot be deleted via the Zabbix API.

Web itemsというのは(調べついてませんが)こういうのですね
https://www.zabbix.com/documentation/2.0/manual/web_monitoring/items

基本的には数値周りの監視の設定をホスト追加、アイテム追加とか出来るのが最低ラインと思われ、そこはできます。UIをウィジェット・ガジェット的に奪ってくるとかは出来なそう。

# ドキュメント

公式はこちら

* [1.8](https://www.zabbix.com/documentation/1.8/api)
* [2.0](https://www.zabbix.com/documentation/2.0/manual/appendix/api/api)

野良がこちら

* [Zabbix APIを使った外部ツールとの連携](http://thinkit.co.jp/story/2012/05/11/3541)
* [Zabbix API を始める人向けの情報をまとめてみた](http://log4hc.wordpress.com/2012/08/10/zabbix_api_summary/)

一見すると簡単そうです。ただ、コーナーケースでちょっと頭が痛いです

# 基本的には

JSONでやりとりします。

* Web APIでAPI accessを許すユーザを定義
* そのユーザ名とパスワードでJSONやり取りして credential を得る
* credential をJSONに入れて、その上でデータをリクエストして得る

単純です。当然ですがJSONは生でトラフィックを駆け巡るのでプロダクションではhttps必須にするほうが良いかもしれません。

なお、そのまんまJSONを構築するのはめんどいのでライブラリがそれなりにあります。PythonではZabbix APIというRubyあたりのものをポーティングしたのがまぁまぁ。__まぁまぁ__

https://github.com/gescheit/scripts/tree/master/zabbix

いや、なんというか、紹介サイトではメジャーなものがないのか複数Zabbix APIを名乗るのが併記されてましたん。パッケージとかになってるレベルでもないようですね。

あ、タイポみっけた

# 出会った問題

枝葉末節です。

* 1.8はドラフト段階とされています。何が起きてもあんまり文句言えなそう
* 1.8と2.0でAPIの構成が違います
* 公式のドキュメントが雑です。1.8は非常に雑です
* 公式ドキュメントが嘘つきます 
* エラー番号が特に1.8では全く不親切です

とはいえ、1.8は現在安定して使われているので、APIもそこそこ動作すると期待して良いのでしょう。良いんだよね！

具体的にはこういうのが問題になります

* 1.8がAPI versionで1.3と返してきたりするんですが
* 引数不足とサーバ側でのkey_の重複 (重複登録はめーなの) のエラーメッセージが全く同じってどういう……
* 世の中の例が 「2.0でもウゴク気がするよ！」と書いてあって例が1.8に全面依存というのはでっでう……(もちろん 2.0で動かない)
* みんなして item を get する例で満足してて create する例があんまりない (この部分、1.8と2.0で動作がびみょーに違う)

追記: こんなの見つけた。ドキュメント上でbooleanを受け付けると書いてあるのに実態は 1/0 で受け付けてたという例。こういうバグは結構あると予想されます。 http://www.zabbix.jp/node/2261

# 例を公開しといた

https://github.com/dmiyakawa/zabbix_api_examples

汎用ライブラリを、と言いたいところですが、まず大本のツールが大変柔軟であるため、方向性がはっきりしないと汎化する意味がないこと、また1.8と2.0でアーキテクチャが違う部分が見受けられ怪しいこと、最後にエラー時の唯一の情報の出処と思われるエラーメッセージが破綻していること等を考えるとなかなか大変そうです。Zabbix API (Rubyの?) のヤツはそういう意味では十分良いと言えます。これ以上隠す意義はないね。interfaceidとか、うざいね

自分の目的にぴったり合う抽象化レベルを考えるのが良いですかね。あと、個別のエラーメッセージが実はどういう真意を持ちうるのかについてのノウハウは持ってると良いと思います。
jQueryMobile でボタンのテキストを書き換える


JavaScript でボタンのテキストを動的に書き換えたくなることは多々ある。
jQuery Mobile を使用していて、Button の中身の書き換え方で、少し手間取ったので、メモを残す。

仮に

```
<a id="button" href="#" data-role="button">hoge</a>
```
のようなボタンを作り、JavaScript で hoge を fuga に変えたくなった場合、

```
$('#button .ui-btn-text').text("fuga");
```
とすればよい。クラスとして、ui-btn-text を指定ないと、テキストは変わるがボタンのサイズがおかしくなってしまう。
arの表紙の石原さとみが本当に可愛い

平均と分散と標準偏差と

```r:R
d<-read.delim("./data.raw")
head(d)
nrow(d)
mean(d$column2, na.rm=TRUE)
var(d$column2, na.rm=TRUE)
sd(d$column2, na.rm=TRUE)
sd(log10(d$column2), na.rm=TRUE)
hoge<-subset(d, d["column3"]=="hoge")
head(hoge)
nrow(hoge)
mean(hoge$column2, na.rm=TRUE)
var(hoge$column2, na.rm=TRUE)
sd(hoge$column2, na.rm=TRUE)
sd(log10(hoge$column2), na.rm=TRUE)
```

na.rmだるい

```r:R
d_clean<-na.omit(d)
```

磨けば光るわけですから

```r:R
system("open -a Safari http://inut.tumblr.com/post/53178264287/")
```
gem installでGitHubリポジトリにある最新版をインストールする

稀に

> masterでは直ってるけど、Rubygemsにはまだ出てないから、Gemfileに
>
> ```ruby
> gem 'spring', github: "jonleighton/spring"
> ```
>
> って書いて `bundle update spring` を実行してね。
>
> 参考: https://github.com/jonleighton/spring/issues/143#issuecomment-17984728

みたいなことがある。だいたいの場合はこれでいいんだけど、ここで引用しているspringの場合、これで直るのは `bundle exec spring` だけで、 `bundle exec` 無しだと実行できない。（僕の勘違いかも知れないので、正しいやり方を知っている人は是非コメントで教えてください。）

我慢して古いバージョンをRubygemsから引っ張ってきてインストールしてもいいんだけど、やっぱりbundlerでインストールしてあるのと同じバージョンにしたい。

で、gemコマンドにはgitリポジトリを指定して直接インストールする機能が無いので、こういう場面ではspecific_installというgemを使う。今回の場合は以下のようになる。

```zsh:
gem install specific_install
gem specific_install -l 'git://github.com/jonleighton/spring.git'
```
PowerVR InsiderSDK のサンプルのビルド


# Mac版のSDKでのビルド

Examplesフォルダをホームディレクトリにコピーして作業しました。
OGLES2HelloAPI をビルドしてみました。

## SDKのインストール
SDKは標準のインストール方法でインストールしました。

## XCode4の設定
プロジェクト(OGLES2HelloAPI)を選択して、Build Settings ペインを開きます。
###  ヘッダとライブラリのパスを編集します。
Header Search Paths: /Users/Shared/Imagination/PowerVR/GraphicsSDK/SDK_3.1/Builds/Include
Library Search Paths: /Users/Shared/Imagination/PowerVR/GraphicsSDK/SDK_3.1/Builds/OSX/x86/Lib
### ビルドします。
ビルドボタンでビルドします。

### エラーが出るので修正します。
次のようなエラーがでます。
/Users/Shared/Imagination/PowerVR/GraphicsSDK/SDK_3.1/Builds/Include/GLES2/gl2.h:570:37: Conflicting types for 'glShaderSource'

glShaderSourceが競合しているというエラーです。

#### OGLES2HelloAPI_OSX.mm ファイルを修正します。
２行めの #include <GLES2/gl2.h> を削除するかコメントアウトします。

### 実行結果です。

再度ビルドすると次の実行結果が得られます。

![OGLES2HelloAPI_mac.png](https://qiita-image-store.s3.amazonaws.com/0/20571/e188d469-fc9e-26a1-df5c-16b42b347e08.png "OGLES2HelloAPI_mac.png")
「テスト駆動開発による組み込みプログラミング」の演習でIGNORE_TESTの罠

先日から次の本の写経をやっているんだけど、P.70で行き詰まったので書いておく。

>テスト駆動開発による組み込みプログラミング――C言語とオブジェクト指向で学ぶアジャイルな設計
>http://www.oreilly.co.jp/books/9784873116143/

#IGNORE_TEST

P.70ではIGNORE_TESTマクロを使う解説がある。ところが、実行結果が異なり、本来**1 Ignored**となるべき所が、**0 Ignored**となってしまう。さらに悪いことに、**その後に書いたテストが失敗するように書いても全て成功してしまう**問題が起こる。しょうがないのでデバッグするとどうやらUnityのフレームワーク側に問題がありそうだ。次のように修正すれば解説通りの動作となる事が分かった。

```c:unity_fixture.c
void UnityIgnoreTest(const char * printableName)
{
    Unity.NumberOfTests++;
    Unity.CurrentTestIgnored = 1;
    if (UnityFixture.Verbose)
    {
        UnityPrint(printableName);
        UNITY_OUTPUT_CHAR('\n');
    }
    else
        UNITY_OUTPUT_CHAR('!');

	// これが要るんちゃう？！？！
	// ↓ ★これを追加
	UnityConcludeFixtureTest();

}
```

フレームワークの中身にも触れられて良かったとしよう。
\# Unity自体がちゃんとテストされているか心配になった。

##本家に出てたよ

よくよく調べると、原典のサイトに情報が出てた。
http://forums.pragprog.com/forums/123/topics/10126
PowerVR Insider SDK Examples


サンプルはExamplesフォルダにあります。

ここでは、OpenGLES2.0に対応したもののみ紹介します。

# サンプル一覧(V3.1)
## 1. Beginner
SDKのチュートリアルになっています。

| プロジェクト | 概要 |
|:-------------------|:--------|
| 01_HelloAPI | 1. 三角形の描画 |
| 02_IntroducingPVRShell | 2. PowerVRShellツールを使った三角形の描画 |
| 03_Texturing  | 3. テクスチャを貼った三角形の描画 |
| 04_BasicTnL  | 4. 基本的なライティングをした三角形の描画 |
| 05_IntroducingPVRTools  | 5. PVRToolsを使った三角形の描画 |
| 06_IntroducingPrint3D | 6. Print3Dクラスによる文字列描画 |
| 07_IntroducingPOD | 7. POD形式によるロボットアームの描画 |
| 08_IntroducingPFX | 8. .pfxファイルをロードして使う |

## 2. Intermediate

| プロジェクト | 概要 |
|:-------------------|:--------|
| LightMap | ライトのテクスチャへの焼きこみ |
| Fresnel Reflection | フレスネル反射 |
| Bloom | ブルーム・ポスト処理 |
| FastTnL | 高速ライティング |
| Iridescence | イリデッセンス(虹色)効果 |
| CellShading | セルシェーディング |
| Level of Detail | カメラからの距離に応じた詳細度の変更(LOD) |
| ShadowVolume | シャドウボリューム法による影の描画 |
| Fog | フォグエフェクト |
| StencilBuffer | ステンシルバッファの使い方 |
| AlphaBlend | アルファブレンディング |
| ParallaxBumpmap | パララックス(視差)マッピング |
| ComplexLighting  | 複雑なライティング |
| AnisotropicLighting | Anisotropic Lightingシェーダー |
| ShadowMapping | シャドウマッピングによる影 |
| Skinning | スキニングモデルの使い方 |
| Iridescence | 環境マッピング |
| Refraction | 屈折効果によるガラスのような材質の描画 |
| Reflections | 2Dマップとキューブマップによる反射の描画 |
| AlphaTest | アルファテストとアルファブレンディングの違い |
| RenderToTexture | テクスチャへの描画 |
| DisplacementMap | ディスプレースメント(変位)マッピング |
| EdgeDetection | エッジ抽出 |

## 3. Advanced

| プロジェクト | 概要 |
|:-------------------|:--------|
| ChameleonMan | スキニングしたキャラクタをバンプマッピング |
| 3D Navigation | 3Dでの移動操作 |
| Navigation | 2Dの移動操作 |
| PVRScopeRemote | pvrscopeによる遠隔操作 |
| Coverflow | アルバムをめくるようなエフェクト |
| DeferredShading  | 遅延シェーディング |
| Fractal | フラクタルの描画 |
| Shaders | いろいろなメッシュに対するいろいろなシェーダーの適用 |
| MagicLantern | 球面投影によるダイナミックライティング |
| PVRScopeExample | pvrscopeの使い方 |
| Water | 水面の描画 |
| Skybox2 | シェーダーベースのスカイボックスによる天空の描画 |
| ParticleSystem | OpenCLとGPUを使ったパーティクルシステム |
| FilmTV | フィルムテレビのような効果 |
| BinaryShader | バイナリシェーダーの保存と読み込み |
| ExampleUI | UIのサンプル |

## OpenGLES1.1ベースのみのサンプル

| プロジェクト | 概要 |
|:-------------------|:--------|
| Multitexture | 複数のテクスチャの使用法 |
| AntialiasedLines | アンチエイリアスをかけた直線 |
| MatrixPalette | スキンアニメーションのための行列パレットの使用法 |
| ShadowTechniques | いろいろなシャドウ法 |
| OptimizedMesh | 最適化されたメッシュ |
| Trilinear | テクスチャフィルタリングの違い |
| FiveSpheres | プリミティブタイプの違い |
| Lighting | ８点ライト |
| UserClipPlane | 平面によるクリッピング |
| Bumpmap | バンプマッピング |
| Skybox | PVRTCを使ったスカイボックス法による天空の描画 |
| Mouse | マウス操作 |
| Vase | 透過した花瓶の描画 |
| PolyBump | Crytek社が開発したPolyBump方による描画 |
| Fur | ファーシェーディング法による毛の描画 |
| Particle | フレームバッファブレンディングによるパーティクルの描画 |
| EvilSkull | 複数のテクスチャを使用したモーフィング |
JavaScript フォーム入力文字制限（全角カナ、半角英数記号、半角数字）

フォームで入力文字を固定する。
フォーカスが外れると、規定外の文字が消えて、規定文字だけ残ります。

```html:
カナのみ<input name="text1" type="text" id="text1"><br>
半角のみ<input name="text2" type="text" id="text2"><br>
数字のみ<input name="text3" type="text" id="text3"><br>
```


```js:
function checkChara(_type,_str){
	var tmp = _str.split("");
	for(var cnt=0;cnt<tmp.length;cnt++){
		switch(_type){
			case "katakana":
				if(tmp[cnt].match(/^[ァ-ヶー]*$/)==null){
					tmp[cnt] = "";
				}
			break;
			case "hankaku":
				if(tmp[cnt].match(/^[a-zA-Z0-9!-/:-@¥[-`{-~]+$/)==null){
					tmp[cnt] = "";
				}
			break;
			case "number":
				if(tmp[cnt].match(/^[0-9]+$/)==null){
					tmp[cnt] = "";
				}
			break;
		}
	}
	return tmp.join("");
}
$(document).ready(function(e) {
	$("#text1").change(function(e) {
		$(this).val(checkChara("katakana",$(this).val()));
	});
	$("#text2").change(function(e) {
		$(this).val(checkChara("hankaku",$(this).val()));
	});
	$("#text3").change(function(e) {
		$(this).val(checkChara("number",$(this).val()));
	});
});
```

おかしいところあったら指摘ください
jQuery.Deferredを使って非同期ループ！

jQuery.Deferredのお勉強にもどうぞ！
フォロー、コメントお待ちしてます

```js:jquery-asyncEach.js
if(jQuery) !function($){
	'use strict';
	if( typeof $.asyncEach === 'undefined' ){
		// setTimeoutとDeferredを使い非同期にする関数
		var async = function($callback){
			var $dfd = $.Deferred();
			setTimeout(function(){
				$callback($dfd);
			},0);
			return $dfd.promise();
		};
		// $.asyncEachメソッド本体
		$.asyncEach = function($array,$callback,$thisArg){
			if( typeof $thisArg === 'undefined' ) $thisArg = $array;
			//$arrayが大量だった時に$whenを作るのに時間がかかるのでいきなり非同期化
			return async(function($dfd){
				//$arrayの要素を１個づつ非同期化
				var $when	= $.map($array,function($value,$index){
					return async(function($dfd){
						return $callback.call($thisArg,$dfd,$value,$index);
					});
				});
				//$whenが全てresolveするとdone、ひとつでもrejectするとfailする
				return $.when.apply($,$when)
					.done(function(){
						//argumentsを配列に変換して返す
						var $_ = [];
						$_.push.apply($_,arguments);
						return $dfd.resolve($_);
					})
					.fail(function(){
						var $_ = [];
						$_.push.apply($_,arguments);
						return $dfd.reject($_);
					})
				;
			});
		};
	}
}(jQuery);
```


```js:テストコード
!function(){
	console.log('最初に表示される');
	$.asyncEach([1,2,3,4,5,6,7,8,9,10],function($dfd,$value,$index){
		//ここに重い処理(…の、かわりにランダムで待たせてから返す)
		var $r = Math.floor( Math.random() * 1050 );
		setTimeout(function(){
			//どちらかを使って返り値を返す
			// $dfd.resolve() = 処理成功
			// $dfd.reject()  = 処理失敗
			return $r <= 1000
				? $dfd.resolve($value * 2)
				: $dfd.reject($value + 'がキモイ');
		},$r);
	}).then(//.done,.failでもいい
		function($result){
			console.log('重い処理が全部終わったら呼ばれる');
			console.log($result);
		},function($result){
			console.log('途中でrejectされたら呼ばれる');
			console.log($result);
		}
	);
	console.log('asyncEachは非同期なので2番目に表示される');
}()
```
PEACH ライブラリで月末・月初の処理

[【PHP】月末・月初の出力方法] (http://qiita.com/items/0a2f4a64e55d84919a1c) の内容を PEACH ライブラリで書いてみました.

## 導入

1. http://trashtoy.github.io/peach/ から最新版 (2013-06-06 時点で ver 0.1.0) をダウンロードします.
2. ZIP ファイルを展開し, src ディレクトリを適当なディレクトリに配置します.
3. PHP ファイルで以下のように autoload.php を読み込みます. (または SplClassLoader などを利用して手動で autoload の設定をしてください)

```php
<?php
require_once("/path/to/peach/src/autoload.php");

// Your code here...
```

## コード例

### 今月はじめの日付

「日」のフィールドに 1 をセットします.

```php
<?php
$today = Peach_DT_Date::now();
$first = $today->set("date", 1);
echo $first; // "2013-06-01"
```

### 前月末の日付

「日」のフィールドに 0 をセットするのが一番簡単です. 「今月 1 日の前日」という風に考えると分かりやすいと思います.

```php
<?php
$today = Peach_DT_Date::now();
$prev  = $today->set("date", 0);
echo $prev; // "2013-05-31"
```

### 前月はじめの日付

「日」のフィールドに 1 をセットしてから「月」のフィールドを 1 減らします.

```php
<?php
$today = Peach_DT_Date::now();
$prev  = $today->set("date", 1)->add("month", -1);
echo $prev; // "2013-05-01"
```
この順番は重要です. もしも「月」を先に操作してしまった場合, 今日が仮に 7 月 31 日とすると, 月を 1 減らした時点で

1. 2013-07-31
2. 2013-06-31 (月の値を 1 減らす)
3. 2013-07-01 (6/30 の翌日ということで自動的に変換される)

という具合に内部状態が変化するため, 期待する結果が得られません.

以下のように setAll を使う方法もあります. コチラはすべてのフィールドを同時に更新するので上のような問題は起きません.
慣れないうちは, 複雑な操作を行う場合に setAll を使うことをオススメします.

```php 
<?php
$today     = Peach_DT_Date::now();
$lastMonth = $today->get("month") - 1;
$prev      = $today->setAll(array("month" => $lastMonth, "date" => 1));
echo $prev; // "2013-05-01"
```

### 今月末の日付

正攻法で書くと、こんな感じです.

```php
<?php
$today = Peach_DT_Date::now();
$last  = $today->set("date", $today->getDateCount());
echo $last; // "2013-06-30"
```

または「来月の 1 日の前日」という考え方で記述することもできます.

```php
<?php
$today = Peach_DT_Date::now();
$last  = $today->set("date", 1)->add("month", 1)->set("date", 0);
echo $last; // "2013-06-30"
```

### 翌月はじめの日付

先月はじめの日付と同様の考え方です.

```php 
<?php
$today = Peach_DT_Date::now();
$next  = $today->set("date", 1)->add("month", 1);
echo $next; // "2013-07-01"
```

または

```php 
<?php
$today     = Peach_DT_Date::now();
$nextMonth = $today->get("month") + 1;
$next      = $today->setAll(array("month" => $nextMonth, "date" => 1));
echo $next; // "2013-07-01"
```

さらにこんな書き方も出来ます.

```php 
<?php
$today = Peach_DT_Date::now();
$next  = $today->set("date", $today->getDateCount() + 1);
echo $next; // "2013-07-01"
```

この方法では以下のように内部状態が変化し, 結果的に来月 1 日の日付が取得できます.

1. 2013-06-06 (今日の日付を取得)
1. 2013-06-31 (「日」のフィールドに 今月末の日付に +1 したものをセット)
2. 2013-07-01 (6/30 の翌日ということで自動的に変換される)

## 詳細について

より詳しい使い方や仕様は http://trashtoy.github.io/peach/li_DT.html にあります.
Windows で node.js を使う２

# Windows で node.js を使う２

[Windows で node.js を使う](http://qiita.com/items/44c4e0fcbbe3a86b881a) のつづき

## 問題点

このままだとコマンドプロンプトを起動するたびに

```
nvm use v0.10.8
```

とかやらないといけないので Linux 版みたいに 

```
nvm alias default v0.10.8
```

みたいにはできないものかと。

## 解決

%HOME%\.nvmw\nvmw.bat を覗いてみる
nvm use では何をやっているか？

```以下の環境変数を設定
NODE_VERSION=v0.10.8
NODE_HOME=%NVMW_HOME%%NODE_VERSION%
NVMW_CURRENT=v0.10.8
PATH=%NVMW_HOME%;%NVMW_HOME%\v0.10.8;%PATH%
```

なのでとりあえず以下を設定すればいいと思う。

```
REM NVMWのフォルダ（最後に\をつけておこう）
SETX /M NVMW_HOME "%HOME%\.nvmw\"

REM 使用するnodeのバージョン
SETX /M NVMW_CURRENT "v0.10.8"

REM NODEのパス
SETX /M NODE_HOME "%NVMW_HOME%%NVMW_CURRENT%"

REM NVMWとNODEにパスを通す
SETX /M PATH "%NVMW_HOME%;%NODE_HOME%;%PATH%"
```
[CentOS]redisインストール

# Redis install

**Install Procedure**

```terminal
# cd /usr/local
# wget http://redis.googlecode.com/files/redis-2.6.10.tar.gz
# tar xzf redis-2.6.10.tar.gz
# cd redis-2.6.10
# make
# make install
```

**サーバ起動**

```terminal
${REDIS_PATH}/src/redis-server
```

**クライアント起動**

```terminal
${REDIS_PATH}/src/redis-cli

#確認
redis> set hoge fuga
OK
redis> get hoge
"fuga"
PDFをアイコンに使う

ブログ記事を書きました。

http://wowdev.jp/?p=177

```objc:
#import <UIKit/UIKit.h>
 
@interface UIImage (PDF)
+ (UIImage *)imageWithContentsOfPDF:(NSString *)pdfPath width:(int)width;
+ (UIImage *)imageWithContentsOfPDF:(NSString *)pdfPath height:(int)height;
@end
```

```objc:
#import "UIImage+PDF.h"
#import &lt;QuartzCore/QuartzCore.h&gt;
#import "UIImage+PDF.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIImage (PDF)
+ (UIImage *)imageWithPDFDocument:(CGPDFDocumentRef)pdfDocument scale:(float)scale page:(int)pageNumber
{
    CGPDFPageRef page = CGPDFDocumentGetPage(pdfDocument, pageNumber);
 
    CGRect boxRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
    int width = (int)roundf(boxRect.size.width * scale);
    int height = (int)roundf(boxRect.size.height * scale);
 
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, 0.0, height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextScaleCTM(context, scale, scale);
    CGContextDrawPDFPage(context, page);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
 
    return image;
}
+ (UIImage *)imageWithContentsOfPDF:(NSString *)pdfPath width:(int)width
{
    if(pdfPath == nil)
        return [[UIImage alloc] init];
 
    NSURL *url = [NSURL fileURLWithPath:pdfPath];
    CGPDFDocumentRef pdfDocument = CGPDFDocumentCreateWithURL((__bridge CFURLRef)url);
    if(pdfDocument == NULL)
        return [[UIImage alloc] init];
 
    CGPDFPageRef page = CGPDFDocumentGetPage(pdfDocument, 1);
    if(page == nil)
        return [[UIImage alloc] init];
 
    CGRect boxRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
    float scale = (float)width / boxRect.size.width;
 
    UIImage *image = [UIImage imageWithPDFDocument:pdfDocument scale:scale page:1];
    CGPDFDocumentRelease(pdfDocument);
    pdfDocument = NULL;
 
    return image;
}
+ (UIImage *)imageWithContentsOfPDF:(NSString *)pdfPath height:(int)height
{
    if(pdfPath == nil)
        return [[UIImage alloc] init];
 
    NSURL *url = [NSURL fileURLWithPath:pdfPath];
    CGPDFDocumentRef pdfDocument = CGPDFDocumentCreateWithURL((__bridge CFURLRef)url);
    if(pdfDocument == NULL)
        return [[UIImage alloc] init];
 
    CGPDFPageRef page = CGPDFDocumentGetPage(pdfDocument, 1);
    if(page == nil)
        return [[UIImage alloc] init];
 
    CGRect boxRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
    float scale = (float)height / boxRect.size.height;
 
    UIImage *image = [UIImage imageWithPDFDocument:pdfDocument scale:scale page:1];
    CGPDFDocumentRelease(pdfDocument);
    pdfDocument = NULL;
 
    return image;
}
@end
```
XIBやストーリーボードを使わずにEmpty Projectに画面を１つ追加するには

1. [New Project]->
    [Empty Project]

    プロジェクトがつくられ、**AppDelegate.h**と**AppDelegate.m**ができる。

2. [New File]->
    [UIViewCotroller subclass]->
    [class名]**ViewController1**
    [with XIB]**チェックを外す**

    プロジェクト内に**ViewController1.h**と**ViewController1.m**ができる。

3. コードを書く

    まず表示させる画面をつくる

```objc:ViewController1.m
#import "ViewController1.h"

@implementation ViewController1

〜略〜

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    UILabel* label = [[[UILabel alloc] initWithFrame:self.view.bounds] autorelease];
    label.text = @"Hello, world!";
    label.textAlignment = UITextAlignmentCenter;
    label.backgroundColor = [UIColor whiteColor];
    label.textColor = [UIColor blackColor];
    label.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.view addSubview:label];
}

〜略〜
```

4. コードを書く

    次にアプリケーションから先ほど作成した画面を呼び、自身のビューに追加する

```objc:AppDelegate.h
#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    UIViewController* viewController1_;
}

@property (strong, nonatomic) UIWindow *window;

@end
```

```objc:AppDelegate.m

〜略〜

- (void)dealloc
{
    [viewController1_ release];
    
    [_window release];
    [super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.

    viewController1_ = [[ViewController1 alloc] init];
    [self.window addSubview:viewController1_.view];
    [self.window makeKeyAndVisible];
    return YES;
}

〜略〜

```

これで以下のような画面が表示される。

![スクリーンショット（2013-06-06 12.38.24）.png](https://qiita-image-store.s3.amazonaws.com/0/12939/dc67f407-5d88-68df-9e91-86de68b5f8b3.png)

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
iOS 実機で擬似的にメモリ警告を発生させる方法の模索

iOS シミュレータには「メモリ警告をシミュレート」という機能があるが、実機でも同様にメモリ警告を擬似的に発生させるにはどうすれば良いか考えた。

巨大な NSData 等を作ってメモリを消費するという力技もあるらしいが、それはちょっと怖い。

まず試したのは、自分で `UIApplicationDidReceiveMemoryWarningNotification` を通知してみること。だがこれはうまくいかなかった。残念。

次に考えたのはメモリ警告時に実行されるプライベートメソッドがどこかにあるだろうかということで、それを調べるために適当な ViewController の `didReceiveMemoryWarning` にブレークポイントを仕掛けて `bt`

![breakpoint.png](https://qiita-image-store.s3.amazonaws.com/0/3603/cd506bf3-89af-6c8a-dbe8-93b023b5b896.png)

```shell-session:Console
2013-06-05 23:24:08.117 MyApp[5054:12203] Received memory warning.
2013-06-05 23:24:08.118 MyApp[5054:12203] -[MyViewController didReceiveMemoryWarning]

(lldb) bt
* thread #1: tid = 0x1f03, 0x0012fb1d MyApp`-[MyViewController didReceiveMemoryWarning] + 109 at MyViewController.m, stop reason = breakpoint 2.1
    frame #0: 0x0012fb1d MyApp`-[MyViewController didReceiveMemoryWarning] + 109 at MyViewController.m
    frame #1: 0x016cf60d UIKit`-[UIViewController _didReceiveMemoryWarning:] + 33
〜略〜
    frame #5: 0x01f0b19a Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:] + 98
    frame #6: 0x01f17b03 Foundation`-[NSNotificationCenter postNotificationName:object:] + 55
    frame #7: 0x0160ecf4 UIKit`-[UIApplication _performMemoryWarning] + 91
    frame #8: 0x0160ee00 UIKit`-[UIApplication _receivedMemoryNotification] + 180
〜略〜
    frame #18: 0x01604626 UIKit`UIApplicationMain + 1163
〜略〜
```
長いので一部略。

それっぽいものを発見：
`[UIApplication _performMemoryWarning]`
`[UIApplication _receivedMemoryNotification]`
とりあえず上のメソッドをセレクタで無理矢理呼び出してみる。

```objc:MyAppDelegate.m
- (void)simulateMemoryWarning
{
	UIApplication *app = [UIApplication sharedApplication];
	if ([app respondsToSelector:@selector(_performMemoryWarning)])
		[app performSelector:@selector(_performMemoryWarning)];
}
```

適当なところから `simulateMemoryWarning` を実行したら、期待通り先ほどの `didReceiveMemoryWarning` のブレークポイントに引っかかった。ちゃんと ViewController までメモリ警告の通知が行っている模様。

とりあえずめでたしめでたし？
ウェブからの画像取得処理をテスト内で用いる

例として、[Googleのロゴ画像](http://www.google.com/images/logos/ps_logo2.png)の取得をテストします。
画像は該当のURL( http://www.google.com/images/logos/ps_logo2.png )から予め手動で取得し`spec/support/files`の下に置いておきます。

```rb:test_spec.rb
context "ウェブから画像を取得する時" do 
  before do
     @url = "http://www.google.com/images/logos/ps_logo2.png"
     path = Rails.root.join("spec/support/files", "ps_logo2.png")
     FakeWeb.register_uri(:get, @url,
                          body: Rack::Test::UploadedFile.new(path),
                          content_type: "image/png")
  end
  # 以下略
```

こうしておけば、テストの中で通常のコードで使うのと同じ形で`@url`を参照できます。
bodyに`Rack::Test::UploadedFile.new(path)`を渡すのが肝ですね。

参考：[Stub a image url and return an image](http://stackoverflow.com/questions/11688777/stub-a-image-url-and-return-an-image/12540428#12540428) 

P.S. 
以下のgemが必要になります。

```bash:
$ gem install rack-test
$ gem install fakeweb
```
Markdownチートシートを別ウィンドウで開いて欲しい

投稿する際に　QuiitaMarkdown記法に慣れていないためチートシートを見ながら書いているのですが、編集画面の「Quiita Markdown?」リンクが同一ウィンドウで開くため非常に使いづらいです。
Ctrlクリックすれば済む話なのですが、出来れば最初から別ウィンドウで開いて欲しいです。
CCSpriteFrame内の別画像に切り替える

cocos2d-xでCCSpriteFrame を使って初期化したCCSpriteの画像を別のものに変更したい場合、setTextureでは表示が更新されなかったので、調べた結果をメモ。

このような場合、setTextureRect()とsetDisplayFrame()でスプライトフレーム内の参照位置を更新することで切り替えが可能。
特にCCSpriteBatchNodeと組み合わせる場合、同一SpriteFrame内での切り替えになりますので、このやり方が必要になるかも。

```cpp:

CCSprite *sprite;

// SpriteFrameで初期化
sprite = CCSprite::spriteWithSpriteFrameName("hoge.png");

・
・
色々な処理
・
・

//SpriteFrameの画像を変更する
 
CCSpriteFrame *frame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("fuga.png");
sprite->setTexture(frame->getTexture());
sprite->setTextureRect(frame->getRect());
sprite->setDisplayFrame(frame);

```

以上
GitHubのhttps経由cloneに失敗する場合の対応(EV SSL用ルート証明書追加)

## おかしかった点

cloneしようとするとエラーになりました

```bash
# git clone https://github.com/XXXXX/YYYYY.git
Cloning into 'YYYYY'...
error: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed while accessing https://github.com/XXXXX/YYYYY.git/info/refs
fatal: HTTP request failed
```

SSL証明書が足りてないようだ

## 参考サイト

ほぼ以下の記事どおりで対応。wget自体エラーになるのを若干修正した感じ
http://d.hatena.ne.jp/tetsuyai/20110924/1316877887



## 対応

証明書を取得

```bash
#wget --no-check-certificate -P /tmp https://www.digicert.com/testroot/DigiCertHighAssuranceEVRootCA.crt
```

インストール
この辺りは環境によって変わるようなので適当に読みかえる

```bash
#locate libcurl.so
/usr/lib/libcurl.so
/usr/lib/libcurl.so.3
/usr/lib/libcurl.so.3.0.0
/usr/lib64/libcurl.so
/usr/lib64/libcurl.so.3
/usr/lib64/libcurl.so.3.0.0
#strings /usr/lib64/libcurl.so.3 | grep bundle
/etc/pki/tls/certs/ca-bundle.crt
#cat /tmp/DigiCertHighAssuranceEVRootCA.crt >> /etc/pki/tls/certs/ca-bundle.crt
```

## 結果

```bash
# git clone https://github.com/XXXXX/YYYYY.git
Cloning into 'YYYYY'...
remote: Counting objects: 8091, done.
remote: Compressing objects: 100% (2685/2685), done.
remote: Total 8091 (delta 5563), reused 7661 (delta 5241)
Receiving objects: 100% (8091/8091), 1.84 MiB | 364 KiB/s, done.
Resolving deltas: 100% (5563/5563), done.
```

うまく行きました
Sublime Text 2の設定をDropboxで共有する

http://rdeguchi.net/?p=205

上記の記事にもあるように、Sublime Text 2は次の3つのディレクトリ

- Packages
- Installed Packages
- Pristine Packages

内のファイルで設定を行っている。

これら3つのディレクトリをDropboxで同期し、本来あるべき場所からシンボリックリンクを張ることで設定を同期することができる。

その本来あるべき場所はそれぞれ次のとおり。

- Windows： C:\Users\\(ユーザー名)\AppData\Roaming\Sublime Text 2\
- Mac： /Users/(ユーザー名)/Library/Application Support/Sublime Text 2/
- Ubuntu： /home/(ユーザー名)/.config/sublime-text-2/
[Backbone.js][prequire.js]modelの値をsingletonで引き回す && そのmodelを継承できるようにする

# やりたかったの
- backboneの```modelA```にある```defaults```を、それを継承した```modelB```と```modelC```から使いたい。
 - 複数のModelから扱われるため、```modelA```のattributeはsingletonである必要がある。
 - ※ backbonejsとrequirejsを使っている前提です

# 最初に書いてた

```js:ModelA
define(
  ["jquery", "underscore", "backbone"],
  function($, _, Backbone) {
    var ModelA = Backbone.Model.extend({
      defaults: {
        "type": "none"
      }
    });
    return ModelA;
  }
);
```
最初は```ModelA```を素直にこう書いてた。これを```ModelB```と```ModelC```で継承して、```set```や```get```をする設計にしていた。
ところが、```ModelA```の要素がsingletonでないので２つの子Modelで別のインスタンスをいじってしまう。

# 試した

```js:ModelA
define(
  ["jquery", "underscore", "backbone"],
  function($, _, Backbone) {
    return new (Backbone.Model.extend({
      defaults: {
        "type": "none"
      }
    }));
  }
);
```
これでsingletonにしたが、以下のようにはできない。
```var ModelB = ModelA.extend({});```
```var ModelC = ModelA.extend({});```


# 結局こうした
```js:ModelA
define(
  ["jquery", "underscore", "backbone"],
  function($, _, Backbone) {
  var instance = false;

    var ModelA = function() {
      var obj = Backbone.Model.extend({
        defaults: {
          "type": "none"
        }
      });

      return {
        getObj: function() {
          return obj;
        },
        getInstance: function() {
          if (! instance) {
            instance = new obj();
          }
          return instance;
        }
      }
    }

    return ModelA;
);
```
これだと以下のような形で継承できる
```var ModelB = ModelA.getObj().extend({});```
```var ModelC = ModelA.getObj().extend({});```
また、singletonにした要素を扱うときは以下のようにできる
```ModelA.getInstance().set("type", "hoge");```

まとめると子モデルはこんな感じになる

```js:ModelB
define(
  ["app/modelA"],
  function(ModelA) {
    var Model_B = ModelA.getObj().extend({
      initialize: function() {
        this.parent = ModelA.getInstance();
      },
      doSomething: function() {
        this.parent.set("type", "hoge");
        console.log(this.parent.get("type")); // hoge
      }
    });

    return ModelB;
  }
);
```

これで一応当初やりたかったことはできたけど、```getObj```とか```getInstance```とか限りなくダサい。
それに、なんとなくバッドノウハウのような気がするので、うまいやり方があればぜひ教えてほしい。
python データーを圧縮してsqliteへ書き込む

```Python:compress.py
#!/usr/bin/python
# -*- encoding: utf-8 -*-
import sys

import zlib
from base64 import binascii

#-----------------------------------------------------------
# COMPRESS
#-----------------------------------------------------------
def z_compress(data):

    #return buffer(zlib.compress(data))
    return zlib.compress(data)

#-----------------------------------------------------------
# DECOMPRESS
#-----------------------------------------------------------
def z_decompress(data):

    return zlib.decompress(data)

#-----------------------------------------------------------
# B2A
#   Binary >> Base64 Ascii
#-----------------------------------------------------------
def b2a(data):

    return binascii.b2a_base64(data)

#-----------------------------------------------------------
# A2B
#   Base64 Ascii >> Binary
#-----------------------------------------------------------
def a2b(data):

    return binascii.a2b_base64(data)

#-----------------------------------------------------------
# TEST
#-----------------------------------------------------------
def test():

    data = '1234567890123456789012345678901234567890123456789012345678901234567890'

    print 'ROW DATA:   %3d bytes' % sys.getsizeof(data)

    data = z_compress(data)
    print 'COMPRESS:   %3d bytes' % sys.getsizeof(data)

    data = b2a(data)
    print 'B2A:        %3d bytes' % sys.getsizeof(data)

    data_lists = sqlite_test(data)

    for data in data_lists:
        print 'ROW_DATA:   %3d bytes' % sys.getsizeof(data)

        data = a2b(data)
        print 'A2B:        %3d bytes' % sys.getsizeof(data)

        data = z_decompress(data)
        print 'DECOMPRESS: %3d bytes' % sys.getsizeof(data)

def sqlite_test(data):

    import sqlite3

    #--- sqliteに接続
    con = sqlite3.connect(":memory:")
    cur = con.cursor()

    #--- テーブル有無確認
    sql = 'SELECT COUNT(*) FROM sqlite_master WHERE type="table" AND name=?'
    cur.execute(sql, ('test',))

    #---テーブルがない時作成
    if not cur.fetchone()[0]:
        sql = 'CREATE TABLE test(data TEXT)'
        con.execute(sql)

    #--- データー突込む
    sql  = 'INSERT INTO test (data) VALUES (?)'
    con.execute(sql, (data,))
    con.commit()

    #---データー取得
    sql = 'SELECT * from test'
    cur.execute(sql)
    row_lists = []
    for row in cur:
        row_lists.append(row[0])

    #---データーを返す
    return row_lists

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

結果

```
ROW DATA:   110 bytes
COMPRESS:    61 bytes
B2A:         69 bytes
ROW_DATA:   168 bytes
A2B:         61 bytes
DECOMPRESS: 110 bytes
```