OmniAICreator/Qiita-1.07M huggingface dataset:
ImageMagick でダミーの GIF 画像を生成する

## 概要

1. 縦横のサイズがそれぞれ 1px で、背景が透明なダミー用の画像が欲しい。
2. できればコマンドラインでサクッと作りたい。
3. 余計なツールは入れたくない。

ググればすぐに答えを得られるが、備忘用にメモっておく。

## 結論

ImageMagick の `convert` コマンドを使う。

```console
$ convert -size 1x1 xc:none dummy.gif
```

ImageMagick の `identify` コマンドで、ちゃんとできたか一応確認しておく。

```console
$ identify dummy.gif
dummy.gif GIF 1x1 1x1+0+0 8-bit sRGB 2c 43B 0.000u 0:00.000
```

例は GIF だが、他の画像フォーマットでも同じようにできるはず。

## 動作環境

```console
$ uname -a
Linux desktop-arch 4.8.10-1-ARCH #1 SMP PREEMPT Mon Nov 21 11:55:43 CET 2016 x86_64 GNU/Linux
```

```console
$ convert --version
Version: ImageMagick 6.9.6-5 Q16 x86_64 2016-11-22 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2016 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenCL OpenMP 
Delegates (built-in): bzlib cairo fontconfig freetype gslib jng jp2 jpeg lcms lqr ltdl lzma openexr pangocairo png ps rsvg tiff webp wmf x xml zlib
```

ImageMagick は Arch Linux の公式リポジトリにあるパッケージを導入している。

## ImageMagick とは

ImageMagick は画像編集のデファクトスタンダード[要出典]なので、多くの環境において導入済みだろう。

- [Convert, Edit, Or Compose Bitmap Images @ ImageMagick](http://www.imagemagick.org/script/index.php)
- [ImageMagick - Wikipedia](https://ja.wikipedia.org/wiki/ImageMagick)

## 引数の xc:none とは

`xc:none` とは透明の単色画像を指定しているようだ。

まず `xc:` の部分

> 擬似ファイル
> ImageMagick では画像ファイルの指定部分で、下記の形式を用いることにより作成することができる。|ImageMagick: Formats 参照。
> xc:color
> colorで塗りつぶされた画像
> 
> [ImageMagick - くっきー文書館](http://www.nucl.net/~cookie/cgi-bin/mediawiki/index.php?title=ImageMagick&redirect=no) より

なるほど「擬似ファイル」って分かりやすい。公式ドキュメントも参照してみる。`xc:` の解説は

> An backward compatible alias for the 'canvas:' psuedo-file format, used to create a solid color canvas image.

`xc:` は `canvas:` のエイリアス。`canvas` の定義は

> Useful to create solid color canvas images. Use -size and -depth to specify the image width, height, and depth. Example canvas color specifications include canvas:red and canvas:#FF0000.
> If no color is specified a 'white' canvas image is generated. If no -size is specified a single pixel image of the specified color is generated.
>
> [ImageMagick: Formats](http://www.imagemagick.org/script/formats.php) より

単色画像を生成するのに便利らしい。未確認だが、仕様上は「白色」が既定値のようだ。

## 指定できる色名

`xc:none` の `none` の部分で色を指定できるようだ。

指定できる色名はドキュメントの [Color Names](http://www.imagemagick.org/script/color.php) の項を参照。

`none` 以外にも `transparent` や `rgba(0,0,0,0.0)` などが透明として扱われるようだ。
アプリエンジニアがアプリのデザインで困った時に頼るべきサイト一覧



この内容は前回の記事同様に始めたばかりの[個人ブログ](http://sakahara.hatenablog.jp/entry/2014/02/12/000341)に掲載していますが、少しでもたくさんの方に見ていただきたいので、Qiitaにも掲載することにしました。

## 概要
アプリを開発する環境やチームは人それぞれだと思います。数人のプログラマーとデザイナーのチームで開発することもあればほとんど全てを一人でやる場合など。

特に日曜プログラマーの人でアプリを公開してみたいとなるとデザイナーの知り合いにお願いするか、お金を払ってデザインの発注するをするのはちょっと厳しい場合もあると思います。
そんな時に全てではなくともある程度のデザインを自力でする力があると非常に助かります。

私も個人でアプリ出してますが、デザインがうまくできないせいでホントによく苦労しました。そんな中で参考にさせていただいたサイトや実際につかっているアイコン集などもあるので、数は少ないですが紹介してみます。

## おすすめサイト
・[pttrns](http://pttrns.com/)

<p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://pttrns.com/"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/s/sakahara/20140211/20140211235130.png" alt="f:id:sakahara:20140211235130p:plain" title="f:id:sakahara:20140211235130p:plain" class="hatena-fotolife" itemprop="image"></a></span></p>

実際にリリースされているデザインのよい様々なアプリのスクリーンショットをカテゴリ毎に見れます。デザインの参考になるアプリが見たい場合はまずこちらがお勧めです。

・[dribbble](http://dribbble.com/)

<p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://dribbble.com/"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/s/sakahara/20140211/20140211235138.png" alt="f:id:sakahara:20140211235138p:plain" title="f:id:sakahara:20140211235138p:plain" class="hatena-fotolife" itemprop="image"></a></span></p>

アプリ以外のデザインもありますが、ここに掲載されているアプリのデザインもとてもよいものが多いです。ここに掲載されているものは実際のアプリではなくコンセプト的なデザイン画像がほとんどです。

他にも日本のサイトでよいデザインを紹介してくれているサイトです。

・[photoshopvip](http://photoshopvip.net/archives/57164)

<p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://photoshopvip.net/archives/57164"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/s/sakahara/20140211/20140211235145.png" alt="f:id:sakahara:20140211235145p:plain" title="f:id:sakahara:20140211235145p:plain" class="hatena-fotolife" itemprop="image"></a></span></p>

こんなデザインがゼロからできるようになりたい！とよく思いますw

私はデザインのプロではないですし、デザインについて語れるほどの知識は持ち合わせていませんが、様々なデザインを見て実際にアプリを触ってみることで、より良い方法を知ることができます。そしてそれらを取り入れていくことが良い物を作る一番の近道だと思います。

自分でアイコン作るのも無理！という方は下記ここらのサイトからアイコンをゲットするのがよいです。有料のものが多いですが、一から描くことを考えると購入した方がかなり工数削減できます。それに加えVectorなどの様々なフォーマットに対応しているのでカスタマイズもできます。

## アイコン等

・[glyphish](http://www.glyphish.com/)

<p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://www.glyphish.com/"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/s/sakahara/20140211/20140211235151.png" alt="f:id:sakahara:20140211235151p:plain" title="f:id:sakahara:20140211235151p:plain" class="hatena-fotolife" itemprop="image"></a></span></p>

・[glyphicons.com](http://glyphicons.com/)

<p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://glyphicons.com/"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/s/sakahara/20140211/20140211235201.png" alt="f:id:sakahara:20140211235201p:plain" title="f:id:sakahara:20140211235201p:plain" class="hatena-fotolife" itemprop="image"></a></span></p>

## 最後に
アプリ作ってる方でデザインに苦労してる方に是非参考にして頂きたいと思います。
また紹介したサイト以外にもまだまだ参考になる情報はあるので是非探してみてください。
C++11 STL Container Efficiency その２（範囲挿入)

各STLコンテナの効率比較調査その２。範囲指定で挿入する場合。

##調査データ
重複のない整数100万要素とする。

```cpp
static const int N = 1000000;
std::vector<int> elems(N, 0);
for (int i = 0; i < N; i++) {
    eelms[i] = i;
}
```

##調査コード
対象コンテナは vector, deque, list, set, unordered_set の5つ。

```cpp
// vector::insert()
std::vector<int> v;
v.insert(v.end(), elems.cbegin(), elems.cend());
```

```cpp
// deque::insert()
std::deque<int> d;
d.insert(d.end(), elems.cbegin(), elems.cend());

```

```cpp
// list::insert()
std::list<int> l;
l.insert(l.end(), elems.cbegin(), elems.cend());
```


```cpp
// set::insert()
std::set<int> s;
s.insert(elems.cbegin(), elems.cend());
```


```cpp
// unordered_set::insert()
std::unordered_set<int> us;
us.insert(elems.cbegin(), elems.cend());
```

##結果

|コンテナ|メンバ関数|挿入位置|計算量|時間|
|:--|:--|:--|:--|--:|
|vector|insert()|末尾|O(N)|2 ms|
|deque|insert()|末尾|O(N)|3 ms|
|list|insert()|末尾|O(N)|117 ms|
|set|insert()|-|O(N*log(M+N))|256 ms|
|unordered_set|insert()|-|O(N)平均、O(N*(M+N))最悪|162 ms|
※ N:挿入する範囲、M:自身の範囲
測定環境: Intel Core i7-4850HQ 2300 MHz (4 cores), Apple LLVM version 5.0
C++11 STL Container Efficiency その１（挿入)

各STLコンテナの効率比較調査その１。1要素ずつ挿入する場合。

##調査データ
重複のない整数100万要素とする。

```cpp
static const int N = 1000000;
std::vector<int> elems(N, 0);
for (int i = 0; i < N; i++) {
    elems[i] = i;
}
```

##調査コード
対象コンテナは vector, deque, list, set, unordered_set の5つ。

```cpp
// vector::push_back() ※末尾に挿入
std::vector<int> v;
std::for_each(elems.cbegin(), elems.cend(), [&v](const int x) {
    v.push_back(x);
});
```

```cpp
// vector::reserve() -> push_back() ※領域予約後に末尾に挿入
std::vector<int> v;
v.reserve(elems.size());
std::for_each(elems.cbegin(), elems.cend(), [&v](const int x) {
    v.push_back(x);
});
```

```cpp
// vector::insert() ※先頭に挿入
std::vector<int> v;
std::for_each(elems.cbegin(), elems.cend(), [&v](const int x) {
    v.insert(v.begin(), x);
});
```

```cpp
// vector::reserve() -> insert() ※領域予約後に先頭に挿入
std::vector<int> v;
v.reserve(elems.size());
std::for_each(elems.cbegin(), elems.cend(), [&v](const int x) {
    v.insert(v.begin(), x);
});
```

```cpp
// deque::push_back() ※末尾に挿入
std::deque<int> d;
std::for_each(elems.cbegin(), elems.cend(), [&d](const int x) {
    d.push_back(x);
});

```

```cpp
// deque::push_front() ※先頭に挿入
std::deque<int> d;
std::for_each(elems.cbegin(), elems.cend(), [&d](const int x) {
    d.push_front(x);
});

```

```cpp
// list::push_back() ※末尾に挿入
std::list<int> l;
std::for_each(elems.cbegin(), elems.cend(), [&l](const int x) {
    l.push_back(x);
});
```

```cpp
// list::push_front() ※先頭に挿入
std::list<int> l;
std::for_each(elems.cbegin(), elems.cend(), [&l](const int x) {
    l.push_front(x);
});
```

```cpp
// set::insert()
std::set<int> s;
std::for_each(elems.cbegin(), elems.cend(), [&s](const int x) {
    s.insert(x);
});
```


```cpp
// unordered_set::insert()
std::unordered_set<int> us;
std::for_each(elems.cbegin(), elems.cend(), [&us](const int x) {
    us.insert(x);
});
```

##結果

|コンテナ|メンバ関数|挿入位置|計算量|時間|
|:--|:--|:--|:--|--:|
|vector|push_back()|末尾|O(1)償却低数時間|6 ms|
|vector|reserve() -> push_back()|末尾|O(1)償却低数時間|3 ms|
|vector|insert()|先頭|O(N)|169 ms|
|vector|reserve() -> insert()|先頭|O(N)|164 ms|
|deque|push_back()|末尾|O(1)|6 ms|
|deque|push_front()|先頭|O(1)|6 ms|
|list|push_back()|末尾|O(1)|122 ms|
|list|push_front()|先頭|O(1)|125 ms|
|set|insert()|-|O(logN)|791 ms|
|unordered_set|insert()|-|O(1)平均、O(N)最悪|452 ms|

測定環境: Intel Core i7-4850HQ 2300 MHz (4 cores), Apple LLVM version 5.0
勉強会「Railsディレクトリから学ぶRailsイロハ」


#メニュー

+ rails new xxxをする
+ RailsはMVCフレームワークです models
 controllers
 views
+ Gemfile + Bundler
+ spec + Factory + Guard + Capybara...
+ 他のモダンなGemfile紹介

##MVCフレームワーク
model view controllerの各所に
ウェブアプリケーションを構成する責任を分散させて、
読みやすく、拡張性の高い状態にプログラムを保つためのフレームワーク

=> **どこに何を書けば良いか迷ったときに、ガイドラインを提供してくれます**

###ただし
オブジェクト指向に慣れてる人だと、「なんか違う」感があるらしい。
疎結合に注意しないと、すぐ再利用しにくいコード群が出来上がりそう。
（でもリファクタリングもしやすいと思うよ）


##RubyGems
Gem: Rubyライブラリの標準フォーマットを提供するパッケージ管理システム
Bundler: プロジェクト内で使うGemを管理する仕組み

=> **他の人がうまいことやってくれてるものを、ただで使えます**

###ただし
ほいほい何でもGemでやると、メンテナンスで死ぬらしい。

##テスト駆動開発
コードが前に進むとはどういうことか定義する。生産性を定義しやすくする

###ただし
コードが通れば良い、テストコードもクリーンに保つリテラシーが必要

とりあえず以上
git で commit をやり直したい時の方法

 git で同時にひとつのコミットにまとめるべきファイルなどをまとめ忘れた時。
ファイルを追加し直して commmit する方法。


```
git commit test2.txt  
```
本来なら test3.txt も一緒にコミットしなくてはいけないのに test2.txt のみをコミットしてしまった。


```
commit 84ccfb58a1a6049426d8c8fee057854326d33754
Author: color_box <colorbox222@gmail.com>
Date:   Wed Feb 12 21:32:28 2014 +0900

    巻き戻してすとだよ

commit 08f83a31b818489e7a5d938dab1cbf597b15341a
Author: color_box <colorbox222@gmail.com>
Date:   Wed Feb 12 20:46:07 2014 +0900

    first commit
```

```
git reset --soft 08f83a31b818489e 
```
 reset コマンドでコミットする直前の状態に戻す


```
commit 08f83a31b818489e7a5d938dab1cbf597b15341a
Author: color_box <colorbox222@gmail.com>
Date:   Wed Feb 12 20:46:07 2014 +0900

    first commit
```
git log で巻き戻っていることを確認

```
git commit test2.txt test3.txt 
```
追加すべきファイルをコミットし直す

```
commit e3bd3c01233c68fadaa2e2a7a9045ad30e5c857f
Author: color_box <colorbox222@gmail.com>
Date:   Wed Feb 12 21:34:03 2014 +0900

    ちゃんと2つのファイルをcommit

commit 08f83a31b818489e7a5d938dab1cbf597b15341a
Author: color_box <colorbox222@gmail.com>
Date:   Wed Feb 12 20:46:07 2014 +0900

    first commit

```

コミットが正常に完了した。
正規表現の位置指定子メモ

位置指定子をいつも忘れるのでメモ

以下のパターンはすべてexample.comの「example」にマッチする。

## 肯定先読み

```
(?=)
```

* 後に続くパターン位置にマッチ

```
//文章
http://example.com/　https://example.jp

//パターン
example(?=\.com)
```

*** 

## 否定先読み

```
(?!)
```

* 後に続かないパターン位置にマッチ

```
//文章
http://example.com/　https://example.jp

//パターン
example(?!\.jp)
```

*** 

## 肯定戻り読み

```
(?<=)
```

* 前から続くパターン位置にマッチ

```
//文章
http://example.com/　https://example.jp

//パターン
(?<=http://)example
```


## 否定戻り読み

```
(?<!)
```

* 前から続かないパターン位置にマッチ

```
//文章
http://example.com/　https://example.jp

//パターン
(?<!https://)example
```
Alfredを導入した

# Alfred (ver 2.1.1) をMavericksに導入した
![Alfred](http://www.alfredforum.com/public/style_images/4_alfred_v2_header_small.png)

MacOSX の Spotlist よりも使いやすいランチャと聞いて Alfred を導入しました.

## インストール

[Alfred の公式サイト](http://www.alfredapp.com/) へ行き下の方にある __Download Alfred v2__ を押下してダウンロードします.

__Alfred_2.1.1_227.zip__ がダウンロードされます(2014/2/12 現在).

__Alfred 2.app__ を ` /Applications` に移動させて起動しました.

_※注意 AppStore からダウンロード出来る Alfred は古いバージョンのものです._


## 使い方

__Alfred 2.app__ を一度だけ起動させてから、[Option + Space] で実行できます.

![Alfred.png](https://qiita-image-store.s3.amazonaws.com/0/19533/e4155620-4b4f-98a6-9514-1affaac964b2.png)

### アプリケーションの起動

safari と打って [Enter] を押せば、Safariが起動できます.
(私の環境では s だけで最初の候補に Safari が表示されます)

![スクリーンショット 2014-02-12 20.09.37.png](https://qiita-image-store.s3.amazonaws.com/0/19533/77bae1c2-c776-ecca-fb18-7daff6ba4e41.png)

### ファイルの検索

'(シングルクォーテーション)を始めに入力してからファイル名をタイプすると、検索が可能です.

![スクリーンショット 2014-02-12 20.10.40.png](https://qiita-image-store.s3.amazonaws.com/0/19533/a36d21b0-c929-b765-41d9-7ea0b7a14a95.png)


### googleでの検索

検索したいワードを入力すると、

![スクリーンショット 2014-02-12 20.08.48.png](https://qiita-image-store.s3.amazonaws.com/0/19533/4a3e2bdd-688b-a4db-5c48-4ca6d59c0da8.png)

と表示されるので [Enter] を押せばブラウザで検索が可能です.


### 電卓

数字を入力すると電卓での計算結果が得られます.

![スクリーンショット 2014-02-12 20.07.20.png](https://qiita-image-store.s3.amazonaws.com/0/19533/198ee711-ca9f-4cd8-db4a-d0e1fb3ce9a7.png)


## 設定

私は [Shift] を2回押下で起動するように変更しました.

その他の設定はしていません.

## 注意

インストールの項で注意で書きましたが、

AppStore からダウンロード出来るバージョンは Alfred ver1.2 です.

※公式サイトに乗っていました

http://support.alfredapp.com/kb:install

> ### Using the Mac App Store version

> Currently, version 1.2 of Alfred is available on the Mac App Store. Due to some restrictions Apple have put in place for developers, we may not update this version further. If you want to stay up to date, use the version of Alfred from our website.

> Here's a blog post explaining why we chose to keep Alfred outside the App Store and use Apple's Gatekeeper approach instead.


最新版を落とす場合は公式サイトからダウンロードして下さいねと書いてますね.
チートにまつわるエトセトラ


オンラインゲーム／ソーシャルゲームに焦点を置いて、考え方的なものを。

# はじめに

**※※※　オンラインゲーム／ソーシャルゲームでチートはされます、完全に防ぐ事は出来ません(キリッ※※※　**

# チートとは

簡単に言うと、 **「ゲームの不正改造」** です。
100人のユーザーが入れば、その内の1％に知識／技術を持った人が居たとしてもおかしくはありません。

# チートの手段

+ **パケットハック**
クライアントーサーバ間でやりとりするパケットデータをハッキングし数値を書き換える方法。
理論値を超えた値を送る人も入れば、理論値ギリギリの値を送る事も可能なので、判別しにくい。
**（例）**
プレイヤーがモンスターに攻撃するシーンで、ダメージをクライアント側でダメージを計算し、
サーバーに送っていれば、その「ダメージ」を意図的に変更する事が可能

+ **メモリ／セーブデータハック**
バイナリエディタを使用して、数値を書き換える方法。
クライアントで扱っている全ての数値を書き換えられる事が可能。
**（例）**
攻撃力の変数の場所が分かったとして FF(16) -> 255(10) に変更出来てしまう。

# 対策ってあるの？

簡単に言うと、クライアント側で計算を行わない。
『サーバー側』で全ての計算を行い、結果だけを『クライアント側』に送る。
devise, cancan, smtpなどのメモ

# devise
簡単にユーザー登録が出来るgem.

## devise導入手順
### Gemfileに追加.

```
gem 'devise'
```

### bundleのインストール

```
bundle install
```

### deviseの準備

```
rails g devise:install
```

### development.rbに設定を追加

```config/environments/development.rb  
config.action_mailer.default_url_options = { :host => 'localhost:3000' }    
```

### deviseのメッセージのための修正

```app/views/layouts/application.html.erb
    <div id="contents">
      <p class="notice"><%= notice %></p>
      <p class="alert"><%= alert %></p>
      <%= yield %>
    </div> 
```

### トップページの作成
routesに追加する.

```config/routes.rb
root :to => 'welcome#index'                                                
```

public/index.htmlを削除する．

### ユーザーモデルの作成

```
rails g devise user
rake db:migrate
```

### ルーティングの追加

```config/routes.rb
get 'questions', :to => 'questions#index', :as => :user_root 
```

### index.htmlの編集

```app/view/welcome/index.html.erb
<p><%= link_to 'ログイン', [ :new, :user_session ]  %></p>
<p><%= link_to 'パスワード再発行', [ :new, :user_password ]  %></p>
```

### コントローラに設定を追加

```app/controller/welcome_controller.rb
  def index
    if current_user
      redirect_to :user_root
      return
    end
  end
```

### フィルタの追加
hoge_controllerのクラス宣言後に以下の記述を追加.

```
before_filter :authenticate_user!
```

### サインアウトを追加
hogeアプリケーションのindex.html.erbに以下の記述を追加.

```
<%= link_to "Sign Out", destroy_user_session_path, :method => :delete %> 
```

# cancan
ユーザーに権限を設定できるgem.

## cancan導入手順
### Gemfileに追加

```
gem 'cancan'
```

### bundleのインストール

```
bundle install
```

### 制限の生成
 
```
rails g cancan:ability
```

### deviseのviewの作成と, Usersモデルにroleカラムを追加

```
rails g devise:views
rails g migration add_role_to_users role:string
rake db:migrate
```

### Userモデルにアクセサを追加

```app/models/users.rb
attr_accessible :role
ROLES=%w[admin user]
```

### abilityに管理者アカウントと一般アカウントの権限設定の記述を追加

```app/models/ability.rb
  def initialize(user)
    if user.role == "admin"
      can :manage, :all
    else
      can :read, :all
    end
  end 
```

### アカウントの作成はseedでのみ追加することにするので, sign_upを削除
以下の箇所を削除/コメントアウトしておく

```app/views/devise/shared/_links.erb
 <%= link_to "Sign up", new_registration_path(resource_name) %><br />
```

### 使い方
if can? でその権限があるかどうか, if cannotでその権限がないかどうか判定できる.

```
<% if can? :manage, @users %>
Your role is 'admin'.
<% else %>
Your role is 'user'.
<% end %>
```

# herokuでSMTPを使う
[HerokuでDeviseのメール通知を利用するまでの手順](http://qiita.com/rasenn/items/70e05a3097138bdb2720)
や
[HerokuのRailsアプリからメールを送信するには？](http://qa.atmarkit.co.jp/q/16)
であるように無料のSMTPサーバーを利用すればよいとのこと.

# deviseのsign_up問題
[Deviseプラグインのsign_upを制御する](http://qa.atmarkit.co.jp/q/2194)を見るにcontrollerを継承して振る舞いを変更する.

# ユーザー登録
管理者のみ出来るようにする, そのためにdeviseのsign_upの振る舞いを変えたい.
VolleyのImageLoaderをListViewで使うときの注意点

##結論
キャンセル処理はちゃんと入れよう。

##Volley
Android開発で、ネットワーク通信周りの処理を簡単に実装できるすごく便利なライブラリ。JSONの取得とか、画像の非同期取得とか簡単に実装できる。

##ListViewの実装パターン
ListView使う時はviewのインスタンスを再利用したり、ViewHolder使うのが定石になってます。
adapter#getView()はだいたいこんな実装

```java:sample
private class ViewHolder {
    ImageView imageView;
    TextView textView;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
	
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list, null);

        ImageView imageView = (ImageView)convertView.findViewById(R.id.image);
        TextView textView = (TextView)convertView.findViewById(R.id.text);

        holder = new ViewHolder();
        holder.imageView = imageView;
        holder.textView = textView;

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }

    // 画像やテキストの設定

    return convertView;
}
```

##画像をVolleyのImageLoaderを使って非同期で読み込む
VolleyのImageLoaderを使うと簡単に画像を非同期で読み込むことができます。
使い方は[ネットワーク通信用ライブラリVolleyを使いこなす](http://techbooster.org/android/hacks/16474/)に詳しく乗っているので見てください。
####惜しい実装パターン
画像読み込みの処理だけ加えた実装

```java:sample
private ImageLoader mImageLoader;

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
	
    if (convertView == null) {
        // 上と一緒
    } else {
        holder = (ViewHolder)convertView.getTag();
    }

    String imageUrl = "<画像のurl>";
    ImageListener listener = ImageLoader.getImageListener(holder.imageView, 
            R.drawable.progress, R.drawable.error);
    mImageLoader.get(imageUrl, listener);

    return convertView;
}

```
これで、ImageViewに非同期で読み込んだ画像がセットされます。

ただ、これだけだとちょっと問題があって、表示された順に画像読み込みのリクエストが投げられるので、ListViewを高速にスクロールすると、どんどんリクエストが溜まっていきます。
リクエストは順番に処理されるので、通りすぎて表示する必要のなくなった画像のリクエストが終わるまで、次のリクエストが処理されなくなり、ロード時間が長くなります。
また、viewを再利用するようになっているので、違うポジションの画像が表示されたりする問題も発生します。

そこで次のように、適切にリクエストのキャンセル処理を入れてあげます。
#### キャンセル処理をいれたパターン
```java:sample
private ImageLoader mImageLoader;

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
	
    if (convertView == null) {
        // 上と一緒
    } else {
        holder = (ViewHolder)convertView.getTag();
    }

    // リクエストのキャンセル処理
    ImageContainer imageContainer = (ImageContainer)holder.imageView.getTag();
    if (imageContainer != null) {
        imageContainer.cancelRequest();
    }

    String imageUrl = "<画像のurl>";
    ImageListener listener = ImageLoader.getImageListener(holder.imageView, 
            R.drawable.progress, R.drawable.error);
    holder.imageView.setTag(mImageLoader.get(imageUrl, listener));

    return convertView;
}
```

ImageLoader#get()の返り値のImageContainerはリクエストを管理しているので、このインスタンスをImageViewのタグに設定して保持しておきます。

Viewの再利用時にImageViewからImageContainerのインスタンスを取得し、リクエストのキャンセルを行っています。

これで、必要のなくなったリクエストはキャンセルされて、無駄な処理を省くことができます。
androidを開発しててたまにつかうTips的なの




#### Dialogで背景が暗くなるの無効化

```java
dialog.getWindow().setFlags( 0 , WindowManager.LayoutParams.FLAG_DIM_BEHIND);
```

#### Option(Menu)ボタンを下に表示する．

本来は2系(ActionBarのない)のSDKでビルドしたものを4系で起動すると表示されるレイアウト(非推奨)

![Qiita](https://dl.dropbox.com/s/uu6x6y313tcv08d/image00.png "Qiita")

```java
window.addFlags(WindowManager.LayoutParams.class.getField("FLAG_NEEDS_MENU_KEY").getInt(null));
```
#### ActionBarの下の影を消す

style.xmlに以下の表記を追加

```xml
<item name="android:windowContentOverlay">@null</item>

```
Rubyにおけるドット記法，二重コロン記法

Rubyにおけるドット記法と二重コロン記法についてのメモ．

#ドット記法
rubyにおけるドット記法とは，メソッド呼び出しに利用される．
形式的には， **レシーバ.メソッド** という形を用いる．

```rb:dot.rb
class Dot
  def method
    puts "Dot"
  end
end

d = Dot.new
d.method
# Dot
```

#二重コロン記法
二重コロン記法も上記のドット記法と同様にメソッド呼び出しに利用される．
形式的には， **レシーバ::メソッド** という形を用いる．

```rb:colon.rb

class Colon
  def method
    puts "Colon"
  end
end

c = Colon.new
c::method
# Colon
```

#ドット記法と二重コロン記法の違い
上記に沿えば，ドット記法も二重コロン記法も同じように利用されるかと思います．
次に記す例は，net/httpライブラリを利用して，ドキュメントを取得するためのコードです．
このコードは，二重コロン記法を用いて記述します．

```rb:net.rb
require 'net/http'
require 'uri'

url = URI::parse("http://www.ktaro.info/")
http = Net::HTTP::start(url::host,url::port)
doc = http::get(url::path)
puts doc::body
# ドキュメントが表示
```

では，続いて先ほどのコードをドット記法に書き換えます．

```rb:net.rb
require 'net/http'
require 'uri'

url = URI.parse("http://www.ktaro.info/")
http = Net.HTTP.start(url.host,url.port)
doc = http.get(url.path)
puts doc.body
# エラーが発生
# net.rb:5:in `<main>': undefined method `HTTP' for Net:Module (NoMethodError)
```

どうやら5行目にてエラーが発生しています．
エラー内容は， *Netモジュール内にHTTPというメソッドが定義されていない* というものです．

##結論
上記のソースコードは，ドット記法と二重コロン記法の違い以外に変わりはありません．
なぜ2つのコードでそれぞれ違う結果になったかと言うと，二重コロン記法が **メソッド呼び出しだけでなく，定数の呼び出しにも利用される** からです．
ドット記法は，あくまでもメソッドの呼び出しに利用されます．
Rubyでは， **クラスやモジュールも定数** として扱われます．

先ほどのドット記法で記述されたコードでは，Netモジュール内のHTTPクラスにアクセスしようとしましたが，ドット記法だったために，メソッドの呼び出しを行い，その結果メソッドが定義されていないというエラーが発生したというわけです．

```rb:net.rb(ドット記法[メソッド呼び出し]+二重コロン記法[クラスアクセス])
require 'net/http'
require 'uri'

url = URI.parse("http://www.ktaro.info/")
http = Net::HTTP.start(url.host,url.port)
doc = http.get(url.path)
puts doc.body
# ドキュメントが表示
```

#まとめ
今回の記事のまとめは，以下の通りです．

* ドット記法は，メソッド呼び出し
* 二重コロン記法は，メソッド呼び出し+定数呼び出し
* Rubyでは，クラスやモジュールも定数として扱われる．
rails + heroku メモ

# herokuにdeploy
## Gemfileの編集
gemfileのsqlite3の箇所を, developとproductionで変えておく(herokuはsqlite3ではなくpostgresqlなので).
Gemfileの以下の箇所を

```Gemfile
gem 'sqlite3'
```

このように書き変える.

```Gemfile
group :production do
  gem 'pg'
  gem 'therubyracer-heroku'
end
group :development, :test do
  gem 'sqlite3'
end
```

## production.rbの編集
config.assets.compileをfalseからtrueに変更.

```config/environments/production.rb
config.assets.compile = false
```

```config/environments/production.rb
config.assets.compile = true
```

## application.rbの編集
application.rbに以下の項目を追加.

```config/application.rb
config.assets.initialize_on_precompile = false
```

## bundleの更新
上の変更が終わったら, bundle-installをしておく. このときproductionを除くオプションを入れる.

```
bundle install --without production
```

## git
applicationのrootフォルダでgit initしてgitの管理下においておく.

>git init
>git add .
>git commit -m "commit message"

## heroku側にアプリケーションを作成
herokuのアプリケーション名は全て小文字でアンダーバーも利用不可なので注意.

> heroku create applicationname

## gitのremoteリポジトリにherokuを追加

>git remote add heroku git@heroku.com:appricationname.git

## herokuにpush

>git push heroku master

## SSL証明書でこけたとき
cacert.pemを適当な場所からとってきて, C:\cert\cacert.pemあたりにおいて, 環境変数SSL_CERT_FILE=C:\cert\cacert.pemを設定する.

# DB関連
## コマンド
マイグレーションを行う.

>rake db:migrate

seeds.rbに記述された内容をDBに登録する.

>rake db:seed

DBの内容を削除する.

>rake db:drop

heroku側の操作をする場合, herokuを先頭につける.

>heroku rake db:migrate
>heroku rake db:seed
>heroku rake db:drop

## 既にあるテーブルにカラムを追加/削除する
追加/削除用のマイグレーションを作成してマイグレーションする.

>rails g migration add_column_to_table name:type
>rails g migration remove_column_to_table name:type
>rake db:migrate

add_column_to_tableは **table**モデル に **column** をカラム名 **name**, 型を **type**で追加するという意味. removeは削除になる.

migrateしただけではモデル側のアクセサが設定されていないので注意. 以下のようにattr_accessibleに追加する.

```
attr_accessible :name
```
プログラマの文書作成術：Markdown, LaTeXなどの文書からWord文書を生成する


ドキュメント変換ツール[Pandoc](http://johnmacfarlane.net/pandoc/)を用いてMarkdownやLaTeX文書などからWord文書を作成する方法を紹介します。
以下の手順はターミナル（コマンドプロンプト）の操作ができることを前提とします。

PandocはMarkdown, LaTeXの他にもreStructuredText, HTMLなども入力できます。
詳細は [Pandocユーザーズガイド日本語版](http://sky-y.github.io/site-pandoc-jp/users-guide) をご覧ください。

## 1. Pandocをインストールする

Windows/Macの場合は以下からインストーラをダウンロードできます：

* [Downloads - pandoc - general markup converter - Google Project Hosting](https://code.google.com/p/pandoc/downloads/list)

Linuxの場合は、Debian/Ubuntuの場合は下記でインストールできるようです（ただしバージョンが古いです）：

	sudo apt-get install pandoc
	
その他の場合は、Haskell Platformに含まれるcabalというパッケージマネージャを使ってインストールできます。詳細は下記をご覧ください：

* [HTML - 多様なフォーマットに対応！ドキュメント変換ツールPandocを知ろう - Qiita](http://qiita.com/sky_y/items/80bcd0f353ef5b8980ee)

## 2. テンプレートを用意する

PandocにおけるWord文書用デフォルトテンプレートはヘッダに色が付いていて使いにくいので、テンプレートを変えます。

本来は自分でテンプレートを作る必要がありますが、3分クッキングよろしく予め用意したテンプレートを使いましょう。
（このテンプレートは、デフォルトテンプレートのヘッダの色を黒にしただけのものです。）


下記からテンプレート`reference_simple.docx`を直接ダウンロードできるので、保存します（以下、`~/Downloads`フォルダに入れたとします）。

* <https://github.com/sky-y/pandoc-templete/raw/master/docx/reference_simple.docx>

これを、

* Mac/Linuxの場合は`~/.pandoc`に
* Windows7/8の場合は`C:\Users\USERNAME\AppData\Roaming\pandoc`に

入れ、`reference.docx`にリネームする必要があります。以下、Macの場合を例にしてコマンドを示します。

	mkdir ~/.pandoc  # まだ作っていない場合
	mv ~/Downloads/reference_simple.docx ~/.pandoc/reference.docx

以上で、準備が整いました。

### 14.04.27 追記

自分で作成する場合は、

1. 下記のコマンドを実行してreference.docxを取得する

        pandoc --print-default-data-file reference.docx > reference.docx

2. Word上でreference.docxを編集する

という手順でreference.docxを得ます。

## 3. Markdown/LaTeX文書を作成する

お好きなMarkdown/LaTeX文書を作成します。

ここでは、例として、[Pandocユーザーズガイド日本語版](http://sky-y.github.io/site-pandoc-jp/users-guide)の元となっているMarkdown文書をダウンロードします。

	curl -O https://github.com/sky-y/pandoc/raw/master/doc-jp/README-JP.md

ついでに、後の例のためにLaTeX文書をここで生成しておきます（注意：`-s`オプションを付けないと、完全なLaTeX文書が生成されません）。

	pandoc -s README-JP.md -o README-JP.tex


## 4. Markdown/LaTeX文書を変換する
いよいよ、Pandocを用いて文書を変換します。

### Markdownの場合
	pandoc README-JP.md -o README-JP.docx
	
### LaTeXの場合
	pandoc README-JP.tex -o README-JP.docx
	
以上です。簡単ですね。


仕上がりを画像で示します。

![Screenshot_word.png](https://qiita-image-store.s3.amazonaws.com/0/10473/0ca63b0d-bbfd-e671-4058-a05de1b09b5f.png "Screenshot_word.png")



なかなか良い仕上がりですね。日本語も正しく変換されているようです。

## まとめ

Pandocを使ってMarkdownやLaTeXなどの文書をWord文書に変換する方法を見てきました。
他にPandocで何ができるかを知りたいは、以下のリンクを参照してみてください。

* [Pandocユーザーズガイド日本語版](http://sky-y.github.io/site-pandoc-jp/users-guide)
* [HTML - 多様なフォーマットに対応！ドキュメント変換ツールPandocを知ろう - Qiita](http://qiita.com/sky_y/items/80bcd0f353ef5b8980ee)
FlatUIでラジオボタンをスタイリングする方法


FlatUI <http://designmodo.github.io/Flat-UI/>
は、TwitterBootstrapをベースにしたUIコンポーネントです。
フォーム部品もいい感じのものが揃っていて便利です。

今回はFlatUIを使ったラジオボタンのスタイリングをやります。
まずはラジオボタンのマークアップをします。

```html
<label class="radio">
  <input type="radio" name="color" value="blue" data-toggle="radio"> 青
  <input type="radio" name="color" value="red" data-toggle="radio"> 赤
</label>
```

次にラジオボタン生成用のスクリプトを読み込みます。
これはダウンロードしたリソースの中に入っているものです。

```html
<script src="flatui-radio.js"></script>
<script>
  $(function(){
    $(':radio').radio();
  });
</script>
```

これでOKです。
Jenkinsプラグイン(Naginator Plugin) 〜失敗したら自動で再実行〜

### はじめに
* Jenkinsのプラグインで[Jenkinsのプラグイン「Build Flow Plugin」が超便利だった](http://qiita.com/oh_rusty_nail/items/a2addc8d0ca5a6531152)と書いたがもっと簡単だったのでご紹介

### インストール手順
* Jenkinsの[Jenkinsの管理]->[プラグインの管理]->[利用可能]からNaginator Pluginを選択してインストールする
 * 再起動はしなくてもよい

### ジョブ側の設定
* ジョブの[設定]->[ビルド後の処理の追加]->[Retry build after failure]で追加する
* Rerun build for unstable builds as well as failuresにチェックを入れる
* Delay before retrying buildで Fixedもしくは Progressiveを選択する
 * Fixedは一定時間でインターバルを設定できる(0以上を入力[秒]) 
 * Progressiveは(5, 10, 20, 35, 55)のようにインターバルをカスタムに設定できる(0以上を入力[秒])
* Maximum number of successive failed buildsは最大リビルド数
 * 最大値なので成功した時点でリビルドはされない 

以上！！

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Perlで、片方の配列に存在する、もう片方の配列の要素を削除する

メモ。
これ（[Perlで2つの配列の要素から重複を排除する、重複した要素だけ抽出する](http://qiita.com/mugyuu/items/f5d825c5214a7848305a)）の続き。

```pl
my @base_list   = qw(1 2 3 4 5 6 7 8 9 10);
my @target_list = qw(2 4 6 8 10);

for(my $i=0;$i<length.@base_list;$i++){
  foreach my $t (@target_list){
    if(@base_list[$i] eq $t){
      splice(@base_list,$i,1);
    }
  }
}
print "base_list: @base_list\n";
-----
base_list: 1 3 5 7 9
```
Subversionで変更点を見る

```bash:Terminal
$ git show changeset
```

的なことをSVNでやるには。

```bash:Terminal
$ svn diff -c r1
```

で良い。ついでに

```bash:Terminal
$ svn diff -c r1 | vim -
```

とかやっておけば色も着くしいろいろ良いかも。（vimでなくてもlessとかで良いかもしれないけど）

SVNつらい。
Windowsで作成したPython CGIファイル

Windowsのローカル環境で試していたPython CGIファイルをMac OS X上に移そうとして手間取ったのでメモ。
cgi-binフォルダ下のupload.pyというCGIファイルを想定。

参考URL：http://d.hatena.ne.jp/yoshiya_na/20110521/1305978743

(1) CGIファイルのパーミッションを確認・変更

```bash
cd cgi-bin
ls -lF
chmod 755 upload.py # 全てのユーザは実行できるが、所有者以外の書き込みは不可
```

(2) 改行コードを確認
Unix, Mac OS X: LF
Mac OS（バージョン9まで）: CR
Windows: CR-LF
に合わせる。

```bash
nkf -Lu --overwrite upload.py
```

元のファイルを上書きし、改行コードをLFにする。

または、Windowsで作成したファイルから、CRを取り除くと考えると（参考：http://stackoverflow.com/questions/19425857/env-python-r-no-such-file-or-directory）

```py
with open('upload.py', 'rb+') as f:
    content = f.read()
    f.seek(0)
    f.write(content.replace(b'\r', b''))
    f.truncate()
```
JavaScriptの勉強3日目：2014年2月12日(水) 

本日は、前回に引き続き、jQuery入門の続き(第11回から)を学習した。

要素の追加など、前回習ったような内容の別のアプローチの掛け方や、クリックやマウス時に発生させることが出来るイベントの実装、描画されているものに対するエフェクトの掛け方を学習した。

今まで学習した、JavaScriptの記述や、cssなどの使い方が自分の頭の中で混ざってしまい、混乱してしまうこおとがあった。少しずつ整理してしっかり自分のものにしたい。

マウスイベントとエフェクトを活用したものを作成した。

赤、緑、青の四角形が縦に1つずつ並んでおり、赤、緑をクリックすると、｢偽物です。｣というテキストダイアログを表示し、図形が消える。
青をクリックすると、｢本物です。｣と表示され拡大されるといったものである。


以下にコードを記述する。
	$(function(){
		
			$('#box1').click(function(){
				alert("偽物です。");
				});
			$('#box1')
				.click(function(){
					$(this).fadeOut(1000);
				});
			$('#box2').click(function(){
				alert("偽物です。");
				});
			$('#box2')
				.click(function(){
					$(this).fadeOut(1000);
				})
			$('#box3').click(function(){
				alert("本物です。");
				});
			$('#box3')
				.click(function(){
					$(this).animate({

					width: "70%",
    				opacity: 0.4,
    				marginLeft: "0.6in",
    				fontSize: "3em", 
    				borderWidth: "10px"
  				}, 1500);
				});
				
		});
MySQLのTIMESTAMP文字列をJavaScriptでパースするときの注意


## '2014-02-12 13:16:43' をパースしたい

MySQLのTIMESTAMPは'YYYY-MM-DD HH:MM:SS'の19文字になる。
今なら、'2014-02-12 13:16:43'の形。

これをJavaScriptのDate型にパースするには

```javascript
// ダメな例
var time = new Date('2014-02-12 13:16:43');
```

これでOK… **じゃない。**
WebKit系のブラウザならこれで大丈夫なんだけど、IEやFirefoxでInvaildになる。

#### Chromeの場合
![ScreenShot 2014-02-12 16.44.11.png](https://qiita-image-store.s3.amazonaws.com/0/17664/9247896b-2a2d-733a-990b-7b25a4b8787d.png "ScreenShot 2014-02-12 16.44.11.png")

#### Firefoxの場合
![ScreenShot 2014-02-12 16.44.56.png](https://qiita-image-store.s3.amazonaws.com/0/17664/fac1016e-405b-7b39-2b82-3f85b1576b96.png "ScreenShot 2014-02-12 16.44.56.png")

## こうする

```javascript
var time = new Date('2014-02-12 13:16:43'.replace(/-/g, '/'));
```

IE・Firefoxでもパース出来た。

![ScreenShot 2014-02-12 16.48.38.png](https://qiita-image-store.s3.amazonaws.com/0/17664/d6d4cd8e-73f1-dca3-a909-89620fd22f19.png "ScreenShot 2014-02-12 16.48.38.png")


## 詳しくは

JavaScript Dateでパース出来る形式をまとめてくれているナイスなページがあったので、リンクしておく。

http://dygraphs.com/date-formats.html
【メモ】クラス作る際の関数式と関数文での違い

```js
// 関数式でのクラス宣言
var Hoge = function(){};
Hoge.prototype = {
  foo: 'foo',
  getFoo: function(){
    return this.foo;
  }
};

// 関数文でのクラス宣言
function Piyo(){
  this.bar = 'bar';
  this.getBar = function(){
    return this.bar;
  };
}

console.log(Hoge.name);               // ""
console.log((new Hoge).constructor);  // function Object(){ [native code] }

console.log(Piyo.name);               // "Piyo"
console.log((new Piyo).constructor);  // function Piyo(){}
```

-----

```js
// 関数文でのクラス宣言
function Piyo(){}
Piyo.prototype = {
  bar: 'bar',
  getBar: function(){
    return this.bar;
  }
};
console.log( (new Piyo).constructor );  // function Object() { [native code] }
```

-----

関数文と関数式、コンストラクタで宣言とprototypeで宣言で色々違うみたいです。
ここも違うんだ、と思ったのでメモ。

-----

追記:

```js
var Piyo = function(){};
Piyo.prototype = {};

console.log( (new Piyo).constructor ==  (function(){}) );  // false
console.log( (new Piyo).constructor === (function(){}) );  // false
console.log( (new Piyo).constructor === Piyo );            // true
```

constructorは比較できます。できないと困る。


-----

追記2：

```js
var Piyo = function(){
  this.foo = 1;
};
Piyo.prototype = {
  bar: 1,
  setBar: function(val){
    this.bar = val;
  }
};

var piyo = new Piyo();

// hasOwnProperty()メソッド
console.log( piyo.hasOwnProperty('foo') );  // true
console.log( piyo.hasOwnProperty('bar') );  // false

// in演算子
console.log( 'foo' in piyo );  // true
console.log( 'bar' in piyo );  // true

piyo.setBar('barbar');

// hasOwnProperty()メソッド
console.log( piyo.hasOwnProperty('bar') );  // true
```

prototypeで宣言しただけのプロパティはhasOwnProperty()だとfalseになってしまうようです。
むむむ…。
「ブラウザアプリ」から「ネイティブアプリ」に関わる際に必要な考え方


最近、エンジニアのアビリティチェンジという話を聞くので。
サーバー：PHPから、クライアント：C++／C#とか

**_サーバ -> クライアント_**
+ リソース（画像／音声）管理に注意
+ 使い終わったらメモリの解放を行う
+ CPUに無駄な計算（処理）は行わせない
+ 処理優先ではなく、 **描画優先** である

**_クライアント -> サーバ_**
+ Linux、DBの勉強期間を十分に取る
+ VirtualBoxなど仮想環境の構築をして、作っては壊すの繰り返しを行う
+ **危険なコード(デッドロック、無限ループ)** に注意する
同一IP/User-Agentからのアクセスを監視するスクリプト

正体不明なUAがコンテンツ一覧を根こそぎクロールしているようなので、crontに登録して人力監視に利用中。

```accesslog_check.sh
#!/bin/sh

mail_alert() {
  msg=''
  while read i
  do
    count=`echo $i | awk '{print $1}'`
    if [ $count -ge 80 ]; then
      msg="$msg
$i"
    fi
  done

  if [ -n "$msg" ]; then
    echo $msg | /usr/sbin/sendmail -t << EOF
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
From: $_FROM_ADDRESS
To: $_TO_ADDRESS
Subject: $_SUBJECT
$msg
EOF
  fi

}

tail -n 1000 /var/www/log/access_log.`date '+%Y%m%d'` | awk -F'\\[|\\]|"' '{print $1, $8}' | sort | uniq -c | sort -nr | mail_alert
```
octopressのs3デプロイファイル群をgzip圧縮する

```ruby:Rakefile
deploy_default = "s3"
## -- S3 Deploy config -- #
s3_bucket      = "hugehugehuge"  # Enter your S3 bucket name here
s3_cache_secs  = "3600" # Number of seconds to keep objects in cache - 3600 = 1 hour


desc "Deploy website via s3cmd"
task :s3 do
  (Dir["#{deploy_dir}/*"]).each { |f| rm_rf(f) }
  Rake::Task[:copydot].invoke(public_dir, deploy_dir)
  puts "\n## Copying #{public_dir} to #{deploy_dir}"
  cp_r "#{public_dir}/.", deploy_dir
  puts "## Compile css,html,js,xml to gz"
  Dir.glob("#{deploy_dir}/**/*.{css,html,js,xml}") do |f|
    system("gzip -n #{f}")
  end
  system("find #{deploy_dir}/ -iname '*.gz' -exec rename 's/\.gz$//i' {} +")
  puts "## Deploying website via s3cmd"
  ok_failed system("s3cmd sync --acl-public --add-header \"Cache-Control: max-age=#{s3_cache_secs}\" #{deploy_dir}/* s3://#{s3_bucket}/ --exclude '*.sh' --exclude '*.html' --exclude '*.js' --exclude '*.css' --exclude '*.xml' ")
  ok_failed system("s3cmd sync --acl-public --add-header \"Cache-Control: max-age=#{s3_cache_secs}\" --add-header 'Content-Encoding:gzip'  #{deploy_dir}/* s3://#{s3_bucket}/ --exclude '*.*' --include '*.html' --include '*.js' --include '*.css' --include '*.xml'")
end
```

    brew install rename s3cmd

参考
- <http://www.furida.mu/blog/2012/02/29/gzip-your-octopress/>
- <http://blog.nambo.jp/2013/07/25/octopress-aws-s3/>

追記
こっちの方がいいかも
<http://qiita.com/soramugi/items/568357c49e6cb7ec867e>
MvvmCrossでDrag&Dropイベントを処理

##Problem
WPFで作っているのはデスクトップアプリなので，Drag&Dropさせたい。というかDropされたファイルなりなんなりを処理したい。
しかしDragEventArgsを受け取るMvxCommandをViewModelに書いてしまうとWindows以外でビルドが通らなくなる上にそもそもPCLでは無理。ちなみにWPFオンリーであれば以下のような書き方ができます。

```cs:MvxCommandWithDragEventArgs
private MvxCommand<DragEventArgs> _itemDroppedCommand;
public ICommand ItemDroppedCommand
{
	get
	{
		return _itemDroppedCommand ??
				(_itemDroppedCommand =
					new MvxCommand<DragEventArgs>(e => ItemDropped(e)));
	}
}

private void ItemDropped(DragEventArgs e)
{
	// Do something.
}
```

##Solution
泣く泣くViewに書きます。今回はファイルパスを受け取ってみます。
まずはコマンドの定義。

```cs:DropViewModel.cs
private MvxCommand<string[]> _itemDroppedCommand;
public ICommand ItemDroppedCommand
{
	get
	{
		return _itemDroppedCommand ??
				(_itemDroppedCommand = new MvxCommand<string[]>(ExecItemDroppedCommand));
	}
}

private void ExecItemDroppedCommand(string[] items)
{
	// Do something.
}
```

WPFではView.csにDropイベントを実装。

```cs:View.cs
private void Dropped(object sender, DragEventArgs e)
{
	if (e.Data.GetDataPresent(DataFormats.FileDrop, false) return;
	var vm = this.ViewModel as DropViewModel;
	if (vm == null) return;
	vm.ItemDroppedCommand.Execute(e.Data.GetData(DataFormats.FileDrop));
}
```

Macでは…準備中

##Conclusion
漂う無理矢理感。
もっといい方法があるのでは…？
jpegのロスレス圧縮

(2014/02/25 追記)
便宜上「jpgのロスレス圧縮」とタイトルを付けましたが、jpegの場合ではロスレス圧縮ではなく、画像の最適化をする方法になります。
(2014/02/25 追記ここまで)

Googleが提供している[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights)でwebページの計測をしてみたら

「画像を最適化する」の項目でjpegファイルのロスレス圧縮を要求されたのでメモ

# ロスレス圧縮とは

> 可逆圧縮（かぎゃくあっしゅく）とは、圧縮前のデータと、圧縮・展開の処理を経たデータが完全に等しくなるデータ圧縮方法のこと。ロスレス圧縮とも呼ばれる。
<http://ja.wikipedia.org/wiki/可逆圧縮>

とのこと。

# jpegのロスレス圧縮とは

- jpegファイルは非可逆圧縮と呼ばれる圧縮すればするほど画質が悪くなる形式。
- jpegファイルには撮影情報等のメタデータが記述される事があるので、メタデータを取り除けばファイルサイズを小さく出来ることがある。
- 圧縮に使用するハフマンテーブルを最適化すると圧縮率を改善できる

jpegは圧縮すると画質が悪くなるが、メタデータの削除やハフマンテーブルの最適化でサイズを縮小する事が出来る事もある。

# ロスレス圧縮する

`jpegtran`コマンドを使う。

インストール

    brew install jpeg

ちなみにfreeBSD(OS X)では標準で入ってるみたい。

実行

    jpegtran -copy none -optimize -outfile /path/to/foo.jpg /path/to/foo.jpg

- -copy none
  - JPEG ファイルのメタデータをすべて削除する。
- -optimize
  - ハフマンテーブルを最適化する。
- -outfile
  - ファイルの出力先の指定

# まとめて圧縮

    find /path/to/public/ -name "*.jpg" -type f -exec jpegtran -copy none -optimize -outfile {} {} \;



参考 :
- <http://www.maruko2.com/mw/Webで使用する画像ファイルの最適化#JPEG>
- <http://stackoverflow.com/questions/12831293/how-to-recursivly-use-jpegtran-command-line-to-optimise-all-files-in-subdirs>
UnityでAndroidビルドが失敗する場合

UnityのAndroidビルドで、
「Unable to convert classes into dex format. See the Console for details.」というエラーが出てビルドに失敗し、
以下のように詳細なエラーメッセージに **java.lang.IllegalArgumentException: already added** と表示される場合は、同じクラスファイルが存在しているため多重定義になっていますので、プロジェクト設定を見直す必要があります。

```
stderr[

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: L[パッケージ名の為 割愛];
	at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
	at com.android.dx.dex.file.DexFile.add(DexFile.java:163)
	at com.android.dx.command.dexer.Main.processClass(Main.java:490)
	at com.android.dx.command.dexer.Main.processFileBytes(Main.java:459)
	at com.android.dx.command.dexer.Main.access$400(Main.java:67)
	at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:398)
	at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245)
	at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131)
	at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191)
	at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123)
	at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109)
	at com.android.dx.command.dexer.Main.processOne(Main.java:422)
	at com.android.dx.command.dexer.Main.processAllFiles(Main.java:333)
	at com.android.dx.command.dexer.Main.run(Main.java:209)
	at com.android.dx.command.dexer.Main.main(Main.java:174)
	at com.android.dx.command.Main.main(Main.java:91)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at SDKMain.main(SDKMain.java:129)
1 error; aborting
]

```
sedについて(という名の文字列操作まとめ)

毎回ぐぐるのがめんどくさいので備忘的に

# 最初に現れた文字列を置換するには
## 例：「aaa」を「bbb」に置換する場合

```bash
sed '1,/aaa/s/aaa/bbb/'
```

## 参考リンク

[sedにて一番最初にマッチしたモノだけを置換するには](http://d.hatena.ne.jp/n9d/20081110/1226284188)

# マッチした行だけ表示する
## 例：「aaa」を「bbb」に置換してマッチする行だけ表示

```bash
sed -n 's/aaa/bbb/p'
```

## 例：「aaa」にマッチする行だけ表示

```bash
sed -n '/bbb/p'
```

もしくは

```bash
grep 'bbb'
```

# 指定した文字列を含まない行だけ表示

sedじゃないけど

```bash
grep -v 'bbb'
```

# 改行を削除

sedじゃ(ry

```bash
tr -d '\n'
```

使うことは少ないと思うけどどうしてもsedでやりたい場合

```bash
sed ':loop; N; $!b loop; ;s/\n/,/g'
```

参考：[改行を置換したい](http://unicus.jp/skmk/archives/315)
Windows7のプロダクトキーを変更する

* VMの作成などで、ベースとなるイメージのクローンを作る場合などにプロダクトキーだけ変更したかったのでその備忘録
 * これでベースとなるイメージを１つ作って、クローンを作って目的に別に運用するようなことができるようになる

----
* http://kusumoto-jp.org/article.php/productkeychange

----

## 手順
* システム を開く
 * コントロールパネル > システムとセキュリティ > システム
* 下のほうに Windowsライセンス認証 って項目があるのでそこからプロダクトキーを変更できる
ファイルやフォルダを列挙する

##Problem
System.IO.Directory.GetFiles, GetDirectoriesは特に大量のファイルがあったとき制御が戻らなくて困る。
EnumerateFiles, EnumerateDirectoriesと一緒にEnumerateFileSystemEntriesがあったので，これを使ってみたかった。

##Solution
.NET 4.0以降で使えます。

```cs:EnumerateFs.cs
var fsEntries = Directory.EnumerateFileSystemEntries(path, "*.*", SearchOption.AllDirectories);
```

ReturnはIEnumerable\<string>です。結果をフィルターすればディレクトリのみ，ファイルのみ，指定プレフィックスのファイルのみなど取得できます。

```cs:ディレクトリだけ抽出
var dirs = fsEntries.Where(path => File.GetAttributes(path).HasFlag(FileAttributes.Directory));
```

foreach, Parallel.ForEachなど夢が広がる。
なにより一時リストが生成されないのが嬉しい。

##Conclusion
C#ってすばらしい（偏見）。
zshの補完関数　for cordova

cordovaのための補完関数を作ってみた。
_railsから換骨奪胎。

今のところ問題ないが、テスト不足は否めないし、
"もう少しがんばれ！"的だが、やる気低下中。
なぜなら、cordovaから撤退を考え中なり。

使い方：
0.Gistからダウンロード：https://gist.github.com/object-kazu/8629824

1.ファイル名を_cordova_betaから_cordovaに変更しておく。

2.zsh/functionsに_cordovaファイルを配置する。 

3.zshを再起動（exec zsh）。
vimを使う(2)

win向け
既に使いこなしている人は読む必要がありません。

[前回の続きです](http://qiita.com/astrsk_nakata/items/c0a8f755a54f9bcbf5c2)

# テーマが戻ってる
前回コマンドからテーマを設定しましたが、後日vimを起動してみるとデフォルトに戻ってました。
![WS000041.png](https://qiita-image-store.s3.amazonaws.com/0/19374/4d771c89-2210-a29e-9986-09b2f1d95ed3.png)
アイエェェ？ナンデ？

コマンドから変更する方法は、一時的なもののようです。
固定する方法がちゃんとあるようなので、今回はその設定をします。

# 設定ファイルを編集する
`C:\Program Files (x86)\Vim` に `_vimrc` というファイルがあるのでメモ帳で開きます。
![WS000042.png](https://qiita-image-store.s3.amazonaws.com/0/19374/0112af2b-ff05-ab54-5b9f-cff0fd2a3cbd.png)

既に何か設定されてるようですが、今回は気にしません。
最後の行に `colorscheme hybrid` と入力して保存してメモ帳を閉じます。

そしてvim起動。
![WS000043.png](https://qiita-image-store.s3.amazonaws.com/0/19374/a9adcc31-cea2-8235-9c3e-f1b0fdcf5d39.png)
よかったよかった。

# 参考サイト
http://blog.blueblack.net/item_110
【MySQL】ひらがなとカタカナ(全角、半角)の検索

あるカラムをひらがなとカタカナ(全角、半角)で検索する場合、collate utf8_unicode_ciを使うと便利。
※utf8を使用していることが前提。

```mysql:設定
alter table table_name collate utf8_unicode_ci;
```

```mysql:sql
-- これで「%すずき%」「%スズキ%」「%ｽｽﾞｷ%」が検索対象に入る。
select * from keiyaku_lists where user collate utf8_unicode_ci like '%すずき%';

```

上記をorで書くと以下のようになる。

```mysql:上記をorを使用して書いたsql
select * from keiyaku_lists where user like '%すずき%' or user like '%スズキ%' or user like '%ｽｽﾞｷ%';

```
レンタルサーバーと、開発用ローカルでDB接続を自動的に切り替える

レンタルサーバー上のPHPとMySQLを用いて、臨床試験サイトを構築しています　開発は、MAMMPを用いているのですが、ローカルでテストしたものをuploadする時に、いちいちサーバー・データを書き換えていましたが　気がついて以下のようにしました

```PHP:config.php
if ($_SERVER['SERVER_NAME'] === 'www.hogehoge.org') {
	$db_host = '127.0.0.1';
	$db_user = 'kogekoge';
	$db_password = 'legelege';
	$site_url = 'https://www.hogehoge.org/megemege/';
} elseif ($_SERVER['SERVER_NAME'] === 'localhost') {
	$db_host = 'localhost';
	$db_user = 'root';
	$db_password = 'negenege';
	$site_url = 'localhost/megemege/';
} else {
	die('illegal connection<br />');
}

$db_name = 'rapandbeat';
```

これで PDOを用いて
[PHPでデータベースに接続するときのまとめ](http://qiita.com/mpyw/items/b00b72c5c95aac573b71 "PHPでデータベースに接続するときのまとめ")にあるように

```PHP:main.php
require_once("config.php");

//接続
try {
// MySQLサーバへ接続
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name;charset=utf8", $db_user, $db_password);
// 注意: 不要なspaceを挿入すると' '.$db_host のようにみなされ、エラーとなる
} catch(PDOException $e){
    	die($e->getMessage());
}
```

とすることでローカルとレンタルサーバーの自動振り分けが可能となりました　ちなみに、new PDOの中の引数で、読みやすくなるだろう、との配慮から myslq:host= $db_host;・・・・・・などとしていて、何時までたってもPDOが使えなかったことが最初ありました
このように半角スペースを挿入すると、` `.$db_host とみなされて、エラーとなっていました
Keynote.app で箇条書き項目とかを段組したときの改ページ (改段) について


出来ないと思い込んでいたが、アッサリできたので備忘録。

1. 任意のテキストボックスを選択
1. **フォーマット** &gt; **テキスト** &gt; **レイアウト** を表示
1. **段** を2以上の任意の数値にする
1. 改ページ (改段) したいトコで **メニュー** &gt; **挿入** &gt; **段組み区切り**

毎回改行を幾つか入れて改段してたので、SlideShare とかでダサいコトになってたんだけど、これで解決されるかな？
Clangのコード補完機能とシステムインクルードファイルの問題

Clangのコマンド`clang`を使うとコード補完をさせることができます。
しかし僕の環境では、多くのブログで紹介されている`clang -cc1 ...`で始まるコマンドラインを使うと、標準ヘッダファイルが見つからないと言われて失敗していました。
この問題を解決したので、記事を書きました。

[Clangのコード補完機能とシステムインクルードファイルの問題](http://yuttie.hatenablog.jp/entry/2014/02/11/151610)

解決方法について簡単に述べると、`clang -cc1 -code-completion-at=...`ではなく`clang -Xclang -code-completion-at=...`を使えばよい、ということになります。
【個人メモ】マシン上のdocker imageを速やかに全て削除したい

# docker imageを作っていると...

docker imageを作る際、何度も何度も```docker build .```を実行する。
そのうち作ったdocker imageによってディスクが圧迫されているので
docker imageを削除したい。強制削除しても問題はない。

その場合どうすればいいのかなーとググってたら
ギッハブのissueにdocker containerを全て削除するワンライナーコマンドが載っていた。

https://github.com/dotcloud/docker/issues/3258#issuecomment-31098353

```
> sudo docker ps -a | grep Exit | awk '{print $1}' | sudo xargs docker rm
```

その後、docker imageを全部削除する以下のコマンドを実行すれば良い。

```
> sudo docker rmi $(sudo docker images -q)
```
String.formatが遅い理由

[JAL6-MD5](http://qiita.com/kawasima/items/ef75f317605ce800a839) において、私の書いたコードが非常に遅いとご指摘いただいていたのですが、主な原因はClojureのformat関数にあります。

format関数は、

https://github.com/clojure/clojure/blob/clojure-1.5.1/src/clj/clojure/core.clj#L5172

```clj:core.clj
(defn format
  "Formats a string using java.lang.String.format, see java.util.Formatter for format
  string syntax"
  {:added "1.0"
   :static true}
  ^String [fmt & args]
  (String/format fmt (to-array args)))
```

という定義で、中身はJavaのString.formatそのまま呼んでいるだけです。
そして、JavaのString.formatメソッドのソース(Oracle JDK 7u10 source)をみると、

```java:String.java
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}
```

このように、これもまた java.util.Formatterを呼んでいるだけです。ということは、このFormatterにボトルネックがありそうです。String.formatを繰り返し呼ぶプログラムを動かし、プロファイルを取得してみます。

![profiler-1.png](https://qiita-image-store.s3.amazonaws.com/0/8475/36f27a24-2bbb-9651-ca7e-946f3fc51fdf.png)

さて、この結果をみると、やはり大方の予想どおりFormatter.parseメソッドが半分以上CPU時間を占めています。

http://docs.oracle.com/javase/jp/7/api/java/util/Formatter.html

↑のような様々な書式に対応するために、format引数を解析している訳ですが、そこで正規表現を使っているようです。find,groupがそこそこのCPU時間を使っています。
が、しかしそれ以上に喰っているのが、ArrayListのtoArrayメソッドです。これはArrays.copyOfをただ呼び出しているだけなのですが、ここで、コピー先の型がObject配列でない場合は、getComponentTypeが呼ばれます。が、これが比較的コストが高いようです。

```java:Arrays.java
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    T[] copy = ((Object)newType == (Object)Object[].class)
        ? (T[]) new Object[newLength]
        : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}
```

試しに、toArrayの型指定なしと、型指定ありで簡単なベンチマークを取ってみます。

```java
    public static void main(String[] args) throws Exception {
        long t1, t2;
        ArrayList list = new ArrayList<Integer>(1000);
        for (int i=0; i<1000; i++)
            list.add(i);

        t1 = System.currentTimeMillis();
        for (int i=0; i < 100000; i++) {
            list.toArray();
        }
        t2 = System.currentTimeMillis();
        System.out.println("toArray():" + (t2-t1));

        t1 = System.currentTimeMillis();
        for (int i=0; i < 100000; i++) {
            list.toArray(new Integer[0]);
        }
        t2 = System.currentTimeMillis();
        System.out.println("toArray(Integer[]):" + (t2-t1));
    }
```

実行してみると、

```
toArray():454
toArray(Integer[]):1033
```

となり、型引数を渡した方が、getComponentTypeの分だけ遅くなっていることが分かります。


それからFormatter.formatは、parseした書式にしたがい、Formatter$FormatSpecifier.printで文字列を出力しているのですが、ここは単純にStringBuilderでappendしていくだけで、ボトルネックっぽいものは見当たりませんでした。



さて、String.formatを繰り返し呼んだ場合でも、前述のとおり毎回Formatterがnewされます。プロファイル結果をみると、ここのコストも馬鹿にならなさそうです。中身をみるとほとんどが、DecimalFormatSymbols.getInstanceに費やされていることが分かります。
Formatterをnewするとロケールに応じたCurrencyなどのインスタンスも作られるので、これも結構コストの高い処理になっています。したがって、繰り返し呼ぶ場合は、少なくともFormatterは使いまわした方がよさそうです。

ということで、まとめると、

* 性能が要求される箇所では、format関数/String.formatを使わない方が良い。
* 書式に応じた出力が必要な場合でも、String.formatを使わずに、可能であれば自分でFormatterをnewして使いまわした方が良い。

ということです。Clojurianのみなさま、お騒がせして申し訳ありませんでした。
Mac OS X ターミナルで別のボリュームへ移動するには??

Mac OS X のターミナルでは、`ls > list.txt` のようなコマンドでカレントディレクトリ内のファイル名リストを出力できますが、対象ディレクトリに移動する前に躓いてしまいました。

対象ディレクトリが起動ディスク以外のボリュームだったのですが...

```
xxxxxx:~ username$ cd /volumes/"Macintosh HD 3"
-bash: cd: /Volumes/Macintosh: No such file or directory

```


▼「\」をスペースの前に挟むことで解決しました。

```
xxxxxx:/ username$ cd Volumes/
xxxxxx:Volumes username$ ls
Macintosh HD	Macintosh HD 2	Macintosh HD 3
xxxxxx:Volumes username$ cd Macintosh\ HD\ 3
xxxxxx:Macintosh HD 3 username$
```

##参考
changing the drive in terminal window http://forums.macrumors.com/showthread.php?t=710382
Macにインストールしたもの

### App
- Google Chrome
- BetterTouchTool
- Dropbox
- Evernote
- git
- Xcode
- Alfred 
- XtraFinder 
- AppCleaner 
- MAMP
- Photoshop
- MacVim
- Skype
- VirtualBox
- FileZilla

### Command
- wget
- nkf
- puttygen

### tool
- Homebrew
- rbenv
- node.js
- jade
- sass
- coffeescript
- bower
- grunt
- Yeoman