OmniAICreator/Qiita-1.07M huggingface dataset:
Packer + chef-soloでカスタムAMI(AmazonMachineImage)を作る


# はじめに
## Packerとは？
* VagrantやConsulで有名なHashiCorpから提供されている仮想イメージを作るためのツール。
* オフィシャルサイト:https://www.packer.io/

## 前提条件
* [AWSアカウント](http://aws.amazon.com/jp/register-flow/)作成済
* [Chef](https://www.chef.io/chef/)導入済
* [chef-rbenv](https://github.com/fnichol/chef-rbenv)インストール済

## ゴール
* Rubyビルド済みのAMI作成

## カスタムAMIを作ることの狙い
* EC2インスタンス作成時におけるプロビジョニングの実行時間の短縮



# 実施
## ベースとするAMIを決める
* マネージドコンソールを開きEC2 -> AMIs -> Public imagesから探す
* 今回は`amzn-ami-hvm-2014.09.1.x86_64-ebs (AMI ID:ami-4985b048)`を選択

## Packerをインストールする(For Mac)
```bash
$ brew tap homebrew/binary
$ brew install packer
```
参考: https://www.packer.io/docs/installation.html

## 設定ファイルを用意する
```json:template.json
{
  "variables": {
    "chef_version": "11.16.4",
    "ruby_version": "2.1.5",
    "source_ami_id": "ami-4985b048",
    "access_key": "ACCESS_KEY",
    "secret_key": "SECRET_KEY"
  },
  "builders": [
     {
      "type": "amazon-ebs",
      "access_key": "{{user `access_key`}}",
      "secret_key": "{{user `secret_key`}}",
      "region": "ap-northeast-1",
      "source_ami": "{{user `source_ami_id`}}",
      "instance_type": "t2.micro",
      "ssh_username": "ec2-user",
      "ami_name": "amzn-ami-hvm-ruby-{{user `ruby_version`}}-{{timestamp}}",
      "ami_description": "This AMI, ruby version {{user `ruby_version`}} are build to AmazonLinux. Base AMI is {{user `source_ami_id`}}"
    }
  ],
  "provisioners": [
    {
      "type": "chef-solo",
      "install_command": "curl -L https://www.opscode.com/chef/install.sh | {{if .Sudo}}sudo{{end}} bash -s -- -v {{user `chef_version`}}",
      "cookbook_paths": ["/path/to/chef-repo/cookbooks/"],
      "run_list": ["ruby_build", "rbenv::system"],
      "json": {
        "rbenv" : {
          "global": "{{user `ruby_version`}}",
          "rubies": [
            "{{user `ruby_version`}}"
          ]
        }
      },
      "prevent_sudo": false
    },
    {
      "type": "shell",
      "inline": [
        "sudo chmod -R 775 /usr/local/rbenv/"
      ]
    }
  ]
}

```

## 設定ファイルに構文ミスがないかチェックする
```bash
$ packer validate --only=amazon-ebs template.json
```

## 実行する
```bash
$ packer build --only=amazon-ebs template.json
```

また、 **variables** で定義している変数は、実行時に引数として渡すことが可能です。例えばRubyのバージョンとChefのバージョンを変えたい時は以下のように実行するとよいです

```bash
$ packer build --only=amazon-ebs \
    -var 'chef_version=12.0.3' \
    -var 'ruby_version=2.2.0' \
    template.json
```

これで、AMIが出力されたはずですので、マネージドコンソールから確認してみましょう。

ちなみに、私の環境では`743.13 real 6.04 user 1.08 sys ≒ 13min`でビルドが完了しました



# 注意点
## chef-rbenvがChef12系で実行するとエラーとなる
* issueは挙がっていてPRも出ているのでPRが取り込まれるまでは、 **11.16.4** を使っておくのが吉かと思います。
	* issue: https://github.com/fnichol/chef-rbenv/issues/98
	* PR: https://github.com/fnichol/chef-rbenv/pull/101

## Packer実行時にエラーとなることがある
* 私の環境で起きている同様のエラーがbugとしてissueに挙がっています。ただ、必ず起きるわけではないので、失敗したら何度か実行してみるとそのうち成功すると思います。
	* issue: https://github.com/mitchellh/packer/issues/1539



# さいごに
Rubyビルド済みのカスタムAMIをベースAMIとすることで、プロビジョニングの実行時間が10分程短縮できた
IE8でjQueryのloadを扱うときに個人的に忘れてはいけないこと

#IE8 + jQuery + load =
```
var method = $("#selectBoxA").val();
$("#selectBoxB").load("./path/" + method);
```
セレクトボックスAの選択に応じて動的にセレクトボックスBの中身を変える処理を考える。
事前に選択された内容に応じてmethodの値が変わって、結果、セレクトボックスBの中身が変わるという風に。IE8だとこれが動作せずにハマった。

##だいたいキャッシュのせい
```
$.ajaxSetup({ cache: false });
```
「IE8 jQuery load」で検索して一番多かったのは上記の追記。
これをload前に埋め込むとキャッシュが悪さしないとのこと。
しかし、今回はこれでは解決できなかった。
どうやら私は他の方々とは別の次元でミスをしているらしい。。。

##原因はエンコード
```
var method = $("#selectBoxA").val();

var address = encodeURI("./path/" + method);
$("#selectBoxB").load(address);
```
エンコードは忘れずに、ということだった。
最近のブラウザじゃあっさり動いてくれたんですが。。。（言い訳

同じ状況に嵌る人が居るかどうかはわからないけど、
次同じような事態に遭遇したときのためにメモ。
SRPMの扱い方法メモ

SRPMを扱う時のメモ

# SRPMを手に入れる
## YUMの場合

```bash
$ sudo yum install yum-utils
$ yumdownloader --source kernel
```

## DNFの場合

```bash
$ dnf download --source kernel
```

`download`はプラグインによる提供だが、dnf-pluins-coreに含まれるためすぐに使える（と思うたぶん）。

# SRPMの展開
なんとインストールと同じ。

```bash
$ rpm -ivh kernel.src.rpm
```

pwdにrpmbuildというディレクトリが作成され、その中にSPECSとSOURCESが展開される。
と、思うのだがどうやら/usr/local/src/redhatに展開されることもあるらしい（え、でもそれroot必要じゃん。）
どこに展開されるかは以下で確認できる。

```bash
$ rpm --showrc | grep _topdir
```
CoreGraphicsで円のUIImageを作る


今日、仕事中にど忘れしていたので、今後の自分への備忘録も込めて

外周を別な色で囲った円を書きます。

```objc
#define LC_TINTCOLOR_RED    0.992
#define LC_TINTCOLOR_BLUE   0.565
#define LC_TINTCOLOR_GREEN  0.149
#define LC_TINTCOLOR_ALPHA  1.0

- (UIImage *)convertImage {
    UIImage *resultImage = nil;
    UIGraphicsBeginImageContext(_ibHeaderImageView.frame.size);
    float mergineR = 1.0f;
    CGRect circleRect = CGRectMake(mergineR, mergineR, _ibHeaderImageView.frame.size.width-mergineR*2, _ibHeaderImageView.frame.size.height-mergineR*2);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextSetRGBStrokeColor(context, 1, 1, 0, 1);
    CGContextSetLineWidth(context, 2.0);
    CGContextStrokeEllipseInRect(context, circleRect);
    
    CGContextSetRGBFillColor(context, LC_TINTCOLOR_RED, LC_TINTCOLOR_GREEN, LC_TINTCOLOR_BLUE, LC_TINTCOLOR_ALPHA);
    CGContextFillEllipseInRect(context, circleRect);
    
    resultImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return resultImage;
}

```

結果は以下な感じ

![capture-07.png](https://qiita-image-store.s3.amazonaws.com/0/64588/8f85833b-c251-6b6d-5f47-0796dd6c743a.png "capture-07.png")
ownCloudで206 Partial Contentを返すようにする

ownCloudは標準プラグインのvideo viewerで動画をブラウザ内で再生できます。しかし(少なくとも僕の環境では)HTML5で動画を生成するとシークができません(主にChrome)。HTML5でなくFlash Playerを使って動画を再生するよう変更すればシークは出来ますが画質があまりよくなく負荷も高いためできればHTML5で再生したいところ。調べたところ問題点ははっきりしていたのでなんとかならないものか調べてみました。

# 原因
原因はownCloud側が206 Partial Contentでなく200 OKを返してしまうことです。シークをする場合は200 OKではなく206 Partial Contentが返ってくる必要があるためうまくシークできないようです。ですからownCloudが206 Partial Contentを返せるようになれば問題は解決です。

# pecl_http
pecl_httpはphpの拡張モジュールです。これを使えばownCloudが206を返せるようになります。pecl_httpは現在2.xが最新版ですがどうやら2系統は上手く動かないようです。1.xを指定してインストールします。
以下のインストール手順はMacの場合です。とりあえずpecl_httpがインストールできれば問題ないので手順は他を調べてみてください。
Macの場合はまず

```
/etc
```

にある`php.ini`に

```
extension=raphf.so
extension=propro.so
```

を書き加えてください。その後

```
sudo pecl install pecl_http-1.7.6
```

でpecl_httpをインストールします。途中いろいろ聞かれますが全てエンターで(多分)問題ありません。

インストールが問題なく進んだら`php.ini`に更に

```
extension=http.so
```

を書き加えてください。

以上でインストールは完了です。

```
sudo apachectl -k restart
```

でapacheを再起動しておきます。

# ownCloudの設定
ownCloudのディレクトリ内にある設定ファイルを書き換えます。

```
/owncloud/lib/private/files.php
```

を開いてください。160行あたりに

```php
if ($xsendfile) {
    /*省略*/
} else {
    \OC\Files\Filesystem::readfile($filename);
}
```

と書かれていると思います。この`\OC\Files\Filesystem::readfile($filename);`を次のように書き換えます。

```php
if ($xsendfile) {
    /*省略*/
} else {
    $filename = \OC\Files\Filesystem::getLocalFile($filename);
    http_send_file($filename);
}
```

`http_send_file`が206を返してくれる部分です。

これで確実にシークが出来るようになったかと思います。
nginxでBasic認証をする


##やりたいこと
nginxでBasic認証をかける

##手順

① htpasswdコマンドを利用するためにhttpd-toolsを入れる

```linux
$ yum install -y httpd-tools
```

② Basic認証のユーザー・パスワードを設定

```linux
$ cd /etc/nginx
$ htpasswd -c .htpasswd hoge
New password: ユーザーhogeのパスワード
Re-type new password: もういちど入力
```

③ nginxの設定ファイルでBasic認証を有効にする

```/etc/nginx/conf.d/default.conf
server {
	listen 80;
	server_name example.com;

	root /path/to/public;

	location / {
		auth_basic "Restricted";
		auth_basic_user_file /etc/nginx/.htpasswd;
	}
}
```

* auth_basic_user_fileには②で作成したBasic認証用ファイルのパスを指定
* 特定のパスにBasic認証をかけたいときは、"location / "を適宜変更する


④ ブラウザで確認
　Basic認証をかけたURLへアクセスし、認証が有効になっているか確認する.
Macでimagemagickを使って.aiファイルを.pngに変換


`brew install imagemagick` でインストールしたものだと、色がサイケな感じになってしまう。

問題はCMYK色空間からsRGB色空間への変換がうまくいっていないこと。
homebrewで入るデフォルトバージョンでは色空間をうまく扱えず、下記のようなエラーがでる。

~~~
convert: delegate library support not built-in `/pathTo/input.jpg' (LCMS) @ warning/profile.c/ProfileImage/565.
~~~

そこで次のコマンドでimagemagickをインストールしなおす。

`brew install imagemagick --with-little-cms`

でインストールする。（[参考](https://github.com/Homebrew/homebrew/issues/16619)）
MacがSSHの秘密鍵のパスワードを覚えてくれない時に確認すること

# はじめに

* macOS Sierra 以降でパスワード覚えてくれない問題はこれとは別問題なので `UseKeychain` や `AddKeysToAgent` をキーワードにググるとよいです。


# 現象

## GUI 編

Mac で ssh 使うときに、パスワード付きの秘密鍵を使っていると、 Keychain がパスワードを聞いてくる。

![Screenshot 2015-01-07 18.24.55.png](https://qiita-image-store.s3.amazonaws.com/0/12052/a864d28c-91ba-36e2-cd9f-d744dfa16226.png)

このとき、本来は 1 回 **パスワードをキーチェーンに保存 (Remember password in my keychain)** にチェックを入れてやれば、次からはスキップできるようになる。

……はずなのに、毎回出てきてしまう。つらい。

ちなみに、キーチェーンアクセスを参照すると、ちゃんと保存されている。のに、使ってくれない！

## vagrant-aws 編

一度 `ssh-add -K` で秘密鍵のパスワードを覚えさせた後、 `vagrant up --provider aws` して EC2 のインスタンスは立ち上がるところまではいくんだけど、 **Waiting for SSH to become available...** と言ったまま何分待っても返ってこない。

# 1時間掛かってたどり着いた原因

 * 秘密鍵ファイルに対応する公開鍵ファイル (拡張子 .pub) が存在してない

何故か秘密鍵が置いてあるだけでは存在しないものとして扱われてしまい、鍵が見つけられなくなる。何故かまでは調べてない。

# 対策

```shell-session
cd ~/.ssh
ssh-keygen -yf 秘密鍵 > 秘密鍵.pub
```

# 確認したバージョン

```shell-session
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.10.1
BuildVersion:	14B25
$ ssh -V
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
```

# References

* http://apple.stackexchange.com/questions/18458/password-dialog-appears-when-ssh-private-key-permissions-are-set-to-0600/26252#26252
緯度経度より中間地点を（地球の丸さも考えて）求める。

[地球上の直線距離を求めた](http://qiita.com/s-wakaba/items/e12f2a575b6885579df7)ついでに、ちょっと遊んでみたので。

```py3
from math import sin, cos, acos, asin, atan2, radians, degrees

def latlng_to_xyz(lat, lng):
    rlat, rlng = radians(lat), radians(lng)
    coslat = cos(rlat)
    return coslat*cos(rlng), coslat*sin(rlng), sin(rlat)

def xyz_to_latlng(x, y, z):
    rlat = asin(z)
    coslat = cos(rlat)
    return degrees(rlat), degrees(atan2(y/coslat, x/coslat))

def halfway_on_sphere(pos0, pos1, z=0.5):
    xyz0, xyz1 = latlng_to_xyz(*pos0), latlng_to_xyz(*pos1)

    theta = acos(sum(x * y for x, y in zip(xyz0, xyz1)))
    sin_th = sin(theta)

    v0 = sin(theta * (1-z)) / sin_th
    v1 = sin(theta * z) / sin_th

    return xyz_to_latlng(*(x * v0 + y * v1 for x, y in zip(xyz0, xyz1)))

Tokyo = 35.68, 139.77
Atlanta = 33.755, -84.39
print(halfway_on_sphere(Tokyo, Atlanta)) # (61.51, -150.67)
```

東京とアトランタのちょうど中間地点は、アンカレジ市街の北西40kmの辺りだとわかりました。

お察しの通り、`halfway_on_sphere`関数の第三引数で、任意の内分点を計算できます。小刻みに座標を求めて大圏航路をプロットしたりできます。外分点もたぶん問題なく計算できると思う。
railsのdeprecateってメソッドが便利ぽい

リファクタしていると、このメソッド名やばい変えたいという気持ちが高まるケースが多々あると思います。

そんなの、 **徹底的にgrepすればいい** し、 **テスト書いてるだろ？** って話なんですが、特に後者に対して「お、ぉう」となるケースがありうると思っていて、「このメソッド名変えたら誰か困る人がいるかもしれない。。。」という気持ちにより、心が折れるのはつらいですよね。

`alias_method`でとりあえず逃げる事もできますが、あとでリファクタしたいよねというケース。

そんなときは、こんな感じでwarningを出す事があるかなーと思っています。

```before.rb
def suck_method_name
  puts "I'm cool"
end
```

```after.rb
def suck_method_name
  log_deprecated_message(__method__)
  cool_method_name
end

def cool_method_name
  puts "I'm cool"
end

private

# ナンカもっと共通部分に置くであろう
def log_deprecated_message(method_name)
  logger.warn "#{method_name}? is deprecated"
end
```

## railsのdeprecateを使う

```before.rb
def suck_method_name
  puts "I'm cool"
end
```

```after.rb
def suck_method_name
  cool_method_name
end

def cool_method_name
  puts "I'm cool"
end
deprecate(suck_method_name: 'use suck_method_name', deprecator: MyDeprecator.new)
```

```lib/my_deprecator.rb
# おれの Deprecator
class MyDeprecator
  def deprecation_warning(deprecated_method_name, message, caller_backtrace = nil)
    message = "#{deprecated_method_name} is deprecated and will be removed | #{message}"
    Kernel.warn message
  end
end
```

## どっちがいいのやら

多分実装にかかる時間はあまり変わらないですが、railsも内部で使っているのがあるだろうという予想から[調べてみたら見つけた](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/module/deprecation.rb)のでせっかくだし、それ使ってみるかという感じです。

メソッドの中ではなく外に書けるのは便利かなーと思いました。
Azure Redis Cache の 非 SSL 接続を有効にする


PHP から Azure Redis Cache のインスタンスへ接続できず、原因を探していると、デフォルトでは SSL ポートしか有効になっておらず、非 SSL ポートが無効になっていました。

![Microsoft_Azure.png](https://qiita-image-store.s3.amazonaws.com/0/12272/a9071b3c-1e64-b82b-c9ee-fcf2a035cf71.png "Microsoft_Azure.png")

非 SSL ポートを有効にするには、「アクセス」をクリックして、アクセスポートの「SSLによるアクセスのみ許可する」を「いいえ」にして、保存します。


![Microsoft_Azure.png](https://qiita-image-store.s3.amazonaws.com/0/12272/f7b99f95-fc64-7f39-5b72-91cfa3e4d5b9.png "Microsoft_Azure.png")

これで、非 SSL ポートが有効になり、非 SSL で接続できます。

```
$ redis-cli -h xxxx.redis.cache.windows.net -a xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxx.redis.cache.windows.net:6379> ping
PONG
```
concrete5 テーマ作成でよく使うけれど忘れちゃうのでメモ

concrete5 のテーマ作成でよく利用するコードのメモです。


### Page オブジェクトの取得
```php:view.php
/* カレントページの取得 */
$c = Page::getCurrentPage();

/* パス名を指定してページを取得 */
$p = Page::getByPath("/sample");

/* ページIDを指定してページを取得 */
$p = Page::getByID(1);
```

### Collection IDの取得
```php:view.php
/* ページのID取得 */
$cid = $p->getCollectionID();

/* ページの親ID取得 */
$cid = $p->getCollectionParentID();
```

### ページ情報の取得
```php:view.php
/* ページタイトルの取得 */
$p->getCollectionName();

/* ページ概要の取得 */
$p->getCollectionDescription();

/* ページタイプの取得 */
$pt = $c->getCollectionTypeHandle();
if ($pt === 'home')
{
    /* home の処理 */
}

/* ページリンクの取得 */
$nh = Loader::helper('navigation');
$href = $nh->getLinkToCollection($p);

/* カスタム属性の取得 */
$p->getAttribute('custom_attr');
```

### Page 一覧の取得
```php:view.php
$pl = new PageList();

/* エイリアスページは対象外とする。
   ページ数が多いサイトは ignoreAliases()を指定しておくと、
   少しだけ速くなる気がするようなしないような。。
 */
$pl->ignoreAliases();

/* 複数検索保持したい場合などで namespace 指定している場合は namespace を指定 */
$pl->enableStickySearchRequest($namespace);

/* 取得する件数 */
$pl->setItemsPerPage(6);

/* 特定のページタイプを持つページのみ */
$pl->filterByCollectionTypeHandle('page_type');

/* 指定した親ID直下のみ */
$pl->filterByParentID($parent_id);

$pages = $pl->getPage();
foreach($pages as $p)
{
    /* ページ毎の処理 */
}
```

### Page 一覧のソート指定
```php:view.php
/* 公開日時順 */
$pl->sortByPublicDate();    // 昇順（古いもの順）
$pl->sortByPublicDateDescending();    // 降順（新しいもの順）

/* サイトマップ順 */
$pl->sortByDisplayOrder();    // 昇順（上から順）
$pl->sortByDisplayOrderDescending();    // 降順（下から順）

/* ページ名順（日本語だといまいち。。UTF-8文字コード順？） */
$pl->sortByName();    // 昇順
$pl->sortByNameDescending();    // 降順
```
vimでMarkdownのプレビュー

今月の「Software Design」のvimの特集記事を見てやってみたのでメモ。

参考サイト：
http://www.key-p.com/blog/staff/archives/9032

.vimrc の設定

```vim
NeoBundle 'plasticboy/vim-markdown'
NeoBundle 'kannokanno/previm'
NeoBundle 'tyru/open-browser.vim'

au BufRead,BufNewFile *.md set filetype=markdown
let g:previm_open_cmd = 'open -a Firefox'
```

こんだけ。で、
`README.md` とかを編集して、保存したら、

```vim
:PrevimOpen
```

と打つと勝手にFirefoxが立ち上がってプレビューしてくれる。

```vim
:w
```

すればブラウザも自動で更新される。
素晴らしい。。。。
Haswellが載ったサーバの説明

##Ivy-BridheとHaswellの違い##

最新のサーバと1世代前のサーバはどう違うの？って聞かれて
正確に答えられなかったのでメモ

###CPU###
最大18core(現在ローンチは14coreまで、v2は12core)
18coreモデルでもターボブーストで3.6GHzぐらい出る

###メモリ###
DDR4メモリになった
従来と比べて消費電力を50％削減
帯域幅が3倍
今までのメモリは刺さらない（重要）

###SSD###
IOPSがーって説明をしてもお客さんに伝わりづらいので
公的な見解を探すことに。
***
*Intel テクノロジープロバイダから抜粋*

SSD DC P3700はIntel SATA SSDの6倍、
SATA SSD の1300倍のパフォーマンス（スループット）が公開数値
ってことは1300/6=216.666...なので
HDDとくらべて200倍以上のパフォーマンスが出るのが公式見解
***

「SSDはHDDに比べて200倍以上早いですよってIntelが言ってた」でOK

####いらない情報####
最大メモリ容量768GB→1.5TB（そんなに積まない）
CPUソケットLGA2011→LGA2011 v3になって互換性がない(別に差し替えない)
UnityでのTweet対応ボタンの作成(個人的メモ的なアレコレ)

ゲームジャムとかで毎回使う(？)ツイートボタン。
ささっと導入できる様にメモとしておいておきます。
また、[マルチタップに対応する](http://qiita.com/Taku_Ishikawa/items/e0a89a076dedf73c4fce "僕の別記事のステマである")と組み合わせるとマルチタップないし、Android等でのタップにも対応できるようになります。
また、簡易化とか出来るようでしたら、ご指導、ご鞭撻を宜しくお願いします。

```csharp
using UnityEngine;
using System.Collections;

public class tweet_button : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
	/// <summary>
	/// Fixeds the update.
	/// </summary>
	void FixedUpdate()
	{
        //上で説明のときにあったリンクを参考にしてね
		CheckTap();
        
        //左クリックされたとき
		if(Input.GetMouseButtonDown(0))
		{
            // score -> 変数
            if (this.gameObject.guiTexture.HitTest(Input.mousePosition))
			{
                string message = "" + score + "ここに勝手に入れておいてほしい文字 #ハッシュタグ";
                Application.OpenURL("http://twitter.com/intent/tweet?text=" + WWW.EscapeURL(message));
			}
		}
	}

    // こっちでもいいけど、こっちは1フレームのみのクリックは反応しないかも。
    void OnMouseDown()
    {
        string message = "" + score + "ここに勝手に入れておいてほしい文字 #ハッシュタグ";
        Application.OpenURL("http://twitter.com/intent/tweet?text=" + WWW.EscapeURL(message));
    }

}

```
[こんな感じになります](http://twitter.com/intent/tweet?text=こんな感じ "")←クリックするとツイート画面に行きます


scoreは基本的に保持していたスコアなり何なりの変数をおいておけば勝手にその数値が入ります。
基本的な部分ですね。 別シーンから数値を保持したいだのに関しては[Unityで共通データ(ScriptableObjectとPlayerPrefs)](http://wannabe-jellyfish.hatenablog.com/entry/2014/10/05/230205 "くらげになりたい")
ここら辺とか参考にしてください。
rbenvでRuby2.2をインストールする。


rbenvで最新のrubyバージョンをインストールした時の手順まとめ。

## 新しいrubyバージョンのインストール
ruby-builderをupgradeしてリストを更新してから、インストール

```
$ brew update
$ brew upgrade ruby-build

$ rbenv install --list
  2.1.3
  2.1.4
  2.1.5
  2.2.0-dev
  2.2.0-preview1
  2.2.0-preview2
  2.2.0-rc1
  2.2.0

$ rbenv install 2.2.0
```

## bundlerをインストール

~~前のbundleだと以下のエラーがでる。updateもダメみたい。インストールをし直すといける。~~

bundlerはrubyのバージョンごとに管理されているようでエラーがでる。bundlerを新規にインストールする。

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

The `bundle' command exists in these Ruby versions:
  2.0.0-p481

$ gem update bundler
Updating installed gems
Nothing to update

$ gem install bundler
Fetching: bundler-1.7.11.gem (100%)
Successfully installed bundler-1.7.11
1 gem installed
$ bundle install
Fetching source index from https://rubygems.org/
Installing rake 10.3.2
Installing i18n 0.6.11
```

gemsetを作っている人は、新しく作成することも忘れずにね！！
zshプロンプト設定

# .zshrc
```lang:~/.zshrc
local BLACK=$'%{\e[30m%}'
local RED=$'%{\e[31m%}'
local GREEN=$'%{\e[32m%}'
local YELLOW=$'%{\e[33m%}'
local BLUE=$'%{\e[34m%}'
local PURPLE=$'%{\e[35m%}'
local CYAN=$'%{\e[36m%}'
local WHITE=$'%{\e[1;37m%}'
local DEFAULT=$'%{\e[1;m%}'
local RAINBOW=$'%{\e[$[color=$[31+$RANDOM%6]]m%}'
PROMPT="${WHITE}%D{%Y-%m-%d %H:%M:%S} %n${RAINBOW}@%M${WHITE}:%/${reset_color}
"
setopt prompt_subst
```

# Screenshot
![Screenshot 2014-06-20 19.53.34.png](https://qiita-image-store.s3.amazonaws.com/0/8352/de182f5b-457e-f148-de44-ce4cf4d96f04.png)

# Desc
- プロンプトに改行をいれて、実行コマンドが必ず左端にくるようにしています。見返すときに基本左端だけ見れば良いので目線移動がなくて楽。
- datetime, user@host:pathをいれて、エビデンス的に使えるようにしてる。
- ユーザ名、ホスト、パスの部分はそのままscpコマンドなどに使える形式にしてる。
- ([Starship](https://starship.rs/)も簡単にプロンプトを設定できてオススメです)
Unityで、AndroidとiOSでGuiTextureをマルチタップ対応にしておく(個人的メモ的なアレコレ)

OnMouseDownは基本的にAndroidやiOSで使えない・・・というのでマルチプラットフォームに対応できない・・・ので
その対策です。

C#での実装です。　結構ゴリ押し感あふれるけど、よく使っているのでメモとして残しておきたいので残しておきます。
できれば、ソースの簡易化、その他の方法のご指導、ご鞭撻をしていただけたら幸いです。

基本的にはこの関数をFixedUpdateもしくはUpdateにいれるだけ。

```csharp
/// <summary>
/// Checks the tap.
/// </summary>
bool CheckTap()
{
	// タッチが1つ以上のとき
	if( 0 < Input.touchCount)
	{
		// タッチされている回数分ループ
		for(int i = 0; i < Input.touchCount; ++i)
		{
			// タッチ情報をコピー
			Touch t = Input.GetTouch(i);
			// タッチし始めかどうか（ここを後述で変更できます）
			if(t.phase == TouchPhase.Began )
			{
				// HitTestでタッチした場所が重なっているかのチェック
				if(this.gameObject.guiTexture.HitTest(t.position))
				{
					return true;     					
				}
			}
		}
	}

	return false;
}
```

タッチしはじめかどうかの部分に関してですが、変更が出来ます。用途に合わせて書き換えるといいかもしれません。
めんどくさかったら関数増やしちゃいましょう。
TouchPhase.Began：タッチ開始
TouchPhase.Moved：移動した
TouchPhase.Stationary：タッチはしているが移動はしていない
TouchPhase.Ended：タッチが終わった
TouchPhase.Canceled：システム的にタッチをキャンセル。Ended同様、タッチの終了を表す

結構突発的に作ってあり、毎回HitTestのところで処理を入れていたのですが、ゲームジャムのときに毎回昔のソースから引っ張り出すのめんどくさいのでおいておきます。 もうちょっときれいにならんかなぁ・・・。
gitリポジトリに混入したCRLF改行ファイルをLFへ変更する方法

gitリポジトリに間違ってCRLFのファイルを入れてしまった場合の対処方法。
さきに書いておくとすでにコミットしてしまった歴史は書き換えません。

### 手順

```bash
$ git ls-files | xargs file
.gitignore:         ASCII text
.kitchen.yml:       ASCII text
Berksfile:          ASCII text
Berksfile.lock:     ASCII text
CHANGELOG.md:       ASCII text, with CRLF line terminators
README.md:          HTML document, ASCII text, with CRLF line terminators
metadata.rb:        ASCII text, with CRLF line terminators
recipes/default.rb: UTF-8 Unicode text, with CRLF line terminators
$ nkf -Lu --overwrite CHANGELOG.md README.md metadata.rb recipes/default.rb
```

xargsでfileコマンドに渡すのがポイント。
頑張ればnkfコマンドへ渡すファイル名も自動化できそうだけども、本当に変更していいかファイル名を見ながら確認してるので一旦この形で。
Install pgcli at FreeBSD without root

# What is pgcli?
http://pgcli.com/
Pgcli is a command line interface for Postgres with auto-completion and syntax highlighting.

# Python
```
python --version
Python 2.7.3
```

# Install pip --user
```
wget 'https://bootstrap.pypa.io/get-pip.py'
python get-pip.py --user
```

# Setup
```
export PATH="$HOME/.local/bin:$PATH"
```

# Install pgcli --user
```
pip install --user pgcli
```

# Run
```
pgcli --help
Usage: pgcli [OPTIONS] [DATABASE] [USERNAME]

Options:
  -h, --host TEXT     Host address of the postgres database.
  -p, --port INTEGER  Port number at which the postgres instance is listening.
  -U, --user TEXT     User name to connect to the postgres database.
  -W, --password      Force password prompt.
  -w, --no-password   Never prompt for password.
  -d, --dbname TEXT   database name to connect to.
  --help              Show this message and exit.
```


# Update
```
pip install --user --upgrade pgcli
```
golangでデストラクタ的なことをする

golangはstructにデストラクタ的なものを定義することは出来ないが、インスタンスがGCに拾われる時に任意の処理をさせることはできる。

# 具体的方法
runtimeパッケージのSetFinalizer()でfinalizer関数を設定できる。いわゆるデストラクタのようにstructの宣言に付けられるわけではなくて、インスタンスごとに設定しなければならない。
＃ なのでデストラクタではない

* runtime#SetFinalizer
    * http://golang.org/pkg/runtime/#SetFinalizer

createInstance()でfinalizer関数を設定している。runtime.SetFinalizerには対象のインスタンスの参照とfinalizerとして設定する関数を渡す。

```go:partial
func finalizer(m *string) {
        fmt.Println("finalize for ->", *m)
        return
}

func createInstance() {
        x := "hello"
        runtime.SetFinalizer(&x, finalizer)
        return
}

func main() {
        createInstance()
        runtime.GC()
        time.Sleep(1 * time.Second)
        return
}
```

```shell-session:output
finalize for -> hello
```

finalizer関数は新しく立ち上げられたgoroutineで実行される。(このgoroutineが実行される時間をsleepで稼いでる)
finalizer()で出力させている文字列が出ていて、GCで回収されたタイミングで実行されていることが判る。

# 注意点
 * SetFinalizerを使用したインスタンスは、Finalizerが動作したタイミングではGCに回収されない。次回のGCで回収される。
 * finalizer関数は必ず実行されるわけではない。つまり、GCに回収されないケース(プロセスが終了する・GCが止まっている)は漏れる。
   * deferであれば確実に実行される

# 用途
あんまり綺麗じゃないし確実でもないので、積極的には使わないほうがいいような気がする。
個人的には、型じゃなくてインスタンスによって重要な動作が変わるのが、ヒジョーに気持ち悪い。
＃ 美観の問題かもだけど、deferで間に合うように書いたほうが読みやすい

とはいえcgoでc言語の関数をラップするとかの時とか、まぁどうしようもない事が時々ある。そんなときにだけ使いたい。
Web API The Good Partsまとめ


参考になった点のまとめです。

## HATEOAS

>HATEOAS(hypermedia as the engine of application state)はAPIの返すデータの中に、次に行う行動、取得するデータ等のURIをリンクとして含めることで、そのデータを見れば次にどのエンドポイントにアクセスをすればよいかわかるような設計

例えば、

```timeline.json
"link" : {
	"url" : "http://nexturl",
	"rel" : "next"
}
```

という風にAPIでクライアントの行動を制御する設計方針のことです。

### メリット
* クライアントがあらかじめURIを知る必要が無いためサーバサイドで制御できる。
* URIをhackableにしなくてもよくなる。＞アクセス先を人間が見ても理解できなくすることで、セキュリティを高める

特定のクライアントのみで使われるAPIでは採用も考えれるかと思います。


## HTTPメソッドを使った設計
下記、HTTPメソッドを正しく使ってAPIを設計するのがよいです。

* GET (READ)
* POST (CREATE)
* PUT (UPDATE)
* PATCH (UPDATE)
* DELETE (DELETE)

### PUT/PATCHの使い分け

PUTはコンテンツ全体の更新に用います。それに対してPATCHはコンテンツ一部の更新に用います。


## ステータスコードでエラーを表現する

| ステータスコード	| 意味 	|
|:---------------	|------	|
|100番台		  	|情報		|
|200番台		  	|成功		|
|300番台		  	|リダイレクト		|
|400番台		  	|クライアントサイドに起因するエラー|
|500番台		  	|サーバサイドに起因するエラー|

エラーの場合は単にエラー情報をレスポンスボディの返すだけでなく、
クライアントからのリクエストが成功した場合のみ200番台を返す必要があります。
また、できるだけ下記ステータスコードの意味に近づけるように結果を返すようにします。

|ステータスコード | 名前 | 意味 |
|:-------------|-----|------|
|200|ok|リクエストは成功した|
|201|Created|リクエストが成功し、新しいリソースが作られた|
|202|Accepted|リクエストは成功した|
|204|No Content|コンテンツなし|
|300|Multiple Choices|複数のリソースが存在する|
|301|Moved Permanently|リソースは恒久的に移動した|
|302|Found|リクエストしたリソースは一時的に移動している|
|303|See Other|他を参照|
|304|Not Modified|前回から更新されていない|
|307|Temporary Redirect|リクエスしたリソースは一時的に移動している|
|400|Bad Request|リクエストが正しくない|
|401|Unauthorized|承認が必要|
|403|Forbidden|アクセスが禁止されている|
|404|Not Found|指定したリソースが見つからない|
|405|Method Not Allowed|指定されたメソッドは使うことが出来ない|
|406|Not Acceptable|Accept関連のヘッダに受理できない内容が含まれている|
|408|Request Timeout|リクエストが時間以内に完了しなかった|
|409|Conflict|リソースが矛盾した|
|410|Gone|指定したリソースは消滅した|
|413|Request Entity Too Large|リクエストボディが大きすぎる|
|414|Reqeust-URI Too Long|リクエストされたURIが長すぎる|
|415|Unsupported Media Type|サポートしていないメディアタイプが指定された|
|429|Too Many Requests|リクエスト回数が多すぎる|
|500|Internal Server Error|サーバ側でエラーが発生した|
|503|Service Unavailable|サーバが一時的に停止している|

## バージョン情報をURIに加える

```
http://api.yayoc.com/v1/friends
```

みたいな感じでバージョン情報はURIに加えたほうがよいです。


## エンドポイントはひと目で理解できるように

### 複数形を用いる

複数形、単数形が混在すると煩雑になってしまい、混乱するので複数形を用いるほうがベターです。ただし、単語によっては単数形と複数形が同語の場合もあるため、考慮する必要があります。

よくない例) 	api.yayoc.com/v1/friend/1
よい例) 	api.yayoc.com/v1/friends/1

### 極力動詞は使わない

REST APIの基本はエンドポイントに動詞を使わず名詞のみで表したほうがシンプルになり理解しやすいです。

よくない例) api.yayoc.com/v1/get/friends/
よい例) api.yayoc.com/v1/friends/


### 英単語の選定は慎重に

英語がネイティブでない場合、適切な単語を選ぶのは難しいです。
[ProgrammableWeb](http://www.programmableweb.com/)等を利用して適切な単語を選定しましょう。

## まとめ

RESTfulなAPIを設計するためにはひとまず、
* HTTPの仕様の理解
* 理解しやすいエンドポイントの設定

が大事かなと思います。
既に、公開されているAPI(先人の知恵)を参考にシンプルに互換性のある設計を心がけていきたいです。
aws cli run-instancesで起動時にタグをつける方法

結論からいうとできない。

起動後にタグをつけるしかない。

# 稼働中のインスタンスにタグをつける方法

目的のインスタンスのInstanceIdを確認してから、下記のようにする。

```
aws ec2 create-tags --resources i-abc1234 --tags Key=Name,Value=foo
```
moodleでアクセスURLを変更する（場合によってはちょっと良い）方法

　dockerコンテナでmoodleサイトを作ったのは良いが、最終的なURLが決まらない、もしくは、運用途中でURLが変わってしまう、みたいなケースが今後増えると思う。可搬性が上がると、まあ、そうなるよね。
　その一方で、CMSにありがちなのが、ドメイン名が設定項目になってるというやつ。デフォルトはWebサーバからもらって、事情で固定設定したい時だけで良いだろうと思うのだけど、なぜか設定必須だったりして萎える。
　moodleもそう。しかもconfig.phpを書き直せって。で

```php:config.php
$CFG->wwwroot   = "http://".$_SERVER["SERVER_NAME"];
```

って書いてやった。後悔はしていない。もうこれでこの設定ファイルを書き換えることはないだろう。仮想ホストやリバースプロクシを使って、決まった名前でしかアクセスが来ない環境であれば、CMSのレベルで名前を気にする必要はないだろうし。
GHQとpecoでリポジトリ移動で楽する人様の設定を少しだけいぢって自分用にした


http://qiita.com/strsk/items/9151cef7e68f0746820d
こちらを参考にさせていただいた。

あとは変更したfunctionを一応残しておく。

```
function peco-src () {
  local selected_dir=$(ghq list | peco --query "$LBUFFER")
  if [ -n "$selected_dir" ]; then
      BUFFER="ghq look ${selected_dir}"
      zle accept-line
  fi
  zle clear-screen
}
zle -N peco-src
bindkey '^]' peco-src
```

pecoとの組み合わせをモタモタしていたんだけど、いい加減面倒になってきたのでこちらを参考に設定して幸せになれた。
感謝。
Excel クイックアクセスツールバーの移行小ネタ

大したネタじゃないけど、一応備忘録として。

仕事柄、複数の端末やら持ち歩きノートPCで作業をするため
Excelの設定がまちまちになってしまう。
一番困るのがクイックアクセスツールバーのカスタマイズ。

2007から機能がタブ化されたので、アイコンがゴチャゴチャしなくなった反面
使いたい機能まで掘り進む手間が増えてしまった。

個人的にマストな機能は
・オブジェクトの選択
・グリッドに合わせる
・グループ化、そして解除
・読み取り専用の設定/解除
あたり。

ちょっと調べたら結構簡単にインポートエクスポートできた。

#手順

まずは移行元となるExcelからユーザ設定を取得。

①以下の画面を表示
ファイルタブ→オプション→クイックアクセスツールバー
![exceloption1.png](https://qiita-image-store.s3.amazonaws.com/0/55326/cd280380-fd7d-c2bd-6b8c-73ba0ab72bb3.png)

②次に画面右下のインポート/エクスポートから
「すべてのユーザー設定をエクスポート」を選択
![select.png](https://qiita-image-store.s3.amazonaws.com/0/55326/868adb91-b979-30de-b4ea-bca8e9e522dd.png)

③ダイアログが表示されて
「Excel Customizations.exportedUI」なるファイルを吐き出すので
適当に保存
![exceloption3.png](https://qiita-image-store.s3.amazonaws.com/0/55326/45037d9a-ad28-e48f-6cb8-54368bb63bfc.png)

④移行先のExcelを開いて①と同様の手順で画面を表示し
上記②と同様の操作から、今度は「ユーザー設定ファイル」をインポート

![exceloption4.jpg](https://qiita-image-store.s3.amazonaws.com/0/55326/7e7456ff-78da-d417-304d-204c6f6cd2cc.jpeg)

うまく行ったね！
Qiita:TeamのメンバーのQiita IDを取得する

[Qiita Organization](http://blog.qiita.com/post/46921129641/qiita-organization) の申請に登録メンバーをカンマ区切りのテキストで渡す必要があった。

```:js
// https://*.qiita.com/
var links = document.querySelectorAll(".teamMemberWidget ul a");
var urls = _.map(links, function(a){
        return a.href
});
var users = _.map(urls, function (url) {
  return url.replace(/https:\/\/.+.qiita.com\//, "");
});

alert(users.join(","));
```
Running 'compile' for libxml2 2.9.2... ERROR 。。。nokogiriのアップデートでハマる

Rails 3.2.18
OS X Yosemite 10.10.1

久しぶりにbundle updateしたら見事にnokogiriのコンパイルでこけました

ローカルがOS Xなので

`brew doctor`

したところ何やらupdateしろと言われたので

`brew update`

するもPermission deniedされたので

`sudo brew update`

*Aborting...!!!*

これはbrewのあかんやつや。このままでは１日棒に振りそうなので
brewはほっとくとして


`gem install nokogiri -v '1.6.5'`

でひっかかるlibxml2のバージョンが2.9.2なので、2.9.1だったローカルを個別アップデートすればいいかも？

`brew upgrade libxml2`

よしこれでどうだ！とnokogiriに挑むも状況変わらず、まんまエラーメッセージでググったらありました

http://qiita.com/maangie/items/5f6a7885ec977e35552d

こちらに書かれている方法で解決しました。ありがとうございます

`NOKOGIRI_USE_SYSTEM_LIBRARIES=1 bundle update`

brew update問題は以下にありました。ありがとうございます

http://qiita.com/sue738/items/7ab03ecc9f6fcf37408d
PrologなNoSQLサーバを立てる

## はじめに
なんの需要があるかわかりませんが，あるとき突然，Prologサーバを立てたくなる時があります．例えば，サーバ側では，大量の述語をデータベース代わりに持っていて，TCP通信でクエリを投げてその結果を得ることができたらな，と思うわけです．

データとして以下の述語を与えます．

```prolog
tag_name(oppai).
tag_name(bikini).

picture(aaa).
picture(bbb).
picture(ccc).

tag(X, Y) :- tag_name(X), picture(Y).

tag(oppai, aaa).
tag(oppai, bbb).
tag(oppai, ccc).
tag(bikini, bbb).
tag(bikini, ccc).
```

tagの第一引数はタグの名前で，第二引数は画像の名前です．特定のタグの付けられた画像を検索する場合，以下の述語で推定することができます．

```prolog
tag(bikini, X).
% X = tag(bikini, bbb);
% X = tag(bikini, ccc);
```

速度的に何千万件のデータを扱うのは難しいかもしれませんが，NoSQLの試みとして面白いなと思ったわけです．

## サーバ側の実装
サーバ側で起動しておくPrologのソースコードです．

```prolog
create_server(Port) :-
    tcp_socket(Socket),
    tcp_bind(Socket, Port),
    tcp_listen(Socket, 5),
    tcp_open_socket(Socket, AcceptFd, _),
    dispatch(AcceptFd).

dispatch(AcceptFd) :-
    tcp_accept(AcceptFd, Socket, _Peer),
    thread_create(process_client(Socket, Peer), _,
		[ detached(true)
		]),
    dispatch(AcceptFd).

process_client(Socket, Peer) :-
    setup_call_cleanup(tcp_open_socket(Socket, In, Out),
       handle_service(In, Out),
       close_connection(In, Out)).

close_connection(In, Out) :-
    close(In, [force(true)]),
    close(Out, [force(true)]).

handle_service(In, Out) :-
	read(In, Chars),
	findall(Chars, Chars, L),
	write(Out, L),
	writeln(L).

% 以下，データベース用の述語を定義する
```

Prologのコンソールから，以下のコードを実行すると，ポート3333でListenします．

```prolog
create_server(3333).
```

## クライアント側の実装
クライアント側はTCP通信でポートを指定して接続します．ここではRubyですが，他の言語については頑張って実装してください．

```rb
require "socket"

while gets
  s = TCPSocket.open("localhost", 3333)
  s.write($_)
  puts s.gets
  s.close
end
```

このソースコードを実行すると，TCPソケットを開いてユーザからの入力を待ちます．Prologの述語を書くと，localhostで実行しているPrologサーバに述語を送信し，その内容を推定し，結果を返します．

```
tag(X,Y).
[tag(oppai,a),tag(oppai,b),tag(oppai,c),tag(bikini,b),tag(bikini,c)]
```

## Prologの将来
Prologの推定は，他のRDBMSやNoSQLにはない機能です．似たような処理は確かに他でも書くことは可能ですが，Prologほど簡潔には書けません．例えば，SQLであれば以下の様なクエリになると思います．

```sql
select picture.name from picture, tag where tag.picture_id = picture.id;
```

Prologと比べるといかに冗長であるということがわかると思います．

また，先のデータベース用の述語では，tag_nameとpictureを定義していましたが，別にきちんとスキーマが決まっていれば，この2種類の述語は必要ありません．その点で，NoSQL並みの柔軟さがあり，（使い方さえわかれば）簡潔なクエリを投げることが出来ます．

あとはほぼ速度やアーキテクチャの問題なので，いつかPrologがNoSQLで脚光を浴びるんじゃないかなぁとか思うのですがどうでしょう？　Prologプログラミング自体は悟りが必要なので難しいかもしれませんが，シンプルな方法であれば十分に使用に耐えられると思います．
Voltを使った簡単なアプリケーションの紹介


少し前のものですが、Ruby のリアクティブ Web フレームワーク Volt を使って簡単なアプリケーションを作ったので紹介します。
人の名前とかを登録しておいて、その中からランダムにピックアップするくじ引きツールのようなものです。

http://lightning-picker.nilsteps.com/

ソースコードはこちらです。

https://github.com/5t111111/lightning-picker/

ほんのちょっとだけ jQuery (opal-jquery) を使ってしまいましたが、ほぼ Volt の機能だけです。単純なモデルしか使っていないので、チュートリアルと同様に、モデル定義はせず、暗黙的にオブジェクトを MongoDB に永続化しています。


Volt は WebSocket を使って、フロントエンドの DOM とバックエンドのモデルをリアルタイムに結びつけています。つまり、たとえば誰かが自分のクライアント上で対象者の登録を行なった場合、他の接続中の人のクライアント上でも即座にその操作が反映されます。試してみたければ、別のブラウザやスマホなど別の端末から同時に接続して操作してみれば、すぐにその結果を見ることができるでしょう。

このリアルタイム性を利用して、例えばカンファレンスなどのくじ引きを行うその場で、対象者に各自それぞれ自分を登録してもらって、実際にくじ引きをするのはスクリーンに写した端末から、とかの利用を想定しています。ただ、現状では誰でもどこからでも操作できてしまうので、実際に使うにはちょっとイマイチですね。
Ransack Hacks !!

https://github.com/activerecord-hackery/ransack

検索用のGem。**ソート機能**(!)もあります。

http://qiita.com/nysalor/items/9a95d91f2b97a08b96b0
http://qiita.com/LuckOfWise/items/e020e896e71d47d0c6a4

まだまだ国内での情報少なそう(あまり使っている人がいない・・・？)ので、色々使っている過程で気付いた事をメモ。

# 簡単な使い方 (要約)

コントローラで、

`ModelName.all` または `ModelName.where(huga: :hoge)` 等している箇所を

`ModelName.search(params[:q]).result`、 `ModelName.where(huga: :hoge).search(params[:q]).result` のようにすると使えるようです。

検索フォームのために `.search` の結果の状態が必要みたいなので、

```ruby
def index
  @search = ModelName.search(params[:q])
  @results = @q.result
end
```

のようにインスタンス変数に突っ込んでおくのが通例のようですね (ワンライナー的には `@results = (@search = Hoge.search(params[:q]).result` とかでもアリかも。キモいかな・・・？)

# sort_link 周り

ちなみに sort_link は `search_form_for` 等を使用していなくとも、 `Huga.search(params[:q])` さえしていれば、使える模様です。

### joinしたテーブルのカラムに対してのsort_link

`hoges` テーブルの `huga` カラムに対して `sort_link` したいとして、

`.includes(:hoge)` して

```rb
= sort_link @q, "hoges.huga"
```

とかやってみましたが、駄目でした・・・

https://github.com/activerecord-hackery/ransack/issues/13#issuecomment-3889541

これによると、以下のようにするといいみたいですね。

```rb
= sort_link @q, :hoge_huga
```

`hoge` の部分はアソシエーション名になる模様。

アンダーバー区切りで書けば勝手に判断してくれる模様。素晴らしきかな !

---

随時気付いた部分があれば、追記していこうと思います。 (大きなものに関しては、別エントリにしていきます)
[Swift]カスタムクラスの配列の中からプロパティの最大値/最小値を求めるサンプルコード


簡単に出来るようになっているかと思ったら、そうでもなかったので残しておきます。

* Xcode 6.1.1

```swift:Playground
import UIKit

// カスタムクラス
class Person {
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    var name = ""
    var age = 0
}

// サンプルデータ
let array = [Person(name: "AAA", age: 12), Person(name: "BBB", age: 6), Person(name: "CCC", age: 50), Person(name: "DDD", age: 55), Person(name: "EEE", age: 20)]

// サンプルデータ内の最大年齢を求める
let maxAge = array.reduce(array[0].age, combine: { max($0, $1.age) })
println(maxAge) // 55

// サンプルデータ内の最小年齢を求める
let minAge = array.reduce(array[0].age, combine: { min($0, $1.age) })
println(minAge) // 6

// サンプルデータ内の最大年齢のPersonを得る
let maxAgePerson = array.reduce(array[0], { $0.age < $1.age ? $1 : $0 })
println((maxAgePerson.name, maxAgePerson.age)) // "(DDD, 55)"
```

配列が空っぽだとたぶんクラッシュするので気をつけてください。

参考：
http://stackoverflow.com/questions/24036514/correct-way-to-find-max-in-an-array-in-swift

## おまけ1

ただの整数などの配列なら、`maxElement`や`minElement`が使えます。

```swift:Playground
import UIKit

let array = [5, 1, 7, 9, 10]

minElement(array) // 1
maxElement(array) // 10
```

これに引数で比較関数が渡せるようになっていればカスタムクラスでも使えたんでしょうね。
（カスタムクラス同士の比較演算子を実装すればカスタムクラスでも使えると思いますが、場合分けができなくなってしまうのであまり良い手とは言えないかなと。）

## おまけ2 (2015/01/11 更新)

一応汎用関数っぽいものも作ってみました。
`reduce`を使っても良かったのですが、少しでも無駄を抑えるのならばこんな感じになるのではないかと思われます。

```swift:Playground
extension Array {
    
    func maxElementOrNil<T2: Comparable>(#property: (T) -> T2) -> T? {
        if isEmpty {
            return nil
        }
        var maxIndex = 0
        var maxProp = property(self[0])
        for i in 1..<array.count {
            let testProp = property(self[i])
            if maxProp < testProp {
                maxIndex = i
                maxProp = testProp
            }
        }
        return self[maxIndex]
    }
    
    func minElementOrNil<T2: Comparable>(#property: (T) -> T2) -> T? {
        if isEmpty {
            return nil
        }
        var minIndex = 0
        var minProp = property(self[0])
        for i in 1..<array.count {
            let testProp = property(self[i])
            if minProp > testProp {
                minIndex = i
                minProp = testProp
            }
        }
        return self[minIndex]
    }
}

let maxPerson = array.maxElementOrNil(property: { $0.age })
println(maxPerson?.age) // Optional(55)

let minPerson = array.minElementOrNil(property: { $0.age })
println(minPerson?.age) // Optional(6)
```
Xamarin.Mac+MvvmCrossでアプリ開発を始める準備の準備（2015年1月版）

##Problem
Xamarin.Mac環境ではMvvmCrossのNuGetによる追加はできません。できるようになる見込みもありません（GitHubで何度かIssueになっています）。NuGetの仕様上致し方ないことです。

現状MvvmCrossを使うにはGitHubから最新のものを引っ張ってビルドすることとなります。
##Limitation
今のところ動作を確認できたのはClassicAPIプロジェクトのみです。
Debugビルドではなぜかうまくデータバインディングが働かないようです。Releaseビルドでは正常に動作しています。
##Build
では[GitHub](https://github.com/MvvmCross/MvvmCross)からクローンしましょう。サブモジュールにするのもよいかと思います。
`3.5`ブランチをチェックアウトします。
![35.png](https://qiita-image-store.s3.amazonaws.com/0/34563/0597e1ff-481a-4646-5b07-faafe9467d86.png "35.png")
使うソリューションは`MvvmCross_All_Incl_Mac.sln`ですが，このまま開いても`XamMac`ライブラリへの参照を解決できないため，csprojファイルを手で修正していきます。修正するのは下記のプロジェクトです。

* Cirrious/Cirrious.MvvmCross.Binding.XamMac/Cirrious.MvvmCross.Binding.XamMac.csproj
* Cirrious/Cirrious.MvvmCross.XamMac/Cirrious.MvvmCross.XamMac.csproj
* CrossCore/Cirrious.CrossCore.XamMac/Cirrious.CrossCore.XamMac.csproj

修正箇所はどのプロジェクトも同じで，`ProjectTypeGuids`要素の追加と `XamMac`要素の修正です。

```xml:7行目付近
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectTypeGuids>{42C0BBD9-55CE-4FC1-8D90-A7348ABAFB23};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <ProjectGuid>{8C1700FB-DB8C-45F1-8888-CD4E32A7C39E}</ProjectGuid>
    <OutputType>Library</OutputType>
```

```xml:36行目付近
-    <Reference Include="XamMac, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065, processorArchitecture=MSIL" />
+    <Reference Include="XamMac" />
```

この`ProjectTypeGuids`要素の値が，Xamarin.Macターゲットのプロジェクトである識別値なので，これでXamMacライブラリの参照を解決できるようになります。

修正が完了したらソリューションを開いて下記のプロジェクトをビルドします or 自分のプロジェクトに追加します。

* CrossCore/Cirrious.CrossCore
* CrossCore/Cirrious.CrossCore.XamMac
* MvvmCross/XamMac/Cirrious.MvvmCross.Binding.XamMac
* MvvmCross/XamMac/Cirrious.MvvmCross.XamMac
* MvvmCross/Cirrious.MvvmCross
* MvvmCross/Cirrious.MvvmCross.Binding
* MvvmCross/Cirrious.MvvmCross.Localization
* PortableSupport/Mac/System.Windows.Mac

##Conclusion
これでさしあたり，MvvmCrossのライブラリをXamarin.Macプロジェクトに追加することができるようになります。
Coreプロジェクトの追加から先については，[Using MvvmCross in Xamarin.Mac](http://qiita.com/ailen0ada/items/b201128676afdbaa9c86)で解説していますので参考になさってください。
Swiftでデバイスの向き(orientation)を強制的に設定する

対象となるViewControllerに対して下記を設定します。

Portraitの例

```swift
    //サポートするデバイスの向きを指定する
    override func supportedInterfaceOrientations() -> Int {
        return Int(UIInterfaceOrientationMask.Portrait.rawValue)
    }
    //指定方向に自動的に変更するか？
    override func shouldAutorotate() -> Bool{
        return true
    }
```
zabbixで特定時間帯のトリガーを無効にする

#問題
バックアップやバッチの処理中にどうしてもアラートが通知してしまう場合、処理の時間帯だけロードアベレージなどのアラートを停止したいということがあると思います。ホストの「メンテナンス」やアイテムの「例外の更新間隔」を使ってもいいのですが、その場合はすべてのトリガーが対象になったり、該当時間のデータが取得できなかったりするので、データを取得した上で特定のトリガーだけを停止したいという場合にはうまく設定できませんでした。


#解決
そこでtime関数を使うと時間をトリガーの発動条件に用いることができました。

```
({HOSTNAME:system.cpu.load[percpu,avg1].min(#10)}>1) and 
(({HOSTNAME:system.cpu.load[percpu,avg1].time(0)}<040000) or 
({HOSTNAME:system.cpu.load[percpu,avg1].time(0)}>050000))
```

(トリガーの条件) and ( (４時より前) or (５時より後) )
というトリガーになるので、４時から５時の間にはトリガーは発動しません。

ちなみに以下の書き方でも大丈夫でした！

```
{HOSTNAME:system.cpu.load[percpu,avg1].min(#10)}>1 and 
({HOSTNAME:system.cpu.load[percpu,avg1].time(0)}<040000 and 
{HOSTNAME:system.cpu.load[percpu,avg1].time(0)}>050000)=0
```

(トリガーの条件) and ( (４時より後) and (５時より前)　= 0 )
で、0とすることで条件が否定されます。

どちらでもわかりやすい方を使うといいと思います。

#注意
zabbix2.4以降では、条件判定の文字列が「&」や「|」から「and」や「or」に変更になっていますのでご注意ください！（<-もちろんこれで数時間はまりました...）

#参考
http://www.zabbix.jp/node/2582
http://d.hatena.ne.jp/rougeref/20140414
http://blog.serverworks.co.jp/tech/2014/09/12/zabbix2-4-0release/
django 1.7 registration ユーザ登録でメール送信


django1.6から？は
django-registration-reduxになったらしい。
※以前は、django-registrationを使用していた

<br />
知らずに、django-registrationを使用すると下記のようなエラーが表示された。

```
SMTPAuthenticationError: (534, '5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlb\n5.7.14 xc8vV193CCr6XSVjHuxsUWPNAcxt3rOwtNfmGLT_LGlB2L_7gMSRq2sy48-S2ufhl34kWK\n5.7.14 t3qEMEtwhySSo_39MG68Th1EWbzko9PLMlvs5o7PHXRrbZPJJtF2oH_5koHZSMe2MkKLt6\n5.7.14 2pZRuGB0Kbi2xz0CvGkln7b0AR4ohN-EZ8vreSpugB6S9UCVpW7NVJp4RX7Bnf9HjHIK-x\n5.7.14 Ckf1GTw> Please log in via your web browser and then try again.\n5.7.14 Learn more at\n5.7.14 https://support.google.com/mail/bin/answer.py?answer=78754 i11sm520194pbq.23 - gsmtp')
```


上記を使用するとエラーは表示されなくなったが、

```
(534, '5.7.9 Application-specific password required. Learn more at\n5.7.9 http://support.google.com/accounts/bin/answer.py?answer=185833 gs2sm507060pbc.68 - gsmtp')
```


とエラー。
<br/>
送信に使用していたgmailのアカウントで、
２段階認証を有効にすることで、無事送信。
※gmailの設定ではなく、アカウントの設定
https://myaccount.google.com/u/1/?pli=1
IISExpressのapplicationhost.configが毎回置き換わる事例

Visual Studio 2013 Pro で開発しているが、当初Windows認証だったものを、匿名認証に変更した。
その後、Visual Studioを再起動すると、元のWindows認証がそのまま残っており、Visual Studio再起動するたびに、IISExpressのapplicationhost.configを書き直していた。
書き直さないと、エラーになる。
偶然、applicationhost.config の定義を間違えエラーにしたところ、Visual Studio起動時にエラーなった。applicationhost.config はプロジェクトファイルを見ているのではないかとプロジェクトファイルのソースを見たところ「IISExpresAnonymousAuthentication」「IISExpresWindowsAuthentication」というタグを見つけ、「IISExpresAnonymousAuthentication」をenableに「IISExpresWindowsAuthentication」をdisableに変更することで、applicationhost.config の定義が置き換わらなくなった。
Windows Serverで複数のNTPサーバと時刻同期を行う

#Windows Serverで複数のNTPサーバと時刻同期を行う#

時間って難しいですね。おそらく同僚たちから、テメーは一番時間ダメじゃんｗｗｗって言われそうな私ですが・・・
そう、時間は大事、サーバも時刻同期は大事です。そもそもこれがしっかりしていないとログでもなんでも嘘を吐きます。

さて、ActiveDirectoryのドメインに参加すれば、ADがNTPサーバとして設定されるのですが、そもそも単独の場合、ましてやADドメインコントローラーの場合にNTPってどうするのでしょうか？ってのが今回のお題。

まさか、**time.windows.comのままにとかしているダサい人**はもちろん居ませんよね？

![](http://quickpress.blob.core.windows.net/kzmx/2015/01/WindowsServerNTP.png)

**Windows ServerはNTPサーバは一つしか設定できない**とか、変な事をいう人とかいますね。
確かに、GUIでは一つしか設定できませんね。
複数のNTPサーバと同期するにはどうしたらよいのでしょうか？答えは以下の通りです。今回は偶然AWS EC2で作業していましたので、amazon管轄のNTP Poolで設定しています。

## 複数のNTPサーバと同期 ##

	w32tm /config /syncfromflags:manual /manualpeerlist:"0.amazon.pool.ntp.org 1.amazon.pool.ntp.org 2.amazon.pool.ntp.org 3.amazon.pool.ntp.org",0x8 /update /reliable:yes

## 同期の確認 ##
	w32tm /resync
centosにrubyを使わずにchefをインストールする

# 概要
chefをちょっと試したかったんだけど、vagrantのまっさらなインスタンスにいれようとしたとき、大抵のインストール記事はrubyをインストールしてからのgem経由だったんだけど、rubyをインストールするのが面倒くさいし、そもそもrubyのセットアップレシピを書きたかったので、rubyなしでインストールする方法を書いておく

#やり方
環境はvagrant上のcentos6.4。まず、下記からchef development kitをダウンロードしてrpmインストール。
[Chef Development Kit | Chef Downloads | Chef](https://downloads.chef.io/chef-dk/redhat/#/)

```
# cd /usr/local/src
# wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.3.5-1.x86_64.rpm
# rpm -ivh chefdk-0.3.5-1.x86_64.rpm
warning: chefdk-0.3.5-1.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
Preparing...                ########################################### [100%]
   1:chefdk                 ########################################### [100%]
Thank you for installing Chef Development Kit!
# chef verify
Running verification for component 'berkshelf'
Running verification for component 'test-kitchen'
Running verification for component 'chef-client'
Running verification for component 'chef-dk'
Running verification for component 'chefspec'
................
---------------------------------------------
Verification of component 'berkshelf' succeeded.
Verification of component 'chef-dk' succeeded.
Verification of component 'chefspec' succeeded.
Verification of component 'chef-client' succeeded.
Verification of component 'test-kitchen' succeeded.
```

最終的に`chef verify`で全部suceededになったら成功。

#追記
rubyのpathが以前のものになっていて、chefdkの中のやつではなかったため、以下のページを参考にして修正した。
[opscode/chef-dk](https://github.com/opscode/chef-dk)

```
# which ruby
/usr/bin/ruby
# eval "$(chef shell-init bash)"
# which ruby
/opt/chefdk/embedded/bin/ruby
```
GitHub issue管理サービスの比較

基本的な機能はみんなほぼ同じ。
GitHubのissueをかんばんボードとして表示してくれるサービス。


## [ZenHub.io](https://www.zenhub.io/)

**特徴**

- GitHubサイトに拡張機能として埋め込まれるのでGitHubとの統一感がある
- FileUpload機能を強化してくれる
- +1ボタンが設置可能になる

**価格**

- 個人／非商用／OSSは無料
- Organizations単位での課金
- 1-5users : $25/month
- 6+users  : $5/user/month
- 26+users : $3.75/user/month

## [Codetree](https://codetree.com/)

**特徴**

- この中で一番後発のサービス
- 複数リポジトリのissueをまとめて表示できる
- 専用のシンプルなビュー
- OrganizationsやProjectは独自に作成して、GitHubのリポジトリを紐付けるような使い方

**価格**

- 3users, 15projects : $24/month
- 8users, 40projects : $49/month
- 20users, 100projects : $99/month
- 50users, 250projects : $199/month

## [HuBoard](https://huboard.com/)

**特徴**

- フィルター機能が豊富
- Gitter/Slack/HipChat/Webhook連携が可能
- 専用のビュー

**価格**

- Organization課金 : $24/month
- User課金 : $7/month

##[Waffle.io](https://waffle.io/)

**特徴**

- とにかくシンプル
- 他のサービスに比べると機能は少ない

**価格**

- Privateリポジトリのみ課金 : $7/user/month
- ただし今は上記も無料期間らしい

## まとめ
価格重視なら、Waffle > HuBoard > ZenHub > Codetree という感じ。
触ってみた感触としては、エンジニア寄りな人ならZenHubがいいと思う。GitHubに溶け込んでる感が素晴らしい。
逆に非エンジニアの人はCodetreeのUIが使い易く感じると思った。ただ使うツールが増える感が否めない。それはそれでGitHubを使ってる感じを出さないので、メリットにもなるかもしれないけど。
Switch Roles in the AWS Management Console


AWS Management Console上で、他アカウントのRoleにSwitchできるようになったみたいなので試してみました。

http://aws.amazon.com/releasenotes/4246484738368018
https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-usingrole-switchconsole.html

## サンプルケース
アカウントAのユーザ(名:SwitchUser)が、アカウントBにあるRole(名:SwitchRole)を使って、アカウントBのリソースにアクセスするケースを想定。

## 手順

とっても簡単。

1. アカウントBに、CrossAccountAccess用のRole(名:SwitchRole)を作成する
2. アカウントAのユーザ(名:SwitchUser)に、AssumeRoleの権限を付与する
3. アカウントAのユーザでロール切り替えの設定をする
4. ロールの切り替え

### 1. CrossAccountAccess用のRole(名:SwitchRole)を作成する

Nameを決めて

![1.png](https://qiita-image-store.s3.amazonaws.com/0/18114/3e20489a-f2b0-bbd7-ec05-7c0f53518ad2.png "1.png")


Typeとして、Role for Cross-Account Access を選んで、
Provide access between AWS accounts your own を選択

![2.png](https://qiita-image-store.s3.amazonaws.com/0/18114/d2d93924-c1fc-60c4-b7e5-842f8a11325c.png "2.png")



アクセス元のAWSアカウントID（12桁の数値）を入力します

![3.png](https://qiita-image-store.s3.amazonaws.com/0/18114/e35d5e1e-660a-178d-86b8-35de494eb9a5.png "3.png")


Roleの権限を設定します、今回はCloudWatchLogsのReadOnly権限をつけました。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/18114/6b48a786-1e04-687f-b270-17f3bf211e7b.png "4.png")


最後にレビューして、Role作成です。

Role ARN でモザイクにしている部分にはアカウントBのAWSアカウントID、Trusted Entities でモザイクにしている部分にはアカウントBのAWSアカウントID、link でモザイクにしている部分には、アカウントBのエイリアス名が表示されています。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/18114/2d9a5ca8-88fe-9742-7929-09e498ca04a4.png "5.png")



### 2. アカウントAのユーザ(名:SwitchUser)に、AssumeRoleの権限を付与する

SwitchUser（作成済）にPolicyを設定します。今回はUser Policyに設定しました。
Permissionは、先ほど作ったRoleのリソースに対して、STSのAssumeRoleアクションを許可します。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/18114/c25193c1-39b0-0932-c61c-d77d58ebba33.png "6.png")


### 3. アカウントAのユーザでロール切り替えの設定をする

アカウントAにSwitchUserでログインして、Console右上のメニューからSwitch Roleを選択します。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/18114/cc500ecc-fd89-f75f-ea95-41b87d74cd2b.png "7.png")


すると、ロールの切り替え設定の画面に切り替わります。

![スクリーンショット 2015-01-07 13.25.24.png](https://qiita-image-store.s3.amazonaws.com/0/18114/1739677b-021b-1089-df2f-4cdbc34cd0e5.png "スクリーンショット 2015-01-07 13.25.24.png")

さくっと進んで、アカウントBのアカウント(ここはアカウントIDでもエイリアスでもOKでした)とロール名を設定します。表示名はロール@アカウントで自動補完されます（便利!）。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/18114/3648d778-0ab0-bd2b-16b7-f32ac2029768.png "9.png")

また、RoleのSummaryから確認できる"Give this link to users who can switch roles in the console"のリンクをユーザに渡して、ログインした状態でアクセスしてもらうと、上記の画面に全て情報が入った状態で表示されます。（ロール切り替えの説明画面はスキップされます）

### 4. ロールの切り替え

ロールの切り替えボタンを押すと、アカウントBのRoleに切り替わりました！

画面右上に、先ほど設定したColorでロール＠アカウントが表示されているのでクリックすると、今現在のアクティブアカウントやログイン元アカウントなどの情報が表示されます。

戻るときはBack to SwitchUserから戻れます。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/18114/bda256cf-86dc-cf54-f047-83bbb637edc4.png "10.png")


戻ると、Role Historyが表示されていて、簡単に再度切り替えることができます！

![11.png](https://qiita-image-store.s3.amazonaws.com/0/18114/3bf69784-205f-5e72-2d8b-f2d8808cb832.png "11.png")



## まとめ

簡単に、他のアカウントへのリソースアクセスが可能なので、本番環境のログ閲覧Roleを作って公開するとか、メンテ用Role作って公開するとか、いろいろなケースで活用できそうです。

また、他アカウントだけでなく、自アカウントのRoleへも切り替えることができるので、ひとつのアカウントに環境が混在しており権限を分けたい時など便利に使えそうです。

最近はめっきりcliばっかりでしたが、AWS Management Consoleもどんどん使いやすくなっていい感じですね。
RESTfulAPIとは何か

RESTfulAPIとは（RESTのうちAPI設計時の制約）に従って記述すしたAPI
参）http://e-words.jp/w/REST.html

一言で言えば、WebAPIを設計する際のお作法のひとつ。

詳しくは以下の本で調べた。
~~~~~~~~~~~~~~~~~~~~~~~
Web API Design
WebAPIのベストプラクティス
by apigee
~~~~~~~~~~~~~~~~~~~~~~~
RESTfulAPIを深く考えすぎないで、RESTfulAPIの設計方法の具体例を示す。
「APIを作る時にRESTの原理主義よりも開発者がいかに開発しやすいかが重要」というのが前提。

この本の内容はブログにまとめられている。
参)http://d.hatena.ne.jp/winplus/20120701/1341108824
このブログの簡単なメモ

◎URL
リソースごとに、２つのベースURLをつかう
ベースURLから動詞をとりのぞく
HTTPの動詞をつかって、コレクションと要素とを操作する
名詞は複数形
名詞は抽象的にしすぎない
ベースURLが複雑になる場合はクエリパラメタを使う
バージョンをURLに入れる

例) GET /v2.0/dogs/1234?color=red&state=running

◎ステータスコード
APIの使用プログラムに優しい設計にするためにステータスコードはしっかり記述する。
ステータスコードはOK,NG(サーバ起因)、NG(クライアント起因)のどれかが主。
これ以外は以下のステータスを使えば大体おk。
201 - Created
304 - Not Modified
404 - Not Found
401 - Unauthorized
403 - Forbidden
また、APIの使用プログラムを開発する開発者の為にも、エラーメッセージをつけてやるといい。

◎レスポンス
複数の形式をサポートする。xml,json,..
リソースを返却しない場合のみ動詞を使う
例) /convert?from=EUR&to=CNY&amount=100
Turnipでrequest specやmodel specなどのfeature spec以外のspecを実行する

APIサーバーのテストのためにxhrを使おうとしたら出来なかったので・・・。

以下のようにrails_helper.rbに記述するとmodel specやrequest specとして動作させることができるようです。

```ruby:spec/rails_helper.rb
Turnip.type = :request
```

typeはspec fileの

```ruby
RSpec.describe AnyModel, :type => :model do
  #pending "add some examples to (or delete) #{__FILE__}"
end
```
のtypeと同じものが使えます。