OmniAICreator/Qiita-1.07M huggingface dataset:
Rails4ことはじめ ( 基本のプロジェクト作成手順 )

# Railsプロジェクト作成手順

⭐︎Rails4用に更新しました。

上から順番に実行することで、下記の作業が完了します。
1.Ruby gemsのインストール
2.プロジェクトファイルの作成
3.データベースの作成

>ruby、rvm、bundler等のインストールは省略
>今回はmysql使うので、mysqlインストールされている前提

## Ruby gemsの設定

プロジェクト名のフォルダを作成する

```bash
mkdir myapp
cd myapp
```

Gemfileの作成

```bash
bundle init
```

Gemfileの編集

```bash
vim Gemfile
```

```ruby:Gemfile
source "https://rubygems.org"

gem "rails" #　コメント外す

```

Rails gemのインストール

```bash
bundle install --path vendor/bundle
# gemsetを使用している場合は　--path vendor/bundle　を省略してもいい

```

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

まずは、カレントフォルダを確認

```bash
 pwd
/Users/me/myapp
```

railsプロジェクトの作成

-J : javascriptファイルの作成スキップ
-T : Test::Unitファイルの作成スキップ
-d : データベースの指定
      今回はmysqlを使う。mongo使いたい人は-OオプションでActive Recordファイルのスキップ

> ※rails newコマンドのオプションについてはヘルプ参照
> bundle exec rails -h

```bash
 bundle exec rails new . -J -T -d mysql
 # Gemfileを上書きするか聞かれるので、"y"キーを押す
 Overwrite /Users/me/myapp/Gemfile? (enter "h" for help) [Ynaqdh] y
```

以下のようにプロジェクトファイルが作成される

```bash
 ls
Gemfile		README.rdoc	app		config.ru	doc		log		script		vendor
Gemfile.lock	Rakefile	config		db		lib		public		tmp
```


## DBの作成

データベース設定ファイルを編集
mysqlに接続する設定ファイルができているので、ユーザー名とパスワードの設定項目に書き込むだけでOK

```bash
 vim config/database.yml 
```

プロジェクトアプリのDBを作成

```bash
 bundle exec rake db:create
```

あとは好きなようにソースコードを書き始めればいい。
BlockからSelector(メソッド)を作る

そんなに使い所はなさそうだけど。

performSelector メソッドのように、SEL 型のオブジェクトを引数に指定しないといけない場合、メソッドは予め用意しておく必要がある。

```objc
[self performSelector:@selector(hoge)];
```

この場合は hoge メソッドを先に定義しておかないといけない。
実はこれがけっこう面倒だと感じることが多いので、

```objc
[self performBlock:^{ 処理; }];
```

と書けるようにメソッドを用意してしまえばいいのだけど、(いつも用意するんだけど)
そもそも、@selector(hoge) の部分をその場で作れないのか？
と疑問に思ったのが始まりで、以下が試した結果。

```objc
// とりあえずなんか適当なブロックを作る
void (^hogeBlock)(void) = ^(void)
{
    NSLog(@"hoge");
};

// 文字列から SEL 型を作っておく
SEL sel = NSSelectorFromString(@"hoge");

// ブロックから IMP 型を作っておく
IMP imp = imp_implementationWithBlock(hogeBlock);

// class_addMethod でセレクタとメソッドを登録する
// 下の場合は、ViewController クラスに hoge というセレクタ名で、
// 処理の内容は上で作った hogeBlock で登録する
class_addMethod([ViewController class], sel, imp, "v@");
```

ここまでの処理でメソッドが定義された状態になるので、

```objc
[self hoge]; // hoge
[self performSelector:@selector(hoge)]; // hoge
```

で hogeBlock が実行できるようになる。
hogeBlock では１つも引数を書かなかったが、実は暗黙で自身のオブジェクトを
第一引数で渡しているらしいので、

```objc
void (^piyoBlock)(id obj) = ^(id obj)
{
    NSLog(@"piyo");
};
        
SEL sel = NSSelectorFromString(@"piyo");
IMP imp = imp_implementationWithBlock(piyoBlock);
class_addMethod([ViewController class], sel, imp, "v@");
```

上のように Block に引数を書いていても SEL 型を作るところで【コロン】なくてＯＫ。

```objc
[self piyo]; // piyo
[self performSelector:@selector(piyo)]; // piyo
```

引数がある場合は、SEL 型を作るところで【コロン】を追加し、
Block で第２引数から１つ目の引数を書けばよい。
よって、１つだけ引数を受け取る fuga メソッドを作る場合は、

```objc
void (^fugaBlock)(id, NSString *) = ^(id selfInstance, NSString *str)
{
    NSLog(@"fuga : %@", str);
};
        
SEL sel = NSSelectorFromString(@"fuga:");
IMP imp = imp_implementationWithBlock(fugaBlock);
class_addMethod([ViewController class], sel, imp, "v@:*");
```

のように、Block のところで第２引数に１つ目の引数を書き、
SEL 型を作るところで【コロン】を付ける。
呼び出しはこんな感じ。

```objc
[self fuga:@"あいうえお"]; // fuga : あいうえお
[self performSelector:@selector(fuga:) withObject:@"あいうえお"]; // fuga : あいうえお
```


複数引数の場合は、SEL型を作るところで、複数のコロンで引数の部分を区切ればよい。

```objc
void (^hogehogeBlock)(id, NSString *, NSString *) = ^(id selfInstance, NSString *str1, NSString *str2)
{
    NSLog(@"hogehoge : str1 = %@, str2 = %@", str1, str2);
};
        
SEL sel = NSSelectorFromString(@"hogehogeWithStr1:andStr2:");
IMP imp = imp_implementationWithBlock(hogehogeBlock);
class_addMethod([ViewController class], sel, imp, "v@:**");
```

```objc
[self hogehogeWithStr1:@"あいうえお" andStr2:@"かきくけこ"]; // hogehoge : str1 = あいうえお, str2 = かきくけこ
```

と、まぁ、こんな感じでその場でメソッド作れますよ、という話でした。

class_addMethod 関数の第４引数の値についてはよくわからなくて、
NULL でも空文字でも何を指定してもうまく動いてしまった。。。
詳しくはこの辺りに書いてあるんだけど、正解がイマイチわからない・・・。

```objc
Objective-C Runtime Reference
```

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

```
Type Encodings
```

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html#//apple_ref/doc/uid/TP40008048-CH100
iPhoneアプリからSMSを送信する

# 準備
MessageUI.framework を追加する。

# ヘッダ

```objc
#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMessageComposeViewController.h>
```

上記を import して、`<MFMessageComposeViewControllerDelegate>`を delegate する。

# 実装

```objc
- (void)displaySMSComposerSheet {
    // シミュレータでは SMS が起動しないので return する。
    if(![MFMessageComposeViewController canSendText]) {
        return;
    }
    MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];
    picker.messageComposeDelegate = self;
    picker.body = [NSString stringWithUTF8String:MAIL_BODY];
    picker.recipients = [NSArray arrayWithObjects:MAIL_TO, nil];
    [self presentModalViewController:picker animated:YES];
}
```

MAIL_BODY に本文を、MAIL_TO に宛先を入れておくと ModalView で SMS が立ち上がる。

```objc
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
    [self dismissModalViewControllerAnimated:YES];
}
```

送信完了後に ModalViewを閉じる必要があるので、上記も実装する。
result には送信キャンセル、送信完了など、SMS 送信ステータスが格納されている。
Net::Twitter::LiteのsearchをAPI1.1に対応させる

Twitter API1.1の対応を行っています。調べてみるとNet::Twitter::Liteでapiurlを1.1にすればOKみたな感じだったのですが、私が主に使っているのは検索APIで、本当にそれだけでいいのか？ってなり、モジュールを読んでみました。
すると、apiurlと別にsearchapiurlというのがあり、ただ1.1にするだけじゃだめそうです (;´Д`)

	# in Net::Twitter::Lite.pm
	23         apiurl                => 'http://api.twitter.com/1',
	24         searchapiurl          => 'http://search.twitter.com',

Net::Twitter::LiteはNet::Twitterと比べて非常に読みやすい。一つのファイルに全て書かれていて、変数を検索しやすいです。んで、変更すべき箇所をみつけて下記のように変更しました。

	1892c1890
	<             path            => 'search/tweets',
	---
	>             path            => 'search',
	1898c1896
	<             authenticate    => 1,
	---
	>             authenticate    => 0,

軽くスクリプトを書いて

	my $nt = Net::Twitter::Lite->new(
    	consumer_key        => ‘HI’,
    	consumer_secret     =>  ‘MI’
    	apiurl => 'https://api.twitter.com/1.1',
    	searchapiurl => 'https://api.twitter.com/1.1',
    	legacy_lists_api => 0,
	);

	$nt->access_token(‘TSU’);
	$nt->access_token_secret(‘☆’);
	my $res = $nt->search({ q => "天気", rpp=> 100,  page => 10, lang => 'ja'});

newして動かしてみると, 下記のエラーで死にました^^;; 

	400: Bad Request


TwitterAPI1.1の仕様書を読んでみると

 * https://dev.twitter.com/docs/api/1.1/get/search/tweets

pageはなくなっているし、rppはcountになってます。なんで、

　my $res = $nt->search({ q => "天気", count => 100, lang => 'ja'});

こうしたら動きました :D

## まとめ

変更点は３行です。

	$ diff  Lite.pm Lite.pm.org                                                                        
	1890c1890
	<             path            => 'search/tweets',
	---
	>             path            => 'search',
	1892c1892
	<             params          => [ qw/q callback lang locale count max_id include_entities since_id until geocode show_user result_type/ ],
	---
	>             params          => [ qw/q callback lang locale rpp page since_id until 	geocode show_user result_type/ ],
	1896c1896
	<             authenticate    => 1,
	---
	>             authenticate    => 0,
Rubyでenumを使いたい時


C系言語でお馴染みのenumですが、Rubyにはenumがないので、moduleを使ってやっています。

## enum定数の定義

基本的には定数を複数持ったモジュールを定義するだけです。

```ruby:定数定義
module Status
  REQUEST = 1
  APPROVED = 2
  REJECTED = 3
end
```

## enumの名前を使いたい場合

enum定数に対応する名前がある場合は、値と名前のハッシュを用意しておきます。

```ruby:対応する名前
STATUS_NAME = {
  Status::REQUEST => 'リクエスト中',
  Status::APPROVED => '承認',
  Status::REJECTED => '拒否'
}
```

```ruby:名前を返すメソッド
def status_text
  STATUS_NAME[self.status]
end
```

## enumの値をまとめて配列で取得する

enumの値をまとめて配列で取得するためには、モジュールに以下のメソッドを追加します。

```ruby:全enum値の取得メソッド
module Status
  def self.all
    self.constants.map{|name| self.const_get(name) }
  end
end
```

これで簡単にenum値の一覧が取れるようになりました。

```ruby
statuses = Status.all
```
レイアウトファイルを使用せずに Activity に Fragment を配置する場合の注意


	final String fragmentClassName = HogeFragment.class.getName();
	FragmentManager fm = getSupportFragmentManager(); // or getFragmentManager()
	FragmentTransaction ft = fm.beginTransaction();
	Fragment f = Fragment.instantiate(this, fragmentClassName, args);
	ft.replace(android.R.id.content, f, fragmentClassName);
	ft.commit();

このコードでは、デバイスの向きが回転すると `Fragement#onActivityCreated()` が複数回呼び出され、二回目以降は `savedInstanceState` が `null` になることがある。

これを回避するために `FragmentManager#findFragmentByTag()` で既に生成済みかどうかチェックし、生成済みであればインスタンスの生成は行わずに `FragmentTransaction#attach()` でアタッチを行うだけにする。

	final String fragmentClassName = HogeFragment.class.getName();
	FragmentManager fm = getSupportFragmentManager(); // or getFragmentManager()
	Fragment f = fm.findFragmentByTag(fragmentClassName);
	FragmentTransaction ft = fm.beginTransaction();
	if (null == f)
	{
		f = Fragment.instantiate(this, fragmentClassName, args);
		ft.replace(android.R.id.content, f, fragmentClassName);
	}
	else
	{
		ft.attach(f);
	}
	ft.commit();
第6回オフラインリアルタイムどう書くの解答。C++で。

問題はこちらです。 http://qiita.com/items/5e1c944541f09f0f9711

最初に問題を読んだ瞬間は、解き方の見当がつかなかったのですが、述語（is関数群）をひとつひとつ積み上げていったら解けてしまった、という感じです。

```cpp:answer.hpp
#ifndef DOUKAKU_ANSWER_HPP
#define DOUKAKU_ANSWER_HPP

#include <string>

std::string solve(const std::string& s);

#endif//DOUKAKU_ANSWER_HPP
```

```cpp:answer.cpp

#include "answer.hpp"

#include <sstream>

int mother(int x) { return (x + 1) / 3; }

bool isMe(int x, int y) { return x == y;                                 }
bool isMo(int x, int y) { return mother(x) == y;                         }
bool isDa(int x, int y) { return x == mother(y);                         }
bool isSi(int x, int y) { return (x != y) && (mother(x) == mother(y));   }
bool isAu(int x, int y) { return isSi(mother(x), y);                     }
bool isNi(int x, int y) { return isSi(x, mother(y));                     }
bool isCo(int x, int y) { return (x != y) && isSi(mother(x), mother(y)); }

std::string solve(const std::string& s)
{
    int x, y;
    char d1, d2;

    std::istringstream source(s);

    source >> x >> d1 >> d2 >> y;

    if((d1 != '-') || (d2 != '>') || ( ! source.eof()))
    {
        return "-";
    }

    if(isMe(x, y)) return "me";
    if(isMo(x, y)) return "mo";
    if(isDa(x, y)) return "da";
    if(isSi(x, y)) return "si";
    if(isAu(x, y)) return "au";
    if(isNi(x, y)) return "ni";
    if(isCo(x, y)) return "co";
    return "-";
}
```

```cpp:test.cpp

#include "answer.hpp"

#include <string>
#include <iostream>
#include <fstream>

struct Pattern
{
    Pattern(const std::string& s) : name(), input(), expected()
    {
        std::size_t d1 = s.find('\t');
        std::size_t d2 = s.find('\t', d1 + 1);
        if((d1 != std::string::npos) && (d2 != std::string::npos))
        {
            name     = s.substr(0, d1);
            input    = s.substr(d1 + 1, d2 - d1 - 1);
            expected = s.substr(d2 + 1);
        }
    }

    std::string name;
    std::string input;
    std::string expected;
};

int main(int, char* [])
{
    std::ifstream patterns("patterns.tsv");
    int           count_cases    = 0;
    int           count_failures = 0;
    std::string   s;
    while(std::getline(patterns, s).good())
    {
        ++count_cases;
        Pattern     pattern(s);
        std::string actual = solve(pattern.input);
        if(actual != pattern.expected)
        {
            ++count_failures;
            std::cout << "Failure in " << pattern.name << "\n"
                      << "expected: \"" << pattern.expected << "\"\n"
                      << "  actual: \"" << actual << "\"\n";
        }
    }
    std::cout << "¥nCases: " << count_cases << "  Failures: " << count_failures << "\n";

    return 0;
}

/*
% g++ answer.cpp test.cpp -o cpp_test; ./cpp_test
Failure in #2
expected: "13245"
  actual: "12345"

Cases: 3  Failures: 1
*/
```
active_support/core_ext の便利メソッド Object#in

小さいプログラムで，`-h` か `--help` を第1引数に取る時使い方を表示するという処理を加えたいとする．

```ruby
if ['-h', '--help'].include? ARGV[0]
  puts "USAGE: "
end
```

今まではこんな感じで書いていた．

これは `active_support/core_ext/object/inclusion` を使うともっとシンプルに書けて，

```ruby
require 'active_support/core_ext/object/inclusion'

if ARGV[0].in? '-h','--help'
  puts "USAGE: "
end
```

と書ける．
文字列の配列は % 記法を使ってもっとシンプルに書けるので，この場合だけだといまいち `in?` のありがたみが分からないかもしれないけれど，ある値がある配列の中に含まれるかどうかの判定はよく使うので，`include?` とはレシーバと引数が逆転した `in?` を知っておくとコードが読みやすくなることがあるかもしれない．
GnuPGやOpenSSLでディレクトリを暗号化

# はじめに

[__GnuPG__](https://gnupg.org) や __OpenSSL__ の __共通鍵暗号__ 方式で, アルゴリズムは __AES256__ を使う.

なお, `gpg`でアルゴリズムを指定するには, [`--cipher-algo`](https://www.gnupg.org/gph/en/manual/r1434.html)オプションを使うが, 
あらかじめ[設定ファイル](https://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration.html)に追記しておけば, オプションを省略できる.

```~/.gnupg/gpg.conf
cipher-algo aes256
```

# ディレクトリの暗号化・復号化

## GnuPG

```sh
tar cf - foo | gpg -c -o foo.tar.gpg # 暗号化
gpg -o- foo.tar.gpg | tar xvf - # 復号化
```

さらに, GnuPG付属の`gpg-zip`スクリプトを用いれば, 簡潔に書ける.

```sh
gpg-zip -o foo.tar.gpg -c foo # 暗号化
gpg-zip -d foo.tar.gpg # 復号化
```

https://www.gnupg.org/documentation/manuals/gnupg/gpg_002dzip.html

## OpenSSL

```sh
tar cf - foo | openssl aes-256-cbc -e -out foo.tar.enc # 暗号化
openssl aes-256-cbc -d -in foo.tar.enc | tar xvf - # 復号化
```


# 参考: 単一ファイルの暗号化・復号化

比較のため, それぞれ以下に載せる.

## GnuPG

```sh
gpg -c bar.txt # 暗号化
gpg bar.txt.gpg # 復号化
```

## OpenSSL

```sh
openssl aes-256-cbc -e -in bar.txt -out bar.txt.enc # 暗号化
openssl aes-256-cbc -d -in bar.txt.enc -out bar.txt # 復号化
```
Redmine on MOGOK


[Redmine](http://redmine.jp/)をRubyのPaaSの[MOGOK](http://mogok.jp)で使いました。
MOGOKの[アプリケーションカタログ](https://portal.mogok.jp/documents/application_catalog_guide/index.html)でもRedmineは
簡単にインストールできますが
今回は、CLI(コマンドライン)の手順を紹介します。

(アプリケーションカタログに[Joruri](http://joruri.org/)を発見！)

# Usage

5分程度の作業時間でRedmineをパブリックで利用することができます。

## Install

`heroku`コマンドと同様の`mogok`コマンドで操作します。

```bash
$ gem install bundler
$ gem install mogok
```

## Download & Configure

MOGOKで`rake generate_secret_token`でファイルが作成されませんので
`./config/initializers/secret_token.rb`をリポジトリに含めます。
(MOGOKには`database.yml`は不要ですが、ローカルでの確認で利用します。)

```bash
$ git clone https://github.com/redmine/redmine.git
$ cd redmine/
$ sed -i.bak 's/\/config\/initializers\/secret_token.rb/#\/config\/initializers\/secret_token.rb/g' .gitignore
$ cat << __EOS__ > ./config/database.yml
development:
  adapter: sqlite3
  database: db/development.sqlite3
__EOS__
$ rm .gitignore.bak
```


## Bundler

`http://localhost:3000/`にアクセスしてRedmineの動作を確認します。

```bash
$ bundle install --path=.bundle --without test production mysql postgresql rmagick
$ bundle exec rake generate_secret_token
$ bundle exec rake db:migrate
$ bundle exec rake redmine:load_default_data REDMINE_LANG=en
$ bundle exec rails server
```

## Deploy

`http://redmine250.ruby.iijgio.com/`にアクセスしてRedmineを使用します。
(httpsでもアクセスすることができます。)

```bash
$ mogok create redmine250
$ git add ./config/initializers/secret_token.rb
$ git commit -am "prepare for mogok"
$ git push mogok master
$ mogok build
$ mogok rake db:migrate
$ mogok rake redmine:load_default_data REDMINE_LANG=en
$ mogok start
```

# Tips

## デフォルト管理アカウント
* `username` - admin
* `password` - admin

**デフォルトの管理アカウントは変更しましょう！**
setVolumeが効かない

以下のコードで実装したらsetVolumeが効かない。

mPlayer.setVolume(0.0f,0.0f)をしても音楽が流れ続けた。

なんでだ.....

```java
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Handler;

public class BgmManager implements Runnable{
	
	protected Context mContext;
	protected MediaPlayer mPlayer;
        AudioManager audio;
	protected Handler fadeHandler;
	
	protected float mCurrentVolume = 1.0f;
	
	public BgmManager(Context context) {
		mContext = context;
		fadeHandler = new Handler();
	}
	
	public void setBgmResource(int resourceId){
		mPlayer = MediaPlayer.create(mContext, resourceId);
	}
	
	public void startBgm(){
		if(mPlayer == null) return;
		
		mPlayer.setLooping(true);
		mPlayer.setVolume(mCurrentVolume, mCurrentVolume);
		mPlayer.start();
	}
	
	public void stopBgm(){
		if (mPlayer != null) {
	      if (mPlayer.isPlaying()) {
	    	mPlayer.stop();
		  }
		  mPlayer.release();
		  mPlayer = null;
		}
	}
	
	public void fadeOutBgm(){
		//mPlayer.setVolume(0.0f, 0.0f);
		if(mPlayer.isPlaying()) fadeHandler.post(this);
	}

	@Override
	public void run() {
    	mCurrentVolume -= 0.1f; 
        if( 0 < mCurrentVolume ){
        	fadeHandler.post(this); 
        }else{
        	mCurrentVolume = 0.0f;
        	mPlayer.pause();
        }
    	mPlayer.setVolume(mCurrentVolume, mCurrentVolume); 
	}
}
```
Release ビルドで NSLog() を無効化するマクロ

Build Settings > Apple LLVM compiler - Preprocessing > Preprocessor Macros

> Debug: DEBUG=1
> Release: （DEBUG未定義）

と設定されているとして、

```objectivec:PROJECT_Prefix.pch

#ifdef DEBUG

//	……

#else

#	define NSLog(...)

#endif

```

Warning とかも出ず、一応良い感じに動いてくれている模様。

`__PRETTY_FUNCTION__` する専用マクロを作るのも便利だが、NSLog() も塞いでおけば安心。
git flow feature startで自動的に現在のブランチをベースにしてブランチを切るようにした


git flow feature startは以下のような引数を取ります。


``` sh
git flow feature start [-F] <name> [<base>]
```


* [Command Line Arguments · nvie/gitflow Wiki](https://github.com/nvie/gitflow/wiki/Command-Line-Arguments "Command Line Arguments · nvie/gitflow Wiki")


`[<base>]` はオプショナルな引数なので、通常では `devlop` ブランチをベースにfeatureブランチが来られるようになっています。

そのため、あるfeatureブランチAに から ブランチAをベースに新しいfeatureブランチBを切るには

``` sh
# 現在のブランチは branch_a
git flow feature start branch_b branch_a
```

というように書かかないとネストしたfeatureブランチは切ることができません。

いつも、現在のブランチを `[<base>]` にしてfeatureブランチを切っても問題ないと思うので、そういう動作をするシェルスクリプトを書きました。

![nest branch](http://monosnap.com/image/l0uxwqixJhA7G3CZNSgDdSMxd.png)

* [git_flow_feature_start_auto](https://gist.github.com/4511189 "git_flow_feature_start_auto")

もうちょっとマシに書けるようにしたい…

``` sh
#!/bin/bash

newBranchName=$1
echo $newBranchName
if [ $# -ne 1 ]; then
	echo "You can start a new feature branch:"
	echo " git flow feature start <name>"
  	exit 1
fi

currentBranchName=$(git rev-parse --abbrev-ref HEAD)
gitflowDevBranchName=$(git config gitflow.branch.develop)

if [ ${currentBranchName} = ${gitflowDevBranchName} ]; then
	git flow feature start ${newBranchName}
else
	git flow feature start ${newBranchName} ${currentBranchName}
fi

exit 0
```


動作は以下のような感じです。

[codestre.am: streaming your code to the masses](http://codestre.am/3963bc60df7bd6302afe3d5e0 "codestre.am: streaming your code to the masses")
Verilogのgenerate文でのマルチプレクサの記述


generate文を使ったcase文の代替です。入力bit幅が多い場合には使えるかもしれませんが、遅延は大きくなります。レジスタファイル記述などに使えそうです。

Modelsim altera 10.1bでのSimulationとQuartus12.1での合成、動作(7segに表示)を確認しました。

```v:gentest.v
`timescale 1 ns / 10 ps 

module gentest(/*AUTOARG*/
   // Outputs
   value,
   // Inputs
   idx
   );
   input [3:0] idx;
   output [7:0] value;   
   
   wire [7:0]	tmp[15:0];
   wire [7:0]	tmpx[15:0];
   
   genvar 	i,j;

   generate
      for(i=0;i<16;i=i+1)begin :rep_tmpx
	 assign tmpx[i]=(idx==i)?(i<<1):0;
      end
      for(j=0;j<16;j=j+1)begin :rep_tmp
      	 if(j==0)assign tmp[j]=tmpx[j];
      	 else assign tmp[j]=tmp[j-1]|tmpx[j];
      end
   endgenerate
   
   assign value=tmp[15];
  
endmodule // gentest

module test();
   reg   clock ;
   reg [3:0] idx;

   wire [7:0] value;
   
   initial forever begin
      clock   <= 1;   
      #2 
      clock   <= 0;
      #2      ;
   end
   
   gentest g1(/*AUTOINST*/
	      // Outputs
	      .value			(value[7:0]),
	      // Inputs
	      .idx			(idx[3:0]));
   
   integer i;
   initial begin
      $display("start.");
      for(i=0;i<16;i=i+1)begin
        idx=i;        
        $display("%d",value);
        @(posedge clock);
      end 
      $display("end.");
      $finish();
   end
   
endmodule

```
第6回オフラインリアルタイムどう書くの解答（Java）



```java:KinshipOnlyMother.java
import static org.junit.Assert.assertEquals;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;

/**
 * 問題: http://qiita.com/items/5e1c944541f09f0f9711
 * 鍋谷さんが解説してくださった模範解答のロジックをJavaで書きました。（自分の母の情報だけを持つVer.）
 */
public class KinshipOnlyMother {

	Map<Integer, Integer> mothers = new HashMap<>();

	public KinshipOnlyMother() {
		for (int i = 1; i < 41; i++) {
			mothers.put(i, (i + 1) / 3);
		}
	}

	protected String solve(String input) {
		int indexOf = input.indexOf('-');
		int in0 = Integer.parseInt(input.substring(0, indexOf));
		int in1 = Integer.parseInt(input.substring(indexOf + 2));

		if (in0 == in1) {
			return "me";
		} else if (mothers.get(in0) == in1) {
			return "mo";
		} else if (mothers.get(in1) == in0) {
			return "da";
		} else if (mothers.get(in0) == mothers.get(in1)) {
			return "si";
		} else if (mothers.get(mothers.get(in0)) == mothers.get(in1)) {
			return "au";
		} else if (mothers.get(mothers.get(in1)) == mothers.get(in0)) {
			return "ni";
		} else if (mothers.get(mothers.get(in0)) == mothers.get(mothers
				.get(in1))) {
			return "co";
		}
		return "-";
	}

	public static void main(String[] args) {
		KinshipOnlyMother kinship = new KinshipOnlyMother();
		kinship.solve("");
	}

	protected void test(String s0, String s1) {
		KinshipOnlyMother kinship = new KinshipOnlyMother();
		assertEquals(s1, kinship.solve(s0));
	}

	@Test
	public void testSolve() throws Exception {
		/* #0 */test("5->2", "mo");
		/* #1 */test("28->10", "au");
		/* #2 */test("1->1", "me");
		/* #3 */test("40->40", "me");
		/* #4 */test("27->27", "me");
		/* #5 */test("7->2", "mo");
		/* #6 */test("40->13", "mo");
		/* #7 */test("9->3", "mo");
		/* #8 */test("4->1", "mo");
		/* #9 */test("1->3", "da");
		/* #10 */test("12->35", "da");
		/* #11 */test("3->8", "da");
		/* #12 */test("6->19", "da");
		/* #13 */test("38->40", "si");
		/* #14 */test("9->8", "si");
		/* #15 */test("4->2", "si");
		/* #16 */test("15->16", "si");
		/* #17 */test("40->12", "au");
		/* #18 */test("10->4", "au");
		/* #19 */test("21->5", "au");
		/* #20 */test("8->2", "au");
		/* #21 */test("3->5", "ni");
		/* #22 */test("11->39", "ni");
		/* #23 */test("2->13", "ni");
		/* #24 */test("13->32", "ni");
		/* #25 */test("14->22", "co");
		/* #26 */test("40->34", "co");
		/* #27 */test("5->8", "co");
		/* #28 */test("12->10", "co");
		/* #29 */test("1->27", "-");
		/* #30 */test("8->1", "-");
		/* #31 */test("12->22", "-");
		/* #32 */test("2->40", "-");
		/* #33 */test("32->31", "-");
		/* #34 */test("13->14", "-");
	}
}
```
GPUImageのGPUImageCropFilterでハマった


GPUImageでカメラからinputを正方形にしたくて

````objectivec:
double photoSize = 640;
GPUImageCropFilter *cropFilter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0, 0.125f, 1.0f, 0.75f)];

[firstFilter forceProcessingAtSize:CGSizeMake(photoSize, photoSize)];
````

と書いてたら、どうやら、`forceProcessingAtSize:` が動いてないようだ。

これが動かないと、取得する画像サイズがでかすぎて、`capturePhotoAsImageProcessedUpToFilter:`をするときに、メモリーが足りなさすぎて落ちてしまう。


結局、別のフィルターに`forceProcessingAtSize:`を書くことで解決。

今日一日中はまってた。。。ぐぬぬ。やっと治った。
Control.Monad.Trans.Resource


平たく言えばPerlでいうスコープガードを実現するためのモジュール。名前の通りリソースの解放を行わせるためのもので、`IO`モナドが前提となる。

以下は `withFile` とか使えばいい話だけど、一応練習のため。

```haskell:
% runhaskell
module Main (main) where
import Control.Monad.Trans.Resource
import Control.Monad.Trans
import System.IO

main :: IO ()
main = runResourceT $ do
  (_, handle) <- allocate (openFile "/tmp/hoge.txt" AppendMode)
                          (\h -> hClose h >> putStrLn "Closed")
  (liftIO . hPutStrLn handle) "Hello"
  (liftIO . putStrLn) "Done printing"
  return ()
```

```
Done printing
Closed
% cat /tmp/hoge.txt
Hello
```

原理としては、`ResourceT` が `Reader`モナドの構造をしてるのだけど環境が `IORef` になっててそこに解放用のコードを貯められる。`runResourceT` は本質的には `Control.Exception` の `bracket` のいい感じのラッパーで、後処理として環境へ貯めた解放用のコードを実行させる。リファレンスカウントを管理してるのは並列処理のためなのかな。
第6回オフラインリアルタイムどう書くjavascriptでの解答

```js
function me(from, to){
    return from === to;
}

function getMother(child){
    return Math.floor((parseInt(child, 10) + 1) / 3);
}

function mother(from, to){
    return getMother(from) == parseInt(to, 10);
}

function daughter(from, to){
    return getMother(to) === parseInt(from, 10);
}

function sister(from, to){
    return getMother(from) === getMother(to);
}

function solve(args){
    var a = args.split('->');
    return me(a[0], a[1]) ? 'me' : mother(a[0], a[1]) ? 'mo' : daughter(a[0], a[1]) ? 'da' : sister(a[0], a[1]) ? 'si' : sister(a[1], getMother(a[0])) ? 'au' : sister(a[0], getMother(a[1])) ? 'ni' : sister(getMother(a[0]), getMother(a[1])) && sister(getMother(a[1]), getMother(a[0])) ? 'co' : '-';
}

test('ord6', function(){
    /*#0*/
    deepEqual(solve('5->2'), 'mo');
    //以下略
});
```
RailsでViewなどからCoffeeScriptで設定した関数が呼べない場合

例えば、button_to_functionタグなどでCoffeeScriptでつくった関数を呼ぼうとしても
ReferenceError: *** is not defined とか言われる場合

```
<%= button_to_function "Add", "add()" %>
```

CoffeeScriptのコンパイラが(function(){  }).call(this)で括ってしまうため、外からaddが読めないようになっている

そういう場合はwindow直下で名付ける（？）ことで一番外側に定義できる

```
window.add = ->
  alert "add!"
```

ただし、名前の衝突は自分で解決すること

用語がうまく使えなくて伝わらないかも
くわしくはリンク先をみてください

[How can I use option “--bare” in Rails 3.1 for CoffeeScript?](http://stackoverflow.com/questions/6099342/how-can-i-use-option-bare-in-rails-3-1-for-coffeescript)
開発中にはめんどくさいので、subviewsのUIButtonのenableを一気に変えるメソッド



リリースするときには、一個ずつ書いたほうがいいと思いますよ。けど、開発中はめんどーなので、一気に変えちゃいましょう。

````objectivec:
- (void)setEnableAllBtn:(BOOL)enable{
    for (UIButton *btn in [self.view subviews]) {
        if ([btn isKindOfClass:[UIButton class]]) {
            [btn setEnabled:enable];
        }
    }
}
````
PHPでOpenCV


Githubで公開されている以下のライブラリを利用することでPHPでOpenCVが利用可能になる。

> [mgdm/OpenCV-forPHP]
> https://github.com/mgdm/OpenCV-for-PHP

## インストール方法

* ソースを取得

> git clone git://github.com/mgdm/OpenCV-for-PHP.git

* 必要なパッケージを入れる

> yum install php-devel opencv opencv-devel make gcc

* makeする

> phpize
> ./configure
> make install

* モジュールを読み込むようにする

*vim /etc/php.d/opencv.ini*

> [opencv]
> extension = "opencv.so"

## 使い方

OpenCV名前空間上にラップされたクラスが存在しているので、それを利用する。

*画像の読み込み*

```php
use OpenCV\Image as Image;

$image = Image::load( 'sample.jpg', Image::LOAD_IMAGE_COLOR );
```

ドキュメント類はほとんどないので自力で調べないといけない(´・ω・｀)
順列列挙(再帰版)

以前書いたのはSTLをコピーした反復版だったが、再帰版は以下。Perlはシンプル。

```permutation.pl
sub permutation {
    my ($first, @rest) = @_; 
    @rest or return [[@_]];
    
    my @result;
    for (@_) {
        push @rest, $first;
        $first = shift @rest;
        push @result , [$first, @$_]
            for @{permutation(@rest)};
    }   
    return [@result];
}

print @$_ , "\n"
    for @{permutation(1..4)};
```
```
2431
2413
2143
2134
2314
2341
3142
3124
3214
3241
3421
3412
4213
4231
4321
4312
4132
4123
1324
1342
1432
1423
1243
1234
CPPUnitの使い方


```Makefile
CXX=g++LIBS=-lcppunit
SOURCES=someTest.cc some.ccTARGETS=mainTestall :	g++ -o mainTest mainTest.cc $(SOURCES) $(LIBS)clean :	rm $(TARGET)
```

CPPUnitを使う上で必要なファイル
- mainTest.cc: メインのテストコードここはテンプレで良さそう
- someTest.cc: 自分のテストコードを書く場所
- some.cc: テスト対象となるコードやクラス

```mainTest.cc
#include <cppunit/TestResult.h>#include <cppunit/TestResultCollector.h>#include <cppunit/BriefTestProgressListener.h>#include <cppunit/TestRunner.h>#include <cppunit/extensions/TestFactoryRegistry.h>#include <cppunit/CompilerOutputter.h>using namespace CPPUNIT_NS;int main(int argc, char **argv) {	TestResult controller;	TestResultCollector result;	controller.addListener(&result);		BriefTestProgressListener progress;	controller.addListener(&progress);		TestRunner runner;	runner.addTest(TestFactoryRegistry::getRegistry().makeTest());	runner.run(controller);		CompilerOutputter outputter(&result, stdCOut());	outputter.write();		return result.wasSuccessful() ? 0 : 1;}
```
これはこのままで良さそう

```someTest.cc
#include "some.cc"#include <cppunit/extensions/HelperMacros.h>using namespace CPPUNIT_NS;class someTest : public TestFixture {	CPPUNIT_TEST_SUITE(someTest);	CPPUNIT_TEST(test1);
	CPPUNIT_TEST(test2);	CPPUNIT_TEST_SUITE_END();	void test1(){		CPPUNIT_ASSERT( some(true) == false );
	}

	void test2(){
		CPPUNIT_ASSERT( some(false) == true );
	}};CPPUNIT_TEST_SUITE_REGISTRATION(reverseTest);
```

someがbool値を入れ替えるかどうかのテスト
ソースファイルをインクルードしているけれど、他人に見せるようなものでないならこの方がコンパイルが楽。

```some.cc
bool some(bool tf){
	return !tf;
}
```
これで完了。
ActiveSupport::FileUpdateChecker

たまたま見つけたので使い方をメモ。

指定されたファイルが更新されたら、何かを実行するというのを
簡潔にかけるようになる。

```ruby:サンプルコード
# coding: utf-8
require 'active_support/file_update_checker'

path = File.absolute_path('./foo.txt')
checker = ActiveSupport::FileUpdateChecker.new([path]) do
  puts File.read(path)
end  

10.times do |i|
  puts 'check: ' . i.to_s
  checker.execute_if_updated # 更新されていたら、blockを実行する
  # checker.execute # こっちは更新されていなくても実行する
  sleep(2)
end
```

このスクリプトを動かしながら、
以下を実行すると、`puts File.read(path)`の結果が表示される。

```
echo "foo" >> foo.txt
```

中々使い道が難しい。

see: https://github.com/rails/rails/blob/80256abb39332dd49996b909d6f0413a15291a90/activesupport/lib/active_support/file_update_checker.rb#L22
冪集合

```powerset.pl
  4 my @a = (1,2,3);
  5 
  6 my @p = ([]);
  7 for my $a(@a) {
  8     @p = (@p, map {[@$_, $a]} @p);
  9 }   

```
これ以上簡単な書き方がわからなかった。
Haskellだと『すごいHaskell』にもある通りで

```powerset.hs
  1 import Control.Monad
  2 powerset :: [a]->[[a]]
  3 powerset xs = filterM (\x->[True,False]) xs

*Main> :l powerset.hs 
[1 of 1] Compiling Main             ( powerset.hs, interpreted )
Ok, modules loaded: Main.

*Main> powerset [1..3]
[[1,2,3],[1,2],[1,3],[1],[2,3],[2],[3],[]]
GPUImageで楽にフィルターをつなげて、GPUImageFilterGroupを作ってくれるメソッド作った


こんな感じ。これで、一本つなげるだけなら楽ちん。もっと良いコード書きたいけど。

````objectivec:
- (GPUImageFilterGroup *)createFilterGroup:(NSArray *)filters{
    GPUImageFilterGroup *filterGroup = [[GPUImageFilterGroup alloc] init];
    GPUImageFilter *beforeFilter = nil;
    for (GPUImageFilter *filter in filters) {
        [filterGroup addTarget:filter];
        if (!beforeFilter){ // beforeフィルターが設定されてない時は一番最初
            beforeFilter = filter;
            continue;
        }
        [beforeFilter addTarget:filter];
        beforeFilter = filter;
    }
    GPUImageFilter *firstFilter = [filters objectAtIndex:0];
    [filterGroup setInitialFilters:@[firstFilter]];
    GPUImageFilter *endFilter = [filters lastObject];
    [filterGroup setTerminalFilter:endFilter];
    return filterGroup;
}
````


使うときは

````objectivec:
    GPUImageFilter *filter1 = [[GPUImageFilter alloc] init];
    GPUImageFilter *filter1 = [[GPUImageFilter alloc] init];

    GPUImageFilterGroup filterGroup =  [self createFilterGroup:@[filter1,filter2]];

````

ほら楽ちん。


けど、多分もっと良いコードあるんだろうなぁ。あと、Blendとかいろいろなつなぎ方にも対応したい。できるだけ、Arrayで書けば勝手に繋がってくれるのが理想だもんな。
HTMLにシンプルなJavaScript編集・実行環境を埋め込むスニペット


```html:jsrunner.html
<div id="jsrunner">
<textarea id="src" rows="8" style="width:100%;" onkeydown="
    var evt = event;
    if(evt.keyCode === 9){
        evt.preventDefault();
        var elm = evt.target;
        var val = elm.value;
        var pos = elm.selectionStart;
        elm.value = val.substr(0, pos) + '\t' + val.substr(pos, val.length);
        elm.setSelectionRange(pos + 1, pos + 1);
    }
">
now = new Date();
for(var i = 0; i < 200000000; i++){}
p(new Date() - now + 'ms');

/*
var name = window.prompt("hi, what's your name?");
p("hello, " + name + ". nice to meet you!");

var old = window.prompt("and, how old are you?") > 20 ? "adult":"young";
p("you are " + old);

undefined_variable;
*/
</textarea>
<div style="margin:1em 0;">
<input type="submit" value="Run" onclick="
    document.getElementById('stdout').innerHTML = '';
    document.getElementById('stderr').innerHTML = '';
    try {
        var p = 'function p(s){'
              + ' document.getElementById(\'stdout\').innerHTML += s+\'<br>\''
              + '}'
              + '\n';
        new Function(p + document.getElementById('src').value)();
    }catch(e){
        document.getElementById('stderr').innerHTML = e;
    }
">
<input type="submit" value="Clear" onclick="
    document.getElementById('stdout').innerHTML = '';
    document.getElementById('stderr').innerHTML = '';
">
</div>
<div id="stdout" style="border:1px solid silver;background:#f5f5f5;padding:0.5em;"></div>
<div id="stderr" style="color:red;padding:0.5em;"></div>
</div>
```

###### 補足
テストコードはMac mini（mid 2011）のSafari6にて200000000回のループで計測。1000ms程度で実行完了。
Raspberry PiでNode.jsを動かす


### Raspberry Piとは
本家は[ココ](http://www.raspberrypi.org)を参照。[Wikipedia](http://ja.wikipedia.org/wiki/Raspberry_Pi)の方がわかりやすいかも。簡単に言えばARM11搭載の小型コンピュータで、主に教育向けとなっています。価格は$35で3000円ちょっとで買える手のひらPCと言った感じです。OSはDebianをカスタマイズしたものとなっています。今回はこのボードにNode.jsを載せてexpressのひな形を動かしてみました。

<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/t/tomo_watanabe/20130103/20130103021854.jpg" alt="f:id:tomo_watanabe:20130103021854j:plain" title="f:id:tomo_watanabe:20130103021854j:plain" class="hatena-fotolife" itemprop="image"></span></p>

### インストール
インストールは[ここ](http://www.mztn.org/rpi/rpi02.html)を参考にしました。2013/1/3現在最新のイメージは[2012-12-16-wheezy-raspbian.zip](http://www.raspberrypi.org/downloads)となっています。これをダウンロードして解凍し、ddコマンドなどでSDカードに書き込みます。初回起動時にキーボードとHDMI出力でモニタを接続し、SDカードの拡張とsshの有効化は忘れないで行なっておきます。起動完了してログインができるようになったら、sshでログインして進めて行きましょう。

### 環境構築手順
環境を構築する手順ですが、以下のように進めていきます

1. gitのインストール
2. nvm (Node Version Manager)のインストール
3. Node.jsのインストール(v0.8.16)
4. npm(Node Package Manager)のインストール
5. expressのインストール

**1. gitのインストール**

```
$ sudo apt-get install git-core
```

**2. nvmのインストール**

gitが使えるようになったので、nvmをインストールします。インストール後にsourceコマンドでnvmを有効にします。

```
$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
```

**3. Node.jsのインストール**

nvmが使えるようになったので、Node.jsをインストールします。今回はv0.8.16をインストールします。(v0.8.15はビルドでエラーが出ました)

```
$ nvm install v0.8.16
```

**ビルドにおよそ2時間以上掛かりますので、休憩するなりしましょう(^^;**

ビルドが終ったらちゃんとインストールできたか確認しておきましょう。下記のようにv0.8.16が選択されていればOKです。

```
$ nvm ls
    v0.8.16
current:      v0.8.16
```

**4. npmのインストール**

```
$ sudo apt-get install npm
```

**5. expressのインストール**

アプリケーションフレームワークを-gオプションでグローバルインストールします

```
$ sudo npm install express -g
```

これで、環境構築は終わりです。

###expressサンプルアプリを動かす###
ではさっそくサンプルのひな形を動かします。今回は-eオプションでテンプレートエンジンにEJSを指定しています。

```
$ express -e sample

   create : sample
   create : sample/package.json
   create : sample/app.js
   create : sample/public
   create : sample/public/javascripts
   create : sample/public/images
   create : sample/public/stylesheets
   create : sample/public/stylesheets/style.css
   create : sample/routes
   create : sample/routes/index.js
   create : sample/routes/user.js
   create : sample/views
   create : sample/views/index.ejs

   install dependencies:
     $ cd sample && npm install

   run the app:
     $ node app

$ cd sample && npm install
```

さて、あとは実行するだけです。ifconfigで予めRaspberryPIのIPアドレスを調べておいて下さい。

```
$ node app.js
```

これで、ブラウザから"RaspberryPIのIP"の3000ポートでアクセスして、画面が表示されればOKです。

<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/t/tomo_watanabe/20130103/20130103020445.png" alt="f:id:tomo_watanabe:20130103020445p:plain" title="f:id:tomo_watanabe:20130103020445p:plain" class="hatena-fotolife" itemprop="image"></span></p>

###まとめ###
いつものように扱うのが面倒な組込みボードかと思いきや、Raspberry Piは普通のPCでした。最初に使う時は、起動したときにマウスとキーボードを繋いでログイン後に$ startx でX Windowが普通に起動して「おおっ！」となりました。この性能の小型ボードが3000円程度で入手できるとは・・・凄い時代になったものです(^^; 学習用キットとしても優秀な出来だと思います。Node.jsを動かすのも特別なことはなく、以前Ubuntuにインストールした時とほぼ同じ手順でできました。
Three.jsでテクスチャを貼付ける方法１


多分いくつか方法あると思うので今のところ見つけたひとつめ。

meshに設定するmaterialの初期化の際に

```
var material = new THREE.MeshBasicMaterial( { 
	color: 0x00ff00, 
	wireframe: true , 
	map : THREE.ImageUtils.loadTexture('/images/image.png')} );
```

こんな感じでmapプロパティをくっつけてあげる。そうするとこの画像をなんだかうまい感じではっつけてくれた。

sample: http://lewuathe.com:3000
UIWebViewを使うときに気をつけていること


## ローディングを表示する
UIWebViewではページ表示するまでは、だいたい白い画面の状態で待たされます。
特に重いページを表示する場合、白い画面のまま固まったように見えてしまい、あまりよろしくないです。

ローディングを早くすることは（場合によりますが）難しいので、
心理的な対策としてアクティビティインジケータを入れるのが効果的です。
（UIWebViewにかぎらず、通信が発生するときは基本入れます）

```
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
```


↓らへんのライブラリを使うのも良いです。

### [MBProgressHUD](https://github.com/jdg/MBProgressHUD "MBProgressHUD")
Demoの使い方そのままだと、インジケータ表示中はUIが操作できなくなるので
その場合は`userInteractionEnabled = NO`にしておきます。

```
_hud.userInteractionEnabled = NO;
```

（もちろん、意図的にUIを操作させたくない場合はこの限りではないです）


### [SVProgressHUD](https://github.com/samvermette/SVProgressHUD "SVProgressHUD")
オブジェクトを生成する必要がなく、クラスメソッド一本で使えるため
MBProgressHUDより気軽に導入できます。


## キャッシュを消す
UIWebViewは、キャッシュが非常に強いようで
アプリを再起動するだけではキャッシュが消えないことがあります。

そのため、更新性の高いWebコンテンツを表示する場合は、
UIWebViewの読込み直前にキャッシュを消すことで防止できます。

```objc
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    //キャッシュを全て消去
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    
```


## mailto:// でメールアプリが起動しないことがある
UIWebViewで表示しているページでmailtoリンクを踏んだとき、
メールアプリが起動しないケースがたまに…

読込み前にmailtoを判定することで、メールアプリを開けます。

```objc
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if([[[request URL] scheme] isEqual:@"mailto"]){
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }
    
```
ICU のライブラリサイズを削減する方法２

前回の「[ICU のライブラリを削減する方法２](http://qiita.com/items/652281d6b28572fd434d)」の続編です。これも[公式](https://sites.google.com/site/icuprojectuserguide/packaging) にあるけど。

ICU は以下のマクロによって機能をビルド時に有効無効にすることが出来ます。

 - UCONFIG_ONLY_COLLATION
 - UCONFIG_NO_LEGACY_CONVERSION
 - UCONFIG_NO_BREAK_ITERATION
 - UCONFIG_NO_COLLATION
 - UCONFIG_NO_FORMATTING
 - UCONFIG_NO_TRANSLITERATION
 - UCONFIG_NO_REGULAR_EXPRESSIONS

例としてICU を文字コード変換のみとして使いたい場合は UCONFIG_NO_LEGACY_CONVERSION を除いてマクロを定義するか、もしくは uconfig.h を手で編集します。

ちなみに UCONFIG_NO_LEGACY_CONVERSION をつけて Unicode 関係以外の文字コーデックで UConverter 生成しようとすると UErrorCode に U_INVALID_TABLE_FORMAT が設定されて頭を悩ますことになります。

ICU のビルドは自分は以下のような bash スクリプトを自製して ICU をビルドしてます。ただ、実際は正規表現を使うので UCONFIG_NO_REGULAR_EXPRESSIONS を外してます。

```bash
#!/bin/bash
$FLAGS="-DUCONFIG_ONLY_COLLATION -DUCONFIG_NO_BREAK_ITERATION -DUCONFIG_NO_COLLATION -DUCONFIG_NO_FORMATTING -DUCONFIG_NO_TRANSLITERATION -DUCONFIG_NO_REGULAR_EXPRESSIONS"
CFLAGS=$FLAGS CXXFLAGS=$FLAGS ./configure
```

これによって libicui18n のライブラリサイズを 1MB 未満に抑えることが可能になります。これに libicuuc をあわせると動的ライブラリとして扱う場合だいたい 4MB で利用出来るようになります。

前回のと組み合わると「[ICU を Emscripten で使う方法 ](http://qiita.com/items/82d275c2f5f508cbd7f4)」で効果を発揮できると思います。
TechBuzz主催の勉強会に行ったという話


やぁ、えいやです。
先日、[我が家でGGJ2013を開催](http://atnd.org/events/36101)してくれた[三上さん](https://twitter.com/mi_kami)が[TechBuzz主催の勉強会](http://atnd.org/events/35237)で公演するというので行って来ました。

まず、[三上さんの発表](http://www.slideshare.net/mi_kami/asset-storeunity)
![発表資料](https://www.dropbox.com/s/oumvqb2p9zw1o20/Screen%20Shot%202013-01-31%20at%2020.45.17.png?dl=1)
ですが、、、間に合いませんでした。。。

何故か渋谷と新宿で迷子になってしまう怪奇現象に見舞われまして。。。

## 気を取り直して途中参加

### 週末プログラミングで作るカジュアルゲーム　～レーシング編～
レーシングゲームを作った経験から、そのTipsについて割と詳しい内容で教えて頂きました。

* キャラクター移動をループさせて長いマップを描画する方法
* ToonShaderに関するTipsやObjectの周りに強調線を表示するためのTips
等

### ノンプログラマでも？サウンドにこだわったゲーム開発

* サウンド重要という話
* Unityつかうノンプログラマとか増えるよ多分って話
等

また、あとでまとめますね。
WebMatrix（ASP.NET Web ページ） で URL を書き換える

ASP.NET の作法がそのまま利用できます。

たとえば、http://sample.com/ にある Web アプリケーションで

    http://sample.com/Pages.cshtml/Hoge
    http://sample.com/Pages/Hoge

を

    http://sample.com/Hoge

に飛ばしたい場合、Web.config へ以下のように記述します。

```xml:Web.confug
<?xml version="1.0"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Daruboard" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions>
                         <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                         <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="Pages.cshtml/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
```
RでIRLSによるロジスティック回帰モデル最尤推定

PRML4.3.3の通り、IRLS（反復再重み付け最小二乗法）によりロジスティック回帰モデルのパラメータwの最尤推定を行い、各xにおけるクラスの事後確率を求め、図4.4と同様に図示します。IRLSの過程でのwおよび▽E(w)の変化も図示します。また、勾配降下法で解いた場合についても図示します。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/zBcaWQ2InK/8.LogisticRegressionByIRLS.png)

```r
library(MASS)
frame()
set.seed(0)
par(mfcol=c(3, 4))
par(mar=c(3, 3, 1, 0.1))
par(mgp=c(2, 1, 0))
xrange <- c(-4, 8)
yrange <- c(-8, 4)
x1 <- seq(xrange[1], xrange[2], .1)
x2 <- seq(yrange[1], xrange[2], .1)
x <- mvrnorm(10, c(0,1), matrix(c(2, 1.9, 1.9, 2), 2))
d1 <- as.data.frame(cbind(x, 1, 1))
x <- mvrnorm(10, c(2,0), matrix(c(2, 1.9, 1.9, 2), 2))
d1 <- rbind(d1, as.data.frame(cbind(x, 2, 0)))
x <- mvrnorm(5, c(7,-7), matrix(c(.2, 0, 0, .2), 2))
d2 <- rbind(d1, as.data.frame(cbind(x, 2, 0)))
names(d1) <- c("x1","x2","class","t")
names(d2) <- c("x1","x2","class","t")
 
logistic <- function(x) {
        1 / (1 + exp(-x))
}
base <- function(x1, x2) {
        (cbind(1, x1, x2))   # w0をバイアス項とするためφ0=1
}
doplot <- function(d, irls) {
        eta <- 0.1
        w = c(0, 0, 0)
        weights <- w
        phi <- base(d$x1, d$x2)
        grads <- c()
        repeat {
                y <- t(logistic(t(w) %*% t(phi)))
                g <- t(phi) %*% (y - d$t)
                grads <- rbind(grads, t(g))
                if (sum(g^2) < 1.0e-5) break
                if (irls) {
                        rn <- as.vector(y * (1 - y))
                        r <- diag(rn)
                        hessian <- t(phi) %*% r %*% phi
                        #rinv <- diag(1 / rn)
                        #z <- phi %*% w - rinv %*% (y - d$t)
                        #w <- solve(hessian) %*% t(phi) %*% r %*% z
                        diff <- solve(hessian) %*% t(phi) %*% (y - d$t)
                        w <- w - diff
                } else {
                        diff <- 0.1 * g
                        w <- w - diff
                }
                weights = rbind(weights, t(w))
        }
        matplot(weights, type="l", ylab="w", main=ifelse(irls, "IRLS", paste("gradient descent", eta)))
        matplot(log(abs(grads)), type="l", ylab=expression(paste("log", group("|", paste(nabla, "E"), "|"))))
        estimate <- function(x1, x2){
                logistic(t(w) %*% t(base(x1, x2)))
        }
        y1 <- outer(x1, x2, estimate)
        contour(x1, x2, y1, xlim=xrange, ylim=yrange, levels=c(0.5))
        image(x1, x2, y1, xlim=xrange, ylim=yrange, zlim=c(0,1), col=terrain.colors(32), add=T)
        contour(x1, x2, y1, xlim=xrange, ylim=yrange, levels=c(0.5), add=T)
        par(new=T)
        plot(d$x1, d$x2, col=d$class, xlim=xrange, ylim=yrange)
}
 
doplot(d1, T)
doplot(d1, F)
doplot(d2, T)
doplot(d2, F)
```
とあるディレクトリの構成だけをコピーして、その構成の空フォルダを作るコマンド

```
user:~$ ls -R
foo/:
a/ b/

foo/a:
a.txt

foo/b:
b.txt

hoge/


# 以下コマンド
user:~$ find foo -type d | xargs -I dir mkdir hoge/dir 
```
コマンドで、fooというディレクトリをコピーして、hoge以下にfooごとディレクトリをコピーします。
コピー先のhoge以下のディレクトリには、fooの構成がそのまま入るが、a.txt等はコピーされません

```
user:~$ ls -R hoge
hoge/:
foo/

hoge/foo/:
a/ b/

hoge/foo/a:

hoge/foo/b:
```
MySQL で シーケンス 機能実現

普通は AUTO_INCREMENT を使いますが、不便なところがありあす：

* １つのテーブルには１つの AUTO_INCREMENT カラムしか設定できません。
* AUTO_INCREMENT カラムはテーブルに依存する。
* 新規データをインサートする時、AUTO_INCREMENT カラムには NULL で指定が必要。

MySQL でシーケンス機能を実現する方法は以下になります。

### シーケンス管理用テーブル作成

```sql:sequence
DROP TABLE IF EXISTS sequence;
CREATE TABLE sequence (
	name VARCHAR(50) NOT NULL,
	current_value INT NOT NULL,
	increment INT NOT NULL DEFAULT 1,
	PRIMARY KEY (name)
) ENGINE=InnoDB;
```

### 現在のシーケンス番号を取得する関数

```sql:currval
DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
	RETURNS INTEGER
	LANGUAGE SQL
	DETERMINISTIC
	CONTAINS SQL
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN
	DECLARE value INTEGER;
	SET value = 0;
	SELECT current_value INTO value
		FROM sequence
		WHERE name = seq_name;
	RETURN value;
END
$
DELIMITER ;
```

### 次のシーケンス番号を取得する関数

```sql:nextval
DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
	RETURNS INTEGER
	LANGUAGE SQL
	DETERMINISTIC
	CONTAINS SQL
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN
	UPDATE sequence
	SET current_value = current_value + increment
	WHERE name = seq_name;
	RETURN currval(seq_name);
END
$
DELIMITER ;
```

### 現在のシーケンス番号を更新する関数

```sql:setval
DROP FUNCTION IF EXISTS setval;
DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
	RETURNS INTEGER
	LANGUAGE SQL
	DETERMINISTIC
	CONTAINS SQL
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN
	UPDATE sequence
	SET current_value = value
	WHERE name = seq_name;
	RETURN currval(seq_name);
END
$
DELIMITER ;
```

### テスト

```sql:test
INSERT INTO sequence VALUES ('TestSeq', 0, 1);
SELECT setval('TestSeq', 10);
SELECT currval('TestSeq');
SELECT nextval('TestSeq');
```
WinJS.UI.ListViewの要素の幅が安定しない

1行のテキストを要素として使おうとした時、2バイト文字で特に。
短くされて改行されたりする問題。
CSSで指定していても無視されたり、画面遷移で戻ってくると表示が変わったり
不自然な挙動があると思う。1バイト文字の時は幅が極端に短くなること少ない。
(スペース使うと2行になることはあるけど)

CSSで悩まずにさくっと画面初期化時に幅指定でOK。

```js
 $('.itemtitle').css("width", 270);// jquery。270に好きな値。
```
JANコードのデジットをチェックする

### JANコードのチェックデジット

+ 短縮/標準のJANコードのチェックデジットを計算し、返します。

```check_digit.rb
def check_digit(code)
  code = [8,13].include?(code.to_s.size) ? code[0..2].to_s : code.to_s
  exit unless [7,12].include?(code.size)
  total_even = total_odd = 0
  code.split(//).each_with_index do |x,i|
    (i % 2) == 0 ? total_even += x.to_i : total_odd += x.to_i
  end
  10 - ((total_even * 3) + total_odd) % 10
end

jan = ARGV.shift
p check_digit(jan)
```
Rails3 + Devise + Resque


##参考サイト
[Resqueを利用したRailsでの非同期処理/バッチ処理
](http://www.oiax.jp/rails/zakkan/resque.html)
[Resqueをはじめる その3 (Resqueを動かす)](http://namakesugi.blog42.fc2.com/blog-entry-117.html)


## Rakefile
```ruby:Rakefile
require File.expand_path('../config/application', __FILE__)
require 'rake'
require 'resque/tasks'

MyApp::Application.load_tasks

# Fix resque error. 
# ref: https://gist.github.com/1316470
task "resque:setup" => :environment do
  ENV['QUEUE'] ||= '*'
  # for redistogo on heroku http://stackoverflow.com/questions/2611747/rails-resque-workers-fail-with-pgerror-server-closed-the-connection-unexpectedl
  Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection }
end
```

## route.rb

Deviseを使っている場合は、以下のように書くと、admin認証されたユーザだけにresqueのページを閲覧させることが出来ます。

```route.rb
require 'resque/server'

MyApp::Application.routes.draw do
... 
  #
  # Resque
  #
  authenticate do
    mount Resque::Server.new, :at => "/admin/resque"
  end
end
git の branch で作業中に master に commit すべき変更が発生させてしまったときどうするのがいいの？

本来は master に commit すべき変更をする前にこれまでの変更を `git stash` して `git checkout master` してから変更 -> commit -> ブランチに戻って `git rebase master`  -> `git stash pop` という感じかと思いますが、

git の branch で作業中に master に commit すべき変更をすでに発生させてしまったら、

0. マスターにコミットすべき変更を git gui なので add
0. git stash -k でそれ以外の変更を stash
0. git stash で add したものを stash
0. git checkout master
0. git stash pop

という感じですかね？まだ試してませんが。

単純に全部 stash して master で pop してから選択的に commit しようとしたら、 stash pop の時点で conflict たくさん出て大変だっので、次回試してみます。

オレはこうしているというのがあったら教えて下さい。
nanocでサイトをAmazon S3にデプロイするための設定


nanocで生成したwebサイトははAmazon S3にもデプロイできる。

## 設定

config.yaml に以下の設定を追加。

```
deploy:
  s3:
    kind: fog
    provider:              aws
    bucket:                www.example.com
    aws_access_key_id:     アクセスキーID
    aws_secret_access_key: シークレットアクセスキーID
    region:                ap-northeast-1
```

- bucketで指定するバケット名はwebサイトのバーチャルホスト名と揃える。バケットが存在しなければ新たに作成される。
- regionは、東京の場合は ap-northeast-1


## デプロイ

以下を実行する。ファイルが多いと時間がかかる。

```
nanoc deploy -t s3
```
単一ページナビゲーションで画面遷移前に確認ダイアログなどを挟みたい時

通常のHTMLだとonbeforeunloadイベントで行う実装をHTML上で実装しても呼ばれません。

単一ページナビゲーションって縦横100%のインラインフレームのような感覚？
遷移はしているようにみえるけどアドレスバーはずっとdefault.htmlな感じです。

navigater.jsのnav.back();の部分(4か所)を書き換えます。
4つもあるのは画面を戻る方法が4つだから。
・BackSpace キーが押され、入力フィールドによってキャプチャされない場合
・Alt キーと文字キーまたは Alt キーと右方向キーの組み合わせ
・マウスの後ろボタンを使用
・戻るボタン

```js
backPage();
//nav.back();
```

そしてbackPageを実装。
特定の画面にいた時だけ別の処理に分岐。
あとはopenGoOut()で確認ダイアログだしたり。

```js
var nav = WinJS.Navigation;
function backPage() {
   debug("backPage:" + nav.location);
    var loc = nav.location;
    if (loc == "/pages/special/special.html") {
        openGoOut();
    } else {
        nav.back();
    }
}
```
iPhone、iPadアプリ等をApp Storeへのリンクするコードを生成

下記の画像を埋め込み、リンクするコードを生成できる。

![appleSmall](http://r.mzstatic.com/images/web/linkmaker/badge_appstore-sm.gif) 
![appleLarge](http://r.mzstatic.com/images/web/linkmaker/badge_appstore-lrg.gif)

> iTunes Link Maker
> http://itunes.apple.com/linkmaker


公式ではないが、こんなツールもある。

> スマートフォンアプリ紹介ツール
> http://spsns.net/news/app-tools.html

こちらはアプリ画像入りのリンクが生成できる。