OmniAICreator/Qiita-1.07M huggingface dataset:
【祝】ImageMagickがついにGithubデビューしました！

ImageMagickは長年Subverisionで開発されており、パッチを投げるには掲示板でアカウント登録してパッチを貼り付ける必要がありました。

掲示板: http://www.imagemagick.org/discourse-server/


先日、ついにGithubにレポジトリを開設したようです。

https://github.com/ImageMagick/ImageMagick

これで最新のソースコードを取得するのが楽にできるようになりました。
よかったよかった。

<blockquote class="twitter-tweet" lang="en"><p lang="en" dir="ltr">We now have a mirror of our SVN repository available on github: <a href="https://t.co/LbrVMczX43">https://t.co/LbrVMczX43</a>. We will be looking forward to pull requests!</p>&mdash; ImageMagick (@ImageMagick) <a href="https://twitter.com/ImageMagick/status/606898137995866113">June 5, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Pull Requestも受け付けると書いてあります。
我こそはと思う人は、Pull Requestを投げてみてはいかがでしょうか。


# ここに至るまでの経緯について

実はここに至るまでは紆余曲折があったようです。

* 2014年3月 SirCmpwnという人がImageMagickにパッチを投げようとする
* パッチの投げ方がわからず、公式サイトをさんさん探しまわてやっとパッチを投稿する
* 数週間音沙汰なし
* ふと最新版のsvnログを見てみたら、自分のパッチがしれっと適用されていたことに気づく。
* ブチ切れ
* 文句を言うために掲示板のアカウントを作成してスレッドを立てる

http://www.imagemagick.org/discourse-server/viewtopic.php?t=25185
 
* 中の人、パッチの当て方について詳しく説明する
* SirCmpwnさん、Githubを使うことを提案する。

> Would you consider using GitHub? It makes your code easily discoverable, does not have problems with spam, and makes it easy to contribute by way of pull requests. You can also do public code reviews with a nice UI and have a nice exchange with the dev offering the changes.

* 中の人、「Subversionで間に合ってるし、将来的には検討するけど今年はこのままにするよ」と回答

> For the short term, Subversion meets our needs and we see no reason to invest the time and energy to switch right now. We may revisit our decision in the future but not this year.

ここで1年の月日が流れる

* 2015年4月、 SirCmpwnさんが「あれから1年たったよ！」と催促
* 中の人、Githubへのアップロード作業を完了させる



# SVNレポジトリとGithubレポジトリの関係について

dlemstraさん(中の人?)いわく、

> Just to be clear we are not moving to git. We will host a mirror of our svn repository at github for now. We will be watching pull request but they will be committed in the svn repository and 'copied' to github. Not saying we will never move to git but this will be it for now.

> It won't be a two way sync. We will look at the pull request and commit the patches to svn. Author information will be lost for now.

「Pull Requestは見るけど、パッチはsvnレポジトリにコミットして、それをGithubにコピーして反映するよ」
とのこと。

ともあれ、これでコントリビュートする敷居はだいぶ下ったと思われます。

ImagickMagick++ !!
jQuery テーブルで相対的にセルを取得するセレクタの書き方

jQueryでテーブルを扱うときのサンプルです。

<table>
<tr>
<td>A1</td><td>B1</td><td>C1</td>
</tr>
<tr>
<td>A2</td><td>B2</td><td>C2</td>
</tr>
<tr>
<td>A3</td><td>B2</td><td>C3</td>
</tr>
</table>

※tdの親はtr、colspanやrowspanは無し、tdでイベントが発生した場合を想定して書いています。
###隣のセルを取得したい
````js
//左
$(this).prev();
//右
$(this).next();
````
[サンプル(jsfiddle)](http://jsfiddle.net/pianoscorejp/e53bvcg0/)

###2つ隣のセルを取得したい
同じ親内の、自分の前後にあるtdをすべて取得し、インデックスでアクセスします。

````js
//左
$(this).prevAll().eq(1);
//右
$(this).nextAll().eq(1);

````
[サンプル](http://jsfiddle.net/pianoscorejp/e53bvcg0/1/)

よって、自分から**n**番目右、あるいは左にあるセルを取得するには

````js
//左
$(this).prevAll().eq(n-1);
//右
$(this).nextAll().eq(n-1);
````
とします。
でも右とか左とか条件分岐したくないなら

````js
//n=-1なら左、n=0なら自身、n=1なら右
$("td",$(this).parent()).eq($(this).index()+n)
````
とすればよいでしょうか。
兄弟要素のtdをすべて取得して、インデックスでアクセスも可能ですが、その場合n=0が隣のセルとなるため、工夫が必要です

````js
//この場合自身を含まない個数のtdが返るため、左隣はn=-1でアクセスできるが、n=0が右となりのセルとなってしまう。
$(this).siblings().eq($(this).index()+n)
````

###上下のセルを取得したい
上記と同じようにprevAll,nextAllで行を指定し、自分のセルの列番号を指定します。

````js
//n個上のセル
$("td",$(this).parent().prevAll(n)).eq($(this).index())
//下のセル
$("td",$(this).parent().nextAll(n)).eq($(this).index())
````
[サンプル](http://jsfiddle.net/pianoscorejp/e53bvcg0/3/)


##まとめ
###自分からかぞえてn行目、m列目のセルを取得する場合
````js
$("tr",$(this).parents("table").eq(0)).eq($(this).parent().index()+n).find("td").eq($(this).index()+m)
````
[サンプル](http://jsfiddle.net/pianoscorejp/e53bvcg0/5/)

###注
td内の要素からアクセスする場合は`$(this)`の部分を

````js
$("hoge").parents("td").eq(0)
````
に置き換えればOK

もっと簡潔な方法ありましたらご教授ください。
Nexus をWindows7にインストール

<h3>前書き</h3>
Maven でサードパーティ製のjarをどのように扱えばよいのかとｲﾝﾀｰﾈｯﾂをｶﾁｶﾁしたところ
インターナルリポジトリを構築するのがよさそうだと判断した。
引き続きｶﾁｶﾁしていたら、 Nexus というWebブラウザ上からMavenリポジトリの管理を行うツールがあることを知ったのでお試しする。
まずはインストールから。

<h3>Nexus をインストール</h3>
サイトを見るとOSS版と商用版があることが判明。
 http://www.sonatype.org/nexus/go/

OSS版をダウンロードする。
今回は手元のWindows7マシンにインストールするので、zipを選択。
そして、warファイルバージョンとJettyがバンドルされたアーカイブバージョンがあるみたいなので、お手軽に試してみたいのでバンドルバージョンを選択した。
 nexus-2.11.3-01-bundle

適当な場所にzipを解凍して配置。
今回はnexusというフォルダを用意した。
bin フォルダに入っているbatファイルを見つけたので、動かしてみる。
<pre>
C:\nexus\nexus-2.11.3-01\bin>nexus.bat
Usage: nexus.bat { console : start : stop : restart : install : uninstall }
続行するには何かキーを押してください . . .
</pre>

サービスとして登録しておくと便利なので、
install して start をする。

<pre>
C:\nexus\nexus-2.11.3-01\bin>nexus.bat install

ログとり忘れ...
</pre>

<pre>
C:\nexus\nexus-2.11.3-01\bin>nexus.bat start
wrapper  | Starting the nexus service...
wrapper  | Waiting to start...
wrapper  | Waiting to start...
wrapper  | Waiting to start...
wrapper  | Waiting to start...
wrapper  | Waiting to start...
wrapper  | Waiting to start...
wrapper  | Waiting to start...
wrapper  | nexus started.
</pre>

started.の文字を確認してから以下のURLにアクセスする。
http://localhost:8081/nexus/

![2015-05-29_09.04.27.jpg](https://qiita-image-store.s3.amazonaws.com/0/59985/9164de85-fc4f-63bb-2540-f88f23045820.jpeg)

てってれー！動いたぞ。
バンドルされているやつだと、かなりお手軽だ。

ログインIDと初期パスワードは以下の通り。
ID:admin
pass:admin123

今日はここまでー！

<hr/>

<h3>memo</h3>
<h4>サービスに登録されていることを確認する</h4>
nexus で登録されている。
![2015061101.png](https://qiita-image-store.s3.amazonaws.com/0/59985/709a15b2-96e5-9c5e-1785-661f12a15a3c.png)

<h4>Nexus を止める</h4>
<pre>
C:\nexus\nexus-2.11.3-01\bin>nexus.bat stop
wrapper  | Stopping the nexus service...
wrapper  | nexus stopped.
</pre>
技術英語 > Inadvertent > うっかりした > Inadvertent changes to global data

引用: Code Complete > Common Problems with Global Data

> Inadvertent changes to global data. You might change the value of global variable in one place and mistakenly think that it has remained unchanged somewhere else. Such a problem is known as a "side effect."

<hr>
http://eow.alc.co.jp/search?q=Inadvertent
> 不注意な、うっかりした

<hr>
https://github.com/churchs19/Shane.Church.Web/tree/master/Shane.Church.Web.v2012/software/gadgets/stirlingweather
> Fixed inadvertent exclusion of current production site

<hr>
オックスフォード現代英英辞典
> inadvertently
> by accident; without intending to
watchOS 2から追加されたWKInterfacePickerメモ

watchOS 2からWKInterfacePickerが使えるようになってました。

https://developer.apple.com/library/prerelease/watchos/documentation/WatchKit/Reference/WKInterfacePicker_class/index.html

iOSで言う `UIPickerView` のWatch版といったところでしょうか。
NDA期間のため、スクリーンショットは自粛します。

特徴は次の通り。

* デジタルクラウンでPickerを回せる
* 各アイテムにはテキストだけでなく、画像も使える（テキストの左に小さく表示される）
* Pickerは複数設置可能
  * フォーカスを合わせるためには `- focusForCrownInput` メソッドを使う
* 選択された値が変わる度に任意のアクションメソッドを呼べる
    * 選択中の index が取れる


<b>サンプルコード：</b>

```objc
@interface InterfaceController()
@property (strong, nonatomic) IBOutlet WKInterfacePicker *picker;
@property (strong, nonatomic) NSArray *pickerItems;
@end

@implementation InterfaceController

- (void)awakeWithContext:(id)context
{
    [super awakeWithContext:context];

    // Configure interface objects here.
    WKPickerItem *pickerItem1 = [WKPickerItem alloc];
    [pickerItem1 setTitle:@"First item"];
    [pickerItem1 setAccessoryImage:[WKImage imageWithImageName:@"Smile"]];
    
    WKPickerItem *pickerItem2 = [WKPickerItem alloc];
    [pickerItem2 setTitle:@"Second item"];
    [pickerItem2 setAccessoryImage:[WKImage imageWithImageName:@"Smile"]];

    WKPickerItem *pickerItem3 = [WKPickerItem alloc];
    [pickerItem3 setTitle:@"Third item"];
    [pickerItem3 setAccessoryImage:[WKImage imageWithImageName:@"Smile"]];

    self.pickerItems = [[NSArray alloc] initWithObjects:pickerItem1, pickerItem2, pickerItem3, nil];
    [self.picker setItems:self.pickerItems];
}

- (IBAction)pickerAction:(NSInteger)value
{
    NSLog(@"value = %d", value);
}
```
ImageMagickを使って画像のキャンバスサイズを拡大する

* 指示内容を画像上に書くのに右側に余白がほしい
* だけど画像数（ページ数）が多すぎていちいちmspaintなどで作業するのはメンドクサイ

*めんどくさいことはワンライナーで解決しよう*

```shell-session
$ cd IMG_DIR
## findのオプションは、適宜調整。今回はpngファイル
$ find . -type f -name -name \*.png -exec convert {} -gravity west -background white -extent 1200x0 {} \;
```

### 解説

コマンド単品だと`convert INPUT_FILENAME -gravity west -background white -extent WIDTHxHEIGHT OUTPUT_FILENAME`

* extentオプションでキャンパスを拡大
  * WIDTHには、現状の横幅+必要な横幅の値（e.g. 横幅800pxの画像に400pxの余白がほしければ、1200px）
  * HEIGHTには、0を指定することで、INPUTの画像の縦幅と同じになる
* gravityオプションで`west`を指定することで左寄せになる。
* backgroundオプションは見たまんまです。
アプリのテスト仕様書テンプレート作った（国内TOPシェアスマホ情報付き 2015/07更新）

※2015/07更新

こんにちは。

最近ふと、「テスト仕様書ってほぼExcelしか見たことないけど、みんな何使ってんだろー」と気になりました。
で、かたっぱしから知人の開発者に聞いてみたところ、仕事ではほぼ全員が
Excelで92%。あとは少数のGoogleスプレッドシートが8%。

理由を聞いてみると、「ずっと使ってる仕様書がExcelだから」「別にExcelだからって困らない」とか、「お客様にテスト結果を納品するから必然的にExcelです」とか。
なるほどね。そりゃ「Excelでいいよ」ってなるね。

ただ、みんな自作のテスト仕様書をもっていて、すこしずつカスタマイズしながら使ってるみたいです。
使いやすいの作ろうとすると、けっこう面倒だし時間もかかりますよね。

「じゃぁ使いやすいExcelのテスト仕様書テンプレートがあったら、使ってもらえそう。」
「はじめてテスト仕様書を作る現場では作る面倒が省けるので重宝するかも。」


__…そんなわけで、アプリのテスト仕様書テンプレートをExcelで作りました。__
皆さん、よかったら使ってください。

##アプリのテスト仕様書テンプレート
機能
・国内TOP10シェアのスマホ情報付き（毎月更新）
・テスト進捗自動計算

ダウンロードは以下より行ってください
・アプリテスト仕様書テンプレート
[http://bit.ly/1D2jd5i](http://bit.ly/1D2jd5i) (15年7月9日更新)
[http://bit.ly/1G3W9I6](http://bit.ly/1G3W9I6) (15年6月9日更新)

シェアの情報は、国内の全スマホ端末保有の[flexfirm](http://www.flexfirm.jp/)の情報を利用していますのでご安心を。
仕様書はExcelファイルなのでPCよりダウンロードしてくださいね。

##もっと便利なVBAマクロ付きテスト仕様書テンプレート
・作成中。以下よりどうぞ改善案やご意見をば。
http://bit.ly/1Ib6X6F

完成したら、あれれちゃんにお知らせするように伝えておきますね！
（あれれちゃんはflexfirmが運営しているtwitterアカウントです。
アプリのテストや検証、その他アプリの有益な情報をtweetしてます。）

よかったらフォローおねがいします。
https://twitter.com/ArereSearch
MAC OS X のPHPは「php-osx.liip.ch」でインストール

MACでのPHPインストールは、なんだか色々とあるけれど。。。

とりあえず、これが一番簡単。
http://php-osx.liip.ch/

### ■ インストール
5.6系の最新版は以下のコマンドでOK
`curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6`
※ 他のバージョンをインストールする場合は、本家を参照

あとは、zshrcや、bash_profileにパスを設定
`export PATH=/usr/local/php5/bin:$PATH`

それと、アップデート時なども、上記のインストールコマンドで配備されます。
その際は、/usr/local/php5/bin/php のシンボリックリンクが最新のバージョンに更新されます。

### ■ 配備先
各リビジョンなど、此方に配備されます。
`/usr/local/php5-*`
ex)
`/usr/local/php5-5.6.9-20150515-130841/`

### ■ 設定ファイル
php.iniは、こちらに配備されます。
`/usr/local/php5/lib/php.ini`、
追加の設定ファイルはに配備されます。
`/usr/local/php5/php.d/`
最終的には、このファイルが上書きされるので、開発で利用するときにでも使ってみると良い。
`/usr/local/php5/php.d/99-liip-developer.ini`
※初期インストール時は、何も記述されていません。

### ■ xdebugの設定
xdebugの設定は手動で次のファイルを設定すればOK
`/usr/local/php5/php.d/50-extension-xdebug.ini`

なにやら情報が足りなかったので、こんな感じにしてみた。

```
[xdebug]
xdebug.remote_enable=true
xdebug.default_enable=on
xdebug.remote_port=9000
xdebug.remote_host=localhost
xdebug.remote_handler=dbgp
xdebug.remote_autostart=true
xdebug.remote_connect_back=true
xdebug.profiler_enable=true
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_name=xdebug-profile-cachegrind.out-%H-%R
xdebug.var_display_max_children = 128
xdebug.var_display_max_data = 2048
xdebug.var_display_max_depth = 128
```

### ■ アンインストール方法
Apacheの設定ファイルが、このPHPを参照しているので、それを変更する。
※ ApacheはMacの初期デフォルト

`/etc/apache2/httpd.conf`

`LoadModuleのphp5_module /usr/local/php5/libphp5.so`
↓
`LoadModuleのphp5_module libexec/apache2/libphp5.so`

配備ファイルの削除
必要に応じて、`/etc/apache2/other` の直下にある、
+php-osx.conf と +entropy-php.conf を削除

それと、対象のPHPディレクトリを削除
`/usr/local/php5-*`
Rails のローカル開発環境を heroku-docker の Dockerfile + docker-compose で

# 背景

heroku-docker のままだと、変更があるたび `heroku docker:start` しないといけなくてめんどくさい。
また、`heroku docker:exec` では `rails g migration` などファイル変更を伴うコマンドの恩恵を得られない。

そこで、Dockerfile 自体は `heroku docker:init` で吐かれたものを使いつつも、開発用にコードを mount したりする docker-compose.yml を用意し、適時コンテナ上で `docker exec` するようにしてみた。
また、rails のコンテナがダミーコマンドで起動したままにすることで、spring の恩恵も得られるようにしている。

# ファイル

## Dockerfile

`heroku docker:init` したまま。

## docker-compose.yml

```
dbdata:
  image: postgres
  command: true
  volumes:
  - /var/lib/postgresql/data

db:
  image: postgres
  volumes_from:
   - dbdata
  ports:
  - 5432:5432

gemdata:
  build: .
  volumes:
  - /app/heroku/bundler

web:
  build: .
  command: watch echo # ダミーコマンドで web container を起動したままにする
  ports:
   - 8080:3000
  environment:
    PATH: /app/src/bin:/app/heroku/node/bin:/app/heroku/bundler/bin:/app/heroku/ruby/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # ./bin にパスを通したい
    GEM_HOME: /app/heroku/bundler
    TERM: xterm # rails console などで色をつけるため
  links:
  - db
  volumes:
  - $PWD:/app/src
  volumes_from:
  - gemdata
```

## 使い方

```
docker-compose up
docker exec -it hogehoge_web_1 bundle install
docker exec -it hogehoge_web_1 rails s -b 0.0.0.0
```

`docker exec -it hogehoge_web_1` というのをコマンド前につけることになる。
spring いらないなら、`docker-compose run` で一貫すればいいと思う。

以下のように `dr` と `de` を用意しておくと便利かも。

```
alias dr='docker-compose run web'
function de() {
  local image_name=$(basename $PWD | sed -e 's/\-//')_web
  local container_id=$(docker ps -f name=$image_name -f status=running -l -q)
  if [ -n "$container_id" ]; then
    docker exec -it $container_id $@
  else
    echo "$image_name is not running" 1>&2
    return 1
  fi
}
```
EC2スポットインスタンスの停止を検知

EC2のスポットインスタンスは激安でとても有り難いのですが、時々相場が跳ね上がって突然**terminate**されてしまうのが難点です。
ですが、以下の方法で、terminateされる約2分前にそれを検知することが出来ますので、データの保全や代わりのインスタンスを起動するなどの対処が可能です。

## 手順

スポットインスタンス上に**/home/ec2-user/ec2_termination_detector.sh**というパスで以下のファイルを作成します。

```bash
#!/bin/bash

while true
  do
    if [ -z $(curl -Is http://169.254.169.254/latest/meta-data/spot/termination-time | head -1 | grep 404 | cut -d \  -f 2) ]
      then
        # もうすぐ停止するので何かしら準備します

        # とりあえずメールする例
        echo "さよなら〜" | mail -s "死ぬ〜" -r from@example.com to@example.com
        break
      else
        sleep 5
    fi
  done
```
このスクリプトは5秒間隔でterminateされそうになってないかチェックします。

`chmod 744 /home/ec2-user/ec2_termination_detector.sh`で実行権限を付与したら、以下の様にバックグラウンドで動かします。

```bash
/home/ec2-user/ec2_termination_detector.sh > /dev/null 2>&1 &
```
PRML§3.3.1 ベイズ線形回帰によるパラメータ分布の収束図を再現する


社内勉強会でぼちぼち進めているPRML、カラーの図版があると真面目に再現したくなります。今回は3.3.1のパラメータの分布の事後確率が収束する様子の図版を再現しました。この図は

1. 直近の観測データ1つによるパラメータの尤度
1. パラメータの事前/事後確率分布
1. 事前/事後確率分布から得たパラメータによるあてはめ結果

の3つからなり、事後確率が収束していく様子が見られて面白いです。
## 前提

- 1次元の入力変数$x$と、1次元の目標変数$t$を考える
- $y(x, w) = w_0 + w_1x$ の線形モデルにあてはめを行なう
- モデルのパラメータ2つの分布は、2変量ガウス分布とする
- ノイズはガウスノイズとする

## 必要な計算部品

観測データから計画行列$\Phi$の作成

```Python
def design_matrix(x):
    return np.array([[1, xi] for xi in x])
```

N回データを観測した後の平均 $m_N = \beta S_N\Phi^{T}t$ を求める関数

```Python
def calc_mn(alpha, beta, x, t):
    Phi = design_matrix(x)
    Sn = calc_Sn(alpha, beta, x)
    return beta * Sn.dot(Phi.T).dot(t)
```

N回データを観測した後の共分散 $S_N = (\alpha I + \beta\Phi^{T}\Phi)^{-1}$ を求める関数

```Python
I = np.identity(2)

def calc_Sn(alpha, beta, x):
    Phi = design_matrix(x)
    return np.linalg.inv(alpha*I + beta*Phi.T.dot(Phi))
```

## 観測データの尤度

観測データは精度$\beta$のガウスノイズが乗る事から、対数尤度関数 

```math
logL(w) = -\frac{\beta}{2}(t-w^{T}\phi(x))^2 + cons
```
を利用する。対数尤度関数でプロットしたい範囲の$w$を求める。

```Python
def calc_likelifood(beta, t, x, w):
    """
    観測値1つの対数尤度を求める
    """
    w = np.array(w)
    phi_x = np.array([1, x])
    return -1 * beta / 2 * (t - w.T.dot(phi_x))**2

def plot_likelifood(beta, t, x, title='', ax=None):
    """
    観測値の尤度のプロット
    """
    w0 = np.linspace(-1, 1, 100)
    w1 = np.linspace(-1, 1, 100)
    W0,W1 = np.meshgrid(w0, w1)
    L = []
    for w0i in w0:
        L.append([calc_likelifood(beta, t, x, [w0i, w1i]) for w1i in w1])

    ax.pcolor(W0, W1, np.array(L).T, cmap=plt.cm.jet, vmax=0, vmin=-1)
    ax.set_xlabel('$w_0$')
    ax.set_ylabel('$w_1$')
    ax.set_title(title)
```

## 事後確率

上記の式で求めた $m_N$と$S_N$をパラメータとした2変量正規分布が$w$の事後確率分布となる、$m_0$と$S_0$の場合は事前確率分布。

```Python
def plot_probability(mean, cov, title='', ax=None):
    """
    確率分布(2変量ガウス)のプロット
    """
    w0 = np.linspace(-1, 1, 100)
    w1 = np.linspace(-1, 1, 100)
    W0,W1 = np.meshgrid(w0, w1)
    P = []
    for w0i in w0:
        P.append([scipy.stats.multivariate_normal.pdf([w0i,w1i], mean, cov) for w1i in w1])
        
    ax.pcolor(W0, W1, np.array(P).T, cmap=plt.cm.jet)
    ax.set_xlabel('$w_0$')
    ax.set_ylabel('$w_1$')
    ax.set_title(title)
```

## データ空間

上記の式で求めた $m_N$と$S_N$をパラメータとした2変量正規分布から$w$を6回サンプリングして、プロットする。

## 結果

データサンプル前
![index.png](https://qiita-image-store.s3.amazonaws.com/0/2130/477655fd-ce63-2841-73af-a13e554b0251.png)

1回データサンプル後
![index2.png](https://qiita-image-store.s3.amazonaws.com/0/2130/ed993c33-4168-5b9c-9634-5084704f3507.png)

8回データサンプル後
![index3.png](https://qiita-image-store.s3.amazonaws.com/0/2130/89dc1552-ab8f-24c6-b3a6-0faca6660b71.png)


できました。全てのコードはgithubにもアップしてあります。
https://github.com/hagino3000/public-ipynb/blob/master/PRML/PRML%203.3.ipynb
EC2上でmysqldumpしてS3にバックアップする

EC2インスタンス上で**mysqldump**を実行して、ダンプファイルを**S3**バケットに送る手順です。

## 事前準備
クレデンシャルの登録をしておきます。

```bash
aws configure set aws_access_key_id <ACCESS_KEY_ID>
aws configure set aws_secret_access_key <SECRET_ACCESS_KEY>
aws configure set default.region ap-northeast-1
# regionは適宜変更のこと
```

バックアップスクリプトを作成します。

/home/ec2-user/backup_db.sh

```bash
#!/bin/bash

# バックアップ対象のDB
databases=(hoge fuga)
for db in ${databases[@]}; do
 filename=/tmp/${db}.sql
 mysqldump --quote-names --skip-lock-tables --single-transaction --flush-logs --master-data=2 $db > $filename
 aws s3 cp $filename s3://<バケット名>
 rm $filename
done
```

DBのバックアップを毎日午前5時に行うように設定します。

```bash
chmod 755 /home/ec2-user/backup_db.sh
(crontab -l; echo "0 5 * * * /home/ec2-user/backup_db.sh > /dev/null 2>&1") | crontab -
```

## 参考
mysqldumpのオプションについては[よく使うmysqldumpのオプションと使用例](http://qiita.com/ryounagaoka/items/7be0479a36c97618907f)をご参考ください。
S3へのバックアップについては、 http://blog.serverfrog.jp/aws-cli-s3/ がよくまとまってます。
crontab設定を追加するワンライナーコマンド

`crontab -e`でいちいちエディタ開いて入力するのではなく、以下の1コマンドでイケます。

```
(crontab -l; echo "0 20 * * * /path/to/cmd > /dev/null 2>&1") | crontab -
```
gitで特定のファイルの更新を禁止する

プロジェクトによっては、そう安々と変更してほしくないファイルが有ったりします。
そこで、特定のファイルの変更をコミット出来なくするGitフックの紹介です。

例えば、**.htaccess**と**lib**ディレクトリ配下の全てのファイルの変更を禁止するには以下の様な**pre-commit**フックを作成します。

.git/hooks/pre-commit

```bash
#!/bin/sh

unchangeable_files=(
  ^\\.htaccess$
  ^lib/.*
)

containsElement () {
  local e
  for e in "${@:2}"; do [[ "$1" =~ $e ]] && return 0; done
  return 1
}

for FILE in `git diff --cached --name-status $against -- | cut -c3-`; do
  if containsElement $FILE "${unchangeable_files[@]}"; then
    echo "$FILE"
    CHANGE_DETECTED=1
  fi
done

if [ "$CHANGE_DETECTED" ]; then
  echo "Failed to commit because of modification of files above."
  exit 1
fi
```

変更禁止ファイルを変更してコミットしようとするとエラーメッセージが表示され、コミットが失敗します。
c言語　バブルソートのソースコードが分かりません

c言語、バブルソートについて
c言語のバブルソートは分かるのですが肝心の
バブルソートを実行する処理のソースコードが分かりません
下に記載してるので、バブルソート処理を分かりやすく教えてくれませんか？
よろしくお願いします

#include<stdio.h>
#define N 10
int main（void）
｛
int data［N］, target;
int i,j,work;
int low, high, middle;
/*数値入力/*
printf（"１０個の数値を入力してください。¥n"）;
for ・（i=0;i<N;i++）
scanf（"%d",&data［i］）;
/*整列/*
for（i=0;i<N;-1;i++）｛
for（j=N-2;j>=i;j--）｛
if（ data［j］> data［j + 1］ ）｛
work = data［j］;
・data［j］= data ［j+1］ ;
data［j+1］=work;
｝
｝
｝
AWSのSNSを使ってrubyからAndroidにプッシュ通知を送る

## Google API Consoleでの準備

1. **Google Cloud Messaging for Android**のステータスを**ON**にする。
2. サーバーアプリケーションのキーを作成する。
	1. 新しいキーを作成をクリック。
	2. **サーバーキー**をクリック。
	2. 許可対象IPアドレスに`0.0.0.0/0`と入力する。
3. 作成したAPIキーを書き留めておく。
4. プロジェクトの**概要**を開いて**プロジェクト番号**を書き留めておく。

## AWSのコンソールでの準備
SNSのAppを作成します。

1. SNSの管理画面で**Add a New App**をクリック。
2. **Application Name**には好きな名前を、**Push Platform**には*Google Cloud Messaging*を、**API Key**には先ほど作成したAPIキーを設定。
3. 作成したAppの**PlatformApplicationArn**を書き留めておく。

## Androidアプリの準備
省略。適当に受信できるアプリを作って下さい。

## aws-sdk gemの追加

Gemfile

```
gem 'aws-sdk', '~> 2'
```

## 送信用rubyプログラム

```rb
sns = Aws::SNS::Client.new(region: 'ap-northeast-1') # regionは環境に合わせて変更

token = "<アプリが送ってきたregistration_id>"

# endpointの作成
app_arn = "SNSのapp_arn"
resp = sns.create_platform_endpoint(
  platform_application_arn: app_arn,
  token: token
)
# endpointのARNの取得
endpoint_arn = resp.endpoint_arn

# endpointの属性は以下のように取得する
resp = sns.get_endpoint_attributes(endpoint_arn: endpoint_arn)
# => #<struct attributes={"Enabled"=>"true", "Token"=>"APA91...XKmHKeA"}>
# Enabled属性は文字列で"true"であることが分かる。

# 同じtokenと同じ属性を持つendpointの作成を再度行うと、同じARNが返ってくる。
resp = sns.create_platform_endpoint(
  platform_application_arn: app_arn,
  token: token,
  attributes: {"Enabled" => "true"}
)
resp.endpoint_arn == endpoint_arn
# => true

# tokenが同じで異なる属性を持つendpointの作成を行おうとするとエラーが発生する
resp = sns.create_platform_endpoint(
  platform_application_arn: app_arn,
  token: token,
  attributes: {"Enabled" => "false"}
)
# => Aws::SNS::Errors::InvalidParameter: Invalid parameter: Token Reason: Endpoint arn:aws:sns:ap-northeast-1...xxxxx already exists with the same Token, but different attributes.

# endpointの属性は以下のように設定する
resp = sns.set_endpoint_attributes(
  endpoint_arn: endpoint_arn,
  attributes: { "Enabled" => "true" }
)

# プッシュ通知の送信
data = {data: {
    text: "hogehoge", 
    post: {
        id: 1, 
        title: "fuga"
    }
}}.to_json.gsub('"', "\\\"")
message = <<-EOD
{"GCM": "#{data}"}
EOD
resp = sns.publish(
  target_arn: endpoint_arn,
  message: message,
  message_structure: "json"
)
```
CloudFormationを試した時のメモ


CloudFormationを試した。以下Cfnとかく。一緒にkumogataをつかった。
CfnはAWSのリソースをプロビジョニングできる。

具体的には「セキュリティグループをつくって、EC2を起動する」みたいなことをJSONで記述することができる。成功した時には各リソースのIDがどうなったのかを出力したりできるようだ。
EC2のUserDataを使えば起動したインスタンスで実行したスクリプトも記述できるのでデプロイをキックしたりもできそうだ。

そんなわけでCfnはAWSで似たような環境を何度もつくる場合に便利である。

Cfnに渡すJSONは設計図のようなもので、変数のようなものを埋め込んだりすることができる。
テンプレートと呼ばれて、サンプルテンプレートが用意されている。

リファレンス
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-reference.html

Cfnにテンプレートを渡すと実際にAWSのリソースが構築される。作成されるリソースをまとめたものをスタックというらしい。
ようするに、スタックを作成するのに、テンプレートが必要となる。

スタックには使用したテンプレートや起動したインスタンスの情報をもっている。スタックを削除すると、このスタックに関連するリソースはすべて破棄される。

JSONをかくのはつらいので、今回は[https://github.com/winebarrel/kumogata](kumogata)のDSLを活用した。

EC2インスタンスの作成とセキュリティグループでポート22と80をあけてみる例。

まずテンプレートとなる`cfn.rb`を作成した。特に変数的な部分はない。

```cfn.rb
AWSTemplateFormatVersion "2010-09-09"

Description (<<-EOS).undent
  CloudFourmation Sample
EOS

Resources do
  WebEC2Instance do
    Type "AWS::EC2::Instance"
    Properties do
      ImageId "ami-cbf90ecb"
      InstanceType "t2.micro"
      KeyName "xxx" # 自分の公開鍵のペア名

      UserData do
        Fn__Base64 (<<-EOS).undent
          #!/bin/bash
          yum install -y httpd
          service httpd start

          echo Hello, World > /var/www/html/index.html
        EOS
      end
    end
  end

  WebServerSecurityGroup do
    Type "AWS::EC2::SecurityGroup"
    Properties do
      GroupDescription "Enable HTTP and SSH access"
      security_groups = ["80","22"].map do |port|
        _{
          IpProtocol "tcp"
          FromPort port
          ToPort port
          CidrIp "0.0.0.0/0"
        }
      end
      SecurityGroupIngress(*security_groups)
    end
  end
end

Outputs do
  WebsiteURL do
    Value 'http://<%= Fn__GetAtt "WebEC2Instance", "PublicDnsName"%>/'.fn_join
  end
end
```

Outputsに記述してある値はスタック生成終了後に出力として閲覧することができる。
URLをいれておくことで生成したウェブサーバにアクセスしやすくしている。

このテンプレートからstackを作成するには
```
$ kumogata create テンプレート名 スタック名
```
となる。具体的には

```
$ kumogata create cfn.rb sample-stack
```

みたいな感じだ。
スタック名は sample-stackとなるので、つくったリソースを削除したい場合は

```
$ kumogata delete sample-stack
```

となる。
kumogataをつかわずにJSONでかいてもあまり差はないがRubyの力をかりて処理がまとめたりできるのが魅力だ。
createする再にスタックを指定しない場合はスタックは削除されてリソースは残った状態になる。

ミドルウェアの設定済のAMIを用意しておいて、アプリケーションデータを保存しておく用のEBSを用意してデプロイコマンドのキックする感じにつかおうかなぁ、とおもっている。

たぶんスタックにテンプレートを再適用して変化部分のみ再実行なんかもできるようだ。
【CSS】CSSを肥大化させないために

一つのクラスで完結するスタイルじゃなく
複数のクラスでスタイル指定する方式の提案


##１．デザインを決める
使用する文字色、サイズなどをきめる。
・赤だったら#cc0000とか
・黒だったら#333333とか
・影とか

使用する線の色、太さ、スタイルなどを決める
・同上

使用する背景色を決める
・同上



##２．決めたデザインに合わせてスタイルクラスを作る

１つのクラスに複数のデザインを持たせない。
ボックスとテキストとボーダー、など分類をある程度きめてプリフィックスで分類。
ベンダープリフィックス等のブラウザの差異は可能な限りクラス定義のなかで吸収させる（ここでは省略・・・）

.txblack{color:#333333;}
.txred{color:#cc0000;}
.txlarge{font-size:x-large;}
.txmiddle{}
.txsmall{font-size:x-small;}
.txshadow{text-shadow:2px 2px 1px #333;}

.bdred{border-color:red;}
.bdthick{border-width:2px;}
.bdthin{border-width:1px;}
.bdsolid{border-style:solid;}
.bdnone{border:none 0px transparent;}

.bxshadow{box-shadow:2px 2px 1px #333;}

など



##３．よく使うスタイルクラスを作る
.txright{text-align:right;}
.txleft{text-align:left;}
.txcenter{text-align:center;}
.txtop{vertical-align:top;}
.txbottom{vertical-align:bottom;}
.txmiddle{vertical-align:middle;}
.bxleft{float:left;}
.bxright{float:right;}
.bxnone{clear:both;}

.dispnone{display:none;}

など



##４．下記のようにして使う

```html
<img src="xxx" alt="xxx" class="bdnone bxleft bxshadow">
<span class="txred txmiddle txshadow">ほげほげ</span>
```
ApacheのSetEnvの落とし穴


以下は期待通りに動かない。

```apache
SetEnv hogehoge

Order allow,deny
Allow from env=hogehoge
```

何故ならSetEnvでセットしたhogehogeが直後のAllowディレクティブで参照できないから。
しかし、以下は期待通りに動く。

```apache
SetEnvIf Request_URI ".*" hogehoge

Order allow,deny
Allow from env=hogehoge
```

SetEnvとSetEnvIfではセットした変数へアクセスできる場所に違いが有る。
前者では直後のAllowディレクティブから参照できないが後者ならできる。
バグか仕様かわからないが気持ちが悪い。

環境変数をセットした場所と、その環境変数へアクセスできる場所との関係は以下のサイトが参考になる。
https://turboflash.wordpress.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/
Activityを持ったライブラリの見た目をカスタマイズできるようにする

UIとしてActivityを持ったライブラリにユーザが見た目をカスタマイズできる機能を付けたかったので方法を調べました。

## やりたいこと

- ライブラリは UI (Activity) を持っている
- 基本はデフォルトのデザインを使用する、ただしカスタマイズも可能にしたい
- カスタマイズはカラーパレットを定義するようなイメージにしたい
    - テーマカラー
    - メイン文字色
    - etc
- ボタン画像なども変更したい
- ライブラリプロジェクトではなくMavenで配布したい
    - ライブラリプロジェクトのリソースを書き換えてのカスタマイズはNG

これらを実現するためにThemeにカスタム項目を定義、利用者側でデフォルトのテーマをオーバーライドする方法を実現します。

## ライブラリ側

res/values/attrs.xmlにカスタム項目を定義します。名前は自由です、コードから値を呼び出すときに使います。

```xml:attrs.xml
<resources>
    <declare-styleable name="CustomTheme">
        <attr name="mainThemeColor" format="color"/>
        <attr name="mainTextColor" format="color"/>
        <attr name="mainScreenBackground" format="reference" />
    </declare-styleable>
</resources>
```

カスタム項目を使用したtheme/styleを作成しカスタム項目を設定します。parentはお好きなものを、カスタム項目以外の値も設定しても構いません。
ここで設定した値がデフォルト値になります。

```xml:themes.xml
<resources>
    <style name="DefaultLibraryTheme" parent="android:Theme">
        <item name="mainThemeColor">#333333</item>
        <item name="mainTextColor">#ffffff</item>
        <item name="mainScreenBackground">@drawable/default_background</item>
    </style>
</resources>
```

レイアウトでカスタム項目の値を使用するには`?attr/[カスタム項目]`という形式で記述します。

```xml:layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              android:background="?attr/mainScreenBackground">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="test style"
        android:layout_gravity="center_vertical"
        android:textColor="?attr/mainTextColor"/>
    <View
        android:background="?attr/mainThemeColor"/>
</LinearLayout>
```

コードから値を利用したい場合は、`context#obtainStyledAttributes`でTypedArrayを取得、カスタム項目の`R.styleable.〜`を使用して値を取得します。

```java
        TypedArray array = context.obtainStyledAttributes(R.styleable.CustomTheme);
        view.setBackground(array.getDrawable(R.styleable.CustomTheme_mainThemeColor));
        array.recycle();
```

## 利用者側

ライブラリを使う側ではライブラリが用意しているデフォルトのテーマを継承してカスタムテーマを作ります。
デフォルト値が設定されているので変更したいところだけ記載すれば良いです。

```xml:themes.xml
<resources>
    <style name="MyTheme" parent="DefaultLibraryTheme">
        <item name="mainThemeColor">#ff0000</item>
        <item name="mainScreenBackground">@drawable/my_main_background</item>
    </style>
</resources>
```

利用側のAndroidManifestでのActivityに作ったカスタムテーマを指定します。

```xml:AndroidManifest.xml
    <!-- カスタムテーマを適用したバージョン -->
    <activity android:name=".HogeLibraryActivity" android:theme="@style/MyTheme">
    <!-- デフォルトテーマを適用したバージョン
    <activity android:name=".HogeLibraryActivity" android:theme="@style/DefaultLibraryTheme">
    -->
```

## おわり

カスタム項目には色やDrawableだけじゃなくstyleも指定できるので、この辺りをうまく使えばかなりカスタマイズ性を高められそうです。
ただ、ライブラリの用途にもよりますがデフォルトで用意するテーマについては、利用側アプリのテーマに合わせられるようparentを複数用意したほうが良いかもしれません。
logrageの使い方

**lograge**はRailsのログをスッキリ表示してくれるツールだ。
こいつが何をやっているか説明する前に、Railsではどのようにログが出力されているかを知る必要がある。
Rails3以降ではログ出力にActiveSupport::Notificationsの仕組みを使うようになった。
これはイベントの発信と受信の仕組みを提供するもので、特定のイベントに反応するリスナーを登録しておくとイベント発生時にそのリスナー(実体はブロック)がコールされる。
Railsでは各種のイベントに応じて、それをログに記録する役割を持つログサブスクライバと呼ばれる物があり、イベントが発生してそれが呼ばれたら、内部でRails.logger(ActiveSupport::Loggerのインスタンス)に対してログ出力させている。

で、logrageは何をするかというと、デフォルトでリッスンしているログサブスクライバをことごとく無効化し、代わりに自分(lograge)がそれらのイベントをリッスンするようにしてるのだ。

## 使い方

Gemfile

```
gem 'lograge'
```

config/environments/development.rb

```rb
config.lograge.enabled = true

  config.lograge.custom_options = lambda do |event|
    {:time => event.time}
  end

  config.log_level = :info
```

これだけで、log/development.logの出力がシンプルになる。
もし、デフォルトのログはそのまま活かしたまま、別にシンプルなログを出したい場合は以下を追加する。

```rb
config.lograge.keep_original_rails_log = true
config.lograge.logger = ActiveSupport::Logger.new "#{Rails.root}/log/lograge_#{Rails.env}.log"
```
これで、log/development.logにはデフォルトのRailsログが、そして、log/lograge_development.logにはシンプルなログが出るようになる。

出力する内容を追加したいときには以下のようにする。
app/application_controller.rb

```rb
def append_info_to_payload(payload)
    super
    payload[:host] = request.host
    payload[:ua] = request.user_agent
end
```

config/environments/development.rb

```rb
config.lograge.custom_options = lambda do |event|
    { time: event.time, host: event.payload[:host], ua: event.payload[:ua] }
end
```

application_controller.rbのコードはActiveSupport::Notificationsのイベントリスナーのブロックに渡すデータをカスタマイズするメソッドで、これはActionControllerに元々定義されているメソッドのオーバーライドをしている。
これによって追加されたデータをdevelopment.rbで使うように設定しているというわけだ。

## 諸々の注意

* エラーが発生した時にはuaとかhostとかはログにあらわれてくれない。
よく使うXPath

**XPath**便利ですよね。でもちょっと時間が経つとパスの指定の仕方をすっかり忘れてしまいます。
備忘録的によくつかうものをまとめておきます。

| パス | 意味 |
| --- | --- |
| / | てっぺん。ルート |
| /html | ルート直下のhtml要素。普通のHTMLなら普通の形 |
| div | 手当たり次第、全部のdiv |
| [@hoge=fuga] | hoge属性がfugaである全ての要素 |
| div[@hoge=fuga] | hoge属性がfugaである全てのdiv |
| [@hoge='3'] | hoge属性が3である全ての要素 |
| /html/body/div/div/div | てっぺんから深い階層のdivをたどる |
| div/div | 全ての「divの中のdiv」。<div id="1"><div id="2"><div id="3"></div></div></div>だとidが2のdivにも3のdivにもマッチ。 |
| div//div | divの直接の子、または子孫であるdiv |
| div/* | divの全ての直接の子 |
| div/*[1] | divの全ての直接の子の中で最初に見つかったもの |
| div/@id | 全てのdivタグのid属性 |
| div/*/@id | divの直接の子の全ての要素のid属性 |
| div//* | divの直接の子、または子孫であるすべての要素 |
| div//*[1] | divの直接の子、または子孫の要素の中で、それぞれの直接の親から見て最初の要素 |
| //div | ルートの直接の子、または子孫である全てのdiv要素 |
(Tips)オブジェクトのソート。複数の数値プロパティ


僕がjavascriptを触りたての遥か昔にどこかで見たソート処理
ちょっと感心したのを覚えてる

(課題) **line,columnで昇順にソートする**

```javascript:input.js
var errors = [
  {line: 1, column: 30, message: 'syntax error'},
  {line: 2, column: 21, message: 'too long'},
  {line: 2, column: 10, message: 'format invalid'},
  {line: 1, column:  5, message: 'delimiter error'}
];

// ここにソート処理をかけ

// 結果
// errors -> [
//  {line: 1, column:  5, message: 'delimiter error'},
//  {line: 1, column: 30, message: 'syntax error'},
//  {line: 2, column: 10, message: 'format invalid'},
//  {line: 2, column: 21, message: 'too long'}
// ];
```

愚直に書くとこんな感じなんだけど

```javascript:sort.js
errors.sort(function(x, y){
  if (x.line < y.line) return -1;
  if (x.line > y.line) return 1;
  if (x.column < y.column) return -1;
  if (x.column > y.column) return 1;
  return 0;
});
```

比較対象が数字なら、次のように短くかけます

```javascript:sort.js
errors.sort(function(x, y){
  return x.line - y.line || x.column - y.column;
});
```

今見ると、それほど不思議ではないんだけど、
ほんと最初に見た時は狐につままれた感じがしましたね
長らく使う事はなかったけど、たまたま機会があったので思い出しメモの投稿です
役立つかもしれない自作の正規表現


## 前提

* これは私個人のメモです。有用かもしれないので一般に公開します。
* メモなのでこれから増えるかもしれません。増えないかもしれません。
* ここで紹介する正規表現はPHPの`preg_*`系関数(PCRE正規表現)で利用できるものになります。[後方参照](http://php.net/manual/ja/regexp.reference.back-references.php)や[再帰的パターン](http://php.net/manual/ja/regexp.reference.recursive.php)なども活用するため、他の正規表現環境で利用できるかは保障しません。
* 記載する正規表現は簡易検証済みです。ただし、検証漏れにより不正確な可能性があります。
* **これは私個人のメモです**。この正規表現を利用した結果について、**私は一切の保障をしません**。利用する場合は事前に検証・動作確認を行ってください。

## ストレートクォーテーションマーク(`"`)で囲まれた、バックスラッシュ(`\`)でエスケープ可能な文字列の抽出

```text
"(?:[^"\\]|\\.)*"
```

## シングルクォーテーション(`'`)で囲まれた、バックスラッシュ(`\`)でエスケープ可能な文字列の抽出

```text
'(?:[^'\\]|\\.)*'
```

## PHPのヒアドキュメント・Nowdocにマッチ

```text
<<<(?P<phpHeredocIdQuote>["']?)(?P<phpHeredocId>[a-zA-Z_][a-zA-Z0-9_]*)(?P=phpHeredocIdQuote)[\r\n][\s\S]*?[\r\n](?P=phpHeredocId)(?=;?[\r\n])
```

### 参考

* [ヒアドキュメント](http://php.net/manual/ja/language.types.string.php#language.types.string.syntax.heredoc)
* [Nowdoc](http://php.net/manual/ja/language.types.string.php#language.types.string.syntax.nowdoc)

## HTMLのclass属性値の、余計なスペース文字にマッチ

文字列内の先頭と末端にある1文字以上のスペース、
および、単語を区切るスペースで、余計な2文字以上のスペースにマッチします。
置換処理にてマッチした箇所を削除することで、HTMLのclass属性値を簡単に最適化できます。

```text
\A[ \t\n\f\r]+|[ \t\n\f\r]+(?=[ \t\n\f\r]|\z)
```

### 例

```php
echo preg_replace(
    '/\A[ \t\n\f\r]+|[ \t\n\f\r]+(?=[ \t\n\f\r]|\z)/',
    '',
    ' xxx  y z   '
);
```

```text:出力
xxx y z
```

### 参考

* [HTML Standard #3.2.5.6 The class attribute](https://html.spec.whatwg.org/multipage/dom.html#classes)
* [HTML Standard #set of space-separated tokens](https://html.spec.whatwg.org/multipage/infrastructure.html#set-of-space-separated-tokens)
* [HTML Standard #space characters](https://html.spec.whatwg.org/multipage/infrastructure.html#space-character)

## インデント以外の余計なスペースにマッチ

例えばコードを書いている時、スペースのみの行ができてしまったり、末尾にスペースが入ってしまう事がある。
そのスペースを置換するための正規表現。
空行にはマッチしない。

```text
(?:(?![\r\n])\s)+(?=[\r\n]|$)
```
RailsでMySQLを使うときのdatabase.yml

RailsでMySQLを使うときのdatabase.ymlはコレです。

```yaml
default: &default
  adapter: mysql2
  host: 127.0.0.1
  username: root
  password:
  encoding: utf8
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: development_database

test:
  <<: *default
  database: test_database

production:
  <<: *default
  database: production_database
```
JavaScriptでjQueryを使わずにイベントをtriggerする

基本的なことなのですが、すぐ忘れるので。。。

JavaScriptでDOMノードの任意のイベントを発火するには以下の様にします。

```js
function triggerEvent(element, event) {
   if (document.createEvent) {
       // IE以外
       var evt = document.createEvent("HTMLEvents");
       evt.initEvent(event, true, true ); // event type, bubbling, cancelable
       return element.dispatchEvent(evt);
   } else {
       // IE
       var evt = document.createEventObject();
       return element.fireEvent("on"+event, evt)
   }
}
```

例えば、mouseoverイベントをトリガーしたければ、以下のようにします。

HTML

```html
<a id="the_link" href="http://google.com">google</a>
```

JavaScript

```js
var a = document.getElementById("the_link");
triggerEvent(a, 'mouseover');
```

## おまけ
clickイベントを発火したいときはもっと簡単です。上みたいな`triggerEvent`メソッドを使う必要はなく

```js
var a = document.getElementById("the_link");
a.click();
```

で大丈夫です。
Apacheでスラッシュで終わるURLのリダイレクトを止める

基本的なことなのですが、よく忘れるのでメモしておきます。

大抵の環境において、Apacheは`http://example.com/hoge`みたいなURLへのリクエストを受けた場合、hogeディレクトリが存在していたら`http://example.com/hoge/`というスラッシュが付いたURLへ301リダイレクトします。

これをやめさせたいときは`DirectorySlash Off`を使います。

具体的には以下の様に設定します。

```apache
<Location /some/path>
    DirectorySlash Off
</Location>
```

上の例では**Location**内で設定してますが、**Directory**の中でも、バーチャルホスト設定の中でも、グローバルコンテキスト(httpd.confにベタ書き)でも大丈夫です。

さらに詳しいことは[公式ドキュメント](http://httpd.apache.org/docs/current/mod/mod_dir.html#directoryslash)を参照して下さい。
コマンドラインから記事を作成する方法


## はじめに

コマンドラインからブログでもQiitaでもなんでも良いですが、何かの文章をポストするっていうのは、意外と簡単なので、そういった仕組みづくりというのをやっておくと便利だと思います。

何か調べものがある時、わざわざブラウザを開いて、コピーして、エディタに、メモしてという手順は、CLIないしは、CUIユーザーとしては非常に面倒なことの一つだったりします。今回は、そんな時に役立つ個人的なTipsを幾つか紹介したいと思います。

ちなみに、CLI(コマンドラインユーザーインターフェース)とCUI(キャラクタユーザーインターフェース)と言うのは、ここではほぼ同じ意味で使用しています。つまり、黒い画面ってことでイメージしてもらえればいいわけですが、具体的には、端末(ターミナル、Terminal)でやるってことですね。私は、CUIって言うことが多いかなあ。GUIと対で使えるので。タイトルはCLIを使ってますが。

## Webから文章を抜き出そう

Webから欲しい文章を取ってくるには、`html2text`というPython製のツールが非常に便利です。これは、HTMLをテキスト形式にして表示してくれるものです。したがって、`wget`, `curl`の出力をそのまま使える形にできますので、お手軽なのです。

```bash:
$ pip install html2text

$ curl -sL http://qiita.com/syui/items/ab6a11aa57df8590d645 | html2text
```

文章を抜き出すには、`peco`を使います。golang製のツールですが、欲しい出力を選択できます。

```bash:
$ go get github.com/peco/peco/cmd/peco

$ curl -sL http://qiita.com/syui/items/ab6a11aa57df8590d645 | html2text | peco
```

ちなみに、`peco`とか`html2text`は非常に使いやすいものなので、global aliasなどを設定しておくといいかもしれません。

```bash:~/.zshrc
alias -g P='|peco'
alias -g H='|html2text'
alias -g J='|jq'
```

これで、以下のようにすると使えます。

```bash:
# ls -A | peco
$ ls -A P
```

## 必要な形式にして出力しよう

JSONでメモをとっている人などは、`jq`が便利です。個人的には、Qiitaのポストとか、ブログへのポストもすべて、JSONでとったメモを自動的に所定の形式にして作ったり、ポストしたりしているわけですが、例えば、こんな感じで記事を作り上げていきます。

![](https://raw.githubusercontent.com/mba-hack/images/master/memo-zsh-01.gif)

```bash:
$ sudo pacman -S jq
```

`json`や`jq`は慣れれば簡単ですが、慣れないと最初は、なかなか使いにくいと思います。一応、参考になるコマンドを幾つか紹介。こんな感じで値を取り出せます。

```json:hoge.json
[
  {
  "title": "json",
  "tags": [ { "name": "json" }, { "name":"text"}, { "name":"golang"}, { "name":"html"}, { "name":"python"} ],
  "body": "hello world",
  "coediting": false,
  "gist": false,
  "private": false,
  "tweet": false
  }
]
```

```bash:
# 全体の値を取り出す
$ cat hoge.json | jq .

# 変換しないで値を取り出す、括弧"を取り除く
$ cat hoge.json | jq -r .

# 括弧[]内をとりあえず取り出す
$ cat hoge.json | jq '.[]'

# 括弧{}の順番で番号指定して取り出す
$ cat hoge.json | jq '.[0]'

# 括弧{}内のtitleの値を指定して取り出す
$ cat hoge.json | jq '.[].title'
$ cat hoge.json | jq '.[]|.title'

# 括弧[]内の値だけ括弧"を除き、すべて取り出す
$ cat hoge.json | jq -r '.[]|.[]'

# tagsをすべて取り出す
$ cat hoge.json | jq '.[].tags|.[].name'

# tagsの個数を指定して取り出す
$ cat hoge.json | jq '.[].tags|.[1,2].name'
```

## 検索して必要な部分を抜き出す

時に検索して必要な文章を取り出したい時があります。そんな時は以下のようなスクリプトを作っておくと便利です。

`$ ./search.sh arch linux json`という感じで使います。

```bash:search.sh
#!/bin/zsh

startpage="https://startpage.com/do/search?q="

case $1 in
    *)
        if [ ! $# = 0 ];then
            keyword=${startpage}`echo "${@}"|tr ' ' '+'`
            echo $keyword
            one_step=`curl -sL ${keyword} | html2text | grep '###' | peco |cut -d"(" -f2 | cut -d")" -f1`
            two_step=`curl -sL ${one_step} | html2text | peco`
            case $OSTYPE in
                darwin*)
                    echo "$two_step"| pbcopy && pbpaste
                ;;
                linux*)
                    echo "$two_step"| xclip -i -sel c && xclip -o -sel c
                ;;
            esac
        else
            echo '
            g <hoge> : google.com/search?q=<hoge>
            '
        fi
        ;;
    h|-h|-[hH]elp|--[hH]elp)
        echo '
        g <hoge> : google.com/search?q=<hoge>
        '
        ;;
esac
```
  '
Apacheのログ出力の要点

## ログフォーマット文字列
以下がApacheのログフォーマットに使用する文字列です。
私個人が重要だと思う順で並べてます。

| フォーマット文字列 | 意味 |
| --- | --- |
| %t | リクエスト時刻 |
| %a | リモートIPアドレス |
| %>s | HTTPステータス |
| %D | リクエスト処理にかかった時間(マイクロ秒) |
| %m | リクエストメソッド |
| %U | URLのパス部分。クエリ文字列は含まない |
| %q | クエリストリング |
| %{Referer}i | リファラ |
| %{User-Agent}i | ユーザーエージェント | 
| %{Foobar}i | リクエスト中の*Foobar**ヘッダの内容。よく使うものは後述。 |
| %{Foobar}C | リクエスト中の*Foobar*クッキーの値 |
| %I | 受信バイト数(ヘッダ含む)。利用にはmod_logioが必要。l(エル)ではなくI(アイ) |
| %O | 送信バイト数。利用にはmod_logioが必要 |
| %b | レスポンスのバイト数(HTTPヘッダは除く)。CLFフォーマット、つまり1バイトとも送られなかった場合は`-`になる |
| %B | レスポンスのバイト数(HTTPヘッダは除く)。 |
| %A | ローカルIPアドレス |
| %f | URLから導き出されたファイルシステム上のファイル名。このファイル名のファイルが存在するとは限らない。 |
| %s | HTTPステータス。内部でリダイレクトされた場合は最初のステータス |
| %{FOOBAR}e | 環境変数*FOOBAR*の値 |
| %H | リクエストプロトコル |
| %{Foobar}o | レスポンス中の*Foobar*ヘッダの内容 |
| %p | サーバーのポート |
| %P | リクエストを処理した子プロセスのプロセスID |
| %{format}t | リクエスト時刻(*format*で指定した書式) |
| %T | リクエスト処理にかかった時間(秒) |
| %v | サーバー名(ServerName) |
| %V | サーバー名(UseCanonicalNameの設定によるもの) |
| %l | リモートログ名。mod_identを使っていない限り`-`になる。I(アイ)ではなくl(エル)。 |
| %u | Basic認証のユーザー名 |
| %h | クライアントのホスト名またはIPアドレス。`HostnameLookups`が`On`に設定されている場合のみホスト名の解決を試みる |
| %r | リクエストの最初の行 | 
| %X | 応答が完了した時の接続ステータス。(X: 応答完了前に接続が異常終了、+: 応答完了後に接続維持が可能、-: 応答完了後に接続断) |
| %% | パーセント文字 |

## ログ設定方法
**Apache**のログフォーマットは*httpd.conf*などに以下のように予め何パターンか定義されています。

``` .conf
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
```

そして、サーバーの設定やバーチャルホストの設定で、以下のようにログのパスと使用するフォーマットを選びます。

```apache
CustomLog logs/access_log common
```

使用するログのフォーマットは自分で定義することができます。
*httpd.conf*に以下のような行を追記するだけです。

```apache
LogFormat "%t %a %>s" ore_no_format
```

自分で定義したフォーマットを使用するのも、通常のフォーマット同様に以下のようにします。

```apache
CustomLog logs/access_log ore_no_format
```

## combinedのログの出力例

```log
202.241.168.146 - - [18/Jan/2015:03:10:20 +0900] "GET /images/logo.png HTTP/1.1" 404 313 "http://tech.artizan.co/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
```

## LTSVで出力する例
私がよく使うのは以下の様にLTSV形式のフォーマットです。
実際は改行はありません。

```apache
LogFormat "ts:%t\\t
ip:%a\\t
status:%>s\\t
method:%m\\t
path:%U\\t
query:%q\\t
referer:%{Referer}i\\t
ua:%{User-Agent}i\\t
usec:%D\\t
received:%I\\t
sent:%O" ltsv
```

<!-- 上の例ではタブ文字の前に余計なエスケープがあるが、これはWordPressの仕様に合わせてやむなくつけている -->
1x1ピクセルの透過GIF


時々、1x1ピクセルの透明なGIFが必要になることがあるのでここに置いておきます。

[1x1ピクセルの透過GIF](https://qiita-image-store.s3.amazonaws.com/0/66753/4fcc44cd-6261-a723-e9c6-8c6c43af5cc7.gif)

時々、こういう画像を動的に生成したいことが有ります。
そういう場合はこうします。
PHPでの例です。

``` .php
header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==');
```
![1x1_transparent.gif](https://qiita-image-store.s3.amazonaws.com/0/66753/4fcc44cd-6261-a723-e9c6-8c6c43af5cc7.gif)
DNSのTXTレコードのSPF設定の要点

サーバーから送信したメールがスパムとして弾かれるのを防ぐために、DNSのTXTレコードのSPF設定をする必要があります。
でも、滅多にやる作業ではないので毎回どう書けばいいのか忘れてしまいがちです。

結局、書く内容はほとんどの場合、以下でOKです。

```
v=spf1 +mx ~all
```

## 解説
v=spf1までは決まり文句です。

+mxはmxレコードに指定されているIPから送信するよという宣言です。

~allもほぼ決まり文句で最後につけます。
意味としてはその他の送信元からメールを送信することは基本的に無いですよって感じですね。

ちなみに+(プラス)記号は省略してもOKです。
それから、下のようにスペース区切りで複数の送信元を書いてもOKです。

```
v=spf1 +mx +ip4:132.123.33.22 ~all
```

これの意味は、MXレコードに指定されているIPと132.123.33.22からメールを送るということです。

## 参考資料+α
きちんと勉強したければ
[http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/](http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/)あたりを読むといいです。

SPFレコードがちゃんと設定されているかは[http://www.kitterman.com/spf/validate.html](http://www.kitterman.com/spf/validate.html)あたりで調べるといいでしょう。
Mac OSXで使用するJavaのバージョンを簡単に切り替える方法

JDK1.6が既にインストールされているとして、JDK1.7をインストールし、それらを簡単に切り替えられるようにする方法です。
もちろん、JDK1.8でも同様に出来ます。

## JDK1.7のインストール
[Oracleのダウンロードページ](http://www.oracle.com/technetwork/java/javase/downloads/index.html)からDLして普通にインストールします。

## インストールされているJavaを一覧表示

```
/usr/libexec/java_home -V
```

## 使用するJavaのバージョンを切り替える

**~/.bash_profile**や**~/.zshrc**に以下のシェル関数を定義します。
こうしておくと、ターミナル起動時にJDK 1.7が使われるよう、**$JAVA_HOME**と**$PATH**が設定されます。

``` .sh
function setjdk() {
  if [ $# -ne 0 ]; then
   removeFromPath '/System/Library/Frameworks/JavaVM.framework/Home/bin'
   if [ -n "${JAVA_HOME+x}" ]; then
    removeFromPath $JAVA_HOME
   fi
   export JAVA_HOME=`/usr/libexec/java_home -v $@`
   export PATH=$JAVA_HOME/bin:$PATH
  fi
 }
 function removeFromPath() {
  export PATH=$(echo $PATH | sed -E -e "s;:$1;;" -e "s;$1:?;;")
 }
# ログイン時にJDK1.7に切り替える
setjdk 1.7
```

JDK1.6に切り替えるには以下のようにします。
指定するバージョンには全ての桁を書く必要はなく、特定できれば一部だけでOKです。

``` .sh
$ setjdk 1.6

# 切り替わったことを確認
$ java -version
=> java version "1.6.0_65"
```
Androidで表示しているActivity名を取得する

下記のようにActivityのgetComponentName()から、フルパッケージを含むクラス名を取得できます。

```java
package jp.hitting;

class HogeClass extends Activity {

    void hoge() {
        getComponentName().getClassName(); // jp.hitting.HogeClass
    }

}
```

getComponentName()で取得できるComponentNameからは、フルパッケージを含むクラス名の他に、パッケージを短縮したクラス名や、パッケージ名のみを取得することができます。
Swiftでリンク検出（標準APIで検出する場合とカスタムクラスの2パターン）

#Swiftでリンク検出（標準APIで検出する場合とカスタムクラスの2パターン）

		
##実現方法
①正規表現書かなくていい場合
NSDataDetectorでリンク検出

```swift
let msg:NSString = "http://hoge.com"
let dataDetector =  NSDataDetector(types:NSTextCheckingType.Link.rawValue, error: nil)
        
let resultArray:NSArray = dataDetector?.matchesInString(msg as String!, options: nil, range: NSMakeRange(0, msg.length)) as NSArray!
        
for result in resultArray {
    if result.resultType == NSTextCheckingType.Link {
        var url:NSURL! = result.URL!
        linkExist = true
    }
}

```

②自前で用意する場合

```swift

class Regex {
    let internalExpression: NSRegularExpression
    let pattern: String
    
    init(_ pattern: String) {
        self.pattern = pattern
        var error: NSError?
        self.internalExpression = NSRegularExpression(pattern: pattern, options: .CaseInsensitive, error: &error)!
    }
    
    func test(input: String) -> Bool {
        let matches = self.internalExpression.matchesInString(input, options: nil, range:NSMakeRange(0, count(input)))
        return matches.count > 0
    }
}

if Regex("^https?://.*").test("http://hoge.com") {	
	// linkExist
}

```

##参考
NSDataDetector Class Reference
https://developer.apple.com/library/prerelease/ios/documentation/Foundation/Reference/NSDataDetector_Class/index.html

Regex in Swift
http://benscheirman.com/2014/06/regex-in-swift/
Oracle Database 11g Express Edition -ただでOracleのデータベース使いましょう。

みんなさんはほとんど、OOPデータベース（MySQL,PostGre,sqlite...)を使っているらしいです。
Oracleのデータベースは使ってみましょう。
環境：
１．Windows 7 64bit 
２．Java　7.9
３．Oracle Database Express Edition 11g Release 2　（2014年6月）
最初は、Oracleホームに入りました、12gが出てきましたが、ぜんぜん使えません。なぜかというと、無償の商品ではないらしいです。
しかし、11g Express Editionは無償で使えます。よかった、ダウンロードします。
１．Oracleのフリーアカウントを登録します。
２．下のリンクを入ります。
http://www.oracle.com/technetwork/jp/database/database-technologies/express-edition/downloads/index.html

「Oracle Database Express Edition 11g Release 2 for Windows x64」をダウンロードしました。

３．ダウンロードしてから、セットアップします。全部、Defaultの設定でインストールしました。SysアンドSystemのパスワードだけ、入力しました。

４．インストールがおわったら、Desktopにこのアイコンがあります。
![screenshot.5.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/8d08fe5f-cafc-81a3-0cdd-7f6d60f82fc0.jpeg)

５．実行すると、
A.エラーの場合は、
１．「http://127.0.0.1:%HTTPPORT%/apex/f?p=4950」が間違いというダイアログが表示される
２．下のように変更します。
アイコンに右クリックして、「ファイルの場所を開く」－＞「Get Started」のショットカットに右クリック、リンクのところを
http://127.0.0.1:8080/apex/f?p=4950　に変更します。
⇒もう一回、Desktopにあるアイコンをクリックすると、ウエブブラウザーが出てきます。IdはSystem　とパスワードは、設定したときに、入力したのです。
![screenshot.6.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/f7bd8ffd-f793-88cd-d6bd-a50a78390c9e.jpeg)

「Application　Express」をクリックして、新しいデータベースを作ります。
３．テストのため、データベースをつくります。
DBName : test
UserName : test01
Pass: hoge123

B.問題のない場合は：
　Desktopにあるアイコンをクリックすると、ウエブブラウザーが出てきます。IdはSystem　とパスワードは、設定したときに、入力したのです。「Application　Express」をクリックして、新しいデータベースを作ります。

６．Start > Oracle Database 11g Express Edition > SQLコマンドライの実行 を実行します。
下のコマンドを入力する：

SQL>connect test
パスワードを入力してください：(hoge123)
接続しました。
SQL>_

Tableをつくり、データを挿入することもOKです。完了です。

●便利なコマンド：
１．Adminのウエブサイト
http://127.0.0.1:8080/apex/apex_admin
（User:admin pass:インストールしたときのパスワード）
２．Create tablespace コマンド：
例：
CREATE BIGFILE TABLESPACE [tablespace名]
  DATAFILE '[tablespaceファイル名].dbf'
  SIZE 20M AUTOEXTEND ON;

アップデート：
サブレットやJDBCを使って、データベースにアクセスしてみました。
注意：
<code>
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","[username]","[password]");
//DefaultHost は　[XE] です。
</code>