OmniAICreator/Qiita-1.07M huggingface dataset:
[iOSアプリ]DropBoxと連携する


## アプリを登録する
###アプリの登録
下記 URL の”Create app”よりアプリを登録します。
https://www.dropbox.com/developers/apps
Drop insとDrop box APIの選択があります。
今回はアプリ内のファイルをDropBoxフォルダに保存、読み込みしたいのですが、Drop box APIのほうが色々と柔軟にできるようなので、こちらを選びました。

###作成されたキーの確認
左メニューの"app console"から先ほど作成したアプリを選びます。
App Key, App Secretが表示されます。このキーは後ほど必要になります。

![kobito.1394270797.088551.png](https://qiita-image-store.s3.amazonaws.com/0/29775/d6d3f0a5-f4e8-9734-df12-52d1ceb2c980.png "kobito.1394270797.088551.png")



## SDKをxCodeプロジェクトに組み込む
###SDKをダウンロード
左メニューの”Core API”を選び、iOSの"Install SDK"からダウンロード。


###xcodeに組み込み
解凍してDropboxSDK.frameworkをxcodeのプロジェクトにドラッグ
![kobito.1394270236.915485.png](https://qiita-image-store.s3.amazonaws.com/0/29775/d00ae724-20f1-0f2f-ec4a-de4a8885df35.png "kobito.1394270236.915485.png")

Copy items into destination group's folder
をチェックしてFinish。

###Security.framework, QuartzCore.framework を設定
xcodeのファイルエクスプローラーでターゲットのプロジェクトを選択し、
"Build Phases"タブの"Link Binary with Libraries"の"+"ボタンをクリックします。
表示されたダイアログでSecurity.frameworkを検索して追加します。
QuartzCore.frameworkについても同様に繰り返します。

![kobito.1394251368.725687.png](https://qiita-image-store.s3.amazonaws.com/0/29775/a0fb0f24-59e4-6f3a-0cab-a0373c98660e.png "kobito.1394251368.725687.png")

## コーディング
###アプリを認証させる
APP KEY, APP SECRETには、先ほど入手したものを指定してください。

```objectivec:AppDelegate.m
#import <DropboxSDK/DropboxSDK.h>
DBSession *dbSession = [[DBSession alloc]
      initWithAppKey:@"INSERT_APP_KEY"
      appSecret:@"INSERT_APP_SECRET"
      root: kDBRootAppFolder]; // either kDBRootAppFolder or kDBRootDropbox
[DBSession setSharedSession:dbSession];

```

適当なボタンを押した時に、以下メソッドを実行

```objectivec:ViewController.m
- (IBAction)didPressLink {
    if (![[DBSession sharedSession] isLinked]) {
        [[DBSession sharedSession] linkFromController:self];
    }
}
```

###URL Schemaの設定
xcodeのファイルエクスプローラーでターゲットのプロジェクトを選択し、
"info"→"URL Types"の"URL Schemas"に
db-APP_KEY (APP_KEYは先ほど取得したもの)と入れる

![kobito.1394252791.657776.png](https://qiita-image-store.s3.amazonaws.com/0/29775/f7e4a1b7-1d45-5e7d-1afa-40a74395b695.png "kobito.1394252791.657776.png")


###認証完了の処理をAppDeletete.mに追加。

```objectivec:AppDelegate.m
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
    sourceApplication:(NSString *)source annotation:(id)annotation {
    if ([[DBSession sharedSession] handleOpenURL:url]) {
        if ([[DBSession sharedSession] isLinked]) {
            NSLog(@"App linked successfully!");
            // At this point you can start making API calls
        }
        return YES;
    }
    // Add whatever other url handling code your app requires here
    return NO;
}

```

## 認証の確認
さてアプリをビルドしてみて、先ほど作った認証スタートのボタンを押してみましょう。
DropBoxの連携画面が出て来ればOKです！

![kobito.1394271022.397766.png](https://qiita-image-store.s3.amazonaws.com/0/29775/2afa05c1-6005-237e-bf2c-fc16c323c1a9.png "kobito.1394271022.397766.png")
Eclipse+GlassFish3で開発しててGlassFishの起動が69%で止まるようになって困ったときの話

#環境
##OS
Windows7 64bit

##Eclipse
Version: Juno Service Release 2
Build id: 20130225-0426

##GlassFish
3.1.2.2

#発生する問題
CDI のインジェクションがうまく行かなくてアノテーションを色々切り換えたりしていると、突然以下のようなエラーが出続けるようになることがある。

![cdi-problem.png](https://qiita-image-store.s3.amazonaws.com/0/28302/bdabbf79-aca2-c6cb-98f8-2975e3a8528b.png)

一度このエラーが発生すると、それ以前までは普通に動いていた状態に実装を戻しても同じエラーが発生してしまうようになる。

さらに、 GlassFish を再起動すると、以下のように 69% でプログレスバーが止まり、起動できなくなる。

![eclipse.png](https://qiita-image-store.s3.amazonaws.com/0/28302/c69cdad3-9b63-22f4-6b34-6153deca2b49.png)

※「起動済み」となっているけど、実際に Web ブラウザでアクセスすると 404 ページが表示される。

こうなると、タスクマネージャーから当該の java プロセスを終了させるしかなくなってしまう。

完全に八方塞がりです。

#解決方法
↓調べたら、同じことで困っている人はチラホラいた。

[GlassFish 3.1 won't start from Eclipse - Stack Overflow](http://stackoverflow.com/questions/5148096/glassfish-3-1-wont-start-from-eclipse)

この中で、 `<GlassFishインストールフォルダ>\glassfish\domains\domain1\osgi-cache\` 以下を削除すれば解決するみたいなことが紹介されている。

確認してみると、 `felix` というフォルダがあった。

![osgi-cache.png](https://qiita-image-store.s3.amazonaws.com/0/28302/54827123-fbc5-5fd2-73ba-e141e2d4b73b.png)

こいつを削除して、実装をエラーが発生する前の状態に戻すと、 GlassFish が正常に起動するようになった。

解決方法がわからないと本当に途方に暮れてしまう現象なので、わりとシャレならない問題です。

#参考
- [GlassFish 3.1 won&'t start from Eclipse - Stack Overflow](http://stackoverflow.com/questions/5148096/glassfish-3-1-wont-start-from-eclipse)
完全に覚え書き：rbenvでインストールするrubyの更新


### rbenv install -l で確認

環境はMacOSです。
rbenvのrubyのバージョンを上げたいなと思ったら...

```
% rbenv install -l
Available versions:
  1.8.6-p383
  # 中略 
  2.0.0-rc1
  2.0.0-rc2
  2.1.0-dev
  2.1.0-preview1
  jruby-1.5.6
  jruby-1.6.3
  # 以下略……
```
ruby2.1がこのままだと選択できない。

### ruby-buildをupgradeする

```
% sudo brew update
Password:
Already up-to-date.
% brew upgrade ruby-build
==> Upgrading 1 outdated package, with result:
ruby-build 20140225
==> Upgrading ruby-build
==> Installing ruby-build dependency: openssl
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/
# 以下略

```

これで、rbenv install -lすると、インストールできるバージョンが増えていた！
もう2.1.1なんですね...

```
% rbenv install -l
Available versions:
  1.8.6-p383
  # 中略
  2.0.0-rc1
  2.0.0-rc2
  2.1.0
  2.1.0-dev
  2.1.0-preview1
  2.1.0-preview2
  2.1.0-rc1
  2.1.1
  2.2.0-dev
  jruby-1.5.6
  jruby-1.6.3
  # 以下略
```
ということで、2.1.1 にしました。

```
% rbenv install 2.1.1
Downloading ruby-2.1.1.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/e57fdbb8ed56e70c43f39c79da1654b2
Installing ruby-2.1.1...
Installed ruby-2.1.1 to /Users/takano/.rbenv/versions/2.1.1

% ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin12.0]
```
VagrantでSSHする際にカレントディレクトリを/vagrantに設定する


Vagrantでは、/vagrantがSynced Folderに設定されているため、ホームディレクトリではなく、/vagrantで作業することが多いのでは無いかと思います。

そこで、VagrantのVMにSSHする際に、SSHで/vagrantが開くように設定してみたいと思います。以下のコマンドで可能です。

```
$ vagrant ssh -c "cd /vagrant; bash"
```

`.zshrc`あたりに下記のような感じで設定しておくと、`vssh`で上記コマンドを使えるようになって便利です。

```
alias vssh='vagrant ssh -c "cd /vagrant; bash"';
```
Rails4のローカル環境でhttps(SSL) (on Windows)

Rails4(webRick)をWindowsで走らせてSSL(https)を使うメモ。

環境： Windows8 / Ruby1.9.3 / Rails4.0.2

----

下記の記事を参考にやってみた。

## rails実行ファイル

`.\bin\sslrails`を作る。

```rb:bin/sslrails
#!/usr/bin/env ruby
require 'rubygems'
require 'rails/commands/server'
require 'rack'
require 'webrick'
require 'webrick/https'

module Rails
  class Server < ::Rack::Server
    def default_options

      # cn と comment を適当に設定
      cn = [[ "CN", WEBrick::Utils::getservername]]  
      comment = "Generated by Ruby/OpenSSL"   
      cert, rsa = WEBrick::Utils::create_self_signed_cert(1024, cn, comment)
      ssl_certificate = cert.to_s
      ssl_private_key = rsa.to_s

      super.merge({
          :Port => 443,
          :environment => (ENV['RAILS_ENV'] || "development").dup,
          :daemonize => false,
          :debugger => false,
          :pid => File.expand_path("tmp/pids/server.pid"),
          :config => File.expand_path("config.ru"),
          :SSLEnable => true,
          :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
          :SSLPrivateKey => OpenSSL::PKey::RSA.new(ssl_private_key),
          :SSLCertificate => OpenSSL::X509::Certificate.new(ssl_certificate),
          :SSLCertName => cn
      })
    end
  end
end


APP_PATH = File.expand_path('../../config/application',  __FILE__)
require_relative '../config/boot'
require 'rails/commands'
```

`config/environments/development.rb`に、`config.force_ssl = true`を追加するとhttpへのアクセスもhttpsにリダイレクトしてくれるらしい。

## サーバーの起動
`bundle exec ruby .\bin\sslrails s`
もしかしたら`ruby .\bin\sslrails s`でも大丈夫？

アクセスするとエラーページなり警告ダイアログなり出るだろうけど正常。

## サーバーの再起動
なおサーバーを起動するときに鍵を生成してるので再起動すると鍵が変わる。
そのため同セッションから再接続しようとすると当然のことながら証明書エラーが出る。

```
[2014-03-08 15:39:19] ERROR OpenSSL::SSL::SSLError: SSL_accept returned=1 errno=0 state=SSLv3 read client certificate A:
 sslv3 alert bad certificate
        C:/Ruby193/lib/ruby/1.9.1/openssl/ssl-internal.rb:172:in `accept'
[2014-03-08 15:39:33] ERROR OpenSSL::SSL::SSLError: SSL_accept SYSCALL returned=5 errno=0 state=SSLv2/v3 read client hel
lo A
        C:/Ruby193/lib/ruby/1.9.1/openssl/ssl-internal.rb:172:in `accept'
```

Chromeだったらとりあえずいったん終了すれば大丈夫。Firefoxの場合はcert8.dbを削除するしか無いみたい(http://www.yubaz.com/?p=52 )…ほかの手段知ってたら教えてください。




## 参考(ってかそのまま)

- [Railsのローカル環境にhttps(SSL)を導入する方法](http://qiita.com/GenTamura84/items/a1af6e9b5eb69d5469b7) 
- [Configuring WEBrick to use SSL in Rails 4 - Stack Overflow](http://stackoverflow.com/questions/21189920/configuring-webrick-to-use-ssl-in-rails-4)
シンボリックリンクの注意点

# 概要

シンボリックリンクを貼るときは、相対パスに気をつけて

# 詳細

シンボリックリンクを貼りたいときは、以下のコマンドが使う。

```bash
ln -s source_file [target_file]
```

が、例えば以下のように実行するとうまく行かない。

```bash
ln -s .ssh/serverA.staging.id_rsa .ssh/serverA.id_rsa
```

----

どうやら相対パスは シンボルの場所から解決されるようで

```bash
(cd .ssh && ln -s serverA.staging.id_rsa serverA.id_rsa)
```

とするか

```bash
ln -s $(pwd)/.ssh/serverA.staging.id_rsa .ssh/serverA.id_rsa
```

としないといけないようだ
NGUIのボタンで状態毎に異なるUI2DSpriteを割り当てる方法

NGUI でボタンを作成する場合に UIWidget にアタッチできるスクリプトとして UIButton が用意されています。このスクリプトは状態(hover:マウスオーバー時, highlighted:押下時, disabled)により、ボタンに重ねる色を選択できますが、色だけでなくボタンに使われているスプライト(UI2DSprite)にアタッチした場合に画像を変更したい場合があります。iOSのUIButtonのようなイメージです。

UISprite の場合は UIImageButton というスクリプトが用意されており、これをアタッチすることで実現できますが、UI2DSprite にアタッチできるスクリプトが見当たりませんでした。そこで作成したものが以下です。

```SpriteButton.cs

using UnityEngine;
using System.Collections.Generic;

[RequireComponent(typeof(UI2DSprite))]
public class SpriteButton : MonoBehaviour
{
    static public SpriteButton current;

    private UI2DSprite target;
    public Sprite normalSprite;
    public Sprite hoverSprite;
    public Sprite pressedSprite;
    public Sprite disabledSprite;

    public List<EventDelegate> onClick = new List<EventDelegate>();

    public bool isEnabled
    {
        get
        {
            Collider col = collider;
            return col && col.enabled;
        }
        set
        {
            Collider col = collider;
            if (!col) return;

            if (col.enabled != value)
            {
                col.enabled = value;
                UpdateImage();
            }
        }
    }

    void OnEnable ()
    {
        target = GetComponent<UI2DSprite>();
        UpdateImage();
    }

    void UpdateImage()
    {
        if (target != null)
        {
            if (isEnabled)
            {
                Sprite sprite = UICamera.IsHighlighted(gameObject) ? hoverSprite : normalSprite;
                if (sprite != null) target.sprite2D = sprite;
            }
            else
            {
                if (disabledSprite != null) target.sprite2D = disabledSprite;
            }
            target.MakePixelPerfect();
        }
    }

    void OnHover (bool isOver)
    {
        if (isEnabled && target != null)
        {
            Sprite sprite = isOver ? hoverSprite : normalSprite;
            if (sprite != null) {
                target.sprite2D = sprite;
                target.MakePixelPerfect();
            }
        }
    }

    void OnPress (bool pressed)
    {
        if (pressed)
        {
            if (pressedSprite != null) {
                target.sprite2D = pressedSprite;
                target.MakePixelPerfect();
            }
        }
        else UpdateImage();
    }

    void OnClick ()
    {
        if (isEnabled)
        {
            current = this;
            EventDelegate.Execute(onClick);
            current = null;
        }
    }
}

```

こちらを UI2DSprite にアタッチして Sprite を各フィールドに設定すると状態に応じて Sprite が切り替わります。他は UIButton の様に使えます。
xcode-selectでXcodeのインストールディレクトリを変更する

Xcodeのインストール先を変更したい場合はxcode-selectを使う。
※Xcode4.3移行はXcodeのインストールディレクトリが変更されていたりする。

```
# sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
```

きちんと変更されているか確認する。

```
# xcode-select -print-path
```
rubyで作るtwitter bot <oauth error　について>

以前は動いていたのだが、サーバーをアップグレードしてしまってから下記のようなエラーがでて認証がうまくいきません。OSも再インストールしたし、ruby のバージョンも gem もいろいろ試しましたが結局このエラーで止まります。  

irb を起動して require 'rubygems' で false が出るのは irb の内部で既にrequireして読み込んでるらしいので問題はありません。

twitter の gem を使って簡単にできるのが魅力なのですが、認証がうまくいかないとは。。。

参考 http://morizyun.github.io/blog/twitter-bot-ruby-rails

<pre>
/home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/twitter-5.7.1/lib/twitter/rest/response/raise_error.rb:17:in `on_complete': Could not authenticate you (Twitter::Error::Unauthorized)
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/faraday-0.9.0/lib/faraday/response.rb:9:in `block in call'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/faraday-0.9.0/lib/faraday/response.rb:57:in `on_complete'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/faraday-0.9.0/lib/faraday/response.rb:8:in `call'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/faraday-0.9.0/lib/faraday/request/url_encoded.rb:15:in `call'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/faraday-0.9.0/lib/faraday/request/multipart.rb:14:in `call'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/twitter-5.7.1/lib/twitter/rest/request/multipart_with_file.rb:18:in `call'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/faraday-0.9.0/lib/faraday/rack_builder.rb:139:in `build_response'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/faraday-0.9.0/lib/faraday/connection.rb:377:in `run_request'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/faraday-0.9.0/lib/faraday/connection.rb:177:in `post'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/twitter-5.7.1/lib/twitter/rest/client.rb:92:in `request'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/twitter-5.7.1/lib/twitter/rest/client.rb:69:in `post'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/twitter-5.7.1/lib/twitter/request.rb:22:in `perform'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/twitter-5.7.1/lib/twitter/request.rb:29:in `perform_with_object'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/twitter-5.7.1/lib/twitter/rest/utils.rb:39:in `perform_with_object'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/twitter-5.7.1/lib/twitter/rest/tweets.rb:148:in `update!'
	from /home/ubuntu/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/twitter-5.7.1/lib/twitter/rest/tweets.rb:120:in `update'
	from bot.rb:20:in `<main>'
</pre>

主要部分のソースです

<pre>
require 'rubygems'
require 'twitter'

client = Twitter::REST::Client.new do |config|
  config.consumer_key = "aaaaa"
  config.consumer_secret = "vvvvv"
  config.access_token = "ffffff"
  config.access_token_secret = "ccccccc"
end

client.update 'test tweet'
</pre>

以前は動いていたのですが、なぜoauth認証がうまくいかないのか。アプリケーションのバージョンや環境は
メモするということは重要ですね。。。
第19回オフラインリアルタイムどう書くの問題をPythonで 

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

他の解答例はこちら
http://qiita.com/Nabetani/items/9810b301648099028bf0

```py
from math import floor

def solve(data):
    bad = map(int, data.split(','))
    hdd = [[0]*n for n in (0, 8, 16, 24, 32)]
    def mark(t,s): hdd[t%len(hdd)][s%len(hdd[t])] += 1
    def side(t,s): return int(floor((s - 0.5) / track * t + 0.5))
    for track, sector in ((b/100, b%100) for b in bad):
        mark(track, sector-1)
        mark(track, sector+1)
        if track > 1:
            for s in range(side(track-1, sector), side(track-1, sector+1)+1):
                mark(track-1, s)
        if track < 4:
            for s in range(side(track+1, sector), side(track+1, sector+1)+1):
                mark(track+1, s)
    return ','.join(map(str, (t*100+s for t in (1,2,3,4) for s in range(8*t)
                              if hdd[t][s]>1 and t*100+s not in bad))) or "none"

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

0, test( "400,401,302", "300,301,402" );
1, test( "105,100,306,414", "none" );
2, test( "100", "none" );
3, test( "211", "none" );
4, test( "317", "none" );
5, test( "414", "none" );
6, test( "100,106", "107" );
7, test( "205,203", "102,204" );
8, test( "303,305", "304" );
9, test( "407,409", "306,408" );
10, test( "104,103", "207" );
11, test( "204,203", "102,305" );
12, test( "313,314", "209,418" );
13, test( "419,418", "314" );
14, test( "100,102,101", "201,203" );
15, test( "103,206,309", "205,207,308,310" );
16, test( "414,310,309", "206,311,413" );
17, test( "104,102,206,307,102,202", "101,103,203,204,205,207,308" );
18, test( "104,206,308,409,407", "103,205,207,306,307,309,408,410" );
19, test( "313,406,213,301,409,422,412,102,428", "none" );
20, test( "101,300,210,308,423,321,403,408,415", "none" );
21, test( "304,316,307,207,427,402,107,431,412,418,424", "none" );
22, test( "205,408,210,215,425,302,311,400,428,412", "none" );
23, test( "200,311,306,412,403,318,427,105,420", "none" );
24, test( "105,305,407,408,309,208,427", "104,209,306,406" );
25, test( "311,304,322,404,429,305,316", "203,303,321,405,406,430" );
26, test( "210,401,316,425,101", "211,315" );
27, test( "414,403,404,416,428,421", "303,415" );
28, test( "207,300,103,211,428", "104,206" );
29, test( "322,314,310", "none" );
30, test( "427,200,215", "100,323" );
31, test( "311,402,424,307,318,430,323,305,201", "200,204,301,302,306,322,423,425,431" );
32, test( "425,430,408", "none" );
33, test( "202,320,209,426", "319,427" );
34, test( "430,209,302,310,304,431,320", "202,303,323" );
35, test( "208,206,406,424,213,312", "207,311,313" );
36, test( "420,302,313,413,317,402", "301,403" );
37, test( "319,306,309,418,204,411", "305,307,308,412" );
38, test( "400,308,105,430,203,428,209", "104,210,429,431" );
39, test( "200,305,214", "215" );
40, test( "214,408,410,407,317,422", "306,316,409,423" );
```
リストとリストを比較して、共通する要素をリストで取り出す方法


文字列を要素とする2つのリストを比較して、共通する要素をリストとして取り出したいことがありました。
まあ、出来るんですが、どうやるのが良いのかなと自分なりにアレコレ考えたり調べたりしました。

###たとえば、
こんな、tag_listとsrc_listという2つのリストがあって、共通する要素をリストとして取り出したいとします。

    tag_list=['igarashi', 'kubo', 'iguchi']
    src_list=['taniguchi', 'matsushita', 'koyama', 'asama', 
              'marui', 'igarashi', 'kubo', 'kondo']

tag_listは3つの要素があります。
`igarashi`と`kubo`はsrc_listにもありますが、`iguchi`はないので期待値は`['igarashi', 'kubo']`となります。

###1. それぞれのリストをfor文で回して要素を取り出し比較する

    matched_list = []
    for tag in tag_list:
        for src in src_list:
            if tag == src:
                matched_list.append(tag)

私の頭で最初に思いついたのは、当然コレでした。
分かりやすいんですけど、インデントが深くてもっさりした感じだなあと… 

###2. 1つのリストはfor文、もう1つはfilter関数で要素を取り出して比較する

    matched_list = []
    for tag in tag_list:
        matched_list+=filter(lambda str: str == tag, src_list)

リスト操作関数、filter(), map(), reduce()あたりを使ってみたくて、頑張ってみました。配列操作関数が充実してる言語に慣れた今風な方には直感的なんでしょうか？

###3. リストを集合型(set)に変換して論理積をとる。その結果をリストに変換する

    src_set = set(src_list)
    tag_set = set(tag_list)
    matched_list = list(src_set & tag_set)

ググったらこんなのがいきなり出てきました。ある意味直感的です。
集合型は順序を持たないってのがポイントでしょうか？こういうときに使えるんだなと勉強になりました。

---
### で結局、どう書くのが一番良いんだろう？
わかりやすさ、可読性、スッキリさ、pythonぽさと、一長一短あってどれでも良いのかな？と私は思いました。
もっと他にもギョギョギョ！って書き方あるんですかね？
あと、処理速度的には差が出るのかな？というのも気になりました。
今度、大きなサンプルデータ作って測ってみようと思います。

---
###サンプルソース
cmp_list.py
https://github.com/yamao2253/qiita
VC++ 12 (VS2013) で OpenSSL をビルドしたメモ

## 準備

* [OpenSSL](http://www.openssl.org/) 1.0.1f のソースをダウンロードして展開
* Win32 用 [nasm 2.11.02](http://www.nasm.us/) バイナリをダウンロードして展開
* Perl は以前からインストールされていた [ActivePerl](http://www.activestate.com/activeperl) 5.16.2 を使用
* nasm, Perl, VC++ にパスを通す

ここでは VS 2013 に含まれる VC++ 12 を使用した。

## ビルド

OpenSSL のソースは `D:\Temp\openssl-1.0.1f` に展開されており、ビルド後に `D:\Libraries\openssl` にインストールすると仮定する。

* `D:\Temp\openssl-1.0.1f` に移動
* `> perl Configure VC-WIN32 --prefix=D:/Libraries/openssl` で Makefile を生成
* `> ms\do_nasm` でアセンブリソースを生成
* `> nmake -f ms\ntdll.mak install` で DLL をビルド＆インストール
* `> nmake -f ms\nt.mak install` でスタティックライブラリをビルド＆インストール

テストを実行するならビルドターゲットを test にして `> nmake -f ms\nt.mak test` などとする。最後に passed all tests と表示されれば正常。

デフォルトでは、DLL は CRT に動的リンク、スタティックライブラリは CRT に静的リンクされるようなコード生成オプションになっている。したがって、DLL の方は、原則として実行時に VC++ ランタイムが必要。

未確認だが、VC++ 11 以上でコンパイルする場合、XP でも動作するバイナリをビルドするには XP ツールセットを使った方が無難かもしれない（.mak ファイルの CFLAGS に `/D_USING_V110_SDK71_` を追加）。

デバッグ版をビルドする場合は

```
> perl Configure debug-VC-WIN32 --prefix=D:/Libraries/openssl
```

のようにする。
push漏れ防止策を作ってみた


結構前から考えていた、ネタがあったのだけど、まとめると時間かかりそうなので、今月はさっき思いつきで作ってみたものの紹介。

##概要
gitは以前から使っていて、プライベートの開発はgithubはローカルコミットー＞PUSHを何も考えずにやっているのだけど、チームでの開発だとそうもいかない。

でもPUSHしたかどうかを確認したい！

##対処方法1 - コミットの差分コマンドを作成してみる。

```git log origin/master..master```でリモートとローカルのコミットの差分を見ることができる。でもこれだと、マスターだけだし、長い。
そこで、現在のブランチとそれと同じリモートブランチとの差分を取得するようなコマンドを作成した。


```bash:.bashrc/.zshrc
alias gbn='git rev-parse --abbrev-ref HEAD'

function glr() {
  _branch=`gbn`
  git log origin/${_branch}..${_branch}
}
```
bash/zsh両方で動きました。

##対処方法2 - ケチケチせずに、プロンプトに出してみる。
そこらに転がっているので、別にそっち使えばいいけど、bash/zsh両方対応したかったので、自分で最初から書いてみた。
（やっぱり結局最終的にはほぼ同じコードができたけどねwでも久しぶりのshellが面白かった）

今回役立ったコマンドは以下
 + ```git rev-parse``` - ブランチ名などを渡すとそのハッシュ値を返してくれる

実は最初```git show-ref```でやりくりしていたのですが、こっちのほうが整形とか簡単で使いやすかった。

###zsh
#### 通常時（またはPUSH後）
![スクリーンショット 2014-03-08 1.12.43.png](https://qiita-image-store.s3.amazonaws.com/0/20058/1b363056-074a-a48f-d982-e6509cf871ea.png "スクリーンショット 2014-03-08 1.12.43.png")

#### コミット時
![スクリーンショット 2014-03-08 1.10.02.png](https://qiita-image-store.s3.amazonaws.com/0/20058/75b9ba9a-f978-6966-294f-d2536d04d264.png "スクリーンショット 2014-03-08 1.10.02.png")


###bash

#### 通常時（またはPUSH後）
![スクリーンショット 2014-03-08 1.14.34.png](https://qiita-image-store.s3.amazonaws.com/0/20058/50fc402a-381d-351d-5477-891172bebca6.png "スクリーンショット 2014-03-08 1.14.34.png")

#### コミット時
![スクリーンショット 2014-03-08 1.08.09.png](https://qiita-image-store.s3.amazonaws.com/0/20058/dfda9cb9-14df-6c5f-f741-f9a7c24decae.png "スクリーンショット 2014-03-08 1.08.09.png")

写真四枚使って言いたいことはアスタリスクがあるかないかってだけ・・・。
実際のコードは以下

```bash:.bashrc/.zshrc
function git_not_pushed {
  # git管理下にいるかどうかの確認
  if [[ "`git rev-parse --is-inside-work-tree 2>/dev/null`" = "true" ]]; then
    # HEADのハッシュを取得
    _head="`git rev-parse --verify -q HEAD 2>/dev/null`"
    if [[ $? -eq 0 ]]; then
      # origin/branch名のハッシュを取得
      ### gbnはブランチ名取得のalias。上に記載してある。###
      _remote="`git rev-parse --verify -q origin/\`gbn\` 2>/dev/null`"
      if [[ $? -eq 0 ]]; then
        # 比較して、違ったら*表示。
        if [[ "${_head}" = "${_remote}" ]]; then
          echo -n "*"
        fi
      fi
    fi
  fi
}
```

zshだったら、PROMPT/RPROMPTの中でgit_not_pushedを呼ぶ。

```shell:.zshrc
RPROMPT='その他色々`git_not_pushed`'
```

bashだったら、PS1の中でgit_not_pushedを呼ぶ。

```shell:.bashrc
PS1='その他色々`git_not_pushed`\$ '
```

「その他色々」はこの話とは別なので、省略します。

***
一つ書き忘れたので、追記
対処方法2のコマンドですが、git fetchして、リモート側のHEADを誰かが変更していた場合、コミットしていなくても*が表示されます。対応しようとしたけど、promptへの表示のため、あまり重い処理がかけないことと、今までfetchして放置することってあんまりなかったので、別にいいかーって対応していません。
SQL：インデックス関連のチェックシート



お仕事で作ったテーブル、SQL文のチェックに使いたいのでまとめます。

##テーブル定義
###インデックスを作る列
（B-treeインデックスのこと。ほかって何？？➡ビットマップ、ハッシュ）

| ☑️ | 方針                  | 注意すること|
|:-:|:-----------------------------|:------------|
|   |カーディナリティの高い列であること。|（種類がいっぱいあって、データが偏っていないと良く効く）|
|   |検索条件に利用する列であること。   |（インデックスも容量を食ったり、更新性能に影響するから使うとこだけ指定する）
|   |テーブルの結合に利用する列であること。|（どんな条件で検索されるか検討する）
|   |主キー、一意制約の列にインデックスを作らないこと。|（そもそも作ってくれている）

##SQL
###インデックスの列を利用するとき

| ☑️ | 方針                  | 注意すること|
|:-:|:--------------------------------|:------------|
|   |「<>、!=」で検索をしないこと。    |（インデックスが効かないから）
|   |計算や関数の適用をしないこと。|（比較する値の方で、例えば1/10➡*0.1など工夫する）
|   |IS NULLをなるべく使わないこと。|（DBよっては問題ない場合もあるらしい）
|   |ORを使わないこと。|（INで書き換えるなどする。NOT INはインデックスがたぶん効かないのかな？まあ、ORにはいい思い出が無い・・・）
|   |LIKEは前方一致で検討すること。|（私はあまりLIKE使ってない）
|   |数字の列を文字で検索したりしないこと。|（型の変換がされてしまう）
|   |時々はインデックスを再構築しておくこと。|（大量のデータを入れた後とかでいいかも）

###パーティションの方針

| ☑️ | 方針                  | 注意すること|
|:-:|:--------------------------------|:------------|
|   |データ量が多くなったら検討すること。|（データ量が大きくなってテーブルを水平分割するとかの前に検討する）
|   |インデックスよりも種類の少ない（十から数十程度）データ量を持つ列を指定すること。|（ざっくり絞り込んでからインデックスで特定するという使い方）
|   |値が変化しにくい列を指定すること。|（年度とか都道府県とか。値が変更になるとパーティションをまたいで性能低下の原因になるらしい）
|   |各パーティションに格納されるレコードが均一に近づくようにすること。|（どこか偏ってしまうと効果が下がるので）
|   |選択条件、結合条件に利用する列を指定すること。|（使う列を指定しないと意味が無い。インデックスを貼るには種類が少ないかもっていう時に検討したい）
|   |一意にレコードを特定する目的のテーブルならハッシュパーティションも検討すること。|（ハッシュ関数を使って均一に振り分けてくれることを期待する）


気がついた事はどんどん追記していくようにしたい。

##From 
達人に学ぶDB設計徹底指南書 by ミック様

良書です。エンジニア２年生くらいのときに読みたかった・・・。
Marvericksコンソールから消えないメッセージ - Keyboard / Trackpad (Port 5 of Hub at 0x14000000) may have caused a wake by issuing a remote wakeup (1)

#はじめに
コンソールにはかれているメッセージにイライラさせられたので調べてみました。
#どこが問題か
```
kernel[0]: The USB device Apple Internal Keyboard / Trackpad (Port 5 of Hub at 0x14000000) may have caused a wake by issuing a remote wakeup (1)
```
![スクリーンショット 2014-03-08 6.51.02.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e8424251-370a-f22f-4dbd-d35857b98170.png)

#いつから起こっていたか
去年の10月以降に新しいMacを買ったユーザーを中心に起こっていることがわかりました。

#これなんなの？
Appleへ問い合わせた人が内容を書いてくれていました。
これを信じます。もう半年くらい放置の現象です。
https://discussions.apple.com/message/24510595#24510595

##guestになればみえないよ
見えなくなればいいだけの人用の回答

##Nap Appからのメッセージだよ
NapApp機能が有効になっているOn/Offの切り替えにキーボード・トラックパッドをつかっているということで
止められてたプロセスのアプリがOnになるタイミングでおこる

#確認できたこと

##ログが頻発
 - DVD見てるとき
 - Safariでサイト見てるとき
 - Terminalを動かしているとき

##その他報告から
 - 報告のほとんどが13インチモデル
 - Marvericksへのアップグレードで発現

#確実なこと
NapAppが原因の根源にいる
 - 動画作る、再生する
 - 音作る、再生する
 - PhotoShopなんかで重い処理
 - Terminalも？
 - Windows上でMarvericks使っている人から激オモ情報
http://applech2.com/archives/35321708.html

一括でNapAppを切れる機能はないみたい
NapAppが有効になっているアプリはアクティビティモニターから
表示 > 表示項目 から選んで選択して確認できるようになります。
初期設定の場合は存在すらわからないので要注意。

#参考URL
MacBook Pro Retina Late 2013の一部モデルにキーボードやトラックパッド入力がフリーズしてしまう不具合？
http://applech2.com/archives/34359315.html

#さいごに
どう考えてもドライバなのか、キーボードなどの部品への疑いは拭えないまま
フリーズが頻発するわけでもないので見ないふりします。
動機は無駄ログの原因究明とはいえNap App が原因の根源にいて
問題が起こることを認識できたのが収穫でした。

ただ、個人的には結構高額なものを買ったつもりで、少なくとも三年くらいは使いたいとスペックも高くしました。
NapAppが原因で起こることを常に気にしなくていいように、OSから対応してもらいたい。
ウェブアプリから生成したファイルをダウンロードさせる

mimeタイプに対して、クライアントがどのように振る舞うかは基本的にクライアント次第という理解なんですが、じゃあ明示的に自動生成したファイルをダウンロードさせるにはどうするのか？というのをちょっと調べたら、[情報が出てきた](http://www.hidekik.com/cookbook/p2h.cgi?id=download)ので追試しました。

テストコードは、ArangoDBのFoxx環境用のJSです。

`/download_file` が実際にファイルを生成して返すエンドポイントです。このページを叩くと、ダウンロードが始まります。mimeタイプの `application/download` がポイントです。あと、ファイル名も `Content-Disposition` で指定できます。

```js
(function() {
    "use strict";

    var Foxx = require("org/arangodb/foxx"),
        controller = new Foxx.Controller(applicationContext)

    controller.get("/download_file", function(req, res) {
        res.set("Content-Type", "application/download");
        res.set("Content-Disposition", 'attachment; filename="test.csv"');
        res.body = ['"name","age"',
                    '"Yoshiki","33"'].join('\n');
    });
}());
```

ここまでは上記のリンクに出てきたんですが、よくあるダウンロードサイトとかどうなのかな、と思って、他のエンドポイントも実験で作ってみました。

```js
    controller.get("/download", function(req, res) {
        res.set("Content-Type", "text/html");
        res.body = '<html><body><a href="./thanks">Download</a></body></html>';
    });

    controller.get("/thanks", function(req, res) {
        res.set("Content-Type", "text/html");
        res.body = '<html><head><meta http-equiv="refresh" content="0;URL=./download_file"></head><body><a href="./download_file">Retry</a></body></html>';
    });
```

`/download` がダウロードページ相当です。まぁここは単なるリンクですので無視してもらっても大丈夫です。

`/thanks` がよくある「ダウンロードありがとう、うまくできなかったらここをクリックして直接落としてね」というページです。このページにアクセスすると即座に上記のファイルダウンロードページにジャンプ、となっていますが、実際にはジャンプしません(Chrome/Firefox)。ダウンロードするものの、ページはそのままです。Retryのリンクをクリックしても、同じ挙動(ページはそのままでダウンロード開始)です。[これみたいに](http://d.hatena.ne.jp/moriyoshi/20081031/1225431088)、iframeとか、dataスキームみたいな黒魔術を使ってなんかやっているのかなぁ、とか勝手に思ってましたが、もっとシンプルでした。

## 追記

[これ](http://qiita.com/kompiro/items/ac60721bc43625a057dc)を見ると、 `Content-Disposition` が大事みたいですね。RFCで決まっているとのこと。[こちら](http://qiita.com/i18n/items/0b7d78f0c5dd8178b5e4)のサンプルを見ると、content-typeは `application/download` じゃなくてもOKっぽい。Qiitaは投稿したあとに関連項目が出て理解が深まるので勉強メモをアップするにはいいですね。
NeoBundleの簡易インストーラを作りました


マシンを変えたりする度に同じことをしている気がするので、簡単なものではありますが作っておきました。
どなたかの役に立てばと思い公開しておきます。

[shoma2daをフォロー](https://twitter.com/intent/user?screen_name=shoma2da)

## NeoBundleとは

Vimのプラグイン管理のためのプラグインです。もともとはVundleからforkして開発されたものです。
違いなどについては[作者自らが説明しています](http://vim-users.jp/2011/10/hack238/)。

## GitHub

ソースコードは[こちらの公開リポジトリ](https://github.com/shoma2da/neobundle_installer)に置きました。
実装としては非常に単純なShell Scriptを用意しただけです。

## 使い方

README.mdにも書いてありますが以下の２コマンドを実行するだけです。

```Bash
$ git clone git@github.com:shoma2da/neobundle_installer.git
$ ./neobundle_installer/install.sh
```

## 何が起きるの？

1. `~/.vim/bundle`以下にNeoBundleを配置します。
2. `~/.vimrc`にNeoBundle周りの設定を追記します。

## インストール後は...

`~/.vimrc`に以下のようなプラグインに関する記載をしてvimを起動して`:NeoBundleInstall`してください。
プラグインがインストールされます。

```
NeoBundle 'Shougo/neosnippet.vim'
```

以降の詳細な使い方は[NeoBunlde本体のGitHub](https://github.com/Shougo/neobundle.vim)をご覧ください。

[shoma2daをフォロー](https://twitter.com/intent/user?screen_name=shoma2da)
boot2dockerのkernel panicはVirtualBox 4.3.6を入れると吉

* [公式issues](https://github.com/boot2docker/boot2docker/issues/260)に記載があった。

構成
=======

Macbook air 2012 13 inch では boot2dockerが起動成功するが、
Macmini 2012ではkernel panicで起動しなかった。

* VirtualBox 4.3.8 r92456
* OSX 10.9.2

Macbook airで起動成功した仮想マシンをそのままMacminiで動かしても同現象。
割り当てメモリを1GB -> 2GBやチップセットを変更してもダメ。

対処
=======

その場合は [VirtualBox-4.3.6-91406-OSX.dmg](http://dlc.sun.com.edgesuite.net/virtualbox/4.3.6/VirtualBox-4.3.6-91406-OSX.dmg)をインストールすればよい。

* [vbox-extpack](http://download.virtualbox.org/virtualbox/4.3.6/Oracle_VM_VirtualBox_Extension_Pack-4.3.6.vbox-extpack)
AVDでOKを押してもデバイスが作成されない問題の解決策

[Stack Over Flowに書かれている](http://stackoverflow.com/questions/22190076/cannot-create-or-edit-android-virtual-devices-from-eclipse-ok-button-works)のですが、エラーメッセージが出ないため解決策を見つけるのに時間がかかりました。
どうやらandroid SDK 22.6のバグらしいです。
自分の環境下では、[android sdkのパス] > tools > android という実行ファイルに avd　という引数をつけてAVDを起動し、デバイスを作成したところ上手くいきました。コマンドを以下に示します(Macのterminal)

```
/Users/go-zen-chu/android-sdk/tools/android avd
```
これで開いたAVDでは無事にデバイスを作成できました。どうしてこんな問題が生じたのでしょうか。
Win/LinuxでもMacのdashのようにAPI検索したい

ということで、[zeal](http://zealdocs.org/ "zeal")を入れるだけのエントリーですｗ
Windows/Linux上でもMacの[dash](http://kapeli.com/dash "dash")のように複数言語のAPIドキュメントをオフラインで検索できるようになります。
Ubuntu12.04上でvim連携した際の例です。
GUI環境が必要です。

```bash:zealのインストール
sudo add-apt-repository ppa:jerzy-kozera/zeal-ppa
sudo add-apt-repository ppa:ubuntu-sdk-team/ppa
sudo apt-get update
sudo apt-get install zeal
```

zealを起動してEdit > Options > Docsetタブから必要な言語のドキュメントをダウンロードします。

vim連携する場合は以下を.vimrcに追加します。(NeoBundle管理)

```bash:.vimrcにzealとの連携設定を書く
NeoBundle 'Keithbsmiley/investigate.vim'
nnoremap gz :!zeal --query "<cword>"&<CR><CR>
```

単語の上にカーソルを合せてgzと入力するとzealでカーソル上の単語を検索できます。

便利！。。。。。。。。。と言いつつ、vim連携はあんまり使ってませんｗ
iOSやObjective-Cの開発に役立つブログのまとめ

RSSで購読すると重荷になるけど、時間がある時に読みたいブログのまとめ
随時追記していく

* [NSHipster](http://nshipster.com)
* [objc.io](http://www.objc.io)
* [Subjective-C](http://subjc.com)
* [iOS Dev Weekly](http://iosdevweekly.com)
* [Think & Build](http://www.thinkandbuild.it)
* [Ray Wenderlich](http://www.raywenderlich.com)
* [David Rönnqvist](http://ronnqvi.st)
* [inessential](http://inessential.com)
* [iOS-Blog](http://ios-blog.co.uk)
* [Macoscope Blog](http://macoscope.com/blog/)
PHPのMongoDBでのRegex検索メモ

[MongoRegex](http://jp2.php.net/manual/ja/class.mongoregex.php) というクラスを使う必要があるので、忘れないようにメモ。

```php
// 使用例

try {
	$db = new MongoClient("mongodb://localhost");
} catch(MongoConnectionException $e) {
	exit($e->getMessage());
}

$collection = $db->mydb->mycollection;

$collection->insert(array('_id'=>'test1', 'value'=>'文字のテスト'));
$collection->insert(array('_id'=>'test2', 'value'=>'テストの文字'));

$find = array(
	// MySQLでいうと「value LIKE '文字%'」
	'value' => new MongoRegex("/^文字/")
);

$cursor = $postal->find($find);
foreach ( $cursor as $id => $value ) {
	var_dump( $value );
}
```
Cocos2d-xでCCSpriteの当たり判定（タッチ判定）

CCSpriteにはboundingboxというメソッドがあり、これを使って矩形判定をすることができます。
回転拡縮を行なっても自動的に矩形の大きさを調整してくれます。

ただし注意点もあります。
検索したところ、下記のブログに詳しく書かれていましたので参考になるかと思います。

> 【cocos2d】CCSpriteのサイズを取得するときに気をつけること
> http://obc-fight.blogspot.jp/2013/02/cocos2dccsprite.html

上記の点にさえ気をつければ、boundingboxで返されるCCRect型には、containsPointというCCPointがその矩形に内包されているかをチェックするメソッドもあるので、単純な矩形の当たり判定はすぐにできるでしょう。

しかしまだ問題があります。
CCSpriteのboundingboxに限った話ではないのですが、矩形判定を行うときの一般的な問題として、回転させたときに見た目よりも大きな範囲でboundingboxの矩形がとれてしまうことです。

![スクリーンショット 2014-03-08 6.11.48.png](https://qiita-image-store.s3.amazonaws.com/0/19676/da4b27cb-ec3b-3416-1dbe-0e2d0f3f4d2f.png)

このスプライトをユーザーがタッチする場合、傾きによって生まれた空白の部分もタッチ判定されてしまうため、操作に違和感を覚えることがあります。

そのため、もっと厳密にスプライトの当たり（タッチ）判定が取りたい場合は下記のような方法で判定することができます。

1. スプライトの幅と高さの矩形を作る
2. 上記で作成した矩形をスプライトのnodeToWorldTransformで取得できる変換行列で変換
3. タッチ座標をワールド座標（OpenGL座標）に変換
4. 外積を使ってタッチ座標が変換後の矩形領域にあるか判定する

外積を知らない方の為にすごい簡単に説明しますと、ベクトル同士が直交するベクトルのことです。3Dではライティングの計算のための法線計算などにも使われたりしますが、今回のように内外判定にも使えます。

また、今回は四角形での判定に使用していますが、凸ポリゴンの判定にも使えますし、凹ポリゴンでも三角形に分割して判定すれば、ほぼ同様に判定をすることができます。

サンプルコードは下記の様になります。

```objc
{
	CCTouch* pTouch = (CCTouch*)pTouches->anyObject();
	CCPoint locationPoint = pTouch->getLocationInView();
	CCPoint glPos = CCDirector::sharedDirector()->convertToGL(locationPoint);

	if( isHitCCSprite(sprite, plPos) ) {
		CCLOG("HIT");
	}
}

bool isHitCCSprite(CCSprite* sprite, CCPoint glPoint)
{
	// 変換前のスプライトの矩形を求める
	CCSize size = sprite->getContentSize();
	
	CCPoint v[4] = {
		ccp(0,0),
		ccp(0, size.height),
		ccp(size.width, size.height),
		ccp(size.width, 0),
	};
	
	// 矩形をワールド座標に変換する
	CCAffineTransform affine = sprite->nodeToWorldTransform();
	
	for( int i=0; i<4; i++ ) {
		v[i] = CCPointApplyAffineTransform(v[i], affine);
	}

	// 外積判定用のベクトルを求める
	CCPoint vec[4] = {
		v[1] - v[0],
		v[2] - v[1],
		v[3] - v[2],
		v[0] - v[3],
	};
	
	CCPoint vecP[4] = {
		v[0] - glPos,
		v[1] - glPos,
		v[2] - glPos,
		v[3] - glPos,
	};

	// 外積計算 求めた外積の向きが揃っていれば点は内包されている
	// （この例の場合は正方向に揃っていれば内包されている）
	for( int i=0; i<4; i++ ) {
		if( (vec[i].x * vecP[i].y - vec[i].y * vecP[i].x) < 0 ) {
			return false;
		}
	}
	
	return true;
}
```

# Appendix1
CCSpriteにはgetQuad()というメソッドもあり、これでも変換前の頂点座標を取得できますので、上記のgetContentSizeの部分は下記のように置き換えることも可能です。

```objc
	ccV3F_C4B_T2F_Quad quad = sprite->getQuad();
	CCPoint v[4] = {
		ccp( quad.bl.vertices.x, quad.bl.vertices.y ),
		ccp( quad.tl.vertices.x, quad.tl.vertices.y ),
		ccp( quad.tr.vertices.x, quad.tr.vertices.y ),
		ccp( quad.br.vertices.x, quad.br.vertices.y ),
	};
```

ただし、冒頭で紹介したboundingboxの計算などには、getContentSize()で取得できる、m_obContentSizeの値が使われています。getContentSizeが使えない場合は代用出来る気がします、が試してはいません。

# Appendix2
Cocos2d-xにはCC_SPRITE_DEBUG_DRAWというdefineがあり、これを有効にすることでスプライトの描画矩形のラインを描画してくれます。boundingboxで取得できる矩形をこのCC_SPRITE_DEBUG_DRAWで描画される矩形に変換して判定しようとすると結構手間がかかりますが、上記の方法を使うとCC_SPRITE_DEBUG_DRAWで描画される矩形と同じ領域でタッチ判定が可能です。

# Appendix3
上記のサンプルでは外積計算のみを判定に使用していますが、スプライトが大量にある場合は処理を高速にするため、外積計算の前にもっと単純な円や矩形での判定をすると良いです。
adbコマンドが実行出来るようになるまで


## 1. SDKのダウンロード
http://developer.android.com/sdk/index.html

こちらからダウンロードして、同じフォルダに解凍します。

## 2. アプリケーション以下に配置

```sh
$ cd ~/Downloads
$ mv adt-bundle-mac-x86_64-20131030 android-sdk
$ mv android-sdk /Applications/
```

※adt-bundle-mac-x86_64-20131030というファイル名は適宜変更してください。

## 3. パスの追加
- bashの場合

```sh
echo 'export PATH="$PATH:/Applications/android-sdk/sdk/platform-tools"' >> ~/.bash_profile
```
- zshの場合

```sh
echo 'export PATH="$PATH:/Applications/android-sdk/sdk/platform-tools"' >> ~/.zshrc
```

## 4.ためす
1. apkファイルがあるフォルダに移動

```sh
adb install ./hogehoge.apk
```

## Good Android Life!
scriptタグの位置でもやもや


# きっかけ

[HTML5 Professional Certification　HTML5プロフェッショナル認定試験 | 多くの企業が推進する次世代Web言語の認定資格 | LPI-Japan](http://html5exam.jp/)

こんなのあるのかー、アニメーションとかぐりぐりすごいなー
とか思っておもむろにソースを開いてみんです。
そしたらscriptタグが全部headにあるのね。

いまどきはbody末尾に書くのがスタンダードなんでしょうけど、さすがに試験とかのサイトになるとセマンティック重視しないといけないから、なのかな。
いや、だからといって別に重かったりするわけじゃないしいいんだけど。
というか私だってできればhead内に書きたいですし。。。

# deferが使えれば。。。

>script要素にdefer属性をつけると、コンテンツの表示が終わったあとに、そのJavaScriptを実行するようになります（正確にはDOMContentLoadedイベントの前になります）。そのため、body要素の最後にscript要素を記述したコードとほぼ同じ結果になりますが、ファイルの読込みは非同期で行われるため、こちらのほうが若干早くなる可能性があります。
*via [ユーザーの体感速度を高めるためのJavaScriptチューニング（前編） | HTML5Experts.jp](http://html5experts.jp/yoshikawa_t/877/)*

非同期なので読み込み順がバラバラ
↓
依存関係ないやつだけ使う？
↓
jQueryむりじゃん。。。
↓
＼(^o^)／ｵﾜﾀ

# 結論
sync defer欲しい

## memo

この件とはちょっとずれるけど
HTML5のリファレンスに以下の記述を発見

>スクリプトから挿入された script 要素は、async がデフォルトでは true となりました。false をセットして、挿入順にスクリプトを実行させることも可能です。
*via [W3C - 『HTML 5 differences from HTML 4』日本語訳 - HTML5.JP](http://www.html5.jp/trans/w3c_differences.html)*

scriptが動的に挿入される場合は非同期がデフォルトになったみたい。

# 参考
[scriptのdefer/asyncを理解し、ページの高速化方法を探る | ゆっくりと…](http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/how-to-use-script-defer-and-async-for-performance-enhancement/)
[HTML5のscript要素でasync, deferを使ってパフォーマンスアップ - IT-Walker on hatena](http://d.hatena.ne.jp/Syunpei/20091006/1254791382)
[HTML5でJavaScript,jQueryを高速読み込みする| アイディア・ボード](http://ideabb.jp/fast-road-javascript-on-html5)
iOS標準クラスを解体する(ARC対応版)


謎のバグが出た時って、標準SDKのクラスがどういう状態にあるか知りたいじゃないですか。そんな時は、Objective-Cの柔軟さを生かしてインスタンス変数をのぞき見しちゃいましょう。

※typeEncodingをちゃんと検査すれば、どんなクラスにも対応出来るバージョンを用意出来ると思いますが、僕はそこまで必要なかったので以下の様にしています。

```AKNViewController.m

#import <objc/runtime.h>

- (void)makeLoveWithObjc
{
    UICollectionView *collectionView = /* YOUR CODE */;
	
    unsigned int varCount;
    Ivar *ivars = class_copyIvarList([UICollectionView class], &varCount);
    for (int i = 0; i < varCount; i++) {
        Ivar ivar = ivars[i];
        const char* name = ivar_getName(ivar);
        const char* typeEncoding = ivar_getTypeEncoding(ivar);
        if( strcmp(name,"_collectionViewFlags") == 0 ){
            NSLog(@"%s: %s", name, typeEncoding);
        }else{
            id var = object_getIvar(collectionView, ivar);
            NSLog(@"%s: %@", name, var);
        }
    }
    free(ivars);
}
```

## 参考

- [Objective-C Runtime Reference](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html)
- [class - How do I list all fields of an object in Objective-C? - Stack Overflow](http://stackoverflow.com/questions/1213901/how-do-i-list-all-fields-of-an-object-in-objective-c)
autosizeの上限を指定する方法

[jQuery Autosize](http://www.jacklmoore.com/autosize/)を使って、入力に合わせてテキストエリアを自動拡大しているのですが、普通にしていると、どこまでも拡大してしまい不便です。

jQuery Autosize側でオプション指定出来ないかと思って調べたのですが、どうやら無いみたいです。

どうやって解決するかというと、CSS側で
`<textarea id='konishi'>`

だとすると

```html
#konishi{
  max-height: 200px
}
```

と指定してあげれば解決です。

当たり前すぎることだったらすみません。
一人でBoost勉強会:Concept Check #1

Note for Boost Concept Check Library (BCCL)
===========================================

- [本家ドキュメント(v1.55)](http://www.boost.org/doc/libs/1_55_0/libs/concept_check/concept_check.htm)
- [日本語ドキュメント(v1.30)](http://boost.cppll.jp/BDTJ_1_30/libs/concept_check/concept_check.htm)
- [Reference (v1.55)](http://www.boost.org/doc/libs/1_55_0/libs/concept_check/reference.htm)

以下の記述は公式のドキュメントを自分なりに要約した物であり、
和訳を目指す物ではない。
また内容を保証するものでもない。

Index
- **#1 Concept Checking Introduction**
- [#2 Using Concept Checks](http://qiita.com/termoshtt/items/8e91c50dbf299376442f) 
- #3 Creating Concept Checking Classes
- #4 Concept Covering and Archetypes


Concept Checking Introduction
-----------------------------

### Conceptが必要な理由

- 間違ったテンプレート引数によるコンパイルエラーが非常に難読である。その間違ったテンプレート引数使用された位置でなく、
  ユーザーが見る必要のない、テンプレート実装の内側でエラーが発生したように見える。
- コンパイルを実行してみない事には、不完全で曖昧な事が多いドキュメントでしか、
  そのテンプレート引数に必要な条件を知る事ができない。
- ドキュメントのテンプレート引数の条件が不十分かもしれない、
  つまりドキュメント通りに実装してもエラーになるかもしれない。
- ドキュメントのテンプレート引数の条件が本当に必要とされているよりも厳しすぎるかもしれない。
- Concept names in code may drift out-of-sync with the documented requirements. (意味がわからない)

要は、テンプレート引数の条件(requirements)が正確に記述できないのと、
テンプレートを使用した場合のエラーをもっと見易くしようという2点。

### Boost.Conceptが提供する機能

- コンパイル時にテンプレート引数をチェックする機構をテンプレートを使用した部分に導入
- コンセプトを満しているか(specifying concept)をチェックするフレームワーク
- コンセプトがテンプレート実装を *cover* しているかをチェックする機構、
  つまりコンセプトを満していればテンプレート実装がエラーにならない事を保証する機構。
- C++標準ライブラリで使用するコンセプト群
- 次期C++で提案されているコンセプト用のシンタックスの代替
s3に配置されている大きなデータをrails経由でストリーミングダウンロードする

rails paperclip aws/s3の構成はよくあるパターンだと思います。

gemのpaperclipを画像だけでなくzipファイルやcsvファイルの配置に利用しました。

そこででっかいファイルをダウンロードするには以下の数パターンあります。

1. x-sendfileでnginx,apacheを利用
2. s3のurlへredirect
3. s3のファイルをrails経由でstreamで吐き出す。

1,2の参考
http://thewebfellas.com/blog/2009/8/29/protecting-your-paperclip-downloads
2の参考
https://github.com/thoughtbot/paperclip/wiki/Restricting-Access-to-Objects-Stored-on-Amazon-S3

今回は背後にs3が居ることを悟られたくない、大きいファイルがあることから
1のx-sendfileを選択しましたが、実験的に3のrails経由のstream出力を調査してみました。

サンプル

```ruby:/app/models/big_file.rb
class BigFile < ActiveRecord::Base
  # paperclip
  has_attached_file :data,
    storage: :s3,
    s3_credentials: "#{Rails.root.to_s}/config/s3.yml",
    s3_permissions: :private,
    url: "/system/:class/:attachment/:id/:filename" #styleは不要
end
```

controllerでは以下のように利用したいと思いました。

```ruby:/app/controllers/big_files_controller.rb
def download
  @file = BigFile.find(params[:id])
  # @file.nameは拡張子付きだと仮定　この辺は実装する方にお任せ
  render s3: @file.data, filename: "#{@file.name}"
end
```

もちろんrender :s3とか存在しないので作成します。
作成時に以下のサイトを参考にしました。
http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html

```ruby:/config/initializers/s3_renderer.rb
ActionController::Renderers.add :s3 do |obj, options|
  gc_interval = options[:gc_interval] || 500
  filename = options[:filename]

  s3_object = obj.s3_object
  content_type = s3_object.content_type

  self.response.headers["Content-Type"] ||= content_type
  self.response.headers["Content-Disposition"] = "attachment; filename=#{filename}"
  self.response.headers["Content-Transfer-Encoding"] = "binary"
  self.response.headers["Last-Modified"] = Time.now.ctime.to_s

  self.response_body = Enumerator.new do |y|
    i = 0
    obj.s3_object.read do |chunk|
      i += 1
      y << chunk
      GC.start if i % gc_interval == 0
    end
  end
end
```

ローカル開発環境でwebrickを利用している人はストリーミングダウンロードが行われません。
unicornやpuma当たりを利用して開発時に試してみた方が良いです。

もし本番環境で利用する場合はstreamingができるように設定が必要です。
passengerで有れば以下のように設定したら行けると思います。

```apache:/etc/httpd/test.conf
ほげほげ
..
.

<VirtualHost *:80>
   ServerName test.test.com
   DocumentRoot /home/hoge/piyo/current/public
   PassengerBufferResponse off # これが必要
   <Directory /home/hoge/piyo/current/public>
      AllowOverride all
      Options -MultiViews
   </Directory>
</VirtualHost>

```

使ってみた感じでは、
普通にs3のurlを渡してあげた方が良いです。
何より面倒じゃないです。

セキュリティ上ほかのURLがどうしても知られたくないとか、s3を利用していることを知られたくない場合はx-sendfileを利用するか、設計から考え直した方が良いかと思います。
シミュレーション波形の分布をプロットする。

```matlab

cd /opt/workspace/ridge/hpc

filelist = {'TKsnburst','TK11-B12X1B10','TK11-B12X5B01','TK11-B12X5B10','TK11-B12X20B01','TK11-B12X20B10'};

filelist = {'KRD_SN_3DGR_R000_eq','KRD_SN_3DGR_R000_pol','KRD_SN_3DGR_R0pi_eq','KRD_SN_3DGR_R0pi_pol','KRD_SN_3DGR_Rpi2_eq','KRD_SN_3DGR_Rpi2_pol'};

filelist = {'KTK_S11.2_eq','KTK_S11.2_pol','KTK_S15.0_eq','KTK_S15.0_pol'};

filelist = {'KTK_S27.0_eq','KTK_S27.0_pol','KTK_S40.0_eq','KTK_S40.0_pol'};

filelist = {'KKsnburst_eq_10kpc','KKsnburst_pol_10kpc','KKsnburst_eq_10kpc_2','KKsnburst_pol_10kpc_2'};

nf = length(filelist);


for idx = 1:4
	fname = filelist{idx};
	load([fname,'.mat']);
	subplot(2,4,2*idx-1)
	hist (hpc.hplus,50);
	eval(sprintf('title(\''%s h+\'',\''FontSize\'',12)', fname));
	set(gca,'xticklabel',[]);set(gca,'yticklabel',[])
	subplot(2,4,2*idx)
	hist (hpc.hcross,50);
	eval(sprintf('title(\''%s hx\'',\''FontSize\'',12)', fname));
	set(gca,'xticklabel',[]);set(gca,'yticklabel',[])
end


plotfilename = 'KTK3_hist';
print('-depsc',plotfilename); 

```
Google wallet販売アカウントでAn error occurred {"type":"PLATFORM_ERROR", "payload":"0"}が発生し登録出来なかった時の話

Google Playから販売者アカウントを設定しようとしたときに、
販売者アカウントの作成を行い、最期に送信を行うと、

 An error occurred {"type":"PLATFORM_ERROR", "payload":"0"}

というエラーが下に表示され、先に進まなくなった。
また、再読み込みなどをすると、上部に「エラーが発生した」という旨のメッセージが表示されるようになった。

javascriptコンソールを開いてみると、どうもcheckout.google.comとwallet.google.comでドメインが違うみたいなエラーが出ていた。
(メッセージを控えていなくてうろおぼえです)


解決作としては、ChromeではなくFirefoxで登録を行った。
# あのC拡張で書かれた超高速なPHPフレームラークPhalconに2.0.0が！！

前々から気づいてたけど、手をつけてなかったphalconを使い始めました！

> Phalcon は、ハイパフォーマンス で少ないリソース消費のC拡張として実装されたWebフレームワークを提供します

と、公式サイトに書かれているがタシカニ早い
さすが、C拡張で書かれて、PHPのコードが一つもない
PHP用フレームワーク

<iframe src="//player.vimeo.com/video/63022489" width="500" height="313" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> <p><a href="http://vimeo.com/63022489">Tutorial - Creating a Poll application in 15 minutes with Phalcon</a> from <a href="http://vimeo.com/phalconphp">Phalcon Framework</a> on <a href="https://vimeo.com">Vimeo</a>.</p>

入れてみたけど、タシカニ早いです！
今度パフォーマンス計測してみたいです

更に、phalconは現在v1なのですが、
githubで2.0.0が公開されています。

今はossとして公開して、version up中なのかな

phalcon 2.0.0導入手順は

```
git clone https://github.com/phalcon/cphalcon.git
git checkout 2.0.0
cd ext
sudo ./install-test
```

です。

色々触ってみようー
Node.js+Express+Passportで認証情報をセッションに保存する方法


公式のドキュメント見ながら実装したら、ちょっとつまずいたのでメモしておきます。

## やりたいこと

passportを使って、facebookやtwitterでauth認証をして、取得した値をセッションに保持したい。

## 環境

- Node.js (0.10.25)
- Express (3.4.8)
- passport (0.2.0)

## passportについて

passportはnode.jsでauth認証を実装するためのモジュールです。
なんと140以上のサービスのauth認証に対応しているとか。
node.jsでauth認証をするモジュールとしては、他にoauthとかがありますが、ドキュメントがほとんどが無いので、機能・情報ともに充実しているpassportがオススメです。

## 実装

認証機能の実装自体はPassportの公式サイトの[Guide](http://passportjs.org/guide/)を参照してください。
ほぼコピペでできます。

ただセッションに値をセットする方法が、少し分かりにくかったので以下に記載します。

通常Expressではセッションに値をセットするとき、以下のようにしますが、

```
exports.hoge = function(req,res){
    req.session = hogehoge;
};
```

passportを使うとコールバック関数でリクエストを処理をするので、req変数にアクセスする方法が分かりませんでした。

```
// 以下はGuideのサンプルをコピペ

passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "http://www.example.com/auth/facebook/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    User.findOrCreate(..., function(err, user) {
      if (err) { return done(err); }
      done(null, user);
    });
  }
));
```

このとき、`passport.serializeUser`メソッドを使って値をセットできます。
上のソースコードのdoneで渡したuserが、passport.serializeUserの第一引数のuserです。

```
passport.serializeUser(function(user, done) {
  done(null, user.id); // user.idをセット
});
```

セットされた値は、`req.session.passport.user`に入るため、次回以降のアクセスで値を参照することができます。

ちなみに、以下のように書いてしまうと`req.session.passport`に何も値が入らなかったので注意しましょう。

```
passport.serializeUser(function(user, done) {
  done(null, user); // 何も入らない
});
```
fluentdで出力したログの一部を文字列から数値に変換する


以前、[nginxのログをLTSV形式で出力して、fluentd経由でMongoDBに保存する](http://qiita.com/key/items/038b7913b3bb0298c625)の作業を実施したとき、ログの値がすべて文字列で保存されることに気付きました。

例えば、

* status
* bytes_sent
* body_bytes_sent
* request_time
* upstream_response_time

は、ストレージの省スペース化や検索インデクスのために`int`または`float`で保持するのが望ましいです。

HTTPステータスコードで正常なリクエストのみを対象とするには200番台に絞り込む必要があり、MongoDB上では次のようなクエリで検索することが出来ます。

```mongo
> db.nginx_access.find({status: {"$gte": 200, "$lt": 300}})
```

しかし、文字列で保存されている場合は大小で比較することが出来ないので、文字列の先頭一致で検索する必要が出てきて面倒なことこの上ありません（クエリは割愛）。

fluentdにプラグインを追加して型変換を行うことで回避できます。型変換には[fluent-plugin-typecast](https://github.com/tarom/fluent-plugin-typecast)を使います。td-agent利用時に`fluent-plugin-typecast`をインストールするには次のようにします。

```bash
/usr/lib/fluent/ruby/bin/fluent-gem install fluent-plugin-typecast
```

`fluent-plugin-typecast`をインストールすると、fluentdの`type`に`typecast`パラメタが使えるようになります。`item_types`に、ログのキーと変換後の型をコロンでつなぎ、複数ある場合にはカンマで区切って列挙します。

先のパラメタをinteger, floatに変換するには次のようにします。

```ruby
<match nginx.access>
  type typecast
  item_types size:integer,status:integer,request_time:float,upstream_response_time:float,bytes_send:integer,body_bytes_send:integer
  tag filtered.nginx.access
</match>
```

変換後のログは`filtered.nginx.access`というタグをつけて処理します。

```ruby
<match filtered.nginx.access>
  type copy

  <store>
    type mongo
    host 127.0.0.1
    database server-log
    collection nginx_access_log
  </store>
</match>
```

出力されたログを確認してみます。

```js
{
  "_id" : ObjectId("53199b97b24cd85a6100004e"),
  "remote_addr" : "xxx.xxx.xxx.xxx",
  "request_method" : "GET",
  "request_length" : "1607",  // あっ
  "request_uri" : "/ajax/mypage",
  "https" : "",
  "uri" : "/ajax/mypage",
  "query_string" : "",
  "status" : 200,
  "bytes_sent" : 480,
  "body_bytes_sent" : 95,
  "referer" : "",
  "useragent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36",
  "forwardedfor" : "xxx.xxx.xxx.xxx",
  "request_time" : 0.087,
  "upstream_response_time" : 0.087,
  "time" : ISODate("2014-03-07T10:11:34Z")
}
```

`status`や`request_time`が数値型になってますね!!!

めでたしめでたし。
JavaでFizzBuzzする環境を整える。


- javaは既に入ってた。
- maven入れる。

```Bash:
brew install maven
```

- プロジェクト作る

```Bash:
mvn archetype:generate
```

archetypeはプロジェクトの形式。
今回はとりあえず動かせればいいので *maven-archetype-quickstart*

groupIdはプロジェクトの識別子。公開しないならなんでもいい。
artifactIdはプロジェクトの名前。ディレクトリ名になる。

```Bash:こんなかんじのディレクトリ構成になった。
[masato@mba] $ tree
.
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── test
    │           └── App.java
    └── test
        └── java
            └── test
                └── AppTest.java

7 directories, 3 files
```

- FizzBuzzを書く

```Java:src/main/java/test/FizzBuzz.java
package test;

public class FizzBuzz {
	public static void main(String[] args) {
		String val = null;
		for(int i=1; i<100; i++) {
			if (i%15 == 0) {
				val = "FizzBuzz";
			} else if (i%3 == 0) {
				val = "Fizz";
			} else if (i%5 == 0) {
				val = "Buzz";
			} else {
				val = String.valueOf(i);
			}

			System.out.print(val);
			System.out.print(" ");

		}
	}
}
```

- コンパイルして実行

```Bash:
 mvn compile
 java -classpath target/classes test.FizzBuzz
```