OmniAICreator/Qiita-1.07M huggingface dataset:
WRF3.4.1のコンパイル

#概要
気象の研究とかに使われるメソスケール気候予測数値モデル、WRFのコンパイルで困った時のお話。
WRF3.4.1/Ubuntu13.10/gcc-fortran4.8.1で起こりました。

#エラーの内容
どうやらCプリプロセッサで*.Fのファイルを*.f90にするときとかに
C形式のコメントが残ってしまって、コンパイル時に文法エラーになる模様。
configure.wrfでCPPの-Cオプションを削除しても、WRF内部のMakefileで-Cオプションを利用しているようで同じようなエラーが出る。

```shell-session:error
gfortran -w -ffree-form -ffree-line-length-none -fconvert=big-endian -frecord-marker=4  -c  -I/usr/local/netcdf-4.3.2/gcc44/include -I../ioapi_share diffwrf.f
diffwrf.f:1.1:

/* Copyright (C) 1991-2012 Free Software Foundation, Inc.
 1
Error: Invalid character in name at (1)
diffwrf.f:2.3:

   This file is part of the GNU C Library.
   1
Error: Unclassifiable statement at (1)
diffwrf.f:4.3:

   The GNU C Library is free software; you can redistribute it and/or
   1
Error: Unclassifiable statement at (1)
diffwrf.f:4.39:
```

#対処法
gfortranでのコンパイル時に-cppオプションを付ける。
./configureのあとに、configure.wrfの119行目、120行目を以下のように編集。

FORMAT_FIXED    =       -ffixed-form -cpp
FORMAT_FREE     =       -ffree-form -ffree-line-length-none -cpp

###2014/9/30追記
-Cオプションの削除ではなく、-nosdtincの追加でうまくいくようです（FizFoxさんありがとうございます）。

#参考
http://forum.wrfforum.com/viewtopic.php?f=5&t=6086
空メール送信でプログラム起動をpostfixで実現する


世の中にクソほどあふれていそうなTipsだが、教える必要に迫られたのでシンプルにまとめた。

## postfixのインストール

```
$ sudo yum install postfix
$ sudo vi /etc/postfix/main.cf
```

## postfixの設定

```/etc/postfix/main.cf
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# 下記はセキュリティ系の設定
smtpd_banner = $myhostname ESMTP unknown
disable_vrfy_command = yes
smtpd_helo_required = yes
```

## sendmailからpostfixに切り替え

```
$ sudo service sendmail stop
$ sudo chkconfig sendmail off
$ sudo service postfix stop
$ sudo chkconfig postfix on
```

```
$ sudo alternatives --config mta

2 プログラムがあり 'mta' を提供します。

  選択       コマンド
-----------------------------------------------
 + 1           /usr/sbin/sendmail.sendmail
*  2           /usr/sbin/sendmail.postfix

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します: 「2」を入力
```

## 空メール受信のアカウント作成

blank@example.com で受信する。

```
$ sudo useradd -s /sbin/nologin -M blank
$ sudo vi /etc/aliases
```

## トリガーの設定

```/etc/aliases
blank:"|/usr/bin/php /tmp/hoge.php"
```

```
$ sudo postalias /etc/aliases
```
自分用シェル設定(zshに変えてリポジトリ管理方針をGoっぽく)


Macのユーザアカウントを開発用と普段使いように分けたので、シェル周りの使い勝手を改善しました。
ghqというツールを使うことでリポジトリをGoっぽく管理しようって方針です

##基本設定

zshのインストールと切り替え

```bash:
$ brew install zsh //brewを使ってインストール
$ sudo sh -c "echo '/usr/local/bin/zsh' >> /etc/shells" #環境に追加
$ chsh -s /usr/local/bin/zsh #シェル切り替え
```

oh-my-zshを使う

```bash:
curl -L http://install.ohmyz.sh | sh
```

ここでターミナルを再起動
再起動後、.zshrcを編集

```bash:~/.zshrc

# Set name of the theme to load.
# Look in ~/.oh-my-zsh/themes/
# Optionally, if you set this to "random", it'll load a random theme each
# time that oh-my-zsh is loaded.
#ZSH_THEME="robbyrussell"
ZSH_THEME="ys"    ##ysに変更　ここは好みで

```

ツール構築用にGoインストール(Goを使いたいのでGoのパッケージ管理からツールをインストール)

```bash:
$ brew install go # goのインストール
$ mkdir ~/go
```

.zshをGo用に追記

```bash:~/.zshrc
export GOPATH="$HOME/go"
export PATH="$GOPATH/bin:$PATH"
```

反映

```bash
source ~/.zshrc
```

ツールをインストール(peco ghq gh-open)
ghq用にrepoディレクトリを作成

```bash
$ go get github.com/peco/peco
$ go get github.com/motemen/ghq
$ go get github.com/typester/gh-open
$ mkdir ~/repo #repo配下にghqの取得情報を保管
```

ghqの設定のため.gitconfigを作成or修正

```yaml:~/.gitconfig
[ghq]
	root = ~/repo
	root = ~/go/src
```

ghqのための便利ailiasとかhistoryの設定を追加。.zshrcに以下を追記

```zsh:~/.zshrc
function r2t() {
    local fn
    while read fn
    do
        echo ${fn/$HOME/"~"}
    done
}

alias g='LINE=$(ghq list -p | r2t  | peco); cd ${LINE/"~"/$HOME}'
alias gh='LINE=$(ghq list -p | r2t | peco); gh-open ${LINE/"~"/$HOME}'

function peco-select-history() {
    local tac
    if which tac > /dev/null; then
        tac="tac"
    else
        tac="tail -r"
    fi
    BUFFER=$(\history -n 1 | \
        eval $tac | \
        peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle clear-screen
}
zle -N peco-select-history
bindkey '^r' peco-select-history

```

```g``` でリポジトリ切り替え
```gh``` でgithubやbitbucketの該当プロジェクトへ飛びます

参考：http://webtech-walker.com/archive/2014/06/peco-ghq-gh-open.html


##xcode用に設定を追加

以下を追記

```zsh:~/.zshrc

setopt nonomatch

function xcopen() {
    local xcp
    local xws
    xcp=$(\ls -d *.xcodeproj 2>/dev/null )
    xws=$(\ls -d *.xcworkspace 2>/dev/null )
    if [[ $xws != '' ]] ; then
        echo "try open $xws" ;
        open $@ $xws;
    else
        if [[ $xcp != '' ]] ; then
            echo "try open $xcp" ;
            open $@ $xcp;
        else
            echo "this is not xcode project...\n"
        fi
    fi
}

alias xco='xcopen -a /Applications/Xcode.app'
```


```xcopen``` でxcode(BetaがあればBeta版で)を起動します
```xco``` でxcode.appで起動します





##その他

以下を~/.vimrc　に追加

```sh:~/.vimrc
set clipboard+=autoselect
set clipboard+=unnamed
```

何故かvimでクリップボードが使えなくなったのでヤンクしたらクリップボードにコピーするように設定
クリップボードから貼り付けたい場合はコマンドモードで```"*p``` と入力
[YConnect]リフレッシュトークンの更新について

YConnectのリフレッシュトークン更新について質問です。
http://developer.yahoo.co.jp/yconnect/server_app/explicit/

Authorizationエンドポイントで認証
↓
Tokenエンドポイントからアクセストークンとリフレッシュトークンを取得

上記で取得されるリフレッシュトークンについて、
以前に取得したリフレッシュトークンと同じものが返ってきます。
この際、リフレッシュトークンの有効期限は更新されるのでしょうか？

リフレッシュトークンの有効期限内は、
Authorizationエンドポイントで何度認証しても
リフレッシュトークンの有効期限は更新されないのでしょうか？

以上、恐れ入りますがご確認をお願い致します。
Macを買ってからRailsを開発するまでにやること


## ムダに多い前提
* プロジェクトがすでにあってgithub等に上がっている
* bundleでgemをプロジェクトローカルで管理している
* bin以下にコマンドが置かれていること
* .ruby-version ファイルで使うRubyのバージョンが管理されている
* DB関係のインストールは終わっている

## 手順
1. xcodeインストール
  1. AppStoreからxcodeインストール

1. xcode CommandLineTool インストール
  1. xcode起動
  1. xcodeのメニューバーの xcode > Open Developer Tool > More Developer Tools...
  1. sign in して、該当のversionのものをインストール

1. iTerm インストール
  * iTerm2 - Mac OS Terminal Replacement http://www.iterm2.com/#/section/home

1. Homebrew インストール
  * ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

1. rbenv インストール
http://qiita.com/hikaruna/items/eb1e667c5c55e0b4b265

1. rbenv に任意のバージョンのruby インストール
  プロジェクトで使うバージョンのRubyを入れます.
  * rbenvとruby-buildでRuby環境を最新に保つ https://gist.github.com/mochiz/4736183

  readlineのバグが治ったバージョンがHomebrewに上がるまでは以下のようにする(2014-07-07現在はダメ)
  * Ruby - mac rbenv でirb日本語が化ける問題こんなかんじで解決しました - Qiita 

1. git clone hoge_project
  これ以降の作業は　cd hoge_project 内でやる

1. gem bundler インストール
  * gem install bundler

1. 依存パッケージの取得
  * bin/bundle install --path=vendor/bundle

1. データベースファイルの設定
  * cp config/database.yml.sample config/database.yml

1. データベースの作成・更新
  * bin/rake db:create db:migrate db:seed

1. develop環境で起動
  1. bin/unicorn_rails
  1. http://localhost:8080


##注意点
とくにrbenvのあたりが難しいのでwhichコマンドなどで「現在のrubyやgemは期待通りのものを読み込んでいるか」等チェックしながらやること
phpStormで僕が使っているプラグイン一覧

デザイナーとプチフロントエンド開発をやってる人です。ABC順。

---

### .ignore (旧 .gitignore support)

様々なツールの.ignore系ファイルを豊富なテンプレートから作成することができる。

![ignore1.png](https://qiita-image-store.s3.amazonaws.com/0/48238/6342884d-567f-edd4-dbfc-bdb2fd72bad1.png)
様々なツール

![ignore2.png](https://qiita-image-store.s3.amazonaws.com/0/48238/46f43b6c-acf0-ffe2-3968-dbc1cff6c36f.png)
豊富なテンプレート

### AngularJS

AngularJSのディレクティブや{{}}が補完できるようになる。たまたま一緒なので、Jekyllの{{}}補完にも使える。phpStorm8からは公式にサポートされる予定?

### Bash Support

.sh拡張子のファイルがコードハイライトされ、IDEから直接実行できるようになる。

### Code Outline2/CodeGlance

SublimeTextみたいな縮小プレビューが表示できるようになる。CodeGlanceはエディタに統合。Code Outline2はパレットとして表示

![outline1.png](https://qiita-image-store.s3.amazonaws.com/0/48238/d7bc9669-9ce9-7523-20a6-b96cced92095.png)
Code Outliner2

![outline2.png](https://qiita-image-store.s3.amazonaws.com/0/48238/7ab432a5-6d70-e385-5338-85596a59e5df.png)
CodeGlance

### CSS-X-Fire

Firefoxと連携してCSSのデバッグができる。grunt-browser-syncの方が便利なので最近使ってない

### Dash

OSXの便利なドキュメントビューア「Dash」と連携できる

### Dummy Text Generator

いわゆる「Lorem Ipsum」がツールバーボタンからサっと入力できる

### Git Flow Integration

Git-flowがGUIから使えるようになる。GitとGit-flowが同じディレクトリに存在しないと動かない問題がある。Homebrewなどでは注意

![gitflow.png](https://qiita-image-store.s3.amazonaws.com/0/48238/537090c0-fe12-785e-c489-254b7a397e28.png)
Git Flow Integration

### IdeaTweet

IDEからツイートができる

### IntelliJ Configurations Server Plugin

IntelliJの設定をJetbrains Accouunt Centerを経由してクラウドで同期できるようになる。プラグインは同期されないので、やや中途半端
http://account.jetbrains.com

### Markdown

Markdown形式のハイライトとプレビューができるようになる。

### Native Neighbourhood

選択中のファイルを即座にMacのFinderやTerminalで参照できるツールバーボタンが追加される。

![nativen.png](https://qiita-image-store.s3.amazonaws.com/0/48238/099ff686-9dc0-88fe-17fd-e193e3705da6.png)
Native Neighborhood

### NodeJS

node_modulesを見つけると、外部ラリブラリとして参照できるようにしてくれる。パッケージのバージョンが最新かどうかもチェックできる

### QuickJump
今この瞬間画面内にあるコードから、検索ワードにマッチする場所へテキストビームを移動できる。同様のプラグインとして他にAceJumpがある

### RegexpTester

正規表現のプレビューがパレットから行える

### Relative Line Numbers

行番号の隣に、今選択中の行からの相対的な行番号(...-1, 0, 1...)が表示されるようになる

### Require.js plugin

Require.jsがサポートされる

### Scratch

プロジェクトとは関係のない場所に適当なファイルを作成し、プロジェクトをまたいですぐに呼び出すことができる。とにかく作業場所用にエディタを開きたいときに便利。
個人的に最もおすすめできるプラグイン!

### Shifter

行の昇順・降順ソートができるようになる

### SvgViewer2

SVGのプレビューができるパレットが追加される

### Unicode Browser

ユニコードの実体参照をブラウズできたりする

### XmlSearchAndReplace2

HTMLのタグ部分を検索置換できたりする。正規表現書くのが面倒なときに便利
DNSサーバで広告を非表示

広告を非表示にしたいドメイン一覧を列挙。IPを適当なものに変更。

家の中だけでも有害な広告から守りたいので
以下にブロック一覧を列挙していく。

```bash:自分が発見したもの
bypass.jp
handycomic.jp
dmm.co.jp
nend.net
aid-ad.jp
```

[不快な広告をブロック！バナー広告を非表示にする方法まとめ - NAVER まとめ](http://matome.naver.jp/odai/2135559238591498601)より。

```bash:
xml.affiliate.rakuten.co.jp
img.ads.mreco0.jp
ai.yimg.jp
img.ads.pixiv.org
adf.send.microad.jp
dy911ym93q0c4.cloudfront.net
creative.ak.fbcdn.net
pagead2.googlesyndication.com
amch.questionmarket.com
h.accesstrade.net
```

* ads.nicovideo.jp を登録するとニコニコ動画が見れなくなる(jsが動かない)ので除外。
CoffeeScriptのfor-inループで、一時変数が一時変数じゃない件


##問題
問題のコード

```coffeescript
a = [ {}, {} ]
b = [ "a", "b" ]

for s,i in b
  a[i].gets = ->(s)

console.log a[0].gets()
console.log a[1].gets()
```

展開される奴

```javascript
// Generated by CoffeeScript 1.7.1
var a, b, i, s, _i, _len;

a = [{}, {}];

b = ["a", "b"];

for (i = _i = 0, _len = b.length; _i < _len; i = ++_i) {
  s = b[i];
  a[i].gets = function() {
    return s;
  };
}

console.log(a[0].gets());

console.log(a[1].gets());
```

期待する出力

```
a
b
```

現実

```
b
b
```


##原因
javascriptは変数のスコープを区切る方法がfunctionしかないらしい。そしてcoffeescriptは変数をスコープの一番最初で宣言する。たとえfor-inの一時変数だとしても。ひどいよ。

#解決
forの中で一時関数を作って実行すればうまくいくって言ってた。

```coffeescript
a = [ {}, {} ]
b = [ "a", "b" ]

for s,i in b
  do (s,i) ->
    a[i].gets = ->(s)


console.log a[0].gets()
console.log a[1].gets()

```

##感想
なんでforeach死体だけなのに、変な行とインデント挟まにゃならんのだ。coffeescriptはjavascriptをrubyライクに書けるみたいなノリなら（そうなのかどうかは知らないです)、デフォをこっちにして欲しいところです。

##ちなみに
JQueryのeachが、「index, value」なのが気に入りません。thisで参照するのは可読性の意味で論外として、eachをするときは基本indexではなくvalueに用事があるのに、いちいちindexを書く手間と変数名を考える手間がひどい。あとArrayにeachが無いのも辛い。

このへんは、最新のブラウザではArray#forEachがあるらしいので、古いブラウザを切り捨てるか互換ライブラリを入れるかそれを使いたいところです。遅いらしいですけど。でもそんなのしたくないからCoffee使ってるのに。

##追記
javascriptのクラス拡張がどれくらい怖いか経験少ないのでわからないけど、こうすれば見た目綺麗になれる。

```coffeescript
Array.prototype.each = (callback)->
  for v,i in this
    callback(v,i)
```


##参考
* The Little Book on CoffeeScript - Idioms http://minghai.github.io/library/coffeescript/04_idioms.html
* CoffeeScriptで即時関数 - 四角革命前夜 http://d.hatena.ne.jp/sasaplus1/20110521/1305912309
* Loops don't behave like closures · Issue #3469 · jashkenas/coffeescript https://github.com/jashkenas/coffeescript/issues/3469
* Twitter / selvaggio: @hikaruna まさにこのケースっぽい。　http:// ... https://twitter.com/selvaggio/status/486031011600281600
IntelliJ IDEAでGitのRevision Graphを見る

# 1行まとめ
* `Changes`の`Log`タブをクリックすればGitのRevision Graphが見れる

# 本文
Gitの操作を、コマンドライン上から行う他にIntelliJ IDEAからも行うことが多かった私ですが、Gitのログを見る際にずっと不満だったことがあります。今までずっと、メニューの`VCS → Git → Show History`のコミットログしか覗いていなかったのですが、これがまた必要な情報が全然ないログ表示だったのです。どのブランチにコミットされたログで、どのファイルにどのような変更が入ったのかを見ることが出来ないわけです。

![git-show-log.png](https://qiita-image-store.s3.amazonaws.com/0/19943/4793d4bc-1eaa-4230-6296-c4503c45cb96.png "git-show-log.png")

普段Subversionも使う私としては、Subversionのコミットログを見る際にも、`VCS → Subversion → Show History`の順番で見ていたので、同様のステップでGitのログを見ていたわけですが、その結果得られるものは…残念なものでした。


ですがそこはIntelliJ IDEA。実際のところ、IntelliJ IDEAは他のブランチの状況も踏まえたRevision Graphを見る方法もちゃんと提供していました。

`Changes`の`Log`タブをクリックすれば、下記のようにGitのRevision Graphを見ることができるようになります。合わせて、どのコミットでどのファイルにどのような変更が行われているかも分かるようになったので、非常に便利です。

![intellij-git-graph.png](https://qiita-image-store.s3.amazonaws.com/0/19943/cc4f1a37-9aac-d6b7-1250-a9bfe0753af7.png "intellij-git-graph.png")

IntelliJ IDEAでGitのログを見る際には、他のVCS同様に`VCS → Git → Show History`からコミットログを見るのではなく、`Changes`から`Log`タブをクリックして見るようにしましょう。
Git Subtreeを設定して・プッシュ・プルができるようにする

公式のGitサブツリーの解説通りにやっても上手くいかなかったため、調べまわった。とりあえず以下の方法でできた。

0. サブツリーとして取り込みたいリポジトリ側へ、適当な名前で共通でリモートリポジトリを追加: <pre>git remote add hoge_remote (url)</pre>
0. fetchしてから次のコマンドを叩くと、--prefixで指定した場所にサブツリーが作成される: <pre>git subtree add --prefix=path/ --squash hoge_remote (branch)</pre>
0. pushする: <pre>git subtree push --prefix=path/ hoge_remote (branch)</pre>
0. pullする: <pre>git pull -s subtree lib_remote (branch)</pre>

参考サイト:
http://stackoverflow.com/questions/5904256/git-subtree-merge-into-a-deeply-nested-subdirectory
Ubuntu で Eclipse と Android 開発環境構築


## Eclipse インストール及び日本語化 (Pleiades)

```bash
sudo apt-get install eclipse
```

[http://mergedoc.sourceforge.jp/](http://mergedoc.sourceforge.jp/) で Pleiades プラグインの最新版 or 安定版をダウンロードする。 ダウンロードしたファイルのディレクトリに移動し以下を行う:

```bash
unzip pleiades.zip
sudo mv features/* /usr/lib/eclipse/features/
sudo mv plugins/* /usr/lib/eclipse/plugins/
sudo vi /etc/eclipse.ini
```

```bash
# Pleiades プラグインへの参照を追加
-javaagent:/usr/lib/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

ちなみに以下をコメントアウトまたは削除すると起動時のスプラッシュが格好良くなる:

```
-showsplash
org.eclipse.platform
```

## ADT プラグイン導入から Android SDK 導入

Android SDK は以前は個別にダウンロードするしかなかったが、 最近は ADT プラグインをインストールするとダウンロードも自動でやってくれるようになった。 なのでまず Eclipse 用の Android 開発用プラグインを導入する。 Eclipse の「ヘルプ -> 新規ソフトウェアインストール」で、 作業対象に `https://dl-ssl.google.com/android/eclipse/` を入力。すると「開発ツール」が表示されるので全てインストール。 Eclipse が再起動すると、「SDK の構成」ダイアログが開き、新規 SDK をインストールするか、 既存 SDK を使用するか聞いてくる。 新規 SDK を選んで SDK をダウンロードする。

## Android SDK の platform-tools と tools にパスを通す

Eclipse 上からのみ ADB を扱わない場合は別に行わなくても良いのだが、何かと便利であるのでパスを通しておく。 他の Linux だと `.bash_profile` だが Ubuntu の場合は `.profile` に書く。 なので、 `.profile` の最終行に以下を追加。 (SDK のインストールディレクトリは各自の環境に読み替える)

```bash
vi ~/.profile
```

```bash
export PATH=$PATH:$HOME/Documents/android-sdks/platform-tools:$HOME/Documents/android-sdks/tools
```

```
. ~/.profile  #.profileを反映させる
```

## SDK の必要な Platform をダウンロードする

Eclipse 上からだと「ウィンドウ → Android SDK マネージャー」だが、 Eclipse 上からやると他に何もできなくなってしまうので、 コマンドラインから実行した方がいい。

```bash
android &
```

で Android SDK マネージャが起動するので、 必要なものをダウンロードする。 「Android SDK Tools」「Android SDK Platform-tools」を最新にする。 「Android Support」もダウンロードしておこう。 後は開発対象の API Level の「SDK Platform」、 Google Maps API (MapActivity 等) を使用するなら「Google APIs」、 後サンプル等も眺めると参考になるのでダウンロード。 時間帯にも依るがかなり時間がかかるので、 その間に他のセットアップ作業を継続する。

## 実機を USB デバッグで Ubuntu に認識させる

Windows だと新しい端末を繋ぐ度にドライバを入れたりしてかなり面倒臭いが、 Ubuntu だと以下の作業で全て対応できるので楽。 まず Android の実機側の「設定 -> アプリケーション -> 開発」で「USB デバッグ」が ON になっている事を確認する。 ついでに「提供元不明のアプリ」も ON にしておこう。 そうすると、 認識されていれば Eclipse の DDMS パースペクティブの「Devices」ビューに実機の名前とバージョン番号が表示されるはずだ。 「??????????」などと表示された場合は認識されていない。 その場合、 以下の作業を行う。 Ubuntu の端末から以下を行う:

```bash
lsusb
```

すると、 接続されている USB 機器の一覧が表示される。 例えば ISW11K の場合は以下のように表示される:

```bash
Bus 002 Device 009: ID 0482:0553 Kyocera Corp.
```

この場合の「0482」がベンダ ID 、 「0553」がプロダクト ID なのでこれをメモしておき、 以下を行う:

```bash
sudo vi /etc/udev/rules.d/51-android.rules
```
 
```bash
SUBSYSTEM=="usb", ATTRS{idVendor}=="0482", ATTRS{idProduct}=="0553", MODE="0666"
```

完了したら、 一旦端末から USB 端子を引っこ抜き、 Eclipse を再起動し、 USB 端子を接続。 で、 認識されるはず。 ダメなら `adb kill-server; adb start-server` して ADB を再起動する。
Androidアプリケーションを配布しているマーケット（随時更新）

##ダウンロードしたアプリケーションの話
1.悪意あるAndroidアプリケーションが潜んでいるジャンル別ランキングは、1位は「カスタマイズ」、2位は「エンタテイメント」、3位は「教育/ブック」、4位は「メディア＆動画」、5位は「スポーツ」と報告されています。（引用元:[Gigazine](http://gigazine.net/news/20140225-android-malicious-app/)）

2.セキュリティを強化したGooglePlayでさえ未だ悪意あるアプリケーション、スパムアプリケーションがありますのでご注意を。([FakeAVの記事](http://appllio.com/20140416-5118-scam-anti-virus-app-on-google-play-store))

3.一定数、端末でもエミュレータでも動かないアプリケーションが存在します。理由は不明。

##公式マーケット・企業マーケット
1.[GooglePlay(日本)](https://play.google.com/store?hl=ja)
GooglePlayからAPKファイルをダウンロードするには、今のところ[APK Downloader](http://apps.evozi.com/apk-downloader/)を使う。ダウンローダは[Playdrone](https://github.com/nviennot/playdrone)が有力？またGooglePlayは地域アプリケーションが存在するので、取得する方法を考えてる。

2.[ドコモマーケット](http://smt.docomo.ne.jp/?dcm-gate)
NTTドコモが運営しているマーケット。ドコモが予め審査したアプリケーションしか掲載されない。

3.auマーケット
auスマートフォン専用マーケット。NTTドコモと同じく、予め審査したアプリケーションしか掲載されない。

##野良マーケット
###国内
1.[FC2Apps](http://apps.fc2.com/)

2.[AppBrain](http://ja.appbrain.com/)

3.[Amebaアプリマーケット](http://appmkt.ameba.jp/)

###北欧系
1.[APKTOP](http://www.papktop.com/)　
古いものほどリンク切れしてる。掲載アプリケーション数約2万以上
・リパッケージアプリ多そう。
・共産圏と通信してるアプリ多そう。
・4.0系以上のOSでは動かないアプリ多そう。
・管理者権限要求アプリ多そう。
・掲載2万以上のアプリケーションを調べた結果、広告に関する通信が多いこと、中にはDrive by Downloadを誘導するものが含まれてた。そのアプリケーションはGooglePlayにもあったことから、リパッケージアプリケーションである可能性がある。追調査必須。

2.[Opera Mobile Store](http://apps.opera.com/ja_jp/)　
Operaが運営しているマーケット。掲載アプリケーション数約10万件（毎日更新中）

3.[GetJar](http://www.getjar.mobi/)
有料アプリを無料で配布している。

4.[Softonic](http://en.softonic.com/android)

5.[Amazon Appstore for Android](http://www.amazon.com/mobile-apps/b/ref=topnav_storetab_mas?ie=UTF8&node=2350149011)

6.[soc.io](http://mall.soc.io/apps)

7.[Slideme](http://slideme.org/)

8.[pandaapp](http://download.pandaapp.com)


###中華系
1.[mm.10086.cm](http://ng.d.cn/)　
中華版パズドラを配布している。主にゲームアプリケーションを配布しているようだ。

2.[http://www.diguayouxi.com/](http://www.diguayouxi.com/)
3.[http://www.camangimarket.com/index_jp.html](http://www.camangimarket.com/index_jp.html)
4.[http://mm.10086.cn/index.html](mm.10086.cn/index.html)
5.[http://www.189store.com/](http://www.189store.com/)
6.[http://www.appchina.com/](http://www.appchina.com/)

7.[1Mobile](http://m.1mobile.com/)
※1つインストールすると勝手に1Mobileマーケットがインストールされるため、個々にインストールできない。([このマーケットの違法性をまとめた記事](http://maruyuki.net/54))

###ロシア系
1.[androidpit.ru](http://www.androidpit.ru/ru/android-market)
2.[top-android.org](http://top-android.org/)
3.[androidze.org](http://androidze.org/list/android-market)
4.[playstoremarket](http://playstoremarket.com/)
5.applanet(リンク切れ)
keyword：『Андроид Маркет』でググると出てくる。

[その他まとめ（傾向調査中）](http://matome.naver.jp/odai/2133924828361174601)

##ウイルス配布サイト
1.[contagio mobile](http://contagiominidump.blogspot.jp/)　
zipに掛けられているパスワードを知るには、ブログ主に連絡する。最新のものも配布されているので、TOR通した環境で通信ログみたり、コードリーディングするときに便利。
HomebrewでPlay開発環境構築 


以前は簡単にインストールできてたけど
現在のバージョン(Play 2.3)では地味に困惑する部分があったのでメモ程度に。

まず初めに↓をやってみた。

```
$ brew install play
Error: No available formula for play
Play 2.3 replaces the play command with activator:
  brew install typesafe-activator

You can read more about this change at:
  http://www.playframework.com/documentation/2.3.x/Migration23
  http://www.playframework.com/documentation/2.3.x/Highlights23
```
お、怒られたでござる...
どうやら2.3ではtypesafe-activatorというものにリプレースされているらしい。

なので↓で再チャレンジ。

```
$ brew install typesafe-activator
```
思ったより時間がかかったのでお茶でも飲んで待ちましょう。
5分以上かかった気がする。

インストール完了したら試しにプロジェクトを作成してみる。
`$ activator new PROJ_NAME`といった感じでプロジェクトを作成。

プロジェクトのテンプレートのタイプを聞かれるので使いたいテンプレートを選択。
ここではplay-scalaを選択します。

```
$ activator new TestProj
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8

Fetching the latest list of templates...

Browse the list of templates: http://typesafe.com/activator/templates
Choose from these featured templates or enter a template name:
  1) minimal-java
  2) minimal-scala
  3) play-java
  4) play-scala
(hit tab to see a list of all templates)
>4
OK, application "TestProj" is being created using the "play-scala" template.

To run "TestProj" from the command line, "cd TestProj" then:
/Users/masahiro/Dev/Web/Play/TestProj/activator run

To run the test for "TestProj" from the command line, "cd TestProj" then:
/Users/masahiro/Dev/Web/Play/TestProj/activator test

To run the Activator UI for "TestProj" from the command line, "cd TestProj" then:
/Users/masahiro/Dev/Web/Play/TestProj/activator ui
```

プロジェクトが自動生成されるのでとりあえず初期状態でサーバを起動してみます。

```
$ cd ./TestProj
$ activator run
```

`http://localhost:9000`にアクセスしてみてPlayの初期画面が出たらOKです。
rubyで定量的な値の範囲によってステータスを変更する

# 概要
何かツールやサービスを作っている時とかに、値の範囲によってステータスを変更するということをしたいことがある。たとえばポイントが0-3はシルバーで4-5はゴールド、6以上だとプラチナの会員みたいな感じだ。そういった時に、きちんと後々にそのステータスが増えた場合にも対応しやすい書き方。

# やり方

```rb
@default_status = "gray"
@status = {@default_status => 0..2, "yellow" => 3..4, "red" => 5..Float::INFINITY}

def status_update ()
    @status.each{|key, value|
        unless value.last == Float::INFINITY then
            @db.execute("update blacklist set status = '#{key}' where count >= #{value.first} and count <= #{value.last};")
        else
            @db.execute("update blacklist set status = '#{key}' where count >= #{value.first};")
        end
    }
end

status_update()
```

これで良い感じにstatusを定義通りにupdateできる。（ちなみに例ではsqliteを使っている。）
Mac OS Xで一発でディスプレイだけをスリープにするショートカットキー

アップルメニューからスリープにすると本当にスリープになってしまうのでネットワークも切れるし、何かと面倒です。

そんな時はこれ
```Control + Shift + Eject(あるいはPower)```

席を立つ時に便利なので欠かせませんが、知らない人がいたので共有します。

あわせて読みたい
[OS X のキーボードショートカット](http://support.apple.com/kb/ht1343?viewlocale=ja_JP)
PHP版SQL::MakerでJSON SQL Injectionの対応版を出しました


不正なJSONデータによるSQL Injectionへの対策について (Json.pm+SQLクエリビルダー)
http://developers.mobage.jp/blog/2014/7/3/jsonsql-injection


本家SQL::Makerで、SQL Injectionになる可能性があることが発表されました。

徳丸さん(@ockeghem)にご報告をいただき、
以前に習作で作ったPHP版SQL_Makerでも同様の可能性があることがわかったため対応しました。

(ノーマル版) https://github.com/memememomo/php-SQL-Maker
(Composer対応版) https://github.com/memememomo/composer-sql-maker

対応方法は本家と同じで`strict`モードを実装しました。
`strict`モードをオンにすると、
値としてハッシュや配列を渡せなくなります。

```php:sample.php
$builder = new SQL_Maker(array('driver' => 'mysql', 'strict' => 1));

$builder->select('user', array('*'), array('name' => array('foo', 'bar')));
// => Exception! Will not generate SELECT * FROM `name` IN (?, ?) any more
```

`strict`モードをオンにして、条件を設定する場合は、
SQL_QueryMaker のオブジェクト経由で行います。
SQL_Makerをnewすると、SQL::QueryMakerの`sql_`というプレフィックスの関数がインポートされます。

```php:sample.php
$builder = new SQL_Maker(array('driver' => 'mysql', 'strict' => 1));

$builder->select('user', array('*'), array('name' => sql_in(array('foo', 'bar'))));
// => SELECT * FROM `user` WHERE `name` IN (?, ?)
```

関数一覧は以下のページにあります。
https://github.com/memememomo/php-sql-querymaker

ノーマル版は今まで5.2などでも動いていたのですが、
今回の改修でクロージャを使い始めたので、
PHP5.3以上が必須となりました。

今回修正したバージョンを 0.02 としていて、
以前までのバージョンは 0.01 として残しています。
https://github.com/memememomo/php-SQL-Maker/tree/0.01

バリデーションなどで対応済みであれば、
0.01 を使うことも可能です。

# ノーマル版とComposer版について

今後の対応として、

- セキュリティやバグについては、両バージョンで更新
- 新機能などについてはComposerバージョンで行う

という方針でいます。

# PHPでの問題

JSON SQL Injection、PHPならJSONなしでもできるよ
http://blog.tokumaru.org/2014/07/json-sql-injectionphpjson.html

上記の記事でも解説されているように、
PHPではJSON以外にもInjectionが起こる可能性あります。

PHPには、HTTPパラメータの名前を「hoge[TEST]」のようにすると、
ハッシュのデータに変換する機能があります。

これを利用すると、
以下のように JSON SQL Injection と同じ問題が起こります。

```php:sample4.php
<?php
//「http://domain/sample4.php?id[TEST]=1」というURLでアクセス

// 数値が入る想定だが、
// この場合は array('TEST' => 1) になる。
$id = $_GET['id'];

$builder = new SQL_Maker(array(
    'driver' => 'mysql'
));

$table = 'user';
$column = array('id', 'name');
$where = array('id' => $id);

list($sql, $binds) = $builder->select($table, $column, $where);
// => SELECT `id`, `name` FROM `user` WHERE (`id` TEST ?)
```

ということなので、
なにかしらのクエリビルダを使っている場合は、
さらに注意が必要となります。
vagrantでサイズの異なるdigital_oceanのホストを複数生成する

# vagrantでdigital_oceanを使ってサイズの異なる複数のホストを生成する例

以下のとおり

```ruby:Vagrantfile
Vagrant.configure('2') do |config|

  config.vm.provider :digital_ocean do |provider, override|
    override.ssh.private_key_path = '~/.ssh/id_rsa'
    override.vm.box               = 'digital_ocean'
    override.vm.box_url           = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"
    provider.private_networking   = true
    provider.client_id            = 'abc'
    provider.api_key              = 'xyz'
    provider.image                = 'CentOS 6.5 x64'
    provider.region               = 'Singapore 1'
    provider.ca_path              = '/path/to/ca'
    provider.ssh_key_name         = 'keyname'
  end

  hosts=[]
  (1..3).each {|x| hosts.push({"name"=>"cass#{x}", "size"=>"4GB"}) }
  (1..1).each {|x| hosts.push({"name"=>"spv#{x}" , "size"=>"2GB"}) }
  (1..2).each {|x| hosts.push({"name"=>"node#{x}", "size"=>"2GB"}) }

  hosts.each do |host|
    config.vm.define host["name"] do |server|
      config.vm.hostname          = host["name"]
      config.vm.provider :digital_ocean do |provider|
        provider.size = host["size"]
      end
    end
  end

end
```
Ubuntu で Subversion


## インストール

Apache は既にインストールされているものとする。以下 `apt-get` する:

```bash
sudo apt-get install subversion libapache2-svn apache2-utils
```

Ubuntu 14.04LTS は `htdigest` が最初から入ってないので `apache2-utils` が必要。

## HTTP 経由でアクセスできるようにする

```bash
vi /etc/apache2/mods-enabled/dav_svn.conf 
```

```xml
<Location />
     DAV svn
     SVNParentPath /var/lib/svn
     AuthType Digest
     AuthName "realm" 
     AuthUserFile /etc/apache2/.htdigest
     Require valid-user
</Location>
```

上記の設定例だと、 `(apacheのルートのパス)/svn/(SVNリポジトリ名）` でアクセスすると、 `/var/lib/svn/(SVNリポジトリ名)` のリポジトリにアクセスできることになる。 例えば Apache ルートが `http://localhost/` だった場合、 `http://localhost/svn/Test` にアクセスすると、 `/var/lib/svn/Test` というリポジトリがあった場合に見れることになる。

実際には `dav_svn.conf` のコメントを外せばすぐに利用できる。 上記だと Digest 認証で通過しなければ SVN のリポジトリにアクセスできない。 で、 この後 Digest 認証で使用するパスワードのファイルを作らなければならない。 それは以下のコマンドで良い:

```bash
# Digest 認証用のパスワードを作成する
sudo htdigest -c /etc/apache2/.htdigest 'realm' (ユーザ名)
```
打つとパスワードを聞かれるので、 正しく設定する。 パスワードファイル名が dav_svn.conf で指定したものと一致するかどうか確認しよう。 **上記 realm (認証領域: 自由な文字列で良い) も一致させないと認証が通らない。** しかもエラーも分かりにくいので注意。

ユーザを追加したい場合はその分 `sudo htdigest` すればよい。 `-c` オプションを付けると新規ファイルを作成してしまう (古いユーザが消えてしまう) ので注意する。

さて、これで Web 経由でアクセスする準備が整ったので、以下のように Digest 認証を有効にして Apache を再起動する。

```bash
sudo a2enmod auth_digest
sudo /etc/init.d/apache2 restart
```

## 動作確認

次にいよいよ SVN のリポジトリ用のフォルダを作り、リポジトリを作る。 例えば Test というプロジェクトを作りたい場合、Test というリポジトリを作ればいいので以下のようにする:

```bash
sudo mkdir /var/lib/svn
cd /var/lib/svn
sudo svnadmin create Test
sudo chown -R www-data.www-data /var/lib/svn  # www-data は Ubuntu の Apache ユーザ
```

`ls` コマンドを実行して、 Test フォルダが作成されて中にいろいろできている事を確認する。


そして最後に `http://localhost/Test` にアクセスして確認する。 ユーザ名とパスワードを聞かれ、 正しく答えたら「Revision:0」とバージョン番号 0 の空のリポジトリが表示されることを確認する。 うまくいかないようであれば `/var/log/apache2/access.log` や `error.log` を参照して原因を探る。

## サブドメインにしたい場合

例えば `http://svn.hoge.com/(リポジトリ名)` でアクセスするといい、みたいな感じだ。VirtualHost にする。

```bash
sudo vi /etc/apache2/sites-available/svn.conf
```

``` xml
<VirtualHost *:80>
    ServerName svn.hoge.com

    <!-- Apache のログを分ける -->
    CustomLog ${APACHE_LOG_DIR}/access_svn.log combined
    ErrorLog ${APACHE_LOG_DIR}/error_svn.log
    <Location />
        DAV svn 
        SVNParentPath /var/lib/svn
        AuthType Digest
        AuthName "realm"
        AuthUserFile /etc/apache2/.htdigest
        Require valid-user
    </Location>
</VirtualHost>
```

```bash
sudo a2ensite svn.conf  # svn.hoge.com の設定を有効にする
```

## バックアップとリストア

以下のコマンドを定期的に cron か何かで実行しておけば安心。

```bash
# バックアップ
sudo svnadmin dump {プロジェクト名} > {ダンプファイル名}
 
# リストア
sudo svnadmin create {プロジェクト名}
sudo svnadmin load {プロジェクト名} < {ダンプファイル}
sudo chown -R www-data.www-data {プロジェクト名}
```
cybozu2ical

会社ではcybozuの結構古いバージョン、office6をつかっていてこいつは標準ではical出力とかgoogleカレンダー連携とかできない。

そこでcybozu2icalを導入したのでメモ。(windows7 64bit)

1. cyboz2icalをsvnチェックアウト http://ogawa.googlecode.com/svn/trunk/cybozu2ical
2. Activeperlをインストール、インストール後PATHを確認して再起動 http://www.activestate.com/activeperl/downloads
3. CPANで必要なモジュール( https://github.com/ogawa/cybozu2ical-perl に書いてあるモジュール)をインストール。Text::CSV 1.0+、DateTime、LWP、Class::Accessor::Fast、Data::ICal、YAML
4. config.yaml.sampleをconfig.yamlを自分の環境に合わせて書き直す。usernameではなくuseridを使用した。
5. コマンドプロンプトで、perl cybouzu2ical test.ics を実行。
 * Cannot decode string with wide characters というエラーを吐くので、ググるとutf8の処理がおかしいらしく、cybozu2icalを修正
  * summary     => decode_utf8( $item->summary ),
  * 　↓
  * summary     => Encode::is_utf8($item->summary) ? $item->summary : decode_utf8($item->summary),
  * のような形に。
6. できあがったicsをdropboxに配置して、googleカレンダーにURLから登録してみると、「robot.txtの制約でクロール無理」と言われる。
7. クロールできるwebスペースにFTP転送するようにbatファイルを書いてみる。改行コードがあやしいので、\r\nを\nに置換も行う。
 * http://ameblo.jp/tominagamichiya/entry-10345196007.html を参考にした。
 * batファイルの中身は以下。

```perl cybozu2ical > cybozu2icalcybozu.ics
type cybozu2icalcybozu.ics | perl -pe "s/\r//" > cybozu2icalcybozu2.ics
ftp -s:upload.cmd```

 * upload.cmdの中身は以下。

```open FTPサーバホスト名
FTPアカウント
FTPパスワード
cd アップロード対象ディレクトリ
put cybozu2icalcybozu2.ics
bye```

8. アップロードしたicsをgoogleカレンダーで指定すると、文字化けするので.htaccessを編集。「addtype "text/calendar; charset=utf-8" .ics」を追加。
 * http://se-suganuma.blogspot.jp/2008/09/google-ical.html このやり方では「有効なicalではない」と言われてうまくいかなかった。
9. batファイルをタスクスケジューラに登録して１日１回実行。
td-agentのcapistranoレシピ


レシピです。

※setupタスクは、随時変更してください。

```
set_default(:conf_file) { "/etc/td-agent/td-agent.conf" }

namespace :td_agent do
  desc "start td-agent"
  task :start,  roles: :web do
    run "#{sudo} /etc/init.d/td-agent start"
  end

  desc "stop td-agent"
  task :stop,  roles: :web do
    run "#{sudo} /etc/init.d/td-agent stop"
  end

  desc "restart td-agent"
  task :restart,  roles: :web do
    run "#{sudo} /etc/init.d/td-agent restart"
  end

  desc "reload the config file"
  task :reload, roles: :web do
    run "#{sudo} /etc/init.d/td-agent reload"
  end

  desc "install td-agent by yum"
  task :install, roles: :web do
    run "#{sudo} yum -y install td-agent"
    run "#{sudo} /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-forest"
    run "#{sudo} /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-tail-ex"
  end

  desc "setup config files and log files"
  task :setup, roles: :web do
    run "#{sudo} mkdir -p /var/log/fluent"
    run "#{sudo} chgrp td-agent /var/log/fluent"
    run "#{sudo} chown td-agent /var/log/fluent"
    run "#{sudo} chmod +x /etc/td-agent"
    run "#{sudo} chmod o+w #{conf_file}"
    template("td_agent.erb", conf_file)
  end

  namespace :log do
    task :tail, roles: :web do
      run "#{sudo} tail -f /var/log/td-agent/td-agent.log"
    end
  end
end

after "deploy:install", "td_agent:install"
after "deploy:install", "td_agent:setup"
after "deploy:cleanup", "td_agent:restart"
```
iPhoneで撮影した動画がWindowsで向きが変わる原因

備忘録

iPhoneで撮影した動画を
iPhoneやMacでは、正しい向きで再生する動画が、
**Windowsで再生すると、向きが変わっている事**があります。

**撮影時のiPhoneの向き**が原因です。
Windowsで確認する可能性がある動画を撮影するときは、
**ホームボタンが右側**の状態で撮影するようにしましょう。
こうすると、カメラが上に来るので、納得出来るのですが、
ボリュームボタンでも撮影出来るのが、紛らわしい一因な気がします。

既に撮影してしまった動画は、
QuickTime Playerで開くか（Windowsでも向き補正してくれます）、
編集アプリで向きを修正し、書き出し直す必要があります。
幅優先探索

　ここ最近、チーター本が詰まってからAOJに訪れて再帰の練習問題を探したりしていたのですが、幅優先探索の問題を見つけたので試しにコーディングしてみました。ですが、無限ループに入ってしまい（何回目だ・・・）うまくいきません。よろしければ、どこがおかしいかご指摘頂ければ嬉しいです。
問題：AOJ0202(http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0202)

コード：

```java:

import java.util.*;
public class Main {
	int limit;
	int[] dish;
	int ans = Integer.MIN_VALUE;
	
	boolean isPrime(int num) {
		if(num < 2) return(false);
		for(int r = 2; r * r <= num; r++) {
			if(num % r == 0) return(false);
		}
		return(true);
	}
	
	int solve() {
		Queue<Integer> sum = new LinkedList<Integer>();
		
		sum.add(0);
		
		int ans = 0;
		while(!sum.isEmpty()) {
			int now = sum.poll();
			for(int r = 0; r < dish.length; r++) {
				int next = now + dish[r];
				if(next < limit) {
					if(isPrime(next)) ans = Math.max(ans, next);
					sum.add(next);
				}
				System.out.println(ans);
			}
		}
		return(ans);
	}
	
	void doIt() {
		Scanner stdIn =new Scanner(System.in);
		
		while(true) {
			int kind = stdIn.nextInt();
			limit = stdIn.nextInt();
			if(kind + limit == 0) break;
			dish = new int[kind];
			for(int r = 0; r < kind; r++) {
				dish[r] = stdIn.nextInt();
			}
			System.out.println(solve());
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}

}

```

　この再帰とか、幅優先とかのアルゴリズムが、自分の中でしっかりしてくれないと次に進めない・・・（泣）
TextViewのellipsizeを設定して落ちた時の対応

# 概要
TextViewのEllipsizeを設定して「...」を表示させる設定をした場合、GALAXY J(Android4.3.0)でArrayIndexOutOfBoundsExceptionで落ちる現象が発生した。

# 詳細
以下のようなXML定義したところ問題が発生した。

```
<TextView
   android:id="xxx"
   android:ellipsize="end"
   android:scrollHorizontally="true"
   android:singleLine="true"/>
```

文字列は動的に設定して、「...」が発生する文字列の場合に発生しました。
GALAXY S2(Android4.0.4)では発生しないため、特定のバージョンでのバグの可能性があります。

# 解決法
```
<TextView
    android:id="xxx"
    android:scrollHorizontally="true"
    android:lines="1"
    android:singleLine="true"/>
```

android:singleLineをandroid:lines="1"とandroid:singleLine="true"で回避出来る模様。
では、2行以上で「...」を実現したい場合はどうすればいいか？は今のところわかってません。
Google先生が早くバグフィックスしてくれることを祈りましょう。
ちなみに私は仕様を変更して逃げました。

# 参考
## Crash when using ellipsize="start" (Jelly Bean)
https://code.google.com/p/android/issues/detail?id=33868
icingaのWebUIでコマンド実行エラー時の対処

# icingaの場合

```bash:icingaWebUIからコマンド実行エラー
Error: Could not open command file '/var/icinga/rw/icinga.cmd' for update!
```

## 現状把握

```bash:apacheの実行ユーザが`icingacmd`グループに属していること
$ id apache
uid=48(apache) gid=48(apache) 所属グループ=48(apache),493(icingacmd)
```

```bash:
$ ls -lh /var/icinga/rw/icinga.cmd
prw-rw---- 1 icinga 501 0  1月 27 07:59 /var/icinga/rw/icinga.cmd
```

* /var/icinga/rw/icinga.cmdの所有者が`icinga:icingacmd`であること。

## 設定修正

```bash:
$ sudo chown :icingacmd /var/icinga/rw/icinga.cmd
```

## 確認

```bash:確認
$ ls -l /var/icinga/rw/icinga.cmd
prw-rw---- 1 icinga icingacmd 0  1月 27 07:59 /var/icinga/rw/icinga.cmd
```

----

# nagios3の場合

* [Nagios: Fixing "error: Could not stat() command file" (on Debian)](http://technosophos.com/2010/01/13/nagios-fixing-error-could-not-stat-command-file-debian.html)

```bash:
chmod g+x /var/lib/nagios3/rw/
```

![rw.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3657db94-f51e-8139-271c-5e05f279b130.png)
[Scala]Tupleでまさかのプチハマり

# はじめに

Tuple3を受け取るListBufferを宣言してTuple3インスタンスを追加するという、このなんでもないコード、まさかのコンパイルエラーになった。

```scala
val l = ListBuffer.empty[(Int, Int, Int)]
l += (1, 2, 3)
```

コンパイルエラー結果は以下。

```
Main.scala:3: error: type mismatch;
 found   : Int(1)
 required: (Int, Int, Int)
  l += (1, 2, 3)
        ^
Main.scala:3: error: type mismatch;
 found   : Int(2)
 required: (Int, Int, Int)
  l += (1, 2, 3)
           ^
Main.scala:3: error: type mismatch;
 found   : Int(3)
 required: (Int, Int, Int)
  l += (1, 2, 3)
```

# 原因
これはauto-tuplingと呼ばれるタプルにおける特殊な振る舞いが原因で起きている。

```scala
def foo[A,B](tpl: Tuple2[A,B]) = ???
```

こういうTuple2を受け取る関数を定義すると、

```scala
foo(1, "one")
```

このように書ける。これがauto-tupling。

ListBufferの[Scaladoc](http://www.scala-lang.org/api/current/index.html#scala.collection.mutable.ListBuffer)を読むと、+=は２つのオーバーロードメソッドを持つことが分かる。

```
def +=(x: A): ListBuffer.this.type
```

と

```
def +=(elem1: A, elem2: A, elems: A*): ListBuffer.this.type
```

だ。

このコンパイルエラーは２番目の可変長引数を取る方として実行されてしまっている。
つまり、冒頭のコードはこのように解釈されているため、型エラーとなる。

```scala
l.+=(1,2,3)
```

# 解決案
曖昧さを除去して明示的に書いてやればよい。

## 解決案１
メソッド引数としてのカッコとTupleを表すカッコの２つ書くことで中身がTupleであることを明らかにする。

```scala
val l = ListBuffer.empty[(Int, Int, Int)]
l += ((1, 2, 3))
```

## 解決案２
Tuple3って明示的に宣言する。

```scala
val l = ListBuffer.empty[(Int, Int, Int)]
l += Tuple3(1, 2, 3)
```

## 解決案３
一度変数に取ることで曖昧さを無くす。

```scala
val l = ListBuffer.empty[(Int, Int, Int)]
val t = (1, 2, 3)
l += t
```
LINQでLEFT OUTER JOINする

例えばこんなデータ型と

```csharp
public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? DeptId { get; set; }
    public DateTime HireDate { get; set; }
}
```


こんなデータ型があったとして、

```csharp
public class Department
{
    public int Id { get; set; }
    public string Name { get; set; }
}
```


こんなSQLをLINQでやりたいなんてとき

```sql
SELECT
    E.Id As 'EmpId,'
    E.Name As 'EmpName',
    D.Name AS 'DeptName',
    E.HireDate
FROM
    Employee E
LEFT OUTER JOIN
    Department D
    ON D.Id = E.DeptId
```


こんな風に書くとできます。

```csharp
var emps = new List<Employee>();
var depts = new List<Department>();

var infos = emps.GroupJoin(depts, emp => emp.DeptId, dept => dept.Id, (emp, tmpDept) => new {emp, tmpDept})
                .SelectMany(x => x.tmpDept.DefaultIfEmpty(), (x, dept) => new
                {
                    EmpId = x.emp.Id,
                    EmpName = x.emp.Name,
                    DeptName = (dept != null) ? dept.Name : "Non-Dept",
                    HireDate = x.emp.HireDate
                });
```

--追記

こんなとか

```csharp
var emps = new List<Employee>();
var depts = new List<Department>();

var infos = emps.Select(x =>
{
    var dept = depts.FirstOrDefault(y => y.Id == x.DeptId);
    return new
    {
        EmpId = x.Id,
        EmpName = x.Name,
        DeptName = (dept != null) ? dept.Name : "Non-Dept",
        HireDate = x.HireDate
    };
});
```

こんな方法もありますね。

```csharp
var emps = new List<Employee>();
var depts = new List<Department>().ToDictionary(x => x.Id);

var infos = emps.Select(x => new
{
    EmpId = x.Id,
    EmpName = x.Name,
    DeptName = x.DeptId.HasValue && depts.ContainsKey(x.DeptId.Value) ? depts[x.DeptId.Value].Name : "Non-Dept",
    HireDate = x.HireDate
});
```
Docker入門: 3日目

只只コンテナ編集後、イメージ化してませんでしたという落ちなので、
[こちら](http://shibayu36.hatenablog.com/entry/2013/12/07/233510)をご覧になると良いかと思います。

個人的な備忘録として。

# コンテナにssh接続

## コンテナを作成

```
$ docker run -it intern/base /bin/bash
root@8687f7b2a78a:/# 
```

## ユーザ追加

```
root@8687f7b2a78a:/# useradd -m -G sudo docker
root@8687f7b2a78a:/# passwd docker
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

root@8687f7b2a78a:/# 
```

## sshd_configの設定

ごにょごにょ。

## イメージ化

```
$ docker ps -a
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS                      PORTS               NAMES
8687f7b2a78a        intern/base:latest   /bin/bash           2 days ago          Exited (0) 29 seconds ago                       cocky_archimedes    

$ docker commit 868 intern/sshd
c50b5f4e9a010e2b7fd119af181c71a28471f85104a5a4f155ec4c40f04804b9

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
intern/sshd         latest              c50b5f4e9a01        2 days ago          409.3 MB
intern/base         latest              18d571447ec6        2 days ago          408.9 MB

$
```

## コンテナを作り、ssh接続する

```
$ docker run -d -p 22 --name sshd_test intern/sshd /usr/sbin/sshd -D
be90b1655e0b277a65d6f96d2741364d6f6789a9ba8302dd1abf2045b124cb75

$ boot2docker ip
The VM's Host only interface IP address is: 192.168.x.x

$ docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS                   NAMES
be90b1655e0b        intern/sshd:latest   /usr/sbin/sshd -D   2 days ago          Up 51 seconds       0.0.0.0:49153->22/tcp   sshd_test

$ ssh -p 49153 docker@192.168.x.x
docker@192.168.x.x's password: 
Linux viper 3.12.22-gentoo #1 SMP Tue Jun 17 20:39:22 MDT 2014 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

$ 
```

## 続く

* [Docker入門: 4日目](http://qiita.com/akaneyuki/items/078d78d4eea2f8af7774)

# 参考文献
* [Dockerで立てたコンテナにsshで接続する - $shibayu36->blog;](http://shibayu36.hatenablog.com/entry/2013/12/07/233510)
* [Working with Containers - Docker Documentation](https://docs.docker.com/userguide/usingdocker/)
* [Dockerizing an SSH service - Docker Documentation](https://docs.docker.com/examples/running_ssh_service/)
VolleyでのJSESSIONIDとAWSELB取得方法

# 概要
StickySessionを設定したAWSサーバとAndroidアプリとの通信時にAndroidアプリ側からJavaWebサーバのCookie「JSESSIONID」とAWSのELBのCookie「AWSELB」の内容を同時に取得する方法
# 詳細
## サーバ側
サーバ側については以下のところを参照
[Java/ServletとJSESSIONIDのURL管理](http://www.glamenv-septzen.net/view/1093)
[スティッキーセッションの作成](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/US_StickySessions.html)
## Androidアプリ側
###Volley
Androidアプリで非同期通信を簡単に実現することの出来るネットワーク通信ライブラリ。
[ネットワーク通信用ライブラリVolleyを使いこなす](http://techbooster.org/android/hacks/16474/)
###取得方法
```lang:VolleyHttpRequest.java
public class VolleyHttpRequest
{
    private RequestQueue mQueue;

    public void request(Context context)
    {
        // Cookieの設定
        DefaultHttpClient client = new DefaultHttpClient();
        BasicClientCookie cookie = new BasicClientCookie(cookieName, cookieValue);
        cookie.setDomain("domain");
        cookie.setPath("/");
        cookie.setSecure(true);
        client.getCookieStore().addCookie(cookie);
        HttpStack httpStack = new HttpClientStack(client);

        // キューの作成
        mQueue = Volley.newRequestQueue(context, httpStack);
        
        // リクエストクラスの用意
        VolleyRequest volleyRequest = new VolleyRequest(Method.POST,
                                                        "リクエストURL",
                                                        "通信エラー時のリスナクラス",
                                                        client);

        // キューにリクエストを追加
        mQueue.add(volleyRequest);
    }
}
```
```lang:VolleyRequest.java
public abstract class VolleyRequest extends Request<JSONObject>
{
    private DefaultHttpClient mClient;

    public VolleyRequest(int method,
                         String url,
			 ErrorListener errorListener,
			 DefaultHttpClient client)
    {
        super(method, url, errorListener);
        mClient = client;
    }

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response)
    {
        for(Cookie cookie : mClient.getCookieStore().getCookies())
    	{
            if(cookie.getName().equals("JSESSIONID"))
            {
                // "JSESSIONID"取得
            }
            if(cookie.getName().equals("AWSELB"))
            {
                // "AWSELB"取得
            }
        }
    }
}
```

# あとがき

本来（？）ならparseNetworkResponseで渡ってくるNetworkResponse.headersの中にCookie情報が入っているはずなのですが実際のところはJSESSIONIDしか取れませんでした。もしかしたらAWSの設定が悪いのかも。。。なんとも言えませんが。。。
とりあえず、上記の方法で両方のCookieを取得することが出来ます。
peco-rebuildfm

mattn/rebuildfm
https://github.com/mattn/rebuildfm

```
$ go get github.com/mattn/rebuildfm
$ rebuildfm "$(rebuildfm | peco | awk 'BEGIN { FS=":" } NF=1 { print $1 }')"
```

<del>Aftershow にはまだ対応出来ていない。</del>

```
peco-rebuildfm() {
  rebuildfm "$(rebuildfm | peco | awk 'BEGIN { FS=":" } NF=1 { print $1 }')"
}
```
MacでApache+PHPを有効にする

弊社新人氏に[Head Rush Ajax](http://amazon.jp/dp/4873113105/mazgi-22/ref=nosim/)をやってもらうための環境構築メモ。
今時のMacに標準インストールされているApacheとPHPを起動する方法。

----

## Macに標準インストールされてるApacheを設定する

### Apache全体の設定を編集する

設定ファイルの編集にroot権限が必要なので `sudo` 使って編集してください。

```shell-session
$ sudo vi /etc/apache2/httpd.conf
```

下記3つの行が存在することを確認してください。
コメントアウトされている場合はコメントインしてください。

```apache
LoadModule php5_module libexec/apache2/libphp5.so
Include /private/etc/apache2/extra/httpd-userdir.conf
Include /private/etc/apache2/other/*.conf
```

### 自分専用のユーザディレクトリを設定する

`/etc/apache2/users/` の中に `${YOUR_NAME}.conf` という設定ファイルを作って編集してください。
ぼくだったらこんな感じです。

```shell-session
$ sudo vi /etc/apache2/users/mazgi.conf
```

内容はこんな感じです。
`<Directory "/Users/mazgi/Sites/">` 部分は読み替えてください。

```apache
<Directory "/Users/mazgi/Sites/">
   Options Indexes MultiViews FollowSymLinks
   AllowOverride None
   Order allow,deny
   Allow from all
</Directory>
```

## ユーザディレクトリの作成とPHPの動作確認

### ユーザディレクトリの作成

先ほど設定したApacheのユーザディレクトリを作成します。
`mkdir` コマンドでホームディレクトリ直下に `Sites` というディレクトリを作ってください。

```shell-session
$ mkdir -p ~/Sites
```

### サンプルPHPスクリプトの作成

サンプルとしてPHP自体の情報を表示するPHPスクリプトを作ります。
`Sites` ディレクトリの中に `phpinfo.php` というファイルを作って編集してください。

```shell-session
$ vi ~/Sites/phpinfo.php
```

内容は下記の1行だけです。

```php
<?php phpinfo(); ?>
```

### Apacheの起動と動作確認

下記のコマンドを実行してApacheを起動してください。

```shell-session
$ sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist
```

[http://localhost/~YOUR_NAME/phpinfo.php](http://localhost/~ YOUR_NAME/phpinfo.php)にアクセスすると下記のようなページが表示されますか？

![Screen Shot 2014-07-07 at 11.29.57 AM.png](https://qiita-image-store.s3.amazonaws.com/0/9676/b213c75f-2d52-2482-3ac3-0c8aac44bbe1.png)

表示されたら成功です。
おつかれさまでした！

## 最後に

phpinfoの結果をインターネット上に公開することは当面控えてください。
(スクリーンショットを貼っておいてこういうことを書くのもアレですが)

開発用のシンプルかつ安全ではない設定なので上記設定をしたMacを外出先で使用する場合はApacheを止めておくことをおすすめします。
停止方法は次の通りです。

```shell-session
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
```
iPadのKeyboard Notificationの動作のまとめ


## キーボードの動作によってNotificationはどう変わるか

以下がどのタイミングで呼ばれるか検証した。

* UIKeyboardWillShowNotification
* UIKeyboardWillHideNotification
* UIKeyboardWillChangeFrameNotification

### Dock(通常)のKeyboardを起動するとき
* UIKeyboardWillChangeFrameNotification
* UIKeyboardWillShowNotification

### Split / UnDockのKeyboardを起動するとき
* UIKeyboardWillChangeFrameNotification

### Dock(通常)のKeyboardをSplit / UnDockするとき
* UIKeyboardWillChangeFrameNotification
* UIKeyboardWillHideNotification

### SplitのKeyboardをDock&Mergeするとき
* UIKeyboardWillChangeFrameNotification
* UIKeyboardWillChangeFrameNotification
* UIKeyboardWillShowNotification

### SplitのKeyboardをMergeするとき
* UIKeyboardWillChangeFrameNotification

### UnDockのKeyboardをSplitするとき
* UIKeyboardWillChangeFrameNotification

### UnDockのKeyboardをDockするとき
* UIKeyboardWillChangeFrameNotification
* UIKeyboardWillShowNotification

### Dock(通常)のKeyboardを閉じるとき
* UIKeyboardWillChangeFrameNotification
* UIKeyboardWillShowNotification

### Split / UnDockのKeyboardを閉じるとき
* UIKeyboardWillChangeFrameNotification

### Split Keyboardを動かす
* UIKeyboardWillChangeFrameNotification

### Split Keyboardを動かしている途中でframeの最下部まで到達する
* UIKeyboardWillChangeFrameNotification(動かす)
* UIKeyboardWillChangeFrameNotification(splitからDockに切り替わり)
* UIKeyboardWillShowNotification

### キーボードを開いた状態で回転させる
* UIKeyboardWillChangeFrameNotification

## 分割キーボードが開いたことの認識
```
- (CGRect)wtd_convertedKeyboardFrameBeginInView:(UIView *)view
{
    return [view convertRect:[[[self userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:nil];;
}

- (CGRect)wtd_convertedKeyboardFrameEndInView:(UIView *)view
{
    return [view convertRect:[[[self userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
}

- (BOOL)wtd_splitOrUnDockKeyboardIsShowingInView:(UIView *)view
{
    CGRect keyboardFrameBegin = [self wtd_convertedKeyboardFrameBeginInView:(UIView *)view];
    CGRect keyboardFrameEnd = [self wtd_convertedKeyboardFrameEndInView:(UIView *)view];

    return keyboardFrameEnd.size.height != 0 && keyboardFrameBegin.origin.y == [[self class] visibleHeight] && keyboardFrameEnd.origin.y + keyboardFrameEnd.size.height < [[self class] visibleHeight];
}

- (BOOL)wtd_splitOrUnDockKeyboardIsHidingInView:(UIView *)view
{
    CGRect keyboardFrameBegin = [self wtd_convertedKeyboardFrameBeginInView:(UIView *)view];
    CGRect keyboardFrameEnd = [self wtd_convertedKeyboardFrameEndInView:(UIView *)view];

    return keyboardFrameEnd.size.height != 0 && keyboardFrameEnd.origin.y == [[self class] visibleHeight] && keyboardFrameBegin.origin.y + keyboardFrameBegin.size.height < [[self class] visibleHeight];
}

#pragma mark - Private

+ (CGFloat)visibleHeight
{
    return IS_LANDSCAPE() ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height;
}

```

### DockからUnDock / Splitされることの認識
* いい方法が分からなかった。。

### 参考
* http://stackoverflow.com/questions/10749311/ipad-split-keyboard
peco でキーシーケンス

# お知らせ

[peco](https://github.com/peco/peco) にキーシーケンスの登録が可能になりました。

```json
{
	"Keymap": {
        "C-x,C-c": "peco.Cancel",
        "M-n": "peco.SelectNext",
        "M-p": "peco.SelectPrevious",
        "M-C-v": "peco.ToggleSelection"
	}
}
```

例えばこういう設定を config.json に登録しておくと Emacs 風に `<C-x> <C-c>` で終了出来る様になります。

# 能書き

キーシーケンスには一般的に2通りあり

* タイプ中の物が生きているけど、全てマッチしたらあるアクションを起こす(例: http://www.php.net で「I hate PHP」とタイプしてエンター)
* マッチしている最中のキーシーケンスは無効となり全てマッチしたらアクションを起こす(例: vim の keymap)

このどちらかになります。前者はトリックを入れる場合に使われる事が多いです。peco では下の方を採用しています。

# おまけ1

最新の peco をインストールして以下をタイプしてみましょう。

```
<C-x> ↑↑↓↓←→←→ba
```

# おまけ2

[vim-jp](http://vim-jp.org) を開いて「I hate Vim」とタイプしてエンターを押してみましょう。
Masonry系のプラグイン SALVATTOREを手動で初期化する方法


http://salvattore.com/

特に初期化メソッドの呼び出しなどをすることなく、CSS をちょっと書いて script を読み込むだけで整列してくれるのでとても便利です。

## なにがしたいか

ajaxとかpjaxとかでページをまるごと入れ替えたとき、そのページ内の一部にSALVATTOREを効かせたい（タイル上に並べたい）。

ページにはすでに script は読み込み済だが、初期化メソッドがないのできれいに並べられない。


## 公式サイトを見る

```append_elements ``` と ```prepend_elements ``` というものがパブリックメソッドとして提供されているようです。

これはすでにページ内にSALVATTOREによって整列されたグリッドがあって、そこに対して要素を追加するためのものメソッドなので用途が違います。

## ソースを見る

https://github.com/rnmp/salvattore/blob/master/dist/salvattore.js

```js
return {
  append_elements: self.append_elements,
  prepend_elements: self.prepend_elements,
  register_grid: self.register_grid
};
```

最後のほうにパブリックなメソッドとして公式サイトには書かれてなかった ```register_grid ``` というメソッドが。なんかグリッドを登録できそうなメソッド名。



```html
<ul id="grid">
	<li>ならべたいもの</li>
	<li>ならべたいもの</li>
	<li>ならべたいもの</li>
	<li>ならべたいもの</li>
	<li>ならべたいもの</li>
</ul>
```

こういうhtmlであれば

```js
var grid = document.getElementById('grid');
salvattore['register_grid'](grid);
```

こういうjs書いたらできた。