OmniAICreator/Qiita-1.07M huggingface dataset:
Amon2をCGIアクセスとして動かす


日頃 Amon2 を便利に使わせてもらっています。
カスタマイズもしやすくてとても気に入っていますが PSGI 前提なので CGI でも同じコードを使いたい時のためのメモ。

# 想定している環境

+ Webサーバとして Apache が動いていて、ドキュメントルートなど諸々の設定はそちらでやる。
+ mod_rewrite が使用できる。
+ .htaccess の設置が可能。(PSGIと同一URLを使いたい場合)
+ amon2 アプリの設置場所は $ENV{DOCMENT_ROOT}/myapp/ と仮定
+ amon2 ver 6.11


# 手順

## amon2 でアプリをセットアップ。

```
% cd $ENV{DOCUMENT_ROOT}
% amon2-setup.pl myapp
...
% cd myapp
% carton install
```

## .cgi ファイルを設置

以下の内容を myapp/app.cgi として保存し、Apache での実行パーミッションを立てる。

- ファイル名はapp.cgiじゃなくてもOK。(その場合は.htaccess設置時に適宜読み替える)
- speedy 用のif-elseは本質ではないので、邪魔な場合は else の中だけのこして削ってOK。

```perl:myapp/app.cgi
#!/bin/sh

PATH=$PATH:/bin:/usr/bin:/usr/local/bin

if [ "$USE_SPEEDY" != "" ]; then
    exec speedy -x "$0" "${1+$@}" -- -t60 -r200 -g$USE_SPEEDY -M60
else
    exec perl -x "$0" "${1+$@}"
fi

#!perl
use strict;
use warnings;
use lib qw(lib local/lib/perl5);
use Plack::Util;
use Plack::Loader;

my $app = Plack::Util::Load_psgi("script/myapp-server");
Plack::Loader->auto->run($app);
```

## .htaccess を設置

以下の内容を myapp/.htaccess として保存。


```:myapp/.htaccess
DirectoryIndex app.cgi

RewriteEngine  On
RewriteBase /myapp

RewriteCond   %{REQUEST_FILENAME}    !app\.cgi
RewriteRule   ^(.+)                  app.cgi/$1
```

ブラウザから /myapp/${path_info} へアクセスすると、PSGI 起動の時と同じ path_info でアクセスできるようになる。

※ .htaccess の内容は、サーバの環境とかポリシーとかに合わせて適宜変更。


# 背景

昨今はPSGI主流なのかもしれませんが、port番号だったり、プロセスの監視設定だったりとサーバ管理者との調整も必要になります。

それができる場合ばかりではないので、サーバ側の都合に左右されず開発を進められるようになっていると便利です。
pkg−configでHomebrewのkeg-onlyなライブラリを認識させるには

# 背景

システム標準のライブラリとの衝突を避ける為に、HomebrewではOSXに標準で入っているライブラリは/usr/local/lib等へインストールしない。

その為、./configureなソースをビルドする際に、configureにOSX標準のライブラリを認識され、バージョンが古いからNGを食らったりする。

# 回避方法

PKG_CONFIG_PATHに.pcファイルの格納されたフォルダを指定する。

## 例

openssl

mdfindなどで以下のように.pcファイルを指定して、Homebrewで入れた格納されてるフォルダを見つける。

```
mdfine -name openssl.pc|grep /usr/local/Cellar
```

```
export PKG_CONFIG_PATH=/usr/local/Cellar/openssl/1.0.2/lib/pkgconfig
```

# 関連投稿

- [Homebrewとpossibly undefined macro: AM_PATH_XML2とHTTP/2 - Qiita](https://qiita.com/kjunichi/items/2c50e293ad3c740b258a#_reference-b666a3f599d08ca50172)
CircleCIでmecab-pythonをインストールする

# 背景
過去に[CentOS](http://qiita.com/saicologic/items/ab70e14f7e2ec2ee0b4d),[OSX](http://qiita.com/saicologic/items/03019c6b686333806062)でmecab-pythonのインストールのチャレンジをしてうまく行った。
しかし、今回はCircleCI。CircleCIはUbuntu上で動くため、やっぱり環境が違うとうまく動きませんでした。キモは、標準でインストールされているmecabパッケージを消してソースからインストールすることです。mecabパッケージを入れたまま、mecab-pythonのbuildをするとコンパイルできずに失敗します。

# 設定手順
## インストールスクリプト

```
$ vi install_mecab.sh
```

install_mecab.sh

```
#!/bin/bash

# Remove mecab
sudo apt-get remove mecab

# Install mecab
cd /var/tmp
curl -O https://mecab.googlecode.com/files/mecab-0.996.tar.gz
tar zxfv mecab-0.996.tar.gz
cd mecab-0.996
./configure
make
sudo make install

# load mecab.so
sudo sh -c "echo '/usr/local/lib' >> /etc/ld.so.conf"
sudo ldconfig

# Install mecab-ipadic
cd /var/tmp
curl -O https://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8
make
sudo make install

# Install mecab-python
pip install https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz
```

## CircleCIの設定

circle.yml

```
dependencies:
  override:
    - bash ./install_mecab.sh
```


## おまけ

pipのrequirements.txtを使ってmecab-pythonをインストールする場合

requirements.txt

```
https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz
```

※ 通常は、`requests==2.3.0`等と記入するところを、tar.gz指定できます。

circle.yml

```
dependencies:
  override:
    - pip install -r ./requirements.txt
```
MacOSXのVPN接続をコマンドラインから実行する


下記をbashrcとかに書く
"ここをVPN名にする"をMacのシステム設定から追加したVPN名にする。

```
function vpn-connect {
/usr/bin/env osascript <<-EOF
tell application "System Events"
        tell current location of network preferences
                set VPN to service "ここをVPN名にする" -- your VPN name here
                if exists VPN then connect VPN
                repeat while (current configuration of VPN is not connected)
                    delay 1
                end repeat
        end tell
end tell
EOF
}

function vpn-disconnect {
/usr/bin/env osascript <<-EOF
tell application "System Events"
        tell current location of network preferences
                set VPN to service "ここをVPN名にする" -- your VPN name here
                if exists VPN then disconnect VPN
        end tell
end tell
return
EOF
}
```

ついかしたら、source ~/.bashrcなどとして設定をリロードする。
特定の文字で区切られたデータを整列して表示する

```column``` コマンドを使用するとCSVやTSVなどの特定の文字で区切られたデータを整列して表示する事ができる。

例としてスペースで区切られた九九の表を考える。
途中で結果の桁数が変わるので見にくい。

```bash
$ MUL=$(for i in `seq 1 9`; do for j in `seq 1 9`; do printf "$(($i * $j)) "; done; echo; done)
$ echo "$MUL"
1 2 3 4 5 6 7 8 9 
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36 
5 10 15 20 25 30 35 40 45 
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81 
```

```column -t``` にパイプで渡してやると整列して見やすい形に整形してくれる。

```bash
$ echo "$MUL" | column -t
1  2   3   4   5   6   7   8   9
2  4   6   8   10  12  14  16  18
3  6   9   12  15  18  21  24  27
4  8   12  16  20  24  28  32  36
5  10  15  20  25  30  35  40  45
6  12  18  24  30  36  42  48  54
7  14  21  28  35  42  49  56  63
8  16  24  32  40  48  56  64  72
9  18  27  36  45  54  63  72  81
```

入力の区切り文字は```-s``` オプションで指定できる。

```bash
$ MUL=$(for i in `seq 1 9`; do for j in `seq 1 9`; do printf "$(($i * $j)),"; done; echo; done)
$ echo "$MUL"
1,2,3,4,5,6,7,8,9,
2,4,6,8,10,12,14,16,18,
3,6,9,12,15,18,21,24,27,
4,8,12,16,20,24,28,32,36,
5,10,15,20,25,30,35,40,45,
6,12,18,24,30,36,42,48,54,
7,14,21,28,35,42,49,56,63,
8,16,24,32,40,48,56,64,72,
9,18,27,36,45,54,63,72,81,
$ echo "$MUL" | column -t -s,
1  2   3   4   5   6   7   8   9
2  4   6   8   10  12  14  16  18
3  6   9   12  15  18  21  24  27
4  8   12  16  20  24  28  32  36
5  10  15  20  25  30  35  40  45
6  12  18  24  30  36  42  48  54
7  14  21  28  35  42  49  56  63
8  16  24  32  40  48  56  64  72
9  18  27  36  45  54  63  72  81
```

```column``` は次のように一列のデータを表のように並べるのにも使用する事ができる。```-x``` を使用すると行から並べるようになる。

```bash
$ seq 1 30 | column
1	4	7	10	13	16	19	22	25	28
2	5	8	11	14	17	20	23	26	29
3	6	9	12	15	18	21	24	27	30
$ seq 1 30 | column -x
1	2	3	4	5	6	7	8	9	10	11	12
13	14	15	16	17	18	19	20	21	22	23	24
25	26	27	28	29	30
```
RSpec 要素数はhave(n).items じゃなくなってる


* ruby 2.0.0p481
* rails 4.1.8
* rsepc 3.1.7


取得した要素数をカウントしたい時に

```rb
expect(all('a')).to have(2).items
```

って書いてて

```
 NoMethodError:
       undefined method `have' for #<RSpec::ExampleGroups::Index:0x007f42e0f3de58>
```

って怒られてなんでhaveが！って思って調べてたら

> have(n).itemsやitsはRSpec 3.0で削除されますが～

(http://qiita.com/yujinakayama/items/a1d31b2caa35642e8e69)


って書いてあってマジかー、、、

```rb
expect(all('a').size).to eq(2)
```

でイケました。
たったこれだけの事なのに、なかなか辿りつけなかったお。

RSpecとかCapybaraの進化が早くて、最近勉強を始めた身としてはネットの情報が新旧混在してて大変ｗ


----
Windows 8.1 で LuaTeX/LuaLaTeX を使う

忘れそうなのでメモ．
`menukeys.sty` を使いたいので，pLaTex から LuaLaTeX に変更する．

## アップデート
取り敢えず TeXLive をアップデートする．
tlmgr のアップデート
`> tlmgr update --self --no-persistent-downloads`

パッケージ のアップデート
`> tlmgr update --all --no-persistent-downloads`

## .latexmkrc を変更
```.latexmkrc
$latex          = 'platex -src-specials -shell-escape -interaction=nonstopmode -synctex=1 -kanji=utf8';
$pdflatex       = 'lualatex %O -synctex=1 %S';
$bibtex         = 'upbibtex %O %B';
$pdf_mode       = 1;
$pdf_previewer  = 'C:\Programs\SumatraPDF\SumatraPDF.exe -reuse-instance'; 
```

## テスト
(2015/2/3 追記) 色の変更方法．
test.tex は，UTF-8 で．

```test.tex
\documentclass[a4paper,10pt]{ltjsarticle}
\usepackage[yu-win]{luatexja-preset}
\usepackage[os=win]{menukeys}
\usepackage{lipsum}

\begin{document}
\section{test}

\copymenucolortheme{myColor}{gray}
\changemenucolor{myColor}{txt}{named}{myPageColor}

\changemenucolortheme{roundedmenus}{myColor}
\changemenucolortheme{roundedkeys}{myColor}
\changemenucolortheme{pathswithfolder}{myColor}

\renewmenumacro{\menu}[>]{roundedmenus}
\renewmenumacro{\directory}[/]{pathswithfolder}

\keys{\ctrl + \Space}
\directory{C: / Windows / System32}
\menu{File > New > \dots}

\lipsum[1-2]
\end{document}
```

`> latexmk -pv test.tex`

うーん，タイプセットに時間が掛かり過ぎるけど、しばらく使ってみます．
Ruby1.8 で、Generator.new の中で、Tempfile.open(ブロック付き) を呼び出すと、tempfile が削除されない問題


原因はよくわかっていないけど、こういう現象が発生するよというメモ

# 先に結論

- ブロックにしないで、明示的に TempFile#close! を呼べばOK
- 1.9 以降は、Generator は Enumerator に統一
- Enumerator.new を使った場合再現なし

# 再現方法

```.rb
require "tempfile"
require "generator"

class TempFileRemoveTest
  attr_reader :tempfile_path
  def read
    Tempfile.open("test") do |file|
      @tempfile_path = file.path

      # 適当にファイルに書く
      file.write((["aaaaa"]*1000).join("\n"))

      file.open
      while l = file.gets
        yield(l)
      end
    end
  end
end

g = Generator.new do |y|
  TempFileRemoveTest.new do |test|
    test.read do |line|
      y.yield(line)
    end
    puts test.tempfile_path # -> /tmp/test20150202-9169-wmwa9m-0
  end
end

g.map{|line| line}
```

```bash
$ test -e /tmp/test20150202-9169-wmwa9m-0; echo $?
0
```

ファイルが消えていない!!

# Tempfile.open について


    open にブロックを指定して呼び出した場合は、Tempfile オブジェクトを引数として ブロックを実行します。
    ブロックの実行が終了すると、ファイルは自動的に クローズされ、 nilをかえします。


[Tempfile#open](http://docs.ruby-lang.org/ja/1.8.7/class/Tempfile.html#S_NEW)


    テンポラリファイルをクローズします。 real が偽ならば、テンポラリファイルはGCによって削除されます。 そうでなければ、すぐに削除されます。 

[Tempfile#close](http://docs.ruby-lang.org/ja/1.8.7/class/Tempfile.html#I_CLOSE)

なので本来ならば、ブロックを持つ Tempfile.open で生成されたファイルは、GC時に削除されるはず

# 対策

明示的に Tempfile#close! を呼び出す

```.rb
require "tempfile"
require "generator"

class TempFileRemoveTest
  attr_reader :tempfile_path
  def read
    file = Tempfile.open("test")
    @tempfile_path = file.path
    $path = file
    file.write((["aaaaa"]*1000).join("\n"))
    file.open
    while l = file.gets
      yield(l)
    end
    file.close!
  end
end

g = Generator.new do |y|
  TempFileRemoveTest.new.tap do |test|
    test.read do |line|
      y.yield(line)
    end
    puts test.tempfile_path # ->  /tmp/test20150202-9618-1ihkntk-0
  end
end

g.map{|line| line}
```

```bash
test -e /tmp/test20150202-9618-1ihkntk-0; echo $?
1
```

なんでこれで大丈夫になるかも、あんまり分かってない

# 1.9 以降は?

1.9 以降は、Generator は Enumerator に統一

    まつもと　1.8にもEnumeratorとGeneratorという2つの似たようなライブラリがあったんですけど、それが1.9ではEnumeratorに統一され、組み込みになりました。

[まつもと×笹田、Ruby 1.9を語る － ＠IT](http://www.atmarkit.co.jp/news/200712/25/ruby.html)


[class Enumerator](http://docs.ruby-lang.org/ja/2.1.0/class/Enumerator.html)

# 2.2.0 で動作確認

```.rb
require "tempfile"

class TempFileRemoveTest
  attr_reader :tempfile_path
  def read
    Tempfile.open("test") do |file|
      @tempfile_path = file.path
      $path = file
      file.write((["aaaaa"]*1000).join("\n"))
      file.open
      while l = file.gets
        yield(l)
      end
    end
  end
end

e = Enumerator.new do |y|
  TempFileRemoveTest.new.tap do |test|
    test.read do |line|
      y.yield(line)
    end
    puts test.tempfile_path # -> /var/folders/47/0yfz3cbd59j_jkyny3kggc8r0000gn/T/test20150202-57768-1nwy03m
  end
end

e.map{|line| line}
```

```bash
$ test -e /var/folders/47/0yfz3cbd59j_jkyny3kggc8r0000gn/T/test20150202-57768-1nwy03m; echo $?
1
```

ファイルは削除されている
Zabbixの蓄積系データを初期化する

監視項目等の過去に取得した値をまるっと初期化するには何か方法が無いか調べていた時に試してみたことを記載。
Zabbixにも一応機能はあるけど、チェックボックスを一つ一つつけていかなきゃいけないため台数が多いと非常に手間。ということでDBの特定テーブルを手動で初期化することしかない模様。

##どのテーブルを初期化するべきか
下記スクリプトを参考にしてこのあたりを初期化(truncate)する。
https://github.com/maxhq/zabbix-backup/blob/patch-1/zabbix-mysql-backupconf.sh
>acknowledges alerts auditlog_details auditlog events \
>history history_log history_str history_str_sync history_sync history_text \
>history_uint history_uint_sync trends trends_uint

**truncateできない！**
テーブルによっては(auditlogとか)外部キー制約がかかっているのでそんな時は下記のように
一時的に制約を無視してからtruncateする。
[mysqlの外部キー制約でtuncate table エラー ERROR 1701 (42000｜IT忘備録・メモ書きと日記](http://ameblo.jp/oregano-blog/entry-11563092887.html)
>mysql> set foreign_key_checks = 0;

終わったらちゃんと戻す
>mysql> set foreign_key_checks = 1;

* * *

実際にはこの前に、hostとかtemplateとかの設定をコピーしてからDBを再作成する方法を試そうとしましたが、アクションとかバックアップ取れない項目があったのでこの方法になりました。
今のところ普通に値が取れてる模様。
不具合（この設定消えてる！とか）がありましたら教えて頂けると当方も助かります。
[Java][Derby] Apache Derbyコマンドラインメモ

# 起動

glassfishに付属しているderbyを使う場合です。

```bat:commandline
>"\Program Files\glassfish-4.1\javadb\bin\ij"
```

# データベースへ接続

```sql:commandline
ij> connect 'jdbc:derby:データベースディレクトリへのパス`;
```

データベースディレクトリへのパスは、相対パスでもOKです。

# スキーマ一覧

```sql:commandline
ij> show schemas;
```

# テーブル一覧

```sql:commandline
ij> show tables;
```

スキーマを指定するときは、`in スキーマ名`を付ける。

```sql:commandline
ij> show tables in app;
```

# テーブル構造を見る

```sql:commandline
ij> describe テーブル名;
```

あるいは

```sql:commandline
ij> describe スキーマ名.テーブル名;
```

# テーブルに付いている制約名を取得する

```sql:commandline
ij> select c.constraintname from sys.systables t, sys.sysconstraints c, sys.syskeys k where t.tableid=c.tableid and t.tablename='テーブル名' and c.constraintid=k.constraintid;
```
VirtualBox 4.3.20 Kernel driver not installed (rc=-1908)




`VirtualBox`のゲストOSがこんな感じのエラーで動かなかった場合、ダウングレードしたバージョンを使用しましょう。

```
Kernel driver not installed (rc=-1908)
```


~~~shell:ダウングレード
$ downgrade virtualbox 

$ downgrade virtualbox-host-dkms
~~~

使用バージョン

`kernel:3.18.4-1`

`virtualbox:4.3.18`



##解説

問題は、`vboxdrv`がどっか行ったということでして。

VirtualBoxをLinuxで動かす場合は、カーネル更新に伴い、モジュールを再コンパイルしなければなりません。

```
$ sudo vboxdrv setup
```

これを自動化してくれるのが、`dkms`です。

これらを自動で行う方法は、以下の通りです。モジュールのインストールは、カーネルバージョンとVirtualBoxのバージョン情報が必要になります。

ちなみに、[Arch Wiki](https://wiki.archlinux.org/index.php/VirtualBox)は一部間違っているので注意です。`awk {'print $2'}`

~~~shell:
$ sudo pacman -S virtualbox

# sudo dkms autoinstall
$ sudo dkms install vboxhost/$(pacman -Q virtualbox|awk '{print $2}' |sed 's/\-.\+//') -k $(uname -rm|sed 's/\ /\//')

$ sudo systemctl enable dkms.service
$ sudo systemctl start dkms.service

$ sudo depmod -a

$ sudo modprobe vboxdrv
modprobe error could not insert 'vboxdrv' invalid argument
~~~

モジュールがなぜかない...。いろいろ調べてみた結果、どうも奇妙なので、こちらも古いバージョンを使うことに。

~~~shell:
$ downgrade virtualbox 

$ downgrade virtualbox-host-dkms
~~~

`kernel:3.18.4-1`

`virtualbox:4.3.18`

~~~shell:
$ sudo modprobe vboxdrv
~~~

通りました。


##注意

Archにおりてきた最新のカーネルは、`netctl`が使えなくなるので、ダウングレードしています。この場合、VirtualBoxへの影響も考慮し、`linux-headers`をアップデートした場合は、こちらのバージョンも揃えておきましょう。

オリジナルスクリプトで、日付で一括ダウングレードできます。


https://github.com/syui/downgrade


~~~shell:
$ git clone https://github.com/syui/downgrade

$ cd !$:t

$ ./air-downgrade
02-02
~~~
Zabbixでトリガーの深刻度をカスタマイズする

メール通知時の件名に任意の`{TRIGGER.STATUS}`を入れたかったのでカスタマイズした。

※Zabbix 2.0以上でカスタマイズ可能
https://www.zabbix.com/documentation/2.0/jp/manual/config/triggers/customseverities
https://www.zabbix.com/documentation/2.2/jp/manual/config/triggers/customseverities
https://www.zabbix.com/documentation/2.4/manual/config/triggers/customseverities

### 深刻度の設定

* Web UIにて`管理` -> `一般設定` -> `トリガーの深刻度`

![zabbix-trigger.png](https://qiita-image-store.s3.amazonaws.com/0/3539/38a8d821-9c13-4bd9-d371-9476120418f1.png)

* 変更したい深刻度を入力後、`更新`

### 深刻度の翻訳

翻訳が必要な場合は以下を行う。
※以下は仮に深刻度で`Important`を設定した場合

* $fronent_dir/locale/ja/LC_MESSAGES/frontend.poに翻訳を追記

```
msgid "Important"
msgstr "＜深刻度を翻訳した単語＞"
```

* スクリプト実行

```
$fronent_dir/locale/update_po.sh
```
SSHでもsudoがしたい

おぼえがき。タイトルに他意はございません。
sshコマンドでログインせずにリモートでコマンド実行したいときの方法。
普通に実行しようとするとtty（端末）がないよって怒られるので、それに対する対処。
※20150424追記
よくよく考えてみたら、こんなことしなくてもansibleが使えるならansibleの-Kを使ってリモートでsudoできるような気がした。
大量のサーバ宛にコマンド実行するときはそっちのほうが確実かも、と下記のやり方をやってシェルスクリプト書こうとしてハマって思いました。
作業したいリモートサーバが1台とかで、簡単なファイル内容の確認程度とかそういうのだったら下記のほうが楽かも。

# sshのtオプションを使う
ローカルからホスト名「hogehoge」の端末上でコマンド実行することを想定
hogehogeのところを任意のホスト名やIPアドレス、sudo以下のコマンドのところを実行したい任意のコマンドに変更すればいけるはず。
当然のことながら、対象のホストにログインする権限や、ホスト上で実行したいコマンドを実行できる権限がなければうまくいきません。 

```bash
ssh -t hogehoge sudo ls -l
```

こんな感じにするとsudoのパスワードを求められるので、入力してやれば該当のコマンドが実行できるはず。
システムの制約上sudoersを変えられない時もあると思うのでこれでうまく行くときは基本これでいいと思います。たぶん。

# sudoersを編集する

セキュリティリスクがありますが、それを許容するならこちらも。
`/etc/sudoers`の中に`Defaults    requiretty`という記述があるので、それをコメントアウトするか`Defaults    !requiretty`と記載する方法。
ただ、セキュリティホールを突かれてsudoされる恐れがあるので全ユーザ・全コマンドでこの設定にするのは好ましくないです。
そこで、まずユーザを限定します。cronのスクリプトなどで実行したい場合は専用のユーザを作っておくといいと思います。
下記はhogeユーザを指定した場合。

```
Defaults:hoge   !requiretty
```

さらに、該当ユーザがsudoで実行できるファイルを制限するには

```
hoge ALL=(ALL)       NOPASSWD: /opt/bin/test.sh
```

といった感じ。`/opt/bin/test.sh`に権限を絞りました。
セキュリティのために設定されているところを変えることになるので、与える権限は最小限に。
OSXのParallelsでWindowsをアップグレードする際のautorun.dllエラー回避方法

# 解決策
Parallelsのメニュー＞デバイス＞CD/DVD1直下で、該当のディスクドライブを選択するとautorunが起動するので、そこからsetup.exeを選択

ディスク直下のsetup.exeから行けそうに見えるのが罠。

# 状況
- ディスクドライブが付いていないmacbookに対し、リモートディスクでDVDをつないでいる
- Win7はParallelsでクリーンインストール、Win8はその上にアップグレードでインストールする
- autorun経由ではなくdiskのsetup.exeから起動させようとするとこんなエラーメッセージが出てしまいインストールが進まない

```
The file 'autorun dll' could not be loaded or is corrupt,Setup cannot continue
```
Bootstrapでオートコンプリートを行う

jquery-uiを使ってオートコンプリートをしていたところがbootstrap3導入によってぶっ壊れたので、bootstrapの流儀に則ったオートコンプリートで実装し直そうと思って調べてみました。

## 調査段階
### [bootstrap3-typeahead](https://github.com/bassjobsen/Bootstrap-3-Typeahead)
これを使ってみようとしたのですが、マルチバイト文字だとうまく動かない…？
あまり情報がなかったので、とりあえず放置しました。

### [typeahead.js](https://github.com/twitter/typeahead.js)
twitter-bootstrapだった頃のものっぽいのでどうなんだろう？と思いましたが、これを採用しました。
cssは[typeahead.js-bootstrap3.less](https://github.com/hyspace/typeahead.js-bootstrap3.less)から拝借しました。
typeahead.jsにはcssが含まれてないので、ここで多少つまりました。

## typeahead.jsの使い方

typeahead.jsは、BloodhoudとTypeaheadの2つで構成されています。
Bloodhoundは、サジェストエンジンを担い、TypeaheadがUI Viewを担っているようです。

Bloodhoundを使わずにサジェストを行うこともできますが、Typeaheadのsourceに対して、自分で絞り込み用の関数を定義して渡さなければならないので、ここは素直にBloodhoudを使った方が楽そうです。

BloodhoundはAjaxによる検索(remote)などにも対応していますが、今回は既にあるデータからの検索(local)を使う事にしました。サンプルはCoffeeScriptなので、適宜読み替えてください。
カスタムイベントがあるので、コールバック関数を仕込むことができます。

```coffeescript:coffeescript
# 1度だけjsonを取得するようにした
$.get '/foo/bar.json', (data) ->
  engine = new Bloodhound(
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    local: data
  )
  engine.initialize()
  $('.typeahead').typeahead({
    hint: true,
    highlight: true,
    minLength: 1
    },
    {
      name: 'engine',
      displayKey: 'value', # json配列の各オブジェクトのvalue要素を表示
      source: engine.ttAdapter()
    }
  ).on('typeahead:opened', (event) ->
    # オートコンプリートを開始時にコールバック
    console.log('opened')
  ).on('typeahead:closed', (event) ->
    # 選択した、しないに関わらず終了時にコールバック
    console.log('closed')
  ).on('typeahead:cursorchanged', (event, datum) ->
    # カーソル移動時にコールバック
    # datumに選択中のオブジェクトが渡されている
    console.log('cursorchanged')
  ).on('typeahead:selected', (event, datum) ->
    # 選択した時にコールバック。この後にtypeahead:closedが呼ばれる
    # datumに選択されたオブジェクトが渡されている
    console.log('selected')
  ).on('typeahead:autocompleted', (event, datum) ->
    # 選択せずに右矢印キーなどで入力補完をしたときにコールバック
    # datumに選択されたオブジェクトが渡されている
    console.log('autocompleted')
  )
```

以上です。
file_get_contents() で HTTP経由でデータを取得しようとしてエラーになったとき


php.ini の `allow_url_fopen` というオプションに関するメモ。

---

PHP の file_get_contents() でデータを取得する、

```
<?php
$contents = file_get_contents('http://example.com/');
```

ごくごく普通のコードです。
ごくごく普通に動作する。

と思っていたら、一部のサーバでだけ、常に `false` が返ってくる。データが取れない。なぜ。

ステータスコードなどを見るために [$http_response_header](http://php.net/manual/ja/reserved.variables.httpresponseheader.php) を確認してみると

```
<?php
$contents = file_get_contents('http://example.com/');
var_dump($http_response_header);
```

結果は `NULL`……

大半のサーバでは動いているので、なんかのサーバ設定だろうと調べた結果、php.ini の `allow_url_fopen` というオプションというものにたどり着く。このオプション初めて知った。

> PHP: 実行時設定 - Manual
> <http://php.net/manual/ja/filesystem.configuration.php#ini.allow-url-fopen>

`allow_url_fopen` は *「ftpまたはhttpプロトコルを用いて リモートファイルにアクセスするために提供されています」* とのことで、on がデフォルト。それが件のサーバでは off になっていた。

.htaccess に以下を追加することで、無事に動作するように。

```
php_flag allow_url_fopen on
```

知らないとハマりますね…
mydumperをdebian squeezeでパッケージしてみる

また悪足掻きシリーズです。Debian wheezy以降で利用可能な**mydumper**をsqueezeで何とかしてみる試み。**dpkg-dev**必須なんで、これは先に入れといてください。

とりあえずsidのdeb source追加します
```
deb-src http://ftp.jp.debian.org/debian/ sid main contrib non-free
```
apt-get update後にソースを取りますが、ここでは**~/debian/**を作業ディレクトリとします

```
% mkdir ~/debian
% cd ~/debian
```

ソースを取ります。

```
% apt-get source mydumper
% ls  
mydumper-0.6.1/                 mydumper_0.6.1-1.dsc
mydumper_0.6.1-1.debian.tar.gz  mydumper_0.6.1.orig.tar.gz
```

とまあ、こんな感じになりました。

でbuild-depを探ります。

```
% sudo apt-get build-dep mydumper                                
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
E: 入手可能な python-sphinx はいずれもバージョンについての要求を満たせないため、mydumper に対する Build-Depends の依存関係を満たすことができません
```

こうなったらpackages.debian.orgを見ます。
https://packages.debian.org/search?keywords=python-sphinx

squeeze-backportsに存在しそうです。**/etc/apt/sources.list**に以下を追記します。

```
deb http://http.debian.net/debian-backports squeeze-backports main
```

```
% sudo apt-get update 
```

して

```
% sudo apt-get build-dep mydumper -t squeeze-backports           
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  autopoint cmake cmake-data debhelper diffstat emacsen-common gettext
  html2text intltool-debian libarchive1 libcroco3 libglib2.0-dev libjs-jquery
  libjs-sphinxdoc libjs-underscore liblcms1 libmail-sendmail-perl
  libmysqlclient-dev libpaper-utils libpaper1 libpcre3-dev libpcrecpp0
  libsys-hostname-long-perl libunistring0 libxmlrpc-core-c3 libxslt1.1
  pkg-config po-debconf python-chardet python-docutils python-imaging
  python-jinja2 python-lxml python-markupsafe python-pkg-resources
  python-pygments python-roman python-sphinx quilt zlib1g-dev
アップグレード: 0 個、新規インストール: 40 個、削除: 0 個、保留: 30 個。
22.5 MB のアーカイブを取得する必要があります。
この操作後に追加で 69.9 MB のディスク容量が消費されます。
続行しますか [Y/n]? 
```

どりゃっと入れまして

```
% cd mydumper-0.6.1
% dpkg-buildpackage -us -uc 
```

でビルト開始。

```
% cd ..
% ls     
mydumper-0.6.1/                 mydumper_0.6.1-1_amd64.changes
mydumper_0.6.1-1.debian.tar.gz  mydumper_0.6.1-1_amd64.deb
mydumper_0.6.1-1.dsc            mydumper_0.6.1.orig.tar.gz
```

debできました。後はdpkgでもlocal aptラインでもそれ以外でも。

```
% sudo dpkg -i mydumper_0.6.1-1_amd64.deb
未選択パッケージ mydumper を選択しています。
(データベースを読み込んでいます ... 現在 38299 個のファイルとディレクトリがインストールされています。)
(mydumper_0.6.1-1_amd64.deb から) mydumper を展開しています...
mydumper (0.6.1-1) を設定しています ...
man-db のトリガを処理しています ...
```

以上です。後は例によってパッケージのアップデートに付いていくのは自分で何とかしないといかんという事ですが。。。では
Public CloudなStorage/CDNでSSL通信できる/できない表


# これは何？

Azure Storage BLOB/Azure CDNに独自ドメイン紐付けたはいいが、独自ドメイン+SSL通信対応してないやん！
ってことで忘れないように比較表を作りました。
今はAWSとAzureのみです。

AzureでStorage BLOB+独自ドメイン+SSL通信は、Storageの前にリバプロを置いてひとまず解決したのですが、そのお話はまた今度。
Websites+web.configだけでいけそうです。


ついでに表を作りました。
PublicCloud対比表(AWS/Azure/GCP/Softlayer)
http://qiita.com/nntsugu@github/private/2428a15e67de42d66947

# Storage/CDN

## 直接コンテンツ配信に使用することがあるもの

### Storage

|  | Amazon S3 | Azure Storage BLOB| 
|:-----------|:-----------:|:------------:|
| Default Domain       |  |  | |
| 　- Use SSL       | ◯(*.s3.amazonaws.com) | ◯(*.blob.core.windows.net) | |
| Custom Domain     |  |  | |
| 　- Use Custom Domain     | ◯ | ◯ | |
| 　- Use SSL(IP base)     | ☓ | ☓ | |
| 　- Use SSL(SNI)     | ☓ | ☓ | |

### CDN

|  | Amazon CloudFront | Azure CDN| 
|:-----------|:-----------:|:------------:|
| Default Domain       |  |  | |
| 　- Use SSL       | ◯(*.cloudfront.net) | ◯(*.vo.msecnd.net) | |
| Custom Domain     |  |  | |
| 　- Use Custom Domain     | ◯ | ◯ | |
| 　- Use SSL(IP base)     | ◯ | ☓ | |
| 　- Use SSL(SNI)     | ◯ | ☓ | |
CakePHPのフォームで画像ファイルを選択後にサムネイル画像を表示させる方法


## JSの準備
Layouts/default.ctp等に下記JSを記述。

```js
<script>
$(function() {
	// アップロードするファイルを選択
    $('input[type=file]').change(function() {
    var file = $(this).prop('files')[0];

	// 画像以外は処理を停止
	if (!file.type.match('image.*')) {
		$('span').html('');
       return;
    }

	// 画像表示
   	var reader = new FileReader();
   		reader.onload = function() {
   		var img_src = $('<img>').attr({'src': reader.result, 'width': '150px'});
   			$('p').html(img_src);
		};
       reader.readAsDataURL(file);
	});
});
</script>
        
```


## テンプレート(ctp)ファイルの準備
下記のようなformを用意する。

```form.ctp
<?php
$options = array(
    'action' => 'done',
    'type' => 'file',
    'inputDefaults' => array('legend' => false, 'label' => false, 'div' => false),
    'class' => 'form-horizontal'
);
?>
<?php echo $this->Form->create(false, $options); ?>
<!-- 画像ファイル指定 -->
<div class="control-group">
<label class="control-label" for="fileInput">画像</label>
<div class="controls">
<?php echo $this->Form->file('Hoge.image', array('id' => 'fileInput', 'class' => 'input-file uniform_on')); ?>
</div>
</div>
<!-- サムネイル画像表示 -->
<div class="control-group">
<label class="control-label" for="fileInput">サムネイル画像</label>
<div class="controls">
<p>指定なし</p>
</div>
</div>
<?php echo $this->Form->end(); ?>
```

画像を選択後、サムネイル画像表示領域に選択した画像が表示される。
UIViewをじんわり表示

# はじめに
小ネタです。
吹き出し画像を表示させるのに使いました。

# アルファ値アニメーションでじんわり表示

画面表示時にじんわりと表示させる場合、viewDidAppearなどでアルファ値のアニメーションを実行します。

```lang
- (void)viewDidAppear:(BOOL)animated
{
    self.xxxView.alpha = 0.0;
    [UIView animateWithDuration:0.3 animations:^{
        self.xxxImageView.alpha = 1.0;
    }];
}
```

# おわりに
何かの参考になりましたら幸いです。
6to5 + mocha + power-assert

[6to5](http://6to5.org/) をそのまま mocha + power-assert を使うと、power-assert が上手く動かない問題をどうにかする。

使えるようになったサンプルプロジェクトはこれ:

* [kui/6to5-skeleton](https://github.com/kui/6to5-skeleton)

こうなるまでを順番に書いていく。


必要なパッケージをインストール
-------------------------

上述したパッケージに加えて、@azu さん製の [azu/espower-6to5](https://github.com/azu/espower-6to5) を使う。

~~~~~~~~~~~~~~~~~~~~~~~~~~~bash
$ npm install --save-dev mocha power-assert espower-6to5
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

6to5 は espower-6to5 経由でインストールしたものを使うことになるので、CLI で mocha を走らせる分には不要。

loader を書く
-------------

espower-6to5 を使って mocha から呼ばれるローダーの設定をする:

~~~~~~~~~~~~~~~~~~~~test/loader.js
require('espower-6to5')({
  cwd: process.cwd(),
  pattern: '{.,{src,test}/**}/*.js', // 6to5 を通すファイルのパターン
});
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

espower-6to5 についてくる `guess.js` は、`test/` ディレクトリ以下の JavaScript しか 6to5 を通してくれず、プロジェクトルートにある JavaScript や `test/` 以外のディレクトリの JavaScript は 6to5 を使わずそのまま実行しようとする。なので `pettern` を自分の都合に合わせて書く必要がある。


テストを書いてテスト実行
-----------------------

書いた `loader.js` を、mocha に与えて実行すればできる:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bash
$ edit src/foo.js
$ edit test/foo_test.js

$ node_modules/.bin/mocha --require test/loader test/**/*_test.js
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

おわり。

> browserify と組み合わせるなら http://havelog.ayumusato.com/develop/javascript/e640-kameita_es6_project_skeleton.html Node だけなら https://github.com/azu/espower-6to5 あたりが参考になると思います。あとは Grunt や Gulp のプラグインで自前でつなぐ、とかですかね。
> https://twitter.com/t_wada/status/561048591838351362

@t_wada ありがとうございました。

疑問
-----

npm って依存パッケージバージョンと孫依存パッケージバージョンを一元管理できないんだろうか。今回は大丈夫だけど、テスト時は espower-6to5 の依存している 6to5 のバージョンを使うし、 アプリケーション実行時はまた別の 6to5 を使うハメになるのつらい。
【Grunt】EC2にsftpで、ファイルを更新するたびに自動でデプロイする

ローカルからファイルをアップロードする煩わしさを無くします。
テストでちょこっと使いたい時とか面倒なので、自動化したいと思い試してみました。


[grunt-ssh](https://github.com/chuckmo/grunt-ssh)


##準備

※ここでは説明はしませんが、事前にEC2でsshログインできる状態にしておきます。

npmを使用して必要なモジュールをインストールします。

「grunt-cli」をグローバルインストール(まだインストールしていなければ)

```ruby:
npm install -g grunt-cli 
```

作業ディレクトリに移動して

```ruby:
mkdir test_upload
cd test_upload

```

package.jsonを作成

```ruby:
npm init 

```

「grunt」と「grunt-ssh」と「grunt-contrib-watch」のモジュールをインストール

```ruby:

npm install grunt grunt-ssh grunt-contrib-watch --save-dev

```

##Gruntfile

package.jsonと同じディレクトリにGruntfile.jsを作成・編集

```ruby:Grantfile.js
module.exports = function(grunt) {
  grunt.initConfig({
    watch: {
      coffee:{
        tasks: 'sftp',
        files:['src/index.html']
      }
    },
    sftp: {
      test: {
        files: {
          "src/": "src/index.html"
        },
        options: {
          path: '<デプロイ先>',
          host: '<ホスト名>',
          username: '<ユーザー名>',
          password: '<パスワード>',
          privateKey: grunt.file.read("<pemのパス>"),
          srcBasePath: 'src/'
        }
      }
    }
  });
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-ssh');
  grunt.registerTask('default', [ 'sftp' ]);
};

```

##Gruntコマンドで実行してみる

```ruby:

grunt watch

```

「index.html」を監視して、更新されれば勝手にサーバーにアップロードされます。


##おわり

個人のローカルの開発環境など、AWS以外でもどんどん使っていきたいと思います。

[今回のサンプルはこちら](https://github.com/king-panda/grunttest_deploy)
gitで強制的にpullする


## ローカルでの修正を破棄し、強制的にpullする
ビルドなどで自動生成されたファイルの影響で、git pull時に衝突が発生した際の対処方法についてのメモです。
ローカルでの修正を全て破棄して、masterリポジトリからpullします。

```
$ git checkout -- .
$ git pull origin master
```
退職者が出た場合の JIRA アカウントの無効化

残念ながら退職者が出てしまった場合、退職者が利用していた JIRA のアカウントを無効化する必要がある。
JIRAでは、その場合アカウントを削除するのではなく、アカウントの JIRA へのアクセス権を剥奪することで対応する。


##アカウント毎の JIRA へのアクセス権剥奪方法（管理者のみ）

1. `USER MANAGEMENT` > `Application access` にアクセス。
2. アクセス権を剥奪したいユーザーを検索して選択。
3. `JIRA` に付いているチェックを外す。

以上

##なぜアクセス権の剥奪なのか
JIRAでは、アカウントが何らかの課題の報告者であったり、担当者であったり、またコメントを投稿していたりすると削除できない仕様。
また削除できてしまうと、今までの履歴に穴ができてしまうので、よろしくない。
（誰が書いたコメントなのかわからない、誰が報告した課題だったのかわからない、など。）

そこで、ユーザーアカウントは残しつつ、アプリケーションにアクセスできないようにしてあげれば、
諸々の履歴は残りつつ、かつその人がどんな人で、どの部署に所属していた人かもわかる。

勿論、JIRAへのアクセス権を剥奪した段階でライセンスは無効になるため課金対象から除外される。
CentOS 6.6 phpenv+php-build インストール

phpenv ... phpのバージョンを容易に可変にするためのソフト。rubyでいうrbenv、pythonでいうpyenvみたいなもの。
php-build ... php本体のインストールに使うもの。今回はphpenvのプラグインとして利用する。

今回はCentOS 6.6のCore環境にphp 5.5.21をインストールするという前提でいきます。

1) phpenvのインストールスクリプトを走らせる。
`curl https://raw.githubusercontent.com/CHH/phpenv/master/bin/phpenv-install.sh | bash`

2) php-buildをphpenvのプラグインとして組み込む。
`git clone git://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build`

3) パスを通す。
`echo 'export PATH="$HOME/.phpenv/bin:$PATH"' >> ~/.bashrc`
`echo 'eval "$(phpenv init -)"' >> ~/.bashrc`
`exec $SHELL -l*`
上記はシェルがbashの場合。自分でzshとかに変えてるなら対応してね。

4) php-buildで任意のバージョンのphpをインストールする。
`phpenv install 5.5.21`
ここでたくさんエラーが出ると思いますが、多くはライブラリの不足に起因するものなので、自分の環境に合わせて以下を参考にしながら解消していってください。
http://qiita.com/tebonz/items/82ad7e57066650d43b28

5) phpのプロジェクトディレクトリでphpのバージョンを設定する
`phpenv local 5.5.21`
`phpenv rehash`

これでとりあえずphpが動く環境は出来上がる。
試したければ `php -S [ip]:[portnumber]` を任意ディレクトリで実行すればビルトインPHP Serverが立ち上がる。
MongoDBのスキーマデザインする時の3つのポイント


[SnapDish](http://snapdish.co)ではDBにMongoDBを使っている。バージョンが1.4ぐらいの時から使っていて、色々と試行錯誤をしながら使ってきた。不勉強もあり今だに負の遺産が残る中、現在開発しているサービスでMongoDBをどのように利用したらよいか再度考えてみることに。

振り返るとやはりスキーマデザインが常に一番悩むところ。ただ、悩んでいる時間が惜しいので、決断を早くするために、スキーマの設計をするにあたり一定の考え方を設けることに。

それで、できるだけシンプルにということを念頭に、今更ながらだけど **3つのポイント** にまとめてみることに。

様々な意見や議論のある領域だと思うので、これを読んだ方で、「この場合はどうなる？」や「ツッコミ」などあれば、ぜひコメンントや意見を頂きたところ。今後の参考したい。また、「その考え方はこういうことだよ」という、適切な表現や言葉があれば教授してもらいたい。

まず、、、

SnapDishは料理サービスなので、料理詳細情報をどう取得するかを題材に書いてみることにした。

*※Sharding環境に関しては全く考慮しいない*

## 料理詳細ページ生成のためのスキーマイメージ

```
# 利用するコレクション
# dish.collection - 料理情報を保持する
# dish_comment.collection - 料理情報に対するコメント
# user.collection - ユーザー情報を保持する

# 料理写真詳細コレクションイメージ
db.dish.collection = {
 "_id": ObjectId(),
 "usr_id": db.user.collection._id,
 # 以下の様にしたいところだが、apiなどでデータを返す場合返す時に、情報を再取得してデータを返す
 #"usr": {
 #  "_id": ObjectId(), # ユーザーのObjectId
 #  "unm": "名前",
 #  "anm": "アカウント名",
 #  "img": {画像URL},
 # },
 "nm": "料理名",
 "rcp": {レシピ}, # 無制限に肥大しないので自由にフィールド設定ができる。MongoDBの得意なところ
 "img": {画像URL},
 "tag": [タグ,,,],
 "tm": datetime,
 # 以下のようにしたいところだが、別コレクションにする
 # "cmts": [{コメント},] 
 ...
}

# 料理写真詳細へのコメントコレクションイメージ
# コメントは無制限に増えるので、別のコレクションにしたほうがよい
db.dish_comment.collection = {
 "_id": ObjectId(),
 "dsh_id": dish.collection._id,
 "usr_id": user.collection._id, 
 "txt": "コメント",
 "tm": datetime,
 "mt": ["メンションされたusr_id",,,],
 ...
}

# ユーザー情報コレクションイメージ
db.user.collection = 
 "_id": ObjectId(), # ユーザーのObjectId
 "unm": "名前",
 "anm": "アカウント名",
 "img": {画像URL},
 ...
} 
```

上記のスキーマで料理の詳細データを取得する際以下の流れになる

* **DBアクセス** 料理データを`_id`で取得 
* **DBアクセス** `dsh_id`を参照しているコメントデータを取得
* 料理データとコメントデーターから`user._id`を抽出
* **DBアクセス** `user._id`を使ってユーザーのデータを取得
* dish.collection.data と dish_comment.collection.data とユーザーデータをマージし、レスポンスデータを生成

## 3つのポイント

### 無制限に増えるフィールドは別コレクションにする
メモリーにあるデータの取得は早いので別コレクションでも全く問題はない。また、上記の場合 **DBへアクセス** は3回になるが、メモリキャッシュをうまく利用すると **DBアクセス** 回数は容易に減らせ、場合によってはレスポンスの向上はできる。なので、ドキュメントが肥大化する場合、コレクションを分けて、アプリケーション側で処理をしても問題はない。

### フィールド名は短くても構わない
フィールド名も要領を食うので、フィールド名はなるべくコンパクトにする。実際、ある程度意味が推測できればそこまで問題にはなっていない。直感的にわからないという重大な課題はあるが、最終的には慣れる（強気でいまのところ通している）。ただし、仕事の現場は、場合によっては引き継ぎなどもあるので **スキーマのフィールド名の説明をしたドキュメント** はもちろんしっかり残しておく必要はある。

### MongoDBはシンプルなクエリーでデータを取得するためのストレージとして使う
集計や検索は別のサービスに任せるか、書き込み時に非同期で別に渡すなど工夫をするとよい。単純な条件でデータを取得することにを一番重視し、それ以外のことは、別途考えるか別に任せる。やはりMongoDBは **Slow-Queryが最大の地雷** で、設計段階でその可能性を軽減するということが大切だと考える。

## ODM（object document mapper）を必ず使おう

非同期I/O non-blocking処理を行いたい場合（使わないとあまり恩恵はないので使ったほうが良い）は、 `μmonogo` を使って、document format定義を事前に行うと良い。write operationの場合は、必ず `μmongo` の `Document Class` を使って定義をすれば、ソフトウエア側である程度データ型の管理ができる。ざっくりプロトタイピング的に作る時も、書式は結構簡単なので、利用をすすめたい。このお作法自体どうよ、とツッコミも多くもらうが、ある程度のサービスでは耐えられると思う。

また、古くからmongoを使っていて、ドキュメントデータのフォーマットにばらつきが出ている場合、データのマイニングや集計などをする時には、ODMは、結構重要。

参照: [μmongo (umongo) を使ってmongodb documentデータをcsv へコンバートしてみる](https://qiita.com/kiyotaman/items/f2b3e6dfd5ff95510fbd)

## まとめ
3つのポイントを押さえておけば、スキーマ設計での苦悩が軽減されると考えている。他にもっとケアーしなければならないことがあるかもしれないが、みなさんがどう考えるか聞きたいところ。あと、MongoDBを利用して[SnapDish](http://snapdish.co)のようなサービスを開発する際は参考にしてもらえたらと。

#### 関連記事

* [MongoDB Resplica Set利用時のアンチパターン](http://qiita.com/kiyotaman/items/b49adc337c8ea4cb5d88)
ブロックの戻り値を返してくれるだけの書き方を考える


あるオブジェクトを作りたい。
そのオブジェクトを作るには一時変数が必要だとする。

```ruby
s1 = "pi"
s2 = "yo"
string = s1+s2 #=> "piyo"
```

とすると、中間結果`s1`,`s2`が残ってしまう。
そこで例えば、`def below() yield end`によって、

```ruby
string = below do
  s1 = "pi"
  s2 = "yo"
  s1 + s2
end #=> "piyo"
```

みたいな感じで書きたい。

この`def below() yield end`と同じことする書き方が、ググれど意外にも見つからなくて、悩んでるというお話です。
標準の範囲内で、良い書き方を募集しております。

## 追記
yancya さんの
手続きオブジェクトを作ってそのまま実行する書き方である
`-> { .. }[]`が良いと思いました。（たまに使わせてもらっています）

```rb
string = -> do
  s1 = "pi"
  s2 = "yo"
  s1 + s2
end[]
```
jQueryでのタッチイベントの座標(event.pageX)で取れない時に。


jQueryを使っていると…。

```javascript
$( document ).on( "mousemove", function( event ) {
  $( "#log" ).text( "pageX: " + event.pageX + ", pageY: " + event.pageY );
});
```

という感じで`event.pageX`でブラウザもよしなに考慮して座標が取得できるハズ…。

しかし、一部Android端末で取得できなかったりする。

そんな時は`e.originalEvent.touches`を見に行くと値がある。
だので、以下の様にしてみたりするといいかも。

```javascript
function getPageX(e) {
  var pageX = 0;
  if (e.originalEvent.touches) {
    pageX = e.originalEvent.touches[0].pageX;
  } else {
    pageX = e.pageX;
  }   
  return pageX;
}
$( document ).on( "mousemove", function( event ) {
  var pageX = getPageX(event);
  $( "#log" ).text( "pageX: " + pageX );
});
```

引用:http://api.jquery.com/event.pagex/
CoreData の中身を手軽に確認する方法


# 方法いろいろ

参考: http://stackoverflow.com/questions/34403/is-there-a-good-ide-for-sqlite
参考: http://stackoverflow.com/questions/12601410/mysql-workbench-with-sqlite

* https://github.com/yepher/CoreDataUtility は有料版もあるが無料版もある。
* http://thermal-core.com/CoreDataEditor/ は有料。14日だけ無料期間がある
* SQLite ファイルをCLI で直接見る
* Sqlite Administrator
    * 「the problem here is that SQLite Admin is specific for Windows Systems」とのコメントがあるのでMac ユーザーには微妙？
* SQLite Database Browser
    * よさげ？未確認
* sqlite-manager FireFox addon
    * Firefox 使ってればいいかんじらしい

# 方針

今回はデバッグ用にデータを参照したいだけで、そこまで複雑な操作はできなくてよいため、とりあえず一番早く使えそうな CoreDataUtility の無料版を使うことにした。

# CoreDataUtility の導入・操作方法

* 環境
    * Mac OS X 10.10.2
    * Xcode 6.1.1
    * CoreDataUtility v1.4_7

* 手順
    * https://github.com/yepher/CoreDataUtility/releases からCoreDataUtility をダウンロードして解凍、起動
    * iOS Simulator タブを選択
    * アプリを選択
    * Select Model で*.mom ファイルを選択
    * Select Persistence File で、Library > Application Support > (アプリ名) とたどって、sqlite ファイルを選択
    * Persistence Format はSQL

以上でデータが見れるようになるはず。

# 補足

* Xcode6 あたりでシミュレータのディレクトリ構造が変わったらしく、v1.3_5 で対応してる。これ以前のバージョンだとXcode6 でうまくファイルが読み込めないので注意。
    * https://github.com/yepher/CoreDataUtility/releases/tag/v1.3_5

* シミュレータのデータが大量にあって参照したいデータが探しにくい場合は、一度データをクリアするとよい (シミュレータのデータは復元できなくなると思われるので要注意)
    * シミュレータを停止しておく
    * ~/Library/Developer/CoreSimulator/Devices を削除
    * シミュレータを起動 (Devices ディレクトリは勝手に作られる)
Docker で Jenkins 環境をつくる


Jenkins の永続的な運用環境を Docker でつくってみるメモ。CoreOS 使っています。

* [Welcome to Jenkins CI! | Jenkins CI](http://jenkins-ci.org/)


# イメージ取得

Jenkins は公式イメージが提供されているので、こちらを使用します:

```
core@coreos ~ $ docker search jenkins
NAME                                  DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
jenkins                               Official Jenkins Docker image                   248       [OK]   
```

タグは `latest` より `weekly` のが新しい:

```
docker pull jenkins:weekly
```

* [jenkins Repository | Docker Hub Registry - Repositories of Docker Images](https://registry.hub.docker.com/_/jenkins/)


# コンテナ実行

Jenkins サーバーをバックグラウンドコンテナとして起動します:

```
docker run -d -P -v /media/volume/jenkins_home:/var/jenkins_home jenkins:weekly
```

* `-v` でデータボリューム `/var/jenkins_home` をホストの `/media/volume/jenkins_home` に割り当てている。
* CoreOS 側で `/media/volume` に NFS で NAS をマウントしてデータの永続化を行なうようにしている。

ホストに割り当てられたポート番号をプロセス一覧から確認します:

```
core@coreos ~ $ docker ps
CONTAINER ID        IMAGE                        COMMAND                CREATED             STATUS              PORTS                                               NAMES
28435e837a3a        jenkins:1.596                "/usr/local/bin/jenk   21 seconds ago      Up 20 seconds       0.0.0.0:49182->8080/tcp, 0.0.0.0:49183->50000/tcp   furious_bartik   
```

これだと `49182` が HTTP 公開ポート、 `49183` がスレーブサーバーとのコミュニケーション公開ポートとして割り当てらています。

あとは web ブラウザから Jenkins にアクセスします。アドレスは上記ポート番号を指定して下記のような感じです:

```
http://192.168.0.98:49182/
```

Jenkins は標準で `/var/jenkins_home` 以下に全てのデータが格納されるので、このパスをデータボリュームにして分離してやれば、データの永続化とコンテナのポータビリティが簡単に担保できます。
tomcatに.warを再デプロイするとさっきまで動いていたWEBアプリが404しか返さなくなった

# 概要

Tomcatの`webapps/`に.warを置くと、しばらくしてフォルダに展開されWebアプリとして動くはずです。ところが、いつまでたっても404しか返さないという状況に陥ることがあります。

このとき、IDE（NetBeansで確認）からWebアプリをアンデプロイしようとしても、

```
FAIL - Unable to delete [***]. The continued presence of this file may cause problems.
```

というポップアップが出てアンデプロイに失敗してしまいました。

本記事はこの現象に対する解決策のメモです。


# 解決策

ポップアップのメッセージでググると解決策が説明されていました。
http://stackoverflow.com/questions/14873219/cannot-undeploy-a-web-app-completely-in-tomcat-7

**[手順]**

1. tomcatを停止し、手動でWebアプリのフォルダを消去、またはIDE再起動後にIDEからアンデプロイを実行
2. tomcatフォルダの`conf/context.xml`を開き、ルート要素`<Context>`に`antiResourceLocking="true"`という属性を追加（下記参照）

```xml:context.xml

<!-- Before -->
<Context>
  ...
</Context>

<!-- After -->
<Context antiResourceLocking="true">
  ...
</Context>

```
検索画面のRESTfulなURL

検索機能のURLとかアクション名をどうしようか考えて迷子になったので、色々と考えたことを残しておきます。

## 非RESTfulなURL
最初は、`/employees`というURLで検索フォームを表示し、`/employees/find`をPOSTメソッドで呼んだら検索結果を表示する。ビューは共通で使うようにして、検索結果が空じゃなかったら一覧表示する。というのを考えていました。

|URL|メソッド|アクション|ビュー|備考|
|:--|:------|:-------|:--|:--|
|/employees|GET|index|index.html.erb|検索フォームを表示する|
|/employees/find|POST|find|index.html.erb|検索結果を一覧表示する|

しかし、色々と調べていたら、この設計はRESTfulじゃないということがわかってきました。

まず、POSTメソッドはリソースを新しく登録する時に使われるべきで、リソースについての情報を表示するのはGETメソッドでおこなうというのがRESTの考え方です。

この考えに従うと、`/employees`というリソース名だけのURLをGETメソッドで呼んだら、従業員の一覧を返すのが良いみたいです。
しかし、このURLは従業員情報を管理する機能のトップページにしたいので、検索フォームを表示するだけにしたいです。ここにこだわってしまったせいでずいぶん時間を無駄にしました。

## indexがトップページである必要はない
indexアクションに対応する`/employees`をGETしたときはリソースの一覧を返すべきですが、別にそれがトップページである必要はありません。**index**という単語に囚われて、トップページでなければならないと思い込んでいました。

機能のトップページは検索フォームを表示するだけというのは変わりませんが、このURLを`/employees/find`としました。ビューも別々にして「従業員情報検索」と「従業員情報一覧」としました。これで頭の中がずいぶんとスッキリしました。

|URL|メソッド|アクション|ビュー|備考|
|:--|:------|:-------|:--|:--|
|/employees/find|GET|find|find.html.erb|検索フォームを表示する|
|/employees|GET|index|index.html.erb|検索結果を一覧表示する|

検索パラメータが空だったら検索を行わない。という方法も考えたのですが、ひとつのアクションの中でやることを分岐させるよりも、機能の目的ごとにアクションを作った方が、シンプルさを維持できるのでよかったと思います。

一覧画面にも検索フォームを表示する必要はあるのですが、部分テンプレートを使えば重複せずに実装できました。

## まとめ
* 情報を表示するリクエストはGETメソッドにする
* リソースの状態を変更しないリクエストをPOSTにしない
* indexアクション = 機能のトップページ でなくてもよい
* アクションは目的ごとに分割するのがよい
google-drive-rubyの0.3.x系でBadAuthenticationの対応

Googleスプレッドシートをテンプレートに使いPDF帳票作成のWebアプリを動かしています。本番環境でしばらく安定して動いていたのですが、先日PDFが作成されなくなったと連絡がありました。Googleアカウントの2段階認証プロセスを有効にしたあとに、認証エラーになっているようです。


## google-drive-rubyのバージョン

[README.rdoc](https://github.com/gimite/google-drive-ruby/blob/master/README.rdoc)に注意書きがあります。1.0.0の[バージョン](https://rubygems.org/gems/google_drive)になり0.3.xと上位互換が完全でありません。特にloginメソッドがなくなっているので注意が必要です。

> Ver. 1.0.0 is not 100% backward compatible with 0.3.x. Some methods have been removed. Especially, GoogleDrive.login has been removed, and you must use GoogleDrive.login_with_oauth instead, as in the example code below.

## GoogleDrive.loginで認証に失敗

今回の環境のバージョンです。

``` bash
$ bundle exec ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]
$ bundle exec gem list google_drive

*** LOCAL GEMS ***

google_drive (0.3.6)
```

コンソールで再現してみると、GoogleDrive.loginで認証に失敗しています。

``` ruby
$ bundle exec rails console 
irb(main):001:0> session = GoogleDrive.login 'Googleアカウント','Googleアカウントのパスワード'
GoogleDrive::AuthenticationError: Authentication failed for xxx Response code 403
for post https://www.google.com/accounts/ClientLogin: Error=BadAuthentication
```

## アプリ パスワードでログイン

Googleアカウントの[ヘルプページ](https://support.google.com/accounts/answer/185833?hl=ja)によると、2段階認証プロセスを有効にした後はアプリ パスワードに変更する必要があります。

> アプリ パスワードは、Google アカウントへのアクセス権をアプリや端末に付与する 16 桁のパスコードです。2 段階認証プロセスを使用している場合に、Google アカウントにアクセスして「パスワードが正しくありません」というエラーが表示されるときは、アプリ パスワードで問題を解決できることがあります。

[アプリ パスワード](https://security.google.com/settings/security/apppasswords)の画面から新しく16 桁のパスコードを生成して、Googleアカウントのパスワードの代わりに使います。

## PDF出力テスト

新しく生成した16 桁のパスコードを使い、ローカルにPDFを出力してさっとテストをしてみます。無事にPDF出力ができました。今回はプログラムの修正をせずに済んだのですが、早めにGemのバージョンアップをして、OAuth認証に移行しないといけません。

``` ruby
$ bundle exec rails console 
irb(main):001:0> session = GoogleDrive.login 'Googleアカウント','16 桁のパスコード'
irb(main):002:0> template_key = 'ドキュメントキー'
irb(main):003:0> new_title = "test_#{Time.now.strftime('%Y%m%d%H%M%S')}"
irb(main):004:0> template = session.spreadsheet_by_key template_key
irb(main):005:0> sheet = template.duplicate(new_title=new_title)
irb(main):006:0> key = sheet.key
irb(main):007:0> format = 'pdf'
irb(main):008:0> gid_param = '&gridlines=false&printtitle=false&size=A4&fzr=true&portrait=true&fitw=true'
irb(main):009:0> url = ["https://spreadsheets.google.com/feeds/download/spreadsheets/Export",\
irb(main):010:1* "?key=#{key}&exportFormat=#{format}#{gid_param}"].join
irb(main):011:0> raw_data = session.request(:get, url, :response_type => :raw)
irb(main):012:0> File.binwrite("/tmp/#{new_title}.pdf", raw_data)
irb(main):013:0> session.file_by_title(new_title).delete
```
FuelPHPでフォームの必須項目に※をつける

バリデーションルールはModelで定義しているのに必須項目はViewに直接※をつけているなんていうときにはもっと自動的にやっちゃおうよっていう感じのやつ

## Validationクラスを拡張

```php:fuel/app/classes/validation.php
<?php

class Validation extends \Fuel\Core\Validation {

	/**
	 * If $field has 'required' rule, It will return true
	 */
	public function is_required( $field ) {
		$fields = $this->fieldset()->field();
		if( isset($fields[$field]) ){
			foreach( $fields[$field]->rules as $r ){
				if( $r[0] == 'required' ){
					return true;
				}
			}
		}
		return false;
	}
}
```

```php:fuel/app/bootstrap.php
Autoloader::add_classes(array(
	'Validation' => APPPATH.'classes/validation.php',
));
```

## ControllerからValidationを渡す

```php
public function action_create(){
...
    $val = Model_Item::validation('create')
    if( $val->run() ){
    }
    $this->template->content = View::forge('item/create',array('val'=>$val));
...
```

## Viewでフィールド毎にclassを出力

```php
		<div class="form-group<?php echo ($errors && $val->error('title'))?" has-error":""; ?><?php echo ($val->is_required('title'))?' required':'';?>">
			<?php echo Form::label(__('model.topic.title'), 'title', array('class'=>'control-label')); ?>

			<?php echo Form::input('title', Input::post('title', isset($item) ? $item->title : ''), array('class' => 'form-control', 'placeholder'=>'')); ?>

		</div>
```

## CSSで修飾

```css
.form-group.required label:after{
  content:'*';
  color:#a94442;
  font-weight:bold;
  display:inline-block;
  margin-left:0.5em;
}
```

## 結果サンプル

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/64098/20a0b96e-abb7-89f0-ee8f-45888b182b14.png)
[JAWS-UG CLI] AWSアカウント(root)作業 #3 請求関連の設定

AWSアカウントを作成したらやっておきたいことのうち、請求関連の設定をマネジメントコンソールから実施します。

# 前提条件

- AWSアカウント(root)が必要です。


# 1. Billing情報へのIAMアクセスの許可

デフォルトで、Billing情報にはAWSアカウントのみアクセスが可能です。
AWSアカウントの利用が非推奨なので、Billing情報に対するIAMからのアクセスを許可しておきます。

## 1.1. Account Settingへのアクセス

https://console.aws.amazon.com/billing/home?#/account にアクセスします。


## 1.2. IAM User Access to Billing Informationの設定変更

1. "IAM User Access to Billing Information"の"Edit"リンクをクリックします。

2. "Activate IAM Access"チェックをOnにし、"Update"ボタンをクリックします。


3. "IAM User Access to Billing Information"の表示が"IAM user access to billing information is activated."に変化します。



# 2. Billingレポート用S3バケットの作成

## 2.1. リージョンの決定

バケットを作成するリージョンを決定します。

- S3のストレージコストが安い候補 (2015-02-02時点)
  - 米国スタンダード (us-east-1) [独自仕様に注意]
  - オレゴン (us-west-2)
  - アイルランド (eu-west-1)
  - シンガポール (ap-southeast-1)

## 2.2. バケット名の決定

ここでは、下記を命名規則とします。

組織名-プロジェクト名-billing


## 2.3. S3マネジメントコンソールへのアクセス

https://console.aws.amazon.com/s3/home にアクセスします。


## 2.4. バケットの作成

- "Create Bucket"ボタンをクリックします。
- 以下を入力します。
  - Bucket Name:	
  - Region:	

- "Create"ボタンをクリックします。


## 2.5. 事後確認

バケット一覧に作成したバケットが表示されたことを確認します。


# 3. Billing関連の設定

## 3.1. Billing関連の設定 (その1)

### 1. Preference画面へのアクセス

https://console.aws.amazon.com/billing/home#/preferences にアクセスします。

### 2. Receive PDF Invoice By EmailとReceive Billing Alertsの有効化

以下のチェックボックスをOnにします。

- Receive PDF Invoice By Email
- Receive Billing Alerts

Receive Billing Alertsは一旦OnにするとOffにはできないようです。


- "Save preferences"ボタンをクリックします。

### 3. Billingレポート用バケットポリシーの取得

- "Save to S3 Bucket:"欄に、Billingレポート用に作成したバケット名を入力します。

- すぐ下に"sample policy"リンクが表示されるので、クリックします。

- 表示されたSample Policyをコピーします。


## 3.2. バケットポリシーの適用

- S3マネジメントコンソール https://console.aws.amazon.com/s3/home にアクセスします。

- Billingレポート用バケットを選択し、”Properties”ボタンをクリックします。
- "Permission"タブをクリックして展開します。
- "add bucket policy"ボタンをクリックします。
- 先程コピーしたバケットポリシーを貼り付けます。
- "Save"ボタンをクリックします。


## 3.3. Billing関連の設定 (その2)

- https://console.aws.amazon.com/billing/home#/preferences にアクセスします。

- Receive Billing ReportsのチェックボックスをOnにします。
- "Save to S3 Bucket:"欄に、Billingレポート用に作成したバケット名を入力します。
- "Verify"ボタンをクリックします。
- "Valid Bucket"と緑のチェックマークが表示されれば、正常に設定がされています。

- 以下のチェックボックスをOnにします。
  - Monthly report
  - Detailed billing report
  - Cost allocation report
  - Detailed billing report with resources and tags

- "Save preferences"ボタンをクリックします。


# 完了
Bootstrap2と3でのカラー変数の違い

# 背景
[Ruby on Rails チュートリアル](http://railstutorial.jp/)を参考に、``Bootstrap3``を用いてWebアプリケーションの作成を行っている際、チュートリアルとのバージョンの違い（チュートリアルは``Bootstrap2``）により、Bootstrapフレームワークで定義されているカラー変数の参照がうまくできませんでした。

# 問題
[Rails Tutorial 5.2.2](http://railstutorial.jp/chapters/filling-in-the-layout?version=4.0#sec-5_2_2_2)では、下記の通りになっていますが、Bootstrap3では変数名のネーミングが変わっており、このままでは参照できません。

```scss:custom.css.scss
color: $grayLight;
```

# 解決
公式ドキュメントを見たところ、変数名のネーミングがキャメルケースからチェインケースに変化しておりました。つまり、``grayLight``は``gray-light``になっています。

したがって、以下の通りに変更すれば、問題なく参照できます。

```scss:custom.css.scss
color: $gray-light;
```

# 参考文献
- [Bootstrap 2.0.4: 公式ドキュメント/ LESS変数一覧](http://bootstrapdocs.com/v2.0.4/docs/less.html)
- [Bootstrap 3.2.0: 公式ドキュメント/ LESS変数一覧](http://bootstrapdocs.com/v3.2.0/docs/css/#less)
Resource ファイル関連のクリーンアップ


# 正規表現による検索

## マルチバイトを含む文字のベタ書き

### ターゲット

```
String text = "12あ3";
```

```
<View
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="あいうえお" />
```

### 正規表現
> ".\*[^\x01-\x7E].\*"

## カラーコードのベタ書き
### ターゲット

```
<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="#dddddd" />
```

### 正規表現
> "#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})"

### ターゲット
```
view.setBackgroundColor(0xffdddddd);
```

### 正規表現
> 0x([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})


# Lint によるチェック

[Analyze] - [Inspect Code] - Module 'app' を選択後、OKボタンをクリック。
こんな感じで結果が出ます。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/39324/8e16d56e-a1c0-13f6-2563-578950867b01.png "qiita.png")


### ハードコーディングしているテキスト

プロジェクト名 > Android Lint > Hardcoded text

### 使用していないリソースの一覧

プロジェクト名 > Android Lint > Unused resources

他にもいろいろとチェックしてくれます。
RSpec3でspec/support内のファイルを読み込む

# 背景
[Ruby on Rails チュートリアル](http://railstutorial.jp/)を参考に、``Rails 4.2.0``と``RSpec 3.1.7``でWebアプリケーションの作成を行っている際、チュートリアルとのバージョンの違い（チュートリアルは``RSpec2``）により、``spec/support``ディレクトリ内のファイルが読み込まれない問題が発生しました。

# 問題
[Rails Tutorial 5.3.4](http://railstutorial.jp/chapters/filling-in-the-layout?version=4.0#sec-pretty_rspec)では、``spec/support/utilities.rb``にRSpecのテストで共通で使用したいメソッドを記述すればよいと、以下の通り書かれております。

> spec/supportディレクトリはRSpecによって自動的に読み込まれる

しかし、RSpec3では、単純に``spec/support/``にファイルを追加しても、読み込んでくれませんでした。どうやら原因は、``spec/rails_helper.rb``がデフォルトでは``spec/support/``を自動的に読み込まない設定になっていたのが原因なようです。

# 解決
下記のコードが自動で``spec/support/``を読み込む設定なのですが、デフォルトではコメントアウトされていました。こいつのコメントアウトを外してやります。すると、うまくいきました。

```ruby:spec/rails_helper.rb
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
```