OmniAICreator/Qiita-1.07M huggingface dataset:
Lotusを使った日本で初めてのアプリケーション(Part3)

[Lotusを使った日本で初めてのアプリケーション(Part1)](http://qiita.com/yamadagenki/items/5e90a6781496b6995ecc)
[Lotusを使った日本で初めてのアプリケーション(Part2)](http://qiita.com/yamadagenki/items/4f7908545daae50f7d08)
の続き

#Part3（Modelの設定）
今回は、ブログのデータベースを例にModelの設定方法について説明していく。
おそらく、このあたりが一番手がかりが少なくやりにくい部分。
僕は少なくとも相当手こずった。。。
（環境は前回と同じ[Vagrant](https://github.com/yamadagenki/ubuntu_server)環境を使う）
より詳細なことは[Lotus::Model](https://github.com/lotus/model/blob/master/README.md)を参照。

今回は、下記のようなモデルを想定している。
![lotus_blog model](https://qiita-image-store.s3.amazonaws.com/0/69406/6cad7bf8-0ade-6d5b-4bfe-c7f80f5e8fe4.png)

※手っ取り早くsqlite3を使用した

## migrationファイルを作る
下記のような、migrationファイルを作る

```ruby:blog_migrate.rb
# -*- coding: utf-8 -*-
require 'bundler/setup'
require 'sqlite3'
require 'lotus/model'
require 'lotus/model/adapters/sql_adapter'

connection_uri = "sqlite://#{__dir__}/lotus_blog.db"

database = Sequel.connect(connection_uri)

database.create_table! :article do
  primary_key :id
  String   :title
  String   :description
  String   :content
  Integer  :is_published,      default: 0
  DateTime :created_at, :null => false, :default => Sequel::CURRENT_TIMESTAMP

  index [:id]
  index [:title]
end

database.create_table! :tag do
  primary_key :id
  String   :title

  index [:id]
  index [:title]
end

database.create_table! :article_tag do
  primary_key :id
  foreign_key :article_id, :article, :null=>false, :key=>[:id]
  foreign_key :tag_id,     :tag,     :null=>false, :key=>[:id]

  index [:article_id], :name=>:article_id
  index [:tag_id],     :name=>:tag_id
end

require 'fileutils'
FileUtils.mv( "lotus_blog.db", "../lib/")
```

このファイルを実行する。

```bash
$ cd db/
$ ruby blog_migrate.rb
```

これで、lotus_blog/libに
lotus_blog.dbがlotus_blog/libに作成される。

## DBに接続する
それぞれのスキームに接続するために、それぞれentityとrepositoryを指定する。
これによって、DBに対しコマンドを実行していくことができるようになる。
接続する対象DBファイルを

```ruby:lotus_blog.rb
adapter type: :sql, uri: "sqlite://#{__dir__}/lotus_blog.db"
```
のように指定してやり、それぞれのスキームにマッピングしていく

```ruby:lotus_blog.rb
#例
mapping do
    collection :article do
      entity     Article
      repository ArticleRepository

      attribute :id,           Integer
      attribute :title,        String
      attribute :description,  String
      attribute :content,      String
      attribute :is_published, Integer
      attribute :created_at,   DateTime
    end
end
```

ちなみに、

```ruby:mapping.rb
require "../config/seed.rb"
```
を入れるとサンプルデータを表示してくれる。

次回は、データを読みだして表示していくところについて解説する。
Apache Drillに感動した(２つのJSONファイルをSQLでJOINしてみた)

Apache Drillを試してみたがとてもいい！

##とりあえずこれをみて感動して欲しい。

２つのJSONファイルがあります。

```json:/opt/drill/test1.json
{"id": 1, "name": "foo"}
{"id": 2, "name": "bar"}
```

```json:/opt/drill/test2.json
{"id": 1, "point": 100}
{"id": 2, "point": 200}
```

Apache-Drillのシェルから下記SQLを入力すると

```sql
0: jdbc:drill:zk=local> SELECT test1.*, test2.point FROM 
. . . . . . . . . . . >   dfs.`/opt/drill/test1.json` test1
. . . . . . . . . . . >   JOIN dfs.`/opt/drill/test2.json` test2 ON (test1.id = test2.id);
+------------+------------+------------+
|     id     |    name    |   point    |
+------------+------------+------------+
| 1          | foo        | 100        |
| 2          | bar        | 200        |
+------------+------------+------------+
2 rows selected (0.253 seconds)
```

SQLでJSONがJOINできた！感動！

そして、なんとDrillはJSONだけでなく、CSV,TSV,Parquetも扱える。
Hadoopファイルシステムにアクセスできるし、HBaseやHive、MongoDBに接続することもできる。
つまり１クエリで色々なデータソースのデータをテーブルと見なしてJOINしてあれやこれやしたりできるわけです！感動です！

そして簡単！ここまでなら一行も設定ファイルをいじる必要なくできました！
Apache-Drillのサイトからtar.gzを落としてきて解凍するだけ！

感動であたまがフットーしちゃいそうです！

##蛇足。HiveとImpalaで分散システムを諦めかけた話し。
将来的にログ解析で分散システムが必要になりそうだったので半年くらい前に初めてHadoop周りに手を出した。
SQLライクなクエリでHadoopにアクセスできるHiveが便利そうだと思って使ってみたが、非常にパフォーマンスが悪く愕然とした。
データが少なくてもクエリの実行にすぐに数十秒以上かかってしまう。解析システムのデバッグにも一苦労だ。
そしてパフォーマンスを求めてImpalaに手を出してみたが、JSONをうまく扱えないし、設定も面倒だし、採用は断念した。
どうしても必要な状況になるまで分散システムを念頭に置いたシステム作りは止めた方がいいのかな。そう思っていた。

が、もしかしたら、Apache Drillが僕の救世主になってくれるかもしれない。

##その他
EC2でDrillを試したい方は下記を見ておいてください。
[Amazon EC2(Amazon Linux) でApache Drill 0.8.0が動かなくて困った](http://qiita.com/devneko/items/9cc963b03ef9235caa87)
R言語を扱う際のtips by Rstatistics.net

日本のR利用者の中であまり話題になっていないような気がしますが、[Rstatistics.net](http://rstatistics.net)が公開した"60 R Language Tips"というのが良い・自分のためになるので気になったところを紹介。

<blockquote class="twitter-tweet" lang="en"><p>60 Super Useful R Language Tips (and counting).. Free PDF Download! &#10;<a href="http://t.co/TdzJtYUj1X">http://t.co/TdzJtYUj1X</a> <a href="https://twitter.com/hashtag/rstats?src=hash">#rstats</a> <a href="https://twitter.com/hashtag/datascience?src=hash">#datascience</a> <a href="http://t.co/UT0oQTORX0">pic.twitter.com/UT0oQTORX0</a></p>&mdash; Learn R (@R_Programming) <a href="https://twitter.com/R_Programming/status/577867709058195457">March 17, 2015</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

PDFが公開されているので、詳しくは原文をご覧ください。

## 1. 因子になった数値の変換には`as.numeric()`関数は使用しない

ときどきですが、数値であるはずのデータが要素データとされてしまうことがあります。その際、数値に変換する`as.numeric()`関数を使うと、値が変わってしまいます。

```r
c(1, 2.4, NA) %>% str()
# num [1:3] 1 2.4 NA
c("1", "2.4", "NA") %>% as.factor() %T>% str() -> tmp
# Factor w/ 3 levels "1","2.4","NA": 1 2 3
```

```r
as.numeric(tmp)
# [1] 1 2 3
```

これは`tmp`というベクターがカテゴリーデータであるため、水準の順番に数値を与えているために生じる問題です。

`as.character()`関数で一度文字列データに変換し、再度`as.numeric()`関数による変換をすることでこの問題を回避できます。

```r
as.character(tmp) %>% as.numeric()
# [1] 1.0 2.4  NA
```

今度はきちんと元の数値になりました。

## 11. セッション情報を表示する`sessionInfo()`関数

使用中のRのバージョンや使用したパッケージについて知りたいときに`sessionInfo()`関数が便利です。

```r
sessionInfo()
# R version 3.1.2 (2014-10-31)
# Platform: x86_64-apple-darwin13.4.0 (64-bit)
# 
# locale:
# [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
# 
# attached base packages:
# [1] graphics  grDevices utils     datasets  stats     methods   base     
# 
# other attached packages:
# [1] rmarkdown_0.5.1 devtools_1.7.0  ggplot2_1.0.1   magrittr_1.5    stringr_0.6.2   knitr_1.9      
# 
# loaded via a namespace (and not attached):
#  [1] colorspace_1.2-6 cowsay_0.2.9.999 digest_0.6.8     DYM_0.1          evaluate_0.5.5   formatR_1.1      fortunes_1.5-2 
#  [8] grid_3.1.2       gtable_0.1.2     htmltools_0.2.6  MASS_7.3-40      memoise_0.2.1    munsell_0.4.2    plyr_1.8.1     
# [15] proto_0.3-10     Rcpp_0.11.5      reshape2_1.4.1   RJSONIO_1.3-0    scales_0.2.4     tools_3.1.2    
```

リストで値が返ってくるので、各項目についてアクセスするにはこのように。

```r
sessionInfo()$R.version$version.string
# [1] "R version 3.1.2 (2014-10-31)"
```

また同様の機能は`devtools::session_info()`も備えています。さらに似たような機能ですがtips 54でも紹介されています。

## 34. 複数パッケージの読み込みを一行で

通常、パッケージの読み込み（`require()`あるいは`library()`）で指定できるパッケージの数は一つですが、次のようにすると複数のパッケージを一度に読み込むことが可能です。

```r
lapply(c("ggplot2", "gridExtra"), require, character.only = TRUE)
```

## 56. パッケージの情報や関数を一覧表示させる

関数のヘルプを表示するには`?関数名`あるいは`help(関数名)`ですが、パッケージ全体の関数について知りたいときなどに便利なtips

```r
library(help = ggplot2)
```

`library()`関数の引数helpに情報を得たいパッケージ名を与えることで各種情報や関数が表示されます。

Enjoy!
即席multiprocessing

(4/5追記) Pickleした一時ファイルで受け渡すパターン
(9/4追記) Windows対応版


デコレータを作っておいて、既存の関数を書き直さずに子プロセスに処理を投げます。

```python:test.py

import os
from multiprocessing import Process, Queue

# デコレータ
def mp(func):
    def _f(*args, **kwargs):
        def _p(*args, **kwargs):
            al = list(args)
            q = al.pop()
            q.put(func(*al, **kwargs))
        queue = Queue()
        argsl = list(args)
        argsl.append(queue)
        proc = Process(target=_p, args=argsl, kwargs=kwargs)
        proc.start()
        proc.join()
        return queue.get()
    return _f


# 子プロセスで実行して結果を返す
@mp
def mp_test(a, b=None):
    return (a + b, os.getpid())

result, child = mp_test(1, 2)
print("parent: {}".format(os.getpid()))
print("child: {}".format(child)
print(result)

```

(4/5追記) Pickleした一時ファイルで受け渡すパターン
データサイズが大きい場合

```python:test2.py
import os
import pickle
from multiprocessing import Process

# デコレータ
def pickle_file(func):
    def _f(*args, **kwargs):
        def _p(*args, **kwargs):
            al = list(args)
            n = al.pop()
            res = func(*al, **kwargs)
            with open(n, "wb") as f:
                pickle.dump(res, f)
        tmp_name = "_tmp.pickle"
        argsl = list(args)
        argsl.append(tmp_name)
        proc = Process(target=_p, args=argsl, kwargs=kwargs)
        proc.start()
        proc.join()
        with open(tmp_name, "rb") as f:
            result = pickle.load(f)
        os.remove(tmp_name)
        return result
    return _f

# 子プロセスで実行して結果を返す
@pickle_file
def mp_test(a, b=None):
    return (a + b, os.getpid())

result, child = mp_test(1, 2)
print("parent: {}".format(os.getpid()))
print("child: {}".format(child)
print(result)
```


(9/4追記) Windows対応版
Windowsではプロセス開始方式がspawnなので、targetで渡す関数がpickle化できなければなりません。ネストした関数はpickle化できないので、この手法は使えません。

Windowsの場合は何の面白みも無いですがクラスを作成します。

```python:test_win.py

import os
import pickle
import multiprocessing as mp


class FileBasedIPC(object):
    def __init__(self, func):
        self.func = func

    def _f(self, *args, **kwargs):
        tmp_name = "_tmp.pickle"
        argsl = list(args)
        argsl.append(tmp_name)
        proc = mp.Process(target=self._p, args=argsl, kwargs=kwargs)
        proc.start()
        proc.join()
        with open(tmp_name, "rb") as f:
            result = pickle.load(f)
        os.remove(tmp_name)
        return result

    def _p(self, *args, **kwargs):
        al = list(args)
        n = al.pop()
        res = self.func(*al, **kwargs)
        with open(n, "wb") as f:
            pickle.dump(res, f)

    def __call__(self):
        return self._f

# 子プロセスで実行して結果を返す
def mp_test(a, b=None):
    return (a + b, os.getpid())

result, child = FileBasedIPC(mp_test)()(1, 2)
print("parent: {}".format(os.getpid()))
print("child: {}".format(child)
print(result)
```
leaflet.js FAQ


自分用メモ。
JavaScriptよくわからないのであまり参考にならないと思います。


## Q. アンダースコアがついてるメソッドとかプロパティはなに？

A. プライベートメソッド

アンダースコアがついてるメソッドはドキュメントには載らないっぽい。


## Q. 自作したClassのClassを識別するには？

`instanceof` 演算子を使うっぽい

```js
var a = new MyChildClass();
a instanceof MyChildClass; // true
a instanceof MyClass; // true
```

http://leafletjs.com/reference.html#class


## Q. 既存のClassを継承（extend）したクラスで継承元のclassのメソッドをオーバーライドするには

継承先のClassで普通にメソッドを実装して、実装したメソッドの中で`クラス名.prototype.メソッド名`を呼ぶ。
第1引数にthisを渡して、第2引数以降にメソッドの引数を渡す。

```js
var MyChildClass = MyClass.extend({
    initialize: function () {
        MyClass.prototype.initialize.call(this, "Yo");
    },

    greet: function (name) {
        MyClass.prototype.greet.call(this, 'bro ' + name + '!');
    }
});

var a = new MyChildClass();
a.greet('Jason'); // alerts "Yo, bro Jason!"
```

http://leafletjs.com/reference.html#class


## Q. 自作ClassでもL.map()みたいなfactoryを使いたい

ドキュメントにfactoryって書いてあるけどfactoryパターンのfactoryかな。

```js
new L.Map('map');  // こう書くべきところを
L.map('map');   // こう呼び出せる
```

```js
L.map = function (id, options) {
    return new L.Map(id, options);
};
```


## Q. Popupに画像を表示させると枠からはみ出す

leafletのコード追ってないので原因はよく理解してない（画像を描画するまで画像のwidthとheightがわからないのが原因だと思う）けど、2通りの解決方法がある。

1. CSSでwidthとheightを指定する

```js
var html = '<img src="" alt="" style="width:;height:" />';
var popup = L.popup().setContent(html);
```

2. dom要素を生成してからsetContent()する

```js
var html = '<img src="" alt="" />'
var divNode = document.createElement('DIV');
divNode.innerHTML = html;
var popup = L.popup().setContent(divNode);
```

http://stackoverflow.com/questions/10889954/images-size-in-leaflet-cloudmade-popups-dont-seem-to-count-to-determine-popu
Git Hubにて使用する簡単なMarkdown記法まとめ

## 概要

GitHubではMarkdown記法を使用することができる。
[Qiita公式のチートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)にも書いてあるが、たくさんあって一度には覚えられないしよくわからないと思う。
そこで、エンジニアでなくMarkdown記法に慣れていない方が、**すぐに使えて簡単に覚えられて需要の高い機能**だけをまとめてみた。

## Markdown記法とは

GitHubやQiitaやはてなブログにてテキスト入力欄に記号を用いて記述することで、プレビュー時に箇条書きや見出しなどを簡単に表現することのできる言語のこと。

## **簡単に使えるMarkdown**

### １．箇条書き

まずは基本となる需要や使用頻度の高い箇条書き。

#### 表記

```
* あいうえお
* かきくけこ
* さしすせそ
   * ざじずぜぞ
* たちつてと
   * だぢづ
   * でど
       * あばば
```

#### プレビュー
![kajou.png](https://qiita-image-store.s3.amazonaws.com/0/55783/b8701d52-a489-02f7-343e-784d8d8d1e03.png)

#### 解説

`*`(アスタリスク)を文頭に置くことで箇条書きが表示できる。次の行にスペースを入れて同じように記述することで、次の段落を表現できる。スペースの数は箇条書きの中で揃えれば何個でもいい。（この例では4つずつ）

### ２．見出し

この記事にも表示されているが、文章を区切ることのできる見出しを表示する。
HTMLを触ったことのある方ならすぐに理解できると思う。(`<h1>`が`#`、`<h2>`が`##`、…)

#### 表記

```
# 例
## 1章
## 2章
### 2章の1
#### 2章の1の1
### 2章の2
```

#### プレビュー
![midasi.png](https://qiita-image-store.s3.amazonaws.com/0/55783/0cc402ae-80ee-cdfc-71c1-2b2a9a0bf47d.png)

#### 解説

`#`(シャープ)を文頭に置くことで箇条書きが表示できる。シャープの数を増やすことで次の段落を表現できる。でもパッと見で違いがよくわからなかったりするので基本的に`##`と`###`だけ使ってればいい感ある。`#`はタイトルくらいにしか使わないのであんまり使わないかも。

### ３．記号などを直接表示

`#`とか`*`とかは上記までのMarkdownとして解釈され表示されないこともあるので、直接表示したいときに使う。

#### 表記

```
`*`
`*←アスタリスク`
`### あああ`
```

#### プレビュー
![sonomama.png](https://qiita-image-store.s3.amazonaws.com/0/55783/99c2b61b-ac23-2678-c83c-8bf1227e1538.png)


#### 解説

```
`
```
で囲った部分はそのまま表示される。キーボードからは、シフトキーを押しながら@で打てる。


## **ちょっと発展形**

### １．太字

強調したいときに使う。

#### 表記

```
これが**あいうえお**です。
```

#### プレビュー

![kyoutyou.png](https://qiita-image-store.s3.amazonaws.com/0/55783/99f2519f-33b7-0b9f-8268-74fe9897930f.png)

#### 解説

`**`と`**`で囲った部分は太字になる。

### ２．リンク

WEBページで普通に見るリンク。

#### 表記

```
[リンクのサンプルです](http://qiita.com/)
```

#### プレビュー

![link.png](https://qiita-image-store.s3.amazonaws.com/0/55783/d740770e-6aa9-fc64-5016-6471ef0796a8.png)

#### 解説

[]で表示したい文章を、()の中にURLを書くことでリンクが作れる。URLをそのまま貼ると開くのが面倒なのでリンクを貼るようにするとみんな幸せ。


### ３．打ち消し線

「前に書いたけどやっぱりこれ間違ってた！でも間違えたことに気づいたってことを残しておかなきゃ」って時に、文字の上から線を引ける。

#### 表記

```
~~目玉焼きにはソース派です。~~
ケチャップ以外考えられない！！！
```

#### プレビュー

![utikesi.png](https://qiita-image-store.s3.amazonaws.com/0/55783/4bc852eb-e9d2-2922-72a1-33c60da74a1f.png)

#### 解説

`~~`と`~~`で囲った部分は打ち消し線が引ける。キーボードだとシフトを押しながら^^マークを押すと打てる。

## まとめ

最近はエンジニア以外もGitHubを使う時代になってきました。そして平行してMarkdownも広まりました。簡単に書ける言語ですが、エンジニア以外の慣れない方には敷居の高いものだと思います。ですが、いつまでもベタで文章を書いているだけでは見づらく、みんな不幸せになってしまいます。
2,3個くらい覚えるのはやればできると思うので、ぜひ試しに使ってみて**簡単に大きな効果が得られること**を体験し、みんなで幸せになりましょう！
Amazon EC2(Amazon Linux) でApache Drill 0.8.0が動かなくて困った

#発生事象
とりあえずローカルで動かしたいので下記のコマンドを打つと

```bash
./bin/sqlline -u jdbc:drill:zk=local
```

こんなエラー

```bash
Error: Failure while attempting to start Drillbit in embedded mode. (state=,code=0)

```

 --verbose=true を付けて再度実行すると
こんな例外。

```bash
Caused by: java.net.UnknownHostException: ip-XX-X-X-XXX: unknown error
```

#解決策
hostnameコマンドで出力されたホスト名を/etc/hostsの127.0.0.1に追加。

以上。
品質マネジメント

## 品質マネージメント


何をすることで　**「品質」** を向上させることができるのか。

**「人材」** なのか？
**「計画」** なのか？
**「スケジュール」** なのか？
**「テスト自動化」** なのか？

まずは考えることからはじめる。

## プロジェクト

・QCDSMEの設定

|  項目      |        |    意味    |
|:-----------------|------------------:|:------------------:|
| Q            | Quality |品質        |
| C            | Cost |費用    |
| D            | Delivery |納期        |
| S            | Security |守秘        |
| M            | Morale&Moral |やる気、道徳      |
| E            | Environment | 環境        |


## 品質へのこだわり
・費用への不満だったり
・スケジュールへの不満（予定通りに進まない、何が原因なのか）

## 利害関係者(Stakeholder)
・どこまで？
発注元
元請け会社
請負会社（どこまでか把握できるか）

## 定義
よく言うQAとは
Qualiy Assurance:品質保証
システムがお客様の要求（希望）通りであり満足がいくための活動
QCは
Qualiy Control:品質管理
システムが目標と定めた品質水準をクリアしていくための活動
QMは
Qualiy Management:品質管理
品質中心とした経営管理活動

# 品質計画
・品質クリア条件をまとめる
・プランナー、開発と協議しリリースタイミングを判断。

# 管理者（案件稼働時）

・管理すること→進捗報告するだけ？

確認すべきこと

1.テスト担当者単位の進捗情報（ケース消化数）
2.テスト担当者単位の時系列進捗情報（1時間ごとの進捗率）
3.プロジェクト全体の進捗情報（ケース消化数）
4.プロジェクト全体の時系列進捗情報（1時間ごとの進捗率）
5.障害報告(JIRA/Redmine)などのチケットの確認（チケットの重要度）
開発側との調整が必要なのか。影響範囲がどこまでなのか。
6.決められた時間内にどこまでできるのか。出来ないのか。出来ない場合どうするか。
人員を投入だけで大丈夫か、教育の時間が必要か。

# テストベンダー会社

利用する際の、概算見積
オンサイト（常駐）かオンサイト（センター）

テストリーダー（設計者）　700,000円-1,000,000円
テスター　　　　　　　　　550,000円-650,000円

# テストベンダーの選定作業

1.テストベンダーに問い合わせ。比較することも大事で数社に依頼をかける。
2.依頼内容に対応してもらえるか、またスキルシートと仕事のパフォーマンスは別物であるため、見極めがものを言う。
3.明らかにテスト経歴が不足している場合は、断ること。
4.当たり前ですが、ジョインしてからが大変。
5.テスターの質と単価、どこまでのテストを実施してもらえるのか。
6.まずは、テスト見積書を出してもらい、そのあとにテストベンダー側の営業と打ち合わせ。
7.自社の開発エンジニアの数や今、会社として何に困っているのか。どう解決したいのかを詰める。
8.コストなのか、テスターの質なのか、常駐なのかテストセンターなのか。

そのあとに、契約書に判を押す。
社内の法務や人事に内容を確認してもらい、発注をかける。


# 用語
・テスト見積書：テスト人員の1人月もしくは、1人日あたりの単価や稼働期間、超過時、休日出勤時の金額を記載
・テスト請求書：実際のテスト案件稼働工数の金額を請求する
・請負契約：原則として「仕事を完成させること」が支払い条件
納品物の期限通りの引き渡しが条件となり、進めかたは、受注者（請負人）の裁量次第。「作業の体制」「進め方」などは、受注者が責任を持って決める。進捗リスク、課題などを管理する、プロジェクト管理も受注者が責任を負う

・派遣契約：発注者（派遣先）が受注者（派遣者）に指揮命令
・準委任契約：受注者は自らの責任で作業計画を立て、やり方を決めて、作業を行う。
受注者の義務や責任が発生。→受注者自身が判断して作業を行い、作業報告書を提出。
・機密保持契約（NDA=Non-Disclosure Agreement）：一般に公開されていない情報を入手する場合に、その情報を外部に漏らさせないために交わす契約
Zabbixのグラデーションラインは値域が負の時のことを考えていない


Zabbixのグラフでグラデーションラインを使うと、データに負の値があると、なにも考えずに下端からY=0のところまで塗りつぶす。おそらく値域が負域に入るの時のことを考えていないのだろう。

正の時と負の時を考慮して Y=0 の線を中心にグラデーションで描くように修正した。ネストが深くなりすぎるため、インデントはいじっていないのでコードが見づらいけど。

```/usr/share/zabbix/include/classes/graphdraw/CLineGraphDraw.php
--- CLineGraphDraw.php	2014-12-16 15:38:26.000000000 +0900
+++ CLineGraphDraw.php	2015-04-03 22:04:19.736847627 +0900
@@ -2245,6 +2245,10 @@
 				}
 				break;
 			case GRAPH_ITEM_DRAWTYPE_GRADIENT_LINE:
+				if ($y1 == $y2 && $y1 == $zero)
+				{
+					break;
+				}
 				imageLine($this->im, $x1, $y1, $x2, $y2, $avg_color); // draw the initial line
 				imageLine($this->im, $x1, $y1 - 1, $x2, $y2 - 1, $avg_color);
 
@@ -2271,9 +2275,15 @@
 					$Yincr = ($diffX > 0) ? (abs($y2 - $y1) / $diffX) : 0;
 
 					$gy = ($y1 > $y2) ? ($y2 + $Yincr * $i) : ($y2 - $Yincr * $i);
+					if ($gy <= $zero)
+					{
 					$steps = $this->sizeY + $this->shiftY - $gy + 1;
 
 					for ($j = 0; $j < $steps; $j++) {
+						if (($gy + $j) > $zero)
+						{
+							break;
+						}
 						if (($gy + $j) < ($this->shiftY + $startAlpha)) {
 							$alpha = 0;
 						}
@@ -2284,6 +2294,24 @@
 						$color = imagecolorexactalpha($this->im, $red, $green, $blue, $alpha);
 						imagesetpixel($this->im, $x2 + $i, $gy + $j, $color);
 					}
+					} else {
+					$steps = $gy - $zero + 1;
+
+					for ($j = 0; $j < $steps; $j++) {
+						if ($gy - $zero - $j > $this->shiftY + $startAlpha) {
+							$alpha = 0;
+						}
+						else {
+							$alpha = 127 - abs(127 - ($alphaRatio * (2*$zero - $gy + $j - $this->shiftY - $startAlpha)));
+						}
+						$color = imagecolorexactalpha($this->im, $red, $green, $blue, $alpha);
+						imagesetpixel($this->im, $x2 + $i, $gy - $j, $color);
+						if (($gy - $j) < $zero)
+						{
+							break;
+						}
+					}
+					}
 				}
 			break;
 		}
```
Twitter 'Create an application'のレートリミットについて


結論から書くと、 **'Create an application'** のレートリミットは **24時間** で解除されます。

## 経緯
TwitterのConsumerKey/Secretを取得するためには、[Twitter Apps](https://apps.twitter.com)からアプリの登録が必要です。

今回新しいアプリを登録する際に、何度か登録に失敗して(アプリ名とかDescriptionとかで弾かれた)何の気なしに次々とリトライしていたらレートリミットエラーになりました。たぶん15回くらいだったと思います。

最初は普通に15回/15分かなと思い待っていたら、全然解除されずにドキュメントにも[フォーラム](https://twittercommunity.com/t/rate-limit-exceeded-when-i-try-to-create-an-application/21453)でも回答がなく困っていました。(僕が回答加えました)

Twitterにメールを送っても回答が得られず困っていて24時間経ったので再度挑戦してみたら、無事レートリミットは解除されてアプリの登録をすることができました。
mapしてflattenしたらflat_mapになる、をrubyでやってみた

@mikamix が mapしてflattenしたらflat_mapじゃと言っていたのでやってみたら確かにそうだった。

```rb
def flat_map(arr)
  arr.map{|el| yield el}.flatten
end

def fn(v)
  [v, v]
end

arr = [1,2,3]

p flat_map(arr, &method(:fn)) == arr.flat_map(&method(:fn)) #true
```

【追記】
@pasela さんからご指摘頂いて上記だと以下の様なケースでEnumerable#flat_mapと同等にならないというチョンボ発覚。

ということで、ご指摘頂いた内容まんまですが

```rb
arr = [[1], [2], [3]]

p flat_map(arr, &method(:fn)) == arr.flat_map(&method(:fn)) #=> false

p flat_map(arr, &method(:fn)) #=> [1, 1, 2, 2, 3, 3]
p arr.flat_map(&method(:fn))  #=> [[1], [1], [2], [2], [3], [3]]
```

```rb
def flat_map(arr)
  arr.map{|el| yield el}.flatten(1)
end

def fn(v)
  [v, v]
end

arr1 = [[1], [2], [3]]

p flat_map(arr1, &method(:fn)) == arr1.flat_map(&method(:fn)) #=> true

arr2 = [[1, [2, 3]], [[4,5], 6], [7]]

p flat_map(arr2, &method(:fn)) == arr2.flat_map(&method(:fn)) #=> true
```

とすれば、Enumerable#flat_mapと同じ、になりそうですね。
shoulda-matchers 2.8.0で undefined method `validate_presence_of'などと出たので。



- Rails 4.2.0
- Rspec 3.2.2
- shoulda-matchers 2.8.0

```ruby
it { should validate_presence_of(:hoge) }
it { should validate_uniqueness_of(:hage) }
```

とかで``undefined method``だと怒られました。調べてみると・・・

[https://github.com/thoughtbot/shoulda/issues/203:embed:cite]

ちょっとバージョンが古いのですが、その他のコメントを見ると

[https://github.com/thoughtbot/shoulda/issues/203#issuecomment-73694540]

>Having the same error with rails '4.2.0' & shoulda-matchers 2.8.0 & rspec-rails 3.1.0

新しくても問題は起こっているようです。

``spec_helper``で``require 'shoulda/matcher``を追加しろとか（ハイフンでなくてスラッシュであるのがポイントかな？）

いろいろあるんですが、結局


[https://github.com/thoughtbot/shoulda/issues/203#issuecomment-42126779]

>It seems that reverting shoulda-matcher back to version 2.5.0 fix this.

これがめんどくさくなくていいかな、と思いバージョンを``2.5.0``に指定して入れ直しましたよと・・・。

Gemfile

```ruby
.
.
group :test do
  gem 'capybara'
  gem 'faker'
  gem 'shoulda-matchers', '2.5.0'
end
```
Rails の検索結果を CSV ファイルとして出力 → CSVファイルからレコード作成

検索しても良いのがなかったので、簡単に書いてみました。
ローカルでデータをバックアップしたい時などに便利です。

※ 対象のModelがマスアサインメント可能という前提で進めます。

## CSVエクスポート

Modelの検索結果をCSVに出力。

```rb
File.open('backup.csv', 'w') do |f|
  csv_string = CSV.generate do |csv|
    csv << User.column_names
    users = User.where(id: [1..100])
    users.each do |user|
      csv << user.attributes.values_at(*User.column_names)
    end
  end
  f.puts csv_string
end
```

## CSVインポート

CSVファイルからレコードを新規作成。

```rb
CSV.foreach('backup.csv', headers: true) do |row|
  User.create row.to_hash
end
```

## リモートサーバの場合
リモートサーバだと安易にファイルを作れないと思うので、railsコンソールを立ち上げて、空のファイルに以下の結果をコピペしていく感じになると思います。

#### バックアップ

```rb
puts CSV.generate{|csv| csv << User.column_names}
# 結果をコピー

csv_string = CSV.generate do |csv|
  users = User.where(id: [1..100])
  users.each do |user|
    csv << user.attributes.values_at(*User.column_names)
  end
end

puts csv_string
# 結果をコピー
```

#### 復元

```rb
text = 'バックアップしたCSVファイルの文字列'
csv = CSV.parse(text, headers: true)
csv.each do |row|
  User.create(row.to_hash)
end
```
IEだとAjaxで画像がアップロード出来ない！？


Fileフィールドの内容が更新(ファイルが選択)されたらAjaxでファイルをアップロードするようにしていたのですが、なぜかIEだけエラーがでてあげられない現象に遭遇しました。

```
Completed 400 Bad Request in 9ms

ActionController::ParameterMissing (param is missing or the value is empty: posts):
 .
 .
 .
```

サーバはRailsでCarrierWaveを使っているので、Controllerはこんな感じになります。


```ruby:app/controllers/posts_controller.rb
def update_image(id)
  @posts = Post.find(id)
  head :bad_request unless @post.update_attributes(post_params)
end
```

`routes.rb`はこんな感じです。

```ruby:config/routes.rb
resources :posts do
  patch 'update_image' => 'posts#update_image', as: :update_image, on: :member 
end
```

JavascriptはformDataを使ってます。

```javascript:app/assets/javascripts/posts.js
$("#input-file").change(function() {
  var formData = new FormData();
  var id = $(this).data('id');
  $input = $('#input-file');
  formData.append('post[image]', $input[0].files[0]);
  $.ajax({
    url: "/posts/" + id + "/update_image.js",
    type: 'PATCH',
    data: formData,
    cache: false,
    contentType: false,
    processData: false,
  });
});
```

いろいろと試した結果、`routes.rb`と`posts.js`の`patch`を`put`に変更したらできるようになりました:astonished:

IE10と11で大丈夫なのを確認しました。
【インストール不要】コマンドプロンプトで再帰的にファイル一覧を得る方法あれこれ

## ディレクトリとファイルの一覧を得る

```
DIR /S /B
```

```
C:\temp>DIR /S /B
C:\temp\dir
C:\temp\メモ.txt
C:\temp\メモ2.txt
C:\temp\dir\fuga.txt
C:\temp\dir\hoge..txt
C:\temp\dir\nestdir
C:\temp\dir\nestdir2
C:\temp\dir\nestdir\test.jpg
C:\temp\dir\nestdir2\foo.bmp
C:\temp\dir\nestdir2\piyo.txt
```

## ディレクトリのみの一覧
```
DIR /S /B /AD
```

```
C:\temp>DIR /S /B /AD
C:\temp\dir
C:\temp\dir\nestdir
C:\temp\dir\nestdir2
```

## ファイルのみの一覧
```
DIR /S /B /A-D
```

```
C:\temp>DIR /S /B /A-D
C:\temp\メモ.txt
C:\temp\メモ2.txt
C:\temp\dir\fuga.txt
C:\temp\dir\hoge..txt
C:\temp\dir\nestdir\test.jpg
C:\temp\dir\nestdir2\foo.bmp
C:\temp\dir\nestdir2\piyo.txt
```

# ツリー形式(ディレクトリのみ)
```
TREE
```

```
C:\temp>TREE
フォルダー パスの一覧
ボリューム シリアル番号は 9E00-704F です
C:.
└─dir
    ├─nestdir
    └─nestdir2
```

#ツリー形式(ファイルを含む)
```
TREE /F
```
```
C:\temp>TREE /F
フォルダー パスの一覧
ボリューム シリアル番号は 9E00-704F です
C:.
│  メモ.txt
│  メモ2.txt
│
└─dir
    │  fuga.txt
    │  hoge..txt
    │
    ├─nestdir
    │      test.jpg
    │
    └─nestdir2
            foo.bmp
            piyo.txt
```
【CakePHP】Viewでもリクエスト取得できるって話

たまに忘れているのでメモ。

Viewでも\$this->request->dataとか\$this->request->queryでリクエストを取得できるので、リクエストをそのままViewで使いたいときは、コントローラーでわざわざリクエスト取得して、\$this->setしてはやらないように。
PHPからMySQLに接続してレコードの更新・削除を行う

## 前提
[PHPからMySQLに接続する](http://qiita.com/tiida26/items/a8af26b5f34d64423b8b) にて接続を行っている



## テーブル

テーブル: hogetable に以下のようなレコードが存在する

|id|name|pass|
|:---:|:---:|:---:|
|1|taro|foofoo|
|2|taichi|barbar|
|3|kosuke|foofoo|

## コード(処理部分のみ)

### name が t で始まる場合の pass を hogehoge に変更する

```php
$stmt = $dbh->prepare("update hogetable set pass = :pass where name like :name");
$stmt->execute(array(":pass"=>"hogehoge", ":name"=>"t%"));

echo $stmt->rowCount() . "records updated";    // rowCountで処理が走った行数を取得して表示させる
```

結果

|id|name|pass|
|:---:|:---:|:---:|
|1|taro|hogehoge|
|2|taichi|hogehoge|
|3|kosuke|foofoo|


出力
`2records updated`


### pass が foofoo であるものを削除する

```php
$stmt = $dbh->prepare("delete from hogetable where pass = :pass");
$stmt->execute(array(":pass"=>"foofoo"));

echo $stmt->rowCount() . " records deleted";
```

結果

|id|name|pass|
|:---:|:---:|:---:|
|2|taichi|barbar|

出力
`2records deleted`
WodPressでよく使うテンプレートタグ



# WodPressでよく使うテンプレートタグ一覧


## 必須
|用途 | 挿入箇所 |テンプレートタグ|
|:----|:-------|:------|
|プラグイン動作用|head内|```<?php wp_head(); ?>```|
|同上| body内|```<?php wp_footer(); ?>```|

## WordPress基本情報

| 用途| 記入例     |
|:-------------|:------------------|
|ブログ名|```<?php bloginfo('name'); ?>```
|文字コード指定|```<meta charset="<?php bloginfo('charset'); ?>">```| 
|タイトル|```<title><?php wp_title(); ?></title>```|
|ブログのURL|```<?php echo home_url(); ?>```|
|スタイルシートのURL|```<link rel="stylesheet" href="<?php echo get_stylesheet_directory_uri(); ?>">```|
|テーマのルートディレクトリー|```<?php echo get_template_directory_uri(); ?>```|
|デスクリプションの設定| ```<?php bloginfo('description'); ?>```|



## ファイルのインクルードタグ

|インクルードするファイル| テンプレートタグ |
|:----------------|:--------|
|header.php | ```<?php get_header(); ?>```|
|footer.php | ```<?php get_footer(); ?>```|
|sidebar.php| ```<?php get_sidebar(); ?> ```|
|search_form.php| ```<?php get_search_form(); ?>```|
|任意の.php|```<?php include(TEMPLATEPATH . '/hoge.php'); ?>```|
|外部のテーマファイルの.php|```<?php include(get_theme_root() . '/hogeテーマ/fuga.php'); ?>```|


## 付加情報系

|用途|記入例|
|:----|:--------|
|bodyへのclass付加| ```<body <?php body_class(); ?>>```|


## マルチサイト用
|用途|記入例|
|:--|:---|
|親テーマトップページのURL|```<?php network_home_url(); ?>```|
nodeのhttpモジュールでダウンロード率を取る


http, あんまり使ったことなかった

```coffee
http = require 'http'
fs = require 'fs'
path = require 'path'

download = (url) ->
  wstream = fs.createWriteStream path.basename url
  http.get url, (res) ->
    res.pipe wstream # pipe to write stream

    # progress
    size = res.headers['content-length']
    currentLength = 0
    res.on 'data', (d) ->
      currentLength += d.length
      console.log currentLength/size
    res.on 'end', -> console.log 'done'
    res.on 'error', -> console.log 'error'

download 'http://www.washingtonbeerblog.com/wp-content/uploads/2012/10/crash_test1.jpg'
```

```js
0.012801818415748166
0.14808937684950893
0.16312132778659347
0.178153278723678
0.19318522966076254
0.20821718059784705
0.2232491315349316
0.2683449843461852
0.28337693528326974
0.34350473903160783
0.3735686409057769
0.38860059184286144
0.403632542779946
0.4186644937170305
0.433696444654115
0.4787922974653686
0.49382424840245315
0.5088561993395376
0.5389201012137067
0.5689840030878758
0.5840159540249603
0.6291118068362139
0.6441437577732985
0.6742076596474675
0.6892396105845521
0.7193035124587212
0.7343354633958057
0.8094952180812283
0.8395591199553973
0.8545910708924819
0.884654972766651
0.91471887464082
0.9598147274520736
1
done
```
querysetの最初の要素を取得する


Djangoの小ネタ。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.first

Django1.6くらいから querysetにfirst（とlast)が追加されていたらしく、最初のアイテムをとるのに便利に使えるということを今更知りました・・

- before

```py
try:
  p = Article.objects.order_by('title', 'pub_date')[0]
except IndexError:
  p = None
```
- after

```py
p = Article.objects.order_by('title', 'pub_date').first()
```

うーん便利。Django1.8も[リリース](http://djangoproject.jp/weblog/dajngo-1-8/)されたようなので、新しい機能をチェックしないとですね。
AVRアセンブラ入門　Lチカしてみるよ

アセンブラに触ってみたかったので
やってみようと思います :grinning: 

#使う物
AVR ISP V2.0
ATmega88-20PU 

#ソフト
Atmel Studio6.2
インストールの仕方は省きます
必要ならコメントお願いします
#プロジェクト
新規プロジェクト作成し
ATmega88Pを選択

```AVR.asm
;********************
;ヘッダ
;********************

;Lチカ
;AVR.asm 
;2015/04/02
;starswirl_k

;********************
;インクルードファイル
;********************

.include "m88def.inc"

;********************
;汎用レジスタ定義
;********************
;R16から使った方が良いらしい
.def	R_L_SET	=	R16
.def	R_L_ON	=	R17
.def	R_L_OFF	=	R18
.def	COUNT	=	R19

.org	0x0000		;プログラムコードの始まるロケーションを宣言　
	rjmp	MAIN	;リセット時にここからスタート
;********************
;定数定義
;********************

;---PORT---


;---入出力ビット---

	

;---ユーザフラグ---


;********************
;割り込みベクタ
;********************




;********************
;割り込みルーチン
;********************




;********************
;サブルーチン
;********************
TIME_MAKE:
		;時間稼ぎ
		LDI	COUNT,0x00;カウンターセット
LOOP:	NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		INC COUNT
		CPI	COUNT,0xF0;COUNT<11ならLOOPにジャンプ
		BRLO	LOOP
	RET

;********************
;メインルーチン
;********************
MAIN:
	LDI	R_L_ON,0b00000001	;LED ON
	OUT	PORTD,R_L_ON

	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ	
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ

	LDI	R_L_OFF,0b00000000	;LED OFF
	OUT	PORTD,R_L_OFF

	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ
	RCALL TIME_MAKE	;時間稼ぎ

```


NOPでごり押ししすぎぃ！！ :-1: 

結構早めに光ります



タイマーとかでやり方かえれるっぽい？のでそのうち更新します
EC-CUBE3のセッションの問題？！

# 現象

Chrome は問題が発生しないが、Safari、Firefox の場合、一度ページを表示し、他のページに遷移すると、セッションのエラーとなり、どのページも表示できなくなる。

Cookie を一旦削除して、セッションIDを破棄すると、再度1回のみ表示可能となる。

以下エラーの内容。

```
Whoops, looks like something went wrong.
```

```
    1/1 RuntimeException in NativeSessionStorage.php line 140: Failed to start the session: already started by PHP ($_SESSION is set). 
```

```
    in NativeSessionStorage.php line 140
    at NativeSessionStorage->start() in NativeSessionStorage.php line 262
    at NativeSessionStorage->getBag('attributes') in Session.php line 121
    at Session->remove('_security_customer') in ContextListener.php line 132
    at ContextListener->onKernelResponse(object(FilterResponseEvent), 'kernel.response', object(TraceableEventDispatcher))
    at call_user_func(array(object(ContextListener), 'onKernelResponse'), object(FilterResponseEvent), 'kernel.response', object(TraceableEventDispatcher)) in WrappedListener.php line 61
    at WrappedListener->__invoke(object(FilterResponseEvent), 'kernel.response', object(EventDispatcher))
    at call_user_func(object(WrappedListener), object(FilterResponseEvent), 'kernel.response', object(EventDispatcher)) in EventDispatcher.php line 164
    at EventDispatcher->doDispatch(array(object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener)), 'kernel.response', object(FilterResponseEvent)) in EventDispatcher.php line 53
    at EventDispatcher->dispatch('kernel.response', object(FilterResponseEvent)) in TraceableEventDispatcher.php line 112
    at TraceableEventDispatcher->dispatch('kernel.response', object(FilterResponseEvent)) in HttpKernel.php line 185
    at HttpKernel->filterResponse(object(Response), object(Request), '1') in HttpKernel.php line 167
    at HttpKernel->handleRaw(object(Request), '1') in HttpKernel.php line 66
    at HttpKernel->handle(object(Request), '1', true) in Application.php line 543
    at Application->handle(object(Request)) in Application.php line 520
    at Application->run() in index.php line 7
```

src/Eccube/Framework/SessionFactory/UseCookieSessionFactory.php:initSession()
内のセッション名が指定されている部分をコメントアウトすると、Safari、Firefox でもセッションエラーが発生しない。

```lang:src/Eccube/Framework/SessionFactory/UseCookieSessionFactory.php
        //session_name('ECSESSID');
```

ただ、Chrome でも Cookie を削除すると、同じく1回目のアクセスしか表示されない。

1. ブラウザの Cookie を削除
2. サイトにアクセスすると表示され、「ECSESSID」が Cookie に保持されている
3. ページ遷移しようとすると、セッションでのエラー表示される。
4. セッション名指定処理をコメントアウト
5. 他のページへの遷移も確認できる
6. Cookie は、「ECSESSID」、「PHPSESSID」の両方がセットされている
7. 「ECSESSID」の Cookie を削除しても、そのまま正常に画面遷移可能

どうも、セッションは php デフォルトの「PHPSESSID」で継続している感じ。
ただ、初回セッション開始時に「ECSESSID」でセッションを開始しているのが駄目っぽい。

どう対応するか…
カスタムチェックの作り方 - チェックする/しないの判定

社内共有用に英語化する前の下書き

# どこで判定するの？
カスタムチェックを作りはじめると、すぐに「このクラスはチェックしたい」「private メソッドはチェックしなくていいや」と、チェックする/しないを切り分けたくなる。

そこで既存のチェックのコードを読んでみたり、使えそうなメソッドを探すと……なんだか色々ある。

いったいどうすればいいんだ？

## 結論
以下ふたつを使い分けよう。

- shouldVisit
- shouldVisitCode

## 概要
それぞれ以下の特徴がある。

|                    | shouldVisit | shouldVisitCode |
|:-------------------|:------------|:----------------|
| タイミング          | クラス毎     | メソッド毎       |
| skip visit(Field)  | ○           | ×               |
| skip visit(Method) | ○           | ×               |
| skip sawOpcode     | ○           | ○               |

shouldVisit が false を返すと、チェック処理全体がスキップされる。
一方 shouldVisitCode はバイトコード解析を行う sawOpcode 系をスキップする。

また、shouldVisit はクラス単位なのに対し、shouldVisitCode はクラス内の各メソッド毎に処理を制御できる。


## その他
以下のメソッドで分岐しても構わない

### beforeOpcode
false を返すと sawOpcode をスキップできる。それだけだと shouldVisitCode と同じだが、こちらは Opcode 系の情報が出揃ってから呼ばれるので、それを元に分岐したい場合に有効。

あるいは、sawOpcode 汎用チェックメソッドではなく、sawMethod や sawInt のような個別のチェックメソッドのみを使う場合も、beforeOpcode で false を返し、sawOpcode をスキップしても構わない。sawOpcode をスキップしても sawMethod などは呼ばれる。
（shouldVisitCode で false を返すと全部スキップされる）

ただし、super.beforeOpcode を先に呼んでチェックすること。
親クラスで false が返っているのに true を返すともちろん動かない。


### visitJavaClass / visit(JavaClass)
チェックの入り口であり、ここでチェックしているサンプルも結構ある。

クラス情報はあるし、余計な処理が一切行われなくなるので早いが、shouldVisit と比べてメソッド名が明示的でなく気持ち悪い。
見通しという観点から shouldVisit / shouldVisitCode にチェックする/しないの判定を集約する事をおススメするが、絶対ではなく、ここにチェックを集約しても構わない。
（こちらを使うならここにチェックする/しないの判定を集めて欲しい）
プロジェクトをハマるゲーム化させる

# 前置き
## 仮定
超面白い大人数オンラインゲームやっているとして
クランだかギルドだかに所属しているとして

## 質問
ギルドリーダーから「最低1日1時間のプレイはノルマです」と言われていて、実際に1時間プレイしたら、そこで終わるだろうか。
超面白くてはまっているゲームなので、たぶんそのまま続行すると思う。
逆にクソゲーなら、義務感や惰性で続けているだけなのでそこで打ち切ると思う

ギルドリーダーから「最低1日1時間、ボス戦3回のプレイはノルマです」と言われていて、首尾よく30分で3回ボス撃破したら、そこでどうするだろうか。
あとは適当にゲーム内に30分いればいいだけなので時間をつぶすだろうか、それとも経験値やドロップアイテム目当てにさらにボス戦を続けるだろうか。
超面白くてはまっているゲームなら、たぶんそのままボス戦続行すると思う。
逆にクソゲーなら、義務感や惰性で続けているだけなので時間つぶしモードに移行すると思う

# 本題
これはプロジェクトにも言える話
信頼貯金やわくわくさせる能力、あるいは「ユーザーを引き込む」はそもそもチーム外だけでなく、リーダーはチームメンバーに対して発揮せねばならない。
プロジェクトに引き込めば、プロジェクトそのものがハマリゲーだと認識させられれば、メンバーは要求したコミット分以上に働こうとするし、より多く働くために、効率化のために自分から動いてくれると思う

逆に、要求したコミットを消化したら、定時まではtwitterをはじめ、定時後はBarに行ってしまうようなら、そのプロジェクトはクソゲー化している兆候だと思う

リーダーだけがチーム改善のために忙しく動き回り、メンバーはそれを冷ややかに見ている状態なら、メンバーの熱意に問題があるのではなく、メンバーの引き込みに失敗していることを疑ったほうがいい

逆に引き込みに成功するとメンバーが大戦略に対する忠誠を示しながら自分から動いてくれるので、開発スピードの改善とマネジメントの省力化が両立できる

# 実際やってみて
メンバーを引き込み、自律的に動くようになると少ないマネジメントコストで大量のアウトプットが生まれるようになる
メンバーはチームを自己改善し始めるので、生産性の向上が右肩上がりに続き、成長による生産性低下の罠を乗り越えられるようになった
なによりメンバーが自律的に動くことでマネジメントコストが低下した。このことで開発スピードの向上によるマネジメントの破滅(後述)を回避できたことは感動的だった


## 開発スピードの向上によるマネジメントの破滅
一つのタスクあたり、10のマネジメントコストがかかるとして、単位期間あたり10のタスクを消化できるとすると、その期間あたりのマネジメントコストは100になる
単純な開発スピードの改善のみであると、単位期間あたりの消化タスク量がn倍になるとマネジメントコストもn倍になる。
nが2くらいまでならリーダーの個人的頑張りで解決できるが、これが2を超え、3,5,10と増えていくとマネジメントできなくなり、逆にマネジメントの不足に由来する開発スピードの低下や失敗が顕現化する
これを「開発スピードの向上によるマネジメントの破滅」とよんでいる
CocoaPodsにライブラリを登録する


作業したのでメモ。公式サイトにある[Getting setup with Trunk](http://guides.cocoapods.org/making/getting-setup-with-trunk.html)を読んで実施した。

# CocoaPodsにユーザを登録する

podコマンドで登録を開始する。入力するとメールが届くのでリンクを開いてアクティベーションする。

```bash
pod trunk register mitsukuni.sato@gmail.com 'Mitsukuni Sato'
```

descriptionはどう見えるのか分からなかったので入力しなかった。

# CocoaPodsセッションの確認

セッションがどう使われているのか把握してないんですが、一定時間ログインできる、みたいな感じでしょうか…。

```bash
pod trunk me
```

```
  - Name:     Mitsukuni Sato
  - Email:    mitsukuni.sato@gmail.com
  - Since:    April 2nd, 17:51
  - Sessions:
    - April 2nd, 17:51 - August 8th, 18:14. IP: xxx.xxx.xxx.xxx
```

# podspec書く

カレントディレクトリにpodspecファイルを配置する。

内容は[Podspec Syntax Reference](http://guides.cocoapods.org/syntax/podspec.html)を読みながら書いた。JSON形式でもOK（CocoaPodsレポジトリ内はJSONで管理されているみたい）で、`LibraryName.podspec.json`というファイルが利用できる。

# podspecをlintする

podspecをlintに通して正しい内容かどうか確認する。エラーが出たら直す。

```bash
pod spec lint
```

問題なければ`passed validation`と表示される。

```
 -> LibraryName (1.0.0)

Analyzed 1 podspec.

LibraryName.podspec.json passed validation.
```

# CocoaPodsにpodspecを登録する

次のコマンドで登録する。`pod search`で出てくるには少し時間がかかるっぽい。

```bash
pod trunk push
```

# 登録されたpodspecを確認する

バージョン、オーナは `pod trunk info` コマンドで確認できる。

```bash
pod trunk info LibraryName

LibraryName
    - Versions:
      - 1.0.0 (2015-04-01 09:55:23 UTC)
    - Owners:
      - Mitsukuni Sato <mitsukuni.sato@gmail.com>
```

# 作成したpodspecにコントリビュータを追加する

自分以外のユーザも `LibraryName` を管理するようであればオーナを追加する。
追加するユーザはCocoaPodsに登録されている必要がある。

```bash
$ pod trunk add-owner LibraryName user@example.com
```
gitを入れ替えたら、Aluminiumで公開しているリポジトリが見えなくなったときの対処法

CentOS6.4にもともと入っていたgit 1.7.1→2.3.5へ入れ替えたときに遭遇。
httpアクセスできるようになっていたリポジトリが見つからない。
yumではなくソースから入れたため、/usr/local/libexec/git-core/git-http-backend/に場所が変わっていたのが原因。

/etc/httpd/conf.d/vcs.confのこの行を修正。
`ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/`

参考）
[gitを1.8にアップデートした結果、HTTP越しでアクセスできなくなった時の対処法]
(https://mistymagich.wordpress.com/2013/07/12/git%E3%82%921-8%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%97%E3%81%9F%E7%B5%90%E6%9E%9C%E3%80%81http%E8%B6%8A%E3%81%97%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7/)
puttyの設定を別PCに移行する

Puttyの設定はファイルではなくレジストリに保存してある為、レジストリの移行が必要になります。
※保存先、読み込み先は任意で変更

putty 設定のエクスポート
=======================
Windowsコマンドプロンプトを起動して下記のコマンドを実行
<code>reg export HKEY_CURRENT_USER\Software\SimonTatham\PuTTY putty.reg</code>

putty 設定のインポート
=======================
生成したregファイルをPCに移行しWindowsコマンドプロンプトを起動
regファイルがあるディレクトリまで移動し下記のコマンドを実行
<code>reg import putty.reg</code>
脚注にマークを置換挿入する

1.検索と置換を選択
2.置換タブを選択
3.検索オプションの検索方向を「文書全体」に設定
4.”検索する文字列”に特殊文字の「脚注記号」”^f”を入力
5.”置換後の文字列”に特殊文字の「検索する文字列」”^&”を入力
6.脚注に挿入したい文字を”^&”の前に入力（※1としたい場合は、”※^&”）
7.［すべて置換］ボタンをクリック
Railsで特定のaction毎にcssやjavascriptを読み込ませる方法


いろんなところでいろんな方法が紹介されてるのですけど、どれもしっくり来ずでして、自分なりの方法を考案してみました。

下記が僕のポリシーです

- Controllerにはその処理を書きたくない
- Helperとか作りたくない
- というかviews配下だけで済ませたい
- (bodyにかいてもうまくいくっちゃうまくいくが)stylesheet_link_tag, javascript_include_tagをheadタグの間に納めたい

### 1. application.html.hamlのheadタグに下記を挿入

```
%head
  :
  = render :partial => "#{controller.controller_name}/head_#{action_name}" rescue nil
  :
```

### 2. app/views/{contorller名}/_head_{action名}.html.hamlを作成する

特定のjsやcssを読み込ませたいcontroller/action専用にheadに読み込ませるpartialを作る

たとえばUsersControllerのshow時だけに読み込ませたいものがあるのであれば`app/views/users/_head_show.html.haml ファイルを作成します。

### 3. あとは読み込みたいCSSやJSを書くだけ。

```
= javascript_include_tag 'hoge', ..
:
= stylesheet_link_tag    'application', ..
:
```

このやり方のメリットとして、js,css以外にもOGP設定などもできます。
UIPanel以下のUIWidgetのdepthを全部まとめて操作したい！！！

わかるで？


```csharp
using UnityEngine;
using UnityEditor;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class UIPanelDepthEditor: EditorWindow {
	
	[MenuItem("Window/UIPanelDepthEditor")]
	public static void ShowWindow() {
		EditorWindow win = EditorWindow.GetWindow<UIPanelDepthEditor>();
		win.title = "UIPanelDepthEditor";
		
	}
	
	void OnInspectorUpdate() {
		// reset collection
	}
	
	UnityEngine.Object target = null;
	
	void OnGUI() {
		
		bool isPanel = false;
		GUILayout.BeginVertical ();
		
		var replaceObj = EditorGUILayout.ObjectField( "ObjectField", target, typeof( Transform ), true );
		if (replaceObj != null)
		{
			target = replaceObj;
		}
		
		GUILayout.BeginHorizontal();
		{
			
			EditorGUILayout.PrefixLabel("Depth");
			
			if (GUILayout.Button("-10", GUILayout.MinWidth(46f)))
			{
				DepthControll((Transform)replaceObj,-10);
			}
			if (GUILayout.Button("Back", GUILayout.MinWidth(46f)))
			{
				DepthControll((Transform)replaceObj,-1);
			}
			
			var text = "";
			if (replaceObj != null)
			{
				var panel = ((Transform)replaceObj).GetComponent<UIPanel>();
				if (panel != null)
				{
					text = panel.depth.ToString();
					isPanel = true;
				}
				else
				{
					var widget = ((Transform)replaceObj).GetComponent<UIWidget>();
					text = widget.depth.ToString();
				}
				
			}
			
			EditorGUILayout.TextArea(text);
			
			if (GUILayout.Button("Forward", GUILayout.MinWidth(40f)))
			{
				DepthControll((Transform)replaceObj,1);
			}
			
			if (GUILayout.Button("+10", GUILayout.MinWidth(40f)))
			{
				DepthControll((Transform)replaceObj,10);
			}
		}
		GUILayout.EndHorizontal();
		if (!isPanel)
			EditorGUILayout.HelpBox ("これはUIPanelじゃないです", MessageType.Warning);
		EditorGUILayout.HelpBox ("UIPanel以下のUIWidgetをまとめてDepth操作する。\n　ちょっと重たい", MessageType.Info);
		GUILayout.EndVertical();
	}

	
	void DepthControll(Transform obj,int depth)
	{
		foreach(var child in obj.gameObject.transform)
		{
			var item = child as Transform;
			var widget = item.GetComponent<UIWidget>();
			if (widget!= null)
				widget.depth += depth;
			else
			{
				var panel = item.GetComponent<UIPanel>();
				if(panel != null)
					panel.depth += depth;
			}
			DepthControll(item,depth);

		}
	}
}
```
template class の実装を別ファイルに分離

# 導入

普通の CPU 用 (C++) と GPU 用 (CUDA) のコードを宣言(.hpp)とか使い方は共通にして、実装をわけたい。kernel関数とか thrust::device_vector とかは CUDA のコード(*.cu)にしか書けない。

# やり方

``` a.hpp
#pragma once
#include <memory>

template <typename T>
class A {
public:
    A();
    virtual ~A();
    void where();
private:
    A(const A&);
    const A& operator=(const A&);
    struct Impl;
    Impl* _impl;
};

// 実体化したい型Tを列挙、ないものはリンク失敗
template class A<float>;
template class A<double>;
```

``` a_common.hpp
// CPU, GPU 実装で共通の部分
#include <a.hpp>

template <typename T>
A<T>::A() : _impl(new Impl) {}

template <typename T>
A<T>::~A() { delete _impl; }

template <typename T>
void A<T>::where() { _impl->msg(); }
```

``` a.cpp
// CPU 用の実装
#include <iostream>
#include "a_common.hpp"

template <typename T>
struct A<T>::Impl {
    void msg() {
        std::cout << "from cpp" << std::endl;
    }
};
```

``` a.cu
// GPU 用の実装
#include <iostream>
#include "a_common.hpp"

template <typename T>
struct A<T>::Impl {
    void msg() {
        std::cout << "from cuda" << std::endl;
    }
};
```

ビルド方法とかは CMake のプロジェクトあげましたので見てください。

[https://github.com/ShigekiKarita/CMakeExampleCUDA](https://github.com/ShigekiKarita/CMakeExampleCUDA)

``` 実行結果.txt
$ ./cmk.sh
$ ./build/g++/release/test/test_a_cpu
from cpp
$ ./build/g++/release/test/test_a_gpu
from cuda
```

# 理由

+ [テンプレート関数の宣言と実装を分離する方法](http://qiita.com/MasayaMizuhara/items/37f8c2a5462a4f7f8ea0)
+ [How to define a template class in a .h file and implement it in a .cpp file](http://www.codeproject.com/Articles/48575/How-to-define-a-template-class-in-a-h-file-and-imp)

ググるとこういうのがでます。前者や後者のメソッド 2, 3 はGPU用の .cu ファイルを不適ですが、。

後者のメソッド 1 は使えそうですが、最適化 "-O" オプションによってリンクが通らなくなりました。

+ [templateの実装をヘッダファイルに書かないでcppファイルに書く際の書き方まとめ](http://d.hatena.ne.jp/teramonagi/20111229/1325167872)

これはいけるんですが、全メソッド書くのが面倒ですので宣言 class だけで十分、メンバもCPU/GPUで変えたいので pimpl にしました。

# 補足

今年リリースされた CUDA 7.0 ではついに C++11 が利用可能になりました。つまり上記 pimpl などの生ポインタを使う部分をスマートポインタで置き換え可能になり、オーバーヘッドなしでメモリ管理でき、記述量が減ります (他にも thrust で頻出のファンクタもラムダにできますね)。CMake では次のように C++11 を nvcc に設定します。

``` CMakeLists.txt
set(CUDA_NVCC_FLAGS "-std=c++11")
```

+ [C++11メモ @ std::unique_ptrでPImpl](http://ramemiso.hateblo.jp/entry/2014/01/25/171322)
+ [CUDA 7 Release Candidate Feature Overview: C++11, New Libraries, and More](http://devblogs.nvidia.com/parallelforall/cuda-7-release-candidate-feature-overview/)
カスタムチェックの作り方 - おススメ親クラス

社内共有用に英語化する前の下書き

# どのクラスを継承して作るの？
カスタムチェックを作ろうと FindBugs の既存のチェックのクラスツリーを調べてみると、継承関係が深い事に気が付く。Object から 7 段階ぐらい継承してできていたりする。深い。

継承木の途中にたくさんの実装がある場合もあって、必ずしも末端の方のクラスを継承すればいいわけではなさそうだ。どうなってるんだ？

さて、何を継承すればいいんだろうか？

## 結論
素直に OpcodeStackDetector を継承しよう。

## 理由
いろいろなメソッドが使えるようになるので、Object から数えて 6 段階目のこのクラスを継承しよう。ほとんどのチェックがこれを継承しているし。

sawOpcode を使ったバイトコードの解析をしないなら 1 つ上の BytecodeScanningDetector でもいいかもしれない。

これが継承木で出てくる最初の Detector で、カスタムチェックは Detector か Detector2 である必要があるので、これより上から継承するのはお奨めしない。
DBUnit 実行前にシーケンスをリセットする

* `connect()`で IDatabaseConnectionを取得出来る前提
* postgresの場合。DBに応じて都度いい感じにクエリを変える

```java
connect()
.getConnection()
.createStatement()
.executeQuery("select setval('" + sequenceName + "', (select max(" + columnName + ") from " + tableName + "))");
```

適宜 `@Before` などで呼ぶ
EC2インスタンスにS3をマウントして使用する（IAM Role ver)


もっと早いやつが出たので新しいのを書きました。参考にどうぞ。[20160129追記]
[[AWSで]今流行のgoofysでS3を爆速マウント[EC2]](http://qiita.com/Yuki_BB3/items/9d661e7ad986c6a4f33d)

---

s3fsを使用してEC2インスタンスにS3バケットをマウントします。
だけど、アクセスキー情報をインスタンスに置いておきたくない！
・・・という状況を想定してIAM Roleを使用しました。


##IAM Role
IAMユーザーは使ったことありましたがRoleは初でした。
ハマるかと思いましたがそんなでもなかったです。


マネジメントコンソールからIAMを選択しRoleを選択
![150402-0042.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/e779e9f4-ea6c-5af6-1058-6106b2f0084f.jpeg)
![150402-0043.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/8a1bd129-96c3-03a1-cffa-bbd0c2156cd7.jpeg)

新しいRoleを作ります。
名前は『use-s3』としました
![150402-0044.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/0d5d9b49-2674-0538-1039-c4ed261746f7.jpeg)

S3に読み書きしたいのでフルアクセスで。。。
![150402-0045.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/2810c940-4fad-7175-6430-f54b852ea521.jpeg)

作成できました！
![150402-0046.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/3961da41-9fd4-d503-7fb4-cacd2ab9fb48.jpeg)


##EC2インスタンスを立ち上げる
通常と変わりませんがこの時、先ほど作成したRoleを指定することを忘れないように注意しましょう。
![150402-0047.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/19bc7830-2d2a-2170-67c5-5c8649d31f13.jpeg)


##S3バケットの準備
『uses3』という名前で作成してみました。
![150402-0048.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/6da8d454-a8fd-ca17-19b7-47387f9bccf9.jpeg)

***
ここまでは割と一瞬で終わったのですが、この後割とはまりました。
参考にした情報は最後に載せますが・・・
バージョンの違いですかね。なかなかマウントできずに疲れました。

##s3fsの導入
ssh接続を行い以下のコマンドを入力
```
$ sudo yum -y update
$ sudo yum -y install automake 
$ sudo yum -y install gcc-c++ 
$ sudo yum -y install fuse 
$ sudo yum -y install fuse-devel 
$ sudo yum -y install libcurl-devel 
$ sudo yum -y install libxml2-devel 
$ sudo yum -y install openssl-devel
```
これでインストールに必要なものを賄います。
続けてs3fsのダウンロードして解答
```$ wget https://github.com/s3fs-fuse/s3fs-fuse/archive/v1.77.tar.gz
$ tar -xzf v1.77.tar.gz
```
###s3fs-fuse-1.77
というディレクトリが作成されるのでその中へ。

```
$ cd s3fs-fuse-1.77
```
いろいろなサイトで『configure』をと書かれていたのですがそんなものがなく困っていましたが、どうやら『autogen.sh』を実行して作るようでした。
```
$ ./autogen.sh
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
```
無事インストールされました。
***
マウントポイント作成
```
$ sudo mkdir /mnt/s3
```
マウントします
パーミッションを変更しましょう。
```
$ sudo chmod 777 /mnt/s3
```
とりあえず検証なので全開け。


インストール時のデフォルトだとRootユーザーしか使えないので以下のファイルを修正
```
$ sudo vi /etc/fuse.conf
```
ファイル内は下記のようになっているので２行目の#を外してrootユーザー以外が利用できるようにする。

>[\] # mount_max = 1000
>[\] # user_allow_other




ここが面倒でした
####$ /usr/local/bin/s3fs <s3-bucket-name> <今作った/mnt/s3> -o rw,allow_other,<uid>,<gid>,default_acl=public-read,iam_role="<IAM Role>"

uid,gidを使うので調べます。

```
$ id ec2-user
```
今回の構成だとこんな感じ

```

$ /usr/local/bin/s3fs uses3 /mnt/s3 -o rw,allow_other,uid=500,gid=500,default_acl=public-read,iam_role="use-s3"

```
最後に確認
```
$ df -h
```
マウントされていれば成功です
IAM Userを使う方法はまた今度投稿します。

##参考
http://haws.haw.co.jp/tech/iam_role%EF%BD%93_for_amazon_ec2_and_s3fs/
http://dev.classmethod.jp/cloud/aws/s3fs-ec2-mount-s3/
http://qiita.com/monry/items/fa3bebd69e04a08ae12f
http://hivecolor.com/id/49
カスタムチェックの作り方 - Visitor / BetterVisitor

社内共有用に英語化する前の下書き

# どっちのメソッドを使うの？
カスタムチェックを作ろうと FindBugs のお奨めクラスを継承すると visitHoge 系と visit(Hoge) 系メソッドがある事に気が付く。
どちらのメソッドを使うべきなのだろうか？

## 推奨
visit(Hoge) 系メソッドがおススメ

## 全体像
visitHoge 系メソッドは FindBugs が利用している Apache bcel の Visitor インタフェースが宣言していて、解析対象のコードの各エレメントをウォークスルーするのもこちら側のメソッドになる。

visit(Hoge) 系メソッドは FindBugs 側のお奨めクラスの根っこの方にいる BetterVisitor(implement Visitor) が宣言しているメソッドで、visitHoge メソッドの呼び出しを visit(Hoge) へと振り向けてくれている。

## 推奨する理由
FindBugs のウォークスルーは Visitor 側、つまりお奨めクラスの親クラスで実装されている。
そのため、visitHoge 系にはうっかり super.visitHoge() を忘れるとそこで動きが詰まってしまうものがあるのだが、ウォークスルーが途中で止まっていること、その理由が super.visitHoge() の呼び忘れというのは結構見つけにくい。

親クラスの visit(Hoge) 側にも visit(Code) ぐらいは実装があるが、visit(Code) はほとんど自分で実装する事のないメソッド（たぶん）なので、visit(Hoge) 系を使っていれば事故率がだいぶ下がる。