OmniAICreator/Qiita-1.07M huggingface dataset:
D3.jsのimageを円形にクリップ


http://bl.ocks.org/itagakishintaro/71a7c6779933c189c3ca

クリップ図形は円じゃなくても何でもいい。
クリップ図形とimageの位置を揃えるのがポイント。

1. svgにdefsを追加
2. defsにクリップ図形を追加
3. defsにクリップパスを追加して、useで2の図形を指定
4. imageにclip-pathで3を指定。

もし、imageが複数ある場合は、imageにあわせてクリップもつくる。
アニメーションで動かすときは、imageとあわせてクリップ図形も動かす。

```html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>D3.jsでimageを円形にクリップ</title>
</head>

<body>
    <div id="d3" style="width: 200px; height: 200px;"></div>
    <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
    <script>
    var svg = d3.select('#d3')
        .append('svg')
        .attr('width', '100%')
        .attr('height', '100%')
        .style({
            'background-color': 'rgba(255,255,250,1)'
        });
    // クリップする円の定義
    var defs = svg.append('defs');
    var circles = defs
        .append('circle')
        .attr('id', 'circle')
        .attr('r', 50)
        .attr('cx', 100)
        .attr('cy', 100);

    defs.append('clipPath')
        .attr('id', 'clip')
        .append('use')
        .attr('xlink:href', '#circle');
    // imageを描画
    var images = svg
        .append('image')
        .attr('xlink:href', 'https://assets-cdn.github.com/images/modules/open_graph/github-octocat.png')
        .attr('width', 100)
        .attr('height', 100)
        .attr('clip-path', 'url(#clip)')
        .attr('x', 50)
        .attr('y', 50);
    </script>
</body>

</html>

```
iPhoneのSafari風UIを実装したらリジェクトされる

一覧を表示するにあたり、Safari風MultiTabUIを、Layerなど駆使して実装して
審査に出したら「真似するな」って言ってリジェクトされました。

![safareject.png](https://qiita-image-store.s3.amazonaws.com/0/61756/d8f5ce32-1f4a-684c-e551-549eefd124c8.png)

どうも他であまり見ないと思ったら、ダメだったんですね。。
結構頑張ったので残念です。トホホ


_追記 2015.3.18_
その後、回転をやめてz-indexのみのUIへと変更したら審査が通りました。
というか、なんか[近い感じ](https://www.cocoacontrols.com/controls/jgstackcollectionview)のがすでにありました。
Cocos Code IDE メモ

Cocos2d-JSでアプリを作るにあたりCocos Code IDEを使ってみることにした。
完璧ではないもののコード補完も効くのでテキストエディタでJSのソースを書くよりは格段に楽。
eclipseベースであることに敬遠する人がいるかもしれないが私はありがたく使わせてもらうことにする。

実際に使ってみてはまった点を随時追記していくことにする。

#### JavaScript Frameworks のパス設定ではまる

Cocos Code IDE で JS を扱うにあたって Preferences ＞ Cocos ＞ JavaScript カテゴリで JavaScript Frameworks を設定する必要がある。
このパスの指定にちょっとしたトラップがある。

GitHub からクローンしたプロジェクトを Frameworks パスとして設定しようとするとエラーとなる。
frameworks/cocos2d-html5 以下が空っぽとなっているためらしい。
エラーダイアログには download-deps.py をエンジンのルートパスで実行するよう案内が出るがそもそもこのファイルが同梱されていない様子。

構築手順を追いかけるのも大変そうなので今回は [公式サイトのダウンロードページ](http://www.cocos2d-x.org/download "") から cocos2d-js-v3.x.zip をダウンロードして使用することにした。

#### デバッグ用ブラウザのアプリ描画領域の設定ではまる

チュートリアルやサンプルのゲームのコードを見ながらメニュー（cc.Menu）を試しに実装したところクリックに反応する箇所がずれる。
経験上、座標系がずれるのはアプリケーション領域と描画領域の不整合と考え「index.html の canvas タグ」「main.js の cc.view.setDesignResolutionSize() 呼び出し」の領域サイズと思われる箇所を修正してみる。
しかし状況変わらず。

エンジンのバグかと一瞬思ったがここまでばかばかしいバグが残っているはずもない。
そもそもデバッグ用ブラウザのサイズがおかしい。前述の手順で設定した値が反映されていない模様。背景画像がゆがんで表示されていることからもわかる。
しかし IDE の Preferences を確認しても領域サイズを指定するような項目がない。

で、ようやくあるファイルの存在に気づいた。そのファイルとは config.json 。
このファイルに記述されている init_cfg というプロパティの子プロパティに「width」「height」が探していた項目だった。
これらの値を自分が現在想定しているスクリーンサイズに合わせて修正、実行。
無事、期待したとおりに表示され Menu アイテムのクリックも座標がずれることなく反応した。

このプロパティの書き換えが必要な件は公式サイトのチュートリアルやラーニングの最初の流れで説明がない気がする。
私が見落としているだけであればいいが、はまったときに解決法に気づきにくい内容だと思った。

#### プロパティを上書きしてしまいデバッグ用ブラウザが起動しない状況にはまる

アプリ中の表示物は cc.Sprite を拡張して実装するわけだがこのとき tag というプロパティを自前で用意してしまったために問題発生。
tag は cc.Node で用意されているプロパティ。cocos2dとして重要なもの。
これを上書きする形で用意してしまったためデバッグ用ブラウザのための事前ビルドを行う際にエラーが発生した。
別名のプロパティとすることで解決。

ちなみに今回のケースでは次のようなエラーが出ていた。

```bash
JS: C:/{略}/PrebuiltRuntimeJs/debugruntime/script/jsb_cocos2d.js:1483:Error: js_cocos2dx_Node_setTag : Invalid Native Object
```
対応できた上での推測だが「Invalid Native Object」というエラーであることがポイント。
プロパティを上書きしてしまったため cocos エンジンが期待する構成では無いと判定されている。

これはまあ私がドキュメントをきちんと読んでいなかったために起きたことではあるが、症状から原因が推測しづらい現象だと思う。

#### jsbでのバインドに失敗するケースがある

これは IDE 自体の不具合ではないものの、結構やっかいな問題。
前述の項目も関連事例と思われる。
IDE が起動するシミュレータは、 JavaScript コードの呼び出しを jsb という仕組みで C++ の呼び出しに置き換えて動作しているようだが、オブジェクトのバインドに失敗してエラーを吐くことがある。
ブラウザベースで動かすと期待通り動作するため、jsb が判断できないケースがある模様。
~~どのようなパターンで発生するかはまだ絞り込めていないが、こういうことがあるというメモとして記述しておく。~~
これは PrebuiltRuntime と framework のバージョンが一致していないと発生するようだ。
Cocos Code IDE では runtime へのパスは実行単位ごとの設定なのに framework のパスは IDE の全体設定となるため、注意していないとバージョンのずれが発生してしまう。
気を付けていきたい。

#### Mac環境でシミュレータが起動しない

Mac 環境で PrebuiltRuntimeJs.app を起動する際にエラーが発生する現象に遭遇。
これはIDEが参照するフレームワークのバージョンとプロジェクトのruntimeフォルダ内の app のバージョンが一致していないと発生するようだ。
~~もしかすると別項目の jsb のバインド失敗の件（これはWindows環境だった）も同様にフレームワークと exe のバージョンが一致していなかったために起きていたのかもしれない。（確認）~~
Zabbix ローレベルディスカバリ（LLD）の拡張④ ディスク使用量の多いフォルダの監視

 [Zabbix ローレベルディスカバリ（LLD）の拡張①](http://qiita.com/usiusi/items/51e8478cb080412958a4)
 [Zabbix ローレベルディスカバリ（LLD）の拡張②](http://qiita.com/usiusi/items/d616b7c0d51a926ca4a0)
 [Zabbix ローレベルディスカバリ（LLD）の拡張③](http://qiita.com/usiusi/items/0972da38984a82e43e74)
 [Zabbix ローレベルディスカバリ（LLD）の拡張④](http://qiita.com/usiusi360/items/8d44fd6b975b2db40ded)
 [Zabbix ローレベルディスカバリ（LLD）の拡張⑤](http://qiita.com/usiusi360/items/4664b10426bb6d993e1d)

# はじめに
監視ソフトでディスク使用率の監視をしていてアラートが発生したはいいけど、どこのフォルダが肥大化傾向にあるのか調査するのに四苦八苦したことはありませんか？また問題フォルダの当たりはついたけど過去どう推移してきたか知りたいといったことがあるかと思います。

増加が見込まれるフォルダがある程度絞れていれば、そのフォルダだけduコマンドの結果を取得すれば良いのですが、そうでない場合、数が多く対象も逐次変わるため、そうもいきません。
Zabbixのローレベルディスカバリ機能を使い、自動的に使用量の多いフォルダをピックアップし、それらに対して自動的にチェックする仕組みを考えてみました。

## ディスク使用量の多いフォルダ（TopX）
ディスク使用量の多いフォルダのうち、多い順にX番目までのフォルダ名を返します。

#### zabbix_agentd.conf(エージェント側)での設定
　　UserParameter=vfs.du.discovery,/etc/zabbix/zabbix_discovery/vfs.du.discovery.sh $1

#### WebGUIでの設定

|ディスカバリルール | |
|:-----------|------------:|
|名前   |フォルダサイズのディスカバリ |
|タイプ |Zabbixエージェント |
|キー   |vfs.du.discovery[5] |

|アイテムのプロトタイプ | |
|:-----------|------------:|
|名前   |フォルダサイズ[{#DIR_NAME}] |
|タイプ |Zabbixエージェント |
|キー   |system.run["du -bs {#DIR_NAME}"] |



```bash:vfs.du.discovery.sh
#!/bin/bash

TOP_line=$1

deny_list="$(cd $(dirname $0); pwd)/vfs.du.discovery_deny.list"

LIST=`du -b -S -X ${deny_list} /* | sort -nr | head -${TOP_line}`
if [ "${LIST}" = "" ] ;then
    echo "ZBX_NOTSUPPORTED"
    exit 1
fi

IFS=$'\n'

echo -n "{\"data\":["
FIRST=1
for line in ${LIST}
do
  DIR_VAR=`echo ${line} | awk '{print $2}'`
  if [ ${FIRST} -eq 1 ] ; then
      FIRST=0
  else
      echo -n ","
  fi
      echo -e -n "{\"{#DIR_NAME}\":\"${DIR_VAR}\"}"
done

echo "]}"
```

```vfs.du.discovery_deny.list
## duコマンドのチェック除外リスト。ライブラリや静的なファイルしかないことが分かっているフォルダを記述。
## また使用量は多いが増加しないことが最初から判明している場合は除外したほうが良いでしょう。
## 固定サイズで確保しているRDBのデータファイルの保管場所とか
/bin
/boot
/cgroup
/dev
/lib
/lib64
/lost+found
/media
/misc
/mnt
/net
/proc
/sbin
/selinux
/srv
/sys
/usr/include
/usr/lib
/usr/lib64
/usr/libexec
```


```lang:出力結果
# zabbix_get -s 192.168.0.1 -k "vfs.du.discovery[5]" | jq "."
{
  "data": [
    {
      "{#DIR_NAME}": "/var/tmp"
    },
    {
      "{#DIR_NAME}": "/var/tmp/hoge"
    },
    {
      "{#DIR_NAME}": "/root"
    },
    {
      "{#DIR_NAME}": "/home/hoge"
    },
    {
      "{#DIR_NAME}": "/var/log"
    }
  ]
}
```
【Rails】絶対に抑えたいTransactionのポイントを三つにまとめてみた。【必須】

※Rails公式ドキュメントから、平易な日本語でポイントとプラスαまとめています。(公式ドキュメント: http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html)

# Transaction - 失敗→Save前
Transactionは、複数のSQL文を囲んで、そのSQLそれぞれが成功した場合のみに、すべてのSQLの変更を反映するよというもの。典型的な例は銀行口座の例で、片方の口座からの引き落としに成功した時のみ、もう片方の口座にお金がプラスされるよ、みたいなね。
こんな感じで、Transactionはデータベースの統一性をプログラムやdbのエラーから守るもの。一緒に処理されなきゃいけない処理の塊を持ってる時は絶対に使わなきゃいけない。

例えば、以下の例ではkevinの口座からの引き落としに成功した時のみ、kenに100depositeが行くようになってる。例外(error)が時発生した場合にはROLLBACKが発生し、**今までの処理をTransaction前の状態に戻して**くれる。

```rb
ActiveRecord::Base.transaction do
  kevin.withdrawal(100)
  ken.deposit(100)
end
```

# 1クラスのTransactionで複数まとめる
TransactionはActiveRecordのクラスメソッドなので、どのActiveRecordのクラスからも同じものがTransactionが呼び出される。だからTransactionのブロック内のrecordのインスタンスが必ずしもそのtransactionのクラスに属す必要はない。

以下の例では、BalanceクラスとAccountクラスがブロック内にあるが、AccountのTransActionのみで囲われてる。もちろんこれでおk。

```rb
Account.transaction do
  balance.save!
  account.save!
end
```

ちなみに、クラスメソッドで使うことが多い気はするが、インスタンスメソッドとしてインタンスからアクセスすることもできる。

```rb
balance.transaction do
  balance.save!
  account.save!
end
```

# 複数databaseにまたがってtransaction監視はできない
これまでの例で、複数レコードに対して一つのtransactionでカバーできることを述べてきたが、それは**databaseを同一のものを使っている条件下での話**である。
もし、レコードごとに別のdatabaseを使っている場合、そのdatabaseをまたがる処理に関して一つのclassのtransactionではカバーしきれない。でもそれじゃ困るので、そういう時は以下のように書きましょう。

StudentクラスとCourseクラスで異なるdbを使用してる時。
両方をtransactionで囲ってあげましょう。

```rb
Student.transaction do
  Course.transaction do
    course.enroll(student)
    student.units += course.units
  end
end
```
両方のクラスのtransactionで囲まなきゃいけないのはかっこわるいけど、これで両方のdbに対してtransaction保証される。公式ドキュメントにこうしろと書いてあるので、おそらくこれ以上の策は現状のところないのでしょう。

# ありがちなミスに注意

transactionでこのrecordの処理ミスったらROLLBACK発生させたい！ってやつには```save!```、```destroy!```みたいにビックリマーク```!```をつけることをお忘れなく！！transactionはerrorに反応してROLLBACK起こすので！

```rb
some_record.save # true/falseを返す
some_record.save! # 失敗時にerrorを返す

```

transactionで囲んだぜって一安心した時にこちらきちんと見直しておきましょう！

以上、railsを書く上で是っていに抑えなきゃいけないtransactionのポイント３つでした。callbackなど、もっと深堀したい方は以下など参照。

***
参考
- http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html
M-x ensime しても ENSIME: (Disconnected) のままになる


備忘録です．

## 結論 
scalaファイルは、`project_root/src/main/scala/` に作る．



## 現象

以下を参考にEnsimeの環境を構築しました．
http://qiita.com/t-mochizuki/items/df260806915f61d4e5c1

ところが、`M-x ensime` するとミニバッファには `ENSIME ready. M-x be_cool` と出るものの、
モードラインは `ENSIME: (Disconnected)` のままで、`C-c C-c a` とか叩いてみても、`Not connected. M-x ensime to connect` と言われてしまう．

## 原因
`sbt gen-ensime` したディレクトリの直下に scala ファイル作ってたため．

そもそも [sbtのディレクトリ構造](http://www.scala-sbt.org/0.13/tutorial/ja/Directories.html) を理解していなかった．

## ちなみに
同じ現象が発生する原因として、`M-x ensime` してるディレクトリへのパスにシンボリックリンクが入っているというのがあるそうです．
http://tnoda-scala.tumblr.com/post/105539838528/ensime-disconnected
https://github.com/ensime/ensime-server/issues/714



おしまい．
linux > フォルダの一覧を改行なしで見たい > ls -d */ や ls -d */*/

動作確認

    CentOS 6.5

今いるフォルダのサブフォルダ一覧をターミナルの画面スクロールなしに見たい。でも、いろいろファイルやフォルダがありすぎて、lsコマンド(オプションなし)では見にくい時

    $ ls -F | grep / | xargs
    DATA/ SRC/ SRC.bk/ 

<hr>
(追記 15/03/17)
コメントでfabiiw05さんに教えていただいたこちらの方が簡単で覚えやすい。

    ls -d */

さらに以下のようにすると、今いるフォルダの1つ下のフォルダが一覧となって表示される。

    ls -d */*/
    A/AB/  A/AC/  A/AD/  B/BA/  B/BB/  B/BC/  C/CA/
Google Art Projectで名画を鑑賞し心癒されよう

## chrome拡張機能

* [Google Art Project - Chrome ウェブストア](https://chrome.google.com/webstore/detail/google-art-project/akimgimeeoiognljlfchpbkpfbmeapkh?hl=ja)

新規タブを開くたびに名画が表示されます。


## スライドショー

* [Google Cultural Institute](https://www.google.com/culturalinstitute/home?projectId=art-project&hl=ja)のページを表示していればスライドショーになります。

左右の十字キー、ホイールで絵が切り替わります。
全画面表示も対応。
Tomcat7 admin-managerでのWARファイルアップロード制限変更

下記に定義されているので、変更してTomcat再起動。

```xml:/usr/share/tomcat7-admin/manager/WEB-INF/web.xml
    <multipart-config>
      <!-- 50MB max -->
      <max-file-size>52428800</max-file-size>
      <max-request-size>52428800</max-request-size>
      <file-size-threshold>0</file-size-threshold>
    </multipart-config>
```

Jenkinsなどは50MBを超えるため、
この値を変更しないと、「SizeLimitExceededException」が返される。
exFATをマウント

# Ubuntu 15.04

```bash:
apt-get install -y exfat-fuse
```

* fdiskでpartition id は `7 (HPFS/NTFS/exFAT)`を指定しておく。

```bash:label
exfatlabel /dev/sdd1 microsd
```

```bash:mount
mount /dev/sdd1 /mnt/usb/
```

# Fedora21

* [HOWTO - exfat - Quick start guide. - Free exFAT file system implementation - Google Project Hosting](https://code.google.com/p/exfat/wiki/HOWTO)


## インストール

* rpmが見当たらなかったのでソースからビルドした。

```bash:
yum install scons fuse-devel subversion gcc
svn co http://exfat.googlecode.com/svn/trunk/ exfat-read-only
cd exfat-read-only
scons
```

```bash:
sudo scons install
```

* /sbin/mount.exfat-fuse
* /sbin/dumpexfat
* /sbin/exfatfsck
* /sbin/mkexfatfs
* /sbin/exfatlabel

がインストールされる。
プログラミング言語の外部コマンドAPIからsudoのコマンドを呼ぶ方法(requiretty)

#初めに

タイトルから分かる人もいると思いますが、sudoするためにはtty(端末）が必要なので、もちろんプログラミング言語の外部コマンドAPIから呼び出すときもrequirettyをコメントアウトする必要があるというものです。

サンプルがpythonですが、どの言語でも同様だと思います。
sudoの例として「service docker restart」ですが、sudoのものであれば、serviceコマンドやdockerでなくても、なんでもいいと思いますが、自己責任でお願いします。


##個人的な動機

自動的にdockerの環境構築しては破棄するようなスクリプトを組んでるのですが、しばらく動かすと「too many open files」とかエラーを吐いて止まるので、dockerのサービス自体を再起動する対処療法をしてます。
しかし、一般ユーザー権限で実行されたスクリプトでは、serviceコマンドが呼べません。

その時の調べた方法の備忘録です。

#目標

```py:sudoを伴うpythonからのコマンド呼び出し
import commands
commands.getstatusoutput("sudo service docker restart")
```
これを、一般ユーザー権限で実行した時に正常に実行するのが目標です。

#作業

もちろん、システムに何も設定しないと動きません。
エラーを拾って表示しないと、わかりませんが
「sudo を実行するには tty がなければいけません。すみません」
とご丁寧に謝ってくれてます。
（まず僕は、ここで少しハマリました）


```bash
% visudo
```

から

```text
Defaults    requiretty
```

の行(56行目くらいにある)をコメントアウトしてください。
これで sudoを実行するのに tty(端末)が必要無くなります。



しかし、これでもパスワードを要求されるので、しかもプログラム的に渡すのが多分面倒なので、
「service docker restart」だけは、パスワードなしで実行したいと思います。

（**注意:** 以下の方法は、このスクリプトに限らず、このユーザー自体に「service docker restart」はパスワードなしに実行できてしまうことに注意してください。将来これ以外の方法を追記するかもしれません。）

再び

```bash
% visudo
```

コマンドで以下の一行を追加します。
（sudoできるということは前半部分は記述されてると思いますので、変更かもしれません）

```text
(ユーザー名)        ALL=(ALL)       PASSWD: ALL, NOPASSWD:/sbin/service docker restart
```

簡単にいうと、基本的にsudoするときは、通常通りパスワードを必要とするが、
**/sbin/**service docker restart
の実行はパスワードが要らないということです。
(端末からは **service** だけで良いからといって**/sbin/**を忘れがちなのに注意、僕はハマリました）


これで晴れて、目標のpythonから外部コマンドAPIからsudoのコマンドが呼べるようになりました。

（多分もっといい方法があると思います。）


##参考

sudo を実行するには tty がなければいけません。すみません と謝るFedoraをなだめる
http://qiita.com/hash/items/7c8018c30c670fdd71fb
初めてのeval (変数名を規則的に動かして行列単位を書いてみる)

変数名を規則的に変化させる場合には，evalを使えば手動で頑張らなくていいことを知ったので備忘録として書いておきます．ただ，以下に書くものが最良とは思っていません．もし，もっと良い書き方があれば教えていただけると嬉しいです．

## メソッドとして行列単位を書く
行列のサイズは2×2しか出てこないプログラムを想定する．
まずはevalを使わないで次のようにメソッドとして行列単位((i,j)成分は1,その他は0)を書いてみる．

```ruby:matrix1.rb
require "matrix"
def e(i,j)
    Matrix.build(2){|k,l| (k==i && l==j)? 1 : 0}
end
```

でもこれでは，何度も`e(i,j)`が出てくると括弧を書くのが面倒になってくる．
2×2しか出てこないのだから，括弧がなくても誤解の心配はない．
そこでevalを使って括弧を外すことを試みる．

## グローバル変数として行列単位を書く

```ruby:matrix2.rb
require "matrix"
def e(i,j)
    Matrix.build(2){|k,l| (k==i && l==j)? 1 : 0}
end

(0..1).each do |i|
    (0..1).each do |j|
        eval("$e#{i}#{j}=e(i,j)")
    end
end

p $e01 #=> Matrix[[0, 1], [0, 0]]
```

これで括弧を書かずに済むが，その分$を書くことになってしまった．
描画領域をクリップしてみる



## バージョン

- Mac OS X Yosemite 10.10.2
- Cocos2d-x ver3.4


## サンプル

### ClippingRectangleNode

```cpp
auto rect = Rect(0.0f, 0.0f, 100.0f, 100.0f);
auto clipNode = ClippingRectangleNode::create(rect);
addChild(clipNode);
```
[Swift]Java8 Stream API の forEach ライクなメソッドを作る

Java8 の Stream API にある forEach メソッドを Swift で再現してみました。

```swift:instruction
extension Array {

    func forEach(consumer: (Element) -> Void) -> Void {
        for obj in self {
            consumer(obj as Element)
        }
    }
}
```

次のような使い方ができます。

```swift:sample1
["apple", "orange", "pear"].forEach { data in print(data) }
```

ちなみに次のプログラムと同じことをしています。

```swift:sample2
for data : String in ["apple", "orange", "pear"] {
    print(data)
}
```

filter、map、reduceなどと組み合わせれば一貫性のある使い方ができますね。
次のようにしても同じ事ができるというのは秘密です。

```swift:taboo
["apple", "orange", "pear"].map { data in print(data) }
```
[Ruby] 整数同士の割り算

整数同士の割り算について紹介。
ただし、Rubyの割り算について完全に網羅している記事ではないことを断っておきます。

# 商だけ欲しいとき（小数点以下を気にしないとき）
/（スラッシュ）やdivを使います。

```rb
 654321/123456        # =>  5
-654321/123456        # => -6
 654321/-123456       # => -6
-654321/-123456       # =>  5
 654321.div(123456)   # =>  5
-654321.div(123456)   # => -6
 654321.div(-123456)  # => -6
-654321.div(-123456)  # =>  5
```

# 商と剰余が欲しいとき
divmodを使います。ただし、被除数と除数の正負によっては計算結果が変わってくるので注意が必要です。

```rb
 654321.divmod(123456)   # => [5, 37041]
-654321.divmod(123456)   # => [-6, 86415]
 654321.divmod(-123456)  # => [-6, -86415]
-654321.divmod(-123456)  # => [5, -37041]
```

# 結果を浮動小数点数として欲しいとき
被除数または除数に対してto_fを使います。

```rb
 654321.to_f/123456        # =>  5.300034020217729
-654321.to_f/123456        # => -5.300034020217729
 654321.to_f/-123456       # => -5.300034020217729
-654321.to_f/-123456       # =>  5.300034020217729
```
しかし、これでは見栄えが悪いですね。（主観的ですが...）
[公式のdocument](http://ruby-doc.org/core-2.2.1/Fixnum.html#method-i-fdiv)を見てみると、fdivというメソッドが使えることが分かります。

```rb
 654321.fdiv(123456)   # =>  5.300034020217729
-654321.fdiv(123456)   # => -5.300034020217729
 654321.fdiv(-123456)  # => -5.300034020217729
-654321.fdiv(-123456)  # =>  5.300034020217729
```
これで被除数と除数の関係がスッキリ分かるようになりました！

# 結果を分数として欲しいとき
quoやRationalクラスを使います。

```rb
 654321.quo(123456)         # =>  218107/41152
-654321.quo(123456)         # => -218107/41152
 654321.quo(-123456)        # => -218107/41152
-654321.quo(-123456)        # =>  218107/41152
Rational(654321, 123456)    # =>  218107/41152
Rational(-654321, 123456)   # => -218107/41152
Rational(654321, -123456)   # => -218107/41152
Rational(-654321, -123456)  # =>  218107/41152
```

# mathnライブラリによる罠
[scivola](http://qiita.com/scivola)さんより。
整数同士の割り算では、mathnライブラリをrequireする位置によって「/」の挙動が変わるというものです。

```rb
9/4 # => 2
require 'mathn'
9/4 # => 9/4
```
演算結果が前者ではIntegerとなり、後者ではRationalとなっています。

また、被除数が除数の整数倍の場合、mathnをrequireした後でもIntegerを返します。

```rb
9/3 # => 3
require 'mathn'
9/3 # => 3
```
なお、mathnはRuby2.2.0以降非推奨（deprecated）になっています。

mathnのこのような挙動により、汎用ライブラリ作成者は整数同士で除算を意識する場合、/ではなくdivを使うことが推奨されています。

> 逆に、汎用ライブラリの作者の方々は、この mathn が require される可能性を留意して書いて下されば親切だと思います。 整数同士で整除を意図するならば / メソッド ではなく div メソッド を用いると良いでしょう。
[library mathn - Ruby 2.2.0 リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.1.0/library/mathn.html) より

# 参考
[[ruby] 割り算で小数点以下も必要な場合](http://qiita.com/ryoff/items/0eb270fbc8de96cf158f)
[Class: Fixnum (Ruby 2.2.1)  #fdiv(numeric) → float](http://ruby-doc.org/core-2.2.1/Fixnum.html#method-i-fdiv)
[Class: Rational (Ruby 2.2.1)](http://ruby-doc.org/core-2.2.1/Rational.html)
[library mathn - Ruby 2.2.0 リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.1.0/library/mathn.html)
Ruby mine 使い出し初期メモ

## ショートカット

コードをリフォーマット
 command + option + L

検索
command + F

フォルダ内の全てを検索
1.Shift->Shift
2.command + shift + F

置換
command + R

フォルダ内の全てを置換
command + shift + R

コメントアウト
コメントアウトしたい行を選択し
command + / 


### 自分でショートカットキーを設定
Preferences →　Keymaps
ショートカットキーを設定したい項目をダブルクリックし、Add Keybord Shortcutを選択し、各キーを設定する。

*** 

## 設定
背景色変更
Preferences →　Editor → Colors & Fonts

折り返し（ソフトラップ）の設定
View → Active Editor → Use soft wraps in editor

行番号の表示
View → Active Editor → Show line numbers

### 好きなエディタカラー
(gray "#c6c6c6")
(red "#ff91a7")
(orange "#ffa667")
(yellow "#f2e582")
(green "#87d46f")
(aqua "#6cd0dc")
(blue "#80c1ff")
(purple "#e9a7ff")
背景色は #2c2c2c
親クラスの別のメソッドを呼ぶ

## やりたいこと

子クラスのメソッド bar から親クラスのメソッド foo を呼びたい。
オーバーライドしたメソッドではないので `super` が使えない。

```rb
class Parent
  def foo
    puts 'parent'
  end
end

class Child < Parent
  def foo
    puts 'child'
  end

  def bar
    # ここで親の #foo を呼びたい
  end
end
```

## alias を使う

上書きする前に alias しておけばよい

```rb
class Parent
  def foo
    puts 'parent'
  end
end

class Child < Parent
  alias :super_foo :foo

  def foo
    puts 'child'
  end

  def bar
    super_foo #=> parent
  end
end
```

## self.class.superclass からメソッドを取り出して bind して使う

これでもできる

```rb
class Parent
  def foo
    puts 'parent'
  end
end

class Child < Parent
  def super_foo(*args, &blk)
    self.class.superclass.instance_method(:foo).bind(self).call(*args, &blk)
  end

  def foo
    puts 'child'
  end

  def bar
    super_foo #=> parent
  end
end
```

## super_method を使う (Ruby >= 2.2)

コメントより(thanks!)。Ruby >= 2.2 なら super_method を利用できる。

```rb
class Parent
  def foo
    puts 'parent'
  end
end

class Child < Parent
  def foo
    puts 'child'
  end

  def bar
    public_method(:foo).super_method.call #=> parent
  end
end
```
標準入力で受けたデータをRで加工して標準出力へ渡す


データを加工するスクリプトを作ってLinuxのパイプ処理にはさみたいときの話。

### 標準入力
スクリプトファイルを実行する場合`cat hoge.R | R --no-save`のように標準入力を当てることが多い。`Rscript`と`stdin`を使えば標準入力をデータ入力に回せる。
### 標準出力
`stdout()`を使えばよい。

### 例

```input.csv
col1,col2,col3
3957,2397,1802
3408,4834,2983
4798,3759,7683
3485,7398,4739
```

とりあえず正規化してみるスクリプトを噛ます。

```process.R
input <- read.csv('stdin')

scaled <- data.frame(cbind(
 scale(input $col1),
 scale(input $col2),
 scale(input $col3)
))

colnames(scaled)<-colnames(input)
write.csv(scaled, stdout())
```

```console:
$ cat input.csv | Rscript process.R 
"","col1","col2","col3"
"1",0.0704684855275962,-1.03924712121725,-0.977681667393651
"2",-0.789247037909078,0.111955258058404,-0.515778657415892
"3",1.38744618172112,-0.395858676172752,1.32244669981989
"4",-0.668667629339635,1.3231505393316,0.171013624989648
```
OSXにPleiades Eclipseをインストール


# 初めに
Pleiades All in One（Eclipse本体とPleiadesおよび便利なプラグイン）はWindows用しか用意されていないがプラグインはOSXでも利用可能
素のEclipseにPleiadesのプラグインを入れることでOSXにPleiades All in Oneをインストールする

# 素のEclipseをインストール

```
brew cask install eclipse-platform
```

# Eclipse起動確認&バージョン確認を行う
```
open ~/Applications/Eclipse.app
```

# Pleiades All in Oneをダウンロード
http://mergedoc.sourceforge.jp/
上でインストールした素のeclipseバージョンに合うパッケージをDLする

DLしたらpleiades-4.4.2-201502041700.zipを展開し
dropins、features、pluginsディレクトリを上書きする

```
cp -rn pleiades/eclipse/dropins /opt/homebrew-cask/Caskroom/eclipse-platform/4.4.2-201502041700/eclipse
cp -rn pleiades/eclipse/features /opt/homebrew-cask/Caskroom/eclipse-platform/4.4.2-201502041700/eclipse
cp -rn pleiades/eclipse/plugins /opt/homebrew-cask/Caskroom/eclipse-platform/4.4.2-201502041700/eclipse
```

# eclipse.iniの編集
```
/opt/homebrew-cask/Caskroom/eclipse-platform/4.4.2-201502041700/eclipse/Eclipse.app/Contents/MacOS/eclipse.ini
```
このファイルに以下を追記（最終行でOK）

```
-javaagent:../../../dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar=no.mnemonic
```

# Eclipse起動確認
起動確認を行う

```
open ~/Applications/Eclipse.app
```
Courseraの講座 Machine Learning に日本語字幕をつけて、AndroidのMX Playerで視聴する方法

Courseraの創業者の一人 Andrew Ngさんが講義した機械学習のコースは無料で日本語字幕があるので、Androidスマホに入れてMX Playerで受講してみました。
(Karino2さんありがとうございます。「[Courseraの機械学習のコースに日本語字幕をつけました](http://karino2.livejournal.com/246001.html)」)。

Courseraの 機械学習のコース
Machine Learning - Stanford University | Coursera 
https://www.coursera.org/learn/machine-learning

AndroidのMX Playerで日本語字幕をつけて見る方法です。

ビデオは以下にあります。Courseraアカウントがない人は[登録](https://www.coursera.org/)をお願いします。
Coursera
https://www.coursera.org/learn/machine-learning/outline
ブラウザーから見る分には「Subtitle」から「Japanese」を選択すれば字幕が表示される。

Android へダウンロードしてMX Playerで見る場合には、ローカルにダウンロードしてAndroidスマホにいれます。

まず、以下から映像のmp4をダウンロードします。
Coursera 
https://class.coursera.org/ml-005/lecture

mp4ファイルのURLは、連番なのでダウンロードは簡単です。
https://class.coursera.org/ml-005/lecture/download.mp4?lecture_id=1
から
https://class.coursera.org/ml-005/lecture/download.mp4?lecture_id=114
までダウンロードします。

字幕ファイルをダウンロードします。
https://class.coursera.org/ml-005/lecture/subtitles?q=1_ja&format=srt
から
https://class.coursera.org/ml-005/lecture/subtitles?q=114_ja&format=srt
までダウンロードします。

ファイルは、以下のような形になります。
1 - 1 - Welcome (7 min).mp4
1 - 1 - Welcome (7 min).srt
1 - 2 - What is Machine Learning? (7 min).mp4
1 - 2 - What is Machine Learning? (7 min).srt

手作業でダウンロードするのは面倒なので、ダウンロードするbashスクリプトを以下に公開します。
https://gist.github.com/ynott/36c1e2caa4a7751de8a8

上記のファイルをAndroidスマホの適当なフォルダに転送します。
MX Playerで視聴することができます。

注：mp4とsubtitleの94番は存在しないようです。

Coursera の
MachineLearningを解説されてる方がいました。(2016年10月8日追記)
http://qiita.com/daxanya1/items/218f2e3b922142550ef9
Chart.js で レーダーチャートを作成

## :musical_score: 概要
Chart.js で レーダーチャートを作成

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル

~~~html
<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Qiita Scouter - Radar Chart</title>
  <script src="Chart.min.js"></script>
  <script language="JavaScript"><!--
  function displayPieChart() {
    var data = {
        labels: ["攻撃力", "知力", "すばやさ"],
        datasets: [
            {
                label: "Qiita Scouter",
                fillColor: "rgba(200,0,0,0.2)",
                strokeColor: "red",
                pointColor: "red",
                pointStrokeColor: "red",
                pointHighlightFill: "red",
                pointHighlightStroke: "red",
                data: [10780, 87010, 3927]
            }
        ]
    };
    var ctx = document.getElementById("radarChart").getContext("2d");
    var options = { };
    var radarChart = new Chart(ctx).Radar(data, options);
  }
  --></script>
</head>
<body onload="displayPieChart();">
  <div class="box">
    <canvas id="radarChart" height="450" width="450"></canvas>
  </div>
</body>
</html>
~~~

![chartjs_radar_chart.png](https://qiita-image-store.s3.amazonaws.com/0/43480/2ef7ec3e-00e5-03cb-a339-25c1eb444f3e.png)

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Chart.js docs](http://www.chartjs.org/docs/#getting-started-global-chart-configuration)
Railsで特定の日の新規ユーザ数などを取るクエリを作る


RailsでModel作るとデフォルトでcreated_at, updated_atを作成してくれて、便利ですね。

実際にサービスを開発・運営していくと、自らの要求だったり、企画者や偉い人からの要請だったりして、例えば「昨日会員登録した人が何人だったのか」のようなデータを出す必要が出てきます。
それをどのように取るかという話。

昨日一日で会員登録した人を取るとして、

## 失敗例その1

Railsってcreated_atを作ってくれてるからこれで行けるんじゃない？

```rb
User.where(created_at: Date.yesterday)
```

### 結果

なんも返ってきません。
created_atは時刻を含んでいますが、'2015-03-11'で検索をかけても時刻が入っていないので何とも一致しないわけですね。

実行されているSQLはこんなのです。 

```sql
SELECT `users`.* FROM `users`  WHERE `users`.`created_at` = '2015-03-12'
```

## 失敗例その2

では時刻を捨てよう。

```rb
User.where("DATE(created_at) = '#{Date.yesterday}'")
```

### 結果

返ってきます。勝ったッ！第3部完！

と思うのですが、`DATE(created_at)`してしまうとインデックスが効かなくなります。そもそもインデックスを貼っていないというケースもあると思いますが、インデックスを貼っていなかったり効いてなかったりすると、DBの性能にもよりますがユーザーが10万ぐらいになってきたあたりからしんどくなると思います。

100万、1000万Userを目指すようなビジョンがあるのであればやっちゃだめですね。

実行されているSQLはこんなのです。

```sql
SELECT `users`.* FROM `users`  WHERE (DATE(created_at) = '2015-03-12')
```

## じゃあどうすんのよ

SQLのクエリ的な解決方法で言うと、

```sql
where users.created_at between '2015-03-12 0:00:00' and '2015-03-12 23:59:59'
```

になります。

これをRailsでどう書くか。

```rb
User.where("created_at between '#{Date.yesterday} 0:00:00' and '#{Date.yesterday} 23:59:59'")
```

とかやりたくないな〜、って思ってたらActiveSupportで便利なものがありました。

* Date#beginning_of_day
* Date#end_of_day

これを使って、以下のように書けます。

```rb
range = Date.yesterday.beginning_of_day..Date.yesterday.end_of_day
User.where(created_at: range)
```

実行されるSQLはこれ。

```sql
SELECT `users`.* FROM `users`  WHERE (`users`.`created_at` BETWEEN '2015-03-12 00:00:00' AND '2015-03-12 23:59:59')
```

スッキリだし、インデックスも有効です。

## 追記

@jnchito さんにコメントで `all_day`を教えていただきました。

```rb
User.where(created_at: 1.day.ago.all_day)
SELECT "users".* FROM "users" WHERE ("users"."created_at" BETWEEN '2015-03-12 15:00:00.000000' AND '2015-03-13 14:59:59.999999')
```

さらにスッキリしてますね。
C++/CLI からCUDAカーネルを呼ぶ

C#/VB.NET でCUDAを使うべく、C++/CLIでカーネルを呼び出すアセンブリ(DLL)を作ります。
このとき、kernel.cu にどう書くか。

```cpp:kernel.cu
#include <cuda_runtime.h>
#include <device_launch_parameters.h>

__global__ void kernel_func(const float* input, float* output, int size) {
  ...
}

namespace CUDA {
  ref class Sample {
  public:
    static void wrapped_func() {
      ...
      kernel_func<<<grid, block>>>(in,out,size);
      ...
    }
  }
}
```
残念ながらダメなんです。nvccは純なC++コード以外受け付けてくれません。
なのでホスト側コードは.cuではなく、.cppに書かなくてはなりません。

しかしながら.cppには `kernel_func<<<grid, block>>>(in,out,size);` とは書けません。
`<<<...>>>` の部分はnvccでないと通常のC++コードに展開されませんから。

`kernel_func<<<grid, block>>>(in,out,size);`と等価なC++コードは以下のようになります。

```cpp:host.cpp
__global__ void kernel_func(const float* input, float* output, int size);

  dim3 grid;
  dim3 block;
  const float* in;
  float* out;
  int size;

  cudaConfigureCall(grid,block); // <<<grid,block>>>
  size_t offset = 0;
  cudaSetupArgument(in,   offset); offset += sizeof(in);   // 1'st arg
  cudaSetupArgument(out,  offset); offset += sizeof(out);  // 2'nd arg
  cudaSetupArgument(size, offset); offset += sizeof(size); // 3'rd arg
  cudaLaunch((const void*)&kernel_func); // launch!
```

[追記]
CUDA 7.0 以降、cudaLaunch は deprecated となりました。かわりに cudaLaunchKernel を使ってください。
くわしくは[コチラ](http://blog.zaq.ne.jp/fareastprogramming/article/18/)。
気圧と温度センサーのBMP180をはんだ付けする

気圧と温度センサーの[BMP180](https://www.switch-science.com/catalog/1598/)を購入しました。[SensorTag](http://www.tij.co.jp/tool/jp/cc2541dk-sensor)や[Grove System](http://www.seeedstudio.com/wiki/index.php?title=GROVE_System)のようにお手軽ではないので、ピンヘッダをはんだ付けする必要があります。村田製作所[エレきっず学園](http://www.murata.co.jp/elekids/index.html)の[はんだ付け](http://www.murata.co.jp/elekids/ele/craft/knack/soldering/index.html)ページを読んで基本を勉強します。

<!-- more -->

## BMP180

[BMP180](https://www.switch-science.com/catalog/1598/)は[BMP085](https://www.switch-science.com/catalog/1070/)の後継です。[Grove](http://www.seeedstudio.com/wiki/index.php?title=GROVE_System)や[Xadow](http://www.seeedstudio.com/wiki/Xadow)のモジュールにも採用されています。またmbedやArduinoでセンシングするチュートリアルがAdafruitやSparkFunなどのlearnサイトにたくさんあるので勉強できます。

## 電子工作の準備

はんだ付けは工具も手元にないので一式購入することにします。

* [goot 電子工作用はんだこてセット X-2000E](http://www.amazon.co.jp/dp/product/B001PR1KJM)

センサーにはんだ付けするピンヘッダも必要です。

* [普通のピンヘッダ10本セット](https://www.switch-science.com/catalog/92/)

ピンヘッダは1列40ピンなので、必要なピン数にカットします。

* [クラフトツールシリーズ No.40 モデラーズナイフ 74040](http://www.amazon.co.jp/dp/product/B002LE7LB4)


## ブレッドボードに挿して作業する

モジュールキットにピンヘッダを通してブレッドボードに挿してはんだ付けします。
【jQuery】イベント発火方法


```html:html
<button>挨拶</button>
```

```js:jQuery
$('button').click(function(){
  alert('hello');
})
```

があったとして、jQuery上からクリックイベントを実行（発火）する方法は二通り。

```js:jQuery
$('button').trigger('click');
```
または、

```js:jQuery
$('button').click();
```
RubyのArrayを使って簡易的に集計する

```rb:pry
#集計用の配列ににデータを追加していく
R2.1.5 pry(main)> arry << 'hogehoge'
[
    [0] "abc",
    [1] "hogehoge",
    [2] "hogehgoe",
    [3] "a",
    [4] "hogehoge"
]

#each_with_objectで集計用のhashを作る
R2.1.5 pry(main)> arry.uniq.each_with_object({}) {|i, h| h[i] = arry.count(i)}
{
         "abc" => 1,
    "hogehoge" => 2,
    "hogehgoe" => 1,
           "a" => 1
}

#ぐぐったらもっとスマートなやり方があった
#こっちのほうがarryの記述がひとつなぶん使いやすい
R2.1.5 pry(main)> arry.inject(Hash.new(0)){|hash, a| hash[a] += 1; hash}
{
         "abc" => 1,
    "hogehoge" => 2,
    "hogehgoe" => 1,
           "a" => 1
}
```
```rb
#オブジェクトの配列から、オブジェクトの属性の割合を集計する
object_array.inject([]) {|a,i| a << i.name}.inject(Hash.new(0)){|h, i| h[i] += 1; h}
```

参考
--
[配列の要素で同じものの数を数える](http://d.hatena.ne.jp/gan2/20070601/1180681980)

所感
--
もっと短く、rubyっぽくcoolに書けんもんだろうか。
each_with_objectが何か好きだ。
yumでコケるとき


作業メモ。

一部のyumでうまくいかない。

```
# yum install php
...
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA1 Signature, key ID 4520afa9: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY.art.txt


The GPG keys listed for the "CentOS / Red Hat Enterprise Linux 6 - atomicrocketturtle.com" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.
```

どうも、自分の環境ではatomic-releaseが古いことが原因だった模様。

```
# rpm -q atomic-release
atomic-release-1.0-17.el6.art.noarch
```

yumでatomic-releaseをアップデートもコケる。。。
シェルからアップデートすることで対応。

```
# wget -q -O - https://www.atomicorp.com/installers/atomic | sh
# rpm -q atomic-release
atomic-release-1.0-19.el6.art.noarch
```

いけた！！

```
# yum install php
...

インストール:
  php.x86_64 0:5.4.38-44.el6.art                                                                                                                                                   

依存性関連をインストールしました:
  apr.x86_64 0:1.3.9-5.el6_2                      apr-util.x86_64 0:1.3.9-3.el6_0.1       apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1       httpd.x86_64 0:2.2.15-39.el6.centos        
  httpd-tools.x86_64 0:2.2.15-39.el6.centos       mailcap.noarch 0:2.1.31-2.el6           php-cli.x86_64 0:5.4.38-44.el6.art           php-common.x86_64 0:5.4.38-44.el6.art      

完了しました!
```

# まとめ
症状は以下。
・いくつかのモジュールのみ失敗
・解決法は環境によって異なる

すんなり、解消する人もいれば、ちょっと手のかかる場合もある。（判ってしまえばそうでもないが）

以下の順で試してみるといいようだ。

`yum clean all`

ダメなら、

`yum update atomic-release`

それでもダメなら、

`wget -q -O - https://www.atomicorp.com/installers/atomic | sh`
Google API OAuth2.0のトークン取得手順


メモ書き。`gem gmail`を使いたく。

## 1. Gmail APIの有効化
初回は https://code.google.com/apis/console/ を開き[Create project...]により
Google Developers Consoleが開かれる。

Gmail API [OFF]を[ON]にする。

## 2. アクセストークンの取得
サイドバー[認証情報]よりOAuthの[新しいクライアントIDを作成]
「インストールされているアプリケーション」を選び[同意画面を設定]

適当に必要事項を記入して[保存]

再び[新しいクライアントIDを作成]より「インストールされているアプリケーション」を選び[クライアントIDを作成]で
クライアントID、クライアントシークレット、リダイレクトURIが得られる。
リダイレクトURIは何も入力しなければ`http://localhost`である。

## 3. OAuth認証

cURLが使えることが前提（Windowsは要設定）
（以下の動作は面倒だったのでスクリプト化）

まず、

```
https://accounts.google.com/o/oauth2/auth
?client_id=#{クライアントID}
&redirect_uri=#{リダイレクトURI}
&scope=https://www.googleapis.com/auth/drive
&response_type=code
&approval_prompt=force
&access_type=offline
```

を開く。スコープ（権限）は https://developers.google.com/gmail/api/auth/scopes?hl=ja-JP を見て好きなものを選ぶ。

XXXX が次の許可をリクエストしています
[承認する]

で、リダイレクトされる。このときアドレスバーを見ると
`http://localhost/?code=HOGEfugaFoobAr~~~~`とあり、`code=`以下が認証コードである。

```
curl -d client_id=#{クライアントID} -d client_secret=#{クライアントシークレット} -d redirect_uri=#{リダイレクトURI} -d grant_type=authorization_code -d code=#{認証コード} https://accounts.google.com/o/oauth2/token
```

を実行すると、アクセストークンなどが得られる。

### 3のスクリプト

```ruby:fetch.rb
# 自己入力部分
client_id     = "XXXXXXXXXXXXXXXXXX.apps.googleusercontent.com"
client_secret = "XXXXXXXXXXXXXXXXXX"
redirect_uri  = "http://localhost"
scope         = "https://www.googleapis.com/auth/gmail.compose"

# 自動部分
oauth_url = "https://accounts.google.com/o/oauth2/auth?client_id=#{client_id}&redirect_uri=#{redirect_uri}&scope=#{scope}&response_type=code&approval_prompt=force&access_type=offline"
`open "#{oauth_url}"`

print "認証コード(アドレスバーの?code=以下の部分全て)を入力してエンター："
code = gets.chomp

puts `curl -d client_id=#{client_id} -d client_secret=#{client_secret} -d redirect_uri=#{redirect_uri} -d grant_type=authorization_code -d code=#{code} https://accounts.google.com/o/oauth2/token`
```

## 参考
- http://qiita.com/kossacks/items/8d279bcc1acc2c2153ab
Intl.v8BreakIterator で拡張書記素クラスターを扱う

node.js や iojs で Intl を有効にしてビルドすると v8 独自実装の [`Intl.v8BreakIterator`](https://code.google.com/p/v8-i18n/wiki/BreakIterator) を利用できるようになります。

Mac OS X ですでにインストールされている ICU を利用する場合、ビルドオプションは次のように指定します。

```
pkg-config --modversion icu-i18n && ./configure --with-intl=system-icu
```

異体字セレクターを例に書記素クラスターの数を数えてみましょう。

コンストラクターの第1引数に言語タグを指定し、拡張書記素クラスター単位で扱うために第2引数のオブジェクトで `character` を指定します。

```js
var str = '葛' + String.fromCodePoint(0xE0101) + '飾区';
console.log(3 === graphemeLength(str, ['ja-JP']));

var str2 = '葛' + String.fromCodePoint(0xE0101).repeat(10000) + '飾区';
console.log(3 === graphemeLength(str2, ['ja-JP']));

function graphemeLength(str, locales)
{
    var it = new Intl.v8BreakIterator(locales, {type: 'character'});
    it.adoptText(str);

    var length = 0;
    var previous = 0;
    var current = it.first();

    while (current !== -1) {

        current = it.next();

        if (current === -1) {
            break;
        }

        previous = current;
        ++length;
    }

    return length;
}
```
Azure StatusのRSSをクロールしてHipchatに投稿するPythonスクリプト

## 概要
Azureでサービス監視するのに、[Azure status](http://azure.microsoft.com/en-us/status/)からAzureそのもののヘルスステータスを確認したい。
ただ、プッシュ通知では教えてくれないので、RSSをクロールしてHipchatに通知して欲しいなと作ってみた。


## 作ってみた
pythonでRSS読むならfeedparserがいいと聞いたので使ってみる。
hipchatはroomのtoken使ってrest api叩いてるだけ。
諸事情でproxy越しのアクセスなのでちょっと設定したり。

```py:azure_status_notificator.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import json
import urllib2
import feedparser

proxies = {
        "http": "hoge:8080",
        "https": "hoge:8080",
}

def hipchat_post_to_room(room_id, auth_token, msg):
        global proxies
        data = {
                "color": "red",
                "message_format": "text",
                "message": msg,
        }
        headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
        request_url = "https://api.hipchat.com/v2/room/" + room_id + "/notification?auth_token=" + auth_token
        return requests.post(request_url, proxies=proxies, data=json.dumps(data), headers=headers)

def get_azure_status():
        global proxies
        proxy = urllib2.ProxyHandler(proxies)
        data = feedparser.parse("http://azure.microsoft.com/ja-jp/status/feed/", handlers = [proxy])
        res = ""
        for e in data["entries"]:
                if e:
                        res += e.summary_detail.value
        return res

if __name__ == "__main__":
        status = get_azure_status()

        room_id = "XXXXXX"
        auth_token="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

        if status:
                msg = "@all %s" % status
                hipchat_post_to_room(room_id, auth_token, msg)

```
何もなければ通知しないようif文かませておく。

ちなみにhipchatはhtml形式でも投稿できるけど、それだと@allとかメンションが効かないので注意。

Hipchatに通知したらその中から[Azure status](http://azure.microsoft.com/en-us/status/)にリンクあるとすぐ開けて便利かな?と思ったけど、それやるなら形式が異なるので2度投稿する必要があるな、と。

あとは作ったスクリプトを毎時くらいでcron仕込んでおく。

```sh

00 * * * * python /home/hoge/azure_status_notificator.py

```

できた。

![azure.png](https://qiita-image-store.s3.amazonaws.com/0/26677/3b45426d-ffe8-59c2-adab-17287fc95c12.png)


## まとめ
RSSって普段feedlyとかリーダーからしか見ないので、実体としてフィードがどういう風なデータn構造で流れてくるのか知るいい機会ではあった。
RSSのスキーマ?みたいなのって実際にフィードが流れてないといまいち検証しづらいなと。

また、クラウド使ってると、自分のとこのインスタンスだけうっかり落ちたのか、
あるいはAzureそのものの障害なのか、を切り分けて考慮する必要があるなとしみじみ。

ちなみに[Azureのサポートプラン](http://azure.microsoft.com/ja-jp/support/plans/)というのはしかるべくあるので「金を払え」という話もあるが、
充実のサポートを期待するとそこそこのお値段がする。

自分が使ってるサービスとかAZとかに限定した方がいいかな?と思ったりはした。
PostgreSQL 9.4.x に pg_bulkload をインストールする方法


PostgreSQLの高速データローダ[pg_bulkload](http://pgbulkload.sourceforge.net/)のPostgreSQL 9.4.x向けのリリースが出ていたので、インストール方法のメモを残しておく。
公式サイトに載っている説明だと、拡張をインストールするSQLファイルのパスが間違っているっぽい。

## ビルド

`pg_config`コマンドにパスが通っている場合には、下記のコマンドでインストールできる。

```bash
make USE_PGXS=1
make USE_PGXS=1 install
```

`pg_config`にパスが通っていない場合には、環境変数で明示的に指定する。

```bash
make USE_PGXS=1 PG_CONFIG=/path/to/pg_config
make USE_PGXS=1 PG_CONFIG=/path/to/pg_config install
```

`make install`はルート権限が必要な場合には適宜 `sudo` などすること。

## 拡張関数を登録

この作業は、pg_bulkloadを利用してデータを投入したいPostgreSQLのデータベースごとに実行する必要あり。

```bash
psql DATABASE_NAME -f `pg_config --sharedir`/extension/pg_bulkload.sql
```
動的に変数やメソッドを呼ぶ

```js
var o = {
  x: function(){return 1},
  y: function(){return 2},
  z: 'i am value'
};

o.x(); //=> 1
o.y(); //=> 2
o.z;   //=> 'i am value'
o['x'](); //=> 1
o['y'](); //=> 2
o['z'];   //=> 'i am value'

var a = 'x';
o[a](); //=> 1
```

グローバル空間っぽいところに作成された変数・メソッドも同様。

```js
function a(){return 'hoge'}
var b = function(){return 'egoh'},
    c = 'hello (ツ)b';

this['a'](); //=> 'hoge'
this['b'](); //=> 'egoh'
this['c'];   //=> 'hello (ツ)b'
```


<ins>追記</ins>

大抵のjavascript style guideには以下のようなことが書いてあるようです。

```js
// bad
o["x"];

// good
o.x;
```

必要がある時でなければ、メンバへのアクセスはgoodのようなやり方を使いましょう。

`this['anyVar']`のように書いたはいいけど、ソースをminifyした時に変数の名前が変わってしまい…みたいな事故が起こりえます。程々にしましょう。
CentOS7（Redhat）でChefを使えるようにするshell

#rootで作業する場合

````bash:chef_envsetting
#!/bin/sh -x
#############################################################
# install package
PKG="gcc make zlib zlib-devel openssl openssl-devel git libffi-devel readline-devel wget bzip2"
# install ruby version
RB_VER="2.3.1"
# install gem version (https://rubygems.org/)
RB_GEM="2.6.6"
# install Chef Client Package (https://downloads.chef.io/chef-client/redhat/#/)
CHEF_PKG=chef-12.14.89-1.el7.x86_64.rpm
#############################################################
# package install
yum -y install ${PKG}
wget https://packages.chef.io/stable/el/7/${CHEF_PKG}
rpm -ivh ${CHEF_PKG}

# checkoud ruby
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

# rbenv setting
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ${HOME}/.bash_profile
echo $PATH

# checkout ruby-build
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

# ruby install
rbenv install ${RB_VER}
rbenv rehash
rbenv global ${RB_VER}

# download ruby-gems
git clone https://github.com/rubygems/rubygems
wget https://rubygems.org/rubygems/rubygems-${RB_GEM}.tgz
cd rubygems
ruby setup.rb

# install knife solo
gem install knife-solo --no-ri --no-rdoc
```

#一般ユーザで作業する場合
前提はrpm類がインストールされていること

````bash:chef_envsetting
#!/bin/sh -x
#############################################################
# install ruby version
RB_VER="2.3.1"
# install gem version (https://rubygems.org/)
RB_GEM="2.6.6"
#############################################################
# checkoud ruby
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

# rbenv setting
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ${HOME}/.bash_profile
echo $PATH

# checkout ruby-build
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

# ruby install
rbenv install ${RB_VER}
rbenv rehash
rbenv global ${RB_VER}

# download ruby-gems
wget https://rubygems.org/rubygems/rubygems-${RB_GEM}.tgz
tar zxvf rubygems-${RB_GEM}.tgz
cd rubygems-${RB_GEM}
ruby setup.rb

# install knife solo
gem install knife-solo --no-ri --no-rdoc
```
Scrivener原稿のgit diffをとる


## 動機
* Scrivenerで書いている原稿をGitで管理したい
   * diffも見たい

## 保存されるファイル形式
* Scrivenerは.scriv拡張子のバンドルを保存する
* バンドルはフォルダの一種であり、原稿の実態は内部のrtfファイルである
    * そのままではdiffで差分を閲覧できない
    * プレーンテキストとして保存すればいいのだがそれはナシで
* その他にも色々雑多なファイルが含まれるが全部無視

## 設定
* .scrivバンドルを管理するGitリポジトリ内の各設定ファイルを以下のように記述

### .git/info/attributes

```git
*.rtf diff=richtext
```

### .git/Config

```git
# ここはどうでもいい
[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  ignorecase = true
# ここが重要
[diff "richtext"]
  binary = true
  textconv = textutil -stdout -convert txt
```

### .gitignore

```git
# バンドル内の原稿以外のファイルを全部無視
*.html
*.checksum
*.xml
*.autosave
*.backup
*.indexes
*.lock
*.txt
*.jpg
*.scrivx
*.plist
```

## 補遺
* あとは普通に`git diff`でOK
* いらんファイルがステージされたら`git rm --cached $(git ls-files --full-name -i --exclude-standard)`でまとめて削除
* `textconv`で指定するコマンドの標準出力が比較される模様

## 参考
* [テキストでないファイルのdiff（差分）をとる方法 - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20121014/convert_diff)
* [ASCII.jp：知る人ぞ知るテキスト形式変換コマンド「textutil」の謎を解く (1/2)｜Apple Geeks](http://ascii.jp/elem/000/000/597/597604/)

---------

## giboで自動生成できるらしい
- [気付いたら\.gitignoreはgiboで自動生成する時代になっていた \- Qiita](https://qiita.com/tmknom/items/c4bcebe17d25381fa45d)

まだ試してない
vagrant provisionでコケる



vagrantでchef_soloでprovisionしようとした上で、`vagrant provision`とか`vagrant reload --provision`をしようとすると、意味不明のコケ方をする。

```
==> default: [2015-03-13T20:13:49+09:00] ERROR: Role Base-settings (included by 'top level') is in the runlist but does not exist. Skipping expand.
==> default: 
==> default: ================================================================================
==> default: Error expanding the run_list:
==> default: ================================================================================
==> default: 
```
とログは言っているのだが、`vagrant destory`して作りなおすとうまく行く。

よく見ると

#### 正常時
```
==> default: Mounting shared folders...
    default: /vagrant => /Users/shn/Documents/projects/SexyProj/Vagrant
    default: /tmp/vagrant-chef/8038246c2f51c3715e8e1a90fc487018/roles => /Users/shn/Documents/projects/SexyProj/chef-repo/roles
    default: /tmp/vagrant-chef/bf6c80968df8f6833cb062fcce85c668/cookbooks => /Users/shn/Documents/projects/SexyProj/chef-repo/cookbooks
    default: /tmp/vagrant-chef/7f1180f0b82febda17b1eeed5e0cec8b/cookbooks => /Users/shn/Documents/projects/SexyProj/chef-repo/site-cookbooks
    default: /tmp/vagrant-chef/c578295aa517d0324ff62f7f507bfa6b/data_bags => /Users/shn/Documents/projects/SexyProj/chef-repo/data_bags
==> default: Running provisioner: chef_solo...
```

#### 異常時
```
==> default: Mounting shared folders...
    default: /vagrant => /Users/shn/Documents/projects/SexyProj/Vagrant
```

で、chef用のディレクトリがマウントできていないっぽい。

試しに、/tmp/vagrant-chefをrenameしてみると、

```
Shared folders that Chef requires are missing on the virtual machine.
This is usually due to configuration changing after already booting the
machine. The fix is to run a `vagrant reload` so that the proper shared
folders will be prepared and mounted on the VM.```
と怒られた。
```

## 解決
Google先生とStackOverflow先生によると、これはbugらしい (http://stackoverflow.com/questions/27975541/vagrant-chef-error-in-provision-shared-folders-that-chef-requires-are-missin)

```
rm .vagrant/machines/default/virtualbox/synced_folders
vagrant reload --provision
```

これで無事解決
Haxeで複数行のString

Stringはふつうに複数行書ける。知らんかった。
WebGLでShaderを書くときに助かる。

```hx:fukusuu-gyo.hx
var hoge:String='
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
'；
trace(hoge);
```
iOSのSceneKitで3D迷路ゲームを作ってみたメモ

## はじめに

iOSにSceneKitという3Dライブラリがあるのですが、学習がてら、それを利用して簡単なゲームを作ってみました。

ThreeDMaze
https://itunes.apple.com/us/app/threedmaze/id973497184
ソースコード
https://github.com/xylitol45/ThreeDMaze

![screen640x640.jpeg](https://qiita-image-store.s3.amazonaws.com/0/25671/7186adf5-efcd-acda-1c16-1cbc9433c0a8.jpeg)

気付いたことをメモってみます。

## SCNNode.flattenClone

同じ内容のSNNode(3Dオブジェクト)をあちこちに配置する場合、`flattenClone`を利用して、コピーしたSCNNodeを配置すると最適化されてよいらしいです。

## SCNCameraのxFov、yFovは角度指定

カメラの画角（広角とか）の指定は`SCNCamera`の`xFov`、`yFov`を利用します。
ただ、何か理由があるのかもしれませんが、他の回転がほぼラジアン指定なのに対し、ここは角度(0-360)で指定するようになってました。

## rotateByAngle:aroundAxis:duration:
`SCNAction`を利用して、SCNNodeに対し、回転や移動などのアニメーションを設定することができます。
回転の指定は色々あるのですが、今回カメラの回転を行う為に、結局 `rotateByAngle:aroundAxis:duration:`を使いました。

```swift

SCNAction.rotateByAngle(CGFloat(M_PI) * -2, aroundAxis: SCNVector3(x: 1, y: 1, z: 1), duration: 10)
```

他の回転処理を連続で使うとどうもズレてしまう。。。
（四元数とかジンバルロックとかよく分かってないというのもある）

ただし、このAPIを使うと、現在、アプリの申請時に警告が出るようです。

> The app references non-public selectors in  Payload/ThreeDMaze.app/ThreeDMaze:rotateByAngle:aroundAxis:duration:

でも、ないはずはないので、これはさっくり無視した感じです（リリースはできた）。

## カメラの移動とアニメーション

実機での確認はiPhone6がメインでした。
で、当初、迷路内のオブジェクトにも`SCNAction`でアニメーション効果をつけていたのですが（迷路内のコインをくるくる回してた）、カメラを回転させると、アプリが落ちまくる。。。
動きの早さはそんなに悪くないんですけどね。
結局、アニメーション効果はあきらめました。

## SCNSceneRenderer.overlaySKScene
3D画面へのオーバレイ画面として、`SCNSceneRenderer.overlaySKScene`を利用し、SpriteKitの`SKScene`を設定することができます。

ただ、SpriteKitの感覚で使ってたら若干挙動が違っていて、

* `SKScene.scaleMode`がうまく動いてない？`frame`は実値で指定したほうがよさげ。
* 親となる`SCNView`で再描画されないと、画面更新されないような。結局、`CADisplayLink`を利用する形になりました。

```swift
        // CADisplayLinkを利用して、loop処理を作る
        if displayLink == nil {
            displayLink = CADisplayLink(target: self, selector: Selector("loop:"))
            displayLink?.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
        }
```
```swift
func loop(link:CADisplayLink) {
        if startTime == nil {
            startTime = link.timestamp
        }
        
        if link.timestamp - lastTime > 0.01 {            
            lastTime = link.timestamp
            // ここでSKLabelNode変更            
            refreshTimeLabel(Double(lastTime - startTime!))            
            self.view!.setNeedsDisplay()
        }
    }
```

## 迷路作成
ここを参考にしたのですが、迷路の作り方は色々あるようです。

迷路自動生成アルゴリズム 
http://www5d.biglobe.ne.jp/stssk/maze/make.html

今回は立体ということもあり「穴掘り法（道延ばし法）」というのを利用しました。

1. まず迷路を全て壁で埋め尽くす。
2. 適当な基点を設定する。
3. その基点からランダムに２マス穴を掘れる方向を探す。
4. 2マス掘って、新たな基点とし、3を繰り返す。
5. 穴に当たって掘れなくなったら、今までの基点から適当なものを選び新たな基点とする。

## 3Dモデル
今回は使ってませんが。

SceanKitですが、3Dモデルとして、COLLADAフォーマット(.dae)を扱うことができます。
ただ、これについてはよく指摘されているようですが、プロジェクトに追加すると、独自の形式に変換されているようです。
UIWebView + three.js でこのリソースを扱おうとしても、正しく読み込めません。
.datとか拡張子を変えて追加すると、正しく読み込めるようです。
（でも、おそらくSceneKitからは使えないような）


## Unity
 ~~世の中的には Unityのほうがメジャーなのですが、SceneKitは無料なので、カジュアルに何か作るにはいいかな、と思います。~~ 

Unity無印のiOS出力アドオンっていつの間にか無料になってた。。。
Django:Admin: 追加フォームに初期値を設定する


Ticket-Orderのモデル

## admin.py: OrderAdminForm

- 通常のモデルフォーム

~~~py
class OrderAdminForm(forms.ModelForm):
    class Meta:
        model = Order
        exclude = []
~~~        

## admin.py: OrderAdmin

- OrderAdminFormを使うようにする
- get_form()
- URIのクエリにいれた ticket_id からTicketオブジェクトを取得
- base_fields['ticket'].initialにセットする

~~~y
class OrderAdmin(admin.ModelAdmin):

    form = OrderAdminForm

    def get_form(self, request, obj=None, **kwargs):
        form_class = super(OrderAdmin, self).get_form(request, obj, **kwargs)
  	    ticket_id = request.REQUEST.get('ticket_id', None)
        form_class.base_fields['ticket'].initial = ticket_id and Ticket.objects.get(id=ticket_id)
        return form_class 
~~~

## templates/admin/tickets/ticket/change_form.html

- Django の標準テンプレートをコピる
- Ticketの編集画面で、Orderの追加画面へのアンカーを追加する
- `<a href="history/">{% trans "History" %}</a>` の隣とか

~~~html
<a href="{% url 'admin:tickets_order_add' %}?ticket_id={{ object_id }}">注文 </a><
~~~
tempingつかってみた

## temping

https://github.com/jpignata/temping

concernでspecを書くときに、Dummyクラスを使いたいけど、
ActiveRecordの機能が必要なとき
tempingを使うことで、ActiveRecordなDummyクラスを使うことが出来る。


## 使い方




##### Gemfile
```ruby:Gemfile
group :test do
  gem 'temping'
end
```



##### concern
```ruby:app/models/concern/has_hoge_record.rb
module HasHogeRecord
  extend ActiveSupport::Concern
  module ClassMethods
    def default
      where(default: true).first
    end
  end
end
```

##### spec
```ruby:spec/models/concern/has_hoge_record_spec.rb

require 'spec_helper'

describe HasHogeRecord do

  before(:all) do
    Temping.create :has_hoge_class do
      include HasHogeRecord
      with_columns do |t|
        t.boolean :default, default: false
      end
    end
  end

  describe :default do
    subject { HasHogeClass.default }
    let(:default) { HasHogeClass.create(default: true) }
    it { expect(subject).to eq default }
  end

end
```

※beforeでhas_hoge_classesテーブルが作成される。
`before(:all)`じゃないと、二回目のitで`PG::UndefinedTable`が発生。

地味に便利！