OmniAICreator/Qiita-1.07M huggingface dataset:
QiitaAPIを通じて複数のタグを持つ記事を検索する


Ruby初心者なのでなにかお気づきの点がありましたらご教授いただけると幸いです。

## QiitaApiAccessor
QiitaAPIとの通信, 受信情報のハッシュ化を担当している。
`@result_json`をローカル変数にしたいのだけど, `open`ブロック内のローカル変数になってしまうので出来ない...
`get_with_tag`内のローカル変数にならできるけど結局`result_json = {}`として`open`内で更新みたいな書き方になってしまって綺麗じゃない...

```ruby
require 'open-uri'
require 'json'

class QiitaApiAccessor

  def initialize
    @qiita_url = 'http://qiita.com/api/v2'
    @result_json = {}
  end

  def get_with_tag(tag_name)
    open("#{@qiita_url}/tags/#{tag_name}/items?page=1&per_page=100") do |uri|
      @result_json = JSON.parse(uri.read, symbolize_names: true)
    end
    @result_json
  end

end
```

## QiitaArticle
一つの記事についての情報を保持する。
`has_tag?`メソッドでは, 大文字小文字にかかわらず判定が出来るよう`upcase`を使用している。

```rb
class QiitaArticle
  
  def initialize (article_hash)
    @data = article_hash
    @title = article_hash[:title]
    @url = "http://qiita.com/api/v2/items/#{article_hash[:id]}"
    @tags = article_hash[:tags].map { |tag| tag[:name] }
    @body = article_hash[:body]
  end

  attr_reader :title, :url, :tags, :body

  def has_tag?(tag_name)
    tags = @data[:tags]
    tags.any?{ |tag_info| tag_info[:name].upcase == tag_name.upcase }
  end

end
```

## MultiTagsSearcher
これがメインのクラス。コンストラクタに`QiitaApiAccessor#get_with_tag`の戻り値と検索したいタグのリストを渡してやる。
`group_by_relevance`によって含んでいる対象タグの数によってグループ化する。

```rb
class MultiTagsSearcher

  def initialize(articles_data, tags)
    @articles = articles_data.map { |data| QiitaArticle.new(data) }
    @tags = tags
  end

  attr_reader :articles

  def group_by_relevance
    @articles.group_by do |article|
      @tags.count { |tag| article.has_tag?(tag) }
    end
  end

end
```

## 使い方
`QiitaApiAccessor#get_with_tag`にメインとなるキーワードタグを渡す。
その戻り値と、キーワードタグを含む検索したいタグ名のリストを、`MultiTagsSearcher`に渡して`group_by_relevance`してやる。
すると`含んでいる対象タグ数 => [QiitaArticleのインスタンス]`というハッシュが得られるので、適当に`QiitaArticle#url`とかで記事のurlを取ってこられます。

## 問題点・改善点
QiitaAPIの都合上一度に100件までしか記事の情報を取得できないので, 本当はループで全件取得してから`MultiTagsSearcher`に渡したい。
が、そうすると5000件とか普通に行く場合もあるから`QiitaArticle`のインスタンスが無駄に大量生成されてしまうし、時間もかかる。
なので、検索の際のキーワードタグには記事数の少なそうなものを選ぶことでお茶を濁す...
`ruby`ではなく`sinatra`をキーワードにするだけで結果がかなり違ってくる。
けどそれじゃ根本的な解決になってない。なにか良い方法ありましたら教えて下さい。
勘違いしている人も多そうな読み方が分からないIT用語一覧


## はじめに
自分が困ることや言ってて恥ずかしいことがあるので作りました。

随時更新予定です。特に記載ガイドラインとかは無いので、一人でも読みづらいと思った人がいれば追加する方針です。公式サイト等で規定されている読み方を優先します。複数の読み方があって議論が生じる場合は両方載せます。

## 追加・修正
用語は網羅できておらず、参考URLや概要も不十分ですので、皆さまからの加筆、追加、修正をお待ちしています！
加筆、追加、修正は、用語、読み方を書いて[編集リクエスト](http://qiita.com/drafts/9f12ca42c730f8b962e7/edit)または[コメント](#new_comment)までお願いします。
読み方の記載がある公式（参考）ページURLとその用語の概要も併せて教えていただけると嬉しいです。

## 読み方が分かりづらいIT用語一覧（用語の辞書昇順）
最終更新：2014/10/13

| 用語 | よみかた | ヨミカタ | 参考 | 概要 |
|:----|:--------|:-------|:-----|:--|
| ajax | えいじゃっくす | エイジャックス | [Ajax - Wikipedia](http://ja.wikipedia.org/wiki/Ajax) | ウェブブラウザ内で非同期通信とインターフェイスの構築などを行う技術の総称 |
| alt | おると or あると | オルト or アルト | [ALT - Wikipedia](http://ja.wikipedia.org/wiki/ALT) | キーボードの修飾キーの一つ、HTMLの属性の一つ |
| AngularJS | あんぎゅらーじぇいえす | アンギュラージェイエス | [AngularJS - Wikipedia](http://ja.wikipedia.org/wiki/AngularJS) | Javascriptフレームワーク |
| aws | えーだぶりゅえす | エーダブリュエス | [AWS（日本語）](http://aws.amazon.com/jp/) | Amazon Web Services. 仮想 サーバー、ストレージ、データベース等のクラウドプラットフォーム |
| Chef | しぇふ | シェフ | [Chef](https://www.getchef.com/chef/) | インフラストラクチャ自動化フレームワーク |
| Emacs | いーまっくす | イーマックス | [Emacs - Wikipedia](http://ja.wikipedia.org/wiki/Emacs) | 高機能でカスタマイズ性の高いテキストエディタ |
| Feedly | ふぃーどりー | フィードリー | [Feedly - Wikipedia](http://ja.wikipedia.org/wiki/Feedly) | ニュースアグリゲータアプリケーション・サービス（RSSリーダー） |
| Fizz Buzz | ふぃず・ばず | フィズ・バズ | [Fizz Buzz - Wikipedia](http://ja.wikipedia.org/wiki/Fizz_Buzz) | |
| GIF | ぎふ、じふ | ギフ、ジフ | | |
| Git | ぎっと | ギット | | |
| Haml | はむる | ハムル | | |
| Haskell | はすける | ハスケル | | |
| Hatena | ？ | ？ | | |
| IEEE | あいとりぷるいー | アイトリプルイー | | |
| Java | じゃば | ジャバ | | |
| JSON | じぇいそん | ジェイソン | | |
| LaTeX | らてふ | ラテフ | | |
| New Relic | にゅーれりっく | ニューレリック | | |
| node.js | のーどじぇいえす | ノードジェイエス | | |
| Python | ぱいそん | パイソン | | |
| Qiita | きーた | キータ |  |  |
| Skype | すかいぷ | スカイプ | | |
| SQL | えすきゅーえる | エスキューエル | | |
| Tableau | たぶろー | タブロー | | |
| TeX | てふ | テフ | | |
| Unity| ゆにてぃ | ユニティ | | |
| Ustream | ゆーすとりーむ | ユーストリーム | | |
| vagrant | べいぐらんと | ベイグラント | | |
| Wi-Fi | わいふぁい | ワイファイ | | |
| vim | う゛ぃむ | ヴィム | | |
Linuxのシステムコール番号を探す

システムコール番号の探し方のメモ。たまに必要になるので。
（記事のタグはCentOS7だけれど、CentOS6.5でも同じ）

# 一覧をダンプする

```
$ ausyscall --dump
Using x86_64 syscall table:
0       read
1       write
2       open
3       close
.
.
.
```

# ピンポイントで表示

## 名前->番号

```
$ ausyscall fork --exact
57
```

## 番号->名前

```
$ ausyscall 32
dup
```

## アーキを指定

番号はアーキによって違うので！

```
$ ausyscall x86_64 fork
fork               57
vfork              58

$ ausyscall i386 fork
fork               2
vfork              190
```

# 定義ファイルを探して参照

```
$ grep 'define *__NR_fork' /usr/include/ -r
/usr/include/asm/unistd_32.h:#define __NR_fork 2
/usr/include/asm/unistd_64.h:#define __NR_fork 57
/usr/include/asm/unistd_x32.h:#define __NR_fork (__X32_SYSCALL_BIT + 57)
/usr/include/asm-generic/unistd.h:#define __NR_fork 1079

$ head /usr/include/asm/unistd_64.h
#ifndef _ASM_X86_UNISTD_64_H
#define _ASM_X86_UNISTD_64_H 1

#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
#define __NR_fstat 5
#define __NR_lstat 6
```
Welcartで郵便番号から県名、住所を自動入力

WordPressのECサイト構築プラグイン、「Welcart」で郵便番号入力から自動で県名、住所を入力してくれるようにします。
と言っても、自力でどうにかする訳ではなく以下のAPIにお世話になります。
[ajaxzip3 - 郵便番号検索API, JSONP対応 これで郵便番号のメンテナンス作業から解放されます。 - Google Project Hosting](https://code.google.com/p/ajaxzip3/)

##フィルターを追加
アドレスフォームを出力する部分のフィルターで以下のコードを追加します。
フォーム毎にinput:name名が違うので、それを合わせてやります。

```lang:func.php
add_filter( 'usces_filter_apply_addressform', 'zip2addr_jp', 10, 3);
function zip2addr_jp($formtag, $type, $data){
  $pref_name = $type.'[pref]';
  $addr_name = $type.'[address1]';
  $js =<<<END
<script src="http://ajaxzip3.googlecode.com/svn/trunk/ajaxzip3/ajaxzip3.js" charset="UTF-8"></script>
<script>
jQuery(function($) {
  $('#zipcode').change(function() {
    AjaxZip3.zip2addr(this, '', '$pref_name', '$addr_name');
  });
});
</script>
END;
  return $formtag.$js;
}
```

httpsで使う場合は

```
<script src="http://ajaxzip3.googlecode.com/svn/trunk/ajaxzip3/ajaxzip3.js" charset="UTF-8"></script>
```

の部分を

```
<script src="https://ajaxzip3.googlecode.com/svn/trunk/ajaxzip3/ajaxzip3-https.js" charset="UTF-8"></script>
```

と、してください。
###追記
住所を自動入力した後フォーカスが住所欄にあるのですが、これを次の番地入力欄に移動させるやり方がわかりません。
rsyncとsshでCORESERVERへデプロイする個人的メモ

# デプロイコマンド サンプル 

### 実行元PCの /localディレクトリ以下（localディレクトリ含まず）を、リモートの ~/public_html/ 以下へデプロイ

```デプロイ（dryrun）.
rsync -e ssh -avzur --dry-run --delete --checksum --exclude-from=/local/.rsyncignore /local/ username@hoge.coreserver.jp:~/public_html/
```

## 実際どうなるか

### ローカル
/local/hoge/fuga.txt

### リモート
~/public_html/hoge/fuga.txt


こんな感じ。

# 指定オプションについて

> 参考になるページ
> [はじめてrsyncを使う方が知っておきたい6つのルール](http://www.itmedia.co.jp/enterprise/articles/0804/21/news013.html)

### -e
確認中

### -avzur
確認中

### --dry-run
実際には実行せずに、rsync対象となるファイル一覧が表示`だけ`される

### --checksum
rsync元とrsync先に同一ファイルが存在する場合に、その２つのファイルに差分があるときのみrsync対象とするもの

### --delete
rsync元にはなくて、rsync先には存在するファイルがあれば、削除する

### --exclude-from
指定したファイルに記載されているルールで、rsync対象に含めたり除外したりできる

>参考
>http://weble.org/2012/06/05/rsync-exclude-from

指定する際のファイル名は何でもOK（勝手に .rsyncignore にしただけで、hoghoge でもなんでも）


#### 指定ファイルの中身のサンプル

.rsyncignore

```
#basic
- .DS_Store
- .git
- .gitignore
- .rsyncignore
- .buildpath
- .project
- .settings
- .fast-cgi-bin
- README.md

#cache
- cache
- compile
- data
```

\-を先頭につけると除外で
+を先頭につけると含める っていう意味らしい？
Ionic + Androidでアプリアイコンとスプラッシュを設定する

各ドキュメントに書かれてる手順がバラバラでつらかったので成功した手順を記載しておく


config.xmlを以下のように設定

```xml:config.xml
<platform name="android">
    <icon src="www/res/android/icon/ldpi.png" density="ldpi" />
    <icon src="www/res/android/icon/mdpi.png" density="mdpi" />
    <icon src="www/res/android/icon/hdpi.png" density="hdpi" />
    <icon src="www/res/android/icon/xhdpi.png" density="xhdpi" />
</platform>
```

アイコンのpngをwww/res/android/以下に置く

```
$ cp youricon_idpi.png www/res/android/icon/idpi.png
$ cp youricon_mdpe.png www/res/android/icon/mdpi.png
$ cp youricon_hdpi.png www/res/android/icon/hdpi.png
$ cp youricon_xhdpi.png www/res/android/icon/xhdpi.png
```

また、3.6系のcordovaから、splashscreenも同様の方法で設定できるように改修されたようです

```xml:config.xml
<platform name="android">
    <splash src="www/res/android/splash/ldpi.png" density="ldpi" />
    <splash src="www/res/android/splash/mdpi.png" density="mdpi" />
    <splash src="www/res/android/splash/hdpi.png" density="hdpi" />
    <splash src="www/res/android/splash/xhdpi.png" density="xhdpi" />
</platform>
```
That's all.
設定アプリに、アプリの設定画面追加



標準アプリの設定アプリに、アプリごとに設定する画面があると思います。
ここに自分のアプリの設定画面を作るソースを公開しました。

https://github.com/ppengotsu/iOSSettingConfig


上記からソースコードを落としてきてください。
設定手順は下記のようになります

# 1 ソースコードを自分のプロジェクトに追加
Settingグループにあるファイルを、そのままの構造で自分のプロジェクトディレクトリに追加してください。Finderでコピーして、プロジェクト追加するといいと思います。

![スクリーンショット 2014-10-13 15.45.48.png](https://qiita-image-store.s3.amazonaws.com/0/24266/6769e20b-c82e-c4f6-83bd-f77a56c6ab37.png "スクリーンショット 2014-10-13 15.45.48.png")

また、「PPESettingsManager」ファイルも入っているはずなので、それも追加してください

#2 run scriptの追加
下記のスクリーンショットのように、追加してください
![runscript.png](https://qiita-image-store.s3.amazonaws.com/0/24266/f3938fde-044c-8387-7eb2-455cec7a4e09.png "runscript.png")

これは、１で追加した「run_settingsconfig.sh」をビルドごとに実行する設定です。

# 3 自分のプロジェクトから書き込んだり読み込んだりする
ViewControllerファイルにサンプルを書いたので、それを参照してください。
![viewcon.png](https://qiita-image-store.s3.amazonaws.com/0/24266/6057a0f5-86f9-1692-561e-7114e9ae7eb0.png "viewcon.png")
以上、ざっくりした説明でした。なにか疑問がありましたら、コメントで。
DropBox Core APIをPythonで使ってみる


一眼で撮った写真の保存場所をDropBoxに変えたので、プログラムでファイルアップロードを一気にやったり、ファイル一覧を取得してファイルが全部上がったかを確認したりしたかったので、DropBox APIを使ってみました。

付いていたサンプルコードを動かしてみたけど、このサンプルコードをちょっといじるだけで、やろうとしてた事がいろいろ出来る気が・・・・。

とりあえず、今回はDropBox APIのインストールと、サンプルコードの動かし方メモ。



#環境
OS:Mac OS X 10.9.5
Python:Ver.2.7.7
DropBox Core API:Version 2.2.0

##サンプルアプリを動かすための事前準備
DropBox APIを使うためには **App key**と **App secret**を手に入れる必要があります。
1.WebブラウザからDropBoxにログイン
2.画面の下にある「・・・」ボタンを開き「デベロッパー向け」を押下
3.左メニューの「App Console」を押下
4.「Create App」を押下し、以降、必要事項を入力

 * サンプル(今回登録した値)
   
  * What type of app do you want to create?:**Dropbox API app**
  * What type of data does your app need to store on Dropbox?:**Files and datastores**
  * Can your app be limited to its own folder?:**YES**
  * What type of files does your app need access to?:**All file types**
  * Provide an app name, and you're on your way.:**アプリ名**
 
5.一番下の「Create App」を押下して登録

**App key**と **App secret**が手に入ります。

##DropBox APIのインストール
[Pythonの仮想環境を構築できるvirtualenvを使ってみる](http://qiita.com/H-A-L/items/5d5a2ef73be8d140bdf3)で試した、virtualenvを使ってDropBox用の仮想環境を作ります。

1.プロジェクトのディレクトリを作成

```console
$ mkdir DropBoxAPI_Test
```

2.virtualenvコマンドを実行

```console
$ virtualenv --no-site-packages DropBoxAPI_Test
```
3.仮想環境 起動

``` console
$ cd DropBoxAPI_Test
$ source bin/activate
```
4.DropBox APIをインストール

```console
$ pip install dropbox
```

DropBox APIが使える環境が完成しました。

##サンプルアプリの実行
1. [Install Core API SDKs](https://www.dropbox.com/developers/core/sdks/python)のPythonを選び、 ***Download Python SDK***という所からPython用のSDKをダウンロードします。（現バージョン:dropbox-python-sdk-2.2.0.zip）
2. ダウンロードしたdropbox-python-sdk-X.X.X.zipを展開
3. **cli_client.py**をさっき作ったDropBoxAPI_Testにコピー
4. cli_client.pyを実行

``` console
(PythonTest)% python cli_client.py
```
5.以下のようなターミナル風の出力がされれば完了

``` console
[loaded OAuth 2 access token]
Dropbox>
```

##その他
サンプルは実際のターミナルのような動きができます。

まずログインをしてAuthKeyを取得します。

```console
Dropbox>login
1. Go to: https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id=XXXXXXXXXXXXXXXXX
2. Click "Allow" (you might have to log in first).
3. Copy the authorization code.
Enter the authorization code here:
```
　1.に書いてあるURLにブラウザからアクセスし、「許可」を押下するとコードが表示されます。表示されたコードを入力してエンターを押すと認証が完了します。

```console
Enter the authorization code here:XXXXXXXXXXXXXXXX
```
認証が成功するとログは何も出ずにターミナルの状態になります。

```console
Dropbox>
```
###一覧取得
```console
Dropbox>ls
```

###ディレクトリ移動
```console
Dropbox>cd ディレクトリ名
```

###削除
```console
Dropbox>rm ファイル名
```
mkdir、mvなど他にもいろいろ、このサンプルだけで簡単なファイル操作ができます。
ArchLinuxで色々インストールしてみた


```bash:好みのパッケージをインストール
pacman -S \
  xorg-server xorg-xinit xorg-xrdb xf86-video-intel xterm rxvt-unicode ttf-sazanami \
  slim awesome \
  ntp vlc ranger \
  w3m tig w3m \
  unzip unrar \
  zsh screen \
  docker lxc \
  xf86-video-vesa xf86-input-vmmouse xf86-video-vmware
```

## Xの設定

```bash:~/.Xresources
XTerm*utf8              : 1
XTerm*locale            : true
XTerm*selectToClipboard : true
XTerm*faceName          : 'Sazanami Gothic'
XTerm*faceSize          : 13
XTerm*cjkWidth          : true
XTerm*background        : black
XTerm*foreground        : white
XTerm*saveLines         : 2000
XTerm*geometry          : 100x30+500+200
```

```bash:~/.xinitrc
if [ -d /etc/X11/xinit/xinitrc.d ]; then
  for f in /etc/X11/xinit/xinitrc.d/*; do
    [ -x "$f" ] && . "$f"
  done
  unset f
fi

xrdb ~/.Xresources
xterm &
exec awesome
```

```bash:awesome
mkdir ~/.config/
cp -a /etc/xdg/awesome/ ~/.config/

sed -ie 's/"Mod4"/"Mod1"/' ~/.config/awesome/rc.lua
# Mod4(Windowsキー)がない場合、Mod1(Altキー)に置換。
```

```bash:/etc/X11/xorg.conf.d/10-keyboard.conf
Section "InputClass"
    Identifier       "Keyboard Defaults"
    MatchIsKeyboard  "yes"
    Option           "XkbLayout" "jp"
EndSection
```

```bash:/etc/slim.conf
default_user vagrant
auto_login yes
```

* systemctl enable slim

```bash:/etc/inputrc
set bell-style none
```

* ログインしなおすと端末のbeep音無効が確認できる。

# 色々インストールしてみた

## Gnome3

```bash:
pacman -Sy xf86-video-intel gdm gnome-extra freerdp gnome-terminal gnome-tweak-tool
systemctl start gdm
```

## docker

```bash:docker
systemctl start docker
systemctl enable docker
docker pull ubuntu
```


## kvm

```bash:
pacman -Sy virt-manager qemu libvirt dnsmasq dmidecode ebtables
pacman -Sy tigervnc
```

* [archLinux - virt-managerを動かすときハマった点 - Qiita](http://qiita.com/tukiyo3/items/2a96e2dab51dd50b94ae)

## virtualbox

```bash:
pacman -Sy packer
pacman -Sy virtualbox{,-guest-iso,-ext-vnc,-host-dkms} net-tools linux-headers qt4
sudo dkms autoinstall
```

## packer-io

```bash:
yaourt packer-io
```

## vagrant

```bash:
pacman -Sy vagrant
```

## cinnamon

* cinnamonはgnome3のフォーク。
* -geometry 1366x768ではなく-geometry 1360x768というところがミソ

```bash:
pacman -Sy cinnamon cinnamon-desktop tigervnc ttf-sazanami gnome-terminal
vncserver :1 -geometry 1360x768
export DISPLAY=:1
cinnamon-session-cinnamon2d
```

## google-chrome

```bash:
packer google-chrome ttf-google-fonts-git
```

# その他

## 不要なキャッシュのクリア

```bash:
pacman -Scc
```


## カーネルが認識しているハードウェア一覧

```bash:
lspci -k
```
Grape + Railsで、Jbuilderを使ったJSONフォーマットAPIを作る


Rails4から事実上標準になったっぽいJbuilderを使って、Grape+RailsなWebAPIのJSONフォーマットを柔軟に作ってみる。has_manyなどで深い階層のモデルを使ってAPIを作ると面倒くさいことが多いんだけど、Jbuilderならシンプルに書くことが出来る。

他のGemでActiveModel::Serializersっていうのもあったけど、こっちはモデルで出力フォーマットを定義していくタイプっぽくて、複雑なJSONフォーマットにしようとすると面倒。Viewで定義できるJbuilderの方が良さげ。ActiveModel::SerializersはモデルとAPIが1対1の時に良いのかも。

# 前提

- Rails v4.1
- grape v0.9.0
- grape-jbuilder v0.2.0

## Gemfile

```ruby:gemfile
gem 'jbuilder'
gem 'grape'
gem 'grape-jbuilder'
```

```bash:command
$ bundle install
```

# Jbuilderを使ってJSONフォーマットを作ってみる

## GrapeとJbuilderの準備

自動読み込み対象に/api/ディレクトリを追加。そして、JbuilderのViewパスを設定する。

```ruby:config/applications.rb
module Samples
  class Application < Rails::Application

    config.paths.add "app/api", glob: "**/*.rb"
    config.autoload_paths += %W(#{config.root}/app/api)

    config.middleware.use(Rack::Config) do |env|
      env['api.tilt.root'] = Rails.root.join 'app', 'views', 'api'
    end

  end
end
```

ルーティングも適当に設定。

```ruby:config/routes.rb
mount API => "/api"
```

## APIコントローラ

formatterをJbuilder指定して、各アクションにテンプレートファイルを指定してあげればOK。

```ruby:app/api/article.rb
class API < Grape::API
  format :json
  formatter :json, Grape::Formatter::Jbuilder

  get '/', jbuilder:'article/index' do
    @articles = Article.all
  end
end
```

## Jbuilderテンプレート

`json.ほげ`で、JSONのキーを割り当てられる。キーを割り当てたくない場合は`json.(@articles)`のようにしてあげれば直下に配置される。

```ruby:app/views/api/article/index.jbuilder
json.articles @articles do |article|
  json.(article, :id, :title)
end
```

```javascript:result
{
	articles: [
		{
			"id": 1,
			"title": "hoge",
		},
		{
			"id": 2,
			"title": "piyo",
		}
	]
}
```

これで、非常に簡単に複雑なJSON APIを作ることができそう。

Jbuilderの書き方は本家のREADMEを読めばだいたい分かる。

- https://github.com/rails/jbuilder
お茶の間で常についてるテレビの代わりにTEDを延々と流すアプリを作る

テレビはコンテンツが好きではない、だけどなにか常に流していたいのでそんなアプリを作りました。
[vespid/TEDTV2.0](https://github.com/vespid/TEDTV2.0)

### 実装

TEDのYouTubeチャンネルをRSSで取得してきて、そこから動画IDをぶっこぬいて再生、ひとつの動画が終了したら次を再生、以下繰り返し。

とってきているURLはこれ http://www.youtube.com/rss/user/TEDtalksDirector/videos.rss
YouTubeなのでURLを入れ替えればTED以外にもなんでも再生できる。

### 使っているPods

#### [KissXML](https://github.com/robbiehanson/KissXML)

XMLのパーサー。使いやすくていつも入れている。
自分のとこでカテゴリも作ってて要素にアクセスしやすく作ってある。
[XMLDictionary](https://github.com/nicklockwood/XMLDictionary) なんかも良いんだけど、ネイティブの配列や辞書にパースし直す性質上、構造が変化するからバグを生みやすい。

#### [youtube-ios-player-helper](https://github.com/youtube/youtube-ios-player-helper)

YouTubeのプレイヤービュー。動画IDを入れればすぐ再生できる。
なおかつ、コードから再生、停止のコントロールが出来たり、delegateでステータスの変更が通知されてくるから、「再生終了したら次を再生」の処理が簡単に書けた。
はまりポイントもなく抽象化してあって良いライブラリだった。


[追記]
YouTubeのチャンネルにはそもそも連続再生機能がついてることが判明した( -.-)

youtube-ios-player-helperで動画を再生したあとにデバイスを回転させると、landscapeとportraitが逆になる謎のバグが起きる
Macに慣れていない頃にRubyのインストール設定したことの整理


まだMacに慣れていない頃に、理解もせずに色々ネットで調べるがままに`ruby`のインストールや設定を行ったので、改めて環境整理するための覚え書き。
何をインストールするために、何をインストールして、何によって何をインストールされたかが不明状態だったので知識と開発環境整理。

##環境
PC: MacOS X 10.9.4


##Homebrew

`Mac`に標準でインストールされていない必要なものをインストールしてくれるツール。
`MacPort`というツールは、結構Mac環境をめちゃくちゃにするらしいので、高評判の`Homebrew`を使うと良い。

[http://brew.sh/index_ja.html](http://brew.sh/index_ja.html)

`Homebrew`は、`ruby`スクリプトでインストールする。`Mac`にはデフォルトの`ruby`が入っているはずなのでそのまま下記のコマンド。


```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

ちなみに下記は`Homebrew`アンインストールコマンド。

```
rm -rf /usr/local/Cellar /usr/local/.git && brew cleanup
```

試しに`Homebrew`で`ruby`をアップグレードしてみる。

```
$ brew upgrade ruby
```

`/usr/local/Celler`以下に一式インストールされた。


その他、私のPC環境で`Homebrew`でインストールしたものの一覧

```
$ brew list
autoconf	libyaml		pkg-config	readline	scala
ceylon		mogenerator	python3		ruby		sqlite
gdbm		openssl		rbenv		ruby-build	xz
```

###※※注意事項※※

**riocampos様** *のご指摘で、下記の`Homebrew`による`ruby-build`のインストールによって`rbenv`管理下に`ruby`がインストールされるようなので、上記の`Homebrew`による`ruby`のインストールは必要ないようです。ご指摘ありがとうございました。*


##Rubyバージョン管理ツール
###rbenv

`Homebrew`で`ruby`をインストールしただけではパスが通っていないため、バージョン管理ツールで管理する。`rbenv`も`RVM`も`ruby`のバージョン管理ツール。どちらかの選択で良い。
私の環境ではどちらを使用していたか不明。整理する意味で今後は`rbenv`にする。

現在使用している`ruby`のバージョンを表示。

```
$ ruby -v
ruby 2.0.0p451 (2014-02-24 revision 45167) [universal.x86_64-darwin13]
```

`~/.bash_profile`に下記の記述があるか確認。無い場合は記述する。

```~/.bash_profile
eval "$(rbenv init -)"
```

ちなみに、下記`~/.rbenv`ディレクトリ内が主要ファイル。


インストール可能な`ruby`のバージョンを一覧表示。

```
$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  
  ・・・中略・・・
  
  2.1.2
  2.1.3
  2.2.0-dev
  2.2.0-preview1
  ree-1.8.7-2012.01
  ree-1.8.7-2012.02
  topaz-dev
```

`ruby`のバージョンを指定してインストール。

```
$ rbenv install 2.1.3
Downloading ruby-2.1.3.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/0818beb7b10ce9a058cd21d85cfe1dcd233e98b7342d32e9a5d4bebe98347f01
Installing ruby-2.1.3...
Installed ruby-2.1.3 to /Users/tajihiro/.rbenv/versions/2.1.3
```

`ruby`の使用するバージョンを指定。

```
$ rbenv global '2.1.3'
```

`.bash_profile`を再度読み込んで、`ruby`のバージョンを表示。

```
$ source ~/.bash_profile
$ ruby -v
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]
```

とりあえず`ruby`のインストールを整理した。
ここまで来てたが、`Homebrew`でインストールした`ruby`と`rbenv install`でインストールしたも`ruby`が同じものであるか不明。おそらく別物?

現在判明しているのは下記の`ruby`達。

```
$ /usr/local/bin/ruby -v
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]

$ /usr/local/Cellar/ruby/2.1.3/bin/ruby -v
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]

$ ~/.rbenv/shims/ruby -v
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]
```
Eclipse Android SDK Content Loader hangs at 0% まとめ

EclipseでAndroid開発をしている人なら経験があろう，Eclipse起動時にContents Loader が0%で止まってしまい，作業ができなくなってしまう悪名高きバグ．あのときのイライラ感と言ったら・・・
あまりにも頻繁に起こるので，対処法をまとめてみた．

1. Run Eclipse -Clean
一番簡単な対処法．プラグイン追加後などに，起動オプションとして"-clean"を指定する．調べると大抵出て来るけど，自分自身はこれで解決したことが一回もない．

2. adb kill-server, adb start-server
Android Debug Bridgeの再起動コマンド．上同様自分はこれで解決したことなし．

3. delete all files in .projects
かなり有効な解決手段．workspace\.metadata\.plugins\org.eclipse.core.resources\.projectsのフォルダ内の全てのファイルを削除し，eclipseを再起動するとほぼ確実に解決する．**しかし，その代償としてworkspace以外のディレクトリにあるプロジェクトの参照が消えるので，削除する前に.projects内のファイルのバックアップを取っておき，eclipse再起動後にファイルを元に戻す必要がある．**
この方法は長い間使ってきたが，確実に解決するけど面倒臭い

4. delete cache, ddms.cfg
最近見つけた対処法．**%USERPROFILE%\.android内にあるcacheフォルダの中身とddms.cfgファイルを削除し，再起動．**非常にスマートな解決法で，**この方法が一番おすすめ**．stack overflowでも賞賛のコメントが大量についており，素晴らしい対処法であることが伺える．

総括
**とりあえず4の対処法でok．**それでだめなら3．
これで皆が救われることを祈る．

参考: http://stackoverflow.com/questions/13489141/eclipse-hangs-at-the-android-sdk-content-loader
OpenCVのC++コードをMacでmakeする際のMakefile


コード
---

```mf
# コンパイラを指定
CC :=g++
# インクルードファイル等
CFLAGS :=`pkg-config opencv --cflags` `pkg-config opencv --libs`
LDFLAGS :=
# ディレクトリ内の全てのC++ファイルをコンパイル
SOURCES :=$(wildcard *.cpp)
# C++ファイルの.cppをとったものを実行ファイルの名前とする
EXECUTABLE :=$(SOURCES:.cpp=)

all:$(EXECUTABLE)

$(EXECUTABLE):$(SOURCES)
	$(CC) $< $(LDFLAGS) $(CFLAGS) -o $@

clean:
	rm -rf $(EXECUTABLE)
```

使用例
---

```bash
$ ls
Makefile  mat.cpp
$ make
g++ mat.cpp  `pkg-config opencv --cflags` `pkg-config opencv --libs` -o mat
$ ./mat
```
hamlでphpテンプレおなじみのヒアドキュメント的な書き方をするには

こう書きます。

```haml

:plain
私わたくしはその人を常に先生と呼んでいた。
だからここでもただ先生と書くだけで本名は打ち明けない。
これは世間を憚はばかる遠慮というよりも、その方が私にとって自然だからである。
私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる。
筆を執とっても心持は同じ事である。
よそよそしい頭文字かしらもじなどはとても使う気にならない。

```

rubyコードの場合はこうなります

```haml

:ruby
japanese_popular_writers = [
  {name: "夏目漱石", major_title: "こころ"},
  {name: "村上春樹", major_title: "ノルウェイの森"},
  {name: "川端康成", major_title: "雪国"},
  {name: "三島由紀夫", major_title: "豊穣の海"},
  {name: "吉川英治", major_title: "宮本武蔵"},
]

```

他にもこんなフォーマットが指定できるようです。

:coffee
:css
:sass
:scss
:erb
:javascript
:markdown
Python+Matplotlibでプロットアニメーションを作成する

コード
---

```python
import numpy
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import mpl_toolkits.mplot3d.axes3d as p3

def plot_3D_animation(X, Y, Z, n_frame=None,
                      xlim=None, ylim=None, zlim=None,
                      step=None, saveanime=None, show=True):
    """3D plotting animation"""
    fig = plt.figure()
    ax = p3.Axes3D(fig)

    if step is None:
        step = 1
    X = X[range(0, len(X), step)]
    Y = Y[range(0, len(Y), step)]
    Z = Z[range(0, len(Z), step)]

    data = [numpy.vstack((X, Y, Z))]

    lines = [ax.plot(dat[0, 0:1], dat[1, 0:1],
                     dat[2, 0:1])[0] for dat in data]

    # Setting the axes properties
    if xlim is None:
        ax.set_xlim3d([X.min(), X.max()])
    elif len(xlim) == 2:
        ax.set_xlim3d(xlim)
    ax.set_xlabel('X')
    if ylim is None:
        ax.set_ylim3d([Y.min(), Y.max()])
    elif len(ylim) == 2:
        ax.set_ylim3d(ylim)
    ax.set_ylabel('Y')
    if zlim is None:
        ax.set_zlim3d([Z.min(), Z.max()])
    elif len(zlim) == 2:
        ax.set_zlim3d(zlim)
    ax.set_zlabel('Z')
    ax.set_title('3D animation')
    ax.view_init(-10, 30)

    def update_lines(num, dataLines, lines):
        for line, data in zip(lines, dataLines):
            line.set_data(data[0:2, :num])
            line.set_3d_properties(data[2,:num])
        return lines

    if n_frame is None:
        n_frame = len(X)

    # Creating the Animation object
    anim = animation.FuncAnimation(fig,
                                   update_lines,
                                   n_frame,
                                   fargs=(data, lines),
                                   interval=1,
                                   blit=False)

    if type(saveanime) == str:
        writer = animation.FFMpegWriter()
        anim.save(saveanime, writer=writer)

    if show is True:
        plt.show()

    plt.clf()
    plt.close()
```

使い方
---

```bash
>>> import numpy as np
>>> X, Y, Z = np.array([1,2,3]), np.array([2,3,4]), np.array([4,5,6])
>>> plot_3D_animation(X, Y, Z)
```

使用例
---
* [3Dプリンターのプロットシミュレーション](https://www.youtube.com/watch?v=ZJ2nRWYOFkk)
* https://github.com/ut-3dprinter/ut-3dprinter/tree/master/Software
Python+OpenCVでカメラキャプチャ

コード
---

```python
import cv2
def capture_camera(mirror=True, size=None):
    """Capture video from camera"""
    # カメラをキャプチャする
    cap = cv2.VideoCapture(0) # 0はカメラのデバイス番号

    while True:
        # retは画像を取得成功フラグ
        ret, frame = cap.read()

        # 鏡のように映るか否か
        if mirror is True:
            frame = frame[:,::-1]

        # フレームをリサイズ
        # sizeは例えば(800, 600)
        if size is not None and len(size) == 2:
            frame = cv2.resize(frame, size)

        # フレームを表示する
        cv2.imshow('camera capture', frame)

        k = cv2.waitKey(1) # 1msec待つ
        if k == 27: # ESCキーで終了
            break

    # キャプチャを解放する
    cap.release()
    cv2.destroyAllWindows()
```

使い方
---

```
$ python
>>> capture_camera()
```
rbenv: no such command `install&#39;エラー


`Homebrew`で`ruby-build`がインストールされているはずなのにエラー。

```
$ rbenv install -l
rbenv: no such command `install'
```

`Homebrew`で`ruby-build`の再インストール。

```
$ brew uninstall ruby-build
Uninstalling /usr/local/Cellar/ruby-build/HEAD...

$ brew install ruby-build
==> Downloading https://github.com/sstephenson/ruby-build/archive/v20140926.tar.gz
######################################################################## 100.0%
==> ./install.sh
?  /usr/local/Cellar/ruby-build/20140926: 129 files, 552K, built in 3 seconds
```

正常に動作するようになった。

```
$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  
  ・・・中略・・・
  
  2.1.2
  2.1.3
  2.2.0-dev
  2.2.0-preview1
  ree-1.8.7-2012.01
  ree-1.8.7-2012.02
  topaz-dev
```
Probook 4230sでVirtualboxを使おうとするとVT-xなんたらのエラーの時の対処法

Virtualboxを使うためにはCPUのVT(Virtualization Technology)というかっこいい名前の設定をオンにしないといけないのですが標準でオフになってるPCが多いのでBiosで設定する必要があります。

## Probookの問題点

Probookの似たような型番のBiosだと Virtualization Technology のON/OFF設定がDeviceの比較的みつかりやすいところにあるのですが、それとは別にSecurity設定の VT-d を `View` から `Change`に変えてやらないといけません。ホントわかりにくところにあるんです、これ！

しかも、その設定をして普通に起動しても使えないままで電源を完全に落として少し放置しないと使えないんですよ、これが。俺の時間を返せ！

PCごとに設定場所がちょっとずつ違って情報が少ないのでこういうのにハマるとヘタするとPC買い換える必要まで出てくるので、そんな人が一人でも減るようにここに残しておきます。

## 参考

http://h30434.www3.hp.com/t5/Other-Notebook-PC-Questions/Why-won-t-my-ProBook-4530s-64-bit-run-a-64-bit-VM/td-p/947867
FactoryGirl - こうしたいときはこうする

### 関連先モデルも同時に作成したい
* association 先に別の FactoryGirl を指定する
* strategy に注意
  * id がふられないと困るものには `create`、そうでないものには `build` を指定する

### モデル `build` 直後にある処理を行い、属性値を決めたい
* fter_build コールバックを使え

### モデル create 直後にある処理を行い、属性値を決めたい
* after_create コールバックを使え

### ある特定の属性値を持ったモデルが欲しい
* inheritance を使え

### ある特定の関連モデルを持ったモデルが欲しい
* trait を使え

### 作成時に引数を与え、属性値を動的に指定したい
* ignore を使え

### 全体の記述方針はどうすればいいのか
* モデルの正当性を保つために最低限必要な関連先モデルは自動で作成
* その他テストのごとに必要な関連が変わる場合には、何を持つかという情報を trait で指定する
* 作成時に引数を渡すことで変更できると特に便利な属性値は、ignore な属性値を利用し、どの FactoryGirl 定義上からでも同じインターフェイスで指定できるようにしてある
* inheritance でモデルの種類を決め、trait で調整して望みの状態を指定する
ActiveAndroidで事前にdbを用意した場合にPK列を指定する方法


ActiveAndroidはModelだけ記述していけば、初回にテーブルも作ってくれますが
今回は**事前にdbファイルを用意してassets配下に置いた場合**の話

その際の注意事項として

**PKをidにリネームしてください**

と[公式wiki](https://github.com/pardom/ActiveAndroid/wiki/Pre-populated-databases)には書かれています

が、めんどいって思ったのでなんか対応方法無いか探ってみました

## Tableアノテーションで指定可能だったりする？

他のORMでいくとテーブルの設定のとこでPK列の指定もできるので
そこら辺りのソースをみてたら、それっぽいのがありました

ってことで、一応TableアノテーションでPKの列指定は可能っぽい

```java:Item.java

@Table(name = "items", id = "item_id")
public class Item extends Model {

    @Column(name = "item_id", notNull = true)
    public int itemId;  // PK

    @Column(name = "name", notNull = true)
    public String name;
}

```

これで大丈夫そうです
`item.getId()`でも`item.itemId`でも同じ値が返ってきます

この指定をせずに`item.save()`とかすると、
insert文に自動的に`Id`列が付加されて、
**そんな列名ありませんエラー**で落ちます

## 指定した列がA/Iの場合

今回の例でいうと`item_id`が**auto increment**設定だった場合です
上記のModel設定のまま

```java:sample.java

Item item = new Item();
item.name = "hoge";
item.save();

Item item2 = new Item();
item2.name = "hogehoge";
item2.save();

```

という感じで保存すると、発行される1回目のsqlは
`insert into items (item_id, name) values (0, "hoge");`
という感じ
そして2回めは
`insert into items (item_id, name) values (0, "hogehoge");`
となって**auto increment**が効きません
(なので、上記例は2回目でpriamry違反で落ちます)

ということでちょっとModel設定を変える必要があります

```java:Item.java

@Table(name = "items", id = "item_id")
public class Item extends Model {

    // notnull制約を外して、nullを持てるようにintからIntegerへ
    @Column(name = "item_id", notNull = false)
    public Integer itemId;  // PK

    @Column(name = "name", notNull = true)
    public String name;
}

```

こういう設定をして先ほどのように保存すると
ちゃんと**auto increment**が有効になります

ただ、いくらModel上の話とはいえ…
PK列なのにnot null制約を外してnull保持できるようにするっていうことになって
凄く気持ち悪いので、公式wikiがかいてあるとおり、idにリネームするほうが良い気がします(笑)
(結局内部でもidはそんな扱いにしてそうだけど。。。)

まぁauto incrementじゃないとか、PKが整数じゃないとかっていう変なテーブルなんかでは
TableアノテーションでPK名指定できるっていうのは有用な感じですか。。

## 参考

[ActiveAndroid](http://www.activeandroid.com/)
[ActiveAndroid - wiki](https://github.com/pardom/ActiveAndroid/wiki)
[ActiveAndroidのWikiを和訳した - Qiita](http://qiita.com/hotchemi/items/beff8541c0a2a6bc43fd) @hotchemi さん

-----

なにか間違いなどあれば、指摘下さるとありがたいです〜
Heroku 開発環境構築から Rails 4 のデプロイまで

## heroku の設定ツールをセットアップ
### 参考サイト
[Getting Started with Rails 4.x on Heroku](https://devcenter.heroku.com/articles/getting-started-with-rails4)

### 設定ツールをインストール
[Heroku Toolbelt](https://toolbelt.heroku.com/)
インストール後、`heroku` コマンドを使えるようになる。

### heroku アカウントで使用するための sha 鍵を作成
```bash
$ ssh-keygen
# 任意のユニークな鍵名を入力
# パスは ~/.ssh/ に設定する
```

### heroku のログイン情報をコマンドラインツールに登録
```bash
$ heroku login
Enter your Heroku credentials.
Email: # id（メールアドレス）を入力
Password: # パスワードを入力
# ~/.ssh/ に入っている公開鍵一覧が表示されるので
# 先ほど作成したペアの番号を選ぶ
```

複数マシンで開発する際は、これをマシンごとにやる。
ただし、ひとつの heroku アカウントに複数の公開鍵を設定することはできるが、
ひとつの公開鍵を複数の heroku アカウントで使いまわすことはできないので注意。

#### 公開鍵を削除したい場合
一旦削除してから別のものを追加し直す。

```bash
$ heroku keys  # 登録されているキーの一覧
$ heroku keys:remove adam@workstation.local
$ heroku keys:add path/to/new/pubkey
```

### ssh 接続設定を追加
ssh 接続設定ファイルに heroku へのログイン情報を追記する。

複数のアカウントを使いまわしていて同じ設定がある場合は、一旦コメントアウトしておくこと。
さもないと次の heroku create をする際に問題が発生する。

```bash
$ vim ~/.ssh/config  # なければ作る
```

ssh 接続設定を追記する。

```bash
Host heroku.com
  Hostname heroku.com
  IdentityFile path_to_key_file
  TCPKeepAlive yes
  IdentitiesOnly yes
  Port 22
```

## heroku サーバにアプリの作成
### heroku アプリを作成
初めの一度のみの操作。
必ず Rails アプリのリポジトリに cd してから実行する。
Rails アプリの config もいじる必要があるが、ここでは割愛。

```bash
$ cd path/to/rails4/app
$ heroku create <heroku 全体でユニークな名前>  # 名前を空白にすると自動で付けられる
Creating serene-crag-3916... done, stack is cedar
http://serene-crag-3916.herokuapp.com/ | git@heroku.com:serene-crag-3916.git
Git remote heroku added
```

これで、git リポジトリの remote に heroku が追加される。

#### 他のマシンから同じ設定をする場合
以下のコマンドで、カレントディレクトリの git リポジトリの remote に heroku が追加される。

```bash
heroku git:remote --app APPNAME
```

### heroku に Rails アプリをデプロイする
#### アプリを heroku サーバにプッシュ
heroku は master ブランチにある内容をデプロイする。
開発途中のブランチをデプロイしたい場合は、ブランチネームの後に `:master` を付けてプッシュすればよい。

```bash
git push heroku BRANCHNAME:master
```
これで bundle install や asset:precompile 等が自動で行われる。

#### データベースをマイグレート
```bash
$ heroku run rake db:migrate
```
Raspberry Pi の カメラモジュールと UV4L で簡単にストリーミング中継


# 概要
[Userspace Video4Linux framework](http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=16)は、mjpeg や vlc などの便利な extensions を用意してくれているので、これだけでストリーミング中継が可能です。[この検証動画のように](https://www.youtube.com/watch?v=xtVsovri-sk) 画角は小さく、fps も高くありませんが、200ms ぐらいの遅延で中継が可能になります

# UV4L のインストール
インストレーションは[こちらの手順](http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14)で行います

1.UV4L のパッケージを認証

```
wget http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc && sudo apt-key add ./lrkey.asc
```

そして、nano で /etc/apt/sources.list を開いて

```
sudo nano /etc/apt/sources.list
```
末尾に下記を追加します。

```
deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
```

2.インストール

```
sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam
sudo apt-get install uv4l-raspicam-extras
sudo rpi-update
sudo apt-get install uv4l-server
sudo apt-get install uv4l-uvc
sudo apt-get install uv4l-xscreen
sudo apt-get install uv4l-mjpegstream
```

私は途中、** could not open moddep file ** のエラーが出ましたが[こちらを参考に](http://93.93.128.176/forums/viewtopic.php?t=82245&p=581363)一度リブートしてやり直すと無事にインストールできました

# 中継の開始
以下のように起動します
```
uv4l --auto-video_nr --driver raspicam --encoding mjpeg --server-option '--port=9000' 
```

ブラウザで http://RaspberPiのアドレス:9000/stream/ にアクセスすると中継が始まっています。
ただ、これでは画角が大きく遅延が大きいのと、カメラを逆向きに付けたいので、--driver raspicam でさらに raspicam のオプションを追加して以下のように起動すると、[この検証動画のように](https://www.youtube.com/watch?v=xtVsovri-sk)0.2秒程度の遅延で中継ができます

```
uv4l --auto-video_nr --driver raspicam --encoding mjpeg --server-option '--port=9000' --driver raspicam --rotation 180 --width 352 --height 288
```

中継の停止は
```
pkill uv4l
```
でOK です

#補足
Raspbian では標準では Video4Linux はありませんでした。歴史的（というほど年月が経っているわけでもないですが）な経緯は[こちら](http://www.ics.com/blog/raspberry-pi-camera-module#.VDtA70sjHN5)にまとまっていますが、単に Video4Linux のドライバのみが必要な場合は、このユーザーモード版の UV4L の他にオフィシャルなカーネルモードの V4L を insmod して使う方法もあります。この２つは共存させることも可能です

Full Hivision での HLS での中継は、遅延が大きいですが[こちら](http://qiita.com/TakeyukiUeda/items/dbb466fd47fa32a57a4c)もご参照いただければ幸いです
Docker+IPython NotebookでPepperくんリモートコントロール環境構築

色々めぐりあわせがあってPepperくんをさわる機会が増えてきました。
Pepperくんでプログラムを動作させるには、Choregrapheというビジュアルプログラミング環境を用いてアプリケーションを作成、Pepperくんにデプロイして実行する方法のほか、NAOqi for Pythonなどを用いて、コンピュータからリモートでPepperくんを制御する方法もあります。

Choregrapheを使った方法は非常に直感的でよいのですが、APIを直接呼び出すなど、試行錯誤的なフェーズでは、 **インタプリタ的に関数を逐次実行できて、かつ画像などビジュアル環境で確認できるNAOqi for Python環境** があれば重宝するはず・・・ということでIPython NotebookでNAOqi for Python環境を構築してみたのでそのメモ。

# 必要なもの

* NAOqi for Python ... Pepper Tech Fes 2014で配布されたもの(pynaoqi-python2.7-2.0.5.3-linux64.tar.gz)
* Docker環境 ... ここではローカルに構築したVagrant + boot2docker環境を使う([boot2dockerでIPython Notebook環境構築](http://qiita.com/yacchin1205/items/a422e4e130ef92457390)参照)
    * NAOqi for Pythonは、PepperくんのTCP 9559ポートを使って接続するので、Pepperくんにネットワーク的にたどり着けるところに環境を構築する必要あり 

# 環境構築

NAOqi for PythonはPython 2.7で動作するので、Python 2.7.6が入っているIPython Notebookイメージ https://registry.hub.docker.com/u/unfairbanks/docker-ipython-notebook/ をベースにイメージをビルドしてみることにします。

###用意するファイル

以下のファイルをDocker環境上の適当なディレクトリに準備します。

1. Dockerfile
    以下の内容を `Dockerfile` として保存しておく。NAOqiドキュメントではPILを使った例を紹介しているので、Pillowも pip install する。

    ```text:Dockerfile
    FROM unfairbanks/docker-ipython-notebook
    MAINTAINER yacchin1205 <http://twitter.com/yacchin1205/>
    
    RUN apt-get update
    RUN apt-get install -y libjpeg-dev zlib1g-dev
    RUN pip install Pillow

    RUN mkdir /pynaoqi
    ADD ./pynaoqi-python2.7-2.0.5.3-linux64.tar.gz /pynaoqi/
    
    ADD ./run.sh /
    ```

2. pynaoqi-python2.7-2.0.5.3-linux64.tar.gz
    Pepper Tech Fes 2014で配布されたUSBメモリ内にあるファイルをコピーしておく。

3. run.sh
    `PYTHONPATH` にNAOqi for Pythonを展開したディレクトリを含めるような `run.sh` を用意しておく。

    ```sh:run.sh
    #! /bin/bash
    export PYTHONPATH=$PYTHONPATH:/pynaoqi/pynaoqi-python2.7-2.0.5.3-linux64
    
    ipython notebook --no-browser --ip=0.0.0.0 --port=8080 --notebook-dir=/tmp/notebook
    ```

###ビルド

以下のコマンドでビルドできる。

```shell-session
docker@boot2docker:/vagrant/pepper/ipython-pythonsdk$ docker build -t test_dev/docker-ipython-notebook-pynaoqi .
```

ビルド成功すると、`test_dev/docker-ipython-notebook-pynaoqi` というイメージができる。

なお、boot2docker環境でbuild中にarchive.ubuntu.comが解決できないとかエラーが出たので、 https://github.com/boot2docker/boot2docker-cli/issues/102 を参考に `resolv.conf` を修正して対応。

# 使ってみる

###コンテナの実行

作成したイメージは以下のコマンドで実行できる。

```shell-session
docker@boot2docker:/vagrant/pepper/ipython-pythonsdk$ docker run -d -p 8080:8080 -v /vagrant/notebook:/tmp/notebook test_dev/docker-ipython-notebook-pynaoqi
```

ここでは、 `/vagrant/notebook` (Windowsホストの `C:\test\boot2docker-vboxsf\notebook` ) をコンテナ内で `/tmp/notebook` ディレクトリとして見えるようにしている。

###起動したIPython Notebook上で遊ぶ

実行後、 `http://Docker環境:8080` にブラウザでアクセスすると IPython Notebookを開くことができる。
このIPython Notebook環境にはNAOqi for Pythonがインストールされた状態になっているので、

```py
from naoqi import ALProxy
IP = "PepperのIPアドレス"
PORT = 9559
motion = ALProxy("ALMotion", IP, PORT)
motion.angleInterpolation(["HeadYaw", "HeadPitch"], [-0.2, -0.2], [1, 1], False)
```

とかやって首を動かしたり、

Notebook環境なので、こんな感じでPepperのカメラ画像の処理など、実際に得られた画像を確認しながらスクリプトを検討したりも可能。

![ipython-notebook.png](https://qiita-image-store.s3.amazonaws.com/0/28770/60fe1b02-1d20-0ee3-56e1-d9d62ac2670e.png)

頭のカメラで画像をとったり、デプスカメラの画像をとったり。ネタがあったら貼っていきます。
Ubuntu14に最新版のDockerをインストールする

apt-getで入るdockerのバージョンが古い（0.9）ので、[githubに公開されている公式スクリプト](https://github.com/docker/docker/tree/master/contrib/init)を使用して最新版のdockerをインストールする

* docker公式サイト上から、`docker-latest`という最新バージョンの実行ファイルを取得する

```bash
$ cd /usr/bin
$ sudo wget https://get.docker.io/builds/Linux/x86_64/docker-latest -O docker
$ sudo chmod +x docker
```


* 公式githubにdebian用のupstart向けスクリプトとconfが公開されているので取得

```bash
$ sudo wget https://raw.githubusercontent.com/docker/docker/master/contrib/init/sysvinit-debian/docker -O /etc/init.d/docker
$ sudo chmod +x /etc/init.d/docker
$ sudo wget https://raw.githubusercontent.com/docker/docker/master/contrib/init/sysvinit-debian/docker.default -O /etc/default/docker
$ sudo wget https://raw.githubusercontent.com/docker/docker/master/contrib/init/upstart/docker.conf -O /etc/init/docker.conf
```

* docker remote apiへリモートからアクセス可能にする為に、`/etc/default/docker`に`DOCKER_OPTS`環境変数でtcp設定を追加
    * `-H <tcpホスト＆ポート>`
    * `-D`はデバッグ用オプション

```bash
$ sudo vi /etc/default/docker

DOCKER_OPTS="-D -H tcp://0.0.0.0:4243"
```

* 一般ユーザーが上記tcp経由でdockerに接続できるよう`.bashrc`なり`.profile`なり各自使用している`$HOME`の設定ファイルへ`DOCKER_HOST`環境変数を追加

```bash
$ echo "export DOCKER_HOST=tcp://0.0.0.0:4243" >> ~/.bashrc
```

* config reloadしてdocker起動

```bash
$ sudo initctl reload-configuration
$ sudo initctl start docker
```

* 一般ユーザーでdockerコマンドを叩いてエラーにならないことを確認

```bash
$ source ~/.bashrc
$ docker info
: (エラーにならないことを確認)
```
Haskellドリル（リスト編）

## 課題1
### 指示
リストの最後の要素を取得する関数 myLast を作れ。
ただし、再帰を用いること。

    Prelude> myLast [1, 2, 3, 4]
    4

### ヒント
リストの最初の要素を取得する myHead を示す。

    myHead 			:: [a] -> a
    myHead			= f where
    	f []		= error "No head for empty list"
    	f (x : _)	= x

### 課題の狙い
* 再帰を用いたリスト処理の書き方を学ぶ。
* 型宣言の読み方を学ぶ。
* パターンマッチの仕方を学ぶ。
* error 処理の読み方を学ぶ。

### 解答例
[解答例](http://qiita.com/georgenano/items/26d24cd67a6a3442da67#課題1)


## 課題2
### 指示
リストの最後の要素を取得する関数 myLast を作れ。
ただし、再帰を用いず、Prelude にある関数を合成して作成すること。

    Prelude> myLast [1, 2, 3, 4]
    4

### ヒント
* [Hoogle](http://www.haskell.org/hoogle/)ではHaskellの様々な関数を検索できる。Hoogle では関数名だけではなく、関数の型宣言でも検索することができる。例えば、 `[a] -> a` と入力して検索すると `head` 関数などを検索結果として得ることができる。

* 今回の関数は「リストを逆転し、そのリストの最初の要素を取得する」と考える。

### 課題の狙い
* 関数合成を学ぶ。
* Hoogle の使い方を学ぶ。

### 解答例
[解答例](http://qiita.com/georgenano/items/26d24cd67a6a3442da67#課題2)


## 課題3
### 指示
リストの n 番目の要素を取得する関数 myIndex を作れ。

    Prelude> myIndex [1, 2, 3, 4] 2
    2
    Prelude> myIndex [1, 2, 3, 4] 3
    3

### ヒント
* パターンマッチは２つの引数を取ることもできる。
* パターンマッチした後の変数を利用して「条件分岐」に似たことができる「ガード」を利用する。

### 課題の狙い
* 2引数の関数の型宣言を学ぶ。
* 2引数のパターンマッチを学ぶ。
* ガードの使い方を学ぶ。

### 解答例
[解答例](http://qiita.com/georgenano/items/26d24cd67a6a3442da67#課題3)


## 課題4
### 指示
与えられた文字列を全て大文字に変える関数 myUpper を作れ。

    Prelude> myUpper "aBcDeFghi"
    ABCDEFGHI

### ヒント
* 1文字だけを大文字に変える関数 `toUpper` がある。
* 文字列は `Char` 型のリストのことである。

### 課題の狙い
* 高階関数を学ぶ。

### 解答例
[解答例](http://qiita.com/georgenano/items/26d24cd67a6a3442da67#課題4)


## 課題5
### 指示
与えられた整数リストのうち、奇数だけの合計値を求める`oddSum`を作れ。
ただし、`foldl`と`filter`を合成して作成すること。

    Prelude> oddSum [1,2,3,4,5,8,9,11]
    29

### 課題の狙い
* リスト操作の基本的な関数を学ぶ。

### 解答例
[解答例](http://qiita.com/georgenano/items/26d24cd67a6a3442da67#課題5)


## 課題6
### 指示
与えられたテキストファイルに行番号を付与する関数 lineNum を作れ。
ただし、行番号の桁揃えなどは行わなくて良い。

### ヒント
以下のソースの `lineNum` を実装する。

    main    = getContents
            >>= return . lines
            >>= return . lineNum
            >>= return . unlines
            >>= putStrLn
    
    lineNum     :: [String] -> [String]
    lineNum     = f where
        f sts   = sts

### 実行方法
    $ ghc lineNum.hs
    [1 of 1] Compiling Main             ( lineNum.hs, lineNum.o )
    Linking lineNum ...
    $ .lineNum < lineNum.hs
    1 main    = getContents
    2         >>= return . lines
    3         >>= return . lineNum
    4         >>= return . unlines
    5         >>= putStrLn
    6 
    7 lineNum         :: [String] -> [String]
    8 lineNum         = f where
    9     f sts       = sts

### 課題の狙い
* Haskell のコンパイル方法を学ぶ。
* main の書き方を知る。
* 2つのリストをまとめて処理する方法を学ぶ。
* 文字列への変換方法を学ぶ。
* ポイントフリーの書き方を学ぶ。
* 無限リストを学ぶ。

### 解答例
[解答例](http://qiita.com/georgenano/items/26d24cd67a6a3442da67#課題6)
独自ドメインの静的サイトをS3で公開する

Management Consoleを使って操作。

**Bucketの作成**

- `Create Bucket`を押す。(loggingを有効にする。)
- Bucket Name: snippets.itayan.com / Region: Tokyo
- `Create`を押す。

**Static Website Hostingの有効**

- `Properties`を押す。
- 「Static Website Hosting」を選択する。
- 「Enable website hosting」にチェックを入れる。
- Index Document: index.html / Error Document: error.html
- `Save`を押す。

**Permissionsの設定**

- 「Permissions」を選択する。
- `Add bucket policy`を押す。
- 「Edit Redirection Rules」を選択し、テキストボックスにアクセスを許可するルールを追加する。

```
{
  "Version":"2012-10-17",
  "Statement":[{
	"Sid":"AddPerm",
        "Effect":"Allow",
	  "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::snippets.itayan.com/*"
      ]
    }
  ]
}
```

- `Save`を押す。

**コンテンツのアップロード**

- `Upload`を押す。
- 画面にDrag and dropをする。
- `Start upload`を押す。

**ページの表示**

- 「Static Website Hosting」を選択する。
- EndpointのURLにアクセスする。

**Route53の設定**

- `Hosted Zones`を押す。
- 対象ドメインを選択し、`Go to Record Sets`を押す。
- `Create Record Set`を押す。

```
Name: snippets
Type: A - IPv4 address
Alias: Yes
Alias Target: s3-website-ap-northeast-1.amazonaws.com
```

- `Create`を押す。

**ページの表示**
http://snippets.itayan.com

### 参考リンク

- [Example: Setting Up a Static Website - Amazon Simple Storage Service](http://docs.aws.amazon.com/AmazonS3/latest/dev/HostingWebsiteOnS3Setup.html)
AppleScriptでカスタムURLスキーム

一般的にURLは、「スキーム名:文字列」のようになっています。
よく見かける「http://〜」や「ftp://〜」みたいなあれです。

このスキームは、ユーザ定義のものを利用することも可能で、アプリケーションを起動したり、パラメータを渡して何かの処理をさせたりなんてことも出来ます。

iOS関連の情報は充実しているようですが、AppleScriptでは次のように実装。

##1）open location ハンドラの準備
まず「AppleScript Editor」で、パラメータを受け取るハンドラを準備します。
引数の**url_scheme**が受け取るパラメータになります。

```applescript
on open location url_scheme
	
	(*デリミタで文字列抽出*)
	set AppleScript's text item delimiters to {"SchemeSample://"}
	set txt_items to text items of url_scheme
	set AppleScript's text item delimiters to {""}
	set scheme_txt to txt_items as Unicode text
	
	display dialog scheme_txt
end open location
```


##2）アプレットに書き出す
この状態でアプレットに書き出します。
アプレット名はとりあえず**「SchemeSample」**としておきます。
![app.png](https://qiita-image-store.s3.amazonaws.com/0/52615/effbf090-f211-fca9-a275-dce3d5a65f7f.png)


##3）「info.plist」ファイルの編集
書き出したアプレットを右クリックし、「パッケージの内容を表示」。
Xcodeで「Contents/info.plist」ファイルを以下のように追加編集します。

![info.png](https://qiita-image-store.s3.amazonaws.com/0/52615/8b54499e-f75e-1ab6-cf59-5a5882da72b8.png)

テキストエディタで編集する場合は、以下を追加。

```xml
<key>CFBundleIdentifier</key>
<string>biz.corecara.SchemeSample</string>
<key>CFBundleURLTypes</key>
<array>
	<dict>
		<key>CFBundleURLName</key>
		<string>biz.corecara.SchemeSample</string>
		<key>CFBundleURLSchemes</key>
		<array>
			<string>SchemeSample</string>
		</array>
	</dict>
</array>
```

**「biz.corecara.SchemeSample」**は、とりあえずのBundle ID（ドメイン.アプリ名）になります。
**「SchemeSample」**は、カスタムスキーム名です。


##4）ブラウザから実行
準備は完了しました。
ブラウザで**「SchemeSample://Sample」**と入力してみてください。
以下の様なダイアログが表示されるはずです。

![dialog.png](https://qiita-image-store.s3.amazonaws.com/0/52615/3d9fe6da-7a4a-3cf7-812b-71c7bc6476af.png)
Volatilityのインストール


CuckooのオプションでフォレンジックツールとしてVolatilityを使っているとのことで、インストールしてみたのでそのメモです。
正直、Yara以外は特に詰まったところはなく出来ました。

#環境
- OS
 - Ubuntu 14.04
- PyCrypto
 - 
- Yara
 - 3.1
- Volatility
 - 2.3.1

#参考
- [volatility](https://code.google.com/p/volatility/)
- [Installing Volatility in Ubuntu](https://shankaraman.wordpress.com/tag/how-to-install-volatility-in-ubuntu/)
 - yara以外はほぼこの通りにやっただけでうまくいきました

#手順
##必要なパッケージをインストール
Cuckooなどをインストールする過程で幾つかパッケージが入っていますが、Volatility単体で使う人もいると思うので両方書いておきます。

```shell-session
#Cuckoo向け
$ sudo apt-get install pcregrep libpcre++-dev
#Volatilityのみ向け
$ sudo apt-get install python python-pip unzip subversion pcregrep libpcre++-dev python-dev
```

##PyCryptoのインストール

```console
$ sudo pip install pycrypto
```

##Distromのインストール

```shell-session
$ wget https://distorm.googlecode.com/files/distorm3.zip
$ unzip distorm3.zip
$ cd distorm3/
$ python setup.py build
$ sudo python setup.py build install
```

##Yaraのインストール
Yaraのインストールに関しては
[Cuckoo Sandboxの実行でYaraのエラーが出る](http://qiita.com/knqyf263/items/9354dc229b2b3d548460)
に書いたので、そちらを参照下さい。

##Volatilityのインストール

```shell-session
$ wget https://volatility.googlecode.com/files/volatility-2.3.1.tar.gz
$ tar zxvf volatility-2.3.1.tar.gz
$ cd volatility-2.3.1/
$ python setup.py build
$ sudo python setup.py build install
```

最後に以下のような標準出力が得られていればOKです。
`Failed to...`とか出てると失敗しているので手順を再確認してみてください。

```console
$ python vol.py -h
Volatility Foundation Volatility Framework 2.3.1
Usage: Volatility - A memory forensics analysis platform.

Options:
  -h, --help            list all available options and their default values.
                        Default values may be set in the configuration file
                        (/etc/volatilityrc)
（以下略）
```
【tmux】tmuxのインストールと設定方法


※ 追記中です（特に末尾コマンドあたり）

## tmuxとは

ターミナルでの作業を便利にしてくれるツールです。
何が便利か？
* ターミナルの画面を分割して便利に使える
* 画面を以前の状態に復元したりできて便利
などなど。

### tmuxの本家サイト
http://tmux.sourceforge.net/

### tmux参考サイト
https://gist.github.com/knife0125/5300193
http://kanjuku-tomato.blogspot.com/2014/02/tmux.html


## tmuxのインストール

	# cd /opt
	# wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
	# rpm -ivh epel-release-6-8.noarch.rpm
	# vi /etc/yum.repos.d/epel.repo
    - 6 enabled=1
    + 6 enabled=0
	# yum --enablerepo=epel install tmux -y


## tmuxの設定

### tmuxの設定ファイルの作成

	$ cd
	$ touch .tmux.conf
	$ vi .tmux.conf

### tmux.confの設定例

	# ctl-tでコマンドモードになるように設定
	set-option -g prefix C-t

	# 日本語環境なら今のところ必須。
	set-window-option -g utf8 on

	#マウス操作対応
	set-option -g mouse-select-pane on
	set-option -g mouse-select-window on
	set-option -g mouse-resize-pane on
	set-option -g mode-mouse on
	set-option -g mouse-utf8 on

	# ウィンドウの移動
	# Prefix(ここではCtrl+t)を連続入力することでウィンドウを移動させます。
	bind C-t next-window

	# ウィンドウを強制的に終了
	# <Prefix><k>でウィンドウを強制終了できるようにします。
	bind k confirm-before -p "kill-window #W? (y/n)" kill-window

	#ステータスバーの外観の設定
	set -g status-fg cyan
	set -g status-bg black
	set -g status-left-length 30
	set -g status-left '#[fg=white,bg=black]#H#[fg=white]:#[fg=white][#S#[fg=white[#[default]'
	set -g status-right '#[fg=black,bg=cyan,bold] [%Y-%m-%d(%a) %H:%M]#[default]'

	# window-status-current
	setw -g window-status-current-fg black
	setw -g window-status-current-bg cyan
	setw -g window-status-current-attr bold#,underscore
	
	# ウィンドウを(ペインに)分割
	# ＜Prefix＞＜v＞、＜Prefix＞＜h＞と入力するだけで分割できるようにします。
	bind v split-window -v
	bind h split-window -h

	# ペインのアクティブなウインドウの外観の設定
	set -g pane-active-border-fg black
	set -g pane-active-border-bg cyan

	# ペインの移動
	# Shift + 上下左右でペインを移動できるようにする。(＜Prefix＞不要)
	# 行頭に"bind -n"をつけるとPrefixが不要になる。
	bind -n S-left select-pane -L
	bind -n S-down select-pane -D
	bind -n S-up select-pane -U
	bind -n S-right select-pane -R

	# コピー関連の設定
	# <Prefix><y>でコピーし、<Prefix><p>で貼付けをできるように設定。
	bind y copy-mode
	bind p paste-buffer

	# window間でのヒストリーの共有
	#function share_history {
	#    history -a
	#    history -c
	#    history -r
	#}
	#PROMPT_COMMAND='share_history'
	#shopt -u histappend
	#export HISTSIZE=9999

	
## tmuxのコマンド

| コマンド | 機能名 | 現象 |
|-----------|------------|------------|
| tmux a	| アタッチする | 既に起動しているtmuxのセッションを復元する |
| tmux d	| デタッチする | 現在起動中のtmuxのセッションから離脱する(後からアタッチできる) |
| tmux ls	| リスト表示 | 現在起動中のtmuxのセッション一覧を表示する |