OmniAICreator/Qiita-1.07M huggingface dataset:
sublime text 2 の辞書引きパッケージ

[lookupdic] (https://github.com/shvva/Lookupdic)
=========

lookupdic は alc 英辞郎 on the web を利用した英和・和英辞書引きのための Sublime Text 2,3 用パッケージです。  

### インストール

自動更新による最新版をご利用頂くため、パッケージコントロールを使用してコミュニティパッケージ経由でインストールして下さい。  

### 使用方法

調べたい単語または複数の単語を選択して、下記のいずれかの方法で起動します：  

キーバインド　：　`^ ⌘ ]` (os x) or `ctrl alt ]` (Linux/Windows)  
　　メニュー　：　`Tools > Look up dic`  

何も単語が選択されない場合は、カーソル上の単語を調べます。
Galaxy SⅡ


インストール済アプリ
auスマートパス
-----

- 超節電
- ATOK
- ウィルスバスター

-----

- Dropbox
- Chrome
- 鉄道駅データベース
- Cam Scanner
- Skitch 
- Memento Database
- jQuery Mobile
- Polaris Office
- Twitter
- OI File Manager

-----
C言語の配列とsizeof

Qiita で初めて LGTM をもらって嬉しかったので C言語のネタをもう一つ。

C言語の文法は、ポインタと配列の辺りで混乱がある。

```c:sizeof_and_array.c
// compiled with "gcc -std=c99 -Wall"

#include <stdio.h>

void test( short arg[5] )
{
    printf( "arg : %zd\n", sizeof( arg ) );  
    printf( "*arg : %zd\n", sizeof( *arg ) ); 

    short foo[10];
    printf( "foo : %zd\n", sizeof( foo ) ); 
    printf( "*foo : %zd\n", sizeof( *foo ) );
    printf( "&foo : %zd\n", sizeof( &foo ) ); 
    printf( "*&foo : %zd\n", sizeof( *&foo ) ); 
    printf( "&*foo : %zd\n", sizeof( &*foo ) ); 
    printf( "0+foo : %zd\n", sizeof( 0+foo ) ); 
    printf( "1?foo:foo : %zd\n", sizeof( 1?foo:foo ) ); 
}

int main()
{
    short a[5]={9,8,7,6,5};
    test( a );
    return 0;
}
```

今は大体理解していて、上記のプログラムが何を出力する（べき）なのかを把握できているつもりだが、把握できたのは昨年のことで、それまではわかっていなかった。

何を出力するのかをコメントに書こうかとも思ったが、なんとなくやめておいた。気になる人は実行するのが良いと思う。
サーバの JSON テキストから Objective-C のインスタンスを生成するライブラリ、SimpleRemoteObject を公開しました。

先日、[NSRails 的なクラスを自前で作ってみた](http://qiita.com/items/dc8d46a1da1e13efefe5) にて作っていたライブラリですが、自分のプロジェクトでは結構役に立っているので、github に公開しました。

https://github.com/halsk/SimpleRemoteObject

基本は以前の記事から大きくは変わっていませんが、以下のように使えます。

例えば、http://your_server/users.json にアクセスすると以下のようなテキストが帰ってくる場合

```javascript:your_server/users.json
{
meta: {
 limit: 20,
 next: null,
 offset: 0,
 previous: null,
 total_count: 3
},
objects: [
 {
   id: 1,
   name: "Daniel",
   email: "daniel@example.com",
   age: 25
 },
 {
   id: 2,
   name: "Mario",
   email: "mario@example.com",
   age: 30
 },
 {
   id: 3,
   name: "Hal",
   email: "hal@example.com",
   age: 32
 }
]
}
```

iOS 側では以下のようなクラスを作成します。

```objective-c:User.h
#import <SimpleRemoteObject/SRSimpleRemoteObject.h>
@interface User : SRSimpleRemoteObject
@property(nonatomic,retain) NSString *name;
@property(nonatomic,retain) NSString *email;
@property(nonatomic) int age;
@end
```

```objective-c:User.m
#import "User.h"

@implementation Tag
+(NSString *)representUrl{
 return @"users.json"; // server path
}
+(NSString *)resultKey{
 return @"objects"; // key of target JSON object
}
@end
```

AppDelegate などで、SRRemoteConfig クラスにサーバのアドレスを設定します

```objective-c:YourAppDelegate.h
#import <SimpleRemoteObject/SRSimpleRemoteObject.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
 [SRRemoteConfig defaultConfig].baseurl = SERVER_URL;

 // Override point for customization after application launch.
 return YES;
}
```

あとは、必要な場所で `fetchAsync:^(NSArray *allRemote, NSError *error)` を呼び出すだけです。

```objective-c
[User fetchAsync:^(NSArray *allRemote, NSError *error) {
 if (error){
     //Do error handling
 }else{
     for (User* user in allRemote){
         NSLog(@"my name is:%@",user.name);
     }
 }
}];

```

サーバのURIに動的にパラメータを付与したり、POSTメソッドを叩いたりといったことにも対応しています。

CocoaPod に対応していますので、インストールも簡単です。
詳しくは [githubのプロジェクト](https://github.com/halsk/SimpleRemoteObject
)をご確認ください。

ドキュメントが追いついていませんが、[テストコード](https://github.com/halsk/SimpleRemoteObject/blob/master/SimpleRemoteObject/SimpleRemoteObjectTests/SimpleRemoteObjectTests.m)を見るとだいたいどんなことができるのかわかると思います。

エラーハンドリングとかが適当なので、少し強化する予定です。
また、今のところ参照のみなので、そのうち CRUD サポートも行う予定です。

コントリビューターも募集中です！Pull Request お待ちしております！！
macのエスケープ文字

macはエスケープ文字として、"¥"円マークと"\"バックスラッシュを区別するんですね。
windowsのノリで入力して、eclipseでコンパイルエラーが取れなくて困った。

バックスラッシュは `option + ¥` で入力。

> 2015/10/6追記
指摘があったので修正しました。
`alt + ¥`と書いてましたが、macだと正しくは`option`ですね…
恐らく当時、macの`option`キーに`alt`って印字しているために、完全に`alt`扱いしていたものと思われます…
Class Extension

Xcode4.5になってからアプリのスケルトンを作成すると勝手にできていた、以下のカッコつきのinterface宣言。

```SomeObject.h
@interface SomeObject : NSObject

@end

```

```SomeObject.m
@interface SomeObject ()
// インターフェース
@end

@implementation SomeObject
// 実装
@end
```

なぜか`SomeObject.m`でもinterfaceの宣言がされている。これが何か意味がわからなかったけれど、クラスエクステンションというものらしい。

## クラスエクステンションとは？

クラスエクステンション(Class Extension)とはObjective-Cのカテゴリの一種でエラーを防ぐために使われる。カテゴリにおいては通常Objective-Cのリンカは柔軟性を保証するために、宣言したすべてのカテゴリが実行ファイルに揃っているか確認を行わない。そのためカテゴリに依存しないクラス内でのプライベートメソッドの実装を入れ忘れても、エラーを出さずに実行ファイルが作成されてしまう。

これを防ぐのがクラスエクステンションだ。例にあったSomeObject.mにあるように

```SomeObject.m
@interface SomeObject ()
// ここに実装必須なメソッドの宣言を行う
- (void)example:(id)object;
@end
```

このように宣言すると、コンパイラはコンパイル時に確認を行い、`-(void)example:(id)object;`が実装されているかを確認する。
ただしクラスエクステンション自体にはメソッドを隠蔽するような機能はないので、この宣言を行なってプライベートメソッドを宣言したければ、`.m`ファイルの方に書く必要がある。

今までプライベートなプロパティやメソッドを書きたければこっちに書けばいいのかぐらいに思っていたが、理屈はどうあれ認識としてはそれで間違いなかったわけだ。
tmuxでコピーをする

※それぞれでkeybindは違うと思いますので適宜読み替えてください。

1. C-a [ でコピーモードへ入る
2. spaceキーでコピー範囲開始
 （h j k l で上下左右に移動が可能）
3. enterキーでコピー終了
4. C-a ] で貼り付け

楽しいtmuxライフを！
NSInvocation を使ってクラスメソッドを呼ぶ


少しハマったのでメモ的に。

`[NSObject performSelector:withObject:withObject];`
は動的にメソッドを呼ぶ時に便利ですが、パラメータが３つ以上ある場合には使えません。その場合は NSInvocation を使うことで複雑な動的呼び出しができます。

で、クラスメッソドを呼ぶ場合はどうしたら良いのかなーと思ったのですが、

* setTarget に Class を渡す
* method signature の取得に、instanceMethodSignatureForSelector ではなく methodSignatureForSelector を使う

```objective-c
// define selector
SEL selector = @selector(postToURL:withParams:async:);
// get method signeture
NSMethodSignature* signature = [[self class] methodSignatureForSelector: selector];
// make NSInvocation instance
NSInvocation* invocation = [ NSInvocation invocationWithMethodSignature: signature ];
[invocation setSelector:selector];
[invocation setTarget:[self class]];
[invocation setArgument:&strurl atIndex:2];
[invocation setArgument:&params atIndex:3];
[invocation setArgument:&completionBlock atIndex:4];
[invocation invoke];

```

最初、setSelector をしていなくてエラーになってしまいハマりました・・・
ニコニコ生放送のユーザー放送RSS

## リクエスト形式
` http://live.nicovideo.jp/recent/rss?tab=common&sort=view_counter&p=1&order=desc `

##パラメータ
### tab
放送種類

| 値           |     意味 |  
|:-----------|:------------|
| common  |        一般 | 
| try          |      やってみた |
| live         |        ゲーム |   
| req         |          動画紹介 |  
| r18        |        R-18 |   
| face       |     顔出し | 
| totu       |     凸待ち | 

### sort
ソート項目の指定

| 値           |     意味 |  
|:-----------|:------------|
| start_time |        放送日時 | 
| view_counter          |     来場者数 |
| comment_num        |        コメント数 |   
| community_level        |          コミュニティレベル |  
| community_create_time       |        コミュニティ作成日 |   

### order

指定しないとdesc

| 値           |     意味 |  
|:-----------|:------------|
| asc         |   昇順 | 
| desc       |   降順 |

### p
ページ番号

## 注意点
tabを指定しないとsortはできない。

## 結果

` http://live.nicovideo.jp/recent/rss?tab=common&sort=view_counter&p=1&order=desc `
一般タグの放送で来場者の多い順に並び替えた１ページ目

```xml:response.xml
<channel>
<title>ニコニコ生放送</title>
<link>http://live.nicovideo.jp/</link>
<description>ニコニコ生放送は生中継にリアルタイムでコメントを付けられる、niconicoのコンテンツです。</description>
<language>ja-JP</language>
<copyright>niwango,inc. All rights reserved.</copyright>
<nicolive:total_count>2341</nicolive:total_count>
<item>
<title>【立体音響】外配信INアメ村【ヘッドホン･イアホン推奨】</title>
<link>http://live.nicovideo.jp/watch/lv130339514</link>
<guid isPermaLink="false">lv130339514</guid>
<pubDate>Sat, 16 Mar 2013 19:30:00 +0900</pubDate>
<description>サブコミュ作った　co1946988 ▽放送内容▽ ※ルール　生ＩＤの</description>
<category>一般(その他)</category>
<category>顔出し</category>
<category>凸待ち</category>
<category>クルーズ待ち</category>
<media:thumbnail url="http://icon.nimg.jp/community/s/170/co1705340.jpg?1363370871" width="64" height="64"/>
<dc:creator>哲学とは哲学であるm9・｀ω・)ﾋﾞｼｯ!!【命の章】/co1705340</dc:creator>
<nicolive:community_name>哲学とは哲学であるm9・｀ω・)ﾋﾞｼｯ!!【命の章】</nicolive:community_name>
<nicolive:community_id>co1705340</nicolive:community_id>
<nicolive:num_res>2928</nicolive:num_res>
<nicolive:view>16185</nicolive:view>
<nicolive:member_only>false</nicolive:member_only>
<nicolive:type>community</nicolive:type>
<nicolive:owner_name>ティロ・フィナーレ加川　放送用</nicolive:owner_name>
</item>
<item>
<title>で、でた～ｗｗｗｗｗゲーム苦手とか言いつつゲーム感覚でネット恋愛奴～ｗ</title>
<link>http://live.nicovideo.jp/watch/lv130342631</link>
<guid isPermaLink="false">lv130342631</guid>
<pubDate>Sat, 16 Mar 2013 19:52:23 +0900</pubDate>
<description>■放送詳細　【純粋な恋がしたいですね　年齢関係なく】 ■募集企</description>
<category>一般(その他)</category>
<category>顔出し</category>
<category>凸待ち</category>
<category>クルーズ待ち</category>
<media:thumbnail url="http://icon.nimg.jp/community/s/15/co156635.jpg?1360617663" width="64" height="64"/>
<dc:creator>【公認】 かがみんのBAN工場（12時間営業）【ミラー】/co156635</dc:creator>
<nicolive:community_name>【公認】 かがみんのBAN工場（12時間営業）【ミラー】</nicolive:community_name>
<nicolive:community_id>co156635</nicolive:community_id>
<nicolive:num_res>3270</nicolive:num_res>
<nicolive:view>9717</nicolive:view>
<nicolive:member_only>false</nicolive:member_only>
<nicolive:type>community</nicolive:type>
<nicolive:owner_name>コレコレ・ヴィ・ブリタニア</nicolive:owner_name>
<nicolive:free_space>0</nicolive:free_space>
</item>
...
</channel>
</rss>
```
Prefab のアタッチメントを効率化させる

### `Instantiate (prefab, transform.position, transform.rotation) as GameObject;` って書くのめんどくさい
あるゲームオブジェクトの Prefab をシーン内にアタッチする時に、こういったコードを書くかと思います

```csharp:Example.cs
public GameObject effectPrefab;
public float effectLifeTime = 3.0f;

void Update () {
    // 左クリック
    if (Input.GetMouseButtonDown (0)) {
        // エフェクトを Prefab からゲームシーンへアタッチ
        var effect = Instansiate (
            effectPrefab,
            transform.position,
            transform.rotation
        ) as GameObject;

        // エフェクトの Transform ノードを自分の子要素にする
        effect.transform.parent = transform;

        // エフェクトをコルーチンで消す
        StartCoroutine ("AutoEraseEffect", effect); 
    }
}

IEnumrator AutoEraseEffect (GameObject effect) {
    yield return new WaitForSeconds (effectLifeTime);
    Destroy (effect);
}
```
↑ の例だけだったら別に良いのだけれど、

+ アタッチしたオブジェクトの localPosition を変更したい…
+ アタッチしたオブジェクトの rotation は Prefab で設定したものから変更したくない…
+ アタッチしたオブジェクトにあるはずの Component を取り出して使いたい…

等々、「Instantiate (...) as GameObject って毎回長いの書きたくないけどバリエーションが沢山あってダルい…」と思うようなユースケースが多々出てくるかと思います。

### PrefabController
自分の場合 ユーティリティクラスとしてこういうのを最初に書いておきます

```csharp:PrefabController.cs
using UnityEngine;
using System;

public enum CloneMode {
	/// <summary>
	/// Clone rotation follow parent.
	/// </summary>
	FollowParent,
	/// <summary>
	/// Clone rotation keep prefab's rotation.
	/// </summary>
	KeepRotate
}

public class PrefabController : MonoBehaviour {
	
    // 引数の mode (デフォルトは parent の rotation に従う）に合わせて Prefab のアタッチメント
    // Transform のノードはヒエラルキーのトップ
    public static GameObject Clone (GameObject prefab, Transform parent, CloneMode mode = CloneMode.FollowParent) {
        Transform rotationOrigin;
        switch (mode) {
            case CloneMode.KeepRotate:
                rotationOrigin = prefab.transform;
                break;
            default: // Follow Parent Transform
                rotationOrigin = parent;
                break;
        }
        return Instantiate (prefab, parent.position, rotationOrigin.rotation) as GameObject;
    }
	
    // 引数の parent の子要素としてアタッチ
    public static GameObject CloneAsChildren (GameObject prefab, Transform parent, CloneMode mode = CloneMode.FollowParent) {
        var instance = Clone (prefab, parent, mode);
        instance.transform.parent = parent;
        return instance;
    }
	
    // 引数の sibling の兄弟要素としてアタッチ
    public static GameObject CloneAsSibling (GameObject prefab, Transform sibling, CloneMode mode = CloneMode.FollowParent) {
        var instance = Clone (prefab, sibling, mode);
        instance.transform.parent = sibling.parent;
        return instance;
    }
}
```

つくりたいゲームの仕様次第ですが、たとえば 「シーンロードの際に非同期通信を行い、ゲームのレベルデザイン設定ファイルを受け取ってそこからゲームオブジェクトを生成させる」などのユースケースで効果を発揮します。

### おまけ 「エフェクト（パーティクルシステム）」には自分で自分を Destroy する仕組みをもたせた方が管理が楽

有名なアセットの Detonator や Explosion V1 & V2 などはそういうパターンで設計されていますが、アタッチされてから、自分で一定時間演出して、自分で `Destroy (gameObject);` を呼ぶ仕組みにしておくと便利です。

ただ、外側から GameObject として持っているメンバーは他のオブジェクトからも参照できるので、 `NullReferenceException` に注意しましょう
node.jsをmacにさくっと入れてみる【n番煎じ】

最近socket.ioの実例を見せてもらってテンションがあがったので、自分もsocket.ioをいじるべくnode.jsを入れてみた。

#はじめに
インストールやnode.js自体のバージョン管理にもいつくかの方法やツールがあるようだったけれど、自分の見た限りではnodebrewを使うのが一番楽そう。なによりインストールが簡単だ。

#nodebrewのインストール
##インストール
すごく簡単。これを実行するだけ。

```bash
curl -L git.io/nodebrew | perl - setup
```

これだけでnodebrewが入る。見ての通りperlだからmacでなくても動くんじゃなかろうか。後でLinuxも試してみようかな。

###バージョン
古いバージョンのnodebrewだとこの先上手く行かなかったりするらしい。将来のバージョンでも無事な保証ないので、バージョンチェックの方法と今のバージョンを記録しておく。

```bash
nodebrew help
```

これでバージョンがわかる。ちなみにこの追記の時点でnodebrew 0.6.2

##パスを通す
GUIばかりだとなじみが薄いけれど、パスってやつを通しておかないといくら `nodebrew`とか実行しても何も起こらない。
.bashrcを作るなり編集するなりしてパスを通す。.bash_profileに書いても動いた。

```bash
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

これを追記するだけ。あとはこのファイルを読み込んで適応させなきゃなんだけど、面倒んで初回は普通に上のコードそのまま実行しておいても大丈夫。書いておくとその実行を毎度自動でやってくれるってだけ。

#node.jsのインストール
##今どんなバージョンがあるか確認してニヤニヤする

```bash
nodebrew ls-remote
```
こんなのが返ってくる（後半だけ抜粋）

```bash
v0.10.0   v0.10.1   v0.10.2   v0.10.3   v0.10.4   v0.10.5   v0.10.6   v0.10.7
v0.10.8   v0.10.9   v0.10.10  v0.10.11  v0.10.12  v0.10.13  v0.10.14  v0.10.15
v0.10.16  v0.10.17  v0.10.18  v0.10.19  v0.10.20  v0.10.21  v0.10.22  v0.10.23
v0.10.24  v0.10.25  v0.10.26  v0.10.27  v0.10.28  v0.10.29  v0.10.30  v0.10.31


v0.11.0   v0.11.1   v0.11.2   v0.11.3   v0.11.4   v0.11.5   v0.11.6   v0.11.7
v0.11.8   v0.11.9   v0.11.10  v0.11.11  v0.11.12  v0.11.13
```

最初書いてる時点でv0.10.0が新しかったのに、気がついたらv0.11とかまで出てた・・・早いなぁ。

##インストール
バイナリブームが終わった？のか知らないけれど問題なさそうなので安定版の最新版をインストールしてみる。

```bash
nodebrew install stable
```

試してみたら今インストールされるのはどうやらv0.10.31らしい。

##使うバージョンの指定
インストールしただけでは `node` を実行しても怒られるだけ。使用するバージョンを指定してはじめて使えるようになる。逆に言えば、あとから新しいバージョンを入れてみて「あれ動かないヤバい！」ってなったら、これでもと動いてたバージョンに戻せば良い。アップデートペースの早いnode.jsにはすごくありがたい。

```bash
nodebrew use v0.10.31
```

##インストールできましたか？
以下のコマンドでバージョンが確認できます。きちんと返ってくればたぶん上手く行ってる。

```bash
node -v
```

ちなみに、実際使う時はjsファイルを指定してこんなの

```bash
node app.js
```

参考：[これからNodeやるならnodebrew！あとforeverも。](http://lealog.hateblo.jp/entry/2012/12/30/000928)
参考：[【Node.js】socket.ioを使って簡単にチャットを作る方法](http://creator.cotapon.org/articles/node-js/%E3%80%90node-js%E3%80%91socket-io%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E7%B0%A1%E5%8D%98%E3%81%AB%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95)
RubyのProcとStrategyデザインパターン

## RubyのProc
Rubyには処理をまとめておけるProcというものがある。
Procを使うには、下記のようにいくつか方法がある。

```proc_sample.rb
# 1.1 lambdaを使う
hello = lambda do
    puts 'Hello'
end

# 1.2 1行にまとめることも可能
hello = lambda { puts 'Hello' }

# 2.1 Procインスタンスを生成する
world = Proc.new do
    puts 'World'
end

# 3. それぞれcallで呼び出すことが可能
hello.call # => Hello
world.call # => World

# 4. 引数を渡すことも可能
hello_text = lambda do |text|
    puts "Hello #{text}"
end

hello_text.call('World') # => Hello World

```

lambdaとProcインスタンスも実は微妙に違うらしい。
その辺りは下記の記事が参考になる。
http://d.hatena.ne.jp/shunsuk/20090101/1230816826

これだけ見ると、関数と何が違うのかわからないが、
Procは関数と組み合わせることによって威力を発揮する。

### Procと関数を組み合わせる

Procは関数に渡すことができ、実行できる。

```proc_sample3.rb
# procを定義
puts_world = lambda { puts 'World' }

def hello(world)
    puts 'Hello'
    world.call
end

hello puts_world 
# Hello 
# World

```

いちいち変数に保存せずに、関数に直接渡すこともできる。
その場合特殊なキーワード「yield」を使用し呼び出すことができる。
これはblockと呼ばれる。

```proc_sample4.rb
def hello
    puts 'Hello'
    yield
end

hello do
    puts 'World'
end
# Hello 
# World

```

## ProcとStrategyデザインパターン

このProcとStrategyデザインパターンは相性がいい。

### Strategyデザインパターンとは

例えば、SNSにシェアする機能を作ろうとした時に、まずベースとなるClassを作る。
SNSによってシェアの方法は違うので、それぞれ別にClassを作りベースとなるClassに渡す方法が、Strategyデザインパターンである。

```SNSBase.rb
class SNSBase
    def initialize(sns)
        @sns = sns
        @text = 'share to'
    end

    def share
        @sns.share(@text);
    end
end
```

ベースのClassが作成できたら、SNS毎にシェア機能を要したClassを作成する。

```FacebookShare.rb
class FacebookShare
    def share(text)
        # facebookにシェアする処理
        puts "#{text} facebook"
    end
end
```
```TwitterShare.rb
class TwitterShare
    def share(text)
        # twitterにシェアする処理
        puts "#{text} twitter"
    end
end
```

実際に使うときにはこんな感じ。

```share_sample.rb
# facebookにシェア
sns = SNSBase.new(FacebookShare.new)
sns.share # => share to facebook

# twitterにシェア
sns = SNSBase.new(TwitterShare.new)
sns.share # => share to twitter
```

### ClassをProcに置き換える

簡単な処理であればClassをProcに置き換えても十分機能する。
その場合BaseのClassを少しいじる必要がある。

```SNSBase.rb
class SNSBase
    def initialize(&sns)
        @sns = sns
        @text = 'share to'
    end

    def share
        # initializeで渡ってくるオブジェクトはProcなので、callメソッドに変更
        @sns.call(@text);
    end
end
```

実際にこのBaseのClassを使用するのは下記のようなイメージになる。

```share_sample2.rb
# facebookにシェア
facebook_share = lambda do |text|
    puts "#{text} facebook"
end
sns = SNSBase.new &facebook_share
sns.share # => share to facebook

# twitterにシェア
twitter_share = lambda do |text|
    puts "#{text} twitter"
end
sns = SNSBase.new &twitter_share
sns.share # => share to twitter
```
いちいちClassを各SNSごとに作らなくなるので、さっきよりは少しお手軽になる。

### blockを使用する

Procに置き換えても動くように変更したら、もはや変数に格納する必要もなく、Classのインスタンスを作成するときにそのままblockとして処理を渡すことが可能になる。

```share_sample3.rb
# facebookにシェア
sns = SNSBase.new do |text|
    puts "#{text} facebook"
end
sns.share # => share to facebook

# twitterにシェア
sns = SNSBase.new do |text|
    puts "#{text} twitter"
end
sns.share # => share to twitter
```
お手軽で便利ね〜
【rvm】Ruby 2.0.0 安定版　インストール


rvmを使ってインストールしようとするが、、

```Bash
rvm install 2.0.0
```

さっそくエラーが出た。

```Bash:エラー
There is no checksum for 'http://production.cf.rubygems.org/rubygems/rubygems-2.0.3.tgz' or 'rubygems-2.0.3.tgz', it's not possible to validate it.
This could be because your RVM install's list of versions is out of date. You may want to
update your list of rubies by running 'rvm get stable' and try again.
If that does not resolve the issue and you wish to continue with unverified download
add '--verify-downloads 1' after the command.

There has been an error while trying to fetch rubygems. 
Halting the installation.

```

下記コマンドで無事インストール完了。

```Bash
rvm uninstall 2.0.0
rvm get stable
rvm install 2.0.0 --verify-downloads 1
```
文字列が等しいかどうか判断する簡単なプログラム


```objectivec:main.c
#import <Cocoa/Cocoa.h>

int main(int argc, char *argv[])
{
    return NSApplicationMain(argc, (const char **)argv);
}
```

```objectivec:AppDelegate.h
#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate> {
    IBOutlet NSTextField* field1;
    IBOutlet NSTextField* field2;
    IBOutlet NSTextField* result;
}

@property (assign) IBOutlet NSWindow *window;

- (IBAction)isEqual:(id)sender;

@end
```

```objectivec:AppDelegate.m
#import "AppDelegate.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

- (IBAction)isEqual:(id)sender {
    if ([[field1 stringValue] isEqualTo:[field2 stringValue]]) {
        [result setStringValue:@"等しい"];
    } else {
        [result setStringValue:@"等しくない"];
    }
}

@end
```
Sublime Text 言語パッケージ作成：パッケージを公開する（応用編）

このページでは、Sublime Text パッケージに特にこだわりをもつ方向けに解説します。

例えば、

* パッケージ名・パッケージの説明・バージョン表記を好きに書きたい
* 俺 Mac でしか確認できないから Windows で使ってもらいたくない
* master にあるソースを使われるのは嫌
* GitHub や BitBucket を使うのが嫌
* パッケージのソースを見られたくない

さらに、

* Add Repository してもらうのが面倒
* [Package Control のページ](https://sublime.wbond.net)に載せてほしい

などの欲がある方向けです。

欲のない方は [基本編](http://qiita.com/items/ba7e4025afff3510888f) へ。

**Package Controlの登録手順は、以前から大幅に変更されています。変更概要が知りたい方は[こちらの記事](http://qiita.com/makopo/items/b75657d2cd702c154d05)、以前ここに書いてあった内容を知りたい方は[編集履歴](http://qiita.com/makopo/items/83d551b5594e7802a3c4/revisions)を辿ってください。**

## Package Control に登録してもらう

### repository/*.json の編集

GitHub か BitBucket のどちらかの Package Control Channel リポジトリにアクセスします。どちらにアクセスしても見えるものは同じです。

* https://github.com/wbond/package_control_channel
* https://bitbucket.org/wbond/package_control_channel

「Fork」ボタンを押して、自分のリポジトリにプロジェクトをコピーします。

repository ディレクトリの中に入ります。登録しようとしているパッケージの頭文字がAならa.json、Bならb.json、2なら0-9.json、…のファイルを開きます。(注:登録しようとしているパッケージ名にsublimeという文字が含まれていると審査で却下されますので、その場合はこの段階でパッケージ名を再検討しましょう)。

アルファベット順に他の人のパッケージが並んでいるので、それを壊さぬように追加します。書き方は[別記事を参照してください](http://qiita.com/makopo/items/25c73b186aa73a9edd3a)。

コミット、Push します。

### Pull Request

自分のプロジェクトの「Pull Request」ボタンを押します。

タイトル、説明は真面目に書きましょう。

タイトル : Adding **** Package
説明：This is the language definitions for ****.

など。

[私が出した Pull Request です。参考になれば。](https://github.com/wbond/package_control_channel/pull/761)Package Controlの方式が変更される前なので、コミット内容は無視してください。

[こちらが、私が新方式で出した Pull Request です。](https://github.com/wbond/package_control_channel/pull/2189)以前の方式で登録した行の削除も入っています。

### チェックツール実行結果を確認する

以前から地味に変わったこととして、Pull Request の後に内容を自動でチェックしてくれるようになりました。Pull Requestした後(5分後ぐらい)に、自分が出したPull Requestのページを見ると、緑色か灰色か黄色の帯が表示されているはずです。黄色なら少し後でもう一度確認しましょう。灰色なら、NGとなっていますので、Detailsというリンクをクリックして、出力内容の最後の方を見て、何が原因か頑張って確認しましょう。だいたい、パッケージがアルファベット順に並んでいないか、インデントがタブでなく空白になっているか、カンマがあるべき場所に無いか、sublime_textの行が無いかだと思います。緑ならOKです。

…もし[この記事](http://qiita.com/makopo/items/25c73b186aa73a9edd3a)の通りに書いていて赤色になってしまったら、記事のコメントにフィードバックいただけると嬉しいです…


### ひたすら待つ

私の場合、２週間待った．．．

### 登録される

[Package Control のページ](https://sublime.wbond.net) に、作成したパッケージが表示されるようになります。おめでとうございます！

なお、不備があればコメントで指摘されます。修正したら再度 Push して、この Pull Request にコメントを追加します（新しく Request を作成しないように）。

## その他

* パッケージを更新したときに表示するメッセージを作成する
* 社内向けに Package Control Channel を作成する

といったこともできます。
詳細は、[本家の解説ページ](https://sublime.wbond.net/docs/developers) を参照してください。
VagrantでUbuntuをインストール


まずは以下のURLのDownloadリンクからVirtualBoxをインストール

> https://www.virtualbox.org/

次にvagrantをインストール

```
gem install vagrant
```

次に入れたいOSを以下のURLから探す。

http://www.vagrantbox.es/

ここから入れたいOSを選んだら、そこに書いてあるurlをコピーして

```
vagrant box add {title} {url}
vagrant init {title}
vagrant up
```

で立てる。`{title}`は勝手につけて良い名前みたい。

自分は`Official Ubuntu 12.10 daily Cloud Image amd64 (Guest Additions)`を入れてみた。

```
vagrant box add ubuntu http://cloud-images.ubuntu.com/quantal/current/quantal-server-cloudimg-vagrant-amd64-disk1.box
```

ちなみに、Guest Additionsってなんだろうって思って調べると、VirtualBoxのホストOSとゲストOS間でマウスカーソルをうまい感じに移動させるものらしい。入れておいてくれてありがとうってことで深入りしないことに。

この後、

```
vagrant init ubuntu                                                                          
vagrant up
```

とやるだけで、LocalにUbuntuが立ち上がる。

```
vagrant ssh
```

でUbuntuにsshで入れる。後は自由に。

使い終わって立ち上げっぱなしが気になる場合は、

```
vagrant halt
```

で終了。

また使うときは、

```
vagrant up
vagrant ssh
```

で。

## Sandbox化


Sandbox化して使いたい場合は、
https://github.com/jedi4ever/sahara
を使うと良い。

ほぼドキュメントのコピペだが、何かするときは

```
vagrant sandbox on && vagrant ssh 
```

終わったら、

```
vagrant sandbox rollback && vagrant sandbox off
```

とするとsshで行った内容は全て無効になる。
内容を反映させる場合は、

```
vagrant sandbox commit && vagrant sandbox off
```

とすること。
Sublime Text 2 言語パッケージ作成：パッケージを公開する（基本編）


作成した Sublime Text 2 プラグインを「とりあえず」他の人が使えるようにする方法を説明します。

プラグインの作り方はこちら。
* [チュートリアルのまとめ](http://qiita.com/items/a0ad69dab894ffe22e5d)
* [構文定義編](http://qiita.com/items/64531b7372b450a7c3ee)
* [補完定義編](http://qiita.com/items/02e7c4cd8b90288eb767)
* [言語設定編](http://qiita.com/items/e6a07196d53c6708fe61)

## 準備

1. パッケージ名を決めます。
1. GitHub または BitBucket にリポジトリを作成します。リポジトリ名にパッケージ名、説明にパッケージの説明を書きます。
1. 作成したプラグインを格納します。
1. 利用者にリポジトリ URL とパッケージ名と、適用方法(次項)をお知らせします。

Package Control では、以下の形式のリポジトリ URL に対応しています。
* https://github.com/ユーザ名/リポジトリ名
* https://github.com/ユーザ名/リポジトリ名/tree/branch
* https://github.com/ユーザ名または組織名
* https://bitbucket.org/ユーザ名/リポジトリ名

なお、１度に複数のパッケージを公開したい場合は、Sublime Text2 パッケージ提供専用のアカウントを取って、パッケージの数だけリポジトリを作って公開し、上から３番目の形式の URL をリポジトリ URL として使用します。

## パッケージ適用方法

1. Package Control を開きます。
1. **Package Control: Add Repository** を選択します。
1. リポジトリ URL を入力します。
1. **Package Control: Install Package** を選択します。
1. パッケージ名を検索・選択すると、パッケージがダウンロードされ、使えるようになります。

## これで完了！でも...

* 利用者に Add Repository してもらうのが面倒
* リポジトリ名がそのままパッケージ名になるのはちょっと...
* 俺 OSX でしか動作確認してないから Windows で使われると困る
* バージョン表記が日付になってるけど、そこは自分で決めたいよね
* 俺どうしても GitHub や BitBucket 使うの嫌なんだけど

この場合、さらにひと手間かける必要があります。詳しくは[応用編](http://qiita.com/items/83d551b5594e7802a3c4)で。
iOS Delegate

Delegateメソッドを実装したときのメモ

###Hogeクラス
今回は、Hogeクラスであるイベント(onTapEvent)が起きたときに、Fugaクラスに実装しているデリゲートメソッド(hogeDelegateMethod)を呼び出す例。

```Hoge.h
#import <UIKit/UIKit.h>


@protocol HogeDelegate
//Fugaクラスに実装するメソッド
- (void)hogeDelegateMethod;
@end

@interface Hoge : UIViewController
@property (weak,nonatomic) id <HogeDelegate> delegate
@end
```

```Hoge.m
#import "Hoge.h"


@interface Hoge ()

@end

@implementation Hoge

- (void)viewDidLoad
{
    [super viewDidLoad];
}


//onTapEventが実行されるたびにデリゲートメソッドを呼び出す
- (void)onTapEvent
{
    //Fugaクラスに実装してあるHogeDelegateMethodを呼び出す
    [self.delegate hogeDelegateMethod];
}

@end
```

###Fugaクラス

```Fuga.h
#import <UIKit/UIKit.h>
#import "Hoge.h"
@interface Fuga <HogeDelegate>

@end
```

今回は、初期化とともにHogeクラスのインスタンスを生成したが、別にインスタンスを生成するタイミングはいつでもOK

```Fuga.m
#import "Fuga.h"

@interface Fuga ()

@end

@implementation Fuga

//初期化とともにHogeクラスのインスタンスを生成し、delegateプロパティに自身(Fugaクラスのインスタンス)を設定
-(id)init{
    if((self = [super init]) != nil){
        Hoge *hoge = [[Hoge alloc] init];
        hoge.delegate = self;
    }
    return self;
}

//Hogeクラスから呼び出されるデリゲートメソッド
- (void)hogeDelegateMethod
{
    NSLog(@"デリゲート");
}

@end
```

##参照
・[Objective-Cの基礎（プロトコル定義）](http://eikatou.net/blog/2012/06/objective-c_kiso_protocol/ "Objective-Cの基礎（プロトコル定義）")
・[カスタマイズしたUITableViewCellから自前のイベントを受け取る](http://www.ict-fractal.com/blog/2012/02/uitableviewcell.html "カスタマイズしたUITableViewCellから自前のイベントを受け取る")
・[Objective-Cでprotocolとかdelegateとかいい感じに警告をなくす](http://d.hatena.ne.jp/peccu/20110610/delegate "Objective-Cでprotocolとかdelegateとかいい感じに警告をなくす")
UIPickerView

UIPickerViewを使ったときのメモ

ヘッダファイルにUIPickerViewDelegateを追加。

```ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIPickerViewDelegate>

@end
```

実装ファイルに以下の記述を追加。

```ViewController.m
#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIPickerView *picker;
@end

@implementation ViewController
{
    NSArray* categoryArray;
}


- (void)viewDidLoad
{
    [super viewDidLoad];
  
    // pickerdelegateの設定
    self.picker.delegate = self;

    //カテゴリを配列に
    categoryArray = [NSArray arrayWithObjects:
                     @"Ambient",
                     @"SoloAmbient",
                     @"Playback",
                     @"Record",
                     @"PlayAndRecord",
                     @"AudioProcessing", nil];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


// ピッカービューのコンポーネント（行）の数を返す *必須
- (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}

// 行数を返す例　*必須
- (NSInteger) pickerView: (UIPickerView*)pView numberOfRowsInComponent:(NSInteger) component {
    int cnt = [categoryArray count];
    return cnt;
}

// ピッカービューの行のタイトルを返す
- (NSString*)pickerView: (UIPickerView*) pView titleForRow:(NSInteger) row forComponent:(NSInteger)componet
{
    //n行目に配列のn番目の要素を設定
    return [categoryArray objectAtIndex:row];
}

//選択されたピッカービューを取得
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    //0列目の選択している行番号を取得
    NSInteger selectedRow = [pickerView selectedRowInComponent:0];
    NSLog(@"%d", selectedRow);
}

@end
```

##参照
・[ピッカービュー(UIPickerView)の使い方](http://araking56.blog134.fc2.com/blog-entry-200.html "ピッカービュー(UIPickerView)の使い方")
・[iPhoneアプリ開発の虎の巻](http://iphone-tora.sakura.ne.jp/uipickerview.html "iPhoneアプリ開発の虎の巻")
・[UIPickerViewの基本的な使い方](http://www.objectivec-iphone.com/UIKit/UIPickerView/UIPickerView.html "UIPickerViewの基本的な使い方")
UIButton

UIButtonをプログラムで生成して表示する。

```UIButton.m
//UIbuttonの生成
UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
//ボタンの表示位置とサイズの設定
btn.frame = CGRectMake(10, 10, 100, 30);
//ボタンのタイトル
[btn setTitle:@"ボタンのタイトル" forState:UIControlStateNormal];
//ボタンがタッチダウンされたときに呼び出されるメソッドを設定
[btn addTarget:self action:@selector(hoge:)
     forControlEvents:UIControlEventTouchDown];
//サブビューに追加
[self.view addSubview:btn];


//画像を指定したボタン
UIImage* img [UIImage imageNamed:@"hoge"];
UIButton *btn = [[UIButton alloc] itinitWithFrame:CGRectMake(10, 10, 100, 30)];
//背景に画像をセット
[btn setBackgroundImage:img forState:UIControlStateNormal];
[btn addTarget:self
        action:@selector(hoge:) forControlEvents:UIControlEventTouchUpInside];
//サブビューに追加
[self.view addSubview:btn];


// 呼ばれるhogeメソッド
-(void)hoge:(id)sender{
        // ここに何かの処理を記述する
}
```

##参照
・[iPhoneアプリ開発の虎の巻](http://iphone-tora.sakura.ne.jp/uibutton.html "iPhoneアプリ開発の虎の巻")
・[プログラムで複数配置したUIButtonで、どのUIButtonが押されたか判別したい](http://plus.vc/iphone/6146/ "プログラムで複数配置したUIButtonで、どのUIButtonが押されたか判別したい")
iOSでアニメーション

UIImageViewではアニメーションを実現できる。ようはパラパラマンガみたいな感じ。

```animationImages.m
//アニメーションの素材
UIImage* img0 = [UIImage imageNamed:@"img0"];
UIImage* img1 = [UIImage imageNamed:@"img1"];
UIImage* img2 = [UIImage imageNamed:@"img2"];
NSArray* imgArray  = [NSArray arrayWithObjects:img0, img1, img2, nil];

//アニメーションのコマの設定
UIImageView.animationImages = imgArray;
//アニメーションのリピート回数の設定（０は無限ループ）
UIImageView.animationRepeatCount = 0;
//コマの切り替わる時間の設定
UIImageView.animationDuration = 2.0;


//アニメーションの再生
[UIImageView startAnimating]
//アニメーションの停止
[UIImageView stopAnimating]
```

##参照
[iPhoneアプリ開発の虎の巻](http://iphone-tora.sakura.ne.jp/uiimageview.html "iPhoneアプリ開発の虎の巻")
Rails Runnerを使ってみる


Railsでは、rails runnerコマンドでRubyファイルを直接実行できるらしい。

基本的にはこのサイトを参考にした
- [Rails3でバッチ処理を実行する](http://www.slowlydays.net/wordpress/?p=707 "Rails3でバッチ処理を実行する")

##1. libディレクトリのファイルへのパスの設定

以下の設定を`config/application.rb`に追加。

```application.rb
config.autoload_paths += %W(#{config.root}/lib)
```

##2. rails runnerコマンドで実行するプログラムの作成

libの下に以下の内容でファイルを作成

```get_rss.rb
class Cron::GetRss
  def self.get_rss
    # 実行したい処理
  end
end
```


参考にしたサイトではlib/tasksにファイルを作成していたが、lib以下ならどこでもいいらしい。
lib/tasksには、独自のRakeタスクのみ置いた方がわかりやすいと思った。

なので、今回はlib/cron/get_rss.rbを作成。
クラス名を上記のようにCron::GetRssにしないとrails runnerでエラーが起こる。
たとえば、lib/pdf_stuff/receipt.rbなら、クラス名はPdfStuff::Receiptにする。

この辺の情報が役に立った 
- RailsによるアジャイルWebアプリケーション開発　第4版 245ページ


##3. 実行

ターミナルでrails runnerコマンドを実行。
`rails runner Cron::GetRss.get_rss`
magitでコミットメッセージを72文字で折り返すようにする



[【翻訳】Gitのコミットメッセージに関する注意点][git] に従って、magitでコミットメッセージを72文字で折り返すようにした。

```scm
(add-hook 'magit-log-edit-mode-hook
		  (lambda()
			(set (make-local-variable 'fill-column) 72)
			(turn-on-auto-fill)))
```

[git]: http://keijinsonyaban.blogspot.jp/2011/01/git.html
Brace Expansionが便利


{}を使うと複合的な連番だったり，部分的に異なる文字列なんかを簡単に生成できます．

```
$ echo {a..f}{1..9}
a1 a2 a3 a4 a5 a6 a7 a8 a9 b1 b2 b3 b4 b5 b6 b7 b8 b9 c1 c2 c3 c4 c5 c6 c7 c8 c9 d1 d2 d3 d4 d5 d6 d7 d8 d9 e1 e2 e3 e4 e5 e6 e7 e8 e9 f1 f2 f3 f4 f5 f6 f7 f8 f9

$ echo hoge{,5,10}
hoge hoge5 hoge10

# 入れ子もおーけー
$ echo hoge{,_{a,b{,c,d}}}
hoge hoge_a hoge_b hoge_bc hoge_bd
```


for文で連番つくるときにしか使ったことありませんでしたが，ファイル，ディレクトリ名なんかをうまくこいつで指定してやれば，パスが長かったりで面倒なときにいろいろ楽できそうです．

```
$ cp hoge{,old}
$ mkdir /home/web/{css,js,img}
```
デザイナーからもらったhtml,css,javascriptのセットをrails3.2でassets pipe_lineに組み込む方法

### 前提
もらった素材は下記のようになっているものとします。
img/
javascritps/
css/
index.html
test1.html
...
   
### 手順
1.もらった画像をすべて、assets/images/にぶっこみます。
2.もらったcssをすべて、assets/stylecss/にぶっこみます。
3.もらったjavascriptをすべて、assets/javascripts/にぶっこみます。
4.cssで画像を参照している場合は、下記の２点をおこないます。
* ファイル名の末尾に、.scssを追加
* ファイルの中の画像参照を下記ように変更

(旧)

```css:hoge.css
background:url(../img/background.gif)  
```

(新)

```scss:hoge.css.scss
background:image_url("background.gif")  
```

※assets_pipelineで、scssとしてcssをコンパイルしてもらい、
image_url関数で適切な場所に値をいれてもらいます。

5. cssでimport文を利用していて、読み込む順番がimportの順で必要な場合は書きどちらかのことをする必要が在ります。
* ひとつのcssファイルに全部かく
* application.css の require_tree を削除して、すべてのcss.scss を require で参照する。

たとえば、
```csss:style_hoge.css
@import "reset.css"
@import  "common.css"
@import "hoge.css"
```
となってるとき、

```css:application.css
/*
*= require_self
*= require reset
*=  require common
*= require hoge
*/
```

のようにします。
ファイルの逆順出力

ファイルを逆順に出力したい事がたまにあると思います。
FreeBSD の *tail(1)* には **-r** オプションがあってファイルを行単位で逆順に出力できますが、これは POSIX.2 にはない拡張仕様なので汎用的ではありません。
Linux では *tac(1)* (多分逆順に出力する cat だから tac) というコマンドがインストールされている事もありますが、これも POSIX.2 には存在せず Linux でも標準ではインストールされていない場合があります。
ファイルの逆順を出力するなら、ここでも *ex(1)* を利用するのが簡単です。

```sh:
#!/bin/sh

/bin/ex -s ${1} <<-EOF
	g/^/mo0
	%p
EOF

```

この様なスクリプトで汎用的なファイル逆順出力ができます。

このスクリプトは *ex(1)* を利用して「行の先頭 (^) を 0 行目に移動(mo0)して、 全行を表示する(%p)」というコマンドを実行しています。
行の先頭は全ての行に存在するので全ての行が処理対象になります。 各行を順番に 0 行目(1 行目の前の行なので先頭行)に移動するので、結果としてファイルの内容が逆順に表示される事になります。 

ね？ *ex(1)* ってやっぱり便利でしょう?
phpのバッチを繰り返し実行し間隔を実行中に変更可能なbashスクリプト

初期設置後はアプリケーションのファイルをアップロードして更新しかできない(sshアクセス不可)という条件下で、phpのバッチを指定した間隔で繰り返し実行し、実行中に間隔を変更したいという要件があったので書きました。

```sh:loopExecPhp.sh
#!/bin/sh
config_file="${0%.*}.config"

while :
do
  . $config_file
  [ -f $batch_php_file ] && php $batch_php_file $batch_php_args
  sleep $sleep_seconds
done
```

設定ファイルはloopExecPhp.shと同じディレクトリに配置してください。

```sh:loopExecPhp.config
sleep_seconds=2

batch_php_file=/path/to/your_batch.php
batch_php_args='--your-option-here --another-option-here'
```

phpは長時間実行し続けるとメモリリークが起きるなどして不安定になります。一方起動は十分早いので毎回起動することにして、bashでループするようにしました。

実行間隔や実行ファイルあるいは実行するかしないかを、設定ファイルをアップロードする切り替えられるように、設定ファイルをループ内で毎回読み込むようにしています。

CentOS6のupstart用に以下の設定ファイルを追加すれば、OS起動時に自動起動でき、loopExecPhp.shが異常終了しても再起動できます。

```:/etc/init/your_service_name.conf
start on runlevel [2345]
stop on runlevel [016]
respawn
exec /bin/sh /path/to/loopExecPhp.sh
```

これでサービスは上げたままにしておいて、loopExecPhp.configを編集してアップロードすれば、実行間隔や実行ファイルや実行するかしないかを変更できるというわけです。
UIControl 割り当てられたメソッドを削除して入れ替える


UIButtonなどのUIControlクラス(or継承)で、割り当てられているメソッドを削除して新しいメソッドを割り当てる方法です。

例えば、Appleが実装し用意しているViewControllerとそれに追加されてUIButtonがあるとします。
このUIButtonが呼び出している何だかわからないメソッドを削除し任意のメソッドを呼び出すようにしたくてやりました。

## サンプルコード

仮で`UIViewController *targetVC`と`UIButton *buttonで`説明します。

```objectivec:
UIViewController *targetVC = [[UIViewController alloc] init];
UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
[button addTarget:targetVC action:@selector(action1) forControlEvents:UIControlEventTouchUpInside];
[button addTarget:targetVC action:@selector(action2) forControlEvents:UIControlEventTouchUpInside];

/* 以下でbuttonのアクションを削除します */
    
// targetVCをターゲットにしたUIControlEventTouchUpInsideイベントに割り当てられている全SEL名を取得する
NSArray *sels = [button actionsForTarget:targetVC forControlEvent:UIControlEventTouchUpInside];
NSLog(@"sels %@", sels);
for (NSString *selName in sels) {
    // targetVCをターゲットにしたUIControlEventTouchUpInsideイベントに割り当てられているselNameのアクションを削除する
    NSLog(@"remove selName %@", selName);
    [button removeTarget:targetVC action:NSSelectorFromString(selName) forControlEvents:UIControlEventTouchUpInside];
}
sels = [button actionsForTarget:targetVC forControlEvent:UIControlEventTouchUpInside];
NSLog(@"sels %@", sels);
    
// buttonに新しいメソッドを追加する
[button addTarget:targetVC action:@selector(newAction) forControlEvents:UIControlEventTouchUpInside];
sels = [button actionsForTarget:targetVC forControlEvent:UIControlEventTouchUpInside];
NSLog(@"sels %@", sels);
```
lxmlでブロークンなXMLをパースする


lxmlはlibxml2に基いてXMLをパースしているが、BeautifulSoupは正規表現に基いてXMLをパースしているため、以下の様なブロークンなXMLでもパースすることが出来る。

速度的にはlxmlを使いたいけど、BeautifulSoupが必要かもしれない、というようなどちらを使うか迷うような状況に対してlxmlは以下の様なインターフェースを提供してくれる。

入力が下のようなブロークンなXMLだとする。

```
<piyo>bar</piyo>
<piyo>hoge</piyo>
```

##結果

```:python
In [1]: from lxml import etree
In [2]: with open('hoge') as f:
   ...:     xml=etree.fromstring(f.read())
   ...:       File "<string>", line unknown　XMLSyntaxError: Extra content at the end of the document, line 2, column 1
```

```:python
In [3]: from lxml.html.soupparser import fromstring

In [4]: with open('hoge') as f:
   ...:     xml=fromstring(f.read())
   ...:

In [5]: for piyo in xml.findall('piyo'): print piyo.text.strip()
bar
hoge
```

##参考
http://lxml.de/elementsoup.html
HTML5のタグについて勉強してみた。その1 -まずは大枠を作ってみる-


#その1 -まずは大枠を作ってみる-
1. DOCTYPE宣言について
2. 文字コードの指定について
3. 1-2を踏まえてざっくりとしたテンプレート
4. もっとシンプルなテンプレート

## 1.DOCTYPE宣言について
HTML4では↓こんな感じでした。

```html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
```

HTML5では↓こうなります。

```html
<!DOCTYPE html>
```

わーお、シンプル。
HTML4はなんであんなに長かったのか、、、は、もう今後なくなっていくだろうし説明しません。とにかくHTML5はよりシンプルな宣言になったよ、ということだけ覚えておきましょう。

## 2. 文字コードの指定について
HTML4では↓こんな感じ。

```html
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
```

HTML5では↓こんな感じ。

```html
<meta charset="UTF-8">
```

はい、シンプルゥ～。
余計なものはもういりませんよ、と。

## 3. 1-2を踏まえてざっくりとしたテンプレート
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML5、勉強してます！</title>
</head>
<body>
<p>Hello HTML5!</p>
</body>
</html>
```

なんか、サッパリしてるねっ！
要はね、DOCTYPEを`<!DOCTYPE html>`に変えればHTML5と認識されるっぽいっす。

##4. もっとシンプルなテンプレート
調べたら、なんと、
`<html>`タグ
`<head>`タグ
`<body>`タグ
は省略可能らしい。

[HTML5で省略できる要素](http://artmo.cocolog-nifty.com/blog/2011/08/html5-4bbf.html)

ってことは、最高にシンプルにするとこんな感じになるんじゃない？

```html
<!DOCTYPE html>
<meta charset="UTF-8">
<title>HTML5、勉強してます！</title>
<p>Hello HTML5!</p>
```

短っ！
本当に省略していいの？
不安なので、HTML5のバリデーションチェックしてみた。

[タグ省略してないバージョン](http://html5.validator.nu/?doc=http%3A%2F%2Fmasamitsu.wonderful.to%2Fhtml5%2Fsample%2Fsimple.html&showsource=yes)
[タグ省略したバージョン](http://html5.validator.nu/?doc=http%3A%2F%2Fmasamitsu.wonderful.to%2Fhtml5%2Fsample%2Fverysimple.html&showsource=yes)

うん、大丈夫そうだね。
すっげーシンプルになったな。

懸念点としては、ソースが増えた場合に`<head>`と`<body>`がないとわかりづらくなる、ってくらいかな。まあ、2,3行改行して区切れば回避できるだろうけど。

よし、今後はタグ省略で作ってみよう。

###参考記事
[HTML&XHTML標準（HTML5も）に準拠しているか検証できるサービス](http://qiita.com/items/72bfec31d29ce74006fa)
Rubyによる最速Webサイト構築 | SinatraのインストールからHerokuへの公開まで

※この記事はMacの人を対象にしています。Windows/Linux嫌いです。
-> Mac持っていない人はぜひhttp://www.amazon.co.jp/で買いましょう

次に、Rubyをインストールしよう！
-> Rubyはとても楽しい簡単な言語です
-> WebだとJava/PHP/Ruby/Pythonあたりがよく使われていますが、一度Ruby使うとPHPのコードをみるとむしゃくしゃします。PythonはRubyに比べ、まだ普及しきっていなく、初心者にはお勧めいたしかねます。Javaはなんか楽しくないです。Webで使おうと思った場合、結構インフラ環境が制限されます。

MacだとHomebrewというツールでコンソールから1行コピペでRuby入ります。
※もしターミナル？コンソール？って方はこちらから！
http://allabout.co.jp/gm/gc/2962/

※Homebrewをまだ入れてないかたはこちらから
http://tools4hack.santalab.me/howto-mountainlion-install-homebrew.html

Homebrewを入れた方はこんな感じでRuby入れてください
http://blog.lampetty.net/blog_ja/index.php/archives/475

さて、次にSinatraを始めましょう。
SinatraはとりあえずRubyで何かウェブサイトを作ろうと思った時に最速で出来る便利なこです。
一応公式サイトはこちらです。
http://www.sinatrarb.com/

rubyのインストールはすでに終わっているはずなので、この1行でsinatraが使えるようになります。
```
gem install sinatra
```

次に、viというテキストエディタでファイルの作成を始めましょう。
```
vi myqpp.rb
```
もし、viって何？って人は、MacVimってのが個人的にはおすすめなので、ぜひインストールしてみてください。
https://code.google.com/p/macvim/

...と思ったんだけど、初心者向けに投稿を作るのはほんとに難しいのでここで一旦断念
m(_ _)m
縦書き・横書きの相互変換の試作

縦書き・横書きの相互変換をつくってみました。いまは単に動作しているだけですが。
  http://homepage2.nifty.com/youichi_kato/src/h2v/pub/index.html

画面デザイン、自動テストを整備したら github に登録する予定です。
変換メソッドのコードは 
   http://homepage2.nifty.com/youichi_kato/src/h2v/h2v.coffee
です。 
    $ coffee -p -b h2v.coffee > h2b.js
として、coffeescript コードから javascript コードを生成しています。
標準エラーと標準出力を同一のファイルに保存したい

linuxでは、標準入力、標準出力、標準エラー出力のファイルディスクリプタは、それぞれ０、１、２に対応しています。これを使ってシェル上でも出力先を切り替えることができます。

出力先を変える場合は、リダイレクト(>)を使います。左側を省略すると1が指定されたものとして扱われます。下記スクリプトは標準出力を/dev/nullにつないでいるため、実行結果は何も表示されません。

```sh
echo "hello" > /dev/null
```

そのことを踏まえて、makeなどでよく使うもので、標準エラー出力と標準出力を一つのファイルで受けたい場合は、次のようにします。

```sh
make > hoge.log 2>&1
```

これだと、標準出力は　hoge.logへリダイレクトされ、そのあとで、　標準エラー出力が標準出力へ切り替わりますが、すでに標準出力は　hoge.logへリダイレクトする設定になっているので、エラーの内容もhoge.logに保存されるということです。
Ruby2.0.0 + Rails3.2.12 + Facebookログイン

# バージョン

* Rubyバージョン

```
ruby -v
----------
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.1]
----------
```

----

# App Setup

### 作業ディレクトリ移動

```
cd ~/labo
```

### Railsアプリ作成

```
rails new rails_app -v 3.2.12
cd rails_app
```

### Gemfile編集

```
vi Gemfile
-----
G：文末へ
$：行末へ
```

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

#gem 'sqlite3'

# 〜

gem 'sqlite3', :group => :development

# For Heroku
gem 'thin'

group :production do
  gem 'pg'
  gem 'newrelic_rpm'
end

# For OmniAuth
gem 'omniauth-scaffold'

# For Routing
gem 'sextant', :group => :development

# Utility
gem 'kaminari'
gem 'action_args'
```

### Gemインストール

```
bundle install --without production
```

※以降の手順でrequireエラーが出る場合は依存Gemインストールのため、下記で個別にインストールする

```
gem i omniauth-scaffold
```

### OmniAuth用スキャフォールド作成

```
rails g omniauth:scaffold
```

### New Relic準備

```
curl https://raw.github.com/gist/2253296/newrelic.yml > config/newrelic.yml
```

### アプリ名設定

```
vi config/settings.yml
```

```ruby
# アプリケーション名
app_name: "Rails App"
```

### マイグレーション

```
rake db:migrate
```

### Railsサーバ起動

```
rails s
```

### ローカルサイト確認

[http://0.0.0.0:3000/](http://0.0.0.0:3000/)

----

# GitHub

### GitHubリポジトリ作成

[https://github.com/repositories/new](https://github.com/repositories/new)

```
Project Name
[ APP_NAME ]
    
Description (optional)
[ APP_DESCRIPTION ]
    
※チェック：Initialize this repository with a README
Add .gitignore: None
```

```
git init && git add . && git commit -m "First commit"
```

### GitHubリポジトリアドレス

```
HTTP => SSH
```

### GitHubリポジトリプッシュ

```
git remote add origin git@github.com:USER_NAME/rails_app.git
git push -u origin master
```

### GitHubリポジトリ

```
https://github.com/USER_NAME/rails_app
```

----

# Heroku

### Herokuアプリ作成

```
heroku create rails_app
```

### リモートリポジトリ確認

```
git remote -v
-----
heroku	git@heroku.com:rails_app.git (fetch)
heroku	git@heroku.com:rails_app.git (push)
origin	git@github.com:USER_NAME/rails_app (fetch)
origin	git@github.com:USER_NAME/rails_app (push)
-----
```

### Herokuプッシュ

```
git push heroku master
```

### Herokuマイグレーション

```
heroku run rake db:migrate
```

### Facebookアプリ登録

* [Facebook開発者](https://developers.facebook.com/apps)
 => 「新しいアプリを作成」

```
App Name: [ Rails App ]
App Namespace: [ 空欄 ]
Web Hosting: [ チェック無し ]
```

=> 「続行」

```
App ID:      XXXXX
App Secret:  XXXXXXXXXX
```

```
Website with Facebook Login: [ https://rails_app.herokuapp.com/ ]
```

### Heroku環境変数設定

```
heroku config:add FACEBOOK_APP_ID=XXXXXXXXXX
heroku config:add FACEBOOK_APP_SECRET=XXXXXXXXXX
```

### Heroku設定確認

```
heroku config | grep "FACEBOOK"
-----
FACEBOOK_APP_ID:            XXXXXXXXXX
FACEBOOK_APP_SECRET:        XXXXXXXXXX
-----
```

### Herokuタイムゾーン設定

```
heroku config:add TZ=Asia/Tokyo
```

### Herokuアドオンインストール(FREE-Only)

```
heroku addons:add pgbackups:auto-month
heroku addons:add newrelic:standard
heroku addons:add scheduler:standard
heroku addons:add papertrail:choklad
```

### Herokuアドオン確認

```
heroku addons
```

### Herokuページオープン

```
heroku open
```

### Heroku公開サイト

https://rails_app.herokuapp.com/

### アイドル防止

※New Relic Ping設定
暗視ゴーグルシェーダー

ちょっと苦労しました

マスク＋色調整＋ノイズ＋ゆがみ＋数式
https://www.shadertoy.com/view/Xsf3RN

これで暗視ゴーグルiOSアプリでも作るか・・・
コマンドの引数内で変数を扱う際に気をつけること

スクリプトを書いていて，コマンドの引数やら，awkのスクリプトやらにシェルの変数を用いることはほんっとーによくあることだと思います．まず先に結論をいうと，

"変数展開に気をつけろ"

ということです．
この先を見てもらえれば当たり前の話じゃねーかよって感じで恐縮ですが，なんどもこいつでつまずいてるので，自分を戒めるためにメモ．

自分がはまっていた具体例をまず出します．awkの正規表現中にシェルの変数を用いる，というものです．これはawkスクリプトを「'」か「"」のいずれかで囲った場合に分けて，次のように記述できます．

```
ptn="foo"
echo "foo bar" | awk '/'${ptn}'/{print $0}'
#または
echo "foo bar" | awk '/'''${ptn}'''/{print $0}'
```
```
ptn="foo"
echo "foo bar" | awk "/${ptn}/{print \$0}"
#または
echo "foo bar" | awk "/"""${ptn}"""/{print \$0}"
```

トリプルクォートは調べてたら見つかったのでおまけです(用途がいまいちピンとこないので教えていただければ喜びます)．けれどもこやつら，完璧ではありません．この渡し方では上記の変数hogeに空白が含まれている場合，構文エラーとなってしまいます．なので，以下のように記述すれば空白を含む変数に対しても有効となります．

```
ptn="foo　bar"
# OK
echo "hoge foo bar" | awk '/'"${ptn}"'/{print $0}'
# ERROR
echo "hoge foo bar" | awk '/'${ptn}'/{print $0}'
```

じゃあ先の記述だとなにがいけないのか．肝となるのはシェルの変数展開です．変数を「"」でくくるか否かで，評価が変わります．

```
hoge="hoge foo bar"
${hoge}   -> "hoge" "foo" "bar"
"${hoge}" -> "hoge foo bar"
```
変数には1つの文字列が格納されているにも関わらず，展開すると空白を区切り文字として複数の文字列に置き換わってしまいます．例えばこれをtouchコマンドの引数にとれば，前者ではhoge,foo,barの3つのファイルができ，後者では"hoge foo bar"という1つのファイルが出来るというわけです．

つまり先のawkの例では以下のように評価されます．

```
ptn="foo bar"
# OK
awk '/'"${ptn}"'/{print $0}' -> awk '/foo bar/{print $0}'
# ERROR
awk '/'${ptn}'/{print $0}'   -> awk '/foo' 'bar/{print $0}'
```

こういうわけで，”変数展開には気をつけろ”です．以上，当たり前な話でした．
XOOPS Cubeのテーマでトップページ判定するためのPreload


まだtheme.html内で一発でサクッとトップページへのアクセスかを判定する方法がなかったようなので、ついカッとなってやってしまった

下記コードをhtml/preload/IsToppage.class.phpとして保存。

```php
<?php
class IsToppage extends XCube_ActionFilter
{
    protected $isTop = false;
    public function preBlockFilter()
    {
        $this->mController->mRoot->mDelegateManager->add("Legacypage.Top.Access", array(&$this, 'topAccess'));
    }

    public function topAccess()
    {
        $this->isTop = true;
        $GLOBALS['xoopsTpl']->assign('xoops_is_top', $this->isTop);
    }
}
```

そしたらtheme.htmlないで下記のように判定につかえます

```
<{if $xoops_is_top }>
トップページぺん！
<{else}>
トップページじゃなかったぺーん
<{/if}>
```

# 2015/10/05追記
ファイルを[gistに用意](https://gist.github.com/RyujiAMANO/bbbd50887bc1e884e73d)しました。
Mac のスクリーンショットを定期的に自動撮影する


10分ごととかに Mac スクリーンショットを自動撮影する方法です。**ライフログに、あるいはサボり防止に**役立つかもしれません。


##手順


###1. シェルスクリプトの準備
適当なフォルダを作成して、シェルスクリプトのファイルを生成します。（下記サンプルではホーム直下にssというフォルダを作成）

````
$ cd
$ mkdir ss
$ cd ss
$ touch capture.sh
````


生成したスクリプトファイルを編集します。（最後のパスは出力先。よしなに変えてください）

````
#!/bin/bash

/usr/sbin/screencapture -m -C -T0 -x ~/ss/capture_`date +%Y%m%d%H%M`.png
````


スクリプトに実行権限をつけます。

````
$ chmod +x capture.sh
````

※注意：このスクリプトではファイル名に日時をつけているので、画像がどんどん溜まっていくことになります。定期的に溜まったファイルを削除するスクリプトを登録する等、**HDDがいつの間にか一杯にならないような工夫**をしないと実用的ではないので、ご注意ください。


###2. crontab の編集

````
$ crontab -e
````

で、crontabの編集に入るので、


````
*/5 * * * * ~/ss/capture.sh
````

と書いて保存します。


こうすると5分ごとにスクリーンキャプチャが保存されるようになります。


保存間隔を10分ごとにしたい場合は、次のようにします。

````
*/10 * * * * ~/ss/capture.sh
````


ちなみに、現在の crontab の内容を確認するには、`-l` オプションを使用します。

````
$ crontab -l
````


（参考）

[crontabの書き方](http://www.server-memo.net/tips/crontab.html)


##余談
本件で crontab を初めて使ったのですが、はじめ動作せず困りました。


スクリプトの1行目の

````
#!/bin/bash
````

を書いていなかったことと、


`screencapture`コマンドを

````
/usr/sbin/screencapture
````

とせず

````
screencapture
````

とだけ指定していたことが原因でした。


どちらもスクリプトをターミナルから実行する際には問題なかったので、なかなか気付くことができず。。


この辺りは、環境変数の設定とか実行ユーザーとか、環境に依るところなので誰にでも当てはまる話ではないと思いますが、ご参考まで。


##Thanks
こちらのリポジトリで方法を知りました。大西さんありがとうございます！


[yc2013](https://github.com/024t910/yc2013)
Sinatra-S3 で Amazon S3 を使ったテストをする

FrogApps 技術ブログ始めました!
RailsやiOS、HTML5の情報を発信中!! → http://qiita.com/teams/frogapps

-

Sinatra-S3 は Amazon S3 をsinatraで実装したものです。
本家
https://github.com/nricciar/sinatra-s3
だとそのまま使えなかったのですが、CTOがforkして使えるようにしてくださいました。
https://github.com/FrogAppsDev/sinatra-s3

RailsでRspecのテストをする際に、このsinatra-s3を使えばローカルでもAmazon S3関連の動作確認をすることができます。


##インストール
```
git clone git://github.com/FrogAppsDev/sinatra-s3.git
cd sinatra-s3/
bundle install
cp s3.yml.example s3.yml
rake db:migrate
```

##起動
```
rackup config.ru -p 6060
```

起動すると http://127.0.0.1:6060/control/ で管理画面を開けます。
(ID,passwordはデフォルトでは admin / pass@word1)
認証して入ると、bucketを作ったり、作られたobjectの管理をすることができます。

管理画面のスクリーンショット
http://gyazo.com/b91d9403b0a3829d91ef02deaafa8404
http://gyazo.com/47b563f5faab1e14a17a8a57b30f0d4d

管理画面から画像を開いたとき、たまに500エラーになることがあるようです。ちょっと不安定かも。


##備考
同じような実装として他に ParkPlace があるのですが、ここ何年か更新されていません。
https://github.com/mattjamieson/parkplace
svn2gitで動かない

subversionを大人数で運用してconflictの雨嵐状態から離脱するためにgitに強制的に移行することになりました。

repositoryを移動するためにsvn2gitの出番ですが、

```
svn2git http://REPOSV/path/ --verbose --username hoge
```

だとエラーで落ちる。
どうやらしらべてみると、repositoryがtrunk/branches/tagsのフォルダーわけて運用していることを前提に書かれているらしい。念のために一度生成された.gitフォルダーを消してから、

```
svn2git http://REPOSV/path/ --verbose --username hoge   --trunk='/' --tags='/' --branches='/'
```

として無事import開始。
ただrevisionが13万とかになっていていつになったらおわることやら……。