OmniAICreator/Qiita-1.07M huggingface dataset:
Processingでシミュレーション～波動方程式

# はじめに
Processingを使って波動方程式をシミュレーションします。

# 波動方程式
波動方程式は波の現象を表す方程式です。
次の微分方程式を満たす$u(t,x,y,z)$が波動を表します。
$\Delta_l$はラプラシアンです。$\Delta_l = \frac{\partial^2}{\partial x^2} + \frac{\partial^2}{\partial y^2} + \frac{\partial^2}{\partial z^2}$です。

```math
\frac{1}{s^2} \frac{\partial^2u}{\partial t^2} = \frac{\partial^2u}{\partial x^2} + \frac{\partial^2u}{\partial y^2} + \frac{\partial^2u}{\partial z^2} = \Delta_l u
```

# 差分化・離散化
2次元の波動方程式を扱います。
差分化

```math
\frac{1}{s^2Δt^2}(u(t,x,y)-2u(t-Δt,x,y)+u(t-2Δt,x,y)) \\ 
= \frac{1}{Δx^2}(u(t-Δt,x-Δx,y)-2u(t-Δt,x,y)+u(t-Δt,x+Δx,y)) + \\
  \frac{1}{Δy^2}(u(t-Δt,x,y-Δy)-2u(t-Δt,x,y)+u(t-Δt,x,y+Δy))
```

離散化
Δt=1, t=0,1,2,...
Δx=1, x=0,1,2,...,len
Δy=1, y=0,1,2,...,len
とします。

```math
\frac{1}{s^2}(u(t,x,y)-2u(t-1,x,y)+u(t-2,x,y)) \\ 
= (u(t-1,x-1,y)-2u(t-1,x,y)+u(t-1,x+1,y)) + \\
  (u(t-1,x,y-1)-2u(t-1,x,y)+u(t-1,x,y+1))
```

t=0のとき

```math
u(0,x,y) = 2u(-1,x,y)-u(-2,x,y)) + \\ 
 s^2(u(-1,x-1,y)-2u(-1,x,y)+u(-1,x+1,y) + \\ 
     u(-1,x,y-1)-2u(-1,x,y)+u(-1,x,y+1))
```

u(-1,x,y),u(-2,x,y)は初期条件です。

u(t,-1,y),u(t,len+1,y),u(t,x,-1),u(t,x,len+1)
u(t,-2,y),u(t,len+2,y),u(t,x,-2),u(t,x,len+2)
は境界条件です。

# Processingで可視化
t2は現在の分布、t1は1時刻前の分布、t0は2時刻前の分布です。
境界条件はすべて値0に固定しています。
時刻0でt2の中央に値を持たせています。波紋が広がっていく様子が分かります。

```java
float s2 = 0.2;
float[][] u0;
float[][] u1;
float[][] u2;
PImage img;
int step = 1000;

void setup() {
  size(500, 500);
  init();
  //noSmooth();
  frameRate(30);
}

void draw() {
  for (int i=0; i<step; i++)
    for (int j=0; j<step; j++)
      img.pixels[i*step+j] = color(255-u2[i][j], 100, 100);
  img.updatePixels();
  image(img, 0, 0, width, height);
  for (int i=0; i<4; i++) // speed up
    updateTime();
}

void init()
{ 
  u0 = new float[step][step];
  u1 = new float[step][step];
  u2 = new float[step][step];
  u2[step/2][step/2] = 10000;
  img = createImage(step, step, RGB);
  colorMode(HSB, 255*100/68, 100, 100);
}

void updateTime()
{
  for (int i=0; i<step; i++) {
    for (int j=0; j<step; j++) {
      u0[i][j] = u1[i][j];
      u1[i][j] = u2[i][j];      
    }
  }

  for (int i=0; i<step; i++) {
    u2[0][i] = 0;
    u2[step-1][i] = 0;
    u2[i][0] = 0;
    u2[i][step-1] = 0;
  }
  
  for (int i=1; i<step-1; i++) {
    for (int j=1; j<step-1; j++) {
          u2[i][j] = 2*u1[i][j] - u0[i][j] +
      s2*(u1[i-1][j]-2*u1[i][j]+u1[i+1][j] +
          u1[i][j-1]-2*u1[i][j]+u1[i][j+1]);
    }
  }
}
```

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/TBJ7cMks86U/0.jpg)](http://www.youtube.com/watch?v=TBJ7cMks86U)
WordPressでマルチサイトのWP-Cronの実行方法

#1.シングルサイトでのwp-cronの場合には
WordPressで通常のシングルサイトによけるWP-Cronの実行の仕方は、たくさんあります。

簡単にあげれば
１．誰かが訪問時にWP-Cronが起動する方法
２．外部のインターネットサイトから●●●.com/wp-cron.phpを読みこんでもらう方法
３．内部のCRONTAB機能を使って、キックする方法

#2.マルチサイトでの問題点

これらがマルチサイトになると、結構厳しいんですね。

上記の１．の誰かが訪問してくれるのをきっかけなんで、来てくれなかった場合の処理が実現できないという。

２．だとマルチサイト化するほど大きい規模となり、サーバー群は大きくなれるけど、１サーバーの場合には、
アクセスが一極集中すると、WP-CRONの実行結果が５００（Internal Server Error）になりがちで、タイムアウトがおきてしまいます。

３．ということで、消去法ですが、内部のCRONTAB機能を使ってタイムアウトを起こさず、時間きっかりに起動する方法を考えました。

#3.どんな実行方法？
Bash WP-Cliを用意します。Linux系ならWp-Cliをインストールします。（詳細は割愛）

以下のシェルを作って、定期的に実行です。

    #!/bin/sh
    WP_INSTALL_PATH="/var/www/vhosts/example.com/httpdocs"
    for SITE_URL in $(/usr/local/bin/wp site list --fields=domain,path,archived,deleted --format=csv --path="$WP_INSTALL_PATH" | grep ",0,0$" | awk -F ',' '{print $1 $2}')
    do
        echo "site:$SITE_URL ========"
        for EVENT_HOOK in $(/usr/local/bin/wp cron event list --format=csv --fields=hook,next_run_relative --url="$SITE_URL" --path="$WP_INSTALL_PATH" | grep now | awk -F ',' '{print $1}')
        do
            if [ $EVENT_HOOK != "do_pings" ]; then
                echo "event_hook:$EVENT_HOOK"
                echo `date +"%Y/%m/%d %H:%M:%S"` start
                echo "wp cron event run $EVENT_HOOK --url=$SITE_URL --path=$WP_INSTALL_PATH"
                /usr/local/bin/wp cron event run "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_INSTALL_PATH" --no-color
                echo `date +"%Y/%m/%d %H:%M:%S"` end
            else
                echo "event_hook:$EVENT_HOOK"
                echo `date +"%Y/%m/%d %H:%M:%S"` start
                echo "wp cron event delete $EVENT_HOOK --url=$SITE_URL --path=$WP_INSTALL_PATH"                /usr/local/bin/wp cron event delete "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_INSTALL_PATH" --no-color                echo `date +"%Y/%m/%d %H:%M:%S"` end
            fi
        done
    done

WP-CLIを使って、CRONのEVENTを走らせます。
途中の文中にある"do_pings"は、うちのサーバーで溜まりやすいゴミを消去（delete）するスペシャルロジックを入れています。

検索で海外にあったFAQだったのを日本用に転用して書き直しました。
また、このCRONTABに登録するときは、以下の設定にしています。

    0 4 * * * ( /bin/sh /var/www/vhosts/cron-●●●.sh > /var/log/cron-●●●.log 2>&1  ) ; ( cat /var/log/cron-●●●.log    | Mail -s "`hostname` GET wp-cron" メールアドレス )

#4.最後に

今回、初めてmarkdown記法で書く記事なので、文章がだらだらーと書いていますが、読みづらくてすみませんでした。
Raspberry PiにシステムワイドなNode.jsをndenvで入れる


Raspberry PiにNode.jsを入れる場合aptを使って入れるのが簡単ではありますが、バージョンが少々古くなってしまうのでndenvを使って最新のv5.0を入れました。
GPIOの操作などでsudoをするのでシステムワイドに入れます。

### [ndenv](https://github.com/riywo/ndenv),[node-build](https://github.com/riywo/node-build)をrootで入れる

以下rootで作業します。

```
cd /usr/local
git clone https://github.com/riywo/ndenv.git
cd /usr/local/ndenv
git clone https://github.com/riywo/node-build.git plugins/node-build

echo 'export NDENV_ROOT=/usr/local/ndenv' >> /etc/bash.bashrc
echo 'export PATH=$NDENV_ROOT/bin:$PATH' >> /etc/bash.bashrc
echo 'eval "$(ndenv init -)"' >> /etc/bash.bashrc

echo 'Defaults !secure_path' >> /etc/sudoers.d/00_base
echo 'Defaults env_keep += "PATH NDENV_ROOT"' >> /etc/sudoers.d/00_base

```

`$SHELL -l`して`ndenv --versioin`が通ればOKです。
ユーザ`pi`に戻ります。

### Node.jsを入れる

```
sudo ndenv install v5.0.0
sudo ndenv global v5.0.0
sudo ndenv rehash
```

ユーザ`pi`に戻って`node -v`が通ればOKです。
JitPack.ioを使ってみる


[JitPack.io](https://jitpack.io/)はGitHubのコードを直接mavenやgradleやsbtで使えるようにするためのサービス。

ちょこっとしたコード片をプロジェクト間で共有したい時とかにMaven Centralのアカウント作ったりとか萎えるので、今まではついついコピペしてたのだけど、これからはJitPackを使っていこうと思う。

以下はsbtの例だけど、シンプルなのでmavenもgradleもほとんど変わらないはず。

Maven Centralとかに上げるのであればbuild.sbtにpublishToとかを書くことになるけど、JitPackはパッケージングもしてくれるのでbuild.sbtはミニマルでよい。

* https://github.com/edvakf/play-requestcount/blob/master/build.sbt

Releaseを作る。build.sbtのversionの部分と同じ名前じゃなくてもいけた。CIで自動的にリリースを作るとか凝ったことをしない場合はGitHubの画面上でできる。

* https://github.com/edvakf/play-requestcount/releases

次にJitPackのサイト上でGitHubのリポジトリのURLを入れると、

![JitPack___Easy_to_use_package_repository.png](https://qiita-image-store.s3.amazonaws.com/0/5978/5ff17508-3768-1121-5825-02b0ed67f7c9.png "JitPack___Easy_to_use_package_repository.png")

バージョン一覧が出てきて、"Get It"というのを押すと、ライブラリを使う側のbuild.sbtに書く内容が出てくる。

パッケージングもしてくれるので、初めて使うときはsbtのダウンロードのところでめちゃくちゃ待たされるのが難点。2回めからは速い。

[ドキュメント](https://jitpack.io/docs/)を読むと、実はそもそもタグを打つ必要も無くて、コミットハッシュを指定したりすることもできるらしい。あとプライベートリポジトリも有料で使える。
TypeScriptでEventEmitter2を使う



```ts
/// <reference path="../typings/eventemitter2/eventemitter2.d.ts"/>

class Hoge extends EventEmitter2{
  constructor() {
    super();
    EventEmitter2.call(this);
  }
}

var hoge = new Hoge();
hoge.on("hoge", function(ev: string){
  console.log(ev);
});

hoge.emit("hoge", "hello");
```
[TeX] input{file}のパス指定


# \\input{file}

$\mathrm{\TeX}$で論文とかそこそこ長い文章を書くときは`\input{file}`を使ってファイルを入れ子にする。
でもこのfile名、基本は相対パスで書くけれど、実はコンパイル実行時の**作業ディレクトリ**からの相対パスだったりします。

```tex:document.tex
\documentclass[12pt]{article}

    \input{config.tex}

\begin{document}

    \input{introduction.tex}

\end{document}
```

普通はこうする。

```bash:normal
    $ latex document.tex

    -------
 |__ _  parent/  
    |__ _tex-files/      # 作業ディレクトリ
       |
       |_  document.tex
       |_  config.tex
       |_  introduction.tex
```

何も問題ない。
じゃあ次はどうなるか

```bash:on-parent
    $ latex _tex-files/document.tex

    -------
 |__ _  parent/       # 作業ディレクトリ 
    |__ _tex-files/
       |
       |_  document.tex
       |_  config.tex
       |_  introduction.tex
```

本文もファイルたちの相対位置も変わっていないけれど、これだとエラーが出る。
作業ディレクトリの下にconfig.texもintroduction.texも見つからないからだ。

じゃあこれはどうだ

```bash:on-parent
    $ latex ../dir1/document.tex

    -------
 |__ _  parent/
    |__ dir1/
    |  |
    |  |_  document.tex
    |
    |__ dir2/       # 作業ディレクトリ 
       |
       |_  config.tex
       |_  introduction.tex
```

想像の通り問題なく通る。

---

どこからコンパイルしても正しく動作するようにするには、
やはり絶対パスを書くしかない。
しかし絶対パスで書いてしまうと可搬性がなくなってしまう。
とりあえず思いつく解決策としては、どこからコンパイルしようともlatexコマンドは規定の作業ディレクトリで起動するようなスクリプトを組み、
latexではなくそのスクリプトを通してコンパイルする、といった手法だろうか。

[現在計画中](http://qiita.com/inon3135/items/71ba84c32fedf870ca98 "Makefile TeX compile")。
kdumpを使えないEC2でnetconsoleを活用してkernel panic時のstack traceを取得する(追憶編 : RHEL等での対応)

##概要
下記ページのnetconsoleがうまく導入できないよ。なんかnetpoll対応してないとかdmesgに出たよ。と若い人達に言われたのでちょっと調べてみた。

http://qiita.com/kentaost/items/7547ac0aff06803d20d4

##RedHatなどの少し古いネットワークドライバを持つ環境では動かない!!
少し調べてみた所、拡張ネットワーキング環境ではixgbevfのnetpoll対応がないと動かないようだ。

https://github.com/torvalds/linux/commit/688ff32db2f7e7074df4eb6871afa65dee41c98f

ドライバを取り敢えず入れ替えてみる。

##RedHat7系等でのドライバ入れ替え手順(ixgbevf-2.16.4)
```RHEL
# yum -y update
# yum -y install gcc make kernel-devel kernel-headers wget
# reboot
# wget "http://downloads.sourceforge.net/project/e1000/ixgbevf%20stable/2.16.4/ixgbevf-2.16.4.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fe1000%2Ffiles%2Fixgbevf%2520stable%2F2.16.4%2F&ts=1444882282&use_mirror=jaist" -O ixgbevf-2.16.4.tar.gz
# tar xzf ixgbevf-2.16.4.tar.gz
# cd ixgbevf-2.16.4/src/
# make install
# echo "options ixgbevf InterruptThrottleRate=1,1,1,1,1,1,1,1" > /etc/modprobe.d/ixgbevf.conf
# dracut -f
# reboot
```

最新のドライバを入れてみると下記と同様の挙動が確認できた。

http://qiita.com/kentaost/items/7547ac0aff06803d20d4

##まとめ
ドライバ側の対応で何とかなることが確認できる場合は、ドライバ更新でうまくいきそう。
JSだけでFB:OGP情報をなるべくいつも最新のものにするための対策

以下のスクリプトをページ内に仕込んでおくことで、表示したページのOGP情報のクリアのリクエストを送信する。

```js
$(function(){
  $.post('https://graph.facebook.com',{
    'scrape' : true,
    'id' : location.href
  });
})
```
Android Studio 1.4でJUnit4

Androidもやっとこさ正式にJUnit4に対応したとのことで、Test Support Libraryを使った現時点でのおまじない手順をメモっておきます。（おそらくしばらくは変わらないんじゃないかな…）

# 環境
 * Android Studio 1.4

# 手順
 * build.gradleに1+2行追加してgradle syncする。

```groovy:build.gradle
android {
    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"  
    }
}

dependencies {
    androidTestCompile 'com.android.support.test:runner:0.4'
    androidTestCompile 'com.android.support.test:rules:0.4'
}
```

 * テストクラスを生成する。自動生成ウィザードを使いたい場合にはテスト対象のクラス名を選択した状態でoption+Enter -> Create Testを選ぶ。ウィザードではJUnit4を選択する。
 * 実行したいテストメソッドを含むクラスの宣言に`@RunWith(AndroidJUnit4.class)`というアノテーションをつける。
 * JUnit4なのでテストメソッドには`@Test`アノテーションをつける。
 * JUnit4ではJUnit3のようにTestCaseクラスを継承しないので、assert*メソッドがそのままでは自動補完されない。assertまで入力し、Ctrl+spaceを2回押して候補を表示させた後、option+Enter -> import staticallyを選択し、static importする。

```java:HogeTest.java
package youten.redo.junit4;

import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static junit.framework.Assert.assertEquals;

@RunWith(AndroidJUnit4.class)
public class HogeTest {

    @Test
    public void testHoge() throws Exception {
        int expected = 2;
        int actual = 1 + 1;
        assertEquals(expected, actual);
    }

}
```

【よもやま】
手元の環境では、RunWithアノテーションはなくても動作してしまいました。特別なアノテーションを使うとか、古いAndroidバージョンのデバイスでJUnit4したい際でなければだいじょうぶなのでしょうか？詳細は追っていませんあしからず。
カジュアルにCloudFrontを使って動的コンテンツと静的コンテンツを振り分け

## はじめに
[AWS WAF](https://aws.amazon.com/jp/waf/)を適応した構成を提案する機会がありそうなので、WAFが適応しやすい構成でELBの前にCloudFrontを持ってきたインフラアーキテクトを試してみたかったので、そのまとめです。

## 今回の全体イメージ
![cloudfront_multisite.png](https://qiita-image-store.s3.amazonaws.com/0/24337/71634f93-82fe-ac70-bfe8-88ca3483f0e1.png "cloudfront_multisite.png")

## 動的コンテンツ
http://dxxxxxxxxxxxxx.cloudfront.net
![ec2_page.jpg](https://qiita-image-store.s3.amazonaws.com/0/24337/2acd6b9e-dbd8-653a-d5c5-a69807175067.jpeg "ec2_page.jpg")

## 静的コンテンツ表示（画像）
http://dxxxxxxxxxxxxx.cloudfront.net/img/sumou.jpg
![sumou.jpg](https://qiita-image-store.s3.amazonaws.com/0/24337/d6d71703-1d6f-e4f6-86bc-688310ee865c.jpeg "sumou.jpg")

## 静的コンテンツ表示（PDF）
http://dxxxxxxxxxxxxx.cloudfront.net/test.pdf
![test_pdf.jpg](https://qiita-image-store.s3.amazonaws.com/0/24337/0af21c73-f0e6-2dd5-4fcd-4a3ab579755a.jpeg "test_pdf.jpg")


## CloudFrontのマルチオリジン設定
Origin Domainに以下の３つを登録する

- ELBのendpoint
- 画像用バケット
- PDF用バケット


![kobito.1444920804.868197.png](https://qiita-image-store.s3.amazonaws.com/0/24337/2cd43d21-50e8-d39a-32d1-b623e84d3f2e.png "kobito.1444920804.868197.png")


## Behaviors設定
Path Patternで振り分け設定する

![kobito.1444921082.172782.png](https://qiita-image-store.s3.amazonaws.com/0/24337/a6604b02-1f12-a4f2-2ac3-c792011b0db7.png "kobito.1444921082.172782.png")

## ポイント
- S3のwebhosting有効にしていないとドメインが変わるので忘れないこと
- 静的コンテンツはTTLは長めで
- 動的コンテンツは最小限orキャッシュしない
- TTLの単位は秒
- CloudFrontでDistribution作ることきはELB、S3の順序はどちらでもいい
- 検証でサクッと確かめるならTTLは、この設定がオススメ（minTTL:1, defaultTTL:1, maxTTL:1）
- CloudFrontで独自ドメイン使うならSSL証明書アップロードすれば使用可能
- この構成なら[AWS WAF](https://aws.amazon.com/jp/waf/)が適応しやすい

## 雑なイラスト
![2015-10-15 23 29 01 1](https://cloud.githubusercontent.com/assets/7463172/10518127/ed45c8a0-739a-11e5-9257-72e6f2e63892.jpg)
AWS IoTを通してRaspberry Pi 2のLチカを実装

## 概要
さて、電子工作のHello Wordで有名なLチカ、LEDをつけてそれをチカチカさせるやつです。
これをAWS IoTを経由してやってみました。プログラム自体はnode.jsで書いています。

![FullSizeRender.jpg](https://qiita-image-store.s3.amazonaws.com/0/65478/45dc120b-d0e2-b770-2774-9925cb3197ab.jpeg)

## 構成
手元のPCをクライアントとしてAWS IoTを経由して信号をラズパイに送り続けます。
ライトを点灯させたい時には「1」を。ライトを消滅させたいときは「0」を送信します。
これを繰り返して信号を送ることでチカチカさせるという仕組みです。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/65478/0f2a62f7-43f6-8d08-dc5c-ed94b81a3b2c.png)


## クライアント側のコード
```js:led-publish.js
var count=0;
device
  .on('connect', function() {
   const minimumDelay=100;
   timeout = setInterval( function() {
      count++;
      var led = count%2;
      device.publish('led', led.toString());
    }, Math.max(args.delay,minimumDelay) );
});
```
setIntervalでループを回します。led変数にはループの回数に応じで0と1が交互に入力されます。このデータをledというtopicでAWS IoTに送信します。

## Raspberry側のコード
```js:led-subscribe.js
var fs = require('fs');
device
  .on('connect', function() {
    console.log('connect');
    device.subscribe('led');
});

device
  .on('message', function(topic, payload) {
    console.log('message', topic, payload.toString());
    fs.writeFileSync('/sys/class/gpio/gpio18/value', payload.toString());
});
```
AWS IoTからの信号を受け取る側のプログラムです。ledというtopicをsubscribeします。
ここに1または0のデータが送信されてくるため、これをRaspberryのGPIOに渡すことでLEDをチカチカさせます

## 結果

[![AWS IoTでLチカ](http://img.youtube.com/vi/zFf1Gv_AdTs/0.jpg)](http://www.youtube.com/watch?v=zFf1Gv_AdTs)

はい、こんな感じでチカチカしてます。
通常、デバイス同士をつなくためにはnode.jsでサーバ立ててwebsocketで通信を確立したりって必要があるんですが、一切不要です。
AWS IoTが提供しているMQTTプロトコルを通したおかげで複雑な設定やプログラミングは一切不要でした。

また、AWS IoTで複数デバイスを管理接続できるので、1つの端末から数百台の端末に同時に命令を送ったりってことも可能になります。

まだまだ、いろんなことができそうっすね。それでは良いIoTライフを！

##参考文献
- [Raspberry Pi 2 GPIO のＬチカテスト Node.jsでもやってみる](http://ngw.jp/~tato/wp/?p=3375)
はじめてのGo言語 3.関数


いままでの記事はこちら
[はじめてのGo言語 2.変数](http://qiita.com/Im0_3/items/aacc2307d0fca3983219)
[はじめてのGo言語 1.環境構築](http://qiita.com/Im0_3/items/aacc2307d0fca3983219)


# 関数の使い方

関数は`func`で記述ができる。
基本は以下のような構成になってます。

```Go:main.go
func 関数名(変数)(戻り値){
	//処理
}
```

以下がその例です。
型の指定は引数は変数名のあとにきます。
そして戻り値の型も指定してあげる必要があります。

```go:main.go
package main

import (
	"fmt"
)

func add(x int, y int) int {
	return x + y
}

func main() {
	fmt.Println(add(1, 2))
}
```

引数内の型が同じであれば型宣言を一部省略できます。

```go:main.go
package main

import (
	"fmt"
)

func add(x, y int) int {
	return x + y
}

func main() {
	fmt.Println(add(1, 2)) //3
}
```

# 戻り値について
Goでは複数の戻り値を返すことができます。
以下のようにカンマで区切れば複数で返すことが可能です。

```go:main.go
package main

import (
	"fmt"
)

func swap(x, y int) (int, int) {
	return y, x
}

func main() {
	fmt.Println(swap(1, 2)) //2 1
}

```

戻り値は先に指定しておくこともできます。
以下のコードでは最終的に`x`、`y`、`z`の値が帰ってきます。

```Go:main.go
package main

import (
	"fmt"
)

func pow(val int) (x, y, z int) {
	x = val * val
	y = x * val
	z = y * val
	return
}

func main() {
	fmt.Println(pow(2)) // 4 8 16
}

```
【超簡単】bundle installがうまくいかないとき

むっちゃくちゃ簡単だけど、すっかり忘れてて調べても（初歩的すぎて）出なかったので、備忘録として。。。


## 状況
新しいGemを導入して、それをローカルに持ってきたらコンソールが立ち上がらない。。という状況。

## 詰まった部分
```
bundle install
```

をしろと言われたのでやってみると、

```
error: cannot open .git/FETCH_HEAD: Permission denied
```
とか

```
Git error: command `git fetch --force --quiet --tags
```
とかよくわかんない。（←ただのアホということもあるが）

## 解決
調べるとsshがどうとか出るけど、私は

```
sudo bundle install
```
+自分のPCのパスワードを入力したら・・・いけた！！！！

アホすぎます。。。

## まとめ
```Permission denied```と言われたらまず、```sudo bundle install```をしようと改めて思いました。

おわり
Fertile Forest Model (1/n) RDB に於けるツリー構造データ [1]

# RDB に於けるツリー構造データ

ツリー構造データは「階層構造データ」とも呼ばれます。ツリー構造データを RDB で扱うモデルの役割は、次の二項に要約されます。

> 1. ツリー構造データを RDB テーブルに格納する。
> 2. 任意のノードについて、「部分木」や「親ノード」「子ノード」「祖先ノード」「子孫ノード」などの関連ノードを**効率的**に取得するクエリを記述する。

## 1. ツリー構造データを RDB テーブルに格納する

ひとつめの項目「ツリー構造データを RDB テーブルに格納する」という機能をモデルが有しているかどうかの基準は、次のように定義できます。

> 保存した全ノードの情報から元の階層構造を再生できること。

ツリー構造データをデータベースに保存したはいいけど、元のツリー構造が再生できないのでは保存したことにはなりません。改めて記述する必要もないほど基本的な事なので、ここに異論を挟む人はいないでしょう。

## 2. 任意のノードについて、関連ノードを効率的に取得するクエリを記述する

ふたつ目の項目は、ツリー構造データを活用する際に、「関連性のあるノード集合を効率的に取得する検索クエリ」が書けるかどうかです。下図のツリー構造データで説明してみます。

```
      [A]
       |
   +---+---+
   |       |
  [B]     [C]
   |       |
 +-+-+   +-+-+
 |   |   |   |
[D] [E] [F] [G]
             |
           +-+-+
           |   |
          [H] [I]
```

「ノード[C]の部分木を取得したい」という場合、人が目視で検索する場合は、ツリー構造図上で[C]から下方に伸びる枝を辿って全ノードをピックアップします。この例では、[C]の部分木の集合は次のようになります。

```
  [C]
   |
 +-+-+
 |   |
[F] [G]
     |
   +-+-+
   |   |
  [H] [I]
```

これは単純作業なので、法則性をコンピュータに教えれば全自動で検索してくれるだろうと考えるのが現代の情報処理の常識です。データ集合から指定条件にマッチする集合を検索するのはデータベースの本領ですので、「ツリー構造データをデータベースに入れれば簡単に検索できるようになるはずだ」と、誰もがそう考えるでしょう。

ふたつ目の項目で肝となるのは「効率的に」というフレーズです。目的のノード集合を検索するための検索時間が実用レベルで収まるなら、それは効率的であると言えるでしょう。

ツリー構造データを活用する際、以下のような集合が頻繁に検索されます。先程の図における例を記載しました。部分木は「基点ノード＋子孫ノード」と同義です。

集合|基点ノード|集合
----+:-------:+:--:
親ノード|[B]|[A]
子ノード|[B]|[D] [E]
先祖ノード|[H]|[A] [C] [G]
子孫ノード|[C]|[F] [G] [H] [I]
部分木|[C]|[C] [F] [G] [H] [I]


# 問題の焦点（新しいモデルが必要な理由）

RDB では、ツリー構造データを扱いにくいことが知られています。もし扱いにくさに関する問題が、ひとつ目の項目「ツリー構造データを RDB テーブルに格納する事」だけなら、世界中のデータベースエンジニアを悩ませる問題は存在しません。なぜなら、部分木を取得するための効率的な検索クエリが記述できないことが証明されている「隣接リストモデル」でも「保存した全ノードの情報から元の階層構造を再生する」のは可能だからです。

ツリー構造データで「効率的な検索クエリを記述する」のが困難である理由は、「任意のノードが有する子孫ノードの階層の深度が固定数ではないこと」が筆頭に挙げられます。指定ノードの子孫ノードの集合を検索する場合、全ノードでノードごとに経路を祖先方向に辿って子孫であるかどうか判定するのなら簡単な話です。しかし、「宣言型プログラミング」である SQL では、検索クエリの途中で個別判定処理は実装できません。

> 宣言型プログラミングでは、どうすれば部分木や祖先ノードの関係性を検索クエリで表現できるのか？

これこそが、世界中のデータベースエンジニアを悩ませ続けてきた難題でした。RDB に於けるツリー構造データの問題は、「任意のノードから関連ノードを効率的に取得する検索クエリを記述する」という一点に尽きます。

# リンク

- [ツリー構造データをRDBで扱うための第五のモデル](http://qiita.com/StewEucen/items/e0487c39285a9d6b7863)
- RDB に於けるツリー構造データ (1)
- [RDB に於けるツリー構造データ (2)](http://qiita.com/StewEucen/items/e5895d9f09beb16c61fd)
- [モデルデザイン](http://qiita.com/StewEucen/items/b4840343c22cea11ec26)
- [ノード検索＜祖先ノード系＞](http://qiita.com/StewEucen/items/632bddd683d77d1cf176)
- [ノード検索＜子孫ノード系＞](http://qiita.com/StewEucen/items/44901b69e2a061e0bc0a)
- [ノード検索＜親戚ノード系＞](http://qiita.com/StewEucen/items/22ba49ab8e591c663c84)
- [ノード追加](http://qiita.com/StewEucen/items/796c6d017dcf32bdb429)
- [ノード移動](http://qiita.com/StewEucen/items/bfb2f84d66929c0c4747)
Typescriptの変数の型定義メモ

##はじめに

Typescriptで、変数の型で何度か悩んだので忘れない為にメモ。

##基本の型

* number・・・数値
* string・・・文字列
* boolean・・・真偽値

##型の定義方法
変数の型定義方法

```lang:typescript
//var 変数名: 型名

var hoge:number;
```

関数の型定義方法

```lang:typescript
//function 関数名 (引数名:引数の型) : 関数の戻り値の型 {}

function hoge(str:string):string{
	return '私の名前は'+ str + 'です。';
}

var s:string = hoge('ポンチ');
```

##any型

any型を使うと、通常のjavascriptのように、
変数に文字列でも、数字でも自由に入れることができる。

```lang:typescript
var n:number = 12345;
n = '12345';//コンパイルエラー

var hoge:any = 12345;
hoge = '12345';//any型の場合コンパイルエラーにならない

//nullも、undefinedもコンパイルエラーにならない
hoge = undefined;
hoge = null;
```

any型は何でも入れられるが、コンパイラーの型チェックなどが効かなくなる。
ライブラリを使用した際に、型定義ファイルが無い場合などに使用する。

##型推論
全てに型定義の記載をすると、コードが長くなる場合がある。
その場合はコードの文脈（変数の初期化や、戻り値の型など）によって、型が推測できる場合は、
型定義を省略できる。

```lang:typescript
var str = '';
str = 123;//初期化時に文字列を入れている為、変数の型定義無しでもコンパイルエラーとなる。
```

```lang:typescript
function hoge(n:number):void{
	alert(n *10);
}

var num = 10;
hoge(num);

var str = 'あいうえお';//引数の型定義をしている為、変数の型定義無しでもコンパイルエラーとなる。
hoge(str);
```

##変数にオブジェクトを入れる場合の型定義方法

基本的には下記のように定義する。

```
var obj: {key: string} = {key:'string'};
```

引数としてオブジェクトを渡す場合

```lang:typescript
function hoge(obj: { key1: string; key2: number; }): void {
    
}
hoge({ key1: "ABC", key2: 123 });
```

####◎プロパティを省略する
下記のように指定したプロパティのキー（key）の定義が無いとコンパイルエラーになる。
省略可の識別子として**?**を使用することで、型定義済みのキーを省略してもエラーが発生しなくなる。

```lang:typescript
var obj: {key: string} = {};//エラーになる
var obj2: {key?: string} = {};//省略してもエラーにならない
```

##変数に配列を入れる場合の型定義方法

基本的には下記のように定義する。

```lang:typescript
var array:string[] = ['A','B','C'];
var array2:number[] = [1,2,3];
```

####◎2次元配列

```lang:typescript
var array:string[][] = [['A','B'],['C','D']];
```

####◎配列にオブジェクトを入れる

```lang:typescript
var array : {key:string}[] = [{key:'ABC'},{key:'EFG'}];
var array2 : {key?:string}[] = [{},{}];
```

####◎オブジェクトに配列を入れる

```lang:typescript
var obj:{key:string[]} = {key:['ABC']};
```

##void型

関数の戻り値が無い場合に使う。（それ以外での使いどころがわからなかった・・・）

```lang:typescript
function hoge(str:string):void{
	alert(str);
}

hoge('test');
```

##型定義ファイル
既存のJSライブラリを使う場合などに、ライブラリのクラスやオブジェクトに型定義を行います。
Typescript標準で用意されている型以外は、型定義ファイルを別途読み込む必要があります。

####◎jQueryを使ってみる

下記の記載だとコンパイルエラーになる。

```lang:typescript
var j = $('body');
```

型を定義してみても、コンパイルエラーとなる。

```lang:typescript
var j:JQuery = $('body');
```

コンパイルを通すには、jQueryの型定義をする必要があります。

①まず型定義ファイルを用意します。
下記から、<a href="https://github.com/borisyankov/DefinitelyTyped/blob/master/jquery/jquery.d.ts">jquery.d.ts</a>をダウンロードします。
><a href="https://github.com/borisyankov/DefinitelyTyped" target="_blank">https://github.com/borisyankov/DefinitelyTyped</a>

tsd（型定義ファイル管理ツール）コマンドを使ってもインストールできます。

```
tsd install jquery
```
tsdのインストール、使い方については下記が分かりやすかったです。

><a href="http://qiita.com/grapswiz/items/72012f283de23385553a" target="_blank">TypeScriptの型定義ファイル管理ツールtsdを使ってみた</a>

②referenceタグを使用して、ダウンロードしたjQueryの型定義ファイルを読み込みます。

```lang:typescript
/// <reference path="jquery/jquery.d.ts" />

```

こちらだと、コンパイルエラーにならない。

```lang:typescript
/// <reference path="jquery/jquery.d.ts" />
var j = $('body');
var j2:JQuery = $('body');
```

※ jquery.d.tsは型定義用の為、jQueryのライブラリは別途読み込む必要があります。
線形探索ではなく2分木探索した方がいいサイズってどれくらいなのか

ふと思ったので調べてみた

適当にやっているだけなので真に受けないでください

[catatsuy/linear_binary_compare](https://github.com/catatsuy/linear_binary_compare)

```go
package main

import (
	"math/rand"
	"testing"
	"time"
)

const (
	Size = 75
)

func BenchmarkLinearSearch(b *testing.B) {
	b.StopTimer()

	lists := make([]int, 0)
	for i := 0; i < Size; i++ {
		lists = append(lists, i)
	}
	rand.Seed(time.Now().UnixNano())

	b.StartTimer()

	for i := 0; i < b.N; i++ {
		target := rand.Intn(len(lists))
		for _, v := range lists {
			if target == v {
				break
			}
		}
	}
}

func BenchmarkBinarySearch(b *testing.B) {
	b.StopTimer()

	lists := make([]int, 0)
	for i := 0; i < Size; i++ {
		lists = append(lists, i)
	}
	rand.Seed(time.Now().UnixNano())

	b.StartTimer()

	for i := 0; i < b.N; i++ {
		start, end := 0, len(lists)-1
		target := rand.Intn(len(lists))
		for start <= end {
			pivot := (start + end) / 2
			if lists[pivot] < target {
				start = pivot + 1
			} else if lists[pivot] > target {
				end = pivot - 1
			} else {
				break
			}
		}
	}
}
```

手元のMacBook Proでは75くらいで前後し始めた。それより小さいサイズでは線形探索の方が早い。

こういうときにGoを使うの、サクッとかけるし正確なベンチが取れそうな気がする。

それとこれはあくまでも平均で、最悪実行時間は線形探索の方が遅いはずなので実際はこれよりも小さいサイズでも2分木探索の方が良いはず。
失敗した

昨日某アニメの再放送を見て、朝気付いたら作ってあったので載せます。

###プログラム
```letter.py
#coding:utf8
import random
miss = '失敗した'
watashi = 'わたしは'
watashi_num = 3
iteration = 40
I = [random.randint(0, iteration) for i in range(watashi_num)]
letter_string = ''

for i in range(iteration):
    if i in I:
        if I.index(i) == 0: letter_string += watashi
        else: letter_string += '\n' + watashi
    letter_string += miss

print letter_string[:-6]
```
###出力
```
失敗した失敗した失敗した失敗した失敗した失敗した失敗したわたしは失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗した
わたしは失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗した
わたしは失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗した失敗
```

###
とふざけましたが、建前としては`random`の紹介です。
`random.randint()`は第一引数から第二引数までの整数値をランダムに返してくれるものです。

あと、最後の行は、なぜ`-6`にしてるかというと、'した'の２文字6個必要となります。
なので今回最後の「した」の二文字がいらなかったのでスライスで消しました。
焦電型赤外線センサ PaPIRs を使う


焦電型赤外線センサ PaPIRs の VZ シリーズが[秋月で売っていた](http://akizukidenshi.com/catalog/goods/search.aspx?search=x&keyword=papirs&image=%8C%9F%8D%F5)ので買ってみた。

![20151015-DSC04523.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/5d540d93-069a-159a-ac00-dac52fcdc486.jpeg "20151015-DSC04523.jpg")


最初 OUT から直接出力をとろうとして判定できなくて困った、という大変初心者的なハマり方(ハイ初心者です…)をしてしまったのでメモ。ふつうに抵抗(10KΩ程度 ->GND)入れて出力とりましょう…ハイ…。


![IMG_0048.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/f3497caa-e473-b8d3-f78d-578231f85278.jpeg "IMG_0048.jpg")
簡易版SVG作成ライブラリ(C++版)

# 概要
以前，C++でSVGを書くための簡易的なライブラリを作成したのでご紹介．主に研究用途でベクタ形式の図がいる時に使っています．

#ダウンロード
- https://github.com/tmichi/SvgDrawer

# SvgDrawerクラス
## コンストラクタ，デストラクタ
- ``SvgDrawer( const int width, const int height, const std::string& filename = std::string( "draw.svg" ) )``
コンストラクタ．(width, height)はSVGファイルの画像(?)サイズ.　filenameは出力ファイル名
- ``void setViewBox ( const double mnx, const double mny, const double mxx, const double may )``
描画可能範囲の指定．

## 属性の設定
- ``void init ( void )``
各種パラメータの初期化．破線を実線にして，線幅を１，線の色，塗りつぶし色を黒にする．
- ``void setStrokeWidth ( const double width )``
線幅を設定する．
- ``void setStrokeColor( const std::string &col )``
線の色を設定する．色は，文字列で与える．"#AAC032"のような16進法，"yellow"のような直接指定する方法，SVGで使われている方法であればok．
- ``void setFillColor( const std::string &col )``
塗りつぶし色を指定．
- ``void setStrokeDash( const int dash_pitch )``
破線の間隔を指定．

## 描画
幾何要素を実際に描きます．色などの属性は，クラス内で設定されたものを使います．

- ``void drawLine ( const double x0 , const double y0, const double x1, const double y1 )`` 
(x0, y0) - (x1,y1)に線を引く．座標系はsetViewBoxで指定したものが使われる．
- ``void drawCircle ( const double cx, const double cy, const double r )``
(cx, cy)を中心とした半径rの円を描く
- ``void drawRect ( const double x0, const double y0, const double w, const double h )``
(x0, y0)を原点として，サイズ(w,h)の視覚を描く

#例題
- コンパイル時に標準ライブラリ以外は必要ありません

```C++:example.cpp
#include "SvgDrawer.hpp"

int main ( int argc, char** argv ) {
	mi::SvgDrawer drawer ( 300, 300, "test.svg");/// サイズは300x300 
	drawer.setViewBox( -2, -2, 2, 2); //(-2,-2)-(2,2)の範囲
	
	drawer.setStrokeColor("red");
	drawer.drawLine(-1.5, -1.5, -1.5, 1.5);
	drawer.setStrokeColor("blue");
	drawer.drawLine(-1.5, 1.5, 1.5, 1.5);
	drawer.setStrokeColor("yellow");
	drawer.drawLine(1.5, 1.5, 1.5, -1.5);
	drawer.setStrokeColor("green");
	drawer.drawLine(1.5, -1.5, -1.5, -1.5);
	// automatically saved
	return 0;
}
```
##結果
```xml:test.svg
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width= "300" height="300">
<line x1="37.5" y1="262.5" x2="37.5" y2="37.5" stroke-width="1" stroke="red" />
<line x1="37.5" y1="37.5" x2="262.5" y2="37.5" stroke-width="1" stroke="blue" />
<line x1="262.5" y1="37.5" x2="262.5" y2="262.5" stroke-width="1" stroke="yellow" />
<line x1="262.5" y1="262.5" x2="37.5" y2="262.5" stroke-width="1" stroke="green" />
</svg>
```
![test.png](https://qiita-image-store.s3.amazonaws.com/0/74252/daf71977-88ff-0cdb-2122-4f615c069739.png)
画像の比率を崩さずUIImageViewに表示させる

# 条件
・表示したい画像の縦横比が異なる。

# やりたいこと
・UIImageViewで表示する際には正方形にしたい。
・比率を崩さずはみ出した分は切り抜いて表示したい。

# 方法
Interface Builderで対象のUIImageViewを選択し、Attributeインスペクタで「Mode > Aspect Fill」を選択「Drawing > Clip Subviews」をチェック」

(Xcode7で実施)
Arduino の attachInterrupt() での割り込み処理


ロータリーエンコーダや感知センサ、ボタンのプッシュなどで、値の変化を即座に検知し反応したい場合、メインループで状態検知を行ってると別処理中で反応できなかったりする。そのために割り込みピンの変化時に割り込み処理をすることで対応する。

- https://www.arduino.cc/en/Reference/AttachInterrupt

Arduino Uno で Interrupt に割り当てられてるピンはデジタルピンの2(INT0)と3(INT1)。

![](https://www.arduino.cc/en/uploads/Hacking/Atmega168PinMap2.png)

```
attachInterrupt(digitalPinToInterrupt(2), callback_function, CHANGE);
```

と記述することで、デジタルピン2が変化したとき(CHANGE)、callback_function が割り込み処理として実行される。どのように状態が変わったかで呼ばれるかの定義は、以下の定数で指定する。

- LOW to trigger the interrupt whenever the pin is low,
- CHANGE to trigger the interrupt whenever the pin changes value
- RISING to trigger when the pin goes from low to high,
- FALLING for when the pin goes from high to low.

LOW と FALLING の違いがわからない(変化は HIGH -> LOW だから違いがあるのかな…)。

またオフィシャルドキュメントには罠があって、pin が 13 だと動かないと思う。ので

```
int ledPin = 13;
int interruptPin = 2;
volatile int state = LOW;

void setup() {
    pinMode(ledPin, OUTPUT);
    attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
    digitalWrite(pin, state);
}

void blink() {
    state = !state;
}
```

みたいに記述する必要がある。

なお、意図しない最適化を防ぐため、割り込み関数の内部で変更する変数は ```volatile``` 修飾子を忘れずに。
テキストボックスをクリックすると、ドロップダウンリストが出てくるDOJOコード

テキストボックスをクリックすると、ドロップダウンリストが出てくるDOJOコード。タブフォーカスでもでてくるよ。

```js
require(["dojo/store/Memory",
	"dijit/form/FilteringSelect",
	"dojo/domReady!"], 
function(Memory, FilteringSelect, TextBox, dom){
	var mDropdownList = new Memory({
		data: [
			{id: "0", name:"A"},
			{id: "1", name:"B"},
			{id: "2", name:"C"},
			{id: "3", name:"D"},
			{id: "4", name:"E"}
		]
	});
	var DropdownList= new FilteringSelect(
	{
		id: "DropdownList",
		"class": "classDrop",
		store: mDropdownList,
		searchAttr: "name",
		onClick: function(){
			DropdownList.domNode.childNodes[0].style.display = "block";
			DropdownList.loadDropDown();
		},
		onBlur: function(){
			DropdownList.domNode.childNodes[0].style.display = "none";
		}		
	}, 
```
Scalaのデフォルト実行コンテキストの並列数を変える方法


`Future` のデフォルトや parallel collection はデフォルトの実行コンテキスト(`ExecutionContext`)を使って実行されます。
デフォルトの実行コンテキストは、実行機器のコア数分だけスレッドをプールします。

たとえば大きいリストを作って parallel collection で処理中のスレッド確認すると、コア数分あることがわかります。

```
scala> List.tabulate(100000)(identity).par.map(_ => Thread.currentThread.getId).distinct.size
res1: Int = 8 // このマシンは8コア
```

システムプロパティを設定することで、コア数ではなく望みのスレッド数に変更できます。

[Scala 2.11.7 のこの辺](https://github.com/scala/scala/blob/v2.11.7/src/library/scala/concurrent/impl/ExecutionContextImpl.scala#L60-L72) をみるとどうすればいいかわかります。

* `scala.concurrent.context.minThreads` -- 最小スレッド数。デフォルト 1。
* `scala.concurrent.context.numThreads` -- desired? スレッド数。デフォルトコア数。
* `scala.concurrent.context.maxThreads` -- 最大スレッド数。デフォルトコア数。

で `min(max(minThread, numThread), maxThread)` がデフォルト実行コンテキストのスレッド数です。

さて、32スレッドまで上げてみましょう。
上の式から8コアのマシンで32スレッドにするには numThread および maxThread を32に設定すればいいことがわかります。 numThread の設定だけではダメなことに注意が必要ですね。

```
$ scala -Dscala.concurrent.context.numThreads=32 -Dscala.concurrent.context.maxThreads=32

scala> List.tabulate(1000000)(identity).par.map(_ => Thread.currentThread.getId).distinct.size
res1: Int = 32
```

ソースを見た人は気づいたと思いますが `x4` などという形でコア数のn倍を表現できます。32のところは x4 としても (8コアのマシン上では) 同じです。

```
$ scala -Dscala.concurrent.context.numThreads=x4 -Dscala.concurrent.context.maxThreads=x4
```

最小スレッド数を 4 に設定（コア数がそれより大きい場合にはコア数に設定）するにはどうしたらいいでしょう？
minThread=4 に設定するだけだと、コア数が 4 より小さい場合、maxThread が 4 より小さくなるため、スレッド数は 4 より小さくなってしまいます。 minThread=4, maxThread=x4 に設定すれば、やりたいことが実現できそうです。

設定する際は `min(max(minThread, numThread), maxThread)` を頭に入れて、うーんと唸ってから設定する必要がありそうですね！
スマホ対応の超軽量VanillaなJavaScriptドラッグ＆ドロップ

HTML5の標準でDrag&Dropが実装されましたので、jQueryなどを使わなくてもドラッグ＆ドロップが簡単に実現できるようになりました。
しかしマウスイベントのみという状況なので、iPhoneなどのマウスを使わない、TouchイベントのデバイスではjQueryに頼っているという人も多いと思います。

jQueryやプラグインを使用しなくても、以下の様なVanillaの簡単なコードでリストの並び替えができます。

```html:HTMLコード
<ul>
	<li>One</li>
	<li>Two</li>
	<li>Three</li>
</ul>
```


```js:JavaScriptコード
var lis = document.querySelectorAll('li');
var draggingItem;
[].forEach.call(lis, function(li){
	li.setAttribute('draggable', true);
	li.addEventListener('touchstart', function(e){
		draggingItem = li;
	});
	li.addEventListener('touchend', function(e){
		draggingItem = null;
	});
	li.addEventListener('touchmove', function(e){
		e.preventDefault();
		var getOrder = function(elem){
			return [].indexOf.call(elem.parentNode.children, elem);
		}
		var pointedElement = document.elementFromPoint(e.pageX - window.pageXOffset, e.pageY - window.pageYOffset);
		if(!pointedElement.getAttribute('draggable') || pointedElement == draggingItem) return;
		var order = getOrder(pointedElement) - getOrder(draggingItem);
		if(order > 0) {
			pointedElement.parentNode.insertBefore(pointedElement, draggingItem);
		} else if (order < 0) {
			pointedElement.parentNode.insertBefore(draggingItem, pointedElement);
		}
	});
});
```

実際に動くデモは以下に置いています。
[デモ](http://egashira.jp/a8)
Flash Builder で作成した Flex プロジェクトを Intelli J で開く手順


完全な私的備忘録です。

Flash Builder で作成したプロジェクトは以下の構成になっています。

```
project-root
 ｜- assets
 ｜- bin-debug
 ｜- bin-release
 ｜- html-template
 ｜- libs
 ｜- src
```


## プロジェクト作成

1. Create new Product
Flash を選択し、SDKのパスを設定
例: /Library/Flex/sdks/4.6

2. 既存の Flex プロジェクトのディレクトリを選択

完了でプロジェクトが開きます。

## 設定

プロジェクト設定画面を開き、左からModulesを選択。

ツリーのプロジェクト名を選択し、右に表示されたプロジェクトツリーの src ディレクトリを Sources に指定。
(右クリック or 上部の Mark as のトグルで選択)

次に、ツリーのプロジェクト名(app)を選択し、以下を設定。

1. Generalタブ
 - Main class の確認(違っていれば変更)
 - Output folder 確認
  use HTML wrapper に html-template を選択
2. Dependenciesタブ
  - + のサブメニュー [New Library...] から libs フォルダを追加し、OKボタンにて設定画面を閉じる


ここまでしたら Build - Make Project にて、コンパイル。


## エラー

コンパイルすると、以下のエラーが発生。

```
unable to resolve 'assets/images/error.png' for transcoding
Unable to transcode assets/images/error.png.
...
A file found in a source-path must have an externally visible definition. If a definition in the file is meant to be externally visible, please put the definition in a package.
```

Embed の assets ファイルが参照できないエラーが発生したときは以下を確認。（今回はこれでドハマリ）

1. src を Sources に指定した時と同じ手順で、assets の親ディレクトリを Source に設定
2. Embed に指定したパスを確認し、assets の前に / がついていない場合は追加する。

再度、コンパイルしてエラーが出ないことを確認。


今回の場合、assetes ディレクトリが src 以下になっていて、尚且つ assets を / から指定してれば発生しなかったものでした。
Raspberry Pi で F-PLUG のログ収集

# 概要
[販売終了](http://www.fujitsu.com/jp/group/bsc/documents/services/f-plug/f-plug-20150702.pdf)が決まった富士通[F-PLUG](http://www.fujitsu.com/jp/group/bsc/services/f-plug/)のログを，今更ながらRaspberry Piにて集約する．

# 構成
Raspberry Pi の OS には [Raspbian](https://www.raspbian.org/) を使った．また，F-PLUG のデータは Docker コンテナを用いて取得し，[Fluentd](http://www.fluentd.org/) を使って収集することにした．

Raspberry Pi への Docker インストールは[別記事](http://qiita.com/jkawamoto/items/a572ff6630a6107f3ee5)を参照．Fluentdのインストールは[Raspberry Pi に fluentd をインストールする](http://qiita.com/daicham/items/65c8faf1a549e056b365)を参考にした．

# Bluetooth の設定とペアリング
まず，関連パッケージをインストールする．

```shell-session
$ sudo apt-get install bluetooth bluez-utils bluez-compat
```

次に，F-PLUGのアドレスを取得する．

```shell-session
$ sudo hcitool scan
```

得られたアドレスを用いてペアリングを行う．下記のコマンドを実行すると F-PLUG の LED が点滅するので，本体のボタンを長押しする．点滅が止めばペアリングは完了です．

```shell-session
$ sudo bluetooth-agent 1234 <address>
```

最後に，起動時に接続するように設定ファイル `/etc/bluetooth/rfcomm.conf` を編集する．

```/etc/bluetooth/rfcomm.conf
rfcomm0 {
    # Automatically bind the device at startup
    bind yes;
    # Bluetooth address of the device
    device <address>;
    # RFCOMM channel for the connection
    channel 1;
    # Description of the connection
    comment "F-PLUG No.1";
}
```

複数台接続する場合はアドレススキャンから設定の追加までを適宜繰り返す．

設定が終わったら Bluetoothサービスを再起動させておく．

```shell-session
$ sudo service bluetooth restart
```

# データの収集
[データ収集ツール](https://jkawamoto.github.io/fplug-logger/)を作った（と言ってもライブラリを叩くだけ）ので，これを利用する．Raspberry Pi 用 Docker イメージは [ここ](https://hub.docker.com/r/jkawamoto/rpi-fplug-logger/) にある．このイメージは引数にデータ取得間隔及びデバイスパスなどを取り，F-PLUGから取得したデータを下記の JSON 形式で出力する．

```json
{
  "temperature": "温度",
  "power": "電力",
  "humidity": "湿度",
  "illuminance": "明るさ",
  "time": "UNIX 時刻"
}
```

なので，Docker のログドライバを Fluentd にして実行すれば，後は Fluentd 側で好きに扱えば良い．なお，１プロセスで１デバイスからのデータ取得にしか対応していないので，複数デバイス利用する場合は必要個数分コンテナを起動する必要がある．

コンテナの実行は，

```shell-session
$ docker run -dt --name fplug1 --log-driver=fluentd -v /dev/rfcomm0:/dev/rfcomm0 \
     --privileged jkawamoto/rpi-fplug-logger --interval 10
```

などとする．上記の設定では 10秒ごとにデータを取得する．（デフォルトは１分ごと）
デバイスにアクセスするので `--privileged` を忘れないようにすること．
また，複数台接続している場合は適宜 `-v /dev/rfcomm0:/dev/rfcomm0` の部分を変更する．例えば，rfcomm1を使う場合は `-v /dev/rfcomm1:/dev/rfcomm0`などとすれば良い．

# 参考

  * [Raspberry PiにF-PLUGを2個繋いでみた](http://blogs.yahoo.co.jp/beachinside/11942257.html)
  * [hasegaw/pyfplug@GitHub](https://github.com/hasegaw/pyfplug)
Zopfliで高圧縮gzip・PNGほか

GoogleがZopfliという新しい圧縮アルゴリズムを開発していたことをたまたま知りましたが、仕組み的にも興味深いものでした。

# 「新しい」圧縮アルゴリズム
2013年2月、Google社が新しい圧縮アルゴリズムを発表しました。gzipと比較して、圧縮率は3〜8%程度向上するものの、圧縮時間は数十倍かかることもある、とのことでした。

gzipの圧縮率を上回るような圧縮形式も、7z、bzip2、xzと出ている中で、この程度の改善では、さして魅力がないように映るかもしれません。

# deflate互換、の意味
ただし、Zopfliには大きな特徴があります。それは、「解凍がDeflateで行える」ということです。Deflateは実装が[zlib](http://zlib.net/)として普及していることもあり、

* gzip
* PNG
* ZIP

など、各種の形式の圧縮アルゴリズムとして採用されています。つまり、Zopfliでこれらのデータを、**互換性を保ったまま**さらに小さくできる、ということになります。Webの世界でも、画像に使われるPNGや、HTTPでのgzip転送などDeflateを使う場面が多くありますので、従来のエコシステムを何も変えず、データだけ小さくできることになります。

なお、そのような性質上、解凍時間はふつうのDeflateとほぼ同じです。

# どうしてそんなことができるの？
まず、通常のgzipにも圧縮率オプションがあって、サイズの違う圧縮ファイルができることからもわかるように、同じファイルに復元できる圧縮ファイルは何通りも存在します。

Deflateの中で使われている「LZSS」というアルゴリズムは、今までに出てきたのと同じデータが出てきた時に、それを「あった位置、長さ」のペアに置き換えることで圧縮を行います。これを探すための戦略のとり方で圧縮効率が違ってくるわけですが、通常のDeflateではほどほどな方法ですぐ終わらせてしまうのに対して、Zopfliでは何度も何度も同じファイルを処理して、より効率のいい変換を探す、という方法で高圧縮を目指します。

# 高圧縮の代償
上で書いたように、何度も何度も処理を続けるので、時間はかかってしまいます。コマンドラインツールでは、何回処理を行うか引数で指定できるようになっていますが、1000回回すと時間が相当にかかってしまいます。15回程度でもかなり圧縮率が改善しますので、どうしても1バイトが惜しい場面以外ではその程度で充分でしょう。

また、処理負荷を考えるとサーバサイドプログラムの動的な出力をgzip転送する、という用途にも向きません。Webでは、事前に圧縮可能な静的ファイルや、そうそう変化しないPNGファイルなどが使用場面となるでしょう。


# 外部リンク
* [GitHub](https://github.com/google/zopfli)
* [日本語のSlideshare](http://www.slideshare.net/kazoo04/zopfli)
CentOS 7 インストール記録 3. vnc 環境構築


イントラネット環境下で、mac の launchctl と、共有フォルダの代替を検討するために。


# vnc
gnome の vnc （画面共有）に関しては情報が少ない為、情報の多い、TigerVNC を。


```
# yum install tigervnc tigervnc-server
# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
```

\<USER> を XXXX に。

```
# vi /etc/systemd/system/vncserver@:1.service

```
解像度もココで指定　` -geometry 2560x1440`　出来るはずなのだが、、、

```
# systemctl daemon-reload
# systemctl enable vncserver@:1.service
```

ユーザー側のパスワード設定

```
$ vncpasswd
Password:
Verify:
```

```
# systemctl start vncserver@:1.service
```

mac からは、 `vnc://XXX.XXX.XX.XX:5901` で接続
perl で、マクロを組み込んだエクセルファイル作成。


古いメモより。

[Excel::Writer::XLSX](http://qiita.com/bunzaemon/items/60476ea85c6985b5144a)の続きかな。

## 手順
1. Excel 上でマクロを書く。
2. 保存して、`vbaProject.bin` を引っ込ぬく。
3. サンプルプログラムを実行する。

これだけなんだけど、忘れるので。

### 1. Excel 上でマクロを書く。
開発 => 挿入 からボタンを選び、適当に置く[^1]。
[^1]: ここでのボタンは二度と使わなくなるので、凝る必要はない。

自動でマクロの登録を促されるので、「新規作成」から下記の内容に丸ごと変更する。

```
sub say_hello()
    MsgBox "hello"
End Sub
```

VB Editor を閉じて、ボタンを右クリックして、マクロの登録から `say_hello` を割り当てる。

`macro.xlsm` で保存。

### 2. `vbaProject.bin` を引っ込ぬく。

保存された book の拡張子を、 `.zip` に変更して、 `unzip`。

`xl/vbaProject.bin` を取り出す。

もしくは普通に、[Zip された中から、一部のファイルを取り出す。](http://qiita.com/bunzaemon/items/cc574d330da03292ab44)を実行する。

### 3. サンプルプログラムを実行する。

[これ](http://cpansearch.perl.org/src/JMCNAMARA/Excel-Writer-XLSX-0.85/examples/macros.pl)をダウンロードして、`vbaProject.bin` と同じフォルダに保存して実行。


```
macro => 'say_hello'
```

が、マクロ名。

## 注意

当たり前だけど、違うマクロを組込みたい時には、その都度、Excel 上でマクロを作成して、`vbaProject.bin` を引っ込ぬく作業が必要となる。
当然、perl から マクロの中身自体の編集なんかは期待出来ない。
Zip された中から、一部のファイルを取り出す。


度忘れ。

`macro.xlsm` ってファイルから、`xl/vbaProject.bin` を引っ込ぬくのに。

```
$ unzip macro.xlsm xl/vbaProject.bin
```

記憶の片隅にあったのと違い、普通に第二引数にアーカイブ内の Name (アーカイブ内パス)を与えればいいだけでした。なにと混同したんだろう？

 Name を知りたければ、`-l` でリスト出力して確認[^1]。
 
 [^1]: `zsh` だと、タブ打てば補完されたけど、どこらのオプションが効いてんだっけか？
iOSでUINavigationBarをFacebook風にスクロールで消す時に　メモ

方法を調べたものの、見つけた方法は面倒そうなのばっかりで少し考えてみたら少し簡単にやる方法を見つけたのでメモ

適当に`fakeNavibar`とでも名前をつけて一つ`view`を用意しておく。この時、`frame`は`navigationBar`と同じ値にして、ビュー階層は`navigationBar`の下にしておく。色も同じにするのを忘れずに。

```navibar.swift
class FakeNavibarController:UINavigationController{
   var fakeNavibar:UIView!

   override viewDidLoad(){
      super.viewDidLoad()

      self.fakeNavibar = UIView(frame:self.navigationBar.frame)
      self.fakeNavibar.backgroundColor = UIColor.balckColor()//ナビゲーションバーと同じ色
      self.view.insertSubview(self.fakeNavibar, belowSubview: self.navigationBar)

```

あとは`navigationBar`を動かす時に`fakeNavibar`も一緒に動かして、`navigationBar`だけ透過させていく。
例えばスクロールする毎に呼び出すメソッドを用意しておいて


```navibar.swift
func naviBarFade(diffY:CGFloat){
   let statusBar = UIApplication.sharedApplication().statusBarFrame
   let rate = self.navigationBar.frame.origin.y/statusBar.frame.height

   self.navigationBar.alpha = rate
   self.navigationBar.frame.origin.y -= diffY
   self.fakeNavibar.frame.origin.y = self.navigationBar.frame.origin.y
}
```

とでもしておけば簡単にできた。単純にナビゲーションバーそのものを透過させていって、その下に同じいろのビューがあるのでアイテムだけ消えていくFacebookアプリ的なことができる。
もっと簡単な方法あるのかな。
[boost] asio::io_service でmove-only handlerをpushする

`io_service::push`の引数に渡すハンドラにコピーコンストラクタが無いと怒られる。
accept時に`socket`を`unique_ptr`で束縛してハンドラに処理を任せたいときに不便である。

workaroundとしては、コピーコンストラクタを宣言するラッパーを書いて、定義はしないという方法がある。
ちなみにコピー代入演算子の方は無くても良い。

http://stackoverflow.com/questions/17211263/how-to-trick-boostasio-to-allow-move-only-handlers
https://svn.boost.org/trac/boost/ticket/8714
iOSネイティブ開発学習メモ -戻る機能をつけるには-


storyboardで
Editor > Embeb In > NavigationController
でNavigationControllerをつける

![スクリーンショット 2015-10-15 20.31.01.png](https://qiita-image-store.s3.amazonaws.com/0/6955/00cf4dc1-b89f-42e8-3b06-376aea93e1e6.png)


以上
pythonCUIアプリケーションをmac用のappにする

# Overview
・py2appを用いてpythonで作成したプログラムをapp化する．
・wxPythonやpyQtなどを用いたGUIアプリケーションではなく，コンソールベースのプログラムを対象とする．
・作成したappを起動するとterminalが立ち上がり，その上でプログラムが動くようにする．
# 目標
今回下図のようなpythonCUIアプリケーションを一般配布したく，mac用のアプリケーションを作成しようとしました．
![controlServer.png](https://qiita-image-store.s3.amazonaws.com/0/81808/78aec75f-2735-a1df-a604-20e6438f7464.png)
が，作成したappを実行しても，一向に起動する気配がないのです（Dockでずっとバウンドしている）...
実はプログラムは**バックグランドで実行されてはいます**．ただこのままでは実行状態がさっぱりなので，terminalが出てきて，その上で実行してほしいわけです．（ちなみにwindows用のpy2exeでは下図のようにうまく動作するんですよね...）
![control_win.png](https://qiita-image-store.s3.amazonaws.com/0/81808/807bc467-6a66-f4b6-152c-aeb4b98fbc97.png)
今回の目標はpy2exeで作成したように，pythonで作成したCUIアプリケーションをmacの**「コンソール上で」**動作するようなアプリケーションを作成します．

# 流れ
1. py2appでpythonプログラムからmac用アプリケーション（base.appとします）を作成する．
2. base.app内にあるUNIX実行ファイルを直接叩くスクリプトを書く．
3. そのスクリプトをapp化する（作成したappをwrap.appとします）．
4. wrap.app内のリソースフォルダにbase.appを格納する．
![python_to_binary_app.png](https://qiita-image-store.s3.amazonaws.com/0/81808/270a33dc-c235-bfca-ea1a-43fb716f03bc.png)


## 1. py2appでmacアプリケーションを作成する
※説明の便宜上，ここで作成したmacアプリケーションをbase.appとします．
まずpipでpy2appをMacにインストールします．
`sudo pip install py2app`
次にpythonコード（base.pyとします）をapp化する為に，setup.pyを作成します．
`py2applet --make-setup base.py`
そして，このsetup.pyを元にpy2appにてbase.pyをapp化します．
`python setup.py py2app`
これでbase.appが作成されるかと思います．
（この段階で作成されたappを実行しても，**Terminalで実行されません**．）

## 2. base.app中の実行ファイルを直接叩くスクリプトを作成する
base.appをダブルクリックしても画面上では何も起きません（Dockでバウンドしているor応答しない）．
しかし，**base.app/Contents/MacOS/baseをダブルクリック**するとterminalが起動し，その上でプログラムが動作しているかと思います！
今回は**この実行ファイルを直接叩くスクリプトを作成し，それをapp化していきます**（wrap.appとします）．
スクリプトはAppleScriptを使用します．
後述しますが，appファイル内のリソースフォルダのパスを取得するのが，AppleScriptでは簡単にできるので作成するスクリプトはAppleScriptをお勧めします．
以下のスクリプトを記述します．

```applescript:wrapper.scpt
set base_path to (POSIX path of (path to resource "base.app/Contents/MacOS/base")) as string

tell application "Terminal"
	activate
	do script (base_path & " &")
end tell
```
一行目の`path to resource "base.app/..."`で**このスクリプトが実行されるappのリソースフォルダ中にある"base.app/..."の絶対パスを取得します**．取得したパスはエイリアス参照なので，それをPOSIX形式に変換し，文字列型に変換したものをbase_pathに格納します．

`tell application "Terminal"`でTerminalを起動し，activateします．これでTerminalが画面に表示されます．その上でbase.app内の実行ファイルを実行します．この時` &`を末尾につけることでバックグラウンド動作となり，**このスクリプトが終了してもプログラムが実行されます**（逆に` &`をつけないとTerminal上でプログラムが終了しないとwrap.appも終了しません．）
## 3. スクリプトを元にwrap.appを作成する
上記で作成したwrapper.scptを元にwrap.appを作成します．
この操作は非常に簡単です．Terminal上で以下を実行するだけです．
`$ osacompile -o wrap.app wrapper.scpt`
これでwrap.appが作成されるかと思います．
## 4. wrap.app内のリソースフォルダにbase.appを格納する
最後に，1.で作成した，コンソール上で動かしたいappのbase.appをwrap.app内のリソースフォルダに格納します．
`$ cp base.app wrap.app/Contents/Resources/base.app`

# 参考
http://qiita.com/mattintosh4/items/83e1540c31c803c3fd5e
http://qiita.com/mattintosh4/items/3220a75ae6229553b87b
iOSネイティブ開発学習メモ -View Controllerとクラスの結び付け方-

![スクリーンショット 2015-10-15 20.07.11.png](https://qiita-image-store.s3.amazonaws.com/0/6955/53ba1d55-2233-e69b-16ee-099843aea27f.png)

画面右側（ユーティリティエリア）の左から三番目
Custom Classにクラスを指定できる
これで好きなクラスを指定する事ができる。
ただし指定するクラスはUIViewControllerを継承する必要があり。

多分他のコンポーネントも同様かな

以上
LaravelのDB migrationで日付のデフォルトを指定

# LaravelのDB migrationで日付のデフォルトを指定

`$table->timestamps()`で自動で`created_at`, `updated_at`を作ってくれるのは便利だが、こちらデフォルト値が指定できない。

作成日、更新日に関してはわざわざプログラム側で指定せずとも自動で入力してほしいところです。

- [[Proposal] Default value for Timestamp columns · Issue #369 · laravel/framework](https://github.com/laravel/framework/issues/369)

↑のLaravelリポジトリのIssueには、

```php:migration.php
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
```

コレで実現出来る、とある。
Laravel作者のTaylor氏的にも「default()にDB::raw()突っ込んで対応で十分でしょ」という見解らしい。まあそうかもしれんが。

**ただこのやり方は`MySQL`にしか対応していない。**
`PostgreSQL`でやるには自作関数とトリガーを定義しないと無理なようだ。
面倒くさいが、以下の様にすれば自動更新出来る。

```php:migration.php
public function up()
{
    Schema::connection('public')->create('medias', function(Blueprint $table) {
	    // ココは両方共 CURRENT_TIMESTAMP で
        $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
        $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP'));
    });
    // 関数の定義
    DB::connection('public')->statement("
        create or replace function set_update_time() returns trigger language plpgsql as
        $$
          begin
            new.updated_at = CURRENT_TIMESTAMP;
            return new;
          end;
        $$;
    ");
    // トリガーの定義
    DB::connection('public')->statement("
        create trigger update_trigger before update on medias for each row
          execute procedure set_update_time();
    ");
}

public function down()
{
    // DBと関数とトリガーの削除処理
    Schema::connection('public')->drop('medias');
    DB::connection('public')->statement("
        DROP TRIGGER update_trigger ON medias;
    ");
    DB::connection('public')->statement("
        DROP FUNCTION set_update_time();
    ");
}
```

うん、**面倒くさい**。Taylorさん〜なんとかしてけろー。
まあDBもMySQLとPostgreSQLしか無いわけではないし、全ては対応できないだろうから、まあ仕方ないか。

毎度コレ↑をコピペするより**ヘルパー**とか**サービスコンテナーの拡張**で一箇所書いておけば使い回し聞くようにはなるとは思う。

以上！
Swift1.2→Swift2.0に移行した時に出たsupportedInterfaceOrientations()のエラーについて


##Swift1.2で画面の向きを固定する関数にエラーが！！

``` Swift:Swift
// Swift 1.2
override func supportedInterfaceOrientations() -> Int {
    let orientation = Int(UIInterfaceOrientationMask.Portrait.rawValue | UIInterfaceOrientationMask.PortraitUpsideDown.rawValue)
    return Int(UIInterfaceOrientationMask.All.rawValue)
}

```



```Swift:Swift
Error: Method does not override any method from its superclass
```

###これでなんとか

```Swift:Swift
// Swift 2
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    let orientation: UIInterfaceOrientationMask = [UIInterfaceOrientationMask.Portrait, UIInterfaceOrientationMask.PortraitUpsideDown]
    return orientation
}
```
[python] モジュールに定義されているクラス一覧を取得する


# inspect.getmembers(object[, typecheck])

まずは結論から

```python:foo.py
class foo1:
    '''something code'''

class foo2:
    '''something code'''

class foo3:
    '''something code'''
```

```python:get_class
import foo 
import inspect

classes = map(lambda x:x[0],inspect.getmembers(foo,inspect.isclass))

print classes
# => ['foo1','foo2','foo3']
```

`inspect.getmembers(object)`は`object`に登録されているオブジェクトの全メンバーを取得します。
形式は[(member1,type),(member2,type),....]といった形。
`inspect.is--`はそのオブジェクトが`--`に一致するかを判定するもので、
class, module, function, method .....と16個あるらしい。
詳しくは[こちら](http://docs.python.jp/2/library/inspect.html "inspect")。

そのため、`inspect.getmembers(foo,inspect.isclass)`でこんな形になっていたはず。

```python:get_class
print inspect.getmembers(foo,inspect.isclass)
# => [('foo1',<class foo.foo1 at 0x*******>),('foo1',<class foo.foo2 at 0x*******>),('foo3',<class foo.foo3 at 0x*******>)]
```

あとは各要素の第0要素だけ抜き出してあげればいいので
`map(lambda x:x[0], list)`
でおしまい。

第1要素の方はクラスそのものだから、クラスオブジェクトそのものも取得できる。
例えばクラス名の一部をkeyに検索をかけて、一致するクラスオブジェクトを取得するとする。

```python:getclass
import foo 
import inspect

classes = inspect.getmembers(foo,inspect.isclass)

for i in classes:
    if '2' in i[0]:
        something2 = i[1]

something2class = something2()
print something2class.__class__.__name__
# => foo2
```

ただしこの場合、検索に引っかからないとたぶんエラーが出る。