OmniAICreator/Qiita-1.07M huggingface dataset:
NaN をなんとかしたい上での諸注意 と global.isFinite() の罠

きっかけは [JavaScript NaN type is crazy](http://coderwall.com/p/sekogw) にコメントした事ですが

## 1. `NaN === NaN` は false

```javascript
typeof NaN // 'number'
typeof Inifity // 'number'
typeof -Infinity // 'number'
toString.call(NaN); // '[object Number]'

Infinity == Infinity // true
Infinity == -Infinity // false
Infinity == NaN // false
NaN == NaN // false
NaN === NaN // false (!!)
```

みんな知ってるね

## 2. `global.isNaN("NaN")` は true, `global.isFinite("0")` も true

で、この`NaN` や `Infinity` が厄介である為に `isNaN()` と `isFinite()` がグローバルオブジェクトに用意されているのですが、これもまた罠があります

```javascript
isNaN(1);  // false
isNaN(NaN); // true 
isNaN("NaN"); // true (!?)
```

グローバルオブジェクトの `isNaN()` や `isFinite()` は引数が文字列でも数値型にパースできるもんだとみなして判定に入ります。これ、`isFinite()` の方が厄介で、ここで無限大ではない（ちゃんと数値演算できる）変数だと判定してそのまま演算してしまうドジを踏みうる。

```javascript
var test = function(x) {
  if (isFinite(x)) {
    return x + x;
  }
};

test('10'); // "1010"
```

## 3. ちゃんと使おう `Number.isNaN()`, `Number.isFinite()`

厳格な数値の `NaN` 判定、あるいは有限数判定にはグローバルメソッドではない `Number.isNaN()` や `Number.isFinite()` を使いましょう。

```javascript
isNaN(NaN); // true
isNaN('NaN'); // true
Number.isNaN(NaN); // true
Number.isNaN('NaN'); // false

isFinite(10); // true
isFinite('10'); // true
Number.isFinite(10); // true
Number.isFinite('10'); // false
```

`if (typeof x === 'number') { ... }` のようなバリデーションより手っ取り早く、かつ安心ですよ。

## 4. (追記)「それ IE とかじゃ Number.isNaN() とかないじゃないですかー」「それくらい Polyfill りなさいよ」

現状、IE 以外のブラウザは ECMAScript 6 の仕様にもかかわらず先行実装してくれているけど、 IE 9 以前のブラウザには用意されていません。でも、以下のようなコードで polyfill することはできます。

```javascript
Number.isFinite = Number.isFinite || function(any) {
  return typeof any === 'number' && isFinite(any);
};

Number.isNaN = Number.isNaN || function(any) {
  return typeof any === 'number' && isNaN(any);
};
```
「A Tour of Go」でGo言語を学ぶ(~#20)

今回はfor文です。
14回の定数はcharacter、string、boolean、数値にconstキーワードをつけるだけなので、省略する。
15回は多分ビット演算のことをやっていて、ようわからんので飛ばす。

```go:for.go
package main

import "fmt"

func main() {
	sum := 0
	for i := 0; i < 10; i++ {
		sum += i
	}
	fmt.Println(sum)
}
```

結果
* * *

```
45
```

感想
* * *
普通にfor文。ただし、括弧()がない。つけちゃいけないみたい。
あとは条件を1つだけにして、

```go:if2.go
package main

import "fmt"

func main() {
	sum := 1
	for ; sum < 1000; {
		sum += sum
	}
	fmt.Println(sum)
}
```

という風に書けることもCやJavaと変わらないらしい。上のコードはセミコロンを省略して、

```go
for sum < 1000{
}
```

とかけてしまうみたい。コレのおかげでwhile文はこの、セミコロンを省略した形で書くらしい。
無限ループは、まとめるとこのように書ける。

```go
for {
}
```
複数のパスの共通のプリフィクスを求める

```ruby
# -*- coding: utf-8 -*-
require 'pp'

# 簡単のため、フルパスのみを扱う。
paths = %w[
  /full/path/to/somewhere
  /full/path/to/anywhere
  /full/path/to/nowhere
  /full/path/to
]

# 単位に分割する。
parts_list = paths.map {|path| path.split('/')}
pp parts_list
# => [["", "full", "path", "to", "somewhere"],
#     ["", "full", "path", "to", "anywhere"],
#     ["", "full", "path", "to", "nowhere"],
#     ["", "full", "path", "to"]

# 要素数が最大の物を一つ選ぶ。このあとで使うArray#zipでは、結果配列の各要素の長さがレシーバーの長さに制限されるから。
# 何を言っているか分からないと思うのでるりまを見られたい。
base = parts_list.max_by(&:length)
parts_list.delete base
p base # => ["", "full", "path", "to", "somewhere"]
pp parts_list
# => [["", "full", "path", "to", "anywhere"],
#     ["", "full", "path", "to", "nowhere"],
#     ["", "full", "path", "to"]]

# zipメソッドで、各階層のタプルを作る。
zipped = base.zip(*parts_list)
pp zipped
# => [["", "", "", ""],
#     ["full", "full", "full", "full"],
#     ["path", "path", "path", "path"],
#     ["to", "to", "to", "to"],
#     ["somewhere", "anywhere", "nowhere", nil]]

# 順番に調べて、行って、タプルの全要素が等くない物が出てきたらやめる。
commons = zipped.take_while {|tuple| tuple.uniq.length == 1}
pp commons
# => [["", "", "", ""],
#     ["full", "full", "full", "full"],
#     ["path", "path", "path", "path"],
#     ["to", "to", "to", "to"]]

# 結果を元のパスの形に戻せば望みのパスが得られる。
common_prefix = commons.collect {|tuple| tuple.first}.join('/')
puts common_prefix
# => /full/path/to
```

なんか名前の付いた有名なアルゴリズムがありそうなんですけど、どうなんでしょう。
教えてください。
SharpDevelop でソースコードをコメントアウトするにはCTRL+/

SharpDevelop でソースコードのコメントをトグルするには`CTRL`+`/` です。

編集メニューには `CTRL`+`OemQuestion` と書かれていて、どのキーだろうと思っていましたが、なるほど確かに？が書かれているキーですね。
CoreData利用時のUITableViewの更新

どうやら内部でキャッシュしているようなので、自分の場合にはこんな感じでキャッシュを消してperformFetchする事で解消した。

```objc
-(BOOL)reload:(NSError**) error {
    [NSFetchedResultsController deleteCacheWithName:CACHE_NAME];
    return [self.fetchedResultsController performFetch:error];
}
```

参考
http://stackoverflow.com/questions/3399012/nsfetchedresultscontroller-refresh-refetch
インストール

### 初期設定
$ sudo vi /etc/hosts
xxx.xxx.xxx.xxx instructor.local
$ gem source -r http://rubygems.org/ -a http://instructor.local/gem/
$ cd /etc/yum.repos.d
$ sudo CentOS-Media.repo CentOS-Media.repo.bak
$ sudo mv CentOS-Base.repo CentOS-Base.repo.bak
$ vi CentOS-Seminar.repo
[seminar]
name=CentOS-$releasever - Seminar
baseurl=http://instructor.local/seminar/
enabled=1
gpgcheck=0

### アンインストール
$ sudo yum erase mysql mysql-devel mysql-server


### Ruby 1.8.7をソースコードからインストール
```
$ mkdir /home/rails/src
$ cd /home/rails/src
$ tar zxvf /usr/local/src/ruby-1.8.7-p358.tar.gz
$ cd ruby-1.8.7-p358
$ ./configure
$ make
$ sudo make install
```

### RubyGem 1.8.24をソースコードからインストール
```
$ cd /home/rails/src
$ tar zxvf /usr/local/src/rubygems-1.8.24.tgz
$ cd rubygems-1.8.24.tgz
$ sudo ruby setup.rb
```

### MySQL2ドライバをインストール
```
$ sudo gem install mysql2
```

### Thinをインストール
```
$ sudo gem install thin
```

### Thinの起動スクリプトをインストール
```
$ sudo thin install
$ sudo mv /etc/rc.d/thin /etc/init.d
$ sudo /sbin/chkconfig --level 345 thin on
```

### Thinの設定ファイルを作成
```
$ cd /home/rails/apps/blog/current
$ sudo thin config -C /etc/thin/blog.yml -c `pwd` -p 3000 -s 3 -e production -u rails -g rails
```

### config/deploy.rbの設定
```ruby
set :application, "blog"
set :repository, "http://運用サーバのIPアドレス/repos/rails/blog"
set :deploy_to, "/home/rails/apps/#{application}"
set :use_sudo, false
set :scm, :subversion

role :web, "運用サーバのIPアドレス"
role :app, "運用サーバのIPアドレス"
role :db, "運用サーバのIPアドレス", :primary => true

task :init, :roles => :app do
  sudo "gem install kaminari"
  sudo "gem install devise"
  sudo "gem install RedCloth"
  sudo "gem install thin"
end

task :db_create, :roles => :db do
  sudo "/etc/init.d/mysqld start"
  run "cp #{deploy_to}/current/config/database.yml.example #{deploy_to}/current/config/database.yml"
  run "rake -f #{deploy_to}/current/Rakefile db:create:all"
end
```

### rails3のproduction環境でpublicフォルダを公開
```
config.server_static_assets = true
```


### Thinサーバの起動
```
$ thin start
```

### Thinサーバの停止
```
$ thin stop
```

### Thinの設定ファイル作成
```
$ thin config -C config/thin.yml -p 3000 -e production -a 127.0.0.1
```
NSLog の出力先を変更する

NSLog は標準エラーに出力される。
C言語のfreopen関数を使うとstderrの出力先を変更することが出来るので、NSLog の出力も別の場所に変更（ファイル化）することができる。エラーを抑制するなりファイルに書き出すなり。

```objc
char *filePath = (char*)[@"/path/to/file.txt" UTF8String];
freopen(filePath, "a+", stderr);
```
Xcode4でVimのカラーテーマ wombat を使う


![](http://gyazo.com/fb41ce1ca57b77d3c2c2f015996f4314.png)

1. [// TODO: better name : wombat風Xcodeカラーテーマ - // TODO: better name](http://d.hatena.ne.jp/arche_t/20090202/1233588174) よりwombatのカラーテーマを取得し、`wombat.xccolortheme`として保存

2. これはXcode3用のカラーテーマファイルなので、[ppmweb : Xcode 3 のカラーテーマを Xcode 4 用に変換するアプリ | ppmweb](http://ppmweb.lolipop.jp/an-app-to-convert-xcode-3-color-theme-to-xcode-4-color-thme/) より`xccolortheme2dvt`を使い、`wombat.xccolortheme`をXcode4用のカラーテーマファイル`wombat.dvtcolortheme`に変換

3. {$HOME}/Library/Developer/Xcode/UserData/FontAndColorThemes/ に出力したファイル`wombat.dvtcolortheme`を移動

4. Xcodeの`Preferences`>`Font & Colors`>`Theme`より`wombat`を選ぶ

5. フォントは`Source Editor`にて一括選択後、フォントを変更することで、一括変換可能
ネスト化されたcellをアンネストする


`c={{1,2,3},{4,5,6,7}}`

といったようにネスト化されたcellを，

`d={1,2,3,4,5,6,7}`

とアンネストすることを考える．この場合，

```matlab
>> d=[c{:}]
d = 
    [1]    [2]    [3]    [4]    [5]    [6]    [7]
```

として簡単に書けることが知られている．ところが，

`c_vert={{1;2;3};{4;5;6;7}}`

と垂直方向にセルが並んでいる場合，

```matlab
>> d_vert=[c_vert{:}]
Error using horzcat
CAT arguments dimensions are not consistent.
```

とエラーを吐かれてしまいうまくいかない．これは，[]を使った結合では水平方向の結合（`horzcat`）がデフォルトで呼ばれてしまうためである．
このような場合，`vertcat`コマンドを使う．

```matlab
>> d_vert=vertcat(c_vert{:})
d_vert = 
    [1]
    [2]
    [3]
    [4]
    [5]
    [6]
    [7]
```
プログラミング用フォントRictyとSource Code Proの比較

Adobeがプログラミング用のフォントである「Source Code Pro」を公開しました。
[ダウンロード](http://sourceforge.net/projects/sourcecodepro.adobe/)

プログラミング用のフォントはRictyが有名で私も愛用しているのですが、この二つのフォントを比べてみました。

![](http://gyazo.com/0286cb4ebab6b2cc0426a48b4bd01a54.png)

この二つのフォントは似ています。

RictyはSource Code Proに比べて
* 字詰めされている
* 文字が領域の中で大きく表示される(よい表現が見つからない)
* 線が細い
CoreDataでエンティティを追加したりした場合のエラー

```
2012-09-25 14:18:19.958 myapp[75929:c07] CoreData: annotation: Disconnecting from sqlite database.
2012-09-25 14:18:19.965 myapp[75929:c07] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x84919f0 {metadata={
    NSPersistenceFrameworkVersion = 419;
    NSStoreModelVersionHashes =     {
        Event = <5431c046 d30e7f32 c2cc8099 58add1e7 579ad104 a3aa8fc4 846e97d7 af01cc79>;
    };
    NSStoreModelVersionHashesVersion = 3;
    NSStoreModelVersionIdentifiers =     (
        ""
    );
    NSStoreType = SQLite;
    NSStoreUUID = "747B9678-345F-4E93-A8FB-B68855B70A1B";
    "_NSAutoVacuumLevel" = 2;
}, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 419;
        NSStoreModelVersionHashes =         {
            Event = <5431c046 d30e7f32 c2cc8099 58add1e7 579ad104 a3aa8fc4 846e97d7 af01cc79>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
            ""
        );
        NSStoreType = SQLite;
        NSStoreUUID = "747B9678-345F-4E93-A8FB-B68855B70A1B";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}
```

こんなんが出た。　DBのスキーマが変更された場合にはそれに対応する処理を行わないといけないが、それをしていない事に対するエラー。とりあえず動かしたいならアプリを一度削除すればデータが消えるのでエラーの回避は可能。最初のリリースまではこの対応でも良いかもしれない。未保証。
phpでプロンプトする (not readline関数)

readline関数が使えない場合に使います。

```php
<?php

function prompt($message = null, $prefix = '> ')
{
    if ($message !== null) {
        echo $message . PHP_EOL;
    }
    return trim(`read -p "$prefix" promptvar && echo \$promptvar`);
}

// Howto1
$color = prompt('Choose color. red | green | blue');
var_dump($color);

// Howto2 : mysql like
$pass = prompt('', 'Password: ');
var_dump($pass);
```
tmuxのlaunchctlエラー対策

Homebrewでインストールしたあと、自動起動させる設定を`launchctl`でロードしようとすると、tmuxではこんなエラーが出てくる。

```
% launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
Bug: launchctl.c:2425 (25957):13: (dbfd = open(g_job_overrides_db_path, O_RDONLY | O_EXLOCK | O_CREAT, S_IRUSR | S_IWUSR)) != -1
launch_msg(): Socket is not connected
```

この問題、`pbcopy`のときと同じ手法で解決できた。

```sh:.zshrc
if [[ "$TMUX" != "" ]]; then
  alias pbcopy="ssh 127.0.0.1 pbcopy"
  alias launchctl="ssh 127.0.0.1 launchctl"
fi
```
Routingのテストをする

適当にテストしたいとき，rails consoleで以下のように試せる

```
> r = Qiita::Application.routes
> r.recognize_path '/items'
=> {:action=>"index", :controller=>"items"} 
> r.recognize_path '/items', method: :post
=> {:action=>"create", :controller=>"items"}
```

また確認は http://localhost:3000/rails/info/routes にアクセスすると良い
via [View your Routes without waiting on Rake by schneems · Pull Request #6461 · rails/rails](https://github.com/rails/rails/pull/6461)
Haskell/Graphics.Glossでマウス座標を取得する

何故か[hackage](http://hackage.haskell.org/packages/archive/gloss/1.7.5.2/doc/html/Graphics-Gloss-Interface-Pure-Game.html#t:Event)に一切説明がなかったので一応ここに投稿しておきます

handleInput以外の部分は[Haskell/Graphics.Gloss](http://qiita.com/items/d7795f31df86e60de18e)と全く同じなので省略します

```haskell:Main.hs

handleInput :: Event -> World -> World
handleInput (EventKey k ks a b) s = s
-- a :: Modifiers, b :: (Float, Float)
-- aがmodifiersを表し、bがマウス座標を表します
-- 例：a : Modifiers {shift = Up, ctrl = Up, alt = Up}
-- 　　b : (311.0,75.0)

handleInput (EventMotion a) s = s
-- ついでにこちらも
-- aはマウス座標を表します
-- 上の函数はイベント発生時のみ呼ばれますがこちらはマウスが動くたびに呼ばれます
-- a :: (Float, Float)
-- 例：a : (311.0,75.0)
hxLINQ というのがあったので使ってみた。

hxLINQ というのがあったので使ってみた。
JSLinq をベースにして作られたものらしい。
Flash/JS/PHP/Neko/C++ でテスト済だそうです。

##導入
まず、 hxLINQ をインストールします。

	haxelib install hxLINQ

Sublime Text2 と [haxe-sublime2-bundle](https://github.com/clemos/haxe-sublime2-bundle) を使っている場合は、```shift+ctrl+L``` で ライブラリの一覧が出るのでそこから選択するだけです。ﾁｮｰｲｰﾈ!

##使い方

こんな感じで。

```as:hxLINQExample.hx
var it = new hxLINQ.LINQ([1,2,3,4,5,6,7,8,9])
.where(function(v:Int, i:Int):Bool {
	return v % 2 == 0; // 抽出(偶数のみ)
})
.select(function(v:Int):Float {
	return v / 10.0; // 加工(10で除算)
})
.iterator();

while(it.hasNext()) {
	trace(it.next()); // out:0.2, 0.4, 0.6, 0.8
}
```

ひと通りの機能は揃ってるので使えそうな感じだけど、Rx の機能まで求めてしまうのは贅沢でしょうか。

##参考
* [andyli / hxLINQ](https://github.com/andyli/hxLINQ)
* [hxLINQ - lib.haxe.org](http://lib.haxe.org/p/hxLINQ)
Anemoneのサンプルがリンク一覧取得しかないので，[リンク元，リンク先]って感じで取ってみた。


```
require 'anemone'

File.open("file.dat","w") do |f| 
  Anemone.crawl("http://onod.es") do |anemone|
    anemone.on_every_page do |page|
      unless page.referer == nil 
        links = page.links
        string = ""
        links.each{|link|
          string = "#{page.referer.to_s} #{link.to_s}"
          puts string
          f.puts string
        }   
      end 
    end 
  end 
end
```

ネストが酷いことになってるけれども，こんな感じでいけます。

- Anemone::Page#linksのlinksでリンク一覧
- Anemone::Page#refererで，currentのページ
- Anemone::Page#urlでpageのリンク

を取得できる…はず。
UITableView dequeueReusableCellWithIdentifier:forIndexPath: でのアサーション

> 2012-09-24 22:52:24.634 xxx[55320:c07] *** Assertion failure in -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:4460
> 2012-09-24 22:52:24.635 xxx[55320:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

こんなエラーが出てしまう場合、indexPathに対応するCellのUIが取得できないようだ。indexPath指定せずに、後で値を取るようにすると良いらしい。

```objc
//    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];//これだと実行時エラー

    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
```
Many_to_Many 設定の保存方法

FuelPHP 勉強会 東京 Vol.2 で発表した「モデル間のリレーション」http://www.slideshare.net/web2citizen/fuel-phpvol2-14380264 の補足で、Many_to_Many の関係を維持したままの保存方法の例です。
親モデルに紐付ける子モデルの配列を渡して保存してやれば中間テーブルに関係性を保持するデータが保存されます。

```php:
<?php
// タグの登録処理
$tags = array();
foreach($tagnames as $tag_name){
	$tag = Model_Tag::find()->where('name', $tag_name)->get_one();
	// 新しいタグの場合はタグテーブルに追加
	if(!$tag){
		$tag = new Model_Tag();
		$tag->name = $tag_name;
		$tag->save();
	}
	array_push($tags, $tag);
}
$skill->tags = $tags;
$skill->save();
```
array.each.with_index(-array.size){|e,i| ... }

先日 `Enumerator#with_index` にインデックスの初期値を与えられることを知りました。

例はイマイチですが、 -1 が来ると最後の要素だというのがわかります。

~~~:ruby
> a = %w(a b c)
> a.each.with_index(-a.size){|e,i| p a[i] + (i == -1 ? " end!" : "") }
"a"
"b"
"c end!"
~~~
HBaseとHadoopを使ったアレコレするのをコンパイルするためのpom.xml

```
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>your.app.hadoop</groupId>
  <artifactId>yourapp</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>summarize</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-core</artifactId>
      <version>0.20.2</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase</artifactId>
      <version>0.92.2</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>
```

hbaseの方は嫌がらせみたいに色々落ちてきて、本当に全部使うのかよ…… 的なアレですが、とりあえず動かないよりはマシという感じで
ページ処理のクラス

「Goooooooooogle」みたいなページ処理をするためのクラス。
全アイテム数、1ページ当たりのアイテム数、一度に表示させるページ数をコンストラクタで渡して、contentメソッドで現在表示しているページを渡すと、minに最小ページ数、maxに最大ページ数が返ってくる。
もっとエレガントな書き方したい。

```python
#coding:utf-8
'''
Created on 2012/09/23

@author: fumix
'''

class Pager():
    '''
    ページ処理用クラス
    '''


    def __init__(self,total,page,width):
        '''
        Constructor
        '''
        self.total = total
        self.page = page
        self.width = width
    
    def content(self,current):
        #最大ページ数
        max_pagecount = self.total / self.page + 1

        #最大ページ数 < 表示ページ数のとき
        if max_pagecount < self.width:
            min = 1
            max = max_pagecount

        #最大ページ数 < カレントページ + 表示ページ数の半分の時
        elif max_pagecount < current + self.width / 2 :
            min = current - self.width / 2
            max = max_pagecount

        #カレントページ - 表示ページ数の半分 < 1 のとき
        elif current - self.width / 2 < 1:
            min = 1
            max = self.width
        
        #それ以外
        else:
            min = current - self.width / 2
            max = current + self.width / 2
        return {'min':min,'max':max}
def _test():
    page = Pager(532, 20, 10)
    print page.content(22)

if __name__ == '__main__':
    _test()
```
ラベルで時刻を選択する メモ

時刻を定形リストから選択できるようにしたい

## 概要

たとえば時間割など、決まった時刻セットを選択してもらいたい場合は、time_select メソッドは不向き。
time_select で実現できなければ、ただのselect でやってみよう。

## time_select メソッド

![時刻選択](http://gyazo.com/93ad74d84f7606af5fc02b2d78155256.png)


通常ならば、time_select メソッドで必要順分な機能があるとおもう。
1分刻みじゃなくって15分刻みにしたいなら、```minuite_step: 15```でできるし、秒数を選択肢に含めることもできる。
(詳しくはリファレンスを参照のこと。)

## 文字列で選択したい
![文字列で選択](http://gyazo.com/eca3e5796e8740705560629220c77aa0.png)

time_select のように時刻で選択するのではなく、文字列で選択したい場合、select メソッドを利用する。

ベタ書き：

```erb:app/views/schedules/_form.html.erb
…
<%= f.select :time, [['Period 1', '09:30']['Period 2', '10:30']…] %>
…
```

ヘルパーメソッドにリストを移動、Viewで使う：

```ruby:app/helpers/application_helper.rb
…
  def time_list
    [
      ['Period 1', '09:30'],
      ['Period 2', '10:30'],
      ['Period 2', '11:30'],
      ['Period 3', '13:45'],
      ['Period 4', '14:45'],
      ['Period 5', '15:45'],
      ['Period 6', '16:45'],
      ['Period 7', '17:45']
    ]

  end
…

```

```erb:app/views/chedules/_form.html.erb
…
<%= f.select :time, time_list %>
…
```

---

## リンク
[Ruby on Rails Documentation](http://api.rubyonrails.org/)
* [ActionView::Helpers::DateHelper](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-time_select)
* [ActionView::Helpers::FormOptionsHelper](http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-select)
UIAlertView + UITableView


UIAlertViewを継承したUIAlertTableView的なクラスをつかっていたら、
iOS6.0になったとき突然動かなくなってどうにも治せなかったので別の方法でやることにした。

この方法ならiOS5.1でもiOS6.0でも動くのを確認した。

```objective-c
// .hで以下のようなプロパティを定義
UIAlertView *alertWithTableView;

// .m
- (IBAction)showAlertWithTable:(id)sender
{
    UIAlertView *alertWithTableView = [[UIAlertView alloc] init];
    alertWithTableView.delegate = self;
    alertWithTableView.title = @"行からひとつ選択してください";
    [alertWithTableView addButtonWithTitle:@"Cancel"];
    alertWithTableView.cancelButtonIndex = 0;
    // 他のalertViewのtagと被らないように変える
    alertWithTableView.tag = 0;
    tableInAlertView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 0, 0) style:UITableViewStylePlain];
    tableInAlertView.delegate = self;
    tableInAlertView.dataSource = self;
    [alertWithTableView insertSubview:tableInAlertView atIndex:0];
    [alertWithTableView show];
}

- (void)willPresentAlertView:(UIAlertView *)alertView
{
    if (alertView.tag == 0) {
        // alertView自体のリサイズ
        CGFloat frameHeight = 250.0f;
        CGRect alertViewFrame = CGRectMake(alertView.frame.origin.x, alertView.frame.origin.y - frameHeight/2,
                                           alertView.frame.size.width, alertView.frame.size.height + frameHeight);
        [alertView setFrame:alertViewFrame];
        // tableViewをalertView内にフィットさせるためにリサイズ
        UIView *lowestView;
        int i = 0;
        while (![[alertView.subviews objectAtIndex:i] isKindOfClass:[UIControl class]]) {
            lowestView = [alertView.subviews objectAtIndex:i];
            i++;
        }
        CGFloat tablePadding = 6.0f;
        CGFloat tableWidth = alertView.frame.size.width-(tablePadding*4);
        CGFloat tableHeight = frameHeight-(tablePadding*2);
        CGRect tableViewFrame = CGRectMake(tablePadding*2,
                                           lowestView.frame.origin.y+lowestView.frame.size.height+((tablePadding+2)*2),
                                           tableWidth, tableHeight);
        [tableInAlertView setFrame:tableViewFrame];
        tableInAlertView.layer.cornerRadius = 4;
        // 全subViewの位置をframeHeightぶん上に移動
        for (UIView *subView in alertView.subviews) {
            if ([subView isKindOfClass:[UIControl class]]) {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + frameHeight,
                                           subView.frame.size.width, subView.frame.size.height);
            }
        }
    }
}

// alertViewのボタンが押されたときのデリゲート
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

}

// テーブルの行が選ばれた時のデリゲート
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 行が一つ選ばれたときにalertViewを閉じたければここで以下のように実行
    [tableInAlertView dismissWithClickedButtonIndex:0 animated:NO];
}

// 以下のテーブルの内容を決めるためのデリゲートを実装する

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
}

```
Railtie, Engine 関係資料


* Rails3レシピブック外伝
https://speakerdeck.com/u/a_matsuda/p/rails3-recipe-book-gaiden
118ページ Engineを使う

* 使いやすくなった Rails 3.1 の Engine
http://d.hatena.ne.jp/passingloop/20110801/p1

* Rails Guides - Getting Started with Engines
http://guides.rubyonrails.org/engines.html

* Extending Rails 3 with Railties
http://www.engineyard.com/blog/2010/extending-rails-3-with-railties/
日本語訳 http://www.engineyard.co.jp/blog/2013/extending-rails-3-with-railties/

* \#277 Mountable Engines
http://railscasts.com/episodes/277-mountable-engines

* Crafting Rails Applications
Section 4.4 "Extending Rails with Railties"
Chapter 5 "Managing Application Events with Rails Engines"

* WEB+DB Press vol.58
特集「詳解Rails3」

# API Reference

## Rails::Railtie
http://api.rubyonrails.org/classes/Rails/Railtie.html
日本語訳 http://blog.twiwt.org/e/e0445b

> Railtie は Rails フレームワークのコアで、 Rails に機能を追加したり初期化プロセスを変更するためのいくつかのフックを提供します。

> 例えば、以下のような機能拡張を行う場合は Railtie が必要になります:
>
> * イニシャライザの作成
> * configuring a Rails framework for the application, like setting a generator
> * adding config.* keys to the environment
> * setting up a subscriber with ActiveSupport::Notifications
> * rake タスクの追加


## Rails::Engine
http://api.rubyonrails.org/classes/Rails/Engine.html

> Any `Rails::Engine` is also a `Rails::Railtie`, so the same methods (like `rake_tasks` and `generators`) and configuration options that are available in railties can also be used in engines.


# RailtieとEngineの関係
`Rails::Engine < Rails::Railtie`

> !["すべてをつなぎ合わせるRailtie"](http://dl.dropbox.com/u/35915767/20120924_161840_w600.jpg)
> WEB+DB Press vol.58 特集「詳解Rails3」


Engine は Rack Application にもなっている。（`Rails::Engine#call` が存在する）
（Rackについては http://jp.rubyist.net/magazine/?0036-SinatraReintroduction#l10 など参照）

独自の config/routes.rb, config/locales/\*, lib/tasks/\* などを持ち、自動的にロードされる。

Railtie + アプリっぽい動作(?) = Engine

# つかいかたの例
## Railtie
あらゆるものがRailtieなので、何でもいいんだけど

* ActiveRecord
* rspec-rails
* jquery-rails
* haml-rails

```ruby
module Haml
  module Rails
    class Railtie < ::Rails::Railtie
      config.generators.template_engine :haml
 
      config.before_initialize do
        Haml.init_rails(binding)
        Haml::Template.options[:format] = :html5
      end
    end
  end
end
```
configの設定とinitializeを行なっている。

## Engine

* Devise

# その他
## ActiveSupport.on_load
Railsの標準コンポーネントの拡張に便利。
http://api.rubyonrails.org/files/activesupport/lib/active_support/lazy_load_hooks_rb.html
http://blog.udzura.jp/2011/11/28/shibuya-rb-1st-with-activesupport-tips/
フックポイントは :action_controller, :action_view, :active_record, :action_mailer などが用意されている。

## ActiveSupport::Concern
Rubyの既存クラスの拡張に便利。
http://api.rubyonrails.org/classes/ActiveSupport/Concern.html
http://guides.rubyonrails.org/plugins.html （記述が古い可能性あり）

# 今後 Sendagaya.rb でなにをやるか (10/15以降予定)
* Engineの機能を知りたい
  * API リファレンスを読もう
  * ソースを読もう
  * Kaminariのソースを読もう
  * Crafting Rails Applications を読もう
* Railtieの初期化、集約部分を知りたい
  * ソースを読もう
iOS 6.0対応

・XCodeバージョンアップしたらビルドが全くできなくなったので新しくプロジェクトつくり直してファイルをコピペした
・プロジェクト移行時にプロジェクト名変えたらCoreDataの設定ファイル名を変えるべきなど、その他XCodeの細かい設定を全部調整しないといけなくて長々とハマった
・UINavigationBarControllerとUIToolBar組み合わせたときの挙動が仕様変更して壊れたのでStoryboardと画面遷移時のコード両方を調整する必要があった→そのうち詳しく書く
・UIAlertViewを継承してUITableViewから選択できるようにカスタマイズしていたのが壊れたので別の方法で作り直した→詳しく書いた [http://qiita.com/items/04e3768758d6fb7a6d97]

もっと早い段階でXCodeバージョンアップして試して修正しておけばよかったんだけど
XCodeバージョンアップするとほぼ確実にこれまでのコードが動かなくなって開発中断するのが辛い
Rails3系のtimezoneの扱いに関するメモ


# ローカルタイムに関する設定
Rails3系からデータベースにはUTCで保存、取り出して扱う際に必要なタイムゾーンに変更するというのが基本的な考え方の様子。

タイムゾーンの設定はapplication.rbにて行えるが、主に関係する設定が２つある。

* config.active_record.default_timezone
* config.time_zone

## config.active_record.default_timezone
データベースに保存する際のタイムゾーンを指定するディレクティブ。先ほど書いたようにRails3からはデータベースに時刻を保存する場合は基本的にUTCで保存するようになったみたいで、これをローカルタイムで保存するには以下のように設定すれば良い。

```ruby:config/application.rb
config.active_record.default_timezone = :local
```

## config.time_zone
こちらが色々悩ましそうな感じで今確認出来たところだとActiveSupport::TimeZoneクラスの出力に影響を与える様子。試しに何も設定しない場合とtime_zoneをtokyoにした場合で色々出力してみると

### 設定しない場合

```ruby:
Time.zone # => (GMT+00:00) UTC
Time.zone.now # Mon, 24 Sep 2012 09:19:35 UTC +00:00 
```

### Tokyoにした場合
```ruby:config/application.rb
config.time_zone = 'Tokyo' 
```

```ruby:
Time.zone # => (GMT+09:00) Tokyo
Time.zone.now #=> Mon, 24 Sep 2012 18:16:43 JST +09:00
```

とこの様に出力が変更されていることが確認できた。注意が必要なのはActiveSupport::TimeZoneを使うにはTime.zoneで処理を行う必要がありTime.nowのようにTimeで直接処理すると設定に関係なくローカルタイムで表示されてしまう点。

### Time / Time.zoneの違い
```
Time.class      # => Class (常にローカル扱い)
Time.zone.class # => ActiveSupport::TimeZone (config.time_zoneの設定に依存) 
```

ということでユーザによってタイムゾーンを変える必要があるアプリケーションは
* config.time_zone = 'Tokyo' を設定する
* Time.zoneを常に使う (追記: ActiveRecordと併用する場合はto_s(:db)でUTCに変換 => DB登録時に更に時刻の差分を補正と2重に処理が走ってしまうので注意)

更に追記、config.time_zoneを変更してしまうとActiveRecordを利用する際に
* オブジェクトを生成したタイミングでタイムゾーンをUTCに合わせようとする
* Arelなどwhereをする際にカラムの値で指定する場合などでは合わせようとしない
という違いが発生してしまう。

```ruby:オブジェクトを生成した場合の挙動
created_at = "2012-09-01 00:00:00"
@example = Example.new(:created_at => created_at)
@example.created_at # => 2012-08-31-15:00:00
```

```ruby:Arelを利用する場合の挙動
created_at = "2012-09-01 00:00:00"
Example.where(:created_at => created_at).to_sql # => SELECT `examples`.* FROM `examples`  WHERE `examples`.`created_at` = '2012-09-01 00:00:00
```

なので、結果的には何も設定せずにユーザ毎に自前で処理するのが良いかもしれないです…

常にローカルタイムで良いアプリケーションは
* config.active_record.default_timezone = :localを設定する
* config.time_zone = 'Tokyo'

って感じが良いのだろうか？

# Tips
## データベース用のフォーマット変換する
Time.zone.to_s(:db)は使ってしまうと事故が起きそう…

```ruby:
Time.zone.now.to_s(:db) # UTCに自動的に変更される
Time.zone.now.strftime("%Y-%m-%d %H:%M:%S") # ローカルタイムのまま
Time.now.to_s(:db)      # ローカルタイムのまま
```
Grape + Devise => sign_in

```ruby:/lib/api.rb
# coding: utf-8
class Api < Grape::API
  format :json

  # ユーザログイン
  post '/users/sign_in' do
    user = User.find_for_authentication( email: params[:user][:email] )

    if user and user.valid_password?( params[:user][:password] )
      { result: user }
    else
      { result: "User Error." }
    end
  end
end
```
git を https 経由で使うときのパスワードを保存する

git を https 経由で使う場合、pull や push のたびに毎回パスワードを聞かれてしまいます。
これを改善するには [git-credential](http://git-scm.com/docs/gitcredentials) を使うと良いです。

git-credential は git 1.7.9 以降で使用可能です。
なお、古いやり方としては .netrc を使う方法もありますが、パスワードを平文でファイルに保存するので、やらないほうがいいと思います。

# 使用可能な管理方式

git-credential では、以下のような方法でユーザ名とパスワードを管理できます。

* `git-credential-store` : ファイルに保存します。ただし、パスワードが平文が保存されます。
* `git-credential-cache` : 常駐プロセスに記憶させます。
* `git-credential-osxkeychain` : Mac OS X のパスワード管理を使います。
* `Git-Credential-Manager-for-Windows` : Windows のパスワード管理を使います。
* `git-credential-gnomekering` : GNOME のパスワード管理を使います。

なお、git 本家の contrib に、Windows 用の wincred というものが入っているようです。試していませんが・・・。

# cache

cache 方式は標準で付属しています。
次のコマンドで cache 方式が使用できます。

```sh
git config --global credential.helper cache
```

初回パスワード入力時に git-credential-cache--daemon プロセスが常駐して、タイムアウト時間が過ぎるまでパスワードを記憶します。

タイムアウトは、デフォルトでは 900 秒（15分）です。変更するには、次のようにタイムアウト時間（例では 3600 秒）を指定します。

```sh
git config --global credential.helper 'cache --timeout=3600'
```

# osxkeychain

osxkeychain は git の contrib として付属しています。MacPorts や Homebrew でインストールすると有効になっています。
次のコマンドで osxkeychain が使用できます。

```sh
git config --global credential.helper osxkeychain
```

初回パスワード入力時に OS X キーチェーンに登録され、以後はパスワード入力が不要になります。

# windows

別途インストールが必要です。

https://github.com/Microsoft/Git-Credential-Manager-for-Windows

手順通りインストールを行えば良いです。

初回パスワード入力時に Internet Explorer などと同じ場所にアクセストークンが保存され、以後はパスワード入力が不要になります。

# gnomekeyring

gnomekeyring は別途インストールが必要です。

https://github.com/shugo/git-credential-gnomekeyring

手順通りビルド・インストールを行えば良いです。

初回パスワード入力時に GNOME キーリングに登録され、以後はパスワード入力が不要になります。

# 最後に

実は同様のことが github のヘルプにほとんど書いてありました。

https://help.github.com/articles/set-up-git
緯度経度の比較


self.MyMapView.centerCoordinate.latitudeと newLocation.coordinate.latitudeが同じなのに==でtrueにならない。

```
typedef struct {
	CLLocationDegrees latitude;
	CLLocationDegrees longitude;
} CLLocationCoordinate2D;
```

CLLocationDegreesの比較は？？

とりあえずdoubleにキャストするかと思ったが、それでもだめで、なんとdoubleとかは==で比較できない驚愕の事実。

fabsつかう。

```
	double lat1 = (double)self.MyMapView.centerCoordinate.latitude;
	double lon1 = (double)self.MyMapView.centerCoordinate.longitude;

	double lat2 = (double)newLocation.coordinate.latitude;
	double lon2 = (double)newLocation.coordinate.longitude;
	
	if (fabs(lat1 - lat2) < FLT_EPSILON && fabs(lon1 - lon2) < FLT_EPSILON) {
```
UIViewController: iOS 6 で変更になった画面回転に対応する

iOS 6 SDK でビルドしたら自動回転しちゃいけない画面が回転するようになってしまうのは、UIViewController の `shouldAutorotateToInterfaceOrientation:` が使えなくなったことによる。

各画面（UIViewController）ごとに再実装しなくてはならないのか、と少々ゲンナリしていたが、以下のようなカテゴリによる拡張実装で楽に対応できた。
とりあえずPortrait固定であるなら以下で。

```objectivec
// iOS 6以降で自動回転に対応するためのカテゴリ
@interface UIViewController (UIViewControllerForIOS6)

@end

@implementation UIViewController (UIViewControllerForIOS6)

// iOS 6 以降で有効. iOS 5 以前では実行されない
- (NSUInteger)supportedInterfaceOrientations
{
	if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
	{
		// iPhone がサポートする向き
		return UIInterfaceOrientationMaskPortrait;
	}
	
	// iPad がサポートする向き
	return UIInterfaceOrientationMaskAll;
}
- (BOOL)shouldAutorotate
{
	if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
	{
		// iPhone
		return NO;
	}
	
    return YES;
}

@end

```
porototypeの解釈が曖昧だったので

##プロトタイプオブジェクトは関数オブジェクトが持つプロパティの一つ

```js
var Klass = function(){ /*...*/ };
-> console.log Klass.prototype
-> [Object]
```


##インスタンス生成時の  ```__proto__```  の動き

###1.コンストラクタを作る

```js
var Klass = function(){ /*...*/ };
```
1. コンストラクタ生成 
2. Klass.prototypeにはconstructorプロパティと```__proto__```
3. Klass.```__proto__```はただの空の関数 function Empty(){};


###2.コンストラクタのprototypeに追加

```js
var Klass = function(){ /*...*/ }
Klass.prototype.init = function(){ /*...*/ };
```

1. Klass.prototypeにinitが足される


###3.インスタンスを生成

```js
var Klass = function(){ /*...*/ }
Klass.prototype.init = function(){ /*...*/ };
var mod = new Klass;
```

1. modの```__proto__```にKlassのprototypeが代入される
2. コンストラクタに初期値をセットしておくとインスタンスのプロパティとして使われる
* KlassにhasOwnPropertyでinit関数があるか調べるとfalseが返る
* modの```__proto__```にhasOwnPropertyでinit関数があるか調べるとtrueが返る

mod.initを実行した時、最初にmodのプロパティのinit関数を探す、
なかったらそのまま ```__proto__``` 内のinit関数を探しにいく(コンストラクタのprototype)、そこになければさらに上の ```__proto__``` を探しにいく。これがプロトタイプチェーン

### __proto__ について
```__proto__``` がプロトタイプチェーンを実現させている

```__proto__``` はすべてのオブジェクトにあるプロパティ

```__proto__``` とprototypeは別物

```__proto__``` へのアクセスは実装依存
WindowsでCapfileをUTF-8で書く

Windows で Capfile を UTF-8 で書けたのがうれしかったのでメモ。結論、1行目に coding: utf-8 ってコメント書けばいいだけなんですけどね。なにそれ普通の .rb でも一緒じゃんって話です。

Before coding: utf-8
====================

```ruby:Capfile
desc "負荷などを表示します."
task "uptime" do
  run("uptime")
end
```

```text
C:\Users\rch850\Desktop>cap -T
C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/lib/capistrano/configuration/loading.rb:93:in `instance_eval': Capfile:1: invalid multibyte char (Windows-31J) (SyntaxError)
Capfile:1: syntax error, unexpected tSTRING_BEG
Capfile:2: syntax error, unexpected tIDENTIFIER, expecting $end
task "uptime" do
            ^
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/lib/capistrano/configuration/loading.rb:93:in `load'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/lib/capistrano/configuration/loading.rb:172:in `load_from_file'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/lib/capistrano/configuration/loading.rb:89:in `load'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/lib/capistrano/configuration/loading.rb:86:in `block in load'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/lib/capistrano/configuration/loading.rb:86:in `each'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/lib/capistrano/configuration/loading.rb:86:in `load'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/lib/capistrano/cli/execute.rb:65:in `block in load_recipes'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/lib/capistrano/cli/execute.rb:65:in `each'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/lib/capistrano/cli/execute.rb:65:in `load_recipes'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/lib/capistrano/cli/execute.rb:31:in `execute!'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/lib/capistrano/cli/execute.rb:14:in `execute'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/capistrano-2.12.0/bin/cap:4:in `<top (required)>'
        from C:/Ruby193/bin/cap:23:in `load'
        from C:/Ruby193/bin/cap:23:in `<main>'
```

After coding: utf-8
===================

```ruby:Capfile

# coding: utf-8
desc "負荷などを表示します."
task "uptime" do
  run("uptime")
end
```

```text
C:\Users\rch850\Desktop>cap -T
cap invoke # Invoke a single command on the remote servers.
cap shell  # Begin an interactive Capistrano session.
cap uptime # 負荷などを表示します.

Extended help may be available for these tasks.
Type `cap -e taskname' to view it.
```

なんでこんなことやってんの
==========================

Shift_JIS で Capfile 書いていればこんなこと必要ないんですよね。でも Shift_JIS にするのは魂が許さなかったので UTF-8 でこんな風に書いてました。

```ruby
#
# とりあえず書いてみた Capfile です
#
# coding: utf-8
desc "負荷などを表示します."
task "uptime" do
  run("uptime")
end
```

これだとエラーになっちゃうんですよね。うーん、こりゃ UTF-8 諦めるしかないかなーと思って、desc は英語で書いてました。

でも、コードの引き継ぎとかで「なんで英語なの気取っちゃって」みたいに思われたくないので、なんとか日本語にできないかなーと調べてた所、[coding: utf-8 は基本的に1行目に書かなければならない](http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fm17n.html#script_encoding)という事が分かりました。はい、ただそれだけです。

結局、一般的な Ruby の話ということで落ち着いたんですが、eval がどうこうってエラーが出てたので Capfile 独自の問題だと勘違いしてて無駄に時間を取られました。
Glossで画像を読み込む

要gloss, juicypixels-repa

```haskell:glossLoadImage.hs

import Graphics.Gloss.Data.Picture
import Codec.Picture.Repa
import Data.Array.Repa as R hiding (map)
import qualified Data.Array.Repa.Repr.ForeignPtr as RF

loadImage :: FilePath -> IO Picture
loadImage path = do
    img <- imgData <$> either error id <$> readImageRGBA path
    let Z :. h :. w :. _ = R.extent img
    return $! bitmapOfForeignPtr w h (RF.toForeignPtr $ flipVertically img) True

-- Data.Array.Repa.extractを用いて一部を切り抜くこともできる
```
Lazy K インタプリタ(Unlambda記法)

```haskell:lazyk.hs
import Control.Arrow
import Control.Applicative
import Data.Char (chr, ord)
import System.Exit
import System.Environment
import System.IO
 
infixl 9 :$
data Expr = Expr :$ Expr | I | K | S | Inc | Export {-# UNPACK #-} !Int deriving Show
 
apply :: Expr -> Expr -> Expr
apply (S :$ x :$ y) z = apply x z `apply` apply y z
apply (K :$ x) y = x
apply I x = x
apply Inc (Export x) = Export $! x + 1
apply Inc _ = error "attempted to apply inc to a non-number"
apply f x = f :$ x
 
eval :: Expr -> Expr
eval (x :$ y) = eval x `apply` eval y
eval x = x
 
cons :: Expr -> Expr -> Expr
cons a b = S :$ (S :$ I :$ (K :$ a)) :$ (K :$ b)
 
church :: Int -> Expr
church 0 = K :$ I
church 1 = I
church 256 = S :$ I :$ I :$ (S :$ I :$ I :$ (S :$ (S :$ (K :$ S) :$ K) :$ I))
church n = S :$ (S :$ (K :$ S) :$ K) :$ church (n - 1)
 
encode :: String -> Expr
encode = foldr cons end . map (church . ord)
    where
        end = cons (church 256) end
 
export :: Expr -> Int
export (Export x) = x
export x = error $ "invalid output format (result was not a number): " ++ show x
 
realize :: Expr -> Int
realize expr = export $ expr `apply` Inc `apply` Export 0
 
parse :: String -> (Expr, String)
parse ('`':xs) = let (a0, xs') = parse xs
                     (a1, xs'') = parse xs' in
                         (a0 :$ a1, xs'')
parse ('s':xs) = (S, xs)
parse ('k':xs) = (K, xs)
parse ('i':xs) = (I, xs)
parse (_:xs) = parse xs
parse "" = (I, "")
 
output :: Expr -> IO ()
output expr
    | x < 256 = putChar (chr x) >> (output $ apply expr $ K :$ I)
    | x == 256 = exitWith ExitSuccess
    | otherwise = exitWith $ ExitFailure $ x - 256
    where
        x = realize $ apply expr K
 
main = output . eval
    =<< (fst . parse . concat . filter ((/='#').head) . filter (/=[]) *** encode . input >>> uncurry (:$))
        <$> break (=="===STDIN===") . lines <$> getContents
    where
       input (_:xs) = unlines xs
       input _ = ""
```
LESSでループ処理を実装する方法


LESSでも連番でクラスを定義したいことってありますね。
共通部分を関数にして、手動で連番を列挙する方法があります。

```css:less
.foo(@num) {
	(~".foo-@{num}") {
		// style...
	}
}

.foo(1);
.foo(2);
.foo(3);
// ...
.foo(99);
.foo(100);
```

ただ、これが数十行ともなると書くのも大変ですし、LESS自体の見通しも悪くなりますね。プログラミングをやったことがある人であれば、`for` などのループで回せないかと考えると思います。

しかし、LESSはループ構文をサポートしていません。なので、再帰関数とLESSのガード(`when`)を使ってループっぽいことをします。このトリックはTwitter Bootstrapで使われています。

```css:less
.iterate(@i) when not (@i < 10) { } // ループを抜けるために必要
.iterate(@i) when (@i < 10) {
	(~".test@{i}") {
		width: @i;
	}

	.iterate(@i + 1); // 次のループへ
}

.iterate(0); // ループを実行
```

これをコンパイルすると、次の通りループした結果のCSSが生成されます。

```css
.test0 {
  width: 0;
}
.test1 {
  width: 1;
}
.test2 {
  width: 2;
}
.test3 {
  width: 3;
}
.test4 {
  width: 4;
}
.test5 {
  width: 5;
}
.test6 {
  width: 6;
}
.test7 {
  width: 7;
}
.test8 {
  width: 8;
}
.test9 {
  width: 9;
}
```


ちなみに、上のLESSをPHPで表現するとしたら下記のようなコードになります。PHPにはガードがありませんが、`if`分岐でガードします。再帰はLESSと同じですね。

```php
<?php
function iterate($i) {
	if ( $i < 10 ) { // ガード
		echo ".test{$i} { width: {$i} }\n";

		iterate($i + 1); // 再帰
	} else {
		return;
	}
}

iterate(1);
```


LESSでループを実装するとトリッキーなコードになるので、ループを多く書く必要がある場面では、SaSSなどの別のツールと組み合わせたほうがいいかもしれませんね。
対象ファイルの文字コードを全てUTF8、改行をLFにする。


nkfを使う。環境はMac。
nkfは、homebrewを使えばインストールできる。

参考:
[改行コードの変換コマンドについて - 試験運用中なLinux備忘録](http://d.hatena.ne.jp/kakurasan/20090831/p1)
[エンコーディングの変換コマンドについて - 試験運用中なLinux備忘録](http://d.hatena.ne.jp/kakurasan/20090825/p1)

拡張子.txtを対象にするなら、

```shellscript:
cd /path/to/textdir
nkf --unix --utf8 --overwrite **/*.txt
```
Twitter における文字数カウント

> [ツイートの文字数 - Nullified Construction](http://blog.aki-null.net/blog/2012/05/11/tweet-length-count/)

に影響を受けて、 Python で書いた奴を公開しようと思います。

# 第 1 の壁
カウントでなにより大事なのが、 URI を 20 文字として扱うことです。 URI なら簡単に正規表現で取り出せるはずなのですが、流石最近クソな Twitter さん、スキーマがなくても URI として認識します！素敵（白目）

スキーマ無しでも抽出できるのは、 Twitter の中の人のものすごい努力で満ちた正規表現のおかげです。

> [twitter-text-java/src/com/twitter/Regex.java at master · twitter/twitter-text-java](https://github.com/twitter/twitter-text-java/blob/master/src/com/twitter/Regex.java)

もはや何が何だか。

これを Python に翻訳すればいいのですが、 Python の正規表現が時代おくれすぎて、いろいろ対応してないんです＞＜

ひたすらエラーになるところを潰して、こんな感じになりました。

> [twikoto3/twikoto3/twittertext/regex.py at master · azyobuzin/twikoto3](https://github.com/azyobuzin/twikoto3/blob/master/twikoto3/twittertext/regex.py)
> URI に関係するところしか、作っていません。

予想以上に Python が酷い…。

# 第 2 の壁
あとは、正規化して文字数を数えればいいんです。数えればいいんですが、問題は、コードポイント単位で数えなければいけないのです。

これは、 Unicode がメインになった Python 3 でも対応していなくて、大分悩みました。

そんなときに出会ったのがこれ

> [codepoint.py](http://www.emptypage.jp/gadgets/codepoint-py.ja.html)

パブリックドメインなので好き勝手できますね。 Python 3 で動かすにはすこし修正が必要ですが、すごく簡単にコードポイント単位で数えることができます。

```python3
import codepoint

text = "吉野屋" #http://blog.unfindable.net/archives/2728 をやりたかったのですが、 Qiita のバグで死にました
length = len(codepoint.characters(text))
```

これでカウントできました！！

コードの全貌はこちら

> [twikoto3/twikoto3/twittertext at master · azyobuzin/twikoto3](https://github.com/azyobuzin/twikoto3/tree/master/twikoto3/twittertext)
WordPress記事中の句読点などを半角で出力


需要なさそうですが何かのために一応残しておきます。
functions.phpに追記してください。




    // 全角句読点を半角にする
    function hankaku($replaced)
    {
      $pattern1 = array(
        '/\x{3001}/u', // 、
        '/\x{3002}/u', // 。
        '/\x{30FB}/u', // ・
        '/\x{300C}/u', // 「
        '/\x{300D}/u', // 」
        '/\x{FF08}/u', // （
        '/\x{FF09}/u'  // ）
      );
      $pattern2 = array(
        '&#xFF64;',
        '&#xFF61;',
        '&#xFF65;',
        '&#xFF62;',
        '&#xFF63;',
        '&#x28;',
        '&#x29;'
      );
      $replaced = preg_replace($pattern1, $pattern2, $replaced);
      
      return $replaced;
    }
    add_filter('the_content', 'hankaku');
foremanでputsの内容がターミナルに表示されない

[このあたりの件](http://qiita.com/items/936931bbbab1f39c49f5)ですが、たとえば以下のようなファイルを用意して

```ruby:/tmp/unbuffered.rb
STDOUT.sync = true
```

```bash
$ RUBYOPT='-r/tmp/unbuffered' foreman start
```
で起動すると、対象のファイルを修正しないで済みそう。

中田さんに教えてもらったので忘れないうちに書いとく。
https://twitter.com/n0kada/status/257076901015875584
すべてのサブディレクトリーで`bundle update`するRakeタスク

Rubyのプロジェクトはあるディレクトリー下にまとめていると思います。
旅行から返って来たりして、それらで一々`bundle update`するのが面倒だったので作りました。

```ruby
require 'pathname'
require 'parallel'

namespace :bundle do
  desc 'Execute `bundle update` at all subdirectories'
  task :update do
    subdirs = Pathname.glob('./*').select(&:directory?).map(&:expand_path)
    Parallel.each subdirs do |dir|
      next unless (dir + 'Gemfile').exist?
      cd dir
      sh 'bundle update'
    end
  end
end
```
play framework2でH2のWEBコンソールにアクセスする

対象のプロジェクトのディレクトリで
`play`を入力
`h2-browser`を入力
`run`でサーバ起動
http://localhost:8082/ にアクセスしてJDBC URLにjdbc:h2:tcp://localhost/mem:playを入力
JKiita

![Qiita](http://25.media.tumblr.com/tumblr_mbtqvkP2sU1qz5wrmo1_500.jpg "女子高生")

JKでQiitaをダラダラとみるための女子高生によるQiitaのためのツール。

http://jkiita.herokuapp.com/

https://github.com/rosylilly/jkiita
Qiita Widget : Qiitaの投稿を表示できるブログパーツ

Qiitaの新着投稿をウェブサイトに埋め込むことができるウィジェットです。自分のブログなどのウェブサイトにQiitaの活動を載せたり、Qiita:Teamに特定のタグのタイムラインを表示したりできます。


<img width="1126" alt="Qiita_Widget_Demo.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/9d78127b-bb24-9e27-9aa7-b9ae15bfbf9d.png">

*図:左はユーザ投稿の、右はRubyタグのタイムライン*

[Qiita Widgetの動作するデモはこちら](https://qiita-widget.suin.io/)

## ウィジェットの設置方法

下記のコードの`your_name`の部分を表示したいユーザ名に置換えてお使いください。

```html
<a href="https://qiita.com/your_name" data-qiita-widget data-username="your_name">suinのQiita投稿</a>
<script src="https://qiita-widget.suin.io/widget.js" defer></script>
```


### ウィジェットのカスタマイズ

`data-*`属性を設定することで、ウィジェットの表示をカスタマイズできます。

#### コンテンツのカスタマイズ

表示するコンテンツは「ユーザ投稿」「タグへの投稿」「キーワード検索結果」のいずれかを選択することができます。

属性 | 値 | 説明
----|----|----
`data-username="ユーザ名"` | ユーザ名: `string` | ユーザの新着投稿が表示される
`data-tag="タグ"` | タグ: `string` | タグへの新着投稿が表示される
`data-search="キーワード"` | キーワード: `string` | 検索キーワードに合致する新着投稿が表示される

#### 見た目のカスタマイズ

ウィジェットの大きさや表示件数といった見た目をカスタマイズすることができます。

属性 | 値 | 説明
----|----|----
`data-items` | 表示件数: `int` | 表示する投稿数
`data-width` | 幅: `string` | ウィジェットの幅。値はCSSの`width`で使用可能なもの。デフォルト: `100%`
`data-height` | 高さ: `string` | ウィジェットの高さ。値はCSSの`height`で使用可能なもの。デフォルト: `400px`
`data-hide-header` |  | Qiitaのロゴを非表示にする
`data-hide-footer` |  | Qiita Widgetへのリンクが非表示になる
Canvas Oekaki javascript


```oekaki.js
$(function() {
	var state = false;
	var lines = [];
	var line = [];
	var curx, cury;
	var canvas = document.getElementById('canv');
	var ctx = canvas.getContext('2d');
	var color = "rgb(0,0,0)"
	
	$(window).mousemove(function(e){
		curx = e.pageX - $("#canv").position().left;
		cury = e.pageY - $("#canv").position().top;
		//document.title = new Array(curx,cury);
		
		if (!state) return;
		ctx.beginPath();
		ctx.strokeStyle = color;
		ctx.moveTo(line[line.length-1][0], line[line.length-1][1]);
		ctx.lineTo(curx, cury);
		ctx.stroke();
		line[line.length] = new Array(curx,cury);
	});
	$(window).mousedown(function(e){
		curx = e.pageX - $("#canv").position().left;
		cury = e.pageY - $("#canv").position().top;
		line[0] = new Array(curx,cury);
		state = true;
	});
	$(window).mouseup(function(e){
		curx = e.pageX - $("#canv").position().left+1;
		cury = e.pageY - $("#canv").position().top+1;
		//document.title = new Array(curx,cury);
		
		ctx.beginPath();
		ctx.strokeStyle = color;
		ctx.moveTo(line[line.length-1][0], line[line.length-1][1]);
		ctx.lineTo(curx, cury);
		ctx.stroke();
		line[line.length] = new Array(curx,cury);
		
		lines[lines.length] = line;
		line = [];
		state = false;
	});
});
```
Canvasアプリのテンプレート


```canvas_template.html
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>__TITLE__</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script type="text/javascript">
__SCRIPT__
</script>
<style type="text/css">
__STYLE__
</style>
</head>
<body>

<canvas id="canv" width="800" height="800" style="border: 1px solid black"></canvas>
<pre id="debug"></pre>
</body>
</html>
```

下にdebug用の`<pre id="debug"></pre>`を挟んでいるので、値の確認は`$('#debug').text('hogehoge')`という感じで。
コールバック関数を使った再帰処理の例


```php:文字エンコーディングがUTF-8かの検証行う場合
function filter_encoding($val, $encording='UTF-8'){
	// 引数が配列の場合
	if (is_array($val)){
		// コールバック関数として再帰処理
		array_map('filter_encoding', $val);
	}

	// 検証
	if (mb_check_encoding($val, $encording){
		return $val;
	} else {
		// エラーの場合はログを取るなどの処理を記述
	}
}
```

別の関数でする場合は、mb_check_encoding()周辺をよしなにしてやってください。
関数「greppath」を作って、環境変数PATHにパスが含まれていない時だけPATHにパスを追加する

コードは以下の通りです。

```bash:~/.bashrc
function greppath() {
    local FOUND=0
    local IFS=':'
    local DIR
    for DIR in ${2}; do
        [ "${1}" == "${DIR}" ] && FOUND=1
    done
    [ ${FOUND} -ge 1 ] && echo "${1}" && return 0 || return 1
}
```

使用例その1。

```bash:~/.bashrc
if [ -d "${HOME}/bin" ] ; then
    if ! greppath "${HOME}/bin" "${PATH}" 2>&1 > /dev/null; then
        PATH="${PATH}:${HOME}/bin"
    fi
fi
```

使用例その2。

```bash:~/.bashrc
if [ -x /usr/local/bin/brew ]; then
    COREUTILS="$(/usr/local/bin/brew --prefix coreutils)"
    if [ -n "${COREUTILS}" ]; then
        GNUBIN="${COREUTILS}/libexec/gnubin"
        if ! greppath "${GNUBIN}" "${PATH}" 2>&1 > /dev/null; then
            PATH="${GNUBIN}:${PATH}"
        fi
        unset GNUBIN
    fi
    unset COREUTILS
fi
```

~/.bash_profileと~/.bashrcのどちらに書くか、は悩ましいところです、Emacsから呼び出すこともあることを考えると~/.bashrcがよいように思います。