OmniAICreator/Qiita-1.07M huggingface dataset:
JBossAS7でのリモートEJB呼び出し

備忘録です。需要はなさそうですが。
使用したのはjboss-as-7.1.1.FinalでWindows環境下。
JBoss側はデフォルトのStandaloneで起動。設定は特になし。

#サーバ
まずリモートEJB。インタフェースは省略。

```java:HelloRemoteBean.java
package sample.service;

import javax.ejb.Remote;
import javax.ejb.Stateless;

/**
 * Session Bean implementation class HelloRemote
 */
@Remote
@Stateless
public class HelloRemoteBean implements HelloRemote {

    public void sayHello(){
        // リモートの標準出力なので注意
    	System.out.println("Hello Remote!");
    }

}
```

EAR作るので、application.xmlも。

```xml:application.xml
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  version="6" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd">
 
  <application-name>SampleEAR</application-name>
  <initialize-in-order>true</initialize-in-order>
  <module>
    <ejb>SampleEJB.jar</ejb>
  </module>
</application>
```

#クライアント
POJOで作ります。完全に確認用。

```java:SampleClient.java
package sample.client;

import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import sample.service.HelloRemote;

public class SampleClient {
	public static void main(String args[]) throws Exception
	{
		new SampleClient().callRemote();
	}
	
	public void callRemote() throws NamingException{
		Hashtable<String,String> envs = new Hashtable<String,String>();
		envs.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
				
		InitialContext context = new InitialContext(envs);

		try{
			// jboss-ejb-client.propertiesの読込確認
			System.out.println("Properties is " + this.getClass().getClassLoader().getResourceAsStream("jboss-ejb-client.properties"));
			HelloRemote remote=(HelloRemote)context.lookup("ejb:SampleEAR/SampleEJB//HelloRemoteBean!sample.service.HelloRemote");
			remote.sayHello();
		}finally{
			context.close();
		}
		
	}
}
```

SSL通信、URL等の設定をjboss-ejb-client.propertiesに記述します。
ファイル自体はクライアントJARの直下に配置。

```properties:jboss-ejb-client.properties
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port = 4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
```

#実行
コマンドも一応。
java \-cp SampleClient.jar\\;SampleEJB.jar;*\<JBOSS_HOME\>*\\bin\\client\\jboss-client.jar jp.co.sample.client.SampleClient
\#うっかり-jarを指定して半日つぶした

以下がJBossのログに出力されていればOK。

23:51:14,171 INFO  \[stdout\] (EJB default - 1) Hello Remote!

---
参考

*[Minimum Jars Required for Client app to remotely Invoke EJBs in JBoss AS7](http://middlewaremagic.com/jboss/?p=1177 "Minimum Jars Required for Client app to remotely Invoke EJBs in JBoss AS7")
*[EJB invocations from a remote client using JNDI](https://docs.jboss.org/author/display/AS72/EJB+invocations+from+a+remote+client+using+JNDI "EJB invocations from a remote client using JNDI")
キータ => A1I2K1T1

タイトルがいきなり何かの暗号にみえてしまった人がいるかもしれません。

これは ICU の Transliteration（翻字）を使ってカタカナをひらがなに翻字してさらにローマ字に翻字した上でデフラグさんらしく並べ替えた処理を行った後のものです。

ソースコードをペタっと貼っつけておきます。実行するには cmake と ICU が必要です。OSX なら macports で両方共インストール可能です。

```cmake
project(transliterate)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
find_library(ICU_DATA_LIBRARY icudata)
find_library(ICU_UC_LIBRARY icuuc)
find_library(ICU_I18N_LIBRARY icui18n)
find_library(ICU_IO_LIBRARY icuio)
find_path(ICU_INCLUDE_DIR unicode/unistr.h)
target_link_libraries(${PROJECT_NAME} ${ICU_IO_LIBRARY} ${ICU_I18N_LIBRARY} ${ICU_UC_LIBRARY} ${ICU_DATA_LIBRARY})
include_directories(${ICU_INCLUDE_DIR})
```

ソースコードちょっと長く、書き捨て前提で書いてあります。std::map がツリー形式で構築されて自動的にソートされる仕様を利用しているので、ソート処理は省いています。

```cpp
#include <iostream>
#include <map>
#include <unicode/translit.h>
#include <unicode/ustream.h>

int main(int argc, char *argv[])
{
    if (argc > 1) {
        /* construct UnicodeString from first argument and print it */
        UnicodeString string(UnicodeString::fromUTF8(argv[1]));
        std::cerr << string << std::endl;
        /* transliate Katakana to Hiragana */
        UErrorCode status = U_ZERO_ERROR;
        Transliterator *k2h = Transliterator::createInstance("Katakana-Hiragana", UTRANS_FORWARD, status);
        k2h->transliterate(string);
        std::cerr << string << std::endl;
        /* transliate Hiragana to Roman (Latin) */
        status = U_ZERO_ERROR;
        Transliterator *h2r = Transliterator::createInstance("Hiragana-Latin", UTRANS_FORWARD, status);
        h2r->transliterate(string);
        /* split UnicodeString into array of UChar */
        typedef std::map<UChar, int> UCharMap;
        UCharMap chars;
        for (int i = 0, length = string.length(); i < length; i++) {
            UChar c = string.charAt(i);
            UCharMap::iterator it = chars.find(c);
            if (it != chars.end()) {
                it->second++;
            }
            else {
                chars.insert(std::make_pair(c, 1));
            }
        }
        /* sort and make char (downcast from UChar) upper */
        UCharMap::const_iterator it = chars.begin();
        while (it != chars.end()) {
            std::cerr << char(toupper(it->first)) << it->second;
            it++;
        }
        std::cerr << std::endl;
    }
    return 0;
}
```

無事にビルドに成功すると以下のように第一引数に変換したいカタカナ文字列を渡すことで最終出力がタイトルにあるような形式で出力されます。

```bash
./transliterate インターナショナルコンポーネンツフォーユニコード
# インターナショナルコンポーネンツフォーユニコード
# いんたあなしょなるこんぽおねんつふぉおゆにこおど
# A4D1E1F1H1I2K2N7O9P1R1S2T2U3Y1
```

余談ですがこのソースコードは普段使用している QtCreator 2.7 を使って書いています。C++ は勿論、割と最近 cmake のキーワード補完が効くようになったので便利です。
UINavigationControllerのpushViewControllerを少し便利に

UINavigationControllerのpushViewController:animated:で画面遷移した場合、バックボタンの設定を以下のようにプッシュ元のViewControllerで設定してやる必要がありますよね。

```objc:UIViewControllerSubClass.m
UIBarButtonItem *back = [[[UIBarButtonItem alloc] initWithTitle:@"戻る"
                                                          style:UIBarButtonItemStyleBordered
                                                         target:nil
                                                         action:nil] autorelease];
[self.navigationItem setBackBarButtonItem:back];
```

iOS開発始めたばかりの人だとこれって結構ハマりポイントだったりしませんか？
それに画面遷移が多いアプリケーションだと毎回pushViewControllerする度にUIBarButtonItemを設定してやらないといけないですし。

ということでUIViewControllerをプッシュする際にわざわざUIBarButtonItemのインスタンスを自分で生成するのが面倒だと感じる場合はUINavigationControllerにカテゴリメソッドを追加してあげましょう。

```objc:UINavigationController+Push.h
@interface UINavigationController (Push)
- (void)pushViewController:(UIViewController *)viewController backButtonTitle:(NSString *)backTitle animated:(BOOL)animated;
@end
```

```objc:UINavigationController+Push.m
@implementation UINavigationController (Push)

- (void)pushViewController:(UIViewController *)viewController backButtonTitle:(NSString *)backTitle animated:(BOOL)animated
{
    UIBarButtonItem *back = [[[UIBarButtonItem alloc] initWithTitle:backTitle
                                                              style:UIBarButtonItemStyleBordered
                                                             target:nil
                                                             action:nil] autorelease];
    [self.visibleViewController.navigationItem setBackBarButtonItem:back];
    [self pushViewController:viewController animated:animated];
}

@end
```

こうすることで、プッシュ元のクラスでは以下のコードだけで画面の遷移・バックボタンの設定を行えます。

```objc:UIViewControllerSubClass
[self.navigationController pushViewController:viewController backButtonTitle:@"戻る" animated:YES];
```

この程度の拡張でも、画面遷移の多いアプリケーション開発では大いに役立つのではないでしょうか？
zshでcommand not foundという冷やかなメッセージを暖かくする

たとえば `ls` コマンドを実行しようとして間違えて `lls` と打ってしまうことがあるかもしれません。

```sh:Zsh
[kengo@tkengo-mac] $ lls
zsh: command not found: lls
```

いつもの通り **そんなコマンドないよ** と冷たくあしらわれてしまいました。

コマンドを間違った時に嫌な気持ちにならないように zsh にはもっと暖かいメッセージを言ってもらいましょう。

## command_not_found_handler

zsh には **command_not_found_handler** という特別な関数があります。この関数は、存在しないコマンドを呼びだそうとした時に呼ばれます。

`~/.zshrc` に以下のように定義してみます。

```sh:~/.zshrc
function command_not_found_handler() {
  echo "your input: $0" # $0には実行されたコマンド名が入っています
}
```

設定を読み直して `lls` してみると

```sh:Zsh
[kengo@tkengo-mac] $ source ~/.zshrc
[kengo@tkengo-mac] $ lls
your input: lls
```

## 暖かいメッセージ

もうわかると思いますが echo コマンドで何でも出力できます。顔文字を出力してみると和みます。

```sh:~/.zshrc
function command_not_found_handler() {
  echo "(o^ワ^)> $0 なんてコマンド無いぽ"
}
```

これで

```sh:Zsh
[kengo@tkengo-mac] $ source ~/.zshrc
[kengo@tkengo-mac] $ lls
(o^ワ^)> lls なんてコマンド無いぽ
```

こうなります。

## 本当は

こんなふざけた使い方をするよりかはもっと有益な使い方があるはず orz
Kernel#at_exitの挙動


「なるほどUnixプロセス」の第10章にあった、Kernel#at_exitを見て、何回at_exitを何回か叩いたらどうなるんだろうと思って試したので、メモ。

```ruby:at_exit.rb
at_exit{puts 'Last!'}
at_exit{puts 'Last!2'}
exit
```

実行するとこんな出力になる。

```
Last!2
Last!
```

ブロックがpopされる感じなんですかね。

と、ここまで試してみて、Rubyの[Kernel#at_exit](http://doc.ruby-lang.org/ja/2.0.0/method/Kernel/m/at_exit.html)に書いてあることに気づきました。
Solarizedのカラーテーマとvim-powerlineのカラースキームを同時に変更する

自分はここ最近ずっと、[Solarized](http://ethanschoonover.com/solarized)をVimの[テーマ](https://github.com/altercation/vim-colors-solarized)に使ってます。ステータスラインはもうディスコンになってますが、[vim-powerline](https://github.com/Lokaltog/vim-powerline)を使ってます。

このvim-powerlineですが、ちゃんとSolarized用の[カラースキーム](https://github.com/Lokaltog/vim-powerline/tree/develop/autoload/Powerline/Colorschemes)が用意されてます。

Solarizedは`:ToggleBG`というコマンドが用意されており、このコマンドを呼び出すと *light* と *dark* を切り替えることができます。

気分によってSolarizedの色合いを切り替えたいなーという時に`:ToggleBG`呼び出してもpowerlineのカラースキームは元のままということでかなり残念な感じになってしまいます。

![mismatch](https://www.evernote.com/shard/s64/res/249f4e58-b50e-4090-89da-183ec33ccd2f/skitch.png?resizeSmall&width=1049)

そこでこの2つを連動させるための関数作って.vimrcに書いて対応しました。

```vim
function! TogglePowerlineColorscheme()
  :ToggleBG
  if exists(':ToggleBG') && exists(':PowerlineReloadColorscheme')
    let g:Powerline_colorscheme = &background == 'light' ? 'solarized' : 'solarized256'
    PowerlineReloadColorscheme
  endif
endfunction
nnoremap <F6> :call TogglePowerlineColorscheme()<CR>
inoremap <F6> :call TogglePowerlineColorscheme()<CR>
vnoremap <F6> :call TogglePowerlineColorscheme()<CR>
```

これで`<F6>`を押すと以下のように良い感じに切り替えができます。

### Solarized light
![light](https://www.evernote.com/shard/s64/res/a862e057-82ed-42d6-a624-483b3233b98d/skitch.png?resizeSmall&width=1049)

### Solarized dark
![dark](https://www.evernote.com/shard/s64/res/be53aed9-4199-4b24-854e-35c751f23040/skitch.png?resizeSmall&width=1049)

他に何か良い方法あるのかな…。
JavaScriptの可変長引数を扱いやすく

```javascript
_.optarg = function (n, f) {
    return function (/* & arguments  */) {
        var required = Array.prototype.slice.call(arguments, 0, n);
        var optional = Array.prototype.slice.call(arguments, n);
        required.push(optional);
        return _.apply(f, required);
    };
};
```

これで

```javascript
var f = function () {
  var a = arguments[0];
  var b = arguments[1];
  var rest = Array.prototype.slice.call(arguments, 2);
  //...
};
```

みたいなコードを

```javascript
var g = _.optarg(2, function (a, b, rest) {
  //...
});
```

みたいに書ける。

```javascript
_.bin_multi = function (binary_f) {
    return _.optarg(2, function (x, y, zs) {
        return _.foldl(zs, function (acc, a) {
            return binary_f(acc, a);
        }, binary_f(x, y));
    });
};
```

これで、

```javascript
var add = _.bin_multi(function (a, b) {
  return a + b;
});

add(1,2,3,4,5,6,7,8,9,10); //=>55
```

みたいなことができる.

https://github.com/ympbyc/underscore-fix
xmonad 環境で起動時に xmodmap を設定する

xmonad が xmodmap を上書きしてしまうらしく，xinitrc に xmodmap ファイルを読み込む設定を普通に記述しても上手く動かない．そんなときは，以下のように，xmonad が起動してから xmodmap を読み込むように設定すればよい．

```
(sleep 3; xmodmap ~/.Xmodmap) &
exec xmonad
```
役に立たない奇妙なTips

###多分殆ど役に立たないけれど、ごく希に有効なケースと、挙動の把握に必要かも知れない不思議なコード。

知っている人には当たり前のことかも知れないけれど、

```Objective-C:sample.m
id nullObject = [[nil alloc] init];
NSLog(@"%@", nullObject);
```
なんてことをやると、

```Objective-C:result
DocTest[31390:303] (null)
```
が帰ってくる。

###どう使うか？
当然、これは単体では役に立たない。
しかし、ちょっと考えると、

```Objective-C:sample2.m
Class klass = nil;
switch (condition) {
	case a:
		klass = [MyClass1 class];
		break;
	case b:
		klass = [MyClass2 class];
		break;
	default:
		klass = nil;	// なくても良い
		break;
}// end case by condition

id instance = [[klass alloc] init];
		// 以下適切な処理を
```
などしてやると、nilに対するメッセージは何も起きないので、例外はノーアクションで良いコーディングの時には使えるかも知れない。

###しかしやっぱり
元々気持ち悪い言語だけど、ここまで奇抜なことが出来るとは思わなかった。
第17回 granpark.rb 「データ解析技術入門(R言語編)」に行ってきた


05/10に開催されたgranpark.rbに参加して来ました。
浅井さんによるRのハンズオンでしたが、あの馴染めない構文に少し馴染むことができてよかったです。

参加した際のメモを書きました。

# granpark.rbについて(miztiさん)
- 隔週で、各種技術のハンズオンとアルゴリズムのペアプロを交互にやっている。
- see also [id:mizti](http://mizti.hatenablog.com/)
- 今後のテーマ
    - CTF大会(セキュリティ)入門
    - Rubyデバッガ詳解
    - chef大会

# R入門(浅井さん)

## Rのメリット・デメリット
- メリット
    - 処理速度もそこそこ速い
    - タダ！
    - 拡張はcranからとってこればいいじゃない
- デメリット
    - メモリに乗らないとNG
    - ベクトル、行列を意識したコードを書く必要がある
    - Googleで検索しづらい

## 驚きの事実
- Rで``iris``と打つと、あやめのデータが出てくる
- summary(iris)でmin,max,median,meanなどが出る
- 色付けてplotする

```
pairs(iris[1:4], pch = 21, bg = c("red","green3","blue")[unclass(iris$Species)])
```

## ダメ、絶対
- Rでは添字操作をしてはいけない！
    - 多重のforループは使わない
    - if文はsumなどの関数の中でやる

```
for(j in 1:rep){
	count=sum(iris[iris[,5]=="virginica",1])+count
}
```

### 理由
- R上で論理判断をするのではなく、Rが叩いているC++の最適化されたコードを使うほうが速いから

## やってみよう
### 問題

これを高速化してみる

```
x <- runif(1000000)
test1 <- function(){
	res <- numeric(1000000)
	for(i in 1:1000000) res[i] <- exp(x[i])
	return(res)
}
system.time(test1())
```

処理時間

```
   ユーザ   システム       経過  
     1.907      0.008      1.907 
```

### 解答
```
x <- runif(1000000)
system.time(res <-exp(x))
```

処理時間

```
   ユーザ   システム       経過  
     0.012      0.002      0.013 
```


### 別解
```
system.time(c(exp(x)))
```

## 感想
- Wekaの方が速いのかな？GUIもついていて楽？
- Pythonのpandasと比較するとどれくらい？
YukkuroidをTerminalから使う


必要なものを揃える
---

- Mac OS 10.7
- Terminal 2.2.3
- Node.js 0.8 (旧安定版)
- Yukkuroid v0.4.1

NodeとYukkuroidはGUIのインストーラーで入れられます。
Node.jsの最新版(v0.9以降)を入れてしまうとNodOnjCをインストール出来ないので、旧安定版を入れます。間違えて最新版を入れてしまった場合は[^アンインストール]

次にNodObjCをインストール

```sh
mkdir yukkuri
cd yukkuri
npm install NodObjC
```

コレで環境は整いました。Yukkuroidを起動した状態で次へ進みます


jsアプリを作る
---
デスクトップにでもjsファイルを2つ作ります

```yukkuri.js
var $ = require('NodObjC');
$.import('Foundation');
$.import('Cocoa');
 
var processName,
    host,
    proxy,
    pool;
 
/**
 * 初期化処理.
 * ここで自動解放プールの作成と必要なNSStringの作成.
 */
exports.init = function() {
    pool = $.NSAutoreleasePool('alloc')('init');
    processName = $.NSString('stringWithUTF8String', 'com.yukkuroid.rpc');
    host = $.NSString('stringWithUTF8String', '');
    proxy  = $.NSConnection('rootProxyForConnectionWithRegisteredName',processName,'host',host);
};
 
/**
 * 終了処理.リソースを解放する.
 */
exports.release = function() {
    pool('drain');
};
 
/**
 * NSConnectionを取得する.
 */
exports.getProxy = function() {
    return proxy;
};
 
/**
 * 通常テキスト欄に値をセット.
 */
exports.setKanjiText = function(jsStr) {
    var objCStr = $.NSString('stringWithUTF8String', jsStr);
    proxy('setKanjiText',objCStr);
};
 
exports.getKanjiText = function() {
    return proxy('getKanjiText');   
};
 
/**
 * 音声を再生する.
 */
exports.play = function() {
    proxy('pushPlayButton',0);
};
```
```app.js
//app.js
var yukkuri = require('./yukkuri');
 
var word;
 
if (process.argv.length <= 2) {
    console.log("引数にしゃべらせたい文字を指定してください");
    process.exit(0);
}
 
//初期化
yukkuri.init();
//引数から文字を取得してセット
yukkuri.setKanjiText(process.argv[2]);
var text = yukkuri.getKanjiText();
console.log("しゃべる文字:",text);
//再生
yukkuri.play();
//後処理
yukkuri.release();
```

実行
---
jsファイルがあるディレクトリ(私の環境では~/Desktop)で、以下のコマンドで実行出来ます。

```sh
cd ~/Desktop
node app.js ゆっくりしていってね
```

間違えて最新版を入れてしまった場合
---
[^アンインストール]: Nodeのアンインストール
```sh
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom | while read f; do  sudo rm /usr/local/${f}; done
 
sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.*
```
http://notepad2.blogspot.jp/2012/06/how-to-uninstall-nodejs-on-mac-os-x.html
[enchant.js].addEventListener == .on


イベントリスナを追加するとき、いちいち.addEventListener と描かなくても、 .on と書けばすむようになりました。

以下の二つのコードは同じ挙動

```enchant.js
bear.addEventListener('enterframe', function(){
	bear.x++;
});
```

```enchant.js
bear.on('enterframe', function(){
	bear.x++;
});
```

地味ですが、すごく助かりますね。addEventListenerって長いから。
[JavaScript] rand関数

整数で返るrand関数をさくっと作っておきましょう。

```JavaScript
var rand = function(n){
	return Math.floor(Math.random() * n) + 1;
};
```
こんなかんじで関数を定義して、下のように使います。

```JavaScript
console.log(rand(100));
// -> 1~100のランダムな数が返る
````
Macでラベル印刷覚書

商品名は「カラー印刷がキレイなCD/DVD用ラベル」EDT-SDVD2（お探しNo.M02）
![ELECOM カラー印刷 キレイ CD/DVDラベル](http://f.cl.ly/items/2X1q472R012z3w0D2N2Y/IMG_0001.JPG)

なんか家にありました。
とても便利なラベル作成ソフトがあるということだったんですが、ソフトが**windows専用**だったのでMacで使うために四苦八苦した覚書です。

1. illustratorでラベル面をデザイン
1. USBメモリに移す
1. インクジェットプリンタにUSBを差し込む
1. プリンタの機能でデータをトリミング
1. 印刷

色々事情があって(後述)こんな長い道のりを辿るはめになりました。

illustratorでラベル面をデザイン
===

1. テンプレートから新規…(Shift+Cmd+N)
1. Basic > Blank Template > CD ディスクラベル_無地 を開く
1. てきとーにデザインする
1. Webおよびデバイス用に保存(Cmd+Shift+Opt+S)
	1. 画像サイズタブで、ほどほどに高解像度にしておく（幅2000pxくらいあればいいかな？）
	1. アートボードサイズでクリップにチェック
	1. Jpegで保存


USBメモリに移す
===

以下の外部記憶装置が対応してます

- SDカード
- メモリースティック(無印/DUO)
- USBメモリ


インクジェットプリンタにUSBを差し込む
===

穴は全面の、印刷済みの紙が出てくるトレイのすぐ上にあります

プリンタの機能でデータをトリミング
===

1. 用紙は、切れ目が入っているほうを下にして、印刷する部数+αをセット。（追加するためにトレイを引っこ抜くとトリミングした設定が全部ぶっとぶため）
1. デジカメプリントボタンを押す
1. こだわりプリントを選択
1. 印刷する画像 - 先ほど用意した画像を選択
1. トリミング にチェックし、OKを選択
1. 画像プレビューが出て、トリミングが出来るようになりますが、先に用紙設定をしたいので、OKを3回選択する
1. 印刷設定を選択
	- 画質 - きれい
	- 用紙 - インクジェット紙か光沢紙
	- サイズ - 2L版
	- 以上を設定して、戻る（反転してる矢印）を選択
1. トリミング画面に戻ってトリミングし直します。戻る（反転してる矢印）を3回選択
1. トリミング にチェックし、OKを選択
1. こんどこそトリミングします。
	1. ＋を3回
	1. →を1回
	1. ↓を6回
	1. +を2回
	1. ↓を1回
	1. OKを選択
	おそらくコレでだいたい合うはず。あとは微調整してください。上いったり下いったり非効率じゃね？　って思ったら帰れ。
1. 部数を設定して、OKを選択
1. 設定を確認し、スタートボタン（モノクロ押してもカラー押してもカラーが印刷されます）


印刷
===

印刷結果を見て修正が必要な場合は絶望しましょう。
そうでない場合はおめでとうございます。




いろいろな事情
===

一番のアイタタタは、ラベル作成ソフトがWin専用だったことです。コレさえ動けばもっと楽だったろうなあ。

あと、私が普段使っているプリンタはモノクロレーザーで、今回のようなミリ単位の調整が必要な印刷はやっぱりインクジェットプリンタが適しているため、普段使わないプリンタを使いました。これも時間がかかった要因の一つです。

BrotherのMyMio（現PRIVIO）というやつで、無線LAN対応なんですが、放浪癖があって、定期的に無線LANから離脱してしまい、印刷できる時とできない時があって、家族全員が彼に期待するのを諦めました。

あなたはきっとプリンタの置き場所が悪いのだろうと言うでしょう。しかし無線LANのルーターはなんと同じ部屋にあり、間は1メートルも離れておらず、間を隔てるものはなにもありません。もう意味がわからないですね。ちなみの他の無線LAN機器はとても正常に働いています。試行錯誤しサポートに問い合わせ設定の初期化を計30回くらいしたところで「FAXとして正常に働いているからもういい」という素晴らしい結論に達しました。

ケノン？とかエピソン？とかの高級品は無線印刷がとてもいいらしいですね。iPhoneから線を繋がずに印刷できる環境が欲しいなあ。

書き終わって気づいたけど
===

書き終わって気づいたけど、プログラミング関係ないですね
音声データを一括で軽量化

ffmpegを使います。

```bash
cd ~/Music/trpg/session_name/records/
mkdir rec
for fn in *.mp3;do ffmpeg -i "$fn" -ab 64k "rec/$fn";done
```

このようなコマンドで動きます。-ab 64k のところを128kなどとしてビットレートを変更できます。

※[ボイスメモを軽量化したい場合](http://qiita.com/yang_orz/items/4ce0aa0ec14d410e5506)
iOS5でTwitter APIを使う


iOS5以上対応アプリにTwitterでの投稿機能を付けたときのメモ。
iOS6からはsocial.frameworkを使うと、TwitterとかFacebook周りの実装ができるらしい。
今回はiOS5にも対応する必要があるのでTwitter.frameworkを使う。

ちなみに、投稿だけなら、TWTweetComposeViewControllerクラスを使うと簡単にできる。ただ、今回は、Twitterの投稿画面を表示したくなかったので、TWRequestを用いて実装した。

###必要なフレームワーク
・Twitter.framework
　　当然必要。
・Accounts.framework
　　アカウントの管理に必要。

###Twitterアカウントへのアクセス権の取得
```
---略---
#import <Accounts/Accounts.h>
#import <Twitter/Twitter.h>
---略---

ACAccountStore *store = [[ACAccountStore alloc] init];
ACAccountType *twitterType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    [store requestAccessToAccountsWithType:twitterType
                     withCompletionHandler:^(BOOL granted, NSError *error) {
                         if (granted) {
                             //アクセスが許可されたときの処理
                             //設定されているアカウントを取得
                             self.twitterAccounts = [store accountsWithAccountType:twitterType]; 
                         }else {
                             //アクセスが拒否されたときの処理
                         }
                     }];
```

初回アクセスのときはアクセス許可を求めるダイアログが表示される。


###取得したアカウントでツイート
```
//Twitter APIのURL（今回はツイート投稿なので、POST statuses/update）
NSURL *postUrl = [NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/update.json"];
//必要なパラメータ
NSDictionary *parameters = [NSDictionary dictionaryWithObject:@"投稿する文" forKey:@"status"];
TWRequest *postRequest = [[TWRequest alloc] initWithURL:postUrl
                                             parameters:parameters
                                          requestMethod:TWRequestMethodPOST];

//上で取得したアカウントをセット
ACAccount *twitterAccount = [twitterAccounts objectAtIndex:0]; 
postRequest.account = twitterAccount;

//投稿    
[postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        //投稿完了時の処理
    });
}];
```

APIのURLや必要なパラメータは[Twitter APIの公式ドキュメント](https://dev.twitter.com/docs/api/1.1 "REST API v1.1 Resources")を参照。

##参照
加藤寛人, 吉田悠一, 藤川宏之, 西方夏子, 関川雄介, 高丘知央　著 『iOS5プログラミングブック』初版
hanikamu.c（修正版）

``` c:C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum e_move { ROW, COL };
struct position
{
	int p[2];
};

void test( const char * input, const char * ans )
{
	const char * table[9] = 
	{
		"!!!!!!!!!",	// ！マークを番兵に
		"!WXYZ!!!!",
		"!VJKLa!!!",
		"!UICDMb!!",
		"!THBAENc!",
		"!!kSGFOd!",
		"!!!jRQPe!",
		"!!!!ihgf!",
		"!!!!!!!!!"	
	};
	const int move_table[][2] = { {-1,0}, {-1,-1}, {0,-1}, {1,0}, {1,1}, {0,1} };
	const struct position start = { {4,4} };	// 不要ですけど↓
	struct position pos = {0};
	char str[20] = {0};
	int i = 0;

	pos = start;				// これを試してみました（配列を構造体にしてコピー）
	strncat(str, &table[ pos.p[COL] ][ pos.p[ROW] ], 1 );
	for(i = 0; i < strlen(input); i++ )
	{
		pos.p[COL] += move_table[ input[i]-'0' ][COL];		// 移動します
		pos.p[ROW] += move_table[ input[i]-'0' ][ROW];
		strncat(str, &table[ pos.p[COL] ][ pos.p[ROW] ], 1 );
		if( table[ pos.p[COL] ][ pos.p[ROW] ] == '!' )
		{
			pos.p[COL] -= move_table[ input[i]-'0' ][COL];	// はみ出たので戻ります
			pos.p[ROW] -= move_table[ input[i]-'0' ][ROW];
		}
	}
	printf("%s\n", (strcmp(ans,str) == 0) ? "ooooo GOOD ooooo": "xxxxx BAD xxxxx");
}

int main( void )
{
	/*0*/ test( "135004", "ACDABHS" );
	/*1*/ test( "1", "AC" );
	/*2*/ test( "33333120", "AENc!!b!M" );
	/*3*/ test( "0", "AB" );
	/*4*/ test( "2", "AD" );
	/*5*/ test( "3", "AE" );
	/*6*/ test( "4", "AF" );
	/*7*/ test( "5", "AG" );
	/*8*/ test( "4532120", "AFQPOEMD" );
	/*9*/ test( "051455", "ABSHSj!" );
	/*10*/ test( "23334551", "ADMb!cdeO" );
	/*11*/ test( "22033251", "ADLKLa!ML" );
	/*12*/ test( "50511302122", "AGSjkTHTU!VW" );
	/*13*/ test( "000051", "ABHT!!!" );
	/*14*/ test( "1310105", "ACDKJW!V" );
	/*15*/ test( "50002103140", "AGSk!HU!IVIU" );
	/*16*/ test( "3112045", "AEDKYXKC" );
	/*17*/ test( "02021245535", "ABCIJW!JIHBS" );
	/*18*/ test( "014204", "ABIBCIB" );
	/*19*/ test( "255230", "ADAGAEA" );
	/*20*/ test( "443501", "AFPefgQ" );
	/*21*/ test( "022321", "ABCKLZ!" );
	/*22*/ test( "554452", "AGRh!!Q" );
	/*23*/ test( "051024", "ABSHTUH" );
	/*24*/ test( "524002", "AGAFGSB" );
	/*25*/ test( "54002441132", "AGQRjSRhRSGA" );
	/*26*/ test( "11010554312", "ACJV!!UTkSHI" );
	/*27*/ test( "23405300554", "ADMNEFOFGRi!" );
	/*28*/ test( "555353201", "AGRih!gPQG" );
	/*29*/ test( "22424105", "ADLMabaLD" );
	/*30*/ test( "11340202125", "ACJKDCKJX!!J" );
	/*31*/ test( "4524451", "AFQFPf!P" );
	/*32*/ test( "44434234050", "AFPf!!e!!Pgh" );
	/*33*/ test( "00554040132", "ABHk!j!i!jRG" );
	/*34*/ test( "3440403", "AEOePfgf" );
	/*35*/ test( "111130", "ACJW!XW" );
	/*36*/ test( "21133343125", "ADKXYZ!a!Z!L" );
	/*37*/ test( "353511", "AEFOPFA" );
	/*38*/ test( "22204115220", "ADLZYLY!KY!X" );
	/*39*/ test( "03013541", "ABABICBGB" );
	/*40*/ test( "101344", "ACIVJCA" );
	/*41*/ test( "2432541", "ADENbNdN" );
	/*42*/ test( "45332242015", "AFQPedc!!NME" );
	/*43*/ test( "215453", "ADKCAGF" );
	/*44*/ test( "45540523454", "AFQh!i!RQg!!" );
	/*45*/ test( "42434302545", "AFEOd!!ONOef" );

	return 0;
}
```
画像付き Git/GitHub の使い方

[第２回 株式会社レキサス+Okinawa.rb合同勉強会](http://blog.lexues.co.jp/14283.html)の準備をしていたら、気づいたら出来ていたでござる...。何かの参考になれば幸いです。ライセンスは[WTFPL – Do What the Fuck You Want to Public License](http://www.wtfpl.net/)なので、自由に引用・配布して頂いて構いません。

## Git/GitHub の準備

### 1. [Gitをダウンロード＆インストール](http://git-scm.com/downloads)し、ターミナル上で`git`コマンドが使えるようにしてください。

	例：
	/Users/yasulab/github-clones% git --version
	git version 1.7.10.2 (Apple Git-33)

### 2. [GitHub](https://github.com/)のウェブサイトへ行き，GitHubアカウントを作成してください．

	![GitHub Landing Page](https://dl.dropboxusercontent.com/u/2819285/github_landing-page.png)

準備が終わった（あるいは既に終わっていた）ら、次に進んでください。


## 問題の取得＆提出の仕方

各グループが最終的に提出したコードを一覧出来るように、次の手順に沿って、問題をダウンロード＆提出してください。

### 1. 該当するリポジトリをコピー（fork）します。
![How to fork](https://dl.dropboxusercontent.com/u/2819285/howto-fork.png)
	
### 2. コピー（fork）したリポジトリ（fork ボタンを押した後に表示されるページ）から、次のURLをコピーします。
![How to clone 1/3](https://dl.dropboxusercontent.com/u/2819285/howto-clone.png)
	
### 3. ターミナル (CygwinやTerminal.appなど）を開き、コピーしたURLを使って、問題をダウンロード（git clone）します。
![How to clone 2/3](https://dl.dropboxusercontent.com/u/2819285/howto-clone-2.png)
	
### 4. 無事にダウンロード（git clone）が終わると、次のように表示されます。
![How to clone 3/3](https://dl.dropboxusercontent.com/u/2819285/howto-clone-3.png)

### 5. このディレクトリ内で、ペアプログラミングをして（あるいは一人で）問題を解きます。
![How to solve](https://dl.dropboxusercontent.com/u/2819285/howto-solve.png)
	
### 6. 問題を解き終わったら、解答コードをリポジトリに保存（git commit）します。
![How to commit](https://dl.dropboxusercontent.com/u/2819285/howto-commit.png)
	
### 7. 解答コードを GitHub 上へアップロード（git push）します。
![How to push](https://dl.dropboxusercontent.com/u/2819285/howto-push.png)
	
### 8. 2.で訪れたページを開き、先ほど書いた問題の解答を、オリジナルのリポジトリに送信（Pull Request）します。
なお、2. で開いたページのURLは、こんな感じのURLです：`https://github.com/アカウント名/リポジトリ名`

![How to Pull Request](https://dl.dropboxusercontent.com/u/2819285/howto-pr.png)
	
### 9. もし感想やコメント等があれば、是非書いてみてください！
![How to comment](https://dl.dropboxusercontent.com/u/2819285/howto-comment.png)

以上で準備およびインストラクションは終了です。では、問題を楽しんでください！

※ なお、問題は当日 GitHub の [Okinawa.rb](http://github.com/okinawarb) アカウントから発表いたします。[ScreenX TV](http://screenx.tv/)を使って遠方から参加することも可能なので、興味ある方も是非是非〜。

第２回 Okinawa.rb + Lex.rb 合同勉強会
http://atnd.org/event/okrb2
Android の WebView で addJavascriptInterface を使わず情報を渡す

WebView 使ってても Android 側から HTML (JavaScript) 側に，またはその逆方向に情報を渡したくなりますよね．

それを最も簡単に実現するのは `addJavascriptInterface` メソッドを使う方法だと思います．

しかし `addJavascriptInterface` は危険らしいです．詳しくは

* [Android セキュリティ勉強会 〜WebView の脆弱性編〜](http://ierae.co.jp/uploads/webview.pdf) (PDF)

を参照して下さい．

で，じゃあそれを使わないで何とかする方法を考えた時，HTML から Android への方向は，割と簡単に何とかなります．

しかし逆はちょっとしたハックをしなければなりません．その詳しい方法は

* [AppとWebViewの相互の機能の呼び方、そしてhistory.back()について（iPhone・Android） | ひささん日記](http://tech.hisasann.com/javascript/46/)
* [Day After Neet: AndroidのWebViewでJavaScriptを実行する](http://dayafterneet.blogspot.jp/2011/08/androidwebviewjavascript.html)

を参照して下さい．

この，alert を無理矢理抑えこむ方法を使うとちょっと問題が発生します．alert が全て発生しなくなります．

なので，今回ここで紹介するのはそれを回避する方法です．

方法はいたって簡単．`onJsAlert` メソッドは，alert に渡された文字列を受け取ることが出来ます．こいつを使って場合分けして運用で回避です．

```java
...
public class MainActivity extends Activity {
  ...
  protected void onCreate(Bundle savedInstanceState) {
    ...
    webView.setWebChromeClient(new WebChromeClient() {
      @Override
      public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        if (message.equals("net.kaosfield.wv1")) {
          try {
            Log.d("wv1", "url: " + url + ", message: " + message);
            return true;
          } finally {
            result.confirm(); // in order not to alert
          }
        }
        else {
          return false;
        }
      }
      ...
    });
  ...
  }
...
}
```

したがって，この処理に突入するために使う

```Java
view.loadUrl("javascript:alert(window.method(\"" + argument + "\"))");
```

が用いている `window.method` 関数は，必ず `"net.kaosfield.wv1"` を返すようにしておきます．

逆に言えば alert にこの文字列を表示することだけが出来なくなります．なので，一意でかつ絶対に alert で出したくならない・出ることがない文字列にしておく必要があります．

このサンプルを GitHub に上げてます．

https://github.com/kaosf/android-webview/commit/77cf7f00fc5d239d0dfa8611690b77c327add342

WebView に関して色々実験してるリポジトリなので，関係ないコードも多いですけど…

あと，HTML から Android 側へ情報を渡すサンプルもついでに付随しております．お得！

HTML は `sample-htmls` ディレクトリ内の `passing-a-string.html` です．`MainActivity.java` 内の

```java
webView.loadUrl("http://google.com");
```

部分を `passing-a-string.html` を指す URL に変えてやって下さいな．

このサンプルだけに特化したアプリを作っておきたい．

ちなみに結構まだまだ問題は残ってると思います．
開いているファイル/フォルダのパスをクリップボードに保存する

ちょっとした手間を省くElispです。

この設定では`M-x put-current-path-to-clipboard`もしくは`C-c C-c p`で現在のバッファのパスをクリップボードに読み込みます。

    ;;; Get current path and put it to clipboard
    (defun put-current-path-to-clipboard ()
      (interactive)
      (let ((file-path buffer-file-name)
            (dir-path default-directory))
        (cond (file-path
               (kill-new (expand-file-name file-path))
               (message "This file path is on the clipboard!"))
              (dir-path
               (kill-new (expand-file-name dir-path))
               (message "This directory path is on the clipboard!"))
              (t
               (error-message-string "Fail to get path name.")
               ))))
    (global-set-key (kbd "C-c C-c p") 'put-current-path-to-clipboard)
アプリケーションがバックグラウンドから復帰するときに任意の処理を呼び出す

NSNotificationCenterのaddObserver:selector:name:object:で呼び出したいselectorを登録すれば良いです。

```objc
UIApplication *application = [UIApplication sharedApplication];

// アクティブになったときに通知されるように登録する    
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(hoge) name:UIApplicationDidBecomeActiveNotification object:application];
```

UIApplicationDidBecomeActiveNotification以外にもいろいろあるみたいです。

参考
[[iPhoneプログラミング]UIApplicationのNotificationsの一覧](http://d.hatena.ne.jp/nakamura001/20111107/1320680842)
hanikamu.c

``` c:C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum e_move { ROW, COL };

int main( void )
{
	const char * table[7] = 
	{
		"WXYZ",
		"VJKLa",
		"UICDMb",
		"THBAENc",
		" kSGFOd",
		"  jRQPe",
		"   ihgf"
	};
	
	const char * input[] =
	{
		"135004",// "ACDABHS" );
		"1",// "AC" );
		"33333120", //"AENc!!b!M" );
		"0",// "AB" );
		"2", //"AD" );
		"3", //"AE" );
		"4", //"AF" );
		"5", //"AG" );
		"4532120", //"AFQPOEMD" );
		"051455", //"ABSHSj!" );
		"23334551", //"ADMb!cdeO" );
		"22033251", //"ADLKLa!ML" );
		"50511302122", //"AGSjkTHTU!VW" );
		"000051", //"ABHT!!!" );
		"1310105", //"ACDKJW!V" );
		"50002103140", //"AGSk!HU!IVIU" );
		"3112045", //"AEDKYXKC" );
		"02021245535", //"ABCIJW!JIHBS" );
		"014204", //"ABIBCIB" );
		"255230", //"ADAGAEA" );
		"443501", //"AFPefgQ" );
		"022321", //"ABCKLZ!" );
		"554452", //"AGRh!!Q" );
		"051024", //"ABSHTUH" );
		"524002", //"AGAFGSB" );
		"54002441132", //"AGQRjSRhRSGA" );
		"11010554312", //"ACJV!!UTkSHI" );
		"23405300554", //"ADMNEFOFGRi!" );
		"555353201", //"AGRih!gPQG" );
		"22424105", //"ADLMabaLD" );
		"11340202125", //"ACJKDCKJX!!J" );
		"4524451", //"AFQFPf!P" );
		"44434234050", //"AFPf!!e!!Pgh" );
		"00554040132", //"ABHk!j!i!jRG" );
		"3440403", //"AEOePfgf" );
		"111130", //"ACJW!XW" );
		"21133343125", //"ADKXYZ!a!Z!L" );
		"353511", //"AEFOPFA" );
		"22204115220", //"ADLZYLY!KY!X" );
		"03013541", //"ABABICBGB" );
		"101344", //"ACIVJCA" );
		"2432541", //"ADENbNdN" );
		"45332242015", //"AFQPedc!!NME" );
		"215453", //"ADKCAGF" );
		"45540523454", //"AFQh!i!RQg!!" );
		"42434302545" //"AFEOd!!ONOef" );
	};
	const int move_table[][2] = { {-1,0}, {-1,-1}, {0,-1}, {1,0}, {1,1}, {0,1} };
	const int start[2] = {3,3};
	int pos[2] = {0};
	int i = 0;
	int j = 1;
	
	for(j = 0; j < sizeof(input)/sizeof(*input); j++)
	{
		memcpy(pos, start, sizeof(pos));
		printf("%c", table[ pos[COL] ][ pos[ROW] ] );
		for(i = 0; i < strlen(input[j]); i++ )
		{
			pos[COL] += move_table[ input[j][i]-'0' ][COL];
			pos[ROW] += move_table[ input[j][i]-'0' ][ROW];
			if( pos[COL] < 0 || pos[ROW] < 0 || pos[COL] >= 7 || pos[ROW] >= strlen(table[ pos[COL] ]) || table[ pos[COL] ][ pos[ROW] ] == ' ' )
			{
				printf("!"); 
				pos[COL] -= move_table[ input[j][i]-'0' ][COL];
				pos[ROW] -= move_table[ input[j][i]-'0' ][ROW];
				continue;
			}
			printf("%c", table[ pos[COL] ][ pos[ROW] ] );
		}
		printf("\n");
	}
	
	return 0;
}
```
第10回オフラインリアルタイムどう書くの問題をRubyで解く

問題はこちらのリンクから。
http://qiita.com/items/55641767510c2f9f235f

```ruby
BOARD = <<-EOD
!!!!!!!!!
!!!!!!!!!
!!!!T!!!!
!!!k!U!!!
!!j!H!V!!
!i!S!I!W!
!!R!B!J!!
!h!G!C!X!
!!Q!A!K!!
!g!F!D!Y!
!!P!E!L!!
!f!O!M!Z!
!!e!N!a!!
!!!d!b!!!
!!!!c!!!!
!!!!!!!!!
!!!!!!!!!
EOD

def make_map
  board = BOARD.split("\n").map{|_|_.split('')}
  map = {}
  board.each_with_index{|line, y|
    line.each_with_index{|val, x|
      if val =~/[A-Za-z]/
        map[val] = []
        map[val] << board[y-2][x]
        map[val] << board[y-1][x+1]
        map[val] << board[y+1][x+1]
        map[val] << board[y+2][x]
        map[val] << board[y+1][x-1]
        map[val] << board[y-1][x-1]
      end
    }
  }
  map
end

def solve(q)
  map = make_map
  moves = q.split('').map(&:to_i)
  moves.inject('A'){|ans,move|
    last_char = ans.split('').reverse.find{|_|_!='!'}
    ans += map[last_char][move]
  }
end

DATA.readlines.each do |line|
  no,q,a = line.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a ? ' o' : ' x'
end

__END__
0	135004	ACDABHS
1	1	AC
2	33333120	AENc!!b!M
3	0	AB
```
ANEを作るシェルスクリプトのメモ


```generate.sh
#!/bin/bash

ANE_NAME=<ANEの名前>
BUILD_DIR=<作ったANEを吐き出すディレクトリ>
IOS_BUILD_DIR=<iOS用の.aファイルを置いてあるディレクトリ>
JAR_BUILD_DIR=<Android用の.jarファイルを置いてあるディレクトリ>
DEFAULT_BUILD_DIR=<PC用のlibrary.swfが置いてあるディレクトリ>
USING_DIR=<作ったANEを使う時に置くディレクトリ>

NATIVEEXTENSION_SWC=swc/bin/"$ANE_NAME".swc
IOS_LIB_FILE="$IOS_BUILD_DIR"/lib"$ANE_NAME".a
IOS_PLATFORM="$IOS_BUILD_DIR"/platformoptions.xml
JAR_LIB_FILE="$JAR_BUILD_DIR"/"$ANE_NAME".jar

echo "$IOS_LIB_FILE"
echo "$JAR_LIB_FILE"

mkdir -p -v "$BUILD_DIR"/default
mkdir -p -v "$BUILD_DIR"/ios
mkdir -p -v "$BUILD_DIR"/android

mkdir -p -v "$BUILD_DIR"/swcContents
/usr/bin/unzip -o "$NATIVEEXTENSION_SWC" -d "$BUILD_DIR"/swcContents
cp -f "$BUILD_DIR"/swcContents/library.swf "$BUILD_DIR"
rm -rf "$BUILD_DIR"/swcContents

mkdir -p -v "$DEFAULT_BUILD_DIR"/swcContents
/usr/bin/unzip -o "$NATIVEEXTENSION_SWC" -d "$DEFAULT_BUILD_DIR"/swcContents
cp -f "$DEFAULT_BUILD_DIR"/swcContents/library.swf "$BUILD_DIR"/default
rm -rf "$DEFAULT_BUILD_DIR"/swcContents

cp -f "$BUILD_DIR"/library.swf "$BUILD_DIR"/ios
cp -f "$BUILD_DIR"/library.swf "$BUILD_DIR"/android
cp -f "$IOS_LIB_FILE" "$BUILD_DIR"/ios
cp -f "$IOS_PLATFORM" "$BUILD_DIR"/ios
cp -f "$JAR_LIB_FILE" "$BUILD_DIR"/android

adt -package -target ane "$BUILD_DIR"/"$ANE_NAME".ane extension.xml\
    -swc "$NATIVEEXTENSION_SWC"\
    -platform default -C "$BUILD_DIR"/default .\
    -platform iPhone-ARM\
      -platformoptions "$BUILD_DIR"/ios/platformoptions.xml -C "$BUILD_DIR"/ios .\
    -platform Android-ARM\
      -C "$BUILD_DIR"/android .


cp -f "$BUILD_DIR"/"$ANE_NAME".ane "$USING_DIR"
```
第10回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/38678 )を行いました。

問題は「ハニカム歩き」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord10haniwa/
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
Emacsのスクロールが滑らかになって気持ちいい！


以下のコマンドで滑らかにスクロールしてくれます。

| Key       | Direction           |
| :-------: | :------------------ |
| `C-v`     | 下へ                |
| `M-v`     | 上へ                |
| `C-M-v`   | 別のバッファを下へ  |
| `C-M-V`   | 別のバッファを上へ  |

一応、左右にもスムーズに移動できるようです。

入手はElpaか[github k-talo / smooth-scroll.el](https://github.com/k-talo/smooth-scroll.el) から

    ;;; smooth-scroll
    (require 'smooth-scroll)
    (smooth-scroll-mode t)
分散を1回のループで求めるメモ


分散を1回のループで求めるメモ

```分散.as
for each(x in nums)
{
	s1 += x;
	s2 += x * x;
}
avg = s1 / n;
v = s2 / n - avg * avg;
return v;
```

```標準偏差.as
return Math.sqrt(v);
```

```偏差値.as
return (10 * (nums[i] - avg)) / Math.sqrt(v) + 50;
```
ブランチ間違ったままでリモートリポジトリにpushしちゃった時

correct_branchに 間違ったコミットその1, 間違ったコミットその2 の変更を適用したつもりが、wrong_branch にコミットした上にpushまでやっちゃったときにやったこと

```
git checkout wrong_branch
git log -3
commit 12345
Author: xxx
Date:   xxx

    間違ったコミットその2

commit 67890
Author: xxx
Date:   xxx

    間違ったコミットその1

commit abcde
Author: xxx
Date:   xxx

    ここまで戻したいコミット

git checkout correct_branch
git cherry-pick 67890
git cherry-pick 12345
git push
git checkout wrong_branch
git revert 12345
git revert 67890
git push
```
ファイル名と行番号付きで結果出力

備忘。-Rと-nをつける。参考: http://takuya-1st.hatenablog.jp/entry/20100316/1268739433
`grep -R -n "HOGEHOGE"  *.php`
`find . -iname "*.php" -exec grep -R -n "HOGEHOGE" {} \;`
Dispatchでタイマーな処理

　Dispatch とは Apple の開発したグローバルなベストプラクティスを実践していただくグローバルなオポチュニティのことで、かつては Grand Central Dispatch (GCD) とも呼ばれていました。主にマルチスレッドな処理のために使われていますが、タイマーな処理にも使うことができます。

5秒後に処理を実行。

```objectivec:Objective-C
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    NSLog(@"%@", [NSDate date]);
});
```

```swift:Swift
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
    print(Date())
}
```

5秒ごとに処理を実行。

```objectivec:Objective-C
const dispatch_source_t timer
    = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());

dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, 0), 5.0 * NSEC_PER_SEC, 0);

dispatch_source_set_event_handler(timer, ^{
    NSLog(@"%@", [NSDate date]);
});

// 開始
dispatch_resume(timer);

// 一時停止
dispatch_suspend(timer);

dispatch_source_cancel(timer);
```

```swift:Swift
let timer = DispatchSource.makeTimerSource(flags: [], queue: .main)

timer.schedule(deadline: .now(), repeating: 5.0)

timer.setEventHandler {
    print(Date())
}

// 開始
timer.resume()

// 一時停止
timer.suspend()

timer.cancel()
```

- [Dispatch - Apple Developer Documentation](https://developer.apple.com/documentation/dispatch?language=objc) (Objective-C)
- [Dispatch - Apple Developer Documentation](https://developer.apple.com/documentation/dispatch) (Swift)
第6回オフラインリアルタイムどう書くの参考問題をF#で (2)

データ構造に配列を使えばシンプルに済んだ。

```fsharp:intersect.fs
let makeL w h (s:string) =
  let isIn (x,y) (x0,y0) (x1,y1) =
    let between x x0 x1 = min x0 x1 <= x && x <= max x0 x1
    between x x0 x1 && between y y0 y1
  let ps = [ for p in s.Split([|'-'|]) ->
             [ for c in p.ToCharArray() ->
               (int c)-(int '0') ] ]
  let a = (ps.[0].[0], ps.[0].[1])
  let b = (ps.[1].[0], ps.[1].[1])
  let c = (ps.[2].[0], ps.[2].[1])
  Array.init h (fun y ->
    Array.init w (fun x ->
      isIn (x,y) a b || isIn (x,y) a c))

let intersect =
  let zipWith f xs ys =
    Array.zip xs ys |> Array.map (fun (x,y) -> f x y)
  zipWith (zipWith (&&))

let solve (s:string) =
  let l = s.Split([|','|]) |> Array.map (makeL 10 10)
  intersect l.[0] l.[1]
  |> (Seq.concat >> Seq.filter id >> Seq.length)

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "23-94-28,89-06-51" 11
  test "11-84-58,02-73-69" 40
  test "18-41-86,77-04-32" 26
  test "81-88-23,64-58-14" 0
  test "31-29-07,41-87-69" 0
  test "83-13-40,18-10-94" 1
  test "77-80-92,21-72-38" 2
  test "57-70-91,55-19-08" 3
  test "18-22-75,66-80-91" 4
  test "51-93-78,54-49-06" 5
  test "58-70-96,17-43-76" 6
  test "58-07-12,58-82-93" 7
  test "41-29-07,35-95-88" 8
  test "88-26-60,42-29-07" 9
  test "18-40-85,34-40-91" 10
  test "36-60-96,53-96-89" 11
  test "51-39-02,44-98-69" 12
  test "48-06-20,76-04-42" 13
  test "85-29-18,26-50-93" 14
  test "27-50-91,43-29-07" 15
  test "57-06-20,48-60-91" 16
  test "52-98-89,21-76-67" 17
  test "67-12-40,45-80-92" 18
  test "47-03-10,26-30-82" 19
  test "74-28-06,21-86-37" 20
  test "65-01-20,73-39-05" 21
  test "17-72-86,36-50-94" 22
  test "51-29-07,77-15-41" 23
  test "33-98-39,82-16-02" 24
  test "75-05-10,37-81-96" 25
  test "72-58-06,48-80-96" 26
  test "81-67-16,21-91-59" 27
  test "13-96-57,24-96-79" 28
  test "57-04-32,51-18-06" 29
  test "88-03-52,28-41-86" 30
  test "78-04-61,13-86-49" 31
  test "58-12-20,27-50-85" 32
  test "61-19-05,71-68-15" 33
  test "63-29-16,18-31-83" 34
  test "16-50-91,32-98-79" 35
  test "82-17-03,38-40-81" 36
  test "72-48-04,11-98-39" 37
  test "77-05-10,28-50-62" 38
  test "38-50-91,11-86-57" 39
  test "87-05-10,13-97-69" 40
  test "11-86-49,22-98-89" 44
  test "11-97-69,12-86-67" 46
  test "11-95-69,71-49-05" 47
  test "28-31-92,13-98-79" 48
  0
```
Mountain Lion環境への「Jenkins」のインストール手順


## はじめに

「Jenkins」とは、Javaで書かれたオープンソース継続的インテグレーションツールである。
「Jenkins」を使えば、ビルド・テスト・デプロイといった工程をある程度まで自動化することができる。

今回は、この「Jenkins」をMountain Lion上にインストールするための手順について記述する。

## 前提条件

対象の環境情報を以下に示す。

|ソフトウェア|バージョン|
|----|----|
|OS|OSX バージョン 10.8.3|
|Java|JRE 1.7.0_09|
|Homebrew|0.9.4|


## インストール手順

### 1. 「Terminal.app」を開き、以下のコマンドを実行する。

```
brew install jenkins
```

### 2. OS起動時にJenkinsを自動起動させる場合、以下のコマンドを実行する。(自動起動させたくない場合は不要)

```
ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
```

### 3. Jenkinsを手動で起動させる場合は、以下のコマンドを実行する。

```
java -jar /usr/local/opt/jenkins/libexec/jenkins.war
```

## 補足

Jenkinsのトップページにアクセスする場合は、 [http://localhost:8080](http://localhost:8080) にアクセスする。

## 参考資料

* JenkinsをMacで使う : [http://tech.hazi.jp/2012-08/13/](http://tech.hazi.jp/2012-08/13/)
IE8 を Array:indexOf に対応させる

JavaScript の indexOf 。
これ、IE8 では文字列のみに対応していて、配列の要素数を取得するメソッドは実装されていません。

[indexOf メソッド (Array) (JavaScript)](http://msdn.microsoft.com/ja-jp/library/ie/ff679977(v=vs.94).aspx)

このせいで IE8 で動かない Gem が出てきて困ったことになったので、CoffeeScript で解決しました。

```coffeescript:array_index_of.coffee
unless "indexOf" of Array::
  Array::indexOf = (find, i) ->
    i = 0  if i is `undefined`
    i += @length  if i < 0
    i = 0  if i < 0
    n = @length

    while i < n
      return i  if i of this and this[i] is find
      i++
    -1
```

展開されると以下のようなコードになります。

```javascript:array_index_of.js
(function() {

  if (!("indexOf" in Array.prototype)) {
    Array.prototype.indexOf = function(find, i) {
      var n;
      if (i === undefined) i = 0;
      if (i < 0) i += this.length;
      if (i < 0) i = 0;
      n = this.length;
      while (i < n) {
        if (i in this && this[i] === find) return i;
        i++;
      }
      return -1;
    };
  }

}).call(this);
```

こいつを assets/shared/ に放り込んでおき、application.js.erb で読み込みます。
位置は　Array:IndexOf を使用しているJSより前である必要があります。先頭でもいいくらいかな？

```erb:application.js.erb
//= require shared/array_index_of
//= require jquery
    :
```

ネタ元はこちら。
[Problem with Internet Explorer 8 ..](https://github.com/bcardarella/client_side_validations/issues/499)

Client Side Validations は読んでそのまま、入力フォームのヴァリデーションをユーザが submit ボタンを押す前にクライアントサイドで実行できる優れものですが、IE8 はすでにサポート対象外になっています。
とはいうものの優しいコミッタさんが IE8 でも動くようにしてくれる CoffeeScript 教えてくれたり、IE8 互換に修正してくれたり、なんとかしてくれているようですね。
UITableViewCellの背景色を変える

UITableViewCellの背景色を変える方法です。

参考
[UITableViewCell の背景色を変える](http://runlooprun.wordpress.com/2010/12/05/striped_table_view/)

backgroundColorプロパティで変更しても変わりません。
UITableViewで、tableView: willDisplayCell: forRowAtIndexPath: を実装して、
その中でcell.backgroundColorで色を変更すると変わります。

```objc
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.backgroundColor = UIColor colorWithHue:0.61 saturation:0.09 brightness:0.99 alpha:1.0];
}
```
use strict下で動的にClassをnewする

use strictしているときに、「クラス名」のインスタンスを作りたかったりする。

例えば、そのクラス名が設定ファイルなどに書かれていて、そのクラスをnewしたい場合。

```perl
use strict;
use utf8;

my $class = "Hoge::Fuga";
my $obj = new $class;
```

実は上記のperl -cは問題なく通る。

が、実行してみると「Hoge::Fuga」をuseしていないから

```
Can't locate object method "new" via package "CSV::Reader" (perhaps you forgot to load "Hoge::Fuga"?) at sample.pl line 4.
```

とか怒られる。

で、そのまま、

```perl
use $class;
```

とか書くと、

```
syntax error at sample.pl line xx, near "use $class"
```

と怒られる。

どうやって書くのか？

useごとevalの中に入れてしまえばよい。

```perl
use strict;
use utf8;

my $class = "Hoge::Fuga";

eval "use $class;";
if ($@) {
  die "Error!!! $@\n";
}
my $obj = new $class;
```

今度は怒られない。
ただ、本当に「Hoge/Fuga.pm」が無い時でも先に進んでしまうので、
$@をチェックしてevalが成功したことは確認しないといけない。
CGRectの内容を表示する / NSStringFrom*

```objc
NSLog( @"frame %@", NSStringFromCGRect(view.frame) );
```

こうすると、

```
frame {{0, 0}, {320, 480}}
```

こうなります。

##NSStringFrom*
* NSStringFromCGAffineTransform
* NSStringFromCGPoint
* NSStringFromCGRect
* NSStringFromCGSize
* NSStringFromClass
* NSStringFromProtocol
* NSStringFromRange
* NSStringFromSelector
* NSStringFromUIEdgeInsets
* NSStringFromUIOffset
インデントの設定をExモードで変更する

```vim
let s:coding_styles = {}
let s:coding_styles['DefaultTab'] = 'setl tabstop=4 shiftwidth=4 shiftwidth=4 softtabstop=4 noexpandtab'
let s:coding_styles['Default'] = 'setl tabstop=4 shiftwidth=4 shiftwidth=4 softtabstop=4 expandtab'
let s:coding_styles['ShortExpandStyle'] = 'setl tabstop=2 shiftwidth=2 shiftwidth=2 softtabstop=2 expandtab'
let s:coding_styles['ShortExpandStyleTab'] = 'setl tabstop=2 shiftwidth=2 shiftwidth=2 softtabstop=2 noexpandtab'

command!
      \ -bar -nargs=1 -complete=customlist,s:coding_style_complete
      \ CodingStyle
      \ execute get(s:coding_styles, <f-args>, '')

function! s:coding_style_complete(...) "{{{
  return keys(s:coding_styles)
endfunction "}}}
```

Exモードから`CodingStyle Default`みたいな形で呼び出してます。
JSON用Vimシンタックス設定

```vim
"for JSON syntax
au! BufRead,BufNewFile *.json set filetype=json 
augroup json_autocmd 
  autocmd! 
  autocmd FileType json setlocal autoindent 
  autocmd FileType json setlocal formatoptions=tcq2l 
  autocmd FileType json setlocal textwidth=78 shiftwidth=2 
  autocmd FileType json setlocal softtabstop=2 tabstop=8 
  autocmd FileType json setlocal expandtab 
  autocmd FileType json setlocal foldmethod=syntax 
augroup END
```
QiitaアカウントのTwitter連携を解除する方法

Qiitaのサイトから解除する方法は2013.05.10時点で存在しません。

# 手順

* Twiiter側からQiitaアプリを解除する。
* Qiitaユーザー名及びTwitterユーザー名を info@qiita.com までお送りください．

# 補足

[運営のTwiiterコメントへのリンク : 2013年2月19日 - 23:54](https://twitter.com/Qiita_jp/status/303880148648853504)
スマホ用 疑似ホバー 


```javascript
// スマホ用 疑似ホバー
$('a, input[type="button"], input[type="submit"], button').on('touchstart', function() {
    $(this).addClass('hover');
}).on('touchend', function() {
    $(this).removeClass('hover');
});
```


```css
a.hover, 
input[type="button"].hover, 
input[type="submit"].hover, 
button.hover {
    /* ホバー時のスタイル */
}
```
モバイルOS情報まとめ(2013/5/10版)

最近モバイルOSが跳梁跋扈していて、何を追っかければいいのかがよくわからなくなっているので、主だったものの特徴を比較してみました。

急ごしらえなのであまりうまくまとまっていませんが、間違いなどがあったら教えて下さい。
わからない、はっきりしていないところは「？」にしています。
もし知っていたらコメントいただければ幸いです。

※以下ABC順

| 　　　名称　　　 | マーケット | SDKリリース時期 | 開発言語 | HTML5スコア | 標準開発ツール | 開発者向けサイト | 日本語ドキュメント量 | その他 |
|:-----------|:------------|:------------|:------------|:------------|:------------|:------------|:------------|:------------|:------------|
| Android | [Google Play](https://play.google.com) | 2007/11/5より | Java | 297 | Eclipse | [Android Developers](http://developer.android.com/) | ◎ | 無料。<br/>GooglePlayへのアプリ公開には初回のみ$25必要 | 
| Firefox OS | [Firefox Marketplace](https://marketplace.firefox.com/) | 2011/7/25より | JavaScript<br />HTML<br />CSS | 399 | 特になし | [Firefox OS](https://developer.mozilla.org/ja/docs/Mozilla/Firefox_OS) | △ | 無料。<br/>下回りはandroidがベース。<br />[開発者向けの端末(KEON,PEAK)が一瞬で売り切れた。](http://smhn.info/201304-firefoxos-peak-and-keon)<br />[日本ではKDDIから販売される予定。](http://k-tai.impress.co.jp/docs/event/mwc2013/20130225_589198.html) |
| iOS | App Store | 2008/9より | Objective-C | 386 | Xcode | [iOS Dev Center](https://developer.apple.com/devcenter/ios/) | ○ | 毎年年間$99の開発者登録費用 |
| MOONPhase | なし？ | ？ | JavaScript？ | ？ | ？ | [enchantMOON](http://enchantmoon.com/) | × | 無料？<br/>UEIが販売するタブレットのenchantMOONのOS。<br />下回りはandroidがベース。<br />ペンによる手書き入力が特徴。<br />[事前オーダー分売り切れ中。](http://www.itmedia.co.jp/news/articles/1304/24/news099.html) |
| Open webOS | なし？ | 2012/4/27より | JavaScript<br />HTML<br />CSS | ？ | ？ | [Open webOS](https://www.openwebosproject.org/) | × | 無料？<br/>Enyoと呼ばれるJavaScript上のフレームワークがある |
| Sailfish OS | ？ | 2012/11より | Qt | ？ | Qt Creator | [SailfishOS.org](https://sailfishos.org/index.html) | × | 無料？<br/>MeeGoとMerのコアをベースにしている。<br />"Sailfish"とは日本語で「バショウカジキ」のこと。<br />[「ダークホース」なSailfish OSスマホが5月に受注開始！ ](http://wasureyasuino.blogspot.jp/2013/04/5.html) |
| Tizen | 提供予定あり | 2012/1/5より | JavaScript<br />HTML<br />CSS<br />C<br/>C++ | 492 | TizenIDE | [Tizen Developers](https://developer.tizen.org/) | × | Tizen Mobile:モバイル向けモデル<br />Tizen IVI:車載向けモデル<br />[日本ではTizen Mobile端末がドコモから販売される予定](http://matome.naver.jp/odai/2135694945656808601) |
| Ubuntu Touch | 提供予定あり | 2013/2/21より | Qt 5 | ？ | Qt Creator | [Go mobile](http://developer.ubuntu.com/get-started/gomobile/) | × | Ubuntuがベース<br />[Ubuntu for phones搭載のスマートフォンは10月に発売予定](http://androidlover.net/androidnews/ubuntu-for-phones-smartphone-shipping-october.html) |
| Windows Phone | [Windows Phone Store](http://www.windowsphone.com/ja-jp/store) | 2010/9より | C# | 320 | Visual Studio 201x | [Windows Phone Dev Center](http://developer.windowsphone.com/ja-jp) | △ | 年間9800円の開発者登録費用 | |

HTML5のスコアは[html5test.com](http://html5test.com/results/mobile.html)の5/10現在の数値の最も得点が高いものを参照しています。

モバイルOSはもっとたくさんあるのですが、すでに大きなシェアがあるもの、今後芽が出てきそうなものを主観で選びました。
もし「これが抜けてる！」っていうのがあれば教えて下さい。

時系列、継承関係がわかる素晴らしい資料がありましたので、もっとくわしく知りたい場合はこちらも確認すると良いと思います。
# [Mobile OS の歴史と概略](http://prezi.com/by-n5gbbtr1x/mobile-os/)