OmniAICreator/Qiita-1.07M huggingface dataset:
Modalコンテンツの幅を％指定したときに左右天地の中央に配置するCSS設定



transformのtranslateを利用する。translateはX軸とY軸に指定したサイズ分移動する。


```:css
#modal_content {
    width: 80%;
    height:80%;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
}
```


## 結果

縦幅、横幅のサイズが不明なコンテンツが左右天地中央に配置される。
IEで画像をimgタグで50％以上縮小すると・・・

ジャギーはいってしまうorz
cssとかではどうしょうもないようなので素直に画像つくるか
phpもしくはperl等システム側で画像を縮小して出力するかですね。
縮小出力はサーバーへの負荷がどうなんだろうとおもってやめときましたっていう独り言。

IEなんて嫌いですｐｑ
iphoneでjqueryのクリックイベントが動かない場合

■パターン1

```js
$('#xxx').clikc(function(){
 //処理
}).css('cursor','pointer');
```

■パターン2

```js
$('#xxx').css('cursor','pointer');
$(document).on('click','#xxx',function(){
//処理
});
```

ajaxでイベントがなくなるのを防ぐために$(document).onで記述する場合は
パターン2のように別でcss反映をしてください。
django adminで、logentryをそれっぽく出力

ModelAdminを適当に継承

```
from django.contrib import admin

class BaseAdmin(admin.ModelAdmin):

    def construct_change_message(self, request, form, formsets):
        change_message = []
        if form.changed_data:
            for name in form.changed_data:
                new_data = form.cleaned_data[name]
                old_data = form.initial[name]
                change_message.append(u"{}: {} -> {}".format(name, old_data, new_data))

        if formsets:
            for formset in formsets:
                for added_object in formset.new_objects:
                    change_message.append(_('Added %(name)s "%(object)s".')
                                          % {'name': force_text(added_object._meta.verbose_name),
                                             'object': force_text(added_object)})
                for changed_object, changed_fields in formset.changed_objects:
                    change_message.append(_('Changed %(list)s for %(name)s "%(object)s".')
                                          % {'list': get_text_list(changed_fields, _('and')),
                                             'name': force_text(changed_object._meta.verbose_name),
                                             'object': force_text(changed_object)})
                for deleted_object in formset.deleted_objects:
                    change_message.append(_('Deleted %(name)s "%(object)s".')
                                          % {'name': force_text(deleted_object._meta.verbose_name),
                                             'object': force_text(deleted_object)})
        change_message = ', '.join(change_message)
        return change_message or _('No fields changed.')

```

使うとき

```
from hoge.models import Hoge

class HogeAdmin(BaseAdmin):
    pass

admin.site.register(Hoge, HogeAdmin)
```
gfortran の出力バッファリング

#はじめに
処理に時間のかかるプログラムで、途中経過のログをファイルに出力してチェックするなんてことはよくあると思う。でも gfortran で何も考えずにファイルに write するプログラム書くと、出力がバッファされてヘタするとプログラムが終了するまでファイルに書き出さなかったりするんだ。ΩΩΩ<ﾅ､ﾅﾝﾀﾞｯﾃｰ

#gfortran の出力バッファリングについて
タイトルに gfortran ってつけてるけど他の Fortran コンパイラでも似たようなものじゃないかな? しらんけど。

##ログを出力するサンプル
まずはログ出力のサンプルプログラム。1秒毎にカウンタを計20回ファイルに出力するだけ。

```test_io_buffering.f90
program test_io_buffering
  implicit none
  integer :: u, i
  open(newunit=u, file='test.log', status='replace')
  do i = 1, 20
     write(u, '(*(g0))') 'i = ', i
     call sleep(1)              ! SLEEP is GNU extension
  end do
  close(u)
  call exit(0)                  ! EXIT_OK
end program test_io_buffering
```

これを gfortran でコンパイルして実行する。プログラムが終了する前に test.log の内容を確認すると空のファイルになっているのに、プログラム終了後に確認すると 'i = 1' から 'i = 20' までちゃんと出力されている。

いい忘れてたけど open 文の newunit 指定子とか write 文の g0 フォーマット編集記述子は Fortran 2008 で、sleep は gfortran なんでそうでないとこでは適当に読み替えてほしい。

##どうしてこうなった
これはプログラムの出力が一旦バッファに溜められてまとめてファイルに書きだされるようになっているから。

バッファに溜める理由は高速化のため。

通常ファイルじゃなくて標準出力 (UNIT=6) や標準エラー出力 (UNIT=0) に出力する場合、端末に出力するときはバッファされないんだけれど、ファイルにリダイレクトするとバッファされる。パイプに対してはバッファされないようだ。

| UNIT | コマンド | バッファの有無 |
|:---:|:---|:---|
| 6 | ./a.out | バッファされない |
| 6 | ./a.out > test.log | バッファされる |
| 6 | ./a.out 2>&1 &#x7C; cat > test.log | バッファされない |
| 0 | ./a.out | バッファされない |
| 0 | ./a.out 2> test.log | バッファされる |
| 0 | ./a.out 2>&1 &#x7C; cat > test.log |バッファされない|

上は UNIX での例だが Windows でもコマンドプロンプトで同じようにして試せる。cat はないがこの例くらいなら代わりに more が使える。ていうか、コマンドプロンプトで標準エラー出力もちゃんとリダイレクトできたんだな。


##バッファさせない方法
###明示的に flush(unit) を実行する
明示的に flush(unit) を実行するとバッファがフラッシュされる。flush は Fortran 2003 標準。デメリットはめんどくさいこと。

```fortran:明示的にflushする例
  do i = 1, 20
     write(u, '(*(g0))') 'i = ', i
     flush(u)                   ! write したあと明示的に flush する
     call sleep(1)              ! SLEEP is GNU extension
  end do
```
###環境変数で指定する
環境変数で GFORTRAN_UNBUFFERED_ALL=y を指定するとバッファしないようになる。値は 'Y' でも '1' でも可。ユニットごとには指定できないし write するたびに flush するのでかなり遅くなるかもしれない。

```shell-session:環境変数で指定する例
$ GFORTRAN_UNBUFFERED_ALL=y ./a.out
```

似たような環境変数に GFORTRAN_UNBUFFERED_PRECONNECTED というのもある。こちらは標準出力と標準エラー出力にのみ作用する。値の指定の仕方は同じ。

変数名からわかるように gfortran 限定。

##どうすべきか
ケースバイケースです (おわり)

普通にログ出力として使いたかったらめんどくさくても要所要所に flush を指定するべきじゃないかな。

デバッグ時に使うだけなら環境変数で指定するのもありだと思う。

個人的には open のときに指定したかった (ベンダ拡張でそういうのもあるみたい)。


#おわりに
## 他の Fortran コンパイラだとどうなのか
ifort だとどうなんだろうと思って Intel Fortran でもインストールしてみようと思ったら
無償版は廃止 https://software.intel.com/en-us/forums/topic/533638 だそうな。

じゃあもういいや。
Googleフォームのアンケート集計の例


Googleフォームでは回答の概要で簡易集計できる。


![スクリーンショット_2015-02-23_14_31_07.jpg](https://qiita-image-store.s3.amazonaws.com/0/5840/30c8b016-3db6-a510-eb1c-1283b0a0a9f5.jpeg "スクリーンショット_2015-02-23_14_31_07.jpg")

スプレッドシートで操作することもできるが集計方法がいまいちよくわからなかったので、上記の方法で一旦集計を行う。

ただ、グラフを変えたかったり、順番を変えたかったりした部分もあるので、
簡易集計されたページにグラフとテーブルが出力されているのでテーブルをスプレードシートにペースト。

ペーストしたテーブルをつかって並び換えをしたり、グラフを描いたいりした。

![スクリーンショット 2015-02-23 14.39.06.png](https://qiita-image-store.s3.amazonaws.com/0/5840/216d1ce6-2a5b-70b0-822b-6f31a793a6b9.png "スクリーンショット 2015-02-23 14.39.06.png")

こちらでグラフをかくとグッと綺麗になった。

しかし、どちらかというとD3.jsとかつかってさくっとレポートも一緒に生成できるようになりたい。
macでnfsサーバを建ててkickstartで使う

* CentOS-5.11-i386-bin-DVD-1of2.iso

をmacでマウントすると、`/Volumes/CentOS_5.11_Fina`にマウントされる。
これをnfsで利用させたい。

## 設定

```bash:rootになって/etc/exportsを作成。
sudo -s

cat > /etc/exports <<EOF
/Volumes/CentOS_5.11_Fina 192.168.9.10
EOF

exit
```

* `192.168.9.10` はNFSクライアントのIP
* `/Volumes/CentOS_5.11_Fina`はmacのNFSマウントを許可するPATH

/etc/exportsが生成されると自動でnfsdが起動します。

## syntax check

```bash:
$ nfsd -F /etc/exports checkexports
```

## nfsdで許可している共有一覧表示

```bash:
$ showmount -e
```

## 設定更新

/etc/exports を編集しなおしたら以下コマンドにて設定反映しなおす

```bash:
# nfsd update
```


# kickstartでnfsを指定

* [MacbookAirを使ってclonezillaやCentOSをiPXE bootするの作った - Qiita](http://qiita.com/tukiyo3/items/2a08060e17992fdc6adc)

でbootさせた環境で確認。

```diff:ks.cfg
  text
  install
+ nfs --server=192.168.9.9 --dir=/Volumes/CentOS_5.11_Fina
  lang ja_JP.UTF-8
  langsupport --default=en_US.UTF-8 en_US.UTF-8 ja_JP.UTF-8
  keyboard jp106
```

こんな感じでnfsサーバの指定を行う。
MacでSparkを使ってログの集計するサンプルアプリを作成してみた

ログを集計する方法としてSparkを使ってみる。

## 前準備
### Spark本体のダウンロードとビルド
 [ここ](https://github.com/apache/spark)に書いてある通りまずは`spark`のビルドをする
`maven`は`brew install maven`しとておく事


```sh:mavenのバージョンとか
$ mvn -v
Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-18 00:22:22+0900)
Maven home: /usr/local/Cellar/maven/3.1.1/libexec
Java version: 1.6.0_65, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: ja_JP, platform encoding: SJIS
OS name: "mac os x", version: "10.9.2", arch: "x86_64", family: "mac"
```

※ 自分のsparkのバージョンは1.1系

```sh:clone後にビルド
$ git clone git://github.com/apache/spark.git
$ cd spark
$ mvn -DskipTests clean package
```

この時`OutOfMemory`がでたので調整して再度ビルド

```sh:mavenのメモリ調整
$ export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=512m"
$ mvn -DskipTests clean package
```

ひたすら待って，いつのまにかビルドが正常に終了している事を確認する。

`spark-shell`に入れるか確認

```sh:
$ ./bin/spark-shell
scala> sc.parallelize(1 to 1000).count()
scala> :quit
```
`Error`がでずになんか動いてればおk（ぁ


### Sampleのログデータの準備

`/path/to/logs/`以下にタブ区切りのデータを用意

```test.txt
2015-01-01 10:00	user1	http://spark.apache.org/releases/spark-release-1-2-1.html
2015-01-01 10:00	user1	https://github.com/apache/spark/releases
2015-01-02 11:00	user3	http://spark.apache.org/releases/spark-release-1-2-1.html
2015-01-01 11:00	user3	http://spark-project.org/download/
2015-01-01 11:00	user3	http://spark-project.org/download/
2015-01-01 11:00	user2	http://spark.apache.org/docs/latest/
```



## ログの集計
ログを集計するアプリを作成する。
プロジェクトの場所: `/path/to/spark-sample`

sbtの設定。sparkのライブラリをインストールしておく事。
（プロジェクトの構成とかは`Intellij`まかせ）

```build.sbt
name := "spark-sample"

version := "1.0"

scalaVersion := "2.10.4"

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.1.1"
```

プログラムの本体

```scala:SimpleApp
/* SimpleApp.scala */

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf


object SimpleApp {
  def main(args: Array[String]) {
    val logFile = "/path/to/logs/test.txt"
    val conf = new SparkConf().setAppName("Simple Application")
    val sc = new SparkContext(conf)
    val logData = sc.textFile(logFile)      // sparkからログの取得
    val counts = logData.filter(_.nonEmpty) // 空の行は集計しない
      .map(line => line .split("\t")(1))    // タブ区切りの1つ目をkeyにする(user)
      .map(word => (word, 1))               // keyに対してvalueを1にする
      .reduceByKey(_ + _)                   // valueを足す集計処理

    // valueの値が高い順にソート
    val sortCount = counts.collect.toSeq.sortBy(_._2).toSeq.reverse

    // 出力
    for (i <- sortCount.take(30))
      println(i)

    // 集計した値をさらにsumというkeyで集計（ユニーク数となる）
    val countSum = counts.map(word => ("sum", 1))
      .reduceByKey(_ + _)

    for (i <- countSum.take(10))
      println("unique_sum: " + i)

  }
}
```

`sbt package`でビルド。
その後，スパークで実際に動かしてみる。

```sparkでアプリ実行
$ /path/to/spark/bin/spark-submit --class "SimpleApp" target/scala-2.10/spark-sample_2.10-1.0.jar
```

最初にビルドした`spark`のディレクトリと`target`以下は適宜修正。

```text:集計結果
xxxxx
(user3,3)
(user1,2)
(user2,1)
xxxx
unique_sum: (sum,3)
```

# まとめ
- `scala`が初心者のためそこがつらかった。
- 今後はより実践的なログ集計のプログラムを作る。
- 突っ込み，要望，感想募集中ー。
高速なarray_diff()

#array_diff()の処理速度が遅いので高速化

key,valueをarray_flip()で反転させた配列同士からarray_diff_key()で差分を取り、
再度key,valueを反転させてarray_diff()と同じ結果を取っています。


```php:function.php
//高速array_diff()
function fast_array_diff($a1,$a2){
  return array_flip(array_diff_key(array_flip((array)$a1),array_flip((array)$a2)));
}
```

##処理速度の比較
3000個の整数値が入った配列\$a1と14000個の整数値が入った配列\$a2を用意しました。

`array_diff($a1,$a2)
1.6024 sec`

遅い(´・ω・`)

`fast_array_diff($a1,$a2)
0.0053 sec`

速い(\*･ω･\*)

整数の配列以外で検証してないので、もし結果が異なる場合があれば教えて頂きたいです。

##マニュアル
* [array_diff()](http://php.net/manual/ja/function.array-diff.php)
* [array_diff_key()](http://php.net/manual/ja/function.array-diff-key.php)
* [array_flip()](http://php.net/manual/ja/function.array-flip.php)
Web アプリ使ってて画面上の全てのチェックボックス一気にチェックしたいときのワンライナー

「全てチェックする」的な UI が用意されていなくて辛い Web アプリを使う必要があるとき用。
Chrome でもなんでもいいので JavaScript コンソールを開いて以下を実行する。

```js
Array.prototype.map.apply(document.querySelectorAll('input[type="checkbox"]'), [function (e) { e.checked = true; }])
```

チェックを入れるだけでフォームの送信とかは何もしていない。
状況に応じて `querySelectorAll` のセレクタ部分を適宜いじるとよい。
backbone.viewがtypescriptでコンパイルできない時

typescriptになれた頃、tscさんがこんなエラーをはくようになりました。
今まで普通にbuildできていたコードが修正をいれた途端突然エラーになったので混乱しました。

```
A 'super' call must be the first statement in the constructor when a class contains initialized properties or has parameter properties.
```

クラスのなかでプロパティに値をいれている場合は、superより前にプロパティをイジイジするの禁止らしいです。

<追記>
よくよくエラーをよめば発生する原因が書いてありました。値入りのプロパティをもっているクラス限定の話でした。
エラーは最後まで読まないとだめですね・・・

Backbone.Viewはこの書き方をよくしていたので全般的にbuildが通らなくなりました。
tsのサイトのサンプルを確認してみると

```ts
// The DOM element for a todo item...
class TodoView extends Backbone.View {

　　略

    constructor (options? ) {
        //... is a list tag.
        this.tagName = "li";

        // The DOM events specific to an item.
        this.events = {
            "click .check": "toggleDone",
            "dblclick label.todo-content": "edit",
            "click span.todo-destroy": "clear",
            "keypress .todo-input": "updateOnEnter",
            "blur .todo-input": "close"
        };

        super(options);
　　 略
    }
```
参照)
https://github.com/Microsoft/TypeScriptSamples/blob/master/todomvc/js/todos.ts


**解決1**

下記のように値を設定したプロパティの定義があるはずなので、
それをコンストラクタの内で値をいれるようにすればbuildが通るようになります。

```ts
class myA extend Backbone.View<Backbbone.Model>{
   this.num = 100;

}

```

**解決2**

view生成に必要なthis.tagNameとかthis.elはコンストラクタの引数として渡せばOKでした。

```ts
// The DOM element for a todo item...
class TodoView extends Backbone.View {

　　略

    constructor (options? ) {
        super(_.extend(options,
         tagName:"li",
         events:{
            "click .check": "toggleDone",
            "dblclick label.todo-content": "edit",
            "click span.todo-destroy": "clear",
            "keypress .todo-input": "updateOnEnter",
            "blur .todo-input": "close"
        }
        ));
　　 略
    }
```


改めてリファレンスをみるとsuperに渡すほうが公式に近い書き方に思えてきます。

```js
var ItemView = Backbone.View.extend({
  tagName: 'li'
});
```
参照: http://backbonejs.org/#View-el
mysqldump取得時にdiffを見やすくする為の小ワザ


mysql運用しているとmysqldumpをとって、別環境だったり過去とテーブル定義のdiffを見る時って結構あると思う。
うちの環境では、mysqldumpをgitで管理して差分を見たりしている。

その時に困るのが、オートインクリメントしているカラムがあると下記のように、環境毎のインクリメント値を出力する為にその部分で差分が出てdiffが汚れてしまう。。
diff汚れると、みるのつらい。。。

例えば下記のようなコマンドでdump取ってdiff取ると、オートインクリメントを使っているカラムでの当然環境毎にdiffが出るので、意味のないdiffが発生する。

```困ったケース
#a環境のaaaDBのdump
$ mysqldump -u[ユーザ] -d aaa > a_aaa.sql

#b環境のaaaDBのdump
$ mysqldump -u[ユーザ] -d bbb > b_aaa.sql

$ diff a_aaa.sql b_aaa.sql
< ) EqNGINE=InnoDB AUTO_INCREMENT=561 DEFAULT CHARSET=utf8;
---
> ) ENGINE=InnoDB AUTO_INCREMENT=469 DEFAULT CHARSET=utf8;
96c96
```
これを避けるために、mysqldumpを取るときに、sedでインクリメント部分を除外して出力するとdiffが綺麗になるので、本当に定義が変わった部分だけ比較出来る。

```AUTO_INCREMENT除外
$ mysqldump -u[ユーザ] -d [DB名] |sed 's/ AUTO_INCREMENT=[0-9]*//g' >[name].sql
```

簡単ですが、これ入れただけでdiffとにらめっこする運用コストが結構減ったりするので便利。
Atom でカーソルの点滅を消す CSS

# 問題

カーソルの点滅を止める設定がない。

# 解決策

以下の設定を追加する (Shadow DOM を使う場合) 。

```css:styles.less
atom-text-editor.is-focused::shadow .cursors.blink-off .cursor {
  opacity: 1;
}
```
【2015.02.22】youtube-dlが更新され以前のバージョンで使えなくなった件

#はじめに
以前『[youtube-dlでYouTube動画をダウンロードする方法](http://qiita.com/fantm21/items/8be5c1c5f1b9043269a2)』という記事を書いたのですが、バージョンが変わったのかこれでダウンロードしたのが使えなくなったので使えるようにする方法を。

#方法
まぁ、新しくダウンロードするだけなのだが、ターミナルで次のコマンドを入力。
```sudo curl https://yt-dl.org/downloads/2015.02.21/youtube-dl -o /usr/local/bin/youtube-dl`
```
そのあと次のコマンドを。
```sudo chmod a+x /usr/local/bin/youtube-dl
```

以上で終了です(^^;)

詳細はこちら：[youtube-dl: Download Page](http://rg3.github.io/youtube-dl/download.html)
Notificationの登録を簡単にするextension

Notification登録がだるくてかつけっこうミスりそうなので良い感じのextension作ってみた(　´･‿･｀)

```swift
extension UIViewController {
    // こんな感じの公開メソッドを増やしていく
    func observeKeyboard(willShowSelector: Selector, willHideSelector: Selector) -> () -> () {
        return observeNotification([
            (action: willShowSelector, name: UIKeyboardWillShowNotification),
            (action: willHideSelector, name: UIKeyboardWillHideNotification)])
    }
    func observeDidBecomeActive(action: Selector) -> () -> () {
        return observeNotification(action, name: UIApplicationDidBecomeActiveNotification)
    }

    // あるいはこちらを公開して直に使っちゃっても良いかも
    private func observeNotification(action: Selector, name: String) -> () -> () {
        return observeNotification([(action: action, name: name)])
    }
    private func observeNotification(pairs: [(action: Selector, name: String)]) -> () -> () {
        for p in pairs {
            NSNotificationCenter.defaultCenter().addObserver(self, selector: p.action, name: p.name, object: nil)
        }
        return { [unowned self] in // これ忘れるとメモリリークするので注意
            for p in pairs {
                return NSNotificationCenter.defaultCenter().removeObserver(self, name: p.name, object: nil)
            }
        }
    }
}
```

```swift
// ViewControllerのappear系で登録
removeObserverClosure = observeDidBecomeActive("didBecomeActive:")
    
// ViewControllerのdisappear系で登録解除
removeObserverClosure()
```
oracle db、mybatisのtips

拾い集めたtipsのまとめ。

# シーケンスの一覧取得

`SELECT * FROM all_objects WHERE object_type='SEQUENCE'`

# upsert

```
MERGE INTO TEST01
USING DUAL
ON (ID=4)
WHEN MATCHED THEN
    UPDATE SET TEXT='DDDD'
WHEN NOT MATCHED THEN
    INSERT ( ID, TEXT ) VALUES ( 4,'DDDD' )
;
```

# mybatisでoracle db のmerge文

```
<update id="exceMerge" parameterType="hashmap">
        MERGE INTO USERS U USING DUAL ON (U.PROPERTY_NAME=#{prop_name}) 
        WHEN MATCHED THEN 
        UPDATE SET U.PROPERTYVALUE=#{prop_value}, U.MESSAGE=#{message,javaType=String,jdbcType=CLOB}
        WHEN NOT MATCHED THEN 
        INSERT(PROPERTY_NAME, PROPERTYVALUE, MESSAGE) VALUES (#{prop_name},#{prop_value},#{message,javaType=String,jdbcType=CLOB})
</update>
```

# シーケンス採番によるinsert 

```
INSERT INTO USER_MASTER (
        USER_NAME, DEPT_NO, USER_ID
) VALUES (
        'xxx'
        '1001', 
         seq01.nextval
) ;
```

# シーケンスから採番

`select SEQ_HOGE.nextval from dual;`


# シーケンスから一度に複数個を採番

`SELECT HOGE_SEQ.nextval FROM DUAL CONNECT BY LEVEL <= 10`

# resultTypeをBigIntegerにする

 `resultType="java.math.BigInteger"`

# DECODE関数を使ってbooleanでうけとる
なにかのフラグを、値があるかnullかというデータの持ち方になってるときの対処法
DECODE関数で、値があるときは1、ないときは0を返すようにすれば、javaはbooleanで受け取れる

`SELECT DECODE(col1, '1', 1, 0) FROM table`

# springで、mybatisの設定ファイルを読み込む設定

SqlSessionFactoryBeanのconfigLocationで指定

```
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<property name="configLocation" value="classpath:mybatis-config.xml" />
    </bean>
```

# snake_caseのカラム名をcamelCaseのプロパティ名にマッピング

mybatisの設定ファイルに下記を記述。

```
<configuration>
	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
</configuration>
```


# mybatisでマッパーのメソッドの引数を複数にする


メソッドの引数に@Paramアノテーションでパラメタ名を指定

```lang:HogeMapper.java
import org.apache.ibatis.annotations.Param;

public interface HogeMapper {

    public List<ParkingKarte> find(
            @Param("name") String name, //パラメタ名を指定して、XMLでこの名前がつかえる
            @Param("bean") Bean bean);
}


```

XMLではparameterTypeをmapにすれば、上で決めたパラメタ名を使ってかける。Beanのプロパティもxx.yyの形で使える。

```lang:HogeMapper.xml

<select id="find" parameterType="map">
SELECT * FROM Hoge where name = #{name} AND status = #{bean.status}
</select>

```

# MyBatisのコードを自動生成(MyBatis Generator)

DBからコード生成するためのツール。
http://www.mybatis.org/generator/

## 使い方

https://cloudear.jp/blog/?p=708

http://hit-techblog.blogspot.jp/2014/03/mybatis-2.html

http://intink.blogspot.jp/2012/11/mybatisibatismybatis-generator.html

## [Mybatis Generatorでimmutableなクラスを生成](http://qiita.com/n_slender/items/10cd36e599e0cf5d2d4d)

## スネークケースのカラム名をキャメルケースのプロパティにマッピング

```generatorConfig.xml

        <table tableName="*">
     	 <property name="useActualColumnNames" value="false"/>
	</table>
```

## モデルクラスと対応するxmlファイルだけ生成

```generatorConfig.xml

        <table tableName="*">
     	 <property name="modelOnly" value="true"/>
	</table>
```

## コンストラクタで値をセット

```generatorConfig.xml

 <javaModelGenerator targetPackage="hoge.modeles" targetProject="src\main\java">
    	<property name="constructorBased" value="true"/>
    </javaModelGenerator>
```

# MyBatisの事例

http://www.slideshare.net/s_kozake/my-batis-35862790
macのテキスト編集時にデフォルトで設定されているテキスト編集時のKeybind


##全てCtrlキーを押しながら

e (end) 行末に移動
t (trans?) 前後文字の入れ替え
y (yank?) ペースト？
o (?) 改行挿入
p (prev) 十字キー上

a (?) 行の先頭
d _delete_
f (forward) 十字キー右
h (hide) _backspace_
k (カット????) カーソル位置から行末まで削除-> このあとctrl+yでペーストする

v (?) 文書の最後に移動
b (back) 十字キー左

※()内は独断と偏見で。
Play Frameworkでの定期ジョブ実行

# バージョン情報
* Play Framework 2.3.6 Java

# 実行させたいジョブ
`akka.actor.UntypedActor`を継承し, `onReceive()`をオーバーライドします.
挨拶をコンソールに表示するジョブを作ってみましょう.

```java:app/mypackage/HelloActor.java
package mypackage;

public class HelloActor extends akka.actor.UntypedActor {
	private final String name;
	
	public HelloActor(String name) {
		this.name = name;
	}
	
	@Override
	public void onReceive(Object arg) throws Exception {
		System.out.println(java.text.MessageFormat.format("Hello, {0}!", name));
	}
}
```

# ジョブの登録
次に, `play.GlobalSettings`を継承したクラスを作成し, `onStart()`メソッドの中でジョブを登録します. 起動5秒後から, 10秒毎にジョブを実行する設定にしてみましょう.

```java:app/mypackage/Global.java
package mypackage;

import java.util.concurrent.TimeUnit;
import scala.concurrent.duration.FiniteDuration;

public class Global extends play.GlobalSettings {
	private akka.actor.Cancellable canceller = null;
	
	@Override
	public void onStart(play.Application application) {
		System.out.println("BEGIN GREETING");
		
		super.onStart(application);
		
		akka.actor.ActorRef actor = play.libs.Akka.system().actorOf(
			akka.actor.Props.create(HelloActor.class, "world")
		);
		canceller = play.libs.Akka.system().scheduler().schedule(
			FiniteDuration.create( 5, TimeUnit.SECONDS), // スケジュール開始時点から初回実行までの時間.
			FiniteDuration.create(10, TimeUnit.SECONDS), // 2回目以降の実行間隔.
			actor,
			"N/A", // onReceiveの第1引数に渡る値. nullだとジョブ実行時に例外が飛ぶ.
			play.libs.Akka.system().dispatcher(),
			null
		);
	}

	@Override
	public void onStop(play.Application application) {
		System.out.println("END GREETING");
		
		if(canceller != null) {
			canceller.cancel();
		}
		
		super.onStop(application);
	}
}
```

onStartのついでにonStopも実装して, アプリケーション終了前にジョブをキャンセルするようにしてみました. 実際にはアプリケーション終了時に手動でジョブを止める必要はないと思いますが, 登録から停止までのサンプルということで.

# GlobalSettingsの場所を指定する
最後に, 上で書いた`Global.java`の位置をplayに教えてあげましょう.
`application.conf`に書きます.

```HOCON:conf/application.conf
application.global=mypackage.Global
```

# 追記
`activator run`で起動した場合, onStartが呼ばれるのは起動した瞬間ではなく, 起動後初回のAction実行時(ブラウザでページを見ようとしたときとか)です. そういえばこれでハマってたのを思い出した.
【Android】webViewでポスト通信する時にちょっとひっかかった話。【ちょっぴりiOSも】



ポストで通信したかっただけなのに....
Androidさんがいぢめる！

## posturlを使ってwebviewの表示を切り替えていると、リダイレクトの時に別ブラウザを立ち上げようとする


どうしてそういう挙動になるのかよくわからないのですが、
解決手段としてWebViewのクライアントを俺クライアントにして、
shouldOverrideUrlLoadingメソッドの部分で即returnを返してあげるようにすると
webView内で完結するようになった。

```java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_webview);

        String url = "http://www.google.co.jp/";

        webView = (WebView) findViewById(R.id.webView);

        //クライアント上書き。
        webView.setWebViewClient(new ViewClient(webView));

        //ユーザーエージェント設定
        String userAgent = webView.getSettings().getUserAgentString();
        webView.getSettings().setUserAgentString(userAgent + "fc.app.native Android Mobile AppleWebKit Device");


        //ポストしたデータを送信
        String data = "num=1234";
        
        webView.postUrl(url, data.getBytes());

    }
	
	//WebViewClientを継承
    public class ViewClient extends WebViewClient {
        public ViewClient (WebView view){
        }
        //もし画面がWebView内でリンクがTapされてロードが始まったら割り込んでブラウザを立ち上げる
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    }
```

どうしてこうなるんだろう。

この不思議な現象のせいで「postUrlは外部ブラウザを立ち上げるメソッド何じゃないか」と錯覚しそうになりました。

詳しい人おしえて下さいm(_ _)m


## ちなみにiosでポストする時はこんな感じ。

```objective-c

NSString url = @"http://www.google.co.jp/"
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:url];

// POST指定
req.HTTPMethod = @"POST";

// BODYに登録、設定
NSString *body = [NSString stringWithFormat:@"num=1234"];

req.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
// リクエスト送信
[_webView loadRequest:req];

```
XAMPP と PHPビルトインウェブサーバー を併用すると MySQL の接続で PDO Error が出てハマる

XAMPPのPHPとPHPビルトインサーバの参照しているphp.iniが違うのが原因
PHPビルトインサーバの参照するphp.ini（phpinfoで調べろ）のmysql.default_socketの値をXAMPPで設定されているものに変更したらうごく
クロスブラウザテスト


というか、各端末で画面が正常に表示されているかを確認するために、クラウドでその辺りの検証が出来るサービスを探していて色々試してみたメモ。Seleniumでの自動テストとかのあたりはあまり考えてなくて、あくまで見た目とかの確認をしやすい点を重視。

## SauceLabs
https://saucelabs.com/

- UIがイマイチで使う気失せた・・

## BrowserStack
http://www.browserstack.com/

- 動作が不安定だけで、Trialで使える端末とOSの選択肢が多いのでとりあえずつかうにはいいかも
- 動作も他のに比べると軽い
- Mac上でエミュレートしてるっぽいのが気持ち悪い。

![スクリーンショット 2015-02-23 12.55.45.png](https://qiita-image-store.s3.amazonaws.com/531/31994/91b08e69-f26b-db3e-390f-21f7b3c998b7.png "スクリーンショット 2015-02-23 12.55.45.png")


## CrossBrowserTesting
https://crossbrowsertesting.com/

- これが一番使いやすく動作も安定していた
- FreeTrialで出来る事が少なくてちゃんと試せ無いのが残念

![スクリーンショット 2015-02-23 12.57.49.png](https://qiita-image-store.s3.amazonaws.com/531/31994/ca489e94-0cae-63e0-e58d-d679b86b204b.png "スクリーンショット 2015-02-23 12.57.49.png")


## Browsera
http://www.browsera.com/
- ブラウザで動作した時にJavascriptエラー等を自動テストしてくれるようなもの？で、そもそも目的のものではなかった

![スクリーンショット 2015-02-23 13.05.23.png](https://qiita-image-store.s3.amazonaws.com/531/31994/70fb90b7-40c4-9d44-ed3e-cce118092d39.png "スクリーンショット 2015-02-23 13.05.23.png")

# 結果
$29/MonthだけどCrossBrowserTesting使ってみて、いまいちだったらBrowserStackも検討かなかな・・という感じ、Adobeからでている何かもあったような気がするけど、使い勝手とか知っている人いたら教えてほしい。
CentOS環境下にword2vec を入れるスクリプト

```
#!/bin/bash

yum -y update
yum -y groupinstall "Development Tools”
yum -y groupinstall "Development Libraries"

echo 'export PATH=$PATH:/usr/local/bin' > /etc/profile.d/path-to-local-bin.sh

pushd /usr/local/src > /dev/null
   svn co http://word2vec.googlecode.com/svn/trunk/ word2vec
   pushd word2vec
      make
      mv compute-accuracy distance word-analogy word2phrase word2vec /usr/local/bin/
   popd
popd
```
JS で hoge.fuga = hoge.fuga すると元通りじゃない話

まぁ C# みたいにセッター・ゲッターを好きに定義できる言語だと当たり前のような話なんですが…

ではなく、ではなく。

JavaScript でゲッターやセッターを定義した場合の話ではなく、そもそも見落としがちな言語仕様のことですよという。

以下のように `hoge.fuga = hoge.fuga` みたいなことをすると必ずしも元通りにならない。

```js
// コンストラクタ関数
function Hoge() {
}
// prototype にメソッド定義
Hoge.prototype.fuga = function(){
    console.log('fuga');
};

// コンストラクタから生成したオブジェクト
var hoge = new Hoge();

hoge.fuga();

// fuga は hoge に含まれるが
console.log('\'fuga\' in hoge -> ' + ('fuga' in hoge));
// hoge 自身のプロパティではない
console.log('hoge.hasOwnProperty(\'fuga\') -> ' + hoge.hasOwnProperty('fuga'));

// hoge.fuga = hoge.fuga は何もしてないように見えるが…
console.log('hoge.fuga = hoge.fuga');

var fuga = hoge.fuga;
hoge.fuga = fuga;

hoge.fuga();

console.log('\'fuga\' in hoge -> ' + ('fuga' in hoge));
// hoge.hasOwnProperty('fuga') の結果が変わる
console.log('hoge.hasOwnProperty(\'fuga\') -> ' + hoge.hasOwnProperty('fuga'));

```

[JSFiddle](https://jsfiddle.net/co3h6vkg/)

これはプロパティの取得アクセス時に呼ばれる内部 ``[[Get]]`` メソッドがプロトタイプチェーンを辿るのに対して、代入アクセス時に呼ばれる内部 ``[[Put]]`` メソッドはオブジェクト自体にプロパティを設定してしまうから。

結果、`hoge.[[prototype]].fuga` を `hoge.fuga` に設定してしまうことになって元の通りにはならない。

一時的にメソッドの処理を差し替えるために元のプロパティを退避してどうこうするような黒魔法を使う場合は念のため上記の現象が問題ないかを確認する必要がある。

```js
var hoge = getHoge();
// 退避
var orgFuga = hoge.fuga;
// 一時的に処理差し替え
hoge.fuga = function () {...};
// 差し替えた状態で何かする
hoge.doSomething();
// 退避した orgFuga を元に戻す
hoge.fuga = orgFuga; // ←元に戻してるつもりで、厳密には元通りじゃない
```
簡易版、世界の現在時刻


地図のここは現在何月何日なんだろ？ってのを調べるのに簡単な方法はないかな？と思い作りました。

[The Google Time Zone API](https://developers.google.com/maps/documentation/timezone/)なんていう緯度経度からタイムゾーンを教えてくれるAPIもありますが、ざっくりな結果でよかったので...

経度がわかれば時差もわかります。地球は丸くて360度で24時間→15度で1時間です。
日本だと東経135ですから、135/15=9時間ですね。

もっと簡単な方法があったらコメントよろしくお願いします。

```html
<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=true&language=ja"></script>
	<title>World Longitude Time</title>

	<style>
		html,body {
			margin:0;
			padding:0;
			height:100%;
		}
		#map {
			margin:0px;
			padding:0px;
			width:100%;
			height:100%;
			display:block;
		}
		#time {
			position:absolute;
			top: 0;
			left: 0;
			right: 0;
			bottom: 0;
			margin:auto;

			width: 300px;
			height:2em;
			line-height:2em;
			text-align:center;

			border:1px solid red;
			background-color:rgba(255,255,255,0.7);;
		}
	</style>
	
	<script>
		var map;

		function initialize() {
			var mapOptions = {
				"zoom"      : 5,
				"minZoom"   : 5,
				"center"    : new google.maps.LatLng(36.5,135.0), //東経135度が日本の標準時
				"mapTypeId" : google.maps.MapTypeId.ROADMAP
			};
			map = new google.maps.Map(document.getElementById('map'), mapOptions);
			google.maps.event.addListener(map, 'center_changed', center_changed);
			lng_date();
		}

		function center_changed() {
			var lng = map.getCenter().lng();
			if ( lng < -180 ) {
				map.setCenter(new google.maps.LatLng(map.getCenter().lat(),180));
				return;
			}
			if ( lng >  180 ) {
				map.setCenter(new google.maps.LatLng(map.getCenter().lat(),-180));
				return;
			}
		}
	
		function lng_date() {

			var lng = map.getCenter().lng();

			var lng_msec = lng / 15 * 60 * 60 * 1000;//経度をmsec時差に変換
			var utc = new Date((new Date()).getTime() + lng_msec); //基準時間から時差分をずらす。
			
			var yy = ("0000" + (utc.getUTCFullYear()  )).slice(-4);
			var mm = ("00"   + (utc.getUTCMonth() + 1 )).slice(-2);
			var dd = ("00"   + (utc.getUTCDate()      )).slice(-2);

			var HH = ("00"   + (utc.getUTCHours()     )).slice(-2);
			var MM = ("00"   + (utc.getUTCMinutes()   )).slice(-2);
			var SS = ("00"   + (utc.getUTCSeconds()   )).slice(-2);

			var ret = yy + '/' + mm + '/' + dd + ' ' + HH + ':' + MM + ':' + SS;

			document.getElementById('time').innerHTML = "lng:" + Math.round(lng) + ";" + ret;

			setTimeout(lng_date,1000);

		}

		google.maps.event.addDomListener(window, 'load', initialize);
	</script>
</head>

<body>
	<div id="map"></div>
	<div id="time">time</div>
</body>

</html>

```
非常に安易なnginx reverse proxyの作り方

今回はCentOSを前提としていますが、多くのUN*X系システムにおいて同様の方法で実現できるはずです。

# 環境の準備
## tmpfsを準備する

/etc/fstab に以下のエントリーを追加し、OSで使用できるうちの20%のメモリをtmpfsとして確保します。
ディスクへの読み書きを減らし、速度向上・環境によるストレージ利用制限を回避を実現します。

```
tmpfs  /var/cache/nginx    tmpfs   defaults,noatime,mode=1777,size=20%      0 0
```

# nginxの準備
## 導入方法の確認

nginx公式ページにて導入方法を確認します。
http://nginx.org/en/docs/install.html
今回はCentOSですので、更にLinux系のページヘ進みます。
http://nginx.org/en/linux_packages.html

## リポジトリの追加

リポジトリを /etc/yum.repos.d/nginx として追加し、yumで取り扱える状態とします。

```
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
```
## リポジトリを利用してインストール

取り扱える状態になったらyumでインストールします。

```
# yum update
# yum install nginx -y
```

## reverse proxy設定の追加

以下のような設定を /etc/nginx/conf.d/reverseproxy.conf として追加します。

- TCP8080でlistenしているWebサーバがいる
- 指定したファイル形式以外はキャッシュせずスルーで流す(HTMLなどが動的な場合こうしておくと安全です)
- http://localhost/invalidate_cached_url/%なんとか% でinvalidationしたい

```
proxy_cache_path /var/cache/nginx/static_file_cache levels=1:2 keys_zone=cache_static_file:128m inactive=7d max_size=512m;
proxy_temp_path /var/cache/nginx/temp;

upstream backend {
	server 127.0.0.1:8080;
}
 
server {
	listen 80;
	server_name _;
	location / {
		proxy_redirect off;
 
		set $do_not_cache 0;
		if ($request_method != GET) {
			set $do_not_cache 1;
		}
		if ($uri !~* ".(jpg|png|gif|jpeg|css|js|swf|pdf)$") {
			set $do_not_cache 1;
		}
		proxy_no_cache $do_not_cache;
		proxy_cache_bypass $do_not_cache;
		proxy_cache cache_static_file;
		proxy_cache_key $scheme$host$uri$is_args$args;
		proxy_cache_valid 200 5m;
		proxy_cache_valid any 1m;
 
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-Host $host;
		proxy_set_header X-Forwarded-Server $host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_pass http://backend;
	}
	location ^~ /invalidate_cached_url/ {
        allow 127.0.0.1;
        deny all;
        proxy_cache_purge nginx_cache $arg_url;
    }
}
```
waf(weighttp)作成時にライブラリを入れてるのに見つからないと言われたら

weighttp(HTTP負荷ツール)をmakeする際に軽くハマったのでメモしておきます。
C_INCLUDE_PATHを指定するだけです。

```
# C_INCLUDE_PATH=/usr/include/libev ./waf configure
Checking for program gcc,cc              : ok /usr/bin/gcc 
Checking for program cpp                 : ok /usr/bin/cpp 
Checking for program ar                  : ok /usr/bin/ar 
Checking for program ranlib              : ok /usr/bin/ranlib 
Checking for gcc                         : ok  
Checking for library ev                  : ok 
Checking for header ev.h                 : ok 
Checking for library pthread             : ok 
Checking for header pthread.h            : ok 
Checking for header unistd.h             : ok 
Checking for header stdint.h             : ok 
Checking for header fcntl.h              : ok 
Checking for header inttypes.h           : ok 
'configure' finished successfully (0.356s)
```
Laravel の migrate で increments() のカラムは、$fillable = ['id'] にして create() で指定しても無視される

```database/migrations/create_hoge_table.php
Schema::create('hoges', function(Blueprint $table)
{
    $table->increments('id');
    $table->string('name');
    $table->timestamps();
}
```

```app/Hoge.php
class Hoge extends Model {
    protected $table = 'hoges';
    protected $fillable = ['id', 'name'];
}
```

```database/seeder/DatabaseSeeder.php
Hoge::create([
    'id' => 0,
    'name' => 'hoge'
]);
```

```
php artisan migrate
php artisan db:seed
```

マイグレーションもシーダーも動くけど、作成されたレコードを見るとid=1になってる
[R] ggplot2で等高線を描く

Rで等高線やヒートマップを描くにはいくつか方法があります。

#### Rのデフォルトの気に食わない点
特にインストールしなくても使えるimage()関数を使う方法がメジャーと思いますが、慣れていないとデータと図の向きが思っていたのと逆になったりして発狂します。

#### {ggplot2}を使う方法の紹介
データの縦持ちに慣れてしまったggplot2脳をお持ちの方にはぜひこちらをおすすめしたいです。

```R:draw_contour.R
library(ggplot2)

## 等高線やヒートマップを描くのにキモとなるdata.frameを作成
N <- 60
x <- seq(0, 100, length=N)
d.cont <- data.frame(x=rep(x,N), y=rep(x,each=N))
d.cont <- transform(d.cont,
	z.diff=x-y,
	z.ratio=ifelse(x+y==0, 0.5, x/(x+y))
)

## 等高線上にプロットする点 (別になんでもOK)
set.seed(123)
d.point <- data.frame(x=runif(20, 0, 100), y=runif(20, 0, 100))

## 差の等高線
p <- ggplot()
p <- p + geom_tile(data=d.cont, aes(x=x, y=y, z=z.diff, fill=z.diff), alpha=0.6)
p <- p + geom_contour(data=d.cont, aes(x=x, y=y, z=z.diff, fill=z.diff), color='black', size=1, alpha=0.3)
p <- p + geom_point(data=d.point, aes(x=x, y=y), color='black', size=2, alpha=0.8)
p <- p + geom_abline(aes(slope=1, intercept=0), color='black', alpha=0.4, size=2)
p <- p + scale_fill_gradient2(low='blue', mid='white', high='red')
p <- p + coord_cartesian(xlim=c(0, 100), ylim=c(0, 100))
ggsave(p, file='demo_contour_diff.png', dpi=300, w=6, h=5)

## 比の等高線
p <- ggplot()
p <- p + geom_tile(data=d.cont, aes(x=x, y=y, z=z.ratio, fill=z.ratio), alpha=0.6)
p <- p + geom_contour(data=d.cont, aes(x=x, y=y, z=z.ratio, fill=z.ratio), color='black', size=1, alpha=0.3)
p <- p + geom_point(data=d.point, aes(x=x, y=y), color='black', size=2, alpha=0.8)
p <- p + geom_abline(aes(slope=1, intercept=0), color='black', alpha=0.4, size=2)
p <- p + scale_fill_gradient2(midpoint=0.5, low='blue', mid='white', high='red')
p <- p + coord_cartesian(xlim=c(0, 100), ylim=c(0, 100))
ggsave(p, file='demo_contour_ratio.png', dpi=300, w=6, h=5)
```

![demo_contour_diff.png](https://qiita-image-store.s3.amazonaws.com/0/12869/1e482e33-a8a1-c3ac-d63d-5f92cb1ce620.png)
![demo_contour_ratio.png](https://qiita-image-store.s3.amazonaws.com/0/12869/a314a1a2-ed64-76e1-9dff-c81ac7dfb176.png)

#### 不満点
等高線に小さな数字がつかないのが寂しいです。コードの読解性や開発時間も重要ですが、図が特に重要な場合はRubyDCLで作図しています。これはデフォルトで等高線に小さな数字がついて最高なんですよ。リンクだけはっておきます。

 - 本家 http://www.gfd-dennou.org/arch/ruby/products/ruby-dcl/
 - るびまの記事 http://magazine.rubyist.net/?0006-RLR
 - 堀之内さんの解説記事[pdf] http://www.jspf.or.jp/Journal/PDF_JSPF/jspf2008_04/jspf2008_04-217.pdf
AWS HVMでディスク拡張するときの注意点

HVMでEBSを利用する際のディスク拡張ですが、growpartが日本語localeを解釈しない問題を回避する必要があります。
最近のAMIだとすでにcloud-initで対応しているものが多くなっていますが、手動作業の際にはご注意下さい。

```
yum install cloud-utils-growpart -y
LC_ALL="en_US.UTF-8" growpart /dev/sda 1
reboot
```

```
resize2fs /dev/xvda1
```
UITableViewでスクロールをAppスイッチャー風に止める

UITableViewのスクロールをiOSのApp切り替え画面みたいな感じで、慣性に違和感を感じさせずに好きな位置で止めるやり方。

```swift:MyTableViewController.swift
class MyTableViewController: UITableViewController {
	override func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        let y = //targetConttentOffset.memory.y とか scrollView.frame.height とかをゴニョゴニョしてお好みの位置に
        targetContentOffset.memory.y = y
    }
}
```

これだけ。targetContentOffsetが指している値が、このまま行くと止まるはずの場所。
この値を書き換えてあげれば、慣性に違和感を感じさせずにスクロールしてくれる。

`scrollViewWillEndDragging`は、ユーザが指を離したタイミングで必ず呼ばれるっぽい。
なので、`scrollViewDidEndDecelerating`とか、`scrollViewDidEndDragging:willDecelerate`とかでゴニョゴニョする必要はない。

[参考にしたstackoverflow](http://stackoverflow.com/questions/9367600/custom-uiscrollview-paging-with-scrollviewwillenddragging stackoverflow)
[リファレンス](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIScrollViewDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIScrollViewDelegate/scrollViewWillEndDragging:withVelocity:targetContentOffset: "リファレンス")
AWSの侵入テストを同一VPCで完結したい場合の申請方法

AWSで脆弱性診断を行うときには「ちゃんと意図してやってますよ、sourceもdestinationも特定してますよ」ということを申請する必要があります。

http://aws.amazon.com/jp/security/penetration-testing/

今回同一VPCで完結した侵入テストを行う申請をしましたが、外部からの侵入テストとはすこし違う申請方法が必要でしたのでまとめます。
注意点は<b>source IPとdestination IPはプライベートアドレスで届け出をする</b>ことです。
同一VPC(更に今回は同一subnet)で完結する場合、プライベートアドレスで届け出をする必要があります。

申請後しばらく時間が経過して、許可された場合以下のようなフォーマットでメールが届きます。

```
Hello,

Thank you for contacting us.  We have received your request for authorization for penetration testing.

Your request as detailed below has been approved.
Your authorization number is: XXXXXXXXXX

As a reminder,
- you have agreed to abide by the Terms and Conditions and AWS’s Procedures Regarding the Use of Security Assessment Tools and Services.  You can review what you have agreed to at https://aws-portal.amazon.com/gp/aws/html-forms-controller/contactus/AWSSecurityPenTestRequest
- you have agreed to abide by Amazon Web Services Customer Agreement available at http://aws.amazon.com/agreement/
- if you discover any vulnerabilities or other issues that are the direct result of AWS, you have agreed to contact aws-security@amazon.com within 24 hours of completion of your testing.

Best regards,

AWS CUSTOMER SERVICER NAME
http://aws.amazon.com

---- Original message: ----

AWS AccountId                   XXXXYYYYZZZZ
Name                    YOUR NAME
CompanyName
Email                   EMAIL@YOUR.DOMAIN
AccountNumber                   XXXXYYYYZZZZ
AdditionalEmail
ThirdPartyContact                       THIRD PARTY CONTACT
ScannedIPAddrs                  172.31.BBB.BBB
InstancesAre                    source<br>target
InstanceIDs                     i-XXXXXXXX
i-YYYYYYYY
SourceIPAddrs                   172.31.AAB.AAA
Region                  TOK
Timezone                        gmt+9
StartDateandTime                        YYYY-MM-DD hh:mm
EndDateandTime                  YYYY-MM-DD hh:mm
Comments
TermsAndConditions                      i-agree
ScanPolicyAgreement                     i-agree
```

残念ながら許可されなかった場合には以下のようなメールが届きますので内容を再確認して再申請しましょう。

```
Hello,

Thank you for your email. While verifying your request we found that the provided source IPs do not conform to our policies for testing. You are welcome to have that company contact us so that we can remedy this directly with them in order for your testing to proceed.

We apologize for any inconvenience this may cause.Please feel free to contact us with any questions.

Best regards,

AWS CUSTOMER SERVICER NAME
http://aws.amazon.com

---- Original message: ----
```
Twitter4Jを使ってTwitterのBotを作ってみた結果

個人的によく聴くInterFMですが、プレイリストをTwitterで流して欲しいなと思ったけれど無かったのでjavaでそんなことをしてくれるbotを作ってみました。作ったのはこれ → https://twitter.com/InterfmNowplay
実行可能なjarをさくらVPSにデプロイしてcronで10秒ごとに動かしています。

結果いろいろと知ったのでメモです。

###■Twitter4JによるTwitter操作
Twitter4J - http://twitter4j.org/ja/index.html

JavaでTwitterのAPIを扱う場合、Twitter4Jというライブラリが便利です。
認証関連はTwitterのページで作成できるキー4つ(consumerKey/consumerSecret/accessToken/accessTokenSecret)をpropertiesファイルに定義するだけです。
また、Tweetするためのコードはこれだけ。

```java:tweetする
Twitter twitter = TwitterFactory.getSingleton();
User user = twitter.verifyCredentials();
Status status = twitter.updateStatus(singer + "/\"" + music + "\"" + "\t" + time);
```

Twitter用のオブジェクトを作って、認証通して、ツイートという流れですね。

###■jsoupによるHTMLのパース
jsoup - http://jsoup.org/
プレイリストの元ネタですが、InterFMで特にAPIを用意してくれてるわけでもないので、HPからスクレイピングするしかありません。パースするのに何かいいライブラリないかなと探したところ、jsoupというライブラリが良さ気だったのでとりあえず試してみました。

あるページのHTMLを取得するコードはこれだけです。

```java:HTML取得
Document document = Jsoup.connect("https://www.interfm.co.jp/search/").get();
```

以下のコードでHTML全体を文字列で取得できます。

```java:文字列取得
document.outerHtml();
```
要素の取り出しですが、CSSのセレクタも使えますし、

```java:CSSのセレクタ
Elements elements = document.select("table tr");
```
jsoup特有の取り出し方もあります。

```java:CSSのセレクタ
Element element = elements.last();
```

結果、例えば以下が同義だったりします。

```java
Element element = document.select("table tr").last();
Element element = document.select("table tr:last-child").get(0);
```
で、ごにょごにょやって、下記のようなtableから時間と曲名とアーティストを抜き出します。あとはそれをさっきのTwitter4Jを使ってtweet。

![スクリーンショット 2015-02-20 18.23.35.png](https://qiita-image-store.s3.amazonaws.com/398/47824/9c50b641-25be-f15a-1625-a6ee8bef6c5a.png)

###■Twitterアカウント作成に電話番号認証が必要になっていた
ラジオのNowPlayingを呟くBotなんて当然サブ垢で作りたかったのでとっても困りました。2014年の12月頃から？電話番号認証が必要になった模様です。電話番号を登録し、その番号にSMSで送られてくるキーを入力することで認証が通ります。これまでのように自由にサブ垢が作れなくなったということです。
とりあえず作成に必要だということで、メイン垢の方にはまだ番号登録していなかったので、仕方なく今回作ったサブ垢に番号を登録しました。番号認証はあとで外したいと思いますが、外したらBot動かなくなるのかな・・？

###■おまけ
InterFMは洋楽中心(去年くらいから邦楽も流すようになってきたらしい)ですが、フジロックのオフィシャルメディアだけあってか、上質な洋楽()がどんどん流れてきて良いですよ〜。うちではiPhoneのRadikoをBluetoothでスピーカに繋げてずっと流してます。フジロック系の音楽が好きな方なら絶対ハマると思います！
Scala メモ

# installation
## JDKのインストール
```:sh
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java7-installer
```

### Scala + sbtのインストール
- [参考](https://gist.github.com/visenger/5496675)

# JSONライブラリ
- Lift JSON(デファクトスタンダードっぽい)
- JSON4S
MQTT(Sango)をTesselで使ったらコネクション数を消耗してしまうみたい...?


記事というか質問というか。

- Tessel
Node.jsで開発できるマイコンボード http://tessel.io

- MQTT 
M2MやIoT向けの軽量プロトコル。TCPレイヤーなのでWebsocketなどよりはだいぶ低レイヤー。

- Sango
MQTTをBaaS的に使えるWebサービス

##TesselでMQTTを使ってみた

[春だ！IoTだ！sango経由でTesselとMQTTで通信だ！
](http://qiita.com/hogelog/items/87706186d8a64ebb048b)
この記事を参考にTesselをMQTTに接続してみました。

[時雨堂](https://shiguredo.jp/)さんのMQTTブローカーサービス[Sango](https://sango.shiguredo.jp)

最初はうまくって言ってたんですけど...

##Connection refused: Not authorized
っていうエラーに悩まされてました。

なんで繋がらないのか


```
events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: Connection refused: Not authorized
    at MqttClient._handleConnack (/Users/sugawara_nobisuke/n0bisuke/lab/tessel-code/node_modules/mqtt/lib/client.js:524:9)
    at Connection.<anonymous> (/Users/sugawara_nobisuke/n0bisuke/lab/tessel-code/node_modules/mqtt/lib/client.js:191:10)
    at Connection.emit (events.js:107:17)
    at Connection._write (/Users/sugawara_nobisuke/n0bisuke/lab/tessel-code/node_modules/mqtt/lib/connection.js:176:12)
    at doWrite (_stream_writable.js:301:12)
    at writeOrBuffer (_stream_writable.js:288:5)
    at Connection.Writable.write (_stream_writable.js:217:11)
    at Socket.ondata (_stream_readable.js:540:20)
    at Socket.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:163:16)
```

##どうやら無料プランの同時コネクション数上限を超えてしまっていたみたい

Sangoのダッシュボードで確認すると上限の6コネクションになってました。

![](http://i.gyazo.com/7067736d78d78c0018fc55ff3c4f0f64.png)


##Tessel内のプロセスが生きてる?

Tesselでプログラムを動かしてないんだけど、6コネクションしていることになってました。

Node.jsから立ち上げた場合はMQTTのプロセスはNode.jsを落とせば消えるんですけど、

Tesselの場合は一度使ったコネクションが残り続けてしまっているみたいで、デバッグしてるとコネクション数が増え続けてました。

詳しくは理解していないのですが、Tesselは内部的にLuaを使っていたりとJavascriptのプロセスとはまた別の低レイヤーで動作しているのかもしれません汗

次の日に確認したらコネクション数はもとにもどってました。
【Macトリビア】Script Editorを起動するURLスキーム

`applescript://`で始まるリンクによってScript Editorを起動させることができます。

任意のソースを入力した状態で起動させることも可能です。
ソースをURLエスケープして「script」属性として渡します。

試しに以下のURLをMacのブラウザのアドレスバーにコピペしてみてください。

```text
applescript://com.apple.scripteditor?script=tell+application+%22System+Events%22+to+display+alert+%22hello%22%0A
```
(残念ながらQiitaでは`applescript://`から始まるリンクを作成できません。)

# URLの作成手順

ソースを書きます。

```applescript:ダイアログ表示するだけのAppleScript
tell application "System Events" to display alert "hello"
```
AppleScriptでもJavaScriptでも構いません。

ですがユーザーのデフォルト設定で起動するので、JavaScript書いてもAppleScriptの設定で起動されたり、逆も然り。

適当にURLエスケープしていきます。

```text:適当にURLエスケープ
$ echo 'tell application "System Events" to display alert "hello"' | ruby -r cgi -e 'puts CGI.escape($stdin.read)'
```

```text:エスケープ後のソース
tell+application+%22System+Events%22+to+display+alert+%22hello%22%0A
```

URLエスケープしたソースを
`applescript://com.apple.scripteditor?script=`
の最後に付け足して終わり。

```text:完成
applescript://com.apple.scripteditor?script=tell+application+%22System+Events%22+to+display+alert+%22hello%22%0A
```

Safari, Chrome, FireFoxなどの各種ブラウザや`open`コマンド等で使用可能です。
今回は一行のソースでしたが、複数行も可。

# 追加属性

`action`属性に以下の文字列を設定することで、ソースの入力位置を変更できる・・・
らしいですが、動きませんでした。

||動作|
|:-:|:--|
|new|新しいウィンドウを作成してコードを入力する (デフォルト)|
|insert|既存のウィンドウのカーソル位置にコードを追加する|
|append|既存のウィンドウの最後の位置にコードを追加する|

```text:insertの例
applescript://com.apple.scripteditor?action=append&script=tell...
```

# 使い道

不明

# 参考

- [Apple - Software - AppleScript - Script Editor](http://web.archive.org/web/20041012035315/http://www.apple.com/applescript/scripteditor/12.html) ← 公式。消えてる。

- [わかばマークのMacの備忘録 : SafariStand/ AppleScriptのソースを選択してScriptEditorで開く](http://wakabamac.blog95.fc2.com/blog-entry-551.html) 
- [MacWiki - AppleScript Editor](http://macwiki.sourceforge.jp/wiki/index.php/AppleScript_Editor)
余談：StringUtilsで候補にでるものたち

# 同音異義語

StringUtilsという名前のクラスはさまざまなライブラリやフレームワークに存在しています。似ているようで実装内容が微妙に異なりますし、そもそも動きが違うものもあります。

>「それはStringUtils使えば一発で終わるよ」
>「えっ！？　どのStringUtils？」
>「…ん？　どのって！？」

こんなやりとりもあったりして(´・ω・`)

ここでは有名ドコロを挙げています。他にももっと多いでしょうし、社内共通ライブラリが登場するともっとあるでしょう…。

## 有名ドコロたち

* org.apache.commons.lang
* org.apache.commons.lang3
* org.apache.commons.codec.binary
* org.springframework.util
* org.thymeleaf.util
* com.mysql.jdbc

commons-lang, spring, thymeleaf, mysqlだけでもこんなに出てきますね。
気をつけましょう(´・ω・)

## 類似ケース

BeanUtilsにも気をつけましょう……。
vpsことはじめコマンド集(備忘録)

* あとで体裁ととのえます

#作業環境
* VPS=ConoHa CentOS6.5(64bit)テンプレートイメージ
* 操作端末=ConoHaシリアルコンソール

#1.作業ユーザの作成とsu権限付与

`#useradd [作業用ユーザ名]`
`#passwd [作業用ユーザ名のパスワード]`
`#usermod -G wheel [作業用ユーザ名]`
`#visudo`

```lang:visudo
%wheel ALL=(ALL) ALL
↑行頭の#を削除してコメントアウト解除
```
#2.ホスト名の付与

`#hostname [ホスト名]`


#3.sshログインポリシーの変更
* ConoHaでは標準でシリアルコンソールが利用でき、sshを使用しなくてもサーバのメンテナンスは実施できるため、ここではsshdを停止しておく。
ただし、サーバ間でscp転送等を行う時は一時的にservice sshd startで都度起動することで対応することとする。
* 下記sshd_configではパスワード認証を有効にしているが、通常時sshd自体停止することを前提に利便性優先で設定している。常時sshdを起動させる場合は逆にセキュリティリスクとなるため、公開鍵認証にするなど攻撃に対する対策をした方が良い。


`#vi /etc/ssh/sshd_config`

```lang:/etc/ssh/sshd_config
PermitRootLogin noに変更
PermitPasswordAuthentication yesに変更
```
`#service sshd restart`
`#service sshd stop`


#4.日本語環境のインストール
`#yum -y groupinstall "Japanese Support"`
`#vi /etc/sysconfig/i18n`


```lang:/etc/sysconfig/i18n
en_US → ja_JP に変更
```


`#. /etc/sysconfig/i18n`

`#ls -l`

* ls -lの実行結果で「合計 0」と表示されればOK。


#5.denyhostsのインストール
* 連続攻撃してきたIPアドレスをブロックしてくれるようになる。

`#yum -y install denyhosts`
`#service denyhosts start`
`#chkconfig denyhosts on`


#6.iptablesの設定
* 最低限のポートだけ開けておく。今後色々なサービスを実装した場合、都度開けることとする。

`#vi /etc/sysconfig/iptables`


```lang:/etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
```

`#iptables restart`


#7.全体のアップデート
* とりあえずOS全体のパッケージを現在の最新版にしたい時に。
* 時間がかかります。
 

`# yum update`
uvbookのサンプルコードを動かす


[Table of Contents — An Introduction to libuv](http://nikhilm.github.io/uvbook/)

## uvbookとは？

libuvを解説したドキュメントです。
日本語訳があります。

[node.jsを支えるlibuvのチュートリアル"uvbook" :目次 - 自由課題](http://kimitok.hateblo.jp/entry/2014/03/30/184206)

## サンプルコードの動かしかた

uvbookはソースとサンプルコードをgithubで公開しています。

[nikhilm/uvbook](https://github.com/nikhilm/uvbook)

サンプルコードと一緒にlibuvが同梱されています。両方をコンパイルすれば実行できます。

### libuvのコンパイル
libuvのコンパイルにはlibtoolが必要です。MacではHomebrewを使ってインストールできます。

```
brew install libtool
```


```
cd libuv
./autogen.sh
./configure
make
```


### サンプルコードのコンパイル
```
cd code
make
```

### 動かす

たとえば、最初のサンプルを動かしてみます。

```
code/helloworld/helloworld
```

以下が表示されます。

```
Now quitting.
```
Adobe AIRでコマンドビルド時、java 64bitで起動

Run command line builds on 64-bit platforms

Flash Builder runs on platforms that implement 32‑bit Java. To run a command line build on platforms that support 64‑bit Java (for example, Mac OS X Snow Leopard), add -d32 to the command-line options that are passed to Java. For example:

```java -d32 ...```
preferredInterfaceOrientationForPresentation の指定でハマった

ViewController が表示される時に最初にどの方向を向いているべきかを指定する以下のメソッド。

```objc
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
```
などと同じように UIInterfaceOrientationMaskPortrait を返却したところ
Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'preferredInterfaceOrientationForPresentation must return a supported interface orientation!’
と言われてしまった。

原因は単純で返却すべきは UIInterfaceOrientationMask ではなく UIInterfaceOrientation つまり
UIInterfaceOrientationMaskPortrait ではなく UIInterfaceOrientationPortrait であった。
bash > リダイレクション > ファイル上書きを禁止、追記だけにする > set -o noclobber

動作環境
    
    CentOS 6.5にてbashを使用

<hr>
メモをecho コマンドで追記することがたびたびある。

    echo "memo" >> mymemo.txt

上記をやるつもりが

    echo "memo" > mymemo.txt
としてしまい、mymemo.txtの中身を飛ばしたことが何回かある。


こういう経緯から既存ファイルに対してリダイレクションにて">"を禁止して、">>"を許可する設定があるかSOにて聞いてみた ([bash > prohibit to use redirection (>)](http://stackoverflow.com/questions/28665393/bash-prohibit-to-use-redirection))。

<hr>
`.bashrc`や`.profile`などにて

    set -o noclobber
とすればいいとのこと。

新規ファイルでは">"が使えて、既存ファイルでは">"は使えなくなる。">>"はどちらのファイルでも使える。