OmniAICreator/Qiita-1.07M huggingface dataset:
RDS(MySQL)でRead Replicaを利用している場合に注意すること

前回は signal 6 のことを書いたので今回は signal 11(segmentation fault)。
MySQL5.6以前の version で Read Replica を使用している場合に、突然再起動することがある。
上記のようなことが起こったら、ログなどから下記の条件に一致するか確認したほうがいい。

前提
Read Replica を利用。
MySQL5.6以前の version を利用。
主に Read Replica側で発生する。
ログに、"FLUSH LOGS" の記録がある。 

Log

```
Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (1d9cfek0): flush logs
Connection ID (thread ID): 4
Status: NOT_KILLED


This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help
diagnose the problem, but since we have already crashed,
something is definitely wrong and this may fail.

key_buffer_size=16777216
read_buffer_size=262144
max_used_connections=22
max_threads=1441
thread_count=4
connection_count=4
It is possible that mysqld could use up to
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 3352884 K bytes of memory
Hope that's ok; if not, decrease some variables in the equation.

Thread pointer: 0x1d8c1630
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 429200f8 thread_stack 0x40000
/rdsdbbin/mysql/bin/mysqld(my_print_stacktrace+0x2e)[0x7a996e]
/rdsdbbin/mysql/bin/mysqld(handle_fatal_signal+0x3e2)[0x67fd12]
/lib64/libpthread.so.0[0x2b47f50c1b10]
[0x2aae001282f0]

Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (1d9cfek0): flush logs
Connection ID (thread ID): 4
Status: NOT_KILLED

```

下記は Percona だが、元は同じ MySQL などで同じことが発生するよう。

[Seg fault when "FLUSH LOGS" simultaneously on both Master and Slave ](https://bugs.launchpad.net/percona-server/+bug/1091072)
[log.cc](http://osxr.org/mysql/source/sql/log.cc)
[rpl_slave.cc](http://osxr.org/mysql/source/sql/rpl_slave.cc)
[sql_reload.cc](http://osxr.org/mysql/source/sql/sql_reload.cc)



---
0158   if (options & REFRESH_RELAY_LOG)
0159   {
0160 #ifdef HAVE_REPLICATION
0161     mysql_mutex_lock(&LOCK_active_mi);
0162     if (active_mi != NULL)
0163     {
0164       mysql_mutex_lock(&active_mi->data_lock);
0165       if (rotate_relay_log(active_mi))
0166         *write_to_binlog= -1;
0167       mysql_mutex_unlock(&active_mi->data_lock);
0168     }
0169     mysql_mutex_unlock(&LOCK_active_mi);
0170 #endif

---

5.6 からの変更点を見る限り、binlog の排他制御で問題があったよう。
まあ、5.6 から binlog の仕組みがかなり変更されたからなー。

現状対策

--

・MySQL5.6以上を利用。

--
Videoタグでストリーム再生をするのに必要なサーバー側の機能

Videoタグを用いた動画を疑似ストリーム再生できるようにするのに必要なサーバー側の機能について解説します。

### 簡易のWebサーバーは機能不足

前回HetimaDelphiniumという簡易のWebサーバーを作成しました。Getリクエストで指定されたファイルをレスポンスで返すだけのシンプルな物です。

しかし、この機能だけだと、動画を上手く再生できない事があります。
例えば、以下のようなVideoタグを持つWebページを表示して見ます。

```lang:例
<video src="xx.mp4"></video>
```

そして、コントロールを操作して、半分くらいの所から動画を再生してみます。
反応しません。コントロールで指定した位置で動画が再生されません。

### 再生に必要な部分だけダウンロードする機能が必要

途中から動画を再生したい場合は、一部分だけダウンロードできる必要があります。
一部分だけダウンロードするには、Rangeヘッダーに対応する必要があります。

#### Rangeヘッダーを含めてリクエストされる
実際な、\<video\>ヘッダーが指定されたWebページを読み込むと、"Range: bytes=36-"
と行ったヘッダーが追加された、Getリクエストが渡されます。

```lang:例
GET /hetima/BigBuckBunny_320x180.mp4 HTTP/1.1
Host: 0.0.0.0:18085
Connection: keep-alive
Accept-Encoding: identity;q=1, *;q=0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.101 Safari/537.36
Accept: */*
Referer: http://0.0.0.0:18085/hetima/BigBuckBunny_320x180.mp4?preview=true
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Range: bytes=36-

```
36バイト以降すべてのデータをダウンロードしたいと言う意味です。



### Rangeヘッダーで指定された部分だけレスポンスする
Content-Rangeヘッダーを追加してデータを渡します。それ以外の部分は、通常のGetリクエストとおなじです。

```lang:例
HTTP/1.1 206 Partial Content
Connection: close
Content-Length: 64656991
Content-Type: video/mp4
Content-Range: bytes 36-64657026/64657027
```

上は64657027バイトのデータの36バイト〜64657026を配信するという意味です。※36,64657026バイト目のデータ含みます。

### 作ってみた

上記機能を実現する事で、mp4ファイルのストリーム再生が出来る事を確認しました。
サンプルまでにどうぞ

##### HetimaDelphinium
https://chrome.google.com/webstore/detail/hetimadelphinium/adjffeadhaldmgbcdapganbifcdghpnb

##### githubのソース
https://github.com/kyorohiro/HetimaDelphinium

##### 再生してみた動画
IPod5G用 320×180(62 MB)で動作するした。
https://peach.blender.org/index.php/download/
メモ：python-novaclientが起動しなくなった事象

# 概要
さっきMacで``pip install python-keystoneclient``したら、

```bash
keystone                                                
Traceback (most recent call last):
  File "/usr/local/bin/keystone", line 7, in <module>
    from keystoneclient.shell import main
  File "/Library/Python/2.7/site-packages/keystoneclient/__init__.py", line 37, in <module>
    __version__ = pbr.version.VersionInfo('python-keystoneclient').version_string()
  File "/Library/Python/2.7/site-packages/pbr/version.py", line 78, in version_string
    for part in self.release_string().split('.'):
  File "/Library/Python/2.7/site-packages/pbr/version.py", line 70, in release_string
    self.release = self._get_version_from_pkg_resources()
  File "/Library/Python/2.7/site-packages/pbr/version.py", line 62, in _get_version_from_pkg_resources
    return packaging.get_version(self.package)
  File "/Library/Python/2.7/site-packages/pbr/packaging.py", line 870, in get_version
    raise Exception("Versioning for this project requires either an sdist"
Exception: Versioning for this project requires either an sdist tarball, or access to an upstream git repository. Are you sure that git is installed?
```
というエラーが発生した。ついでに今まで正常に動いていた``python-novaclient`` も同じエラーが出るようになった。

```bash
nova    
Traceback (most recent call last):
  File "/usr/local/bin/nova", line 7, in <module>
    from novaclient.shell import main
  File "/Library/Python/2.7/site-packages/novaclient/__init__.py", line 18, in <module>
    __version__ = pbr.version.VersionInfo('python-novaclient').version_string()
  File "/Library/Python/2.7/site-packages/pbr/version.py", line 78, in version_string
    for part in self.release_string().split('.'):
  File "/Library/Python/2.7/site-packages/pbr/version.py", line 70, in release_string
    self.release = self._get_version_from_pkg_resources()
  File "/Library/Python/2.7/site-packages/pbr/version.py", line 62, in _get_version_from_pkg_resources
    return packaging.get_version(self.package)
  File "/Library/Python/2.7/site-packages/pbr/packaging.py", line 870, in get_version
    raise Exception("Versioning for this project requires either an sdist"
Exception: Versioning for this project requires either an sdist tarball, or access to an upstream git repository. Are you sure that git is installed?
```

エラーメッセージ
> Versioning for this project requires either an sdis

でウェブ検索するといくつか症例が引っかかるが、Python力が低くて解決方法が全く分からない。結果としてどうやったら動くようになったかのみ記す。

pip listしたところ、setuptoolsにWarningsが出ていたので

```bash
pip list
…
Warning: cannot find svn location for setuptools==0.6c12dev-r88846
setuptools (0.6c12dev-r88846)
```

これをアップグレードしたら動いた。

```bash
sudo pip install --upgrade setuptools
```
direnv + npm の設定例

## direnv とは
あるディレクトリに移動した時に、特定の環境変数を設定するツールです。

より詳しい内容は、以下の記事をご参照下さい。
http://qiita.com/kompiro/items/5fc46089247a56243a62


## ./node_modules/.bin を $PATH へ含める例
`.envrc` へ以下の設定を含める

```
export PATH=$(npm bin):$PATH
```

これで、プロジェクト内のディレクトリに居る場合には、ローカルの `node_modules/.bin` 以下のコマンドを優先して使うようになりました。
【Linux】Passenger のインストール、Apacheとの連携

#### 1. passengerをインストール

```bash
$ gem install passenger --no-ri --no-rdoc -V
$ rbenv rehash
```

#### 2. apacheにpassengerモジュールをインストール

```bash
$ passenger-install-apache2-module
```

※ 必要なソフトウェアがない場合は赤字で知らせてくれるので、インストールしてからもう一度コマンドを実行する。

#### 3. 以下のコマンドを叩くと、apacheとの連携に必要な設定が表示される

```bash
$ passenger-install-apache2-module --snippet

LoadModule passenger_module /home/webmaster/.rbenv/versions/2.1.2/lib/ruby/
gems/2.1.0/gems/passenger-4.0.53/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot ...
  PassengerDefaultRuby ...
</IfModule>
```

#### 4. `httpd.conf`を編集

```bash
$ sudo vim /etc/httpd/conf/httpd.conf

# 上記の出力メッセージをそのままペースト

# DocumentRootを上書き
DocumentRoot Rails_appのpublicフォルダを指定

# RAILS_ENV変数の設定
RailsEnv 環境名
```

#### 5. 設定ファイルの文法をチェック

```bash
$ apachectl configtest
# Syntax OK と出るはず
```

#### 6. Apache再起動して、ブラウザでアクセス

```bash
$ sudo service httpd restart
```

## Trouble Shooting

#### 「You don’t have permission to access / on this server.」と表示される場合

`httpd.conf`の`User`と`Group`項目がきちんとRailsアプリを動かせるユーザ、グループに設定されているか確認

## その他

#### Passengerの実行ユーザ
`config.ru`の所有者と同じ
transform: perspectiveについて


cssのtransform: perspectiveは、transformを適用するDOM自身にではなく、
それを梱包するDOMにあてる必要がある。

html:

```
<div class="container">
	<div class="content"></div>
</div>
```

css:

```
.container{
	transform: perspective(100px);
}

.container .content{
	transform: rotateX(30deg);
}
```

ハマったのでメモ。
記事投稿に必要な最低限の画像編集能力を身に付ける

皆さんは何らかのサービスで記事を書く時、キャプチャ画像を編集したいと思ったことはないでしょうか。
編集したい内容はわずかなのに多くのツールは機能が多すぎて使い方を勉強する気にもならない。そんな思いで過ごしている人も多いはず。私はそうでした。

そんな中、私が先日使ってみたツールは機能が限定されており、使い勝手も良かったのでご紹介します。

私が画像編集ツールに求めていたのは下記の4点でした。すごくシンプルです。

- **四角で囲めること(強調するため)**
- **任意の場所に文字が入れられること(補足説明を記述するため)**
- **モザイクがかけれること(公開したくない情報を秘匿するため)**
- **学習コストが少ないこと(ツールを使いこなしたいわけではないので)**

これらの要望を満たしてくれたツールが**PhotoScape**です。

さっそく使い方の説明に入りたいのですが、まずそもそも編集する画像を作成するところから入ってみましょう。


# キャプチャの取り方
私はエンジニアなので画面上に表示しているものをキャプチャしたい時が多いです。
そんな時に便利なのが、Windows7に標準で搭載している『**Snipping Tool**』です。
[Windows]キーを押して『すべてのプログラム』の中の『アクセサリ』の中にあります。

使い方も簡単で、下記の[新規作成]を押して、キャプチャしたい部分をドラッグ＆ドロップして保存するだけです。一度使ってみれば分かります。
![01-01_SnippingTool](https://qiita-image-store.s3.amazonaws.com/0/40403/7d481e5d-76e6-0fa1-8210-40af1bd8d160.jpeg)


あとはWinShotなんかも便利です。
私の場合はWinShotを常時起動しておいて、『PrintScreen』キーを押すとアクティブになっているウィンドウのキャプチャが指定しておいたフォルダに作成されるようになっています。
とりあえずポチポチキャプチャを取る時に便利。
興味があれば調べてみて下さい。


# PhotoScapeの使い方
それではこの記事の本題に入っていきましょう。

## ツールの導入

この辺りから普通にツールをインストールして下さい。
http://photoscape.softonic.jp/


## 編集の仕方

1. 起動すると下記のような表示になるはず。画像編集を選択しましょう。
![トップ.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/35f9029a-f4a7-521f-04bc-a1f578c09e24.jpeg)

1. 下記のような表示領域になっています。
![画像編集エリア分け.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/eb71c6e4-26b9-e43d-0a69-ea48210b0179.jpeg)

1. フォルダエリア(左上)から編集したい画像のあるフォルダを選択し、画像リストエリア(左下)に画像リストが表示されるのを確認しましょう。

1. 編集したい画像を選択し、編集エリア(右上)に画像が表示されるのを確認したら準備完了です。


### 四角で囲ってみる

1. ツールボックスから[オブジェクト]タブを選択し、[矩形モード]をクリック
色や線の形・太さなどを指定する
![四角で囲む.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/800ab893-4813-bd5d-59e3-085cbad5b69c.jpeg)

1. 編集エリアで囲みたい部分をドラッグ＆ドロップする
![矩形選択.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/357cc94e-16d8-d3aa-9b6b-c559906e3536.jpeg)

1. ツールボックスの右側にある[保存]を押して修正内容を確定する
オリジナルの画像を自動でバックアップしてくれるオプションもあるので必要に応じて活用しましょう。


### 任意の場所に文字を入れる

1. ツールボックスから[オブジェクト]タブを選択し、[テキスト]をクリック
![テキスト.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/4e00d537-9538-29f2-4b22-4652f848905e.jpeg)

1. ポップアップウィンドウに表示したい文字やスタイルを指定する
![テキスト入力.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/6d7dde44-09a5-7497-4852-8d6979600277.jpeg)

1. 編集エリアに文字が表示されるので、位置などを調整する
ダブルクリックや右クリック-プロパティで再度ポップアップウィンドウを表示できる

1. 保存する

### モザイクをかける

1. ツールボックスから[ツール]タブを選択し、[モザイク]をクリック
![ツールボックス-モザイク.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/24b8e8ed-a571-a169-08d1-023983e2111b.jpeg)

1. モザイクのレベルを選択し、モザイクをかけたいところをドラッグ＆ドロップで選択
モザイクのレベルは[モザイク-低]にすると粗めでよく見るモザイクっぽくなる
![モザイク.jpg](https://qiita-image-store.s3.amazonaws.com/0/40403/177a271d-7afa-4ccd-ce51-ff39cd9aab7f.jpeg)

1. 保存する

# 最後に
いかがでしょうか。とても簡単に編集ができたと思います。
私のようにがっつり画像編集したいという人ではなく、少しだけ修正したい人には簡単便利に使えるツールになっているのではないでしょうか。

この投稿はもちろんですが、私の下記の投稿もSnippingToolとPhotoScapeで編集したものになります。ご参考にどうぞ。
http://qiita.com/moiwasaki/items/ac65481c0b7433aac468
IngressでもlibGDXが利用されているのをご存知でしたか？

　Googleの運営する位置ゲーIngressが話題ですが、この中でゲームライブラリとしてlibGDXが利用されているのをご存知ですか？

## 確認手順
1.画面右上の「OPS」ボタンをタップ
![2014-09-21 08.57.23trim.png](https://qiita-image-store.s3.amazonaws.com/0/42140/7f9c7d30-f881-db73-857d-a6b876d3b72f.png)

2.画面上部のタブの一番右端の「DEVICE」をタップ
　※タブを横にスライドしてスクロールする必要があります。

3.「Sources」の「Show」をタップ
![2014-09-21 08.58.37trim.png](https://qiita-image-store.s3.amazonaws.com/0/42140/b8e18f5c-d780-185b-e925-ee03512e1450.png)

4.libGDXのライセンスを確認できます。
![2014-09-21 08.59.07trim.png](https://qiita-image-store.s3.amazonaws.com/0/42140/7c68204b-b228-806b-86a3-9c631b0cf234.png)


## ゲーム制作にlibGDXを使おう
libGDXとは・・・
[libGDX関連情報まとめ 2014/4/19 (Androidで２Dゲーム)](http://qiita.com/fslasht/items/6afc8aabde56f42c651a)
> libGDXは、マルチプラットフォーム（Andoird,iOS,Windows,OS X,Linux）対応のゲームエンジンです。
> 2Dゲーム制作でよく利用されています。
> 使用言語はJava。Eclipseで開発できます。

という感じのもので最近イチオシです。
Qiitaでも[libGDXタグ](http://qiita.com/tags/libgdx)で情報が得られます。


 ゲームフレームワークではCocos系が有名ですが、libGDXのシェアもなかなかです。
[Androidアプリでよく使われているライブラリを調べる方法](http://qiita.com/fslasht/items/b375ad62efd64c11d032)
![スクリーンショット 2014-05-01 12.30.05trim2.png](https://qiita-image-store.s3.amazonaws.com/0/42140/7c23146c-2fab-f73a-a63e-c6b246f61350.png)


　ゲームフレームワークの選択に悩んだら是非、libGDXを
　Ingressで陣営の選択に悩んだら是非、Resistance（青）を

こちらからは以上です。
Jadeでattributionを書く際、メタ文字をエスケープさせないようにする


JadeでHTMLのattributionを書くと、&などのメタ文字がエスケープされて "&amp；" という風にエンコードされてしまいます。

しかし、場合によってはエスケープしてほしくない場合も多くあるでしょう。
そんなとき、エスケープさせずにそのまま出力するには

```
img(src="hoge.jpg" alt!="&amp;")
```

という風に、=の前に!を追記すればOKです。
iOS8のメモウィジェットを作ってわかったこと

このたび「東北ずん子メモウィジェット」というアプリを全てSwiftで書いてリリースしてみました。
是非ダウンロードして使ってみてください！
ダウンロードは下記リンクから。
![ZunkoMemo120icon.png](https://qiita-image-store.s3.amazonaws.com/0/46597/a0afd129-e5b3-d417-ab30-f1eb62689599.png)
[東北ずん子メモウィジェット](https://appsto.re/jp/cr3m3.i)



さて、今回全部Swiftで書いて、新機能のウィジェットなども使ってみたのでわかったことや感想について書いていきます。

#Swift
##感想
Swiftでの開発は各所でも言われている通りサクサクと気持ちよく書くことが出来ました。これからはSwiftです。

先日Facebookでこんな記事を見つけました。
[【Javaが恐ろしく強い】転職時に希望するプログラミング言語ランキング](http://paiza.hatenablog.com/entry/2014/10/07/【Javaが恐ろく強い】転職時に希望するプログラミン)
自分はObjective-Cが以外とランキングに載ってて良かったなと思ったのですが、Swiftがこの速度と気持ち良さで書けるのであれば数年後にさらにその上を狙えるのではないかと思いました。

Swift頑張って欲しい。

##開発
具体的にどこが良かったかというと、

・Objective-Cで書いてた[ ]よりも.（ドット）での関数やプロパティへのアクセスが書きやすいし読みやすい。
・ヘッダーファイルと実装ファイルが分かれてないからファイルの行き来が少なくてラク。
・純正フレームワークの使い方が同じだから前からiOS開発してる人は強い。

などがありますが、Swiftの良いとこ悪いとこは人それぞれ感じるところがあるでしょうし、そういう記事もいっぱいありますね。

#ウィジェット
##感想
当初UITextFieldなどをウィジェット上で扱ってメモの編集や追加もそこでやろうとしていたのですが、キーボードが表示出来ないので出来ませんでした。
ウィジェットのLauncherアプリなどもリリースされていましたが、リジェクト対象になったりと出来ないことも結構ありますが、テキストやイメージの表示などには使えるので、そういうことに利用するようにしましょう。

##開発
NSUserDefaultsでAppGroupsを使うときはAppGroupsで作成した文字列を間違えないようにしましょう。
ケアレスミスですが、自分はこれで相当時間を食われてしまいました...orz

ウィジェットは画面サイズに制限があるので注意しましょう。
正確な計測はしていませんが、このサイズは以下の画像分が最大のようです。
![iOS Simulator Screen Shot 2014.10.12 20.29.19.png](https://qiita-image-store.s3.amazonaws.com/0/46597/bf99448b-3ab9-0cac-b435-0d9653d26c29.png)



ウィジェットの画面サイズの指定は以下のコードをウィジェットのUIViewControllerで使って行います。

```
preferredContentSize = CGSizeMake(x, y, width, height)
```

#まとめ
SwiftもWidget機能も実装は簡単でした。
今回のアプリはデザインからコーディング、リソース用意、リリース手配全て自分一人でやって6日で出来ました。
iTunes Connectで登録してレビュー中になってからリリースまでがとても早く、6日で出来ました。
iOS8の新機能だからか、Swiftで書いたからか、理由はわかりませんが通常ンのアプリのアップデートがやたらと時間がかかる中でこの速度だったのでなにかしらの優遇措置があったように思います。
Intellij IDEAでGAE/Goのgoapp testを実行する

# はじめに
Go Local AppEngine Serverはあるけど、`goapp test`を実行するConfigurationがまだpluginに無いみたいなのでBashで作ります。

![スクリーンショット 2014-10-12 20.30.37.png](https://qiita-image-store.s3.amazonaws.com/0/40887/592a8a65-4705-6a64-56a1-b83cde9fc792.png)

# 作り方
基本的にはGo Local AppEngine Serverと同じようにして、`goapp serve`ではなく`goapp test`を実行するだけです。

![スクリーンショット 2014-10-12 20.32.16.png](https://qiita-image-store.s3.amazonaws.com/0/40887/0394b632-f16b-4200-63cb-20c169ddaa9c.png)

- `Name`: この設定の名前です。なんでもいいです。とりあえず`goapp test`とかで
- `Script name`: 実行するコマンド名になります。これは`goapp test`の`test`を指定します
- `Script parameters`: `go test`の時に指定するパラメータが使えるみたいです
- `Common options`:
    - `Bash interpreter`: goappが存在するpathを指定します。
    - `Interpreter options`: *(未使用)*
    - `Working directory`: {プロジェクトの直下のPATH}を指定します
    - `Environment variables`: GOPATH={プロジェクトの直下のPATH}

## ポイント
`Environment variables`でGOPATHをプロジェクト直下にしてます。
そうしないと自分の場合は、GOPATHに`$HOME`を指定しているので、サブディレクトリのパッケージが認識されなくなります。

こんな感じにGOPATH通ってないというエラーがでます。

![スクリーンショット 2014-10-12 20.50.29.png](https://qiita-image-store.s3.amazonaws.com/0/40887/369968af-4fa6-2a37-872d-4aa92d893d89.png)


## テスト実行

あとは、実行ボタンを押してテストを実行するだけ。

![スクリーンショット_2014-10-12_20_49_27.png](https://qiita-image-store.s3.amazonaws.com/0/40887/b5839bc6-b404-e259-a31e-d4495a5320de.png)

実行結果はこんな感じです。

![スクリーンショット 2014-10-12 20.34.14.png](https://qiita-image-store.s3.amazonaws.com/0/40887/f434ea52-8d59-e2ec-5086-ee01334d7e68.png)

# おわり
`appengine/aetest`パッケージと`net/http/httptest`パッケージで結構しっかりとしたtestが書けるので、かなりいい感じです。
IntellijIDEA上でコーディングからtest実行とserver起動まで出来るようになるので、かなり捗るようになりました。
Go言語で SSHでの操作内容をタイムスタンプ付きでログに出力できるツールを作った

# きっかけ

### 先日

SSHでログインしたサーバで作業した後に、とあるコマンドを実行した日時を知りたいと思ったのですが、既にシェルのセッションも残っておらず調べようがないーーーということがありました。

同僚はサーバにログインする際には、パッチを当てた`tee` コマンドと `ssh` をラップしたスクリプトを組み合わせて、

```shell-session
$ <ssh-wrapper> www.example.com 
# Runs $ ssh www.example.com | tee -a -t /path/to/www.example.com.log
#        (`tee`の`-t`はタイムスタンプをファイルの各行頭にダンプするパッチが提供するオプション)
```

みたいな感じでローカルホストにログを残すということを実現していると聞いて便利だなあと。

### だけど

パッチを当てた`tee`をビルドしたり `ssh`のラッパースクリプトをインストールするのは、導入や管理の点で少し辛い感じがありますよね...

### ということで

SSHでの操作内容をタイムスタンプ付きでログに出力できるツール [coo](https://github.com/mizoR/coo) を Go言語を作ってみました。

---

# coo

### インストール

```shell-session
$ go get github.com/mizoR/coo/cmd/{coo,coo-tee}
```

### 使い方

`coo` は `ssh`のラッパです。使い方は以下の通りで引数に 接続先の `host` を渡すだけです。

```shell-session
$ coo
Usage: coo host [command]
```

### たとえば、

`www.example.com` に SSHでログインする場合は、

```shell-session
$ coo www.example.com
```

でログインできて、`~/.ssh/transcripts/www.example.com/YYYY-mm-dd.txt` にログが作成されます。

今のところ SSHへオプションを渡す仕組みをもっていないので、基本的には`~/.ssh/config` で頑張る感じになります...

### 内部的には

冒頭に書いた、

> パッチを当てた`tee` コマンドと `ssh` をラップしたスクリプトを組み合わせて

をやっているだけです。`coo`が `ssh`のラッパー、`coo-tee`が パッチの当てられた`tee` です。

```shell-session
$ coo www.example.com
```

が実行されると、その内部では、

```shell-session
$ ssh www.example.com | \
    coo-tee ~/.ssh/transcripts/www.example.com/YYYY-mm-dd.txt -a -t
```

が呼び出されてるという それだけです。

---

Go言語は触り始めて日が浅いし、ちゃんとコードを書いたのはほぼ初めてなので、[mizoR/coo](https://github.com/mizoR/coo) にプルリク等でツッコミをもらえるとうれしいです。
Win8.1でBIOS画面を起動させる

FUJITSU LIFEBOOK AH42/k　使ってます。
この名称で調べると「F2を押しながら電源を入れる」「F2連打」ばかり出ますが
Win8だと、これでは起動しないらしいです（公式に書いて誘導してほしいorz）

設定＞PC設定の変更＞運用と保守＞保守と管理＞回復＞PCの起動をカスタマイズする（の、 `今すぐ再起動する` ）＞トラブルシューティング＞詳細オプション＞UEFIファームウェアの設定＞再起動

覚えられないでござる！
Pepperメモ ～座標を変換したい～

- 追記
ワールドレプゼンテーションのところは間違いあるので注意。あとでなおす。
- 追記 2014.11.17
 - stackoverflowみてたら顔認識まわりの座標についての良さげなリンク発見
 - http://abitworld.com/nao-robot-visual-debugging-of-the-vision-variables/

- 座標変換でなかなか苦労しっぱなしなのでメモ
- 内容は随時更新していこうかなというメモ
- ひとまず重要なリンクを…
 - http://doc.aldebaran.com/2-1/naoqi/motion/control-cartesian-tuto.html#control-cartesian-tuto
 - ↑デカルト座標という意味らしい **cartesian** のチュートリアル。直交座標とも訳されるらしい
 - http://doc.aldebaran.com/2-1/naoqi/motion/control-cartesian.html#motion-effectors-space オヘソ座標系（※意訳）などが書かれた箇所。オヘソ相対が便利らしい。(※TORSOっていうよりオヘソがしっくりくるので勝手に意訳してるので気をつけてください）

## 座標変換しないとならない場面メモ
- 顔認識した結果を自分で取り扱いたい場合
  - 結果はカメラからの角度が格納されている
  - トラッキング系はほぼ同じように角度になってる
  - 角度を位置に変えるような素直なAPIは用意されていない
  - LookAtみたいな便利な奴は位置しか受け付けてくれないっぽい
 
- ワールドレプレゼンテーションのオブジェクトを扱うとき
 - ワールドレプレゼンテーションオブジェクトは識別した物体のデーターベースみたいなもの（実際にSQLで管理と操作されてる）
 - これを通して例えば顔の位置とかを共有データとして登録しておけば、他のブロックとかから扱える。（という使い方かなと自分は理解してる）
 - ランドマークマーカーとかを識別、登録、管理するブロックを作ったりすれば放り込むだけでそこに顔を向けたり歩いたりできて便利そう
 - でも… このAPIが返すのはWORLD空間の座標のみ（登録するときは、オヘソ相対座標使えるのに！）
 - というわけで座標変換しないと結構扱いにくい
 
## 座標変換のコード
- ここに追記していくつもり…
- なかなかALMathとかが低レベルでまだ素直にすっきりする方法を模索中なので書けない…

- カメラからの座標変換サンプル
 - http://doc.aldebaran.com/2-1/dev/python/examples/vision/landmark.html?highlight=cameratop
 - ↑の↓ここらへんがキモ
 - ``# Compute the rotation to point towards the landmark.
cameraToLandmarkRotationTransform = almath.Transform_from3DRotation(0, wyCamera, wzCamera)``
FlashでつくるMotionGraphics(1): カウントダウン

最新のブラウザでの対応がされなくなって久しいFlashですが，
別の使い方として，動画編集ツールとしてのFlashの使い方を紹介します．

スクリプトを駆使すれば，PremireやAfterEffectよりもっと
自由度の高い映像表現が可能になります．

Flash CCのビデオの出力機能を使います．
ビデオ書き出しには以下の点に注意です

・入力のステージサイズやfpsを超えて出力することはできない
　（高画質で出力するためにはそれを前提とした設計していくことが必要）
・Timer関数が使えない．

---

本ページのポイント

・Flashの基本的な使い方(Graphicsの処理)
・ビデオの書き出し
・ビデオの書き出しの注意点

---

■カウントダウンの出力イメージ
http://www.yasuikeita.com/works/qiita/CountDown.mp4

![Countdown.png](https://qiita-image-store.s3.amazonaws.com/0/54559/1c14f951-a85c-40af-6da2-c5a771446309.png)

---

(1)Flash CCを起動
・新規作成/action script 3.0　→　選択

(2)ステージのサイズを指定する
・プロパティ/サイズ　→　1280x960
・背景色 → 黒

(3)テキストを配置
・ツールバーの[T]からテキストコンテナをステージに配置
・テキストの中身：12345（何でも良い）
・テキストのプロパティ（インスタンス名：CountText, 種類：ダイナミックテキスト）

(4)ムービークリップ化する
・テキストを選択，右クリックからシンボルに変換（種類：ムービークリップ，名前は適当）
・ムービークリップのプロパティ（インスタンス名：CountDisp，種類：ムービークリップ）

(5)スクリプトを書く
・タイムラインの１フレーム目を右クリックからアクション
・以下のソースコードを入力する

(6)実行で動きを確認
・Ctrl+Enterで動きを確認

(7)書き出し
・ファイル/書き出し/ビデオの書き出し

・ステージのカラーを無視(アルファチャンネルを生成)：チェックしない
・Adobe Media Encoderでビデオを変換：チェック
・書き出しを停止：5秒

```lang:src
import flash.events.Event;

addEventListener(Event.ENTER_FRAME,enterFrame);

	var shape = new Shape();
	stage.addChild(shape);
	var g = shape.graphics;
	var i;
	var SCR_W = 1280;
	var SCR_H = 960;
	var time = 0;
	
	var count = 5;
function enterFrame(e:Event)
{
	g.clear ();

	g.lineStyle (1, 0xFFFFFF, 0.2);	// スタイルを設定

	var deg,rad;
	for(deg=0;deg<360;deg+=6)
	{
		rad = deg/360 * 2*Math.PI;
		g.moveTo (SCR_W/2+300*Math.sin(rad), SCR_H/2+300*Math.cos(rad));
		g.lineTo (SCR_W/2+400*Math.sin(rad), SCR_H/2+400*Math.cos(rad));		// 線を描画
	}

	for(deg=0;deg<time+6;deg+=6)
	{
		g.lineStyle (4, 0xFFFFFF, 1.0 - 0.5*int(deg==time));	// スタイルを設定
		
		rad = (-deg-180)/360 * 2*Math.PI;
		g.moveTo (SCR_W/2+300*Math.sin(rad), SCR_H/2+300*Math.cos(rad));
		g.lineTo (SCR_W/2+400*Math.sin(rad), SCR_H/2+400*Math.cos(rad));		// 線を描画
	}

	time+=6;

	if (time>360)
	{
		time = 0;
		count--;
	}
	CountDisp.alpha = 1 - 0.5*(time/360);			//数字がフェードアウト
	CountDisp.CountText.text = String(count);		//数字をセット
　　　　　　　　//あらかじめ，CountDispというムービークリップを用意しておき，その中にCountTextというテキストコンテナを配置する．
　　　　　　　　//特殊なフォントの場合，あらかじめ埋め込んでおく
　　　　　　　　//よく分からない場合はひとまずコメントアウトしておく．
}
```
Elixir after

# Elixir after

## 概要
Elixir の after について。

Java の finally 、 Ruby の ensure にあたるのが after。
File や DB の close など、リソースの解放などがよくある用途。

## after の例
### サンプル仕様

乱数 1-100 を生成します。
基本は FizzBuzz のルールで返却値を決定しますが、
11の倍数なら RuntimeError を発生させます。
例外の有無に関わらず、1回の処理ごとに after で確実に
"after random_exec" というメッセージを標準出力します。

50回繰り返して処理結果を確認します。

~~~
defmodule ExceptionSample do
  def random_exec do
    x = :random.uniform(100)
    strx = Integer.to_string(x)
    cond do
      rem(x, 11) == 0 -> raise "raise #{x} mod 11 == 0"
      rem(x, 15) == 0 -> "FizzBuzz" <> strx
      rem(x, 5) == 0 -> "Buzz" <> strx
      rem(x, 3) == 0 -> "Fizz" <> strx
      true -> x
    end
  end

  def try_rescue do
    try do
      x = ExceptionSample.random_exec
    rescue
      RuntimeError ->
        IO.puts "rescue RuntimeError"
    after
      IO.puts "after random_exec"
    end
  end

  def try_rescue_times(0) do
    # do nothing
  end

  def try_rescue_times(n) do
    IO.inspect ExceptionSample.try_rescue
    try_rescue_times(n - 1)
  end
end

ExceptionSample.try_rescue_times(50)
~~~

* 出力

~~~
after random_exec
"FizzBuzz45"
after random_exec
73
after random_exec
"Buzz95"
after random_exec
"Fizz51"
after random_exec
32
after random_exec
"FizzBuzz60"
after random_exec
92
after random_exec
67
after random_exec
"Fizz48"
after random_exec
"FizzBuzz60"
after random_exec
"FizzBuzz15"
after random_exec
"Fizz21"
after random_exec
"Buzz70"
after random_exec
16
after random_exec
56
rescue RuntimeError
after random_exec
:ok
after random_exec
46
after random_exec
43
after random_exec
1
after random_exec
"Fizz57"
after random_exec
"Fizz48"
after random_exec
41
after random_exec
31
after random_exec
"Fizz6"
after random_exec
58
rescue RuntimeError
after random_exec
:ok
after random_exec
34
after random_exec
19
after random_exec
"Fizz21"
after random_exec
4
after random_exec
89
after random_exec
"Fizz84"
after random_exec
83
rescue RuntimeError
after random_exec
:ok
after random_exec
26
after random_exec
"Fizz81"
after random_exec
2
after random_exec
"Fizz3"
after random_exec
"Buzz5"
after random_exec
"Fizz6"
rescue RuntimeError
after random_exec
:ok
after random_exec
"Fizz57"
after random_exec
61
after random_exec
"Fizz39"
after random_exec
67
rescue RuntimeError
after random_exec
:ok
after random_exec
"FizzBuzz90"
after random_exec
"Buzz80"
after random_exec
59
after random_exec
"FizzBuzz30"
~~~

## 参照
* http://elixir-lang.org/getting_started/17.html#17.4-after
railsのroutingで出てくる:idを変更する場合

普通にroutingを書いていくとデフォルトで以下のような感じになる。

※rails5でも動作確認を取りました。

例)スケジュール管理系のアプリを作ったと想定

```rb:config/routes.rb
Rails.application.routes.draw do
  resources :schedules
end
```

```console
$ ./bin/rake routes
             Prefix Verb   URI Pattern                          Controller#Action
          schedules GET    /schedules(.:format)                 schedules#index
                    POST   /schedules(.:format)                 schedules#create
       new_schedule GET    /schedules/new(.:format)             schedules#new
      edit_schedule GET    /schedules/:id/edit(.:format)        schedules#edit
           schedule GET    /schedules/:id(.:format)             schedules#show
                    PATCH  /schedules/:id(.:format)             schedules#update
                    PUT    /schedules/:id(.:format)             schedules#update
                    DELETE /schedules/:id(.:format)             schedules#destroy
```

これの:idが自分の作成した意図と合わない、しっくりこない場合がある。
たとえば:idを:dateに変更した場合とか

リファレンスをググってもなかなか出てこないのでソースを見てみた。

```rb:actionpack-4.1.6/lib/action_dispatch/routing/mapper.rb

        # [:param]
        #   Overrides the default resource identifier `:id` (name of the
        #   dynamic segment used to generate the routes).
        #   You can access that segment from your controller using
        #   <tt>params[<:param>]</tt>.
```

コメントにしっかり書いてあった。
どうやらググり方が悪かったようである。

コメント通りルーティングを書き換えてみる。

paramを追加する必要があるのでparam: :dateを追加

```rb:config/routes.rb
Rails.application.routes.draw do
  resources :schedules, param: :date
end
```

```console
$ ./bin/rake routes
             Prefix Verb   URI Pattern                          Controller#Action
          schedules GET    /schedules(.:format)                 schedules#index
                    POST   /schedules(.:format)                 schedules#create
       new_schedule GET    /schedules/new(.:format)             schedules#new
      edit_schedule GET    /schedules/:date/edit(.:format)      schedules#edit
           schedule GET    /schedules/:date(.:format)           schedules#show
                    PATCH  /schedules/:date(.:format)           schedules#update
                    PUT    /schedules/:date(.:format)           schedules#update
                    DELETE /schedules/:date(.:format)           schedules#destroy
```

期待通りの結果となり、params[:date]で取得できるようになった。
Jenkins ジョブのビルドパラメータを直近の日付選択リストにしたい

定期実行してる処理を手動で再実行したいときとか、割とあるニーズかなあと思います。

## 利用するプラグイン

Dynamic Parameter Plug-in が適任かなと思いました。

- https://wiki.jenkins-ci.org/display/JENKINS/Dynamic+Parameter+Plug-in

文字列だったり、リストだったりのビルドパラメータをGroovyスクリプトで動的生成できるようになる。

Extensible Choice Parameter plugin でも良さそう。

- https://wiki.jenkins-ci.org/display/JENKINS/Extensible+Choice+Parameter+plugin

## プロジェクト設定

プロジェクト設定の `This build is parameterized` にチェック入れて、`Dynamic Choice Parameter` を選択。
`Choices Script` に値を返却するスクリプト書くだけ。

### 具体例: 直近3日の YYYYMMdd のリストが欲しい

```groovy
use (groovy.time.TimeCategory) {
    def today = new Date()
    return (0..2).collect { i -> (today - i.days).format('YYYYMMdd') }
}
```

こんな感じで、下記のようなビルドパラメータのリストが利用できる。
(2014/10/12に実行した場合)

- 20141012
- 20141011
- 20141010

お便利なプラグインですね。
【Android】CursorLoaderのSQLに関して


たとえば以下のような`CursorLoader`を継承したクラスを作った時に、CursorLoaderのコンストラクタの引数にどんな風にSQLを渡せばいいのかよくわかんなかったので調べました。

```GalleryLoader.java
public class GalleryLoader extends CursorLoader{

    private static final String[] PROJECTION = {
            MediaStore.Images.Media.BUCKET_ID
    };
    private static final String SELECTION =
            MediaStore.Files.FileColumns.MEDIA_TYPE + "=" + MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE
            + " OR " +
            MediaStore.Files.FileColumns.MEDIA_TYPE + "=" + MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO;

    public GalleryLoader(Context context) {
        super(context,
                MediaStore.Files.getContentUri("external"),
                PROJECTION,
                SELECTION,
                null,
                MediaStore.Files.FileColumns.DATE_ADDED + " DESC");
    }

    @Override
    public Cursor loadInBackground() {
        return super.loadInBackground();
    }
}
```
これはローカルの端末のリソースから画像と動画を取り出すためのものですが、その中でも"アルバム"を取得しようとしている部分です。
やりたいこととしては、`GROUP BY`句を入れるということです。
なぜならこのままだとリソースの数分だけレコードが返ってしまう。まずはアルバムだけ取得したいという感じです。

問題点としては、CursorLoaderのコンストラクタを見てもらえればわかります。

```CursorLoader.java
    public CursorLoader(Context context, Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        super(context);
        mObserver = new ForceLoadContentObserver();
        mUri = uri;
        mProjection = projection;
        mSelection = selection;
        mSelectionArgs = selectionArgs;
        mSortOrder = sortOrder;
    }
```
[ContentResolver.query()](http://developer.android.com/reference/android/content/ContentResolver.html#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String))

`Where`句に渡す引数はあるんですが、`GROUP BY`をどうやって挿入すればいいのかわからない。

ということで実際にどのようなSQLが発行されているのか見てみました。
私が書いたようなGalleryLoaderでは以下のようなSQLが発行されていました。

```
SELECT bucket_id FROM files WHERE ( alive=1 ) AND (media_type=1 OR media_type=3) ORDER BY date_added DESC
```

ここに無理やり`GROUP BY`を挿入しようとすると、`WHERE`にうまいこと渡してやればよさそうです。
というわけで、

```
private static final String GROUP_BY = ") GROUP BY " + MediaStore.Images.Media.BUCKET_ID + ", (2";
```
といった感じにして

```
    public GalleryLoader(Context context) {
        super(context,
                MediaStore.Files.getContentUri("external"),
                PROJECTION,
                SELECTION + GROUP_BY,
                null,
                MediaStore.Files.FileColumns.DATE_ADDED + " DESC");
    }
```
と書き直しました。
これで期待通りの挙動になっています。
PHPで関数や定数のオートロード

無理やりの実装です。
正直、使いドコロはないと考えています…

## 関数やネームスペースはオートロードすることが出来ない

関数やネームスペースはオートロード出来ないため、以下のコードはエラーになる。

```php:Functions.php
namespace Functions
{
    function foo
    {
        echo 'foo' . PHP_EOL;
    }
}
```

```index.php
$loader = include 'path/to/vendor/autoload.php';
$loader->set('', __DIR__);

use function \Functions\foo;
foo(); // Fatal error: Call to undefined function \Functions\foo
```

## 関数を定義したネームスペースに無理やりクラスを定義してオートロードを実現する

クラスならオートロード可能なので、関数を定義したネームスペース内にファイルをロードするためのクラスを定義する。

```php:Functions/Foo.php
namespace Functions
{
    class Foo
    {
        public static function load() {}
    }

    function foo
    {
        echo 'foo' . PHP_EOL;
    }
}
```

```index.php
$loader = include 'path/to/vendor/autoload.php';
$loader->set('', __DIR__);

use \Functions\Foo;
Foo::load();
\Functions\foo(); // "foo"
```

上記の例は関数のみを名前空間に定義しているが、定数を定義することも出来る。
実のところ、loadメソッドを呼ばなければならないでオートロードではない。

## 利用サンプル

以下は[Ginq](https://github.com/akanehara/ginq)で関数のオートロードを利用した例。

```php:Functions/CallbackFilter.php
namespace Functions
{
    class CallbackFilter
    {
        public static functioni load() {}
    }

    /**
     * @params int $v
     * @return bool
     */
    function filterOdd($v)
    {
        return ($v % 2 !== 0);
    }
}
```

```php:index.php
$loader = include 'path/to/vendor/autoload.php';
$loader->set('', __DIR__);

\Functions\CallbackFilter::load();
$xs = Ginq::from([1,2,3,4,5])->filter('\\Functions\\filterOdd');
foreach ($xs as $x) {
    echo $x . PHP_EOL;
}
// 1
// 3
// 5
```

## まとめ

冒頭で使いドコロはないとかいていますが、その理由としてphpのcallable型は`['class-name', 'method-name']`と指定することでクラス内のメソッドを呼び出す事が出来るという点にあります。
この投稿であげた方法はPHPデフォルトの挙動をわざわざ回りくどい方法を使って解決しているだけなんですね。
デフォルトの機能を投げ打ってまで実装する必要は無いです；；

関数やら定数のインポートなんて機能は無理やり使うと余計に分かりにくいプログラムが誕生するようなきがするので、なんで実装したのか疑問でなりません。
dynamoDBをrubyから操作してみる

最近ビックデータに向けた流行? なのかRDBMSよりKVSに触れる機会が多くなってきており、
さっとrubyで(Railsで)扱いたいな〜って思ってたんだけど、
ruby + DynomoDBに関する日本語のサイトって少ないなって思い、
少し調べてみたので、簡単にやり方をまとめてみました。

■本家 aws-sdk dynamoDBクラスドキュメント
http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/DynamoDB.html

```rb
# encoding : utf-8
require "aws-sdk"
dynamo_db = AWS::DynamoDB.new(
  :access_key_id  => "AWS アクセスキー",
  :secret_access_key => "AWS シークレットキー",
  :dynamo_db_endpoint => "DynamoDB endpoint",
  :region => "DynamoDB region"
)

# create table 
table = dynamo_db.tables.create(
  'blog',1,2,  # table名,read capacity,write capacity
  :hash_key => {:id => :string},
  :range_key => {:user_id => :string}
)

# table count
p table.count

# Hash Key
puts table.hash_key.name
puts table.hash_key.type

# Range Key
puts table.range_key.name
puts table.range_key.type

# read capacity
puts table.read_capacity_units
# write capacity
puts table.write_capacity_units

while true
  puts table.status
  str = table.status.to_s
  if str == "active"
    break
  end
  sleep 3
end

# insert
table.items.create(
  'id' => '000000001',
  'user_id' => '000000001',
  'user_name' => 'kuwata',
  'blog_title' => 'apo',
  'blog_body' => 'apoapoapoapo...apo?'
)

# table item count
puts table.items.count

# item 全件の内容をハッシュで出力
table.items.each do |item|
  puts item.attributes.to_hash
end

table.items.create(
  'id' => '000000001',
  'user_id' => '000000002',
  'user_name' => 'hagakure',
  'blog_title' => 'dabe',
  'blog_body' => '模擬刀の先制攻撃だべ!!!'
)

# query
table.items.query(:hash_value => "000000001").each do |item|
  puts item.attributes.to_hash
end

# query count
puts table.items.query(:hash_value => "000000001").count

# table delete
table.delete

```
CSSフレームワークでよくあるJSライブラリを自作してみる


# メニューバーのプルダウン

CSSとかもう少しシンプルに書けそうな気がしますが、とりあえずめも。
※jQuery使います。


```html:mock01.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>JavaScriptライブラリ作成用もっく</title>
	<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
	<script src="./js/menu.js"></script>
	<link rel="stylesheet" href="./css/mock01.css">
</head>
<body>
	<header>
		へっだー
	</header>
	<nav>
		<ul>
			<li>1</li>
			<li>2</li>
			<li>3</li>
			<li>4
				<ul>
					<li>4-1</li>
					<li>4-2</li>
					<li>4-3</li>
					<li>
						4-4
						<ul>
							<li>4-4-1</li>
							<li>4-4-2</li>
							<li>4-4-3</li>
							<li>4-4-4</li>
						</ul>
					</li>
				</ul>
			</li>
		</ul>
	</nav>
	<article>
		めいん
	</article>
	<footer>
		ふったー
	</footer>
</body>
</html>
```

```css:mock01.css
nav>ul>li {
	display: block;
	float: left;
	list-style: none;
	height: 48px;
	min-width: 198px;
	background: #CCCCCC;
	border: solid 1px #333333;
}

nav>ul>li ul>li {
	display: block;
	list-style: none;
	height: 48px;
	min-width: 198px;
	background: #CCCCCC;
	border: solid 1px #333333;
}

```

```JavaScript:menu.js
$(function() {
	// 基本は非表示
	$("nav ul li ul").css('display', 'none');

	// hover時に表示
	$("nav ul li").hover(function() {
		if ($(this).children().is("ul")) {
			$(this).children("ul").css('display', 'block');
		}
	}, function() {
		$(this).children("ul").css('display', 'none');
	});
});
```
Mac OSXでHBaseを使う

環境
OSX 10.9
JDK 1.8.0

で確認。

#HBaseインストール

```bash:shell
brew install hbase
```

brew でHadoopも一緒にインストールしてくれる

#HBase Server 起動
```bash:shell
$start-hbase.sh 
starting master, logging to /usr/local/Cellar/hbase/0.98.6.1/libexec/bin/../logs/hbase-Siori-master-Siori-no-MacBook-Air.local.out
```

#HBase shell 起動

```bash:shell
$ hbase shell
2014-10-12 15:36:56,510 INFO  [main] Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.98.6.1-hadoop2, r96a1af660b33879f19a47e9113bf802ad59c7146, Sun Sep 14 21:27:25 PDT 2014
```

#HBase起動確認
```bash:shell
hbase(main):001:0> status
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/Cellar/hbase/0.98.6.1/libexec/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/Cellar/hadoop/2.5.1/libexec/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
2014-10-12 15:37:00,896 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
1 servers, 0 dead, 2.0000 average load
```
エラーがでなかったらOK


#HBaseでテーブル作成しテーブルリストを表示
```bash:shell
hbase(main):002:0> create 'test_table','column1'
0 row(s) in 5.3470 seconds

=> Hbase::Table - test_table
hbase(main):003:0> list
TABLE                                                                                                                                                                             
test_table                                                                                                                                                                        
1 row(s) in 0.0350 seconds

=> ["test_table"]
hbase(main):004:0> 
```
ocamlのutopが変になったら

最近ocamlのバージョンが4.02.0に上がったのでバージョンアップ厨の私としても
`opam switch 4.02.0`
で早速アップデートして、その後
`opam update; opam upgrade`
で関連アプリ・ライブラリを更新したのですが、いきなりutopが
`Fatal error: exception Invalid_argument("Zed_utf8.singleton") `
って出してちょっとキー入力しただけで落ちるようになってしまいました。

ググってみたら…
https://github.com/diml/utop/issues/99

ああ！opam switchしたあとに
```eval `opam config env` ```
するのを忘れてた！
上記githubによればコンパイラのバージョンが変わったのに設定しなおさなかったのでcamomileあたりが異常動作していたようです。

確かにビルドに成功しない状態でやるといろいろおかしくなるので手動になってるんでしょうけどevalは忘れやすいですね…。このマシンもopam switch仕掛けてそのまま寝ちゃってたような記憶が。
徒然なるままに、AngularJS を MVVM パターンで書いてみる


最近、Knockout.js や Vue.js 等の MVVM フレームワークを触っていて、ふと AnuglarJS だったらどう書けるんだろう、と興味をもったので試してみました。

※ MVVM とは **Model-View-ViewModel** です。

> `$scope` が ViewModel だろう、という話もあるかもしれませんが、見た目として分りやすいオブジェクトを作るという意味で、です。

- ちなみに前提となるローカル環境はこちら。
	- [ゼロから始める！AngularJSの環境構築 [Mac編]](http://qiita.com/hkusu/items/0439cf8811d44473a71c)

## ViewModel の定義

Controller用のファイルに書きます。ちゃんとやるなら、Factory や Service とした方が良いのかな？

次のように `data` プロパティで値に、`method` プロパティでメソッドにアクセスできるようにしました。
好みの問題で、コンストラクタ関数にはしていません（してもいいんだけど）。

ソースコードの最後で、AngularJS の `$scope` に紐づけます。

> 下記は CoffeeScript 記法です。

```coffeescript:app/scripts/controllers/main.coffee
'use strict'

angular.module('angularjsMvvmApp')
  .controller 'MainCtrl', ($scope) ->

    makeViewModel = () ->
      obj = {
        data:
          name: "山田太郎"
          age: "42"
          memo: "これはやまだのメモ"
          message: ""
        method:
          hello: ->
            obj.data.message = obj.data.name + " さん、こんにちわ！"
            return
      }
      return obj

    $scope.main = makeViewModel()

    return
```

## View の記載

特に説明することはありませんが、「main」ViewModel の値には `main.data.hoge` で、メソッドには `main.method.hoge()` でアクセスします。

```html:app/views/main.html
<p>
  名前：{{main.data.name}}
</p>
<p>
  年齢：{{main.data.age}}
</p>
<p>
  メモ：{{main.data.memo}}
</p>
<p>
  メッセージ：{{main.data.message}}
</p>

<br>

<p>
  メソッド実行：<button class="btn btn-info" ng-click="main.method.hello()">ボタン</button>
</p>

<br>

<p>
  データバインド：<input ng-model="main.data.name">
</p>
```

## 動作確認

デモをこちら(GitHubページ)に置きました。
⇒ http://hkusu.github.io/AngularJS_MVVM_demo/dist/

ちゃんと動いてますね^^

![スクリーンショット 2014-10-12 14.42.34.png](https://qiita-image-store.s3.amazonaws.com/0/35733/5a2b1cd5-8e27-e60d-7c80-398312ecee3e.png "スクリーンショット 2014-10-12 14.42.34.png")

## 感想

昨今のブラウザアプリケーションの各コンポーネントの「状態」と「振る舞い」を表現するには、やはりが分りやすいかなあと思いました。ViewModel の定義を見れば、そのコンポーネントが扱うデータと振る舞いが一目瞭然ですし。

MVVM の Model 部分については今回は作成していませんが、View に関わらないデータや振る舞いについては、AngularJS でいえば Factory や Service に追い出せばよいかと。

## ほか

今回のソースは GitHub に置きました。
⇒ https://github.com/hkusu/AngularJS_MVVM_demo

また、下記の記事を参考にさせて頂きました。
⇒ [Angular.jsで組む場合のアーキテクチャは、MVCじゃなくてMVVMの方が良いっぽいと思った話](http://blog.anatoo.jp/entry/20140110/1389296912)
RailsアプリでER図とかクラス図を作る


あんまり日常的に開発で使うことなさそうだけど、誰かにアプリの概要を説明したり、QiitaとかでサンプルアプリのER図を見せたい時とかに使えるGemたち。

- preston/railroady
- voormedia/rails-erd

この2つ。railroadyの方はモデルのER図だけじゃなくて、コントローラーなどのクラス図なども作成できる。

# 前提

- Rails v4.x
- Graphviz v2.22

Graphvizというパッケージが必要になる。GraphvizとはDOT言語というスクリプトをグラフに描画してくれる良い感じのやつらしい。どうでもいいけど、DOT言語ってカッコいいな…。

## Graphvizのインストール

### yum系

```bash:command
$ sudo yum install graphviz
```

### Mac

```bash:command
$ brew install graphviz
```

# railroady

## インストール

```ruby:Gemfile
gem "railroady"
```

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

## 使い方

```bash:command
# 全部を対象に出力
$ bundle exec rake diagram:all
```

これで/doc/ディレクトリにsvgファイルが保存される。ボリュームの少ないサンプルアプリを対象にやったから、ちょっとイメージがわきにくいけど…。こんな感じの図が出力される。

- ![スクリーンショット 2014-10-12 15.04.44.png](https://qiita-image-store.s3.amazonaws.com/0/2152/f368c59c-6516-8c5c-d60f-059a16a773bb.png "スクリーンショット 2014-10-12 15.04.44.png")
- ![スクリーンショット 2014-10-12 15.04.58.png](https://qiita-image-store.s3.amazonaws.com/0/2152/9cabc487-ff45-6f0e-9f8d-f72f6ccc6e64.png "スクリーンショット 2014-10-12 15.04.58.png")
- ![スクリーンショット 2014-10-12 15.05.11.png](https://qiita-image-store.s3.amazonaws.com/0/2152/38b24c08-b760-a2b4-c3b5-b2aa03907bb9.png "スクリーンショット 2014-10-12 15.05.11.png")
- ![スクリーンショット 2014-10-12 15.05.04.png](https://qiita-image-store.s3.amazonaws.com/0/2152/42a2c115-78b6-2ef4-f6c9-189770250e0a.png "スクリーンショット 2014-10-12 15.05.04.png")

```bash:command
$ bundle exec railroady -M | dot -Tsvg > models.svg
```

モデルER図だけ表示したいときは`-M`オプションを使う。

# rails-erd

## インストール

```ruby:Gemfile
gem "rails-erd"
```

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

## 使い方

```bash:command
$ bundle exec rake erd
```

デフォルトだと、rails-erdの方が見やすいかもしれない。

- ![スクリーンショット 2014-10-12 14.44.20.png](https://qiita-image-store.s3.amazonaws.com/0/2152/54e4cbf3-9fda-3e98-f6bb-2a8ba25ae2b0.png "スクリーンショット 2014-10-12 14.44.20.png")

今回は、RailsアプリだからGemとかで良いんだけど、環境とか言語にあまり左右されずに純粋にモデル図とかを書きたいとき、どんなツールがいいんだろ…。できれば設定ファイルを書いてコマンドで出力…みたいなシンプルな奴がいいんだけどなー。
zsh + peco-select-histroyで未入力状態からCtrl-rを押してもpecoを起動できるようにする

巷にあるpeco-select-historyだと未入力状態からCtrl-rを押してもpecoが起動しなくてイラつくので、未入力状態の場合にpecoの引数を変えることで`history -n 1`の順で候補が表示されるようにする。

```
function peco-select-history() {
  local tac
  if which tac > /dev/null; then
      tac="tac"
  else
      tac="tail -r"
  fi
  if [ -n "$LBUFFER" ]; then
    BUFFER=$(history -n 1 | \
        eval $tac | \
        peco --query "$LBUFFER")
  else
    BUFFER=$(history -n 1 | \
        eval $tac | \
        peco)
  fi
  CURSOR=$#BUFFER
  zle clear-screen
}
```

最初は`--query "$LBUFFER"`を変数化しようと思ったけど、うまくいかなかったのでこうなってしまった。

https://gist.github.com/jemiam/5178426e980c2647502c

追記: コメントにある通り、再インストールしたら`peco --query ""`が動くようになりました。このスクリプトは不要です。
Antビルドでeclipseコンパイラを用いる方法

eclipseのコンパイラを使ったjavacコンパイルについて、以下の2つの方法を試してみました。

###1. build.xmlをエクスポート
　・修正する元となるbuild.xmlは、プロジェクトを右クリックし、「エクスポート」を
　　選択する。
　・「一般」から「Antビルド・ファイル」を選択し、「次へ」ボタンを押下する。
　・「完了」ボタンを押下する。
###2. eclipse上からAntビルドを実行

**①build.xmlを以下のように更新する。**


```build.xml
<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
```

**②Antビルドの設定を行う。**
　・build.xml上で右クリックし、「実行」を選択する。
　・Antビルドの実行構成ダイアログが開くので、「JRE」タブを開き、
　　「ワークスペースと同じJREで実行」を選択する。

**③②で作成したAntビルド・ファイルを実行する。**

###3. WindowsのバッチファイルからAntビルドを実行
eclipseを起動しなくても、Windows環境でコンパイル実行する場合はバッチファイルにして実行するのが簡単です。

**①ディレクトリ階層は、以下のような構成を想定とします。**

```:ディレクトリ階層
project-root
   |- build.xml
   |- sample.bat
   |- ant-lib
```

**②eclipseを使用している場合、インストールディレクトリから以下の2つのjarを取得し、任意のディレクトリ（下記では、project-root/ant-lib）に配置します。**

* org.eclipse.jdt.core_xxx.jar  (xxxは使用しているeclipseのバージョンに依存)
* jdtCompilerAdapter.jar

**③build.xmlは、以下のようにeclipseのコンパイラを使用するように設定します。**

```build.xml
<project default="build">
     <typedef name="ecj" classname="org.eclipse.jdt.core.JDTCompilerAdapter">
          <classpath>
               <fileset dir="ant-lib" includes="*.jar" />
          </classpath>
     </typedef>
     <target name="build">
          <delete dir="compiled" />
          <mkdir dir="compiled" />
          <javac srcdir="src" destdir="compiled" compiler="org.eclipse.jdt.core.JDTCompilerAdapter">
               <ecj />
          </javac>
     </target>
</project>
```

**④Windowsバッチファイルから、以下のようにAntを実行します。**

```sample.bat
ant [-buildfile ファイル名※1] [実行するtarget※2]
例）
ant -buildfile build_up.xml clean build

※1　build.xmlとは別に作成した「build_up.xml」実行したい場合
※2　build_up.xmlのtargetにclean、buildがあり、複数同時に指定する場合
```

◆参考にさせて頂いたサイト
[AntでEclipseのECJ(Eclipse Compiler for Java)を使う](http://knjname.hateblo.jp/entry/2014/07/06/025542)
Tower2でブックマークにローカルレポジトリをドロップした瞬間にTower2がクラッシュしちゃったりしてレポジトリは追加されてるのにブックマークに表示されないときの解決法

# 無茶苦茶レアケースな気がするけど...

* Tower2でブックマークにローカルレポジトリをドロップした瞬間にTower2がクラッシュしちゃったりしてレポジトリは追加されてるのにブックマークに表示されない
* その後何度レポジトリをドロップしても追加出来ない
* なのにレポジトリ名をSearch for Repositoriesに打ったら表示されるのにブックマークに出て来ない

ってときの解決策.

```
~/Library/Application Support/com.fournova.Tower2/Tower.sqlite3
```

を開いて **ZGTBOOKMARK** テーブルを眺める.
**ZFILEURL** とか **ZNAME** 辺りで判別出来るかと.
で, 恐らくそいつの **ZPARENT** がぬるぬるなので **ZNAME** が *Repositories* になってる子の **Z_PK** をSETしてあげると幸せになれるかと.
仮に *Repositories* の **Z_PK** が 111 でブックマークに表示されない子の **Z_PK** が145だとすると

```
UPDATE ZGTBOOKMARK SET ZPARENT = 111 WHERE Z_PK = 145;
```

みたいな感じですね.

はい.
[Windows] 環境構築メモ

メモ主のスペック
----
* Windows一筋
* 使える言語・環境：C, php, MySQL(phpMyAdmin), JavaScript, HTML5+CSS3


時間の設定
----
- [ ] インターネット時刻同期先：ntp.nict.jp


タスクバーにピン止め
----
### 付箋（Windows標準）
* UTF-8絵文字がちゃんと表示される

### Snipping Tool（Windows標準）
* このキャプチャソフト便利すぎ
* ほぼTwitter用途

### OneNote

### ResophNotes

### Firefox

Web開発環境
----
### Chrome
#### [Awesome Screenshot](https://chrome.google.com/webstore/detail/awesome-screenshot-captur/alelhddbbhepgpmgidjdcjakblofbmce?hl=ja)
ページ全体をキャプチャできるので重宝
#### [Window Resizer](https://chrome.google.com/webstore/detail/window-resizer/kkelicaakdanhinjdeammmilcgefonfh)
多デバイス対応のチェック
### Firefox
CSSの先行実装が遅めなので検証用として必要
#### [Awesome Screenshot](https://addons.mozilla.org/ja/firefox/addon/awesome-screenshot-capture-/)
#### [Thiht/markdown-viewer](https://github.com/Thiht/markdown-viewer)
### (Safari)
最近のSafariと挙動が違うが手元にMacがないときに良い
### Xammp
* Apache（Webサーバー）とphp、MySQLの実行環境
- [ ] confファイルをコピペ

### ruby
Windowsならば[RubyInstaller for Windows](http://rubyinstaller.org/) 


プログラミング環境
----
### [git](http://git-scm.com/)
* バージョン管理ツール

### [Node.js](http://nodejs.org/) (+ npm)
- [ ] 環境設定(PATH)に追加する必要あり：C:\Program Files\nodejs

#### grunt (grunt-cli)
* npmモジュール
* 自動タスクランナー
* チームでの開発支援目的

### [Cygwin](https://www.cygwin.com/)
* bashが使える（簡易Linux環境）
- [ ] openssh入れて、ssh-keygenしたりもする
* 作成した秘密鍵・公開鍵はgitに使う
* Powershellで同様なことができるので検討の余地あり

### [Atom](https://atom.io/)
* Windows / Mac / Linuxで使える
* gitとの相性がよい
- [ ] 萌えエディタ化できる点がSublimeTextより良い
- [ ] .atomフォルダを丸ごと突っ込めば移行したことになる
* Markdownのプレビューも可能

### Visual Studio 
- [ ] 萌え用のプラグインは[ItaIdeEx(痛IDE拡張)](https://aoikagami.wordpress.com/2011/10/30/visual-studio-2010-%E7%97%9Bide%E6%8B%A1%E5%BC%B5/)（※Expressionでは利用不可）
* gitが使え、競合の解決がGUIで簡単にできる
* [Visual Studio Community 2013](http://www.microsoft.com/ja-jp/dev/products/community.aspx) もあり

### [Sublime Text](http://www.sublimetext.com/)
* 有料：USD $70（試用可）。1ソフトウェアでなく、1ユーザに対してライセンスが付与される
* Windows / Mac / Linuxで使える
- [ ] 設定ファイル（[Preferences] - [Settings - User]）を適用
* 設定ファイルは起動時に読み込まれ、PackageControlで入れたパッケージもその時にインストールされる

### [ResophNotes](http://resoph.com/ResophNotes/Welcome.html)
* MacだとSimplenoteの公式アプリが利用できる。Windowsはこのサードパティ
* Simplenoteイイゾー
- [ ] ホットキーを割り当てられる。Win + N で新規ノート起動。Win + T でノート表示
* コピペしても情報が落ちないことは重要。メモはMarkdown形式が良い
* `Ctrl+M`でMarkdownのプレビューウインドウが開く


ファイル同期
----
### Google Drive
* [Google ドライブをダウンロード - 無料のクラウド ストレージ](https://www.google.co.jp/intl/ja/drive/download/)

### (Dropbox)


フォント
----
### M+ 1c ([M+ OUTLINE FONTS | DOWNLOAD](http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/download/index.html))
* エディタ用

### [Noto Sans](https://www.google.com/get/noto/#/family/noto-sans-jpan)
* エディタ用

### [mactype](https://code.google.com/p/mactype/)
* フォントレンダラ

IME
----
### [Google 日本語入力](http://www.google.co.jp/ime/)
* 変換辞書が流行を追えている
* ニッチな話題についていけてないATOKはクソ

他
----
### Wireshark ([Wireshark - Download](https://www.wireshark.org/download.html))
* パケットキャプチャソフト

休止状態
----
1. コントロールパネル(Win+I)
2. 電源ボタンの動作の変更
3. 現在利用可能でない設定を変更します
4. シャットダウン設定の休止状態にチェック


（Photoshop）
----
* 


（オーディオ環境）
----
### Foobar2000
- [ ] [TODO] 設定ファイルは？？？

### iTunes
（よく忘れるので）gitのパーミッション操作の復習


+xなファイルがgit管理側に反映されてなくてそのまま実行しようとしてコケた、という反省を元に今更メモ。

# 環境
* OSX 10.9.5
* git version 2.1.0

# git
## パーミッションの変更を無視する設定
### 設定する
	$ git config core.filemode false

### 確認する
	$ git config -l |grep filemode

## gitに対して明示的にパーミッションを教えてあげる
### 実行権限を付与するとき
	$ git update-index --add --chmod=+x [filename]

### 実行権限を外すとき
	$ git update-index --add --chmod=-x [filename]

# 参考
* http://git-scm.com/docs/git-update-index