OmniAICreator/Qiita-1.07M huggingface dataset:
S3のデータをTreasuredataに定期的に転送 (data-connector)

ディレクトリとスケジュールを登録しとけば定期的にインポートしてくれるらしいので公式を見ながら設定した

### seed.yml を用意

```
in:
  type: s3
  access_key_id: XXXXXXXXXX
  secret_access_key: YYYYYYYYYY
  bucket: sample_bucket
  # path to the *.json or *.csv or *.tsv file on your s3 bucket
  path_prefix: path/to/sample_file
out:
  mode: append    
```

### load.yml を用意

テンプレートを作成

`td connector:guess seed.yml -o load.yml`

load.ymlが出力される

```
in:
  type: s3
  access_key_id: XXXXXXXXXX
  secret_access_key: YYYYYYYYYY
  bucket: sample_bucket
  path_prefix: path/to/sample_file
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: ''
    skip_header_lines: 1
    columns:
    - name: id
      type: long
    - name: company
      type: string
    - name: customer
      type: string
    - name: created_at
      type: timestamp
      format: '%Y-%m-%d %H:%M:%S'
out:
  mode: append
```

プレビュー

`td connector:preview load.yml`

### スケジュールジョブを登録

```
td connector:create schedule_import "*/10 * * * *" \
  tsuru_analyzer data_connector_test load.yml \
  --time-column time
```

### スケジュール確認
`td connector:list`

```
+-----------------+--------------+----------+-------+----------------+---------------------+
| Name            | Cron         | Timezone | Delay | Database       | Table               |
+-----------------+--------------+----------+-------+----------------+---------------------+
| schedule_import | */10 * * * * | UTC      | 0     | tsuru_analyzer | data_connector_test |
+-----------------+--------------+----------+-------+----------------+---------------------+
```

### 実行ログ確認

`td connector:history schedule_import`

```
+-----------+---------+---------+----------------+---------------------+----------+-----------------------+----------+
| JobID     | Status  | Records | Database       | Table               | Priority | Started               | Duration |
+-----------+---------+---------+----------------+---------------------+----------+-----------------------+----------+
| 108792166 | success | 0       | tsuru_analyzer | data_connector_test | 0        | 2016-12-14 11:49:1... | 9        |
| 108791473 | success | 23      | tsuru_analyzer | data_connector_test | 0        | 2016-12-14 11:42:3... | 9        |
| 108789810 | success | 2225228 | tsuru_analyzer | data_connector_test | 0        | 2016-12-14 11:29:2... | 792      |
+-----------+---------+---------+----------------+---------------------+----------+-----------------------+----------+
```


最後にテーブルを確認し、実際にインポートされていることが確認できたので終了


追記：
Jsonのマッピングを行う場合はこちらを参照

https://docs.treasuredata.com/articles/data-connector-expand-json-filter
Aipo8のカレンダーをiPhoneのカレンダーに追加する

> Aipo ver.8
> iOS 10.0.2

```
1. Tap Settings
2. Tap Calendar
3. Tap Accounts
4. Tap Add Account
5. Tap Other
6. Tap Add Subscribed Calendar
7. Enter Server: URL, User Name: aipo account name, Password: password
8. Tap Next
9. Tap Save

The added calendar appears on the calendar list in the Calendar app
```

こちらからは以上です。
エンジニアはじめてServer sideもClient sideもやってみた


はじめまして。サーバーサイドエンジニア&フロントエンドエンジニアの澤井です。[FiNC Developer Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fincdevelopers)12日目を担当します。
今年の4月からサーバーサイドエンジニアを始めてちょっと半年ぐらいやった後、フロント側を強化するということで、フロントエンジニアも始めてみまして、まだまだ圧倒的に色々駆け出しなんですが、その中で思ったことを書いてみました。

## 実装前段階の違い

サーバーもクライアントも実装前に設計について考えます。どちらも設計段階ではインターフェースの境界を設計するので、モデルやデータの実態を定義するレイヤと、その表示の仕方を定義するレイヤを設計します。

サーバーサイドだと

- データベース（Model）
- エンドポイント
- APIレスポンス（Viewに相当）

の設計をするし、

フロントは

- エンティティ（Data, Model）
- UIコンポーネント（View）
- ルーティング

の設計があります。

（明確にどういう設計がクライアントとしてレビューしやすい形かというのは、個人的にすごく模索しています。[クリーンアーキテクチャ](http://blog.tai2.net/the_clean_architecture.html)みたいな考え方などもあったりして、結局各プロジェクトのアーキテクチャにもよるんじゃないかと思っています。すごく他の人の意見が聞きたい。）

最近APIの作成でも、リソース指向が強まってきて、ActiveModel Serializerが導入されたりしています。ここはクライアントもサーバーも同じリソースをAPI,Entityとしてやりとりしている部分なのでお互い齟齬なく書けるとすごく便利だなと感じています。

クライアントだとその他にもチームリソースを確保する必要があり、

- デザインリソース
- テキストリソース

の確保も必要です。[この辺の記事](https://medium.com/web-development-zone/where-to-start-as-a-front-end-web-developer-cb7123bc84bb#.fdvvz8ips)にも、”Be The Middleman"って書かれていますね。

## デザインはSketchを共有するよりも意味を共有したい
デザインを正確に反映するのが、フロントエンジニアとして大事なわけですが、その際にスケッチとかで共有されたデザインをコードに落とし込む際には、デザインの理解が問われる気がします。
デザインをコードに落とし込むときも、マージンが8pxだったとして、それはどういう意味なのかが理解できてる方が、意味のあるコードが書けメンテナンス性もあがるなと感じます。「これはline-heightの半分だから8pxだよね。」とわかってコードを書くのか、とりあえず8pxとハードコードしたのかの差は大きいと思います。

## It's all about UI
最終的にユーザーに見せる部分なので、UIが全てだなと感じます。それは、フロント側の責務（非同期処理や、フォームの見せ方などをいかにユーザーが慣れ親しんだ形で見せるか）もあれば、サーバー側（キャッシュしたりサーバー側のパフォーマンスをどうするか）みたいな話もあって、これからもっと勉強していきたいなと感じている部分です。


## 両方できて良いこと
**処理が全部自分で追える。**
これに尽きるかなという感じです。だいたいの問題はインターフェイスの境界で起きるとは昔から言われていることですが、インタフェースのどっち側が問題の責務を負っているかを自分で追えるようになります。

問題が起きた際にそれはサーバー側かクライアントなのかを、エラーメッセージやHTTPステータスコードから分析できますし、パラメータがどう処理されているかも自分で読めばわかることもあるので、開発中とかで多少ドキュメントが曖昧でもなんとかなる確率が高いです。

エンジニア初めたばかりのインターン生とかにありがちなのが、APIのレスポンス自体を確認せずにサーバーがおかしいと騒いだりなんてことがあるんですが、そういうことせずに落ち着いて対応できたりします。

また、APIのリソース指向の重要性の理解度が高まった気がします。永続化されているDBからJSONなどのインターフェースを経て、クライアント側にデータが渡り、クライアントはそれをパースしたりしてビューに表示するのですが、それがすごく自分でもイメージしやすくなったなと感じます。

## 最後に
サーバーもフロントも両方やるといろいろと気付けることも多いです。社内にはiOS, Androidのクライアントメンバーもいて、同じクライアントサイドとして相談できることもあります。今かけることをポエムってっみましたが、3ヶ月後ぐらいにはもう少しレベルの高い文書を書きたいと思っています。
tar 文件名乱码

use chardet detect file name encoding

python2

```python
import chardet
chardet.detect("\311\372\311\372\312\300\312\300\260\256") # => {'confidence': 0.99, 'encoding': 'GB2312'}
```

python3

```python
import chardet
chardet.detect(b"\311\372\311\372\312\300\312\300\260\256") # => {'confidence': 0.99, 'encoding': 'GB2312'}
```

then use convmv convert file name encoding

convmv -f gbk -t utf8 -r dir_path

or

convmv -f gb2312 -t utf8 -r dir_path

use convmv --list list all encoding

http://linux-wiki.cn/wiki/%E4%B8%AD%E6%96%87%E6%96%87%E4%BB%B6%E5%90%8D%E4%B9%B1%E7%A0%81%E9%97%AE%E9%A2%98#.E5.A4.84.E7.90.86zip.E6.96.87.E4.BB.B6.E4.B9.B1.E7.A0.81

chardet is very powerful

python3 use chardet detect file content encoding

```python
import chardet
chardet.detect(open("01.flac",'rb').read(100)) # => {'encoding': 'windows-1253', 'confidence': 0.8902671920769272}

```
SQLでcsv形式のカラムを利用して検索(SELECT)かけたいとき

テーブルにCSV形式のカラムを作ってしまって、検索どうしよう...ってなったのでどうしたかをメモ。

正規表現は遅くなるかな、と思って LIKE でやる方法を見つけた。

```
select * from table where concat(',', column, ',') like '%,1,%'
```

先頭と末尾にカンマをくっつけてから `%,3,%` みたいな感じでLIKEすると検索できるっぽい(ググって見つけました)。

これでも相当無理やり感あるので、そもそも検索対象のカラムなのにCSV形式いしてしまうのが間違いかな。

と、思ったらMySQLには便利な関数があるそうで、以下の関数を使えば解決です。

```
select * from table where find_in_set('1',column);
```

パフォーマンスに関しても今後調査してみようと思います。
箱(変数)の中身はなんだろう？

##変数とは？

扱われるデータを一定期間記憶し必要なときに利用できるようにするために、データに固有の名前を与えたものです。
値の入れ物で、高校数学などのｘやｙを変数とほぼ同じ意味です。

##データ型の種類
Java言語で使われるデータ型は、大きく２つに分かれます。
>基本データ型：古くからある伝統的な型
参照型：オブジェクトの概念に基づく型

![スクリーンショット (16).png](https://qiita-image-store.s3.amazonaws.com/0/146678/d0ac1245-fa8f-9cc8-309e-1a0a145f9159.png)

今回は基本データ型は整数型の"int"と参照型はクラス型の"String"を使用して説明を行います。


##変数の説明に入る前に覚えてほしい用語
リテラル：具体的な値のことを示します。
>数値で言うなら「1,2,3,4,5,…」
文字で言うなら「'あ' 'い' 'う' 'え' 'お'…」


##変数を使う前に
###変数は使う前に型と名前を宣言する必要があります。これを「変数宣言」と言います。

```java
int number; //intが型でnumberが名前になります

String mojiretu;    //Stringが型でmojiretuが名前になります
```

###次に宣言した変数に値を入れることを「代入」と言います。

>「等号（＝）」の働き
・「＝」は、右辺の計算結果を左辺に代入するという意味です
・変数(左辺) ＝ 値や式(右辺)という形式で使う

```java
mojiretu = "HelloJavaWorld！";  //文字列や文字を代入する時は「""(ダブルコーテーション)」で括りましょう

number = 5; //numberに5を代入

System.out.println(mojiretu);   //mojiretuの中身を表示
System.out.println(number); //numberの中身を表示
```


一連の流れを図解してみました。
![スクリーンショット (23).png](https://qiita-image-store.s3.amazonaws.com/0/146678/3a1a1756-868c-02f4-10e6-6e6618cdbd7b.png)


変数に初めて値を代入する事を「初期化」といい、
宣言と同時に値を代入することを「宣言時の初期化」といいます。

```java
int number2 = 20;
```


##今までの動作を確認するプロジェクトを作成します。
eclipseは今回使用しません

```text:プロジェクトはこんな感じ
Variable/
    ├──Variable.java
```


```java:Variable.java
public class Variable{

	public static void main(String[] args){
		
		int number; //intが型でnumberが名前になります
		String mojiretu;    //Stringが型でmojiretuが名前になります

		mojiretu = "HelloJavaWorld！";  //文字列や文字を代入する時は「""(ダブルコーテーション)」で括りましょう
		number = 5; //numberに5を代入

		System.out.println(mojiretu);   //mojiretuの中身を表示
		System.out.println(number); //numberの中身を表示

		int number2 = 20;
	}
}

```


今回javacでコンパイルする際に日本語が含まれているため文字コードのコマンドを使いますが、気にしなくて大丈夫です。

```bat
javac -encoding UTF-8 Variable.java
```

実行するとこのようになります。
![スクリーンショット (18).png](https://qiita-image-store.s3.amazonaws.com/0/146678/0719dc62-0f91-e4d8-c08c-a136c20cf29a.png)


##あとがき
変数の型について今回は'int'と'String'しか使いませんでしたが、特に基本データ型で数値を扱う型は使う頻度が高いので調べておくと良いと思います。
スクリーンショット拡張Macアプリ「Fuwari」を作って公開しました

[株式会社LITALICO](http://litalico.co.jp/) でエンジニアをやっています、@kentya6です。
『[LITALICO Advent Calendar 2016](http://qiita.com/advent-calendar/2016/litalico)』12日目の記事となります。

今回、スクリーンショット拡張Macアプリケーション「[Fuwari](https://github.com/kentya6/Fuwari)」を作って公開しましたので、開発の経緯や流れ、アプリの使い方などを書いていきます。

[Fuwari Web Site](https://fuwari-app.com)

## 開発背景
私は今まで[Kiritori](http://kiritori.ruhenheim.org/)を仕事でもプライベートでもよく使っていました。
画面の任意の範囲を一時的に最前面にしたい時や、範囲指定の画像保存をする際に領域を確認してから保存する時等に使うアプリケーションです。
普段は、様々なIDEのインスペクタの値を一時的に見やすい位置においてみたり、スライドに埋め込むためにパパっと画像の範囲を指定してから保存するために使っていました。
しかしmacOSをSierraにしてからは、私の環境ではKiritoriが動作しなくなってしまいました。

代替アプリを探しましたが、Sierraでは同様に動かなくなっていたり、動作してもMacAppStoreで有料で販売されているようなものでした。なので、これを機にKiritoriと同じようにスクリーンショットを最前面に保持するアプリを作ることにしました。

今回開発したアプリはオープンソースとして公開しています。
私自身が普段よく使うため、今後様々な機能追加やOSアップデート後に問題があれば即対応する予定です。

## 主な使い方
アプリケーションを起動後、Kiritoriと同様に⇧⌘5で画面キャプチャのカーソルが出現します。
ドラッグで切り取る範囲を指定し、⌘Sで画像保存する、というのが主な使い方です。
切り取った画面は⌘Wで削除することもできます。

デモ動画はこちら↓になります。

![FuwariDemo.gif](https://qiita-image-store.s3.amazonaws.com/0/2037/f61d8888-91d8-5088-021c-f3a9e1e0a00f.gif)

## 画像リソースの準備
どれも簡単なアイコンなので、全部[Sketch](https://www.sketchapp.com/)で作成しました。
maxOSのアイコンレイアウト等は[SketchAppSources](https://www.sketchappsources.com/)から探して使いました。
アプリアイコンの書き出しは[Prepo](https://wearemothership.com/work/prepo/)を使用しました。

## WebSite
アプリ開発に伴い、[GitHub Pages](https://pages.github.com/)でサイトを公開しました。
Downloadボタンより、dmgファイルをダウンロードして使用してください。
https://fuwari-app.com

独自ドメインによるHTTPS運用ですが、ドメインを取得した後、`gh-pages`ブランチでCNAMEファイルをプッシュし、ネームサーバを[Cloudflare](https://www.cloudflare.com/)のものに置き換えることで実現しています。

## オープンソース
今回開発したFuwariは全てオープンソースとして公開しています。
[Fuwari リポジトリ](https://github.com/kentya6/Fuwari)

ライセンスはMITにしています。

##フレームワーク
内部フレームワークとして以下を使用しています。

* [Magnet](https://github.com/Clipy/Magnet)
    * グローバルホットキーの管理
* [LoginServiceKit](https://github.com/Clipy/LoginServiceKit)
    * ログイン時のアプリ起動設定処理
* [Sparkle](https://github.com/sparkle-project/Sparkle)
    * アプリアップデートの確認と通知
* [Fabric](https://get.fabric.io/)
    * 主にクラッシュレポート用

なお、今回は[CocoaPods](https://github.com/CocoaPods/CocoaPods)ではなく全て[Carthage](https://github.com/Carthage/Carthage)を使ってフレームワークをインストールしました。ビルド時間が大分速くて捗りました。

## 今後の開発予定
現在のFuwariはVer.0.1にしており、設定画面にほとんど項目がなくKiritori等のアプリに比べてまだまだ機能不足なので、まず直近は以下の機能を作っていこうかなと思っています。

- ~~マルチスクリーン対応~~ -> ~~v0.2で対応しました~~ -> v0.3で改良しました
- ~~ホットキー拡張~~ -> v0.3で対応しました
- ~~画像保存形式指定~~ -> v0.4で対応しました
- ~~Escキーでキャプチャキャンセル~~ -> v0.2で対応しました
- ~~クリップボードにコピー~~ -> v0.4で対応しました

今後仕事でもプライベートでも普段使いするつもりなので、このFuwariを日々使いながら感じた改良点を上記の項目以外でも実装していく予定です。

## まとめ
前述した通り[Fuwari](https://fuwari-app.com)は全て[オープンソース](https://github.com/kentya6/Fuwari)として公開されています。
バグや不具合、要望等ありましたら、Issue、PullRequestなどお待ちしています。

他になにかありましたら、@kentya6までTwitterやGitHub経由でご連絡ください。この記事のコメントでも構いません。
これからより使いやすいアプリケーションに進化させるので、どうぞよろしくお願いいたします。

明日は、@klriutsaさんが絶対に笑ってはいけないRailsコード集について書くそうです。よろしくお願いします！
GoogleAnalyticsの基礎の基礎の用語集

#始めに
自分用の備忘録だけど、ようやっとGoogleAnalyticsを使い始めたので、本当に基本的な用語をまとめておく。

とりあえずこれでけ把握しておけばなんとなくは読めるはず。

>20161213 コメント欄でご指摘をいただき、ユーザーの部分を一部修正しました。

#用語集

##閲覧数の種類

最初はこの違いがややこしい。

ここでは一人のユーザー、Aさんを例にたとえてみる。

###ユーザー
閲覧してた人数を指す。
Aさんはとりあえず何度見ようと基本１。

ユーザーはブラウザ単位で判断されるため、
例えばAさんがデスクトップPCからと、スマートフォンから、
別々のブラウザで閲覧した場合は、２となる。

~~またcookieを拾っているため、保存されるのは2年なので、
最初の閲覧から2年がたった時点で、
新たに２となる。~~
*(コメント欄でご指摘をいただき修正しました)*

>サイトへの最終アクセスから2年以上
経過したユーザーがサイトに訪問すると、新規ユーザーとしてカウントされる

cookieを削除した場合はユーザーが減る。

###セッション
サイトが見られた回数を指す。
Aさんが朝昼夜三回サイトを閲覧したら３になる。

１回の閲覧が切り替わる条件は主に３つで、
- 30分以上操作がない
- その日の日付を跨いだ
- 参照元が変わる

###PV
閲覧されたページ数を指す。
Aさんがサイトのページを6ページほど見たら６になる。

##直帰率
1ページだけ見て離脱するセッションの割合を指す。

##新規セッション
直近２年間のサイトの訪問のないセッションを指す。

要は基本的にご新規のお客様。

##デフォルトチャネルグループ

*集客→サマリ-→チャネル*で見る

参照元のまとめ。

ここは主に使われる4つのみをあげる。

###Organic Search
検索エンジンからの閲覧を指す。

###Referral
別のサイトのリンクからの閲覧を指す。

例えば、このページの場合、私のブログにリンクが貼っているため、
そこから来て閲覧している場合はそれ。

###Social
SNSからの閲覧を指す。

ただしGoogleがSNSと認識しているものになるので、
そうでない場合は上と同じになる。

###Direct
どこからか不明な場合ここに入る。

例えば、URLを直接入力した場合、個人のブラウザのブックマークからの閲覧の場合などもここに入る。

####Directが増えている理由

#####スマートフォンアプリからの流入
参照元の情報が設定されていない場合が多い

#####https→http
SSL化されているサイトから非SSLサイトへは参照元の受け渡しが行われない。

##目標
GoogleAnalyticsではコンバネーションとして、
目標を設定できそれに対しての達成度を計測することもできる。
(必須ではない)

サイトの目的により必要なものを使うと良いだろう。

*CV率=コンバネーション率 目標達成率*

###到達ページ
ユーザーに閲覧させたいページを設定。
(お問い合わせページ、購入ページ、サービス登録ページなど)

###滞在時間
閲覧させたい時間
(○分以上など)

###ページビュー数
ユーザーに閲覧させたいページの数
(○ページ)

###イベント
閲覧者にさせたいアクション
(ファイルのダウンロード、特定のURLのクリックなど)
swift - 範囲演算子 コレ→「...」

#閉区間という名の点点点（...）

そもそもこちらの点点点（...）は閉区間と言いまして

数学的な意味で両端を含む区間という意味です

「左端っこから右端っこまでの間」という意味ですね

これをswiftでは範囲演算子と表現してます

範囲演算子はfor-in文で使われています

使い方としては下記にまとめました


#使ってみよう範囲演算子（...）

範囲演算子（...）を利用すれば

特定の回数だけ繰り返す処理を記述することができます

例えば、５回だけ処理を繰り返すfor-inを書いてみましょう


```swift:for.swift

//５回だけ処理を繰り返すfor-in

for i in 1...5{
    print("i \(i)")
}

//結果
//i 1
//i 2
//i 3
//i 4
//i 5

```

#不等号を使った範囲演算子（..）

大なり小なりの不等号を使って

上記と同じ５回処理を繰り返す記述を書いてみましょう

下記のような記述になります

ピリオド（..）が二つになって不等号がつくようですね 



```swift:for.swift

//不等号を使用して５回だけ処理を繰り返すfor-in
for i in 1..<5 {
    print("i \(i)")
}

//結果
//i 1
//i 2
//i 3
//i 4
//i 5

```



# 参考記事

Swift:for-in文
http://qiita.com/t_punch/items/8f3c1b573f7a184e90be

Swift 繰り返し文(for-in文、while文)
http://blog.codable.co.jp/entry/2014/10/27/163534
Eclipse/Che を組込み向けクロス開発環境として使ってみる。

(対応プロセッサを増やすごとに，加筆していきます。)

2016年現在のクラウド IDE の主戦場はLL系またはJVM系言語です。
mbed など特定環境向けのクラウド IDE は早くから立ち上がっていますが，汎用性がなくつぶしが利かないのが難点です。

[Eclipse/Che](http://eclipse.org/che/) は，ビルド環境に [Docker](http://www.docker.com/) を採用しているので，Linux 環境でできることはほぼ何でもできます。
つまり，Cheが求める構成を含むクロスGCC入りのコンテナを __作れば__ ，クロス開発環境になります。

PizzaFactory プロジェクトでは，クラウド IDE の組込みソフト分野での利活用を提案すべく，Che のための Docker コンテナを整備しています。

# Eclipse/Che の調達方法

Eclipse/Che のインスタンスは立ち上がっているものとします。Che-server の Docker へのデプロイの仕方は，公式 Web ページを参照してください。

また，Eclipse/Che の開発に大きく貢献している [Codenvy](http://codenvy.io/)は実質 Eclipse/Che と同じクラウドIDEのサービスをフリーミアムモデルで行っており，日本では[PizzaFactory/Camino という有償のサービスも提供されています](http://www.monami-ya.jp/solution/pizzafactory/camino/)。
手元に環境がない場合には，これらを使うと手軽に始められます。

# ワークスペースの作り方

ワークスペースは `Stack` と呼ばれる，ワークスペースの雛形から生成されます。
本来は Stack を作ったほうがよく，上記有償サービスでは，その対応が為されています[^1]。
しかし，本記事の内容の範囲であれば，もっと簡便な手段があります。

[^1]: 有償版ですから，それくらいあって当然ですね。

まず，左メニューの `Workspaces` を選択し，青色の `Add Workspace` ボタンを押します。

![Screenshot 2016-12-12 at 13.18.42.png](https://qiita-image-store.s3.amazonaws.com/0/5414/4b7b96f5-81ce-995f-2f9d-9a1317eea10c.png)

出てきた `New Workspace` 画面で，｀Runtime` タブを選択し，さらにその下の `Custom stack` を選択します。

さらに，下のラジオボタンで `Write your own stack` を選択すると，テキストボックスが出現します。

![テキストボックスが出現した状態](https://qiita-image-store.s3.amazonaws.com/0/5414/c2e6debe-06ab-f840-2c88-d62f20b09aaf.png)

ここに，Docker compose に則った yaml 記述を入力します。
いろいろと複雑なことも書く気になれば書けますが，とりいそぎ，下記の三行あればクロスGCCを使うには十分です。

```
services:
  dev-machine:
    image: 'イメージ名'
```

イメージ名は，ターゲットアーキテクチャによって異なります。
ターゲットアーキテクチャとイメージの対応は下表のとおりです。

ターゲットアーキテクチャ|バージョン|イメージ名
:---|:---|:---|:--
Blackfin|ADI 2014R1以降の版|pf0camino/cross-bfin-elf:latest
Nios II|Sourcery CodeBench Lite 2016.05-9 for Nios II ELF with R2 以降の版|pf0camino/cross-nios2-elf:latest
MIPS|Sourcery CodeBench Lite 2016.05-7 for MIPS ELF 以降の版|pf0camino/cross-mips-elf:latest

ですので，例えば Blackfin プロセッサ向けの開発環境であれば下記のように入力します。
yaml では字下げに意味があるので，その点は気をつけてください。

```
services:
  dev-machine:
    image: 'pf0camino/cross-bfin-elf:latest'
```

入力に誤りがないことを確認したら，画面右上の `CREATE` ボタンを押して，ワークスペースを作成してください。
同じ位置に `OPEN` ボタンが出現するはずですので，それを押してワークスペースを開いてください。

ネットからクロス開発環境が入った Docker イメージがダウンロードされ，ワークスペース用のコンテナが起動します。

PATH 環境変数の設定等は済んでいますので，ターミナルから，クロス GCC を立ち上げてみてください。

![Screenshot 2016-12-12 at 14.24.53.png](https://qiita-image-store.s3.amazonaws.com/0/5414/b2442990-fe09-765b-5dc9-3f37c0e070f7.png)

# まとめ

Eclipse/Che を組込みソフトのクロス開発向けに使う方法を概説しました。

通常の組込み開発，とくに複数の CPU アーキテクチャを扱う場合には，ツール環境をクリーンな状態に保つのが難しいという課題がありました。Eclipse/Che は Docker コンテナで環境を分離できるので，この課題は完全に解決します。
しかし銀の弾ではなく「__手元にあるターゲットボードのデバッグが困難__」「__Windows 版しか提供されないツールに対しては無力__」 という新たな課題は発生します。しかし，それを許容できるようであれば，かなり有力な選択肢ではと思います。

ぜひお試しください。
ちなみに筆者は既に，ローカルマシンにあったクロスGCCを，全てアンインストールしました。
あの日見た言語の名前を僕達はまだ知らない。

[前回の記事](http://qiita.com/UJIPOID/items/61fb84c021df46c65895)でiOSアプリ開発におけるイケイケライブラリたちをご紹介したわけだが、
この記事を読んでくださったスーパーハッカーの皆様ならもうすでにそのいくつかをご自身のプロジェクトに取り入れる、
ないしは取り入れようとしているハズである。
そしてそろそろ絶望を味わっている頃ではないだろうか。

そう、プロジェクトの言語とライブラリの言語が合わないということに。

2014年のWWDCにおいて一般に発表され、当時のiOSアプリ開発者たちを見えない恐怖に陥れたSwiftは、
"モダン"という漠然としたキラーワードでたちまちiOSアプリ開発におけるメジャー言語へと台頭した。

既存のアプリ改修はともかく、新規でアプリを開発するとなった場合、圧倒的にSwiftで開発をスタートするケースがほとんどだと思うが、
たまにいるのである、過去の遺産にとらわれて亡霊(Objective-C)から逃れられないエンジニアが。そう、私のことである。

今回のお話は、大衆がSwift!Swift！と叫ぶ中、やっぱりObjective-Cは最高だぜとつぶやく時代遅れのエンジニアの小さな抵抗の物語である。

閑話休題

さて、イケイケライブラリを見つけたはいいものの、ここ最近はSwiftでかかれたライブラリが増えてきており、
Objective-Cのプロジェクトに組み込む際に、若干の注意が必要である。

## Objective-CのクラスからSwiftのクラスを呼び出す

Objective-Cベースのプロジェクトにおいて、Swiftのファイル(.swift)を追加後にビルドすると、
**"プロジェクト名-Swift.h"**というブリッジファイルが自動生成される。

コイツをSwiftを呼び出したいObjective-Cのファイルでインポートするだけ。

```
#import "プロジェクト名-Swift.h"
```

プロジェクト内に存在するすべてのSwiftファイルのクラス, およびメソッドがこのファイルに定義される。
ただ、Swift側のクラスが**`NSObjectを継承したクラス`**や**`@objc`**を付けたクラスでなければならないこと、
Swift側のクラスの一部のメソッドが定義されず使用することができないことがある、という点を知っておかなければならない。
これはSwiftから新たに追加されたクラスや、Objective-Cでは使えない型があるためである。

自分はSwiftのライブラリにメソッドを自作で追加して(ココで結局Swift言語でコードをかくハメになったのだが…)
ブリッジファイルに定義されるようにカスタマイズして対応した。
(Swift側で新しくメソッドやプロパティを追加した場合は、再ビルドしたタイミングでブリッジファイルに反映される)

ちなみに、
**Build Settings -> Swift Compiler - General** の中に、

```
Objective-c Generated Interface Header Name -> プロジェクト名-Swift.h
```

と定義されている。

また、"プロジェクト名-Swift.h"内に定義されたクラスであっても、
Objective-C側でそのクラスを継承したクラスを作ることはできない。
まぁ、当然と言ってしまえば当然なのだが、自分は結構ライブラリのクラスを継承して、
さらにカスタムクラスを作らなければ対応できないことが多々あったので、一応試した結果である。

## Xcode8でSwift2.3を使い続ける
2016年9月13日にXcode8が正式リリースされ、Swift3がXcodeにおけるプライマリな言語になった。
Swift3.0ではSwift2.3と比べ、構文やAPI名など多岐に渡って変更点があったようだ。

早速Xcode8にアップデートし、プロジェクトをビルドしたところ、

```
Swift Compiler Error
```

が大量に発生し、心が壊れそうになる。

一応、Xcode８にはSwift3.0への自動コンバート機能が用意されており、

```
Use Legacy Swift Language Version
```

というエラーとともに、全力でSwift3.0へのコンバートを推奨される。
**Edit -> Convert -> Convert To Current Swift Syntax** から、
Xcodeの指示にしたがってポチポチしていくと、Swift3.0へのコンバートができる。
ただ、コンバートしたあとにもエラーがかなり残っており、１つずつ直していく作業を延々とこなした後、
ようやくビルドを通すことができた。

そこでもう一人の自分が囁いたのである、"まだSwiftと向き合う時ではない"と。

#### プロジェクトのswift言語バージョンを設定する
**TARGETS -> Build Setting -> Swift Compiler -> Use Legacy Swift Language Version** を **YES**
に設定する。
コレでXcode８でもSwift2.3をコンパイルすることができるようになる。
実際にビルドしてみたところ、数カ所エラーが残ったものの、ほぼ既存コードのまま使うことがきた。

## 結
序章に比べて内容がかなり薄かった気がするが、
それだけSwift言語から逃げることが今のところ簡単だということだろう。

今のところ。

気が早いもので、Swift4のリリース計画もすでに組まれていて(2017秋とのことである)、
Xcodeでobjective-Cがビルドできなくなる日もそう遠くはないような気がするので、
今のうちからSwiftもキャッチアップしていきたいものである。
と、自分自身に言い聞かせる。

###### Created by [株式会社デジタルクエスト](https://www.digiq.co.jp) 森田 貴規
PostgreSQLで曜日ごと・時間帯ごとにレコードを抽出する

## やりたいこと
railsのactiverecordを使って、PostgreSQLのtimestampカラムに対して、曜日ごと・時間帯ごとにレコードを抽出したい。

## 曜日ごと
スクリプト:

```
['日', '月', '火', '水', '木', '金', '土'].each_with_index do |dow, i|
  count_by_dow = Model.where("extract(dow from created_at AT TIME ZONE 'UTC' AT TIME ZONE 'JST') = ?", i).count
  puts "#{dow}曜日: #{count_by_dow}"
end
```

出力:

```
日曜日: 2405
月曜日: 3768
火曜日: 2336
水曜日: 4860
木曜日: 3158
金曜日: 2753
土曜日: 2220
```

`created_at AT TIME ZONE 'UTC' AT TIME ZONE 'JST'`は、`(created_at AT TIME ZONE 'UTC') AT TIME ZONE 'JST'`と同じ。DBのタイムゾーンがUTCなのでJSTに変換している。

## 時間帯ごと
スクリプト:

```
(0..23).each do |clock|
  time_string_from = "#{sprintf('%02d', clock)}:00"
  time_string_to = "#{sprintf('%02d', clock + 1)}:00"
  count_by_timescope = Model.where("to_char(created_at AT TIME ZONE 'UTC' AT TIME ZONE 'JST', 'HH24:MI') >= '#{time_string_from}'")
                            .where("to_char(created_at AT TIME ZONE 'UTC' AT TIME ZONE 'JST', 'HH24:MI') < '#{time_string_to}'")
                            .count
  puts "#{time_string_from}時〜: #{count_by_timescope}"
end
```

出力:

```
00:00時〜: 1438
01:00時〜: 735
02:00時〜: 157
03:00時〜: 142
04:00時〜: 75
05:00時〜: 176
06:00時〜: 325
07:00時〜: 348
08:00時〜: 537
09:00時〜: 1047
10:00時〜: 1228
11:00時〜: 1500
12:00時〜: 658
13:00時〜: 1129
14:00時〜: 1099
15:00時〜: 981
16:00時〜: 927
17:00時〜: 1502
18:00時〜: 1763
19:00時〜: 593
20:00時〜: 703
21:00時〜: 1026
22:00時〜: 1991
23:00時〜: 1420
```

to_char関数でタイムスタンプを文字列に変換してから、文字列で比較を行っている。もっと良い方法がありそうなのだが、、

## 補足
extract関数で、timestampのカラムからいろいろなデータが取得できる。https://www.postgresql.jp/document/7.2/user/functions-datetime.html に詳しく書いてある。

- century (世紀)
- day (日)
- decade (十年)
- dow (曜日)
- doy (通算日数)
- epoch (1970-01-01 00:00:00 からの秒数)
- hour (時)
- microseconds (マイクロ秒)
- millennium (ミレニアム)
- milliseconds (ミリ秒)
- minute (分)
- month (月)
- quarter (四半期)
- second (秒)
- timezone_hour (時間帯オフセットの時の成分)
- timezone_minute (時間帯オフセットの分の成分)
- week (週)
- year (年)
新しいRubyのバージョンをインストールすると`bundle install`できない


いっつも忘れるので、メモする

エラーはこちら。

```ruby
$ bundle install
rbenv: bundle: command not found

The `bundle' command exists in these Ruby versions:
  2.1.6
  2.1.8
  2.2.4
  2.2.5
  2.3.1
  2.3.2
  2.3.3
```

解決方法は簡単で、bundlerをインストールする

```ruby
$ gem install bundler
.
.
.
1 gem installed
```

```ruby
$ bundle install
.
.
.
Bundle complete!
```

めでたし。めでたし。
ウェブサイトでのメンテナンス画面の出し方(スーパーベーシック版)

# メンテナンス画面の出し方まとめ

スーパーベーシックにメンテナンス画面を出す方法。
htaccessで飛び先変えてあげるような奴。
かなり枯れた手法だから、最近のレンタルサーバなら、どこでも使えるはず。

Rails上での、メンテナンス画面の出し方などは、別記します(いつか)。

## htaccessとmainte.htmlを設置

メンテナンス用のHTMLと.htaccessを準備しましょう。
メンテナンス用のHTMLは単独表示できるようにCSSがなどはインラインで。

以下の書き方は一例なので、mainte.htmlなどは文言などは自由に編集を。

``` mainte.html
<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
    <title>システムメンテナンスのお知らせ</title>
  </head>
  <body>
    <div style='width: 640px; margin: 50px auto;'>
      <div style='border: 1px solid #ccc; padding: 30px; margin-top: 30px;'>
        <h2 style="color: #F00">システムメンテナンスのお知らせ</h2>
        <p>
          いつも◯◯をご利用いただき、ありがとうございます。<br />
          このたびサービス向上のため、システムメンテナンスを実施いたします。<br />
          下記時間帯でサービスがご利用いただけません。<br />
          お客さまには大変ご迷惑をおかけいたしますが、何卒ご了承いただけますようよろしくお願い申し上げます。
        </p>
        <p>
          ご不便をおかけいたしますがよろしくお願い申し上げます。
        </p>
      </div>
    </div>
  </body>
</html>
```

``` .htaccess
ErrorDocument 503 /mainte.html

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_URI} !=/mainte.html
  RewriteCond %{REQUEST_URI} !(javascripts)
  RewriteCond %{REQUEST_URI} !(stylesheets)
  RewriteCond %{REQUEST_URI} !(images)
  RewriteCond %{REMOTE_ADDR} !=111.111.111.111
  RewriteRule ^.*$ - [R=503,L]
</IfModule>
```

## 解説
RewriteEngine ONで、リクエストのあったURLを転送する(この仕組で擬似静的化を実現するのですが)。

**RewriteCond %{REQUEST_URI}**
リクエストのあったら？という条件文みたいなもの。

**!=/mainte.html**
http://****/mainte.htmlへのアクセスは除外するぜ　というもの。この場合、/mainte.htmlへのアクセスに対してはRewriteしないということ。

**!(javascripts)**
javascriptsディレクトリの下層を除外するぜ　というもの。ディレクトリの場合はカッコで括る

**RewriteCond %{REMOTE_ADDR} !=111.111.111.111**
111.111.111.111には自分たちのグローバルIPに置き換えましょう。
グローバルIPがなければ、この行自体不要。
これは自分のIPだけはメンテナンス画面に飛ばないという除外設定(ほかの人達はメンテに飛ぶ)。

**RewriteRule ^.*$ - [R=503,L]**
全アクセスを503にする(ifModuleの上に503の時は/mainte.htmlを出せと書かれている)


参考：
http://web-tan.forum.impressrd.jp/e/2009/06/16/5880
http://q.hatena.ne.jp/1315913774
会社の受付アプリに実装した、こだわりUI

## はじめに
もう1年近く前になりますが、グッドパッチの受付に置くiPadアプリを実装しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/12352/9f6c7481-aac7-5e51-f2eb-e499fcaf4e2c.png)


これに実装したUIを２つ紹介します。


## 招待コードを入力すると色が変わる

招待コードが3桁のカラーコードになっており、入力すると色が変わります。

例）招待コード `#A67`

![InvitationCode.gif](https://qiita-image-store.s3.amazonaws.com/0/12352/103750c9-e6b3-75af-50aa-8ea3d7bfa2cf.gif)

キーボードの部分はStackView、色を変える部分はリアクティブ系のライブラリを使って、ある程度楽に実装できました。文字色は背景色との明度差を見て、白か黒かを決めています。

なお、アニメーションgifを撮る時にタップ箇所がわかるように、[morizotter/TouchVisualizer](https://github.com/morizotter/TouchVisualizer)を利用しました。
（結局SimulatorとQuickTimeで撮ったらマウスカーソル入ってしまいましたが）

## CollectionViewのインデックスリスト

TableViewではインデックスリストが標準で提供されています。

例）設定アプリの地域選択

右側のABCD...がそれです。

<img width="200" alt="image" src="https://qiita-image-store.s3.amazonaws.com/0/12352/ab4c5b21-3437-5462-c873-d969cf84f140.png">



ですが、CollectionViewにはインデックスリストはありません。なので自前で実装しました。

![IndexTitles.gif](https://qiita-image-store.s3.amazonaws.com/0/12352/d0f32349-7228-7ae3-5339-2148bd934892.gif)
※本来は日本語名、英語名、顔写真が出ますが、ここではイニシャルのみの表記にしています。

A, B, Cでセクションを分けてしまうと無駄に余白が生まれてしまうので、セクションは分けず非選択状態のセルを半透明にして、選択状態のセルが目立つようにしています。

先ほどと同様に、インデックスリストの部分はStackViewを使っていて、タップされたときの処理はリアクティブ系のライブラリを使ってハンドリングしています。


## おわりに
当然ながら、このUIは僕だけの力で生まれたわけではなく、チームメンバーの力によるところが大きいです。議論したりプロトタイピングしながらブラッシュアップしていきました。

僕自身は、実は初めてのiPadアプリ開発でしたが、UIにこだわりながら実装できて非常に楽しかったです :smiley:
ミスを減らす再帰関数のデザイン

#はじめに
先日,再帰関数のプログラムを作っていたのですがとあるミスを生じてしまいました
そんな中,「この再帰関数のデザインはいいな」と思えたコードがあったので紹介します

#実際の例
[前の記事(10進から2進変換の様々なアプローチ)](http://qiita.com/sugunisu/items/c8b20378970467a2ffa4)より再帰関数のプログラムを少し書き替えます

```cpp:recursive.cpp
void print_dec2bin(int n)
{
    if(n==0){
        return;
    }else{
        print_dec2bin(n/2);
        printf("%d",n%2);
    }
    return;
}
```

この例では前回の関数から**引数のdigitを消去し,再帰の終端条件をn==0**としました
digitを消したので負の値は定義できないので考えないものとし,最後の改行文字も不要だとします
実はこの段階で**バグをはさみ込んでしまっている**のですが,皆さんお気づきでしょうか？
(もちろん,桁溢れなどのシステム面のバグは含まないものとします)

ここに答えを書いてしまうと答えが画面に表示されてしまいますので再帰関数の考え方についてその後に答えを書こうかと思いますので,皆さん考えてみてください

##再帰関数の一般的な考え方

再帰関数とは関数の中で自分の関数を呼ぶ関数のことです
関数を呼ばれるタイミングの前と後で処理順が逆になります
単純に関数を呼びつづけると無限ループになって終わらないので終端条件をつけて関数を遡っていきます
以上からイメージはこんな感じになります

![saiki.png](https://qiita-image-store.s3.amazonaws.com/0/152328/45553d74-e0a3-b250-eac6-b29c2ad9fafd.png)

丸四角が関数で白丸が前後の処理,黒丸が終端条件(関数を含む)になっています
上記の例では110→11→1→0となり0の地点で終端として0→1→11→110の右端(2で割った余り)を書いていけば答えにたどり着けるという魂胆です

##問題点の答え
答えはこの関数は入力0に対応してないということです
入力が0の場合いきなり終端条件を満たしてしまい,何もせずに終了します
前回のプログラムでは桁の指定があるので,1桁になるので問題はないですが
改造するところで失敗しちゃっています
これを解決するための一つの方法として以下のような方法があります

```cpp:recursive2.cpp
void print_dec2bin(int n)
{
    if(n<2){

    }else{
        print_dec2bin(n/2);
    }
    printf("%d",n%2);
    return;
}
```
終端条件を2以上にしてどんな値でも1桁目を吐かせれば確かに答えになりますが
見た目も分かり辛いのでよろしくありません,そこで考え方をちょっと捻ってみます

#良いデザイン
ここでの問題点は終端条件とすべき部分で答えが返らないということです
なら逆に考えて**終端条件で答えを出力すれば上手く行くのではないか**と考えるのです
ということでやっていきます

```cpp:recursive3.cpp
void print_dec2bin(int n)
{
    if(n==0)      printf("0");
    else if(n==1) printf("1");
    }else{
        print_dec2bin(n/2);
        print_dec2bin(n%2);
    }
    return;
}
```
ここでのポイントは**「今までの再帰関数」**と**「終端条件用関数」**の2つを呼び出すことです
上で書いたようなイメージに直すと以下の様になります
![saiki3.png](https://qiita-image-store.s3.amazonaws.com/0/152328/785fef45-4545-9909-650c-adf1d3a5109b.png)

処理の流れは110→11→1(1)→[11→1(2)→11]→[110→0(3)→110]という風になります
再帰関数を使って逆順に戻っていき,その1の位を終端条件としての再帰関数にぶつけて値を吐かせていきます
先ほどの唐突に出てくる終端条件の「2より小さい」の理由とか説明しなくても簡潔に表すことができました
最初は再帰関数自体が2つの仕事をしていて少し気持ち悪い形に見えますが,使いこなせれば便利かもしれません
Filemaker 字数制限をスクリプトで実装する

#はじめに
　この記事はFileMakerで作成したフィールドに文字を入力する際に、字数制限をスクリプトによって機能させようという趣旨のものです。

　システムを組んでいる上で、特定のフィールドに字数制限をしたいのですが、FileMakerにもともとついている機能を使うと都合よく動きません。また、ここでそれに該当する記事を探したのでなかったので、スクリプトで自作しました。
#動作環境
MacBook Pro
OX X 10.12.1
FileMakerPro14 Advanced
※2017/12/26：FileMakerPro16 Advancedでの動作を確認
#FileMakerの字数制限
FileMakerの機能を使えば字数制限自体は可能である。しかし、ポップアップが出たのちに、そのデータのまま入力を続けることができてしまいます。これでは、帳票に出力した際に、字数オーバーしたデータが出力されない事態が発生してしまいます。これでは都合が悪いので、どうしても字数オーバーできないようにしたいです。

<img width="466" alt="スクリーンショット 2016-12-12 15.26.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/110980/1013cb78-c684-8102-f78a-b402524435bd.png">
#スクリプトによる実装
以下スクリプト

<img width="839" alt="スクリーンショット 2016-12-12 15.29.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/110980/17ba8be4-4220-d098-1cf0-16c31c569819.png">

　ここでは、半角、全角が同居していても文字数を判断したいため、バイトで判断するようにしています。
バイトで文字数をカウントするためには、「lengthb」を、バイトで文字数をカウントしてleft関数と同様の働きをさせるには「leftb」をそれぞれ用意する必要があります。
　それらの関数は、[ここ](http://www.fmpro.jp/fmi/xsl/plugin/cflist.xsl?)に乗っています。

また、この関数を設置する個所として、スクリプトトリガのOnObjectSaveを選択し、スクリプト引数に最大文字数(バイトなので、基本全角最大文字数*2)を入力する。

そして、スクリプトを設定したフィールドで文字数を超過すると、以下のような表示が出ます。

<img width="438" alt="スクリーンショット 2016-12-12 15.37.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/110980/21909afe-3a35-a7c1-bd14-f4ed1f6f388c.png">

表示が出たのち、OKを押すと文字数制限を超えた分だけの文字列が削除されます。
#最後に
FileMakerはリファレンスが充実していないので、もっぱらcommunityを利用しているのですが、qiitaとかでももっと記事が増えた方がいろんな人が使えていいなと思いました。

自分も、FileMakerでいくつか記事を書いてみようかな。

何か、質問点・問題点があれば教えてください。
CSSやSassで色管理をもっと簡単に

Webなどで色を指定する場合、#000000のような16進数やRGBでの指定が多かったと思います。
ですがどちらも調整したい時に直感的に変更できません。

CSSでの記述をHSLにするとすると、色の微調整が直感的に行うことができます。

##HSLとは
HSLはHue(色相)、Saturation(彩度)、Lightness(輝度)という意味です。
この3つの要素をコントロールして色を作るイメージです。

###Hue(色相)
色相はざっくり言うと何色かということです。
0度から360度の角度で表します。0度が赤で、180度はその補色となる青緑です。
色の概念が分かっていれば数値だけで何色系にしようかすぐに試せます。
![hue.jpg](https://qiita-image-store.s3.amazonaws.com/0/59171/dc72a2cb-b347-ad0b-bf03-7ac7c5c43ffe.jpeg "hue.jpg")


###Saturation(彩度)
彩度は色の鮮やかさのことです。
0%から100%の数値で設定します。パーセンテージが上がるほど鮮やかになります。
![Saturation.jpg](https://qiita-image-store.s3.amazonaws.com/0/59171/d79e8146-cc37-f185-1730-d389b68451d6.jpeg "Saturation.jpg")


###Lightness(輝度)
輝度は明るいか暗いかということです。
0%から100%の数値で設定します。パーセンテージが上がるほど明るくなります。
![Lightness.jpg](https://qiita-image-store.s3.amazonaws.com/0/59171/97c1fc54-98a1-dea7-8838-c6a018f3bde9.jpeg "Lightness.jpg")


##記述方法

1つ目に色相、2つ目に彩度、3つ目に輝度の数値を設定します。
色相には単位を入れず、彩度と輝度には```%```をつけます。

``` CSS:CSS
	/* えんじ色っぽい赤 */
	.button {
		background-color: hsl(0,100%,80%);
	}
```


##HSL + a
似たようなものでHSLAというものがあります。AはAlphaの略で透明度です。
0から1の数値で設定します。数値が上がるほど不透明になります。

``` CSS:CSS
	/* えんじ色っぽい赤の50%の透明度 */
	.button {
		background-color: hsl(0,100%,80%,0.5);
	}
```


##調整の例

以下のソースはえんじ色っぽい赤を、暗い茶色にする例です。

``` CSS:CSS
	/* 01 えんじ色っぽい赤 */
	.button {
		background-color: hsl(0,100%,80%);
	}
	
	/* 01を濁らせたい場合は2番目の数値を少なくする */
	.button {
		background-color: hsl(0,50%,80%);
	}
	
	/* 02を暗くしたい場合は3番目の数値を少なくする */
	.button {
		background-color: hsl(0,50%,40%);
	}
```

##色を直感的に捜査するその他の方法
Sassでは元の色から```adjust-hue```で色相を、```saturate / desaturate```で彩度を、```lighten / darken```で輝度を変更することができます。

上記以外にも補色にする```complement```や2つの色から中間色を作成する```mix```などもあります。

あらかじめ変数を作っておけばカラーバリエーションがすぐ作れるので、とても便利です。


##最後に
上記の方法はどちらも色の基本を理解していなければ難しいかもしれません。
ですが一度慣れるととても便利ですので、これを機に試してみてはいかがでしょうか。
下記のリンク先がわかりやすいと思います。

[HSL COLOR PICKER](http://hslpicker.com/)
js_facade_genを使ってDartのJavaScript interopを自動生成する


これはDart Advent Calendar9日目の記事です。

今回はDartからJavaScript APIを使うときに便利である[pkg/js](https://pub.dartlang.org/packages/js)用のライブラリをTypeScriptの型定義ファイルから自動生成してくれるツール[js_facade_gen](https://github.com/dart-lang/js_facade_gen)について解説していきたいと思います。

# JavaScript interopとjs_facade_genについて

Dartから既存のJavaScriptライブラリを利用する場合は、相互運用を簡単にするためにpkg/jsを利用する必要がありました。このpkg/jsを利用したライブラリを自作するのはすこし面倒です。そこで、TypeScriptの型定義ファイルからpkg/js用のライブラリを生成してしまおうということで作られたのがjs_facade_genです。

簡単に使い方を見ていきます。

# js_facade_genの使い方

## インストール

js_facade_genを利用するためには、Node.jsが必要です。Nodeが入っている事を確認したら、js_facade_genをnpmでインストールしましょう。

```bash
npm install -g dart_js_facade_gen
```

## 使い方

GitHubレポジトリのREADMEにも載っていますが一応。

```bash
dart_js_facade_gen  --destination=lib/ --basePath=/path/to/dtsfile/directory/ /path/to/dtsfile/directory/file.d.ts
```

`--basePath`で目的の型定義ファイルが保存されている場所を指定し、引数に型定義ファイルを渡します。

# サンプル

chart.jsのDart版はjs_facade_genによって提供されているようです。

[google/chartjs.dart: Dart API for Chart.js](https://github.com/google/chartjs.dart)

# おわりに

すこしコマンドラインのインターフェースが使いづらいということをのぞけば、かなり実用的に使えると思います。ただ、Promiseを利用しているライブラリを使うとなるとすこし面倒になる気がします……もうちょっと調査したら追記します。
MacのEmacsにBGMとタイプ音をつけてみる

この記事は、[SLP_KBITその2 Advent Calendar 2016 - Qiita](http://qiita.com/advent-calendar/2016/slp_kbit2)の12日目の記事です。

# はじめに

遅刻しましたごめんなさい
![yakidogeza.jpg](https://qiita-image-store.s3.amazonaws.com/0/33326/83f279b8-5871-498d-2f14-9b420883bcae.jpeg)

EmacsLispの続きです。
今回は、EmacsにBGMとタイプ音を追加してみたいと思います！
実用性皆無の興味本位ですw

# CLIから音楽再生

音楽再生を考えた時に、SSH経由で音って取れるのかな...?と疑問には思ったのですが、簡単に調べてみたところ、やっぱり無理そうだったので、今回はMacユーザ向けの記事になります。

Maｃだと、音楽は以下のコマンドで再生できるようです。

```
$ afplay music.mp3
```
めっちゃ簡単。これをEmacsから叩けばいいだけですね。

# EmacsからShellコマンドを実行する

EmacsLispでは、外部のShellコマンドを実行するための関数が幾つか用意されています。

|関数名|効果|例|
|:--|:--|:--|
|shell-command-to-string|シェルコマンドを実行し、実行結果を取得する|(shell-command-to-string "echo hoge")|
|async-shell-command|シェルコマンドを非同期に実行する|(async-shell-command "echo hoge")|
|start-process-shell-command|シェルコマンドを実行するプロセスを立ち上げる|(start-process-shell-command "process-name" "buffer-name" "echo" "hoge")|

`shell-command-to-string`は、非同期ではないため、実行している間はEmacsが動作を停止していしまいます。そのため、これは利用できません。
今回は、`start-process-shell-command`を利用します。`async-shell-command`を利用しないのは、バッファ名やプロセス名を明示的に指定するためです。

# 起動時にBGMを再生する

まずは、起動時にBGMを再生出来るようにします。
BGMファイルは、適当なm4aファイルを`.emacs.d`ディレクトリの中に入れておきます。
設定は以下の通り

```
(defun play-bgm()
  (start-process-shell-command "bgm-process" "bgm-buffer" "afplay" "./bgm.m4a"))

(add-hook 'emacs-startup-hook 'play-bgm)
```

以上。
`start-process-shell-command`を実行して、音楽ファイルを再生する関数を作成して、`emacs-startup-hook`に引っ掛けるだけ。

# Emacs終了時に音楽ファイルを終了する

前述の設定では、Emacsの終了時に`Active processes exist; kill them and exit anyway? (yes or no)`のように聞かれると思います。
これはちょっと面倒くさいので、Emacs終了時に強制的にBGMを止めるようにしたいと思います。
設定は以下の通り。

```
(defun kill-process-if-exit(name)
  (setq process (get-process name))
  (unless (eq process nil)
    (process-kill-without-query process)))

(defun save-buffers-kill-terminal-with-sound()
  (interactive)
  (kill-process-if-exit "bgm-process")                                                                                                                                                                          
  (save-buffers-kill-terminal))

(global-set-key "\C-x\C-c" 'save-buffers-kill-terminal-with-sound)
```

まず、引数に与えられたプロセス名のプロセスを削除する`kill-process-if-exit`関数を定義します。しかし、プロセスがない場合には何もしないように`unless`文で指定しておきます。

通常、C-x C-cにバインドされている関数は、`save-buffers-kill-terminal`という関数です。
今回は、その直前に作成したプロセスを全て削除し、前述の関数を実行する`save-buffers-kill-terminal-with-sound`という関数を定義し、`C-x C-c`をその関数にバインドし直します。

これで、終了時に問題なく終了できるようになったと思います。

# タイプ音を追加する

次は、同様にタイプ音を追加します。
文字を入力したときのhookは、`post-command-hook`です。

```
(defun play-type-sound()
  (start-process-shell-command "sound-process" "sound-process" "afplay" "./type.m4a"))

(add-hook 'post-command-hook 'play-type-sound)

(defun save-buffers-kill-terminal-with-sound()
  (interactive)
  ;; 以下の行を追加
  (kill-process-if-exit "sound-process")
  ;; ここまで
  (kill-process-if-exit "bgm-process")                                                                                                                                                                          
  (save-buffers-kill-terminal))
```

これで完成です！

# 最後に

※ タイプ音は周りの人の迷惑にならない程度のものにしましょう。
VCCW を使ってテーマやプラグインのコーディングスタンダードをチェック


昨日 [「VCCW + WP-CLI で WordPress のユニットテスト」](VCCW + WP-CLI で WordPress のユニットテスト) という記事を書きました。

何回かに分けて、VCCW の少し高度な使い方について解説していきます。

## WordPress のコーディングスタンダード

WordPress にはいくつかのコーディングスタンダードが定められています。

https://codex.wordpress.org/WordPress_Coding_Standards

主な規約はだいたい以下のような感じ。

* インデントにはスペースではなく本物のタブを使用すること。
* 丸括弧の内側にはスペース。
* 変数を展開する等の理由がない限りシングルクォーテーションを使用すること。

などなど。

これらは WordPress-Coding-Standards というツールを使用すれば、皆さんのプラグインやテーマ内のコードをチェックすることができます。

https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards

VCCW にはこれがデフォルトでセットアップされていますので簡単にチェックを行うことができます。

## wpcs コマンドを使ってコーディングスタンダードをチェックする

みなさんのテーマやプラグインが WordPress のコーディングスタンダードに準拠しているかをチェックするには、`wpcs` コマンドを使ってください。

まず、いつものとおりゲストマシンにログイン。

```
$ vagrant ssh
```

次にチェックしたいテーマやプラグインのディレクトリに移動してください。

```
$ cd /var/www/html/wp-content/plugins/oreore
```

最後にチェック。

```
$ wpcs *.php
```

サンプルに以下のようなまったく役に立たないプラグインを用意してみました。

```php
<?php
/**
 * Plugin Name:     Oreore
 * Plugin URI:      PLUGIN SITE HERE
 * Description:     PLUGIN DESCRIPTION HERE
 * Author:          YOUR NAME HERE
 * Author URI:      YOUR SITE HERE
 * Text Domain:     oreore
 * Domain Path:     /languages
 * Version:         0.1.0
 *
 * @package         Oreore
 */

function hello( $str ) {
  echo $str;
}

```

これにチェックをかけると以下のような感じ。

```
$ wpcs *.php 

FILE: /var/www/html/wp-content/plugins/oreore/oreore.php
----------------------------------------------------------------------
FOUND 3 ERRORS AFFECTING 1 LINE
----------------------------------------------------------------------
 16 | ERROR | [x] Tabs must be used to indent lines; spaces are not
    |       |     allowed
 16 | ERROR | [x] Line indented incorrectly; expected at least 1
    |       |     tabs, found 0
 16 | ERROR | [ ] Expected next thing to be a escaping function, not
    |       |     '$str'
----------------------------------------------------------------------
PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------

Time: 37ms; Memory: 4Mb
```

インデントの方法に関するエラーが二つと、最後に `Expected next thing to be a escaping function, not '$str'` というエラーが出ていますね。

これは XSS脆弱性を防ぐためのエスケープが漏れていることを指摘しています。

これは以下のように WordPress のエスケープ関数を使用するとエラーがでなくなります。

```php
<?php
/**
 * Plugin Name:     Oreore
 * Plugin URI:      PLUGIN SITE HERE
 * Description:     PLUGIN DESCRIPTION HERE
 * Author:          YOUR NAME HERE
 * Author URI:      YOUR SITE HERE
 * Text Domain:     oreore
 * Domain Path:     /languages
 * Version:         0.1.0
 *
 * @package         Oreore
 */

function hello( $str ) {
        echo esc_html( $str );
}
```

このように WordPress-Coding-Standards を使用するとエスケープ漏れもチェックしてくれますので、プラグインやテーマのセキュリティ向上にも役に立ちます。
Web Audio / Web MIDI にまつわる時間管理の話（２） - 絶対時間と演奏時間

# はじめに
[前回の記事（１）](http://qiita.com/toyoshim/items/98f11b74ccd60af34859)では、Web Audio / Web MIDIにまつわる3つの時刻についてお話しました。復習すると

1. Date.now()
 - 現在時刻
2. DOMHighResTimeStamp
 - ページを開いてからの時間
3. AudioContext.currentTime
 - 該当AudioContextを作ってからの時間

があり、後者2つが我々にとって大切な時間となる、というお話でした。さて、これだけで十分でしょうか？実は今回はさらに新しい時間の概念をご紹介します。……第4の時間です。

```(； ･`д･´) ﾅ､ﾅﾝﾀﾞｯﾃｰ !! (`･д´･ (`･д´･ ;)```

今回の記事でコードを書く際の問題を解説し、最終的にPolymerで作ったtp-midi-clockの紹介をするところまで持っていく……つもりだったのですが、当日になって体調を崩してしまったため、書きかけだった部分（第4の時間）までで一旦まとめて公開し、3部構成にしたいと思います。

# MBT
## Measure:Beat:Tick
MBTはそれぞれMeasure（小節）、Beat（拍）、Tickの略です。いわば「演奏開始からの時間」を表す新しい時間です。小節と拍についてわからない人は音楽の解説をしているサイトをあたってみて下さい。Tickはさらに拍を細かく切ったもので、1拍を分解能と呼ばれる数字（例えば480）で割った単位になります。それぞれ「:」で区切り、0または1から数えます。ここでは計算し易い0からの数とします。これによれば、演奏開始時の時刻は「0:0:0」、そこから8分音符経過した時刻は「0:0:240」、更に付点4分音符で「0:2:0」まで進みます。

## 他の時間との相互変換
MBTの興味深いところは、その情報のみでは他の時間との変換が出来ないところです。これは楽譜を渡しても演奏者によって演奏時間が変わるのと似ています。つまり演奏するテンポを厳密に規定しないと、他の時間との相互変換はできません。逆に言えば、これが演奏データをMBTで扱うメリットになります。演奏データを記録した後、記録データの形を変えずに任意にテンポを変更しながら再生することができるわけです。

# 必要な時間についてもう一度まとめてみる
さて、Web AudioとWeb MIDIにとって大切な時間の概念だけをまとめてみます。デートについては忘れて下さい。

- DOMHighResTimeStamp
 - ページを開いてからの時間（ミリ秒）
- AudioContext.currentTime
 - 該当AudioContextを作ってからの時間（秒）
- MBT
 - 演奏開始からの時間（拍）

ここまで来ると、DOMHighResTimeStampとAudioContext.currentTimeの差異は大きな問題ではない事がわかります。つまり、以下の方法により簡単に相互変換が可能です。

```js
var context = new AudioContext();

// ここでは簡単に紹介するためにcontextに直接必要な値と関数を登録します

// currentTimeが開始した時刻をDOMHighResTimeStampで覚えておきます
var context.creationTimeStamp = performance.now() - context.currentTime * 1000;

// currentTimeからDOMHighResTimeStampに変換します
var context.toPerformanceTime = function (time) { return this.creationTimeStamp + time * 1000; }

// DOMHighResTimeStampをcurrentTimeでの時刻に変換します
var context.toCurrentTime = function (timeStamp) { return (timeStamp - this.creationTimeStamp) / 1000; }
```

# 今回のまとめ
以上から、Web Audio / Web MIDIで扱う時間の概念は、大まかに考えて以下の2つに分類できます。

- 絶対時間
  - ここではDOMHighResTimeStampを代表して使いましょう。ページ間で同期しようとすると難しい問題があるにはありますが、最初にDateと組み合わせてキャリブレーションを取るなどの方法があるにはあります。
- 演奏時間
  - MBTを使いましょう。絶対時間との変換のためにテンポを別途管理する必要があります。

次回はこの2つの時間を実際にJavaScriptで扱う際の課題と対策、そしてWeb Audioを使ってクリックを再生しながら、MBT時間でMIDIの演奏データを取得するためのPolymerコンポーネント、tp-midi-clockについて紹介します。
vim: 今いるカーソルが指している単語をファイル内で一括検索（ハイライト）

作業していたら偶然発見したのでシェア。`*`でカーソルが表示している単語をファイル内で検索することができる。

![vimmer6.gif](https://qiita-image-store.s3.amazonaws.com/0/87666/2f04b2ff-dd2c-0df9-d9c9-9c5bf55f4b23.gif)

追記: コマンドは`shift + :`ではなく`*`だとのコメントを頂きました。ご指摘ありがとうございました。
特定のリクエストをキャッシュ対象外に設定する

この記事では特定のパスに対するリクエストなどをFastlyサーバー上でキャッシュさせない設定の作成手順について説明します。


```
特に記載がない限り本記事の記載内容はデフォルト設定での挙動となります。
なお、この記事ではリクエストに対してPASSする手順を説明しています。Fastlyサーバーがオリジンサーバーからレスポンスを受け取って初めて分かる条件でPASSをしたい場合は異なる手順となります。
このあたりの詳細は「PASSアクションの挙動について(
https://docs.fastly.com/ja/guides/vcl/understanding-the-different-pass-action-behaviors)を参照して下さい。
```

作業の流れとしてはまずPASS(キャッシュをしない）するRequest Settingというものを作成し、作成したRequest Settingに対してCondition(条件)を付与します。



## Request Settingを作成する

1. FastlyのWebポータルにログインしConfigureをクリックします。
2. Serviceメニューから設定を行いたいServiceを選択して下さい。
3. 対象のVersionがLockedのステータスの場合は、右上のOptionメニューからCloneをクリックして下さい。表示中のVersionを元にした新しい編集可能なVersionが作成されます。
4. **Setting**タブをクリックして下さい。以下のような画面が表示されます。<img width="600" alt="002" src="https://qiita-image-store.s3.amazonaws.com/0/128569/1f4ceef9-14ef-6fe8-ed9d-250fd86acfe5.png">

5. **Create Request setting** をクリックして下さい。"Create a new request setting"ページが表示されます<img width="500" alt="003" src="https://qiita-image-store.s3.amazonaws.com/0/128569/49c74e0f-2df6-9899-d8f8-fcb70810c0b1.png">

6. Create a new request settingに以下の値を入力して下さい
 - **Action** : Pass(do not cache)
 - **Force TLS**: Not Selected
 - **X-Forwarded-For**: X-Forwarded-Forヘッダーを設定するかどうかを指定します。通常はAppendで問題ありません。
 - **Description**: この設定を識別するための何か適当な名前を入力して下さい。

その他のAdvance Optionは通常は変更する必要はありません。

## Request Settingに条件を設定する

ここまででリクエストをPASSする設定が完了です。ただし、このままだとこの設定がすべてのリクエストに適用されてしまうので、このPASS設定を適用する条件を作成します。


1.作成したRequest Settingの右側にある **Attach a condition** をクリックして下さい
<img width="400" alt="004" src="https://qiita-image-store.s3.amazonaws.com/0/128569/ee1aa160-b34e-238b-6d14-b645287055eb.png">
2. Add a condition to XXXウインドウが表示されますので"Create a new request condition"をクリックして下さい。以下のような画面が表示されます。
3. Create a new request conditionに以下に必要な内容を入力して下さい。
<img width="500" alt="004" src="https://qiita-image-store.s3.amazonaws.com/0/128569/153fd5ee-f44b-6441-23c0-92aaef991f81.png">
　・ **Type**: Request
　・ **Name**: 条件を識別するための適当な名前
　・ **Apply if**: 適用したい条件(Conditions)を入力して下さい
　例えばリクエストURLが"/special"で始まるリクエストを選択する場合は
　req.url ~ "^/special"

　拡張子がphpまたはhtmlの場合は以下のようになります。
　req.url.ext ~ "(php|html)$"

　Conditionsの詳細については以下のサイトを参照して下さい。
　https://docs.fastly.com/guides/conditions/using-conditions

5. **Save and apply**をクリックして下さい

以上で設定は完了です。設定内容を本番環境に反映させるためには、作成したVersionを開いた状態でページの上の方にある**Activate**をクリックして下さい


なお、OptionのShowVCLから生成されたVCLを確認する事が出来ます。上記の手順が正しく完了していれば以下のような内容が生成されます。

```
sub vcl_recv {

//省略

  # Request Condition: Extension is php or html Prio: 10
  if( req.url.ext ~ "(php|html) ) {    
    
       if (!req.http.Fastly-FF) {
         if (req.http.X-Forwarded-For) {
           set req.http.Fastly-Temp-XFF = req.http.X-Forwarded-For ", " client.ip;
         } else {
           set req.http.Fastly-Temp-XFF = client.ip;
         }
       } else {
         set req.http.Fastly-Temp-XFF = req.http.X-Forwarded-For;
       }
  
        return(pass);  
  
      }
  #end condition

//省略

}

```
SECCON 2016 Online CTF Write up

SECCONというかCTFの大会初参加です。チームdendenmushiで部活の後輩達と200点獲得し、452位でした。

# Vigenere
後輩「MD5から逆算出来ちゃったんですけど……」
誰かが確認にこのサイト使ったんでしょうね……。おもいっきりズルだと思います。
http://www.kiyori.co.jp/md5reverse/

`SECCON{ABABABCDEDEFGHIJJKLMNOPQRSTTUVWXYYZ}`


# VoIP
pcapファイルを落としてWiresharkで読み込んで再生して聞き取り。
http://www.terilogy.com/momentum/wireshark/wireshark01.html

`SECCON{9001IVR}`

'9'がどうしても聞き取れませんでした……。

# 最後に
Writeup読んでもっと勉強しなきゃ(使命感)
初稿

１１月からPythonを独学し始めました。

気が向いたら、最近作っている機械学習を手当たり次第用いた株価予測の情報をまず上げていこうと思います。

株価予測で使っているアルゴリズムはこのQiitaで得られたものですので、自分も考えたことはここに共有していこうと思います。
Google Chrome でブックマークをタグ管理すると登録も開くのも爆速

Firefox(+ Vimperator) から Google Chrome に乗り換えたが、最初に悩んだのはブックマークの管理の仕方だった。
Google Chrome にタグ付けの機能はない。プラグインを入れるのも気が引けるし、ブックマークはサクッと登録したい。


# フォルダ分け vs タグ付け
Gogole Chrome はブックマークをフォルダ分けが出来る。
以前は使っていたのだが、いちいち分類するのが面倒になってきた。 **そもそも排他的に分けるのが難しい**。
ブックマークに必要なのはカテゴリじゃなくてタグ付け(複数ラベル)のはずだ。 **むしろタグ付けさえあればいい**。

そこで Google Chrome のアドレスバーの強力な絞り込みを有向に活用できるブックマーク管理の仕方を考えた。

# 方法
登録時のタイトルの末尾に「#tag」のようにハッシュタグをつける。
`#` は明確に分けたい場合につければいい。元のタイトルも絞り込みをにひっかかるので、補足でキーワードを付け足すでもいい。

## 登録
![save_bookmark.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/9ef644c0-980f-0901-1599-0ef8409c2d03.gif "save_bookmark.gif")

ブックマークに追加を開く: ⌘ + d(または Ctrl + d)
→ 文末にカーソル移動: Ctrl + f
→ タグ付け
→ Enter(ｯﾀｰﾝ)
タイトルに含まれないキーワードを追加しておくでもいい

## 開く
![open_bookmark.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/3578010f-e949-0150-e1c9-41a367ab436d.gif "open_bookmark.gif")

アドレスバーにフォーカス: (⌘ + t 新しいタブ, ⌘ + l アドレスバーにフォーカス)
→ タグ絞り込み
→ 対象を選択: Ctrl + n(ひとつ下選択), Ctrl + p(ひとつ上選択)
→ Enter(ｯﾀｰﾝ)
大極宮のrssで取得したページがエラーになるので、urlを修正するUserScript

大極宮のrssで取得したページがエラーになるので、urlを修正するUserScript
Tampermonkeyで確認

```javascript:UserScript
// ==UserScript==
// @name         feedly 大極宮
// @namespace    http://tampermonkey.net/
// @version      0.21
// @description  try to take over the world!
// @author       You
// @match        https://feedly.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Your code here...
   function tkk(data1, data2) {
        for(var i=0; i < data1.length; i++) {
            if(data1[i].addedNodes[0].nodeType===1) {
                if(data1[i].addedNodes[0].className.match(/u100Frame/)) {
                    var alternateLink = data1[i].addedNodes[0].getAttribute('data-alternate-link');
                    if(!alternateLink.match(/www\.osawa\-office\.co\.jp/)) return;
                    var targetanchor = data1[i].addedNodes[0].getElementsByTagName('a');
                    for(var j=0; j < targetanchor.length; j++) {
                        if(targetanchor[j].href === alternateLink) {
                            targetanchor[j].href = targetanchor[j].href.replace(/\d{4}\/\d{2}\/.+\.html/, '');
                        }
                    }
                }
            }
        }
    }
    var mo = new MutationObserver(tkk);
    mo.observe(document.getElementsByTagName('body')[0], {childList: true, subtree: true});
})();
```

こんな風になった
もっといいやり方があったら教えてください
mochaとかgulpがdoneの有無をどうやって判断してるのか調べた

# 何を調べたのか。
コールバック関数の引数の有無によって動きが異なる処理がある。
たとえば、gulpだと以下のようなコード。

``` js:gulpfile.js
// 引数なし
gulp.task( "hoge", function() {
  // functionの中を抜けたら、タスク終了。
} );

// 引数あり
gulp.task( "fuga", function( done ) {
  // functionの中を抜けてもタスクは終了しない。
  // doneが呼ばれるまで、待つ。
  setTimeout( function() {
    done();
  }, 1000 );
} );
```

mochaとかそういうテストランナーでBDDスタイル(と言うらしい)のテストを書くとき

``` js:test.spec.js
describe( "hoge", function() {
  it( "fuga", function() {
    // functionの中を抜けたら、テスト終了。
  } );

  it( "piyo", function( done ) {
    // doneが呼ばれるまで待つ
    setTimeout( function() {
      done();
    }, 1000 );
  } );
} );
```

要は、`function() {}`を渡した時と、`function( done ) {}`で挙動が異なるのはどうやって実現しているか、という話です。

# 結論
javascriptでは関数が受け取る引数の数を`func.length`で取得できる。
なので、

``` js:hoge.js
function func( done ) {

}

console.log( func.length ); // -> 1
```

`length`が`0`なら、`done`を受け取らなかった時の処理。
`1`なら`done`を受け取った時の処理で実行している。

どんな黒魔術を使ってるのかと思ってましたが、種明かししてみたらたいしたことないですね。