OmniAICreator/Qiita-1.07M huggingface dataset:
Phalcon アクション周りのイベントとかメモ

# ルーティングからアクションまでにはさめる処理メモ

下記のテーブルの上から順に実行される．

| 種類   | 名前とか                         | 実行回数とか |
|:-------|:---------------------------------|:---------|
| Func   | Route#beforeMatch()              | 一致するまでそれぞれ一回 |
| Func   | Route#convert()                  | マッチしたあと設定されている分だけ |
| Event  | dispatch:beforeDispatchLoop      | 一回のリクエストで一回だけ実行 |
| Event  | dispatch:beforeDispatch          | ディスパッチループが回るごとに一回でアクションがなくても実行  |
| Event  | dispatch:beforeExecuteRoute      | ディスパッチループが回るごとに一回でアクションがあったら実行 |
| Method | Controller#beforeExecuteRoute()  | ディスパッチループが回るごとに一回でコントローラで定義できる前処理 |
| Method | Controller#initialize()          | 最初に対象コントローラがインスタンス化されたときだけ |
| Method | Controller#xxxAction()           | <- メイン |
| Event  | dispatch:afterExecuteRoute       | ディスパッチループが回るごとに一回 |
| Event  | dispatch:afterDispatch           | ディスパッチループが回るごとに一回 |
| Method | Controller#afterExecuteRoute()   | ディスパッチループが回るごとに一回 afterExecuteRoute の直前かと思ってたけど違う罠 |
| Event  | dispatch:afterDispatchLoop       | 一回のリクエストで一回だけ実行 |


上記のなかだと initialize() の動きが若干トリッキーなのでわかってないとちょっとハマるかもしれない．例えば ControllerBase で initialize() を実装してそれぞれのコントローラで継承してる場合， forward すると複数回 initialize() が実行されて変なことになる可能性もある．リクエスト一回で一回しか実行したくない場合は dispatch:beforeDispatchLoop で処理するのが適切そう． 
あるいは各アクションで一回処理してほしい場合は dispatch:beforeExecuteRoutee() か Controller#beforeExecuteRoute() に書くのが適切そう．コントローラに依存しないものは前者で依存するものは後者で処理するのがよさそう．

また，指定されたアクションがなければ dispatch:beforeDispatch と dispatch:beforeExecuteRoute の間で dispatch:beforeNotFoundAction イベントが発行される．404 ページなどはここからいけるかもだけど正直 Router には設定されてるけど Action がないというのはそんなに考えられれない気がするので開発中に使うことが多そう？

あと 詳しくみてないが例外が投げられると dispatch:beforeException を通る．これはディスパッチループの中なのでそのままエラーページなどに forward/redirect などができるかもしれない．例外投げてからそのままビューに復帰できるかは確認してないのでバリデーションを例外として投げてエラーメッセージをそのままビューで表示するといったような処理ができるかどうかわからん．


# 404 などのエラーページについて

おまけ程度に簡単に思いつく実装を並べる．

* Phalcon\Mvc\Router#notFound() でパスに対応しないものとして扱ってエラー用のアクションに流す
* dispatch:beforeNotFoundAction イベントを拾ってエラーアクションやエラーページに redirect/forward する
* ディスパッチャ内で EXCEPTION_HANDLER_NOT_FOUND や EXCEPTION_ACTION_NOT_FOUND のような例外が Phalcon から投げられるかあるいはユーザが例外を投げて，それを拾ってエラーアクションやエラーページに forward/redirect する [参考](https://stackoverflow.com/questions/14071261/how-to-setup-a-404-page-in-phalcon)

（追記）

\Phalcon\Mvc\Router(true) のようにデフォルトのルーティングが定義されている場合は $router の notFound() まで行かずに おそらくデフォルトルートにマッチしてしまう（ example.com/hoge とかだと controller => hoge, action => index ）ので beforeException まで行ってしまうので 三番目の方法しか使えない．


# 参考文献

> php - How to setup a 404 page in Phalcon - Stack Overflow
>
> https://stackoverflow.com/questions/14071261/how-to-setup-a-404-page-in-phalcon
MySQL の照合順序の命名規則

MySQL の照合順序って難しいですよね。

使いこなすと便利そうだけれども。

照合順序に関するおさらいとか。

# そもそも照合順序って

"照合順序"とは、MySQL （に限らないけど）が文字を比較するときの基準・規則です。"Collation" という英単語からきています。「照合順序」という和訳からはわかりにくいのですが、「照合（等しいか等しくないか）と順序（順番が前か後か）を比較する際のルール」です。「＞」「＝」「＜」のどれかということですね。 
例えば、SQL文で次の比較文はどう評価されるでしょうか？

```sql
'A' = 'a'
```

プログラミングとかを少しやっていると、 False が返される気がしてきますが、MySQLは「照合順序」によって True も False も返却しうります。 
具体的には照合順序が "<code><strong>unicode</strong>\_<strong>general</strong>\_<strong>ci</strong></code>"`（バイト列をユニコードとして読み取り\_通常規則で照合\_ただし大文字小文字は同一視；結構一般的なものです） だと、<code>'A' = 'a'</code> は True となります。 
あとは細かい例で行くとドイツ語の <code>"ß" = "ss"</code> とか、[Unicode で A を示すバイト列は二種類ある](http://ja.wikipedia.org/wiki/A#.E7.AC.A6.E5.8F.B7.E4.BD.8D.E7.BD.AE)のですが、はたして 0x0041 と 0xFF21 は等しいのか <code>'A' = 'Ａ'</code> かどうかとかがこれで決まります。 

# 照合順序の命名規則


具体的に命名規則は次の規則に乗っ取っています。

## ビット列をどの文字コードで解釈するか

名前の一番最初、`Unicode` とか `utf8` とか `ascii` とかです。 
実際に DB に収納されているのは単なるビット列（例えば `01000001` ）なので、それがどの文字列に該当するのかを示すのがこの値になります。まぁ説明不要ですね。ちなみに例は `ascii` で解釈した場合の `'A'` です。

## どの文化（言語）で比較するのか

後半は `bin` とひとくくりにされる場合と、「文化（言語）_大文字小文字比較」の組み合わせで指定される場合があります。 
`"bin"` の場合、バイナリ文字比較なので、一切の文字は個別の物として扱われます。照合する順序はバイナリ順です。 
「バイナリ比較なら文字コード関係ないじゃん。`ascii_bin` も `utf8_bin` もいっしょじゃね？」と思われるかもしれませんが、utf8 みたいな可変長文字コードをシングルバイトずつ比較していくと文字の比較にならないといった事があるようなないような気がします。（ここらに関してはまだ勉強不足です。少なくともutf8ならシングルバイトずつ比較しても同じ順序が得られるように Unicode -> utf8 へのマッピングがなされていたはずですが） 
bin 以外の場合、照合順序は文字コードの後ろに二項目が続きます。先に後ろのほうに関して説明すると、

    ci -> Case Insensitive	大文字小文字を区別しない
    cs -> Case Sensitive	大文字小文字を区別する

です。で、そもそもどのどの大文字小文字が対応するのかとかそういうことを区別するのが、アンダーバー "\_" で区切られた中心の文字列です。 

代表的な物が、`utf8_Unicode_ci` と `utf8_general_ci` の二つです。 
照合順序における `bin` と `general_ci` と `unicode_ci` の違いは以下のような感じになります。

### もちろんバイナリでは値は違う

```sql
SET NAMES 'utf8' COLLATE 'utf8_bin'; 
select CAST( CHAR(65) AS CHAR ) = CAST( CHAR(97) AS CHAR ), 
CAST( CHAR(65) AS CHAR ) = CAST( CHAR(239) AS CHAR ); 
-- select 'A' = 'Ａ', 'A' = 'a'; 
-- 以下同じ。 
> 0, 0
```

### general 比較
```sql
SET NAMES 'utf8' COLLATE 'utf8_general_ci'; 
SELECT 'A' = 'Ａ', 'A' = 'a'; 
> 0, 1
```

### Unicode 比較
```sql
SET NAMES 'utf8' COLLATE 'utf8_Unicode_ci'; 
SELECT 'A' = 'Ａ', 'A' = 'a';
> 1, 1
```

Unicode 比較すると、全角のアルファベットも通常アルファベットと同じ位置にソートされます。日本語の濁音と清音とかも同じ位置です。

```sql
SET NAMES 'utf8' COLLATE 'utf8_Unicode_ci'; 
SELECT c WHERE c = 'か' FROM all_hiragana; 
```
->

    |c | 
    ---- 
    |か| 
    |が|


になります。色々便利で面白い機能なんですが、場合によってはシンプルに ascii_bin で扱ってほしくなったりもしますね。 

# リンク集

[第9章 キャラクタセットサポート](http://dev.mysql.com/doc/refman/5.1/ja/charset.html)
PhotoshopCCで劣化しない@3x対応

#はじめに
スライスツールの使い方を探していたらPhotoshopの機能で同様のことができることが分かりました。

簡単なバナー制作で確認してみます。
素材の猫さんは元同僚と同居中の方です。

#画像アセット
Photoshop CCから使える機能なようです。

##拡大するか縮小するか
オリジナルの画像を大きく作り、縮小するのが鉄板です。

素材はかならず３倍の大きさで作った方が良いですが
作成するPSDファイルの大きさは、制作するには等倍の方が使いやすい。

##制作

（1）レイヤーの設定
![スクリーンショット 2014-09-15 21.28.06.png](https://qiita-image-store.s3.amazonaws.com/0/12362/c23838ca-d2be-c822-bd8e-8cd486141a34.png)

一番上位のグループには下記のとおり入力します
`default 300% ios-3x/@3x + 200% ios-2x/@2x + ios/`

（2）画像アセットを有効化
ファイル > 生成 > 画像アセット
![スクリーンショット 2014-09-15 21.31.40.png](https://qiita-image-store.s3.amazonaws.com/0/12362/3c750659-93c4-b62f-23ed-aaf232c3718d.png)

（3）画像ファイルはPSBに変換
拡大しても劣化しないように画像の形式を変更して保存しておきます。

画像はこちらから

ファイル > 開く

![スクリーンショット 2014-09-17 1.43.42.png](https://qiita-image-store.s3.amazonaws.com/0/12362/b1d3f14d-ed1a-0f48-b285-ef9449830907.png)


ファイル > 別名で保存
![スクリーンショット 2014-09-15 22.18.58.png](https://qiita-image-store.s3.amazonaws.com/0/12362/dbe73117-6d6b-0ae5-6cee-3f3846e84f30.png)

[ファイル名].psbというファイルに保存されます。

（4）スマートオブジェクト：PSBを配置

* リンクを配置
* 埋め込みを配置

制作時は結果に大きく変わりませんが、運用方法で選択が異なります。
ファイルサイズは大きくなりますが、素材そのものは変更を加えないので「埋め込み」を選びます。

拡大・縮小、移動など行って編集します。

![スクリーンショット 2014-09-17 1.38.50.png](https://qiita-image-store.s3.amazonaws.com/0/12362/d863b4e1-f31b-bfef-3c84-f7bbdf458b2b.png)

（5）追加したスマートオブジェクトをマスクします。（Alt + クリック）

![スクリーンショット 2014-09-17 1.39.12.png](https://qiita-image-store.s3.amazonaws.com/0/12362/f39f2ec4-e632-a18a-c737-4230e4e63e5b.png)

（6）変更後すぐに画像が作成・更新されます。

![スクリーンショット 2014-09-17 1.47.52.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e62eeeaa-e0c2-6ab4-28e0-ba9f0a81316e.png)

###出来たバナー

.png
![neko.png](https://qiita-image-store.s3.amazonaws.com/0/12362/489ca60f-2f10-3dfa-ce79-bd78e6543313.png)


@2x.png
![neko@2x.png](https://qiita-image-store.s3.amazonaws.com/0/12362/40720526-09f1-f0ec-2a62-5d89fbd46830.png)

@3x.png
![neko@3x.png](https://qiita-image-store.s3.amazonaws.com/0/12362/8b3e9f8f-00e9-30e1-af35-c3b20d67c558.png)

##参考URL

Photoshop ヘルプ / レイヤーからの画像アセットの生成
http://helpx.adobe.com/jp/photoshop/using/generate-assets-layers.html

Photoshop初心者は絶対に覚えてほしい!!画像を劣化させずに調整できるPSDデータの作り方
http://creativememomemo.com/photoshop_making_adjustable_data/
##もっと劣化しないことを考える
Photoshopのシェイプでできること。：ボケないシェイプの描き方
http://lopan.jp/photoshop-shape/

Photoshopの「生成」機能を掘り下げ
http://c-note.chatwork.com/post/70251384696/photoshop-generator

iOSの@3x対応：Vector画像とImageAssets
http://kototec.i-studio.co.jp/427/

#さいごに
@3x対応とはしていますが、Androidでも応用が利きます。
また、デザイナーさんには当たり前の内容なのかもしれませんが
Slicy
http://macrabbit.com/slicy/
を使うつもりで、偶然PhotoshopCC2014でまかなえることがわかったくらい、専門外なので、困るのはいつも素材の加工です。
psdとpsbについてなども知ることができました。
gulpfileを粛々とデバッグする方法


[gulp.js](http://gulpjs.com/)を使っていて、デバッグが必要になるケースは次の2つですが、やることはあまり変わりありません。粛々と、方法1〜3を試して行きましょう。

- `gulpfile`が動かない
- 自作/他作のプラグインの挙動がおかしい

基本的にはNode.jsのデバッグそのものですが、(gulp.jsのユーザには) Node.js自体に不慣れな場合もあるかと思いますので、参考まで。

![Node Inspector](https://qiita-image-store.s3.amazonaws.com/0/1858/b16b352d-bbda-957e-6c6f-42f9ebb4b015.png "Node Inspector.png")


## 方法0: npm install

デバッグの前に、何はともあれ。

```bash
$ npm install
```

## 方法1: gulp-debug

まずは気楽にデバッグする方法から。[gulp-debug](https://www.npmjs.org/package/gulp-debug)を使えば、プラグインをパイプして行く途中で、ファイル(正しくはvinyl)がどういう状態か見ることができます。

## 方法2: console.log

邪道感が溢れてますが、どこがおかしいか当たりが付いている場合は、ログを吐かせるのが早いです。`gulpfile`内に問題がある場合は、ほぼこれでどうにかなります。

- gulpfile
- node_modules/ 配下のプラグイン

など、まずそうなところに差し込みます。(デバッグが終わったら取り除くのをお忘れなく)

```javascript
console.log('DEBUG:ここがあやしい');
```

## 方法3: node-inspector

上記の方法だと埒が明かない場合は、真面目にデバッガで。CLIではなしに、Chromeブラウザのデバッガと同等の環境でデバッグできます。[node-inspector](https://github.com/node-inspector/node-inspector)が必要です。グローバルにインストールしておきます。(※環境によっては、`sudo`の必要あり)

```bash
$ npm install -g node-inspector
```

プロジェクトのルートディレクトリに、次のようなファイルを作成します。ここでは、`gulpdebug.js`とします。

```javascript
// require('coffee-script/register'); // Coffeeで書いている場合は有効に
require('./gulpfile'); // gulpfileの読み込み
var gulp = require('gulp');

gulp.start('default'); // タスクの実行
```

実際にデバッグを始めるには、次のコマンドを実行します。

```bash
$ node-debug gulpdebug.js
```

すると、ブラウザが立ち上がって、冒頭のような画面が表示されます。あとは、フロントエンドのデバッグと同じ感覚で作業できます。左側にファイルリストが表示されるので、あやしいファイルの止めたいところにブレークポイントを設定して、処理を追いましょう。粛々と。


## 補足: 問題の切り分けのために

同一の`gulpfile`が環境によって動かない場合、

- Node.jsのバージョン: `$ node -v`
- gulp.jsのバージョン: `$ gulp -v`

を確認します。違いがなければ、モジュールを疑います。動作する/しないプロジェクトのそれぞれで、次のようなコマンドを実行し、依存関係ツリーを保存します。

```bash
$ npm list > dependencies.txt
```

ツリーの深い部分でモジュールがバージョンアップして悪さをしていることがありますが、Diffを取ればそれも見つかるでしょう。問題箇所が明らかになれば、`package.json`でのバージョン指定を調整して応急処置が可能です。(根本治療には、前述のデバッグの必要がありますが...)

```
├─┬ bower@1.3.9
│ ├── abbrev@1.0.5
│ ├── archy@0.0.2
│ ├─┬ bower-config@0.5.2
│ │ ├── graceful-fs@2.0.3
│ │ ├─┬ optimist@0.6.1
│ │ │ ├── minimist@0.0.10
│ │ │ └── wordwrap@0.0.2
│ │ └── osenv@0.0.3
│ ├── bower-endpoint-parser@0.2.2

...略
```

## 補足: 複数あるgulpfileの単体実行

タスクが増えて来ると、`gulpfile`を分割して管理します。その際に分けたファイルごとに実行可能かテストしておくことは、切り分けのために重要です。gulpfile.js / gulpfile.coffee 以外の名称で保存したファイルを実行するには、`--gulpfile`オプションを使います。

```bash
$ gulp script --gulpfile task-script.coffee
```

ディレクトリが異なる場合は、`--cwd`オプションも必要かもしれません。

```bash
$ gulp script --gulpfile task/script.coffee --cwd ./
```
【N番煎じ】Ruby で Qiita 戦闘力を計測するQiitaScouter を作ってみた #qiita_scouter

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

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

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

# 【N番煎じ】Ruby で Qiita 戦闘力を計測する QiitaScouter を作ってみた

## 概要
はい、GitHub Scouterのぱくりです。
Vim Scouter や Emacs Scouter もあるそうなので、
二番煎じどころか、N番煎じということで。

GitHubへのアウトプットをエンジニアの戦闘力にするなら、
技術記事などのアウトプットもエンジニアの戦闘力の一部だろう、
ということでQiita版「QiitaScouter」を作ってみました。

## 仕様
本家に習い、
戦闘力、 攻撃力、 知力、 すばやさ
で構成します。

|項目|内容|
|:--|:--|
|戦闘力|攻撃力、 知力、 すばやさの合計|
|攻撃力|フォロワー数 × 10 × (ストック数/10)|
|知力|記事数 × 5 × (ストック数/10)|
|すばやさ|Tag数 × (ストック数/10)|

お気づきかもしれませんが、総ストック数が 9以下 だと戦闘力 0 です。
人の役に立ってはじめて戦闘力になるということで。
フォロワー数、記事数、Tag数の中ではフォロワー数は自発的に増やすことが出来ないので
一番多めに重み付けしています。


* 利用API

http://qiita.com/api/v1/users/:user
http://qiita.com/api/v1/users/:user/items

items のAPIはページ制御の最大件数の都合上、直近 100件 × 50ページで 5000件
までしか取得できないので、大量にアプトプットをしている方は直近 5000件までが集計対象になります。

## インストール

~~~bash
$ gem i qiita_scouter --no-ri --no-doc
~~~

## 試してみる

~~~bash
$ qiita_scouter a tbpgr
ユーザー名: tbpgr 戦闘力: 101717 攻撃力: 10780 知力: 87010 すばやさ: 3927
~~~

## スライドショー
http://tbpgr.github.io/qiita_scouter_slide/#/

## 補足
Qiita APIに負担をかけすぎないように、短時間・大量実行は控えましょう

## 参照
* QiitaScouter GitHub
    https://github.com/tbpgr/qiita_scouter

* QiitaScouter RubyGems
    http://rubygems.org/gems/qiita_scouter

## 参考情報
* GitHub戦闘力を提案してみた - 座駆動LT大会  
    http://blog.eiel.info/blog/2014/09/13/github-scouter/
* GitHub Scouter GieHubリポジトリ  
    https://github.com/eiel/github_scouter
Surface Pro 3 に Surface Pro 3 専用 ドッキング ステーションのつなぎかた / 接続しても充電しない時の対処


##ドッキングステーション の つなぎかた
パッと見ると、上から差し込むように、見えますが、以下のつなぎ方が正しいです。斜めから差し入れないようにしましょう。

1.ドッキングステーション の左右の耳を開いて
2.中央にSurface Pro 3を置きます
3.左右を閉じます

## ドッキングステーション に 接続したけど 充電されない
接続しても、以下の表示の場合はSurface Pro 3を以下の順でアップデートしてください。
おそらくですが、購入直後状態のSurface Pro 3には、ドッキングステーションの電源管理のファームウェアがアップデートされていない事が原因と思われます。

![no_charge.png](https://qiita-image-store.s3.amazonaws.com/0/24782/8f0d2e09-07a2-0dc9-bdd1-9583691696db.png)

###解決方法
1.Surface Pro 3を単体で電源に接続して、バッテリが十分である事を確認してください。
2.Windows Updateを実行します
3.繰り返し、更新がなくなるまでアップデートを行い最新の状態にしてください。
4.ドッキングステーションに接続して、充電が開始されることを確認してください。
5.以下の表示になればOKです。

![charge.png](https://qiita-image-store.s3.amazonaws.com/0/24782/b9b0768a-039f-6b8f-841a-88c61091b0b8.png)

###謝意

手に入れた喜びのあまり基本を忘れてアップデートもする前につないだのが、始まりで・・・マイクロソフトのSurfaceサポートの方にTELしてしまいました。
発売されたばかりのインシデントとの事もあり、資料の少ない中、ご対応いただいた中のサポートスタッフの皆様・・・すいません、無事に自己解決しました。
「Pro2のドックでも似たようなケースが過去あったんですよね」・・・との、ヒントで私もこの解決に至りました。

というわけで、感謝の意を込めて、この件ではまる人が少なくなりますように・・・
AngularJSコトハジメ


作りたいものがあって、それをAngularJSで実現するために最低限の勉強をした。

## やったこと

### ドットインストール
全12回の動画をさらっと目を通して何ができるのかを把握した。
http://dotinstall.com/lessons/basic_angularjs


### AngularJS公式ドキュメント
チュートリアルやろうとしたんだけど、ボリュームが凄そうだったのでこちらのドキュメントをさらっと読んで終わらせた。 本当に大事そうなところだけかい摘んで読んだ。 Controllerの扱い方とかがよく分かった。 

* https://docs.angularjs.org/guide/controller
* https://docs.angularjs.org/guide/module
* https://docs.angularjs.org/guide/scope
* https://docs.angularjs.org/guide/directive
* https://docs.angularjs.org/guide/services

あとは適宜、StackOverflow( http://stackoverflow.com/ )で分からない箇所を検索していくスタイルでやってる。↓こんな感じ

* "angularjs - Angular JS $http is not defined in scope - Stack Overflow" http://stackoverflow.com/questions/17911402/angular-js-http-is-not-defined-in-scope

ExtJSを経験していたおかげで、ある程度何とかなってる感が強い。助かった。

## 参考
* "AngularJS の学習リソースまとめ - AngularJS Ninja" http://angularjsninja.com/blog/2013/09/07/learning-angularjs/
* "『AngularJSの基礎 (全12回) 』のレッスンを作るときに参考にしたサイトまとめ #dotinstall | IDEA*IDEA" http://www.ideaxidea.com/archives/2012/08/angularjs_matome.html
* "AngularJS Startup Advent Calendar 2013 - Qiita" http://qiita.com/advent-calendar/2013/angularjs-startup
Amazon RDSのReplicaLagとshow slave status

##ReplicaLagは何を表しているのか
Amazon RDSのCloudWatchメトリクスには、ReplicaLagというメトリクスがある。
日本語版ドキュメントでは、ReplicaLagは「ソース DB インスタンスからリードレプリカ DB インスタンスまでのラグ」を表していると説明されているが、これは具体的にどのようなデータを表示しているのだろうか。

http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/rds-metricscollected.html

##ReplicaLag = Seconds_Behind_Master
英語版のドキュメントには詳細な説明がある。
この値は、具体的には、show slave statusから取得できるSeconds_Behind_Masterを表していることがわかる。

http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/rds-metricscollected.html

##Seconds_Behind_Masterの注意点
Seconds_Behind_Masterは、MySQLのドキュメントにもあるように、スレーブのSQLスレッドとI/Oスレッド間の時差から抽出した情報である。そのため、ReplicaLagもSeconds_Behind_Masterもネットワーク側に問題がある場合は参考にならないことに注意する必要がある。

http://dev.mysql.com/doc/refman/5.6/en/show-slave-status.html
Swiftで複数の条件で配列をソートする


従来はNSSortDescriptorという便利な物があったので、
以下のように条件を順番に配列にして渡せば良かったのですが…

```swift:NSArray.sortedArrayUsingDescriptors
let x = NSSortDescriptor(key:"x", ascending:true)
let y = NSSortDescriptor(key:"y", ascending:true)
let z = NSSortDescriptor(key:"z", ascending:true)

let sorted = items.sortedArrayUsingDescriptors([x, y, z])
```

Swiftの場合は一つの関数で判定条件を書く必要があるので、若干回りくどくなります。

```swift:Array.sorted
let sorted = items.sorted { (a:Item, b:Item) -> Bool in
	if a.x == b.x {
		if a.y == b.y {
			return a.z < b.z
		} else {
			return a.y < b.y
		}
	} else {
		return a.x < b.x
	}
}
```

元の配列を変更してしまっていい場合は、sortを使います。

```swift:Array.sort
items.sort { (a:Item, b:Item) -> Bool in
	if a.x == b.x {
		if a.y == b.y {
			return a.z < b.z
		} else {
			return a.y < b.y
		}
	} else {
		return a.x < b.x
	}
}
```
ArchlinuxでAndroidSDKをインストールする

#ArchlinuxでAndroidSDKをインストールする
ま、タグにあるようにAntergos使ってるんだけどね。

##`yaourt`しましょう

```bash:抜粋
$ yaourt -S android-sdk

〜中略〜

==> android-sdk の依存パッケージ:
 - lib32-mesa (already installed)
 - lib32-zlib (already installed)
 - java-environment (package found)
 - lib32-alsa-lib (building from AUR)
 - lib32-openal (building from AUR)
 - lib32-libstdc++5 (building from AUR)
 - lib32-libxv (building from AUR)
 - lib32-ncurses (building from AUR)
 - lib32-sdl (building from AUR)
 - swt (package found)

〜中略〜

==> Install or build missing dependencies for android-sdk:
エラー: 対象が見つかりませんでした: lib32-ncurses
エラー: 対象が見つかりませんでした: lib32-libxv
エラー: 対象が見つかりませんでした: lib32-alsa-lib
```

building from AURって書いてあるじゃん…それでないのか
単体でやってみてもダメー？

```bash
$ yaourt -S lib32-ncurses
エラー: 対象が見つかりませんでした: lib32-ncurses
```

ダメか

##multilibリポジトリに移動したらしいです

> They have been moved over to the multilib repo.
> enable the multilib repo in pacman.conf and issue -Syu
[https://bbs.archlinux.org/viewtopic.php?id=103699]

##というわけで…
[https://wiki.archlinux.org/index.php/Multilib_Project]
こちらの記述

> To use the multilib repository, uncomment the [multilib] section in /etc/pacman.conf

の通り
`$ sudo vi /etc/pacman.conf`

```bash:pacman.confより抜粋
#[multilib]
#Include = /etc/pacman.d/mirrorlist
```

のコメントアウトを外して`pacman -Syu`しとく

```bash
$ sudo pacman -Syu
:: パッケージデータベースの同期中...
 core は最新です
 extra は最新です
 community は最新です
 multilib                 122.1 KiB   320K/s 00:00 [######################] 100%
 antergos は最新です
:: システム全体の更新を開始...
依存関係を解決しています...
相互衝突をチェックしています...

〜以下略〜
```

##さぁリベンジ

```bash:抜粋
$ pacman -S android-sdk

〜中略〜

==> android-sdk の依存パッケージ:
 - lib32-mesa (already installed)
 - lib32-zlib (already installed)
 - java-environment (package found)
 - lib32-alsa-lib (package found)
 - lib32-openal (package found)
 - lib32-libstdc++5 (package found)
 - lib32-libxv (package found)
 - lib32-ncurses (package found)
 - lib32-sdl (package found)
 - swt (package found)

～以下略～
```

`building from AUR`から`package found`に変わったね！

以降素直に進めていけば良いね

#インストールが完了したら
一度再起動とかしてから

```bash
$ sudo android
```

してSDK Managerを起動
必要なものをインストール！

###`adb`したければ
1. SDK Managerで`Android SDK Platform-tools`インストールする
2. `/opt/android-sdk/platform-tools`にパスを通しておく

```bash
$ echo $PATH | tr ":" "\n"
/usr/local/sbin
/usr/local/bin
/usr/bin
/opt/android-sdk/tools
/usr/bin/core_perl
$ export PATH="$PATH:/opt/android-sdk/platform-tools"
$ echo $PATH | tr ":" "\n"
/usr/local/sbin
/usr/local/bin
/usr/bin
/opt/android-sdk/tools
/usr/bin/core_perl
/opt/android-sdk/platform-tools
```

あ、`~/.bashrc`に書いたほうがいいね（）
Opa Javascript frameworkをインストールしてみた

###まえがき
メルマガでこういうページを紹介していたので読んでみた(今更Swift)。
[Appleの新言語Swift、10の特徴（後）](http://itpro.nikkeibp.co.jp/atcl/idg/14/080400025/)
すると
> ScalaやOpaといった新進のプログラミング言語と同様に、Swiftは型推論を行う。

Scalaは知ってるがOpaって何だ？と思って調べたら
http://opalang.org/
Opa Javascript Frameworkってのがあるんですね。これはまず入れてみなくては。

**環境**
筆者の環境はubuntu 14.04.1なのでDebian系のインストールのしかたに準じますが他のプラットフォームでも(dpkg以外)同じようなものでしょう。
https://github.com/MLstate/opalang/wiki/Getting-started#install

###インストール方法
方法は大きく分けて３つあります。
1. vagrantを使ってVMごとインストール
2. Debian用のパッケージをdpkg -iでインストール
3. ソースからインストール

###vagrantを使ってVMごとインストール
一番今風のインストール方法。VMにはOpa Frameworkが必要とするnode.jsなども全部含まれているので__vagrantさえ使えれば__一番楽…なはず。
https://github.com/MLstate/opalang/wiki/Opa-with-Vagrant
に従ってやってみる…
`~$ vagrant init mlstate/opa`
`~$ vagrant up`
あれれ？失敗する…

---
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'mlstate/opa' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'mlstate/opa'
    default: URL: https://vagrantcloud.com/mlstate/opa
==> default: Adding box 'mlstate/opa' (v1.2.0) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/mlstate/boxes/opa/versions/1/providers/virtualbox.box
The box failed to unpackage properly. Please verify that the box
file you're trying to add is not corrupted and try again. The
output from attempting to unpackage (if any):

bsdtar: Error opening archive: Unrecognized archive format

---

ダウンロード先のURLを見てみると
https://drive.google.com/uc?export=download&id=0B1UEOBxsn2GiN3ZpbFdMek1FNjQ
だめじゃん、要するにGoogle Driveのウイルスチェックできないよというメッセージにひっかかってダウンロードできてない。
ということでこのページから**opa.box**をダウンロードして手でvagrantに登録する必要があります。/home/hoge/opa.boxにダウンロードしたとして…
`~$ vagrant box add opa.box --name file:///home/hoge/opa.box`
`~$ vagrant init opa.box`
`~$ vagrant up`
でうまくするとインストール完了。ただ筆者の環境では default: Warning: Remote connection disconnect. Retrying...が延々出た。最後うまく行ったようだけど…
後は
`~$ vagrant ssh`でログインするとopa frameworkが使える環境になっています。

### Debian用のパッケージをdpkg -iでインストール

[MLstate/opalang](https://github.com/MLstate/opalang/downloads)から最新の.debを拾ってくる…ただし筆者の環境ではocaml/opamがパッケージからではなくインストールされており、このdebだと依存関係が満たせなくて断念。

### ソースからインストール

[ここ](https://github.com/MLstate/opalang/wiki/Building-Opa)を参考に
`~$ git clone https://github.com/MLstate/opalang`
でgit clone。OpaはOcamlで記述されています。前提条件としてnode.jsが必要です。
`~$ cd opalang`
`~$ ./configure`
すると不足しているocamlのモジュールが列挙されるので例えば
`~$ opam install ulex camlzip ocamlgraph`
のようにしてインストール。再度　configure して不足のモジュールがなくなったら
`~$ make`
`~$ sudo make install` (/usr/localのパーミッション次第でsudoは不要)
これでインストールできます。

### Hello, World

Hello, Worldの例は

```opa:hello.opa
Server.start(
   Server.http,
   { title: "Hello, world"
   , page: function() { <h1>Hello, world</h1> }
   }
)
```

これを
`~$ opa hello.opa`
でコンパイルするとhello.jsが生成されます。中身は先頭にshebangがついていてそのまま実行できます。
`~$ ./hello.js`(ポート8080が他で使われている場合は `~$ ./hello.js --port 9090` などとします)
あとはブラウザで http://localhost:8080 を見てHello, Worldが表示されていればまずは成功。

ところで[この強力そうな言語仕様](https://github.com/MLstate/opalang/wiki/Reference-card)で何をどう書くか…というのは**yesod**(HaskellのRailsみたいなやつ)見た時と同じ気持ちなんだよなあ…
Middleman Blog を Bourbon, Neat, and Bitters で styling したテンプレートを作りました


[middleman-blog-bourbon-template](https://github.com/5t111111/middleman-blog-bourbon-template)

Thoughtbot の [Styling a Middleman Blog with Bourbon, Neat, and Bitters](http://robots.thoughtbot.com/middleman-bourbon-walkthrough) という記事を読んでみて試しに作ったものです。

公開してみたものの、ぶっちゃけ自分ではブログを書かないので、優しいどなたかが試してくれることに淡い期待を抱いております。

## スクリーンショット

![screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/29846/733d93fa-6415-8b8b-9733-d840e23ed8bb.jpeg "screenshot.jpg")

## ふぃーちゃー

- テンプレートエンジンは [Slim](http://slim-lang.com)
- [middleman-syntax](https://github.com/middleman/middleman-syntax) を使ったシンタックスハイライト (ハイライトは [rouge](https://github.com/jneen/rouge) による)
- Neat のグリッドシステムを使ったレスポンジブデザイン

など。

## インストール

Middlemanをまだインストールしてなかったらインストールしてください。

```console
$ gem install middleman
```

### テンプレートをローカルマシンにclone

```console
$ mkdir ~/.middleman # if it doesn't exist
$ cd ~/.middleman
$ git clone https://github.com/5t111111/middleman-blog-bourbon-template.git blog-bourbon
```

### Middleman ブログを作成

```console
$ middleman init my-fantastic-blog --template=blog-bourbon
```

### Bitters をインストール

```console
$ cd my-fantastic-blog/source/stylesheets
$ bundle exec bitters install
```

### Bitters で Neat のグリッドシステム設定を有効化

`source/stylesheets/base/_base.scss` の以下の `@import` 行のコメントを外す。 

```scss
// Neat Settings -- uncomment if using Neat -- must be imported before Neat$
// @import 'grid-settings';$
```

### 起動

```console
$ bundle exec middleman
```

Webブラウザで `http://localhost:4567` にアクセスして見てみる。

## サイトの設定

`config.rb` で、最低以下の箇所を設定する。

- :site_url - Your blog URL
- :site_author - Author name of your blog
- :site_title - Your blog title
Backbone.js事始め その1


必要になったのと興味もあった為、`Backbone.js`を始めてみた。
そのHTMLテンプレートの覚え書き。サンプルで良く見かける動物クラスのパターン。

###ソースコード

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

	<title>Hello Backbone.js</title>
	<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
	<script type="text/javascript" src="http://underscorejs.org/underscore-min.js"></script>
	<script type="text/javascript" src="http://backbonejs.org/backbone-min.js"></script>
	<script type="text/javascript">
	(function() {
		//Model作成
		var Animal = Backbone.Model.extend({
			//デフォルトプロパティ
			defaults: {
				species: "Animal",
				name: "None"
			},
			//コンストラクタ
			initialize: function(){
				console.log("初期化処理 : " + this.get("species"));
			},
			//コンストラクタ(※間違い)
			// constructor: function(){
			//	console.log("初期化処理 : " + this.get("species"));
			// },

			//メソッド
			call: function(){
				console.log("動物 : " + this.get("species"));
				console.log("私の名前は" + this.get("name") + "です。");
			}
		});
		//Animalのインスタンス化	
		var none = new Animal();

		//Animal(犬)のインスタンス化	
		var dog = new Animal({
			species: "犬",
			name: "ポチ"
		});

		//Animal(猫)のインスタンス化	
		var cat = new Animal({
			species: "猫",
			name: "タマ"
		});


		//console.log(dog);
		//console.log(cat);
		console.log(none.toJSON());
		console.log(dog.toJSON());
		console.log(cat.toJSON());
		none.call();
		dog.call();
		cat.call();
	})();
	</script>
</head>
<body>
	<h3>Backbone.js</h3>
</body>
</html>
```

**疑問点**

* コンストラクタを定義した場合、`call`メソッド内で、プロパティを取得しようと`this.get("name")`するとエラーとなる。

* コンストラクタを定義した場合、`dog.toJSON()`をコールするとエラーとなる。コンストラクタまでは、JSON化できないからかな？ でも、メソッド`function()`と変わらない気がするが・・・。


別の機会に検証しようと思う。

*※※※追記 2014/09/18※※※*

* コンストラクタの定義の仕方が間違っていました。
`constructor:`ではなく、`initialize:`です。

```
	//コンストラクタ(※間違い)
	constructor: function(){
		console.log("初期化処理");
	},

```
```
	//コンストラクタ
	initialize: function(){
		console.log("初期化処理");
	},

```
werckerからslackにビルド結果のnotificationを送る

一応ここに全部書いてある

[Slack Notifications!](http://blog.wercker.com/2013/11/27/Slack-Notifications.html)

# slackのtoken取得

- トークンの取得はIncoming WebHooksから行う

`https://各ドメイン.slack.com/services/new/incoming-webhook`から

1. nortification送りたいチャンネルを選択し
2. `Add Incoming WebHooks`をクリック

![add_incoming.png](https://qiita-image-store.s3.amazonaws.com/0/15187/40f517d8-ab78-caf0-c251-a97cc4f06aca.png)

- トークンが作成されるのでコピー

1. サイドバーの`TOKEN`と書いてある箇所にtokenが表示されてるのでコピー

![token.png](https://qiita-image-store.s3.amazonaws.com/0/15187/afd49f48-b885-6a49-7787-612e03261da1.png)

# werckerのtoken設定

- ApplicationのPipelineにtokenをペーストする

1. `ENVIRONMENT VARIABLE`に適当な名前を付ける
  - `ENVIRONMENT VARIABLE`で付けた名前は`wercker.yml`内で変数として使用できる
2. `text`の`value`にコピーしたtokenをペースト
3. `protected`にチェックをしておく

![wercker.png](https://qiita-image-store.s3.amazonaws.com/0/15187/01f1b80e-59e3-c188-bb37-093760e87907.png)

# wercker.ymlに必要な記述を行ってビルド

今回は[wantedlyの方が](https://www.wantedly.com/companies/wantedly/posts/453)作った[step-pretty-slack-notify](https://github.com/wantedly/step-pretty-slack-notify)というのを使用している

記述はこんな感じ。適宜修正してください

```yaml
    after-steps:
        - wantedly/pretty-slack-notify:
            team: foobar
            token: $SLACK_API_TOKEN
            channel: general
```

こんな感じで通知されます

![result.png](https://qiita-image-store.s3.amazonaws.com/0/15187/1b6c2a6d-75b0-fc7c-5986-8f486a5f6afb.png)
【備忘録】EclipseとAndroid Studioの共存設定

自宅でAndroid Studioの環境を整えていましたが、うまく行っていませんでした。
で先人の知恵がありました。

##このTIPSが有効な人
Eclipse+ADTを利用している人がAndroid Studioと併用したい人

##PCに作業した内容(不具合が起こす現象)
EclipseでSDK manager、AVD Managerをインストールした状態でAndroid Studioをexeファイルからインストールした。

##現象
Android StudioでSDK ManagerとAVD Managerがうまく動作しない。

##原因
exeでダウンロードしたのでSDK Managerが別にインストールされたため。

##修正した内容
[Android StudioにおけるAndroidSDKやJDKのパス設定](http://qiita.com/hidekuro/items/d2aadb907c617a4554db)
File→Other Settings→Default Project
 Structure...→SDK LocationでAndroid SDK Locationの位置を今までのに変更

##おそらく共有するには
[Android Tools Project Site](http://tools.android.com/)からZIPファイルをダウンロードしてSDK　Locationを設定すれば成功すると思います。

##これから
プロジェクトを相互利用することも誰か書いていましたし、自分も試していこうと思います。
後、SDK Managerを別にインストールしてしまってプロジェクトを作成したら最新のAPIしかインストールされておらず、SDKのターゲット変更も書ければと思います。
【iOS】日時をNSStringからNSDateに変換する

NSDateFormatterの挙動でちょっとはまったのでメモ。
日時をNSStringからNSDateに変換する方法です。

## NSDateFormatter
NSString時間をNSDateに変換するために、ここではNSDateFormatterを使います。

例は後述しますが **注意が必要なのはタイムゾーンの指定** の箇所です。

タイムゾーンにはGMTからの経過時間をセットします。
GMTとはグリニッジ標準時のことで、世界のどこでも共通の時間になります。

NSDateFormatterでNSStringをNSDateに変換する際、タイムゾーンを指定しないと自動でローカル時間からGMTへの変換処理が入ってから出力されます。
つまり、 **ローカル時間の設定（設定>一般>日付と時刻で設定）によって出力結果が変わってしまう** ので、タイムゾーンは指定するようにしましょう。

ちなみにNSDateをNSStringに変換すると自動でローカル時間に変換してくれちゃうので、その逆ということなんですかね。

## そのままの時間でNSDateにしたい場合

タイムゾーン指定でGMTからの経過時間に0をセットしてあげると、NSStringで記載した日時そのままでNSDateに変換できます。

```objc
NSString* dateString = @"2014-09-14 15:45:00";
	
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//タイムゾーンの指定
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDate *date = [formatter dateFromString:dateString];
    
NSLog(@"date: %@",date);

```

	出力結果 date: 2014-09-14 15:45:00

## GMTなNSDateにしたい場合

NSStringをGMTなNSDateにしたい場合は、タイムゾーン指定の箇所にGMTからの経過時間をきちんとセットしてあげる必要があります。
例えばNSStringが日本時間の場合は、9時間をセットしてあげます。

```objc
NSString* dateString = @"2014-09-14 15:45:00";
	
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//タイムゾーンの指定
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:60 * 60 * 9]];

NSDate *date = [formatter dateFromString:dateString];
    
NSLog(@"date: %@",date);
	
```
	出力結果 date: 2014-09-14 06:45:00


## おわりに
ローカル時間の設定がどこになっていてもGMTは同じになるので、ある特定の時間と現在時刻を比較をする場合など、それぞれGMTに変換してあげると何かと便利だったりします。

ちなみにGMT/ローカル現在時刻は以下で一発で取得できますヨ！

```objc
//GMT現在時刻
NSDate* gmtNow = [NSDate date];

//ローカル現在時刻
NSDate* localNow = [NSDate dateWithTimeIntervalSinceNow:[[NSTimeZone systemTimeZone] secondsFromGMT]];
```
Herokuでさくっと静的ページを公開する


ちょっとしたHTMLを共有したいときに便利だったので共有します。

```bash
$ git clone https://github.com/nulltask/heroku-static-provider.git static-site
$ cd static-site 
```

`public`というディレクトリがあるので公開したいHTML類をコピーして、リポジトリにコミットします。

```bash
$ git add .
$ git commit -ma'Add static html'
```

Herokuにアップします。

```bash
$ heroku create
$ git push -u heroku master
```

ブラウザを開いて、アップしたファイルを表示します。

```bash
$ heroku open
```

Basic認証をかけたい場合は、下記の環境変数を設定します。

```bash
$ heroku config:set USER=username
$ heroku config:set PASS=password
```
TypeScriptでjQueryPluginの型定義ファイルを作る

TypeScriptでjQueryPluginの型定義ファイルを作るときのメモ。
interfaceであるJQuery型を拡張して作る。TypeScriptはinterfaceを定義した後にまた拡張することができる。

```ts

interface JQuery {
    hogehoge(val?:string):JQuery;
}
```

こんなかんじでJQuery型を拡張する。引数があればその型もちゃんと書く。
もしオブジェクトを引数に渡す場合は、

```ts

interface hogehogeObj{
    val :number;
    st : string;
}

interface JQuery{
    hogehoge(val:hogehogeObj):JQuery
}

```

のようにオブジェクトの中身をちゃんと定義する。
思っていたほど難しくないので、いろいろ作ってみたくなる。
SKK で舊字舊かなと新字新かなを切り換へられる設定を書いた．

SKK で舊字舊かなと新字新かなを切り換へられる設定を書いた．

#以下を home directory に置く：

ldic_kyuji.dic --- 北極三號改の辭書 npiiii.l.euc をこの名にしておく．
udic_kyuji.dic --- 舊字舊かなの user 辭書．
udic_kyuji.dic.BAK --- 舊字舊かなの user 辭書の backup.

ldic_shinji.dic --- SKK-JISYO.L をこの名にしておく．
udic_shinji.dic --- 新字新かなの user 辭書．
udic_shinji.dic.BAK --- 新字新かなの user 辭書の backup.

#以下を init.el に記述する：

```el:init.el
(setq skk-large-jisyo "~/ldic_kyuji.dic")
(setq skk-jisyo "~/udic_kyuji.dic")
(setq skk-backup-jisyo "~/udic_kyuji.dic.BAK")

(defun kyu-shin (x) (replace-regexp-in-string "kyu" "shin" x))
(defun shin-kyu (x) (replace-regexp-in-string "shin" "kyu" x))

(defun shinji-to-kyuji nil
  (interactive)
  (progn 
    (skk-mode -1)
    (skk-save-jisyo)
    (setq lub (list skk-large-jisyo skk-jisyo skk-backup-jisyo))
    (setq newlub (mapcar (function shin-kyu) lub))
    (setq skk-large-jisyo (nth 0 newlub))
    (setq skk-jisyo (nth 1 newlub))
    (setq skk-backup-jisyo (nth 2 newlub))
    (skk-mode 1)))

(defun kyuji-to-shinji nil
  (interactive)
  (progn 
    (skk-mode -1)
    (skk-save-jisyo)
    (setq lub (list skk-large-jisyo skk-jisyo skk-backup-jisyo))
    (setq newlub (mapcar (function kyu-shin) lub))
    (setq skk-large-jisyo (nth 0 newlub))
    (setq skk-jisyo (nth 1 newlub))
    (setq skk-backup-jisyo (nth 2 newlub))
    (skk-mode 1)))

(defun toggle-jitai nil
  (interactive)
  (cond 
   ((and 
    (equal skk-large-jisyo "~/ldic_shinji.dic")
    (equal skk-jisyo "~/udic_shinji.dic")
    (equal skk-backup-jisyo "~/udic_shinji.dic.BAK"))
   (shinji-to-kyuji))

   ((and 
    (equal skk-large-jisyo "~/ldic_kyuji.dic")
    (equal skk-jisyo "~/udic_kyuji.dic")
    (equal skk-backup-jisyo "~/udic_kyuji.dic.BAK"))
   (kyuji-to-shinji))
   ((t nil))))

(defun show-lub nil
  (interactive)
  (setq lub (list skk-large-jisyo skk-jisyo skk-backup-jisyo))
  (princ lub))

(global-set-key [f8] 'toggle-jitai)
(global-set-key (kbd "C-<f8>") 'show-lub)
```

#結果
Emacs および DDSKK の起動時は舊字舊かなで入力できる．
F8 で舊字舊かなと新字新かなを toggle できる．
C-F8 で現在の状態を表示できる．
systemd/CODING_STYLEの抄訳

http://cgit.freedesktop.org/systemd/systemd/tree/CODING_STYLE の抄訳。正確な情報を得たい場合は、原文を参照のこと。

- 8スペースのインデント、タブは使うな
- 1行80文字制限はしない。長すぎるのは良くないが、140文字以内で十分だろう
- 変数や関数は必要がなければstaticでなければならない
- 構造体の名前はMixedCase (公開APIは例外)、変数や関数はlower_case
- The destructors always unregister the object from the next bigger
  object, not the other way around
  - next bigger objectというのが不明だが、
   おそらく、[data collection]->(parent object)->(child objects)という
   関係があったときに、parent objectを解放するなら、まず[data collection]
   からparent objectを取り出してから、解放処理を行なえという意味だと思われる
- キャストでなくユニオンを使おう
- デストラクタは中途半端に初期化されたオブジェクト群も後始末できるようにすべきだ
- エラーコードは負のerrnoにすること
- stdout/stderrに正しく書けたかどうかエラーチェックはしなくて良い
- ライブラリのコードからエラーログを出力するな (DEBUGログはOK)
- OOMは常にチェックしろ。例外はない
- PID=1のプロセスからNSSリクエストはするな。デッドロックを起こすかもしれない
- PID=1のプロセスから、他のサービスに同期通信するな。デッドロックを起こすかもしれない
- 最大値が決まっててそれが小さいのでなければ、固定サイズの文字列バッファを使うな
- Stay uniform. For example, always use "usec_t" for time
  values. Do not usec mix msec, and usec and whatnot.
  - (いまいちよく分かっていない) 一貫性を保て。例えば、時間を表わす値には常にusec_tを使って、usecとmsecを混ぜないとか
- _cleanup_free_系のマクロを使え
  - [cleanup属性 - Qiita](http://qiita.com/ozaki-r/items/954837377a712c531832)
- 浮動小数点数を文字列化したりパースするときは特別に注意しろ。locale依存だから
- 強制はしないが、関数定義は：
  void foo()
  {
  }
  ではなく
  void foo() {
  }
  を使おう
- foo ()と書くな、foo()と書け
- 文字列一致判定にはstrcmp()の代わりにstreq()を使ってくれ
- コードの途中で変数定義をしないでくれ。(関数途中の{}の始めなら良いのかな？)
- 配列を作るのでもなければ、floatじゃなくてdoubleを使うのが常に良い
- 変数定義行で関数を呼ぶな
- クリーンナップ処理にはgotoを使え。そして、それ以外のことにgotoを使うな
- 変数の型についてよく考えろ。もし負の数にならないならばsigned intでなくunsigned intを使え
- shortを使うな
- 公開APIは_public_マクロとマークされて、sd_プリフィックスを付けなければならない
- 公開APIでは、必ず引数をチェックしてassert_returnでエラーコードを返さなければならない
  - [systemdのassert_returnマクロ - Qiita](http://qiita.com/ozaki-r/items/8dbef5a75670b88bdb7e) 
- strtolやatoiといった関数は決して使ってはならない。代わりにsafe_atoliやsafe_atou32を使え
- 関数を書く時は、それがログを取る関数かそうでないかをよく考えるべきだ
- いくつかの例外を覗いて、staticローカル変数は避けるべきだ。スレッドセーフのことを考えろ！
- オプション解析に関して
  - エラー時に、完全なhelpメッセージを出力するな。そのエラーに関することだけ出力しろ
  - エラー時にはstdoutに出力するな
  - 必要でないならPOSIX_ME_HARDER (POSIXLY_CORRECT)にするな。例えば、+プリフィックスとか
      - [POSIX_ME_HARDER - Qiita](http://qiita.com/ozaki-r/items/871a0b46084db783e106)
      - http://www.opengroup.org/austin/docs/austin_239.html
Ruby Code Golf Technic

# Ruby Code Golf Technic

## 概要
Rubyのコードゴルフテクニックについて。
随時更新していこうかと思っています。

私自身ゴルファーではないので、基本的なテクニックが中心となります。

あくまでRubyの話題をメインにして、
言語に依存しないスペースの削除だとか、
数式の変換だとかについては割愛したいと思います。

## 標準出力
### $><<
print よりも 1文字短く書ける

~~~ruby
print"hoge" # => hoge
$><<"hoge" # => hoge
~~~

### print
引数が可変長配列をとり、それぞれを to_s した結果を出力してくれるため
splat演算子と併用して短く書けるケースがある。

~~~ruby
a = [*1..5]
print *a # => 12345
~~~

### p
メソッド名が短いのだが、

* inspect した値が出力される
* 可変長の引数に配列を指定した場合に改行区切りで出力される

という機能のため、ゴルフでは出番が少なめかも。

~~~ruby
a = [*1..5]
b = [*'a'..'e']
c = 123
p *a
# => output is ...
# 1
# 2
# 3
# 4
# 5
p b.join # => "abcde"
p c # => 123
~~~

### putc
文字コードがわかっている状態での標準出力が必要な場合に有効

~~~ruby
$><<65.chr # => A
putc 65 # => A
~~~

## 文字、文字列リテラル
### ?を利用
1文字の場合、 ?記法を利用することで短くかけます

~~~ruby
puts ':' # => :
puts ?:  # => :
~~~

### シンボル
最終的に暗黙の to_s を利用できることが想定されるなら
シンボルを利用することで文字列を短く記述できます。
標準出力時に print や puts が to_s を利用して変換してくれるため、
併せて利用しやすいテクニックです。

~~~ruby
puts 'hoge' # => hoge
puts :hoge  # => hoge
~~~

### 文字列から任意の位置の文字を取得
String#[] メソッドで文字列中の任意の文字を取得出来ます

~~~ruby
puts 'hoge'.split('')[1] # => o
puts 'hoge'.chars[1] # => o
puts 'hoge'[1] # => o
puts 'hoge'.chars[1..-1]*'' # => oge
puts 'hoge'[1..-1] # => oge
~~~

## グローバル変数,クラス変数,インスタンス変数の文字列展開
`#{各種変数名}` を `#各種変数名` というように、 `{}` を省略できます

```ruby
class Hoge
  def hoge
    @a=1 # => インスタンス変数
    @@b=2 # => クラス変数
    $c=3 # => グローバル変数
    d=4 # => 変数（通常の変数は省略できない）
    puts "#@a,#@@b,#$c,#d"
  end
end

Hoge.new.hoge
# => 1,2,3,#d
```

## 文字列配列の連結
普段のプログラミングでは Array#join を利用する場面ですが
join の alias である Array#* を利用することで短くかけます

~~~ruby 
puts [*1..5].join(':') # => 1:2:3:4:5
puts [*1..5]*':' # => 1:2:3:4:5
~~~

## 文字列の置換
`sub!` による置換を `[regexp]=` による置換で短くする

~~~ruby 
str = "0123456789"
str.sub! /[2-4]/,'@'
puts str # => 01@3456789
str = "0123456789"
str[/[2-4]/]='@'
puts str # => 01@3456789
~~~

## 補足
編集リクエストを歓迎致します。

Ruby 2.0 以上共通のテクニックなら特にバージョンに関する記載不要。
1.9,2.0,2.1 など、バージョン依存のテクニックの場合はバージョン情報を記載。
Ruby 1.8 以下については対象外。

以下のフォーマットが基本。

* 見出しレベル2 大分類
* 見出しレベル3 中分類
* 簡単な説明
* 短縮前後と出力内容が分かるサンプルコード

ある程度利用頻度の高そうなもので。
あまりに状況限定のものは挙げ出すときりがないかなと。

## 参考資料
* るびまゴルフ  
    http://magazine.rubyist.net/?0021-RubiMaGolf
XCode6で実機で出力されているログを確認する


1. 実機をMacに繋いで、XCodeを立ち上げる
2. 【Window】>【Devices】を選択
3. 左側に表示されている【DEVICES】から繋いだ端末を選択して、画面下の赤線で囲ったマークをクリックする
![スクリーンショット 2014-09-16 21.35.34.png](https://qiita-image-store.s3.amazonaws.com/0/30441/24397717-759c-82e7-4f33-1791e69697f0.png "スクリーンショット 2014-09-16 21.35.34.png")
4. Windowが開いてログが表示される
![スクリーンショット 2014-09-16 21.35.55.png](https://qiita-image-store.s3.amazonaws.com/0/30441/ec9abf9e-2e36-1f94-1442-4e44ac509ded.png "スクリーンショット 2014-09-16 21.35.55.png")
Material Design のアイコンをアプリに取り入れる


## はじめに
Google Play や Chrome など、Google 公式アプリで新しいアイコンが使われだしたので、アプリを今っぽくするにも徐々に導入したいですね。

## ファイルダウンロード
ここにありました。
https://dribbble.com/shots/1697054--SVG-Sketch-Material-Icons-Pack

Material_Design_Icons.sketch.zip

### 商用利用 OK?

> Are these free for commercial use as well?

という質問への回答は

> Yes, they are.

だそうです。

## Android Asset Studio でファイルを作る
ダウンロードしたフォルダを解凍したら、アプリに取り入れたいアイコンを AssetStudio から作成します。
http://romannurik.github.io/AndroidAssetStudio/icons-actionbar.html

出来上がったフォルダを res フォルダに追加してあげれば終了！超簡単ですね！


### 参考：Android Asset Studio

* IMAGE から素材を選択します
* TRIM, PADDING はそれぞれ TRIM, 0% を指定します（ガイドラインに沿った PADDING を自動で補完してくれます）
* NAME でファイル名を指定します
* THEME で HOLO LIGHT, HOLO DARK 用のアイコンカラー、もしくは、カスタムカラーを指定します（カスタム時はアイコンの透明度も指定できます）

ちなみにこの素晴らしいサービスですが、Google で働く UI デザイナーの Roman Nurik によるものです。
https://github.com/romannurik

![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/39324/9ff2cc14-b9ce-b280-916b-481cf04e9ecb.png "qiita2.png")
FontAwesomeをAndroidで使う

FontAwesomeをAndroidで使うライブラリは[Android-Bootstrap](https://github.com/Bearded-Hen/Android-Bootstrap)を筆頭にいくつかあるのだけど、いらないものもついてくるので、純粋にアイコンだけに特化したライブラリを作った。

その名も捻りなく

[FontAwesomeIcon](https://github.com/hiroq/FontAwesomeIcon)

いまはFontAwesomeは4.2.0だけど、いずれバージョンアップするだろうから、最新版のFontAwesomeに追従するためのユーティリティスクリプト同梱です。
声に出して読みたい Android のライブラリ - その2

[声に出して読みたいObjective-Cのライブラリ8種(2014.7)](http://qiita.com/hayashi311/items/85f62d98f05bee23a312) に触発されて書いてみます。

---

前回は[こちら](http://qiita.com/KeithYokoma/items/68c076ebe7fc6829e88e)

---

# [android-promise](https://github.com/hnakagawa/android-promise)

https://github.com/hnakagawa/android-promise

Android フレームワークにおける Promise の実装です。[Bolts](https://github.com/BoltsFramework/Bolts-Android) は厳密には Promise ではなく（どこでそのスライドを見たのか忘れてしまった…）、[継続](http://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A) をベースにしているライブラリで、なにやら最近はちょっと違うものも含まれるようになってきましたが、こちらは純正の Promise の実装です。もう一つ、[jdeffered](https://github.com/jdeferred/jdeferred) もありますが、jdeffered については[こちら](http://qiita.com/chuross/items/6a572c34189c24f5ea5e)を御覧ください。

Android でよくある、非同期処理とライフサイクルオブジェクトの関係で起こる悩ましいバグにうまく対応するため、Promise を生成するときにライフサイクルオブジェクトを登録するのが特徴です。これによって、ライフサイクルオブジェクトが死を迎えた場合、ライブラリ側でコールバックの後処理をしてくれます。

その他は Promise のことを解説している記事に任せておきます。

# [butterknife](https://github.com/JakeWharton/butterknife)

https://github.com/JakeWharton/butterknife

View のインスタンスをフィールドに注入してくれるライブラリです。安心と信頼の JakeWharton 先生の力作でございます。

`Butterknife#inject(Activity)`すると、`@InjectView`アノテーションのついたフィールドに、対応する View のインスタンスがセットされます。この他、クリックイベントを受け付けるメソッドにもアノテーションをつけることで、対応する View のクリックイベントのリスナとして自動で設定してくれたりして、何かと便利です。

`Fragment`で使う場合は、`Fragment#onCreateView()`で`Butterknife#inject(Object, View)`し、`Fragment#onDestroyView()`で`Butterknife#reset(Object)`をする必要がありますので、忘れないようにしましょう。

# [timber](https://github.com/JakeWharton/timber)

ロギングをデバッグ版とリリース版で柔軟に変更できるようにするためのライブラリです。安心と信頼の JakeWharton 先生の力作でございます。

多くの場合、デバッグ版は timber で標準に用意されている、Logcat 用のログ出力を使用することでしょう。開発者は、自分で好きなログ出力先を設定することができます。出力レベルの設定も簡単（というかレベルごとに自分で好きに選択できる）です。例えば、Crashlytics にログを飛ばしたり、Google Analytics にログを飛ばしたりということが、あちこちで個別に書くこと無く、timber を経由すればいいだけになります。
Artisanをコード内で実行する

##はじめに

LaravelのソースコードからArtisanコマンドを呼び出してみました。

## かいてみる

```php:test.php

Artisan::call('test:helloworld');

```

めちゃくちゃ簡単でした。
これでrocketeer使ってボタン押下でデプロイできる！
nmap デフォルトの対象ポート＆その他のオプション

# はじめに
nmapでポートスキャンするときの対象ポートの指定、なにも指定しなければ nmap-services にあるポートが対象だと思っていたらそれは昔の話で今は指定無しだと決まった1000ポートが対象だった。nmap-services にあるポート対象にしたい場合には、「--port-ratio=0.0」 をつける必要あり。

せっかくだからよく使うオプションもまとめておいた

# 例
**※自分の所有しているホスト以外には絶対にかけないこと！！！**

* Ex: 利用される可能性が高いポートに対してTCP SYNスキャン
`$ sudo nmap -v -sS -oA nmap_outout --port-ratio=0.0 対象のIPアドレス`

* Ex: 利用される可能性が非常に高いポートに対してTCP SYNスキャン
`$ sudo nmap -v -sS -oA nmap_outout 対象のIPアドレス`

* Ex: 全ポートに対してTCP SYNスキャン
`$ sudo nmap -v -sS -oA nmap_outout -p- 対象のIPアドレス`

* Ex: 全ポートに対して、ホストの存在確認をせずにTCP SYNスキャン
`$ sudo nmap -v -sS -oA nmap_outout -p- -P0 対象のIPアドレス`

# 代表的なオプション

* スキャン方法
    * -sS : TCP SYNスキャン（TCPハーフオープンスキャン）。ステルススキャンと言われる奴。普通これ使う。root権限必要
    * -sT : TCPコネクトスキャン。root権限不要。相手側のログに間違いなく残る
    * -sN, sF, -sX : firewall越えられるかも知れないけど openとfilterdの区別がつかないとかWindows相手だと全部closeになるとか。 root権限必要
* ポートの指定
    * 指定無し：代表的な1000ポート
    * -p- : 全ポート
    * --port-ratio=0.0 : nmap-services ファイルにある全てのポート
        * CentOS 7 なら /usr/share/nmap/nmap-services
        * 数字(0.0)を大きくすることで対象を減らせる。nmap-services ファイル内の「open-frequency」が指定より大きいポートが対象となる
* 出力形式
    * -oA HeadOfFilename : 通常出力・grep用出力・XML出力の全てを行う
* ホストの検知（存在確認）
    * 指定無し：ICMP pingとか代表的なポートの確認でホストの検知をする
    * -P0 : ホストの検知をおこなわず問答無用でスキャンする
* その他
    * -v : 色々状況とか出力する
    * -O : OS検出機能。root権限必要
iOS Simulatorを任意の拡大/縮小率で表示する


iOS SimulatorでiPhone6 Plusを選択してレイアウトのテストをしていた時に、思った通りのレイアウトにならず小一時間悩みました。よくみると今使っているモニター(1920x1080)ではウインドウ枠の関係もありScaleを50%にしても縦レイアウトで全体を表示できていないではありませんか...。

　　↓最小の５０％でも全体を表示できてない！
![スクリーンショット 2014-09-16 20.04.24.png](https://qiita-image-store.s3.amazonaws.com/0/14768/18ec27a7-f9b5-4994-0834-9c26b595c668.png "スクリーンショット 2014-09-16 20.04.24.png")

これはなんと言う凶悪さ。やはり実機を買うしか(ry。

# 解決方法

シュミレーターを開くときの拡大率を指定する方法がありました。

0.4倍で開く場合
> defaults write com.apple.iphonesimulator SimulatorWindowLastScale 0.4

ターミナルより上のコマンドを入力してからiOS Simulatorを開きます。最後の数字が倍率になっています。文字はやはり潰れますが、全体が見えないよりはマシだと思います。

スケールをメニューから変更するとその値が保存されますので、iPhone6 Plusの画面のテストをしたい時に都度コマンドラインから打つ必要があります。シェルスクリプト等で登録しておくのが良いかと思います。

でも、文字が潰れて見難いのでやっぱり実機を買うしか(ry
RailsでつくるAPIサーバのドキュメントを自動生成してくれるAutodocを使っていて気をつけること


Autodocとはなんぞやという方は[こちらの記事](http://blog.inouetakuya.info/entry/2013/10/20/132928)を参照。
公式は[こちら](https://github.com/r7kamura/autodoc)

で、大変便利なAutodocだけど、注意点が２つ。

まず一点目はRspec3で動かない点。[プルリクが上がってる](https://github.com/r7kamura/autodoc/pull/7)が、取り込まれてない。

なので、forkして使ってる人が結構いる感じ。


２点目、通信が発生しているところでマークダウンが生成されるので、shared_exampleとか使って、そこで実際の通信が発生するようなものは、ドキュメントが全てshared_exampleがあるファイル名で生成されてしまう。

具体的に言うと、例えば[こちらの記事](http://qiita.com/milkcocoa/items/5a4656ee1fd51e86e57e)のようなヘルパーメソッドを用意して、これでAUTODOC=1でAPIのテストを全て行った場合、shared_exmpleを呼び出している個別のspecファイルではなく、doc/support/api_helper.mdというドキュメントが生成されてしまう。

こうなるのは仕方がない気がするので、autodocを使ってドキュメントを生成する場合は、Autodocで記録する個別のexampleの中でgetやpostを投げる感じで。
Trello使ってみた


## 使用環境および初期設定
- Chrome
- Chrome Web Storeから[Plus for Trello](https://chrome.google.com/webstore/detail/plus-for-trello/gjjpophepkbhejnglcmkdnncmaanojkf)入れる
- [ショートカットキー](https://trello.com/shortcuts)を覚える
- Board毎にPower Upsを設定
- Trelloのタブを固定する(Ctrl+1などで素早くアクセスする)
- Chromeより通知を受け取る

### Plus for Trelloセットアップ
- Chrome Web Storeから[Plus for Trello](https://chrome.google.com/webstore/detail/plus-for-trello/gjjpophepkbhejnglcmkdnncmaanojkf)入れる
- Plus for Trello Help(上にある?マーク)からGoogle syncのClick to setup syncをclick
- Spreadsheetをセットアップする

### Notificationのセットアップ
- 右上の鐘マークからAllow Desktop Notificationsを設定

### Notificationをすぐに行うようにする
- 右上の鐘マークからChange Notification Email Frequency
- PeriodicallyからInstantlyに変更する

## 使い方
### リスト（候補）
- To Do
- Doing 実施中タスク
- In Review　レビュー中のタスク
- Done　完了タスク
- Docs ドキュメント類
- Waiting 待ちタスク
- Bug Reports
- Upcoming　近日中にやるかもタスク
- Someday　いつかやるタスク

### 主な流れ
1. カードを作成し、タイトルを入れる(N、入力後Shift+Enter)
2. カードの詳細を表示し[E]にざっくりした見積（1時間で1）を入れる
3. 担当を割り当てる(a)、自分を割り当てる場合は(spaceキー)
3. カード（タスク）にとりかかる カードをDoingに移す(>)
4. 詳細情報があれば、descriptionに入れる
5. checklistを場合によって使用する
6. カードタスク完了時、[S]に実績を入れて、Doneに(>)

※()内は主にショートカットキー

### ABC
- Plus for TrelloではE=SとしてR（残り掛かりそうな時間）=0とするのが重要、追加があったら見積も追加する
- E>Sだと、まだ作業が残っているとみなされる
- Eはマイナス値も入力できるので、早く終わったら-で減算して=にする

### 参考
- [Trello と Scrum for Trello を使用した弊社の開発チームタスク管理方法](http://tech.oga-ria.com/start-trello-and-scrum-for-trello/)
- [ポモドーロと Trello によるタスク管理（3 of 3 : Trello 編） ](http://enk.hatenablog.com/entry/2014/03/16/214141)
- [Trello のススメ](https://gist.github.com/voluntas/7177552)
- [Trello Resource](https://trello.com/b/nPNSBZjB/trello-resources)

### その他Chromeウェブストアからのインストールしたもの
- [Cards View' Filter for Trello](https://chrome.google.com/webstore/detail/cards-view-filter-for-tre/dlhlalojbpdheikhbpnbpmgidllcejeb/related)
- [Show Card Numbers for Trello](https://chrome.google.com/webstore/detail/show-card-numbers-for-tre/pjhjdehkaggmpebggjonlhleidlodepi)
UIが改善されたEaseUS Todo Backup 7.0

EaseUS Softwareが8月14日にリリースしたTodo Backup 7.0はバージョン6.5と比べて、UIがかなり改善され、変更があると自動的に指定したファイルをバックアップする「スマートバックアップ」をも追加されました。

Todo Backupはホームユーザ及びビジネスユーザ向けの安全かつ安定なバックアップソフトで、ディスク/パーティションのバックアップ、ファイルバックアップ、システムバックアップ、パーティションクローン、システム移行、サーババックアップなどをワンクリックで完成できます。

無料版のEaseUS Todo Backup Freeはその使いやすさ及び豊かな機能でユーザに人気が高く、かなり評価されています。

無料版を見てください：http://jp.easeus.com/backup-software/free.html

![tbf-2.png](https://qiita-image-store.s3.amazonaws.com/0/51008/80b1ac67-f055-89a1-f78b-cf7cbf81912f.png)


人気な有料版　EaseUS Todo Backup Workstation：

http://jp.easeus.com/backup-software/workstation.html
publicからアクセスできない場所にあるバイナリ画像を表示する


```
def get_image(params)
  send_data(
    File.binread("/tmp/#{params[:tmp_filename]}"),
    filename: params[:filename],
    type: params[:type], # content-type
    disposition: "inline"
  )
end
```

こんな感じで、後は`controler`に設定してアクセスする。
"504 Gateway Time-out" when sending mail by SMTP in CodeIgniter 

## What happened?

The source code:

```php

$config['protocol'] = 'smtp';
$config['smtp_host'] = $this->config['smtp_host'];
$config['smtp_user'] = $this->config['smtp_user'];
$config['smtp_pass'] = $this->config['smtp_pass'];
$config['smtp_port'] = $this->config['smtp_port'];
$config['charset'] = 'utf-8';
$config['wordwrap'] = TRUE;

$this->_CI->email->initialize($config);

$this->_CI->email->from($from_email, $from_name);
$this->_CI->email->to($to);
$this->_CI->email->subject($subject);
$this->_CI->email->message($body);

return $this->_CI->email->send();
```

Same source code, different SMTP server and user/password, some server/user run out with the "504 Gateway Time-out" error:

![QQ截图20140916150506.png](https://qiita-image-store.s3.amazonaws.com/0/2179/aadf45b1-50cc-fc34-034c-799a3a76326e.png)


It seems the action is depending on the SMTP servers.

## How to fix this error?

Add these two lines in your code:

```php
$config['newline'] = "\r\n";
$config['crlf'] = "\r\n";
```

This will make it working.

***reference:***

https://ellislab.com/forums/viewthread/88690/