OmniAICreator/Qiita-1.07M huggingface dataset:
Matching Thunk Object in Optima

```cl
(use-package :trivial-lazy)
(use-package :optima)

;; (delay x) ~~ (lambda () x)

(defmacro lcons (a b)
  "cons whose car and cdr is lazy"
  `(cons (delay ,a)
         (delay ,b)))

(defpattern lazy (pattern)
  (with-gensyms (thunk)
    `(guard ,thunk (match (force ,thunk) (,pattern t)))))

(defpattern lcons (lcar lcdr)
  (with-gensyms (thunk1 thunk2)
    `(cons (lazy ,lcar)
           (lazy ,lcdr))))

;; This is OK
(match (lcons 1 2)
  ((lcons 1 2)
   t))

;; but this is not
(match (lcons 1 2)
  ((lcons a b)
   (+ a b)))
```

Any ideas?

RE: use the accessor functions (evaluated):

```cl
(defun lazy-consp (x)
  (consp x))
(defun lazy-conscar (x)
  (force (car x)))
(defun lazy-conscdr (x)
  (force (cdr x)))

(defpattern lcons (lcar lcdr)
  `(lazy-cons (car ,lcar) (cdr ,lcdr)))
  
;; then this works
(match (lcons 1 2)
  ((lcons a b)
   (+ a b)))
;; -> 3
```

Accessor functions accept only one argument.
Consider `x` in the above example. --- `x` is the object being accessed.

In order to specify how to get the value to be stored in the variable in the matching context (in the example above, `a` and `b`) we need additional arguments.

```
  x = (lcons 1 2)    --(lazy-conscar x)-->    1
 (accessed object)        (accessor)       (value)
                              ^
                              |
                              | this is specified by the constructor-pattern



  x   --(funcall #'(lambda (x) ...)  x)-->    value
                       ^
                       |                                
                       | we want to specify arbitrary accessor
                       | in the pattern matching clause.
```

The relationship between a `pattern clause` and the `accessor-function` is
currently hard-coded (in constructor-pattern) or require additional layer
(defpattern and gritchy lazy-consp/lazy-conscar/lazy-conscdr).


I sometimes think there are only two clauses needed in order to implement a
pattern matcher. They are `type` and `access` .
If everything is built on those clauses and `defpattern`, things should
be simpler. Imagine if `cons` pattern is not hard-coded and
implemented with `type`, `access` and `defpattern`.


```cl

(defpattern cons (car cdr)
  `(and (type cons)
        (access #'car ,car)
        (access #'cdr ,cdr)))
        
(match a
  ((cons b c)
   (some-op b c)))

;; is equivalent to

(match a
  ((and (type cons)
        (access #'car b)
        (access #'cdr c))
   (some-op b c)))
```

then the optima's compiler would be simple.
Any comments are welcome.

Note: I ignored `not` , `or` and `guard` clause.
Mac OS上のChromeで動画が再生しなくなったときの対処法

Chromeで動画サイトを閲覧していたら、突然数秒ごとに再生が停まるようになった。
下記対処法でした。

chrome://plugins/
をChromeブラウザで開き、
出てきた動画再生関連のプラグイン（FlashやQuickTimeなど）の
「常に許可する」チェックボックスをオンにする

すると、通常通り再生できましたよ。
Scene(Game)ビューにアイコンやギズモを表示する

知ってると色々便利なアレ。

#アイコンを表示する

インスペクタの左上のカラフルな立方体のアイコンをクリックすると、Sceneビュー上でのアイコンを設定出来る。
「〜Manager」や「~CheckPoint」のような不可視のゲームオブジェクトが存在する場合に便利。

![icon_2.png](https://qiita-image-store.s3.amazonaws.com/0/35356/5e189600-eb1d-739b-c2ec-8e5c16fe8835.png)
上段の横長アイコンはゲームオブジェクト名が中に表示される。

#ギズモを表示する

スクリプトにOnDrawGizmosを実装すると任意のギズモを表示することが出来る。

色や形はGizmosクラスのプロパティとメソッドを利用する事で指定可能。
http://docs-jp.unity3d.com/Documentation/ScriptReference/Gizmos.html

センサー等の判定範囲をColliderを使わずに実現する場合や基準点を確認したい時に便利。

```csharp:hoge.cs
using UnityEngine;
using System.Collections;

public class Hoge : MonoBehaviour
{
	[SerializeField]
	float radius = 0.5f;
	
	void OnDrawGizmos()
	{
		Gizmos.color = Color.red;
		
		Gizmos.DrawWireSphere(this.transform.position, this.radius);
	}
}
```

![gizmos.png](https://qiita-image-store.s3.amazonaws.com/0/35356/14626456-d66e-092d-44b4-2fbb611afeb9.png)


アイコンやギズモはデフォルトではSceneビューのみに表示されるが、Gameビューでも右上の「Gizmos」を有効にすると表示出来る。(アイコンもギズモの一種)
Google タグマネージャ(GTM) + Google analytics (ユニバーサル アナリティクス) を使って、手動でイベントトラッキングを行う方法

# Google タグマネージャ(Google Tag Manager : GTM)とは

>Google タグマネージャは無料で簡単に使用できるタグ管理システムです。ウェブ上の使いやすい管理画面から自分でタグを管理してモバイル アプリを設定できるため、面倒なコード書き換えは不要で、IT 部門に依頼する必要もありません。
>[Google タグマネージャ 公式サイト](http://www.google.co.jp/tagmanager/features.html)

# ユニバーサル アナリティクスとは

>ユニバーサル アナリティクスは Google アナリティクスの新たな運用基準で、間もなくすべてのアカウントでユニバーサル アナリティクスのご利用が必須となります。
>Google アナリティクスでユニバーサル アナリティクスのご利用を始めるには、いつくかの設定手順が必要です。
>[ユニバーサル アナリティクスについて](https://support.google.com/analytics/answer/2790010?hl=ja)

# イベントトラッキングとは

>「イベント」は、ウェブページやアプリのスクリーンの読み込みとは関係なくトラッキングできる、コンテンツに対するユーザーの操作です。ダウンロード、モバイル広告のクリック、ガジェット、Flash の要素、AJAX の埋め込み要素、動画の再生などはすべて、「イベント」としてトラッキングできます。
>[イベントについて](https://support.google.com/analytics/answer/1033068?hl=ja)

# Google タグマネージャ(GTM)から配信されたタグでイベントトラッキングを行う。

通常、ユニバーサル アナリティクスを使用し、たとえばaタグのクリック回数を計測したい場合、JavaScriptのga関数を使用し、次のように記載します。

```html
<!-- カテゴリが"button"、アクションが"click"、ラベルが"nav buttons"の場合 -->
<a href="" onclick="ga('send', 'event', 'button', 'click', 'nav buttons');">リンク</a>
```

しかし、Google タグマネージャを使用する場合、ga関数が隠ぺい化されてしまうため、Google タグマネージャの管理パネルよりタグを編集し、以下のように「トラッカー名」項目にチェックを入れます。

![img1.jpg](https://qiita-image-store.s3.amazonaws.com/0/644/e8f8b0e9-4e45-bd9e-2c50-c88e1d0d49bf.jpeg)

このとき、隣にあるテキストボックスには何も入力しません。

こうすることで、外部スクリプトからアナリティクスのオブジェクト（ga関数）にアクセスができるようになり、イベントトラッキングが利用できるようになります。
rbenvとruby-buildのインストール

rbenvと、それのプラグインruby-buildをインストールするには。

```sh:Terminal
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

と、上記を実行したあとに、

```sh:.bash_profile
rbenv=$HOME/.rbenv/bin
if [ -d "$rbenv" ]
then
  export PATH=$rbenv:$PATH
  eval "$(rbenv init -)"
fi
```

を`.bash_profile`もしくは`.bashrc`に書いておけば良い。と、昔書いたメモには書いてある。

---

……ふと気になったので自分の`.bashrc`を見たら以下のように書いてた。（`.bash_profile`は常に`.bashrc`を読み込むように書いてある）

```sh:.bashrc
rbenv=$HOME/.rbenv/bin
[ -d "$rbenv" ] &&
  export PATH=$rbenv:${PATH//$rbenv:/}
type rbenv >/dev/null 2>&1 && eval "$(rbenv init -)"
```

これはあれかな、`$ source $HOME/.bashrc`を実行しても再度`eval`しないようにしてるのかな。
jQueryで配列をPOSTする

今まで知らなかった。

## 下記だとPHP側で配列として扱えない

```js
$.ajax({
    url: 'post.php',
    data: {
        'arr': ['foo', 'bar', 'baz']
    }
});
```

## 下記だとPHP側で配列として扱える

```js
$.ajax({
    url: 'post.php',
    data: {
        'arr[]': ['foo', 'bar', 'baz']
    }
});
```

## 参考リンク

http://js.studio-kingdom.com/jquery/ajax/post
Closure Linterをインストールする

jslintでもjshintでもなくgjslint/fixjsstyle派な人向け。

```sh:Terminal
$ sudo easy_install http://closure-linter.googlecode.com/files/closure_linter-latest.tar.gz
```

もしくは

```sh:Terminal
$ sudo pip install http://closure-linter.googlecode.com/files/closure_linter-latest.tar.gz
```

でOKなのです。
Windows+CakePHP2.4.4でmod_rewriteのエラーが消えない場合のチェックポイント

##【状況】
cake.zipを展開し、設定エラーを取り除いている段階において、httpd.confの`#LoadModule rewrite_module modules/mod_rewrite.so`のコメントアウトを外したのに、

```
URL rewriting is not properly configured on your server. 1) Help me configure it2) I don't / can't use URL rewriting 
```

というエラーが消えない

##【チェック1】.htaccessが有効になっているか確認する

1. .htaccessの中に文法エラーになりそうな文字列を書き込んでみる。最初の一行に「test」と書くだけでもいい。これでリロードしてみる。

```.htaccess
test  #<--ここ
<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>
```

InternalServerErrorになっていればOK.
なっていない場合、次をチェック

##【チェック2】ドキュメントルートへの許可設定を確認する

1. httpd.confのドキュメントルートに対し、以下の設定があるか確認する。

```.httpd.conf
<Directory />
    Options FollowSymLinks  #<--ここ
    AllowOverride All  #<--ここ
　　Order allow,deny
    allow from all
</Directory>
```

ドキュメントルートを変更している場合は、そのパスが入っていることも確認

```.httpd.conf
<Directory "C:\MyDocumentRoot\cake"/>  #<--
    Options FollowSymLinks
    AllowOverride All
　　Order allow,deny
    allow from all
</Directory>
```

Apacheを再起動し、ページをリロードしてみる。
エラーが消え、スタイルシートが適用されていればOK.
まだ駄目なら次へ

##【チェック3】mod_rewriteが有効になっているか確認する。

1. コマンドプロンプトで、Apacheインストールディレクトリ\binへ移動し、以下を実行

`C:\Apache\bin>httpd -M`

ずらずらっとモジュールが表示されるので、「rewrite_module (shared)」を探す。
あればOK.
なければ。。。Windowsの場合、お手上げかも。
Apacheの再インストールから再挑戦どぞ。

#### 参考ページ
Ubuntuの場合の対処法がさらに詳細にあります
http://ms2.seesaa.net/article/168747804.html
【JavaScript】while(true)でループ処理

こんにちは。
寒いです。

僕は今まで比較演算子を使って、whileの中の判別を行っていたのですが
どうやらtrue or false　で行ける模様

今まで

```js
var condition = true ;
while(condition === true){
    console.log("loop!") ;
    condition = false ;
}
```

実際

```js
var condition = true ;
while(condition){
    console.log("loop!") ;
    condition = false ;
}
```

因みに今回加えて試したのが、
```break ;```　を記述することで、ループ処理を抜けることも可能。
if文を挿入して、とあるところまで来たらループ処理を抜けるみたいなことを
やるんでしょうかね。

それでは、これからも宜しくお願いいたします。
【CakePHP】リクエストの取得方法

## POSTメソッドのBODYデータ

$this->requestのdataメソッドまたはdataプロパティでアクセスできる。
dataプロパティだとnullチェックが必要なので、dataメソッドで取得した方がシンプル。

```html:html
<input type='text' name='data[User][id]' value='1'>
<input type='text' name='data[User][name]' value='suzuki'>
```

取得の際に、nameの先頭のdataという文字列は取り除かれる。
ドットつなぎでアクセスすることができる。該当データがない場合はnullが返る。
※実はdata()はdataプロパティへのアクセスをHash::get()で行っているだけ。

```php:dataメソッドでのアクセス
$id = $this->request->data('User.id');
//=>1
$name = $this->request->data('User.name');
//=>suzuki
$user = $this->request->data('User');
/*
[
'id'=>'1',
'name'=>'suzuki'
]
*/
```

ドットつなぎは数値でも有効。

```html:html
<input type='text' name='user[]' value='7'>
<input type='text' name='user[]' value='8'>
<input type='text' name='user[]' value='9'>
```

```php
$id = $this->request->data('User.2');
//=>9
```

※dataプロパティだとnullの場合にエラーが出るので、nullチェックが必要になる。

```php:dataプロパティでアクセス
if(isset($this->request->data['User']['id'])){
  $id = $this->request->data['User']['id'];
}
```

## GETメソッドのクエリストリング
※POSTメソッドのクエリストリングの値も同様の方法で取得できる。

urlが /posts/index?page=1&sort=titleの場合。

$this->requestのqueryメソッド(CakePHP 2.3以降)またはqueryプロパティでアクセスできる。
queryプロパティだとnullチェックが必要なので、queryメソッドで取得した方がシンプル。

```php:queryメソッドでのアクセス
$page = $this->request->query('page');
```

※queryプロパティだとnullの場合にエラーが出るので、nullチェックが必要になる。

```php:queryプロパティでアクセス
if(isset($this->request->query['page'])){
  $page = $this->request->query['page'];
}
```

##nameとの対応詳細
[]とするとシーケンスが入るっぽい。

###name=hoge
```html
<input name=hoge>
```
```php
'hoge'=>'入力した値1'

//data['hoge']で取得
```

###name=hoge[]
```html
<input name=hoge[]>
<input name=hoge[]>
```
```php
'hoge' => array(
  (int) 0 => '入力した値1',
  (int) 1 => '入力した値2'
)
//data['hoge'][0]で取得。
//もしくは
//foreach(data['hoge'] as $v){
//で取得。
```

###name=hoge[][]
```hmtl
<input name=hoge[][]>
<input name=hoge[][]>
```
```php
'hoge' => array(
  (int) 0 => array(
    (int) 0 => '入力した値1'
  ),
  (int) 1 => array(
    (int) 0 => '入力した値2'
  )
)
```

##name=hoge[fuga][]
```html
<input name=hoge[fuga][]>
<input name=hoge[fuga][]>
```
```php
'hoge' => array(
  'fuga' => array(
    (int) 0 => '入力した値1',
    (int) 1 => '入力した値2'
  )
)
```

##name=hoge[][文字列]
```html
<input name=hoge[][fuga]>
<input name=hoge[][fugafuga]>
```
```php
'hoge' => array(
  (int) 0 => array(
    'fuga' => '入力した値1'
   ),
   (int) 1 => array(
    'fugafuga' => '入力した値2'
   )
)
```

##name=hoge[シーケンス][文字列]
save($this->request->data['hoge']);で保存可能な形式となっている。

```html
<input name=hoge[0][fuga]>
<input name=hoge[0][fugaguga]>
<input name=hoge[1][fuga]>
<input name=hoge[1][fugaguga]>
```
```php
'hoge' => array(
  (int) 0 => array(
    'fuga' => 'fasfa',
    'fugafuga' => 'fdsafda'
  ),
  (int) 1 => array(
    'fuga' => 'asfsadf',
    'fugafuga' => 'afdsaf'
  )
)
```
あまり見かけないPHPの記述方法

誰かの作っているシステムのコードを読んでいると、おや？と思うコードの書き方が見つけられたりします。
ちょっと面白いなと思った記述をまとめてみました。

## 文字列の位置アクセス
PHP5.5で変数に格納されていない文字列に対しても位置アクセス出来るようになったので割りとメジャーな方法だとは思う。
実はアクセス方法が２通り存在する。

```php
$chars = 'ab';
// 多分一般的な方法
echo $chars[0] // 'a'
// 実は`{}`でもいい
echo $chars{1} // 'b'
```

## 条件式
左辺の真偽を判定して右辺を実行します。
フレームワークのコード中などで割とよく見かける書き方。
右辺で`return`とか`echo`などは使えない。

```php
$foo = 'foo';
isset($bar) OR  $bar = 'bar';
isset($foo) AND $foo .= $bar;

// $foo -> 'foobar'
// $bar -> 'bar'
```

## インスタンス生成とメソッドチェーン
インスタンスの生成とメソッドのコールを同時に行える方法。
インスタンス生成を`()`でくくることでそのままメソッドをコール出来るようになるみたい。

```php
class Foo {
  public function output() {
    echo 'foo';
  }
}

(new Foo())->output(); // 'foo'
```

## 何の効果があるのか分からない波括弧
コードの途中に波括弧を書くことが出来ます。
他の言語のようにObjectになるわけではありません。
スコープが変わるなんてこともありません。

```php
class Bar
{
    public function bar()
    {
        { $nami_kakko = 'nami kakko'; }
        { $nami_kakko .= ' imiha nai.'; }
        echo $nami_kakko; // nami kakko imiha nai.
    }
}
```

## コメント
よく用いられるコメントの記述は`//`や`/*...*/`ですが、`#`でコメントをつけることも出来ます。

```php
// こめんと
/* こめんと */
# こめんと
```

## whileループ内でswitch文のbreakとwhile文のbreakを満たす方法

phpには`swith`の特定の条件を満たしたら`while`を`break`して抜けたいのに、
`switch`の中に`break`があると`switch`を抜けるというふうに解釈されて、
`while`から抜けられないなんてトラップがあります。

以下のような書き方で解決出来るようです。

```php
while(true) {
    switch ($foo) {
      case FOO:
          echo 'foo!';
          break 2; // <- breakの後ろに2と書くとwhileループが終了する
      case BAR:
          echo 'not foo, it bar!';
          break;
      case BAZ:
          echo 'not foo, it baz!';
          break;
      default:
          echo 'not meta word.';
          break;
    }
}
```
## まとめ？
コードゴルフとか見てると他にも色んな書き方が存在していて面白いですね。
Homebrewメモ


参考URL：[http://d.hatena.ne.jp/takuya_1st/20111224/1324750111]()

####homebrew本体と、formula情報（xxx.rb）のアップデート
*brewでインストールしたパッケージは更新されない！*  

```
brew update
```

####formula（パッケージ）のインストール

```
brew install パッケージ名
```

####formula（パッケージ）のアンインストール

```
brew uninstall パッケージ名
```

####formulaの検索

```
brew search パッケージ名
brew -S <検索ワード>
```

####インストールパッケージの一覧
*--versionsオプションを付けるとパッケージのバージョンも表示する*

```
brew list [--versions]
```

####インストールパッケージの中で最新でない物を一覧表示

```
brew outdated
```

####最新でない（outdated）パッケージを更新する

*Formula情報ではなく、パッケージ本体の更新。*  
*パッケージ名は省略可能。パッケージ名を指定しなければ、全ての最新でないパッケージが最新の物になる。*

```
brew upgrade [パッケージ名]
```

####古いバージョンのパッケージを削除
*パッケージ名は省略可能。パッケージ名を指定しなければ、全ての古いバージョンのパッケージが削除される。*

```
brew cleanup [パッケージ名]
```

####formula の情報を見る

```
brew info パッケージ名
```

####brewの環境情報

```
brew --env
```


####brewの本体情報

```
brew --config
```

####シンボリックリンクの作成と削除

```
brew link パッケージ名
brew unlink パッケージ名  
```

####メモ
古いバージョンのパッケージは明示的に削除しない限り残り続ける。  
各パッケージの最新バージョンは「/usr/local/bin」または「/usr/local/sbin」配下にシンボリックリンクが作成される。  

####用語
#####formula
Homebrew では、いわゆるパッケージ名のことを formula と呼ぶ。  
brewにてインストール可能な各パッケージのインストール情報。  
実態は`/usr/local/Library/Formula`にあり、`xxx.rb`に記述されている。  

#####Cellar
デフォルトは `/usr/local/Cellar`  
インストールしたパッケージの実体は`/usr/local/Cellar`にあり、`/usr/local/bin/`や`/usr/local/lib/`にシンボリックリンクが作られる。  


####Homebrewインストール後初回作業
Homebrewでインストールしたパッケージと、Macに最初から入っていたパッケージがある場合、Homebrewでインストールした方を使うようにする為に、`~/.bash_profile`に以下を追記。

```
export PATH="/usr/local/bin":$PATH
```
IntelliJでgitに大量のファイルをaddする方法（初めてのadd等）

IntelliJからgitに対して、複数のファイル/ディレクトリを右クリックしてからaddすると、ちゃんとaddされないことが多々あります。
また、大量にファイルを新規作成した場合に、全てを探し出して右クリックするのも面倒です。
そこで、IntelliJでGitによってバージョン管理されていないファイルを一気にバージョン管理下に置く方法をご紹介します。

##まずはプロジェクトでIntelliJとgitを統合する。
初回に一回だけやっておく作業です。
これは簡単で、メニューの`VCS`から`Enable Version Control Integration...`を選択して、次に出てきた小さい画面で、`Git`を選択してからOKをクリックするだけです。
もちろん事前にgitをインストールしておく必要があります。(Windowsの場合でいうと、IntelliJからgit.exeが利用されます)

## 実際にファイルをバージョン管理対象に追加する。
上記手順を踏んで、プロジェクトでGitがIntelliJと統合されたら、デフォルトだと左下の方に`Chagnes`というタブが出てきます。
そこで、`Click to browse`をクリックします。

![all1.png](https://qiita-image-store.s3.amazonaws.com/0/11059/9296afc0-8ba2-59ae-3caa-c03d5f7595e7.png)

次の画面でバージョン管理されていないファイルの一覧が表示されます。
一番上のディレクトリを選択して、左側の`+`ボタンをクリックすることで、`.gitignore`で指定されていない全ファイルを一気にバージョン管理対象とすることが出来ます。
    
![all2.png](https://qiita-image-store.s3.amazonaws.com/0/11059/e0c7465b-1ac3-5d1d-871d-e85a1acf2ac8.png)

実際に`+`をクリックするとこのような状態に。
なお、 **この時点ではコミットされていません。** あくまでバージョン管理対象となっただけです。コミットは別途行う必要があります。

![all3.png](https://qiita-image-store.s3.amazonaws.com/0/11059/2a1610a5-7fa4-f74a-fffb-7071ab57ea96.png)

`Close`をクリックするとダイアログが閉じて、先ほどの`Changes`タブが更新されます。

![all4.png](https://qiita-image-store.s3.amazonaws.com/0/11059/b18e7a75-bb63-d912-a3e7-ef45341b9e94.png)

これで全てのファイルがバージョン管理対象となりました。
しつこいですが、 **まだコミットはされていません。** メニューの`VCS`から`Commit Changes`を選択するか、上向きの緑色の矢印アイコンをクリックすればコミット用ダイアログが表示されるので、そこからコミットできます。

##メモ
IntelliJでのgitを使ったコミットは、`git add`と`git commit`を両方同時に実行しています。
[Grails].gitignoreの生成

##gitignoreの生成
以下のコマンドを実行する。

`grails integrate-with --git`

##IntelliJ用の記述
プロジェクト直下に出来た.gitignoreに以下を追記する。

```
/.idea/
/*.iml
/*.ipr
/*.iws
```

これで完了。
Groovyでコンパイル時に型チェック

今更ですが、Groovyでコンパイル時に型をチェックするする方法をまとめました。

```groovy
import groovy.transform.TypeChecked
import groovy.transform.CompileStatic

/**
 * コンパイル時点でエラーが出れば、態々実行してテストする必要がなくなるのは自明。
 * 例えば下記のreturnCheck()メソッドの場合、ifの両方の条件を通るテストをしないと、
 * 意図していない型の値が返されるというバグが分からない。
 * (returnCheck()場合はIntegerを返す筈なのにStringが帰えされるバグがある)
 *
 * @TypeCheckedはコンパイル時に型をチェックするので、それが出来ない動的な機能は基本的に使えない。
 * なお、コンパイル時点でチェックするのみで、生成されるバイトコードは@TypeCheckedが無いものと同じ。
 * @CompileStaticを使うと、動的な機能が含まれないバイトコードになるため、基本的に実行の高速化・ファイル容量の減少が期待できる（はず）
 */

//@TypeChecked    // コンパイル時にチェックするだけ。
@CompileStatic    // コンパイル時にチェックし、生成するバイトコードも変化する(実行速度の向上)。
class Hoge  {
    
    def static main(args) {
        // 存在しないメソッド・変数を実行する。
        // これがコンパイルエラーに出来る。
        unknownMethod()
    }

    // Integer型の戻り値のはずなのに、Stringが帰る可能性がある。
    // これがコンパイルエラーにできる。
    Integer returnCheck(b) {
        if(b) {
            1
        } else {
            "string"
        }
    }

    // 引数aの型はStringなのに、Integer型のbに変数を代入している。
    // メソッド引数でなくとも、普通の代入でも同様。
    // これがコンパイルエラーに出来る
    // なお、実行時にDate以外の値を渡すと、実行時例外となる。
    def assignmentCheck(String a){
        Integer b = a
        Integer c = new String()
    }

    // 別のクラスのメソッドを呼ぶ際に、誤った型を渡す。
    // これがコンパイルエラーにできる。
    // "呼び出す側"に@TypeCheckedが宣言されている必要がある。
    // 当然Mock#add()の引数が型付で宣言されている必要がある。
    def callOther(){
        def mock = new Mock()
        mock.add(1,"2")
    }
}

class Mock{
    def add(Integer a, Integer b){
        a + b
    }
}
```
【自分メモ】rubyのコード練習はこれできまいり！「irb」コード確認にも使える。ん？nilってなに？nilとは？


正月はもち食べた千葉です。もちもち。
今日は、自分用のメモなのです。
当たり前のこと書いてるかもしれません。
完全なる自分用メモなのです。

#irb使ってみる
irbを使うと、rubyをshやbashみたいに使えます。

    $irb
    irb(main):001:0> puts "hello.world"
    hello.world
    => nil
    irb(main):002:0> 
    irb(main):003:0* 
    irb(main):004:0* quit

echoみたいですね。
便利です。これで練習しまくりです。

##あと、rubyは()を省略できる。人にやさしい。
以下、どちらでも書けます。

    irb(main):002:0* puts("banana")
    banana
    => nil
    irb(main):003:0> 
    irb(main):004:0* puts "banana"
    banana
    => nil
    irb(main):005:0> 
    irb(main):006:0*

## ん？「nil」っってなんぞおぉぉおぉおぉぉおぉーー？？煮る？nilとは？

なぜ「puts」は「nil」を返しているかが疑問
調べたけどあんまり腹に落ちてない。

    irb(main):006:0* a=
    irb(main):007:0* puts a
    nil
    => nil
    irb(main):008:0> 

nilは何も代入されてないってこと。変数にはデフォルトでnilが入ってるみたい。ふむ。つまり空ということ。

    true,false,nil
    真：true
    偽：false,nil

さらにわからんくなりますね。私だけ？
nilだったら偽と判定。

で、なぜ「puts」は成功しているのに偽である「nil」を返しているか。putsの戻り値はnilです。決まってますと言われたら、そうですかとしか言えません。パニック。

と、思ったらヒラメめき＆腹に落ちた。
「puts」の戻り値（return値）は、なし（空）ですよという意味ですか。奥が深い。
vimfilerの設定

最近vimfilerに移行したので、設定を晒してみる。

```vim
let g:vimfiler_as_default_explorer=1
```
vimfilerをデフォルトにする。`:e .`でもvimfilerが開く。

```vim
let g:vimfiler_ignore_pattern='\(^\.\|\~$\|\.pyc$\|\.[oad]$\)'
```
無視するファイルのパターン。
これにフィットすると隠しファイル扱いになる。
ファイラで開いても仕方無いバイナリファイルは無視に指定した。
標準キーマップでは`.`で隠しファイルが表示される。

`.gitignore`のやつを勝手に追加してくれたりすれば便利なのにな。

```vim
nnoremap <C-f> :VimFilerCurrentDir<CR>
inoremap <C-f> <ESC>:VimFilerCurrentDir<CR>
```
現在のファイルのディレクトリでvimfilerを開く。

```vim
nnoremap <C-x><C-f> :VimFiler -project<CR>
inoremap <C-x><C-f> <ESC>:VimFiler -project<CR>
```
プロジェクトホーム（.gitのあるディレクトリ？）をvimfilerで開く。
たまに上手く動かない。

```vim
nnoremap <C-x><C-@> :Unite -direction=botright -default-action=vimfiler directory_mru<CR>
```
こちらはunite.vimの設定だけど、
directory_mruのソースを使用すれば
最近移動したディレクトリにunite.vim経由で移動できる。
デフォルトのアクションはvimfilerでないので、オプションで指定する。
`-direction`は表示する位置で特に関係ない。
veeweeでVagrant用のboxをつくったメモ


成果物 => https://github.com/luckypool/veewee-ubuntu-saucy-64

### はじめに

veeweeで base box をつくるモチベーションは下記のような感じ

- [Vagrant](http://www.vagrantup.com/) は気軽に scrap & build できてアツい
- [vagrantbox.es](http://www.vagrantbox.es/)で各種 base box が配布されてて、気軽に使える
- しかし **人様のboxは何をどうやって作ったか分からん** ので base box 自分でつくりたい

ってことで[veewee](https://github.com/jedi4ever/veewee)をつかってみました

なんで veewee？

[packer](http://www.packer.io/)でも base box を作ることができます。しかし、documentをみながら一つ一つ設定していくのは結構手間がかかります。また、基本設定はなんだかんだ同じようなはずなので、先人の知恵([veewee/templates](https://github.com/jedi4ever/veewee/tree/master/templates))が詰まってるveeweeが便利そうです。また、状況によって template を自分好みに修正すれば良さそうです。

今回はVagrantで使うVirtualBoxのイメージを作ってみました。

以下はそのメモです。

### About “veewee”

そもそも veewee って何か？
「VMイメージを簡単に作る便利ツール」です。gemになってます。
Vagrant, VirtualBox, VMWare, KVMなどのイメージをつくることができるようです。

- 詳しくはREADMEで => https://github.com/jedi4ever/veewee/blob/master/README.md
- docsはこちら => https://github.com/jedi4ever/veewee/tree/master/doc

### Requirements

- https://github.com/jedi4ever/veewee/blob/master/doc/requirements.md
- 私の作業環境はmacで、[rbenv](https://github.com/sstephenson/rbenv/#installation)使ってます

### Installation

- https://github.com/jedi4ever/veewee/blob/master/doc/installation.md
- gem になってるので、簡単 `gem i veewee` とかでOK
- もしくは Gemfile に書いて、`bundle install`するなど

### Using template

- https://github.com/jedi4ever/veewee/blob/master/doc/vagrant.md


```bash
bundle exec veewee vbox templates | grep -i ubuntu
```

こんな感じで ubuntu の base box のテンプレート一覧が取得出来ます。
私は学生時代 yum よりは apt にお世話になってたので、 `ubuntu-13.10-server-amd64` のテンプレートを使うことします。 

```bash
bundle exec veewee vbox define ‘ubuntu-saucy-64’ ‘ubuntu-13.10-server-amd64’
```

すると `definitions`ディレクトリ以下に下記のようなスクリプト（テンプレート）が作られます。

```bash
definitions
└── ubuntu-saucy-64
    ├── apt.sh
    ├── build_time.sh
    ├── chef.sh
    ├── cleanup.sh
    ├── definition.rb
    ├── parallels.sh
    ├── preseed.cfg
    ├── puppet.sh
    ├── ruby.sh
    ├── sudo.sh
    ├── vagrant.sh
    └── vbox.sh
```

このままでもOKですが、私は`preseed.cfg`を2箇所だけ修正しました

- localeを `ja_JP.utf8` に
 - https://github.com/luckypool/veewee-ubuntu-saucy-64/blob/master/definitions/ubuntu-saucy-64/preseed.cfg#L2
- timezone を `Asia/Tokyo` に
 - https://github.com/luckypool/veewee-ubuntu-saucy-64/blob/master/definitions/ubuntu-saucy-64/preseed.cfg#L9

他にも修正したい場合はドキュメント参照しましょう

- https://github.com/jedi4ever/veewee/blob/master/doc/customize.md


### Build box

```bash
bundle exec veewee vbox build ubuntu-saucy-64
```

これで iso イメージのダウンロードから基本設定までやってくれます。GUIをオフにすることもできるようですが、勝手に設定されてくのを眺めるのも面白いです。

### Export box

```bash
bundle exec veewee vbox export ubuntu-saucy-64
```

これで `ubuntu-saucy-64.box` が生成されます
そして、ログにあるとおりにboxを追加して `vagrant up` するだけです :)

```bash
vagrant box add ubuntu-saucy-64 ./ubuntu-saucy-64.box
vagrant init ubuntu-saucy-64
vagrant up
vagrant ssh
```

### おわりに

成果物 => https://github.com/luckypool/veewee-ubuntu-saucy-64

- veewee は先人の知恵([veewee/templates](https://github.com/jedi4ever/veewee/tree/master/templates))が詰まってる
- このtemplatesを参考に修正していけばカスタムbase boxがつくれる
- [README.md](https://github.com/jedi4ever/veewee/blob/master/README.md)見れば大抵のことは事足りるので簡単です

base box 作ったらあとは chef で煮るなり焼くなりして遊びましょう。

以上！
ある整数にもっとも近い素数を求める

ご祝儀の金額を素数にして割り切れなくするという洒落たことをした記事を見かけて触発された。

_[こちら](http://qiita.com/damassima/items/0e819a532ae1737a5d38)にEnumerable#each_consとEnumerable#lazyを使ってそれっぽく書き直したものを投稿しました。_

```rb
require 'prime'

class Prime
  def nearest_prime? (n)
    d = 0
    loop do
      p = n + d
      break p if Prime.prime? p
      p = n - d
      break p if Prime.prime? p
      d += 1
    end
  end
end

Prime.nearest_prime? 30000
=> 30011
Prime.nearest_prime? 50000
=> 49999

```

んーrubyぽくない
さくらVPSにPostgreSQLをインストール


おかしいとこもあるだろうけど自分用のメモとして。

##リポジトリを追加

```
$ wget -P /tmp http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-1.noarch.rpm
$ sudo rpm -ivh /tmp/pgdg-centos93-9.3-1.noarch.rpm
```

##PostgreSQL9.3をインストール

```
$ sudo yum install -y postgresql93-server.x86_64 postgresql93-devel.x86_64 postgresql93-contrib.x86_64
```

##初期設定

- DBの初期化

```
$ sudo /etc/rc.d/init.d/postgresql-9.3 initdb
データベースを初期化中:                                    [  OK  ]
```

- 設定ファイルを修正

```
$ sudo vim /var/lib/pgsql/9.3/data/postgresql.conf
```
で設定ファイルを開いて

- 他のホストからのアクセスを可能にする

```
listen_address = '*'
```

- ログの出力形式変更（日付 ユーザ DB）

```
log_line_prefix = '%t %u %d'
```

- PostgreSQLの起動

```
$ sudo /etc/rc.d/init.d/postgresql-9.3 start
postgresql-9.3 サービスを開始中:                           [  OK  ]
```

- 自動起動設定

```
sudo chkconfig postgresql-9.3 on
```

- パスワードの設定

```
$ su
# passwd postgres
ユーザー postgres のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。
```

- ユーザの作成

```
$ sudo su - postgres
$ psql
# create user [ユーザ名]
# alter role [ユーザ名] with createdb;
```

- DBの作成

```
$ createdb [DB名] -U [ユーザ名]
```
C++でHello World


##この記事の概要

ちょっと仕事で使う機会が出てきたので軽く触っておこうかと思い。


## コンパイラのインストール

yumでインストール

```
$ sudo yum install gcc-c++
```

## Hello worldを書いてみる

早速書いてみます。
・count、endlなどは「std」という名前空間にある
・stdは繰り返し使用するため「using namespace std;」と記述するのがお作法らしい

```C++
#include <iostream>

using namespace std;

int main(){
  cout << "Hello world." << endl;
  return 0;
}
```

## コンパイル
g++の場合、下記コマンドでコンパイルできるようです。

```
$ g++ -o hello hello.cpp
$ ls
hello  hello.cpp
```

## 実行


```
$ ./hello 
Hello world.
```
できました！
Safari(iPhone/iPad)のホーム画面用WEBサイトアイコンを環境毎に変える

# Safari(iPhone/iPad)のホーム画面用WEBサイトアイコンの設置

iPhone/iPadのSafariでは、任意のWEBサイトのショートカットを端末のホーム画面に置くことができます。

![IMG_1268.PNG](https://qiita-image-store.s3.amazonaws.com/0/35733/3cf7d825-0a52-3f2b-cbc8-cfe3e89531a0.png) ![IMG_1269.PNG](https://qiita-image-store.s3.amazonaws.com/0/35733/dce2b136-207a-0d20-b4dc-f7c46977ac7a.png)

上記はAppleのサイトの例ですが、このリンゴのアイコンはAppleのサイトで用意されたアイコン画像です。

スマフォ向けWEBサイトを作成する際に、同じようにアイコン画像を用意する場合は、URLドメイン直下に `apple-touch-icon.png` を置きます。

`http://dev.hoge.com/apple-touch-icon.png`

このようにすることで、ユーザがショートカットを作成した際のアイコン画像を指定できると共に、サーバ側でApahceの404エラーが記録されるのを防ぐことができます。
（実験したところ、ショートカットからWEBサイトを開くたびに `apple-touch-icon.png` へのリクエストがサーバ側にありました。）

## 参考

試してはいませんが、端末の解像度毎に `apple-touch-icon.png` を用意することもできるようです。
[apple-touch-icon.pngをサイトに設定する意味のまとめ](http://www.drk7.jp/MT/archives/001831.html)

# 環境毎にWEBサイトアイコンを変える

スマフォ向けWEBサイトを開発していると、サーバ環境が開発1、開発2、開発3.. と幾つもあったり、それ以外にもステージング環境、本番環境があったりします。
スマフォ端末でデバッグする際「このサイトってどの環境だっけ？」という混乱を防ぐ手の一つとして、上で説明したホーム画面用のWEBサイトアイコンを環境毎に変えておくのもよいかと思います。
（もしくは事故が起こらないよう、本番とそれ意外だけ変えておくなど。）

ただソースの管理上、複数の異なる `apple-touch-icon.png` を同一リポジトリに混在させると管理がややこしくなります（もしくはソース管理はしないか、デプロイプロセスで何とかするか）。
これを解決する一つの方法として、Apacheの mod_rewrite を利用し、`apple-touch-icon.png` に対するHTTPアクセスを別ファイルのアクセスへ書き換える方法があります。

環境毎に `apple-touch-icon_[HOST名].png` を用意し、

```:用意するpngファイルの例（ドキュメントルート直下に全て配置）
apple-touch-icon.png ←環境毎のアイコンが存在しなければ適用される
apple-touch-icon.dev.hoge.com.ico
apple-touch-icon.staging.hoge.com.ico
apple-touch-icon.production.hoge.com.ico
```

サーバのドキュメントルート直下の .htaccess に次のように記載します。

```apache:.htaccess
RewriteEngine on

RewriteCond %{DOCUMENT_ROOT}/apple-touch-icon_%{HTTP_HOST}\.png -f
RewriteRule ^apple-touch-icon\.png$ /apple-touch-icon_%{HTTP_HOST}.png [L]
```

*適用イメージ*
![IMG_1263.PNG](https://qiita-image-store.s3.amazonaws.com/0/35733/9b6aede9-0a28-aa92-8c5e-a980e37c857c.png)

この例だと、単純にホーム画面上のアイコンのタイトルを変えておくだけでもいいかもしれません^^;
ただ今回はアクセスドメインでアイコンを切り替えましたが、これを応用すれば、例えば同一ドメイン下に複数の異なる性質のコンテンツがある場合（もしくは複数のサービスで同一ドメインに相乗りしている場合）にアイコン画像を切り替えたりもできます。

# おまけ：PCブラウザ用のアイコンの場合

PCブラウザ用のアイコンは、URLドメイン直下の `favicon.ico` が適用されます。

`http://dev.hoge.com/favicon.ico`

*適用イメージ*
![スクリーンショット 2014-01-26 0.04.05.png](https://qiita-image-store.s3.amazonaws.com/0/35733/2f893041-ecfd-a9bc-b1ca-5754074de301.png)

これを各種サーバ環境（開発/ステージング/本番/etc..）で変更したい場合は、環境毎に `favicon_[HOST名].ico` を用意し、

```:用意するicoファイルの例（ドキュメントルート直下に全て配置）
favicon.ico ←環境毎のアイコンが存在しなければ適用される
favicon.dev.hoge.com.ico
favicon.staging.hoge.com.ico
faficon.production.hoge.com.ico
```

サーバのドキュメントルート直下の .htaccess に次のように記載します。

```apache:.htaccess
RewriteEngine on

RewriteCond %{DOCUMENT_ROOT}/favicon_%{HTTP_HOST}\.ico -f
RewriteRule ^favicon\.ico$ /favicon_%{HTTP_HOST}.ico [L]
```

*適用イメージ*
![スクリーンショット 2014-01-26 0.04.05.png](https://qiita-image-store.s3.amazonaws.com/0/35733/2f893041-ecfd-a9bc-b1ca-5754074de301.png) ![スクリーンショット 2014-01-26 0.10.19.png](https://qiita-image-store.s3.amazonaws.com/0/35733/7408f3a3-a94c-17cf-caa0-a35ce498ff39.png)
Rubyのインストール〜Hello Worldまで(CentOS5)


## この記事の概要
Rubyやってみたいと思いつつ、全然手をつけられていなかったので、いい加減やろうかと。
そもそもRubyってどんな言語なの？というところで[こちら](http://kotobank.jp/word/Ruby?dic=ascii)より引用させていただきました。
>1993年にまつもとゆきひろ氏が開発したオブジェクト指向のスクリプト言語。テキスト処理能力に優れており、Perlからの乗り換えユーザーが多い。はじめからオブジェクト指向言語として開発されているため、データ構造はすべてオブジェクトとして扱われ、オブジェクトに対するインターフェースが統一されているなどの特徴を持つ。UNIX、Linux、Windows、Mac OSといった、主要なOSで利用できる

オブジェクト指向言語なんですねーいいですね。
早速開発環境に入れてみようと思います。
環境はCentOS5系です。

## Rubyのインストール
バージョンによっては他ツール(Redmine等)を導入する際にうまく動かなかったりするらしい。
ので、ここではyumでなくソースからインストールしてみます。

```
$ cd /usr/local/src
$ sudo wget http://cache.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p448.tar.gz
$ sudo tar zxvf ruby-1.9.3-p448.tar.gz 
$ cd ruby-1.9.3-p448
$ sudo ./configure
$ sudo make
$ sudo make install

$ ruby -v
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux]
```
入りました。

## コマンドラインの実行

-eオプションを使用します。
-eオプションについては[こちら](http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2frubycmd.html)に記載がありました。
>コマンドラインからスクリプトを指定します。-eオ プションを付けた時には引数からスクリプトファイル名を取りません。

>-e オプションを複数指定した場合、各スクリプトの間に改行を 挟んで解釈します。

とのこと。
とりあえず試してみます。

```
$ ruby -e 'print "Hello World\n"'
Hello World
```

こんな風に改行しながらの入力もできました。

```
$ ruby -e 'print"
test
"'

test
```

##ファイルの作成・実行

続いてファイルに記述してみます。

```
$ vim first.rb
$ cat first.rb 
#!/usr/local/bin/ruby

print "Hello World\n"

$ chmod 755 first.rb 

$ ./first.rb 
Hello World
```

## メソッドの定義・実行

では、メソッドはどう書くのか？
「def」で定義できるようです。

```
$ vim func.rb
$ cat func.rb 
def printStr
    print("Hello World\n")
end

printStr

$ ruby func.rb 
Hello World
```

できた。
もうひと頑張りしてみます。
func.rbを下記のように修正。


```ruby
#!/usr/local/bin/ruby
def printStr(name)
    msg = "Hello," + name + "\n"
    puts(msg)
end

if ARGV.size != 1
    print "ex) $ ruby func.rb hoge\n"
    exit
else
    name = ARGV[0]
end

printStr(name)
```

権限変更 & 実行

```
$ chmod 755 func.rb 

$ ./func.rb Test
Hello,Test

$ ./func.rb 
ex) $ ruby func.rb hoge
```

## クラスの定義・実行

ここまできたらクラスも書いてみたくなりました。
・インスタンス生成は「クラス名.new(引数)」のように記述する
・コンストラクタは「initialize」

上記踏まえ、func.rbを下記のように修正。

```ruby
#!/usr/local/bin/ruby

class Func
    def initialize(name)
        @name = name
    end

    def printStr()
        msg = "Hello," + @name + "\n"
        puts(msg)
    end
end

if ARGV.size != 1
    print "ex) $ ruby func.rb hoge\n"
    exit
else
    name = ARGV[0]
end

func = Func.new(name)
func.printStr()
```
実行

```
$ ./func.rb Test
Hello,Test
```

できました。
本記事で作成したソースコードは[github](https://github.com/otajisan/work/blob/master/ruby/func.rb)にも上げてあります。
山折り谷折り

@mtsmfm氏の解答 http://qiita.com/mtsmfm/items/9c567d40b315046cc8e6 のもろパクリとなってしまいました、またも敗北、最近非常に調子が悪いです。

```rb:hena18pre.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/373105e7fafd12f5e9fd
#http://nabetani.sakura.ne.jp/hena/ord18mafovafo/
T={'L'=>'RVF','J'=>'FVR','Z'=>'FmRVF','U'=>'RVFVR','S'=>'FVRmF'}
STDOUT.sync=true
while gets
	puts $_.chomp.chars.reduce('F'){|s,e|
		s.chars.map{|c|c=='F' ? T[e] : c=='R' ? T[e].tr('FRmV','RFVm').reverse : c}*''
	}.tr('FR','')
end
```
rbenv で ruby2.0 をインストールするとき、BUILD FAILEDになったら

RUBY_CONFIGURE_OPTSをつけてインストールする

```
brew install openssl
brew install readline

RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.0.0-p247
```
github-pages導入手順


<a href="http://qiita.com/pasberth/">pasberth氏</a>のレクチャーのもと、
github pageをオープンできるようになったので、忘備録。

GitHubにアカウントを作って
メールアドレスの認証（verify）を事前に済ませていること前提。


```

//GitHubにてリポジトリを作成
https://github.com/new
```


```
//自分のローカルディレクトリを作成し、リポジトリを取得する(sampleRepoを作った場合)
git clone https://github.com/<accountName>/sampleRepo.git
cd sampleRepo
touch README.md
git add README.md
git commit -m init

git push origin master
```

これからリポジトリに新しくなにかファイルを追加したかったら
 
```
git add <filename>
git commit -m "add <filed>"
git push origin master

//試しに hello world と書かれた html を追加した場合
echo hello world > index.html
git add index.html
git commit -am "add index.html"
git push origin master

```

この index.html を 
GitHub pages を利用してWeb上に公開します。

```

http://<accountName>.github.io/sampleRepo/
```

(今はまだ GitHub pagesを使えてないため、404の状態)
いま作った index.html を GitHub pages を使って公開するには，

```
git branch gh-pages
git push origin gh-pages
```

上記のコマンドを入力した後、URLを叩いて「Hello world」が表示されれば成功。


---

gitのコマンドの学習と
どういうサイトを作ろうかっていうのを考えないといけない
[Ruby]基礎から日記。ブロックに渡せば閉じなくていいってなんかすごい

[筑波大学の問題](http://klis.tsukuba.ac.jp/klib/index.php?plugin=attach&refer=KISL%2Ftop&openfile=ruby.pdf "筑波大学の問題")もうすぐ終わりの44、45番。

```rb:[Ruby-44]
io = open("foo.txt", "r")
while line = io.gets
	print(line)
end
io.close
```

これは分かりやすい。while trueなんていらんかったんや。

```rb:[Ruby-45]
open("foo.txt", "r"){|io|
	while line = io.gets
	print(line)
end
}
io.close
```

こちらはio.closeがいらないことにびっくりした。いったいどうなってるんだ、と『たのしいRuby』p.295を見ると、

>openメソッドにブロックを渡せばcloseメソッドを省略することもできます。

だって。理屈はわからないけどすごいなあ。
LLVM SPARC v9 バックエンドに atomicrmw 対応きました.


LLVM SPARC v9 バックエンドについに atomicrmw(ATOMIC_LOAD_ADD Inst など)の対応がきました.

http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140120/202500.html

これでついに, C++ std::string など内部で atomic 命令を使ったコードが扱えるようになります! 素晴らしいですね.
Vagrantの使い方


身近な人にDevOpsの最初の一歩を解説するために、Vagrantというツールの紹介と使い方をまとめてみた。

## Vagrant(ベイグラント)とは

仮想マシン環境を簡単に構築・管理・配布できるツール。どのくらい簡単かというと、例えばUbuntu 12.04 server 32bitの仮想マシンを準備するのであれば、Vagrantをインストール後は下記の3行で済む。

```shell
$ vagrant box add base http://files.vagrantup.com/precise32.box
$ vagrant init
$ vagrant up
```

コマンドを実行後、しばらくすると、仮想マシンが立ち上がる。コンソールにログインするには、下記のコマンドを実行する。

```shell
$ vagrant ssh
```

vagrantというユーザーでログインされる。このユーザーはsudoersに追加されているので、sudoコマンドでroot権限で様々なコマンドが実行可能だ。

ここで登場したコマンドを簡単に説明すると、

```shell
$ vagrant box add base http://files.vagrantup.com/precise32.box
```

→ http://files.vagrantup.com/precise32.box というbox(仮想マシンのベース)をダウンロードし、baseという名前で追加する。

```shell
$ vagrant init
```

→ Vagrantの設定ファイル(Vagrantfile)を生成する。

```shell
$ vagrant up
```

→ Vagrantfileを元に仮想マシンを起動する。

```shell
$ vagrant ssh
```

→ 立ち上げた仮想マシンにSSHでログインする。

### Vagrantを使った仮想マシンの構築

Vagrantは、このboxをベースにして、各種環境をインストールしたり、設定ファイルを追加したりできる。この操作をProvisioningと呼んでいる。

Provisioningに利用できるのは、以前はChef Soloのみだったが、今ではシェルスクリプト等もサポートしている。```vagrant up```時にはデフォルトで実行されるし、仮想マシンが起動中も下記のコマンドを実行すれば、構築スクリプトが実行される。

```shell
$ vagrant provision
```

Chefなどの環境構築ツールを利用すれば、「既にインストールされている場合はスキップ」みたいな事も自動でしてくれるので便利。(ただ、今回はVagrantの紹介なので、Chefについては割愛。)

VagrantもChefもRubyベースのDSLで環境を構築するので、スクリプトがあれば手順書要らずで環境を複製できる。

### Vagrantの仮想環境を別の環境にデプロイする

VagrantはデフォルトではVirtualBoxベースの仮想マシンを作成する。VagrantはVMWareにも対応しているし、更にAWS EC2にデプロイすることもできる。ローカルで開発した環境を元に、EC2の構築までできる。この機構はプラグインになっている。例えばEC2にデプロイするのであれば、

```shell
$ vagrant plugin install vagrant-aws
```

というように、プラグインをインストールし、Vagrantfileに設定を記述する。もちろん、EC2以外のクラウドベンダーのプラグインもある。例えば「さくらのクラウド」であれば、

```shell
$ vagrant plugin install vagrant-sakura
```

$5/月でSSDストレージが使える事で有名なdigitaloceanにデプロイするのであれば、

```shell
$ vagrant plugin install vagrant-digitalocean
```

と言ったものがある。

(Vagrantfileに記述する内容や、providerの指定方法は、それぞれのプラグインのドキュメントに書いてあるので、こちらはとりあえず割愛。)

### Vagrantを使ったデスクトップ環境の構築

GUIが必要な場合でも、Vagrantfileの設定を修正するだけで対応できる。下記はVirtualBoxの例

```Vagrantfile
config.vm.provider "virtualbox" do |v|
  v.gui = true
end
```

もちろん、boxにはデスクトップ環境のパッケージが入っていないとGUIが立ち上がっても嬉しさ半減。[boxの共有しているページ](http://www.vagrantbox.es/)もあるが、セキュリティ等が気になる人は[veeweeを使ってboxを作ろう](http://www.vagrantbox.es/)。[Veeweeの使い方](http://qiita.com/IK12_info/items/d1267faf3db527757a47)

仮想マシンのネットワークの設定の辺りにハマる事があるが、Vagrantは便利なので、使い方を知っておこう。
gzip 圧縮した静的ファイルを、Apache から直接配信する方法

## やりたいこと
* サーバの CPU 負荷、ネットワークの負荷を抑制したい
* ユーザから見た、サイトの応答速度を向上したい

## 実現方法
* .gz ファイルを事前に生成し、可能なら Apache から直接そのデータをブラウザに返す
* mod_deflate なら返すときに圧縮するので CPU 負荷がかかるが、この方法ならそれを節約できる

## 前提
* .html、.css 、.js の３種類だけを対象に
* .gz ファイルは事前の生成が必要
  * Ruby on Rails なら、rake assets:precompile で作られる
  * 自分で .gz ファイルを生成するなら、下記のようにする

```shell-session
 $ find public -name "*.html" -o -name "*.css" -o -name "*.js" | \
    xargs -ifile sh -c "gzip --best -c file > file.gz"
```

## 設定例（ Apache ）

もちろん、 /home/cuzic/railsapp のところは適切に設定すること。

```apache:httpd.conf
  <Directory /home/cuzic/railsapp/public>
    RewriteEngine on

    RewriteCond %{REQUEST_URI} ^/portal/$
    RewriteRule ^(.*)$ /portal/index.html

    # RewriteCond %{HTTP:Accept-Encoding} \b(x-)?gzip\b
    RewriteCond %{HTTP:Accept-Encoding} gzip
    RewriteCond %{REQUEST_URI} (\.js|\.css|\.html)$
    RewriteCond %{REQUEST_FILENAME}.gz -s
    RewriteRule .* %{REQUEST_URI}.gz [last]
  </Directory>

  <FilesMatch "\.html\.gz$">
    ForceType text/html
    Header set Content-Encoding gzip
  </FilesMatch>

  <FilesMatch "\.css\.gz$">
    ForceType text/css
    Header set Content-Encoding gzip
  </FilesMatch>

  <FilesMatch \.js\.gz$>
    ForceType text/javascript
    Header set Content-Encoding gzip
  </FilesMatch>
```

## ひとりごと
* find 関連
  * find は -o で OR 条件のフィルタが書けて便利
  * find の exec を使うより、パイプで xargs を使う方が動作が速くてオススメらしい。
* gzip はふつうにやると元のファイルが消えて、圧縮後ファイルのみが残るのにハマった
* mod_rewrite の ディレクトリコンテキストと、サーバコンテキストの違いがハマった
 
* REQUEST_FILENAME はディレクトリコンテキストでないと、期待する動作をしない
* index.html の扱いを忘れていて、これまたハマった
* AddEncoding はあってもなくても動作の違いがよく分からなかった
* 「 Header append Vary 」を書いた方がいいという情報もあったが、よく分からなかった
* 昔のブラウザを考慮する場合はもっと複雑な条件分岐が必要らしい
  * モダンな環境ということで全部省略した。
RM+FacebookSDKで「xxxxxx is not registered as a URL Scheme」って怒られる件

【自分メモ】
Rubymotion使ってFB SDKのFBLoginViewを使ってログインしようとした時に、FBSDKLogからこんな表示されて、FBのアプリに飛ばない問題の解決方法。

---
FBSDKLog: Cannot use the Facebook app or Safari to authorize, xxxxxxxxxx is not registered as a URL Scheme
---


最初はこう書いてた

```ruby:Rakefile
app.info_plist['FacebookAppID'] = 'xxxxxxxxxx'
app.info_plist['URL types'] = {'URL Schemes'=>'fbxxxxxxxxxx'}
```

こうしたら出来た。

```ruby:Rakefile
app.info_plist['FacebookAppID'] = 'xxxxxxxxxx'
app.info_plist['CFBundleURLTypes'] = [
      { 'CFBundleURLName' => 'fbアプリで設定したBundle ID',
        'CFBundleURLSchemes' => ['fbxxxxxxxxxx'] }
  ]
```
GitHub上の大事な中央ブランチをgit push --forceの恐怖から守るgit hookスクリプト

つい先日、GitHubで管理していたテスト用中央ブランチに、チームメンバーが誤って```git push --force```してしまい、
一部の歴史が消失するという事件が起きました。

ぎゃあああ！なんばしよっとね！うっかりでしたじゃ済まんばい！
とか思っていたらJenkinsの開発者みたいなスゴい人でもやらかしちゃうみたいです。

Jenkinsの開発者、間違えて一ヶ月前のローカルレポジトリをgit push --forceしてしまう
http://cpplover.blogspot.jp/2013/11/jenkinsgit-push-force.html

スゴい人でもやらかすんだから、平民の我々もそのうちやらかすに違いない。
緊急バグ修正などで慌てていたら尚更ですね。（というか自分が一番やりかねない）
というわけで、何とか仕組みの上で防くことができればと思って仕掛けることにしました。

-----
以下のスクリプトを、```.git/hooks/pre-push```というファイル名で保存。
push直前に起動し、大事なブランチへ```git push --force```しそうであればエラーを返して食い止めてくれます。

```
#!/bin/sh

# 守りたいbranch名を定義
PROTECTED_BRANCHES=( trunk master )

CURRENT_BRANCH=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

PUSH_COMMAND=$(ps -ocommand= -p $PPID)

IS_DESTRUCTIVE='force|delete|\-f'

WILL_REMOVE_PROTECTED_BRANCH=':'$PROTECTED_BRANCH

for i in "${PROTECTED_BRANCHES[@]}"
do

    PROTECTED_BRANCH=$i

    # エラーメッセージを定義
    MESSAGE="$PROTECTED_BRANCH には $PUSH_COMMAND してはダメです！先にgit fetch && git merge origin $PROTECTED_BRANCH すること。by pre-push hook"

    if [[ $PUSH_COMMAND =~ $IS_DESTRUCTIVE ]] && [ $CURRENT_BRANCH = $PROTECTED_BRANCH ]; then
      echo $MESSAGE
      exit 1
    fi

    if [[ $PUSH_COMMAND =~ $IS_DESTRUCTIVE ]] && [[ $PUSH_COMMAND =~ $PROTECTED_BRANCH ]]; then
      echo $MESSAGE
      exit 1
    fi

    if [[ $PUSH_COMMAND =~ $WILL_REMOVE_PROTECTED_BRANCH ]]; then
      echo $MESSAGE
      exit 1
    fi

done

exit 0
```

参考
https://gist.github.com/pixelhandler/5718585
自前の開発環境に合わせて少々書き換えました。

-----

本当はサーバサイドフックを利用して、特定ブランチへの破壊的なpushであれば云々、みたいな処理にしたかったのですが、
GitHub上で実現する方法がよくわからず、やむなくpre-pushを利用しました。
クライアントサイドフックなので、中央ブランチを完璧に守るためには、開発者全員の環境に仕掛ける必要があります。

あと、pre-pushはgitのバージョンによっては動かないそうです。
1.8.2以上であれば動作するはずです。(1.8.3環境で確認済み)
LaTeX+dvipdfmx でEPS画像がずれる場合の対策

### 前提

  * LaTeX 文書を dvipdfmx を使って PDF 文書に変換している。
  * 文書中でEPS形式の画像を読み込んでいる。
  * 最近（2013年以降）TeX一式をインストール／アップデートした。

### 問題

  * 一部のEPS画像の位置がずれて出力される。
  * あるいは、dvipdfmx は確かにEPSファイルを読み込んでいる（`-vv` オプションで確認）のに、
    結果のPDF文書では図が出力されていない。
  * [「今時はベクトル画像はEPSじゃなくてPDFでしょ」](http://qiita.com/zr_tex8r/items/5413a29d5276acac3771)という意見もあるが、
    EPSを使わざるを得ない事情がある。

### 対策方法

  * graphicx（または graphics）パッケージの読込時のオプションを見て、
    `dvipdfmx` のドライバ指定があるかを確認する。

    ```tex
    \usepackage[dvipdfmx]{graphicx}
    ```

  * `dvipdfmx` が無ければ追加する。
    同時に、`dvips` や `dvipdfm` 等の間違った指定があれば削除する。

  * graphicx のドライバ指定は文書クラス指定のオプションでも行える。
    この場合も対処は同じ。

    ```tex
    \documentclass[a4paper,dvipdfmx]{jsarticle}
    \usepackage{graphicx}
    ```

※もし「これらの対処をしても出力が全く変わらない」という場合は、[color パッケージに関する記事](http://qiita.com/zr_tex8r/items/442b75b452b11bee8049)も参照されたい。

### 詳細

詳細については以下の記事を参照されたい。

  * [dvipdfmx での EPS 画像挿入が最近アレな話](http://d.hatena.ne.jp/zrbabbler/20140121/1390313675)

もし、何か複雑な事情があって、「故意に間違ったドライバ指定を行っている」場合の対処も述べられている。
spring の実行がエラーになったので入れなおした(2014/1)

## 発生したエラー

こんなんでた

### 環境

* ruby 2.1.0p0
* Rails 3.2.16

```
% rails -v
/Users/dany/.rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/requirement.rb:18: stack level too deep (SystemStackError)
```

### 原因になりそうなこと

* ruby を 2.1.0p0 にあげていたのは割りと最近 (rbenv 利用)
* 前日に Rails 4.1 のプロジェクトで長時間遊んでいた
  * Rails 4.1 から bin/rails あるけど、関係ないよね。。
* そんなこんなで spring も ruby のバージョン上げたとこでさらに上げたりしてた

で入れなおし

## 手順

* gem install
* binstub 作成
* direnv の設定（結果そのまま）

### gem install 

* http://qiita.com/joker1007/items/0eba515dad2b2f6d0192

```
% gem install spring spring-commands-rspec
Successfully installed spring-1.1.0
Successfully installed spring-commands-rspec-1.0.1
2 gems installed
```
おお、バージョンあがったのか。

### binstub 作成

```
% rm -r bin # 既存のを削除
% % spring binstub rspec rails rake # とりあえず必要なやつだけ。必要なら --all でいける
* bin/rspec: generated with spring
* bin/rails: spring inserted
* bin/rake: generated with spring
```

### direnv 設定

binstub は bin の下に作られるので、rails プロジェクトに入った時だけそこをパスに入れて欲しい。
[spring 公式](https://github.com/rails/spring) にもそうしろってなってたと思うが、未だにこれであってるのかよくわからない。。

```
$ cd railsプロジェクト
$ export EDITOR=vim # EDITOR が最初からあればいらないです
$ direnv edit .
```

``.envrc``というファイルが開かれるので、カレントをパスに加える

```.envrc
export PATH=$PWD/bin:$PATH
```

とりあえず上手くいったのでよしとします。
Chromeのdevtoolsを右に置きたいよっ！

ChromeのDevelopperToolsがv32から強化されてるけど( http://qiita.com/shun_ino12/items/0638c7735ffd3bcabeae , http://qiita.com/tachiba/items/8c593f9e1b5ed14b0444 )エミュレーションするなら横長の画面で縦画面をエミュレートすることが多いですよね…でもあれっ？DevelopperToolってDnDで右に持っていけなかったっけ？

### 結構単純だった。

![SnapCrab_NoName_2014-1-26_17-25-59_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/23997/4bf85896-e6ba-faa1-ff01-127dcd3c0554.png)
ここを長押しすると…


![SnapCrab_NoName_2014-1-26_17-27-41_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/23997/397f462d-9a4a-75e9-7d45-a97110c9d44c.png)
こんなところに！

これでごにょごにょしながらGF(仮)やるのも快適ですねっ！![SnapCrab_ガールフレンド（仮） - Google Chrome_2014-1-26_17-32-18_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/23997/eceda2ac-e89c-0fc1-4fb4-c1bb0d47b957.png)
Rails4でQiita投稿ボタンをつくった

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2049">元の記事はコチラ</a>
- - - - - - - - - - - 
Qiitaにアカウント作ったので、せっかくだからブログの「技術メモ」カテゴリだけ投稿してみることに。
コピペだといろいろめんどくさいのでブログに「Qiita投稿ボタン」をつけた。

<!-- extract -->

Rails4 + heroku

Qiita API document
[http://qiita.com/docs](http://qiita.com/docs)

###Viewファイル

こんな感じで、ログインした時だけ「Create Qiita」ボタンを出している。
![qiita](http://image.workabroad.jp/upload/2014/90/workabroad.jpg)
　
posts/show.html.erb

``` erb
<small>
	<%= link_to "Create Qiita", qiitas_path(id: @post.id), method: :post %>
</small>

```

link_toだけど method: :post を指定しているのでPOSTリクエストとなる。
Postのidを渡しているだけ。
　
routesはこんな感じ。
config/routes

```
post 'qiitas/create',  to: 'qiitas#create',  as: :qiitas

```
　
###実際の処理はQiitasControllerに書いた

最初にトークンを取得する必要があるので、それはPrivateにしてある。

``` ruby
class QiitasController < ApplicationController

	require 'net/http'
	require 'net/https'

	def create

		#受け取ったIDで記事検索
		post = Post.find_by_id(params[:id])

		#タグにはacts-as-taggable-onをつかっているので、
		#それをQiita APIのフォーマットに合わせる。
		tags = post.tag_list.map do |t|
			{ "name" => t }
		end

		#ブログからの投稿だと分かるようにしてみた。
		#別にいらないかも。
		link_front = "- - - - - - - - - - - \nブログを更新しました。<a href=\"http://workabroad.jp/posts/#{post.id}\">元の記事はコチラ</a>\n- - - - - - - - - - - \n"
		link_back  = "\n\n → <a href=\"http://workabroad.jp/posts/#{post.id}\">http://workabroad.jp/posts/#{post.id}</a>\n"
		
		post.content = link_front + post.content + link_back

		#Qiitaに送るJSONの準備
		content = {
			"title" => post.title,
			"body" => post.content,
			"tags" => tags,
			"private" => false,
			"gist" => false,
			"tweet" => false
		}

		#トークン取得
		token = get_token()

		api = URI.parse("https://qiita.com/api/v1/items?token=#{token}")

		header = {
				"Content-Type" => "application/json"
			}

		#送信
		http = Net::HTTP.new(api.hostname, api.port)
		http.use_ssl = true
		http.verify_mode = OpenSSL::SSL::VERIFY_NONE

		http.start do |h|
			@res = h.post(api, content.to_json, header)
		end

		if @res.is_a?(Net::HTTPCreated)
			flash[:info] = "Qiitaを作成しました。"
		else
			flash[:warning] = "エラーが発生しました。"
		end

		#元の記事に戻る
		redirect_to post
	end



	private

		def get_token

			url_name = "xxxxxxxx"
			pass = "xxxxxxxxxxxxxxx"

			# Qiita API
			api = URI.parse('https://qiita.com/api/v1/auth')

			# Request Header
			header = {
					"Content-Type" => "application/json"
				}

			#Qiitaに送るJSONを準備
			json = { "url_name" =>url_name, "password" => pass}.to_json

			#送信
			http = Net::HTTP.new(api.hostname, api.port)
			http.use_ssl = true
			http.verify_mode = OpenSSL::SSL::VERIFY_NONE

			http.start do |h|
				@res = h.post(api, json, header)
			end
			
			#トークン値を返す
			hash = ActiveSupport::JSON.decode(@res.body)
			hash["token"]
		end


end

```



 → <a href="http://workabroad.jp/posts/2049">http://workabroad.jp/posts/2049</a>
結合度(カップリング)に焦点をあてたリファクタリング


(この記事は、thoughtbot Learn を使って学んでいることのアウトプット用です）

###結合度（Coupling, カップリング）と呼ばれる概念があります。
あるコードと別のコードの「結合度が高い」「結合度が低い」といった言い方をします。それらコードを評価する基準の一つです。

###結合度が「高い」コードは良くないものとされています。
結合度が高いことが、なぜコードに悪影響を与えるのか、例を挙げながら説明します。
最も結合度が高いものから、最も低いものまでを列挙して説明します。

##内容結合
あるクラスが、別のクラスの内部変数にアクセスして、それを書き換えています。別のクラスなのにも関わらず、片方のクラスを書き換えることで、もう一方のクラスも変更しなければいけません。

```ruby
class NuclerLaunchController
	def initialize(launch_codes)
		@launch_codes = launch_codes
	end
end

class ExtremelyBadIdea
	def initialize(nucler_launch_controller)
		@launch_controller = nucler_launch_controller
	end

	def do_bad_things
		@launch_controller.instance_variable_set(:@launch_codes, 'password')
	end
end
```


##制御結合／コントロールカップル
渡すコードによって、内部の挙動が変わる結合です。

```ruby
### Railsより出典
def save(should_run_validations=true)
	if should_run_validations
		run_validations
		persist
	else
		persist
	end
end
```


##結合度が低いが、まだ結合がある例

```ruby
class ScreenPrinter
	def print(text)
		output_to_screen(text.to_s)
	end
end
```
このメソッドを使う側は、渡すパラメータが何の種類であるべきか考えなければいけません。


##結合度が考えうる限り低い例
###メッセージカップリング

```ruby
class ScreenPrinter
	def print_to_screen
		output_to_screen(@text)
	end
end
```

引数をとっていないので、コードを使う側はメソッドの名前さえしっていれば良い状態です。

参考
http://ja.wikipedia.org/wiki/%E7%B5%90%E5%90%88%E5%BA%A6
第18回オフラインリアルタイムどう書くの参考問題をRubyで解く

問題はこちら。
http://nabetani.sakura.ne.jp/hena/ord18mafovafo/

```rb
def solve(q)
  h1 = {'L'=>'V','J'=>'V','Z'=>'mV','U'=>'VV','S'=>'Vm'}
  h2 = {'L'=>'m','J'=>'m','Z'=>'mV','U'=>'mm','S'=>'Vm'}
  folds = ''
  isLeft = true
  q.chars.each{|c|
    fw = (isLeft ? h1 :  h2)[c]
    folds.chars.each_with_index{|fold, i|
      fw += fold
      if ((isLeft and i.odd?) or (!isLeft and i.even?))
        fw += h1[c]
      else
        fw += h2[c]
      end
    }
    folds = fw
    case c
    when 'L'
      isLeft = false if isLeft
    when 'J'
      isLeft = true unless isLeft
    when 'U'
      isLeft = !isLeft
    end
  }
  folds
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans
  puts ans == a ? ' o' : ' x'
#break
end
__END__
0	JZ	mVVmV
1	J	V
2	L	V
3	Z	mV
4	U	VV
5	S	Vm
6	JL	VVm
7	JS	VmVVm
8	JU	VVVmm
9	LU	mmVVV
10	SL	VVmmV
11	SS	VmVVmmVm
```
ロード画面のあれ


![loading.png](https://qiita-image-store.s3.amazonaws.com/0/34295/add8fcce-8e82-484c-8464-6286e7f4b3e4.png)


```Siv3D:Main.cpp
# include <Siv3D.hpp>

void DrawLoading(
	const Vec2& pos,
	double radius,
	int num,
	double speed,
	std::function<void(const Vec2& pos, double radius, double radian)> func)
{
	const double dNum = static_cast<double>(num);

	const double dif = TwoPi / dNum;

	for (int i = 0; i < num; ++i)
	{
		const double radian = i * dif;

		const Vec2 tPos = pos + Circular(radius, radian);

		const double phase = System::FrameCount() * (-speed) + radian / 2.0;

		const double tRadius = atan(Tan(phase)) / Pi + 1.0 / 2.0;

		func(tPos, tRadius, radian);
	}
}

void Main()
{
	const Font font(30);

	std::array<std::function<void(const Vec2& pos, double radius, double radian)>, 3> funcs = {
			[](const Vec2& pos, double radius, double radian)
		{
			Circle(pos, radius * 10.0).draw(); 
		},
			[](const Vec2& pos, double radius, double radian)
		{
			RectF(radius*10.0, radius*10.0).setCenter(pos).rotate(radian).draw();
		},
			[](const Vec2& pos, double radius, double radian)
		{
			RectF(10.0, 20.0).setCenter(pos).rotate(radian).draw(ColorF(1.0, radius));
		}
	};

	int i = 0;

	while (System::Update())
	{
		font.draw(L"画面クリックで種類を変える");

		if (Mouse::LeftClicked())
		{
			if (!(++i < funcs.size()))
			{
				i = 0;
			}
		}

		DrawLoading(Mouse::Pos(), 50.0, 10, 0.05, funcs.at(i));
	}
}

```