OmniAICreator/Qiita-1.07M huggingface dataset:
[Netbeans8.0]PHPUnitをリモートサーバで実行する

# こんな方に
- Vagrant+VirtualBoxなどを使って開発している
- Netbeansからphpunitを仮想マシン上で実行したい、カバレッジもみたい
- コマンド叩いてテスト実行するの面倒

# 利用上の注意点
- 開発環境はMacOS向けです（スクリプト内のパスの設定を変更すればwindowsでも使えるとは思いますが未検証）
- 仮想マシンはCentOS等のlinux向けです（これもスクリプト内のパスの設定を変更すれば使えるとは思いますが未検証）
- 開発環境にもphpは必要(sshも)です、phpunitは不要です
- Netbeansでもっと簡単にできるよ！というのがあれば是非教えてください

# 仕組み
簡単にですが仕組みについて記載します。
Netbeansに関する記載は憶測や調査した内容を含みます。
誤りがあればご指摘いただけると大変うれしいです。

通常、Netbeansではphpunitを実行する際にNetbeansへの設定を参照しコマンドへ渡す引数を生成します。
最終的に出来上がる引数の例としては、以下のようになります。
※Netbeansの設定状況に応じて変化します。

```bash
"/Users/liberty/.phpbrew/php/php-5.5.16/bin/php"
"/Users/liberty/works/virtual_machines/vm1/crawler/vendor/bin/phpunit"
"--colors"
"--log-junit"
"/var/folders/wv/cld1sfzd05z2w50smpbmss3m0000gn/T/nb-phpunit-log.xml"
"--bootstrap" "/Users/liberty/works/virtual_machines/vm1/crawler/bootstrap/autoload.php"
"--configuration"
"/Users/liberty/works/virtual_machines/vm1/crawler/phpunit.xml"
"--coverage-clover"
"/var/folders/wv/cld1sfzd05z2w50smpbmss3m0000gn/T/nb-phpunit-coverage.xml"
"--filter"
"%\btestGet\b%"
"/Applications/NetBeans/NetBeans 8.0.1.app/Contents/Resources/NetBeans/php/phpunit/NetBeansSuite.php"
"--run=/Users/liberty/works/virtual_machines/vm1/crawler/app/tests/app/models/ImpTest.php"
```

実際に実行されるコマンドを簡略化すると以下の通りです。

```bash
php phpunit {other_arguments}
```

つまり、引数をリモートの環境に合わせてあげればよいのです。

本スクリプト内の処理内容については以下の通りです。

1. 引数をリモート環境に合う形へ文字列を置き換える
2. NetbeansSuite.phpをリモートへ配置する
3. 置き換えた文字列をリモートのphpに渡して実行する
4. 実行結果のログファイル(nb-phpunit-log.xml,nb-phpunit-coverage.xmlを取得する）

## スクリプト
とりあえず作ったものなので最新のソースは以下のリポジトリにおいてあります。
随時リファクタリングするかもしれないので利用する際はgithubのソースを取得して下さい。
https://github.com/LibertyDevs/phpunit-remote

配置場所はどこでも良いです。

## 使い方

- ダウンロードしたスクリプトの user configuration に囲まれている箇所を変更します。
- ダウンロードしたスクリプトをNetbeansへ設定します
- [プロジェクト]を右クリック
- [カテゴリ内のphpunit]をクリック
- **[カスタムPHPUnitスクリプトの使用]のみチェック**をいれてダウンロードしたスクリプトを指定
- いつも通りテスト実行

README:https://github.com/LibertyDevs/phpunit-remote
【質問】Ruby ::テキストファイルをCSV形式に変換し保存。

初めまして。お粗末な質問で失礼します。

テキスト形式で保存しているファイルをcsv形式にしたいのですが、期間も迫ってきており、いつまでも躓いているので質問させて頂きます。

テキストファイル：
"company_name_a"
["mail@aaa.com"]
"company_name_b"
["mail@bbb.com"]
"company_name_c"
["mail@ccc.com"]

このテキスト形式のファイルをcsv形式にして保存したく、以下の様なコードを書きました。
 require 'csv'
 open("テキスト.csv") {|file|
   while l = file.gets
    i=l.parse_csv   
     CSV.open("test.csv","w",:quote_char => "|") do |csv|
     csv << i
     end  
   end  
	} 

error 内容
in `block (2 levels) in shift': Illegal quoting in line 1. (CSV::MalformedCSVError)
NGUI で日本語が文字化けする

NGUI でスクリプトから、ラベルの文字列を設定すると ??? という形で文字化けしてしまった。

以下の様に、スクリプトからラベルの文字列を設定した時に起こった。

```csharp
GetComponent<UILabel>().text = "日本語のラベル";
```

原因は、上記を含む .cs ファイルが UTF-8 BOM 付きではなく、UTF-8 になっていたこと。

Unity のコードを書くときに、Xamarin を使っているのだが、バージョンを上げた時に BOM がつくかどうか挙動が変わった模様。

nkf を使って、以下のように BOM 付きに変換してやると、文字化けせずに実行される。

```bash
nkf -w8 --overwrite hoge.cs
```

nkf は Homebrew で入れた。
AngularJSの学習メモ　Directiveについて


### これまでのAngularJSのメモ
- http://qiita.com/kenjiSpecial@github/items/72074e89762556a105e4

###Directiveを使わないAngulrJSアプリ


```html:index.html
<html >
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="bower_components/angular/angular.js"></script>
</head>
<body ng-app>
<div>
    {{ "Hello World!"}}
</div>
</body>
</html>
```

お決まりのHello Worldが表示されていると思います。

###Directiveを使うAngulrJSアプリ
```html:index.html
<body ng-app="mainApp">
    <hello-world></hello-world>
</body>
```

hello-worldタグを作成します。
ここで注意したいのは、helloWorldタグにしないことです。

テンプレートを作成します。

```html:templates/helloWorld.html
<div>
    {{ "Hello World!"}}
</div>
```

```javascript:main.js
(function(){
    var app = angular.module('mainApp', {});

    app.directive("helloWorld", function(){
       return {
           restrict : 'E',
           templateUrl : "templates/helloWorld.html"
       };
    });
})();
```

directiveの表記はhello-worldでなく、helloWorldです。
restrictは、HTMLをどのようにするか指定します。
Eは要素名を意味します。

詳しくはdirectiveで、、
https://docs.angularjs.org/guide/directive
git submoduleに対してのうわべっぽい理解

#git submoduleとは
git submoduleとは、一言で言うと**ネストされたgitレポジトリ**です。たとえばあるレポジトリで使用しているライブラリについて、常に最新のライブラリを使用したいという場合、そのライブラリを自分のgitリポジトリに入れてしまって更新されるたびにpullするという使い方が考えられますね。
#使い方（うわべ）
既存のレポジトリの中で、
`git submodule add <repository's URL>`
のコマンドを叩きます。イメージはcloneと一緒ですね。
該当ライブラリのver,branchを切り替えたいときは、そのディレクトリの中に入って、
`git pull`とか`git checkout`すればよいです。
そのあと、そこから出て、該当ディレクトリをadd,commitすればよい。
これが基本の使い方になります。かんたん！
#ややこしいことがおこるとすれば
##submoduleはついてこない
タイトルの通りです。たとえばsubmoduleが含まれているリポジトリをcloneしてきたとして、submoduleのディレクトリ内はからっぽになっています。おいおい、なんでやねんとなるポイントですね。
外側（大本のリポジトリ）とsubmoduleは厳密に連動しているわけではないので、このようなことが起こります。解決法としては、該当ディレクトリの中で、
`git submodule init`、`git submodule update`とすれば、そのclone元で使ってたsubmoduleの参照先から引っ張ってきてくれます。
本家リポジトリのbranchを切り替えたりしたときもそうです。基本的にsubmoduleはついてきてくれないので`git submmodule update`する必要があります。
#要するに
1. 追加は`git submodule add <URL>`
2. 困ったら中に入って`git submodule update`

うん、うわべっぽい。間違いありましたら指摘お願いいたします。
#ちなみに
submodule内をいじくりまわすのはやめましょう。本家リポジトリをいじってそれをsubmodule内でpullするのが賢いっぽいです。
#追記
ローカルのsubmoduleに変更加えてしまった場合。それが必要のない変更なら、submoduleディレクトリに入って、`git resert --hard`でどうにかなる。要するにそのcommitを無かったことにしてるだけだけど。危ないコマンドなので多用しない方がいいっぽい。
dockerでOpenVPNコンテナを他のコンテナのゲートウェイにしたい


pipework使わないで、なんとかできないものかと頑張ってみたんだけど、iptablesをいじらなきゃいけないのかな、、

## 構成
container1: openvpn client
container2: container1をゲートウェイにしてvpn server につなぐ

![docker_with_openvpn_as_gateway.jpg](https://qiita-image-store.s3.amazonaws.com/0/17954/9a3484fa-2153-4aea-176e-6007ab57a16d.jpeg "docker_with_openvpn_as_gateway.jpg")

赤編みかけ: 設定したこと
青編みかけ: dockerデフォルト

## 設定
### container2


```
ip route add 10.0.0.0/8 via 172.17.0.28
```

### container1


```
iptables -t nat -A POSTROUTING -s 172.17.0.0/16  -j MASQUERADE
```

### docker host


```
iptables -t nat -D POSTROUTING -s 172.17.0.0/16 ! -d 172.17.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -d 10.0.0.0/8 -j MASQUERADE
```
nginxで特定のURLにアクセスがあったときにレコード200を返す

nginxで特定のurl例えば/hogeにアクセスしてきた時に200番を返したいです。CentOSです。

nginxの設定ファイルを編集します。

```nginx:設定ファイル
if ($request_uri = /hoge) {
    return 200;
}
```

動作確認したところreturn 200で200番が返りました。
RailsのResourcesでNestしてshallow: trueしたresourcesをAngularJSの$resourceで扱う


例えばこういう感じのresourcesを定義したとする。
APIの例。newとeditは省いた。

```routes.rb
namespace :api, defaults: { format: :json } do
  resources :reports, shallow: true do
    resources :comments, except: [:new, :edit]
  end
end
```

定義されるルーティングはこうなる。reportsのは話に関係ないので省略

```
GET	/api/reports/:report_id/comments(.:format)	api/comments#index {:format=>:json}

POST /api/reports/:report_id/comments(.:format)	api/comments#create {:format=>:json}

GET	/api/comments/:id(.:format)	api/comments#show {:format=>:json}

PATCH	/api/comments/:id(.:format)	api/comments#update {:format=>:json}

PUT	/api/comments/:id(.:format)	api/comments#update {:format=>:json}

DELETE	/api/comments/:id(.:format)	api/comments#destroy {:format=>:json}
```

Railsではよくあるパターンだと思う。
このコメントのresourceをAngularJSの$resourceで使いたい。

$resourceでよく見かけるサンプルだとシンプルなものが多い。
こういったことは出来ないんだろうかと、AngularJSのリファレンスで[$resourceの項目](https://docs.angularjs.org/api/ngResource/service/$resource)を見てみたら、ちゃんとやり方が書いてあった。

```
url – {string} – action specific url override. The url templating is supported just like for the resource-level urls.
```

$resourceの第3引数のactionsでurlをoverrideすればよいと。

やってみた。
下記はqueryとかsaveとか自動のやつは無視してRails的なactionを定義


```Comment.coffee
'use strict'

angular.module('myApp')
.factory 'Comment', ($resource) ->
  $resource("/api/comments/:commentId", {commentId: "@id", reportId: "@report_id"}, {
    index: {method: "GET", url: "/api/reports/:reportId/comments", isArray: true}
    create: {method: "POST", url: "/api/reports/:reportId/comments"}
    update: {method: "PATCH",params: {commentId: "@id"}}
    show: { method: "GET",params: {commentId: "@id"}}
    destroy: {method: "DELETE",params: {commentId: "@id"}}
  })


```

使う例

```sample.coffee
angular.module('myApp')
.controller "SampleCtrl", ($scope, $stateParams, Comment) ->
  $scope.comments = Comment.index(reportId: $stateParams.reportId)

  $scope.comment = new Comment(report_id: $stateParams.reportId)

  $scope.save = ->
    $scope.comment.$create((comment)->
      # do something
 
```

上記の場合だと、report_idとreportIdでもにょってしまうので、サービス側でもう少しラップしてオブジェクトの引数ではなく、パラメータで渡した方が幸せになれるかもしれない。
【im.kayac.com】iPhoneやAndroidのPush通知で遊ぼう【Notify My Android】

こんにちは。
[株式会社LOUPE](http://lo-upe.com)のMKです。

スマートフォンに通知を送りたいけど、アプリ開発の経験ないし…とか思ってる皆さん。
実は、iPhone、Android共にプッシュ通知を簡単に実装できるAPIがあるんです。

今日はiPhoneやAndroidの通知で遊ぶ話をしたいと思います。

# im.kayac.com (iPhone)
まずは iPhone から。

[im.kayac.com](http://im.kayac.com/) です。

上記サイトからアカウント登録して、[App Store](https://itunes.apple.com/jp/app/im.kayac.com-free-edition/id336129317)からiPhoneへダウンロードしておきます。

iPhone Appの方でログインすれば、準備はOKかな。

詳しい使い方は公式サイトに載っているのでそちらを参照。

Ruby使いの方は、[Gemが公開されている](https://github.com/mdaisuke/imkayaccom)ので、これを使うのがオススメです。

現状、無料で使えているのでとても良いですね。

良さを感じた方はぜひ[有料版](https://itunes.apple.com/jp/app/im.kayac.com-receive-your/id336122737?mt=8)を。

# Notify My Android
お次はAndroid。

[Notify My Android](http://www.notifymyandroid.com/)、NMAです。

こちらも詳しい使い方は[ドキュメント参照](http://www.notifymyandroid.com/api.jsp)。

アカウントを作成したら、[コチラのアカウント設定](https://www.notifymyandroid.com/account.jsp)からAPI Keyを生成、コピーしておきましょう。

[Google Play](https://play.google.com/store/apps/details?id=com.usk.app.notifymyandroid)からアプリをAndroid端末にインストールしてログインした状態で、

```
 curl --data-ascii "apikey=YOUR_API_KEY" \
      --data-ascii "application=testapp" \
      --data-ascii "event=test" \
      --data-ascii "description=testdescription" \
      https://www.notifymyandroid.com/publicapi/notify
```

とかやってやると、運が良ければ通知が来るし、運が悪ければ来ません。
僕は最初の数回だけ来て、あとは来ませんでした。たぶんAPI制限。

実はこれ、アプリの右下の方にPREMIUMって書いてて、アプリ内課金すればめっちゃ来るようになります。
たしか1時間に800回まで。

im.kayac.comに比べてココが残念なんだけど、そもそもこういうWeb APIって常にサーバー起動させておかなきゃいけないんだし、しょうがないよね。

課金するとPush通知爆撃とかやって遊べるようになります。

こないだ作った[Poke to MK](http://mktakuya.net/pokes)の通知は、コレで実装してます。


# 良いPush通知ライフを！
今回紹介した2つのPush通知APIは、いずれも通知先のスマートフォンにアプリをインストールしてもらわなければなりません。

自社開発しているサービスの通知をコレで担う、というのは厳しいかもしれませんが、仲間内で遊ぶぶんにはこれで十分かと。
SQLAlchemyでSELECT後に決まった処理を差し込む


なんかSELECTして持ってきたあと、表示のためになんか加工したりだとか、そういう毎回する後処理を、SQLAlchemyだとどこに書くのかなーと思って。

今までは、SELECT系の自作メソッドに、後処理をする自作デコレータを明示的につけて対応してた。
でもこれだと、relationship とか使ってて、何か他のテーブルのついでにSELECTされた場合、後処理の自作ロジックを通ってくれない。当たり前だけど。すごください。

そうじゃなくて、どういう経緯であってもSELECTされたらすぐあとに確実に処理を実行したい。

Railsだとafter_findみたいなやつ、SQLAlchemyのイベントに似たようなのきっとあるんだろうなと思いつつ、ちょっと調べたけどやってる人見つからなくて、そのうち夏が秋になり、セミが全部死んだので、追悼の意を込め、ついにこの間重い腰を上げて公式ページ調べました。

まあ、近いのは、loadイベントなのかな？


``` test.py
class Tests(ModelsBase, Base):
    __tablename__ = 'test'
    id = Column(Integer, primary_key=True)
    name = Column(Text)
    status = Column(SmallInteger, server_default='1')
    insert_date = Column(DateTime, server_default=func.now())
    update_date = Column(DateTime, server_default=func.now(), onupdate=func.current_timestamp())

    def __repr__(self):
        return '<Tests id:{0}, name:{1}>'.format(self.id, name)


def tests_load_listener(target, context):
	# targetはTestsのインスタンス。
    # 表示用の加工とか、属性生やしたり
    if target.name:
		target.name_for_disp = target.name + '様'
    else:
		target.name_for_disp = 'ななし君'

event.listen(Tests, 'load', tests_load_listener)
```

ご多分に漏れず、selectされた件数分イベント発生するので、考えて使わないと死ぬけど、満足しました。

load のほかに良さそうなのは refresh というのもあって、これは属性に変更があるたびに呼ばれるので、これもつけておくと、こう、UPDATE直後も整ってます、みたいな感じでかっこいいかもしれない。

ほかにもイベントはいっぱいあった。
http://docs.sqlalchemy.org/en/latest/orm/events.html

おしまい。
Treasure AgentとAmazon Linux


Treasure Agent(td-agent)とAmazon Linuxの関係について，現状を簡潔にまとめておきます．

## 非サポート対象

[td-agent v1 vs. td-agent v2](http://docs.fluentd.org/articles/td-agent-v1-vs-v2)のSupported Platformsに書いてますが，現状Treasure AgentはRedHat/CentOSの5/6向けのRPMを提供しています(7も近々出します)．Amazon LinuxはRHELベースでRPMを使っているので，サポート対象に入っていると思われるかもしれませんが，実際は非サポートです．理由はいくつかあります．

* Amazon Linuxは俺俺バージョニングを採用していて，安定したサポートが難しい．$releaseverがlatestなのもつらい
  * Treasure Dataが提供している  http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh のインストールスクリプトではエラーになります
* Amazon Linuxのために特別なビルドプロセスを採用するのがコスト
* RHELとの互換性が維持されてない箇所があるが，それを調べてサポートするのが難しい

以下はfujiwaraさんのtweetですが，やはりサポート対象にするには少し懸念事項があります．

<blockquote class="twitter-tweet" lang="en"><p>Amazon Linux, 2013.09まではわりとCentOS/RHEL6のつもりでRPM入れても動いたけど2014.03からは別物と思ったほうがいいですね。glibcとかperlとか変わってるから</p>&mdash; fujiwara (@fujiwara) <a href="https://twitter.com/fujiwara/status/512154791628115968">September 17, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## Treasure Agentを使うには…

以下の3つが考えられます．

- Treasure Agentに限らず，Amazon Linux上でRHEL向けのRPMが動くかどうかの保証はないので，利用するパッケージが問題なく動くかどうかちゃんと確認してから使う
- Treasure Agentを実際に使っているAmazon Linuxで再ビルドする
  - td-agent 2: https://github.com/treasure-data/omnibus-td-agent
  - td-agent 1: https://github.com/treasure-data/td-agent
- fluentd gemを直接使う

実際の所，Treasure Dataが配布しているRPMを使ってAmazon Linuxで動かしている人たちはいるので，クリティカルな問題は現状ないとは思っていますが，心配な方はTreasure Agentを再ビルドした方が良いとは思います．


Amazon Linux側の問題が解決され，ユーザがかなり増えればサポートをする可能性はありますが，難しいというのが現状です．
【プログラマ英語】それ認証って意味じゃないですよ（厳密には）


Googleの"2段階認証"が､原文だと **'2-Step Verification'** って書かれてたので、ちょっと書いておきます。
(Googleの場合は公式で、2段階認証って読んじゃってるんでいいんですけど...)

日本語で認証って訳されてるものにこんなのがあります。

- Authentication
- Authorization
- Verification

このなかで、いわゆる" **認証** "と呼べるのは実は
Authenticationだけです。

日本だと認証とまとめてしまっている故にOAuthをログイン代わりで使ってセキュリティホール空けてる方とかもいらっしゃいますが、
http://www.sakimura.org/2012/02/1487/ (※1)


英語圏だと逆に意味の違いゆえに'authentication'と'authorization'どっち？みたいな話が盛り上がります。
http://stackoverflow.com/questions/6556522/authentication-versus-authorization

※1
記事のセキュリティホールはFacebookとかGoogleは対応してるのでログイン代わりにする場合の対応方法を各公式ドキュメントどおりに対応してたら問題ありません。

##Authentication

これがいわゆる認証ってやつです。
ユーザIDとパスワードとかを使って、本人確認をしてサービスにログインするときなどに使われます。

**”お城に入るのに門番に身元を証明して正門から入城する”** みたいなイメージですね。

たとえば、OPEN IDなんかは認証のためのものなので、この単語が適訳ですが、OAuthはAPIの使用認可に限るものなので、この単語を使うとニュアンスが微妙にずれる感じがします。

##Authorization

これを認証と訳してしまうと、誤解を生んでしまう可能性が大きいです。
正しく訳すなら「 **認可** 」が適訳かと思います。
認証してサービスにログインするわけではなく、特定の期間や特定の条件のもとで情報へのアクセスを認可するときなどにこの単語が使われます。

**”条件付きで特定期間だけ裏口の鍵を貸してもらう”** みたいなイメージでしょうか？


例えば
ログイン処理を通さずにサービスやユーザ情報を取得したりするAPIを使わせたいと考えたとします。
でも、何もせずにAPIを使わせたのでは、それが誰で、どのくらいの権限を与えていいものなのかわかりません。

###ちなみに
---

OAuthは'authentication'より'authorization'として扱うのが正しいとされてます。
なぜなら、APIの使用を許可するためのユーザ判定処理だからです。
(中にはOAuthが通った時にログイン処理も走ってるサービスもいるんでそれもダメなんですけどね)
ですが、認証処理としても世間一般で使われているため、先ほどの問題がOAuthのドラフトに記載されてます。

https://tools.ietf.org/html/draft-ietf-oauth-v2-31

各サービスもこれの対応を行ってます。(開発者が従ってるかは別として...)

####Facebook

Signed Requestと呼ばれる機構を用意していて、API認可だけでなくログイン処理としても使用したい場合は、これを使用することになってます。
(破って罰則受けたって話は聞いたことないですけど)
最近ではAnonimous Login処理とかもリリースされましたね。

####Google

OPENID+OAuth Hybrid Protocolを使うことになってます。
Open IDで認証を行い、OAuthでAPIの利用認可を行うというものです。
(AuthenticationとAuthorizationの違いを説明するときによく使います。)

####Twitter

もともとOAuth1.0で特にセキュリティの問題で騒がれてるのは、OAuth2.0なのであまり対応らしいことはしてないみたいです。
ただ、現在ではOAuth2.0でもAPI利用ができるようになっており、こちらはログイン認証の処理として使ってはいけないことになってます。

####日本のサービス

開発者向けドキュメントを見たところ、ほとんどのサービスで対応されてる形跡がありません。
だから、日本のサービス使いたくないんだよ (-ε-)ﾌﾞｰﾌﾞｰ

##Verification

これは、ユーザ側の立場からしてみれば、認証という意識で問題無いですが、正確には「 **検証** 」といったような意味になります。
どちらかって言うとサービス提供側がその人が今ログイン使用としてるユーザと本当に同じ人物なのか確証を持つためってニュアンスがあります。
(個人的にはログインっていうか、セキュリティチェックみたいな感じを受けます。)


派生語をみてもらうとわかりやすいかも。

| 単語 | 意味 ・ 注釈 |
|---|---|
| verify | 検証する。ベリファイ CD焼いたあとのベリファイがこれ。SSLのVerisignのVeriもここから |
| validation | 確証。 フォーム入力した後とかに文字が正しくチェックするアレ |

Googleは **'2-Step Verification'** なので、 「 **2段階検証** 」のほうが正しいんじゃないかなって思います。でもVerificationって単語使うなんてGoogleっぽい。
ユーザよりシステム側向いてる気がする。

Githubは **'2-factor Authentication'** なので、「 **2要素認証** 」で正しいと思います。
しっかりユーザ目線な感じ。
C言語でHello worldプログラムの作り方

## C言語でのHello worldプログラムの作り方

お好きなエディタで、下記のhello.cファイルを作成する。

```c:hello.c
#include <stdio.h>

int main(int argc, char *args[])
{
    printf("Hello, world!\n");
    return 0;
}
```

下記のようにコンパイルする。

```bash:shell
$ gcc -o hello hello.c
$ 
```

実行する。

```bash:shell
$ ./hello
Hello, world!
$ 
```

C言語でHello worldプログラムが書けました！
Cocos2d-JS iOS8のSafari上でWebGLを使って動かす

## きっかけ
[秋葉原Cocos2d-JSもくもく勉強会#12](http://connpass.com/event/8650/)のネタ
iOS8のSafariでCocos2d-JSのアプリ表示したらそのままWebGL対応されるかと思ったら動かなくて、設定やら修正やらが必要だったのでメモ。

## 試したバージョン
cocos2d-js-v3.0


## 強制的にWebGLで動かす
project.jsonのrenderModeを2に設定する。
このrenderModeというプロパティの設定は、以下の様になっている。
0=自動判定、1=Canvas使用、2=WebGL使用

```
{
    "project_type": "javascript",

    "debugMode" : 1,
    "showFPS" : true,
    "frameRate" : 60,
    "id" : "gameCanvas",
    "renderMode" : 2,
    "engineDir":"frameworks/cocos2d-html5",

    "modules" : ["cocos2d"],

    "jsList" : [
        "src/resource.js",
        "src/app.js"
    ]
}
```

## 自動判定を効くようにする

renderModeを2に設定してしまうと、iOS7のSafariなど、WebGLに対応していないブラウザでは、アプリが表示できなくなってしまう。
renderModeに0にもどし、自動判定のロジックを修正することで、iOS8ならWebGLを使用し、iOS7以前ならWebGLを使わずに動作させることができる。

・renderModeを0に戻す。
・プロジェクトのframeworks/cocos2d-html5/CCBoot.jsの1521行目あたりを以下の様に修正する。

```
//修正前
if (userRenderMode === 1 
|| (userRenderMode === 0 && (sys.isMobile || notInWhiteList)) 
|| (location.origin == "file://")) {
```
```
//修正後
if (userRenderMode === 1 
|| (userRenderMode === 0 && 
(!document.createElement( 'canvas' ).getContext( 'experimental-webgl' ))) 
|| (location.origin == "file://")) {
```

修正内容としては、元のソースがモバイル端末であればWebGLを使用しない判定になっていた部分をWebGLが使用可能かどうかの判定に置き換えている。

## 結果
パーティクルのデモで比較するとWebGLにより描画のパフォーマンスが大幅に改善されていることが確認できる。左がiOS8で60fpsでている。右がiOS7で5fps程度しか出ていない。
![2014-09-20 16.08.54.jpg](https://qiita-image-store.s3.amazonaws.com/0/691/db20fe7a-3b12-531b-08af-9cc3d4461005.jpeg)

```
//試したサンプル
var HelloWorldLayer = cc.LayerColor.extend({
    sprite:null,
    ctor:function () {
        this._super();
        var color = cc.color(128,128,128);
        this.setColor(color);

        var size = cc.winSize;

        this._emitter = new cc.ParticleFire();
        this.addChild(this._emitter, 10);

        //画像はcocos2d-jsのsamples/js-tests/resのものを使用
        this._emitter.texture = cc.textureCache.addImage("res/fire.png");

        this._emitter.x = cc.winSize.width / 2;
        this._emitter.y = cc.winSize.height / 2;

        return true;
    }
});

var HelloWorldScene = cc.Scene.extend({
    onEnter:function () {
        this._super();
        var layer = new HelloWorldLayer();
        this.addChild(layer);
    }
});
```


## まとめ
今回は自動判定で行っているが実際の開発では、WebGLに対応していたらパーティクルを使用し、対応していなければオフにするなどの工夫が必要になりそう。

WebGLが使用できるようになったことで、Cocos2d-JSをスマートフォンのブラウザ上で動かす際にネックになっていたパフォーマンス部分がかなり解消される。

Cocos2d-JSをCocos2d-x上ではなくブラウザ上で動かすメリットは、ブラウザの機能（DOM、AJAX、それらを使用した豊富なライブラリ群）を利用しやすい点。ネイティブアプリの機能との連携が必要な場合は、PhoneGapなどと組み合わせてもよいかもしれない。（WebViewで動くかまだ試してないけど）

現状だとCocos2d-JSは、UnityやCocos2d-xに比べてマイナーな感じがするが、WebGLの普及につれて、注目度があがっていくかもしれない。
Pepper を動かしてみる - 開発ツールインストール編

こんにちは。
本日、渋谷にて アルデバラン社開発・Softbankグループが販売する、感情認識できる人型ロボット Pepper (ペッパー）の開発方法がレクチャーされています。

ここでは、まだ一般公開はされていないSDKをいち早く入手しましたので、それを使って、最初の一歩的なところを見ていきたいと思います。

### Pepper とは
Pepperとは | ロボット | ソフトバンク @SoftBankさんから
http://www.softbank.jp/robot/products/

## GUI な 開発ツールをインストール
#### OSに応じたファイルを選択
今回は、会場で配布されたUSBメモリからインストールします。ネット上でもインストールする環境が今後整備されていくとおいますので、今後はサイト上から選択する形になりかと思います。
ここでは、Macをつかっていますので、<tt>choregraphe-suite-2.0.5.3-mac64-setup.dmg</tt> を実行します。

![スクリーンショット 2014-09-20 16.20.49.png](https://qiita-image-store.s3.amazonaws.com/0/46100/f3bec725-7e6f-b1c6-fa98-23f454fe310d.png "スクリーンショット 2014-09-20 16.20.49.png")

#### インストール中
適宜インストール先フォルダを選択すると、インストールが始まります。

![スクリーンショット 2014-09-20 16.20.37.png](https://qiita-image-store.s3.amazonaws.com/0/46100/8232bd9a-2707-6146-c221-85e2a83e3717.png "スクリーンショット 2014-09-20 16.20.37.png")

#### インストール完了！

![スクリーンショット 2014-09-20 16.26.43.png](https://qiita-image-store.s3.amazonaws.com/0/46100/5a0c91ac-b318-c8d6-2635-3eb12b60ccf9.png "スクリーンショット 2014-09-20 16.26.43.png")

#### ライセンスキー入力
今回は、なぜかライセンスキーを入力しても反応がありませんでしたので、試用モードで起動します。もしかすると、統合ツールインストーラ以外から単体開発キットを起動していたためかもしれません。追って解決方法がわかった段階で追記します。

![スクリーンショット 2014-09-20 16.27.37.png](https://qiita-image-store.s3.amazonaws.com/0/46100/2b148b73-228a-4139-b46b-0b9951eca166.png "スクリーンショット 2014-09-20 16.27.37.png")

#### 起動！
おつかれさまでした！

![スクリーンショット 2014-09-20 16.31.11.png](https://qiita-image-store.s3.amazonaws.com/0/46100/9bbfe946-46ab-d4b2-cc6a-d5d00d0f30cd.png "スクリーンショット 2014-09-20 16.31.11.png")
![スクリーンショット 2014-09-20 16.30.39.png](https://qiita-image-store.s3.amazonaws.com/0/46100/3ef49ca9-2bec-3d25-3a61-905171a0d42c.png "スクリーンショット 2014-09-20 16.30.39.png")
OS X targets using Swift cannot be built against an SDK older than 10.10, but the effective SDK is 10.9.

======================

## 問題

Xcode6の正式版がAppStoreでリリースされたのでアップデートしたのですが、OSX用に書いていたSwiftコードがコンパイルできなくなってしまいました。

どうやらv6.0.1のXcodeではyosemite v10.10のSDKが含まれていないようです。


```Error
OS X targets using Swift cannot be built against an SDK older than 10.10, but the effective SDK is 10.9.
```

## 解決策

以下のリンクよりXcode6.1Betaをダウンロードします。

https://developer.apple.com/devcenter/download.action?path=/Developer_Tools/xcode_6.1_beta_r4c8zg/xcode_6.1_beta.dmg

ダウンロードしたXcode6.1Betaのdmgをマウントすると、MacOSX10.10.sdkのフォルダが以下のパスにあります。

```
/Volumes/Xcode/Xcode-Beta.app/Contents/Developer/Platforms/Developer/SDKs/
```

このMacOSX10.10.sdkのフォルダを、以下のパスにコピーします。

```
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
```



## 参考

- [OS X TARGETS USING SWIFT CANNOT BE BUILT AGAINST AN SDK OLDER THAN 10.10, BUT THE EFFECTIVE SDK IS 10.9.](http://www.cagylogic.com/archives/2014/09/10003624.php)
- [How to fix not being able to compile OSX based swift projects in Xcode 6 GM (10.9).](http://www.reddit.com/r/swift/comments/2fy3nt/how_to_fix_not_being_able_to_compile_osx_based/)
RubyでExcelファイルをCSVの様に読み込む


集計したいデータがExcel形式で提供されることがある。
数が少なければExcelやLibreOfficeなどでCSVに変換してから扱えばよいが、ファイル数が多いと面倒。

Excelファイルの読み込みだけで書き込みがない、しかもRubyで扱うなら、[excel2csv-ruby](https://github.com/anjlab/excel2csv-ruby) が便利。
ExcelファイルをCSVのように読み込むことができる。

インストール
----

gemで簡単にインストールできる

```
gem install excel2csv
```

もちろん、次の様にGemfileを作って、Bundlerを使っても良い。

```
gem 'excel2csv'
```

基本的な使い方
-----

次の様なExcelファイルを読み込むには

![sample_xlsx.png](https://qiita-image-store.s3.amazonaws.com/0/32533/c98edba7-d3bc-0172-8181-cc2cf86871d6.png "sample_xlsx.png")

次のようにforeachメソッドで行ごとに読むことができる。

```ruby
require 'excel2csv'

def read_excel(filename)
  Excel2CSV.foreach(filename) do |row|
    p row
  end
end

read_excel 'sample.xlsx'
```

実行結果は次の通り。

```
["cell-A1", "cell-B1", "cell-C1", "cell-D1"]
["cell-A2", "cell-B2", "cell-C2", "cell-D2"]
["cell-A3", "cell-B3", "cell-C3", "cell-D3"]
```

結合したセルや複数シートも読める
------
次の様にセルを結合したファイルも読み込める。

![sample2_xlsx.png](https://qiita-image-store.s3.amazonaws.com/0/32533/56889567-7778-240b-d3ef-b84613981013.png "sample2_xlsx.png")

結合されたセルは左上のセルに値が入っているものとして扱われ、実行した結果は次の様になる。

```
["cell-A1", "cell-B1", nil,       nil]
["cell-A2", "cell-B2", "cell-C2", "cell-D2"]
["cell-A3", nil,       "cell-C3", "cell-D3"]
[nil,       nil,       "cell-C4", "cell-D4"]
```

複数のシートがある場合、デフォルトでは1シート目を読むが、foreach メソッドに sheet オプションで指定することで2シート目以降も読むことができる。
次の例は 2シート目を読みこむ例。

```ruby
require 'excel2csv'

def read_excel(filename)
  Excel2CSV.foreach(filename, sheet:1) do |row|
    p row
  end
end

read_excel 'sample.xlsx'
```

また、例では xlsx 形式のファイルを使っているが、xls ファイルも問題なく読み込める。
Knockoutjs context debugger

最近Knockout.jsを使っているのだけど、data-bindを書いた要素のコンテキストがよくわからなくなることがある。で、console.logとかを仕込んで確認とかしていたのだけどなかなかに面倒なので何か良い方法はないかなーと探していたら良いChrome拡張があった。

Knockoutjs context debugger

https://chrome.google.com/webstore/detail/knockoutjs-context-debugg/oddcpmchholgcjgjdnfjmildmlielhof

Knockout.jsを読み込んでいるページで、DevToolsを表示してdata-bindが書いてある要素（もしくはVirtualElement）を選択した状態でStylesとかComputedタブがあるところにKnockout contextというタブが追加されているのでそれを選択すると、データが見れる。

observableのプロパティは展開された値が、observableArrayのものは配列として中身が見れるようになってるっぽい。あとは他に\$dataとか\$indexとか\$parentsとかいろいろなコンテキストがそのまま見れるのでとても捗る。

以下のスクリーンショットは http://codepen.io/sasaplus1/debug/iJaew で試してみたやつ。

![Knockoutjs context debugger](https://qiita-image-store.s3.amazonaws.com/0/5538/f2a0d7d8-fe55-5043-263a-d6a1523e70e1.png)
これから来るか！？ Volt (Reactive Web Application Framework for Ruby)


## 追記 (2014/11/29)

最近、この記事をストックしてくれる方が増えて嬉しいのですが、
結構昔に書いたやつなので内容が微妙に古いです。

特にチュートリアルに関しては今は別物に変わっているので、
こちらの記事を参照し公式のドキュメントを見ていただければと思います。

Volt チュートリアル
http://qiita.com/5t111111/items/e1c207d780b7af1aef8c

## はじめに

最近、VoltというRubyのReactive Webアプリケーションフレームワークについて目にすることが増えた気がします。

https://github.com/voltrb/volt

## 特徴

* バックエンド、フロントエンド共にRubyでコードを記述する (フロントエンドでは[Opal](http://opalrb.org)を使ってJavaScriptに変換する)
* ユーザーの操作に応じて、自動的にDOMを更新する
* クライアント/サーバー間の同期はHTTPで通信するのではなく、クライアント/サーバー間の永続的なコネクションを使用する。なので、あるクライアントでデータが更新されたら、データベースと他のlistening中のクライアントにも反映される

Voltについてのコメントを眺めていると、「[Meteor](https://www.meteor.com)に似ている」という指摘が多いです。私はMeteorを使ったことがないのですが、そのRuby版のようなもの想像してもらうのが手っ取り早く分かり易いかもしれません。

## Voltプロジェクトの作成

READMEにある手順にしたがって、Voltプロジェクトを作成してみましょう。
Bundlerを使う場合には適宜読み替えてください。

### Voltのインストール

```text
gem install volt
```

### 新しいVoltプロジェクトの作成

```text
volt new project_name
```

これで、基本的なプロジェクトがセットアップされます。

### サーバーの起動

```text
volt server
```

## アプリケーションの開発

Voltのプロジェクトを作成すると、アプリケーションのひな形が生成されます。

が、それだけでは当然、何をしていいのかさっぱり分かりません。

簡単な概要を説明するデモ動画とデモアプリケーションが用意されているので、Readmeを読みながらまずはそれらを見てみると良いでしょう。

(まだここで自分で詳細手順を解説できるほどに詳しく見てません・・・)

動画は当然英語ですが、修正や作成するべきファイルは順を追って画面上で説明されるので、英語なんてさっぱり分かりませんよ、という場合でも画面を見つつ、画面と同じように手を加えていけば順を追って感じをつかめると思います。

### デモ動画

 - [Volt Todoアプリケーションの例](https://www.youtube.com/watch?v=6ZIvs0oKnYs)
 - [Voltでブログを構築する](https://www.youtube.com/watch?v=c478sMlhx1o)
 - [Voltでのリアクティブな値について](https://www.youtube.com/watch?v=yZIQ-2irY-Q)


### デモアプリケーション

 - https://github.com/voltrb/todos3
 - https://github.com/voltrb/blog
 - https://github.com/voltrb/contactsdemo


## おわり

ほんとにただの紹介だけになってしまいましたが、個人的にはVoltプロジェクトにはめちゃ期待してるので、多くの人が知ってくれてDiveすることでどんどんよくなると嬉しいなぁと思ってます。
それによってOpalも更に活性化するともう最高ですね。

Readmeの和訳だけはちょいちょい進めていきたいです。
https://github.com/5t111111/volt/blob/ja-translation/Readme.ja.md
Dartにおける非同期プログラミングとエラーハンドリング

**この記事はバージョン1.6時点の物です**

# Dartにおける非同期プログラミング
## Dartはシングルスレッド
DartはWebアプリ開発のために設計された言語なのでシングルスレッドで動作します。Dartの非同期プログラミングはシングルスレッドでのコールバックとハンドリングによって実現されます。

## コールバック地獄
一般にコールバックは次のような入れ子地獄を容易に引き起こします。

```dart
asyncA((a) {
  asyncAToB(a, (b) {
    asyncBToC(b, (c) {
      asyncSetC(c, () {
        print("done");
      });
    });
  });
});
```

これはDartのように関数がオブジェクトである言語であればハンドラーに名前をつけることによって幾分か可読性は上がります。

```dart
handleSetC() => print("done"); 
handleBToC(c) => asyncDone(c, handleSetC);
handleAToB(b) => asyncBToC(b, handleBToC);
handleA(a) => asyncAToB(a, handleAToB);
asyncA(handleA);
```

しかし入れ子が無くなっても処理の流れは読みにくく、簡単とはいえません。

## Futureによる非同期プログラミング
`dart:async`パッケージが提供する`Future`は上記のような非同期プログラミングを簡潔に記述できるようにしてくれます。例えば上のコールバックは`asyncA`が`Future`を返すようにすると次のように書き換えられます。

```dart
asyncA() // returns a Future
  .then(asyncAToB)
  .then(asyncBToC)
  .then(asyncSetC)
  .then((_) => print("done");
```

`Future`はEcmaScriptでいうPromiseであり、コールバック・ハンドリングによる非同期プログラミングを簡単にしてくれます。

## エラーハンドリングとZone

`Future`の基本は`then`と`catchError`です。非同期処理が完了した時、値かエラーのどちらかが必ず返されます。値が返ってきた場合は`then`、エラーが返ってきた場合は`catchError`がコールバックされます。`then`の内部でエラーが投げられた場合も`catchError`にジャンプします。

```dart
void main() {
  var future = new Future(() => 1);
  future.then((_) => throw "error")
  .catchError((e) => print(e));
}
```

```:stdout
error
```

しかし`Future`が入れ子になっていたらどうなるでしょうか？

```dart
void main() {
  var future = new Future(() => 1);

  future.then((_) {
    var innerFuture = new Future(() {
      throw "innerError";
    });
    throw "error";
  })
  .catchError((e) => print(e));
}
```

```:stdout
error
Unhandled exception:
Uncaught Error: innerError
Stack Trace:
...
```

これを実行すると、`"innerError"`は`print`されず、ハンドリングされていないことがわかります。`Future`の非同期処理はそれぞれ固有の **Zone** という範囲内で行われます。`catchError`はその`Future`が属しているZoneの内部で発生したエラーしかハンドルすることができません。ですので、`"innerError"`をハンドルするには次のように書く必要があります。

```dart
void main() {
  var future = new Future(() => 1);

  future.then((_) {
    var innerFuture = new Future(() {
      throw "innerError";
    }).catchError((e) => print(e));
    throw "error";
  })
  .catchError((e) => print(e));
}
```

しかし、`runZoned`を使うと、入れ子になった`Future`も全て同じZoneで実行させることができます。`runZoned`の第一引数に渡した関数内で発生したエラーは全て`onError`引数でハンドルされます。

```dart
void main() {
  var future = new Future(() => 1);

  runZoned(() {
    future.then((_) {
      var innerFuture = new Future(() {
        throw "innerError";
      });
      throw "error";
    });
  }, onError: (e) => print(e)); 
}
```

```:stdout
error
innerError
```

このようにしてDartでは非同期プログラミングでもtry-catchのようにエラーハンドリングすることができます。
CentOSでユーザーの一覧を確認する

CentOSでユーザ一覧を確認したいことあります。

# ユーザ一覧を表示
catコマンドで/etc/passwdを見るとユーザーの一覧を表示できます。

```bash:ユーザー一覧を表示
cat /etc/passwd

略

pugiemonn:x:500:500::/home/pugiemonn:/bin/bash
```

pugiemonnユーザを確認できました。

## おまけ：ユーザー一覧から名前だけを表示
ユーザー一覧の中から、ユーザー名だけを表示する方法について、コメントを貰いました。

```bash:ユーザー一覧から名前だけを表示
cat /etc/passwd|sed -e 's/:.*//g'
```
名前だけが表示されます。

# 関連：グループ一覧の表示
CentOSでグループの一覧を確認する
http://qiita.com/pugiemonn/items/e5bfdf25a500a0376a57
[Codeigniter]Active Recodeで役立つコマンド

#Active Recodeで役立つコマンド
Active RecodeはDBに依存せずSQLを記載できるため、シンプルなSQLを記載するだけであれば非常に便利です。
その中でも、いつも忘れてしまう役立つコマンドがあるのでメモします。

##insertのID取得
PKをauto_incrementしている場合、insertした後にPKを取得できます。

```php
//empテーブルにinsert
$this->db->insert('emp', array('name' => '山田太郎'));
//insert直後に以下のコマンドを発行するとIDを返してくれる
$res = $this->db->insert_id();
```

これは結構使いますね。

##insert,updateの件数
「書き込み」タイプのクエリ (insert、update、など) が実行されたとき、処理された行の数を取得します。

```php
$res = $this->db->affected_rows()
```

1点注意点があり、deleteは0件を返してしまう仕様があります。


##SQLの確認
Active RecordのオブジェクトにセットしたSQLを確認できます。
但し、getまで実施した後でないと取得できません

###取得できるパターン
```php
$this->db->select('*');
$this->db->from('emp');
$this->db->get();
$this->db->last_query();
// "SELECT * FROM (`emp`)"が返る
```

###取得できないパターン
```php
$this->db->select('*');
$this->db->from('emp');
$this->db->last_query();
// bool(false)が返る
```

他にもあるのですが、必要に応じて随時メモしていきます。
iOS8 で Game Center が使えなくなった時の対処方法

アプリの開発時に、iOS8 で Game Center を使おうとしたら、以下のエラーがログに出力されてサンドボックスによる動作確認ができなくなってしましいました。

> Failed to authenticate local user The requested operation could not be completed because this application is not recognized by Game Centre.

対処方法は、
[設定]-[Game Center]で[サンドボックス]をオン
です。
ruby-buildを最新にしてrbenvでRuby2.1.3をインストールする


### ruby-buildを最新にする

環境：Ubuntu、MacOSX

```
$ cd ~/.rbenv/plugins/ruby-build
$ git pull origin master
```


### rbenvでRuby2.1.3をインストール

```
$ rbenv install 2.1.3
$ rbenv global 2.1.3
$ rbenv rehash
$ ruby -v
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]
```
プログラムメモ[2014/09/20]

# SplitViewController

UISplitViewController使った方が，案外いい感じにUIまとめれそうなので，
UISplitViewControllerについて調べた．

## 参考URL
[UISplitViewController -Google検索-](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=SplitViewController%20%E3%82%B3%E3%83%BC%E3%83%89)

[[Objective-C] UISplitViewControllerをコードから生成してiPad対応するまとめ - Qiita](http://qiita.com/edo_m18/items/b133d94bde28fe5bcc5a)

[[Objective-C] UISplitViewControllerをコードから生成してiPad対応するまとめ](https://gist.github.com/edom18/229fef924856acd6e192)

[[XCODE] iPadのSplitViewの作り方](http://www.yoheim.net/blog.php?q=20120528)

# AssetLibrary&CoreGraphics
NASAccessFrameworkで，画像を選び，
それを表示させるためには，AssetLibraryが必要かなって思ってるので，
一応調べた．

## 参考URL

[iOS 4の新機能13選＆AssetsLibraryで作る画像ビューア (2/4)](http://www.atmarkit.co.jp/ait/articles/1104/20/news141_2.html)
[Core Graphicsで作るiPad向けお絵描きアプリの基礎](http://www.atmarkit.co.jp/ait/articles/1012/15/news118_3.html)
iOSメモ - unwindSegueで閉じて、TableViewに追加する

FirstTableVC - navigationVC - editVC

```objc


-(IBAction)backToList:(UIStoryboardSegue *)unwindSegue
{
    if([[unwindSegue identifier] isEqualToString:@"EditDone"]){
        TableInputViewController *editVC = unwindSegue.sourceViewController;
        if(self.editingIndexPath){//NSIndexPath editingIndexPath
            //self.navigationController storyboard
        }else{
            //rowの最上部に追加している
            NSIndexPath *indexPathToInsert = [NSIndexPath indexPathForRow:0 inSection:0];
            //editVCとは、遷移先。そこのUITextFieldから取ってきてる
            //itemsとは、FirstTableVCでtableに表示させるNSMutableArray
            [items insertObject:editVC.textFieldInput.text atIndex:indexPathToInsert.row];
            [self.tableView insertRowsAtIndexPaths:@[indexPathToInsert] withRowAnimation:UITableViewRowAnimationFade];
            NSLog(@"追加したよ");
        }
    }
}
```
modern.IE を Vagrant で使う

Mitchell さんの Tweet で [modern.IE](https://modern.ie/) の Vagrant 用イメージが公開されていることを知ったので試してみました。

<blockquote class="twitter-tweet" lang="ja"><p>Modern.ie is now beta testing Vagrant images as a choice for running IE test environments! <a href="http://t.co/c8j8G8V9X5">http://t.co/c8j8G8V9X5</a></p>&mdash; Mitchell Hashimoto (@mitchellh) <a href="https://twitter.com/mitchellh/status/513081278837448704">2014, 9月 19</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Modern.IE については「 [無償で Web ページの検証ができる modern.IE. とは? - monoe&#39;s blog - Site Home - MSDN Blogs
</title></head>](http://blogs.msdn.com/b/osamum/archive/2014/01/14/web-modern-ie.aspx) 」で詳しく説明されていました。

Vagrant 用で対応している仮想環境は今のところ VirtualBox だけの様ですです。Vagrant 用でなければもっと幅広く対応されています (Hyper-V, VMware, Virtual PC, Parallels など)。

```
$ vagrant init xp-ie6 http://aka.ms/vagrant-xp-ie6
$ vagrant up
```

ダウンロードに時間がかかるのでしばらく待ち時間がありますが、すでに VirtualBox で Vagrant を使っていればたったこれだけで IE の実行環境が立ち上げられます。便利ですね。

イメージファイルは次のものがあるようです。

- XP with IE6
- XP with IE8
- Vista with IE7
- Windows 7 with IE8
- Windows 7 with IE9
- Windows 7 with IE10
- Windows 7 with IE11
- Windows 8 with IE10
- Windows 8 with IE11 (リンク先が Win7 IE11 になってる)

ライセンスへの同意があるのでリンクはこちらにしておきます。
http://blog.syntaxc4.net/post/2014/09/03/windows-boxes-for-vagrant-courtesy-of-modern-ie.aspx

~/.vagrant.d/boxes/ 内のサイズは XP-IE6 が 701M で Win7-IE11 が 3.5GB でした。

SSH 接続はできないので Vagrantfile に `config.vm.boot_timeout` を小さい値で設定しましょう。

そして headless モードでは不便なので、コメントアウトされている gui 設定アンコメントしましょう。

```
config.vm.provider "virtualbox" do |vb|
  vb.gui = true
end
```

ぶっちゃけ、ゲストが Windows の場合 vagrant ではインポートだけやって VirtualBox マネージャで起動や停止したほうが良いかもしれず。
Vagrant 用の box ファイルじゃない VirtualBox 用の仮想イメージも提供されてます。
https://modern.ie/ja-jp/virtualization-tools#downloads
renderのpartialで1が返る？

Mojolicious + DBI のサンプルを探していて
[A WebSocket Mojolicious/DBI Example | Joel Berger [blogs.perl.org]](http://blogs.perl.org/users/joel_berger/2012/10/a-websocket-mojoliciousdbi-example.html)
というのを見つけ、いざコピペして実行したところ、

| Name | Age |
|:-----|:----|
|A     |20   |

になって欲しいところが

| Name | Age |
|:-----|:----|
|1     |     | 

こうなってしまいました。
？？？
該当ソースはこちら

```pl
# setup websocket message handler
websocket '/insert' => sub {
  my $self = shift;
  $self->on( message => sub {
    my ($ws, $message) = @_;

    my $row = $json->decode($message);
    $self->insert(@$row);

    my $html = $ws->render( 'table', rows => [$row], partial => 1 );
    $ws->send($json->encode({row => $html}));
  });
};
```

どうやら`$ws->render`の返り値にはテンプレート描画済みのHTMLが入って欲しいのに"1"になっている様子。

[Mojoliciousでrender()のpartialが効かなくなった！｜ノウハウブログ｜カンタローCGI](http://kantaro-cgi.com/blog/mojolicious/not_work_render_partial.html)
これか！

```pl
my $html = $ws->render_to_string( 'table', rows => [$row] );
```

で正しく動きましたとさ。めでたしめでたし！

# 参考
Mojolicious::Guides::Rendering · yuki-kimoto/mojolicious-guides-japanese Wiki · GitHub
https://github.com/yuki-kimoto/mojolicious-guides-japanese/wiki/Mojolicious::Guides::Rendering
Mahoutでレコメンドを動かすまで（その２）

[part1]:http://qiita.com/jjking/items/86dd8247cf40e03b3128
[その１はこちら][part1]

### 嗜好をもとにしたレコメンドをする
Mahoutにはrecommenditembasedというレコメンドを計算する機能を持っており、Amazonのように他の人の嗜好をもとにしたレコメンドを計算することができます。
今回はそれに挑戦してみたいと思います。

### データを準備する
まずレコメンドの元となる各ユーザーの嗜好を表すデータを準備します。これはエクセルかテキストエディタで以下のような3列の数値データを用意します。書式は以下のようになっておりすべて数値で表します。

- 1列目 - おすすめしている人のID  
- 2列目 - おすすめしているアイテムのID
- 3列目 - 嗜好の度合い（いくつでもいい？）

例えば次のような場合、1行目はユーザーIDが1の人が、アイテム番号100を気に入っており、その度合いが5を表しています。

```recommend.txt
1,100,5
1,200,3
1,300,3
2,100,5
2,200,5
2,400,3
2,900,4
3,200,4
3,300,5
3,700,4
4,200,5
4,400,4
4,600,5
4,900,5
5,100,5
5,200,3
5,400,4
5,500,6
5,700,5
6,100,3
6,200,4
6,400,2
6,700,3
7,100,4
7,700,5
7,800,5
7,900,5
```

列はどれも数値にする必要があります。現状持っているデータのユーザーIDなどが文字列の場合は変換テーブルを作って数値を割り振るような対応になるんでしょうね。

### レコメンドを計算する

データが準備できたら以下のコマンドを使って早速計算をしてみます。

```
bin/mahout recommenditembased -i recommend.txt -o recommend_out -s SIMILARITY_PEARSON_CORRELATION
```

ここの環境だと計算に10秒近くかかりました。

結果は引数で指定したrecommend_outフォルダのファイルpart-r-00000に記録されます。
今回のサンプルの結果だと以下のようになります。各行がそれぞれのユーザーへのおすすめを示しており、1行目はユーザーIDが2の人へのおすすめはアイテム番号700で、スコアが3.9172406というのを示しているようです。

```
vmplanet@ubuntu:~/mahout-distribution-0.9$ cat recommend_out/part-r-00000
2     [700:3.9172406]
4     [700:4.19286]
5     [900:4.375]
6     [900:2.375]
7     [400:4.6099067]
```

数字だけ見ていると合っているのかはピンときませんが、一応レコメンドが計算できたようです。

### 元データが少ないと結果が0バイトになる
元データが少なすぎると出力が空になってしまうようです。最初はオプションなどの使い方の問題かと思いましたが元データを増やしたらレコメンドが得られるようになりました。

```
vmplanet@ubuntu:~/mahout-distribution-0.9$ ls -l recommend_out/
合計 4
-rwxrwxrwx 1 vmplanet vmplanet  0 2014-09-18 20:33 part-r-00000
-rwxrwxrwx 1 vmplanet vmplanet  0 2014-09-18 20:33 _SUCCE
```

正確にはわかりませんが、元データが20行くらいになると結果が出てくるようです。

### 元データの最後に改行があるとエラー
元データのCSVファイルの最後に改行があるとエラーになるようです。
その場合は以下のエラーが発生するので、そのときは元データファイルの見直しをするとよいと思います。

```
14/09/18 20:43:26 WARN mapred.LocalJobRunner: job_local1173485433_0001
java.lang.Exception: java.lang.ArrayIndexOutOfBoundsException: 1
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:354)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
at org.apache.mahout.cf.taste.hadoop.item.ItemIDIndexMapper.map(ItemIDIndexMapper.java:50)
```

### 出力フォルダとtempフォルダがあるとエラー

データを変更して再度計算しようと思いコマンドを再実行したところ以下のエラーとなりました。

```
14/09/18 20:35:35 ERROR security.UserGroupInformation: PriviledgedActionException as:vmplanet cause:org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory temp/preparePreferenceMatrix/itemIDIndex already exists
```

出力先で指定したフォルダと、計算途中でできたtempフォルダがあるとエラーになるので、実行前には以下のコマンドできれいにしてから実行するといいでしょう。

```
rm -rf temp/ recommend_out/
```
ターミナルでMySQLを見ると大抵、文字化けしてるから。治す。けどいまいち分からない。


**下記の設定で文字化けは解消されたのですが、いまいち理解ができませんでした。(;£;)**

## 概要

たいていターミナルからMySQLを覗きますと、文字化けをしています。なので、その辺を勉強したいと思いました。
環境としては、Macで。Vagrantの中のMySQLです。


## MySQLの中で調べる。

Vagrant内でMySQLにログインしまして、showなんちゃらと打ちます。

```mysql:
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

最初はこんな風になっております。あー。ほとんどlatin1だよ。なんだよlatin1って。

そして、いろなところに書いてある情報をもとに、「/var/my.cnf」を弄って、なんとかしようと思いました。


## my.cnfの設定

まずは、以下のように、一箇所だけ追加してみます。

```vim:/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

# この下が追加部分
[client]
default-character-set = utf8
```

そうすると、次のようになりました。

```mysql

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

次の２つは変更されませんでした。

* character_set_database
* character_set_server

**実は、この状態でターミナルからの文字化けは、僕の環境では文字化けは解消されました。**

めでたし、めでたし。

## でも全然「めでたし、めでたし」じゃない。

* 何をやってもdatabaseとserverは変わらない。(*)
* global variableってなに？
* そもそも、これらの変数がどこに作用しているのか不明。

という状態ですので、**全体的に悲しい気持ちでございます。**

(*)これは、例えば以下のような記述です。

```vim:/etc/my.cnf
[mysqld]
default-character-set = utf8
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

[mysql]
default-character-set = utf8

[mysqldump]
default-character-set = utf8
```

どなたかご助言など、頂けますと本当に嬉しいです。

宜しくお願い致します。ありがとうございました。引き続き勉強します。
keychainが覚えたgithubのパスワードを消す


httpsでgithubを使う場合keychainにパスワードを記憶させることができる。この機能は

```
[credential]
    helper = osxkeychain
```
を~/.gitconfigなどのコンフィグファイルに書くことで有効になる（らしい）
そして覚えさせたパスワードを消すにはkeychain上で消すか、以下を実行する。

```
echo "host=github.com\nprotocol=https\n" | git credential-osxkeychain erase
```

ときに、[credential]がどのコンフィグにもないのにosxkeychainが効いてるのは何でですか。
pod update する度にpbxproj ファイルの形式が変わってしまう君へ

# 前提
* Cocoa framework は、property list のformat にold-style(ASCII) とXML を許容している
* XCode が生成するpbxproj ファイルは、old-style で書きだされる
* CocoaPods が生成するpbxproj ファイルは、XML で書き出される
    * old-style plist が Official API が使えなくなったのが理由らしい: https://github.com/CocoaPods/CocoaPods/issues/1275
        * read はok だけどwrite はできない、ということらしい
            * https://github.com/CocoaPods/Xcodeproj/issues/52#issuecomment-41745072
            * https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/OldStylePlists/OldStylePLists.html

# 課題
* pod install/update するとpbxproj ファイルがXML 形式に変換されてしまうので、うっかりファイルの追加/削除 をしていたコミットとコンフリクトすると、正しくマージできなくなってしまう
* 特にファイル構成に変更がなくても差分がどっさり出てきてしまう(ように見える) ので、嫌な気持ちになる

# 解決策
* xcproj というCLI のコマンドを入れておく

```
brew install xcproj
```

* そうすると、CocoaPods がxcproj のコマンドを認識して、old-style にconvert してくれる

# 注意点
* xcproj は、Xcode をアップデートするたびにre-compile する必要がある
    * https://github.com/CocoaPods/Xcodeproj/issues/52#issuecomment-41822240
    * https://github.com/0xced/xcproj#limitations
* brew uninstall してinstall すればok

```
brew uninstall xcproj
brew install xcproj
```

# おまけ
* brew install xcproj しようとしたら、こけた。

```
$ brew install xcproj
==> Downloading https://github.com/0xced/xcproj/archive/0.1.2.tar.gz
Already downloaded: /Library/Caches/Homebrew/xcproj-0.1.2.tar.gz
==> xcodebuild -project xcproj.xcodeproj -scheme xcproj SYMROOT=build DSTROOT=/usr/local/Cellar/xcproj/0.1.2 INSTALL_PATH=/bin -verbose install
xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
```
* 理由は、Xcode5 と6 を共存させていて、アプリケーションの名前をXcode => Xcode6 に変更していたから。名前を元に戻したら通った。
SASSのmix-inで要素を引数で渡す

構造が似てるけど要素がちょとずつ違うとか(そういう設計がよくないというのはさておき)、何かしら子要素との連携が必要だけどその要素を特定できないみたいな場合、mixinで要素(名)を引数で渡すことでセレクタを呼び出し元から変えることができます。

```scss
// これを一つにしたい
@mixin some-module_patternA {
  color:#333;

  h1 {
    color: #F00;
  }
}

@mixin some-module_patternB {
  color:#333;

  em {
    color: #F00;
  }
}
```

# 改善案

```scss
@mixin some-module($element:h1) {
  color:#333;

  #{$element} {
    color: #F00;
  }
}
```

これで要素、あるいは要素名を渡すと子要素などの指定を利用時に渡すことができます。

```scss
.hoge {
@include some-module;
}
.foo {
@include some-module(em);
}
// 文字列でセレクターを渡すこともできます
.fuga {
@include some-module('h1 em');
}
```

まあクラス設計をちゃんとやればあんまりこれを使うべき必然性は発生しないと思いますが。
vagrant with vmware 



http://docs.vagrantup.com/v2/vmware/installation.html
参考にした手順です。

```
$ vagrant plugin install vagrant-vmware-fusion

Installing the 'vagrant-vmware-fusion' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vmware-fusion (3.0.1)'!
```

```
$ vagrant plugin license vagrant-vmware-fusion license.lic

The license file to install could not be found. Please verify
the path you gave is correct. The path to the license file given
was: 'license.lic'
```

ライセンス($80ぐらい)を買わないと使えなさそうぽよ。
virtualBoxへ戻ります。

参照：
http://momijiame.tumblr.com/post/69361076830/vagrant-vmware-provider
BrowserifyからWebpackへの移行時の注意点


思い立ったが吉日ということで、プロジェクトのモジュール管理をRequire.jsからBrowserifyへと移行し、その直後にWebpackに移行しました。もうちょっと考えてツールを選ぼうと思います。

さて、Require.jsからBrowserifyへ変えた理由は、シンタックスをCommonJS的に書けるようになって、全体がシンプルになるから、という理由でしたが、BrowserifyからWebpackへの移行は、もうちょっと切ない理由での移行になりました。

## Webpackとは
http://webpack.github.io

ドキュメントも若干わかりづらいですが充実しており、基本的にここだけで必要な情報はほとんど得られます。
なのでこちらをどうぞ・・・じゃさすがにあれなので、ドキュメントに書いてある、作られた動機などを若干紹介します。

- 今はモジュールシステムがいろいろある
  - CommonJS
  - AMD
  - `<script>` タグ
  - ES6 Module
  - ほかいろいろ
- それらのモジュールにはPros/Consがそれぞれ存在するので、適切なものを利用したい
- Webでは、JavaScript以外にもCSSとか画像とかいろいろなものが利用される
  - それらも全部まとめたい
- CommonJSとかで動的な読み込みができないの、たまに辛いよね

こんな感じの動機から、Webpackは作られたようです。

Webpackの特徴としては、

- コード分割
- requireの使い方で、AMDのような非同期のロードもサポート
- Loaderという読み込み時に適用するプラグイン
- require時に変数が入っていてもパースできるような、賢いパース
- Pluginによる拡張

という感じで、Browserifyとの一番の違いは、Browserifyが **単一ファイル** を作成するのに特化していたのと比較して、Webpackは **複数ファイルを出力すること** を念頭に置いている点だと思います。

私が今携わっているプロジェクトでは、複数のエントリーポイントがあり、それぞれが相当量のJavaScriptやらを利用しているため、それぞれのエントリーポイント別にbundleさせたいのです。

Browserifyでもやろうと思えばできましたが、結構面倒な点などがありました。

## Webpack移行のポイント
Webpackへ移行するのは、すでにBrowserifyを利用しているなら、基本的に設定をちょっと変えれば、基本的には動作すると思います。が、いくつか両方に同じ名前の設定があるけど意味が違ったり、Browserifyでやっていたけどどうやるの？というような設定がありました。

### externals
Browserifyでは、依存を追い出して利用するためにexternalsという設定を利用していました。
Webpackでも同名の設定があるのですが、若干意味が変わってしまい、Browserifyと同じようには利用できません。

Browserifyのexternalと同じように、共通する依存を分割する際にはCommonChunkPluginというものを利用する必要があります。

### Sourcemap
ドキュメントにも書いてありますが、SourcemapはBrowserifyと違って複数の種類があります。

これがだいぶ注意なのですが、私の現在の環境では、かなりメモリがかつかつな状態でやっているのですが（常時90%オーバー）、Sourcemapを有効にすると、Browserifyと比較して、ビルド時にかなりのメモリを消費します。

プロジェクトで全然違った値になると思いますが、Sourcemapあり・なしのビルドしたときの、メモリ消費値を参考程度にあげておきます。

この値は、以下の条件ではかったものです。

- Vagrant上のCentOS
- メモリは768MB
- Bundle対象のJavaScriptファイルは大体40k stepくらい
- jQuery、jQuery UI、Backbone、Backbone.Marionetteを利用

では実測値です。

- Sourcemapなし
  - 23〜6%
- eval
  - 45〜50%
- source-map
  - 75〜80%
- inline-source-map
  - 50〜60%
- eval-source-map
  - 50〜55%

みてわかる通り、結構なメモリを食います。source-mapは別ファイル、それ以外は生成したファイルに埋め込む形です。

ただし、デバッグ用途として利用するのであれば、inline-source-mapかsource-mapがオススメです。Chromeで（割と）快適にデバッグできます。

### watchとcache
webpackのCLIを実行すると、自動的にキャッシュが有効になりますが、gulpとかgrunt経由で実行するときは、明示的に設定を有効にしないとキャッシュされません。

## Polymerを使っている場合
ほとんどないとは思いますが、Polymerを利用していて、Polymerにもrequireなどを導入している場合、先にvulcanizeしてから実行する、など若干注意する必要があります。
それ以外は、複数出力可能という点で、Webpackの方がPolymerのVulcanizeされたJavaScriptをまとめやすい印象です。

## それでもWebpackを選んだ理由
プロジェクトのデプロイをすべて自動化しようとしていたときに、Jenkinsのサーバー（m1.small）でBrowserifyのビルドをさせてみたところ、なんと20分くらいかかってしまいました。
ローカルのVagrant上でも、一回のビルドで3〜4分かかってしまっていたので（watchした場合、初回以外は高速です）、もしかしたらWebpackだったら早くなるのでは？ということでやってみたました。

結果としては、

- 一回（もしくはwatchの初回）のビルド時間
  - Browserify => 3〜4分
  - Webpack => 14〜16秒（！）

と、劇的に変わりました。ただし、Sourcemapを出力すると、相応の時間がかかるようになるため、Sourcemapを出力した場合は、大体Browserifyの半分くらいの時間になります。

この速度の優位性で私はWebpackにしたといっても過言ではありません。メモリがより潤沢にある環境ならば、devserverなどを導入してさらに効率よく開発することも可能でしょう。
（残念ながら私の環境はdevserverが利用できないので利用していませんが・・・）

## Webpackにするなら今がチャンスかも
最近にわかに注目されてきていて、日本語記事もチラホラ見かけます。後Instagramとかが利用していて、利用で得られたtipsをgithub上で公開していたりしますので、みると非常に参考になります。

小規模からでも、モジュール化することによるメリットは大きいはず、というよりももはやモジュール化しないと破綻一直線なので、とりあえずでもいいので導入してみてはどうでしょうか。
Angular.js学習メモ vol.01


###　はじめに
Angular.jsを勉強したので、メモを残しておきます。


Code Schoolで無料講座を使用し、勉強しました。
https://www.codeschool.com/courses/shaping-up-with-angular-js

\![Alternative text](https://d1ffx7ull4987f.cloudfront.net/images/achievements/large_badge/392/completed-shaping-up-with-angular-js-83ceb89bd5255391f25230727ae3f019.png)


### Angular.js用語
- Directive:　DOM上のマーカのようなもので、JSの挙動を伝える、JSに伝えたりする。
- Module: アプリケーションを定義する構成単位。
- Controllers: 引数や関数を定義し、AngularJSアプリケーションをコントロールする。
- Expressions: 動的変数をHTMLにインサートする。ExpressionでHTMLとデータをバインディング。HTML上で二重括弧で{{ expression }}と書く。


### Directiveの例

```html:index.html
<html>
<body ng-controller="StoreController">
	....
</body>
</html>
```


```javascript:main-directive.js
function StoreController(){
	alert("hello world");
}
```

ng-controllerがHTML上のDirectiveです。
HTMLのbodyが読み出されるときに、js上のStoreControllerメソッドが呼び出されます。

###Moduleの例
```javascrip:main-module.js
var app = angular.module('store', []);
```
angulr.module : angular.jsを使いmoduleを作成。
'store' : アプリケーションの名前
[] : dependencies


### DirectiveとModuleを組み合わせる
```html:index.html
<html>
<body ng-app="store">
	....
</body>
</html>
```


```javascript:main-directive.js
var app = angular.module('store', []);
```

ng-appがディレクティブで、ドキュメントがロードされたら、appというModuleを呼ぶ。

###Expressionの例
```html:index-expression1.html
<div>{{ 5 + 6 }}</div>
```
html上では11と表記されます。

###Controllerの例
```javascript:controller.js
var app = angular.module('store', []);
app.controller('StoreController", function(){
	this.product = item;
});

var item = {
	name : チョコ,
	price : 100
}
```

コントロール上で定義したデータをhtml上にいかにパスします。

```html:index.html
<html>
<body ng-app="store">
	<div ng-controller="StoreController as store">
		<div>{{ store.product.name }}</div>
		<div>{{ store.product.price }}円</div>
	</div>
</body>
</html>
```