OmniAICreator/Qiita-1.07M huggingface dataset:
Oracle Developer Cloud Serviceをフリートライアルで使い始める

#はじめに
Oracle Cloudの中のDeveloper Cloud Serviceは、クラウド上でチーム開発用の開発ツールを提供しています。GitやHudson、Bugzillaライクな課題管理、Wikiといった主な開発ツールがまとめて提供されるとても便利なサービスです。
現在はOracle Java Cloud Serviceなどを利用すると一緒に使用できますが、単体での利用は提供されていません。残念ながら。

今回はこれを30日間のフリートライアルとして利用する方法について書きます。


# フリートライアルの申請
申請は[Oracle Cloudのフリートライアルを申し込んでみた](http://qiita.com/nobuhikosekiya/items/08d1df91df5dc8fa879a)を参照してください。中の手順通り、「Java Cloud Service」のTry itを申請します。Java Cloud ServiceとともにDeveloper Cloud Serviceも使えるようになっています。

# Developer Cloud Serviceの使い始め

Oracle CloudのMy Servicesのポータル画面にアクセスできたら、Developer Cloudのコンソールを開くリンク「Open Service Console」があります。

最近追加された新しいタイプのDashboardの場合はココ↓
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/2cbeda74-bb2d-3ea5-04da-be78d1595e3e.png)

従来のDashboardはココ↓
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/2b5a516d-88bd-f6a9-ff8c-8812dbe446ca.png)

コンソールを開き、最初にまずプロジェクトを一つ作成します。フリートライアルでは合計3つまで作成できます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/146f8e1b-8222-de89-5889-8a5cabd48696.png)

プロジェクト名とSecurityを設定します。Sharedにすると、同じアイデンティティドメイン内のメンバーもそのプロジェクトへの参照権限があります。とりあえずSharedにしておきます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/a9e868a9-0f86-eb66-303d-e55c03cef66f.png)

次にTemplateですが、これは好きなものを選択してください。特になければEmpty Projectで。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/67917ac2-3d5d-7398-912d-e061364b8e36.png)

最後にWiki Markupです。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/52b103fb-9d06-bc09-414f-95d2f5ad943b.png)

プロジェクトのプロビジョンは私の経験上、30秒～2分といったところです。速い！
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/27594afb-1371-75ce-2911-22eef418034b.png)

タブ形式でツールを簡単に切り替えられます。JenkinsユーザーはぜひBuildタブにあるDeveloper Cloud のHudson機能を使ってみてください。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/bf369639-8813-253d-156d-a1eaedc74e80.png)

# Gitソースコード管理

最も基本的な使い方として、Gitでソースコード管理する様子をご紹介します。

HomeタブのNew RepositoryをクリックするとGitリポジトリを追加できます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/0fb077ed-b4d5-14eb-df7d-f529d48decfa.png)

Nameは適当な名前を入れます。空のリポジトリでもいいのですが、Import existing repositoryを使ってみます。GitHubから好きなソースコードのGitクローンのURLをコピ・ーペーストしてください。もし何でもよければ下のURLを使ってください。
https://github.com/nobuhikosekiya/cargotracker-copy.git

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/64c4f2e3-c975-77e3-8f51-6f71fdfc9b81.png)

Create押すと、すぐにコードがコピーされてこのDeveloper Cloud ServiceのGitリポジトリにインポートされます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/b00a1f61-68d2-7c77-67a5-73f27d155a70.png)

ソースコードの表示もこんな感じWebで表示できます。簡単ですね。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/c3796852-992c-e7f2-5181-7e36d286f69e.png)

コードを編集する場合は、Homeタブ画面にさきほど作成したGitリポジトリのURLがありますので、これを使ってローカルPCにソースコードをダウンロードして編集します。この辺りは通常のGitの使い方と同じです。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/793ae85a-121d-3c57-95fa-454a37ee7549.png)

ただ、アクセスする際は当然ながら認証が必要です。Developer Cloud ServiceのGitはGitHubのような誰でも参照できるパブリックなものとは異なり、自社プロジェクト用の非公開Gitリポジトリです。認証は上記Webコンソールにアクセスしたときと同じ、Oracle Cloudにログインした際の自分のユーザーとパスワードを使います。


ぜひ色々いじって遊んでみてください。
JSON (Hyper)Schemaの書き方に対する一つの例


JSON Schemaを用いた各種ライブラリやMarkdown生成ツールなどが出てきているが、実際に運用しようとしたときに試行錯誤し、最終的に落ち着きそうな形が見えてきたので共有したい。

# 良さそうな書き方
## ファイルを分割しない。するならHyperSchemaファイルごとに
JSON (Hyper)Schemaファイルを書くと一瞬で行数が巨大化する。
そのため現状では、各Schemaファイルをツールにより結合して巨大な一枚のファイルに結合する方法があり、[prmd](https://github.com/interagent/prmd)が用いられているのをよく見る。

ただこれにはいくつか問題があり、

- 結合後のSchemaにより発生したエラーを追いにくい
- 各ファイルで定義されたSchemaを参照する際に、エディタなどの補助がなければ辛い

をどうするかという話が出てくる。
全体を一枚のファイルで書くと、極めて原始的だが、参照性の問題や、
結合の方法が原因のエラーを考えなくて済むため、だいぶ楽になる。

## definitionsはトップレベルのSchemaのみでやる、
各columnの定義をトップレベルのSchemaのdefinitionsに書き、Links内にある各API定義ではdefinitionsを用いず、$ref(おそらくJSON Pointerという名前)で参照するという形を取る。
そうするとSchemaファイルの肥大化に対しても比較的シンプルさを保てる

## 常識的な範囲のAPI設計にする
JSON Schemaはとても柔軟なので、あまりにも凄まじいものも定義出来るが、できるからといってしない。

# 例
具体的に上記の例を踏まえながらサンプルをyamlで書くと

``` yaml:example.yml

title: sample
description: sample API Schema

definitions:
    
    user_id:
        type: string
        description: user id
        example: 1

    user_name:
        type: string
        description: user secreen name
        example: bar

    user:
        type: object
        title: User
        description: User
        properties:
            user_id:
                $ref: '#/definitions/user_id'
            screen_name:
                $ref: '#/definitions/user_name'
    users:
        type: array
        description: user list
        items:
            $ref: '#/definitions/user'

href: https://sample-app
links:
    - title: GET /users
      description: get user list
      rel: self
      href: /user
      method: GET
      targetSchema:
          $ref: '#/definitions/users'


```

という感じになる
EmacsでMicrosoft Translatorを作ってみた　を改良

[EmacsでMicrosoft Translatorを作ってみた](http://qiita.com/fujimisakari/items/2511dc0c467fdc53550f) を改良
[Emacsで英和辞書や和英辞書をすぐに引けるようにしたい](http://qiita.com/styzo/items/72197ad6717eb9266315) と同じ問題があった。

元のコードでは英語かどうかを判定するのに全文字がascii文字だけかどうかを調べているので、英文にスペイン語やドイツ語などの地名や人名が入っていると日本語と判定される。（El Niño エルニーニョとか)

翻訳範囲の指定方法を増やした。
C-u でパラグラフ
C-u C-u で単語
C-u C-u C-u でキーボードから単語や文を入力
引数なしでセンテンス
リージョンを指定していればそのリージョン

`*Microsoft Translator*`バッファを`help-mode`にして`q`で消せるようにした。

`C-M-m` で起動。

```elisp
(autoload 'microsoft-translator-translate "microsoft-translator" "" t)
(autoload 'microsoft-translator-auto-translate "microsoft-translator" "" t)

(defun microsoft-translator--get-string (arg)
  (or (cond ((stringp arg) arg)
	    ((= arg 4)			;C-u
	     (thing-at-point 'paragraph))
	    ((= arg 16)			;C-u C-u
	     (thing-at-point 'word))
	    ((= arg 64)			;C-u C-u C-u
	     (read-string "Microsoft Translate: "))
	    ((use-region-p)			;リージョン指定
	     (buffer-substring (region-beginning) (region-end)))
	    (t				;デフォルト
	     (thing-at-point 'sentence)))
      ""))

(defun my-microsoft-translator-auto-translate (arg)
  "Read a string in the minibuffer with from-to is auto."
  (interactive "p")
  (let* ((translate-text (microsoft-translator--get-string arg)))
    (microsoft-translator--process
     translate-text
     (if (string-match "\\cj" translate-text) "Japanese" "English")
     (if (string-match "\\cj" translate-text) "English" "Japanese"))))
(advice-add 'microsoft-translator-auto-translate
	    :override #'my-microsoft-translator-auto-translate)

(defun my-microsoft-translator--translating (translate-text from to)
  (with-current-buffer (get-buffer microsoft-translator-buffer-name)
    (help-mode)))
(advice-add 'microsoft-translator--translating
	    :after #'my-microsoft-translator--translating)

(push '("*Microsoft Translator*" :height 0.5 :stick t) popwin:special-display-config)
(global-set-key (kbd "C-M-m") 'microsoft-translator-auto-translate)
```

ただし、日本語かどうかを判定しているので、日本語と英語の間の翻訳しかできない。
オリジナルのコードは英語かどうか(ascii文字だけから成っているかどうか)の判定をしているので英語と任意の言語の翻訳ができるが、上記の通り判定に失敗することがある。

参考:
[漢字、ひらがな、カナカナにマッチ](http://so-zou.jp/software/tech/programming/tech/regular-expression/meta-character/variable-width-encoding.htm)
[Unicodeで「漢字」の正規表現](http://tama-san.com/kanji-regex/)
トップレベルとextendに関する不思議な挙動

# テストした環境
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
# テストコード

```rb
def toplevel_hello
  puts "toplevel_hello"
end

class Test1
  def initialize
    toplevel_hello
  end
end

module ModHello
  def mod_hello s
    puts "mod_hello #{s}"
  end
end

class Test2
  def initialize
    extend ModHello
    mod_hello self
  end
end

class Test3
  def initialize
    mod_hello self
  end
end


Test1.new
Test2.new

extend ModHello
mod_hello self
Test3.new rescue puts 'Fail extended method'

include ModHello
Test3.new rescue puts 'Fail included method'

```

# 結果

```
toplevel_hello
mod_hello #<Test2:0x007effdd6aaae8>
mod_hello main
Fail extended method
mod_hello #<Test3:0x007effdd6aa638>
```
# 結果より分かること
Test1より
トップレベルに定義したメソッドはクラス内からも（何の苦労もなく）呼べます
Test2より
モジュールで定義したメソッドもself.exetend使うことで呼べるようになります
問題のTest3
トップレベルでextend使うとトップレベルオブジェクト(main)にメソッドが追加されるのですが
main.extend の場合はクラス内で使用できず
main.include の場合はクラス内で使用できるようになりました

exetendで特異メソッド生やすのがなんとなく好きだったのですが
(そのせいでincludeの存在を忘れてた)
トップレベルの場合はincludeを使わないと変なハマり方をするようです
マジックメソッド（特に `__construct` ）は、Traitに「メソッドの引き上げ」をしてはいけない


# 発端
[Trait](http://php.net/manual/ja/language.oop5.traits.php)は、メソッドの実装のコピペを回避するのに多用します。でも、マジックメソッド（特に `__construct()` ）を[引き上げる](http://d.hatena.ne.jp/asakichy/20101001/1285890635)と、思いの外「再利用可能な機会が狭まる」ので、やめたほうがいいなぁって感じました。

# もっともらしい理由
特に使用頻度が高い（と思う）、`__construct()`について考えました。他のものについては、深く考察していないです。

## メソッドの使用率（メソッド名の重複率）が高い（と思う）
マジックメソッドなので、「メソッド名が同じ」だから、存在すれば即重複します。複数のTraitを利用する場合に、重複していないことを毎回確認するのはつらいです。

1. 「コンストラクタ」マジックメソッドの使用率が高いので、メソッドの重複率が高い。
1. メソッドの重複率が高いと、意図しない上書きが発生する。
    * 特に、複数のTraitをuseした時に、発生しやすい。

特に統計とかはとってないです。ただの"感覚"。

## コンストラクタは改修するのがつらい

* コンストラクタは、クラスのデータ構造に密接に関係するので、改修することが難しい。
* コンストラクタは、使用率が高いので、「[Method Pull Down](http://d.hatena.ne.jp/asakichy/20101005/1286236381)」する場合にコストが高い。

### データ構造に密接に関係する
[Getter/Sestterの乱用はアンチパターン](http://tbd.kaitoy.xyz/2015/07/22/getters-setters-evil/)なので、一旦論外とします。私の意見としては、「コンストラクタは、そのクラスのデータにおける主キーを明確にする」から、「コンストラクタの引数で一切の値を渡さずに、すべてをSetterに頼るのはダメ」という論調です。  
で、これを前提にすると、コンストラクタに「主キーを明確にする」責任が発生する。「主キーの明確にする」のは、[DDL](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E5%AE%9A%E7%BE%A9%E8%A8%80%E8%AA%9E)の範疇になります。つまり、コンストラクタの実装とは、「そのクラスの主キーの"定義"」である、とも言えます。**"定義"である以上、基本的に「変更するな」**と。

### Method Pull Downするときに、変更コストが高くつく
同じコードを、そのTraitを利用しているすべてのクラスにMethod Pull Downするのだと、（IDEの機能で自動でやる場合を除き）クラスの数だけコピペを繰り返すことになります。心理的なハードルが高いです。


# 各マジックメソッドは、何に使われるのか
自分が、各マジックメソッドを何に使ってるのか、一応考えました。結果として、どれも「データ構造とかデータの内容」に依存してて、インターフェースへの依存ではないので、ダメでしょう。

* `__construct()`はそのクラスの主キーを定義する。
* `__destruct()`はインスタンスが破棄される時の"状態"に依存する処理を頻繁に書く。
* `__wakeup()`と`__sleep()`は、シリアライズ前後のデータに依存した処理を頻繁に書く。
* `__toString()`は、インスタンスプロパティに依存した処理を頻繁に書く。固定値を返すだけなら、別に良いだろう。
* `__invoke()`は、多分、インスタンスのプロパティに依存した処理を書く。[コマンドパターン](https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Command)のInvokerとして使うこともある。（[monologのProcessor](https://github.com/Seldaek/monolog/tree/master/src/Monolog/Processor)とか。）
* `__set_state()`と`__debugInfo()`は、多分、インスタンスのプロパティに依存した処理を書くと思う。

# useしてる先のクラスで上書きすればいいんじゃね？
ダメだろ。「後から自由に上書きする」という点では、[.htaccess](http://httpd.apache.org/docs/2.4/howto/htaccess.html#when)みたいなもんだと思います。

> 一般的に、サーバの主設定ファイルにアクセスできない場合を除いて、 .htaccess ファイルの使用は極力避けてください。
> 普通は可能であれば .htaccess ファイルの使用は 避けてください。

この理論で行くと、「使用元のTraitにアクセス出来ない場合」となるわけだが、どういう状態だよ？ということになりますが。「Traitがスパゲッティ化しすぎて変更不可能だから、やむを得ず上書きする」くらいしか理由が思いつかないです。  
上記のリンク先にある「.htaccessファイルの使用を避ける」理由を、".htaccess"を"traitやクラス"に置き換えて読んだ場合と、だいたい同じ理由になると思います。

あと、以下の様な点で、この手法はダメだと思います。

* 各Traitが実装している処理の要件を満たす実装を、**繰り返す**
* use元のTraitに変更が加わった場合に、変更し忘れるかもしれない。
    * 共通化した理由とはなんだったのか。


おわり
AWS Redshiftで「n日前までのデータ」を抽出する場合

# 普通にPostgreSQL(RedshiftのベースとなっているRDBMS)の関数を使えば良い。
```lang:sql
WHERE visit_time BETWEEN (CURRENT_DATE + INTERVAL '-3 day') AND CURRENT_DATE
```
``CURRENT_DATE``はクエリ実行時点での現在時刻を返す、PostgresSQLの関数。
上記例ならば、3日前の0:00から1日前の23:59:59までのデータを取得する。

interval型で指定する日付には他にも年や月など様々な形式が利用できる。
また日付に対してマイナスするだけでなくプラスを使うこともできる。
詳しくは https://www.postgresql.org/docs/9.0/static/functions-datetime.html
SSHユーザ新規登録、鍵登録までメモ

#事前準備（手元の端末で実施）

鍵生成

```
# ssh-keygen -t rsa -f ./test
```
test.pubをサーバに転送
#鍵登録（サーバで実施）

```
# useradd test
# su test
$ cd
$ mkdir .ssh
$ chmod 700 .ssh
$ touch .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
$ cat test.pub >> .ssh/authorized_keys
```

#sudo権限（必要なら）
```
# visudo
```
Android4.3以下はflexboxのflex-wrapだけ機能しない

一回ハマったのでメモ。

タイトル以上でもタイトル以下でもないです。

Can I use にはこのように書いています。
<img width="320" alt="スクリーンショット 2016-06-01 13.16.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/125742/3c8fa4aa-cbe5-de81-6c7a-364a34ef93d2.png">

> Notes:
> 以前のflexboxだけサポートしてて、**wrappingはサポートしてないよ!**

gulpなどでautoprefixをつけていてもこのwrap要素はそもそも効かないので、これでレイアウトをいじっている場合は気をつけてください。

flexboxは使い勝手よくてどんどん活用したいのですが、Android4.3以下を対象にする場合には注意が必要というお話でした。

多分IEも何かしらありそう


参考文献

- [Can I use... Support tables for HTML5, CSS3, etc](http://caniuse.com/#feat=flexbox)
バーチャルホストのサーバ名別名でVirtualHost設定を簡素に

ApacheにはServerAliasなるディレクティブがあります。
今更知ることになり、なんて便利なんだ！と感動したのでこの勢いで紹介します！

## ServerAliasのない世界

よくあるパターンですが、URLにwwwを入れるか入れないか、どちらかに統一したいという話がよくあると思います。
私はこの設定を今までのこんな感じでやってました。

```apache:httpd.conf
NameVirtualHost *:80

<VirtualHost *:80>
 ServerAdmin   admin@nautilus.xyz
 DocumentRoot /srv/www/default
 ServerName   www.nautilus.xyz
 <ifModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTP_HOST} ^www.nautilus.xyz
   RewriteRule ^(.*)$ http://nautilus.xyz%{REQUEST_URI} [R=301,L]
 </ifModule>
 ...
</VirtualHost>

<VirtualHost *:80>
 ServerAdmin  admin@nautilus.xyz
 DocumentRoot /srv/www/default
 ServerName   nautilus.xyz
 ...
</VirtualHost>
```

このケースでは、www.nautlus.xyz => nautilus.xyzにリダイレクトしています。wwwを削除する方向に統一。うーん、ザ・冗長。www.nautilus.xyzとnautilus.xyzの両方のバーチャルホスト設定を書いてます。wwwの方は使わないのにね…
いろいろ設定書くって事は、変更あったら両方とも修正しないといけないから修正漏れとか書き間違いとかトラブルの種がその分増えるって事。設定ファイルもプログラムも書かないに越したことはないよね。

そこで**ServerAlias**くんの登場ですよ。

## ServerAliasのある世界

ServerAliasを使うとこんな感じに書き換えることができます。

```apache:httpd.conf
NameVirtualHost *:80

<VirtualHost *:80>
 ServerAdmin  admin@nautilus.xyz
 DocumentRoot /srv/www/default
 ServerName   nautilus.xyz
 ServerAlias  www.nautilus.xyz
 <ifModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTP_HOST} ^www.nautilus.xyz
   RewriteRule ^(.*)$ http://nautilus.xyz%{REQUEST_URI} [R=301,L]
 </ifModule>
 ...
</VirtualHost>
```

バーチャルホストの設定を一つにまとめることができるわけです。
基本的に、nautilus.xyzのバーチャルホストとして、この設定を使う別のドメインをServerAliasとして設定しておきます。そして、ServerAliasのドメインでアクセスしてきたリクエストはnautilus.xyzにリダイレクト。

設定が一つになって、すっきり！うれしい！

こんなこと誰でも知ってるよ！ということかもしれないけど、これは便利だとおもいましたまる

http://nautilus.xyz/dev/157 からの転載です。
xargsでコマンドを並列実行

GNU parallelを使うとコマンドを並列実行でき、細かい制御ができる。使い方もそれほど難しくない。
しかし、OSに標準で入っているxargsでも簡単な制御でよければ並列処理ができる。

## 基本的な使い方

処理対象が100個あり、1プロセスあたり4個を引数にして、同時に3個のプロセスを起動させる例：

```
$ seq 100 | xargs -t -P3 -n4 ruby -e 'sleep 5'

-t     実行する前にそのコマンドラインを表示する
-P3    3プロセスを並列に実行
-n4    各プロセスが引数4個をとるようにする（入力をスペースによって引数に区切る）

-Pを指定した場合は-nまたは-Lも同時に指定すること。そうしないと1プロセスしか起動してこない。
```

これを実行すると、プロセスの状況は下記のようになる。

```
$ watch -n1 'ps aux | grep [r]uby'

ken    18746  0.7  0.2 141948  9136 pts/1    Sl+  12:57   0:00 ruby -e sleep 5 1 2 3 4
ken    18747  1.2  0.2 141924  9060 pts/1    Sl+  12:57   0:00 ruby -e sleep 5 5 6 7 8
ken    18748  1.2  0.2 141932  9000 pts/1    Sl+  12:57   0:00 ruby -e sleep 5 9 10 11 12
```

- 入力から4個ずつ引数をとり、コマンドを実行する
- 同時に3個のプロセスが起動している
- 5秒後には各プロセスが終了し、次の

```
ruby -e sleep 5 13 14 15 16
ruby -e sleep 5 17 18 19 20
ruby -e sleep 5 21 22 23 24
```

のプロセスが起動してくる。

## -nと-Lの違い

```
-n3    各プロセスが引数3個をとるようにする（入力をスペースによって引数に区切る）
-L3    各プロセスが引数3個をとるようにする（入力を改行によって引数に区切る）
```

入力にスペースが含まれている場合の挙動が違う。

```
$ echo one two "three four"
one two three four

$ echo one two "three four" | xargs -n1 ruby -e 'p ARGV'
["one"]
["two"]
["three"]
["four"]

$ echo one two "three four" | xargs -L1 ruby -e 'p ARGV'
["one", "two", "three", "four"]
```

`man xargs`には

```
Use the -n option with -P; otherwise chances are that only one exec will be done.
（-Pと同時に-nを使うこと。そうしないと1回しかexecされないだろう）
```

と書いてあったが、-nでなく-Lでもいいようだった。
（追記：GNU findutilsに含まれるxargs 4.6.0ではmanもそのように修正されていた）


## 備考

`-p`をつけるとコマンドを実行する前にそのコマンドラインを表示して確認を求めてくれる。

xargsもLinux（GNU）とBSD（Mac含む）では一部のオプションが異なるので注意。
libwebp を使って iOS で WebP を表示する

ファイルサイズを削減できる WebP。iOS で WebP を使用する OSS を見かけますが、使用用途にイマイチマッチしなかったので、libwebp を直接使用して描画することにしました。やってみると以外と簡単。

## iOS framework のダウンロードとインストール

webp を iOS で使用するために framework 形式で Google が公開しているのでこちらをダウンロードします。

* [downloads repository](https://storage.googleapis.com/downloads.webmproject.org/releases/webp/index.html)
  * この記事を書いた時点での最新は libwebp-0.5.0-ios-framework.tar.gz 

tar.gz を解凍するとそのまま framework のフォルダ構成になっているので、WebP.framework という名前のフォルダに解凍。
xcode の 「Link Binary With Libraries」 に WebP.framework を追加します。

## webp 画像の描画

webp から UIImage を作るのは次の順序です。

1. ファイルのロード
2. WebPDecodeARGB を呼び出してデコード
3. デコードしたバッファから CGDataProvider を作成
4. CGDataProvider から CGImage を作成
5. CGImage から UIImage を作成

libwebp で使用するのは WebPDecodeARGB だけです。この関数は WebP をデコードするもので、この戻り値は次のフォーマットになっています。

<pre>[a0, r0, g0, b0, a1, r1, g1, b1, ...]</pre>

参照：[WebP API Documentation](https://developers.google.com/speed/webp/docs/api#simple_decoding_api)

これはそのまま CGImageRef のバッファーとして使用できるので、CGDataProvider でラップして CGImageCreate に渡します。

```objc
- (UIImage*)loadImageAtPath:(NSString*)path
{
  // ファイルのロード
  NSData* data = [[NSData alloc] initWithContentsOfFile:path];
  size_t length = data.length;
  uint8_t* image = (uint8_t*)data.bytes;

  // デコード
  int width, height;
  uint8_t* decoded = WebPDecodeARGB(image, length, &width, &height);
  if (decoded == NULL) {
    return nil;
  }

  // デコードしたバッファから CGDataProvider を作成
  self.size = CGSizeMake(width, height);
  CGDataProviderRef provider =
    CGDataProviderCreateWithData(NULL, decoded, width * 4 * height, releaseBuffer);
  
  // CGDataProvider　から CGImage を作成
  CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
  CGImageRef cgImage = CGImageCreate(width,
    height,
    8,         // ビット深度、デコードバッファは uint8 なので 8bit
    32,        // ピクセルあたりのビット数、8x4(ARGB) なので 32bit
    width * 4, // １ラインあたりのバイト数、4byte(32bit) かける幅
    space,
    kCGImageAlphaNoneSkipFirst, // 1byte目のアルファ値を無視する
    provider,
    NULL,
    NO,
    kCGRenderingIntentDefault);

  // CGImage から UIImage を作成
  UIImage* uiImage = [UIImage imageWithCGImage:cgImage];

  CGImageRelease(cgImage);
  CGColorSpaceRelease(space);
  CGDataProviderRelease(provider);
	
  return uiImage;
}

static void releaseBuffer(void *info, const void *data, size_t size)
{
  // WebPDecodeARGB で取得したバッファは free で開放します。
  free((void*)data);
}

```

##　描画速度
測定したところ JPEG が 1~10ms ぐらいに対して 10 ~ 100ms なので10倍程度かかってます。一方でファイルサイズは半減しているのでネットワークからファイルを取得する場合は向いているかもしれません。
【Laravel5】FileSystemsを使用してGCSへアップロードする

# 目的
LaravelからGCSへファイルをアップロードしたい。

# GCSの設定
## 認証キーの準備
GCPのAPI Managerの認証情報から認証情報を作成
<img width="725" alt="スクリーンショット 2016-06-01 12.48.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/57634/427a150b-9921-5e9f-ae5c-2ddef4b2d379.png">

サービスアカウントキーを選択


![スクリーンショット 2016-06-01 12.48.52.png](https://qiita-image-store.s3.amazonaws.com/0/57634/656af599-c6fd-16af-482c-517ca44ba970.png)

サービスアカウントを適切に設定。
キータイプはP12

![スクリーンショット 2016-06-01 12.48.59.png](https://qiita-image-store.s3.amazonaws.com/0/57634/035ea612-b51f-9cad-446b-4f591636a6ee.png)

作成すると秘密鍵がDLされ秘密鍵生成時のパスワードが表示される。
大切に保存しておく。

## サービスアカウントIDの取得
IAMと管理　-> サービスアカウント
から今回APIキーを作成したサービスアカウントIDをコピーしておく
![スクリーンショット 2016-06-01 12.49.58.png](https://qiita-image-store.s3.amazonaws.com/0/57634/5d2f5a7a-eaaf-9424-4876-d804c17a4194.png)

# アプリケーション側の設定
以下のライブラリを使用するとLaravelのStorageの機能を使って実装が可能
https://packagist.org/packages/websight/l5-google-cloud-storage

composer.jsonの
"require"に  
        "websight/l5-google-cloud-storage" : "1.*",
追加

```composer.json
 "require": {
        "websight/l5-google-cloud-storage" : "1.*"
    },
```

config/appの ServiceProvidersに以下を追加

```config/app.php
Websight\GcsProvider\CloudStorageServiceProvider:
```


config/filesystems.phpにgcsの設定を追加。
ここで設定する値はKEY等 git管理をせずに、また環境ごとに変わる情報が多いためenvに切り出しておく。

```config/filesystems.php
'gcs' => [
		    'driver' => 'gcs',
	 	    'service_account' => env('SERVICE_ACCOUNT'),
	        'service_account_certificate' => storage_path() . '/' . env('SERVICE_ACCOUNT_CERTIFICATECATE'),
		    'service_account_certificate_password' => env('SERVICE_ACCOUNT_CERTIFICATE_PASSWORD'),
		    'bucket'          =>  env('GCS_BUCKET')
		],
```

なお、envの設定は以下のとおり

```.env
SERVICE_ACCOUNT = サービスアカウントID
SERVICE_ACCOUNT_CERTIFICATE =  {今回DLした秘密鍵の設置pass}
SERVICE_ACCOUNT_CERTIFICATE_PASSWORD = 秘密鍵生成時のpassword
GCS_BUCKET = 対象bucket
```

その後GCSで生成した秘密鍵をアプリケーションに配置する。
今回はstorage/pass/{秘密鍵}というパスの秘密鍵を使うように指定したため、
そのファイルパスに秘密鍵を配置しておく。

これでアプリケーション側で

```
$disk = \Storage::disk('gcs');
$disk->put($upload_directory_path, $file);
```

のようにしてあげればアップロードが完了する。

他にもLaravelのファイルストレージのメソッドが使えるので実装が便利
http://readouble.com/laravel/5/1/ja/filesystem.html
XcodeでのiOSアプリのUI自動テスト


Xcode7からテストツールの機能が追加されたのですが、今回はUIの自動テストの使い方のまとめです。

## プロジェクトのtargetに「iOS UI Testing Bundle」を追加
![スクリーンショット 2016-06-01 11.54.32.png](https://qiita-image-store.s3.amazonaws.com/0/44140/1955efbf-90f6-3652-42d7-86bbc40381d8.png "スクリーンショット 2016-06-01 11.54.32.png")

![スクリーンショット 2016-06-01 11.54.37.png](https://qiita-image-store.s3.amazonaws.com/0/44140/aef8ad7b-cca5-4a8d-5e15-49a09a25c5b1.png "スクリーンショット 2016-06-01 11.54.37.png")

## テストコードを実装する
### XCTestCaseのテストクラスが追加されるので、ここにテストケースを実装する
![スクリーンショット 2016-06-01 11.54.50.png](https://qiita-image-store.s3.amazonaws.com/0/44140/8cc79677-6f00-aace-dacc-d16d1dce90fe.png "スクリーンショット 2016-06-01 11.54.50.png")

### Xcode下部のレコード機能で画面操作を記録する

今回はこの機能を使って、UIのテストコードを作成します。

![スクリーンショット 2016-06-01 12.14.00.png](https://qiita-image-store.s3.amazonaws.com/0/44140/91038216-e674-a83d-12cf-3e77c642f8f4.png "スクリーンショット 2016-06-01 12.14.00.png")

この機能は画面で操作した内容をそのままXCTestCaseのコードに落とし込みます。
今回は以下のような画面構成のアプリで簡単なUIテストを実施します。

![スクリーンショット 2016-06-01 12.21.59.png](https://qiita-image-store.s3.amazonaws.com/0/44140/2d3b5251-605c-2f89-081d-a687812f0c11.png "スクリーンショット 2016-06-01 12.21.59.png")

確認する動作は以下の通りです。

1. Fisrtの画面でNextをタップ
2. Secondの画面でナビゲーションバーのバックボタンをタップ
3. Fisrtの画面でNextをタップ
4. Secondの画面でNextをタップ
5. Finishの画面でナビゲーションバーのバックボタンをタップ
6. Secondの画面でナビゲーションバーのバックボタンをタップ

エミュレータを起動/もしくは端末をUSBで繋いだ状態で、Xcode下部の赤丸ボタンをクリックします。
そうすると記録が開始されるので、上記の画面遷移を行います。
動作の記録が完了したら、再びXcode下部の赤丸ボタンをクリックします。
その結果、以下のようにテストコードが生成されます。

![スクリーンショット 2016-06-01 12.27.56.png](https://qiita-image-store.s3.amazonaws.com/0/44140/32bad0eb-3855-0386-dff9-248ebab61208.png "スクリーンショット 2016-06-01 12.27.56.png")

記録したテストはテスト実行することによって、確認可能です。

![スクリーンショット 2016-06-01 12.29.14.png](https://qiita-image-store.s3.amazonaws.com/0/44140/6957928c-8539-90dd-515c-5cbc78313b4b.png "スクリーンショット 2016-06-01 12.29.14.png")

UIのテスト自動化で、テストがだいぶ簡略化できそうですね。
npm shrinkwrap やっていると package.json 更新しただけでは、npm install でインストールされない


package.json の dependencies を更新したのに、 `npm install` しても更新後のバージョンがインストールされないって時は、`npm shrinkwrap` しているかどうかを確認した方がいい。 `npm install` は npm-shrinkwrap.json がある時、 package.json よりも優先してそっちを見る。 なので、一度、 `npm install hoge -save` として個別でインストールした後、 `npm shrinkwrap` しなす必要がある。この後は、 'npm install' でも package.json に定義されたバージョンがインストールされる。
Vagrant（Ubuntu 14.04LTS：64bit版）のpython3（pyenv）環境にdlib をインストール

以下のVagrant環境にdlibをインストールする場合のtips

Vagrant環境
Ubuntu 14.04 LTS (64bit.ver)
pyenv　(python3.5.1 or anaconda3-4.0.0)

#dlibインストール時に発生する問題

pip経由にてdlibをビルド・インストールしようとすると、コンパイル時にエラー発生してこける。 

```
# pipにて、dlibをビルド・インストールするコマンド
pip install dlib　　
```

## Exception: Compilation failed (return status=1) が発生する場合

これはPython3を64bit環境で使用する際に発生する現象とのこと。
まずエラーメッセージに下記の内容が表示される場合には、

```
再配置 R_X86_64_32S (`_Py_NotImplementedStruct' に対する) は
共有オブジェクト作成時には使用できません。-fPIC を付けて再コンパイルしてください。
```

pyenvでpython3をビルド・インストールする際に、CFLAGS="-fPIC"と
オプションを下記のように設定してやればOK

```
# オプション　CFLAGS="-fPIC" をつけて再ビルド・インストール
pyenv uninstall 3.5.1
CFLAGS="-fPIC" pyenv install 3.5.1
```

##virtual memory exhaustedが発生する場合

vagrant環境では初期設定を変更しない限り環境用に512MB分のメモリが確保されるが、
ビルド時にメモリ不足のため、以下のエラーメッセージ出力と共にビルドプロセスが途中で中止されてしまう。

```
virtual memory exhausted: メモリを確保できません
```

そこでVagrantfileに以下の内容を追記して、vagrant環境用に確保するメモリ量を増加させる必要がある。

```:Vagrantfile
# 確保するメモリ量を2018MBに変更
config.vm.provider :virtualbox do |v|
    v.customize ["modifyvm", :id, "--memory", 2018]
end
```

※　なお上記２つのエラーはdlibに限らず、pipでライブラリをビルド・インストール時に発生する可能性もある。

#参考サイト
[PYENVでのPYTHONで-FPICを付けて再コンパイル](http://www.chazine.com/archives/3648)
[Python3 + mod_wsig3.3 + Apache2.2 でHelloWorldをブラウザ表示](http://istks.net/1127)
[Vagrantfileのテンプレート](http://jnst.hateblo.jp/entry/2014/11/25/133752)
tigでgit log -p (filename)

gitのtigで、tree-viewからファイルを選択して、
そのファイルだけのdiffを見るには

.tigrcで設定

```
bind generic L !git log -p %(file)
```

genericはグローバルにキーバインディングする
L　実際に割り当てるキー

使い方としては
tigで起動し、
t でtree-viewに移動
ファイルを選択して、
L 
これでgit log -p (指定したファイル名)
の結果が見れる。

もうぼちぼちgitlabがいらなくなるかも
Spring TestでJMockitを使う方法


簡単にできたけど、今後同じように迷わないように備忘録として残します。

### 各バージョン
訳あって`Spring`のバージョンが`3.2.8.RELEASE`ですが、4系の最新版でも問題ないです。

 * Java
 1.8.0 update 92
 
 * Spring Framework
 3.2.8.RELEASE
  
 * [JMockit](http://mvnrepository.com/artifact/org.jmockit/jmockit/1.23)
 1.23

 * JUnit
 4.12

### はじめに
一般的な`JMockit`を使ったテストの実行方法は、

```java:SampleTest.java
package jp.ijufumi.sample.test;

import mockit.integration.junit4.JMockit;
import org.junit.runner.RunWith;

@RunWith(JMockit.class)
public class SampleTest {
}
```

などのように、`@RunWith(JMockit.class)`を使って行うかと思います。
ただ、`Spring`を使ったシステムでのテストを実行する場合は、`@RunWith(SpringJUnit4ClassRunner.class)`を指定したいところなので、
`Spring Test`の機能にある`TestExecutionListener`を使って実行したいと思います。


### やり方

まず、`mockit.integration.junit4.JMockit`と同様な処理を行う`TestExecutionListener`を用意します。

```java:JMockitTestExecutionListener.java
package jp.ijufumi.sample.test.support;

import mockit.internal.startup.Startup;
import org.springframework.test.context.support.AbstractTestExecutionListener;

public class JMockitTestExecutionListener extends AbstractTestExecutionListener {
    static { Startup.initializeIfPossible(); }
}
```

そして、それを`@TestExecutionListener`アノテーションに指定するだけです。

```java:SampleTest2.java
package jp.ijufumi.sample.test;

import jp.ijufumi.sample.test.support.JMockitTestExecutionListener;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;

import org.junit.runner.RunWith;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:META-INF/spring/applicationContext-test.xml"})
@TestExecutionListeners({
        JMockitTestExecutionListener.class
})
public class SampleTest2 {
}
```

### おわりに
`JMockit`自体の使い方は
 * [JMockit使い方メモ](http://qiita.com/opengl-8080/items/a49d4dae9067413ccdd6)
がすごく参考になると思います。
めざせpythonライブラリマスター （５）terminaltables

#【ライブラリ説明】
　リストを使って表が書けます。

#【プログラム】
```py:terminaltables1.py
# -*- coding: utf-8 -*-

from terminaltables import AsciiTable

table_data = [
    ['Heading1', 'Heading2'],
    ['row1 column1', 'row1 column2'],
    ['row2 column1', 'row2 column2'],
    ['row3 column1', 'row3 column2']
]

table = AsciiTable(table_data)
print table.table
```
<img width="178" alt="table1.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/90a6b70d-fb9c-49c6-3d77-29de7f1e4c33.png">

#【参考サイト】
　[terminaltables](https://pypi.python.org/pypi/terminaltables/3.0.0)
　[github](https://github.com/Robpol86/terminaltables)
Thenライブラリみたいにインスタンスの設定に利用できるカスタム演算子…

[Then](https://github.com/devxoul/Then)というインスタンスの設定を簡潔に書けるライブラリがあります。が、デフォルトではNSObjectを継承するクラスで利用可能なだけで、独自クラス・構造体ではThenプロトコルを付与する必要があります。

それって面倒…

なので汎用的に利用できるカスタム演算子を作成してみます。

## infixな演算子

```Swift
infix operator … { associativity left }

func …<T>(lhs: T, @noescape rhs: inout T -> ()) -> T {
    var _lhs = lhs
    rhs(&_lhs)
    return _lhs
}
```

…を演算子にしてみました。使い方は以下のようになります。独自構造体でも利用できています。

```Swift
let button = UIButton(type: .Custom)…{
    $0.setTitle("title", forState: .Normal)
}
button.currentTitle         // "title"

struct A {
    var text: String?
}

let a = A()…{
    $0.text = "one"
    }…{
        $0.text             // "one"
        $0.text = "two"
}
a.text                      // "two"
```

## prefix/postfixな演算子

この勢いでprefixとpostfixも作ってみましょう。

```Swift
prefix operator … {}

prefix func …<T>(conf: inout T -> ()) -> T -> T {
    return {
        object in
        var _object = object
        conf(&_object)
        return _object
    }
}

postfix operator … {}

postfix func …<T>(object: T) -> ((inout T) -> ()) -> T {
    return {
        conf in
        var _object = object
        conf(&_object)
        return _object
    }
}
```

こんな感じでしょうか。

prefixは以下

```Swift
let conf_a = …{
    (inout a: A) in
    a.text = "prefix"
}
let a_prefix = conf_a(A())
a_prefix.text               // "prefix

let conf_button = …{
    (inout button: UIButton) in
    button.setTitle("prefix", forState: .Normal)
}
let button_prefix = conf_button(UIButton(type: .Custom))
button_prefix.currentTitle        // "prefix"
```

postfixは以下

```Swift
let a_conf = A()…
let a_postfix = a_conf {
    $0.text = "postfix"
}
a_postfix.text              // "postfix"

let button_conf = UIButton(type: .Custom)…
let button_postfix = button_conf {
    $0.setTitle("postfix", forState: .Normal)
}
button_postfix.currentTitle       // "postfix"
```

のように使うことになります。
prefixもpostfixも上記のような使い方では利用価値が無いように感じますが、高階関数で利用すると良いかもしれません。
s-templates.jsonでJSONフォーマットを超えるVTLを書きたいときは代わりにs-templates.yamlを書けば良い

s-templates.jsonに

```json
{
  "apiGatewayRequestTemplate": {
    "application/json": {
      {
        "accountId": "$context.identity.accountId",
        "apiId": "$context.apiId",
        "apiKey": "$context.identity.apiKey",
        "caller": "$context.identity.caller",
        "headers": {
      #foreach( $key in $input.params().header.keySet() )
          "$key": "$input.params().header.get($key)"#if( $foreach.hasNext ),#end
      #end
        },
        "httpMethod": "$context.httpMethod",
        "path": "$context.resourcePath",
        "pathParameters": {
      #foreach( $key in $input.params().path.keySet() )
          "$key": "$input.params().path.get($key)"#if( $foreach.hasNext ),#end
      #end
        },
        "queryParameters": {
      #foreach( $key in $input.params().querystring.keySet() )
          "$key": "$input.params().querystring.get($key)"#if( $foreach.hasNext ),#end
      #end
        },
        "requestId": "$context.requestId",
        "requestParameters": $input.json('$'),
        "resourceId": "$context.resourceId",
        "sourceIp": "$context.identity.sourceIp",
        "stage": "$context.stage",
        "user": "$context.identity.user",
        "userAgent": "$context.identity.userAgent",
        "userArn": "$context.identity.userArn"
      }
    }
  }
}
```

みたいなVTLを書きたくなるかと思いますが、これはJSONのフォーマットに準拠していないのでServerlessではパースエラーです。

JSONを全部エスケープして１行の文字列に変換してしまえばいいらしいですが、ヒトがさわれるものではなくなってしまいます。

じゃあ、どうするか。

[「YAMLで中に複数行で書けばいいんじゃね？」](https://github.com/serverless/serverless/issues/537#issuecomment-212635809)というコメントを見つけました。

```yaml
apiGatewayRequestTemplate:
  application/json: |
    {
      "accountId": "$context.identity.accountId",
      "apiId": "$context.apiId",
      "apiKey": "$context.identity.apiKey",
      "caller": "$context.identity.caller",
      "headers": {
        #foreach( $key in $input.params().header.keySet() )
          "$key": "$input.params().header.get($key)"#if( $foreach.hasNext ),#end
        #end
      },
      "httpMethod": "$context.httpMethod",
      "path": "$context.resourcePath",
      "pathParameters": {
        #foreach( $key in $input.params().path.keySet() )
          "$key": "$input.params().path.get($key)"#if( $foreach.hasNext ),#end
        #end
      },
      "queryParameters": {
        #foreach( $key in $input.params().querystring.keySet() )
          "$key": "$input.params().querystring.get($key)"#if( $foreach.hasNext ),#end
        #end
      },
      "requestId": "$context.requestId",
      "requestParameters": $input.json('$'),
      "resourceId": "$context.resourceId",
      "sourceIp": "$context.identity.sourceIp",
      "stage": "$context.stage",
      "user": "$context.identity.user",
      "userAgent": "$context.identity.userAgent",
      "userArn": "$context.identity.userArn"
    }
```


## 参考URL

- https://github.com/serverless/serverless/issues/537#issuecomment-212635809
- http://qiita.com/mpppk/items/40badc30008a86928406
- http://qiita.com/r7kamura/items/6420538789da95cd2f47
JavaScriptで小数点を含む計算をするとき

```
22.4 / 14
```

という計算をしたかった。

電卓を何回叩いても

```
1.6
```

何回コンソールしても

```
1.5999999999999999
```

(´∩｀。)

なぜかは調べても書いてなかった。

でも、

```
224 / 140
```

にしたら

```
1.6
```

ヽ(ﾟ∀ﾟヽ

JavaScriptは小数点が含まれると、誤差が出るみたいです。


---

追記

書いてあった。

> これは、JavaScriptの小数点計算を行う際に用いられる「IEEE 754」という規格で発生する誤差だそうです。

 > [IEEE 754 - Wikipedia](https://ja.wikipedia.org/wiki/IEEE_754)

[JavaScriptの小数点を含む計算での誤差](http://azuma006.hatenablog.com/entry/2014/03/20/233907)
Tokyo Ruby Kaigi 11に行ってきた。

　[TokyoRubyKaigi11](http://regional.rubykaigi.org/tokyo11")に行ってきました。プログラムは以下のとおり、

|表題|発表者|
|:--|:--|
|Streem|"日経Linuxライター" まつもとゆきひろ|
|mruby/c|九州工業大学 田中 和明|
|Rubyに型があると便利か|株式会社spice life 栗原 勇樹| 
|最速ウェブサーバの作り方|株式会社ディー・エヌ・エー 奥一穂|
|アプリケーションへのRubyインタープリターの組み込み|株式会社クリアコード 須藤功平|
|Re: Pattern Matching in Ruby|株式会社野村総合研究所 辻本 和樹|   
|Image Recognition and Code that shouldn't exist|Aaron Patterson|   
|IMF: Image Manipulation Framework|リクルートホールディングス　村田 賢太|
|Optcarrot:　 A pure-ruby NES emulator|遠藤侑介|

この中で最も私が関心を持ったのは　九州工業大学 田中 和明　先生の　mruby/c　のセッションです。発表内容にはコードを含む（つまり実装、開発の話をする）ことということでしたので、mruby/cという言葉が初耳（しかもweb畑）のわたしはすこし遠くからmruby/cを眺めてみようと思います。　
田中先生の発表を概要を傾聴させていただいた限りでまとめ、その後それについて自分なりに考察していきたいと思います。
([田中先生の発表のスライドはこちら](http://www.slideshare.net/kazuakitanaka391/mrubyc-in-tokyorubykaigi11), [事前インタービューはこちら](http://regional.rubykaigi.org/tokyo11/interview/kaz0505/)）

# mruby/cについて（発表の内容）
しまねソフト研究開発センターで開発されているmrubyよりもさらに小型なrubyの実装です。
mrubyのVMはだいたい400KB以下ほどの容量であるのに比べ、mruby/cは40KBのほどに抑えられているそうです。
このサイズになるとArmよりもさらに小さいワンチップマイコン（そのなかで比較的大きめのもの）で実装が可能になるようでそこを目指しているということで、以下のような特徴があるということでした。

##GC（garbage collecter）がない
mruby/cにはガベージコレクターがありません。
ではどうやって動かしているのかというと実行するプログラムは非常に小さなものにかぎり、
そのプログラムが終了したタイミングで固有メモリ領域を一度初期化するという方法をとっています。
もし長いプログラムを実行したい場合、どうすれば良いのかについては次のConcurrencyで実現しているとのことでした。

##Concurrencyの確保
mruby/cはOSなし（つまりベアメタル）で動作するにもかかわらず
Concurrencyを確保しています。
マイコンクラスのコンピュータで動作させることを前提としているので、
複数コアでの実行ではなく、１コアでの実行になるため、
CPU時間を分割して複数のプログラムが同時に実行される（ように見える）
ようにしています。

##起動時間の特性
プログラムの起動時には以下のプロセスを実行します。
小さなプログラムコードを起動する際に非常に高速に起動するようになっています（ruby, mrubyとの比較については[田中先生のスライド](http://www.slideshare.net/kazuakitanaka391/mrubyc-in-tokyorubykaigi11)を参照ください）

- VMを初期化します
- クラスを作成します
- クラス、メソッドをメモリーに登録します
 1. メソッドのエントリーポイントを作成します
 2. メソッドのシンボルを作成します
 3. メソッドのハッシュテーブルにエレメントを追加します
React.jsでインタラクティブに変更可能なテーブルを作るための参考

# 良さそうなもの
- http://allenfang.github.io/react-bootstrap-table/example

# その他

- https://react.rocks/tag/DataTable
- https://react.rocks/example/react-datatable
- https://react.rocks/example/react-spreadsheet
- https://github.com/kaivi/ReactInlineEdit
- https://themeteorchef.com/snippets/click-to-edit-fields-in-react/
- https://react.rocks/example/Reactvirtualized_hover
【備忘録】Middlemanでタグをひっぱてくると各括弧[ ]（ブラケット）がついてくる

#["タグです"]

middleman-blogにて、
中身であるブログ記事（.md）に記述した、
**formatter**の中の、**tags: **を読み出そうとすると、
**各括弧[ ]（ブラケット）**がついてくる。。

## formatterには、以下のように記載

```
title: リニューアルしました！
date: 2016-05-27 09:58 UTC
tags: タグです
```

##出力したいslimには、以下のように記述
```
.info-innner
- page_articles[0...5].each do |article, i|
  h2
    = link_to article.title, article
    span
      = article.date.strftime('%Y年%m月%d日')
  span.tags
    = article.tags
```

##出力結果

["タグです"]


##原因
タグは、複数入力できるので、配列として出力される。
例えば、
```
tags: ブログ, middleman, hello, world
```
と記述すると、

["ブログ, middleman, hello, world"]
このように、親切に全部だしてくれます

#解決策（とりあえずの）
= article.tags の後に、**「.first」**をつけてあげる

```

= article.tags.first

```

これで、タグが1つであろうと、複数あろうと、
最初の1個だけをとってきてくれます。
RedisのHASH、SET、ZSET 型で、要素数が0になると、キーそのものが削除されるので、注意した方が良い


あまり使わないだろうけど、単体テストでZSETに対してEXISTSを使っていたら、思ってたのと違う挙動した。

# 概要

メンバー数が0になると、キー自体が削除されるっぽい。  
PHPでいえば、以下のような挙動をする。

```php
<?php
$set[] = 'a';
array_pop($set);
var_dump($set);
  // PHPならarray(0) だが、
  // Redisだと"Undefined variable"になる。
```


## 検証

### Hash

```
127.0.0.1:6379[255]> FLUSHALL
OK
127.0.0.1:6379[255]> HSET myh a aa
(integer) 1
127.0.0.1:6379[255]> HGETALL myh
1) "a"
2) "aa"
127.0.0.1:6379[255]> GET myh
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379[255]> EXISTS myh
(integer) 1

127.0.0.1:6379[255]> HDEL myh a
(integer) 1
127.0.0.1:6379[255]> HGETALL myh
(empty list or set)
127.0.0.1:6379[255]> GET myh
(nil)
127.0.0.1:6379[255]> EXISTS myh
(integer) 0
```

### Set

```
127.0.0.1:6379[255]> SADD mys a
(integer) 1
127.0.0.1:6379[255]> SMEMBERS mys
1) "a"
127.0.0.1:6379[255]> GET mys
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379[255]> EXISTS mys
(integer) 1

127.0.0.1:6379[255]> SREM mys a
(integer) 1
127.0.0.1:6379[255]> SMEMBERS mys
(empty list or set)
127.0.0.1:6379[255]> GET mys
(nil)
127.0.0.1:6379[255]> EXISTS mys
(integer) 0
```

### Sorted Set

```
127.0.0.1:6379[255]> ZADD myz 0 a
(integer) 1
127.0.0.1:6379[255]> ZRANGE myz 0 -1 withscores
1) "a"
2) "0"
127.0.0.1:6379[255]> GET myz
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379[255]> EXISTS myz
(integer) 1

127.0.0.1:6379[255]> ZREM myz a
(integer) 1
127.0.0.1:6379[255]> ZRANGE myz 0 -1 withscores
(empty list or set)
127.0.0.1:6379[255]> GET myz
(nil)
127.0.0.1:6379[255]> EXISTS myz
(integer) 0
```
cでズンドコゲッター

#概要
paizaのcでズンドコゲッターやってみた。
#実際
https://paiza.io/projects/G2-MAQKW1VOseqb6_YeDew
#サンプルコード
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

char * zundoko(void)
{
    struct sockaddr_in server;
    int sock;
    char buf[256];
    char * deststr = "ohijs0.paas.jp-e1.cloudn-service.com";
    unsigned int ** addrptr;
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) 
    {
	    perror("socket");
	    return 1;
    }
    server.sin_family = AF_INET;
    server.sin_port = htons(80);
    server.sin_addr.s_addr = inet_addr(deststr);
    if (server.sin_addr.s_addr == 0xffffffff) 
    {
	    struct hostent * host;
	    host = gethostbyname(deststr);
	    if (host == NULL) 
	    {
		    if (h_errno == HOST_NOT_FOUND) 
		    {
			    printf("host not found : %s\n", deststr);
		    } 
		    else 
		    {
			    printf("%s : %s\n", hstrerror(h_errno), deststr);
		    }
		    return 1;
	    }
	    addrptr = (unsigned int **) host->h_addr_list;
	    while (* addrptr != NULL) 
	    {
		    server.sin_addr.s_addr = * (* addrptr);
    	    if (connect(sock, (struct sockaddr *) &server, sizeof(server)) == 0) 
    	    {
			    break;
		    }
		    addrptr++;
	    }
	    if (* addrptr == NULL) 
	    {
		    perror("connect");
		    return 1;
	    }
	    else
	    {
	        //printf("ok connect\n");
	    }
    } 
    else 
    {
	    if (connect(sock, (struct sockaddr *) &server, sizeof(server)) != 0) 
	    {
		    perror("connect");
		    return 1;
	    }
    }
    memset(buf, 0, sizeof(buf));
    snprintf(buf, sizeof(buf), "GET /zundoko HTTP/1.1\r\nHost: ohijs0.paas.jp-e1.cloudn-service.com\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n\r\n");
    int n = write(sock, buf, (int) strlen(buf));
    if (n < 0) 
    {
	    perror("write");
	    return 1;
    }
    else
    {
        //printf("ok write %d\n", n);
    }
    memset(buf, 0, sizeof(buf));
    n = read(sock, buf, sizeof(buf));
    if (n < 0) 
    {
	    perror("read");
	    return 1;
    }
    else
    {
        //printf("ok read %d\n", n);
    }
    char t[64];
    char * g;
    g = strstr(buf, "\r\n\r\n");
    g += 4;
    //puts(g);
    close(sock);
    return g;
}
int main() 
{
    int i = 0;
    int j = 0;
    printf("ここから　");
    while (j < 1) 
    {
        char * s = zundoko();
        printf("%s ", s);
        if (strcmp(s, "ドコ") == 0) 
        {
            if (i == 4) j = 1;
            i = 0;
        }
        else
        {
            i++;
        }
    }
    printf("キ・ヨ・シ！");
}
```
UITextView で中華フォント現象が発生する

# 詳細

Interface Builder で UITextView を配置する時、初期値として “Lorem ipsum…” が挿入されています。
![](https://qiita-image-store.s3.amazonaws.com/0/3603/903e6b6e-c449-a814-1bf6-6a41b6198c66.png)
*Lorem ipsum*

バグだと思いますが、この内容を Interface Builder で少しでも変更すると iOS 9系に限り日本語環境であっても中華フォント現象が発生してしまうようです。なのでこのプレースホルダーは Interface Builder からは触らずにコードから nil を入れておくような処理を実装するのが良いです。
<img width=375 src="https://qiita-image-store.s3.amazonaws.com/0/3603/2c7014c2-0e0e-4da6-71f1-8f86dc8dd06f.png">


# 関連記事

[iOS で日本語文章に発生する中華フォント現象とは](http://qiita.com/usagimaru/items/46c27c42e862fb8aba7e)
MySQL5.7にバージョンアップしてスロークエリが頻発したときの対処メモ


# 経緯
社内のDBを MySQL5.6 -> MySQL5.7 へ移行後、今まで問題なく動いていたクエリが軒並みスロークエリになってしまいました。

テーブルのレコード数は約300万件
下記のような検索を行っていました

```sql
SELECT 
    `id` 
FROM 
    `table` 
WHERE 
    id IN ([3,000件ほどの`id`]) 
    AND col1 = '***' 
    AND col2 = '***' 
    AND col3 = '***' ;
```

# 調査
検出したスロークエリに対して`EXPLAIN`を付けて、MySQL5.6環境とMySQL5.7環境で実行したところ、インデックスが使われていないことがわかりました

`MySQL5.7`

| type | possible_keys| key |
|:-----|:----|:---|
| ALL | PRIMARY,col1,col2,col3 | NULL|

`MySQL5.6`

| type | possible_keys| key |
|:-----|:----|:---|
| range | PRIMARY,col1,col2,col3 | PRIMARY|


# 原因
オプティマイザがおかしいのかなと思って調べてましたが
`SHOW WARNINGS;`
してみると

```
Warning 3170    Memory capacity of 8388608 bytes for 'range_optimizer_max_mem_size' exceeded. Range optimization was not done for this query.
```

というWarningが出てました。

## `range_optimizer_max_mem_size`
http://dev.mysql.com/doc/refman/5.7/en/range-optimization.html#range-optimization-memory-use

`range_optimizer_max_mem_size`というパラメータがMySQL5.7から追加されたそうで、範囲検索の際にこのメモリ上限をオーバーしてしまったためにインデックスが使われなかったようです。


# 対処
## メモリの上限を無くす
`SET GLOBAL range_optimizer_max_mem_size = 0;`
もしくは

```my.cnf
[mysqld]
range_optimizer_max_mem_size=0
```
を追記して再起動で以前同様に検索ができました。

## indexの精査
複数のインデックスが候補に挙がっているときにメモリの上限を越えていたので、不要なインデックスを削除しました。
本来の原因は`range_optimizer_max_mem_size`ですが、これはこれで精査するいい機会となりました。
Canvas#drawImage で縮小した際に綺麗に表示する幾つかの方法

Canvas#drawImage を使ってかなり大きな画像を縮小表示すると、派手にジャギーが発生する事があります。(drawImage のデフォルトのフィルターが速度優先らしく、現状このようになってしまうとか)

antialias を効かせるか、もうちょっと綺麗に表示する方法が無いか色々と探ってみました。

- 方法1. canvasContext.drawImage(source, sx, sy, sw, sh, tx, ty, tw, th) を使って描画する方法
    - 画像1 と 2 の Original がこれです

- 方法2. [HTML5 Rocks](http://www.html5rocks.com/en/tutorials/canvas/hidpi/?redirect_from_locale=ja
) にあるように `ratio = devicePixelRatio / backingStoreRatio` を計算し、canvas のサイズ(width, height)と canvas のviewサイズ(style.width, style.height) を設定し、canvasContext.scale(rario, ratio) を実行し、displayの表現能力を活かしきる方法
    - 画像1 と 2 の backingStoreRatio がこれです (toRetina はこれの亜種です)

- 方法3. [StackOverflow](http://stackoverflow.com/questions/17861447/html5-canvas-drawimage-how-to-apply-antialiasing
) にあるように、downsampling を何度か行い(1.0 → 0.5 → 0.25, ...) 滑らかにする方法
    - 画像1 と 2 の antialiasing がこれです
    - 速度とコストのトレードオフが発生します

## Example

| 画像1<br>MacBookPro Retina Display | 画像2<br>DELL の外付け Display |
|---|---|
| ![](https://gyazo.com/802e0b85fe808206e5ae9e9b86187d92.png) | ![](https://gyazo.com/54b956a00f4b675c0cc04ea95c2d7412.png) |


## 表示品質

このような単純な例だと、
Retina Display における表示品質は `方法2 > 方法3 > 方法1` で、
非Retina Display における表示品質は `方法3 > 方法2 > 方法1` になるようです。

[jsfiddle](http://jsfiddle.net/nvo8b6nw/10/) で実際に試す事ができます。
コードでUIを作る際に、いい感じにコンポーネント化したかった

最近になって、UIを全てコードで書くことをやっています。
初めは、Storyboardよりも差分わかりやすくていいやーとノリノリでしたが
ファイル数が膨大になってきて、同じような記述をまとめたくなりました。
あと、はやりのReactっぽさをネイティブアプリでも行うことを見越して、Component化することを試したくなりました。

## やってみたこと

Component.swiftをつくり、その中で各UIのまとまりをstructで定義してます。
[メソッドチェインでUIButtonのプロパティを設定したかった][1]
こちらの記事で教えてもらった[Then][2]を使って記述しています。

```Component.swift
import UIKit

struct ButtonComponent {

    var buttonS = UIButton().then {
        $0.frame = CGRectMake(0, 0, 90, 60)
        $0.backgroundColor = UIColor.orangeColor()
        $0.tintColor = UIColor.lightGrayColor()
        $0.titleLabel!.font = UIFont(name:"HelveticaNeue-Bold",size:17)
        $0.layer.borderColor = UIColor.lightGrayColor().CGColor
        $0.layer.borderWidth = 1.0
        $0.layer.cornerRadius = 3.0
    }
    
    var buttonM = UIButton().then {
        $0.frame = CGRectMake(0, 0, 210, 60)
        $0.imageEdgeInsets = UIEdgeInsets(top: 0, left: -40, bottom: 0, right: 40)
        $0.titleLabel!.font = UIFont(name:"HelveticaNeue-Bold",size:17)
        $0.backgroundColor = UIColor.greenColor()
        $0.tintColor = UIColor.whiteColor()
        $0.layer.cornerRadius = 3.0
    }
    
    var buttonL = UIButton().then {
        $0.frame = CGRectMake(0, 0, 300, 60)
        $0.imageEdgeInsets = UIEdgeInsets(top: 0, left: -40, bottom: 0, right: 40)
        $0.titleLabel!.font = UIFont(name:"HelveticaNeue-Bold",size:17)
        $0.backgroundColor = UIColor.blueColor()
        $0.tintColor = UIColor.whiteColor()
        $0.layer.cornerRadius = 3.0
    }
}
```

Viewでは、ボタンのタイトルやイメージを設定するくらいで使いまわしてます。

```HogeView.swift
import UIKit

class HogeView: UIView {

    var editButton = ButtonComponent().buttonL.then {
        $0.setTitle("編集する", forState: .Normal)
    }
    
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    init() {
        super.init(frame: CGRectMake(0, 0,
            UIScreen.mainScreen().bounds.width,
            UIScreen.mainScreen().bounds.height))
        backgroundColor = UIColor.whiteColor()
        addSubview(editButton)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        let maxX = self.frame.width
        let maxY = self.frame.height

        editButton.center = CGPoint(maxX/2, maxY/2)
    }
}
```

たぶん本来は、CustomButtonとかクラス作るのが正しいのかな？
ファイル数が増えるのは避けたいですが
もっとより良い汎用的なComponentの管理方法があったら、ご教授お願い致します。m(_ _)m

[1]:http://qiita.com/Hakota/items/6bccfe304203a3bf2320
[2]:https://github.com/devxoul/Then
PHP ファオルダとその中身を全部削除する

メモしとこう。

```php

function deleteDir($dirPath) {

	if (!is_dir($dirPath)) {
		//error
	}
	if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
		$dirPath .= '/';
	}
	$files = glob($dirPath . '*', GLOB_MARK);
	foreach ($files as $file) {
		if (is_dir($file)) {
			self::deleteDir($file);
		} else {
			unlink($file);
		}
	}
	rmdir($dirPath);
}
```
.Netのソースコードを読む

#.Netのソースコードを読む
僕達が、いつもありがたく使わせていただいている。
とても書きやすく機能が豊富でそして後方互換性に力を入れすぎているMicrosoft様主導のC#という素晴らしい言語があることは皆様ご存知だと思います。

そんな素晴らしいC#の標準ライブラリ.Net Frameworkですが、ソースコードが公開されていることはご存知でしょうか。（ご存知でしたか…）
さすが天下のMicrosoft様です。

というわけで、今回は.Net Frameworkのソースコードをちらっと見てみようというお話です。
以下C#という言葉を.Netに置き換えても大丈夫だと思います。

# ソースコードの場所
こちらです。
http://referencesource.microsoft.com/

# stringクラスを読んでみる
試しに今回はStringクラスを読んでみたいと思います。
http://referencesource.microsoft.com/#mscorlib/system/string.cs

今回は詳細を読むわけではなくとりあえず試しに読んでみようぜという話なので、詳細は省いていきます。
とりあえずStringのEqualsはどうやっているのかを読んでいきます。

## メンバフィールド
メンバフィールドは以下の2つが定義されています。
[NonSerialized]private int  m_stringLength; 
[NonSerialized]private char m_firstChar;

内部の命名規則まだハンガリアンなん…？という話はおいておいて、Stringが何文字で構成されているかを表すものと1文字目の文字ですね。
はて？これでどうやって文字列を表しているのでしょう？

その疑問はCopyToなんかを読むとわかります。

##CopyTo
CopyToの以下の部分を見てみましょう。
実際にコピーしている部分です。内部で使っているwstrcpyも引用してきます。
http://referencesource.microsoft.com/#mscorlib/system/string.cs,701

```csharp

        internal static unsafe void wstrcpy(char *dmem, char *smem, int charCount)
        {
            Buffer.Memcpy((byte*)dmem, (byte*)smem, charCount * 2); // 2 used everywhere instead of sizeof(char)
        }
//中略
            //copyToのコピー実態
            if (count > 0)
            {
                fixed (char* src = &this.m_firstChar)
                    fixed (char* dest = destination)
                        wstrcpy(dest + destinationIndex, src + sourceIndex, count);
            }

```

ポインタはC#ではあまりみないですが要するにm_firstCharは先頭アドレスになっていて、そこからm_stringLength*2バイトの範囲が文字列の実態ということになります。(C#のcharは2バイト)
Cのタイプの文字列ではなくPascal系の文字列の持ち方のようですね。

というわけでC#のStringは先頭アドレスと文字列長で表現されているということがわかりました。(実態もちゃんとあるのよ)

##Equals
さてEqualsメソッドはEqualsとEqualsHelperという2つのメソッドからなることがわかります。
Equals
http://referencesource.microsoft.com/#mscorlib/system/string.cs,506
EqualsHelper
http://referencesource.microsoft.com/#mscorlib/system/string.cs,364

中を見てみると
Equalsでは簡単なチェックをしています。
相手がnullならfalse
自分と相手の先頭アドレスが一致しているならtrue
自分と相手の文字列長が一致しなければfalse
と言った感じです。その後EqualsHelperに入ります。

EqualsHelperでは1文字づつ比較していくのですが、高速化のためにただのforループではなくて10文字づつの比較してはループと言う形になっています。
(AMD64では12文字づつ)さらにcharでの比較ではなくintでの比較で2文字づつのチェックになっていますね。残りの文字数が10文字以下になったらループを抜けて残りは2文字づつという形になっています。

#結論
こんな感じで.Netのコードが読めるよというお話でした。
あとContractめっちゃ使ってますね。
これは僕らも使ったほうがいいのかな？（特に基底部分）