OmniAICreator/Qiita-1.07M huggingface dataset:
RailsでTwitterアクセスにGrackle gemを使う

割りとしょうもないところではまったのでメモ。
Rails4, Ruby 2.0の環境。

Grackle gem: https://github.com/hayesdavis/grackle

RailsでTwitterを連携させる場合は twitter_oauth gem ( https://github.com/moomerman/twitter_oauth ) が定番みたいだけど、やりたいのは自分のアカウントの最新ツイートの表示だけなので、何となく軽そうに見えたGrackleを使用。

使用するドメインとかサーバーとかが既にあるものとして進める。まずはTwitter側から。

1. 既存のTwitterアカウントを使うか、新規でTwitterアカウントを作成する。新規の場合何がしかテスト投稿しておく。

1.  そのTwitterアカウントで https://dev.twitter.com/ にサインインする。

1. https://dev.twitter.com/apps を開いて (なぜかリンクが見あたらない)、Create a new applicationをクリック。必要事項を記入してアプリケーションのプロファイルを作成する。

1. アプリケーションのプロファイルのDetailタブをクリックし、下の方にある Create my access tokenをクリックする。こうしないとトークンが生成されない。トークンがなくても通信はできるような気もするけど、一応作成した。

1.  今度は OAuthタブに移動。以下の4つの項目にキーが長々と入っていれば準備完了。


```
Consumer key: 
Consumer secret: 
Access token: *
Access token secret: 
```

ちなみにそのページの下に See OAuth Signature for the requestというボタンがあり、Request Type/Request URI/Request queryを指定してクリックするとクエリが生成される。curlはコマンドラインに貼り付けて実行を確認できる。このクエリの中にはoauth_signature、oauth_signature_method、oauth_timestamp、oauth_token、oauth_versionという必要そうな項目があるのだけど、少なくとも今回の使い方ではこれらの値は不要ということがわかった。


今後はRailsの方。

1. 以下をGemfileに追加して、`bundle update` と `bundle install` を実行する。

```
gem 'grackle'
```

2. app/models に tweet.rbファイルを作成し、5.で準備した4つのキーを入力する。コードは以下。

```tweet.rb
require 'grackle'

class Tweet < ActiveRecord::Base

  MY_SCREEN_NAME = '表示名を入力'

  def self.get_latest
    tweets = client.statuses.user_timeline? screen_name: MY_SCREEN_NAME, trim_user: true

  end

  private
  def self.client
    Grackle::Client.new(:auth=>{
      type: :oauth,
      consumer_key: 'キーを入力',
      consumer_secret: 'キーを入力',
      token: 'キーを入力',
      token_secret: 'キーを入力'
    })

  end
end
```

このコードはhttp://www.arctickiwi.com/blog/download-you-twitter-feed-using-ruby-on-rails-with-oauth からのいただきなのだけど、定数がMY_APPLICATION_NAME となっていたために、表示名ではなく自分のアプリケーション名を入れてしまい、それに気が付くのに時間がかかった。

3. いよいよ `rails console` を実行し、`Tweet.get_latest`を実行。最新ツイートを含む文字列が返されたらOK。後は好きに使う。

もしうまくいかないときは、キーと表示名を再度確認。

なお、コードをGithubなどで公開する場合は、consumer_secretキーとtoken_secretキーをファイルに直に書かないこと。面倒でも `ENV['CONSUMER_SECRET']` や `ENV['TOKEN_SECRET']`と書き、環境変数に保存するようにすること。詳しくは http://blog.ruedap.com/2011/05/03/ruby-heroku-web-app-development-tips-5 を参照。

今回初めて知ったのだけど、statuses/public_timeline はTwitter API 1.1で廃止されていた。以前はpublic_timelineは認証なしでAPIアクセスできたらしい。

追記: `Tweet.get_latest` で取得したデータからtextだけを取り出すのには以下のようにscanメソッドを使った。ストレートだけど何となく行儀が良くないような気がする (気のせいかもしれない)。

```rb:
@latest_tweet = Tweet.get_latest.to_s.scan(/(?<=text=").*?(?=", source)/)
```

ところが、以下のコードでパースできることを偶然知った (最初 to_jsonのつもりが間違えた)。

```rb:
@latest_tweet = Tweet.get_latest.as_json
```

こうすれば、`@latest_tweet[0]['table'][:text]` のような感じでハッシュとしてアクセスできる。ツイートが複数の場合はeachで回して処理する必要がある。上のscanを使った方はeach不要。結局行数が少ないscanの方を採用したけど、後者の行儀の良さも捨てがたいような気がする。
ところで、as_jsonが今ひとつよくわからない。
Sublime Text2でTypeScriptをビルドする

Windows環境でSublimeText2を使い、TypeScriptをビルドしようとした時にはまりまくったのでメモ程度に。

## Node.jsのインストール
[Node.js公式サイト](http://nodejs.org) からダウンロード後インストールします。
※.msiのタイプで行いました。

## TypeScriptのインストール
Windows標準のコマンドプロンプトで以下のコマンドを実行します。

```
npm install -g typescript
```

## Sublime Text2のビルドシステムの追加
Sublime Text2のビルドシステムにTypeScriptを追加します。
まず、[Tools] -> [Build System] -> [New Build System...]で新しいビルドシステム用のファイルを開きます。
開かれたファイルには

```
{
  "cmd": ["make"]
}
```

と書かれています。
これを以下の様に変えます。

```
{
 "file_regex": "(.*\\.ts?)\\s\\(([0-9]+)\\,([0-9]+)\\)\\:\\s(...*?)$",
 "selector": "source.ts",
 "cmd": ["tsc", "$file"],
 "shell":"true",
 "encoding": "cp932"
}
```

encodingの指定をしない場合は **[Decode error - output not utf-8]** というエラーが発生します。

また、shellを指定しない場合は、 **[Error 2] 指定されたファイルが見つかりません。** というエラーが発生します。(私の環境だけ？)
true or false はどちらでもビルド完了します。

書き換えが終わったら **TypeScript.sublime-build** というファイル名で保存します。
※拡張子大事です！.sublime-buildです！！
保存先はデフォルトの[C:\Users\{user_name}\AppData\Roaming\Sublime Text 2\Packages\User]です。

あとは以下の様なファイルを用意し、 **Ctrl+B** でビルドが完了します！

```ts:hello.ts
module Greeting{
    export class Hello{
        constructor(private text : string){
        }
        say() : void{
            console.log(this.text);
        }
    }
}
var hello : Greeting.Hello = new Greeting.Hello("Hello, World!");
hello.say();
```
Javaのスレッドダンプを取得する

こっちが最新版
<a href="http://qiita.com/strsk/items/ae203cf056d66eff1490">Javaのスレッドダンプ、ヒープダンプの取り方 - Qiita [キータ]</a>

##### 1. JavaのプロセスIDを確認

```
$ ps aux | grep java
```
PIDがわかれば良いのでpsのオプションはお好みで…
と思ってましたが、コメントでもっと簡単な方法を教えていただきました

```
$ $JAVA_HOME/bin/jps
27046 Application
26616 Jps
```

##### 2. スレッドダンプ取得

```
$ $JAVA_HOME/bin/jstack 27046 > threaddump.txt
```

## おまけ
以前はjstackを知らず、`kill -3`でやっていた時代もありました。
アプリのログがすべてcatalina.outに出ていたので

```
$ cp catalina.out{,.tmp}
$ kill -3 [PID]
$ diff catalina.out{,.tmp} > threaddump.txt
```
めんどくさいですね！
iPhoneでナビゲーションバーとタブバーを両方使う

http://d.hatena.ne.jp/RNatori/20100124/1264350152

http://d.hatena.ne.jp/m_ogawa/20110223

ストーリーボード使うとき
http://yuriken27.hatenablog.com/entry/2013/06/06/222154
「増やす減らす二倍する」をCASL IIで(横へな13参考)

http://qiita.com/Nabetani/items/89fb0e2e712d4b396535
http://nabetani.sakura.ne.jp/hena/ord13updowndouble/
「増やす減らす二倍する」をCASL IIでやってみました。

(えっ、CASLってタグないの？初めて？やった！(笑))

基本的なアルゴリズムは[「増やす減らす二倍する」をErlangで(横へな13参考)](http://qiita.com/pazworld/items/aea5a92b0825f7e3072d)のものと同じです。
レジスタが16ビット幅なので、元の問題の最後の2問

- 109227 = 0x1AAAB
- 174763 = 0x2AAAB

には対応していません(手抜きです)。

答えが合っていたら `.` 間違っていたら `x` を表示します。

[CASLシミュレータ](http://www.officedaytime.com/dcaslj/)で動作確認しています。

```casl:
UPDOWN  START   TEST            ;TESTからスタートする

;解くルーチン
;GR1=値, GR2=カウンタ, GR0=戻り値
SOLVE   OR      GR1,DC0         ;値が0ならカウンタ値を返す
        JNZ     NOT0
        LAD     GR0,0,GR2
        RET
NOT0    CPL     GR1,DC3         ;値が3ならカウンタ値に3を加えて返す
        JNZ     NOT3
        LAD     GR0,3,GR2
        RET
NOT3    LAD     GR3,0,GR1       ;最下位ビットが0なら
        AND     GR3,DC1         ;値を2で割りカウンタに1を加えてループ
        JNZ     NOTDIV2
        SRL     GR1,1
        JUMP    COUNTUP
NOTDIV2 LAD     GR3,0,GR1       ;下2ビットが01なら
        AND     GR3,DC2         ;値から1を引きカウンタに1を加えてループ
        JNZ     NOT1
        SUBL    GR1,DC1
        JUMP    COUNTUP
NOT1    ADDL    GR1,DC1         ;その他(下2ビットが11)なら
COUNTUP LAD     GR2,1,GR2       ;値に1を加えカウンタに1を加えてループ
        JUMP    SOLVE

;テストルーチン
TEST    LAD     GR4,TESTDAT     ;GR4=データポインタ
TSTLOOP LD      GR1,0,GR4       ;データーを読み込む
        LAD     GR4,1,GR4       ;データポインタを進める
        JNZ     TESTNZ          ;データーが0ならば終了
        RET
TESTNZ  LD      GR2,DC0         ;カウンタを0にする
        CALL    SOLVE           ;解く
        CPL     GR0,0,GR4       ;答えと比較する
        LAD     GR4,1,GR4       ;データポインタを進める
        JNZ     MSGNG
        OUT     OKCHAR,DC1      ;正しければ'.'を表示する
        JUMP    TSTLOOP         ;次の問題へ
MSGNG   OUT     NGCHAR,DC1      ;間違っていたら'x'を表示する
        JUMP    TSTLOOP         ;次の問題へ
OKCHAR  DC      '.'
NGCHAR  DC      'x'
DC0     DC      0
DC1     DC      1
DC2     DC      2
DC3     DC      3

;テストデータ
TESTDAT DC      59,9
        DC      10,5
        DC      11,6
        DC      12,5
        DC      13,6
        DC      14,6
        DC      15,6
        DC      16,5
        DC      17,6
        DC      18,6
        DC      27,8
        DC      28,7
        DC      29,8
        DC      30,7
        DC      31,7
        DC      32,6
        DC      33,7
        DC      34,7
        DC      35,8
        DC      41,8
        DC      71,9
        DC      27307,23
        DC      43691,24
        DC      0
        END
```
iPhone絵文字をPCやAndroidでも表示できるEmojiSymbolsを導入

ウェブサイトにユーザーが投稿した文章の中にiPhone絵文字が含まれていると、PCのブラウザやAndroidで見た時に文字化けして残念なことになります。それをWebフォントを使って解決する方法です。

EmojiSymbols
http://emojisymbols.com/jp/

絵文字用Webフォントです。これをダウンロードしてサーバに設置しておきます。

```css:
/*
EmojiSymbols Font (c)blockworks - Kenichi Kaneko
http://emojisymbols.com/
*/
@font-face {
  font-family: emojisymbols;
  src: url("/webfonts/EmojiSymbols-Regular.woff");
}
body, html {
  font-family: 'Lucida Grande', 'Hiragino Kaku Gothic ProN', 'ヒラギノ角ゴ ProN W3', 'Meiryo', 'メイリオ', 'sans-serif', 'Apple Color Emoji', 'emojisymbols';
}
```
font-familyの前半はお好みで。ポイントはemojisymbolsの前にApple Color Emojiを入れることです。こうすることでiPhoneではカラー絵文字が、それ以外ではEmojiSymbolsが表示されます。

-- 追記 --
Android2.xでは反映されず。ttfでないと無理？
Android4.xでは他のフォントで表示できる絵文字が同一文章に含まれているとEmojiSymbolsが表示されない現象が発生。
四角の中に数字が入ってるような絵文字はPCでは「3□」、Androidでは「3」のように表示されてしまう。
当然ながらページタイトルに絵文字があると文字化けします。
baserCMSのヘッド要素テンプレ

コーポレートにちょうどいい国産CMS **[baserCMS](http://basercms.net/)** を使って制作をしているので、制作上のメモを書きます。

## Doc宣言+Meta テンプレ

### XHTML1.0

```php:/app/webroot/themed/***/layouts/default.php
<?php $bcBaser->xmlHeader() /* IE6の互換モード問題が危惧される場合は呼び出さないほうがいい */ ?>
<?php $bcBaser->docType() ?>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<?php $bcBaser->charset() ?>
<?php $bcBaser->title() ?>
<?php $bcBaser->metaDescription() ?>
<?php $bcBaser->metaKeywords() ?>
</head>
```

出力↓

```html:output
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>...</title>
<meta name="description" content="..." />
<meta name="keywords" content="..." />
</head>
```

### HTML5

```php:/app/webroot/themed/***/layouts/default.php
<?php $bcBaser->docType('html5') ?>
<html lang="ja">
<head>
<meta charset="<?php echo ($charset = strtolower(Configure::read('App.encoding'))) ? $charset : 'utf-8' ?>">
<?php $bcBaser->title() ?>
<meta name="description" content="<?php echo $bcBaser->getDescription() ?>">
<meta name="keywords" content="<?php echo $bcBaser->getKeywords() ?>">
</head>
```

出力↓

```html:output
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>...</title>
<meta name="description" content="...">
<meta name="keywords" content="...">
</head>
```

* * *

XHTML1.0への対応は基本的に綺麗にできます。`html`タグの出力が動的でない理由はidやclassの付加などの対応に柔軟になっていると解釈しました。

HTML5は、これはもう基本的に対応していないものを強引に出力してみた、といった感じです。文字コードの標準の取得メソッドがないのがちょっと残念。

`$bcBaser->docType()`だけ微妙に対応しているところもなんか悲しく、しかも`< !DOCTYPE html>`は **後方互換のためのドキュメント宣言** であり、今後HTML5.1やHTML6となっても(後方互換のために)この宣言をする必要がある(つまりHTML5限定の宣言なわけではない)から`$bcBaser->docType('html5')`というように`'html5'`という引数だけでしかこの宣言が出力できないのは間違っていると思います。理想としては引数が空なら`< !DOCTYPE html>`を出力する仕様がいいのかな。

descriptionとkeywordは単純に **空要素の閉じスラッシュを無くしたいだけ** です。HTML5の仕様上あっても問題ないけど、『 **どっちかに統一** 』できれば理想的。HTMLエディタがHTML5の場合、あんまり閉じスラッシュに対応していないことが多いの(と、個人的な好み)でここでは「閉じスラなし」の場合を再現してみました。

ちなみにこれはbaserCMSの機能というより、CakePHPの標準のヘルパーがこうなっているみたいです。baserCMSがこのあたりを上手くオーバーライドして抽象化できれば助かるんだけどなぁと思います。（でもCakeのコード読んだら一筋縄ではいかなそう。根本的にコード書き変える必要があるかもしれません。）

## そもそもの話

**Doc宣言や文字コードは動的に書く必要あるのか？** と思いました。

CakePHPにヘルパーが存在するので採用いるのかはわからないのですが、今の段階で必要性はまだ見えません。descriptionとkeywordは動的に管理したいので必要だけど、Doc宣言と文字コードの変更が必要な場合って、結局テンプレのHTMLも大きく変更しないければいけないことがほとんどのはずです。必要なケースを知っている方は教えて下さい。。。

### それを踏まえてHTML5のテンプレ

```php:/app/webroot/themed/***/layouts/default.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<?php $bcBaser->title() ?>
<meta name="description" content="<?php echo $bcBaser->getDescription() ?>">
<meta name="keywords" content="<?php echo $bcBaser->getKeywords() ?>">
</head>
```
たぶんこれがスマートなはず。

## 他にもあるメタ系出力タグ

`icon`や`css`、`js`など他にも出力メソッドが用意されています。使い方がわかったら適宜この記事に追加していこうかと思います(`css`と`js`は機能的に奥が深そうだら別記事にするかも)。

### 公式のリファレンス

[BaserHelper 出力系命令 | baserCMS 2系関数リファレンス](http://basercms.net/reference_2/archives/category/baser_helper/baser_out)
npmのTinyPNG使ってみる

TinyPNGといえば[Webサービス](http://tinypng.org/)が有名ですが、TinyPNGのnodeのpackageがあったので試してみた。これでイチイチ画像をブラウザにドラッグして最適化後ダウンロードする手間が省ける。画質に関しては注意しないといけないですけど。

GitHub : [tinypng-bash](https://github.com/lagden/tinypng-bash)

## インストール

```
$ npm install -g tinypng
```

## 使い方

最適化したい画像を指定する場合

```
$ tinypng imagename.png
```

フォルダーごと最適化したい場合

```
$ tinypng foldername/*.png
```

今いるフォルダ内のpng画像を最適化したい場合

```
$ tinypng -r
```

非常に楽♪
HaxeでJsonをパースする


HaxeでJsonを扱うには、`haxe.Json`というクラスを使います。

公式 http://haxe.org/api/haxe/json を見る感じJsonクラスの持つメソッドは

```csharp:
static function parse( text : String ) : Dynamic
static function stringify( value : Dynamic, ?replacer : Dynamic -> Dynamic -> Dynamic ) : String
```

の二つみたいです。  
実際に使ってみます。

```javascript:json
{
    "users": [
        {
            "name": "Akeru",
            "sex": "male"
        }, {
            "name": "Amamori",
            "sex": "female"
        }]
}
```
というJsonを読むことにしましょう。


　　

```csharp:Main.hx

import haxe.Json;

class Main {

    public static function main() {
        var data : String =
            '{
                "users": [
                    {
                        "name": "Akeru",
                        "sex": "male"
                    }, {
                        "name": "Amamori",
                        "sex": "female"
                    }]
            }
        ';
        var user_datas = Json.parse(data);
        trace('user1: ${user_datas.users[0]}');
        untyped trace('user1\'s name: ${user_datas.users[0].name}');
    }
}

```

こんな感じになります。

次に、コンソールで`haxe -x Main.hx`と打ち込みます。`-x`というオプションをつけることで、コンパイルしつつ即座に実行出来ます。  
実行することで

```md:
Main.hx:19: user1: { name => Akeru,  sex => male }
Main.hx:20: user1's name: Akeru
```

という結果を得られたかと思います。

　　

さて、ここで一つだけ問題があります。ソースコードに目を戻してください。
`trace('user1: ${user_datas.users[0]}');`
の後が
`untyped trace('user1\'s name: ${user_datas.users[0].name}');`
となっているかと思います。

これは`${user_datas.users[0]}`のアクセスの時点で、user_datas.usersが`Array<String>`だと型推論されてしまい、`.name`メンバの呼び出しに対してコンパイラがエラーを吐いてしまうためで、`untyped`を使ってそれを抑制しています。

呼び出し自体には問題はないので、untypedを使ってガンガン無視していけば、もっと階層の深いJsonでも問題は出ない……と思うのですが、それだとHaxeを使うメリットが減るような気がするので、パースしたJsonを適当な構造体にマップして返してあげる関数を、それぞれ定義するような形になるのかなぁと今のところは思っています。

　　

haxelibをちょっと眺めた感じ[martamius/TJSON](https://github.com/martamius/TJSON)なんかは、C#でいうところのDynamicJsonめいた感じで、パパッと匿名の構造体にマッピングしてくれるようですがまだ試していないです。
標準のライブラリでも、untypedを使わないスマートなやり方やなんかがあったら教えていただけるとうれしいです。
wordpressのURLカスタマイズ

/カスタム投稿名/投稿名/関連投稿名

というURLを作りたい。

異なるカスタム投稿間で親子関係的なものが定義できれば良いのだけど、異種投稿間では無理そう。そこで、URLだけそれっぽくして、single.php内で、関連投稿名の値によってベースとなる投稿情報のに加えて取得する情報を分岐させる構成を考えてみた。

加えたルールは

```php:
add_rewrite_rule('カスタム投稿名/([^/]+)/関連投稿名/?$','index.php?カスタム投稿名=$matches[1]&xxxpage=関連投稿ページ名','top');
```

xxxpageのxxx部分はわかりやすい値に。私はカスタム投稿名にした。

ただ、これだけではxxxpage部分は$wp_query->query_varsには格納されない。

query_varsフィルターに以下の関数を追加。

```php:
function add_query( $query_args ) {
  $query_args[] = "xxxpage";
  return $query_args;
}
```

これで、parse_requestメソッド実行時にドロップされずに、$query_varsで参照できる。
Pukiwikiのアクセスログを眺めてニヤニヤする為のワンライナー

Pukiwikiを動かしているサーバのアクセスログを眺めてもURLがエンコードされていて、どのアクセスがどのページヘのアクセスなのかさっぱり解らなかったので。

```shell-session:
$ grep pukiwiki /var/log/httpd/access_log  |
    awk '{print $1,$4,$6,$7}' |
    sed -e "s/ [\"\[]/ /g" |
    grep -v "/image/\|/pukiwiki.css.php\|/favicon.ico" |
    tr =%  @= | nkf -EwmQ |tr @ = |less -S
```

UTF-8版のPukiwikiを使っている場合はnkfコマンドのオプションを`-EwmQ`を`-WwmQ`に。
使ってるオプションの詳細は適当にmanページ見るかググって下さい。

追記(2014/6/13)
trとか面倒なことしないで`nkf --url-input -w`使おう。
TypescriptでBackbone.jsの共通イベントを作るには？


BackboneでView間共通で呼び出したいイベントがあるときのイベントをどのように発生させるか悩んでいます（主に要素に変更が加えられたときの各種位置変更）。
今はとりあえず一番最初に共通イベントを作成後View.prototypeに紐付けて共通イベントを発生するようにしています。
今後のイベント範囲とか考えるとイベントの設定難しい。






```ts:test.ts
class View extends Backbone.View {
	event:Backbone.Events;
	constructor(options?){
		super(options);
	}
	method1(){
	this.event.trigger('render');
	}
}
//...

//initialize

var commonEvent = _.extend({},Backbone.Events);
View.prototype.event = commonEvent;

var view = new View();

var view2 = new View();
commonEvent.on('render',view.render,view);
commonEvent.on('render',view2.render,view2);

```

##追記

コメントから少し見直して以下のように改めました。init時にprototypeを初期化するのをやめてlistenToを使うようにしました。

```ts:view.ts
class View extends Backbone.View {
    event:Backbone.Events;
	constructor(options?){
		super(options);
		this.listenTo(this.event,'render',this.render);
	}
    initialize(options){
    	options || (options ={});
       //上書きもできるようにする？
       if(options.event) this.event = options.event;
    }
    method1(){
    //何かの処理
    …
    this.event.trigger('render');
    }
}
View.prototype.event = _.extend({}.Backbone.Events)

class ViewA extends View{
	constructor(options?){
		super(options);
	}
}
```


```ts:init.ts
//init
var view1 = new View();
var view2 = new View();
var view3 = new ViewA();

var commonEvent = view1.event;
//省略
…
//再描画 view1,view2,view3が再描画
commonEvent.trriger('render');
//これでも再描画
view1.method1()

```
PerlのTest Tips　メソッド内で面倒な関数が呼ばれているから、回避したい場合

Perlのテストを作っているとき、あるメソッドで呼ばれている関数が邪魔なので、任意の値を返すようなモックにしたい場合。

邪魔な関数 ＝ 例えば、その関数はネットワークアクスが必要とか、DBアクセスして、特定のデータセットが必要とか。

```pl:テスト対象モジュール
package TestTargetXXX;

use Some::Module qw(getIDfromDB);

sub sample_func {
    my $self = shift;
    my %param = @_;

    my $id = &getIDfromDB($param{key});
    # (略)
    return $key_code;
}
```

```pl:テストスクリプト(の一部)
subtest "sample_func test." => sub {
    my $obj = TestTargetXXX->new();

    %param = (key => 'XXX');
    $rtn = $obj->sampel_func(\%param);
    is $rtn, 'YYY';
};
```

ここで`&getIDfromDB()`を動かすには、DBの準備が必要で面倒。なので、モック化する。(もちろん、この関数は別途、テスト済み)

```pl:テストスクリプト(新)
subtest "sample_func test." => sub {
    my $test_id = undef;
    no warnings 'redefine';
    local *TestTarget::getIDfromDB = sub {return $test_id};
    use warnings 'redefine';

    my $obj = TestTargetXXX->new();

    %param = (key => 'XXX');
    $test_id = 'ZZZ';
    $rtn = $obj->sampel_func(\%param);
    is $rtn, 'YYY';
};
```

要点として、

* `*TestTarget::getIDfromDB = sub {...}`で強制的に関数を置き換え
* 置き換えが全体に影響しないようlocalで宣言
* この置き換え方法は、警告が出るので`no wanings 'redefine';`で抑制(use warnings;使ってないなら不要)

もう少し「強制的な置き換え」について説明すると、

* getIDfromDB()は、TestTargetモジュール内でexportされている。
* そのため、getIDfromDB()はSome::Moduleのものだが、TestTargetの関数ともいえる。
* つまり、`&TestTarget::getIDfromDB()`ともいえる。
* なので、`*TestTarget::getIDfromDB = sub {}`で強制的に上書き出来る。

最後に
CPANにありそうですが、Perl単体でなら上記の方法で対処可能。あと、モックの使いすぎ注意。別途、結合テストはきちんとする。そもそも、こんなテストしにくい実装はしない。
Wicketを使うWebアプリ用のMavenプロジェクトの作り方

# 2014/09/05 追記

まだストックしてくれる方がいたので。
下の方法は、自力でpom.xmlを作ってみている例ですが、Apache Wicketのサイトで公開されているmvnコマンドを使った方が簡単です。

[Create a Wicket Quickstart](https://wicket.apache.org/start/quickstart.html)のページに移動して、GroupId、ArtifactId、Versionなどを選択すると、Command Lineの欄にmvnコマンドが作成されます。

例えば、Wicket 6.16.0 で、com.exampleパッケージでfooプロジェクトを作りたいときは、GroupId:com.example、ArtifactId:foo、Version:6.16.0と設定すれば、下の様なmvnコマンドが生成されます。

```console:
$ mvn archetype:generate -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=6.16.0 -DgroupId=com.example -DartifactId=foo -DarchetypeRepository=https://repository.apache.org/ -DinteractiveMode=false
```

# 元記事

Mavenでプロジェクトを用意する機会があったので。
xml中の snip というコメントアウトは省略を表してます。

## Mavenプロジェクトの作成

groupId, artifactId はプロジェクトにあわせてお好みで。

```console:
$ mvn archetype:create -DgroupId=foo.bar.webapp -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp
$ cd webapp
$ mkdir src/main/java src/test src/test/java
```
## pom.xmlの設定

```console:
$ vi pom.xml
```
### project要素の設定

project/version, project/name, project/url などの値をプロジェクトにあわせて変えておく。

### dependencies要素の設定

Wicketと、Wicketのロガーに必要なライブラリの追加。
 ここではslf4j-api, logback-core, logback-classicを使う。
 （logback-classicの依存ライブラリでslf4j-api, logback-coreも導入される）

```xml:pom.xml
<dependencies>
	<!-- snip -->
	<dependency>
		<groupId>ch.qos.logback</groupId>
		<artifactId>logback-classic</artifactId>
		<version>1.0.13</version>
	</dependency>
	<dependency>
		<groupId>org.apache.wicket</groupId>
		<artifactId>wicket-core</artifactId>
		<version>6.10.0</version>
	</dependency>
</dependencies>
```

### build要素の設定

Wicketではclassファイルに対するhtmlファイルにもクラスパスが通っている必要がある。
 デフォルトの設定では.classと同じディレクトリに.htmlがあるようにするので、htmlファイルもビルドパスに含まれるようにする。

```xml:pom.xml
<build>
	<!-- snip -->
	<resources>
		<resource>
			<filtering>false</filtering>
			<directory>src/main/resources</directory>
		</resource>
		<resource>
			<filtering>false</filtering>
			<directory>src/main/java</directory>
			<includes>
				<include>**</include>
			</includes>
			<excludes>
				<exclude>**/*.java</exclude>
			</excludes>
		</resource>
	</resources>
	<!-- テスト用には testResources 要素にも同様の内容を書く -->
	<!-- snip -->
</build>
```

必須ではないが、JDKのバージョンやencodingも指定したいときは以下もやっておく。
 （JDK7, UTF-8の例）

```xml:pom.xml
<build>
	<!-- snip -->
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.7</source>
				<target>1.7</target>
				<encoding>UTF-8</encoding>
		</configuration>
		</plugin>
	<plugins>
	<!-- snip -->
</build>
```

あとは webapp/web.xmlを編集して、WebApplicationクラスのサブクラスつくって、HomePageとして表示されるクラスをつくって...という流れ。
Jasmineでライブラリを意図した順番で読み込むには

私の場合はbackbone.jsの前にunderscore.jsを読み込みたかった。

結論としては、すべてのライブラリを **public/javascripts** に入れて **spec/javascripts/support/jasmine.yml** で読み込む順番を指定する。

```yaml:jasmine.yml
src_files:
    - public/javascripts/jquery-1.10.2.js
    - public/javascripts/underscore.js
    - public/javascripts/backbone.js
    - public/javascripts/**/*.js
```

これでOK。

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
UITextViewでUIMenuControllerを非表示にする

UITextViewの入力値で、Copy機能等を独自に制御したかったので、デフォルトのUIMenuControllerを非表示にします。

流れとしては、

> UITextViewのサブクラスを生成 → canPerformAction をオーバーライド 

となります。

まずは、UITextViewを継承したサブクラスMyUITextViewを作ります。

```objc:MyUITextView.h 
//
//    MyUIWebView.h
//

#import <UIKit/UIKit.h>

@interface MyUITextView : UITextView

@end
```
ヘッダファイルはそのまま

```objc:MyUITextView.m
//
//    MyUIWebView.m
//

#import "MyUITextView.h"

@implementation MyUITextView

//canPerformActionをオーバーライド
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if ( [UIMenuController sharedMenuController] ) {
        [UIMenuController sharedMenuController].menuVisible = NO;
    }
    return NO;
}
```

クラスの実装部分で、canPerformActionをオーバーライドします。
上記の例だと、MenuControllerの表示自体を非表示するものです。


後は、MyUITextViewを使いたいクラスで、MyUITextView.hをインポートして終了です。
呼び出し例は以下のとおりです。
ここでは、ファイルを読み込んだ際に、MyUITextViewを生成しています。

```objc:HogeController.m
//
//    HogeController.m
//

#import "HogeController.h"
#import "MyUITextView.h"

@interface HogeController ()

@end

@implementation HogeController
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    CGRect rect = CGRectMake(100, 100, 100, 100);
    MyUITextView *tv = [[MyUITextView alloc] initWithFrame:rect];
    tv.editable = YES;
    tv.text = @"あいうえお\nかきくけこ";
    [self.view addSubview:tv];
}
```

なお、この例はUITextViewのモノですが、UITextFieldやUIWebViewといったクラスにも使えます。


# 他の実装例

上記の例は、UIMenuController自体を非表示してしまいましたが、例えば「CopyとPasteだけ禁止したい」といったこともあると思います。そういうときは、

```objc:
//
//    MyUIWebView.m
//

#import "MyUITextView.h"

@implementation MyUITextView

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if ( action == @selector(paste:) ) {
        return NO;
    }
    else if ( action == @selector(copy:) ){
        return NO;
    }

    return [super canPerformAction:action withSender:sender];
}
```

とすると、UIMenuControllerの機能毎に制御することが可能です。

*参考: http://stackoverflow.com/questions/6614465/how-do-you-really-remove-copy-from-uimenucontroller/7944656*
OSX で Git をバージョンアップする

アップデート前のバージョンは、

```
$ git --version
git version 1.7.9.6 (Apple Git-31.1)
```

・公式サイト http://git-scm.com/ に行き、"Download for Mac" のボタンから .dmg ファイルを
ダウンロードします。
・落ちてきた .dmg を開いて道なりにインストールします。
・実行ファイルのインストール先は /usr/local/git/bin になるようです。
もとの git は /usr/bin/git なので、新しいほうが優先されるように path を設定します。

```
$ vim ~/.bash_profile
```

編集箇所

```
PATH=/usr/local/git/bin:$PATH
export PATH
```

.bash_profile ファイルをロードし直します

```
source ~/.bash_profile
```

バージョンを確認します

```
$ git --version
git version 1.8.3.2
```

→ OK.
Compassのasset_cache_busterでMD5を使う

[Compass](http://compass-style.org/)で`image-url`を使う場合に、画像が変更されたらキャッシュを読み込まずにきちんと表示が変わるように用意されているのが`asset_cache_buster`という仕組み。

ところが[Compassのドキュメントに書かれている方法](http://compass-style.org/help/tutorials/configuration-reference/)だと画像ファイルのタイムスタンプをGETパラメーターとして付ける形になるので、複数人で開発していると何度も変更が発生する。リポジトリからダウンロードしてきたタイミングにも依存してしまうし。

なのでファイルのMD5ハッシュを設定するようにする。config.rbに以下を追記。

```ruby:config.rb
# Increment the deploy_version before every release to force cache busting.
deploy_version = 1
asset_cache_buster do |http_path, real_path|
  if File.exists?(real_path)
    Digest::MD5.hexdigest(real_path.read)[0..7]
  else
    "v=#{deploy_version}"
  end
end
```
JavaEE 環境で JAX-RS の Hello World

JavaEE 環境で JAX-RS の Hello World を実装する方法のメモ。

#環境
##OS
Windows7 64bit

##AP サーバ
GlassFish 4.0 OpenSource Edition

#実装
##Application クラスを継承したクラスを作成する
```java:MyApplication
package jaxrs;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("rest")
public class MyApplication extends Application {
}
```

##JAX-RS のサービスクラスを作成する
```java:HelloWorldResource
package jaxrs;

import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path("hello-world")
public class HelloWorldResource {
    
    @GET
    public String helloWorld() {
        return "Hello World!!";
    }
}
```

#動作確認
ブラウザで以下の URL にアクセス。

http://localhost:8080/jaxrs/rest/hello-world

※ホスト名（localhost）、ポート（8080）、コンテキストパス（jaxrs）は適宜読み替え。

![ブラウザの実行結果](https://qiita-image-store.s3.amazonaws.com/0/28302/1731f4be-2f3e-6a64-6fca-c953556b84e3.jpeg)

#説明

```java:MyApplication
@ApplicationPath("rest")
public class MyApplication extends Application {
```

まず `javax.ws.rs.core.Application` を継承したクラスを作成し、 `javax.ws.rs.ApplicationPath` アノテーションを付与する。このアノテーションの `value` に指定した値が、 JAX-RS で処理する URL のベースになる。

```java:HelloWorldResource
@Path("hello-world")
public class HelloWorldResource {
    
    @GET
    public String helloWorld() {
```

`ApplicationPath` アノテーションで URL のベースを `rest` と指定しているので、 `http://host-name/context-name/rest/hello-world` に `GET` でアクセスすれば、上記の `helloWorld()` メソッドを実行することができる。

メソッドの戻り値が `String` 型の場合は、 return した値がそのまま HTTP のレスポンスとなる。

#参考
+ [web applications - Jersey JAX-RS on Glassfish 3.0.1: Can I have an empty webapp element in my web.xml? - Stack Overflow](http://stackoverflow.com/questions/3076791/jersey-jax-rs-on-glassfish-3-0-1-can-i-have-an-empty-webapp-element-in-my-web-x)
Property属性のオプション

# Property属性

Getter/Setter の定義で便利な Boo.Lang.Extensions.PropertyAttribute には、小技的なオプション指定ができます。

## 設定値をガードする。

条件式は assert と一緒に、setter メソッドの先頭に展開されます。

```boo:
class A:
	[property(IntValue, value > 0)]
	intValue as int
```

## プロパティへの設定をフックする

Observable:true を入れると、「プロパティ名Changed」という event がクラスに追加されます。

```boo:
class A:
	[property(MyName, Observable:true )]
	myName as string

# 「プロパティ名Changed」というeventが使える。
a = A()
a.MyNameChanged += { o as A | print "kawatta!" + o.MyName }

a.MyName = 'abc'   # kawatta!abc と表示されます。
```

## プロパティを protected にする。

```boo:
class A:
	[property(MyName, Protected:true )]
	myName as string
```

## オプションの組み合わせ

null や長さ０の文字列を設定したらエラーなプロパティ。ついでに上記の Observable も設定します。

```boo:
class A:
	[property(MyName, Observable:true, not string.IsNullOrEmpty(value) )]
	myName as string
```

# その他関連情報

## Property属性の中身

http://qiita.com/nistake/items/d448937eba504fe54d25 の例のような構文木書き換えする属性です。

## Unity3D での注意

Unityの中の人があろうことか「Property」という名前を勝手にEditorのプロパティ拡張用として定義しちゃったので、普通に「property」とか書くとコンパイルエラーになります。

```boo:
import Boo.Lang.Extensions.PropertyAttribute as GetterSetter
```

とかして回避しましょう。

Boo導入しておいてこういうことする中の人許すまじ。
Eclipse+GlassFish環境でホットデプロイを有効にする

Eclipse + GlassFish でホットデプロイを有効にする方法のメモ。

#環境
##OS
Windows 7 64bit

##Eclipse
Juno

※「GlassFish Tools for Juno」プラグインを使用

##GlassFish
4.0

#手順
+ 「サーバー」ビューで、ホットデプロイを有効にするサーバを右クリックして、「開く」を選択。

![サーバーを開く](https://qiita-image-store.s3.amazonaws.com/0/28302/1a75b5e1-fab7-d762-4b63-1bd84209b83c.jpeg)

+ 「公開」パネルの「リソースの変更時に自動的に公開」にチェックを入れる。

![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/0c73da39-fd25-64b2-b658-d011209fbb00.jpeg)

+ 保存（Ctrl + s）したら、ホットデプロイが有効になる。

以上。

#参考
+ [Eclipse -> Glassfish wont incrementally deploy - JBOSS does - Stack Overflow](http://stackoverflow.com/questions/17162763/eclipse-glassfish-wont-incrementally-deploy-jboss-does)
アップロードした写真（画像）が回転して表示されるのを直す Image_Driver

http://qiita.com/hiro_y/items/0476bcf39a77ca184009 に書いてあることを FuelPHP でやるときにどうやるのがいいかっていう話。

理屈は一緒です。

```php:
<?php

class Image_Gd extends \Fuel\Core\Image_Gd {

	public function _orientation()
	{
		if ( function_exists('exif_read_data'))
		{
			try
			{
				$exif = exif_read_data($this->image_fullpath);
			}
			catch (Exception $e)
			{
				Log::error($e->getMessage());
				return;
			}

			if (isset($exif['Orientation']))
			{
				$orientation = $exif['Orientation'];

				if ($orientation == 2)
				{
					$this->flip('horizontal');
				}
				else if ($orientation == 3)
				{
					$this->rotate(180);
				}
				else if ($orientation == 4)
				{
					$this->flip('vertical');
				}
				else if ($orientation == 5)
				{
					$this->rotate(-90);
					$this->flip('vertical');
				}
				else if ($orientation == 6)
				{
					$this->rotate(90);
				}
				else if ($orientation == 7)
				{
					$this->rotate(90);
					$this->flip('vertical');
				}
				else if ($orientation == 8)
				{
					$this->rotate(-90);
				}
			}
		}
		else
		{
			$this->debug("Exif information is not defined.");
		}
	}
}
```

```php:
<?php

abstract class Image_Driver extends \Fuel\Core\Image_Driver
{
	public function orientation()
	{
		$this->queue('orientation');
		return $this;
	}
}
```

```php:
<?php

class Image extends \Fuel\Core\Image {

	/**
	 * @return  Image_Driver
	 */
	public static function orientation()
	{
		return static::instance()->orientation();
	}

}
```

あとは fuel/app/bootstrap.php に

```php:
<?php

Autoloader::add_classes(array(
	'Image' => APPPATH.'classes/image.php',
	'Image_Driver' => APPPATH.'classes/image/driver.php',
	'Image_Gd' => APPPATH.'classes/image/gd.php'
));
```

を追加する。

こうすると、preset の action として orientation というのが使えるようになって、画像を回転してくれるようになる。

----

いろいろ抜けてたので追記しました。
vimのstatusline装飾プラグインのlightline.vimを導入してみた

vimのstatusline装飾プラグインは

* [vim-powerline](https://github.com/Lokaltog/vim-powerline)
* [powerline](https://github.com/Lokaltog/powerline)
* [vim-airline](https://github.com/bling/vim-airline)

上記のようにいくつかあります。そんな中で最近、更に新しいプラグインが出てきました。

* [lightline.vim作りました - プラグインの直交性について](http://d.hatena.ne.jp/itchyny/20130824/1377351527)

特徴として次のような事が挙げられています。

* vim scriptのみで書かれて軽量であること
* 簡単に拡張できること
* 他のプラグインに干渉しないように気を使っていること

powerlineは導入が面倒そうだったのでvim-airlineもそのまま見送っていたのですが、これなら面倒がなさそうで[landscape theme](https://github.com/itchyny/lightline.vim#landscape-theme-with-the-patched-font)も気に入ったので導入してみました。

カラーテーマだけ設定してみましたがデフォルトで色々と表示されるので、同系のプラグインを使ってない人でも導入する価値があると思います。

```vim:.vimrc
let g:lightline = {
	\ 'colorscheme': 'landscape'
	\ }
```

![lightline.vim](https://qiita-image-store.s3.amazonaws.com/0/8995/7ff944a8-2c87-4e42-5736-74208f024dc6.png)
Goで乱数


```go:rand.go
package main

import (
        "fmt"
        "math/rand"
        "time"
)

func main() {
        rand.Seed(time.Now().UnixNano())
        fmt.Println("random number is", rand.Intn(15))
}
```

```bash:
$ go run rand.go
5
$ go run rand.go
12
$ go run rand.go
0
$
```
ド・モルガンの法則の覚え方

こういうやつ

```
not (a or b or c) <=> (not a) and (not b) and (not c)
not (a and b and c) <=> (not a) or (not b) or (not c)
```

すぐ忘れるよね。ぼくは忘れる。

O'Reillyの『[リーダブルコード](http://www.amazon.co.jp/dp/4873115655)』に簡単な覚え方が載っていた。

```
notを分配してand/orを反転する
(逆方向は「notをくくりだす」)
```
OpenFLで-dce fullを指定するとアプリが起動しない

タイトルの通りです。OpenFLで-dce fullを指定するとFlash出力などではmain関数ごと消し去られるので、@:keepを記述しましょう。

こんな感じに

```hx:Main.hx
class Main {
	@:keep static public function main() {
		//ここに処理を記述
	}
}
```
iOS5からUIWebViewのキャッシュはディスク上にも保存される 


ググると「メモリ上にしか保存されない」という古い情報がよくヒットするのでメモしときます。

##ソース
参考：[NSURLCache Uses a Disk-cache as of iOS5](http://petersteinberger.com/blog/2012/nsurlcache-uses-a-disk-cache-as-of-ios5/)

NSURLCache というのは、UIWebViewで使用しているキャッシュオブジェクトの事です。

参考（情報がちょいと古い）：[Cocoaの日々: [iOS] UIWebView のキャッシュ調査](http://cocoadays.blogspot.jp/2011/01/ios-uiwebview.html)

利用するとアプリ容量がどんどん肥大化してく問題が起きたので、iPhoneアプリの中身がどうなっていくか調べている過程で上の記事を見つけました。


##ほんとにディスク上に保存される？

実際試してみたところ、確かにUIWebViewを使用する度に、アプリの容量は増えます。
アプリを完全終了しても容量は減らないので、ディスクキャッシュしているのは間違いなさそうです。
具体的にどのファイルにキャッシュが保存されているかというと、~/Library/Caches/ にある、Cache.db です。

参考：[(旧) Cocoaの日々: WebKit検証(32) - キャッシュの中身](http://xcatsan.blogspot.jp/2009/05/webkit32.html)

ちなみに、デフォルトの上限は、メモリが4MBでディスクが20MBです。(NSURLCache.h参照)
まーこれくらいなら問題無さそう。
ディスクやメモリ上にあるキャッシュの容量/上限は、以下のメソッドで確認できますので気になる方はどうぞ。

[NSURLCache sharedURLCache] の

- currentDiskUsage,
- diskCapacity
- currentMemoryUsage
- memoryCapacity



##ディスク上に保存しないようにするには？

ディスク上にキャッシュを保存しないようにする方法は、以下の２つがあります。

1. NSURLRequestのcachePolicyに、NSURLRequestReloadIgnoringLocalCacheDataを指定する
2. 利用できる保存領域に0を設定する [[NSURLCache sharedURLCache] setDiskCapacity:0]; 

UIWebViewでWebページを表示する場合は、1の方法だとWebページ上の細かいファイルの取得全てにcachePolicyを適用させる方法が面倒だったので、2の方法が楽でおすすめです。


以上です！！
Haversine formulaを使ってローケーションベースでソートする


longitude と latitudeを使って、ある地点からのロケーションベースのソートをしたいときってありますね。
そこで使えそうなのが

Haversine formulaという公式です。
http://en.wikipedia.org/wiki/Haversine_formula

![image](http://upload.wikimedia.org/math/1/5/a/15ab0df72b9175347e2d1efb6d1053e8.png)
これが最終的に
![image](http://upload.wikimedia.org/math/2/8/6/2863d8cfddda939001b44506ab8e7a46.png)
のように展開できます。（式の展開などはめんどくさいので省略します。。。）

この公式をpostgresql上で実際のサンプルデータを使ってみてみると

select id,name,latitude,longitude from cities;

 id |     name     | latitude  | longitude  
----+--------------+-----------+------------
  3 | Kuala Lumpur |  3.146685 | 101.686656
  1 | Singapore    |  1.283333 | 103.833333
  4 | Bangkok      | 13.787395 | 100.524502
  5 | Hong Kong    |  22.27833 |  114.15889
  6 | Jakarta      | -6.193806 | 106.843314
  2 | Manila       | 14.603352 | 120.984682
  7 | Taipei       | 25.105495 | 121.557441

このサンプルデータを使い、Kuala Lumpurに近いポイントでソートしてみます。

```psql:
\set lat  3.046685
\set lng  100.686656

SELECT 
	id,name,latitude,longitude , 
	3956 * 2 * 
	ASIN(
		SQRT(
			POWER(SIN( (:lat - abs(cities.latitude)) * pi()/180 / 2), 2 ) + COS(:lat * pi()/180) * COS(cities.latitude * pi()/180) * POWER(SIN((:lng - cities.longitude) * pi()/180 / 2)
		, 2)
		)
	) 
	AS distance 
	from cities order by distance;
```

 id |     name     | latitude  | longitude  |     distance     
----+--------------+-----------+------------+------------------
  3 | Kuala Lumpur |  3.146685 | 101.686656 | 69.2892623017496
  1 | Singapore    |  1.283333 | 103.833333 | 248.908449383448
  6 | Jakarta      | -6.193806 | 106.843314 | 476.126654090718
  4 | Bangkok      | 13.787395 | 100.524502 | 741.677180652493
  2 | Manila       | 14.603352 | 120.984682 |  1595.9777030627
  5 | Hong Kong    |  22.27833 |  114.15889 | 1605.53830449593
  7 | Taipei       | 25.105495 | 121.557441 | 2059.91627144258

このような結果になりました。
*パフォーマンス等は考慮してません。。。
テキストファイルの文字コードを変換する方法

テキストファイルの文字コード（SJIS、UTF8）を変換するコードを書いてみました。

```ps1
# テキストファイルをUTF8からSJISに変換する。
# inpath - 入力ファイル/ディレクトリ
# outpath - 出力ファイル/ディレクトリ
function U-ConvertTo-SjisFile($inpath, $outpath) {
    #Get-Content $inpath -Encoding UTF8 | Set-Content $outpath -Encoding String
    U-Convert-TextFile $inpath $outpath UTF8 String
}

# テキストファイルをSJISからUTF8（BOM付き）に変換する。
# inpath - 入力ファイル/ディレクトリ
# outpath - 出力ファイル/ディレクトリ
function U-ConvertTo-Utf8File($inpath, $outpath) {
    #Get-Content $inpath -Encoding String | Set-Content $outpath -Encoding UTF8
    U-Convert-TextFile $inpath $outpath String UTF8
}

# テキストファイルの文字コードを変換する。
# inpath - 入力ファイル/ディレクトリ
# outpath - 出力ファイル/ディレクトリ
function U-Convert-TextFile($inpath, $outpath, $inlang, $outlang) {
    if (Test-Path -Path $inpath -PathType Container) {
        # inpathがディレクトリの場合、
        # ディレクトリ配下のファイル/ディレクトリに対して、
        # 処理を繰り返す。
        Get-ChildItem $inpath -Recurse | %{
            if ($_.GetType().Name -eq "FileInfo") {
                #$outfullname = $_.FullName.ToLower().Replace($inpath.ToLower(), $outpath)
                $outfullname = $_.FullName.Replace($inpath, $outpath)
                U-Convert-TextFile $_.FullName $outfullname $inlang $outlang
            }
        }
    } else {
        # inpathがファイルの場合
        
        # outpathがディレクトリの場合、
        # 入力ファイルと同じファイル名を付加する。
        if (Test-Path -Path $outpath -PathType Container) {
            $outname = Split-Path $inpath -Leaf
            $outpath = Join-Path $outpath $outname
        }
        
        Write-Debug $inpath
        Write-Debug $outpath
        
        New-Item $outpath -ItemType file -Force | Out-Null
        Get-Content $inpath -Encoding $inlang | Set-Content $outpath -Encoding $outlang
    }
}
```
Git 2.0 で git add の挙動が変わる？


いつものように git add したら、以下のようなメッセージが。

```shell
$ git add .
warning: You ran 'git add' with neither '-A (--all)' or '--ignore-removal',
whose behaviour will change in Git 2.0 with respect to paths you removed.
Paths like 'app/assets/images/button/do_register.png' that are
removed from your working tree are ignored with this version of Git.

* 'git add --ignore-removal <pathspec>', which is the current default,
  ignores paths you removed from your working tree.

* 'git add --all <pathspec>' will let you also record the removals.

Run 'git status' to check the paths you removed from your working tree.
```

どうやら Git 2.0 で git add の挙動が変わるらしい。man ページによると、

> http://git-scm.com/docs/git-add/1.8.3
>
> In future versions of Git, "git add <pathspec>..." will be a synonym to "git add -A <pathspec>..." and "git add --ignore-removal <pathspec>..." will behave like today's "git add <pathspec>...", ignoring removed files.

現在のデフォルトの挙動である git add --ignore-removal が git add -all に変わるらしい。

現在のバージョンでは、既に git の管理下にあるファイルが物理的に削除された場合に git add してもステージングされなかったが、今後はされてしまうということになる。

今の挙動でいい気がするんだけど、気にしておかないとはまりそう。

また、他にも変更が予定されていて、デフォルトの pathspec が適用されなくなるらしい。

> If no <pathspec> is given, the current version of Git defaults to "."; in other words, update all tracked files in the current directory and its subdirectories. This default will change in a future version of Git, hence the form without <pathspec> should not be used.

ここは、指定した方がいいので、いまのうちから癖づけておいた方がよさそう。
iPhoneのデフォルトメーラが違う添付画像を表示するバグ

※古いOS(iOS4.1)の話なので現在はなおってるかもしれません。誰か検証お願い

iPhoneのデフォルトメーラには、 **「添付したインライン画像とは違う画像が表示されることがある」** というバグが存在します。

インライン画像付きHTMLメールは、以下のような構文となります。
&lt;img src="cid:01@image.gif"&gt;

普通であれば&lt;img src="image/01.gif"&gt;というような形になるところですが、インライン添付では画像が置いてあるURLとか無いので、かわりにcidという画像を結びつける記号を設置します。
ちなみに例ではgifという拡張子を指定していますが、別にそうする必要はありません。
@の前はランダムな値や日時など、@の後はドメイン名を指定し、&lt;img src="cid:ecabf869473b42c110b1@example.jp"&gt;などとしている例が多いようです。
これは、cidは世界で一意であることが求められているためです。

で、具体的な画像は、BASE64エンコードでテキスト化した上でメール本文に格納されます。

Content-Type: image/gif; name="image01.gif"
Content-Transfer-Encoding: base64
Content-ID: &lt;cid:01@image.gif&gt;

R0lGODlh2QA9ALMIAFOKz6jK…(略)

メーラでは、&lt;img src&gt;のcidがこのContent-IDと結びつけられ、タグの部分に画像として展開され、表示されます。


では、もしこのcidが被ってしまうという事態があったらどうなるでしょうか。

一通のメールで同じcidを指定するというのは、単に同じ画像を連続で表示するというだけのことです。
複数のメールで同じcidを指定してみましょう。

GmailやPC用、iPhone用の多くのメールアプリでは、もしcidが被ったとしても、全く問題無く添付画像を表示します。
cidをメール単位で識別しているので、他のメールに同じcidが入っていたとしても顧みることは普通ないからです。

翻ってデフォルトメーラでは、中身を見たわけではないので推測ですが、以下のように動作していると思われます。
まず一通目のメールを見た際に、そのcidに対応する画像がキャッシュに登録されます。
そしてその後再度メールを見た際、cidに対応する画像がキャッシュに登録されていれば、その画像を表示します。
おそらく高速化のためにそうしているのだと思われますが…ここにひとつ落とし穴があります。

同じcidであればメールを気にせずキャッシュから読み込むんだよね。


どういうこと？
ちょっとRFC準拠が足りないメールアプリがあったとして、cidを連番で付けちゃう仕様になっていたとします。


一通目。
絶対に許さない&lt;img src="cid:01@image.gif"&gt;
添付画像：![image1.gif](https://qiita-image-store.s3.amazonaws.com/0/26088/715b5e5d-2397-80dd-3126-2c8ac148a251.gif)

二通目。
ごめんね&lt;img src="cid:01@image.gif"&gt;
添付画像：![image2.gif](https://qiita-image-store.s3.amazonaws.com/0/26088/9a40eea9-6e6f-73ce-914e-ea34e035ae96.gif)


Gmailから見ると送信したとおりのメールが見れます。

で、これをデフォルトメーラで見ると、


一通目。
絶対に許さない![image1.gif](https://qiita-image-store.s3.amazonaws.com/0/26088/715b5e5d-2397-80dd-3126-2c8ac148a251.gif)

二通目。
ごめんね![image1.gif](https://qiita-image-store.s3.amazonaws.com/0/26088/715b5e5d-2397-80dd-3126-2c8ac148a251.gif)


これじゃあ戦争になっちゃうよ！


問題は、送信側は全くこのことに気がつくことができないという点です。
たしかにRFCを守ってない送信側メーラが悪いと言えばその通りなのですが、メール単位で絞り込みは可能なわけなんだからそのくらい対応してやれと。


ところで@のあたりに勝手にリンクが付いたりするのですが、これを何もしないようにしたいのはどうすればいいんだろう・
アップロードした写真（画像）が回転して表示されるのを直す方法

iPhoneからWebでHTMLのフォームから写真をアップロードしてもらったときなど、画像が回転して表示されてしまう場合があるようです。原因はExifのOrientationの値が「1」以外になっていること。

画像の向きの情報がExifに埋め込まれているけれど、ファイル自体は回転していない（＝撮影した向きになっていない）ために表示がおかしくなるのです。

ブラウザーの仕様によりますが、ExifのOrientationの値を無視して、ファイルを表示しようとすると撮影した向きとは合わない表示になってしまうことになります。

解決するには、アップロードされたときにExifのOrientationを見て、サーバー側で画像を回転させてしまうのがオススメ。回転して、ExifのOrientationの値を正しい向きに補正します。

以下、PHPのimagick拡張を使った場合の例。

```php:
<?php
$imagick = new \Imagick();
$imagick->readImage('test.jpg');
$format = strtolower($imagick->getImageFormat());

if ($format === 'jpeg') {
    $orientation = $imagick->getImageOrientation();
    $isRotated = false;
    if ($orientation === \Imagick::ORIENTATION_RIGHTTOP) {
        $imagick->rotateImage('none', 90);
        $isRotated = true;
    } elseif ($orientation === \Imagick::ORIENTATION_BOTTOMRIGHT) {
        $imagick->rotateImage('none', 180);
        $isRotated = true;
    } elseif ($orientation === \Imagick::ORIENTATION_LEFTBOTTOM) {
        $imagick->rotateImage('none', 270);
        $isRotated = true;
    }
    if ($isRotated) {
        $imagick->setImageOrientation(\Imagick::ORIENTATION_TOPLEFT);
    }
}
```

ちなみにExifのOrientationのテストをするには http://www.galloway.me.uk/2012/01/uiimageorientation-exif-orientation-sample-images/ にあるようなテスト画像を用意するのがいいかも。

## 2016年9月9日追記

[imagick拡張のバージョン3.4.1](https://pecl.php.net/package-info.php?package=imagick&version=3.4.1)から、Imagickクラスに`autoOrient`メソッドが実装されました。これはImageMagickの`convert`コマンドに[`auto-orient`オプション](http://www.imagemagick.org/script/command-line-options.php#auto-orient)を付けて実行するのと同じ効果をもたらします。

つまり、上で記述したのと同じ内容がこう書けるようになりました。

```php:
<?php
$imagick = new \Imagick();
$imagick->readImage('test.jpg');
$imagick->autoOrient();
```

簡単ですね。PHPも拡張も、できるだけ新しいバージョンを使うことをおすすめします。
部分適用で、関数の持つ引数を減らす

Haxeでは引数の持つ関数に対していくつかの引数をあらかじめ指定しておき、引数を減らした関数を生成することが可能です。これには、関数が持つbindという関数を使用します。

```hx:Main.hx
class Main {
	static function main(){
		var func1:Int->Void = output.bind( 5 );
		var func2:Int->Void = output.bind( _, 8 );
		
		func1( 12 ); // output( 5, 12 );と同じ
		func2( 12 ); // output( 12, 8 );と同じ
	}
	
	// Int->Int->Void型の関数
	static function output( a:Int, b:Int ):Void {
		trace( a, b ); // a, bを出力
	}
}

```

上記のコードではIntの引数を2つ持つoutput関数の片方の引数を束縛して、Intの引数を1つだけ持つ関数を生成しています。

これを、 **部分適用** とか **引数の束縛** とか言います。このような引数の束縛は、関数をオブジェクトとして受け渡しをする際に便利です。

例えば、以下のような場合です。

```hx:Main.hx
import haxe.Timer;

class Main {
	static function main(){
		//1秒後に、output( 4, 6 )を実行する。
		Timer.delay( output.bind( 4, 6 ), 1000 );
	}
	
	static function output( a:Int, b:Int ):Void {
		trace( a, b );
	}
}
```

Timer.delayの最初の引数はVoid->Void (引数も戻り値も持たない関数)なので、outputの2つの引数を束縛することで、Void->Voidの関数を作り出しています。
ファイル検索する際はopendirが早い

globなんか遅いなあ、と思って他のファイル検索方法を調べてみました。

- glob
- opendir/readdir
- DirectoryIndex

の３通りについて、実際に計測をしてみます。

```php:test.php

<?php
function list_dir_by_opendir($dir)
{
	$ret[] = $dir;

	if ($dh = opendir($dir)) {
		while (($file = readdir($dh)) !== false) {
			$file = $dir . DIRECTORY_SEPARATOR . $file;
			$ret[] = $file;
		}
		closedir($dh);
	}

	return $ret;
}

function list_dir_by_glob($dir)
{
	$ret[] = $dir;

	foreach( glob($dir.DIRECTORY_SEPARATOR.'{.*,*}',GLOB_BRACE) as $file ) {
		$ret[] = $file;
	}

	return $ret;
}

function list_dir_by_iterator($dir)
{
	$ret[] = $dir;

	foreach( new DirectoryIterator($dir) as $fileinfo ) {
		$ret[] = $fileinfo->getPathname();
	}

	return $ret;
}

$target_path = dirname(__FILE__);

$start1 = microtime(true);
for($i=0;$i<10000;$i++){
	$files1 = list_dir_by_opendir($target_path);
}
$elapse1 = round((microtime(true) - $start1) * 1000 / 10000,5);

$start2 = microtime(true);
for($i=0;$i<10000;$i++){
	$files2 = list_dir_by_glob($target_path);
}
$elapse2 = round((microtime(true) - $start2) * 1000 / 10000,5);

$start3 = microtime(true);
for($i=0;$i<10000;$i++){
	$files3 = list_dir_by_iterator($target_path);
}
$elapse3 = round((microtime(true) - $start3) * 1000 / 10000,5);

```

結果は、AMD1.5GHz/8GB/Win7の環境で

```
time1: 0.28807 msec
time2: 4.07651 msec
time3: 0.36839 msec
```

となり、opendir/readdirの圧勝となりました。
（DirectoryIteratorの計測方法が間違っていましたので訂正しました。こちらもかなり早いっぽいです）

以下、おまけとしてopendir/readdirを使ったファイル検索イテレータを作ってみました。
（2013.08.27 DirectoryIteratorの方が実測上高速でしたのでソースを削除しました。見てみたい方はご連絡ください）
glob('*')だと隠しファイルは検索対象にならない

glob関数は、指定したパターンに一致するファイルを配列として取得する便利な関数ですが、何も考えず

```php:
$list = glob('/tmp/*');
```

などとやってしまうと、ドットで始まるファイル（隠しファイル）はヒットしません。そのような隠しファイルを検索したい場合はGLOB_BRACEオプションを指定して隠しファイルもヒットするようにパターンを指定しましょう。

```php:
$list = glob('/tmp/{*,.*}',GLOB_BRACE);
```

「"." や ".." はいらん」という場合はさらにパターンを指定して...

```php:
$list = glob('/tmp/{*,.[!.]*,..?*}',GLOB_BRACE);
```

としましょう。

なお、DirectoryIteratorおよびopendirで取得する場合は何も指定しなくても隠しファイルを検索できるようです。
jrubyfx のメモ


* jruby は java のバージョン 1.7 以上でビルドされるようにする
    * Java 1.7 以上には標準で JavaFX がついてくるため
    * `JAVA_HOME` の向き先に気をつける
          * `java -version` が 1.7 でも `JAVA_HOME` が 1.6 だと 1.6 でビルドされる
*  https://github.com/jruby/jrubyfx/wiki/Getting-Started これ通りにやったら、初っぱなから SESSEGV 出て途方にくれた
    * どうやら `stage` の中身に何かを入れないと落ちる模様
    * とりあえず動かすなら、ここエントリのサンプルをやると良い: [RubyでGUIアプリを作るならJRuby+JavaFX+Rawrで決まり！ | かなりすごいブログ](http://blog.supermomonga.com/articles/jruby/javafx-rawr.html "RubyでGUIアプリを作るならJRuby+JavaFX+Rawrで決まり！ | かなりすごいブログ")
packer を使って ArchLinux の vagrant box を作る

vagrant は便利なんだけど、box を作るのが手作業で面倒だった。
特に ArchLinux の場合、古い iso から作った box だと今 `pacman -Syu` してもなかなか依存関係をうまく満たせず、最新の状態にするのが困難だったりするので、ある程度定期的に box を作り直したい。

[packer](http://www.packer.io/) を使うと box の作成を自動化できるらしいので、ArchLinux 用のものを書いてみた。
https://github.com/eagletmt/misc/tree/c86d04796e526a196ed5c3fc62dcc2b697d18da3/packer/arch64
インストール用の iso の場所や /etc/pacman.d/mirrorlist に jaist のミラーを指定しているので日本用になっている。

kickstart や preseed のようなしくみは無いので、シェルスクリプトでがんばる。
やってることは手動で ArchLinux をインストールするときとだいたい同じで、

- パーティションの作成
- pacstrap
- arch-chroot 内で
    - hostname やロケールの設定
    - vagrant 用のユーザの作成
    - dhcpcd の設定
        - network に関する設定をすると [PredictableNetworkInterfaceNames](http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/) が無効化されるので、最初から無効化しておくようにする。
        - https://github.com/mitchellh/vagrant/blob/v1.3.1/plugins/guests/arch/cap/configure_networks.rb
    - sshd を起動時に立ち上げるように設定
    - grub-install
- packer の provision で vagrant 用の設定
    - ssh の鍵の設置
    - VirtualBox Guest Additions のインストール

という流れになっている。
mod_wsgiがbuildできてるのか確認

僕は「WSGI」を「うぃすきー」とは呼ばずに「うさぎ」と呼んでいるので会話中に単語を出すと怪訝な顔をされます．
まあ，なんでも，いいですけれど．

Apache2もmod_wsgiもpythonもオレオレパスに突っ込むために./configureにたくさんオプションをつけた挙句
生成されたMakefileの書き換えも行なって何とかインストールできた後ですが，たくさんオプションつけたんで，
できればもう何も書きたくありません．でも動作は確認せねばいけません．

```apache:httpd.conf
LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonHome  /ore/ore/path/to/python3.3.2
WSGIScriptAlias /hello /path/to/hello.py
```

```py3:hello.py
def application(environ, start_response):
    start_response("200 OK", [("Content-type", "text/plain")])
    return ["俺の千早がこんなに可愛い。"]
```

最低限これだけ書けばとりあえずブラウザでアクセスして動作してることは確認できます．

※

```apache:httpd.conf
WSGIPythonHome  /ore/ore/path/to/python3.3.2
```

上記，Python build時にオプションで指定した--prefixの値になります．
メニュー(NSMenu, NSMenuItem)のまとめ


> 随時、更新予定

## メニューの追加とハンドリング

メニューの追加とハンドラの実装までは以下のような手順で行う。

* MainMenu.xib を開き、Menu Item または Submenu Item を追加。
* First Responder を選択し、Attributes inspector で応答するアクションを定義。
* メニューとアクションを接続。(メニューを Control+ドラッグし、First Responder でドロップ)
* 応答したい場所でアクションメソッドを実装。

Cocoa は **nil ターゲットアクション** という仕組みにより、 **レスポンダ・チェーン** を辿ってアクションに応答できるオブジェクトを探し、メソッドを呼び出してくれる。
ドキュメントベースのアプリケーションは通常、メニューを定義する MainMenu.xib とドキュメントウィンドウを定義する Document.xib が分離している。
ドキュメントクラスにメニューに対する応答を実装したい場合は、この仕組みを利用してメニューハンドラを実装する。

#### MainMenu.xib にメニュー UI とアクションを定義

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/25727/ed48e594-2ddb-0b81-bfb1-2a8016f4423f.png)

#### Document.m にアクションハンドラを実装

```objc:Document.m
- (IBAction)insertRectShape:(id)sender
{
    ...
}
```

### 参考文献

[MAC OS X COCOA プログラミング(原著第 4 版)](http://www.amazon.co.jp/dp/4864011354) P.361 "nil ターゲットアクション"
マウスカーソルを消す

```html:hide_cursor.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset=UTF-8 />

    <script
       type="text/javascript" src="http://code.jquery.com/jquery-2.0.3.min.js">
    </script>

    <script
       type="text/javascript"
       src="http://jashkenas.github.com/coffee-script/extras/coffee-script.js">
    </script>

    <script type="text/coffeescript">
      targetArea    = $('p#first') # カーソル変更対象部分
      controlButton = $('button')  # 操作ボタン

      # カーソルを見せ、ボタンのイベントに hideCursor をバインドする
      showCursor = () ->
        targetArea.css('cursor', '')
        controlButton.text('消す')
        controlButton.click -> hideCursor()

      # カーソルを消し、ボタンのイベントに showCursor をバインドする
      hideCursor = () ->
        targetArea.css('cursor', 'none')
        controlButton.text('見せる')
        controlButton.click -> showCursor()
        
      $('button').click -> hideCursor() # 最初は[消す]ボタン
    </script>
  </head>

  <body>
    <h1>カーソルを消す</h1>
    <button tabindex=0 accesskey="h">消す</button>
    <p id="first">カーソル変更対象部分</p>
  </body>
</html>
```
なんかシンタックス・ハイライトがうまくいかない…。