OmniAICreator/Qiita-1.07M huggingface dataset:
Qiitaの特定ユーザー・特定タグの記事をテーブル形式のまとめ記事として生成する QiitaMatome gem を作ってみた

Qiita API v1 の終了により QiitaMatome は動作しなくなります

[Qiita API v1を2017年9月末に廃止します - Qiita Blog](http://blog.qiita.com/post/162422014829/deprecating-api-v1)

=> しえるさんがQiita APIv2対応をしてくれました！

# Qiitaの特定ユーザー・特定タグの記事をテーブル形式のまとめ記事として生成する QiitaMatome gem を作ってみた

## 概要

Qiitaの特定ユーザー・特定タグの記事のリンクリストを生成する gem を作ってみました。
需要があるかわかりませんが、せっかく作ったので公開します。

## 利用前提

*gem* での提供のため、Rubyの環境が必要です。
単体テストに関してはTravis CIで Ruby1.9, Ruby2.0, Ruby2.1 での動作確認済み。
手動での gem の動作確認はRuby2.0で確認済み。

Qiita APIを利用しますが、ユーザー認証が不要な機能しか使っていないため、認証情報は不要です。

## 経緯

Qiitaで日々 *RuboCop* の警告に関するエントリを追加したりしていますが、
この際に *RuboCop* のエントリをまとめた「まとめ記事」も更新しています。

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47

* このファイルを手動でメンテナンスしたくない
* 今後も似たようなまとめページを作った際の手間を小さくしたい

ということで、Qiita の API を利用してまとめ記事を自動生成することにしました。
（上記の *URL* は既に *QiitaMatome gem* で自動生成された内容になっています）

## 機能

特定の1人のユーザーの特定の1つのタグに関するまとめ記事をテーブル構造の *Markdown* で生成します。

以下を設定可能です

* タイトル
* 出力対象のユーザー
* 出力対象のタグ
* 出力ファイル名

    ※ファイルパスも含む

* 出力項目

    No、 タイトル、作成日、更新日、ストック数の中から好きな個数、好きな順番で表示可能）

* 出力順

    タイトル、作成日、更新日、ストック数 のどれか1つの昇順・降順を選択可能

* 除外記事の設定

    同一タグの記事のうち、まとめ記事から除外したい記事の *uuid* を配列で指定します

例えば、Rubyのタグの記事を人気順に記事をまとめたいなら、ストック数の降順で

~~~ruby
user            "your user name"
tag             "Ruby"
title           "Ruby 人気記事まとめ"
output_file     "./ruby_stocked_desc.md"
sort_type       "stocked_desc"
display_columns [:no, :title, :stock_count]
# 必要に応じて除外記事を設定
# excludes ['97fc9186e59d607b1ecf', '2872f2a27430372d43e4']
~~~

のような設定ファイルを作成します。
そして `qiitam matome` を実行すればまとめ記事が生成されます。

設定ファイルは Ruby の *DSL* なので、 Ruby のコードを利用することも可能です。
タイトルや出力ファイルに Ruby 経由でシステム日付を設定したりできます。

## サンプル
該当 gem で作成した Markdown のファイルのサンプルが以下です。
私の *rubocop* タグの記事を記事タイトルの昇順でまとめてあります。

https://github.com/tbpgr/qiita_matome/blob/master/samples/matome_title_asc.md

## gem のインストール
### gemコマンド利用時

~~~bash
gem install qiita_matome
~~~

### bundler利用時

* 下記を *Gemfile* に追加

~~~bash
gem 'qiita_matome'
~~~

* *bundler* の実行

~~~bash
bundle install
~~~

## その他利用法の詳細など

GitHubのREADMEを参照ください

https://github.com/tbpgr/qiita_matome

## 補足

* QiitaのAPIに負荷を掛けすぎない程度に利用していただければと思います。

## 参照
* RubyGems

https://rubygems.org/gems/qiita_matome

* GitHub

https://github.com/tbpgr/qiita_matome
Facebook/Twitter/Google+/はてぶのSNSボタン高速化(async)

基本的にasyncを入れていくだけです。

はてな
async="async"

```html
<script type="text/javascript" src="http://cdn-ak.b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
```

twitter
js.async = true;

```js
!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.async = true;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');
```

Google+
po.async = true;

```js
(function() {
  var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
  po.src = 'https://apis.google.com/js/plusone.js';
  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
})();
```

Facebook
js.async = true;

```js
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=247875698724916";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
```

いまだと各サイトで非同期読み込みの方法が書いてあります。
Android 標準ブラウザで動的にDOM操作したときにCSS隣接セレクタが適用されないバグ

CSSの隣接セレクタにバグがあるもよう。
静的なhtmlでは問題ないようだが、class属性を動的に変更した場合などはうまく適用されないようだ。

```html
<a class="btn">Class属性変更するボタン</a>
<div class="block-a">A</div>
<div class="block-b">B</div>
```
```js
//jQuery使用
$('a.btn').on('click', function(){
  $('.block-b').after('<div class="block-c">C</div>'); //Bブロックの後にCブロックを挿入
  $(this).addClass('add');
});
```
```css
a.btn ~ .block-a {
  /* 赤字になる */
  color: #f00;
}
a.btn.add ~ .block-b {
  /* 赤字にならない */
  color: #f00;
}
a.btn.add ~ .block-c {
  /* 赤字になる */
  color: #f00;
}
```

ちなみに、CのブロックをBのブロックより前に挿入すると、``a.btn.add ~ .block-b``が適用され、Bブロックは赤字になる。

```js
//jQuery使用
$('a.btn').on('click', function(){
  $('.block-b').before('<div class="block-c">C</div>'); //Bブロックの前にCブロックを挿入
  $(this).addClass('add');
});
```

この現象から考えると、``div.block-b``の親要素から見た子要素の順番が変わったことに伴って、当該要素に適用されるスタイルを再評価したためだろう。
一方、``a.btn``のclass属性が変更されただけでは、``div.block-b``はスタイル再評価の対象にならない。おそらくは、``a.btn``の直系先祖と直系子孫および隣接兄弟の要素のみが再評価されていると推測される。

まぁ、何にせよバグである。

### 現象を確認した端末
IS06 Android2.2.1
GALAXY S2 4.0.4
Sphinxを使うときに便利なLaTeXコマンド


# 概要
Sphinxユーザー用のLaTeXのまとめではなかなか出てこなさそうなコマンドを中心にまとめたいと思います。おいおい追加してきます。

# 数式
SphinxでLaTeXを使うのは主に数式だと思いますので，数式コマンドを。

## 太字
数式中でベクトルは太字の斜体にする必要があります。簡単に太字にするには\bmを使います。

```TeX
\bm{A}
```

reSTでは以下のようになります。

```reST
.. math::

	\bm{A}
```

使うときにはpreambleに

```TeX
\usepackage{bm}
```
bmパッケージの宣言を追加する必要があります。

## 大きい括弧
括弧中に分数を入れるときには高さのある括弧が必要です。以下のコマンドで数式を囲むと式の高さに応じて，括弧の高さが変わります。

```TeX
\left( \right)
\left\{ \right\}
\left[  \right]
```
中括弧{}のみ，括弧の前にバックスラッシュが必要なので，注意。

開き括弧，閉じ括弧のどちらかを使いたいときは\left.もしくは\right.を使います。開き括弧だけのときの例

```TeX
\left(   \right.
```

## ギリシア文字
イプシロンεとファイφは形が違う文字があります。

```TeX
\epsilonと\varepsilon
\phiと\varphi
```

# 改ページ
図などが並んでいて，次のセクションの文章が図の前に来たりするのを避けるために改ページしたいことがあります。LaTeXのコマンドをreSTで使うために以下のようにします。

```reST
.. raw:: latex

	\clearpage
```

.. raw:: latexでLaTeXのコマンドをそのまま挿入できます。\clearpageが改ページするためのコマンドです。
Jasmineの非同期テストが1.3から2.0で変わった

jasmineの1.3までは、非同期のテストをするのには、下記のようにしていました。

````javascript
    describe("Async test",  function() {
        it ("async execution of test", function() {
            var flag = false;
            //非同期のメソッドをここで呼ぶ
            runs(function() {
                setTimeout(function() {
                    flag = true;
                }, 500);
            });

            //trueを返すか、タイムアウトするか待つ
            waitsFor(function() {
                return flag;
            }, "change flag", 600);

            //waitsForの結果を待つ
            runs(function() {
                expect(flag).toBe(true);
            });
        });
    });
````

最初のrunsで非同期の処理を開始します。
で、waitsForは非同期の処理が終わるかタイムアウトするか待ちます。
waitsForがtrueを返したら最後のrunsが呼ばれて結果を確認します。

しかし、2.0では、このrunsとwaitsForメソッドが定義されていません。
よって、2.0では上記のテストはそのまま使えないので書き直す必要があります。
以下は、2.0向けに書き直したものです。

````javascript
    describe("Async test",  function() {
        var flag = false;
        beforeEach(function(done) {
            setTimeout(function() {
                flag = true;
                done();
            }, 500);
        });

        it ("async execution of test", function(done) {
            expect(flag).toBe(true);
            done();
        });
    });
````

beforeEach内で非同期処理を行います。
waitsForがなくなった代わりに、beforeEachに渡す関数の引数にdoneというオプショナルな引数があるので、
非同期処理が終わったらこの done　を呼び出して上げます。
そうすると、itの処理が開始され、結果を評価します。
ここのitに渡す関数の引数にdoneを渡しましたが、
これはoptionalなので、渡さなくてもいいです。(一応渡せるということだけを書きたかっただけです。)
MathJaxを利用したQiita上でのXSS

<strong>この脆弱性は既に修正されています。</strong>

Qiitaは<code>```math</code>を使うとMathJaxによるディスプレイ数式が使えるが、これに問題があった。 

# 攻撃コード

<pre>
```math
&lt;script&gt; alert(0) &lt;/script&gt;
```
</pre>

# 例

```math
<script>alert(0)</script>
```

![スクリーンショット 2014-07-02 23.48.02.png](https://qiita-image-store.s3.amazonaws.com/0/10815/83caa0c8-e67a-1e51-5c9b-d2de401ddb9f.png)

![スクリーンショット 2014-07-02 23.53.55.png](https://qiita-image-store.s3.amazonaws.com/0/10815/d148db3d-46f6-37d4-b885-9c7d5a3a10ec.png)

やばい。

# 対応

## MathJaxの停止

はやい。報告から10分くらいでこれ。

![スクリーンショット 2014-07-03 0.13.17.png](https://qiita-image-store.s3.amazonaws.com/0/10815/e54e70db-60f6-50a5-c666-9d182d786dde.png)

## 修正

1時間くらいしたら修正された。

![スクリーンショット 2014-07-03 1.07.08.png](https://qiita-image-store.s3.amazonaws.com/0/10815/4e874558-0554-92fb-8ea9-28b95ad49b2e.png)

## \hrefを用いたJSの実行

@kimama1997 さんが次のようなコードでJavaScriptの実行が可能であることを指摘。

<pre>
```math
\href{javascript:alert('xss');}{xss}
```
</pre>

これも修正された。
Macbook AirでApache http serverを動かしたかった

#はじめに
この記事はQiitaの使い方に慣れるためのテストです。
表題の件については、一応これで上手くいくはずなので、参考になればいいな。

#やりかた
Terminalを開いて、以下のコマンドを打つだけ。

    sudo apachectl start

これで起動するので、あとはお好みのブラウザでhttp://localhostを開けばOK。
ちなみに止めたいときは

    sudo apachectl stop

でOK。
再起動したいときは

    sudo apachectl restart

で再起動します。
LinuxMintでデスクトップからIntellijを起動できない際の対応方法

#前提条件
* OS : Linux Mint 17 Qiana(Cinnamon 64bit)
* JDK : Oracle Java 1.7.0_60
* Intellij : 12.1.7
* シェル : zsh 5.0.2
* JDKとIntellijは適切にインストールされている。
* JAVA_HOMEは`$HOME/local/java`


# ターミナルから起動
ターミナルからであれば、Intellijは以下のように起動させることができます。

```
kkuwana% cd /home/k-kuwana/local/idea-IU-129.1525/bin
kkuwana% sh idea.sh 
```

#デスクトップから起動
しかし、`idea.sh`のリンクを作ってデスクトップに配置して、それをダブルクリックすると以下のようなエラーが出力（ダイアログ）されます。

```
'tools.jar' is not in IDEA classpath.
Please ensure JAVA_HOME points to JDK rather than JRE.
```

.zshenvにJAVA_HOMEを設定しているのがマズいのか、原因ははっきりわかっていませんが、少くとも **Cinnamonではホームディレクトリの.zshenvを読んでくれていません。**
そこで、 **$HOME/.profile** にもJAVA_HOMEの記述を追記してログインしなおせばちゃんとデスクトップからIntellijを起動することが出来るようになります。

```:$HOME/.profile
export JAVA_HOME=$HOME/local/java
```
ContentProviderのauthorityの取得方法

#ContentProviderのauthorityの取得方法

ContentProviderを使用する場合に、authorityはmanifestに書いてあるauthorityをコピペで  

```java
public static final String AUTHORITY = "com.hogehoge.jp";
```
定数として定義するのが一般的なやり方だと思います。  

    
AndroidManifest.xmlのauthorityはContextとContentProviderの実装クラスさえ分かれば、コードからでも取ること可能です。  

```java
    /**
     * get authority from AndroidManifest.xml
     * @param context context
     * @param providerClass providerClass
     * @return authority
     */
    public static String getAuthority(Context context, Class< ? extends ContentProvider> providerClass){
        PackageManager manager = context.getApplicationContext().getPackageManager();
        try {
            ProviderInfo providerInfo = manager.getProviderInfo(
                    new ComponentName(context, providerClass), PackageManager.GET_META_DATA);
            return providerInfo.authority;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return "";
    }
```
  

 他にもAndroidManifest.xmlの内容はPackageManagerから色々と取得できるみたいですね。  

## ■参考  
 http://developer.android.com/reference/android/content/pm/PackageManager.html
ArduinoからRoombaをSoftware Serialで動かす

# 今回すること

Roomba620をSoftware serial経由でArduino UNO R3につなぎ、Serial経由でPCから操作します。
ROI用のMini-DINケーブルを自作する必要がないのでとりあえず動かしてみるのには便利です。
ROIとは何ぞやという方は[この辺](http://www.teamknox.com/Roomba/Roombaj.html)とか読んどきましょう。

# RoombaとArduinoをつなぐ
[Roomba Open Interface](http://www.irobot.lv/uploaded_files/File/iRobot_Roomba_500_Open_Interface_Spec.pdf)の3ページ目にピンの説明載ってます。

![Roomba's External Serial Port Mini-DIN Connector Pinout](http://i.gyazo.com/58fba8586263286646ba1c4a5527866d.png)

今回使うのは3,4,6ピンです。
3番ピンはRoomba側の受信(RXD)ポートです。Arduino側の送信(TXD)ポートとつなぎます。
4番ピンはRoomba側の送信(TXD)ポートです。Arduino側の受信(RXD)ポートとつなぎます。
6番ピンはグラウンド(GND)です。Arduino側のGNDとつなぎます。

ArduinoとRoombaだけで通信する場合はArduinoのSerialポートである0番(RX)、1番(TX)をRoombaとつなげばよいです。
しかし、今回はPCからArduinoを操作し、ArduinoからRoombaを操作したいので、この手は使えません。
なぜなら、ArduinoとPCをUSB経由でSerial通信するときも、これらのポートが使われてしまうからです。
そこで、ArduinoのSoftwareSerialという機能を使います。
これはSerial用ではない0番と1番以外のポートを使って擬似Serial通信をするものです。

![2014-07-02 22.43.54.jpg](http://i.gyazo.com/8e2b8ece2e63524fd48b2575c34d814c.png)

今回はSoftwareSerial用ポートとしてRXをArduinoの10番ポートに、TXを11番ポートに設定します。
ROI資料の4ページによるとRoombaは初期状態で115200ボーで通信を受け付けていますのでそのように設定します。

```arduino
#include <SoftwareSerial.h>;
SoftwareSerial device(10, 11);
void setup(){
  device.begin(115200);
}
void loop(){}
```

これで準備完了です。ROIコマンドを送ってみましょう。

```
#include <SoftwareSerial.h>;
SoftwareSerial device(10, 11);
void setup(){
  device.begin(115200);
  byte buffer[] = {
    byte(128), // Start
    byte(135)  // Clean
  };
  device.write(buffer, 2);
}
void loop(){}
```

これでRoombaはCleanモードに入ります。

ではRoombaを自在に動かしてみましょう。

```arduino
#include <SoftwareSerial.h>;
SoftwareSerial device(10, 11);
void setup(){
  device.begin(115200);
}

void loop(){
  motor(64, -64);
  delay(250);
  motor(-64, 64);
  delay(250);
}

void motor(int l, int r){
  byte buffer[] = {
    byte(128), // Start
    byte(132), // FULL
    byte(146), // Drive PWM
    byte(r>>8),
    byte(r),
    byte(l>>8),
    byte(l)
  };
  device.write(buffer, 7);
}
```

このプログラムはRoombaが左右に身を振り「イヤイヤ」をする例です。

# ArduinoとPC(Processing)をつなぐ

ここまででRoombaをArduinoからSoftware Serialを使って操作することができました。
次はArduinoをPCのProcessingからUSBを通じたSerial通信で操作しましょう。

```processing
#include <SoftwareSerial.h>;
SoftwareSerial device(10, 11);

void setup(){
  Serial.begin(9600);
  device.begin(115200);
}

void loop(){
  if(Serial.available() > 0){
    int cmd = Serial.read();
    Serial.write(cmd);
    switch(cmd){
      case 48: motor( 64,  64); break; // forward
      case 49: motor( 64, -64); break; // turnRight
      case 50: motor(-64,  64); break; // turnLeft
      case 51: motor(-64, -64); break; // back
      default: motor(  0,   0); break; // stop
    }
  }else{
    motor(0, 0);
  }
  delay(100);
}

void motor(int l, int r){
  byte buffer[] = {
    byte(128), // Start
    byte(132), // FULL
    byte(146), // Drive PWM
    byte(r>>8),
    byte(r),
    byte(l>>8),
    byte(l)
  };
  device.write(buffer, 7);
}
```
ArduinoへSerialで48というバイト値を送ると前進、49で右旋回、50で左旋回、51で後退、それ以外だと停止させるプログラムです。

PCのProcessingのプログラムについての説明は割愛します。
CなりProcessingなりPythonなりnodeなりで各自作ってください。
Xcode で return UIApplicationMain で停止する問題をデバッグする


# return UIApplicationMain

捕捉されなかった例外があった場合、xCode は通常下記のところで停止します。

![Screen Shot 2014-07-02 at 21.10.50.png](https://qiita-image-store.s3.amazonaws.com/0/27210/7823a25f-ded8-3bd5-1aed-2c777d23b2d2.png "Screen Shot 2014-07-02 at 21.10.50.png")

でもこれだとどこが原因か分かりにくいですよね。

# Exception に Breakpoint を張る

BreakPoint Navigator から、

![Screen Shot 2014-07-02 at 21.11.23.png](https://qiita-image-store.s3.amazonaws.com/0/27210/800f98a9-b570-3d2f-6907-4670e209fcdd.png "Screen Shot 2014-07-02 at 21.11.23.png")

下部の + ボタンをクリックして、"Add Exception Braekpoint" を選択。

![Screen Shot 2014-07-02 at 21.11.14.png](https://qiita-image-store.s3.amazonaws.com/0/27210/bd253d62-568d-e6ed-9bee-928d30fa5418.png "Screen Shot 2014-07-02 at 21.11.14.png")

これで例外が発生したところで Break するようになります。

![Screen Shot 2014-07-02 at 22.38.34.png](https://qiita-image-store.s3.amazonaws.com/0/27210/561b7dcc-e71e-17d7-e6a8-980518df5ec2.png "Screen Shot 2014-07-02 at 22.38.34.png")

かなり分かりやすくなりました。
Glint + WEBrick で一時的なWebサーバを立ててテストする


# 概要

HTTPクライアントなアプリをテストするときに、一時的にHTTPサーバを立てたい。
Glint と WEBrick を使用すれば一時的なHTTPサーバを立てることができる。

# Glint

https://github.com/kentaro/glint

Glint は、空いているポートを検索して、
サーバ用プロセスとクライアント用プロセスを作成するモジュール。
サーバ用プロセスでポートがListen状態になるまで待ち、
Listen状態になったらクライアントプロセスでテストができるように調整してくれる。

サーバプロセスでは、WEBrickでHTTPサーバを立て、
クライアントプロセスでは、Net::HTTPでアクセスしてレスポンスの内容をテストする形になる。


# ディレクトリ構成

今回のサンプルのディレクトリ構成は以下の通り。

```
.
├── Gemfile
├── Rakefile
└── spec
    ├── lib
    │   └── foo_spec.rb
    ├── servers
    │   └── httpserver.rb
    └── spec_helper.rb
```

今回、解説しないファイルの内容は以下の通り。

```ruby:Gemfile
source 'https://rubygems.org'

gem 'glint'
gem 'rake'
gem 'rspec'
```

```ruby:Rakefile
require 'rspec/core'
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec) do |spec|
  spec.pattern = FileList['spec/**/*_spec.rb']
  spec.ruby_opts = %w[-w]
end

task :default => :spec
```

# サーバ設定

以下のプログラムで、サーバを立てる。

```ruby:spec/servers/httpserver.rb
# Glintで一時的なWebサーバを生成
server = Glint::Server.new do |port|

  # WEBrickでWebサーバを生成
  require 'webrick'
  http = WEBrick::HTTPServer.new({
    :BindAddress => '127.0.0.1',
    :Port => port
  })
  http.mount_proc('/foo') do |req, res|
    body = 'foo'

    res.content_length = body.size
    res.content_type = 'text/plain'
    res.body = body
  end
  trap(:INT) { http.shutdown }
  trap(:TERM) { http.shutdown }
  http.start
end
server.start

# 立ち上げたサーバの Host と Port の情報を保存
Glint::Server.info[:httpserver] = {
  host: "127.0.0.1",
  port: server.port,
}
```

# ヘルパーの設定

以下のプログラムで、上記のサーバ設定プログラムを実行し、
また、テストで使うHTTPクライアントを設定している。

今回は Net::HTTP を使用しているが、
本来ならば自作のなんらかのHTTPクライアントを設定することになる。

```ruby:spec/spec_helper.rb
$LOAD_PATH.unshift '../../lib'

# サーバ起動のスクリプトを読み込む
require 'glint'
Dir[File.expand_path("../servers/*.rb", __FILE__)].each {|f| require f}

# テストで使うHTTPクライアントを生成する
require 'rspec'
shared_context 'httpserver' do
  require 'net/http'
  let(:client) {
    Net::HTTP.new(
      Glint::Server.info[:httpserver][:host],
      Glint::Server.info[:httpserver][:port]
    )
  }
end

RSpec.configure do |config|
end
```

# テストを書く

以下のプログラムで、テストをする。

```ruby:spec/lib/foo_spec.rb
require 'spec_helper'

describe 'foo' do
    include_context 'httpserver'
    before { @res = client.get('/foo') }
    it { expect(@res.body).to be == 'foo' }
end
```

# テストの実行

以下のようなコマンドでテストを実行する。

```shell
$ bundle install
$ bundle exec -- rake
```

テストを実行すると、
WEBrick が起動して、テストが実行され、WEBrick が停止するといったログが出力されるはず。

本来のテストでは WEBrick の出力は邪魔になるので、
出力されないようになんとかしたい。


# 参考

WEBrickを使うためのメモ
http://d.hatena.ne.jp/lemniscus/20090722/1248261257

glint examples
https://github.com/kentaro/glint/tree/master/examples
RuboCop | Style/FormatString

# RuboCop | Style/FormatString

## 概要

RuboCopの「Style/FormatString」警告について。

Rubyでは書式付き文字列の作成方法が複数あり、
どれを利用するか設定し、統一されているかチェックすることができます。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-----|:---|:---|:---:|
|EnforcedStyle|format|formatを利用する|○|
|EnforcedStyle|sprintf|sprintfを利用する|--|
|EnforcedStyle|percent|%記法を利用する|--|

## FormatString

各設定値での検証結果をまとめます。

### 検証プログラム

format_string.rb

~~~ruby
hoge = "hoge"
puts format("%10s", hoge)
puts sprintf("%10s", hoge)
puts "%10s" % hoge
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
FormatString:
  EnforcedStyle: format
~~~

~~~bash
$ rubocop format_string.rb
Inspecting 1 file
C

Offenses:

format_string.rb:3:6: C: Favor format over sprintf.
puts sprintf('%10s', hoge)
     ^^^^^^^
format_string.rb:4:13: C: Favor format over String#%.
puts '%10s' % hoge
            ^

1 file inspected, 2 offenses detected
~~~

### 実行結果 sprintf の場合

.rubocop.yml

~~~yaml
FormatString:
  EnforcedStyle: sprintf
~~~

~~~bash
$ rubocop format_string.rb
Inspecting 1 file
C

Offenses:

format_string.rb:2:6: C: Favor sprintf over format.
puts format('%10s', hoge)
     ^^^^^^
format_string.rb:4:13: C: Favor sprintf over String#%.
puts '%10s' % hoge
            ^

1 file inspected, 2 offenses detected
~~~

### 実行結果 percent の場合

.rubocop.yml

~~~yaml
FormatString:
  EnforcedStyle: percent
~~~

~~~bash
$ rubocop format_string.rb
Inspecting 1 file
C

Offenses:

format_string.rb:2:6: C: Favor String#% over format.
puts format('%10s', hoge)
     ^^^^^^
format_string.rb:3:6: C: Favor String#% over sprintf.
puts sprintf('%10s', hoge)
     ^^^^^^^

1 file inspected, 2 offenses detected
~~~
OAuth::Unauthorized 401 Unauthorizedなんてエラーがでたら

このエラーに出会ってもうすぐ１週間が経ちます。
ググってみると世界中の人がこの401でわちゃわちゃしてました。

##このエラーの意味
![スクリーンショット 2014-07-02 10.01.25.png](https://qiita-image-store.s3.amazonaws.com/0/27500/32db7fe6-95e6-adab-7b3f-f7dd420552ee.png)

HTTPリクエストの情報を見たけど、これではアクセス権限は与えられないので認証できません！

##原因
ググって、発見した原因を多かった順に列挙します。

1. アプリの設定画面のCallbackURLに何も入力されていない
1. API KEY（CONSUMER KEY）とAPI SECRET（CONSUMER SECRET）の設定が間違っている
1. コンピュータの時刻が狂っている（記事下部のコメントも参照してください）
1. アプリがTwitterからSuspendされてる
1. まだある！・・・！？（情報お持ちの方コメントお願いします・・・！）


##解決法
###1. アプリの設定画面のCallbackURLに何も入力されていない
![スクリーンショット 2014-07-02 14.25.37.png](https://qiita-image-store.s3.amazonaws.com/0/27500/e22654d9-2925-4075-1871-5d77763042bf.png "スクリーンショット 2014-07-02 14.25.37.png")
https://dev.twitter.com/apps でアプリケーションを登録する際に、Callback URLが入力必須項目でないからといって空っぽにしているとWebアプリケーションでは無くデスクトップアプリケーションとして認識しているため、Webアプリケーション上で動作しません。
Callback URLはダミーURLで良いのでとりあえずなにかのURLを入力しておけば良いです。必要になったときに正しいURLに変更すれば良いです。

###2. API_KEY（CONSUMER_KEY）とAPI_SECRET（CONSUMER_SECRET）の設定が間違っている
これはもう論外ですね。ちゃんとドキュメントを読みましょう。
`config/initializers/omniauth.rb`を作成して、以下を設定

```ruby:config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, "API_KEY", "API_SECRET"
end
```

or

ユーザー登録やログインなどの認証ソリューション「Devise」を利用している場合は`config/initializers/devise.rb`にいろいろ書きます。（詳しくはdeviseのドキュメントへ）



###3. コンピュータの時刻が狂っている（記事下部のコメントも参照してください）
![スクリーンショット 2014-07-02 15.53.20.png](https://qiita-image-store.s3.amazonaws.com/0/27500/10095be9-02e8-f832-ce69-6bbc19462115.png "スクリーンショット 2014-07-02 15.53.20.png")
![スクリーンショット 2014-07-02 15.53.27.png](https://qiita-image-store.s3.amazonaws.com/0/27500/36982faa-7f9f-aa92-00f7-718d34ef8e5b.png "スクリーンショット 2014-07-02 15.53.27.png")
###4. アプリがTwitterからSuspendされてる
Twitterにアプリケーションを登録し直します。一度アプリケーションの登録情報を削除し、もう一度登録します。
###5. それでも解決しない
僕がこれです。
4つ目の「アプリがTwitterからSuspendされてる」はdev.twitter.com/apps でアプリケーションに「Suspended」と表示されていないので関係ないと思いましたが一応上に挙げた解決策を実行しました。
しかし状況はかわらず。それ以外の原因は当てはまらないので他に原因があるはずだと原因を究明中です。一部のプライマリIPアドレスがブロックされている（この辺りがよくわかっていない。プライマリ？第一？セカンダリというのもあるのですね。なるほどわからん）ことが原因という情報も見つけました。

railsアプリケーションの他の部分が影響しているのかもしれないと考え、別に新しくアプリケーションを作り直し、omniauth-twitterのドキュメントにある通り設定してもこのエラーに直面してしまいます。

omniauth-facebookを用いてfacebookでの認証を試みたところ、これはうまくいきました。TwitterAPIには以前、500番台が返ってくるべきエラーが全て401となって返ってくる問題が発生していたことがあるため、今回もそんなことだったらいいななんて思ったりもしてます。
[Mac]Otoyaさん、Kyokoさんで日本語をしゃべる設定



## 1.環境設定 Dictation & Speech
![Screen Shot 2014-07-02 at 20.48.46.png](https://qiita-image-store.s3.amazonaws.com/0/14330/a330dec3-0027-870b-2f98-4e635d91775a.png "Screen Shot 2014-07-02 at 20.48.46.png")

## 2.System Voice を選択 Customizeを開く。
![Screen Shot 2014-07-02 at 20.49.19.png](https://qiita-image-store.s3.amazonaws.com/0/14330/343092b7-a752-6f6c-0356-689ecde74def.png "Screen Shot 2014-07-02 at 20.49.19.png")

## 3. Japanese から Otoyaをダウンロード
![Screen Shot 2014-07-02 at 20.50.37.png](https://qiita-image-store.s3.amazonaws.com/0/14330/7e5543f1-4c63-113a-64e6-d4ca32b71dcd.png "Screen Shot 2014-07-02 at 20.50.37.png")

## 4. ちょっと時間がかかります。

## 5. ダウンロードが終わったら

```speech.txt
こんにちは。
```

みたいなファイルを作って、デスクトップに保存。
ターミナルで

```bash:sample.sh
cd ~/Desktop
cat speech.txt | say -v Otoya -r 150  
```

ってやるとしゃべります。
-r 150を変えるとしゃべる速度が変わります。
【初心者向け】PHP5とMySQLでつくるログイン機能のサンプルアプリケーション

ブログに書いたよ。
<a href="http://replication.hatenablog.com/entry/2014/06/30/005815">【初心者向け】PHP5とMySQLでつくるログイン機能のサンプルアプリケーション - 大人になったら肺呼吸＠はてブロ</a> <a href="http://b.hatena.ne.jp/entry/replication.hatenablog.com/entry/2014/06/30/005815"><img src="http://b.hatena.ne.jp/entry/image/http://replication.hatenablog.com/entry/2014/06/30/005815" alt="はてなブックマーク - 【初心者向け】PHP5とMySQLでつくるログイン機能のサンプルアプリケーション - 大人になったら肺呼吸＠はてブロ" border="0" /></a>
jQueryで指定した文字列を含むidの要素を非表示にする

超小ネタ。

自動で作ったようなtableタグに配列チックなidが振られてて、その中から指定した文字列を含む要素だけ非表示にする方法。

↓こんなHTMLから、 **id_b** を含む要素は非表示にする。

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>jQuery test</title>
  <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
</head>
<table id="table_test" border="1">
  <tr>
    <th id="aaa[0].id_a">a</th>
    <th id="bbb[0].id_b">b</th>
    <th id="ccc[0].id_c">c</th>
  </tr>
  <tr>
    <td id="aaa[1].id_a">aaa</td>
    <td id="bbb[1].id_b">bbb</td>
    <td id="ccc[1].id_c">ccc</td>
  </tr>
</table>
</html>
```

```js
// id_bを含む場合は *=
$("#table_test [id *= 'id_b']").hide();

// id_bで終わる場合は $=
$("#table_test [id $= 'id_b']").hide();
```
BOM無しUTF-8のファイルをBOM付きで一括で保存し直す


BOM判定用rubyスクリプトを用意

参考: [BOMチェック君 - 俺の基地](http://yakinikunotare.boo.jp/orebase/index.php?BOM%A5%C1%A5%A7%A5%C3%A5%AF%B7%AF)

```ruby:bomcheck.rb
dirs = ["./trunk/unity/Assets/Source/**/*.cs", "./trunk/unity/Assets/Editor/**/*.cs"]

dirs.each do |dir|
  Dir.glob(dir).each  do |f|
    next unless File.file?(f)
    hoge = open(f)
    hoge.binmode
    begin
      if hoge.read(3).unpack("h*")[0] != "febbfb"
        puts f.to_s #+ " is *NOT* BOM file"
      end
    rescue
    end
  end
end

```

以下のとおり実行

```
$ for f in $(ruby bomcheck.rb); do vim -c "set fenc=utf-8 bomb" -c "x" $f; done
```
UIBarButtonItemにアイコンフォント(FontAwesome)を設定する。


![navbarbutton-with-fontawesome2.png](https://qiita-image-store.s3.amazonaws.com/0/8920/35f18918-7ecb-a346-26aa-a7050198162e.png)


左上Githubアイコンを指定する方法です。これはフォントであり画像ではありません。
コードで自由に色やサイズを変更できます。

## Cocoapodsでのインストール

    platform :ios, '7.0'
    pod 'BlocksKit', '~> 2.2'
    pod 'FontAwesome+iOS', :git => 'https://github.com/alexdrone/ios-fontawesome'

フォントは以下の場所に入ります。
`Pods > FontAwesome+iOS > Resources > FontAwesome.ttf`
YourProjectName-Info.plistに`Fonts provided by application`を追加し、その中の`item 0`, `item 1`などのValueに`FontAwesome.ttf`と書くとフォントが使えるようになります。

## ライブラリの読み込み

    #import <BlocksKit+UIKit.h>
    #import <FontAwesome+iOS/NSString+FontAwesome.h>
    #import <FontAwesome+iOS/UIFont+FontAwesome.h>

## UIBarButtonItemを指定

```objc
UIBarButtonItem *cancelItem =
    [[UIBarButtonItem alloc]
            bk_initWithTitle:[NSString fontAwesomeIconStringForEnum:FAGithub]
                       style:UIBarButtonItemStylePlain
                     handler:^(id sender) {
            // do something
        }];
[cancelItem setTitleTextAttributes:@{NSFontAttributeName:[UIFont fontWithName:kFontAwesomeFamilyName size:30.0],
            NSForegroundColorAttributeName:[UIColor colorWithRed:0.411 green:0.057 blue:0.058 alpha:1.000]
            } forState:UIControlStateNormal];
self.navigationItem.leftBarButtonItem = cancelItem;
```

このコードでは別のライブラリのBlocksKitと一緒に使っていますが、アイコンを表示するという目的には必須ではありません。

## 追記: 別法

```objc
UIButton *iconButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
[iconButton bk_addEventHandler:^(id sender) {

        NSLog(@"Tapped!");

        [sender setTitleColor:[UIColor colorWithRed:0.411 green:0.057 blue:0.058 alpha:1.000] forState:UIControlStateNormal];
    } forControlEvents:UIControlEventTouchUpInside];
[iconButton setTitle:[NSString fontAwesomeIconStringForEnum:FAGithub] forState:UIControlStateNormal];
iconButton.titleLabel.font = [UIFont fontWithName:kFontAwesomeFamilyName size:36.0];
iconButton.titleLabel.textColor = [UIColor colorWithRed:0.411 green:0.057 blue:0.058 alpha:1.000];

UIBarButtonItem *cancelItem = [[UIBarButtonItem alloc] init];
[cancelItem setCustomView:iconButton];
self.navigationItem.leftBarButtonItem = cancelItem;
```

こちらの方は位置を調整できるので良いかもしれません。タップしたあとに色が白くなってしまうのを防止するために再度色を設定するようにしています。

## 参照
http://fortawesome.github.io/Font-Awesome/
https://github.com/alexdrone/ios-fontawesome
WerckerでRuby2.1.1を使ってみる(コメント参照)


てっきりWerckerはRuby2.0.0しか使えないとか思っていたら、Ruby 2.1.1も設定できるらしい。(Ruby2.1.2も使えるっぽい)

__@kawasy さんのコメントを受けて変更しました。下記のやり方はwercker内での指定を強制的に行う場合に使用されます__




## やり方


```yml:
box: wercker/ruby
build:
    steps:
        - rvm-use:
            version: ruby-2.1.1
```
のように```wercker.yml```で指定する。

[wercker/box-rvm](https://github.com/wercker/box-rvm)を見てみると、```ruby-2.1.2```が使えたり、```ruby-2.1.0```がdeprecatedだったりする。


## 参考

- [wercker devcenter](http://devcenter.wercker.com/articles/languages/ruby.html)

- [bitbucketとwerckerで０円CIをする - razokulover publog](http://razokulover.hateblo.jp/entry/2014/05/21/000306)

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/kimihito_">@kimihito_</a> 1.9.3と2.1.0も選べた気がします（僕は2.1.0使ってます）&#10;<a href="http://t.co/FossOeLA3h">http://t.co/FossOeLA3h</a></p>&mdash; こばやかわ (@nekova_) <a href="https://twitter.com/nekova_/statuses/484274662285664256">2014, 7月 2</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


- [Introducing the RVM wercker box](http://blog.wercker.com/2014/01/07/introducing-the-rvm-wercker-box.html)


- [wercker/box-rvm](https://github.com/wercker/box-rvm)
angularJS でSPA開発する際のアーキテクチャについて

これに従う必要は無いがこうしておくと後々やりやすいよってやつ

クライアントサイドとは言え、大規模で保守性の高いアプリを作るなら、アプリケーションは次の5つのレイヤに分けておいた方がいい。

# View 層

- View は、ユーザーとのやりとりを行う。
- 金額のデータに ¥ や , を付加したり、リストの表示、メニューの出し入れなどのいわゆる「プレゼンテーションロジック」もこのレイヤが担当する

# Controller 層
- Controller は、View と後述の Service をつなぐ部分。ここにはデータのバインドとページ遷移の簡単な if 文を除き、ほとんど何も記述されない。
- ほとんど何も記述しない。
- ほとんど何も記述しない。
- ただただ View と Service のパイプ役に徹するべきである。
- ほとんど何も記述してはいけない。
- 30行超えたら危険信号、50 行を超えるようなら設計がおかしいと思ったほうがいい。
    - 今やってるプロジェクト（結構大規模）の controller の行数調べたら 29 ファイルで 765 行、平均 26.38 行だった。

# Service 層
- Service は、アプリケーションそのものを表す。
- Controller を介して上がってくるユーザーからの要求を元に、後述の Model 層から適切なデータを取得あるいは Model 層へデータの保存を依頼する。
- 複数の Model が関わるようなビジネス、例えば ある「商品」を「マイフレンド」に「プレゼント」したい、という時に、productModel, friendModel, presentModel などからデータを受け取り、giftModel に保存する、みたいなことをこの層で行う。

# Model 層
- Model は、Service に対してデータを提供する。
- そのデータの出所を隠ぺいする役割を持つ。つまり、そのデータが、API を経由して外部から得たのか、LocalStorage に保存してあったのか、などを覆い隠す。
- Model と Service を分離することで、Service はデータの出所を意識せずに済む。
- 複数のサービスから呼ばれるようなロジックを Model に書くことで、コピペエンジニアの鼻を明かすことが出来る。

# API 層
- API 層は、API 通信を行って外部とやりとりをする。
- シングルトンにしがちだが、クラスを提供して都度生成のほうが書きやすい（この辺については別記事にまとめます）

今スタバ（本当はマック）でドヤリングしてるんですが電池が無くなってきたのでここまで。
次回は各サービスの命名規則についてとかを書きます。
curlからhipchatに通知



## 以下のコマンドを実行
```bash
ROOM_ID=00000
TOKEN=hogehoge
COLOR=red
curl -d "room_id=＄ROOM_ID&from=zabbix&message=Build+Status:+Failing&color=$COLOR&notify=1" https://api.hipchat.com/v1/rooms/message?auth_token=$TOKEN&format=json
```
ubuntuでCPUの動作クロックを変える

sudo apt-get install indicator-cpufreq
をして一旦ログアウト

右上にインジケーターが追加される。

処理が遅い時などはperformanceを選べば良い
(普段の設定はondemandを推奨)

【参考】
http://kingpcfx.seesaa.net/article/267963948.html
Titanium Mobileことはじめ


なんとなくTitanium Mobileを触って開発してみようと思ったので、その準備をしたときのメモ。

http://docs.appcelerator.com/titanium/3.0/#!/guide/Setting_up_the_Titanium_CLI にしたがって行っている。



できればCLIで作業してみたいなと思ったので、そのやり方を。

```bash:
$ npm install titanium -g

$ titanium login

$ titanium setup

$ titanium sdk install --branch master --default
```

で一旦終了な感じ。

alloy newとかやってみたけども、そっからなんかめんどくさくなって放置している…

## その他参考

- [Titanium Mobile を実務的に使うための開発環境の整え方（1）(2/2) - 実務で使えるTitaniumテクニック - Mobile Touch](http://mobiletou.ch/2013/09/titanium-mobile-environment/2)

- [TitaniumのフレームワークAlloyをCoffeeScript/Jade/Jasmine/TiShadowで便利に使う - Ari-Press](http://www.ari-hiro.com/blog/2013/05/26/introduce-alloy)
GIF画像を使う


TitaniumでのGIF画像を使うには、パラパラ漫画っぽく動かすようにする。


```xml:app/views/index.xml

<Alloy>
	<Window class="container">
		<ImageView id="image">
			<View onClick="button"></View>
		</ImageView>
	</Window>
</Alloy>

```


```js:app/controllers/index.js

var button;

button = function(e) {
  var i, images, _i;
  $.image.image = '/images/image-1.png';
  images = [];
  for (i = _i = 1; _i <= 5; i = ++_i) {
    images.push("/images/image-" + i + ".png");
  }
  $.image.images = images;
  $.image.duration = 5;
  $.image.repeatCount = 1;
  $.image.start();
  return
};

```

動画を配置するだけじゃなくて、ちゃんと```.start()```をつけないと動かない。

## 参考
- [Images and ImageView APIs - Documentation & Guides - 2.0 - Appcelerator Wiki](https://wiki.appcelerator.org/display/guides2/Images+and+ImageView+APIs)

- [Titanium.UI.ImageView - Titanium 3.X - Appcelerator Docs](http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.ImageView)
PhoneGap(Cordova)で表示するフォントを指定する


## やりたいこと
- デフォルトのフォントだと日本語フォントがなんか微妙なので、そこを修正する感じにしたいなぁと思った。


## 解決方法
- webフォントを指定するのと同じで、```@font-face```で指定すると解決。

## 参考

- [Custom Fonts in Android PhoneGap - Stack Overflow](http://stackoverflow.com/questions/12454681/custom-fonts-in-android-phonegap)
windows8でナレーターを起動しないようにする

# 概要
Chromeでキーボード操作してるとき、特にURLバーに検索ワードを入れて「Alt+Enter」で新しいタブで検索しようとしたとき、間違えて「Win+Enter」を押してしまい、ナレーターがしゃべりだすのが非常にイラついた。それを止める方法を調べた。
(2014/07/02追記)
この方法でもホーム画面ではナレーターは起動してしまうみたいです。

# 参考
下記ページままでいけます。
『Windows 8 でナレーターが起動しないようにしたい』
http://pasofaq.jp/windows/admintools/win8nonarrator.htm

# 手順
ローカルセキュリティポリシーというのをいじり、ソフトウェアの制限のポリシーに「Narrator.exe」を追加します。
この状態にしてデスクトップ上で「Win+Enter」しても「ナレーターを起動しています」的な音声は流れなくなります。
Node.jsで1分でTodoアプリを作らない

[Compoundjs](http://compoundjs.com/)のscaffolderでTODOアプリを作ろう、という記事です。

この手のチュートリアルはRailsとかにありがちですね。1分で作るとか5分で作るとか、実際の実務でかかる時間と無関係で腹が立ちますね。

scaffolderってたまにしか使わないものですし、いちいちそのたびに覚えるのも調べるのも面倒じゃないですか。なので手順の記事を書く代わりに、scaffolderをscaffoldingするサービスを作りました。

StartPound

http://hashrock.github.io/startpound/


使い方
---

アプリ名を決めて…

![1.gif](https://qiita-image-store.s3.amazonaws.com/0/32596/d05c83db-6050-3872-6532-8a1252833347.gif)

項目を追加して…

![2.gif](https://qiita-image-store.s3.amazonaws.com/0/32596/572934b5-438e-8a8b-ac54-a111a495ae0e.gif)

あとはターミナルにコピペでOKです。

![3.gif](https://qiita-image-store.s3.amazonaws.com/0/32596/aa941d55-9512-547d-2d6c-3e7036a03f46.gif)

以上です。

仕様など
---

 * CompoundjsはExpress3向けのテンプレートを生成します。4じゃないです。そのうち対応してくれるんでしょうか。
 * アプリ名とコレクション名を一緒にしてあります。適宜変えて下さい。
 * Scaffold直後はメモリ上にコレクション保持してますので、node落とすと普通に揮発します。MongoDBに保持する手順もサイトに書いておきました。

なんでつくったか
----

実はcompoundというよりはVue.jsの練習だったりします。computedプロパティめちゃ便利ですね。
LeoFSにREST API経由でアクセスをする

引き続きLeoFSを触ってみる。今回はREST APIでLeoFS上のファイルを操作してみる。
[REST API — LeoFS 1.0 documentation](http://leo-project.net/leofs/docs/rest_api.html)

# GETしてみる
とりあえずGETくらいはいけるやろ、と甘く見ていたが、ドキュメントの一行目でいきなり詰まる。

`${USE_S3_AUTH}`というのがわからない。Gateway configurationのリンク先にもないっぽい。ドキュメント内の検索をしてみてもこのREST APIのページしか出てこない。その後の${KEY}というのもわからなかった。。

無視して、GETを投げてみる。

```
$ curl -X GET http://localhost:8080/tarr-bucket/test.txt
<?xml version="1.0" encoding="UTF-8"?><Error><Code>AccessDenied</Code><Message>Access Denied</Message><Resource>tarr-bucket/test.txt</Resource><RequestId></RequestId></Error>
```

あからさまに上記のAUTHの設定がない的なエラーが帰ってきた。

# 開発サイドに質問
どうしようもなかったので開発サイドに質問してみたところ、このREST APIのドキュメントが古かったらしく
[LeoFS Configuration — LeoFS 1.0 documentation](http://leo-project.net/leofs/docs/configuration.html#conf-gateway-label)

上記ドキュメントの{HTTP_HANDLER}というところに置き換わっているらしい。`{LEOFS_HOME}/package/gateway/etc/leo_gateway.conf`の中の`http.handler`をrestに設定すると良いとのこと。

# 改めてGETしてみる

```
vi leo_gateway/etc/leo_gateway.conf

## Gateway’s HTTP API to use: [s3 | rest | embed]
http.handler = rest
```

上記に編集した後にGETを投げてみる。

```
$ curl -X GET http://localhost:8080/tarr-bucket/test.txt
<?xml version="1.0" encoding="UTF-8"?><Error><Code>AccessDenied</Code><Message>Access Denied</Message><Resource>tarr-bucket/test.txt</Resource><RequestId></RequestId></Error>
```

エラーがでた。先ほど編集したconfigファイルが反映されていないのかと思い、gatewayをrestartする。

```
$ leo_gateway/bin/leo_gateway stop
ok
$ leo_gateway/bin/leo_gateway start
```

改めてGET

```
$ curl -X GET http://localhost:8080/tarr-bucket/test.txt
tarrrrrrrrrr
```

上手くいった。
[iOS8][Swift]UIVisualEffect (blur effect)

iOS8ようやく動的blur効果API提供してくれたので、使ってみました~ 

#API
##UIVisualEffect
UIVisualEffectViewを生成するためのクラス,subclassがUIBlurEffectとUIVibrancyEffect
###UIBlurEffect
blur効果のクラス、三つのblur効果が指定できる
```swift
enum UIBlurEffectStyle : Int {
    case ExtraLight
    case Light
    case Dark
}
```

###UIVibrancyEffect
blurの上で目立ちたい表示をしたい時に使う.blurEffectを引数として生成する.
説明下手なので、具体的なイメージは下のキャプチャの"I like Vibrancy Effect"を見てください

```swift
init(forBlurEffect blurEffect: UIBlurEffect!) -> UIVibrancyEffect
```

##UIVisualEffectView
UIVisualEffectを受け取って、blurなどの効果を実現するUIVisualEffectViewを生成する

```swift
init(effect effect: UIVisualEffect!)
```

#実装
##blur effect
```swift
// blur effect view作る styleはdark
let blurEffect = UIBlurEffect(style:.Dark)
let visualEffectView = UIVisualEffectView(effect:blurEffect)
visualEffectView.frame = self.view.frame;
        
// blur効果をかけたいviewを作成
let view = UIView(frame:self.view.frame);

// blur効果viewのcontentViewにblur効果かけたいviewを追加  
visualEffectView.contentView.addSubview(view)

// 表示〜
self.view.addSubview(visualEffectView);
```
##vibrancy effect
vibrancy effectはblur effect viewをあわせないと使えない(そうでしょう。。)

```swift
// vibrancy効果をかけたいviewを作成
let label = UILabel(frame:CGRectMake(0,0,320,30));
label.text = "I like Vibrancy Effect!!!";
label.textColor = UIColor.whiteColor();

// vibrancy effect viewを作成
let vibrancyEffect = UIVibrancyEffect(forBlurEffect:visualEffectView.effect as UIBlurEffect)
let vibrancyEffectView = UIVisualEffectView(effect:vibrancyEffect)
vibrancyEffectView.frame = label.frame
vibrancyEffectView.frame.origin.y = 200;

// vibrancyEffectViewのcontentViewにeffectかけたいviewを追加
vibrancyEffectView.contentView.addSubview(label)

//最後はblur効果viewのcontentViewにvibrancyEffectViewを追加        
visualEffectView.contentView.addSubview(vibrancyEffectView)
```

キャプチャ:
 ![BrYxCDzCcAERQsG.jpg-large.jpeg](https://qiita-image-store.s3.amazonaws.com/0/9564/892daaf7-605e-5467-0bf7-3de411ef7704.jpeg)

#widget(Today Extension)　vibrancyEffect

iOS8 widget作って、vibrancyEffect使う時はUIVibrancyEffect.notificationCenterVibrancyEffect()を使う

```swift
//ここはnotificationCenterVibrancyEffectを使う
let vibrancyEffectView = UIVisualEffectView(effect:UIVibrancyEffect.notificationCenterVibrancyEffect())

//以下は同じ
vibrancyEffectView.frame = CGRectMake(0, 0, 40, 40);

let label = UILabel(frame:CGRectMake(0,0,40,40));
label.text = "whatever";
label.textColor = UIColor.whiteColor();
        
vibrancyEffectView.contentView.addSubview(label)
self.view.addSubview(vibrancyEffectView)
```
 
#注意
* visualEffectView自身ではなくて,visualEffectViewのcontentViewにviewを追加する. 
* alpha設定しないこと.設定した場合はblur効果がなくなる
* 静的blurが使える場合は静的blurを使う。(view hierarchy描写が速い)

#参考
[UIVisualEffect](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIVisualEffect_class/index.html#//apple_ref/occ/cl/UIVisualEffect)
[Creating Custom iOS User Interfaces](https://developer.apple.com/videos/wwdc/2014/)
Guardが動かない。


[Rails4時代の高速テスト環境 Rspec+Guard+FactoryGirl+Spring[NEW!] - Qiita](http://qiita.com/unosk/items/c2e2bbc31d97e92803dc)を参考に設定していたら、どうしてもguardが動かない。

```
`block in setup': You have already activated timers 2.0.0, but your Gemfile requires timers 1.1.0. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
```
が出て、RSpecが走らなかったので、その解決策のメモ。

## 解決方法

```gem cleanup```で古いGemを綺麗にした後、

```Guardfile
guard :rspec, cmd: 'bundle exec rspec' do
end
```

と書いて解決させた。

（コマンド指定してるだけだからあんまり良い解決方法だとは思わないなぁ）


## 参考

- [RubyGem で "Unresolved specs" の警告が出た時の対処法 - おさかな日誌](http://toufuegg.hatenablog.com/entry/2013/05/27/RubyGem_%E3%81%A7_%22Unresolved_specs%22_%E3%81%AE%E8%AD%A6%E5%91%8A%E3%81%8C%E5%87%BA%E3%81%9F%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95)

- [Guard won't start: guard.rb:133:in `setup_listener': undefined method `change' for #<Listen::Listener:0x007fb9e4798df8> · Issue #524 · guard/guard](https://github.com/guard/guard/issues/524)
Zend Framework 2 でリダイレクトする際にGETパラメータを渡す Redirect with get parameter on zf2

ZendFramework 2 の AbstractActionController には、リダイレクトしてくれる redirect() プラグインがあります。
toRoute()を使うことで、route情報を使ってリダイレクト先を決めることが出来ます。

コントローラ内で、toRoute() してリダイレクトする際、GETパラメータを渡すことが出来ます。

```php
return $this->redirect()->toRoute(
    'routename/childroutename',
    [
        'controller' => 'album',
        'action' => 'index'
    ],
    [
        'query' => [
            'param' => 'value'
        ]
    ]
);
```
iPhoneでバッテリーとかwifiとかの色を変える方法（StatusBar）

![5b5aa8cedb7d764231d7147be8f98d41.png](https://qiita-image-store.s3.amazonaws.com/0/24854/7b7e1cac-81d6-7ee9-69fe-cc43af48eafc.png)

↑xcode6 bata2でこんな感じにしようとおもったらstoryboadで設定できるっぽいのにもかかわらずハマった
Supporting Filesのinfo.plistに

~~~
Status bar style : UIStatusBarStyleLightContent
Status bar is initially hidden : NO
View controller-based status bar appearance : NO
~~~
上記のように追加。たったこれだけなのに…
CentOS6でgitのより新しいバージョンをchefでインストール

# 背景
chefのcookbookについての検証結果を紹介します。

# 問題
chefのcookbookでgitをインストールすると、CentOS6の標準パッケージの1.7.1がインストールされます。
このバージョンでは周知の事象ですが、httpアクセスのbasic認証に不具合があるので、新し目のパッケージをインストールしてみます。

# 解法
yumリポジトリにRPM Forgeを追加して、別バージョンのgitをインストールします。
Berksfileにcookbookを指定します。

```bash:Berksfile
cookbook "yum-repoforge"
cookbook "git"
```

nodeのjsonファイルにrun_listで指定します。

```bash:nodes/centos6.json
{
        "run_list":[
                "recipe[yum-repoforge]",
                "recipe[git]"
        ]
}
```

後はノードへ実行します。

```
$ knife solo cook centos6
```

ノードにログインしてバージョンを確認してみます。

```
$ vagrant ssh
[vagrant@centos6 ~]$ git --version
git version 1.7.12.4
```
CPANモジュールを使う


#モジュールを使う

ターミナルでモジュールをインストールする

``` 
cpanm --sudo Acme::Oppai
```

**「Acme」はジョークモジュールにつけるのが慣例**

使用例

``` oppai.pl
use strict;
use warnings;

use Acme::Oppai;
print Acme::Oppai->oppai;
```
これでもうコミット時のソースの差分にイライラ(しない|させない)！Eclipseで必ずフォーマットをかける方法。

Eclipseの超便利機能に、フォーマッタと、コードの差分表示があります。
フォーマッタは、Shift+Command+Fを押すと、ソースコードを綺麗にフォーマットしてくれる機能です。
コードの差分表示は、バージョン管理システムにソースをコミットする前などに差分をハイライトしてくれるものです。

チームで開発している時は、
1. ソースをリポジトリから持ってくる。
2. 変更を加える。
3. フォーマットを行う。
4. 差分を確認する。
5. コミットする。
ということを行うのですが、3でフォーマットをした時に、リポジトリから持ってきたソースがちゃんとフォーマットされていないと、フォーマッタにより変更を入れてない部分も変更を受けて、自分が変更していない部分まで差分が表示されてしまうのです。

せっかく綺麗になったのに、差分が見づらくて、すごく悲しい気分になります。結局はすべての差分を表示することに。結局、「ここは、改行入っただけだから問題ないよね。」とか、いちいち確認していくことになるのです。すごく悲しい。

# 保存時に必ずフォーマットをかける！
そんな悲しい思いをチームメンバーにさせないために、保存を行った時は必ずフォーマットをかけるようにしておきましょう！
方法はEclipseのメニューの環境設定（Windowsであれば、Window→Preference）で、Java→Editor→Save Actionsで、"Perform the selected actions on save"と、"Format Source code"にチェックを入れましょう！

これでまた、世の中から悲しみが少し消え、笑顔が少し増えることでしょう。ぜひ、チームメンバーにも教えてあげて下さい。
JavaFXでショートカットキーを設定する

JavaFXでショートカットキーを設定する場合は、Accelerratorに「Shortcut+C」などと設定するとよい。
Windowsでは「Ctrl+C」、OS Xでは「Command+C」として表示されるのでOS毎の違いを気にしなくてよくなる。

![SnapCrab_JavaFX Scene Builder - Releasefxml_2014-7-2_17-32-41_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/3584/0c6ed520-0032-3ed8-fc9d-211cb62b9e04.png)

コードで書く場合は以下のようにする。

```lang:keyCombination.java
KeyCombination copyKey = KeyCombination.valueOf("Shortcut+c");
copyMenu.setAccelerator(copyKey);
```
Macのdateコマンドで時間調整するやり方

===

Linuxで1日前の日時を取得する場合には

```
date -d '-1 day'
```

で取得できますが、Macの場合オプションが違ったのでメモ。


```
date -v-1d
```

---

ちなみにコマンドのUsageを見ると

```
[-v[+|-]val[ymwdHMS]]
```

と書いてあったので

- 10分前は

```
 -v-10M
```
- 1か月後は

```
	-v+1m
```

のように書けます。

また、数字の前の[+|-]を省略したところ直値の指定ができました。

```
$ date
Wed Jul  2 17:29:21 JST 2014
$ date -v10m
Thu Oct  2 17:28:30 JST 2014
$ date -v22H
Wed Jul  2 22:29:05 JST 2014
```

出力フォーマットについてはLinuxのdateコマンド同様

```
+'%Y-%m-%d %H:%M:%S %z'
```

のように使えました。
yumで「The GPG keys listed for the "CentOS / .....」というエラーが起こる

#環境
EC2 
AMI: suz-lab_centos-core-6.5.1 (ami-99107d98)


#現象
yumコマンド(yum update / yum install php 等)を実行すると、次のようなエラーが発生
```The GPG keys listed for the "CentOS / Red Hat Enterprise Linux 6 - atomicrocketturtle.com" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.```


#解決方法
```yum clean all
yum update atomic-release```

それでも治らないときは、以下のコマンドを発行し、

```rpm --import https://www.atomicorp.com/RPM-GPG-KEY.atomicorp.txt
```

/etc/yum.repos.d/atomic.repo　の中を以下のように書き換え

```
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY.atomicorp.txt    
         file:///etc/pki/rpm-gpg/RPM-GPG-KEY.art.txt
```
PlayerPrefs の値を編集するエディタ拡張


# コード

以下のコードを Assets/Editor 配下などに格納。

```csharp:EditPlayerPrefs.cs
using UnityEngine;
using UnityEditor;
using System.Collections;

public class EditPlayerPrefs : EditorWindow {
	
	class PrefInfo {
		public string Key;
		public string Type;
	}
	
    // 表示対象のキーとタイプ
	PrefInfo[] keys = new PrefInfo[] {
		new PrefInfo { Key = "hoge", Type = "string" },
		new PrefInfo { Key = "fuga", Type = "int" },
	};
	
	[MenuItem("Window/Edit PlayerPrefs")]
	public static void ShowWindow() {
		EditorWindow win = EditorWindow.GetWindow<EditPlayerPrefs>();
		win.title = "PlayerPrefs";
	}
	
	void OnGUI() {
		foreach(var keyInfo in keys) {
			switch(keyInfo.Type) {
			case "string":
				var originalString = PlayerPrefs.GetString(keyInfo.Key);
				var currentString = EditorGUILayout.TextField(keyInfo.Key, originalString);
				if (currentString != originalString) {
					PlayerPrefs.SetString(keyInfo.Key, currentString);
					Debug.Log ("*** update " + originalString + " => " + currentString);
				}
				break;
				
			case "int":
				var originalInteger = PlayerPrefs.GetInt (keyInfo.Key);
				var currentInteger = System.Convert.ToInt32(EditorGUILayout.TextField(keyInfo.Key, originalInteger.ToString()));
				if (currentInteger != originalInteger) {
					PlayerPrefs.SetInt(keyInfo.Key, currentInteger);
					Debug.Log ("*** update " + originalInteger.ToString() + " => " + currentInteger.ToString());
				}
				break;
				
			default:
				throw new Claris.System.Exception.ApplicationError("Unsupported pref type : " + keyInfo.Type);
			}
		}
	}
}
```

# 使い方

PrefInfo[] keys の値を適宜変更。

[Window]-[Edit PlayerPrefs] で起動

![kobito.1404288964.632680.png](https://qiita-image-store.s3.amazonaws.com/0/8219/27623b0c-4c47-09e0-6f77-071c28296b69.png "kobito.1404288964.632680.png")
Symfony2でx-forwarded-hostを優先する設定

プロキシ経由でWebサーバにつなぐ構成の場合
デフォルトだとgenerateUrl()などで絶対URLにした時に、localのホスト名（`http://web.*.local/xxx` など）になってしまいます

例えば`$this->redirect($this->generateUrl(xxx, xxx, true))`のようにしていた場合、名前解決できずにエラーになるなど不都合です。

そこでx-forwarded-hostを優先する設定が必要になってきます

config.ymlに以下を設定

<pre>
framework:
    trusted_proxies: [xxx.xxx.xxx.xxx] ←プロキシのIP
</pre>

これで元々リクエストに来たドメインにてURLが作られます

参考：
なお、以前あった"trust_proxy_headers"は廃止されたようです
http://www.leaseweblabs.com/2013/06/symfony-2-3-lts-symfony2-with-long-term-support/

"trusted_proxies"の設定方法（公式）
http://symfony.com/doc/current/reference/configuration/framework.html#trusted-proxies

[Symfony 2.5.0]
LeoFSにDragonDiskでアクセス

S3クライアントのDragonDisk経由でアクセスをしてみる。
[Amazon S3 Client Tutorials — LeoFS 1.0 documentation](http://leo-project.net/leofs/docs/s3_client.html#connecting-to-leofs-using-dragondisk)

# DragonDiskをいれる

CentOSでこのリンクからDragonDiskをダウンロードして、そのままインストーラでGUIからインストールする。
http://download.dragondisk.com/dragondisk-1.0.5-1.i686.rpm


インストールが終わったら、`Applications > Internet > DragonDisk`でGUI経由で起動。

`File > Account > New`で新規アカウントの作成。

| key              | value                       |
|:-----------------|:----------------------------|
| Provider         | Other S3 compatible service |
| service endpoint | localhost                   |
| Account name     | tarr                        |
| Access key       | (Access key)                |
| Secret key       | (secret key)                |
| HTTP port        | 8080                        |
| HTTPS Port       | 8443                        |

こんな感じで設定してみた。左上のRootのところを先ほど作った、tarr-bucketに変更すると、中身がいろいろみえて、右側のRootを自分のコンピュータにして、その中のファイルなどをドラッグアンドドロップできた。

create bucketすると、エラーが出る。どうやらendpointというのがlocalhostだとだめらしい。endpointってなんやねん。

なんか色々触ってみたけど、create-bucketできなかった。とりあえず、このツールはこんなものもあるという認識でとどめといて、次にうつる。

# 2014/07/03　追記
上記で、create-bucketできないと書いたが、コメントでやり方を教えてもらい、無事に出来たので、追記する。

/etc/hostsに追加したいbucketの設定を入れる。

```
$ sudo su
$ vi /etc/hosts

127.0.0.1 localhost tarr-bucket.localhost 

↓ samplebucket.localhostを追加（samplebucketが追加したいbucket名）

127.0.0.1 localhost tarr-bucket.localhost samplebucket.localhost
```

その後にDragonDiskでaccountのServiceEndpointがlocalhostになっていることを確認し、左の方のバケツにプラスマークが付いているアイコンをクリック。
samplebucketと入力し、OKを押すと、bucketが追加される。
scipy.sparseは内積演算に最適化されていない

```py3
import timeit
import numpy as np
import scipy as sp

def getSparse(length, size, todense = False):
    array = np.random.random_integers(0, size - 1, length)
    response =  scipy.sparse.csr_matrix(([1]*len(array), array,range(len(array) + 1)), shape=(len(array),size), dtype = array.dtype)
    return response.todense() if todense else response

def testDense():
	x = np.dot(np.random.rand(300000).reshape(300, 1000), getSparse(1000,300, True))

def testSparse():
	x = np.dot(np.random.rand(300000).reshape(300, 1000), getSparse(1000,300, False))

print(timeit.timeit(testDense, setup = 'import __main__', number = 1))
# 0.08102297782897949
print(timeit.timeit(testSparse, setup = 'import __main__', number = 1))
# 30.572995901107788

```

スパース行列を使うことでdot演算が早くなることを期待したら、恐ろしく遅くなった。理論上は早くなってもおかしくないはずなわけだけど、実装が対応していないのではないかと思われる。

余談だが、実際にやりたいのは、ndarrayの特定の次元の値を、集約すること。たとえば、次元が(店舗×日付）になっているデータを、（地域×日付）にするというような処理。自分のユースケースでは、普通にdense行列で計算すれば問題なかったが、もっとデータが増えたとき、この特性は問題なりそう。
vimrc晒し

_vimrcと.vimrc共用

```
"tabの桁数
set tabstop=2
set softtabstop=2

"カーソルの位置を表示
set number
set ruler

" >>や<<を打ったときに移動する桁数
set shiftwidth=2
"自動インデント
set autoindent
"デフォルトのファイルエンコーディング
set fileencoding=sjis
"自動的に認識するエンコーディング達
set fileencodings=sjis,utf-8,iso-2022-jp,euc-jp
"色つけ
syntax on
"backspaceがindent,eol,startを超えて動作するようにする
set backspace=indent,eol,start
"タブ補完
set nocp
"検索時に一致した部分をハイライト
set showmatch
set hlsearch
"挿入モード時、日本語入力をOFFで始める。
set iminsert=0
set imsearch=0

:set list
" Listモード (訳注: オプション 'list' がオンのとき) に使われる文字を設定する。
:set listchars=tab:>-,extends:<,trail:-,eol:<


"前回終了時を表示
autocmd BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal g`\"" | endif
"補完スクリプトを使う(デフォルトctrl+nによる補完の拡張版なので不要なら書かなくてOK)
let g:neocomplcache_enable_at_startup = 1

"タブをスペースにする
set expandtab

"grepを別画面で開く
autocmd QuickFixCmdPost *grep* cwindow
```