OmniAICreator/Qiita-1.07M huggingface dataset:
【個人メモ】sshでマシンにログインしたらidobataに通知する

# sshを利用してマシンにログインしたことをidobataで通知したい

誰かがsshを利用してマシンにログインした時、
idobataにメッセージを流すとと楽だよな〜ということで
どうすりゃいいんだっけ、って調べてみた。

## sshrcを利用する

sshrcというファイルにスクリプトを書き込むと、
sshログインが行われた際にsshrcに書いたスクリプトが実行される。

/etc/ssh/sshrcファイルを作成し、
idobataにメッセージを送るためのスクリプトを実行するようにする。

```bash:/etc/ssh/sshrc
/etc/ssh/rc.d/notify_to_idobata.sh &
```

...実行ファイルについては、
/etc/ssh/rc.d/notify_to_idobata.shとして作った。
**{{ hook_id }}** のところは、適宜idobataのhook idに変えること。

```bash:/etc/ssh/rc.d/notify_to_idobata.sh
badge="source=<span class='label label-success'>ログインしました</span>"
br="<br/>"
message="<b>$(id -nu) $(date +'%Y-%m-%d %H:%M:%S %Z')</b>"

curl \
  --data-urlencode "$badge$br$message" \
  -d format=html \
  https://idobata.io/hook/{{ hook_id }}
```

## 実際にログインして通知されるか確認する

今回はvagrantを使って立ちあげたVirtual box上の
ゲストマシンに対してsshrcの設定を行った。

```vagrant ssh``` コマンドを実行して、
ゲストマシンにログインする。

![スクリーンショット 2014-05-03 15.59.08.png](https://qiita-image-store.s3.amazonaws.com/0/3985/55635db8-b4d2-9efb-8849-e2c4e83c631c.png)

無事ログインできたので、
idobataにログとして投げられているか確認する。

![スクリーンショット 2014-05-03 16.00.21.png](https://qiita-image-store.s3.amazonaws.com/0/3985/bddaa196-edcc-aa79-5309-a74622d8363d.png)

idobataにログインの通知が投げられてることを確認できた。

# 試験環境をansibleで作る

vagrantマシンで確認できるよう、playbookを作成した。

https://github.com/futoase/playbook-sshrc-sample

```group_vars/vagrant``` に、idobataのhook idを設定しておく。

その後、vagrant, virtualbox, packerをインストールし、

```
> vagrant up --provision
```

を実行すれば良い。

# 外部参考リンク

sshdのmanページ
http://www.unixuser.org/~euske/doc/openssh/jman/sshd.html

ログイン時のユーザー名を調べたい場合に参考にした
http://stackoverflow.com/questions/11052070/get-ssh-login-name-in-bash-script

今回はsshrcを利用したが、[PAM](http://en.wikipedia.org/wiki/Pluggable_authentication_module)を利用することも可能。
以下の記事にPAMを利用してshell scriptを実行するやり方がある。
PAMを使いたい場合、
**/etc/ssh/sshd_config** の ```UsePAM``` オプションを有効にしておくこと。
http://unix.stackexchange.com/questions/7390/ssh-login-hook


# 通知するということ

とあるオペレーションをした後、
マシンが不調になるとか(サービスがいつの間にか死んでる)、
そういうのって基本ログから漁ると思う。

で、人の操作によるものかどうかって
ログインに利用したユーザーのbash historyから追ったり、
今回の場合のようにsshでのログイン状況を確認したい場合は
**/var/log/secure** の内容を後から見たりすれば良い。

が、できればアクセスした時に通知してもらったほうがありがたい。
「あとでログを確認する」というpull型のやり方は、
不具合やら暇つぶしやら定期メンテやら、
何かしらのイベントが発生しない限り見ない。

push型の仕組みを導入することでログを閲覧する機会が増えていくと思う。
インサートモード移行時にインデントを行う[vim]

# 症状
`o`，`O`などでインサートモードに入るとインデントが調整された位置にカーソルが移動するのに，空行で`i`を押してもインデントが調整されない

# 解法
```vim
" smart indent when entering insert mode with i on empty lines
function! IndentWithI()
    if len(getline('.')) == 0
        return "cc"
    else
        return "i"
    endif
endfunction
nnoremap <expr> i IndentWithI()
```
空行の場合は`cc`で一行上のインデントを踏まえた位置にカーソルを移動．空行でなければ普通の`i`の動作

# 参考
http://stackoverflow.com/questions/3003393/vim-smart-indent-when-entering-insert-mode-on-blank-line
上サイトのanserを合わせてシンプルな解法になるようにしています．
シークヮーサーとファイアーエムブレムの表記ゆれを正規表現で表す

## シークヮーサーの表記

沖縄の特産のシークヮーサー、Wikipediaによるとその表記は多岐に渡るようです。

![Wikipedia シークヮーサー](https://upload.wikimedia.org/wikipedia/commons/c/c5/Shikuwasa.png)

[Wikipedia シークヮーサー](http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AE%E3%83%BC%E3%82%B5%E3%83%BC)より

その表記ゆれを正規表現にしてみました。

```
シ((ィ|イ)(|ー)|ー)ク(ア|ァ|ワ|ヮ)(ー|)(サ|シャ)ー
```

正規表現を構文図にしてくれる[Regexper](http://www.regexper.com/)に通してみます。

![シークヮーサー](https://qiita-image-store.s3.amazonaws.com/0/30582/4249e33e-6dfb-6200-978b-cb76a192dfce.png)
[Regexper シークヮーサー](http://www.regexper.com/#%E3%82%B7((%E3%82%A3%7C%E3%82%A4)(%7C%E3%83%BC)%7C%E3%83%BC)%E3%82%AF(%E3%82%A2%7C%E3%82%A1%7C%E3%83%AF%7C%E3%83%AE)(%E3%83%BC%7C)(%E3%82%B5%7C%E3%82%B7%E3%83%A3)%E3%83%BC)

これで(2*2+1)*4*2*2=80通りあります。小さい「ヮ」ってシークヮーサーでしか使わないよねぇ。

## 追記：ファイアーエムブレムの表記

同様に、任天堂のロールプレイングシミュレーションである[ファイアーエムブレム](http://www.nintendo.co.jp/fe/)も、正式な表記はこの公式Webサイトの通りですが、発音の関係で表記が揺れるようです。

```
フ[ァャ]イ[アヤ]ーエ[ンム]ブレム
```

![Regexper_-_2014-08-10_20.29.48.png](https://qiita-image-store.s3.amazonaws.com/0/30582/24e68de9-7b76-eb10-49ad-82f9c93c00ca.png)
[Regexper ファイアーエムブレム](http://www.regexper.com/#%E3%83%95[%E3%82%A1%E3%83%A3]%E3%82%A4[%E3%82%A2%E3%83%A4]%E3%83%BC%E3%82%A8[%E3%83%B3%E3%83%A0]%E3%83%96%E3%83%AC%E3%83%A0)

3か所それぞれが1文字ずつの選択となるため2^3=8通りとなり、シークヮーサーと比べて単純な構造です。
java API のソース(src.zip) の在処がわからないとき

`java -XshowSettings` すればよい。

```
$ java -XshowSettings
VM settings:
    Max. Heap Size (Estimated): 910.50M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) 64-Bit Server VM

Property settings:
    awt.toolkit = sun.lwawt.macosx.LWCToolkit
    file.encoding = UTF-8
    file.encoding.pkg = sun.io
    file.separator = /
    ftp.nonProxyHosts = local|*.local|169.254/16|*.169.254/16
    gopherProxySet = false
    http.nonProxyHosts = local|*.local|169.254/16|*.169.254/16
    java.awt.graphicsenv = sun.awt.CGraphicsEnvironment
    java.awt.printerjob = sun.lwawt.macosx.CPrinterJob
    java.class.path = .
    java.class.version = 52.0
    java.endorsed.dirs = /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/endorsed
    java.ext.dirs = /Users/t_suzuki88/Library/Java/Extensions

（以下略）

```

ヒープサイズやエンコーディングなど様々な情報が出てきます。
私の場合は下記にありました。
/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/src.zip

以上です。
[mainBundle pathForResource]はTestCaseでは利用できない?

あるテキストファイルを読むヘルパークラスの動作確認をするために、たまにはテストでも書くかと、安易な気持ちで書き始めたら詰まってしまった。

端的に述べると、XcodeのTestプロジェクト中で[[NSBundle mainBundle] pathForResouce]を使ってもnilしか返ってこず、かわりに[[NSBundle bundleForClass:[self class]] pathForResouce]とする必要があるようです。(self はテストケースのインスタンス.)

ヘルパークラス内でmainBundleを利用してたりする場合要注意。

```objc
// こっちはfilePathを取得できる
-(void)testExistFile
{
    NSString* filePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"Test" ofType:@"txt"];
    XCTAssertNotNil(filePath, @"%@", filePath);
}
// こっちは取得できない。
-(void)testExistFileUseMainBundle
{
    NSString* filePath = [[NSBundle mainBundle] pathForResource:@"Test" ofType:@"txt"];
    XCTAssertNil(filePath, @"%@", filePath);
}
```

# 参考
http://stackoverflow.com/questions/1879247/why-cant-code-inside-unit-tests-find-bundle-resources
初心者は覚えておきたいRubygemsのコマンドまとめ


gemかわいいよgem

# Rubygems(gem)って？

Ruby用のパッケージ管理システムです。ジェムって発音されるようです。
コマンド一つでパッケージをインストール・削除・更新などできるので便利です。

さらにbundlerも入れておければ設定ファイルに書いておいたものも一括で導入できます。

はい、釈迦に説法ですね。すみません


# Rubygemsコマンド一覧

[RubyGems Guide](http://guides.rubygems.org/command-reference/)でコマンド一覧が見れます。

その中からよく使うものをリストアップ

## インストール

必要なgemが予め決まっているならこれでインストール

```
# 最新のものを導入
$ gem install <gem名>

# バージョン指定で導入
$ gem install <gem名> -v <バージョン>

# RI,RDocドキュメントを入れない（インストールが早い）
$ gem install <gem名> --no-ri --no-rdoc
```

## アンインストール

gemが不要になった場合にアンインストール

```
# 不要なgemをアンインストール
$ gem uninstall <gem名>

```

## インストール済みGemをリストアップ

何をインストールしたか確認したいときにはこれで確認

```
# 単純にキーワードで検索
$ gem list <キーワード>
```

## gemをキーワード検索

gemをキーワード検索したい場合に使います。#一応正規表現も使えます。

```
# 単純にキーワード検索（キーワードが短いと山ほど余計なものがでることも）
$ gem search <キーワード>

# リモートのgemをキーワード検索
$ gem search -r <キーワード>
```


## gemの高度な検索

ローカルまたはリモートのgemを正規表現を使って検索したい場合に使います。
searchよりもこっちを覚えたほうがいいかもしれませんね。

```
# 特定gemの利用可能なバージョン一覧（例えばrailsとか）
$ gem query -ra -n  "^<gem名>$"
```

もうこれ覚えておけば十分でしょう。

[opsions]
-i, -​-[no-]installed - インストール済みかどうかを指定
-v, -​-version VERSION - バージョン指定
-n, -​-name-matches REGEXP - 正規表現を指定
-a, -​-all - すべてのgemバージョンを表示
-r, -​-remote - リモートのgemを指定
-b, -​-both - ローカルとリモートの両方を指定

## アップデートが必要なgemをリストアップ

ずっと使っていると更新が必要になってきますが、更新前に一度確認しておきたいときに使います。

```
$ gem outdated 
```

## gemをアップデート

gemを新しいバージョンに更新したいときに使います。

```
# インストール済み全gemを更新
$ gem update

# 指定gemを更新
$ gem update <gem名>
```


## gemのrdocを生成

gemのソースコードからRDocドキュメント生成する場合に使います。
インストール時に--no-ri --no-rdocしている人など。

```
# 特定gemのドキュメントを生成
$ gem rdoc --rdoc <gem名>

# インストール済み全gemのドキュメントを生成
$ gem rdoc --all
```

## gemの仕様を確認する

gemの仕様が確認したくなったら使います。
YAML形式でgemの依存関係などが出力されます

```
$ gem specification <gem名>
```

## gemのオプションなどを調べる

gemの使い方がわからなくなった時に使います。

```
# gemの実行方法などのヘルプを表示
$ gem help <gem名>
```

# ちょっとしたTips

## サブコマンドは省略系で使えます

gem以降のサブコマンドは基本的に他のサブコマンドと重複しない最短の文字列まで短縮できます。

上で上げていないのも含めて以下のように短縮できます。



- gem build → gem b
- gem cert → gem ce
- gem check → gem ch
- gem cleanup → gem cl
- gem contents → gem co
- gem dependency → gem d
- gem environment → gem e
- gem fetch → gem f
- gem generate_index → gem g
- gem help → gem h
- gem install → gem i
- gem list → gem li
- gem lock → gem lo
- gem outdated → gem ou
- gem owner → gem ow
- gem pristine → gem pr
- gem push → gem pu
- gem query → gem q
- gem rdoc → gem r
- gem search → gem sea
- gem server → gem ser
- gem sources → gem so
- gem specification → gem sp
- gem stale → gem st
- gem uninstall → gem uni
- gem unpack → gem unp
- gem update → gem up
- gem which → gem w
systemdで簡易中継サーバを作る

[xinetd と netcat で簡易中継サーバを作る](http://qiita.com/zakkied/items/604c19adf2779bc91c98)のsystemd版をやってみました。

.socketファイルと.serviceファイルを作ります。

```:/etc/systemd/system/http-proxy.socket
[Unit]
Description=Simple HTTP Proxy Socket

[Socket]
ListenStream=0.0.0.0:80
```

```:/etc/systemd/system/http-proxy.service
[Unit]
Description=Simple HTTP Proxy

[Service]
ExecStart=/usr/lib/systemd/systemd-socket-proxyd 192.168.4.99:80
PrivateTmp=yes
```

daemon-reloadして.socketの方を起動します。

```bash
sudo systemctl daemon-reload
sudo systemctl start http-proxy.socket
```

あとはアクセスするだけ。

実は[man systemd-socket-proxyd](http://www.freedesktop.org/software/systemd/man/systemd-socket-proxyd.html)にまさにこんな感じのサンプルが載っています。


### 余談

最初は同じようにnetcatでやろうと思ったんですがどうもうまくいかなくて、色々ググってるうちにsystemd-socket-proxydというまさにそれ用なやつに辿り着いたのでした。
あと、netcatみたいなやつでsocatっていうのもあるのね。
/usr/bin/env: ruby: そのようなファイルやディレクトリはありません


```shell-session
$ sudo ruby -v
/usr/bin/env: ruby: そのようなファイルやディレクトリはありません
```

~/.bashrcに以下を追加

```shell-session
$ vi ~/.bashrc
# 以下を追記
export PATH=/usr/local/bin:$PATH
alias sudo="sudo env PATH=$PATH"
```

```shell-session
$ vi /etc/sudoers
# 以下の設定に「:/usr/local/bin」を追記、この場合、全体に影響する
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
```
scss-mode で .scss ファイルをセーブするたびにコンパイルが走るのを抑制する


Emacs の scss モードを使っているとセーブする度にコンパイルが入って邪魔。
Rails だと Asset Pipeline が勝手にコンパイルしてくれるので要らない。
合わせてインデント幅も 4 -> 2 に変更。

```init.el
(add-hook 'scss-mode-hook
  '(lambda ()
     (and
      (set (make-local-variable 'css-indent-offset) 2)      ; インデント2
      (set (make-local-variable 'scss-compile-at-save) nil) ; セーブ時にコンパイルしない
      )))
```

[参考](http://qiita.com/sawamur@github/items/bb50d84af4d01a2eb5c2)
mysql.h is missing.  please check your installation of mysql and try again.

$ gem install mysql2 -v '0.3.11'

```
Building native extensions.  This could take a while...
ERROR:  Error installing mysql2:
	ERROR: Failed to build gem native extension.

        /usr/local/bin/ruby extconf.rb
checking for rb_thread_blocking_region()... yes
checking for rb_wait_for_single_fd()... yes
checking for mysql.h... no
checking for mysql/mysql.h... no
-----
mysql.h is missing.  please check your installation of mysql and try again.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/usr/local/bin/ruby
	--with-mysql-config
	--without-mysql-config


Gem files will remain installed in /var/www/pokeme_stage/shared/bundle/ruby/1.9.1/gems/mysql2-0.3.11 for inspection.
Results logged to /var/www/pokeme_stage/shared/bundle/ruby/1.9.1/gems/mysql2-0.3.11/ext/mysql2/gem_make.out
```

mysql.h is missing.とな。どうやら、mysql-develというのが必要らしい。

```shell-session
$ yum instal mysql-devel --enablerepo=remi
```

そのあとに再度、gem installしたら、成功した。
[tmux] 256色を使用可能にするのにハマった

tmuxとtmux上で動いているプロセス両方が256色で動いてないと意図した動きにならない

```bash
echo 'set-option -g default-terminal "screen-256color"' >>~/.tmux.conf
[ "$TERM" = "xterm" ] && export TERM=xterm-256color && tmux
```
gemのインストールが invalid option -H とか言われて失敗した


```none
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

/Users/5t111111/.rbenv/versions/2.1.1/bin/ruby extconf.rb
/Users/5t111111/.rbenv/versions/2.1.1/bin/ruby: invalid option -H  (-h will show valid options) (RuntimeError)

extconf failed, exit code 1

Gem files will remain installed in /Volumes/Data HD/Dev/Ruby/pub/vendor/bundle/ruby/2.1.0/gems/bcrypt-3.1.7 for inspection.
Results logged to /Volumes/Data HD/Dev/Ruby/pub/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0-static/bcrypt-3.1.7/gem_make.out

```

マジでエラーメッセージが意味不明で理由が分かんなくて困りました。


- native extensionsを使うgemでこける?
- Ruby 2.0以降で発生する?
- bundler, rbenv関係ある？

で、原因はここ。

```none
/Volumes/Data HD/Dev/Ruby/pub/vendor/bundle/ruby/2.1.0/gems/
```

パスに空白が入ってたのがダメでした。
空白をなくしたらうまくいきました。
ツナでもわかるmruby [1回目：Hello World]


最近色々と選択肢のあるコンパクトなLinuxボード上でmruby使ったら幸せになれるかなって思ったのがきっかけでmrubyの勉強開始します。

ちなみにタイトルのツナは我が家の猫です。かわいいです。
![ツナ2.jpg](https://qiita-image-store.s3.amazonaws.com/0/13835/903221f8-ba2f-f02f-30b1-11a346c0cc11.jpeg "ツナ2.jpg")


とりあえずの目標は、mrubyでMQTTクライアントを実装することですが、当面は基礎固めを優先してmrubyの機能を一つ一つ学んでいこうと思います。

> MQTTはM2M、IoT分野などで今後ひろがっていくことが想定されるPubSubプロトコルです。メッセージのサイズが小さく、最初からネットワーク品質の悪い場合が有る回線(3G回線など)で使用される事を想定した設計になっています。
[参考: HTTPからMQTTへ](http://it.impressbm.co.jp/articles/-/10773)


## インストール
インストールの方法とかも色々調べて纏めておこうかと思いましたが、こちらにとても解り易く纏めてあったので詳細はスキップで。

[mrubyのビルド方法](http://qiita.com/masuidrive/items/e516c23b4feab73d139f)

なお、mrubyをビルドすると最終的に実行可能バイナリが./bin以下に作られます。僕はこれを /usr/local/mruby/bin にコピーして使用しています。

### ソースコードをダウンロード
mrubyは[軽量Rubyフォーラム](http://forum.mruby.org/download/index.html)から安定板がダウンロードできますが、まだ活発に開発されていますので実際の製品開発にしようする段階までは[github](https://github.com/mruby/mruby)のmasterを追いかけた方がいいと思います。

```
$ git clone https://github.com/mruby/mruby.git
```

###ビルド設定

```
$ cd mruby
```

ビルドの設定ファイルは<code>build_config.rb</code>です。

とりあえず試しているところなので僕は殆どデフォルトのままですが、gemboxの設定を<code>flull-core</code>に変えています。
こうすると<code>./mrbgems</code>にあるライブラリを全て読み込んでくれるようですが、その分ビルドしたバイナリは大きくなるでしょうから使用する環境によって帰る必要が有ると思います。

デフォルトでは<code>default</code>です。当面これで問題ないと思います。

```ruby:build_config.rb
conf.gembox 'default'
```

<code>./mrbgems</code>に置いたライブラリを全て読み込みたい場合は<code>full-core</code>に設定。

```ruby:build_config.rb
conf.gembox 'full-core'
```


###ビルド

```
$ rake
```

###インストール

出来上がったバイナリをパスの通った場所にコピーします。

```
$ mkdir -p /usr/local/mruby/bin
$ cp bin/* /usr/local/mruby/bin/
$ echo "export PATH=/usr/local/mruby/bin:\${PATH}" >> ~/.profile
$ source ~/.profile
```

## とりあえず Hello World
まずは定番のHello Worldしてみます。ファイルにコードは書かずにirbのmruby版であるmirbからやってみます。ターミナルから

```
$ mirb
```
と入力するとmirbの対話シェルが立ち上がります。おもむろに<code>puts "Hello World"</code>してみます。

```ruby:mirb
> puts "Hello World"

Hello World
 => nil
```
おk。でもこれだけじゃ面白くないので、ファイルにコードを書いてコンパイルして実行してみます。
勉強用に適当にディレクトリ作ってそこに移動します。

```
$ mkdir -p mruby-learn/hello_world
$ cd mruby-learn/hello_world
```

Hello Worldでは明らかに必要ないですが、あえてモジュールとクラスを使って書きます。

```ruby:hello_world.rb
module Hello
  class World
    def say!
      puts "hello world"
    end
  end
end

hw = Hello::World.new
hw.say!

```

とりあえずコンパイルせずにそのまま実行。

```
$ mruby hello_world.rb
hello world
```
おkです。続いてコンパイルしてみます。

```
$ mrbc hello_world.rb
$ ls
hello_world.mrb	hello_world.rb
```
拡張子がmrbのファイルができました。
実行する時はmrubyコマンドに"-b"をつけて実行するようです。

```
$ mruby -b hello_world.mrb
hello world
```
おー。次は基本クラスのお勉強しよう。多分だいたいRubyと同じだけど一応。
RubyでArrayどうしを加算して一意にするのをuniqメソッド使わずにやる

Arrayどうしを足し合わせてから `uniq` メソッドを呼び出すような機会はけっこう多いです。

```rb
pry(main)> ([1, 2, 3, 1] + [0, 2, 1, 1]).uniq
=> [1, 2, 3, 0]
```

同じことは `|` でもできます。

```rb
pry(main)> [1, 2, 3, 1] | [0, 2, 1, 1]
=> [1, 2, 3, 0]
```
Viewportの設定めも

これが完璧というわけではないけど、
viewportの設定めも。

```js
  var ua = navigator.userAgent;
  if(/iPhone/.test(ua)) {
    $(window).bind("load orientationchange",function(){
      if(Math.abs(window.orientation) === 90){
        $("body").addClass('wrap');
        $("html").css("zoom" , 1 );
      }else{
        $("body").removeClass('wrap');
        portraitWidth=$(window).width();
        $("html").css("zoom" , portraitWidth/320 );
      }
    });
  } else {
    $(window).bind("load resize", function(event) {
      if (window.innerHeight > window.innerWidth) {
        portraitWidth=$(window).width();
        $("html").css("zoom" , portraitWidth/320 );
        $("body").removeClass('wrap');
      } else {
        $("body").addClass('wrap');
      }
    });
  }
```

.wrapにはwidthとmargin: 0 autoを指定してる。
横にしても画面一杯にならず、端っこ少しあけたいときに使用。

なんでiphoneとAndroidで分岐をしてるのかというと、
windowのサイズ取得したものだとiOS5(←...)でおかしくて、
orientationで分岐させたものだとAndroid4.×系でおかしいのがあったから。

普通はwindowのサイズ取得のみでいいと思う。
ググってみるとだいたいorientationchangeで分岐してるけど、
自分が確認してる機種だとうまくいかず、うーんといったかんじ。
jsようわからん。
LinuxMintでのApache2のDocumentRoot変更

私的メモ。
Ubuntu派生ディストリビューションのLinuxMintでは、CentOSとはapacheの設定ファイルの構成や設置場所が異なって困ったので備忘録です。

参考サイト：http://www10.atwiki.jp/shirayuu/?page=%20apache2

#Confファイルの場所を調べる
まずはwhereisコマンドでパスの通ってる場所を調べます。

```bash
$ whereis apache2
apache2: /usr/sbin/apache2 /etc/apache2 /usr/lib/apache2 /usr/share/apache2 /usr/share/man/man8/apache2.8.gz
```

参考サイトと同じっぽい。

#DocumentRoot の設定
> Document Rootの設定
> ubuntu では、 /etc/apache2/sites-available/default に Document Root の設定が記述されている。

とのことなので、当該ファイルを開く。

```bash
$ vi /etc/apache2/sites-available/default
```

```vim
<VirtualHost *:80>
	ServerAdmin vagrant@localhost

	DocumentRoot /home/vagrant/Share/www #←ここを変更
```

以上で終わりです。

##追記
[UbuntuでApacheを設定する際のハマリどころ](http://d.hatena.ne.jp/uriyuri/20081112/1226497108)
とても詳しくファイル構成が書かれているので、今後困った時に参考になりそうです。
カバリングインデックス

#カバリングインデックス
SQLでデータを取得する時に必要なデータを全て含んでいるインデックスを
カバリングインデックスと呼ぶ

SELECT文でインデックスのカラムだけ取得する場合は、パフォーマンスが向上する

そもそもSELECT * で取得するとパフォーマンスが悪くなる。

できれば必要な行、必要な列のみを取得するのがパフォーマンスにとっては良い

>実践ハイパフォーマンス MySQLより
Subversion - ユーザー作成手順 [ファイル管理]

# 1. はじめに

本記事では、Subversionのユーザーの作成手順について記述しています。
なお、ユーザーの管理方法についてはファイル上での管理とします。

# 2. 前提条件

本記事では、Subversionがインストールされていることが前提になります。
なお、Subversionのインストール手順(CentOS)については下記の記事を参照してください。

http://qiita.com/skinoshita/items/5b57eff01cca68cf4a97

# 3. 作成手順

ユーザーを作成するために、下記のコマンドを実行します。

* Subversionのユーザーは /etc/subversion/conf/authuser.conf で管理しているものと仮定します。

```
$ htpasswd /etc/subversion/conf/authuser.conf (ユーザーID)
```

＊）パスワードの入力を求められるので任意のパスワードを入力してください。
＊）ユーザーを追加する場合は「-c」は不要です。
＊）ユーザーを削除する場合は「-c」ではなく「-D」にしてください。

ユーザーのリポジトリ権限を登録するために、リポジトリ権限を管理しているファイルを開き、下記の内容を追加します。

* Subversionのユーザーのリポジトリ権限は /etc/subversion/conf/authzsvn.conf で管理しているものと仮定します。

```
(ユーザーID) = (参照権限)
```

＊）ユーザーに対して権限を付与しない場合は、「(ユーザーID) = 」と記述します。
＊）ユーザーに対してRead権限のみを付与したい場合は、「(ユーザーID) = r」と記述します。
＊）ユーザーに対してRead/Write権限を付与したい場合は、「(ユーザーID) = rw」と記述します。

(例) ユーザー:user01に対して、リポジトリ:repoのRead/Write権限を付与する場合

```
[repo:/]
user01 = rw
```
Subversion - リポジトリ作成手順

# 1. はじめに

本記事では、Subversionのリポジトリの作成手順について記述しています。

# 2. 前提条件

本記事では、Subversionがインストールされていることが前提になります。
なお、Subversionのインストール手順(CentOS)については下記の記事を参照してください。

http://qiita.com/skinoshita/items/5b57eff01cca68cf4a97

# 3. 作成手順

## (1) リポジトリの作成

リポジトリを作成するために、下記のコマンドを実行します。

```
$ cd (SVNParentPathで指定したパス)
$ svnadmin create (リポジトリ名)
$ chown -R apache:apache (リポジトリ名)
$ chcon -R -t httpd_sys_content_t (リポジトリ名) # SELinuxが有効になっている場合のみ実行する
```

## (2) trunk, branches, tagsの作成

trunk, branches, tagsを作成するために、下記のコマンドを実行します。

```
$ cd /tmp
$ svn co file:///var/svn/(リポジトリ名) (リポジトリ名) --no-auth-cache
$ cd (リポジトリ名)
$ svn mkdir trunk branches tags
$ svn commit -m "First commit" --username admin --password (adminのパスワード) --no-auth-cache
$ svn list file:///var/svn/(リポジトリ名)
$ cd ..
$ rm -rf /tmp/(リポジトリ名)
```
Subversion - インストール手順 [CentOS]

# 1. はじめに

本記事では、CentOSでのSubversionのインストール手順について記述しています。

# 2. 前提条件

下記の環境を前提としています。

対象OS：CentOS 6.5

* 本記事では、[Vagrant Cloud](https://vagrantcloud.com/ "Vagrant Cloud") の[chef/centos-6.5](https://vagrantcloud.com/chef/centos-6.5 "chef/centos-6.5")
を使用しています。

# 3. 導入手順

rootユーザーでログインしていない場合は、下記のコマンドでrootユーザーに切り替えてください。

```
$ su -
```

Subversionをインストールするために、下記のコマンドを実行します。

```
$ yum -y update
$ yum install -y httpd subversion mod_dav_svn
$ chkconfig httpd on
$ mkdir /var/svn
$ mkdir /etc/subversion/conf
$ chown apache:apache /var/svn
$ rm -f /etc/httpd/conf.d/subversion.conf
$ cat << __EOF__ >> /etc/httpd/conf.d/virtualhost-00.conf
<VirtualHost *:80>
  ServerName any
  <Location />
    Order deny,allow
    Deny from all
  </Location>
</VirtualHost>
__EOF__
$ cat << __EOF__ >> /etc/httpd/conf.d/subversion.conf
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

<VirtualHost *:80>
  ServerName (SVNドメイン名)
  <Location />
     DAV svn
     SVNParentPath /var/svn

     AuthType Basic
     AuthName "Authorization Realm"
     AuthUserFile /etc/subversion/conf/authuser.conf
     Require valid-user
     AuthzSVNAccessFile /etc/subversion/conf/authzsvn.conf
  </Location>
</VirtualHost>
__EOF__
```

Subversionのリポジトリを管理するためのadminユーザーを作成するために、下記のコマンドを実行します。

```
$ htpasswd -c /etc/subversion/conf/authuser.conf admin
```

＊）パスワードの入力を求められるので任意のパスワードを入力してください。

adminユーザーに対してSubversionのリポジトリの権限を付与するために、下記のコマンドを実行します。

```
$ cat << __EOF__ >> /etc/subversion/conf/authzsvn.conf
[/]
* = r
admin = rw
__EOF__
```

Apacheを起動します。

```
$ /etc/init.d/httpd start
```

# 4. その他

Subversionのリポジトリビューアが必要な場合、[WebSVN](http://www.websvn.info/ "WebSVN")を使ってください。

インストール手順は下記のとおりです。

* /etc/httpd/conf/httpd.conf の 「NameVirtualHost *:80」の行のコメントアウトは解除しておいてください。

```
$ yum -y install php
$ cd /var/www/html
$ curl -O http://websvn.tigris.org/files/documents/1380/49056/websvn-2.3.3.tar.gz
$ tar xvzf websvn-2.3.3.tar.gz
$ mv websvn-2.3.3 websvn
$ cp websvn/include/distconfig.php websvn/include/config.php
$ chown -R apache:apache websvn
$ cat << __EOF__ >> /etc/httpd/conf.d/websvn.conf
<VirtualHost *:80>
  ServerName (WebSVNドメイン名)
  DocumentRoot /var/www/html/websvn
  <Location />
     Options FollowSymLinks 
     AllowOverride None
     order allow,deny
     allow from all
     AuthType Basic
     AuthName "Authorization Realm"
     AuthUserFile /etc/subversion/conf/authuser.conf
     Require valid-user
  </Location>
</VirtualHost>
__EOF__
```

/var/www/html/websvn/include/config.php に以下の内容を追加します。

```
$config->addRepository('表示用リポジトリ名', 'file:///var/svn/(リポジトリ名)');
```
Ruby installer for Windows を後退させて gem install nokogiri 

2014年5月2日、ruby 2.0.0-p451 / Windows7で gem install nokogiri が失敗しました。私には技術力がないので、どうしても解決できず、前線を撤退することにしました。

いったいどこまでバージョンを戻せば、gem install nokogiri が成功するのだろう？　やってみました。

結論：ruby 2.0.0-p195 まで戻すと成功しました。

[http://rubyinstaller.org/downloads/archives](http://rubyinstaller.org/downloads/archives)
からダウンロードして順番に試してみました。
2.0.0-p451 ×
2.0.0-p353 ×
2.0.0-p195 ○

```text
C:\Ruby200>ruby -v
ruby 2.0.0p195 (2013-05-14) [i386-mingw32]

C:\Ruby200>gem install nokogiri
Fetching: mini_portile-0.5.3.gem (100%)
Successfully installed mini_portile-0.5.3
Fetching: nokogiri-1.6.1-x86-mingw32.gem (100%)
Successfully installed nokogiri-1.6.1-x86-mingw32
Parsing documentation for mini_portile-0.5.3
Installing ri documentation for mini_portile-0.5.3
Parsing documentation for nokogiri-1.6.1-x86-mingw32
unable to convert "\x90" from ASCII-8BIT to UTF-8 for lib/nokogiri/1.9/nokogiri.
so, skipping
unable to convert "\x90" from ASCII-8BIT to UTF-8 for lib/nokogiri/2.0/nokogiri.
so, skipping
Installing ri documentation for nokogiri-1.6.1-x86-mingw32
2 gems installed

C:\Ruby200>gem list

*** LOCAL GEMS ***

bigdecimal (1.2.0)
io-console (0.4.2)
json (1.7.7)
mini_portile (0.5.3)
minitest (4.3.2)
nokogiri (1.6.1 x86-mingw32)
psych (2.0.0)
rake (0.9.6)
rdoc (4.0.0)
test-unit (2.0.0.0)

```

プログラム

```rb:test.rb
require "nokogiri"
doc = Nokogiri::HTML('<ul><li>first</li><li>second</li></ul>')
p doc.xpath("//li")[0].text
p doc.xpath("//li")[1].text
p doc.css("li")[0].text
p doc.css("li")[1].text
```

実行結果

```text
C:>ruby test.rb
"first"
"second"
"first"
"second"
```
ちょっと情けないですが、どうしても今日中にnokogiri動かしたかったので、近道してしまいました。
Smalltalkhubを使う

# 事前準備
* ローカルのSmalltalk環境はSqueak
* [Smalltalkhubサイト](http://smalltalkhub.com/)
* ささっと登録
* create new project
* Monticello registrationを覚えておく

# バージョン管理までの準備
* Squeakに戻る
* Monticello browserを開く
  1. ワールドメニュー
  2. 開く(真ん中あたりにある)
  3. Monticello Browser
* 「+パッケージ」(パッケージ追加的なもの)
* Smalltalkhubで管理したいクラスカテゴリ名を入力
* Smalltalkhubリポジトリと紐付
    1. 「+リポジトリ」(add repository的な)
    2. HTTPを選択
    3. 一瞬Smalltalkhubに戻ってMonticello registrationをコピー
    4. HTTP repositoryの欄に張り付けて、ユーザ名、パスワードを入力(パスワードを生で他人に見られる状態で入力するのでここは一人でやること)

# バージョン管理
* いい感じにいじる
* Monticello Browserでコミットするパッケージを選択して上部分の「保存」
* ![monticello_browser_save.png](https://qiita-image-store.s3.amazonaws.com/0/16748/314e38fb-3e2c-57d1-5393-2b9dddd3c5d9.png)
* コミットメッセージを書いて保存
* ![save.PNG](https://qiita-image-store.s3.amazonaws.com/0/16748/987d0459-2409-9d69-eb99-9a1717ce493d.png)

# Smalltalkhubで確認
* キチンとコミットが反映されていればOK
fuelphpのrestコントローラでログインチェックを行う

## rest controllerでのログインチェック

restコントローラーでログインチェックを行う方法

## controller

以下のようなrestの例があった場合。

```php:fuel/app/classes/api.php
class Controller_Api extends \Fuel\Core\Controller_Rest
{
	public function get_create()
	{
		$name = Input::get('key');
		$this->data['content'] = array('key' => $name);
		return $this->response($this->data, 200);
	}

	public function auth()
	{
		if(Auth::check())
		{
			return true;
		}
		return false;
	}
}
```

## config

config内でauthにrestコントローラーで認証を行わせるメソッドを記述する.

```php:fuel/config/rest.php　(fuel/core/config/rest.php)
	'auth' => 'auth',
```

## 結果

http://example.com/api/create.json?key=hoge

ログインしていない場合
```
{"status":0,"error":"Not Authorized"}
```

ログインしている場合
```
{"content":{"key":"hoge"}}
```
Hashに対して再帰的にsymbolize_keysとかする簡単な方法

情報が少ないのでメモ。

symbolized_keysで検索すると、「[Rails symbolize_keys 再帰的](http://rosylilly.hatenablog.com/entry/2012/02/26/190525)」みたいな記事が出てくるけど、
実はrails4から`deep_symbolize_keys`とか、`deep_merge`とかdeepなんちゃらって便利なメソッドがいくつか実装されてます。

http://api.rubyonrails.org/v4.0.0/classes/Hash.html

便利！

（[googleでdeep_symbolize_keysを検索](https://www.google.co.jp/search?q=deep_symbolize_keys)すると、約1,150件・・・少ない）
シェルスクリプトを並列実行 (mpiexecを利用)


というタイトルだが，やりたいことはシリアルプロセスのシェルスクリプトをたくさん並列したいときに，MPIを使うだけ．

```bash:nodefile1.txt
node1.hoge.jp
```

```bash:nodefile2.txt
node2.hoge.jp
```

のように異なるノード名が一つだけ記述されているノードファイルを用意する．

```bash:batch.sh
#/bin/bash

hostname
```

のようなシェルスクリプトを並列に実行する．

```bash
$ for i in `seq 1 2`
>do
>  mpiexec -recvtimeout 100 -machinefile nodefile$i.txt -np 1 ./batch.sh &
>done
[1] 20904
[2] 20905
$ node1.hoge.jp
node2.hoge.jp
```

のように，並列できる．`-recvtimeout 100` はこれをしないと`mpiexec`に文句言われたから，記述しているが，不要かもしれない．

まぁ，rshなんかと組み合わせればMPIなんて使わなくてもいいんだけど．．．
OkHttpとSSL通信を組み合わせるとSIGSEGVで落ちる


[OkHttp changes the global SSL context, breaks other HTTP clients](https://github.com/square/okhttp/issues/184)

## Workaround

* 全部OkHttpClientで書き換える → 外部ライブラリには不可能
* `URL.setURLStreamHandlerFactory(new OkHttpClient());`  → Apache Http Clientには効かない
* OkHttpClientを使う前に[このコード](https://github.com/square/okhttp/issues/184#issuecomment-18772733)を追加する
* OkHttpを外す

結局手間を考えて最後のオプションを採りました(´・ω・`)

## 追記

[AOSPにバグ登録されてた](https://code.google.com/p/android/issues/detail?id=66562)
【FuelPHP ver1.7.1】URLのindex.phpを取る

#URLのindex.phpを取る
通常のURL: http://example.jp/プロジェクト名/index.php/コントローラ名/アクション名/パラメータ
設定後のURL: http://example.jp/プロジェクト名/コントローラ名/アクション名/パラメータ

設定は下記2点の修正が必要です。
fuel/app/config/config.php
public/.htaccess

##fuel/app/config/config.php
*FuelPHPはver1.7.1です。*
既にFuelPHP側に用意されていて、下記のindex_file部分のコメントを取る。

```PHP
 * Set this to 'index.php if you don't use URL rewriting
 */
- //'index_file' => false,
+ 'index_file' => false,
```

##プロジェクト名/public/.htaccess
既にFuelPHP側に用意されていて、下記のコメントを取る。

```
  #Remove index.php from URL
- #RewriteCond %{HTTP:X-Requested-With}	!^XMLHttpRequest$
- #RewriteCond %{THE_REQUEST}				^[^/]*/index\.php [NC]
- #RewriteRule ^index\.php(.*)$			$1 [R=301,NS,L]

+ RewriteCond %{HTTP:X-Requested-With}	!^XMLHttpRequest$
+ RewriteCond %{THE_REQUEST}				^[^/]*/index\.php [NC]
+ RewriteRule ^index\.php(.*)$			$1 [R=301,NS,L]
```

##各ディレクトリの.htaccessを有効にするためApacheの設定を確認 or 変更する。
/etc/httpd/conf/httpd.conf
AllowOverride をNONEであればALLにする。
ALLにする事でディレクトリ単位で制御するhtaccessが有効になる。

##Apacheを再起動する
service httpd restart

FuelPHP ver1.7.1ではindex.phpを取る設定が既にコメントで用意されているから楽だぁーー
ARC で IMP を使う

ARC で IMP を使うとよく落ちるんですけど、なぜ落ちるかというと、

```objc
typedef id (*IMP)(id, SEL, ...); 
```

IMP はこのように返り値が id 型の関数として定義されていまして、オブジェクト以外の値を返す IMP に対しても問答無用で retain してしまい、結果落ちるというわです。

適切にキャストしてやればよいのですが、ただのキャストではだめで __bridge を使って「retain するな」ということを明示しなければなりません。

```objc
NSInteger result=(NSInteger)(__bridge void*)imp(self, _cmd);
```
このコードはめでたく落ちないんですけど、返り値が id 型より大きい double や NSRect なんかだとこういう風にキャストできない。

じゃあどうすればいいか。受け取った id の型をキャストするのではなく、関数定義そのものをキャストしてしまおうというのが今回のポイントです。

```objc
NSRect result=((NSRect(*)(id, SEL, ...))imp)(slf, sel);
```

こうやって「お前は IMP じゃない、 NSRect を返す関数なんだ」と言い聞かせることによってコンパイルを通し、正常に動作するコードになりました。しかしこれ括弧の量が尋常ではないです。わけが分かりません。もっとすっきり書きたい。そこで登場するのが __共用体__ です。

共用体、またの名を union。C 言語を学び始めたごく初期に構造体と共に登場する概念。仕組みは理解できても使いどころが思いつかず、引き出しの奥にしまい込まれる可哀想な存在。共用体の出番がついにやってきました。

```c
typedef union KZRIMPUnion {
    IMP as_id;
    void (*as_void)(id, SEL, ...);
    void* (*as_pointer)(id, SEL, ...);
    
    char (*as_char)(id, SEL, ...);
    int (*as_int)(id, SEL, ...);
    long long (*as_long_long)(id, SEL, ...);
    double (*as_double)(id, SEL, ...);
    
    CGFloat (*as_float)(id, SEL, ...);
    CGRect (*as_rect)(id, SEL, ...);
    CGSize (*as_size)(id, SEL, ...);
    CGPoint (*as_point)(id, SEL, ...);
    NSRange (*as_range)(id, SEL, ...);
} KZRIMPUnion;
```
これが私の C 言語史上はじめて自分で定義した共用体です。これに IMP を入れて様々な形式で取り出そうという作戦です。これを使うと、

```objc
KZRIMPUnion impUnion;
impUnion.as_id = imp;
NSRect result=impUnion.as_rect(slf, sel);
```
なんと、こんなにすっきり記述できます。一切キャストする必要がないのです。共用体ってすばらしい。

- - -

ちなみにこれを利用して Method Swizzling ライブラリを作りました。Block を使い定義とコードをすべて1箇所に集約できる超イケてるライブラリです。  
[hetima/KZRMethodSwizzling](https://github.com/hetima/KZRMethodSwizzling)
cocos2d-js の開発を bower を使って開始する

ドキュメントルートをカレントディレクトリとする．

### 動作までの手順

bower init または bower.json を最低限下記のように記述しておく．名前はなんでもいい．

```json
{
  "name": "MyApplication"
}
```

bower.json が生成されたら下記のように cocos2-js (cocos2d-html?) のパッケージを取ってくる．ここでは v2.2.3 を使う．

```bash
$ bower install --save cocos2d-html5#Cocos2d-html5-v2.2.3
bower cocos2d-html5#Cocos2d-html5-v2.2.3           cached git://github.com/cocos2d/cocos2d-html5.git#Cocos2d-html5-v2.2.3
bower cocos2d-html5#Cocos2d-html5-v2.2.3         validate Cocos2d-html5-v2.2.3 against git://github.com/cocos2d/cocos2d-html5.git#Cocos2d-html5-v2.2.3
bower cocos2d-html5#Cocos2d-html5-v2.2.3          install cocos2d-html5#Cocos2d-html5-v2.2.3

cocos2d-html5#Cocos2d-html5-v2.2.3 bower_components/cocos2d-html5
```

とりあえず動くことを確認するためにテンプレートをドキュメントルートに取ってくる．

```bash
$ cp -R bower_components/cocos2d-html5/template/* .
```

この時点で下記のようなディレクトリ構成になってるはず．

cocos2d-jsb.js は必要ないし build.xml も必要ない人にとっては必要ないので削除してても良い．

```bash

$ tree -L 1
.
├── bower_components
├── bower.json
├── build.xml
├── cocos2d.js
├── cocos2d-jsb.js
├── index.html
├── main.js
├── res
└── src

3 directories, 6 files
```

現在の自分の環境に合わせて下記のようにファイルを変更．

```diff
diff --git a/cocos2d.js b/cocos2d.js
index c2daa8d..344ebf6 100644
--- a/cocos2d.js
+++ b/cocos2d.js
@@ -35,7 +35,7 @@
         frameRate:60,
         renderMode:0,       //Choose of RenderMode: 0(default), 1(Canvas only), 2(WebGL only)
         tag:'gameCanvas', //the dom element to run cocos2d on
-        engineDir:'../cocos2d/',
+        engineDir:'bower_components/cocos2d-html5/cocos2d/',
         //SingleEngineFile:'',
         appFiles:[
             'src/resource.js',
```

ブラウザで見に行くと下記のように表示されているはず．

![screenshot 2014-05-02 20.44.38.png](https://qiita-image-store.s3.amazonaws.com/0/6975/f7281767-679a-98b5-d3da-11ee99b173ad.png)

あとはいろいろ書き換えて自分のコードを書いてゆく．

以上．

### js ファイルのロードについてメモ

bower_components/cocos2d-html5/cocos2d/jsLoader.js ではおおまかに下記のようにファイルをロードするようになっている．

- cocos2d-js のファイル群
- document.ccConfig.appFiles のファイル群
- main.js （決め打ち）

main.js は決め打ちなので最初に読み込む html ファイルと同じディレクトリに配置する必要があり，名前も変更できない．
SVNで特定のファイルを無視する


例えば、カレントディレクトリの Library, Temp ディレクトリ及び、 *.csproj, *.sln, *.userprefs を無する場合、以下のコマンドでエディタを起動

```
svn propedit svn:ignore .
```

エディタが立ち上がったら以下のように記述

```
Library
Temp
*.csproj
*.sln
*.userprefs
```

無視の設定を確認

```
svn proplist -v
```
【解決しました】RedmineのMarkdownで「_」アンダースコアが消える




以下、解決しました。






***

Redmineの2.5をインストールすると、テキストの書式でMarkdownが使えるようになる。ただし、すべてのプロジェクトで書式がMarkdownになる。wikiだけとかできない。

Markdownになれるため導入。

```
file_name_underscore
```

みたいな文字をチケットに書くと、


file<i>n</i>ame<i>u</i>nderscore

みたいに「_」アンダースコアが消える。


エスケープが必要なのか。
http://daringfireball.net/projects/markdown/syntax


気軽に使えない。

終了。

Textileに戻した。


## 解決方法

イタリックにしないようにfotmatter.rbにno_intra_emphasisを追加します。

lib / redmine / wiki_formatting / markdown / formatter.rb

```formatter.rb
:no_intra_emphasis => true

```


![takeo_—_root_redmine__var_lib_redmine_—_ssh_—_134×22.png](https://qiita-image-store.s3.amazonaws.com/0/41550/a21cdbec-a875-75aa-d126-24e8b653b0d7.png "takeo_—_root_redmine__var_lib_redmine_—_ssh_—_134×22.png")

これはredmineのソースにも追加されているので次？の2.5.2には搭載されそうです。

http://www.redmine.org/projects/redmine/repository/entry/trunk/lib/redmine/wiki_formatting/markdown/formatter.rb

これでmarkdownを実践できます。

完
rieceのFormulaを作成しました


```ruby:riece.rb
require 'formula'

class Riece < Formula
  homepage "http://www.nongnu.org/riece/"
  url "http://public.p-knowledge.co.jp/Savannah-nongnu-mirror//riece/riece-8.0.0.tar.gz"
  sha1 "051ed515b2174c0803085a4538f238a7c2248751"

  depends_on "emacs"

  def install
    system "./configure", "--prefix=#{prefix}", "--with-emacs=/usr/local/bin/emacs"
    system "make install"
  end
end
```

同様にEmacs LispパッケージのFormulaを作成したいと思った方は、[Emacs LispパッケージのFormulaをつくるときの注意](http://qiita.com/h12o@github/items/df6f7beded0da0a065f3)もご覧ください。
mewのFormulaを作成しました


```ruby:mew.rb
require 'formula'

class Mew < Formula
  homepage "http://www.mew.org/"
  url "http://www.mew.org/Release/mew-6.6.tar.gz"
  sha1 "3ba1bac6ed9a7a6a85d61b5946418914912063f3"
  head "http://github.com/kazu-yamamoto/Mew.git"

  depends_on "emacs"

  def install
    system "./configure", "--prefix=#{prefix}", "--with-emacs=/usr/local/bin/emacs"
    system "make install"
  end
end
```

同様にEmacs LispパッケージのFormulaを作成したいと思った方は、[Emacs LispパッケージのFormulaをつくるときの注意](http://qiita.com/h12o@github/items/df6f7beded0da0a065f3)もご覧ください。
Emacs LispパッケージのFormulaをつくるときの注意

Emacs LispパッケージのFormulaをつくるとき、`depends_on "emacs"`の他
`system "./configure", "--prefix=#{prefix}", "--with-emacs=/usr/local/bin/emacs"`の
`"--with-emacs=/usr/local/bin/emacs"`を忘れないようにしましょう。

```ruby:example.rb
require 'formula'

class Example < Formula
  # ...
  depends_on "emacs"
  # ...
  def install
    system "./configure", "--prefix=#{prefix}", "--with-emacs=/usr/local/bin/emacs"
    # ...
  end
  # ...
end
```

忘れてしまうと、/usr/bin/emacs、すなわち以前のバージョンのEmacsでバイトコンパイルされます。

たいていのEmacs Lispパッケージでは問題が露見しないのですが、Mew-6.6で問題が発生しました。

Mew-6.6で登場した`mew-called-interactively-p`は、`(>= emacs-major-version 24)`のときにマクロで、それ以外のときにエイリアスで実装されているのですが、バイトコンパイルされるとこの箇所がEmacs 24（Homebrewのemacs）に合ったコードとしてではなくEmacs 22に合ったコードとしてコンパイルされてしまいます。

```el:mew-env.el
;;; ...
(cond 
 ((>= emacs-major-version 24)
  ;; this must be macro. If implemented as a function, its behavior
  ;; is changed.
  (defmacro mew-called-interactively-p ()
    '(called-interactively-p 'interactive)))
 (t
  (defalias 'mew-called-interactively-p 'called-interactively-p)))
;;; ...
```
Load AverageとCPU Utilizationの違い

リソースモニタなどでCPUをモニタリングする指標として、Load AverageとCPU Utilization(使用率)がありますが、
それぞれどういう意味か曖昧になっていたので調べてみました。

* Load Averageは実行キューのプロセス数とI/Oなどでシグナル受信不可(uninterruptible)のプロセス数の合計
 * BSD系のカーネルはuninterruptibleなプロセスは含まないらしい
* `/proc/loadavg`から1,5,15分の平均プロセス数が取得できる
* この数がCPUのコア数より多いと、実行中なのにCPU時間が割り当てられていないプロセスが存在する→パフォーマンス低下
* CPU使用率が100%未満でも、I/O待ちのプロセスが多いとLoad Averageが上がる
* 同じCPU使用率100%でも、コア数が違うとかかっている負荷が違う。Load Averageはコア数が違っても同じ値を示すので、より直接的に負荷の量を表す。

## 参考
http://stackoverflow.com/questions/21617500/understanding-load-average-vs-cpu-usage
http://en.wikipedia.org/wiki/Load_(computing)#Unix-style_load_calculation
Rails MiniTestでCSVファイルを返すControllerをテストしたい

# Rails MiniTestでCSVファイルを返すControllerをテストしたい

CSVデータファイルを返すControllerがあり、
そのCSVデータの中身を次のようにテストしました。

Controller側

```rb
def create_csv
  <略>
  respond_to do |format|
    format.csv {
      send_data records.to_csv, :type => 'text/csv', :filename => 'test.csv'
    return
    }
  end
end
```

TestCode側
（次の例では各行が'数字,数字,数字'になっていることを確認）

```rb 
describe "create_csv" do
  it "return csv file" do
    get :create_csv
    response.body.each_line |line| do
      assert_match /\d,\d,\d/, line
    end
  end
end
```
Office 製品でネットワーク図などを書くときの便利ワザ


## 背景

仕事柄、ネットワーク図を書くことが多いのですが、ネットワーク専用のツールを使えば、簡単に綺麗に描けると思うのですが、やはり Office 製品上で描いている人も多いのではないでしょうか。

ちょっとだけ工夫することで、ネットワークの作成や変更が簡単にできる便利ワザをご紹介します。

## 端末の追加や位置の変更が面倒

たとえば、こんなネットワーク図が描きたい場合を想定します。
![network.png](https://qiita-image-store.s3.amazonaws.com/0/31521/1e297b78-12b4-da2e-1b35-341a75e59942.png)

でも、端末の位置の変更するたびに、線を引き直したり、隙間を調整したり、いろいろと面倒です。
![normal-line.gif](https://qiita-image-store.s3.amazonaws.com/0/31521/b1fbe937-7a47-34b9-8dcd-e36e11978559.gif)

「カギ線コネクタ」を使って端末間を接続したとしても、微妙な調整が必要だったりします。
![kagi-line.gif](https://qiita-image-store.s3.amazonaws.com/0/31521/e182ed6d-5467-8ec2-d173-c4f7ee47863a.gif)


## 便利ワザ

ちょっと工夫をするだけで、こんなに簡単に編集することができるようになります。
![waza.gif](https://qiita-image-store.s3.amazonaws.com/0/31521/565c3f43-e2dd-7afc-8ce4-f32768750194.gif)

## 手順

1. ネットワークを表す「直線オブジェクト」を配置します。
2. 接続用のオブジェクトを上記の「直線オブジェクト」の中心に配置します。
3. 各端末は、接続用のそのオブジェクトと「カギ線コネクタ」で接続します。
![tane.gif](https://qiita-image-store.s3.amazonaws.com/0/31521/ad08b557-af6a-09d5-5f27-ec92c75100a2.gif)

接続用の小さなオブジェクトは、目立たない色にしておけばバッチリ。

たったこれだけで、簡単に端末の追加や位置の変更をすることができるようになりますね。
Mac OSX Mavericksにpercolをインストール


ググってやってみたけど、はいんない。。。

```
# brew install python // 事前にインスコしてた
% pip install percol
Downloading/unpacking percol
  Could not find any downloads that satisfy the requirement percol
  Some externally hosted files were ignored (use --allow-external percol to allow).
Cleaning up...
No distributions at all found for percol
Storing debug log for failure in /Users/j138/.pip/pip.log
```

--allow-externalつけろってこと？とりあえず、つけてみる

```
% pip install --allow-external percol
You must give at least one requirement to install (see "pip help install")
```

また怒られた。。。。
調べたら、これでいけるっぽい

```
% pip install percol --allow-external percol --allow-unverified percol
pip install --allow-external --allow-unverified percol
Downloading/unpacking percol
  percol an externally hosted file and may be unreliable
  percol is potentially insecure and unverifiable.
  Downloading master (unknown size): 25kB downloaded
  Running setup.py (path:/private/var/folders/04/xxxxxxx/T/pip_build_ j138/percol/setup.py) egg_info for package percol

Installing collected packages: percol
  Running setup.py install for percol
    changing mode of build/scripts-2.7/percol from 644 to 755

    changing mode of /usr/local/bin/percol to 755
Successfully installed percol
Cleaning up...

```

動いた！yay

```
% percol
                                    __
        ____  ___  ______________  / /
       / __ \/ _ \/ ___/ ___/ __ \/ /
      / /_/ /  __/ /  / /__/ /_/ / /
     / .___/\___/_/   \___/\____/_/
    /_/
                                 0.0.5

You did not give any inputs to percol. Check following typical usages and try again.

(1) Giving a filename,

 $ percol /var/log/syslog

(2) or specifying a redirection.

 $ ps aux | percol
```

組み合わせて使うと便利らしいのでいちお、migemoもいれとく

```
% brew install cmigemo
```
リモートホストのGUIアプリ起動

psexec に　-i オプションをつけるとリモートホストのGUIアプリを実行できました。
GUIアプリは起動できないのかと思っていたので嬉しい。
ex.)
　PsExec.exe -i -u uuu -p ppp \\\\192.aaa.bbb.ccc notepad.exe
AirMac Utility over SSH


OSX のローカル if に適当なエイリアスをはる

```bash
% sudo ifconfig lo0 alias 192.168.0.10 255.255.255.0
```

エイリアスに AirMac のあるネットワークへの SSH トンネリングわりあてる

```bash
% sudo ssh ${USERNAME}@${HOSTNAME} -f -N -L 192.168.0.10:5009:${AIRMAC_ADDRESS}:5009
```

AirMac ユーティリティ起動して Shift + CMD + O （その他を構成）からエイリアスのアドレス指定して設定
SSH Tips


ssh まわりのメモ

# ログイン可能ユーザの限定

```
AllowUsers hoge
```
 

# Tunneling 時の Broken Pips 防止

```bash
# Client::~/.ssh/config
ServerAliveInterval 120

# Server::/etc/ssh/sshd_config
ClientAliveInterval 60
```

# known_hosts の警告を無視

```bash
% ssh hogehoge.com -o "StrictHostKeyChecking no"
```

# 踏み台先の LAN 内ホストへ多段接続

```
ssh -l ${USER} -L ${LOCAL_PORT}:${TARGET_HOST}:${TARGET_PORT} ${RELAY_HOST}
```
PL2303 Serial to USB Driver インストール on OSX


添付ファイルに kext あり

```bash
$ download and extract
$ cd /path/to/osx-pl2303.kext
$ sudo cp -R osx-pl2303.kext /System/Library/Extensions/
$ next you need to fix permissions and execute bits:
$ cd /System/Library/Extensions
$ sudo chmod -R 755 osx-pl2303.kext
$ sudo chown -R root:wheel osx-pl2303.kext
$ cd /System/Library/Extensions
$ sudo kextload ./osx-pl2303.kext
$ sudo kextcache -system-cache
```

thanks http://www.xbsd.nl/2011/07/pl2303-serial-usb-on-osx-lion.html

```
% ls /dev/tty.*
/dev/tty.Bluetooth-Modem  /dev/tty.Bluetooth-PDA-Sync  /dev/tty.PL2303-000012FD
```
Postfix Tips


ちょっとした設定とか

# Relay する

```bash
% sudo vi /etc/postfix/main.cf
 
relayhost = [smtp.my.server]
 
% cd /etc/postfix
% sudo postmap transport
```

Postfix は /etc/hosts を参照しないので、内部 DNS がない場合は IP を指定する

Relay 先で受け入れる設定を施しておく必要有り。Postfix なら以下がポイント

- mynetworks を定義しておく
- mydestination に $mydomain を入れる
- inet_interfaces = all にしておく（CentOS 6.x だとデフォルトは local のみ LISTEN っぽい）

http://www.postfix-jp.info/trans-2.3/jhtml/BASIC_CONFIGURATION_README.html

# smtp.gmail.com と連携する

MTA が Postfix になってるか確認しておく 

```bash
% alternatives --config mta
```

smtp.gmail.com の Root CA をダウンロードして配置

```bash
% get https://www.thawte.com/roots/thawte_Premium_Server_CA.pem
% sudo mv thawte_Premium_Server_CA.pem /etc/pki/tls/certs/
```

設定追加

```bash
% sudo vi  /etc/postfix/main.cf
 
myhostname = // FQDN
mydomain = // DOMAIN_NAME
myorigin = $mydomain
 
relayhost = [smtp.gmail.com]:587
 
 
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
 
 
smtp_tls_CApath = /etc/pki/tls/certs/thawte_Premium_Server_CA.pem
```

/etc/postfix/sasl_passwdを作成してハッシュ化

```bash
% cat /etc/postfix/sasl_passwd
[smtp.gmail.com]:587 username@gmail.com:password
 
% sudo chown root:root /etc/postfix/sasl_passwd
% sudo chmod 600 /etc/postfix/sasl_passwd
 
% postmap /etc/postfix/sasl_passwd
```

起動

```bash
% sudo service postfix start
```

mail コマンドでテストとか。mailx パッケージにある。

## SASL authentication failed; cannot authenticate ...

```
SASL authentication failed; cannot authenticate to server smtp.gmail.com[XXX.XXX.XXX.XXX]: no mechanism available
```

パッケージを確認

```bash
% sudo yum install cyrus-sasl-plain
```

## From 書き換え

リレーに使う Gmail の「設定」→「アカウント」から「メールアドレスを追加」で設定しておいたアドレスのみ上書きで送信可能

http://d.hatena.ne.jp/ayokoyama/20061207/p1
NEC IX2105 設定


http://jpn.nec.com/univerge/ix/Info/ix2105.html

# 接続

ロールオーバーケーブルを USB に変換して OSX に接続。
screen で /dev/tty.* な USB-Serial を指定して接続。

```bash
% screen /dev/tty.PL2303-000012FD 9600
```

# CLI モードへの切り替え

工場出荷時は Web 設定モードなので CLI 設定モードになるよう切り替える 

```bash
Router# enable-config
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)# erase startup-config
Are you sure you want to erase the startup-configuration? (Yes or [No]): y
Router(config)#
Router(config)# exit
Router# default-console command-line
% You must RELOAD the router for this configuration to take effect. 
```

再起動して状態確認
Web モードの場合は show version の最後に Default console is web. と出る。

```bash
Router# reload
% Warning: current running-configuration is not saved yet.
Notice: The router will be RELOADED. This is to ensure that
        the peripheral devices are properly initialized.
Are you sure you want to reload the router? (Yes or [No]): y
 
......
 
Router# show version
NEC Portable Internetwork Core Operating System Software
IX Series IX2105 (magellan-sec) Software, Version 8.9.17, RELEASE SOFTWARE
Compiled Jan 11-Fri-2013 14:20:37 JST #2 by sw-build, coregen-8.9(17)
 
......
 
512K bytes of non-volatile configuration memory.
16384K bytes of processor board System flash (Read/Write)
```

# ユーザ追加

セキュリティのため最低でも Administrator 権限ユーザを1つ追加する。

```bash
Router(config)# username XXXXXX password plain 1 XXXXXX administrator
% User 'XXXXXX' has been added.
 
Router(config)# show running-config
```

設定を保存して再起動

```bash
Router(config)# write memory
Building configuration...
% Warning: do NOT enter CNTL/Z while saving to avoid config corruption.
Router(config)# 
Router# reload
```

# 日付・時刻設定

デフォルトですでに良い感じでセットされていたので割愛

```bash
Router(config)# show clock
Wednesday, 27 February 2013 01:01:28 +09 00
```

# ホスト名変更

複数台買う状況にはならなさそうなので機種名にした。

```bash
Router(config)# hostname IX2105
IX2105(config)#
```

# SSH Server たちあげ

```bash
IX2105(config)# interface GigaEthernet1.0
IX2105(config-GigaEthernet1.0)# ip address XXX.XXX.XXX.XXX/24
IX2105(config-GigaEthernet1.0)# no shutdown
IX2105(config-GigaEthernet1.0)# show ip address 
Interface GigaEthernet1.0 is up, line protocol is up
  Internet address is XXX.XXX.XXX.XXX/24
  Broadcast address is 255.255.255.255
  Address determined by config
 
IX2105(config-GigaEthernet1.0)# exit
IX2105(config)# pki private-key generate rsa 
Generating RSA private key ..............
IX2105(config)# pki private-key export pem rsa crypto XXXXX
 
....
 
IX2105(config)# ssh-server ip enable
```

鍵を画面からコピってログインこころみる。

```bash
% ssh -i PRIVATEKEY hoge@XXX.XXX.XXX.XXX
```
VirtualHost での mod_rewrite


wordpress 動かしてるサーバで次のように書いてみたら動かなかった。
ログを見るに RewriteCond がうまくマッチしてくれない。

```
<VirtualHost *:80>
    DocumentRoot /var/www/wordpress
    DirectoryIndex index.php
    Options -Indexes
 
 
    <IfModule mod_rewrite.c>
        RewriteEngine On
        #RewriteLog /tmp/rewrite.log
        #RewriteLogLevel 9
        RewriteRule ^index\.php$ - [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /index.php [L]
    </IfModule>
</VirtualHost>
```

ただしくはこう書き直せば良い。

```
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
```

# 追記

このようなカタチのほうがポピュラーらしい。
ngyuki さん、ありがとうございます。

```
<VirtualHost *:80>
    DocumentRoot /var/www/wordpress
    DirectoryIndex index.php
    Options -Indexes

    <Directory /var/www/wordpress>
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteRule ^index\.php$ - [L]
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule . index.php [L]
        </IfModule>
    </Directory>
</VirtualHost>
```
Intel 8086 マシン語


はじめて読む8086 ノート

## 基本

| コマンド | 書式 | 機能 |
|---|---|---|
| Assemble	| A [アドレス] | ニーモニック入力モードへ。入力はアセンブリに変換され指定アドレス以後のメモリに挿入。|
| Dump	| D [アドレス1] [アドレス2]	| アドレス1からアドレス2の内容を16進ダンプとキャラクタコードで出力 |
| Enter	 | E [アドレス] [リスト] |	アドレスからはじまるリストの内容をリストで指定する値に置換 |
| Go | G [=アドレス1] [アドレス2] | アドレス1からアドレス2までのプログラム実行 |
| Name	| N ファイル名 |	 マシン語プログラムの名前を指定 |
| Quit	| Q	| 終了 |
| Register	| R [レジスタ名]	 | 全レジスタ内容と IP の示す命令を表示。レジスタ名指定でそのレジスタ値を変更できる。|
| Trace	 | T [=アドレス] [命令数] | 基本は R と一緒だが IP の命令を実行すると共に進める。|
| Unassemble | U [アドレス1] [アドレス2] | アドレス1からアドレス2までの内容を逆アセンブル |
| Write |  W | マシン語プログラムを BX と CX で指定した分だけ書き出す |


## データ転送命令

```
MOV (受け取る側) (渡す側)
```

メモリからレジスタへ渡すとき「ストア」と呼び、レジスタからメモリに渡すとき「ロード」と呼ぶ。
渡す側の内容が消える訳ではないので、*nix の mv とは違う（むしろ cp）

(NOTE) アセンブリではオペランドが英数字で始まるとき、ラベルと区別するために 0 を先頭につけなければならないが `DEBUG` での入力時はつけなくていい

ロードの場合、アドレスを [] で囲んで受け取り先を指定する（ポインタと同じ感覚というかポインタそのもの）
たとえば以下のコードを打ち込んで Trace してみる。

```
// オフセットアドレス 0200 から 11 22 33 44 55 ... を入れたとする 
MOV AX,[0200]
```

すると、AX レジスタには「22 11」が入る。
これは 0200 から読み込まれた内容が下位バイトから順に格納されるから。

~~つまり、まず AL レジスタに 11 が入り、次に AH レジスタに 22 が入る。その結果「22 11」になる。~~ → 8086 は 16bit プロセッサなので AL, AH への読み込みは同時に行われる。

このようにバイトがクロスして入るのが 8086 系の特徴。
逆を考えてみると、今度も下位バイトから書き出される。

```
// AX には 22 11 が入っている
MOV [0300],AX
```


よって 0300 の位置にあるデータの並びは「11 22」となる。

また、同様のことがオペランドについてもいえる。
つまり、0300 というアドレスを指定した場合、メモリ上では 00 03 というカタチで格納されていて、これがアドレス用のレジスタに読み込まれる。 

1ワードのデータがメモリに格納されるとき、上位と下位は逆に保存されている。
これは下位レジスタに読み込まれたあとに上位レジスタへとデータが読み込まれるため。
端的に言えばメモリは左から先・レジスタは右から先

メモリ（00 03） → レジスタ（AH AL = 00）→ レジスタ（AH = 03 AL = 00）