OmniAICreator/Qiita-1.07M huggingface dataset:
ごめんなさい、koajsに浮気しちゃいました

いつもいつも[express](http://expressjs.com/)には大変お世話になっています、

でもちょっとした気の迷いから[koa](http://koajs.com/)に浮気しちゃいました、

`koa`の魅力をお伝えして、浮気の言い訳してみます

## koaについて

`koa`は[TJ Holowaychuk](http://tjholowaychuk.com/)他Expressの開発メンバーが開発している[co](https://github.com/visionmedia/co)ベースのnode 0.12向けWebフレームワークです。`koa`についてはかずぽんさんの以下記事が詳しいです：

http://blog.kazupon.jp/post/71041135220/koa

# 浮気現場

浮気現場はここです：

https://github.com/p-baleine/koa-blog-sample

浮気の仕方はこちら：

https://github.com/p-baleine/koa-blog-sample/blob/master/README.jp.md

ただのブログアプリです、管理画面のスタイルがまだ中途半端ですが…そのうち更新します。

# koaの魅惑

では早速、`koa`の魅力を懺悔します、以下`koa`の[公式ページ](http://koajs.com/)より:

> KoaはExpressチームによる新しいWebフレームワークです、より小さくて、より表現的でロバストなWebアプリーションとAPIのためのフレームワークです。generatorを利用することでコールバックを廃止しエラーハンドリングを強化しています。Koaは一切のミドルウェアを含んでいません、サーバサイドを素早くまた楽しく記述するための手法を提供します。

個人的に、`楽しく`という辺が浮気ポイントです、

例えばブログアプリの投稿一覧取得は`koa`で記述するとこんな感じになります( https://github.com/p-baleine/koa-blog-sample/blob/master/lib/admin/routes/post.js ):

```js
exports.index = function *() {
  var posts = yield Post.findAll({ withRelated: ['user', 'comments'] });
  this.body = yield render('post/index', { posts: posts.toJSON() });
}
```

Expressで記述すると以下のようにコールバックで煩雑になりがちなコードが素敵にすっきりしています:

```js
exports.index = function(req, res) {
  Post.findAll({ withRelated: ['comments', 'tags'] })
    .then(function(posts) {
      res.render('post/index', { posts: posts.toJSON() });
    });
};
```

じゃぁ投稿の新規作成は`koa`だとこんな感じ:

```js
exports.create = function *() {
  var post = new Post(this.req.body.post);
  post.set('user_id', this.user.id);
  if (yield post.save()) {
    this.redirect('/admin/posts');
  } else {
    this.body = yield render('post/new', { post: post.toJSON() });
  }
}
```

`Express`だとこんな感じ:

```js
exports.create = function(req, res, next) {
  var post = new Post(req.body.post);

  post.save()
    .then(function() {
      res.redirect('/posts');
    }, function(e) {
      if (!(e instanceof ValidatorError)) { return next(e); }
      res.statusCode = 422;
      res.render('post/new', { post: post.toJSON(), error: e.message });
    });
};
```

`Post`は[Bookshelf](bookshelfjs.org)というプロミスベースのRDB向けORMで実装したモデルです、`Post.findAll()`と`Post#save()`は共に非同期処理ですが、`koa`で記述するとあたかも同期処理かのように記述できます。

`楽しい`…？いやいや、`koa`楽しすぎですよっ！node 0.12のリリース時期は未定ですが半年後とかには、世の中こんなコードで溢れかえっているのかと思うと、ワクワクしてしょうがないですよ！！

# koaの現状

というわけで、`koa`への浮気をお勧めしてみました、

が、正直現時点でnode 0.11.xに手を出すのは結構鬼門です、cのバインディングを要するモジュール系はデフォルトでは結構動かないです、今回は`node-sqlite3`は諦めました、`bcrypt`は頑張って見ましたが(`node-sqlite3`も後で頑張ってみるつもりです)。

それでも苦難の道を乗り越えてにぞっこんしてみる価値が`koa`にはあると思ってます。

2013/12/30 追記、node 0.11.9では[このissue](https://github.com/joyent/node/issues/6451)に起因して`npm install`時に以下エラーが出ることがあるようです

```bash
TypeError: Property 'onIncoming' of object #<HTTPParser> is not a function
```

nodeの最新のmasterを取得してビルドすると発生しなくなりました。
が、結局TravisでもHerokuでも動くようにはならないので根本解決にはなりませんが…早く次の版がでることを願うしかないようです。
「作らない」開発　サイボウズkintoneを利用した新型スタイル

デザイン・操作性、そしてセキュリティ・・・と、昨今のWebシステムに求められるものは多く、自前で開発するのはますます大変、なにより高くつくようになってきています。

それらを「作らない」で、あるもの=クラウド上のサービスを利用して開発してしまおう、というのが今回のお話です。システム構成としては、フロントとしてクラウドサービスを使用しデータはAPIで連携するイメージです。

こうした開発のスタイルは、下記のようなメリットがあります。

## 開発者にとってのメリット
* 各種ブラウザ対応やセキュリティ対策といった、面倒だが手を抜けない部分を自前で開発しなくて済む
* サービス側で提供される機能は作る必要がないので、コアな機能の開発集中できる
* 画面の操作性やデザインといったところでもめなくて済む
 
## ユーザーにとってのメリット
* 実際動かせるものができるまでが、安い＆速い
* 不要になったらすぐに辞められる(=必要な期間だけ使える)
* ちょっとした改修は自分でできる

とはいえ実際のところどうなの！？ということで、今のプロジェクトでクラウドにサイボウズのkintone、バックエンドをASP.NETで連携させているので、その所感についてまとめます。

## kintoneについて
kintoneとはサイボウズ社が提供しているクラウドサービスです。
Web上にてドラッグ＆ドロップでフォーム画面を作成することができ、簡単にデータの共有を行うことができます。フォーム＋データベースだけでなく、ワークフローや権限管理、アラートといった業務での「あるある」機能が搭載されており、こうした機能を安価な値段で使用することができます。

普通に「インターネット経由でデータが共有できて、承認フローがあるシステムを作りたい」という場合、多分2人月は行くと思いますが、この場合おそらく200万円前後になると思います。
これはkintoneの月額料金880円(2013/12現在)の2272ヶ月分、実に189年分なのでどんだけ安いかがわかります。おまけにアプリはほぼ作り放題なので、実際の価値としてはこれ以上です。

こうした現象は、「Excelで簡単にできるのにシステム会社に見積りを頼んだらｘ百万円と言われた」というのと同じような現象です。実際Excelやこうしたクラウドサービスは広く浅く料金を取っているからこの値段なわけですが、それは正直ユーザーにとっては関係のないことです。

そうした意味でも、今後「一から開発する」というのは何よりユーザーにとって割に合わなくなってくると思います。Excelも含めてですが、あるものをいかに活用するか、という視点は今後かなり重要になってくるのではないかと思います。

より詳しい情報は[公式サイト](https://kintone.cybozu.com/jp/feature/)をご参照あれ！

## kintone APIでの連携
kintoneはクラウド上単体で動くだけでなく、APIを利用することで他システムと連携させることができます。
APIは具体的にはREST形式のAPIで、HTTPリクエスト(やり取りは当然HTTPSですが)が飛ばせる言語であれば、kintone上で作成したアプリにデータを転送したり取り込んだりすることができます。

今回の開発では、kintone上で入力したデータをOracleに取り込んで他システム(ASP.NET)のデータと連携させています。そのため、画面は全く作ってなく、データ連携と業務用件のからむ複雑な帳票だけ開発してます。

データの連携については、Java/iOSはSDKが提供されていますし、.NETは[kintoneDotNET](https://github.com/icoxfog417/kintoneDotNET)があり、特段困ることはありません(商用サービスをつかうなら、DataSpiderが[連携機能を提供しています](http://www.appresso.com/news/2013/10/pr20131017.html))。
RESTという形態からして実装はJavaScriptが一番楽なので、データ連携だけなら思い切ってNode.jsを使うのもアリだと思います。

## 所感
画面を作らなくていいというのはかなり楽です。
というのも、画面はバッチなどと違って実際画面を起動させないといけないので最もUnitTest化しにくい部分だからです。おまけにデザインでもめだしたらきりがないので、そういう意味でも良かったです。
今回は帳票が結構複雑でしたが、そこに集中できるという意味でも効果がありました。

・・・と、なんだか回し者のようなバラ色記事を書いていますが、当然実際は苦しむことも結構あります。
主に困ったのは以下の点です。

### キー設定
kintone上のアプリケーションはデータベースのようなものなので、当然重複データを防ぐためキーを張りたくなります。また、このキー設定はルックアップという、ほかのアプリのデータを参照して設定する機能(例えば受注伝票登録時に品目を検索するみたいな)でも必要になってきます。

そんな重要なキー設定ですが、kintoneではかなり制約があります。例えば、複合キー設定ができない・キーにできないフォーム項目があるなどです。複合キーの場合は値を連結させて設定・・・と思うのですが、これまた連結に使えるフォーム項目にも制限があり、また条件式などは書けません。

今回は連結できるところは標準機能、無理なところはJavaScriptのAPIを使い設定している・・・のですが、JavaScriptAPIはログインユーザーの権限でしか動かないため、キーのようにユーザーに触られたら困るので入力不可にしておきたい、という場合ユーザーが入力不可ならJavaScriptAPIも入力不可です。一応保存時にセットしているのでいじられても大丈夫ではあるのですが、入力不可にすることも見えなくすることもできないのでちょっとムムムという感じです。

### 開発機/本番機の考え方
データ連携機能を開発する場合、特にkintone側を更新するようなケースは当然いきなり本番で試すわけにはいかないので開発環境が欲しくなります。

アプリのコピー機能があるのでそれで必要都度本番をコピーすれば良いのですが、他のアプリと連携するような項目(上述のルックアップなど)は参照先が元のままなのでこれを直していく必要があります(今はコピーするだけにして、細かいとこは直してないです)。

kintone側のバージョンアップなどが行われるときもこれは問題になるので、この点は今後も考えていかないといけない問題だと思います。

### ユーザーの理解
「クラウド」＋「API連携」＝情報漏えい、という考えというかイメージのユーザーはまだたくさんいると思います。前述の開発機/本番機もそうですが、ある程度理解あるユーザーの方がいなければこうした開発は進めにくいのが現状だと思います。今回はユーザーの方から提案があったのでスムーズでしたが・・・

正直システム会社としては、普通に社内システムで作ってくれと言われても全然かまいませんし、リスクは許さんと言われたらこうした形態では開発しません。ただその分当然高くなります。
そうした意味では、ユーザー自身がリスクをとる、というのがこうした開発の第一歩になる思います。
ExecutorServiceを使って、Javaでマルチスレッド処理


# 基本パターン(単一スレッド)

#### 別スレッドにするタスクの作成

別にスレッドにしたい処理を、Runnable インタフェースを実装したクラスのrumメソッドに実装する。

```java
public class TestRunnable implements Runnable {

    public void run() {
        // スレッドIDを出力する
        System.out.println(Thread.currentThread().getId());
    }
}
```

#### スレッドの生成とタスクの実行

ExecutorService クラスを利用して、スレッドの生成・タスクの実行を行う。
ここでは、「newSingleThreadExecutor」でスレッドを一つのみ生成し、5回タスクを実行している。

```java
ExecutorService exec = Executors.newSingleThreadExecutor();

for (int i = 0; i < 5; i++) {
     exec.submit(new TestRunnable());
}
```

#### 実行結果

１スレッドのみなので、すべて同じスレッドIDが出力される。

```
44
44
44
44
44
```

# 固定数の複数スレッド生成

newFixedThreadPoolを使用すると、固定数のスレッドを生成できる。

```java
// 引数に生成するスレッド数を渡す
ExecutorService exec = Executors.newFixedThreadPool(3);

for (int i = 0; i < 5; i++) {
     exec.submit(new TestRunnable());
}
```

3つの固定スレッドを生成したので、3つのスレッドを使いまわしている。

```
24
24
24
26
25
```

# 必要に応じて複数スレッド生成

newCachedThreadPoolを使用すると、必要に応じてスレッドを生成する。
60秒間使用されなかったスレッドは破棄され、60秒未満であれば再利用される。

```java
 ExecutorService exec = Executors.newCachedThreadPool();

 for (int i = 0; i < 5; i++) {
     exec.submit(new TestRunnable());
 }

 Thread.sleep(1 * 5000);
 System.out.println("--------5秒後---------");

 for (int i = 0; i < 5; i++) {
     exec.submit(new TestRunnable());
 }

 Thread.sleep(1 * 70000);
 System.out.println("--------70秒後---------");

 for (int i = 0; i < 5; i++) {
     exec.submit(new TestRunnable());
 }
```

3回に分けて処理を実行。
最初の実行から、5秒後に実行した処理は同じスレッドを再利用している。
70秒後の実行では既にスレッドが破棄されて、新しいスレッドが生成されている。

```
26
24
25
27
28
--------5秒後---------
24
27
28
25
26
--------70秒後---------
31
33
30
32
29
```

# 実行結果を取得する

#### 実行結果を返すタスクの作成

実行結果を返す処理は、Callableインタフェースを実装したクラスのcallメソッドに実装する。

```java
public class TestCallable implements Callable<Long> {
    public Long call() throws Exception {
        //スレッドIDを返す
        return Thread.currentThread().getId();
    }
}
```

#### タスクの実行と実行結果の取得

タスクの実行は、結果を返さない場合と同じく ExecutorService を使用するが、
戻り値としてFutureインタフェースを受け取る。

```java
List<Future<Long>> list = new ArrayList<Future<Long>>();
for (int i = 0; i < 10; i++) {
    Future<Long> future = exec.submit(new TestCallable());
    list.add(future);
}

//Future#getメソッドで結果を取得できる。実行中の場合は終了まで待つ。

for (Future<Long> future : list) {
   try {
       Long id = future.get();
   } catch (InterruptedException e) {
       e.printStackTrace();
   } catch (ExecutionException e) {
       e.printStackTrace();
   }
}
```

引数を指定することで、指定した時間だけ実行結果を待つことができる。
指定した時間を超えると、TimeoutExceptionがスローされる。

```java
//1秒間だけ待つ。
Long id = future.get(1, TimeUnit.SECONDS);
```
Nexus7(2013)のスクリーンサイズのまとめ

## DisplayMetricsの値

onCreateにて、以下のメソッドを実行する。

```java
    WindowManager windowManager = getWindowManager();
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics metrics = getResources().getDisplayMetrics();
    Log.v("densityDpi", String.valueOf(metrics.densityDpi));
    Log.v("display", display.toString());
```
### densityDpiの値

```
densityDpi = 320
```
### metricsの値

```java
DisplayMetrics {
  density=2.0, 
  width=1920,
  height=1104, 
  scaledDensity=2.0,
  xdpi=320.842, 
  ydpi=322.966
}
```

### metricsの値
```js
DisplayInfo {
  "内蔵スクリーン",
  app 1920 x 1104, 
  real 1920 x 1200, 
  largest app 1920 x 1774, 
  smallest app 1200 x 1054,
  60.0 fps,
  rotation1,
  density 320 (320.842 x 322.966) dpi,
  layerStack 0,
  type BUILT_IN, 
  address null, 
  FLAG_SECURE, 
  FLAG_SUPPORTS_PROTECTED_BUFFERS
},
DisplayMetrics {
  density=2.0,
  width=1920,
  height=1104, 
  scaledDensity=2.0,
  xdpi=320.842,
  ydpi=322.966
},
isValid=true
```

1920x1200の解像度を持っているが、ナビゲーションバーの高さが差し引かれて、1920x1104となるようだ。

## ステータスバーの高さを取得

onWindowFocusChangedにて、以下のメソッドを実行する。

```java
@Override
  public void onWindowFocusChanged(boolean focus) {
    super.onWindowFocusChanged(focus);
    Rect r = new Rect();
    getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
    Log.d("statusBar", "statusBar = " + r.top);
  }
  
```

statusBar = 50

さらにステータスバーの高さがあるので、Nexus7(2013)上のアプリで利用可能な画面サイズは、1920x1054となるようです。

Nexus7(2012)は1280x800なので、これをターゲットにした画像は、drawable-tvdpiにおいてやれば、伸張されます。drawable-tvdpiからdrawable-xhdpiへの伸張は、1.5倍(2/1.3333)と正しく扱われています。tvdpiは二次的密度でこれをターゲットにしてはいけないという記述がマニュアルにあります。正しい密度はxhdpiのようです。
さくらVPS: Apacheをインストールする


# 1. yumのアップデート

``` sudo yum update


# 2. Apacheのインストールと設定

``` インストール
yum install httpd
```

``` 自動起動の設定
chkconfig httpd on
```

``` セキュリティ設定
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org  // 設定ファイルのバックアップ
vim /etc/httpd/conf/httpd.conf



## ServerTokens OS ⇒　
ServerTokens Prod

## ServerSignature On ⇒
ServerSignature Off

## /var/www/html — Options Index….
Options -Index…

```


```設定のテストと起動
service configtest httpd
service httpd start
```

さくらVPS設定時に受け取ったIPアドレスにブラウザからアクセスすると
以下のようなApacheの初期画面が見えれば設定成功。

![ 2013-12-28 11-43-30.png](https://qiita-image-store.s3.amazonaws.com/0/13161/f05102b3-f0ba-76d4-39c3-2bd0c75c2d38.png " 2013-12-28 11-43-30.png")

# 3. ファイル転送ソフトの設定

## /var/www/htmlの所有権を作業用アカウントに設定

```　
chown -R chkk525:chkk525 /var/www/html/
```

## CyberDuckの設定

CyberDuckを下記からインストールしておく
http://cyberduck.io/

設定は下記のようにする
![Screenshot 2013-12-28 11-50-49.png](https://qiita-image-store.s3.amazonaws.com/0/13161/b63b95d2-d782-c0e3-249c-fa8c90114ae3.png "Screenshot 2013-12-28 11-50-49.png")

試しに index.htmlをおいて表示されるかテストする

``` index.html
<html><head><title>タイトル</title></head><body><h1>タイトル1</h1><p>本文です</p></body></html>
```

正しく表示されたので設定完了

![タイトル 2013-12-28 12-06-46.png](https://qiita-image-store.s3.amazonaws.com/0/13161/700d010c-d51b-fac1-54bf-18a70a8174aa.png "タイトル 2013-12-28 12-06-46.png")
さくらVPS: ファイアーウォールの設定をする


# iptablesの設定ファイルの編集

```
sudo vim /etc/sysconfig/iptables
```

でファイアーウォールの設定を行います。
設定方法がわかりにくいので[dotinstalll](http://dotinstall.com/lessons/basic_sakura_vps/8010)の記事から設定ファイルを拝借。


``` /etc/sysconfig/iptables
*filter
:INPUT    DROP    [0:0]
:FORWARD  DROP    [0:0]
:OUTPUT   ACCEPT  [0:0]
:SERVICES -       [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4  -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -j SERVICES
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p udp --sport 123 --dport 123 -j ACCEPT
-A SERVICES -p tcp --dport YOUR_PORT_NUMBER(★★) -j ACCEPT
-A SERVICES -p tcp --dport 80 -j ACCEPT
-A SERVICES -p tcp --dport 443 -j ACCEPT
COMMIT
```

YOURT_PORT_NUMBERのところを設定している4569に変更する。

# iptabelsの起動

``` service iptables start ```


# iptablesの設定の確認

``` iptables -L ```



# 参考にしたサイト

- http://dotinstall.com/lessons/basic_sakura_vps/8010
さくらVPS: 作業用アカウントをsudoユーザに追加する


# 作業用アカウントでsudoを実行しようとすると….

前回作成した作業用アカウントでsudoコマンドを使おうとすると以下のようなエラーが発生します。

![Chikaki — chkk525@www4057uo:~ — ssh 2013-12-28 10-40-06.png](https://qiita-image-store.s3.amazonaws.com/0/13161/4d7513a2-536a-11e5-ebc1-559f01be22e6.png "Chikaki — chkk525@www4057uo:~ — ssh 2013-12-28 10-40-06.png")

``` chkk525 is not in sudoer file ```

とのこと。sudoer fileとはsudoコマンドを使用可能なユーザを定義するファイルで、

``` 
/etc/sudoer
```

に存在します。初期状態ではrootユーザのみが使用権限が設定されています。


# /etc/sudoersの設定

一旦作業用アカウントから出てrootでログインします
直接 vim /etc/sudoersとするといろいろ不具合のもとになるので visudoというコマンドで設定していきます。

``` 
ssh root@xxx.xxx.xxx.xxx -p 
usermod -G wheel chkk525 ```
visudo 
```

``` /etc/sudoers
## Allows people in group wheel to run all commands
%wheel ALL=(ALL)       ALL     
```
%を忘れて一瞬嵌った…

これで作業用アカウント(chkk525)からsudoが実行できるようになりました。



# 参考にしたサイト

http://www.maepachi.com/blog/entry?id=127
Project Sienaを使ってみて気付いたこと(内部編)

[ブログに書いた内容](http://blog.onpu-tamago.net/entry/2013/12/28/015218)に引き続き内部的な話。

とりあえずコーディングなしで出来ることはこんな感じ

* データソースの中身を表示する(Excel(マクロなし)、RSS Feed、Restデータ、Sharepointデータ)
* タップするとブラウザを表示させる
* 複数の画面から成り立つアプリケーションを作成する

データソースをギャラリーのコンポーネントにバインドするようなことも出来るので、簡単なデータ表示アプリであれば十分に作れそう。

[AndroidのApp Inventor](http://appinventor.mit.edu/)などと違いブロックエディタのような命令エディタがないので、何らかの計算や、他のコンポーネントを操作するようなことは全部コーディングが必要なようです。

# Project Sienaでアレはどうする？
以下FAQ的なもの

## GUIコンポーネントを配置するにはどうする？
画面右側のコンポーネントパレットから挿入したいGUIコンポーネントを選ぶ。

## ギャラリーの中にGUIコンポーネントを配置するにはどうする？
ギャラリー(Galleries)を選択し、配置したいレイアウトを選択、配置する。Custom Gallery以外は配置されるGUIコンポーネントは固定。Custom Galleryは、自分でコンポーネントを配置可能。

Custom GalleryにGUIコンポーネントを配置するには、貼り付けたギャラリーコンポーネントの一番最初のマス目をタップし選択(ギャラリーの項目の中に「Add a visual」が表示される)して、画面右側のコンポーネントパレットから挿入したいGUIコンポーネントを選ぶ

## データソースのバインドはどうするの？
次のようにします。

1. アプリバーのファイルメニューより、データソースの追加画面を表示する
1. データソースの追加画面にて、何らかのデータソースを追加する
1. Galleryなどを選択したときの「Data」ボタンより、データソースを関連付ける
1. Gallery内のコンポーネントのTextプロパティなどを選んで、データソース内のフィールド名を選択する

## アンカー(画面の隅にGUIコンポーネントを貼り付ける)は設定出来ないの？
出来ないようです(方法を知らないだけ？)。

## アプリが画面全体に表示されていないとき(フリップされた状態)のデザインは定義できないの？
出来ないようです(方法を知らないだけ？)。

まあ、β版とのことでまだまだ発展途上ですが、結構基本は出来ているかなと思います。Windows Store AppのGUIデザインは、Androidと比べてあまりやりやすくない(個人の感想です)ので、たたき台を作るには良いかも。
文字列から主要キーワードを抽出するおもちゃ

2015/01/20

入社まだ１年もたっていませんが、もうむりかもしれない・・・。
という思いを込めて、久々に少しだけロジックを変更しました。

無駄なところを省いて、いくつか処理を追加したので精度がちょっとまともになったきがしなくもないです。

---

2014/07/07

自宅サーバを立てました。
新入社員なのであまりサーバに関しては何もできていませんが、結構いい感じに仕上がってきています。
（平日は火事とか怖いので死んでます）

---

2014/02/27

また懲りずに内部の処理を変えました。
なんとなく理想に近づいたと思う。

あとはrelate_noise_levelの部分を自動で推定できるようにできればいい感じになれる！
（このためにSSDx2でraid0の自宅サーバを組みます。）

---

2014/02/21

仕組みを少し変更して手直ししました。
でも気に入らない、、、

解析結果の出力数が多い！
何とかします。

---

2014/02/16

仕組みを変更したら失敗しましたｗ
精度がガックリと落ちたので、作り直します。

学校から解放され次第色々挑戦します。

---

#概要
記載された文字列が何について説明をしているのかを特定するためのツールを作りました。

[categoryabstraction](http://wakisuke.myhome.cx/~1989_miyawakiyusuke/doc/categoryabstraction/)

ツイッターの投稿でもブログの切れ端でも、何でも突っ込んでみてください。
mecabで名詞だけ取り出した結果よりはいい結果が出ると思います。

もし反応が良ければAPIとして公開してみようかな・・・

##利用したもの
利用したものとしては以下があります（他にも色々ありますが、おおまかに列挙します）

+ wikipedia (dunmp data)
+ mecab
+ termextract
+ mysql
+ mroonga

この他、利用するモノの下準備としてmecabの辞書構築や、wikipediaのデータ整形などがあります。

##実行例

実行結果はWikipediaのデータベースなどを更新すると変化することが有ります。

###サンプルテキスト

```text
インターネットの普及に伴い，ユーザが取得可能な情報が溢れるようになった．
これに対して，ユーザの嗜好情報に応じて適切な情報を提供する情報推薦手法が注目されている．
しかし，従来の情報推薦手法におけるユーザの嗜好情報の推定や，情報推薦の対象はまだ限定的である．
もし普段のユーザのウェブ検索行動からそのユーザの嗜好情報を推定することが出来れば，ユーザの嗜好情報に沿った精度の高い情報推薦が可能であると考えられる．
そこで我々は，ユーザの普段のウェブ検索の行動であるマウスの動きを解析することで，高度なユーザの嗜好情報を得られる手法を開発した．
```

###解析結果

|特徴語|カテゴリ|重要度|
|:--|:--|:--|
|ユーザ|アルゴリズム|3.170|
|ユーザ|集合知|3.170|
|嗜好情報|アルゴリズム|3.019|
|嗜好情報|集合知|3.019|
|情報推薦|アルゴリズム|2.952|
|情報推薦|集合知|2.952|
|ウェブ検索|Googleのサービス|1.985|
|ウェブ検索|検索エンジン|1.985|
|行動|心理学|1.897|
|ウェブ検索行動|検索エンジン|1.371|
|インターネット|インターネットの歴史|1.000|
|対象|ESRB|1.000|
|推定|統計学|1.000|
UIWebViewでサイトタイトルとURLを取得する



###タイトルを取得する
```obj-c
NSString* title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
```

###URLの取得
```obj-c
NSString* url = [webView stringByEvaluatingJavaScriptFromString:@"document.URL"];
```

これに<a href="http://qiita.com/s0hno/items/2dddd887ba302b7fb0e3" title="UIPasteboard - 【Objective-C】クリップボードにコピー - Qiita [キータ]">UIPasteboard - 【Objective-C】クリップボードにコピー - Qiita [キータ]</a>を組み合わせて、
変数urlを渡せば、WebViewによくある機能、「URLをコピー」は簡単に実装できる。
Eclipse（PDT）でCode assist(入力補完)の動作がおかしくなった時の対応方法

Eclipse（PDT等）で入力補完停止時のTips

入力補完に使われている、「DLTK」用のデータベースファイルが壊れる事がある。

######現象
Eclipse自動補完が動かなくなる。

```php:sample.php
require '' 

str_rep
```

上記で入力補完候補が出てこない。
No Default Proposalsと表示される
※Include pathにFramework のライブラリパスを通している。

######対応方法
「.metadata\.plugins\org.eclipse.dltk.core.index.sql.h2」ディレクトリ内の
すべてのファイルを削除する。

######結果
データベース情報が自動的に再作成され、正しく入力補完(Code assist)が動作する。
rubyをビルドしたときのconfigureオプションを表示する

rbenvを使って複数のバージョンのRubyをインストールできるのはいいのだけどどうやってビルドしたのかをすぐ忘れてしまう。
こうすればconfigure時のオプションを表示できる。

```
$ ruby -r rbconfig -e 'puts RbConfig::CONFIG["configure_args"]'
```

2.1.0は、こうしてビルドしたので

```
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.1.0
```

こんなふうに表示された。

```
'--prefix=/Users/xxxxxx/.rbenv/versions/2.1.0' '--with-readline-dir=/usr/local/opt/readline' '--with-openssl-dir=/usr/local/opt/openssl' 'CFLAGS= -O3 -Wno-error=shorten-64-to-32 ' 'LDFLAGS=-L/Users/xxxxxx/.rbenv/versions/2.1.0/lib ' 'CPPFLAGS=-I/Users/xxxxxx/.rbenv/versions/2.1.0/include '
```


`RbConfig::CONFIG`には他にもビルド時の情報が盛りだくさんで`perl -V`に負けないくらいの情報が取り出せる。

```
$ ruby -r rbconfig -e 'RbConfig::CONFIG.sort.each { |c| p c }'
["ALLOCA", ""]
["AR", "ar"]
["ARCHFILE", ""]
["ARCH_FLAG", "  "]
["AS", "as"]
["ASFLAGS", ""]
["BTESTRUBY", "$(MINIRUBY)"]
["BUILTIN_TRANSSRCS", " newline.c"]
["CAPITARGET", "nodoc"]
["CC", "xcrun clang"]
["CCDLFLAGS", ""]
["CFLAGS", " -g -Os -pipe"]
["CHDIR", "cd -P"]
["COMMON_HEADERS", ""]
...
["vendorarchdir", "/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/vendor_ruby/2.0.0/universal-darwin13"]
["vendorarchhdrdir", "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/include/ruby-2.0.0/vendor_ruby/universal-darwin13"]
["vendordir", "/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/vendor_ruby"]
["vendorhdrdir", "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/include/ruby-2.0.0/vendor_ruby"]
["vendorlibdir", "/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/vendor_ruby/2.0.0"]
["warnflags", ""]
```
ビッグデータ時代のサンタ狩り

こんばんは @sleepy_yoshi です．Machine Learning Advent Calendar 2013 の 25日目 (最終日) を担当します．投稿が遅くなり申し訳ありません．サンタ狩りで心身ともにボロボロになっていました．

ML Advent Calendar 最終日の内容を以下にアップしました．

ビッグデータ時代のサンタ狩り - ML Advent Calendar 最終日
http://d.hatena.ne.jp/sleepy_yoshi/20131225

サンタ狩りへの機械学習適用とそのための半教師あり学習 (の一部) の解説記事です．
ApacheCommonsとGuava、Androidアプリ開発で使うならどっちがよい？

・ApacheCommonsって何？
Apache CommonsはApacheSoftwareFoundationが中心になって管理を行っているJavaのライブラリプロジェクト。「文字列のsplit」や「ファイルの読み書き」などに関するイディオムをもっとシンプルに実装するのを助けるためのライブラリ群って感じでしょうか。Apache Commonsのライブラリで有名なのは
commons-io
commons-lang
commons-net
とかでしょうか。

・Guavaって何？
Googleが開発したJavaのライブラリ。「文字列のsplit」や「ファイルの読み書き」、「コレクションに関する処理」などに関するイディオムをもっとシンプルに実装するのを助けるためのライブラリ群。…ってこれApacheCommonsとほとんど役割とかスタンスが一緒。

・どっちも似てるけどどっちを使えばよい？？？
いろいろ調べてみたところ、Guavaの方がジェネリクス対応しているからー、みたいにかかれててGuava押しな感じがただよっている。。。しかし、ジェネリクス対応しているうまみを感じるようなものってコレクション系ぐらいか？もっと簡単な「文字列のsplit」に関していうと、実はcommons-ioの方が約4倍速かったんだよなー。パフォーマンスって切り口で考えるとやっぱりcommons-ioに軍配が上がってしまう。

・ぐだぐだ言っているけど結論は？？
はい、まとめます。
文字列操作とかシンプルなファイル読み書きを楽にしたい目的ならcommons-ioを使うべき、
コアなコレクション系のAPI使いたいならGuavaって感じです。

P.S. 他にもいろいろな情報お持ちでしたらコメントくださいまし。あと、この記事に関するダメ出しも受け付けます。
Sublime Textでハッシュや配列、引数を整列

# AlignTabの概要
　カンマやコロン、パイプなどで単語を連ねる際、可読性や自身の精神ケアの為にカラムの先頭や末尾を揃えるのが常だと思います。これを力技で行おうとすると幾度と無くスペースキーを叩くこととなり、あまり楽しいとはいえない作業となります。
　そこで今回は、Sublime TextとAlignTabパッケージを使用して、ワンタッチでコードを整形できるようにしましょう。

　例えば、以下は整形されていないコードです。

```rb:昨日までのコード
honoka: :strawberry, eli: :chocolate, kotori: :cheese,
umi: :honoka, rin: :ramen, maki: :kyoko,
nozomi: :yakiniku, panayo: :rise, nico: :maki
```

　AlignTabを使用すれば、ショートカットを叩くだけで以下の通りに整形することが出来ます。

```rb:今日からのコード
honoka: :strawberry,    eli: :chocolate, kotori: :cheese, 
   umi: :honoka,        rin: :ramen,       maki: :kyoko,  
nozomi: :yakiniku,   panayo: :rise,        nico: :maki    
```

# 使用方法
　では使用方法を見てみましょう。
　いつもどおりpackage managerからインストールして下さい。
https://github.com/randy3k/AlignTab

　右クリックメニューなどからAlignTabパネルを開くことが出来ます。
　コマンドは以下の通りに構築します。
`デリミタ/オプション`

　始めに簡単な例として、以下のカンマで区切られたコードを整形してみましょう。

```rb
honoka, umi, kotori,
hanayo, rin, maki,
eri, nozomi, nico
```

　コマンドは以下の通りです。
`,/l`

　これは、以下のことを意味しています。
`,` ","をデリミタとして区切る。
`l` カラムを左詰めにする。

　カラムの整列には、`l` `c` `r`が使用できます。それぞれ、左詰め、中央寄せ、右詰め、を表しています。
　また、整列基準オプションの後に数字を置くことにより、デリミタの両サイドに置くスペースの数を指定できます。
`,/l0l1r0r1`
　このコマンドを見て下さい。
`l0`　初めの二文字は、一つ目のカラムとその後に続くスペースの数を指定しています。
`l1`　そして次の二文字はデリミタ自体の整列基準とデリミタの後に置くスペースの数を指定しています。
　デリミタ自体がカラムとして扱われることに注意して下さい。そのことを理解するために、次は正規表現を用いた整形を行ってみましょう。

```rb
honoka: :strawberry, eli: :chocolate, kotori: :cheese,
umi: :honoka, rin: :ramen, maki: :kyoko,
nozomi: :yakiniku, panayo: :rise, nico: :maki
```

　初めのハッシュです。これを整形するには、以下のコマンドを使用します。
`\w+:|:\w+,*/c0rc0l`
　順に見て行きましょう。
`\w+:`　これは一般的な正規表現です。英数字が1個以上続いた後にコロンが置かれるもの、すなわちruby1.9以降の新しい記法でのハッシュキーに使われているシンボルを表しています。
`:\w+,*`　これはコロンから始まり0個以上のカンマで終わるシンボルを表します。
`c0rc0l`　コードの整形方法を指定しています。整列基準を表すアルファベットの奇数番目がカラムの整列基準となり、偶数番目がデリミタ自体の整列基準となります。たとえ全ての文字がデリミタとしてマッチしたとしてもカラムが存在するものとして扱われるので、今回のように全てをデリミタとして整列させる場合もダミーとして何らかのオプションを入れる必要があります。例の場合は中央揃えのCを指定し、その後に0を指定することで余計なスペースが入ることを防いでいます。例の`r`は始めににヒットしたデリミタ、つまりハッシュのキーに、`l`は二番目にヒットしたデリミタ、つまりはハッシュのバリューに対応しています。

#　ショートカット
　AlignTabを短縮的に利用するには、2つの方法があります。

##　エイリアス
 package settingsより、エイリアスを設定することが出来ます。

```json:AlignTab.sublime-settings
 {
  "named_patterns": {
     "rh": "\\w+:|:\\w+,*/c0rc0l"
  }
}
```

上記のように記載すれば、AlignTabパレット内で`rh`とタイプすれば、指定したコマンドを走らせることが出来ます。


##　ショートカットキー

```js:*.sublime-keymap
[
  // Align Tab
  {
    "keys": ["ctrl+shift+a"], "command": "align_tab",
    "args" : {"user_input" : "\\w+:|:\\w+,*/c0rc0l"}
  }
]
```

#　Misc.

　オプションにはデリミタの個数を指定する事ができます。
`/f2`　とした場合、デリミタは初めの2つ目までマッチして、それ以前のもののみ整形します。
　オプションでの`*`は、繰り返しを意味します。以下の2つは等しいものとして扱われます。
`rcccc` `r(c)*4`
さくらVPS: 契約してからの作業メモ


1年ぶりくらいにさくらVPSを契約。前回は全然使えないまま1年が過ぎてしまったので今回はちゃんと使い倒そうと思う。

# 1. 契約からサーバ立ち上げまで
http://www.sakura.ne.jp/ でとりあえず前回と同じ1Gプランで契約。
2週間はおためし期間らしい。一旦各月払いで契約。

## 契約メール⇒コントロールパネルへのアクセス
以下のような内容が送られてくる。

![[さくらのVPS] 仮登録完了のお知らせ - r.chikaki@gmail.com - Gmail 2013-12-28 00-38-55.png](https://qiita-image-store.s3.amazonaws.com/0/13161/3df79e06-3582-6eb9-e138-c610cf5a998d.png "[さくらのVPS] 仮登録完了のお知らせ - r.chikaki@gmail.com - Gmail 2013-12-28 00-38-55.png")


上記のメールにしたがってVPSコントロールパネルにアクセスする
IPアドレスとパスワードを入力してログイン。
https://secure.sakura.ad.jp/vpscontrol/

![さくらインターネットVPSコントロールパネル 2013-12-28 00-43-51.png](https://qiita-image-store.s3.amazonaws.com/0/13161/868f0e08-e426-36af-e905-55bcf30f6e5d.png "さくらインターネットVPSコントロールパネル 2013-12-28 00-43-51.png")

初回アクセス時は停止状態なので、起動を選択。ちょっと待つとサーバが起動する

# 2.  鍵認証SSHでの接続設定

## リモートコンソールからアクセス
一旦リモートコンソールからsshの設定を進めていきます
コントロールパネル >> リモートコンソール
メールの記載された管理用root パスワードでログインします。

![さくらインターネットVPSコントロールパネル 2013-12-28 00-55-17.png](https://qiita-image-store.s3.amazonaws.com/0/13161/67765333-ff14-30a7-7ef7-9413d3214bef.png "さくらインターネットVPSコントロールパネル 2013-12-28 00-55-17.png")

## 管理用ユーザの作成
rootでログインし続けるのはセキュリティ上良くないので管理用のユーザアカウントを作成
で、パスワードを設定。

```
adduser chkk525
passwd chkk525
```
## クライアントからアクセス
Terminal.appを開き、

```
ssh chkk525@xxx.xxx.xxx.xxx -p 22
```

でログイン、パスワードを求められるので入力。


## SSH接続のセキュリティを向上

```
vim /etc/ssh/sshd_config
```


```接続先Portの制限
## Port 22 ⇒
Port 4569
```

``` rootに直接ログインできなくする
## PermitRootLogin ⇒
PermitRootLogin no
```

``` sshdの再起動
/etc/init.d/sshd restart
```
![Chikaki — root@www4057uo:~ — ssh 2013-12-28 01-20-26.png](https://qiita-image-store.s3.amazonaws.com/0/13161/e480410b-8eb4-1392-970d-199f6dea5067.png "Chikaki — root@www4057uo:~ — ssh 2013-12-28 01-20-26.png")

# 公開鍵認証方式によるSSH接続設定

## クライアント側で鍵ペアを生成

``` クライアント側
ssh-keygen
```
~/.ssh/ に 
- id_rsa(秘密鍵)
- id_rsa.pub (公開鍵)
が生成される。この内、公開鍵をVPS側に転送する。

## id_rsa.pubをscp転送する
scpコマンドを使ってid_rsa.pub(公開鍵)を転送していきます。
ポートを先ほど変更した4569に設定するのを忘れないようにします。
(scpは -P 大文字で指定)


``` クライアント側
scp -P 4569 ~/.ssh/id_rsa.pub chkk525@xxx.xxx.xxx.xxx:~

```
パスワードを求められるので入力すると転送が完了します。

## サーバ側でid_rsa.pubを適切な場所に配置

``` サーバ側(作業用アカウントでログイン)
$ mkdir .ssh
# .sshディレクトリのPermissionを変更
$ chmod 700 .ssh
$ mv id_rsa.pub .ssh/
```

## authorized_keysを作成し、公開鍵を登録
``` 
cd .ssh
touch authorized_keys # 空のファイルの作成
cat id_rsa.pub >> authorized_keys 
chmod 600 authorized_keys #読み書き権限
```

## SSH接続認証の設定
``` rootでログイン
vim /etc/.ssh/sshd_config 

``` /etc/.ssh/sshd_configの設定
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
PasswordAuthentication no
```

``` sshdの再起動
/etc/init.d/sshd restart
```

## SSH接続の方法

``` 通常の方法
ssh chkk525@xxx.xxx.xxx.xxx -i .ssh/id_rsa -p 4569
``` 
``` .ssh/configを下記に編集
Host sakura
    HostName xxx.xxx.xxx.xxx
    User hogehoge
    Port 4569
    IdentityFile ~/.ssh/id_rsa
```

```簡便な方法
ssh sakura
```
NSStringのstringByAppendingStringやstringByAppendingPathComponentにゴミが入るときは


これらのメソッドで作った参照は、autorelease（かな？）されるようで、すぐにゴミが入ります。
なのでコピーを作る。

```Objective-C
NSString* str = …
NSString* copyStr = [NSString stringWithString: [str stringByAppendingPathComponent: @“hoge”]];
```

なぜこうすればうまくいくかは、よく理解出来ていない・・・

ガベージコレクタのない処理系でプログラムを書くのは、Javaでプログラムを勉強した身としては辛いところ・・・(^_^;)
2014/01/14あたりからTwitter APIのリクエストがエラーになって困った時

# Twitter APIがhttpsでのリクエストしか受け付けなくなっています！！

https://dev.twitter.com/discussions/24239

APIのリクエストがhttpsになっているか確認しましょう

以下のページは常にwatchしておいたほうが良さそうですね...
https://dev.twitter.com/calendar
Virtual-Replace

本記事は [Vim Advent Calendar 2013](http://atnd.org/events/45072) の 47 日目の記事です。
46 日目は @zoncoen さんによる、[Unite-autojumpをつくった](http://blog.zoncoen.net/blog/2014/01/15/unite-autojump/) でした。

今回は地味に便利なあの機能です。

# まとめ

`:help gR`
`:help Virtual-Replace-mode`

# よくある話

あなたが不幸にも以下のようなコメントに出会ってしまったとします。


```c:
/********************************************/
/*                                          */
/*  関数の処理:                             */
/*              2014年1月16日 氏名          */
/*                                          */
/********************************************/
```

もちろん空白部分は全てハードタブです。
または、以下のようにスペースで整形された表組みを編集するような場合もあるかもしれません。


```markdown:
|         |         |         |
|---------|---------|---------|
|         |こ↑こ↓   |         |
|---------|---------|---------|
|         |         |         |
```

これを置換 `R` で書き換えようとすると文字幅の差によって、悲しみがあります。

```c:
/********************************************/
/*											*/
/*	関数の処理:	process*/
/*				2014年1月16日 氏名			*/
/*											*/
/********************************************/
```


```markdown:
|         |         |         |
|---------|---------|---------|
|         |here |         |
|---------|---------|---------|
|         |         |         |
```

悲しみです。

# Virtual-Replace

Vim には Virtual-Replace-Mode というものがあり、`gR` で開始します。
これは文字幅・タブ幅を維持したまま置換を行ってくれます。


```c:※イメージ図
/********************************************/
/*                                          */
/*  関数の処理: function process            */
/*              2014年1月16日 氏名          */
/*                                          */
/********************************************/
```


```markdown:※イメージ図
|         |         |         |
|---------|---------|---------|
|         |here!    |         |
|---------|---------|---------|
|         |         |         |
```

# 余談

`g` プレフィックスのキーバインドには色々と便利な機能があります。
`gj` `gk` に始まり、`ga` `gd` `gf` などです。個人的なお気に入りは
`g<C-]>` です。ぜひ試して使いこなしてみてください。

# 余談 2
Virtual-Replace、かっこいいですよね。響きが。私だけかもしれません。

以上 Vim Advent Calendar 2013 47 日目の記事でした、次回 48 日目は未定です。
[Vim Advent Calendar 2013](http://atnd.org/events/45072) では執筆者を募集しています。あと 318 人書けますので、どんどんやっていきましょう。以上です。
SinatraでもAsset Pipeline（的なやつ）を使う


SinatraでRailsみたいなAsset Pipelineを使いたい！

…と，いうより，

SinatraでRailsみたいにSass（SCSS）やCoffeeScriptを何も考えずに使いたい！
ということでそれを実現する[**Sinatra Assetpack**](http://ricostacruz.com/sinatra-assetpack/)というgemの最低限の使い方メモ．

# つかいかた
## 導入

とりあえずgemを入れよう．

```ruby:Gemfile
gem 'sinatra'
gem 'sinatra-assetpack'

gem 'coffee-script'
gem 'sass'
```

## 有効化

設定例はこんな感じ．

```ruby:app.rb
require 'sinatra/base'
require 'sinatra/assetpack'

class App < Sinatra::Base

  register Sinatra::AssetPack

  assets do
    serve '/javascripts', from: 'assets/javascripts'
    serve '/stylesheets', from: 'assets/stylesheets'

    js :application, [
      '/javascripts/*.js'
    ]

    css :application, [
      '/stylesheets/*.css'
    ]

    js_compression :jsmin
    css_compression :sass
  end

  # 省略

end
```

この例だと`/assets/javascripts`，`/assets/stylesheets`がasset置き場になる．
あとはレイアウトファイルに配置するだけ

```ruby:layout.erb
<%= css :application %>
<%= js :application %>
```

設定の`:application`を書き換えるとレイアウトに配置するときの名前も変わる．
これだけでちゃんとCoffeeScriptもSassもいい感じにしてくれるらしいです．スゴイ！

他の設定例やらコード例は[公式サイト](http://ricostacruz.com/sinatra-assetpack/)にいっぱい載ってました．


# 参考
- [sinatra-assetpack](http://ricostacruz.com/sinatra-assetpack/)
- [Sinatra Recipes - Asset Management - Sinatra Assetpack](http://recipes.sinatrarb.com/p/asset_management/sinatra_assetpack)
誕生日から現在の学年(小学校)を求める


```PHP:grade.php
<?php
 
$birth = "20040501";
echo grade($birth);
 
//誕生日から現在の学年(小学校)を求める 小学生ではない場合:歳
function grade($birth){

//今日の日付を取得
$now = date('Ymd');

//年齢の計算
$age = floor(($now-$birth)/10000);

//各月日を求める
$b_y = substr($birth, 0, 4);
$b_m = substr($birth, 4, 4);
$n_y = substr($now, 0, 4);
$n_m = substr($now, 4, 4);

if ($n_m < 400) { //前学期
	$m = 6;
} else { //新学期
	$m = 5;
}

if($b_m < 402) { //早生まれ
	$n_y++;
}

//学年の計算
$grade = $n_y - $b_y - $m;

//結果を返す
if($grade>=1 && $grade<=6){
	$data = $grade."年生";
}else{
	$data = $age."歳";
}

return $data;

}

?>
 
<html>
	<head>
		<meta charset="utf-8">
	</head>
</html>
```
JavaScript 関数内の this が指すものは、関数をメソッドとして扱うか、コンストラクタとして扱うかで変化する

JavaScript で関数内の this の指す先が、関数オブジェクトを

0. （親オブジェクトの）メソッド扱いして実行するか
0. コンストラクタ扱いして新しいインスタンスを生成するか

で、変化するという例。

## （親オブジェクトの）メソッド扱いして実行する

```js:1.js
var a = {"x" :function(){this.p = 1}};

console.log(a.p); // undefined
console.log(a.x.p); // undefined

//↑ここまでは共通

var x1 = a.x(); // x を a のメソッド扱いして実行、返り値を x1 に格納. 左辺を省いて a.x() だけでも下の結果は変化しない.
console.log(a.p); // 1. this は a を指していた.
console.log(x1.p); // TypeError. x1 が undefined なので.
console.log(a.x.p); // undefined. this は a.x を指しているわけではない.
```

以上から this は a を指していたことになる。

## コンストラクタ扱いして新しいインスタンスを生成する

```js:2.js
var a = {"x" :function(){this.p = 1}};

console.log(a.p); // undefined
console.log(a.x.p); // undefined

//↑ここまでは共通

var x1 = new a.x(); // x をコンストラクタ扱いして新しいインスタンス x1 を生成. new が付いただけで左辺 x1 の意味合いが変わっていることに注意.
console.log(a.p); // undefined. this は a を指していない.
console.log(x1.p); // 1. this は x から生成されたインスタンス x1 を指していた.
console.log(a.x.p); // undefined. this は a.x を指しているわけではない.
```

以上から this は x から生成されるインスタンスを指していたことになる。

***
ちなみに、function 内にreturn文を書いた場合の挙動については [JavaScript: Constructor Return Value](http://www.gibdon.com/2008/08/javascript-constructor-return-value.html) を参照。値を返すだけのreturn文は無視されるが、return {"p":2} としてオブジェクトを返すと、2.js の 10行目は 2 が返ってくる。関数をコンストラクタとして宣言する場合は、関数を大文字ではじめ、return文を書かないことで、メソッドと明確に区別できるようにした方がいいだろう。

***
###参考
- [Javascriptでオブジェクト指向するときに覚えておくべきこと - Qiita [キータ]](http://qiita.com/awakia/items/8ff451ca5f8ae0122be7)
- [JavaScript の this について - IT戦記](http://d.hatena.ne.jp/amachang/20070917/1190015123) (6)とかは実行時の文脈で this が解釈される好例。
rspecでcookieを参照、設定する

Railsでcookieの値で挙動を変えているとき(A/Bテストなど)に
rspecでcookieの値を指定したいことがあります。

環境はCapybara + PhantomJS(poltergeist)の場合

```rb
#参照するとき
page.driver.cookies
#設定するとき
page.driver.set_cookie(名前, 値)
```

のようにすればいけるようです。
既に設定している場合は、いったん消してあげてから設定するとうまくいきます

```rb
#いったん削除
page.driver.remove_cookie(名前)
#設定
page.driver.set_cookie(名前, 値)
```

これで以上なんですが、調べるときにわざわざpry使ってデバッグしてたので
どうやるのが効率がいいんでしょうかねぇ

stackoverflowを見たんですが、環境によってテストに使ってるドライバが
違うことが多いので、必ずしもpage.driverの値が一致するとは限らないですよね


Railsのloginヘルパの前後にbinding.pryを書いて

```bash
pry> page.driver
=> #<Capybara::Poltergeist::Driver
```

って出たんで
Capybara::Poltergeist::Driverの[リファレンス](http://rubydoc.info/gems/poltergeist/Capybara/Poltergeist/Driver)見て
あ！set_cookieがある。remove_cookieがあるって気づいた.

使ってるライブラリのリファレンスくらい見ろよって話ですけどね。
Google Maps Component for iOS の CoordinateBounds について


すごくニッチな話ですけど、Xamarin Components にある Google Maps を Xamarin.iOS で使った。

* [Google Maps /Components](http://components.xamarin.com/view/googlemapsios)

このライブラリの中に ``CoordinateBounds`` という「領域」を表すクラスがある。これは [GMSCoordinateBounds](https://developers.google.com/maps/documentation/ios/reference/interface_g_m_s_coordinate_bounds?hl=ja) の Binding だ。

で、CoordinateBounds には ``Including`` ([includingCoordinate](https://developers.google.com/maps/documentation/ios/reference/interface_g_m_s_coordinate_bounds?hl=ja#a63cffdf310ca19c6bab74c9a4034aadd)) というメソッドがあって、これを呼ぶと指定した座標が入るように領域を拡幅してくれる、便利だ。

で、最初はこのクラスをこう使っていた。

```csharp:
var bounds = new CoordinateBounds();
bounds.Including(new CLLocationCoordinate2D(34d, 134d));
bounds.Including(new CLLocationCoordinate2D(33d, 133d));
bounds.Including(new CLLocationCoordinate2D(35d, 135d));
```

動かしてみて、この使い方だと ``bounds`` から期待した結果が得られないことに気づいた。範囲が -180〜+180 になってしまった。

正しくはこう。

```csharp:
var bounds = new CoordinateBounds(
    new CLLocationCoordinate2D(34d, 134d),
    new CLLocationCoordinate2D(33d, 133d));
bounds.Including(new CLLocationCoordinate2D(35d, 135d));
```

これだと結果は、正しく [33,133 - 35,135] を返す。

処理上、生成時に２つの座標が揃ってないケースだったので、「あ、デフォルトコンストラクタあるじゃん」と使ってたらハマった。本家 iOS 版の方には引数無しの initXXX は無かった。

Objective-C の仕様上 alloc して init しないのを防げない、んだっけ？
だから、Xamarin.iOS の Binding でデフォルトコンストラクタを隠せないのかな？
突っ込んで調べてないけど、Binding ライブラリを使う時は注意しましょう、ちゃんと本家のAPIリファレンスを見ましょう、というお話でした。
Roby on Rails コントローラ内で動的命名したインスタンス変数をセットする方法

すぐ見つかると思って検索したら意外と見つからなかったのでメモ。


```rb
  name = "@sum_" + "1"
  instance_variable_set("#{name}", 1000)
  name = "@sum_" + "2"
  instance_variable_set("#{name}", 2000)
```

みたいな感じで書くとrailsのcontroller内で動的に命名したインスタンス変数がセットできます。
viewでは<%= @sum_1 %>(表示は1000)とか<%= @sum_2 %>(表示は2000)とかで参照可能
 
使うか使わないかはあなた次第です（謎）
Coverallsで "coverage unknown" になった時の対処法

[Coveralls](https://coveralls.io/) を使っていて、カバレッジは100%と表示されているのにバッジが ![coverage unknown](https://s3.amazonaws.com/assets.coveralls.io/badges/coveralls_unknown.png) と表示されてしまう現象に悩まされたのでメモ。

結果から先に書きますが、今回は GitHub 上の

* [Badge is not updated / showing unknown status](https://github.com/lemurheavy/coveralls-public/issues/116#issuecomment-32360960)

という Issue で報告することで社員さんに直して貰いました。

ただし、後から調べてみたところ自力で直すこともできなくはなかったようです。

ここからは推測も混じるのですが、

* Coveralls は送信されたカバレッジ情報が前回と同じなら処理を省略する仕組みがある
* カバレッジ対象のコードを変えずに連続してcommitすると、バッジだけ ![coverage unknown](https://s3.amazonaws.com/assets.coveralls.io/badges/coveralls_unknown.png) になってしまうことがある
* 空commitしたり、カバレッジ対象外のコードを修正してcommitしても、送信されるカバレッジ情報は変わらないのでバッジの内容は変わらない

という状況だったのではないかと思われます。

つまり、カバレッジ対象のコードを何か修正してcommitしていれば恐らく解決していただろうということですね。

なお、発生した対象のコードが Python だったので `Python` タグを追加しておきましたが、Python 固有の話ではなさそうな気がしています。
Google APIのアクセス時に必要なdeveloperKeyはどこにある？

#経緯  
Google APIを初めて使うので、初めてガイドみたいのに沿って試していた所、 **developerKey** が必要になったのですが、そんなんどっかで作成したっけ？とあたふたしました…

#あれこれググると…  
ようやく、 **Google apisページの左メニューAPI Accessを選択、Simple API AccessのところにあるAPI keyが「developerKey」である**という情報にたどり着きましたが、2014/01/16現在は **Google apisはGoogle Developers Console** に変わってるので、Simple API Accessがありません…

#で、今のヤツだと、どこに書いてあるの？
Google Developer Consoleページの左メニュー認証情報を選択、公開APIアクセス、ブラウザアプリケーションのキーにあるAPIキーがdeveloperKeyにあたります。(★のところ)
これで「元のコンソールに戻る」とかしなくても済みます。

![Google_dev_oauth_pub.png](https://qiita-image-store.s3.amazonaws.com/0/31217/27c086bb-1035-fac7-85d5-5229edb8ec8e.png)

#最後に、Googleへ一言！
 **API=Developer** じゃないですから、ちゃんと書いといて欲しいものです。こんなん推測できない…
Xamarin.iOS でエラー “Failed to load AOT module ... in aot-only mode”


Xamarin.iOS で Binding プロジェクトをソリューションに追加して実機で実行したら、起動時に落ちるようになってしまった。

ログには、

>Failed to load AOT module ‘/xxx/Hoge.dll.dylib' in aot-only mode.

というエラーが出ていた。

実機からアプリを削除して、
ソリューションを「再ビルド」したら直った。小ネタ過ぎる。

## 参考

* [MonoTouch - Failed to load AOT module ... in aot-only mode](http://monotouch.2284126.n4.nabble.com/Failed-to-load-AOT-module-in-aot-only-mode-td4602614.html)
仮想マシンのディスク容量が足りない！Vagrantfile 内で解決したい。

前提
===========
- Vagrant を利用して仮想マシンを作成したい
- 普通に `vagrant up` するとディスク容量が足りない！
- プロバイダは VirtualBox

対応方法
===========
新しいディスクを作成 ＆ アタッチします。

```ruby:Vagrantfile
config.vm.provider :virtualbox do |vb|
  file_to_disk = "./tmp/disk.vdi"
  unless File.exist?(file_to_disk)
    vb.customize ['createhd', '--filename', file_to_disk, '--size', 20 * 1024]
    vb.customize ['storageattach', :id, '--storagectl', 'SATA', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk]
  end
end
```

直接ディスク容量増やせないの？
===========
ディスクイメージ（vdi）へのパスの取得方法がわかりませんでした。
こんな感じでできると良いのですが。

```rb
vb.customize ["modifyhd", path_to_vdi, "--resize", 20 * 1024] # できない
```

おまけ: フォーマット＆マウント例
===========
（fdisk ではなく）parted コマンドを使うとノンインタラクティブに、
パーティショニングできます。

```bootstrap.sh
#!/usr/bin/env bash
yum install -y parted

# パーティションの作成
parted -s -a optimal /dev/sdb mklabel gpt -- mkpart primary ext4 0% 100%
# フォーマット
mkfs.ext4 /dev/sdb1
# マウント
mkdir /db
mount /dev/sdb1 /db
# 自動マウント設定
echo '/dev/sdb1 /db ext4 defaults 0 0' >> /etc/fstab
```


参考
===========
- [virtualbox - Resizing disk space on vagrant box - Stack Overflow](http://stackoverflow.com/questions/14917353/resizing-disk-space-on-vagrant-box)
- [VBoxManage createhdコマンド | VirtualBox Mania](http://vboxmania.net/content/vboxmanage-createhd%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)
- [狩塊-KARIKATAMARI-:【VirtualBox】仮想ディスクの拡張方法（VDI) - livedoor Blog（ブログ）](http://blog.livedoor.jp/karikatamari/archives/1768224.html)
【CakePHP】リダイレクト

リダイレクト先の設定方法をまとめる。
リダイレクト後にexit()が発行されるため、処理が終了する。

###コントローラとアクションとパラメータを指定

```php:コントローラとアクションとパラメータを指定
// リダイレクト先：/orders/confirm/7
$this->redirect(['controller'=>'orders','action'=>'confirm',7]);
```

###URL指定

```php:URL指定
// リダイレクト先： http://example/orders/confirm
$this->redirect('http://example/orders/confirm');
```

###絶対パス

```php:絶対パス
// リダイレクト先： /orders/confirm
$this->redirect('/orders/confirm');
```
MarkdownのLink記述でちょっと便利な参照式の記述方法

Markdownで、Link記述を沢山利用する時に楽するための記述方法を知り、嬉しくなった勢いで投稿。

通常、リンクって下記の書式で書きますね。

```
[Hoge Link](http://hoge/fuge)
```

上記の結果： [Hoge Link](http://hoge/fuge)


この書き方って、本記事のように短い文章だと気になりませんが、文章量が多くなった時に文章中に埋め込むのって結構いろいろと手間になって編集するのが大変。
そこで、利用したいのが下記の記述方法

```
[Hoge Link][Hoge Link reference]

[Hoge Link reference]： http://hoge/fuge
```

（諸事情により上記の「：（コロン）」部分は全角になってますが、実際は半角にする必要あり）

上記の結果：[Hoge Link][Hoge Link reference]

参照をつかったリンク書式を使うと何がうれしいかって言うと、
- 複数回に渡ってリンクを使いた時に後から修正をするのは一ヶ所でいい。
- 本文が読みやすくなる

などの効果があります。
参照用の定義は表示されないのでどこに書いても問題ありません。

情報元： https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet



[Hoge Link reference]: http://hoge/fuge
argparseの使い方とoptparseとの違い

以前、[OptParserの使い方](http://qiita.com/petitviolet/items/c2ba174a153bbdc5ad22)として記事を書いたが、どうやらargparse.ArgumentParserの方がなういらしい

なのでargparse.ArgumentParserの使い方のメモ

```py
# -*- coding:utf-8 -*-
from optparse import OptionParser
from argparse import ArgumentParser
 
if __name__ == '__main__':
 
    """ コマンドエラー時に表示する文字列 """
    desc = u'{0} [Args] [Options]\nDetailed options -h or --help'.format(__file__)
    # %progは出力できない
    # usage = u'%prog [Args] [Options]\nDetailed options -h or --help'

    parser = ArgumentParser(description=desc)
    # _parser = OptionParser(usage=usage, version=1.0)
 
    # 文字列
    parser.add_argument(
        '-q', '--query',
        type = str,         # 受け取る値の型を指定する
        dest = 'query',     # 保存先変数名
        required = True,    # 必須項目
        help = '検索する単語' # --help時に表示する文
    )
    # _parser.add_argument(
    #     '-q', '--query',
    #     action = 'store',
    #     type = 'str',               # 受け取る値の型を指定する
    #     dest = 'download_date',     # 保存先変数名
    #     help = '検索する単語'  # --help時に表示する文
    # )

    # 数値
    parser.add_argument(
        '-w', '--worker',
        type = int,
        dest = 'worker',
        default = 1,
        help = 'マルチプロセス数'
    ) 
    # 真偽値
    parser.add_argument(
        '-b', '--bool',
        action = 'store_true', # store_trueでdestにTrueがはいる(store_falseもある)
        dest = 'bool'
    )
 
    # """ 各オプションのデフォルト値をセット """
    # _parser.set_defaults(worker = 1)
 
    """ オプションをパース """
    args = parser.parse_args()
    # _options, _args = _parser.parse_args()
 

    """ オプションで指定した値は args.<変数名>で取得できる """
    query, worker, bool = args.query, args.worker, args.bool
    # query, worker, bool = _options.query, _options.worker, _options.bool
    if worker > 100
        # エラーを発生させるときは↓こんな感じ
        parser.error('プロセスが多すぎます')
 
    print args

```

optparseもargparseもそんなに変わらないと思う
細かな所が変わっているのと、argparseには色々機能が追加されているみたいだが、基本的にはこの程度で十分だと思う

###参考
http://docs.python.jp/2/library/argparse.html
【gnavi】位置情報をブラウザから取得し初期位置に反映するPart3

思い切ってmap.jsの方で処理するようにしてみました

map.jsの58行目付近に

```js:map.js
//現在地取得
function geoLocate(){
	// 位置情報取得のオプション。高精度にする
	var position_options = {
		enableHightAccuracy: true
	};
	// 現在地取得（変わる毎に更新）
	navigator.geolocation.getCurrentPosition(success, fatal);
	
	//位置情報取得成功時
	function success(pos){
		document.getElementById('lat').value = pos.coords.latitude;
		document.getElementById('lng').value = pos.coords.longitude;
		ShowGMap();
		var myLatLng = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude);
		// ユーザのマーカーアイコンを変更
		var markerImage = new google.maps.MarkerImage(
			// 画像の場所
			"サイトURL/images/startposition.png",
			// マーカーのサイズ
			new google.maps.Size(64, 64),
			// 画像の基準位置
			new google.maps.Point(0, 0),
			// Anchorポイント
			new google.maps.Point(32, 32)
		);
		// 現在地のマーカー表示
		var marker = new google.maps.Marker({
			map:gn_map,
			draggable:false,
			animation: google.maps.Animation.DROP,
			position: myLatLng,
			title: "現在地"
		});
		return myLatLng;
	}
	// 位置情報取得失敗時
	function fatal(error){
		var message = "";
		switch(error.code){
			// 位置情報が取得出来ない場合
			case error.POSITION_UNAVAILABLE:
				message = "位置情報の取得ができませんでした。";
				break;
			// Geolocationの使用が許可されない場合
			case error.PERMISSION_DENIED:
				message = "位置情報取得の使用許可がされませんでした。";
				break;
			// タイムアウトした場合
			case error.PERMISSION_DENIED_TIMEOUT:
				message = "位置情報取得中にタイムアウトしました。";
				break;
		}
		window.alert(message);
		return null;
	}
}
```

そしてShowGMap()の中にgeoLocate();と書けばOKです
197行目付近になります（追加してるので少しずれてるかも

```js:map.js
function ShowGMap() {
// display many markers.
	// mashmap(gn_map);
	geoLocate();//位置情報取得　平成26年1月16日
	if(document.getElementById('mt').value){
		gn_mt = document.getElementById('mt').value;
	}else{
		gn_mt = 'ROADMAP';
	}
	gn_iz=parseInt(document.getElementById('z').value);
	gn_ilt=document.getElementById('lat').value;
	gn_ilg=document.getElementById('lng').value;
	if(!InitializeGmap())return;
	if(gn_drkm){
		var k = gn_url+'/kml.php?'+gn_ulop;
		var g = new google.maps.KmlLayer(k,
				{ suppressInfoWindows: true,
			map: gn_map});
		g.setMap(gn_map);
	}
	searchSales();
	// addListener
	google.maps.event.addListener(gn_map, 'idle', function() {
		var p = gn_map.getCenter();
		DrawLatLngTxt(p);
		var newZoomLevel = gn_map.getZoom();
		document.getElementById('z').value  =newZoomLevel;
		document.getElementById('sz').innerHTML  =newZoomLevel;
	});
	// addListener
	google.maps.event.addListener(gn_map, 'maptypeid_changed', function() {
		document.getElementById('mt').value = gn_map.getMapTypeId().toUpperCase();
	});
	// addListener
	google.maps.event.addListener(gn_map, 'click', function(){
		gn_infowindow.close(gn_map);
	});
	// setcenter
	var c = new google.maps.LatLng(document.getElementById('lat').value,document.getElementById('lng').value);
	gn_map.setCenter(c);
	gn_map.setZoom(parseInt(document.getElementById('z').value));
	if(gn_ep)MapClick();
}
```

これを実装すると
開いた時にブラウザから位置情報を取得し、初期位置になった場所に現在地とタイトルをつけたマーカーを設置します
絵文字のコードポイントとかさっくり知りたいな

多分ニーテンゼロ以降でないとうまく行かないかな？

```bash
$ ruby -e 'p "?".codepoints'
[128522]
```

`String#codepoints` めちゃくちゃ便利だと思う。

16進数で知りたいなら

```bash
$ ruby -e 'p "%X" % "?".codepoints' 
"1F60A"
```
Hetemlで FatFree Framework for PHPが動作しないときの対処法

PHPのマイクロフレームワーク「FatFree Framework for PHP」は、ライトで便利ですが、Hetemlに載せるとトップページが 500エラーで表示されません。

.htaccessにある、次の記述が悪さをしています。

```
RewriteCond %{REQUEST_URI} \.ini$
RewriteRule \.ini$ - [R=404]
```

そのため、この記述を削除するかまたはコメントアウトする（行頭に #をつける）と回避できます。
ただし、そのままだと今度は「config.ini」ファイルを叩かれると内容が見られてしまうため、このファイルのパーミッションを「400」、つまり所有者のみ読み込みという変更をして回避します。

これで、Hetemlでも動作します。安全性的に若干心配ですが、レンタルサーバーなので仕方がないでしょうか・・
CCMenuで効果音を鳴らす！(継承版)


追記：使用している2dxバージョンは **cocos2d-x-2.2.1**

CCMenuで音を鳴らすとかでググると、ドサッとでてきますよね

```cpp:sample.cpp

// initあたりで
void Sample::init()
{
	// 読み込んでおく
	SimpleAudioEngine::sharedEngine()->preloadEffect("tap.mp3");

	// menu作成
	CCMenuItemFont* hoge = CCMenuItemFont::create("tap", this, menu_selector(Sample::tapHoge));
	CCMenuItemFont* fuga = CCMenuItemFont::create("tap", this, menu_selector(Sample::tapFuga));
	CCMenu* menu = CCMenu::create(hoge, fuga, NULL);
	this->addChild(menu);
}

void Sample::tapHoge(CCNode* sender)
{
	// 音を鳴らす
	SimpleAudioEngine::sharedEngine()->playEffect("tap.mp3", false);
	// 以下に処理
}
void Sample::tapFuga(CCNode* sender)
{
	// 音を鳴らす
	SimpleAudioEngine::sharedEngine()->playEffect("tap.mp3", false);
	// 以下に処理
}

```

さっくり書いちゃうとこんな感じでしょうか
これはこれで十分ですけど、メニューアイテムが多くなってきたときに、
まぁわりとめんどい。
処理先のメソッドに書き忘れたりして…

それを回避する一つの方法として、タップ時の処理先を一つに限定して
tagとかで判定する方法もありますね

```cpp:例
void Simple::tapMenu(CCNode* sender)
{
	// 音をならす
	SimpleAudioEngine::sharedEngine()->playEffect("tap.mp3", false);

	//処理わけ
	switch (sender->getTag()) {
		case 0:
			// それのしょり
			break;
		case 1:
			// それのしょり
			break;
		default:
			break;
    }
}
```

こういう感じ。
もちろん `CCMenuItem` に予めtagを設定しておく必要があります
さらに `enum` とかで定義してればみわけもつきやすくなるでしょう
<del>ただ、これも10個(そんな画面あるか？)とかなってくると
やっぱりそれなりに長くなります。</del>
(僕が提案する方法やったって、この長さは変わんないわ…(；´∀｀))
不愉快です！(笑)

ということで、ここからが漸く本題ですが
んじゃ、画面で制御して鳴らすんではなくて、
`CCMenu`の方でタップされたらなるようにしましょうよ
っていうこと
`CCMenu`を継承して`CCMenuSound`というものを作ってみました

```cpp:CCMenuSound.h

#include "cocos2d.h"

class CCMenuSound : public cocos2d::CCMenu
{
public:
	CCMenuSound();
	virtual ~CCMenuSound();
	
	static CCMenuSound* create(const char* soundName, cocos2d::CCMenuItem* item, ...);
	virtual void ccTouchEnded(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);
    
	void setSound(const char* sound);
    
protected:
private:
	const char* m_sound;

};

```

```cpp:CCMenuSound.cpp
#include "CCMenuSound.h"

#include "SimpleAudioEngine.h"

USING_NS_CC;
using namespace std;
using namespace CocosDenshion;

CCMenuSound::CCMenuSound()
{
}
CCMenuSound::~CCMenuSound()
{   
}

CCMenuSound* CCMenuSound::create(const char *soundName, CCMenuItem *item, ...)
{
	va_list args;
	va_start(args,item);
	CCArray* pArray = NULL;
	if( item )
	{
		pArray = CCArray::create(item, NULL);
		CCMenuItem *i = va_arg(args, CCMenuItem*);
		while(i)
		{
			pArray->addObject(i);
			i = va_arg(args, CCMenuItem*);
		}
	}	
	CCMenuSound* pRet = new CCMenuSound();
	pRet->initWithArray(pArray);
	pRet->setSound(soundName);
	va_end(args);
	return pRet;
}

void CCMenuSound::ccTouchEnded(CCTouch* touch, CCEvent* event)
{
	SimpleAudioEngine::sharedEngine()->playEffect(m_sound, false);
	CCMenu::ccTouchEnded(touch, event);
}

void CCMenuSound::setSound(const char *sound)
{
	m_sound = sound;
	SimpleAudioEngine::sharedEngine()->setEffectsVolume(.5);
	SimpleAudioEngine::sharedEngine()->preloadEffect(m_sound);
}

```

使う場合は…一番最初のやつを例になおすと

```cpp:CCMenuSound使い方
	CCMenuSound* menuSound = CCMenuSound::create("tap.mp3", hoge, fuga, NULL);
```

これで、タップしたら音がなるCCMenuの完成です
メニューを設置するたびに音読みこんでー鳴らしてーとかやんなくてだいぶ楽かと。  

記述ミスやらバグとかなにかあれば、教えていただけると幸いです〜