OmniAICreator/Qiita-1.07M huggingface dataset:
保存時に行末の空白、TABを削除

before-save-hook を使って、保存時に行末の空白、TABを削除する。

```el:delete-trailing-whitespace-with-exclude-pattern.el
;; 除外したい拡張子
(setq delete-trailing-whitespace-exclude-patterns
	  (list "\\.hoge$" "\\.fuga$"))

(require 'cl)
(defun delete-trailing-whitespace-with-exclude-pattern ()
  (interactive)
  (cond ((equal nil (loop for pattern in delete-trailing-whitespace-exclude-patterns
                          thereis (string-match pattern buffer-file-name)))
         (delete-trailing-whitespace))))

(add-hook 'before-save-hook 'delete-trailing-whitespace-with-exclude-pattern)
```
Gitで過去のコミットメッセージを修正する

```bash:
$ git log --oneline
fc86912 2013-01-07 04:16:21.000000000 +0900
bc34692 2013-01-06 04:15:53.000000000 +0900
13dbbff 2013-01-05 04:16:47.000000000 +0900
$ git rebase -i 13dbbff
エディタが立ち上がる。
```

コミットメッセージを変更するだけなら、`pick`を`reword`に変更し、コミットメッセージを書き換えたら完了。
`rebasing (1/3)`と表示される。　巨大なリポジトリの場合、かなり時間がかかるので注意。
Sublime Text3でgitプラグインがうごかない


参考:https://github.com/kemayo/sublime-text-git/issues/273

macつかっていて、Sublime Text3のpackage controlからgitプラグインをいれたら動かなかったので対応をメモ。

```
cd ~/Library/Application\ Support/Sublime\ Text\ 3/Packages
git clone --branch python3 git://github.com/kemayo/sublime-text-git.git Git
```

python3ブランチをcloneしてあげればOKみたい。
ASP.Net MVC4の単体テストでweb.configが読み込まれない

VisualStudio2012でASP.NetのMVC4のプロジェクトを作ると、ウィザードで単体テストのプロジェクトも自動で作ってくれるオプションがある。

WebAPIのプロジェクトを作ったのでテストプロジェクトも生成してもらったのだが、テストプロジェクトからの実行ではASP.Net MVC側のweb.configが読み込まれないので、DBの接続文字列などの設定が読み込めなくて困った。

解決方法としてはテストプロジェクト側にapp.configを作成し、テストに必要な設定はこっちに書いておくと読み込んでくれた。
実際にIISで運用する際はちゃんとweb.configを読み込むが、思わぬところに落とし穴があったのでメモ。


デバッグ環境による可能性もある？(Visual Studio仮想サーバーにてデバッグしている。)
Three.jsのTransformController.jsでオブジェクトを操作する


今やっている案件で、いわゆるUnityなどの3Dを操作するEditor機能がほしいなーと思っていて調べてみたところ、そもそもThree.jsのリポジトリにそれを実現するものがすでに入っていました。

[リポジトリの場所はここ](https://github.com/mrdoob/three.js/blob/master/examples/js/controls/TransformControls.js)

実際に適用するとこんな感じになります↓

![cap.png](https://qiita-image-store.s3.amazonaws.com/0/5616/6a3cd82c-3a80-cf93-2a8b-19c7eccd2e24.png "cap.png")

[実際に動くサンプル](http://jsdo.it/edo_m18/1jmH)

TransformControls.jsを読み込むと、`THREE.TransformControls`クラスが追加されるので、これを`new`します。

controlは`translate`、`rotate`、`scale`といったエディタが持っている基本機能を持っていて、`control.setMode()`で変更することが出来ます。

controlには`attach`と`detach`メソッドがあり、コントロールさせたいオブジェクトを`attach`メソッドに渡してやれば、あとは移動や回転などの操作を`THREE.TransformControls`クラスがすべてやってくれます。
BootstrapのTabsのイベントを取得する


Bootstrapの'nav-tab'のタブクリック時のイベントを取得する方法

```html
<ul class="nav nav-tabs" id="myTab">
  <li class="active"><a href="#home" data-toggle="tab">Home</a></li>
  <li><a href="#profile" data-toggle="tab">Profile</a></li>
  <li><a href="#messages" data-toggle="tab">Messages</a></li>
  <li><a href="#settings" data-toggle="tab">Settings</a></li>
</ul>

<div class="tab-content">
  <div class="tab-pane active" id="home">...</div>
  <div class="tab-pane" id="profile">...</div>
  <div class="tab-pane" id="messages">...</div>
  <div class="tab-pane" id="settings">...</div>
</div>
```

```javascript
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
  var activated_tab = e.target // activated tab
  var previous_tab = e.relatedTarget // previous tab
  // 処理,,,,,
})
```
カーソル位置の単語を簡単に検索

カーソル近辺にある単語をバッファ内から検索したい場合、
いちいち (\C-s or \C-r) の後に、検索したい単語を入力するのは面倒。

以下のelispを書いておけば、 (\C−s or \C−r) \C-w でカーソル位置の単語を検索。

```el:isearch-forward-at-point.el
(defvar isearch-initial-string nil)
(defun isearch-set-initial-string ()
  (remove-hook 'isearch-mode-hook 'isearch-set-initial-string)
  (setq isearch-string isearch-initial-string)
  (isearch-search-and-update))
(defun isearch-forward-at-point (&optional regexp-p no-recursive-edit)
  "Interactive search forward for the symbol at point."
  (interactive "P\np")
  (if regexp-p (isearch-forward regexp-p no-recursive-edit)
	(let* ((end (progn (skip-syntax-forward "w_") (point)))
		   (begin (progn (skip-syntax-backward "w_") (point))))
	  (if (eq begin end)
		  (isearch-forward regexp-p no-recursive-edit)
		(setq isearch-initial-string (buffer-substring begin end))
		(add-hook 'isearch-mode-hook 'isearch-set-initial-string)
		(isearch-forward regexp-p no-recursive-edit)))))
(define-key isearch-mode-map "\C-w" 'isearch-forward-at-point)
```
行頭に日時を入れる

貼るほどのものでもないけど．
語弊有でいって簡易的なsploggerです（語弊ありすぎ

```
#!/usr/bin/awk -f

{
print strftime("%Y-%m-%d %H:%M:%S") " " $0;
}
```

```
#!/bin/sh

ls | datetime > /var/log/ls.log
```
os.Exit()とdefer

golangのos packageにはExit()という関数がいて、その名の通りOSに値を返してプロセスが死ねる。
で、ドキュメントによると、

>
func Exit(code int)
Exit causes the current program to exit with the given status code. Conventionally, code zero indicates success, non-zero an error. The program terminates immediately; **deferred functions are not run.**

とあって、deferに登録した関数をすべて破棄してくれるらしいと書いてある。念の為に試しておくと、

```go
package main

import "os"

func test() { println("hello in test()") }

func main() {
        println("hello in main()")
        defer test()

        os.Exit(0)
}
```

を実行すると

```shell-session
% go run test4.go
hello in main()
```

のようになり、ホントにdeferは実行されていない。

で、世間的にはこの性質にどう立ち向かっているかを調べるため、golangのgofmtの実装を調べた。
そのところ、

```go
var exitCode = 0

func main() {
        // call gofmtMain in a separate function
        // so that it can use defer and have them
        // run before the exit.
        gofmtMain()
        os.Exit(exitCode)
}

func gofmtMain() {
        // 終了するタイミングで
        exitCode = 2
        return
}
```

という感じで、エントリポイントには一切の処理を書かないようにして、ここでos.Exit()を呼ぶようにしていた。
あまり芸術的とは思わないけれど、現実的にはそんな感じかなと思った。
Mac上でphpMyAdminがDBに接続できない場合、UNIX socketを確認する

設置したphpMyAdminからDBに接続できない場合、UNIX socketを確認します。

ターミナルでmysqlのstatusコマンドを使用します。

```mysql
mysql> status

--------------
mysql  Ver 14.14 Distrib 5.6.15, for osx10.9 (x86_64) using  EditLine wrapper

Connection id:		2
Current database:	
Current user:		root@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.6.15 Homebrew
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/tmp/mysql.sock
Uptime:			24 sec

Threads: 1  Questions: 5  Slow queries: 0  Opens: 67  Flush tables: 1  Open tables: 60  Queries per second avg: 0.208
--------------
```

UNIX socketは、「/tmp/mysql.sock」となっています。

php.iniにある、mysqlとmysqliのdefault_socketに、先ほどのUNIX socketを設定します。

```bash
$ vim /etc/php.ini

[MySQL]
mysql.default_socket = /tmp/mysql.sock

[MySQLi]
mysqli.default_socket = /tmp/mysql.sock
```

設定後、Apacheを再起動すれば、UNIX socketが有効になり、接続できるようになります。
[Ruby] メタプログラミングの入り口、オープンクラスを理解する



## 概要

[メタプログラミングRuby](http://www.amazon.co.jp/gp/product/4048687158/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4048687158&linkCode=as2&tag=kidachi-22)勉強録。

今回のトピックはメタプログラミングの代名詞の一つ、オープンクラスです。

## オープンクラスとは

既存するクラスを好きな場所で再オープンし、
メソッド修正・追加など任意の変更を加えられる機能のこと。

### 例えば

以下のような文字列操作メソッドがあったとします。

```ruby
def love_ruby(str)
  str + ' I love Ruby!' 
end

love_ruby('My name is kidachi.')
=> "My name is kidachi. I love Ruby!"
```

取りあえずトップレベルに定義しましたが、
オブジェクティブにするため、クラスに所属するようにしましょう。
そこで、<strong>オープンクラスを使ってStringクラス自体を改変</strong>します。


```ruby
class String
  def love_ruby
    self + ' I love Ruby!'
  end
end

'My name is kidachi.'.love_ruby
=> "My name is kidachi. I love Ruby!"
```

これでStringクラスを改変できました。
以後、あらゆる文字列がlove_rubyメソッドを利用できます。

```ruby
'Foo!'.love_ruby
=> "Foo! I love Ruby!"

'Bar!'.love_ruby
=> "Bar! I love Ruby!"

'I love Ruby!'.love_ruby
=> "I love Ruby! I love Ruby!"
```

これがオープンクラスの力です。

また、新規メソッドを定義するだけでなく、
<strong>既存のメソッドを書き換えてしまう</strong>ことも可能です。

例えば、文字列操作でよく使うupcaseを書き換えてみましょう。

```ruby
# 本来のupcase
'I love Ruby!'.upcase
=> "I LOVE RUBY!"

# オープンクラスによりupcase自体を書き換え
class String
  def upcase
    self + ' I love Ruby!'
  end
end

# 改変後のupcase
'I love Ruby!'.upcase
=> "I love Ruby! I love Ruby!"
```

いかがでしょうか。
ここまでで、その強力さと同時に危険さが伝わったかと思います。

いくらRubyのことが好きでも、大文字変換が期待されるメソッドを
まったく関係のない機能で上書いてしまうのは、ただのテロですよね。

つまり、オープンクラスは、
<strong>その気になればStringやArrayと言ったコアなクラスも
思いのままに破壊できてしまう危険性</strong>
を伴っているということ。

よってオープンクラスを使う際は以下のルールを守るべきです。

- 全ての文字列が保持しても問題のない汎用的な機能か見極める
- 充分にテストする

つまり上記例で言うと、upcaseの書き換えはもちろん、
汎用性に欠けるlove_rubyメソッドも本来オープンクラスで
追加するようなものではないということですね。


### 代替案

love_rubyメソッドのように、限定的な場面でのみ
使いたい/使われるべき機能の場合は、

- 大人しく拡張Stringクラスを定義する
- （Ruby2.0以上の場合は）refinmentsを用いる

という選択肢があります。

※refinments
オープンクラスの影響を特定範囲に限定出来る。
ただし、Ruby2.0で実験的実装、2.1で正式採用という
非常に新しい機能なので、利用の際は最新情報キャッチアップの上でどうぞ！

参考）Refinementsとは何だったのか
http://magazine.rubyist.net/?0041-200Special-refinement




### モンキーパッチ

<strong>オープンクラスにより既存のメソッドを置き換えること</strong>を<strong>モンキーパッチ</strong>と言います。

また、特に、<strong>意図せずに既存メソッドを書き換えてしまった事象のこと</strong>や、
それゆえに<strong>マイナスイメージを伴うもの</strong>を意味する向きもあります。

もちろん普通に便利なものとして使うことも。
明確な定義はなく、細かいところはその場の文脈で変わる様です。

上記のString#upcaseの書き換えは（良くない）モンキーパッチですね。

<a name="ps1"></a>

## 結論

オープンクラス（に限らずメタプログラミング全般）は

- 既存クラスをいつでも思いのままに修正出来る利便性
- ルールを破壊してしまう危険性

を備えています。


メタプログラミングの入り口に立った私たちは、
今後常に<strong>Matzのことば</strong>を頭の片隅に置いておきたいですね。

「Rubyは君を信頼する。Rubyは君を分別のあるプログラマとして扱う。
Rubyはメタプログラミングのような強力な力を与える。
ただし、大いなる力には、大いなる責任が伴うことを忘れてはいけない」

-「メタプログラミングRuby」序文より。

## 以下に続く

[Ruby] method_missing()を実用レベルで理解する
http://qiita.com/kidachi_/items/75ae4a29c99a79816384
StoryboardでUIScrollViewを配置する場合

Storyboard上ではcontentSizeが設定できないのでそのままではスクロールができない。
しかし以下の様に、viewWillAppear: 内でcontentSizeを入れてもまだスクロールできない。

```objc
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.scrollView.contentSize = self.imageView.bounds.size;
}
```

http://labs.septeni.co.jp/?p=910
こちらによると、どうやらAutoLayoutがレイアウトを決定するのは viewDidLayoutSubviews 以降らしい。

```objc
- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.imageView.bounds.size;
}
```

これで無事スクロールされるようになった。
Introduction of Amazon Glacier on BEAR.Saturday.


## Install SDK by Composer

```Console
cd App
curl -s http://getcomposer.org/installer | php
vim composer.json
```

```Json:composer.json
{
    "config": {
        "vendor-dir": "Vendor"
    },
    "require": {
        "aws/aws-sdk-php": "*"
    }
}
```

```Console
php composer.phar install
```

## Implement interface of Glacier.

```
vim App/app.yml
```

```Yaml:App/app.yml
+ App_Ro_AWS:
+   key: KEY
+   secret: SECRET
+   region: REGION
+ App_Ro_Backup:
+   vault_name: VAULT_NAME
```

```
vim App/Ro/AWS.php
```

```php:App/Ro/AWS.php
<?php
require_once 'App/Vendor/autoload.php';
class App_Ro_AWS extends App_Ro
{
    public function onInject()
    {
        parent::onInject();
        $app = BEAR::get('app');
        if (!array_key_exists(__CLASS__, $app)) {
            throw new BEAR_Exception(sprintf('Setting not found. [%s]', __CLASS__));
        }
        $this->_config = array_merge($this->_config, $app[__CLASS__]);
    }
}
```

```
vim App/Ro/AWS/Glacier.php
```

```php:App/Ro/AWS/Glacier.php
<?php
use Aws\Glacier\GlacierClient;
class App_Ro_AWS_Glacier extends App_Ro_AWS
{
    /**
     * Generate Glacier client.
     */
    public function onRead($values)
    {
        return GlacierClient::factory(
            array(
                'key' => $this->_config['key'],
                'secret' => $this->_config['secret'],
                'region' => $this->_config['region']
            )
        );
    }
}
```

```
vim App/Ro/Backup.php
```

```php:App/Ro/Backup.php
<?php
class App_Ro_Backup extends App_Ro
{
    protected $_client;

    public function onInject()
    {
        parent::onInject();
        $this->_client = $this->_resource->read(array('uri' => 'AWS/Glacier'))->getBody();
    }

    /**
     * @required path
     */
    public function onUpdate($values)
    {
        if (!is_readable($values['path'])) {
            throw new BEAR_Exception(sprintf('File not found or not readable: [%s]', $values['path']));
        }
        return $this->_client->uploadArchive(
            array(
                'vaultName' => $this->_config['vault_name'],
                'body' => fopen($values['path'], 'r')
            )
        )->get('archiveId');
    }
}
```

## Example

```Console
bear update “Backup?path=/path/to/query.sql.tgz”
```
mysqlのdumpをGitで保管してみる

と思ったのですが、推奨されていないですね。

* 1リポジトリ1GB以内、1ファイル100MB以内で管理されることが推奨
* DB dump file, binaryファイル, 圧縮されたファイル,などのファイルの管理に適さない
* https://help.github.com/articles/what-is-my-disk-quota

はじめに
=========

dumpデータを毎日とり続けているが、圧縮しても1TBに到達しそう。
そんなに差分がないんじゃないのかと思い、Gitで管理、dumpデータは上書きしてGitにcommit
という運用を始めてみた。

```bash:gitリポジトリの準備
cd ~
mkdir dumpdir.git
cd dumpdir.git
git init
cd ~
```

### diffについて

mysqldumpは`skip-extended-insert`オプションを付けると差分が見やすくていいです。
しかしリストアにかかる時間が`skip-extended-insert`があると9倍くらいになるので注意。

```bash:改行するとdiffが容易
sed -i.bak -e 's@),(@)\n,(@g' dump.sql
```

改行するとdiffが容易、かつリストアにかかる時間がわずかに早い(数ms)

### tar.gzからgitに変換

```bash:tar.gzからgitに変換
set -e

cd ~/archives/2013/

for dump in $(ls *.tar.gz | sed 's/.tar.gz//')
do
  echo $dump
  tar xzf ~/archives/2013/${dump} -C dumpdir.git/
  cd ~/dumpdir.git
  git add -A
  git commit -m "backup: ${dump}"
  cd ~
done
```

全部終わったら`git gc --prune=now`にて圧縮しておきましょう。

データサイズ例
============

|形式|サイズ|
|:-----|---:|
|tar.gz|3.6G|
|git gc前|4.5G|
|git gc後|516M|

git gcがメモリ不足で失敗する場合
============

```bash:エラーメッセージ
$ git gc --auto
Auto packing the repository for optimum performance. You may also
run "git gc" manually. See "git help gc" for more information.
Counting objects: 10619, done.
Delta compression using up to 32 threads.
warning: suboptimal pack - out of memory 
fatal: Out of memory, malloc failed619)   
error: failed to run repack
```

* [gitリポジトリを軽くしよう！ | TechRacho](http://techracho.bpsinc.jp/baba/2012_05_22/5594)
* [gitのメモリ不足の回避 - myblog](http://int.typepad.com/myblog/2010/01/git%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E4%B8%8D%E8%B6%B3%E3%81%AE%E5%9B%9E%E9%81%BF.html)


```bash:threadを絞る
[pack]
	threads = 1
	windowMemory = 100m
	SizeLimit = 100m
```

* `windowMemory * 10`(--windowの数)メモリ確保が必要

packオプションで上記を忘れてしまうと、メモリに格納しきれないほどの大きい`.git`フォルダを
`git gc --auto`しようとするとサーバーがハングアップします。

```diff:サーバーrebootするのでgcだけにしておくこと。
- git gc --aggressive
- git gc --prune=now
+ git gc
```


年度別にgitリポジトリ作るといい

## やり直したい場合

```bash:revを../name.tar.gzに退避
a() {
  git archive -o ../$name.tar.gz $rev
} 

a 312f68 2014-01-01
a 22cc8f 2014-01-02
a c4bcdc 2014-01-03
...
```
Clojureの環境構築とか


#leiningenのインストール

```zsh
cd ~/.local
wget https://raw.github.com/technomancy/leiningen/stable/bin/lein
chmod +x lein
./lein
sudo ln -sf /home/username/.local/lein /usr/local/bin/
```

これでインストールは完了

```zsh
lein repl
```

とやるとREPLが起動できるはず．

参考
[Ubuntu での Clojure と Leiningen 超入門](http://qiita.com/ka_/items/a3f79b761e25d485f2a9)
[Leiningen入門（再）](http://d.hatena.ne.jp/Kazuhira/20130820/1377000175)

#LightTableを入れる
ClojureのIDE（統合開発環境）で，LightTableとうのがあります．
まだできて時間経っていませんが，なかなか良さそうでなによりカッコイイ
githubからソースを落としてきてやる方法だと起動できなかったので，直接バイナリで構築．
公式サイト[LightTable](http://www.lighttable.com/)からダウンロードしてくる．

```zsh
cd ダウンロードしたディレクトリ
tar -xvzf LightTableLinux64.tar.gz
mv LightTable ~/.local
sudo ln -s /home/username/.local/LightTable/LightTable /usr/local/bin
```

これで，端末で

```zsh
LightTable
```

とすれば起動可能．

参考
[Unable to run Light Table 0.4 (Linux64) on Ubuntu 13.04 (more libudev issues)](https://github.com/LightTable/LightTable/issues/453)
[Install Light Table IDE and Create Launcher in Ubuntu Unity](http://ubuntuhandbook.org/index.php/2013/09/install-light-table-ide-create-launcher-ubuntu/)

#LightTableをUnityのランチャーに登録
gnome-panelというアプリ使うとGUIでアイコンの設定ができる！！便利！！

```zsh
sudo apt-get install gnome-panel --no-install-recommends
sudo gnome-desktop-item-edit /usr/share/applications/ --create-new
```

これで，

```
name:LightTable
command:/usr/local/LightTable/LightTable
icon:/usr/local/LightTable/core/img/lticon.png
```

を設定．アイコンはアイコンのところをクリックしてディレクトリ指定．
githubの方で環境構築するやり方誰か教えて欲しい．．．


#LightTableのショートカットキー
ショートカットわかりづらいけど，google-chromeのショートカットに似てる．

|キー           |機能                          |                                |
|:-------------|:-----------------------------|:-------------------------------|
|Ctrl+n        |新しいタブで新規ファイルを開く       |[File>new file]に相当            |
|Ctrl+Shift+n  |新しいウィンドウで新規ファイルを開く   |                                |
|Ctrl+Shift+o  |ファイルを指定して開く             |[File>open file]に相当           |
|Ctrl+Space    |コマンドの検索                   |[view>command]に相当            |
|Ctrl+w        |タブを閉じる                     |                                |
|Ctrl+l        |指定した行にジャンプする           |                                |
|Ctrl+s        |ファイルを名前をつけて保存          |                                |
|Ctrl+Shift+「  |左のタブに移動                   |                                |
|Ctrl+Shift+」  |右のタブに移動                   |                                |
|Ctrl+d        |docを開く/閉じる                  |関数名にカーソルがあたっている時に関数の説明を出す|
|Ctrl+Tab      |表示タブの移動　　　　　　　　　　　　|Google ChromeとかのTab移動と同じ|

とりあえず，困ったら．Ctrl＋Spaseで検索画面を出して，何か使いたい機能の単語打てばなんか出てきます
gitoriousのDockerfileあったのでbuildしてみた


OSSのGithubクローン、gitoriousがDockerfile形式でイメージを配ってたので試しにbuildしてみました。
https://gitorious.org/gitorious/gitorious-docker/source/799c49967663e0c379fc1b4089a2eb8fb7ceb072:


## やったこと
Dockerの使える環境を用意してあること前提で書いてきます。
インストールなどは公式ドキュメント参照してください。
https://www.docker.io/gettingstarted/

```sh:
$ git clone https://git.gitorious.org/gitorious/gitorious-docker.git
$ cd gitorious-docker
$ docker build -t gitorious/gitorious .
$ ./gitoriousctl start
```

初回は30分以上かかった。
ちなみに上記のgitoriousctlは単なるdockerのコマンドのラッパーになってます。

```
usage: gitoriousctl start|stop|status|ssh
```

## アクセスしてみた

![スクリーンショット 2014-01-14 1.38.47.png](https://qiita-image-store.s3.amazonaws.com/0/182/4a8412a6-da58-ecac-4c5d-d1ab22c82319.png "スクリーンショット 2014-01-14 1.38.47.png")


手軽すぎる。（※起動直後は多分mysqlだか何かが起動中でアクセスしても500エラーになった。）
Dockerfileでの配布、初回のイメージのbuildに結構時間かかるけどあとは差分buildで済むはずなので、今後の運用、アップデートもとても楽そう。
MQTTベンチマークについて


## 見つけたもの
githubにあった[MQTT Benchmark](https://github.com/chirino/mqtt-benchmark)
MQTT v3.1準拠のベンチマーク。
SpringSourceのひとが、STOMPベンチマークをMQTTにポートしたらしい。

## 対象サーバ

- Apache [ActiveMQ Apollo](https://activemq.apache.org/apollo/)の[MQTTプロトコル](https://activemq.apache.org/apollo/documentation/mqtt-manual.html) -
ApolloはScala実装。libdispatch(GDC)のjavaポートを使ってる。
- [Mosquitto](http://mosquitto.org) - 
C実装。付属ツールのmosquitto_pub/mosquitto_subが便利。

## 実装
セットアップから実行までオールインワンタイプ。
MQTTサーバは、ダウンロードしてきてコンパイルしてくれる。

ベンチマークはscalaで実施。なので、ApolloのMQTTプラグインをチューニングするのに必要だったのかもしれない。

計測内容は、結構細かい。
JSON形式のログ結果をグラフィカルに表示してくれる。

OSXでも動いた。

## ベンチマーク結果の印象
途中まで実行した感じMosquittoに比べて、ApolloのMQTTが2桁倍速いようだ。（データストアまわりは確認してない）

## 改善したほうが良い点

- クライアントとサーバを別環境に用意してやる
- 他のMQTTサーバを用意する

クライアントは別サーバにしてやらないと、安定した計測が難しい。
拡張しやすく作られているが、他のMQTTサーバに対応させるのに、オールインワンにする必要はある？

商用レベルでメンテナンスされてるようなサーバであれば対応されると良さそう。
erlangの[eMQTT](http://emqtt.github.io)やnodeの[mosca](http://mcollina.github.io/mosca/)などは、まだ個人ベースかもしれない。
テーブル内データのdiff（テーブルの一致判定）

2020-04-24追記
2021-08-23URL修正
より深く考察されている記事を見つけました。
[BigQuery テーブル同士の一致判定 | Queuery](https://queuery.com/blog/2020/01/26/two-tables-have-exactly-the-same-data-in-bigquery)

2025-01-22追記
BigQueryだと、行全体のハッシュ値をとって全行のBIT_XOR()をとって比較するというスマートな方法もあるようです。
[BigQuery テーブル比較で使っているクエリ集](https://zenn.dev/yuichi_dev/articles/c3d197d69446d6)
~~また、いつのまにかBigQueryで`EXCEPT ALL`が使えるようになっていたので追記しました。~~
ドキュメントに記載されていただけで実際には使えるようにはなっていませんでした、、、😥
（Spannerでは使えたのでドキュメントのミスかリリースされてないだけか）

---


集合演算可能な２つのテーブル（カラムの数と型が同じテーブル）の差異を取得する。

例えば、対象テーブル（foo）の、ある時点のデータを別テーブル（foo_backup）として保存しておき、その内容の差異を取得する。

方法１

```postgres
(
    select * foo
    union all
    select * foo_backup
)
except all
(
    select * foo
    intersect all
    select * foo_backup
)
```

方法２

```postgres
(
    select * foo
    except all
    select * foo_backup
)
union all
(
    select * foo_backup
    except all
    select * foo
)
```

* 方法２の方が対称的で覚えやすいかも
* allを忘れると重複行が1行になってしまうので注意

ベン図を描かないと理解しにくい、、、。


### 2020.7.14追記

~~BigQueryでは `EXCEPT ALL` が使えないので、代わりに `EXCEPT DISTINCT` を使う。
ただし当然、2つのテーブル間で同値行の行数が異なる場合でも、1行として扱われてしまうので差異がないことになってしまう。~~
2025-01-22追記
~~いつのまにか`EXCEPT ALL`が使えるようになっていました。~~
ドキュメントに記載されているだけで実際には使えませんでした。
[Query syntax  |  BigQuery  |  Google Cloud](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#except)
連続する値を配列に代入したいとき

配列に連続する値を代入したいときがあると思います。
例えば"a"〜"c"までの文字が格納されている配列です。
このとき1つずつ値を格納すると下のようになります。

```ruby:array1.rb
array = ["a", "b", "c"]
p array
# >> ["a", "b", "c"]
```

しかし"a"〜"z"のように要素が多いと手入力するのが非常にめんどくさいです。
そこで次のようにRangeを使用すると簡単に代入できます。

```ruby:array2.rb
array = [*("a".."c")]
p array
# >> ["a", "b", "c"]
```

数値にも使えるので便利です。
下のコードは1〜5の数値を用意し、奇数を取り除きます。

```ruby:array3.rb
nums = [*(1..5)]                # => [1, 2, 3, 4, 5]
odds = nums.reject { |num| num.odd? }
p odds

# >> [2, 4]
```
「find: パス名は評価式の前に置かなければいけません」と怒られた場合の対処

Linuxにてfindで以下のように検索したら怒られた。

```
$ find . -name *山口* -print0 | xargs -0 ls
find: パス名は評価式の前に置かなければいけません: tv - 山口県101回.mp4
使用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
```

アスタリスクがある場合はダブルクオーテーションで囲う必要があるらしい。これでちゃんと出てきた。

```
$ find . -name "*山口*" -print0 | xargs -0 ls
./old/201310261444/tv - 山口県101回.mp4     ./tv - 山口第129回.mp4  ./tv - 山口県132回.mp4  ./tv - 山口第130回.mp4  ./tv - 山口第133回.mp4
```

参考にしたページ
かけだしエンジニアの独り言 http://blog.livedoor.jp/kistame228/?p=4
Node.jsでMongoDBのドキュメント削除


MongoDBではデフォルトで_idという識別子が付与されるらしく，idを指定してドキュメント削除が出来るみたいなのでメモです．
(勉強中なので間違ってたらコメント下さい^^;)

※MySQLとかでいうレコードのことをMongoDBではドキュメントを表現するみたいです．
http://gihyo.jp/dev/serial/01/mongodb/0003


###idを指定して削除

```bbs.js
  Post.findByIdAndRemove(id, function(err, result) {
    if (err) {
      res.send({'error': 'An error has occurred - ' + err});
    } else {
      console.log('Success: ' + result + ' document(s) deleted');
    }
  });
```

###別のやり方
```bbs.js
Post.remove({ _id: id }, function(err, result){
	if (err) {
		res.send({'error': 'An error has occurred - ' + err});
	} else {
		console.log('Success: ' + result + ' document(s) deleted');
	}
 });
```
####フィールド指定(nameがhogeのドキュメントを削除)
```bbs.js
Post.remove({ name: "hoge" }, function(err, result){
	if (err) {
		res.send({'error': 'An error has occurred - ' + err});
	} else {
		console.log('Success: ' + result + ' document(s) deleted');
	}
 });
```
Form上の全てのコントロールを取得

<H1>概要</H1>
WindowsForm上の全てのコントロールを取得します。

<h1>定義メソッド</h1>
        /// <summary>
        /// 指定のコントロール上の全てのジェネリック型 Tコントロールを取得する。
        /// </summary>
        /// <typeparam name="T">対象となる型</typeparam>
        /// <param name="top">指定のコントロール</param>
        /// <returns>指定のコントロール上の全てのジェネリック型 Tコントロールのインスタンス</returns>
        public static List<T> GetAllControls<T>(Control top) where T : Control
        {
            List<T> buf = new List<T>();
            foreach (Control ctrl in top.Controls)
            {
                if(ctrl is T) buf.Add((T)ctrl);
                buf.AddRange(GetAllControls<T>(ctrl));
            }
            return buf;
        }

<h1>使用コード</h1>
            // コントロール全てを列挙
            List<Control> controls = GetAllControls<Control>(this);
            System.Console.WriteLine("controls : " + controls.Count().ToString());
            foreach (var ctl in controls)
            {
                System.Console.WriteLine("control : " + ctl.Name);
            }

            // ボタン、またはボタンを継承したコントロールを列挙
            List<Button> buttons = GetAllControls<Button>(this);
            System.Console.WriteLine("buttons : " + buttons.Count().ToString());
            foreach (var ctl in buttons)
            {
                System.Console.WriteLine("button : " + ctl.Name);
            }

<h1>参考</h1>
http://www.atmarkit.co.jp/fdotnet/dotnettips/224controls/controls.html
クラスのインスタンスを表示するときに見やすくする

クラスのインスタンスを表示すると下のように表示されます。

```ruby:person1.rb
class Person
  def initialize(name, age)
    @name, @age = name, age
  end
end

tarou = Person.new("太郎", 18)
puts tarou
# >> #<Person:0xb86aa1e0>
```

しかしPersonの名前と年齢を見たいときに困ります。
下のように変更することで名前と年齢を見ることは可能です。

```ruby:person2.rb
class Person
  attr_reader :name, :age
  def initialize(name, age)
    @name, @age = name, age
  end
end

tarou = Person.new("太郎", 18)
puts "#{tarou.name}は#{tarou.age}歳です。"
hanako = Person.new("花子", 16)
puts "#{hanako.name}は#{hanako.age}歳です。"
# >> 太郎は18歳です。
# >> 花子は16歳です。
```

この方法では新しい人物を追加するたびに***.nameと***.ageの部分を変更しなければなりません。
もし表示が統一されているなら、次のようにすると楽です。

```ruby:person3.rb
class Person
  def initialize(name, age)
    @name, @age = name, age
  end

  def to_s
    "#{@name}は#{@age}歳です。"
  end
end

tarou = Person.new("太郎", 18)
hanako = Person.new("花子", 16)
puts tarou
puts hanako
# >> 太郎は18歳です。
# >> 花子は16歳です
```
PHPでオブジェクトの強い型付け

[前回](http://yuubiseiharukana.blog.shinobi.jp/Entry/1296/)SplTypeを使って厳密なSplInt型を作りました。
が、用意されているのはint、stringといったスカラー型だけでした。

自作のクラスに対応するためにSplTypeが用意されています。
SplTypeはabstractなクラスです。
何故インターフェイスじゃないんだ。

```php
<?php
	class HOGE extends SplType{}

	$hoge = new HOGE();
	$hoge = 1; // Uncaught exception 'UnexpectedValueException'
```

あれ、これ全クラスをextends SplTypeってしとけば強い型付け言語PHPの誕生じゃね？
PHPは型付けが～とか言ってる人はいっぱいいるけど、これを紹介してる人がただの一人もいないってのはどういうことですかね。

せっかくなので、runkitで全クラスに強制的にSplTypeを継承させてしまいましょう。

```php
<?php
	class HOGE{}
	
	$classes = get_declared_classes();
	class SplTypeTmp extends SplType{}
	$tmp = error_reporting(0);
	foreach(get_declared_classes() as $key=>$val){
		if(!get_parent_class($val)){
			runkit_class_adopt($val, 'SplTypeTmp');
		}
	}
	error_reporting($tmp);
	
	$x = new HOGE();
	$x = 1; // 普通に入った
```

あれ？
調べてみたら[runkit_class_adopt](http://php.net/manual/ja/function.runkit-class-adopt.php)は一見親クラスを付け替えているように見えますが、実際は本当に変更しているわけではなくエミュレーション的なことをしているみたいです。
自作クラスでも一部情報が飛んでしまい、SplTypeのような特殊なクラスではその特殊性が失われます。
ということで全自動強い型付け言語PHPの夢は破れてしまいました。
型付けとかは開発時にしか必要のない機能なので、php.iniあたりでSplType強制を設定できるようになってくれれば、とても便利だと思うのですがどうでしょう >開発者

SplTypeを使いこなせば、開発に非常に強力な武器となってくれるでしょう。
あと強い型付け言語使いから大きな顔をされることもなくなるでしょう。
VirtualBoxで作る開発環境

しばらく前までは、開発環境はWindowsに直接構築していました。

例えば、Androidの開発だと、EclipseとかJavaとかAndroid SDKとか。実機をつなぐ場合は端末ごとにデバイスドライバーも入れないといけないし、ちょっとずつ構築していくにはいいですが、新しい人に手伝ってもらうとき環境を教えるのは大変です。

いろいろツールをインストールしてるとWindowsが汚れて重くなってくるんですね。さらにディスクの容量が足りなくなって、ハードディスクを増設したりすると、インストール場所もC:¥Program Files¥だと間に合わなくなりあっちこっちに色々入ってるとか、カオスな感じになっていました。

で、最近はVirtualBoxを使って仮想マシンにFedora17をインストールして、その中にEclipseとかSDKを全部入れるようにしてます。

仮想マシンにEclipseを入れると操作が重くなるのでは・・・と当初は懸念がありましたが、ハードウェアアクセラレーションが効くのでほぼ変わらない速度で操作できます。

開発環境をバックアップしておいたり、他人と共有したりするのもとても簡単になりました。

これから開発環境を作ろうとしている方は、VirtualBoxで仮想マシンを作ってその中に入れるといいですよ！
emacsの設定を残してみる


(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(global-linum-mode t)
 '(tool-bar-mode nil))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

;; Mac用フォント設定
;; http://tcnksm.sakura.ne.jp/blog/2012/04/02/emacs/

;; 英語
(set-face-attribute 'default nil
:family "Ricty Regular" ;; font
:height 140) ;; font size

;; 日本語
(set-fontset-font
nil 'japanese-jisx0208
;; (font-spec :family "Hiragino Mincho Pro")) ;; font
(font-spec :family "Hiragino Kaku Gothic ProN")) ;; font

;; 半角と全角の比を1:2にしたければ
(setq face-font-rescale-alist
;; '((".*Hiragino_Mincho_pro.*" . 1.2)))
'((".*Hiragino_Kaku_Gothic_ProN.*" . 1.2)));; Mac用フォント設定

;;改行とインデント
(global-set-key"\C-m"'newline-and-indent)
;;(M-x c-set-style RET) ;;<インデント>

;;インデントとインデント設定名
;;gun 2
;;k&r 5
;;bsd TAB(8)
;;stroustrup 4
;;whitesmith 1
;;ellemtel 3
;;cc-mode 4

(put 'dired-find-alternate-file 'disabled nil)

;;起動画面のmessageとscratchを消す
(setq inhibit-startup-message t)
(setq initial-scratch-message nil)

;;シンタックスハイライトを定義
(global-font-lock-mode t)

;;起動時の画面フルサイズ
(set-frame-parameter nil 'fullscreen 'maximized)


;;; 対応する括弧を表示させる
(show-paren-mode 1)

;;; 現在行に色をつける
(global-hl-line-mode 1)

;;; 履歴を次回Emacs起動時にも保存する
(savehist-mode 1)

;;; ファイル内のカーソル位置を保存する
(setq-default save-place t)

;;; global-font-lock-mode(色の設定等）を有効にする
(global-font-lock-mode t)

;;起動時に画面分割/ターミナル起動
(defun split-window-and-run-shell()
(setq w (selected-window))
(setq w2 (split-window w nil t))
(select-window w2)
(shell)
(select-window w))
(add-hook 'after-init-hook (lambda()(split-window-and-run-shell)))
iTerm2でMacのdeleteキーをbackspaceにかえる




![スクリーンショット 2014-01-13 21.20.24.png](https://qiita-image-store.s3.amazonaws.com/0/35671/1b746f85-0f27-ddb0-c338-bb904ed9b45f.png "スクリーンショット 2014-01-13 21.20.24.png")
⬆ここ
背景色の設定


<背景色、文字色関連>

○背景色を黒にする(文字色を黒以外に変更してから)
(set-background-color “背景色”)



○文字色を設定する
(set-foreground-color “設定したい色”)



○カーソル色を設定する
(set-cursor-color “カーソルの色”)



○global-font-lock-mode(色の設定等）を有効にする
(global-font-lock-mode t)
M-xで色の設定をオンにする。
emacsの設定（備忘録）


○起動メッセージの削除
(setq inhibit-startup-message t)


○scratchを削除
(setq initial-scratch-message nil)


○シンタックスハイライトを定義
(global-font-lock-mode t)


○起動時の画面フルサイズ
(set-frame-parameter nil 'fullscreen 'maximized)


○起動時に画面分割/ターミナル起動
(defun split-window-and-run-shell()
    (setq w (selected-window))
    (setq w2 (split-window w nil t))
    (select-window w2)
    (shell)
    (select-window w))
(add-hook 'after-init-hook (lambda()(split-window-and-run-shell)))


○行番号・桁番号を表示する
(line-number-mode 1)
(column-number-mode 1)


○対応する括弧を表示させる
(show-paren-mode 1)


○現在行に色をつける
(global-hl-line-mode 1)

○履歴を次回Emacs起動時にも保存する
(savehist-mode 1)

○ファイル内のカーソル位置を保存する
(setq-default save-place t)
フォント設定


;; Mac用フォント設定
;; http://tcnksm.sakura.ne.jp/blog/2012/04/02/emacs/

 ;; 英語
 (set-face-attribute 'default nil
             :family “設定したいフォント” ;; font
             :height 140大きさ)    ;; font size

;; 日本語
(set-fontset-font
 nil 'japanese-jisx0208
;; (font-spec :family "Hiragino Mincho Pro")) ;; font
  (font-spec :family “設定したいフォント”)) ;; font
Go言語:ファイルをあつかう単体テストはos.Getwd()でパスを解決


## この記事の目的

* Go言語でファイルを扱う単体テストを書けるようになる


## 忙しい人のためのまとめ

* ファイルを読み込んだりするテストを書くことあるよね
* __テストコードファイル__ と同じディレクトリに __テストで使うファイル__ を置く
* テストコードからは `os.Getwd()` でパスを解決する

# テストコードの書き方: ファイル操作関数のテストを例に

## ファイル構成

テストコードとテストで扱うファイルを同じディレクトリに置く

```
.
├── example.go … テスト対象コード
├── example.txt … テストで使うファイル
└── example_test.go … テストコード
```

## テスト対象コード

```go:example.go
package example

import (
	"io/ioutil"
)

// ファイルパスを与えると、ファイルの中身を返す関数
func FileGetContents(filename string) string {
	contents, _ := ioutil.ReadFile(filename)
	return string(contents)
}

```

## テストコード


`os.Getwd()` でテストコードがあるディレクトリが取れるので、そこからパスを解決する

```go:example_test.go
package example

import (
	"os"
	"testing"
)

func TestCode(t *testing.T) {
	dir, _ := os.Getwd()
	filename := dir + "/example.txt"

	contents := FileGetContents(filename)

	if contents != "Hello World!" {
		t.Fatalf(`Contents is not "Hello World!" but it is %s`, contents)
	}
}

```

## テストで使うファイル

```txt:example.txt
Hello World!
```

# 階層のあるモジュールはどうなる?

下記のような階層のある構成のモジュールでも大丈夫か気になるので、試してみよう。

```
.
├── foo
│   ├── bar
│   │   └── bar_test.go
│   └── foo_test.go
└── main_test.go
```



```go:./main_test.go
package main

import (
	"os"
	"testing"
)

func TestCode(t *testing.T) {
	dir, _ := os.Getwd()
	println(dir)
}
```

```go:./foo/foo_test.go
package foo

import (
	"os"
	"testing"
)

func TestCode(t *testing.T) {
	dir, _ := os.Getwd()
	println(dir)
}
```

```go:./foo/bar/bar_test.go
package bar

import (
	"os"
	"testing"
)

func TestCode(t *testing.T) {
	dir, _ := os.Getwd()
	println(dir)
}
```

テストを実行してみる:

```
go test -v ./...
```

※ `go test` コマンドに `./...` を与えると再帰的にテストコードを探して実行してくれる。

結果:

```
=== RUN TestCode
/Users/suin/Desktop/go-test
--- PASS: TestCode (0.00 seconds)
PASS
ok      _/Users/suin/Desktop/go-test    0.010s
=== RUN TestCode
/Users/suin/Desktop/go-test/foo
--- PASS: TestCode (0.00 seconds)
PASS
ok      _/Users/suin/Desktop/go-test/foo        0.016s
=== RUN TestCode
/Users/suin/Desktop/go-test/foo/bar
--- PASS: TestCode (0.00 seconds)
PASS
ok      _/Users/suin/Desktop/go-test/foo/bar    0.011s
```

結果を見ての通り、各テストコード実行時にワーキングディレクトリが変わっているのがわかる。なので、階層のあるモジュールでも `os.Getwd()` を使って問題ない。
Tizen IVI on PC を動かしてみた

# 概要
Tizen IVI on PC を動かしたので手順メモ。

参考: https://wiki.tizen.org/wiki/Tizen_IVI_for_PC


# スクリーンショット
Tizen IVI on PC 起動時画面/ホーム画面
![DSC_1939.jpg](https://qiita-image-store.s3.amazonaws.com/0/35514/461f8a18-5bfc-3230-b54b-babb548f1736.jpeg)

カレンダーアプリクリック時
![DSC_1938.jpg](https://qiita-image-store.s3.amazonaws.com/0/35514/67cdd9dd-ffa8-b6fc-6b14-014c8af961d6.jpeg)

# 環境
| 機材 | 使用Ver/詳細 |
|:-----------|:------------|
| PC(作業用)         | Ubuntu12.04 |
| PC(実行用)         | Dell OPTIPLEX790 Corei7 |
| USB Memory | Transcend 16GB |
| Display    | D-Sub |

※VM 環境は未使用

# 手順
* Ubuntu から Tizen IVI の イメージファイルをダウンロード
https://wiki.tizen.org/wiki/IVI/IVI_2.0_VMware
ivi-release-tizen-2.0_20130423.12-sdb.raw.bz2

* USB Memory を PC に刺す
* USB Memory の場所を確認

```bash
$ sudo fdisk -ls
```

* USB Memory に dd でコピー。 of の指定は上記 fdisk の結果に合わせる

```bash
$ bzcat ivi-release-tizen-2.0_20130423.12-sdb.raw.bz2 | sudo dd of=/dev/sdb
```

* 起動用 PC を再起動。USB boot の優先度を上げる。環境依存だが、私の環境では BIOS 起動時に F12 投下してあとは良きに計らう。
* 起動用 PC に USB Memory を刺し、もう一度 PC 再起動。
* 上記スクリーンショットの絵を90度横にずらした状態の絵が表示される。
* 90度ずれるのを直すため、GUIを終了させる
`Crtl + Alt + F3`

* CUI でログイン

```bash
root
tizen
```

* xorg.conf 編集。

```bash
$ vi /etc/X11/xorg.conf
```

```
Option "Rotate"
"left"-->"normal"
```

* PC 再起動

* 上記スクリーンショットの絵が表示される。


# 詰まったところ
* Tizen Wiki には bmaptool 使用を推奨していたが、失敗した。
* 画面表示位置変更時の Tizen Wiki の X の設定ファイルの PATH が異なる

> Fix Screen Rotation
> switch to console by pressing Crtl + Alt + F3 and log in to system as root (password: tizen)
> Change option Rotate of section Monitor from left to normal at /etc/X11/xorg.conf.d/60-cando-evdevmultitouch.conf: Option "Rotate" "left"-->"normal"
> Note: if /etc/X11/xorg.conf.d/60-cando-evdevmultitouch.conf does not exist edit /etc/X11/xorg.conf
> Restart X

と書かれていたが、
`/etc/X11/xorg.conf`
を編集する。
Tizen IVI on PandaBoard を動かしてみた

# 概要
冬休みの自由研究がてら、Tizen IVI on PandaBoard を動かしたので手順メモ。

本当は Tizen IVI のソースビルドに挑戦したがうまく行かず、
[moguriso](http://moguriqt.hatenablog.jp/entry/tizen_porting_06)さんの記述、
[わんわん](http://zaregoto.org/20121030.html#p01)さんの記述、
を参考に、イメージを microSD にコピーして動作させた。

わんわんさん、mogurisoさん、参考にさせて頂いてありがとうございました。

# スクリーンショット
Tizen IVI on Pandaboard 起動時画面/ホーム画面
![DSC_1929.jpg](https://qiita-image-store.s3.amazonaws.com/0/35514/9581874d-514c-18df-349a-a82ed0180b7d.jpeg)

電卓アプリクリック時
![DSC_1909.jpg](https://qiita-image-store.s3.amazonaws.com/0/35514/f5056f6d-8887-60ec-2a03-aa61a617edb0.jpeg)

# 環境
| 機材 | 使用Ver/詳細 |
|:-----------|:------------|
| PC         | Ubuntu12.04 |
| Target     | PandaBoard ES |
| microSD    | sandisk ultra 16GB |
| Display    | HDMI |

# 手順
* [わんわん](http://zaregoto.org/20121030.html#p01)さん作成の img ファイルをダウンロード
* img ファイル解凍

```bash
$ gzip -d tizen20121026.img.gz
```

* microSD を PC に刺す
* microSD の場所を確認

```bash
$ sudo fdisk -ls
```

* microSD に dd でコピー。 of の指定は上記 fdisk の結果に合わせる

```bash
$ sudo dd bs=4096 if=./tizen20121026.img of=/dev/sdb
```

* PandaBoard に各種接続し電源ON
* 上記スクリーンショットの絵が表示される

# 詰まったところ
* dd するとき、書き込み先をドライブではなくパーティションにすると失敗した

正

```bash
$ sudo dd bs=4096 if=./tizen20121026.img of=/dev/sdb
```

誤

```bash
$ sudo dd bs=4096 if=./tizen20121026.img of=/dev/sdb1
```

* 当初 microSD に SiliconPower 16GB を用いていたが、PandaBoard に電源入れても真っ黒画面から進まなかった
Vagrantで簡単仮想間構築 - インストールと簡単な使い方まで


## Vagrantとは
ベイグラントと読むらしい(ずっとバーグラントと読んでたのは内緒)

VirtualBoxなどの仮想化ソフトウェアを便利に扱うためのフロントツール
vagrantコマンドを使って、以下のようにCLIから仮想環境を操作できる

```
# 起動
vagrant up

# プロビジョニング(ChefSoloなど)
vagrant provision 

# 接続
vagrant ssh

# 終了
vagrant halt
```

VirtualBox以外にもこんなのも扱える

- VMWare
- EC2(Amazon Web Service)

## Vagrantを使って便利になること
基本的にVagarntでできることはVirtualBoxだけでもできる(はず)
けどVagrantを使うことによって、いろんなことが簡単に便利にできるようになる

例えば

- VMの設定をファイルで管理できる
 - ポートフォワーディング
 - ネットワーク
 - 共有ディレクトリ
 - メモリー

- Chef/Pupetで簡単にマシン自動セットアップできる

- 複数のマシン郡を一元管理して、一度に準備できる
 - 冗長構成を簡単に試せる

- 仮想環境のスナップショット、ロールバックなどが簡単にできる
 - 要プラグイン

## 利用シーン
- すぐに使える仮想環境を構築したい
- ちょっとしたテストのために壊してもいい環境が欲しい
- チームで同一の環境を簡単に構築したい

とか、いろいろあるけど
とりあえず便利だからVirtualBox使う際には噛ませておいて損は無い

## Vagrantのインストール
### 前提環境
- VirtualBox

### ダウンロード
ここからダウンロードしてインストール
http://www.vagrantup.com/downloads


## とりあえず試してみる

適当なディレクトリを作成してから、以下を実行

```
vagrant box add precise64 http://files.vagrantup.com/precise64.box
vagrant init precise64
vagrant up
vagrant ssh
```

もしくは、こっちでもよい

```
vagrant init precise64 http://files.vagrantup.com/precise64.box
vagrant up
vagrant ssh
```


### Boxとは
BoxとはVagrant用に調整されたISOファイルみたいなもの

ここからいろんなBoxがダウンロードできる
http://www.vagrantbox.es/

登録されたBoxの一覧を確認するには下記コマンド

```
vagrant box list
```

### Vagrantfile
```vagrant init```するとVagrantfileが作成される
これが仮想環境の設定ファイルであり、使用するBoxや、後述のネットワーク設定などを記述できる


## いろいろ設定してみる
Vagrantfileを編集していく
仮想環境への変更の反映は下記コマンド

```
vagrant reload
```

### プライベートネットワークを設定
```Vagrantfile
config.vm.network :private_network, ip: "192.168.33.10"
```

### ポートフォワーディングを設定
```Vagrantfile
config.vm.network :forwarded_port, guest: 80, host: 8080
```

## Chefで自動構築を試してみる
./cookbooks以下にchefのレシピを用意しておく

```Vagrantfile
config.vm.provision :chef_solo do |chef|
  chef.cookbooks_path = "./cookbooks"
  chef.add_recipe “git”
end
```

```
vagrant provision
```

## 複数ホストを立ててみる	
```Vargrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "precise32"
  config.vm.box_url = "http://files.vagrantup.com/precise32.box"

  config.vm.define :web1 do |web|
    web.vm.network :private_network, ip: "192.168.1.11"
    web.vm.network :forwarded_port, host: 8001, guest: 8000
  end

  config.vm.define :web2 do |web|
    web.vm.network :private_network, ip: "192.168.1.12"
    web.vm.network :forwarded_port, host: 8002, guest: 8000
  end
end
```

各ホストへの接続は以下のようにVagrantfileで定義した名前をつけてやる

```
vagrant ssh web1
vagrant ssh web2
```
ファイルの連続処理


# 基本形

```bash:sample1.sh
#! /bin/sh
while [ “$1” != “” ] ; do
	`do something to $1`
	shift 1
done
```

# 拡張子を削除した名前を`$file`に代入して処理

```bash:sample2.sh
#! /bin/sh
while [ “$1” != “” ] ; do
	file=${$1%.*}
	`do something with $file`
	shift 1
done
```
img要素の内側にボーダーを付ける


htmlとcssで画像の内側にボーダーを付ける。

```html
<a href="#">
  <img src="test.jpg" />
</a>
```


```css
a {
  border: none;
  overflow: hidden;
  display: inline-block;
  *display: inline;
  *zoom: 1;
}
a:hover {
  border: 5px solid #ccc;
}
a:hover img {
  margin: -5px;
}
```
node-gyp を使う npm install でコケる

 * Node.js 0.10.24
 * Marverick
 * Command Line Tools はインストールしてるけど Xcode はインストールしてない

といった環境で node-gyp を使う npm をインストールしようとすると、こんなエラーが出てこけました。

```
$ npm install phantom --save
（略）
xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

gyp: Error 1 running xcodebuild
gyp ERR! configure error
（以下略）
```

エラーメッセージで検索してみたら、node-gyp の issue [Problems on Mavericks with only Command Line Tools installed · Issue #341 · TooTallNate/node-gyp](https://github.com/TooTallNate/node-gyp/issues/341) が引っかかりました。

内容を読むと、これは node だとか node-gyp の問題ではなく、gyp の問題だと書いてあります。で、gyp 側の[このコミット](https://code.google.com/p/gyp/source/detail?r=1819)で修正されてるんじゃないのとのこと。

この修正は [node への Pull Request](https://github.com/joyent/node/pull/6730) としてマージされているので、次のリリースでは問題なく動くようになるんじゃないかと思います。

で、そのリリースが来るまでどうするかというと、自力でパッチを当てます。変更するファイルは `/usr/local/lib/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py` あたりです。

比較的見やすい[このコミット](https://github.com/TooTallNate/node-gyp/commit/5785bae9b00c8324d8df9cd87aa4ac2531f1da72)を参考に、 を`_GetSdkVersionInfoItem` と`_AdjustLibrary` を書き換えてやれば動くようになります。
Kobitoを使って、一括で限定共有記事にする方法

1. まずkobitoで`アイテム->Qiitaから取得`を行い、終わったらQiitaを終了します。
1. `~/Library/Kobito/Kobito.db`を`sqlite3`クライアントで表示します。
1. ZITEMテーブルのZPRIVATE値を`1`にします。
1. Kobitoを再度起動し、アイテム->変更を同期します。

![スクリーンショット 2014-01-13 18.49.10.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3cb101f0-2bab-51e5-c61a-7edf5dc1c230.png)

![スクリーンショット 2014-01-13 18.49.26.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a82c6b13-ccfc-8bf3-24ca-b308adf417bc.png)
SQLをファイルから読み込んで実行（文字列に改行を含むとき）

とあるデータのリカバリのため、大量のSQLを一括実行する機会に恵まれました。
該当カラムの文字列に改行を入れる必要があるため、、コンソールからの実行がちょいとしづらい…
（文字列内に改行コード入れてみたけどそのまんま文字列で評価されてしまったりした）

…ということで、改行を入れ込むのはいったん置いといて、SQLは改行を直で書くことに。

`insert into mail_data ( ID,SUBJECT_PREFIX,BODY) values (10000, 'member', 'データの:
中身');`

こんなんが数千行。
で、Excelでわーっと作ったSQLをファイルに書き込み、まとめて実行する。

Mysqlに接続してから、
`mysql>　source <file_path>`

これで無事に一括登録成功。

（あとはきちんとバッチが流れ終わることを確認するだけのかんたんなお仕事のハズ）
【python】勉強開始

手軽な言語を一つ覚えようと思い、
rubyとpythonで迷った結果、pythonをやることにしました。

web開発、アプリ作成くらいは一通りできるようにする予定。

とりあえずHello World

```py:hello.py
#!/usr/bin/env python

print ("Hello, World!")
```
Kobito要望: CSSをwebページと合わせてください。(h1,h2,font-familyだけでも・・・)

webページのCSSのほうがkobitoのより好きなので以下を取り込んで欲しいです。
あとbackground-colorはwebと同じ白がいいです。

```css:~/Library/Kobito/CSS/custom-style.css
* {
    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
}

h1 {
    -webkit-border-radius: 3px;
    -moz-border-radius: 3px;
    border-radius: 3px;
    margin: 1.3em 0 .7em 0;
    background-color: rgba(0, 0, 0, 0.1);
    padding: 3px 10px;
    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6);
    line-height: 30px;
    font-size: 24px;
    font-weight: 600
}

h2 {
    margin: 1.3em 0 .7em 0;
    border-bottom: solid 1px #d9d9d9;
    line-height: 28px;
    font-size: 22px;
    font-weight: 600;
}

a {
    color: #117ec6;
    text-decoration: none;
    border-bottom: none;
}
```

適用前
--------

![スクリーンショット 2014-01-13 18.07.02.png](https://qiita-image-store.s3.amazonaws.com/0/25728/12424a73-c8d5-2e8b-d69b-8ccfb1f97ab0.png)


適用後
---------

![スクリーンショット 2014-01-13 18.19.15.png](https://qiita-image-store.s3.amazonaws.com/0/25728/315a64ab-b2bc-a593-b038-f1ad053b9540.png)
Objective-Cで定数を定義する


ヘッダーファイルにおいて、#define（マクロ）を使って、（公開/非公開に関わらず）全ての定数にプレフィックスkをつけて定義しているコードを見かけることがあるが、下記理由から個人的にはあまり良くないのではないかと思っている。

- 型情報がない
- ヘッダーファイルインポート条件によっては、名前衝突により開発者が意図しないファイルにおいても定数置換が行われてしまう危険性がある

**実際のところ、私は下記のように定数定義を行っている。**

## 外部に公開する定数
- extern constを付与
- 定数にはプレフィックスとしてクラス名をつける（名前衝突を避けるため）

## 内部でのみ使用する定数
- static constを付与
- 定数にはプレフィックスとしてkをつける（よく見かけるパターン）

## コーディング例
以下は、BLGClassAクラスにおいて外部に公開する定数を定義、BLGClassBクラスにおいて内部で使用する定数を定義、して利用する場合の例。

```objectivec:BLGClassA.h
#import <Foundation/Foundation.h>

@interface BLGClassA : NSObject

extern const NSInteger BLGClassAIntegerConstant;
extern NSString *const BLGClassAStringConstant;

@end
```

```objectivec:BLGClassA.m
#import “BLGClassA.h"

const NSInteger BLGClassAIntegerConstant = 3;
NSString *const BLGClassAStringConstant = @"hogePublic";

@implementation BLGClassA

// NSObjectクラスにはinitメソッドが実装されているため、省略可能
//- (id)init {
//    if (self = [super init]) {
//    }
//    return self;
//}

@end
```

```objectivec:BLGClassB.h
#import <Foundation/Foundation.h>

@interface BLGClassB : NSObject
- (void)doSomething;
@end
```

```objectivec:BLGClassB.m
#import “BLGClassB.h"
#import “BLGClassA.h"

static const NSInteger kLocalIntegerConstant = 30;
static NSString *const kLocalStringConstant = @"fooLocal";

@implementation BLGClassB

// NSObjectクラスにはinitメソッドが実装されているため、省略可能
//- (id)init {
//    if (self = [super init]) {
//    }
//    return self;
//}

- (void)doSomething
{
    NSLog(@"Local Constants: %ld %@", (long)kLocalIntegerConstant, kLocalStringConstant);
    NSLog(@"Imported Constants: %ld %@", (long)BLGClassAIntegerConstant, BLGClassAStringConstant);
}

@end
```

```objectivec:main.m
#import <Foundation/Foundation.h>
#import “BLGClassB.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        BLGClassB *b = [BLGClassB new];
        [b doSomething];
        // Local Constants: 30 fooLocal
        // Imported Constants: 3 hogePublic
    }
    return 0;
}
```
Middlemanでsitemap.xmlを生成する

## builderでXML構築

Middlemanをつかっていて、sitemap.xmlを生成したいと思ったのでいろいろ調べて試してみました。大まかな方針は、builderを使ってsitemapから必要なものを取り出してXMLを生成します。

まず、 `Gemfile` に下記1行を追加して `bundle install` します。

```rb
gem 'builder'
```

次に、 `source/sitemap.xml.builder` を作成し、下記追加します。 `http://example.com` の部分は各自の環境に合わせて変更してください。

```rb
---
layout: false
---
xml.instruct!
xml.urlset "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9" do
  sitemap.resources.each do |resource|
    xml.url do
      xml.loc "http://example.com#{resource.url}"
    end if resource.destination_path =~ /\.html$/
  end
end
```

上記の方法で、 `*.html` ファイルのみを対象に `sitemap.xml` を生成できます。あとは Search Console で設定してあげると完了です。

## 応用例

これで必要最低限のものはそろっています。ほかにフィールドを追加したければ少し工夫が必要です。

### lastmod

必須フィールドではないのでなくてもいいですが、クローラーに更新を伝えるために指定しておきたい気がします。

```rb
xml.lastmod File.mtime(resource.source_file).strftime('%Y-%m-%d')
```

上記のようにすると、ファイルの更新日時のタイムスタンプが入ります。ただ、自分の場合はgit管理していて、他のマシンでpullするとずれてしまいます。ここはFrontmatterで指定するのがいい気がします。

```
---
modifiy_date: 2014-01-13
---
```

上記のような感じで追加しておき、

```
lastmod = resource.data.modify_date.presence || resource.data.date.presence
xml.lastmod lastmod if lastmod.present?
```

のようにしておくと、 `modify_date` を見て、ない場合は `date` が入り、それもない場合は `lastmod` 要素自体が生成されなくなります。

### changefreq / priority

ぼくは `changefreq` や `priority` を指定するために、ファイル名のパターンを定義しておいて、マッチすればその値を書き出すようにしています。たとえば以下のような感じです。

```rb
changefreqs = {
  'index.html' => :weekly,
  /^mono\// => :daily
}
# :
# : 中略
# :
changefreqs.each do |file, freq|
  next if file.kind_of?(String) && resource.destination_path != file
  next if file.kind_of?(Regexp) && resource.destination_path !~ file
  xml.changefreq freq.to_s
  break
end
```

[全文はGithubにあげている](https://raw.githubusercontent.com/youcune/youcune.com/master/source/sitemap.xml.builder)ので参照してみてください。もっといい方法があればコメントでおしえてください！

## 参考文献

* [Sitemap generator · Issue #259 · middleman/middleman](https://github.com/middleman/middleman/issues/259)
* [Middleman のサイトマップを使ってみる | e2esound.com業務日誌](http://www.e2esound.com/wp/2013/12/10/getting_started_sitemap/)
* [sitemap.xmlの記載方法と書式、設置する事で得られるメリット | SEO Imagination！ブログ](http://holy-seo.net/blog/seo/sitemap-sml-method-described-merit/)
casperjsのテストをUI操作で作成する。


# 概要
CasperJSのテストをUI操作で生成してくれるChromeプラグイン

#github
https://github.com/ebrehault/resurrectio

# プラグイン
https://chrome.google.com/webstore/detail/resurrectio/kicncbplfjgjlliddogifpohdhkbjogm

# 感想
簡単にテストを作成できる。
ちゃんと使うなら、これで大枠のテスト作成して手動で修正が良いかも。
Introduction of Grive.


```Console
sudo aptitude install cmake libgcrypt libjson0 libjson0-dev libcurl4-gnutls-dev libexpat-dev libboost-dev libboost-filesystem-dev libboost-program-options-dev libboost-test-dev libqt4-dev
git clone git://github.com/lloyd/yajl yajl
cd ./yajl
./configure
cmake .
make
sudo make install
git clone git://github.com/Grive/grive.git
cd ./grive
cmake .
make
sudo make install
```

```Console
which grive
```
> /usr/local/bin/grive

```Console
grive --version
```
> grive version 0.3.0-pre Jan 13 2014 17:18:53
GAE/GoでグローバルIP表示


今回はGo言語でこんな感じの置いて対応しました。
単に[チュートリアル](https://developers.google.com/appengine/docs/go/gettingstarted/helloworld?hl=ja)のHello, Worldの出力をhttp.Request.RemoteAddrに変えただけですが…（笑

```go:echo-ip.go
package echo_ip

import (
    "fmt"
    "net/http"
)

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, r.RemoteAddr)
}
```

これをテキトウなディレクトリにテキトウなファイル名でapp.yamlと一緒に置いて、goapp deployするだけでOKです。

一応、app.yamlもそのままです…（性善説を信じよう）

```yaml:app.yaml
application: echo-ip
version: 1
runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app

```

例えば、Macで[SDK](https://developers.google.com/appengine/downloads?hl=ja#Google_App_Engine_SDK_for_Go)のインストールディレクトリが、~/go_appengine とすると、こんな感じでOKです。

```console
$ mkdir -p ~/go_apps/echo-ip
$ nano ~/go_apps/echo-ip/echo-ip.go
$ nano ~/go_apps/echo-ip/app.yaml
$ ~/go_appengine/goapp deploy ~/goapps/echo-ip

```

GAE/Py版は他の方がサンプル公開されているみたいです。
[Google App EngineでグローバルIP表示](http://midget-lamp.appspot.com/article/106001/Google_App_EngineでグローバルIP表示)
[GOOGLE APP ENGINE で WAN 側 IP アドレスを取得](http://awoni.net/blog/2009/11/368#.UtOiMf2Turc)


DDNSサービスを利用しているとグローバルIPはちょこちょこチェックしないといけないわけですが、今まで下記サービスを利用させて頂いていました。

http://ipcheck.ieserver.net

curlで毎時0分にリクエストしていたら、大半がタイムアウトするようになってきたのでAppEngineに同様のものを置く事にしました。
別環境で0時5分から4時間おきに動かしている方は全く問題ないので、皆が0分に集中させているのがマズいのかなと。

他にも下記は知っているのですが、同じ事が起こる可能性があるので…
http://ifconfig.me/ip
http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip
JMeterのCSV Data Set ConfigのFilenameを相対パスで書く

jmxファイルがある場所がカレントになるので、たとえば

```markdown
// JMXファイル
/usr/local/apache-jmeter/jmx/test.jmx
// CSVファイル
/usr/local/apache-jmeter/jmx/data/test_data.csv
```
だったとすると、CSV Data Set ConfigのFilenameには

```markdown
data/test_data.csv
```
と記述する。当然JMXファイルと違う階層の場合はこんな感じで書ける

```markdown
../data/test_data.csv
```