OmniAICreator/Qiita-1.07M huggingface dataset:
Windows8でのDirectX11開発は準備が面倒臭い


自分はWindows7でDirectX9を使っていて、そこからの移行だったので、かなり時間がかかってしまいました。

#D3DXの時代は終りを迎える
DirectXを使った開発をしようと思えば、今まではSDKをダウンロードして使っていました。
が、~~Windows8からはSDKが最初から入っているというスタイルになっています。~~
正しくは、`DirectXSDK`は`WindowsSDK`に統合されたようです。
`VisualStudio2012`以降に付属してきます。
単体で`WindowsSDK`を入れることも出来るようです。(2015/03/16更新)

ダウンロードする手間は省けるのですが、そのSDKには、今まで自分がお世話になっていたD3DX系が入っていません。
これで困ることは、

* テクスチャの読み込みが出来ない。
* シェーダのコンパイルが出来ない。
* ベクトルや行列の算術系関数が1つもない。

と、非常に困ることになってしまいます。
**どうやらMicrosoftは今後、D3DXを廃止するとのことです。**

以下に解決策を書きますが、めんどくさい人は、SDKをダウンロードして使ってください。

#解決策

上に書いた3つの問題をクリアするために、Microsoftは別の手段を用意してくれています。

* テクスチャの読み込みが出来ない。→DirectXTex使え。
* シェーダのコンパイルが出来ない。→D3DCompiler使え。
* ベクトルや秒列の算術系関数が1つもない。→DirectXMathかXNAMath使え。

とのことです。(他にもDirectXTKというのもあるようですが、それは使ってません。)

算術系は、今回はXNAMathを使うことにします。理由は、DirectXMathだと動かないCPUがあるかもしれないからです。(殆ど無いと思いますが)
詳しくはここを参照してください。(英語)
http://msdn.microsoft.com/en-us/library/windows/desktop/ee418725(v=vs.85).aspx

**ちなみに、XNAライブラリが開発中止になったので、今後はDirectXMathを推してくると思います。**
(DirectXMathはXNAMathのラッピングだと聞いたんですが、どうなんでしょう？)

#導入
DirectXTexとXNAMathはダウンロードする必要があります。
XNAMathは最新が2.05になります。
D3DCompilerはSDK同様最初から入っていますが、dllが必要になります。
dllはSDKのどっかにあると思います。

・DirectXTex
http://directxtex.codeplex.com/releases/view/125470

・XNAMath 2.05
http://blogs.msdn.com/b/chuckw/archive/2012/06/22/xna-math-version-2-05-smoothing-the-transition-to-directxmath.aspx


XNAMathに関しては、ヘッダをインクルードするだけでいいです(.inlもいるので注意)
また、単体でインクルードするだけではエラーになるので、
先にWindows.hをインクルードしておく必要があります。

********
DirectXTexについてはちょっと特殊で、解凍したらそのまま使えるというわけではありません。
いくつかVisualStudioのソリューションファイルがあると思います。
自分が開発するVisualStudioのバージョンにあったものを開いて、そのままビルドしてください。

すると、新しくbinフォルダが出来ると思います。
binフォルダ内にライブラリができているので、それをリンクしてください。
ヘッダはDirectXTexフォルダ内にあります。(.hと.inlファイルがあります)

これでDirectX11での開発が可能になります。

##D3DXからの移行
今まで11での開発にD3DXを使っていた人は、大きく書き換える必要がありますが、
処理自体はそんなに変わりません。
が、テクスチャ読み込みの処理が若干変化するようです。
私は11ではD3DXを使ったこと無いのでよくわかりません。


#Windows7への対応
付属してくるSDKのDirectXのバージョンは11.1です。
これに対応しているOSは現在、`Windows8`と`Windows7 SP1 + KB2670838(WindowsUpdate)`
になっているので、Vista以前のOSには根本的に対処できません。
(Vistaは11.0まで、XPは9.0cまでしか動きません)

が、上記の設定、環境で作ったものが`Windows7`上で普通に動くのか、というと、
**そうでもないようです。**(私は作ったゲーム動きませんでした・・・)


Windows7と8では互換性が失われていることも多いみたいです。(XAudioもそうでした・・・)
プロジェクトのビルド構成を新しく作って、Windows7と8それぞれのDebugとReleaseを作るといいかもしれませんね。
(7では2010JuneのDirectSDKを、8ではWindowsSDK上のDirectSDKをリンクする感じ？)

###蛇足
7はまだまだユーザが多いので、**非常に面倒ですが、**上手く回避して対応することをおすすめします。
Windows10が出たらどうなるんでしょうね・・・。

質問やご意見、ご指摘ありましたらお願いします。
「peek」でさくっと英語ネイティブにユーザーテストをしよう

# Peekとは
- [http://peek.usertesting.com](http://peek.usertesting.com)
- サイトやアプリのURLを送ると、英語ネイティブによるユーザーテスト動画（約5分）を送り返してくれるサービス
- 無料
- はやい（URLを送ってから数時間で結果が届く）
- 結果をURLで簡単にシェアできる
- 結果をmp4動画でダウンロードできる

## テスト結果
- 送られてくるURLを開くと、こんなかんじで動画が見られます

![テスト動画キャプチャ](https://qiita-image-store.s3.amazonaws.com/0/41821/8d292ce3-6faf-6e3e-0365-6b123e988b17.png)

## おしいところ
- テストユーザーの属性が全くわからない
- 対応しているのは英語のみ
- 音声がやや聞き取りにくい
WordPressでTwig

## [Twig](http://twig.sensiolabs.org/)とは
Symfony2でも利用可能なPHPのテンプレートエンジンです。
詳しくは[SYmfony2のドキュメント](http://docs.symfony.gr.jp/symfony2/book/templating.html)を見るといいと思います。

## Twigを使うに至った理由
[WordPressのテンプレート階層にレイアウトを組み込む](http://qiita.com/atomita/items/69309234f1796682333e)なんての書きましたが、テンプレートエンジン使ったほうが、より柔軟・強力だよねってことで。


# WordPressでTwig

以下、[Timberプラグイン](http://upstatement.com/timber/)を使う場合と、Twigを直接使う場合の2通り書きます。

## Timberを使ってTwig

Timberはプラグインなので、pluginsディレクトリにアップロードして、プラグイン有効化したらokです。
wp-content/themes/テーマディレクトリ/views がtwigファイルを配置するディレクトリになります。
また、テーマ内に配置して functions.php で timber-library/timber.php をincludeしておけば利用可能なようです。

[サンプルテーマ](https://github.com/jhonyspicy/wordpress-theme-base/tree/template-timber)

個人的なTimberを使うデメリットは、Timberのメソッドやクラス群を使って出力する形になるところ。

## Twigを直接

[twigのイントロ](http://twig.sensiolabs.org/doc/intro.html)まんまですが、composerでインストールして

```shell-session
composer require "twig/twig:1.*"
```

Twig_Loader と Twig_Environment を使ってやればok

```php
// index.php
require_once __DIR__ . '/vendor/autoload.php';

$loader = new Twig_Loader_Filesystem(__DIR__ . '/views');
$twig = new Twig_Environment($loader, array(
    'cache' => __DIR__ . '/cache',
));

echo $twig->render('index.twig', array('name' => 'Fabien'));
```

ただ、Twigは関数を登録したりしないと、関数が実行できないので、そのまま使うのは難しいです。
下のサンプルでは、 {{ func.trim(" text ") }} といった形で"func"オブジェクト経由で関数を実行できるようにしています。

[サンプルテーマ](https://github.com/jhonyspicy/wordpress-theme-base/tree/template-twig)
Activity間でグローバル関数などを使う

#Applicationクラスを継承した独自クラスを作成

```Globals.java
public class Globals extends Application {

    boolean mIsBound;
    boolean connected;
    int length;
    int[] buffer;
    byte[] data;

    public void init(){
        mIsBound = false;
    }

    public void showToast(String text) {
        Toast.makeText(this, text,Toast.LENGTH_SHORT).show();
    }
}
```

#AndroidManifest.xmlにクラスを記述
applicationタグに、	`android:name=".Globals"`を挿入する。

```AndroidManifest.xml
<application
	android:name=".Globals"
	android:allowBackup="true"
	android:icon="@drawable/ic_launcher"
	android:label="@string/app_name"
	android:theme="@style/AppTheme" >
	....
</application>
```

#Activityで使う

```MainActivity.java
Globals globals;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);

	// getApplication()でアプリケーションクラスのインスタンスを拾う
	globals = (Globals)this.getApplication();
    
	//変数を使う
	int l = globals.length;

	//初期化する
	globals.init();
	
	//トーストする
	globals.showToast("hoge");
}
```
国内サービスのメール認証対応状況

##調査対象
個人で契約している国内の２０サービス。

DKIM、SPF、DMARCの対応状況を調べました。
各認証の説明は下記ページに簡単に説明があります。
http://qiita.com/takashi/items/aa5e8bd56b63e16999ff

対象はベンチャーのウェブサービス系が多かったこともあり認証への意識が比較的高いと思われます。
そのため、結果の対応状況は実際の平均よりはやや高いかもしれません。

##調査結果

|認証方法     | 対応状況 |
|:-----------|--------:|
| DKIM       |   8/20  |
| SPF        |  19/20  |
| DMARC      |   1/20  |

SPFは設定が簡単というのもあり、ほとんどのサービスが対応していました。
DKIMは40%ほどの対応率ですが、メール配信サービスを使っているものも多く、意識して導入しているケースは少なそうです。
メール配信サービスを使っていてもDKIMが導入されていないケースもありました。国内ではDKIMの認知度はかなり低いようです。
DMARCについては１サービスしか対応を確認できませんでした。ちなみに楽天さんです。
Androidの表示画面の回転固定

#横方向に固定する場合
androidManifest.xml内の対象となるactivityタグの中に、`android:screenOrientation="landscape"`を挿入する。

例えば、

```androidManifest.xml
<activity
	android:name=".MainActivity"
	android:screenOrientation="landscape">
</activity>
```

#縦方向に固定する場合
`<activity android:screenOrientation="portrait">`を挿入する。

例えば、

```androidManifest.xml
<activity
	android:name=".MainActivity"
	android:screenOrientation="portrait">
</activity>
```
キーリピートを高速化する

linux上のターミナル上でのキーボード入力がもっさりしている感じがしたのでキーリピートを高速化しました。キーボード入力がサクサクになるそうで、コーディングの効率が、上がるそうです。せっかちになるかも。 特にvimのhjklなどの長押しでの移動は快適です。

以下メモ書き。
GUIでは下記のようにやります。

```text
設定->キーボード
リピートキー
速度(S):
↑ここを速いにするといい感じ
```

コマンドラインからだと以下でできます.
delayはリピートが始まるまでの時間(ミリ秒), rateはリピート間隔(ミリ秒)です.

```text
% xset r rate delay rate
```

具体例としては以下のようになります.

```text
% xset r rate 195 62
```

* 参考

http://technique.sonots.com/?UNIX%2F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%2FX%2Fxset
jQuery Mobileの勉強 − ポップアップ表示

<img src="https://qiita-image-store.s3.amazonaws.com/0/8407/6b605128-507a-7638-5da2-01c793761261.png" width="350px;" />

#ポップアップ
- data-role="popup"を指定すること。
- aタグで閉じるボタンなどを表示できます。

```html
<div id="popup-message" data-role="popup">
  <a href="#" class="ui-btn-right"
    data-role="button" data-rel="back"
    data-icon="delete" data-iconpos="notext">閉じる</a>
  <p class="ui-content">ポップアップが表示されました</p>
</div>
```
#ポップアップの呼び出し
- data-position-to="window"と指定すると画面中央にポップアップを表示できます。
- data-toleranceで任意のマージンを指定することもできます。

```html
<a href="#popup-message" data-rel="popup" data-position-to="window">
    ポップアップを表示
</a>
```

#サンプルコード
```html
<!DOCTYPE html> 
<html lang="ja"> 
  <head> 
    <title>Page Title</title> 
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.css" />
    <script type="text/javascript" src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.js"></script>
  </head> 
  <body> 
    <section id="page" data-role="page">
      <header data-role="header">
          <h3>jQuery Mobile</h3>
      </header>
      <article data-role="content">
        <h3>jQuery Mobileのページ</h3>
        <p>
          <a href="#popup-message" data-rel="popup" data-position-to="window">
            ポップアップを表示
          </a>
        </p>    
      </article>
      <footer data-role="footer">
        <h3>Footer</h3>
      </footer>
      <!--  ポップアップ -->
      <div id="popup-message" data-role="popup">
        <a href="#" class="ui-btn-right"
          data-role="button" data-rel="back"
          data-icon="delete" data-iconpos="notext">閉じる</a>
        <p class="ui-content">ポップアップが表示されました</p>
      </div>
    </section>
  </body>
</html>
```
Spring MVC でモデルのフィールド名とリクエストパラメータ名が異なる場合のバインド方法

リクエストパラメータをモデルにバインドする時、フロント側フレームワークの都合等でリクエストパラメータ名をモデルのフィールド名と合せる事ができない場合がある。

そんな時には、以下の方法で名前の異なるフィールドに強引にバインドする事ができる。

1. @InitBinderメソッドを作成する。
2. PropertyValuesのインスタンスを作成し、バインドしたいリクエストパラメータを追加する。
3. この際、addメソッドの第一引数はバインドしたいモデルのフィールド名にする。
4. WebInitBinder.bind()を呼び出す。

# 例 : リクエストパラメータ**username**をUserクラスの**name**フィールドにバインドする

```java:User.java
@Data
public class User {
    @NotNull
    private String name;
}
```
```java:UserController.java

@Controller
public class UserController {

    @ModelAttribute("user")
    public User newUser() {
        return new User();
    }

    @InitBinder("user")
    public void bindUser(WebDataBinder binder, HttpServletRequest request) {
        //リクエストパラメータ"username"をプロパティ名"name"にバインド
        MutablePropertyValues pvs = new MutablePropertyValues();
        pvs.add("name", request.getParameter("username"));
        binder.bind(pvs);
    }

    @RequestMapping("/")
    @ResponseBody
    public String index(@Validated @ModelAttribute User user, BindingResult errors) {
        if (errors.hasErrors()) {
            return errors.toString();
        }
        return "name:" + user.getName();
    }
```

```html:/?username=hogeでリクエストした結果
name:hoge
```
Ruby | Gviz gem で様々な attrs を試す

# Ruby | Gviz gem で様々な attrs を試す
## 概要
viz gem で様々な attrs を試します。

graphviz では様々な attrs ＝ attributes が用意されており、
表示サイズ・色・等々を制御できます。

## attrs の各属性の調べ方
attributesについては Graphviz 下記公式資料で内容を確認できます。
http://www.graphviz.org/content/attrs

### Used By

http://www.graphviz.org/content/color-names#brewer
の一覧の Used By に設定されている E, N, G, S はそれぞれ Edges / Nodes / Graph / Sub Graph を表す。
ノードに関わる属性を調べたければ N を含む項目を探す。

## 様々な attr を試してみる

### Node の色・枠・フォント関連の変更
フォントを変更。デフォルトは Times-Roman になっている。

~~~ruby
  node :sample1, {
    :color => :red,
    :fontcolor => :darkgreen,
    :style => :filled,
    :fillcolor => :yellow,
    :fontname => 'Impact',
    :fontsize => 40
  }
~~~

色の指定については下記を参照。
http://www.graphviz.org/content/color-names#brewer

### Node をいろんな形状( shape )に設定
こういった一括設定をする時に graphviz のDOT言語を直接操作せずに、
Gvizを利用する恩恵を感じるのでしょうね。

~~~ruby
  %i(
    egg triangle diamond tripleoctagon star
    note tab folder box3d component
  ).each.with_index do |e, i|
    rank_value = i%3==0 ? :min : i%3==1 ? :same : :max
    node e, {:shape => e}
    rank rank_value, e
  end

__END__
・10種類の shape をシンボルの配列にしてループしながら設定しています
・シンボルの %記法による配列は Ruby 2.0 からの文法
・1種類ごとに rank を min / same / max にすることで表示位置を調整
~~~

各形状( shape )については下記参照
http://www.graphviz.org/content/node-shapes

### Record-Based Node 

ひとつの Node に複数の要素を詰め込む場合 = Record-Based Node。

~~~ruby
  node :VirticalRecord, {
    :shape => :record,
    :label => "{ a | b | c }"
  }
  node :HorizontalRecord, {
    :shape => :record,
    :label => " a | b | c "
  }
  node :MixRecord, {
    :shape => :record,
    :label => " d | {e|f} | g "
  }
~~~

http://www.graphviz.org/content/node-shapes#record

### Egde にラベルを設定

~~~ruby
  route :fromEdge => :toEdge
  edge :fromEdge_toEdge, {label: 'edge\'s label'}
~~~

### サンプルコード
上記の設定をまとめて行ったサンプルコード

~~~ruby
require 'gviz'

Graph do
  node :sample, {
    :color => :red,
    :fontcolor => :darkgreen,
    :style => :filled,
    :fillcolor => :yellow,
    :fontname => 'Impact',
    :fontsize => 40
  }
  route :fromEdge => :toEdge
  edge :fromEdge_toEdge, {
    label: 'edge\'s label'
  }

  %i(
    egg triangle diamond tripleoctagon star
    note tab folder box3d component
  ).each.with_index do |e, i|
    rank_value = i%3==0 ? :min : i%3==1 ? :same : :max
    node e, {:shape => e}
    rank rank_value, e
  end

  node :VirticalRecord, {
    :shape => :record,
    :label => "{ a | b | c }"
  }
  node :HorizontalRecord, {
    :shape => :record,
    :label => " a | b | c "
  }
  node :MixRecord, {
    :shape => :record,
    :label => " d | {e|f} | g "
  }

  save(:attrs, :png)
end
~~~

### サンプル出力

![attrs.png](https://qiita-image-store.s3.amazonaws.com/0/43480/871b603c-ced3-6305-d8bd-348b2dccc552.png)

## 参照
http://www.graphviz.org/content/attrs
Ruby | Gviz gem の Draw Module を活用する

# Ruby | Gviz gem の Draw Module を活用する
## 概要
Gviz gem の Draw Module を活用します。

https://github.com/melborne/Gviz/blob/master/lib/gviz/draw.rb

## ellipse(id, x:0, y:0, **attrs)
ellipse = 楕円
x, y Ruby2から導入されているキーワード引数。
attrs はオプション引数（キーワード引数と併用する場合は、アスタリスクを二つつける）。

id : ID
x : X軸位置
y : Y軸位置
attrs : その他の設定

## circle(id, x:0, y:0, r:0.5, **attrs)
circle = 円

id : ID
x : X軸位置
y : Y軸位置
r : 半径
attrs : その他の設定

## square(id, x:0, y:0, **attrs)
square = 四角

id : ID
x : X軸位置
y : Y軸位置
attrs : その他の設定

## point(id, x:0, y:0, **attrs)
point = 点

id : ID
x : X軸位置
y : Y軸位置
attrs : その他の設定

## line(id, from:[0,0], **attrs)

id : ID
from: 始点の x/y 座標
attrs : その他の設定(toはこれに含まれる)

attrs に to を設定しないとエラーが発生します。

## サンプルコード

~~~ruby
require 'gviz'

Graph do
  ellipse :ellipse11, x: 1, y: 1, label: :ellipse11
  ellipse :ellipse33, x: 3, y: 3, label: :ellipse33
  circle :circle13, x: 1, y: 3 , r: 0.75, label: :circle13
  circle :circle31, x: 3, y: 1 , r: 0.75, label: :circle31
  square :square15, x: 1, y: 5 , label: :square15
  square :square35, x: 3, y: 5 , label: :square35
  point :point17, x: 1, y: 7
  point :point37, x: 3, y: 7
  line :line1, from: [1, 1], to: [7, 7]
  line :line2, from: [1, 7], to: [7, 1]
  route ellipse11: :circle31
  route circle31: :ellipse33
  route ellipse33: :square35
  route square35: :square15
  route square15: :circle13
  route circle13: :ellipse11
  save(:draw, :png)
end
~~~

## 出力画像

![draw.png](https://qiita-image-store.s3.amazonaws.com/0/43480/67e76d81-9e18-74f1-9004-b234c90590e7.png)

## 参照
* Gviz GitHub
https://github.com/melborne/Gviz/blob/master/lib/gviz/draw.rb
jQuery Mobileの勉強 − ダイアログ表示

<img src="https://qiita-image-store.s3.amazonaws.com/0/8407/48a0e81b-43f4-4b33-036f-182ab81bd338.png" width="350px" />


#Dialog
- data-role="dialog"を指定する必要があります。
- aリンクで遷移することで表示できます。

```
<section id="dialog" data-role="dialog" data-close-btn-text="閉じる">
  <header data-role="header">
    <h3>ヘッダ</h3>
  </header>
  <article data-role="content">
    <p>jQuery Mobileのダイアログ</p>
  </article>
</section>
```

#サンプルコード
```html
<!DOCTYPE html> 
<html lang="ja"> 
    <head> 
        <title>Page Title</title> 
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1"> 
        <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.css" />
        <script type="text/javascript" src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
        <script type="text/javascript" src="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.js"></script>
    </head> 
    <body> 
        <section id="page" data-role="page">
            <header data-role="header">
                <h3>jQuery Mobile</h3>
            </header>
            <article data-role="content">
                <p><a href="#dialog">ダイアログを開く</a></p>
            </article>
            <footer data-role="footer">
                <h3>Footer</h3>
            </footer>
        </section>
        <!-- リンクによって開かれるダイアログ -->
        <section id="dialog" data-role="dialog" data-close-btn-text="閉じる">
            <!-- ダイアログ -->
            <header data-role="header">
                <h3>ヘッダ</h3>
            </header>
            <article data-role="content">
                <p>jQuery Mobileのダイアログ</p>
            </article>
        </section>
    </body>
</html>
```
Swiftのリフレクションでクロージャを扱う方法


__Xcode 6.1 Beta 3で仕様が変更され，`Any`タイプの変数に関数タイプを代入できるようになりましたので，以下の話は無意味です。__

　
　
関数のMirrorTypeから関数に戻す方法を試行錯誤してみました．
結果，いとも簡単に鏡の中（リフレクション）からクロージャを引っこ抜くことができました．

Swiftの[リファレンス](https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-XID_503)には

> `Any` can represent an instance of any type at all, __apart from function types__.

とあり，確かに

```swift
let f: Any = {() -> () in println("Hello!")} 
//Segmentation fault: 11

```
`Any`で関数タイプを表現できません（クラッシュするのはどうかとも思いますが）．

しかし，リフレクション(`reflect関数`)を使って鏡の中(`MirrorType`)を覗くと，

```swift
let mr = reflect({() -> () in println("Hello!")})
println(mr.value)
// (Function)
```
しっかりと関数が入っています．`MirrorType`の`value`は`Any`タイプであるにも関わらず！
そして関数を取り出そうとすると，

```swift
let f = mr.value as () -> ()
// Segmentation fault: 11
```
やっぱり落ちます...うーむ...
　

### unsafeBitCastを使って強引に引っ張り出してみる．

コマンドラインのswiftインタプリタで`mr.value`を表示させると，

```
24> let s = mr.value 
s: Any = {
  payload_data_0 = {}
  payload_data_1 = {}
  payload_data_2 =
  instance_type = {}
}
25> sizeofValue(s)
$R9: Int = 32
```
ふむふむ．表示内容から見て`payload_data_`の0,1にクロージャが入っていそうです．そしてサイズは全部で32バイトと出たので`payload_data_`と`instance_type`はそれぞれ8バイトずつと思われます．
一方，クロージャのサイズはsizeofすると16バイトと出ました．
`unsafeBitCast`関数で`Any`から32(=16+8+8)バイトのタプルにコピーしてみましょう．

```swift
typealias AF = (() -> (), Int, Int)

let t = unsafeBitCast(s, AF.self)
let f = t.0

f()
// Hello!
```
無事，元の関数を取り出せました．強引ですけどね．

### クロージャのキャスト関数を定義

このキャストは便利そうなので関数にしておきます．
（クロージャはどんなタイプでもサイズは16バイトなようなです．）

```swift
func anyToFuncCast<F>(any: Any, ftype: F.Type) -> F {
    assert(sizeofValue(any) == 32)
    typealias AF = (F, Int, Int)
    let t = unsafeBitCast(any, AF.self)
    return t.0
}
```

### まとめ

- 仕様的にありえないはず(？)の`Any`タイプから関数タイプへの変換は，`unsafeBitCast`を使えば可能．`MirrorType`はドキュメントもないので仕様が適当なのでしょう．そのうち変わるかも．

- このパターンのようにメモリ内容をだいたい把握できるときは，タプルと`unsafeBitCast`を使えば強引にキャストできるかも．
jQuery Mobileの勉強 − 基本的なページ表示

<img src="https://qiita-image-store.s3.amazonaws.com/0/8407/2ca9d7ea-e13e-e68a-7d72-051e6a5ca27f.png" width="350px;" />

#CDNの読み込み
```
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.js"></script>
```

#Page
- data-titleを指定するとページ毎のタイトルを指定できます。

```
<section id="page1" data-role="page" data-title="タイトル">
    <!-- コード -->
</section>
```

#Header & Footer & Content
- data-roleの指定を忘れないこと。
- ヘッダーとフッターでは&lt;h&gt;タグを使うと中央寄せ表示されます。

```
<header data-role="header">
    <h3>jQuery Mobile</h3>
</header>
<article data-role="content">
    <!-- コード -->
</article>
<footer data-role="footer">
    <h3>Footer</h3>
</footer>
```

#サンプルコード
```html
<!DOCTYPE html> 
<html lang="ja"> 
  <head> 
    <title>jQuery Mobile</title> 
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.css" />
    <script type="text/javascript" src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.js"></script>
  </head> 
  <body> 
    <section id="page1" data-role="page" data-title="jQuery Mobile - Page1">
      <header data-role="header">
        <h3>jQuery Mobile</h3>
      </header>
      <article data-role="content">
        <h3>Page 1</h3>
        <ul>
          <li>
            <p><a href="#page2">次へ</a></p>
          </li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>Footer</h3>
      </footer>
    </section><!-- Page1 -->
    <section id="page2" data-role="page" data-title="jQuery Mobile - Page2">
      <header data-role="header">
        <h3>jQuery Mobile</h3>
      </header>
      <article data-role="content">
        <h3>Page 2</h3>
        <ul>
          <li>
            <p><a href="#page1">前へ</a></p>
          </li>
          <li>
            <p><a href="#page3">次へ</a></p>
          </li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>Footer</h3>
      </footer>
    </section><!-- page2 -->
    <section id="page3" data-role="page" data-title="jQuery Mobile - Page3">
      <header data-role="header">
        <h3>jQuery Mobile</h3>
      </header>
      <article data-role="content">
        <h3>Page 3</h3>
        <ul>
          <li>
            <p><a href="#page2">前へ</a></p>
          </li>       </ul>
      </article>
      <footer data-role="footer">
        <h3>Footer</h3>
      </footer>
    </section><!-- page3 -->
  </body>
</html>
```
既存のAMIから複製したインスタンスをrootで直接ログイン可能にする

少しハマったのでメモ。


直接rootログイン可能なインスタンスを複製した。

複製インスタンスにrootログインしてみる。
。。。できない(´・ω・`)
<code>Please login as the user "cloud-user" rather than the user "root".
</code>

おっしゃる通り、cloud-userではログインできる。

cloud-userの鍵情報を、rootのものに反映させれば、
rootログインできるんじゃなかろうか。

そのために、su権限を得る。
<code>$ sudo su -
</code>

。。。知らん(´・ω・`)
<code>[sudo] password for cloud-user:
</code>

コピー元を確認したところ、未設定だった模様。
<code># view /etc/shadow
cloud-user:!!:16301:0:99999:7:::
</code>

別の方法で試す。
<code>$ su root
</code>

行けた！！

あとは、鍵情報の書き換え。
<code># cp /home/cloud-user/.ssh/authorized_keys /root/.ssh/authorized_keys
</code>



完了(๑⃙⃘⁼̴̀◡ु⁼̴́๑⃙⃘)
rootログインOK!!
モバイルにおけるHTML5, JavaScript, CSS対応状況

最新版：
http://www.w3.org/Mobile/mobile-web-app-state/

いつもながら参考になるのであげておきます(2014年7月版）
http://www.w3.org/2014/07/mobile-web-app-state/

他にもあれば適宜追加予定。
Terminal.appからS3内のフォルダの中身を別フォルダにコピーする


# はじめに
S3にはフォルダという概念はなくて、`folder/foobar.png`というファイル名だったと思ったが、Management Consoleを確認してみたら

![Create Folder...](https://qiita-image-store.s3.amazonaws.com/0/2624/a7ef41f9-8a1c-4abe-c5a7-41f61e055dd0.png "SCreate Folder...")

となっていたので、フォルダという表記で進める。

## やりたいこと
Bucket内のfooフォルダの中に1万ほどファイルがあって、これをbarフォルダにコピーしたい。

![Copy/Paste Into](https://qiita-image-store.s3.amazonaws.com/0/2624/fb5abcdc-8a17-a57e-e682-8925e79d1b7c.png "Copy/Paste Into")

Management Consoleに`Copy`と`Paste Into`というメニューがあったので、これを使ったらできるかなと思ったけど無理でした。さて、バッチでも書くか。と思ったらどうやら[aws-cli](https://github.com/aws/aws-cli)を入れるとTerminalから

```bash
$aws s3 sync s3://bucket-src s3://bucket-target --exclude *.tmp
```
みたいな感じで操作ができるみたい。

# aws-cliのインストール
pipでインストールできる。

```bash
$ pip install awscli
```

## 接続情報の設定
`configure`コマンドでインタラクティブに設定する。

```bash
$ aws configure
Traceback (most recent call last):
#-*- snip -*-
ValueError: unknown locale: UTF-8
```

と思ったらエラー。どうやら、`locale`の設定ができていないよう。

```bash
$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
```

言語の設定を入れてあげる。設定できるlocaleは`locale -a`で確認できる。今回は、`ja_JP.UTF-8`を設定することにした。そして、Terminalを閉じる度に設定するのも面倒なので`.bash_profile`に設定を反映させた。

```bash
$ echo 'export LC_ALL=a_JP.UTF-8' >> ~/.bash_profile
$ echo 'export LANG=a_JP.UTF-8' >> ~/.bash_profile
$ source ~/.bash_profile
```

再度`configure`コマンドを実行してみる。

```bash
$ aws configure
AWS Access Key ID [None]: ********************
AWS Secret Access Key [None]: ****************************************
Default region name [None]: ap-northeast-1
Default output format [None]: 
```

Asia Pacific (Tokyo) Regionは`ap-northeast-1`。それ以外は、[Regions and Endpoints - Amazon Web Services](http://docs.aws.amazon.com/general/latest/gr/rande.html)で確認する。

### Auto Completionの設定
Tabでコマンドの補完を行えるように設定する。zshやtcshの人は[公式ドキュメント](https://github.com/aws/aws-cli#command-completion)に従って設定する。bashの人は`complete`コマンドを利用する。

```bash
$ echo 'complete -C aws_completer aws' >> ~/.bash_profile
$ source ~/.bash_profile
```

# aws-cliの利用

## bucketの中身の確認
```
$ aws s3 ls s3://mybucket
                           PRE foo/
                           PRE bar/
2014-05-27 11:52:47       3298 foobar.png
```

## フォルダのコピー
```bash
$ aws s3 sync s3://mybucket/foo s3://mybucket/bar
copy: s3://mybucket/foo/47484652.jpg to s3://mybucket/bar/47484652.jpg
copy: s3://mybucket/foo/47484653.jpg to s3://mybucket/bar/47484653.jpg
copy: s3://mybucket/foo/47484654.jpg to s3://mybucket/bar/47484654.jpg
...
```

## コピー時の注意
1. 一ファイルずつコピーのログが表示されるので、大量のファイルをコピーする際は`--quiet`オプションをつけたほうがいい。
2. 同一ファイル名があった場合、ファイルサイズが違う場合は上書き、そうでない場合はスキップされる。
3. ただし、同一ファイル名でファイルサイズも同じ場合でも、コピー元のファイル作成日が新しい場合は上書きされる。

# 参考サイト
[AWS S3 copy files and folders between two buckets](http://stackoverflow.com/a/18762105/1285818)
[Pelican 3.3 pelican-quickstart error “ValueError: unknown locale: UTF-8”](http://stackoverflow.com/questions/19961239/pelican-3-3-pelican-quickstart-error-valueerror-unknown-locale-utf-8)
整数に3桁区切りカンマを仕込む備忘録

## はじめに

Rubyで3桁区切の金額でカンマを差し込むやり方のメモ。よくあるやつですみません。
ちょっと調べたらたくさん方法は出てきたので、整数で使えるようにIntegerのクラスに突っ込んどく。

```jpy_comma.rb

class Integer
  def jpy_comma
    self.to_s.gsub(/(\d)(?=(\d{3})+(?!\d))/, '\1,')
  end
end

```

## クラスのメソッドにあるか確認

念の為に使えるメソッドに入っているか確認してみた。IntegerだとFixnumでもOKなんですね。
Integer < Numeric < Comparable < Object < Kernel < BasicObject というクラスの継承なようで、
Integerは配下にFixnumとBignumがあるみたいです。

```pry.rb
numeric = 123456
p numeric.class 
=> Fixnum
p numeric.methods
=> :jpy_comma # いっぱいあったので該当部分だけ
```

## 使ってみた

問題なさそう。

```pry.rb
p numeric.jpy_comma
=> "123,456"

# もっと大きい数字
numeric = 12485456309235
p numeric.jpy_comma
=> "12,485,456,309,235"
```

## 念のため小数点を確認

きっとエラーが出てくれるはず

```pry.rb
b = 13754.4566
=> 13754.4566
b.jpy_comma
NoMethodError: undefined method `jpy_comma' for 13754.4566:Float
```

よいよい。
Qiita:TeamのメンバーリストのQiita IDをポップアップするブックマークレット

Qiita:Teamのメンバーリストのアイコンは、現状ホバーしてもQiita IDがポップアップしないため、アイコンがデフォルトのユーザーの見分けが付かない。

取り急ぎ以下のブックマークレットで回避する。

```js:qiita_team_member_list.js
javascript:$('.team-member-list ul li a').each(function(i,v){ $(v).attr('title', $(v).attr('href').substr(1)) });
```
二変数関数を微分する

今日は主に二変数関数についてその微分法をまとめます。

# 状態遷移をベクトルにする

その前に、事前準備として、点の情報から方向を得たいということはままあります。たとえば時系列における店舗間の動線を得る、アクセスしたウェブページの履歴を得るといったときです。

個体情報を key に、アクセスポイントを area とすると

```py3
# 連想配列内のキーを探す
if key in dic:
    # 個体情報が移動しているか調べる
    if dic[key]["area"] == area:
        pass
    else:
        # 移動していれば移動元と移動先を出力する
        self._output(
            key, dic[key]["area"],
            area, timestamp,
            int(timestamp) - dic[key]["timestamp"]
        )
        # 連想配列の情報を移動先とその時刻印に置換する
        dic[key] == {
            "area": area, "timestamp": int(timestamp)
        }
else:
    # 連想配列になければ移動元とその時刻印として記憶する
    dic[key] = {
        "area": area, "timestamp": int(timestamp)
    }
```

これで
key, from, to, time
という二点間の移動情報を獲得できます。

# 多変数関数の微分法

## 方向微分係数

二変数関数 z = f(x, y) があったとき、 xy 平面上の点 x = (a, b) から、ベクトル u = (α, β) の方向に進んだ点は

```math
x + hu = (a + hα, b + hβ)
```

となります。これを用いて

```math
\frac {\partial f} {\partial \mathbf{u}} (a,b) = \lim_{h\rightarrow 0} \frac {f(a+h\alpha, b+h\beta) - f(a,b)} {h}
```

と定義される u が[方向微分係数](http://next1.msi.sk.shibaura-it.ac.jp/MULTIMEDIA/vectoranalpub/node15.html)です。


## 偏微分係数

f(x, y) の y を固定して x のみ変化する微分係数を x に関する[偏微分係数](http://ja.wikipedia.org/wiki/%E5%81%8F%E5%BE%AE%E5%88%86)と言います。

点 (a, b) における上記の偏微分係数は

```math
\frac {df} {dx} (a,b) = \lim_{h \to 0} \frac {f(a + h, b) - f(a, b)} {h}
```

と定義され、これは u = (1, 0) にしたがった方向微分係数と等価です。


## 高階偏導関数

f(x, y) を x で偏微分して偏導関数

```math
\frac {\partial f} {\partial x} = f_x
```

を得た後、さらに y で偏微分可能であれば[高階 (高次) の偏導関数](http://ja.wikipedia.org/wiki/%E5%81%8F%E5%BE%AE%E5%88%86#.E9.AB.98.E9.9A.8E.E5.81.8F.E5.B0.8E.E9.96.A2.E6.95.B0)

```math
\frac {\partial} {\partial y} \left(\frac {\partial f} {\partial x} \right) = \frac {\partial^2 f} {\partial y\partial x} = f_{xy}
```

を得るといったことができます。

## 勾配

ベクトル解析におけるスカラー場の[勾配](http://ja.wikipedia.org/wiki/%E5%8B%BE%E9%85%8D_%28%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E8%A7%A3%E6%9E%90%29)を得ます。

空間のある領域で定義されたスカラー場に用いて、スカラー関数の **勾配 (gradient)** を得ます。定義式は次の通りです。

```math
\nabla \psi = \mathrm{grad} \psi = \frac {\partial \psi} {\partial x} i + \frac {\partial \psi} {\partial y} j + \frac {\partial \psi} {\partial z} k
```

下向きの三角はナブラと呼びます。

## まとめ

計算機は単純な計算しかできないので n 次多項式についての一般解、すなわちテイラーの定理、多項式近似などを理解しておくと良いでしょう。
herokuでhubotのcronjobを動かす時はtimezoneに注意する


herokuでhubotを動かす時はTimezoneをちゃんと指定してあげないと適切な時間に実行されないです。
下記2パターンのどちらかでtimezoneを指定してあげましょう。

## パターン1: cronjobのメソッドにtimezoneを指定する
```
cronJob = require('cron').CronJob
module.exports = (robot) ->
  new cronJob '0 0 10 * * 1-5', () =>
    robot.send room: "#general", "やほー"
  , null, true, "Asia/Tokyo"
```

## パターン2: herokuのtimezoneを指定する

```
heroku config:add TZ=Asia/Tokyo
```
chocolateyの導入メモ

かったるいのでメモしておく

# chocolateyのインストール
 * https://chocolatey.org/ のワンライナーを実行する

# インストールしたもの
 * Mary
 * Atom
 * curl
 * Lein
 * ruby
 * SourceTree
 * sysinternals
 * winmerge
 * Spawner Data Generator (インストール失敗)

**パッケージリストを作っておいてインストールできるらしい**
http://qiita.com/himinato/items/11f4dc9a23afebbc242c

# よく使うコマンド
> choco search *keyword*
> cinst *package*

# chocolatey以外で導入したもの
 * http://www.rapidee.com/
DockerでIRCサーバーを立てる using ngircd

## やること
* タイトルのまま

## 動作確認環境
* Virtualbox 4.3.12
    * 作業PCはMac
* Vagrant 1.6.3
    * CentOS 6.5
    * Boxはコレを使用 → https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
* Docker 1.1.2

## Dockerfile
* [goldeneggg/centos-ngircd Repository | Docker Hub Registry - Repositories of Docker Images](https://registry.hub.docker.com/u/goldeneggg/centos-ngircd/)
    * コンテナのベースもCentOS6.5

## docker runしてngircd起動状態のコンテナを立ち上げる
* `-d`でバックグラウンド実行
    * ngircd自体はフォアグラウンド起動しているので、コンテナのプロセスは終了せずに残る
* 使用ポートは6667。ホストVMの同じポートにフォワードする

```
$ docker pull goldeneggg/centos-ngircd
$ docker run -t -d -p 6667:6667 goldeneggg/centos-ngircd
```

## 接続確認
* 作業PCの`hosts`に下記を追記

```
<VMのIPアドレス> ngircd.localdomain
```

* 作業PCのIRCクライアントから接続
    * サーバー : ngircd.localdomain
    * ポート : 6667
    * チャンネル : #Test
    * ニックネーム等は任意で


### 他PCからの接続
* `Vagrantfile`でVM <=> 母艦PC のポートフォワードを設定
* IRCクライアントのサーバー設定で "母艦PCのIP or 名前" と "フォワードしたポート" を設定すればアクセスできる（はず）


## チャネルを増やしたりとか、サーバー名変えたりとか、諸々カスタマイズしたい
* [goldeneggg/dockerfile-centos-ngircd](https://github.com/goldeneggg/dockerfile-centos-ngircd) を`git clone`
* `ADD_FILES/etc/ngircd.conf`をいじる
* `docker build`して`docker run`

```
$ git clone https://github.com/goldeneggg/dockerfile-centos-ngircd.git
$ cd dockerfile-centos-ngircd
$ vi ADD_FILES/etc/ngircd.conf

$ docker build -t goldeneggg/centos-ngircd:<任意のタグ> .
$ docker run -t -d -p 6667:6667 goldeneggg/centos-ngircd:<任意のタグ>
```

## 備考 Vagrantfile
参考までに

```
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

# VM initialize script
$yum_init = <<SCRIPT
yum update -y
SCRIPT

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos65_x86"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

  config.vm.define :vmcd do |vmcd|
    vmcd.vm.hostname = "vmcd"

    # network configuration
    vmcd.vm.network :private_network, ip: "192.168.56.110"

    # Dockerで立てたIRCに他PCからも接続させたい場合は、Macの任意のポートに6667をフォワード
#    forward_ports = { 26667 => 6667 }
#    forward_ports.each do |host_port, guest_port|
#      vmcd.vm.network :forwarded_port, host: host_port, guest: guest_port
#    end

    # vm customize
    vmcd.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", 1024]
    end

    # initialize (provisioner=shell)
    vmcd.vm.provision :shell do |s|
      s.inline = $yum_init
    end

    vmcd.vm.provision :docker do |d|
      d.pull_images "centos"
    end
  end
end
```
Git 環境構築 ～ Smart HTTP

#環境

サーバーマシン：Windows 7
Web サーバー：Apache 2.2（xampp）

#Git インストール

http://msysgit.github.io/

より、msysGit をダウンロードしてインストール。
設定は特にいじらずインストール。

https://code.google.com/p/tortoisegit/wiki/Download

より、TortoiseGit と日本語パッチをダウンロードしてインストール。

#Apache の設定変更

Apache の設定を次のように変更。

```httpd.conf
SetEnv GIT_PROJECT_ROOT "C:/usr/gitreps"
SetEnv GIT_HTTP_EXPORT_ALL

#↓ネットのサンプルでは必要とあったが、なくても動作した。
#SetEnv REMOTE_USER REDIRECT_REMOTE_USER
ScriptAlias /repos/ "C:/Program Files/Git/libexec/git-core/git-http-backend.exe/"

<Directory "C:/Program Files/Git/libexec/git-core/">
    Options +ExecCGI
    Order allow,deny
    Allow From All
</Directory>

<Location "/repos">
    Options Indexes
    AuthType Digest
    AuthName "Git"
    AuthUserFile "C:/usr/gitreps/.htpasswd_dig"
    Require valid-user
    Allow from all
</Location>
```

#パスワードファイルの生成

最後にパスワードファイルの作成。
今回は Digest 認証なので、htdigest.exe を使用。

>C:\xampp\apache\bin\htdigest -c C:/usr/gitreps/.htpasswd_dig "Git" <ユーザー名>

apache の再起動。


#最後に

ブラウザでは正常にアクセスできませんでした。。。
TortoiseGit からは正常にプッシュ、プルできました。
capistrano+werckerで複数の環境に自動デプロイ


capistrano自体はcapistrano-ext使えばproductionとかstagingとか複数環境へのデプロイができるようになるけど、それをwercker使って複数環境に自動デプロイできるようにした。

こちらを事前に見ておくと良いかもです。
[Rails+postgresql+capistrano環境のwercker設定](http://qiita.com/sue738/items/194d533a20e287547c9d)

## wercker.ymlファイル

```$WERCKER_DEPLOYTARGET_NAME``` という環境変数がdeploy先の名前として使える（後述の管理画面から指定するやつ）ので下記のようにymlファイルを作成する。

```wercker.yml
deploy:
    steps:
        - bundle-install
        - script:
            name: make .ssh directory
            code: mkdir -p "$HOME/.ssh"
        - create-file:
            name: write ssh key
            filename: $HOME/.ssh/id_rsa
            overwrite: true
            hide-from-log: true
            content: $WERCKER_SSH_KEY_PRIVATE
        - script:
            name: set permissions for ssh key
            code: chmod 0400 $HOME/.ssh/id_rsa
        - cap:
            stage: $WERCKER_DEPLOYTARGET_NAME
            tasks: deploy
```

## werckerの管理画面からDeploy targetsを設定

下記サムネイルの例はmasterブランチにmergeされたらproduction環境にデプロイしたい場合。stagingブランチにmergeされたらstaging環境にデプロイしたければ両方stagingと書けばいい。

![スクリーンショット 2014-08-19 18.17.55.png](https://qiita-image-store.s3.amazonaws.com/0/8463/79d7c27d-b965-fc57-f050-5488bf6c3b41.png "スクリーンショット 2014-08-19 18.17.55.png")

いくつか環境があればその分だけ管理画面から作成してあげればそれだけ自動デプロイされるようになります。
C++ 環境構築とHello World


##環境構築

###Mac OSX
デフォルトで環境がインストールされているので、確認する。

```Bash
$ which g++
/usr/bin/g++

```
###Windows
Eclipseや、Visual StudioなどのIDEを利用する。

###CentOS
インストールコマンド

```Bash
$ sudo yum install gcc-c++

``` 

###Debian
インストールコマンド

```Bash
$ sudo apt-get install g++

```



##Hello World

```main.cpp
#include <iostream>

int main()
{
  std::cout<<"hello world"<<std::endl;
  return 0;
}

```

コンパイルすると、デフォルトでは、ファイル名```a.out```で出力される。
実行するときは、同一ディレクトリでもフルパスで指定する。（パスを指定しないと、シェルがライブライリ内を検索するため）

```Bash
$ g++ main.cpp

$ ./a.out

hello world

```

***

出力ファイル名を指定したい場合は、コンパイル時に、```-o 出力ファイル名```オプションをつける。

```Bash
$ g++ -o jk main.cpp

```
動的メソッド追加の罠

## 罠

親クラスに動的メソッド追加すると、子クラスで同名のメソッドが動的追加できなくなる、とある例。

## 背景

動的メソッド追加してるとあるクラスと、これを継承したサブクラスがあった。

それぞれのテストを実行すると全部パスする。
なのに、親クラスのテストをした後、子クラスのテストをすると失敗する。

## 何が起きていたか

よーく見ると動的メソッド追加したメソッドだった。
現象を際限するためのコードは以下。
端的に言うと、動的メソッド追加の順番でやらかしてた。

```rb
class Hoge
  def method_missing(name, *args)
    define_method_name(name.to_s)
    send(name)
  end

  def define_method_name(name)
    self.class.class_eval <<-EOF
      def #{name}
        puts "#{self.class}\##{name}"
      end
    EOF
  end
end

class Fuga < Hoge; end
class Piyo < Hoge; end
class Moga < Piyo; end

Piyo.new.foo  #=> Piyo#foo
Hoge.new.foo  #=> Hoge#foo
Fuga.new.foo  #=> Hoge#foo
Moga.new.foo  #=> Piyo#foo

```

最後4行でやってること

* Piyo.new.foo : Piyoにfooがない -> Hogeにfooがない -> Piyoにfooを追加して呼び出す
* Hoge.new.foo : Hogeにfooがない -> Hogeにfooを追加して呼び出す
* Fuga.new.foo : Fugaにfooがない -> Hogeにfooがある -> Hogeのfooを呼び出す
* Moga.new.foo : Mogaにfooがない -> Piyoにfooがある -> Piyoのfooを呼び出す

## 結論

黒魔術書くときは注意！
超絶Pythonクイズ



##問題
"全角"を含む文字列間の距離を表すレーベンシュタインの編集距離を求めるパフォーマンスの良い関数を書け

ただし、追加,削除,置換のコストをすべて1とする。

##リーベンシュタインの編集距離とは？
>レーベンシュタイン距離（レーベンシュタインきょり）あるいは編集距離（へんしゅうきょり）は、情報理論において、二つの文字列がどの程度異なっているかを示す数値である。具体的には、文字の挿入や削除、置換によって、一つの文字列を別の文字列に変形するのに必要な手順の最小回数として与えられる。
実際的な距離の求め方を例示すれば、“kitten”を“sitting”に変形する場合には、以下に示すように最低でも 3 回の手順が必要とされるので、2単語間のレーベンシュタイン距離は 3 となる。
kitten
sitten （“k”を“s”に置換）
sittin （“e”を“i”に置換）
sitting （“g”を挿入して終了）
(wikipediaより)

##ヒント(半角文字列の場合の編集距離を求める関数)

```python
def levenshtein(s1, s2):
    if len(s1) < len(s2):
        return levenshtein(s2, s1)
 
    # len(s1) >= len(s2)
    if len(s2) == 0:
        return len(s1)
 
    previous_row = range(len(s2) + 1)
    for i, c1 in enumerate(s1):
        current_row = [i + 1]
        for j, c2 in enumerate(s2):
            insertions = previous_row[j + 1] + 1 # j+1 instead of j since previous_row and current_row are one character longer
            deletions = current_row[j] + 1       # than s2
            substitutions = previous_row[j] + (c1 != c2)
            current_row.append(min(insertions, deletions, substitutions))
        previous_row = current_row
 
    return previous_row[-1]
```

下記より引用
http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#Python
[Wicket]　エラー集

#エラー集
自分の為に書き留めておくものです。
基本的にエラーを読めばわかると思いますが、
失敗すればするほど増えて行きますOTL

##Failed to find markup file associated.
マークアップが見つからないと言われています。
Failed to find markup file associated.　〜Panel:[~Panel[Component id = ~~~ ]]
とりあえずPanelを弄っているときに出ました。
問題は、PanelのHTML作るの忘れてました（泣きたい
後はhtmlで< wicket:extend >で書くと出るみたいです(友人

##null or empty component ids are not allowed.
unable to find ~　と同じで、
HTML側にwicket:idが振られているのに、Java側に対応する
コンポーネントを作成していないことが原因。
flymakeで使われるPHPを変更する方法

この記事は次の条件に当てはまる人向けの記事です。

- EmacsでPHPのコードを書いている
- flymakeで動的に文法チェックをかけている
- PHP 5.5以降向けのコードを書くことがある（ジェネレータなど）
- flymakeが文法チェックに使うPHPのバージョンが古いけど、どこで設定しているのかわからない

Emacs使いなのにflymakeすら使っていない人はEmacsのメリットを出しきれていないと思うので、PhpStormに切り替えるまたはEmacsと併用することをオススメします。ちなみに私自身もPhpStormとEmacsを併用しています。

# flymakeが使うPHPのパスを変更する

flymakeが使うPHPのパスは変数値php-executableを利用しています。これをcustomizeで切り替えれば好きなPHPを使うことができます。このデフォルト値は「/usr/bin/php」なので、環境によっては古いPHPが使われてしまうというわけです。

これを変更するには、M-x customizeして、この値を「/usr/local/bin/php」などに設定すれば良いでしょう。僕は単に「php」としました。こうするとPATHから順に探してくれるようです。

蛇足ですが、EmacsのPATHは次の記事のようにinit.elで設定しておくと便利です。

- http://sakito.jp/emacs/emacsshell.html#path
Xcode+Swift Beta6で[AnyObject]をダウンキャストしている箇所でリンクエラーが発生したら

Beta5で動いていたのにBeta6でリンクエラーが発生したら、プロジェクトのDerivedDataを削除すると発生しなくなります。

XcodeでCommand-Shift-Option-Kでもいいらしいです。
チーム内に飯テロ爆撃が出来るhubotスクリプト

# hubot-meshi

[飯テロ.in](https://mstr.in/)からランダムで飯テロ画像を返すhubot-scripts。

![スクリーンショット 2014-08-19 17.00.24.png](https://qiita-image-store.s3.amazonaws.com/0/25388/aa3a0a1b-31e7-98b3-418f-682cca069e9f.png)

## インストール方法

1. `npm install hubot-meshi --save`
2. "hubot-meshi" を external-scripts.json に追加
3. Hubotをリスタートさせる

## コマンド

```
hubot meshi - ランダムで飯画像を爆撃します
```

## 参考URL
- [aozora0000/hubot-meshi](https://github.com/aozora0000/hubot-meshi)
- [hubotとhipchat連携](http://konyu.hatenablog.com/entry/2014/05/13/214812)
- [heroku+slack](http://nanapi.co.jp/blog/2014/06/04/slack_with_hubot/)
- [heroku+hipchat](http://www.mrlittlebig.com/blog/057/)
Ansible使ってみた

構成管理ツールのAnsibleを使ってみたのでメモメモ。

## 背景
最近システムをいくつか構築する機会があり、その度にWebサーバ入れてDBサーバ入れてという作業が面倒になってきたし、二度以上同じ作業が発生するならば自動化すべきだと思っているので自動化しようと思い立った。

VM上に構築するので、VMイメージのコピーでもいいかなと思ったが、VMイメージって10-100GBぐらいの容量になるしなんかもったいなと思った。
それなら、結構前からの話題のChef, Puppetなどのサーバ設定ツールを利用して管理すれば、レシピを管理すればいいだけなので容量的にはKBオーダー・・・これだ！！と思ってサーバ設定ツールを使うことに決めた。

軽く調べた感じでは、サーバ設定ツールには以下があるらしい。

* Chef
* Puppet
* Ansible

Chefが一番有名であり広く使われているのだが、Ansibleの設定は簡単だという話を聞くし、性格的に天の邪鬼なのでニッチなAnsibleを使ってみることにした。
`# Ansibleユーザの人ゴメンナサイm(_ _)m`

以下環境情報。

* ubuntu: 12.04
* ansible: 1.4.4

## Ansibleのインストール
以下のコマンドでインストールする。

```cmd:install_ansible
$ sudo apt-get install ansible
```

## Ansibleの基本的な使い方
sshで対象サーバにログインして各作業を実施する。
ローカルマシンにsshログインしてコマンドを実行してみる。

### Step1:ホストグループの作成
`ansible`の`hosts`ファイルにローカルマシンの設定を以下のように記載。

```file:/etc/ansible/hosts
[local-server]
127.0.0.1
```

これで`local-server`という名前で、`ansible`で操作可能となった。

### Step2:ssh設定
`ansible`はsshで接続してから色々コマンドを実行していくので、sshで接続できないと何もできない。

事前に`ansible`コマンドを使うマシンのpublickeyを`ansible`経由で接続するマシンの`authorized_keys`に登録する。

今の場合、使うマシンも接続するマシンも`localhost`なので以下のコマンドで登録する。

```cmd:register_key
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

```

### Step3:Ansibleコマンド実行
任意のコマンドは以下のように`-a`オプションを指定して実行する。

```cmd:cat_hosts
$ ansible local-server -a "cat /etc/hosts"
127.0.0.1 | success | rc=0 >>
127.0.0.1	localhost
```

### Step4:サービスインストール/状態(Playbook)
Apache2がインストールされているかどうかと起動しているかどうかを以下の`Playbook`で確認することができる。
yaml形式で書く。

```file:./simple-playbook.yml
$ cat ./simple-playbook.yml
---
- hosts: local-server
  sudo: yes
  tasks:
    - name: apache2 is installed?
      apt: pkg=apache2 state=installed

    - name: apache2 is running?
      service: name=apache2 state=started
```
`hosts`で作業対象のホストグループを指定して、`tasks`の`name`は単なるタスクの名称で、続く`apt`や`service`が正しい「状態」を表す。

例えば、`apache2`を停止してから`Playbook`を実行してみる。

```
$ sudo service apache2 stop
$ ansible-playbook simple-playbook.yml

PLAY [local-server] *********************************************************** 

GATHERING FACTS *************************************************************** 
ok: [127.0.0.1]

TASK: [apache2 is installed?] ************************************************* 
ok: [127.0.0.1]

TASK: [apache2 is running?] *************************************************** 
changed: [127.0.0.1]

PLAY RECAP ******************************************************************** 
127.0.0.1                  : ok=3    changed=1    unreachable=0    failed=0   

$
$ sudo service apache2 status
Apache2 is running (pid 1782).
```

playbookではあるべき姿を記載するので、事前に停止した`apache2`が起動されたことがわかる。

ふむふむ、状態を記載するのはいい。

次はWebサーバの設定やDBサーバの設定についても記載したいと思う。
iOS UIButton タップ時の共通処理を記述する例.

個々のUIButtonに対して音を出すのは面倒だったので、以下のようなUIButtonWithSEクラスを作り対応しました。

※[SEPlayer play]が音を鳴らす処理とします。

```objc
@interface UIButtonWithSE : UIButton

@property(nonatomic, strong) NSString* seName;

@end
```

```objc
@implementation UIButtonWithSE

-(void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
  if( event.type == UIEventTypeTouches ) {
    UITouch* anyObj = event.allTouches.anyObject;
    if( anyObj.tapCount == 1 && anyObj.phase == UITouchPhaseEnded) {
      if( self.seName != nil ) {
        [SEPlayer play:self.seName withVolume:1];
      }
    }
  }
  [super sendAction:action to:target forEvent:event];
}
```

----

できればUIControlEventsの状態で判別したかったのですが、それを捕捉する術が分からず、上記メソッドで捕捉しています。
sendActionメソッドの内容は適宜修正が必要かもしれません。
他に良い方法があればご教授願います。
ntpdateを使って日時を設定する

vagrantでCentOSを使っているのだけれど、時刻がずれていたのでntpdateを使うことにした。

```shell-session
$ yum install ntpdate.x86_64
$ sudo chkconfig --add ntpdate
$ sudo chkconfig --level 3 ntpdate on
$ sudo vi /etc/ntp/step-tickers
$ sudo /etc/init.d/ntpdate start
```

```vim:step-tickers
ntp.nict.jp
```
Ruby On Railsの勉強会


#フレームワークとは？
## 何故必要なのか？

- 画面表示との連携・分離  
- メンテナンス性の向上  
- シンプルな構成  
- データベースアクセスの柔軟性  

## どんな種類があるのか？

- Ruby
	- Ruby On rails
  	- sinatra
	- Merb 
- Java
- PHP
	- Symfony
	- CakePHP
	- Zend


## ライブラリとは違う  
- ライブラリは様々な機能をまとめて誰でも利用できるようにしたもの  
- フレームワークは機能だけではなく「仕組み」を提供するプログラム群のこと


#Railsの基礎知識

## Railsの特徴
### MVCアーキテクチャ
- M:Model
	- データアクセスに関する部分を受け持ちます
	- 主にデータベースにアクセスして、必要なデータを取得したり更新したります
	- Rails においては「app」フォルダ内の「models」フォルダにスクリプトファイルを用意しまうす
- V:View
	- 画面に表示されるWebページ部分を受け持ちます
	- テンプレートとなるERBファイルを作ります
	- Rails においては「app」フォルダ内の「views」フォルダにスクリプトファイルを用意しまうす
- C:Controller
	- 全体の制御を受け持ちます
	- 指定のアドレスにアクセスしたらModelを呼び出し、必要なデータを取得しViewにセットして画面に表示するというような一連の処理を行う
	- Rails においては「app」フォルダ内の「controllers」フォルダにスクリプトファイルを用意します

### 設定より規約
- 開発者が設定ファイルを記述するよりも、フレームワークのデフォルトの設定に従うようにする
- 例えば、、、Railsの命名規則
	- テーブル名 users
	- モデルのクラス名　User
	- モデルのファイル名 user.rb
	- コントローラのクラス名 UsersController
	- コントローラのファイル名 users_controller.rb

### DRY  
- 繰り返しを避けよ
- 同じコードを別の場所で繰り返し書かない

### スクリプトファイルの自動作成機能
- ファイル名クラス名を自動で生成する機能を用いる

### 必要なものは一通りある
- ローカルでの動作確認用のWebサーバ
- テスト用環境

# scaffoldでアプリを作ってみよう
##scaffoldとは？
Railsに搭載されているCRUD機能生成ツール  

- Create:新規作成  
- Read：参照  
- Update：更新  
- Delete：削除  
- システムにおける基本機能  

```
bundle exec rails g scaffold User name:string email:string birthday:date

rake db:migrate

```

Userはテーブル名


# Herokuにアップ！
HerokuはPaas
phpで.htaccessのSetEnvを$_SERVERに入れる奴

```php
<?php
$env_lines = file(getcwd() . '/.htaccess');
foreach ($env_lines as $env_line) {
	if (preg_match('/^SetEnv\ /', $env_line)) {
		$envs = explode(' ',$env_line);
		$server = $env = '';
		$server = str_replace("\n", "", $envs[1]);
		if (isset($envs[2])) {
			$env = $envs[2];
			$env = str_replace("\"", "", $env);
			$env = str_replace("\n", "", $env);
		}
		$_SERVER[$server] = $env;
	}
}
```
DateオブジェクトやBooleanを手っ取り早く数値変換する方法


JavaScriptのDateオブジェクトをUNIXタイムに変換するメソッドとしてgetTime()というのが用意されており、

```
new Date().getTime();
```

とすることで現在時刻をUNIXタイムで取得することができますが、

```
+new Date();
```

とするだけでも同様の結果を得ることができます。
つまり、+ という単項演算子を付与してあげることで整数型に変換してくれます。

ちなみに、

```
console.log(+true); // output: 1
console.log(+false); // output: 0
console.log(+"3"); // output: 3
```

といった具合に、Dateオブジェクト以外にも色々と数値変換が簡単にできるので便利です。
CSVファイルをデータベースにインポートする

PostgreSQL にて、テーブル hoges に対して hoge.csv の内容を挿入する方法について調べた。

# まとめ

1. hoge.csv がデータベースサーバに配置できるなら、COPY コマンドを使用する。
2. hoge.csv がクライアントにしか配置できないなら、\copy コマンドを使用する。

また、COPY コマンドを ruby 経由で実行するには、gem `postgres-copy` を使う。\copy は ruby から普通には実行できない。シェルスクリプトを使ったほうが良いかもしれない。

# 詳細

## COPY コマンド
postgres では COPY コマンドを使って、CSV ファイルのレコードをテーブルに挿入することができる。( http://www.postgresql.jp/document/9.2/html/sql-copy.html ) 対象となるファイル hoge.csv がデータベースサーバに存在するならば、下の SQL を実行することで問題は解決する。なお、COPY コマンドは標準 SQL ではない。ここではCSVファイルのパスを省略しているが、ドキュメントでは絶対パスで指定するのが推奨されている。

```sql
COPY hoges (column_names,...) FROM 'hoge.csv' WITH CSV
```

hoge.csv がデータベースサーバに存在しない場合は、事前に  `scp` 等のコマンドでファイルを転送する必要がある。`scp` などが利用できず、ファイルを転送できない時には下の方法で、直接データを送ることができる。（ただし、このような場合は次節の \copy を使うほうが楽である）

```sql
COPY hoges (column_names,...) FROM STDIN WITH CSV;
-- 続けて hoge.csv のデータを直接記述する
```


## \copy メタコマンド
上の節で説明した方法の省略形として \copy メタコマンドが存在する。こちらのコマンドは hoge.csv にサーバになくても良い。（クライアント側に置く必要がある）

```sql
\copy the_table (column_names,...) from 'hoge.csv' with csv
```

## Ruby との連携
Ruby で postgres にアクセスするには `pg` ( https://github.com/ged/ruby-pg ) という gem を使う。 COPY コマンドを実行するには、`pg` のコネクションを生成し、 `exec` メソッドで実行する。

```rb
con = PGconn.connect(...)
con.exec("COPY hoges (column_names,...) FROM 'hoge.csv' WITH CSV")
```

このような処理を隠蔽してモデルから実行する gem `postgres-copy` ( https://github.com/diogob/postgres-copy ) がある。しかし、残念なことに、メタコマンドは `pg` を介して行うことができない。（バックスラッシュが現れた時点でシンタックスエラーとなる）つまり、 \copy を使用することはできない。それでも強引にやるとすれば、システムコールから `psql` を経由して実行する方法がある。

```rb
copy_command = %q("\copy hoges (column_names,...) from 'hoge.csv' with csv")
Kernel::exec("psql -c #{copy_command}")
```

実際には `psql` にデータベースサーバへの接続情報を与えなければいけないため、より煩雑になる。 

CSV ファイルを読みこんでインポートする場合は `put_copy_data` メソッドを使って、下記のようにする手もあるかもしれない。（注：動作確認していないので、正しくないかもしれません）

```ruby
conn.copy_data "COPY hoges FROM STDIN CSV" do
  CSV.foreach("hoges.csv") do |row|
    conn.put_copy_data(row + "\n")
  end
end
```

詳しくは下記ドキュメントを参照。

http://www.rubydoc.info/gems/pg/PG/Connection%3Acopy_data