OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry PiでUSB/Bluetoothアダプタを使う

Raspberry PiでUSB接続のBluetoothアダプタ（ドングル）を使うためのメモ。

# 環境

以下の環境で構築しました。なお、インストールしているディストリビューションはRaspbianです。

```
pi$ uname -a
Linux raspberrypi 3.12.29+ #714 PREEMPT Wed Oct 1 23:11:38 BST 2014 armv6l GNU/Linux
pi$ cat /etc/debian_version
7.6
```

# Bluetoothアダプタ

今回使用したBluetoothアダプタは以下の通りです。どちらも正しく認識できました。

- [iBUFFALO BSBT4D09BK](http://www.amazon.co.jp/exec/obidos/ASIN/B0096FIF0C/x7edimv35x-22/)
- [PLANEX BT-Micro4](http://www.amazon.co.jp/exec/obidos/ASIN/B0071TE1G2/x7edimv35x-22/)

# bluezをインストールする

Bluetoothスタックであるbluezをインストールします。bluezは`apt-get`で簡単にインストールできます。今回インストールされたバージョンは4.99-2でした。

```
pi$ sudo apt-get update
pi$ sudo apt-get install bluez
```

# Bluetoothアダプタを接続する

BluetoothアダプタをUSBポートに接続します。今回はRaspberry Pi Model B+のUSBポートに直接接続しました。

`hciconfig`コマンドを使って認識されていることを確認します。
（MACアドレスはマスクしています）

```
pi$ hciconfig
hci0:   Type: BR/EDR  Bus: USB
        BD Address: XX:XX:XX:XX:XX:XX  ACL MTU: 310:10  SCO MTU: 64:8
        UP RUNNING PSCAN
        RX bytes:1449 acl:0 sco:0 events:69 errors:0
        TX bytes:1328 acl:0 sco:0 commands:69 errors:0
```

# おまけ: BLE（Bluetooth Low Energy）デバイスを検出する

`hcitool`コマンドでBLEデバイスをスキャンできます。
（MACアドレスはマスクしています）

```
pi$ sudo hcitool lescan
LE Scan ...
XX:XX:XX:XX:XX:XX (unknown)
YY:YY:YY:YY:YY:YY (unknown)
```
rbenvでのrubyバージョンアップ簡易メモ


### rbenv, ruby-buildのアップデート(homebrew編)

```
$ brew update
$ brew upgrade rbenv ruby-build
```

### rbenv, ruby-buildのアップデート(git編)

```
$ cd ~/.rbenv
$ git pull
$ cd ~/.rbenv/plugins/ruby-build
$ git pull
```
※ Yosemiteにしてるとbrew updateが出来ない場合があるので下記にて対応
http://qiita.com/sue738/items/7ab03ecc9f6fcf37408d

### インストールできるrubyのバージョンを確認

```
$ rbenv install --list
```

### rubyの最新版を探してインストール

```
$ rbenv install 2.1.4
```

### インストールしたバージョンの確認

```
$ rbenv versions
```


### デフォルトのrubyのバージョンを指定

```
$ rbenv global 2.1.4
$ ruby -v
ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-darwin14.0]
```

以上！
Yosemiteでの個人的な環境構築メモ


Yosemiteをクリーンインストールしたので、諸々問題なくインストールできるか試しました。

##諸々アプリをインストール
###Xcode
App Storeからインストール

###iTerm2
お好みで。
http://iterm2.com/

###MacVim
お好みで。
https://code.google.com/p/macvim-kaoriya/

###Virtualbox
Vagrant用。
https://www.virtualbox.org/wiki/Downloads

###Vagrant
とても便利。
https://www.vagrantup.com/

##Xcodeのコマンドラインツール

```
xcode-select --install
```

##Homebrew

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

##git


```
brew install git
git config --global color.ui true
git config --global user.name "hayori"
git config --global user.email hayori@example.com
git config --global push.default simple
```

##自分の設定ファイル集を持ってくる

```
cd ~
git clone git@github.com:hayori/dotfiles.git dotfiles
```

##zsh

```
brew install zsh --disable-etcdir
brew install zsh-completions
sudo sh -c "echo '/usr/local/bin/zsh' >> /etc/shells"
chsh -s /usr/local/bin/zsh
```

設定ファイル集から設定ファイルリンク

```
cd dotfiles/zsh
sh init.sh
```

##vim設定

設定ファイルをリンク

```
cd dotfiles/vim
sh init.sh
```

vimプラグインを管理するプラグインNeobundleをインストール

```
mkdir -p ~/.bundle
git clone https://github.com/Shougo/neobundle.vim ~/.bundle/neobundle.vim
```

vim上で以下を実行。プラグインを導入する。

```
:NeoBundleInstall
```

vimprocをコンパイル

```
cd ~/.bundle/vimproc/
make
```

##tmux

```
brew install tmux
brew install reattach-to-user-namespace
```

設定ファイルをリンク

```
cd dotfiles/tmux
sh init.sh
```

##Ruby

rbenvのシェル設定は.zshenvに書いてあるのでそれ参照のこと。

```
brew install rbenv ruby-build rbenv-gemset readline openssl
rbenv install --list
CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl` --with-gcc=clang" rbenv install 2.1.4
rbenv global 2.1.4
rbenv rehash
```

##wget

```
brew install wget
```

##tree

```
brew install tree
```

##pstree

```
brew install pstree
```

##htop
topの代わりに。実行時は sudo htop

```
brew install htop-osx
sudo chmod u+s /usr/local/Cellar/htop-osx/0.8.2.2/bin/htop
```
Asterisk13+日本語ガイダンス込みでビルド

## 参考

* [Asterisk/FreePBX日本語導入ガイド | 株式会社クルーグ](http://www.qloog.com/freepbx/setupguide-japanese-language/)
* [AsteriskでつくるIP電話システム―つくって、試して、楽しむIP電話: PCtoPCからIP‐PBXまで - 高橋隆雄 - Google ブックス](http://books.google.co.jp/books?id=W41idcRoKMoC&pg=PA187&lpg=PA187&dq=asterisk+%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3+%E8%B5%B7%E5%8B%95&source=bl&ots=Q3n7pTgZ3z&sig=0plFgjNPQpr0h3H-dfBrSC_LFVA&hl=ja&sa=X&ei=uh1jVMOLOOXEmwWDnYKwCQ&ved=0CDgQ6AEwAw#v=onepage&q=asterisk%20%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%20%E8%B5%B7%E5%8B%95&f=false)
* [ubuntu - SIP command not found - Stack Overflow](http://stackoverflow.com/questions/9821804/sip-command-not-found)

## 手順

CentOS7にて実施

```bash:事前にいろいろパッケージ入れとく
ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
yum groupinstall -y "Development Tools"
yum install -y net-tools telnet
```

```bash:Asterisk13
cd /opt
svn checkout http://svn.asterisk.org/svn/asterisk/trunk asterisk
cd asterisk
curl http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz -o asterisk-13-current.tar.gz
tar xzf asterisk-13-current.tar.gz
rm asterisk-13-current.tar.gz
cd asterisk-13.*
yum install -y {ncurses,libuuid,jansson,libxml2,sqlite,openssl}-devel openssl wget
./configure
make menuselect
```
 * Core Sound Packages -> CORE-SOUNDS-JA-* を全選択 
* Esc -> Esc -> s で保存し終了

```bash:インストール
make -s
make install
make samples
make config
ldconfig
yum clean all
```

## 動作確認

```diff:/etc/asterisk/extensions.conf
[demo]
+ exten => 9999,1,Set(CHANNEL(language)=ja)
+ exten => 9999,n,Playback(demo-echotest)
+ exten => 9999,n,Echo
+ exten => 9999,n,Playback(demo-echodone)
```

* [asterisk-core-sounds-ja-wav-current.tar.gz](http://downloads.asterisk.org/pub/telephony/sounds/)これが音声の実体か。

## Asterisk起動

```bash:
asterisk -c
CLI> 
```

# dockerイメージ作った

```bash:使い方
docker run --privileged -it -d \
  -p 8888:5060/udp \
  tukiyo3/centos7-asterisk13-ja
docker exec $(docker ps -ql -n 1) asterisk -r
```

> ENTRYPOINT /usr/sbin/docker -c

# その他メモ

* openssl-dev をインストールしないとsipコマンドが使えない(chan_sip.soをビルドできないため)
* module格納場所 : /usr/lib/asterisk/modules/*.so

## CLIコマンド

* module show | grep sip
* core reload
* core show profile
* core show settings
* core show functions
* core show applications
* sip show peers
* sip show registry
* sip set debug on
* sip reload
* sip show settings
* asterisk -rx "module reload"
* asterisk -rx "core restart gracefully"


続きは[Asterisk13その2 - Qiita](http://qiita.com/tukiyo3/items/e3f1e3881191d867d496)
App Store申請手順（2014年冬）

申請手順
=============

iOSはよく手順やUIが変わるため、下記の情報は正確でない場合があるので、注意してください！

事前準備
----
iTunes Connectへアカウント登録しておく。

①アプリ情報を登録する
------------------------------
iTunes Connectから以下の情報を順番に入力していく。

### App Information
* App Name：アプリ名
* Default Language：Japanese
* SKU Number：Bundle IDと同じがベター
* Bundle ID：Dev Centerで登録したものを選択
* Availability Date：リリースしたい日付（後から公開出来るように遅めにしておくのがベター）
* Price Tier：Freeを選択
* Discount for Educational Institutions：チェックなし
* Custom B2B App：チェックなし

### Version Information
* Version Number：1.0.0
* Copyright：個人（法人）名
* Primary Category：適切なカテゴリを選択する。
* Secondary Category (Optional)：適切なカテゴリを選択する。

### Rating

健全なアプリの場合は全てNoneを選択する。

* Cartoon or Fantasy Violence：None
* Realistic Violence：None
* Sexual Content or Nudity：None
* Profanity or Crude Humor：None
* Alcohol, Tobacco, or Drug Use or References：None
* Mature/Suggestive Themes：None
* Simulated Gambling：None
* Horror/Fear Themes：None
* Prolonged Graphic or Sadistic Realistic Violence：None
* Graphic Sexual Content and Nudity：None

### Metadata
* Description：アプリの説明文
* Keywords：検索キーワードをカンマ区切りで入力する。
* Support URL：サポートWebページ
* Marketing URL (Optional)：ない場合は不要
* Privacy Policy URL (Optional)：ない場合は不要

### App Review Information

アプリの審査をするレビュアー様への説明事項等を入力する。

* Contact Information：電話番号は+81を付与する。
* Review Notes：ここに操作方法等を入力する。
* Demo Account Information (Optional)：ログインが必要なアプリの場合、入力する。

### EULA(End User License Agreement )

基本何もしない。
（Appleが用意した使用許諾契約書が有効になる。）

### Uploads
・スクリーンショットを登録する。
・対応する各ハードウェア毎に最低1枚は必要です。
（ファイル形式は72dpi、RGB coloer space、JPGまたはPNG）

* Large App Icon：1024*1024
* 3.5-Inch Retina Display Screenshots：960*640
* 4-Inch Retina Display Screenshots：1136*640
* iPad Screenshots：1024*768
* iPhone6：1334*750
* iPhone6 plus：サイズ（pt）⇒2208*1242、解像度（px）⇒1920*1080
* Routing App Coverage File (Optional)：基本は不要

※iPhone6 plusだけ解像度に対しサイズが1.15倍

  
**この時点でPrepare for Uploadとなっている！**
  

### 内容確認
View Detailボタンから内容を確認する。
確認及び修正後、Ready to Upload Binaryボタンをクリックする。
暗号化技術使用確認画面が表示されるので、Yes or No を選択する。
アップロード方法解説画面が表示されるので、Continueボタンをクリックする。

  
**この時点でWating for Uploadとなっている！**
  

②アプリを送信する
------------------------------
Xcodeからプロジェクト起動する。
ツールバーからProduct->Archiveを選択する。
Archive後、OganaizerからValidate->DistributeでアプリをiTunes Connectに送信する。

③ビルドを追加する
------------------------------
iTunes ConnectからAppの管理->該当のアプリ->ビルドの+ボタンをクリックする。
該当のバイナリバージョンを選択して、保存する。
レビュー審査のために送信ボタンが有効になるので、クリックする。

④IDFAの質問に答える
-------------------------------
広告がない場合、基本的には以下で設定する。

* 輸出コンプライアンス：No
* コンテンツ配信権：Yes
* IDFA：No

送信ボタンをクリックする。

  
**これでWating for Reviewになる！！（メールが届けば申請完了）**
  

参考URL
-----
新しくなったiTunes Connectでのアプリの申請方法について：
http://qiita.com/Nietzsche/items/764c1dcfaa0d6c42867a
iPhoneアプリ販売のための申請手順　iTunes Connectへの登録編：
http://ameblo.jp/tsugarutamenobu/entry-11566208395.html
新しいiTunes connectでのバイナリの提出方法：
http://qiita.com/leznupar999/items/957e03dc294b3775a645
【iOS】iTunesConnect(2014/9) スクリーンショット作成の注意点：
http://qiita.com/hiro93n/items/75e3ce0c1fa21168d661
ActionBarとTabBarの上下が入れ替わってしまう

# 現象
`ActionBar`にカスタムビューを指定した際、Androidのバージョンによっては`TabBar`と上下が入れ替わってしまうことがあった。

# 対策
`actionBar.setDisplayOptions`の引数に`ActionBar.DISPLAY_SHOW_HOME`フラグを追加すると正常に動作する。

# 副作用
上記の対策だとアイコン画像が必ず表示されてしまう。
もし消したければ、

```java
View homeIcon = findViewById(android.R.id.home);
((View) homeIcon.getParent()).setVisibility(View.GONE);
```

のようにする。

# 参考
[Tabs Coming above Action bar when inflating custom layout](http://stackoverflow.com/questions/19240646/tabs-coming-above-action-bar-when-inflating-custom-layout)
[ActionBarSherlock - Tabs appearing ABOVE actionbar with custom view](http://stackoverflow.com/questions/12973143/actionbarsherlock-tabs-appearing-above-actionbar-with-custom-view)
WindowsでYii2のためにMAMPの変更

メモの代わりにQiitaに投稿しました。

# php.ini

```
# mbstringのため
default_charset = "UTF-8"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.detect_order = SJIS,EUR-JP,JIS,UTF-8,ASCII

# 国際化用拡張モジュール Yii::t()
extension=php_intl.dll

# DBのため
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll 

# debugのため
extension=php_xdebug.dll

# ファイルアップロードのmine-typesを取得のため
extension=php_fileinfo.dll

#　安全性のため
expose_php = Off
```


# httpd.conf
```
Include conf/extra/httpd-vhosts.conf
```

## httpd-vhosts.conf
```
<VirtualHost *:80>
    ServerName local.dev
    DocumentRoot "Path_to_your_dir"
</VirtualHost>
```

# 最後課題
Windows 8で[Yii2-start](https://github.com/vova07/yii2-start) を使ってみましたが、symlink()がうまく実行されなかったです。
色々調べましたが、結局だめでした。
- chdirでフォルダに移動してからsymlinkするとか、だめでした。

やはりYii2はWindows上で完璧に動くことが無理かなと思ってます。
OS X の Perl でクリップボードの読み書き

　おいーっす。今日もちょいネタを投稿するよー。前回 AppleScript から Perl をしばいたので今回は逆をやろうと思ったんだけど osascript でやればいいってだけのネタだったので却下。ただ調べている過程で、

「そういや、こんなコマンドあったねえ」

　というコマンドを思い出したのでそいつを使って「Perl でクリップボードの中身をいじるスクリプト」をご紹介。

　まあ、内容はバッククオートでターミナルのコマンド叩くだけなんだけどね。使うコマンドは知っている人は知っている。そして私のように忘却の彼方という人もいる「pbpaste」と「pbcopy」です。今回はクリップボード内のテキストを Perl で取り込んで NFC した値をクリップボードに返しています。

　ポイントは pbpaste で取得する値を decode することと pbcopy に渡す際にはパイプ経由で標準入出力経由で渡すというところ。まあ Perl からクリップボードをいじるなんてことがある場合は役に立つ、かなぁ？？

　NFCってなんのこっちゃ？　っていう人は是非こちらの頁を参考にしてくださいねー → [Unicodeの正規化](http://tama-san.com/?page_id=872)

```pl
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use Encode;
use Unicode::Normalize;

binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";
binmode STDIN, ":utf8";

#クリップボード内データの取得
my $cbData = decode('utf8',`pbpaste`);

$cbData = NFC($cbData);

#バックスラッシュをエスケープ
$cbData =~ s/\\/\\\\/g;

my $rtValue = `printf "$cbData" | pbcopy`;
exit;
```
void main()をめぐるどうでもいい話

C言語またはC++言語で下記ソースコードを見たときに、「`void main()`だ！○○せ！！」とマサカリを投げるその前に。

```c
void main()
{
  /*...*/
}
```

**注意：** 実用上は素直にmain関数の戻り値型を`int`としましょう。通常は、main関数を下記2パターンのいずれかとします。

* `int main(void)` （C++なら`int main()`でも同義）
* `int main(int argc, char *argv[])`

# language lawyer?

毎回マサカリ投擲戦争が勃発するリスクをとってでも、重箱の隅を爪楊枝でほじくりだすような議論をお好みなら、「言語仕様上、`void main()`はC99以降ではOK、C++ではNG」となります。

* [void main() is not legal in C++ but is legal in C.](http://web.archive.org/web/20160604095048/homepage.ntlworld.com/jonathan.deboynepollard/FGA/legality-of-void-main.html)
* [[迷信] void main(void) | 株式会社きじねこ](https://web.archive.org/web/20210301164833/http://www.kijineko.co.jp/tech/superstitions/void-main.html)

## ISO/IEC 9899:1999(C99)
> 5.1.2.2.1 Program startup
> 1 The function called at program startup is named `main`. The implementation declares no prototype for this function. It shall be defined with a return type of `int` and with no parameters:
> 　　`int main(void) { /* ... */ }`
> or with two parameters (referred to here as `argc` and `argv`, though any names may be used, as they are local to the function in which they are declared):
> 　　`int main(int argc, char *argv[]) { /* ... */ }`
or equivalent __;__ <sup>9)</sup> __or in some other implementation-defined manner__.
> 脚注9) Thus, `int` can be replaced by a typedef name defined as `int`, or the type of `argv` can be written as `char ** argv`, and so on.

最後の"; or in some other implementation-defined manner"により、main関数には **処理系定義の任意の戻り値型** と引数型を許容する。

## ANSI X3.159-1989(C89)
> 2.1.2.2 Hosted environment
> A hosted environment need not be provided, but shall conform to the following specifications if present.
>
> "Program startup"
> The function called at program startup is named main. The implementation declares no prototype for this function. It can be defined with no parameters:
> 　　`int main(void) { /*...*/ }`
> or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):
> 　　`int main(int argc, char *argv[]) { /*...*/ }`
> If they are defined, the parameters to the main function shall obey the following constraints:
> ...

C99では明記されている、処理系定義の戻り値型や引数型は許容されない。

## ISO/IEC 14882:2003(C++)
> 3.6.1 Main function
> 2 An implementation shall not predefine the main function. This function shall not be overloaded. **It shall have a return type of type `int`, but otherwise its type is implementation-defined.** All implementations shall allow both of the following definitions of main:
> 　　`int main() { /* ... */ }`
> and
> 　　`int main(int argc, char* argv[]) { /* ... */ }`
> ...

main関数の **戻り値型は必ず`int`** でなければならない。ただし、**関数の型（つまり戻り値型を除く引数型）については処理系定義** の型を許容する。


## だからなに？

という疑問がわいたなら、おめでとうございます。main関数の戻り値型には絶対に`int`と書いてください。

私もそう書きます。
Xively に MQTT で データをpublishing


Xively は IoT のためのパブリッククラウドです。詳細は[Xivelyのサイト](https://xively.com/whats_xively/)を参照していただければ幸いです。データを publish するだけでグラフにしてくれたり、地図にマッピングしてくれたり、トリガーを仕掛けたり（私はまだ使ったことがないですが）といろいろなことをしてくれるのでシステムの開発が大変楽になります。REST API の他に MQTT API があるのですが、これが少しハマッたので備忘録の意味を兼ねてメモをのこさせていただきます

[Xively のAPIドキュメントによると](https://xively.com/dev/docs/api/communicating/mqtts/)csv 形式で Feed する場合、以下のようになります

```bash:コマンド文字列
mosquitto_pub -h api.xively.com  -t "API Key文字列/v2/feeds/FeedID 文字列.csv" -m "Channel ID,`TZ=GMT date '+%Y-%m-%dTS:%H:%M:%Sz'`,値"
```

認証はAPI Key が正当かどうかで判断されます。API Key、FeedID、データストリームのタイプ(json, xml, csv)はトピックで指定します。シンプルにCSVでpublishするとして、MQTT のメッセージの内容は
"Channel ID、日時、値" の順になります

まだ分かりにくいので例として
- API Key:   オール０
- FeedID:     オール1
- Channel ID: load_avg
- 値:          0.4 
だと、以下のようなコマンド文字列になり

```bash:例
mosquitto_pub -h api.xively.com  -t "000000000000000000000000000000000000000000000000/v2/feeds/1111111111.csv"  -m "load_avg,`TZ=GMT date '+%Y-%m-%dTS:%H:%M:%Sz'`,0.4"
```

Xively の Development Site で表示を確認すると以下のようになります
(API Key 文字列は消してあります)

![スクリーンショット 2014-11-12 15.05.39.png](https://qiita-image-store.s3.amazonaws.com/0/46544/22b79024-41bf-a8ca-ac8f-69b20cb84373.png "スクリーンショット 2014-11-12 15.05.39.png")
3.5インチ画面対応したくない


![xxxxx.png](https://qiita-image-store.s3.amazonaws.com/0/5222/7ab24e47-b9a2-f62d-3ceb-38f0511a03ed.png "xxxxx.png")

iOS7 iOS8だけ対応にすると3.5インチ対応しなくて良いかというと、そうではなくて、

http://zutto-megane.com/objective-c/post-79/
2.10: iPhone apps must also run on iPad without modification, at iPhone resolution, and at 2X iPhone 3GS resolution

2.10: iPhoneのアプリはiPhoneの解像度、iPhone 3GSの2倍の解像度でそのままiPadで動かなければなりません。

Size Classにしていればユニバーサルにしとけばいいんじゃん？
と思って提出しました。どうなることやら。。

たぶん3.5インチ対応かiPad対応かの2択なのかな

-----
2014/12/3更新

いけましたね。
3.5に対応しなくてもiPadに対応してしまえばOKみたいです。

https://itunes.apple.com/jp/app/gibumi5/id891236007?mt=8

iOS7以降互換でも3.5インチに対応しなくてはいけないとかナンセンスですが、表示させる情報量がある程度多いアプリはiPad対応でお茶濁したほうが楽かも。
GitHubを利用し、コードを公開する方法

準備
　GitHubのアカウント取得

SSH keyの設定
　『公開鍵』の登録
　　　GitHubにPCからコードを送る際にSSHという規格を利用する
　登録方法
　　①ターミナル
　　　　$ssh-key -t rsa -C "your_mail@example.com"
　　②GitHubのprofileページのSSH keysに公開鍵の内容をコピーして貼付ける
　　③実施にGitHubで利用できるか確かめる
　　　$ssh -T git@github.com

実際に使ってみる
　①New repository
　②Repository name
　③Publicにチェック
　④Initialize this repository with a READMEにチェック

PCにリポジトリのクローンを持ってくる
　①クローン
　②$git clone [URLのコピー.git]
　　　ローカルにフォルダができる！
　③公開するファイルを入れる

参照元
http://albatrus.com/main/web/6165
knockout.jsでJSONで通信する


iOSとかでアプリ内でシリアル入力とかさせると違反になるおそれがあるので外部で入力させるようにするために作ったモックみたいなものを作ったのでそのサンプル。

knockout.jsを使用した理由は、社内コードを見たら使っていたのでっていうなんとなくの理由。

* HTMLサンプル

```html:index.html
<!doctype html>
<html>
  <head>
    <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
    <script type="text/javascript">
      $(function() {
        function Campaign(data) {
          var self = this;
          
          self.ID = ko.observable(data.id);
          self.Name = ko.observable(data.name);
          self.UserID = ko.observable("");
          self.Code = ko.observable("");
          
          self.Save = function() {
            var data = {
              "id": self.ID(),
              "user_id": self.UserID(),
              "code": self.Code()
            };
            $.post("http://localhost:4567/", data, function(data) {
              console.log(data);      
            });
          }
        }
        
        function CampaignViewModel() {
          var self = this;
          
          self.Campaigns = ko.observableArray([]);
          
          $.getJSON("http://localhost:4567/", function(data) {
            var campaigns = $.map(data, function(item) { return new Campaign(item); });
            self.Campaigns(campaigns);
          });
        }
        
        ko.applyBindings(new CampaignViewModel());
      });
    </script>
  </head>
  <body>
    <div data-bind="foreach: Campaigns">
      <form method="post">
        <input type="hidden" data-bind="value: ID" />
        <label data-bind="value: Name"></label><br />
        <label>User ID</label><br />
        <input type="text" data-bind="value: UserID" /><br />
        <label>Code</label><br />
        <input type="text" data-bind="value: Code" /><br />
        <button data-bind="click: Save">Save</button>
      </form>
    </div>
  </body>
</html>
```

* サーバコードサンプル

```ruby:app.rb
require 'sinatra'
require 'json'


def get '/' do
  campaigns = [
    {
      id: 1,
      name: 'campaign 1',
    },
    {
      id: 2,
      name: 'campaign 2',
    },
  ]
  
  campaigns.to_json
end

def post '/' do
  {success: true}. to_json
end
```
AppCodeで例外時ブレークポイントで止めるException設定


メモ。

##1  `Run` > `View Breakpoints` を開く


##2 `Expection Breakpoints`の`When Objective-C is thrown`をチェック


![cap0.png (1402×634)](https://dl.dropboxusercontent.com/u/958512/_blog/qiita/appcode_breakpoints/cap0.png)
ひと目でわかるモニタリングツール『Glances』コマンドをMacに導入

#[glances](https://github.com/nicolargo/glances "Github")
![68747470733a2f2f7261772e6769746875622e636f6d2f6e69636f6c6172676f2f676c616e6365732f6d61737465722f646f63732f696d616765732f73637265656e73686f742d776964652e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/12096/6d52fc88-5e7e-846a-1dc7-9c67b84ac99d.png)

便利そうだったのでMacでもいれてみました。

#前提
Homebrewいれておいてくだし

#設定
Pythonをインストール

```zsh
brew install python --framework
```

Pipをインストール

```zsh
easy_install pip
```

PipをつかってGlancesをインストール

```zsh
sudo pip install Glances
```
実行

```zsh
glances
```

いい感じ。

![glances.jpg](https://qiita-image-store.s3.amazonaws.com/0/12096/982d68b2-a7f8-7a2e-1eda-aae15aa9326f.jpeg)
GitHub Pull Request

「Pull Request」

![githubkaigi-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/25940/dcf0a9e6-71f8-f526-098a-7a1506f31e60.jpeg)

参照元
http://www.publickey1.jp/blog/14/githubpull_requestgithub_kaigi_2014.html
Node.jsのカレントバージョンを確認する

node.jsのカレントバージョンを http://nodejs.org/ から取得します。

```bash:install_nodejs.sh
#!/bin/sh
source ~/.nvm/nvm.sh

# カレントバージョンを取得
node_ver=`
  curl -s http://nodejs.org/ |
  grep "Current Version"     |
  perl -pe "s/.+(v\d+\.\d+\.\d+)/\1/g"
` 

# カレントバージョンをnvmでインストール
nvm install $node_ver
```
ssh でカレントディレクトリの ssh_config を使用する (補完つき)


Chef リポジトリなどで、プロジェクトごとの ssh_config を作成している。

ssh 実行時に `ssh -F ssh_config hostname` とすれば使えるんだけど、毎回タイプするのは面倒なので、カレントディレクトリに `ssh_config` があれば自動で使うラッパーを書いた。

```ruby
#!/usr/bin/env ruby
require "shellwords"

if !ARGV.include?("-F") && File.exists?("ssh_config")
  # ANSI Color Code
  START_YELLOW = "\e[33m"
  END_COLOR = "\e[0m"

  puts START_YELLOW + "Using: #{File.expand_path("ssh_config")}" + END_COLOR
  exec "ssh -F ssh_config #{ARGV.shelljoin}"
else
  exec "ssh #{ARGV.shelljoin}"
end
```

元の引数に `-F` がなく、カレントディレクトリに `ssh_config` があれば、引数を追加して ssh を exec している。

ssh_config がみつかったときは、メッセージを (黄色で) 表示してる。何も出さないと混乱しそうなので。

あとはこれを適当なとこに保存、実行権限つけて、ssh の alias にしてやれば OK。

さらに zsh 用の補完関数も書いた。ここでは上記コマンドを `ssh-cwd-config` としている。`$fpath` のどこかに `_ssh-cwd-config` という名前で保存する。

```zsh
#compdef ssh-cwd-config

_ssh-cwd-config() {
  if [ -e ssh_config ]
  then
    ssh_config=ssh_config
  else
    ssh_config=~/.ssh/config
  fi

  hosts=$(grep -E "Host " $ssh_config | sed 's/Host //')
  _arguments ": :($hosts)"
}
```

これで `ssh [TAB]` とすればプロジェクトごとのホストが一覧・補完できて便利。

# おまけ: knife solo 版

```ruby
#!/usr/bin/env ruby
require "shellwords"
SUBCOMMANDS = [
  %w(solo prepare),
  %w(solo cook),
  %w(solo clean)
]

subcommand = SUBCOMMANDS.find do |cmds|
  cmds.each_with_index.all? do |cmd, i|
    ARGV[i] == cmd
  end
end

if subcommand && !ARGV.include?("-F") && File.exists?("ssh_config")
  # ANSI Color Code
  START_YELLOW = "\e[33m"
  END_COLOR = "\e[0m"

  puts START_YELLOW + "Using: #{File.expand_path("ssh_config")}" + END_COLOR

  exec "knife #{subcommand.shelljoin} -F ssh_config #{ARGV[subcommand.size..-1].shelljoin}"
else
  exec "knife #{ARGV.shelljoin}"
end
```
オブジェクト指向を取り入れたRのデザインパターン

共通的な流れや処理がある場合、複数のScriptで書くより、親子のクラス関係を使って書いてしまおうと思ったのがきっかけ。
テンプレートパターンをRに取り入れてみました。


#実装
```lang:SuperClass
setRefClass("ModelSuper",
    fields=list(var1="character"),
    methods=list(
        execute = function() {
          commonsetting()
          subproc()
        },
        commonsetting=function() {
            print("共通処理")
        },
        subproc = function(){}
    ))

```
* commonsetting():共通処理を行うFunction
* subproc():各、子クラスがImplementsするFunction(親クラスでは空実装)
* execute()にて、commonsetting()とsubproc()を実行

```lang:SubClass
modelSub01 <- setRefClass(
    "modelSub01",
    contains="ModelSuper",
    methods = list(
    subproc = function() {
        print("sub01");
    })
)

modelSub02 <- setRefClass(
    "ModelSub02",
    contains="modelSuper",
    methods = list(
    subproc = function() {
        print("sub02");
    })
)
```
* subproc()に各子クラスで処理を変える

```lang:呼び出し側
modelclz <- modelSub01$new()
modelclz$execute()

modelclz <- modelSub02$new()
modelclz$execute()
```
* newするクラスによって、subprocの処理が変わります。
* commonは変わりません



#注意
* R5クラスが利用できるVersionである必要があります
express3からexpress4へアップグレードする時のチェックリスト

- 雑にメモります、随時更新中
- ノウハウや参考記事があれば是非ご紹介ください


### app.configure がなくなった
元々存在理由が不明だったやつ。
普通に `if (app.get('env') === 'development')` 的な条件分岐にする。

### express.logger がなくなった
普通は morgan で代替する。

### express.bodyParser が変わった
3 系でも非推奨だったので、この記事に含めるには微妙だけどついでに書いておく。

https://github.com/expressjs/body-parser

```
// extended: true だと 3 系と同じように
// name="foo[x]" value="val" を { foo:{x: "val"} } へ自動で展開する。
// README によると false 推奨っぽいのだが、何故そうなったのかは不明。
app.use(express.bodyParser.urlencoded({extended: true}));
```

multipart 用のミドルウェアについては、README にあるけど以下のどれかに変更してくれとのこと。

> This does not handle multipart bodies, due to their complex and typically large nature. For multipart bodies, you may be interested in the following modules:
>
busboy and connect-busboy
multiparty and connect-multiparty
formidable
multer

所感：

- miltiparty = 個別のミドルウェアが欲しいなら
- multer = `app.use` で一括指定したいなら
- formidable = フォーム処理的なものも付属している？
  - Ref) http://dev.classmethod.jp/server-side/node-formidable/
- busboy = 用途が良くわからない、multer が中で使ってる

なお、旧 `app.use(express.bodyParser())` も非推奨ログが出るけど動くは動く。

### express.csrf がなくなった
替わりに [csurf](https://github.com/expressjs/csurf) を使う。使い方は全く同じ。

### /bin や /public の雛形が出来た
`express-generator` で生成すると `bin` や `public` ディレクトリができている。
今までオレオレ設定が気になっていた人は、このルールに合わせると少し幸せになれます。

```
$ express express-project 
$ tree express-project 
express-project
├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js
└── views
    ├── error.jade
    ├── index.jade
    └── layout.jade
```

### Router が出来た
http://expressjs.com/api.html#router

未調査だが、ざっと見た感じ

```
app = express.Router()
```

で、グローバルに設定した app を返すようになり、各ファイルで

```
var app = express.Router();
app.get('/', function(req, req, next){});
```

できるようになっている。

また、子ルーターが設定できるよう？ 非常に良い！

```
var router = express.Router();
router.get('/foo', function(req, req, next){});
router.get('/bar', function(req, req, next){});
// 未検証だけど、これで /calendar/foo と /calendar/bar が設定されるのではないか
app.use('/calendar', router);
```

### app を階層構造で定義できるようになった
Router だけではなく、app そのものも階層構造を持てるようになりました。

```
var app = express();
app.get('/', ..略..);

var userApp = express();
userApp.get('/create', ..略..);

// '/' と '/user/create' にルーティングされる
app.use('/user', userApp);

// この mountpath のように、
// 階層構造を前提とした各種プロパティも用意されている
console.log(userApp.mountpath);  // -> '/user'
```



### 参考リンク
- Express 4.x API http://expressjs.com/api.html
Rails(Apache+Unicorn)で、public以下のディレクトリの中身が404になる場合の解決策

そもそもは、GitLabのGroup Avaterがリンク切れになっていて、調査したところ、どうやらファイル自体はアップロードされているものの、ファイル自体を参照しようとすると404になってた、というのが発端です。その対応ログです。

ちなみに、

* RailsのVersion `~> 4.1.0`
* Webサーバ `Apache`
* Applicationサーバ `Unicorn`

の構成です。

# 解決策1（応急処置）

対策自体は、`config/environments/production.rb`の1行を、以下のように修正し、再起動するだけで解決しました。

```ruby:production.rb
# Disable Rails's static asset server (Apache or nginx will already do this)
- config.serve_static_assets = false
+ config.serve_static_assets = true
```

コメントにもあるように、基本的に、static assetsについては、ApacheやNginxのようなWebサーバが行ってくれるはずですが、なぜいけなかったのでしょうか？

# 原因

参考URLにある通り、どうやら、WebサーバであるApacheが`public/uploads/*`をプロキシしても、ApplicationサーバであるUnicornが処理しないのが原因のようです。（設定でそのようにしているのだから当たり前ですね。）

> the problem is apache will proxy the derectory "uploads/*" to unicorn
> but unicorn won't deal with the request because this
> config.serve_static_assets = faules in "config/environments/production.rb"

最初に行った対策で、Apacheからstatic assetsが配信されるようになるのですが、それだと、Unicornの負荷が上がってしまいそうです。（Webサーバを使っている場合、static assetsをApplicationサーバに処理させるのは非推奨のようです。）

なので、根本的には、`config.serve_static_assets = false`として、static assetsはApacheから配信されるように設定し、役割を分けることがより適切な対応となります。

# 解決策2

現時点では、`public/uploads/*`は、Unicornに処理されています。

```:production.log
Processing by NamespacesController#show as HTML
  Parameters: {"id"=>"uploads/group/avatar/**/logo.png"}
Completed 404 Not Found in 10ms (Views: 4.5ms | ActiveRecord: 0.7ms)
```

これを解決するには、リバースプロキシの設定で、public以下の`upload/*`のリクエストは、Webサーバが処理するように設定を追記します。

```:gitlab.conf
#########################################
# Reverse Proxy Settings (GitLab Service)
ProxyPass /uploads ! # <- This is it!
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost on
```

これでWebサーバを再起動すれば、晴れて'public/uploads/*`以下のstatic assetsがApacheで処理されるようになります。

```:access_log
XXX.XXX.XXX.XXX - - [12/Nov/2014:12:54:50 +0900] "GET /uploads/group/avatar/XX/logo.png HTTP/1.1" 301 366 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36"
```

# まとめ

Apacheでpublic以下の任意のディレクトリの中身を処理させたい場合、リバースプロキシの設定を追加する必要がある。

# References

- [[Gitlab 6.2] Profile avatar photo seems broken after uploading file · Issue #5430 · gitlabhq/gitlabhq](https://github.com/gitlabhq/gitlabhq/issues/5430#issuecomment-36205393)

- [GitLab でアバターのアイコンが表示されない問題の解決策 :: FFFORK フォーク](http://blog.eb-de.com/2014/07/24/gitlab-avatar-icon-not-showing/)

- [RailsのProduction環境でAssetsが通らなくて３時間詰まった話 - To create, To entertain](http://tkoyama1988.hatenablog.com/entry/2014/09/08/211741)
cocos2d-xのAndroid.mkを改良してビルドを楽にする

備忘録的にメモメモ


毎回cppファイルを追加する毎にmkファイルを追記するのも面倒なので改良してみる。


Android.mkの初期状態はこんな感じかな。

```bash:Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

$(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)

LOCAL_MODULE := cocos2dcpp_shared

LOCAL_MODULE_FILENAME := libcocos2dcpp

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes

LOCAL_STATIC_LIBRARIES := cocos2dx_static

include $(BUILD_SHARED_LIBRARY)

$(call import-module,.)

```

これを、こんな感じに

```bash:Android.mk(new)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

$(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)

LOCAL_MODULE := cocos2dcpp_shared

LOCAL_MODULE_FILENAME := libcocos2dcpp

FILE_LIST := $(wildcard $(LOCAL_PATH)/../../Classes/*.cpp)

LOCAL_SRC_FILES := hellocpp/main.cpp
LOCAL_SRC_FILES += $(FILE_LIST:$(LOCAL_PATH)/%=%)

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes

LOCAL_STATIC_LIBRARIES := cocos2dx_static

include $(BUILD_SHARED_LIBRARY)

$(call import-module,.)

```

抜き出して書くと、

```bash

#wildcardが使えるのでディレクトリ以下のcppをまるっと指定
FILE_LIST := $(wildcard $(LOCAL_PATH)/../../Classes/*.cpp)

LOCAL_SRC_FILES := hellocpp/main.cpp

#ここで上記で指定したFILE_LISTをLOCAL_SRC_FILESに追加
LOCAL_SRC_FILES += $(FILE_LIST:$(LOCAL_PATH)/%=%)

```

という感じですね。
Classes以下にディレクトリを作る場合、FILE_LISTに別途追記が必要になっちゃいますが、
それでもファイルごとに記述したりする手間はなくなるので大分楽になるはず。
nginx + lua_nginx_moduleでLuarocksと連携させるメモ

# lua.hを探す
lua_nginx_moduleを入れた時に導入したluajitのincludeパスを取得
環境にも依るが大体は
```
/usr/local/luajit/include/luajit-2.0
```
辺りに入ってる、というか入っていた。

# Luarocksのビルド
```
$ wget http://luarocks.org/releases/luarocks-2.1.2.tar.gz
$ tar -zxvf luarocks-2.1.2.tar.gz
$ mv luarocks-2.1.2 /usr/local/src/luarocks && cd /usr/local/src/luarocks

$ ./configure --with-lua-include=[luajitのincludeパス]
$ make build
$ make install
```

# 確認
```
$ luarocks --version

~~下が出れば成功
/usr/local/bin/luarocks 2.1.2
LuaRocks main command-line interface
```

luarocksでインストールしたライブラリがnginxのcontent_by_luaから使える筈
ターミナルからのよく使うSVNコマンド

覚えておいて損はないターミナルからのSVNコマンド
Xcodeのコマンドラインツール（要）

##リボジトリの読み書き

**ファイルのチェックアウト**

```lang:ターミナル
svn co url
```

**URLやリビジョンの確認**

```lang:ターミナル
svn info
```

**ファイルパス　コミットする新規ファイルの追加**

```lang:ターミナル
svn add ファイルパス
svn add ファイルディレクトリ --force
```

**コミット（’　’の中はコミットコメント）**

```lang:ターミナル
svn ci -m 'refs-20 ' ファイルパス
```

**SVNからのファイル削除**

```lang:ターミナル
svn remove ファイルパス
```

##ファイル確認

**修正されたファイルの差分確認**

```lang:ターミナル
svn st
```

**ファイル同士の差分確認**

```lang:ターミナル
svn diff ファイルパス１ ファイルパス2
```

**修正したファイルをSVNのものに置き換える**

```lang:ターミナル
svn revert ファイルパス
```

**ファイル競合解決**

```lang:ターミナル
svn resolved　ファイルパス
```
[Rails 4.1] sitemap-generator を使って Sitemap を作成する。

# はじめに

Rails4.1で作ったWeb ServicesのSEO対策で、sitemapを作りました。
毎週というか、ほぼ毎日本番デプロイをしていくフェーズなので、毎日sitemapを更新出来るようにしたいと思います。


# Gemfile

以下を追記。

```rb:Gemfile
gem "sitemap_generator"
```

追記をしたら bundle install

```rb
$ bundle install
```


# 設定ファイルの生成

```rb
$ rake sitemap:install
```

/config/sitemap.rbが生成される。
ここにサイトマップに載せたいURL情報を記述


# 設定をする

```rb:config/sitemap.rb
# Set the host name for URL creation
SitemapGenerator::Sitemap.default_host = 'http://your_url.jp' # ホスト名
SitemapGenerator::Sitemap.sitemaps_path = 'sitemaps/' # 保存先（この場合 /public/sitemaps/以下になる）

# 以下にサイトマップに載せたいURLを設定していく
SitemapGenerator::Sitemap.create do
  # Put links creation logic here.
  #
  # The root path '/' and sitemap index file are added automatically for you.
  # Links are added to the Sitemap in the order they are specified.
  #
  # Usage: add(path, options={})
  #        (default options are used if you don't specify)
  #
  # Defaults: :priority => 0.5, :changefreq => 'weekly',
  #           :lastmod => Time.now, :host => default_host
  #
  # Examples:
  #
    add article_path, :priority => 0.7, :changefreq => 'daily'
    add ranking_path, :priority => 0.7, :changefreq => 'weekly'

    Product.find_each do |product|
      add product_path(product), :lastmod => product.updated_at
      Kuchikomi.find_each do |kuchikomi|
        add product_kuchikomi_path(product.id,kuchikomi), :lastmod => kuchikomi.updated_at
      end
      Evaluation.find_each do |eval|
        add product_evaluation_path(product.id,eval), :lastmod => eval.created_at
      end
    end

end
```

# 登録/更新

```rb
$ rake sitemap:refresh
```

指定した場所（デフォルトではpublic直下）にsitemap.xml.gzという圧縮ファイルが生成される。
解凍するとsitemap.xmlを確認できる。

これで googleやBingとかに登録してくれます。
[詳しくはGitHubを御覧ください。](https://github.com/kjvarga/sitemap_generator)

## cron

更新cronとかで適宜必要な頻度で上記のコマンドを叩ける様に設定する。


## heroku

herokuアプリの場合、
heroku schedulerを使って、
rake sitemap:rehashを登録。

これでcronが回って登録可能。
HTMLで、コメントが含まれるかたまりを簡単にコメントアウトする方法

あるかたまりをいったんコメントアウトしておきたい場合に、かたまりの中にすでにコメントが含まれていると、うまくコメントアウトできず面倒です。

例えば以下のHTMLのhoge全体をコメントアウトしたい場合、

```:hoge.html
<body>
  <div class="hoge">
    hogehoge
    <!-- comment comment -->
    hogehoge
  </div>
</body>
```

普通にやると以下のようになってしまい、うまくコメントアウトできません。

```:hoge-comment-NG.html
<body>
  <!-- 
  <div class="hoge">
    hogehoge
    <!-- comment comment -->
    hogehoge
  </div>
   -->
</body>
```

そんな時は、`style`タグのコメントアウトを利用した

```:hoge-comment-OK-style.html
<body>
  <style>/*
  <div class="hoge">
    hogehoge
    <!-- comment comment -->
    hogehoge
  </div>
  */</style>
</body>
```

もしくは、`script`タグを使った

```:hoge-comment-OK-script.html
<body>
  <script>/*
  <div class="hoge">
    hogehoge
    <!-- comment comment -->
    hogehoge
  </div>
  */</script>
</body>
```

で、比較的簡単にコメントアウトができます。

参考：
http://stackoverflow.com/questions/12998915/commenting-a-commented-markup-nested-comments
特定のテストのみを走らせる


```bash:shell
go test
```

のように実行すると、
そのディレクトリにあるテストファイルがすべて読み込まれて実行される。

テストを書きながら実装しているときは、
特定のテストのみを走らせたい。

`go test -run`あたりでできそうだったが、うまく行かなかったので、
以下のようなスクリプトを書いた。

```bash:run_test.sh
#!/bin/bash

SRC=$(go list -f '{{range .GoFiles}}{{.}} {{end}}')
TESTS=$(go list -f '{{range .TestGoFiles}}{{.}} {{end}}')

if [ $# -gt 0 ]; then
    TESTS=$1
fi

go test $SRC $TESTS
```

特定のテストファイルを指定して実行する。

```bash:shell
./run_test.sh hogehoge_test.go
```

指定がなければ、すべてのテストが実行される。

`go list -f '{{range .GoFiles}}{{.}} {{end}}'`などで、
Goファイル一覧が取得できるので、これを利用している。

## ※追記

`-run`オプションの意味がわかった。

実行する関数を絞り込めるようだ。

```bash:shell
go test -run Hogehoge
```

を実行すると、`Hogehoge`という文字列が含まれている関数(例えば`TestHogehoge(t *testing.T)`)のみが実行されるようだ。便利。
macでLinuxのisoをUSBメモリに書き込む



```bash:変換
hdiutil convert -format UDRW -o usb archlinux-2014.11.01-dual.iso
```

```bash:USBメモリをumount
diskutil umount /dev/disk2
```

disk2 の部分は適宜修正。

```bash:USBメモリに書き込み
sudo dd if=usb.dmg of=/dev/disk2 bs=1m
```

* archlinux-2014.11.01-dual.iso で起動成功を確認。
iOSSimulator, iPhone 実機の Timezone を変更する


グローバル対応する時用にメモ

## iOSSimulator

mac の timezone を変更する
（以下は OSX10.9 mavericks で確認）

- システム環境設定を開く
- 「日付と時刻」選択
- 「現在の位置情報に基づいて、時間帯を自動的に設定」のチェックを外す
- 表示されている世界地図から目的の国周辺をクリックし、「最も近い都市」から都市名を選択する

## iPhone 実機
以下は iOS8 で確認

- 「設定」アプリをタップ
- 「一般」>「日付と時刻」タップ
- 「自動設定」が ON になっていたら OFF にする
- 「時間帯」をタップし、目的の都市名を検索


## おまけ：コードで変える場合


```Objective-C
NSTimeZone *timeZone = [[NSTimeZone alloc] initWithName: @"Asia/Taipei"];
[NSTimeZone setDefaultTimeZone: timeZone];
```

---

※ 確認が終わったらすぐ元に戻しとかないと、時差が少ない都市の場合気づかずに仕事時間が伸びたりしますので気をつけましょう
Rakeタスクのログの書き方


Rakeタスクといえどもログでどのように動いているか確認したいときがあります.

Rakeには`--trace`と`--verbose`のオプションがあり、自作のタスクにもこのオプション次第で詳細を出力したかったので調べてみました.

結果から言うと`Rake.application.options.trace`と`verbose`で判定できます.
`trace`に関しては専用のメソッド`Rake.application.trace`を使います.

```ruby
Rake.application.trace "ran with trace" if Rake.application.options.trace
puts "ran with verbose" if verbose
```

其々のオプションを指定にすると以下のように有効になります.

| Option        | trace   | verbose |
|---------------|---------|---------|
| -t, --trace   | `true`  | `true`  |
| -v, --verbose | `false` | `true`  |


## 参考

- [Checking if Rake was called with Verbose or Trace](http://engineering.hoteltonight.com/checking-if-rake-was-called-with-verbose-or-t)
pepperめも_02:ペッパーとmacをつないでみる方法

#ペッパーとmacをつないでみよう！
ペッパーとmacを繋ぐ方法をまとめました！
※随時追記していきます

#環境
パソコン（mac book pro）
※OS X Yosemite
ペッパー

#wifi
あらかじめ、おなじwifiにつなげておきます

#IDとPASSWORD
基本的には、ペッパーの初回起動時に決めたやつを使います。
ユーザー名は nao で、パスワードは自分で決めたやつ

#IPアドレスの確認のしかた
ペッパーのタブレットの後ろ（胸のあたり）に、スイッチがあるので押すとしゃべります。
それか、Choregrapheの接続ボタンを押すと表示されます。
![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/40994/43a3f734-396d-e5b0-b717-9bc545c95e22.png)

この例だと、192.168.0.64か、tolebot.local で接続できます。
IPアドレスは変わるかもなので、ロボット名でやったほうが楽かもしれない。
※tolebotは初回起動時に決めたロボットの名前です。

#Choregrapheでつないでみる１
![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/40994/f457c2dc-8ccd-8c56-40b8-6b1d9e42c663.png)
緑のアンテナボタンを押して自分のロボットを選べばＯＫです！簡単！
赤いのを押すと終了します。

プログラムするときはこれを使います。

#Choregrapheでつないでみる２
```
接続→上級者向け→ファイルの転送
```
![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/40994/9b5e9748-5f23-12c0-525a-2dba0fb80e52.png)
メニューから、ファイルの転送を選びます。

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/40994/b8172306-e5e3-a07b-b593-3e36796af19a.png)
ロボットのシェアードフォルダの中が見れます。
ファイルのアップロードとダウンロードができるみたい！

#ブラウザでつないでみる

```
http://192.168.0.64/
```

![ロボットウェブページ](https://qiita-image-store.s3.amazonaws.com/0/40994/393f0fa0-8529-5ec9-81ca-57684d42248b.png)
BASIC認証でIDとPASSを聞かれます。
起動時に出るやつと同じっぽい画面が表示されます。
再起動するときに、この画面をつかうとソフトだけ再起動するのでちょっと早いです。

あと、?のメニューから、旧ロボットウェブページにいけます。
こっちのほうが、いじれる項目多いけどnao用みたいなので、つかっていいかは不明です。
ロボットのアイコンとか変えられそうだけど、元に戻せなかったら嫌だし。

#FTPソフトでつないでみる(SSH)
SSHでつなげるので対応したFTPソフト（transmitとか）で簡単に繋げることができます！
![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/40994/6be418c1-748a-27f8-57cb-ceb622944a0a.png)

こんな感じで、ペッパーの中が見れます。
![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/40994/d12fc3c8-c31b-a665-a8b9-f622bafdc924.png)

#ターミナルでつないでみる
ターミナルを起動して ssh nao@IPアドレス でログインできます。

```
ssh nao@tolebot.local
```

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/40994/1df2cd56-5eca-e214-e8d3-1a1795fdab12.png)

uname -a の情報がおもしろかった！

```
$ uname -a
Linux tolebot 2.6.33.9-rt31-aldebaran-rt #1 SMP PREEMPT RT Thu Oct 23 13:32:24 CEST 2014 i686 Intel(R) Atom(TM) CPU Z530 @ 1.60GHz GenuineIntel GNU/Linux
```

#SSHでつないだ時の注意点
ファイルの削除とかできちゃいます。ペッパーを工場出荷時に戻す方法が謎なので怖いです。

#おしまい
以上、ペッパーくんのつなげ方めもでした！
タブレットに繋ぐ方法わからないので、しってたら教えて欲しいです！
mgmt経由のルート作成方法

NTPサーバと通信したいけど、どうもmgmt経由で通信出来なかったのでメモ書きとして。。。

<h2>設定方法</h2>

```
[root@BIG-IP:Active:Standalone] config # tmsh
root@(BIG-IP)(cfg-sync Standalone)(Active)(/Common)(tmos)# create sys management-route "Routeの名前" network "通信したいセグメント" gateway "mgmtのGatewayIP"
ex) create sys management-route lognet1 network 10.10.10.0/255.255.255.0 gateway 10.0.0.1
root@(BIG-IP)(cfg-sync Standalone)(Active)(/Common)(tmos)# save sys config

確認したい場合は下記コマンドを実行
root@(BIG-IP)(cfg-sync Standalone)(Active)(/Common)(tmos)# list sys management-route 

```

以上っす(｀･ω･´)ゞ

参照先URL
[Overview of management interface routing](https://support.f5.com/kb/en-us/solutions/public/13000/200/sol13284.html)
sails.js で手元にドキュメントを入れてオフライン開発を効率化する方法 ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい | sails.js (0.10.x) で始めるアプリ開発

**この記事では以下の絵文字を大事な個所で使用中**

 - :exclamation: 注意点
 - :boom: 予期せぬ例外やエラーメッセージ
 - :sunny: 解決方法・お役立ち情報

Sails.js | Realtime MVC Framework for Node.js - http://sailsjs.org/

:exclamation: **sails.jsはアップデート頻度が高い⇒この記事執筆時点と仕様が異なっている可能性があるのでバージョンに注意**

# 記事の概要

sails.js を使った開発に慣れていないあいだ :new: はドキュメントを頻繁に見ることになる。公式のオンラインドキュメントが充実している http://sailsjs.org/#/documentation/concepts が、オフラインの時にみられないのと、サイト自体がダウンロードしにくい構造になっている :cry:

ので、ダウンロードする方法を紹介

# :sunny: Markdown形式の公式ドキュメントがある

github.com で公開されている
https://github.com/balderdashy/sails-docs

ここからチェックアウト:arrow_down:するだけでOK

:sunny: Markdown ファイルなので、viewer は用意しておくとなおよい :smile:

eclipse 利用者は、これ↓もいいかも

GitHub Flavored Markdown viewer plugin for Eclipse
http://marketplace.eclipse.org/content/github-flavored-markdown-viewer-plugin-eclipse#.VGLJiPmSy7I
void関数はvoid関数の呼び出し結果を返すことができるらしい

テストコード

```cpp:test.cpp
#include <iostream>

void hogehoge() {
	std::cout << "hogehoge" << std::endl;
}

void hoge() {
	return hogehoge();
}

int main() {
	hoge();
	return 0;
}
```

コンパイルと実行
```
clang++ -stdlib=libc++ test.cpp -Wall -Wextra && ./a.out
```

実行結果
```
hogehoge
```

 ~~コンパイルできるし警告も出ていません。~~

 ~~検索してみたけどなぜこれができるのかは分かりませんでした。~~

さらに調べたところ、wikipediaでこれに関する説明を見つけました。
http://ja.wikipedia.org/wiki/Return文
テンプレートで使うためですね、なるほど。
sails.js + mocha でテストしたいのに cannot find module 'sails' って言われたとき (windows)

# 現象

**Windows7 の環境で**

sails.js のテストを試したとき http://sailsjs.org/#/documentation/concepts/Testing

```bash
sails list
```

もうまくいくのに、

```bash
mocha
```

で

```
Cannot find module 'sails'
```

:anger: と怒られた :angry: ときの話 :cry: 当然

```
npm list -g
```

で sails がグローバルにインストールされていることは確認済み :ok: 

# 解決方法

環境変数 NODE_PATH に node_modules のパスを設定した

:angel: 以上 :smile: 

参考 :notebook: http://stackoverflow.com/questions/21047030/nodejs-cannot-find-module
aws-sdk-coreでcredentialsのプロファイルを切り替える


## credentialsファイル

Linux/Macでは`~/.aws/credentials`に置く。
プロファイルごとにアクセスキーID/シークレットアクセスキーを設定できる。
デフォルトのプロファイルは`default`になる。

```ini:~/.aws/credentials
[default]
aws_access_key_id = DEFAULT_ACCESS_KEY_ID
aws_secret_access_key = DEFAULT_SECRET_ACCESS_KEY
aws_session_token = DEFAULT_SESSION_TOKEN
 
[dev]
aws_access_key_id = DEV_ACCESS_KEY_ID
aws_secret_access_key = DEV_SECRET_ACCESS_KEY
```

## オブジェクトごとに切り替える

`~/.aws/credentials`に設定ファイルがあるなら`:profile`にプロファイル名を指定するだけ。

```ruby
require 'aws-sdk-core'

ec2 = Aws::EC2::Client.new region: 'ap-northeast-1', profile: 'dev'
```

別のパスを指定するなら`Aws::SharedCredentials`を作成して渡す。

```ruby
require 'aws-sdk-core'

creds = Aws::SharedCredentials.new path: '/path/to/creds', profile_name: 'dev'
ec2 = Aws::EC2::Client.new region: 'ap-northeast-1', credentials: creds
```

## まとめて切り替える

`~/.aws/credentials`にファイルがある場合。

```ruby
require 'aws-sdk-core'

Aws.config[:profile] = 'dev'
Aws.config[:region] = 'ap-northeast-1'
ec2 = Aws::EC2::Client.new
```

別のパスを指定する場合。

```ruby
require 'aws-sdk-core'

creds = Aws::SharedCredentials.new path: '/path/to/creds', profile_name: 'dev'
Aws.config[:credentials] = creds
Aws.config[:region] = 'ap-northeast-1'
ec2 = Aws::EC2::Client.new
```
Drupalでダミーデータを作成する


テスト用にデータが必要な場合は、以下の手順で作成することができます。

### 1.Devel generateモジュールをインストール
Develモジュールをインストールすると自動的に入ります。
https://www.drupal.org/project/devel


### 2.ダミーコンテンツを作成する。
ConfigurationにGenerate itemsが表示されているので、移動します。
コンテンツタイプや、作成する数を決め「generate」ボタンを押せば完了です。

![スクリーンショット 2014-11-12 11.27.27.png](https://qiita-image-store.s3.amazonaws.com/822/15535/2f02cf55-a693-73c7-8a39-6e75dda76fec.png "スクリーンショット 2014-11-12 11.27.27.png")
Java入門：第10回 クラスの定義と利用

※ここからオブジェクト指向に入りますが、Androidアプリケーションを学んだのだけれどJavaがよくわからない人向けの解説になります。

8回までJavaの基本的な文法について見てきました。7回まではmainメソッドと呼ばれる実行可能場所にどのような命令を書けば良いかという話でした。8回はメソッドを自分で作り、mainメソッドの外に処理を記述しました。すべての処理をmainメソッドの中に記述することもできますが、再利用が出来ないなどの理由から自分でメソッドを作って呼び出してみたわけです。

複数の人（数人～世界中の参加者）が集まってアプリケーションを構築することをイメージしてみてください。みんなが一つのファイルの中に、処理を記述したりメソッドを定義したりすると何が書かれているのかわからなくなり混乱してしまいます。そこでJavaではクラス単位でファイルを分けることができます（注：1ファイル内に複数のクラスを定義することもできますがここではファイル単位とし説明します）。

別ファイルに分けたクラスには第8回と同じようにメソッドを記述することができます。例えば擬似的にAndroidでよく利用するActivityを定義するとしたら、次のようになります。

```java
public class Activity {

}
```

このActivityクラスを利用するには、mainメソッド内で次のように利用します。

```java
static public  void main(String [] args) {
  Activity actA = new Activity();
}
```

Javaではnew演算子を利用することで、そのクラスを利用することができるようになります。次のように複数個のActivityクラスを利用することもできます。

```java
static public  void main(String [] args) {
  Activity actA = new Activity();
  Activity actB = new Activity();
}
```

これらの概念図は次のようになります。

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/22658/64219f67-00e4-d190-bf50-0b5326763527.png)


new演算子を利用して生成したものをオブジェクトまたはインスタンスと呼びます。オブジェクトには名前をつけることができて、actAやactBという名前を付けています。これら名前のことをオブジェクト変数またはインスタンス変数といいます。オブジェクト変数を利用してそのオブジェクトの持つさまざまな機能を利用することができます。

actAやactBはそれぞれ別のオブジェクトに結びついています。試しに次のように記述してみましょう。

```java
static public  void main(String [] args) {
  Activity actA = new Activity();
  Activity actB = new Activity();
  System.out.println(actA);
  System.out.println(actB);
}
```

実行すると、次のように表示されます。

```java
Activity@5127a6bc
Activity@233aa44
```

Activityというクラス名の後ろに数字とアルファベットが並んでいます。この数字とアルファベットは実行のタイミングや環境によって異なります。これはオブジェクトの製造番号のようなもので、actAもactBもそれぞれ、Activityクラスなのだけれど別の存在であることを示しています。

喩えるならば、AndroidのNexus5をいう機種があったとします。このNexus5を私とあなたが持っていたと考えた時に、どちらもNexus5であることには変わりませんが、異なる存在であることと同じ状況なのです。このように考えるとクラスはその存在を定義したものであり、その存在を定義した設計図であるといえます。またオブジェクトはクラスという設計図から実際に創りだしたモノであるといえます。

このようにオブジェクト（モノ）の考え方を主体にプログラミングを行うことをオブジェクト指向プログラミングと呼びます。
SimpleXMLElementをデバッグする

#XMLをパースしたSimpleXMLElementをデバッグする

コードだけ欲しい人は下まで読み飛ばして欲しい。

###SimpleXMLElementとは

xmlの構文解析で使用するEntity的な物である。
XML文章を変換し最終的にSimpleXMLElementにパースされる。

詳しくはPHPのリファレンスを参照

http://php.net/manual/ja/class.simplexmlelement.php

###HTMLを構文解析

HTMLもSimpleXMLElementにパースすることができる。

```php
$domDocument = new DOMDocument();

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'ASCII, JIS, EUC-JP, SJIS, UTF-8');//文字化け対策に全て参照文字に変換
@$domDocument->loadHTML($html);
$xmlString = $domDocument->saveXML();
$xmlObject = simplexml_load_string($xmlString);

```

###パースで来てもデバッグ出来ない

いざパースされたSimpleXMLElementを使用しようとしても目的の値がどのPathに格納されているか分からない場合がある。
するとソースから要素を調べる必要があるが数百行を超えるHTMLを追うのは苦行いがいの何物でもない。

ではパースされたSimpleXMLElementインスタンスをデバッグしようとするが、
var_dumpやprint_rでは反復処理が解決できず、パスがダンプ出来ない。
そのため独自のデバッグclassが必要になった。

###ソース

```php:SimpleXMLElementDumper.php

<?php
class SimpleXMLElementDumper {
    public function dump($url) {

        /* ページ読み込み */
        $html = @file_get_contents($url);
        if ($html === false) {
            echo 'get contents error ' . PHP_EOL;
            exit;
        }
        $xmlObject = $this->_parse($html);

        if ($xmlObject instanceof SimpleXMLElement) {
            $this->_dumpSimpleXMLElement($xmlObject);
        }
    }

    private function _parse($html) {
        $domDocument = new DOMDocument();

        $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'ASCII, JIS, EUC-JP, SJIS, UTF-8');
        @$domDocument->loadHTML($html);
        $xmlString = $domDocument->saveXML();

        $xmlObject = simplexml_load_string($xmlString);
        return $xmlObject;
    }

    private function _dumpSimpleXMLElement($xmlObject, $xpath = '') {
        if ($xmlObject instanceof SimpleXMLElement) {
            $xpath .= $xmlObject->getName() . '->';//パンくずリストを作る
            echo $xpath . PHP_EOL;
　　　　　　//要素のプロパティを表示
            foreach ($xmlObject->attributes() as $key => $value) {
                echo $key, '=', $value . PHP_EOL;
            }
            //要素を表示
            var_dump($xmlObject->__toString()) . PHP_EOL;
            //子要素がなくなるまで再帰的に呼ぶ
　　　　　　foreach ($xmlObject->children() as $val) {
                $this->_dumpSimpleXMLElement($val, $xpath);
            }
        } else {
            echo gettype($xmlObject) . PHP_EOL;
        }
    }

}

if (isset($argv[1])) {
    $url = $argv[1];
} else {
    echo 'Refused to display.' . PHP_EOL;
    exit;
}
$rd = new SimpleXMLElementDumper();
$rd->dump($url);


```

使用法はコンソールで第一引数にURLを与えれて実行

```bash

php http://qiita.com/

```

実行すると以下のような出力を得る

```text

html->
string(0) ""
html->head->
string(0) ""
html->head->meta->
charset=UTF-8
string(0) ""
html->head->title->
string(56) "Qiita - プログラマの技術情報共有サービス"

～省略

```

###note

XMLの特性上、特定の入子要素で期待した出力を得られない場合がある。

```html

<span>お申込みは<a href="./reg">こちら</a>から</span>

```

のような構文をパースすると

```text

span->
string(21) "お申込みはから"
span->a->
href=./reg
string(9) "こちら"

```

上記のような出力される。
「お申込みはこちらから」のような連続した文字列は得られないことを知っておく必要がある。