OmniAICreator/Qiita-1.07M huggingface dataset:
fs.watchFileを使ってみた

## fs.watchfileとは?

　ファイルの変更を監視して、変化が起きたらcallback関数を呼び出して教えてくれる。node以外では見たことない気がするのは、不勉強かしら。
　とにかく、そういうファイルの変更を検知するやつを作りたかったので、こまかい動きを調べてメモしました。

* [File System Node.js v0.8.16 Manual & Documentation](http://nodejs.org/api/fs.html#fs_fs_watchfile_filename_options_listener)


## 実験に使ったコード
```javascript:watchfile.js
var fs = require('fs');

var filepath = 'message.txt';

// filepathが存在しなくても、watchFileはエラーとか出してくれないので、
// 先にfs.existsで調べておく
if (!fs.existsSync(filepath)) {
	console.error('%s doesn\'t exist.', filepath);
	process.exit();
}

console.log('start watch: %s', filepath);
fs.watchFile(filepath, function (curr, prev) {
	// プロパティ丸ごと出力してもらう
	console.dir(curr);

	// 以前のmtimeと比較
	console.log('the current mtime is: ' + curr.mtime);
	console.log('the previous mtime was: ' + prev.mtime);
});
```

## 分かったこと
### 開始時に、指定したfilepathが存在しなくても、特にエラーは発生しない。
- なので、その前に自分でfs.existsとかしてあげる必要がある。(上のコード参照)

###ファイル名を変更しても、ファイルの変更とはみなされない。
- ただし、ファイル名を変更した後も、監視は続いている。
- chmodとかは、ちゃんと変更とみなされる。

### callbackに帰ってくるのはstatオブジェクト。
  - なので、更新時間や属性などは即時でとれるが、ファイルの内容がどうなったかは、別途fs.readFileなどしないと分からない。
  - diff的な機能もなし。

### 対象がディレクトリでもちゃんと動く。
  - ディレクトリの中のファイルが変更された時、中にファイルが追加された時等ちゃんと検知します。
  - viで中身のファイル開いた時に、一時ファイルができるのも検知してしまうので、ちょっととまどった。(そりゃそうなんだけど)

### 当然、「常時待ち」のイベントをひとつ増やすことになる。
  - 例えばexpressサーバーとかは、平常時はhttpサーバーへのアクセスのみ待っている状態になっている。そこに別の常時待ちが入ってくると、なにかしら計算が狂うこともありうる。
  - 自分は、[start-stop-daemon](https://npmjs.org/package/start-stop-daemon)とexpressを組み合わせて使っていたので、daemon化する部分にwatchFileの開始処理も組込んでやる必要があった。

## そのうち調べる
- 監視周期1回の間に、変更が2回以上発生したら? (たぶん1回しか反応しないと思うけど)
- 存在しないファイル名を与えてwatchを開始、その後そのファイルが追加されたら? (たぶん反応しないと思うけど)
- unwatchも調べなきゃ……。
CentOS6.3にrvmでruby入れるメモ


##rvmをインストールする

 	$ bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

以下のメッセージが出て、インストールは終了するはず。

> Installing RVM to /usr/local/rvm/
    Creating RVM system user group 'rvm'

> RVM:  Shell scripts enabling management of multiple ruby environments.
RTFM: https://rvm.io/
HELP: http://webchat.freenode.net/?channels=rvm (#rvm on irc.freenode.net)
Cheatsheet: http://cheat.errtheblog.com/s/rvm/
Screencast: http://screencasts.org/episodes/how-to-use-rvm

>In case of any issues read output of 'rvm requirements' and/or 'rvm notes'

>Installation of RVM in /usr/local/rvm/ is almost complete:

 > * First you need to add all users that will be using rvm to 'rvm' group,
    and logout - login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`.

 > * To start using RVM you need to run `source /etc/profile.d/rvm.sh`
    in all your open shell windows, in rare cases you need to reopen all shell windows.


rvmを使えるように設定ファイルを読み込めと書いてあるので、
読み込み直す

	$ source /etc/profile.d/rvm.sh

`First you need to~`の件は「ちょっと何言ってるか分かんないです。」です。

##ruby入れる

	$ rvm install ruby 1.9.3

そうすると、以下のパッケージが必要だと教えてもらえるので入れる

	$ yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison

改めて

	$ rvm install ruby 1.9.3

しばらく時間がかかります。

	# Install of ruby-1.9.3-p362 - #complete 

無事にインストールできました。
irbrc

`active_support`等をirbでrequireするのが面倒な場合は`.irbrc`を設置する

```
vi ~/.irbrc
```

```
%w(pp active_support/core_ext tapp).each do |file|
  begin
    require file
  rescue LoadError
    puts $!
  end
end
```
`pp`, `active_support/core_ext`, `tapp`がrequireされた状態でirbが開始されるようになる。

他にも、IRB.confの設定もここで行える
http://www.ruby-lang.org/ja/old-man/html/irb.html
Rails 3.1で「/lib/assets」に設置した共通モジュールの使い方

Rails3以降ではautoloadが使えなくなって、共通モジュールの配置についてまとまった説明がなかったので、実際に動かしてみました。

WEBrick再起動していなくて、キャッシュが残ってちゃんと動いてなかったので、若干requireとincludeを修正しています、、、

***

```/lib/assets/hoge_module.rb
# -*- coding: utf-8 -*-

module  Hogehoge
    def test
      ※、処理
    end
end
```
とした場合、まずこのモジュールをアプリ実行時に自動的に読み込むようにするため、以下の設定をします。

```/config/application.rb
    # Custom directories with classes and modules you want to be autoloadable.
    # config.autoload_paths += %W(#{config.root}/extras)
    # ※、root直下のlibディレクトリ内のファイルを自動読み込み
    config.autoload_paths += %W(#{config.root}/lib)
    config.autoload_paths += Dir["#{config.root}/lib/**/"]
```

その後、コントローラ、ヘルパー、モデルでは以下のようにして使用します。

```/app/controller/application_controller.rb
# -*- coding: utf-8 -*-

require "hoge_module"
include Hogehoge

class ApplicationController < ActionController::Base
  protect_from_forgery

end
```

```/app/helper/application_helper.rb
# -*- coding: utf-8 -*-

require "hoge_module"

module ApplicationHelper

end
```

```/app/models/hoge.rb
# -*- coding: utf-8 -*-

require "hoge_module"

class Hoge < ActiveRecord::Base

end
```

これが、Rails3のお作法として合っているかは微妙ですが、処理を一つのファイルにまとめられます。
最も、こうやる前に設計でmodelに処理をまとめるなどで対応したほうが、スマートだと思います。
CentOS6.3にvim7.3入れたのでメモ


ほぼココを参考にしました。

[Vim7.3をソースからインストール](http://o.inchiki.jp/obbr/19)

##事の発端

開発に使っている仮想サーバのCentOS6.3ちゃんにも、素敵vim環境を整えてあげたいと思ったところ、NeoBundleが動かない。
目の前が真っ暗になった。

##vim-minimalだとだめなんだそうです。

CentOSは最小構成でインストールしてるとvim-minimalって機能削ってる版がインストールされているんだそうだ。
確かめるまで信じたくない。

	$ yum list installed | grep vim
	vim-minimal.x86_64     2:7.2.411-1.8.el6

目の前が真っ暗になった。

##vim-enhancedってのがつおいらしい

	$ yum install vim-enhanced
	Installing:
 	vim-enhanced        x86_64        2:7.2.411-1.8.el6          base        892 k

7.2。最新版じゃない、、だと！？

	Is this ok [y/N]: N

NOだよ！！
目の前が真っ暗になった。

##しかたないからソースから入れる事に。

~~まずは、アンインストールしておきましょうか~~
~~`$ yum remove vim-minimal.x86_64`~~
アンインストールすると`sudo`も消えて、`sudo`を入れると`vim-minimal`も入るらしいのでほっておきましょう。

あとは以下通りに進めて行きます。
[Vim7.3をソースからインストール](http://o.inchiki.jp/obbr/19)

そのまま実行して行きます

	$ yum install mercurial
	$ yum install ncurses-devel
	$ yum install make
	$ yum install gcc

多分、mercurialはvimのソースコード引っ張ってくる用で、それ以外はきっとvimをビルドする用。

	$ cd /usr/local/src/
	$ hg clone https://bitbucket.org/vim-mirror/vim

さっそくvimのソースを落としてきます。
結構時間かかるので、バクマン読むと良いと思います。
最近読んでめっちゃハマりました。

	$ cd vim73/
	$ ./configure --with-features=huge --enable-multibyte --disable-selinux --enable-rubyinterp
	$ make
	$ make install

ここは記事と違う部分で、ruby勉強ついでにvim入れてる節があるので
`--enable-rubyinterp`として、ruby用のオプションをつけています。

ここも結構時間かかるので、バクマン読むと良いと思います。

	$ vim --version
	VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Dec  6 2012 13:02:58)
	-ruby

やったーvim7.3が入ったぞ！
**-ruby**
目の前が真っ暗なった。

とりあえず、深追いはやめて、あとでやる事にしましょう。

最後に`$ vi`で`vim`を起動できるようにシンボリックリンクを作っておきます。

	$ ln -s /usr/local/bin/vim /usr/bin/vi

これでCentOSちゃんでも無事にNeoBundleなvim生活が送れそうです。
RubyMotion で Google Analytics SDK for iOS v2 (Beta)

半分は [RubyMotion ではじめるGoogle Analytics for iOS](http://watson1978.github.com/blog/2012/08/30/use-google-analytics/) の内容で良いが、差分。

## 使用するフレームワークが変更されている

Rakefile に記述するフレームワークの指定が変更されている。

```ruby
  app.frameworks << "CFNetwork"
```

の箇所を

```ruby
  app.frameworks << "CoreData"
  app.frameworks << "SystemConfiguration"
```

にする。

## 初期化

app_delegate.rb などの application(application, didFinishLaunchingWithOptions:launchOptions) で次のように初期化。

```ruby
    GAI.sharedInstance.tap do |gai|
      gai.trackUncaughtExceptions = true
      gai.dispatchInterval = 20
      gai.debug = true
      gai.trackerWithTrackingId("UA-XXXXXXXX-X")
    end
```

あとは、UIViewController を継承しているクラスなどを GAITrackedViewController を継承するように置き換えて、trackedViewName を設定してあげる。下記は UIViewController の代わりとなる MyViewController の例で、trackedViewName を自動的にその ViewController のクラス名になるようにしている。

```ruby
class MyViewController < GAITrackedViewController
  def viewDidLoad
    super
    self.trackedViewName = self.class.name
  end
end
```

参考ドキュメント : https://developers.google.com/analytics/devguides/collection/ios/v2/
メモ化したフィボナッチ

```ruby:fib.rb
#ふつうのフィボナッチ
def fib(n)
  (0..1).include?(n)? n : fib(n-2) + fib(n-1)
end

#メモ化したフィボナッチ
def cash_fib(n) 
  @cash ||= []
  @cash[n] ||= (0..1).include?(n)? n : cash_fib(n-2) + cash_fib(n-1)
end

#一瞬で計算が終わる
print cash_fib 1000
# => 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
```
参考
[Rubyで任意のメソッドをメモ化する](http://d.hatena.ne.jp/mickey24/20100906/1283769623)
Windowsでカレントディレクトリ以下の *.jpg を全部カレントディレクトリに引っ張りだす

コマンドプロンプトでこうする

```text
for /F %F in ('dir /S /B *.jpg') do move %F .¥
```

参考: [Studio ODIN - blog風小ネタ集 > MS-DOSでコマンドの実行結果を変数に入れる](http://www.odin.hyork.net/write/write0026.html)
ルビーラックワンライナーウェッブサーバー the final

```bash
ruby -rrack -e "Rack::Server.new(:app => Rack::Directory.new('.'), :Port => 8080).start"
```

`rackup` なんて(ry

## don't see also

* http://blog.udzura.jp/2011/02/08/rack-one-liner-server-simpler/

ウアアアアアっ昔の恥ずかしいブログ記事だぁぁぁあ

以下追記（こっちをストックするのは将来的に無駄になりますよ）

## the new age

Since `rack ~> 1.5.0`

* http://qiita.com/items/bfb448e18cc583a2083a

```bash
rackup -b "run Rack::Directory.new('.')"
```
rdfstore-jsを使うときの注意


　主にエラーハンドリングの処理で、イケてない部分が見つかったのでメモ。

## rdfstore-js
### パッケージ
- [rdfstore](https://npmjs.org/package/rdfstore)
- [antoniogarrote/rdfstore-js · GitHub](https://github.com/antoniogarrote/rdfstore-js)

### 実行環境
- node (v0.8.16)
- rdfstore (v0.7.0)

## store.executeについて
　```callback(success, result)```の形にはなっているが、実際にはSyntaxErrorが起きた時にはcallbackしないでエラー終了してしまう。

　現状では、executeしている部分をまるごとtry-catchで囲むか、rdfstore側のコードを修正するしかない。

　SyntaxError時に直接エラーをはいているのは、L22804のthrow。(ここをthrowじゃなくてreturnにすればうまく使える?)

## store.loadについて
　ファイルのロードに失敗した場合(たぶん厳密に言うと、指定したContentTypeでファイルが読めなかった場合)、L5294とL5295の```console.log```は、自分の環境ではいつもundefinedを返してきた。

　動作上は問題無いけれど、ログに邪魔なものが残るので、削っていいと思う。

**また何か気付いたり、pull requestやるぞ! とか思ったら追記します。**
代数的データ型を関数型(->)のみで表現する

いわゆるチャーチエンコーディング…かと思いきや、Boehm-Berarducciエンコーディングと呼ぶらしい(http://okmij.org/ftp/tagless-final/course/Boehm-Berarducci.html )。

```haskell:
{-# LANGUAGE Rank2Types #-}
import Prelude hiding (Maybe, Bool, Either)

type Unit = forall a. a -> a
unit :: Unit
unit = \x -> x

type Tuple a b = forall c. (a -> b -> c) -> c

pair :: a -> b -> Tuple a b
pair x y = \f -> f x y

type Either a b = forall c. (a -> c) -> (b -> c) -> c

left :: a -> Either a b
left x = \l r -> l x

right :: b -> Either a b
right x = \l r -> r x

type List a = forall b. (a -> b -> b) -> b -> b

nil :: List a
nil = \c n -> n

cons :: a -> List a -> List a
cons x xs = \c n -> c x (xs c n)

type Bool = forall a. a -> a -> a

false :: Bool
false = \f t -> f

true :: Bool
true = \f t -> t

type Maybe a = forall b. b -> (a -> b) -> b

nothing :: Maybe a
nothing = \n j -> n

just :: a -> Maybe a
just x = \n j -> j x

```
Padrinoのform_forをRailsの様にオブジェクトの状態ごとにmethodを変えたい時のアレ

Padrinoいいですよね。
View用のHelperも結構揃っててRails並にテンプレートが書きやすいのですが、
メソッド名が同じでも実装は違ってるのでRailsと同じ動作を期待するとアレッ・・・？
ってなることあります。

今回はform_forというformを定義するためのHelperに、
RailsとPadrinoの違いを若干解消するための話を書きます。

RailsのFormBuilderではform_forに渡したオブジェクトが、newしたばかりの、
ただのインスタンスだったら、formのmethodがPOSTになり、
DBに保存済みな値だったらPUTになるという振る舞いがデフォルトであるのですが、
Padrinoのform_forでは実装されていません。

これが使えると何が嬉しいかというと、Railsのscaffoldで生成されるテンプレートのように、
フォームの部分を_form.html.erbのように部分テンプレートとして切り出すことで、
新規投稿と、編集画面で同じフォームを簡単に扱うことができます。

Railsの実装を見てみると、ActiveRecordのpresisted?メソッドで、
データが保存されているかどうかをチェックしているようなので、
仮にPadrinoでも、ActiveRecordを使っているとしたら、以下のように
Helperを定義すると、Railsと似た様な挙動をさせることができます。

```ruby:app/helpers/foo_helpers.rb
Foo.helpers do
  def form_for_polymorphic(obj, base_url, options = {}, &block)
    request_method = obj.respond_to?(:persisted?) && obj.persisted? ? :put : :post
    url = request_method == :put ? "#{base_url}/#{obj.id}" : base_url
    form_for obj, url, :method => request_method, &block
  end
end                                                                                                                                                                                              
```

こんな感じで、form_forをラップするメソッドを書いてけば良いかと思います。

参考ページ：
1. [rails/actionpack/lib/action_view/helpers/form_helper.rb at beba8267c96a3dbc1f505ecc099dbf14db8dde4c · rails/rails · GitHub](https://github.com/rails/rails/blob/beba8267c96a3dbc1f505ecc099dbf14db8dde4c/actionpack/lib/action_view/helpers/form_helper.rb#L358)
2. [padrino-framework/padrino-helpers/lib/padrino-helpers/form_helpers.rb at master · padrino/padrino-framework · GitHub](https://github.com/padrino/padrino-framework/blob/master/padrino-helpers/lib/padrino-helpers/form_helpers.rb#L30)
PythonでN-Gram

[python-ngram](https://github.com/gpoulter/python-ngram)を使った

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import ngram

text = u'あいうえお'
index = ngram.NGram(N=2)
for term in index.ngrams(index.pad(text)):
    print term
```

結果

```
$ python sample.py 
$あ
あい
いう
うえ
えお
お$
```

他にもたくさん機能があるので、上記リンク先のチュートリアルなどを読むべし
検索もできるようだ

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import ngram

G = ngram.NGram(['joe','joseph','jon','john','sally'])
print G.search("joseph")
```

```
$ python sample.py
[('joseph', 1.0), ('joe', 0.18181818181818182), ('jon', 0.18181818181818182), ('john', 0.16666666666666666)]
```
google-code-prettifyで、onloadじゃない関数の呼び出し方


1. シンタックスハイライトにgoogle-code-prettifyを使う際、`onload`じゃちょっとアレかなー
2. [README](http://google-code-prettify.googlecode.com/svn/trunk/README.html)読んだら`addEventListener`の方法あった
3. あれ？古いIEは`addEventListener`だめじゃね？

という訳で、古いIEもいけるように`attachEvent`版も併記したものをメモ。

## 読み込ませるファイル

```HTML
<link rel="stylesheet" href="google-code-prettify/prettify.css">
<script src="google-code-prettify/prettify.js"></script>
```


## 関数呼び出し

```JavaScript
<script>
//<![CDATA[
(function() {
  if(window.addEventListener) {
    window.addEventListener('load', prettyPrint, false);
  }
  else if(window.attachEvent) {
    window.attachEvent('onload', prettyPrint);
  }
})();
//]]>
</script>
```

これでOK…かな？IE8はチェック済み。

Google先生にも華麗にスルーされるオールドIE。ver.8未満のIEは爆発しろ。
php 5.3 の Cannot use string offset as an array

次のコードは php 5.3 と 5.4 で結果が異なります。

```php
<?php
$str = "hoge";
var_dump($str[0][0]);
```

**5.4 の場合**

    string(1) "h"

**5.3 の場合**

    Fatal error: Cannot use string offset as an array in /home/ng/z.php on line 3

php 5.3 では、文字列のオフセット指定に、さらにオフセット指定することは出来ないようです（普通しないですが）。
階層になっているHashに対して、浅い順にキーを辿ってvalueを得る

自分用にメモ。車輪の再発明感が非常に強いんですが・・・

```ruby
h = {a: {b: {c: :d}}}
```

の時、

```ruby
h.recursive_fetch [:a, :b, :c]
 => :d 
```

ってなるメソッドをHashに追加しました。途中にKeyが無くてもExceptionが出ずに、

```ruby
h.recursive_fetch [:a, :e, :c]
 => nil
```

ってなるようにしてます。

```ruby
class Hash
  def recursive_fetch(keys = [], default = nil)
    keys.inject(self){|value, key|value.try(:[], key)} || default
  end
end
```

Railsだったら lib 下あたりに置いて、application.rb とか initializers 下あたりから呼ぶようにして使っています。
WindowsのコマンドラインからAdobe Readerを使用して印刷する

```bat
> "pathTo\AcroRd32.exe" /t z:\hello.pdf "Printer Driver Name"
```


> Windows のコマンドラインから Acrobat や Adobe Reader を使用して印刷する方法
> http://pdf-file.nnn2.com/?p=222
backbone.jsとWebWorkerを共存させた時に、backbone.jsでアンカー変更イベントが発生しない

##事象
MVCフレームワークとしてbackbone.jsを使用し、ページ内でWebWorkerのスレッドを起動すると、backbone.jsのアンカー(#xxx)変更イベントが発生しなくなる

##暫定処置
以下のようにコードを修正すると、正常に動作するようになります。

```javascript:backbone.js
// backbone.js  Line 796~

//$(window).bind('hashchange', this.checkUrl); 
var self = this;
window.onhashchange = function () {
   self.checkUrl();
}
```
Gitでレポジトリーを変更する

プライベートアカウントの費用を節約しようと[github](https://github.com/)から[bitbucket](https://bitbucket.org/)に移動したのでメモ。

まずは、bitbucketでレポジトリーの作成でインポートを行ってレポジトリーを移動。

```
#現在のレポジトリーを確認
$git remote -v
origin https://gitihub.com/xxx/yyy.git (fetch)
origin https://gitihub.com/xxx/yyy.git (push)
#新しいレポジトリーに変更
$git remote set-url origin https://xxx@bitbucket.org/xxx/yyy.git
#設定が反映されているか確認
$git -v
origin https://xxx@bitbucket.org/xxx/yyy.git(fetch)
origin https://xxx@bitbucket.org/xxx/yyy.git(push)
````
思ったより簡単でした。先月やっておけばよかった（汗
centOS6.3にvim7.3とtmuxをインストール


いい加減毎回調べるのが面倒になってきたのでメモ

```
sudo yum -y install mercurial ncurses-devel make gcc wget

cd /usr/local/src
sudo wget http://pkgs.repoforge.org/tmux/tmux-1.6-1.el6.rf.x86_64.rpm

sudo yum -y install tmux-1.6-1.el6.rf.x86_64.rpm

sudo hg clone https://vim.googlecode.com/hg/ vim73
cd vim73
sudo ./configure --with-features=huge --enable-multibyte --disable-selinux; sudo make; sudo make install
```
Time.parse の罠

ギャー

```sh
$ ruby-1.9.3-p327 -rtime -e "puts Time.parse('2012 02/28 12:10:09')"
 2013-02-28 12:10:09 +0900
```

という挙動で、2012 年通っていたテストが 2013 年にこけるようになったよおお。parse エラーになって欲しかった。
Excel で PERSONAL.XLS を勝手に開かないようにする

引用元：http://teppeis.hatenablog.com/entry/20090115/1232040314

1.適当な Excel ファイルを開く（同時に PERSONAL.XLS も開かれる）
2.PERSONAL.XLS のウィンドウを表示して、ウィンドウメニューから「表示しない」を選択
3.適当に保存して Excel を終了。
GAE/Pの文字化けを考えたいというお話

先週末からpythonを始めた初心者ですm(__)m

HKT48の公式ページのスケジュール
http://www.hkt48.jp/schedule/
をBeautifulSoupでスクレイピングしながらpythonのお勉強。

ローカルで動作させている分にはうまく取れてるんですが…
GAEにデプロイしたら文字化けの嵐orz

他のクラウドを利用することも考えてみたんですが、GAE/Pがどう振る舞ってるのかを、いい機会なので、きちんと整理したいなあと思う今日このごろであります。
Rack アプリを指定した URI 以下にマウントする (thin 編)

たとえば `/foo/bar/` 以下にマウントしたい場合，以下のようにする。

    $ RACK_BASE_URI=/foo/bar bundle exec thin --prefix /foo/bar start

ただし，アプリ内できちんと `RACK_BASE_URI` 環境変数に配慮していないとうまくいかない。
Padrino で標準のヘルパ等を使っている場合は，きちんと配慮してくれてます。
Ruby で手っ取り早く半角文字列を全角文字列に変換する．

moij gem を使います．

## インストール

    $ gem install moji

## 実行例

`"foo"` を `"ｆｏｏ"` に変換します．

```ruby
irb(main):001:0> require 'moji'
=> true

irb(main):002:0> Moji.han_to_zen('foo'.encode('utf-8'))
=> "ｆｏｏ"
```

`String#encode` で変換後の文字列エンコーディングを設定しておくのがポイントです． この例では `utf-8` の全角文字に変換しています．ただ単に `'foo'` としただけでは，`us-ascii` なので相当する全角文字がなく変換に失敗します．
MacのTimeMachineで、どのファイルがバックアップされたのかを確認する方法

----
MacOSX標準のTimeMachineは、1時間おきに差分バックアップをとってくれます。差分バックアップなので変更されたファイルだけバックアップしてくれるのですが、最近は1回のバックアップで合計400M分ほど、処理時間に15分ほどかかっています。
特に何をするわけも無くブラウザとtwitterぐらいしかやってないのにこのバックアップ量はおかしいです。なので、TimeMachineで何のファイルがバックアップされてるのか調べてみます。

tmutilのcompareでバックアップの差分を確認
----
MacOS 10.8(Lion)から、tmutilというコマンドが追加されていました。
[新・OS X ハッキング! 44 知らなきゃ損する「tmutil」の便利機能](http://news.mynavi.jp/column/osxhack/044/index.html)

どのファイルをバックアップしたのかを直接表示させる方法は分からなかったものの、「前回と前々回のバックアップ」の差分をcompareで出せました。

```sh:tmutil_comapre
macmini% cd /Volumes/TimeMachine_MacMini/Backups.backupdb/macmini/
macmini% tmutil compare 2013-01-20-222622 2013-01-20-183639 > /tmp/tmutil_com.txt
macmini% open /tmp/tmutil_com.txt                                                
```
![skitch-4.png](https://qiita-image-store.s3.amazonaws.com/0/7946/c9d804d0-c339-e53b-4d08-471777713eee.png)


最後にバックアップしたファイルの容量がでてきます。ここで360Mほどバックアップしてるのが確認できました。

このファイルをチェックして、Janetter(twitterクライアント)のログファイルと思われるsqliteファイルが200Mほど、MailクライアントのGMailアカウント部分のファイルがたっぷりとバックアップされてることが分かりました。これらはどちらも基本ネット上にバックアップがあるので、MacのTimeMachineからは対象外としておきます。

これで1回のバックアップ容量を900K程度におさえ、数秒で処理が終わるようになりました。

tmutilで他に出来ること
----
tmutilではTimeMachineのコントロールの他に
- snapshotの作成
- TimeMachineのバックアップ先HDDが無いときの、localへのバックアップのコントロール
- バックアップ対象へのファイル追加/バックアップ除外対象の追加
- バックアップファイルのリスト表示
等など、いろいろできそうです。

```sh
macmini% tmutil
Usage: tmutil help <verb>

Usage: tmutil version

Usage: tmutil enable

Usage: tmutil disable

Usage: tmutil startbackup [-b | --block] [-r | --rotation] [-d | --destination dest_id]

Usage: tmutil stopbackup

Usage: tmutil enablelocal

Usage: tmutil disablelocal

Usage: tmutil snapshot

Usage: tmutil delete snapshot_path ...

Usage: tmutil restore [-v] src dst

Usage: tmutil compare [-a@esmugtdEX] [-D depth] [-I name]
       tmutil compare [-a@esmugtdEX] [-D depth] [-I name] snapshot_path
       tmutil compare [-a@esmugtdEX] [-D depth] [-I name] path1 path2

Usage: tmutil setdestination [-a]  mount_point
       tmutil setdestination [-ap] afp://user[:pass]@host/share

Usage: tmutil removedestination destination_id

Usage: tmutil destinationinfo [-X]

Usage: tmutil addexclusion [-p] item ...

Usage: tmutil removeexclusion [-p] item ...

Usage: tmutil isexcluded item ...

Usage: tmutil inheritbackup machine_directory
       tmutil inheritbackup sparse_bundle

Usage: tmutil associatedisk [-a] mount_point volume_backup_directory

Usage: tmutil latestbackup

Usage: tmutil listbackups

Usage: tmutil machinedirectory

Usage: tmutil calculatedrift machine_directory

Usage: tmutil uniquesize path ...

Use `tmutil help <verb>` for more information about a specific verb.
```
RubyでUser Streamsを使ってhome timelineを取得

今更ですが、ユーザーストリームでホームタイムラインを取得したくなったので投稿します。

---

今回は、tweetstreamを使用しました。以下のコマンドでインストールしておいてください。

```
gem install tweetstream
```

以下コードです。非常にシンプルですね。記事にするまでのなかったかもしれません。

```ruby
require 'tweetstream'

TweetStream.configure do |config|
  config.consumer_key       = '********'
  config.consumer_secret    = '********'
  config.oauth_token        = '********'
  config.oauth_token_secret = '********'
  config.auth_method        = :oauth
end

client = TweetStream::Client.new
client.userstream do |status|
  puts "#{status.user.name}: #{status.text}"
end
```

タイムラインにツイートが加わるとそのツイートを表示してくれちゃいます。
NSArray/NSMutableArrayへのアクセス時に落ちてた話

単に「ちゃんと型合わせとけ」ってだけの話なのですが。。。　練習ついでにメモ。

あるときからデバッグメッセージこんなのが出て落ちるようになった。
```
-[__NSArrayI removeAllObjects]: unrecognized selector sent to instance 0x********
```

```Objective-C
// 起動時に保存された値ロード
NSMutableArray *mutableArray =  [NSKeyedUnarchiverunarchiveObjectWithData: [defaults dataForKey:@“hoge”]];

// (中略)

// 不要になった際に前削除する
[mutableArray removeAllObjects];
```

NSUserDefaultから取得するNSMutableArrayへのアクセス時。
アプリ起動後最初にアクセスするのが上記、全削除の部分。ここで落ちる。

データのセーブ・ロードとも問題無く、特にコード自体いじってない状態で突然出始めるようになったため、１〜２時間悩む。
結果、原因はNSUserDefaultに初期値設定している以下のコード。

```obj-c:
NSMutableDictionary *initialData = [NSMutableDictionary dictionary];
[initialData setObject:[NSKeyedArchiver archivedDataWithRootObject:[NSArray array]] forKey:@"hoge”];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:initialData];
```

“NSArray"で初期値設定してしまっていたのが原因。
正解は以下。

```obj-c:
[initialData setObject:[NSKeyedArchiver archivedDataWithRootObject:[NSMutableArray array]] forKey:@"hoge”];
```

デバッグ中のシミュレータからアプリを一旦全削除後、再度デバッグでインストールされた後から出ていた様子。
アプリが初期化されたため、改めて初期値が設定された際に顕在化したようで。
→デバッグビルドしたアプリを一旦削除して、インストール直後からの動作確認も忘れずやること（特に初期値の設定とか変えた場合）


それ以前にセーブ・ロードする型を合わせとけ。と。
WindowsのSublimeText 2でCtrl+CでCOMMAND MODEへ

* SublimeText2のVintageモードでvim風の操作が可能になるのはいいのですが、Windowsの場合INSERT MODE -> COMMAND MODEへの切り替えが esc か ctrl+[ しかできない！
* ctrl+c のが断然早いのに！macならそうするのに！

* ということで、Key Bindings - User を以下のように変更します。コピーは ctrl+shift+c に格下げです。

```
[
    { "keys": ["ctrl+c"], "command": "exit_insert_mode" },
    { "keys": ["ctrl+shift+c"], "command": "copy" }
]
```


* あとおまけですが、IMEのキーバインドで、 ctrl+c をIMEのオフに割り当てれば、COMMAND MODEへの移行時にIMEが閉じてくれて捗ります。
[vim]neocomplcacheに補完候補を追加する方法


coffeeScriptでコーディングする時に、javaScriptのsetTimeout等の補完候補が出ないのなんとかしたいと思って調べました。
##1 補完リストを作る
単純に「javascript.dict」で検索したら見つかりました。
https://github.com/cooldaemon/myhome/blob/master/.vim/dict/javascript.dict
これを適当な場所に置きます。
形式は単語と改行だけでいいみたいです。

```javascript:javascript.dict
Array
Boolean
Components
DOM
DOMMouseScroll
Date
Error
EvalError
Function
Image
Infinity
~以下略
```

##2 .vimrcに拡張子と補完リストのパスを設定する


{'拡張子':'パス'}をJSON的に書けばいいだけです。
 $HOMEはそのまんまHOMEディレクトリです。[~/]の場所です。

```php:.vimrc
let g:neocomplcache_dictionary_filetype_lists = {
    \ 'default' : '',
    \ 'vimshell' : $HOME.'/.vimshell_hist',
    \ 'scheme' : $HOME.'/.gosh_completions',
    \ 'coffee' : $HOME.'/Dropbox/util/vim_conf/dict/javascript.dict'
    \ }
```

##3 それだけ
vimで設定した拡張子のファイルを編集すると、補完候補が現れます。

```
$ vim test.coffee
```
![](http://sphotos-b.ak.fbcdn.net/hphotos-ak-prn1/529009_414578555288429_1755452115_n.jpg)
どうでもいいhtml一枚のウェブページを作って公開する

DropboxがDropbox Basicユーザに対しては2017/3/15にPublicフォルダの公開をやめると言う発表を行いました。
https://www.dropbox.com/help/16
このため、以下の記事の内容の実行は難しくなりました。

---

Macユーザ向けの解説です


どうでもいいhtml一枚のウェブページをつくる事が多い

[ナルホディウスですぞー](http://dl.dropbox.com/u/275354/tmp/naruhodius/index.html)

どうでもいいのでDropboxのPublicフォルダで公開している
公開までの流れを軽く説明したい

### 1) ビムを開く
### 2) html[tab]と打ってテンプレートを展開する
snippet管理に登録しておくと良い
僕は[neosnippet](https://github.com/Shougo/neosnippet)で

```html
snippet html
	<!DOCTYPE HTML>
	<html>
		<head>
			<meta http-equiv="content-type" content="text/html; charset=utf-8">
			<title>${1}</title>
			<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
			<script type="text/javascript" src="http://dl.dropbox.com/u/275354/lib/coffee-script.js"></script>
			<script type="text/coffeescript"></script>
			<link rel="stylesheet" type="text/css" href="http://dl.dropbox.com/u/275354/lib/cssreset-min.css">
			<style type="text/css" media="screen">
			</style>
		</head>
		<body>
		</body>
	</html>
```

としている
CoffeeScript Compilerは使うと開発が早い(タイプ数が少なくなる)ので入れておくと便利

### 3) DropboxのPublicフォルダに保存しながら開発する
### 4) nginxで確認する
dburlというコマンドを使う

```ruby
#!/usr/bin/env ruby

require 'optparse'
require 'ruby-debug'

@opt = OptionParser.new
@opt.on('-d') { |v| @is_development = true }
@opt.parse!(ARGV)

def main
  url = generate_url

  `echo #{url} | pbcopy`
  puts "#{url}"
end

def generate_url
  base = @is_development ? 'http://127.0.0.1:8080/' : 'http://dl.dropbox.com/u/275354/'
  path = File.expand_path(ARGV.shift).match(/Dropbox\/Public\/(.*)/)[1]
  url = base + path
end

main
```

死ぬほど適当だが、実行すると指定されたファイルのdropboxのパブリックリンクをコピーできる
-dをつけるとlocalhostのurlになるが、これは開発中に使う dropboxへのシンクには若干のタイムラグがあるので、nginxを手元で立ち上げている

nginx.conf

```
# place this to /usr/local/etc/nginx/nginx.conf

# daemon off;

events {
  worker_connections 48;
}

http {
  include       /usr/local/etc/nginx/mime.types;

  server {
    listen          8080;
    server_name     localhost;
    index           index.html;
    root            /Users/po/Dropbox/Public;

    access_log      /dev/null;
    error_log       /dev/null crit;

    expires     off;
    add_header  Cache-Control private;
  }
}
```

### 4) Dropboxで確認する
dburlでDropboxのurlをコピーして確認する

### 5) 公開する

以上です
hello golang+appengine

```gopher/hello.go
package gopher

import (
    "fmt"
    "net/http"
)

// The init function is called when your application starts.
func init() {
    // Register a handle for /hello URLs.
    http.HandleFunc("/hello", hello)
}

// hello is an HTTP handler that prints "Hello Gopher!"
func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello, Gopher!")
}
```

```gopher/app.yaml
application: gopher
version: 1
runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app
```

* [download go_appengine_sdk.zip](https://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go) && `unzip go_appengine_sdk*.zip`
* `google_appengine/dev_appserver.py gopher/` && [localhost:8080](http://localhost:8080)
* [create an appengine application](https://appengine.google.com)
* `google_appengineappcfg.py --oauth2 -A your_app_id update gopher/`
* [your_app_id.appspot.com](http://your_app_id.appspot.com)
ChromeのデベロッパツールにUserAgentの偽装機能がデフォルトでついてる

スクリーンの解像度とかも設定できる。すごいよGoogle。
##使い方
1.command+option+i->右下の歯車->Overridesで設定画面を開く
2.適宜設定
##キャプチャ
![キャプチャ](https://pbs.twimg.com/media/BBCux5SCQAA7Gwu.png:large)
Xcode Application Unit Testセットアップ


Logic Unit Testは、Testターゲットを作成するだけで実行できるが、肝心のアプリコードをテストするためのSenTestingKitでのApplication Unit Testはそのままでは動かなかったのでメモ

いろいろUnit testターゲットのCompile Sourcesにアプリのソースファイルを入れてみたり試行錯誤してみましたがうまくいきませんでした。
で、[Xcode Unit Testing Guide](http://developer.apple.com/library/mac/#documentation/developertools/Conceptual/UnitTesting/02-Setting_Up_Unit_Tests_in_a_Project/setting_up.html)を見たらに普通に書いてあったので、それによると、

1. Unit testターゲットのプロジェクトエディタで、Build Settingsのタブを開く
2. Build SettingsをAllに切り替え
3. LinkingのBundle Loaderの値を設定:`app_name`は特別なことをしてなければプロジェクト名
	- $(BUILT_PRODUCTS_DIR)/`app_name`.app/`app_name`
4. Unit TestingのTest Hostの値を設定
	- $(BUNDLE_LOADER)


これで、cmd+Uでいつでもテストが実行出来ます。

ただ、Bundle Loaderにアプリ内部のパスを設定してしてしまっているので、cleanした後にテスト動かすと、__bundle loader__ のファイルがないってエラーがでてしまうので、テストする際は予めアプリをBuildして置かなければならないみたいです。
なので、Edit SchemeでBuildの項目からテストターゲットはBuild for Testing以外のチェックを外して置くといいかもしれません。(少なくとも、Build for Runningのチェックは外さないとアプリのビルドができません)。

##まとめ
- GHUnitに頼り過ぎました
zshのプロンプト表示を定期更新


プロンプト左側の表示を０〜９までカウントアップさせる例
任意のコマンドを実行できるため、天気や時計、脈拍数なんかを表示させたら面白いかもしれない。

```.zshrc
setopt PROMPT_SUBST
COUNT=0
PS1='$COUNT $ '
# Handler for ALRM signal
TRAPALRM () { 
  if [ $COUNT -lt 10 ]; then
    COUNT=`expr $COUNT + 1`
  fi              
  zle reset-prompt # update PS1
}                 
TMOUT=1 # interval secound
```
RDoc で Twitter Bootstrap を使う

Twitter Bootstrap に互換性のある RDoc テンプレートを [Hanna Nouveau](https://github.com/rdoc/hanna-nouveau) という Generator を Fork して書きました。

http://ngs.github.com/hanna-bootstrap/

## インストール

RubyGems から

    gem install hanna-bootstrap

または git-clone

    git clone git://github.com/ngs/hanna-bootstrap.git

## 使い方

RDoc::Task の `generator` オプションに `bootstrap` を指定する

```ruby:Rakefile
RDoc::Task.new do |rdoc|
  version = File.exist?('VERSION') ? File.read('VERSION') : ""

  rdoc.generator = 'bootstrap'
  rdoc.main = 'README.rdoc'
  rdoc.rdoc_dir = 'rdoc'
  rdoc.title = "RDBI #{version} Documentation"
  rdoc.rdoc_files.include('README*')
  rdoc.rdoc_files.include('lib/   *.rb')
end
```

または、コマンドラインオプションで指定します

```sh:sample.sh
$ rdoc -o doc -f bootstrap lib  .rb
```
symfony2.1でルーティングされてないcontrollerのメソッドをテストする時

ルーティングされてるメソッドは基本clientクラスを作って実際にHTTPリクエストをしてhtmlを解析してテストしますが、ルーティングされてないメソッドはHTTPリクエストを介してはテストできないので、controllerクラスをインスタンス化してテストします

```php:BlogControllerTest.php
<?php
namespace My¥Bundle¥Test¥Controller;

use My¥Bundle¥Controller¥BlogController;
use My¥Bundle¥Entity¥Blog.php
use Symfony¥Bundle¥FrameworkBundle¥Controller¥Controller;
use Symfony¥Component¥HttpFoundation¥Response;
use Symfony¥Component¥HttpKernel¥Exception¥NotFoundHttpException;

class BlogControllerTest extends WebTestCase
{
    protected $blogController;

    public function setUp()
    {
        $kernel = static::createKernel();
        $kernel->boot();

        $this->blogController = new BlogController();
        $this->blogController->setContainer($kernel->getContainer());
    }

    // controllerクラスにwidgetActionが定義されていてかつ戻り値にResponseクラスが返るメソッドのテスト
    public function testWidgetAction()
    {
        $response = $this->blogController->widgetAction();
        $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $response);
    }

    // controllerクラスにprotectedなgetBlogが定義されていてかつ戻り値にオブジェクトが返ってくるまたは例外がthrowされるメソッドのテスト
    protected function testGetBlog()
    {
        $class = new \ReflectionClass($this->blogController);
        $method = $class->getMethod('getBlog');
        $method->setAccessible(true);

        // 例外が投げられる場合のテスト
        $is_ok = false;
        try {
            $method->invoke($this->blogController, 0);
        } catch (NotFoundHttpException $e) {
            $is_ok = true;
        }
        $this->assertTrue($is_ok);

        // オブジェクトが返ってくる場合のテスト
        $blog = $method->invoke($this->blogController, 1);
        $this->assertInstanceOf('Blog', $blog);
    }
}
BlocksKitのリファレンス流し読みメモ


[「iOSコーディングスタイルを変えてしまうBlocksKitの紹介」](http://d.hatena.ne.jp/h_mori/20120220/1329691866)を読んで興味が出たので、BlocksKitのリファレンスを流し読みしたメモ書きです。

[github](https://github.com/pandamonia/BlocksKit)
[Referrence](http://pandamonia.github.com/BlocksKit/Documentation/)


カテゴリで拡張されてる機能
--

- NSObject(BlocksKit) 
 - performSelectorのblock構文版が追加されてる
 - KVO関連のblock対応メソッド(addObserverForXXX,removeObserverXXX)が追加されている
- コレクションクラス(NSXXXSet NSXXXXArray NSXXXXDictionary)
 - eachやmap等が追加
 - 単発利用なら便利そうだが、繋げて使うなら[Underscore.m](http://underscorem.org)の方がよさそう。
- [NSCache(BlocksKit)](http://pandamonia.github.com/BlocksKit/Documentation/Categories/NSCache+BlocksKit.html)
 - NSCache使ったこと無いからよく分からない。。。
 - willEvictBlock と objectForKey:withGetter:
- [NSTimer(BlocksKit)](http://pandamonia.github.com/BlocksKit/Documentation/Categories/NSTimer+BlocksKit.html)
 - target/selectorのblock置き換え
 - scheduledTimerWithTimeInterval:block:repeats:
 - timerWithTimeInterval:block:repeats:
- [UIActionSheet(BlocksKit)](http://pandamonia.github.com/BlocksKit/Documentation/Categories/UIActionSheet+BlocksKit.html)と[UIAlertView(BlocksKit)](http://pandamonia.github.com/BlocksKit/Documentation/Categories/UIAlertView+BlocksKit.html)
 - delegateの代わりにblock構文が使える
- [UIControl(BlocksKit)](http://pandamonia.github.com/BlocksKit/Documentation/Categories/UIControl+BlocksKit.html)と[UIBarButtonItem(BlocksKit)](http://pandamonia.github.com/BlocksKit/Documentation/Categories/UIBarButtonItem+BlocksKit.html)
 - target/selector の代わり
 - あれUIBarButtonItemってUIControlの子クラスじゃなかったっけ?
- [UIGestureRecognizer(BlocksKit)](http://pandamonia.github.com/BlocksKit/Documentation/Categories/UIGestureRecognizer+BlocksKit.html)
- [UIPopoverController(BlocksKit)](http://pandamonia.github.com/BlocksKit/Documentation/Categories/UIPopoverController+BlocksKit.html)
- [UIView(BlocksKit)](http://pandamonia.github.com/BlocksKit/Documentation/Categories/UIView+BlocksKit.html)
 - touchイベントのblock化
- [UIWebView(BlocksKit)](http://pandamonia.github.com/BlocksKit/Documentation/Categories/UIWebView+BlocksKit.html)
 - ロード完了時などのイベント処理をblock化

インストール
----
CocoaPodで`pod 'BlocksKit'`
Gitリモートリポジトリの作り方

## サーバ側作業

### ユーザー作成

```
adduser gitrepo
usermod -a -G gitrepo nekogeruge
```

### リポジトリ作成

```
su - gitrepo
mkdir testproject.git
cd testproject.git
git --bare init --shared
```

## クライアント側作業

### クライアント側で作成したプロジェクトをpushする

```
mkdir testproject
cd testproject
git init
echo "git test" > readme
git add .
git commit -m "first commit"
git remote add origin ssh://configのHostに記述した名前/home/gitrepo/testproject.git
git push origin master
```

### cloneして変更を加えてpushしてみる

```
git clone ssh://configのHostに記述した名前/home/gitrepo/testproject.git
echo "oeeee" >> readme
git add .
git commit -m "change test"
git push origin master
```

```
git pull
cat readme
```
vim-powerlineをpowerlineにアップデートする

[Powerline &mdash; Powerline beta documentation](http://lokaltog.github.com/powerline/)

一時話題になった [Lokaltog/vim-powerline](https://github.com/Lokaltog/vim-powerline) は現在 [Lokaltog/powerline](https://github.com/Lokaltog/powerline) に置き換わっているらしい。
そしてPython製になったので+pythonが必要。というわけでMacにVimを入れなおした。気分で+rubyもつけてみた。あとpowerlineは--with-feature=bigが必要らしい。

```sh:install
brew install https://gist.github.com/raw/3423922/6ebf1005ff68d4791f35f03f4d33940c243cbd70/vim.rb --HEAD --enable-interp=ruby,python --with-feature=big --force
pip install --user https://github.com/Lokaltog/powerline/tarball/develop
```

これで新しくなった powerline を使えるようになった。どんな新機能があるのかはこれから試してみる。

追記
----

vim-powerline から powerline への変更点

- vim プラグインだけじゃなくなった
  - bash, zsh のプロンプト
  - tmux のステータスバー

ということのよう。そして現在はまだβ版ということもあって Mac + iTerm2 な環境で動作させるには最新のiTerm2よりさらに新しい（つまり自分でビルドしないといけない）バージョンが必要。

なのでおとなしく昔のvim-powerlineに戻した。
戻し方は [Lokaltog/vim-powerline](https://github.com/Lokaltog/vim-powerline) の develop ブランチを利用するだけ。
UICollectionViewで最下部までスクロールした場合に「続きを読む」処理をする

UICollectionView を使っていて、最下部までスクロールした場合に
続きのコンテンツを読み込む処理を行う。

# 実装

```objc
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    ImageCollectionHeaderView *headerView = nil;

    /*
     中略
     ここでヘッダーの生成を行う
     */

    if ([kind isEqual:UICollectionElementKindSectionFooter])
    {
        // 最下部のセクションの場合
        if (collectionView.numberOfSections == indexPath.section + 1) {
            /*
             続きを読む必要があるのか判定
             NUMBER_OF_SECTIONS : 読み込むべき section の数、無制限ならこの if 文は不要
             */
            if (NUMBER_OF_SECTIONS > indexPath.section) {
                // 続きを読む関数
                [self loadNextPage];
            }
        }
    }
    return headerView;
}

- (void)loadNextPage
{
    // 続きを読む処理を行う
    // この関数は複数回呼ばれるので、フラグを立てておいた方がいい
}

```
forなどで生成した複数コマンドをechoしてから実行する

コマンド ラインで for や while を使って複数コマンドを実行することがあります。
とはいえいきなり実行するのはコワイのでまずは echo で確認することが多いと思います。
意図した通りのコマンドが表示されたら次は echo を削除して再実行。

```sh
for f in * ; do echo mv $f $f.bak ; done
for f in * ; do mv $f $f.bak ; done
```

でも echo を消さずともパイプで sh に渡せば実行できますね。

```sh
for f in * ; do echo mv $f $f.bak ; done | sh -x
```

些細な違いですが、for の中身を書き換えないのでミスが起こりにくいし
なによりタイプしやすいです。
iPhoneアプリでステータスバーを消す

* ナビゲーターエリアでプロジェクトを選択する。
* 「TARGETS＞Summaryタブ」を選択する。
* Status BarのVisibility、「Hide during application launch」をチェックする。

また、Interface Builderでステータスバーが表示されているので、
アトリビュートインスペクタ「Simulated Metrics」のStatus Bar設定を「None」にする。
Data.Vault


任意の型をしまえるコンテナ(といっても当然破壊的変更はできない)。

```haskell:
% runhaskell
module Main (main) where
import           Data.Vault (Vault)
import qualified Data.Vault as V

sayHello :: Show a => V.Key a -> Vault -> IO ()
sayHello key v = maybe (return ()) print (V.lookup key v)

main :: IO ()
main = do
  poti <- V.newKey
  zero <- V.newKey :: IO (V.Key Int)
  let v = (V.insert zero 0 . V.insert poti "poti") V.empty
  sayHello zero v
  sayHello poti v
```

キーに型情報が入っているのでうまくいく。キーの生成に`ST`か`IO`のモナドが必要。

```
0
"poti"
```
変数名と変数の中身をセットでvar_dumpする

compactを使うといいんじゃないかな。

```php
<?php
$hoge = '123';
var_dump(compact('hoge'));
/*
array(1) {
  'hoge' =>
  string(3) "123"
}
*/
```

```php
<?php
//上記は
var_dump(array('hoge'=>$hoge));
//の省略記法
```
各iOSデバイスの画面サイズ

# iPhone

|device|size(pixel)|解像度(ppi)|
|:-----------|:------------:|:------------:|
|iPhone 3G / iPhone 3GS|480x320||
|iPhone 4(Retina 3.5inch)|960x640||
|iPhone 4S(Retina 3.5inch)|960x640||
|iPhone 5(Retina 4inch)|1136x640|326|
|iPhone 5s(Retina 4inch)|1136x640|326|
|iPhone 5c(Retina 4inch)|1136x640|326|

# iPad

|device|size(pixel)|解像度(ppi)|
|:-----------|:------------:|:------------:|
|iPad / iPad 2|1024x768|132|
|iPad(Retina)|2048x1536|264|
|iPad Air|2048x1536|264|

#iPad mini

|device|size(pixel)|解像度(ppi)|
|:-----------|:------------:|:------------:|
|iPad mini|1024x768|163|
|iPad mini(Retina)|2048x1536|326|
ギークハウス武蔵小杉での勉強会の成果


[先日行われましたギークハウス武蔵小杉での勉強会](http://atnd.org/events/35453)で教えてもらったことを使って、[こんなもの](http://geesugitan-console.herokuapp.com/game/WebBuild.html)を作りました。

![ぎー杉たんゲーム](https://www.dropbox.com/s/qhq4mdgga333hir/Screen%20Shot%202013-01-19%20at%2023.03.24.png?dl=1)

音をたどってカプセルを発見するゲームですが、はっきり言って糞つまらないです。

なお、このモデルは、自分でBlenderを使ってモデリングしたものです。
![Blender画面](https://www.dropbox.com/s/hz6yp191611wi8t/Screen%20Shot%202013-01-19%20at%2023.12.57.png?dl=1)

今後はゲーム性とか、操作性を追求して何かスマートフォンで動かせるようなものでも出していこうかと思っています。

もしくは、ゲームとは関係なく、なんかしらのユーティリティーツールもUnityを使うとクロスプラットフォームなものが作れるんじゃないかなぁと思っているので、そう言うことも調べようかなぁ。
UIAlertViewを表示したあと、rootViewControllerがnilになっている問題


今、Remote Pushを実装しています。やりたい事としては

- Pushが来たらAlertを出す
- AlertでOKを押すと、どの画面にいるか判断して遷移する

です。ので、今のViewControllerをとらねばなりません。

## 問題
そこで、Alertを出して、そのデリゲートで

```objc:
[UIApplication sharedApplication].keyWindow.rootViewController
```

と書いていたのですが、なんとこれが、nilなのです。

けど、これをAlertを出す前にやると取得されます。

どうやら、Alertを出すと、keyWindowがAlertViewのものに変わってしまっており、そのrootViewControllerは設定されてないため、nilっぽいです。

これは、困った。困った。

## 解決策
ただ、今回は、Pushのときなので、AppDelegateに書いているので

```objc:
self.window.rootViewController;
```

で取得出来ました。よかったよかった。

## 課題
これ、今回はAppDelegateだったからよかったものの、他の時ってどうするんだろう。

そんなことやること殆ど無いからいい気がするけども、気になる。

知ってる方おられましたら教えて下さい！
JavaScript でカリー化


カリー化と部分適用は違いがよくわからなかったので調べてみました。

Wikipedia によればカリー化とは・・・

> 複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。

引数の適用までは行わないそうです。

JavaScript で実装するとすると以下のような感じでしょうか。

```js
Function.prototype.curry = function (context) {
  var func = this;
  var slice = Array.prototype.slice;
  return function partial() {
    var args = slice.call(arguments);
    if (args.length >= func.length) {
      return func.apply(context, args);
    } else {
      return function () {
        var argArray = slice.call(arguments);
        return partial.apply(context, args.concat(argArray));
      };
    }
  }
};
```

これでカリー化できます。

```js
function sum(a, b, c) {
  console.log(a + b + c);
}

sum.curry()(1)(2)(3);
// 6
```

context 付きでも。

```js
var greeter = {
  greeting: 'Hey,',
  greet: function (adj, noun) {
    console.log(this.greeting, adj, noun);
  }
};

greeter.greet.curry(greeter)('pretty')('girl');
// Hey, pretty girl
```

ただしこれだと部分適用時に、`Function.prototype.bind` を使ったときのように `length` が減っていかないのが残念です。

```js
console.log(sum.length);
// 3
console.log(sum.bind(null, 1).length);
// 2

console.log(sum.curry().length);
// 0
console.log(sum.curry()(1).length);
// 0
```

何かうまい方法はないんでしょうか？
Data.Conduit


噂のconduit。今回は標準入力触るスクリプトにしたのでconduit.hsみたいな感じで以下を保存。標準入力への入力を大文字にするだけ。`.`の入力で終了する。

```haskell:
module Main (main) where
import Data.Char (ord, chr, toUpper)
import Data.Conduit
import qualified Data.Conduit.Binary as B
import qualified Data.Conduit.Util as U
import qualified Data.ByteString as BS
import Data.Word (Word8)
import System.IO (stdin, stdout)

main :: IO ()
main = runResourceT $ do
  B.sourceHandle stdin
    $= B.takeWhile (\c -> c /= word8 '.')
    $= filterUc
    $$ B.sinkHandle stdout
  return ()
  where
    word8 = fromIntegral . ord

filterUc :: Monad m => Conduit BS.ByteString m BS.ByteString
filterUc = U.conduitState
           ()
           (\() str -> return $ U.StateProducing () [ucString str])
           (\() -> return [])
  where
    uc :: Word8 -> Word8
    uc = fromIntegral . ord . toUpper . chr . fromIntegral
    ucString :: BS.ByteString -> BS.ByteString
    ucString = BS.map uc
```

`Source`と`Sink`を`$$`で合体させると処理が走り、何らかの値を出力する。ここでは`sourceHandle`と`sinkHandle`を使って`Handle`ベースのごく自然な`Source`と`Sink`を作って動かしてる。`m`は任意のモナドでいいのだけど、`IO`扱う時は`ResourceT`を要求される。`Conduit`がフィルタ的なもので、`Source`と`Sink`の間に好きなだけ挟める。今回みたいに`m`が`IO`をベースとしたモナドなら色々できるはず。

`Conduit`を間に挟む場合は*nixの|ほど単純ではなく、型の都合で`$=`と`=$`と`=$=`を使い分けないとならない。とはいえ、Source `$=` Conduit == Source、Conduit `=$` Sink == Sink、Conduit `=$=` Conduit == Conduit ってだけだから、ま、そんな苦じゃないはず(=のつく方にConduit（導管）を置くって覚えればいいだけ)。

一応実行してみると以下の通り。

```
% runhaskell conduit.hs
abcdefg
ABCDEFG
This is Haskell.
THIS IS HASKELL
```

自分でconduit定義する時は`stateConduit`を使うのが常套手段なのかな。あと、複数個のストリーム扱う時はどうすんだろ。
git-resetは結局何を戻すのか


　gitレポジトリの状態を前に戻すコマンド```git reset```について、覚えるために自分用メモ。

## 参考資料
- [git reset についてもまとめてみる - murankの日記](http://d.hatena.ne.jp/murank/20110327/1301224770)
  -  参考資料というか、これだけではよくわからなかった部分を今回整理してみました、という感じ

## usage

　```git reset -h```で出てくるusageはこんな感じ。

```
git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]
```

　いろいろオプションがあるけれど、普通に使う分には、だいたい以下のものを把握してればいいみたい。

```
git reset [--soft | --hard] [HEAD | HEAD^]
```

　次の項から、この`[--soft | --hard]`及び`[HEAD | HEAD^]`がどういう意味を持つのか、まとめてみる。

### HEADとHEAD^
　この部分は、「状態をどこまで戻すか」の指定をしている。`HEAD`と`HEAD^`はそれぞれ、最新のコミットの位置・そのひとつ前のコミットの位置を指す。

　ただし`HEAD`は、[ここ](http://d.hatena.ne.jp/murank/20110327/1301224770)の図では「どこまでコミットしているか」という意味で使われているので、すこしこんがらがった。そりゃぁ最新のコミットという意味なので、そういうことなんだけど。

　なお、ここにはコミットのidを入れてももちろんOK。`HEAD`と`HEAD^`は代名詞なんですね。

### --softと--hard
　```git reset```はともかく、状態を前に戻すコマンド。しかしgitにおける「状態」は、

- HEAD (現在の最新コミットの状態)
- index (何をaddしたか・addした時点でのファイルの状態)
- working tree (いま現在のファイルの状態)

と3つ考えられる。このうちのどれを取り扱うか指定しているのが、この`--soft`・`--hard`などのオプションだ。

　どのオプションを付けると、何が操作対象になるかは、以下の表の通り。

|             | HEAD  | index   | working tree |
|:------------|:-----:|:-------:|:------------:|
| --soft      |   o   |         |              |
| (no option) |   o   |   o     |              |
| --hard      |   o   |   o     |  o           |

　要するに、

- やってしまったコミット(だけ)をなかったことにしたかったら、`--soft`
- addもなかったことにしたかったら、オプションなし
- ファイルの変更自体をなかったことにしたかったら、`--hard`

ということ。また言い換えると

- 現在のファイルの中身が変わっちゃ困るなら、`--hard`はやっちゃダメ
- addしたものを忘れられちゃこまるなら、オプションなしでは危ない。`--soft`をつけよう。
- コミット位置を変えたくないなら、```git reset```使うな…ではなく、戻す先を`HEAD`にしておけば安心ですね。

という感じ。


## まとめ
　分かってしまえば、

```
git reset <何を戻す?> <どこまで戻す?>
```
というだけの話だったんですね。納得。


　まぁ、ミスを修正するためのコマンドにしてはややこしいっすよね。「ええっ! コミットをなかったことにされると困るぞ…!? git resetこわっ!」とか思ってました。

　でもこういう理解をしておけば、「何をミスったのか」「どこまで戻れば帳消しにできるのか」だけ考えればコマンド打てるので、使えそうな気がしてきました。
jQueryでセレクトボックスの操作　

ラジオボタンでセレクトボックスの中身を動的に変更しつつ、
offにチェックを入れた場合にはdisabledを設定し選択出来なくなるようにする。
また、offに設定された場合には全てvalue="0"の要素になるようにする。
「Aの項目でYESと答えないとBの項目は入力できない」なんて時に使える。

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>Sample</title>
        <script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
        <script src="./sample.js"></script>
        <style>
            .nodisp{ display: none; }
        </style>
    </head>
    <body>
        <form>
            <div>
            	<input type="radio" name="radio" value="1" checked="checked">on
            </div>
            <div>
            	<input type="radio" name="radio" value="0">off
            </div>
            <div>
            	<select id="select">
            	</select>
            </div>
            <div>
                <button type="submit">送信</button>
            </div>
        </form>
        <select id="select_hidden" class="nodisp">
            <option value="0">選択できません</option>
            <option value="1">選択肢1</option>
            <option value="2">選択肢2</option>
            <option value="3">選択肢3</option>
        </select>
    </body>
</html>
```

```js:sample.js
$(function() {
    changeSelect();

    $("input[name=radio]").on('change', function() {
        changeSelect();
    });
});

function changeSelect() {
    $("#select").empty();
    $("#select").append($("#select_hidden option").clone());

    if ($("input[name=radio]:checked").val() == 1) {
        $("#select").val(1);
        $("#select option[value=0]").remove();
        $("#select").removeAttr("disabled");
    } else if ($("input[name=radio]:checked").val() == 0) {
        $("#select").attr("disabled", "disabled");
        $("#select").val(0);
    }
}
```
XCodeのDashプラグインをインストールする方法のメモ 

Dashは軽くて早いリファレンスビュアーです。これをXCodeから使えるようにするプラグインがあったのでそれを入れてみます。

```sh
mba% git clone git://github.com/omz/Dash-Plugin-for-Xcode.git
mba% open Dash-Plugin-for-Xcode
# XCodeでビルド
mba% ls ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/OMQuickHelp.xcplugin/
# 矢印が出来てることを確認
# XCodeを再起動
```
これを入れると、XCodeのエディタ上でoption+クリックで、直接Dashが起動するようになりました。

アンインストールは ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/OMQuickHelp.xcplugin/ を削除してXCodeを再起動します。
Lubuntu でキーボードの Repeat delay と Repeat interval を設定

※これあかんやつかもしれん

Lubuntu 13.04 で lxsession が無い状態でこれやると LXPanel が起動しなくなった．

(追記ここまで)

GUI からの設定 (Preferences > Keyboard and Mouse) だといくら変えてもまるで反映されないので仕方なく設定ファイル (テキストファイル) を手で編集する．

```~/.config/lxsession/Lubuntu/autostart
@xset r rate 250 50
```

autostart ファイルが無ければ作ってやる．

250 の方が delay で 50 の方が repeat．数値は各自で最適なものを探して下さい．ターミナルで `xset r rate 300 100` とか打つだけで設定は即座に変わるので試すのは簡単です．

`~/.xsessionrc` や `~/.xprofile` に書いても無駄だった (この辺よく分からない)．
ParseのPushNotificationのJSON


ParseのWebのDashboardから、Pushが送れるのですが、そのJSON形式が、iPhoneのものと統一性はなく、ドキュメント化されてないので、メモしておきます。


````
{"alert":"test","badge":"21","sound":"","action":"1"}
````

こんな感じで、書くと、iOSでは

````
{
    action = 1;
    aps =     {
        alert = test;
        badge = 21;
        sound = "";
    };
}


````

こんな感じで取得出来ます。これが、iOSのRemote Pushでは正式な形なので、この形式でParseのDashboadで入力していたら、できなかったので。

alertとsoundとbadgeはかってに、apsに入るんでしょうね。iOSとAndroidといろいろParseは対応しているから、独自な感じになってるのかと思います。


しかし、Parse便利すぎ！


### 参考
- ParseのPush Notification Guide
https://www.parse.com/docs/push_guide#top/iOS
- AppleのPushのドキュメント
http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html
Lubuntu で Caps Lock を Left Control に変更

毎度おなじみ設定．GNOME の世界から抜け出すとこういうところで微妙に困ると思い知った．

```~/.xmodmap
remove Lock = Caps_Lock
keysym Caps_Lock = Control_L
add Control = Control_L
```

```~/.xsessionrc
xmodmap ~/.xmodmap
```
Lubuntu でタッチパッドの右端スクロール機能をオフ

```~/.config/lxsession/Lubuntu/autostart
@synclient VertEdgeScroll=0
```

autostart ファイルが無ければ自分で作る．

# 参考

* http://yasshan.way-nifty.com/lubuntu/2010/11/synclient-1fe9.html
TwitterAPIからコミュニティ解析し、リスト作成を補助するサービスをリリースしました


![SmartList img](http://cdn-ak.f.st-hatena.com/images/fotolife/m/mosa_siru/20130118/20130118203012.png)

[Twitter SmartList](http://smartlist.bz/)

自動であなたの属するコミュニティを解析し、ビジュアライズした上でリスト作成ができます。

便利で、コミュニティ解析を見るだけでも楽しいので、ぜひ試してみてください！

##特徴

- 卒論で研究している、複雑ネットワークのコミュニティ分類手法の高速化を利用しています。
- Twitter APIが非常に曲者でした。詳しくは[Qiita(TwitterAPI devise連携/グラフ可視化/データの効率的格納/API高速化)](http://qiita.com/items/ea2c5f7faec66347a10f)を参照。並列処理で速くしたりしてます。
- コミュニティ分類抜きにしても、実働2週間ほどかかってます。中でもUIデザインは非常に苦労しました。JQuery PowerTipが便利。

##使用した技術

標準的なRailsの構成ですが、データ格納のためにRedisを利用してます。コミュニティ解析ではPythonのNetworkXライブラリを利用しています。

- 特徴的なgem: Parallel(並列処理), Resque(遅延実行)
- サーバー：Nginx,unicorn (+capistrano)
- 認証：devise, omniauth
- DB: MySQL, redis
- assets: coffeescript,scss,less,haml (twitter bootstrapを利用)
- RubyとPythonはXMLRPCで同期通信