OmniAICreator/Qiita-1.07M huggingface dataset:
一からUnityを触ってみる　第一回

FreeのUnityをダウンロード
http://japan.unity3d.com/unity/download/download-mac

ダウンロード中にUnityのサイトを漁っていたら、
WebPlayerなるものもあるらしい。
てことは、ネイティブベースでブラウザにも対応出来るのかな？？
>Unity Web Player は Unity で制作された 3D コンテンツをブラウザ上で直接プレイすることができる、ブラ>ウザ用のプラグインです。
>AAA クオリティーの高度なグラフィックと臨場感あふれる物理演算、生き生きとしたキャラクターアニメーション>や豊かなサウンドで、かつてないゲーム体験を提供します。
>Unity Web Player は無料でご利用頂けます。
>
>Unity Web Player
>http://japan.unity3d.com/webplayer/

SharderがGUIベースで簡単に実装出来そうだな。
ただ、 *ShaderLab* という言語でラップされているのか。
http://docs-jp.unity3d.com/Documentation/Components/SL-Reference.html

*参考にするサイト*

げーむつくろー
http://marupeke296.com/UNI_main.html
もう少しだけFizzBuzzを

そりゃ職業プログラマはFizzBuzzを5分以内に書けなきゃ大変にまずいだろうが、一般化しようとすると結構難しい（単純に分岐するやり方は使えない）。ついでに`mod`も使わないという方向で書くとこんな感じになるだろうか：

```hs:
module Main where
import Data.List
import System.Environment (getArgs)

asocs = [ (3,"Fizz"), (5,"Buzz"), (7,"Kazz"), (11,"Pozz") ]

mkWords = map (\(n,w) -> (cycle $ (genericTake (n-1) $ repeat [])++[w]))

fizzbuzz n = zipWith compose (map concat $ transpose $ mkWords asocs) [1..n]
   where compose [] n = show n
         compose fbs _ = fbs

main = do
  args <- getArgs
  let n = read $ args !! 0
  mapM_ putStrLn $ fizzbuzz n
```

元々のFizzBuzzは何も考えずにそのまま書くと：

```hs:
module Main where
import System.Environment (getArgs)

fizzbuzz n
  |mod n 3 == 0 && mod n 5 == 0 = "FizzBuzz"
  |mod n 3 == 0 = "Fizz"
  |mod n 5 == 0 = "Buzz"
  |otherwise = show n

main = do
  args <- getArgs
  let n = read $ args !! 0
  mapM_ (putStrLn . fizzbuzz) [1..n]
```

これはghciで確かめながら書いてコンパイルしてバイナリ作るまでにぴったり5分。で、そこから冒頭の一般化したヴァージョンを書き始めて更に20分ちょっとかかった。

そういえば、Project Eulerは100問解いてから飽きて放置しているが、FizzBuzzですら微妙だったりするらしいということなら、Project Eulerの最初の方ですら新人プログラマの選考には難しすぎたりするんだろうか。IT業界と無縁な情弱文系には状況はまったくわからないのだが。
Time の一部を自由自在に改変したい

あの時間に戻れたら…
あの時間に飛ぶことができたら…

そんな願いを叶えてくれる時の魔術師、それが `Time#change` である。


現在時刻が 2014/01/01 00:00:00 だとします。

```rb
now = Time.zone.parse("2014/01/01 00:00:00")
#=> Wed, 01 Jan 2014 00:00:00 JST +09:00

```

2020年に飛びたいな。

```rb
now.change(year: 2020)
#=> Wed, 01 Jan 2020 00:00:00 JST +09:00
now
#=> Wed, 01 Jan 2014 00:00:00 JST +09:00
```

٩( 'ω' )و 飛べた！

しかし、実際には現在の世界線から別の世界線が派生しただけで、
現在は変えられないのです (つまり破壊的メソッドではない) 。

ちなみに、時間を変えることも可能です。

```rb
time.change(hour: 23, min: 59, sec: 59)
#=> Wed, 01 Jan 2014 23:59:59 JST +09:00
```

オプションで指定できるのは、
`:year, :month, :day, :hour, :min, :sec, :usec` だそうです。

マイクロ秒まで操作できるなんて、`Time#change` ちゃんパないの！


+ 参考
http://api.rubyonrails.org/classes/Time.html#method-i-change
[Ruby]基礎から日記。あれはこれだ。

今日は[筑波大学の問題](http://klis.tsukuba.ac.jp/klib/index.php?plugin=attach&refer=KISL%2Ftop&openfile=ruby.pdf "Ruby プログラミング 50 題")の34〜36。それほど難しいことはない。しかし、「def」から始まるのはメソッドだと頭では分かっているが、それがどうなる、というのはまだ身体に馴染んでいない。

[Ruby-35]
>  def max(a, b)
>    if a > b
>　　return a 
>　　else
>　　return b 
>　　end
>  end
>
>  print(max(2, 3), "\n")

これは『はじめてのRuby』P.113とほぼ同じ内容だ。本によるとreturnは省略可能だとか。ずいぶんすかすかになってしまいそうなものです。

明日はいよいよ正規表現！　難しそうだが手を動かすのみであります。
Inverse Kinematicsの実装メモ


前に本を読んで分かった気でいて、改めて見なおしたら「あれ？」ってなったので、メモとして残しておきます。

##ちなみにIKとは
IKとは、人間がとある場所に手を伸ばすときのように手、手首、腕、肩と連動して体を動かすように、連結されたものがとある点に向かうようにする動作を言います。

![cap.png](https://qiita-image-store.s3.amazonaws.com/0/5616/fcbaf499-a2d1-cbf3-e26a-a4b5805faacb.png "cap.png")


[実際の動作サンプルはこちら](http://jsdo.it/edo_m18/c5vn)

動作を見てもらうと分かると思いますが、届かないときは全体が目標に向かって一直線になり、近くにあるときは一番先のオブジェクトがボールに触れる状態になり、以降は自然な感じで折れ曲がっていると思います。

これを計算により算出する、というのがIKです。

##ロジック
実はロジック自体はそれほどむずかしいことをしていません。
まずざっくり言葉だけで説明します。

1. 一番外側のオブジェクトをターゲットの位置に向くように回転させます。
2. 次にオブジェクトをそのターゲットの位置に移動します。
3. 二番目のオブジェクトを、(2)で移動したオブジェクトの反対側の点の位置に向くように回転させます。
4. 以降、つながっているオブジェクトをすべて同様の手順で回転を適用します。
5. 最後まで回転が終わったら、(2)で移動したオブエジェクトを二番目のオブジェクトに連結される位置まで戻します。

この手順を繰り返すことで、サンプルのような動きが実現できる、というわけです。
ただ、一回の計算で決まるわけではなく、いわゆるレンダリングループを繰り返して反復計算をしていくことで、徐々にその位置を補正していく、という手法なので、1フレームだけを抜き出すと個々のオブジェクトがとても変な所にいたりします。（ただ、普通はレンダリングループは非常に早い時間で繰り返されるので見ている方は気づかない）

ポイントとしては最初のオブジェクトを仮に移動してしまう、という点でしょう。
以降はその後ろの点を追うようにそれぞれのオブジェクトを回転させていけば、右とIKの動き、となるわけです。
複数のカレンダーをまとめたカレンダーを作成する

複数人の`GoogleCalendar`から、スケジュールを確認する際に、カレンダーをたくさん追加していると、どうしても利便性が悪くなる。

カレンダーの取得や予定の登録については、`GoogleAppsScript`でいろいろ操作できることが分かったので、出張管理用のカレンダーを作成して、そのカレンダーに複数人のカレンダーから、確認したい"出張"とか特定の予定を登録することで把握しやすくしてみた。

## 作成手順

### 1. まとめる先のカレンダーの作成

マイカレンダーから、カレンダーの作成を行い、作成したカレンダーのカレンダーID(カレンダー設定から確認できる)をメモする。

### 2. 予定登録処理スクリプトの作成

Google Driveのスプレッドシートから、`ツール > スクリプト エディタ`から、編集して、`GoogleAppsScript`を作成する

### 3. カレンダー登録処理の作成

```js

// 登録するカレンダーの指定
var base_calendar_id = 'xxxxxx@group.calendar.google.com';

// 取得対象者のカレンダーの指定
var target_calendar_ids = [
'test1@example.com',
'test2@example.com'
];

function main(){
  var start_date = new Date();
  start_date.setTime(start_date.getTime() - 1*24*60*60*1000);
  var month = 2;
  var end_date = new Date();
  end_date.setTime(end_date.getTime() + month*30*24*60*60*1000);
  var to_cal = CalendarApp.getCalendarById(base_calendar_id);
  var old_events = to_cal.getEvents(start_date, end_date);

  old_events.forEach(function(evt){
    evt.deleteEvent();
  });

  for (var i = 0; i < target_calendar_ids.length; i++) {
    var cal_id = target_calendar_ids[i];
    add_events(to_cal, cal_id, start_date, end_date);
  }
}

//出力先カレンダーに入力元カレンダーからイベントを追加する
function add_events(to_cal, cal_id, start_date, end_date) {
  var from_cal = CalendarApp.getCalendarById(cal_id);
  var events   = from_cal.getEvents(start_date, end_date);
  var calendar_owner = from_cal.getName().split('@')[0];
  events.forEach(function(evt){
    // 件名がマッチするものだけ登録
    if (/出張/.exec(evt.getTitle()) != null) {
      if(evt.isAllDayEvent() && evt.getAllDayStartDate() > start_date) {
        var e = to_cal.createAllDayEvent("[" + calendar_owner + "] " + evt.getTitle(),
                                         evt.getStartTime(),
                                         { description: evt.getDescription(),
                                           location: evt.getLocation() });
        e.setTime(evt.getAllDayStartDate(), evt.getAllDayEndDate());
      } else {
        to_cal.createEvent("[" + cal_user + "] " + evt.getTitle(),
                           evt.getStartTime(),
                           evt.getEndTime(),
                           { description: evt.getDescription(),
                             location: evt.getLocation() });
      }
    }
  });
}
```

### 4. 定期実行の設定

プロジェクトのトリガーを作成して、定期的に実行するように設定する。

## 現状、把握している問題

* 終日で日をまたぐ予定の場合、開始と終了が時刻を含んだ予定に含まれてしまう。
libciel

## libciel

https://github.com/cielavenir/ruby_libciel

### Object#extract(h,overwrite=false)

hの内容をselfのインスタンス変数に展開します。詳細はPHPのextract()を参照。

### Kernel::zip(a)

先頭要素を抜き出してzipします。a.shift.zip(*a)と等価です。詳細はPythonのzip()を参照。

### Enumerable#squeeze

連続して同じな要素を一つにまとめます。C++のunique()と同様の挙動となります。Array#uniqと同様な挙動にするには事前にソートする必要があります。計算量はO(n)です。

### Enumerator.Lazy#squeeze

上記のEnumerator.Lazy版です。
Ruby 1.9 + enumerable/lazyではEnumerable::Lazy、それ以外ではEnumerator::Lazyとなります。
このメソッドを利用する場合、Ruby 2.0未満では、enumerable/lazyまたはbackportsを **予め** requireしておかなければなりません。

### Array#permutation2(n=self.size)

配列の順列を生成します。Array#permutationと異なり、生成される順列に重複はありません。その代わり、配列の要素は比較可能である必要があります。

### String#rotate(count=1)
### String#rotate!(count=1)

指定した文字数分文字列を左に回転します。右に回転するには負の値を指定して下さい。

### Hash#fetch_nested(a)

h.fetch_nested?(['hello','world'])は、h['hello']['world']でh['hello']がnilだった際にエラーにならずにnilを返すことと同じです。

### Hash#<del>patch(par)</del>

Hash#mergeと同じだったので削除

### DBI::connect_transaction(driver_url, user=nil, auth=nil, params=nil, &block)

以下と等価です。

                        x=connect(driver_url, user, auth, params)
                        begin
                                x.transaction(&block)
                        ensure
                                x.disconnect
                        end

このメソッドを利用する場合、dbiをrequireしておかなければなりません。

### DBI::DatabaseHandle.execute_immediate(stmt,*bindvars,&block)

以下と等価です。

                        sth=execute(stmt,*bindvars)
                        ret=0
                        begin
                                if block then ret=sth.map(&block).count end
                        ensure
                                sth.finish
                        end
                        ret

このメソッドを利用する場合、dbiをrequireしておかなければなりません。
cpanが重くて plenv install がコケたので先にダウンロードして入れた


```
plenv install 5.14.2
```
普通にインストールしようとしたら以下のメッセージをだしてABORTされた。

```
Fetching 5.14.2 as /home/vagrant/.plenv/cache/perl-5.14.2.tar.bz2 (http://search.cpan.org/CPAN/authors/id/F/FL/FLORA/perl-5.14.2.tar.bz2)
Cannot get file from http://search.cpan.org/CPAN/authors/id/F/FL/FLORA/perl-5.14.2.tar.bz2: 599 Internal Exception at /home/vagrant/.plenv/plugins/perl-build/bin/../lib//Perl/Build.pm line 108.
```
Perl::Build.pmの108行目はHttp::Tinyのタイムアウトなので、どうもcpanがらPerlをダウンロードできてない模様。


```perl
103    my $http = HTTP::Tiny->new();
104    my $response = $http->mirror($url, $path);
105    if ($response->{success}) {
106        print "Downloaded $url to $path.\n";
107    } else {
108        die "Cannot get file from $url: $response->{status} $response->{reason}";
109    }
```

wgetなどで生アクセスしてみると、かなり重いもののなんとか``perl-5.14.2.tar.bz2``がダウンロードできたので、これを`~/.plenv/cache/`にコピーしてあげて再度インストールしたらなんとかうまくいった。
もっとスマートな方法がありそうだけどとりあえず。
ディベート


## 定義 ##

ある議題について、肯定側と否定側に分かれて討論し、最終的に審判に勝敗をジャッジしてもらう。

## 身につくスキル ##

- 論理的に物事を考える能力
- 傾聴する能力
- 意見を効果的に伝える技術
- 対立する側に立って物事を考える習慣

反駁の仕方

- 矛盾点や問題点を指摘し、相手の主張が成り立たないことを主張
- 別の根拠を持ち出し、相手の主張の誤りを主張
- etc...

ルール

- 非礼は慎む
- 時間を守る
- 根拠必須
- 反論は主張の直後にする
- 証拠は第三者が入手可能
- 証拠はねつ造しない
- 新しい議論を持ち出さない
スクレイピングツールの作成_3

データ収集の速度が遅いのはわかって、どうしようか対策を考えていたけどそもそも、どこで遅いのかが切り分けできていなかったので再調査しました。

結果、遅いのはPhantomJSの起動だと判明。

起動プログラムだけ分けてみようかな。。。
FuelPHPでHTMLをminifyする

最初、<a href="http://setchi-q.hatenablog.com/entry/2013/10/04/101634" target="_blank">ここ</a>を参考にしてみたんですが、周りくどい（謎のModel作ってる）やり方だったので整理。

まずは、composerで<a href="https://github.com/zaininnari/html-minifier" target="_blank">html-minifier</a>を読み込みます。
（FuelPHPでもcomposer使えるようになって便利ですよね。）

```js
{
  "require": {
    "zaininnari/html-minifier": "*"
  }
}
```

composer.pharをupdateすると当然autoload.phpも上書きされて、自動的にautoloadされますので、staticメソッドを呼び出せます。Templateコントローラーのafterで、出力されるhtmlをminifyしてやりましょう。

```php
public function after($response)
{
  $response = parent::after($response);
      
  $response->body(zz\Html\HTMLMinify::minify($response->body(), array(
    'doctype' => 'html5',
    'optimizationLevel' => 1
  )));

  return $response;
}
```

これで、出力は全てminifyされているはず。お試しください。
qemu-kvmで作ったimgイメージをマウントする

#発端
つい最近、qemu-kvmで運用していた仮想マシンがネットにどうしても繋がらなくなってしまいました。

中のデータをとりあえずとり出そうとしても、インターネットにもつながってないし、USBメモリを
仮想的にマウント使用としてもなんかエラーがでるし困ったな…

#解決策
と思ったら、imgイメージを本体の方でマウントするいい方法を見つけたのでメモしておきます。

なお、仮想マシンを停止した状態でおこなってください。
イメージ名をdisk.img, マウント先を/mntだとすると、

```Bash
kpartx -av disk.img
mount /dev/mapper/loop0p1 /mnt
umount /mnt
kpartx -dv disk.img
```

これで終わりです。
Gitで特定のコミットの状態のブランチを作成する

リポジトリの特定のコミットの状態のブランチを作成して、当時の状態と現在の状態で差分を取る方法。

```
git branch -l ブランチ名 コミット番号
```

もしくは、いったんチェックアウトした後にブランチを作成する。

```
git checkout コミット番号
git checkout -b ブランチ名
```

これでmasterと比較をとる、と。
Scikit-learnでIsomap


Isomapで遊ぶ．PCAとほとんど同じ感じで使える．

``` python:isomap.py
from sklearn.datasets import load_digits
from sklearn.manifold import Isomap
import matplotlib.pyplot as plt

## データの読み込み
digits = load_digits()
X = digits.data
y = digits.target
target_names = digits.target_names

## Isomap
n_neighbors=30
isomap = Isomap(n_neighbors=30, n_components=2)
X_iso = isomap.fit(X).transform(X)

## colors
colors = [plt.cm.nipy_spectral(i/10., 1) for i in range(10)]

## plot
plt.figure()
for c, target_name  in zip(colors, target_names):
    plt.scatter(X_iso[y == target_name, 0], X_iso[y == target_name, 1], c=c, label = target_name)
plt.legend()
plt.title('Isomap')
plt.show()
```

実行結果．

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/35293/51c64d7c-804a-d11c-e2e6-6668e9c898d0.png "Untitled.png")


参考:
[Scikit-learn PCAサンプル](http://scikit-learn.org/stable/auto_examples/decomposition/plot_pca_vs_lda.html#example-decomposition-plot-pca-vs-lda-py)
[Scikit-learn manifold learningサンプル](http://scikit-learn.org/stable/auto_examples/manifold/plot_lle_digits.html#example-manifold-plot-lle-digits-py)
Scikit-learnでPCA


PCAで遊ぶ．

```python:pca.py
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

## データの読み込み
digits = load_digits()
X = digits.data
y = digits.target
target_names = digits.target_names

## PCA
pca = PCA(n_components=2)
X_r = pca.fit(X).transform(X)

## colors
colors = [plt.cm.nipy_spectral(i/10., 1) for i in range(10)]

## plot
plt.figure()
for c, target_name  in zip(colors, target_names):
    plt.scatter(X_r[y == target_name, 0], X_r[y == target_name, 1], c=c, label = target_name)
plt.legend()
plt.title('PCA')
plt.show()
```

実行結果．

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/35293/88b4ea5c-0c6d-59b8-78ef-f35fe9b4e50f.png "Untitled.png")

参考:
[Scikit-learn PCAドキュメント](http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html)
[Scikit-learn PCAサンプル](http://scikit-learn.org/stable/auto_examples/decomposition/plot_pca_vs_lda.html#example-decomposition-plot-pca-vs-lda-py)
[東大富岡先生HP](http://www.ibis.t.u-tokyo.ac.jp/RyotaTomioka/Teaching/enshu13)
[PFIブログ](http://research.preferred.jp/2013/08/sketch/)
データベースに与えられた権限の一覧を取得する。

ホストDB2の場合は　SYSIBM.SYSDBAUTH 表を検索すると取得できる。

IBM Information Management Software for z/OS Solutions Information Center 
http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z10.doc.sqlref%2Fsrc%2Ftpc%2Fdb2z_sysibmsysdbauthtable.htm
【WordPress】functions.phpの罠

（テストも兼ねて）

wordPress管理画面のメディアライブラリから画像をトリミング、拡大縮小をすることができるが、編集画面で画像が表示されない症状に陥った。
プラグインを全部オフにしても同じ症状が起こるので、プラグインが悪さをしている感じでもない。
しばらく悩んでいると、たまたま下記の様な記事を発見。

>
OK, it seems other guys had the same issue like you.
check your functions.php file, and any files included within.
if there are any errors or even empty lines strange things and errors will occur in wp-admin (WordPress Dashboard)
The problem may be an empty line between PHP tags

>```
><?php function(){ ... } ?>
>
><?php function(){ ... } ?>
>```
>needs to be :

>```
><?php function(){ ... } ?>
><?php function(){ ... } ?>
>```

こんな仕様は想定外！
functions.phpで<?php ?>を使い時は注意。。
ScraperWikiを使ってWEBサイトからデータを定期的に取得する


「[ScraperWiki](https://scraperwiki.com/)」サービスを利用すれば、自分でサーバーなどを借りなくても[ウェブスクレイピング](http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0)を定期的に行うことができます。
### ScraperWikiの特徴

+ スクレイパーのスクリプトをブラウザ上で編集・実行できる
+ スクリプトを定期的に実行できる
+ 取得したデータをcsvでエクスポートしたりJSON APIを通じて取得したりできる
+ 取得したデータをテーブルやグラフとして表示できる
+ ３データセットまで無料

### スクリーンショット

スクリプト編集画面
![scraperwiki201401221.JPG](https://qiita-image-store.s3.amazonaws.com/0/2832/3331ac11-f2f3-9120-ea55-825e544313bf.jpeg)

DB
![201401222.JPG](https://qiita-image-store.s3.amazonaws.com/0/2832/825e910e-092f-9028-afdf-03f16627dea3.jpeg)





### スクレイパースクリプト サンプル

```py
#!/usr/bin/env python
import scraperwiki
import lxml.html
import json

url = "http://target.website.hoge/index.html" #スクレイピングするターゲットサイト
html = scraperwiki.scrape(url)		#htmlドキュメント取得
root = lxml.html.fromstring(html)	#rootエレメントオブジェクト取得

data = []
id = 0
for el in root.cssselect("#hoge_contents > li > span"):  #cssセレクタで要素を抽出
    data.append({'id':id, 'text':el.text })	#抽出した要素のテキストを保存
    id = id + 1

print repr(data)	#保存したデータをコンソールに出力


# Saving data:
unique_keys = [ 'id' ] #ユニークキーを指定
scraperwiki.sql.save(unique_keys, data)	#DBに保存
```

実際に使用した例
http://shimz.me/blog/d3-js/3353
実行中の Unicorn のバージョンを見るには

**TL;DR:** `lsof -p` で Unicorn プロセスが開いているファイルを一覧して、 gem のディレクトリのバージョン番号を探せばいい。

----

まず Unicorn のプロセスを探す。

```
$ ps aux | grep unicorn
user            41323   0.0  0.0  2442000    628 s000  S+    4:26PM   0:00.00 grep unicorn
user            40631   0.0  0.6  2542788  46724   ??  S     4:14PM   0:00.14 unicorn worker[1] -c uni -D    
user            40630   0.0  0.6  2541764  46404   ??  S     4:14PM   0:00.15 unicorn worker[0] -c uni -D    
user            40629   0.0  0.1  2540740   5336   ??  S     4:14PM   0:00.01 unicorn master -c uni -D
```

`lsof -p` を使って、バージョン番号を知りたい Unicorn プロセスが開いているファイルの一覧を表示する。

```
$ lsof -p 40631
COMMAND   PID USER   FD   TYPE             DEVICE  SIZE/OFF     NODE NAME
ruby    40631 user  cwd    DIR                1,1       612 51962934 /Users/user
ruby    40631 user  txt    REG                1,1   2217260 83107071 /Users/user/.rbenv/versions/2.0.0-p353/bin/ruby
...
```

長いので `grep gems/unicorn-` をかける。

```
$ lsof -p 40631 | grep gems/unicorn-
ruby    40631 user  txt    REG                1,1     42848 84416806 /Users/user/vendor/bundle/ruby/2.0.0/gems/unicorn-4.8.0/lib/unicorn_http.bundle
```

ディレクトリに含まれるバージョン番号から、この Unicorn プロセスのバージョンが4.8.0であると分かる。
Enum で振る舞う

## Java の列挙型

Java の列挙型は、C 言語の enum と異なり、単なる int の定数列挙ではなく、オブジェクトの列挙になるので、メソッドを宣言したり、メンバ変数を宣言したりと、振る舞いを持たせることが出来る。

内部的には、列挙したオブジェクトは定数として扱われるので、列挙の数だけオブジェクトが予め生成されることになる。

詳細は Effective Java を読もう！

## 振る舞う enum

通常の enum の宣言は以下のようになる。

```java
public enum MyEnum {
    HOGE,
    FUGA;
}
```

これにメンバ変数を追加すると、

```java
public enum MyEnum {
    HOGE(1),
    FUGA(2);

    private final int id;

    private MyEnum(final int id) {
        this.id = id;
    }
}
```

コンストラクタは必ず private でなければならず、それ以外のアクセス修飾子とするとコンパイルエラーとなる。
コンストラクタの呼び出しは列挙の宣言のところで行う。

さらにメソッドを追加して、

```java
public enum MyEnum {
    HOGE(1),
    FUGA(2);

    private final int id;

    private MyEnum(final int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }
}
```

これで、以下のようにメソッド呼び出しが行えるようになる。

```java
int hogeId = MyEnum.HOGE.getId();
int fugaId = MyEnum.FUGA.getId();
```

メソッドの引数に列挙型オブジェクトを受けるようにしておけば

```java
public void doSomething(MyEnum num) {
    num.getId();
}
```

とか出来るので、switch 文で分岐して振る舞いを変えるようなコードがスッキリする。

enum もクラスの一種なので、インタフェースを実装したり、抽象メソッドを宣言したりできる（別のクラスの継承と、宣言した enum を別のクラスで継承することはできない）。

```java
public enum MyEnum implements SomeInterface {
    HOGE(1),
    FUGA(2);

    private final int id;

    private MyEnum(final int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }
}
```

抽象メソッドを宣言した場合、定数オブジェクトの宣言のところで実装を書く。

```java
public enum MyEnum {
    HOGE(1) {
        @Override
        public void foo() {

        }
    },
    FUGA(2) {
        @Override
        public void foo() {

        }
    };

    private final int id;

    private MyEnum(final int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public abstract void foo();
}
```

enum はもともと Comparable インタフェースと Serializable インタフェースを実装している。

## 列挙型のメソッド

enum 型には特別なメソッドが幾つか用意されている。

列挙した定数オブジェクトをすべて得るには、`Enum#values()`メソッドを使う。

```java
public enum MyEnum {
    HOGE(1),
    FUGA(2);

    private final int id;

    private MyEnum(final int id) {
        this.id = id;
    }

    // id から、定数オブジェクトを逆引きするメソッド
    public static MyEnum valueOf(int id) {
        // values() で、列挙したオブジェクトをすべて持つ配列が得られる
        for (MyEnum num : values()) {
            if (num.getId() == id) { // id が一致するものを探す
                return num;
            }
        }

        throw new IllegalArgumentException("no such enum object for the id: " + id);

        // Null-Object パターンにしたがって、列挙に UNKNOWN みたいなのを入れておくのも良い
        // return UNKNOWN;
    }

    public int getId() {
        return id;
    }
}
```

String から enum への変換は予め用意されている。

```java
MyEnum hoge = MyEnum.valueOf("HOGE");
```

enum から String への変換もある。
`Enum#toString()`はオーバライドが可能で、自分の好きな文字列にすることが出来る。
`Enum#name()`はオーバライドができないようになっている。宣言した通りの名前が得られる。

```java
String hoge1 = MyEnum.HOGE.toString();
String hoge2 = MyEnum.HOGE.name();
```

`Enum#ordinal()`で、宣言された順番も得ることが出来る。
宣言された順番をコンパイラが勝手に検出してコードにしてくれるので、当然のことながら、順番を入れ替えるとかえってくる数字も変わってしまうので、かえってくる数字そのものを何処か別のところで比較したり使ったりすると、せっかくの型安全性も台無しになるので、あんまり使わないでね。

```java
int order = MyEnum.HOGE.ordinal();
```
HTML5のvideoタグで利用するmp4の動画を作る時のTips

最近、スマホやタブレットを使う機会も多いですが、その辺りの端末に動画コンテンツを提供する時に楽なのがmp4形式の動画をvideoタグで貼り付ける事です。
ただ、ちょっとした注意点があって、どういう状況で再生するかによって細かい調整をしておかないと、再生開始までにえらく時間がかかるようになって、非常に不便になります。


## 既に作成済みの動画を再生する場合
mp4形式の動画を再生するためにはメタデータ情報が必要です。メタデータは通常ファイルの末尾に付与されます。ファイルサイズが小さい時は気付かないのですが、10分、20分ぐらいあるような動画を再生しようとすると末尾まで読んでから再生できるかどうかを判別するので、再生が開始できるようになるまでに異様に時間がかかるようになります。

そこで動画作成時にメタデータをファイルの先頭に移動させておきます。
こうする事で、ファイルサイズが大きい動画でも一瞬で再生開始が可能になります。
PCのブラウザだと、その辺上手いことやってくれるのか末尾にメタデータがあってもすぐに再生できたりするんですが…。

ffmpegで動画を作成している場合には、`-movflags faststart`オプションを利用することでエンコード後にメタデータを先頭に移動させる事ができます。

例としてはこんな感じ。

```
ffmpeg -i inputfile -f mp4 -vcodec libx264 -b:v 800k -acodec libfaac -b:a 128k -movflags faststart -o output.mp4
```

既に存在しているmp4を変換したい場合は[qt-faststart](https://github.com/danielgtaylor/qtfaststart)というツールが利用できます。

## エンコードしながら追っ掛けて再生する場合
バックグラウンドでエンコードしつつ動画の再生を開始したい場合、PC向けかモバイル向けかで状況が変わります。

### モバイル向けの場合
モバイル端末で追っ掛けながら再生する場合はHTTP Live Streaming(HLS)を使うのが良い方法です。
HLSは動画ファイルを約10秒程度の短時間に分割しMPEG-TSコンテナに入れたものをひたすら生成しつつm3u8形式のリストファイルにそのファイルを逐次追加していくことで、HTTPのみで擬似的にLive Streamingを実現する方法です。
Appleが提唱したらしく、iOSが最も安定して再生できるのですが一応Androidでも対応します。
(手元のNexus7で試した所、Androidだとシークが出来なくなる)

HLSを利用することで、Webカメラ等で録画しつつHTML5のvideoタグで配信する、といった事も可能になりますし、オンデマンドで動画ファイルを変換しながら再生するということもWebブラウザだけで実現可能です。

以前は動画の分割がかなり面倒だったのですが、新しめのffmpegであればsegment分割の機能が組込まれているので、簡単に作成することができるようになりました。
ffmpegでHLSを作成するには以下のように設定します。

```
ffmpeg -i inputfile -vcodec libx264 -b:v 800k -acodec libfaac -b:a 128k -flags +loop-global_header -map 0 -bsf h264_mp4toannexb -f segment -segment_format mpegts -segment_time 10 -segment_list output.m3u8 stream%04d.ts
```

自分が試した時には、何故か`-flags +loop-global_header`と`-map 0`と`-bsf h264_mp4toannexb`のオプションが必要になりましたが、詳しい理由は不明です。
重要なのは以下のオプションです。

- `-f` で出力形式を`segment`に指定する
- `-segment_format` で分割されたストリームのフォーマットを`mpegts`に指定する
- `-segment_time` で分割単位時間を指定する。大体10秒くらいが目安らしい
- `-segment_list` で出力するリストファイル名を指定する
- 出力名に連番が振られるように`%04d`等を含めておく。この場合4桁の連番になる。

videoタグには出力されたm3u8ファイルを指定しておきましょう。

HLSでwebカメラの映像等を配信している場合、そのままだとガンガンファイルが溜まっていってストレージを圧迫するので、不要になったデータを定期的に削除する仕組みが必要になるかもしれません。

### PC向けの場合
PC向けのブラウザでは今のところSafariを除いてHLS形式の再生は不可能です。
ちゃんとストリーミングサーバーを用意してrtpなりrtspなりのプロトコルを利用すれば再生できそうですが、中々面倒そうなのでこちらは試していません。一応videoタグでも利用できそうですが未検証です。

インチキな解決策として、fragmented mp4を作成するという方法があります。
通常mp4のメタデータは一箇所にまとめて配置されますが、それをキーフレームごとに分散して配置する方法です。
こうしておくとエンコードが全て終わっていなくても、現在エンコードが進んでいる所までは再生できるようになります。ただ一回読み込んだ時点で動画の長さが認識されるので、途中で止まってしまった場合続きを再生できるようにするには再読み込みが必要です。
一瞬停止しても良いならJSを組み合わせてゴリ押すことも可能かもしれませんが、中々面倒です。

fragmented mp4を作成するのもffmpegでオプションを追加するだけでOKです。

```
ffmpeg -i inputfile -f mp4 -vcodec libx264 -b:v 800k -acodec libfaac -b:a 128k -movflags frag_keyframe -o output.mp4
```


というわけで、html5のvideoタグを利用した動画の配信はiOS系が一番進んでいるような気がします。AirPlayも利用できるので、Apple TVがあれば普通にテレビに転送して再生できたりします。

自宅にカメラ置いてモニタするWebシステムを作りたい時とか、自宅のストレージにある動画をどこでも見れるようにしたい時に使えると思います。
まあ、そういう既存のアプリもあるので普通そっち使うのが良いと思いますが、細かい部分を自分に便利な形にしようとすると自分で色々用意するのが結局楽だったりします。
ActiveRecordで使う named scope は、includes と joins の区別がつく名前をつけると便利そう

ActiveRecord::Relationでは、N + 1問題をはじめとしたパフォーマンス問題に当たることが多い。とくに、includes なのか joins なのかの区別が scope で見分けが付くと便利そう。通常、実装を隠蔽すべきだと思うが、こんな命名規を思いついた。

```rb
class Xxx < activeRecord::Base
  scope :with_yyy, -> { joins(:yyy) }
  scope :including_zzz, -> { includes(:zzz) }
end
```
これぐらいが、抽象化を邪魔しないでいいかなと。

もう一段汎用化してみて、

```rb
class Xxx < activeRecord::Base
  scope :with, (rel) -> { joins(yyy) }
  scope :including, (rel) -> { includes(zzz) }
end
```
として、さらに concerns 以下に抜き出してみてもいいが、なんかと名前空間衝突しそう。(試してないので)

みなさんの現場ではどういう名前が付いていますか？
Apache JMeterを使って「アクセス増えすぎるとApacheが音を上げるZE」を試す

結果的に試すハメになったってだけですお疲れ様です。

# Apache JMeterとは

負荷かけるソフトです。Pure Javaで負荷かけます。お気軽に1秒間に16連射と言わず50アクセスとか出来ます。

* http://d.hatena.ne.jp/language_and_engineering/20081014/1223905380
* http://codezine.jp/article/detail/336
* http://jmeter.apache.org/

説明は雰囲気わかる感じで抑えます。

ちなみに現在の最新版の画面(2.11)ではアイコンが出てきてちょっと気分が良いです。

![jmeter211.png](https://qiita-image-store.s3.amazonaws.com/0/14365/7581cd8b-8f37-fbf5-807d-6353d9f17d13.png)

# ただのDebianのApacheに1秒間50アクセスをぶち込む

さて上の記事を参考にあるWebサイト (自分が管理してるやつだよ) のトップに秒間50アクセスさせてみました。

![denied.png](https://qiita-image-store.s3.amazonaws.com/0/14365/8e811c38-8051-a901-9f5e-d962ccb9374b.png)

(๑´╹‸╹`๑) あっ……

(๑´╹‸╹`๑) 1秒50アクセスでGETするだけでもdeniedなんですね

(๑´╹‸╹`๑) そもそも自明なことが起きたのに騒ぎ立ててるこの記事微妙な気がしてきました

ヾ(๑╹◡╹)ﾉ いいから対策してみましょう

Debianに入れたApacheの設定でプロセス数をがこーんと上げます。
どうでもいいけどMPM Preforkです。
どこから突っ込んでもいいよもう。

多分アイドルプロセス生成が間に合ってません。
通常時のアイドルになってるプロセスの最小値と最大値を5〜10から20〜50に上げてみます。

![ok.png](https://qiita-image-store.s3.amazonaws.com/0/14365/63abb28c-8165-7399-f9a0-8126333fac06.png)



あたりまえですがps axですっごいプロセス数が増えます。

修正: 最初のタイトルだとApacheが応答しなくなるかのような感じだったので直しました。
Phinxを使ってみる

#Phinxを使ってみる

インストール方法
http://qiita.com/MasatoYoshioka@github/items/ca42ec7d2c1197a54941

##phinxの初期化

```sh 
$cd migration/path
$vender/path/bin/phinx init .
```
phinx.ymlが作成される

##migrationファイル用のディレクトリを作成

```sh 
$mkdir migrations
```

##phinx.ymlの編集

```phinx.yml
paths:
    migrations: %%PHINX_CONFIG_DIR%%/migrations

environments:
    default_migration_table: phinxlog
    default_database: development
    production:
        adapter: mysql
        host: localhost
        name: production_db
        user: root
        pass: ''
        port: 3306

    development:
        adapter: mysql
        host: localhost
        name: development_db
        user: root
        pass: ''
        port: 3306

    testing:
        adapter: mysql
        host: localhost
        name: testing_db
        user: root
        pass: ''
        port: 3306
```

##Migrationファイルの作成

```sh 
$vender/path/bin/phinx create MyTestMigration
Phinx by Rob Morgan. version 0.2.9

using config file ./phinx.yml
using config parser yaml
using migration path /migration/path/migrations
created ./migrations/20140122150816_my_test_migration.php

```

###作成されたmigrationファイルの中身

```./migrations/20140122150816_my_test_migration.php

<?php

use Phinx\Migration\AbstractMigration;

class MyTestMigration extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     *
     * Uncomment this method if you would like to use it.
     *
    public function change()
    {
    }
    */

    /**
     * Migrate Up.
     */
    public function up()
    {

    }

    /**
     * Migrate Down.
     */
    public function down()
    {

    }
}
```

###migration実行

```sh 
$ ../vendor/path/bin/phinx migrate
Phinx by Rob Morgan. version 0.2.9

using config file ./phinx.yml
using config parser yaml
using migration path /migration/path/migrations
warning no environment specified, defaulting to: development
using adapter mysql
using database depelopment_db

 == 20140122150816 MyTestMigration: migrating
 == 20140122150816 MyTestMigration: migrated 0.0198s

All Done. Took 0.0295s
```

###phinxへのPathは通した方が楽だと思う。
OnCollisionStay2D、OnCollisionExit2Dが呼ばれない

（14/01/31 23:36追記）

以下の方法はあまりよろしくない
追記しました
http://qiita.com/fuqunaga/items/aa59f0de86c5fe4dd5ae

---


OnCollisionEnter2Dは呼ばれるのに。

調べたら、
**transform.localScale.x を -1 にしてスプライトをフリップしてた** のがまずかった
http://forum.unity3d.com/threads/217184-OnCollisionExit2D-Issue

transform.localRotation を180度、Y軸回転して対処したった

よく考えたら物理オブジェクトにマイナススケールってかなりマズそう
いちおうスプライトを子供のGameObjectにしてマイナススケールってのも試したけど、
こっちも大丈夫そうだった
tmuxの文字列コピーがめっちゃ便利！！


職場の後輩に教えてもらいました。

## 手順

1. ``Prefix``+`[`で文字列選択モードに入る
2. vimの操作方法で選択したい文字列へとカーソル移動
3. `Space`で選択開始
4. `Enter / Return`で文字列コピー
5. ``Prefix``+`]`で文字列貼り付け

``Prefix``はデフォルトだと`Ctrl+b`です。
人によって使いやすいキーに変えているかと思います。

続き：[tmuxのwindowモードをviにする](http://qiita.com/shoma2da/items/8569fb80777020303078)
ElasticSearch を yum でインストールする

概要
========
yum を利用した ElasticSearch のインストール方法です。
コンパイルは面倒だし、service スクリプト作りたくない。

手順
========

1. リポジトリの追加

    `sudo vim /etc/yum.repos.d/elasticsearch.repo`

    バージョン 1.0.x を使いたい場合

    ```elasticsearch.repo
[elasticsearch-1.0]
name=Elasticsearch repository for 1.0.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.0/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1
```

    バージョン 0.90x を使いたい場合

    ```elasticsearch.repo
[elasticsearch-0.90]
name=Elasticsearch repository for 0.90.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/0.90/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1
```

2. インストール

   `sudo yum install elasticsearch`

3. サービス起動

    `sudo service elasticsearch start`

4. 動作確認

    ```
$ curl -X GET http://localhost:9200/
{
  "status" : 200,
  "name" : "Shroud",
  "version" : {
    "number" : "1.0.0.RC1",
    "build_hash" : "c6155c5142f7995e054f9f3b7d82f923dd3620bc",
    "build_timestamp" : "2014-01-15T17:02:32Z",
    "build_snapshot" : false,
    "lucene_version" : "4.6"
  },
  "tagline" : "You Know, for Search"
}
```

5. 自動起動設定

    `sudo chkconfig elasticsearch on`



参考
========
- [Announcing Deb And Rpm Repositories | Blog | Elasticsearch](http://www.elasticsearch.org/blog/apt-and-yum-repositories/)
JSでSeleniumのトレンドメモ(2013）


- 公式WebDriverJsだけでなく、wdとかサードパーティ製のライブラリが使われている
  - [JavaScriptでWebDriverのテストコードを書きましょ](http://www.slideshare.net/ssuser3eb8d69/javascriptwebdriver)
- →WDの公式ページ
  - [WD.js by admc](http://admc.io/wd/)
  - [admc/wd - GitHub](https://github.com/admc/wd)
- Selenium IDEの後継、Selenium Builderが出てきている
- JSでWebDriverのコードも吐いてくれる。
 [次世代のIDE、Selenium Builderまとめ | 品質向上ブログ](http://blog.trident-qa.com/2013/12/selenium-builder-vs-ide-recap/)
- 2013のSeleniumアドベントカレンダー
  - [Selenium Advent Calendar 2013 - Adventar](http://www.adventar.org/calendars/128)
FontAwesomeKitを使ってiOS 7用のアイコンを動的生成する

iOS 7用のアイコン探すの、面倒ですよね。

サイズ毎に違う画像を用意しないといけないし、
フリーの物は[面倒なライセンス](http://icons8.com/license/)だったり、種類が少なくて欲しいのが無かったりします。

そんなあなたにFontAwesomeKit。

# FontAwesomeKit
[FontAwesomeKit](https://github.com/PrideChung/FontAwesomeKit)はアイコンフォントから画像を動的に生成するライブラリです。

## メリット
### 種類が豊富
[FontAwesome](http://fortawesome.github.io/Font-Awesome/)や[ionicons](http://ionicons.com/)といった種類が豊富な、複数のアイコンフォントに対応しています。

### 使いやすいライセンス
FontAwesomeKit自体はMIT License、
各フォントは[SIL Open Font License](http://sourceforge.jp/projects/opensource/wiki/SIL_Open_Font_License_1.1)や、MIT Licenseなど、使いやすいライセンスで提供されています。

### サイズ調整や差し替えが簡単
フォントから指定したサイズのUIImageを生成できるため、
サイズを調整したり、別のアイコンに差し替えるのが楽です。

## 使い方
### インストール
CocoaPodsに対応しています。簡単。

```
pod 'FontAwesomeKit'
```

使うフォントだけインストールすることもできます。
「MIT Licenseのフォントだけ使いたい」といった場合におすすめ。

```
pod 'FontAwesomeKit/IonIcons'
```

### 画像の生成

こうするだけ。簡単です。

```objc
UIImage *starIconImage = [[FAKIonIcons ios7StarOutlineIconWithSize:22] imageWithSize:CGSizeMake(22, 22)];
```

## 注意事項
FontAwesomeKit自体にはキャッシュ機能がありません。
UIImageを生成する度にdrawInRectで描画する処理が走りますので、
頻繁に呼ばれるような箇所で使用する場合には、自力でキャッシュ機能を実装してください。
Rubyでe2eテスト

# まず読んでおく
- [Rspec/Capybara/Turnipの入門記事を全力でまとめてみた - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/the-rspec-book-review-rails/)
- [Rubyist Magazine - エンドツーエンドテストの自動化は Cucumber から Turnip へ](http://magazine.rubyist.net/?0042-FromCucumberToTurnip)
- [イントロダクション - RSpec/Capybara入門 - Ruby on Rails with OIAX](http://www.oiax.jp/rails/rspec_capybara_primer/rspec_capybara_introduction.html)
Phinx インストール

#Phinx インストール

Phinxについて
http://docs.phinx.org/en/latest/index.html
http://qiita.com/k-motoyan/items/6f64d650f14bfb180e54

##composerを使ってインストール

###composer.jsonの編集

```composer.json

{
    "require":{
        "robmorgan/phinx": "*"
    }
}
```

###composer.pharをダウンロード

```sh
$curl -s http://getcomposer.org/installer | php
```

###Phinx　インストール

```sh 
$php composer.phar install
```

venderディレクトリに保存される
Selenium with WebDriverJS

# セットアップ
##### [Downloads - selenium - Browser automation framework - Google Project Hosting](https://code.google.com/p/selenium/downloads/list)
- ダウンロードページ

##### [WebDriverJs - selenium - A guide to using the JavaScript bindings for WebDriver. - Browser automation framework - Google Project Hosting](https://code.google.com/p/selenium/wiki/WebDriverJs)
- オフィシャルマニュアル
- mochaのサンプルがどうしてもうまく動かない…。

## はまりどころ
### chromeとieを動かすには、selenium起動時にdriverへのパスを通しておく
```bash
java -jar selenium-server-standalone-2.39.0.jar -Dwebdriver.chrome.driver=./chromedriver.exe -Dwebdriver.ie.driver=./IEDriverServer.exe
```
- 起動時指定していないと↓なエラーが出る

> WARN - Exception: The path to the driver executable must be set by the webdriver.ie.driver system property;


### IEは、オプションのセキュリティ設定で「保護モード」を同じにしておく
- 保護モードが違っていると↓のエラーが出る

> WARN - Exception: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same value (enabled or disabled) for all zones. (WARNING: The server did not provide any stacktrace information)

- 下記ブログ参照。
  - [Selenium2のInternetExplorerDriverでエラーになった « ひよっこ。](http://prepro.wordpress.com/2011/07/26/selenium2%E3%81%AEinternetexplorerdriver%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F/)

# サンプル
##### ["Web開発ツールを使いこなせ!"クリエイターの道具箱 (12) Selenium WebDriverを使ったテストの自動化 | マイナビニュース](http://news.mynavi.jp/column/wc/012/)

##### [Automated e2e testing- WebDriverJS, Jasmine and Protractor](http://engineering.wingify.com/posts/e2e-testing-with-webdriverjs-jasmine/)
- WebDriverJsでブラウザ操作し、jasmine-nodeでテストをかける方法

##### [End-to-End Testing for Web Apps (Meteor / Selenium / WebDriverJS Example) — Xolv.io](http://xolv.io/blog/2013/04/end-to-end-testing-for-web-apps-meteor)

# WebDriverでのブラウザ操作コーディングテクニック

## 公式ドキュメントから
- WebDriverJsのコードはないが、テクニックは大体おなじはず。Javaのコードを脳内変換する。

##### [Selenium WebDriver — Selenium Documentation](http://docs.seleniumhq.org/docs/03_webdriver.jsp#introducing-the-selenium-webdriver-api-by-example)

##### [Test Design Considerations — Selenium Documentation](http://docs.seleniumhq.org/docs/06_test_design_considerations.jsp#chapter06-reference)
- "Location Strategies", "Wrapping Selenium Calls", "Page Object Design Pattern"は使えそう。

## トピック
##### [Selenium WebDriverのwaitを活用しよう│ソフトウェアテストラボ｜アプリテスト｜スマートフォンテスト｜株式会社シフト](http://softwaretest.jp/labo/tech/labo-294/)
# Reference
##### [webdriver.WebDriver](http://selenium.googlecode.com/git/docs/api/javascript/class_webdriver_WebDriver.html)
- webdriverのAPIドキュメント。ブラウザ操作にどんなコマンド使えるかはなんとなくわかる。

##### [webdriver.js - selenium - Browser automation framework - Google Project Hosting](https://code.google.com/p/selenium/source/browse/javascript/webdriver/webdriver.js)
- webdriverのソースコード。

##### [API Docs for WebDriverJS](http://selenium.googlecode.com/git/docs/api/javascript/index.html)
- APIドキュメントの目次。自動生成されてるだけっぽくて何が何やら。
CORSリクエストでクレデンシャル(≒クッキー)を必要とする場合の注意点

# クレデンシャルの送信
クロスオリジンのAJAXリクエストでクレデンシャル（クッキーの送信またはBASIC認証）を必要とする場合は、それを許可するオプションをフロント側Javascriptで付けておく必要があります。デフォルトではCORSリクエストでクッキーは送信されませんし、BASIC認証は送れません。

## Fetch API の場合
```js:
fetch(url, {
  mode: 'cors', //クロスオリジンリクエストをするのでCORSモードにする
  credentials: 'include' //クレデンシャルを含める指定
})
```

## jQueryの場合
```js:
$.ajax({
  url: "http://example.jp/api/user",
  xhrFields: {
    withCredentials: true
  }
}).success(function(res){
  console.log(res);
})
```

毎回付けるのが面倒なら↓こうしておいてもよいです。

```js:
$.ajaxSetup({xhrFields:{withCredentials:true}});
```

## AngularJS(1.x系)の場合
AngularJSの場合はこんな感じか。

```js:
yourapp.config(function($httpProvider) {
  $httpProvider.defaults.withCredentials = true;
});
```

## XMLHttpRequest を直接使う場合
```js:
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
```

# Access-Control-Allow-Origin: * は駄目
クレデンシャルを必要とするリクエストの場合、Access-Control-Allow-Originにワイルドカードは使えまえん。キチンと許可オリジンを指定しましょう。

そうは言ってもワイルドカード的に受け付けたい場合はあるので手軽に.htaccessで何とかする設定メモ。これは送られてきたOriginを許可オリジンとしてオウム返しする設定です。

```text:.htaccess
RewriteCond %{HTTP:Origin} (.+)
RewriteRule . - [E=CORS_ORIGIN:%1]
Header set Access-Control-Allow-Origin %{CORS_ORIGIN}e env=CORS_ORIGIN
```

CORSアクセスを許可するOriginを限定したいなら↓こんな風に書いてやればOK

```text:.htaccess
RewriteCond %{HTTP:Origin} (https?://([a-zA-Z0-9\-\.]+\.)?(example\.com|example\.jp)(:[0-9]+)?)$
RewriteRule . - [E=CORS_ORIGIN:%1]
Header set Access-Control-Allow-Origin %{CORS_ORIGIN}e env=CORS_ORIGIN
```


# Access-Control-Allow-Credentials: true も付けましょう
クレデンシャルを必要とする場合はこのヘッダがないとブラウザはレスポンスを捨ててしまうのでセットで付けておきましょう。

```text:.htaccess
Header set Access-Control-Allow-Credentials true
```

# その他基本のキ
よく使うヘッダのコピペ用設定。アプリのフレームワークによっては X-Csrftoken ヘッダも通しておくなど。

ベタ書き版

```text:.htaccess
Header set Access-Control-Allow-Methods "GET, PUT, POST, DELETE, HEAD, OPTIONS"
Header set Access-Control-Allow-Headers "X-Requested-With, Origin, X-Csrftoken, Content-Type, Accept"
```

## クライアントのリクエストに合わせて許可する版

```httpd.conf
# CORS対応

## Originの許可（オウム返し）
RewriteCond %{HTTP:Origin} (https?://([a-z0-9\-\.]+\.)?example\.com)$
RewriteRule . - [E=CORS_ORIGIN:%1]
Header set Access-Control-Allow-Origin %{CORS_ORIGIN}e env=CORS_ORIGIN

## リクエストメソッドの利用許可（オウム返し）
RewriteCond %{ENV:CORS_ORIGIN} ^http
RewriteCond %{HTTP:Access-Control-Request-Method} ^([A-Z]+)$
RewriteRule . - [E=CORS_METHOD:%1,E=CORS_PREFLIGHT:1]
Header set Access-Control-Allow-Methods "GET, POST, HEAD, OPTIONS, %{CORS_METHOD}e" env=CORS_METHOD

## リクエストヘッダの利用許可（オウム返し）
RewriteCond %{ENV:CORS_ORIGIN} ^http
RewriteCond %{HTTP:Access-Control-Request-Headers} "^([a-zA-Z0-9-]+(, ?[a-zA-Z0-9-]+)*)$"
RewriteRule . - [E=CORS_HEADERS:%1,E=CORS_PREFLIGHT:1]
Header set Access-Control-Allow-Headers "%{CORS_HEADERS}e" env=CORS_HEADERS

## レスポンスヘッダの利用許可
# Header set Access-Control-Expose-Headers "* or X-Hoge, X-Fuga" env=CORS_ORIGIN

## クレデンシャルの送信許可（クッキー,Authorizationヘッダ）
# Header set Access-Control-Allow-Credentials true env=CORS_ORIGIN

## CORS許可のキャッシュ（プリフライトリクエストを暫く投げない許可）
Header set Access-Control-Max-Age "3600" env=CORS_PREFLIGHT
IT勉強会運営について（司会編）

IT勉強会は数あれど、その運営ノウハウについて公開されている例はあんまりないなあ と思って書きためてみる連続エントリ第五弾。

第五弾はIT勉強会運営における司会がやることについてです。

# まえおき

自分の活動内容については以下をご確認ください。

* [IT勉強会運営について（スケジューリング編）](qiita.com/TakamiChie/items/e4eeb39575fd25ebfd0c)

# 司会のお仕事

とりあえず、日本Androidの会横須賀支部定例会にて自分がやっていることは以下の通りです(スマートフォン懇親会は、とくにプログラムのないイベントなので司会がすることは大してありません)。

* オープニングのごあいさつ
* (誰かのスピーチ開始時)スピーチタイトルの案内
* スピーチ時間のタイムキーパー
* (誰かのスピーチ終了時)本人が言わなければ質問の受付
* (スピーチ質疑応答後の)休憩時間案内
* エンディングのごあいさつ

くらいです。

## オープニングのごあいさつ

イベントのオープニングの挨拶をします。イベントの趣旨説明や、可能ならイベントのスケジュール説明を行います。

が、横須賀支部では開始当初は資料の準備などごたついているので、スケジュール説明については省略していることが多いです。

## (誰かのスピーチ開始時)スピーチタイトルの案内

スピーチタイトルの案内を行います。また、録画時にタイトルコールを乗せることができるので、YouTube用の録画撮影は、このスピーチタイトル案内の直前に始めておくのが良いでしょう(とはいえこれも、横須賀支部ではばたついていて結構やることを忘れてしまいます)。

## スピーチ時間のタイムキーパー

スピーチの時間が決まっている場合は、スピーチ終了時間を知らせるため、スピーカーに見えるように案内を出します。自分は以下のようなスライドをPDFでひとまとめにしてタブレットに格納しています。

![5分前.png](https://qiita-image-store.s3.amazonaws.com/0/14499/dfbb9aaf-6be6-6e78-cc8c-94242b33540b.png)

![しめてください.png](https://qiita-image-store.s3.amazonaws.com/0/14499/b31d86a1-1d97-2de2-cdae-711d09ac8efc.png)

![ここでぼけて.png](https://qiita-image-store.s3.amazonaws.com/0/14499/d60adb14-362a-e502-c577-7739d98f906a.png)

最後のは一応流れで作ってみたのですが、はっきり言っていつ使うか不明だったりします。

## (誰かのスピーチ終了時)本人が言わなければ質問の受付

スピーチの終了後について、スピーカーさん本人が「何か質問はありますか？」などを言わなければ自分が質疑応答の案内をし、質疑応答を開始します。

また、とくに質問が無かった場合は、自分がなんらかの質問を投げかけると、話題作りにもなりますので良いと思います（が、横須賀支部ではあまり自分に余力がないので最近はやっていません）。

なお、横須賀支部では今のところやっていませんが、あまりにもスケジュールが延びた場合などは、「次の質問で最後とします」や「済みません続きは懇親会で」などの案内をしておくと良いと思います。

## (スピーチ質疑応答後の)休憩時間案内

質疑応答が終わったら休憩時間案内を行います。イベントがスケジュール通りに進んでいれば予定通り、そうで無い場合は適宜調整の上休憩時間を案内して、休憩とします。なお、動画配信環境の整備など都合もあるため5分以上の休憩は必須です(なお、もしスケジュール表を作っていれば、このタイミングで随時修正していくと後々混乱が少なくて良いでしょう)。

横須賀支部の場合は、参加者同士の交流という狙いもあり、極力10分の休憩を行っています（もちろん懇親会も用意はしていますが、懇親会に参加出来ない方も多いので）。

## エンディングのごあいさつ

全てのスケジュールが終わったら、エンディングのご挨拶と懇親会の案内を行います。次回の日程などが決まっている場合は、そこで案内しておくと良いでしょう。

# 懇親会

そのほか懇親会を別途行っている勉強会も多いです。懇親会について、横須賀支部では懇親会参加者も多くないですし、地殻にお店も多いことから基本的に予約なしでやっていますが、もし参加者が多い場合は予約などが必要になるかもしれません。

また、懇親会をやれることになっても大丈夫なように、最低限周辺のお店をいくつか探しておくと良いでしょう。


ひとまず、自分のところでやっている勉強会運営のルールについてはこれでおしまい。他にあればぼちぼち追記していきますので、気になる方はストックしておくと良いかも。
XCodeでStoryboardのオブジェクトアウトラインを表示する


storyboardにオブジェクトを色々と並べていくと、
クリックで目的のオブジェクトをつかむのが難しくなったり、
どの画面にどんなオブジェクトが配置されているのかを把握する事が難しくなります。

そういうときは、ナビゲーションメニューの
「Editor」->「Show Document Outline」で、
オブジェクトのリストをアウトラインで表示してやると捗ります。
photonコマンドで画像処理のレポート用に画像一覧HTMLを作る

動機
========================================
画像処理、コンピュータビジョンの研究開発をしていると処理結果を一覧するレポートの出力をするシチュエーションが多い。

- Microsoft OfficeやOpenOffice / LibreOfficeに手作業で画像を並べるのはしんどい
- restructuredText / markdownを手書きも結構めんどう
- 上記フォーマットやHTMLを出力するスクリプトを自作するのもメンテナンスが大変だし、作業ごとに項目が異なるので大変

そこでHTML画像アルバム生成コマンド photon を使用して画像一覧を作成する。

HTML画像アルバム生成コマンド
========================================
Ubuntuのsynapticで検索すると以下の3つのコマンドが見つかった

- album
- imageindex
- photon

"image html"で簡単に検索しただけなので他にも便利なツールはあるかも知れない。上の3つを試したところ、photonが行数、列数の指定やデフォルトの出力先の使い勝手が良いのでphotonについて記述する。

photonコマンド
========================================

```bash
# 画像のあるディレクトリを ./images として
photon ./images
```

上記のように実行すればデフォルトの出力ディレクトリ ./photos 以下にindex.htmlなどアルバムのHTMLが作成される。

主なオプション
========================================
自分がよく使うオプションをヘルプから抜粋する。

```
-d NUM  --display-columns=NUM   列数の指定
-l NUM  --display-lines=NUM     行数の指定
-o NAME --output-directory=NAME 出力ディレクトリの指定
-s LIST --sizelist=LIST         画像サイズの指定。1024x786という幅x高さの形式で指定する。0でオリジナルサイズ。デフォルトは"0,1024x768,800x600,640x480"。
-z      --compress              画像を圧縮する（デフォルトでは原画像を出力ディレクトリにコピーする）
```

自分の使い方
========================================
実験にて以下のように元画像1枚につき4種類の画像が出力されるとする。

```
./images/test_image1.binarize.png 
./images/test_image1.edge.png
./images/test_image1.gray.png
./images/test_image1.origin.png
./images/test_image2.binarize.png 
./images/test_image2.edge.png
./images/test_image2.gray.png
./images/test_image2.origin.png
./images/test_image3.binarize.png 
./images/test_image3.edge.png
./images/test_image3.gray.png
./images/test_image3.origin.png
.
.
.
```

```bash
# -d 4 : 列数4
# -l 300 : 行数300（1ページに収めたいため十分大きな値にしておく。行数が足りない場合、複数ページのHTMLが生成される）
# -z : 元画像がpngなのでレポートサイズ縮小のために圧縮をする
# -s 0 : レポートにつき縮小画像は不要なため0指定でオリジナルサイズのみにしておく（サムネイルは別途作成される）
# -o report : reportというディレクトリに出力する
#  ./images : ./imagesディレクトリ以下の画像のアルバムを生成する
photon -d 4 -l 300 -z -s 0 -o report ./images
```

画像の並び順は単純にファイル名順になる。実験の1セットのような扱いはできないため、画像のファイル名と列数指定で対応する（元ファイル名-処理名.pngのようにする）。処理の流れを見やすくするためには行内の順序を整えるために処理名に番号を振る必要もある。

スキン機能（まだ使っていない）
========================================
オリジナルのスキンを指定することで出力の見た目をカスタマイズできる。

Ubuntuのaptでインストールした場合、デフォルトのスキンは /usr/share/photon/templates 以下に photonv1 というディレクトリとして配置される。まずはこれを $HOME/.photon/templates/ 以下に任意の名前でコピーしてカスタマイズすれば良い。

```bash
mkdir -p $HOME/.photon/templates
cp -r /usr/share/photon/templates/photonv1 $HOME/.photon/templates/my_skin
```

スキンは以下のファイルで構成される。
- common_footer.html : 共通のフッタ
- image.html : 個別の画像のページ
- index.html : 画像一覧のページ
- movie.html : 動画ファイルのページ

コードを見る限り独自パーサのフォーマットのようだが、表示位置の調整などの簡単なカスタマイズならデフォルトのテンプレートを見れば雰囲気はつかめると思う。

作例
========================================
仕事でしか使わないのでOpenCVで適当にプログラムを作って作例とする。

左から原画像、グレイスケール、Cannyエッジ抽出、バイラテラルフィルタ。

横幅を削減するために、普段はスキンをカスタマイズしてファイル名を表示しないようにしている。

![Screenshot_from_2014-01-23 14:17:15.png](https://qiita-image-store.s3.amazonaws.com/0/25288/1527b911-ce30-ddf7-dc58-b9b176dd977c.png)
UIScrollViewのcontentOffset

UIScrollViewのcontentOffsetはスクロール位置を測るためによく使われるけど、contentSizeに対して値が変だなと思った部分があったのでまとめ。

# そもそもcontentOffsetとは

UIScrollViewのスクロール位置が初期状態(= contentOffset = {0, 0}）の状態からx, y方向にどれだけスクロールしたかを表す。y方向に+100pxスクロールしたらcontentOffsetは{0,100}になる。当たり前。

# contentSizeとcontentOffset

contentSizeはUIScrollViewのframe内の総サイズを表す。たとえば、200x200の画像を100x100のフレームでscale:1.0で表示させようとした場合のcontentSizeは{200,200}。これも当然。

# BouncingとcontentOffset

なのだけど、UIScrollViewにはbouncingオプションがあって、x,y方向へのぼよよ～ん処理が可能。この場合contentOffsetはどうなるかというと、例えばoffsetが{0,0}の状態で下に引っ張ってbouncingさせると{0,-xx}という値になる。maxがどこまでなのかは不明。とりあえず、contentOffsetはマイナスの値も取る。

逆に、端までスクロールしてそのままに引っ張ったときcontentOffsetはどうなるかというと、contentSizeの値は超えない。これがちょっと不思議だったけどよく考えたら納得。

なぜかというと、contentOffsetはどれだけスクロールしたかというよりはむしろ名前の通り、いま表示している領域の基準点（左上とか）がoriginからどれだけ離れているかを表しているから。なので、先の例だと画像を左上から右下までスクロールした場合のcontentOffsetの値は{200,200}ではなく{100,100}。

なので、x,y方向にどれだけの割合スクロールしたかを求めたい場合は、contentOffsetの値にbound.sizeの値を足してやる必要がある。なので、以下の様な式で計算するといまscrollViewがどれくらいスクロールしているのかがわかる。

スクロールした割合（%) = contentOffset + bound.size / contentSize

# contentInset

しかし、これにcontentInsetが設定されている場合、それも加味しなければならないので注意が必要。

**スクロールした割合（%) = contentOffset + bound.size - contentInset / contentSize**

かな？　自信ないけど
Macでパスワード付きZipの作成


仕事で使う必要があったのでメモ．．．。


ターミナルで次のコマンドを実行

```コマンド
zip -e 圧縮ファイル名.zip ファイル名
```

コマンド実行時にパスワード入力と確認入力を求められるので
パスワードを入力する。

ファインダーからターミナルに作業対象のディレクトリをドラッグすると
そのディレクトリでターミナルが開く。

1/24

Teru_Nanaoさんからコメント頂いたので追記。

ディレクトリごとの場合

```コマンド
zip -er 圧縮ファイル名.zip ディレクトリ名
```
excel2011 で印刷範囲設定


* レイアウトタブで「表示」から「標準」を選択
* 「改ページ」にチェックを付ける
* 「印刷」の「自動調整」のチェックを外す

すると「プリント範囲」を示す青い点線が表示されるので、適当なサイズに変更する。
WordPressのアイキャッチ出力からwidth,height属性を排除する方法

RSSにアイキャッチの画像を追加して他のサイトでそのRSS情報を表示したい。
で、その時アイキャッチ画像をそのままthe_post_thumbnail()で出力するとwidth,height属性が自動でついちゃうのでRSS情報を表示する先でサイズ変更の自由度が下がる。
なので、RSSに出力する際に正規表現でwidthとheightを削除して渡すようにする。

```php
<?php $html = get_the_post_thumbnail(); ?>
<thumb_img><![CDATA[<?php echo preg_replace('/(width|height)=\"\d*\"\s/', "", $html); ?>]]></thumb_img>
?>
```

&lt;thumb_img&gt;というエレメントをRSSに足してそこにアイキャッチ画像エレメントを追加。
この時、CDATAで文字列扱いにすること。PHPのsimplexml_load_file()で取得する時に、XMLのエレメントと思われちゃうので。
hetemlに設置したGitがResource temporarily unavailableでプロセスが死ぬ。


hetemlに設置したGitがpost-receiveで受け取っても
途中でプロセスが死ぬときのメモ。

レンタル鯖はメモリとかの割り当てが厳しいから起こるエラーかと思います。
（詳細な原因わかる方がいましたらコメントをお願いしますm()m

``` txt:error
remote: error: cannot fork() for unpack-objects: Resource temporarily unavailable
remote: fatal: fetch-pack: unable to fork off unpack-objects
```


## 解決方法
接続中のsshを切ると普通に動く ←

不必要に動いているデーモン切るのもいいのかも。
ps使えないけど。
multiple-cursors.elとsmartrep.elでまとめて一気に編集

コーディングしていると、複数の行に文字列を一括編集したり、
複数行の先頭、末尾に対して追加/削除したいケースが多々。
そんな時に、タイトルの2つを組合せて一気にやっつけることが出来る。

使い始めたばかりなので、特にキーバインドなど自分向け最適化の余地はありそうだが、
勢いで投稿してから、ゆっくりと馴染ませて行こうかと。

## multiple-cursors.el

[magnars / multiple-cursors.el](https://github.com/magnars/multiple-cursors.el)

複数行編集のためのpackage。
リンク先のVideoを見ると一発丸分かり。

## smartrep.el

[連続操作を素敵にするsmartrep.el作った](http://sheephead.homelinux.org/2011/12/19/6930/)

連続操作を楽にするためのpackage。
複数行編集に限らず、使い方によっては色々と幸せになれるはず。

## 設定

主に↓を参考にさせていただいた。

[multiple-cursors.elのキーバインドを少しだけ改善](http://tam5917.hatenablog.com/entry/20121208/1354931551)

のだったと思うが、かなりキーバインドが違う...な。

```el
(require 'multiple-cursors)
(require 'smartrep)
(declare-function smartrep-define-key "smartrep")
(global-set-key (kbd "C-M-c") 'mc/edit-lines)
(global-set-key (kbd "C-M-r") 'mc/mark-all-in-region)
(global-unset-key "\C-t")
(smartrep-define-key global-map "C-t"
  '(("C-t"      . 'mc/mark-next-like-this)
    ("n"        . 'mc/mark-next-like-this)
    ("p"        . 'mc/mark-previous-like-this)
    ("m"        . 'mc/mark-more-like-this-extended)
    ("u"        . 'mc/unmark-next-like-this)
    ("U"        . 'mc/unmark-previous-like-this)
    ("s"        . 'mc/skip-to-next-like-this)
    ("S"        . 'mc/skip-to-previous-like-this)
    ("*"        . 'mc/mark-all-like-this)
    ("d"        . 'mc/mark-all-like-this-dwim)
    ("i"        . 'mc/insert-numbers)
    ("o"        . 'mc/sort-regions)
    ("O"        . 'mc/reverse-regions)))
```

今の所、
`mc/edit-lines` または `mc/mark-all-in-region` と `mc/mark-(next|previous)-like-this`
の組合せばかりしか使用していないが、それでも十分に重宝している。

使いこなすためにも、他も積極的に利用していきたい所。
shared-mime-infoでファイルタイプを判別する

今更ながらに使ってみたのでメモしておく
shared-mime-infoは拡張子/ファイルの中身を見てファイルタイプを判別してくれる

jpeg_fileは拡張子を削ったjpegファイル

```sample1.rb
require "shared-mime-info"
MIME.check "jpeg_file"        #=> image/jpeg
MIME.check_globs "jpeg_file"  #=> nil
MIME.check_magics "jpeg_file" #=> image/jpeg
```

sample1で使ったファイルに拡張子png（拡張子偽装）してみた結果
MIME.checkだと、拡張子があればそちらが優先される様子

```sample2.rb
require "shared-mime-info"
MIME.check "jpeg_file.png"        #=> image/png
MIME.check_globs "jpeg_file.png"  #=> image/png
MIME.check_magics "jpeg_file.png" #=> image/jpeg
```
Xcode 5 で AssetCatalog 使うと iOS6 以下でアイコンの Gloss Effect がオフに出来ない？


**追記アリ**

まだ調査中ではあるが、Xcode 5 で登場した AssetCatalog なる機能 (内部的には単なるディレクトリの中に JSON とアセットリソースが突っ込まれてる感じかな？) を使うと、iOS7 未満の端末でアイコンの Gloss Effect (光沢エフェクト) がオフに出来ないっぽい。

本来であれば *Info.plist* が

```xml:Info.plist
<key>UIPrerenderedIcon</key>
<true />
```

な感じ (Xcode 上では `Icon already includes gloss effects` が `YES`) になっていれば光沢エフェクトが無効化されるはずなのだが、ウンともスンとも効かない。

試しに AssetCatalog を使わずに、個別にアイコンを指定してみると、見事に効いてくれたので、多分そういうコトなんだろう。

なお、 *<ProjectName>.xcodeproj/project.pbxproj* 的には `ASSETCATALOG_COMPILER_APPICON_NAME = ***;` っつー感じで記述されていると AssetCatalog を利用するってコトになるらしい。

<ins>2014/01/22 18:45 追記</ins>

そんなこたぁなくて、AssetCatalog 使っても Gloss off は出来るらしい。

詳しくは [コチラ](http://fista.hateblo.jp/entry/2013/09/19/175626) の記事を参照のこと。

[STAR_ZERO](http://qiita.com/STAR_ZERO) さまよりご指摘いただきました。ありがとうございます！
TomcatのコーヒーカップアイコンをDocに出さないようにする


# 方法
```
/usr/local/opt/tomcat/libexec/conf/catalina.properties
```
に`java.awt.headless=true`を追加

# 参考
[osx - org.apache.catalina.startup.Bootstrap on dock in Mac - Stack Overflow](http://stackoverflow.com/questions/9947197/org-apache-catalina-startup-bootstrap-on-dock-in-mac)
[Ruby]基礎から日記 [Ruby-33]

引き続き<a href="http://klis.tsukuba.ac.jp/klib/index.php?plugin=attach&refer=KISL%2Ftop&openfile=ruby.pdf>筑波大学の問題</a>。

>def zeikomi(nedan) print(nedan * 1.05, "円\n")
>end
>
>zeikomi(300)
>zeikomi(2600)

問題通りに動かすと結果に小数点がつく。しかし、普通「315.0円」とは言わないので、なんとか小数点を消したいと思った。小数点を消すなら「.round」か「.to_i」だと思うのだが、どこの後につけてもエラーになるばかり。

そんな中、「1.05」の後につけると「* 1.05」を実行せず、「.round」だけ実行して「300円」と表示されるのがおもしろかった。乗算よりも.roundが優先されるのか。