OmniAICreator/Qiita-1.07M huggingface dataset:
Capybara + FactoryGirlでの、TwitterのOAuth(Omniauth)認証を使ったRailsアプリのテストの書き方サンプル


### 追記　2012/09/22
モック部分、シンボルだとうまくいかないので文字列で"uid"という風に書かないといけません。修正しました。


初めてTDDをやってるのですけど、OAuth認証のテストのやりかたを調べるのに時間がかかったので、後のためにここに書いておきます。

```ruby:auth_spec.rb
#coding: utf-8
require 'spec_helper'
describe "A logged in user" do
  before do
    OmniAuth.config.test_mode = true
    user = FactoryGirl.create(:user)
    OmniAuth.config.mock_auth[:twitter] = {
      "uid" => "11111",
      "provider" => "twitter",
      "info" => {
        "description" => "こんにちはこんにちは！　かとりょーです！"
      }
    }
      visit "/auth/twitter"
  end

  after do
    OmniAuth.config.test_mode = false
  end
  describe "in items page" do
    it "should add an item by the user" do
      visit items_path
      click_link "宣伝一覧"
      click_link "宣伝を登録する"
      fill_in "item_body", :with => "アナテマ・フィジクスをぜひプレイしてみて！"
      click_button "登録"
      click_link "宣伝一覧"
      page.should have_content("アナテマ・フィジクスをぜひプレイしてみて！")
      page.should have_content("Edit")
      click_link "ユーザー一覧"
      page.should have_content("denki")
    end
  end
end
```

です。

>
OmniAuth.config.test_mode = true

と

>
OmniAuth.config.mock_auth[:twitter] = ｛:uidなど｝

がポイント。
モックをauth_spec.rbのほうで作ってしまって、フィクスチャで作ったユーザーには/auth/twitterにアクセスしてもらうことで、OAuth認証が完了します。OAuthのgemはomniauth-twitterを使ってます。

FactoryGirlで作るフィクスチャは、以下のようにしました。

```ruby:factories.rb
#coding:utf-8
FactoryGirl.define do
  factory :item do
    body "アナテマ・フィジクスを見てね！" 
    user
  end
  factory :user do
    sequence(:name_twitter) { |n| "denki#{n}" }
    sequence(:uid_twitter) { |n| n + 1000 }
    point 5
  end

  factory :retweet do
    item
    user
  end
end
```


## 参考
https://github.com/intridea/omniauth/wiki/Integration-Testing
OmniauthのGithubのwikiには、モックは

>
:provider => 'twitter',

という風に書くように指定されているが、実際はこれだとうまくいかなかったりするので、Stackoverflowの
http://stackoverflow.com/questions/9730886/rails-rspec-and-omniauth-integration-testing
で教えられるように、文字列で

>
"provider" => "twitter",

と書くとよい。
iOS 6 でマップアプリの経路を開く

``` objc
- (void)openMapsWithLatitude:(double)latitude longitude:(double)longitude
{
    // openMapsWithItems が定義されていれば実行
    Class itemClass = [MKMapItem class];
    if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {
        CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];

        // 緯度経度から逆変換して位置情報取得
        CLGeocoder *geocoder = [[CLGeocoder alloc] init];
        [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
            MKPlacemark *placemark = [[MKPlacemark alloc] initWithPlacemark:[placemarks objectAtIndex:0]];
            
            MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
            NSArray *mapItems = [NSArray arrayWithObjects:mapItem, nil];
            // 歩いた場合の経路を表示するオプション
            NSDictionary *launchOptions = [NSDictionary dictionaryWithObjectsAndKeys:MKLaunchOptionsDirectionsModeWalking, MKLaunchOptionsDirectionsModeKey, nil];
            [MKMapItem openMapsWithItems:mapItems launchOptions:launchOptions];
        }];
    }
}

```

こんな感じで。
review-pdfmakerをmacで使ってみる

HTMLやepubを出力するだけなら、reviewのインストールはとても簡単。

* https://github.com/kmuto/review/blob/master/doc/quickstart.rdoc

PDF出力には、TeX環境が必要らしい。

* http://studio.tgl.jp/blog/?p=1729
* http://fumi.me/2012/05/17/review/

MacTeXというのを入れる手があるらしい。ちなみに2GB、展開して4GB…。

入れてみたが、何やらエラーになる。うーむ。

```
/Users/yhara/sprk2012/book % PATH=$PATH:/usr/texbin; review-pdfmaker sample.yaml
compiling sample.re
No such directory - /Users/yhara/Dropbox/proj/event/sprk2012/book/sty
This is e-pTeX, Version 3.1415926-p3.3-110825-2.4 (utf8.euc) (TeX Live 2012)
 restricted \write18 enabled.
entering extended mode
(中略)
! LaTeX Error: File `jumoline.sty' not found.
(後略)
```

とここで、先ほどの参考リンクにサンプル本があるのに気づく。

* https://github.com/takahashim/review-sample-book

これをgit cloneして、src/以下でpdfmakerするとbook.pdfが生成された。やったね。
あとはこれをベースに本文を書いていけば良さそう。
webdriverのuserAgentを変更する

webdriver-user-agentをインストールしたら簡単に出来たのでメモ。。

以下gemをインストール

+ [selenium-webdriver](http://rubygems.org/gems/selenium-webdriver)
+ [webdriver-user-agent](http://rubygems.org/gems/webdriver-user-agent)

```ruby:
require 'selenium-webdriver'
require 'webdriver-user-agent'

  driver = UserAgent.driver(:browser => :chrome, :agent => :iphone, :orientation => :landscape)
  driver.get 'http://www.yahoo.co.jp/'
  driver.current_url.should == 'http://m.yahoo.co.jp/'
```

chromeブラウザが開いて、Yahooのサイトがiphoneと認識されて表示されます。
user-agentのオプションについてはこんなかんじ。

#### browser =>
+ :firefox (default)
+ :chrome

#### agent =>
+ :iphone (default)
+ :ipad
+ :android_phone
+ :android_tablet
+ :random

#### :orientation =>
+ :portrait (default)
+ :landscape
NodeList に map メソッドがない(call の使い方)

querySelectorAll でノードを取得したら Array でなく NodeList なので map メソッドがない。
調べたら call メソッドを使うことで解決できた。

```html:call_sample.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>call sample</title>
    <script type="text/javascript">
    addEventListener('DOMContentLoaded', function () {
        var elms = document.querySelectorAll('tr>td:nth-child(2)');
        var names = Array.prototype.map.call(elms, function (elm) {
            return elm.firstChild.data;
        });
        console.log(names);
    });
    </script>
  </head>
  <body>
    <table>
      <tr>
        <th>作家名
        <th>作家名読み
      <tr>
        <td>太宰 治
        <td>だざい おさむ
      <tr>
        <td>小泉 八雲
        <td>こいずみ やくも
      <tr>
        <td>夢野 久作
        <td>ゆめの きゅうさく
  </body>
</html>
```
resources を nest するときは shallow を使うと幸せになれる

scaffold を制するものは rails を制す、という言い伝えがありますが、 `rails g scaffold User` などとすると routes.rb に突如現れるのが、 resources というやつです。

いまここに、Group と User という2つのモデルがあり、 Group が `has_many :users` で、 User が `belongs_to :group` だとしましょう。よくある関係ですね。

このような場合に、resources を

```ruby:config/routes.rb
resources :group do
  resources :user
end
```

こんな風に nest すると、新規に User を作る時の URL が /groups/:group_id/users/new となり、自然な形で group_id を渡すことができます。

ところが、このように routes を定義すると、いざ User が生成された後にその User を show するには /groups/:group_id/users/:id などとしなければならなくなってしまいます。
これは冗長ですね。 User の id が group に寄らず unique であるなら、 /users/:id で参照出来て然るべきです。

そこで、shallow です。

```ruby:config/routes.rb

resources :group, shallow: true do
  resources :user
end
```

こうすると、なんと、

```sh
# rake routes
 group_user_index GET    /group/:group_id/user(.:format)          user#index
                  POST   /group/:group_id/user(.:format)          user#create
   new_group_user GET    /group/:group_id/user/new(.:format)      user#new
        edit_user GET    /user/:id/edit(.:format)                 user#edit
             user GET    /user/:id(.:format)                      user#show
                  PUT    /user/:id(.:format)                      user#update
                  DELETE /user/:id(.:format)                      user#destroy
      group_index GET    /group(.:format)                         group#index
                  POST   /group(.:format)                         group#create
        new_group GET    /group/new(.:format)                     group#new
       edit_group GET    /group/:id/edit(.:format)                group#edit
            group GET    /group/:id(.:format)                     group#show
                  PUT    /group/:id(.:format)                     group#update
                  DELETE /group/:id(.:format)                     group#destroy
```

**な、なんて美しいんだ。。！**

何が起きているかというと、user_id を指定しない action である index, new, create の3つは group_id を必要とし、それ以外の action では user_id のみを指定すればよい、ということに、たったの "shallow: true" だけでなってしまったのです。

もちろん、以下のように action を拡張した場合

```ruby:config/routes.rb

resources :group, shallow: true do
    resources :user do
      get :search, on: :collection
      post :follow, on: :member
    end
end
```

には、

```sh
# rake routes
（抜粋）
search_group_user_index GET    /group/:group_id/user/search(.:format)   user#search
            follow_user POST   /user/:id/follow(.:format)               user#follow
```

ご覧の通り、 on: :collection で定義した :search の方にのみ、:group_id が必須になっています。
そうですそうです、そうして欲しかったんですよ！

さらに深く resources を nest した場合にも、 shallow:true は1つだけで大丈夫。

```ruby:config/routes.rb

resources :group, shallow:true do
  resources :user do
    resources :entry
  end
end
```

この場合、entries#new は /user/:id/entries/new となり、 entries#show は /entries/:id となります。

最後に、おそらく多くの方が form でつまずくと思うので、その時はこれを読みましょう: <a href="http://stackoverflow.com/a/9944554/683157" target="_blank">http://stackoverflow.com/a/9944554/683157</a>

Author: [kuboon](https://plus.google.com/112722233959990837559?rel=author)
（db2_import.sh） IXF形式のデータをDB2へインポート

```sh:db2_import.sh
# db2_import.sh
#================================================
# IFX形式でExportされたデータをDB2へインポート
#================================================

#------------------------------------------------
# 環境設定
#------------------------------------------------
AIX_USER="userid"
AIX_PASS="password"
DB_ID="DB_ID"
DB_SCHEMA="DB_SCHEMA"
LOG_FILE="/home/username/work/db_import/IMPORT.log"
IMPORT_PATH="/home/username/work/db_import/data"

#------------------------------------------------
# 開始ログ出力
#------------------------------------------------
echo 処理開始時間： `date +%Y%m%d%H%M%S`> $LOGFILE

#------------------------------------------------
# DB2へ接続、スキーマ設定
#------------------------------------------------
db2 -vz $LOG_FILE "CONNECT TO " $DB_ID " USER " $AIX_USER " USING " $AIX_PASS
db2 -vz $LOG_FILE "SET CURRENT SCHEMA = " $DB_SCHEMA

#------------------------------------------------
# DB2へIFX形式データIMPORT
#------------------------------------------------
db2  -vz $LOG_FILE LOAD CLIENT FROM $IMPORT_PATH/TableName.ixf OF IXF REPLACE INTO TableName NONRECOVERABLE INDEXING MODE REBUILD

#------------------------------------------------
# DB2への接続を切断
#------------------------------------------------
db2 -vz $LOG_FILE "CONNECT RESET"

#------------------------------------------------
# 終了ログ出力
#------------------------------------------------
echo 処理終了時間： `date +%Y%m%d%H%M%S`> $LOGFILE
```

```sh:
#TRUNCATE と同じ効果で、ログを記録せずにデータを削除する
ALTER TABLE テーブル名 ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE;
```
(db2Export.bat)   DB2 IFX形式でデータをダウンロード

```bat:db2Export.bat
REM db2Export.bat
REM----------------------------
REM DB2データ抽出バッチ
REM----------------------------

REM----------------------------
REM　環境設定
REM----------------------------
SET AIX_USER=userid
SET AIX_PASS=password
SET DB_ID=DB_ID
SET DB_SCHEMA=DB_SCHEMA
SET LOG_FILE=C:\logs\EXPORT.log
SET EXPORT_PATH=C:\export\data\
SET DB2PATH=C:\Program Files\IBM\SQLLIB
SET DB2CLP=-1206113057

REM----------------------------
REM　開始ログ出力
REM----------------------------
echo 処理開始時間： >> %LOGFILE%


REM----------------------------
REM DB2との接続、スキーマ設定
REM----------------------------
db2 -vz %LOG_FILE% "CONNECT TO " %DB_ID% " USER " %AIX_USER% " USING " %AIX_PASS%
db2 -vz %LOG_FILE% "SET CURRENT SCHEMA = " %DB_SCHEMA%

REM----------------------------
REM データ抽出
REM----------------------------
db2 -vz %LOG_FILE% EXPORT TO %EXPORT_PATH%TableName.ixf OF IXF modified by codepage=1208 "SELECT * FROM TableName FOR READ ONLY WITH UR"


REM----------------------------
REM DB2との接続を切断
REM----------------------------
db2 -vz %LOG_FILE% CONNECT RESET

REM----------------------------
REM 終了ログ出力
REM----------------------------
echo 処理終了時間： >> %LOG_FILE%
```
Macでウィンドウを分割し, 余すとこなく使う

![](http://gyazo.com/eedb6662de16cb893689229e09062fc6.png)
こんなウィンドウが嫌いなので

![](http://gyazo.com/bba8ae42ec2881721c8bf1d8dc16021c.png)
こうしたい。

[Spark.app](http://www.shadowlab.org/softwares/spark.php)で、各アプリケーションに、ショートカットキーを設定し、すぐにトップウィンドウに持ってこれるようにします。（例：Option+fでFirefoxを起動orトップに）

[Spectacle.app](http://spectacleapp.com/)で、ウィンドウのリサイズ、移動をショートカットキーに割り当てます。

んで、こうなります。
[動画](http://youtu.be/vtHKAEE-Gq4)
Google App Engine上でRingoJSを動かしている時の備忘録

# GAEのクラスを使う時のインポート文

``` javascript
importPackage(Packages.com.google.appengine.api.datastore);
```

# サンプルをJsdo.itにおいてます
[Datastoreを扱うテスト](http://jsdo.it/kjunichi/oSZJ)

# RingoJSをGoogle App Engineで動かすには？
[jsdo.itでサーバサイドJavaScript](http://qiita.com/items/d2c6d58d4e44064d4eaf)
osxに入ってるコマンドでバイナリ比較

ソフト探して入れるのがめんどいんで標準で入ってるコマンドで。
使ったコマンドをメモ。

○バイナリを分割（split）
　split -b 5m ファイル名 分割後のファイルの接頭辞
元ファイルを消さないで、接頭辞_aa、接頭辞_abみたいに分けてくれる

○バイナリの部分抽出（dd）
　dd if=入力ファイル of=出力ファイル bs=ブロックサイズをバイトで skip=入力ファイルの先頭オフセットをブロック単位で

○バイナリを16進表記でダンプ（hexdump）
　hexdump -C バイナリ > 出力ダンプファイル

○ダンプファイルの比較（vimdiff）
　vimdiff ファイル1 ファイル2
Google Toolbox for Mac - OAuth 2 Controllers Sample

===================================================

[Google Toolbox for Mac - OAuth 2 Controllers](http://code.google.com/p/gtm-oauth2/)を利用するとiPhoneやiPadのOAuth 2.0のクライアントが簡単に作れます。

BaaSの[appiaries](http://www.appiaries.com/)がOAuthの接続を提供しているのでサンプルを[GitHub](https://github.com/ogom/GTMOauth2Sample)に作りました。
（汎用的なサンプルなので接続情報を変更すると他サービスにも利用できます。）


**サンプルを作成した環境**
* OS:Mac OS X 10.7.4(Lion)
* Xcode:Version 4.4.1


# 作り方
## プロジェクト作成
Xcodeで新しいプロジェクトを`Single View Application`で作ります。
（Product Nameは`GTMOauth2Sample`にします。任意で変えて下さい。）


## ライブラリのダウンロード
ダウンロードをして、不要なファイルは削除します。

```Bash
$ cd ./GTMOauth2Sample
$ rm -rf ./.git/
$ svn checkout http://gtm-oauth2.googlecode.com/svn/trunk/ ./Library
$ cd ./Library/
$ mv ./Source/ ./GTMOAuth2/
$ rm -rf ./.svn/
$ rm -rf ./GTMOAuth2/.svn/
$ rm -rf ./GTMOAuth2/Mac/.svn/
$ rm -rf ./GTMOAuth2/Touch/.svn/
$ rm -rf ./GTMOAuth2/GTMOAuth2.xcodeproj/
$ rm -f  ./GTMOAuth2/ReleaseNotes.txt
$ rm -rf ./HTTPFetcher/.svn/
$ rm -rf ./HTTPFetcher/GTMHTTPFetcher.xcodeproj/
$ rm -rf ./HTTPFetcher/Tests/
$ rm -f  ./HTTPFetcher/ReleaseNotes.txt
$ rm -f  ./HTTPFetcher/UnitTests-Info.plist
$ rm -rf ./JSON/.svn/
$ rm -rf ./Examples/
```

## ライブラリを追加
`Library`をプロジェクトに追加してビルドします。


### Issuesが発生する場合
* Apple LLVM compiler
    * "Build Settings"で"Apple LLVM compiler 4.0 – Language"の"Objecctive-C Automatic Refarence Counting"を`No`にします。
* Framework
    * "Build Phases"の"Link Binary With Libaries"で`Security.framework`と`SystemConfiguration.framework`を追加します。


## コードの実装

*[Introduction](http://code.google.com/p/gtm-oauth2/wiki/Introduction)を参考にコードを実装します。*

"Navigation Controller"にOAuthの情報を設定すると"View Controller"で`Access Token`などのauthの情報が取得できます。
（NavigationControllerはSubviewで使用しますので、AppDelegate.hとAppDelegate.mで追加してください。）


### 接続情報

OAuthの接続に必要な情報を取得します。（各サービスのリファレンスを参考にして下さい。）

#### 例）appiaries
アプリを登録すると`Client ID`や`ClientSecret`などの接続情報が得られます。
（コードの実装では`Scope`にprofileを指定しています。）

![appiaries](https://dl.dropbox.com/u/14690051/images/note/GTMOauth2Sample/appiaries.png)

```Objective-C
static NSString *const kOAuthScope          = @"profile";
static NSString *const kAuthorizationURL    = @"https://api-oauth.appiaries.com/v1/auth";
static NSString *const kTokenURL            = @"https://api-oauth.appiaries.com/v1/token";
static NSString *const kRedirectURI         = @"http://callback/oauth";
static NSString *const kUsersMeURI          = @"https://api-profiles.appiaries.com/v1/_sandbox/gtmoauth2sample";
static NSString *const kClientID            = @"84baae6ad2f553b";
static NSString *const kClientSecret        = @"c73844619bf5132c8e57eb83921a1";
```

## iPhoneで接続

サンプルではログインすると`Access Token`を使ってAPIのレスポンスが表示されます。

![iPhone](https://dl.dropbox.com/u/14690051/images/note/GTMOauth2Sample/iPhone.png)


## 補足
### 自己証明書
開発で費用の発生する証明書が使えなくて自己証明書を利用する場合は、`setAllowsAnyHTTPSCertificate`にURLを指定します。
（製品ではAppleの審査は通らないでしょうから注意して下さい）

```Objective-C
@interface NSURLRequest(PrivateAPI)
+ (void)setAllowsAnyHTTPSCertificate:(BOOL)allow forHost:(NSString*)host;
@end
```
FuelPHPを使っていて「MYSQL_ATTR_COMPRESS」が定義されていないエラーと表示された時に対応

FuelPHPでPDOを利用したMySQLアクセスを行おうとした際に「**fuelphp Undefined class constant 'MYSQL_ATTR_COMPRESS'**」とエラーがでた場合には、**app/config/db.php**を修正すると良いです。

開発環境のみ無効にしたい場合には**app/config/development/db.php**を修正すれば大丈夫です。

```php:db.php
/**
 * Base config, just need to set the DSN, username and password in env. config.
 */
'default' => array(
	'type'        => 'pdo',
	'connection'  => array(
		'persistent' => false,
		'compress'   => false,
	),
	'identifier'   => '`',
	'table_prefix' => '',
	'charset'      => 'utf8',
	'enable_cache' => true,
	'profiling'    => false,
),
```

* defaultのconnectionに「 _compress_ 」を追加。
* compressの値を *false* に設定
ステージ上の全ての FLVPlayback をループ再生する


同僚のデザイナーに聞かれたので・・・。

タイムラインの 1 フレーム目に以下のスクリプトを記述します。一つ一つ名前を設定して `addEventListener` する必要がないので便利です。

```as3
import fl.video.FLVPlayback;
import fl.video.VideoEvent;

function playAgain(e:VideoEvent):void {
  var playback:FLVPlayback = e.target as FLVPlayback;
  playback.play();
}

for (var i:uint = 0; i < this.numChildren; i++) {
  var playback:FLVPlayback = this.getChildAt(i) as FLVPlayback;
  if (playback) {
    playback.addEventListener(VideoEvent.COMPLETE, playAgain);
  }
}
```
reactive4java で位置を取得し続ける

[前回](http://qiita.com/items/07762776102dbc84b1c7)に続き、 reactive4java ネタ。
調子に乗って Android で位置を取得し続けるのを reactive4java を使ってやってみた。

```java:LocationFunctions.java
/**
 * 位置を取得し続ける(finish は呼ばれない)
 */
public static Observable<Location> getCurrentLocationAsObservable(			
		final Context context, final String provider) {
	return Reactive.createWithCloseable(new Func1<Observer<? super Location>, Closeable>() {
		private volatile boolean _stop = false;

		@Override
		public Closeable invoke(final Observer<? super Location> observer) {
			final LocationManager locMan = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
			
			final LocationListener listener = new LocationListener() {
				
				@Override
				public void onStatusChanged(String provider, int status, Bundle extras) { }
				
				@Override
				public void onProviderEnabled(String provider) { }
				
				@Override
				public void onProviderDisabled(String provider) {
					observer.error(
						new InvalidParameterException("LocationProvider disabled."));
				}
				
				@Override
				public void onLocationChanged(Location location) {
					if (_stop) {
						return;
					}
					
					// 発火
					observer.next(location);
				}
			};
			
			// 位置取得開始
			locMan.requestLocationUpdates(provider, 0, 0, listener, Looper.getMainLooper());

			return new Closeable() {
				@Override
				public void close() throws IOException {
					if (_stop) {
						return;
					}
					_stop = true;
					locMan.removeUpdates(listener);
					observer.finish();
				}
			};
		}
	});
}

```

使い方は、方位の時とほとんど同じ。パラメータが Float から Location に代わっただけ。

```_stop``` フラグは、Listener を unregister しても溜まってるデータは流しちゃうんじゃないか、という事で用意した。
方位のやつは AtomicBoolean を使ったけどこっちは volatile でやってる。確かどっかで 'AtomicBoolean の方が確実に Atomic' って言ってた気がするけど、そもそもそんなに神経質になるところじゃないか。

Observable にすることで、「ｎ秒間位置を取得して貯めて、その中で一番精度の良いものを通す」みたいなことも簡単にできる。

Android の場合、購読開始時に registerXXXListener、Close で unregisterXXXEventListener てのがひとつのパターン。
たぶん BroadcastReceiver にも適用できる。

XXXListener も BroadcastReceiver も Observable でラップしちゃえば、その後は同じように扱えるので便利♪

##追記 9.27
実はこのプログラム、Cold でしたー。というわけで、Hot についての記事を書きました。
* [Cold を Hot にできる。そう、Publish ならね。 - Qiita](http://qiita.com/items/3a7bda9d0fdcb9248800)

##参考
* [reactive4java で端末の方位を取得しつづける - Qiita](http://qiita.com/items/07762776102dbc84b1c7)
* [Java: volatile boolean vs AtomicBoolean - Stack Overflow](http://stackoverflow.com/questions/3786825/java-volatile-boolean-vs-atomicboolean)
ターミナルで複数タブを切り替えて作業している時に便利な設定


ターミナル(or iterm)でタブをいっぱい開いて作業している時に、
タブタイトルにカレントディレクトリのフォルダ名を表示しておくとかなり便利です。

.zshrcに以下を追加します。

```Bash:.zshrc
precmd () {
  echo -ne "\e]2;${PWD}\a"
  echo -ne "\e]1;${PWD:t}\a"
}
```

ついでにウインドウタイトルにはカレントディレクトリのフルパスを表示しています。
「A Tour of Go」でGo言語を学ぶ

初投稿です。
「[A Tour of Go](http://tour.golang.org/)」というサイトでGo言語のお勉強。ブラウザがあればお試しができるなんて便利ですよね。
本家は英語だけど[日本語訳版](http://go-tour-jp.appspot.com/)を出してくださってる人がいるので、そこでやっていきます。
(ちなみにこのサイト、スマートフォンでもいい感じに見れるから、ちょっとした時間に見るのもいいかも。)

とりあえずHelloWorldから...

```go:HelloWorld.go
package main

import "fmt"

func main() {
	fmt.Println("The grass is always greener on the other side of the fence.\n")
	fmt.Println("「隣の芝は青い」")
}
```

結果
* * *

``` 
The grass is always greener on the other side of the fence.

「隣の芝は青い」
```

感想
* * *
やっぱり最初驚くのは「;」の記号が文末にいらないことかな。これでセミコロンの付け忘れのエラーがなくなるね！！
ほかはパッと見変わらない印象。もう少し進めたらまた色々と違いが見れるのかな？
任天堂のCodePuzzleといた

http://cp1.nintendo.co.jp/
に問題がある。
以下ネタバレ



以下のように書いた。

```python:ans.py
#! /usr/bin/env python
def range_check(func):
    return lambda m, e, n, c: ((0 <= m and m < n) and func(m, e, n, c)) or ""
@range_check
def lets_take_tea_bread(m,e,n,c):
    return str(m)

a = 1
while True:
    if int(a)**17%3569==915 :
        print (lets_take_tea_bread(a,17,3569,915))
        break
    a=a+1
```
Ruby拡張ライブラリ間でシンボル名が衝突する(OS X限定)


RubyはともかくCで書かれた拡張ライブラリになるとかなりOS固有の部分がでてきます。
例えばfoo_ext.bundleとbar_ext.bundleが同名の関数fを定義していると、シンボルの束縛がうまくいかず、意図したfが呼ばれないことがあります。

## 確認方法
<code>DYLD_PRINT_BINDINGS</code>環境変数を<code>YES</code>にして実行すると、各シンボルがどのように解決されているかを確認できます。

    $ DYLD_PRINT_BINDINGS=YES ruby app.rb 2>&1 | grep _f
    dyld: lazy bind: foo_ext.bundle:0x105C55010 = foo_ext.bundle:_f, *0x105C55010 = 0x105C54E90
    dyld: lazy bind: bar_ext.bundle:0x105C88010 = foo_ext.bundle:_f, *0x105C88010 = 0x105C54E90

上記の例だと、<code>foo_ext</code>内の<code>f</code>も<code>bar_ext</code>内の<code>f</code>も、<code>foo_ext</code>の<code>f</code>に束縛されていることが分かります。

参考: [dyld(1) OS X Manual Page](https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/dyld.1.html)

## なぜ発生するのか
MacOS Xの利用しているMach-Oファイルフォーマットにはflat namespaceとtwo-level namespaceがある。
Rubyがデフォルトで利用しているのはflat namespaceだが、これには複数のライブラリが同名のシンボルを含めれない制限がある。

> In the flat namespace, two or more libraries cannot contain symbols with different implementations that share the same name because the dynamic linker cannot know which library contains the preferred implementation.
>
-- 引用元: [Executing Mach-O Files](http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/MachOTopics/1-Articles/executing_files.html)

ちなみにflat namespaceに含まれているシンボル一覧は<code>dyldinfo</code>コマンドで確認できる。

    $ dyldinfo -lazy_bind foo_ext.bundle
    lazy binding information (from lazy_bind part of dyld info):
    segment section          address    index  dylib            symbol
    __DATA  __la_symbol_ptr  0x00001010 0x0000 flat-namespace   _f

## 解決方法
flat namespaceではなくtwo-level namespaceを使うように<code>extconf.rb</code>を修正する。

    case RbConfig::CONFIG['host_os'].downcase
    when /darwin/
      $DLDFLAGS.gsub!("-Wl,-flat_namespace","")
    end

## 関連リンク
 * [Bug #1991: ruby should use twolevel namespace on OS X - ruby-trunk - Ruby Issue Tracking System](http://bugs.ruby-lang.org/issues/1991 "Bug #1991: ruby should use twolevel namespace on OS X - ruby-trunk - Ruby Issue Tracking System")
 * [OS X ABI Mach-O File Format Reference](https://developer.apple.com/library/mac/#documentation/developertools/conceptual/MachORuntime/Reference/reference.html "OS X ABI Mach-O File Format Reference")
Sanscastleでライブラリのドキュメントじゃないヘルプファイルを作る

Sandcastle Help File Builder の Visual Studio 拡張を使ってヘルプファイルを作るメモ。

# 準備
1. 最新の [Sandcastle Help File Builder](http://shfb.codeplex.com/) をインストールします。
2. .NET 4.5 を使っている場合は、Sandcastleの「MRefBuilder」を[ソースコード]([http://sandcastle.codeplex.com/SourceControl/changeset/81377)からビルドし直すことをおすすめします。

# プロジェクト作成
今回は Visual Studio からプロジェクトを作成してみました。
![新しいプロジェクト](http://gyazo.com/77b5af0db3da2507cc67bb9bfa8a5f21.png)
アカデミック版買ってよかった。

作成したら、もちろん空のソリューションが出来上がります。
![ソリューション](http://gyazo.com/b59ce8ab9caa783cda4f72bcd0e483f1.png)
wktkしますね！！！！！

# プロジェクト設定
プロジェクトを設定していきます。

まず、HelpFileタブで、タイトル・見た目などを設定します。
![HelpFile](http://gyazo.com/692492d792d258e166629fd6f037fe00.png)
Englishになってるって？はい、日本語入れてないので…。ググれば結構落ちてます。

次に、大事なポイント。 Plug-Ins で「Additional Content Only」を追加しておきます。でないと、元になるソースコード or アセンブリがないよ！と怒られます。
![Plug-Ins](http://gyazo.com/127ca94b5d8701297eabf6ca78bef8f9.png)

# ページを作る
やっと記事が書けます！お疲れ様でした！

まず、記事の土台となる Content Layout ファイルを追加します。
プロジェクトを右クリックして、[追加]→[新しい項目]、Content Layout を選びます。
![Content Layout を選択](http://gyazo.com/95f852a32d6321f94e7a0ef9da6fec6b.png)
Content Layout の役割がよくわかっていないので、そのうち勉強したいです。

次に、ページを作成します。
Content Layout ファイルを開いて左上のアイコンをクリックします。
![左上のアイコン](http://gyazo.com/fa14125512bbbe107348b0f64e4d6c06.png)

ファイルの種類はいろいろありますが、よくわからないときは Conceptual を選んでおけば間違いないと思います。多分。
![Conceptual を選択](http://gyazo.com/9a31dd6f841f9d262240af282a37f2b7.png)

記事はMAMLとかいうXMLで書いていきます。
![MAML](http://gyazo.com/22a83a90bb9dabdb5b2e30624f37f64c.png)
MAMLについては、Sandcastleにやさしいドキュメントがついてます。英語が読めない僕にも辛うじて理解できるようなものです。タグくらいは押さえられます。

ところで、この拡張子.amlからなる、MAMLファイルの中にタイトルを書く部分がないですね。というわけで、タイトルは Content Layout ファイルの方に書いていきます。

Content Layout ファイルで、ページを選択するとこんな画面になると思います。
![プロパティ](http://gyazo.com/2052bc83751349c2f73139f8425606d5.png)
ここで、 Title に入力した文字がタイトルになります。他は忘れました。Index Keywords を設定すると chm を見るときにキーワードタブに表示されるようになります。

これを繰り返せば、大量のページを生成できます。

# ビルド
ビルドは、C#とかVBとかと同じで、Visual Studio から普通に行えます。ただ、結構時間がかかります。ライブラリのヘルプとかなら、[こんな技](http://d.hatena.ne.jp/azyobuzin/20110420/1303286100)が使えます。

完成するとこんな感じに！
![完成](http://gyazo.com/1a3c9279c25953e7cd81ddb24294846d.png)
（あれ…文字化けしてる…。日本語化のやついれてないからかな…？）

というわけで、Sandcastle はライブラリのドキュメント作成以外でも使える！ということを証明したかっただけなんです。これに関しては日本語情報が少ないので、ドヤ顔できる。
num < .Count()ではなく.Skip(num).Any()の勧め

num < .Count() というコードを見かけたので書いてみた。

.Skip(num).Any() を勧める理由としては、

>* .Count()ではIEnumerable<T>の要素全体を辿るのに対し、.Skip(num)ではIEnumerable<T>の要素をnum個だけ辿って終わる。

>>このとき、IEnumerable<T>の要素数がnumより小さい場合でSkip(num) をしたとしても、IEnumerable<T>の終端にたどり着いた時点でそれ以上は廻らないため無駄がない。

>* .Count()を使う場合、IEnumerable<T>の要素全体を廻る必要があるため無限シーケンスを扱えないが、.Skip(num).Any()なら無限シーケンスを扱える。

という点が挙げられます。念のため２つ書きましたが、両方とも同じことに対して言葉を変えて言っているだけなので、片方が頭にあれば問題ないです。

 ***

補足）

>* Count(), Skip()もO(n)で、オーダーの視点から考えたらどちらでも問題はないので、無限シーケンスを扱うのでなければnum<.Count()でも良いと思います。（こっちのほうが視認性が良いという人もいるでしょうし）

>* 当然、O(n)以下の計算量でIEnumerable<T>の要素数を求められる場合は、そちらを使ったほうが良いです。
「オフラインリアルタイムどう書く第四回の参考問題」を解いてみた

twitter に流れていたので、解いてみた。

お題 : http://qiita.com/items/9c514267214d3917edf2

以下のような方針

* 格子状のグラフを作る。グラフ内の辺は、方向によって別個のものとする（例えば頂点 A と頂点 Bの間には A→B と、B→Aの二つの辺がある）。
* 一度通ったノードを再び通る事はできないという制約を、そのノードに向かう辺をグラフから削除する事で表現する。
* 内部的には a 〜 y ではなく、整数でグラフを表現する（最初のグラフ作成が楽なので）。
* ゴールに到達すると 1、行き詰まると 0として、再帰的に集計する。
* 入力で指定された辺を初期状態のグラフから取り除いてから、始点からブルートフォースする。

コードはこんな感じ。
基本的にリストとタプルと再帰だけで、Haskell で素朴に実装してみた。

```haskell
import Data.List
import Data.Tuple
import System

size  = 5 :: Int
start = 0
goal  = size^2 - 1

makeReversible = concatMap (\t->[t, swap t])

initialGraph = makeReversible
             $ concat [[(a*size+b, (a+1)*size+b), (b*size+a, b*size+a+1)] |
                      a<-[0..size-2], b<-[0..size-1]]

countRoutes graph node
    | node == goal   = 1
    | null nextNodes = 0
    | otherwise      = sum $ map (countRoutes newGraph) nextNodes
  where nextNodes    = map snd $ filter ((==node).fst) graph
        newGraph     = filter ((/=node).snd) graph

solve s = countRoutes filteredGraph start
  where
    filteredGraph       = initialGraph \\ (makeReversible $ toEdges s)
    toEdges             = (map toEdge).words
    toEdge (from:to:[]) = (toDigit from, toDigit to)
    toDigit ch          = fromEnum ch - fromEnum 'a'

main = getArgs >>= (print.solve.head)
```
帰りの電車で黙想1時間強 ＋ 書いて動作確認まで20分くらい ＋ リファクタに1時間強 ≒ 3時間弱。

面白かった。

計算時間は、空文字列を渡して最大値 8512 を得るのに 145 ミリ秒、size = 6 で 1262816 を得るのには 25.0 秒かかった。それ以上は、件の動画を見た後では、おそろしくて実行できない。

それにしても、もともとの『フカシギの数え方』の方は、どうやったら計算時間を爆発させずに数えられるのだろう。ちょっとググってみたけど、簡単な解説がなかなか見当たらない。難しい解説は見つけたが正直理解できなかった(註1)。問題自体はあれほどシンプルなのに、解の方はあんなになっちゃうから驚く。

(註1: 流石に４・５年も経つと Simpath もわかるようになってたので[書き直した](https://qiita.com/yasuabe2613/items/f23b1d644d8aede87d97)(2018/1/3追記))
shortenedされたURLを展開する

bit.lyやow.ly、t.coと言った短縮URLは便利なのですが、データとして取り扱うと同一なのに違うモノとして扱われるので鬱陶しかったりします。なので展開します。

```ruby:extend_url
require 'open-uri'
require 'net/http'

url = "http://t.co/hoge"
ary = ["bit.ly", "ow.ly", "goo.gl", "j.mp", "t.co", "youtu.be"]
uri = URI.parse(url)
host = uri.host
while ary.any? { |val| val == host }
  uri = Net::HTTP.new(uri.host, uri.port).get(uri.path).header['location']
  uri = URI.parse(uri)
  host = uri.host
end
```

展開したURLが短縮URLである場合（t.co/*** → ow.ly/***とか）もあるので、while文で配列とマッチする限りはリピートさせてます。
aryに短縮URLサービスのhostを追加していけば対応できるので楽なのですが、もっと美しい解決法もありそうだな、とも思います。
あと`{ |val| val == host }`的なことをする時に`val`って語の選択としてどうなんだろ…とかも思いました。

gemで[moski / url_expander](https://github.com/moski/url_expander)もあるんですが、短縮URL系のサービスは山ほどあるのでAPIを管理しきれるのかな…と言う風に感じてこっちにしてみました。まぁ主に使われる物だけ対応すれば良いので大丈夫なんでしょうけど。

こんなのもあるよ！とかあったらコメントお願いします。

参考：
[Ruby: expand shorten urls the hard way](http://stackoverflow.com/questions/9306275/ruby-expand-shorten-urls-the-hard-way)
Launcher に表示されるアプリ名は intent-filter で設定する


Launcher っていう呼び名が既に分かりづらい(のでアプリのアイコン名と呼ぶことにします)ですが、ホームアプリとかの事です。

```xml:AndroidManifest.xml
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_label" >

    <activity
        android:name=".MainActivity"
        android:label="@string/activity_label_main" >
        <intent-filter
            android:label="@string/launcer_label"> ←────ここ！
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
```

```<intent-filter android:label=``` を省略すると、起動する Activity の label がアプリのアイコン名になります。

##参考
* [Android Launcher label vs. activity title - Stack Overflow](http://stackoverflow.com/questions/3488664/android-launcher-label-vs-activity-title)
その入力だけBashのヒストリを残さない

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

入力時に1つ以上の半角スペースを入れるとBashヒストリに残らない。

```shell
# lsの前に半角スペース
$  ls -a
. ..
$ history
1 history
```


下記のようなケースで役に立つ。

* VMのひな形作成などでヒストリを残したくない
* ヒストリにあったshutdownコマンドを勢いで叩いてしまいたくない


## 追記：依存する設定
ちゃんと設定があるという突っ込みを頂いたので追記、環境変数`HISTCONTROL`に ignorespace または ignoreboth が設定されていたらこの記事の挙動になる。
という事がmanにちゃんと書いてあった。

```man-bashより
HISTCONTROL
       A colon-separated list of values controlling how commands are saved on the history  list.   If
       the  list  of  values  includes  ignorespace, lines which begin with a space character are not
       saved in the history list.  A value of ignoredups causes lines matching the  previous  history
       entry  to not be saved.  A value of ignoreboth is shorthand for ignorespace and ignoredups.  A
       value of erasedups causes all previous lines matching the current line to be removed from  the
       history list before that line is saved.  Any value not in the above list is ignored.  If HIST-
       CONTROL is unset, or does not include a valid value, all lines read by the  shell  parser  are
       saved  on  the  history  list,  subject to the value of HISTIGNORE.  The second and subsequent
       lines of a multi-line compound command are not tested, and are added to the history regardless
       of the value of HISTCONTROL.

```
Rake タスクをテストコードの中で複数回実行する


Rake タスクをテストするとき、テストコード内で `#invoke` で呼び出すと、二回目の実行時に Rake タスクが実行されません。

```ruby
describe 'hoge' do
  before(:all) do
    @rake = Rake::Application.new
    Rake.application = @rake
    Rake.application.rake_require("hoge", ["#{Rails.root}/lib/tasks"])
    Rake::Task.define_task(:environment)
  end

  describe "rake hoge" do
    context "Rake タスク実行後" do
      before do
        @rake["book:dismissed_suppliers"].invoke
      end

      it "hoge 一回目" do
        # Rake タスクが実行される
      end

      it "hoge 二回目" do
        # Rake タスクが実行されない
      end
    end
  end
end
```

これは仕様のようです。

もう一度実行したいときは Rake::Task#reenable というメソッドを実行する必要があります。

https://github.com/ruby/ruby/blob/trunk/lib/rake/task.rb#L155
https://github.com/ruby/ruby/blob/trunk/lib/rake/task.rb#L118

```ruby
      before do
        @rake["book:dismissed_suppliers"].invoke
        reenable
      end
```

もしくは、`#invoke` ではなく、 `#execute` で呼び出すことで、テストコードのなかで二度 Rake タスクを実行することが可能になります。

```ruby
      before do
        @rake["book:dismissed_suppliers"].execute
      end
```

特に理由がない限りは `#execute` で Rake タスクを呼び出す方が楽でいいと思います。

### 参考

こちらの記事のコメント欄が参考になります。

[phil.sergi.blog: Testing Rake Tasks with RSpec](http://www.philsergi.com/2009/02/testing-rake-tasks-with-rspec.html?showComment=1311805717748#c5200651827575413320 "phil.sergi.blog: Testing Rake Tasks with RSpec")
HTMLをPDFするツールのメモ

# PerlでHTMLをいい具合にPDF化できるツールのメモ

後で試す用メモ

外部サービスでやろうとするとクオリティが残念だったり有償ツールだったりしてどれも微妙

今はシステムコールでwkhtmltopdfコマンドを使ってて割と満足してる

wkhtmltopdfで特別困ってるわけじゃないけど他にどんなのがあるのかなっていう好奇心で調べてるとこ

wkhtmltopdf以外はperldocのDESCRIPTION読んだだけでどれだけ自分の望むクオリティでPDF化できるかは知らない


## これまでに見つけたPDF化ツール

後で試す

最初のwkhtmltopdf以外はCPANモジュール

テンプレートファイルからPDF化するものと、ブラウザのアクセスをエミュレートするものとがあるけどそれぞれがどっちのタイプかはまだ見てない

* wkhtmltopdf

CLIツール。WebKit系ブラウザでアクセスした時のビューをエミュレートして表示されるらしい

chromeで見たのとほぼそのまんま綺麗に表示される感じ。jsとかflashまではエミュレートしてくれないけど今はこれで満足

http://code.google.com/p/wkhtmltopdf/ ここから落とした

* PDF::FromHTML

https://twitter.com/atechsw/status/69914278727139328

性能はよろしくないらしいけど日本語はおｋっぽい…？

* HTML::HTMLDoc

https://twitter.com/atechsw/status/70028411086708736

性能はいいらしいけど日本語がダメっぽい…？

* PDF::WebKit

wkhtmltopdfを使って変換するモジュールらしい

*  PDF::Template

HTMLとかからPDFに変換するモジュールらしい


* Pod::Pdf

HTMLじゃなくてPODだけど一応メモ。PODからPDFを生成するらしい

* WKHTMLTOPDF

wkhtmltopdfをPerlで扱いやすいようにラップしたモジュールらしい…？
Enum と数値の相互変換を汎用的に


Java の Enum は、要素がそれぞれ ordinal を持っている。
ので、要素と数値の相互変換ができる。

例えば、下のような Enum。

```java:Alignment.java
public enum Alignment {
	Left,    // ordinal=0
	Center,  // ordinal=1
	Right;   // ordinal=2
}
```

普通に数値と要素の相互変換はこう書ける

```java:
// enum->数値
int order = Alignment.Center.ordinal();

// 数値->enum
Alignment[] values = Alignment.values();
Alignment align = values[order];

// 同じ
assertEqual(Alignment.Center, align);
```

Alignment.values としているところが気に入らない。
Enum 型に依存しない汎用関数みたいにしたい。

で、こんな関数を作った。

```
/**
 * ordinal から指定した Enum の要素に変換する汎用関数
 */
public static <E extends Enum<E>> E fromOrdinal(Class<E> enumClass, int ordinal) {
	E[] enumArray = enumClass.getEnumConstants();
	return enumArray[ordinal];
}
```

使ってみる。

```java:
// enum->数値
int order = Alignment.Center.ordinal();

// 数値->enum
Alignment align = fromOrdinal(Alignment.class, order);

// 同じ
assertEqual(Alignment.Center, align);
```

ちょっと便利になった。

##補足
Enum.ordinal は、要素が追加されると値が変わっちゃうので、使うのよくないよ、と。
自分も実際には、private 変数を定義してそれを返す getter を interface で定義して…て長くなるので別で投稿しよう。

##参考
* [Java列挙型メモ(Hishidama's Java enum Memo)](http://www.ne.jp/asahi/hishidama/home/tech/java/enum.html)
* [Effective Java 読書会 8 日目 「それ enum で出来るよ」 - IT戦記](http://d.hatena.ne.jp/amachang/20100225/1267114471)
毎度毎度cdとlsを打つ悲劇をなくすために.zshrcさらす

おすすめの設定があったら教えてください。

##一番気に入っている設定

cdなしでディレクトリ名を直接指定して移動し、移動後自動でlsする

```.zshrc
setopt auto_cd
function chpwd() { ls }
```



##自分のzshrc


```.zshrc
## Environment variable configuration
#
# LANG
#文字コード設定
export LANG=ja_JP.UTF-8

# auto directory pushd that you can get dirs list by cd -[tab]
#  historyの自動保管
#  cd -[tab]でcdのhistoryを閲覧できる
#setopt auto_pushd

# command correct edition before each completion attempt
#コマンドをtypoしたときに聞きなおしてくれる
setopt correct

# compacked complete list display
#表示を詰めてくれる
setopt list_packed

# no beep sound when complete list displayed
#beepを消す
setopt nolistbeep

## Keybind configuration
#
# vim like keybind (e.x. Ctrl-a goes to head of a line and Ctrl-e goes 
#   to end of it)
#vimライクに入力をできる(コマンドモードや入力モードがある)
#ddとかもつかえる
bindkey -v

# historical backward/forward search with linehead string binded to ^P/^N
#history系の設定
#autoload history-search-end
#zle -N history-beginning-search-backward-end history-search-end
#zle -N history-beginning-search-forward-end history-search-end
#bindkey "^P" history-beginning-search-backward-end
#bindkey "^N" history-beginning-search-forward-end

## Command history configuration
#
#HISTFILE=~/.zsh_history
#HISTSIZE=100
#SAVEHIST=100
#setopt hist_ignore_dups     # ignore duplication command history list
#setopt share_history        # share command history data

## Completion configuration
#
#予測変換
autoload predict-on
predict-on

autoload -U compinit
compinit

PROMPT="%/%% "
PROMPT2="%_%% "
SPROMPT="%r is correct? [n,y,a,e]:] "
#ls色付け
export LSCOLORS=exfxcxdxbxegedabagacad
export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'

#便利aliasたち
alias ls="ls -G -w"
alias gls="gls --color"
alias where="command -v"
alias j="jobs -l"
alias la="ls -a"
alias lf="ls -F"
alias ll="ls -l"

alias du="du -h"
alias df="df -h"

alias su="su -l"
#保管色付け
zstyle ':completion:*' list-colors 'di=34' 'ln=35' 'so=32' 'ex=31' 'bd=46;34' 'cd=43;34'

#cdとlsの省略
setopt auto_cd
function chpwd() { ls }

#
# Goolge Search by Google Chrome
# terminalからググったりqiita検索をできる
#
google() {
    local str opt
    if [ $# != 0 ]; then
        for i in $*; do
            # $strが空じゃない場合、検索ワードを+記号でつなぐ(and検索)
            str="$str${str:++}$i"
        done
        opt='search?num=100'
        opt="${opt}&q=${str}"
    fi
    open -a Google\ Chrome http://www.google.co.jp/$opt
}

qiita() {
    local str opt
    if [ $# != 0 ]; then
        for i in $*; do
            # $strが空じゃない場合、検索ワードを+記号でつなぐ(and検索)
            str="$str${str:++}$i"
        done
        opt='search?num=100'
        opt="${opt}&q=${str}"
    fi
    open -a Google\ Chrome http://qiita.com/$opt
}
```


##参考
漢のzsh
http://news.mynavi.jp/column/zsh/001/index.html

cd後に自動でls
http://d.hatena.ne.jp/shichiseki/20071230/1199008858
jsの非同期実行を簡潔にしてくれる$.Deferredをシンプルに説明する

>読了時間の目安:5分

##Deferredとは？
jsにおける非同期実行を簡潔に記述するための仕組み

##Deferredを1分で試してみる

1.下記をchrome consoleに貼りつける

QiitaはjQueryの新しいバージョンを使っているので、このままconsoleを開いても実行できます(Mac&Chromeなら、command+option+j)。

```javascript:deferred.js
dfd = $.Deferred()
dfd.done(function(){
  console.log("遅延処理させたい処理を記述する。");
  console.log("後述のdfd.resolve()を実行したときに実行させたい処理を記述する。");
}).fail(function(){
  console.log("遅延処理させたい処理を記述する。");
  console.log("後述の=dfd.reject()を実行したときに実行させたい処理を記述する。");
})
```

2.次に、下記をconsoleに貼りつける

```javascript
dfd.resolve()
//=>遅延処理させたい処理を記述する。
//=>後述のdfd.resolve()を実行したときに実行させたい処理を記述する。
//=>Object
```

###dfd.resolve()を実行すると、dfd.doneで指定した関数が実行される。
###dfd.reject()を実行すると、dfd.failで指定した関数が実行される。
dfdオブジェクト一つにつきresolve/rejectできる回数は、1回。どちらかを1回実行すると、そのdfdは解決済になり、それ以降resolve/rejectしても無視される。

##応用:ajax通信におけるDeferred
ajax通信をすると、successしたときはresolveが実行され、failしたときはrejectが実行される。ちなみに、$.ajax系のメソッドの返り値は、jQuery1.5以降はすべてDeferredオブジェクト。だから、次のような書き方ができる。

```javascript:
$.ajax({url:"foo.json"}).done(function(result){
  console.log(result);
})
```

上記は、Deferredを使わないと次のような書き方になる

```javascript
$.ajax(
 url:"foo.json",
 success:function(result){
  console.log(result);
 }
);
```

上記の例くらいであれば単純だが、次のような例だとかなり複雑になる。

```javascript
$.ajax(
 url:"foo.json",
 success:function(foo){
   console.log(foo);
   $.ajax(
     url:"bar.json",
     success:function(bar){
       console.log(bar);
     }
   );
 }
)
```

Deferredのpipeメソッドを使うと、次のようになる。pipeメソッドは非同期通信をネストするためのメソッド。

```javascript
$.ajax({url:"foo.json"}).done(function(foo){
  console.log(foo);
}).pipe(function(bar){
  return $.ajax({url:"bar.json"});
}).done(function(bar){
  console.log(bar);
})
```

##まとめ
とりあえず、done,fail,resolve,rejectがわかっていれば、それなりに使いこなせると思います。
シェル変数の定義状況に応じて任意の値を返す方法

わりとif文でシコシコ変数定義したりするスクリプトを見るので。
変数が未定義だったり空の場合に初期値として返す値を指定出来たりします。

バージョンまでは調べてないけど、BashとZshでも出来ました。

### 書式
とりあえずよく使いそうな3パターン。他にもあるのかな？？

1. 参照時に変数に未定義か空文字の場合に初期値を返す（変数に代入はしない）
2. 参照時に変数に未定義か空文字の場合に初期値を代入する（以降の参照で有効）
3. 参照時に変数に定義済みの場合に初期値を返す

#### 1. 参照時に変数に未定義か空文字の場合に初期値を返す
```bash
${変数名:-初期値}

$ echo ${HOGE}
zsh: HOGE: parameter not set
$ echo ${HOGE:-hoge}
hoge
$ echo ${HOGE}
zsh: HOGE: parameter not set
$ export HOGE=hoge
$ echo ${HOGE:-hage}
hoge
```
気をつけるべき点は初期値が代入されるわけではなく返却されるだけということ。


#### 2. 参照時に変数に未定義か空文字の場合に初期値を代入する
```bash
${変数名:=初期値}

$ echo ${HOGE}
zsh: HOGE: parameter not set
$ echo ${HOGE:=hoge}
hoge
$ echo ${HOGE}
hoge
$ echo ${HOGE:=hage}
hoge
```
こちらは 1. と違って初期値として代入される。


#### 3. 参照時に変数に定義済みの場合に初期値を返す
```bash
${変数名:+初期値}

$ export HOGE=hoge
$ echo ${HOGE}
hoge
$ echo ${HOGE:+hage}
hage
$ unset HOGE
$ echo ${HOGE:+hage}

$
```
個人的にはあまり使わない...(；´∀｀)

1.は一時的に必要な変数で、2.は設定値をもたせたりする場合に使うかな。


ざっくりですが、超プチTipsでした。
Backbone.jsで複数のモデルを扱うビューを作る場合


初心者向け（自分）です。

Backbone.jsで複数のモデルを扱うビューを作る場合、以下のようにします。

```JavaScript:ビュー定義
var HogeView = Backbone.View.extend({
  template:_.template($('#hoge-template').html()),
  initialize: function() {
    $(this.el).prepend(this.template({
      one: this.model.one,
      two: this.model.two
    }));
  }
});

```

```HTML:テンプレート定義
<script type="text/template" id="hoge-template">
  <dl>
    <dt>1個目</td><dd><%= one %></dd>
    <dt>2個目</td><dd><%= two %></dd>
  </dl>
</script>
```

```JavaScript:使う側
new HogeView({
  el: $('.hoge'),
  model: {
    one: one,
    two: two
  }
});
```



単純に複数のモデルをまとめたラッパーオブジェクトを挟むだけでした。
オブジェクトリテラルが書けるJavaScriptだからこそできる簡単な方法ですね。
愛用中のJSFL / Flash拡張パネルリンク集

愛用中のJSFL、Flash拡張パネルのリンク集です。
これらのJSFL / 拡張パネルには何度も助けてもらいました。制作者の皆様、本当にありがとうございます。

ご覧の皆様で、このJSFL / 拡張パネルはサイコー！というものがありましたらコメントをいただけるとありがたいです。

## JSFL

### [setZeroPosition](http://blog.seyself.com/2007/08/commandsjsfl.html)

【2019/09/19追記】元記事が削除されていたため、InternetArchiveへのリンクを追加しました。
[InternetArchive](https://web.archive.org/web/20161031085032/http://blog.seyself.com/2007/08/commandsjsfl.html)

選択中のインスタンスの座標値を整数値に丸め込むコマンド。
ビットマップ素材の座標値が端数になってにじまなくなります。

私はキーボードショートカットを割り振って使用しています。
ショートカットを割り振るとビットマップ素材を配置したら保険のためにとりあえずコマンド実行、なんて使い方が楽になります。

### ~~[SwapInstances](http://homepage2.nifty.com/addsome/as_downloads.htm)~~

【2019/09/19追記】元記事が削除されています。

選択中のインスタンスを、選択中のライブラリアイテムで置き換えるコマンド。
ダミー素材でflaファイルを先行して作成し、あとで本番素材に入れ替えというときに役立ちます。
このコマンドもキーボードショートカットを割り振って使っています。

### [swap symbols in the same layer](http://f-site.org/articles/2006/09/28181316.html)

[CS3以降のバージョンで動作させるための修正方法](http://chabudai.org/blog/?p=138)

同一レイヤー内のインスタンスをライブラリ内のシンボルで置き換えるコマンド。
キーフレームを割り振ってしまったレイヤーで、やっぱりこっちのシンボルに置き換え、なんてときに助けてくれます。

### [FrameIntoFunction](http://www.yama-ko.net/blog/?p=68)

階段状にフレームを挿入するコマンド。
タイムラインでディレイのあるアニメーションを簡単に作成できます。

### [GetFrameActionScript](http://www.libspark.org/wiki/e_s_jp/GetFrameActionScript)

flaファイル内のタイムラインスクリプトをリストアップしてくれるコマンド。
引き継いだflaファイル内のどこで関数が呼び出されているかわからないなんてときに助けてくれます。

### [Frame2Symbol](http://www.yama-ko.net/blog/?p=70) / [Symbol2Frame](http://d.hatena.ne.jp/icyas/20100805/1281015631)

選択したフレームを新規シンボルにまとめてくれるコマンドと、シンボル内のタイムラインを現在のタイムラインに展開するコマンド。
タイムラインアニメーションのネストを後から変更しようとするときに助けてくれます。

## 拡張パネル

### [paste_position](http://yoropan.com/blog/archives/191)

位置情報をペーストする機能拡張パネル。
インスタンスの多いタイムラインアニメーションを作成するときには必須です。

### [EachTransformer](http://void.heteml.jp/blog/archives/2007/07/eachtransformer.html)

インスタンスの位置を保持したまま回転、拡大縮小、傾斜の設定ができる拡張パネル。

利用の一例として

1.  大量のインスタンスを選択
2.  拡大率を0％と100％に設定

と操作すると大量のインスタンスがにょきにょき生えてくるタイムラインアニメーションがさくっとつけられます。
前述のFrameIntoFunctionと併用するとさらに便利です。

### [TransformationPoint](http://www.libspark.org/wiki/e_s_jp/TransformationPoint)

オブジェクトの変形点を操作する拡張パネル。
クラシックトゥイーンでタイムラインアニメーションをつけた後、キーフレームごとに変形点がずれてアニメーションが化けた！なんてときに助けてくれます。

### [SetName](http://www.kuma-de.com/blog/2009-01-06/272)

インスタンス名を連番でふる拡張パネル。
大量のボタンにインスタンス名をそれぞれ割り付けろ、なんてときにキーボードを連打する必要がなくなります。
Rakeタスクをつくる


定期的なメンテナンスをRakeタスクとして登録して呼び出したいと考えました。
Rakeタスクの作り方を調べたのでメモ。

シナリオは、メール認証が一週間以上されないユーザーのレコードを削除するです。

```
$ rails g task inactive_user #=> inactive_userが名前

#=> rake inactive_user:xxx のように使うので名前に気をつけて
```

```ruby:lib/tasks/destroy_inactive_user.rake
# encoding: utf-8

namespace :inactive_user do
	desc "Users中confirm_atから１週間が経過していれば削除" #=> 説明

# $ rake inactive_user:destroy_unconfirmed のように使う
# :environmentは超大事。ないとモデルにアクセスできない

	task :destroy_unconfirmed => :environment do 
		User.all.each do |user|
			user.destroy if (Time.now > user.confirm_at + 1.weeks.ago)
		end
	end
end
```

これでOK
タスクが登録されているか確認してみる

```
$ rake -vT

# 略
rake inactive_user:destroy_suspended    # Users中suspended_atから３ヶ月経過していていれば削除
rake inactive_user:destroy_unconfirmed  # Users中confirm_atから１週間が経過していれば削除
rake inactive_user:list_suspended       # Users中suspended_atから３ヶ月経過していていれば表示
rake inactive_user:list_unconfirmed     # Users中confirm_atから１週間が経過していれば表示

```

ちゃんと入ってますね。

実際に動かしてみる、、、前にいきなり削除すると怖いので、

```ruby:lib/tasks/destroy_inactive_user.rake
# encoding: utf-8

namespace :inactive_user do
	desc "Users中confirm_atから１週間が経過していれば削除"
	task :destroy_unconfirmed => :environment do 
		User.all.each do |user|
			puts user.to_yaml if (Time.now > user.confirm_at + 1.weeks.ago)
		end
	end
end
```

こう変えましょう。
先にデータベースの下ごしらえをします。
モデルは何となく想像してください。

```
$ rails c

>> User.create({:name => "new", :email =>"a@example.com", :confirmed => false, :confirm_at => Time.now}) #=> 成功すること

>> User.create({:name => "old", :email =>"b@example.com", :confirmed => false, :confirm_at => 1.weeks.ago})　 #=> 成功すること
```

実行します。

```
$ rake inactive_user:destroy_unconfirmed

--- !ruby/object:User
attributes:
  id: 3
  name: old
  email: b@example.com
  created_at: 2012-09-18 10:42:32.000000000 Z
  updated_at: 2012-09-18 10:42:32.000000000 Z
  confirmed: false
  confirm_at: 2012-09-11 10:42:32.000000000 Z
```

ちゃんと捕捉できました。
では削除用スクリプトに書き直して、、、ログも残しておきたいですよね？

```ruby:lib/tasks/destroy_inactive_user.rake
# encoding: utf-8

namespace :inactive_user do
	desc "Users中confirm_atから１週間が経過していれば削除"
	task :destroy_unconfirmed => :environment do 
		User.all.each do |user|
			logger = Logger.new('log/inactive_user.log')
      		logger.info "#{Time.now} -- destroy_unconfirmed_inactive_user -- #{user.to_yaml}"
			user.destroy if (Time.now > user.confirm_at + 1.weeks.ago)
		end
	end
end
```

こうしました。
実行します。

```
$ rake inactive_user:destroy_unconfirmed

Process finished with exit code 0
```

```ruby:log/inactive_user.log
# Logfile created on 2012-09-18 19:58:37 +0900 by logger.rb/31641

2012-09-18 19:58:37 +0900 -- destroy_unconfirmed_inactive_user -- --- !ruby/object:User
attributes:
  id: 3
  name: old
  email: b@example.com
  created_at: 2012-09-18 10:42:32.000000000 Z
  updated_at: 2012-09-18 10:42:32.000000000 Z
  confirmed: false
  confirm_at: 2012-09-11 10:42:32.000000000 Z
```

ログもとれました。
以上で機能を達成できましたが、もっと良い方法だったり問題点があれば教えてください。
具体的なシナリオを言及した投稿がもっとたくさんあるといいですね。
Win/Mac どちらの Excel でも正しく開ける Unicode な csv の出力方法

### 2018/11/27 追記
Excel for Mac 2016 のあるアップデートから UTF8-BOM が開けるようになったようです。
https://www.ka-net.org/blog/?p=7764

手元の 16.16.4 で試してみましたが開くことが出来ました。
平和になってよかったですね。

### あらまし
1. まず UTF-8 で吐いた csv を Excel で開いてみます。化けます。
2. 仕方がないので BOM をつけてみます。 Win だと正しく開けました！でも Mac で化けます。
3. それならと UTF-16LE で吐いてみましょう。Win/Mac どちらも化けずに表示されました！これで大丈夫かと思いきやなんとカンマ区切りされず A 列に 1 行まるごと収まっています。死にます。
4. 仕方がないので tsv で出力してみましょう。すごい！ちゃんと表示されています！でも .tsv はデフォルトでは Excel には関連付けられていないのでダブルクリックでは開けません！これでは .tsv とか意味わからんファイル出力してんじゃねーよ死ねよとか怒られてしまいます。
5. ならばと拡張子を .csv に偽装してみましょう。なんと正しく表示されました！これなら怒られないし完璧ですね！あれ、でもこれ csv じゃない！！！

### まとめ
UTF-16LE な tsv 形式の .csv な拡張子のファイルなら Win/Mac どちらでもダブルクリックで開ける。
インポート操作を許容するなら csv 形式でもデリミタをカンマに変更することによって正しく開けます。

### 終わりに
Excel 死ね
FuelPHP on MAMP

FuelPHP を MAMP 環境でテストする時にハマった所を少しご紹介します。

## curl get.fuelphp.com/oil | sh
いきなりしょっぱなですが、スーパーユーザーでないと動かない事にご注意ください。それに、気づかずごにょごにょやっていたら oil からhtmlがこぼれて来ておかしくなってしまいました。この１行のインストールコマンド、実は Mac OS の usr/bin フォルダにシェルスクリプトを埋め込むものなのです。何故かそこへ HTML を作ってしまいました。多分 wget か何かでへまをしたのでしょう。

という訳で一旦削除して作り直したい時もあると思います。そんな時は /usr/bin/oil を削除して再実行します。

```
cd /usr/bin
sudo rm oll
```

## Scafolding
oilさえ正常に動けば問題なく動作します。コマンドの前に sudo を着けるのをお忘れなく。

```
oil create blog 
oil generate scaffold post title:string summary:varchar[250] body:text
```

### PDOの設定
ここが一番のハマりどころだと思います。MAMP専用のソケットを位置を指定しないとPDO接続されません。

```app/config/development/db.php
return array(
	'default' => array(
		'connection'  => array(
			'dsn'        => 'mysql:unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock;dbname=blog',
			'username'   => 'root',
			'password'   => 'root',
		),
	),
);
```

### 圧縮モード

上記でDBの構築要素まで作成されます。そのあと圧縮オプションでエラーとなりました。

```
oil refine migrate
Error - Undefined class constant 'MYSQL_ATTR_COMPRESS' in COREPATH/classes/database/pdo/connection.php on line 83
```

単純にコメントアウトとします。圧縮モードを使用するとWindows環境で文字化けが発生します。（最近もそうかは調べてませんが、とりあえず。）

### ORMパッケージ

ErrorException [ Error ]: Class 'Orm\Model' not found とか言われてORMパッケージのコメントを外したらようやく GUID が動きました。

```app/config/config.php
		'packages'  => array(
			'orm',
		),
```

と、ここらへんが FuelPHP on MAMP のハマりどころでした。
__FILE__と$0の違い

ググればいろんなところで解説されているけど、実際にコード書いて確かめてみた。

```ruby:filename.rb
puts "__FILE__: #{__FILE__}"
puts "$0: #{$0}"
```

```ruby:require_filename.rb
require_relative filename
```

```shell
% ruby filename.rb
__FILE__: filename.rb
$0: filename.rb
% ruby require_filename.rb
__FILE__: /Users/naoty/workspace/ruby/filename.rb
$0: require_filename.rb
```

- `__FILE__`は実行中のプログラムのファイル名（[リファレンス](http://miyamae.github.com/rubydoc-ja/1.9.3/#!/doc/spec=2fvariables.html?pseudo)によると、フルパスとは限らないみたい）
- `$0`は実行時に指定されたファイル名（相対パス）
- 以下のようなコードを見かけるのだけど、相対パスと絶対パスで一致しない場合は考慮されていないような気がする。。。

```ruby
if __FILE__ == $0
  # hogehoge
end
```
まるっとファイルをコピーしつつ、特定のファイルだけ除外する、みたいな処理。


`wc -l` で該当テキストの行数が出るので、それで判別すると確実。


```shell
#!/bin/sh

file="js/app/hoge.config.js"
dev="./dev/$file"
pre="./pre/$file"

if [ -e $pre ]; then
    mv $pre $pre.back
fi

cp -r ./dev/* ./pre

if [ -e $pre.back ]; then
    if [ -e $pre ]; then
        rm $pre
    fi

    mv $pre.back $pre
fi

if [ $(diff $pre $dev | wc -l) -ne 0 ]; then
    echo 'Maybe the file was modified.'
fi

```