OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptの集約例外ハンドラチートシート

JavaScriptのコードで集約例外ハンドラの書き方チートシート。

例外のログを記録したり、画面に謝罪文を表示したりするなど、最低限の例外処理をしておきます。

## window.onerror

普通のJavaScriptコードの例外を捕捉する集約例外ハンドラはwindow.onerrorで設定できます。

```js
window.onerror = function (message, url, lineNumber) {
    console.log(message);
    var msg =
        "画面の処理中にエラーが発生しました。" +
        "ご迷惑をおかけしております。";
    alert(msg);
    return true;
};
```

## $.ajaxSetupのerrorオプション

jQueryのAjax処理で結果が404や500だった場合の集約例外ハンドラは`$.ajaxSetup()`のerrorオプションで設定できます。

```javascript
$.ajaxSetup({
    error: function (xhr) {
        console.log(xhr.responseText);
        var msg =
            "要求の処理中にエラーが発生しました。" +
            "ご迷惑をおかけしております。";
        alert(msg);
    }
});
```

Ajax処理に失敗したときに集約例外ハンドラの処理をしたくない箇所では
`$.ajax()`呼出し時にerrorオプションにnullを渡して上書きします。

```javascript
$.ajax({
    error: null,
    ...
}).done(...) {
    // 正常時の処理
}).fail(...) {
    // その箇所固有の例外処理
});
```

## AngularJSの$exceptionHandler

AngularJS内のJavaScriptコードの例外を捕捉する集約例外ハンドラは$exceptionHandlerで設定できます。

```js
var myApp = angular.module("myApp", []);
myApp.factory("$exceptionHandler", function () {
    return function (exception, cause) {
        console.log(exception.message);
        var msg =
            "画面の処理中にエラーが発生しました。" +
            "ご迷惑をおかけしております。";
        alert(msg);
    };
});
```
twitterライブラリの仕組み


https://github.com/sixohsix/twitter

リストメンバーの取得


```Python
#https://dev.twitter.com/docs/api/1.1/get/lists/members
#tはtwitterオブジェクト
t.lists.members
```

twitterライブラリを使用するときに、APIの/をtwitterオブジェクト.~.~ とつなげることで使えるのはどんな仕組みなんだぜ？と思い、ソースをみたら勉強になったのでメモ

```Python
class CallSample(object):

    def __init__(self,words=()):
        self.words = words

    def __getattr__(self, k):
        try:
            return object.__getattr__(self, k)

        except AttributeError:
            def extend_call(arg):
                return CallSample(words=self.words + (arg,))
            return extend_call(k)

    def __call__(self, **kwargs):
        words = []
        for word in self.words:
            #引数のディクショナリで既存のwordを書き換える。（無ければ既存値）
            words.append(str(kwargs.pop(word, word)))
        return '! '.join(words) + '!!!'
```

内部の処理を簡単にしたのが上記ソース

\__getattr__で存在しない属性値なら、新しいオブジェクトを生成し返却、その際呼び出された文字列をストック。
\__call__はクラスが関数として使用？されたら呼び出される
\__call__が呼ばれたら、ストックした文字列を加工する（ここでは！で区切る）

twitterライブラリでは/で区切りURLを作成してるんですな。


今回作ったサンプルをを下記のように使用すると・・・・

```Python
hoge = CallSample()
print(hoge.れに.かなこ.ももか.しおり.あーりん.いくぜ.ももいろクローバー())
```

__れに! かなこ! ももか! しおり! あーりん! いくぜ! ももいろクローバー!!!__
Dart VM を自前でビルドする (Mac 上で)

## 必要なもの

* Mac
* Xcode

Refs: https://code.google.com/p/dart/wiki/PreparingYourMachine

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

システムに depot_tools がインストールされていなければ, チェックアウトしてきてパスを通す.
Chromium なんかをビルドしたことがあればすでにインストールされているはず.

```bash
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$ export PATH=$PATH:`pwd`/depot_tools
```

Refs: https://code.google.com/p/chromium/wiki/MacBuildInstructions

## ソースコードをチェックアウトする

初めてのときには次のようなコマンドでチェックアウトする.
二度目以降, 最新のコードを取得するためには最後の二行を実行すればいいようだ.

```bash
$ svn ls https://dart.googlecode.com/svn/branches/bleeding_edge/
$ mkdir dart-repo
$ cd dart-repo
$ gclient config https://dart.googlecode.com/svn/branches/bleeding_edge/deps/all.deps
$ git svn clone -rHEAD https://dart.googlecode.com/svn/branches/bleeding_edge/dart dart
$ cd dart
$ git cl rebase
$ gclient sync -n && gclient runhooks
```

Refs: https://code.google.com/p/dart/wiki/GettingTheSource

## ビルドする

次のコマンドを実行するだけ.

```bash
$ ./tools/build.py -m release runtime
```

`dart/sdk/bin/dart` から起動できる. (ただし実体は `xcodebuild/ReleaseXXX/dart` にある.)

```bash
$ ./sdk/bin/dart --version
Dart VM version: 1.2.0-edge.32328 (Thu Feb  6 02:25:46 2014) on "macos_ia32"
```

Refs: https://code.google.com/p/dart/wiki/Building
ASP.NET MVCでRouteを設定する

ASP.NET MVCで「/tags/tagName」といったURLを使えるように設定してみます。

## RouteConfigの設定

RouteConfig.csのRegisterRoutesメソッドの `routes.MapRoute(name: "Default"...` の前に以下のコードを追加します。

```csharp:RouteConfig.cs
routes.MapRoute(
    name: "TagDetail",
    url: "tags/{tagName}",
    defaults: new { controller = "Tag", action = "Detail" }
);
```

これで例えば「/tags/tag1」といったURLに対して、
TagControllerのDetailメソッドが、パラメタtagNameに"tag1"を渡されて、呼び出されます。

## 「.」を許す

タグ名に「.」を含められるようにしたい場合、さらに設定が必要です。
デフォルトの設定では「.」を含むURLは404 Not Foundになってしまいます。
これを「/tags/」以下のPathには「.」も含められるようにするには、
以下の記述をWeb.configのsystem.webServer/handlers内に加えます。

```xml:Web.config
<add name="TagsUrlHandler"
     path="/tags/*"
     verb="*"
     type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />
```

これで「/tags/ASP.NET」といったURLに対しても、
RouteConfig.csで指定したアクションが呼び出されるようになります。
knife solo cook でsite-cookbooks下のcookbookを認識しない場合の対処法

```shell-session
knife solo cook hostname
```
したときに、非情にも`CookBook not found`みたいなエラーが出て、site-cookbooks/下の cookbookを認識してくれない場合の対処法です。

## 結論
`knife solo init .` しましょう。
こうすると、カレントディレクトリに`.chef/knife.rb`が作られます。

```
% cat .chef/knife.rb
cookbook_path    ["cookbooks", "site-cookbooks"]
node_path        "nodes"
role_path        "roles"
environment_path "environments"
data_bag_path    "data_bags"
#encrypted_data_bag_secret "data_bag_key"

knife[:berkshelf_path] = "cookbooks"
```

こうなっていればOKです。

## どうやって原因をつきとめたのか

対象ホストにsshログインして、
`grep -r cookbook_path　~/`
すると、

```shell-session
[vagrant@localhost ~]$ grep -r cookbook_path  chef-solo
chef-solo/solo.rb:cookbook_path []
chef-solo/solo.rb:cookbook_path << File.join(base, 'cookbooks-1') # /home/DK/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/knife-solo-0.4.1/lib/knife-solo/resources/patch_cookbooks
chef-solo/solo.rb:cookbook_path << File.join(base, 'cookbooks-2') # /home/DK/.berkshelf/knife-solo/ae694eab015e5d3e2be23b6b507eeb69853234bf
chef-solo/solo.rb:cookbook_path << File.join(base, 'cookbooks-3') # /home/DK/tmp/vagrant/chef-monogod-memcached-tt/cookbooks
[vagrant@localhost ~]$ cd chef-solo/
[vagrant@localhost chef-solo]$ ls
cookbooks-1  cookbooks-2  cookbooks-3  dna.json  nodes  solo.rb
[vagrant@localhost chef-solo]$ cat solo.rb
base = File.expand_path('..', __FILE__)

nodes_path                File.join(base, 'nodes')
role_path                 File.join(base, 'roles')
data_bag_path             File.join(base, 'data_bags')
encrypted_data_bag_secret File.join(base, 'data_bag_key')
environment_path          File.join(base, 'environments')
environment               "_default"

cookbook_path []
cookbook_path << File.join(base, 'cookbooks-1') # /home/DK/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/knife-solo-0.4.1/lib/knife-solo/resources/patch_cookbooks
cookbook_path << File.join(base, 'cookbooks-2') # /home/DK/.berkshelf/knife-solo/ae694eab015e5d3e2be23b6b507eeb69853234bf
cookbook_path << File.join(base, 'cookbooks-3') # /home/DK/tmp/vagrant/chef-monogod-memcached-tt/cookbooks
```

てな感じになっておりました。
ここで、

* 何かの設定ファイルのもれで"site-cookbooks"が設定できてないんだろうな
* knifeコマンドって`.chef/knife.rb`と関係あるよな
* .chef/knife.rbってどこにあるんだっけ？あれ、ない。
* いつ生成されるんだっけ?

と思い至り、原因究明することができました。
ASP.NET IdentityのUserStoreを自分で作る

ASP.NET Identityで自前のIUserStoreを実装する方法です。

まず、IUserを実装します。
Idが取得できて、UserNameが取得・設定できればそれでOKです。

```csharp
public class MyUser : IUser
{
    public string Id { get; private set; }
    public string UserName { get; set; }
    public MyUser(string id, string userName)
    {
        Id = id;
        UserName = userName;
    }
}
```

次にIUserStore<MyUser>を実装します。
CreateAsync、DeleteAsync、などIUser実装クラスのCRUD処理を実装します。
例ではメモリ内のListに格納するようにします。

```csharp
public class MyUserStore : IUserStore<MyUser>
{
    private List<MyUser> _storedUsers = new List<MyUser>();

    public Task CreateAsync(MyUser user)
    {
        _storedUsers.Add(user);
        return Task.FromResult(0);
    }

    public Task DeleteAsync(MyUser user)
    {
        _storedUsers.Remove(user);
        return Task.FromResult(0);
    }

    public Task<MyUser> FindByIdAsync(string userId)
    {
        var ret = _storedUsers.Where(u => u.Id == userId).SingleOrDefault();
        return Task.FromResult(ret);
    }

    public Task<MyUser> FindByNameAsync(string userName)
    {
        var ret = _storedUsers.Where(u => u.UserName == userName).SingleOrDefault();
        return Task.FromResult(ret);
    }

    public Task UpdateAsync(MyUser user)
    {
        var index = _storedUsers.IndexOf(user);
        if (index < 0)
        {
            throw new ArgumentException("指定されたユーザーは登録されていません。");
        }
        _storedUsers[index] = user;
        return Task.FromResult(0);
    }

    public void Dispose()
    {
        // do nothing
    }
}
```

これで最低限の機能は実装しました。

さらにパスワードの保存、ロールの設定、外部サービスによるログイン対応などに対応するには
IUserPasswordStore<>、IUserRoleStore<>、IUserLoginStore<>などを必要に応じて実装します。
実装についてはMyUserに対応する情報が持てるようプロパティ・メソッドを増やして、
各インタフェースのメソッド内で格納・削除・更新・取得できるようにするだけなので割愛します。

```csharp
public class MyUserStore : IUserStore<MyUser>,
    IUserPasswordStore<MyUser>, IUserRoleStore<MyUser>,
    IUserLoginStore<MyUser>
{
    /// 省略
```

あとは `UserManager = new UserManager<MyUser>(new MyUserStore());` として、UserManagerをかぶせて使用します。
UserManagerの使用例はASP.NETプロジェクトを作ってAccountControllerを見てください。

この例ではメモリ内のListにデータを保持しましたが、
データベースなりファイルなり他のデータソースに保存するUserStoreも簡単に実装できます。
UITableViewCellを継承して、コードからカスタムセルを作る


xibファイルを使って、というのはすぐ見つかるのにコードからというのは少なかったのでメモしておきます。

##作成フロー

1. UITableViewCellを継承したサブクラスを作る
2. Cell生成時に配置したい要素を生成、`addSubview:`メソッドで追加
3. UITableViewControllerのデリゲートメソッドが呼ばれた際に適切にキャストして生成
4. 以降は通常のセルと同様にアップデートしていく

###UITableViewCellを継承したサブクラスを作る

なにはともあれ、`UITableViewCell`を継承したクラスを生成します。
そして初期化時に色々と必要な要素をレイアウトしていきます。UILabelだったりUIViewだったり。
生成したパーツは`[self addSubview:label];`のようにして、自身に追加します。（もしかしたらcontentViewに追加してもいいかも？）

**コメントでより便利な生成方法を教えて頂きました。**

####サンプルコード

```objc
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    
    if (self) {
        //メインテキスト
        self.titleLabel  = [[UILabel alloc] initWithFrame:CGRectMake(padding, padding, 240, 40)];
        self.titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        self.titleLabel.font = [UIFont systemFontOfSize:15];
        self.titleLabel.numberOfLines = 2;
 
		//ドキュメントによると、self.contentViewに追加するのが正しいとコメントいただきました。
        [self.contentView addSubview:self.titleLabel];

		//...以下パーツを色々生成・追加
    }
    
	//レイアウトをアップデート
    [self updateLayout];
    
    return self;
}
```

###[追記] tableViewに、セルとして使うクラスを登録（registerClass:forCellReuseIdentifier:）

コメントで教えていただいた部分。以下のように、tableViewのセットアップ時に使用するセルを登録することで、再利用可能セルのチェックを省いて簡潔に書くことができるようになります。

```objc
- (void)viewDidLoad
{
	[super viewDidLoad];
	[self.tableView registerClass:[HogeCell class] forCellReuseIdentifier:@"Cell"];

	//その他の処理
}
```

###UITableViewControllerのデリゲートメソッドが呼ばれたときにキャストして生成

実際のコードは以下。（registerClass:forCellReuseIdentifier:メソッドを利用したものに変更）

```objc
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
	//IDをstatic変数で宣言
	static NSString *CellIdentifier = @"Cell";

	//使用可能なセルを取得
	HogeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

	//registerClass:forCellReuseIdentifier:メソッドを使った場合はチェック不要
	//if (cell == nil) {//再利用できるセルがなければ新規作成
		//cell = [[HogeTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
	//}

	//ここから実際のセルのアップデート処理を書く
	cell.hogeLabel.text = @"hoge的な";

	//セットアップしたセルを返す
	return cell;
}
```


###layoutSubviews:メソッドでレイアウトを調整

最後に、色々配置した場合、縦横の回転に合わせてちゃんとレイアウトしなければなりません。
画面回転時、UITableViewCellもUIViewが持っている`layoutSubviews:`デリゲートメソッドが呼ばれるので、そこでカスタマイズしたパーツのレイアウトを調整してやります。

これで無事、カスタムセルで表示ができるようになります。
Route53のChangeResourceRecordSetsに追加されたUPSERTを試す

[【AWS発表】Route 53の新機能 - ヘルスチェック機能が改良されHTTPS経由でも可能に。レコード修正APIもアップデート。](http://aws.typepad.com/aws_japan/2014/02/new-features-for-route-53-improved-health-checks-https-record-modification.html) にあるようにレコード修正APIが追加されたので、それを試してみます。

ただし、ruby-sdk を利用します。
早速ですが、以下のような感じ。

```rb
require 'aws-sdk'

hosted_zone_id = 'XXXXXXXXXXXXX'

name = "foo.sample.com."
type = 'A'
ttl = 60
ip = '127.0.0.1'

r53 = AWS::Route53.new

r53.client.change_resource_record_sets(
    :hosted_zone_id => hosted_zone_id,
    :change_batch => {
        :changes => [
            {
                :action => 'UPSERT',
                :resource_record_set => {
                    :name => name,
                    :type => type,
                    :ttl => ttl,
                    :resource_records => [
                        {
                            :value => ip
                        }
                    ]
                }
            }
        ]
    }
)
```

これで、レコードがすでに存在すれば更新され、なければ作成されます。

今までだと以下のコードのように存在チェックをして、処理を分けて書く必要があったのが１つの処理でかけて良いです。

```rb
hosted_zone = AWS::Route53::HostedZone.new(hosted_zone_id)
rrset = hosted_zone.rrsets[name, type]

if rrset.exists?
  # ここではipを変更すると想定
  rrset.resource_records = [{:value => ip}]
  rrset.update
else
  hosted_zone.rrsets.create(name, type, :ttl => ttl, :resource_records => [{:value => ip}])
end
```

change_resource_record_setsを直接使うのじゃなく、今後UPSERTに対応したメソッドなりがruby-sdkに入るとより便利そうではある。
TaPL読書メモ #1

# このメモの目的
「型システム入門 プログラミング言語と型の理論」を読む読書会に参加してしまったのですが、単純に読んでもアレなのでメモを取っていくことにします。
嗚呼、これは危険な読書会に参加してしまった･･･（感想）

あまり章立てにこだわらずに書きます。また、数学よりもそれが示す意味についてメモしていきます。

# 第一章
## 「型システム」とは
型システムは、プログラムが期待された動作をすることを保証する手助けをする「形式手法」の一種である。他の形式手法に比べて、軽量であり遥かに普及した手法である。（プログラムに関する推論として見た場合）
型システムは、値の性質によって項を分類し、そこから振る舞いの静的な近似を求める。
> 型システムとはプログラムの悪部分を、それが計算する値の種類に沿って分類することにより、プログラムが有る種の振る舞いを起こさないことを保証する、計算量的に扱いやすい構文的手法である。

型システムは、"ある種の動きを「起こさない」"ことを断定することができる。逆に、"ある種の動きを「起こすこと」"を断定することは出来ない。多分計算結果がもたらす事までは型システムで検査できないということ。
型がコンパイル時に解析されるものを「動的型付け」と呼ぶ。対して、実行時に型を検査してタグとして付けられるものを「静的型付け」と呼ぶ。

## 型システムの機能
### エラーの早期検出
数値解析など扱う情報の種類が少ない場合を除き、型がvalidならばプログラムは期待したとおりに動くことが多い。(経験的に)
### 抽象化
プログラムのコンポーネントを切り離してモジュールと見なすことを助ける。
そのように見ることで、モジュールと実装を切り離して、プログラムを抽象的に観察できる。
### ドキュメント化
プログラムの振る舞いを人間が推測するためのドキュメントになる。
### 言語の安全性
言語の安全性とは、自らがもたらす抽象を保護していること。(定義に議論はある)
Cの様に型が表現している抽象性を容易に破壊する(メモリを抽象化した型よりも外に書き込める等)ような仕組みは安全ではないと言える。安全であるためには、静的な型検査だけでなく動的に型の抽象性を保護していなければならない。そのため、静的型付け言語・動的型付け言語のどちらであるかは安全性の論点にならない。
### 効率性
型によって数値の性格を明らかにできるため、適切な機械語を生成できる。

# 感想
コードを書くときに、型は必ず使う概念だが、具体的にどのようなモノなのか形式的な理解は無かった。そこら辺が補強できたと思う。
また、「言語の安全性」とはどういう概念かフワフワしていたが「言語が提供する抽象化を破壊しない」という所でピンと来た。
数学が苦手な僕にはこの本を読み進めるのは難しそうだ。
ECTテンプレートエンジンでのエラー


前の投稿([Node.js+Express+MongoDBでSessionを利用してログイン機能を実装 - Qiita [キータ]](http://qiita.com/n0bisuke/items/2514197d8791abbc7d87))でExpressのテンプレートエンジンでECTの利用を勧められたので使ってみました．

###ECTテンプレートエンジンを利用しようとしてエラーが出たところのメモです

####その1
```エラー1
express Failed to lookup view
```

よくみるとファイル名がindex.ectじゃなくてindex.etcとなっていましたorz

ETCの方が高速道路でよく使うので間違えやすいですね笑

####その2
```エラー2
Express
500 ReferenceError: user is not defined in 
```

変数の参照のしかたがejsだと

```index.ejs
<%= data %> 
```
ですが.ectだと@を付ける必要があるので注意です

```index.ect
<%= @data %>
```

参考: [Node.js - 【爆速テンプレートエンジン】Express3 以降で layout.ejs が使えなくなった代わりに ECT - Qiita [キータ]](http://qiita.com/sukobuto/items/b0be22bfebd721854e0b)
Unity2DのSpriteとParticleSystemの描画優先度設定

ゲームを作っている時、基本的にUIは3Dオブジェクトよりも全面に表示するけど、たまにエフェクト（Particle System）をUIよりも前に表示したいといった時がある。
それをUnity2Dではどうやるのかなと思って調べてみた。

試しに何も考えずに置いてみると、

![test01.jpg](https://qiita-image-store.s3.amazonaws.com/0/29359/0665847b-d4a6-d176-e401-546aea49e6be.jpeg)

PositionZの値をいくら変えてもエフェクトが背面に表示された。

Spriteを描画するとき、その優先度はSorting LayerとOrder in Layerによって決定される。
[[Unity]Unity2d機能、スプライトの使い方](http://terasur.blog.fc2.com/blog-entry-618.html)

それと同じことをやってあげれば良さそうだが、Particle SystemではLayerは設定できるけどSorting LayerはInspector上で設定できないため、専用のスクリプトを用意する必要があるみたい。

```csharp:SortingLayerSetter.cs
using UnityEngine;
using System.Collections;

public class SortingLayerSetter : MonoBehaviour {

	[SerializeField]
	private string _sortingLayerName = "Default";

	// Use this for initialization
	void Start () {
		renderer.sortingLayerName = _sortingLayerName;
	}
}
```

このスクリプトをコンポーネントに追加して、Inspector上からSortingLayerの名前を指定してあげればOK。

![test02.jpg](https://qiita-image-store.s3.amazonaws.com/0/29359/93716cb4-83d7-a4e0-4732-14ff9c9c460c.jpeg)

無事にSortingLayerを指定して優先度を設定することができた。
デバッグほとんどしてないから何かあるかも。
CentOSにgollumをインストールしようとしたら失敗した話

#CentOSにgollumを入れようとして失敗したけど、なんとか入ったのでメモ

##環境
CentOS 6.5
インストールはminimal.isoのイメージで行っている

##初回
rbenvインストールし、いざ実行

    gem install gollum

###結果

    gem files will remain installed in ほげほげ for inspection
    
と出力されてうまく入らなかった。

##とりあえず開発ツールを入れてみる

    sudo yum groupinstall "Development Tools"

###結果

変わらず

##ネットを検索、検索…

それっぽいのを発見して実行
[ここ](https://www.openshift.com/forums/openshift/help-with-ruby-gear)からの[ここ](https://bugzilla.redhat.com/show_bug.cgi?id=1023404)。バグみたいで、libicu-develを入れればよし。

    sudo yum install libicu-devel

###結果

インストール成功!

rbenv上のgemインストール後は`rbenv rehash`しないと反映されないので

    rbenv rehash
    gollum --version
    
で確認してバージョンが出ればOK。
Android向けに作ったTitaniumアプリをiOS上で動かすためにしたこと


間違いありそうだけど、とりあえず今のところ必要だったことを書いておきます。
まだ追加があるので後日更新する予定。

###Titanium.Database.ResultSetのfieldCountの参照方法の変更

```javascript:resultset.js

var length = resultSet.fieldCount; 
if(Ti.Platform.osname == "android"){
        length = resultSet.fieldCount;  
}
else
{
        length = resultSet.fieldCount();        
}
```

###Fileから読み込んだBlobのheightの値の参照方法の変更

こんな感じで読んだ画像ファイルの高さと幅の値を参照するのに

```Javascript:android_blob.js
var blob = Ti.Filesystem.getFile(filepath).read();
```

アンドロイドは以下のような感じでいけたんですが、iOSだとheightがNaNになってしまって適切な値が読めなかった。

```Javascript:android_blob.js
blob.getWidth();
blob.getHeight();
```

なので一旦imageview経由したら取得できた。後でもう一度検証してみる予定。

```Javascript:ios_blob.js
var imageView = Titanium.UI.createImageView({
							image: blob,
							width: 'auto',
							height: 'auto'
					});
var originalWidth = imageView.toImage().width;
var originalHeight = imageView.toImage().height;
```


###ImageViewにファイルパスを渡すとときに渡すファイルパスの形式を変更

android上ではこんな感じでいけたけど、iOSだと画像が表示されなかった。

```Javascript:android_imageview.js
var filePath = "/images/sample.png";
Ti.UI.createImageView( { image: filePath } );
```

Ti.Filesystem.File経由でnativePathに変換したらiOSでも画像が表示されるようになった。

```Javascript:ios_imageview.js
var filePath = "/images/sample.png";
var nativeFilePath = Ti.Filesystem.getFile(filePath).nativePath;
Ti.UI.createImageView( { image: nativeFilePath } );
```

###ファイルのcopy方法の変更

android上でcopy使ってたら、iOSだとないって怒られた

```Javascript:android_copy.js
var file = Ti.Filesystem.getFile("/images/sample.png");
file.copy(destFilePath);
```

仕方なく自前でread, write.
これくらい対応してほしい。。。

```Javascript:android_copy.js
var destFile = Ti.Filesystem.getFile(destFilePath);
var srcFile = Ti.Filesystem.getFile("/images/sample.png");
destFile.write(srcFile.read());
```

###画像のリサイズ方法

android上での画像のリサイズにandroid用のモジュールを以下のような感じで使っていたので、
モジュールビルドする際に怒られた。

```xml:tiapp.xml
<module version="0.5">org.selfkleptomaniac.ti.imageasresized</module>
```

このモジュールはandroid限定ですって書かないといけないらしい。

```xml:tiapp.xml
<module version="0.5" platform="android">org.selfkleptomaniac.ti.imageasresized</module>
```

コード上も少し変えたけど、blobのimageAsResizedっていう標準のメソッドに切り替えただけ。

###Titanium.Databaseに対するの大きな整数値の保存方法

Androidは以下のコードでresultとtの値が同じになるが、iphoneはresultの値がおかしな値になる.
小さい値だと大丈夫っぽいけど,,,

```Javascript:database.js
var db = Ti.Database.open("inttest");
db.execute("CREATE TABLE foo (bar INTEGER)");
var t = new Date().getTime();
db.execute("INSERT INTO foo VALUES (?)", t);
var rs = db.execute("SELECT bar FROM foo");
var result = rs.field(0);
rs.close();
db.close();
alert("written value=" + t + '\nread value=' + result);
```

対処方法は以下のようにTEXTとして保存してparseIntを使って復元する。
これはすごいバグですね。しかも3年前からある問題っぽいけど。。。。
http://developer.appcelerator.com/question/120826/sqlite-integer-storage-issue-on-iphone

```
var db = Ti.Database.open('inttest');
db.execute("CREATE TABLE foo (bar TEXT)");
var t = new Date().getTime();
db.execute("INSERT INTO foo VALUES (?)", t);
var rs = db.execute('SELECT bar FROM foo');
var result = rs.field(0);
rs.close();
db.close();
alert("written value=" + t + '\nread value=' + parseInt(result));
```
PNChartをつかって任意のデータの推移を示すときのメモ



##実現したいこと
1. X軸に日付、Y軸にある値をプロットした棒グラフを作成する
* X軸の期間はdefault一週間、最大で半年間とする（期間TOは本日）
* ある日付に作成されるデータの数を集計する

##解決方針
### PNChartをつかってグラフを作成する

https://github.com/kevinzhow/PNChart
まず、上記の１つ目を実現するために、これをつかってみた。
２つ目は後日対応する。

ほぼ見本どおりに実装することで、とりあえず、良い感じになった。
![PNChart.png](https://qiita-image-store.s3.amazonaws.com/0/37895/be2ca6ad-226b-5ce2-b7d4-ec6739007fa2.png)

### CoreDataの機能を使って集計する
上記の３つ目を達成するためにやりたいことは、SQLで表現するとこんな感じ。

```sql
select createdDate, count(*) from record
group by createdDate
order by 1 desc;

```

これをCoreDataでコーディングすると。


```objectivec

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Record"];
    
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Record"
                                                         inManagedObjectContext:context];
    NSAttributeDescription *attributeDescription = [entityDescription.attributesByName objectForKey:@"createdDate"];
    NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"weight"];
    NSExpression *countExpression = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObjects:keyPathExpression, nil]];
    
    NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
    [expressionDescription setName:@"count"];
    [expressionDescription setExpression:countExpression];
    [expressionDescription setExpressionResultType:NSInteger32AttributeType];
    
    [fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:attributeDescription, expressionDescription, nil]];
    [fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObjects:attributeDescription, nil]];
    [fetchRequest setResultType:NSDictionaryResultType];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdDate" ascending:YES];
    NSArray *sortDescriptors = @[sortDescriptor];
    [fetchRequest setSortDescriptors:sortDescriptors];

    _records = [[context executeFetchRequest:fetchRequest error:nil] mutableCopy];
 
```

・・・確かに、マゾいかもしれない。 

ところで今回はじめて、シミュレータのスクリーンショットを撮ってみた。
http://kuhaku.net/2010/03/iphone_simulator_screenshot/
こちらを参考にさせていただきました。
Rubyで簡単にQRコード画像を生成する方法

# Rubyで簡単にQRコード画像を生成する方法

## gemをインストール

```bash
$ gem install rqrcode_png
```

依存関係のあるライブラリ「rqrcode」と「chunky_png」もインストールされます。

## 実装例

「Hello World!!」という情報をQRコードに埋め込み、PNGファイルで保存します。

```ruby
# -*- encoding: sjis -*-
require 'rqrcode'
require 'rqrcode_png'
require 'chunky_png'

# 「Hello Wolrd!!」いう文字列、サイズは3、誤り訂正レベルHのQRコードを生成する
qr = RQRCode::QRCode.new( "Hello World!!", :size => 3, :level => :h )
png = qr.to_img

#200×200にリサイズして「hello_world.png」というファイル名で保存する
png.resize(200, 200).save("hello_world.png")
```

メモ：エンコードをShift-JISに指定しないと上手くQRコードの画像が生成されませんでした。

## 出力結果

![hello_world_size_mini.png](https://qiita-image-store.s3.amazonaws.com/0/34365/38a1984d-0166-d3cb-3068-c494d33bed2e.png)

「hello_world.png」という名前のQRコードの画像ファイルが出力されます。
VIM備忘録

ちょいちょい忘れるのでｃ⌒っﾟдﾟ)っφ　ﾒﾓﾒﾓ..

# 移動

## ページ移動

```
Ctrl+b 1ページ戻る
Ctrl+f 1ページ進む
```

## 直前の編集位置に戻る

```
`. (バッククォート ドット)
```

## 直前の位置に戻る

```
Ctrl+o
```

# 差分表示

## 開いているファイルとの差分表示
```
:vertical diffsplit 差分を取りたいファイル
```

## シェルから開く

※ @tukiyo3さんからコメント頂きました。ありがとうございます。

```
$ vimdiff a.txt b.txt
```

# 検索
## カーソル位置の単語を検索

```
*
#
```

## 対応する括弧にジャンプ

```
%
```

## ヤンクから検索

```
p/
/<C-r>" #スラッシュ Ctr+r ダブルクォート
``` 

# 削除

## カーソル上の単語を削除

```
diw
```

# ソート

```
:sort
```

## マッチ部分をソートから外す

```
:sort /パターン/
```

## マッチ部分でソート

```
:sort /any_key/ r
```

# ユニーク化

```
:sort u
```

# ファイルリロード

```
:e!
```

# 参考

* http://nanasi.jp/articles/howto/diff/diff_text.html#diffsplit
* http://qiita.com/wadako111/items/5eb8e30aca1737ba6ba5
* http://d.hatena.ne.jp/cn_syan/20091229/1262068800
CakePHPのPluginをComposerで管理しようとして嵌ったこと


↓とかを参考にしてやってみてもうまくいかなかった。
[Composerを使ってCakePHP2.4.1とDebugKitをインストールするまで - higan96技術メモ](http://higan96.hatenablog.com/entry/2013/10/02/183809)

## ComposerのautoloderはPluginパスの解決まではしてくれないみたい
なので通例どおりApp::build()で追加してあげる。

```bootstrap.php
// composerのautoloadを読み込み
require ROOT . '/Vendor/autoload.php';

// CakePHPのオートローダーをいったん削除し、composerより先に評価されるように先頭に追加する
// https://github.com/composer/composer/commit/c80cb76b9b5082ecc3e5b53b1050f76bb27b127b を参照
spl_autoload_unregister(array('App', 'load'));
spl_autoload_register(array('App', 'load'), true, true);

// プラグインの読み込み
App::build(array(
    'Plugin' => array(
      ROOT . '/Plugin/',
    ),
  )
);
CakePlugin::loadAll();
```
Node.jsとHTML5で初音ミクのオンラインかるたゲーム「ミクミクかるた」を作ってみた

初音ミクのオンラインかるたゲーム「ミクミクかるた」をリリースしました。
http://mikumikuplay.com/karuta/

# 紹介動画URL
http://www.nicovideo.jp/watch/sm22964822

「ミクミクかるた」はブラウザで簡単に遊べるオンラインかるたゲームです。ゲームのルールは簡単で、ボカロ曲が流れたら、歌詞の先頭文字の札をクリックするだけです。「みっくみ～くにし～てあげる♪」と流れたら「み」の札を取ります。かるたの札の読み上げの代わりにボカロ曲が流れるというシステムです。オンライン対戦することも出来ます。

利用技術
クライアント HTML5, JQuery, jquery.vgrid.js, Bootstrap
サーバー Node.js(socket.io, express) リバースプロキシ nginx
詳細は、http://mikumikuplay.com/karuta/page_thanks に書いてます。

これらの技術を使ってみての感想は

・Bootstrap便利
簡単に適用できるし、それらしいデザインになるのがいい。dot installで要点を効率よく解説してくれるので助かりました。

・jquery.vgrid.js超便利
画像とかをタイル状に並べてくれるJQueryプラグイン。簡単に使えて見栄えが良い！

・HTML5は通信のタイミングに注意が必要
なぜか音が鳴らない場合があって、音のファイルがロードされるのを待ってから処理を開始するというロジックを入れて解決しました。

・Node.jsはWebSocketサーバ書くのは分かりやすくていいけど、普通のWebアプリならPHPとかのが簡単
もちろん普通のWebアプリでもNode.jsの特徴であるシングルスレッドノンブロッキングIOでスケールさせたいとかって理由があればNode.jsを選択しておｋだと思います。expressはシンプルでわかりやすくて良いと思いました。が、やっぱ、非同期IOのロジックは書くのがめんどいのでECMAScriptにyield構文追加で改善されることを期待してます。

以前、「ミクミクすごろく」というオンラインすごろくゲーム( http://mikumikuplay.com/sugoroku/ )を作り、ユーザーがイラストと文章を作ることによってゲームコンテンツを拡張していくことが出来るCGG(Consumer Generated Game)の仕組みを作りました。CGGはブログなどでおなじみのCGM(Consumer Generated Media)のゲーム版に当たります。

今回開発した「ミクミクかるた」では、開発作業をニコニコ生放送で配信していました。すると視聴者の方がゲームの機能やデザインについてのアイデアをコメントしてくれました。コメントしてくれたアイデアのほとんどを採用しています。言わば、生放送駆動開発(Live Driven Development)と言えるのではないでしょうか？まぁ、これは悪乗りですが・・・。

最近流行している開発手法としてテスト駆動開発(Test Driven Developement→略してTDD)というものがあります。TDDをするとテストしやすいインターフェースやモジュール設計が出来るようになりますが、この生放送駆動開発すると、ユーザーが望んでいる設計が出来るのではないかと思います。新たな開発手法を発見することが出来ました。

ってなわけで、ユーザー登録なしで簡単に遊べるのでぜひPlayしていただいてエンジニア目線で見て感想とかダメ出しとかしてくれると嬉しいです！よろしくです！
http://mikumikuplay.com/karuta/
ViewのコードビハインドからViewModelの型や実装をを気にせずメソッド&プロパティにアクセスする


## 例えば……
WPFで画面にドラッグ＆ドロップでファイルを投げた時の処理を例として。
ViewのXAMLで

```XML:View.xaml
<Window x:Class="AmazonToYamatoB2Converter.Views.View"
        AllowDrop="True"
        Drop="View_Drop">
    
    <Window.DataContext>
        <vm:ViewModel/>
    </Window.DataContext>
    
	<Grid>
    	<!-- 画面 -->
	</Grid>
</Window>

```

ってして、コードビハインドでドラッグ＆ドロップを処理しようとするんだけど

```cs:View.xaml.cs
    public partial class View : Window
    {
        public View()
        {
            InitializeComponent();
        }

        private void View_Drop(object sender, DragEventArgs e)
        {
            var dropFileList = (e.Data.GetData(DataFormats.FileDrop) as string[]).ToList();
			// ここから先はViewModelの処理としたい
        }

    }
```

ドラッグ＆ドロップで渡されたファイル(パス)の処理はViewModelの責務じゃないかなと思うんですよ。
Modelに渡したりとかするわけですし。
ViewModelクラスにはその為の処理として`public void AddDragAndDropsFiles(List<string> fileList)`ってメソッドが実装されているとします。
で、そのメソッド呼ぶ為にViewからViewModelを参照するわけです。


## 普通にViewクラスからViewModelクラスを参照する
```cs:View.xaml.cs
        private ViewModel VM
        {
            get { return this.DataContext as ViewModel; }
        }

        private void View_Drop(object sender, DragEventArgs e)
        {
            var dropFileList = (e.Data.GetData(DataFormats.FileDrop) as string[]).ToList();
			// ここから先はViewModelの処理としたい
			this.VM. AddDragAndDropsFiles(dropFileList);
        }
```

まぁよくあるやつです。
これの面倒な点は、ViewModelって型を書かないと行けないって所です。
名前空間usingして、ViewModelの型を補完使って入力。(逆もある)
ViewModelの型を変更しくなったらコードビハインドも変更しないといけない。

## ならInterfaceは？
書くの面倒だからコード例は出さない。
確かにそれでいいかもしれない。
でも、それも結局Interfaceの型を変更する場合同じ事なんですよね。
usingするのも変わらんし。
`Iなんたらかんたら`ってのを沢山継承するViewModelになることないですか？

## Behavior作れば？
書くの(ry
[この辺りを参照して下さい。](http://katsuyuzu.hatenablog.jp/entry/20111219/1324313500)
確かにコードビハインドにコード書く必要もなくなるのいいかもね。
Interface書くのすら面倒臭がる俺にこんな長いコードを書けとか鬼か。
再利用性はあるかもしれない。
が、でもちょっと使いづらとかで機能追加してコードが読みづらくなるの、よくある話ですよね。
そもそもドラッグ＆ドロップでのファイルの受け渡し程度にこんな量のコード書くの？

## これでいいんじゃね？
C# 4.0からだけど、dynamicってキーワードがある。
これを使うと

```cs:View.xaml.cs
        private dynamic VM
        {
            get { return this.DataContext; }
        }

        private void View_Drop(object sender, DragEventArgs e)
        {
            var dropFileList = (e.Data.GetData(DataFormats.FileDrop) as string[]).ToList();
			// ここから先はViewModelの処理としたい
			this.VM.AddDragAndDropsFiles(dropFileList);
        }
```

こうなる。
何が良いって、VMはViewModelクラスじゃなくても`public void AddDragAndDropsFiles(List<string> fileList)`メソッドを実装しているクラスならOKって所。
ViewがViewModelの型や実装を気にしなくて良い。
ViewModelの事を気にせずViewだけの実装を書いておいて、後ViewModel実装するって事も出来る。
なお、呼び出してるメソッドが実装されてなかったらコンパイルエラーは発生せず、実行時に`RuntimeBinderException`という例外が発生します。

「C#という言語で、メソッド実装してなかったらコンパイルエラーじゃなくて実行時エラーになるのってどうなの？」
という指摘は最もだと思います。潔癖症には辛いかもしれない。
でも、InterfaceやBehaviorの作成よりは読みやすいし、書くコード量も少なくて済むので悪くないんじゃ無いかと思います。
Hadoop YARNなCDH4.5でノードDecommission/(Re)Commission

とりあえず備忘録程度に。

----

## HDFS

1. activeなNNの `hdfs-site.xml` を編集
    * `dfs.hosts` => Decommission対象ノードも含めて全ノードを1行1ノード名で書いたファイルpathを指定する
    * `dfs.hosts.exclude` => Decommission対象ノードを1行1ノード名で書いたファイルpathを指定する
2. `hdfs dfsadmin -refreshNodes` する

## YARN

1. RMの `yarn-site.xml` を編集
    * `yarn.resourcemanager.nodes.include-path` => Decommission対象ノードも含めて全ノードを1行1ノード名で書いたファイルpathを指定する
    * `yarn.resourcemanager.nodes.exclude-path` => Decommission対象ノードを1行1ノード名で書いたファイルpathを指定する
2. `yarn rmadmin -refreshNodes` する
_※Decommissionするとnodemanager落ちるので注意_

## HBase

`/usr/lib/hbase/bin/hbase-jruby /usr/lib/hbase/bin/region_mover.rb -x exclude.txt unload host`

`hbase shell` で `balance_switch false` 必要？
access_logの扱い


#ログファーマット時刻が%tの時のソート 
sort -t '[' -k 2.8,2.11n -k 2.4,2.6M -k 2.1,2.2n -k 2.13,2.14n -k 2.16,2.17n -k 2.19,2.20n access_log

#uaだけなど
awk -F '"' '{ print $6 }' access_log
tmuxとMacのクリップボードを共有する（copy-mode, vim）

## 環境

OS X: 10.9.1
tmux: 1.9
vim:  7.4.161

:warning: tmux 2.4 からは、以下で説明している `vi-copy` が `copy-mode-vi` に変更になりました。また、 `copy-pipe` 相当の動作は `copy-pipe-and-cancel` となりました
:warning: tmux 2.6 からは、以下で説明している `reattach-to-user-namespace` の設定は不要です。`copy-pipe-and-cancel` には単に `"pbcopy"` を指定すればOKです


## tmuxのコピーコマンドでのクリップボード共有

下記の方法でvimライクの設定にすることができる。

[tmux Copy & Paste on OS X: A Better Future](http://robots.thoughtbot.com/tmux-copy-paste-on-os-x-a-better-future)

使うのは`reattach-to-user-namespace`。Homebrewでインストールできる。

[ChrisJohnsen/tmux-MacOSX-pasteboard](https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard)

```
$ brew install reattach-to-user-namespace
```

```bash:.tmux.conf
# Use vim keybindings in copy mode
setw -g mode-keys vi

# Setup 'v' to begin selection as in Vim
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

# Update default binding of `Enter` to also use copy-pipe
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
```

これで`<prefix> [`でコピーモードに入った時に、`v`で選択を開始し`y`もしくは`Enter`で選択範囲をコピーできるようになる。


## tmux上で起動したvimのクリップボード共有

上記方法ではtmux上で起動したvimで依然クリップボードが使えず、`Nothing in register *`というエラーが表示される。
これを回避するには、`reattach-to-user-namespace`をtmuxの`default-command`に設定する。

```bash:.tmux.conf
set-option -g default-command "reattach-to-user-namespace -l bash"
```

### それでもダメな場合

しかし、僕の環境ではこの設定をするとtmuxが`[exited]`というログとともにすぐに終了してしまうようになってしまった。

`default-command`の設定を消し、tmux内ですぐに

```
$ exec reattach-to-user-namespace -l "$SHELL"
```

を実行すると有効になるが、面倒くさい。

そこで、aliasを作る。

```bash
alias vim="reattach-to-user-namespace vim"
```

結局vimだけ共有されていれば良いので、これで十分な感じだ。tmux起動していない時もalias貼られるのがちょっともやっとするけど。

参考: [Sharipov Ruslan : tmux 1.8 + vim/MacVim: easy OSX clipboard integration](https://coderwall.com/p/g-d8rg)


### シェルスクリプトを使う方法

いろいろ試した結果、どうも次のようなシェルスクリプトでラッピングすると使えるようになるみたいだ。

https://github.com/jimeh/dotfiles/commit/3470b1632fff4e97426e41a4c20fbb385688b782

```bash:login-shell
#! /usr/bin/env bash

# Ensure that tmux windows are by default named after the shell, rather than
# full path to the shell binary.
shell=$(basename "$SHELL")

# If reattach-to-user-namespace is not available, just run the command.
if [ -n "$(command -v reattach-to-user-namespace)" ]; then
  reattach-to-user-namespace -l "$shell"
else
  exec "$shell"
fi
```

```bash:.tmux.conf
set-option -g default-command "login-shell"
```

権限設定を忘れずに。

```
$ chmod +x ~/bin/login-shell
```
予算ほぼゼロ！ プロが教える、iPhoneでアプリやWEBサービスのプロモーション動画を作る方法

## 大事なこと
* 何を見せたいのか、はっきりさせる
* 短い文章でも伝わるものを書く。
* 自分が好きな物事＝みんなが好きな物事　を限りなく近づける意識
* 動画を見た人の笑顔がイメージできるか？
## 映像の大きな流れ
1. 構成をつくてみる
2. コンテを描いてみる
3. 撮影してみる
4. 編集してみる

## [1] 構成を作ろう
### 1.アプリやサービスの概要を客観的にまとめる
* サービスを作るときに考えた基礎的な事
 * 誰のためのサービス？
 * どういうサービス？
 * どういう時に使ってもらう？
 * どういった問題を解決したいのか？
 * ⇛これら全てが動画構成の要因になる。
* もっとも簡単な構成の作り方
 * どんな人が、
 * 何を使って、
 * どう変わったか（どうなって欲しいのか）の３点を書き出してみること。

### 2.まとめた概要をもとに、構成を作ってみる

## [2] 絵コンテを描いてみる
### なぜ絵コンテを書くのか？
* 情報共有のため。テキストではコミュニケーションコストがかかりすぎるし、イメージが共有されないから。
* だから、絵は下手でもOK。伝わることが大事。

## [3] 撮影してみる
### 準備するもの
* iphone
* 演者
* 撮影場所
* 衣装
* 大きめの白い板

### スマホで撮影するときの注意点
* スマホを動かさない
* 光をあてる
* 写したいものにタッチする
deploygate for iOS に Jenkinsからアップロードする

Jenkinsでビルドしたらtestflightでチームに配信してdogfoodingをしてるチームも多いと思いますが、
それ、DeployGateでもできるの？って思ったらできたのでそのやり方です。

### 1. JenkinsのDeployGateプラグインをインストール
Android用のJenkinsプラグインがそのまま使えます。

ここにあるJenkinsのプラグインファイルをダウンロードして
https://github.com/jfsso/deploygate-plugin
(thanks to @jfsso)

JenkinsのダッシュボードのJenkinsの管理→プラグインの管理→高度な設定から
プラグインのアップデートを選んでアップデート

![スクリーンショット 2014-02-25 9.37.53 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15582/8d740b95-197c-3fb8-8275-e5dd31d8e92a.png)

多分再起動しなくても大丈夫です。

### 2. Jobの設定
プラグインがインストールできたらJobの設定を書きます。

「ビルド後の処理の追加」より 「Upload to DeployGate」を選択
パラメータには次のように書きます

* API Key : https://deploygate.com/settings 以下に書いてあるAPIキーを入れます
* Username : DeployGate のユーザー名を入れます
* APK File : iOSアプリなので .ipa ファイルのパスを書きます
* Build Notes : ご自由にどうぞ

![スクリーンショット 2014-02-25 9.41.19 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15582/6b546b0e-9c67-64cc-e5d3-a849e81bf7a8.png)


### 3. ビルドしてチームに配る
あとはJenkinsから「ビルド実行」すると自動的にアップロードされます。


### おまけ
ビルドする時にcodesignが正しいかを検証する。
xcodebuildで.appファイルを作って、xcrunでipaファイルを作ったはいいけどprovisioningとかcodesignが正しいかを検証したい！というときのやり方

```
unzip yourapp.ipa
codesign --verify -vvvv Payload/yourapp.app
```

zip圧縮されているipaファイルを解凍して、中にある.appファイルに対して`codesign　--verify -vvvv` とすると署名を検証できます。
Mojo::Server::Daemonで簡易なWebサーバを作る


以下のように、Mojo::Server::Daemonで簡易なWebサーバを作ることができます。

```perl:sample.pl
use strict;
use warnings;
use utf8;
use Encode;
use Mojo::Server::Daemon;

my $daemon = Mojo::Server::Daemon->new(listen => ['http://*:8080']);
$daemon->unsubscribe('request');
$daemon->on(request => sub {
    my ($daemon, $tx) = @_;

    # Request
    my $method = $tx->req->method;
    my $path   = $tx->req->url->path;

    if ($path eq '/test.html') {
         $tx->res->code(200);
		  $tx->res->headers->content_type('text/html');
         $tx->res->body(encode_utf8('<html><head><title>テスト</title></head><body><h1>テスト</h1></body></html>'));

    }
	elsif ($path eq '/test.txt') {
         $tx->res->code(200);
         $tx->res->headers->content_type('text/plain');
         $tx->res->body(encode_utf8('テスト'));
    }
    else {
         $tx->res->code(404);
         $tx->res->body('Not Found');
    }

    # Resume transaction
    $tx->resume
});
$daemon->run;
```

Test::TCPを使えば、一時的にWebサーバを立ち上げてテストすることができます。

```perl:sample.pl
use strict;
use warnings;
use utf8;
use Encode;
use Mojo::Server::Daemon;
use Test::More;
use Test::TCP;
use Mojo::UserAgent;


test_tcp(
    client => sub {
        my $post = shift;

        my $url = 'http://localhost:'.$post;
        my $client = Mojo::UserAgent->new;

        my $tx = $client->get($url.'/test.html');
        if (my $res = $tx->success) {
            is decode_utf8($res->body), '<html><head><title>テスト</title></head><body><h1>テスト</h1></body></html>';
        }

        $tx = $client->get($url.'/test.txt');
        if (my $res = $tx->success) {
            is decode_utf8($res->body), 'テスト';
        }
    },
    server => sub {
        my $port = shift;
        my $daemon = build_server($port);
        $daemon->run;
    },
);


sub build_server {
    my ($port) = @_;

    my $daemon = Mojo::Server::Daemon->new(listen => ['http://*:'.$port]);
    $daemon->unsubscribe('request');
    $daemon->on(request => sub {
        my ($daemon, $tx) = @_;

        # Request
        my $method = $tx->req->method;
        my $path   = $tx->req->url->path;

        if ($path eq '/test.html') {
             $tx->res->code(200);
              $tx->res->headers->content_type('text/html');
             $tx->res->body(encode_utf8('<html><head><title>テスト</title></head><body><h1>テスト</h1></body></html>'));

        }
        elsif ($path eq '/test.txt') {
             $tx->res->code(200);
             $tx->res->headers->content_type('text/plain');
             $tx->res->body(encode_utf8('テスト'));
        }
        else {
             $tx->res->code(404);
             $tx->res->body('Not Found');
        }

        # Resume transaction
        $tx->resume
    });
    $daemon;
}

done_testing;
```
初投稿:ChromeAppでの基本的な知識1(Window, Event周り)

ChromeAppsでの基本的なことのメモ。

# 1 イベントの設定

イベントは手軽に

```html
onxxx="xxxx_clicked();"
```

などとやりたくなるけど、ChromeAppsでは次のようなエラーが出て機能しない。
_Refused to execute inline event handler because it violates the following Content Security Policy directive: "default-src 'self' chrome-extension-resource:". Note that 'script-src' was not explicitly set, so 'default-src' is used as a fallback._
イベントを設定するならjavascript側で、

```js
document.getElementById("xxxx").addEventListener("click",xxxx_clicked);
```

などとするとよい。

# 2 ウィンドウを開く
新しいウィンドウを開く時、手軽に

```js
window.open("xxx.html",...);
```

などとやりたくなるけれど、こちらもイベントのときのようにエラーが出てしまう。
やるのであれば、Chrome Platform APIを使って


```js
chrome.app.window.create("xxx.html","id",...);
```

をする必要がある。なお、chrome.app.windowのAPIを使う前に、
_manifest.json_ の _permission_ に _app.window_ の権限を加えておく。
これで開いたウィンドウを操作する際は、次のようにしてAppWindowオブジェクトを取得する。

```js
var win = chrome.app.window.get("id");
or
var winarr = chrome.app.window.getAll();
```

なお、 _getAll()_ メソッドだと作成した全てのAppWindowの配列が返ってくる。


# 3 終わりに
ChromeAppsで使うjavascriptは、通常のjavascriptやFirefoxOSなどで当たり前に使っていた作法と
若干異なる場合ので、気をつけたいところである。
vagrantで遊んでみた

仮想マシンのフロントエンドvagrant。すごく流行っているみたいなのでとりあえず動かしてみた。

# 結論

めちゃくちゃ楽。特にGUIが要らなければすごく便利。あとはvagrantのレイヤじゃないけど、仮想マシンを使うことでどこまでパフォーマンスが落ちるかが気になるところかな。

# 環境

ホストマシンOS：Ubuntu 13.10 x86_64
仮想マシンOS：Ubunutu 12.04 x86_64

# vagrantのセットアップ

とりあえず試してみるのに必要なパッケージはvirtualboxとvagrantだけ。やってないけど仮想マシンエンジンはVMWareやAmazon EC2でもいけるらしい。

```shell-session
sudo apt-get install virtualbox
sudo apt-get install vagrant
```

# 仮想マシンのセットアップ・起動・終了

起動終了にまつわる基本的なコマンドは以下のとおり。

```shell-session
vagrant box add precise64 http://files.vagrantup.com/precise64.box
                            # 仮想マシンのテンプレート（box）を取得
vagrant init precise64      # boxから仮想マシン作成
vagrant up                  # 仮想マシン起動
vagrant ssh                 # 仮想マシンにログイン(exitでログアウト)
vagrant suspend             # 仮想マシン一時停止
vagrant resume              # 仮想マシン再開
vagrant halt                # 仮想マシン停止
vagrant destroy             # 仮想マシン削除
```

# 共有フォルダ

デフォルトで、`vagrant init`したホストマシンのディレクトリと、ゲストマシンのホームディレクトリ(`/home/vagrant`)が共有設定されている。とても便利。

# カスタマイズした仮想マシンの共有

仮想マシンのカスタマイズができて共有したくなったら、`vagrant package`でテンプレート(box)化できる。
できたtemplate.boxをwebサーバとかにあげといて、他の人に`vagrant box add`してもらえば環境構築完了。
な、なんて楽なんだ。。。
Test::Mojoでアップロード処理をテストする



以下のような画像掲示板などをテストする場合です。
http://d.hatena.ne.jp/perlcodesample/20100113/1264941583


&lt;input type="file" name="image"&gt;に当たる部分は、ハッシュで指定しています。

```perl:t/base.t
use strict;
use warnings;
use utf8;
use Encode;
use Test::Mojo;
use Test::More;

use File::Basename;
use Mojo::Asset::File;

$ENV{MOJO_HOME} = dirname(__FILE__) . '/../';
require "$ENV{MOJO_HOME}/myapp.pl";

my $t = Test::Mojo->new;

# アップロードする画像ファイル読み込み
my $asset = Mojo::Asset::File->new(path => dirname(__FILE__) . '/31683776.gif');

$t->post_ok('/upload' => form => {
    # ハッシュでアップロードするファイルの情報を指定する
    image => {
        filename => '31683776.gif',
        'Content-Type' => 'image/gif',
        content => $asset->slurp,
    },
})
->status_is(302);

done_testing;
```
bash で横幅いっぱいを背景色で塗りつぶす

シェル変数 `$COLUMNS` に端末の横幅が入っているので printf の width で幅指定する。

```bash
printf "\e[41;30m%-*s\e[m\n" "$COLUMNS" "red red red"
```

16色

```bash
for i in {40..47} {100..107}; do
  printf "\e[%d;37m%-*d\e[m\n" "$i" "$COLUMNS" "$i"
done
```

256色

```bash
for i in {0..255}; do
  printf "\e[48;5;%dm%-*d\e[m\n" "$i" "$COLUMNS" "$i"
done
```
第19回オフラインリアルタイムどう書くの参考問題をPythonで解く

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord19sanwa/

他の方々の回答はこちら
http://qiita.com/Nabetani/items/0a711729fdea28b1c30b

高速化版:

```py
from itertools import chain, combinations_with_replacement as combi_r

def solve(d):
    n=map(int, d.split(','))
    s=set(n)
    a=[(x,y,z)
       for x in xrange(1, n[0]+1)
       for y in xrange(x, n[-1]+1)
       for z in xrange(max(y, n[-1]/3), n[-1]+1)
       if s == s&{sum(c) for c in chain(*[combi_r((x,y,z), r) for r in (1,2,3)])}]
    return not a and 'none' or a[1:] and 'many' or ','.join(map(str, a[0]))
```

最初の実装:

```py
from itertools import *

def solve(d):
    n=map(int, d.split(','))
    s=set(n)
    a=[(x,y,z)
       for x in xrange(1, n[0]+1)
       for y in xrange(x, n[-1]+1)
       for z in xrange(y, n[-1]+1)
       if s == s&{sum(p) for p in chain(*[product((x,y,z), repeat=r) for r in (1,2,3)])}]
    return not a and 'none' or len(a)>1 and 'many' or ','.join(map(str, a[0]))

def test(data, correct):
    answer = solve(data)
    print 'xo'[answer == correct], data, correct, answer

0, test( "3,11,12,102,111,120", "1,10,100" );
1, test( "10,20,30,35,70", "many" );
2, test( "1,5,20,80", "none" );
3, test( "1,2,3,4,5,6,7,8,9,10,11,12,13,14", "many" );
4, test( "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15", "1,4,5" );
5, test( "1,2,3,4,5,6,7,8,9,10,11,12,13,14,17", "none" );
6, test( "1,2,3,4,5,6,7,8,9,10,11,12,13,14,18", "1,4,6" );
7, test( "5,6,7,8,9,10,11,12,13,14,15,16", "2,5,6" );
8, test( "9,10,11,12,13,14,15,16,17,18,19", "4,5,7" );
9, test( "11,36,37,45,55,70,71", "1,10,35" );
10, test( "92,93,94,95,96,97,98,99", "30,32,33" );
11, test( "95,96,97,98,99,100", "many" );
12, test( "27,30,34,37,43,44,46,51,57", "10,17,23" );
13, test( "6,10,13,17,65,73,76,80", "none" );
14, test( "12,19,21,29,85", "none" );
15, test( "1,2,8,10,14,23,58,62,64", "none" );
16, test( "4,22,25,31,44,50,58,69,71,72,73,77", "none" );
17, test( "8,16,26,27,42,53,65,69,81,83,88,99", "none" );
18, test( "9,10,23,24,28,33,38,39,58,68,84", "none" );
19, test( "11,16,24,26,88", "none" );
20, test( "24,33,47,56,63,66,75,78,89,93", "none" );
21, test( "7,26,72,77", "many" );
22, test( "69,88,95,97", "many" );
23, test( "9,14,48,89", "many" );
24, test( "69,76,77,83", "many" );
25, test( "11,14,24", "many" );
26, test( "8,25,75,93", "many" );
27, test( "11,55,93,98,99", "many" );
28, test( "71,83,87", "many" );
29, test( "22,76,77,92", "7,15,62" );
30, test( "33,61,66,83,95", "17,33,61" );
31, test( "6,16,49,55,72", "6,16,33" );
32, test( "62,85,97,98", "12,25,73" );
33, test( "54,60,67,70,72", "20,25,27" );
34, test( "54,61,68,84,87", "27,30,34" );
35, test( "65,67,69,75,79,89,99", "21,23,33" );
36, test( "69,72,80,81,89", "23,24,33" );
37, test( "1,2,3", "many" );
```

高速化:

```py
product((x,y,z), repeat=r)
```

を

```py
combinations_with_replacement((x,y,z), r)
```

に変更することで、22秒だった実行時間が13秒になりました。
zの最小値は入力最大値の1/3なので、次のようにすると若干速くなりました。

```py
for z in xrange(max(y, n[-1]/3), n[-1]+1)
```
フロントエンド開発今昔物語

#フロントエンド開発今昔物語

フロントエンドと言っても、アプリやゲーム制作などではなく、いわゆるWebサイト制作のクライアントサイド側の話になります。

##時代背景

###昔
おじいさんには、Photoshop、Illustrator、Dreamweaverという3種の神器がありました。当時のWebサイト制作は、これらのソフトを利用し、おじいさんが一人で行っていました。おじいさんのような仕事をする人は、Webデザイナーと呼ばれ、とても人気がありました。おじいさんは幸せでした。

###今
いつしかWebデザインは分業化されるようになりました。おじいさんは久しくデザインをしていません。現在の彼の仕事は、デザイナから受け取ったPhotoshopデータを基にWebサイトを制作することです。それはHTML5サイトというとても都合の良いバズワードでまとめらてしまうこともあります。このことについて、おじいさんはやり場のない憤りを抱いています。


##HTML/CSSコーディング

###昔
おじいさんはDreamweaverというソフトを使いHTMLやCSSを書いていました。当時はまだNetscapeという名の絶滅種ブラウザまで存在していました。`<table>`レイアウトが翳りを見せ始め、`XHTML + CSS`がにわかに注目され出した頃のお話です。

###今
おじいさんは、昨今のHTMLやCSSのコーティングに、プログラミングの概念が適用されるようになっていることを知りました。そのようなコーディング開発環境では、いままでは不可能だった、変数の利用や条件分岐、繰り返しといった一般的なプログラミングの利点をコーディングに活用することにより、開発速度を向上させ、品質を維持することができるようになりました。またBoilerplateというテンプレートセットを利用するようになったことも、安定した品質の成果物を制作する手助けとなっています。



##JavaScript開発

###昔
おじいさんはJavaScriptを本格的なプログラミング言語とは思っていませんでした。おじいさんの時代からjQueryは人気があるライブラリーでしたので、それなりに動きのあるサイトは作っていましたが、グローバル空間の汚染は日常茶飯事でしたし、ましてやMVCの概念を持ち込もうなどという事は思いもよりませんでした。

###今
おじいさんは相変わらずjQueryを中心に開発を行っていますが、昨今のJavaScriptの流行から学び、グローバルな領域に変数を列挙してしまうようなことはなくなりました。近い将来はTypeScriptを導入しようと思っています。Backbone.jsやAngular.jsというMVCフレームワークについても関心をもっていますが、これらが彼の手がける案件に必要であったことはいまのところありません。



##自動化

###昔
おじいさんには自動化という概念がありませんでした。強いて言えばPhotoshopのアクションやドロップレットを作っていた事くらいでしょうか。

###今
おじいさんはWebサイト制作に非常に便利な自動化ツールが存在していることを知りました。それはGruntと呼ばれていました。ブラウザのライブリロードや、HTMLやJS、CSSファイルのリントやコンパイル、JS、CSSの結合/圧縮等、いまではこのツールが非常に役に立ってくれています。


##最適化

###昔
おじいさんには最適化という概念がありませんでした。すべてのJavaScriptとCSSは開発時と同じ状態で`<head>`タグ内に読み込んでいました。そうすることに何も疑問を抱かなかったのです。

###今
おじいさんはレンダリングブロックを意識し、これをできるだけ短くするため、JavaScriptとCSSを結合/圧縮するようになりました。画像は適切な単位でスプライトシートとして結合し、さらにPngについてはPngMiniを利用し圧縮をかけています。


##最後に
おじいさんは一昔前までは、Flashと呼ばれるとても活気のあるコンテンツの開発を行っていたのですが、さまざまな理由からFlashというメディアはこの世から徐々に姿を消しつつあります。そのことについて想いを馳せると、おじいさんはとても複雑な気持ちになります。Flashが花形だった当時と比べると、Webのトレンドも随分と様変りをしたものです。それでもおじいさんは、今もなおフロントエンドの開発に携われている自分は幸せだなぁと思っています。
TwitterのプロフィールアイコンのURLが変わってしまったので設定し直す

ってのを、自分が管理しているいくつかのウェブアプリでやった。2014年1月のこと。

https://github.com/kosenconf/kceffect/commit/a469bc8aa0bdf77c264a2d664472d3942eebebb9

```rb
condition = "icon_url LIKE '%twimg%' AND icon_url NOT LIKE '%pbs%'"

User.where(condition).order(:id).each do |user|
  puts "(id:%d) @%s" % [user.id, user.name]

  url = user.icon_url

  begin
    open(url)
  rescue => error1
    if error1.class == OpenURI::HTTPError
      begin
        new_url = Twitter.user(user.twitter_id.to_i).profile_image_url
        new_url_replaced = new_url.sub(/_normal(\.[^.]+)$/) { |e| $1 }

        puts "\t#{url}\n\t=> #{new_url_replaced}"

        open(new_url_replaced)

        user.update_attribute(:icon_url, new_url_replaced)
      rescue => error2
        p error2
      end
    end
  else
    p error1
  end

  sleep 10
end
```

ActiveRecord の User ってモデルがあって icon_url っていうカラムにプロフィール画像の URL を格納してある場合の処理例。

こういうことがあったので、今後は Twitter の画像の URL をそのまま参照せずに、Amazon S3 の bucket 等を自分で用意してそこに画像をコピーして配置して参照する方法を取っていきたいな、という気持ち。

Qiita さんも、アイコンが死んでいる例をちょいちょい見かけて、のぞいてみたらやっぱり Twitter の URL っぽいやつがあったので、大変ですよね、お疲れさまです。アイコンの死骸があると表示も崩れて悲しいから、うまいこと対応できるといいですね。
navigationItemにUILongPressGestureRecognizerを設定する方法

rightBarButtonItemとかleftBarButtonItemにジェスチャーを追加する方法です。
これらはUIBarButtonItemです。
しかしaddGestureRecognizerはviewに対するメソッドなので、UIBarButtonItemには適用できません。
つまりUIBarButtonItemのviewさえ取得できればaddGestureRecognizerできるということです。

取得方法は色々あるみたいですが、KVCを使えば簡単に実現できます。

```objc
[self.navigationItem.rightBarButtonItem valueForKey:@"view"]
```
これだけでrightBarButtonItemのviewを取得できます。

実装は以下の通りです。
（GestureRecognizerインスタンスの取得に[BlocksKit](https://github.com/pandamonia/BlocksKit)を使っていますが、本題はそこではないので了承ください)

```objc
    //UILongPressGestureRecognizerのインスタンス
    UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]initWithHandler:^(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location) {
        if (state == UIGestureRecognizerStateBegan) {
            NSLog(@"began");
        }
    } delay:0.4];
    //ジェスチャーの追加
    [[self.navigationItem.rightBarButtonItem valueForKey:@"view"]addGestureRecognizer:lpgr];
```

[参考サイト(stack-overflow)](http://stackoverflow.com/questions/2655630/how-can-you-add-a-uigesturerecognizer-to-a-uibarbuttonitem-as-in-the-common-undo)

ってここまで書いてて思ったんですけど、これってrightBarButtonItemのプライベート変数にアクセスしてるのでリジェクト対象になったりするんですかね？
Ajax更新したいのに、Chromeさんがずっと以前のファイルをCache Loadしてくれてる場合の対処法


##背景
* Ajaxなウェブアプリをつくっていて、ページを更新した際に、重い動画ファイルも更新してほしい
* でも、Chromeさんはお利口なので、一つ前のリクエストで渡した動画ファイルをずっと読み込み続けて、それが完了するまで、新しいリクエストを処理してくれない。

*※HTTP headerにExpiresやMax-ageなどを指定しても、Chromeさんが「嫌や嫌や、わいはそれでもCacheするんや！」とわめきます。*

##対処法
* URLのQuery Parameter(?で渡すやつ)に、毎秒変わるパラメータを渡してしまいましょう。

```ruby:hoge.html.erb
<video controls>
  <source src="https://video_server.com/video.mp4?loaded_at=<%= Time.now.to_i %>" type='video/mp4' />
<video>
```
 

####下記StackOverflowより
http://stackoverflow.com/questions/12220998/chrome-is-caching-even-with-http-no-cache-headers