OmniAICreator/Qiita-1.07M huggingface dataset:
eclipseインストールしたらとりあえずやること

# eclipse settings  
  
## エディタをVimライクにする
1. vrapperを入れる(マーケットプレースから)
2. .vrapperrcを置く  
Windowsの場合、`C:\Users\{ユーザ名}` の直下  
Macの場合、    `/Users/{ユーザ名}` の直下  
参考：[Eclipseのキーバインドをvim風にできるVrapperが素晴らしすぎる件について](http://yuroyoro.hatenablog.com/entry/20100218/1266477264)

## プラグイン入れる

* checkstyleplugin  
* findbugs  
* web tool
  * htmlとjsを読みやすく

  >  ソフトウェアアップデートから
    http://download.eclipse.org/releases/kepler/
    を選択  

* Quick JUnit  

  * JUnitでのテストコードの作成実装支援

  >    Ctrl + 9 : テストクラスと行き来
  >    Ctrl + 0 : テストクラス実行  

```
    src
    ├─main
    │  ├─java
    │  └─resources
    ├─build
    └─test
        ├─java
        └─resources
```

* EclEmma カバレッジ計測プラグインを入れる(マーケットプレースから)
* Properties Editor
* AnyEdit  
  * 末尾の空白を除去
  * タブ <-> スペースの変換
  など  

以下はプロジェクトによる  

* JMockit  
* lombok  
  1. [Project Lombok - Download](http://projectlombok.org/download.html)からlombok.jarを取得する  
  2. `$ java -jar lombok.jar` でeclipseにインストールする


* gradle  


## 色テーマを変更する  
http://revelism.exblog.jp/19781316/  


## フォントサイズ 変更＠kepler  
メニューから [ウィンドウ] -> [設定] を開き、[一般] - [外観] - [色とフォント] の [基本] - [テキスト・フォント] 
javaも直しておく。  


## 注釈のカラー変更  
eclipse Window -> preferences -> General -> Editors -> Text Editors -> Annotations  
OccurrencesのColorを変更  

## テキストファイルのエンコーディング設定をUTF-8にする
Preferences -> General -> Workspace  
Text file encoding をUTF-8に

## ワイルドカードでのstaticインポートの許可
Preferences -> Java -> Organize Imports  
Number of static imports needs for .* の値を99→1に

## ファイルの保存時に不要なimport文を削除する  
Preferences -> Java -> Editor -> Save Actions  
Perform the selected actions on save  
Organize imports にチェックを入れる  

## JUnit用テンプレートのインポート  
Preferences -> Java -> Editor -> Templates  
Importから[templates.xml](https://github.com/shuji/practice-junit/blob/master/others/templates.xml)をインポート  

* test(Ctrl+Space) でテストメソッドの作成  
* at(Ctrl+Space) でアサーションの作成
* setUp(Ctrl+Space) で初期化メソッドの作成
* tearDown(Ctrl+Space) で後処理メソッドの作成

## プロダクションコードのみCheckStyle対象にする  
プロジェクト選択 -> Checkstyle

1. シンプル構成を使用するのチェックを外す
1. ファイル・セット "すべて" のチェックを外す
1. 拡張の追加ボタン押下
    1. ファイル・セット名 includeSrc(分かれば何でもよい)
    1. チェック構成 自分のプロジェクトのチェックスタイルを指定する
    1. .java$ のチェックを外す
    1. 新規で ^src￥.* を定義し、チェックを付ける
    1. OK -> OK

## Maven targetフォルダをsvn管理対象外にする
設定 -> チーム -> 無視するリソース に ```*/target/*``` を追加

## eclipse javadoc 日本語化  
http://docs.oracle.com/javase/jp/7/api/  
http://hichon.cocolog-nifty.com/blog/2011/09/eclipse-api-fe6.html#N10174  

java7だとmergedocでエラーが出る模様  
http://sourceforge.jp/ticket/browse.php?group_id=685&tid=32232

# TIPS

1. Ctrl+. で次の注釈
1. Ctrl+1 でクイックフィックス
1. Ctrl+o でクイックアウトライン
CentOS6へのMavenインストール


## 前提条件
+ JDK1.7系インストール済

## 下準備
公式で最新バージョンのバイナリダウンロードURLを確認
http://maven.apache.org/download.cgi


```
$ wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz
$ tar zxvf apache-maven-3.2.1-bin.tar.gz
```

## インストール
好きなところへ配置するだけ

```
$ mv ./apache-maven-3.2.1 /usr/local/apache-maven
```


## 設定
そのままでは動かないので環境変数設定

```
$ vim /etc/profile.d/maven.sh
+ export M2_HOME=/usr/local/apache-maven
+ export M2=$M2_HOME/bin
+ export MAVEN_OPTS="-Xms256m -Xmx512m"
+ export PATH=$M2:$PATH
```


## 確認

```
mvn --version
Apache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-15T02:37:52+09:00)
Maven home: /usr/local/apache-maven
Java version: 1.7.0_51, vendor: Oracle Corporation
Java home: /usr/java/jdk1.7.0_51/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-358.18.1.el6.x86_64", arch: "amd64", family: "unix"
```
ランダムなパスワードを1行で生成する with openssl

PHP 5.3 以上で openssl 拡張が必要。

# その１

```php
<?php
function random($n = 8)
{
    return substr(base_convert(bin2hex(openssl_random_pseudo_bytes($n)),16,36),0,$n);
}
```

# その２

```php
<?php
function random($n = 8)
{
    return strtr(substr(base64_encode(openssl_random_pseudo_bytes($n)),0,$n),'/+','_-');
}
```
iptablesを使ってLBからの流入を遮断する

こういうネタは需要があるのかわかりませんが、昔やったことを残しておきます。

LoadBalancer配下のアプリサーバが異常をきたしてLBから切り離しするってのは良くあることだと思います。

けど、接続数があふれて接続できないといったLBで検知可能な異常だったらLB側で制御可能ですが、接続できるけどなんか不調っていう状況だと、LBで切り離しを制御するのって難しいですよね。

こんな時はアプリサーバ側で異常検知をする仕組みを作って、iptablesでLBからの流入を遮断しちゃいましょう。

```bash
if [ 異常発生？ ] 
then
  NUM=`/sbin/iptables -L INPUT -n --line-number | grep dpt:80 | awk '{print $1}'`
  /sbin/iptables -I INPUT ${NUM} -m state --state NEW -s {LBのIP/mask} -p tcp --dport 80 -j REJECT
fi
```

今回の例だとLB配下のWebアプリサーバを想定しているので、80番ポートへのアクセス許可をしているINPUTルールの番号 ${NUM} を調べて、その直前にsource IPがLBのIPアドレスだったら新規の接続はREJECTするよ、というルールを iptables の-Iオプションで挿入するのがポイントです。

REJECTにしとくとLBからのsynに対して即時にエラーパケットを返すのですが、DROPだとパケットを捨てて何も応答を返さないので、LB側はパケロスと誤認しちゃって輻輳制御と同様のsynの再接続処理に陥ってしまいます。

あとは上記のスクリプトに、異常検知やすでにREJECTルールが存在する時などの例外処理の肉付けをしていけばいい感じになるんじゃないでしょうか。
※異常によってはアプリサーバ全台切り離されるかもしれないのが悩ましいところですが・・・

異常状態から復旧する際は、REJECTのルールを削除すればいいので、REJECTルールの番号を調べて、その番号を削除するコマンドを iptables の-Dオプションで投げればOKです。

```bash
NUM=`/sbin/iptables -L INPUT -n --line-number | grep dpt:80 | grep REJECT | awk '{print $1}'`
/sbin/iptables -D INPUT ${NUM}
```

ではでは。
【CakePHP】リダイレクト先でメッセージを表示する(setFlashとflash)

リダイレクト先メッセージを出す場合に使用する。

##使い方

SessionComponentの設定を行う。

```php:コントローラ
public $components = array('Session');
```

SessionComponentへメッセージの登録を行う。

```php:コントローラ
$this->Session->setFlash('メッセージ');
```

SessionHelperを使いセッションより取得して表示する。

```php:ビュー
<?php echo $this->Session->flash(); ?>
```

##使用するレイアウトを変更する
```php:コントローラ
$this->Session->setFlash('メッセージ','flash_success');
```
```php:ビュー
<?php echo $this->Session->flash(); ?>
```
/views/elementsフォルダに、flash_success.ctpを用意する。

```php:flash_success.ctp
<div>
    <?php echo $message; ?>
</div>
```

参考：[CakePHP setFlashで出力されるメッセージのスタイルを変える方法](http://hijiriworld.com/web/cakephp-setflash/)
C#: BouncyCastleのAES Key Wrap (RFC3394)


AESでKEK(Key Encryption Key:16,24,32オクテット)でCEK(Content Encryption Key)をラップ:

```csharp
       public static byte[] Wrap(byte[] kek, byte[] plaint)
        {
            // using Org.BouncyCastle.Crypto.Engines;
            var en = new AesWrapEngine();

            //  Org.BouncyCastle.Crypto.Parameters;
            en.Init(true, new KeyParameter(kek));

            return en.Wrap(plaint, 0, plaint.Length);
        }
```

同じくラップをほどく:


```csharp

        public static byte[] Unwrap(byte[] kek, byte[] ciphert)
        {
            var en = new AesWrapEngine();
            en.Init(false, new KeyParameter(kek));
            return en.Unwrap(ciphert, 0, ciphert.Length);
        }
```

テスト:

```csharp

        [TestMethod]
        public void AesWrap()
        {
            // https://tools.ietf.org/html/draft-ietf-jose-json-web-encryption-23#appendix-A.3.3
            
            var cek = new byte[]{
                4, 211, 31, 197, 84, 157, 252, 254,
                11, 100, 157, 250, 63, 170, 106, 206,
                107, 124, 212, 45, 111, 107, 9, 219,
                200, 177, 0, 240, 143, 156, 44, 207};

            var cek_ci = new byte[]{
                232, 160, 123, 211, 183, 76, 245,
                132, 200, 128, 123, 75, 190, 216,
                22, 67, 201, 138, 193, 186, 9, 91,
                122, 31, 246, 90, 28, 139, 57, 3,
                76, 124, 193, 11, 98, 37, 173, 61, 104, 57};

            var kek_b64url = "GawgguFyGrWKav7AX4VKUg";

            var kek = Jose.Utils.FromBase64Url(kek_b64url);
            Assert.IsTrue( kek.Length == 16 || kek.Length == 24 || kek.Length == 32);

            var wrapped = Aes.Wrap(kek, cek);
            Assert.IsTrue(cek_ci.SequenceEqual(wrapped));

            var unwrapped = Aes.Unwrap(kek, wrapped);
            Assert.IsTrue(cek.SequenceEqual(unwrapped));

        }
```
3/13日のJavaScript学習内容

参考書：独習JavaScript

6.2 プロパティ
　・プロパティ属性　{Object.getOwnPropertyDescriptor(),Object.defineProperty()} 
　・拡張可属性  {Object.isExtensible(),Object.preventExtensions()}
　・連想配列
　・with文
加え1.2-5.5までの復習

本日も復習に時間をとったため先にはほとんど進みませんでしたが、
次回は４章のオブジェクトの復習を少し行って、次に進めていく予定です。

今までにたくさんのメソッドが登場しましたが、出てくるものをすべて覚え切れていないのでそれで良いのかと思います。
プログラム自体も１つのプログラムにおいて変数がころころ変わり、本当にややこしくなってきました。
全部理解して読み切るのに時間がかかります。

もう少しプログラミングに対する基礎能力を上げられるように努力いたします。
メッセージをふんわり表示する

スタンダードな方法かわかないがとりあえずメモ。
もっと良い方法があれば教えてほしい。

```html:html
<div id='msg' style="opacity:0">メッセージ</div>
```

```js:jQuery
$(function(){
  $('#msg').animate({opacity: "1"}, 1000);
});
```
生成・解放のtry…finallyが多階層すぎてやぁ～ん→1階層で済んですっきり

生成・解放のtry…finallyが多階層すぎてやぁ～ん！

```
  wStringList1 := TStringList.Create;
  try
    wStringList2 := TStringList.Create;
    try
      wStringList3 := TStringList.Create;
      try
        //----------------
        //処理ごにょごにょ
        //----------------
      finally
        wStringList3.Free;
      end;
    finally
      wStringList2.Free;
    end;
  finally
    wStringList1.Free;
  end;
```

1階層で済んですっきり

```
  wStringList1 := nil;
  wStringList2 := nil;
  wStringList3 := nil;
  try
    wStringList1 := TStringList.Create;
    wStringList2 := TStringList.Create;
    wStringList3 := TStringList.Create;
    //----------------
    //処理ごにょごにょ
    //----------------
  finally
    //Freeメソッドは、nil入ってる場合は無視してくれる
    wStringList3.Free;
    wStringList2.Free;
    wStringList1.Free;
  end;
```

めでたしめでたし…おしまいっ☆彡
親参照セレクタと@extendとPlaceholderの悩ましい関係


Sass3.3になって"&"がよりカジュアルに使えるようになった反面、
placeholderと組み合わさった時に何とも言えない混乱を招く感じがしたのでまとめました。


http://sassmeister.com/gist/9522871

Placeholderも他のルールセットと同様のネストルールと考えれば理解しやすいんじゃないかなーと思った次第です。
Compass 1.0.0系からlinear-gradientにto構文が入った

Compass-1.0.0系でやっとlinear-gradientミックスインにto構文が入った。
これでIE10以降もオケ。
compass-1.0.0.alpha.19で検証。


コンパイル前（scss）

    #linear-gradient {
    	@include background(linear-gradient(top, #000, #fff));
    }



コンパイル後（css）

    #linear-gradient {
      background: -moz-linear-gradient(top, #000000, #ffffff);
      background: -webkit-linear-gradient(top, #000000, #ffffff);
      background: linear-gradient(to bottom, #000000, #ffffff);
    }


ちょっと前のalpha版はOperaのプレフィックスが入っていたがそれも無くなったようです。

1.0.0はベンダープレフィックスが整理されてるみたいだけど、border-radiusやbox-shadowはまだwebkitとmozのプレフィックスが付く。このへんは環境変数で管理するのでしょうかね。

## 追記

[caniuse](http://compass-style.org/help/documentation/tuning-vendor-prefixes/)を参照してプレフィックスを管理できるようになりました。これは便利。
CakePHPのHttpSocketでHTTPリクエスト


久々にPHPを触ってHTTP通信をやろうとしたらCakePHPで簡単な方法があったのでメモ
[公式ドキュメント(英)より](http://book.cakephp.org/2.0/en/core-utility-libraries/httpsocket.html)

CakePHPのバージョンは2.4です．
HttpSocketというメソッドを利用するっぽいです

##POSTリクエストの場合
######(ユーザー登録をする某APIへリクエスト)
`$results`にレスポンスの値が入ります．

```post_controller.php
$url = 'http://example.com/users/add';
$data = array(
	'username' => "yourename",
	'pass' => "パスワード",
);

App::uses('HttpSocket', 'Network/Http');
$HttpSocket = new HttpSocket();
$results = $HttpSocket->post($url, $data);
debug($results);
```


##GETリクエストの場合
######(問題を取得する某API)
`$results`にレスポンスの値が入ります．

```get_controller.php
$url = 'http://example.com/problems/index.json';
$data = array(
	'limit' => 100,
	'grade' => 3
);

App::uses('HttpSocket', 'Network/Http');
$HttpSocket = new HttpSocket();
$results = $HttpSocket->get($url, array($data));
debug($results);

/*おまけ jsonの場合は$results->bodyに対してjson_decode()すると良いっぽです．*/
$response = json_decode($results->body);
```
GoogleAppsScriptで日付をフォーマットする

GoogleスプレッドシートでVBA的な役割を果たす"GoogleAppsScript"は
javascriptであるため、日付のフォーマットをするのにも一手間かかってしまう。
一手間かかる例→ http://stackoverflow.com/questions/1056728/formatting-a-date-in-javascript

そんな時のために、Google先生が便利なライブラリを用意してくれている。


```
var d = new Date();
print Utilities.formatDate( d, 'Asia/Tokyo', 'yyyy年M月d日');
```

https://developers.google.com/apps-script/reference/utilities/utilities?hl=ja#formatDate(Date,String,String)
Qiitaの記事タイトルに隠された秘密のルール

<div class="alert alert-info">2016/03/18追記: この仕様は現時点で無くなっているようです。</div>

まずは、2つの記事のスクリーンショットをご覧ください。

<br>

この2つには、ある違いがあります。さて、何でしょうか?

<br>

| スクリーンショット1 | スクリーンショット2 |
|-----------------|-------------------|
| ![](https://qiita-image-store.s3.amazonaws.com/0/889/75530354-a9b8-f6ce-d5ae-6c756c6cb505.png) | ![](https://qiita-image-store.s3.amazonaws.com/0/889/0a1ddd7e-f3eb-6dc8-fc69-9ad78b8ffc99.png) |

<br><br><br><br>


違いに気づいたでしょうか? 記事のタイトルが「Scala」と「スカラ」で違うとか、URLが違うのはもちろんですが、`<title>` タグの内容が違っています。つまり、ブラウザのタイトルバーの内容が異なっているのです。


![Scalaについての記事_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/889/2bc5c5aa-5568-cb00-8e7f-6ffb7ccc6251.png "Scalaについての記事_-_Qiita.png")
![Scala_-_スカラについての記事_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/889/b55586a1-1dd3-8889-1e94-5cf60c0a7b51.png "Scala_-_スカラについての記事_-_Qiita.png")


スクリーンショット1のほうは「Scalaについての記事 - Qiita」になっていますが、スクリーンショット2では「Scala - スカラについての記事 - Qiita」になっています。

## 違いを決めているのは何か?

このような違いが出るのはどうしてでしょうか? いくつかQiita上の記事を見て検証したところ、 **タグと同じ文字列が記事に含まれていない場合、タグを自動的にタイトルに含める** というルールがあるようです。

先のスクリーンショット2では、「Scala」タグがついていますが、記事タイトルには「Scala」が入っていません。そのため、タイトルに「Scala」が補完されています。一方、スクリーンショット1のほうは記事タイトルに「Scala」が入っているため、タグの補完はされていません。

## 複数タグがある場合はどうなのか?

「JavaScriptについての記事」という記事名で「HTML」と「JavaScript」のタグ2つをつけて実験してみました。2つの違いはタグの並びが「HTML、JavaScript」の順か、その逆かです。

| タグの順序: HTML, JavaScript | タグの順序: JavaScript, HTML |
|---|---|
| ![](https://qiita-image-store.s3.amazonaws.com/0/889/d224b5a3-4717-c844-4c6d-e61bc194a23f.png) |![](https://qiita-image-store.s3.amazonaws.com/0/889/56eea6a8-496a-079f-9935-6fda851244fc.png) |

タグの順序が「HTML, JavaScript」の記事は、タイトルにHTMLが補完されました。この振る舞いから、 **一番最初のタグが記事タイトルに含まれているか** という基準でタイトルにタグ補完が起こるようです。

## 記事タイトル生成ルールまとめ

以上をまとめると記事タイトル生成ルールはこのようになります:

* 最初のタグが記事タイトルに含まれるか?
* YES → 記事タイトル + Qiita
* NO → 最初のタグ + 記事タイトル + Qiita

個人的な使い方かもしれませんが、Qiitaに投稿したスニペットなどを検索するときにGoogleで「qiita <言語> <探したい記事>」などで検索することがあります。普段からQiita記事タイトル生成ルールを踏まえて記事タイトルを考えておけば、後で検索するときにすぐに見つかっていいかもしれませんね。
svn blameで行数指定

gitのblameには行数指定のオプション-Lがあるけど、svnにはないっぽい。
仕方ないのでこんな感じで力技。

```bash
# 5行目から10行目
svn praise hoge.txt | awk 'NR >= 5 && NR <= 10'
# 行番号表示したいなら
svn praise hoge.txt | nl | awk 'NR >= 5 && NR <= 10'
```
【gnavi】最新の投稿などのブロック表示内にある日付表示を年月日ではなく月日時分で表示できるようにする

suinさんのブログにformatTimestamp関数の記事がありました、

http://suin.asia/2006/07/10/formattimestamp

TRUST_PATH/modules/gnavi/blocks/block_functions.php

このファイルの

１１５行目の

`$photo['date'] = formatTimestamp( $photo['unixtime'] , 's' ) ;`

これを

`$photo['date'] = formatTimestamp( $photo['unixtime'] , 'l' ) ;`

※lは英語のLの小文字

上記に変更し、FTPでファイルをアップロードしたら


これで解決出来ました

他にも`'l'`この部分の代わりに

`Y/n/j H:i`
`mysql`
`rss`

こちらでもできたのが確認できました
開発環境作ったらとりあえずGitの設定する (git graph + 改行タブ自動変換)

私は何かの開発環境を作ったら、とりあえずGitの設定をします。

どんな設定をしているかをお恥ずかしいながら晒してみます。

```ini:/etc/gitconfig
[color]
    diff = true
    branch = true

[receive]
    denyCurrentBranch = refuse
    denyNonFastForwards = true
    denyDeletes = true

[alias]
    graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
    g = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --date=short
    st = status
    co = checkout
    ci = commit
    now = rev-parse --abbrev-ref HEAD
    fetch-all = fetch -a --recurse-submodules

[filter "cleanup-source"]
    clean = /usr/local/bin/format-source.py

[push]
    default = current

#[pull]
#   rebase = true
```

format-source.pyはコミット時にタブや改行コードをよしなに変換してくれるツールで、自作です。
一人で開発する場合は必ず使っていますが、チームで開発する場合にはメンバー全員に設定してもらうこともあるし、IDEの設定でカバーすることもあるし、ケースバイケースですね。

```py:/usr/local/bin/format-source.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import with_statement
from optparse import OptionParser
import tempfile
from contextlib import closing
import os
import sys

def format_source(s):
    return s.rstrip().expandtabs(4) + "\n"

def format_file(f, fw):
    for line in f:
        fw.write(format_source(line))

parser = OptionParser()
(options, args) = parser.parse_args()
if len(args) > 0:
    for filename in args:
        fd, temp_filepath = tempfile.mkstemp()
        with open(filename, 'rb') as f:
            with closing(os.fdopen(fd, "wb")) as fw:
                format_file(f, fw)
        os.rename(temp_filepath, filename)
else:
    format_file(sys.stdin, sys.stdout)
```

最近Gitの設定で重要だと思っているのは、push.defaultの設定で、想定外のブランチをpushしてしまってあわあわするのを防ぐために必ずデフォルトの設定から変更しておきます。

git graph はなかったら生活できません。本家に入らないかなｗ
friendly_idのslugがセットされるタイミングっていつなの


https://github.com/norman/friendly_id/blob/f0a54bc8fd30392b7c5304d8660856e9da7c697b/lib/friendly_id/slugged.rb#L236

にあるように、`before_validate` である。

`before_xxxx` でセットし値を使ったslug生成をしたい場合は、

```
  before_validation :set_xxxx
  extend FriendlyId # extendはもっと上でもいいのでおこのみで
  friendly_id :slug_candidates, use: :slugged
```

てな感じで

* before_validationでセットする
* friendly_id 実行する前に書く

みたいに気を使ってあげる必要がある。
sedである行から別の行までを出力する（くわしく）

```bash
sed -n '/^group.*do/,/end/p' Gemfile
group :development do
  gem 'pry-rails'
  gem 'bullet'
  # ...
end
```

このsedコマンドの詳細

```
-n - パターンスペースの出力を抑制する
'REGEXP1,REGEXP2' - REGEXP1にマッチした行からREGEXP2にマッチした行までをマッチする
p - マッチしたパターンスペースを出力する
```

らしい[。](http://linuxjm.sourceforge.jp/html/GNU_sed/man1/sed.1.html) `-n`と`p`の両方を指定するのが、なんか、sed~~~って感じ。

specinfra の [ここ](https://github.com/serverspec/specinfra/blob/master/lib/specinfra/command/base.rb#L155-L162) で知った。
PhoneGap 3 x Android で音が再生できない問題と対策



* PhoneGap 3.3
* Android 2.3.4 (実機)


## エラー内容

iPhoneでは大丈夫だったが、Androidの実機で以下のようなエラーを出す

```
03-13 04:43:25.105: E/MediaPlayer(2340): error (1, -2147483648)03-13 04:43:25.105: W/PluginManager(2340): THREAD WARNING: exec() call to Media.startPlayingAudio blocked the main thread for 23ms. Plugin should use CordovaInterface.getThreadPool().03-13 04:43:26.386: W/SharedBufferStack(2340): dequeue: tail=1, head=0, avail=2, queued=003-13 04:43:44.824: I/Ads(2340): Refreshing ad.03-13 04:43:44.944: E/ActivityThread(2340): Failed to find provider info for com.google.plus.platform
```

## やったこと

ぐぐってみたが、解決してない記事がすごくヒットする。
が、以下のものが解決しそうだ。


## 対策

以下のプラグインで解決しそう。(まだ試してない)
作者もすごい苦労してようやく音をならすことができたようだ。

[cemerson/cordova-mediaplayer-core](https://github.com/cemerson/cordova-mediaplayer-core "cemerson/cordova-mediaplayer-core")


## 感想

* PhoneGap x Android で音出している人って世の中にそんなにいないの?
* iPhoneで動いていた標準MediaPlayerを置き換えるの超面倒くさい…
アンテナパターンスカイマップ(antenna pattern skymap)

```matlab
jbname = 'test';
detectors = {'H1','L1','V1','LCGT'};
phiV=[-180:4:180];
thetaV=[-90:4:90];

outdatasuffix = ['fpfcts_',jbname,'.mat'];
fpfctsfile = fullfile('./',['fpfcts',outdatasuffix]);
[Fp,Fc,Ts] = genfpfcts(detectors,phiV,thetaV,'');


load /opt/workspace/myfiles/utils/coast.mat

imagesc(phiV,thetaV,sqrt(Fp(:,:,1).^2)); axis xy;
hold on;plot(long,lat,'w');hold off;
xlabel('longitude'); ylabel('latitude');
set(gca, 'XTick', -180:45:180);
set(gca, 'XTickLabel', {'180 W', '135 W', '90 W', '45 W', '0', '45 E', ...
        '90 E', '135 E', '180 E'});
set(gca, 'YTick', -90:45:90);
set(gca, 'YTickLabel', {'90 S', '45 S', '0', '45 N', '90 N'});
colorbar('EastOutside')
%colorbar('horiz');
title('Fp');
%shg

savedataname = ['antennaSkymap',detectors{1},detectors{2},detectors{3},detectors{4}];


```
Vim筋トレ


ここずっとプラギンに頼ってばかりで、基礎Vim力が低い。
なので、このページの操作を繰り返し練習し、Vim筋を鍛えてみようと思います...

- http://vimwiki.net/?tips/71
- http://vimwiki.net/?tips%2F73
- http://www.vimgolf.com/

globalコマンドとか超便利なのに忘れてた、やばい。
MySQLで２点間の距離を求める関数を自作する（ストアドファンクション）

## distance_sphere（自作 MySQL 距離計算関数）

MySQL5.6でこれが実装されたのかされていなのかについてはよくわかりませんが、２点間の距離をもとめるためだけに、OPEN GISとか、何かモジュールを入れたりするのも面倒（いや、実際にはその手順をよくわかっていない）なのでストアドファンクションで作ってみました。

### distance_sphereとは

PostgreSQLでは、そこそこ有名な。POST GIS そのPOST GISに含まれる点間距離関数です。私も、一歩でも近づきたいという気持ちから、distance_sphereという同じ名前でストアドファンクションにしてみましたが、よくよく考えて考えてみると、紛らわしい・・。

単純には、経度・緯度から直線の距離をメートルで返しますよという関数なのですが、地球は丸い！ということを考慮してｗ
ヒュベニの距離計算式というものをベースに作ってみたものが、以下のそれです。まぁ、内容について、あれはこうだのどうだのヒュベニさんって誰なのとか聞かれてもさっぱりわからないのでご了承願います。

ちなみに公式は、以下のサイトに載ってました

http://yamadarake.jp/trdi/report000001.html


また、以下がストアドファンクションのソースになります。MySQLのコンソールにコピペしてくれればきっと入ります。

* distance_sphere

```
DROP FUNCTION IF EXISTS distance_sphere ;

DELIMITER //
CREATE FUNCTION distance_sphere(
  lat1 decimal(30,10), 
  lng1  decimal(30,10), 
  lat2  decimal(30,10), 
  lng2  decimal(30,10)
) 
RETURNS decimal(30,10) DETERMINISTIC

BEGIN
  DECLARE p decimal(30,10);
  DECLARE m decimal(30,10);
  DECLARE n decimal(30,10);
  DECLARE a decimal(30,10);
  DECLARE meter decimal(30,10);
  DECLARE wlat1 decimal(30,10);
  DECLARE wlng1 decimal(30,10);
  DECLARE wlat2 decimal(30,10);
  DECLARE wlng2 decimal(30,10);

  DECLARE latidiff decimal(30,10);
  DECLARE longdiff decimal(30,10);

  DECLARE wx decimal(30,10);
  DECLARE wy decimal(30,10);

  SET wlat1 = lat1 * (PI()/180);
  SET wlng1 = lng1 * (PI()/180);

  SET wlat2 = lat2 * (PI()/180);
  SET wlng2 = lng2 * (PI()/180);

  SET p = ((wlat2 + wlat1) / 2);
  SET latidiff = wlat2 - wlat1;
  SET longdiff = wlng2 - wlng1;

-- M:子午線曲率半径
  SET m = 6335439 / SQRT(POWER(1 - 0.006694 * sin(p) * sin(p), 3));

-- N:卯酉線曲率半径
  SET n = 6378137 / SQRT(1 - 0.006694 * sin(p) * sin(p));

-- 2点間の距離(m)
  SET wx = m * latidiff;
  SET wy = n * cos(p) * longdiff;

  SET meter = SQRT(wx * wx + wy * wy);

  RETURN meter;

END;
//
DELIMITER ;
```

### さっそく使ってみよう！！

実際、プログラムに書けばいいじゃんとか言われたらおっしゃる通りなのですが、僕的には、SQLの中でこれを混ぜたいと思っていたので、そういう使い方を見せたいと思います。

以下２つのSQLサンプルを書きます

* 品川駅（高輪口）から御殿山トラストシティまでの直線距離を求める

```
select distance_sphere(35.628770,139.737295,35.621438,139.736902) ;
+------------------------------------------------------------+
| distance_sphere(35.628770,139.737295,35.621438,139.736902) |
+------------------------------------------------------------+
|                                             814.2787425846 |
+------------------------------------------------------------+
```

814メートルでした。

* では、品川駅（高輪口）を起点として半径500メートル以内にある、レストランを近いもの順に表示

```
seletct
  shop_name,
  distance_sphere(35.628770,139.737295,lat,lng) as distance
from
  shops
where
  distance_sphere(35.628770,139.737295,lat,lng) <= 500 AND
  category = 'レストラン'
order by
  distance_sphere(35.628770,139.737295,lat,lng) ;

```
  
すんませんテストデータ作っていないので、結果はなしでｗ

### まとめ

このストアドファンクションを利用すればいろいろな場面で活躍できるようになると思います。たとえば彼女とのデートの際、行くお店に迷った時、さっとこんなSQLで近いお店をリストアップなんてしてみれば、きっと惚れ直すこと必至です。

ちなみに、距離系のスマホアプリっていくつか出ているけど、メガヒットしたアプリってそんなにないね。。マネタイズが難しいのかな。
Image::Magick && OpenMP有効なImageMagickでエラー回避策


Image::Magick使ってたらこんなエラーが出た。

```
libgomp: Thread creation failed: Resource temporarily unavailable
```

どうやらOpenMPという仕組みを取り入れたImageMagickがインストールされていると発生するケースらしい。
（OpenMPってのはスレッドの仕組みっぽい：[wiki](http://ja.wikipedia.org/wiki/OpenMP)）

以下回避策


## OpenMP無効のImageMagickをインストールしなおす。

のだけれどCentOSはデフォのyum install でOpenMP有効版が入るようなので面倒臭い。（[参考](http://d.hatena.ne.jp/akishin999/20130613/1371078436)）


手っ取り早いのは
## 環境変数でスレッド無効にする

```
export MAGICK_THREAD_LIMIT=1;
```

```
#CGIなら
BEGIN { 
  $ENV{MAGICK_THREAD_LIMIT}=1; 
}
Scala: 例外クラスの作り方


# この記事で学べること

* Scalaで例外クラスを作る方法
* RuntimeExceptionを継承する方法
* コンストラクタを持った例外クラスを作る方法

# Scalaで例外クラスを作る方法

例外クラスの継承も普通のクラス同様に `extends` すればいい。

```scala
class MyException extends RuntimeException
```

しかし、この例の `MyException` は最も単純な例外クラスの作り方である。しかし、コンストラクタがないため、エラーメッセージを持たせる事ができない。あまり実用的とはいえない。

# コンストラクタを持った例外クラスを作る方法

先の例にコンストラクタを持たせた実装は、下記のようなコードになる。引数にはデフォルト値をもたせている。場合によって `message` を省いたり、 `cause` を省いたりすることができる。

```scala
class MyException(message :String = null, cause :Throwable = null) extends RuntimeException(message, cause)
```

# 使い方1: 引数なしで例外オブジェクトを作る

エラーメッセージが必要ないときは、引数なしで例外オブジェクトを作れる。

```
new MyException()
```

# 使い方2: エラーメッセージを渡して例外オブジェクトを作る

エラーメッセージを渡す場合はこうする:

```
new MyException("something wrong")
``` 

# 使い方3: エラーメッセージと原因となる例外オブジェクトを渡してオブジェクトを作る

エラーメッセージとcatchした例外オブジェクトを渡して、新たに例外オブジェクトを作る使い方

```
val cause = new RuntimeException()
new MyException("something wrong", cause)
```

# 使い方4: 原因となる例外オブジェクトだけを渡してオブジェクトを作る

エラーメッセージは不要だが、とcatchした例外オブジェクトを渡して、新たに例外オブジェクトを作りたい場合はこう書く:

```
new MyException(cause = cause)
```
全天分布

```matlab
Nid = 1;
RA= linspace(0,24,37);
DEC = linspace(-90,90,19);
for indRA=1:length(RA)
	for indDEC = 1:length(DEC)
		idlist(Nid,1:3) = [length(DEC)*(indRA-1)+jj,RA(indRA),DEC(indDEC)];
	Nid = Nid + 1;
	end
end

ID = 234;
RAs = idlist(ID,2);
DECs = idlist(ID,3);

jbname='20131202_SN_Rp1burst_5kpc_4096_injallsky';
fname= fullfile([jbname,'_results'],['hphctseratreq_',jbname,num2str(ID)])
load(fname);
gpstime=injection.injSiginfo.timestamps(1);
[thetaS, phiS] = convertcelest2earth(RAs, DECs, gpstime)


detectors = {'H1','L1','V1','LCGT'};
phiV=[-180:4:180];
thetaV=[-90:4:90];
[Fp,Fc,Ts] = genfpfcts(detectors,phiV,thetaV,'');
AntennaFp = zeros(length(thetaV),length(phiV));
AntennaFc = zeros(length(thetaV),length(phiV));
for idet = 1:length(detectors)
	AntennaFp = Fp(:,:,idet).^2 + AntennaFp;
	AntennaFc = Fc(:,:,idet).^2 + AntennaFc;
end
AntennaFp = sqrt(AntennaFp);
AntennaFc = sqrt(AntennaFc);

[val,idxphi] = min(abs(phiV-phiS));
[val,idxtheta] = min(abs(thetaV-thetaS));

AntennaFp(idxtheta, idxphi)
AntennaFc(idxtheta, idxphi)

```
TortoiseGitをLabVIEWのソース管理用に設定するメモ

とりあえずDiffとMargeの設定だけ

#TortoiseGitの導入
下記ページからTortoiseGit本体と日本語のLanguagePackを入手してインストール
https://code.google.com/p/tortoisegit/

オプション画面で言語を日本語に変更する。

#Diff設定

設定画面の差分ビューアで"高度な設定"を開いて拡張子.viと.ctlに対して下記を設定

```
"C:\Program Files (x86)\National Instruments\Shared\LabVIEW Compare\LVCompare.exe" %base %mine
```
※32bit版OSの場合は"Program Files (x86)"を"Program Files"に変更

![LVDiff_tortoisegit_diff.PNG](https://qiita-image-store.s3.amazonaws.com/0/36514/61575557-5350-7c54-4010-0a2e0706ed9b.png)

他の拡張子も必要があれば追加する

LabVIEWの拡張子一覧
http://zone.ni.com/reference/ja-XX/help/371361J-0112/lvhowto/lv_file_extensions/

LVCompareのオプション

```
LVCompare <vi1への絶対パス> <vi2への絶対パス> [-lvpath <LabVIEWへの絶対パス>][-noattr] [-nofp] [-nofppos] [-nobd] [-nobdcosm] [-nobdpos]

[-lvpath <LabVIEWへの絶対パス>] - VIを比較するLabVIEW実行ファイルへのパスを提供します
[-noattr] - VI属性を比較しません
[-nofp] - フロントパネルを比較しません
[-nofppos] - フロントパネルオブジェクトの位置/サイズを比較しません
[-nobd] - ブロックダイアグラムを比較しません
[-nobdcosm] - ブロックダイアグラムオブジェクトの装飾を比較しません
[-nobdpos] - ブロックダイアグラムオブジェクトの位置/サイズを比較しません

```
http://zone.ni.com/reference/ja-XX/help/371361J-0112/lvhowto/configlvcomp_thirdparty/

#Merge設定

Diff設定と同様に必要な拡張子毎に下記を設定する

```
"C:\Program Files (x86)\National Instruments\Shared\LabVIEW Merge\LVMerge.exe" %base %theirs %mine %merged
```

LVMergeのオプション
http://zone.ni.com/reference/ja-XX/help/371361J-0112/lvhowto/configmerge_thirdparty/

#コンパイルコードの分離
LabVIEWのソースコードからコンパイルコードを分離します。
この設定をONにすることで、サブVIや、タイプ定義など、関連するファイルの変更で差分が発生することを大幅に抑制することができます。

新規ファイルに対する設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36514/6fa670c1-50bc-65d6-6162-b5bd43e86a08.png)

既に作成済みのファイルに対する設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36514/e35acd61-eddc-4960-c8d1-3d0f0e8f3a49.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36514/2cf2fcf7-1dc6-d718-84ca-d4ee80cce506.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36514/815f6bfb-73ac-b038-84d7-db90e4611bc6.png)
[Memo]コンストメンバの初期化

#コンストメンバ・データの初期化

ユーザー定義型のconstメンバ・データをコンストラクタ拡張を利用して初期化する。
・プリミティブ型の各コンストラクタをユーザー定義型のコンストラクタから明示的に呼ぶ。
・コンマ演算子でコンストラクタをリスト化した式とできる。

```cpp
class myClass
{
private:
	const int num;
	const char* str;
public:
	myClass();
	myClass( int, const char* );
	int get_num();
	const char* get_str();
};

// デフォルトはゼロ/ヌルをセット
myClass::myClass()
	: num( 0 ),
	str( "" ) {}

// クラスのコンストラクタ引数でセット
myClass::myClass( int init, const char* txt )
	: num( init ),
	str( txt ) {}

int myClass::get_num(){ return num; }
const char* myClass::get_str() { return str; }
~~~
reveal.jsで作った資料を github pagesにホストさせる手順

[Potatotips #5](https://github.com/potatotips/potatotips/wiki/potatotips-5)で [reveal.js](http://lab.hakim.se/reveal-js/#/)を使って発表したんだけど、その資料を公開するのにちょっと苦労したんで、今後のためにまとめてみる。

最近の Web系開発とかにあまりくわしくない組み込みおじさんが試行錯誤した結果なので、もっと楽な方法あった教えてください。

# 作品例
[強制アップデートさせた](http://dagezi.github.io/potatotips5/)
[Github repo](https://github.com/dagezi/potatotips5)もご笑覧ください。

# こんなフローで行けるんでは
## localな webserverを建てる
markdown対応のために必要。HTMLで直書きするならいらないのかしらん。

自分は nginx を brewで入れました。お好きなモノをどうぞ。

## Reveal.js を forkして適当な名前かえる。
github.com上でぽちっと。

## localに cloneしてくる。
ちなみに、これは webserverで公開してる場所にするのが、編集しながら見るのに便利。
自分の場合は ```/usr/local/var/www``` の下。

## README.mdとか変える
まあ、気分の問題だけど。

## gh-pages branchを消す
これは remoteもろとも消します。

```
*potatotips5<master> git branch -rd origin/gh-pages
Deleted remote branch origin/gh-pages (was 6255a81).
*potatotips5<master> git push origin --delete gh-pages
To git@github.com:dagezi/potatotips5.git
 - [deleted]         gh-pages
```

## gh-pages branchを作る
```
*potatotips5<master> git checkout -b gh-pages
Switched to a new branch 'gh-pages'
```

## ごちゃごちゃ見ながら編集する。
http://localhost:8080/potatotips5/ とかを見ながら編集して commitしていきましょう。

## push
```git push origin gh-pages```

## 全世界から見えるの確認
http://dagezi.github.io/potatotips5/ みたいに見えるはず。

## Fork me on github ribbon
つけてみたけど発表中には邪魔そう。よしたほうがいいかも。
macOSアプリケーションのウインドウサイズのみをキー操作で最大化する (Rectangle)

macOSを用いているとき、作業しているウインドウを最大化したいことがあります。

macOS環境では、Control-Command-Fに「フルスクリーン」機能がバインドされていることが多いです。この機能は確かにウインドウサイズを最大化してくれるのですが、メニューバーが消え、画面遷移のアニメーション効果も入り、ワークスペースも変化するなど、余計な挙動が入っています。デュアルディスプレイで作業していたり、プロジェクターやビデオ会議で仲間に画面やウインドウを共有しているときは特にこれらが鬱陶しく感じられ、私には使いづらいです。私が求めているのは、ウインドウの大きさを単にディスプレイいっぱいに広げてくれるだけの機能です。

この課題を解決してくれるいいモノがあります。

# Rectangle

[Rectangle](https://rectangleapp.com/)は、macOSのデスクトップにあるウインドウの移動やリサイズ操作をキー操作で行えるユーティリティです。ソースコードも[githubで公開](https://github.com/rxhanson/Rectangle)されています。

![71896594-7cdb9280-3154-11ea-83a7-70b71c6df9d4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36428/8a28ee28-f406-e57d-c171-6b23a43da967.png)

こいつを入れて、Fullscreen機能に何かキーバインドすればokです。ぼくは `Option-Backquote` を設定してます。てかFullscreen以外の機能は使ってません。

ああ快適。

ちなみに `Option-Backquote` を割り当てるには、設定画面の「すべてのキーボードショートカットを許可」をチェックする必要がありました。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36428/91fa9a9c-b933-3f9e-365c-a9c670216cb3.png)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36428/3de11167-72a4-a0db-71f8-797a1333b56e.png)

# Spectacle

以前この用途に使っていたものです。

![7534614230_c018aea652_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/36428/3dd57120-3786-2cb0-ca7b-a9579a057c28.jpeg)

残念ながら、諸般の事情で[Spectacleはあまりメンテナンスされなくなってしまいました](https://github.com/eczarny/spectacle#important-note)。代わりにSpectacle作者が推奨してくれたのが上にあげたRectangleです。Spectacleのコードベースをswiftで再実装したものらしく、UIも機能も上位互換です。
mysqlのダウンロード先のパス

mysqlをソースコードからインストールする際に、ダウンロード先のページが分かりにくいのでメモに残します。

2014年3月13日現時点で目的とするパスです
最新版を確認したい方は下記のアクセス方法に従って、ダウンロード先を見て下さい。
http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.16.tar.gz

## アクセス方法
下記ページにアクセスします
http://dev.mysql.com/downloads/mysql/

`Select Platform:`を`Source Code`にします

自分の場合、CentOS にインストールするので、一番下のGeneric Linux向けの`Downloas`をクリックします。

ファイルが置いてあるページ
http://dev.mysql.com/downloads/file.php?id=450919

上記ページの`No thanks, just start my download.`がダウンロード先のパスです。

間違いなどがありましたら、コメントをお願いします。

参考：
http://codenote.net/mysql/229.html
rspecでseed_fuのfilter及びfixture_pathを指定する

`SeedFu.seed` は引数に `FIXTURE_PATH` と `FILTER` を指定できる

https://github.com/mbleigh/seed-fu#rake-task

```rb
SeedFu.seed(fixture_paths, filter)
```

`spec_helper.rb` にはこんな感じで書ける

```rb
config.before :suite do
  DatabaseRewinder.clean_all

  fixture_paths = "#{Rails.root}/db/fixtures"
  filter = /users/
  SeedFu.seed(fixture_paths, filter)
end
```
fail2banでdirectory traversalなwebアクセスを蹴る

apacheやnginxなどのwebサーバでサービスを提供していると、そのサービスは常に不正アクセスのリスクにさらされます。
特にWordPressといった著名なソフトウェアを運用していれば、分かりきった不正アクセスパターンでのアクセスはしばしばやってきます。
対処としては、運用しているソフトウェアのバージョンを新しく安全なものに保ち、設定も安全で正しい状態にすることが大切です。そうすれば、対策済の過去の不正アクセスパターンを受けても実害はありません。とばいえ、「分かりきった不正アクセスパターン」でログが汚されたり、無意味なサーバ負荷が増えるのはうっとうしいものです。

この手のアクセスは、個別に知恵を絞って攻撃してくる相手よりも、何も考えずwell knownなパターンをひたすらスクリプトで叩いてくる連中だったりします。それも乗っ取った第三者のホストを使ったり、技術的には何もわかっちゃいないが出回っている攻撃スクリプトをひたすら動かして遊んでいる手合いだったりします。後者は俗にscript kiddieと呼ばれるものですね。余計うっとうしいです。

この手のアクセスをサーバの前段で防ぐにはIDS (intrusion detection system, 侵入検知システム)を導入するのも手ですが、そこまでのコストもかけられない場合は、fail2banで手軽に蹴ってしまうこともできます。

# directory traversal

先日、WordPressを運用しているサイトにscript kiddie的なアクセスを延々とくらっていました。
実害はありませんが、ログは太るし負荷も若干食うし、うっとうしいなー と思いました。
アクセスパターンを見てみると、数十行えんえんとこんなのばっか。

```
GET /?language_id=../../../../../../../../etc/passwd%00
GET /?module=../../../../etc/passwd%00
GET /?npage=1&content_dir=../../../../etc/passwd%00
GET /?p=cat&c=../../../../../../../../etc/passwd%00
GET /?set_lng=../../../../../../etc/passwd%00
GET /Factux/admin?lang=../../../../../etc/passwd%00
GET /Factux/admin_modif.php?lang=../../../../../etc/passwd%00
GET /Factux/article_new.php?lang=../../../../../etc/passwd%00
```

典型的なディレクトリ・トラバーサルです。
WordPressへの不正アクセスパターンのトレンドを追いかけて対処していくのはあまりに面倒です。悪者にそこまでつきあわされるのはまっぴら。そのかわり、問題をある程度一般化し、ベタベタなdirectory traversalを蹴ってしまうのは一定の効き目がありそうです。

# fail2banとは

fail2banは、各種ログを定期的に監査し、不正アクセスのパターンを見つけ、source ipからのアクセスをiptablesで一定時間拒否してしまうツールです。
標準でも各種アプリケーションのログ監査と対処ルールがいろいろ書かれています。
ここに、directory traversalも蹴るルールセットを追加してみます。

# fail2banのインストール

Debian GNU/Linux系ディストリビューションであればapt install fail2banで。
rpm系など他いろいろの場合はそれぞれどうぞ。

# 設定

## /etc/fail2ban/filter.d/apache-dirtraversal.conf

`/etc/fail2ban/filter.d` にfail2banの各種アプリケーションに対するフィルタルールが並んでいます。
apache用のものも、既に `apache-*.conf` としていくつか用意されています。
ここに新たに `apache-dirtraversal.conf` としてルールを追加してやりましょう。

```
# Fail2Ban configuration file
[Definition]
failregex = <HOST>.*] "GET /.*\.\./\.\./\.\./
ignoreregex =
```

`../` が3段以上あると怪しい、という判断にしています。

## /etc/fail2ban/jail.conf

`/etc/fail2ban/jail.conf` に、末尾でいいので以下を追加します。

```
[apache-dirtraversal]
enabled  = true
port     = http,https
filter   = apache-dirtraversal
logpath  = /var/log/apache*/*access.log
maxretry = 3
```

`logpath` の値は、運用しているバーチャルホストのアクセスログをカバーするよう、必要に応じて調整してください。

## fail2ban再起動

`service fail2ban restart` でfail2banを再起動します。

## テスト

運用ホストで

```
tail -f /var/log/apache*/*access.log
tail -f /var/log/fail2ban.log
```

など流して状況監視します。

では不正アクセスをしてみます。
もちろん、不正もどきアクセスを行った結果、期待通りにアクセス拒否をされると、しばらくサイトにアクセスができなくなってしまいますから、汚れ仕事専用のweb proxyなどを通して、拒否されてもよいアクセス経路でテストしましょう。

```
http://wordpress.example.com/Factux/admin?lang=../../../../../etc/passwd%00
http://wordpress.example.com/?language_id=../../../../../../../../etc/passwd%00
http://wordpress.example.com/?set_lng=../../../../../../etc/passwd%00
```

みごとアクセスできなくなっちゃいました!

# デメリット

ディレクトリ・トラバーサルっぽいアクセスパターンを蹴っているわけなので、正当に「ディレクトリ・トラバーサルっぽいアクセスパターンでアクセスするWebアプリケーション」を運用している場合は、正当なアクセスも蹴られてしまうデメリットがあります。

でもそれって

```
http://dull.example.com/cgi-bin/shop.cgi?user=123456&mode=help&txt=../../../setsumei/kiyaku02.html
```

みたいなことする設計のサイトなわけですよね。こんなの、そもそものところでなんかどっかアレじゃないか、と思ったりします。
Capybaraでブラウザを再起動するステップを書く方法

Cucumber や Turnip 等でセッションやクッキーに関するテストを書くときに、
時々ブラウザを再起動したい時がある。
そのような場合には [show_me_the_cookies](https://github.com/nruth/show_me_the_cookies) が便利。

`show_me_the_cookies` の `expire_cookies` というメソッドを使うとブラウザを再起動した状態を再現できる。

```ruby
# Turnip のステップの例
step 'ブラウザを再起動する' do
  expire_cookies
end
```
GitHubを使い倒す

# 問題意識(innocent questions)
- GitHubって、Gitリポジトリの管理にとどまらず色々できそうなんだけど何ができんの？
- CIと連携させたいんだけど、
    - "CI as a Service"ってそもそもどんな仕組みで動いてんだかイメージつかないんだけど？
    - どんなテスティングフレームワーク使えるの？
    - Seleniumは動かせるん？

# 総論
- [GitHubをもっとソーシャルに使いこなすための7つ道具 - ＠IT](http://www.atmarkit.co.jp/fjava/column/andoh/andoh60.html)
    - 記事は2012/01とちと古い
    - "GitHub Pages" ＝『それほど頻繁に更新されない、かつ動的な情報を公開するにはとても便利な仕組みです。』
        - 『ソースコードと同様にHTMLファイルを準備し、リポジトリにコミットすると、自動的にプロジェクトページとして公開』
        - 『サイトジェネレータが用意されており、GitHub登録済みのソース群などにスタイルを適応し、内容の更新とともに、HTMLページを更新』
        - 『マークダウン記法により、プレーンテキストのREADMEファイルなどを見栄え良くHTMLとして公開できる』
    - fluxflexは既にサービス終了してる。

# Gist
## 超絶便利
- [Sublime Text 2からGithub:Gistへ投稿できるプラグインの使い方 | offsidenowの日常を綴ったブログ](http://offsidenow.phpapps.jp/archives/898)
    - Sublime Textでファイル内容を直接エディタ内からGistへ登録できる。
    - さらに、Gistの投稿をエディタ内でスニペットとして呼び出せるって、素敵すぎる！！！

## 基本の使い方
- [GitHubについてもう少し知ってみる。その5（Gistでお手軽コード管理） | Alpac@labo](http://www.paka3.net/github05/)
    - スクリーンショットを多用してわかりやすい入門

# CI as a Service (Travis CI)
- [Travis CI 入門：GitHub + Travis CI で継続的インテグレーション « をぶろぐ](http://tetsuwo.tumblr.com/post/44706350593/github-travis-continuous-integration)
    - Travisの基本動作（ビルドのライフサイクル）が完結にまとまってて「なるほど」。
- [CI as a Service ブラウザを使ったJavaScriptのテストをCIサービスで動かす方法のまとめ | Web scratch](http://efcl.info/2013/0321/res3234/)
    - Travisに限らない
- [Travis CIでブラウザテスト — The little book of Buster.JS 0.7 documentation](http://the-little-book-of-busterjs.readthedocs.org/en/latest/doc/column/TravisCI/)
    - Buster.JSをTravis上で走らせる

- [Travis CI: GUI & Headless browser testing](http://docs.travis-ci.com/user/gui-and-headless-browsers/)
    - PhantomeJSをTravisCI上で動かす

- [Karma - Travis CI](http://karma-runner.github.io/0.8/plus/Travis-CI.html)
    - KarmaをTravisCI上で動かす

- [Travis CI: Getting started](http://docs.travis-ci.com/user/getting-started/)
    - 公式の説明サイト

# クロスブラウザテスト（Testling CI）
- [https://ci.testling.com](https://ci.testling.com/)
    - 公式ページ
    - mochaでテストを書けるっぽい
- [testling-ciとtravis-ciでクライアントサイドもサーバサイドもテストを実行する - from scratch](http://yosuke-furukawa.hatenablog.com/entry/2014/03/08/115537)
    - テスティングフレームワークはtape（Ttestling独自フレームワーク）を使っている
- [browser - mocha+testling-ciでブラウザテストを自動化 - Qiita](http://qiita.com/hden@github/items/4c36d745515d82c05eb1)
    - mochaでtestlingする設定方法
- [jasmine+testling-ciでブラウザテストを自動化 - Qiita](http://qiita.com/hden@github/items/3a793309b5bfde736163)
    - jasmineも使えるんですって！すてき！
C#: ConcatKDF 


[JWA Appendix C](https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-23#appendix-C)のパラメータで確認

ユーティリティ:

```csharp
        // byte配列のマージ
        public static IEnumerable<byte> Combine(params byte[][] arrays)
        {
            foreach (byte[] a in arrays)
                foreach (byte b in a)
                    yield return b;
        }

        // 配列スライス
        public static byte[] Slice( byte[] org, 
                            int start, int end = int.MaxValue)
        {
            if (end < 0)
            {
                end = org.Length + end;
            }
            start = Math.Max(0, start);
            end = Math.Max(start, end);

            return org.Skip(start).Take(end - start).ToArray();

        }
```

派生関数実体:

```csharp
        // NIST キー派生関数
        public byte[] ConncatKDF_SHA256(
            byte[]  agreement,
            uint    key_octets,
            byte[]  other_info
            )
        {
            byte[] dkey = new byte[0];
            for (uint counter = 1; dkey.Length < key_octets;counter++ )
                {
                    //using System.Security.Cryptography; 
                    var digest = (new SHA256Managed()).ComputeHash(
                          Combine(counter.ToOctetString(),
                                agreement,
                                other_info).ToArray<byte>()
                        );
                    dkey = Combine(dkey, digest).ToArray<byte>();
                }

            return Slice(dkey, 0, (int)key_octets);
        }
```

テスト:

```csharp
        [TestMethod]
        public void EcDeriveKey()
        {
            // JWA Appendix C 
            var agreement = new byte[]{
                158, 86, 217, 29, 129, 113, 53, 211, 
                114, 131, 66, 131, 191, 132,
                38, 156, 251, 49, 110, 163, 218, 128, 
                106, 72, 246, 218, 167, 121,
                140, 254, 144, 196
            };

            byte[] oi = new byte[]{
               0, 0, 0, 7, 
               65, 49, 50, 56,71, 67, 77, 
               0, 0, 0, 5, 
               65, 108, 105,99, 101, 
               0, 0, 0, 3, 
               66, 111, 98, 
               0, 0, 0, 128
           };
            uint key_octs = 16;

            byte[] derived_key = new byte[]{
                86, 170, 141, 234, 248, 35, 
                109, 32, 92, 34, 40, 205, 113, 167, 16,26
            };

            // Calculate Derived Key
            var result = ConncatKDF_SHA256(agreement, key_octs, oi);

            Assert.IsTrue(derived_key.SequenceEqual(result));

        }
```
selectorの存在確認に便利な`$(selector).exists()`を実装しておく


# 概要

これ、なにかと便利です。便利というか可読性がよい。

```js
jQuery.fn.exists = function(){return Boolean(this.length > 0);}
```

複数個生成したくないDOMを追加する際にvalidateするときとかに使う。
formがsubmitされた際のalert表示を複数個追加したくなかったので、こういうのほしかったのです。


# サンプル

```js
jQuery.fn.exists = function(){return Boolean(this.length > 0);}

// ＜中略＞

if ($(selector).exists()) {
  // selectorが既に存在してた場合の処理
}
```

# その他

## 追記1（2014/03/13 13:52）

<strike>これ、以下でも実現できるし、意味的にはこっちの記述も良い気がするけど、いろいろと冗長...</strike>
処理的に冗長だし、条件によっては一部結果に不備が出るようです。詳細は[以下のコメント](http://qiita.com/takoba/items/2c278b2838ab30432a54#comment-25baffa22d80c438a739)を参照。
（2014/03/14 10:40追記）

```js
jQuery.fn.exists = function(){
  return Boolean($("body:has(" + this.selector + ")").length > 0);
}

```


# 参考

- [Is there an "exists" function for jQuery? - Stack Overflow](http://stackoverflow.com/questions/31044/is-there-an-exists-function-for-jquery)
- [論理値 - JavaScript プログラミング解説](http://www.crystal-creation.com/web-appli/technical-information/programming/javascript/grammar/data-type/boolean/)
- [:has(selector) - jQuery 日本語リファレンス](http://semooh.jp/jquery/api/selectors/:has/selector/)
さくらVPSのyum update実行時に出るエラーの対処法

さくらのVPS(v3) 2G TK02 を使い始めました。

しかし、`yum update`を実行すると、表題のエラーが出てつまずいたので、対処法をメモします。
`Error: Cannot find a valid baseurl for repo: base`

#対処法
のbaseurlをrikenのパスに変更します。

```/etc/yum.repos.d/ConsOS-Base.repo
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/extras/$basearch/
```

対処法に問題がありましたら、突っ込みをお願いします。

参考
http://centos.bungu-do.jp/archives/000198.html
【jQuery】引用符とエスケープを覚える

#内側と外側同じ引用符を使って、内側をエスケープ（\）する

```js
$('a[href=\'http://qiita.com\']') //シングルクオート（'）とエスケープ（\）
$("a[href=\"http://qiita.com\"]") //ダブルクオート（"）とエスケープ（\）
```

#内側と外側で別の引用符を使う
```js
$('a[href="http://qiita.com"]') //外側はシングルクオート（'）で内側はダブルクオート（"）
$("a[href='http://qiita.com']") //外側はダブルクオート（"）で内側はシングルクオート（'）
```

こっちのほうが簡単だと思うけど、どうなんだろう・・・
FuelPHPを90分だけさわってみる

# インストール
http://fuelphp.com/docs/

## Quick Installation
`$ curl get.fuelphp.com/oil | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   385  100   385    0     0    710      0 --:--:-- --:--:-- --:--:--  1425
`
なぜか何もおきない。深く考えずパス。

## Manual Installation
`$ git clone --recursive git://github.com/fuel/fuel.git
`
でかい。。。全体像を掴める気がしない。

## Next steps → 次のステップ
早々と日本語ドキュメントへ離脱。翻訳チームの方々へ感謝。
http://fuelphp.jp/docs/1.7/
### ステップ #1: FuelPHP アプリケーションの コンポーネント について読む
「しかし、コントローラは、自身では何も行いません。」
ギクッ。。。
「ビューに関係するロジックをコントローラに含めるかどうか判断が難しくなるでしょう。」
はい。がっつりビューに書いています。ビューモデル？

### ステップ #2: 新しくインストールした FuelPHP の設定をする
http://xxxx/fuelphp_test/fuel/public/
ん。なんか言ってる。
`Composer is not installed. Please run "php composer.phar update" in the root to install Composer
`
`$ php composer.phar update
`
fuel/vendor/ディレクトリができたということか？
Welcomeページが表示されました。
とりあえずこのページはパス。

### ステップ #3: モジュール と パッケージ について学習する
「パッケージ」は
- モジュール
- サードパーティライブラリ
- 設定
などを含むことができるのか。

### ステップ #4: セクシーなコードを作成する!
よし！よくわからない。
実際にソースいじって動かせるサンプルはないかな？

# チュートリアル
http://btt.hatenablog.com/entry/2012/10/31/004104

`$ php oil generate model hoge name:varchar[255] sex:int del_flg:bool
        Creating model: /home/ken/gatedruid/no_working_copy/fuelphp_test/fuel/fuel/app/classes/model/hoge.php
        Creating migration: /home/ken/gatedruid/no_working_copy/fuelphp_test/fuel/fuel/app/migrations/001_create_hoges.php
`

oilってなに？

`$ git status
Untracked files:
fuel/app/classes/model/hoge.php
fuel/app/migrations/001_create_hoges.php
`
なんかファイルできたぞ。

`$ echo 'CREATE DATABASE fuel_dev;' | mysql
$ php oil generate model items id:int name:varchar
        Creating model: /home/ken/gatedruid/no_working_copy/fuelphp_test/fuel/fuel/app/classes/model/item.php
        Creating migration: /home/ken/gatedruid/no_working_copy/fuelphp_test/fuel/fuel/app/migrations/002_create_items.php
`
またファイルできたぞ。

`$ php oil generate controller example index add
        Creating view: /home/ken/gatedruid/no_working_copy/fuelphp_test/fuel/fuel/app/views/template.php
        Creating view: /home/ken/gatedruid/no_working_copy/fuelphp_test/fuel/fuel/app/views/example/index.php
        Creating view: /home/ken/gatedruid/no_working_copy/fuelphp_test/fuel/fuel/app/views/example/add.php
        Creating controller: /home/ken/gatedruid/no_working_copy/fuelphp_test/fuel/fuel/app/classes/controller/example.php
`
なんかコード書くことなくファイルができてくぞ。

まだ、よくわからない。そして時間切れ。
passenger-install-nginx-moduleを自動で済ますには


UnicornではなくPassengerを使うことが多いのですが、Passengerをnginxのモジュールとして組み込むとき

```Bash
passenger-install-nginx-module
```
を実行するときがおおいと思います。
でもこれ、いろいろ聞いてきて答えるのめんどくさいですよね。

これに自動で答えるためには以下のオプションをつけてあげれば大丈夫です。

```Bash
passenger-install-nginx-module --auto
```

もっとオプションつけたいときは以下を合わせてつけると良いようです。

* --prefix=****** ：　nginxのインストール先
* --nginx-source-dir=***** ： nginxのソースの置き場所
* --extra-configure-flags= ： nginxにつけたいオプション

バージョンとか気にする場合は--nginx-source-dirであらかじめ落としておいたソースコードの場所を指定しておくとよいようですよ。

あとconfigureのオプション指定する場合は--extra-configure-flagsでいろいろ指定できます。https対応やstatusを見たい場合のオプションとかはここで指定します。

ではよいnginxライフを！
リダイレクトの注意点

こんにちは。
見事にはまりました。

.htaccessに
リダイレクト設定をしようとして
以下の内容を記述

Redirect permanent /index.php http://doitourself.pupu.jp/diy_event/party.php

これは同一サーバ内で行っています。

リダイレクトループにはまりました。
index.phpはhttp://doitourself.pupu.jp/index.php

縦に並べてようやく理解。
http://doitourself.pupu.jp/
http://doitourself.pupu.jp/diy_event/party.php/

.htaccessは
http://doitourself.pupu.jp/　直下に置いてあるため

サイトにアクセスする
→リダイレクトだ！
http://doitourself.pupu.jp/diy_event/party.phpへ！

http://doitourself.pupu.jp
/diy_event
/party.php/
と、上から順繰りおりてきて、

くる間に.htaccessが！

ということだったんですね。

RedirectMatchを使えば解決するらしいですが
ちょっと時間ないので、ひとまず原因がわかったのでメモです。
Esenthel EngineがWebGLに対応してブラウザ上で実行可能に（IEを除く）

# Esenthelとは
以下をお読みください。

[Esenthel Engineというゲームエンジンが予想外に面白かったのでメモ](http://qiita.com/yasei_no_otoko/items/a85c677714fb12903f81)

[Esenthel Engine怒涛の付属チュートリアルサンプルプログラム一覧](http://qiita.com/yasei_no_otoko/items/7b65a3865538a3f636a5)

# WebGLとは
ブラウザ上で3Dグラフィックスを表示するためにMozillaが開発を始めたものです。
OpenGLのKhronos Groupが管理していてWeb標準のW3Cとは関係がありません。
OpenGL 2.0/GL ES 2.0に対応しているGPUを搭載したPC/スマートフォンで動作します。
GPUを使って描画するのでゲームソフトと同じレベルのfpsが出ます。

# ライブデモ
WebGL対応ブラウザで実行できます（IE11のみWebGLのバージョンが古いため動作不可です）
[Live Demo](http://www.esenthel.com/?id=live_demo)

# 動作原理
Esenthel Engineは独自スクリプトをC++に変換して動作するゲームエンジンですが、Unreal Engineと同じく、C++をJavascriptに変換するEmscriptenを利用することによってWebGL版ファイルを出力しています。

# まとめ
Unreal Engineは商用版のみですし（そもそもまだライセンス企業でも使えない？）、UnityはWeb PlayerからWebGLへどうやって移行するかまだアナウンスが無い状況が続いていますが、
何とEsenthel EngineのWebGL出力はもうユーザーが使えます！（現在はWindows版エディタからのみ）

[Platform Specific/Web](http://www.esenthel.com/?id=doc#Web)
[Emscripten（ビルドに必要）](https://github.com/kripken/emscripten/wiki/Emscripten-SDK)

[Esenthel Engine](http://www.esenthel.com/?id=store)
Esenthel Engine 2.0→Download→Esenthel Engine 2.0 for Windowsをクリック

DirectX（Windows）、OpenGL（Mac/Linux）、OpenGL ES（iOS/Android）、WebGL（Chrome、Firefox、Opera）向けのゲームを作れるEsenthel Engineは199ドルで無期限体験可能です
【CakePHP】findBy/findAllBy(マジックメソッド)

# 使い方

Byのあとをカラム名と見なして検索する。
以下は「where User.id=123」と同じ。

````php:findBy
$this->User->findById(123); 
```

````php:findAllBy
$this->User->findAllById(123); 
```

**findByは単一レコード取得のfind('first')と同じ。
findAllByは複数レコード取得のfind('all')と同じ。**

# 戻り値
**findByはfind('first')と同じ。**
**findAllByはfind('all')と同じ。**

```php:findByの戻り値
array(
  'User' => array(
    'id' => '123',
    'name' => 'suzuki',
  )
)
```

```php:findAllByの戻り値
array(
  0=>array(
    'User' => array(
      'id' => '123',
      'name' => 'suzuki',
    )
  )
)
```

#複数カラムを検索対象にすることも可能
複数カラムをOrやAndでつなぐ。

```php
//「User.email = 'jhon' OR User.username = 'jhon'」と同じ。
$this->User->findByEmailOrUsername('jhon');	

//「User.username = 'jhon' AND User.password = '123'」と同じ。
$this->User->findByUsernameAndPassword('jhon', '123');	
```

#取得フィールド、ソートなどの指定も可能

```php
$this->findByカラム名('カラム条件',fields,order,recursive);
```

パラメータが連想配列ではないので、使わないところはnullで渡す。

```php
$this->findByカラム名('カラム条件',null,array('created'));
```



参考：[findByカラム名のオプション](http://pnome.blog88.fc2.com/blog-entry-90.html)