OmniAICreator/Qiita-1.07M huggingface dataset:
ボタン押したときにちょっと拡大するような感じにしてください

了解で、す…！

以下、タッチイベントとAnimation使ってやる方法。

仕込み
---

```java:AnimUtils.java

	public static void setOnTouchAnimation(View targetView, final float scaleX,
			final float scaleY) {
		targetView.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				AnimUtils.onTouchAnimate(v, event.getAction(), scaleX, scaleY);
				return false;
			}
		});
	}

	public static void onTouchAnimate(View targetView, int action,
			float scaleX, float scaleY) {
		if (action == MotionEvent.ACTION_DOWN) {
			ScaleAnimation anim = new ScaleAnimation(1.0f, scaleX, 1.0f,
					scaleY, targetView.getWidth() / 2,
					targetView.getHeight() / 2);
			anim.setDuration(60);
			anim.setFillEnabled(true);
			anim.setFillAfter(true);
			targetView.startAnimation(anim);
		} else if (action == MotionEvent.ACTION_CANCEL
				|| action == MotionEvent.ACTION_UP) {
			ScaleAnimation anim = new ScaleAnimation(scaleX, 1.0f, scaleY,
					1.0f, targetView.getWidth() / 2, targetView.getHeight() / 2);
			anim.setDuration(100);
			targetView.startAnimation(anim);
		}
	}
 
```



ボタン拡大のためだけにsetOnTouchListenerする場合
----

```java:

AnimUtils.setOnTouchAnimation(view, 1.1f, 1.1f);

```

サイズにもよるけど1.02f～1.1fがイイ具合



setOnTouchListenerの実装にお邪魔する場合
---

```java

view.setOnTouchListener(new View.OnTouchListener() {
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		int action = event.getAction();

		// アニメ処理挟む
		AnimUtils.onTouchAnimate(v, action, 1.1f, 1.1f);
		
		// 何かしらの実装部分

	}
});

```

こっちは今のところ妄想パターン
Vim instant markdown + Mavericks + zsh


[vim-instant-markdown](https://github.com/suan/vim-instant-markdown)

## Installation
You need to follow the github repo installation. 

    gem install pygements.rb
    gem install redcarpet
    npm -g install instant-markdown-d

Download the repo and move to `after/ftplugin/markdown/instant-markdown.vim` to
`~/.vim/after/ftplugin/markdown/`. Since I am using [vim-pathogen](https://github.com/tpope/vim-pathogen)
I move to `~/.vim/bundle/after/ftplugin/markdown/`. 

Then open .vimrc and add the followings.

    filetype plugin on
    # you need this for zsh   
    set shell=bash\ -i

Then you need to open md file with vim and it will open a browser http://localhost:8090/.

More info read [the doc](https://github.com/suan/vim-instant-markdown)
[ReVIEW Tips] LaTeXで取り消し線を引く

## 取り消し線とLaTeX


取り消し線(<del>こういうやつ</del>)を記述するにはインライン記法の``@<del>``を使います。

……で話が済めばよかったのですが、LaTeXの場合、取り消し線や下線等が苦手だそうです。

- http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?TeX%E3%81%8C%E8%8B%A6%E6%89%8B%E3%81%A8%E3%81%99%E3%82%8B%E5%87%A6%E7%90%86#t65559ac
- http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/32045.html

これは困りました……。


## 取り消し線を引く

上記の通り、日本語に対応したスタイルもないわけではないのでそれなりに対応することは可能です。が、このマクロを使えば全て万事解決という状況ではないので、現状のReVIEWではLaTeXで``@<del>``を使ってもデフォルトでは何もしないようにしています（具体的には、``\reviewstrike``マクロを出力するのですが、このマクロのデフォルトの定義は何も修飾せずにそのまま文字列を出力するだけになっています）。

もし``@<del>``を``jumoline.sty``(http://www.para.media.kyoto-u.ac.jp/latex/ より入手可能)を使って取り消し線に使いたい場合は、以下のように``\reviewstrike``マクロを再定義してください。

```tex
\usepackage{jumoline}
\renewcommand{\reviewstrike}[1]{\Middleline{#1}}
```

一方、TeXLiveの標準にも入っている（はずの）``ulem.sty``を使う場合は、以下のようになります。

```tex
\usepackage{ulem}
\renewcommand{\reviewstrike}[1]{\sout{#1}}
```

これで取り消し線が引けるようになります。
Vim plugins


## Using Vim-pathogen for vim-plugins
[Vim-pathogen](https://github.com/tpope/vim-pathogen)

Installing a plugin

    cd ~/.vim/bundle
    git clone git://github.com/username/plugin-name.git

Once you installed run the following to install help tags. This will generate documentation on every directory in ‘runtimepath’.

    # you can check your runtimepath
    :set runtimepath?

    # Install doc
    :Helptags
[Python] virtualenvとは何か

## virtualenvとは

システムに普通にPythonをインストールすると複数のバージョンが共存できなくなる。

そこで、独立したPython環境をを指定した時のみ使えるものが __virtualenv__ である

## virtualenv の使い方

現在の作業ディレクトリが `project/` であるとすれば

```zsh 
$ virtualenv ENV_NAME
```

このコマンドで `project/ENV_NAME` 以下にグローバルでインストールされているPythonのコピーが作成される
（※ENV_NAMEはコピー環境の名前で好きに指定してよい）

これで環境はコピーされたが，ターミナルで`python` コマンドを打ってもシステム全体の方のpythonが起動してしまうため、

```zsh
$ source ENV_NAME/bin/activate
```

これで `python` コマンドを打つと `ENV_NAME/bin/python` が実行されるようになる．（PATHの先頭に `{コピー環境のパス}/bin:` が追加される）

## システム全体のPython以外のコピー環境を作りたい場合

```zsh
$ virtualenv -p /path/to/other/python ENV_NAME
```

コピー元となる様々なバージョンのPythonを入れるツールとして，[pythonz](https://github.com/saghul/pythonz)などがある．
Vim unimpaired


[vim-unimpaired](https://github.com/tpope/vim-unimpaired)

[Vim-unimpaired](http://vimcasts.org/episodes/using-vims-paste-mode-with-the-system-paste-command/)

If you copy and paste from other source, vim add extra indentation. To avoid this, install vim-unimpaired and use yo in command mode. Then cmd+v to paste. To go back to command mode, hit ESC.

    # other commands
    yp yP yo y0 yI yA
valgrindメモ


# valgrindとは
* Valgrind は、メモリデバッグや、メモリリークの検出、プロファイリングを行うためのプログラミングツール

# 検出可能なこと
+ 未初期化メモリの使用
+ 解放されたメモリの読み書き
+ 確保されたされたメモリブロック外のアクセス
+ 確保したメモリのメモリ解放忘れ

# 使用方法
> valgrind -v --error-limit=no --leak-check=full --show-reachable=no build/valgrind_test 

# オプションの意味
+ -v
>  詳細表示

+ --error-limit=no
> エラー追跡をやめない

+ --leak-check=full
> メモリリークを最大限チェックする

+ --show-reachable
> still reachableをエラーをレポートに表示しない。

# メモリリークの種類
+  definitely lost:メモリリークしている。
+  possibly lost:メモリリークしているかも？確認
+  still reachable:解放できるメモリを解放していない。レポートが邪魔なら--show-reachable=yesを使用しないこと
+  suppressed:メモリリークエラーが抑制されている。

# 参考資料
http://valgrind.org/docs/manual/
気軽にjsonのsyntax checkを行う

```shell-session
knife solo cook hoge
```

みたいな事をやったときにjsonのsyntaxエラーが発生すると、人生絶望しちゃいますよね？  
knife soloとかしているとあまりエラーが優しくない・・・そうこんな風にね。

```shell-session
ERROR: JSON::ParserError: 399: unexpected token at ...
```

数十行程度だったらいいけど、行数が多くなったらもう発狂するレベル。
まあnodes/hoge.jsonとかにそんなに行数書くなよって話でもありますが...w


じゃあどうするのか？
そんなときはこんなコマンドを使いましょう

```shell-session
$ cat nodes/hoge.json | python -mjson.tool
Expecting , delimiter: line 17 column 7 (char 324)
```

以上、無駄にjson眺めてる暇あったpythonのjson.tool使った方がいいよってお話でした。
[bash] CentOS添付ファイル付きメール送信(sendmail)の実装

# 添付ファイル付きメールの実装

この実装が正解という訳ではありませんが、

> uuencodeコマンドを使いたくなかった。
> echo でメールヘッダを作りたくなかった。

というところだけは、守りましたw

## 環境
- CentOS release 6.3
- sendmail-8.14.4-8.el6.x86_64

## 実装
- そんな難しいことはしてません。シンプルに。

```
#/bin/sh

# commands.
SENDMAIL=/usr/lib/sendmail
ECHO=/bin/echo
GZIP=/bin/gzip
CAT=/bin/cat
RM=/bin/rm

# attachment file info.
ATTACH_FILE=attachmail.txt
ATTACH_PATH=/tmp/$ATTACH_FILE

# mail head settings.
MAIL_BODY=/tmp/mail_body.txt
MAIL_FROM=xxx@abc.com
MAIL_TO=yyy@abc.com
MAIL_SUBJECT="TEST ATTACHMENT MAIL."
MAIL_BOUNDARY=`date +%Y%m%d%H%M%N`

# make attachment file (test data).
$ECHO "1,2,3,4,5" > $ATTACH_PATH
$ECHO "6,7,8,9,10" >> $ATTACH_PATH

# attachment compression.
cd /tmp
$GZIP $ATTACH_FILE

＃make body.
$ECHO "this is Body." > $MAIL_BODY

# send mail.
$SENDMAIL -t << EOF
From: ${MAIL_FROM}
To: ${MAIL_TO}
Subject: ${MAIL_SUBJECT}
MIME-Version: 1.0
Content-type: multipart/mixed; boundary=${MAIL_BOUNDARY}
Content-Transfer-Encoding: 7bit

--${MAIL_BOUNDARY}
Content-type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

`${CAT} ${MAIL_BODY}`

--${MAIL_BOUNDARY}
Content-type: application/zip;
 name=${ATTACH_FILE}.gz
Content-Transfer-Encoding: base64
Content-Disposition : attachment;
 filename=${ATTACH_FILE}.gz

`${CAT} ${ATTACH_PATH}.gz | base64`

--${MAIL_BOUNDARY}--
EOF

$RM -fr ${ATTACH_PATH}.gz
```

以上です。
NSDate関連のメモ


```objectivec:NSDate
    NSDate *now = [NSDate date];
    
    // ロケールを指定する.
    NSLocale *locale = [NSLocale currentLocale];
    NSLog(@"now[%@]", [now descriptionWithLocale:locale]);
    
    // NSDateFormatterオブジェクトの生成.
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setLocale:[NSLocale systemLocale]];
    [formatter setTimeZone:[NSTimeZone systemTimeZone]];
    
    // 日付から文字列への変換.
    [formatter setDateFormat:@"yyyy年MM月dd日 HH時mm分ss秒"];
    NSString *strDate = [formatter stringFromDate:now];
    NSLog(@"now2[%@]", strDate);
    
    // 文字列から日付への変換.
    [formatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
    NSDate *oneDay = [formatter dateFromString:@"2013/12/12 23:59:59"];
    NSLog(@"now3[%@", [oneDay descriptionWithLocale:locale]);
    
    // 東京五輪までの日数.
    NSDate *tokyoOlympic = [formatter dateFromString:@"2020/07/24 20:00:00"];
    NSTimeInterval secs = [tokyoOlympic timeIntervalSinceDate:now];
    NSInteger dayes = round(secs/(60*60*24));
    NSLog(@"あと%d日", dayes);

	// 数値を指定してNSDateを取得する.
    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.year = 2014;
    components.month = 1;
    components.day = 28;
    components.hour = 23;
    NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    date = [cal dateFromComponents:components];
    NSLog(@"date: %@", date);
    NSLog(@"date: %@", [date descriptionWithLocale:[NSLocale currentLocale]]);
    
	// NSDateから数値を取得する.
    components = [cal components:(NSDayCalendarUnit|NSHourCalendarUnit|NSSecondCalendarUnit) fromDate:date];
    NSInteger day = components.day;
    NSInteger hour = components.hour;
    NSInteger sec = components.second;
    NSLog(@"day=%ld hour=%ld sec=%ld", day, hour, sec);

```
IdeaVimを入れて困っていること

![head.png](https://qiita-image-store.s3.amazonaws.com/0/33884/79147e87-c227-4d0e-f24b-79e2c86e5914.png)
######Mt.Fuji
#はじめに
今の職場でIntelliJを使うことになったわけですが、eclipseと比較すると色々と便利だと思うところは多い。
（何が？と言うのは他の投稿に譲るとして...）

今、前の席に向かい合わせで座っている人が、余りにもVimVimVimというものだから
それに影響されてIntelliJにIdeaVimなるものを入れてみた。
が、便利さと不便さと中途半端さがあることに気付かされたので、ここで紹介。

#インストール
![vim.png](https://qiita-image-store.s3.amazonaws.com/0/33884/cd957771-5953-943c-a554-107df952af67.png)

コレを選んでインストール。
以上。

#便利さ
メソッドにジャンプしたり【Ctrl+]】、戻ったり【Ctrl+o】、ページ移動したり【Ctrl+f, Ctrl+b】
という基本的にはマウスを使ってやることが多い操作を、キーボードから手を離さずできてしまう点は便利だと感じた。

#ところが
Vimでの開発に慣れてきた頃、いくつか不便なところが目につくようになった。
例えば、

![hello.png](https://qiita-image-store.s3.amazonaws.com/0/33884/27c7955f-dcfa-33e5-b969-7993e7e198e1.png)

デバッグ時のConsoleでcaretが操作できないことが判明！
マウスでcaret位置を動かすことができても、それ以上何もできない...
矢印キーはもちろん、Ctrl+Home, Ctrl+Endもダメ。
今のところお手上げ状態。

![newclass.png](https://qiita-image-store.s3.amazonaws.com/0/33884/063a45f0-fbd5-4d22-2fc5-86a691563461.png)

新規Class作成のダイアログでは通常のキーバインドだったりするので、ダイアログはノーマルで
それ以外はVim。そしてConsoleは触るな、と思っていたのだけど、、、

![commit.png](https://qiita-image-store.s3.amazonaws.com/0/33884/f1eb4391-dc35-80c5-1a5f-9c1ea44ce3b0.png)

Commitログを書くときのダイアログは何故かVimになっている。
どうなってるの？？

#最後に
周りの人にIdeaVim使ってると言うと、そんなん無理がある、とかボロカス言われ、
この投稿を書きながら向かい合わせに座ってる人に、IdeaVim使ってる？と聞くと
「Vimの中でしかVimは使わないんだよねー」とか言うし。
VIｍの中ってなんやねん、と思いながら色々と聞いてみると
Vimの標準コマンドで【dit】とか【dat】とか【di"】とか
聞いてみると便利なコマンドがいっぱい。
いざIdeaVimで試すと、やっぱり動かない。

そういうことね。。。

まぁ、慣れてきたこともあるので、もう暫くIdeaVimと付き合ってみようと思います。
Kobitoデビュー

[@nqounet](https://twitter.com/nqounet)です．

今更感満載ですが，Kobitoで書いてみました．

Markdownエディタとしての機能は少ないけど，気を張らずにざっくり書けるのは気持ちいいかも．

タグが強制というのは知らなかったけど，まあ，それくらいの制約はあったほうがいいのかな．
FuelPHPでoil refine migrateを使ってもDBに反映されない

```php
//モデル作成
$ php oil g model hoge email:string password:string name:varchar[50]

//データベースに反映
$ php oil refine migrate
```

FuelPHPにて、テーブルとモデルを作成するために、
上記のようにoilコマンドを実行した際に、

```php
Already on the latest migration for app:default.（マイグレーションは最新の状態です）
```

と表示された場合の対処法です。


##解決策

このような時は、下記のoilコマンドを実行します。

```php
oil refine migrate:current
```
MDM環境でテストできない場合の構成プロファイルによるテスト方法

## 想定状況

###### クライアントはMDMでiPadのスクリーンショット（電源ボタン＋ホームボタン）を制限している
###### MDMで制限しているがアプリのスクリーンショット機能は動くのか？という質問が来る
###### アプリのスクリーンショット機能はObjective-Cで実装してある

## 解決方法

### 構成プロファイルを自前で用意してテストする

#### 必要なもの

* Mac
* 実機
* [iPhone構成ユーティリティ](http://support.apple.com/kb/DL851?viewlocale=ja_JP)

#### やり方

* iPhone構成ユーティリティを開きます
* 構成プロファイルを選択する
* 「一般（必須）」の項目を入力します

![スクリーンショット 2013-12-13 19.55.56.png](https://qiita-image-store.s3.amazonaws.com/0/3613/2b98edbe-53dc-5962-4898-462ec1673992.png)

* 「制限」のタブを選択し、「構成」を押してから「画像の取り込みを許可」のチェックを外します

![スクリーンショット 2013-12-13 20.13.13.png](https://qiita-image-store.s3.amazonaws.com/0/3613/12709afa-3e1e-b271-a866-1a3e964996c6.png)


* 上記を設定後、構成ユーティリティの左メニューからデバイス一覧にある中からインストールしたい端末（上記の場合iPhone5）を選択します
* 構成プロファイルのタブを選びます
* 先ほど作成した構成プロファイルをインストールします
* 実機で確認画面がでるのでインストールします

###### これで電源ボタン＋ホームボタンを押してもスクリーンショットは動きません！
###### またiOS6・iOS7でもObjective-Cで実装したスクリーンショット機能は動きました！

#### 参考

[アーカイブ - iOS：iPhone 構成ユーティリティを使用した APN 設定の編集方法](http://support.apple.com/kb/HT4839?viewlocale=ja_JP)
Windowsのproxy設定がある環境でGitHub (ユーザー認証なし)

下記公式ページによると…
$ git config http.proxy プロキシサーバーのアドレス:ポート番号

https://github.com/NIFTYCloud-C4SA/support/wiki/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88-GitHub%E3%81%AE%E5%A7%8B%E3%82%81%E6%96%B9(GitHub-for-Windows%E7%B7%A8)

でも実際は下記で設定できるみたいです。
$ git config --global http.proxy プロキシサーバーのアドレス:ポート番号
Railsのautoload_pathsを設定しているソースの箇所

appの直下のサブディレクトリは自動でロードされるらしいと聞いたものの、ソースのどこでやっているのかを知らなかったので調べてみました。

https://github.com/rails/rails/blob/v4.0.2/railties/lib/rails/engine/configuration.rb#L38-L72

```rb
      def paths
        @paths ||= begin
          paths = Rails::Paths::Root.new(@root)

          paths.add "app",                 eager_load: true, glob: "*"
          paths.add "app/assets",          glob: "*"
          paths.add "app/controllers",     eager_load: true
          paths.add "app/helpers",         eager_load: true
          paths.add "app/models",          eager_load: true
          paths.add "app/mailers",         eager_load: true
          paths.add "app/views"

          paths.add "app/controllers/concerns", eager_load: true
          paths.add "app/models/concerns",      eager_load: true

          paths.add "lib",                 load_path: true
          paths.add "lib/assets",          glob: "*"
          paths.add "lib/tasks",           glob: "**/*.rake"

          paths.add "config"
          paths.add "config/environments", glob: "#{Rails.env}.rb"
          paths.add "config/initializers", glob: "**/*.rb"
          paths.add "config/locales",      glob: "*.{rb,yml}"
          paths.add "config/routes.rb"

          paths.add "db"
          paths.add "db/migrate"
          paths.add "db/seeds.rb"

          paths.add "vendor",              load_path: true
          paths.add "vendor/assets",       glob: "*"

          paths
        end
      end
```

root, eager_load_paths, autoload_once_paths, autoload_pathsはその下で設定しています。
https://github.com/rails/rails/blob/v4.0.2/railties/lib/rails/engine/configuration.rb#L74-L88

```rb
      def root=(value)
        @root = paths.path = Pathname.new(value).expand_path
      end

      def eager_load_paths
        @eager_load_paths ||= paths.eager_load
      end

      def autoload_once_paths
        @autoload_once_paths ||= paths.autoload_once
      end

      def autoload_paths
        @autoload_paths ||= paths.autoload_paths
      end
```
merge で .gitconfig が壊れて merge commit にならない

昨今は dotfile の類を git 管理している人も多いことと思います。私も .gitconfig ファイルをバージョン管理しているのですが、つい先日、merge したのに merge commit にならないという現象に遭遇しました。その備忘録です。

----

以前、alias を追加定義したのですが、その .gitconfig への変更を push し忘れていました。そのまま長いこと放置していて、他のマシンでその alias を使えないことに気付いて追加、そちらで commit&push したところ、最初のマシンで pull したときに conflict が発生してしまいました。

「あぁ、同じ行を編集したから conflict したんだな」と思って、普段通りエディタで conflict 行を編集し、unresolved フラグを解消し、commit しようとしました。ところが、commit の段になってどうもおかしい。いつもなら、merge commit をする際には merge commit であることを示す以下のようなデフォルトのコミットメッセージが挿入され、conflict したファイルが示されます。

```text:普段なら…
Merge remote-tracking branch 'origin/master' into master

Conflicts:
       .gitconfig
# :
# :
```

しかし今回は、それがなかったのです。実際 merge 元が設定されていない普通の commit になり、git graph などで確認しても歴史のパスがただの一本道です。

どういうことかと思ってもう一度 merge するところから注意深くやり直してみました。すると、以下のようなメッセージが出ていました。

```text
Auto-merging .zshrc
Auto-merging .zshenv
Auto-merging .vimrc
Auto-merging .gitconfig
CONFLICT (content): Merge conflict in .gitconfig
fatal: bad config file line 23 in /home/uda/.gitconfig
```

conflict したのがよりもによって ```.gitconfig``` だったため、git の処理が途中で止まってしまったようです（※私は $HOME/.gitconfig から git-repo/.gitconfig にシンボリックリンクを張って管理していました）。この状態で conflict を解消して commit しようとしても、先述のように merge commit にはなりません。

で、どうしたかというと、merge したときに ```$HOME/.gitconfig``` が破壊されないよう別の場所で merge 作業を行うことにしました。 すると、fatal と出ていたところで処理が止まらず、無事 merge commit を作れました。一件落着です。
MacにJenkinsをインストールして、iTunes Connectから日時レポートを取得してDropboxフォルダーにコピーする


初めてJenkinsというものを触ってみたのでメモ。
このやり方でいいのか分かりません。。

##homebrewをインストール

```
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
```

##jenkinsをインストール

```
$ brew install jenkins
```

##jenkinsでjobを作成する
ご自由に。

##AppleからJAVAプログラムをダウンロードしてくる
【公式Doc】http://www.apple.com/itunesnews/docs/AppStoreReportingInstructions.pdf
この12Pくらいに「autoingestion.zip」があるのでダウンロードする

##作成したjobのワークスペースに上記のzipの中身を展開する
zipの中のautoingestion.propertiesにiTunesConnectのID、PASSを設定する 

##jenkinsで以下のシェルを実行する

```
REPORT_DATE=`date -v-2d +%Y%m%d`

echo $REPORT_DATE

java Autoingestion autoingestion.properties <ベンダーID> Sales Daily Summary $REPORT_DATE

gunzip -f S_D_<ベンダーID>_$REPORT_DATE.txt.gz

mv -f S_D_<ベンダーID>_$REPORT_DATE.txt report_$REPORT_DATE.txt

mv report_$REPORT_DATE.txt <Dropboxのパス>
```

##スケジュールで毎日12時に設定する
crontab
http://ja.wikipedia.org/wiki/Crontab

```
0 12 * * *
```
アプリストアの説明文をGengoで翻訳する

今回、Showrtpathブラウザ( http://showrtpath.com )というiOSのアプリをリリースしました。自分は英語が全然できないので、ストアに登録したアプリの説明文をGengo( http://gengo.com/ja/ )のウルトラコースで翻訳してもらいました。

ウルトラコースとは、ウェブサイト、会社紹介、マーケティング、PRに適した翻訳をしてもらいます。
1文字あたり9円掛かります。

翻訳した結果は、以下の様になりました。

翻訳前(一部抜粋)
> Showrtpathは高速で爽快な操作感のあるWEBブラウザです。
> WEBページのコンテンツに集中できるシンプルなデザインでありながら、スマートにタブを操作できます。 
> リンクをロングタップで新しいタブとして開き、スワイプしてタブの切り替え、読み終わったらタブを閉じる。
> これらの操作を素早くできます。

翻訳後
> Showrtpath is a high speed, easy to operate web browser.
> It has a simple design that lets you concentrate on the contents of web pages while using stylish tabs.
> Click and hold on a link to open a new tab, swipe to switch tabs, and close a tab when you're finished reading.
> All of these things can be done quickly.

とても分かりやすい文章で翻訳されています。

# 手順
1. http://ja.gengo.com/express/order-translation/?from=top を開きます
1. テキストを直接入力をクリック  ( ウルトラコースは現時点ではファイルのアップロードに対応しておりません )
1. タイトルと翻訳対象のテキストが入力できます。翻訳者の指示も入力できます。自分は”Apple AppStoreのアプリの説明文です。魅力あるようにお願いします”と書きました。あと用語と英語の対応を書きました。
1. 品質レベルは、Ultra
1. 翻訳前の言語は日本語
1. 翻訳後の言語は英語を選択します。

ここまで入力すると金額が表示されます。自分の場合は5千円程度でした。自分の場合はPayPalで支払いました。翻訳完了時間は56時間と表示されましたが、6時間程度で完了しました。

少しだけお金を掛ければ、世界中のストアに販売できるのでかなり便利になりました。
iOS.zip というサイトをつくりました

### 2014/10/08 追記

サービスを再開し、iPhone 6, iPhone 6 plus用のサイズを追加しました。
iTunes Connect の申請で必要なサイズを知りたい場合などにご利用ください。
http://ioszip.mashroom.in/


# iOS.zip というサイトをつくりました

iOS.zipというサイトをつくりました。
http://ioszip.mashroom.in/

![ioszip](http://cdn-ak.f.st-hatena.com/images/fotolife/h/himaratsu/20131213/20131213184240.png)


## これは何ですか？
iOSアプリの申請に必要な画像のダミー画像のzipが落とせるサイトです。

* 申請に必要なファイルサイズを知りたい時
* 爆速で iTunesConnect にアプリを登録したい時
* うわっ、途中まで項目入力したけどスクショないこのままではタイムアウトなってしまうピンチ

のような時にご利用頂けます。


## zipファイルには何が入っていますか？
iPhoneアプリ申請に必要な画像のダミーが入っています。120x120.pngのような名前です。  
 今のところiPhone用のサイズだけですが、近日中にiPadサイズも追加予定です。  


## お問い合わせ
足りないサイズやサイズ間違い等あればすぐ対応しますので下記までご連絡ください。

* [Twitter ＠himara2](https://twitter.com/himara2)
* [GitHub Issue](https://github.com/himaratsu/ioszip/issues?state=closed)

  
iOS 10くらいまでは対応していきたいと思いますのでよろしくお願いします。
MacBookPro 13inch Retina for Ubuntu 13.10 で音がなるようになりました。

LinuxKernelが現状3.11.0-15だと音がなりませんが、3.13.0-031300rc3-genericにアップデートすることで、音がなるようになります。
以下の要領にてアップデートし現在、wifi、サウンドとも動作しています。
$ wget -c kernel.ubuntu.com/~kernel-ppa/mainline/v3.13-rc3-trusty/linux-headers-3.13.0-031300rc3_3.13.0-031300rc3.201312061335_all.deb
$ wget -c kernel.ubuntu.com/~kernel-ppa/mainline/v3.13-rc3-trusty/linux-headers-3.13.0-031300rc3-generic_3.13.0-031300rc3.201312061335_amd64.deb
$ wget -c kernel.ubuntu.com/~kernel-ppa/mainline/v3.13-rc3-trusty/linux-image-3.13.0-031300rc3-generic_3.13.0-031300rc3.201312061335_amd64.deb

上記DL完了後
sudo dpkg -i linux-headers-3.13*.deb linux-image-3.13*.deb

です。
ｒｃ１だとwifiがどうやっても認識しませんでしたがrc3では認識しています。今のところ、不具合は出ていませんが自己責任にてお願いいたします。
Yank registered


## :reg " and :reg 0
When you use x, you are cutting to the default register.

    # To see what in the default register
    :reg "

    # To see what in the register 0
    :reg 0 # yank register


## Using reg 0 to paste

    # diw(delete inner word) will register in the default register.
    # In order to put the yanked word, use `"0P`.
    "0P

## True delete in vim

    # Just to delete, use "_. 
    # e.g. to delete a word
    "_diw

[Meet the yank register](http://vimcasts.org/episodes/meet-the-yank-register/)

[Replace a word with yanked text](http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text)


## Within a file

    # copy to register a
    # <C-V> to change to visual mode and select line(s) or word(s) 
    "ay # use a-z
    # to paste it
    "ap
    # check it in register
    :reg "a:
    # Delete it in the register a
    qaq
    # check it again
    :reg "a # should be nothing in register a
    # help 
    :h quote_alpha
    # You can append to a register
    "Ayy # to append to a line
    # or use
    :yank A 
    # or append all lines which has def
    :global/def/yank A

[Using Vim's named registers](http://vimcasts.org/episodes/using-vims-named-registers/)

## To copy from one file to another

    # <C-v> to change to visual mode and select lines
    # to copy
    "+y
    # to paste
    "+p
antlrつこてみる

ANTLRはLLなパーサジェネレータ
LLとかLRとかどっちがよいのかよくわからないのだけど、なんとなくANTLRつかってみる

http://www.antlr.org/

インストール
----------------

http://www.antlr.org/download.html
ここからantlr-4.1-complete.jarをダウンロードしてくる

http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4
に従ってセットアップする。
うちはWindowsなので以下のようなバッチファイルを作る

```bat:antlr.bat
set CLASSPATH=.;.\lib\antlr-4.1-complete.jar;%CLASSPATH%

java org.antlr.v4.Tool %*
```
```bat:run.bat
set CLASSPATH=.;.\lib\antlr-4.1-complete.jar;%CLASSPATH%

java org.antlr.v4.runtime.misc.TestRig %*
```

Example
------------

```antlr:Hello.g4
// Define a grammar called Hello
grammar Hello;
r  : 'hello' ID ;         // match keyword hello followed by an identifier
ID : [a-z]+ ;             // match lower-case identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
```

サンプルのgrammarを作成してコンパイルしてみる。hello.g4のように小文字になってるとエラーになるので注意！

> $ antlr Hello.g4
> $ javac Hello*.java

構文木を生成してみます

> $ grun Hello r -tree
> hello parrt
> ^Z
> (r hello parrt)

^ZはControl-Zを入力してEnter
unix系なら^D
`(r hello parrt)`が出力です
LISPっぽく構文木が表現されています
Struts2-jQueryプラグイン/BootstrapプラグインとAjaxValidation (2013 Winter version)

Struts2とStruts2-jQuery + Bootstrapプラグインを使ったAjaxValidation 
※まずは基本から

必須構成
+ Struts 2.3.15.3
+ Struts2-jQuery plugin 3.6.1
+ Struts2-bootstrap plugin 1.6.x
+ Struts2-Convention plugin(アノテーション設定で利用)

## 下準備
struts.propertiesに以下の記述を追加する

```properties
struts.enableJSONValidation=true
```

## Actionクラス
AjaxValidation用のパッケージ＆インターセプタスタックを利用する

```java
@ParentPackage("json-default")
@InterceptorRefs({ 
	@InterceptorRef(value="jsonValidationWorkflowStack")
})
```
## JSP
Struts2-jQueryプラグイン用のヘッダ＆Struts2-Bootstrapプラグイン用のヘッダを宣言する。

```jsp
<sj:head compressed="false" ajaxcache="false" jqueryui="true"
	locale="ja" debug="true" />
<sb:head includeScripts="true" includeScriptsValidation="true"
	includeStylesResponsive="false" />
```

sb:headのincludeScripts、includeScriptsValidationはtrueにする。

次に送信フォームとボタンの書き方。
送信フォームはStruts2タグのformのお作法。

```jsp
<s:form id="checkForm" name="checkForm" method="POST" validate="true">
  <sj:submit button="true" role="button" name="checkButton" id="checkButton" 
        validate="true" formIds="checkForm" value="チェックする" 
        validateFunction="bootstrapValidation" />
</s:form>
```

s:formにも、sj:submitにも、validate="true"とするのが正しい。

## AjaxValidationによるチェックの簡単なフロー
JSP→ActionクラスのValidationだけ行う→結果がJSPに反映→エラーがなければStruts2のJavaScriptが自動的にActionクラスを実行

## 注意点
1つのs:form内で複数種類の送信先を指定する場合は、単純にhref属性をつけるだけではダメ。
※href属性は現在正しく動かない。
sj:submitのonAfterValidationTopicsで起動するsubscribeを定義して制御すること。

```js
$.subscribe('afterValidation', function(event,data) {
  // さまざまなオブジェクトの取得例	  
  var formData = data.form;
  console.debug('data:' + data);
  console.debug('event' + event.originalEvent);
  console.debug('formData' + formData);
  .......
  // 入力チェックエラーの有無(boolean)
  var result = event.originalEvent.formvalidate;
}
```
pry-docでカジュアルにRubyのソースコードを読む

RubyのREPL環境として一般的なpryというgemがあります。
pryの非常に便利な機能としてshow-sourceというコマンドがあり、指定したクラスやメソッドのソースコードをpry上で表示してくれます。

```
[15] pry(main)> require 'tsort'
true
[16] pry(main)> show-source TSort#tsort

From: /Users/joker/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/tsort.rb @ line 133:
Owner: TSort
Visibility: public
Number of lines: 5

def tsort
  result = []
  tsort_each {|element| result << element}
  result
end
```

デフォルトのままのpryはCで書かれたRuby組み込みのクラスやメソッドのソースを表示することが出来ません。
そこでpry-docをインストールすると、Cで書かれたRubyのソースコードを表示することができるようになります。
pry-docはgem内部にCのソースコードとメソッドの対応関係を示したYARDを持っていて、それを利用してソースコードを表示しています。

pry-docを利用するとこんな感じでソースコードが読めます。

```
[34] pry(main)> show-source Array#<<

From: array.c (C Method):
Owner: Array
Visibility: public
Number of lines: 10

VALUE
rb_ary_push(VALUE ary, VALUE item)
{
    long idx = RARRAY_LEN(ary);

    ary_ensure_room_for_push(ary, 1);
    RARRAY_PTR(ary)[idx] = item;
    ARY_SET_LEN(ary, idx + 1);
    return ary;
}
```

なるほど`Array#<<`は配列の長さを取得して、push出来る領域を確保し、末尾のインデックスに直接itemを挿入して配列の長さを+1しているのか、ということが分かります。

一方で`Array#<<`と良く似ているけど複数引数を受け取れる`Array#push`を見てみるとこんな感じです。

```
[39] pry(main)> show-source Array#push

From: array.c (C Method):
Owner: Array
Visibility: public
Number of lines: 5

static VALUE
rb_ary_push_m(int argc, VALUE *argv, VALUE ary)
{
    return rb_ary_cat(ary, argv, argc);
}
```

流石にこれだけじゃ分かりませんね。でもエンドポイントとなっている関数名と実装があるファイル名が分かってるので、Rubyソースコードのどこを読めば良いかはすぐに分かります。

Rubyのソースは必要になったら落としてくれば良いですが、それだと若干面倒くさいのでrbenvを上手く活用すると捗ります。
rbenvでRubyをインストールしているなら`--keep (-k)`オプションを付けてインストールしておくとRubyのソースコードをrbenvのディレクトリに保存しておいてくれます。

array.cを開いて`rb_ary_cat`とは何なのかを調べてみましょう。

```c
rb_ary_cat(VALUE ary, const VALUE *ptr, long len)
{
    long oldlen = RARRAY_LEN(ary);

    ary_ensure_room_for_push(ary, len);
    ary_memcpy(ary, oldlen, len, ptr);
    ARY_SET_LEN(ary, oldlen + len);
    return ary;
}
```

`Array#push`は`ary_memcpy`という関数で配列の末尾から追加の長さ分コピーすることによって配列を変更しているんだな、という事が分かりますね。

ついでに`ary_memcpy`も見てみましょう。

```c
ary_memcpy(VALUE ary, long beg, long argc, const VALUE *argv)
{
#if 1
    if (OBJ_PROMOTED(ary)) {
	if (argc > (int)(128/sizeof(VALUE)) /* is magic number (cache line size) */) {
	    rb_gc_writebarrier_remember_promoted(ary);
	    RARRAY_PTR_USE(ary, ptr, {
		MEMCPY(ptr+beg, argv, VALUE, argc);
	    });
	}
	else {
	    int i;
	    RARRAY_PTR_USE(ary, ptr, {
		for (i=0; i<argc; i++) {
		    OBJ_WRITE(ary, &ptr[i+beg], argv[i]);
		}
	    });
	}
    }
    else {
	RARRAY_PTR_USE(ary, ptr, {
	    MEMCPY(ptr+beg, argv, VALUE, argc);
	});
    }
#else
    /* use shady (traditional way) */
    MEMCPY(RARRAY_PTR(ary)+beg, argv, VALUE, argc);
#endif
}
```

`MEMCPY`というマクロでポインタの内容をコピーしていて、コピー対象の数が少ない時にはforループで`OBJ_WRITE`を呼んで配列に追加していってるようですね。

私はCをちゃんとやったことがないのですが、pry-docで取っ掛かりを掴む事で、何とか読み進めていくことが出来ます。
コア部分をいきなり読むのは難しいですが、外周部分のメソッドの呼び出しから読んでいくと、何を目的にした関数なのかはっきりしているのでかなり読み易いと思います。

Cのソースコードを読んでおくことで、呼び出した結果どれぐらいの計算が走ってるのかとか、内部でオブジェクトがコピーされている、ということがちゃんと把握できるようになります。それにCでgemを書くための参考にもなります。

pry-docから始めるRubyのソースコードリーディング、興味があれば是非やってみてください。
インストールされている rpm のパッケージ名のみの一覧を取得する

```
$ rpm -qa --qf "%{NAME}\n"
```
--qa だとバージョンも表示されて鬱陶しい。

これ結構便利で、同じパッケージをインストールした状態の、別のホストを作るとかが簡単にできる

```
host-A$ rpm -qa --qf "%{NAME}\n" > pkg.list
host-B# xargs yum -y < pkg.list
```
JavaScriptのオブジェクトにドット記法でアクセスする

例えば以下の様なオブジェクトがあったとする

```js
obj = {
  hoge : {
    fuga : {
       bar : "bar"
    }
  }
}
```

このとき、barの値にアクセスする場合、どうするか、という話。jsでネストされたオブジェクトのプロパティにアクセスする場合、ドット記法か多次元配列かが選択できるが、場合によってはkey pathが変数で渡されてくる場合がある。そういう場合に

```js

// エラー
var bar = obj["hoge.fuga.bar"]

```

とやると普通にエラーになる。なので以下の様なアクセサを作って使う

```js
function accessWithDots(obj,key_path) {
  var key, paths, val;
  paths = key_path.split(".");
  val = obj;
  while (paths.length > 0) {
    key = paths.shift();
    val = val[key];
  }
  return val;     
}
```

```js

var bar = accessWithDots(obj,"hoge.foo.bar")
// => bar
```
他に何も必要のないシンプル一行掲示板

データファイルを用意する必要のない、このソースひとつで動く掲示板です。
このファイル自身に書き込みデータを追記して行くので、パーミッションでその他のユーザーの書き込みを許可しておいてください。

```php:bbs.php
<?php if (isset($_POST['p'])) {
  $f = file_get_contents(__FILE__);
  preg_match('|(.*^</form>)(.*)|ms', $f, $m);
  $f = $m[1] . '<p>' . htmlspecialchars($_POST['p'], ENT_QUOTES) . $m[2];
  file_put_contents(__FILE__, $f, LOCK_EX);
  header('Location: ' . $_SERVER['SCRIPT_NAME']);
} ?>
<!DOCTYPE html>
<meta charset="utf-8">
<title>BBS</title>
<form method="post">
<input name="p">
<input type="submit">
</form>
```

何かマズいところがありましたら教えて下さい。
DJangoメモ：はじめから（ビューを作る編）


[チュートリアル３](http://docs.djangoproject.jp/en/latest/intro/tutorial03.html)を開始。
今回からは公開用のページを作るやり方を学びます。

### URLConf設定を書く ###
以下の記述が必要だがstartproject時に自動的に作られている。
###### setting.py ######

```py
ROOT_URLCONF = 'mysite.urls'
```

urls.py内のURLConfも同様。まずはここにパターンを追加していく。

###### urls.py ######

```py
from django.conf.urls import patterns, include, url  # 追加

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # url(r’URLパターン’,’対応するビュー関数’)という書き方
    url(r'^polls/$', 'polls.views.index'),  # 追加
    url(r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),  # 追加
    url(r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),  # 追加
    url(r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),  # 追加
    url(r'^admin/', include(admin.site.urls))
) 
```

##### 正規表現が全く分からないためググりました。 #####
基本：http://www.mnet.ne.jp/~nakama/
Python：http://docs.python.jp/2.7/library/re.html#module-re

^は開始地点、$は終了地点を意味するらしいので、

* **’^polls$’は「’polls’以外は許さない」という意味（たぶん）**

‘(?P<poll_id>\d+)’に関しては分かるところから解体してみると、

* **()はグループ化**

複数文字をまとめて評価する場合にこれでくくる。

* **‘?P<poll_id>’は変数宣言みたいなもの？**

以降の該当文字列をpoll_idに代入している感じと思われる。

* **’\d’は半角の0から9**

これは’[0-9]’とも書けるっぽい。

* **’+’は１回以上の繰り返しているかどうか**

つまりまとめて’\d+’となると一桁以上の半角数字が該当。

とりあえずどのパターンも’^’から’$’になっているのでその内側で指定した表現は排除されるということだろう。

### ビューを作る ###

###### views.py ######

```py
from django.http import HttpResponse

def index(request):  # index.html的な役回り
    return HttpResponse("Hello, world. You're at the poll index.")

def detail(request, poll_id):  # url:/polls/1/で表示
    return HttpResponse("You're looking at poll %s." % poll_id)
def results(request, poll_id):  # url:/polls/1/results/で表示
    return HttpResponse("You're looking at the results of poll %s." % poll_id)
def vote(request, poll_id):  # url:/polls/1/vote/で表示
    return HttpResponse("You're voting on poll %s." % poll_id)
```

detail以降の関数は第に引数にpoll_idが入る。
先ほどのurl(r’URLパターン’,’ビュー関数’)では、URLが正規表現にマッチしていたらビュー関数の第２引数に’?P\<poll_id>’に代入された値が渡されるらしい（それはいずれも’\d+’だったので一桁以上の半角数字になる。’url:/pols/1/’だったら’1’）。
**名前を変えると駄目になったので、変数として取得しているのかもしれない。**

それぞれのURLにアクセスすると、たしかにちゃんと表示された。
Jenkinsの通知をiMessage or Googleハングアウトで受け取る

いい加減、何でもかんでもメール通知するのは止めたいですよね。
メール以外の通知方法はいろいろありますが、個人的に最もカジュアルだと思うiMessageでの受け取り方。ちなみにGoogle Appsでもいけます！

## 受け取るアカウント側の設定
適当なクライアントを使って、Jenkinsに入れるアカウントと受け取りたいアカウントの間で友達になってメッセージを受信可能にしておきます。


## Jenkins側の設定
### Jabberプラグインの導入
JenkinsにはJabber Pluginをインストールします。
https://wiki.jenkins-ci.org/display/JENKINS/Jabber+Plugin

これは管理画面からインストールできるのでサクッといけます。

### Jabberプラグインの設定
Jenkinsの管理->システム設定から、Jabber Notificationの設定をします。
主なポイントは以下の通り。
- Enable Jabber Notificationにチェック！
- Jabber ID/Passwordに有効なGoogleアカウント（メールアドレス、パスワード）
- 高度な設定からServerに`talk.google.com `、Portに5223を入れる
- 同じく高度な設定から、Enable SASL authenticationを無効にする

### Jenkinsジョブの設定
ビルド後の処理の追加から、Jabber Notificationを選択し、通知先（Googleアカウントのメールアドレス）を登録する。


たったこれだけです。
iMessageだと通知センター等への組み入れも簡単なので、かなり楽に通知を受け取れます。
とあるディレクトリのファイルがソースコード中に含まれているか調べる


```shell
# ファイルリスト作成。必要なら編集も可。
$ ls -1 > files.txt
# grepのパターンにファイルを指定する
$ find (検索したいパス) -type f -name *.js | xargs grep -f files.txt 2>&1 | tee result.txt
```
Pikeって意外とやるじゃん、って思った

[Pike]っていう言語があります。多分、言語オタを名乗る人なら「静的型付けなんだか動的型付けなんだかよく分からないあの言語ね」って感じで通じるんじゃないでしょうか。

13日の金曜日だし、変な言語でJSONでもデコードしよう、と思い立ってインストールしてみてちょっと使ってみたのですが、結構面白いです。

で、意外とやるじゃん、と思ったのが、こんなプログラム(構文強調がPikeに対応してるわけがないのでC言語にしてます)。

```c
int main() {
  string str = "こんにちは、世界";
  write("%d\n", strlen(str));
  return 0;
}
```

なにをやっているかは雰囲気で分かると思います。

このプログラムは何を出力するでしょうか？ 常識的に考えたら`8`になると思います。(`"こんにちは、世界"`は8文字なので)
しかし、このプログラムは予想に反して、

```
24

```

と出力することになります。(UTF-8で保存した場合)
これは、UTF-8だと日本語(CJKなら)が3byteでエンコーディングされるためです。

これを、期待される結果にするために、`utf8_strlen`を使うことができます。

```c
int main() {
  string str = "こんにちは、世界";
  write("%d\n", utf8_strlen(str));
  return 0;
}
```

これで、きちんと`8`と出力されるようになりました。

でも…。わざわざ毎回`utf8_strlen`とか打ちこむのは面倒ですよね？
これじゃ微妙だな…、と思ってさらに調べてみたら[こんなページ](http://pike.lysator.liu.se/generated/manual/ref/chapter_5.html)を見つけました。
そこにはPikeのプロセッサーディレクティブの一覧が載っているのですが(C言語の`#include`のようなもの)、`#charset`というディレクティブがあることが分かりました。
ただ、ドキュメントがあきらかに足りていなくて挙動が謎だったので、次のようなコードを試してみました。

```c
#charset utf-8

int main() {
  string str = "こんにちは、世界";
  write("%d\n", strlen(str));
  return 0;
}
```

なんと！ これできちんと`"こんにちは、世界"`は8文字として認識されるようになります。

さらに、この`#charset`ディレクティブにはShift_JISなども指定することができます。(まあ、Shift_JISを指定すると`\`が円記号にマッピングされて残念なことになるんですけど…)

歴史ある言語だけあって意外と多言語対応してるよ、って話でした。

[Pike]: http://pike.lysator.liu.se
カンマ区切りの金額の正規表現（増税に伴う修正とかに使えそう）

これから増税が2回もあるので、それに伴う作業もあるかもしれません。
正規表現を使うと、簡単に検索や置き換えができます。
※DreamweaverやSublimeでも使えます。

##「税込X,XXX円」や「X,XXX円（税込）」のようなカンマがある金額

```html
税込(0|([1-9][0-9]{0,2}(,[0-9]{3})*?)|0|([1-9][0-9]{0,2}(,[0-9]{3})*?))円|(0|([1-9][0-9]{0,2}(,[0-9]{3})*?)|0|([1-9][0-9]{0,2}(,[0-9]{3})*?))円（税込）
```
SQLで集約した時系列データの値が0となる行を補完する


イベントログのようなデータをRDBSに保存しており、1時間ごとのイベントの発生数をグラフにしたいとします。
GROUP BY句とCOUNT関数による集約処理を行えばよいのですが、
値が0となる場合、その値を含む行はデータとして取得できません。
そのためRなどでグラフを描画する際に不都合が生じます。
以下に例を示します。


MySQLに以下のようなテーブルがありデータがあるとします。

```
CREATE TABLE event_time (
time timestamp
);
```

これを1時間ごとに集約するには次のようにします。

```
select time, count(*)
from event_time 
where day(time) = "XXXX-XX-XX" 
group by time 
order by time asc;
```

実行するとこのようなデータが得られます。

```
+------+----------+
| time | count(*) |
+------+----------+
|    0 |        2 |
|    5 |        1 |
|    6 |        2 |
|    7 |        5 |
|    8 |        2 |
|    9 |        1 |
|   10 |        1 |
|   11 |        1 |
|   12 |        1 |
|   16 |        2 |
|   17 |        9 |
|   18 |       29 |
|   19 |       59 |
|   20 |      132 |
|   21 |       29 |
|   22 |       10 |
|   23 |        4 |
+------+----------+
```

このように値が0となる行はデータとして得られないため、
このままではグラフを描画した際におかしなことになってしまいます。

# 解決方法 - 時間軸テーブルとJOINする

時間軸データを予め作成しておいて、そのテーブルと集約したデータをJOINします。

## 時間軸テーブルの作成

ここでは0から23までの24行の時間軸テーブルを作成します。

### PostgreSQL

```
create table timeaxis SELECT generate_series(0, 23);
```

### MySQL

```
create table timeaxis
SELECT 0 time 
FROM DUAL WHERE (@num:=1-1)*0 
UNION ALL 
SELECT @num:=@num+1 FROM `information_schema`.COLUMNS LIMIT 23+1;
```

```
> SELECT * FROM timeaxis;
+------+
| time |
+------+
|    0 |
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
|   11 |
|   12 |
|   13 |
|   14 |
|   15 |
|   16 |
|   17 |
|   18 |
|   19 |
|   20 |
|   21 |
|   22 |
|   23 |
+------+
```


## SELECT JOINによる結合

```
select timeaxis.time, timecount.cnt
from timeaxis left join
	(select time, count(time) as cnt
	from event_time 
	where day(time) = "XXXX-XX-XX" 
	group by time 
	order by time asc) as timecount 
on timeaxis.time = timecount.time
order by timeaxis.time asc;
```
サブクエリは先に示したクエリと同じものです。

```
+------+----------+
| time | count(*) |
+------+----------+
|    0 |        2 |
|    1 |     NULL |
|    2 |     NULL |
|    3 |     NULL |
|    4 |     NULL |
|    5 |        1 |
|    6 |        2 |
|    7 |        5 |
|    8 |        2 |
|    9 |        1 |
|   10 |        1 |
|   11 |        1 |
|   12 |        1 |
|   13 |     NULL |
|   14 |     NULL |
|   15 |     NULL |
|   16 |        2 |
|   17 |        9 |
|   18 |       29 |
|   19 |       59 |
|   20 |      132 |
|   21 |       29 |
|   22 |       10 |
|   23 |        4 |
+------+----------+
```

## 後処理

結合処理を行った場合、補完された行の集約値は0ではなくNULLとなっています。そのため、SQLの式を改良するか、グラフ描画の前で後処理を行う必要があります。

### SQLのCASE式を使用

```
CASE timeaxis.time WHEN IS NULL THEN 0 ELSE access
```

### RによるNA値の置き換え

```
access_time.isna[access_time] <- 0
```

RでRDBSからデータを取得した場合、NULLはRのNAという値に置き換わるので、それを0で置き換えます。
# 参考にした記事


[9.18. 集合を返す関数](http://www.postgresql.jp/document/8.0/html/functions-srf.html)

[裏MySQLクエリー入門(15) 応用編3 MySQLで連番の仮想表を作成](http://d.hatena.ne.jp/IT7C/20100713/1278950305)

[CASE式のススメ](http://www.geocities.jp/mickindex/database/db_case.html)
git で使用するエディタの変更

```bash:.bash_profile
git config --global core.editor ${editer}
```

alias で、viをMacVimに変更した結果
git merge でviが起動した時のエラーがでるようになった。
.vimrcが既存のvimでは使えない状態だったのが原因だった。
既存のvimを使う指定から、MacVimを使うように変更してサクッと解決した。

```bash:.bash_profile
git config --global core.editor /Applications/MacVim.app/Contents/MacOS/Vim
```
月末にだけcronでbatchを叩きたい場合 && /dev/null や 2>&1 について

# 毎月の最終日23時55分にcronでbatchを動かす
 
```pl
55 23 28-31 * * /usr/bin/test $( date -d '+1 day' +\%d ) -eq 1 && perl /getsumatsu_batch.pl > /dev/null 2>&1
```

# 仕組み

```pl
# 時間指定（28日から31日の23時55分） ⇒ なので実際には月末以外にも動いてはいます
55 23 28-31 * *
```

## /usr/bin/test コマンド

```pl
/usr/bin/test {hoge}
```

hogeが真なら1を偽なら0を返します。

# 条件式 （現在の日に1日足した日（翌日）が1日なら1を返す、そうでないなら0になる）

```pl
/usr/bin/test $( date -d '+1 day' +\%d ) -eq 1 
```


## 条件式の中身

```pl
$( date -d '+1 day' +\%d ) -eq 1
```

現在の日に1日足した日（翌日）が1日であるかどうかを見ています。


## &&

```pl
A && B
```

↑の場合だと 「Aが真ならBを読み込む」といった感じ（うまく説明出来ない）

## 実行するコマンド、プログラム

```pl
perl /getsumatsu_batch.pl
````

## > /dev/null 2>&1

コマンドの実行結果をコンソールに出力させない場合の指定（と認識してます）

## > /dev/null
/dev/nullに対して出力したものはすべて破棄されます。
なので

```pl
% ls >/dev/null
```

↑は何にも出力されません。

## 2>&1

これは *プログラムがアクセスするファイルや標準入出力などをOSが識別するために用いる識別子（ァイル・ディスクリプタ）* らしいです。---- [IT用語辞典](http://e-words.jp/w/E38395E382A1E382A4E383ABE38387E382A3E382B9E382AFE383AAE38397E382BF.html)

| ファイルディスクリプタ | 意味 |
|:------------:|:------------|
| 0 | 標準入力と呼ばれ、シェルへの入力元を表す。通常はキーボード空の入力になっている |
| 1 | 標準出力と呼ばれ、シェルの結果の出力先を表す。通常は画面への出力となっている |
| 2 | 標準エラー出力と呼ばれ、シェルで実行時に発生したエラーメッセージの出力先を表す。通常は画面への出力となっている|

この上で **2>&1** が意味しているのは、コンソールに標準エラーの出力先を標準出力の出力先と同じにしている


-- [参考](http://blog.paz-para.com/?p=1613)
sbtでjarつくる（sbt 0.13 ) (2013/12/13時点)


基本はreadmeを読むだけ
https://github.com/sbt/sbt-assembly

```[プロジェクトトップ]/project/assembly.sbt
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.10.1")
```

```[プロジェクトトップ]/assembly.sbt
import AssemblyKeys._

assemblySettings

jarName in assembly := "jarname.jar" //任意のjarファイル名
```

あとはsbtコンソールで、reload → assemblyで、
[プロジェクトトップ]/target/scala-2.10/ 配下にjarができる。
LibreOffice BaseからCalcでピボットデータ分析

#BaseからCalcでデータ分析

##はじめに
ピボットテーブルをご存知でしょうか？
BaseからデータをCalcに抽出できるのはご存知でしょうか？
みんな意外と知らないものです。


-  Base
	- 外部データベースのデータを見る
-  Calc
	- Baseのデータをコピー、編集、ピボットテーブルで分析できる

データベースからデータを取得するためにプログラムを書いていたりする作業は必要ありません。
データベースのデータを分析をするためにはCalcがあればいいのです。

さあ、BaseとCalcでみんなでデータ分析の世界へ。

##Baseで外部データベースに接続
本来はここで、MySQL や PostgreSQL等のデータベースに接続させるといいのですが、
気軽に試せる等の関係上、Baseにデータを用意したものを用意しています。
簡単な説明だけを行います。

そうですね…。

MySQL , PostgreSQLは語り尽くされていると思いますので、
SQL Server 2008R2 ExpressにJDBCで繋ぐ方法を例にとって説明します。

1. [JDBCドライバの取得](http://www.microsoft.com/ja-jp/download/details.aspx?id=11774)
2. 解凍しプログラムフォルダに置く
3. LibreOfficeにJDBCドライバーの登録
	1.　LibreOfficeを起動
	2.   [ツール] > [オプション] > [詳細] 
	3.   Javaオプションの[クラスパス]を押す
	4.   [アーカイブを追加]を押す
	5.   SQL ServerのJDBCドライバ sqljdbc4.jarを追加する
	6.   [OK]で閉じる
3. Base起動しBaseファイルを作る
	1.  [データベースの選択]
		- [既存のデータベースに接続]を選び [JDBC]を選択
		- [次へ]
	2.  [JDBC接続のセットアップ]
		- [データソースのURL]   sqlserver://IPADDRESS:1433;databaseName=dbname
		- [JDBCドライバークラス] com.microsoft.sqlserver.jdbc.SQLServerDriver
		- [次へ]
	3.  [ユーザー認証のセットアップ]
		- [ユーザ名]を入れます。　通常は sa
		- [必須パスワード]にチェックを入れる。
		- [テスト接続]してみましょう
		- パスワードを入力して接続できればOKです。
	4. [保存して続行]
		- [完了]を押します。

勿論、WindowsであればODBC接続経由で接続が可能です。
しかし、LinuxやMacOSXな方にはJDBC接続は非常に有効です。
これらの環境下ではODBCドライバーは整備されていませんので。

##Baseファイルを登録
今回はデータの入ったBaseファイルを用意しました。

[こちら](http://sdrv.ms/1bBR8pS)から入手して下さい。



1.  calcを起動
2.  データソースを選択



あれ？

渡したBaseのデータが見えないですね。


LibreOfficeに登録する必要があります。

###データソースの登録
1.   LibreOfficeを起動
2.   ツール -> オプション 
3.   LibreOffice Baseをダブルクリック
4.   データベースを選択
5.   新規作成を押す
6.   ブラウズで取得したBaseファイルを選択
7.   登録名で分かり易い名前を付ける
	- ここでは 売上データ にします。
8.   OK を押す

これで登録完了です。
Calcのデータソースを見てみましょう。

###Calcからデータを確認
1.  Calcの起動
2.  表示 -> データソース

データソースの内容が見えましたね。
これのデータをピボットテーブルで分析していきます。

通常はデータベースのデータは膨大です。
売上が数十万レコードとかがザラです。
クエリを作成し、そのクエリのデータを見るようにするのが一般的です。
今回は時間の関係とサンプルデータの量が少なすぎるので省略します。

###BaseからCalcにデータを移す
(時間があれば説明する)
1.   表示 -> データソース
2.   データを移したいデータソースを選択
3.   データソースのクエリー又はテーブルをCalcへ *ドラッグ*

LibreOfficeのマニュアル通りにデータソースのコピー貼り付けをすると文字化けします。

##Calcでピボット分析

データを眺める。
売上っていくらあるんでしょう？
全体の売り上げを求める

###ピボットテーブルの作成方法
####データソースを選ぶ

1.  データ -> ピボットテーブル -> 作成
2.  ソースの選択
	- LibreOfficeに登録したデータソース　を選択
3.  データソースの選択
	-  データベース : 売上データ
	-  データソース : 売上
	-  OK を押す

####ピボットテーブルのウインドウ
1.  明細金額 をデータフィールドにドラッグ
2.  OKを押す

これで、全体の売り上げが分かりました。
一瞬ですね。

この中で売れ筋の商品区分は何でしょう？
商品区分ごとの売上合計を出す

###ピボットテーブルの編集
1.   ピボットテーブルを右クリック
2.   レイアウトの編集
3.   ピボットテーブルのウインドウ
	- 行フィールド　に　商品区分　をドラッグ
	- OKを押す

飲料が多いようですね。

一番売上を上げている営業マンは誰でしょう？
社員ごとの売上を出す

###ピボットテーブルの編集
1.   ピボットテーブルを右クリック
2.   レイアウトの編集
3.   ピボットテーブルのウインドウ
	- 行フィールド　の　商品区分　を何処かにドラッグして捨てる
	- 社員を行フィールドにドラッグ
	- OK

「森上 偉久馬」という方の売り上げが多いようです。

上得意様はどこでしょう？
得意先名毎の売り上げを出す

###ピボットテーブルの編集
1.   ピボットテーブルを右クリック
2.   レイアウトの編集
3.   ピボットテーブルのウインドウ
	- 行フィールド　の　社員　を何処かにドラッグして捨てる
	- 得意先を行フィールドにドラッグ
	- OK

コーヒーの数を数えてくれない？
商品毎の数量の合計を出し、コーヒーで絞り込む

###ピボットテーブルの編集
1.   ピボットテーブルを右クリック
2.   レイアウトの編集
3.   ピボットテーブルのウインドウ
	- 行フィールド　の　得意先　を何処かにドラッグして捨てる
	- 商品をページフィールドにドラッグ
	- データフィールドの明細金額を何処かにドラッグして捨てる
	- データフィールドに数量をドラッグ
	- OK
4.   商品で　コーヒーだけを選択する

325個もあったようです。
ピボットテーブルのイメージを見せる。

#結論

人間はデータだけ集めればいい。
表や集計はピボットテーブルに作らせればいい。
メールサーバーの電源を落とさないといけなくなったので再送処理について調べた。

メールサーバーが落ちている間も、メールを受けられるようにしておくようミッションを渡された。

* メールサーバーを別途立ててDNSをそっちに向ける！？

と考えましたが、落ちている時間は1時間〜3日間。
送信元メールサーバーが再送設定を変更していない場合、5日間リトライが繰り返されることを伝え事なきをえました。

調査結果
========
* 送信先メールサーバーにメールを配信できない場合、
  送信元メールサーバーのqueueにたまります。

[[Postfix] 再送設定 - abs(life)](http://d.hatena.ne.jp/kidpatrick/20090912/)さんのページが参考になりました。
再送間隔は5分〜リトライ間隔が徐々に伸びて最大1時間おきになる。
最大5日間メールは保持される。

postfixの設定確認
----------------

```bash:全設定出力
$ /usr/sbin/postconf -d
..
```

```bash:時間に関する内容だけに絞る
$ /usr/sbin/postconf -d | grep 0s$
..
```

```bash:再送間隔
$ /usr/sbin/postconf -d | grep queue_run_delay
queue_run_delay = 300s
```

```bash:再送間隔(最長)
$ /usr/sbin/postconf -d | grep maximal_backoff_time
maximal_backoff_time = 4000s
```

```bash:再送有効限度
$ /usr/sbin/postconf -d | grep _lifetime
bounce_queue_lifetime = 5d
maximal_queue_lifetime = 5d
```
[ruby] CentOS に gem が入っていなかったときのインストールメモ

```shell-session
#
# cat /etc/redhat-release
#
CentOS release 6.4 (Final)

#
# yum install ruby
# ruby -v
#
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]

#
# git clone https://github.com/rubygems/rubygems.git rubygems
#
Initialized empty Git repository in /root/Documents/rubygems/.git/
remote: Counting objects: 38455, done.
remote: Compressing objects: 100% (17834/17834), done.
remote: Total 38455 (delta 22413), reused 34895 (delta 18918)
Receiving objects: 100% (38455/38455), 12.63 MiB | 144 KiB/s, done.
Resolving deltas: 100% (22413/22413), done.

#
# cd rubygems
# ruby setup.rb
#
RubyGems 2.2.0 installed
ERROR:  While executing gem ... (Gem::DocumentError)
    RDoc is not installed: no such file to load -- rdoc/rdoc

#
# yum install rdoc
# rdoc -v
#
RDoc V1.0.1 - 20041108

#
# ruby setup.rb
#
RubyGems 2.2.0 installed
Installing ri documentation for rubygems-2.2.0
/usr/lib/ruby/1.8/rdoc/rdoc.rb:280: warning: conflicting chdir during another chdir block
/usr/lib/ruby/1.8/rdoc/rdoc.rb:287: warning: conflicting chdir during another chdir block



------------------------------------------------------------------------------

RubyGems installed the following executables:
        /usr/bin/gem

Ruby Interactive (ri) documentation was installed. ri is kind of like man
pages for ruby libraries. You may access it like this:
  ri Classname
  ri Classname.class_method
  ri Classname#instance_method
If you do not wish to install this documentation in the future, use the
--no-document flag, or set it as the default in your ~/.gemrc file. See
'gem help env' for details.


#
# gem -v
#
2.2.0

#
# gem install sass
#
Fetching: sass-3.2.12.gem (100%)
Successfully installed sass-3.2.12
Installing ri documentation for sass-3.2.12
/usr/lib/ruby/1.8/rdoc/rdoc.rb:280: warning: conflicting chdir during another chdir block
/usr/lib/ruby/1.8/rdoc/rdoc.rb:287: warning: conflicting chdir during another chdir block
Done installing documentation for sass after 42 seconds
1 gem installed

#
# sass -v
#
Sass 3.2.12 (Media Mark)

```

以上。


### 追記:2015-01-19
もっと簡単でした。

```shell-session
# yum install rubygems
```
複雑なMap、List型をStrutタグ、iteratorで表示するには？

普通そんなことしねえよ！( ‘д‘⊂彡☆))Д´) ﾊﾟｰﾝ
DTOでも使えよ！( ‘д‘⊂彡☆))Д´) ﾊﾟｰﾝ
って言われそうな感じですが、まれーに使わざるを得ない状況があるかもしれませんので
ここに記録として残しておきます。

■Action側がこんな感じだったら

``` java:TestAction.java

private Map<Integer , List<Map<String, Object>>> result = null;
@Override
public String execute() throws Exception {
	result = testService.findResultList();
	return "list";
}

```

■表示側はこう

```jsp:test.jsp

<!-- Map<Integer , List<Map<String, Object>>>だけど直にiteratorで回せるヨ -->
<s:iterator value="result"  status="map">

	<!-- ここはList<Map<String, Object>> -->
	<s:iterator value="value" status="list">

		<!-- ここでMap<String, Object>になる。直接keyを記述すればOK -->
		<s:if test="#list.first">
			<s:if test="id== 1">
				~~~
			</s:if>
		</s:if>
		<s:property value="id" />
		<s:property value="no" />
		<s:property value="message" />

	</s:iterator>
</s:iterator>

```

あんまり参考にならないかも…みんなvelocity使おう！
Railsの．ERBテンプレートとUnderscore.jsのテンプレート記号が衝突

問題の発生：

RailsのViewファイル（.html.erb）にunderscoreのテンプレートが入ってて、Renderすると、エラーが出られます：

> undefined local variable or method `each' for #<#<Class:0x007fd9c3a133b8>:0x007fd9c5066d90>

デフォルトunderscoreにも **<%** と **%>**を利用しているからです。

解決策：

```js
_.templateSettings = {
    interpolate : /\{\{=(.+?)\}\}/g,
    escape : /\{\{-(.+?)\}\}/g,
    evaluate: /\{\{(.+?)\}\}/g,
};
```

参考URL: [http://stackoverflow.com/questions/14247084/undefined-local-variables-in-templates](http://stackoverflow.com/questions/14247084/undefined-local-variables-in-templates)
m2eclipseで適当に作ったプロジェクトでの警告対応



```
static import 宣言は -source 1.3 でサポートされていません
(static import 宣言を使用可能にするには、-source 5 以降を使用してください)
```
```
注釈は -source 1.3 でサポートされていません
(注釈を使用可能にするには、-source 5 以降を使用してください)
```

上記警告が出た場合は、pom.xmlを弄ってJavaのバージョン指定を1.5以上にすればOK。


```pom.xml  
<build>
  <plugins>
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <encoding>UTF-8</encoding>
      </configuration>
    </plugin>
  </plugins>
</build>

```

# 参考
[java - Modify pom.xml to include JDK compiler version - Stack Overflow](http://stackoverflow.com/questions/16723533/modify-pom-xml-to-include-jdk-compiler-version)
「オフラインリアルタイムどう書く第7回の参考問題」を Haskell で

問題は　http://nabetani.sakura.ne.jp/hena/ord7xysort/

```xySort.hs
import Data.List
import Data.Ord
import Data.Char

listData :: [String]
listData = ["414213",
            "732050",
            "236067",
            "645751",
            "316624",
            "605551"]

xySort :: Ord a => String -> [[a]] -> [a]
xySort cs xxs = head $ foldl xySort' xxs cs
  where
    xySort' xxs c
      | isUpper c = transpose $ sortBy (comparing (!! n1)) $ transpose xxs
      | otherwise = sortBy (comparing (!! n2)) xxs
      where
        n1 = ord c - 65         -- ord 'A' == 65
        n2 = ord c - 117        -- ord 'u' == 117



-----------------------------------------------------------------------
-- test
-----------------------------------------------------------------------

test :: (String, String) -> Bool
test (cs1, cs2) = (xySort cs1 listData) == cs2

testData =
  [(0, test( "AvEx", "305027")),
   (1, test( "A", "112344")),
   (2, test( "C", "241413")),
   (3, test( "F", "134214")),
   (4, test( "u", "236067")),
   (5, test( "w", "732050")),
   (6, test( "y", "414213")),
   (7, test( "yx", "732050")),
   (8, test( "ux", "236067")),
   (9, test( "EF", "131424")),
   (10, test( "DF", "134124")),
   (11, test( "Au", "055165")),
   (12, test( "uA", "023667")),
   (13, test( "By", "234114")),
   (14, test( "yB", "114342")),
   (15, test( "yBy", "357020")),
   (16, test( "yByB", "350072")),
   (17, test( "AuBvCw", "131244")),
   (18, test( "FAuFBvFCw", "300527")),
   (19, test( "AuBv", "112344")),
   (20, test( "CwDx", "515056")),
   (21, test( "FzyE", "324114")),
   (22, test( "uAwDyB", "114324")),
   (23, test( "zExCvF", "073520")),
   (24, test( "uFxEv", "002357")),
   (25, test( "DyCwB", "076362"))]
```

```
> testData
[(0,True),(1,True),(2,True),(3,True),(4,True),(5,True),(6,True),(7,True),(8,True),(9,True),(10,True),(11,True),(12,True),(13,True),(14,True),(15,True),(16,True),(17,True),(18,True),(19,True),(20,True),(21,True),(22,True),(23,True),(24,True),(25,True)]
```

Haskell  は文字列を文字のリストとして扱えることと、transpose や sortBy が使えたので、かなり少ない行数で記述できました。
　
　
自分でコードを書いた後でよく調べてみたら、kei_q さんの解答とほとんど同じでした…。でもとりあえず投稿してみました。