OmniAICreator/Qiita-1.07M huggingface dataset:
XPathで指定したテキストがある次の要素を取得する方法

(備忘録です）

##本文
XPathはHTMLなどで使えるノードを抜き出せる言語です。

PHPやPythonなどいろんな言語で利用できます。
XPathの構文などはチートシートなどを参照してください。

あと便利機能ですが、**Google Chrome**の**Developer Tools**でCtrl+Fなどで呼び出せる検索(Find)ボックスにXPathを入力し対象ノードを検索することが出来ます。



では、
http://qiita.com/about

このページから以下の図のような
「細かい検索オプション」の**次のPタグ**を抜き出したいと思います。


![スクリーンショット 2015-03-10 22.34.47.png](https://qiita-image-store.s3.amazonaws.com/0/15024/0ae0288d-1e77-9f31-4c42-90bb74b7a058.png)



では、おもむろに、以下の図のように
**Google Chrome**の**Developer Tools**の「細かい検索オプション」のノードを右クリックし、「Copy XPath」をクリックします。

![スクリーンショット 2015-03-10 21.46.27.png](https://qiita-image-store.s3.amazonaws.com/0/15024/5892b8f3-6554-d80e-d4a8-7b67cd0f0e41.png)

すると、以下の様なXPathをクリップボードにコピーできます。

```text:XPath-細かいオプション
//*[@id="main"]/div/div/div/div/h3[2]
```

もちろんこのまま検索ボックスに入力すると対象ノードを検索できます。

すこしこれを弄って、
/following::p を追加すると　前半の対象ノードの結果を用いた検索ができます。

（h3[2]の代わりにtext()=などにしてなんとなく汎用性）


```text:XPath-「細かいオプション」の次のPタグ
//*[@id="main"]/div/div/div/div/*[text()="細かい検索オプション"]/following-sibling::p
```

**following-sibling**の代わりに**Parent**等色々できます。


DOM構造も任意にするとこんな感じですかね。

```text:XPath-「細かいオプション」の次のPタグ-2
//*[text()="細かい検索オプション"]/following-sibling::p
```

##参考


ＸPath チートシート 
http://aoproj.web.fc2.com/xpath/XPath_cheatsheets_v2.pdf

XPath
http://itref.fc2web.com/xml/xpath.html
Upstartのスクリプトをデバッグする


`script` や `post-start script` 内に書いたスクリプトのデバッグ方法。

```sh
script
  exec > /tmp/my-log 2>&1
  set -x
  :
end script
```

[Add Persistent Log Entries to Job Definition Files](http://upstart.ubuntu.com/wiki/Debugging#Add_Persistent_Log_Entries_to_Job_Definition_Files)
【c++】SQLCipherを導入してみた

[元ブログ、【c++】SQLCipherを導入してみた - 技術は熱いうちに打て！](http://blog.dalt.me/1095)

SQLiteはただのファイルですので高度な知識を持った
ユーザには中身を見られたり改竄される恐れがあります。
このSQLiteを暗号化する一つの手法として2008年8月にリリースされたSQLCipherです。

[Full Database Encryption for SQLite](https://www.zetetic.net/sqlcipher/)
オープンソースであり、SAMSUNGやxeroxを始め様々な企業に導入されているそうです。

今日はこれの導入方法について書きます。

## 無償で使うには

SQLCipherは有償です。
ですが、それは予めビルドされたライブラリを導入する場合です。
1developer辺り499$です。(2015/03/10時点)

ですが、ライセンスを明記した上で自分でソースコードからビルドすれば無償で使うことも可能です。
では、ソースコードからビルドして使ってみましょう！

### 開発環境
```
OS X 10.10.2
XCode6.1.1
C++11
```

## ダウンロード

### openssl

現状最新は1.0.2ですのでこれをダウンロードします。
```
$ curl -o openssl-1.0.2.tar.gz http://www.openssl.org/source/openssl-1.0.2.tar.gz
$ tar xzf openssl-1.0.2.tar.gz
```

### SQLCipher
```
$ git clone https://github.com/sqlcipher/sqlcipher.git
```

### openssl-xcode
```
$ git clone https://github.com/sqlcipher/openssl-xcode.git
```

## パスの追加

Xcodeで[Xcode] - [Preferences] - [Locations] - [Source Trees]に以下を追加します。

[Name] - OPENSSL_SRC
[Display Name] - OPENSSL_SRC
[Path] - (例) $(PROJECT_DIR)/../libs/openssl-1.0.2

![Locations_example](http://blog.dalt.me/wp-content/uploads/2015/03/Locations_example.png)

## プロジェクトの追加

gitでcloneしてきたフォルダ内のxcodeprojをプロジェクトに追加します。
この際、
<strong>ドラッグアンドドロップではなく[プロジェクトを右クリック] - [Add Files to "ProjectName"]</strong>で追加する様にしてください。

そして、targetにチェックが付いている事を確認してAddをクリックします。

## Build Phasesの設定

### Target Dependencies

[Project] - [Build Phases] - [Target Dependencies]で
cryptoとsqlicipherを追加します。

![Add_items](http://blog.dalt.me/wp-content/uploads/2015/03/Add_items.png)

### Link Binaries With Libraries

[Project] - [Build Phases] - [Link Binaries With Libraries]でlibcrypto.aとlibsqlicipher.aを追加します。

![Add_frameworks_and_libraries](http://blog.dalt.me/wp-content/uploads/2015/03/Add_frameworks_and_libraries.png)
## C フラグの設定

[Project] - [Build Settings] - [Other C Flags]の全Build Configuration分-DSQLITE_HAS_CODECを追加します。

![other_c_flags](http://blog.dalt.me/wp-content/uploads/2015/03/other_c_flags.png)

## ビルド！

ここまできたらビルドしてみてください。
上手く設定出来ていればコンパイルは通るはずです。

## コードで導入

とても簡単です。

```cpp
string dbName = "test.db";
auto filePath = FileUtils::getInstance()->getWritablePath() + dbName;
    
auto status = sqlite3_open(filePath.c_str(), &db);
string key = "v179g41b3u14b8710fb23fb38";
sqlite3_key(db, key.c_str(), static_cast<int>(strlen(key.c_str())));
```

データベースをopenした後にsqlite3_keyを実行するだけです。
この例で言えばv179g41b3u14b8710fb23fb38がパスワードになります。

## 注意

一つだけ注意があります。

当たり前と言えば当たり前なのですが、
上で示した <strong>sqlite3_keyはdatabase作成時に実行</strong>されなければなりません。
言い換えれば作成されているdatabaseに途中からSQLCipherを充てることは出来ません。

なので、もうSQLiteを利用するアプリをリリースしている際は一手間必要かもしれませんね。

誰かのお役に立てば。
公開鍵登録フロー

#### gitlabなどにsshkeyを登録する方法memo
1.以下コマンドを叩く
```
ssh-keygen -t rsa
```
2. Enter×3回
```
enterating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
```
3. 以下コマンドで出てくる、ssh-rsaで始まる英数字の羅列をコピー
```
cat ~/.ssh/id_rsa.pub
```
4. ex. gitlabの場合:以下url先のkey部分に3でコピーしたものを入れる
```
ドメイン名/profile/keys/new
```
5. add keyで完了
何となく思いついた遊びをメモしていく




```php56.php
$hoge = [];
$hoge["default"] = function(...$args){echo "＞「しりません」";};
$hoge["ツイッター投稿ボタン"] = function($tweet){echo $tweet."＞「しません」";};
$ordercmd = "ツイッター投稿ボタン";
isset($hoge[$ordercmd])?$hoge[$ordercmd]("「ツイートしてよ」"):$hoge["default"]("「ツイートしてよ」");
```
フロントコントローラーについてメモ


rewriteでの実装

### 参考サイト

http://randd.kwappa.net/2008/05/01/18

```
<Directory "/path/to/docroot/app_dir/">
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) /app_dir/router.php/$1 [L]
</Directory>
```

オプションは…
-f : ファイルが存在すればtrue
-d : ディレクトリが存在すればtrue

つまり上記オプションでは「ファイルもディレクトリも存在しなければリクエストをルータに向ける」という設定になる。

### 上記を参考に考える

ファイルが存在するときだけにする、cssが崩れたりした。
でも詳しく検証してない。css関連だろうか。ああ、拡張子が違うときにうまく処理できなかったのかな。

```
<Directory "/path/to/docroot/app_dir/">
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) /app_dir/router.php/$1 [L]
</Directory>
```

ファイルが存在無視。
コントローラー側での処理が増えるかな。header(404);的な。
これ採用した。

```
<Directory "/path/to/docroot/app_dir/">
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) /app_dir/router.php/$1 [L]
</Directory>
```

まったくもって存在しないときだけの場合。

```
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
```

httpd.confならdocument_rootをかく

```
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
```

ファイル毎の場合は、フロントコントローラーではないよね。たぶん。
なんと呼ぶのだろう。

```
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php
```
Project Euler 43

問題
---
数1406357289は0から9のパンデジタル数である (0から9が1度ずつ現れるので). この数は部分列が面白い性質を持っている.

d1を上位1桁目, d2を上位2桁目の数とし, 以下順にdnを定義する. この記法を用いると次のことが分かる.

```
d2d3d4 = 406 は 2 で割り切れる
d3d4d5 = 063 は 3 で割り切れる
d4d5d6 = 635 は 5 で割り切れる
d5d6d7 = 357 は 7 で割り切れる
d6d7d8 = 572 は 11 で割り切れる
d7d8d9 = 728 は 13 で割り切れる
d8d9d10 = 289 は 17 で割り切れる
```

このような性質をもつ0から9のパンデジタル数の総和を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2043

回答
---
以前作成したパンデジタル数ジェネレータを用いてコーディングした。でもかなり遅し。

```py
# coding: utf-8

import copy
import math
def pandigital(digit,seq1,seq2=[]):
  iter1 = map(str,seq1)
  if seq2:
    iter2 = map(str,seq2)
  else:
    iter2 = copy.deepcopy(iter1)
  for d in range(digit-1):
    iter1 = (x+y for x in iter1 for y in iter2 if not (y in x))
  return iter1

def is_divisible(n):
    div_list = [2, 3, 5, 7, 11, 13, 17]
    for d in range(2,9):
       if (int(n[d-1:d+2]) % div_list[d-2]) != 0:
            return False
    return True

def main():
    digit = 10
    ans = 0
    for pdg in pandigital(digit,range(digit),range(digit)):
        if is_divisible(pdg):
            ans += int(pdg)
    print ans    
```
【CakePHP】謎のキャッシュ削除エラー

xamppを使ってローカルで開発していたとき以下のようなエラーが出た。
Cakeのバージョンは2.2。

```php:エラー内容
Warning: unlink(C:\xampp\htdocs\XXX\app\tmp\cache\models\myapp_cake_model_default_XXX): No such file or directory in C:\xampp\htdocs\XXX\lib\Cake\Cache\Engine\FileEngine.php on line 255
```

ググるとパーミッション関連という記述が目立つが、ローカルマシンでそんな設定した覚えないし、パーミッションであれば常にエラーが出るはず。（ごくまれにしかエラーが出ない）


エラーが出ている\lib\Cake\Cache\Engine\FileEngine.phpの255行目を見ると以下のように書いてある。

```php:FileEngine.phpの255行目付近
$path = $this->_File->getRealPath();
$this->_File = null;
if (file_exists($path)) {
  unlink($path);
}
```

発生するタイミングは画面でクリックを連打しているとき。
ということは、同じタイミングでリクエストが投げられて、同時にif文の中に入って、ファイルが削除されたあとにunlinkされて、ファイルないけどってエラーが出ているのでは？
※ちなみに、unlink()はファイルを削除するPHPのコマンド。

上記結論に達しさらにWarningだから本番では出ないし、一旦静観することに。
だけど、同時にアクセスは普通にありえると思うしどうなんだろこれと思う次第。
phpの設定？それとも、本来cakeでtry/catchされてるべき？

知っている人がいたら結論が正しいかも含めて教えてほしい。
s3 ssl 通信

よくみるウェブサイトエンドポイント
`bucket-name.s3-website-region.amazonaws.com`
ただしウェブサイトエンドポイントだとSSL接続できない
やるならREST APIエンドポイントを利用する
`bucket-name.s3.amazonaws.com`

http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteEndpoints.html

普通はCloudfront利用するのかな
http://aws.typepad.com/aws_japan/2013/06/custom-ssl-domain-names-root-domain-hosting-for-amazon-cloudfront.html
mochaでCircleCI(TravisCI)の時だけ一時的にskipにするテストを書く


mochaを使ってテストを書いている時、branchを切ったりしているけど途中だったりするとこpushしたりすると失敗通知が結構来てうざい。かといって失敗することがわかっているテストだし消したくない・・・そんな時の話

# やり方
適当にskipする命名規則決めといて
`mocha -i skip_ci`とかでスキップしちゃうという手もある。

けどこれだとskipとしても出てこないし、、、と思ったがこんなやり方を思いついた

```test.js
// この二行
var isCi = process.env.CI ? true : false
var itSkipIfCi = (isCi ? it.skip : it)


// あとはこんな感じ
describe("logic", function(){
  it("普通のテスト ", function(){
  })
  itSkipIfCi("まだコケるのでとばしときたいテスト ", function(){
  })
})
  
```

## 解説
`process.env.CI`は[CircleCI](https://circleci.com/docs/environment-variables)、[Travis](http://docs.travis-ci.com/user/ci-environment/#Environment-variables) を見ると`TRUE`が設定されているようだ。（僕はCircleCIしか使っていない）

あとは`it`か`it.skip`かを決めるだけだがそこは下記の記事を参考にした
http://qiita.com/shoito/items/9dd99e09d0ca8eaecd4a


## その他
TravisCIの初期設定どうやるか忘れてCircleCI使ってみたけどとても良い。もうTravisに戻れない。
teeで標準入力を複製する

たまに、[標準出力も標準エラー出力もログに記録しつつ、画面に標準エラー出力を出したい](http://qiita.com/mzp/items/419cb7ac9eeab9e4398f)とかのケースで、標準出力を2つのストリームに複製して別の処理をさせたいなぁって時があります。


# tee 単体で出来るじゃん！

こんな感じ。

```bash:
seq 10 | tee >(cat > all.log) >(grep '[02468]$' > even.log) >(grep '[13579]$' > odd.log)
```

これでよかった。



# 古い内容（今となっては若気の至りな内容…だがまぁこねくりまわしてみたかった黒歴史として残しておく）

そんな時は `tee /dev/stderr` すると便利な時があるよってメモです。

## 例
上記リンク先のケースに当てはめてみると↓こんな感じで書けます。

```bash:
## 上書き
command >/tmp/foolog 2> >(tee /dev/stderr)
## 追記
command >>/tmp/barlog 2> >(tee /dev/stderr)
```

## 説明
データの流れは以下の図のような感じになってます。

```
command ─┬─ 1 ──────────────┬─────────> /tmp/foolog
         └─ 2 ─> tee ─┬─ 1 ─┘
                      └─ /dev/stderr ─> 2
```

1. commandの標準エラーをteeに繋げて、
2. **teeの引数にstderrを指定することで1本の標準入力を標準出力と標準エラーに複製**してます。
3. で、teeの標準出力はcommandの標準出力に合流して合体、
4. stderrから生まれた標準エラーはそのまま外部に垂れ流されてttyに表示されたりcronにキャッチされたりする感じです。

`> >(...)`の部分はBashの **Process Substitution** っていう機能で、以前書いたエントリの「[2つのコマンドの出力結果のdiffを取る](http://qiita.com/kawaz/items/98768ba5eea8d6fe6a19)」とか「[teeでgz圧縮しながら保存させる](http://qiita.com/kawaz/items/6fc3024d6bfbb3240320)」とかでも使ってます。上手く使うと中間ファイルが必要そうなところが不要になって結構便利です。
FPDFの日本語化パッチ使用時のエラー

PHPでPDFを生成するとき、FPDFというライブラリを使用するのがわりとメジャー（？）らしいです。
しかしこれ、日本語に対応していません。

そこで以下に従って日本語対応をしてみました。
http://www.phpbook.jp/fpdf/japan/index1.html

これでOKかと思いきや、**日本語対応といってもShift JISにしか対応していない**ので、そのままだとUTF-8は使えないんですね……。
しかたがないので

```php
function sjis($str) {
  mb_convert_encoding($str, 'SJIS', 'UTF-8');
}
```

といった関数を定義して、渡す文字列をShift_JISに変換して使ってあげています。手間だなあ。

今度こそ問題ないかと思いきや、あるPDFに Cell メソッドで文字を出力しようとしたところ japanese.php:76 で Undefined index エラーが……。
原因調べたところ、この日本語化パッチ、GetSJISStringWidth(\$s) という関数が、引数として受け取った値を配列として処理しているんですね。

PHPに限らず多くの言語でそうですが、文字列は「文字の配列」なので配列として操作できます。たとえば以下のようなことが可能なわけです。

```php
$str = 'hoge';
echo $str[0]; // h と出力される
```

しかしこれは $str が文字列であるから可能なわけで、PHPの場合、引数で受け取る値の型は保証されていないので、数字とか渡されると Undefined index になっちゃうわけですね。配列じゃないから。

ということで、japanese.php の GetSJISStringWidth(\$s) の頭に \$s = (string) \$s; を書き加えると直りました。

今回はFPDFで既に実装されているものの改修だったのでFPDFを使いましたが、きっともっと新しくてまともなライブラリがあるはずなので、あえてFPDFを使うことはないんじゃないかと思います。
GooglePlay版のWebview.apkをAOSP端末へインストールする方法


今日はいろいろ疲れたのでｇｄｇｄ書き下します。

今朝はAndroidのLollipop MR1が公開されました。
それと同時にひっそりとwebviewのベータ版もアップデートしました。
ベータテスト登録しているアカウントへはすでに降ってきていると思います。

このベータ版ですが、Playでのベータ版公開とともに、aospでもタグが切られています。

+ 先月公開されたver40ベータのタグ
	+ webview-m40_r1

	

+ 今朝公開されたタグ
	+ webview-m40_r2


ソースの取得とビルドはフレームワークと同じです。


    $ repo init -u https://android.googlesource.com/platform/manifest -b webview-m40_r2
    $ repo sync
    $ . build/envsetup.sh
    $ lunch
    $ make libwebviewchromium
    
これで、$OUT/system/lib/libwebviewchromium.soがビルドされます。 

このなかになんとかエンジンとかなんとかエンジンとかが入っています。
ソースコードは/external/chromium_org/です。

このライブラリを差し替えれば動くんでしょうか。
動作確認はしてませんがエミュレータ向けにしかビルドできないようです。

さて話がとびますが、GooglePlayで配布されているGoogleのWebviewは、パッケージ名がcom.google.android.webviewです。
大事なところですが一回しか言いません。

GooglePlayでダウンロードしたapkをaospのROMを焼いた端末へインストールしても、このWebviewは動きません。
インストールはできますが、動きません。Webviewをつかうと即座にクラッシュします。たぶんPackageManagerあたりがなんかの例外を吐いているはずです。

これは、aosp版で想定されているwebviewのパッケージ名が上記のcom.google.android.webviewと異なるためです。
aosp版のwebviewは、プラットフォームビルドすると/system/appに生成されるwebview.apkのことを指しています。

それではaosp版で想定されているパッケージ名は一体なんなんだって話ですが、答えはcom.android.webviewです。
なんか簡単な結論の割に話がくどいですよねよく言われますごめんなさい。

これは以下で定義されています。

/frameworks/base/core/res/res/values/config.xml

	<!-- Package name providing WebView implementation. -->
    <string name="config_webViewPackageName" translatable="false">com.android.webview</string>
    
    
このconfig値はWebviewFactoryから参照されています。
これをcom.google.android.webviewに書き換えればGooglePlay版のWebviewをaosp端末で動作させることができます。

ただ、そのまま書き換えるのも芸がないというか、aosp版のwebviewに戻したいときにいちいちROM書き換えないといけないということになりますよね。なのでのvaluesなんて適当にoverlayファイルを用意してあげればよいでしょう。

ここでは仮に端末ロケールにともなって差し替えるようにします。
ちょうどよいのが見つからなかったので、適当にロケールが日本のときはGooglePlay版、それ以外のときはaosp版のwebviewが動作するようにしましょうか。以下のファイルを作成しビルドしましょう。

frameworks/base/core/res/res/values-ja/config.xml

	<string name="config_webViewPackageName" translatable="false">com.google.android.webview</string>
   

こうすることで、端末のロケールを変更するだけで使用するwebviewを変更できますた。
＃webviewアプリのプロセスkillでいけると思いますが、再起動が必要かも。


さてさて、5.0からwebviewがapk化されたという話は有名ですが、これはとりもなおさず、以下のように実現されているようです。

apkのアップデート時に、WebviewUpdateServiceという端末起動時に起動するSystemServiceが、PACKAGE_REPLACEDのブロードキャストインテントを受診し、そのパッケージ名からwebviewのアップデートを検知します。
検知すると、WebviewFactory経由で、libwebviewchromium.soの再配置情報(/data/misc/shared_relro/にあります)を書き換えます。書き換える人は、別ライブラリになっていて、これはフレームワーク(/framework/webview/)に存在するloaderというやつです。ライブラリのファイル名はlibwebviewchromium_loader.soみたいな名前だったと思います。

この再配置情報の書き換えの起点となるWebviewUpdateServiceでのパッケージ名判定に使用される値が、config_webViewPackageNameというわけですね。


間違っているかもしれませんが、たぶんこんな感じです。
teeでgz圧縮しながら保存する

↓こんな感じにすればOK。一時ファイルも出来ないので便利です。

```bash:
echo hoge | tee >(gzip -c >hoge.gz)
```

仕組みとしては Bash の **Process Substitution** っていう機能を使ってます。

よく「[2つのコマンドの出力結果のdiffを取る](http://qiita.com/kawaz/items/98768ba5eea8d6fe6a19)」とかを例示して紹介される機能ですが、「サブシェルの出力を入力として使う例」はよく見るけど「出力をサブシェルの入力に使う例」はあまり見ないなーと思ったので、僕がたまに使うケースを例に紹介してみた。
FuelPHPのAgentクラスの問題を暫定的に回避してUA判定する方法

FuelPHPのAgentクラスは、使用する度に毎回10MB以上のクラスファイルをダウンロードしてくる仕様となっていて、サーバーのメモリを占有して使い物にならない問題がある。

この問題を回避するには、あらかじめクラスファイルを落としておいて定期的に最新化するのが最善策のようだが、そこまでしたくない人向けの暫定的な回避方法がこちら。

```php:hoge.php
$ua = \Input::server('http_user_agent', '');
if( (strpos($ua, 'iPhone') !== false) || (strpos($ua, 'iPod') !== false) || (strpos($ua, 'iPad') !== false) ) {
    // iOS
} else {
    // Android
}
```

何をやっているかというと、FuelPHPのAgentクラスのコードを元にUserAgent情報を取得し、指定した文字列が入っているかどうかチェックするという単純な方法です。
SketchのAuto-Saveによりストレージの空き容量が圧迫した場合の対処法

**Mac: [Sketch.app](http://bohemiancoding.com/sketch/)利用者限定**

通常通り利用していたのに、「起動ディスクが一杯です」と表示された場合は[Sketch.app](http://bohemiancoding.com/sketch/)のAuto-Saveの機能によりデータが圧迫している状態の可能性が多いです。
ストレージの状況を確認し、過去のファイルを綺麗サッパリ捨て去りましょう。

# 使用アプリ
- Terminal.app

# データ容量の多いディレクトリを知る

① ターミナルを立ち上げ、以下のコマンドを入力する。

```lang:Terminal
sudo du -gxd 5 / | awk '$1 >= 5{print}'
```

② パスワードを求められるのでMac本体のパスワードを入力します。
③ 数分かかる場合もありますが、次の様に結果が表示されます。

```lang:Terminal
125	/.DocumentRevisions-V100/.cs/ChunkStorage/0/0
125	/.DocumentRevisions-V100/.cs/ChunkStorage/0
125	/.DocumentRevisions-V100/.cs/ChunkStorage
125	/.DocumentRevisions-V100/.cs
125	/.DocumentRevisions-V100
45	/Applications
5	/Library/Application Support
10	/Library

...
```
※ 左の数字はGB単位です。

**/.DocumentRevisions-V100/ が出てきたらこいつが怪しいです。**


>DocumentRevisions-V100というディレクトリは、「テキストエディタなどのオートセーブに対応したアプリケーションで作成される履歴が保存される場所」です。

# DocumentRevisions-V100ディレクトリを削除する

① 削除が怖い人は必ずTimeMachineなどでバックアップをとっておくこと。
② 続けて以下のコマンドを入力します。

```lang:Terminal
sudo rm -r /.DocumentRevisions-V100/.cs
```

③ 以上で削除完了です。ストレージの空き容量を確認してください。
IE8 にFlashを埋め込む


            <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="640" height="360">
               <param name="movie" value="video.swf">
               <param name="FlashVars" value="value">
               <param name="wmode" value="transparent">
            </object>
Project Euler 42

問題
---
三角数のn項は tn = ½n(n+1)で与えられる. 最初の10項は

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
である.

単語中のアルファベットを数値に変換した後に和をとる. この和を「単語の値」と呼ぶことにする. 例えば SKY は 19 + 11 + 25 = 55 = t10である. 単語の値が三角数であるとき, その単語を三角語と呼ぶ.

16Kのテキストファイル words.txt 中に約2000語の英単語が記されている. 三角語はいくつあるか?
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2042

回答
---
回答方針は次の通り。
1. 参照用の三角数の集合を作る。
2. 単語から値を計算する。
3. 計算した値が三角数の集合内に含まれているかどうかを判定する。
4. 含まれていると判定した場合、変数ansに1を加える。

```py
def main():
  words = file2list('p042_words.txt')
  MAX = max_length(words) * 26
  tri = tri_dict(MAX)
  ans = 0
  for word in words:
    if word2num(word) in tri:
      ans += 1
  print ans
```

file2listはファイルを開いて読み込んだ文字列をリストにする関数。リストにするところはさらに関数を渡すと汎用性が上がりそうだけど、めんどくさいので対応していない。

```py
def file2list(filename):
  file = open(filename)
  ret = file.read().replace('"','').split(',')
  file.close()
  return ret
```

三角数の集合を作る際の最大値を決めるため、ワードリストwordsに含まれる単語の文字数を計算する関数。

```py
def max_length(words):
  max_len = 0
  for word in words:
    if len(word) > max_len:
      max_len = len(word)
  return max_len
```

指定された最大値以下の三角数を格納した辞書型オブジェクトを返す関数等。

```py
def f(n):
  return n * (n+1) / 2

def tri_dict(max):
  n=1
  tri = {}
  while f(n)<=max:
    tri[f(n)] = True
    n+=1
  return tri
```

単語を数字化する関数等。reduce使えばよかった。
なお、ordは長さ 1 の与えられた文字列に対し、その文字列が unicode オブジェクトならば Unicode コードポイントを表す整数を、 8 ビット文字列ならばそのバイトの値を返すビルドイン関数。alfa2numでは'A'のバイトの値が65となるため、64を引いた値を返している。

```py
def alfa2num(s):
  return ord(s) - 64
  
def word2num(word):
  return sum([alfa2num(s) for s in word])
```
RailsのSpringの速度比較


# Springとは？


Rails4.1から標準で付属するようになったアプリケーションローダー
以下のコマンドでSpringが起動しているか確認できる

```
% bundle exec bin/spring status
```

出力結果

```
Spring is running:

 2143 spring server | phoenix | started 3 mins ago    
 2341 spring app    | phoenix | started 2 mins ago | development mode   
```

# 効果を見てみる 
 
## Springなし

```
$ time bundle exec rake -T
```

出力結果

```
3.08s user 0.80s system 97% cpu 3.982 total
```

## Springあり

```
$ time bundle exec bin/rake -T
```

出力結果

```
0.50s user 0.10s system 48% cpu 1.241 total
```

Springによって3秒から0.5秒に短縮

# まとめ

`bin/rake`を使わないと、Springが実行されない
PhpStorm めも


使う機会があったのでメモ

Keymaps: default から少しいじってます。一部ブッキングしてるのと、前のソフトの名残でアタシが使いにくいから変えた部分があったので。

環境:
Mac OS 10.10
PHPStorm Version: 8.0.3


うまく同期されないから新規に…(´・ω・｀)

## コピペ

1. 普通のコピー
	2. `Cmd`-`c`
2. ファイルパスのコピー
	3. `Shift`-`Cmd`-`c`
3. カーソルポイントのコピー
	4. `Opt`-`Shift`-`Cmd`-`c`
5. ペースト
	6. `Cmd`-`V`
7. 戻す
	8. `Cmd`-`Z`
9. Redo
	10. `Cmd`-`Shift`-`Z`

## カーソル移動

少しkeymapいじって、タブの移動を「`Cmd`-`Shift`-`[`」「`Cmd`-`Shift`-`]`」だけに変更

1. ワード移動
	2. `alt`-`←` / `alt`-`→`
1. メソッドの先頭に移動
	2. `ctrl`-`↑` / `ctrl`-`↓`

## 選択

1. ワード選択
	2. `Ctrl`-`G`(Mac OSX) / `Alt`-`J` (Windows)
3. ワード選択で選択を取り消し
	4. `Ctrl`-`Shift`-`G` / `Alt`-`Shift`-`J`
5. ワード単位で、カーソル位置から選択していく
	6. `Alt`-`↑`: 選択範囲を広げていく
	7. `Alt`-`↓`: 選択している範囲を狭めていく

## 補完

1. 補完候補を一覧で出す
	2. `Ctrl`-`Space`

## 検索

1. ファイル内検索
	2. `Cmd`-`F`
3. グローバル検索
	4. `Cmd`-`Shift`-`F`


## PHPDoc

`/**`と打ち、`Enter`を押したら自動展開される。

(`Cmd-N`を押したらなんかできるみたいだけど、よくわからん)

## 定義しているファイルへ飛ぶ

1. `Cmd`を押しながら、クラス名のところをクリック。
3. Menubar: Navigate > Declaration
2. カーソル位置で、`Cmd`-`b`

## ファイルを開く

composer.json とかいじろうと思ったらちょっと工夫

1. クラス名からファイルを開く
	2. `Cmd`-`o`
2. ファイル名からファイルを開く
	3. `Cmd`-`Shift`-`o`

## タブの移動
1. 右のタブ
	2. `Cmd`-`]`
2. 左のタブ
	3. `Cmd`-`[`
4. 一覧から選択
	5. `Ctrl`-`x` `Ctrl`-`b`

## 折りたたみ

関数やクラスやメソッドを閉じる。

1. 関数やメソッドなど、カーソル位置のブロックを一部的に閉じる
	2. `Cmd`-`-`
3. 閉じてるブロックを展開
	4. `Cmd`-`+`
5. クラスなど多括りのブロックを閉じる
	6. `Cmd`-`Shift`-`-`
7. 全ての閉じてるメソッドを展開
	8. `Cmd`-`Shift`-`+`

## パネルの移動

1. 左のファイル一覧などに移動
	2. `Cmd`-`Shift`-`e` から選択

## コンソール

ターミナルパネルを開く `Shift`-`Cmd`-`X`

## Git

1. コミット
	2. `Cmd`-`k`
2. Push
	3. `Cmd`-`Shift`-`k`

### Git のあれ

Cmd-k した後、Previewでここおかしいぞと教えてくれるのは嬉しい。

## テストとか

Vagrantで環境構築しているので、Vagrant上で実行できたら最高

http://www.1x1.jp/blog/2014/09/phpstorm-phpunit-by-remote-innterpreter-with-vagrant.html

素敵です。

## 参考

1. https://www.jetbrains.com/phpstorm/help/creating-php-documentation-comments.html
1. http://blog.jetbrains.com/phpstorm/2014/03/working-with-multiple-selection-in-phpstorm-8-eap/
1. http://www.karakaram.com/phpstorm-useful-tips1
1. http://www.karakaram.com/phpstorm-keymap-windows#cursor
rubyスクリプトでsvnコミット通知をslackに送る

#はじめに
諸事情でgitではなくsvnを部分的に使っています。
svnにコミットしたら、slack の incoming-webhook で通知するようにした記録です。

ちなみにスクリプト本体はruby2.2.0で書きました。
gemがあるようですが、使うほどでもないと思って素で書きました。

#Slackで Incoming WebHooks を登録
設定画面の「Integrations」から「Incoming WebHooks」を新規追加（ページ最下部あたり）

![slack.PNG](https://qiita-image-store.s3.amazonaws.com/0/8788/d4bd90cc-adcf-fbf5-d950-df98299180ec.png)


参考
http://www.bunnyhop.jp/lab-20141020/

#svnサーバーで post-commit を記述

###locale追加

```
$ sudo apt-get install language-pack-ja
```
Ubuntu14.04(x64) @ EC2 を使っていたのでlocale追加が必要でした。

###post-commitに追記
※リポジトリパスは随時読み替えてください

```shell-session:post-commit
LANG=ja_JP.UTF-8

REPOS="$1"
REV="$2"

/home/svn/.rbenv/shims/ruby /home/svn/repos/myapp/hooks/post-commit.rb $REV
```

##post-commit.rbを作成して hooks/ に置く

```rb:post-commit.rb
#!/usr/bin/env ruby
# encoding: utf-8

require 'net/http'
require 'uri'
require 'json'

# POSTリクエストメソッド
#
def post(text)
  # コミット通知メッセージをJSONに
  data = {
    "text" => text
  }

  # slackで発行したwebhookURLをセット
  request_url = "https://hooks.slack.com/services/XXXXXXX/XXXXXXX/XXXXXXXXXXXXXXXXXXXXXX"
  uri = URI.parse(request_url)
  http = Net::HTTP.post_form(uri, {"payload" => data.to_json})
end

# リビジョン番号
rev = ARGV[0].to_s

# author情報取得
cmd = "svnlook author /home/svn/repos/myapp -r #{rev}"
author = `#{cmd}`

# コミットメッセージ取得
cmd = "/usr/bin/env LANG=ja_JP.UTF-8 /usr/bin/svnlook log /home/svn/repos/myapp -r #{rev}"
log = `#{cmd}`

# slackに通知してもらうテキストをつくる（ここはご自由に）
msg = "#{log.chomp!} - commit by #{author.chomp!} - rev:#{rev}"

# POSTリクエスト
post(msg.force_encoding("UTF-8"))
```

##コミット通知がslackに飛んでくる
![sla.PNG](https://qiita-image-store.s3.amazonaws.com/0/8788/41b4a3ee-4cdf-ac73-1016-3991134a9070.png)

※必要であればデスクトップ通知も設定しておく


#ハマった点
- locale追加して日本語の ja_JP.UTF-8 を作成すること（EC2だったから）
- force_encodingすること（これをしないと文字化けした）

#番外（Jenkins連携）
もうひとつ incoming-webhook を登録して Jenkinsのビルドエラーもslack通知で検知できるようにしました。
※ \#jenkins チャンネルをつくってここに通知するようにしました。

![jenkins.PNG](https://qiita-image-store.s3.amazonaws.com/0/8788/61c36690-9543-618f-fd49-201554ea4cbf.png)


Jenkinsにはすでに「Jenkins Slack Plugin」があるので、これを使うと簡単に連携できます。
これについてはここを参考にさせてもらいました。
http://r9.hateblo.jp/entry/2014/01/26/145538

#Slackフリープランの場合の注意点
まずIntegrationsは5つまでです。
他の連携が必要な場合はそのあたりを考慮する必要があります。

また、Slackのフリープランでは月の投稿数が10,000と限られています。
ですので、通知を増やせば当然上限に早く達する恐れがあります。

自分のチームの場合、コミット通知と、時々Jenkinsに怒られる通知を含めても、
10,000の上限にはまず達することはないと判断したのでこういった運用にしています。
UTF8の記号入り文章をHTMLメールで送るperlスクリプト


perlでメールを送る時に記号が入ってると文字化けしちゃうのでHTMLメールで送ることにしました。

###送るテキストファイル(mail.txt)、文字コードUTF8です。

	普通の日本語です。
	☀☁☂☃☎☏☚☛☜☝☞☟
	☠☢☣☤☥☪☭☯☹☺☻☼☽☾
	♔♕♖♘♚♛♞♠♡♢♣♤♥♦♧
	♨♩♪♫♬♭♮♯✂✄✈✍✎✏✐
	✑✓✘✳❀➘➙➚➜➥➦➷➸➹
	普通の日本語です。
	
###プログラム

```html_mail.pl
#!/usr/bin/perl

use utf8;
use strict;
use Encode;
use Encode::MIME::Header;

my $subject = 'UTF8の記号を送るよ！';
my $to_mail = 'address@example.com';

my $mime_subject = encode( 'MIME-Header-ISO_2022_JP', $subject );
my $mime_to_mail = encode( 'MIME-Header-ISO_2022_JP', $to_mail );

my $body = '';
for (<>) {
	my $utf8 = decode_utf8($_);
	$body .= encode( 'jis', $utf8, Encode::FB_HTMLCREF );
}

my $mail_cmd = '/usr/sbin/sendmail';

my $header = '';
$header .= "MIME-Version: 1.0\n";
$header .= "To: " . $mime_to_mail . "\n";
$header .= "Subject: " . $mime_subject . "\n";
$header .= "Content-type: text/html; charset=ISO-2022-JP\n";
$header .= "Content-Transfer-Encoding: 7bit\n";
$header .= "\n";

if ( open( SMAIL, "| $mail_cmd -t -i" ) ) {
	print SMAIL $header;
	print SMAIL '<html><body><pre>' . "\n";
	print SMAIL $body . "\n";
	print SMAIL '</pre></body></html>' . "\n";
	close(SMAIL);
}
else {
	print STDERR "ERROR $!\n";
}

exit(0);

1;
```

###実行

	./html_mail.pl < mail.txt

###結果

記号入りでメールが届きました。

	普通の日本語です。
	☀☁☂☃☎☏☚☛☜☝☞☟
	☠☢☣☤☥☪☭☯☹☺☻☼☽☾
	♔♕♖♘♚♛♞♠♡♢♣♤♥♦♧
	♨♩♪♫♬♭♮♯✂✄✈✍✎✏✐
	✑✓✘✳❀➘➙➚➜➥➦➷➸➹
	普通の日本語です。

###ポイント

JISにエンコードする時の **Encode::FB_HTMLCREF** 部分が重要です。これがないと文字化けして届きました。

	普通の日本語です。
	????????????
	??????????????
	???????????????
	??♪??♭?♯???????
	??????????????
	普通の日本語です。

###参考サイト

@dankogaiさんの記事を参考にさせていただきました。

[404 Blog Not Found : perl - Encode 中級](http://blog.livedoor.jp/dankogai/archives/51047005.html)
GoでHTTP Trailerを扱う

# HTTP Trailer
Goの``net/http``パッケージはHTTP Trailerの送信および受信に対応しています。Trailerとは、HTTPリクエストBodyの末尾に付与できるヘッダと同様の構造です。``Transfer-Encoding: chunked``のときのみ利用可能で、Body送信後にしか分からないチェックサムなどをリクエストに付与したいときに便利です。

なお、Go 1.4時点ではサーバレスポンスへのTrailer付与には対応していないようです(Hijackすれば可能)。

# 使い方

HTTPクライアントリクエスト側でのポイントは以下の通りです

- リクエストを``TransferEncoding: chunked`` に設定する
  -  req.ContentLength = 0 or -1 でも設定可
- 送信する前に``req.Trailer``をアロケーションしておく
- 送信後、BodyがEOFになる前のタイミングで``req.Trailer``にTrailerを設定する

HTTPサーバーリクエスト側でのポイントは以下の通りです

- リクエストボディを読み終わったあとで``r.Trailer``を参照する


まとめると、以下の例のように扱うことができます

# Example

```go
package main

import (
	"io"
	"io/ioutil"
	"log"
	"net/http"
)

var ch = make(chan bool, 0)

func Handler(w http.ResponseWriter, r *http.Request) {
	log.Println(r.Header)
	log.Println(r.Trailer)          // <- r.Bodyを読む前はTrailerを取得できない
	io.Copy(ioutil.Discard, r.Body) // <- r.Bodyを読み込み
	log.Println(r.Trailer)          // <- 読み終わったので取得できる

	w.WriteHeader(http.StatusOK)
	ch <- true
}

func main() {
	// サーバ起動
	http.HandleFunc("/", Handler)
	go http.ListenAndServe(":8080", nil)

	// リクエスト発行
	r, w := io.Pipe()

	req, _ := http.NewRequest("PUT", "http://localhost:8080/test", r)
	req.TransferEncoding = []string{"chunked"} // <- TransferEncoding: chunked を設定
	req.Trailer = make(http.Header)
	go http.DefaultClient.Do(req)

	io.WriteString(w, "THIS IS A REQUEST BODY")
	req.Trailer.Set("XXX", "my-trailer")  // <- Close前にTrailerをセット
	w.Close()

	// blocking...
	<-ch
}
```

結果は以下の通りです

```bash
2015/03/10 18:03:13 map[]
2015/03/10 18:03:13 map[Xxx:[my-trailer]]
```
圧縮 + 解凍のよく使うコマンド

#### zipファイルに圧縮しながらパスワードをかける
```zip -e -r "圧縮後のファイル名.zip" "圧縮したいディレクトリ"```

#### その他
* ディレクトリをzipに圧縮

```
zip -r "圧縮後のファイル名.zip" "圧縮したいディレクト
リ"
```
* zipファイルの解凍

```unzip "zipファイル名"```

* ディレクトリをtar.gzに圧縮

```
tar cfvz "圧縮後のファイル名.tar.gz" "圧縮したいディレクトリ"
```

* tar.gzの解答

```
tar xfvz "解答したいファイル名"
```

* gzファイルの解凍

```
gunzip "gzファイル名"
```
All UE4 Tutorials動画から学んだことまとめ 001（ViewPort編）



UE4が無料になったので触ってみたいけど、機能多すぎなのかチュートリアルが201本の動画に・・・
一つ5分だとしても、17時間弱です。[多すぎて死にます。](https://www.youtube.com/watch?v=QMsFxzYzFJ8&list=PLZlv_N0_O1gaCL2XjKluO7N2Pmmw9pvhE)


当方MacBookですがtrakpadと相性悪そうなので[mouse](http://www.amazon.co.jp/dp/B009V7B944/ref=cm_sw_r_tw_dp_gAC.ub10KRZXE)まで買ったのです。(1300円)諦めたくない！

せめて1回しか見る必要がないように学んだことをまとめます。（はやくBluePrint触りたい）

**現在の状況**:9/201消化

# Viewport編

## ショートカット
### 視点変更編

| NO | キー &マウス操作         | 動き               | 備考               |
|----|-------------------------|------------------| ---|
| 1  | オブジェクトを左クリック | 選択|
| 2  | 左クリック & ドラッグ|前進&後進&左ターン&右ターン  | 車のような動きです|
| 3  | ホイールクリック & ドラッグ|上下左右平行移動  | |
| 4  | ホイール操作|前進&後進  | 拡大縮小をイメージした動き|
| 5  | 右クリック & ドラッグ|上ターン&下ターン&左ターン&右ターン  | 頭部視点の動きです|
| 6  | 右クリック & W or S or D|前進&後進&左並行移動&右平行移動  | FPSでお馴染みの動きです|
| 7  | 右クリック & Q or E|上並行移動&下平行移動  | 上昇下降|
| 8  | 右クリック & C|拡大（右クリックを外すと拡大前に戻る）  | オブジェクトの観察に便利|
| 9  | （オブジェクトを選択状態）F|フォーカス | |
| 10 | （オブジェクトを選択状態）alt+ドラッグ|左クリックならオブジェクトを中心とした回転、右クリックなら拡大縮小  | |
| 11 | alt + G| 視点変更 カメラ視点 | |
| 12 | alt + J| 視点変更 TOP視点 | |
| 13 | alt + K| 視点変更 side視点 | |
| 14 | alt + H| 視点変更 Front視点 | |
![viewport01.png](https://qiita-image-store.s3.amazonaws.com/0/3844/6f2defcf-3b99-a19f-e4fe-f16840c70bee.png "viewport01.png")



### オブジェクト移動操作編

| NO | キー &マウス操作         | 動き               | 備考               |
|----|-------------------------|------------------| ---|
| 1  | オブジェクトを左クリック | 選択|
| X  | (⌘をおしながら)オブジェクトを左クリック | 複数選択|No17のチュートリアルで学習|
| X  | (複数のオブジェクトを選択中に)⌘+G | 複数のオブジェクトをグループ化|No18のチュートリアルで学習|
| X  | (複数のオブジェクトを選択中に)Shift+G | 複数のオブジェクトグループ化の解除|No18のチュートリアルで学習|
| 2  | (オブジェクト選択状態)W | オブジェクト上下左右平行移動モードへ||
| 3  | (オブジェクト選択状態)E | オブジェクト回転モードへ||
| 4  | (オブジェクト選択状態)R | オブジェクト拡大モードへ||
| 5  | (オブジェクト選択状態)Endキー(MacBookならfn + →) | 下方向にオブジェクトがあれば接地操作|たくさん使いそう|
| 6  | Ctrl + ~ | グローバル座標系　<--> ローカル座標系　切り替え|オブジェクトを回転させて試すとわかります|
| X  | T | 透明なオブジェクトを選択可 <--> 選択不可 切り替え|ガラスみたいなオブジェで実験するとわかります。|

![viewport02.png](https://qiita-image-store.s3.amazonaws.com/0/3844/845ef38b-046f-fe04-e3cf-ed97a8a013ec.png "viewport02.png")
注:4分割表示は再度同じボタンをクリックすると戻ります


## その他

* モデルからスポットライトを配置した時のカメラ視点での調整方法
* 右クリックからの繰り返しオブジェクト配置
* オブジェクト移動時にカメラと同時に移動

上記については文章でまとめられないので動画を参照して下さい。(No1~9)

# コンテンツブラウザ編
エクスプローラっぽい感じです。
動画を見たほうが早いので省略(No10)
ActiveJob + resque + resque-scheduler で schedule タブの Queue now がエラーになるのを回避する

resque-scheduler から enqueue され ActiveJob を経由しないので型不一致でエラーになってしまう。
しかしちゃんと resque-scheduler 側に逃げ口が用意されているのでそれを利用する。
https://github.com/resque/resque-scheduler/blob/master/lib/resque/scheduler.rb#L265

Job クラスに scheduled クラスメソッドを定義してそこで ActiveJob からキューにいれればいい。

```rb
moduel JobHelper
  extend ActiveSupport::Concern

  module ClassMethods
    def scheduled(queue, klass_name, *params)
      self.set(queue: queue).perform_later(*params)
    end
  end
end

class MyJob < ActiveJob::Base
  include JobHelper

  queue_as :default

  def perform(*args)
    # ...
  end
end
```
標準出力も標準エラー出力もログに記録しつつ、画面に標準エラー出力を出したい


## やりたいこと
こんな感じで、シェルスクリプトをcronに定期的に実行したい。


```cron
SHELL=/bin/bash
MALITO=alert@example.com

0 0 * * * /path/to/command
```

そして、以下のようなポリシーでログを取りたい。

 * 標準出力も標準エラー出力も、全部ログに記録する。
 * 標準エラー出力があった場合は、メールを送信する。

`/path/to/command >> /var/log/some` ですと標準エラー出力がログに記録されませんし、 `/path/to/command >> /var/log/some 2>&1` だと標準エラー出力に出力されずメールが送信されません。

## 解決策

```
SHELL=/bin/bash
MALITO=alert@example.com

0 0 * * * (/path/to/command 2>&1 >> /var/log/some) | tee -a /var/log/some
```

## 解説
まず前半の `/path/to/comand 2>&1 >> /var/log/some` です。

これは、 `(...)`: サブシェルになっており、親のシェルとは別のプロセスで実行される。

そのサブシェル内では `/path/to/command 2>&1 >> /var/log/some`が実行されており、 `/path/to/command` の標準エラー出力の出力先を標準出力に、標準出力の出力先を `/var/log/some` にする。

結果として、サブシェルからは `/path/to/command` の標準エラー出力が標準出力として出てくる。

後半の `| tee -a /var/log/some` は、サブシェルからでてきた標準出力を `/var/log/some` に追記しつつ、そのまま標準出力に出す。

そして標準出力がある場合はcronによって、MAILTOの宛先にその内容のメールが送られる。

## 参考

 * [UNIXの部屋 コマンド検索:リダイレクト (*BSD/Linux)](http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8 "UNIXの部屋 コマンド検索:リダイレクト (*BSD/Linux)")
 * [cron で &gt; /dev/null して椅子を投げられないための3つの方法 - 酒日記 はてな支店](http://sfujiwara.hatenablog.com/entry/20120613/1339547638 "cron で &gt; /dev/null して椅子を投げられないための3つの方法 - 酒日記 はてな支店")
FreeBSD10でQtCreator＋Qt5メモ

FreeBSDのpkgにqtcreatorの3系がいつのまにか入ってたので、なんとなく環境を整えてみた。

とりあえず必要なものをインストール。

```shell-session
$ sudo pkg install qt5 qtcreator
```

あとは qtcreator を起動する。日本語化したいけど困りはしないのであとで。

`Tools > Options > Build & Run > Kits > Desktop(default)` をみたら、Qt version が None だったので、 `Qt Versions > Add...` から qmake のパスを渡す。
ここで、`/usr/local/bin/qmake` だと何か文句言われる。`/usr/local/lib/qt5/bin/qmake` を渡すと大丈夫っぽい。

このqmakeがPATHに入ってなかったので、ついでに直しておいた。

あとは `Kits > Desktop(default) > Qt version` を追加された Qt 5.3.2 にする。

とりあえず新規プロジェクトを作ってビルドしてみよう、と思ったら -lQt かなんかが無いと怒られる。

問題としては http://qiita.com/illness072/items/3f6650d200432ed752ff ← コレっぽいんだけど、コメントいただいている通りあまり筋の良い直しかたではないっぽいので、今回はもっと簡単に、qmake が -L/usr/local/lib をMakefileに書くようにする。

```text:/usr/local/lib/qt5/mkspecs/freebsd-clang/qmake.conf
#
# qmake configuration for freebsd-clang
#

(中略)

QMAKE_LIBDIR+=/usr/local/lib
``` 

これでおしまい。いつもの Hello World ボタンがでるやつを実行できた。
削除ボタンの作成について(行ごと,Java,Seasar2(SAStrats/S2JDBC))

プログラマー２年目です。

今Java,Seasar2(SAStrats/S2JDBC),jspを使ってWebアプリケーションを作っています。

結論から言うと、
削除ボタンのある行のみを削除させるにはどうしたらよいでしょうか？


削除ボタンの作成なのですが、
jspでボタンを作成し、Actionクラスにコーディングして、全レコードを削除するまではできました。

またViewでは行ごとに削除ボタンを描画することもできています。
findById(Integer id)で特定のレコードを取得し、それを削除するという流れで書いています。

ただそのfindById(Integer id)への引数の渡し方がわかりません。
その削除したいidをどのようにして取得すればいいのかわからないと言ったほうがいいでしょうか。
是非お分かりになる知識人の方々どうか力をお貸しいただけないでしょうか？
考え方やアイデアだけでももちろん構いません。

わかる方がいればよろしくお願いします。


↓画面の画像

![スクリーンショット 2015-03-10 16.44.05.png](https://qiita-image-store.s3.amazonaws.com/0/60528/ad16809e-be1c-efc2-3102-7daa7e767c2c.png)

↓Actionクラス
![スクリーンショット 2015-03-10 16.55.12.png](https://qiita-image-store.s3.amazonaws.com/0/60528/65aaa962-3f47-d4ae-e33b-7936d6c0b581.png)

↓jsp
![スクリーンショット 2015-03-10 16.57.27.png](https://qiita-image-store.s3.amazonaws.com/0/60528/dfeb6208-401b-3e3b-2dc4-14ca5e8758b4.png)
<br>

---


**この内容は解決しました！**
jspの削除ボタンをリンクにし、リクエストパラメーターとしてidを渡しました。

そのidはActionFormクラスのリクエストスコープに自動的に格納されます。

ActionFormクラスに格納されているリクエストパラメーターであるidを引数にfindByIdをし、
そのオブジェクトに対してdeleteすると行ごとの削除ができるようになりました。

ただとくにこだわりはないのですが、これをリンクではなく、元々のフォームボタンで記述するにはどう書いたらいいのかなと少し気になったのでまた機会があるときに勉強したいと思います。

ご覧頂きありがとうございました。


結果
↓jsp
![スクリーンショット 2015-03-11 9.30.19.png](https://qiita-image-store.s3.amazonaws.com/0/60528/eefd6048-038b-3c9f-0fd0-a13609604cdf.png)

↓Actionクラス
![スクリーンショット 2015-03-11 9.30.05.png](https://qiita-image-store.s3.amazonaws.com/0/60528/d16f815d-9959-dd37-f963-90d4d5e28025.png)

↓画面の画像
![スクリーンショット 2015-03-11 9.49.20.png](https://qiita-image-store.s3.amazonaws.com/0/60528/fad4f79b-749b-09de-fa48-054db99bc6d9.png)
JSでDelegateオブジェクト



JavaScriptにはクラスないので、オブジェクトでよいかしら。


```js
var Delegate = {

   /**
    * 委譲オブジェクトを作成する。
    * @param scope
    * @param method
    * @returns {Function}
    */
   create:function(scope, method){
       var obj =  function(){
           return method.apply(scope, arguments);
       }
       return obj;
   }
}
```

使い方はこんな感じで。


```js
var Test = function(){
	this.name = "テストです。";
}

Test.prototype = {
	say: function(){
		console.log(this.name);
	}
}

var test = new Test();
var obj = {};
obj.func = Delegate.create(test, test.say);
obj.func(); // "テストです。"

```

スコープがずれるときは、これで解決。
Scala:joda-timeで一日・末日を計算して求めたい


joda-timeなら、`withMinimumValue`や`withMaximumValue`を使うことで簡単に、一日や末日を求めることができます。

```scala
import org.scalatest._

class MySuite extends FunSuite {
  test("一日、末日の求め方") {
    import org.joda.time._

    val now = new DateTime()

    val 一日 = now.dayOfMonth().withMinimumValue()
    val 末日 = now.dayOfMonth().withMaximumValue()

    println(now.toString("yyyy-MM-dd")) // 2015-03-10
    println(一日.toString("yyyy-MM-dd")) // 2015-03-01
    println(末日.toString("yyyy-MM-dd")) // 2015-03-31
  }
}

```



## 時・分・秒まで含めて求める例

時・分・秒で1ヶ月の期間を計算する場合の例です。時・分・秒でも、`withMinimumValue`や`withMaximumValue`を使って最小値・最大値に変換することで、一日・末日を求めることが出来ます。


```scala
import org.scalatest._

class MySuite extends FunSuite {
  test("一日、末日の求め方") {
    import org.joda.time._

    val now = new DateTime()

    val 一日 = now.dayOfMonth().withMinimumValue().hourOfDay().withMinimumValue().minuteOfHour().withMinimumValue().secondOfMinute().withMinimumValue().millisOfSecond().withMinimumValue()
    val 末日 = now.dayOfMonth().withMaximumValue().hourOfDay().withMaximumValue().minuteOfHour().withMaximumValue().secondOfMinute().withMaximumValue().millisOfSecond().withMaximumValue()

    println(一日, 末日) // (2015-03-01T00:00:00.000Z,2015-03-31T23:59:59.999Z)
  }
}
```

## タイムゾーンを考慮して時・分・秒まで求める例

DBにはUTCで記録されているが、ユーザは日本時間といった場合、ユーザからの入力は日本時間で解釈しつつ、DBにはUTCの時刻で問い合わせる場合があります。その場合は、`LocalDateTime`でユーザ入力を受け付け、日本時間の`DateTime`オブジェクトに変換し、一日・末日を求めた後、DBにクエリする際に、UTCの`DateTime`オブジェクトに変換するという流れになると思います。`LocalDateTime`はタイムゾーン情報を持たないオブジェクトです。

```scala
import org.scalatest._

class MySuite extends FunSuite {
  test("一日、末日の求め方") {
    import org.joda.time._

    val `Asia/Tokyo` = DateTimeZone.forID("Asia/Tokyo")
    val UTC = DateTimeZone.forID("UTC")

    val now = new LocalDateTime("2015-03-31T15:00:00").toDateTime(`Asia/Tokyo`)

    val 一日 = now.dayOfMonth().withMinimumValue().hourOfDay().withMinimumValue().minuteOfHour().withMinimumValue().secondOfMinute().withMinimumValue().millisOfSecond().withMinimumValue()
    val 末日 = now.dayOfMonth().withMaximumValue().hourOfDay().withMaximumValue().minuteOfHour().withMaximumValue().secondOfMinute().withMaximumValue().millisOfSecond().withMaximumValue()

    println(一日) // 2015-03-01T00:00:00.000+09:00
    println(末日) // 2015-03-31T23:59:59.999+09:00
    println(一日.withZone(UTC)) // 2015-02-28T15:00:00.000Z
    println(末日.withZone(UTC)) // 2015-03-31T14:59:59.999Z
  }
}
```
Xcode 6.2にすると、Alcatrazが消えて困ったとき

Xcode6.2がリリースされたので、早速インストールしました。
順調に動いてたんですが、AlcatrazのPackage Managerが表示されてないことに気づきました。

とりあえず、再度インストール。
http://alcatraz.io/ より、

```
curl -fsSL https://raw.github.com/supermarin/Alcatraz/master/Scripts/install.sh | sh
```

ググったら、 https://github.com/supermarin/Alcatraz/issues/203
これが出てきたので、
`~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin/Contents/Info.plist` に`A16FF353-8441-459E-A50C-B071F53F51B7` を追加。

```Info.plist
	<key>DVTPlugInCompatibilityUUIDs</key>
	<array>
		<string>...</string>
		<string>A16FF353-8441-459E-A50C-B071F53F51B7</string>
	</array>
```

そしたら出てきた。良かった。
vagrantを1.7.2にアップグレードしたらまた動かなくなった


前に1.5.3にアップグレードした時もエラーが出るようになったが、久しぶりに1.7.2にアップグレードしたらまた動かなくなった。
前回と同じく`vagrant plugin update`してみたもののダメ。エラーはこんな感じ。

```
$ vagrant init trusty64
Vagrant failed to initialize at a very early stage:

The plugins failed to load properly. The error message given is
shown below.

uninitialized constant Vagrant::Action::Builtin::MixinSyncedFolders
```

んでググってみたらプラグインが悪さしているみたい。

```
$ vagrant plugin list
sahara (0.0.17)
vagrant-aws (0.6.0)
vagrant-omnibus (1.4.1)
vagrant-pristine (0.3.0)
vagrant-share (1.1.3, system)
vagrant-windows (1.6.0)
```

怪しそうなvagrant-windowsを削除してみたら無事動くようになりました。

```
$ vagrant plugin uninstall vagrant-windows
Uninstalling the 'vagrant-windows' plugin...
$ vagrant init trusty64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```
認証付きのCoreOS Enterprise Registryを立てる


CoreOS Enterprise Registryは[Quay.io](https://quay.io)のインストール版。料金体系も若干違う。

Quay.ioの方がメンテコスト掛からなくて楽＆サーバコストも含めて考えたときに安いんだけど、如何せん国内サーバからのDocker pullが遅すぎてストレスフルなデプロイになること請け合いなので、自前のサーバにCoreOS Enterprise Registryをインストールすることにした。
ドキュメントに書いてないことがあったりしたせいで、主にSSLの認証周りでハマって1日くらい無駄にしたので、備忘録も兼ねて共有。

## 事前準備
- CoreOSがインストールされたサーバを用意する
- [CoreOS Enterprise Registry](https://coreos.com/products/enterprise-registry/plans/)を事前に契約して認証情報(.dockercfg)を用意する
	- `/home/core/.dockercfg` と `/root/.dockercfg` においておく
- SSL証明書の用意

## インストール
### MySQLのインストール
基本的には[ドキュメント](https://coreos.com/docs/enterprise-registry/mysql-container/)に書いてある通り。以下の手順では実行スクリプトを/tmp/から移動させている。

```
docker pull mysql:5.7
curl --location https://raw.githubusercontent.com/coreos/docs/master/enterprise-registry/mysql-container/provision_mysql.sh -o ~/provision_mysql.sh -#
vim ~/provision_mysql.sh
```

provision_mysql.shの以下の箇所を任意に書き換え

```
MYSQL_USER="coreosuser"
MYSQL_DATABASE="enterpriseregistrydb"
MYSQL_CONTAINER_NAME="mysql"
```

MySQLを立ち上げる

```
chmod -c +x ~/provision_mysql.sh
sh ~/provision_mysql.sh
```

起動10秒後にパスワードが表示されるので控えておく。

ちなみに、MySQLコンテナを立ち上げ直すたびにデータが消えてしまっては困るので、 `Data-only container pattern` などを使ってデータを永続化しておくことを推奨。ここでは手順は紹介しないが、ここらへんが参考になります。

[Data Volume と Data Volume Container
](http://qiita.com/sokutou-metsu/items/b83b275198fc9594f5a4)
[Docker でデータのポータビリティをあげ永続化しよう
](http://qiita.com/mopemope/items/b05ff7f603a5ad74bf55)

### Redisのインストール

```
sudo docker pull quay.io/quay/redis
sudo docker run -d -p 6379:6379 quay.io/quay/redis
```

### CoreOS Enterprise Registryのインストール
ここも基本的には[ドキュメント](https://coreos.com/docs/enterprise-registry/initial-setup/)通り。

まずは設定やストレージを共有するためのディレクトリを作成。

```
mkdir ~/storage
mkdir ~/config
```

次にCoreOS Enterprise Registryを立ち上げる。上で作ったconfigとstorageのディレクトリを-vとして指定する。

```
sudo docker pull quay.io/coreos/registry
sudo docker run --restart=always -p 443:443 -p 80:80 --privileged=true -v /home/core/config:/conf/stack -v /home/core/storage:/datastorage -d quay.io/coreos/registry
```

これでひとまず立ち上がるので `http://yourhost/setup` にアクセスして、データベースやAdminユーザの作成などを一通り行う。

その後、 `http://yourhost/superuser` で `Enable SSL` にチェックを入れて、認証鍵を登録。 `https://yourhost/` で接続出来る状態にする。

### 認証情報の設定
CoreOSのサーバ側にcert, keyをそれぞれ転送し、 `/etc/ssl/` 配下にそれぞれ移動する

```
sudo cp server-cert.pem /etc/ssl/certs/docker-registry
sudo cp server-key.pem /etc/ssl/private/docker-registry
sudo update-ca-certificates
```

### build-workerのインストール
CoreOS Enterprise Repositoryは側の機能だけなので、Dockerfileのbuildなどはこのbuild-workerプロセスが受け持つ。

```
docker run --restart on-failure -e SERVER=wss://yourhost -v /var/run/docker.sock:/var/run/docker.sock -v /etc/ssl/certs:/etc/ssl/certs quay.io/coreos/registry-build-worker:latest
```
Amazon Product Advertising APIを使って商品名と最低価格を取得する

# 目的
AmazonサイトからAPIで商品名と最低価格を取得したのでメモしておく。
※AMAZONのAPI仕様、ライブラリの仕様が変更になるかもしれない。以下は2015年3月10日時点で動作したもの。

# 想定環境
* Python 2.7
* AmazonのAPIにはbottlenose[これ](https://github.com/lionheart/bottlenose)を使用。
* XMLにはBeautifulSoup 3.2.1 [ここ](http://www.crummy.com/software/BeautifulSoup/)を使用。

# 事前準備
* Amazonマネージメントコンソールからアクセスキーを取得。（Security Credentials->Access Keys）
* アソシエイト（アフィリエイト）の登録。
* bottlenoseとBeautifulSoupインストール。

```py
pip install bottlenose
pip install BeautifulSoup
```

# コード

```py
# -*- coding: utf-8 -*-
import bottlenose
from BeautifulSoup import BeautifulSoup
import random
import time
from urllib2 import HTTPError

AWS_ACCESS_KEY_ID='******' #マネージメントコンソールから取得
AWS_SECRET_ACCESS_KEY='******' #マネージメントコンソールから取得
AWS_ASSOCIATE_TAG='******-22' #アソシエイト（アフィリエイト）の登録が必要

SearchIndex="Books" #参照 https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/index.html?JPSearchIndexParamForItemsearch.html
Keywords="Python" #検索キーワード

def error_handler(err):
  ex = err['exception']
  if isinstance(ex, HTTPError) and ex.code == 503:
    time.sleep(random.expovariate(0.1))
    return True

amazon = bottlenose.Amazon(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ASSOCIATE_TAG,Region="JP",ErrorHandler=error_handler)

#結果ページ数取得
response = amazon.ItemSearch(
             SearchIndex=SearchIndex,
             Keywords=Keywords,
             ResponseGroup="ItemIds",
             ErrorHandler=error_handler)
soup=BeautifulSoup(response)
totalpages=int(soup.first('totalpages').text)
print "totalPages=",totalpages

#各ページ取得
for page in range(totalpages) :
  print "="*20,"page",page+1
  if page >= 10: # max 10 pages
    break
  response = amazon.ItemSearch(
               SearchIndex=SearchIndex,
               Keywords=Keywords,
               ResponseGroup="Small,OfferSummary",
               ItemPage=page+1,
               ErrorHandler=error_handler)
  soup=BeautifulSoup(response)
  items = soup.findAll('item')
  for item in items:
    print item.title.text ,
    if item.offersummary and item.offersummary.lowestnewprice:
      print item.offersummary.lowestnewprice.formattedprice.text,
    print
```

# 分かったこと。分からなかったこと。
* APIの呼出し回数の制限があるので、呼出し失敗時にはsleepしてリトライする。
* 検索は最大100件（10件×10ページ）まで。（2011年ごろに設定された制約）
* 検索時のデフォルトは新品のみのはずが、中古品まで含まれてしまう。（新品価格がうまく取れない場合がある。）
mysql 色々メモ

色んな所から抜粋

dbサーバへログイン
`$ mysql -u [user_name] -p`

rootパスワード設定

```
mysql> update mysql.user set password=password('root用の任意パスワード') where user = 'root';
mysql> flush privileges;
```

パスワードリセットローカル
`set password=‘’;`

パスワードリセットホスト
`grant all privileges on [db_name].* to root@"192.168.0.1" identified by '' with grant option;`
`grant all privileges on [db_name].* to root@"192.168.0.%" identified by '' with grant option;`

dbの作成
`mysql> create database [db_name];`

ユーザ作成
`mysql> create user [user_name]`

ユーザの確認
`mysql> select host,user from mysql.user;`

権限の付与(ユーザ作成含む)
 `mysql> grant all on [db_name].* to [user_name]@対象IP identified by '[password]';`

色々
管理者権限付き
`grant all privileges on *.* to root@localhost identified by '[password]' with grant option;`
`grant all privileges on *.* to root@"%" identified by '[password]' with grant option;`
一般ユーザ
`grant select,insert,update,delete on [db_name].* to [user_name]@"192.168.%" identified by '[PASSWORD]';`

dbの選択
`mysql> use [db_name];`

dbのデータベース一覧
`mysql> show databases;`

dbのテーブル一覧
`mysql> show tables;`

dbのステータス
`mysql> show status;`

mysqldの文字コード
`mysql> show variables like 'character_%';`

dbの文字コード
`mysql> show create database [db_name];`

<br>
**バックアップ・リストア**

dbのダンプファイルを生成(rootでもよい)
`$ mysqldump -u [user_name] -p [password] [db_name] > [dumpfile]`

リストア先のdbを作成
`mysql> create database [db_name] default character set utf8;`

リストア先のdbユーザと権限を設定
`mysql> grant all privileges on [db_name].* to [user_name]@localhost identified by '[password]';`

dbのリストア
`$ mysql -u [user_name] -p [password] [db_name] < [dumpfile]`

<br>
**全てのデータベースをバックアップ**
`$ mysqldump -u root -x --all-databases > dumpfile`
**特定のデータベースのみバックアップ**
`$ mysqldump -u root <db_name> > dump.sql`
**複数のデータベースをバックアップする場合**
`$ mysqldump -u root --databases db1 db2 db3`
Xcode 6.2にアップデートするとプラグインが効かなくなる問題の解決策


Xcode 6.2になって、どうやらXcodeのUUIDが変更されたようです。
現時点(3/10)で既にプラグイン側で対応済みのものもあるため、プラグインをアップデートすれば解決するものもありますが、私の場合はほとんど未対応のものばかりでした。。。

対応してなければ自分で修正してしまえということで、調べたところ、以下の方法で解決することがわかりました。

1. `~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/plugin.xcplugin/`に移動。(Xcodeにインストール済みのプラグイン一覧のパッケージがある)
1. 修正するパッケージを`パッケージの内容を表示`で開いて`Contents/Info.plist`を開く。
1. Info.plistの中の`DVTPlugInCompatibilityUUID`というArray型のキーの要素に以下のUUIDを追加して保存。  
**`A16FF353-8441-459E-A50C-B071F53F51B7`**
1. Xcodeを再起動。

修正自体は楽ですが、プラグインを大量に入れている方は(私もそうですが)辛いですね。。


**2015/3/11 追記**
以下の記事の方法だと一括で変更できるようです。(jollyjoesterさん情報提供ありがとうございます！)

http://qiita.com/roothybrid7/items/85bacb992a22aaad04cd
.sketchをOS Xアプリのアイコン(.icns)に変換するGulpプラグインをつくった

![intro.png](https://qiita-image-store.s3.amazonaws.com/0/19622/807c141f-9a5e-6e9d-0bbe-93378537acb3.png)

# はじめに

Gulpをつかって .sketch から .icns を生成するために、[gulp-sketch](https://github.com/cognitom/gulp-sketch) の出力結果を.icnsへ変換する [gulp-iconutil](https://github.com/uetchy/gulp-iconutil) というプラグインをつくった。

一般的に、.icns を作るには、様々なサイズのアイコン画像を格納した __iconset__ をつくり、それを `iconutil` に渡せばいい。ここで面倒なのは iconset だ。作成には16x16, 32x32, 64x64, 128x128, 256x256, 512x512の6種類のサイズのアイコンと、さらにそれぞれのRetina用のアイコンも加えて、計12種類ものサイズの画像が必要である。唯一の救いは、最大サイズの画像だけ用意しておけば、不足している小さいサイズの画像は`iconutil`が自動で生成するということだ。

今回作った [gulp-iconutil](https://www.npmjs.com/package/gulp-iconutil) は、Gulpからこの`iconutil`コマンドへの橋渡しをしてくれる。

# アイコンをデザインする

Sketch上に512x512サイズのアートボードを作成し、アプリのアイコンをデザインする。

![dock.png](https://qiita-image-store.s3.amazonaws.com/0/19622/1e10a6c1-4054-0257-5016-aecdc6ab6cd1.png)

> Dock上でアイコンの見栄えをチェックするために、[sketch-dockpreview](https://github.com/fnky/sketch-dockpreview)を使っている。これは本当に便利なプラグインだ。

# .sketch から .icns へ

.sketchからiconsetを作成するために、[gulp-sketch](https://github.com/cognitom/gulp-sketch) を、そして iconset から .icns へ変換するために私がつくった [gulp-iconutil](https://www.npmjs.com/package/gulp-iconutil) を使う。npm からインストール出来る。

Gulpタスクは以下のように書く。

```coffeescript
gulp     = require 'gulp'
sketch   = require 'gulp-sketch'
iconutil = require 'gulp-iconutil'

gulp.task 'icons', ->
  gulp.src 'icons/sketch/*.sketch'
    .pipe sketch
      export: 'artboards'
      formats: 'png'
      scales: '1.0,2.0'
    .pipe iconutil('app.icns')
    .pipe gulp.dest 'icons/'
```

iconsタスクを実行すると、iconsフォルダの中に__app.icns__が生成される。

![result.png](https://qiita-image-store.s3.amazonaws.com/0/19622/e0925596-e8c7-e0cb-9d36-7402d2836b09.png)

あとはこのアイコンファイルをOS X向けビルドにそのまま使える。

# まとめ

デザインデータのポストプロセスの自動化がGulpとsketchtoolのおかげでやりやすくなった。良い時代だ。

[gulp-iconutil](https://github.com/uetchy/gulp-iconutil) は今週リリースしたばかりで若干不安定なので、もしバグを見つけたら[Issue](https://github.com/uetchy/gulp-iconutil/issues)を作るか、[PR](https://github.com/uetchy/gulp-iconutil/pulls)を投げて欲しい。
[JavaScript] ループ途中で抜ける処理は for(in break) ではなく some を使おう♪

`for(in break)` より `Array.prototype.some` のほうがモダンな気分になれます.


## for(in break)

5 より大きかったら break で抜ける

```js
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

for (var i=0,len=arr.length; i<len; ++i) {
    var value = arr[i];
    if (value > 5) {
        break;
    }
    console.log(value);
}
```

[[runstant]](http://goo.gl/FcQiuR)


## Array.prototype.some

5 より大きかったら true を返す.
するとそれ以降のループが止まるので forEach っぽく書けてかつ break っぽいことができます.

```js
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

arr.some(function(value) {
    if (value > 5) {
        return true;
    }
    console.log(value);
});
```

[[runstant]](http://goo.gl/s0ZjcM)