OmniAICreator/Qiita-1.07M huggingface dataset:
Gitのコマンド（基本編）

#Gitのコマンドの使い方
流行りのバージョン管理システム"Git"を活用するのに最低限知っておくと良いコマンドのまとめです。基本的にgitでコマンドを打つときは管理したいファイルがあるディレクトリ、またはコピーしたいディレクトリに移動してからコマンドを実行します。

##リポジトリの作成など、準備段階で使用するコマンド
###リポジトリを初期化する　`$git init`
gitを使って管理したいフォルダに移動してコマンドを入力することで、そのディレクトリ内を初期化してディレクトリ内でのgitコマンドを可能にする。
実際には`$git init`コマンドによってディレクトリ内に.gitファイルが作成され、gitによる操作はこの中に保存されていく。
###リポジトリを複製する　　`$git clone <URL>`
既存のリポジトリ(インターネット上にgit hubなどでアップされているもの)を現在のディレクトリに複製する。

##作業ツリー内で操作・管理に使用するコマンド
作業ツリー内での変更点は変更点をコミットすることによって反映されます。
###コミットしたいファイルあるいはディレクトリを一度インデックスにあげる  `$git add <file name>`
変更したファイル、コミットしたいファイルを一度インデックスに登録します。コミットするファイルを指定してaddしないと次のコマンドcommitはコミットするファイルがないというエラーを呼び出します。
ファイル名を列挙してもいいのですが、変更点が多い場合は現在のディレクトリ内を全て指定する`$git add .`を使うとディレクトリがインデックスに登録できます。
###インデックスにあがったファイル等をコメントをつけてコミットする  `$git commit -m 'comment'`
`$git add`でインデックスに登録したファイルをコミットする。コミットする際にはコメントが必須となっていますが、-mオプションを指定することで一回のコマンド入力でコメントをつけてコミットすることが可能です。
###直前のコミットを取り消す  `$git reset`
コミット後に小さなミスなどに気付いた場合、コミットを取り消してミスを修正してコミットし直したいというようなことがあります。
その際`$git reset --soft HEAD^` コマンドで直前のコミットが取り消されます。ファイルを修正してコミットし直しましょう。
作業ツリーへの変更点も取り消したい場合は
`--hard HEAD^`オプションを指定することで実現可能です。
###指定したコミット時点に戻す。`$git revert <コミット名>`
作業ツリーを指定したコミット時点に戻すことができます。
resetと違う点は、過去のある時点での状態を現在の時点に上書きするという寸法なので、revertはlogとして残されます。
###ブランチ関係の操作をする 
- [ ] `$git branch`　存在するブランチの確認。
- [ ] `$git branch <ブランチ名>` <ブランチ名>のブランチを作成
- [ ] `$git checkout <ブランチ名>`<ブランチ名>のブランチに切り替え。
- [ ] `$git merge <ブランチ名>`　<ブランチ名>のブランチを現在のブランチに取り込む。この時、変更点が重複している時（同じ箇所に異なる変更が存在した時）にコンフリクト（衝突）が起こる。コンフリクトの解消法は別途参照を願います。

###変更されたファイルの一覧を表示する  `$git status`
変更が加えられたファイルを一覧表示する。
###コミットログを見る  `$git log`
過去のコミットログを表示する。
##リモートリポジトリを活用して作業する時のコマンド
###初期設定
`$git remote add <name> <url>`
活用するリモートリポジトリ<URL>を<name>という名前で登録する。push,pullを行うときは、リポジトリ名を省略するとデフォルトでoriginという名前を使用するため、リモートリポジトリにもoriginという名前をつけるのが一般的。

###リモートリポジトリにローカルリポジトリの内容を登録  `$git push <リモートリポジトリ名> <ブランチ名>`
ローカルでコミットした変更点をローカルリポジトリにpushする。活用しているサービスに応じてユーザー名とパスワードの入力を適宜行ってください。リモートリポジトリ名、ブランチ名は省略可能で、その場合はoriginにpushされます。
###他の変更点をローカルにマージする　　`$git pull <リモートリポジトリ名>`
他の開発者がpushした内容を自分のローカルリポジトリにマージします。
リモートリポジトリを指定しない場合はデフォルトでoriginから引っ張ってくる設定になっています。（リモートリポジトリの名前はoriginにしておくと共同開発作業はスムーズに進むでしょう。）
Notepad++でPL/SQLの関数リストを表示する

Notepad++の関数リスト機能でPL/SQLを対応させる。

編集対象となるファイルは

``` %APPDATA%\Roaming\Notepad++\functionList.xml ```

[後はこちらのページの通り設定すればOK](http://www.hermanmol.nl/?p=240"")

Notepad++を再起動すれば、.SQLで保存したPL/SQLの関数リストが
出るようになる。

※C:\Program Files (x86)\Notepad++直下にも同一ファイルがあるが
こちらは無視されるので注意すること。
Google Chrome 42のフォント仕様について

この情報は古いです。Google Chrome 47にて元の仕様に戻りました。

#Google Chrome 42からフォントの仕様が変わったみたい

Windowsをお持ちでGoogle Chromeをバージョン42に更新された方には、驚かれた方も多いかと思われます。なぜなら、バージョン42からは、特定の条件下でメイリオがデフォルトのフォントになったからです[^1]。

```html
<html lang="ja">
```

上記のように、HTML文書が日本語であると明示的に指定された場合、従来とは変わってメイリオが使用されるようになりました。

また、日本語以外の言語コード(未指定の場合も含む)が指定されている場合、システムのデフォルトであるMS Pゴシックが使用されます。もちろん、スタイルシートで具体的にフォント名を明示されている場合は問題ありません。
#個人的には
近年、高解像度ディスプレイが主流になってきて、MS Pゴシックのようなビットマップフォントでは少々読むのが辛くなってきました[^2]。なのでメイリオのようなClearTypeが有効なフォントがデフォルトになったのは喜ばしいことだと思います[^3]。

しかし、もともとMS Pゴシックの使用を前提としたウェブサイトはデザインが崩れてしまったり、小さい文字をレンダリングした際にフォントが潰れてしまう可能性が考えられます。

ウェブデザイナーは過去に作ったサイトを見直す必要があるかもしれません。



[^1]: ...今後のバージョンで変更される可能性があります。
[^2]: ...MS Pゴシックは文字サイズが小さい場合ビットマップフォントになります。
[^3]: ...メイリオ自体は癖があるフォントだと感じるので私はあまり好きではありません
Ruby におけるハッシュ (Hash) と構造体 (Struct) の使い分け

## 概要
Ruby ではハッシュがよく使われるが、実は構造体も使える。

```ruby
# ハッシュ
person = {name: "Taro", age: 16}
p person[:name]

# 構造体
Person = Struct.new(:name, :age)
person = Person.new("Taro", 16)
p person.name
```

どう使い分けるとよいのだろうか？

## 参考
* http://stackoverflow.com/questions/3275594/when-to-use-struct-instead-of-hash-in-ruby
* ほぼこれを翻訳しただけです

## ポイント1: ハッシュは動的、構造体は静的
ハッシュは存在しない要素を参照したり、要素をあとから追加できます。一方、構造体は初めに定義した要素しか扱えません。

```ruby
# ハッシュ
person = {name: "Taro", age: 16}
person[:tel] # => nil
person[:sex] = "man" # 要素が追加される

# 構造体
Person = Struct.new(:name, :age)
person = Person.new("Taro", 16)
person.tel # => NameError: undefined method 'tel'
person.sex = "man" # => NameError: undefined method 'sex='
```

この特性ゆえ、実行時まで属性名が決まらないような場合は、ハッシュの方がきれいに対応できます。

```ruby
key = ARGV[0]

# ハッシュ
p some_hash[key] # => なんとかなる

# 構造体
p some_struct.key # => ムリ
p some_struct.send(key) # => なんとかなるけど気持ち悪い
```

## ポイント2: 等価の基準が違う
構造体は、たとえ内容が全く同じでも、元になった構造体自体が違う場合、等価になりません。

```ruby
Person = Struct.new(:name, :age)
person = Person.new("Taro", 16)

Robot = Struct.new(:name, :age)
robot = Robot.new("Taro", 16)

p person == robot # => false. 越えられないカベ
```

## ポイント3: to_a の挙動が違う
ハッシュの方は key-value のペアになった配列が得られます。

```ruby
# ハッシュ
person.to_a
=> [[:name, "Taro"], [:age, 16]]

# 構造体
person.to_a
=> ["taro", 16]
```

## ポイント4: 構造体はインスタンス生成に属性名がいらない
属性名が長くなりがちなときや、インスタンスをいくつも作るときにスッキリ。

```ruby
# ハッシュ
person1 = {name: "Taro", age: 16, most_favorite_movie_ever_seen: "Toy Story"}
person2 = {name: "Jiro", age: 17, most_favorite_movie_ever_seen: "Toy Story 2"}
person3 = {name: "Maro", age: 18, most_favorite_movie_ever_seen: "Toy Story 3"}

# 構造体
Person = Struct.new(:name, :age, :most_favorite_movie_ever_seen)
person1 = Person.new("Taro", 16, "Toy Story")
person2 = Person.new("Jiro", 17, "Toy Story 2")
person3 = Person.new("Maro", 18, "Toy Story 3")
```

## 結論と感想
ポイント1の違いが一番大きいでしょう。参考リンク先では、例えば「文章中に出てくる単語をキー、その出現回数をバリューにしたいとき」のような動的な処理のときはハッシュがよいだろう、と結論付けられています。私もそう思います。

個人的に感じている構造体の便利ポイントは、単純に「ドット演算子が使える」ことです。これによって、でかいオブジェクトを返してくるメソッド（例えば open など）のスタブ化が簡単にできます。

```rb:hoge.rb
require "open-uri"

class Hoge
  def call_api
    response = open "http://something-api/"
    response.read if response.status[0] == "200"
  end
end
```

```rb:hoge_spec.rb
it '接続成功時は "Success" を返す' do
  hoge = Hoge.new

  # read と status に応答できるオブジェクトを即席で作る
  dummy = Struct.new(:read, :status).new('{"result": "Success"}', ["200", "OK"])
  # dummy を返すように open メソッドをスタブ化
  allow(hoge).to receive(:open).and_return(dummy)

  expect(hoge.call_api).to eq '{"result": "Success"}'
end
```
ScalaのOption型とEither型を使う

# Option型とEither型について
両方とも例外が発生しうる状況において使える型になります。Option型は例外の有無(SomeかNone)をEither型は例外の有無に加え詳細(RightかLeft)を伝えることがそれぞれ可能です。Either型では正しいという意味のrightとRightをかけてRightに正しい方向に進んだ時の処理を書くみたいです。


#例
入力された文字列にスペースが含まれていないか確かめる。

````OptionEither.scala
object OptionEither {
  def main(args: Array[String]): Unit = {
    println("Please enter word.")
    val word = scala.io.StdIn.readLine
    validateByOption(word)
    validateByEither(word)
  }
  def validateByOption(word: String): Option[String] = {
    word.contains(' ') match {
      case true => None
      case false => Some(word)
    }
  }
  def validateByEither(word: String): Either[String, String] = {
    word.contains(' ') match {
      case true => Left("Error The Word Contains Space")
      case false => Right(word)
    }
  }
}

````

## 追記
コメント欄にてSomeは成功した場合の意味合いがあるとご指摘いただきましたので編集させていただきました、ありがとうございます。
HerokuへFuelPHPプロジェクトをデプロイ

OSXで、HerokuへFuelPHPプロジェクトをデプロイする手順

# 設定項目

| 項目 | 設定値 |
| --- | ---- |
| herokuアプリ名 | fuel-app-test |
| Fuelプロジェクトpath | /path/to/project |
| FuelプロジェクトでHerokuにデプロイするブランチ | master |
| herokuのWebServer |  heroku-php-apache2 (for PHP & Apache2) ※|

※ https://devcenter.heroku.com/articles/custom-php-settings

# 前提条件

1. herokuコマンドがインストールされていること
2. FuelPHPプロジェクトを作成していること
3. `$ heroku login` に成功していること

# Heroku設定ファイルの作成

`/path/to/project/` 以下に `Procfile` を作成する。

内容は以下のとおり

```
web: vendor/bin/heroku-php-apache2 public/
```

# composer.json 設定

`/path/to/project/composer.json` で、`config`に `bin-dir`の設定を追加

```
(略)
   "config": {
         "bin-dir": "vendor/bin",
         "vendor-dir": "fuel/vendor"
     },
(略)
```

# gitの設定変更

## Procfile をファイル管理に追加

```
$ cd /path/to/project
$ git add Procfile
```

## composer.json の変更を追加

```
$ cd /path/to/project/
$ git add composer.json
```

## composer.lock をファイル管理に追加

`/path/to/project/.gitignore` の `/composer.lock` をコメントアウトしてadd

```
(略)
 # the composer package lock file and install directory
# /composer.lock
 /fuel/vendor
(略)
```

```
$ cd /path/to/project
$ git add composer.lock
$ git add .gitignore
```

## 変更をコミット

```
$ cd /path/to/project
$ git commit
```

# herokuアプリケーションの作成

```
$ cd /path/to/project
$ heroku create fuel-app-test 
Creating fuel-app-test... done, stack is cedar-14
https://fuel-app-test.herokuapp.com/ | https://git.heroku.com/fuel-app-test.git
Git remote heroku added
```

# デプロイ

```
$ cd /path/to/project
$ git push heroku master
```
※ master以外のブランチ、例えばhogeブランチをデプロイしたい場合は 

```
git push heroku hoge:master
```
とする。


# ブラウザで確認

```
$ cd /path/to/project
$ heroku open
```

# アプリの削除

```
$ heroku apps:destroy fuel-app-test
 !    WARNING: Potentially Destructive Action
 !    This command will destroy fuel-app-test (including all add-ons).
 !    To proceed, type "fuel-app-test" or re-run this command with --confirm fuel-app-test

> fuel-app-test
Destroying fuel-app-test (including all add-ons)... done
```
BaaS 備忘録


バックエンド実装の省力化と、フロントエンド実装への注力に役立つかも知れない BaaS について、なんとなくメモ。

# 所感

* 受託開発では、バックエンド実装をパターン化し BaaS の守備範囲に収めるのは難儀。
* 受託開発者としては、クラウドサービスにはリクエスト数に対する定量的な保証か明言が、客先とのトラブル回避にはほしい。
* 冗長化や負荷対策について省力化できる点は魅力。
* プッシュ通知機能が付いている場合がほとんどなので、スマートフォンアプリには有用そう。
* プロトタイピングのバックエンド環境としては魅力的。

# 開発者個人としての好み

* 特定 BaaS へのベンダーロックインは避けたい。
* BaaS 独自の API を学習するモチベーションは低い。
* PaaS + フレームワークの柔軟性の方が魅力的。
* PaaS の JavaScript SDK を使えばフロントエンドの実装のみで、データの永続化できる環境が結構ある。

# 気になるリンク

* Amazon Web Services: [AWS SDK for JavaScript in the Browser](http://aws.amazon.com/sdk-for-browser/)
* Dropbox: [JavaScript Datastore API - Dropbox](https://www.dropbox.com/developers/datastore/sdks/js)
* Google Drive: [Quickstart: Run a Drive app in JavaScript - Drive REST API — Google Developers](https://developers.google.com/drive/web/quickstart/quickstart-js)
* PubNub: [Build Realtime Apps & Take Websockets To The Next Level | PubNub](https://www.pubnub.com/)

# 参考

* [mBaas - BaaSはまだ戦国時代だったのか、まとめ。(執筆中) - Qiita](http://qiita.com/cognitom/items/ead2837115bc900a0acc)
Railsのwebアプリの500エラーをslackに自動で通知する方法

## 方法
* exception_notification
* slack_notifier

を利用

## 実装方法
(1) gemfileに以下を追加

```
gem 'exception_notification', :github => 'smartinez87/exception_notification'
gem 'slack-notifier'
```

(2) bundle install
```
bundle exec rails g exception_notification:install create  config/initializers/exception_notification.rb
```

(3)slackよりwebhook URLの発行
* 以下URLにアクセス
https://"your_slack_name"slack.com/services/new
* Incoming WebHooksで検索して「+Add」をクリック
* 「choose your channel」からエラー情報流したいchannelを選択
* 「Add incoming webhooks integration」をクリック
* Webhook URL（https://hooks.slack.com/services/*****）をmemo

(4) 2で追加したexception_notification.rbに以下を追加

```
config.add_notifier :slack, {
 :webhook_url => "(3)でメモしたwebhooks url",
 :channel => "(3)のchoose your channelで選択したchannnel"
}
```

(5) production環境以外では実行させないようにする
```
config.ignore_if do |exception, options|
  not Rails.env.production?
end
```
これを書かないと全ての環境で通知が実行されてしまう

(6) 500を実行するmethodを以下のように追記
```
def render_500(e)
  ExceptionNotifier.notify_exception(e, :env => request.env, :data => {:message => "your error message"})
  render template: 'errors/error_500', status: 500
end
```


(7) テスト
500エラーを起こして、上記指定したslackのchannelに流れてきたら成功！
（ローカルでテストの場合は再起動を）

## その他
* 以下コードでクローラー無視出来る（ex.google bot / bing bot)

```
 :ignore_crawlers => %w{Googlebot bingbot},
```
ただ現状は上記コードかかずクローラーの場合でもエラーが出るようにしている。
理由はエラーを察知出来るため。


## 運用方法例
* sys-errorというchannelを作ってそこはエラーログがたまるのみ
* sys-handleというchannelを作ってそこはエラーの対応状況を記載するのみ

少人数だとこれで問題無し。
気づく人を増やすって意味では複数サービスを同じ所で管理しても良いかな。

## 参考
[exception_notificationでrailsの例外をslackに送る](http://qiita.com/hotakasaito/items/5638f87da2c7776cd32f)
iOSでFacebookSDKバージョン4だとビルドが通らない

Swiftに限らないかもしれないですが、
最新FacebookSDK（記載時のバージョン４）でビルドが通らなくてハマったので備忘録

以下のFrameworkのModulesを削除する
・FBSDKCoreKit
・FBSDKLoginKit
・FBSDKShareKit

最新バージョンにした途端に
Bridging-Header.hに指定しててもなかなかビルドが通らなくて困りました。

こちらのStackoverflowを参考にしました。
http://stackoverflow.com/questions/29459073/issue-using-fbsdk-in-swift-ios-application/29472399#29472399
【Swift】iOSアプリ開発　TODO、気になった点まとめ

何かあるたびに追記


#ライブラリ評価

##ネットワーク系
###Alamofire
[【GitHub】Alamofire](https://github.com/Alamofire/Alamofire)
現在利用中のライブラリ
Swiftで書かれているため、何かわからない時にコード解析も楽です。
ただmultipartでリクエストを送れないようです。
とりあえずはURLパラメータを併用すれば
AccessToken認証　＋　データ送信
等対応できました。

###Net
[【GitHub】Net](https://github.com/nghialv/Net)
なぜか思ったような挙動をしませんでした。
Alamofireを入れて動かすとうまく動くんですが・・・・

###AFnetworking
[【GitHub】AFnetworking](https://github.com/AFNetworking/AFNetworking)
実績、機能共にこれを使ってれば間違いないんだと思います。
ただ私の用途としてはAlamofireでこと足りたので



#TODO
##(済)アラートの表示について
[UIAlertControllerのActionをクロージャで処理したくない まとめ](http://qiita.com/tdaiku/items/7ed8900fa820bd46db36)
⇨やはり使ってみるとDelegateを実装するのが面倒。
　クロージャで処理するように修正したい。

##アラート表示

##(済)プログレスバー、Loading等の画面ロックについて
[MRProgress の利用方法について まとめ](http://qiita.com/tdaiku/items/e999f2cdd77e91fc19a8)

##UIライブラリを考える。
モダンなデザインのライブラリは大手が使ってるものを使えばいいけど、業務系なら
わかりやすさ以外はいらない。

##(作成中)自作WEBAPIとの接続をまとめる
ActiveRecordっぽくModel部分をコーディングしたい。
railsのschemaからテーブルクラスを作成する、とか？

#気になった点
##・enumのforeachができない
こんな感じの親クラスで列挙全部にアクセスする処理を作りたいんだけど・・・

```swift:table.swift
class TableParent{
    enum Column:String{
        case Col = "col"
    }
    func function() -> void{
        //すべての列定義にアクセスする処理を書きたい
    }
}

class TableChild:TableParent{
    enum Column:String{
        //列定義を書くだけで親クラスの機能が使える
        //xcodeの補完でミスもなくなる
        case Col1 = "col1"
        case Col2 = "col1"
        case Col3 = "col1"
    }
}
```
CircleCIでno-localeなPostgreSQLのDBを作成する

# Collate=CのPostgreSQLデータベースとは？
PostgreSQLで感覚的に正しい日本語ソートを行うにはinitdb時に`--no-locale`オプションを付けて初期化を行う必要がある。CircleCIではデフォルトでUTF-8なので正しくテストを実行することができない可能性がある。

# 強制的にno-localeなDBを作り直す
circle.ymlに次のように指定することでno-localeなDBを強制的に再作成することができる。

```yaml
machine:
  ruby:
    version: 2.2.1
  pre:
    - sudo locale-gen ja_JP.UTF-8
    - sudo -E -u postgres PGDATA=/var/lib/postgresql/9.4/main /usr/lib/postgresql/9.4/bin/pg_ctl stop
    - sudo -E -u postgres rm -r /var/lib/postgresql/9.4/main
    - sudo -E -u postgres PGDATA=/var/lib/postgresql/9.4/main /usr/lib/postgresql/9.4/bin/initdb --encoding=UTF8 --no-locale --username=ubuntu
    - sudo -E -u postgres PGDATA=/var/lib/postgresql/9.4/main /usr/lib/postgresql/9.4/bin/pg_ctl start
  timezone:
    Asia/Tokyo
```
フォームにアップロードされた画像の縦横の長さをサクッと取得する

アップロードされたファイルからimgのDomを作って取得

以下はcoffeescriptによるコード

```coffeescript
if file = document.getElementById('フォームのID').files[0]
  img        = new Image()
  img.onload = -> alert "#{@width} #{@height}"
  img.src    = (window.URL || window.webkitURL).createObjectURL file
```

をjsにコンパイルしたもの

```js
var file, img;

if (file = document.getElementById('フォームのID').files[0]) {
  img = new Image();
  img.onload = function() {
    return alert(this.width + " " + this.height);
  };
  img.src = (window.URL || window.webkitURL).createObjectURL(file);
}
```

いいね！
Arduino Leonardo/MicroでもMIDI使いたい。

以前、[Arduino UNOと@morecat_labさん作「mocoLUFA」を使ってMIDIコンを作る方法](http://qiita.com/tadfmac/items/9136f47ae1eea99a4ef7)を紹介しましたが、何人かの方に、**Microでも使える？**
と聞かれたので、Microを使ったやり方も紹介したいと思います。

# MicroやLeonardoだと[rkistner/arcore](https://github.com/rkistner/arcore)を使うと楽

[Arduino Micro](http://arduino.cc/en/Main/arduinoBoardMicro)や[Arduino Leonardo](http://arduino.cc/en/Main/arduinoBoardLeonardo)は、ATmega32U4が1つだけ搭載されたマイコンボードです。これらのボードは、Arduio UNOとは仕組みが違うので、同じ方法ではMIDIデバイスにできません。

そこで今回は、[rkistner/arcore](https://github.com/rkistner/arcore)を使ってMIDI機能を使えるようにしてみましょう。

- [rkistner/arcore](https://github.com/rkistner/arcore)

# インストールは簡単

> 私が試せる環境がMacしかなく申し訳ありません。Windowsでも同じように出来るはずです。

今、例のArduino戦争のお陰で、Arduino IDEは２カ所からリリースされているという状況ですが、[Arduino IDE 1.6.3](http://arduino.cc/en/Main/Software)を使うことにします。

## arcoreのダウンロードとフォルダ構成の変更

まず、[rkistner/arcore](https://github.com/rkistner/arcore)をダウンロードします。
すると、いろいろファイルが出てきます。

この中から、`hardware`フォルダを`arcore`などにrenameしてください。

## インストール先

renameした`arcore`フォルダを下記フォルダ配下に移動してください。

`Arduino.app/Contents/Java/hardware/`

> Macの場合、インストールされた Arduino.appを「パッケージの内容を表示」で開くと下の階層にアクセスできます。

これでインストール完了。
簡単ですね！

# 使い方。

それでは、使ってみましょう。

インストール後、Arduino IDEを再起動すると、ボードメニューに、`Arduino AVR Boards (arcore)`という項目が追加されます。

![ボード選択](http://img.dfm.lrv.jp/arcore/img01.png)

使ってるボードに合わせ、`Arduino Micro (arcore)`や`Arduino Leonardo (arcore)`など選んでください。

その後、スケッチを書き込むとUSB-MIDI機能が追加されます！

> ただし。
> 
> Arduino UNO Rev.3+[MIDI.h](http://playground.arduino.cc/Main/MIDILibrary)+[mocoLUFA](https://github.com/kuwatay/mocolufa)を使った方法より、低レベルなAPIしかありません。
> USB-MIDIの4byteのパケットを送受信できるようになるだけです。

というわけで、使いたい機能をある程度自分で作りながらスケッチを書く必要があります。

とはいえ、そんなに難しくはありません。
[github](https://github.com/rkistner/arcore)のサンプルを見ればだいたいわかります。

たとえば、ボタンを押したらNoteOnを送る、というスケッチは下記のような感じでOKです。
(ボタンは9番ピンに繋いでください)

```midi.ino
void noteOn(byte channel, byte pitch, byte velocity) {
  MIDIEvent noteOn = {0x09, 0x90 | channel, pitch, velocity};
  MIDIUSB.write(noteOn);
}

int obutton;

void setup() {
  pinMode(9,INPUT);
}

void loop() {
  int button = digitalRead(9);

  if((obutton != button)&&(button == HIGH)){
    noteOn(0, 60, 100);
    MIDIUSB.flush();

  }
  delay(100);
}
```

## Androidで使おうとするとキーボードでなくなるんだけど、どーすんだ！？

> 2015.12.5 追記

今日ハマり一瞬焦りましたので解決方法を。
`arcore/avr/cores/arcore/USBDesc.h`を開いて、下記をコメントアウトしてください。

```h
#define HID_ENABLED
```

コメントアウト後、もう一度Arduino IDEを再起動してスケッチをビルド→書き込みすると治ります。（キーボードとして認識されなくなり、単なるMIDIデバイスになる）

# まとめ

[rkistner/arcore](https://github.com/rkistner/arcore)を使えば、Arduino MicroやLeonardoで簡単にMIDIデバイスがつくれるので、やってみよう！

MIDIは楽しいよ！
jQueryUI Sortable 2つのリスト間のソート後の値をDBに保存するには

jQuery UIのSortableを使って、リストの並びを動的に変更し、その情報をDBに登録するアプリを作成しています。環境はSeasar2(SAStruts/S2JDBC),Java,jsp,jQuery,javascriptです。

質問があるのですが、
結論から言うと

**jQueryUI Sortable 2つのリスト間のソート後の値をDBに保存するにはどうしたらいいでしょうか？**

現在次のような画面を作りました。この2つのリスト間をタスクバーが移動できるようにしています。jQueryUIのSortableを使って。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/60528/818b7bb5-228c-4c4b-7337-24270b02195d.jpeg)


やることリストに関しては順番を変えた後、ページ更新(F5)しても順番が元に戻らないよう、この並び順を送信ボタンを押すとDB更新できるようにしています。

しかし、やることリストから実施中にバーを移動させてからページ更新をすると、元の位置に戻ってしまうようになっています。

これを同じくDB更新して値を保存できるようにしたいのですが、どうしたらいいでしょうか？

大まかな流れだけでもいいので教えて頂けるとありがたいです。


私がやろうとしていることは、
テーブルを新たにもう一つ作り、
リスト間を移動したとき用のinsert,deleteメソッド
実施中リストの中で順番が変わったときにソート番号を更新するupdateメソッド
を作ろうと考えています。

しかし、やってみると破綻しているところや冗長ぽいところが多く、もう少し違うやり方もあるんじゃないかなと思っています。

ご協力お願いします。
rbenv や Bundler を用いた Ruby環境構築

## 前置き、概要説明

Rubyはバージョンによる差異が大きく、各バージョンで互換性がない場合もあります。その為、複数のプロジェクトに携わっている場合はプロジェクト毎にRubyのバージョンを切り替える必要があります。この問題を解決してくれるのが**rbenv**というツールです。

rbenvはシステム内に複数のバージョンを共存させることを可能にしてくれます。具体的には、**特定のディレクトリ配下(プロジェクト)に特定のバージョンを適応する**といった制限を掛けてくれます。つまり指定のディレクトリ外には影響を与えず、隔離することが可能な為にクリーンな環境が保てます。

これはRubyのライブラリであるgemにおいても同様です。バージョンによる差異が大きい場合がある為、プロジェクト毎に適切なバージョンのgemを利用する場合があります。これには**Bundler**というツールを利用します。

Bundlerを用いることで、本来Rubyに紐づいてインスールされるgemライブラリを**特定のディレクトリ配下(プロジェクト)にインストールする**ことが可能です。つまり、同一バージョンのRuby内でも複数のgemライブラリを共存させることが可能となります。

## rbenvを用いたRubyインストール

### 1. rbenvをチェックアウトする

rbenvをGitHubリポジトリからチェックアウトします。

```lang:ターミナル
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

rbenv自体にはインストール済みのrubyを管理する機能しかありません。なので、rubyをインストールする機能であるruby-buildも併せてチェックアウトする必要があります。

```lang:ターミナル
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

### 2. rbenv向けの設定を行う

rbenvを利用出来るようにする為にシェルの設定ファイル(~/.bashrcなど)に下記を追記します。

```lang:~/.bashrc
export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"
```

設定を追記したら設定を反映させます。

```lang:ターミナル
$ source ~/.bashrc
```

### 3. Rubyをインストールする

初めにインストール可能なRubyのバージョンを確認します。

```lang:ターミナル
$ rbenv install -l
```

バージョンを指定してインストールを実行します。

```lang:ターミナル
$ rbenv install 2.2.2
```

指定のバージョンが実際にインストールがされたかを確認します。

```lang:ターミナル
$ rbenv versions
* 2.1.0 (set by /home/ryo-as/.rbenv/version)
  2.2.2
```

「＊」マークは現在適用されているRubyのバージョンです。今回の場合、システム(global)上でバージョン2.1.0が適用されております。
※この時点では先程インストールしたバージョン2.2.2は**まだ適用されておりません**。

### 4.Rubyを適用する

特定のディレクトリにバージョンを指定して適用します。

```lang:ターミナル
$ cd project_dir
$ rbenv local 2.2.2
```
適用されたかを確認しましょう。

```lang:ターミナル
$ rbenv versions
  2.1.0
* 2.2.2 (set by /var/www/project_dir/.ruby-version)

$ ruby -v
ruby 2.2.2p0 (2014-12-25 revision 49005) [i686-linux]
```

### 5.Rubyをアンインストール

特定のバージョンをアンインストールする場合は下記のコマンドです。

```lang:ターミナル
$ rbenv uninstall 2.2.2
```

## Bundlerを用いたgemライブラリ管理

### 6. Bundlerをインストールする

Bundler自体もgemライブラリなので、gemコマンドを用いてインストールを行います。

```lang:ターミナル
$ rbenv exec gem install bundler
$ rbenv rehash
```

今回、gemコマンドを「rbenv exec gem」として実行している点がポイントです。これは**rbenvで適用されているRubyのgemを明示的に実行**しております。

### 7. Bundlerの設定を行う

はじめに下記コマンドでBundlerの設定ファイルを生成します。

```lang:ターミナル
$ rbenv exec bundle init
```

※上記のコマンドが厳密ですが、システム側のRubyにBundlerをインストールしていない場合は混在しないので下記のように`rbenv exec`を省略することも可能です。

```lang:ターミナル
$ bundle init
```

`bundle init`を実行するとGemfileという設定ファイルが生成されます。このGemfileにインストールしたいgemライブラリを記載します。

```rb:Gemfile
gem "compass"
```

今回は試しにCompassをインストールしましょう。

### 7. Gemライブラリのインストールする

Gemfileに記載したgemライブラリを下記のように実際にインストールします。

```lang:ターミナル
$ bundle install --path=vendor/bundle
```

留意点は`--path`オプションを用いて、プロジェクト配下にgemファイルをインストールしていることです。

このオプションを付け忘れてしまうと**rbenvで指定したバージョンのRubyに紐付かれてインストール**されてしまい、**同じバージョンのRubyを利用している他プロジェクトに影響を与える**可能性があります。


### 8. gemライブラリを使用する

bundleインストールされたgemライブラリを使用するには下記のようなコマンドを実行します。

```lang:ターミナル
$ bundle exec compass
```

`bundle exec`を付けて実行することにより明示的に、bundleインストールされたgemライブラリを実行しています。

毎回`bundle exec`を付けて実行するのは冗長ですので、[direnv](https://github.com/zimbatm/direnv)を用いてパスを通すと便利かと思います。

※direnvに関しては後日、別途記載します
gulp インストール～基本設定の備忘録（windows）

node.jsは最新にしておこう（↓ windowsの場合ね）

```
nodist stable
```

node.jsのバージョン管理ツール「nodist」についてはこちらを参照。
⇒　[node.js インストール備忘録（windows7）](http://qiita.com/yokoh9/items/20d6bdc6030a3a861189)

npm も最新にしておこう（macの場合は sudoで実行すべし）

```
npm update -g npm
```

#gulp のインストール
gulpを[グローバルインストール](#local_global)

```
npm install -g gulp
```

プロジェクトのフォルダに移動し、node.jsモジュールを管理する package.jsonを作成

```
npm init
```

ここで再度 gulpを[ローカルインストール](#local_global)

```
npm install -D gulp
```

CLIとローカルバージョンが表示されればOK

```
> gulp -v
[xx:xx:xx] CLI version 3.8.11
[xx:xx:xx] Local version 3.8.11
```

<span id="local_global"> **ローカルインストールとグローバルインストール** </span>
ローカルインストールはそのプロジェクトのフォルダ内でのみ利用できる。グローバルインストールはそのマシン上のどこからでも利用できるようになる。
デフォルトはローカルインストールされるようになっており、グローバルインストールしたい場合は -g オプションを付けて実行する。
＜参考記事＞
[gulpのアプローチ "なぜグローバルとローカルにインストールが必要なのか"](http://nakajmg.github.io/blog/2014-09-03/gulp-structure.html)


#gulpfile.js の作成
package.jsonと同階層に gulpfile.jsを作成
“Hello World” を表示してみる

```lang:gulpfile.js
var gulp = require('gulp');
 
gulp.task('default', function() {
  console.log("Hello World!");
});
```

gulpコマンド実行　⇒　'default' に登録されたタスクが実行される

```
gulp
```

Hello World! が表示されればOK




#パッケージのインストール
gulp-sass をインストールしてみる

```
npm install -D gulp-sass
```

gulpfile.js に scss → css のコンパイルタスクを登録

```lang:gulpfile.js
var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function(){
	//scssディレクトリの指定
	gulp.src('./src/scss/*.scss')
	//コンパイル実行
	.pipe(sass({style : 'expanded'})) //出力形式の種類　#nested, compact, compressed, expanded.
	//出力先の指定
	.pipe(gulp.dest('./public/resources/css'));
});
```

試しに、/src/scss/ にサンプルのscssファイルを作成してタスク実行

```
gulp sass
```

指定したディレクトリ（/public/resources/css/）にcssファイルが出力できていたらOK。
その他スプライト用パッケージなど必要なものをインストール。


#ファイルの監視
scssなど自動コンパイルされるよう gulpfile.jsに追記する

```lang:gulpfile.js
gulp.task('watch', function() {
	gulp.watch('./htdocs/resources/scss/*.scss', ['sass']);
});
```


こんな感じ

```lang:gulpfile.js
var gulp = require('gulp');
var sass = require('gulp-sass');
var spritesmith = require("gulp.spritesmith");

//watch
gulp.task('watch', function() {
	gulp.watch('./htdocs/resources/scss/*.scss', ['sass']);
	gulp.watch('./htdocs/resources/_sprite/*', ['sprite']);
});

//scss
gulp.task('sass', function(){
	//scssディレクトリの指定
	gulp.src('./src/scss/*.scss')
	//コンパイル実行
	.pipe(sass({style : 'expanded'})) //出力形式の種類　#nested, compact, compressed, expanded.
	//出力先の指定
	.pipe(gulp.dest('./public/resources/css'));
});

//sprite
gulp.task('sprite', function () {
	var spriteData = gulp.src('./public/resources/_sprite/*')
		.pipe(spritesmith({
			imgName: 'sprite.png',
			cssName: 'sprite.scss'
		}));
	spriteData.img.pipe(gulp.dest('./public/resources/img'));
	spriteData.css.pipe(gulp.dest('./src/scss'));
});
```
SwiftにおけるBuilderパターンの実装

SwiftでDirector無しの簡易的なBuilderパターンを実装してみた。

以下のクラスのビルダーを作成する。

```Swift
class A {
    var firstName: String?
    var lastName: String?
}

class B: A {
    var middleName: String?
}
```

ビルダーはBuildableプロトコルを継承することにする。

```Swift
protocol Buildable {
    typealias BuildType
    
    func build() -> BuildType
}
```

BBuilderはABuilderのサブクラスとする。buildをオーバーライドする時に返値の型はBuildTypeの型に変更することが出来た。

```Swift
class ABuilder: Buildable {
    typealias BuildType = A
    
    private var firstName: String?
    private var lastName: String?
    
    func withFirstName(name: String) -> Self {
        firstName = name
        return self
    }
    
    func withLastName(name: String) -> Self {
        lastName = name
        return self
    }
    
    func build() -> A {
        let result = A()
        result.firstName = firstName
        result.lastName = lastName
        return result
    }
}

class BBuilder: ABuilder {
    typealias BuildType = B
    
    private var middleName: String?

    func withMiddleName(name: String) -> Self {
        self.middleName = name
        return self
    }
    
    override func build() -> B {
        let result = B()
        result.firstName = firstName
        result.middleName = middleName
        result.lastName = lastName
        return result
    }
}
```

実際にインスタンスを作成するには以下のように行う。

```Swift
let a = ABuilder()
    .withFirstName("First")
    .withLastName("Last")
    .build()
let b = BBuilder()
    .withFirstName("First")
    .withMiddleName("Middle")
    .withLastName("Last")
    .build()

```
angularJSを使う時の注意

# angularJSを使う、またはこれから導入する際の注意や感想

## minify対策 忘れがち
[AngularJSのDIの仕組み、minify対策は覚えておこう！](http://qiita.com/kawaz/items/363f430d21ec729f1b7d)

## routeを使うべきか？の検討
 データバインディングをメインに使いたいだけなら特にSPAにする必要はありません。
 これをしてしまうとSEOやらtwitterCard やFacebook等のogpの設定で
 大変になる事でしょう。

## ディレクティブを使うか？
 これはangularを使うのなら当たり前だって思うかも知れませんが、個人的には
 使いづらい印象だった。直感的だったhtml埋め込みのタグとは別にここだけ何か
 めんどくささを感じました。
[AngularJSのDirectiveを理解する.]
(http://qiita.com/Quramy/items/dd4e7d2693c32d92048c)

## Angular2を待ちましょう。
 Angular2以降で大幅に機能が変更されるので。
 

参考URL
 * http://www.publickey1.jp/blog/15/angularjsangularjsdeverlopers_summit_2015.html
 * http://www.publickey1.jp/blog/15/googleangular_2typescripttypescript_15ecmascript_6.html
Kaldiに関する処理を日本語のドキュメントでまとめてみた（学習編）4

#前回

１：http://qiita.com/GushiSnow/items/cc1440e0a8ea199e78c5

２：http://qiita.com/GushiSnow/items/a24cad7231de341738ee

３：http://qiita.com/GushiSnow/items/e099baf9d1c2e72cb3d1

いよいよ学習のフェーズに入る。

#データの振り分け

```shell-session
utils/subset_data_dir.sh data/train 1000 data/train.1k  || exit 1;
```

学習では上記スクリプトでデータの振り分けを行う。

引数は標準で３つ

１：下記のファイル及びディレクトリが保存されているファイルを指定

cmvn.scp　｜　spk2gender　｜　split20/　｜　utt2spk     
feats.scp　｜　spk2utt　｜　text　｜　wav.scp 

２：学習するのに必要なデータ量を指定

３：出力先のディレクトリを指定

用意されているオプション

```shell-session
--per-spk  #それぞれの話者の発話数を指定
--speakers #ランダムに話者を選択
--shortest #発話をすべて小文字で用意
--first    #最初の発話のみ
--last     #最後の発話のみ
--spk-list #話者のリストを取得
```

#モノフォン学習

1：初期モデルの学習を行っている

```shell-session
gmm-init-mono $shared_phones_opt "--train-feats=$feats subset-feats --n=    10 ark:- ark:-|" $lang/topo $feat_dim $dir/0.mdl $dir/tree || exit 1;

```
2：グラフの学習を行っている。（グラフの詳細はOpenFstを参照)


```shell-session
compile-train-graphs $dir/tree $dir/0.mdl  $lang/L.fst \                
"ark:sym2int.pl --map-oov $oov_sym -f 2- $lang/words.txt < $sdata/JOB/te    xt|" 
```

参照
http://qiita.com/GushiSnow/items/a24cad7231de341738ee

３：アライメントを行う

```shell-session
align-equal-compiled "ark:gunzip -c $dir/fsts.JOB.gz|" "$feats" ark,t:-      \| \                                                                   
gmm-acc-stats-ali --binary=true $dir/0.mdl "$feats" ark:- \  
```

４：アライメントが正しいか最尤推定を行う

```shell-session
gmm-est --min-gaussian-occupancy=3  --mix-up=$numgauss --power=$power \   

$dir/0.mdl "gmm-sum-accs - $dir/0.*.acc|" $dir/1.mdl 2> $dir/log/update.0.log || exit 1;
```

ビーム幅を大きくした探索を行う場合は下記のシェルが実行される。

```shell-session
x=1
while [ $x -lt $num_iters ]; do
  echo "$0: Pass $x"
  if [ $stage -le $x ]; then
    if echo $realign_iters | grep -w $x >/dev/null; then
      echo "$0: Aligning data"
      mdl="gmm-boost-silence --boost=$boost_silence `cat $lang/phones/optional_s
ilence.csl` $dir/$x.mdl - |"
      $cmd JOB=1:$nj $dir/log/align.$x.JOB.log \
        gmm-align-compiled $scale_opts --beam=$beam --retry-beam=$[$beam*4] --ca
reful=$careful "$mdl" \
        "ark:gunzip -c $dir/fsts.JOB.gz|" "$feats" "ark,t:|gzip -c >$dir/ali.JOB
.gz" \
        || exit 1;
    fi
    $cmd JOB=1:$nj $dir/log/acc.$x.JOB.log \
      gmm-acc-stats-ali  $dir/$x.mdl "$feats" "ark:gunzip -c $dir/ali.JOB.gz|" \
      $dir/$x.JOB.acc || exit 1;

    $cmd $dir/log/update.$x.log \
      gmm-est --write-occs=$dir/$[$x+1].occs --mix-up=$numgauss --power=$power $
dir/$x.mdl \
      "gmm-sum-accs - $dir/$x.*.acc|" $dir/$[$x+1].mdl || exit 1;
    rm $dir/$x.mdl $dir/$x.*.acc $dir/$x.occs 2>/dev/null
  fi
  if [ $x -le $max_iter_inc ]; then
     numgauss=$[$numgauss+$incgauss];
  fi
  beam=10
  x=$[$x+1]
done
```

gmm-boost-silenceは

silienceモデルを他のGMMモデルにシェアすることですべてのモデルにおけるGMM重みがsilenceと一致する。
Raspberry Pi のカメラモジュールの撮影時に光る赤い LED を消す設定


#はじめに
Raspberry Pi のカメラモジュールの、撮影時に赤く光る LED ですが   config.txt ファイルに disable_camera_led=1 を追加することで off にすることができます。

#手順
## 起動した Raspberry Pi から追加する手順
1. Raspberry Pi を起動
2. 下記のように nano エディタで config.txt を開く
```
sudo nano /boot/config.txt
```
3. (どこでもいいけど例えば)最期の行に下記行を追加
```
disable_camera_led=1
```
4. Control-X で保存
5. 再起動
```
sudo reboot
```

## Mac や Windows とかのエディタで追加する手順
1. Raspbian の SD を Mac や Winodows に刺すと、config.txt ファイルがあるので、テキストエディタで開く
2. (どこでもいいけど例えば)最期の行に下記行を追加
```
disable_camera_led=1
```
3. 保存したら SD カードを RPi に刺して起動する

#ミニ解説：config.txt
config.txt ファイルは Raspbian の SD カードの中の一次ブート領域の /boot にあります。理由等の詳細は以前[こちらに書いた](http://qiita.com/UedaTakeyuki/items/4f97240b5fd7fc8a4d0b)のですが、Raspbian の SD カードには一次ブートに利用される fat でフォーマットされた領域と、Linux の本体が入っている ext4 でフォーマットされた領域から構成されています。 

config.txt ファイルは fat でフォーマットされたほうの領域にあるファイルで linux の起動前に読み込まれ、初期設定に利用されます。

fat の領域は windows からでも Mac からでも普通に（自動的にマウントされるので）読み書きできるので、config.txt は Mac や Windows で変更することもできます

#お詫び
タイトルが「黒い瞳の大きな女の子」みたいに複数の解釈が可能な悪い日本語になってしまい、誠に申し訳ありませんでした

#参考URL
1. [Rpi Camera Module](http://elinux.org/Rpi_Camera_Module) "Configuration" に LED off の設定の説明
2. [RPiconfig](http://elinux.org/RPiconfig) ”Cammera” に上と同じ設定の説明
3. [R-Pi configuration file](http://elinux.org/R-Pi_configuration_file) RPi のコンフィギュレーションの説明と、config.txt ファイルの修正方法
Cloud Path for IBM powered by RacemiのSoftLayerへのWindows 2008のP2Vを試す

[Cloud Path for IBM powered by RacemiのSoftLayerへのWindows 2003のP2Vを試す](http://qiita.com/orz/items/c3ab5094b7c3fb616d18)の続きです。

今回は、Windows 2008 R2 日本語版の移行をテストしました。[手順は前回と同じ](http://qiita.com/orz/items/c3ab5094b7c3fb616d18)なのでポイントだけ。結論から言うと**正しくSoftLayerのライセンスが付与されました**。

使ったのはWindows 2008 R2 日本語 評価版です。ライセンス認証を行わないままCaptureします。

![image](https://qiita-image-store.s3.amazonaws.com/0/71995/52c3495a-7d0b-9f22-fd08-38eb08e6ec32.png)

Captureの開始時にエラーが出ましたが、リトライしたところ開始しSUCCESSになりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/71995/b550c8cd-ad9b-d1dd-b708-7bca892c58ec.png)

Deployは問題なく成功。

![image](https://qiita-image-store.s3.amazonaws.com/0/71995/f176d605-5ac3-3de2-7fa9-4bb0c3076b50.png)

リモートデストップでアクセスすると**ライセンス認証済み**になっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/71995/3a48cb19-a10f-75bf-3158-8f48dcc13e90.png)

「slmgr.vbs -dli」で確認すると「10.0.X.X」で始まる**SoftLayerのKMSサーバーからライセンスを取得**しています。

![image](https://qiita-image-store.s3.amazonaws.com/0/71995/d3eef9f6-cb46-a7d7-52a1-6210e6f6e6fc.png)


ソース側のドライブの状況は下記のとおり。

|Drive|Size|Used|
|-----|----|----|
|C|24.9 GB|7.8 GB|
|Boot|99 MB|28 MB|

2:44:17 かかり 2.76GBのイメージを作りました。Deployにかかったのは 1:04:22でした。
Active Admin で Helper モジュールを生やす

Active Admin を利用するときに、Helper モジュールを生やしたくなることがあるかと思います。
今回はその方法を簡単にまとめておきます。


## 1. initialize ファイルで include

active admin の initialize ファイルで ApplicationHelper を include します。
  
```ruby
# in config/initializers/active_admin.rb
ActiveAdmin.setup do |config|
    ....
end

module ActiveAdmin::ViewHelpers
  include ApplicationHelper
end
```

## 2. Helper モジュールの定義

`app/helpers/active_admin/foo_helper.rb` などを作成し、下記のように定義する。

```ruby
# app/helpers/active_admin/foo_helper.rb
module ActiveAdmin::FooHelper
  def foo
    # do something
  end
end
```


そうすると、helper メソッドを呼び出すことができます。


```
# app/admin/products.rb
ActiveAdmin.register Product do
  #...
  show do |product|
    row "Test Helpers" do |product|
      # `app/helpers/*_helper.rb` に定義されたすべてのメソッドを参照できる
      foo
    end
  end
  #...
end
```



Ref.

* https://gist.github.com/afred/7035a657e8ec5ec08d3b
* http://stackoverflow.com/questions/8673112/rails-3-how-to-add-a-helper-that-activeadmin-will-use
Moment Timezoneを使って日付をJSTに変換する

[Moment Timezone](http://momentjs.com/timezone/)はIANAの[tz database](http://ja.wikipedia.org/wiki/Tz_database)を使って[Moment.js](http://momentjs.com/)にタイムゾーン操作のAPIを追加してくれます。[前回](http://qiita.com/masato/items/54620a3b8a68324fd73a)確認したMoment.jsでも`+09:00`するとJSTになりますが自分で計算するのが面倒です。`Asia/Tokyo`のようにタイムゾーンを指定して変換できると便利です。


## テスト用のDockerコンテナ

Dockerイメージをビルドするプロジェクトを作成します。

``` bash
$ mkdir -p ~/node_apps/moment-tz-spike
$ cd !$
```

package.jsonに`moment-timezone`パッケージを指定します。

```json:~/node_apps/moment-tz-spike/package.json
{
    "name": "moment-tz-spike",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
       "moment-timezone": "0.3.1"
    },
    "scripts": {"start": "node"}
}
```

Dockerイメージをビルドしてコンテナを起動します。

```bash
$ docker build -t moment-tz-spike .
$ docker run --rm -it moment-tz-spike

> moment-tz-spike@0.0.1 start /app
> node

>
```

## 使い方

タイムゾーンを`Asia/Tokyo`に指定して現在時刻をISO 8601表示の日付にフォーマットします。

```js
> var moment = require('moment-timezone');
> moment().tz("Asia/Tokyo").format();
'2015-04-08T10:29:25+09:00'
```

UTCからJSTに変換します。

```js
> moment('2015-04-08T02:36:45.408Z').tz("Asia/Tokyo").format()
'2015-04-08T11:36:45+09:00'
```

指定したISO 8601表示の日付をUNIXタイムスタンプに変換します。

```js
> moment('2015-04-08T02:36:45.408Z').tz('Asia/Tokyo').unix()
1428460605
```

UNIXタイムスタンプからISO 8601表示の日付にフォーマットします。

```js
> moment(1428460605,'X').tz("Asia/Tokyo").format()
'2015-04-08T11:36:45+09:00'
```
SoftLayer Standard Image のサイズ

#0. はじめに
(今回の検証内容は OS の差異による影響はありませんが)Ubuntu 14.04 をインストールした 25GB 単一ディスクのサーバーから作成した Standard Image のサイズを確認しました。

#1. テスト前の状態

```
# df / /boot
Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/xvda2      25424764 868680  23257908   4% /
/dev/xvda1        236876  18289    206146   9% /boot
```

#2. 約 2GB 使用時のサイズ
まず、 /dev/xda を対象に、Standard Image を作成したところ以下のサイズになりました。

```
2015-04-15 02:08 PM (UTC+09:00) 3.39 GB
```

#3. 10GB の 0 埋めファイル追加時のサイズ

次に、/ ファイルシステム内にコマンド `dd if=/dev/zero of=bigfile bs=1G count=10` により '0' 埋めした10GB のファイル作成します。

```
# df　/ /boot
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/xvda2      25424764 11364552  12762036  48% /
/dev/xvda1        236876    18289    206146   9% /boot
```

そして、同じく /dev/xda を対象に、Standard Image を作成したところ以下のサイズになりました。

```
2015-04-15 02:41 PM (UTC+09:00)　12.31 GB
```

#4. 追加ファイル削除後の、サイズの変化
念のため、/ ファイルシステム内に作成した bigfile を削除します。

```
# df
Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/xvda2      25424764 868604  23257984   4% /
/dev/xvda1        236876  18289    206146   9% /boot

```

そして、最後に /dev/xda を対象に、Standard Image を作成したところサイズに変化が無いことを確認しました。

```
2015-04-15 02:53 PM (UTC+09:00)　12.31 GB
```

#5. まとめ
一連の結果から、以下のようなことが推察できます。

1) ファイルシステム上の使用容量よりも、Standard Image のサイズは大きい
　　　　-> ファイルシステム上の使用量が 900MB 弱でも、Standard Image のサイズは 3.39GB となったことより

2) Standard Image 作成時に圧縮操作などは行っていない
　　　　-> 圧縮処理の効果が大きいはずの 0 埋めファイル追加後に、スタンダードイメージのサイズが追加ファイルサイズ分増加したことより

3) 一旦大きくなったファイルシステムの使用容量を削減しても、スタンダードイメージのサイズは大きくなった値のままとなる

> 2015/12/25 追記：
> 4) ボリューム全体に書き込みを行うディスク・イメージによるシステム・バックアップ(dd 等)のリストア後に取得すると Standard Image のサイズは最大限に大きくなる。
>
> 25 GB の CentOS6 の /dev/xvda 全体を読み書き後に取得した Standard Image の例：
> ![maximum_std_img.JPG](https://qiita-image-store.s3.amazonaws.com/0/74185/0dffe1fe-1b50-a15a-554f-b58ccaef9ad1.jpeg)
MarkDownで書いたファイルを置くだけでWiki化できるMDWikiを導入してみた。

# 導入
MarkDownファイルを書くだけで簡単にWiki化できるMDWikiを導入してみました。
日本語情報が少なかったことと、恐ろしく便利なのにあまり日本で使われていなさそうだったので書いてみました。
情報共有Wikiを作りたいけどDB用意したくないとか、簡単で軽量なwikiを求めている人に向いています。

## MDWikiの特徴
・3MB程度と軽量
・JavaScriptだけで動く
・DBを使用しない
・スマホのページビューに対応している
・記事更新がMarkDownファイルを配置するだけで簡単
・MarkDownなのでQiitaからのデータ移行も簡単
・GitHub／GoogleDrive／Dropbox／Disqus／facebook／twitterなどとも連携できる。
・特にGoogleアカウントでグループ管理していてGoogleドライブを利用しているような組織にはお勧め

## ダウンロード
> http://dynalon.github.io/mdwiki/#!download.md
Githubからzipがダウンロードできます。

## インストール
1. ダウンロードした圧縮ファイルを解凍する。
2. UTF-8形式のMarkDown記法でファイルを書く
3. ファイル名をindex.mdへリネームする
4. 「/解凍フォルダ/index.md」へ配置する
5. docrootへ配置する

## アクセス
> http://localhost/mdwiki.html#!index.md
mdwiki.htmlをindex.htmlにリネームすると http://localhost/ でアクセスできます。

## クイックスタート
> http://dynalon.github.io/mdwiki/#!quickstart.md

## メニューバーの設定
navigation.mdを作成して、mdwiki.htmlと同じディレクトリに配置する

```text:navigation.md
[About]()
 * # Information
 * [このwikiについて](About/このwikiについて.md)
 - - - -
 * # Let's Try !
 * [MDWikiで出来ること](About/MDWikiで出来ること.md)

[Document]()
 * # How To
 * [設計書テンプレート](Document/document.md)
 - - - -
 * # テスト
 * [単体テスト]()

```

## スタイルの変更
navigation.mdにgimmickを追記する。
ceruleanを http://bootswatch.com/ の中から選べます。
> \[gimmick\:Theme \(inverse\: true\)\]\(cerulean\)

## GoogleDriveで限定共有ページとして運用する方法（自己責任でお願いします）
1. マイドライブに任意のフォルダ(share)を作成する
2. 作成したmdwikiの中身をshareフォルダに配置する
3. share/mdwiki.htmlをshare/index.htmlにリネームする
4. 招待したい人とshareフォルダを共有する
5. shareフォルダのパスからフォルダIDを取得する
6. https://googledrive.com/host/フォルダID/ にアクセスして確認する
7. https://goo.gl/ で短縮URLを作成して周知する
WordPress Importer 最新版をつかってるのにエラーが消えない場合

稼働している WordPress サイトのお引っ越しって、何度も記事を移さないといけない場面が出てきがちです。
そのたびにデータベースまるごと入れ替えるのって面倒くさい！

そこで私は WordPress Importer を愛用しています。
エクスポートするときに、日付や、公開ステータスで絞り込みした XML を出せるので、便利。

![エクスポート画面。引越し元は古いバージョンの WordPress だったりする場合があってUIが古いです。](https://qiita-image-store.s3.amazonaws.com/0/62232/4ffa9561-d5cd-b1bb-28ef-4c46d48f7bd2.png)

## 最新バージョンでバグが有る

ところが、引越し先で最新の WordPress と WordPress Importer プラグインを使っているにもかかわらず、以下のようなエラーが消えませんでした。

```
Strict Standards: Redefining already defined constructor for class WXR_Parser_Regex in xxxxx\wp-content\plugins\wordpress-importer\parsers.php on line 408
Strict Standards: Declaration of WP_Import::bump_request_timeout() should be compatible with WP_Importer::bump_request_timeout($val) in xxxxx\wp-content\plugins\wordpress-importer\wordpress-importer.php on line 38
```

## Trunk からダウンロードすればOK

調べてみたら、Trac にチケットがありました。
余談ですけど報告者の Kim さんって、 Docs チームのメンバーで昨年12月に亡くなった方だ。

https://core.trac.wordpress.org/ticket/24373

これによると、リリースされてないけど `/trunk` のほうにあるプラグインは修正されているので、管理画面からインストールせずに http://downloads.wordpress.org/plugin/wordpress-importer.zip から直接ダウンロードすればいいとのこと。

## もし「ディスクへのファイルの書き込みに失敗しました。」とメッセージが出たら

ネット上には、「パーミッションが間違ってないか確認しましょう」、とか、「php.ini の upload_max を上げましょう」、とか、そういうつまづきに対する助け舟はたくさんあるのですが、それでも解決しない方へ。一時ファイルの保存場所を疑いましょう。

普通のレンタルサーバーでは大丈夫そうですが、今回引き継いだサーバーでは `/tmp` ディレクトリに書き込み権限がないようでした。

今回は php.ini の設定ができるサーバーだったので、php.ini から `/tmp` ディレクトリの場所を指定し、 `/tmp` ディレクトリをブラウザから書き込み可能な権限にしてあげたら動きました。
（php.ini は、レンタルサーバーだと、専用の管理画面から書き換えが必要な場合が多いと思います。）

```
upload_tmp_dir = /（ルートの場所）/wp-content/tmp
```

`/tmp` 自体のパーミッションが変えられるなら、変えてもいいと思うんですけど、どっちのほうがサーバーてきに素敵なんだろう？知ってるひといたら教えて下さい。

ところで、通常は wp-config.php に以下を追加して、`/tmp` の場所が変更できますが、これだとプラグインのアップロードとか、そういうときは大丈夫なんですが、 WordPress Importer プラグインには反映されないみたいです。

`define ('WP_TEMP_DIR', 'DIRECTORY PLACE FROM ROOT');`

反映されたほうがいいような気がするのでチケットをたててみました。
どうだろうかしら。 
[#31976 (WordPress Importer ignore WP_TEMP_DIR in wp-config) – WordPress Trac](https://core.trac.wordpress.org/ticket/31976)
paiza POH enshura #_poh


(続き http://qiita.com/cielavenir/items/f5c3fcc0553ce0751b29)

今回(の本編)は普通の問題であるばかりか、<del>尺取り法のような工夫も必要でないので、多言語展開はやめときました。</del>

あと、Pythonのスライス機能、強いですね。多分Python3の`print(input()[::2])`が最短コード。

```paizapoh5_1.py
#!/usr/bin/python
import sys
if sys.version_info[0]>=3: raw_input=input
print(raw_input()[::2])
```

```paizapoh5_2.rb
#!/usr/bin/ruby
puts gets.to_i.times.map{gets.to_i}.each_slice(7).to_a.transpose.map{|e|e.reduce(:+)}
```

ミッション3は普通に考えてPHPで突破すべきですよねぇ?

```paizapoh5_3a.php
MINAMI
```

```paizapoh5_3b.php
RENA
```

で、本番。IOゲーする必要はなかった気がする。

```paizapoh5_4a.cpp
#include <vector>
#include <cstdio>
char z[9999999];
int get(){
	static int input_count=0;
	int r=0;
	for(;'0'<=z[input_count]&&z[input_count]<='9';)r=r*10+z[input_count++]-'0';
	input_count++;
	return r;
}

int main(){
	fread(z,1,sizeof(z),stdin);
	int W=get(),H=get();
	std::vector<std::vector<int> >m(H);
	for(int h=0;h<H;h++){
		m[h].resize(W);
		for(int w=0;w<W;w++){
			m[h][w]=get();
		}
	}
	for(int w=0;w<W;w++){
		int s=0,h=H-1;
		for(;h>=0;h--)s+=m[h][w]==1;
		for(h=H-1;s>0&&h>=0;h--,s--)m[h][w]=1;
		for(;h>=0;h--)m[h][w]=0;
	}
	for(int h=0;h<H;h++){
		for(int w=0;w<W;w++){
			printf(w<W-1?"%d ":"%d\n",m[h][w]);
		}
	}
}
```

C言語互換とすると、こんな感じ。

```c:paizapoh5_4a.c
#include <stdio.h>
char z[9999999];
int get(){
	static int input_count=0;
	int r=0;
	for(;'0'<=z[input_count]&&z[input_count]<='9';)r=r*10+z[input_count++]-'0';
	input_count++;
	return r;
}

int m[100][100];
int main(){
	fread(z,1,sizeof(z),stdin);
	int W=get(),H=get();
	for(int h=0;h<H;h++){
		for(int w=0;w<W;w++){
			m[h][w]=get();
		}
	}
	for(int w=0;w<W;w++){
		int s=0,h=H-1;
		for(;h>=0;h--)s+=m[h][w]==1;
		for(h=H-1;s>0&&h>=0;h--,s--)m[h][w]=1;
		for(;h>=0;h--)m[h][w]=0;
	}
	for(int h=0;h<H;h++){
		for(int w=0;w<W;w++){
			printf(w<W-1?"%d ":"%d\n",m[h][w]);
		}
	}
}
```

### 結論

本編は多分こっちなんだという結論に。
https://paiza.jp/poh/enshura-special

こちらは納得できる答案を書くのに10時間かかりました。辛かったですが、楽しめました。
こちらのコードは締切後の公開な気がします。多分。

### 追記

ミッションMINAMIは普通の問題でしたが、ミッションRENAは工夫が必要な問題でしたので多言語展開しました。続きの記事からどうぞ。
UITextViewにてPlaceholderを実装する

UITextViewにはUITextFieldのようにPlaceholderが設定できませんので、自作する必要があります。まず、UITextViewを作り、その上にLabelを置きます。TextViewに入力されているかどうかで、このLabelを非表示にすれば、Placeholderとして動きます。

![label.png](https://qiita-image-store.s3.amazonaws.com/0/72150/c74e56f6-b37b-5258-9c17-d55c525a5db7.png)

```swift
    //textviewがフォーカスされたら、Labelを非表示
    func textViewShouldBeginEditing(textView: UITextView) -> Bool
    {
        lbl.hidden = true
        return true
    }
    
    //textviewからフォーカスが外れて、TextViewが空だったらLabelを再び表示
    func textViewDidEndEditing(textView: UITextView) {
        
        if(textView.text.isEmpty){
            lbl.hidden = false
        }
    }
```
eclipseで「Dex Loader Unable to execute dex: Multiple dex files define Lcom/google/ads/Ad;」の対処法

新しいAdmob入れてる時とかになる人も居ると思います・・・
いろんな方法があると思いますが、うちの環境で成功する情報がなかなかなかったのでシェア

###「Dex Loader Unable to execute dex: Multiple dex files define Lcom/google/ads/Ad;」

この時、Eclipseがフリーズしてビルドが進まないなら

##対処法

1 . Eclipseのあるフォルダに行く

Macなら「/Applications/eclipse/Eclipse.app」へGO

appを直接ファインダーで見るには右クリック&パッケージの内容を表示
![スクリーンショット 2015-04-15 14.14.31.png](https://qiita-image-store.s3.amazonaws.com/0/57193/6eed9999-79ff-44ac-d2f9-61b925240b41.png)



2 . eclipse.iniを直接編集
Eclipse配下のContents/MacOS/eclipse.iniを編集します。

3 . 書き換え箇所
eclipse.iniの後ろの方

-Xms40m
-Xmx512m

を

-Xms512m
-Xmx1024m

に書き換えます。

4 . Eclipse再起動

おしまい
Node.js + ClamAVを使って、アップロードされたコンテンツをウイルススキャンする。

Amazon Web Service登場以降、クラウドのストレージがどんどん安くなって、ファイルをアップロード/共有するWebサイトも作りやすくなってきました。

ユーザが任意のファイルをサービスにアップロード・共有が出来るようになってくると、サービス運用として気になるのは、アップロード・共有されたコンテンツが適正なものかどうか、ですね。

ここでは、[ClamAV](http://clamav-jp.sourceforge.jp/)というオープンソースのウイルススキャンツールを使ってスキャンする方法をご紹介します。
ここではシンプルにNode.jsからclamAVを呼び出すところを紹介します。このコードを参考に、アップロードされたファイルをスキャンし、ファイルが汚染されているようなら共有しないようにすると良いです。
実行環境はCentOS 7です。

# ClamAVをインストールする。
ClamAVはyumでインストールできます。

```sh:ClamAVのインストール
# 拡張リポジトリをインストールします。
yum -y install epel-release
# clamavをインストールします。
yum --enablerepo=epel -y install clamav clamav-update 
# コンフィグファイルを有効化します。
sed -i -e "s/^Example/#Example/" /etc/freshclam.conf
# パターンファイルをアップデートします。
freshclam
```
お手軽ですね。

# Node.jsからclamavを呼び出す。
[clamscan](https://github.com/kylefarris/clamscan)という、clamavを呼び出すnpmパッケージがあるので、インストールします。

```sh:npmパッケージのセットアップ
# npmパッケージを初期化します。すでに実行済みであれば必要ありません。
npm init
# ・・・・色々聞かれるので、パッケージ化のための情報を入力します。
# clamscanをインストールします。
npm install --save clamscan
```

あとは、自分たちで作るアプリケーションからファイルスキャンをかけます。

```js:index.js
var clam = require('clamscan')({preference: 'clamscan'});
clam.is_infected(/* スキャンするファイルパス */ process.argv[2], function(err, file, is_infected) {
    if(err) {
        throw err;
    }
    if(is_infected) {
        console.log("ファイルは汚染されています。");
    } else {
        console.log("ファイルはクリーンです。");
    }
});
```
上記例では、スキャンするファイルパスにコマンドライン引数（process.argv[2]）を指定していますが、アップロードされたファイルをチェックする場合は、アップロードされたtempファイルに対してチェックをかけ、汚染されていた場合は即削除してユーザに通知するとよいでしょう。

いかがでしたか？意外と簡単にファイルのウイルススキャンを書けることが出来るとご理解いただけたと思います。
アップロードを伴うサービスを提供するときは、是非参考にしてみてください。
Colorme-WP初期設定（DNS設定編）

## 【Step-1】Colorme-WP管理画面から「DNS設定」を開く
「DNS設定」画面に表示されている「設定ドメイン」（test01.xyz）と「Aレコード」（52.68.43.49）を確認してメモをとる。
（注意）お客様ごとに表示される「設定ドメイン」、「Aレコード」の値は異なる場合があるので必ず「DNS設定」画面からご確認ください
![150415-0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/75450/28195e49-07f9-f2d9-e023-f703681e91c7.jpeg "150415-0001.jpg")

## 【Step-2】カラーミーショップの初期URLを確認する
＊カラーミーショップの初期URLとは契約時に割り当てられた「xxx.shop-pro.jp」のアドレスです。
＊このステップは既にカラーミーショップの初期URLを覚えている方はスキップして頂いて構いません。

カラーミーショップ管理画面より「アカウント・設定」→「ドメイン設定」と進み画面中央辺りに表示されている「xxx.shop-pro.jp」形式のURLを確認してメモをとる。
![150424-0008.jpg](https://qiita-image-store.s3.amazonaws.com/0/75450/dbbbd977-971b-8063-14f1-8e9a86445469.jpeg "150424-0008.jpg")


## 【Step-3】ムームドメイン管理画面から「ムームーDNS設定」を行う
(１)ムームドメイン管理画面から「ムームーDNS設定」をクリックする。
![150415-0008.jpg](https://qiita-image-store.s3.amazonaws.com/0/75450/222eea59-539e-a640-3576-9a2b0e263d32.jpeg "150415-0008.jpg")


(２)【Step-1】で控えた「設定ドメイン」と同じドメインを探して「変更」ボタンをクリックする。
![150415-0009.jpg](https://qiita-image-store.s3.amazonaws.com/0/75450/49aeaefc-439e-ed7f-cf52-a5b49b7454f8.jpeg "150415-0009.jpg")


(３)ムームーDNSの設定を「カスタム設定」に切り替える
![150424-0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/75450/878f8ab4-06c2-baf1-9499-19dea9cb230c.jpeg "150424-0001.jpg")

(４)「設定１」の入力欄と「設定２」の入力欄を下の表のように変更する
![150424-0006.jpg](https://qiita-image-store.s3.amazonaws.com/0/75450/8e0a7e52-5553-8b26-2e89-c633b373b898.jpeg "150424-0006.jpg")

【設定１】

 ドメイン			| 種別			|サービス          |
------------:		|:------------:|:------------:|
(設定ドメイン)		|ホームページ	|利用しない
(設定ドメイン)		|メール			|カラーミーショップ
www．(設定ドメイン)	| ホームページ	|利用しない

【設定２】

| No			| サブドメイン	| 種別			|内容          |
|:-----------|------------:|:------------:|:------------:|
| (自動)      |       (空欄)|     A     |【Step-1】で控えた「Aレコード」
| (自動)      |      www  |    A    |【Step-1】で控えた「Aレコード」


(４)「カスタム設定のセットアップ情報確認画面」の表示を確認してムームードメイン側での設定は終了です。
![150424-0007.jpg](https://qiita-image-store.s3.amazonaws.com/0/75450/21e689cc-e9fd-2300-c680-b2a0d4013224.jpeg "150424-0007.jpg")

## 【Step-4】Colorme-WP管理画面から「DNS設定」を更新する
「shop-proサブドメイン」欄に【Step2】で控えた「ショップのアドレス」を入力して「設定を保存」をクリックする。
＊「Aレコード」欄左側のチェックマークが緑色になってから設定を変更してください。
（ムームーDNSでの設定が完了後しばらくしてからチェックマークは更新されます）

![150424-0010.jpg](https://qiita-image-store.s3.amazonaws.com/0/75450/8227c490-6cc0-c41b-828b-b1e4e74a8204.jpeg "150424-0010.jpg")


## 以上でColorme-WPの「DNS設定」は完了です
設定完了後、実際にページの表示が確認できるまで最大で72時間程度かかる場合があります。
これはインターネット全体にDNS設定が伝達するまでにかかる時間で通常は10分〜1時間程度で表示できるようになります。
（ColorMe-WP管理画面の「DNS設定が完了していません。」と表示されるアラートも設定後、しばらくは表示が続くこともあります）
sublime text > includeファイルを開く > Open-Include > Alt+d

```txt:動作確認
Windows 8.1 pro
Sublime text 2
```

```
#include "file1.h"
...
```
という記載のところでそのファイルを開きたくなった。

Open-Includeというパッケージをインストールする。

カーソルを合わせてAlt+dでそのファイルを開くことができるようになった。
Mac上でpythonを使ってグラフを表示するまで

皆様ごきげんよう。Goodfindエンジニア事務局です。
Macユーザ向けにPythonセミナー用の事前準備をまとめました。

# Pythonのインストール確認
MacではデフォルトでPythonがインストールされております

1. ターミナルを起動
2. ターミナルに python と入力し(Python 2.7.X...) と表示されることを確認
3. exit() と入力し、pythonを終了する

# Xcodeをインストール
(既にインストール済みの方はスキップしてください)
インストールしていない方はこちらを参照して、インストールまで行う。
http://techacademy.jp/magazine/1409

今回はiOSアプリを作成するわけではないので、インストールだけ行う。
「プロジェクトの作成」以降は行わない。


# Command Line Tools for Xcodeのインストール
(既にインストール済みの方はスキップしてください)
http://qiita.com/xtetsuji/items/f373cb10412c68d046a1

# HomeBrewをインストールしていない人はインストール
(既にインストール済みの方はスキップしてください)
brew -v
でHomeBrewのバージョンが表示されればスキップしてOK

http://qiita.com/tokimari/items/c68203f26ab8a903b6f7
を参照してインストールを行う

# matplotlibをインストールする
ターミナル上で以下を実行する

brew install freetype
sudo ln -s /usr/local/include/freetype2 /usr/include/freetype
sudo easy_install pip
sudo pip install matplotlib

matplotlibのインストールまで完了すればOK

## 確認
新規ファイルgraph_example.py をテキストエディタで開き、内容を以下のようにする

```graph_example.py
from numpy import *
import pylab as plt

x = linspace(-10, 10, 100)
y = x

plt.plot(x,y)
plt.show()
```

ターミナルから作成したgraph_example.pyを置いたフォルダへ移動し、
**python graph_example.py** を実行する。
グラフが表示されればOKです。

![スクリーンショット 2015-04-15 13.27.14.png](https://qiita-image-store.s3.amazonaws.com/0/60405/99c65c37-3cc2-ba35-b303-99dbebd166d6.png)