OmniAICreator/Qiita-1.07M huggingface dataset:
ATXMEGA シリーズの USART における BSEL と BSCALE をお手軽に算出する方法


何かと日本語資料が少ない ATXMEGA シリーズの USART に関して。

USART は ATMEGA の USART (UART) と使い方はほぼ同じですが、ATMEGA シリーズとは違い BSCALE (Baud Rate Scale factor) というクロック尺度調整機能がついています。この BSCALE と BSEL (Baud Rate bits) を組み合わせることにより、どんなシステムクロックでも任意のボーレートを設定できるようになっています。

しかし、BSCALE の算出方法はデータシートを見てもいまいちピンときません。avr-gcc のライブラリにもお手軽に USART を使える関数やマクロも見当たらず。

アプリケーションノートを探してみると、なんとエクセルのボーレート計算マクロがありました！

AVR1307: Using the XMEGA USART ([pdf](http://www.atmel.com/Images/doc8049.pdf), [ソースコードやエクセルファイルなどのzip](http://www.atmel.com/images/AVR1307.zip))

この zip の中に `Baudrate_Calculations.xls` というファイルがあります。このエクセルファイルを開いて CPU Clock と User Baurate を指定するだけで、 BSCALE, BSEL, CLK2X の指定すべき値とエラー率が一覧表示されます。

![スクリーンショット 2015-04-05 10.12.16.png](https://qiita-image-store.s3.amazonaws.com/0/33935/adee0f04-39e0-5912-9100-3314ecc26032.png "スクリーンショット 2015-04-05 10.12.16.png")

グリーンのセルは小さいエラーで通信できることを示しています。

---

例えば、システムクロック 1MHz で、USART を 19.2kbps で使いたいときは、
- BSCALE: -1
- BSEL: 11
- CLK2X: 1
を選択すれば、エラー率 0.16% で通信できるようになることが上の画像からわかります。

USART の初期化のソースコードは以下のような感じでOK。

```main.c
#define F_CPU 1000000UL

・・・ 省略 ・・・

void initUsart()
{
	// USARTCO, 19.2kbps, -0.16%
	// BSCALE:-1, BSEL:11, CLK2X: 1
	
	// Set BSCALE and BSEL
	USARTC0_BAUDCTRLA = 11;
	USARTC0_BAUDCTRLB = USART_BSCALE3_bm | USART_BSCALE2_bm | USART_BSCALE1_bm | USART_BSCALE0_bm;
	
	// Enable RX,TX and CLK2X
	USARTC0_CTRLB = USART_RXEN_bm | USART_TXEN_bm | USART_CLK2X_bm;
	
	// Async, 8bits, non parity-bits, 1stop-bit
	USARTC0_CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;
}
```
homebrew インストール方法

自分用のメモ。

## はじめに
Xcodeをインストールしてあること。
App Storeからインストールしておいてください。

## homebrewのインストール
[homebrew](http://brew.sh/)のインストールをします。下記コマンドを打ってください。

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

途中でEnterキーの入力とパスワードの入力を聞かれます。

## チェック

```brew doctor``` を実行して、何もエラーがでなければ正常にインストールは完了です。

```
$ brew doctor
Your system is ready to brew.
```

## 参考URL
http://qiita.com/_daisuke/items/d3b2477d15ed2611a058
RaspberryPiのワンポイント情報

RaspberryPi2を購入した。忘れたりハマるかもな点をまとめておく。

# SDカードのフォーマット
https://www.sdcard.org/downloads/formatter_4/eula_mac/
raspberryにてインストールを行ってから 再度インストールしようとすると、ファイルシステムのエラーがでたりする。macのdiskutilityでFATフォーマットしても解決せず。そういうときは sdcard.orgからフォーマットアプリをダウンロード。

# Rasbianのユーザ
NOOBを使ってRasbianをインストールしたら、通常は下記のユーザとパスワードが設定されてる。
ユーザー名：pi
パスワード：raspberry

# IP固定化
/etc/network/interfaces
>iface eth0 inet dhcp
↓
iface eth0 inet static
address xxx.xxx.xxx.xxx
netmask xxx.xxx.xxx.xxx
gateway xxx.xxx.xxx.xxx

/etc/resolv.conf
>nameserver xxx.xxx.xxx.xxx

# su
sudo su

# インストール時の設定をもう一度
raspi-config

#
「Ruby力向上のための基礎トレーニング」をCommon Lispで解いてみた


## はじめに

[「Ruby力向上のための基礎トレーニング」をテストコード付きで解いてみた](http://qiita.com/jnchito/items/2fedbfa9f887635e6c6a)に触発されまして、Common Lispで解いてみようと思いました。元ネタの記事は[Ruby力向上のための基礎トレーニング](http://blog.nanapi.co.jp/tech/2015/04/02/basic_training_of_ruby/)です。今回はテスト作ってません。あと、追加仕様もまだ実装できていません。。。

## 問題

[AOJ – オンライン プログラミング チャレンジ / Matrix-like Computation](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0102&lang=jp)

> 以下の表のように、与えられた表の縦・横の値の合計を、それぞれの行・列で求め出力して終了するプログラムを作成してください。

|    - | col1 | col2 | col3 | col4 |
|-----:|-----:|-----:|-----:|-----:|
| row1 |    9 |   85 |   92 |   20 |
| row2 |   68 |   25 |   80 |   55 |
| row3 |   43 |   96 |   71 |   73 |
| row4 |   43 |   19 |   20 |   87 |
| row5 |   95 |   66 |   73 |   62 |


↓

|    - | col1 | col2 | col3 | col4 |  sum |
|-----:|-----:|-----:|-----:|-----:|-----:|
| row1 |    9 |   85 |   92 |   20 |  206 |
| row2 |   68 |   25 |   80 |   55 |  228 |
| row3 |   43 |   96 |   71 |   73 |  283 |
| row4 |   43 |   19 |   20 |   87 |  169 |
| row5 |   95 |   66 |   73 |   62 |  296 |
|  sum |  258 |  291 |  336 |  297 | 1182 |


## 僕の解答例
お恥ずかしながら、Common Lispでプログラムを本格的に書いたのはこれが初めてです。書籍の写経はやっていたのですが、自分で書いてみようと思ってもうまくかけません。数時間かけてやっとこ書けました。関数がいっぱいできてしまったけど、ここまでする必要ないのかしら。


```cl:
;; リストの合計を求める関数
(defun sum (lst)
  (apply #'+ lst))

;; リストの末尾に要素を追加する関数
(defun add-to-last (lst elm)
  (append lst (list elm)))

;; リストの末尾に要素の合計を追加する関数
(defun add-sum-to-last (lst)
  (add-to-last lst (sum lst)))

;; ２次元リストの行を列に変換する関数
(defun transpose (mtx)
  (apply #'mapcar #'list mtx))

;; ２次元リストを受けて合計を追加したリストを返す関数
(defun sum-matrix (mtx)
  (transpose
    (mapcar #'add-sum-to-last
      (transpose
        (mapcar #'add-sum-to-last mtx))))

;; 入力値
(setq input
      '((9 85 92 20)
        (68 25 80 55)
        (43 96 71 73)
        (43 19 20 87)        
        (95 66 73 62)))

;; 結果
(setq expected
      '((9 85 92 20 206)
        (68 25 80 55 228)
        (43 96 71 73 283)
        (43 19 20 87 169)
        (95 66 73 62 296)
        (258 291 336 297 1182)))

;; main
(equal expected (sum-matrix input))
;;=> T  

```
Ubuntu にchromedriver を入れる


# 最新版をwgetで持ってきてunzip


    $ wget -N http://chromedriver.storage.googleapis.com/2.15/chromedriver_linux64.zip -P /tmp

    $ unzip /tmp/chromedriver_linux64.zip -d /tmp


# /usr/local/share において/usr/local/bin　にシンボリック

    $ sudo mv /tmp/chromedriver /usr/local/share

    $ sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver

# 確認

    $ which chromedriver

いいね！
[iOS] Fabric 入門  アカウント登録 & Twitter Kit を使ってログインする。アイコン、コードが表示されない件。

概ね下記資料で作成
http://dev.classmethod.jp/smartphone/ios-fabric-sign-in-with-twitter/


「本文」こんな感じです。ビルドを1回実行すると次に進めます。
の部分は下記詳細を参照
http://www.runscriptbuildphase.com/

アイコン（コードも表示されない）が表示されない問題
![スクリーンショット 2015-04-05 7.32.50.png](https://qiita-image-store.s3.amazonaws.com/0/64334/7dd95783-3795-8e75-0952-f71acfd0eba4.png)

一旦再起動してみることにする。

出た。
![スクリーンショット 2015-04-05 7.53.53.png](https://qiita-image-store.s3.amazonaws.com/0/64334/106f7cb0-994a-753a-df5e-219b7e1cd202.png)
PHPからMeCabを利用してよみがなを取得する

PHPなWEBアプリケーションの開発をしていて、日本語の文字列のよみがなを取得したい ってな場合に、形態素解析エンジンのMeCabを利用する方法です。

Google Codeの閉鎖が予定されているせいかプロジェクトのホスティングサイトやダウンロードURLなどが変わってました。

MeCab
http://taku910.github.io/mecab/

## 環境
```
$ cat /etc/redhat-release
CentOS release 6.6 (Final)

$ php -r "echo PHP_VERSION;"
5.6.7
```

MeCabインストールに必要なものが入っているか確認する

```
$ which g++
/usr/bin/g++

$ which iconv
/usr/bin/iconv
```


## MeCabインストール

### 作業ディレクトリ作成
```
$ mkdir -p ~/src/mecab; cd ~/src/mecab
```

### MeCab本体のインストール
```
$ curl -L -o mecab-0.996.tar.gz "https://drive.google.com/uc?id=0B4y35FiV1wh7cENtOXlicTFaRUE&export=download"
$ tar zxf mecab-0.996.tar.gz
$ (cd mecab-0.996; ./configure --enable-utf8-only && make && sudo make install)
```

### 辞書のインストール
```
$ curl -L -o mecab-ipadic-2.7.0-20070801.tar.gz "https://drive.google.com/uc?id=0B4y35FiV1wh7MWVlSDBCSXZMTXM&export=download"
$ tar zxf mecab-ipadic-2.7.0-20070801.tar.gz
$ (cd mecab-ipadic-2.7.0-20070801; ./configure --with-charset=utf8 && make && sudo make install)
$ (cd mecab-ipadic-2.7.0-20070801; /usr/local/libexec/mecab/mecab-dict-index -f euc-jp -t utf8 && sudo make install)
```

### 動作確認
mecabコマンドの-Oyomiオプションで、よみがなが得られることを確認します。

```
$ echo '敗北？私はその言葉の意味を存じ上げません。' | mecab -Oyomi
ハイボク？ワタシハソノコトバノイミヲゾンジアゲマセン。
```

## MeCab PHPバインディングのインストール

php-mecab: MeCab binding for PHP
https://github.com/rsky/php-mecab

### インストール
```
$ mkdir -p ~/src/github/; cd ~/src/github/
$ git clone https://github.com/rsky/php-mecab.git; cd php-mecab/mecab
$ phpize && ./configure --with-mecab=/usr/local/bin/mecab-config && make && make test && sudo make install
$ sudo sh -c "echo 'extension=mecab.so' > /etc/php.d/mecab.ini" 
```

### 動作確認

mecabコマンドと同様にPHPでも `new MeCab_Tagger(array('-O' => 'yomi'))` として読みが得られることを確認します。

```
$ cat <<EOL > /tmp/test-mecab.php
<?php
if (!extension_loaded('mecab')) {
        echo "Not loaded mecab.so". PHP_EOL;
        exit(1);
}

\$str = \$argv[1];
if (\$str) {
        echo "Test str = ". \$str . PHP_EOL;
} else {
        echo "Not found str". PHP_EOL;
        exit(1);
}

\$mecab = new MeCab_Tagger(array('-O' => 'yomi'));
echo \$mecab->parse(\$str) . PHP_EOL;
EOL
```

```
$ php /tmp/test-mecab.php "雨を喜び、風を楽しみ。"
Test str = 雨を喜び、風を楽しみ。
アメヲヨロコビ、カゼヲタノシミ。
```
The NewWorld is a new world!!

# The NewWorld is a new world!!

皆さん英語は得意ですか？　私は苦手です。　でも頑張って使ってます。
努力しないと、グランド・ラインでは生き残れませんからね。

## What is a NewWorld?
**NewWorld** は、**onepiece-famework** が創りだした **新世界** です。
**新世界** に乗り出しませんか？

## Major features.
**NewWorld** は、 **Entry-point** から **End-point** まで **Dispatch** を行います。
基本的に **NewWorld** の仕事は **Dispatch** のみです。
**Dispatch** 先のルート（経路）の計算は、**Router** が行います。

ひょっとして話が難しいですか？　でも、頑張って下さい！！

`お前みたいなルーキーなんざこの海には五万といるんだぜ。`
![67871.jpg](https://qiita-image-store.s3.amazonaws.com/0/67460/8fe661ee-5611-8654-986d-f6edcbd0590a.jpeg)

## What is a Dispatch?!
**Dispatch** という用語について、覚える必要はありません。
重要なのは、**ブラウザからそのURLにアクセスした時**に、**どのファイルが実行されているか**ということです。

**NewWorld** が画期的なのは、**URLと実行するファイルのパスが一致している**ことです。

つまり、`http://localhost/foo/bar` というURLにアクセスした時は、
1. 最初に `/var/www/html/app.php` が実行されます。 *-- Entry-point*
2. 次いで `/var/www/html/foo/bar/index.php` が実行されます。 *-- End-point*

え？そんなの当たり前じゃないの？と思いますか？
今までのフレームワークは、そんな当たり前のことができなかったのです。

ちなみに、なぜ最初に **app.php** を実行してから **index.php** を実行するかというと、
まず **app.php** でアプリケーションの初期化や統一的な設定を行いたいからです。

このような処理のことを **bootstrap** とも呼びます。

**NewWorld** では便宜上、各ディレクトリに設置された **index.php** を **コントローラー** と呼ぶことにしていますが、それは一般的なWebフレームワークに慣れた人に合わせてそう呼んでいるだけで、別にコントローラーではありません。

それをコントローラーにするかはシステム開発者（あなた）次第です！！

## Does not exists action!!

**NewWorld** には **アクション** と規定された動作はありません。なぜなら、それはフレームワークの要件ではないからです。

もしプログラムのメインフローを細分化したいのであれば、それはシステム開発者（あなた）が、考え、行うべきであって、フレームワークに強制されるべき仕様ではありません。

## Does not exists view!!

一般的なWebフレームワークのようなviewの強制もありません。なぜなら、それはシステム開発者（あなた）が、考え、設計するべき問題であって、フレームワークに強制されるべき仕様ではないからです。

![海賊王 支配なんかしねぇよ.jpg](https://qiita-image-store.s3.amazonaws.com/0/67460/65c2eb5c-8103-bf75-f590-616a77c871d6.jpeg)

---

# This sea is surprisingly free.

**onepiece-framework** は驚くほど自由です。

`自由とは、強者にとっての天国であり、弱者にとっての地獄である。`
![1acfd796.jpg](https://qiita-image-store.s3.amazonaws.com/0/67460/4a0223a4-3ae8-8ab5-a375-7dd83a24a302.jpeg)

自由を謳歌するには実力が必要です。

自由を謳歌したければ実力が必要です。

自由に生きるためには実力が必要です。

実力を手に入れたら自由に生きられます。

暴君になるも覇者になるも自分次第です。

![468431-untitled_62.png](https://qiita-image-store.s3.amazonaws.com/0/67460/66a24530-9737-452b-4300-fde19e6a53e9.png)
docker-machine --driver virtualbox "No IP address found" でマシンを作れないとき

### disclaimer
- すでに[docker/machine](https://github.com/docker/machine/issues/721)にもポストしてしまったネタですが、実際問題が解決している人もいるようなので、日本語でも見つかるようにマルチポストしておきます。

### 問題
- docker-machineでvirtualbox providerを使って新しくホストを作成しようとしたときに以下のようなエラーが出て失敗する

```
INFO[0000] Creating SSH key...                          
INFO[0000] Creating VirtualBox VM...                    
INFO[0011] Starting VirtualBox VM...                    
INFO[0012] Waiting for VM to start...                   
ERRO[0065] Error creating machine: No IP address found 4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:26:c2:13 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::a00:27ff:fe26:c213/64 scope link 
       valid_lft forever preferred_lft forever

WARN[0065] You will want to check the provider to make sure the machine and associated resources were properly removed. 
FATA[0065] Error creating machine                 
```

### 解決法
```
VBoxManage list -l hostonlyifs
```
でVirtualBoxのホストインターフェイスの設定を調べる(vboxnet1).
IPAddressのところに注目する。

```
Name:            vboxnet1
GUID:            786f6276-656e-4174-8000-0a0027000001
DHCP:            Disabled
IPAddress:       192.168.99.1
NetworkMask:     255.255.255.0
IPV6Address:     
IPV6NetworkMaskPrefixLength: 0
HardwareAddress: 0a:00:27:00:00:01
MediumType:      Ethernet
Status:          Up
VBoxNetworkName: HostInterfaceNetworking-vboxnet1
```

192.168.99.*などとなっていると要注意。これがどうもdocker-machineがeth1に与えたいIP address rangeとかぶっているらしい。この場合、例えば以下のようにアドレスを変更する。

```
Name:            vboxnet1
GUID:            786f6276-656e-4174-8000-0a0027000001
DHCP:            Disabled
IPAddress:       192.168.59.103
NetworkMask:     255.255.255.0
IPV6Address:     
IPV6NetworkMaskPrefixLength: 0
HardwareAddress: 0a:00:27:00:00:01
MediumType:      Ethernet
Status:          Up
VBoxNetworkName: HostInterfaceNetworking-vboxnet1
```

その後、docker-machine rm => createでマシンを再作成すれば問題が起きなくなった。
ソケットを使ったチャット作成

webアプリでないコマンドラインでの、pythonのチャットプログラムは、探せばある。
しかし、どれも(非同期入力ができるものは)Windowsで動かない。一応、動くものができたので公開する。

#サーバープログラム
「python server.py IPアドレス」として起動

```python:server.py
import sys, socket, select
 
def broadcast(socklist, server_socket, sock, message):
    print(message)
    for socket in socklist:
        if socket != server_socket and socket != sock :
            try :
                socket.send(message.encode())
            except :
                socket.close()
                socklist.remove(socket)
 
if __name__ == '__main__':
    port, socklist, server = 5001, [], '127.0.0.1' if len(sys.argv) <= 1 else sys.argv[1]
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((server, port))
    server_socket.listen(10)
    socklist.append(server_socket)
    print('Start')
    while True:
        read_sockets, write_sockets, error_sockets = select.select(socklist, [], [])
        for sock in read_sockets:
            if sock == server_socket:
                sockfd, addr = server_socket.accept()
                socklist.append(sockfd)
                broadcast(socklist, server_socket, sockfd, '[%s:%s] Enter' % addr)
            else:
                try:
                    data = sock.recv(4096).decode()
                    if data == '': raise Exception('Done')
                    if data:
                        broadcast(socklist, server_socket, sock, data)                
                except Exception as e:
                    print(e)
                    broadcast(socklist, server_socket, sock, '[%s, %s] Exit' % addr)
                    sock.close()
                    socklist.remove(sock)
```

#クライアントプログラム
「python client.py ユーザー名 IPアドレス」として実行

```python:client.py
import sys, socket, select, threading
 
def prompt(user) :
    sys.stdout.write('%s> ' % user)
    sys.stdout.flush()
 
if __name__ == "__main__":
    if len(sys.argv) < 3:
        print('Usage : python %s user host' % sys.argv[0])
        sys.exit()
    (user, host), port = sys.argv[1:3], 5001
    server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try :
        server_sock.connect((host, port))
    except :
        print('Unable to connect')
        sys.exit()
    print('Start')
    def listen():
        while True:
            read_sockets, write_sockets, error_sockets = select.select([server_sock], [], [])
            try:
                data = server_sock.recv(4096).decode()
            except:
                break
            sys.stdout.write('\r%s\n' % data)
            prompt(user)
        print('\rTerminated')
    t = threading.Thread(target=listen)
    t.start()
    prompt(user)
    while True:
        msg = sys.stdin.readline().strip()
        if not msg:
            server_sock.close()
            break
        try:
            server_sock.send(('%s| %s' % (user, msg)).encode())
        except:
            break
        prompt(user)
```
Python2系では、ASCIIのみOK。
Unity2d SpriteのColliderが指定したワールド座標に重なってるか判定する


# 単純にSpriteのCollider2dとの接触を検知する

SpriteにCollider2dを設定し、そのCollider2dが指定したワールド座標と接触しているかの判定を行うための方法です。

ワールド座標の取得については[こちら](http://project-unknown.hatenablog.com/entry/2015/04/05/024849)の記事を参考にしてください。

判定したいSpriteにCollider2dが設定されているとして、以下の処理を記述します。

```
Vector2 position = /* 適当な値 */;
Collider2d collider = Physics2D.OverlapPoint(position)
```

もし指定した座標にCollider2dがあればそのオブジェクトが取り出され、
何も無ければnullが返ります。

----

# 重なりあったSprite全てのCollider2dを検知する。

上述のやり方では1つ問題があります。
それは、Spriteが重なり合っている時に、全てを検知することが出来ません。
(重なりの中で1番上に配置されているSpriteのみ適用されてしまいます)

重なったSprite全て等しく接触を検知する場合は、OverlapPointではなく、OverlapPointAllを利用します。
ちなみに、OverlapPointAllは戻り値が配列になっているのでご注意ください。

```
Vector2 position = /* 適当な値 */;
Collider2d[] colliderArr = Physics2D.OverlapPointAll(position)

// 値があれば、取り出す
if (colliderArr.Length > 0) { 
	foreach (Collider2D collider in colliderArr) {
		/* 処理 */
	}

}
```
CentOS7にperlbrewを導入出来ない時用メモ

# ■ 環境はCenotOS７

    $ cat /etc/redhat-release
    CentOS Linux release 7.1.1503 (Core)
    $ arch
    x86_64

# ■ いつもどおりにPerlbrewを導入してみる。

    $ curl -L http://install.perlbrew.pl | bash
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
      0   315    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
    100  1255  100  1255    0     0    881      0  0:00:01  0:00:01 --:--:-- 1225k

    ## Download the latest perlbrew

    ## Installing perlbrew
    Can't locate Getopt/Long.pm in @INC (@INC contains: FatPacked::9177400=HASH(0x8c0938) /usr/share/perl5 /usr/lib64/perl5 /usr/local/share/perl5 /usr/local/lib64/perl5) at perlbrew-19108 line 33.
    BEGIN failed--compilation aborted at perlbrew-19108 line 33.
    Compilation failed in require at perlbrew-19108 line 5795.
    BEGIN failed--compilation aborted at perlbrew-19108 line 5795.

そうすると、既にインストールされているはずのパッケージが@INCにパスが登録されていないらしい。
googleで検索すると同様な現象が発生している人が居るらしいです。
https://github.com/gugod/App-perlbrew/issues/409

1月23日の解決策としては、

    $ curl -kL http://install.perlbrew.pl | sed "/\$PERLBREWDOWNLOAD/{N;s|$|sed -i -r '/@INC/ s/([)][}])/ vendorlib vendorarch\\\1/' \\\$LOCALINSTALLER\n|}" | bash

として、ワンライナーでvendorlibとvendorarchから参照するようになっていた。
しかし、最近再度調べてみると有志の方がperlbrewのゴニョゴニョしてくれる物をgithubにあげてくださっている模様。
そちらのperlbrewインストール方法としては

    $ ( export PERLBREWURL=https://github.com/nnutter/App-perlbrew/raw/develop/perlbrew; \curl -L http://install.perlbrew.pl | \bash )

とワンライナーで読みやすくなった感じです。

実際に両方を試してみて自分の環境では動作確認済みですので、
お好きな方を選んでperlbrewの導入をすることを出来るかと思います。

インストールが完了。

## ■ perlbrewインストール後のいつもの初期設定

    $ ~/perl5/perlbrew/bin/perlbrew init
    $ echo 'source ~/perl5/perlbrew/etc/bashrc' >> ~/.bashrc
    $ source ~/.bashrc

## ■ perlbrew向けにcpanmを導入する

    $ perlbrew install-cpanm

ということで、CentOS7にperlbrewを導入する暫定対応でした。
Rubyで多次元hashの初期化をまとめてみた


Rubyで入れ子のhashを初期化するときには、最初に階層を決めておかないと
``undefined method `[]' for nil:NilClass (NoMethodError)`` みたいなエラーになったりします。
なので、階層ごとの初期化の方法をまとめてみました。

## 1次元

```ruby
# 初期化
hash = {}

hash["a"] = 1
p hash # => {"a"=>1}
```

## 2次元

```ruby
# 初期化
hash = Hash.new { |h,k| h[k] = {} }

hash["a"]["b"] = 1
p hash # => {"a"=>{"b"=>1}}
```

ちなみに `hash = Hash.new( {} )` という書き方は期待した動きになりません。

```ruby
# 初期化
hash = Hash.new( {} )

hash["a"]["b"] = 1
p hash # => {}
p hash.default # => {"b"=>1}
```

この書き方だとHash#defaultに設定されてしまうからです。[^1]

## 3次元以上

```ruby
# 初期化
hash = Hash.new { |h,k| h[k] = Hash.new(&h.default_proc) }
```

## Arrayとの組み合わせ

```ruby
# 初期化
hash = Hash.new { |h, k| h[k] = [] }

hash["a"].push(1)
hash["a"].push(2)
p hash # => {"a"=>[1, 2]}
```

こちらも `hash = Hash.new( [] )` だと期待した動きになりません。[^2]

## hashにhashを格納するパターン

初期化時に決めずに、hashにhashを入れてもいけます。

```ruby
hash1 = {}
hash2 = { "b" => 1 }
hash1["a"] = hash2

p hash1 # => {"a"=>{"b"=>1}}
```

## 脚注
[^1]: [Hash.new - Ruby 2.2.0 リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.2.0/method/Hash/s/new.html)

[^2]: [Strange ruby behavior when using Hash.new([])](http://stackoverflow.com/questions/2698460/strange-ruby-behavior-when-using-hash-new)
ejs でファイル名(path)を取得したいときのメモ 

ejs でファイル名 を取得したいときのメモ。

    <%= filename %>
で、ファイルパスが文字列で返ってくる

    <!-- ファイル名取得 -->
    <% var path = filename.split('/')[filename.split('/').length - 1].replace('.ejs','') %>
    
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <link rel="stylesheet" type="text/css" href="css/<%= path %>.css">
      </head>
      <body>
       ................
      </body>
    </html>

ejs でうまく軌道に乗りますように。
cakePHP3でbake migrate

cakePHP3は[Phinx](https://phinx.org/)というマイグレーションライブラリを使用しています。
とりあえず、DBには何もテーブルが作られていないという前提で、

```shell-session
./bin/cake bake migration MigrationName
```

というbakeコマンドを叩くと、MigrationNameがついたファイルが、config/Migrationsの下に作成されます。
ファイル名は、日付_migration_name.php。
初期状態だと、中身は下記です。

```php:日付_migration_name.php
<?php
use Phinx\Migration\AbstractMigration;

class MigrationName extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     * @return void
     */
    public function change()
    {
    }
}
```

ここに、Phonxのドキュメントにあるコードをモジって書いてみます。

```php:日付_migration_name.php
    public function change()
    {
        $table = $this->table('tags');
        $table->addColumn('tag_name', 'string')
              ->create();

        $refTable = $this->table('tag_relationships');
        $refTable->addColumn('tag_id', 'integer')
                 ->addForeignKey('tag_id', 'tags', 'id')
                 ->create();
    }
```

で、マイグレーションを実行します。

```shell-session
./bin/cake migrations migrate
```

エラーが出ずに、AllDoneと表示されれば成功です。
tagsとtag_relationshipsというテーブルが作成されていると思います。

##おまけ
addForeignKeyをするときに、ちょっとハマりました。
ドキュメントには、array('delete'=> 'SET_NULL', 'update'=> 'NO_ACTION')というオプションを指定しているのですが、対象のカラム（id）はNULLを許可してないため、エラーになったのだと思います。
Python virtualenv で仮想環境に入って作業する。

CentOSの上で、Pythonのバージョン 2.6.6
仮想環境で利用したいPythonバージョン 2.7.6

Python2.7.6のバイナリは、
```/opt/local/bin/python2.7```
とします。

##仮想環境に入るとき

```
$python -V
Python 2.6.6

$mkvirtualenv --python=/opt/local/bin/python2.7 myvenv
Running virtualenv with interpreter /opt/local/bin/python2.7
New python executable in myvenv/bin/python2.7
Not overwriting existing python script myvenv/bin/python (you must use myvenv/bin/python2.7)
Installing setuptools, pip...done.

(myvenv)$python -V
Python 2.7.6
```

##環境を抜けるとき

```
(myvenv)$deactivate

$python -V
Python 2.6.6
```
Parseにデータをインポート

#HTTPリクエストで
RubyでParse(parse.com)を利用する場合は、公式SDKがないので3rdパーティのgemを使う。
parse-ruby-clientが有名かと。
https://github.com/adelevie/parse-ruby-client
ただし、最近更新されていなくて、GeoQueriesが未実装のままになってる。

gemを使ってデータをParseにUPするのは簡単。
1. Parse.initする
2. Parse::Object.newでインスタンス生成
3. インスタンスのsaveメソッドを呼ぶ

```rb
Parse.init :application_id => "",
           :api_key        => "",
           :quiet           => true

hoge.each do |h|
  s = Parse::Object.new("hogehoge")
  s["name"] = h["name"]
  s["point"] = Parse::GeoPoint.new({
                                    "latitude" => h["latitude"],
                                    "longitude" => h["longitude"]
                                   })
  s.save
end
```

ただ、このループ回数が多いと、毎度HTTPリクエストしててデータ数が多い場合に長時間になって辛い。

#インポートで
Parseにはデータのインポート機能がある。
https://parse.com/docs/data#data-import

インポートはcsv or jsonで、今回はjsonを選択。
\nがなんだとか書いてあるが、osxなら問題ない。

手順としては、3つ。
1. 配列とハッシュ作ってデータ入れる
2. 前後におまけを付ける
3. ParseのサイトからUPする

```rb
s2 = []

hoge.each do |h|
  s = Hash.new
  s["name"] = h["name"]
  s["point"] = Parse::GeoPoint.new({
                                    "latitude" => h["latitude"],
                                    "longitude" => h["longitude"]
                                   })
  s2 << s
end

data = "{ \"results\": " + s2.to_json + "}"#おまけ付加
File.write("hoge.json", data)
```

Parse::Object.new("hogehoge")のままでもJSONは生成できるが、そのJSONにはclassNameが入っていて、ParseにUPしてもvalidationエラーになるので、ハッシュに変える。

GeoPointがそのままなのは、これをHashにするとString(中身はJSON)として扱われてしまうため。
GeoPointはvalidationエラーにならない。

あとはこれをParseのサイトにUPしてインポート完了を待つだけ。
"the requested PHP extension mcrypt is missing from your system" on Mac

composerでCakePHPをインストールしようとしたらこんなエラーが出た。もしもMAMPで環境構築しているところから、MAMPのPHPでインストールしてやると良い。環境の中にあるMAMPのパスを`.bash_profile`で指定する。ここでは、バージョン5.6.1の例

```
export PATH=/Applications/MAMP/bin/php/php5.6.1/bin:$PATH
```
Oracle walletの設定メモ

# 内容

Oracleのwalletを設定した時のメモ

# wallet設定手順

1. 確認

    データベースがオープンしていることを確認

    ```sql
    SQL> select status from v$instance;
    
    STATUS
    ------------------------------------
    OPEN
    
    ```

    walletが設定されていないことを確認

    ```sql
    SQL> select * from v$encryption_wallet;
    
    WRL_TYPE   WRL_PARAMETER                            STATUS
    ---------- ---------------------------------------- --------------------
    file       /u01/app/oracle/admin/TEST01/wallet       CLOSED
    
    ```


1. マスターキー作成

    マスターキーを配置するディレクトリの作成

    ```sh
    $ mkdir -p $ORACLE_BASE/wallet
    $ ll -d $ORACLE_BASE/wallet
    ```
      
    sqlnet.oraにENCRYPTION_WALLET_LOCATIONを設定
      
    ``` sh
    $ vi $ORACLE_HOME/network/admin/sqlnet.ora
    ```
      
    以下を追記
      
    ```
    # $ORACLE_BASE=/u01/app/oracleとした場合
    ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/wallet)))
    ```

    リスナーの起動 or 再起動
 
    ```sh
    $ lsnrctl start
       or
    $ lsnrctl reload
    ```

    マスターキーを作成

    ```sql
    SQL> alter system set encryption key identified by "wallet_pass";

    システムが変更されました。

    SQL> !ls /u01/app/oracle/wallet
    ewallet.p12
      
    SQL> select * from v$encryption_wallet;
      
    WRL_TYPE   WRL_PARAMETER                  STATUS
    ---------- ------------------------------ ----------
    file       /u01/app/oracle/wallet         OPEN

    ```


1. walletのオープン・クローズ

    オープン

    ```sql
    SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "wallet_pass";

    システムが変更されました。

    SQL> select * from v$encryption_wallet;

    WRL_TYPE   WRL_PARAMETER                  STATUS
    ---------- ------------------------------ ----------
    file       /u01/app/oracle/wallet         OPEN
    
    ```
    
    クローズ

    ```sql
    SQL> ALTER SYSTEM SET ENCRYPTION WALLET CLOSE IDENTIFIED BY "wallet_pass";

    システムが変更されました。

    SQL> select * from v$encryption_wallet;

    WRL_TYPE   WRL_PARAMETER                  STATUS
    ---------- ------------------------------ ----------
    file       /u01/app/oracle/wallet         CLOSED

    ```


# walletオープンの自動化設定

1. 自動化の設定

    ```sh
    $ ls $ORACLE_BASE/wallet
    ewallet.p12
    $ orapki wallet create -wallet $ORACLE_BASE/wallet -pwd "wallet_pass" -auto_login
    $ ls $ORACLE_BASE/wallet
    cwallet.sso  ewallet.p12
    ```

1. 確認
 
     ```sql
     SQL> select * from v$encryption_wallet;
    
     WRL_TYPE   WRL_PARAMETER                  STATUS
     ---------- ------------------------------ ----------
     file       /u01/app/oracle/wallet         OPEN
    
     SQL> shutdown immediate
     SQL> startup
    
     SQL> select * from v$encryption_wallet;
    
     WRL_TYPE   WRL_PARAMETER                  STATUS
     ---------- ------------------------------ ----------
     file       /u01/app/oracle/wallet         OPEN
     ```
unicornの操作方法

---
### コマンドについて
#### unicornの起動
<pre>
sudo -u git -H bundle exec unicorn_rails -c config/unicorn.rb -E production -D
</pre>

| オプション  | 意味                              |
|:----------:|:---------------------------------|
| -c         | 設定ファイル                       |
| -E         | RAILS_ENV(デフォルトはdevelopment) |
| -D         | デーモンとして動作                  |
| -p         | ポートを指定する場合                |
| --path     | ディレクトリ指定                    |

#### unicornの停止
<pre>
sudo kill -QUIT `cat tmp/pids/unicorn.pid`
</pre>

#### unicornの再起動
<pre>
sudo kill -HUP `cat tmp/pids/unicorn.pid`
</pre>
apkからAndroidManifest.xmlを読む

Unity+Android+JenkinsでVersion番号を変えようと四苦八苦した話
http://qiita.com/T_2/items/2b33738af320e2fe2ca8

に関連して、bundleVersion、vesionCodeが本当に変更されているか調査する必要があったのですが、アプリ起動後に表示させるのは面倒だったのでapkから設定を確認する方法を調べました。

##必要なもの
AXMLPrinter2.jar
https://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar&

##手順
1. apk(test.apkとする)をtest.zipにリネーム & 解凍
2. 上記フォルダ内のAndroidManifest.xmlを任意のフォルダに置く
3. ターミナルから以下のコマンドを実行

```shell-session
      java -jar AXMLPrinter2.jar AndroidManifest.xml
```
(pathは任意)

これで確認が可能です。
[uGUI]UIパーツにガイド線を表示する

デザイナーさんに、UnityってPhotoshopでいうガイドみたいなの無いの？と言われたので作ってみました。

```csharp
	void OnDrawGizmos ()
	{
		RectTransform rectTransform = transform as RectTransform;

		float xOffset = transform.position.x - transform.localPosition.x;
		float yOffset = transform.position.y - transform.localPosition.y;
                
       //左端x
		float x1 = (transform.localPosition.x - (rectTransform.sizeDelta.x * rectTransform.pivot.x) * transform.lossyScale.x) + xOffset;
       //右端x        
		float x2 = (transform.localPosition.x + (rectTransform.sizeDelta.x * (1f - rectTransform.pivot.x) * transform.lossyScale.x))+ xOffset;
       //上端y	
       float y1 = (transform.localPosition.y - (rectTransform.sizeDelta.y  * rectTransform.pivot.y) * transform.lossyScale.y) + yOffset;
　　　　//下端y
		float y2 = (transform.localPosition.y + (rectTransform.sizeDelta.y  * (1f - rectTransform.pivot.y) * transform.lossyScale.y)) + yOffset;
        
        
        float max = 100000f;
		float min = -100000f;

		Gizmos.color = new Color32(255,0,0,100);
		Gizmos.DrawLine(new Vector3(x1,min,0f), new Vector3(x1,max,0f));
		Gizmos.DrawLine(new Vector3(x2,min,0f), new Vector3(x2,max,0f));
		Gizmos.DrawLine(new Vector3(min,y1,0f), new Vector3(max,y1,0f));
		Gizmos.DrawLine(new Vector3(min,y2,0f), new Vector3(max,y2,0f));
	}
```

やっていること
RectTransformの4点の座標を計算し、world座標に直してGismoで描画

結果はこんな感じ
![スクリーンショット 2015-04-05 0.12.39.png](https://qiita-image-store.s3.amazonaws.com/0/8904/fb0d2fdf-ac8d-6b48-b003-e379dd74c795.png)
SwiftでBasic認証



以下はBasic認証のためのヘッダー付き Requestオブジェクトの作成するサンプルコード.
NSURLSessionのデリゲートつかを使ってもっとかっこ良く書けるのだろうけど、iOS力が低くてまだやり方がわからない...

```swift
var url_with_basic_auth = "https://www.example.com/"
var url = NSURL(string: url_with_basic_auth)
var req = NSMutableURLRequest(URL: url!)

//Authorizationヘッダーの作成
var username = "username"
var password = "password"
var authStr = "\(username):\(password)"
var data = authStr.dataUsingEncoding(NSUTF8StringEncoding)
var authData = data!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.allZeros)
var authValue = "Basic \(authData)"

//作成したAuthorizationヘッダーの付与
req.setValue(authValue, forHTTPHeaderField: "Authorization")
```

[Basic認証](http://ja.wikipedia.org/wiki/Basic%E8%AA%8D%E8%A8%BC)
CentOSにnginxをyumを使ってインストールしようとしたらリポジトリが見つからないと言われた時の対処法





```
yum install nginx
```

を実行したらリポジトリが見つからないのでインストールできないと言われた場合、/etc/yum.repos.d/nginx.repo を新規作成し,以下の内容を記載する

```
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
```


その後再度

```
yum install nginx
```

を実行するとインストールできる

参考
http://wiki.nginx.org/Install
WatchKit アプリを出す時に気をつけること


審査に出すまでに気をつけることと、審査を通すために注意しておくことをまとめました。

# Provisioning Profile は iOS アプリとは別に用意する

WatchKit Extension には Provisioning Profile の署名が必要。 
iOS アプリの Bundle Identifier が com.xxxx.app 場合、対応する WatckKit アプリの Bundle Identifeir は com.xxx.app.watchkitextension になります。そのため iOS アプリの Provisioning Profile とは別に用意が必要になります。

# WatchKit アプリ用のアプリアイコンを用意する

- 背景は黒にしない（AppleWatch のホームスクリーンの背景が黒のため）
- iOSアプリのアイコンと比べて小さくなるので文字が潰れるケースを考慮したものを作る
- iOSアプリのアイコンと違ってもいいが関連がありそうな(似ている)アイコンにする
- 画像はアルファを含めない

1024x1024 のサイズの画像をまず作って、それを縮小して使うのがよい

# WatchKit アプリのスクリーンショットを用意する

312 x 390 のスクリーンショットが必要になります。これは WatchKit アプリを Simulator(42mm) 上で実行している状態で Command + s でスクリーンショットを撮ればOK。

# Version と Build Number を揃える

審査に出す iOS アプリ、WatchKit extension、 WatchKit アプリの Version と BuildNumber を揃えておきます。
FuelPHPのOrmで名前付きスコープを実装する



Yiiみたいにこんな書き方をしたい。

```php:公開中の記事の最新5件を取得
$posts = Model_Post::query()->published()->recently(5)->get();
```

名前付きスコープっていうのは、取得条件に名前をつけて、クエリビルダで指定できるようにすること（多分）。
whereの条件を意味のある固まりで分割できるので、条件の再利用が簡単になる。

### Queryを拡張する
メソッドチェーンに利用されるQueryクラスを拡張して、スコープ用メソッドを作成する。
これはモデルごとに用意する。

```php:fuel/app/classes/query/post.php
class Query_Post extends \Orm\Query
{
    public function published($status = 1)
    {
        return $this->where('status', $status);
    }

    public function recently($limit = 10)
    {
        return $this
            ->order_by(array('created_at' => 'DESC'))
            ->limit($limit);
    }
}
```

### Modelを修正する
queryメソッドを上書きして、上で作ったQueryクラスを使うように変更する。

```php:fuel/app/classes/model/post.php
class Model_Post extends Orm\Model
{
    /**
     * @param array $options
     * @return Query_Post
     */
    public static function query($options = array())
    {
        return Query_Post::forge(get_called_class(), array(static::connection(), static::connection(true)), $options);
    }
}
```

これで完成。

## 最後に
実装は[Yii 2.0のドキュメント](http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#customizing-query-classes)を参考にした。

Yii2でスコープが廃止されたと聞いて、「え、じゃあ、どうしたらいいの？」と思ってドキュメントを見たら、継承を使ったシンプルな実装が紹介されていて、FuelPHPにもそのまま適用できた。
ATOMのパッケージのインストール先

#ATOMをインストールしてみてパッケージ入れまくった結果なんかおかしくなってATOM自体再インストールをかけたけどパッケージが反映されたままになってる…

→パッケージの保存場所本体じゃないのね…
設定ファイルの場所

~/.atomに保存されてるので、このディレクトリ以下の
ファイルをバックアップしておけば
違うマシンと設定を共有できるということか…
マルチキャストで送信も受信もできない問題に遭遇しました

マルチキャストで通信する小さな自作プログラムを実行したところ、WireSharkで見ていても、何もパケットが流れない現象に遭遇しました。原因は、NICが複数装着されており、1枚目（デフォルトで使われるNIC）がNAT設定だったためのようです。ひょっとすると、VirtualBoxのNAT設定したNICだけの現象かもしれませんが、念のために記しておきます。

#環境

- Windows 7（ホストOS）
- VirtualBox 4.3.20
- CentOS 6.5（ゲストOS。送受信別々のマシンではあるが同一のバージョン）

##ネットワーク

![network.png](https://qiita-image-store.s3.amazonaws.com/0/72237/ba2f5c45-68de-d5d4-11bc-162cabcca607.png)

#現象

ホストOS上でWireSharkを使い、図中の物理Adpt.とHostOnly Adpt.をパケット・キャプチャしてみたのですが、マルチキャストアドレス225.1.1.1にパケットが流れている（送出されている）ように見えません。

```c:思ったようにならないコードの一部を抜粋：
sock = socket(AF_INET, SOCK_DGRAM, 0);

 addr.sin_family = AF_INET;
 addr.sin_port = htons(5555);
 addr.sin_addr.s_addr = inet_addr("225.1.1.1");

 ipaddr = inet_addr("127.0.0.1");
 if (setsockopt(sock,
		IPPROTO_IP,
		IP_MULTICAST_IF,
		(char *)&ipaddr, sizeof(ipaddr)) != 0) {
	perror("setsockopt");
	return 1;
 }

 sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr));
```

マルチキャストアドレスがどのNICを使っているか確かめてみると、eth0が使われていました。

```bash:マルチキャストで使用するNICを調べる
$ netstat -g
```

そこで、マルチキャストで使用するNICは、192.168.56.100が割り当てられているNIC、すなわちeth1を使うように変更して解決しました。

```c:うまくいったコードの抜粋:
 ipaddr = inet_addr("192.168.56.100"); // eth1に変更
 if (setsockopt(sock,
		IPPROTO_IP,
		IP_MULTICAST_IF,
		(char *)&ipaddr, sizeof(ipaddr)) != 0) {
	perror("setsockopt");
	return 1;
 }
```
【EC-CUBE2.13.3】商品規格登録の1行目コピー機能が正常に動作しないとき

## 「一行目のデータをコピーする」機能が正しく動いていない？

つい先日、EC-CUBEの現行最新バージョンの2.13.3をカスタマイズしていた時に気づいた現象。

<b>「あれ？商品規格登録の画面の1行目コピーのヤツ、チェックボックスコピーできてなくない？」</b>

## コピー機能の処理を見てみる

一行目コピーの機能で、かつチェックボックスに関係ありそうな箇所はこの辺り。

```data\Smarty\templates\product_class.tpl
// 1行目をコピーボタン
$('#copy_from_first').click(function() {
    var check = $('#check_0').attr('checked');
    $('input[id^=check_]').attr('checked', check);

    var product_code = $('#product_code_0').val();
    $('input[id^=product_code_]').val(product_code);

    var stock = $('#stock_0').val();
    $('input[id^=stock_]').val(stock);

    var stock_unlimited = $('#chk_stock_unlimited_0').attr('checked');
    $('input[id^=chk_stock_unlimited_]').each(function() {
        var checked = stock_unlimited;
        var index = $(this).attr('id').replace(/^chk_stock_unlimited_/ig, '');
        $(this).attr('checked', checked);
        if (checked) {
            $('#stock_' + index)
                .attr('readonly', true)
                .css('background-color', '<!--{$smarty.const.DISABLED_RGB}-->');
        } else {
            $('#stock_' + index)
                .attr('readonly', false)
                .css('background-color', '');
        }
    });
```

ざっと見た感じ、過去のEC-CUBEのソースと違いがあるようには見受けられない。
気になって公式のデモサイトも確認してみたが、そちらではちゃんとチェックボックスでも一行目コピーが正しく動いていた。
じゃあ、何が違うのか？

そういえば、とても大きな変更点がありました。
<b>jQueryが2系にバージョンアップされてたんですよね！</b>

## attrが問題

どうもチェック状態を取得・設定しているattrが
jQueryのバージョンアップに伴い動作しなくなっていたみたいです。
attrは属性における値を取得するのですが、
この値が初期表示の時の属性だけ取得するみたいですね。
クリックしてチェックした時の属性は取得できないみたいです。

それでどう対策するのかというと
<b>「attr」を「prop」に変更します。</b>

propとはプロパティの真偽を取得します。
詳しいバージョンは調べきれていないですが
どうも最近のjQueryは属性とプロパティを明確に切り分けたみたいですね。
attrとpropの違いを詳しく知りたい方は
自分なんかよりもきちんとまとめてくださってる方がいますので、
他の方の記事を参考していただくといいと思います。

## 結論としては
before

```data\Smarty\templates\product_class.tpl
$('#copy_from_first').click(function() {
    var check = $('#check_0').attr('checked');
    $('input[id^=check_]').attr('checked', check);
```

after

```data\Smarty\templates\product_class.tpl
$('#copy_from_first').click(function() {
    var check = $('#check_0').prop('checked');
    $('input[id^=check_]').prop('checked', check);
```

attrをpropに変えるだけです。
EC-CUBEで同じようにJavaScript関係でチェックボックスの挙動がおかしいところがあれば、一度この記述がないか疑ってみた方がいいかもしれませんね。
GolangでRiakCSにオブジェクトを書き出す

GolangでAmazonS3にアクセスする方法はいくつかあるものの、RiakCSに対応してるかどうかはまた別の話のようでそれなりに苦戦したのでここに書く。

RiakCSにアクセスするために必要なこととして、古いバージョン(v2)のsignatureに対応してるかどうかと、Region指定で、RiakCSの動いてるホストを指定できるかの二点がある。とりあえず、最近Amazonから出てきたaws-sdk-goではv4しか対応してないので選択肢はgoamz シリーズに絞られる。今回はgoamzのあまたあるforkの中でもstarの多いmitchellh/goamz を使ってみた。

```go
package main

import (
	"fmt"

	"github.com/mitchellh/goamz/aws"
	"github.com/mitchellh/goamz/s3"
)

var RiakCS = aws.Region{
	"riak-cs",
	"",
	"http://localhost:8080",
	"",
	true,
	true,
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
}

func main() {
	// The AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables are used.
	auth, err := aws.EnvAuth()
	if err != nil {
		fmt.Println("1: ", err)
		panic(err.Error())
	}

	// Open Bucket
	s := s3.New(auth, RiakCS)
	bucket := s.Bucket("test")

	data := []byte("hoge")
	err = bucket.Put("sample.txt", data, "text/plain", s3.Private)
	if err != nil {
		fmt.Println("2: ", err)
		panic(err.Error())
	}
}
```
jQueryでスライドメニュー（横から出てくるやつ）を実装する

スライドメニューを実装できるjQueryプラグインを書いたので、使い方をメモします。

## ダウンロード

- https://github.com/kami30k/jquery.sidemenu.js
- https://github.com/kami30k/jquery.sidemenu.js/archive/master.zip

## デモ

![1.gif](https://qiita-image-store.s3.amazonaws.com/0/25075/e4f71d14-08cc-a84c-bab1-a41a2a94b3f5.gif)

## 使い方

まず、必要なファイルをインクルードします：

```html
<link rel="stylesheet" href="jquery.sidemenu.css">
<script src="jquery.js"></script>
<script src="jquery.sidemenu.js"></script>
```

次に、サイドメニューに`data-role="sidemenu"`、表示用リンクに`data-role="sidemenu-toggle"`を付与します。
あとは、サイドメニューに付与した`id`へのハッシュリンクを作成します。

```html
<div id="sidemenu" data-role="sidemenu">
  <ul>
    <li><a href="#">Menu</a></li>
    <li><a href="#">Menu</a></li>
    <li><a href="#">Menu</a></li>
    <li class="divider"></li>
    <li><a href="#sidemenu" data-role="sidemenu-toggle">Close</a></li>
  </ul>
</div>

<a href="#sidemenu" data-role="sidemenu-toggle">Open side menu</a>
```

`li.divider`でメニューを区切ることもできます。

以上で、デモのような動きを実装することができます。

## カスタマイズ

メニューを表示する位置と、アニメーションの速度を変更できます：

```js
$.sidemenu({
  side: 'right', // Show side menu on right
  speed: 200     // Animation speed
});
```

![2.gif](https://qiita-image-store.s3.amazonaws.com/0/25075/d044712b-b5e4-9f41-6b41-280d8e403e1a.gif)

## その他のプラグインとの違い

このカテゴリの有名どころとしては[Sidr](http://www.berriart.com/sidr/)などがあります。
Sidrとの違いは以下のような点が挙げられます：

- JavaScriptを書く必要がない（`data-role`に自動でイベントをバインドする）
- フラットデザインである
- 必要最低限の機能のみ実装しており、コードを把握しやすい

## 備考

このプラグインは、開発中のRailsアプリに導入する目的で実装しました。
これからしばらくドッグフーディングを行ない質を上げていきます。

フィードバックなどお待ちしております :)
DockerでMySQL on Ubuntuコンテナ

# DockerでMySQL on Ubuntuコンテナ

DockerでMySQLコンテナを作成したかったのですが、私はubuntuしか使ったことが無かったため、自分の環境に合ったコンテナを作成するためのDockerfileを作成しました。単純に忘備録です。
なお、ホストOSもubuntu 14.04です。

## Dockerfile

```
# ubuntu 14.04のイメージを利用
FROM ubuntu:14.04


# Dockerfile作成者
MAINTAINER kxphotographer


# コンテナのタイムゾーンがデフォルトでUTCになっているので、ホストOSの/etc/localtimeを読み込み専用でマウント
VOLUME /etc/localtime:/etc/localtime:ro


# そのままapt-getでインストールするとパスワードを聞かれる箇所で止まってしまうので、予め設定しておく。この例ではパスワードは「root」。
RUN echo "mysql-server mysql-server/root_password password root" | debconf-set-selections && \
    echo "mysql-server mysql-server/root_password_again password root" | debconf-set-selections && \
    apt-get -y install mysql-server


# my.cnfを編集
# bind-address行をコメントアウトして、外部から接続出来るようにする
RUN sed -i -e "s/^bind-address\s*=\s*\(.*\)/#bind-address = \1/" /etc/mysql/my.cnf

# デフォルトの文字コードをUTF-8に設定
RUN sed -i -e "s/\(\[mysqld\]\)/\1\ncharacter-set-server = utf8/g" /etc/mysql/my.cnf
RUN sed -i -e "s/\(\[client\]\)/\1\ndefault-character-set = utf8/g" /etc/mysql/my.cnf
RUN sed -i -e "s/\(\[mysqldump\]\)/\1\ndefault-character-set = utf8/g" /etc/mysql/my.cnf
RUN sed -i -e "s/\(\[mysql\]\)/\1\ndefault-character-set = utf8/g" /etc/mysql/my.cnf


# 一度MySQLサーバを起動し、外部から接続した際の権限を設定する。
# この場合は172.17.0.0/16から接続した際の権限。
RUN mysqld_safe & \
    sleep 10 && \
    echo "grant all on *.* to root@'172.17.%.%' identified by 'root' with grant option" | mysql -uroot -proot


# コマンドを指定せずにdocker runした際にデフォルトで実行するコマンドを指定
ENTRYPOINT ["mysqld_safe"]
```

## 参考にさせていただいた記事
- Dockerコンテナ内にmysqlサーバを立てる  
  http://qiita.com/gologo13/items/1bdba6085ec79153bf1a
- Dockerでホストと同じタイムゾーンをコンテナ起動時に設定する  
  http://qiita.com/ganta/items/a0f34866c994ebaeef69
Dockerを一般ユーザで実行する

## 概要
Dockerを一般ユーザで実行しようとすると、次のようなエラーが発生する。

```
$ docker info
FATA[0000] Get http:///var/run/docker.sock/v1.18/info: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?
```

問題を回避するには、毎回`sudo`を行うか、対象ユーザをdockerグループに所属させる必要がある。

# 前提条件

* Vagrant 1.7.2
* Guest OS: CentOS 7.0

# 実行手順
一般ユーザvagrantをdockerグループに所属させる方法を紹介する。

```
$ sudo groupadd docker
$ sudo usermod -g docker vagrant
$ sudo /bin/systemctl restart docker.service

$ exit
```

一度コンソールから抜けた後、再度`vagrant ssh`でログインする。

```
# 一般ユーザでdockerコマンドを実行できることを確認
$ docker info
Containers: 3
Images: 73
Storage Driver: devicemapper
 Pool Name: docker-253:1-8938407-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: xfs
 Data file:
 Metadata file:
 Data Space Used: 2.758 GB
 Data Space Total: 107.4 GB
 Data Space Available: 104.6 GB
 Metadata Space Used: 4.661 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.143 GB
 Udev Sync Supported: true
 Library Version: 1.02.93-RHEL7 (2015-01-28)
Execution Driver: native-0.2
Kernel Version: 3.10.0-229.1.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
CPUs: 2
Total Memory: 993.5 MiB
Name: localhost.localdomain
ID: TOEB:TVTL:MLJ7:TYAH:PHAP:TZUU:XXOL:ANQM:TPL6:FGZQ:U36R:UI6Y
```
NSDataとは


# NSDataとは

バイトデータのラッパークラス

>NSData and its mutable subclass NSMutableData provide data objects, object-oriented wrappers for byte buffers.


[NSData Class Reference
](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/BinaryData/BinaryData.html#//apple_ref/doc/uid/10000037-SW1)


# NSDataは何ができるか

>Data objects can manage the allocation and deallocation of byte buffers automatically. Among other things, data objects can be stored in collections, written to property lists, saved to files, and transmitted over communication ports.


[Introduction to Binary Data Programming Guide for Cocoa](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/BinaryData/BinaryData.html#//apple_ref/doc/uid/10000037i)

# Snippet

## データの長さを取得

```swift
let url = NSURL(string: "https://www.google.com/images/srpr/logo11w.png")
let data = NSData(contentsOfURL: url!)
print(data!.length)
```


## データをbase64 encodeした文字列に変換する

```swift
let url = NSURL(string: "https://www.google.com/images/srpr/logo11w.png")
let data = NSData(contentsOfURL: url!)
//64文字毎に改行を入れるオプション
let base64EncodedString64Char = data!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
//76文字毎に改行を入れるオプション
let base64EncodedString76Char = data!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding76CharacterLineLength)
```

base64EncodedStringWithOptions呼び出し時にLineEncodingのオプションを指定しない場合はCRLFが付与される

>If you specify one of the line length options (NSDataBase64Encoding64CharacterLineLength or NSDataBase64Encoding76CharacterLineLength) but don’t specify the kind of line ending to insert, the default line ending is Carriage Return + Line Feed.

## base64 encodeされたデータをデコードする

```swift
let url = NSURL(string: "https://www.google.com/images/srpr/logo11w.png")
let data = NSData(contentsOfURL: url!)

let base64EncodedString = data!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)

let decodedData = NSData(base64EncodedString: base64EncodedString, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
```

## データを部分的に取得する

```
let url = NSURL(string: "https://www.google.com/images/srpr/logo11w.png")
let data = NSData(contentsOfURL: url!)
let first10Byte = data!.subdataWithRange(NSMakeRange(0, 10))
```

## データをファイルに保存する

```swift
let url = NSURL(string: "https://www.google.com/images/srpr/logo11w.png")
let data = NSData(contentsOfURL: url!)
data?.writeToFile("./logo.png", atomically: true)
```


## NSString<=>NSData間の変換

```
let orig_str = "string"

//String -> NSData
let data = orig_str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)

//NSData -> String
let str = NSString(data: data!, encoding: NSUTF8StringEncoding)
```

[String Encodings - NSString](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/index.html#//apple_ref/doc/constant_group/String_Encodings)
画像ファイルをプロジェクトに追加する方法

http://www.amazon.co.jp/Android-Studioではじめる-簡単Androidアプリ開発-有山-圭二/dp/4774169986

Android Studioではじめる 簡単Androidアプリ開発の本の中で
タイトルの箇所が上手く行かなかったのでメモ

画像を⌘+Cをして追加したいファイルに⌘+V
画像の保存場所の確認をされOKで保存される

解説通りのドラッグ＆ドロップではうまくいかない
iPhone Simulator のシステムログ


iPhone実機と違って、Xcode→Window→Devicesで確認できませんでしたが、以下のパスに保存されていました。


/Users/User名/Library/Logs/CoreSimulator/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXXXX(SimulatorのUDIDのようなもの)/system.log

※Xcode6.2、Simulator:iPhone5/5S/6、iOS7/8で確認。
Ubuntu 14.04 on Raspberry Pi 2 で Planex GW-450D (WiFi ドングル) を使う

あまり新奇性のある内容はないですが，備忘録として。

# 要点

* Ubuntu 公式で配布されている RasPi2 用 Ubuntu 14.04 (https://wiki.ubuntu.com/ARM/RaspberryPi) だとカーネルモジュールビルドに必要なヘッダー等を apt で入れることができる
    * なので (おそらく一番大変な) rpi-source などを使ってカーネルソースを取得する・ビルドする必要がない
* あとはビルドする際のノウハウはネットにいくつかあるのでそれに従う

# 作業

* ビルドに必要なものをインストールする
    * `sudo apt-get install build-essential`
        * こうするといまのところ ARM 版 gcc 4.8.2 (ARM 向けに吐くコードが不安定だという噂) がインストールされるので不安だけど，この distribution に付属の kernel 本体も gcc 4.8.2 でビルドされているっぽいので，とりあえずこれで。
* カーネルヘッダー等をインストールする
    * `sudo apt-get install linux-headers-3.18.0-20-rpi2 linux-source-3.18.0`
        * バージョンは現在インストールされているものにあわせる
        * `linux-source` が必要かどうかは不明 (不要な気がする)
* MT7610U のカーネルモジュールソースをダウンロードして展開する
    * 本家 MediaTek のサイトにもあるけど，[Planex のサイト](http://www.planex.co.jp/support/download/gw-450d/driver_linux.shtml) からダウンロードするほうがメールアドレスとか入力する必要とかないそうです
    * 一応 GPL2 で公開されているそうです。upstream に入るといいなぁと思いますが，まぁ……
* あとはこちらのサイト ⇒ http://qnighy.hatenablog.com/entry/2015/02/05/155016 にしたがって，ソースの変更 & ビルド & インストールする
* Planex のガイド ⇒ http://www.planex.co.jp/articles/RaspberryPi_GW-450D/ の「4-1.インターフェースを設定します」にしたがって `/etc/network/interfaces` を設定する
    * こちらのブログ ⇒ http://blog.mamemomonga.com/2015/01/planex-gw-450draspberry-pi.html のように wpa_supplicant を利用する設定にするほうがまっとうなのかも。けどやっていないです。

以上で使えた。

*追記* その後一応安定して使えているが，カーネルログに `Err;FC.ToDs` というのが出まくっててうっとおしい。以下のサイトが参考になるかも https://users.atmark-techno.com/node/1089
Adobe AIR for Desktop ファイルを開く＆exeを実行する

##概要
Adobe AIR for Desktop で、以下のことをします。

* 特定のファイルをデフォルトのアプリケーションで開く方法（エクスプローラーで docx をダブルクリックすると Word が起動する）
* 特定のexeファイルを実行する

##コード
以下、アプリケーションフォルダにあるファイルを開く想定のコードです。
他のフォルダの指定は、[ここ](http://hakuhin.jp/air/file.html#FILE_03)にわかりやすくまとまっています。

### デフォルトのアプリケーションで開く（例：test.docx）

```as3
var file = File.applicationDirectory;
file = file.resolvePath("test.docx");
file.openWithDefaultApplication();
```

### exeを実行する（例：test.exe）

```as3
var nativeProcessStartupInfo = new NativeProcessStartupInfo();
var file = File.applicationDirectory;
file = file.resolvePath("test.exe");
nativeProcessStartupInfo.executable = file; 
nativeProcessStartupInfo.workingDirectory = File.documentsDirectory; 
var process = new NativeProcess(); 
process.start(nativeProcessStartupInfo);
```

##補足
exe を実行するときは、基本的に2つめのコードなのですが・・・1つめのコードで開ける exe ファイルもありました。
Windows アプリケーションの仕組みをあまりできていないので、だれか分かる人いたら教えてください。


##注記
Windowsでしか動作確認していません。