OmniAICreator/Qiita-1.07M huggingface dataset:
Cocos2d-x のアップストリームを追いかけるアプリケーションの作成手順

# はじめに
アップストリームを追いかける cocos2d-x アプリケーションの具体的な作成手順になります。

アップストリームは上流という意味で、本家 Cocos2d-x の [git リポジトリ](https://github.com/cocos2d/cocos2d-x
)を追いかけるアプリケーションを作ります。

アップストリーム開発についての特徴、利点の詳細は Linux Foundation が公開しているホワイトペーパー[『オープンソースにおけるアップストリーム開発の意義 』](http://www.linuxfoundation.jp/publications/linux-foundation/upstreaming-strengthening-open-source-development) が参考になります。

# 前提
Cocos2d-x の開発環境が構築済みとします。

各プラットフォームの開発構築手順は下記を参考にしてください。
http://cocos2d-x.org/programmersguide/A/

Android のビルドは ccache の導入がおすすめです。
[Android NDK で ccache を有効にする。](http://qiita.com/TNaruto/items/cfbc52e3bb8046bc9337)

# 目的
以下を目指します。

- アップストリームを追いかけられるアプリケーション作成
- バージョンを気軽に変更できるアプリケーション作成

# 環境構築
bootstrap となる cocos2d-x を clone します。

```bash
mkdir -p ~/projects ; cd !$
git clone git@github.com:cocos2d/cocos2d-x.git
pushd cocos2d-x
git submodule update --init --recursive
./setup.py
source ~/.bashrc (or ~/.zshrc)
popd
```

以上で複数の cocos2d-x アプリケーションを管理できる環境の構築は完了です。

# アプリケーション作成
bootstrap cocos2d-x を利用して cocos2dapp のアプリケーションを作成します。

```bash
cocos new -p com.example.cocos2dapp --ios-bundleid com.example.cocos2dapp --portrait -l cpp cocos2dapp
Running command: new
> Copy template into /home/naruto/projects/cocos2dapp
> Copying cocos2d-x files...
> Rename project name from 'HelloCpp' to 'cocos2dapp'
> Replace the project name from 'HelloCpp' to 'cocos2dapp'
> Replace the project package name from 'org.cocos2dx.hellocpp' to 'com.example.cocos2dapp'
> Replace the Mac bundle id from 'org.cocos2dx.hellocpp' to 'com.example.cocos2dapp'
> Replace the iOS bundle id from 'org.cocos2dx.hellocpp' to 'com.example.cocos2dapp'
> Modify files by re.sub()
```

アプリケーションの cocos2 ディレクトリを削除して、cocos2d-x リポジトリをサブモジュール化します。

```bash
cd cocos2dapp
rm -rf cocos2d
git init
git add
git submodule add -f git@github.com:cocos2d/cocos2d-x.git cocos2d
pushd cocos2d
git submodule update --init --recursive
./download-deps -r yes
popd
git commit -m 'init'
```

以上でバージョン変更可能なアプリケーションが作成が完了です。

# cocos2d-x バージョンアップ変更方法
## 最新(アップストリーム)を追いかける
v3 ブランチの最新を追いかける方法は以下の通りです。

```bash
cd cocos2d
git checkout v3
git pull origin v3
git submodule update --init --recursive
./download-deps -r yes
```

## バージョンを指定する
バージョン指定はバージョンタグを checkout します。
以下は v3.8 を利用する例です。

```bash
cd cocos2d
git fetch origin
git checkout cocos2d-x-v3.8
git submodule update --init --recursive
./download-deps -r yes
```

TODO:  バージョン変更に伴うアプリケーション側の修正方法については調査中です。(.cocos-project.json とか)
今のところ(v3.8.1 時点)、アプリケーション側の修正なしで、バージョンの変更できています。

# bootstrap cocos2d-x のバージョンアップ
bootstrap の cocos2d-x は定期的に同期してください。
cocos2d-x の新バージョンのリリース毎に更新するのがおすすめです。

```bash
cd ~/projects/cocos2d-x
git pull origin v3
git submodule update --init --recursive
```

# 解説
アプリケーションの cocos2d ディレクトリは実質 cocos2d-x をコピーしたものですので、新しく作ったアプリケーションの cocos2d を削除し、git サブモジュールと差し替えました。

非常に簡単な手続きですが、これだけでアプリケーションの利用する cocos2d-x のバージョンが簡単に変更できるようになります。
バージョン変更時の cocos2d-x の git サブモジュールの更新とサードパーティライブラリバイナリの更新は結構面倒ですが、それはお作法ということで。
virtualenv で環境を隔離したのに pip list で大量のパッケージが出る

# 問題
virtualenv, direnv などで環境を隔離したのに、

```
pip list
```

を実行すると、大量のパッケージ (=システムの pip installed packages) が出てくる。


# 解決策
今回の場合は、`PYTHONPATH` に、 /usr/lib/python2.7/dist-packages が入っていた。
つまり、direnv, virtualenv で隔離された pip といえど環境変数の影響は受けるので、

```
echo $PYTHONPATH
```

を実行して、変なパスが入っていないか確認するとよい。
というのが教訓
ClojureでFizzBuzzを書いてみる

1年前くらいにちょっとかじっていたClojureを最近めっきり書いてなくて、いまからもう一度やろうと思うと完全に忘れてしまっていた。
これから年末にかけて少しづつClojureの修行するつもりなので、練習がてらまずFizzBuzzを書いてみた。

```clj
(ns programming-clj.fizzbuzz)

(defn whole-number
  []
  (iterate inc 1))

(defn fizzbuzz-filter
  [x]
  (cond
    (= (rem x 15) 0) "fizzbuzz"
    (= (rem x 5)  0) "buzz"
    (= (rem x 3)  0) "fizz"
    :else x))

(defn start
  [x]
  (take x (map fizzbuzz-filter (whole-number))))

(start 30) 
;=> (1 2 "fizz" 4 "buzz" "fizz" 7 8 "fizz" "buzz" 11 "fizz" 13 14 "fizzbuzz" 16 17 "fizz" 19 "buzz" "fizz" 22 23 "fizz" "buzz" 26 "fizz" 28 29 "fizzbuzz")
(start 15)
; => (1 2 "fizz" 4 "buzz" "fizz" 7 8 "fizz" "buzz" 11 "fizz" 13 14 "fizzbuzz")

```
SeleniumでローカルのHTMLファイルを呼び出す


```ruby:

driver = Selenium::WebDriver.for :firefox

driver.get('file:///呼び出したいHTMLのパス')

```

`file:///`をつけることでいけた。

# 参考

[java - How to use selenium webdriver on local (on my pc) webpage instead of locate somwhere on www? - Stack Overflow](http://stackoverflow.com/questions/17972885/how-to-use-selenium-webdriver-on-local-on-my-pc-webpage-instead-of-locate-somw)
Slack integrationを使って、ブラウザからGoogleCalenderタブもニフラムする

# 今回のアウトプット

chromeのタブからGoogleCalenderを消し、
![image](https://qiita-image-store.s3.amazonaws.com/0/83135/beb86ed7-2527-652a-7487-ad87c92587a8.png)

SlackのPrivateGroupに予定を通知させて予定忘れを防ぎます！
![image](https://qiita-image-store.s3.amazonaws.com/0/83135/41d4a713-4168-c071-5200-29a89807b468.png)


# 前提

- 社内コミュニケーションの100%がslackに移行したものの、MTGのスケジューリングは相変わらずGoogleCalenderでやっている、、、みたいな方は多いのでは？
- だけどGogleCalender常時はタブにおいておかないからだいたい消す→良くMTGを忘れる‥→結局GoogleCalender常駐…重い、みたいなのを解決します。


# 事前準備

- [こちら](http://qiita.com/Yamotti/items/6034619e80254fe77933)の記事にあるように、自分+Botだけが存在するprivate group（PG）を作成しておきましょう。

# 手順

- `Slack`>`configure integration`>`Google Calender`を選択![image](https://qiita-image-store.s3.amazonaws.com/0/83135/e9611c14-8f4f-000e-a333-814bad556d96.png)

- connectしよう
![image](https://qiita-image-store.s3.amazonaws.com/0/83135/570f372e-6b58-f792-4b28-30e7c209647d.png)

- 通知したいCalenderと通知させたいSlackのPrivateGroupを選ぶだけ![image](https://qiita-image-store.s3.amazonaws.com/0/83135/f4bb24e1-5a8b-230c-f32a-e55c48995a30.png)

以上で基本設定は完了。

- 予定のx分前に通知する
- カレンダーを作ったら通知する
- その日の全予定を毎日x時に通知する

など、細かい運用設定ができます。

# コメント

- これを使うことでCalenderのタブは自分が予定を創る時だけ開くようになりました。
- 予定作成もSlackで完結できるはず。いずれやりたいです。
[Android]作ったHttpClientを利用してポーリングクラスを作ってみた

[[Android]AndroidHttpClientがNGになっていたので、HttpURLConnectionでアクセスしてみた](http://qiita.com/manbo34/items/2a463ffe44c6cec4cb33)

上記で作成したHttpクライアントを利用して、
ポーリングクラスを作成しました。
プッシュ通信などがある昨今で今更なクラスですが。。。

今回はRxAndroidおよびRetrolambdaを利用してコードを書いているので注意してください。

```HttpPollingClient.java
    private HttpClient client = new HttpClient();
    private String url = "";
    private Action1<String> action = param1 -> {};

    public HttpPollingClient(String url, Action1<String> event){
        this.url = url;
        this.action = event;
    }

    private Thread thread = null;
    private boolean isPlay = false;
    public void start(long waitTime) {
        isPlay = true;
        thread = new Thread(() -> {
            while (isPlay){
                exe();
                try{
                    Thread.sleep(waitTime);
                }
                catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }

    public void exe(){
        String pageData = client.get(url);
        action.call(pageData);
    }

    public void stop(){
        new Thread(() -> {
            stopSync();
        }).start();
    }

    public void stopSync(){
        isPlay = false;
        if (thread == null){
            return;
        }
        
        while (thread.isAlive()){
            try{
                Thread.sleep(waitTime);
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}
```

コンストラクタを作成する際に、ページの取得後に動作させるイベントを登録してください。

```
//使い方
HttpPollingClient client = new HttpPollingClient("http://localhost:8080/index.html", HttpPollingClient("", (page) -> Log.i("TAG", page)));

// ポーリング開始
client.start();
.
.
.
// ポーリング停止
client.stop();
// 停止の同期をとりたい場合
client.stopSync();
```
リモートブランチが削除できない時に関して


1 削除したいリモートブランチを確認

```
$ git branch --remote

origin/master
sqale/master <=コレを削除したい
```

2 リモートブランチを削除

```
$ git push --delete sqale master
```

結果 出来ない、、なんで？？

```
Sorry, but this application is no longer available.
fatal: Could not read from remote repository.

ごめんだけど、このアプリはもう利用出来ないよ.
致命的なエラー情報: このリモートリポジトリは読み込め無いよ

Please make sure you have the correct access rights(アクセス権)
and the repository exists.

正しいアクセス権を持っていることと、
リポジトリが存在することを確認してください
```

ログレベルに関して

```
logger.fatal "致命的なエラー情報"
logger.error "エラー情報"
logger.warn  "警告情報"
logger.info  "お知らせ情報"
logger.debug "デバッグ情報"
```

3 コマンドの変更を行なう。

```
$ git branch --remote -d sqale/master
```

結果

```
Deleted remote-tracking branch sqale/master (was 47fecd6).
```

成功!!
Objective-C 中的 Class Variable


Objective-C 中其實沒有 class variable 這種東西，不過可以透過存取 C 的 static variable 來達成這個目的。

## 運用的背景

當在寫一個 service object/class 或是 manager 的時候，並不是都需要初始化一個 singleton （單例）的 sharedManager 之類的擺在那邊。

像是寫公司服務內部的 API service 的時候，需要存 API key 或 application name 等等，我並不想要在初始化一個 NSObject 之類的物件，只是拿來存這些字串。我只是想保留這些資訊、接著透過幾個 class methods 來存取就好。

## 實作

這邊會示範如何建立一個這種機制。

### 建立一個殼

首先可以先建立一個繼承自 `NSObject` 的物件，然後寫一組可以存取的 method ：

``` objc:MyManager.h
#import <Foundation/Foundation.h>

@interface MyManager : NSObject

+ (void)setAPIKey:(NSString *)APIKey;
+ (NSString *)APIKey;

@end
```

接著先加入 class method 的殼

``` objc:MyManager.m

#import "MyManager.h"

@implementation MyManager

+ (void)setAPIKey:(NSString *)APIKey {
}

+ (NSString *)APIKey {
  return nil; 
}

@end
```

### 加入 methods 的實作

這時候，只要在實作檔裡面加入一個 static variable 即可，變數可隨意命名。

我在這裡會習慣把 private 的變數命名成容易辨別的名稱，前面再加底線方便辨識。

``` objc:MyManager.m

#import "MyManager.h"

static NSString *_APIKey;

@implementation MyManager

+ (void)setAPIKey:(NSString *)APIKey {
  _APIKey = APIKey
}

+ (NSString *)APIKey {
  return _APIKey; 
}

@end
```

## 成果

這樣，在引入 `MyManager.h` 之後，就可以不用透過初始化 MyManager 的情形下，直接存取 `APIKey` 了。

``` objc:SomeClass.m

#import "MyManager.h"

@implementation SomeClass

- (void)someMethod {
  [MyManager setAPIKey:@"abc123"];
  NSLog(@"APIKey: %@", [MyManager APIKey]);
}

@end

```

試試看吧～！

如果有內容上的錯誤或是疑問，歡迎在下面留言討論 :smile:
[Android]AndroidHttpClientがNGになっていたので、HttpURLConnectionでアクセスしてみた

AndroidHttpClientを利用しようとすると利用してはいけないと怒られてしまうので、
HttpURLConnectionを使ってHttp通信を行いました。
今回はヘッダー領域はいらないのでページの内容だけを取得するクラスです。

参考：
Android’s HTTP Clients
http://android-developers.blogspot.jp/2011/09/androids-http-clients.html

HttpURLConnectionを使用してHTTP通信を行う
http://techbooster.jpn.org/andriod/application/6812/

```HttpClient.java
public class HttpClient {
    private HttpURLConnection connection = null;

    public String get(String url){
        String pageData = "";
        try {
            URL u = new URL(url);
            connection = (HttpURLConnection)u.openConnection();
            connection.setRequestMethod("GET");
            connection.setInstanceFollowRedirects(false);
            connection.connect();

            InputStream is = connection.getInputStream();
            pageData = // ストリームの内容を転記;
            is.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return pageData;
    }
}
```

URLやHttpURLConnectionのインスタンスを再利用できないかあれこれ頑張ろうとしましたが、
少なくともHttpURLConnectionはインスタンスの再利用はできないようです。
それと非同期でないため注意してください。

```
// 使い方
HttpClient client = new HttpClient();
String page = client.get("http://localhost:8080/index.html")
```
Android公式エミュレーターの罠　Nexus7 2013年モデル編

# 罠
AndroidStudioに付属するエミュレーター(Android Virtual Device Manager)からNexus7 2013年モデルのVMを作る際にresolutionが仕様と違うものに勝手に変換される

![android vm.png](https://qiita-image-store.s3.amazonaws.com/0/90216/05e30157-8e6c-0959-c4bd-319853899a8d.png)
画像の上の行が正しく作成されたもので、下の行が普通に作るとできる罠VM
両方xhdpiと書いてあるが、 **罠VMはxhdpiじゃない** のでレイアウトの確認に使えない

# 解決方法
- 新規VMを登録する画面で右ペインの下の方にある Clone Device... を選択する
- 何も変えずに保存
![device_list.png](https://qiita-image-store.s3.amazonaws.com/0/90216/952d80f8-5386-b665-8c0a-382c61202ad4.png)

この方法で作ったハードウェアプロファイルを使えば正しい解像度のエミュレーターが得られます

# 追記
Nexus10にも同じ罠があるみたいなので気をつけよう
c++ builder / Sublime Text 2 > 名前を変更できません > Sublime Textを終了すると解決した > Trailing Spacesパッケージがファイル保持しているようだ

```txt:動作環境
Windows 7 pro 32bit
C++ Builder XE4
Sublime Text 2
```

C++のソースファイルをC++ BuilderとSublime Text2両方で編集している（入力補完であったり、syntax highlightなどそれぞれの使いやすい機能を使うため）。

最近、この状態でC++ Builder側でソース保存しようとしたところ、以下のエラーが出るようになった。

```
...Unit1.cppから...Unit1.cpp.~4~に名前を変更できません。
```

###対処法

上記エラーが出た時、Sublime Textを終了するとエラーが出なくなる。
Sublime Text側で変にファイルを保持していてしまっているのだろうか?

最近、Subilme Text側で変更したのは、「Trailing Spaces」というパッケージを入れたことだが、これが関係するのだろうか。。。

試しにTrailing Spacesパッケージを取り除いたらエラーが出なくなった。
0から始めるために、OpenGL、WebGL、three.jsについてのざっくりすぎる解説

OpenGLとは？
====

- 3Dグラフィックを高速に描画できるAPI
- C言語のほか、Javaなどの言語に移植されたものがある

何で高速なのか？
----

- 行列計算とか難しい計算を専用のプロセッサ（GPU）で計算してくれる
- CPUからビデオデバイスに送るデータを最小限にできる

同列の技術
----

- DirectX
- Apple Metal
- AMD Mantle
- Vulkan

WebGLとは？
====

- OpenGLをJavaScriptに移植したもの。ほぼOpenGL
- HTML上の画像\<image>や動画\<video>を簡単にテクスチャにできるように拡張してある
- 関数名をjsっぽくオシャレにしてる
    - 例) glDrawElements() → gl.drawElements()

three.jsとは？
====

- WebGLをラップしたライブラリ
- APIがオシャレでOpenGLの面影がない

WebGLとthree.jsのどちらを勉強すればいいか
====

WebGLを使うメリット/デメリット
----

- :+1: OpenGLの資産を容易に再利用できる
- :+1: ライブラリ固有のパフォーマンス劣化を気にする必要がなくなる
- :+1: 実装の中をわかった気になれる
- :-1: 行列を用意するのに別途ライブラリがほぼ必須
- :-1: Vulkanが出てくるし今更OpenGLを勉強してもあんまり美味しくない

three.jsを使うメリット/デメリット
----

- :+1: ライブラリ一つで完結する
- :+1: WebGLを生で扱うより簡単
- :-1: パフォーマンスの出るよう心がけるには結局中身を知らないといけない
素人がEl Capitanにアップデートしてみたやつ。

#El Capitanを入れてみた。えるたそ〜。
えるたそ〜とか言ってるけど当該元ネタをよく知りません。にわか乙。
YosemiteでHomebrewを使っていたのですが、
ElCapitanに上げるとSIP（System Integrity Plotection/rootless）によって/System、/bin、/sbin、/usr以下の変更ができなくなってしまう。ということで、rootユーザーでも変更できないからrootlessらしいです。
uselessになる無限の可能性を感じる。
なお、usr/localに限っては"事前にそのディレクトリが存在する場合"root権限でいじれるらしいので、
OSアップグレード（Apple公式的にはアップデート）をかける前にディレクトリを用意しておくといいかも？
後からusr/localを用意する場合はリカバリーモードでSIPを無効化した上で通常起動してディレクトリを作成、
またリカバリーモードで起動してSIPを有効化して通常起動してchownする必要があるみたいです。
面倒臭いな！

#何は無くともbrew update
本来ならbrew doctorしてから考えるべきなのですが、再起動後はとりあえずbrew updateコマンドを打つのが癖になっているため（非推奨。癖にするならbrew doctor -> brew update -> brew upgradeの流れを癖にしてください）、
とりあえずbrew updateをしてみました。
結果... 

```shell-session
Error: The /usr/local directory is not writable.
Even if this directory was writable when you installed Homebrew, other
software may change permissions on this directory. Some versions of the
"InstantOn" component of Airfoil are known to do this.

You should probably change the ownership and permissions of /usr/local
back to your user account.
  sudo chown -R $(whoami):admin /usr/local
```

と出てきました。
usr/local以下の権限を
`sudo chown -R $(whoami):admin /usr/local`
で変更しておきましょう。
実行後に
`$ ls -ld /usr/local`
してあげてオーナーが変わっていればokです。

順序は前後してしまいましたが、
brew doctorもしてみました。

```shell-session
➜  ~  brew doctor
Your system is ready to brew.
➜  ~  
```
というわけでひとまずbrewはちゃんと動くようになりました。
Homebrew-Caskを使っている人は
`$ sudo chown -R $(whoami):admin /opt/homebrew-cask`
して/optの方もオーナーを変えておいたらいいと思います。

また誰でも知っているような薄い内容をポストしてしまった...
（タイトル変更済み）PsySHには変数をunsetしてもリソースが解放されないバグがある

PHPマニュアルの[リソース](http://php.net/manual/ja/language.types.resource.php)の項目を読むとこんな記述があります。

> PHP 4 の Zend エンジンに導入されたリファレンスカウンティングシステムのおかげで、 あるリソースがもう参照されなくなった場合に (Java と全く同様に)、 そのリソースは自動的に削除されます。この場合、このリソースが作成した 全てのリソースは、ガベージコレクタにより開放されます。 このため、free_result 関数を用いて手動でメモリを開放する必要が生じるのはまれです。

<del>ところがですね…手元のOSXで以下のコードで無限ループさせてファイルを手動で削除しようとしたところ、動作に差がありました。</del>

```php:fcloseする
$fp = fopen('test.txt', 'a');
fclose($fp);
while (true) { }
```

```php:unsetする
$fp = fopen('test.txt', 'a');
unset($fp);
while (true) { }
```

<del>fcloseの場合は正常に削除出来ましたが、unsetの場合は「使用中」となっていて削除出来ませんでした。スクリプトを強制終了すれば解放されましたが、終了時までは解放されないようです。</del>

- <del>flock(\$fp, LOCK_UN)でのロック解放はもちろん、fclose($fp)もちゃんと書こう</del>
- <del>面倒だったら出来るだけSplFileObject使おう</del>

訂正します。まさかこんなところで差がでるとは思っていなかったのですが、実際に`while`ループではなく、<ins>`psysh`上で確認していました。</ins>

![スクリーンショット 2015-10-02 22.49.35.png](https://qiita-image-store.s3.amazonaws.com/0/25060/d6e399fd-ac01-331f-d8c8-a5704b8472b7.png)

実際に最初記事に書いたとおりに試してみると、@hnwさんの仰る通り正しい挙動になりました。<ins>PsySHのシンボルテーブル管理方法に問題がある</ins>と見たほうがいいかもしれません。

思い込みで誤った記事を書いてしまったことをお詫びします。お騒がせしました。
ページの短縮URLを取得する

右上の「ツール」→「このページへリンク」を押すとタイニーリンクという名前で短縮URLが出力される

![2241813-8eb5ba9c836b73738c2bc1a4735f78432e63b1d8.png](https://qiita-image-store.s3.amazonaws.com/0/41043/681f1850-83a7-8752-5312-003365b7e6c6.png)
ListViewやGridViewのpaddingでスクロール開始位置をずらす

## paddingを設定しても余白を白くしたくない、リストの続きを見せたい

データを一覧で表示するならListView、GridViewが便利。
でも、時々、ちょっと上に余白あけたいと思ったりする時があります。**Margin**とか**Padding**を設定するけど、設定した部分が白（というか背景色）になって、みっともないし。。。
ListViewなら**addHeaderView** or **addFooterView**をしたらいいかなとか対策はありますが、GridViewになるとそれが無いからもっと大変……。

とにかく簡単に、リストの開始位置をずらす方法を紹介します。

## 簡単です。cropToPaddingをfalseにしたら良いんです。

ずらしたい分、paddingを設定して、合わせてcropToPaddingの属性をfalseにしてあげればOKです。

以下実装例。

### XML

レイアウトの定義は以下のようなイメージです。

```xml:XMLのレイアウト定義例
<ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@null"
        android:dividerHeight="4dp"
        android:clipToPadding="false"
        android:padding="8dp"/>
```

ここでは、**padding**を8dpに設定し、合わせて**clipToPadding**を**false**にしています。これは、paddingで設定した分の描画を切り抜く（= clip）かどうかの設定で、デフォルトはtrueです。この設定をfalseにすることで、paddingを超えた範囲でもviewを描画してくれるようになります。

これを知ったときの実装では、ListViewのitemセルにCardViewを入れていたので、`android:divider="null"`にしています。また、dividerHeightも設定することで、カード同士が詰まらないようにしています。

### Java

コード上なら、こんな感じになります。

```java:Javaの実装例
// リストを下に200pxずらす例
listView.setPadding(0, 200, 0, 0);
listView.setClipToPadding(false);
```

XML、Java、どちらでやっても結果は同じです。

## そもそもclipToPaddingとは

どうやら、影のあるViewとか、そういうところで使われているようですね。
詳しく調べているわけではないのでわかりませんが、contentViewは内側にしたいけど、外側でもViewを表示したい時に使っているようです。
文字列のルックアップに mysql の ENUM 型を使う

# 文字列のルックアップに mysql の ENUM 型を使う


## 用語

「文字列のルックアップ」とはリレーションのない `数値 => 文字列` のマッピングを指します。例えば

```php
$sex_codes = array(
    1 => '男性',
    2 => '女性',
);
```

などです。
DB のカラム値としては 1 とか 2 の値が入り、画面に表示するときに 「男性」とか「女性」と表示するイメージです。
`input[type=radio]` や `select` で選べる選択肢としても頻出します。

「mysql の ENUM 型」は[公式マニュアル](http://dev.mysql.com/doc/refman/5.6/ja/enum.html)を参照するといいでしょう。


## 現状

DB では単に整数値として定義し、アプリ側（ここでは php。配列とか定数とか）で上記のようなマスタ配列を保持して担保しています。
しかし、それだと DB 側の制約がないため、 `sex_code` のようなカラムに 1,2 以外の 4 などを入れても誰も何も注意してくれません。

また、DB を覗いてもそこには 1 とか 2 の値が入っているだけであり、「その値が何を意味するのか」はアプリのソースコードを確認しないと分かりません。

ルックアップ用の [id, name] だけを持ったテーブルを定義するのが正攻法（外部キーで制約できるため）だと思いますが、名前引きのためにそこまでするのもなんだかなぁ、と言った感じです。


## 理想

下記のようなテーブルを想定します。

```sql
CREATE TABLE person (
	id SERIAL,
	name VARCHAR(16) NOT NULL,
	sex_code ENUM('男性', '女性') NOT NULL COLLATE 'utf8_bin',
	PRIMARY KEY (id)
)
```

`person.sex_code` は「男性」「女性」の2値のみを取ります。それ以外の値は受け付けません（後述）。
ただし、 ENUM 型のインデックスは1ベースで振られるので、数値として `1` を入れれば「男性」として入りますし、文字列として「男性」を入れてもそのまま「男性」として扱われます（これも後述）。

`input[type=radio]` や `select` で表示する選択肢は テーブル定義をパースすることで得られます。

```php
function getEnumList(\PDO $pdo)
{
	$describe = $pdo->query('DESCRIBE person')->fetchAll(\Pdo::FETCH_ASSOC);
	if (!preg_match('#^enum\((.+)\)$#ui', $describe[2]['Type'], $matches)) {
		throw new \Exception();
	}
	$vals = str_getcsv($matches[1], ',', "'", "\\");
	$keys = range(1, count($vals));
	return array_combine($keys, $vals);
}
```

※ マジックナンバーが多いですが、サンプルなので勘弁（というか適当です）。やりようはいくらでもあると思います

キーを数値として取得していますが、 `array_combine($vals, $vals)` として、 `文字列 => 文字列` の配列でもいいと思います。
というか、その方が ENUM 値を得るとき一手間減る[^1]のでむしろその方が良いかもしれません。

[^1]: ENUM 型はそのまま取得すると列挙値の文字列で返すので、数値化（ `SELECT person.sex_code+0` ）してやる必要がある。


## 注意点

マニュアルによると、ENUM 型は 照合順序の影響を受けるようです。
utf8_bin のようなバイナリ型でないと、大文字小文字を区別した列挙値を定義できないかもしれません。

また、 sql mode が strict でないと、定義された列挙値以外を INSERT しても怒られず、''(空文字)が挿入されるようです。
したがって strict でないとメリットがほとんど享受できません。

さらに INSERT 時に「数値っぽい文字列」を与えてもよしなに扱ってくれるようですが、列挙値に「数値っぽい文字列」が含まれていると多大な混乱を招きます。
http 経由で得られるパラメータはまず文字列であるため、int キャストがほぼ必須になると思います。

さらにさらに、並び順の制御ができません。
「選択肢を『女性』、『男性』の順で表示して欲しい」といった要望が来た場合、値の変更が必要になります。
…と、思ったんですが、カラム定義を変更するとよしなに変換が行われるようです。
例えば上記の例の場合、 `person.sex_code` を `ENUM('女性', '男性')` と変えたところでレコードの値としては何一つ変わりません。
ただし、これが規定された動作なのか不明のため、一応注意点として記しておきます。
※ mysql 内部では整数値で保持しているという認識なんだけど違うのかな？

こんなに注意点があるなら使えない気がする…。
Gmailで以前の連絡先編集画面を出す

# Gmailで以前の連絡先編集画面の出し方

GMailで、以前誤入力したアドレスがオートコンプリートに出てきて困るが、左上の「Gmail▼」をクリックして出てくる「コンタクトのプレビュー」画面では削除ができないし、そもそも「よく使う連絡先」だけで全部の連絡先が出てこない。

以前の連絡先編集画面を出すには、左のメニューの「もっと見る」から「コンタクトのプレビューを終了」を選ぶ。すると以前の連絡先編集画面になるので、「その他の連絡先」から目的のアドレスを探して削除する。

# Googleコンタクトプレビュー

Gmailの「連絡先」から出てくる「Googleコンタクトプレビュー」なんだけど、検索窓で検索しても自分のGmailが覚えている連絡先を検索してくれないし、「すべて表示」にしても「よく使う連絡先」しか出てこないので、ここに出てこない連絡先の編集ができないし、どういうつもりなんだろう？
Rails の STI で type カラムに入れる値を変える

メモ。STI (Single Table Inheritance) を使ってこんな構造を作りたいとする。

```rb
class Task < ActiveRecord::Base
end

class AbstractTask < Task
end

class ConcreteTask < Task
end
```

STI のデフォルト挙動では `type` カラムの値にクラス名が入る。AbstractTask の場合には `AbstractTask`、ConcreteTask の場合には `ConcreteTask` となる。

が、`tasks` テーブルを見ているわけで、Task であることはわかっているし、それぞれ `abstract`、`concrete` ぐらいにしたい。というただのこだわり。

こうすればできるようだ。

```rb
class Task < ActiveRecord::Base
end

class AbstractTask < Task
  class << self
    def find_sti_class(type_name)
      type_name = self.name
      super
    end

    def sti_name
      "abstract"
    end
  end
end

class ConcreteTask < Task
  class << self
    def find_sti_class(type_name)
      type_name = self.name
      super
    end

    def sti_name
      "concrete"
    end
  end
end
```

訂正。親クラスで定義しないと、`Task.first` のようにインスタンスを作った場合に、適切に `AbstractTask`、`ConcreteTask` に変身してくれなかった。こんなかんじになった。

```rb
class Task < ActiveRecord::Base
  class << self
    def find_sti_class(type)
      class_name = "#{type.camelize}Task"
      super(class_name)
    end

    def sti_name
      @sti_name ||= self.name == 'ConcreteTask' ? 'concrete' : 'abstract'
    end
  end
end

class AbstractTask < Task
end

class ConcreteTask < Task
end
```
Emacsに切り替えた瞬間に通常のIMEを切る方法 (SKKユーザー向け)

24.4 から追加された focus-in-hook のおかげでずいぶん楽になりました。

```el
;; Emacsに切り替えた瞬間にIMEを切る
(add-hook 'focus-in-hook 'mac-change-language-to-us)
```

# 参照

A peek at Emacs 24.4: Focus Hooks - Emacs Redux
http://emacsredux.com/blog/2014/03/22/a-peek-at-emacs-24-dot-4-focus-hooks/

Emacs 24.4 の「フレーム・ウインドウ」関連の新機能 - 雑文発散(2014-08-02)
http://suzuki.tdiary.net/20140802.html
xip.io でIPアドレス部分をワイルドカードにしつつDNSリバインディングにも気をつける

この例では `example.net` を自分管理の信頼できるドメイン、`example.com` を信頼出来ない他人のドメインとして例を書いています。

----

xip.io を独自のドメインで使っているとき、VirtualHost とかで、

```
<VirtualHost *>
    ServerName oreore.192.0.2.123.xip.example.net
    (snip)
</VirtualHost>
```

みたいに長ったらしい名前を書いてしまうと次のような問題があります。

- なんかキモい
- IPアドレス変わった時に設定ファイルを弄る必要があって面倒
- Vagrant box とかに含めて配布するときに不都合

次のようにすれば大丈夫ですが、

```
<VirtualHost *>
    ServerName oreore.xip.example.net
    ServerAlias oreore.*
    (snip)
</VirtualHost>
```

これだと、

```
oreore.evil.example.com.  IN  A  192.0.2.123
```

みたいなのに反応してしまうので、DNSリバインディング攻撃に対して脆弱です。

----

次のように ServerAlias で信頼できるドメインを指定して、中間だけをワイルドカードにします。

```
<VirtualHost *>
    ServerName oreore.xip.example.net
    ServerAlias oreore.*.xip.example.net
    (snip)
</VirtualHost>
```

これなら、

```
oreore.evil.example.com.  IN  A  192.0.2.123
```

みたいなのには反応しないし、`.example.net` が信頼できるドメインなら安心です。

----

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">Apache のバーチャルホストで ore\.192\.0.2\.123\.xip\.io みたいにすべきところを ServerAlias で ore\.* みたいにするのはありだろうかなしだろうか</p>&mdash; ngyuki（えぬじーぶるー） (@ngyuki) <a href="https://twitter.com/ngyuki/status/638929427099877376">2015, 9月 2</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">とりあえず ServerAlias ore\.*\.xip\.io みたいにしてみる&#10;（実際には社内で xip-pdns 動かしているのでドメイン違うけれども）</p>&mdash; ngyuki（えぬじーぶるー） (@ngyuki) <a href="https://twitter.com/ngyuki/status/638935245010530304">2015, 9月 2</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
FactoryGirlで連番使って重複しないデータの作成


emailとかユニーク制約がついているカラムに対してFactoryGirlでは、シーケンスを利用してユニークのデータを作成することができます。

## 連番（Sequences）の使用例
usernameに連番を使って、ユニークしてそれをemail作成している例

```
FactoryGirl.define do
  factory :user do
    # test.user1, test.user2, test.user3, ... 
    sequence :username do |n|
      "test.user#{n}"
    end
    email { "#{username}@example.com" }
    password 'password'
  end
end
```

初期値を設定する例

```
FactoryGirl.define do
  factory :user do
    # test.user100, test.user101, test.user102, ... 
    sequence :username,100 do |n|
      "test.user#{n}"
    end
    email { "#{username}@example.com" }
    password 'password'
  end
end
```

数字以外を設定する例

```
FactoryGirl.define do
  factory :user do
    # test.usera, test.userb, test.userc, ... 
    sequence :username,'a' do |n|
      "test.user#{n}"
    end
    email { "#{username}@example.com" }
    password 'password'
  end
end
```
35 Best Free Bootstrap Website templates 2015

Bootstrap website templates are well-known for creating mobile-friendly websites with less effort. Bootstrap is one of the popular mobile first framework used to create cross browser compatible and responsive websites. The [free html5 website templates 2015](http://designpixer.com/2015/best-free-html5-templates/) which built using bootstrap can be easily customized by users or clients if he/she knows somewhat programming & bootstrap skills. Most designers prefer to use [free bootstrap templates](http://designpixer.com/2015/free-bootstrap-website-templates-2015/) because it takes less time & effort to create a website.
Hirbを使ってRailsコンソール上のモデル出力を表形式に整形

rails console上でモデルの内容を出力したら、配列のように出力されてみにくい。Hirbを使用することで、データベースのコンソール上で実行したような表形式での出力を整形することができる。

## Hirbを利用できるようにする
GemfileにHirbを追加する

```
group :development, :test do
  gem 'hirb'
  gem 'hirb-unicode'
end
```

Bundlerでgemをインストールする

```
bundle install
```

デフォルトではHirdは有効になっていないので、Railsコンソールを開いてHirbを有効する。
有効にする：Hirb.enable
無効にする：Hirb.disable

```
$ rails c
Loading development environment (Rails 4.2.3)
irb: warn: can't alias context from irb_context.
irb(main):001:0> MasterJob.first
  MasterJob Load (0.3ms)  SELECT  `master_jobs`.* FROM `master_jobs`  ORDER BY `master_jobs`.`id` ASC LIMIT 1
=> #<MasterJob id: 1, name: "取締役", deleted_at: nil, created_at: "2015-09-09 02:03:25", updated_at: "2015-09-09 02:03:25">
irb(main):002:0> Hirb.enable
=> true
irb(main):003:0> MasterJob.first
  MasterJob Load (0.3ms)  SELECT  `master_jobs`.* FROM `master_jobs`  ORDER BY `master_jobs`.`id` ASC LIMIT 1
+----+--------+------------+---------------------------+---------------------------+
| id | name   | deleted_at | created_at                | updated_at                |
+----+--------+------------+---------------------------+---------------------------+
| 1  | 取締役 |            | 2015-09-09 11:03:25 +0900 | 2015-09-09 11:03:25 +0900 |
+----+--------+------------+---------------------------+---------------------------+
1 row in set
irb(main):004:0>
```

## PryでHirb
railsプロジェクトのルートディレクトリに.pryrcファイル作成する(Gemfileと同じ場所)。
.pryrcに下記を書いて保存すれば使用できるようになっていまいす。

```
begin
  require 'hirb'
rescue LoadError
  # Missing goodies, bummer
end

if defined? Hirb
  # Slightly dirty hack to fully support in-session Hirb.disable/enable toggling
  Hirb::View.instance_eval do
    def enable_output_method
      @output_method = true
      @old_print = Pry.config.print
      Pry.config.print = proc do |*args|
        Hirb::View.view_or_page_output(args[1]) || @old_print.call(*args)
      end
    end

    def disable_output_method
      Pry.config.print = @old_print
      @output_method = nil
    end
  end

  Hirb.enable
end
```
FC２ブログのfeed を複数表示させたい時に調べたこと

feedを複数表示させたいとき。
javascript 部分はこうやって書く。

```js
google.load("feeds", "1");

function initialize(){
  var feed =new google.feeds.FeedControl();
  feed.setNumEntries(5);
  feed.addFeed("feedURL01","title01");
  feed.addFeed("feedURL01","title02");
  feed.draw(document.getElementById("idContent"))
}

```



そうすると要素はこんな感じで出てきた。

```html
<div id="idContent">
  <div class="gfc-control">
    <div class="gfc-resultsbox-visible">

      <!-- feed01 -->
      <div class="gfc-resultsRoot">
        <div class="gfc-resultsHeader">
          <div class="gfc-title">title01</div>
        </div>
        <div class="gfc-results">
          <div class="gfc-result">
            <div clasa="gf-title">
              <a href="#" class="gf-title" target="_self">エントリーのタイトル </a>
            </div>
　　　　　　　<div class="gf-author">…</div>
　　　　　　　<div class="gf-spacer">-</div>
　　　　　　　<div class="gf-relativePublishedDate">2015年10月21日</div>
　　　　　　　<div class="gf-snippet">discription ...</div>
           </div>
         </div>
       </div>
      <!-- /feed01 -->

    </div>
  </div>
</div>

```

あとはここに合わせてcssをつけていくのだと思います。
もっと細かにカスタマイズしたいときなどは別の方法があると思うので、
もう少し調べていきたいです。
アクセス元のwhois情報を取得する


「攻撃受けてるっぽい！どこからのアクセスだ？」
となったときに使うコマンド

```
whois [IP]
```

ちゃんと登録されていれば、Organizationなどがあるはずなので

```
whois 133.242.231.207 | grep Organization
#=> Organization:   Asia Pacific Network Information Centre (APNIC)
```

って感じで、アクセス元を確認できます。
IP偽装されてたらダメだけど。。。
404のアクセスログだけawkで取得する


「404が急増している！どこからのアクセスだ？」ってなったときに便利なコマンド。
IP、リクエストパス、httpステータス、ユーザーエージェントを取得しています。

※ログの形式によって、"$数字"の数字が違います。

```
1: IP
7: リクエストパス
9: httpステータス
12,13: ユーザーエージェントの一部
　
awk '$9=="404"{print $1, $9, $7, $12$13}' access.log
```
【RSpec】テストケース(it)をまとめてRSpecを高速化する。



大規模になればなるほど、テストが大切になります。
しかし、大規模になればなるほど、テスト実行時間は長くなりテストを回すのは億劫になります。
今回は、タイトル通りitのケースをまとめて多少の高速化をしましょうという内容です。


## 方法
ただ、itをまとめる。
まずは、10個のテストケースを1つのブロックの中に入れて実行してみます。

### before
![スクリーンショット 2015-10-01 19.41.57.png](https://qiita-image-store.s3.amazonaws.com/0/71616/2c550a06-03f6-8427-d583-c6bc89401d18.png "スクリーンショット 2015-10-01 19.41.57.png")
これを、、

### after
![スクリーンショット 2015-10-01 19.42.08.png](https://qiita-image-store.s3.amazonaws.com/0/71616/c2943a85-1adf-7196-da6b-5898732ebab3.png "スクリーンショット 2015-10-01 19.42.08.png")
こうするだけ。


## 結果
### before

![スクリーンショット 2015-10-01 19.52.50.png](https://qiita-image-store.s3.amazonaws.com/0/71616/7b74d071-36d9-054e-9cec-ed2cbd377cb9.png "スクリーンショット 2015-10-01 19.52.50.png")



|  項目 |  単位| 
|---|---|
|ケース数|100[個]|
| 実行時間  | 74.27[s] |  
| 1ケースあたり実行時間 | 0.74[s/個] |  




※補足
> files took 11.8 seconds

とは、specを回す前にファイル読み込みにかかった時間です。
つまり、合計時間は実行時間+ファイル読み込み時間です。


### after
![スクリーンショット 2015-10-01 19.53.22.png](https://qiita-image-store.s3.amazonaws.com/0/71616/01548e9b-aae9-d75a-5921-be7a4f898d39.png "スクリーンショット 2015-10-01 19.53.22.png")


|  項目 | 単位| 
|---|---|
|ケース数|10[個]|
| 実行時間  | 10.09[s] |  
| 1ケースあたり実行時間 | 1.1[s/個] |  

実際に回してみるとわかりますが、かなり速くなっています。


### 分析
|  項目 |  before | after  |  
|---|---|---|---|
| 1ケースあたり時間  |  100%  | 148%  |
| ケース数  | 100%  | 10%  |   
| 実行時間  | 100%  | 15%  |   

**85%も実行時間を減らすことが出来ました。**

しかし、現実問題10個のテストケースを1つにまとめるのは流石に出来ないでしょう。
そこで、次は、テストケース2つを1つにまとめた場合を実行してみます。


## 2つのテストケースを1つにまとめた場合


### before
![スクリーンショット 2015-10-01 20.20.02.png](https://qiita-image-store.s3.amazonaws.com/0/71616/7e346e3d-2c80-9a58-9c3b-f6b29cb90a4d.png "スクリーンショット 2015-10-01 20.20.02.png")

|  項目 | 単位 | 
|---|---|
|ケース数|20[個]|
| 実行時間  | 16.94[s]|  
| 1ケースあたり実行時間 | 0.85[s/個] |  


    
### after
![スクリーンショット 2015-10-01 20.20.53.png](https://qiita-image-store.s3.amazonaws.com/0/71616/598cdc3e-b7a7-3198-6d29-7be36e24712f.png "スクリーンショット 2015-10-01 20.20.53.png")

|  項目 |  second | 
|---|---|
|ケース数|10[個]|
| 実行時間  | 10.28[s] |  
| 1ケースあたり実行時間 | 1.03[s/個] |  


### 分析

|  項目 |  before | after  |  
|---|---|---|---|
| 1ケースあたり時間  |  100%  | 121%  |
| ケース数  | 100%  | 50%  |  
|実行時間  | 100%  | 61%  |   

**実行時間を85%削ることは出来ませんでしたが、それでも40%も減らすことが出来ました。**


## まとめ



|  テストケース |   実行時間|
|---|---|
| 100%  |  100% |
|  50% | 61%  |
| 10%  | 15%  |


だいたい、2つを1つにまとめると、実行時間を40%削減
3つを1つにまとめると、実行時間を60%くらい削減できそうです。
是非、試してみてください。
委譲の隠蔽 Hide Delegate


## 前提
プログラムを書いていると、
プログラム同士が、複雑なネットワークを形作る。

この関係が、複雑になりすぎるとプログラムの修正が困難になってくる。
これを防ぐために用いるのが委譲の隠蔽。

## 目的
委譲クラスを使用するべきクラスからしか、アクセス出来ないようにする。

## 行うこと
クラスに委譲メソッドを追加して、使用しなくても良いクラスから隠蔽を行う。

## 結果
クラス間の無駄な関連が減り、コードの修正がしやすくなる
ただし、委譲メソッドを作成したクラスの責任が増える

## 手順
### 委譲メソッドの作成
1.委譲クラスのメソッドに対応するメソッドを作成する。
2.いままで委譲クラスを読んでいたクラスは、メソッドを呼ぶように変更をする。
3.コンパイルしてテストをする。

### 委譲クラスの隠蔽
委譲クラスのgetterメソッドを削除する。
コンパイルしてテストをする。

## サンプルコード
-変更

```java
class.getter().method();
```

- 変更あと

```java
class.method();
```

## その他の隠蔽

### アクセス制御を使った隠蔽
private をつけてフィールドやメソッドを宣言する。
他のクラスから見えないようになるので、修正の際にクラス内のみに気を使えば良い

### パッケージを使った隠蔽
クラス宣言の際に、publicをつけずに宣言をする。
そうすると他のパッケージから見えなくなる

### ネストしたクラスを使った隠蔽
ネストしたクラスは、そのネスト元のクラスの中でのみ使うクラスになる。
iPhone 6s safariの3Dタッチで画像のプレビューが出るのを防ぐ

iPhone 6s safariで、3Dタッチによる「peek」「pop」というアクションが追加されました。

↓参考
http://gigazine.net/news/20150925-iphone-6s-3d-touch/

html上にimgタグで貼った画像もpeekでプレビュー表示、popでジャンプします。

これがあまり嬉しくない場合もあります。

いろいろ試した結果、img要素にevent listener追加してe.preventDefaultしてやると無効化されることが分かりました。（注：safariのみ確認）

```js
var img = document.getElementById('testimage'); // img要素取得
img.addEventListener('touchstart', function(e) {
    e.preventDefault();
});
```

**追記(注意!!!):**
preventDefaultするとその画像上をフリックしたときのスクロールも無効化されるので要注意!

**追記その２:**
コメントで、styleで無効化できることを教えていただきました！

```css
.disable-3d-touch {
  -webkit-touch-callout: none;
  -webkit-user-select: none;
}
```

まさにコレが求めていたものです！＼(^o^)／
ありがとうございました！
Jupyter 4.0 で Tex 数式が描画されなくなった方へ。

## 前置き

これたぶん普通にデフォルトで使っている人は気付かないと思う。

私の環境で、Jupyter を 3.x → 4.0 にアップグレードしたら、今まで作った notebook の $\TeX$ 数式がことごとく描画されない（`$\sum_{n=1}^{\infty} … $` のようにソース状態で表示されてしまう）事象が発生。

例：
![Jupyter_RISE_0.png](https://qiita-image-store.s3.amazonaws.com/0/30400/d10f92a6-e44b-031d-b184-0d984081c5d1.png)


対処法を書き残しておきます。

### 環境

+ Mac OSX 10.8/10.9/10.10
  + Ubuntu とかでもたぶん同様
+ Python 2.7.9 (pyenv でインストール)
+ Jupyter 4.0.4

## 現象（詳細）と、原因

この事象が起きるのは（おそらく）、[MathJax](https://www.mathjax.org/) の設定で、Math Renderer をデフォルトの HTML-CSS 以外（MathML, SVG 等）で表示させていた人。
（きちんと確認していませんが）デフォルトの HTML-CSS で表示していた人なら、問題が起きていないかもしれません。

私は（ブラウザの対応状況と好みで）SVG にしていたのですが、数式を表示しようとすると `jupyter` を実行したターミナルに以下のような警告ログ（例）が出力されました。

```
[W 12:34:56.789 NotebookApp] 404 GET /static/components/MathJax/jax/output/SVG/config.js?rev=2.5.3 (::1) 1.74ms referer=http://localhost:8888/notebooks/path/to/notebook.ipynb
```

つまり、根本的に何かが足りない、と。

調査した結果、原因は、以下の2点から来ているものと判明：

1. Jupyter 4.0 から、MathJax はローカルにインストールされたコピーを参照するようになった[^1]。
2. （Jupyter をインストールしたときに配置された？）MathJax のコピーが、必要最低限のサブセットでしかない。

ということで、それをなんとかすれば良さげ、ということ。

[^1]: 以前（Jupyter 3.x まで）は、インターネット上の CDN を参照していました。その参照先がフルセットだったので問題なかったというわけですね。ただネットワーク未接続環境で jupyter 起動しても「MathJax 使えないよ」という警告がそう言えば出力されなくなってたのでそれはそれで便利になったというわけで。

## 対処法

### 1. MathJax コピーのインストール場所特定

これは普通、Jupyter を起動している Python の環境下になります。
私の場合、pyenv でインストールした Python2.7.x で動かしているので、以下にありました（例）：
`~/.pyenv/versions/2.7.x/lib/python2.7/site-packages/notebook/static/components/MathJax/`

でその中身を見てみたら確かに、`〜/jax/output/` ディレクトリ内には `HTML-CSS/` しかなく、`SVG/` なんていうディレクトリは存在しませんでした。

### 2. MathJax をダウンロード（またはクローン）して置換

すべてコマンドラインで済ますなら以下（例）：

```bash
$ cd ~/.pyenv/versions/2.7.x/lib/python2.7/site-packages/notebook/static/components/
$ mv MathJax MathJax_org
$ git clone https://github.com/mathjax/MathJax.git
```

これだけ。

[MathJax 公式サイト](https://www.mathjax.org/#docs) から "download a copy" というリンクを見付けて .zip ファイルをダウンロード・展開・フォルダ丸ごと置き換え、でももちろん OK。

### 3. 動作確認

Jupyter を起動（起動中なら一旦終了して再起動）して、数式を含む notebook を開いてみる。

![Jupyter_RISE_1.png](https://qiita-image-store.s3.amazonaws.com/0/30400/787d3c4c-c283-e503-4715-b08a0cf86672.png)

きちんと数式が描画されるようになりました。めでたしめでたし。

## 参考

+ [How to enable MathJax in Jupyter 4 again](https://groups.google.com/forum/#!topic/jupyter/XsiE82A8r9I "How to enable MathJax in Jupyter 4 again - Google Group")
+ [MathJax Documentation](https://www.mathjax.org/#docs)
【プラグイン】規格選択ラジオボタン

「規格選択ラジオボタン」プラグインを作ってみました。
ver3.0.3で検証済みです。

### 詳細
***
ECCUBE3の商品詳細ページで規格を一覧で表示し、ラジオボタンで選択できるようにします。
ソースはGithubにupしてます。
[https://github.com/ohtacky/ECCUBE3-ProductClassList](https://github.com/ohtacky/ECCUBE3-ProductClassList)
<img src="https://raw.githubusercontent.com/ohtacky/ECCUBE3-ProductClassList/image/1.png" width="650px">

#### 作ってみて
***
規格選択肢一覧用のFormを定義し、レンダリングしています。

規格のバリデーションを抜けるのにハマりました。
結果的にプラグイン側で定義したバリデーションを抜ける形に。

#### 改善点
***
在庫のない場合でもカートに数量0で入ってしまう。

ECCUBE本体でも同じ現象。

対応としては下記かなと
- ラジオボタンがクリックされた時にjavascriptで処理
- カートに入れるボタンを押した時に処理
- レンダリングする時点で処理。在庫のない規格のボタンのdisable化など。←Symfonyはできないっぽい？
ブラウザ埋込み型のJavascriptエディタ「ACE」を実装してみた。

ブラウザ上で動くACEというエディタ、Javascriptで書かれているのでブラウザで動きます。Webアプリなどに簡単に組み込めます。

## 試しに実装してみた。
http://www.katacom.jp/ace-builds-master/
DEMO用のファイルをすこし変更してアップロードしただけなので、ただ入力できるだけ。なんですが、「HTML」を入力してみてください。
いろいろ便利でしょ？

# 実装手順
- ダウンロード　https://github.com/ajaxorg/ace-builds
- 展開。srcディレクトリの中身が実行ファイルです

```editor.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>Editor</title>
  <style type="text/css" media="screen">
    body {
        overflow: hidden;
    }
 
    #editor {
        margin: 0;
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
    }
  </style>
</head>
<body>
 
<pre id="editor">
エディタにデフォルトで入れたいコードはココに書く
</pre>
 
<script src="src/ace.js" type="text/javascript" charset="utf-8"></script>
<script>
    var editor = ace.edit("editor");
    editor.setTheme("ace/theme/monokai");
    editor.getSession().setMode("ace/mode/html");
</script>
</body>
</html>
```

- 上記をそのままコピーしても大丈夫だと思いますが、ポイントは、
28行目：src/ace.js を参照するようにします。
31行目：テーマを決めます。SublimeText風にしたいので、monokaiを指定
32行目：モードを決めます。今回はHTMLモードにします。
テーマやモードは、srcフォルダの中に　theme-●●.js 、mode-●●.jsが準備されていますので、そこからいろいろお試しください。

- あとは、入力した値を受け取っていろいろ・・・とアイディアが湧いてきますね。


# ACEの基本的な使い方

一応基本的な使い方を紹介しておきます。CMSのエディタ的なのに使えそうなので、HTML編集関連での使い方を紹介。

## タグを入力

1. 普通にタグを入力すると終了タグが自動的に入ります。
2. あとは中身を入力するだけ

## タグ間を移動
終了タグから開始タグに移動したいときなどに。。
1. 終了タグにあるときに
2. Ctrl+Alt+Shift+左　（MacはAltをOptionで）
3. で開始タグに移動

## 複数タグを同時編集
いちばん感動したのは、Sublime textとかでよくある同時編集機能もデフォルトで使えること。

1. 終了タグにカーソルがある状態で
2. Ctrl+Alt+左　（MacはAltをOptionで）
3. 左を押すたびにタグを移動してカーソルが複製されていきます。
4. 編集したいタグ全部にカーソルが表示されたらあとは、編集するだけ。
5. あとは、Ctrl+Alt+Shift+（右|左）を押して移動すると複製されたカーソルを解除しながらタグ間を移動します。

##行を複製
1. コピーしたい行にカーソルがある状態で
2. Ctrl+Shift+d
3. 行がコピーされます

Javascript製のエディタでここまでできるんですね。

#参考記事

http://d.hatena.ne.jp/tsugehara/20130419/1366380767
http://blog.asial.co.jp/934
FBSDKLoginKit 4.6 (Facebook SDK for iOS) でアプリ経由のログインができない

# 結論

以前の仕様ではFacebookアプリ -> Safariの優先順位でログインを試みたが、
FBSDKLoginKit 4.6 (4.2以降？)では自アプリ内のSafariViewController でログインダイアログが開く。
つまり、__「バグではなく仕様」__ です。

以前はFacebook SDK for iOS を使ってログインを実装すると以下のような手順でログインしていました。
1. Facebookアプリが端末にインストールされていれば、Fast App Switching を使ってFacebookアプリ経由でログインする
2. Facebookアプリが端末にインストールされていなければ、Safariが開き、ログインダイアログが表示される

# iOS9におけるFacebook SDK for iOSの変更
iOS9でアプリを切り替える際、「◯◯を開きます。よろしいですか？」とアラートが表示され、ユーザーが「はい」を押すと初めて別アプリに遷移するという仕様になりました。
Facebook SDKチームではFast App Switchingを使って何度もアラートが表示されるのはユーザービリティ的に良くないと考え、アプリ内でSafariViewControllerが立ち上がるという仕様に切り替えたようです。  

こうする事でアラートは一度も表示されずにログインできます。が、SafariでFacebookにログインしていないユーザーは、初回のみEmail / Passwordを入力する必要があります。  


ただ、Facebookのフォーラムではこの仕様について議論が巻き起こっており、「改悪だ！」「今までで最低のアイデアだ！」などと怒号が飛び交っております。

https://developers.facebook.com/bugs/786729821439894/?search_id

なお、SDK 4.1以前を使えば以前の仕様のまま使えるようです。
raspbian-ua-netinstでwheesyを入れた後jessieに上げた

## 参考

* [Circuidipity | Minimal Raspbian Jessie](http://www.circuidipity.com/minimal-raspbian-jessie.html)

## SDに書き込み

* [Releases · debian-pi/raspbian-ua-netinst · GitHub](https://github.com/debian-pi/raspbian-ua-netinst/releases)
  * raspbian-ua-netinst-v1.0.7.img.bz2 をダウンロード

```bash:解凍
bzip2 -dc raspbian-ua-netinst-v1.0.7.img.bz2
```

```bash:SDカードに書き込み
sudo dd if=raspbian-ua-netinst-v1.0.7.img of=/dev/sdb; sync
```

## 起動

* 自動でセットアップが進む。15分くらいかかる
  * 終わったら自動で再起動がかかり、ログインプロンプトが表示される。
  * root : raspbian でログイン
  * ipアドレスを確認し、別の端末からssh接続。

## jessieに更新

```bash:
sed -i -e 's/wheezy/jessie/' /etc/apt/sources.list
apt-get update
apt-get dist-upgrade -y
```

* 再起動後、jessieになっていることを確認。

## 諸設定

```bash:
dpkg-reconfigure locales
cp /usr/share/zoneinfo/Asia/Tokyo  /etc/localtime
```
OpenCV 2.4.11をPython2.7で使う (Windows)

#OpenCV 2.4.11をPython2.7で使う (Windows)
OpenCV 2.4.11をPython2.7で開発する際のWindowsの設定を行ったので備忘録も兼ねて掲載する。

##1. OpenCVの事前準備

事前にOpenCV2.4.1のダウンロードしインストールまで行ってください。

###OpenCVをWindowsのユーザー変数でのPathに追加

以下のパスを追加する

```dummy:Path(環境変数)
C:\opencv\build\x64\vc12\bin
```

`opencv_createsample.exe`等が、コマンドプロンプトで使えるようになる

##2. NumPyのインストール
※NumPyをインストールしていないと使えないので、インストールしていない人は、
調べてインストールする。

NumPyのインストール方法は、以下のサイトが分かりやすいのでおすすめ

>NumPyのインストール方法
http://tokeigaku.blog.jp/python/numpy

NumPy ダウンロードは以下のサイトから
>Obtaining NumPy & SciPy libraries — SciPy.org
http://www.scipy.org/scipylib/download.html

ダウンロードした`numpy-1.9.2.zip`を`C:\`に展開する.

コマンドプロンプトで展開したディレクトリの

```dummy:コマンドプロンプト(管理者権限が必要かも)
python setup.py install
```

で実行してインストール完了

##3. PythonにOpenCVのライブラリを設定する

1. `C:/opencv/build/python/2.7/x64`の `cv2.pyd`をコピーして、
`C:/Python27/lib/site-packeges`の中に貼り付ける。  
※ `C:/Python27/libs`ではない。  
※ `lib`が`Lib`となっている場合もある

2. コマンドプロンプトで`python`と打ち、`import cv2`でエラーが何も出なければ、成功
Pocket WiFi 401HW > CPU使用率が70%程度になる

```txt:動作確認
Windows 7 pro (32bit)
Windows 8.1 pro (64bit)
```

ワイモバイルの401HWを契約して使ってみたのだが、どうもうまく動作しない。

401HWはUSB接続によりWiFi受信機を持たないPCでもネットワークにつながることができる、という謳い文句である。

セットアップの手順は以下の通りらしい
1. 401HWをUSBで接続
2. ドライバインストール用のフォルダが見えるようになる
3. ２のフォルダからドライバインストール

実際に試したところ、USB接続した後からWindows7とWindows8.1ともにCPU使用率が常時70%程度になり、PCの動作がカクカクするようになった。上記手順2のフォルダは一向に見える気配がない。

使用機器(401HW)の問題なのか、401HWのソフトの問題なのか切り分けできていない。
技術英語 > If you want a good programmer, he is your man.

引用: 冠詞マスター教本 by 石井隆之さん

> If you want a good cook, he is your man. (腕の立つ料理人が欲しいなら、彼がうってつけの男だ)

以下を思い出した。

http://qiita.com/7of9/items/cf1911d62ed1b14e1f8b
> Mr. Adams is the very man for accounting.

<hr>
PHPのroundは数字を丸める関数


```php
<?php
echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(3.6);         // 4
echo round(3.6, 0);      // 4
echo round(1.95583, 2);  // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2);    // 5.05
echo round(5.055, 2);    // 5.06
?>
```
El Capitan移行メモ


|OSXアップグレード|記事|
|:--|:--|
| |(Yosemiteまでは不具合等なし)|
|El Capitan移行メモ|http://qiita.com/cielavenir/items/ff4f3712c7790227d030|
|Sierra移行メモ|http://qiita.com/cielavenir/items/1c6b04af81748a92943e|

Perlは5.18、Rubyは2.0.0で10.10と同じであり、cpan/gemのインストール先が/usr/local/binだったので、binを移動させればライブラリの再インストールは必要ないと判断。

- Ruby gem

```sh
for file in `grep -F "/ruby" /Library/SystemMigration/History/Migration-*/QuarantineRoot/usr/bin/*|cut -f1 -d:`;do sudo mv $file /usr/local/bin/;done
for file in `grep -F "/env ruby" /Library/SystemMigration/History/Migration-*/QuarantineRoot/usr/bin/*|cut -f1 -d:`;do sudo mv $file /usr/local/bin/;done
```

- Perl cpan

```sh
for file in `grep -F "/perl" /Library/SystemMigration/History/Migration-*/QuarantineRoot/usr/bin/*|cut -f1 -d:`;do sudo mv $file /usr/local/bin/;done
for file in `grep -F "/env perl" /Library/SystemMigration/History/Migration-*/QuarantineRoot/usr/bin/*|cut -f1 -d:`;do sudo mv $file /usr/local/bin/;done
```

- Java (Apple)
  - Java for OSX 2015-001をインストールすれば良い。なお、[Javaプラグインを有効化するハック](https://support.apple.com/ja-jp/HT202643)は以前に実行済みであれば再度実行する必要はない。
  - (編注：上において、JavaAppletPlugin.pluginを維持したままJavaPlugin2_NPAPI.pluginをsymlinkして差し支えない)
  - ただし、<del>El Capitanで終わりらしい。</del>Adobeが使えなくなるのは辛いところが。

- llvm-gcc-4.2
  - Command Line Toolsを再度インストールすれば、`/Library/SystemMigration/History/Migration-*/QuarantineRoot/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2`は効く。llvm-gcc-4.2ディレクトリ自体はどこに移動しても良いっぽい。

- Mono
  - [公式](http://www.mono-project.com/download/)から4.0.4.4(以降)をダウンロードする。

- GNU R
  - R 3.2.2をインストールしなおせば大丈夫のようです
  - acknowledgement: https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=16469

- Tuxera NTFS 2014
  - 東芝CANVIO HDDについてきたバージョンなので最新版にアップデート出来ない。これだけは一時的にリカバリーモードで`csrutil disable`してインストールし直すしか方法がない( **インストールした後はcsrutil enableして良い** )。
  - http://support.toshiba.com/support/viewContentDetail?contentId=4008404 から少し新しいバージョンがダウンロードできるようです。これならシステムファイル書き換えは不要。
      - (Plugins/TuxeraSerialInstallerPlugin.bundle/Contents/MacOS/TuxeraSerialInstallerPluginを<del>古いものに</del>)

- CrossOver
  - 12.5.1で問題なく動作する。<del>ただし10.12まで耐えられるかは不明。</del>10.12でも大丈夫

- XtraFinder
  - SIPの仕様により不可(TotalFinderも同)
  - `csrutil enable --without debug`で使える。ファイルシステムやNVRAMについてはプロテクトを維持できる。

- ssh
  - 公式がECDSA/ED25519に対応したのでMacPorts版は不要になった(というか`/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist`を書き換えることが最早できない)。

- XQuartz
  - 大丈夫でした

## 追伸
- csrutil enableした後も`/System/Library/Filesystems/fusefs_txantfs.fs`の書き込みはできるっぽい。しかも一回消して`sudo cp -a`し直すと所有者がrootではなく自分になる(後でchownできますが)。ACL関係なのか、なかなか賢いです。
2つのtableに存在するuidのユニーク数を昨日1日分取得したい場合のクエリ

# この記事の目的

今回は、「2つのtableに存在するuidのユニーク数を昨日1日分取得したい場合のクエリ」を記載します。

ただいま運営中の[Player!](https://itunes.apple.com/jp/app/player!-your-sports-news-curator/id897872395)でTreasure Dataを利用しているため、データExportに使うHive QLを設定した際のちょっとした知識の共有。

数値の分析体制については、こちらの記事をご参考ください。[iPhoneアプリの数値分析体制を一挙公開](http://qiita.com/abe-perorist/items/67064e3fe97c97637473)

## できること
例えば、下記のようにtableが2つあるとします。


news_show

| time | uid | news_id |
| --- | --- | --- |
| Oct 02, 2015 @ 02:39:21 AM | 1 | 10 |
| Oct 02, 2015 @ 02:19:17 AM | 2 | 20 |
| Oct 02, 2015 @ 01:18:47 AM | 3 | 30 |

picks_list

| time | uid | news_id |
| --- | --- | --- |
| Oct 02, 2015 @ 02:35:28 AM | 1 | 11 |
| Oct 02, 2015 @ 02:08:27 AM | 4 | 22 |
| Oct 02, 2015 @ 01:56:15 AM | 5 | 33 |


その2つのtableに存在するユニークuid数を、昨日1日分取得することができます。




## 具体的なクエリ

```HiveQL:HiveQL
SELECT 
  td_time_format(time,
    'yy-MM-dd',
    'Asia/Tokyo') AS d,  /// 元データのtimeがUNIXなので、JSTに変換
  COUNT(DISTINCT uid) AS active_users  /// アクティブユーザーとして、ユニークなuid数を取得
FROM (
    SELECT 
      uid,
      time
    FROM
      news_show
  UNION
  ALL SELECT 
    uid,
    time
  FROM
    picks_list
  ) tmp  /// ()内で、picks_listとnews_showのuidとtimeを合体させている
WHERE
  td_time_range(time,
    td_time_add(td_scheduled_time(),
      '-1d'),
    td_scheduled_time())  /// クローンスケジュールを毎日夜中の12時に回すので、前日00:00 ~ 23:59まで取得できる
GROUP BY
  td_time_format(time,
    'yy-MM-dd',
    'Asia/Tokyo')
```

#### Export結果(to Google Spreadsheet)

| d | active_users |
| --- | --- |
| 2015-10-01 | 5 |



## まとめ
Treasure Dataの場合、[Supported Hive UDFs (User Defined Functions)](http://docs.treasuredata.com/articles/udfs#stq=&stp=0)で検索すると、かなりの確率で悩みは解決します。
ただ、今回は、2つのtableに共通するuidを縦に並べたかった(この表現が正しいかわかりませんが)ので、探し方がイマイチわからず苦労しました。
そのため、共有しておこうと思いました。
ディレクトリの中にあるディレクトリの zip アーカイブをそれぞれ別に作る

要は、

```
somedir/
  +- dir01/
  |    +- ...
  +- dir02/
  |    +- ...
  +- dir03/
  |    +- ...
  :
```

みたいになっている状態のディレクトリから

```
somedir/
  +- dir01.zip
  +- dir01/
  |    +- ...
  +- dir02.zip
  +- dir02/
  |    +- ...
  +- dir03.zip
  +- dir03/
  |    +- ...
  :
```

こうしたいということです。
`dir0{1,2,3}.zip` を展開すると、それぞれ `dir0{1,2,3}` の中身が出てくるみたいな感じです。

`find(1)` と `zip(1)` をつかってやっていきます。

```
$ find /path/to/somedir/ -maxdepth 1 -mindepth 1 -type d -exec zip -r {}.zip {} \;
```

カレントディレクトリで実行する場合は、単に以下のようにすればよいです:

```
$ find . -maxdepth 1 -mindepth 1 -type d -exec zip -r {}.zip {} \;
```

ターゲットとなるディレクトリ以下のディレクトリに対しても再帰的に `zip` が実行されないように `-maxdepth 1` と指定し、`somedir/` そのものが `zip` されないように `-mindepth 1` と指定してあるところがミソです。
iPhone Safariの長押しイベントメモ

jQuery mobileには *taphold* という独自の長押しイベントがあるが、近いうちにiPhone/iPad Safari向けで似たようなものが必要になりそうなので、以下を参考にサンプル作成。

**jQuery mobile Events**
http://api.jquerymobile.com/category/events/
**Preventing default context menu on longpress / longclick in mobile Safari (iPad / iPhone)**
http://stackoverflow.com/questions/12304012/preventing-default-context-menu-on-longpress-longclick-in-mobile-safari-ipad

- ChromeやAndroidなどで動作するかは不明（動かない可能性が高い）。
- pressの反応が微妙。押下領域が小さいと特に。調整が必要かもしれない。
- *3D Touch* を考慮してないので先々アレ。というか、独自イベントで頑張らず、標準イベントに寄せたほうがよい気もする。

```html:press.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta name="viewport" content="width=300" >
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<style>
/* 標準メニュー、短径選択をオフに */
body { -webkit-touch-callout: none !important; }
a { -webkit-user-select: none !important; }
</style>
<script>
$(function(){
var $msg = $('.msg'), n=0;

$('a').on('touchstart',function(e){
  var $this=$(this), isPress = false, timer;
  $this.off('touchend').on('touchend',function(e){
    if (isPress){ return false; }
    clearTimeout(timer);    
  });
  timer = setTimeout(function(){
             isPress = true;
             $this.triggerHandler('press');
         }, 750);
});

// 実際のイベント定義
$('a').on({
  'click':function(e){ $msg.text('click'+(n++)); return false; },
  'press':function(){ $msg.text('press'+(n++)); }
});

});
</script>
</head>
<body>
<div class="msg">wait</div>
<a href="#">link</a>
</body></html>
```