OmniAICreator/Qiita-1.07M huggingface dataset:
iOSでAPIのテストが書きやすくなったTestCaseクラス

XCTestでAPIクライアントのテストを書くときに便利だったテストケースクラスの実装をシェアします。

その前に、そのテストケースクラスを使った時にどうなるかbefore/afterで比較しましょう。
beforeは元の自分のプロジェクトで使われた環境で書かれてたテスト風のサンプルコードで、afterが便利TestCaseクラスを利用したコードです。

### before

基本的にはOHHTTPStubsを使ってHTTPのリクエストをstubして、TRVSMonitorを使って非同期処理の待ち状態を作ってました。
毎回stubの定義を書いたりmonitorオブジェクトなど作成したり、テスト書くのに全然集中できないし、読んでても余計なコード大石イライラしますね。

```objc

#import <XCTest/XCTest.h>
#import <OHHTTPStubs/OHHTTPStubs.h>
#import <TRVSMonitor/TRVSMonitor.h>
#import "AMEFooBarClient.h"

@interface AMEFooBarClientTests : XCTestCase

@end

@implementation AMEFooBarClientTests

- (void)setUp
{
    [super setUp];
    // Put setup code here; it will be run once, before the first test case.
}

- (void)tearDown
{
    // Put teardown code here; it will be run once, after the last test case.
    [OHHTTPStubs removeAllStubs];
    [super tearDown];
}

- (void)testExample
{
    __block NSURLRequest *lastRequest;
    [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { return YES; }
        withStubResponse:^OHHTTPStubsResponse * (NSURLRequest *request) {
            lastRequest = request;
            return [OHHTTPStubsResponse responseWithFileAtPath:OHPathForFileInBundle(@"sampleResponse.json", nil)
                                                    statusCode:200
                                                       headers:@{@"Content-Type" : @"application/json"}];
        }];

    TRVSMonitor *monitor = [TRVSMonitor monitor];

    __block NSArray *fooBars;
    [[AMEFooBarClient new] fetchFooBarWithFooBarId:@1
                                 completionHandler:^(NSArray *array, NSError *error) {
                                     fooBars = array;
                                     [monitor signal];
                                 }];
    [monitor wait];
    XCTAssertTrue([[[lastRequest URL] path] isEqualToString:@"/api/v1/foo/bar/1"]);
    XCTAssertTrue(fooBars[0][@"id"]);
}
```

### after
stub定義するための簡単なhelperメソッドを定義しました。
TRVSMonitorは前準備がダルかったので、前準備の要らないTKRGuardに乗り換えました。
https://github.com/tokorom/TKRGuard

```objc
#import <XCTest/XCTest.h>
#import "AMEHTTPRequestTestCase.h"
#import "AMEFooBarClient.h"

@interface AMEFooBarClientTests : AMEHTTPRequestTestCase

@end

@implementation AMEFooBarClientTests

- (void)setUp
{
    [super setUp];
}

- (void)tearDown
{
    [super tearDown];
}

- (void)testExample
{
    [self stubAllRequestWithResponseFileName:@"sampleResponse.json" statuCode:200];

    __block NSArray *fooBars;
    [[AMEFooBarClient new] fetchFooBarWithFooBarId:@1
                                 completionHandler:^(NSArray *array, NSError *error) {
                                     fooBars = array;
                                     RESUME;
                                 }];
    WAIT;
    XCTAssertTrue([[[self.lastRequest URL] path] isEqualToString:@"/api/v1/foo/bar/1"]);
    XCTAssertTrue(fooBars[0][@"id"]);
}
```

スッキリしました。

↑のテストケースクラスの実装例はこちらです。
https://gist.github.com/ainame/3ca51dde36ea0e9e997e

以上、用途に応じてTestCase作るとすごい便利でテスト書くのに集中できていいですね〜っていうtipsでした。
capistrano3: cap [env] deployでsudo mkdirする

cap [env] deploy した時にmkdirでpermission deniedに遭遇した。
検索するとすぐ出てくる話なので、あるあるなんだろうけどメモしておく。

問題のコードはこのタスク以降のdeploy:check関係

```capistrano-3.2.1/lib/capistrano/tasks/deploy.rake
 43   namespace :check do
 44     desc 'Check shared and release directories exist'
 45     task :directories do
 46       on release_roles :all do
 47         execute :mkdir, '-pv', shared_path, releases_path
 48       end
 49     end
```

shared_pathとかreleases_pathの場所に権限がないと怒られる。
[公式](http://capistranorb.com/documentation/getting-started/authentication-and-authorisation/)とか[この辺](http://stackoverflow.com/questions/19948809/capistrano-3-sudo-task)を見ると、sudoを使う方法が紹介されてたので真似してみた。
今回はあくまでcap [env] deployを使いたかったので、deploy:check:directoriesをorverwriteすることにした。

```deploy.rb
namespace :deploy do
  Rake::Task["deploy:check:directories"].clear

  namespace :check do
    desc '(overwrite) Check shared and release directories exist'
    task :directories do
      on release_roles :all do
        execute :sudo, :mkdir, '-pv', shared_path, releases_path
        execute :sudo, :chown, '-R', "#{fetch(:user)}:#{fetch(:group)}", deploy_to
      end
    end
  end
```

(たぶん)ミソはdeploy:check:directoriesを一旦消してから定義してるところ。
それと、mkdirの後にchownでdeploy_toの所有者を変えてるところ。
deploy:check:directoriesは一旦消さないと、overwriteしても古い方のタスクが呼ばれて解決しなかった。
chownしてるのは、deploy:check:directories以降のタスクでもmkdirしてるので、丸ごと所有者を変えて、以降の処理ではsudo不要にしたかったため。
Macにansibleを使ってphpを入れる

#ゴール
仮想マシンにansibleを使ってphpをインストールし、
php.iniとphp-fpmのwww.confを/etc/に生成します。

[前回](http://qiita.com/kanuma1984/items/2f89142fc3cab702e84d)、nginxを入れているのでphp-fpmもインストールします。

#環境

+ ホストマシンはMac OS X 10.7.5
+ 仮想マシンはcentos6.5
+ ansible 1.4.1
+ Vagrant 1.3.5

#フロー

[前回](http://qiita.com/kanuma1984/items/2f89142fc3cab702e84d)の続きとして進めます。

+ playbookにphpインストール用タスクを追加
+ phpインストール用roles追加
+ ansible-playbook実行


#playbookにphpインストール用タスクを追加
local.ymlに以下タスクを追加します。

```yaml:local.yml
- name: PHP Playbook
  hosts: local
  sudo: yes
  roles:
    - php
  tags:
    - php
```

#phpインストール用roles追加
まずはディレクトリを作って下準備です。

```bash
$ mkdir provisioning/roles/php
$ mkdir provisioning/roles/php/tasks
$ touch provisioning/roles/php/tasks/main.yml
$ mkdir provisioning/roles/php/templates
```

main.ymlに処理を追加していきます。
epelとremiのレポジトリも追加しておきます。

```yaml:main.yml
---
# file: provisioning/roles/php/tasks/main.yml
- name: set epel repository
  shell: rpm -Uvh --force http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
- name: set remi repository
  command: sudo rpm -Uvh --force http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

- name: install php
  yum: name={{item}} enablerepo=remi,epel state=present
  with_items:
    - php
    - php-devel
    - php-fpm

- name: put php.ini
  template: src=roles/php/templates/php.ini.j2 dest=/etc/php.ini
- name: put php-fpm.d/www.conf
  template: src=roles/php/templates/www.conf.j2 dest=/etc/php-fpm.d/www.conf

- name: set autoload php-fpm
  command: chkconfig php-fpm on
- name: restart php-fpm
  command: service php-fpm restart
```

実行前にphp.ini.jsとphp-fpmのwww.conf.jsを
provisioning/roles/php/templates下に置いて下さい。最悪、中身はなんでも構いません。


#ansible-playbook実行

タグを指定してphpのタスクだけ走らせます。
vagrant upをして仮想マシンを起動させておいてくださいね。

```bash
$ ansible-playbook provisioning/local.yml --tags "php" -i provisioning/inventory/local

PLAY [PHP Playbook] ***********************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [php | set epel repository] *********************************************
changed: [localhost]

TASK: [php | set remi repository] *********************************************
changed: [localhost]

TASK: [php | install php] *****************************************************
ok: [localhost] => (item=php,php-devel,php-fpm)

TASK: [php | put php.ini] *****************************************************
ok: [localhost]

TASK: [php | put php-fpm.d/www.conf] ******************************************
ok: [localhost]

TASK: [php | set autoload php-fpm] ********************************************
changed: [localhost]

TASK: [php | restart php-fpm] *************************************************
changed: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=8    changed=4    unreachable=0    failed=0
```

以上になります！！
タグの指定便利だなぁ。
あと個人的にはwith_itemsが気に入った。
Google Analytics API のデータをGarbで取得する場合 on Rails

タイトル通りの内容です。開発環境は以下の通りです。

開発マシン
　OS: Windows 7 Home Premium SP1 x64
　Ruby: 2.0.0-p481 64bit
　

参考サイトは[こちら](http://mn-memo.com/archives/894)

## 実装までに掛かった時間
8.5h

## 改修ポイント

・会員制サービスで使用することを想定し、認証情報はyamlファイルではなく、DBに格納したものを使う。
・ファイルを分離する。
　・Garb::Modelを拡張したクラスを記述するファイルは別のクラスファイルにまとめて書く。
　・期間設定を書いたハッシュはコントローラに書く。
　・元ファイルは、ユーザ認証した結果だけを返す。

## 実ファイル
app直下にservicesディレクトリを作成し、認証用クラスファイルと拡張クラスファイルを作成。
ユーザ情報を格納しているテーブルに紐づく既存のコントローラ(users)へ実データの取得コードを書いています。

```rb:analytics_service.rb
require 'rubygems'
require 'garb'
require 'uri'
require 'active_support/time'
require 'yaml'

# 認証クラス
class AnalyticsService
  def load_profile(user_data)

    # セッションログイン
    Garb::Session.login(
        user_data.analytics_email,
        user_data.analytics_password
    )

    # プロファイル情報の取得
      profile = Garb::Management::Profile.all.detect { |p|
        p.web_property_id == user_data.property_id
        p.id == user_data.profile_id
      }
  end
end
```

```rb:analytics_service_class.rb
require 'rubygems'
require 'garb'
require 'uri'
require 'active_support/time'
require 'yaml'

# 拡張クラス
class AnalyticsServiceClass

  class PageTitle
      extend Garb::Model
      metrics :pageviews
      dimensions :date
  end
end
```

```rb:users_controller.rb(一部抜粋)
                :
  def show 
    @user = User.find(params[:id])
    analytics = AnalyticsService.new
    ga_profile = analytics.load_profile(@user)
    cond = {
        :start_date => Time.parse("2012-12-05"),
        :end_date   => Time.parse('2013-01-05'),
        # :filters    => { :page_path.contains => '^/items/' }
    }
      @data = AnalyticsServiceClass::PageTitle.results(ga_profile, cond)
  end
                :
```

@dataへ格納したデータは、ビューの中で表示させています。

## エラー、バグ情報
json のバージョンが1.8.1 の状態でエラーが発生しました。

Garb::Management::Profile.all.detect メソッドを実行した際、以下のエラーが表示されます。

>
MultiJson::AdapterError (Did not recognize your adapter specification (193: %1 は有効な Win32 アプリケーションではありません。 - C:/Ruby200/lib/ruby/gems/2.0.0/gems/json-1.8.1/lib/json/ext/parser.so).):
app/services/analytics_service.rb:26:in load_profile' app/controllers/users_controller.rb:13:inshow'
>

直接の原因は不明ですが、google-api-client を使用して同じエラーが発生したので、どうやらAPI自体の不具合の可能性がしました。
そこで、json を 1.8.0 へ固定したところ、エラーは起きなくなりました。

Gemfileへ以下の記載を追加して、bundle update を実行しています。
`gem 'json', '1.8.0'`

## 感想
Railsは始めたばかりで経験も浅く、Ruby自体も大して経験がないのでクラスの設計はこれで良いのか？と自問自答しながら進めました。クラスを入れ子にするのが本当に良い方法なのか、未だわかっていませんし。
ただ、そういうことを調べながら進めて、出来なかったことが出来るようになるのは何とも言えず充実感があります。

また、このプログラムは **Perl**で書いたものをRailsに置き換えているつもりです。
バックグラウンド時のNSLogでクラッシュする


書き方が悪いのか、バックグラウンドで動作するアプリを書いていて、SIG_PIPEが発生し落ちる現象が。追いかけて行くとどうやらNSLogで落ちてるみたい。

いろいろ試行錯誤して、結果的にどうしたかというと、

    dispatch_async(dispatch_get_main_queue(), ^ {
                    NSLog(@"hogehoge");
                });

とメインスレッドで実行するようにしました。
capistrano3のtask内で別のtaskを呼ぶ方法

capistrano2系だと[find_and_execute_task](https://github.com/capistrano/capistrano/wiki/2.x-DSL-Configuration-Execution-Find-And-Execute-Task)ってのがあったんだけど、3系では無くなってた。
どうするのかなーと調べたところ、invokeを使えばいいらしい。

README.mdにも書いてあった...

```README.md
The final way to call out to other tasks is to simply `invoke()` them:

namespace :example do
  task :one do
    on roles(:all) { info "One" }
  end
  task :two do
    invoke "example:one"
    on roles(:all) { info "Two" }
  end
end
```
Mavericksにtheanoをインストールする


## はじめに

mavericksにtheanoを入れるときに色々とトラブったのでそのトラブルを共有しておく。注意点として、macにはnativeのpythonの他にも、MacPorts, Homebrew, AvtivePythonなどいろいろなpythonのディストリビューションが存在するため、ここで紹介する方法でうまく行くとは限らない。

ここでは、

* pyenvでインストールしたpython 2.7.5
* homebrew

を使って、theanoをインストールするまでを書く。以前にActivePythonも入れていたので、クリーンインストール環境ではなく、他にも影響を与える設定が残っている可能性があることもお断りとしておく。

## numpyのインストール

ここからのインストールはhomebrewを使う。インストールしていない人は以下のページを参考にインストールしてほしい。

* http://brew.sh/

ここで

```
$ brew tap samueljohn/python
$ brew update
$ brew install python
$ brew install numpy
```

と実行すると、gfortranのエラーでnumpyがインストールできないので、gccをアップデートする。

```
$ brew unlink gcc
$ brew install gcc
```

改めて、numpyのインストール

```
$ brew install numpy
```

今度はうまくインストールすることが出来た。

## scipyのインストール

まずは素直にインストールしてみる

```
$ brew install scipy
```

うまくいかないので、pipでインストール

```
$ pip install scipy
$ pip install —-upgrade scipy
```

なんかエラーっぽいメッセージもでたが、importできたので良しとして次に進む。

## Theanoのインストール

```
$ pip install Theano
$ pip install —-upgrade —no-deps Theano
```

何のエラーメッセージもなくインストールできた

```
$ python
> import theano
…..
Exception: Compilation failed ….
```

ところが試しにimportしてみると大量のエラーメッセージが、

* https://groups.google.com/forum/#!msg/theano-users/iNNxMqDIJjY/KSbvXlGOV9AJ
* https://github.com/Theano/Theano/issues/1650

上記を参考に~/.theanorcを生成し、以下の設定を付け加える。

```.theanorc
[gcc]
cxxflags=-march=corei7
```

もっかい、てすと。

```
$ python
> import theano
>
```

warningは出るが、なんとか動くようになった。以上、同一の症状に悩んでいる人がいたら、参考になるとうれしい。
anyenvでpython環境を整える


# はじめに

先週のランサーズのイベントでヌーラボの中村さんが、anyenvが今（あくまで今現在）一番安定しているスクリプトのバージョン管理ソフトっぽいと言っていたのでmavericksに導入してみる。


# anyenvのインストール

anyenvはgithubのサイトから引用すると

```
This is a simple wrapper for rbenv style environment managers. You don't have to git clone or modify your shell profile for each **env anymore if you install anyenv.
```

というもので、要はpyenv,rbenv,plenvなどを使っている人が**env環境をインストールするためのインストールツール。もう色々とあるので一括で管理できないの？というニーズから生まれてきたらしい。インストールはgithubからcloneしてくるだけ。

```
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
$ source ~/.bashrc
```

# pyenvのインストール

anyenvを使って、pyenvをインストールする。

```
$ anyenv install pyenv
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

# pythonのインストール

pyenvを使ってpythonのバージョン2.7.5をインストールする。

```
$ pyenv install 2.7.5
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

bash_profileに既に書き込んでいたら、省略しよう。

## virtualenvの導入

とりあえず、pipがpyenvのpipにちゃんとなっていることを確認して、virtualenvをインストールする。

```
$ which pip
{HOME}/.anyenv/envs/pyenv/shims/pip
$ pip install virtualenv
$ source ~/.bashrc
```

後は、virtualenvの環境に移行していろいろとやるだけ

```
$ virtualenv ~/.virtualenv
$ source ~/.virtualenv/bin/activate
(.virtualenv)$ pip install numpy …
```


## 注意

Macのpythonには、native以外にもmacportsで入ったもの、ActivePythonで入ったもの、homebrewで入ったものなどいろいろなものがあるため、導入前にアンインストールしておいた方が良いかもしれない。
goによるテキストファイル操作テンプレ（自分用）

git が何かとエスケープシーケンスを吐くんだけど、more とか nkf を通すと、Windows ではゴミになっちゃうので、それを除くフィルターを作った。

ノウハウというよりは、自分用のテンプレとして。
(Python とかでもいいんだけど、インストールしてない時もあるので)

```ansistrip.go
package main

import "bufio"
import "io"
import "os"
import "regexp"
import "fmt"

var ansiStrip = regexp.MustCompile("\x1B[^a-zA-Z]*[A-Za-z]")

func cat1(r io.Reader) {
	scanner := bufio.NewScanner(r)
	for scanner.Scan() {
		fmt.Println(ansiStrip.ReplaceAllString(scanner.Text(), ""))
	}
}

func main() {
	for _, arg1 := range os.Args[1:] {
		r, err := os.Open(arg1)
		if err != nil {
			fmt.Fprintln(os.Stderr, err.Error())
			return
		}
		cat1(r)
		r.Close()
	}
	if len(os.Args) <= 1 {
		cat1(os.Stdin)
	}
}
```

* 2014/07/22 コード差し替え
   * WriteString() を2回実行して、1行を出力していたのを、fmt.Fprintln を使うようにした
   * defer r.Close() を使うと、プログラム終了までファイルを握りっぱなしになるので、即 Close() するようにした。
   * 正規表現オブジェクトを素直にグローバルにした。
   * https://github.com/zetamatta/ansistrip にソースを登録
Table Decoratorを使って処理するレコード数を削減する

Google BigQueryはクエリで処理したデータ量だけ課金される。テーブルが大きくなれば大きくなるほど課金されてしまうのである。これではログを1つのテーブルに大量に挿入していると困ったことになってしまうように見える。

Google BigQueryでは、このような追記型のテーブルに対して、テーブルのサブセットを利用することで、クエリにかかるコストを削減できるTable Decoratorという機能がある。

- [Table Decorators - Google BigQuery - Google Developers](https://developers.google.com/bigquery/table-decorators)

この記事は上記記事の抄訳となる。

# Table Decoratorを利用する

通常、BigQueryにはクエリ実行時に全てのカラムをスキャンする。Table Decoratorを使用することで、データのサブセットに対し、費用効果の高いクエリを実行できる。Table Decoratorはコピー、エクスポート、リスト出力など、テーブルを読み込む全ての処理で使用できる。

Table Decoratorはms(ミリセカンド)単位で時刻を指定し、テーブルのサブセットを使用できる。時刻の指定には、現在時刻からの相対指定と、絶対指定ができる。例えば、`-3600000`は現在時刻より1時間前を示す。`3600000`はunix epoch(1970年1月1日0時0分)より1時間後を示す。


## Snapshot decorators

### Syntax

```
@<time>
```

`<time>`時点のテーブルのスナップショットを示す。`<time>`には、unix epochからの経過時刻をms(ミリセカンド)で指定する。`<time>`は過去7日以内かつ、テーブル作成時刻よりも大きくなければならない。@0は特別なケースで、最も古いテーブルのスナップショットを参照する。これは、7日前、もしくは、テーブルが作成されて7日以前であればテーブル作成時刻を示す。

### Examples

#### 相対指定の場合

1時間前のテーブルのスナップショットを取得する場合:

```
SELECT COUNT(*) FROM [data-sensing-lab:gartner.seattle@-3600000]
```

#### 絶対指定の場合

1時間前の時刻は次のクエリで取得できる:

```
SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -1, 'HOUR')/1000)
```

その後、次のクエリの<time>を置き換えて実行する:

```
SELECT COUNT(*) FROM [data-sensing-lab:gartner.seattle@<time>]
```

## Range decorators

### Syntax

```
@<time1>-<time2>
```

`<time1>`と`<time2>`の間に追加されたテーブルデータを参照する。`<time1>`、および`<time2>`はunix epochからのms(ミリセカンド)で指定する。`<time1>`と`<time2>`は過去7日以内でなければならない。`<time2>`は省略でき、省略した場合は現在時刻になる。

### Example

1時間前から30分前までに追加されたデータを取得する場合:

```
SELECT COUNT(*) FROM [data-sensing-lab:gartner.seattle@-3600000--1800000]
```

絶対値で指定する場合:

`<time1>`と`<time2>`は前述したクエリで取得できる。

```
SELECT COUNT(*) FROM [data-sensing-lab:gartner.seattle@<time1>-<time2>]
```
管理者権限ダイアログを出さずにpowershellスクリプトを管理者権限で実行

管理者権限昇格ダイアログを出さずにpowershellのスクリプトを実行させるのが、かなり手間がかかってしまったので忘れないよう手順をメモしておきます。

1.PowerShellを管理者権限で起動するbatファイルを作成
 test.bat:
　　@powershell -Command "Start-Process powershell.exe -ArgumentList c:\temp\test.ps1 -Verb runas"

2.タスクスケジューラーに上記のbatを起動するタスクを作成する。
　[全般－最上位の特権で実行する]にチェックを入れる

3.上記で作成したタスクを起動するbatファイルを作成
 trigger.bat:
　　schtasks.exe /run /tn test

4.trigger.batを起動する
　UACダイアログを出さずにPowerShellを起動することが可能

参考
　http://www.losttechnology.jp/Win7/taskscheduler.html
　http://scripting.cocolog-nifty.com/blog/2009/12/uac-ddfc.html
iOS+OpenCV: Chapter12 Processing Video

["OpenCV for iOS" book samples](https://github.com/Itseez/opencv_for_ios_book_samples)の *Chapter12 Processing Video* を実際に動かしてみました。

#準備
* [GitHub](https://github.com/Itseez/opencv_for_ios_book_samples)からソースを落としてくる。
* [OpenCV](http://opencv.org/downloads.html)をインストール。
 * プロジェクトには組み込まれているのでファイルをコピーするだけでOK。

```text
<tmp> -+- <Chapter12_ProcessingVideo>
       |
       +- <CvEffects>
       |
       +- <opencv2.framework>
```

#コンパイル
## warning

```objc
ViewController.m:58:1: Conflicting return type in implementation of 'supportedInterfaceOrientations': 'NSUInteger' (aka 'unsigned int') vs 'NSInteger' (aka 'int')
```

* ```NSInteger``` を ```NSUInteger``` に変更。

#問題点

##縦伸びしている
* ~~UIImageViewのcontentModeを設定したら直りそう？~~
 * ~~IB/コードのどちらで変更しても変化がありませんでした。ハテサテ？~~
* 解決しました。
 * [iOS+OpenCV: CvVideoCameraのアスペクト比を正しくする](http://qiita.com/fuzzball/items/039bf4fd47b82484734b)

## メモリリーク
* 放置しているとメモリ不足で落ちる。
 * RetroFilterがリークを起こしているようなので放置。

##Start時のメモリ確保がおかしい？
* Start/Stopを繰り返すとおかしくなる。
* [OpenCV iOS - Video Processing](http://qiita.com/fuzzball/items/e1eb3f38b3491740ee8c)と同じ症状。
* これ ~~か！と思ったけど、OpenCVでは```setupAVCapture```を使ってない~~ っぽい。
 * [AVFoundationを使ったカメラ機能はちゃんとメモリを開放しましょう](http://xoyip.hatenablog.com/entry/2013/12/21/205107)

##カメラが横を向く
* 端末を横にした状態でStartするとカメラが横を向く。
* [OpenCV iOS - Video Processing](http://qiita.com/fuzzball/items/e1eb3f38b3491740ee8c)と同じ症状。
VBScriptでフォントをインストールする

とりあえずメモ書き程度ですが残しておこうかと。

# 背景と問題
Windows7環境において、フォントを管理者権限なしでインストールさせたいという要望が事の発端。
マイクロソフトのスクリプトセンターに、[VBScriptでフォントをインストールするサンプルコード][link-1]はあったのですが、一部の環境で上手く動作しないことが発覚。
考えられる手は尽くしたものの解決出来なかったため、ネット上を彷徨っていたところ、[別の手段で実現しているサンプルコード][link-2]を発見！
試してみたところ、MSのサンプルコードでは上手くいかなかった環境でも問題無く動作できたので採用に至りました。
そのときのメモ書きです。

# サンプルコード
以下のVBScriptコードは、Cドライブ直下に置いてあるフォントファイル「fontfilename.ttf」を右クリックしてインストールする例です。

```vbnet
Dim objShell 
Dim objFolder
Dim objFolderItem 

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace("C:\")
Set objFolderItem = objFolder.ParseName("fontfilename.ttf")

objFolderItem.InvokeVerb("Install")
```
上記VBScriptを管理者権限で動かせば、フォントがインストールされます。



```
InvokeVerb("Install")
```
これがフォントを右クリックしたときに出るメニューの「インストール」に当たる部分。
応用すれば、xlsファイルを印刷したり、PDFを印刷したりも出来るようです。


# 詳細
この方法に限らずですが、管理者権限でスクリプトを動作させるための別の手段も必要です。
これについては、VB2005で解決させましたが、別の機会に…。

# 参考リンク

Hey, Scripting Guy! スクリプトを使用してフォントをインストールする方法はありますか
[http://gallery.technet.microsoft.com/scriptcenter/b5acfc13-3c7b-4168-b9c9-792e005304e6][link-1]
[link-1]:http://gallery.technet.microsoft.com/scriptcenter/b5acfc13-3c7b-4168-b9c9-792e005304e6

How do I install a font from the Windows command prompt?
[http://superuser.com/questions/201896/how-do-i-install-a-font-from-the-windows-command-prompt][link-2]
[link-2]:http://superuser.com/questions/201896/how-do-i-install-a-font-from-the-windows-command-prompt
Rakeタスク実行時、プロセス起動数を確認して排他制御する

例えばシェルでやるならこうだけど、rubyで完結させたい。
（シェルスクリプトからrakeを実行したらいいだけだけどメンドクサイ。）

```bash:do_something.sh
#!/bin/sh

# プロセス起動確認
isAlivePs=`ps -ef | grep "do_something" | grep -v grep | wc -l`
if [ $isAlivePs = 0 ]; then
  # プロセスが起動していなければ実行
  echo "DO SOMETHING"
else
  # プロセスが起動していた場合は終了
  echo `date` ALREDY RUNNING PROCESS
fi

exit 0
```

Rakeタスク内でのプロセス数確認する。

```rb:scheduler.rake
task :do_something => :environment do
  puts "[#{Time.now.strftime("%Y/%m/%d %H:%M:%S")}] Do something..."

  # プロセス起動確認
  is_alived_ps=`ps -ef | grep "do_something" | grep -v grep | wc -l`
  is_alived_ps_cnt = is_alived_ps.to_i

  # プロセス数 2以下の場合のみ実行
  if is_alived_ps_cnt<=2
    Rails.logger.info("Do something")
  else
    Rails.logger.info("Skip do something")
  end
end
```
Yeoman+AngularJSでモダンなフロントエンド開発

# Yeomanとは
LESS、Sass、compass、CoffeeScript、TypeScript等々、フロントエンドのWebアプリケーション技術は多様化しており、標準化された開発手法はなく今までは各々がツールを用いていた。
Yoemanはフロントエンド開発に有効なツールを組み合わせてモダンな開発フローを提供するツールセットである。
ようは今まで手動でやっていたGruntの設定などを自動で生成してくれる。

## Yeomanを構成するツール
- yo
  - アプリケーションの雛形を作成してくれる
  - BowerやGruntの設定
- Grunt
  - ビルド & テスト
- Bower
  - 必要なフロントエンドのライブラリの管理

# インストール 
### Nodeのインストール
[ここを見て](http://qiita.com/dribble13/items/e895208727c85ef9bc52)Nodeのインストールを行う。
一応Nodeのバージョンはv0.11.13で動作確認。
環境は```OS X 10.9.2```

```bash
nvm install v0.11.13
```

### Compassのインストール

```bash
sudo gem install compass
```

### yo Grunt Bowerのインストール

```bash
npm install -g  bower grunt-cli yo
```

### generator-angularのインストール

```bash
npm install -g generator-angular
mkdir sample-app && cd $_
yo angular [app-name]
# yo angular [app-name] --coffee Coffeeで開発したい場合こっち
```
後は下の画像のようにすべて回答はYesで

![yeoman.png](https://qiita-image-store.s3.amazonaws.com/671/42035/77daebb0-40cd-5082-9e5b-65dbecb4e0cd.png)

# ビルド & テスト
### ビルド
以下のコマンドを入力すると自動でブラウザが立ち上がり、下のページが表示される

```bash
grunt serve
```

![yeoman-sample.png](https://qiita-image-store.s3.amazonaws.com/671/42035/7d1d4e28-e1fd-8421-49d4-b761b3fced6b.png)

すでに以下の環境が整っているためすぐに開発することができる。

- LiveReload
- Sass(、Coffee)自動ビルド
- 自動テスト

### エラー修正
しかし自分の環境では以下のエラーが発生

```bash
Loading "cdnify.js" tasks...ERROR
>> Error: Unable to create git_template directory: Arguments to path.resolve must be strings

Running "serve" task

Running "clean:server" (clean) task
Cleaning .tmp...OK

Running "bowerInstall:app" (bowerInstall) task

Running "bowerInstall:sass" (bowerInstall) task

Running "concurrent:server" (concurrent) task
    
    Loading "cdnify.js" tasks...ERROR
    >> Error: Unable to create git_template directory: Arguments to path.resolve must be strings
    
    Running "compass:server" (compass) task
    directory .tmp/styles/ 
       create .tmp/styles/main.css (2.012s)
    Compilation took 2.027s
    
    Done, without errors.
    
...以下略
```

どうやらgrunt-google-cdnというのがエラーを吐いているみたい。
あと```grunt test```を実行した時もエラーを吐いていた。
エラーを解消するには以下のようにpackage.jsonを編集

```bash
diff --git a/package.json b/package.json
index 6c2d0b5..cd95d39 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,7 @@
     "grunt-contrib-jshint": "~0.7.1",
     "grunt-contrib-uglify": "~0.2.0",
     "grunt-contrib-watch": "~0.5.2",
-    "grunt-google-cdn": "~0.2.0",
+    "grunt-google-cdn": "~0.4.0",
     "grunt-karma": "^0.8.3",
     "grunt-newer": "~0.6.1",
     "grunt-ngmin": "~0.0.2",
@@ -27,6 +27,7 @@
     "grunt-usemin": "~2.0.0",
     "jshint-stylish": "~0.1.3",
     "karma": "^0.12.16",
+    "karma-jasmine": "~0.2.0",
     "karma-ng-html2js-preprocessor": "^0.1.0",
     "karma-ng-scenario": "^0.1.0",
     "load-grunt-tasks": "~0.4.0",
```

そのあとは変更したnpmモジュールを以下のコマンドでインストール

```bash
npm install
```

### リリースモードでビルド

```bash
grunt serve:dist
```

### テストのみ

```bash
grunt test
```
Storyboard でアニメーションを追加するライブラリ Canvas


--

#Canvas
___

## 概要


コードを書かずに Xcode 上で Storyboard 上のユーザー定義属性を編集するだけでアニメーションを付与できるライブラリ

- URL

 [http://canvaspod.io/](http://canvaspod.io/)


- CocoaPods

```Podfile
platform :ios, '7.0'
pod 'Canvas', '~> 0.1'

```

- License 

 MIT license 



## 使い方

UIView を使って、アニメーション内容を下図のようににセットする。
CustomClass を CSAnimationView にセットし、User Defined Runtime Attributes に要素を追加する。


- **type** : アニメーションの種類
- **delay** : アニメーション開始時間
- **duration** : アニメーション時間 



![capture.png](https://qiita-image-store.s3.amazonaws.com/0/15046/50910399-3375-5566-c471-1dfe1e7355b7.png "例 FadeInアニメーションの追加")


設定したアニメーションは、CSAnimationView:awakeFromNib 内で実行されるため、コード上でアニメーションを呼び出す場合には、
User Defined Runtime Attributes に pauseAnimationOnAwake をセットしてトリガーとなるイベントで CSAnimationView:startCanvasAnimation を呼び出すようにする。

```
@property (weak, nonatomic) IBOutlet CSAnimationView *AnimationView;


[self.AnimationView startCanvasAnimation];

```


既存の画面要素にアニメーションを追加したい場合、要素を選んでから、 Editor -> Embed in -> View を選ぶと、
適用させたい要素を子要素とする UIView が作成できるので、その UIView を CSAnimationView にし、アニメーションを設定していく。


また自作したアニメーションを追加したい場合は、以下のようにカテゴリを利用してCSAnimationを拡張する事で簡単に追加できる。
カテゴリ拡張とする事で、storyboard 上での設定は type を自作のtype名に設定すれば良い。


```CSAnimation+MyAnimation.h

#import "CSAnimation.h"

static CSAnimationType CSAnimationTypeMyAnimation      = @"MyAnimation"; // アニメーションタイプ名を追加

@interface CSAnimation (MyAnimation)
@end

```

```CSAnimation+MyAnimation.m

#import "CSAnimation+MyAnimation.h"

@implementation CSAnimation (MyAnimation)
@end

@interface MyAnimation : CSAnimation
@end

@implementation MyAnimation
+ (void)load {
    [self registerClass:self forAnimationType: CSAnimationTypeMyAnimation];
}

+ (void)performAnimationOnView:(UIView *)view duration:(NSTimeInterval)duration delay:(NSTimeInterval)delay {
    // Start
    view.transform = CGAffineTransformMakeScale(2, 2);
    view.alpha = 0;
    [UIView animateKeyframesWithDuration:duration delay:delay options:0 animations:^{
        // End
        view.transform = CGAffineTransformMakeScale(1, 1);
        view.alpha = 1;
    } completion:^(BOOL finished) {
    }];
}
@end

```


storyboard 上でアニメーションの実装が済むので、自作したアニメーションなど適宜追加して管理しておくと便利そう。
Canvas には他にも CustomFont などの機能があります。
Nokogiri on OSX


- osx mavericks
- brew環境
- nokogiri 1.6.2.1
- ruby 2.0.0p451
- XCode 5.1.1

libxml2 is missing.となり、nokogiriがインストールできない。

## Nokogiriのインストール

```Bash:shell
$ brew install libxml2 libxslt libiconv
```


```Bash:shell
$ brew link libxml2 --force
$ brew link libxslt --force
$ brew link libiconv --force
```


```Bash:shell
$ sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future NOKOGIRI_USE_SYSTEM_LIBRARIES=1 gem install nokogiri -- --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)" --with-xml2-config="$(brew --prefix libxml2)/bin/xml2-config" --with-xslt-config="$(brew --prefix libxslt)/bin/xslt-config"
```

## vagrant-omnibusを入れる場合

```Bash:shell
$ NOKOGIRI_USE_SYSTEM_LIBRARIES=1 vagrant plugin install vagrant-omnibus
```
ブラウザのスタート画面で使ったことあるものをまとめてみる

## ブラウザのスタート画面をまとめてみる


#### よく使うサービスがスタートページにデフォルトで集められてる。
[Jasoncarulli](http://jasoncarulli.com/s/)  

* サムネイル画像がRetina対応していてきれい
* 検索フォームがオシャレ！


　
#### TODOリストや今の時間がchromeのスタートページに表示される
ばきっとシンプルで写真もきれい。  
[Momentum](https://chrome.google.com/webstore/detail/momentum/laookkfknpbbblfpciffpaejjkokdgca?hl=en)

　　
#### ハッカーニュースとデザイナーニュースを一覧できる
[news.hdn.io](http://news.hdn.io/)

　
#### DribbleとDesigners newsが一覧できる
[GEISHA](http://geisha.io/)

私はコレを使っているよ！
　
#### アイコンを自分で探してくるのが面倒くさそう
[myfav](https://www.myfav.es/)

　
#### 天気と時間を表示してくれる。
[Currently](https://chrome.google.com/webstore/detail/currently/ojhmphdkpgbibohbnpbfiefkgieacjmh?hl=en)

　
#### 読み込みが遅い。
[Lookwork](http://lookwork.com/)
Rails4.0.x系からRails4.1.1にアップデートするときの簡単な手順メモと注意点

## リリースノートを読もう

http://edgeguides.rubyonrails.org/4_1_release_notes.html

## アップデート

とりあえずGamefileにRails 4.1.1と書いて`bundle install`して`rake rails:update`して変更点を全て上書きし、gitとの差分を見ながら上書きされてしまった自分が書いた設定を元に戻せば、だいたいアップデートできます。

`config/environments/staging.rb`など、増やした環境には変更が適応されないので注意が必要です。

## config/secrets.yml

`config/initializers/secret_token.rb`が`config/secrets.yml`へ移行されています。ですので`config/initializers/secret_token.rb`は削除します。

## config/initializers/cookies_serializer.rb

```rb
# Be sure to restart your server when you modify this file.

Rails.application.config.action_dispatch.cookies_serializer = :json
```

が追加されています。cookiesのserialize方法が変更になっており、すでにクッキーを発行しているユーザが居る場合はhybridにしないとJSON::ParserErrorが発生してしまうので注意が必要です。
Rails&Heroku / Gmailを使わないでユーザーに一斉メール送信する

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2093">元の記事はコチラ</a>
- - - - - - - - - - - 
Railsアプリからウェブサイトの登録ユーザー宛に、メールを送信する際に、Gmailを使ったらそっこうでアカウントをロックされたので、別の手段を取ることに。

<!-- extract -->

Gmailは、自分のログインしたことのない場所で、何者かがログインを試みようとすると警告を出してきます。よく海外を移動する身としては、毎回確認されてイラっとすることも。クレジットカード会社も同じようなことをやってますよね。
　　
で、今回はRailsアプリからGmail経由でメール送信しようと思ったんですが、Heroku（ヨーロッパリージョン）に乗っているので、ヨーロッパから大量の不正ログインがあったと判断され、強制的にパスワードのリセットを求められました。
Gmailの親切機能ですが、アプリで使うのは無理だ…ということで他の方法は…
　　
普通にHerokuのadd-onに選択肢がけっこうありますね。
　　
##Mandrill

あのMailChimpによって提供されているのは、Mandrillというadd-on。
12,000通/月まで無料です。
今のところ十分なので、これでいくことにしました。

自分のアプリにadd-onを追加すると、SMTPユーザーネームとSMTPパスワードが取得できるので、それを使って、Railsを設定。

config/environments/production.rb　　

```ruby

  # For Mandrill
  config.action_mailer.raise_delivery_errors = false
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address   => "smtp.mandrillapp.com",
    :port      => 587, 
    :enable_starttls_auto => true,
    :user_name => "appxxxxxxxxxx@heroku.com",
    :password  => "xxxxxxxxxxxxxxxxxxxxx", 
    :authentication => 'login', 
    :domain => 'heroku.com', 
  }

```

これでサクッとメールが送信できる。
controllerやmailerの処理は基本変えなくていいんですが、一点だけ、変更しないとメールが送られなかったので、メモ。

mailers/your_mailer.rb

```ruby

class YourMailer < ActionMailer::Base

  def my_mail(user)
    @user = user
    begin
      mail to: user.email,
           subject: "#{user.name}さん、こんにちは！",
           from: "xxxx@yourdomain.com"
    rescue => e
      puts "エラー : #{e.message}"
    end
  end
end

```

```from: "xxxx@yourdomain.com"``` を省略すると、メールが送られなかった。

　　
以上です。
開封率なんか自動で収集してくれるので、とても便利。

![Screen Shot 2014-05-28 at 1.36.35 PM](http://image.workabroad.jp/upload/2014/136/workabroad.jpg)



 → <a href="http://workabroad.jp/posts/2093">http://workabroad.jp/posts/2093</a>
実際の開発現場事例で見るアプリ開発でアニメーションやデザインのアプリを効率よく開発するためのTips

by @mixiappwchr

![usemovie.png](https://qiita-image-store.s3.amazonaws.com/0/37731/a0d605c7-a7bd-97d6-c120-c0c4b04e7c95.png)


という記事を書きました。

https://codeiq.jp/magazine/2014/05/10760/

現場での実際におこなったことの事例ですので参考までに。
vimの分割ウインドウのスクロールを同期させる


vimで画面分割しているときに、同期したいウインドウで

```
:set scrollbind
```

or 

```
:set scb
```

とすると、分割したウインドウのスクロールが同期される  

デフォルトだと縦スクロールしか同期されないので、横も同期させたいときは、

```
:set scrollopt=ver,hor,jump
```

などとする

スクロールの同期を解除するときは、

```
:set noscrollbind
```

or

```
:set noscb
```
sidekiqでのみSystemStackErrorが出る場合に考慮したいこと

sidekiqと通常の実行の違いはFiberを使っていることです。ですから、sidekiqで使っているコードを以下のコードに置き換えた時にもSystemStackErrorが出るなら、それはsidekiqの問題と言うよりFiberの制約です。

```rb
fiber = Fiber.new do
  # do something
end
fiber.resume
```

Fiberはおそらく、4KBしかstackがないのでメモリを大きく使う作業をした場合にSystemStackErrorが出ると推測します。

sidekiqのあるissueによるとTheredを立てるようにとのことでした。

```rb
class HardWorker
  include Sidekiq::Worker
  def perform(name, count)
    thread = Thread.new do
      # do something
    end    
  end
end
```

ただ、このままRails系でActiveRecodeを使うとConnection Poolに関して問題が出ます。

```rb
class HardWorker
  include Sidekiq::Worker
  def perform(name, count)
    thread = Thread.new do
      ActiveRecord::Base.connection_pool.with_connection do |connection|
        # do something
      end
    end    
  end
end
```

これで、sidekiqでメモリを喰うタスクを実行しても大丈夫かと思います。ただし、普通にメモリを使い切ると不安定になりますので、それに関しては別の対策が必要です。
Qt5最新環境のローカルディレクトリへのビルド・インストール手順

#はじめに
Fedoraでは、比較的新しいバージョンが使えますが、それでも最新を使いたいということでビルド、構築手順をまとめます。
Fedoraのインストール手順は省略します。

ここでは、システムワイドではなくローカルディレクトリ~/usrfs にインストールします。
ローカルにインストールすることで、パッケージマネージャからインストールしたQtやMesaとの両立が可能です。
とはいえ、ビルドに必要なパッケージを都度、ビルド・インストールするのは手間ですので、システムワイドにインストールします。

*gitの設定やProxyサーバの設定(必要があれば)は完了していることが前提です*

#ビルド環境準備
開発者用パッケージインストール
`$ sudo yum groupinstall "C Development Tools and Libraries" "Development Tools"`
$HOME/work以下で作業します。
`$ mkdir ~/work`
`$ cd ~/work`
環境変数を設定します。何度も設定するのは手間ですので、ファイルに書いておきます。
`$ vi local_env`
> \# 共通環境変数
> export USRFS=\$HOME/usrfs
> export WLD=\$USRFS
> export LD_LIBRARY_PATH=\$USRFS/lib
> export PKG_CONFIG_PATH=\$USRFS/lib/pkgconfig:\$USRFS/share/pkgconfig
> export ACLOCAL=”aclocal –I \$USRFS/share/aclocal”
> \# Qt用環境変数
> export QTVER=qt5
> export QTDIR=\$USRFS/\$QTVER
> export PATH=\$QTDIR/bin:\$PATH
> export LD_LIBRARY_PATH=\$QTDIR/lib/:\$LD_LIBRARY_PATH
> export PKG_CONFIG_PATH=\$QTDIR/lib/pkgconfig/:\$PKG_CONFIG_PATH
> export QT_PLUGIN_PATH=\$QTDIR/lib/plugins/

他に必要なフォルダも念のため作成しておきます。
`$ mkdir -p ~/usrfs`
`$ mkdir -p ~/usrfs/share/aclocal`

環境変数を適用します。
`$ source local_env`

#Mesaビルド
##必要パッケージのインストール
Qtで3Dアクセラレーションを効かせるためにMesa(最新のstable版)をclone、ビルドします。
まず、必要なパッケージのインストールです。
`$ sudo yum install xorg-x11-server-devel libudev-devel expat-devel`

##Mesaビルド
`$ cd ~/work`
`$ git clone http://anongit.freedesktop.org/git/mesa/mesa.git`
`$ cd mesa`
`$ git checkout mesa-10.1.4`
今回は、EGL PlatformsはX11 Backendのみでビルドします。
`$ ./autogen.sh --prefix=$WLD --with-gallium-drivers=svga --with-dri-drivers= --enable-gles1 --enable-gles2 --enable-gallium-egl --enable-gbm --enable-shared-glapi --disable-dri3 --with-egl-platforms=x11`
`$ make -j 4`
`$ make install`

#Qtビルド
##必要パッケージのインストール
QtのX11 platformを使用するために必要なパッケージをインストールします。
`$ sudo yum install libxcb libxcb-devel libXrender libXrender-devel xcb-util-wm xcb-util-wm-devel xcb-util xcb-util-devel xcb-util-image xcb-util-image-devel xcb-util-keysyms xcb-util-keysyms-devel`
##qtbaseビルド
`$ cd ~/work`
`$ mkdir qt`
`$ cd qt`
`$ git clone https://git.gitorious.org/qt/qtbase.git`
`$ cd qtbase`
`$ git checkout v5.3.0`
`$ ./configure -opengl es2 -confirm-license -opensource -debug -nomake examples -nomake tests -make libs --prefix=${QTDIR}`
`$ make`
`$ make install`

#Example実行
`$ cd ~/work/qt/qtbase/examples/widgets/graphicsview/collidingmice/`
`$ qmake`
`$ make`
`$ ./collidingmice`

###実行結果
![collidingmice.png](https://qiita-image-store.s3.amazonaws.com/0/43991/8c2ba9b6-928a-748e-064c-237355575ea5.png)


#環境
VMWare Player 6.0.2 build-1744117 + Fedora 19 32bit版

*※VMWare Player + Fedora20では、3Dアクセラレーションを有効にすると動作が不安定なので、Fedora19を使用しています*
Haskellの関数の動作チェック1

# 関数の使い方メモ

動作環境
GHCi, version 7.6.3

## head関数

```
Prelude> import Data.List
Prelude Data.List> head [1..10]
1
Prelude Data.List> head [1..]
1
Prelude Data.List> head []
*** Exception: Prelude.head: empty list
Prelude Data.List> head "abc"
'a'
Prelude Data.List> head ["abc"]
"abc"
```

## last関数

```
Prelude> import Data.List
Prelude Data.List> last [1..10]
10
Prelude Data.List> last [1..]
Interrupted.　　　　　　　　　　　　　　　　　　(処理中断)
Prelude Data.List> last []
*** Exception: Prelude.last: empty list
Prelude Data.List> last "abc"
'c'
Prelude Data.List> last ["abc"]
"abc"
```

## tail関数

```
Prelude Data.List> tail [1..10]
[2,3,4,5,6,7,8,9,10]
Prelude Data.List> tail [1..]
[1,2,3,4,5,Interrupted.　　　　　　　　　　　　(処理中断)
Prelude Data.List> tail "abc"
"bc"
Prelude Data.List> tail ["abc"]
[]
```

## init関数

```
Prelude Data.List> init [1..10]
[1,2,3,4,5,6,7,8,9]
Prelude Data.List> tail [1..]
[1,2,3,4,5,Interrupted.　　　　　　　　　　　　(処理中断)
Prelude Data.List> init []
*** Exception: Prelude.init: empty list
Prelude Data.List> init "abc"
"ab"
Prelude Data.List> init ["abc"]
[]
```

## null関数

```
Prelude Data.List> null [1..10]
False
Prelude Data.List> null [1..]
False
Prelude Data.List> null []
True
Prelude Data.List> null ""
True
Prelude Data.List> null "abc"
False
Prelude Data.List> null ["abc"]
False
```
WebFontの利用の仕方（流行りにそってイマニティ文字）

# 背景

[『ノーゲーム･ノーライフ』の“イマニティ”文字を再現した「GD-Imanitish-Script-OTF」](http://www.forest.impress.co.jp/docs/review/20140526_650213.html) という記事を見かけた。
そういえば今までにWebFontを利用したことが無かったなあと思い、練習がてらサンプルを書いてみた。

フォントファイルは http://www.hogera.com/pcb/font/imanitish.html からダウンロードしました。（現時点での最新、revision 7）

# 結果

表示できました。
![imanitish.png](https://qiita-image-store.s3.amazonaws.com/0/16350/1e5e5ee3-f7fa-69eb-f3ec-de8dd4f6952d.png)

予想以上に簡単だった。

コードはこんな感じ。頒布物に含まれる `GD-Imanitish-script_007.otf`と同じディレクトリにこのHTMLを置けば使える。


```sample.html
<!doctype html>
<meta charset="utf-8">
<title>イマニティ語サンプル</title>
<style>
  @font-face {
    font-family: 'Imanitish';
    src: url('GD-Imanitish-script_007.otf') format('opentype');
  }
  :lang(imanitish) {
    font-family: 'Imanitish';
  }
</style>
<p>「こんにちは」はイマニティ語でも<span lang="imanitish">KONNICHIWA</span>だそうだ。
```

# ライセンス

> ■制限事項＜使用許諾条件＞
> 
> （中略）
> 
> 3) このフォント自体の販売、譲渡、二次配布を禁止します。付随データ、変換データも同様です。
> 　このフォントをバンドルする場合は許可が必要です。
> 
> 4)本製品を開発者の許諾を得ることなく改変したり、またそれを公開することはできません。ただし、本フォントをテキスト入力に使用して作成した成果物については、それら各利用者にて活用することができます。

とあったので

- スクリーンショットを乗っける
    - 「成果物」にあたると思うのでOK
- 自サイトでWebFontとして利用する
    - 「二次配布」か「フォントをバンドル」のどちらに該当するのか微妙
    - いずれにせよ許可は必要（なのでその際に確認すればいいよね）

だと判断しました。あってるのかな？
PC-DOS2000のインストール手順

最近、PC-DOS2000をインストールする機会があったため、ノウハウを掲載しておきます。

世の中では Windows XPのサポート終了が話題になっている頃だと思いますが、MS-DOS(PC-DOS)はまだまだ現役です。
で、なにかの理由で DOS をインストールしなかればいけない、ってときにハマるポイントを一つ説明しておきます。ここでは PC-DOS2000のケースについて説明します。あと面倒なので、以下 DOS と略します。

急遽 DOS の環境を作らなくてはいけない、という場面に遭遇したとき、わざわざパソコンやHDDを新調する人は少ないと思います。手元にある古いパソコンやHDDを使ってインストールすると思います。そもそも、現在購入可能なパソコンにはFDDが搭載されていません。というかFDDの在庫争奪戦が始まってる状況ですね。
で、Windows なんかがインストールされているパソコンやHDDに DOS をインストールするケースが多いと思いますが、これがハマりの原因となります。
インストール用のFDD（セットアップディスク）を挿入してパソコンを起動し（BIOSの設定は自力でお願いします）、画面表示を確認しながらインストールを進めると 「空き容量が足りないためインストールできません」的なメッセージが表示されどうしてもインストールができないケースがあります。
リカバリ方法とか何も表示されないので、一般の人はここで大ハマりします。

このような状況に陥った場合は、F3キーで一旦インストーラを終了させます。
終了させるとDOSプロンプロが表示されます。
ここで、

```dos
fdisk [enter]
```

と入力して FDISK を起動し、HDDの領域を一旦解放しておきます。
この後、パソコンを再起動して、再びインストーラを起動すると、正常にインストールできるようになります。
独自パスワード認証でやってきたサービスがGoogle、Facebookのようなアカウントと連携する際の基本的な考え方

# 独自パスワードでやってきたサービスがGoogle、Facebookのようなアカウントと連携する際の基本的な考え方

今までメアド/パスワードで認証させてきたところが、確認済メアドを提供する外部アカウントを用いて登録/既存ユーザーのUXを改善させようと思った時の基本的な考え方を載せておく。

## 外部アカウントの使いどころ

ここでは新規アカウント登録機能や認証機能との連携を対象としている。
使う情報は以下の3点となる。

* ユーザー識別子
* 確認済メールアドレス
* プロフィール情報

### ユーザー識別子

* 自社のユーザー識別子と組み合わせて管理する
* 実際に行われる処理
 * 新規登録時 : 紐づいている自社のアカウントが存在しないことを確認する
 * 既存のアカウントとの連携時 : 紐づいている自社のアカウントが存在しないことを確認する
 * ログイン時 : 紐づいている自社のアカウントが存在することを確認する

### 確認済メールアドレス

* 既存機能で手動のメールアドレス確認を行っている場合、確認済メールアドレスを取得することでその確認処理をスキップできることもある
* 確認済メールアドレスにも厳密には2種類あるかもしれない
 * 手動で確認されたメールアドレス : Facebookのログインメールアドレス、実はmixiもログインメールアドレスを提供している
 * サービス提供のメールアドレス : GoogleのGmailアドレスのようなもの
* 使い方はサービスのポリシーによるところが多いので、そこはよしなに扱う
 * ログインメールアドレスとして使っているので、ユーザーに対して一意なものとして扱う
 * 確認済の連絡先として、１ユーザーに対して複数の確認済メアドが登録可能、重複を許す などもあるだろう
* 実際に行われる処理(上述のとおり、柔軟な使い方があるのであくまで一般例)
 * 新規登録時 : 手動のメールアドレス確認をスキップする。ユニーク制約の有無によって細かいところは変わる
 * 既存のアカウントとの連携時 : 基本的には利用しなくて良さそう。複数の確認済メアドを所持するときは、このタイミングで確認済メアドのリストに加えても良いかも
 * ログイン時 : 利用しなくて良いのでは

### プロフィール情報

* プロフィール情報を登録させる場合は、初期値や入力フォームの補完に利用する
* 値が返ってこない可能性も考える
 * 必ず取得できる情報とそうでないものもあるので、値がとれずにエラーになることは避けるようにする
* 実際に行われる処理
 * 新規登録時
  * 全ての必要な情報が取得できる場合(ニックネームと画像程度)、デフォルト値として利用して登録を完了させても良さそう
  * 足りない情報がある場合や公開される情報が多い場合など、入力フォームの互換的に使うのが良さそう

## パスワードの撤廃

外部アカウントの利用によって既存のパスワードの利用を全て撤廃できるかというのは難しいところである。
ログイン状態であれば基本的に全ての機能をノンストップで利用できるようなサービスの場合は、問題ないだろう。
問題になるのは、課金などのセンシティブな処理の前にパスワード確認をしているようなサービスである。

理想としては、連携している外部アカウントが下記の項目を満たすことが重要になると考える。

* いつログインしたかがわかる
* どのような認証方式でログインしたかがわかる
* 利用するサービス側から再認証を要求できる

Googleで5分以内にログイン済のユーザーがいた場合、それは本人とみなしてもよいかもしれない。
ソフトウェアトークンによる多要素認証を利用したユーザーとそうではないユーザーでは処理を変えてもよいかもしれない。
利用する側から再認証を要求できれば、重要な処理の前にGoogleに戻り再認証をさせて処理を続けることができるかもしれない。
しかし、Googleは現在そのような値を提供していない。

これらの機能が提供されない場合は、(個人的には非常に不本意ではあるが)独自パスワードを残して課金前などに確認させるという実装になってしまうことがあるかもしれない。

## 実装

OAuthとかの話になるのでまた別の機会に。
DeployGateに待望の「グループ機能」が追加されたので使ってみた

DeployGateに、以前から要望の多かったグループ機能が追加されました。
これにより、グループやチームといった概念を使って配布する人の管理や適切な権限付与が可能になりました。
[利用にはベータプログラムの登録が必要になります](https://deploygate.com/beta_program)。
早速使ってみましょう。

# 概念
![概念.png](https://qiita-image-store.s3.amazonaws.com/0/8748/9060c51a-7da8-10a6-d574-dab7e8a24dce.png)

グループ機能を簡単に表すと、上の図のようになります。
グループを作成すると、そのグループに紐づく形でアプリ、チーム、メンバーを作成できます。
チームにはメンバーを所属させることができ、チーム単位で権限を付与することができます。
チームには3つの種類があります。

| 種類 | 権限 |
|:-----:|:----|
| 管理者 | アプリの受け取り、グループ削除以外のメンバー管理、アプリの新規アップロード、更新など |
| 開発者 | アプリの受け取り、アプリの更新アップロード |
| テスター | アプリの受け取りのみ |

# グループを作成する

画面右上のユーザー名をクリックすると現れるメニューから、グループを選択します。

![スクリーンショット 2014-05-26 11.23.46.png](https://qiita-image-store.s3.amazonaws.com/0/8748/6c5fd36f-5534-61f3-f2c5-eef1814568e0.png)

グループ画面が表示されます。
新規作成ボタンを押して、新しいグループを作成します。

![グループ.png](https://qiita-image-store.s3.amazonaws.com/0/8748/70f0b96a-4584-70ca-359c-9d9cd06a3ffe.png)



グループ名と説明を入力して作成するボタンを押します。
グループ名はアルファベットのみ利用可能で28文字以内です。

![ミコシィ.png](https://qiita-image-store.s3.amazonaws.com/0/8748/3ba65663-1e2e-ce96-7e0c-97a851560a84.png)

新しいグループが作成されました！

![スクリーンショット 2014-05-28 12.22.47.png](https://qiita-image-store.s3.amazonaws.com/0/8748/e80ce1ee-5d3f-a2e0-f610-f50085fd9c96.png)

# アプリのアップロード
アプリケーション欄のアップロードボタンから、アプリをアップロードします。
アップロードするアプリの作り方は[こちら](http://qiita.com/k_kinukawa/items/8718aba35060cf838ffa)を参考にしてください。

# チームを作成する
チームを追加ボタンから、チーム作成フォームを開きます。
チーム名とチームの説明を入力してください。
チーム名は3文字以上の長さが必要です。
また、「管理者」「開発者」「テスター」の中から、チームに付与する権限を選択してください。
全て入力してから追加ボタンを押すと、チームが作成されます。

![スクリーンショット 2014-05-26 19.03.29.png](https://qiita-image-store.s3.amazonaws.com/0/8748/fbf89995-af65-5160-f3f5-d2f4827add85.png)

# グループにメンバーを追加
画面右下メンバー欄の「グループにメンバーを追加」ボタンから、メンバーを追加します。
追加したい人のDeployGateのユーザー名を入力してください。

# チームにメンバーを追加/チームにアプリを登録
チーム欄にある、メンバーを追加したいチーム名をクリックしチーム詳細画面へ遷移します。

![スクリーンショット 2014-05-26 19.15.51.png](https://qiita-image-store.s3.amazonaws.com/0/8748/34041130-d6d3-28e5-36de-0029de942855.png)

ユーザー選択プルダウンがあるので、チームに所属させたいメンバーを選択します。
また、このチームが関連付けされるアプリもこの画面から登録することができます。

# ひと通り設定をしてみた

![スクリーンショット 2014-05-28 12.28.00.png](https://qiita-image-store.s3.amazonaws.com/0/8748/795d8037-9797-bec7-ef7a-6dd3fedf564c.png)

上の画像は、グループに

- アプリを1つ追加
- メンバーを2名追加
- チームを2つ作成

した時の様子です。
QAチームには2名、エンジニアチームには1名のメンバーが所属してします。
QAチーム、エンジニアチームにはsdkSampleアプリが登録してあるので、各チームメンバーはsdkSampleアプリが配布されるようになります。

![スクリーンショット 2014-05-28 12.28.36.png](https://qiita-image-store.s3.amazonaws.com/0/8748/fcfdc557-1293-3601-e24b-3d8558c384b3.png)

アプリ詳細画面では、登録済みのチーム一覧が右側にリスト表示されます。

# まとめ

グループ機能を使えば、組織単位、更に組織に所属するチーム単位で配信先の管理やアプリに対する権限の付与が可能になります。
グループ機能を活用し、より快適なアプリ開発環境の構築をしましょう！
ストックした投稿検索をChromeのアドレスバーで実行

#登録URL
「検索エンジンの管理」 chrome://settings/searchEngines で

```
http://qiita.com/search?stocked=1&q=%s
```
キーワードは`q`でも`qi`でも`qii`でも適当にしてください（わたしは`qi`にしています）。
名前も「Qiitaストック」とか適当に。
#タグで絞った検索
この検索は全文検索です。そのため、自分がストックした投稿 **全て** を対象として検索が行われます。単純な検索ワードだと検索結果が多くなることもしばしばです。
せっかくタグがあるのですから、タグで絞った検索をして、探し求めているストックを早く見つけましょう。
例えば`Ruby`タグに絞った検索をする場合には

* キーワード`qi`スペースで検索エンジン表示を出してから`tag:ruby <検索ワード>`

のように、`<検索ワード>`に加えて`tag:ruby`を入れましょう。
ただし`tag:`のあとに空白を入れると、タグで絞られずに`ruby <検索ワード>`で検索されてしまうので注意しましょう。

#補足1：登録するURLについて
検索後のURLを元にして登録するならば

```
http://qiita.com/search?utf8=%E2%9C%93&sort=&q=%s&stocked=1
```

なのですが、`utf8=%E2%9C%93`（`utf8=✓`）と`sort=`は無くても問題ないと思われます（コメント欄でご指摘求む）。Windowsだと`utf8=✓`が必要なのかしら。
<del>というか、`sort`の機能を知りたい（検索結果の順序の意味が分からない…）。</del>
また、この投稿の意味からズレてしまいますが、`stocked=1`を無くすとストックに限られず、全投稿からの検索になります。
##追記：`sort`の値で検索順を変える
[Qiitaの検索結果をストック数順に表示する - Qiita](http://qiita.com/yubiquita/items/f017fb7c1394bd05c990)
に幾つか載ってました。

* `sort=stock`：ストック数の多い順
* `sort=created`：投稿日の新着順

#補足2：登録方法
「検索エンジンの管理」で新たに全て書き込むのは面倒なので、Qiitaの検索部分で`✓ ストックした投稿を検索`になっているのを確認した上で右クリックし、「検索エンジンとして追加…」で表示されるダイアログ

![ダイアログ](https://qiita-image-store.s3.amazonaws.com/0/19597/f26d032c-5100-453a-c180-fad84b1283ef.png "ダイアログ")

で項目を追加しておいてからchrome://settings/searchEnginesで改めて修正するのが楽ではないかと思います。
Youtubeリピート再生(スリープ機能付)


そんなChrome拡張を作りました。

※ 5/29追記:
ガイドライン遵守に問題があると、Chromeから怒られたので修正しました。

アプリ名について、Googleのサービスに関するものには、
"for" や "with" と、"™" をつけないといけないようです。ex: 'for YouTube™'

**looptimer for YouTube™**

- Chromeストア
https://chrome.google.com/webstore/detail/looptimer-for-youtube/ppkngaopjbflnckgfbppljnbmgjejedm

- リポジトリ
https://github.com/tgfjt/youtubelooptimer



## 目的
- 1つのYoutubeの動画をずっとリピートで再生する。
- リピートさせるかどうかは毎回手動で選ぶ。
- 分単位で再生終了させられる。


## 背景
「この曲（動画）をしばらくずっと聞いていたい！」みたいな感情があることがあります。
昔はずっとリピートするボタンみたいなのがあったような気もするのですが、
どうも今は無い（元から？）ようなので、とりあえず作ることにしました。

まぁ同じ機能は数多のサービスやプラグインであるのですが、「入れたら絶対オートリプレイ」だったりしますし、タイマー機能は無いっぽかったのです。

「延々とリピートさせて気を良くして、聞きながらベッドでマンガ読んでたらそのまま寝てしまって、夢現のまま延々と同じ曲聞いてしまって起きちゃう…」
みたいなことがないように、◯◯分後に終了させるオプションを可能にしました。

当初付けていたプラグイン名と、まんま同じ名前のプラグインがあったので、変更したのですが、ものすごく微妙な感じの名前になってしまいました。


YeomanのChrome拡張用のジェネレーターがあったので使いました。
初期構築も、リリース用のビルドも楽ちんでした。
[generator-chrome-extension
](https://github.com/yeoman/generator-chrome-extension)

ChromeのAPIの使い方を覚えてないのでそのへんは時間かかりました。


## 残る課題
- アイコンがとても適当
- 名前も適当
- Macでしか確認していない
- テストコードの存在に意味が無い
	- ジェネレーターが生成したまま放置している


## どうでも良いこと
スクリーンショット用に撮影した動画は、絶対にリピート再生しないであろう再生時間となっております。
【Cake】名称の規約

良く忘れるのでメモ

###テーブル
複数形でアンダースコア
例）
people 、 big_people 、 really_big_people

###モデル
単数形でキャメル記法
例）
Person、BigPerson、ReallyBigPerson

自分の場合、単数形と複数形の変換はわかりづらいので、フィールドにモデル名とテーブル名を定義している。
※これは問題を隠すだけなので良くないのかもしれない。

```php:
$name = 'MlList';//モデル名
$useTable= 'ml_lists';//使用するテーブル
```

###コントローラ
複数形でキャメル記法で、最後に Controllerが付く
例）
PeopleController、BigPeople、Controller


参考：http://book.cakephp.org/2.0/ja/getting-started/cakephp-conventions.html
[Rails 4.x][Bootstrap] Rails 4.x で Bootswatch を使う方法

# 前置き

製作中の Webサイト を、とりあえずいい感じのレイアウトにして、完成形のイメージ（や目の保養）にする為に、よく Bootstrap が使われています。
Bootswatch は Bootstrap のテーマで、やっぱりいい感じのレイアウトがまとまっています。

http://bootswatch.com/

![Screen Shot 2014-05-28 at 11.34.34.png](https://qiita-image-store.s3.amazonaws.com/0/18705/42cddcd5-3e32-87ff-beb6-7adc8bb1f4c1.png)

![Screen Shot 2014-05-28 at 11.35.03.png](https://qiita-image-store.s3.amazonaws.com/0/18705/5f2217eb-d029-6fc2-2764-3d3cf15f1a76.png)

この中のテーマの1つを Rails 4 で利用する方法をメモします。

# Gemfile

```rb
gem 'twitter-bootswatch-rails', '~> 3.1.1'
gem 'twitter-bootswatch-rails-helpers'
gem 'execjs'
gem 'less-rails'
```

# インストール

テーマを適応させます。
今回は lumen というテーマを選択しました。
テーマに関しては[こちら](http://bootswatch.com/)から自由に選べます。

```shell-session
rails g bootswatch:install lumen
rails g bootswatch:import lumen
rails g bootswatch:layout lumen
```

# Stylesheet

application.css を編集します。
lumen のところは選択したテーマ名を入力。

```css:app/assets/stylesheet/application.css
/*
 *= require_self
 *= require lumen/loader
 *= require lumne/bootswatch
*/
```

# Javascript

application.js を編集します。
lumen のところは選択したテーマ名を入力。

```js:app/assets/javascript/application.js
//= require jquery
//= require jquery_ujs
//= require lumen/loader
//= require lumen/bootswatch
```

# 使い方

以上で使えるようになると思います。
使い方としては、bootswatchのサイトから、各テーマのページに移って、そこに記載してあるパーツひとつひとつにマウスオーバーすると、コードが表示されるようになるので、それを利用したらいいかと思います。

![Screen Shot 2014-05-28 at 11.50.59.png](https://qiita-image-store.s3.amazonaws.com/0/18705/0892c312-0db1-5a43-ac6a-d3eda0fe0b4a.png)

![Screen Shot 2014-05-28 at 11.51.07.png](https://qiita-image-store.s3.amazonaws.com/0/18705/c1ee6e7f-3d00-fd43-16b3-27b111e7b48f.png)

# 詳細

その他、設定に関する詳細は、以下を見るといいかと思います。
https://github.com/scottvrosenthal/twitter-bootswatch-rails


# 参考

[Bootswatch ドキュメント](https://github.com/scottvrosenthal/twitter-bootswatch-rails)
[Bootswatch サイト](http://bootswatch.com/)
[Bootstrap/BootswatchをRails 4.1に導入！|酒と泪とRubyとRailsと]
(http://morizyun.github.io/blog/bootswatch-rails-setup/)
[bootswatchをRailsで使う | Qiita](http://qiita.com/kimihito_/items/7c04f02103e2fb3c1763)