OmniAICreator/Qiita-1.07M huggingface dataset:
CMake+SWIGで簡単にC/C++の多言語バインディングを実現する

今ではすっかり有名になったCMakeとSWIGですが、この二つを組み合わせると簡単にC/C++のグルーコードを生成できます。

Advent Calendar2013を締めくくるにしてはショボい内容ですいません...

#PythonからC++のコードを使用する

##ディレクトリ構成

 * CMakeLists.txt
 * example.h
 * example.i
 * **build**

##テストプログラム

```cmake:CMakeList.txt
find_package(PythonLibs REQUIRED)
find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})
include(GenerateExportHeader)

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${PROJECT_BINARY_DIR}
    ${PYTHON_INCLUDE_PATH}
)

set(EXAM_SRCS
    example.h
)

set(INTERFACE_FILES
    example.i
)

set_source_files_properties(${INTERFACE_FILES} PROPERTIES CPLUSPLUS   ON)
swig_add_module(example python ${INTERFACE_FILES}
    ${EXAM_SRCS}
)

swig_link_libraries(example
    ${PYTHON_LIBRARIES}
)
```

```cpp:example.h
#pragma once
#include <string>
class ExampleClass{
    std::string m_msg;
public:
    ExampleClass() : m_msg("Hello World") { }
    const std::string& get_msg(){ return m_msg; }
    void set_msg(const std::string &msg){ m_msg = msg; }
};
```

```cpp:example.i
%module example
%include "std_string.i"

%{
#define SWIG_FILE_WITH_INIT
%}
%{
#include "example.h"
%}

%include "example.h"

```

##ビルド

    $cd build && cmake .. && make

##実行
    $python
    >>> import example
    >>> e = example.ExampleClass()
    >>> e.get_msg()
    'Hello World'
    >>> e.set_msg("FizzBuzz")
    >>> e.get_msg()
    'FizzBuzz'

#他の言語では

CMakeLists.txtで他言語を指定すれば使えます。
Rubyにクラスメソッドなんてなかった


「RubyでのクラスメソッドはClassオブジェクトのインスタンスメソッドだった」という事実に衝撃を受けたのでメモします。

## クラスメソッドはClassオブジェクトのインスタンスメソッドだった

クラスメソッドはだいたい以下の方法で定義するかと思います。

```ruby
class MyClass
  def self.method1
    p “method1 called!”
  end

  def MyClass.method2
    p “method2 called!”
  end

  class << self
    def method3
      p “method3 called!”
    end
  end
end

MyClass.method1  # => "method1 called!"
MyClass.method2  # => "method2 called!"
MyClass.method3  # => "method3 called!"
```

ここでこの定義方法や使い方を眺めてると、まさしく”MyClassというClassオブジェクトのインスタンスメソッド”なんですよね。特異メソッドや特異クラスを使用して定義しています。

特異メソッドや特異クラスについてはこちらに詳しく載せられています。
http://blog.livedoor.jp/sasata299/archives/51497378.html

## じゃあ、Classオブジェクトのprivateインスタンスメソッドは？

ここまでのように、クラス定義の外でメソッドを呼べるのはそのメソッドがpublicであったためです。では、privateで定義するとどうなるのでしょうか？

```ruby
class MyClass
  class << self
    def method3
      p “method3 called!”
    end
    private
    def method4
      p “method4 called!”
    end
  end

  method3 # => “method3 called!”
  method4 # => “method4 called!”
end

MyClass.method3  # => “method3 called!”
MyClass.method4  # => Error
```

privateだとクラス外では使用できませんが、クラス内で使用できます。
attr_accessorなどのメソッドもこれで定義できるようになります。

## まとめ

* クラスAのクラスメソッドはAというClassオブジェクトのインスタンスメソッド
* このメソッドはクラスAの定義中に直に記述できる
* privateだとクラスAの定義外でA.method1のようには使えない
[2013年] 個人的によく使うgit configまとめ

コンソールからgit configコマンドでgitの設定を追加しています。
-globalオプションでユーザー単位の設定ファイルに設定されます。
CentOS等Linux系だとデフォルトは/home/user/.gitconfigです。

```bash
# コミット時に表示されるユーザー名の設定
git config --global user.name "User Name"

# コミット時に表示されるメールアドレスの設定
git config --global user.email "mail@example.com"

# pushする際に現在選択中のブランチに紐づくリモートブランチにのみpushする
git config --global push.default tracking

# git st でgit statusをカレントディレクトリに対して行うエイリアス
git config --global alias.st "status ."

# git checkout のエイリアス
git config --global alias.co checkout

# git commit のエイリアス
git config --global alias.ci commit

# コミットログの詳細表示エイリアス
git config --global alias.stat "log --stat --summary"

# 空白を無視するgit diffのエイリアス
git config --global alias.diff "diffw -w"

# git コマンドのカラー指定
git config --global color.ui auto

# commit コメントエディターをvimに指定
git config --global core.editor vim

# pager 指定
git config --global core.pager "lv -c"
```

git pushは何も指定しないと全てのローカルブランチに紐づくリモートブランチへとpushが行われるため、
カレントブランチのみpushするようにしてあります。

設定していない場合、現在切り替えてないブランチに対してpushを行おうとして、
リモートのリビジョンの方が進んでる場合はrejectを食らうだけなのでたいして影響はありません。
とはいえ今選択しているブランチのみpushという方が直感的にわかりやすいのでこの設定を使っています。

aliasではサブバージョン風の短縮コマンドと、便利だけど毎回オプションをつけるのが面倒臭いコマンドを設定しています。
git statusコマンドはリポジトリのルートディレクトリからのステータスを表示するため、
git stと打ったときはカレントディレクトリ以下のステータス表示するように横着してます。

git logはオプションをつけないと変更したファイルが見れないため、
git statとやると変更したファイルとコミットログが表示されるようにしてあります。
【PHP】foreach文で全値の表示方法

こんにちは。

foreach文の値を表示させるためのメモ。

```php
$myAry = array(
    "1" => "t",
    "2" => "o",
    "3" => "m",
    "4" => "o") ;

foreach($myAry as $key => $val ){
    echo $myAry[$key] ; 
}
//出力結果 tomo

```

やっていること自体はfor文のcount()が
$keyに変わった印象です。

ちなみに//$keyの出力は

```php
foreach($myAry as $key => $val ){
    echo $key ; 
}
```

でOK。

それではこれからも宜しくお願いします。

*****
追記：

```php
foreach ($myAry as $val) {
    echo $val;
}
```
全値の表示はこちらでした。
ありがとうございます！
git statusを高速化する


下記の設定をしておくことでgit statusが高速化します。
インデックスとファイルシステムの比較が複数のスレッドで並列に行われるようになり、WindowsやNFSなどI/Oのレイテンシが大きい場合に特に効果があるようです。

```
git config core.preloadindex true
```
Maven使ってる時のJavaFXの設定

[JavaFX](http://www.oracle.com/technetwork/java/javafx/overview/index.html)をmavenから利用するときは[JavaFX Maven Plugin](http://zenjava.com/javafx/maven/)が利用できる．

pom.xmlに以下を追加し

```xml
<plugin>
    <groupId>com.zenjava</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>2.0</version>
</plugin>
```

以下のコマンドを実行する
> sudo mvn com.zenjava:javafx-maven-plugin:2.0:fix-classpath

なお，下のコマンドは[JDKのクラスパスにJavaFXが入ってない](http://zenjava.com/javafx/maven/fix-classpath.html)ことがあるため必要らしい
Linux PHPからODBCでSQL Serverに接続

## はじめに
[LInuxからSQL ServerにODBCで接続](http://qiita.com/arachan@github/items/5863c945dbe7507975d8)を読んで、isqlで接続確認していることを想定します。
設定していない方は上記のサイトで設定を行って下さい。

## 条件
* isqlでSQL Serverに接続確認済み
* DSN名: 2008R2
* DB username:  sa
* DB password: password
* sudo tasksel lamp-serverでApacheとPHPがインストール設定済み

## php5-odbcドライバーをインストール
下記のようにphpのodbcドライバーをインストールします。

```
$ sudo apt-get install php5-odbc

```

## wwwrootに移動
$ cd /var/www

## phpファイルを作成
$ sudo vi odbc_2008R2.php

```php:odbc_2008R2.php
<?php

$conn=odbc_connect(
"2008R2","sa","password");

if($conn){
 print "Conneted!</br>";
}
else
{
 print "error";
}
$query_result=odbc_exec($conn,"SELECT * FROM [日本語テーブル達].[dbo].[名前リスト]");
$row=odbc_fetch_array($query_result);

if($row !=FALSE)
{
echo "{$row['名前']}<br />";
}
odbc_free_result($query_result);
odbc_close($conn);

?>
```

以下のように表示されていれば成功です。

```:ブラウザー上の表示
Conneted!
織田 信長

```

## PHP7.0の場合

PHP7の場合は下記のパッケージを使えばPHPでODBCに接続することができる。

Ubuntu/Debian
[php7.0-odbc](https://packages.debian.org/sid/php7.0-odbc)

```bash:debian/ubuntu
~# apt-get install php7.0-odbc
```

RedHat/CentOS
[php7.0w-odbc](https://pkgs.org/centos-6/webtatic-x86_64/php70w-odbc-7.0.6-1.w6.x86_64.rpm.html)

```bash:redhat/centos
~# yum install php7.0w-odbc
```
【Cake】mod_rewriteの設定

初期設定では.app直下の.htaccess内などにmod_rewriteの設定が記述されているが、これを有効にする必要がある。
そのため、apcheの設定ファイル（/etc/httpd/conf/httpd.conf）で2か所を修正する。

※mod_rewriteはURLの書き換えを行うapacheの設定。

①apacheのモジュールの読み込み設定
以下をコメントを外す。
LoadModule rewrite_module modules/mod_rewrite.so

②.htaccessの対象範囲に対してAllowOverride Allを設定する。
たとえば以下のような感じ。
＜Directory "/var/www/html"＞
    Options FollowSymLinks
    AllowOverride All
＜/Directory＞

ちなみに、404エラーが出る場合はmod_rewriteの設定が原因であることが多い。
ドキュメントルート直下にcakeを置く前提で、mod_rewriteが記述されているので、ドキュメントルート以外にcakeを置く場合はmod_rewriteを書き換える。
RecSys Handbook Chapter2  2.3.7~2.3.8

前回分はこちら↓↓
http://qiita.com/ru_pe129/items/146d26d77c4cf1c792dc
* * *
####2.3.7  Ensemble Classifiers
　訓練データから複数の分類器を作成してラベルを予測することを考えてみよう。各分類器はすべて独立であるという前提条件を置くと、分類結果は個々の分類器の結果で最悪のもの以下にはなりえない。つまり、分類結果は向上するかしないかの二択になるというわけである。　分類器を組み合わせる方法の中でも二つの一般的な方法としてBaggingとBoostingが挙げられる（よくわからなかったので説明は省略…）

####2.3.8  Evaluating Classifiers
　RSにおいて使われているもっとも一般的な評価指標は平均誤差や平均二乗誤差である。これらの指標は意図や仮定を持たない評価指標、つまり誤差を数値的にそのまま計算しているにすぎない。
　推薦を分類問題ととらえた場合には **Precision** や **Recall** などの有名な評価指標を用いることができる。これからこれらの評価指標のRSへの応用について説明していくが、ここで注意しておかなければならないことがある。 **推薦システムの評価では多面的な基準が存在する** ということである。正確さだけでなく、計算や分類の複雑さ、ノイズに対する強さ、スケーラビリティなど、RSの目的に応じて重視すべき評価基準は異なるのである。しかし、今回はRSのパフォーマンス（精度）のみを評価することにする。

　モデルを評価するために以下の4つの言葉を使う。
 ・　TP: True Positive　本来あるクラスAに所属すべきものがクラスAに分類された場合
 ・　TN: True Negative　本来あるクラスAに所属すべきでないものがクラスAに分類されなかった場合
 ・　FP: False Positive　本来あるクラスAに所属すべきでないものがクラスAに分類された場合
 ・　FN: False Negative　本来あるクラスAに所属すべきものがクラスAに分類されなかった場合
精度は一般的に以下の式で表すことができる。

```math
Accuracy = \frac{TP+TN}{TP+TN+FP+FN}
```
しかし、この表現は誤解を招く場合が多い。たとえば、2クラス分類でクラスAとクラスBのサンプルがそれぞれ99900個と100個であったとする。もしすべてのサンプルについてクラスAであると判断した場合はAccuracyは99.9%となる。しかし、クラスBのサンプルを1つも認識できていないため、精度が良いとは決して言えない。
　一つの改善方法として、誤った場合のコストを考慮する方法がある（分類を誤った場合にどれだけ大変なことになるか考える）。飛行機の部品で良品が99900個、不良品が100個ある場合を考えてみよう。この場合、良品を不良品として間違った場合は全体に与える影響は無視できるが、不良品を良品と誤って判断した場合は大変なことになる。
　他の方法としては、特に情報検索の分野で用いられているPrecisionとRecallがある。それぞれの定義は以下のとおりである。

```math
Precision = \frac{TP}{TP+FP}
Recall = \frac{TP}{TP+FN}
```
PrecisionはあるクラスAに分類したサンプルのうち、正しくクラスAに分類されたサンプルの割合を示す。RecallはあるクラスAに分類されるべきサンプルのうち、クラスAにきちんと分類されたサンプルの割合を示している。ここで気を付けなければならないのが、いずれの指標も分類方法によってはうまく精度を表せないことがあるということである。Precisionの場合、クラスAに属するサンプルをサンプリングできていなかった場合は適切に評価することができない。Recallについても同様である。実際にはPrecisionとRecallを組み合わせた指標としてF値が存在し、以下の式で定義される

```math
F_{1} = \frac{2RP}{R+P}=\frac{2TP}{2TP+FN+FP}
```
　時に分類器のパフォーマンスを推定するよりもそれぞれを比較したい場合がある。このような場合、ノイズ信号の分析のために開発されたReceiver Operating Characteristic(ROC) Curveという手法を用いることができる。ROC曲線の例を以下に示す。ROC曲線は正解と誤りの関係を示すものである。

![PCA.png](https://qiita-image-store.s3.amazonaws.com/0/28744/74389d6e-f5b3-bed7-d889-91fb95f0bb08.png)
ROC曲線はRSの評価にも用いられている。

評価指標の選び方は現在も議論されているテーマである。8章では本節で取り扱った評価指標のいくつかをさらに詳しく述べている。

* * *
少し短いですが、ちょうど2.3が終わったのでこれで終わりにします。
次回はk-meansについて取り扱う予定です。

ちょっと図が大きすぎますかね…次回以降気を付けます。
modern.IEのOSX上のVirtualBox VMのダウンロードから起動までを自動化するスクリプト

[Modern.IE](http://www.modern.ie/)のVirtualBox VMのダウンロードから起動までを自動化するbashスクリプトを作りました。
https://github.com/hnakamur/modern.ie.virtualbox.scripts

例えば、IE9 - Win7のVMをダウンロードして起動するには以下のようにします。

```shell-session
$ git clone https://github.com/hnakamur/modern.ie.virtualbox.scripts
$ cd modern.ie.virtualbox.scripts
$ ./start_modern_ie_virtualbox_vm.sh "IE9 - Win7"
```

サポートしているVMタイプは以下の通りです。

* IE6 - WinXP
* IE8 - WinXP
* IE7 - Vista
* IE8 - Win7
* IE9 - Win7
* IE10 - Win7
* IE11 - Win7
* IE10 - Win8
* IE11 - Win8.1

このスクリプトは以下の処理を行います。

- VMタイプと同名のVMが登録されていなかったら
    - VMタイプと同名の*.ovaファイルが存在しなかったら
        - VMの分割ファイル (*.sfxと*.rar)をダウンロードして結合し*.ovaファイルを作成します。(その後*.sfxと*.rarは削除します)
            - *.sfxと*.rarは既に存在するファイルはスキップします。途中終了したりして不完全なファイルがある場合は、消してからスクリプトを再実行してください。
    - *.ovaファイルをインポートしてVMを作成します。
    - VMのDVDストレージにVirtualBox GuestAdditionsのDVDイメージをマウントします。
- VMを起動します。
- VMのクリップボード連携を双方向に設定します。

つまり、初回はVMファイルのダウンロードとVM作成を実行しますが、VM作成済みならそのまま起動します。
コマンドライン上からPHPスクリプトに$_GETを渡す

デバッグのためにターミナルからPHPのスクリプトにGETリクエストの変数を渡したいことがたまにある．
調べてみたら`php-cgi`なるものをインストールすると幸せになれるらしいのでやってみた．

Ubuntu(-14.04)

```bash
$ sudo apt-get install php-cgi
```

Ubuntu(14.10)

```bash
$ sudo apt-get install php5-cgi
```

Arch Linux

```bash
$ yaourt -S php-cgi
```

軽くテスト

```php:test.php
<?php
print_r($_GET);
```

```bash
$ php-cgi test.php hoge=fuga foo=bar num=1
X-Powered-By: PHP/5.3.10-1ubuntu3.9
Content-type: text/html

Array
(
    [test_php] =>
    [hoge] => fuga
    [foo] => bar
    [num] => 1
)
```

参考:
http://serverfault.com/questions/187025/how-to-pass-get-variables-to-a-php-script-via-the-command-line/187038#187038
git寄せ書き-備忘録-

## ローカルの変更を元に戻す
```
git checkout .
```

また、一部ファイル、フォルダのみ変更したい場合には、それを指定する

```
git checkout hoge.txt
```

>【参考】
> http://tnakamura.hatenablog.com/entry/20090504/1241398150


## マジでローカルの変更を全て取り消し、リモートと同じ状態にする
```
git reset --hard FETCH_HEAD
```

   
## git resetが何をしているか
>【参考】
> http://qiita.com/fnobi/items/ec036c1b5d7ee5a8517c

## .gitignore

【現象】
.gitignoreには追加しているけど、gruntしてmodifyで表示されてしまう(.gitignoreが適応されない)

【原因】
.gitignoreには追加していても、リポジトリに既に上がっている場合、スルーされない


【対応策】
リポジトリからignoreしたいファイルorフォルダを一旦消す必要性あり
そのために、色んなところで上がっている

```
git rm -r --cache
```

が必要になる。これを行った後、必然的にこれらのdeleteがstageに乗る。それは、リポジトリから消さないとignoreに反映されないから。

【参考】
>既にコミットされてるファイルを、後から .gitignore で除外したくなった際、まずはリポジトリから削除しないと除外できません。
http://d.hatena.ne.jp/kanonji/20101116/1289885277
  
>gitignoreの勉強になったサイト
http://d.hatena.ne.jp/maeharin/20130206/gitignore

【備考】
gitignoreの総まとめがされている
>https://github.com/github/gitignore


【ディレクトリの指定】
同階層の「.settings」ディレクトリを無視したい。

```
.settings/
```
最後に"/"が必要
git寄せ書き-トラブルシューティング-

git checkoutしようとした時
「error: The following untracked working tree files would be overwritten by checkout」

メッセージが出る原因

【対応策】
この問題が発生した場合は、以下の手順をお試しください。
git reset --hard FETCH_HEAD

【要調査】
このresetが何で--hardが何でFETCH_HEADが何なのか

【参考】
http://qiita.com/notanota/items/7ce3b9813b417db359f5

---
git checkout しようとした時
fatal: Unable to create '/[directory]/.git/index.lock': File exists.

If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.

【原因】
index.lockが解除されなかった

【対応策】
rm index.lock

【要調査】
index.lockが解除されない原因

【参考】
http://nonoswitch.hatenablog.com/entry/2012/11/17/225702
TypeScriptでサーバーとクライアントのコードを共通化する

```ts:hoge.ts
export function hogehoge() {
  console.log('hoge');
}
```

こんなモジュールがあったとして、

```ts:main.ts
import hoge = require('./hoge'); // "./"で始めて相対パス

hoge.hogehoge();
```

呼び出し側をこのように書きます。

そして、サーバー側はCommonJS形式で、クライアント側はAMD形式で出力します。
クライアント側はRequireJSでロードします。

RequireJSならファイルの分割を.js化後も維持できるので、デバッグが楽です。
AngularJSをTypeScriptで気持ちよく書くGruntプロジェクトテンプレート

AngularJSのテンプレートはyeomanを使って作ることもできますが、
生成されるコードは生のJavaScriptですしコマンドで勝手にコードが出てくるのがどうにもなじめないので、自分でテンプレートを作っています。

[progre/template-grunt](https://github.com/progre/template-grunt/tree/static-angularjs "progre/template-grunt")

AngularJSに、TypeScriptとtsdとRequireJSとBootstrapがセットになっています。

使い方
----

自分のプロジェクトに追加して、

```shell-session
$ npm install
$ grunt
```

するだけで、空のAngularJSのプロジェクトが立ち上がります。

```shell-session
$ grunt deploy
```

すると、distディレクトリにminify済みのアプリ一式が出力されます。

.d.tsを追加する時は、

```shell-session
$ grunt exec:tsd-install:【ライブラリ名】
```

すれば入ります。
【PHP】親クラスのメソッドをオーバーライドする。

こんにちは。

ちょっと検索すると、なんやかんやで難しい言葉(単語)を並べ
余計に混乱してしまうように感じるのは僕だけでしょうか。

オーバーライドを調べた時にこの現象に陥りました。。

利用法は
>
継承した子クラスで、親クラスで定義されたメソッドを再定義する。

上書きですね。

書き方

```php
class Parentclass {
    public function speak() {
        return "I'm Parent!";
    }
}        

class  Childclass extends Parentclass {
    public function speak(){
        return "I'm Child!" ;
    }
}

//出力確認
$speak = new Parentclass() ;
echo $speak -> speak() ; //I'm Parent!

$speak = new Childclass() ;
echo $speak -> speak() ; //I'm Child!


extendsで継承して、その後同じ名前でメソッドを定義してあげれば
オーバーライドの完了ですね。

これだけだと何に使うのかわかりませんが、
親クラスがもっと大きく、継承されているクラスが増えると必要になるのかななんて考えてます。

それでは、これからも宜しくお願いします。
MySQLに「古いスタイルのパスワードはサポートしてないよ」って怒られたら

普段は専らフロントエンド周辺の制作／開発を行っているのだけれど、
ここ数日〜1週間くらい、rubyおよびMySQLと格闘している。ただの趣味。

# MySQLに接続できない

ruby-mysql(2.9.12) を使って、MySQL (5.1.69) に接続しようとして失敗する。
以下のログを確認。

```
/usr/local/lib/ruby/gems/2.0.0/gems/ruby-mysql-2.9.12/lib/mysql/protocol.rb:192:in `authenticate': The old style password is not supported (Mysql::ProtocolError)
```

## パスワード方式が古い
Google先生に質問したところ、MySQLではバージョンアップでパスワードの方式が変更されていて、5系では 4.1以前の方式のパスワードをサポートしなくなったということらしい。
詳しいことはよく分からんが、要するにパスワードを新しい方式で書き換える必要があるということのようだ。

この問題に関連しそうな点で、ローカルとリモートサーバ上の環境はだいたい同じなのだけど、リモートにアップした時にこの問題に遭遇した。そこで、mysqlデータベース内に保存されているパスワードを確認してみた。
「mysql」データベース＞「user」テーブル＞「Password」カラム
すると、どちらも同じパスワードを設定しているはずなのに、保存されている値（暗号化されたあとの値）が異なっている。

###  なんで違っているのか
推測だけど、ローカルのはターミナル上からSQL文を手打ちしてユーザーを作成、パスワード設定したのに対し、
リモート上のはクライアントソフト（Sequel Pro）からユーザー作成、パスワード設定したため、そのときの設定がまずかったのだろうと思う。

## パスワードを書き換える
当該ユーザーで問題のリモートサーバーのMySQLにログインして、以下のクエリを投げてやる。

```mysql
SET SESSION old_passwords=0;
SET PASSWORD=PASSWORD('YOURDATABASEPASSWORD'); 
```

後で、「mysql」データベースの「user」テーブルを確認したところ、
「Password」カラムが確かに書き変わっているのが確認できた。（ローカルと同じになった）

このあと、先ほどのエラーは吐き出されなくなり、接続に成功した。

------
MySQLのパスワード方式が変更されたことがどういうことなのかとか、そういう原理的なことは理解してないが、解消策として書き残しておく。
modern.IEのWindows 7で日本語の表示と入力をできるようにする

# 2014-09-08 追記
[White Tiger - 英語版Windows 7 Ultimateを日本語化する方法]( http://www7b.biglobe.ne.jp/~whitetiger/win/win7_001.html )にスクリーンショット入りの親切な記事があったので、お好みでそちらをご参照ください。

# 概要

[Modern.IE](http://www.modern.ie/)のサイトで配布されているIEテスト用のWindows VMは英語環境になっています。これに日本語ランゲージパックをインストールして、日本語の表示と入力をできるようにするための手順のメモです。ついでにタイムゾーンも日本に変更します。

試したVMはIE8 Win7です。環境はOS X 10.8.5上のVirtualBox 4.3.6です。

# タイムゾーンを日本に変更。

1. スタートメニューの[Control Panel]をクリックします。
1. [Clock, Language, and Region]セクションのリンクをクリックします。
1. [Date and Time]セクションの[Change the time zone]リンクをクリックします。
1. [Date and Time]ダイアログが開いたら[Change time zone...]ボタンを押します。
1. [Time Zone Settings]ダイアログが開いたら[Timezone]ドロップダウンで[(UTC+09:00) Osaka, Sapporo, Tokyo]を選択し[OK]ボタンを押してダイアログを閉じます。
1. [Date and Time]ダイアログで[OK]ボタンを押してダイアログを閉じます。

# 日本語ランゲージパックのインストール

1. スタートメニューの[Control Panel]をクリックします。
1. [System and Security]をクリックします。
1. [Windows Update]セクションの[Check for updates]をクリックします。
1. [Windows Update]のページに切り替わったら[Check for updates]ボタンを押し、更新チェックが終わるのを待ちます。
1. まだ[Install updates]ボタンは押さないでください！今押すとIE10がインストールされてしまいます。[19 important updates are available]のリンクをクリックします。
1. [Internet Explorer 10 for Windows 7]のチェックを外します。
1. 画面左の[Optional]タブをクリックしてタブを切り替えて、[Japanese Language Pack - Windows 7 Service Pack  (KB2483139)]にチェックをつけて[OK]ボタンを押します。
1. Windows Updateの画面に戻ったら[Install Updates]ボタンを押します。
1. インストールが終わったら[Restart now]ボタンを押します。

# 日本語環境に設定変更

1. 再起動したら、[Start]→[Control Panel]とクリックしてコントロールパネルを開きます。
1. [Clock, Language, and Region]セクションの[Change display language]をクリックします。[Region and Language]ダイアログが開きます。
1. ダイアログ内の[Choose a display language]のドロップダウンで[日本語]を選択します。
1. [Change keyboards…]ボタンを押し、新たに開いたダイアログで[Default input language]で[Japanese (Japan) - Microsoft IME]を選択して[OK]ボタンを押してダイアログを閉じます。
1. [Region and Language]ダイアログの[Location]タブに切り替えて[Current location]ドロップダウンで[Japan]を選択します。
1. [Formats]タブに切り替え[Format]ドロップダウンで[Japanese (Japan)]を選択します。
1. [Region and Language]ダイアログで[OK]ボタンを押して設定変更を反映します。
1. [You must log off for display language changes to take effect]というダイアログが表示されたら、[Log off now]ボタンを押します。
1. ログイン画面に戻ったらパスワードにPassw0rd!と入力してログインします。デスクトップのごみ箱アイコンのラベルが「ごみ箱」と日本語になっていればOKです。

英語キーボードのMacBookの場合はalt+`を押すたびに半角全角がトグルで切り替わります。IEの検索画面で日本語を入力してみたスクリーンショットを添付します。
![input japanese in IE.png](https://qiita-image-store.s3.amazonaws.com/0/3227/a3fbe4be-9c78-f37c-9416-9d2452c89f55.png)
Gemのメモ

gem関連に関してメモを残します。

# .gem ファイルを展開してパッケージの中身を見る

.gem ファイルを展開してパッケージの中身を見る方法を紹介します。

`gem unpack`はgemをインストールしたくないけど、単に中身を見たいときなどに役に立ちます。

`gem unpack xxx.gem` のように使います。

```bash:gem-unpack
[~/Downloads]$ gem unpack unicode_math-1.2.0.gem
Unpacked gem: '/Users/gam0022/Downloads/unicode_math-1.2.0'
[~/Downloads]$
[~/Downloads]$ tree unicode_math-1.2.0
unicode_math-1.2.0
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── lib
│   ├── unicode_math
│   │   ├── constants.rb
│   │   ├── division.rb
│   │   ├── exponents.rb
│   │   ├── fractions.rb
│   │   ├── multiplication.rb
│   │   ├── roots.rb
│   │   ├── set.rb
│   │   ├── sigma.rb
│   │   └── trigonometry.rb
│   └── unicode_math.rb
├── spec
│   ├── spec_helper.rb
│   ├── support
│   │   └── random.rb
│   └── unicode_math
│       ├── constants_spec.rb
│       ├── division_spec.rb
│       ├── exponents_spec.rb
│       ├── fractions_spec.rb
│       ├── multiplication_spec.rb
│       ├── root_spec.rb
│       ├── set_spec.rb
│       ├── sigma_spec.rb
│       └── trigonometry_spec.rb
└── unicode_math.gemspec

5 directories, 26 files
```

# .gem ファイルから gem をインストールする

.gem ファイルから gem をインストールする方法を紹介します。

RubyGems でリンク切れを起こしたgemを無理やりインストールしたいときに使いました。

`gem install -l xxx.gem` のように使います。

``` bash:gem-install-l
[~/Downloads]$ gem install -l unicode_math-1.2.0.gem

Successfully installed unicode_math-1.2.0
Parsing documentation for unicode_math-1.2.0
Installing ri documentation for unicode_math-1.2.0
1 gem installed
```
iText(Java PDF ライブラリ) のライセンスについて


### iText
http://itextpdf.com/

参考
http://dev.classmethod.jp/server-side/java/jasperreports-tutorial/

## 現行バージョン 5系

* AGPL ライセンス
* http://okwave.jp/qa/q8374217.html
* 内部での利用以外では、商用ライセンスを買うか、組み込んだもののソースコードを開示しないといけないようだ
* 商用ライセンスは結構高いです。

## 旧バージョン 4系

* LGPL ver.3 と MPL ver.2 のデュアルライセンス
	* LGPL
		* 内部利用OK
		* LGPLプログラムを組み込んだものを、再頒布する際にはソースコードを公開する必要がある 
		* = 頒布しないならソースコード公開しなくてもいい
		* http://www.opensource.jp/gpl/gpl.ja.html
		* http://oshiete.goo.ne.jp/qa/2982240.html
		
	* MPL
		* http://www.mozilla-japan.org/MPL/mpl-faq.html
		* = 頒布しないならソースコード公開しなくてもいい

* Maven Repository
http://mvnrepository.com/artifact/com.lowagie/itext

間違っていましたらご指摘下さい。
OSXのスクリーンショットにドロップシャドウを付けないようにする

# 特定のウィンドウのスクリーンショットの取り方

Command-Shift-4で特定のウィンドウだけのスクリーンショットが取れます。具体的な手順は以下の通りです。

1. Command-Shift-4を押します。
2. 対象のウィンドウ内にマウスカーソルを移動します（クリックはしません）。
3. スペースキーを押します。
4. マウスカーソルがカメラのアイコンになったら左クリック

が、デフォルトの設定では、スクリーンショットの画像は下記の例のようにウィンドウのまわりにドロップシャドウがついた状態で作成されます。

![スクリーンショット 2013-12-26 9.38.50.png](https://qiita-image-store.s3.amazonaws.com/0/3227/15fd6c48-08bd-8850-0631-0b121b527aae.png)

# ドロップシャドウをつけないように設定

ドロップシャドウをつけないようにするには、ターミナルで以下のコマンドを実行します。

```shell-session
$ defaults write com.apple.screencapture disable-shadow -bool true
$ killall SystemUIServer
```

以下のコマンドで状態を確認します。

```shell-session
$ defaults read com.apple.screencapture disable-shadow 
1
```

となればOKです。

この状態でとったスクリーンショットの例です。
![スクリーンショット 2013-12-26 9.45.40.png](https://qiita-image-store.s3.amazonaws.com/0/3227/ccd01c0a-a2b3-9f11-c22c-b7840498ed17.png)

# 元の設定に戻す手順

もし、元の設定に戻したい場合はターミナルで以下のコマンドを実行します。

```shell-session
$ defaults delete com.apple.screencapture disable-shadow
$ killall SystemUIServer
```

戻せたかの確認は以下のようにコマンドを実行して"does not exist"と表示されればOKです。

```shell-session
$ defaults read com.apple.screencapture disable-shadow 
2013-12-26 09:49:20.283 defaults[90491:707] 
The domain/default pair of (/Users/hnakamur/Library/Preferences/com.apple.screencapture, disable-shadow) does not exist
```

# 謝辞
この記事は[Disable the Window Shadow on Screen Shots in Mac OS X](http://osxdaily.com/2011/05/23/disable-shadow-screen-shots-mac/)を参考にしました。ありがとうございます。
trying to control sarigama while running

http://mohayonao.github.io/CoffeeCollider/#try:synth%20%3D%20SynthDef%20(sa%3D0.5%2C%20ri%3D0.5%2C%20ga%3D0.5%2C%20ma%3D0.5%2C%20pa%3D0.5%2C%20da%3D0.5%2C%20ni%3D0.5)-%3E%0A%20%20%20%20Out.ar(0%2C%20%5BPinkNoise.ar(0.1%20%2B%200.2%20*%20sa)%2C%20SinOsc.ar(400%20*%20ga)%5D)%0A.add()%0A%0Ax%20%3D%20Synth(synth).play()%0A%0Ax.set%20sa%3A0.9%0A%0Ax.set%20ga%3A0.7
Homebrewでパッケージのバージョン切り替え


rubyを2.1から2.0に切り替える場合。

```
$ ruby -v
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0]

$ brew switch ruby 2.0.0-p353
Cleaning /usr/local/Cellar/ruby/2.0.0-p247
Cleaning /usr/local/Cellar/ruby/2.0.0-p353
Cleaning /usr/local/Cellar/ruby/2.1.0
22 links created for /usr/local/Cellar/ruby/2.0.0-p353

$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-darwin12.5.0]
```

誤ってバージョンアップしたりしてもアンインストールせずに、そのまま切り替えるだけで使えるのが便利です。
error of "npm install -g coffee-collider" on my ubuntu1310

> speaker@0.0.10 install /usr/local/lib/node_modules/coffee-collider/node_modules/speaker
> node-gyp rebuild

make: Entering directory `/usr/local/lib/node_modules/coffee-collider/node_modules/speaker/build'
  CC(target) Release/obj.target/output/deps/mpg123/src/output/alsa.o
../deps/mpg123/src/output/alsa.c:19:28: fatal error: alsa/asoundlib.h: No such file or directory
 #include <alsa/asoundlib.h>

compilation terminated.
make: *** [Release/obj.target/output/deps/mpg123/src/output/alsa.o] Error 1
make: Leaving directory `/usr/local/lib/node_modules/coffee-collider/node_modules/speaker/build'
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/share/node-gyp/lib/build.js:267:23)
gyp ERR! stack     at ChildProcess.EventEmitter.emit (events.js:98:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:789:12)
gyp ERR! System Linux 3.11.0-15-generic
gyp ERR! command "nodejs" "/usr/bin/node-gyp" "rebuild"
gyp ERR! cwd /usr/local/lib/node_modules/coffee-collider/node_modules/speaker
gyp ERR! node -v v0.10.15
gyp ERR! node-gyp -v v0.10.9
gyp ERR! not ok 
npm WARN This failure might be due to the use of legacy binary "node"
npm WARN For further explanations, please read
/usr/share/doc/nodejs/README.Debian
 
npm ERR! speaker@0.0.10 install: `node-gyp rebuild`
npm ERR! `sh "-c" "node-gyp rebuild"` failed with 1
npm ERR! 
npm ERR! Failed at the speaker@0.0.10 install script.
npm ERR! This is most likely a problem with the speaker package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp rebuild
npm ERR! You can get their info via:
npm ERR!     npm owner ls speaker
npm ERR! There is likely additional logging output above.

npm ERR! System Linux 3.11.0-15-generic
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install" "-g" "coffee-collider"
npm ERR! cwd /root
npm ERR! node -v v0.10.15
npm ERR! npm -v 1.2.18
npm ERR! code ELIFECYCLE
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /root/npm-debug.log
npm ERR! not ok code 0
Chrome 新規タブでアドオンアプリが表示しなくなったので、Homeボタンで代用した。


1． [設定]
![bd39ed7e-c79b-89f7-b90e-fd9e995c41d4-3.png](https://qiita-image-store.s3.amazonaws.com/0/5472/e8e480bc-eee2-096d-1f38-40a78577adba.png "bd39ed7e-c79b-89f7-b90e-fd9e995c41d4-3.png")


2．[ホームボタンを表示する]にチェックを入れて [変更]をクリック
![設定-5.png](https://qiita-image-store.s3.amazonaws.com/0/5472/f8793d88-4c9d-3eb8-3c5f-995018eab3de.png "設定-5.png")


3．[アドレス]のラジオボタンをクリックして「 chrome://apps/ 」を入力 OKを押す

![設定_-_ホームページ-6.png](https://qiita-image-store.s3.amazonaws.com/0/5472/2b12702e-e4c8-5ffd-4b2d-fc4ece9184ee.png "設定_-_ホームページ-6.png")

完了！

あとは開きたいときに
Alt+Home （Macはshift + cmd + H）でいつでもアプリ画面を開くことができます。
Windowsで特定のフォルダを開くコマンドやスキーム


よく迷うのでメモとして書いておきます。

Windowsの深い場所にあったりするジャンプ構文というかスキームというか、そんな記法があります。

「ファイル名を指定して実行」もしくは「プログラムとファイルの検索」ボックスからこれらを入れると特定のフォルダを開いたりすることができます。Windows XPとWindows 7で試していますが、Windows 8以降でも使えるのではないかなと思います。

##control.exe

`control` コマンドの引数として以下のようなものを指定します。

|引数名|開くフォルダなど|
|:--------|:----------------|
|scannercamera|スキャナとカメラ|
|folders|フォルダオプション|
|netconnections|ネットワーク接続の仮想フォルダ|
|schedtasks|タスクの仮想フォルダ|
|admintools|管理ツール|
|fonts|フォント|
|printers|プリンタ|
|userpasswords2|ユーザアカウント|
|userpasswords|ユーザアカウント旧来のやつ|
|infrared|赤外線 (あるばあいのみ)|
|telephony|所在地情報|
|netware|？|
|keyboard|キーボードのプロパティ|
|mouse|マウスのプロパティ|
|international|地域と言語のオプション|
|ports|システムのプロパティのコンピュータ名のタブにフォーカス|
|date/time|日付と時刻のプロパティ|
|color|画面のプロパティのスクリーンセーバにフォーカス|
|desktop|画面のプロパティのテーマタブにフォーカス|
|panel|コントロールパネルを開く|

その他、パスが通っているところにある `*.cpl` ファイルを渡すとコントロールパネルの対応するウィンドウがオープンするようです。

##shellスキーム

Windowsには`shell:`スキームというものがあり、URLのようにこれを上述のボックスに入れてEnterを押すことによってフォルダを開いたりすることができます。

|スキーム|開くフォルダなど|
|:----------|:----------------------|
|shell:Administrative Tools|現在ログオンしているユーザーの管理フォルダ|
|shell:AppData|現在ログオンしているユーザーの ApplicationData フォルダ|
|shell:Common Administrative Tools|AllUsers の管理フォルダ|
|shell:Common AppData|AllUsers の ApplicationData フォルダ|
|shell:Common Desktop|現在ログオンしているユーザーのデスクトップ|
|shell:Common Documents|AllUsers の Documents フォルダ|
|shell:Common Favorites| AllUsers のお気に入りフォルダ|
|shell:Common Programs| AllUsers のプログラムフォルダ|
|shell:Common Startup| AllUsers のスタートアップフォルダ|
|shell:Common Templates| AllUsers の Templates フォルダ|
|shell:CommonProgramFiles|`%SystemDrive%\Program Files\Common Files` フォルダ|
|shell:ConnectionsFolder| ネットワーク接続フォルダ|
|shell:ControlPanelFolder| コントロールパネル|
|shell:Cookies| 現在ログオンしているユーザーのクッキーフォルダ|
|shell:DesktopFolder| 現在ログオンしているユーザーのデスクトップ|
|shell:DriveFolder| マイコンピュータ|
|shell:Favorites| 現在ログオンしているユーザーのお気に入りフォルダ|
|shell:Fonts| Fonts フォルダ|
|shell:History| 現在ログオンしているユーザーのヒストリーフォルダ|
|shell:InternetFolder| IE 起動|
|shell:Local AppData| 現在ログオンしているユーザーの `Local Settings\Application Data` フォルダ|
|shell:My Pictures| 現在ログオンしているユーザーのマイピクチャーフォルダ|
|shell:NetHood| 現在ログオンしているユーザーの NetHood フォルダ|
|shell:NetworkFolder| マイネットワークフォルダ|
|shell:Personal| 現在ログオンしているユーザーのマイドキュメントフォルダ|
|shell:PrintHood| 現在ログオンしているユーザーの PrintHood フォルダ|
|shell:PrintersFolder| プリンタと FAX フォルダ|
|shell:Profile| 現在ログオンしているユーザーのプロフィールフォルダ|
|shell:ProgramFiles| プログラムフォルダ|
|shell:Programs| 現在ログオンしているユーザーのプログラムフォルダ|
|shell:Recent| 現在ログオンしているユーザーの Recent フォルダ|
|shell:RecycleBinFolder| 「ごみ箱」フォルダ|
|shell:SendTo| 現在ログオンしているユーザーの SendTo フォルダ|
|shell:System| System32 フォルダ|
|shell:SystemX86| System32 フォルダ|
|shell:Templates| 現在ログオンしているユーザーの Templates フォルダ|
|shell:Windows| `%SystemDrive%\WinNT` フォルダ|
TwilioでSMSを送ってみよう。


Twilioを使えば簡単にSMSの送信が可能になる。

まず、Twilioから提供しているgemをインストールします。
```gem install twilio-ruby```

その他、Twilioはライブラリを提供している。
PHP, Python, .NET, JAVAなど、様々なプログラミング言語に対応されているので、各自好きな言語のライブラリをダウンロードすればより簡単にTwilioを楽しむことが可能になる。
詳細はこちら。
https://jp.twilio.com/docs/libraries

※ 注意
Twilio for KDDI Web Communicationsでは基本「050」番号を提供しているが、SMSに関してはアメリカ番号を使うことになっている。

下記のように短いコードを書くだけでSMSの送信が可能になる！

```ruby:twilio-sms.rb
# encoding: utf-8
require 'rubygems'
require 'twilio-ruby'
 
account_sid = '<Account SID>'
auth_token = '<Auth Token>'
 
client = Twilio::REST::Client.new(account_sid, auth_token)
 
from = "+141xxxxxxxx"
to = "+8180xxxxxxxx"
 
client.account.sms.messages.create(
:from => from,
:to => to,
:body => 'Twilio for KDDI Web CommunicationsからSMSの提供を開始します。簡単でしょう〜'
)
```

puts "SMSメッセージ送信完了。"
Rubyで名前の末尾以外に!や?を持つメソッドを定義したり呼び出したりする

普通はできない。

```rb
def a!b  # def a!(b) と解釈される
  "a!b"
end

def a?b  # def a?(b) と解釈される
  "a?b"
end

a!b  # a!(b)と解釈される
a?b  # a?(b)と解釈される
```

以下のようにする。

```rb
define_method(:'a!b'){"a!b"}
define_method(:'a?b'){"a?b"}

p send(:'a!b') #=> "a!b"
p send(:'a?b') #=> "a?b"
```

このように、名前の末尾以外に`!`や`?`を持つメソッドは通常の方法では定義や呼び出しができないので、任意の文字列などから新しいメソッドを作ったりする場合には注意が必要。たとえばActiveSupportの[`alias_method_chain`](http://apidock.com/rails/ActiveSupport/CoreExtensions/Module/alias_method_chain)は`foo!`や`bar?`のようなメソッド名が渡されると、`foo!_without_feature`や`bar?_without_feature`ではなく、`foo_without_feature!`や`bar_without_feature?`ようなメソッドを定義するようになっている。

---

<p xmlns:dct="http://purl.org/dc/terms/">
  <a rel="license"
     href="http://creativecommons.org/publicdomain/zero/1.0/">
    <img src="http://i.creativecommons.org/p/zero/1.0/88x31.png" style="border-style: none;" alt="CC0" />
  </a>
  <br />
  To the extent possible under law,
  <a rel="dct:publisher"
     href="http://qiita.com/vzvu3k6k">
    <span property="dct:title">vzvu3k6k</span></a>
  has waived all copyright and related or neighboring rights to
  this work.
</p>
Try Haxe!!! 手っ取り早くHaxeをやるためのサイト!!!

はいはい@nobkzです。

# Try Haxe!!!

## とりあえずHaxeやりたい人へ....

Haxeをweb上で試せるサイトがあります! それがコレです。

http://try.haxe.org/

最近Haxe3.0の機能が使える様になりますた。

たとえば、こんな感じでパターンマッチもちゃんと動作します。

![スクリーンショット 2013-12-26 0.44.50.png](https://qiita-image-store.s3.amazonaws.com/0/31381/1fee6471-6c0c-6ad0-0320-6cd74297f831.png)


手っ取り早くHaxeするには良いですね!!
PHPで優先度つきキュー

PHP5.3で[SplPriorityQueue](http://jp2.php.net/manual/ja/class.splpriorityqueue.php)、優先度つきキューが実装されました。
取得時、第二引数の値が高いものから順に並べ替えられます。
データの種類によっては、自力でソートする必要が無くなります。

```php
<?php
	
	$queue = new SplPriorityQueue();
	
	$queue->insert('低い', 10);
	$queue->insert('最優先', 100);
	$queue->insert('にばんめその1', 50);
	$queue->insert('にばんめその2', 50);
	$queue->insert('一番低い', 1);
	
	// 個数 → 5
	print('件数:' . $queue->count());
	
	// 一番目を閲覧。これは使っても無くならない。
	print('一番目:' . $queue->top());
	
	// 優先順位の高い順に取り出す
	foreach($queue as $key=>$val){
		print('キー:' . $key . '　値:' . $val);
	}
	
	// 一度使うと無くなる → 0
	print('件数:' . $queue->count());
	
	// rewindは意味がない
	$queue->rewind();
```

出力

```html
	件数:5
	一番目:最優先
	キー:5　値:最優先
	キー:4　値:にばんめその2
	キー:3　値:にばんめその1
	キー:2　値:低い
	キー:1　値:一番低い
	件数:0
```

優先したいデータから順に表示することができました。
なお、同じ優先度内での順番がどうなるかは保証されていません。

実用としてはわりと困ることに、[Wikipediaの定義通りの実装](http://ja.wikipedia.org/wiki/%E5%84%AA%E5%85%88%E5%BA%A6%E3%81%A4%E3%81%8D%E3%82%AD%E3%83%A5%E3%83%BC)がなされています。
どういうことって一度使ったら無くなってしまうんですよね。
具体的には[SplPriorityQueue::next()](http://jp2.php.net/manual/ja/splpriorityqueue.next.php)したときに、イテレータを進めるかわりにshiftするので値が消滅します。

なので繰り返し使う場合はcloneするか、配列に取り出すなどしてから扱う必要があります。
「Haxeの機能を無駄に使いまくったFizzBuzz」を解説してみた。


なんとなく、ちょっと前に書いたHaxeのFizzBuzzコードを解説してみる。

https://github.com/NobukazuHanada/HaxeFizzBuzz

# 「Haxeの機能を無駄に使いまくったFizzBuzz」を解説してみた。

## まずはイテレータ

HaxeにはIterator<T>という型があります。

```hx
    typedef Iterator<T> = {
        function hasNext() : Bool;
        function next() : T;
    }
```

この型であればfor構文を使うことができます。

FizzBuzzでは、実装したFizzBuzzのイテレータ型を作ってfor構文を使っています。

```
for( fizzbuzz in new FizzBuzzIter(100) ){
    fizzbuzzes.push( fizzbuzz.toString() );
}
```

### Iteratorの実装

Iteratorを実装するには、単純に、 **hasNext()メソッドとnext()メソッドを実装すれば良いだけ** です。どっかの言語ではIteratorインターフェースを実装しないとイケナイですがその必要がないのです。

```hx
class FizzBuzzIter{

        public function hasNext(){
                ...
        }

        public function next(){
                ...
        }
}
```

## enum

さて、FizzBuzzを実装するにあたって、FizzBuzzのenum型を実装しました。なぜなら、数値をFizzとBuzzを扱うので、それをまとめるためにenumを作りました。 **enumがパラメータを持つことができる** のはみなさんご存知でしょうからあえて説明する必要もないでしょう。

```hx
enum FizzBuzz{
        Fizz;
        Buzz;
        FizzBuzz;
        Number(i : Int);
}
```

## if式

Haxeの **ifは式** なので、 値を返します。なのでこのように書くことができます。

```hx
class FizzBuzzIter{
        //....

        public function next(){
                var result = if( this.i % 15 == 0 ){
                        FizzBuzz;
                }else if( this.i % 3 == 0 ){
                        Fizz;
                }else if( this.i % 5 == 0 ){
                        Buzz;
                }else{
                        Number(this.i);
                }
         // .....
        }
}
```

## using

さて、さっきつくったFizzBuzz型のインスタンスにtoStringメソッドをつくりましょう。どうするかって? **usingに決ってるじゃないですかー!!!** 

```hx
class FizzBuzzUtil{
        public static function toString(fizzbuzz : FizzBuzz){
                return switch (fizzbuzz) {
                        case Fizz: "fizz";
                        case Buzz: "Buzz";
                        case FizzBuzz: "FizzBuzz";
                        case Number(i): Std.string(i);
                }
        }
}
```

するとusing FizzBuzzUtilすると....

```hx
using FizzBuzzUtil; // using!!

class Main{
        public static function main(){
                var fizzbuzzes = new Array<String>();
                for( fizzbuzz in new FizzBuzzIter(100) ){
                        fizzbuzzes.push(   
                              fizzbuzz.toString()  
               // ここでenum型のインスタンスにメソッドが付いている!!!
                       );
                }


        }
}
```

##  テンプレートシステム

Haxeには **標準でテンプレートシステム** 標準で備わっています!!!

```hx
class Main{
        public static function main(){
                // ....

                var templateText = "::foreach fizzbuzzes:: ::__current__:: ::end::";
                var template = new haxe.Template(templateText);
                var output = template.execute({ fizzbuzzes : fizzbuzzes });
                trace(output);
        }
}
```

## 型推論とか構造的部分型とか!!!

じつは既につかっている!!! みんなわかっているよね???


## まとめ

Haxe素晴らしい!!!
Spiderを用いて分散させたMroongaの全文検索性能について

# はじめに

[ハードウェア性能に応じたMroonga/Groongaの全文検索性能について](http://createfield.com/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E6%80%A7%E8%83%BD%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%9FMroonga/Groonga%E3%81%AE%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E6%80%A7%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)では、ハードウェア性能に応じた全文検索性能を比較しました。その結果、単一アクセスでは、CPUクロック数を上げるぐらいしか検索性能を向上させることができないことが判りました。しかしながら、CPUクロック数を上げるのには限界があります。

全文検索エンジンMroongaでは、Spiderストレージエンジンを用いることで簡単にデータベースを分散できます。

そこで、Spiderストレージエンジンを用いて、Mroongaを分散して全文検索すると検索性能を向上させることができるかを試してみます。 

[続きを読む](http://createfield.com/Spider%E3%81%A7%E5%88%86%E6%95%A3%E3%81%95%E3%81%9B%E3%81%9FMroonga%E3%81%AE%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E6%80%A7%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
CentOSにcapybara-webkitインストール


#qt-develインストール
```
# yum install qt-devel
```

#qt48-qt-webkit-develインストール
```sh:/etc/yum.repos.d/qt48.repo
[epel-qt48]
name=Software Collection for Qt 4.8
baseurl=http://repos.fedorapeople.org/repos/sic/qt48/epel-$releasever/$basearch/
enabled=1
skip_if_unavailable=1
gpgcheck=0
[epel-qt48-source]
name=Software Collection for Qt 4.8 - Source
baseurl=http://repos.fedorapeople.org/repos/sic/qt48/epel-$releasever/SRPMS
enabled=0
skip_if_unavailable=1
gpgcheck=0
```

```
# yum install qt48-qt-webkit-devel
```

#capybara-webkitインストール
```
# QMAKE=/opt/rh/qt48/root/usr/lib64/qt4/bin/qmake gem install capybara-webkit
```

#X Window System & Xvfbサーバインストール
スクリーンショットを撮りたい場合はxvfbサーバが必要。

```
# yum groupinstall "X Window System"
# yum install xorg-x11-server-Xvfb
```

#Capistaranoからbundle installする場合は下記を定義
```ruby:deploy.rb
set :default_environment, {
  'QMAKE' => '/opt/rh/qt48/root/usr/lib64/qt4/bin/qmake'
}
```

###参考
http://saisa.hateblo.jp/entry/2013/07/15/221851
http://d.hatena.ne.jp/hamajyotan/20120517/1337239976

###環境
CentOS6.4 (さくらのVPS)
Ruby1.9.3
PostgresでActiveRecordのbinary型で問題


Rails3のActiveRecordの型をbinaryにすると
Macでは大丈夫なのにCentOSではDBに保存して取り出すと
値が壊れているような状態に。
bytea_outputの問題？

#bytea_output確認
```
> show bytea_output;
 bytea_output
--------------
 hex
(1 row)
```

#bytea_output変更
```
> ALTER DATABASE $DB_NAME SET bytea_output TO 'escape';
```
で直った。

```
> ALTER DATABASE $DB_NAME SET bytea_output TO 'hex';
```
で戻せる。


###参考
http://www.badrit.com/blog/2011/1/19/postgresql-9-bytea-type-problems

###環境
Rails3.2
Postgres9.2
実行されたSQLをログに出力


```sh:postgresql.conf
...
#log_min_duration_statement = -1
…
```
の箇所を


```sh:postgresql.conf
...
log_min_duration_statement = 0
...
```
に変更し、postgres再起動すると全てのSQLがserverlogにSQLが出力される。

```sh:postgresql.conf
...
log_min_duration_statement = 3s
...
```
で３秒以上かかったSQLのみ出力。
TiShadowの導入時に遭遇したエラー


以下のオフィシャルのページに従ってTiShadowを導入。
http://tishadow.yydigital.com/getting%20started

tishadow startした後に動いているか確認するため http://localhost:3000 にブラウザから接続。
しかしブラウザーにはエラーが表示され、ターミナルにも以下のようなエラーが表示された。

```
Error: /usr/local/share/npm/lib/node_modules/tishadow/server/views/layout.jade:1
  > 1| !!!
    2| html
    3|   head
    4|     title= title

`!!!` is deprecated, you must now use `doctype`
    at Object.Lexer.doctype (/usr/local/share/npm/lib/node_modules/tishadow/node_modules/jade/lib/lexer.js:246:13)
    at Object.Lexer.next (/usr/local/share/npm/lib/node_modules/tishadow/node_modules/jade/lib/lexer.js:812:15)
    at Object.Lexer.lookahead (/usr/local/share/npm/lib/node_modules/tishadow/node_modules/jade/lib/lexer.js:111:46)
    at Parser.lookahead (/usr/local/share/npm/lib/node_modules/tishadow/node_modules/jade/lib/parser.js:109:23)
    at Parser.peek (/usr/local/share/npm/lib/node_modules/tishadow/node_modules/jade/lib/parser.js:86:17)
    at Parser.parse (/usr/local/share/npm/lib/node_modules/tishadow/node_modules/jade/lib/parser.js:124:26)
    at Parser.parse (/usr/local/share/npm/lib/node_modules/tishadow/node_modules/jade/lib/parser.js:138:24)
    at parse (/usr/local/share/npm/lib/node_modules/tishadow/node_modules/jade/lib/jade.js:95:62)
    at Object.exports.compile (/usr/local/share/npm/lib/node_modules/tishadow/node_modules/jade/lib/jade.js:152:9)
    at Object.exports.render (/usr/local/share/npm/lib/node_modules/tishadow/node_modules/jade/lib/jade.js:256:15)
```

ブラウザ上にも似たようなエラーが表示されてそこから進めず。。。困ったな。

エラーメッセージを見ると以下のファイルの先頭にある!!!という表現が問題っぽい。
/usr/local/share/npm/lib/node_modules/tishadow/server/views/layout.jade

エラーメッセージに従って!!!をdoctypeに書き換えてみるとエラーが消え、期待していた画面がブラウザ上に表示された。とりあえずこの状態で様子を見よう。
特定のクラスのインスタンスかどうか調べる


```php
if(!$hoge instanceof 'クラス名'){
	//処理
}

//FuelPHPで$hogeがモデル型かどうか調べる
if(!$hoge instanceof Orm\Model){
	//処理
}
```

単純に、

```php
if(!$hoge){
	//処理
}

```

とするよりも厳密にチェックする事が可能です。
AngularJSで$httpを利用して、Ajaxでサーバ通信

AngularJSで$httpを利用して、Ajaxでサーバと通信する。

#基本形

コントローラの引数に$httpが必要となる。

```js
function TodoCtr($scope,$http){
    $scope.hello = function() {
         $http({method: 'GET',
        	   url: 'http://localhost:8080/api/angular'
          ).
          success(function(data, status, headers, config) {
             alert(date); 
          }).
          error(function(data, status, headers, config) {
             alert(status);
          });
    }
```

#パラメータあり

オブジェクトをparams引数に設定すると、URLの後ろにkey=valueの形式で付与される。
以下の例だと、「http://localhost:8080/api/angular?aaa=111&bbb=222」となる。

```js
function TodoCtr($scope,$http){
    $scope.hello = function() {

    	var parameter = {
    					aaa:"111",
    					bbb:"222"
    	}

         $http({method: 'GET',
        	   url: 'http://localhost:8080/api/angular',
        	   params: parameter}
          ).
          success(function(data, status, headers, config) {
             alert(date); 
          }).
          error(function(data, status, headers, config) {
             alert(status);
          });
    }
```

$httpの中で、encodeURIComponentが行われているので、マルチバイトの場合も気を使う必要はなし。
アクティブなウィンドウを探す(Mac/Carbon)

```c
ProcessSerialNumber psn = { 0L, 0L };
OSStatus err = GetFrontProcess(&psn);

CFStringRef processName = NULL;
err = CopyProcessName(&psn, &processName);
string s(CFStringGetCStringPtr(processName, NULL));
```

http://stackoverflow.com/questions/373020/finding-the-current-active-window-in-mac-os-x-using-python
ClowdWatch で Disk容量も監視する

# はじめに

監視の設定はサーバー運用するなら避けて通れないと思います。
が、キャンペーンだったり運用費の兼ね合いだったりと運用サーバー1台に対して監視サーバー1台たてるのは… ということがたまにあります。

そんな問題もEC2で運用で運用してれば CloudWatch があるからALL解決！！

というわけにはいきませんね…

ClouwdWatchにはデフォルトでは必要最低限のものでLoad Average の監視だったりDisk容量の監視だったりは自分で設定しないといけません。

その設定方法をまとめました。

[ClowdWatch で Disk容量も監視する](http://konboi.hatenablog.com/entry/2013/12/25/215500)

是非！！
WordPressテーマをイチから自作してみる　ーその２

形から入るタイプなので、先に大まかなサイトのデザインを考える。
コンテンツの配置や配色などもざっと決めてしまい、先にstyle.cssを書いておこうという話。
手法は人それぞれ。先にHTMLをマークアップして、それからデザインを作りこんでいくという人もいる（というかそれが主流？）だろうから、この辺の順番はお好みで。

#コンテンツの配置を紙に書いてみる
トップページはコンテンツ量が多く、設計も大変なので、ここでは、一つ下の階層のコンテンツを中心に、デザインを考える。
私の場合、元のサイトが存在しているので、それを見ながらの作業になる。
たくさんの学校サイトを見て、学校サイトの標準的な配置を覚えたり、自分が見てカッコイイ！と思ったサイトを蓄積する作業も大事。
その１で書きだしたサイトマップなども参考にしながら、どのように記事を配置するかを考える。
![サイト配置図]( http://cl.ly/image/1y1F0c1O0T3X/IMG_3907.jpg)

#スタイルシートのおおまかな部分を記述する
細かい部分は後にするとして枠組みのサイズや色などをstyle.cssにざっと書き込む。
また、style.cssの冒頭部分のコメントに、WordPressがテーマとして認識するための記述が必要なので、最低限Theme Nameだけでも書いておく。

```css:style.css
/*
Theme Name: テーマ名
Description: テーマの説明
Theme URI: テーマのURL
Author: 作成者
Author URI: 作成者のURL
Version: バージョン
License: ライセンス
License URI: ライセンスのURL
*/

/* 文字の色 */
#wrapper_all {
	color: #ff0000;
}
h1,h2 {
	color: #ff00CC;
}
a {
	color: #ccff00;
}
a:visited {
	color: #cc00ff;
}
#right_pane {
	background-color: #66cccc;
}

/* 一番外側の枠 */
#wrapper_all {
	width: 1024px;
	position: relative;
	margin: 0 auto;
	padding: 0;
}

/* ヘッダエリア */
header {

}
/* ヘッダ画像 */
#header_image {
}

/* メインエリア */
#wrapper_main {
	width: 100%;
	position: relative;
	padding: 0;
	margin: 0;
}

/* 左側 */
#left_pane {
	width: 300px;
	margin: 0;
	padding: 0;
}

#sidebar {
	
}

/* 右側 */
#right_pane {
	padding: 0 20px 0 20px;
	margin: 0 10px 0 0;
}

/* 複数の記事があるときはラッパを使う */
#article_wrapper {

}
article {
}
article figure {

}
article section {
}
#right_pane aside {

}

/* フッタエリア */
footer {

}
   （以下略）
```

今は適当で。phpファイルと連動しながら、徐々にきっちり記述していく。

コレをサーバのwordpress＞wp-content＞themes＞mytheme内にアップロードする。

***

次は管理画面からの設定など
heroku：参考資料

#### 勉強用スライド ####
http://www.slideshare.net/shunjikonishi/heroku-15670119

#### アプリケーションの名前を変えたいとき ####
http://interu.hatenablog.com/entry/20110307/1299500532

http://d.hatena.ne.jp/Syunpei/20111202/1322806676

#### 公式チュートリアルの日本語訳とか ####
https://github.com/herokaijp

#### foremanコマンド、Procfileについて ####
http://www.ownway.info/Ruby/index.php?foreman%2Fabout

見つけしだい追加していきます。
PHPでセッションが消えてしまう問題

どうも更新を繰り返しているとセッションが消えてしまうことがあって調査したところ
ハイジャック対策で使用していた session_regenerate_id(); を削ったら発生しなくなることがわかった。

検索してみたところ、そのものずばりの以下の記事を発見。
<a href="http://xirasaya.com/?m=detail&hid=221">session_regenerate_id()でセッションが切れる</a>

どうも連続して session_regenerate_id(); を実行するとセッション切替が間に合わなくて
情報を保持できないことがあるようだ。
初心者には自力で解決できなさそうな落とし穴だなあ。

先人たちの知恵に感謝！
iOSアプリ開発時の実ファイルの配置ベストプラクティス


Androidアプリ開発時に使うEclipseなどとは違い、Xcode上のファイルグループ分けと実ファイルの物理構成はリンクしているわけではないので、実ファイルをどのように配置していくのかはプロジェクト初期にメンバーで都度決めていると思います。


自分がいつもやっているのは実ファイルをMVCに分類し、Classesディレクトリの下にMVCディレクトリを作りそこに配置していくことです。

例としてクラスAModel,BModel,AControllerとリソースであるstoryboardやxibがある場合は次のようにしています。

```
SampleProject/Classes/Models/AModel.h
SampleProject/Classes/Models/AModel.m
SampleProject/Classes/Models/BModel.h
SampleProject/Classes/Models/BModel.m
SampleProject/Classes/Controllers/AController.h
SampleProject/Classes/Controllers/AController.m
SampleProject/Classes/Views/Main.storyboard
SampleProject/Classes/Views/CustumCell.xib
SampleProject/Classes/Views/CustumCell.h
SampleProject/Classes/Views/CustumCell.m
```

## なぜClassesディレクトリを使うのか

現在のXcode5系のテンプレートプロジェクトのまま作ってしまうとClassesディレクトリがなく、plistやpcxファイルと同じディレクトリに全てのコードが配置されるとプロジェクトの見通しが悪く感じてしまいます。また、Xcode3系のときはClassesディレクトリが自動で作成されていた事があり、そのClassesという名前をそのまま使っています。

## なぜユースケースごとに分けないのか

複数のユースケースがある場合、どのユースケースのディレクトリに格納すべきか迷うのを避けるためです。webアプリであれば画面ごとにControllerを分けることも多いと思いますが、iOSアプリ開発ではViewControllerは画面に依存しているというよりもViewとModelに依存しており、さらにコンテナ機能によって使い回しがしやすいために画面ごとに分けるのは後々余計な頭を使ってしまいます。

## なぜMVC以下は深く分けないのか

さきほどの例ではAModel.hとBModel.hは実ファイルの構成上同じModels階層にいますが、この階層を深く分けたくなると思います。例を示すと次のようになります。

```
SampleProject/Classes/Models/A/AModel.h
SampleProject/Classes/Models/A/AModel.m
SampleProject/Classes/Models/B/BModel.h
SampleProject/Classes/Models/B/BModel.m
```

これで見通しの良さは向上するのですが、開発中、Xcode上でAModelのグループ名Aを変更したくなるときがあるでしょう。そのとき、グループ名を変えた上でディレクトリ名を同じように変えたくなりますよね。しかし、Xcode上で実ディレクトリ名を変えることはできないため、Xcode上での操作+GUI or CUIでのコマンド操作が必要になりどうしても開発のリズムを崩しリファクタリングが億劫になり良くありません(特にgit/svnを使っていた場合は面倒な感じを受けます)。

したがって、リファクタリングでMVC間をまたがるということはないとして、実ファイルはMVCには分けるがそれ以上は分類しないということで妥協します。Xcode上のグループは分かりやすくMVC以下も深く分けていくのが良いと思います。

## MVCに分類できないのはどうするの？

よくあるパターンとしてUtilitesとかCategoriesとかでしょうかね。ViewとControllerに分類できないならModelでいいとは思いますが、開発チーム内で話しあって決めたいところです。

## 画像やサウンドなどリソースの配置はどうするの？

[Xcode5からはAsset Catalog](http://qiita.com/yimajo/items/239eb68265e4ea772484)が導入され、画像のリソースの配置や命名についてはほとんど気にしなくなりましたが、Asset Catalogを使えない場合は次のような制約が適切です。

- リソースは一つのディレクトリに平たく置かず物理ディレクトリを分ける
- Resourcesディレクトリを作りその下にimagesとsoundsとする
- imagesディレクトリの下にbutton、iconsと構成していく
- ディレクトリ構成とグループ構成を一致させる

ソースコードの場合はリファクタリングすることが多いためディレクトリ構成を深くしないのですが、画像などのリソースファイルはディレクトリやグループ構成をリファクタリングしたくなることが少ないため、整理しやすさを重視してディレクトリを作成しグループ構成と合わせます。

自分の経験から次のような理由があります

- デザイナから提供される素材が未整理で一つのディレクトリにまとめて送ってくるという事はないのでその構成を維持してあげる
 - 素材を貰う前の自作したダミー構成は捨てる
- Xcodeを起動しなくてもディレクトリでわけてあれば他のプロジェクトの画像が把握しやすい
 - 再利用するときに他の開発メンバーやデザイナも画像を見つけやすい

画像をimagesディレクトリに置くこともメリットがあるので、開発チーム内での認識合わせによると思います。

ちなみにAsset Catalog上のAsset名は実ファイルの画像名と違ってもいいので、デザイナが送ってきたファイル名が規約に沿っていないなどであっても指摘したりファイル名を変更する必要がなくなり便利ですね。


# 参考

意図が同じかどうかは分かりませんが、はてなインターン2013の構成も自分と同じような構成だったので参考にリンクしておきます

https://github.com/hatena/ios-Intern-Bookmark-2013/tree/master/InternBookmark/Classes

# その他

- Xcode上でも物理ファイル構成の連携できてなかったっけ?
- 他にもいい方法があれば教えて下さい
Windows+msysgitのコンソールの色を明るくする


題名のまんまの小ネタです。

# そこにある問題

msysgitをインストールすると、「Git Bash」というショートカットが作成されますが、DOS窓の拡張っぽい表示なので、文字が読みづらいと思いませんでしたか？私は思いました。なので明るくする方法を探しました。minttyとかは使わずに、あくまでもDOS窓に拘る人向け。

# やったこと

1. 「Git Bash」のショートカット -> プロパティ
1. 「画面の色」タブ -> 「画面の文字」 -> RGB:255.255.255
1.  `C:¥Program files(x86)¥Git¥etc¥profile`(デフォルトのインストール先)をテキストエディタで開く
 * `PS1=“$PS1”’¥[¥33[3`という行を探す
 * ↑の`¥[33[3`を`¥33[1;3`のように変えて上書き保存(４箇所くらいあるはず)

以上です。
あちょーっと同じキーを持つ連想配列を作る

↓こんな感じの同じキーを持つ連想配列を沢山作りたいとします。

```php
$rows = array (
    array (
        'id' => 1,
        'name' => 'ore',
        'age' => 99,
        'sex' => 'm',
    ),
    array (
        'id' => 2,
        'name' => 'are',
        'age' => 46,
        'sex' => 'u',
    ),
    array (
        'id' => 3,
        'name' => 'kare',
        'age' => 21,
        'sex' => 'm',
    ),
    array (
        'id' => 4,
        'name' => 'dare',
        'age' => 12,
        'sex' => 'f',
    ),
    array (
        'id' => 5,
        'name' => 'sore',
        'age' => 39,
        'sex' => 'f',
    ),
);
```

こんなのを全部手打ちすると手が疲れます、もっとあちょーっと書きたいです。

## あちょーその１

```php
$keys = array ('id', 'name', 'age', 'sex');

$rows = array(
    array_combine($keys, array(1, 'ore',  99, 'm')),
    array_combine($keys, array(2, 'are',  46, 'u')),
    array_combine($keys, array(3, 'kare', 21, 'm')),
    array_combine($keys, array(4, 'dare', 12, 'f')),
    array_combine($keys, array(5, 'sore', 39, 'f')),
);
```

## あちょーその２

```php
$v = function ($id, $name, $age, $sex) { return get_defined_vars(); };

$rows = array(
    $v(1, 'ore',  99, 'm'),
    $v(2, 'are',  46, 'n'),
    $v(3, 'kare', 21, 'm'),
    $v(4, 'dare', 12, 'f'),
    $v(5, 'sore', 39, 'f'),
);
```