OmniAICreator/Qiita-1.07M huggingface dataset:
一行追加で、ダブルクリック実行時にリダイレクト処理させる

#リダイレクト処理復習

まずは標準出力への出力を、画面ではなくファイルへ変更するリダイレクトについてです。

- 標準出力だけ
``batファイルorコマンド > ファイル名``

- 標準出力だけ(追記)
``batファイルorコマンド >> ファイル名``

- 標準エラー出力だけ
``batファイルorコマンド 2 > ファイル名``

- 標準出力と標準エラー出力を別々に
``batファイルorコマンド > ファイル名 2 > エラーファイル名``

- 標準出力と標準エラー出力を一緒に
``batファイルorコマンド > ファイル名 2>&1``


ただ、この場合はコマンドラインで実行時にリダイレクト指定する必要があるので、batをダブルクリック実行したときは利用できません。

#ダブルクリック実行時にリダイレクト処理させたい！

(｀・ω・)<たい！

##先頭に一行追加します

実行スクリプト：sample.bat
出力ファイル：test.log

```lang:hoge.bat
@echo off & if not "%HOGE%"=="hoge" ( set HOGE=hoge&call "%~dp0sample.bat" > test.log&exit)&@echo on
```
これで、ダブルクリック実行時でもファイル出力ができます。

eof使う場合（2行になっちゃいますが…)

```lang:hoge.bat
@echo off & if not "%HOGE%"=="hoge" ( set HOGE=hoge&call "%~dp0sample.bat" > test.log&goto eof)&@echo on

-----処理------

:eof
```

##展開してみる
```lang:sample.bat
@echo off
 if not "%HOGE%"=="hoge" ( 
   set HOGE=hoge
   call "%~dp0sample.bat" > test.log
   exit 
 )
@echo on
```
初回（環境変数HOGEに値が入っていない）は環境変数に値を設定して、自分自身を呼び出します。この時にリダイレクト指定を行っています。
呼び出したあとはif文に入らないので、その後の処理が行われます。


##ポイント
###"%HOGE%"=="hoge"
起動したコマンドの環境変数は起動されたコマンドの環境変数に引き継がれることを利用しています。
また、コマンドプロンプトから新たに登録した環境変数は終了後破棄されるので同環境で何度も実施が可能です。

###%~dp0
実行されているファイルが置かれているカレントディレクトリを表すお決まりの書き方です。

|記号|意味|
|:----|:------|
|%0|実行されているファイルのパス|
|~|"を削除する|
|d|ドライブ文字だけに展開する|
|p|ファイル名を除くパスの部分に展開する|

それぞれで実行すると、以下の通りになります。(ex デスクトップで実行）

```lang:確認用.bat
@echo off
echo %0
echo %~0
echo %~d0
echo %~p0
echo %~dp0
```

```text:出力結果
"C:\Users\username\Desktop\確認用.bat"
C:\Users\username\Desktop\確認用.bat
C:
\Users\username\Desktop\
C:\Users\username\Desktop\
```

「%~dp0」は「\」で終了しているので、「%~dp0sample.bat」と語尾にファイル名を付けて使用しますが、call実行時に空白を含むパスだとエラーになるため「"%~dp0sample.bat"」としています。

#参考
勉強になりましたm(_ _)m！

[環境変数（他、%~dp0 等）]
(http://tenukipg.seesaa.net/article/8510841.html)
[batファイルで、そのファイル自身のパスを取得する](http://d.hatena.ne.jp/fuzzhead/20080930/p1)
[Windows、バッチファイル（.bat）を最小化した状態で起動する]
(http://piyopiyocs.blog115.fc2.com/blog-entry-731.html)
sync-settingsでの設定ファイル自動アップロード

うぉー！！！Atomの設定が全部飛びやがった！！！！


どうやら「[Changing UI/Syntax theme colors 3 times reverts ALL settings to defaults #8834](https://github.com/atom/atom/issues/8834)」に引っかかったっぽくて初期設定に戻ってしまいました。

ってことで、遅ればせながら [sync-settings](https://atom.io/packages/sync-settings)パッケージを導入してました。

いろいろなページで設定方法が書いてありますので、やり方はそちらを見ていただく(Gistはプライベートで作ったほうがいいですよ)として、ちょっと気になるのが自動でアップデートされないという点。
まあ、リモートとローカルどちらが新しいかどうかの検出はなかなか面倒ですよね。

でも、自動でアップロードしてもらわないと今回みたいにいきなり消えた時が怖いわけです。

ってことで、起動時に強制的にアップロードするように設定してみました。いざとなったらGistの履歴を追えばいいだけだし。

```init.coffee
setTimeout () ->
  atom.commands.dispatch(workspaceView, 'sync-settings:backup');
, 1000
```

setTimeout使わなくてもどうにか出来そうなんだけど、タイミングの問題でうまくいかなかったので少しタイミングをずらす感じで。

でも、よく考えたらDropbox使えばいい話なんだけど、今でも.atomは400MB超えだしなぁ。
それか、比較してアップロードするプラグイン作ったほうが早いかなぁ。

まあ、とりあえずってことで。
CSSの:hoverアニメーションで、マウスオーバー／アウト時の処理を変化させる

:hover擬似クラスとCSSアニメーションを組み合わせることで、ボタン要素などの簡易的なマウスオーバーアニメーションを実現できます。

## 1秒かけて背景色がアニメーションするボタン

~~~html:HTML

<button type="button">ボタン</button>

~~~

~~~css:CSS

button {
	background-color: #f00;

	/* 1秒かけて背景色をアニメーションさせる */
	transition: background-color 1s;
}

button:hover {
	/* マウスオーバー時に背景色をグレーに変更 */
	background-color: #333;
}

~~~

<p class="codepen" data-height="300" data-theme-id="18225" data-default-tab="css,result" data-user="shouchida" data-slug-hash="pozWWGO" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="pozWWGO">
  <span>See the Pen <a href="https://codepen.io/shouchida/pen/pozWWGO/">
  pozWWGO</a> by Sho Uchida (<a href="https://codepen.io/shouchida">@shouchida</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## マウスアウト時はもっと素早く変化させたい

上記の例では、マウスオーバー時とマウスアウト時のアニメーション速度はどちらも「1秒」になります。

「マウスアウト時のアニメーション速度は0.5秒にしたい」など、マウスオーバー／アウト時の処理を変化させたい場合は、通常時と:hover擬似クラスの両方に transition プロパティを指定します。

~~~css:CSS

button {
	background-color: #f00;

	/* マウスアウト時、0.5秒かけて背景色をアニメーションさせる */
	transition: background-color 0.5s;
}

button:hover {
	background-color: #333;

	/* マウスオーバー時、1秒かけて背景色をアニメーションさせる */
	transition: background-color 1s;
}

~~~

<p class="codepen" data-height="300" data-theme-id="18225" data-default-tab="css,result" data-user="shouchida" data-slug-hash="mdbBBNm" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="mdbBBNm">
  <span>See the Pen <a href="https://codepen.io/shouchida/pen/mdbBBNm/">
  mdbBBNm</a> by Sho Uchida (<a href="https://codepen.io/shouchida">@shouchida</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>

## アニメーション対象プロパティを増やして複雑な動きを実現する

transition プロパティは、対象とするCSSプロパティを「カンマ区切りで複数」設定できるため、記述の仕方によってより複雑なアニメーションも実現できます。

下記の例では background-color と border-radius の2つのプロパティをそれぞれ異なる速度で変化させています。

~~~css:CSS

button {
	background-color: #f00;
	transition: background-color 0.5s, border-radius 1s;
}

button:hover {
	background-color: #333;
	border-radius: 20px;
	transition: background-color 1s, border-radius 2s;
}

~~~

<p class="codepen" data-height="300" data-theme-id="18225" data-default-tab="css,result" data-user="shouchida" data-slug-hash="jONGGgv" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="jONGGgv">
  <span>See the Pen <a href="https://codepen.io/shouchida/pen/jONGGgv/">
  jONGGgv</a> by Sho Uchida (<a href="https://codepen.io/shouchida">@shouchida</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
ボタンが押されたら通知する

ESP8266にnodemcuを入れて、押しボタンを接続して、ボタンが押されたらiFTTTでiPhoneに通知する。

◯接続
RSTとGNDの間にプッシュボタンをつなぎ、RSTとGPIO16を繋ぐ

◯動作
起動するとWi-Fiの接続を確認してiftttにつなぐ。送信したらdeepsleepに入る。
⭐️単純にこのままだとメンテナンスできないので、起動時にGPIO14がlowだと何も処理せず、sleepもしないようにする(これでシリアルでメンテできる)

◯コード
<pre>
-- wake up, check wifi connection

print("button_ifttt")

function send_ifttt()
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload)
print(payload) 
end) 
conn:on("connection", function(c) 
tmr.stop(0)
print("connected")
conn:send("GET /trigger/test/with/key/YOURKEY?value1=button HTTP/1.1\r\n") 
conn:send("Host: maker.ifttt.com\r\n")
conn:send("Accept: /\r\n") 
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.)\r\n") 
conn:send("\r\n")
end)
conn:on("sent", function(c)
print("sent")

-- deep sleep infinite
tmr.delay(500000)
-- node.dsleep(0)
end)
tmr.alarm(0, 30*1000, 0, function()
-- abort
print("connecting timeout")
conn.close()
tmr.delay(500*1000) -- 500msec
-- node.dsleep(0)
end)
conn:connect(80,'maker.ifttt.com') 
end

led = 2
gpio.mode(led, gpio.OUTPUT)
function ledOn()
gpio.write(led, gpio.HIGH)
end
function ledOff()
gpio.write(led, gpio.LOW)
end

check = 0
function check_wifi()
tmr.alarm(0, 1000, 1, function()
ledOn()
print("check wifi connection")
if 5 == wifi.sta.status() then
print("let's ifttt")
tmr.stop(0)
send_ifttt()
else
if 10 > check then
print("wait wifi connection...")
check = check + 1
else
-- restart 1min later
print("retry 1min later")
tmr.stop(0)
tmr.delay(500000)
node.dsleep(60*1000*1000)
end
ledOff()
end
end)
end

ledOn()

gpio.mode(5, gpio.INPUT, gpio.PULLUP)
if gpio.LOW == gpio.read(5) then
print("abort")
else
check_wifi()
end

</pre>
※念のためにdeepsleepはコメントアウトしてあります

◯補足
はじめはGPIOでのキャンセル処理してを入れてなくて、ファーム書き込みをやり直す羽目になりました。
さらに、ファーム書き込みに失敗したのか起動時にへんなメッセージが、、、(*_*)
何度かファーム書き込みをやり直して復活しました

◯課題
Wi-Fiが繋がらないと無限リトライになっているので諦めるようにする
さくらのレンタルサーバーで、PHPのtimezoneエラーが出たため設定を整える

「さくらのレンタルサーバー」スタンダードプランで、
phpinfo()　を表示したところ、以下のようなtimezoneエラーが発生

<pre><code>date

Warning: phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /home/hogehoge/www/phpinfo.php on line 2
</code></pre>

php.iniにtimezoneの設定がされていないことによるエラー。

さくらのコントロールパネルから、php.iniに以下を追記。

<pre><code>date.timezone = Asia/Tokyo</code></pre>

これでエラーが解消される.


phpのコードを書いても、エラーが表示されない。

同じく、php.iniに以下を追記

<pre><code>display_errors = On</code></pre>


これでphpのエラーが表示されるようになる。
JenkinsからSSHでsudo操作するための設定

# JenkinsからSSHでLinux(CentOS7)サーバーのsudo操作をするとき

例えば、
Jenkinsさんに
「Linuxサーバーに繋いで、
```
sudo systemctrl restart httpd
```
なんかを実行してもらいたい！」

しかし、sudoでやるコマンドなんて彼には恐れ多いのか、頑なにやってはくれない。。。
そんな彼にどうにかやってもらうための方法。
（かなり大雑把なやり方なので細かく権限をわけたいのであればもうちょっとググったほうがいいです）


## ttyが無い

- sudo: sudo を実行するには tty がなければいけません。すみません

すいませんとかいらないから解決策を言ってほしい。

Linuxにログイン

```
(rootユーザで)
visudo
```

sudoersが編集状態になるので、

```shell:/etc/sudoers
 Defaults requiretty
 ↓
 # Defaults requiretty
```

しかし解決せず…。↓

## askpassが指定されてない

- sudo: 端末 (tty) が存在せず、パスワードを尋ねる (askpass) プログラムが指定されていません

詳細にムリと言われた（すいませんとは言われなくなった）。

Linuxにログイン

```
(rootユーザで)
visudo
```

sudoersが編集状態になるので、

```shell:/etc/sudoers
(一番下に追加)
ssh_user ALL=(ALL) NOPASSWD:ALL
```

- 「ssh_user」は適宜自分のJenkinsさんからSSH接続するときのユーザ名に合わせてください。

- すでにある場合は↑のように変更。


ちなみに、これは

**ssh_user さんは パスワード無しでrootと同じこと全部できるぜ！**
という強気の設定です。

重ねて言いますが
かなり大雑把なやり方なので細かく権限をわけたいのであればもうちょっとググったほうがいいです！
ProgressBar.jsを使ってみた

円形のプログレスバー探してたら見つけたので[Try In](http://jsfiddle.net/kimmobrunfeldt/8xa87k31/392/)を参考に使い方をまとめる。

#１．モジュールの読込み
ProgressBar.jsファイルの読み込みと、プログレスバーを表示する要素を準備する

```lang:HTML
<script src="https://rawgit.com/kimmobrunfeldt/progressbar.js/master/dist/progressbar.js"></script>

<div id="container"></div>
```
#２．JavaScriptでプログレスバー作成

下記のコードで円状のプログレスバーが表示される。

``` JavaScript
var circle = new ProgressBar.Circle('#container', {
    color: '#FCB03C'
});

circle.animate(1.0); 
``` 

#３．色々やってみる
##１．上記の動作確認
まずは上記の[動作確認](http://jsdo.it/kazkaz613/moMX)をしてみた。
実行すると、円が描かれる。

##２．回してみる
CSSで回転させながら、100％まで達したら逆回転で0％まで
[サンプル](http://jsdo.it/kazkaz613/GmZA/)

##３．mouseoverで決定動作
そもそもこれがやりたかった。
各サークル上に一定時間マウスカーソルがあれば決定動作を行う。
[サンプル](http://jsdo.it/kazkaz613/2yoz)

##４．三角や四角
たぶん、Pathを使ってやるんだと思うけど現時点では分からず。
SVGを勉強してから再度トライ。
Emacs Mac PortをHomebrewからインストールする

今まで Homebrew 標準の Emacs に IME パッチを当てて使っていたんですが、 Emacs Mac Port の方が良いという噂を聞いたので乗り換えてみました。

具体的には、minibuffer 入力時に IME を勝手にオフにしてくれる機能について期待して導入してみたのですが、実際に使い勝手が良くなった気がします。

# インストール手順(その1)

```
$ brew tap railwaycat/emacsmacport
$ brew install emacs-mac --with-modern-icon
```

`/usr/local/Cellar/emacs-mac/emacs-24.5-z-mac-5.10` のようなディレクトリにインストールされるので、`brew linkapps` するなり、よしなにランチャーに登録したりします。

# インストール手順(その2)

Homebrew Caskを使うという手もあります。Homebrew Cask設定済みとして、次のようにすればインストールできます。

```
$ brew tap railwaycat/emacsmacport
$ brew cask info emacs-mac
```

ただし、こちらでインストールするとアイコンを選択できないという問題があります。

# 設定

インストール後、`init.el`に次のような設定を追加します。

```el
  ;; Emacs Mac Port 用設定
  ;; ミニバッファで入力する際に自動的にASCIIにする
  (when (fboundp 'mac-auto-ascii-mode)
    (mac-auto-ascii-mode 1))
  ;; カーソルの色を変える
  (when (fboundp 'mac-input-source)
    (defun my-mac-selected-keyboard-input-source-chage-function ()
      "英語のときはカーソルの色をdim grayに、日本語のときはbrownにします."
      (let ((mac-input-source (mac-input-source)))
        (set-cursor-color
         (if (string-match "\\.Roman$" mac-input-source)
             "dim gray" "brown"))))
    (add-hook 'mac-selected-keyboard-input-source-change-hook
              'my-mac-selected-keyboard-input-source-chage-function))

```

上記の `"\\.Roman$"` の部分はATOK用なのでご注意ください。

# Emacs Mac Portとは

Emacs Mac Port というのは Yamamoto Mitsuharu さんの手による Emacs へのパッチで、公式配布元は下記です。 emacs-devel ML でアップデートのアナウンスがされているようです。

- ftp://ftp.math.s.chiba-u.ac.jp/emacs/
- http://www.math.s.chiba-u.ac.jp/~mituharu/emacs-mac.git

これをXin Xuさん（@railwaycat）が Homebrew で簡単に扱えるようにしてくれたようです（参照：https://github.com/railwaycat/homebrew-emacsmacport ）。つまり、 Homebrew からのインストールは非公式ということになります。

# 参照

- [Emacs Lispの汎変数（とその他） - Qiita](http://qiita.com/kawabata@github/items/9a1a1e211c57a56578d8)
2015年度前期の反省　byゆうじん

#Qitta(良かったこと)
-　多少英語を覚えた
-　swift頑張った
-　親と口喧嘩で勝った

#Quitta(悪かったこと)
- テストの点数が悪かった
- 成績が下がっている（現在進行形）
- 文化祭の編集*ミスり*まくった
手動でAirbrakeへエラー通知を送る

Airbrakeからの通知をチャットで受け取ってホゲホゲみたいなものを作っている時に任意のタイミングで通知を受け取りたかった。
Slack Integraton 設定でテスト投稿できるけど、"Test message created from Airbrake.*​" で疎通確認するだけで実際のレポートと形式が違う。

ブラウザのJavaScriptコンソールから以下を実行する

```js
// おまじない
Airbrake._params.arguments = [];
Airbrake.push({error: "にゃー"});
```

![スクリーンショット 2015-09-18 6.32.58 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/219fd1dc-6227-f0ae-e010-14932a7fd002.png)

送れました。

## たくさん送る。

```js
_.times(10, () => { Airbrake.push({error: "クケー"}) });
```

他人のサイトで試さないように
Objective-CのSQLiteでUNIX timeを扱う

# UNIX timeとは

1970-01-01T00:00:00Zからの形式的な経過秒数。

## 別名

UNIX時間、UNIX時刻、POSIX time、Epoch time

## 問題点

* [2038年問題](https://ja.wikipedia.org/wiki/2038%E5%B9%B4%E5%95%8F%E9%A1%8C) / Wikipedia
* 閏秒が無視されるため、実質的な経過秒数ではない。（=形式的な経過秒数）
 * [協定世界時 (UTC) との関係](https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93#.E5.8D.94.E5.AE.9A.E4.B8.96.E7.95.8C.E6.99.82_.28UTC.29_.E3.81.A8.E3.81.AE.E9.96.A2.E4.BF.82) / Wikipedia

# 方針

* SQLite側はUTCで扱う。
* iOS側はローカルタイムで扱う。（端末設定に従う）
* 海外対応。
* 超昔や超未来には対応しない。
 * 2038年問題も基本的に気にしない。

# Objective-C

## NSDate

```objc
//UNIX timeからNSDateを取得
+ (instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;
//NSDateをUNIX timeで初期化
- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)secs;
//NSDateからUNIX timeを取得
@property (readonly) NSTimeInterval timeIntervalSince1970;
```

使用例

```objc
NSTimeInterval now = NSDate.date.timeIntervalSince1970;
NSLog(@"now      = %f", now);
NSDate *date = [NSDate dateWithTimeIntervalSince1970:now];
NSLog(@"NSDate   = %@", date);
NSLog(@"UNIXtime = %f", date.timeIntervalSince1970);

//now      = 1444186520.342127
//NSDate   = 2015-10-07 02:55:20 +0000
//UNIXtime = 1444186520.342127
```

## NSDateFormatter

* [NSDateFormatterの使い方まとめ](http://qiita.com/gonsee/items/d3fb641914d2ca45e858) / Qiita

**（まとめ中）**

# SQLite

## Date And Time Functions

http://www.sqlite.org/lang_datefunc.html

* `modifier`には`'unixepoch'`を使う。
* `format`には`%s`を使う。

```sqlite3
sqlite> select datetime( 0, 'unixepoch' ); -- 1970-01-01 00:00:00
sqlite> select strftime( '%Y%m%dT%H%M%SZ', 0, 'unixepoch' ); -- 19700101T000000Z
sqlite> select strftime( '%s', '19700101T000000Z' ); -- NULL /* 基本形式はダメらしい */
sqlite> select strftime( '%s', '1970-01-01T00:00:00Z' ); -- 0

sqlite> select strftime( '%s', 'now' ); -- 1442565125
sqlite> select datetime( 1442565125, 'unixepoch' ); -- 2015-09-18 08:32:05
sqlite> select strftime( '%Y%m%dT%H%M%SZ', 1442565125, 'unixepoch' ); -- 20150918T083205Z
sqlite> select strftime( '%s', '20150918T083205Z' ); -- NULL /* やっぱり基本形式はダメらしい */
sqlite> select strftime( '%s', '2015-09-18T08:32:05Z' ); -- 1442565125
```

## 使用例

* ひと月分のレコード抽出

DATEカラムの型はINTEGERでUNIX timeが入っている。

```sqlite3:TESTテーブルからDATEカラムが2015年9月のレコードを抽出する
sqlite> select * from TEST where strftime('%Y%m',DATE,'unixepoch') = '201509';
```

```sqlite3:TESTテーブルからDATEカラムが今月のレコードを抽出する
sqlite> select * from TEST where date(DATE,'unixepoch','start of month') = date('now','start of month');
```

と書いてはみたものの、日本で「2015年9月」や「今月」と言っても、UTCでは月を跨いでしまうので、このままでは使えない‥。

# 付録

* [UTC](https://ja.wikipedia.org/wiki/%E5%8D%94%E5%AE%9A%E4%B8%96%E7%95%8C%E6%99%82) / Wikipedia
* [ISO 8601](https://ja.wikipedia.org/wiki/ISO_8601) / Wikipedia
* RFC 3339
 * ISO 8601とほぼ同じ？

# あとがき

より良い書き方などがあれば教えていただけるとありがたいです。（特にSQLiteはド素人なので）
Swift2.0でのRealmの使い方


Swift2.0対応のRealmオブジェクトのインスタンス化するときの仕様が変わったようです。
バージョンはRealm0.95.0です。

公式サイトでは、以下のコードがサンプルにありますが、エラーがでます。
"Call can throw, but it is not marked with 'try' and the error is not handled"

```Swift
let realm = Realm() // ここでエラーがでます。

realm.write {
    realm.add(mydog)
}
```

こちらの[stackoverflow](http://ja.stackoverflow.com/questions/14194/swift-2%E3%81%A8realmswift%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%A8%E3%83%A9%E3%83%BC-call-can-throw-but-it-is-not-marked-with-try-and)で回答がありました。

>RealmSwiftのAPIも標準のエラー処理の方法に沿うように、Swift 2からはAPIが変更されていますので、それに合わせて変更する必要があります。

>具体的には、Realmをインスタンス化はエラーが起こる可能性（書き込み権限が無い、パスが間違っている、など）のある処理ですので、エラー処理が必要になります。


```Swift
do {
  let realm = try Realm()
  realm.write { realm.add(myDog) }
}
catch {
  print("Error...")
}
```

または、エラー処理が無用な場合は、こちらも使えるようです。

```Swift
let realm = try! Realm()

realm.write {
    realm.add(myDog)
}
```
$x(path)でxpath式に当てはまるDOM要素を返す。


タイトルの通り。

Google Chromeのコンソールパネルから

```
$x("//p[a]")

```

みたいな感じで、xpath式で該当するDOM要素を返してくれる。

Capybaraでxpath形式で指定しているのがあっているのかを確認するときに便利だった。


## 参考

[javascript - What is the variable $x used for in Chrome? - Stack Overflow](http://stackoverflow.com/questions/10661949/what-is-the-variable-x-used-for-in-chrome)

[Command Line API Reference - Google Chrome](https://developer.chrome.com/devtools/docs/commandline-api#xpath)
Powershellを楽に実行してもらうには

#PowerShellで何かつくったよ！
##実行できない(´・ω・｀)

せっかくPowershellでつくったのに、いざみんなに使ってもらおうと思ったら実行できない/実行方法を説明するのも大変…といったことはありませんか？

私はありました。

～みんなの声～
「ダブルクリックしたらソースが表示されたんだけど…」せやねん
「実行したら赤字でエラー出てきた　失敗？」ちゃうねん
「なんでbatじゃないの」PS好きやねん

かなしい。

##実行ポリシーあるからね
Powershellはデフォルトの設定ではどうあがいてもスクリプトを実行できないようになっています（下記表のRestricted)。
batみたいに「あ、実行したくないのにうっかりダブルクリックしちゃった！」を防ぐには大変有効な設定なのですが、同時に煩わしい点でもあります。

この設定のことは実行ポリシー（セキュリティポリシー）といって、以下の４つがあります。

|引数| ローカル| リモート |
|:-----------|:------------:|:------------:|
| Restricted |×|×|←でデフォルト
| AllSigned | 署名付きのみ〇|署名付きのみ〇|
| RemoteSigned |〇|署名付きのみ〇|
| Unrestricted |〇|〇|

※リモート：インターネットからＤＬしてきたps1、または別サーバ上のps1
※署名付きの話は割愛します

今の実行ポリシーを確認するときは以下、
``Get-ExecutionPolicy``

実行ポリシーを変更するときは上記表の引数を指定して実行します。
(※レジストリを変更するので管理者権限でPowershellを実行してください)
``Set-ExecutionPolicy 引数``

自分のローカルにあるps1を実行するには、RemoteSignedで十分です(｀・ω・´)

というわけで、上記を踏まえたうえで(なるべく)楽にPowershellを実行してもらうにはどうしたらいいのかをまとめました。

#コマンドラインから実行してもらう
コマンドラインから実行してもらう場合のお話。
ただ、普段から使っているならそもそも実行でつまづかないかも…

##**powershell編**

配布ファイル：「hogehoge.ps1」

1. Powershellを管理者権限で起動します
2. ps1配置場所に移動します(Set-Location)
3. 実行ポリシーを変更します  
``Set-ExecutionPolicy RemoteSigned``⇒yes 
4. 実行します  
``.\hogehoge.ps1``
5. 実行ポリシーを戻します  
  ``Set-ExecutionPolicy Restricted ``⇒yes

※　4.でhogehoge.ps1の絶対パスを指定する場合、2.は不要です。


##**コマンドプロンプト編**
配布ファイル：「hogehoge.ps1」

1. コマンドプロンプトを起動します(cmd)
2. ps1配置場所に移動します(cd)
3. 実行します  
``powershell -NoProfile -ExecutionPolicy Unrestricted .\hogehoge.ps1``

※　3.でhogehoge.ps1の絶対パスを指定する場合、2.は不要です。
※　3.は一時的に実行ポリシーを変更しているだけなので、元に戻す操作は不要です。

#ダブルクリックで実行してもらう
「やっぱりbatみたいにダブルクリックで実行したい＞＜！」という場合のお話。
別ファイルを作ることになりますが、実行ステップは(ちょっと)少なくできます。

##**ショートカット作成編**
配布ファイル：「hogehoge.ps1」

1. ps1のショートカットを作成します
2. ショートカットの右クリックプロパティ＞リンク先の前に以下を追加します  
``powershell -ExecutionPolicy RemoteSigned -File ``
3. ショートカットをダブルクリックして実行します

##**bat作成編**
あらかじめ、実行用のbatを作成します。
※powershellから始まる行以外は特になくても構いません。

```lang:run.bat
@echo off
echo 〇〇〇をしています…
powershell -NoProfile -ExecutionPolicy Unrestricted .\hogehoge.ps1
echo 完了しました！
pause > nul
exit
```

配布ファイル：「hogehoge.ps1」「run.bat」

1. batとps1を同ディレクトリに配置します
2. batをダブルクリックして実行します


#おわり

これでもう怖くない｡ﾟ+.*(+･｀ω･)９　！！
aws-sdk-for-javaでs3にファイルを置こうとするとThe bucket you are attempting to access must be addressed using the specified endpoint.

#amazonのサンプル
https://github.com/awslabs/aws-java-sample/blob/master/src/main/java/com/amazonaws/samples/S3Sample.java

#そのまま動かそうとするとエラー出る

```
com.amazonaws.services.s3.model.AmazonS3Exception: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint. (Service: Amazon S3; Status Code: 301; Error Code: PermanentRedirect; Request ID: 799D4ED8AD64CB1F)
```

デフォルトでUSのエンドポイントにアクセスしてしまう。らしい。

#エンドポイントを指定したバージョン
```java
        AmazonS3 s3 = new AmazonS3Client();
        Region usWest2 = Region.getRegion(Regions.US_WEST_2);
        s3.setRegion(usWest2);
        s3.setEndpoint("https://s3-ap-northeast-1.amazonaws.com"); // ここでエンドポイント指定

        String bucketName = "sync-dmp-test";
        String key = "hoge";

        s3.putObject(new PutObjectRequest(bucketName, key, createSampleFile()));
```

これでいけた。
#参考
http://dqn.sakusakutto.jp/2012/10/aws_sdk_for_java_amazons3.html
導入を検討したいフロントライブラリメモ

#cmltracker

https://github.com/auduno/clmtrackr

デファクトなFaceDetectionライブラリ
割りとLowlevelなので、ゴニョゴニョできるスキルが必要

# Chroma
https://github.com/gka/chroma.js

色にまつわるめんどくさいことを、いろいろやってくれそう。


#loglevel
https://github.com/pimterry/loglevel

デフォルトのログだと信用しきれないので。


#PeerJS
http://peerjs.com/

P2P通信のクライアント実装
使いすぎなければ、WebRTCサーバーの無料枠のAPIkeyもらえる。

だれかとP2Pしたかったらぜひ使ってみたい。

# Howler
http://goldfirestudios.com/blog/104/howler.js-Modern-Web-Audio-Javascript-Library

デファクトなサウンドライブラリ。
インタラクションに音は必須っす。

■感想
スマホではBGM鳴らすな。

#fastclick

http://qiita.com/tyfkda/items/a50fe679654a6b33fbd7

手軽にモバイルデバイスのクリックの応答時間を早くできる

■感想
手軽すぎてビビった。
次も使う。

# velocity.js

http://enum-kabu.com/blog/post-1229/

軽い、速い。ということでTweenMaxの代替となり得るかやってみます。

■感想
DOMイジるならいいかも。
DOMいじらないなら`tween.js`がおすすめ

# pixi.js

https://github.com/pixijs/pixi.js

生Canvasをいじるよりこっちにチャレンジしたほうが100倍有意義なきがしました。

■感想
生Canvasをイジるよりは有意義。
ちょっと質感がwebGLクサイいけど、いい感じに使えました。

# video.js

https://github.com/videojs/video.js

Flashのpolyfillがついた、html5 videoの拡張


# jquery.mousewheel.js

https://github.com/jquery/jquery-mousewheel

Scroll量をコントロールしたい時につかう
ブラウザごとの差異は吸収できるけど、あまりよいUIとはいえない

■感想
MacとWindowsでFallbackがんばってね。

# dat.gui.js

http://workshop.chromeexperiments.com/examples/gui/#1--Basic-Usage

手軽にかっこいいGUIを差し込める。
three.jsでしか使ってなかったけど、どんなシーンでも使ったほうがいい奴ですね。
さくっとコレ入れられたらイケメンになれます。

■感想
不満なところは、ある。
x,yのPadコントローラーないかなー〜。
他に良いGUIツール無いかな〜。


# lodash.module

https://lodash.com/docs

lodashは小さく入れる

■感想
ちょっとでもガッツリ使うなら、めんどくさいから全部入れちゃう系から
あんまり無意味

# Svg.js
Snapは重いというひとに

http://svgjs.com/

■ 感想
APIがちょっと使いづらい。でも次も使うと思う。
Apache のエラーログを slack に送る

# はじめに
ようやく slack を使い始めたので，手始めに Apache のエラーログを転送してみる．ほぼ [ここ](http://wadap.hatenablog.com/entry/2014/08/19/100642) にある通りで動作するが，多少変更した部分もあるので備忘録も兼ねてまとめておく．

# 準備
ログの収集・転送には fluentd を使う．fluentd はインストールされているものとして，今回必要となるプラグインをそれぞれインストールする．

```shell-session
$ sudo td-agent-gem install fluent-plugin-slack
$ sudo td-agent-gem install fluent-plugin-rewrite-tag-filter
$ sudo td-agent-gem install fluent-plugin-record-reformer
```

また，apache のログが置かれている /var/log/apache2 へのアクセスは root 権限が必要になっている．
そのため，fluentdの実行ユーザを root に変更しておく．Ubuntu の場合，/etc/init.d/td-agent を開き td-agent から変更する（[参考](http://qiita.com/mickey390/items/7b3573c6f5bd1d964525)）．

```bash:td-agent
# TD_AGENT_USER=td-agent
# TD_AGENT_GROUP=td-agent
TD_AGENT_USER=root
TD_AGENT_GROUP=root
```

CentOS の場合，/etc/sysconfig/td-agent に下記を追加する．

```bash:td-agent
TD_AGENT_USER=root
TD_AGENT_GROUP=root
```

# fluentd の設定
次に fluentd の設定を行う．使った設定は下記の通り．

```apache:td-agent.conf
####
## Source descriptions:
##

## apache error log.
<source>
  type tail
  format /^\[(?<time>[^\]]*)\] \[(?<level>[^\]]*)\] \[client (?<client>[^\]]*)\] (?<message>.*)$/
  time_format %a %b %d %H:%M:%S %Y
  pos_file /tmp/td-agent/httpd_error_log.pos
  path /var/log/httpd/error_log
  tag httpd.error_log
</source>

####
## Edit descriptions:
##
<match httpd.error_log>
  type rewrite_tag_filter
  rewriterule1 level error slack.${tag}
</match>

<match slack.**>
  type record_reformer
  tag reformed.${tag}
  <record>
    source_id ${tag_suffix[1]}
  </record>
</match>

####
## Output descriptions:
##
<match reformed.slack.**>
  type slack
  webhook_url <slack の設定からコピー>
  channel admin
  username fluentd
  title_keys source_id
  title %s
  color danger
  flush_interval 5s
</match>
```

どのサーバから来たエラーなのかタイトルに入れて表示しようと思い，初めはホスト名をタグに含めてタグからタイトルを構成しようとしていた．だが，slack プラグインはタグのプレースホルダに対応していないようなので，record_reformer プラグインで source_id を追加することにした．

あと，ログと日付のフォーマットは環境によって異なるので，拾ってきた値をそのまま使うとエラーの原因になる．

```
format /^\[(?<time>[^\]]*)\] \[(?<level>[^\]]*)\] \[client (?<client>[^\]]*)\] (?<message>.*)$/
time_format %a %b %d %H:%M:%S %Y
```

エラーが出る場合は上記の設定を適切なものに変更する．
RDSのパッチを当てると Ship Error 2003: error reconnecting to master になる

# 現象
Amazonから"Upgrade now available for your Amazon RDS for MySQL database instances"というタイトルで来ているメールのアップデートを適用すると、Slaveからmasterへ接続できなくなる

```
Ship Error 2003: error reconnecting to master 'rdsrepladmin@<ip-address>:3306' - retry-time: 60  retries: 1
```

# 原因
パッチ適用後、再起動するとmasterのIPが変わってしまっている

# 対処法
エラーの出ているインスタンスで以下のコマンドを順番に実行

```
CALL mysql.rds_stop_replication;
CALL mysql.rds_start_replication;
```

または、時間が解決する？
Vagrantのup時、httpdが自動起動しないとき

#vagrantのup時にhttpdが自動起動しない。
困った、というわけでもないが毎回手動でstartしてやるのも面倒くさい。


##どうやら共有ディレクトリがマウントされてない状態で起動しようとしてこけているらしい。。
参考：[Vagrant上のCentOSでhttpd.confをVagrant共有ディレクトリのシンボリックリンクにしているとOSブート時にhttpdが自動起動しない #vagrant #apache](http://nori3tsu.hatenablog.com/entry/2014/03/22/123313)


他にも解決方法はないかと色々探ってみたらどの検索結果も同じことを言っている。
`「centos側の起動スクリプトをいじれ」`

##Linux側のをいじるのもなんやら面倒くさい。。
VagrantFile側でなんとかできないかなと思ったらできたのでメモ。

```lang:VagrantFile
config.vm.provision :shell, run: "always", :inline => <<-EOT
    sudo service httpd restart
EOT
```
この3行を末尾のendの手前あたりに追加してやればOK。
[vagrantリファレンス](https://docs.vagrantup.com/v2/provisioning/basic_usage.html)
`run "always"`がミソ。
vxlanでgceとec2の上に仮想ネットワークを作ってみる

OSはubuntu:14.04を使ってみます。

**準備**

まずは`bridge-utils`をインストールします。

```shell-session
apt-get install bridge-utils
```

あとは、FWの設定で`8472/udp`を開けておきましょう。

**node1(EC2)**

* global ip: 123.10.20.34 (例)
* local ip: 10.1.2.3

```shell-session
ip li add vxlan0 type vxlan id 10 dev eth0
ip a add 192.168.1.1/24 broadcast 192.168.1.255 dev vxlan0
ip li set vxlan0 up
bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 210.12.34.56
```

**node2(GCE)**

* global ip: 210.12.34.56 (例)
* local ip: 10.200.100.5

```shell-session
ip li add vxlan0 type vxlan id 10 dev eth0
ip a add 192.168.1.2/24 broadcast 192.168.1.255 dev vxlan0
ip li set vxlan0 up
bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 123.10.20.34
```

これで ec2とgceにまたがる仮想ネットワークif`vxlan0`の準備ができました。相互に`ping`も通りますし、`nc`コマンドでチャットをしてみましょう。

**node1**

```shell-session
nc -l 192.168.1.1 -p 1234
hello
```

**node2**

```shell-session
nc 192.168.1.1 1234
hello
```

`ip li add`で指定した`id`は VNI(VXLAN Network Identifier)です。同じ数字を指定すればok。
iOS9 Safariのコンテンツブロッカーなどのアドブロックしていることを検知するFuckAdBlock.js

ios9からコンテンツブロッカーが導入され、アドブロック出来るようになりました。
これまでにもアドブロックする拡張機能はありましたが、認知も含め拍車がかかるかもしれません。

そこで、アドブロックを導入しているユーザーに対して、コンテンツを見せることを制限したり、「広告で成り立っているから、アドブロックを解除してね」とメッセージを表示したりするサイトも中にはあります。

そのように何かしらのアクションを起こすのにアドブロックを導入しているか検知をするのに、FuckAdBlockというのが使えそうです。

https://github.com/sitexw/FuckAdBlock


実際にios9で、Crystalというコンテンツブロッカーを導入し、FuckAdBlockのサンプルサイトを見てみました。

http://sitexw.fr/fuckadblock/

# 通常（コンテンツブロッカー非導入時）
![Slack for iOS Upload-10.png.jpeg](https://qiita-image-store.s3.amazonaws.com/0/24308/d851d319-88f7-95aa-e1d9-4c5eb8dd7d0e.jpeg)


# コンテンツブロッカー導入時
![Slack for iOS Upload-11.png.jpeg](https://qiita-image-store.s3.amazonaws.com/0/24308/b2d5c5c2-f44e-435d-6bf9-b8da4abb9a33.jpeg)


#導入方法
fuckadblock.jsというのを読み込みjsで判別出来るようになるみたいです。詳しくはgithubのreadme.mdに書いてありますので、お試しあれ。

https://github.com/sitexw/FuckAdBlock
Composerでgit上のLibraryを使いたい時のメモ


はじめに
========

PHPのComposerでGit上のライブラリを使いたい時のメモです。
下記を見ればわかる
https://getcomposer.org/doc/05-repositories.md#vcs
のですが、Composer初心者には当たり前のお約束もわからなかったので残しておきます。

今回やりたかったこと
===========

* 「とあるPHPのComposerライブラリ」をForkして今後ややカスタマイズしつつ使いたい
* なので、Github上でForkしてそれをcomposer経由で取ってきたい

どうしたか
========
こう書けばOKだった

```json:composer.json
{
  "repositories": [
    {
      "type": "vcs",
      "url": "https://github.com/yumemi/oauth2-server-php"
    }
  ],
  "require": {
    "bshaffer/oauth2-server-php": "dev-feature/oidc"
  }
}
```

として

```sh
composer install
```

でOKでした。

何に躓いたのか
============

repositoriesの書き方
------------
まず `repositories` の部分で `{"type": "vcs", "url": "<gitURL>"}` で良かった。

＞ もっとごにょごにょ書いてた・・・

package名
-------------
`bshaffer/oauth2-server-php` の部分は、 `oauth2-server-php`の中の **`composer.json`の中の`name`** を使う必要があった。

＞GitのDIR名ではなかった

使いたいブランチ名
---------------
参照したいブランチ名を **`dev-<本当のGitブランチ名>`** にする必要があった。

＞ `feature/oidc` とかにしたり `dev-oidc`というブランチをPushしてたけど、それが間違い。
＞ **`dev-` という Prefix**を用いてその後ろに **ちゃんと存在するBranch名**を指定すれば良かった。
ex) `dev-master`  → Git上の **master** Branchのこと
ex) `dev-develop` → Git上の **develop** Branchのこと

さいごに
========

ドキュメントをななめ読みする人向けのTipsでした・・・(^^;
VagrantでVM間でboxを共有してディスクスペースを節約する

# VagrantでVM間でboxを共有してディスクスペースを節約する

## 動機

Vagrantの使い方を勘違いしていたため、自作のboxでVMをたてるごとに毎回「vagrant box add」して「1VM=1BOX」でVagrantを利用していたのですがさすがにboxのディスクスペースが馬鹿にならなくなってきたので、Vagrantを理解し直してきちんとboxをベースとして使い回すようにします。

## Vagrantfileの書き方

普通に`config.vm.box`で同じbox名を指定すればOKです。VirtualBox上のVM名はVagrantfileが置いてあるディレクトリ名がベースになるので、同じboxでも異なる名前でVMが立ち上がります。

```
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos67"

  config.vm.provider :virtualbox do |vb|
    (中略)
  end
end
```

## 不要なboxデータの削除

不要なboxはコマンドで削除します。

```
$ vagrant box list
(box名を確認します)
$ vagrant box remove (box名)
```

ただし、削除がうまくいかなくてデータが残ったりすることがあります。その場合は以下の場所のデータを削除すればOKです。

- Windows
  - %USERPROFILE%\\.vagrant.d\boxes
- Mac/Linux
  - ${HOME}/.vagrant.d/boxes
[PHP7] OracelDBクライアントインストール（PDO, OCI8）

## PHP7 RC3
2015年9月17日現在、PHP7はRC3までリリースされています。

そこで本日は、OracleDB用のクライアントであるOCI8をインストールしたいと思います。

## instantclient のダウンロード

OracelのWebからダウンロードしてください。
http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

自分の環境では、最新版の``Version 12.1.0.2.0``を使います。

``basic``と``sdk``をダウンロードします。

```shell-session:shell

$ unzip instantclient-basic-linux.x64-12.1.0.2.0.zip
$ unzip instantclient-sdk-linux.x64-12.1.0.2.0.zip

$ ls instantclient_12_1/
adrci
BASIC_README
genezi
libclntshcore.so.12.1
libclntsh.so.12.1
libipc1.so
libmql1.so
libnnz12.so
libocci.so.12.1
libociei.so
libocijdbc12.so
libons.so
liboramysql12.so
ojdbc6.jar
ojdbc7.jar
sdk
uidrvci
xstreams.jar

$ cd instantclient_12_1
$ ln -s libclntsh.so libclntsh.so.12.1

```
PHP7ビルド時にシンボリックリンクが必要になります。



## PHP7のダウンロードとビルド

```shell-session:shell
$ wget https://downloads.php.net/~ab/php-7.0.0RC3.tar.bz2
$ tar jxvf php-7.0.0RC3.tar.bz2
$ cd php-7.0.0RC3
$ ./configure --prefix=$HOME --with-oci8=instantclient,$HOME/lib/instantclient_12_1 --with-pdo-oci=instantclient,$HOME/lib/instantclient_12_1,12.1
$ make
$ make install
```

これで、``$HOME/bin``にphpが出来上がっていると思います。
既存の``php``と分けるために、エイリアスをセットします。

```shell-session:shell
$ alias php7=$HOME/bin/php
$ php7 -v
PHP 7.0.0RC3 (cli) (built: Sep 18 2015 14:45:45)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies
```


``php.ini``の場所は``$HOME/lib``になってます。
変えたかったらコンパイルオプションで`--with-config-file-path=$HOME/etc``などと指定して変えてください。

```shell-session:shell
$ cp php-7.0.0RC3/php.ini-development $HOME/lib/php.ini
```

## OCI8の確認

```shell-session:shell
$ php7 -i | grep oci8
oci8
oci8.connection_class => no value => no value
oci8.default_prefetch => 100 => 100
oci8.events => Off => Off
oci8.max_persistent => -1 => -1
oci8.old_oci_close_semantics => Off => Off
oci8.persistent_timeout => -1 => -1
oci8.ping_interval => 60 => 60
oci8.privileged_connect => Off => Off
oci8.statement_cache_size => 20 => 20

$ php7 -r 'var_dump(PDO::getAvailableDrivers());'
array(2) {
  [0]=>
  string(3) "oci"
  [1]=>
  string(6) "sqlite"
}
```

以上です。
複数の Range を結合する


複数の範囲をくっつけて使いたいシチュエーションがあって、いい書き方がないかなぁ、と探してみた。

単純にやると、配列にして結合するのが手っ取り早いけど、いまいち見づらい。

```ruby
(0..48).to_a + (50..255).to_a
```

調べると、[Stack Overflow](http://stackoverflow.com/questions/21404323/combining-two-different-ranges-to-one-in-ruby) に素晴らしい方法がのってました。

```ruby
[*0..48, *50..255]
```

これは、見やすいですねー
AngularJSで動的にDirectiveの要素名を切り替える


※ 久々のAngularJSネタ. そして内容も殆どネタ(というかキワモノ)です. あしからず

## 背景
極めて稀なケースではあるものの, 「動的にDirectiveの名前を切り替えたい」という要求が生じることがある.

例えば, 以下のように`my-foo-directive`と`my-hoge-directive` という二つのDirectiveが同型のscope引数を受け付けているようなケースを考える.

```html:テンプレート
<my-foo-directive  my-title="ctrl.title" my-name="ctrl.name"></my-foo-directive>
<my-hoge-directive my-title="ctrl.tilte" my-name="ctrl.name"></my-hoge-directive>
```

このとき、上記htmlテンプレートのの`-foo-` とか `-hoge-` の部分を切り替えたい、という意味だ.

無論, 普通に下記のように`ng-if` なり `ng-switch` なりを使って書けば言い訳だけど, 「より少ない行数で表現したい！」という妙な欲求が鎌首をもたげてきた.
普通のコードばっか書いてても面白くないんですもの.

```html:テンプレート
<my-foo-directive  my-title="ctrl.title" my-name="ctrl.name" ng-if="ctrl.type==='foo'"></my-foo-directive>
<my-hoge-directive my-title="ctrl.title" my-name="ctrl.name" ng-if="ctrl.type==='hoge'"></my-hoge-directive>
```

## 実装

そこで, 上記のテンプレートを下記のように書くようにしてみた:

```html:テンプレート
<my-:type:-directive node-type="ctrl.type" my-title="ctrl.title" my-name="ctrl.name"></my-:type:-directive>
```

要素名の`:type:` というキショい部分が, Scope(i.e. `ctrl.type`)に格納される`foo` とか`hoge`に置換される.
実体は`node-type` というattribute型のDirectiveを作成して実現している. ES6で書くと以下の通り [^1]:

```js:nodeType.js
((name) => {
  angular.module('application').directive(name, ['$compile', $compile => {
    return {
      restrict: 'A',

      compile: (ttElem, tAttrs) => {

        // 1. 要素名を取り出す(i.e. my-:type:-directive)
        var nodeNameTmplate = ttElem[0].outerHTML.match(/<\s*([a-zA-Z][a-zA-Z0-9\:\-]*)[^>]*>/)[1];

        // 2. 要素名の置換対象文字列名を決定する
        var placeholderName = tAttrs['typePlaceholder'] || 'type';

        // 3. attributesから自分自身とAngularJSがくっ付ける余分な奴等を除外し, 文字列に展開する
        var attrsString = _.pairs(tAttrs).filter(([k,]) => k !== name && !k.match(/^\$/)).map(([k, v]) => `${k}="${v}"`).join(' ');

        // 4. transclude用のテンプレート文字列を確保しておく
        var transcludeTemplate = ttElem.html();

        return ($scope, $elem) => {
        // 5. typeの変更に応じて, 対象のDirectiveを決定し, compileとlinkを一緒に実行してしまう.
          $scope.$watch(tAttrs[name], type => {
            var nodeName = nodeNameTmplate.split(':').map(part => part === placeholderName ? type : part).join('');   // ここに実際のdirective名が入る.(i.e. my-foo-directive)
            var tElmString = `<${nodeName} ${attrsString}>${transcludeTemplate}</${nodeName}>`

            // $compileサービスでcompileとlinkを同時に実行する.
            $compile(tElmString)($scope, cloned => $elem.empty().append(cloned));
          });
        };
      }
    };
  }]);
})('nodeType');
```

テンプレートをイジるDirectiveの常として, compileが出てくるパターンのDirectiveになる.
やろうとしていたことが, 「scopeの値によってtemplateが変わる」なので, 当然AngularJSのDirectiveにおける2フェーズ(compileとlink)はガン無視した形になる[^2] [^3].

## さいごに
当初の目的は実現できてるけど、Directiveの実装もHTMLテンプレートの呼出側も結構キショいコードなので, 万人にはオススメしません.
従ってわざわざbowerやnpmに公開するモチベーションも湧かない...

### 脚注
[^1]: 実装はAngularJS以外にlodashも使ってます. 念のため.
[^2]: compileとかlinkとか何言ってんのコイツ、と思う人は [AngularJSのCompileとLinkってなぁに？](http://qiita.com/Quramy/items/904b654c3bf717546047) の投稿を読んでね 
[^3]: typeの値が変更される度にcompileが動作する性能的な問題は, Flyweightパターン使って `$compile(...)`の結果をlink関数の外側のクロージャでキャッシュすれば改善できます.
【メモ】git-rebase 時にVisual Studioでのビルド確認を毎回はさむ方法

大人の事情により`rebase`時になんとかしてコミットごとのビルド確認を入れたかった。

もっとスマートな方法が見つかるまでこれで凌ぐ。

# 共通？（未確認）

`build.bat`を作っておく。
そして`git-bash`で以下のコマンドを打つ。

```bash
git rebase -i --exec "cmd /k build.bat" hogehoge
```

`hogehoge`はリベース先のブランチ名など。

# `build.bat`の例
## Visual Studio 2008 (VC 9.0)
```bat:build.bat
@echo off
pushd %~dp0

call "C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat"

VCBUILD || exit 1
exit 0
```
※ ソリューションファイルのあるフォルダに置いておく必要あり。

参考: [コマンド ラインでのビルド](https://msdn.microsoft.com/ja-jp/library/f35ctcxw.aspx)
ValidationのテストをRSpecカスタムマッチャに変えてみた

http://qiita.com/nisshiee/items/b475f475cbfce66898ec
この記事の続き。

## まえがき

改めてやりたかったことをまとめると、

```rb:spec/models/team_spec.rb
RSpec.describe Team do
  subject(:team) { FactoryGirl.create(:team) }

  describe :name do
    context 'when name is nil' do
      before { team.name = nil }

      expect(team).not_to be_valid
      expect(team.errors[:name].size).to be >= 1      
    end
  end
end
```

これがもともとの、「nameがnilだったらvalidation errorですよ」をテストするコード。
`describe :name`から先、仰々しすぎて、書くのダルいから簡単にしたいよね、というのが目的。

で、マクロ化することによってこれを1行で書けるようにしたのが前回の記事。

ありがたいことに、前回の記事にコメントでアドバイスを頂いたので、続きを書く。
@jnchito ありがとうございます。

## カスタムマッチャ

コメントで教えていただいたのだが、
http://qiita.com/kozy4324/items/9a6530736be7e92954bc
こちらに全部書いてありますｗ

もはや言うことないので、作ったカスタムマッチャ貼る。
全く同じチェック書いた。
あと、エラー時のメッセージも見やすいように軽くカスタマイズ。

```rb:spec/support/custom_matcher/validations.rb
RSpec::Matchers.define :be_invalid_on do |attr_name|
  match do |model|
    model.send("#{attr_name}=", @value)
    model.invalid? && model.errors[attr_name].size >= 1
  end

  chain :with do |value|
    @value = value
  end

  failure_message do |model|
    if model.valid?
      "expect #{model.class} to be invalid but it is VALID"
    else
      "expect #{model.class} to have errors on #{attr_name} but EMPTY"
    end
  end
end
```

これを置いとくと、以下のようにテスト書ける

```rb:spec/models/team_spec.rb
RSpec.describe Team do
  subject(:team) { FactoryGirl.create(:team) }
  it { is_expected.to be_invalid_on(:name).with(nil) }
end
```

## あとがき

`:be_valid_on`とかも作ってやると便利かもね
【underscore.js】テンプレート構文の上書き


使う機会があったので、メモ。
_.templateSettingsを使うことで、構文を上書きできる。
デフォルトでは、「-」を使うとエスケープされますが、以下の例では、「-」を使った場合に、「=」と同様にエスケープされないように上書きしています。

<a href="http://underscorejs.org/#template" target="_brank">underscorejs/template</a>

```index.html
<script id="t" type="text/template">
    interpolate: <%= test %><br>
    escape: <%- test %>
</script>
```

```script.js
_.templateSettings = {
    evaluate    : /<[%@]([\s\S]+?)[%@]>/g,
    interpolate : /<[%@][=|-]([\s\S]+?)[%@]>/g,
    escape      : /<[%@]_([\s\S]+?)[%@]>/g
};

var t = _.template($('#t').html());
var h = t({
    test: '&lt;b&gt;test&lt;/b&gt;'
});

$('body').append(h);
```

結果はどちらも\<b>test\</b>となる。
また、<% val %>の書き方が気に食わない場合も変更することができる。
以下のようにすると、{{ val }}のように記述することができます。

```script.js
_.templateSettings = {
    interpolate : /\{\{(.+?)\}\}/g
};
```
usbメモリにUbuntu LiveCD を入れてQEMUで起動確認

# usbメモリにUbuntu LiveCD を入れてQEMUで起動確認

オレオレメモ。

## 背景

ubuntu14.04 で NVIDIA のグラフィックドライバ更新したらXの設定がおかしくなってGUIが起動できず、
仮想コンソールにも切り替えられなくて危うく死にかけたので、
復旧用にやっぱ LiveCD の起動できるやつあったほうがいいよねって話と、
いちいち確認するのに再起動するのめんどいから `QEMU` で動かせるかなって話。

ついでに LiveCD は 2GB ちょいなので、
余ったとこは空き領域にして普通にデータストレージとして使えたら嬉しいなって。

## 環境

* 母艦 `ubuntu 14.04 LTS` 64bit
* USBメモリ 16GB `/dev/sdb`

```
# パーティション編集
sudo apt-get install gparted

# ブータブルUSBの作成
sudo apt-get install usb-creator-gtk

# QEMU エミュレータ
sudo apt-get install qemu
```

パーティションは編集できればなんでもいい。
ブータブルUSBは `unetbootin` とかでもいいと思う。

## パーティション作成

データ領域として使うためにandroidに接続すると、一番最初のパーティションが認識されるので、データ領域は `/dev/sdb1` に置く。
ファイルシステムは他でも使う予定なので `fat32` 。

LiveCD の書き込み領域は `/dev/sdb2` に。

![Screenshot from 2015-09-18 13:07:41.png](https://qiita-image-store.s3.amazonaws.com/0/41925/69dabcb6-068f-54b2-4ac7-030f05065668.png)


## 書き込み

![Screenshot from 2015-09-18 13:09:02.png](https://qiita-image-store.s3.amazonaws.com/0/41925/226fcead-8c4d-7385-8f8e-1302e795acef.png)

## QEMU で起動

ちゃんと書き込めてればこれで LiveCD が起動するはず。

```
$ sudo qemu-system-x86_64 -enable-kvm -m 512 -hda /dev/sdb
```

これでおｋなら、母艦をリブートしてBIOSでUSBから起動すればLiveCDが起動できる。

![Screenshot from 2015-09-18 13:22:16.png](https://qiita-image-store.s3.amazonaws.com/0/41925/1603f6fb-e71e-1827-9bd0-8bc235a985c4.png)

## androidに接続してみる

`/dev/sdb1` のとこが認識できてる。

![Screenshot_2015-09-18-13-25-43.png](https://qiita-image-store.s3.amazonaws.com/0/41925/83f6655b-b036-ed8f-b6a2-fd054eb9b513.png)

windowsとかmacは手元に無いのでわからないけど、たぶん大丈夫なんじゃないかな。
LiveCD 領域も fat32 なのでそっちも中見えると思う。
Zendesk Rest APIメモ (PHP)


ためしてちょいちょい追加します。

## 0. 準備

composer.json

```
{
  "require": {
    "zendesk/zendesk_api_client_php": "dev-master"
  }
}
```

install

```
$ composer install
```


## 1. 問い合わせ登録

```
<?php
require 'vendor/autoload.php';

use Zendesk\API\HttpClient as ZendeskAPI;

$subdomain = "xxx";
$username  = "xxx";
$token     = "xxx";

$client = new ZendeskAPI($subdomain, $username);
$client->setAuth('basic', ['username' => $username, 'token' => $token]);

// カスタムフィールド（任意）
// フィールドのIDはカスタムフィールドの詳細ページに表示されるIDを入れる
$custom_fields = array();
$custom_fields[] = array("id" => "27903658", "value" => "1234567"); // 注文番号
$custom_fields[] = array("id" => "27895577", "value" => "5678901"); // ○○ 番号

// 問い合わせした人情報
$requester = array(
  "name"  =>  "なまえ",
  "email" => "foo@example.com",
 );

$ticket = array(
  'subject'  => 'APIからのチケット登録テスト2',
  'comment'  => array(
    'body'   => "本文あああ\n２行目\n３行目"
   ),
  'priority'      => 'normal',
  'custom_fields' => $custom_fields,
  'requester'     => $requester,
);


$newTicket = $client->tickets()->create($ticket);
print_r($newTicket);

```
git - status 表示で untracked を無視させる


参考

- ["version control - How do I do a 'git status' so it doesn't display untracked files without using .gitignore? - Stack Overflow"](http://stackoverflow.com/questions/594757/how-do-i-do-a-git-status-so-it-doesnt-display-untracked-files-without-using)

git のバージョンが古すぎる場合は使えない可能性もあるらしいが、この記事自体が2009年なので最近の git なら問題ないはず。

### ショートオプション

```bash
$ git status -uno
```

### 礼儀正しいオプション

```bash
$ git status --untracked-files=no
```

### コンフィグで無効にする

```bash
$ git config status.showuntrackedfiles no
```

untracked を表示させたい場合は `-u`オプションで表示してくれる。

```bash
$ git status -u
```

コンフィグを元に戻したい場合は

```bash
$ git config --unset status.showuntrackedfiles
```
環境変数って引き継いでくれるの(node.js -> ruby)

# これはなに

本当に初歩的な疑問でnode.jsの`child_process`なんかでRubyのプロセスを起動させたいみたいなときにnode.jsのスクリプトで使っていた環境変数はRubyのスクリプトにでも適用されるのかみたいなところを実験してみた。

```sh:.env
HOGE=HOGEHOGE
PIYO=PIYOPIYO
```

```coffeescript:app.coffee
require('dotenv').load()
exec = require('child_process')

console.log "--- NODE ---"
console.log "HOGE=#{process.env.HOGE}"
console.log "PIYO=#{process.env.PIYO}"

console.log ""+exec('ruby app.rb')
```

```rb:app.rb
puts "--- RUBY ---"
puts "HOGE=#{ENV['HOGE']}"
puts "PIYO=#{ENV['PIYO']}"
```

# 結論

**引き継いでくれる**

```shell-session
$ coffee app.coffee
--- NODE ---
HOGE=HOGEHOGE
PIYO=PIYOPIYO
-- RUBY ---
HOGE=HOGEHOGE
PIYO=PIYOPIYO
```

> # [環境変数 - Wikipedia](https://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0)
> 親プロセスから子プロセスに複製されて継承される。 すなわち、子プロセスで環境を変更しない限り、子プロセスの環境は親プロセスのそれと同一の内容である。 また、子プロセスが自分の環境に対して行った変更は、親プロセスの環境に影響しない。

そりゃそうだみたいな印象で、Rubyでさらに`dotenv`を噛ませようとしていたがコードの行数が減った。
PHPでデータ数から最大ページ数を計算する

び、備忘録……

なんとかして`$count`に総データ数を入れさえすればこれでOKなハズ。
この場合、`$data`が配列な想定で……

### ソース

```php
<?php
// 1ページで表示したいデータ数
$i = 30;
// データの個数を入れる
$count = count($data);
// データ個数 ÷ 1ページに表示するデータ数 (端数の切り上げ)
$max_page = ceil($count / $i); 

// 結果表示
var_dump($max_page);
```
proxy下でのdevstack設定

aptやyumのProxy設定と、`/etc/wgetrc`でwgetのProxy設定もしておく。
gitプロトコルが通らない場所では`local.conf`に以下を追記しておくと、HTTPSで通信が行われる。

```bash:local.conf
GIT_BASE=https://git.openstack.org
```

環境変数のProxy設定も必要だが、no_proxyに自身のIPアドレスを追加しておくことを忘れない。

```bash
export http_proxy=<your-http-proxy>
export https_proxy=<your-https-proxy>
export no_proxy=127.0.0.1,12.34.56.78
```
maven起動のSpring BootをIntelliJからデバッグ

#起動(5005ポートをあける)
mvn clean spring-boot:run -Dmaven.surefire.debug #applicationのデバッグ起動
mvn clean test -Dmaven.surefire.debug #test用のデバッグ起動

#IntelliJからつなぐ設定
Run/Debug Configurationを開きポートを5005に指定してOK

![スクリーンショット 2015-09-18 2.43.35 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20307/ba354d30-a00f-4326-22c3-c5bb3ad27003.png)

#実際つなぐ
debugボタンポチる。ブレークポイント止まるはず。

#参考
http://cynipe.hateblo.jp/entry/20090226/1235630326
maya Python ベイクしたアニメーションをまた修正したい。

mayaとpythonの勉強もかねてこんなのを作ってみたというだけ・・。  

まずはシンプルなIKのアニメーションを作成
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/04b70ef9-c1b6-cba6-a03c-630a49f5a62c.png" width="300px" />
1,５,10フレームめのiKHandle1にキーを設定
こんな感じのを・・・
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/5aabe7f0-a0de-2ef7-e6db-2d766f554927.gif" width="300px" />

<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/0bb42c86-09a7-2bf0-9155-fd9333f36355.png" />

丸っとアニメーションをベイク
するとJointなどにもこんな感じで全てのフレームにキーが打たれる
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/f70c4ab7-c60d-6ef6-7705-1de1969978ea.png" />

ここから 1 5 10のキーフレームだけを残して削除したい。
ようするにアニメーション変更したいけどこのままじゃ全てキー打たれちゃってるから修正が大変です。
ってことかな。
ベイクする前に別の名前で保存すればいいだけだけど・・・。  

###作りたいコマンド
手順
一個cubeなどを作成し、1,5,10フレームにキーを設定。
あとは最初にcubeを選択、その後ベイクしたオブジェクトを選択でコマンド実行!
理想の結果
cubeに設定されているキー以外のアニメーションが削除される

###試行錯誤した結果
なんとかできた

```py

import maya.cmds;
model = cmds.ls(selection=True)[0];
keyTimes = cmds.keyframe(model,query=True);

timeList = range(1, int(max(keyTimes)));
data = list(set(timeList) - set(keyTimes));

selectObjList = cmds.ls(selection=True);
for frameTime in data:
    for obj in selectObjList[1:]:
    	cmds.cutKey(obj, time=(frameTime,frameTime), cl=1);

```

pythonなれないと書き方が気持ち悪いけど、短くかける！


###簡単な解説
選択した最初のオブジェクトの名前をmodelに設定

```py

model = cmds.ls(selection=True)[0];
```

最初に選択したオブジェクトのキーフレームを取得(全て取得しているので重複がある)

```py

keyTimes = cmds.keyframe(model,query=True)
```

最大の時間までのフレーム番号リストを作成(今回の場合、1,2,3,4,5,6,7,8,9,10)

```py

timeList = range(1, int(max(keyTimes)));
```

キーフレームの差分を取得(消すキーフレームのリスト)(2,3,4,7,8,9)

```py

data = list(set(timeList) - set(keyTimes))
```

あとは選択されたオブジェクト(最初のをのぞく)でループをまわして、
さらに削除するキーフレームのリストでループをまわして、
cutKey! でOK

```py

selectObjList = cmds.ls(selection=True);
for frameTime in data:
    for obj in selectObjList[1:]:
    	cmds.cutKey(obj, time=(frameTime,frameTime), cl=1);
```
Webpackのモジュール内でprocess.env.NODE_ENVを読み込む


#概要

Webpackでビルドするモジュール内で`process.env.NODE_ENV`を読み込む。

#方法

Webpackのpluginsで以下のように書く。`process.env.NODE_ENV`の内容が読み込まれるように`JSON.stringify`する。

```js:webpack.js
    plugins: [
      new webpack.DefinePlugin({
        'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
      })
    ]
```

これでWebpackでビルドするときに`process.env.NODE_ENV`が読み込めるので、実際のアプリケーションで以下のように書ける。

```coffeescript:config.coffee

'use strict'

config = ''

switch process.env.NODE_ENV
  when 'development'
    config = {
      apiurl: 'http://aaa.com'
    }
  when 'staging'
    config = {
      apiurl: 'http://bbb.com'
    }
  when 'production'
    config = {
      apiurl: 'http://ccc.com'
    }
  else
    config = {
      apiurl: 'http://aaa.com'
    }

module.exports = config;
```
Rails初心者におすすめする本

こんにちは、からまげです。
9月から初心者railsマンになりました。

railsを勉強するにあたって、タメになった本を列挙しておきます。

## Ruby
- たのしいRuby
- パーフェクトRuby
- Effective Ruby

## Rails
- パーフェクトRuby on Rails
- Ruby on Rails 4 アプリケーションプログラミング
- 実践Ruby on Rails 4 現場のプロから学ぶ本格Webプログラミング

参考になれば幸いです。
今更TwitterAPIで取得できる画像サイズ指定方法を調べた

Twitter公式のAPIのみで画像が投稿等が出来るようになってからかなり経ちましたが、以外にも縮小サイズのものを取得するというのが見受けられなかったのでずっごい今更ですがメモとして残しておきます。

#サイズ対応表
|サイズ|URL例|
|:----|-----:|
|最小|https://pbs.twimg.com/media/hoge-hoge.jpg:thumb|
|小|https://pbs.twimg.com/media/hoge-hoge.jpg:small|
|中|https://pbs.twimg.com/media/hoge-hoge.jpg|
|大|https://pbs.twimg.com/media/hoge-hoge.jpg:large|
|元サイズ|https://pbs.twimg.com/media/hoge-hoge.jpg:orig|

プロフィールのサムネイル画像の全サイズ取得と違い\_miniなどとは書かないため注意（ちなみにhttps://pbs.twimg.com/media/hoge-hoge_mini.jpgとしても正しい画像は得られない）

プログラム等で扱う場合は元URLにサイズを指定する文字列を追加するようなものを加えるだけでいいので比較的楽に実装できるはず。

#さいごに
これ以外にもサイズの指定方法等があればコメント等でお知らせください
[FuelPHP]DBクラスINSERTの戻り値の取得方法

##はじめに

FuelPHPの公式にDBクラスのINSERTの戻り値についての記述がないので、DB::insert()の戻り値についてちょっと調べてみました。

FuelPHP公式URL
http://fuelphp.jp/docs/1.7/classes/database/db.html


##取得ソース

```php:
$result=DB::insert('hoge')->set($params)->execute();
if($result[1] > 0){
	//成功
}
else{
	//失敗
}
```
はい、これでOKです。戻り値を見て成功と失敗を見分けることが出来ますぞェ・・。


##$resultの値について
```php:
$result=DB::insert('hoge')->set($params)->execute();
var_dump($result);
exit;
```
var_dump取ってみます。
下のような値が返ってきているのがわかります。

```php:
array (size=2)
  0 => string '11' (length=2)
  1 => int 1
```

##結果
```php:
$result[0];　// 更新したレコードの主キーの値が入ります。
$result[1];　// 挿入された行数が入ります。
```


updateの場合の戻り値は違うようなので、また調べたらアップしていきたいと思います。
docker-machineのcreateがStarting VM...で止まる、Kitematicの初期化が99%で止まるとき

```sh
$ docker-machine create -d virtualbox dev
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
```

docker-machineやVirtualBoxを最新にしても↑で止まったりKitematicの初回起動が99%から動かないときは、`~/.ssh/config`を疑いましょう。
自分の環境では↓が書いてありました。

```~/.ssh/config
Host *
  ControlMaster auto
  ControlPath /tmp/%r@%n:%p
  ControlPersist 60
```

`ControlMaster`が有効になっていると、sshを使った起動確認以降が進められなくなるようです。
↑３行をコメントアウト、または↓の記述を追記して再実行すると、Kitematicでログイン画面まで進められました。

```~/.ssh/config
Host localhost
  ControlMaster no
  ControlPersist no
```

検証環境: 

```sh
$ docker -v
Docker version 1.8.2, build 0a8c2e3
$ docker-machine -v
docker-machine version 0.4.0-1 (1981be6)
$ VBoxHeadless --version
Oracle VM VirtualBox Headless Interface 5.0.4
(C) 2008-2015 Oracle Corporation
All rights reserved.

5.0.4r102546
```

参考: [docker-machine create is hanging with driver virtualbox : SSH cmd err, output: exit status 255: · Issue #1591 · docker/machine](https://github.com/docker/machine/issues/1591#issuecomment-126169020)