OmniAICreator/Qiita-1.07M huggingface dataset:
ABC2013Spring: HTML5におけるAndroid端末間互換性

ABC2013Sprint の講演**HTML5におけるAndroid端末間互換性**のまとめです.

走り書きなので, 誤字脱字はあるかもしれないが, 指摘があり次第随時修正します.


## Canvas vs CSS3
### CSS3
- わずかな記法でリッチな表現が可能
- DOMの操作をベースとした記述が主体.
- デザイナー向け.
- Canvasに比べ, 仕様が極めて複雑かつ曖昧, iPhone/Android間に互換性が少ない.
- 同じOS同士のレガシーブラウザでも端末間で挙動が大きく違う. 

### Canvas
- わずかな表現に相当の記述が必要.
- ピクセル単位の操作が主体.
- プログラマー向け.
- 構文の解釈の違いによる互換性の問題は少ない. アンチエイリアシングの有無程度.
- 問題になるのは, レガシーブラウザ自体のバグ/端末特有のバグ/チップセット特有のバグ(GPU, コア, etc. Intelチップ端末)

## よくあるトラブル集
### getImageData/putImageData
- Canvasのピクセル情報を直接操作するAPI
- 透明ピクセル(半透明ピクセル)があった場合に破綻する. getImageDetaで取得するデータは正しいが, putImageDataでα値をセットすると描画が破綻する.
- セットする場合には, 乗算済みαを設定する必要がある.

### Canvas#clip
- 一部の領域だけをマスクして, その部分に描画するAPI.
- クリッピング指定しているが, クリッピングされない. たまにクリッピングされることもある. ブラウザのバグ.
- 描画の前後にCanvas#save()/canvas#restore()を無意味に指定すると解決する.

### 描画する際になぜか画面がclearRectされる.
- Android3.0系列の某端末で発生
- setTimeoutを利用して描画しようとすると, なぜか今までCanvasに買い得てあった秒がを全部消してしまう.
- 描画前にCanvas#getPixelDataを無駄に呼ぶ.
- ``` ctx.getPixelData(0, 0, 1, 1) ```

### 画像のonloadが呼ばれない
- Android2.2系列の某端末で発生
- onloadする直前にsetTimeoutを無駄に呼ぶ
- ```setTimeout(function(){}, 0);```
- デバッガを起動すると正しく動くのでデバッグできない.

### Canvas#drawImage 画像を描画しようとすると空白になる
- Androidの様々な端末で発生
- たまに発生する. 負荷が高まったときなど.
- メモリ不足が原因のはずが多いのでメモリ管理をしっかりする.
- ``` adb shell 'dumpsys meminfo _package-name_' ```


### 本体温度があがると描画が乱れる
- Android4.x系の某端末で発生
- 本体温度があがるとまれに描画が破綻する. 描画されるべき命令がスキップされ, されるべき描画がまれにされなくなる.
- CPUに負荷がかかりすぎないように負荷を調整.

## 問題に対する解決方法
### 発見方法
- たいていの問題は実際の端末で動かすまでは分からない. 人海戦術, サポートからの問い合わせで対応.
- 発生した問題に対して, 似たような端末での動作を疑う. メーカー/シリーズ, Androidバージョン, メモリ搭載量, CPU(シングルコアか否か), GPU. 

### 解決方法

- 一般的な方法(デバッガーで1行ずつ追って見る, 頭の中での想像など)はAndroidのバグの解決方法には適していない.
- 問題が発生する最小サンプルを作成したあと, 回避するコードをひたすら試す. 
- 基本的な動作を疑う.
- ``` ctx.clip(), ctx.transform() ``` あたりをコメントアウトして確認する.
- ``` ctx.save(), ctx.restore() ``` で全体を括ってみる.
- ``` ctx.drawImage() ``` の再現に失敗する場合はメモリを消費させる.

### 回避コード
回避コードは, 全てのANdroidで動作するものが望ましい.

- UserAgentを確認して分岐させる方法は最低のアイディア. 将来のブラウザにも対応するのが望ましい.
- ほとんどコストを発生させずに解決するのが望ましい.
- 回避コードには, 詳しくコメントを書く.

### 可能であれば
ブラウザのソースコードを一度読んでみるとよい.

- 端末ごとの問題はソースコードが公開されていないので, ソースコードから問題の特定は不可能.
- display object.
- WebKit系でなくても, Mozillaでもかまわない. 特にレンダリング周りのコードがよい.

***エンジニアが互換性に文句を言うのは大切だが, ユーザに快適にサービスを使ってもらう方がより大切***
jQueryでIE8で使えない:checkedを使う

IE8でチェックボックスがチェックされているかどうかの確認をする必要があったのだけどCSS3の:checkedが対応していないみたいだった。
いろいろ調べたところセレクタを以下のようにすればチェックの判定が出来るようだった。

```javascript:test.js
$('input:checkbox:checked')
```

ちなみにチェックがついていないやつを判定するには以下のようにする。

```javascript:test.js
$('.rows input:not(:checked)')
```
サウンドブレークポイントを使おう

こちらから初めて知ったネタです。
http://www.slideshare.net/hidetoshimori/blocks-11840728#btnNext


Xcodeでは、
ブレークポイントのマークを右クリック->Edit Breakpont
とするとブレークポイントに細かい指定をすることができます。

ここでAdd Actionボタンを押して、Debugger Command をSoundにします。
すると、ブレークポイントの行を通った時に音がなるようになるんですね。
実行をストップしたくなければ、
Automatically continue after evaluatingにチェックを入れましょう
すると、通ると音が鳴る、というシンプルな挙動になります。

目だけではなく、たまには耳でデバッグしてみると違うものが見えるかもしれませんね。

意外と知ってると便利な小技かなと思います。
[ruby][rails].find_by_sql()でも「?」を使う方法

### .where()の場合

```rb
 .where("reserv.reserv_date BETWEEN ? AND ?", date.to_date.beginning_of_month, date.to_date.end_of_month)
````
 

### .find_by_sql()の場合
```rb
.find_by_sql (["select c.* from campaigns c
join (
select r1.user_id from enquetes e1
join reservs r1 on e1.reservs_id = r1.id
where e1.created_at between ? and ? and
not exists (
select 1 from enquetes e2
join reservs r2 on e2.reservs_id = r2.id
where r1.user_id = r2.user_id and e2.created_at < e1.created_at
)
) e on c.user_id = e.user_id
where c.campaigns_id = 2",base_date.beginning_of_month,base_date.end_of_month])
 ```

となります。

### ポイント
 - []と""の範囲。
 - 条件が長くなるとか、.where()だとパフォーマンスがでない時に使えます。

### 備考：
http://g08m11.hateblo.jp/entry/2013/03/07/092729
TestFlight for Androidの使い方 (Private Beta版)

TestFlightのAndroid版Private Betaに申し込んで使ってみたので、せっかくなので記録しておきます。
基本的には、ほとんどiOS版と同じ使い方になっているので、既に利用経験がある方は特に迷うことはないと思います。

## TestFlight for Androidサービス終了のお知らせ(2014/02/25更新)

TestFlightを提供しているBurstly社をAppleが買収したとのことで、2014/3/21にAndroid向けのサービスは終了することになったそうです。
正式版になったばかりなのに、残念。

* [TestFlight Owner Burstly Acquired By Apple | TechCrunch](http://techcrunch.com/2014/02/21/rumor-testflight-owner-burstly-is-being-acquired-by-apple/)
* [アップル、アプリのテストを手がけるBurstlyを買収か - CNET Japan](http://japan.cnet.com/apple/35044261/)

## 前提

* 本記事は2013/03/14時点のPrivate Beta版をベースに書いています。そのため、今後のアップデートで手順等が変わる可能性があります。
* TestFlightアカウントは作成済み。

## Private Betaの申込み

https://www.testflightapp.com/android/

上記URLの「Your email address」に、現在利用しているTestFlightアカウントのメールアドレスを入れて「Sign up」します。
その後数日ほど待って、TestFlightからAndroid Beta teamへの招待メールが来ます。
（私の場合は3/1に申し込んで、3/8に準備ができたとのメールが来ました）
（と書いていたのですが、その数日前に申し込んでいたのを忘れて再度3/1に申し込んでいました。3/19に2通目の招待メールが来てしまったので、現状ではおおよそ2〜3週間程度かかるのではないかと思います）

メール内の「Accept」ボタンをクリックしてしばらくすると、申し込んだアカウントのTestFlight環境がアップデートされ、APKがアップロードできるようになります。

## TestFlightアプリダウンロード＆インストール

Android版では専用のTestFlightアプリをインストールすることになります。
これは現状Google Playなどから配信されておらず、TestFlightのサイトから直接ダウンロードしてインストールするため、事前に端末の設定で**「提供元不明のアプリ」のインストールを許可**しておく必要があります。

その後、TestFlightへ登録する端末のブラウザから https://testflightapp.com/m/android へアクセスします。
（Android端末でTestFlightのサイトへアクセスすると、上記へリダイレクトしてくれます）

サイト内の「Download TestFlight App for Android」ボタンを押すと、TestFlightアプリのAPKがダウンロードされるので、ダウンロードしたAPKをインストールします。
（私の時は"TestFlightAndroidApp-v1.apk"でした）

## 端末登録

インストールしたTestFlightアプリを起動すると、最初にiOS版と同様のログイン画面が表示されますので、TestFlightアカウントで認証します。

認証することで、その端末がアカウントに紐付けられるようで、TestFlightから「added a device」というメールが来ます。

認証後は、これもiOS版と同様のアプリ一覧画面が表示されます。

アプリ一覧には、現状iOS/Androidのアプリが一緒くたに表示されますが、小さくiOS/Androidのマークが付いているので、それで識別できます。


## アプリの配信

アプリの配信も、iOSと同様、TestFlightのWebサイト https://testflightapp.com/login/ から行います。

TestFlight環境がAndroid対応にアップデートされていると、Upload Buildのファイル指定部分の表記が"Drop your IPA or **APK** here or click to select a file"になっています。

そこに配信するAPKをドラッグ＆ドロップして「Upload」し、Permissionsで配信対象Userを指定して「Just Update」もしくは「Update & Notify」すればOKです。

その後、端末のTestFlightアプリからアプリ一覧を見ると、アップロードしたアプリのアイコンが増えていますので、その脇にある「Install」ボタンをクリックすることでアプリのインストールが始まります。

## 補足

### Upload APIの利用

TestFlightにはUpload APIが提供されており、これを利用することでTestFlightへのアップロード＆配信を自動化することもできます。

https://testflightapp.com/api/doc/

試してみたところ、ファイルの指定箇所にAPKを指定することで、iOSと同じようにアップロード＆配信することができました。

```
curl http://testflightapp.com/api/builds.json -F file=@app.apk -F api_token='<API_TOKEN>' -F team_token='<TEAM_TOKEN>' -F notes='Upload API配信テスト' -F notify=true -F distribution_lists='test'
```

### Desktop Appの利用

現時点のバージョン1.0 (296)では、IPAしか使えませんでした。
こちらもPublic Beta扱いなので、Android対応が正式に近づけば、対応されるかもしれません。
Android Query超いいよ

[Android Query](https://code.google.com/p/android-query/ "")(AQuery)を使ってみました。[AQuery：jQuery for Androidの紹介](http://www.infoq.com/jp/news/2012/04/AQuery "")にあるように、WEBアクセスが必要な時にいちいちLoaderとか使わないで、しかも簡潔に記述できるので使って損はないと思います。

```java
AQuery aQuery = new AQUery(this);

// 非同期でURLにアクセスして、結果をJSONで受け取る
final Progress progress = new ProgressDialog(this);
progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progress.setMessage("Now Loading...");
progress.show();

aQuery .ajax("http://hogehoge.com", JSONObject.class, new AjaxCallback<JSONObject>() {
	/* (非 Javadoc)
	 * @see com.androidquery.callback.AbstractAjaxCallback#callback(java.lang.String, java.lang.Object, com.androidquery.callback.AjaxStatus)
	 */
	@Override
	public void callback(String url, JSONObject object, AjaxStatus status) {
		super.callback(url, object, status);

		try {
			JSONObject jsonDataObject = object.getJSONObject("data");
			JSONArray jsonDataArray = jsonDataObject.getJSONArray("array");
			JSONObject jsonObj = (JSONObject)jsonDataArray.get(0);
			
		} catch (Exception e) {
			e.getMessage();
		} finally {
			progress.dismiss();
		}
	}
});

```
AltSysのテンプレート自動更新で拡張子html以外のファイルも対象にする


xoops_trust_path/libs/altsys/include/autoupdate_from_module.inc.php Line 19

```php
if( is_file( $file_path ) && substr( $file , -5 ) == '.html' ) {
```

というように拡張子は.html固定になってるので下記のように拡張子見てる部分を削除すればOK

```php
if( is_file( $file_path )) {
```
EC2 (EBS backed)で/(root)の容量を増やす（AMI経由）

#EC2 (EBS backed)で/(root)の容量を増やす方法

##１．稼働中のサーバーをstopする
停止しないと、後でAMIから立ち上げ直すのでデータのロスが出る可能性がある。Webサーバー冗長校正で動くようにしてるならStopしないでもイケるような気がいたします。

##２．停止したサーバーでCreateImage (EBS AMI) を実行
AmazonConsoleならサーバーを選択して上のメニューのActionから

##３．VolumeSizeを好きなサイズに変更
適宜。逆にボリュームサイズを下げるのもご自由に。

##４．AMIからインスタンスを立ち上げる
ついでにインスタンスタイプも変更したりご自由に。

##５．sudo resize2fs /dev/xvda1 的なコマンドを叩く
/dev/xvda1の部分は環境によって違うかも。
df -h でrootにマウントされてるFileSystemを入れる
しばらくすると完了する。はず。

##６．もとに戻す
ELBに登録したり、ElasticIPを割り当て治して元のサーバーと完全に入れ替える。

##ETC．その他情報
EBSをマウントし直すこっちの方がいいやり方なのかも知れないです。
http://blog.cloudpack.jp/2011/07/aws-news-ebs-capacity.html
http://blog.cloudpack.jp/2011/08/aws-news-ebs-resize2fs.html
CoffeeScriptでTypeScriptのmoduleっぽい名前空間の初期化

名前空間の初期化をファイル読み込み順番を気にせずにやりたい
ただし継承関係は気にする必要があるので、気をつけることには変わりない。

## 実装

```coffeescript
root = window ? global ? this
root._module_ = (ns, f) =>
  context = root
  hist = []
  for name in ns.split('.')
    unless context[name]?
      context[name] = {}
    context = context[name]
    hist.push context
  f.apply context, hist
```

## 使い方

```coffeescript

# base.coffee
_module_ "App.View", ->
  class @Base

# myview.coffee
_module_ "App.View", (App, View) ->
  class @MyView extends View.Base

# main.coffee
myview = new App.View.MyView
```
Imagick twitterアイコン用gif加工

とりあえず初投稿。
http://hyahha.orz.hm でデモできます。

ImageMagickのインストール方法は省略

```sh:ImageMagickのphpモジュールのインストール
 pecl install Imagick
 php -r "phpinfo();" | grep "php.ini"
 echo "extension=imagick.so" >> "php.iniのパス"
```

```php:twitgif.php
<?php
/**
 * @file
 * GIFアニメーションをTwitter用にリサイズ、圧縮する。
 */

set_time_limit(60);
session_start();
require_once("twitteroauth/twitteroauth.php");
require_once("config.php");
require_once("twitter_user.php");

if ($_SERVER["REQUEST_METHOD"] != "POST" || !isset($_FILES["gif_data"])) {
  header("Status: 400 Bad Request");
  die("400 Bad Request");
}

if (isset($_POST["crop_size"]) && $_POST["crop_size"] == 48) {
  define("GIF_CROP_SIZE", 48);
} else {
  define("GIF_CROP_SIZE", 73);
}

$image = $_FILES["gif_data"];
$screen_name = $user->screen_name;

if ($image["error"] != UPLOAD_ERR_OK) {
  header("Status: 500 Internal Server Error");
  die("upload error");
}
if ($image["type"] != "image/gif") {
  header("Status: 400 Bad Request");
  die("this uploaded file type is not gif");
}

$uniqid = uniqid();

if (strlen($screen_name) < 3) {
  $sub_dir = DOCUMENT_ROOT . "/uploads/other";
} else {
  $sub_dir = DOCUMENT_ROOT . "/uplaods/" . substr($screen_name, 0, 2);
}

if (!is_dir($sub_dir)) {
  mkdir($sub_dir);
}

$user_dir = $sub_dir . "/" . $screen_name;

$file_path = $user_dir . "/" . $uniqid . ".org.gif";
move_uploaded_file($image["tmp_name"], $file_path);

$imagick = new Imagick($file_path);

foreach ($imagick as $im) {
  $im->cropThumbnailImage(GIF_CROP_SIZE, GIF_CROP_SIZE);
}

$gif_path = $user_dir . "/" . $uniqid . ".gif";

$imagick->setCompression(Imagick::COMPRESSION_LZW);
$imagick->quantizeImages(32, Imagick::COLORSPACE_RGB, 0, false, false);
$imagick->writeImages($gif_path, true);
$imagick->destroy();

unlink($file_path);

$gif_url = str_replace(DOCUMENT_ROOT, $host_name, $gif_path);

include("twitgif.inc");
```
sshの接続を省略する方法

~/.ssh/configファイルに設定することで省略できます。

```config:config
# hogeサーバー
Host hoge
    HostName example.com
    Port 22
    User test
    IdentityFile ~/.ssh/id_rsa
```

このように設定すると

```shell:
$ ssh test@example.com
```

普通このように書くのが

```shell:
$ ssh hoge
```

とするだけで接続できるようになります。
Hostの部分は接続の時に使う分かりやすい名前をつけます！

他にscpやrsyncでも同じ設定を使うことができるので

```shell:
$ scp index.html hoge:~/www/
```

みたいに書くことができます！
configにはたくさん設定できるので試してみてください！
CoffeeScriptでモジュールを作る際のGruntfile.coffee

毎回使うパターンだったので書いておく。
ファイル結合 + mochaによるテスト


```bash
$ npm install grunt grunt-contrib grunt-simple-mocha --save-dev
```


Gruntfile.coffee

```coffeescript
module.exports = (grunt) ->
  grunt.loadNpmTasks 'grunt-contrib'
  grunt.loadNpmTasks 'grunt-simple-mocha'

  grunt.initConfig
    connect:
      server:
        options:
          port: 8888
          base: '.'

    watch:
      coffee:
        files: "src/**/*.coffee",
        tasks: ["coffee"]

      coffee_with_test:
        files: ["src/**/*.coffee", 'test/**/*_test.coffee'],
        tasks: ["coffee:compile", 'simplemocha']

    coffee:
      compile:
        files:
          'dist/all.js': [
            "src/**/*.coffee"
          ]

    simplemocha:
      options:
        globals: ['should']
        timeout: 3000
        ignoreLeaks: false
        ui: 'bdd'
        reporter: 'spec'
        compilers: 'coffee:coffee-script'
      all:
        src: 'test/**/*.coffee'

  grunt.registerTask "run", ["coffee","connect", "watch:coffee"]
  grunt.registerTask "run_with_test", ["coffee","connect", "watch:coffee_with_test"]
```
Difference between NSURL and NSString

NSURLとNSStringは似てるようで違うらしい。ちょっとはまったのでメモ。

NSURLを作成するときによく使うURLWithStringでローカルファイルを取得しようとすると以下のようになる。

```
NSURL *url = [NSURL URLWithString:[NSHomeDirectory() stringByAppendingString:@"/Documents/test.txt"]];
```

ちなみにAVFoundationで動画を録画しようとしていたので、このURLを使ってローカルファイルにアクセスしようとするとこのようになる。

```
[movieFileOutput startRecordingToOutputFileURL:url recordingDelegate:self];
```

でもこれではうまくいかないらしい。このURLは以下のようになっている。

```
/var/mobile/Applications/hogehoge/Documents/test.txt
```

でもこれではそもそもURLとしてなりたっていないので、ファイルが見つからんといわれる。これをfileプロトコルでURLとして使うようにできるのがfileURLWithPathだ。

```
NSURL *url = [NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingString:@"/Documents/test.txt"]];
```

以下のようになる。

```
file://localhost/var/mobile/Applications/hogehoge/Documents/test.txt
```
Ersatzを使って数独を解く

[Ersatz](https://github.com/ekmett/ersatz)はSATソルバの入力を__モナドの力__で生成してくれるライブラリ。適当にexistsとassertを並べればうまくやってくれるらしい。ということで、数独ソルバを実装してみた。素晴らしい…

```haskell:sudoku.hs
import Prelude hiding ((||), (&&), not, and, or)
import Data.Char
import Data.Array
import Data.Ix
import Data.Word
import Control.Monad
import Control.Monad.State
import Ersatz -- (ersatz-0.2)

fieldRange = ((1,1),(9,9))

unique :: Equatable a => [a] -> Bit
unique = go [] where
    go ss (x:xs) = and (map (/==x) ss) && go (x : ss) xs
    go _ [] = true

sudoku :: (MonadState s m, HasSAT s) => Array (Int, Int) Char
    -> Array (Int, Int) Bit4 -> m (Array (Int, Int) Bit4)
sudoku problem answer = do
    forM_ (range fieldRange) $ \ix -> assert $ if isDigit (problem ! ix)
        -- 既に埋められているマスを確定
        then answer ! ix === encode (toEnum $ digitToInt $ problem ! ix)
        -- 空いているマスには1から9までの数字が入る
        else let Bit4 b3 b2 b1 b0 = answer ! ix in or
                [ b3 && not b2 && not b1 -- 8,9
                , not b3 && (b2 || b1 || b0) -- excepting 0
                ]
    -- 行が一意
    forM_ [1..9] $ \r -> assert $ unique [answer ! (c, r) | c <- [1..9]]
    -- 列が一意
    forM_ [1..9] $ \c -> assert $ unique [answer ! (c, r) | r <- [1..9]]
    -- ブロック内が一意
    forM_ (range ((0,0),(2,2))) $ \(sc, sr) ->
        assert $ unique [answer ! (sc * 3 + c, sc * 3 + r) | c <- [1..3], r <- [1..3]]
    return answer

showField :: (Result, Maybe (Array (Int, Int) Word8)) -> IO ()
showField (_, Just answer) = forM_ [1..9] $ \r -> do
    forM_ [1..9] $ \c -> putChar $ intToDigit $ fromEnum $ answer ! (c, r)
    putChar '\n'
showField _ = fail "Impossible"

main :: IO ()
main = do
    problem <- liftM (array fieldRange . concat)
        $ forM [1..9] $ \r -> do
            line <- getLine
            return [((c, r), ch) | (c, ch) <- zip [1..9] line]
    let sat = replicateM 81 exists >>= sudoku problem . listArray fieldRange
    minisatPath "cryptominisat" `solveWith` sat >>= showField
```

```
$ runhaskell sudoku.hs
-9---3---
-7----8--
---5--2--
5--------
-----7-91
2---4----
----6-4--
6--2-----
-------7-
192783645
375691824
864539217
548912763
426857391
217346958
739165482
681274539
953428176
```
knife searchで複数のキーワードを指定する



こんな感じ。
括弧も使える。
書いてないけどワイルドカード(*)も使えます。

```sh:tagにWebかつproductionを割り当てたNode一覧をサーチ
$ knife search node "tags:web AND tags:production"
```

```sh:recipe[hoge]がrun_listにあり,tagがproduction又はdevelopmentのNode
$ knife search node "recipe:hoge AND (tags:production  OR tags:development)"
```

ではrecipe内で似たようなことをする時はというと、
これでもよいですが

```default.rb
if(node[:roles].include?("web-server") &&
   node[:tags].include?("wordpress-web-servers"))
```

searchを使うのも良いかもですね。
以前書いたwordpress構築recipeから抜粋。

```rb:search例
#
# recipe実行ノードがMySQLDBサーバ(Master)であれば初期化実行
#
if(node[:roles].include?("db-server") && node[:tags].include?("wordpress-db-master"))
  # アクセス許可するWebサーバを検索し、サーバの内部IPからアクセスできるよう権限付与
  web_server = search(:node,"role:web-server AND tags:wordpress-web-servers")
  web_server.each do |sv|
    execute "access-accept" do
      command %Q{mysql -u root -e "grant all privileges on *.* to '%'@#{sv["cloud"]["local_ipv4"]}"}
    end
  end

  execute "flush-privileges" do
    command %Q{mysql -u root -e "flush privileges"}
  end
  directory "/tmp/dbdata" do
    action :create
  end

  directory "/tmp/dbdata" do
    action :create
  end

  git "/tmp/dbdata" do
        repository app["repo"]
        reference "master"
        action :sync
  end

  execute "createdb" do
        command "mysql -u root -h localhost < /tmp/dbdata/initWordpress.sql"
        action :run
  end
end
```
Configuration AVCaptureDevice


AVCaptureDeviceで取得したデバイスの設定をいろいろ変えたいときがある。カメラの場合はフラッシュ光らせるとか、オートフォーカスにするとか。
AVCaptureDeviceには`focusMode`や`torchMode`など各種プロパティが存在するが以下のようにやっては変更ができない。

```
device.focusMode = AVCaptureFlashModeOn;
```

デバイスはロックされているため、設定を変えたければ一度ロックを行なって、解放するという作業が必要になる。具体的には以下のように書けばよい。

```
NSError *err;
[device lockForConfiguration:&err];
device.focusMode = AVCaptureFlashModeOn;
[device unlockForConfiguration];
```

ただむやみにlockを行うと他のアプリケーションのキャプチャ品質に影響を及ぼすのでご注意を。
taglistプラグインの話

vimには、taglistプラグインというものがあります。関数名一覧などが表示されジャンプされる便利なものです。ただ、taglistが最後のウィンドウになった場合にtaglistだけが残って表示されてしまうので、どうにかできないかなと思って調べました。
下記のようTlist_Exit_OnlyWindowを1に設定をするとよいようです。

```vim:.vimrc
"taglist
let Tlist_Exit_OnlyWindow = 1 "taglist が最後のウインドウなら vim を閉じる
let Tlist_Show_One_File = 1 "現在編集中のソースのタグしか表示しない
```
NSScanner NSStringを探索する


NSScannerはNSStringを探索するクラスです。
[正規表現](http://qiita.com/items/4847c86d0b99ac68727e)やNSStringとは違った文字列の探索が出来ます。

## ざっとした概要

NSScannerは位置(scanLocation)を保持しています。
各メソッドで位置を進めつつ順次探索することが出来ます。

## 例1 URLのクエリパラメーターを取得

	@"text=aiueo&query=search&target=ea

**query** に対応する文字列を取得します。

```objectivec:Sample.m
NSScanner *scanner = [NSScanner scannerWithString:@"text=aiueo&query=search&target=ea"];

// 「query=」を見つけるまで探索する。scannerは「q」の位置に進む
[scanner scanUpToString:@"query=" intoString:nil];

// 現在の位置(q)から「query=」を探索する。scannerは「s」の位置に進む
[scanner scanString:@"query=" intoString:nil];

NSString *resultStr;
// 現在の位置(s)から「&」を見つけるまで探索する。scannerはtargetの1つ前の「&」の位置に進む
//「s」の位置から「&」を見つけるまで探索した結果がresultStrに割り当てられる
[scanner scanUpToString:@"&" intoString:&resultStr];
NSLog(@"%@", resultStr); // search
```

## 例2 数値を取得

	@"abcd123456"

文字列に含まれる数値を取得します。

```objectivec:Sample.m
NSScanner *scanner = [NSScanner scannerWithString:@"abcd123456"];
// 無視するキャラクターセットを設定(アルファベットの小文字)
[scanner setCharactersToBeSkipped:[NSCharacterSet lowercaseLetterCharacterSet]];
NSInteger integer = 0;
// 先頭から数値を探索(アルファベットは無視される)
[scanner scanInteger:&integer];
NSLog(@"%d", integer); // 123456
```

## 例3 全ての数字を取得

	@"abcd123EFg456"

アルファベットと数字が混在する文字列から全ての数字を取得します。

```objectivec:Sample.m
NSScanner *scanner = [NSScanner scannerWithString:@"abcd123EFg456"];
NSMutableString *mStr = [NSMutableString string];
// 無視するキャラクターセットを設定(アルファベットの大文字・小文字)
[scanner setCharactersToBeSkipped:[NSCharacterSet letterCharacterSet]];
// 文字列の末尾に到達するまで探索を繰り返す
while (scanner.isAtEnd == NO) {
    // 先頭から数値を探索(アルファベットは無視される)
    [scanner scanInteger:&integer];
    [mStr appendFormat:@"%d", integer];
}
NSLog(@"%@", mStr); // 123456
```

## カテゴリ

例1をしやすいようにNSScannerのカテゴリに実装しました。

```objectivec:NSScanner+Extras.h
@interface NSScanner (Extras)

+ (void)extractStringWithAllString:(NSString*)allStr startString:(NSString*)startStr endString:(NSString*)endStr result:(void(^)(NSString*))result;

@end
```
```objectivec:NSScanner+Extras.m
#import "NSScanner+Extras.h"

@implementation NSScanner (Extras)

+ (void)extractStringWithAllString:(NSString*)allStr startString:(NSString*)startStr endString:(NSString*)endStr result:(void(^)(NSString*))result
{
    NSScanner *scanner = [NSScanner scannerWithString:allStr];
    [scanner scanUpToString:startStr intoString:nil];
    [scanner scanString:startStr intoString:nil];
    [scanner scanUpToString:endStr intoString:&resultStr];
    result(resultStr);
}

@end
```
```objectivec:Sample.m
[NSScanner extractStringWithAllString:@"text=aiueo&query=search&target=ea"
                          startString:@"query="
                            endString:@"&"
                               result:^(NSString *resultStr){
                                   NSLog(@"%@", resultStr); // search
                               }];    
```

## まとめ

- 例1や3のような順次取得(or処理)していく用途で使いやすいかと思います。
String s = の行でペーストするとダブルクォーテーションをエスケープするプラグイン

>おぉ、NetBeans7.3は「{"id":1,"name":"hoge"}」をペーストするときに、「String s="」の続きにペーストすると勝手に「{\"id\":1,\"name\":\"hoge\"}」になってくれる！文字列リテラルの外だとそのままペーストされる！便利！

https://twitter.com/kis/status/312066538947637249

[@kis](https://twitter.com/kis) さんがこう言っていたのでSublimeTextのプラグインを作ってみました。

```python:StringEscapePaste.py
import sublime, sublime_plugin
import re

class StringEscapePasteCommand(sublime_plugin.TextCommand):
	def run(self, edit):
		line_str = self.view.substr(self.view.line(self.view.sel()[0]))
		match = re.match('^\s*String\s+.+\s*=', line_str, re.I)
		if match:
			clipboard = sublime.get_clipboard()
			self.view.insert(edit, self.view.sel()[0].begin(), clipboard.replace('\"', '\\\"'))
		else:
			self.view.run_command('paste')
```
正規表現を見て、ん？と思った方。素晴らしい洞察力です。
その想像通り変数初期化時にしか使えません。

### これではあまりにも酷いので
キャレットがダブルクォーテーションに挟まれていたらエスケープするように改良しました。

```python:StringEscapePaste.py
class StringEscapePasteCommand(sublime_plugin.TextCommand):
	def run(self, edit):
		line_str = self.view.substr(self.view.line(self.view.sel()[0]))
		match = re.search('\".*\"', line_str)
		if match:
			sel_rowcol = self.view.rowcol(self.view.sel()[0].begin())
			if match.start() < sel_rowcol[1] and sel_rowcol[1] < match.end():
				clipboard = sublime.get_clipboard()
				self.view.insert(edit, self.view.sel()[0].begin(), clipboard.replace('\"', '\\\"'))
			else:
				self.view.run_command('paste')
		else:
			self.view.run_command('paste')
```
背景をキリックしたら、ソフトキーボードを隠す

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

    // 背景をキリックしたら、キーボードを隠す
    UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeSoftKeyboard)];
    [self.view addGestureRecognizer:gestureRecognizer];
}

// キーボードを隠す処理
- (void)closeSoftKeyboard {
    [self.view endEditing: YES];
}
```
BitBucketとPivotalTracker の連携


##1.API TOKENを発行する

PivotalTrackerのProfileページに移動

https://www.pivotaltracker.com/profile

'CREATE NEW TOKEN'をクリック

発行される

##2.BITBUCKET に設定

1.リポジトリを選択し、ADMIN画面(GEARアイコンクリック)に移動

2.左メニュー'フック'を選択

3.'フックを選択してください…' → 'PIVOTAL TRACKER'を選択し、追加する

4.API TOKEN をペッと貼り付ける

##3.連携させる

PivotalのIDをGitのSubjectに含めてコミットする 
例えばIDが03729898の場合は[#03729898]
Chrome拡張でManifestファイルの情報を取得する

```js:Sample
var manifest = chrome.runtime.getManifest()
```

chrome.runtime APIはChrome 22で追加されたようです
 [What's New in Extensions? - Google Chrome](https://developer.chrome.com/extensions/whats_new.html#22)

chrome.runtime APIの詳細はこちら
[chrome.runtime - Google Chrome](https://developer.chrome.com/extensions/runtime.html)
Mosh設定 (Mac & Ubuntu@EC2)


## Moshとは

### モバイル環境用ssh

- ローミング可能
- 断続的な接続でも平気
- ローカルエコーで快適なレスポンス

mosh: MITからモバイル時代のSSH代替品
http://d.hatena.ne.jp/karasuyamatengu/20120411/1334092521

Mosh
http://mosh.mit.edu/

## 環境

- client: MacOSX 10.8 MountainLion
- server: Ubuntu12.04 @AmazonEC2

## クライアントインストール

Homebrew

>
brew install mobile-shell

or インストーラダウンロード:
http://mosh.mit.edu/#getting

## サーバー側インストール & ファイアウォール設定

>
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:keithw/mosh
sudo apt-get update
sudo apt-get install mosh
sudo ufw allow 60000:61000/udp

参考:
http://d.hatena.ne.jp/karasuyamatengu/20120411/1334092521

## いざ

> mosh ubuntu@myserver.com

以下のエラー

>
Can't locate IO/Pty.pm in @INC (@INC contains: /opt/local/lib/perl5/site_perl/5.12.4/darwin-thread-multi-2level /opt/local/lib/perl5/site_perl/5.12.4 /opt/local/lib/perl5/vendor_perl/5.12.4/darwin-thread-multi-2level /opt/local/lib/perl5/vendor_perl/5.12.4 /opt/local/lib/perl5/5.12.4/darwin-thread-multi-2level /opt/local/lib/perl5/5.12.4 /opt/local/lib/perl5/site_perl /opt/local/lib/perl5/vendor_perl/5.12.3 /opt/local/lib/perl5/vendor_perl .) at /usr/local/bin/mosh line 38.


* 使用するperlをMacPortsのものから内蔵のものへ変更

>
sudo chmod 755 /usr/local/Cellar/mobile-shell/1.2.3/bin/mosh

> sudo vim /usr/local/Cellar/mobile-shell/1.2.3/bin/mosh

1行目 perl -> /usr/bin/perl

参考:
http://www.justskins.com/forums/cant-locate-io-tty-31220.html

* EC2で利用する場合、AWSもファイアウォールの設定変更が必要

>
AWS Management Console: Amazon EC2: EC2 Security Groups:
quicklaunch-1を選択
Inbound タブ
Custom UDP Rule メニュー選択
Port range: 60000-61000
Add Rule クリック
Apply Rule Changes クリック

引用元: 
http://d.hatena.ne.jp/karasuyamatengu/20120416/1334537979
pubmed IDから論文のリストを作ろう（調査編）


##経緯
研究室の論文管理が煩雑なので（WEBに載せる必要がある，報告書に書く必要がある，科研費の申請の書類に必要，しかもそれらはフォーマットが違ったりする←∑(ﾟдﾟlll)ｶﾞｰﾝ　んじゃ，pubmedから情報を収集するフォーマットと，それを簡単に編集できるプログラムを書いたらいいんじゃない？と思い，ちょいと取り組んで見ることにした。

>PubMed（ぱぶめど）は、アメリカ国立医学図書館の国立生物工学情報センター(NCBI)が運営する医学・生物学分野の学術文献検索サービス(Wikipedia) 

##まずはイメージしよう
###モックアップで書いてみた

イメージをしてみた。Google翻訳に近い感じ。左にPubmed IDを入れるてSearchボタンを押すと，一覧が結果にして現れる。html且つ[microdata](http://support.google.com/webmasters/bin/answer.py?hl=ja&answer=176035)も入れられたら素晴らしい。が，まずは単純に書きだすことを考えよう。[モックアップ作成ツール -Mockup Designer](http://fatiherikli.github.com/mockup-designer/)[使い方等の紹介](http://coliss.com/articles/web-services/online-mockup-designer-by.html)

![イメージ](http://4.bp.blogspot.com/-WQZC8CkyFss/UUGIS6NtDhI/AAAAAAAAARE/lRZN-L4gazU/s1600/umu.jpeg)

こんな感じで目的のページや何やらにコピペ出来ればいいんじゃない？というかこんなに字は大きくなくて良いのだけど(^_^;)
ちなみに右上のSelect pubからSerect Presentationとかで
入力形式を指定出来れば良いのではないだろうか。

## どこからデータを取得しようか
###xml形式でデータを取ってこられるって聞いたことがあるぞ。


[BioHackathon](http://www.biohackathon.org/)で
[Rare Diseaseグループで](https://github.com/dbcls/bh12/wiki/Rare-disease)関連のプログラムを書いていた時に確かpubmedからxmlでデータを取得したとMさんから聞いたことがあるぞ。
というわけで調べたり，記録を辿ったり（Mさんが書かれたプログラムを見たり）してみた。
どうやら`webAPI`で提供されているらしい。

* [参考：人力検索はてなでの質問](http://q.hatena.ne.jp/1177119852)
* [PubMed APIのまとめ](http://yubais.net/doc/pubmed_api/)

>関係ないですが，上のサイトの方が作られたTwitterのグーグルライクアプリ[BossKitter](http://bskt.yubais.net)が面白いです。新規ツイートがもしかしてで表示されるところとかツボ。

さて本題に戻ろう。
これらの紹介にもあった通り，NCBIのURLにアクセスして，

```url
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=22674858,22434880
```
id=の後にPubmed IDを入れるとxmlを返してくれる。（一部抜粋）

```xml:sample.xml
<eSummaryResult>
<script />
<DocSum>
<Id>22674858</Id>
<Item Name="PubDate" Type="Date">2012 Oct</Item>
<Item Name="EPubDate" Type="Date">2012 Jul 10</Item>
<Item Name="Source" Type="String">Proteins</Item>
<Item Name="AuthorList" Type="List">
<Item Name="LastAuthor" Type="String">Mizuguchi K</Item>
<Item Name="Title" Type="String">
Computational design, construction, and characterization of a set of specificity determining residues in protein-protein interactions.
</Item>
<Item Name="Volume" Type="String">80</Item>
<Item Name="Issue" Type="String">10</Item>
<Item Name="Pages" Type="String">2426-36</Item>
<Item Name="LangList" Type="List">
<Item Name="NlmUniqueID" Type="String">8700181</Item>
<Item Name="ISSN" Type="String">0887-3585</Item>
<Item Name="ESSN" Type="String">1097-0134</Item>
<Item Name="PubTypeList" Type="List">
<Item Name="RecordStatus" Type="String">PubMed - in process</Item>
<Item Name="PubStatus" Type="String">ppublish+epublish</Item>
<Item Name="ArticleIds" Type="List">
<Item Name="DOI" Type="String">10.1002/prot.24127</Item>
<Item Name="History" Type="List">
<Item Name="References" Type="List" />
<Item Name="HasAbstract" Type="Integer">1</Item>
<Item Name="PmcRefCount" Type="Integer">0</Item>
<Item Name="FullJournalName" Type="String">Proteins</Item>
<Item Name="ELocationID" Type="String">doi: 10.1002/prot.24127</Item>
<Item Name="SO" Type="String">2012 Oct;80(10):2426-36</Item>
</DocSum>
```

もしかしたら，もっと良い方法があるかもしれないのだが，とにかく，このxmlを解析すれば，必要なデータを取ってこられるはずだ。
ウェブ上で動かすとなると，どの言語が適切か，よく考えよう。今日はもう帰るので，Qiitaの皆さん，良きアイデアがありましたら，教えてください☆
Padrino使ってQRcodeを表示させる


## 準備

```
$ padrino g project testqr -e slim
$ cd testqr
$ bundle install
```

## Gemfile

以下をGemfileに追記

```
gem 'rqrcode'
gem 'rqrcode_to_svg'
```

追記後に``bundle install``を行うこと

## 作成

コントローラーの作成

```
$ padrino g controller qrtest get:index get:code
```

```ruby:app/controller/qrtest.rb
Testqr.controllers :qrtest do

  get :index, map: "/index" do
    render "qrtest/index"
  end

  get :code, map: "/code" do
    RQRCode::QRCode.new('http://www.co-meeting.com', size: 4, level: :h ).to_svg
  end
end
```

ビューの作成

```slim:app/view/layout/qrtest/index.slim
object type="image/svg+xml" data="code"
```

## 説明

``padrino start``でサーバを起動させる。

``http://localhost:3000/qrtest/index``にアクセスすると、QRコードが表示されるはず。

テンプレートファイルにあるobjectタグがポイントで、data属性でURLを指定している。その結果、qrtest/codeへリクエストが発生し、to_svgでSVGに変換されたQRコードのデータがブラウザへ返信されることでレンダリングが行われる。

ChromeなどのSVGによるレンダリングが可能なブラウザでは、SVGデータを送ってあげればQRコードがレンダリングされる。
SVGが使えない場合は、PNGなどへの出力を行うことを検討しよう。

## 参照元URL

RQR Code
https://github.com/whomwah/rqrcode

RQR Code to SVG
https://github.com/verisimilitudinous/rqrcode_to_svg


スタートアップ SVG「第１回 SVGの基礎知識」
http://gihyo.jp/dev/feature/01/svg/0001

## 備考

- ブラウザはChromeなどで見てください。SVGのレンダリングが行えるブラウザでしか見られません。
- Ruby2.0.0-p0で動作を確認しています。
CapybaraのJavaScriptテスト自動化時Seedを使う方法

## 背景: DatabaseCleanerでtruncateするので、seedが消えてしまう

[Rspec Capybara_webkitを使ってjavascriptをテストする - Kinopyo Blog](http://kinopyo.com/blog/test-javascript-spec-in-rspec-with-capybara-webkit/) の記事に書かれていらっしゃるように、CapybaraのJavaScriptテスト実行時は、

- transactional_fixturesをOFF
- DatabaseCleanerを使う
- DatabaseCleanerのstrategyにはtruncationを指定する

というやり方が一般的。
truncationを使うということは、table中のデータが全部きえるので、seedが消えてしまう、ということ。

truncationを使うけど、seedを使う方法について以下にまとめ。

## Seedを使いたいケース 1

たとえば、都道府県マスタテーブルのようなほぼ、静的なテーブルを使っているようなケースなど、test environmentでもseedを使いたいケースがあると思う。

この場合、truncateの対象から外す事で、seedを消させないことができる。

```
Cucumber::Rails::Database.javascript_strategy = :truncation, {:except => %w[prefectures]}
```

## Seedを使いたいケース 2

usersテーブルのID=1は「admin」というスーパー管理者である、といったケースもある。
この場合、テスト時は、usersテーブルの、ID=1以外のレコードは消したい。
producationコードのセットアップ上、ID=1のデータはseedを使って登録したい。

このようなケースでは、自分の場合、truncateしたあとに、Seedで個別のテーブルだけ挿入する、というやりかたで対応した。
なお、seeds.rbの場合特定のテーブルだけのSeedを登録する、といったことには対応できない(と、思う)

そこで、[seed-fu](https://github.com/mbleigh/seed-fu) を使う。
seed-fuはテーブル単位でseedを管理でき、すでにレコードが存在しているなら挿入しない、などができて便利。

Cucumberから使ってるとして、usersテーブルにID=1のレコードが存在してほしいケースだけ、stepからseedを使ってレコードを挿入するようなやり方をした。

```
前提 /^管理画面トップページを表示している/ do
  SeedFu.quiet = true
  SeedFu.seed(File.join([Rails.root, 'db', 'fixtures']), /(?-mix:users)/)
  visit admin_root_path
end
```

こんな感じ。
Playストアアプリを起動する＆アプリがインストールされているかチェックする

アプリ内からパッケージを指定して、Playストアアプリを起動させる方法です。

```java
public void execPlayApp(Context context, String targetPackage) {
		Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + targetPackage));
		try {
			context.startActivity(intent);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
```

さらに、起動したいアプリがインストールされているかをチェックすれば、アプリがインストールされていない時は、Playストアに飛ばすこともできますね。

```java
public boolean isInstall() {
		try {
			// パッケージ名を指定してインストール状況をチェック
			PackageManager packageManager = this.getPackageManager();
			ApplicationInfo applicationInfo = packageManager.getApplicationInfo(TARGET_PACKAGE, PackageManager.GET_META_DATA);
			if (applicationInfo != null) {
				return true;
			}
		} catch (NameNotFoundException exception) {
			return false;
		}

		return false;
	}
```
Symfony vs PECL: YAMLのパースベンチマークとってみた


PECLのパーサーのほうがSymfonyのより、断然早かった。

## 比較対象

1. [pecl yaml](http://pecl.php.net/package/yaml) 1.1.0-dev
2. [Symfony Yaml](https://github.com/symfony/Yaml) v2.2.0


## 比較方法

* PHP 5.4.5

```php
<?php

require_once 'vendor/autoload.php';

$yaml = "foo: 1
bar: 2
baz: 3
";


function bench(callable $target)
{
    $start = microtime(true);
    
    for ($i = 0; $i < 10000; $i +=1) {
        $target();
    }
    
    return microtime(true) - $start;
}

$time = bench(function () use ($yaml) {
   yaml_parse($yaml); 
});

echo "yaml_parse(): $time", PHP_EOL;

$time = bench(function () use ($yaml) {
    Symfony\Component\Yaml\Yaml::parse($yaml);
});

echo "Symfony\Component\Yaml\Yaml::parse(): $time", PHP_EOL;
```

## 結果

```
yaml_parse(): 0.13212895393372
Symfony\Component\Yaml\Yaml::parse(): 3.0159339904785
```
Ruby技術者認定試験Silver 必勝合格法

2011年秋、[Ruby技術者認定試験Silver](http://www.ruby.or.jp/ja/certification/examination/)を受験し、無事合格しました。今年に入ってから同僚にも取得者が出てきました。というわけで、自分が受験したときの話や、他人の話をまとめてきましたよ。

# ★☆注意☆★

[Ruby 技術者認定試験は 2014/10/1 に改訂されます](http://www.ruby.or.jp/ja/news/20140715.html)。本記事は旧バージョン受験時のものなので、参考にしないほうがいいでしょう。……参考に……し……してもいいけど、どうなっても知りませんよ!

# ~~注意(2013/9/23追記, 2013/12/4, 2014/7/10更新, 2014/8/3 取消し)~~

 ~~現行(2014/7/10現在)の試験は、Gold/Silverとも Ruby 1.8.7 を対象としています。しかし[Ruby 1.8.7 はレガシーになり、公式のサポートはもはや提供されていません](https://www.ruby-lang.org/ja/news/2013/06/30/we-retire-1-8-7/)。Heroku 社によって提供されていた延長サポートも[2014/7/31で終了します](https://www.ruby-lang.org/ja/news/2014/07/01/eol-for-1-8-7-and-1-9-2/)。今から Ruby 1.8.7 を使うのは激しく非推奨です。~~

 ~~ですから、……これは個人的な意見ですが……まじめに勉強したい皆様には、受験の延期を推奨します。~~

 ~~逆にまじめでない (単純に資格をゲットしたいだけの方) なら、今のうちに受験するのがおすすめです。1.9 以降は比較的ややこしくなるので (特にStringまわり)、今のほうが学習量が少なくて済むはず、です。~~

※[2014/10/1 から Ruby 2.1 対応の問題に改訂されます](http://www.ruby.or.jp/ja/news/20140715.html)。これで Ruby 1.8 系に触る理由が無くなりましたね。

# 試験の内容

試験は4択問題が50問で、100点満点中75点以上を取れば合格です。

# Ruby でのプログラミング経験が豊富な人

1. [Ruby技術者認定試験 公式ガイド](http://www.amazon.co.jp/dp/4822234304) の付属の練習問題をやる。
2. 解けなかった問題の周囲を勉強する。

これだけです。

やってみるとわかりますが、かなり経験豊富な人でも 1. でいきなり合格点を超えるのは難しいです。かなり凹みます。でも仕方ありません。経験豊富な人でも解けない問題が多いです。これは Ruby の各種組み込みクラスやメソッドの多様性に起因しています。知らないメソッドが問題に出てきた、と思ったら、良く知ってるメソッド別名だった、とか。だいたいそのパターンです。Enumerable#map と Enumerable#collect は同じ振る舞いをするメソッドですが、だいたいどちらか片方しか使わないものでしょう? 点数が取れないのは、だいたいそのせいです。

練習問題で手薄なところに気づいたら、あとは[るりま](http://doc.ruby-lang.org/ja/)を読みながら、ひたすら暗記です。

練習問題と本番の問題はかなり似ているので、これで攻略できてしまいます。

くれぐれも無勉で一発合格できるなどと思わないように!

# Ruby でのプログラミング経験が少ない人

1. [Ruby技術者認定試験 公式ガイド](http://www.amazon.co.jp/dp/4822234304) で Ruby をひととおり勉強する。
2. API を irb (または pry) で叩いて覚える
3. 公式ガイドの練習問題を繰り返しやる

この試験で点数を稼ぐコツは単純です。暗記、暗記、暗記、です。深く考えないと解けないような問題はでません。「日商簿記3級」とか「漢字検定2級」みたいなものです。

API や構文を一個ずつ根気よく写経していきましょう。

# コツ

## 練習問題はパーフェクトに解けるように

出題される問題の 90% くらいは練習問題のバリエーションです。練習問題が100%解けるようになれば、まず間違いなく合格できます。練習問題をパーフェクトに解けるようにてしおきましょう。

## 練習問題に出ないものは手を抜く

練習問題に出てこないものをがんばって覚えてもあまり試験には出てきませんから、あまり時間をかけないようにしましょう。

## 難しい問題は捨てる

50問中、ひっかけ問題やマニアックな知識を問う問題が1問〜2問程度出題されます。Rubyのコミッタでも解けないような問題です。どれだけ勉強をしても解けません。さっさとあきらめて、適当にそれっぽい選択肢を選んで、次の問題に進みましょう。

## 驚き最小の原則

Ruby という言語は「驚き最小の原則」にしたがって設計されています。びっくりするような挙動をしないように、丁寧にメソッド名やクラス名が決められています。

問題で迷ったときは、このことを思い出してください。『まつもとゆきひろさんが「驚き最小の原則」にしたがって設計したら、この問題の答えはどうなるだろうか』を考えてみると、解けるかも……?

# 合格したら

めでたく合格してから1ヶ月ほど経つと、合格証明書が届きます。Ruby のふるさと、島根県のなんかすごい和紙でできた合格証明書です。「まつもと ゆきひろ」の署名が輝いています。(その合格証明書を使うと給料が上がる、住宅ローンの契約時に有利になる、転職時に有利になる、……というような効果はとくにありません。)

次はRuby技術者認定試験Gold目指してがんばりましょう。
Facebookの氏名を日本語表記で取得する


## 追記

コメントにて指摘をいただきました。
Graph APIを用い、`me?locale=ja_JP`とするだけでも、日本語で情報を取得できるようです。

以下はFQL組み立て時の備忘として、残しておきます。
　
　
---
---

新しいSDK(v.3〜)に対応した書き方です。

graph APIにて"me"を指定するだけでは、ローマ字の表記しか取得することができません。
日本語で取得するには、FQLを使用し、localeを日本に設定する必要があります。

## Graph APIエクスプローラで試してみる

検証をするには、[graph APIエクスプローラ](https://developers.facebook.com/tools/explorer)が便利です。
トークンを取得して、以下を入力します。

`fql?q=SELECT uid, name, pic, sex FROM user WHERE uid = me()&locale=ja_JP`

```
{
  "data": [
    {
      "uid": 01234567890, 
      "name": "苗字 名前", 
      "pic": "http://hogehoge", 
      "sex": "男性 or 女性"
    }
  ]
}
```

こんなかんじで出力されるはずです。  
  


## iOS SDKで試してみる

エクスプローラではクエリにq=hoge&local=hogeと入力していたところを、FBRequestのparametersプロパティに足していきます。

※実行時はあらかじめセッションを開いておく必要があります

``` objc:.m
FBRequest* request = [FBRequest requestForGraphPath:@"fql"];
// クエリを追加
[request.parameters setObject:@"SELECT uid, name, pic, sex FROM user WHERE uid = me()" forKey:@"q"];
// localeを追加
[request.parameters setObject:@"ja_JP" forKey:@"locale"];
// 取得
[request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
    if (error) {
        // エラー処理
    } else {
        NSLog(@"%@", result);
    }
}];

/*
result: {
     "data": [
         {
         "uid": 0123456789,
         "name": "苗字 名前",
         "pic": "https://hogehoge",
         "sex": "男性 or 女性"
         }
     ]
}
*/

```

## 注意点

- 氏名以外の表記も日本語になる

localeに日本を指定すると、性別表記も日本語に(male/female → 男性/女性)なります。


- 要素名が若干違う

API使用時と、idがuidに、pictureがpicになっていたりなど、要素名に若干の違いがあります。

- 返却されるデータはdictinary > array > dictinary

なので、上の例では

```objc:
[[[result objectForKey:@"data"] objectAtIndex:0] objectForKey:@"uid"];
```

でデータを取得することができます。


## 参考

[Facebook Query Language (FQL) Reference](https://developers.facebook.com/docs/reference/fql/)

[FQL in the SDK 3.0 Beta for iOS](http://stackoverflow.com/questions/11487803/fql-in-the-sdk-3-0-beta-for-ios)
Ruby の多重代入に関する何か

```ruby
>> a, *b, c = [1, 2, 3, 4, 5, 6]
=> [1, 2, 3, 4, 5, 6]
>> p a, b, c
1
[2, 3, 4, 5]
6
```

この動きマジで……知らなかった…… Ruby 1.9.3 以降です。

ブロック引数でも同じく。

```ruby
[1, 2, 3, 4, 5, 6].tap do |a, *b, c|
  p a, b, c
end
1
[2, 3, 4, 5]
6

```

べ、べんり？
HTML&XHTML標準（HTML5も）に準拠しているか検証できるサービス


3つ紹介します。
どれもこの3パターンで検証できます。

1. URLからの検証
2. ファイルをアップロードして検証
3. ソースを貼り付けて検証

##[W3C Markup Validation Service](http://validator.w3.org/)
天下のW3Cさんの検証サービス。

ただ、HTML5で検証しようとすると、

* Using experimental feature: HTML5 Conformance Checker.
* Using Direct Input mode: UTF-8 character encoding assumed（Direct Inputの場合のみ？）

という2つのwarningが出てウザい。
HTML5使いたいなら気にするものでもないんだけど、warning出ちゃうのはなんとなく嫌だよね。

##[(X)HTML5 Validator](http://html5.validator.nu/)
HTML5だったらこれかな。
究極にシンプルで使いやすい。
なので、HTML5で検証したい方にはこっちのほうがオススメ。

##[Another HTML-lint 5](http://www.htmllint.net/html-lint/htmllint.html)
細かい設定ができるっぽい。
しっかりチェックしたい場合にはいいかも。
個人的にはデザインが古臭いので好きくない。
ワイルドカード自己署名証明書の作成

* ワイルドカードな自己署名証明書だと複数の証明書を管理しなくていいなあというので作成手順を調べてみた。

# ワイルドカード自己署名証明書の作成手順
 * 基本的に普通の自己署名証明書の作成手順と同じ
 * CSRでワイルドカードを指定する
 * ただし、この手順で有効なサブドメインはwww.example.comやmail.example.comで、ドットが入ったwww.test.example.comなんかには対応していないみたい

```
$ openssl genrsa -out server.key 1024
$ openssl req -new -key server.key -out server.pem -sha1
...
Common Name (eg, your name or your server's hostname) []:*.example.com
...
$ openssl x509 -in server.pem -out server.crt -req -signkey server.key -days 365 -sha1
```

# 参照サイト

* [cl.pocari.org - ワイルドカードの SSL 自己署名証明書の作成](http://cl.pocari.org/2012-02-22-1.html)
Rails4.0でついたconcernsフォルダをRails3.2に作る

小ネタですが、Rails3.2系でもcontrollerやmodelに関係するconcern系をまとめられると嬉しいので作って見ることにします。

ディレクトリの作成

```
# Rails.root に移動しシェルにて
# Rails4.0では .gitkeep から .keepになってる。。 
# どうもmercurialでも対応できるように？
# そういうわけでこちらでも.keepにする
mkdir -p app/controllers/concerns
touch    app/controllers/concerns/.keep
mkdir -p app/models/concerns
touch    app/models/concerns/.keep
```

config/application.rbの自動ロードに追加

```ruby:application.rb
config.autoload_paths                  += %W(
      #{config.root}/app/controllers/concerns
      #{config.root}/app/models/concerns
      #{config.root}/lib
    )
```

これでmodels, controllers以下にconcernsフォルダができ、activesupport::concern系のいい置き場がてにはいった！

あと、concerns以下は名前空間がグローバルなので(Rails 4.0も)適当にフォルダを掘ってもいいかもしれないですね。
ServiceからActivityを起動する

普通に起動させると、あんた何考えてるの？的な例外が発生するので、
setFlags()で**Intent.FLAG_ACTIVITY_NEW_TASK**を指定するとOKです。

```java:HogeService.java
Intent intent = new Intent(context, HogeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
```
PHPのラムダで再帰

**方法**
1. ラムダ定義時に use でスコープに変数を追加することが出来る
2. ラムダ自身の参照を追加してやる

**例**
例えば SimpleXML を使用して配列に変換する場合

```php:convert_xml_to_array.php
<?php  
// 配列作成無名関数
$fun = function ($simplexml, $out=array()) use (&$fun) {
    foreach ( (array) $simplexml as $index => $node ) { 
        if ( is_object($node) || is_array($node) ) { 
            $out[$index] = $fun($node);
        }   
        else {
            $out[$index] = $node;
        }   
    }   
    return $out;
};

$simplexml = simplexml_load_string($str);
var_dump( $fun($simplexml) );

```
mod_pagespeedの画像のキャッシュ

Googleが提供しているmod_pagespeedを利用し始めて間もないのですが、スマートフォン向けサイトのレスポンスが随分と早くなりパフォーマンスチューニングの手間を一挙に解消できました。


なんて素晴らしいものだろう！と感動していたら、担当者から「画像が汚い気がする…」と。


気のせい気のせい！とか言おうと思ったんですが、iPhoneで確認してみると確かに粗い箇所がありました。


スマフォサイトでも解像度の高い端末に向けて、画像ファイルを大きめに作っているのですが、html内にwidth, heightが直接px指定されていることが原因でした。


%指定にしてみるとキレイになったのですが、該当箇所が複数あったので、mod_pagespeedのconfをいじることにしました。

```pagespeed.conf
#ModPagespeedDisableFilters rewrite_images
ModPagespeedDisableFilters rewrite_images
```


defaultのままであれば、L56に #ModPagespeedDisableFilters rewrite_images となっている箇所があるので、コメントアウトを解除して、rewrite_imagesのフィルタを無効にしてあげれば、画像ファイルを最適化してキャッシュすることをしなくなりました。


その他、画像のフィルタが以下のように用意されていたのですが、今回の場合、何が適しているのかを調べている時間もなかったので、上記対応で完了としてます。
https://developers.google.com/speed/docs/mod_pagespeed/filter-image-optimize?hl=ja
ex(1) を使ったファイル操作

シェルスクリプトからテキストファイルの編集をする場合は *sed(1)* や *awk(1)* を利用して編集結果を一時ファイルに出力し、編集後に *mv(1)* などでリネームする処理が一般的だと思います(一部バージョンの *sed(1)* には対象ファイルを直接編集する機能が実装されているものもありますが、これは拡張機能なので必ず使える訳ではないので除外します)。
この方法でも勿論問題ないのですが *ex(1)* を利用すると対象となるファイルを直接編集できるので便利な場合もあります。
*ex(1)* は実は *vi(1)* そのものなので *vi(1)* で利用できる強力な編集機能がフルで利用できる事も *ex(1)* を利用するメリットの一つです。
*ex(1)* を利用してファイルを編集する場合は編集コマンドをヒアドキュメントで *ex(1)* に通知するのが判りやすくて良いと思います。
ヒアドキュメントのデリミタ直前の **-** はヒアドキュメントテキストの行頭のタブを無視する指定です。

## ファイルへの行追加

*ex(1)* の **a** コマンドで追加モードにしてコンテンツを追加して **.** コマンドで追加モードを終了、**w!** でファイルに出力して終了します。

```sh:行追加
# $1: 編集対象ファイル名
# $2: 追加する行番号
# $3: 追加するコンテンツ
addline()
{

	/bin/ex -s ${1} <<- EOF
		${2}a
		${3}
		.
		w!
EOF

}

```

## ファイルの行削除

*ex(1)* の **d** コマンドで指定した行を削除して **w!** でファイルに出力して終了します。

```sh:行削除
# $1: 編集対象ファイル名
# $2: 削除する行番号
delline()
{

	/bin/ex -s ${1} <<- EOF
		${2}d
		w!
EOF

}

```

## 行番号を指定したファイルの行置換

*ex(1)* の **c** コマンドで指定した行を置換して **w!** でファイルに出力して終了します。

```sh:行変更
# $1: 編集対象ファイル名
# $2: 置換する行番号
# $3: 追加するコンテンツ
chgline()
{

	/bin/ex -s ${1} <<- EOF
		${2}s/.*/${3}/
		w!
EOF

}

```

## パターンを指定したファイルの行置換

*ex(1)* の **c** コマンドで最初に見付かったパターンを置換して **w!** でファイルに出力して終了します。
**s**の後ろの連続した **//** は直前の正規表現（パターンを指定した正規表現）を示します。

```sh:行変更
# $1: 編集対象ファイル名
# $2: 置換するパターン
# $3: 追加するコンテンツ
chgline()
{

	/bin/ex -s ${1} <<- EOF
		/${2}/s//${3}/
		w!
EOF

}

```

これらの処理はあくまでも動作サンプルを示しただけですので、実際にスクリプトに利用する場合にはエラー処理や例外処理などが必要になります（どんなスクリプトでも同じですが）。例えば、置換処理では置換する/置換される文字列に **/** を含む事ができないので、**/** が含まれる場合は正規表現デリミタを別な文字に置き換える必要があります。

スクリプトでも解法は沢山ありどれが絶対的な正解だという方法はありません。こういう方法もあるという事を覚えておくと役に立つ場合があるかもしれません。
ピンチインアウトで縮小拡大する

iPhoneの写真や地図はピンチインやピンチアウトで縮小拡大します。
そんなピンチについて書いたコードが意外となかったのでサンプルコードを書きました。

この例ではCALayerを縮小拡大しているのでAVFoundationを使っています。

```c:ピンチインアウトで縮小拡大するコード(.m)
float beginGestureScale;
float effectiveScale;

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 初期のスケールを設定する
    effectiveScale = 1.0;
    
    // ピンチのジェスチャーを登録する
    UIGestureRecognizer *recognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchFrom:)];
    recognizer.delegate = self;
    [self.imageView addGestureRecognizer:recognizer];
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]]) {
        // 適用されているスケールを覚えておく
        beginGestureScale = effectiveScale;
    }
    return YES;
}

- (void)handlePinchFrom:(UIPinchGestureRecognizer *)recognizer
{
    // 新しく適用するスケールを計算する (適用されているスケール x 新しくピンチしたスケール)
    effectiveScale = beginGestureScale * recognizer.scale;
    
    // スケールをビューに適用する
    [self.imageView.layer setAffineTransform:CGAffineTransformMakeScale(effectiveScale, effectiveScale)];
}

```
Linuxのファイルをサイズ0にする

Linuxを動かしていてファイルサイズを0にしたい場合があったので効率よくできる方法を調べてみました。

普通にやる場合、ファイルを一回消して、サイズ0のファイルを作る

rm hoge.txt
touch hoge.txt

偶然生まれた方法で以下でもできました。
（このときやりたかったのはファイルの先頭10行以外を消したかったんですが。。。）

head hoge.txt > hoge.txt

ちょっと調べてみると他にも方法が見つかりました。
これが一番ラクな気がする

: > hoge.txt

「:」って知らなかったんですが、「何もせずに0を返却する」という意味を持ってるらしいです。
クライアントの/etc/hostsとHTTP Proxyの関係

* クライアントでHTTP Proxyを利用した際、クライアントの/etc/hostsを書き換えても反映されなかったのでAWS上で実験して確認してみた


## 実験結果と考察
 * 実験結果：proxyを通るリクエストはクライアントの/etc/hostsが反映されない
 * 考察：proxyを通る場合はproxyがDNSリゾルバになりクライアントの/etc/hostsは用いられない(今一ピッタリとした説明したサイトが見つけられなかったので推測)

## 実験環境
 * サーバーとして以下の2つのEC2インスタンスを用意(両方とも80番ポート開放)
  * proxyサーバ
  * クライアント

 * OS：Amazon Linux AMI 2012.09.1 64bit
 * httpd-2.2.23

## 実験前準備
 * proxyサーバ環境を構築する

```
$ sudo yum install httpd -y
$ sudo vi /etc/conf/httpd.conf
# => 以下のようになるようにコメントを外す
<IfModule mod_proxy.c>
ProxyRequests On

  <Proxy *>
    Order deny,allow
    Deny from all
    Allow from all
 </Proxy>

</IfModule>
# sudo /etc/init.d/httpd start
```

 * クライアント環境を構築する(80番ポート開放)

```
$ sudo yum install httpd -y
$ echo "hogeee" | sudo tee /var/www/html/index.html
$ sudo /etc/init.d/httpd start
$ echo "[クライアントのPublicIP] www.example.com" | sudo tee -a /etc/hosts
$ curl www.example.com
hogeee
```

## 実験1(クライアントの/etc/hostsを書き換えてproxyを使ってアクセス)

 * クライアントで実行

```
$ export http_proxy=http://[proxyサーバのPublicIP]:80
$ curl www.example.com
# => 何も出力されない
```

## 実験2(proxyサーバの/etc/hostsを書き換えてproxyを使ってアクセス)

 * proxyサーバで実行

```
$ echo "[クライアントのPublicIP] www.example.com" | sudo tee -a /etc/hosts
```

 * クライアントで実行

```
$ export http_proxy=http://[proxyサーバのPublicIP]:80
$ curl www.example.com
hogeee
```

## 実験3(no_proxyを設定してproxyを使ってアクセス)

 * クライアントで実行

```
$ export http_proxy=http://[proxyサーバのPublicIP]:80
$ export no_proxy=www.example.com
$ curl www.example.com
hogeee
```
windows で　golang

山形のohisamaです。golang始めました。
窓を開くサンプルです。
[ohisama/win](https://github.com/ohisama/win)

```go:main.go
package main
import (
    "syscall"
    "ohisama/win"
)
var x int32
func WndProc(hWnd syscall.Handle, msg uint32, wParam, lParam uintptr) (uintptr) {
    switch msg {
    case win.WM_PAINT:
        x++
        var strMessage = "Hello"
        var ps win.PAINTSTRUCT
        hdc := win.BeginPaint(hWnd, &ps)
        for i := 0; i < 256; i++ {
            for j := 0; j < 256; j++ {
                iro := i * 256 * 256 + j
                win.SetPixelV(hdc, int32(i), int32(j), int32(iro))
            }
        }
        win.Ellipse(hdc, x,  200, 200 + x, 400)
        win.TextOut(hdc, 100, 100, strMessage, int32(len(strMessage)))
        win.EndPaint(hWnd, &ps)
        return 0
    case win.WM_COMMAND:
        return 0
    case win.WM_DESTROY:
        win.PostQuitMessage(0)
        return 0
    default:
        return win.DefWindowProc(hWnd, msg, wParam, lParam)
    }
    return 0
}
func main() {
    win.WinMain(syscall.NewCallback(WndProc))
    return
}
```
jQueryを用いて、PostMessageで通信した時のイベントリスナを追加する

クロスドメイン間の通信を行う時、便利な`PostMessage`

送信側は下記のように送信します。
`message`に送りたいデータ、`targetOrigin`には送信先のURLを引数とします。

```javascript
window.postMessage(message, targetOrigin);
```

受信側ですが、
`receiveMessage`をイベントリスナに登録します。
これで、通信が行われた際、`receiveMessage`が呼び出されます。

```javascript
window.addEventListener("message", receiveMessage, false);

function receiveMessage(event)
{
  if (event.origin !== "http://example.org:8080")
    return;
}
```

これをjQueryに書き換えると

```javascript
$(window).on("message", receiveMessage, false);

function receiveMessage(event)
{
  if (event.originalEvent.origin !== "http://example.org:8080")
    return;
}
```

ここで*注意!*

JavaScriptで書いた時の`イベントオブジェクト`のプロパティが`Event.originEvent`以下にあります。

参考
[window.postMessage](https://developer.mozilla.org/ja/docs/DOM/window.postMessage)
[JQuery doesn't support postmessage event?](http://stackoverflow.com/questions/9904490/jquery-doesnt-support-postmessage-event)
親子共々殺したい

殺したい。

誤解がないように書くと、fluentdとかapacheとか親プロセスがワーカー(子)を生むようなものがハングしたときに、親と子をまとめてkill -KILLしたい事がある。pkill -KILLで名前があってれば無差別にkillという方法もあるが、無差別殺人事件になる可能性があるので、特定の親子プロセスだけをkillしたい。なお、親のPIDはわかってるものとして、$PIDとおく。

UNIXでは、親を殺してしまうと子はinitの養子に引き取られてしまう。そのため、親を殺す前に子を全て列挙する必要がある。psコマンドで`--ppid=`を付けることで調べることが出来る。

```sh
CHILDS=`ps --ppid=$PID | cut -d' ' -f1`
```

後は親と子供をまとめてkillすればよい。まとめて書くと次のような感じになる。

```killall.sh
#!/bin/sh

PID=$1
CHILDS=`ps --ppid=$PID | cut -d' ' -f1`

kill -KILL $PID $CHILDS
```

なんかもうすこし簡単にできそうな気もする。
Tumblr APIを使う（１）OAuth認証



```ruby:
require "oauth"
require "oauth/consumer"

@consumer = OAuth::Consumer.new(
  'consumer_key',
  'consumer_secret',
  {site: "https://api.tumblr.com"}
)
@request_token = @consumer.get_request_token

puts @request_token.authorize_url

veri = gets().chomp()

@access_token = @request_token.get_access_token(:oauth_verifier => veri)
puts @access_token.token
puts @access_token.secret
```

`@request_token.authorize_url`をブラウザで認証したあと、`oauth_verifier`を入力するところで詰まった。


`gets().chomp()`で入れたらできた。ダサい