OmniAICreator/Qiita-1.07M huggingface dataset:
scalaのvar, valとmutable, immutableについて

今scalaの勉強してる。で、var, val, mutable, immutableで混乱しそうになったのでまとめる。

# 前提

* varは変数で参照を変えられる
* valはfinal変数的なもので参照を変えられない
* mutableは変更可能であることを示す（var, valのような文法上のキーワードではない）
* immutableは変更不可能であることを示す（var, valのような文法上のキーワードではない）

# 内容
例としてMapを使う。scalaのMapには

* scala.collection.mutable.Map
* scala.collection.immutable.Map

の2種類がある。ここで、代入とかそこらへんの仕組みを確かめてみる。

## var x mutable

```
scala> var map = scala.collection.mutable.Map(1 -> "one")
map: scala.collection.mutable.Map[Int,java.lang.String] = Map(1 -> one)

scala> map += 2 -> "two"
res9: scala.collection.mutable.Map[Int,java.lang.String] = Map(1 -> one, 2 -> two)
```

ここの `map += 2 -> "two"` は `map.+=(2 -> "two")` と同義である。これは`map` 変数の参照しているアドレスは変えずに、そのアドレスに格納されている値を変更している。また、`+=`メソッドの返り値が変更された自分自身なので次の行に `res9: scala.collection.mutable.Map[Int,java.lang.String] = Map(1 -> one, 2 -> two)` と出力されている。


## var x immuable

```
scala> var map = scala.collection.immutable.Map(1 -> "one")
map: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> one)
scala> map += 2 -> "two"

scala> map
res8: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> one, 2 -> two)
```

ここの `map += 2 -> "two"` はimmutableの場合と違い `map = map + 2 -> "two"` と同義である。これは参照しているアドレスを変更している。
scalaでは代入式の返り値はUnitであるため、演算をした直後が空行になっている。

## val x mutable

```
scala> val map = scala.collection.mutable.Map(1 -> "one")
map: scala.collection.mutable.Map[Int,java.lang.String] = Map(1 -> one)

scala> map += 2 -> "two"
res10: map.type = Map(1 -> one, 2 -> two)
```

これは var x mutable の場合と同じ。mapの参照しているアドレスは変わってないのでエラーにならない。

## val x immutable

```
scala> val map = scala.collection.immutable.Map(1 -> "one")
map: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> one)

scala> map += 2 -> "two"
<console>:9: error: reassignment to val
              map += 2 -> "two"
                  ^
```

この場合はエラーになる。var x immutable と同様、`map += 2 -> "two"` は `map = map + (2 -> "two")` であり、map変数の参照しているアドレスを変更しようとしている。しかし、mapはvalで宣言されているため、それが不可能でありエラーが発生している。
第11回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/38770 )を行いました。

問題は「ビットあみだくじ」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord11bitamida/
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
[PHP]Google Analytics API v3.0 使い方〜前準備編

1.プロジェクト作成
「Create Project...」をクリックしてプロジェクトを作成します。
![uploading googleAnalyticsAPI_01.png...](http://log.noiretaya.com/wp-content/uploads/2012/05/googleAnalyticsAPI_01.png)


2.Analytics APIをONにする
ServicesからAnalytics APIのstatusをクリックしてONにします。
![uploading googleAnalyticsAPI_02.png...](http://log.noiretaya.com/wp-content/uploads/2012/05/googleAnalyticsAPI_02.png)


3.Client IDを作成する
API Accessから「Create client ID...」をクリックします。
表示されたモーダルに必要な情報を入力していきます。


Product name: なんでもOKです。管理しやすい名前をつけましょう。
Product logo: これもなんでもOKです。無しでも全然OKです。
![uploading googleAnalyticsAPI_04.png...](http://log.noiretaya.com/wp-content/uploads/2012/05/googleAnalyticsAPI_04.png)


Application type: ブラウザから認証を行うような場合はWeb applicationを選択します。
Your site or host name: Googleのアカウント認証が完了したあとにリダイレクトさせるURLを入力します。
![uploading googleAnalyticsAPI_05.png...](http://log.noiretaya.com/wp-content/uploads/2012/05/googleAnalyticsAPI_05.png)

Create client IDをクリックして作成完了。



API Accessページに設定内容が表示されます。
![uploading googleAnalyticsAPI_06.png...](http://log.noiretaya.com/wp-content/uploads/2012/05/googleAnalyticsAPI_06.png)


以上でGoogle Analytics API v3.0を使用する準備は完了です。
Backbone.js関連のフレームワーク・ライブラリめも

- [Marionette.js – A scalable and composite application architecture for Backbone.js](http://marionettejs.com/)

	- [marionettejs/backbone.marionette · GitHub](https://github.com/marionettejs/backbone.marionette)
	
	- [marionettejs/backbone.babysitter · GitHub](https://github.com/marionettejs/backbone.babysitter)

	- [marionettejs/backbone.wreqr · GitHub](https://github.com/marionettejs/backbone.wreqr)

- [Chaplin | HTML5 application architecture](http://chaplinjs.org/)

	- [chaplinjs/chaplin · GitHub](https://github.com/chaplinjs/chaplin/)

- [Aura](http://aurajs.github.io/aura/)

	- [aurajs/aura · GitHub](https://github.com/aurajs/aura)

- [Thorax: Backbone + Handlebars](http://walmartlabs.github.io/thorax/)

	- [walmartlabs/thorax · GitHub](https://github.com/walmartlabs/thorax) 

- [tbranyen/backbone.layoutmanager · GitHub](https://github.com/tbranyen/backbone.layoutmanager)

- [powmedia/backbone-forms · GitHub](https://github.com/powmedia/backbone-forms)

- [jhudson8/backbone-query-parameters · GitHub](https://github.com/jhudson8/backbone-query-parameters)

- [nervetattoo/backbone.keys · GitHub](https://github.com/nervetattoo/backbone.keys)

- [gmac/backbone.epoxy · GitHub](https://github.com/gmac/backbone.epoxy)

- [EnotionZ/backbone-tree-model · GitHub](https://github.com/EnotionZ/backbone-tree-model)

- [inkling/backbone.native · GitHub](https://github.com/inkling/backbone.native)

- [rotundasoftware/backbone.courier · GitHub](https://github.com/rotundasoftware/backbone.courier)

- [aterris/backbone.debug · GitHub](https://github.com/aterris/backbone.debug)
【PHP】CodeIgniterの認証用ライブラリtank_auth

### サポート機能
・ユーザー名でもメールアドレスでもログイン可能(configファイルで調整可能)
・簡単な登録か、メールによるアクティベーション(オプション)
・ログイン情報を覚えておく機能
・パスワード忘れ対応（ユーザーは再アクティベーションする際に新しいパスワードに変更)
・パスワードやメールアドレスの変更をユーザー自身で行う
・アカウントがアクティブであっても、メールアドレスやパスワードを変更できる
・ユーザーの非アクティブ化(Ban)(オプション)
・ユーザーのプロフィール(オプション)
・CAPTCHAをサポート(CIオリジナルかreCAPTCHAが使用可能)
・HTMLかプレーンテキストのメール機能 

### インストール手順
1. 最新のダウンロード
2. Unzip
3. 各自のCI applicationフォルダーにコピー
4. captchaフォルダーをCIのフォルダーへ。フォルダーがWebサーバー上、書き込み可能か確認
5. MySQLでschema.sqlでテーブルを作る
6. application/config/config.php内の$config['sess_use_database']をTRUEにする。 

### ダウンロード
http://konyukhov.com/soft/tank_auth/
【PHP】PHPソースコード内部でヘッダー情報の確認方法

<?php

/* setcookie() でレスポンスヘッダをそれ自身に追加します */
setcookie('foo', 'bar');

/* 独自のレスポンスヘッダを定義します。
   これはほとんどのクライアントで無視されます */
header("X-Sample-Test: foo");

/* レスポンスがプレーンテキストだと宣言します */
header('Content-type: text/plain');

/* 送信しようとしているヘッダは? */
var_dump(headers_list());

?>
【PHP】月末・月初の出力方法

### 今月の月初
echo date("Y-m-01", time());

### 今月の月末
echo date("Y-m-t", time());

### 前月の月初
/* echo date("Y-m-01",strtotime("-1 month")); */
訂正
$now = strtotime("2013-07-31");
echo date("Y-m-d",strtotime("first day of - 1 month",$now));

### 前月の月末
/* echo date("Y-m-t",strtotime("-1 month")); */
訂正
$now = strtotime("2013-07-31");
echo date("Y-m-d",strtotime("last day of - 1 month",$now));
UIScrollViewに追加したUIImageViewのタッチイベントを取得する


UIScrollViewにカテゴリとして追加する。
タッチされたら次のレスポンダーへ渡す

```objectivec:UIScrollView+TouchEvent.h
#import <UIKit/UIKit.h>

@interface UIScrollView (UIScrollView_TouchEvent)
@end
```


```objectivec:UIScrollView+TouchEvent.m
#import "UIScrollView+UIScrollView_TouchEvent.h"

@implementation UIScrollView (UIScrollView_TouchEvent)

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [[self nextResponder] touchesBegan:touches withEvent:event];
}

@end
```

下記ファイルに追加することでプロジェクト全体で利用出来る。

```objectivec:hoge-Prefix.pch
#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
    #import "UIScrollView+UIScrollView_TouchEvent.h"
#endif
```

使う箇所でタッチイベントをYESに設定する。

```objectivec:HogeViewController.m
        imageView.userInteractionEnabled = YES;
```
Homebrewを使ってAppleDocを導入する


Appleの公式Reference風のDocumentを作成する。

```Bash:terminal
brew install appledoc
 
#HTML Referenceの作成
appledoc --project-name [プロジェクト名] --project-company [会社名] --company-id [会社ID] --create-html --no-create-docset --output [アウトプット先] [ソースコードの場所]
 
#XCodeのDocuments
appledoc --project-name [プロジェクト名] --project-company [会社名] --company-id [会社ID] --no-create-html --create-docset --output /tmp [ソースコードの場所]
```
【WPF】 .ico ファイルを Window のアイコンに設定する方法

ググってもなかなか正解に辿りつけなかったのでメモ。

## まず .ico ファイルをリソースに追加する

Resource フォルダ（なければ追加）にドラッグ・アンド・ドロップで追加します。
![CropperCapture[1].png](https://qiita-image-store.s3.amazonaws.com/0/25145/00c704e1-a25c-8c69-e00d-e3843f0a7625.png)

ビルドアクションは Resource を選択してください。
![CropperCapture[2].png](https://qiita-image-store.s3.amazonaws.com/0/25145/cc985e66-a301-2faf-3724-c80d048273cd.png)

## XAML で設定する方法

```xml:MainWindow.xaml
<Window x:Class="DiffFileSaver.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
        xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
        xmlns:v="clr-namespace:DiffFileSaver.Views"
        xmlns:vm="clr-namespace:DiffFileSaver.ViewModels"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"
        Title="DiffFileSaver"
        Height="318.182"
        Width="525"
        Icon="/DiffFileSaver;component/Resources/unWatching.ico">

        <!-- 省略 -->

</Window>
```

パスの書き方は、

**/<プロジェクト名>;component<リソースファイルのパス>**
です。


プロパティから簡単に設定出来ます。
![CropperCapture[4].png](https://qiita-image-store.s3.amazonaws.com/0/25145/86b1c608-0e54-d2bc-fb83-f3cb1cf82220.png)

## コード側から設定する方法

```csharp:MainWindow.xaml.cs
this.Icon = BitmapFrame.Create(new Uri("pack://application:,,,/Resources/unWatching.ico", UriKind.RelativeOrAbsolute));
```

パスの書き方は XAML と異なり、
**pack://application:,,,<リソースファイルのパス>**
です。
こちらを用いれば動的に変更できます。
横並びしてる要素の高さをそろえ、要素が削除されたあともまた高さをそろえる

#やりたかったこと

*横並びしてるli内のp.textの高さをそろえる
*削除ボタンを押してliが削除されたら、削除されたあと横並びしてるli内のp.textの高さをそろえる

#コード

```html 
<ul id="box01" class="clearfix">
    <li>
        <p class="text">ダミーダミーダミー</p>
        <p><a href="#">削除ボタン</a></p>
    </li>
    <li>
        <p class="text">ダミーダミーダミーダミーダミーダミーダミーダミーダミーダミーダミーダミーダミーダミー</p>
        <p><a href="#">削除ボタン</a></p>
    </li>
    <li>
        <p class="text">ダミーダミーダミーダミーダミーダミーダミーダミー</p>
        <p><a href="#">削除ボタン</a></p>
    </li>
    <li>
        <p class="text">ダミーダミーダミーダミーダミーダミーダミーダミー</p>
        <p><a href="#">削除ボタン</a></p>
    </li>
</ul>
```

```js 
function heightchange() {
    $('#box01 p.text').tile(2);
}
heightchange();

$('#box01 a').click(function(){
    $(this).closest('li').remove().queue( function(){ heightchange(); });
    return false;
});
```

デモ：http://jsdo.it/Ituki/pkh3
VideoViewで「この動画は再生できません」ダイアログが表示された際に、前のActivityに戻るようにする


![device-2013-05-27-144632.png](https://qiita-image-store.s3.amazonaws.com/0/2624/ae6ce9ba-b2e5-9579-1ed8-74a9e353e86c.png)

AndroidのVideoViewでは、再生しようとしている動画のHTTPステータスコードが403や404、また、フォーマットが[Supported Media Formats](http://developer.android.com/guide/appendix/media-formats.html)に含まれない場合、「この動画は再生できません」ダイアログが表示され、OKを押すと空のVideoViewが表示される。

できれば、OKボタンを押した時には、呼び出し元のActivityに遷移させたかったのでメモ。

[Android Developers](http://developer.android.com/reference/android/media/MediaPlayer.OnErrorListener.html)によると、エラー発生時にはOnErrorListenerが呼ばれる。onErrorがfalseを返すか、OnErrorListenerが呼ばれない場合はOnCompletionListenerが呼ばれる。

つまり、OnCompletionListenerは、正常に動画の再生が終了した際にも呼ばれるので、currentPositionがdurationと同じ場合は画面の遷移をさせないようにすればよかった。

```VideoActivity.java
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        if (mp.getCurrentPosition() != mp.getDuration()) {
            finish();
        }
    }
});
```

ちなみに、onErrorでハンドリングできないかと思いこんな感じのコードを書いたが、ダイアログが表示される前に前画面に遷移してしまった。

```VideoActivityFalse.java
    videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
        public boolean onError(MediaPlayer mp, int what, int extra) {
            finish();
            return false;
        }
    });
```
Javaの数値リテラルの表記規則まとめ


## 整数型リテラル

* 小数点がないリテラルは、デフォルトで int。
* 末尾に "L" または "l" で long 型リテラルとなる。

## 浮動小数点数型リテラル

* 小数点があるリテラルは、デフォルトで double。
* 末尾に "F" または "f" で float 型リテラルとなる。
* 末尾に "D" または "d" で double 型リテラルと宣言できる。


## Ｘ進表記

* **整数型**リテラルのみＸ進表記可能。
* 浮動小数点数型リテラルはＸ進表記不可能。
* float や double に代入するリテラルであっても、小数点がつかず、末尾に何もつかなければ int とみなされるため、Ｘ進表記可能。

### 先頭に付加する文字
|進数|文字|
|:-----------|:------------|
|2進 (Java 7以降)|"0b" または "0B"|
|8進|"0"|
|16進|"0x" または "0X"|


## アンダースコア (Java 7以降)

以下のポイント「以外」にアンダースコアを入れて表記できる。

### 整数型の場合

* 先頭
* 0b, 0B, 0x, 0X の直後（８進の 0 の直後はあってもよい）
* L, l の直前
* 末尾

### 浮動小数点型の場合

* 先頭
* 小数点の隣（前後）
* D, d, F, f の直前
* 末尾
DataGridView でセルの入力チェック、自動補正、自動確定/却下など

DataGridView とは、便利なスプレッドシートっぽいコントロールでいろんなことができて便利だが、小難しいことをやる時には、 小難しいことをやらないといけなくて、そろその脳がオーバーフローしつつある。

いちいち過去のソースを見るのも面倒になってきたので、ここに覚えがきを書いておく。

# セルが不正な値の時に却下する

CellValidating をハンドルして、e.FormattedValue に入っている値をチェックするロジックを入れる。

不正な値の時は「CancelEdit()」メソッドを実行すると、変更前の値に戻る。 あと「e.Cancel = True」も必要(理由は後述)

# セルの内容を自動補完する

「1」を入力した時に自動で「001」に補完したい時は、DataGridView の CellParsing をハンドルする。 「e.Value」に入力値が入っているので、それを補正した値で上書きして、 「e.ParsingApplied = True」する。

# セルの編集中(鉛筆印表示)のまま、DataGridView以外のコントロールで操作された時、編集を確定or却下させる。

Enterキーを押下したり、DataGridView の別のセルに移動したら編集は確定されるのだが、 そうではなく、同じフォームの「メニュー」項目をクリックしたり、 クローズボタンを押した場合は確定されず、編集中状態のまま、イベントが開始されてしまう。

こういう場合、編集中状態を解除するには 2種類方法があって、 (DataGridView).EndEdit か、(フォームインスタンス).Validate のいずれかを呼ぶ。

前者を呼ぶと編集は強制確定されるのだが、CellValidating とか呼ばれないので、 おかしな値がそのまま入ってしまうこともある。よってお勧めしない。

後者の場合、フォーム中のコントロール全て(つまり DataGridView含む)に対して登録操作が試みられる上に、 ちゃんと DataGridView では CellValidating が呼ばれるので、不正な値もちゃんとはじいてもらえる。

で、ここで値をはじいた場合、新に行おうとした操作もキャンセルすべきだろう (編集前の不本意な値で操作を続行されると不都合な結果になる)。 ここで生きているのが、先程の「CellValidating での e.Cancel = True」で、これをやっておくと、 (フォームインスタンス).Validate() の戻り値が False になってくれる。 だから、このコードは定番は次のようなものになる。

```vbnet 
If Not Me.Validate() Then
    Return
End If
```

# 編集を破棄して終了していいですか？

フォームの FormClosing をハンドルする。 MsgBox とかでダイアログを出して、クローズをキャンセルさせる場合は「e.Cancel = True」。

あと、この時も、編集しかけの DataGridView を確定・却下させるべきだが、 却下した後、そのまま Return すると、そのままクローズされてしまうので、 先程の定番コードは、ここだけ

```vbnet 
If Not Me.Validate() Then
    e.Cancel = True
    Return
End If
```

になる。

以上、http://nyaos.org/d/index.cgi?p=%282013.06.01%29+0943#p1 より転記
Android (x86-jb) でのタッチスクリーンキャリブレーション

> http://www.monaka.org/blog/2013/06/01/calibrate-touchscreen-android-jb/ からの転載です．

Android でのタッチスクリーンのキャリブレーション法について．情報が溢れていそうで，案外無い，
あっても，古くて使えない．
ので，記録しておきます．

(少なくとも Android-x86 での)タッチスクリーンサポートは，tslib を用いています．
tslib には，ts_calibrate というコマンドがついています．
ts_calibrate は，LinuxのフレームバッファとタッチパネルデバイスをLinuxのinputデバイスとを直接アクセスします．
Android は，当然ながら，画面を押さえていますので，衝突します．
そこで，下記のような手順で実行を行います．

以下，Android-x86.org が提供している x86-jb での手順です．

たぶん ICS 以降の Android の多くで使えるはずですが，中には，tslib を使っていないディストロもあります．(例えば AndroVM)
あと，rootが必要です．
スマホやパネルコンピュータなど，きちんと製品に作りこまれた状態でも，この方法は使えないかもしれません．
(その場合，キャリブレーションツールが必要なら，きちんとしたのがついてくるだろうと思います．)


1. 普通にAndroidを起動します．
2. adb shell など用いて，コマンドラインアクセス可能にします．
3. ```stop zygote``` ```stop bootanim``` ```stop surfaceflinger``` として，zygote サービスを停止します．
4. 多くの場合，キャリブレーションデータを保存するディレクトリが存在しません．```mkdir /data/system/tslib```を実行して作ります．
5. ```ts_calibrate``` を実行します．
6. 言われるままにタッチします．
7. 念のため，```ls /data/system/tslib/pointercal``` などしてキャリブレーションデータが作成されていることを確認します．
8. 止めた順番と逆順で，```start surfaceflinger``` ```start bootanim``` ```start zygote``` として，zygote サービスを再開します．

## 補足

仮想コンソールがサポートされている場合，上記2の手順で，Alt+F1 などで移動し，作業することもできます．
その場合，ts_calibrate を実行する際に必要なのは zygote サービスの停止だけです．
libHSprimitive-0.5.0.1.so: cannot open shared object file: No such file or directory

```shell-session 
Loading package primitive-0.5.0.1 ... <command line>: can't load .so/.DLL for: libHSprimitive-0.5.0.1.so (libHSprimitive-0.5.0.1.so: cannot open shared object file: No such file or directory)
Failed to install vector-0.10.0.1
```
なぜかこんなことを言われてしまった。
vectorは`libHSprimitive-0.5.0.1.so`を必要としているところ、`libHSprimitive-0.5.0.1.a`しか生成されていないようだ。

```shell-session 
$ cabal install primitive --enable-shared --reinstall
```
cabalは --enable-sharedオプションをつけると、動的ライブラリファイル(.so)も生成してくれるらしい。
これで先に進めた。
jqueryでのcheckboxの全選択

jquery1.10.1で checkboxを選択すると、他のチェックボックスを全選択させようとした。

そして無駄にハマったのでメモ

```
<input type="checkbox" id="check-all">
<input type="checkbox" value="1" name="a" class="bar">
<input type="checkbox" value="2" name="b" class="bar">
<input type="checkbox" value="3" name="c" class="bar">
```

```js:誤
$('#check-all').on('click', function() {
  $('input.bar:checkbox').attr('checked', $(this).is(':checked'));  
});
```

```js:正
$('#check-all').on('click', function() {
  $('input.bar:checkbox').prop('checked', $(this).is(':checked'));  
});
```

誤のほうだと、2回目までは問題ないが、3回目からは、`checked=checked`が付与されるのに
画面上はチェックが入らない現象になった。
Play コマンドで既存のタスクの実行前に独自定義タスクを実行する

この辺りを参考に。
[Scala sbt 独自のTaskを定義してみる](http://d.hatena.ne.jp/kaishitaeiichi/20121028/1351440123)
[Play2.0でsbtの独自タスクを定義する](http://straitwalk.hatenablog.com/entry/20121203/1354543644)
[sbtでcompileとかpackageとかの前に自分のタスクを差し込みたい](http://d.hatena.ne.jp/Yamashiro0217/20120517/1337259125)

- - -

まず、これが Play Scala プロジェクト作成時にできるデフォルトの Build.scala.

```scala:Build.scala
import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

  val appName         = "zaneli"
  val appVersion      = "1.0-SNAPSHOT"

  val appDependencies = Seq(
    // Add your project dependencies here,
    jdbc,
    anorm
  )


  val main = play.Project(appName, appVersion, appDependencies).settings(
    // Add your own project settings here      
  )

}
```

独自タスクを追加するには、このように書く。

```scala:Build.scala
import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

  val appName         = "zaneli"
  val appVersion      = "1.0-SNAPSHOT"

  val appDependencies = Seq(
    // Add your project dependencies here,
    jdbc,
    anorm
  )


  val main = play.Project(appName, appVersion, appDependencies).settings(
    Tasks.helloTask
  )

  object Tasks {
    val helloTaskKey = TaskKey[Unit]("hello", """Show "Hello!".""")
    lazy val helloTask = helloTaskKey := {
      println("Hello!")
    }
  }
}
```

`play hello`を実行すると、コンソールに「Hello!」が出力される。

さらに、このタスクをコンパイル実行前に実行させるには、このように書く。

```scala:Build.scala
import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

  val appName         = "zaneli"
  val appVersion      = "1.0-SNAPSHOT"

  val appDependencies = Seq(
    // Add your project dependencies here,
    jdbc,
    anorm
  )


  val main = play.Project(appName, appVersion, appDependencies).settings(
    Tasks.helloTask,
    (compile in Compile) <<= compile in Compile dependsOn (Tasks.helloTaskKey)
  )

  object Tasks {
    val helloTaskKey = TaskKey[Unit]("hello", """Show "Hello!".""")
    lazy val helloTask = helloTaskKey := {
      println("Hello!")
    }
  }
}
```

`play compile`を実行すると、「Hello!」を出力してからコンパイルが行われる。

- - -

ちなみに、TaskKey の第二引数 """Show "Hello!".""" は、
`play "tasks -v"`などを実行した際に出力されるタスク一覧の説明文として表示される。
GitLab導入時の留意点

1. IEユーザーをサポートする必要はあるか？
1. サブURLにデプロイする必要があるか？
1. 継続的なバージョンアップに追従できるか？
1. 無償のボランティアによって成り立っていることを忘れない

[[詳細を表示](http://hiroponz.hateblo.jp/entry/2013/06/19/233121)]
rubyでjenkinsプラグインを作ってみる

Jenkinsのrubyプラグインを作ってみた手順をメモする。
[Home · jenkinsci/jenkins.rb Wiki · GitHub](https://github.com/jenkinsci/jenkins.rb/wiki)を参考にしている。
[mechamogera/jenkins-onetime-irc-notifier · GitHub](https://github.com/mechamogera/jenkins-onetime-irc-notifier)を作ってみてるけどまだまだわからないことだらけ。

## 環境
 * rvm導入済み
 * rvmでjruby導入済み
 * jpi gem(0.3.8)導入済み

## rubyでjenkinsプラグインを作ってみる

 * ひな形作成

```bash:
$ jpi new hoge
      create  hoge-plugin/Gemfile
      create  hoge-plugin/hoge.pluginspec
```

 * model作成
  * viewの作成はできないみたいので自力で
  * [How to develop Jenkins plugin using to ruby and Jenkins.rb - SSSSLIDE](http://sssslide.com/speakerdeck.com/hsbt/how-to-develop-jenkins-plugin-using-to-ruby-and-jenkins-dot-rb)に作成できる一覧が載ってた

```bash:
$ cd hoge-plugin
$ jpi generate publisher huge
      create  models/huge_publisher.rb
```
 * 動作チェック
  * デフォルトでlocalhost:8080にアクセスすれば動作を確認できる

```bash:
$ jpi server
```

 * build
  * できたhpiファイルをJenkinsに読み込ませば利用できるようになる

```bash:
$ jpi build
...
It was installed into ./pkg/vendor/gems
hoge plugin 0.0.1 built to pkg/hoge.hpi
```

## その他
 * jpi serverでhttp proxyが利用できなかったので[pull request](https://github.com/jenkinsci/jenkins.rb/pull/83)
 * Gemfileのsourceについて[pull request](https://github.com/jenkinsci/jenkins.rb/pull/84)
 * JRUBY_HOMEを変に設定してたらjpi serverが動かなかった
iptablesを利用したsshのブルートフォースアタック対策

# 環境
CentOS 6.4

# 概要
iptablesを設定し、
同一IPから30秒間に5回ログインリクエストがあった場合、300秒間ロックする。
というロジックを組んでいます。
ログインに成功してもカウントされるため、
ログイン/ログアウトを繰り返しても制限に引っかかりますが、
通常そのような利用はしないでしょう。。
※limit-burstだと思い通りのことが出来ず、チェインを利用したルールを採用。
※可能であればパスワード認証は使用しないのが望ましいです。

# iptables の設定

```
# ssh アクセス制限
# 制御用のチェインを3つ追加。
# sshポートに新規リクエストがあった場合のルール
-N ssh_check
# アタックリストに存在する場合のルール
-N ssh_reject
# アタックと見なした場合のルール
-N ssh_attack

# 22番ポートに新規リクエストがあった場合、ssh_checkチェインに入ります。
-A INPUT -p tcp -m state --state NEW,INVALID --dport 22 -j ssh_check

# ssh_check ルールの処理
# アタックリストに入ってから300秒以内の場合はssh_rejectルールを適用します。
-A ssh_check -m recent --rcheck --seconds 300 --name attack_reject -j ssh_reject
# アタック候補リストに30秒以内に5回カウントされている場合は、
# アタックと見なしてssh_attackルールを適用します。
-A ssh_check -m recent --rcheck --seconds 30 --hitcount 5 --name attack_count -j ssh_attack
# アタック候補リストに１カウント分として追加します。
-A ssh_check -m recent --set --name attack_count
# ログ出力
-A ssh_check -j LOG --log-level info --log-prefix "COUNT: "

# ssh_reject ルールの処理（reject時）
# ログ出力
-A ssh_reject -j LOG --log-level info --log-prefix "REJECT: "
# アタック候補リストに１カウント分として追加し、rejectします。
-A ssh_reject -m recent --set --name attack_count -j REJECT

# ssh_attack ルールの処理（アタックと見なした場合）
# ログ出力
-A ssh_attack -j LOG --log-level info --log-prefix "ATTACK: "
# アタックリストに記録して、ssh_rejectルールを適用します。
-A ssh_attack -m recent --set --name attack_reject -j ssh_reject

# ssh_rejectルールが適用されなかった場合、acceptされます。
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# ssh アクセス制限ここまで
```

適用後、iptables restartが必要です。
ログは/var/log/messages に出力されます。

あわせてsshのポートを22から変更しておくと、
攻撃される頻度がぐっと減るためリスクをかなり低減できます。

# 参考サイト
http://www2s.biglobe.ne.jp/~nuts/labo/inti/ipt_recent.html
http://www.turbolinux.co.jp/products/server/11s/user_guide/iptablescmd.html
http://linuxjm.sourceforge.jp/html/iptables/man8/iptables.8.html
デフォルトメーラーの定義されている場所

# はじめに
## 要約
Webページ上のmailtoリンクを押したときに、「規定のプログラム」で指定したメーラーが呼び出されます。
このメーラーのパスをレジストリから取得する方法を記述します。
なお、ここに書いてある情報は環境により左右される部分が大きいと思いますので、ご注意下さい。
OS: Windows8 Pro 64bit

## 背景
基本的に@ITの記事[1]をベースにしています。ただ、ここにあるHKEY_CLASSES_ROOT\mailto\shell\open\commandを書き換えてくれないメーラーがあるようなので（←Becky)、アレンジを加えたという形です。

# 方法
## 説明
### アプリケーション名の取得
MSDN[2]によると、デフォルトのメーラーは次のいずれかで定義することになっています。
* HKEY_CURRENT_USER\SOFTWARE\Clients\Mail
* HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail
ここに書いてある意味が正しく理解できていないのですが、実際に中身を見てみると、HKCUが規定のプログラムのアプリケーション名を保持していたので、こちらを使うことにします。

### アプリケーションのパスの取得
mailto:で実行されるコマンドは次の場所にあります。
HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\\(アプリ名)\Protocols\mailto\shell\open\command

## 実装
実装は次の通りです。getExePath()は@IT[1]のコピペなので、詳しくはリンク元を見て下さい。

```csharp:#:sample.cs
// using省略
using Microsoft.Win32; // Registry, RegistryKeyクラスを使うのに必要

public static string GetDefaultMailerExePath()
{
    try
    {
        // デフォルトメーラーのアプリケーション名を取得
        string name = (string)Registry.CurrentUser
                .OpenSubKey(@"Software\Clients\Mail").GetValue(String.Empty);

        // デフォルトメーラーがmailto:を受け付けたときのコマンドを取得
        string exe = @"SOFTWARE\Clients\Mail\" + name 
                + @"\Protocols\mailto\shell\open\command";
        
        string command = (string)Registry.LocalMachine
               .OpenSubKey(exe).GetValue(String.Empty);

        // デフォルトメーラーのexeパスを取得
        return getExePath(command);
    }
    catch (NullReferenceException)
    {
        throw new Exception("デフォルトメーラーのパスを取得できませんでした");
    }
}

private static string getExePath(string command)
{
    string path = "";

    // 前後の余白を削る
    command = command.Trim();
    if (command.Length == 0)
    {
        return path;
    }

    // 「"」で始まる長いパス形式かどうかで処理を分ける
    if (command[0] == '"')
    {
        // 「"～"」間の文字列を抽出
        int endIndex = command.IndexOf('"', 1);
        if (endIndex != -1)
        {
            // 抽出開始を「1」ずらす分、長さも「1」引く
            path = command.Substring(1, endIndex - 1);
        }
    }
    else
    {
        // 「（先頭）～（スペース）」間の文字列を抽出
        int endIndex = command.IndexOf(' ');
        if (endIndex != -1)
        {
            path = command.Substring(0, endIndex);
        }
        else
        {
            path = command;
        }
    }
    return path;
}
```
## 補足
元ネタのアレンジということで書きましたが、mailtoではなくアプリケーションを開くためのコマンドを使った方が直接的かなと思います。これは次のレジストリに格納されています。

HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\\(アプリ名)\shell\open\command


# 参考
[1] [既定のブラウザ／メーラの.EXEファイル・パスを取得するには？［C#、VB］](http://www.atmarkit.co.jp/fdotnet/dotnettips/652getdefaultbrowser/getdefaultbrowser.html)
[2] How to Register an Internet Browser or Email Client With the Windows Start Menu (MSDN) 
http://msdn.microsoft.com/en-us/library/windows/desktop/dd203067(v=vs.85).aspx
のHow the Start Menu Displays the Default Email Clientの項目
rtmpで転送されるデータについての小ネタ

javaのnetty用のrtmp実装である、flazrをつかっていて気づいた小ネタ。

小ネタ１
音声データや映像データが流れてくるわけですが、取得データのtimestamp値がたまに入れ替わることがあります。rtmpで流れてきたデータをffmpeg等でエンコードするときには、この入れ替わりを治してやってから変換かける方が負荷的に有利になります。

小ネタ２
flashに実装されたh.264映像出力を利用したときとFlashMediaLiveEncoderやXsplitを利用してh.264を流したときで疎通データがちょっと違います。h.264(映像)とaac(音声)にはMediaSequenceHeader(以下msh)と呼ばれる特殊データがあるのですが、Flash実装のx.264エンコーダーを利用している場合は、このmshが定期的に流れてきます。
mshが大量に挿入されている状態でも、ffmpeg等のコンバートに影響はありません。

小ネタ３
red5で映像データをやりとりしているときに、映像でh.263を利用している場合は、映像データのdisposableInnerFrameは捨てた方がまともなデータになる。(red5の1.0.0βのころの話)
今でも慣例的にこのフレームは捨てるのが習慣づいています。
Androidアプリのパフォーマンスチェック


Androidアプリのメモリリークを調査する
http://eikatou.net/blog/2012/02/memory-leak/

Androidでプロファイリング（traceview） | Android Techfirm Lab
http://labs.techfirm.co.jp/android/iguchi/2262

Android アプリの描画を高速化する 5 ステップ (フェンリル | デベロッパーズブログ)
http://blog.fenrir-inc.com/jp/2011/11/5-steps-speed-up-android-apps.html



ここらへんをチェックする。
console.time()で非同期処理の所要時間を計測する

`console.time('label_name')` と `console.timeEnd('label_name')`を使うと経過時間の測定が簡単にできる。

## 基本的な使い方

測りたい処理の開始時に`console.time()`を呼び出す。このとき引数にラベル名を渡す必要がある。
計測終了したいタイミングで`console.timeEnd()`を呼び出す。このとき引数には同じラベル名を渡す。

```js:
function loop(){
	console.time("loop time");
	for(var i =0; i < 1000000000; i++){}
	console.timeEnd("loop time");
}
loop();
```
出力結果

```
loop time: 812.000ms 
```

## jQueryのDeferredと組み合わせて使う

便利だからDeferredと組み合わせて使う (※Deferredを使う必要性は特にない)


```js:なんかJSONとってくる関数
$(function(){

	// 宣言
	function asyncFunction(){
		console.time('measurement of time'); // 計測開始
		var def = $.Deferred();

		$.ajax({
			url : 'hoge.json',
			type: 'GET',
			dataType : 'json'
		}).then(function(json){
			console.timeEnd('measurement of time'); // 計測終了(成功)
			def.resolve(json);
		},function(){
			console.timeEnd('measurement of time'); // 計測終了(失敗)
			def.reject('fail fail fail fail fail...!!');
		});

		return def.promise();
	}

	// 呼び出し
	asyncFunction().then(function(json){
		console.log(' :) ');
	},function(){
		console.log(' :( ');
	});
});
```
出力結果

```
measurement of time: 5.000ms
:)
```

console便利

---

参考URL:[Console API](https://developers.google.com/chrome-developer-tools/docs/console-api#consoletimelabel)
Redmine でチケット作成フォームに「ステータス」項目を表示させない改造パッチ

#概要
Redmine の新しいチケットの作成フォームで「ステータス」項目の表示を隠すためのパッチです。

#対応環境
Redmine 2.3.1.devel (2013.06.15 更新) で動作確認済。
他の環境は試していません。

ちなみに僕の環境は [github.com:redmine/redmine(master)](https://github.com/redmine/redmine/tree/master) から構築しています。


# チケット作成フォームはできる限りシンプルにしよう
チケット作成フォームには不要な項目は極力表示させたくないものです。
Redmineを運用することによって、多くの人からバグ報告や機能要望を受け取ることができますが、
それを入力する人は非エンジニアであることが多々あります。
そこでなんだか入力項目がたくさんありすぎると「ウッ」という気持ちになりますね。
エンジニアだって「ウッ」ってなります。
報告する気力がいくらか削がれることもあるかもしれません。

プロジェクトの目的にもよりますし、さじ加減もあるのですが、
チケットの入力項目はできるだけ少ないほうがうまく運用できる可能性が高いと僕は考えています。

サンプルとして、僕が現在運用している Redmine の画面をお見せします。
「ステータス」以外の項目は管理設定でがんばれば隠せるのですが、
「ステータス」だけは Redmine を改造しないと無理でした。（画像は改造後の画面です）

![new_ticket2.png](https://qiita-image-store.s3.amazonaws.com/0/25555/407f3c4d-e3e6-a6db-7cbe-16f71611a434.png)

#改造の適用方法
https://gist.github.com/kobake/5821205 に改造パッチを上げてあります。
Redmine をインストールしてあるディレクトリで以下を実行すればOKです。
必要であれば Redmine のキャッシュ削除や再起動しましょう。（僕の環境ではビューの変更を即時適用する設定にしているので必要なかった）

```bash:
$ wget https://gist.github.com/kobake/5821205/raw/fba2309531f1110e608bfa27458842b0bd68142c/redmine_hide_status_when_new_ticket_form.patch
$ patch -p0 < redmine_hide_status_when_new_ticket_form.patch
```

#内容
app/views/issues/_attributes.html.erb をいじってます。

```diff:redmine_hide_status_when_new_ticket_form.patch
diff --git app/views/issues/_attributes.html.erb app/views/issues/_attributes.html.erb
index 0e29701..830dfc6 100644
--- app/views/issues/_attributes.html.erb
+++ app/views/issues/_attributes.html.erb
@@ -2,7 +2,8 @@

 <div class="splitcontent">
 <div class="splitcontentleft">
-<% if @issue.safe_attribute?('status_id') && @allowed_statuses.present? %>
+<% if params[:action] == 'new' %>
+<% elsif @issue.safe_attribute?('status_id') && @allowed_statuses.present? %>
 <p><%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), {:required => true},
                 :onchange => "updateIssueFrom('#{escape_javascript project_issue_form_path(@project, :id => @issue, :format => 'js')}')" %></p>
```

#Redmine 本家側の関連フィーチャー

Redmine 本家側でも様々な項目を非表示にするための対応が進行中です。
(まだ master にコミットはされていない)
[Feature #12005: Mightful workflow field enhancement: hide - Redmine](http://www.redmine.org/issues/12005)

このフィーチャーのパッチを適用してみましたが、
「ステータス」項目を非表示にすることは今の時点ではできませんでした。

#弁解
Rails もわからない、Redmine の設計もわからない、そんな状態で手探りで grep かけまくって対応しました。
なので、今回の解決の仕方はもしかしたらとても Not cool な方法かもしれません。
「これはダメだよ！」「こうしたほうが良いよ！」っていう情報がありましたら教えていただけると嬉しいです。
【バッチファイル】テンプレートのファイルを今日の日付でコピーする【備忘録】

日報だとか修正ログだとかでテンプレートがあってコピー+日付リネームしたいときに使うといい
prefix
suffix
extension
templatefile
にはそれぞれ対応したファイル名などを入れて使ってください
templatefileだけ指定すると今日の日付でリネームされます
extensionなしだとめんどくさいことに・・・

設定してしまえばダブルクリックでOK


```bat:
@echo off
if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :EOF

setlocal

rem テンプレートとして使うファイルを指定
set templatefile=

rem ===基礎出力設定============================================================
rem 接頭
set prefix=
rem 接尾
set suffix=
rem 拡張子
set extension=
rem ===========================================================================

rem 日付計算 この状態でyyyymmdd形式
set today=%date:/=%

rem 出力ファイル名生成
set exfile=%prefix%%today%%suffix%%extension%

rem 出力ファイルがあれば作らず開く
if exist %exfile% goto OPENFILE

rem コピーして名前を変える
copy %templatefile% %exfile%

:OPENFILE
rem 関連づいているソフトで開く
start %exfile%

:EOF
endlocal
```
Objective-C の弱参照コンテナ

NSHashTable, NSMapTable は追加されたオブジェクトの参照カウントを上げず、オブジェクトの参照カウントが 0 になった際にコンテナ要素を自動的に削除するモードがある。

### NSHashTable

NSMutableSet のように集合を扱うコンテナ。
弱参照コンテナとして使用したい場合は次のように生成する。

```objc:
NSHashTable* items = [NSHashTable weakObjectsHashTable];
```

### NSMapTable

NSMutableDictionary のように連想配列を扱うコンテナ。
キーと値のどちらを弱参照にするかで 3 つの生成方法がある。

* +(id)strongToWeakObjectsMapTable : 値を弱参照するコンテナを生成。
* +(id)weakToStrongObjectsMapTable : キーを弱参照するコンテナを生成。
* +(id)weakToWeakObjectsMapTable : キーと値の両方を弱参照するコンテナを生成。
丸が横に並んだベン図で枠の上に数字が書いたやつを書きたかった

## デフォルトはこうですが

```r:R
library (Venn Diagram)
png("fig_a.png")
fig_a <- venn.diagram(
  x = list( A = 1:150, B = 121:180 ),
  filename =NULL,
  cex = 3,
	cat.cex = 3,
	)
grid.newpage()
grid.draw(fig_a)
dev.off()
```

![fig_a.png](https://dl.dropbox.com/u/80771782/Qiita/fig_a.png)

## こんなかんじで
```r:R
png("fig_b.png")
fig_b <- venn.diagram(
  x = list( "150" = 1:150, "60" = 121:180 ),
	label.col = "white",                            # ラベル（数値）を白にして見えなくする
  filename =NULL,
  cex = 3,
	cat.cex = 3,
	cat.dist = c(0, 0),
	cat.pos = c(0, 0),
	)
grid.newpage()
grid.draw(fig_b)
dev.off()
```

![fig_b.png](https://dl.dropbox.com/u/80771782/Qiita/fig_b.png)

## 重なりのところだけ表示させたかったら

```r
png("fig_c.png")
fig_c <- venn.diagram(
  x = list( "150" = 1:150, "60" = 121:180 ),
	label.col = c("white","black","white"),
  filename =NULL,
  cex = 3,
	cat.cex = 3,
	cat.dist = c(0, 0),
	cat.pos = c(0, 0),
	)
grid.newpage()
grid.draw(fig_c)
dev.off()
```

![fig_c.png](https://dl.dropbox.com/u/80771782/Qiita/fig_c.png)
[Chrome] console.log()の色々な書き方

```js:
console.log('しゅつりょく');
console.log(obj);
```
こんな感じで書くのが普通ですが、引数として出力する変数を取る書き方がいくつかあります。

```js:
var str = "もじれつ";
var num = 555;
var flo = 1.7320508075;

console.log('Stringの出力 : %s', str);
console.log('Numberの出力 : %d', num);
console.log('Floatの出力  : %f', flo);

console.log('複数出力 : %s %d %f',str,num,flo);

```

### 出力結果

```
Stringの出力 : もじれつ 
Numberの出力 : 555
Floatの出力  : 1.7320508075 

複数出力 : もじれつ 555 1.7320508075
```
floatの桁数指定とかはまだ実装されてないみたいです。

---

他にもハイパーリンクとして出力、スタイルを指定して出力なんかもあります。

```js:
var url = "http://qiita.com/"
var sty = 'color:#fff;background:#000;';

console.log('Linkの出力   : %o', url);
console.log('%c:スタイルを指定して出力', sty);
```

### 出力結果

```
Linkの出力   : "http://qiita.com/" ※ console上でクリックすると飛べるようになります
:スタイルを指定して出力 ※ console出力すると実際には黒背景に白文字になります
```

Cライク?な書き方ができるのがおもしろい。

console.log()で文字列連結して変数の出力するときとか、ちょっと楽かも？

---

※追記
`%O`指定の出力について書きました。
[console.log()でオブジェクトを出力するときにラベルをつける方法](http://qiita.com/nakajmg/items/9c6ad7e1e01e1204d430)

---

参考URL:[Chrome Devtools Cheatsheet](http://anti-code.com/devtools-cheatsheet/#console-api)
【バッチファイル】ダブルクリックで自身を最小化して起動しなおす【備忘録】

備忘録として。

下のように書く

```bat:
@echo off
if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto EOF

rem 処理はここに書く

:EOF
```

若しくはこう

```bat:
@if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto EOF

rem ここに処理を書く

:EOF
```
start /min cmd /c,"%~dp0.\%~nx0"の,が無いとコマンドラインから実行した時に止まる
Redmineでコードハイライトを利用する

pre及び、codeタグを利用する。

```html:
<pre><code class="c">
#include <stdio.h>
 
int main(void) {
    printf("hello, world\n");
 
    return 0;
}
</code></pre>
```

> [Redmineのシンタックスハイライトの対応形式 | Redmine.JP Blog](http://blog.redmine.jp/articles/syntax-hilight/)
<html>,<body>は要らない？Googleが推奨するHTMLファイルの記法

Googleが公開していた[Google HTML/CSS Style Guide](http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml?showone=Optional_Tags#Optional_Tags)によると、よく使われる下のようなHTMLのお決まりの記法は非推奨らしい。

```html:not_recommended.html
<!DOCTYPE html>
<html>
  <head>
    <title>Spending money, spending bytes</title>
  </head>
  <body>
    <p>Sic.</p>
  </body>
</html>
```

これはファイル容量のために下のように書くべき。

```html:recommended.html
<!DOCTYPE html>
<title>Saving money, saving bytes</title>
<p>Qed.
```

つまり`html, head, body`などの使い慣れたお決まりのタグは今更書くまでもないということ。


参考: どのようなタグが省略可能か
http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#syntax-tag-omission

P.S.
[STORYS.JP](http://storys.jp)、 [coincheck](https://coincheck.jp) などのサービスを運営、開発しています。興味のある方はぜひ [和田](http://qiita.com/wadako111)まで連絡を！
MySQLストアドプロシージャ極々サンプル

##  空プロシージャ

### 作成

```sql:
DELIMITER //

DROP PROCEDURE IF EXISTS proc1//

CREATE PROCEDURE proc1()
BEGIN
  SELECT VERSION();
END;
//
DELIMITER ; 
```

### 呼び出し方法

```sql:
CALL proc1;
CALL proc1();
`````

## 引数付き

```sql:
CREATE PROCEDURE proc2(IN param INT)
BEGIN
  SELECT param;
END;
```

```sql:
CALL proc2(1024);
```

```sql:
CREATE PROCEDURE proc3(IN param1 INT, IN param2 VARCHAR(8))
BEGIN
  SELECT param1, param2;
END;
```

```sql:
CALL proc3(1024, 'hello');
```

## 引数付き（output）

```sql:
CREATE PROCEDURE proc4(OUT param1 INT, OUT param2 VARCHAR(8))
BEGIN
  SET param1 = -1;
  SET param2 = 'hello';
END;
```

```sql:
CALL proc4(@param1, @param2);
SELECT @param1, @param2;
```

## ファンクション

* レプリケーションを構成する場合、DETERMINISTIC or NOT DETERMINISTICが必要となる。
* DETERMINISTICは引数が同じであれば、返値が同じ場合、NOT DETERMINISTICは、（ランダム関数が入る等で）入力値に対して出力値が毎回違う場合に指定する。

```sql:
CREATE FUNCTION func1()
RETURNS INT DETERMINISTIC
BEGIN
  RETURN -1;
END;
```

```sql:
CREATE FUNCTION func1()
RETURNS VARCHAR(12) DETERMINISTIC
BEGIN
  RETURN 'hello, world';
END;
```

#### 呼び出し方法
```sql:
SELECT func1();
```
Rspecのstubで返す値を変える


```rb:
Post.stub(:count).and_return( 0, 1, 10)
```
こうすれば呼ぶたびに 0 1 10と順番に値が返る


参考
Can RSpec stubbed method return different values in sequence?
http://stackoverflow.com/questions/5947999/can-rspec-stubbed-method-return-different-values-in-sequence
git-completion.bash を使って git の branch名をターミナルに表示する

# git の branch名をターミナルに表示する

### git-completion.bash を適当にコピー

$ sudo mkdir -p /usr/local/git/contrib/completion/
$ sudo mv git-completion.bash /usr/local/git/contrib/completion/

### bashのプロンプトに設定する

GIT_PS1_SHOWDIRTYSTATE=true
export PS1=':\[\033[32m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
Rubyでカタカナだけのランダムな文字列を取得する

テストデータの作成などにつかう。

```rb:
>('ア'..'ン').to_a
 => ["ア", "ィ", "イ", "ゥ", "ウ", "ェ", "エ", "ォ", "オ", "カ", "ガ", "キ", "ギ", "ク", "グ", "ケ", "ゲ", "コ", "ゴ", "サ", "ザ", "シ", "ジ", "ス", "ズ", "セ", "ゼ", "ソ", "ゾ", "タ", "ダ", "チ", "ヂ", "ッ", "ツ", "ヅ", "テ", "デ", "ト", "ド", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "バ", "パ", "ヒ", "ビ", "ピ", "フ", "ブ", "プ", "ヘ", "ベ", "ペ", "ホ", "ボ", "ポ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ヮ", "ワ", "ヰ", "ヱ", "ヲ", "ン"]

> ('ア'..'ン').to_a.sample(10).join
 => "マヲィガギヂデケゲラ"
```

`ア..ン`という範囲は多分あっていない
特定ファイルの前回（直前）の変更とのdiffをみる

このファイルは前なにを編集したんだっけって時

```
git log spec/foo.rb
```

などとしてコミットのハッシュをとる

```
git diff <commit>..HEAD spec/foo.rb
```
`<commit>`のとこにハッシュを入れる`<commit>..<commit>`という使い方もできる

git-diff(1) Manual Page
https://www.kernel.org/pub/software/scm/git/docs/git-diff.html
スマホのposition:fixed対応状況と対応方法メモ

自分でも前試したけどどこかにメモが消えた。。。
同じものをまとめたサイトがあったのでメモ。
http://blog.lqd.jp/css/000180.html

Android2.3以下＋レスポンシブ等もしくはiOS 4も対応するなら、[iScroll](http://cubiq.org/iscroll-4)ですかね。
Androidでapkファイルのダウンロードに失敗する原因

# 概要
apkを配布しようとした際にダウンロードに失敗することがあったので調べてみたところ、

どうもAndroidの標準ブラウザは別プロセスでファイルのダウンロードをするため、
Basic認証がかかっているとファイルのダウンロードに失敗するらしいということがわかった。

また、今回の件には直接関係ないが、
MIME typeの問題でダウンロードできないこともあるようなので、併せて解決策を記載する。

# Basic認証でこける場合
## 解決策

- 最悪urlに埋め込めばダウンロードできる。

```html:HTML
<a href="http://ユーザID:パスワード@www.hogehoge.co.jp/hoge.apk">ダウンロード</a>
```

- 思い切ってBasic認証やめる＾ｑ＾


# MIME typeでこける場合
## 解決策

- a要素にtypeを追加

```html:HTML
<a href="./hogehoge.apk" type="application/vnd.android.package-archive">ダウンロード</a>
```

- Apache等を使っていたら .htaccessにtypeを追加

```
AddType application/vnd.android.package-archive .apk
```
CQ5 WCM画面でのディレクトリ作成

CQ5のWCM画面にてページ設定を行うのですが、一つ気づきを。

##ディレクトリ（フォルダー）作成ができない

![CQ5_CWM_folder.PNG](https://qiita-image-store.s3.amazonaws.com/0/25775/d016d5d2-109a-c2aa-6553-239e676f684c.png)

上記が設定画面になりますが、ページ整理のためにディレクトリを作成しようとしたところ
設定用のプルダウンが非アクティブ。。

こちら、ROOTページ作成用であれば設定できるようです。
●参考サイト
[CREATING THE ROOT PAGE](http://dev.day.com/docs/en/crx/current/developing/developers_getting_started.html#Creating the Root Page)
※英語サイト

ちなみにCQ5（apache sling）内だとフォルダーのノードタイプは**sling:OrderedFolder("nt:unstructured)**になります。
このタイプは、child nodeが必要でparent nodeのデータ取得はできないようです。
●参考サイト
[sling-orderedfolder](https://cwiki.apache.org/SLING/sling-orderedfolder.html)

なので、ページ上層部以外にフォルダーを作成しようと思っても設定ができない仕様。。
ページボリュームの多いサイトだとページ整理に苦労するかもしれないですね。なかなかの使い勝手。。
（今後整理方法を見つけたらアップしていきます）
How to search specific keyword with assgined weights to each column

注記:翻訳版を提供するための作業エントリ

> もっとgroongaを知ってもらおう!ということで週刊groongaをはじめました。毎週木曜にgroongaやmroongaのトピックを投稿予定です。

# はじめに

2013年1月29日にオープンソースの[カラムストア機能付き全文検索エンジンgroonga](http://groonga.org/ja/) 2.1.2をリリースしました。

そこで2.1.2で新規に追加された複数の[query()関数](http://groonga.org/ja/docs/reference/functions/query.html)のサポートを使って、キーワードごとに重み付けをして検索する方法を紹介します。

# サンプルスキーマとデータ

例で使うテーブルのスキーマは以下の通りです。

>  table_create Users TABLE_NO_KEY
>  column_create Users name COLUMN_SCALAR ShortText
>  column_create Users memo COLUMN_SCALAR ShortText

>  table_create Lexicon TABLE_HASH_KEY ShortText \
>    --default_tokenizer TokenBigramSplitSymbolAlphaDigit \
>    --normalizer NormalizerAuto
>  column_create Lexicon users_name COLUMN_INDEX|WITH_POSITION Users name
>  column_create Lexicon users_memo COLUMN_INDEX|WITH_POSITION Users memo

例で使うテーブルのデータは以下の通りです。
Usersテーブルのnameカラムとmemoカラムにデータを登録します。

>  load --table Users
>  [
>  {"name": "Alice", "memo": "groonga user"},
>  {"name": "Alisa", "memo": "mroonga user"},
>  {"name": "Bob",   "memo": "rroonga user"},
> {"name": "Tom",   "memo": "nroonga user"},
> {"name": "Tobby", "memo": "groonga and mroonga user. mroonga is ..."},
> ]

まずは、Usersテーブルのnameカラムからキーワード"alice"を全文検索するクエリの例を示します。(nameカラムで合致したデータに対する重みづけとして10をこのサンプルでは指定します)

query()関数を使ったクエリは以下のように書くことができます。

>  select Users \
>    --output_columns name,_score \
>    --filter 'query("name * 10", "alice")'

Usersテーブルからnameカラムに10の重み付け``"name * 10"``を行い、キーワード"alice"を全文検索します。
結果としてマッチしたnameカラムの値と、マッチした場合のスコア(``_score``)を表示します。
条件にマッチするほど``_score``の値は大きくなります。

ではいくつかキーワードが与えられていて、そのキーワードに異なる重みづけをして全文検索を行いたいときにはどうなるでしょうか。

``query()``関数を使って、以下のようにキーワードごとに重み付けをしてmemoカラムを検索してみます。
groongaもしくはmroongaを使っているuserで、mroongaを最も重視する、という例です。

|全文検索対象のキーワード|キーワードに対する重み付けの値|
|:-----------------------|------------------------------|
|groonga                 | 10                           |
|mroonga                 | 20                           |
|user                    | 1                            |

実際のクエリは以下のように書くことができます。

>  select Users \
>    --output_columns name,memo,_score \
>    --filter 'query("memo * 10", "groonga") || query("memo * 20", "mroonga") || query("memo * 1", "user")' \
>    --sortby -_score

クエリの結果では重みづけを行っているのでmroongaがより上位に来ていることがわかります。

>  [
>   ["name","ShortText"],["memo","ShortText"],["_score","Int32"]
>  ],
>  ["Tobby","groonga and mroonga user. mroonga is ...",51],
>  ["Alisa","mroonga user",21],
>  ["Alice","groonga user",11],
>  ["Tom","nroonga user",1],
>  ["Bob","rroonga user",1]

このように``query()``関数を使うことで、キーワードの重要度に応じて検索結果を得られるようになりました。

# まとめ

groonga 2.1.2で追加されたquery()関数を使って、キーワードごとに重み付けを行って検索する例を紹介しました。

groongaに興味を持ったなら、まずは[インストール](http://groonga.org/ja/docs/install.html)して試してみてください。

[チュートリアル](http://groonga.org/ja/docs/tutorial.html)も用意しています。
dataURIでHTMLを手っ取り早く確認する

教えてもらったのでメモ。

ブラウザのアドレスバーに

```html:
data:text/html,<h1>hello html</h1>
```

てな感じで打つとhtmlが表示される。

data URI schemeになってれば基本的になんでも表示できるのでbase64エンコードした画像とかも

```html:
data:image/png;base64, base64エンコード文字列
```

をアドレスバーに貼り付ければ表示できる
aws-sdkを使って簡単S3操作

# aws-sdkとは

amazonが公式で提供している、AWSをrubyから操作するためのライブラリである。

**公式サイト**
http://aws.amazon.com/jp/sdkforruby/

# インストール

gemでインストールする。

``` 
gem install aws-sdk
```

# 使い方

## インスタンスの生成

アクセスキーが必要。

```instnance.rb
require 'aws-sdk'

s3 = AWS::S3.new(
  :access_key_id => 'YOUR_ACCESS_KEY_ID',
  :secret_access_key => 'YOUR_SECRET_ACCESS_KEY' 
)
```

## bucketの操作

```bucket.rb
# bucketの作成
s3.buckets.create('my-bucket')

# bucketの取得
bucket = s3.buckets['my-bucket']

s3.buckets.each do |bucket|
  puts bucket.name
end
```

## objectの操作

```object.rb
# objectの取得
object = bucket.objects['img/example.jpg']

# アップロード
object = bucket.objects['img/new.jpg']
object.write(Pathname.new('/img/file.jpg'))

# S3上のリソースをローカルに保存する
File.open('file.jpg', 'wb') do |file|
  object.read do |chunk|
     file.write(chunk)
  end
end

# 応用編
bucket.objects.with_prefix('photos/').each(:limit => 20) do |photo|
  puts photo.key
end
```

オブジェクトを取得する際に、prefixを指定したり、limitを指定したりできる。
上記の応用編では、'photos/'から始まるオブジェクトを20件取得している。
もっと早く =>

rubyのコードをvimで書いているときに、"=>"よく書きます。

```rb:
 {:ja => 'test', :en => 'prd'}   
has_many :traces, :order => "updated_at desc"  
```

そこで、vimのinsert modeで一発で前後のスペースを含めて入力できるようにすると省力化できます。
以下の設定では、Ctr-l で一発入力できるようにしています。

```vim:vimrc
imap <c-l> <space>=><space> 
```

ほかにも応用効きますね。
連続した文字のリストを生成

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q']
みたいに指定した文字までのリストが欲しい時
`l = [chr(s) for s in range(ord("a"), ord("q")+1)]`

日本語だとちょっとめんどくさい
`l = [unichr(s) for s in range(ord(u"そ"), ord(u"ぬ")+1)]`
これで
[そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ]
みたいなリストは得られる。
ただ濁音とか拗音を抜いたものだけを得るうまい方法がみつからない。
黒い画面（コマンドプロンプト／ターミナル）のみでMovable Typeをインストールする

サーバー内の公開ディレクトリに、シェルコマンドのみでMTOSを設置する手順。
慣れれば、FTPを使用する方法よりもかなり早く作業できるし、デスクトップを汚さない。
コマンドの意味を理解できれば、WordPressにも応用が利く。

## 0. 設置条件

設置しているサーバーの条件は以下の通り。さくらのVPSだとそのまま利用できる。

- サイトルート　・・・　/var/www/html
- Movable Typeの管理画面のディレクトリ名　・・・　mtos
- Apache、SSH、MySQL、Perl、PHPの設定は終わっているものとする

MTOSの配布先へ行って、最新バージョンのダウンロードURLを控えておく
http://www.movabletype.jp/opensource/mtosdl.html

## 1. シェルログイン・root切り替え

ポート名99999、ユーザーID : userid、ホスト : 111.222.333.444
パスフレーズを尋ねられたらサーバーに設定していたものを入力する

```bash:
ssh -p 99999 userid@111.222.333.444
```

root権限に切り替える

```bash:
su -
```

rootのパスワードを聞かれるので入力 -> 先頭のカーソルが「#」になる

## 2. サイトルートのディレクトリに書き込み権限を与える

さくらのVPSに一般的な方法で設定していくと、パーミッションが777でなければ
Movable Typeがファイルを書き出すことができないので
サイトルートのディレクトリのパーミションを変更する
サーバーにより、条件が異なる。逆に755や705でなければならないサーバーもある

```bash:
chmod 777 /var/www/html
```
## 3. サイトルートへ移動

別に移動しなくてもいいのだが、以降の説明を相対パスにしたいので

```bash:
cd /var/www/html
```
## 4. MTOSの最新版を取得

```bash:
wget [Movable Type最新版のダウンロードURL]
```

サイトルートに「MTOS-5.x.x.zip」というファイルが加わる

## 5. 解凍・所有者の変更

zipを解凍する。ずらららっとファイル一覧が表示される

```bash:
unzip MTOS-5.x.x.zip
```

「MTOS-5.x.x.zip」というディレクトリができるので、名前を「mtos」に変更する

```bash:
mv MTOS-5.x.x.zip mtos
```

最初に接続したユーザーとグループ（user:group）に所有権を変更する
これをやっておかないと、FTPやSFTPでメンテができない
「-R」は指定したディレクトリ以下すべてという意味

```bash:
chown -R user:group mtos
```

zipファイルを削除

```bash:
rm MTOS-5.2.6.zip
```

## 6. 書き込みが必要なファイルのパーミッションを変更する

先述の通りサーバーによっては不要

```bash:
chmod 777 mtos
chmod 777 mtos/themes
chmod 777 mtos/mt-static/support
```

Movable Typeのコアの状態で、書き込み権限を与えなければならないのは上の3つ。
今後プラグインを追加する場合は、そのプラグインにも
書き込み許可が必要となる場合もあるが割愛

## 7. cgiファイルを実行可能にする

解凍した段階でパーミッションが755になっているようなのだが、一応コマンドでも行う
「mtos」以下で、名称が「.cgi」のファイルに対しchmodを実行する

```bash:
find ./mtos/ -name '*.cgi' -type f -print | xargs chmod 755
```

以降はターミナルを終了して、設置したサイトの「/mtos/mt.cgi」にアクセスし
MTOSのインストールをはじめる

##補足

###インストール先のディレクトリ名について

ここでは「mtos」としているが、任意名で構わない
一般には「mt」「movabletype」「admin」等が使用されるが、一意の名前にすると不正アクセスを防止できる

###wgetについて

MacOSは、デフォルトでwgetコマンドが使用できない
curlに読み替えるか、こちらを参考にwgetコマンドを利用できるようにしておく
http://futuremix.org/2003/07/wget

a-blog cmsなど、配布元がプログラムを介して最新版をダウンロードさせる形式の場合は
wgetを使用できないので、一旦DLしてから、scpで転送する
http://d.hatena.ne.jp/hidde/20090518/1242621452

###findについて

findから処理をつなげる方法としては-execオプションがよく紹介されているが、
xargsオプションの方が処理が早いらしい
いきなり実行するのが心配な場合は、事前に検索・リストアップだけしてみるといい

```bash:
find ./mtos/ -name '*.cgi' -type f -print
```
emacs+gdbの注意点

Emacs+GDBで標準入力から受け取るプログラムのデバッグをする際のポイントです。

## Unix

### EOFの入力
適当なファイルに標準入力の項目を記入し、 run する際にリダイレクトする。
`gdb> run < input.txt`

## Cygwin

### EOFの入力
適当なファイルに標準入力の項目を記入する。

main関数にbreakを設定する。
`gdb> b main`

起動する。
`gdb> run`

起動直後に止まるので、標準入力を置き換える。
`gdb> call dup2(open("input.txt", 0), 0)`

継続する
`gdb> c`


Cygwinのやり方についてはStackOverflowにありました。
http://stackoverflow.com/questions/9031554/gdb-input-redirection-using-cygwin


### おまけ
mintty+CygwinだとEOFが入力できないことがあります。Windowsはもともと ^Z が EOF 扱いですが、Cygwinだと ^Z は susp に設定されています。stty で susp を別なキーに割り当てることで、 ^Z で EOF を入力することができます。

` > stty susp ^]`

※ ^] の入力方法は Ctrl+V を押したのちに Ctrl+] を押します。
PL/SQLのデバッグ

手元にObjectBrowserがなくても、JDB(Javaのデバッガ)を使ってPL/SQLのデバッグを行う方法について。


# 概要
JDBでデバッグ用サーバを立て、PL/SQL側からJDBに接続し、JDBでPL/SQLをリモート操作します。

## 前提
| 項目 | 値 |
|:-----------|------------:|
| JDB実行のサーバ | jdb_server |
| JDB実行時のポート番号 | 10000 |
| Oracleユーザ名 | scott |
| デバッグプロシージャ名 | TEST_PROCEDURE |


## JDBの起動
`jdb -connect com.sun.jdi.SocketListen:port=10000`
ポート10000番でサーバを立て、PL/SQL側からの接続を待ちます。ポート番号は何番でも大丈夫です。
コマンドを実行すると、ポート10000番に対して接続がくるまで待ちつづけます。


## PL/SQL側からの接続
JDBとは別のセッションでOracleに接続します。
`sqlplus scott/****@orcl`
Oracleに接続したら、SQL*PLUSからJDBに接続します。

```sql:
begin dbms_Debug_jdwp.connect_tcp( 'jdb_server', '10000' ); end;
```

ここで、 jdb_server は JDB を起動したサーバです。 10000はJDBで待ち受けたポート番号です。
コマンドを実行すると、接続待ちをしていたJDBがアクティブになります。

## ブレイクポイントの設定
JDB側でブレイクポイントを設定します。
プロシージャの場合は、 $Oracle.Procedure.【ユーザ名】.【プロシージャ名】 というクラス名となるので、
`stop in $Oracle.Procedure.SCOTT.TEST_PROCEDURE`
でブレイクポイントを設定します。

## プロシージャの起動
SQL*PLUS側からプロシージャを起動します。ブレイクするとJDBに制御が移るため、普通にJDBでデバッグを行います。ステップ実行や変数の書き換えもできます。




## その他
PLSQLのクラスは $Oracle.Procedure.SCOTT.TEST_PROCEDURE となるので、しかるべき位置にソースを置いておき、JDBの起動オプションでソースパスを指定すれば、ソースを見ながらデバッグを行うことができます。
インスタント検索

キー入力するたびに検索結果が切り替わる、インスタント検索。

```js:instant-search.js
$( document ).ready( function(){
  $( "#queryText" ).keyup( setTimeoutForSearch );
} );

// Ajax でサーバに検索を要求し、検索結果を表示する
function ajaxSearch( query ){
  $.ajax( {
    type: "GET",
    url: "search.php",
    data: query,
    dataType: "html",
    success: function( html ){
      $( "#resultDiv" ).html( html );
    }
  } );
}

// タイムアウト時に検索を実行するようにタイマーをセットする
TIMEOUT_IN_MILLISECONDS=500;
var searchTimer=null;
function setTimeoutForSearch(){
  if( searchTimer!=null )
  {
    window.clearTimeout( searchTimer );
  }

  searchTimer=window.setTimeout( function(){
    ajaxSearch( $( "#queryText" ).val() );
    searchTimer=null;
  }, TIMEOUT_IN_MILLISECONDS );
}
```
bashでファイル数をカウントする

長らく悩んでいたのが解決したのでエントリー

シェルスクリプトを書いていてたまにすごく残念な気持ちになるのが、ファイル数のカウント。
いつもこんなカウントをしていた。

```bash
NUMBER_OF_FILE=$(ls "$TARGET_PATH" | wc -l)
```

だが、単にファイル数をカウントするためだけに`ls`と`wc`をexecするというのは、非常に抵抗がある。
bashだけでなんとかできないかとmanpageを見ながら考えてみたが、これでよさそうだ。

```bash
TEMP=("$TARGET_PATH"/*)
test ${TEMP[0]} = "$TARGET_PATH/*" && unset TEMP[0]
NUMBER_OF_FILE=${#TEMP[@]}
```

ファイルが一つも存在しない場合が無いのなら、2行目は無くすことができる。
もうちょっと短く書けると良かったんだけど。