OmniAICreator/Qiita-1.07M huggingface dataset:
2015/03/16

#**CSS Sprite**
> CSS Spriteとは？

CSS Spriteとは、いくつかの画像を1つにまとめた画像を用意し、CSSのbackgroundプロパティを使って一部分のイメージだけを見せる事で、**HTTPリクエスト回数を減らしてサイトの読み込みを高速化する**目的で使われているCSSの小技です。Twitter,Facebook,Youtubeなどでも、小さいアイコンとかマークを表示するのに使われています。

> 活用場面

読み込みが速くなるからといって、何でもかんでも一枚画像にしちゃえばその後の更新作業などが手間なので、サイトに何度も登場する「アイコン」とか「マーク」など、汎用的な部分に使うのが良法だと思います。

> CSS Spriteを使ってみる

使用方法はいくつかあるようなのですが、今回は`<img>`の代わりにbackgroundプロパティを使って画像を表示させる方法として、画像置換をしています。

![grande_menu.jpg](https://qiita-image-store.s3.amazonaws.com/0/44158/3479ccf1-4aa6-7fd8-a684-864af1068e24.jpeg)


```html:HTML
<nav id="menu">
  <table>
    <tr>
      <td class="fair"><a href="fair/">fair</a></td>
      <td class="wedding"><a href="wedding/">wedding</a></td>
      <td class="chapel"><a href="chapel/">chapel</a></td>
    </tr>
    <tr>
      <td class="banquet"><a href="banquet/">banquet</a></td>
      <td class="items"><a href="item/">items"></a></td>
      <td class="cuisine"><a href="cuisine/">cuisine</a></td>
    </tr>
    <tr>
      <td class="report"><a href="report/">report</a></td>
      <td class="gallery"><a href="gallery/">gallery</a></td>
      <td class="access"><a href="access/">access</a></td>
    </tr>
  </table>
</nav>
```

```css:css
/*----------------------------
        -  css sprite
----------------------------*/
#menu table td a {
  display: block;
  width: 107px;
  overflow: hidden;
  height: 104px;
  white-space: nowrap;
  text-indent: 100%;
  background: url(../images/menu.png) no-repeat 0 0;
}
#menu table td.fair a {
  width: 117px;
}
#menu table td.wedding a { background-position: -114px 0px; }
#menu table td.chapel a { background-position: -224px 0; }
#menu table td.banquet a { background-position: 0 -120px;; }
#menu table td.items a { background-position: -114px -120px; }
#menu table td.cuisine a { background-position: -224px -120px; }
#menu table td.report a { background-position: 0px -230px; }
#menu table td.gallery a { background-position: -114px -230px; }
#menu table td.access a { background-position: -224px -230px; }

@media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (min-device-pixel-ratio: 2) {
    #menu td.fair a,
    #menu td.wedding a,
    #menu td.chapel a,
    #menu td.banquet a,
    #menu td.items a,
    #menu td.cuisine a,
    #menu td.report a,
    #menu td.banquet a,
    #menu td.gallery a,
    #menu td.access a{
        /* Reference the @2x Sprite */
        background-image: url(../images/menu@2x.png);
        background-size: 320px 320px;
        /* Translate the @2x sprite's dimensions back to 1x */
    }
}
```

> 検証

【メニューアイコンを`<img>`を使って直接表示させたページ】
![test01.jpg](https://qiita-image-store.s3.amazonaws.com/0/44158/62ce489c-7d65-c7b2-2b9b-46d42c1d1ff5.jpeg)

【メニューアイコンをひとまとめにした画像を使って画像置換したページ】
![test02.jpg](https://qiita-image-store.s3.amazonaws.com/0/44158/0071d72e-7321-2518-eab5-8514da3f9ee4.jpeg)

>まとめ

今回はCSS Spriteを試してみた結果、リクエスト数が減りファイルサイズも削減でき読み込み時間も早くなりました。しかし画像置換する際の注意点としては、隠しテキストがボトルネックとなりそうです。別に隠してるつもりが無くても、検索エンジンからは警戒され得るので**テキストを隠さない画像置換**を**テキストを必要としない画像だけ**にすることが賢明のようです。
テキストを隠さない画像置換テキストを必要としない画像というと、マークとかアイコン類になると思います。サイトをより良いものにする手段のひとつとして参考にしていただければと思いました。
Ruby GD2 がぜんぜん動きません！

GD2 というグラフィックライブラリがありますが、PHPでは比較的ポピュラーなようです。
Ruby でも GD2 モジュールがあるので入れてみましたが、ぜんぜん動きません。
下のエラーは、Windows 7 + Ruby 2.0.x です。

`
C:\workspace\Scripts\Ruby\GD2>ruby canvas.rb
c:/bin/ruby/lib/ruby/gems/2.0.0/gems/gd2-1.1.1/lib/gd2.rb:53: warning: else with
out rescue is useless
c:/bin/ruby/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:110:in `require':
 c:/bin/ruby/lib/ruby/gems/2.0.0/gems/gd2-1.1.1/lib/gd2.rb:46: syntax error, une
xpected ':', expecting keyword_then or ',' or ';' or '\n' (SyntaxError)
          when ?D: 8
                  ^
c:/bin/ruby/lib/ruby/gems/2.0.0/gems/gd2-1.1.1/lib/gd2.rb:180: syntax error, une
xpected keyword_end, expecting end-of-input
        from c:/bin/ruby/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:110:
in `rescue in require'
        from c:/bin/ruby/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:35:i
n `require'
        from canvas.rb:4:in `<main>'

C:\workspace\Scripts\Ruby\GD2>
`

もしかしたら、Linux じゃないとだめなのかと思って、Ubuntu 14.04LTS でやってみましたが、やはりダメです。

`
ubuntu@ip-172-31-11-130:~/workspace/ruby/GD2$ sudo gem install gd2
Fetching: gd2-1.1.1.gem (100%)
Successfully installed gd2-1.1.1
1 gem installed
Installing ri documentation for gd2-1.1.1...
Installing RDoc documentation for gd2-1.1.1...
ubuntu@ip-172-31-11-130:~/workspace/ruby/GD2$ vi test.rb
ubuntu@ip-172-31-11-130:~/workspace/ruby/GD2$ ruby test.rb
/var/lib/gems/1.9.1/gems/gd2-1.1.1/lib/gd2.rb:53: warning: else without rescue is useless
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:60:in `require': /var/lib/gems/1.9.1/gems/gd2-1.1.1/lib/gd2.rb:46: syntax error, unexpected ':', expecting keyword_then or ',' or ';' or '\n' (SyntaxError)
          when ?D: 8
                  ^
/var/lib/gems/1.9.1/gems/gd2-1.1.1/lib/gd2.rb:180: syntax error, unexpected keyword_end, expecting $end
        from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:60:in `rescue in require'
        from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:35:in `require'
        from test.rb:3:in `<main>'
ubuntu@ip-172-31-11-130:~/workspace/ruby/GD2$
`

テストプログラムの内容ですが、たったこれだけです。
`
 #!/usr/bin/ruby
 # coding: utf-8
 require 'gd2'
`

ググってみても情報があまりありませんね。
ただ、そのままではダメというのがありました。GD2 のコードをちょっといじったら起動したみたいですが、それでも警告が出てそのまま使うのは問題のようです。
[和訳] Amazon DynamoDB のパーティションの挙動を理解する

本記事はAmazon DynamoDBの[Developer Guide](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)の中で述べられている[Understand Partition Behavior](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.Partitions)の翻訳です。

なお、本投稿は私が個人的に訳したものであり所属する企業や団体における公式見解ならびに公式発表ではございません。

----

### パーティションの挙動を理解する

DynamoDBはパーティショニングを自動的に行います。テーブルのサイズが大きくなれば、新しくパーティションを追加します。作成されたテーブルのパーティション数について、スケールおよびアクセスパターンを元に、ご自身でお見積もりいただくことができます。これによってアプリケーションにとってベストなテーブルデザインを行う事が可能になります。

パーティション数は基本的にテーブルのストレージサイズおよび provisioned throughput によって決まります。

**テーブルサイズからのパーティション数算出**

・ *numPartitionstableSize = tableSizeInBytes / 10 GB*

テーブルのサイズはパーティション数決定における1つの要素になりますが、他の要素としては provisioned throughput 要件が挙げられます。DynamoDBでは各パーティションにつき、MAXで 3000 read capacity units もしくは 1000 write capacity units を割り当てる事が可能です。

**provisioned read および write throughputからのパーティション数算出**

・ *numPartitionsthroughput = ( readCapacityUnits / 3000 ) + ( writeCapacityUnits / 1000 )*

例えば、 1000 read capacity units および 500 write capacity units を設定した場合、numPartitionsthroughputは: 

<pre>( 1000 / 3000 ) + ( 500 / 1000 ) = 0.8333</pre>

となります。1つのパーティションでテーブルに設定された provisioned throughput をまかなうことが可能です。

但し、もし1000 read capacity units および 1000 write capacity unitsという設定を行った場合、numPartitionsthroughput は1パーティションのキャパシティを超えます:

<pre>( 1000 / 3000 ) + ( 1000 / 1000 ) = 1.333</pre>
この場合、2つのパーティションが必要になります。それぞれにおいて 500 read capacity units および 500 write capacity units が処理されます。

DynamoDBによってアロケートされるパーティション数は、実際のテーブルサイズもしくは設定した provisioned throughput よりも大きくなります:

**DynamoDBによってアロケートされるパーティション数**

・ *numPartitionstotal = MAX ( numPartitionstableSize | numPartitionsthroughput )*

1つのパーティションは約10GBのデータを保持します。テーブルのサイズが10GBを超えると、DynamoDBはパーティションを追加してデータを配置します。それに応じてテーブルのreadおよびwriteキャパシティも分配します。つまり、テーブルのデータサイズが成長するにつれて、各パーティションの provisioned throughput は低くなっていきます。

テーブルのサイズが成長していき500GBになった場合、パーティション数はおおよそ50程度になります。

<pre>500 GB / 10 GB = 50 partitions</pre>
ここで 100,000 read capacity units をテーブルに設定した場合、各パーティションあたりのread capacityは以下のようになります: 

<pre>100,000 read capacity units / 50 partitions = 2000 read capacity units per partition</pre>

**Note**
将来的にこれらのパーティショニングに関する仕様は変更される可能性があります。
【Sublime】Sublime Text 2 - Package List

# Sublime Text 2 Package List
Sublime Text 2のお勧め（便利）のPackage Listを紹介します。

## Sublime Text 2 Package List
基本的な動作（Markup）に必要なPackage

```lang:ConvertToUTF8-master
文字化けを防ぐプラグイン
Shift_JISのファイルを開く際にUTF-8に変換して保存するときにShift_JISに戻す。
Shift_JIS以外にEUC等にも対応しています。
```

```lang:HTML5
HTML5の自動補完HTML5のスニペット集と自動補完とハイライト。
```

```lang:jQuery
jQueryの自動補完
```

```lang:IMESupport
Windows版では、テキスト入力時におけるIME変換ウィンドウの表示位置がおかしくなる問題がある。
通常なら入力位置の下部あたりに表示されるがウィンドウの下部などに飛んでしまう。
```

```lang:EmmetCssSnippets
CSSの自動補完
```

```lang:AutoFileName
imgタグのパスを入力する際のファイル名を補完
```

> **※注意**
packageは便利だが入れすぎるとショートカットキーがバッティングして動かなくなる



Packageは他にもいっぱいあるのでここからは便利なPackageを紹介します。

```lang:RecentActiveFiles
最近開いたファイルをリスト表示してくれる。
消した後にもう一回開きたい時等にオススメ。
```

```lang:BracketHighlighter
タグやクォーテーションの開始/終了をハイライトしてくれます。
```

```lang:CTags/SublimeCodeIntel
コードジャンプできるが重い！しかも設定が面倒。
```

```lang:SublimeLinter
構文エラーをリアルタイムでチェックしてくれる凄いやつ。
Sublime Text 2だと重いが、3だと進化してるらしい。
```

```lang:LESS
LESSのシンタックスハイライト。
```

```lang:TrailingSpaces
末尾にスペースが入っている時にハイライトしてくれ、保存する時に削除してくれます。地味だけど、オススメ。
全角スペースにもハイライト表示適用できるみたいです、ただし設定が必要。
```

```lang:LiveReload
ファイルを保存すると、ブラウザで自動更新してくれる。
各ブラウザのエクステンションのインストールも同時に必要だが、２画面で作業している場合時にいちいち開いてブラウザ更新しなくて良くなる。
```

```lang:MarkdownPreview
markdownをブラウザでプレビューする。
```

```lang:DocBlockr
関数コメント？Function Referenceを自動記述してくれる嬉しいプラグイン。 
使い方は、ただ関数の上で /**を記述した後にエンターするだけ。
```

```lang:Autoprefixer
ベンダープレフィックスの調整できたり、ブラウザのバージョン指定が可能。
```

```lang:FindKeyConflicts
プラグインを増やすとショートカットキーがバッティングすることがあります。
衝突を避けるためにFindKeyConflictsで確認、修正大事。
```

```lang:SideBarEnhancements
サイドバーの右クリックメニューを便利にする。
```
Janetter for Windows のTwitter認証回数制限を回避する方法

![alt](http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20141021/20141021152127.jpg)

何かと便利な Janetter for Windows。お気に入りのTwitterクライアントな訳だが、困った事に、新規アカウント登録は、Twitter認証回数制限の影響で、出来ません。他のTwitterクライアントも考えたのですが、なかなか良いものを見つけられず...

仕方が無いので、検索してみたら、

[新規利用でもJanetterの認証制限を回避して使う方法。（追記あり） - 全力わはー](http://d.hatena.ne.jp/tales/20140511/1399796908" data-mce-href="http://d.hatena.ne.jp/tales/20140511/1399796908)

と、いう情報に行き着く。これは良いよ!

と、言うわけサクッと対応してみた。新規アカウント登録出来ますね。良かった。

何かよく分かりませんがここに置いときますね。[直リン(って懐かしい言葉だな)ダウンロード](http://twc.xrea.jp/tool/janefix.zip)
3年戦える!? ThinkPad X1 Carbon Japan Limited Edition 2015 Gen 3 を買いました

#### Lenovo ThinkPad X1 Carbon Japan Limited Edition 2015 Gen 3

Lenovo ThinkPad X1 Carbon Japan Limited Edition に抽選に当たったので、買いました。500台限定という事で、問題のシリアル番号ですが...

![alt](http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20150302/20150302133253.jpg)

じゃじゃーん。499/500!! 素晴らしい。中途半端な数でもなく、500番でも無いという、499!いいね!

で、499という事で、「オークションで高く売れるかな!?」と思ったけど、奥さんに「せっかく、限定品を買ったんだから、大切に使えば!?」と言われたので、使うことにしました。

#### Lenovo ThinkPad X1 Carbon Japan Limited Edition 2015 Gen 3 スペック

* ベース:Lenovo ThinkPad X1 Carbon Japan Limited Edition 2015 Gen 3
* CPU: [Intel Core i7-5500U (最大3GHz, 4MB)](http://ark.intel.com/ja/products/85214/Intel-Core-i7-5500U-Processor-4M-Cache-up-to-3_00-GHz)
* OS:Windows 8.1 Pro 64bit
* ディスプレイ: 14インチWQHD(2560x1440) IPS液晶パネル タッチ式
* グラフィック: Intel HD Graphics 5500 8GB (24 cores – 0.95 GHz)
* メモリ: 8GB 1600MHz DDR3L RAM (Dual Channel)
* キーボード: 日本語キーボード
* ポインティングデバイス: TrackPoint + 5ボタントラックパッド + 指紋センサー
* SSD: 512GB PCIe×4 SSD
* ネットワーク: Intel Dual Band Wireless-AC 7265 + Bluetooth 4.0
* ネットワーク: 内蔵Bluetooth 4.0
* 保守サービス: ThinkPad3年間 当日オンサイト修理サービス
* バッテリーライフ:最大約18時間
* 質量: 約1.44kg

現時点で、サブPCとして ThinkPad T440p を持っているのだが、ちょっと不満があったんだよねーそれは、「持ち運びが出来る重さを超えている」です。基本的に、会社にパソコンは持ち込めないので、常時携帯する訳では無いけど、何かの時に「サクッと」持ち運べるって重要! T440pの場合、2kgオーバーなのでそれは無理。以前使っていたX201sの携帯性を考えると、ThinkPad X1 Carbon 2015は良いのかな～と。

##### ThinkPad T440pの不満点

T440pの不満として、右クリック問題。もうね、反応しないの。何回も押しちゃうの。そのたびに「はあ」ってため息が。まあ、USB/BTマウスを使えば良いんだけど、ThinkPointの良さがあるので、右クリックがなーと。

ThinkPad X1 Carbon 2015の場合、クリックボタンが独立キーになり、反応問題は一切無し!もう、これだけで5万円ぐらいの価値はありそう。

#### ThinkPad X1 Carbon 2015の良さ

ThinkPad X1 Carbon 2015のウチの一つとして、PCIe4.0対応SSDがあります。これ、マジで早い。HDD/SSDはコンピュータの足回りなので、ちょっとした事で遅さが気になったりする。たぶん、これまでパソコンを使ってきた中で、一番速いデバイスなので、これは興奮しますね。

![alt](http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20150302/20150302133739.png)

#### ドラゴンクエストX(ドラクエ10)ベンチ

では、一番重要(?)なドラゴンクエストX(ドラクエ10)ベンチを(^^)/

![alt](http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20150302/20150302133810.png)

* 1987 : 1920x1080 最高画質 フルスクリーン
* 2826 : 1920x1080 標準画質 フルスクリーン
* 3341 : 1920x1080 低画質 フルスクリーン
* 3820 : 1280x720 最高画質 フルスクリーン
* 4993 : 1280x720 標準画質 フルスクリーン

T440pのNVIDIA GeForce GT730Mより、ベンチマーク的に劣りますが、オンチップな Intel HD Graphics 5500 でも結構頑張っていると思います。ThinkPad X1 Carbon Japan Limited Edition 2015の場合、解像度が 14インチWQHD(2560x1440) なので、1920x1080のフルスクリーンでも、拡大表示(?)されます。だから、「完全にクリアーな表示」ではありません。そう考えると、1280x720 最高画質 フルスクリーンでも、良いのかな～と思ってみたり。

#### 最後に

ThinkPad X1 Carbon Japan Limited Edition 2015は、Lenovoの格安クーポンを利用しても、30万円オーバーになり、(総額52万円(だったかな?)からの割引でした)最新CPUと超高速SSDでフルスペックモバイルノートになっていると思います。今後も可愛がりますよ!

#### 追記1

持ち運んでみた。1.4kgって事でもっと"ずっしり"感があるかと思ったが、本体が薄いので、そういう印象はなし。あと、Windows 8.1+BIOS(UEFI)って、起動がバカみたいに速くで素敵。たぶん、PCIe4.0対応SSDの影響もあると思うけど。

#### 参考URL

* [ThinkPad X1 Carbon 2015年モデルの実機レビュー - the比較](http://thehikaku.net/pc/lenovo/15ThinkPad-X1-Carbon.html)
* [レノボが新ThinkPad X1 Carbonを国内発表。NEC PC米沢工場での生産開始を記念した500台の日本限定モデルも用意 - Engadget Japanese](http://japanese.engadget.com/2015/01/13/thinkpad-x1-carbon-nec-pc-500)
* [Lenovo ThinkPad X1 Carbon Gen 3 Review | Think.Scopes](http://www.thinkscopes.com/blog/2015/01/06/lenovo-thinkpad-x1-carbon-gen-3-review-2/)
Atomで言語ごとのTab Lengthを変更する

phpはtab lengthを4にしたかったので、変更してみました。

 - Preference -> Packages
 - 「language-php」で検索
 - core packagesのlanguage-phpのsettings
 - Tab Lengthを4に

で変更出来ます。
他の言語も「language-????」で探せると思います。
Ruby + SQlite3 で LoadError

Windows 版 Ruby 2.0.x で gem install sqlite3 で sqlite3 モジュールをインストールしてテストしていたら、**LoadError sqlite3** となって動作しなくなりました。

ググってみると、けっこう**この症状が出ている**ようですが、対処方法が玉石混合でこれと言った決定版がないように見えます。

自分の場合は、 いったん sqlite3 モジュールをアンインストールして sqlite3-ruby を入れてみました。・・・が同じ症状が継続です。
sqlite3-ruby もアンインストールして再び sqlite3 モジュールを入れてみたらなぜか復活。
これって何なんでしょうね。

※ 最新版 Ruby 2.2.x (2015/3現在) では、sqlite3 モジュールがぜんぜん動きませんでした。
まだ、未対応なんでしょうかね。
FormDataでappendしたら''append' called on an object that does not implement interface FormData."とでる理由

jqueryを使っているから。
processData: false,
contentType: false,
を設定する。

```
$.ajax({
    url : "/upload.php",
    type: "POST",
    data : postData,
    processData: false,
    contentType: false,
    success:function(data){
        //success
    },
    error: function(jqXHR, textStatus, errorThrown){
        //fail   
    }
});
```
zendframework2のFlickrライブラリflickr.photos.searchのエラー対処

zendframework2のFlickrメソッド
本家内の以下のメソッドを指定すると
今のままだとレスポンス400が返ってきて画像を取得することができません。
http://framework.zend.com/manual/current/en/modules/zendservice.flickr.html

```
$results = $flickr->tagSearch("php");

```

そこで以下が対処方法となります。
対象ファイル
ZendService->Flickr->Flickr.php

``` Flickr.php
const URI_BASE = 'https://wwww.flickr.com/services/rest/';
```
から

``` Flickr.php
const URI_BASE = 'https://api.flickr.com/services/rest/';
```
windows > デスクトップを表示 > [Windowsキー]+D

結構よく使う「デスクトップを表示」。よく使うので、ショートカットを覚えた方がよさそう。

    [Windowsキー]+D
を押すとデスクトップが表示される。

もう一度押すとデスクトップ表示が解除される。
content-type大文字小文字


# 問題
* HTTPヘッダーに、content-typeが、大文字か？　小文字か？

# 調査
* 関する質問：http://stackoverflow.com/questions/5258977/are-http-headers-case-sensitive
 * Field names are case-insensitive. 
 * 修正： http://tools.ietf.org/html/rfc1945に変更された
* 日本語
 * http://pentan.info/doc/rfc/j1945.html

```
4.2 メッセージヘッダー
   HTTP header fields, which include General-Header (Section 4.3),
   Request-Header (Section 5.2), Response-Header (Section 6.2), and
   Entity-Header (Section 7.1) fields, follow the same generic format as
   that given in Section 3.1 of RFC 822 [7]. Each header field consists
   of a name followed immediately by a colon (":"), a single space (SP)
   character, and the field value. Field names are case-insensitive.
   Header fields can be extended over multiple lines by preceding each
   extra line with at least one SP or HT, though this is not
   recommended.
HTTPヘッダ分野(一般ヘッダー(セクション4.3)、Request-ヘッダー(セクション5.2)、Response-ヘッダー(セクション6.2)、およびEntity-ヘッダー(セクション7.1)分野を含んでいる)はRFC822[7]のセクション3.1におけるそんなに与えられるのと同じジェネリック形式に続きます。 各ヘッダーフィールドがすぐコロンがあとに続いた名前から成る、(「:」、)、シングルスペース(SP)キャラクタ、および分野値。 フィールド名は大文字と小文字を区別しないです。 ヘッダーフィールドはそれぞれの付加的な系列に先行することによって、達せられた倍数が少なくとも1SPかHTと共に立ち並んでいます、これが推薦されませんがことであるかもしれません。
```

# 結論
* フィールド名は大文字と小文字を区別しないので、content-typeが、大文字と小文字を区別しない。
最小構成のGoogle Chrome拡張を作る


Google Chrome拡張を作るには少なくとも`manifest.json`が必要です。

## `manifest.json`を作る

次のような`manifest.json`を作ります。

```json
{
  "name": "Sample",
  "version": "1",
  "manifest_version": 2,
  "description": "This is sample"
}
```

## Google ChromeでGoogle Chrome拡張を読み込む

1. Google Chromeで`chrome://extensions/`を開く
1. 右上の`デベロッパー モード`にチェックを入れる
1. `パッケージ化されていない拡張機能を読み込む...`ボタンを押す
1. `manifest.json`を入れたフォルダを開く

## 参考リンク
- [Google Chrome拡張の作り方（その1：マニフェストファイル作成とパッケージ化）: 小粋空間](http://www.koikikukan.com/archives/2014/06/03-012345.php)
- [Chrome拡張開発: Hello Worldするだけの拡張を作りたい - Qiita](http://qiita.com/suin/items/2b31079056f1356257cb)

## 合わせて読みたい
- [Google Chrome拡張で特定のページで動くJavaScriptを書く](http://qiita.com/ledsun/items/cad13deac0bc2fe35b1e)
find と xargs

## はじめに

とあるディレクトリ群に対し、一括で同ファイルを置く必要があった

条件

* /〇〇〇/△△△/ 直下のディレクトリ
* シンボリックリンクは含まない
* 特定の PATTERN に合致するディレクトリは除く

```
find /〇〇〇/△△△/ -maxdepth 1 -mindepth 1 -type d ! -type l ! -regex 'PATTERN' -exec cp /◇◇◇/☆☆☆/hoge.php {}/fuga.php \;
```

今回 find の exec オプションを使用し、目的は達成した。
しかし、「xargs を使った時との違い、分かってる？」 と聞かれ、微塵も知らなかったので調べてみた。

## 結論

xargs 使いましょう(｀・ω・´)

## find コマンド

### print0 オプション

man find

```
-print0
True; print the full file name on the standard output, followed by a null character (instead of the newline character that -print uses).
This allows file names that contain newlines or  other  types of white space to be correctly interpreted by programs that process the find output.
This option corresponds to the -0 option of xargs.
```

つまり、ファイルの区切り文字を null として扱ってくれる。
そして xargs の -0 に対応しているとのこと

## xargs コマンド

### 0 オプション

man xargs

```
-0
Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally).
Disables the end of file string, which is treated like any other argument.
Useful when input items might contain white space, quote marks, or backslashes.
The GNU find -print0 option produces input suitable for this mode.
```

## 参考

ここに全て書いてありました

xargs
http://ja.wikipedia.org/wiki/Xargs

findとxargsの基本的な使い方
http://www.xmisao.com/2013/09/01/how-to-use-find-and-xargs.html
GISで使う経緯度の基礎知識とかTIPSとか

# 基礎知識

|日本語|英語      |範囲|
|:---:|:-------:|:---:|
|経度  |longitude|西経180° 〜 0 〜 東経180°<br/>-180° 〜 0 〜 +180°|
|緯度  |latitude |南緯90° 〜 0 〜 北緯90°<br/>-90° 〜 0 〜 +90°|

一般的にシステム内では西経・南緯を負、東経・北緯を正の値で表す。

# 省略形

経度=lon、緯度=latが一般的。
経度はlngとする宗派も存在する。

# 表記順序

一般的に2次元座標はx(横軸), y(縦軸)の順で表記するが、経緯度の場合は緯度・経度の場合も経度・緯度の場合もあるので注意が必要。

# 表記方法

|表記名|表記例|
|:-:|:-:|
|DMS形式(60進表記)|北緯35度30分36秒<br/>N35°30'36''|
|DMM形式|北緯35度30.600分<br/>N35°30.600'|
|DEG形式(10進表記)|35.51|
|ミリ秒形式|127836000|

### DMS形式(60進表記)

度(Degree)・分(Minute)・秒(Second)の３つの数値で表記する方法。
1分は1/60度、1秒は1/60分=1/3600度。
秒は小数点以下でミリ秒まで表記する場合もある。

人間様が見る為の表記方法であり、システム的には３つの数値(あるいは1つの文字列)として扱うことになるのであまり向かない。

### DMM形式

度(Degree)・分(Minute)の2つの数値で表記する方法。
秒は分に換算して小数点以下の数値で表す。

```
北緯35度30分36秒 = 35度 + 30分 + 36/60分
               = N35°30.600'
```

### DEG形式(10進表記)

度(Degree)のみの表記方法。分と秒は度に換算して小数点以下の数値で表す。

入力パラメータ等の外部とのインターフェイスで使用されることが多い。
位置情報に対応したデータベース等でも使用される。

```
北緯35度30分36秒 = 35 + 30/60 + 36/3600
               = 35.51度
```

### ミリ秒形式

度・分・秒をミリ秒に換算した値。

整数として扱うのでシステム内部で計算を行う際に使われる事が多い。

```
北緯35度30分36秒 = (35*3600 + 30*60 + 36) * 1000
               = 127836000ミリ秒
```

# 日本の範囲

日本の大まかな経緯度の範囲。
覚えておくと経度と緯度を取り違えるというミスが減る。

|表記方法|DEG|ミリ秒|
|:--:|---:|---:|
|東端 |154|554,400,000|
|西端 |122|439,200,000|
|南端 | 20| 72,000,000|
|北端 | 46|165,600,000|

参考

- [日本の東西南北端点の経度緯度｜国土地理院](http://www.gsi.go.jp/KOKUJYOHO/center.htm)

# 測地系について

測地系自体の説明は[Wikipedia](http://ja.wikipedia.org/wiki/%E6%B8%AC%E5%9C%B0%E7%B3%BB)等を見てもらうとして、ここで伝えておきたいのは**測地系が違うと同じ場所であっても経緯度が異なる**ということ。

どこかから仕入れた位置情報のデータを自分のシステムに取り入れた時に場所が数百メートルずれていたら、測地系が違うデータだと思ったほうがいい。

その時には入手した位置情報の測地系を変換しなければならないので、自分の使っている測地系と入手した情報の測地系を把握しておく必要がある。
Method Reference in Swift

Java8の [method reference](http://www.ne.jp/asahi/hishidama/home/tech/java/methodreference.html) 相当のものかなと思ったのですが、ちょっと違いそうです。クラスメソッドはともかく、インスタンスメソッドのほうは単なるカリー化なので使い所が難しいですね。

また、プロパティの参照には使えないので（算出プロパティはメソッドの糖衣構文であるにもかかわらず！）、やはり使い道はなさそう…。普通にクロージャを使いましょう。

```swift
// クラスメソッドの参照
let stringFromCString = String.fromCString
stringFromCString([102, 111, 111, 0]) // "foo"


// インスタンスメソッドの参照
let f = String.hasPrefix
f("foo bar")("foo") // "foo bar".hasPrefix("foo")とおなじ: true
f("foo bar")("bar") // "foo bar".hasPrefix("bar")とおなじ: false

(0 ..< 10).map(Int.advancedBy(10)) // [10, 11, 13, ... 19]
```
多次元配列要素の宣言と参照の基本 覚書

いつも忘れちゃうのでメモ。
良い覚え方があればいいんだが。。

```main.d
int[3][2] foo = [
  [1, 2, 3],
  [4, 5, 6]
];

void main()
{
  assert(foo[0][2] == 3);
}
```
[Intellij IDEAヘルプ 日本語訳] デフォルト設定へのアクセス

元ページ: Accessing Default Settings https://www.jetbrains.com/idea/help/accessing-default-settings.html

# デフォルト設定へのアクセス

IntelliJ IDEAはデフォルトプロジェクトの**設定**と**構造**定義を手助け(help)する。
これらの設定はあなたが新しいプロジェクトを作成するときにつねにデフォルトとして使用される。

## デフォルトプロジェクト設定へのアクセス

1. メインメニューから、File | Other Settings | Default Settings を選択。
2. 開いた[Settings](https://www.jetbrains.com/idea/help/settings-preferences-dialog.html)ダイアログから必要な設定を定義。

## デフォルトプロジェクト構造へのアクセス

1. メインメニューから、File | Other Settings | Default Structure を選択。
2. 開いた[Project Structure](https://www.jetbrains.com/idea/help/project-structure-dialog.html)ダイアログから必要な設定を定義。

# 関連翻訳

* [IntelliJヘルプ翻訳に関する投稿 - Qiita](http://qiita.com/tags/intellij%e3%83%98%e3%83%ab%e3%83%97%e7%bf%bb%e8%a8%b3)
[Intellij IDEAヘルプ 日本語訳] 設定のインポートとエクスポート

元ページ: [Exporting and Importing Settings](https://www.jetbrains.com/idea/help/exporting-and-importing-settings.html)

# 設定のインポートとエクスポート

IntelliJ Ideaでは作業環境を保存・共有することができる。
あなたはあなたの好むIDE設定を保存・格納したり、設定ファイルをバージョン管理下に置くことであなたの同僚がそれを利用可能にできる。
一方、あなたは他のチームメンバーが定義した設定やあなた自身が定義した設定を異なる使い方のために使用することができる。
このセクションでは以下のことをどのように行うか説明する:

* JARアーカイブとして設定をエクスポート
* JARアーカイブから設定をインポート

## IDE設定をJARアーカイブへエクスポート

1. メインメニューから File | Export Settings を選択。
2. 開いた**Export Settings**ダイアログボックス内でエクスポートしたい設定をチェックボックスを選択することでしている。デフォルトでは、すべての設定が選択されている。
3. **Export settings to**テキストボックス内で、対象のアーカイブの完全修飾名(fully qualified name)を指定する。パスをマニュアルで入力するか**Browse**ボタンをクリックして対象ファイルを[開くダイアログ](https://www.jetbrains.com/idea/help/select-path-dialog.html)の中から指定する。

## JARアーカイブから設定をインポート

1. メインメニューから File | Import Settings を選択。
2. 開いた**Import File Location**ダイアログ内で対象のアーカイブを選択する。
3. 開いた**Select Components to Import**ダイアログボックス内でインポートしたい設定を指定し、OKをクリックする。デフォルトでは、すべての設定が選択されている。

# 関連翻訳

* [IntelliJヘルプ翻訳に関する投稿 - Qiita](http://qiita.com/tags/intellij%e3%83%98%e3%83%ab%e3%83%97%e7%bf%bb%e8%a8%b3)
[Intellij IDEAヘルプ 日本語訳] プロジェクトをバージョン管理する

元ページ: [Managing Projects Under Version Control](https://www.jetbrains.com/idea/help/managing-projects-under-version-control.html)

# プロジェクトをバージョン管理する

このセクションはIntelliJ IDEAプロジェクトファイルを他の開発者と共有する方法に関する情報を含む。

## ディレクトリベースのプロジェクトフォーマット

プロジェクト設定は**.idea**ディレクトリに保存される。
このフォーマットはすべての最近のIntelliJ IDEAバージョンにおいてデフォルトで使用される。
ここであなたが共有する必要のあるものは:

* プロジェクトルートの**.idea**ディレクトリにあるすべてのファイル、ただしユーザー固有情報を格納する**workspace.xml**と**tasks.xml**は除く。
* 異なるモジュールディレクトリに存在する可能性があるすべての**.iml**モジュールファイル

## 旧来のプロジェクトフォーマット

プロジェクト設定は**.ipr/.iml/.iws**ファイルに保存される。

**.ipr**ファイルとすべての**.iml**モジュールファイルを共有し、**.iws**ファイルはユーザー固有設定を含むため共有しない。

## 実行/デバッグ設定の共有

あなたは[実行/デバッグ設定](https://www.jetbrains.com/idea/help/run-debug-configuration.html)を共有したいかもしれない。
それをするためには、[実行/デバッグ設定ダイアログボックス](https://www.jetbrains.com/idea/help/run-debug-configurations.html)で**Share**チェックボックスを選択状態にするだけでよい。

ローカル用実行/デバッグ設定が**.idea\\workspace.xml**内に保持されるのに対して、共有された実行/デバッグ設定は**.idea\\runConfigurations**ディレクトリ下に独立したxmlファイルとして保持される。

## インスペクションプロファイルの共有

インスペクションプロファイルを共有するためには、*Settings*ダイアログ内[Inspections](https://www.jetbrains.com/idea/help/inspections.html)ページの*Share profile*チェックボックスを選択状態にする。

ローカル用プロファイルが**.idea\\workspace.xml**に保持されるのに対して、共有されたインスペクションプロファイルは**.idea\\inspectionProfiles**ディレクトリ下に独立したxmlファイルとして保存される。

## プロジェクト設定ファイルの共有

[Project and IDE Settings - IDE Settings](https://www.jetbrains.com/idea/help/project-and-ide-settings.html#d1395397e155)の後半部分と完全に同じであるため、訳は[同ページの翻訳](http://qiita.com/bigwheel/items/5ac690a722ccf9661090#ide%E8%A8%AD%E5%AE%9A)を参照。

## 警告

以下を共有することについては注意すること:

* サインされたビルドを製造するAndroidアーティファクト(keystoreパスワードを含んでいるだろうから)
* **dataSources.ids**、**datasources.xml** - これらのファイルはデータベースパスワードを含んでいる可能性がある。

あなたは以下を共有しないことを見当するかもしれない:

* gradle.xmlファイル。
* ユーザー辞書ディレクトリ、他の開発者が同じ名前を使用している場合にコンフリクトすることを避けるため。

# 関連翻訳

* [IntelliJヘルプ翻訳に関する投稿 - Qiita](http://qiita.com/tags/intellij%e3%83%98%e3%83%ab%e3%83%97%e7%bf%bb%e8%a8%b3)
proxmoxからnfsマウント失敗する場合の対処

バックアップ先をnfsにしていた場合、バックアップされていなかった。
調査したところnfsマウントが外れていた。

![スクリーンショット 2015-03-16 4.49.59.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c1b09044-326c-478e-06f9-5bf5922a5a46.png)

WebUIだけでは解決しなかったので以下実施。

## 原因

proxmox側でnfsマウントを解除せずにnfsサーバをOS入れ替えの再セットアップを行った。
proxmox側で再度nfsマウントし一見問題なさそうに見えたが、前のnfsマウント情報が残っていて、nfsマウントに影響が出ていた様子。

## 対処

```bash:nfsマウントが外れている場合
# df -h
df: `/mnt/pve/nfs2tb': Stale NFS file handle
df: `/mnt/pve/nfs2tb2': Stale NFS file handle
```

もしくはプロンプトが帰ってこない。

```bash:umount
# umount -f /mnt/pve/nfs2tb
# umount -f /mnt/pve/nfs2tb2
```

```bash:ディレクトリ削除
# ls /mnt/pve/
nfs2tb  nfs2tb2
# rmdir /mnt/pve/nfs2tb/
# rmdir /mnt/pve/nfs2tb2/
```

再度WebUIからStorageの追加をすればよい。
ubuntuにsshで接続する

自宅にあるubuntu機はディスプレイを置くスペースがないため、ssh接続で開発ができるようにする。今回はwindowsからubuntuに接続できるようにする。
※自分用メモのためかなり端折ります。。。

#PC環境
- thinkpad X220(corei7-2620M/4GB) Windows7 64bit Professional
- mac mini (core2duo/2GB) ubuntu 14.04 LTS 32bit

#設定
ubuntuの端末でssh接続を許可できるよう以下のコマンドを入力する。

```
$sudo apt-get install openssh-server
```

opensshインストール後にubuntu本体のipアドレスを調べる。

```
$ifconfig
```

今回は自動的にipアドレスが「192.168.11.2」だったため、windowsに戻りteratermで以下のように入力する。

![接続設定.png](https://qiita-image-store.s3.amazonaws.com/0/68442/23fbe0ba-1b6b-ccef-dc94-3f2b2d3d61c7.png)

ユーザとパスワードはubuntuに設定してある通りでOK。
問題なければ以下のように接続完了となる。
※一応ボカシ入れてます。。。

![ログイン完了.png](https://qiita-image-store.s3.amazonaws.com/0/68442/d6d7bfd7-3a8c-56b3-e113-5017c6544712.png)


これでディスプレイがないmac miniでも十分な開発ができるようになるはず。
後はipアドレスを固定にしておくことでいつでも自宅内でのアクセスができるようになります。
[Intellij IDEAヘルプ 日本語訳] プロジェクト設定とIDE設定

元ページ: [Project and IDE Settings](https://www.jetbrains.com/idea/help/project-and-ide-settings.html)

# プロジェクト設定とIDE設定

## 概要

あなたの好きな環境を定義するための設定には2つの種類がある:

* **プロジェクト設定**, プロジェクトごとに適応される。
* **IDE設定**, すべてのプロジェクトで共有され、プロジェクトとは独立した観点で参照される。

## プロジェクト設定

プロジェクト設定はそれぞれのプロジェクトごとに**xml**ファイルの集合として**.idea**ディレクトリの下に保存される。
もしあなたが[デフォルトプロジェクト設定](https://www.jetbrains.com/idea/help/accessing-default-settings.html)を明記するなら、デフォルトプロジェクト設定は新しく作られたプロジェクトで自動的に使用される。

プロジェクトに付随するこの設定は、Settingsダイアログでは![icon](https://www.jetbrains.com/img/webhelp/current_project_icon.png)でマークされる。
![Screenshot from 2015-03-16 00:54:12.png](https://qiita-image-store.s3.amazonaws.com/0/30316/bb87fa95-e513-3af8-95a5-8f07325e1e4b.png)

## IDE設定

IDE設定はIntelliJ IDEAホームディレクトリ下の専用のディレクトリに保存される。
IntelliJ IDEAディレクトリの名前はプロダクト名とバージョンから構成される。

IntelliJ IDEA Community editionのためのディレクトリ名は**.IdeaICXX**である。

例えば:

* Windows
    * **\<User home\>\\.IntelliJIdeaXX\config** はユーザー固有設定を含む。
    * **\<User home\>\\.IntelliJIdeaXX\system** はIntelliJ IDEAのデータキャッシュを含む。
        * **\<User home\>**はWindowsXPでは**C:\\Documents and Settings\\\<User name\>**; Windows Vistaでは**C:\\Users\\\<User name\>**

* Linux
    * **~/.IntelliJIdeaXX/config** はユーザー固有設定を含む。
    * **~/.IntelliJIdeaXX/system** はIntelliJ IDEAのデータキャッシュを含む。

* OS X
    * **~/Library/Application Support/IntelliJIdeaXX プラグインの目録を含む(訳注: プラグインの設定?)。
    * **~/Library/Preferences/IntelliJIdeaXX** 残りの設定ファイルを含む。
    * **~/Library/Caches/IntelliJIdeaXX** データキャッシュ、ログ、ローカルヒストリなどを含む。これらのファイルはサイズが大きくなりうる。
    * **~/Library/Logs/IntelliJIdeaXX** ログを含む

**config**ディレクトリは複数のサブディレクトリからなり、それらは個人設定を表すXMLファイルを含む。
これらのファイルを別のIntelliJ IDEAインストール場所の対応するディレクトリにコピーすることで、あなたの好きなキーマップ、カラースキーマなどを簡単に共有することができる。
コピーする前に、IntelliJ IDEAが実行されてないことを確かめること、なぜなら実行中のIntelliJ IDEAは終了前に新しく移動された(訳注:transferred)ファイルを消す可能性があるからだ。

以下は**config**ディレクトリ下のいくつかのサブディレクトリとそこに含まれる設定についてのリストである。

|ディレクトリ名|ユーザー設定|
|:-----------|:---------|
|codestyles | [コードスタイルスキーマ](https://www.jetbrains.com/idea/help/configuring-code-style.html)を含む。
|colors	    | [エディタの色とフォント](https://www.jetbrains.com/idea/help/configuring-colors-and-fonts.html)カスタムスキーマを含む。
|filetypes  | ユーザー定義[ファイルタイプ](https://www.jetbrains.com/idea/help/creating-and-registering-file-types.html)を含む。
|inspection | [コードインスペクションプロファイル](https://www.jetbrains.com/idea/help/code-inspection.html)を含む。
|keymaps    | IntelliJ IDEA [キーボード・ショートカット](https://www.jetbrains.com/idea/help/configuring-keyboard-shortcuts.html)設定を含む。
|options    | 機能使用統計やマクロのような様々な設定を含む。
|templates  | ユーザー定義[ライブテンプレート](https://www.jetbrains.com/idea/help/live-templates.html)を含む。
|tools      | [ユーザー定義外部ツール](https://www.jetbrains.com/idea/help/configuring-third-party-tools.html)のための設定ファイルを含む。
|shelf      | [棚上げ変更](https://www.jetbrains.com/idea/help/shelved-changes.html)を含む。

Config、Systemとプラグインディレクトリの場所は**IntelliJ IDEA_home\bin\idea.properties**ファイルで変更することができる。

あなたは以下のパラメータを調整する必要があるだろう:

* idea.config.path
* idea.system.path
* idea.plugins.path

# 関連翻訳

* [IntelliJヘルプ翻訳に関する投稿 - Qiita](http://qiita.com/tags/intellij%e3%83%98%e3%83%ab%e3%83%97%e7%bf%bb%e8%a8%b3)
[Ruby] 簡単に `http_get(url, data_hash)` したり `http_post` するための21行

`Net::HTTP` はなにげにめんどくさい。

というかアプローチの仕方がいろいろあってどうするのが一番いいか忘れがち。

なのでメソッド化して毎回の get/post を楽にしよう、と思ったのだがどこまで抽象化してどこまで対応すればよいか悩んだ。その結果がこれ。

```ruby
require 'net/http'

def http_get(uri, data=nil, header=nil, proxy=nil)
  uri = URI(uri) unless uri.is_a?(URI)
  proxy = URI(proxy) unless proxy.is_a?(URI)
  http = Net::HTTP.new(uri.host, uri.port,
    proxy.host, proxy.port, proxy.user, proxy.password)
  uri.query = data.is_a?(String) ? data : URI.encode_www_form(data) if data
  http.start {|h|
    h.get(uri.request_uri, header)
  }
end

def http_post(uri, data=nil, header=nil, proxy=nil)
  uri = URI(uri) unless uri.is_a?(URI)
  proxy = URI(proxy) unless proxy.is_a?(URI)
  http = Net::HTTP.new(uri.host, uri.port,
    proxy.host, proxy.port, proxy.user, proxy.password)
  data = URI.encode_www_form(data) unless data.is_a?(String)
  http.start {|h|
    h.post(uri.request_uri, data, header)
  }
end
```

- GET/POST メソッドのリクエストまで
- http オブジェクトは外で使わないと思うので、すぐにリクエストしてレスポンスオブジェクトを返すものにした
- ボディ付き GET（クエリとして用いる）
- GET/POST のボディが文字列でなかったら（Hash、二重配列）、 `URI.encode_www_form` で変換
- リクエストする URI やプロキシは、文字列か URI オブジェクトで指定できる

```ruby:example
http_get('http://www.example.org/index.html') #=> #<Net::HTTPOK 200 OK>

http_get(uri)

http_post(uri, {'foo'=> 0, 'bar'=> 1})

http_get(uri, {'foo'=> 0, 'bar'=> 1})

http_get(uri, 'foo=0&bar=1')
```

`Net::HTTP.Proxy` （第一引数が nil だと通常の Net::HTTP オブジェクトを返す）とかやってみたけど結局 `Net::HTTP.new` に落ち着いた。

ボディ付き GET（クエリとして用いる）のやり方がググってもわからなかったけど、（たぶん）正しい方法はこれっぽい……「`query=` にぶっこんで `path` の代わりに `request_uri` を用いる」。
AdMobメディエーション(バナー)でNend, i-mobileが表示されなくなった（15/04/13 追記あり）

##原因
iPhone6, 6+に対応するために

`GADAdSizeFullWidthPortraitWithHeight()`

を使ったのが原因。
これを使うと、AdMobとiAdはちゃんと横幅合わせて表示してくれるが、iPhone6, 6+に対応していないアドネットワークの広告は表示しなくなってしまう。みたい。（ちなみにこれ使って320x50になってもNend, i-mobileの広告は表示されない..）

##どーするか。。
1. 6, 6+はGADAdSizeFullWidthPortraitWithHeight(), それ以外ではkGADAdSizeBannerを使って6, 6+はAdMobとiAdに任せる
2. kGADAdSizeBannerだけ使って自分でセンタリング、両サイドを埋める（iAdは端が切れるので外す）
3. 自前メディエーション
4. 全部AdMobとiAdに任せる

1でいきます。
3がベストだけど、、、ね。

###追記（15/04/13）：
メディエーション使っていると表示されないだけでなく、本来バナーが表示されるべき所にJSONらしき文字列が表示されてしまう様。。
なので、AdMobとiAd以外のADNWを使う場合は320x50に統一した方が良さそう。
というかするしかない。
jQueryで、動的にtop/bottomを初期化する



top/bottomの値を動的に初期化するには、
(chromeなどでは"initial"で通るが、IE10以下はカバーできないので、)
<b>"auto"</b>で対応する。

````js:js
$('.target-absolute').css({
  bottom: 'auto'
}).animate({
  height: '100%',
  top: 0
},700,function(){
  $(this).css({
    top: 'auto' 
  }).delay(700).animate({
    height: 0,
    bottom: 0
  },700)
});
````

※上記スクリプトで、
「上から下に表示」
　↓
「上から下に非表示」
といったアニメーションが可能
C言語の基礎 (変数の捉え方) NO.2 備忘録

#変数の捉え方
```c++:test.cpp
int a = 100;
```

普通に読むと
int型の変数aを定義し、その変数aに100を代入している。

具体的なイメージ
aという名前の箱に100円玉を入れた。

```c++:test.cpp
  int a = 100;
  int b = 100;
  
  if ( a == b )
  {
    CCLOG("aとbは等しい");

  } else {

    CCLOG("aとbは違う");

  }
```

実行結果
aとbは等しい

#考察

a == b つまり aとbは等しい。

aとbは違う箱なので箱としては別物であるはず。

しかし、実行結果は等しい。

プログラム上で表しているのは、変数aの値と変数bの値であることに気づく。

aとbは変数としては別物だけど、それぞれが保持している値は共に100である。

#アドレス

プログラム上では「変数としては別物」を、__変数のアドレス__を使って区別する。

変数名の先頭に&(アンパサンド)をつけることで、変数の格納アドレスを表す。

```c++:test.cpp
  int a = 100;
  int b = 100;
  
  CCLOG("変数aのアドレス:%p",&a);
  CCLOG("変数bのアドレス:%p",&b);
  
  if ( &a == &b )
  {
    
    CCLOG("aとbは等しいい");
    
  } else {
    
    CCLOG("aとbは違う");
    
  }
```
実行結果

cocos2d: 変数aのアドレス:0x16fd4922c
cocos2d: 変数bのアドレス:0x16fd49228
cocos2d: aとbは違う

変数aとbは値が同じてあるが、箱としては別物ということがアドレスで判断できる。

#まとめ
```c++:test.cpp
  int a = 100;
```
このプログラムでわかること。
変数の型: int型
変数の名前: a(変数の値を表す)
変数の値: 100
変数の場所: &a
変数の長さ: 4バイト
teratermでvirtualbox上に存在するubuntuに接続する

私物PCのスペックが良いわけではなくvirtualbox上でメモリやCPUの割り当てがそこまで潤沢にできないため軽量なteratermでssh接続できるようにする。
※自分用メモなためけっこう端折ります。。。

#PC環境
- thinkpad X220(corei7-2620M/4GB) Windows7 64bit Professional
- virtualbox version 4.3.24
- ubuntu 14.04 LTS 32bit

#インストール作業
virtualboxとubuntuについては以下URLよりダウンロード可能
インストール方法はググればいくらでも出てくるので割愛する。

- virtualbox
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp

- ubuntu14.04 LTS
https://www.ubuntulinux.jp/download/ja-remix

#インストール後～
インストールをすると画像のようになるはず。。。
無事インストール作業ができたら一旦virtualboxを閉じる。
![s_ubuntuデスクトップ画面.png](https://qiita-image-store.s3.amazonaws.com/0/68442/803c395c-a00a-0bbc-2d75-2b3a520efbde.png)

#設定
インストール後はvirtualboxの「設定」から「ネットワークアダプタ > アダプター1 > ポートフォワーディング」をクリックして画像のように設定する。
![ルール設定.png](https://qiita-image-store.s3.amazonaws.com/0/68442/7b462ae3-d27b-1263-742f-b3930abf264d.png)

#確認
teratermからvirtualbox上に展開したubuntuに接続確認を行う。
画像のように入力してOK。

![teraterm設定.png](https://qiita-image-store.s3.amazonaws.com/0/68442/208dfc67-857b-365a-78eb-b11fcc490f84.png)

その後、ユーザとパスワードを入力する。
※ユーザとパスワードはubuntuインストール時に入力したものを使用する。
これでteratermから接続できたはず。。。
C言語の基礎 (ポインタの基礎 ) NO.1 備忘録

#なぜポインタを勉強するのか
・C言語には標準ライブラリがありあらかじめ用意されている。

このポインタを使用しなければ

・入出力関数
・文字列操作関数
・メモリ操作関数

などが使用できない。

さらに、

**ポインタを使ったデータをやり取りしないと、効率的な処理ができない**

らしい。


なるほど、早速勉強していこう!!

#それぞれの型のサイズ
```c++:test.cpp
  printf("char型    のサイズ:%d\n",(int)sizeof(char));
  printf("short型   のサイズ:%d\n",(int)sizeof(short));
  printf("int型     のサイズ:%d\n",(int)sizeof(int));
  printf("long型    のサイズ:%d\n",(int)sizeof(long));
  printf("longlong型のサイズ:%d\n",(int)sizeof(long long));
  printf("float型   のサイズ:%d\n",(int)sizeof(float));
  printf("double型  のサイズ:%d\n",(int)sizeof(double));
```
実行結果
```c++:test.cpp
char型    のサイズ:1
short型   のサイズ:2
int型     のサイズ:4
long型    のサイズ:8
longlong型のサイズ:8
float型   のサイズ:4
double型  のサイズ:8
```

それぞれの型のバイト数( **メモリに占めるサイズ** )がわかる。
#char型について
正式には unsigned char(符号なし)とsigned char(符号あり)に分けられる。

char型は1byte

1byte = 8bit = 2の8乗 = 256個の整数で表現できる。

unsigned char = -128 ~ 127 の数字256個で表現できる
char          = 0 ~ 255の数字256個で表現できる

```c++:test.cpp
printf("文字a : %d\n",'a');
```
実行結果
文字a : 97
つまりchar型の文字aは10進数では97と表すことができる。






##メモ ( あいまいな単語等　)

・プリミティブ型【基本データ型】
char,short,int,long,long long,float,doubleなどなど

・参照型「クラスや配列のインスタンスを示すための変数の型」

プリミティブ型：値を格納するための変数（メソッドなどの機能がない）
参照型      ：クラスのオブジェクトを生成し、必要な処理を行う
Stylusでpxの計算をする時には括弧をつける

## 計算式だと認識してくれないケース

NG

```
font-size: 14px / 1.5;
```


OK

```
font-size: (14px / 1.5);
```

Ref) https://github.com/LearnBoost/stylus/issues/658


## 優先順位が誤っているケース

これは

```
foo = 10px

.klass
  margin 5px -(foo)
```

こう解釈されてしまう

```
.klass {
  margin: -5px;
}
/*
  margin: 5px -10px;
  のつもりだった
*/
```

なのでこの場合も執拗に括弧でくくる

```
.klass
  margin 5px (-(foo));
```
Rails(Grape)でAPIを作成する備忘録3(多対多テーブルの作成)

#tag機能の実装(テーブル作成)
* 多対多のテーブルを作成
* ドキュメントをタグ付きで追加するAPIの作成

##多対多テーブルの作成
モデルの作成

`rails generate model tag name:string`

中間テーブルの作成

`rails generate model document_tag document:reference tag:reference`

マイグレート
`rake db:migrate`

関係をモデルのファイルに記述

```rb:models/document.rb
class Document < ActiveRecord::Base
  has_many :document_tags
  has_many :tags, through: :document_tags
  ...
end
```
```rb:models/tag.rb
class Tag < ActiveRecord::Base
  has_many :document_tags
  has_many :documents, through: :document_tags
  ...
end
```
```rb:models/document_tag.rb
class DocumentTag < ActiveRecord::Base
  belongs_to :document
  belongs_to :tag
  ...
end
```

これにてテーブルの作成は終了。。。簡単？ですね

##ドキュメントをタグ付きで追加するAPIの作成

以前作成したdocument_api.rbを編集

```rb:document_api.rb
class Document_API < Grape::API
  resource "documents" do
    helpers do
    ...
      def save_tags(document,tag_name)
        tag = Tag.where(name: tag_name).first_or_create()
        table_obj = DocumentTag.new(tag_id: tag.id, document_id: document.id)
        table_obj.save
        # tag = Tag.find_by(name: tag_name)
        # unless tag
        #   tag_obj = Tag.new(name: tag_name)
        #   tag_obj.save
        #   table_obj = DocumentTag.new(tag_id: tag_obj.id, document_id: document.id)
        #   table_obj.save
        # else
        #   table_obj = DocumentTag.new(tag_id: tag.id, document_id: document.id)
        #   table_obj.save
        # end
      end
    end

    ...

    desc "create a document"
    params do
      requires :content, type: String
      requires :title, type: String
      requires :user_id, type: Integer
      optional :tags, type: Array
    end
    # http://localhost:3000/api/document
    post do
      document = Document.new(document_params)
      if document.save
        params[:tags].each do |tag_name|
          save_tags(document,tag_name)
        end
      else
        ...
      end
    end

    ...

  end
end
```

helperのsave_tagsは同一名のものがもうすでにあればそのIDと作成したドキュメントのIDを中間テーブルに保存し、タグが存在しなければそのタグを作成した後中間テーブルにそれぞれのIDを保存しています

~~とても汚いと思うのですが何かいい案があれば教えていただければ幸いです~~
first_or_createを用いるとある程度キレイにできましたがユニークにして否応なしに保存すればいいのでは？という疑問

どちらが軽いとかあるのでしょうか？
要素の値変更の仕方によるMutationObserverへの影響

#### 要素の値変更方法

```html:
<span class="foo"></span>
```

とあった場合

```js:
document.querySelector('.foo').textContent = 'foo';
```

とした時と

```js:
document.querySelector('.foo').firstChild.nodeValue = 'foo';
```

とした時では結果は同じだけど処理内容は異なる

```textContent = 'foo'``` とした場合は、値を変更してるわけではなく、textノード削除後にtextノードを追加している

#### MutationObserverへの影響

MutationObserverは、DOMツリーの変化を検出する機能。

```textContent = 'foo'```とする場合は```childList:true```を指定しないとイベントが発生しない

```js:
var ob = new MutationObserver(function(recs){
    recs.forEach(function(rec){...
});
ob.observe(document.querySelector('.foo'),{
	childList:true
});
```
working directory下のtsv.txtファイルを全て読み込んでリスト化


```lang:read.tsvs.R
read.tsvs <- function(x=character()){
	ori <-  list.files(x)
	print(ori)
	ori <- grep(".tsv.txt",ori,value=T)

	if(length(ori) <1 ){break}

	tbl <- list()
	for(i in 1:length(ori)){
		tbl[[i]]<-read.delim(paste(ori[i],sep=""),sep="\t",header=T,row.names=1)
	}
	return(tbl)
}
Qiita API V2 にて自分の投稿が取得できない。。

httpのヘッダーに[Authorization]を正しくセットした状態でAPIを叩いた場合、

https://qiita.com/api/v2/authenticated_user/items
これは自分の投稿が正しく取得できる

https://qiita.com/api/v2/items?query=qiita+user%3Ayaotti
これは他人の投稿が正しく取得できる

だけど、
https://qiita.com/api/v2/items?query=qiita+user%3Akacky69
これだと自分の投稿が正しく取得できない(私のuserid=kacky69)

これって仕様なのかなぁ。

*2015/03/16追記
RequestのHeaderにAuthorizationをセットせず、認証しない状態でAPIを叩くとqueryに自分のuserを指定した場合でも取得できるようになりました！
screen/tmuxのコマンドプレフィックスキーは何がベストか？

「[hotkeys - What's the best prefix/escape sequence for screen or tmux? - Super User](http://superuser.com/questions/74492/whats-the-best-prefix-escape-sequence-for-screen-or-tmux)」が面白かったのでザックリ紹介します。

回答は人気順です。当然ですけど、Emacs派とVim派が同時に納得する解は少ないですね。

----

screenではCtrl+A、tmuxではCtrl+Bがデフォルトのコマンドプレフィックスキーになっている。しかし、どちらも他のエディタやシェルで使われているキーストロークだ。他のプログラムと衝突しないオススメのキーを教えてほしい。

## Ctrl+O

「Emacsユーザーには良い選択だと思う」
「VimだとCtrl+Oはよく使うからダメだ、VimユーザーにはCtrl+Jがオススメだ」
「押すのに両手が必要だからイマイチだ」

## Ctrl+\

「キーボード上で打ちやすい位置にあればオススメ、滅多に使わないはずだ」

日本人EmacsユーザーはIMEのオンオフに使うんですけどね…

## `

モディファイアキー無しのバッククォートを使うという意見。

「バッククォートを含んだ文字列をコピペするときに不便じゃね？」
「tmux 1.8以降ならassume-paste-timeのデフォルト値が1msだから安心」
「シェル上でコマンドの実行結果を文字列として取りたいときは$()を使えば問題ない」

日本語キーボードだと採用するのは無理ですけど、意外と支持されているのが面白いですね。

## `とCtrl+Oを使い分け、F11とF12で切り替える

難しい設定の人っているもんですね…

## Ctrl+Q

「うっかりシェル上でCtrl+Sを打ったのをキャンセルするときにしか必要がない、そこで俺はCtrl+Sを打たないことを学習した」

この人のようにCtrl+S/Ctrl+Qがttyに食われてしまう環境の場合は`stty ixany`などとする必要があるかもしれませんが、そうでなければ悪くない選択に思えます。

Emacsではコントロールコードを直接入力するときに使うくらいで、そこまで頻繁に使うキーではないですね。

## CapsLock+Space

この人、CapsLockにESC割り当てるとか言ってて参考にならなさすぎ…。

## Ctrl+T

「EmacsとzshとWindowsユーザーなのでこのキーは使わない」

## Ctrl+S

「Ctrl+Aの隣だから、移行も簡単だぜ！」

Emacsだと無いと困るキーですね。

## Ctrl+A

screenのデフォルト悪くないよね派。全選択しか衝突しないそうです…。

## Ctrl+Space

それSpotlightと衝突するんだけど、というツッコミが来てます。

## Ctrl+C

「Emacsでも2ストロークキーに使うキーだから覚えやすい」

そんなもんですかね…。

# 感想

Ctrl+Z派が登場しなかったのは意外ですね。近所でアンケート取ったら上位にランクインしそうなのに。
build.sbt の中で application.conf を読み込む

build.sbt の中で application.conf の内容を使いたいことがあります。例えば flyway-sbt の flywayUrl や flywayUser は、アプリケーションで使っている設定と同じものを使いたいことが多いと思います。

このような場合、普通に build.sbt の中で

```scala:build.sbt
...

libraryDependencies ++= Seq(
  ...
  libraryDependencies += "com.typesafe" % "config" % "1.2.1"
)

import com.typesafe.config.ConfigFactory

...

```

としても `com.typesafe.config.ConfigFactory` が見つからないよと言われてしまいますが、

project ディレクトリの中に foobar.sbt という下の内容のファイルを作れば、build.sbt の中で com.typesafe.config をインポートできるようになります。

```scala:project/config.sbt
libraryDependencies += "com.typesafe" % "config" % "1.2.1"
```

例えば、

```scala:build.sbt
import com.typesafe.config.ConfigFactory

val conf = ConfigFactory.parseFile(new File("src/main/resources/application.conf"))

flywayUrl := conf.getString("db.default.url")

flywayUser := conf.getString("db.default.user")
```

こんなかんじにすれば application.conf を読み込んで使えるようになります (`ConfigFactory.load()` では読み込んでくれなかったので `ConfigFactory.parseFile(..)` を使っています)。


```sh
$ cat src/main/resources/application.conf
db.default.url="jdbc:h2:file:default"
db.default.user="sa"
...
$ sbt
> show flywayUrl
[info] jdbc:h2:file:default
```

ちゃんと読み込まれています。

参考: http://stackoverflow.com/questions/15425609/sbt-cant-resolve-dependency-in-build-definition
ローカルで普通に削除しちゃったファイルをGitHubに反映させる

GitHubが以下の状態の時・・

```GitHub:
foo.txt
bar.txt
```

ローカルでbar.txtを普通に削除してしまい・・（git rmを使わずに）

```GitHub:
foo.txt
bar.txt←削除して物理ファイルは無いけどGit上では管理されてる
```

<br/>
GitHub上のbar.txtも削除するにはどうすれば良いか・・

#### 方法１

```bash:
git add -u
git commit -m 'bar.txt削除をgitに反映'
git push
```

#### 方法２

```bash:
git rm bar.txt  ←物理ファイルが無くてもエラーにならない
git commit -m 'bar.txt削除をgitに反映'
git push
```
cocos2dx v3.3, v3.4のGETリクエストでhttpheaderを追加できなかった

# どういうこと？

以下のコードで本来ならhttpheaderを追加できるはずだが
GETリクエストではhttpheaderが追加されていなかった
(PUTとPOSTしか追加されないようになっていた)

```cpp
vector<string> h;
h.push_back("X-Parse-Application-Id: SOME_ID");
auto request = new cocos2d::network::HttpRequest();
request->setHeaders(h);
```

2dxからGETでParse.comにアクセスして`ccHttpRequestCallback` が処理されなかった
WireSharkで見てhttpheaderが追加されていないのに気づいた

# 修正内容

既に解決されてPRはmergeされているが `v3.3`, `v3.4`, `v3.5` には
2015-03-16時点では mergeされてない
https://github.com/cocos2d/cocos2d-x/pull/10483
sqaleにてドツボにはまるの巻

### 事の顛末
個人的に作ってるRailsアプリケーションをGitでsqaleにpushしてデプロイしたところ、何やら500番エラーが
SSHでログインして調べるとRake10.4のgemがないとのこと
さらによく見るとRubyのバージョンも1.9.3になってる。そりゃRakeのバージョンも合わないわけだ
***

### 対応開始
そこでマニュアルを見ながらsqale側のRubyのバージョンをローカルの2.1.4に合わせてやることに
rbenvが使えれば簡単なようですが、あいにくwindows環境で開発しててrbenvの導入が面倒なので手動で「.ruby-version」ファイルを作ってpushすることにしました

```
# .ruby-versionファイル。内容はバージョン番号のみ？このコメントはファイル内には書いてません
2.1.4
```

このファイルをマニュアルに従って・・・（ecomaはアプリケーションルート）
```
$c:\Sites\ecoma git add .ruby-version
$c:\Sites\ecoma git commit -m "Rubyバージョン変更"
$c:\Sites\ecoma git push sqale
```
としてみる。pushは成功、ここまでは良し
***

### 対応失敗？
しかしそのあとSSHにてRubyのバージョンを確認しても・・・
``` ruby 1.9.3p550 (2014-10-27 revision 48165) [x86_64-linux] ```
ううむ、何がいけなかったんだろう
その後cloneを使ってsqale側のリポジトリを引き出してみても「.ruby-version」ファイルは見当たらず
一体彼はどこへ行ってしまったのだ・・・？
***

### そして時間切れ
差しあたってそんなこんなで時間切れになって続きは明日に持ち越されることに
***
Muninのグラフでマイナス値を削除する方法


Munin-plugin、およびRRDファイルのデータの上限下限は作成時に設定しないといけないという話です。

複数台のApacheの単位時間当たりのリクエスト数をまとめて取得するMuninプラグインをつくり動かしていたところ、なぜか1日に1度マイナスの値が表示されるという不具合にであいました。単位時間のリクエスト数を取得するため前回との差分をとっていましたが、Apacheがリセットされるとリクエスト数が0になるため前回からの差分がマイナスになってしまう事が理由でした。

この問題を修正するために munin-pluginのConfigで

```
${field}.min = 0
```

を返すように設定を変更しました。これは最小値が0以下の場合グラフに表示しない設定ということなので、問題解決するかと思いきや、一向にMuninグラフに変化はなくマイナス値が表示されていました。このマイナス値を消すにはどうすればよいのか? というのが今回のお話です。

結論からいうとマイナスの値だけを削除することはできませんでした。今まで貯めたデータを削除となりました(涙)

調べたところ $[field}.min の設定は、データの表示ではなくRRDファイル作成時に使われていました。このため、一旦マイナスの値がはいってしまうとmunin-pluginを変更しても入った値は修正されないためマイナスのリクエスト数が表示されるグラフが出続けていました。

RRDToolsをつかって更新することも考えました。しかし、長期スパン(週、月、年)のデータの計算もにも範囲外のデータが既にはいっていた場合、長期データも値がおかしくなっていると考えられます。このため、RRDファイルは削除しました。

みなさんおきをつけください。
Laravelで、MySQLやApacheをするのが面倒だったので、お手軽な開発環境を作ったメモ書き


MacOSX + PHP5.5系 + Laravel5 の話


1. コンソールを起動して、Laravelをインストールしたディレクトリに移動
2. `config/database.php` にある `default' => 'mysql'` を `default' => 'sqlite'`に変更
	3. MySQLを使わず、SQLiteで作業する事になるので注意
	4. .env とか使えばもっと便利になるんじゃない。
5. コンソールで `cd public` と実行の後、`php -S localhost:8888` と実行させた後、ブラウザで `http://localhost:8888/` とアクセスしたら見れると思うんだ。
DynamoDBの簡易リファレンス（古い感じの方


**削除**
*メソッド*
```    static void deleteItem(String table,Map<String, AttributeValue> item){
        DeleteItemRequest req = new DeleteItemRequest(table, item);
        DeleteItemResult res = dynamoDB.deleteItem(req);
        System.out.println("DeleteResult: " + res);
    }```

*Ex...*
`Map<String, AttributeValue> key = new HashMap<String, AttributeValue>();
 key.put(keyName, new AttributeValue("test"));
 deleteItem(tableName,key);`

**保存**
*メソッド*
`    static void putItem(String table,Map<String, AttributeValue> item){
        PutItemRequest req = new PutItemRequest(table, item);
        PutItemResult res = dynamoDB.putItem(req);
        System.out.println("PutResult: " + res);
    }`

*Ex...*
`Map<String, AttributeValue> item = new HashMap<String, AttributeValue>();
key.put(keyName, new AttributeValue("Bill & Ted's Excellent Adventure"));
putItem(tableName,item);`

**取得**
*メソッド*
`   //全部取得
    static void getItem(String table,Map<String, AttributeValue> key){
        GetItemRequest req = new GetItemRequest(table, key);
        GetItemResult res = dynamoDB.getItem(req);
        System.out.println("GetResult: " + res);
    }
    //項目指定取得
    static void getItem(String table,Map<String, AttributeValue> key,String item){
        GetItemRequest req = new GetItemRequest(table, key);
        req.withProjectionExpression(item);
        GetItemResult res = dynamoDB.getItem(req);
        System.out.println("GetResult: " + res);
    }`

*Ex...*
`key.put(keyName, new AttributeValue("Bill & Ted's Excellent Adventure"));
getItem(tableName,key);
getItem(tableName,key,"rating,fans");`

**更新**

*メソッド*
`  //項目更新
   static void updateItem(String table
    		,Map<String, AttributeValue> key
    		,Map<String, AttributeValueUpdate> item){
        UpdateItemRequest req = new UpdateItemRequest(table, key, item);
        UpdateItemResult res = dynamoDB.updateItem(req);
        System.out.println("UpdateResult: " + res);
    }`

`   //条件付き更新
    static void updateItem(String table
    		,Map<String, AttributeValue> key
    		,Map<String, AttributeValueUpdate> item
    		,Map<String, ExpectedAttributeValue> exp){
        UpdateItemRequest req = new UpdateItemRequest(table, key, item);
        req.withExpected(exp);
        UpdateItemResult res = dynamoDB.updateItem(req);
        System.out.println("UpdateResult: " + res);
    }`

*EX...*
`Map<String, AttributeValueUpdate> update = new HashMap<String, AttributeValueUpdate>();
update.put("rating",new  AttributeValueUpdate(new AttributeValue("*"), AttributeAction.PUT));
updateItem(tableName,key,update);`

`Map<String, ExpectedAttributeValue> exp = new HashMap<String, ExpectedAttributeValue>();
exp.put("year", new ExpectedAttributeValue()
.withValue( new AttributeValue().withN("1900"))
.withComparisonOperator(ComparisonOperator.LT)
);
updateItem(tableName,key,update,exp);
`
heroku を汎用リモートマシンとして使う

heroku を web app として使わずに `heroku run bash` や Heroku Scheduler (cron) でスクリプトなどを実行したいだけでも、 heroku がアプリケーションとして認識できないものを `git push` すると `Push rejected, no Cedar-supported app detected` で push できません。

公式には [Rack::Static を使う方法](https://devcenter.heroku.com/articles/static-sites-ruby) があったり、各言語、フレームワークで最低限のファイルを push すれば動くと思いますが、php の stub を作る方法が一番簡単かなと思います。

http://blog.fragaria.cz/2014/04/host-static-site-on-herokucom.html?m=1

```shell-session
touch index.php
```

あとは自由にスクリプトとか Makefile やコンパイルしたいコードなどを追加するだけ。
mime type jpeg vs. jpg

# 背景
* 最近、HTTPでAPIを開発していた
* 開発中に、content-typeを実装した

# 問題
* jpgファイルを、image/jpgに定義してしまった
* しかし、image/jpgは、正しくないことを、どこでも説明がない

# 調査 
* まずは、以下のサイトで、調査して、image/jpegが、正しいことがわかった
 * http://en.wikipedia.org/wiki/Internet_media_type
 * http://www.kyoto-su.ac.jp/ccinfo/use_web/mine_contenttype/
* 次は、rfcに調査した
 * https://www.ietf.org/rfc/rfc2046.txt
 * http://www.w3.org/Graphics/JPEG/
 * JPEG, JFIFのMIME TYPEが、image/jpegが記述された
* mime typeについての文書
 * http://tools.ietf.org/html/rfc1341
 * https://tools.ietf.org/html/rfc2047
 * https://www.ietf.org/rfc/rfc2048.txt

# 振り返り
* 今後は、content-typeを実装する前に、http://en.wikipedia.org/wiki/Internet_media_type に、各typeを調査すれば、いい