OmniAICreator/Qiita-1.07M huggingface dataset:
Graphviz 関連記事まとめ

更新日: 2016/01/27 23:04:44

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Gvizでユースケース図を書く](http://qiita.com/tbpgr/items/1ac8a8c00f5b0ff594ed)|2016/01/27 23:04:04|0|
|2|[Ruby  Gviz gem で GitHub Flow の図を書いてみる](http://qiita.com/tbpgr/items/2d61b1d3b874789e52b4)|2014/08/20 23:22:07|8|
|3|[Ruby  Gviz gem で graphviz を Ruby の DSL で操作し、グラフを描画する](http://qiita.com/tbpgr/items/b5586ba71a5550b673a5)|2014/08/16 02:19:29|5|
|4|[Ruby  Gviz gem で、 テキスト内容・形状・色をランダムに選択してグラフを生成する](http://qiita.com/tbpgr/items/3e33788f7c508651ba34)|2014/08/20 23:14:37|3|
|5|[Ruby  Gviz gem で様々な attrs を試す](http://qiita.com/tbpgr/items/bd3881355f5ff9e86aa7)|2014/08/19 21:56:19|2|
|6|[Ruby  Gviz gem の Draw Module を活用する](http://qiita.com/tbpgr/items/889e0e4c5ff480db3c6e)|2014/08/19 21:51:36|2|
|7|[Ruby  Gviz gem の内部 DSL の基本](http://qiita.com/tbpgr/items/9037fb05745dfac930ed)|2014/08/18 21:46:16|8|
|8|[Ruby  Gviz さんが用意してくれている Graphviz に関する定数をありがたく使う](http://qiita.com/tbpgr/items/626ab14325d229c8bab5)|2014/08/21 22:42:57|2|
|9|[Ruby  Gviz で GitLab / GitLab CI / Kandan / Hubot の構成図を作成する](http://qiita.com/tbpgr/items/65104a129e5abef13148)|2014/08/25 21:36:30|7|
|10|[Ruby  Gviz で Google画像検索で取得した地獄のミサワ画像をランダムに表示](http://qiita.com/tbpgr/items/1a7cf62169ae02b7309d)|2014/08/24 02:42:24|10|
|11|[Ruby  Gviz で Reveal.js を利用したスライドサーバーの開発・運用構成図を作成する](http://qiita.com/tbpgr/items/4fff34ac86935e90372d)|2014/09/10 21:45:40|10|
|12|[Ruby  Gviz で エラトステネスの篩 風味の有向グラフを作ってみる](http://qiita.com/tbpgr/items/b8e52180a49cedbd1c96)|2014/08/21 22:47:11|4|
|13|[Ruby  Gviz で我が家の恋愛相関図を書いた](http://qiita.com/tbpgr/items/5fe2405b12f9e7cd963d)|2014/09/22 13:54:38|11|
|14|[Ruby  Gviz で様々な layout を試してみる](http://qiita.com/tbpgr/items/89953979fbf12b8aac0c)|2014/08/21 22:37:35|5|
|15|[Ruby  Gviz の力をかり、 CodeIQ で私が出題した問題を出題順に並べ、挑戦者の多い問題を強調表示してみる](http://qiita.com/tbpgr/items/0d0fc87424e0c071de87)|2014/08/23 00:32:31|5|
|16|[Ruby  Gvizでインデント構造のテキストをグラフに変換する](http://qiita.com/tbpgr/items/770d56834103efe2b723)|2014/09/12 22:16:47|5|
|17|[Ruby  Gvizでインデント構造のテキストをマインドマップに変換する](http://qiita.com/tbpgr/items/7ba662f77b110e9ad0be)|2014/09/12 22:19:05|8|
|18|[RubyのDSLの表現力と生産性で有向グラフの作図効率を上げつつ, Graphvizをインストールせずにgravizo経由で利用する](http://qiita.com/tbpgr/items/d60737e708a7c7e97481)|2015/12/02 00:00:52|12|
Ruby | Gviz で エラトステネスの篩 風味の有向グラフを作ってみる

# Ruby | Gviz で エラトステネスの篩 風味の有向グラフを作ってみる

## 概要
Gviz で エラトステネスの篩 風味の有向グラフを作ってみます。

ロジック自体は、エラトステネスの篩になっていませんが
出力される画像から エラトステネスの篩 を連想します。

http://ja.wikipedia.org/wiki/エラトステネスの篩

## 仕様
* 素数を N 個取得し、 [初項 N1 ・ 交差 N1 の数列, 初項 N2 ・ 交差 N2 の数列 .., 初項 N-last ・ 交差 N-last の数列] という Enumerator 配列を作成する
* グラフ化の範囲は max 変数に設定。
* グラフには 1 から max までの数字を全て表示する
* 等差数列に含まれる数値は、数列の順に edge を設定し有向グラフとして表される
* 1 は赤で表示する
* 素数は黄で表示する
* 合成数は青で表示する
* 最後の数だけ緑で表示する

## プログラム

~~~ruby
require "gviz"
require "prime"

def arithmetic_progression_enum(base)
  Enumerator.new do |y|
    i = 0
    loop do
      y << i + base
      i += base
    end
  end
end

bases = *Prime.each(5)
arithmetic_progressions = Prime.each(5).with_object([]) do |prime, memo|
  memo << arithmetic_progression_enum(prime)
end

max = 30
Graph do
  global layout:'neato', label:'Arithmetic progression', fontsize:54, size:15
  nodes shape:'circle', style:'filled', fillcolor: :yellow

  (1..max).each { |i| node :"#{i}" }
  
  arithmetic_progressions.each_with_index do |e, i|
    e.take(max/bases[i]).each_cons(2).with_index do |e, j|
      route Hash[*e]
      node :"#{e.last}", { style: :filled, fillcolor: :skyblue }
    end
  end

  save :arithmetic_progression, :png
end
~~~

## 出力例1
* max = 20
* Primes => 2, 3, 5

![arithmetic_progression1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/7b30bad4-f81f-10b5-2f04-786d9b43588f.png)

## 出力例2
* max = 100
* Primes => 2, 3, 5, 7, 11, 13, 17, 19

![arithmetic_progression2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/f771c508-bff5-7fbb-c067-3518f5b8ca7c.png)
Ruby | Gviz さんが用意してくれている Graphviz に関する定数をありがたく使う

# Ruby | Gviz さんが用意してくれている Graphviz に関する定数をありがたく使う

## 概要
Gviz さんが用意してくれている Graphviz に関する定数をありがたく使います。

Graphviz には非常に多くの設定値が用意されています。
Gviz さんは、その設定値を定数として保持しているため、 Ruby のコード内で
定数を取得してループして使用・・・・など、便利に利用できます。

Gviz さんが定数を隠し持っている場所。
https://github.com/melborne/Gviz/blob/master/lib/gviz/graphviz_attrs.rb
たぶん、定数クラスなので割り切ってインデントをなしにしているところが興味深いコード。

## 定数出力祭

### ソースコード
~~~ruby
require "gviz"
require "pp"

Gviz.constants.each do |const|
  print const, ":"
  pp Gviz.const_get(const)
end
~~~

### 出力
~~~
COLOR_NAME_BASE:{"aliceblue"=>["aliceblue"], # 略 ...
# :
# : 略
# :
Node:Gviz::Node
Edge:Gviz::Edge
VERSION:0.3.4
Command:Gviz::Command
~~~

## 定数を利用したプログラムを作成
### 前提
下記の記事作成時点で、定数の存在を知らなかったので
下記で作成したソースをリファクタリングしてみます

[Gviz で様々な layout を試してみる](http://qiita.com/tbpgr/items/89953979fbf12b8aac0c)

### コード（修正前）

・定数を知らずに自前で定義してました

~~~
# :
# : 略
# :
layouts = %i(circo dot fdp neato osage patchwork sfdp twopi)
# :
# : 略
# :
~~~

### コード（修正前）

・定数に置き換えました

~~~
# :
# : 略
# :
layouts = Gviz::LAYOUTS.delete_if { |e|e =~ /nop/ }
# :
# : 略
# :
~~~

### 出力結果
リファクタリングしただけなので出力は下記記事のままです。

[Gviz で様々な layout を試してみる](http://qiita.com/tbpgr/items/89953979fbf12b8aac0c)
S3でHTTPSを使いたかったらバケット名にピリオド入れちゃダメ

AWS S3のバケット名をドメイン名にしたりするじゃないですか。
example.com とかね。

そうするとオブジェクトのURLはHTTPSだとこんな感じになるじゃないですか。
https://example.com.s3.amazonaws.com/abc.def

Chromeとかでアクセスしてみるとめっちゃ警告でてびびるじゃん。
iOSアプリでAFNetworkingとかでアクセスするとめっちゃ弾かれるんです。困るんです。
なんとワイルドカードのSSL証明書はピリオド区切りで１階層分のサブドメインしか対応してくれないんです。
当たり前じゃんって？知りませんでした。ごめんなさい

だからS3でHTTPSを使いたかったら example-com みたいにハイフン区切りとかにしておいた方がいいよって話でした。
Ruby | Gviz で様々な layout を試してみる

# Ruby | Gviz で様々な layout を試してみる

## 概要
Gviz で様々な layout を試してみます。

## Layouts
Graphviz の layout には以下の種類があります。
※リンク先は公式ドキュメント（ PDF ）

* [circo](http://www.graphviz.org/pdf/circo.1.pdf)
* [dot](http://www.graphviz.org/pdf/dot.1.pdf)
* [fdp](http://www.graphviz.org/pdf/fdp.1.pdf)
* [neato](http://www.graphviz.org/pdf/neato.1.pdf)
* [osage](http://www.graphviz.org/pdf/osage.1.pdf)
* [patchwork](http://www.graphviz.org/pdf/patchwork.1.pdf)
* [sfdp](http://www.graphviz.org/pdf/sfdp.1.pdf)
* [twopi](http://www.graphviz.org/pdf/twopi.1.pdf)

## コード

~~~ruby
require "gviz"

sexagenary_cycle = %w(子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥)
layouts = %i(circo dot fdp neato osage patchwork sfdp twopi)

layouts.each do |layout|
  Graph do
    global layout: layout, label:"sexagenary_#{layout}", fontsize:20, size:15, overlap:false
    nodes fontname:'MS GOTHIC', colorscheme: :paired12, style: :filled

    sexagenary_cycle.each_with_index do |e, i|
      edge "eto_#{i}"
      node :"#{i}", { label: e, fillcolor: i%12}
    end
    node :"eto", { label: '干支', fillcolor: :white }
    node :"0", { label: sexagenary_cycle.first, fillcolor: 1 }
    node :"11", { label: sexagenary_cycle.last, fillcolor: 12 }

    save :"sexagenary_#{layout}", :png
  end
end
~~~

## 出力
### circo 出力結果

![sexagenary_circo.png](https://qiita-image-store.s3.amazonaws.com/0/43480/d3d61d5d-4efa-c5db-a8b0-51b34e4eb33b.png)

### dot 出力結果

![sexagenary_dot.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c9c37a39-050d-a4a8-93ec-d6d4a7aa7fe9.png)

### fdp 出力結果

![sexagenary_fdp.png](https://qiita-image-store.s3.amazonaws.com/0/43480/b2efe53d-a558-d972-f223-9b71a427f5af.png)

### neato 出力結果

![sexagenary_neato.png](https://qiita-image-store.s3.amazonaws.com/0/43480/91ade92d-3dbb-4060-3949-f668d235c9ec.png)

### osage 出力結果

![sexagenary_osage.png](https://qiita-image-store.s3.amazonaws.com/0/43480/6d759ad7-9dfd-3e65-6d1d-b31a51dfcd9c.png)

### patchwork 出力結果

![sexagenary_patchwork.png](https://qiita-image-store.s3.amazonaws.com/0/43480/44756023-bad5-c4ef-fa2d-619397c3f6c4.png)

### sfdp 出力結果

![sexagenary_sfdp.png](https://qiita-image-store.s3.amazonaws.com/0/43480/a6e6bc1d-14cd-3747-0af5-1864e53aa6f7.png)

### twopi 出力結果

![sexagenary_twopi.png](https://qiita-image-store.s3.amazonaws.com/0/43480/05ef7a53-bc4b-0b3e-8049-c84fcf2cb3a2.png)
起動時のActivityを変更する


#AndroidManifest.xmlの編集
inter-filterタグが記述されたActivityタグ内のandroid:nameを起動時に表示したいActivity名に変更する。

```xml
<intent-filter>
	<action android:name="android.intent.action.MAIN" />
	<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
```

たとえば、MainActivityからSubActivityへ変更した場合は下記のとおり。

```AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.exapmle.test" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".subActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".MainActivity" >
        </activity>
    </application>
</manifest>
```
[Ubuntu] /etc/shadow 調べてみた

/etc/shadow の読み方初めて知りましたｗ

# `/etc/shadow` って？

各ユーザのパスワードを暗号化したファイル。
一般のユーザからはリードできず、スーパーユーザでないと閲覧ができません。

```bash
# : がデリミタ
user:$6...:16180:0:99999:7:::
```

読み方は以下の通りです。

|フィールド|意味|
|:--|:--|
|１|ユーザ名（ログイン名）|
|２|暗号化されたパスワード|
|３|パスワードの最終変更日|
|４|変更可能最短期間（この期間を越えないと変更不可）|
|５|未変更可能最長期間（この期間を越えたら変更必要）|
|６|警告日（上記期日の何日前に警告するか）|
|７|インアクティブ（ログインしないと無効になる日数）|
|８|失効日（アカウント失効までの日数）|
|９|フラグ（未使用）|

# 2. 暗号化されたパスワード

この文字列の先頭に`！`が付いているか、全体が`!`になっているとパスワードがロックされた状態で、そのユーザでログインができない状態を示しています。

実際にユーザのパスワードをロックするためのコマンドは以下の通りです。

```
# passwd -l user1
```

ロックを解除するためには、オプションを変えてください。

```
# passwd -u user1
```

`/etc/shadow`からも`!`が削除されます。

# 3. パスワードの最終更新日
文字通り、該当ユーザのパスワードの最終更新日を指します。
この数字、1970年からの通しの日付が入るので、そのままだと読み取れません。

西暦に直すためには、以下のようにします。

```
$ echo "16290 * 86400" | bc | xargs -i% date --date=@%
=> Sun Apr 20 09:00:00 JST 2014
```

# 参考

* http://www.wakhok.ac.jp/biblion/1997/sysadmin/node19.html
* http://tksh.s2.xrea.com/index.php?%A5%B7%A5%B9%A5%C6%A5%E0%B4%C9%CD%FD%2F%A5%E6%A1%BC%A5%B6%A1%BC%A4%CE%A5%D1%A5%B9%A5%EF%A1%BC%A5%C9%A4%CB%A4%C4%A4%A4%A4%C6
Formに入力した値を維持したままリロードする方法


フォームに値を入力したがValidatesに引っかかり、もう一度入力し直し。。。その時にページがリロードされ、さっき入力した値がまっさらに消えて、直さなくて良いところも入力し直し。。。それはあまりにも酷だ！！！

ということで、入力失敗した時に値を保持したままリロードする方法について記します。

だいたいformを使用して値を保存するアクションはcreateかupdateだと思うので、create、updateを例に紹介します。
#createアクションの場合
まずnewアクション内で@hoge = hoge.newという空のインスタンス変数を作り、
そして、createアクションで@hoge = hoge.new(params[:hoge])と書く。この際に、フォームで入力した値はparams[:hoge]に値を格納されています。

なので、エラーしrenderで再びnewアクションに戻したいといった際、```rende `new` ```の前にparamsの値を代入してあげれば良いのです。

実際に書いてみるとこんな感じでしょうか。

```ruby:hoges_controller.rb
def new
  	@hoge = Hoge.new
end

def create
  @hoge = Hoge.new(user_params)
  if @hoge.save
    redirect_to 'static_pages/top'
    flash[:success] = "Welcome to the Hoge App!"
  else
    @hoge = Hoge.new(user_params) #newで入力した値を代入
    render 'new'
  end
end
```

#updateアクションの場合
updateする際、```update_attributes(params[:hoge])```というメソッドを使用するかと思います。
この````update_attributes```は

`@hoge.attributes = params[:hoge]`
と
`@hoge.save`
を一気に行ってくれる便利なメソッドです。

今回でいうと、@hoge = hoge.attribute(params[:hoge])の中に入力された値が格納されているので、これをrennderの前に代入しましょう。

```ruby:hoges_controllers.rb
def update
  @hoge = Hoge.find(params[:id])
  @hoge.update_attributes(params[:hoge])
  if @hoget.save
    flash[:notice] = "更新しました！"
    redirect_to 'index'
  else
    @hoge.attributes = params[:hoeg]
    flash[:notice] = "失敗しました！"
    redirect_to edit_hoge_path
  end
end
```
レイアウトの余白を埋める

## 余白を埋める
開発中、ViewとViewの間に余白を設けたい場合があります。
通常は`margin`や`divider`で調整しますが、間に余白のためのViewを置く場合もあると思います。
実はAndroidには、余白調整のための[Space](http://developer.android.com/reference/android/support/v7/widget/Space.html)というViewが存在しているのです。

## Space
`Space`はApi level 14で追加された`GridLayout`で発生する空のカラムを表現するために作られました。
Support Library v7に`GridLayout`が収録された際、`Space`も同時に収録されました。

`Spaceと`他のViewとの大きな違いとして、**描画を行わない**という特徴があります。
以下のコードは`Space#draw`メソッドの実装になります。

```java
    /**
     * Draw nothing.
     *
     * @param canvas an unused parameter.
     */
    @Override
    public void draw(Canvas canvas) {
    }
```

Draw nothingの言葉通り、`Space`では**背景色を含む一切の描画が行われません**。
余白のみ背景色を変えたいという場合には使えませんが、Viewの中で最も描画負荷が少ないというメリットがあります。

## 実装

Gradleの場合、以下のように`gridlayout-v7`ライブラリを取り込みます。

```
compile 'com.android.support:gridlayout-v7:20.0.+'
```

例として、縦に並んだカニ画像の間に50dpの余白を設けてみます。

```xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/darker_gray"
    android:orientation="vertical">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/kani" />

    <android.support.v7.widget.Space
        android:layout_width="match_parent"
        android:layout_height="50dp" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/kani" />

</LinearLayout>
```

![layout-2014-08-21-195827_convert_20140821201849.png](https://qiita-image-store.s3.amazonaws.com/0/48019/134f6942-d80d-d487-6906-06d0d1fb447d.png)


こうなりました。
余白部分は`LinearLayout`の背景が透過されています。

## 注意点
繰り返しになりますが、`Space`に背景色を設定しても無視されます。
以下のような記述はできますが、描画には反映されません。

```xml
    <android.support.v7.widget.Space
        android:layout_width="match_parent"
        android:background="@android:color/white"
        android:layout_height="50dp" />
```

## 使いどころ
正直、`GridLayout`以外で使える場面はあまりないと思います。
大抵は`margin`や`divider`で十分です。
しかし、どうしても余白のためにViewを配置したい場合`Space`の存在を思い出してください。
UITweener.Play() を連続して呼び出したい


Play() の前に必ず tweenFactor を 0f に戻すと連続で呼び出せる。
（PlayReverse() の場合は tweenFactor を 1f に戻す）

```
UITweener tw = gameObject.GetComponent<UITweener>();
tw.tweenFactor = 0f;
tw.Play();
```
resoucesでルーティングを設定する。

参考URL :ルーティングにアクションを追加(http://www.rubylife.jp/rails/routing/index6.html)

railsではおなじみの自動でRESTgulなURLを自動生成をしてくれるresourses。

```ruby:routes.rb
Rails.application.routes.draw do
  resources :users
end
```

たったこれだけで、基本的に、「index」「show」「new」「edit」「create」「update」「destroy」の7つのアクションに対するルーティングを生成してくれます。

```rake routes```で確認。

```
Prefix Verb   URI Pattern               Controller#Action
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy
```

これはこれで非常に楽なのですが、indexアクションはいらないからルーティングを勝手に作らないでほしい！なんて時もあるかと思います。

そんな時は、```resources :users, :except => [:index]```とつければOK。

```
Prefix Verb   URI Pattern               Controller#Action
    users GET    /users(.:format)          users#index {:expect=>[:index]}
          POST   /users(.:format)          users#create {:expect=>[:index]}
 new_user GET    /users/new(.:format)      users#new {:expect=>[:index]}
edit_user GET    /users/:id/edit(.:format) users#edit {:expect=>[:index]}
     user GET    /users/:id(.:format)      users#show {:expect=>[:index]}
          PATCH  /users/:id(.:format)      users#update {:expect=>[:index]}
          PUT    /users/:id(.:format)      users#update {:expect=>[:index]}
          DELETE /users/:id(.:format)      users#destroy {:expect=>[:index]}
```

このようにindexへのルーティングは設定されなくなりました。

resourcesには```:except```以外にも様々なオプションが用意されています。
[こちら](http://railsdoc.com/references/resources)を参考にしてください。

逆に、アクションを追加したい場合は```routes.rb```に以下のように書くと追加することが出来ます。

```ruby:routes.rb
resources :users do
  get 'preview' #追加したいアクション
  post 'reset'　#追加したいアクション
end
```

```
Prefix Verb   URI Pattern                       Controller#Action
        root GET    /                                 static_pages#top
user_preview GET    /users/:user_id/preview(.:format) users#preview #追加されたアクション
  user_reset POST   /users/:user_id/reset(.:format)   users#reset　#追加されたアクション
       users GET    /users(.:format)                  users#index
             POST   /users(.:format)                  users#create
    new_user GET    /users/new(.:format)              users#new
   edit_user GET    /users/:id/edit(.:format)         users#edit
        user GET    /users/:id(.:format)              users#show
             PATCH  /users/:id(.:format)              users#update
             PUT    /users/:id(.:format)              users#update
             DELETE /users/:id(.:format)              users#destroy
```
HTC Evo 3Dのadbドライバインストール

HTC Syncを入れるのを嫌がってHTCDriver 4.1.0.001.exeとかをそのまま入れたり、
Google謹製 AndroidSDKのドライバを VIDとか追記して入れたりしたがadbがそもそも動かなかったので自分用のメモ。
結局はHTC Sync途中止めでいけた。

筆者ROM：LiquidSmooth 3.2

（事前にEvo 3D用に入っているドライバをアンインストールしておく）
1. HTC Syncインストーラを走らせる
2. 事前に各種ドライバのインストーラが走る
3. ドライバインストールする。（ここでHTCDriver 4.1.0.001.exe以外のドライバが入った）
4. HTC Syncインストールに移るのでキャンセルで止める

おわり

あと、ストレージの接続方式がMTPでもPTPでもadbできず、Mass storageにしたらadb devicesで出た。
SwiftのprintlnはNSLogの10倍くらい高速

## 追記

以下、パフォーマンスのみについて言及しています。
本記事を書いた後、それ以外のNSLogとprintlnの違いに気付きつつ放置していましたが、この記事のAnswerがすごくよくまとまっていたので貼っておきます。

[Swift: print() vs println() vs NSLog() - Stack Overflow](http://stackoverflow.com/questions/25951195/swift-print-vs-println-vs-nslog)

## 本文

どうしてSwiftでは既存の`NSLog`に加えて、`println`が増えたのだろう？
基本的に`println`使うべきな雰囲気は感じるけど、実際にメリットは？と思って調べました。

一つはジェネリクス使って定義されているので、文字列以外も気にせずに突っ込めるところだと思います。

```swift
func println<T>(object: T)
```

```objc
FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
```

で、ここからが本題です。
遅いと悪評高い`NSLog`でしたが、もしかしたらそれも解決されている？と思って測ってみました。
※Xcode6 beta6の結果です

```10000回ループ.swift
let now = NSDate().timeIntervalSince1970
for i in 0...10000 {
    println("hoge") // NSLog("hoge")でも試した
}
let elapsed = NSDate().timeIntervalSince1970 - now
println("elapsed: \(elapsed)")
```

シミュレーターで試したところ手元の環境では下記のような結果で、10倍くらい高速でした(実機でもほぼ同じでした)


|  |所要時間      |
|------|--------|
|`println`|0.2秒前後|
|`NSLog`|2.3秒前後|


じゃあObjective-Cでも使えるようにしようと思って何となくそれっぽいのを作成。


```swift
@objc
class Util {
    class func NSLog(message: String) { // ジェネリクス使うとObjective-Cから見えない
        println(message)
    }
}
```

```objc
+(void)loopPrint {
    NSTimeInterval now = [NSDate date].timeIntervalSince1970;
    for (NSUInteger i = 0; i < 10000; i++) {
        [Util NSLog:@"hoge"];
    }
    NSTimeInterval elapsed = [NSDate date].timeIntervalSince1970 - now;
    [Util NSLog:[NSString stringWithFormat:@"elapsed: %f", elapsed]];
}
```

Objective-CでSwiftコードを挟んで実行しても10倍高速の同様の結果になりました。(呼び出しコスト分、少し時間かかるかな？という感じでしたが)


そして、ここまで書いた後に気づきましたが、単に速くしたいなら、以下のようなものを定義でも良いですね。
こちらも`println`と同じか`printf`の方が若干速かったです。

```objc
+(void)NSLog2:(NSString*)message {
    printf("%s\n", [message UTF8String]);
}
// あるいは
#define NSLog2(message) printf("%s\n", [(message) UTF8String])
```


と、Objective-Cへの横展開は`println`使わなくても良いじゃんと自己完結しましたが、とりあえず上で書いた`println`版とほぼ同じ結果だったので、`println`は良く出来てますね。
IE8以下で表示用ライブラリなしでSVGを使うためにやった荒業

自分用のメモ。

# IE8以下ではimg要素のsrcにsvgを指定できない
出来ないんですよね。かと言ってコンパチする方法が結構手間っぽい
参考：http://osumituki.com/web-front/programs/164.html

サーバーサイドでクライアント判定してタグ出し分けするほうが綺麗で確実な感じもするけど、そういうわけにも行かなかったので荒業を使うことにした。

## imgタグに.svgが指定されているとき、object要素にすげ替えてしまおう

という、荒業を試してみることにしました。

```js
if(/* IE8以下なら */) {
$('img[src$=".svg"]').each(function(){
    $(this).after('<object data="'+$(this).attr('src')+'" type="image/svg+xml" width="'+$(this).attr('width')+'" height="'+$(this).attr('height')+'" alt="'+$(this).attr('alt')+'" class="'+$(this).attr('class')+'" style="pointer-events: none;overflow:hidden;height:'+$(this).attr('height')+'px;width:'+$(this).attr('width')+'px"></object>');
    $(this).remove();
});
}
```

なお、createElementでobjectタグを作って挿入してもうまくいかず、
上記の様な書き方をするとうまくいきました・・・原因が何なのかよくわかりません:;(∩´﹏`∩);:

得られた結果は見た目は問題がない状態に保持させられましたが、SVG中のviewBox指定とHTMLで指定しているサイズがあってないとスクロールバーが出てきてしまうので注意。
GCE から GCS へのファイルアクセス


漢なら GCE(Google Compute Engine) から GCS(Cloud Storage) に, 安全かつお手軽にアクセスしたいですよね!


## GCE インスタンス起動

GCE インスタンス起動時に, cloud storage へのアクセスが出来る様ようにしておきます.

https://developers.google.com/compute/docs/authentication

を参考に, scopes の devstorage.full_control あたりです.

## GCE から GCS にアクセスしてみる.

GCE のインスタンスに gcutil ssh INSTANCE-NAME でログインし, 内部から OAuth アクセストークンをメタデータサーバから取得してみます(curl がインストールされていると仮定).

```
$ curl "http://metadata/computeMetadata/v1/instance/service-accounts/default/token" -H "X-Google-Metadata-Request: True"
```

以下のようなレスポンスが得られれば成功です.

```
{"access_token":"XXXXXXXXXX","expires_in":3599,"token_type":"Bearer"}
```


## ファイルをアップロードしてみる.

適当にファイルを作り…

```
$ echo bora > muda.txt
```

curl でアップロードしてみます.

```
$ curl -X PUT --data-binary @muda.txt -H "x-goog-api-version: 2" -H "Authorization: OAuth XXXXXXXXXXX" "http://storage.googleapis.com/MY-BUCKET/muda.txt"
```

MY-BUCKET にはあらかじめ作っておいた bucket の名前を指定します.

Google Developers Console などで muda.txt が生成されているのを確認します.
 
## ファイル(の内容)を取得してみる.

```
$ curl -H "x-goog-api-version: 2" -H "Authorization: OAuth XXXXXXXXXXXXXXXXX" "http://storage.googleapis.com/MY-BUCKET/muda.txt"

bora
```

テキストのデータがそのまま(?)で取得されました. Cool!

これで GCE での計算結果を, 特段ツールをインストールしなくてもGCS に置く, などの活用ができますね.

## TODO

* エラーハンドリング
* 内部間通信でも https のほうが安全?
* REST でアクセスしたときは, エラーなどの response が GCS だと JSON ではなくて XML になるようで謎…
aタグにObjectタグをネストしている時にObject要素をクリックして画面遷移させる方法

# 問題の概要

こちらのブログ(http://subtech.g.hatena.ne.jp/mayuki/20120212/1329046476) に記載されてる内容なのですが、ここに記載されてる解決策がIE8だとどうにも全くうまく行かず、やむなくObjectの上にblockにしたa要素を乗せてもz-indexガン無視されてリンクがクリック出来ないという大変にファッキンな現象に陥りました。

要するに、この問題についてIE8上では

+ aに内包されているobject要素をクリックしてもリンクしない
+ マウスオーバーしても指カーソルにならない
+ objectの上にa要素をblockで乗せてもz-indexが無視されobjectが前面に出てきて
しまう

という状態になったのでした。

##　取り敢えずobjectをクリックしたら画面遷移させる

aタグにonclickイベントを付与して、子要素のobjectがクリックされた時にイベントバブリングで発火させることにして、以下のようにした。
別窓で開かないし指カーソルにならないし、だいぶひどいけど、緊急用の対応としては使えるかも・・・ぐらいです。

```js
$('object').each(function(){
    if($(this).parent().is('a')){
        var _href = $(this).parent().attr('href');
        $(this).parent().on('click',function(){
            window.location.href = _href;
        })
    }
})
```
required属性の付いたselect要素の操作で引っかかったこと

# 前提条件

required属性の付いたselect要素の中に入っているoption要素に対して、別のフォーム要素の選択状況に応じて、JavaScriptからselected属性やdisabled属性の有無を操作していた。


```html
<select required>
  <option class="default-type-1" disabled>hoge</option><!-- ← こいつらの属性をJSで弄る感じ -->
  <option class="default-type-2" selected>hage</option>
  <option class="default-type-3">fuge</option>
</select>
```

# 起こったバグ

* option要素にselectedが付いていて
* disabledも解除されている

にもかかわらず、マウスで再選択するまで
「required属性付きなのに、項目が何も選ばれていない」
という風にブラウザ(Firefox)から怒られてしまった。

# 原因

内部の処理の順番としては以下のようになっていた

1. selectedを付ける
2. (disabledが付いていた場合は) disabledを取る

これを逆の順序

1. (disabledが付いていた場合は) disabledを取る
2. selectedを付ける

に変更すると、正しい動作になった。

# その他

この問題を探っている間に、JSを使ったフォームの操作について、以下のことを追加で学んだ。

## .attr() よりも .prop() で操作

jQueryの .attr('disabled') とか .removeAttr('disabled') のような操作をしていたが、 .prop('disabled', true) とかやった方が良いらしい。

jQueryにおけるattrとpropの違いと使いドコロまとめ
http://qiita.com/kbyay_/items/7a7ce9547f29b34a63b1
Mac(OSX)でGoogle Cloud SDKをインストールしてzshで動かす

とりあえずダウンロード

```zsh
curl https://sdk.cloud.google.com | bash
```
途中でbashrcのpathとかを要求されますが、ここでzshrcのpathを渡してもうまく動きません

```zsh
# The next line updates PATH for the Google Cloud SDK.
source '/<hogehoge>/google-cloud-sdk/path.bash.inc'

# The next line enables bash completion for gcloud.
source '/<hogehoge>/google-cloud-sdk/completion.bash.inc'
```

<del>
こんなのが追記されるのですがzshだとcommand not found: completeが出て動かないです。
上記はpathを設定しているだけなので手動でzshrcにpathを通したら動きます。
</del>
<del>
```
export PATH=/<hogehoge>/google-cloud-sdk/bin:$PATH </del>
```


現在(2015/06/20)は？(ただ当時間違っていただけなのか定かではありません…)
bashをzshに置き換えればzshでも動くようです。
東のエデンのジュイスをHTML5でできる限り再現してみた

#デモページ
実際の出力は[デモページ](http://garoo.jp/demo/eden/)で試すことができます。
http://garoo.jp/demo/eden/

#やりたかったこと
ナビゲーションの音声を作りたくて、CCFFVIIの戦闘のナビゲーションの音声を作ってみた。

・[HTML5の音声合成でコンピューターが話している感じの音声を実現してみる](http://qiita.com/ikko/items/10d76d67b4e60e00f02c)

どうせなら日本語で実現したいので、東のエデンのジュイスにもチャレンジしてみた。
[![](http://img.youtube.com/vi/70kFAYksBmE/0.jpg)](https://www.youtube.com/watch?v=70kFAYksBmE&t=572)

#やったこと
##HOYAのVoiceText Web API (β版)で音声データを作成
```
curl "https://api.voicetext.jp/v1/tts" \
     -o "sound2.wav" \
     -u "YOUR_API_KEY:" \
     -d "text=受理されました ノブレスオブリージュ 今後とも救世主たらんことを" \
     -d "pitch=80" \
     -d "speed=125" \
     -d "volume=200" \
     -d "speaker=hikari"
```
waveファイルで出力されるので、iTunesでmp3に変換
参考サイト：[VoiceText Web API (β版)](https://cloud.voicetext.jp/webapi)

##html5で実装
* 音声ファイルとインパルス応答用のファイルを読み込む。
* 音声ファイルにインパルス応答用のファイルを合成する。
* 出力する。

```javascript:sound.js
var files = [
  "sounds/spreader50-65ms.wav",
  "sounds/filter-telephone.wav",
  "sounds/sound0.mp3",
  "sounds/sound1.mp3",
  "sounds/sound2.mp3",
];
 
if(typeof(webkitAudioContext)!=="undefined")
    var audioctx = new webkitAudioContext();
else if(typeof(AudioContext)!=="undefined")
    var audioctx = new AudioContext();
 
var source = null;

var buffers = [];
var loadidx = 0;
var req = new XMLHttpRequest();
 
function LoadBuffers() {
    req.open("GET", files[loadidx], true);
    req.responseType = "arraybuffer";
    req.onload = function() {
        if(req.response) {
            audioctx.decodeAudioData(req.response,function(b){
                buffers[loadidx]=b;
                if(++loadidx < files.length)
                    LoadBuffers();
            },function(){});
        }
        else
            buffers[loadidx] = audioctx.createBuffer(VBArray(req.responseBody).toArray(), false);
    };
    req.send();
}
function Play(number) {
    source = audioctx.createBufferSource();

    var convolver = audioctx.createConvolver();
    var revlevel = audioctx.createGain();
    revlevel.gain.value = 3;
    convolver.connect(revlevel);
    revlevel.connect(audioctx.destination);

    var convolver2 = audioctx.createConvolver();
    var revlevel2 = audioctx.createGain();
    revlevel2.gain.value = 10;
    convolver2.connect(revlevel2);
    revlevel2.connect(audioctx.destination);

    source.buffer = buffers[number];
    convolver.buffer = buffers[0];
    convolver2.buffer = buffers[1];

    var compressor = audioctx.createDynamicsCompressor();
    var volume = audioctx.createGain();

    source.connect(volume);
    volume.gain.value = 0.2;
    volume.connect(compressor);

    compressor.connect(convolver);
    compressor.connect(convolver2);
    compressor.connect(audioctx.destination);

    source.start(0);
}
```
参考サイト：[Web Audio API を使用したゲーム用音声の開発](http://www.html5rocks.com/ja/tutorials/webaudio/games/)

#やれなかったこと
完成した音声ファイルの出力
Wordpress → Ghost のデータ移行


WordpressからGhostの移行の方法を書いてみる。

* [Ghost](https://ghost.org)

Ghostの立て方は割愛ということで、ここではデータ移行の話を軸に進める。

データ移行はWordpressのプラグインを使う。

* [Ghost plugin](https://wordpress.org/plugins/ghost/)

このプラグインを使うとjsonファイルができる。これをGhostのデバッグ画面からデータ挿入してあげる。

デバッグ画面：
http://yourghosturl/ghost/debug/

(もしかすると日本語環境だけかもしれないけど）、`error: Value in [posts.slug] exceeds maximum length of 150 characters`と怒られることがある。

そのときは、下のScriptを使って解決する。

<script src="https://gist.github.com/yossale/4c9b380ddd37dd976e65.js"></script>

使い方はこんな感じ。

```shell
node slugline_shortner.js <your wordpress data json>
```

nodeはbrewなりでインストールしましょう。

```shell
File was saved to <output file>
```

と言われるので、この末尾にあるファイルをデバッグ画面から読み込んであげれば終了。

おつかれさまでした。
Activerecourdでセレクトしたレコードを一括更新


# update_all

```activerecord
	Book.where('member_id = ?', 333).update_all(:sync_flag => true)
````

Bookテーブルのmember_idが333のsync_flagをtrueに変更する。


ただし、update_allはActiveRecordオブジェクトを介さないため、validationや、コールバックを通らない。

**SQLのupdate文に近い**

transactionが必要な処理で使うケースはすくない。

しかし、速度が遅くなることや、更新が失敗することを心配するひつようなない。

適宜使い分けが必要となる
post_status について


# post_status について
ちょっと気になったので調べてみた。

## post_status の種類

リファレンスによると post_status は以下のとおり。
<dl>
<dt>publish</dl><dd>A published post or page</dd>
<dt>pending</dl><dd>post is pending review</dd>
<dt>draft</dl><dd>a post in draft status</dd>
<dt>auto-draft</dl><dd>a newly created post, with no content</dd>
<dt>future</dl><dd>a post to publish in the future</dd>
<dt>private</dl><dd>not visible to users who are not logged in</dd>
<dt>inherit</dl><dd>a revision. see get_children.</dd>
<dt>trash</dl><dd>post is in trashbin. added with Version 2.9.</dd>
</dl>

## 何が気になった？

_「重複したらどうなるの？」_
っていうところです。
パターンとしては、trash とか、future は他の post_status と重複すると思うんですよね。

例えば、「未来の記事」で探したら、ゴミ箱に入ってる記事は拾われるのかとかですかね。

では、調べていきます。

## 実験

### 準備
意図的に作り出せる状態の記事を準備します。（リビジョンとかを省きます。）

![投稿_‹_MyWordPress_—_WordPress.png](https://qiita-image-store.s3.amazonaws.com/0/41589/83f1e9e2-adb7-21de-d0e1-4a19c1776dae.png "投稿_‹_MyWordPress_—_WordPress.png")

こんな感じです。

まずは、trash 以外で、publish, pending, draft, private, future の状態の記事を作ります。
pending, draft, private については、公開日時を未来にしたものも準備します。

### 記事の状態は？
それぞれの記事に対して、get_post_status( $ID ) を実行して調べてみたいと思います。

---

#### 予想！

> private のステータス（未来） - 非公開

_private_

> draft のステータス（未来） - 下書き

_draft_

> pending のステータス（未来） - レビュー待ち

_pending_

> future のステータス

_future_

> private のステータス（過去） - 非公開

_private_

> draft のステータス（過去） - 下書き

_draft_

> pending のステータス（過去） - レビュー待ち

_pending_

> publish のステータス

_publish_


驚くほどそのままですね…。

---

#### 結果！
> private のステータス（未来） - 非公開

_private_

> draft のステータス（未来） - 下書き

_draft_

> pending のステータス（未来） - レビュー待ち

_pending_

> future のステータス

_future_

> private のステータス（過去） - 非公開

_private_

> draft のステータス（過去） - 下書き

_draft_

> pending のステータス（過去） - レビュー待ち

_pending_

> publish のステータス

_publish_

__完全に一致。__

スッキリしましたね。

では、ゴミ箱に入った場合はどうなるでしょうか？

実験データを全てゴミ箱に入れた後に、もう一度 get_post_status( $ID ) を実行してみます。

**全て、trash になりました。**

---

### 結果

__trash 最強__

とりあえずゴミ箱に入ってデータについては、post_status を trash で参照しない限り探せないってことがわかりました。

もう一つ気になっていた future については、公開予約状態になったものだけですね。公開日時が例え未来でも、公開予約状態になっていなければ関係無い訳ですね。

## まとめ

概念としては重複する状況も、WordPress がどのように振る舞うか、今回の実験でしっかり理解することができました。
GitHub のコミットメッセージの Tips

## イシューを参照する

コミットメッセージの `#1` など `#` で始まる数字は自動で Issue にリンクされます。
Issue のページを見ると、リンク元のコミットも確認することができます。

## イシューを閉じる

`Fix #1` とコメントに含めると、自動でリンクを貼ると共に Issue を Close してくれます。
`Fix #1 and Fix #2` とすると、複数同時に Close することもできます。
Middleman 製の GitHub Pages サイトを Wercker で自動デプロイ

Middleman は便利ですが、Jekyll のようにコミットするだけで GitHub Pages にデプロイできないのが玉に瑕。そこで、Wercker を使って GitHub に push されたら、自動でビルドしてデプロイするようにします。

## Wercker への登録とアプリの作成

まず [Wercker](http://wercker.com/) にユーザ登録。GitHub アカウントで登録できます。

Apps > Add an application でアプリを追加。かなり簡単に追加できます。オープンソースプロジェクトなら、3. Add werckerbot はスキップして大丈夫です。

## Deploy Target の作成

できた app の Settings > Deploy targets > Add deploy target でデプロイ対象を追加。Auto deploy はチェックして、ソースの方のブランチ名を指定します。

で、Deploy pipleline > Add new variable に GITHUB_TOKEN などの名前で GitHub Token を追加します。これは、GitHub の Settings > Applications > Personal Access Tokens で生成できます。権限はデフォルトで OK。

## wercker.yml の追加

ソースのブランチのルートに wercker.yml というファイルを作りましょう。ここでは仮に foo/foo.github.io というレポジトリだとします。

```wercker.yml
box: wercker/rvm

build:
    steps:
        - rvm-use:
            version: 2.1.2

        - bundle-install

        - script:
            name: build with middleman
            code: bundle exec middleman build --verbose

deploy:
    steps:
        - lukevivier/gh-pages:
            token: $GITHUB_TOKEN
            basedir: ./build
            repo: foo/foo.github.com
```

[lukevivier/gh-pages](https://github.com/lvivier/step-gh-pages) という wercker のプラグインのようなものを使っているので、とても簡単です。だた、これだとデプロイ先のブランチの履歴を毎回消してしまうので、それが嫌な人には別の方法をおすすめします。

yml のインデントがスペース 4 個じゃないとエラーになるようなので、注意しましょう。

で、これをコミットすれば準備完了。GitHub に push すれば、自動でデプロイされるはず・・・。
Swiftでの再帰処理


Swiftでは関数型でほとんど行けるようなので，ループ構文を無視してなんでも再帰で書きたくなる衝動にかられたりします．そこで，どの程度再帰が使いやすいか調べてみました．

### 普通の再帰関数

```swift
func fibonacci(n: Int) -> Int {
 return n < 2 ? n : fibonacci(n - 2) + fibonacci(n - 1)
}
```
普通に動きます．まあ，今時当たり前ですね．

### 末尾再帰

```swift
func fib_iter(n: Int, p: Int, pp: Int) -> Int {
	if n == 0 { return 0 }
    return (n == 1) ? p : fib_iter(n - 1, p + pp, p)
}
```
これも普通に動きます．コンパイラの最適化でループに変換されていました．よしよし．

### 内部関数で再帰
上の末尾再帰は内側に隠したくなりますよね．

```swift
func fibonacci(n: Int) -> Int {
    func fib_iter(n: Int, p: Int, pp: Int) -> Int {
        return (n == 1) ? p : fib_iter(n - 1, p + pp, p)
    }
    return n < 2 ? n : fib_iter(n, 1, 0)
}
```
```
error: cannot reference a local function from another local function
        return (n == 1) ? p : fib_iter(n - 1, p + pp, p)
                              ^
```
これはダメでした．むむむ．ありがちなパターンだと思うのですが．

### クロージャで再帰
**<追記> コメントで情報をもらってクロージャの再帰の記述方法がわかりました．** 別ポストにてメモしました → [Swiftのクロージャで再帰](http://qiita.com/satoshia/items/d39860e54daada5c0693)
  
```swift
let fib = {(n: Int) -> Int in
    return n < 2 ? n : fib(n - 1) + fib(n - 2)
}
```
```
error: variable used within its own initial value
```
~~これもダメでした．こういうのは`letrec`がないと無理ですね．~~

### サブスクリプトで再帰！？
試しにやってみたところ，

```swift
struct Fib {
    subscript(n: Int) -> Int {
        return n < 2 ? n : self[n - 1] + self[n - 2]
    }
}
```
なんと大丈夫でした．面白いですね．こういう風にかけると構造体Fibがあたかもレイジーな配列のように見えてきます．
じゃあ，末尾再帰サブスクリプトとの組み合わせは，

```swift
struct Fib {
    subscript(n: Int) -> Int {
        return n < 2 ? n : self[n, 1, 0]
    }
    subscript(n: Int, p:Int, pp: Int) ->Int {
        return (n == 1) ? p : self[n - 1, p + pp, p]
    }
}
```
ばっちりいけます．サブスクリプトでは内部では本当にただの関数なんですね．

### サブスクリプトでメモ化はできるか？
悪乗りついでに，

```swift
struct FibMemo {
    var memo = [Int]()
    subscript(n: Int) -> Int {  // 0,1は省略
            if n < memo.count {
                return memo[n]
            } else {
                let m = self[n - 1] + self[n - 2]
                memo.append(m)
                return m
            }
        }
    }
}
```
```
error: immutable value of type '[(Int)]' only has mutating members named 'append'
```
これは`append`で怒られました．サブスクリプト（コンピューテッドプロパティ）の`get`はリードオンリーなので`var`な変数も変更不能な定数扱いなんですね．メモ化ができれば面白かったんですが．

### まとめ
- 普通の再帰関数は書けますが，内部関数~~やクロージャで~~は再帰はダメなのであまり使い勝手はよくないですね．素直にループ構文を使いましょう．
- サブスクリプトでも再帰できるのは意外でした．面白いですが，使い道がピンときません．

以上です．
ActiveRecordのプロパティにblank? や present? をする必要はなかった！

**`blank?`** や **`present?`** って便利ですよねー。
タイトルの通りなんですが、ActiveRecordでの使い方を発見でしたので書いておきます。

blank? や present? について
===========================

#### ActiveSupportのメソッドとして定義されている  
- [Rails 4-0-stable/activesupport/lib/active_support/core_ext/object/blank.rb](https://github.com/rails/rails/blob/4-0-stable/activesupport/lib/active_support/core_ext/object/blank.rb)  
- これらのメソッドの使い道としては ***nil*** または ***空*** を判定するときに使います。


#### blank? とは 
  - `nil?` または `empty?` の時に **true** となるメソッド

```rb:実装は少し違うけど、イメージはこんな感じのメソッド
address.nil? || address.empty?
```

実装とか細かい blank? に関する解説は以下の記事が参考になります。
[Rails - blank?の振る舞いを詳しく調べてみた - Qiita](http://qiita.com/shinya_131/items/d318207accc1c3b894c5)

#### present? とは
  - `blank?` の逆

```rb:実装はこんな感じ
def present?
  !blank?
end
```

ActiveRecordのプロパティで使う場合は blank? や present? は不要！
================================================

**ここから本題です。。** 以下のように使えます！！！

***[=> ※数値のプロパティに対する注意についてコメントを頂きました](http://qiita.com/yusabana/items/67ae553824166a39b61e#comments)***

```rb:サンプル1
@user = User.first
@user.name?    # = @user.name.present?
```

以下のとおり、Before と After を見比べると Afterは 少しスッキリします！

```rb:Beforeコード
@user = User.first

if @user.name.present?
# nameに何か値があるときの処理
end

if @user.name.blank?
# nameが 空 の時の処理
end
```

```rb:Afterコード
@user = User.first

if @user.name?
# nameに何か値があるときの処理
end

unless @user.name?
# nameが 空 の時の処理
end
```

すべては [Rails Best Practice](http://rails-bestpractices.com/) に書いてありました！
参考：[Rails Best Practices | Use query attribute](http://rails-bestpractices.com/posts/56-use-query-attribute)
射影テクスチャマッピング


射影テクスチャリングはテクスチャを、プロジェクタで写し出したように投影して表示するものです。
詳細については[こちらを参考（射影テクスチャリング）](http://asura.iaigiri.com/OpenGL/gl45.html)に。

この手法は様々なものに応用されており、例えばシャドウマッピングなどにも利用されています。
ということで、覚えておかなければならないスキルだと思うので色々とメモしておこうと思います。

ちなみにWebGLで使うには[こちらの記事（射影テクスチャマッピング | wgld）](http://wgld.org/d/webgl/w049.html)がとても参考になります。

## 注意点

射影テクスチャマッピングを行うにあたり、テクスチャ周りについて詳しく知っておかなければなりません。
その中の注意点として、OpenGLでは通常テクスチャ座標系は **左下** が原点です。

![テクスチャ空間.png](https://qiita-image-store.s3.amazonaws.com/0/5616/3c80b72a-c151-7434-b9b0-8c906faa4ccd.png "テクスチャ空間.png")


一方、通常の画像は **左上** が原点ですね。

![画像空間.png](https://qiita-image-store.s3.amazonaws.com/0/5616/23e0e68c-6d6d-f1e4-a6bb-c337fae52d58.png "画像空間.png")


このことからも考慮しなければならないことがあるのが分かるかと思います。

### 座標系を把握する

さて、上記以外にも座標系として注意する点があります。
それは主題である「**射影**」についてです。
これは通常のビュー変換と同じように、ライトから見た「**透視変換行列**」を作る必要があります。

![視錐台.png](https://qiita-image-store.s3.amazonaws.com/0/5616/52886053-af39-a841-6906-cac652373c7f.png "視錐台.png")

さて透視変換行列ですが、これの座標系の中心（要は「0, 0」）は「**中央**」です。
座標系が異なるのがまた出てきました。

まとめると、

* 画像座標空間
* テクスチャ座標空間
* 射影座標空間

の3つ、それぞれが異なることになります。
これを適切に扱えるように変換する必要があります。

射影空間からテクスチャ座標空間に変換する式は、

```math
S = 0.5X + 0.5 \\
T = 0.5Y + 0.5
```

となります。（射影空間の(0, 0)がテクスチャ座標空間の(0.5, 0.5)になるように変換する）

ただこのままだと上下の反転がそのままです。
判定するには、単にY座標をマイナスしてやればいいですね。

つまり、

```math
S = +0.5X + 0.5 \\
T = -0.5Y + 0.5
```

となります。
ただ、これだと射影空間上のZ値が反映されていません。
（Wで除算されていない。つまり `w=1` のときの状態）
そのため、正確な情報は以下のようになります。

```math
S = +0.5\frac{x}{w} + 0.5 \\
T = -0.5\frac{y}{w} + 0.5
```

さらに$0.5$でまとめて

```math
S = 0.5\frac{w + x}{w} \\
T = 0.5\frac{y - w}{w}
```

となります。

計算しやすいように行列の形にしておきましょう。
行列の形にすると以下のようになります。

```math
\begin{equation}
\begin{vmatrix}
s \\
t \\
? \\
w
\end{vmatrix}
=
\begin{vmatrix}
0.5    &0 &0 &0.5 \\
  0 &-0.5 &0 &0.5 \\
  0    &0 &1   &0 \\
  0    &0 &0   &1
\end{vmatrix}
\begin{vmatrix}
x \\
y \\
z \\
w
\end{vmatrix}
\end{equation}
```

最後に、この射影テクスチャを利用するための最終結果を求める行列計算は以下のようになります。

![射影テクスチャ行列掛け算.png](https://qiita-image-store.s3.amazonaws.com/0/5616/d8e81d51-a820-0b9c-b083-8ed702a70553.png "射影テクスチャ行列掛け算.png")


## 行列をどう使うか

さて、上記までで必要な座標変換の行列は求まりました。
が、実際にこれをどう使ったらいいでしょうか。

求めた行列の意味は「ライトから見た透視投影変換」に、テクスチャ座標変換行列を掛けたものでした。
これはどういう意味なのか。

**GLSL** には`texture2D`という、テクスチャのピクセル（テクセル）から色をフェッチするビルトイン関数があります。
この関数は2次元のテクスチャからUV座標を元にテクセルを取得するものです。

これと似たような関数に`texture2DProj`という関数があります。
この関数はふたつの引数を取り、それぞれテクスチャと3次元座標を取ります。

```glsl
// x, y, z, wはフェッチしたい座標
vec4 sampleColor = texture2DProj(texture, vec4(x, y, z, w));
```

こちらは`Proj`という名前から推測できるように、上記で求めた透視投影変換した座標からテクスチャのテクセルをフェッチする関数です。

自分のイメージでは金太郎飴ですｗ
↓こんな感じ。

![射影テクスチャリングイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/5616/96386d53-db5a-e821-659a-e52b19649abb.png "射影テクスチャリングイメージ.png")


こうして、第二引数で渡された座標位置にあるテクセルを取得し、それをレンダリングに使う、というわけです。

仕組みを理解してしまえばそれほどむずかしいものではありません。
また、この仕組みを応用して、冒頭でも書いたように「シャドウマップ」という方法で影をレンダリングする方法もあります。
なぜ「シャドウマップ」というのかはイメージできるのではないかと思います。

シャドウマップもやってみようと思うので、やったら記事を書きたいと思います。
ActiveModelを活用するための属性定義拡張系gemについて

ActiveModelをベースにしたモデルクラスやFormオブジェクトを作ってると、attribute定義を沢山書くことになります。
その際に、セットで考えなきゃいけないのは、タイプキャスト、デフォルト値、初期化方法です。

で、この辺りを楽にしたいと考える人は大勢居るもので、これらの定義を楽にしてくれるgemがいくつかあります。

今日、いくつかチェックしたので軽くまとめておきます。

- [cgriego/active_attr](https://github.com/cgriego/active_attr "cgriego/active_attr")
- [solnic/virtus](https://github.com/solnic/virtus "solnic/virtus")
- [jetrockets/attrio](https://github.com/jetrockets/attrio "jetrockets/attrio")
- [barsoom/attr_extras](https://github.com/barsoom/attr_extras "barsoom/attr_extras")

### active_attr, virtus
active_attrとvirtusは、`ActiveModel::Model`がRailsに入る前からActiveRecordっぽいインターフェースを持ったオブジェクトを定義しやすいように、モジュール自前で色々持ってます。
更に値を代入した時に、良しなにタイプキャストしてくれたり、オブジェクトをinitializeした時にデフォルト値を自動で代入してくれる機能なんかがあります。

```ruby:active_attr
class Person
  include ActiveAttr::TypecastedAttributes
  attribute :age, :type => Integer
end

person = Person.new
person.age = "29"
person.age #=> 29
```

```ruby:virtus
class Page
  include Virtus.model

  attribute :title, String

  # default from a singleton value (integer in this case)
  attribute :views, Integer, :default => 0

  # default from a singleton value (boolean in this case)
  attribute :published, Boolean, :default => false

  # default from a callable object (proc in this case)
  attribute :slug, String, :default => lambda { |page, attribute| page.title.downcase.gsub(' ', '-') }

  # default from a method name as symbol
  attribute :editor_title, String,  :default => :default_editor_title

  def default_editor_title
    published? ? title : "UNPUBLISHED: #{title}"
  end
end

page = Page.new(:title => 'Virtus README')
page.slug         # => 'virtus-readme'
page.views        # => 0
page.published    # => false
page.editor_title # => "UNPUBLISHED: Virtus README"

page.views = 10
page.views                    # => 10
page.reset_attribute(:views)  # => 0
page.views                    # => 0
```

virtusはinclude方法とかコンフィグの書き方に若干癖がありますが、こっちの方が開発が活発で人気っぽいです。

active_attrは、activemodelとactivesupportに依存しているため、railsのmasterを使ってバージョンアップの準備等をする際には邪魔になる可能性があります。

### attorio
attorioはactive_attrとvirtusの属性定義部分に特化したgemです。
後発で、コードベースがコンパクトです。外部に依存するgemを一切持たずに単体で完結してるのがウリらしいです。
typecastの動作が分かり易くて、この辺カスタマイズはし易そうなんですが、コミットはそんなに活発じゃないようです。
後、ロシア語圏の人が作ってるのか一部のissueが全然読めませんw

```ruby:attorio
class User
  include Attrio

  define_attributes :as => 'api_attributes' do
    attr :name, String
    attr :age, Integer
    attr :birthday, DateTime
  end

  define_attributes :as => 'settings' do
    attr :receives_notifications, Boolean, :default => true
  end

end
```

ざっくりコードを読んだ所、attributesを定義したら、self.inheritedを勝手に上書きしてしまうらしく、これちょっとまずいんじゃないのか？みたいな箇所があります。
軽量なんで、ハマったら自力で何とかできる余地はありますが。

### attr_extras
他のgemとはちょっと違って、`attr_accessor`っぽい記述で色々機能追加したアクセサを定義できるgemです。
プライベートなアクセサを定義する`attr_private`や初期化機能付きのアクセサを定義する`attr_initialize`、値オブジェクトの定義を支援してくれるattr_valueなんかが追加されます。
Groovy 2.2.xから2.3.x or Upperに上げるときに気がついた2.2.xのバグ(？)

#シチュエーション

これは、Groovyを2.2.x系から2.3.x以上に上げた時に、

「Method 'foo' from class 'Hoge' does not override method from its superclass or interfaces but is annotated with @Override」

と言われてしまうケースに該当する。

#原因

2.2.xだと@Overrideアノテーションを親クラスのメソッドと型が違う場合でも使えてしまう事がある。

見つけたのは次のような総称型（ジェネリクス=Generics）を使っているケース。

```java
package jp.eiya.aya;

public abstract class AbsEcho<T>{
  public abstract T echo(T obj);
}
```

このような抽象クラスに対して、つぎのようなテストを書いたとする。

```groovy
package jp.eiya.aya
import spock.lang.Specification

class AbsEchoTest extends Specification{
  static class StringEchoForTest extends AbsEcho<String>{
     @Override
     String echo(Object obj){ // << ココ
        obj.toString()
     }
  }

  static stringEcho = new StringEchoForTest()

  def 'Can echo an Strgng value?'(){
    expect:
    stringEcho.echo(value) == value

    where:
    value << ['a','b','c']
  }
}
```

上記のStringEchoForTestクラスはAbsEchoクラスを継承し、echoメソッドをOverrideしているが、よくよく見るとechoの引数がObjectである。

親クラスのechoメソッドの定義は、<code>public abstract T echo(T obj);</code>なので、正しくは<code>String</code>を引数とするメソッドでなければならないはずだが、2.2.x系だとエラーにならない。

もしこういうコードを書いていると、2.3.x系かそれ以上にアップグレードしようとした時にエラーとなる。

#解決方法

そもそも間違っているので、正しい引数の型を受けるように修正する必要がある。

今回はたまたま発見して、うおぉぅ となったので共有しておく。
もしandroid.keysotreのkey aliasを忘れてしまったなら


## パスワードはわかるけど、キーエイリアスを忘れてしまった！

そんなあなたに。
参考 : http://vancelucas.com/blog/listing-aliases-inside-an-android-keystore-file-with-keytool/

```bash
$ keytool -list -keystore /android.keystore.path
```

こいつを入力してパスワードを入力してEnterを押すだけだぜ。

![koko.png](https://qiita-image-store.s3.amazonaws.com/0/42310/568102a2-6430-a7aa-5e18-4b20fd85ac47.png "koko.png")

パスワードも忘れてしまった？

そんな人には
https://code.google.com/p/android-keystore-password-recover/

この記事が役に立つかもしれないぞ。

英文アレルギーの人は頑張って慣れるのです。
気が向いたら解読します...
JavaScriptで最低限のサニタイズをする

必要になったので。SECのセキュアプログラミング講座を根拠に、「<」「>」「&」「'」「"」をサニタイズ。

``sanitaize.encode(文字列)`` でサニタイジング、 ``sanitaize.decode(文字列)`` で元に戻す。

```js
sanitaize = {
  encode : function (str) {
    return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
  },

  decode : function (str) {
    return str.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&#39;/g, '\'').replace(/&amp;/g, '&');
  }
};
```

## 参考URL
[IPA ISEC　セキュア・プログラミング講座：Webアプリケーション編　第8章 マッシュアップ：クライアントサイドマッシュアップ: #3 クライアント側コードに起因するスクリプト注入対策](http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/710.html)

[galife: JavaScript の サニタイジング](http://garafu.blogspot.jp/2013/12/javascript_15.html)
データ更新の際にPUTメソッドを使うようになっていた。


CakePHPでデータの更新をする際に、idが$this->request->dataに付与されている場合になる。Rails4(今はPUTではなくPATCHが標準)はhiddenタグを使ってそうなるのは知っていたのですが、CakePHPでそうなっているとは知らなかったです。。

![FormHelper_—_CakePHP_Cookbook_2_x_documentation.png](https://qiita-image-store.s3.amazonaws.com/0/14066/e3111ff6-c742-98c3-94fc-7e6fd1da42e7.png "FormHelper_—_CakePHP_Cookbook_2_x_documentation.png")

[CakePHPの公式サイト](http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html)


なので、以下の様なことで挙動が変だなーと思ってました。

```php:HogeController
<?php
HogeController extends AppController {

	public function edit($id = NULL) {
		if ($this->request->is('post')) {
			//ここにこない
			// UPDATE
		} else {
			$this->request->data = $this->Hoge->findById($id);
		}
	}
}
```

「$this->request->is('put')」でちゃんとPUTメソッドをキャッチするようにしないといけない。

```php:HogeController
<?php
HogeController extends AppController {

	public function edit($id = NULL) {
		if ($this->request->is('put')) {
			// UPDATE
		} else {
			$this->request->data = $this->Hoge->findById($id);
		}
	}
}
```

しっかりドキュメントをみたり、更新情報をおわないと！
日本のIT系企業にして欲しいローコストでハイリターンな脆弱性報奨金制度の案

# はじめに
海外では脆弱性報奨金制度を設けているIT系企業はよくみかけるのですが、日本では脆弱性報奨金制度を設けているIT系企業はほとんど見かけません。
恐らく現在日本のIT系企業で脆弱性報奨金制度を設けているのはサイボウズさんだけではないでしょうか。
サイボウズさんでは、以下のような脆弱性報奨金制度の取り組みをしています。
[サイボウズ脆弱性報奨金制度｜サイボウズ株式会社](http://cybozu.co.jp/company/security/bug-bounty/)
以前まではmixiさんなどが同じような制度を設けていたようですが、今は廃止しているようです。

# 思ったこと
これまでのことで僕が思ったことは、「続かないなら無理に脆弱性報奨金制度を始めようとしない」とういことです。
正直脆弱性を見つける側としては、お金だけではなくその企業のステッカーやTシャツなどをいただけるだけで満足です。
なので、予算がないならお金ではなく安価な自社のステッカーやTシャツなどを脆弱性の発見者に送る、というだけで十分だと僕は感じます。
サイボウズさんの脆弱性報奨金制度の1件の脆弱性の報奨金を見る限り、1件の脆弱性につき最低1万円はします。
セキュリティ専門の企業に調査を依頼すると、1件1万円では絶対に済みませんよね。
ところで自社のWebサービスに脆弱性があったとしてそれが悪用されたとき、どんなリスクが生じるのかは考えたことがありますか？
個人情報流出、それに伴う賠償金など、考えるだけでも恐ろしいですよね。
そのようなリスクの可能性を、脆弱性の発見者に自社のステッカーやTシャツを送る制度を設けるだけで潰せていけるのです。
とてもローコストでハイリターンな案だと個人的には思います。

# 最後に
色々と難しいことを書きましたが、要は
「脆弱性報奨金制度とまでは行かなくていいので、脆弱性の発見者に自社のステッカーやTシャツを送る制度を設けよう！！そして探しに行くので僕に教えてください！！」
ということが言いたいです！

ちなみに同じことを僕のブログでも公開しています。
[日本のIT系企業にして欲しいローコストでハイリターンな脆弱性報奨金制度の案 | ujigami.net](http://ujigami.net/2014/08/nice-bug-bounty-idea/)
Dockerの未使用ポートで"port has already been allocated"が出たらサービス再起動すべし（メモ）

#参考ページ

[CentOS 7/docker1.0.0でハマったところメモ.](http://d.hatena.ne.jp/ken_2501jp/20140710/1404975853)

#あらまし
結構頻発するんですよね、この現象。「sudo docker run -p xxxx:80 --name foo/bar」と入れても、xxxxが使用中だよーと怒られます。そして溜まっていく未稼働コンテナ。

#どう対処するか
dockerの再起動。

##コマンド
`systemctl restart docker`

#補足
[CentOS7で使われているsystemctlについて少しまとめた](http://qiita.com/tukiyo3/items/092fc32318bd3d1a0846)
恥ずかしながら、systemdを初めて知りました。
だってubuntuだとまだexperimentalなんだもん。
備忘録Emacs

# Ctrl-zでサスペンド状態になった時の復帰方法

`fg`
を入力するだけ。

http://okwave.jp/qa/q3556849.html

# org-mode

## org から Markdown に変換

`M-x org-md-export-to-markdown`
を実行。1度実行すると、ショートカットキーが使えるらしい。
なお Markdown から org へ戻すには Pandoc を使う。

* http://orgmode.org/manual/Markdown-export.html
* https://miyazakikenji.wordpress.com/2013/10/29/org-mode-%E3%81%AB-md-%E5%BD%A2%E5%BC%8F/


# WindowsのEmacsでgrepを用いる

Windows の Emacs 上で ``M-x grep`` を用いると、

    No such directory found via CDPATH environment variable

のようなエラー( 環境変数CDPATHではそのようなディレクトリ見つかりません )が
出てしまう( grep をインストールし PATH を通していたとしても )。

原因として Emacs のターミナルの文字コードが
Shift-JIS になっていない可能性がある。
( Windows7 の内部エンコーディングは Shift-JIS )

そこで Emacs の標準文字コードを Shift-JIS にしてみる。
.emacs.el などに、以下の記述を追加。

    (set-language-environment 'Japanese)
    (prefer-coding-system 'shift_jis)

これは、

* 言語環境は日本語ですよ
* Emacs上のではどこ(バッファ、ターミナル、他)でも文字コードをShift-JISにしますよ

という設定を行っている。

この設定で Emacs の grep 内でも日本語が使えるようになる。

http://tanaka51.hateblo.jp/entry/20110915/1316039019


# Shift-JISテキストのgrepが失敗する

Shift-JIS のテキストファイルを grep する際、
文字によっては grep のコマンドが正常に実行できない場合がある。

これは、Shift-JIS(cp932) の文字コードで、
2byte目が 0x5c のエスケープ文字 \ になっている為、
grep の引数が "" で閉じられない(後ろの " がエスケープされてしまう)。
この文字は俗に「だめ文字」「駄目文字」と呼ばれている。

だめ文字の詳細は↓が詳しい(だめ文字一覧が載っていて便利)。
https://sites.google.com/site/fudist/Home/grep/sjis-damemoji-jp

だめ文字を回避するには、以下の手段がある。

* grep ではなく fgrep (正規表現を使わない固定文字列検索) を用いる
* emacs 上での grep を諦めて、サクラエディタや Devas などのソフトウェアを用いる
* 一時的に nkf で UTF-8 に変換してから grep を実行するパイプを書く http://chiiiiiiiii.hatenablog.com/entry/2013/02/26/181712


# grepの引数

* 正規表現で検索する場合は、引数に ``-E`` を指定する
* マッチした前後の行を表示する場合は、引数に ``-1`` や ``-4`` などの数値を指定する
    * 前後の行の文字は灰色に色付けされていて、見やすい
* 子ディレクトリも検索する場合は ``-r`` を指定する
    * 再帰的に検索するオプション
    * ``grep -nr "たまご" .\`` のように書く

その他の引数は↓を参照。

* http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230786/
* http://d.hatena.ne.jp/risingsun/20050225
* http://uguisu.skr.jp/Windows/grep.html


# 複数のファイルにまたがる文字列を置換

grep-edit.elを用いる。

1. grep-edit.elをEmacsにインストール。
2. M-x grepで置換文字列を検索。
3. grepの結果表示部分で ``M-x replace-string`` か ``M-x query-replace`` 等で一括変換
    * 文字列を正規表現で検索してから置換する場合は、
      ``M-x query-replace-regexp`` か
      ``M-x replace-regexp`` を使う
4. C-c C-e で変更箇所が各ファイルに反映される
5. C-x s ! で、全ファイルを保存

http://dev.ariel-networks.com/articles/emacs/part1/