OmniAICreator/Qiita-1.07M huggingface dataset:
vimでTypeScriptの補完をできるようにする


今まではWebstormを使っていたけど補完がvimでもできたので
vimに出戻りました。

```
NeoBundle 'https://github.com/leafgarland/typescript-vim.git'
NeoBundle 'https://github.com/clausreinke/typescript-tools.git'
```

NeoBundleでこの2つをインストールします

``` bash
npm install -g typescript-tools
```

nodeにtypescript-toolsをインストールします

以上で準備完了です。


あとはvimでtypescriptファイルを開いて
補完情報を渡してくれるtssを起動させます。
開いたファイルをターゲットに起動するには

```
:TSSstarthere
```
コマンドを実行します。
これで補完してくれるようになります。
tsファイルを読み込み直したいときは

```
:TSSreload
```
を実行します。

この状態でCTRL-x+CTRL-oを押せば補完が効くようになります。
軽快で便利。
関数に名前を付ける簡単な IDC スクリプト

[関数に名前を付ける簡単な IDAPython スクリプト](http://qiita.com/softgate/items/74c6eda0e1a9ad58ee33) の IDC スクリプト版です。

```c
static name_custom_func()
{
  auto newName = AskStr("FuncName", "Input function name");
  if (newName != 0)
  {
    auto func = GetFunctionAttr(ScreenEA(), FUNCATTR_START);
    if (func != -1)
    {
      auto newFuncName = "zzz_" + newName;
      Message("Renaming %s to %s\n", GetFunctionName(func), newFuncName);
      MakeNameEx(func, newFuncName, SN_PUBLIC);
    }
  }
}
```

また、``ida.idc`` に、上記の関数と一緒に、次のようなホットキー定義を書いておけば、``Ctrl-N`` でスクリプトを起動することが出来ます。

```c
static main(void)
{
  AddHotkey("Ctrl-N", "name_custom_func");
}
```
WEBサイトのURLがFacebookでシェアorいいねされた場合の挙動(OGP)

WEBサイトのURLがFacebook上でシェア、または、サイトに設置された[いいね]ボタンを押された際、Facebookはどのように下記の例のようなキャプチャを表示しているかというと、

![スクリーンショット 2014-02-17 21.55.16.png](https://qiita-image-store.s3.amazonaws.com/0/35733/606161a7-af6a-9f14-f25c-aa11376c7dac.png)

Facebookのクローラーが裏側でサイトにアクセスしに来ています(自分でサイトを作っている場合は、WEBサーバのアクセスログをtailしながら確認してみると良く分かる)。
※ただし同じURLは一定期間、Facebook側でキャッシュする模様。

私が試した際のFacebookクローラーのユーザエージェントは次の通り。

```
facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
```

もしかしてFacebook PC版/スマホ版/アプリ版とかで違うのかも？

自分でサイトを作っている場合、Facebook向けにいい感じにキャプチャ(キャプチャという呼び方でいいのか？)されるようにするには、各ページのHTMLでOGP用のmetaタグで適用される画像や文言を指定します。

OGPの公式サイト：http://ogp.me

スクリプト言語等で動かしている動的なサイトの場合は、各ページでふさわしい画像や文言を設定すればOKなのですが、「面倒なのでサイト内のどのURLがシェアされても一律で同じ表示でいいよ」という場合は、全ページに同じmetaタグを仕込むか、もしくはWEBサーバがApacheであれば、次のようにFacebookクローラーを判定して、クローラー用のページへ飛ばしてしまうという方法があります。

```apache:.htaccess
RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} facebookexternalhit
RewriteRule .* /page_for_facebook.html [L]
```

`page_for_facebook.html` にOGPタグだけのHTMLを用意しておけば、どのURLがシェアされた場合でもこのOGPで指定されたキャプチャが適用されます。
Raspberry Pi買ってやった事(まだ途中)

やっと到着したRaspberry Pi.
いろいろ調べながらだったので忘備録的に書いておく。

1. OSイメージをSDカードにコピー

   http://www.raspberrypi.org/downloads
   今回は有線LANが空いてたのでNOOBS Lite (network install only)を使用。
　　ダウンロードしたzipを解凍して、解凍されて出来たディレクトリの中にあるファイルをSDカードのroot直下へコピー

2. SDカードを指し、マウスとキーボード、ディスプレイ、LANケーブルを接続後に電源(kindle paperwhiteのUSBケーブルを使用)を接続すると起動。

3. 起動と同時にOSイメージのダウンロード開始。。。しばし待つ。

4. インストール完了後に初期設定されているID/Passwordにてログイン。

5. デフォルトLangを日本語(UTF-8)に設定すると設定画面が文字化けするので、一度設定画面を抜けライブラリインストール。
    (1)tabキーで<finish>を選択しenter
    (2)ID/Passwordを入力しログイン
    (3)ライブラリ(jfbterm)の導入 -> sudo aptitude -y install jfbterm
    (4)コマンドプロンプトに戻ったら -> jfbterm
    (5)コマンドプロンプトに戻ったら -> sudo raspi-config
　これで設定画面が日本語化出来た。こちらを参考にしました。
　http://www.designspark.com/nodes/view/type:knowledge-item/slug:jpn-quick-start-guide-supplementary
シェルスクリプトにファイルを添付する

シェルスクリプトにバイナリファイルを添付して、添付ファイルの展開→インストールなんてことをやってるのを時々見るので、実現する方法を書く。

まず、添付するバイナリファイルと、下記のようなバイナリとくっつくスクリプトを用意する。

```bash
$ ls
main.sh  nyan.tar.xz
$ tar Jtf nyan.tar.xz
nyan/
nyan/nya-n.sh
```

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

sep='#---FILE---'

(
    # 添付ファイルまで読み進める
    while read line
    do [[ "$line" = "$sep" ]] && break
    done

    # 添付ファイルを展開する
    tar Jx
) < $0

# 添付ファイルを実行
nyan/nya-n.sh # nyaaaaaan と出力されるだけのスクリプト

exit 0
#---FILE---

```

`main.sh` の最終行は、空行である必要がある。

上記の2ファイルを結合する:

```bash
$ cat main.sh nyan.tar.xz > attached_file_main.sh
```

これで完成。

試しに実行してみましょう:

```bash
$ bash attached_file_main.sh
nyaaaaaan
$ ls -RF
.:
attached_file_main.sh  main.sh  nyan/  nyan.tar.xz

./nyan:
nya-n.sh*
```

ファイル展開と、展開後の実行が成功しているのが確認できる。
Dialogのボタンそれぞれにclassを設定する

jquery-uiのdialogの複数のボタンに別々のclassを追加。

dialogは複数のボタンが作成できるが、
個別にclassを当てはめたい場合、openイベントでaddClassしたりする例もみられ、
自分もそのようにしてた。
たとえば↓

```js:javascript-例えば
$(function() {
	//ダイアログ
	$('#dialog').dialog({
		title: 'ボタンに個別にクラスを設定する',
		buttons:[
			'更新する': function() {
				//ボタンを押したときの処理
			},
			'削除する': function() {
				//ボタンを押したときの処理
			},
			'閉じる': function() {
				$(this).dialog('close');
			}
		],
		open: function() {
			//ここで各ボタンにaddClassなどで属性を設定
		}
	});
});
```

が、上記の様にせずとも、下記の記述で期待どおりの表現ができた。

```js:javascript-できた!

$(function() {
	//ダイアログ
	$('#dialog').dialog({
		title: 'ボタンに個別にクラスを設定する',
		buttons:[
			{
				text: '更新する',
				class:'btn-update',
				click: function() {
					//ボタンを押したときの処理
				}
			},
			{
				text: '削除する',
				class:'btn-delete',
				click: function() {
					//ボタンを押したときの処理
				}
			},
			{
				text: '閉じる',
				class:'btn-close',
				click: function() {
					$('#dialog').dialog('close');
				}
			}
		]
	});
});
```

coffeescript+もうちょっと実用的に。
定義を別でやっとけばボタンの位置入れ替えとかが楽か。

```coffeescript:coffeescript-できた!

#ボタンの定義
updateButton =
	text: '更新する'
	class: 'btn btn-update'
	click: ->
		#ボタンを押したときの処理
deleteButton =
	text: '削除する'
	class: 'btn-delete'
	click: ->
		#ボタンを押したときの処理
closeButton =
	text: '閉じる'
	class: 'btn-close'
	click: ->
		$('#dialog').dialog 'close'
$ ->
	#ダイアログ
	$('#dialog').dialog
		title: 'ボタンに個別にクラスを設定する'
		buttons:[
			updateButton
			deleteButton
			closeButton
		]
```

***

↓textをhtmlにするとタグが使えるのでfontawesomeなどのアイコンをつけたりもできたのでメモとして追記(2017.02.15)

```javascript:javascript
{
    html: '<i class="fa fa-close"></i> 閉じる',
    class: 'btn btn-default',
    click: function(){
        $(this).dialog('close');
    }
}
```

参考:

[jQuery UI Dialog] (https://jqueryui.com/dialog/)
[jQuery UI Dialog option-buttons] (http://api.jqueryui.com/dialog/#option-buttons)
XAMPP環境にPHP5.6.0alphaをインストール

LinuxにPHP5.6入れてる人ってのは既にいっぱいいますが、Windowsでやってる人はいないだろうから備忘録。

XAMPPはWindows上に一括でPHP環境を設置できてとても便利ですが、欠点としては最初からPHPバージョンが決まっているところです。
http://www.apachefriends.org/jp/index.html
PHP5.6.0のα版を試したいんだよ、とか思ってもα版なんて普通は用意されません。
なので人力で入れてみましょう。

実はXAMPPはApacheとかPHPとかその他関連ソフトウェアをまとめてインストールしてくれるというだけなので、PHPを最新版にしたければ単にPHPを差し替えればいいです。

まずWindows版PHP公式から、欲しいバージョンのPHPを拾ってきます。
http://windows.php.net/qa/
今回は5.6が試したかったので「PHP 5.6 (5.6.0alpha2) VC11 x86 Thread Safe」です。

XAMPPディレクトリにあるphpディレクトリの名前を適当に変えます。

解凍したPHPを今まであったphpディレクトリの場所に持ってきます。

これでPHPの入れ替え完了です。
Apacheを起動してphpinfo()を試してみましょう。
簡単ですね。

しかしデフォルトのPHPは本当に最低限のものしか入ってない状態です。
XAMPPがよしなにやってくれていたPHPの設定はありません。
なにしろmb_convert_encoding()すら無いので実用に耐えません。
というかphp.iniがありません。

php.iniを作りましょう。
まず「php.ini-development」をコピーして「php.ini」に改名します。
その後でXAMPPに入っていたphp.iniの項目をコピーしていくとよいでしょう。
不要な項目が多々あるので、まるごと上書きはやめときましょう。

最低限設定すべきところは
include_path
extension_dir
error_log
upload_tmp_dir
date.timezone
session.save_path
mbstring.**
あたりでしょうか。

あとはextensionから、必要なモジュールを有効にしましょう。
php_mbstring、php_pdo_mysql、php_mysqli、php_curlあたりは最低限で、それ以外は必要に応じてというかんじでしょう。

あとはApacheを再起動すれば終了。
これでPHP5.6.0が使えるようになりました。
Wordpress.comのREST APIで投稿済みエントリーを更新してみる

手順
----

1. Client idとClient Secretを発行してもらう
2. access tokenを取得する
3. REST APIを使う


### Client idとClient Secretを発行してもらう ###

1. https://developer.wordpress.com/apps/ から `Create New Application` する
2. フォームを埋める

Redirect URIについて:
access token取得作業中、wordpress.comからリダイレクトされる先を指定します。
リダイレクトを受ける事ができなくとも、access tokenを取得する事は可能です。(文末のsinatraコードを使えば、この辺の作業は楽になります)
リダイレクトが受けられない場合は、存在しないURIを記載しておきましょう。(自己責任)


### access tokenを取得する ###

1. `https://public-api.wordpress.com/oauth2/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&response_type=code` にブラウザでアクセス
2. アプリケーション認証画面でAuthorizeする
3. `REDIRECT_URI+code=XXXX`というURIにリダイレクトされる
4. `https://public-api.wordpress.com/oauth2/token`へ`上記のcode`等をPOSTし、access tokenを取得する

Redirect URIについて:
3の時、存在しないURIが指定されていた場合は、当然ブラウザアクセスができません。
しかし、ブラウザのロケーションバーの`code`が取得できれば、4でPOSTする事は可能です。


### REST APIを使う ###

POST_IDの内容を、標準入力からの入力内容で上書きします

```ruby
require 'net/http'
require 'uri'
require 'date'

access_token = ACCESS_TOKEN
site = SITE_NAME
post_id = POST_ID

token_type = 'bearer'
bd = {content: STDIN.read, date: DateTime.now.iso8601}

uri = URI.parse("https://public-api.wordpress.com/rest/v1/sites/#{site}/posts/#{post_id}?pretty=1")
req = Net::HTTP::Post.new(uri.request_uri)
req['authorization'] = "#{token_type} #{access_token}"
req.set_form_data(bd)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
#http.set_debug_output STDERR
res = http.start{|h| h.request(req)}
STDERR.puts res.body
```


access token取得用 sinatra
--------------------------

文中 __access tokenを取得する__ を行うSinatraコードです

```ruby
require 'sinatra'
require 'net/http'
require 'uri'

# lookup on https://developer.wordpress.com/apps/
bd = { client_id: CLIENT_ID,
    client_secret: CLIENT_SECRET,
    redirect_uri: 'http://localhost:4567/oauth2'}

get '/' do
  "https://public-api.wordpress.com/oauth2/authorize?client_id=#{bd[:client_id]}&redirect_uri=#{bd[:redirect_uri]}&response_type=code"
end

get '/oauth2' do
  bd.merge!(code:params[:code], grant_type:'authorization_code').to_s
  uri = URI.parse('https://public-api.wordpress.com/oauth2/token?pretty=1')
  req = Net::HTTP::Post.new(uri.request_uri)
  req.set_form_data(bd)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.set_debug_output $stderr
  res = http.start{|h| h.request(req)}
  res.body
end
```
rubypressを使うときにハマったところ(タグとカテゴリの部分)メモ。


Rubyを使って、WordPressを操作したい場合、[rubypress](https://github.com/zachfeldman/rubypress)を使うと便利です。

投稿や記事の取得などの基本的な動作は

[rubypressでWordPressの情報をRubyから操作する | mah365](http://blog.mah-lab.com/2014/01/30/rubypress-wordpress/)

や[README](https://github.com/zachfeldman/rubypress/blob/master/README.md)に載っています。

ここでは自分が利用した際にハマったところを記載します。

#rubypressでのタグ/カテゴリの取得

タグやカテゴリは```getTerms()``` で取得することができます。タグの形式は、[XML-RPC WordPress API/Taxonomies « WordPress Codex](http://codex.wordpress.org/XML-RPC_WordPress_API/Taxonomies#wp.getTerms)が詳しいです。

taxonomyの部分でタグかカテゴリか判断しているらしく、タグは、```post_tag```, カテゴリは ```category```という風に区別されています。

rubypressのデフォルトでは、```getTerms()```を使用すると、[カテゴリだけを取得するようになっている](https://github.com/zachfeldman/rubypress/blob/master/lib/rubypress/taxonomies.rb#L24)ので、optionsで指定する必要があります。

#rubypressでタグ/カテゴリを付けて投稿する場合

タグとカテゴリを付けて投稿する場合、```term_id```という一意のidを指定してから投稿します。 (参考: http://blog.include-soft.com/215) その際、カテゴリとタグを区別する場合はその指定をします。タグ/カテゴリの指定をするときは、Arrayの形で渡すことにします。


わかりにくいと思うので、コードを貼り付けておきます。

```ruby:
wp = Rubypress::Client.new(
 host: "WordPressのURL",
 username: "ユーザ名",
 password: "パスワード"
 )

wp.newPost(
	blog_id: "ブログのID",
	content:{
	 post_status: 'publish', #=> publish: 公開, draft: 下書き
	 post_date: Time.now,
	 post_content: '記事の内容',
	 post_title: '記事のタイトル',
	 terms: {
	 category: 'カテゴリで指定するterm_id', #=>[2,3...]のような感じで指定する
	 post_tag: 'タグで指定するterm_id', #=> [1,4...]のような感じで指定する
	 }
	}
)

```
かわいい PowerShell プロンプト

PowerShell のウインドウは全体的に、あんまりかわいくないな（きれいに全画面表示できないところとか）
と感じていたので、プロンプトを、かわいくしてみる。
correct？ 知らない子ですね。

# 顔文字

```ps1
function Prompt {
    if ($?) {
        Write-Host "(*'-')" -NoNewLine -ForegroundColor "Green"
        return "> "
    } else {
        Write-Host "(*;-;)" -NoNewLine -ForegroundColor "Red"
        return "> "
    }
}
```

![2014-02-17_21h01_58.png](https://qiita-image-store.s3.amazonaws.com/0/24596/8e23cac4-7140-8bac-f3b1-42fa72cbc5a1.png)

# アイコンっぽい感じ

```ps1
function Prompt {
    if ($?) {
        Write-Host "☀" -NoNewLine -ForegroundColor "Red"
        return "> "
    } else {
        Write-Host "☂" -NoNewLine -ForegroundColor "Cyan"
        return "> "
    }
}
```

![weather.png](https://qiita-image-store.s3.amazonaws.com/0/24596/0abfb750-b53b-b7e3-e03a-36db524f644a.png)

# see also

* [Zshをかわいくする.zshrcの設定 - Qiita](http://qiita.com/kubosho_/items/c200680c26e509a4f41c)
* [zshはかわいい on Twitpic](http://twitpic.com/72hxqn)
【ios7版】GameCenterのランキング表示、スコア送信を実装する


ios7からGameCenterの実装方法が少々変わったようで、ブログなどに書いているGameCenterの実装方法を試してみても、
ios7では非推奨の警告が出る部分が多かったので、コードを書き直してみました。

リーダーボードの設定などはiTunes connectであらかじめ済ませておいてください。
参考:<a href="http://tf.hateblo.jp/entry/2013/09/02/233857" title="【iPhoneアプリ】アプリをGame Center対応にする方法（前編: iTunes Connectでの設定編） - 夏までにiPhone アプリつくってみっか！">【iPhoneアプリ】アプリをGame Center対応にする方法（前編: iTunes Connectでの設定編） - 夏までにiPhone アプリつくってみっか！</a>




##準備
1,Gamekitフレームワークをプロジェクトに追加
2,Gamekitフレームワークを.hファイルでimport
3,GKGameCenterControllerDelegateを実装

```.h

#import <GameKit/GameKit.h>

@interface HogeViewController : UIViewController<GKGameCenterControllerDelegate>

```

##ログイン認証

ログインしているかどうかの確認をするauthenticateLocalPlayerを作成して、ViewDidLoadとかviewWillAppearとかAppDelegateなどで読み込ませる。


```.m
/**
 * GameCenterにログインしているか確認処理
 * ログインしていなければログイン画面を表示
 */
- (void)authenticateLocalPlayer
{
    GKLocalPlayer* player = [GKLocalPlayer localPlayer];
    player.authenticateHandler = ^(UIViewController* ui, NSError* error )
    {
        if( nil != ui )
        {
            [self presentViewController:ui animated:YES completion:nil];
        }

    };
}


/**
 * 画面を読み込む際の処理
 */
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self authenticateLocalPlayer];
}

```

##スコア送信
if文でGameCenterにログインしているかどうか確認してログインしていればスコアを送信する。
書き換える部分は:MY_LEADERBOARD_ID, HIGH_SCOREの2点。
エラーの場合はエラーの旨のAlertを表示させると良い感じだと思います。

※スコアで少数の値を送信する場合は値の渡し方に少し注意する必要があるので下記の記事をどうぞ。
参考：<a href="http://paranishian.hateblo.jp/entry/objc/gamecenter-leaderboard-float" title="Game CenterのLeaderboardで小数（float型）のスコアを送信する - タブレット上のcron">Game CenterのLeaderboardで小数（float型）のスコアを送信する - タブレット上のcron</a>

少数値のまま送信するのではなく、*10,*100して整数値に直して送信しないといけないみたいですね。


```.m
if ([GKLocalPlayer localPlayer].isAuthenticated) {
            GKScore* score = [[GKScore alloc] initWithLeaderboardIdentifier:MY_LEADERBOARD_ID];
            score.value = HIGH_SCORE;
            [GKScore reportScores:@[score] withCompletionHandler:^(NSError *error) {
                if (error) {
                    // エラーの場合
                }
            }];
        }

```

##リーダーボード表示

Storyboard上でボタン作成して、showRankingと紐づけておけば、
下記コードをコピペでOKだと思います。


```.m
/**
 * ランキングボタンタップ時の処理
 * リーダーボードを表示
 */
- (IBAction)showRanking:(id)sender {
    GKGameCenterViewController *gcView = [GKGameCenterViewController new];
    if (gcView != nil)
    {
        gcView.gameCenterDelegate = self;
        gcView.viewState = GKGameCenterViewControllerStateLeaderboards;
        [self presentViewController:gcView animated:YES completion:nil];
    }
}

/**
 * リーダーボードで完了タップ時の処理
 * 前の画面に戻る
 */
- (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

```
[Ruby] Methodクラスとは

ドキュメントは[このあたり](http://docs.ruby-lang.org/ja/2.0.0/class/Method.html)を確認してください。

### Methodクラスって？

特定のレシーバと紐づいたメソッドを表現できます。

### オブジェクトの作り方

`Object#method(name)`を使って作ります。`name`はメソッド名を表す文字列もしくはシンボルです。

```rb
class MyClass
  def initialize(name)
    @name = name
  end

  def hello
    p "hello #{@name}"
  end
end

my = MyClass.new('yui')
# => #<MyClass:0x42096d8 @name="yui">

hello = my.method(:hello)
# => #<Method: MyClass#hello>
```

`hello`が`Method`オブジェクトです。

### メソッドの呼び出し

`Method#call`でメソッドを呼び出すことができます。このとき特定のレシーバと紐づいていることに注意しましょう。

```rb
hello.call
# => "hello yui"
```

この例では`my`と紐づいているため、`my@name`の`yui`が表示されます。

### Methodオブジェクトについて調べる

`Method`にはオブジェクト自身を調べるためのインスタンスメソッドがいくつか定義されています。
`Method#owner`でメソッドが定義されているclassもしくはmoduleがわかります。また`Method#receiver`で自分に紐づいているオブジェクトが分かります。

```rb
hello.owner
# => MyClass

hello.receiver
# => #<MyClass:0x42096d8 @name="yui">
```
Node.jsからMongoDBのソートや件数指定


なかなか上手く行かなかったのでメモです．

Mongooseを使ってNode.jsからMongoDBのソートや件数の指定をするにはこんな感じで書けば良いみたいです。

```
モデル名.find(検索条件,カラム指定(?),オプション, function(err, data){
	//ここに処理
});
```

###具体例
idがsampleのドキュメントを全フィールドを取得して，最新の2件を取得する

```index.js
var query = { "id": "sample" };
Post.find(query,{},{sort:{created: -1},limit:2}, function(err, data){
		if(err){
			console.log(err);
		}
		res.render('index', {data: data});
	});
```

これでdataの中身は投稿されたものの最新の2件になってると思います。
blockでコールバックを書く


いい加減、delegateばっかだと、あっちこっち読むのが大変なので書いてみた
まず、呼び出される側から。
<br />

```objectivec:BlockSample.h
#import <Foundation/Foundation.h>

typedef void (^BlockSampleCallBack)(NSArray *foo);

@interface BlockSample : NSObject
- (void)hoge:(NSString *)fuga callback:(BlockSampleCallBack)callback;
@end
```

typedefで定義してするほうが可読にいいよねってことらしい。
<br />

```objectivec:BlockSample.m
#import "BlockSample.h"

@implementation BlockSample

- (void)hoge:(NSString *)fuga callback:(BlockSampleCallBack)callback
{
	NSArray *array = @[@"りんご", @"ごりら", @"らぶらぶ"];
	if (callback) {
		callback(array);
	}	
}

@end
```
このhogeメソッドの呼び出し側で、callbackにnilを入れる事もあると思うので、
落ちないように対策はしておこう。

下記に詳しく書いてあるよ
cf.[Block引数の安全な呼び出し方](http://qiita.com/tomohisaota/items/ca09bd1bee0f3c5395a3 "Qiita")(tomohisaota)
<br />
次に呼び出し側を書く。

```objectivec:CalledBlockSample.m

// いろいろと割愛

- (void)moDMP
{
	// BlockSampleがシングルトンだったとして...
	[[BlockSample] sharedManager] hoge:@"これはテストだ" callback:^(NSArray *foo) {
		NSLog(@"アホな配列がやってくるお %@", foo);
	}];

	// って書く人もいるけど
	[[BlockSample] sharedManager] hoge:@"これはテストだ" callback:^(NSArray *foo) {}]; 

	// 僕はnilを入れるので、BlockSample.m内でcallbackを使う際にnil対策したった
	[[BlockSample] sharedManager] hoge:@"これはテストだ" callback:nil];

} 

// いろいろと割愛
```
<br />
これで忘れないかな。
Twitterのcreated_atを素敵なNSStringにした

素敵ってのはウソだけど、
TwitterのAPI使ってて遊んでて、良く忘れるのでメモ。

```
Mon Feb 17 11:36:30 +0000 2014
```

このままだと使いにくいので、

```objectivec:やってやった
- (NSString *)createdAtToString:(NSString *)dateStr
{
    NSDateFormatter *inputFormat = [[NSDateFormatter alloc] init];
    [inputFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
    [inputFormat setDateFormat:@"eee MMM dd HH:mm:ss ZZZZ yyyy"];
    NSDate *date = [inputFormat dateFromString:dateStr];
    
    NSDateFormatter *outputFormat = [[NSDateFormatter alloc] init];
    [outputFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"]];
    [outputFormat setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
    return [outputFormat stringFromDate:date];
}
```

Twitterに限らずよくある話しだけど、
ぜーんぜん、頭に残らない。
関数に名前を付ける簡単な IDAPython スクリプト

IDA での解析中、自分で名前を付けた関数が Name ビューでソートしたときにまとまって表示されるように、zzz_ というプレフィックスを関数名に付けるようにしています。

そこで、関数内のどこにカーソルが置いてあっても、zzz_ プレフィックスを付加して関数に名前を割り振る簡単な IDAPython スクリプトを作りました。

```py
from idaapi import *
from idautils import *

newFuncName = AskStr("CmdFunction", "Type function base name")
if not newFuncName is None:
    func = get_func(here())
    newName = "zzz_" + newFuncName
    Message("Renaming %s to %s\n" % (Name(func.startEA), newName))
    MakeNameEx(func.startEA, newName, SN_PUBLIC)
```
画像ファイルの形式を変更する


imageIOを使ってpngやgifをjpegに変更するプログラム。

```java
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;

String from = "変換前の画像パス";
String to   = "変換後の画像パス";
try {
    BufferedImage image = ImageIO.read(new File(from));
    BufferedImage tmp = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
    Graphics2D off = tmp.createGraphics();
    off.drawImage(image, 0, 0, Color.WHITE, null);
    ImageIO.write(tmp, "jpg", new File(to));
} catch (Exception e) {
    System.out.println("error");
}
```

##おまけ

ファイルの拡張子を変える方法(jpgに変更する例)。

```java
import org.apache.commons.io.FilenameUtils;

String from; //変更前のパス
String to;   //変更後のパス

String to = String.format("%s%s.%s", FilenameUtils.getFullPath(to), FilenameUtils.getBaseName(from), "jpg");
```
Google Play Services SDK のセットアップ(Android Studio)


MacBook AirにAndroid Studioを入れ、Google Play Services SDKをプロジェクトに組み込んだ時のお話。
Androidアプリの開発経験はない。

## Android Studioのインストール

ここからダウンロードして、インストールするだけ。
http://developer.android.com/sdk/installing/studio.html

Mac版のAndroid StudioはJRE6がないと起動しない模様。
MacStoreがJRE6をインストールするか聞いてくるが、インストールしてはいけない。
何回インストールしても「インストールしますか？」と聞かれることになる。
JDKをインストールした時の話はこちら↓。
[MacにJDKをインストール](http://qiita.com/ryo0301/items/3c9a02e03b4e9a41f576)

## Google Play Services SDKのセットアップ

新規プロジェクトを作成した状態。
基本的に公式ドキュメントに書いてある通り。
http://developer.android.com/google/play-services/setup.html

### SDKのインストール

Android StudioからSDKマネージャーを開く。
![sdk_manager.png](https://qiita-image-store.s3.amazonaws.com/0/379/b65e34d3-fe23-739c-be4d-5d00d21086be.png "sdk_manager.png") ←ツールバーのこれ
もしくは Tools > Android > SDK Manager を選択。

1番下のExtrasを開き **Google Play services** と **Google Repository** を選択する。
で Install Packages ボタンをポチリ。

![extras_list.png](https://qiita-image-store.s3.amazonaws.com/0/379/e57dcc3b-d6ee-a70a-a2cc-df85210e09af.png "extras_list.png")

**Google Repository** はGradleのビルドでMavenのレポジトリを利用するために必要。
らしいが、MavenもGradleもよく知らん。

### プロジェクトの設定

インストールしたSDKをプロジェクトで使えるようにする。
`build.gradle` ファイルに追記するわけだが、プロジェクト直下のファイルではなくモジュールごとのファイルを編集するので注意。

`dependencies` に `compile 'com.google.android.gms:play-services:+'` を追記する。
こんな感じになる。

```javascript:build.gradle
apply plugin: 'android'
  :
dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.google.android.gms:play-services:+'
}
```

編集・保存したらツールバーにある **Sync Project with Gradle Files** ![sync_gradle.png](https://qiita-image-store.s3.amazonaws.com/0/379/a49d0de0-fdb6-3a06-7025-495f78299a8d.png "sync_gradle.png") をポチリ。

最後に `AndroidManifest.xml` の `<application>` 要素以下に `<meta-data>` を追記する。

```xml:AndroidManifest.xml
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
```

これでSDKを使えるようになっているはず。
まだ使っていないが、起動はした。
curlでs3に直接imageをアップロードする方法

``` 
curl \
-F "key=<path_name>" \
-F "acl=public-read" \
-F "Policy=<policy>" \
-F "Signature=<signature>" \
-F "AWSAccessKeyId=<id>" \
-F "Content-Type=image/png" \
-F "file=@image.png" \
 https://xxx.s3.amazonaws.com
```
@image.pngはカレントディレクトリにあるファイル
一般ユーザだけどzshとvimを入れたい


# 概要
一般ユーザのアカウントを作ってもらったけど，vimもzshもインストールされてなくて辛い！と思ったので，入れてみた．

- OS: Ubuntu12.04


# zshのインストール

## ソースコードの取得
- 最新版のソースコードを落とす→[Download zsh source](http://zsh.sourceforge.net/Arc/source.html)
- 解凍し，移動．

```
 $ bzip2 -dc zsh-xxx.tar.bz2 | tar xvf -
 $ cd zsh-xxx
```

## make
デフォルトだと/usr/local/binに入るけど，管理者じゃないと無理なので，ホームディレクトリの下に入れる必要がある．

- ホーム下にlocalフォルダを作成

```
 $ mkdir ~/local
```

- ./configureを実行しmakeする，この際，次のオプションを指定する．
	- --prefix=${HOME}/local : インストール先を変えられる
	- --enable-multibyte : マルチバイト対応
	- --enable-locale : 多言語対応（なくてもいいかも？）
	- その他のオプションについては， ./configure -h で見れる

```
 $ ./configure --prefix=$HOME/local --enable-multibyte --enable-locale
 $ make
 $ make install
```

## シェルを変更
通常，シェルを変更する場合にはchshコマンドから行うが，残念ながら/etc/shellsを編集する手段がないため，.bashrcでzshを呼ぶという荒業？をしてみる．

```
 $ vi .bashrc
```

- .bashrcの一番下に次を追記．

	```.bashrc
	${HOME}/local/bin/zsh
	```

- source ~/.bashrc する
- ${HOME}/local にパスを通す



# vimのインストール
めんどうなので依存を手動で入れなかった・・・

## ソースコードの取得
- ソースコードを落とす→[Downloading Vim](http://www.vim.org/download.php)
	- Mercuialも残念ながら入っていなかったので，圧縮されたやつをとってくる．
- 解凍する（略）

## make
僕の環境では，次でconfigureしたらコケなかった．

```
 $ ./configure --prefix=${HOME}/local \
 --with-features=huge \
 --disable-darwin \
 --disable-selinux \
 --enable-multibyte \
 --enable-fail-if-missing \
```

あとはmake; make install


# 参考
- http://chiiiiiiiii.hatenablog.com/entry/2012/10/20/023059
ccchart用プラグイン機構を模索中

かなり以前からccchartに機能追加するためのモジュール機構もどきを使ってcssハイブリッドやテーマを実装していたのだけど、そろそろ、誰でも利用できる機構として提供しとくと楽できる可能性が高まるではないかな(^^?、ということで、暫定テスト中。

ccchart用プラグインの作り方(暫定)
http://ngw.jp/~tato/wp/?p=389

たとえば、次のようなコードで、line描画メソッドdrawLineを無効化してマーカーだけによるチャートを描画できます。
![ccchart plugin](http://ngw.jp/~tato/wp/pages/ccchart/img.png)

```html
<meta charset="utf-8">
<script src="http://ccchart.org/js/ccchart-v1.08.1.js" charset="utf-8"></script>
<script>

//プラグインサンプル window.ccchart.m.プラグイン名
window.ccchart.m.My_drawLine = {

  //window.ccchart.m.プラグイン名.update = true を指定すると、そのプラグイン内の名前が既存のccchart内の名前と重複したときに上書きします。
  update:true,

  //既存のline描画メソッドdrawLineを上書きする
  drawLine: function () {
    //折れ線グラフを描かない
    return this;
  }
};
</script>
<canvas id="hoge2"></canvas>
<script>
var chartdata2 = {
  "config": {
    "title": "Makers without Line",
    "subTitle": "既存のdrawLineを上書きしてline描画しないようにし、Markerのみを描画する",
    "useMarker": "css-ring",
    "type": "line"
  },
  "data": [
    ["年度",2006,2007,2008,2009,2010,2011,2012,2013,2014],
    ["ジュース",30,60,435,456,352,567,678,1060,1280],
    ["ウーロン",120,200,123,312,200,402,300,512,666]
  ]
};
ccchart.init('hoge2', chartdata2);
</script>
```

一応、暫定バージョンv1.08.1以降で使えるようになってますが、各タイプなどでの動作テストできるようにここ(  http://ccchart.org/ )に置いてあります。エラー出るかな。

<hr>
<article id="plugins1">
<b>ccchart用プラグインの作り方リンク　</b> <a href="http://ngw.jp/~tato/wp/?p=389">http://ngw.jp/~tato/wp/?p=389</a>
[ WebSocket func ] <a href="http://ngw.jp/~tato/wp/?p=1080">blog</a> | <a href="http://ccchart.org/plugins/ws/wscase/plain/wscase-plain.htm">ccchart.wscase.plain</a>
[ Pointer ] <a href="http://ngw.jp/~tato/wp/?p=836">blog</a> | <a href="http://ccchart.org/plugins/pointer/cross/cross-pointer2.htm">ccchart.crossPointer(op)</a>
[ Drop & Drow ] <a href="http://ngw.jp/~tato/wp/?p=866">blog</a> | <a href="http://ccchart.org/plugins/dd/dropdraw/demo.htm">ccchart.dropDraw()</a>
</article>
CocoaPods&BlocksKitでarchiveするときlibffiでエラーが出る件

https://github.com/pandamonia/BlocksKit/issues/178#issuecomment-31584013

ここに簡単な解決法があった。
```
pod 'BlocksKit', :git => 'https://github.com/pandamonia/BlocksKit.git', :branch => 'next'
```
とするだけ。
Digg Reader に登録する Bookmarklet もどき

### 1. [検索エンジンの管理](https://support.google.com/chrome/answer/95653?hl=ja) から以下のスクリプトを好きなキーワードと一緒に登録する。

```js
javascript:location.href='http://digg.com/reader/search/'+encodeURIComponent(location.href)
```

![Screen Shot 2014-02-17 at 7.21.07 PM.png](https://qiita-image-store.s3.amazonaws.com/0/339/4757cf52-c0b0-00fd-fc09-9055ed3d9679.png)

### 2. フィードを購読したいページを開いてアドレスバーにフォーカスし指定のキーワードを入力し Enter を押す

![diggreader.gif](https://qiita-image-store.s3.amazonaws.com/0/339/a121a0a5-82ae-525a-974d-4c5a5ce601e0.gif)
【Firefox】画像をfadeすると、画像の大きさが変になるのを直す

jQueryのfadeかCSSで透過（opacity）を行うと、Firefoxで画像の大きさが変になることがある。

#発生条件
- Firefox（確認したバージョンは27.0.1だが、結構昔からあるバグのよう）
- jpg、gif 、png24で確認
- jqueryは2.1.0-1.4.2あたり

#CSSで直す

```css
img {
	box-shadow: #000 0 0 0;
}
```

参照：http://stackoverflow.com/questions/13289109/jquery-fadein-fadeout-image-difference-1px-in-firefox

##IE7以下に対応するとき
CSSで直す場合、そのまま使うとIE7以下ではfadeが効かない不具合があるので、CSSハックで対応する。

```css
img, x:-moz-any-link, x:default {
    box-shadow: #000 0 0 0;
}
```

デモ：http://jsdo.it/Ituki/r6Xw
C# で Pygments を使ってシンタックスハイライト

[このへん](https://github.com/cvrajeesh/pygments-net/tree/master/Sample/Web) から必要最小限な部分を抜き出しただけです。

---

NuGet で [pygments-net](https://github.com/cvrajeesh/pygments-net) をプロジェクトに追加する。

```ps
PM> Install-Package pygments-net
```

シンタックスハイライトのための python コードをプロジェクトに作成し、ファイルのプロパティで「出力ディレクトリにコピー」を「常にコピーする」にする。

```py:pygments_helper.py
import clr
clr.AddReference("pygments")

from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles

def generate_html(code, lexer_name, style_name):
  from pygments import highlight
  from pygments.lexers import get_lexer_by_name
  from pygments.styles import get_style_by_name
  from pygments.formatters import HtmlFormatter

  if not lexer_name: lexer_name = "text"
  if not style_name: style_name = "default"
  lexer = get_lexer_by_name(lexer_name)
  return highlight(code, lexer, HtmlFormatter(style=style_name))

def get_lexers():
  return get_all_lexers

def get_styles():
  return get_all_styles
```

Program.cs を次の通りに編集してビルド・実行する。

```csharp:Program.cs
using System;
using System.Reflection;
using System.IO;
using IronPython.Hosting;
using Microsoft.Scripting;

namespace ExamplePygment
{
    class Program
    {
        static void Main(string[] args)
        {
            string dir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
            string code;

            using (var sr = new StreamReader(Path.Combine(dir, "pygments_helper.py")))
            {
                code = sr.ReadToEnd();
            }
            
            var ipy = Python.CreateRuntime();
            dynamic scope = ipy.UseFile(Path.Combine(dir, "pygments_helper.py"));
            
            var html = scope.generate_html(code, "py", null);
            Console.WriteLine(html);
        }
    }
}
```

タグ付けされた HTML の断片がコンソールに出力されます。
WinDbgコマンドチートシート


WinDbgでよく使うコマンドをまとめてみました。

|コマンド| 説明 |
|:------|:------|
| g | 実行 |
| k | スタックトレース表示 |
| bp [アドレス] | 解決済みのアドレスにブレイクポイントを設定 |
| bu [Module]![クラスや構造体名] | まだ解決されていないアドレスにブレイクポイントを設定。関数のシンボル名とか。 |
| bl | ブレイクポイント一覧を表示 |
| be/bd [Breakpoint ID] | ブレイクポイント有効・無効 |
| dt [Module]![クラスや構造体名] -r [クラスや構造体のアドレス] | クラス・構造体のメンバの内容を表示 |
| dds [アドレス範囲] | 指定したアドレスの範囲をシンボルのアドレスの配列と想定してシンボル名を解決して表示する |
| lm | ロードされているモジュールの一覧を表示 |
| lm v m [モジュール名] | 指定されたモジュールの詳細情報を表示 |
| !address -summary | 仮想アドレスの使用状況などを表示 |
| !analyze -v | クラッシュダンプを解析 |
| !handle [ハンドル値] | ハンドルの情報を表示 |
| !htrace | ハンドルに対する操作のスタックトレースを表示 |
| !teb | スレッド情報(Thread Environment Block)を表示 |
| !wow64exts.sw | 32/64bitモード切替 |
| !clrstack | マネージコードのスタックトレースを表示<br>事前に .loadby sos clr を実行しておく必要がある。 |
| !dso | 現在のスタックの範囲内で見つかったすべてのマネージオブジェクトを表示 |
| !PrintException [例外オブジェクトアドレス]<br>!pe [例外オブジェクトアドレス] | 指定されたCLR例外オブジェクトの内容を表示。 |
| .writemem [ファイル名] [アドレス範囲] | 指定アドレス範囲のメモリをファイルに保存する |


###参考リンク
http://msdn.microsoft.com/ja-jp/library/bb190764.aspx
Travis で複数のアプリで bundle install したい



Travis のビルド時に別のアプリに `cd` して `bundle install` しようとしても、もともとのビルド対象の `Gemfeil` を見にいってしまって、意図通りに動かない事がある。それを解決したのでメモ。

## 問題

具体的にはこんな感じのディレクトリ構成で、

```console
my_rails_app
  |
  +- mock_rails_app/
```

テストを実行する前に Rails.root 直下にあるモックの Rails アプリを動かしたい。
`spec_helper.rb` でテスト実行前に起動してテスト実行後に殺すようにしてるが、動かす前には `bundle install` しておきたいので `travis.yml` にはこんな感じで書いておいた。

```yml
before_script:
  - pushd mock_rails_app && bundle install && popd
```

で、これがうまく動かない。
`mock_rails_app` に `cd` してるはずなのに、`my_rails_app` 直下の `Gemfile` を見にいってしまっているらしい。

## 解決方法

これを解決するには、こう書くと良かった。

```yml
before_script:
  - pushd mock_rails_app && BUNDLE_GEMFILE=$(pwd)"/Gemfile" bundle install && popd
```

Budnler は環境変数 `BUNDLE_GEMFILE` で指定された `Gemfile` を見に行くらしい。


Travis は実行前に `BUNDLE_GEMFILE` を設定してあったりするのだろうか…
mysql binlogからDB復旧

mysqlbinlogでDB復旧した時の自分用メモ。繰り返す自分用のメモ。

# 依頼内容
依頼者「2014-02-14の20時台に作業間違えた。なかったコトにしてもらえませんか。」
俺「・・・」

# やりたいこと
2014-02-14の20時台に投げられたクエリをすべてなかったことにしたい。
 
作業手順

- バックアップしたデータベースをリストアする
- mysqlbinlogで、リストアした時間（2014-02-13 03:30）から該当時間（2014-02-14 20:00）まで、ログ吐き出して適用
- 該当時間後の正常なデータを吐き出し。具体的に2014-02-14 20:59:59以降のデータを吐き出して適用
- データ確認 && 差し替え


# 前提条件
- binlogが吐かれていること
- 定期バックアップが取られていること


## binlogを吐く方法
/etc/my.confにbinlogの設定をする。
基本レプリケーションの設定とか、してたら書いてるはず。

```/etc/my.conf
log-bin=mysql-bin
expire_logs_days=7
```


##定期バックアップ
定時でバックアップをとるスクリプト
適当な場所に配置。とりあえず、『/root/sh/db_backup.sh』に書いておいた。
これがないと人生詰む。DBバックアップは絶対やっておこう。

```/root/sh/db_backup.sh
#!/bin/sh

DATE=`date '+%Y%m%d'`
DUMPCMD="/usr/local/mysql/bin/mysqldump"

# 危険だよねわかる。
PASS="urpasswd"

$DUMPCMD -uroot -p${PASS}  \
target-db1 target-db2 target-db3 | gzip > /urbackupdir/UR-IMPORTANT-DB.${DATE}.sql.gz

# 一応echoって書いてるけど、hipchatとかに飛ばすとたのしい
echo "dump completed"
```

cronで定時バックアップ。

```
$ sudo crontab -e
30 03 * * 0 /bin/sh /root/sh/db_backup.sh

# 動作確認用
02 12 17 2 * /bin/sh /root/sh/db_backup.sh
```
# 障害時対応

定時バックアップで保存した、リカバリ用のデータを持ってくる。(recovery.sqlとする)

必ず、障害対応を行いたいサーバー以外で、データの復旧を行う。
binlogのposition変わってめんどくなるし、焦ってbinlog消したりするとクビになる。注意。

もっというと、recovery.sqlの中で、
INSERT INTO targetDB.targetTable (...) VALUES(...)って書いてるから、recoveryに向けて、
食わせたつもりでも、本番用と混ざるのでヤバイことになる。

```
/usr/local/mysql/bin/mysql -uroot -p recovery < recovery.sql
```

dbのダンプ前にぜひとも書き換えを発生させる元凶を止めておこう、
例えば、ウェブサーバー、slaveのDB、定期バッチも気にしておく。

```
# 今回はwebサーバーだけ止めた。
service httpd stop
```



バックアップした時間から、20時までのデータを吐き出し。
今回の最終binlogは「mysql-bin.000044」だった。タイムスタンプとかで判断
事前にdumpしておいたファイル(例えば先程のrecovery.sql)の最終行あたりを読んで、節目となる正確な時間は掴んどいた方がいい。

```bash
/usr/local/mysql/bin/mysqlbinlog -uroot -p -D mysql-bin.000044  \
--start-datetime="2014-02-11 03:00:00" \
--stop-datetime="2014-02-14 20:00:00" > ~/binlogbk/recover-head.sql
```

 同様に。21時からのデータを吐き出し

```bash
/usr/local/mysql/bin/mysqlbinlog -uroot -p -D mysql-bin.000044 \
--start-datetime="2014-02-14 21:00:00" > ~/binlogbk/recover-tail.sql
```


吐き出したファイルをまとめたら、作業は概ね終了だ。

```bash
/usr/local/mysql/bin/mysql -uroot -p recover < ~/binlogbk/recover-head.sql
/usr/local/mysql/bin/mysql -uroot -p recover < ~/binlogbk/recover-tail.sql
```


リカバリ用に作ったDBを確認して、大丈夫そうだったら本番用と差し替えよう。

```
/usr/local/mysql/bin/mysql -uroot -p
```

なお、確認と差し替えはphpmyadmin使った。
Selenium WebDriverとApache JMeter

最近異なる案件で両方を使い分ける事案があったのでメモる

# Selenium WebDriverと言ってここで意図しているもの

UIからカチカチではなくてPythonで書いたUnitTest的にどうさするもの。unittestモジュールから実行している

webdriver.Firefox() をsetUp()で作ってtearDown()で殺す。

ブラウザを起動してリンクを辿らせてクリックさせてフォームにテキスト入れて意図したページに飛ぶかをチェックする。その都度ブラウザが出てきて死ぬ瞬間の画面もtime.sleep()とか入れると見れるので割と「インタラクティブ」である。ブラウザを外枠に持つ。

少なくとも自分のX上で動かすと他の作業はできなくなる。一度実行開始直後にemacsに移ってctrl-n (下へ移動)をしようとしたらFirefoxがたちあらわれてたくさんのWindowが生成されて悲しい思いをした。

本当の動作を検証するには良い。UIでポチポチのSeleniumサイドはよく知らない。多分便利だ。

# Apache JMeterと言ってここで意図しているもの

用途が似通っているのだがやはりHTTPを叩いてリンクを見て結果を取ってきて付き合わせるのに使っている。こちらはUIからポチポチしているのだが、何故かやろうとしていることはものすごくローテクである

Cookieを取得して次の画面でそれを使うにはSet-Cookieをresponseから取ってきて正規表現で加工する。

あるHTMLページのmp3ファイルを取得して順にダウンロードするには、正規表現で全部マッチするようにしてインデックスに -1 を指定して……んもーーー！！！

(-1を指定して、は事実。このようにするとForEachから呼び出せる形で変数に放り込まれる)

プログラミングと見せかけて高度なオレオレフィルタリングをUIエディタで書く。JMeterエディタがスマホに欲しい #わけがない

TCP/IPレベルの接続を生で編集している印象がとても強い。

よくあるドキュメントには「JMeterはブラウザではない」というよくある間違いの訂正がある。確かにそう。ユーザエージェントを指定することはできるが、レンダリング結果をお目にかかることはない。結果はHTMLで生で見る。取得するデータは正規表現で得る。せ、せめてブラウザでプレビューさせて欲しい……

JMeterは設定を書くのがとてもつらい。レコードも試したが、動的に変化する要素を変数化する部分はやはり自分でやる。しんどい。

しんどい後には相手を復讐できるのがJMeterである。ローカルから10クライアントえーい。AWS経由で複数ホストから合計1000クライアントえーい。

WebDriverではこういう「負荷」に関わる設定は難しい気がする。というかそういうツールではないと思う。

なおHTTP接続の話ばかりだが、LDAPやSMTPのポートへ接続するものも書ける。

# 欲しいもの

WebDriverの設定を書くとJMeterの設定が出てきて欲しい。ただ、JMeterのユーザ実行をレコードする機能を試していて「相当無理筋」という印象は受ける。あったら欲しいので教えていただきたい。

# まとめ

そんなものはないが、ユーザの挙動をエミュレーションするツール本があったら買うと思う。
Rubyのベンチマークの取り方


## 参考
http://a-newcomer.com/29


## 具体例

```
require 'benchmark'
puts Benchmark::CAPTION
puts Benchmark.measure{
  #何かしらの処理
}
```

## 結果
```
     user     system      total        real
  0.000000   0.000000   0.000000 (  0.000010)
```
Digest 認証による WebDAV 設定メモ

#httpd.conf の設定

```httpd.conf
<Location /svn/hogehoge>
    DAV svn

    # Subversion リポジトリのパスを指定します。
    SVNPath C:/svnrepository/HogeHoge

    # アクセスコントロールファイルを指定します。
    AuthzSVNAccessFile C:/svnrepository/HogeHoge/authzsvn.conf

    # 認証対象のユーザーすべて。
    # ユーザーを固定したい場合は、Require user <ユーザー名> とします。
    Require valid-user

    AuthType  Digest
    AuthName "Subversion repository(HogeHoge)"

    # 
    AuthUserFile C:/svnrepository/HogeHoge/.htpasswd_dig
</Location>
```

#アクセスコントロールファイル

authzsvn.conf は任意の名前でよいはず。

ユーザー名を jack とした場合、
authzsvn.conf のサンプルは次のとおり。

```authzsvn.conf
[groups]
#開発者
developers = jack
#管理者
manager = jack

[/]
#すべての人が読み込み可能
@manager = rw

[test:/trunk]
#開発者は読み書き可能
@manager = rw

[test:/branches]
#管理者は書き込みも可能
@manager = rw

[test:/tags]
#管理者は書き込みも可能
@manager = rw
```

#パスワードファイルの生成

最後にパスワードファイルの作成。
今回は Digest 認証なので、htdigest.exe を使用。

>C:\xampp\apache\bin\htdigest -c C:/svnrepository/HogeHoge/.htpasswd_dig "Subversion repository(HogeHoge)" jack
Adding password for jack in realm Subversion repository(HogeHoge).
New password: ********
Re-type new password: ********

で OK。httpd.conf を変更したときは apache の再起動をお忘れなく。

-c オプションはパスワードファイルを作成するオプションなので、
2 ユーザー目以降は -c を付けないで実行してください。
ちゃんとエラーは読まなきゃダメだよ

プログラミングの初心者は、意識的にしろ無意識的にしろ分からないことを見なかったことにすることって多いけど。

その最たるものが、エラーメッセージをちゃんと読まないこと。

ちゃんと読んで考えたらヒントになることがいっぱい書いてあるからエラーはちゃんと読もう。

ちゃんと、ってのは、深読みをすること。

書いてあることそのままではなく、それを書いてある理由も含めてよく考える。

それで大抵は解決の糸口が見つかる。

ググったほうが早いことも多いけど、エラーメッセージを読み解く力がないと難所に対応できないので、まずちゃんとエラーを読む癖をつけよう。
Google Play Services SDK のAdmobを使ってみた

AdMobの存在がAdsense・GooglePlayと絡んでここ数年ふわふわしてきた印象ですが、ようやく落ち着き始めるような気がします。この記事は初投稿の2014/2/16以後のGoogle Play Services SDKを利用したAdmob実装方法(Android)をメモしたものになっています。

## 実装する前に
なんでGoogle Play Servicesが関係あるの？という理由の考察です。実装とは関係ないです。

### GooglePlayデベロッパープログラムポリシーの更新
2013/11/1に[GooglePlayデベロッパープログラムポリシー](http://play.google.com/intl/ALL_jp/about/developer-content-policy.html)の原文が更新され、広告のポリシーにAdvertising ID (Android 広告 ID) の使用という項目が追加されました。(日本語化されたのは恐らく2014/1)
>2014 年 8 月 1 日から、Play ストアにアップロードされたすべての更新や新着アプリには、広告目的で使用する端末 ID として広告 ID（端末で利用可能な場合）を使用する必要があります。

### 広告IDってなに？
広告IDはAndroid Developersに記載してある[Advertising ID](https://developer.android.com/google/play-services/id.html)にあたるもので、広告目的のための匿名の識別子です。広告事業者はこの識別子を利用して利用者の興味に基づく広告（インタレストベース広告）が配信できますが、匿名ということでオプトアウトすることができます。

1. 端末内に(いつの間にか)存在している`Google設定`というグレーの色したアイコンのアプリを起動
1. `広告`を選択
1. 広告IDをリセットできる！
1. オプトアウトもできる！

### AdMob + Google Play Service SDK
こちらも2013/11/1ですが、Google Play Service SDKを使った新バージョンのアナウンスがありました。
http://adsense-ja.blogspot.jp/2013/11/android-admob-sdk.html

>従来の「AdMob SDK」にいくつかの大幅な改良を加えた最新のバージョンを、「Google Mobile Ads SDK」と名称を変え、Google Play 開発者サービス 4.0 の一部としてご利用いただけます。

要するに、AdMob + Google Play Service SDKはデベロッパープログラムポリシーに準拠した実装方法ということになります。
[2015/5追記] 現在はAdMob以外の主要広告SDKも広告IDを利用した実装になっています。広告IDに対応していない広告SDKはポリシー違反になるので気をつけてください。


## アカウント登録(Web)
Admobアカウントがなければ登録します。簡単。
https://apps.admob.com/

#### [補足1]
AdMobのサポート窓口はGoogle+のAdMobコミュニティのようです。
https://plus.google.com/communities/111749199605556639073

#### [補足2]
2015/4にアプリの読み込み時や終了時の表示にインタースティシャル広告は禁止、といった明確なガイドラインが公開されたのでインタースティシャル導入時は気をつけてください。
https://support.google.com/admob/answer/6201362?hl=ja&ref_topic=2745287

## 広告作成(Web)
AdMobページの`収益化タブ`から新しい広告ユニットを作成します。広告フォーマットがバナーとインタースティシャルがありますが、この選択で実装方法も変わります。（ちなみにインタースティシャルは全画面広告のことです）
作成が完了したら広告ユニットIDを控えてください。

#### [補足]
広告ユニットIDは新しいAdmobの識別子で、[Adsense公式ブログの2013/12/25の記事](http://adsense-ja.blogspot.jp/search/label/AdMob)で紹介されています。


## 実装(アプリ)
公式の実装手順ドキュメントは以下のページになります。
https://developers.google.com/mobile-ads-sdk/docs/admob/android/quick-start
とてもわかりやすいのでここの通り実装すれば問題ないです。

[補足1]
各ライフサイクル(onResume,onPause,onDestroy)における適切な処理も必要になります。
https://developers.google.com/mobile-ads-sdk/docs/admob/android/play-migration
githubに公開されているサンプルも参考になるかと思います。
https://github.com/googleads/googleads-mobile-android-examples


[補足2]
Proguardの記述方法は、「よくある質問」に記載されています。
https://developers.google.com/mobile-ads-sdk/docs/admob/android/faq?hl=ja#proguard

[補足3]
play-service全体のライブラリは少し巨大なので、AdMobだけが必要であれば以下のような記述でおＫです。

```groovy:build.gradle(AndroidStudio利用時)
compile 'com.google.android.gms:play-services-ads:7.3.0'

```

Admobのドキュメントはbuild.gradleの記述が更新されないことが多いのでAndroidDevelopersのページを適宜確認した方が良いです。
http://developer.android.com/google/play-services/setup.html


以上です。
zshのバージョンアップ(4.3.10→5.0.5)

# 背景
yumで入れたzshが腐っていたので

# 問題
git add 引数補完時になぜか落ちまくるので

# 解法

```zsh
wget http://sourceforge.net/projects/zsh/files/zsh/5.0.5/zsh-5.0.5.tar.gz/download
tar zxvf zsh-5.0.5.tar.gz
cd zsh-5.0.5
./configure
make
sudo make install
```

# 詳細
なんかなんとかなったみたい(小並感
なんとかなった理由についてはよくわかっていない。

# 参考リンク
http://gitpub.hatenablog.com/entry/2013/07/07/182014
Javaでfinalを付けると遅い?

随分昔の記事を取り出して恐縮ですが、[finalをつけたらパフォーマンスが落ちたでござるの巻](http://d.hatena.ne.jp/shuji_w6e/20090821/1250868090) という話がありました。

この違いがなぜ起こるか調べてみました。

```java
public static void main(String[] args) {
	final int NUM = 31;
	long start = System.currentTimeMillis();
	for (int i = 0; i < Integer.MAX_VALUE; i++) {
		int hash = 17;
		hash = hash * NUM + i;
		hash = hash * NUM + i;
		hash = hash * NUM + i;
		hash = hash * NUM + i;
		hash = hash * NUM + i;
	}
	System.out.println(System.currentTimeMillis() - start);
}
```

この場合、javapの結果を眺めてみると、違いはが出てくるのは、finalを付けるとスタックに積むのが`bipush`命令になり、finalを付けないと`iload_1`命令になるという点だけです。

これをWindowsで実行すると…

```
finalあり:3244
finalなし:2527
```

確かにfinalなしの方が速い結果が得られます。

しかしこのコードよく見ると、hashがループの外で使われていないので、最適化のやり方次第で大きく差がでてしまいます。-XintをつけてJITを効かせずに実行してみます。

```
finalあり:57513
finalなし:57441
```

変わりません。つまりbipushとiload_1で速度差は無いということです。

さて比較をフェアにするために、hashをループの外で使うようにして、-serverオプションをつけて最適化して実行してみます。

コードは以下のとおり。

```java
public static void main(String[] args) {
	final int NUM = 31;
	long start = System.currentTimeMillis();
	int hash = 17;
	for (int i = 0; i < Integer.MAX_VALUE; i++) {
		hash = hash * NUM + i;
		hash = hash * NUM + i;
		hash = hash * NUM + i;
		hash = hash * NUM + i;
		hash = hash * NUM + i;
	}
	System.out.println(hash +":"+ (System.currentTimeMillis() - start));
}
```

結果は…

```
finalあり:9021
finalなし:12478
```

となり、「finalを付けた方が、最適化されやすい」という通説どおりの結果になります。
テスト一括無視設定


スキーマ変更等でJenkins等のテストが大幅にコケる場合の暫定対処方法

テストクラスに`@Ignore`アノテーションを付ける(JUnit4限定)

# 参考
[java - Delete or comment out non-working JUnit tests? - Stack Overflow](http://stackoverflow.com/questions/2501519/delete-or-comment-out-non-working-junit-tests)
Python の smtpd.DebuggingServer でメール送信をデバッグ

メール送信を行うシステムを開発している場合、作業中のネットワーク環境により、利用しているプロバイダの [Outbound Port 25 Blocking](http://ja.wikipedia.org/wiki/Outbound_Port_25_Blocking) の制限で25番ポート経由のメール送信がブロックされることがあります。

プロバイダ指定の SMTP サーバを経由して送信すればよいのですが、開発用のメール送信設定に SMTP ユーザ情報を含めなければならず面倒です。

開発時は、実際に送信されなくてもメールの送信内容が確認できればよかったため、デバッグ用の SMTP サーバを探していたところ、Python に [smptd.DebuggingServer](http://docs.python.org/2/library/smtpd.html#debuggingserver-objects) という標準ライブラリがありました。

以下のワンライナーで、ダミーの SMTP サーバを起動できます。

```bash
$ python -m smtpd -n -c DebuggingServer localhost:1025
```

`smtpd` モジュールのソースを見てみると `SMTPServer#process_message` を実装しているだけでしたので、必要に応じて調整したデバッグサーバを作っておくと良いと思います。

<http://hg.python.org/cpython/file/2.7/Lib/smtpd.py#l330>:

```python
class DebuggingServer(SMTPServer):
    # Do something with the gathered message
    def process_message(self, peer, mailfrom, rcpttos, data):
        ...
        print '---------- MESSAGE FOLLOWS ----------'
        for line in lines:
           ...
        print '------------ END MESSAGE ------------'
```

[dsmtpd](https://pypi.python.org/pypi/dsmtpd) というライブラリもすでにありました。

* <https://pypi.python.org/pypi/dsmtpd>
* <https://github.com/matrixise/dsmtpd>
Cocos2d-x + Android でホームボタンを押したらBGMを停止するメモ


# 本題

BGMをループで流していると、ホームボタンでアプリを終了してもBGMが止まらなくなる。
その解決方法↓

http://chicketen.blog.fc2.com/blog-entry-6.html

# 余談

AppDelegate.cppをみたら、コメントアウトされているけど、すでに止めるコードが書いてあるという…

```c++:AppDelegate.cpp

// This function will be called when the app is inactive. When comes a phone call,it's be invoked too
void AppDelegate::applicationDidEnterBackground() {
    CCDirector::sharedDirector()->stopAnimation();

    // if you use SimpleAudioEngine, it must be pause
    // SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground() {
    CCDirector::sharedDirector()->startAnimation();

    // if you use SimpleAudioEngine, it must resume here
    // SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}

```


SimpleAudioEngineのあたりのコメントをはずしてやればオッケー。
場合によっては、CocosDenshionをusingする必要がある。

```c++:AppDelegate.cpp
#include "SimpleAudioEngine.h"

using namespace CocosDenshion;
```
EventBus はどこでつかうべきか

EventBus の使い方は[こちら](http://qiita.com/KeithYokoma/items/793aaac6994c9242808f)に任せるとして、この投稿では、EventBus の効果的な使い方について考察します。

## どのレイヤの結合を分離するか

特に、View の仕組みがフレームワークとして作りこまれているものであれば、View のイベントはリスナーインタフェースを用いれば十分にイベントハンドリングが可能です。Android の場合、View のシステムは Activity のライフサイクルとよく連動して動作するため、ここに EventBus による中間層の挿入をする理由はあまりありません。

多くの場合、アプリ開発者が設計し実装する部分は Controller と Model の相互作用です。そして、Controller と Model の境界面で使われる設計パターンとして、コールバックインタフェースが用いられてきました。

コールバックインタフェースを用いることで、Model から Controller への戻しの処理が共通化され、Controller は実装を強制されます。

しかし、Controller にはライフサイクルがあり、特に Android のような、大きくかつライフサイクルの短い Controller を取り扱う場合には、コールバックインタフェースの参照の持ち方を適切に管理しなければなりません。また、インタフェースによって Model と Controller が密に連動するため、インタフェースの変更のコストはどうしても高くなりがちです。

この問題点を解消するために、EventBus という中間層を介したコミュニケーションを用いることが有用となるのです。

なぜなら、Model と Controller は直接結合することがなくなることで、Controller が実装したコールバックインタフェースの管理をしなくても良くなるからです。

## 命名規則

もし、すべてのレイヤのすべてのイベントを EventBus を介してやりとりするとどうなるでしょうか。

あらゆるイベントがオブジェクト化され、あらゆるレイヤに多種多様なイベントオブジェクトが溢れかえります。

Otto はアノテーションとイベントオブジェクト名によって、EventBus はイベントオブジェクト名によって適切なハンドラを選択します。いずれにしても、イベントオブジェクトの命名によってハンドラが選択されるため、イベントオブジェクトの命名を間違えると、どのイベントがどのレイヤからやってくるのかが分からなくなってしまいます。これはインタフェースの乱立よりも厄介な問題です。

## Controller は Model を直接参照し、Model の状態変化にリアクティブになる

Controller は、View でおこるイベントに応じて適切に Model の操作を行います。この点で、Controller が Model を直接参照することはごく自然な振る舞いです。
問題は、Model の操作のコールバックの管理にあったはずですから、この部分を EventBus に任せ、Model は操作の結果としてイベントを発し続け、Controller はそのイベントにリアクティブに振る舞うようにします。

Controller と Model との境界面を柔軟にする、という点で、このポリシーは有効なのではないでしょうか。
PerfumeのモーションキャプチャデータをiOSアプリ内で動かす手順

[約1年半前に公開](http://www.itmedia.co.jp/news/articles/1203/30/news042.html)された、例のPerfumeのモーションキャプチャデータを iOS アプリで動かす手順です。

データと一緒に oF のサンプルアプリが既に公開されてるので、それをiOSで動くように改修しつつ、 <b>どんな実装になってるのかざっと把握する</b> という感じで見ていきます。


（完成品のスクショ）

<img src="http://f.cl.ly/items/0c2k3y2o0C3S2X1o2S3F/perfume.jpg">


##モーションキャプチャデータとサンプルをダウンロード

モーションキャプチャデータは [ここ](http://perfume-global.com/visualization.html) から、oFサンプルは [ここ](https://github.com/perfume-dev/example-openFrameworks) からダウンロードできます。


##サンプルアプリのビルド

適当なサンプルプロジェクトを開いて、Base SDKをlatestに変更したのちビルドしてみると、 **'tr1/memory' file not found** エラーが出る。


で、 [header search path] に

````
/usr/local/Cellar/boost/1.49.0/include
````

をrecursiveで追加してみると、さらにコアっぽいところからのエラーが大量に湧き出してくる。


何となく<span class="deco" style="color:#FF0000;">こっちに突っ込んでいくと時間を不毛に浪費してしまう気がした</span>ので、方針変更、emptyExampleから自分でサンプルアプリを構築することにしました。


##サンプルアプリをつくり直す

emptyExampleからのつくりなおす手順です。せっかくなので、iOS向けにつくります。


###1. ofxBvhアドオンの導入

- ofxBvhフォルダをaddons配下にコピーする
- ofxBvhをプロジェクトのaddonsグループに追加する
- ダウンロードしてきた３つのbvhファイルをプロジェクトに追加する


###2. testApp.h

- ofxBvhのヘッダをinclude

````
#include "ofxBvh.h"
````

- メンバ変数追加

````
vector<ofxBvh> bvh;
ofEasyCam cam;
````

###3. testApp.mm

もとのexample-bvhからコピーします。そんなに長くないので、すぐコピーできるはず。 **bvh[x].load("xxxx.bvh")のところだけ、ファイル名に合わせて変更** します。

````
void testApp::setup(){	

    ofSetFrameRate(60);
    ofSetVerticalSync(true);
    
    ofBackground(0);
    
    bvh.resize(3);
    
    // setup bvh
    bvh[0].load("aachan.bvh");
    bvh[1].load("kashiyuka.bvh");
    bvh[2].load("nocchi.bvh");
    
    for (int i = 0; i < bvh.size(); i++)
    {
        bvh[i].play();
        bvh[i].setLoop(true);
    }
}

void testApp::update(){

    for (int i = 0; i < bvh.size(); i++)
    {
        bvh[i].update();
    }
}

void testApp::draw(){
	
    glEnable(GL_DEPTH_TEST);
    
    ofEnableBlendMode(OF_BLENDMODE_ALPHA);
    
    cam.begin();
    
    for (int i = 0; i < bvh.size(); i++)
    {
        bvh[i].draw();
    }
    
    cam.end();
}
````


##完成品（動画）

<iframe src="http://player.vimeo.com/video/81777832" width="250" height="527" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe><p><a href="http://vimeo.com/81777832">vimeoで見る</a></p>


##知ったこと／気付いたことのメモ

###BVHファイル

モーションキャプチャデータのフォーマットの一種らしい。

> BVH ファイル形式とは，Biovision 社が提唱したモーションキャプチャデータファイルフォーマットです．現在，Alias Motion Builder をはじめ，3ds MAX の Character studio，Poser などの様々な商用3Dキャラクタアニメーションソフトでもサポートされています．BVH ファイルの特徴を以下にまとめます．


> テキスト形式で記述
>
- 座標系は右手系．XYZ 各軸の扱い（どの軸が鉛直方向に対応するか等）は任意．
- 関節ノードに関する情報を記述．
- 関節回転はオイラー角形式で記述．
- 回転角度の単位は Degree
- キャラクタのスケルトン階層構造を記述するHIERARCHY部と，動作データを記述するMOTION部の2つから構成

[参考記事](http://www.tmps.org/?MOCAP%A5%C7%A1%BC%A5%BF%A5%D5%A5%A1%A5%A4%A5%EB#daa83dc1)


###ofBvh

- loadメソッド内で呼んでいる ofToDataPath なるメソッドがとってくるパスをデバッガで追ってみると、MacOSだと ../../../data で、iOSだとバンドル直下だった
- bvhを解釈して、再生するところまでこれでやってくれてるっぽい
- 他のアドオンやライブラリにも依存してなくて、ソースも500行程度


###ofEasyCam

初めて知ったのでどういうものなのか今度調べてみる。


##参考にした記事

- [PerfumeのモーションデータをiPhoneアプリにして動かしてみた](http://www.atmarkit.co.jp/ait/articles/1204/03/news125.html)


##関連

- [openFrameworksアドベントカレンダー](http://qiita.com/advent-calendar/2013/of)
文字列の結合方法による速度差

## 文字列の結合のさせ方によって速度が結構違う
多分これ常識なのかもしれませんが、測ってみてはじめてその速度差がわかったのでメモっときます。

## 下記コードにて計測

```js
var cnt = 100000;
var moji = '';
console.time("Case1");
for (var i = cnt - 1; i >= 0; i--) {
	moji = '';
	moji += 'もじもじ';
	moji += 'もじもじ';
	moji += 'もじもじ';
	moji += 'もじもじ';
	moji += 'もじもじ';
};
console.timeEnd("Case1");

console.time("Case2");
for (var i = cnt - 1; i >= 0; i--) {
	moji = ''+
		'もじもじ'+
		'もじもじ'+
		'もじもじ'+
		'もじもじ'+
		'もじもじ';
};
console.timeEnd("Case2");

console.time("Case3");
for (var i = cnt - 1; i >= 0; i--) {
	moji = [
		''
		,'もじもじ'
		,'もじもじ'
		,'もじもじ'
		,'もじもじ'
		,'もじもじ'
	].join('');
};
console.timeEnd("Case3");
```

Case1 : わりと見かける形。都度都度文字列を結合。メモリの確保と参照変更と破棄を繰り返してる。
Case2 : 一発で文字列結合しちゃう。これ内部的にどういう動きになってんだろ。
Case3 : 今まで自分がやってた方法。

## 計測結果
何回か施行して平均っぽい数字を結果として扱っています。
### Google Chrome
| ケース | 処理時間 | 
|:-----------:|------------:|
| Case1|16.000ms| 
| Case2|5.000ms | 
| Case3|154.000ms| 

Case3（配列をjoin）おそっ！！Case2のおよそ30倍の処理速度がかかってる。これはひどい。

### Firefox
| ケース | 処理時間 | 
|:-----------:|------------:|
| Case1|8.81ms| 
| Case2|1.45ms | 
| Case3|44.79ms| 

処理速度の順位は変わらず。でもChromeより文字列結合速度が早いんだね。

## 結論　＋演算子で一気につなぐのが良さそう
Case3はド派手に遅いのでもう論外として、
Case1とCase2では3～8倍程度の実行速度差が出た。都度都度変数に追加するのはやっぱり無駄が多いみたい。

## join('')はやばい
いままで、コードの見た目的に気に入っていたという理由から
文字列の入った配列をjoin('')して長い文字列を生成してたんですが、
すごいダメ感のある結果であることが判明したので、もしやってる人がいたらやめたほうがいいです。