OmniAICreator/Qiita-1.07M huggingface dataset:
KarmaでJavascript TDD


# Getting Started


# Articles
- [【javascriptを使う人に知って貰いたい（エンジニア、デザイナ問わず）】karmaを使ったテスト駆動開発入門（ついでにJasmineも） - Qiita](http://qiita.com/shinofara/items/b3677ffdfc0c7e45e8d4)

    - セットアップ方法

- [karmaでらくらくJavaScriptをテスト - tetsunosukeのnotebook](http://tetsunosuke.hatenablog.com/entry/2013/04/09/124312)

    - Coverageなんかも出せるらしい

# Reference
## Official
- [Karma - Configuration File](http://karma-runner.github.io/0.10/config/configuration-file.html)

## For WebStorm
- [Running JavaScript tests with Karma - WebStorm - Confluence](http://confluence.jetbrains.com/display/WI/Running+JavaScript+tests+with+Karma)
[Infra as Code] 入門あとで読む

# 疑問点メモ

- ローカル仮想環境を作って、それをそのまま本番に持っていくにはどうする？

    - Chefがあれば物理でも仮想でも関係なし？
    - AWSなどのVPSでもChefあればいいのか？
    - Heroku相手ならアプリのgitリポジトリさえあればいいから関係ないか


- ローカルとサーバの環境差分はどこまで一致させられる？どうしても動作差分が出る点は残る？
- Vagrantがよくわからん
- Dockerってそもそも何よ？

# VM (VirtualBox, Vagrant, Chef)
- [今っぽい Vagrant + Chef Solo チュートリアル - Qiita](http://qiita.com/taiki45/items/b46a2f32248720ec2bae)


# Docker

###### [Getting Started - Docker: the Linux container engine](http://www.docker.io/gettingstarted/)
- 公式チュートリアル。サイトで、仮想画面で対話的に操作を試しながら１つずつ進んでいける。

###### [Docker入門した - sojourn](http://sixeight.hatenablog.com/entry/2013/12/08/220024)
- 公式チュートリアルがいいらしい

###### [Docker: Linuxコンテナを使ってアプリケーションの配置を支援する](http://www.infoq.com/jp/articles/docker-containers)
- 背景・用途の説明もついてる

###### [Linuxコンテナを手軽に扱えるDockerを使ってみよう  |  KVH Blog](http://blog.kvhasia.com/ja/tech-insights/introducing-docker-a-tool-to-bring-linux-container-to-your-life/)
- 動作の仕組みの概略

###### [仮想環境構築に docker を使う - apatheia.info](http://apatheia.info/blog/2013/06/17/docker/)
- Vagrant経由で試してみる
Phalcon Model::save エラーハンドリングのオシャレな書き方

[Phalcon\Mvc\Model::save](http://api.phalconphp.com/en/1.2.3/Phalcon/Mvc/Model#save-details) は失敗時に例外を投げてくれないので、
bool の返却値を見てハンドリングしなきゃいけません。

Model 基底クラスを作って save メソッドをオーバーライドし、失敗時に例外を投げる方法もあります。
しかしそれだと Controller でエラーメッセージをコントロールしづらいので、今回はそのまま、書き方を工夫します。

## イマイチな書き方

```php
$entry = new BlogEntry();
$entry
    ->setDate($date)
    ->setTitle($title)
    ->setBody($body);
if (!$entry->save()) {
    throw new \Exception("ブログ記事の保存に失敗しました");
}
```

せっかくリズムよくメソッドチェーンをつないでいるのに、save だけ切り離されちゃいます。
かと言って結果を一時変数に格納するのも微妙。。。

## シャレオツな書き方

```php
$entry = new BlogEntry();
$entry
    ->setDate($date)
    ->setTitle($title)
    ->setBody($body)
    ->save()
    or throw new \Exception("ブログ記事の保存に失敗しました");
```

save までコンボをつなげました！

## Validation Error 等のエラーメッセージもハンドリングしたい

ControllerBase クラスにエラーハンドリングメソッドを追加します。

```php:ControllerBase.php
class ControllerBase extends Controller
{

	/**
	 * @param \Phalcon\Mvc\Model $model
	 * @param string $message
	 * @param string $method
	 * @param int $line
	 * @param string $indent
	 * @throws \Exception
	 */
	protected function handleSaveError($model, $message, $method = __METHOD__, $line = __LINE__, $indent = "	") {
        $errors = "";
        foreach ($model->getMessages() as $err) {
            $errors .= $indent . $err . "\n";
        }
		$this->logger->error("model save error: {$message} at {$method} on line {$line}\n{$errors}");
		throw new \Exception($message . "\n" . $errors);
	}
}
```

このように使います。

```php
$entry = new BlogEntry();
$entry
    ->setDate($date)
    ->setTitle($title)
    ->setBody($body)
    ->save()
    or $this->handleSaveError($entry, "ブログ記事の保存に失敗しました");
```
ActiveAndroidをContentProvider経由で使うメモ

ActiveAndroidをContentProvider経由で使うためのメモです。
時間あれば丁寧にまとめ直したい。

# 公式ドキュメント
https://github.com/pardom/ActiveAndroid/wiki/Using-the-content-provider
あまり情報が載っていません。
実際に使おうとすると色々準備することがあります。

# ライブラリ
公式ドキュメントにはテーブルのユニークなIDのカラム名を
```Id```から```_id```に変えるよう指示があります。
しかし、Githubにある最新のmaster branchには
現在IDを変えるアノテーションが実装されていません。
なので、ここのツリーからソースを落としてjarを生成してください。
https://github.com/dirong/ActiveAndroid/tree/921c703e7181fcecae6f07d5d46b7249c3fdcbc5

既にTableを生成してしまっている場合は別途DBのマイグレーションが必要です。

# AndroidManifest

```xml:AndroidManifest.xml
<provider
   android:name="com.activeandroid.content.ContentProvider"
   android:authorities="APKのパッケージ名" />
```
ContentProviderを使うためこれを追記します。

# カーソル取得

``` java
getActivity().getSupportLoaderManager().initLoader(0, null, new LoaderCallbacks<Cursor>() {
	@Override
	public Loader<Cursor> onCreateLoader(int arg0, Bundle cursor) {
		return new CursorLoader(getActivity(),
			ContentProvider.createUri(MyEntityClass.class, null),
			null, null, null, null
		);
	}
	
	@Override
	public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
		((SimpleCursorAdapter)mySpinner.getAdapter()).swapCursor(cursor);
	}
	
	@Override
	public void onLoaderReset(Loader<Cursor> arg0) {
		((SimpleCursorAdapter)mySpinner.getAdapter()).swapCursor(null);
	}
});
```
このへんはマニュアル通りに。
ここでのモデルのクラス名は```MyEntityClass.class```らしい

# カーソルからモデルインスタンスを作る
マニュアルはSimpleCursorAdapterを使ってますが、
実際にはCursorAdapterを拡張したりして使うことが多いと思います。
そこでカーソルのまま扱うと大変(ActiveAndroidを使うメリットも少ない)なので
モデルインスタンスをカーソルから作ります

```java
MyEntityClass entity = new MyEntityClass();
entity..loadFromCursor(c);
```
cは1行分のカーソルです。
CursorAdapterを利用する場合はbindViewの引数がそのまま使えます。
名前を付けてForeignKeyを作成（MySQL）

## WEBに転がってる情報が名前つけないで作成するのばかりだった

`FOREIGN KEY`を作成するブログを検索すると、名前を付けて作成するとったエントリーが見当たらない。
ほとんどは以下の様なクエリが書いてある。

```sql
ALTER TABLE `child_table`
    ADD FOREIGN KEY `parent_id` REFERENCES `parent_table` (`parent_id`)
```

こうやって`FOREIGN KEY`を作成すると、作成したFOREIGN KEYはシステムが勝手に名前を付けてくれる。

## 名前を付けてやる

`INDEX`の作成時に`INDEX`に名前を付けられるように、`FOREIGN KEY`にも名前を付けて作成することが出来る。
`CONSTRAINT [foreign key name]`オプションを付けてあげればいい。

```sql:CREATE_TABLE時
CREATE TABLE `child_table` (
  `child_id` INT NOT NULL,
  `parent_id` INT NOT NULL,
  PRIMARY KEY (`child_id`),
  INDEX `idx_parent_id` (`parent_id`),
  CONSTRAINT `fkey_parent_table_parent_id` FOREIGN KEY (`parent_id`) REFERENCES  `parent_table` (`parent_id`)
)
ENGINE=InnoDB;
```

```sql:ALTER_TABLE時
ALTER TABLE `child_table`
    ADD CONSTRAINT `fkey_parent_table_parent_id` FOREIGN KEY `parent_id` REFERENCES `parent_table` (`parent_id`)
```

## 何故名前をつけるのか？

ちょっと`FOREIGN KEY`を削除したいと思った時に、、わざわざ名前を調べなくても削除出来るので便利なんです。
PS4の設定でシェルスクリプトのデバッグが捗る

.bashrc とかに以下の設定を書いておくと、`bash -x` や `set -x` 状態でスクリプト実行したときに、出力がリッチになってデバッグが捗ります。

```bash:
# PS4の設定でシェルスクリプトのデバッグが捗る https://qiita.com/kawaz/items/65cdbeaa739c4e6b7776
export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME:+$FUNCNAME(): }'
```

#サンプルスクリプト
↓こんな感じの２つのスクリプトがあるとします。

```bash:test.sh
#!/bin/bash
echo "i am test.sh"
. func.sh
foo hoge
```

```bash:func.sh
#!/bin/bash
echo "i am func.sh"
function foo() {
  bar "$@"
}
function bar() {
  echo bar "$@"
}
```

# 通常の実行例
デフォルトでは `PS4='+ '` となっており、その場合の出力は以下のようになります。

```text:
+ echo 'i am test.sh'
i am test.sh
+ . func.sh
++ echo 'i am func.sh'
i am func.sh
+ foo hoge
+ bar hoge
+ echo bar hoge
bar hoge
```

一応source読み込みで入れ子になってるスクリプトで実行されたコマンドは ++ 表記で２段目の入れ子ファイル上のコマンドですよーてことは分かりますがそれだけです。

# いい感じの実行例
冒頭のPS4を設定しておくと以下の様な感じになります。

```test:
$ bash -x test.sh
+(test.sh:2): echo 'i am test.sh'
i am test.sh
+(test.sh:3): . func.sh
++(func.sh:2): echo 'i am func.sh'
i am func.sh
+(test.sh:4): foo hoge
+(func.sh:4): foo(): bar hoge
+(func.sh:7): bar(): echo bar hoge
bar hoge

```

ファイル名や実行中コマンドのスクリプト内行番号や、関数中ならその関数名まで表示してくれます。便利！
メモ: selectのみ許可するユーザを作ってMysql管理ツールでの操作ミスを防ぐ

selectのみ許可するユーザを作る
---------------

GUIのMysql管理ツールだと簡単にデータを変更できてしまう面も持ち合わせているため
select文しか発行出来ないユーザーを作っておきましょう。


```mysql:現在登録されているユーザーを確認
SELECT host,user FROM mysql.user;
```

```mysql:アカウントを追加。
grant select on *.* to selectonly@'192.168.100.%' identified by 'fjp23jf';
```

* 設定情報
  * ユーザ名: `selectonly`
  * パスワード: `fjp23jf`
  * 接続元: `192.168.100.%`
  * `select`コマンドのみ許可

Mysql管理ツール
---------------
Macだと[Sequel Pro](http://www.sequelpro.com)、Windowsだと[A5M2](http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/)がお気に入りです。

* Sequel Proでは、1ページ39件表示にしておくと縦のスクロールバーが表示されずに良いです。

* SSHにてmysqlサーバを操作できて感動しました。(今まではコマンドラインとかphpminiadminで操作していた。)
パソコンのGoogle ChromeでUser Agentとかを設定変更したい

# パソコンのGoogle ChromeでUser Agentとかを設定変更したい

2014/01/09に、ChromeのデベロッパーツールでUser Agentの設定が見当たらなくなって
＼(^o^)／ってなった僕と同じような人が多数いるかと思います。
どうやら設定項目の入力フォームが変更されたようです。

Chromeのバージョンを確かめたら、 `32.0.1700.72 m`でした。

## User Agentを変更する

1. デベロッパーツールを開く  
右クリックメニューで 要素を編集 を選択、もしくは、F12キーを押下で開けます。
1. 設定フォームを開く  
ここで右上の設定アイコン（歯車っぽいやつ）をクリックで開けます。
![google_chrome01.PNG](https://qiita-image-store.s3.amazonaws.com/0/11757/daa1e66d-9fd1-13e1-7fa2-f775505cb74e.png)
1. Emulationをオンにする  
メニュー内のOverridesをクリックし、
Show 'Emulation' view in console drawer にチェックを入れます。
![google_chrome02.PNG](https://qiita-image-store.s3.amazonaws.com/0/11757/ee35455d-5abb-b818-a1a4-8ce260194cb1.png)  
×をクリックして設定画面を閉じます。
1. User Agentを変更する  
今度は設定アイコンの左隣のメニューアイコン（メニューっぽいやつｗｗ）をクリックします。
![google_chrome03.PNG](https://qiita-image-store.s3.amazonaws.com/0/11757/21d99785-fa66-0f6f-6b80-b0744b5b73df.png)  
Emulationタブをクリックします。  
Deviceのプルダウンメニューで適当に Apple iPhone 5 とか選んでみます。  
これだけでもUser Agentが変更できているはずです。スバラシイ。  
![google_chrome04.PNG](https://qiita-image-store.s3.amazonaws.com/0/11757/ebdd07c3-c957-db71-0094-deec6e02fe99.png)  
Screenの Emulate screen のチェックボックスは、設定が面倒でしたら外した方が見やすいかなと思います。  
また、User Agentを個別で設定することもできます。  
User Agentのプルダウンメニューで適当に iPhone ― iOS7 とか選べます。

## Touch Eventを発生させる

Touch Eventでないとスマホ向けサイトのボタンが反応しないことがあるので、その設定をします。
Sensorsの Emulate touch screen にチェックを入れます。
![google_chrome05.PNG](https://qiita-image-store.s3.amazonaws.com/0/11757/dd8e9982-b8fa-70ed-6b3b-a647cc5d4435.png)
これでマウスカーソルが変な●になるｗｗｗクリック時にTouch Eventを発生させることができます。

## まとめ

急に新しいバージョンのChromeになってもめげずに設定入力フォームを探しましょう！
robots.txt

## 大手サイトのrobots.txt

Google：https://www.google.com/robots.txt
Facebook：https://www.facebook.com/robots.txt
ヤフオク：https://auctions.yahoo.co.jp/robots.txt
アマナイメージズ：https://amanaimages.com/robots.txt


## オンライン解析ツール一例

* [robots.txtオンライン解析ツール](http://www.searchengineoptimization.jp/robots-txt-analyzer)
* [Is your website available for crawlers? - Robots.txt Testing Tool](https://en.onpage.org/free-tools/robots-txt/)
* [New Robots.txt Syntax Checker: a validator for robots.txt files](http://tool.motoricerca.info/robots-checker.phtml)
* [Robots.txt Test | SeoSiteCheckup.com](https://seositecheckup.com/tools/robotstxt-test)

## bingbot,msnbot

アクセス数が無視できない量になってきたため調査した。

* [Crawl delay and the Bing crawler, MSNBot | Webmaster Blog](https://blogs.bing.com/webmaster/2009/08/10/crawl-delay-and-the-bing-crawler-msnbot/)
* [To crawl or not to crawl, that is BingBot's question | Webmaster Blog](https://blogs.bing.com/webmaster/2012/05/03/to-crawl-or-not-to-crawl-that-is-bingbots-question/)
* [bingbotにはCrawl-delayもクロール制御も効かない - ヲレサイト](https://woresite.jp/2015/11/14/023134.html)

```sh:単位は分
User-agent: msnbot
Crawl-delay: 10

User-agent: bingbot
Crawl-delay: 30

```

## 知見

* 空行を入れること
 
```bash:robots.txt例
User-agent: Yandex
Disallow: /

User-agent: SemrushBot
Disallow: /
```

* 最終行に空行を入れること
* WEBサイトからのコピペで書くと、その行に見えないダメ文字が入っている可能性がある。(解析ツールにてエラーが出るのでわかる。)



書式
=========


Disallowに対してAllowが上書きする。
長いPATHが短いPATHを上書きする。(コメント欄参照)
最終行は空行である必要がある。

```bash:
User-agent: *
Disallow: /
Allow: /public/
Allow: /public2/
　
```

metaタグに書く場合
=========

robots.txtはDocumentRoot直下に置く必要がありますが置けない、置きたくない場合もあります。
まずそうなファイルにはmetaタグに書く。

```html:
  <meta name="robots" content="none,noarchive">
  <meta name="Googlebot" content="noarchive">
```
CentOS6.x yum外部リポジトリまとめ(2014/01版)

##yumプラグインのインストール
```bash
yum install yum-plugin-priorities yum-plugin-fastestmirror
```

##yumリポジトリのインストール
###RPMforge
######PGP-KEYのインストール
```bash
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
```
######a)32bitの場合
```bash
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm
```
######b)64bitの場合
```bash
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
```
######インストール確認
```bash
rpm -q rpmforge-release
```

###EPEL
######PGP-KEYのインストール
```bash
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
```
######a)32bitの場合
```bash
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
```
######b)64bitの場合
```bash
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```
######インストール確認
```bash
rpm -q epel-release
```

###ELRepo
######PGP-KEYのインストール
```bash
rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
```
######a)32bitの場合,64bitの場合共通
```bash
rpm -ivh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
```
######インストール確認
```bash
rpm -q elrepo-release
```

###Remi
######PGP-KEYのインストール
```bash
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
```
######a)32bitの場合,64bitの場合共通
```bash
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```
######インストール確認
```bash
rpm -q remi-release
```

###CentALT
######a)32bitの場合
```bash
rpm -Uvh http://centos.alt.ru/pub/repository/centos/6/i386/centalt-release-6-1.noarch.rpm
```
######b)64bitの場合
```bash
rpm -Uvh http://centos.alt.ru/pub/repository/centos/6/x86_64/centalt-release-6-1.noarch.rpm
```
###RPMFusion
######PGP-KEYのインストール
```bash
gpg --keyserver pgp.mit.edu --recv-keys 849c449f
gpg --keyserver pgp.mit.edu --recv-keys 5568bbb2
```
######a)32bitの場合
```bash
yum localinstall --nogpgcheck http://download1.rpmfusion.org/free/el/updates/6/i386/rpmfusion-free-release-6-1.noarch.rpm http://download1.rpmfusion.org/nonfree/el/updates/6/i386/rpmfusion-nonfree-release-6-1.noarch.rpm
```
######b)64bitの場合
```bash
yum localinstall --nogpgcheck http://download1.rpmfusion.org/free/el/updates/6/x86_64/rpmfusion-free-release-6-1.noarch.rpm http://download1.rpmfusion.org/nonfree/el/updates/6/x86_64/rpmfusion-nonfree-release-6-1.noarch.rpm 
```

##priorityの設定
使用するリポジトリに、priority=1
使用しないリポジトリに、priority=2
を設定する。
```
vi /etc/yum.repos.d/rpmforge.repo
vi /etc/yum.repos.d/epel.repo
vi /etc/yum.repos.d/elrepo.repo
vi /etc/yum.repos.d/remi.repo
vi /etc/yum.repos.d/centalt.repo
vi /etc/yum.repos.d/rpmfusion-free-updates.repo
vi /etc/yum.repos.d/rpmfusion-nonfree-updates.repo
```
PHPにおけるメソッドチェーンの構築

どうも。
最近少しRailsに浮気していたmorisukeです。

元鞘に収まりLaravel4でガリガリ組んでいたら自分でもやってみたくなったので、
PHPでのメソッドチェーンの組み方を復習してみました。

```php:chain.php
class Chain{
  protected $price;
  protected $quantity;
  protected $option;

  public function setPrice($price){
    $this->price = $price;
    return $this;
  }
  
  public function setQuantity($quantity){
    $this->quantity = $quantity;
    return $this;
  }

  public function setOption($option) {
    $this->option = $option;
    return $this;
  }

  public function get() {
    $amount = $this->price * $this->quantity;
    foreach ($this->option as $key => $val) {
      if ($key === 'tax') $amount -= ceil($amount * $val);
      elseif ($key === 'discount') $amount -= $val;
    }
    return $amount;
  }
}
```

```php:useExample1
$chain = new Chain();

$chain
  ->setPrice(100)
  ->setQuantity(5)
  ->setOption(array(
    'tax'      => '0.05',
    'discount' => '150'
  ));

$total_amount = $chain->get();
echo $total_amount;
// 375
```

```php:useExample2　(PHP5.4以降)
$total_amount = (new Chain)
  ->setPrice(100)
  ->setQuantity(5)
  ->setOption([
    'tax'      => '0.05',
    'discount' => '150'
  ])
  ->get();

echo $total_amount;
// 375
```

setPrice()やsetQuantity()で ```return $this;``` をしているのがチェーンの要。
$thisは自分自身を表すので返り値は必ずChainインスタンスを取ります。
そのため返り値に対し直接メソッドを呼び出しても大丈夫なわけです。

せっかくLaravel4というメソッドチェーンにあふれた環境でコーディングするのですから、
共通Serviceなどでこういったクラスを組んでみると楽しいかもしれません。
データ出してくれって言われたときに便利なテクニック

こんな感じのモデルの時

```
User

* id
* name
* money

Pet

* id
* user_id
* name

Food

* id
* name

Meal

* id
* pet_id
* food_id
* created_at
```

ポイント

* 基本、rails consoleで出す
* 早さが重要
* 言われる前に関係あることもついでに出す

例1) シュナウザー飼ってる人ってどのくらいいるの？

```rb
a = Pet.where(name: "シュナウザー").select(:user_id).uniq
result = a.count
```

例2) シュナウザー飼ってる人っていくらくらい持ってるの？

```rb
b = User.where(id: a)
result = b.select("avg(*)")
```

例3) シュナウザー飼ってて1000万以上お金持ってる人って自分でペットに餌上げてる人っているの？

```rb
c = Pet.where(id: Meal.select(:pet_id).uniq) # ペット飼って餌上げてる人
d = b.where("money > 1000万").where(id: c.select(user_id))
result = d.count
```

例4) シュナウザー飼ってて1000万以上お金持ってる人で、ペットに餌上げてる人って今年月何回くらい平均餌上げてるの？

```rb
e = Pet.where(user_id: d.select(:id)) # シュナウザー飼ってて1000万以上お金持ってる人で、餌もらってるペット。

f = Meal.group("month, pet_id").select("count(*)").select("pet_id")
  .select("DATE_TRUNC('month', meals.created_at) AS month") # 月ごとペットごとに食べている餌の数

result = e.joins("JOIN (#{f.to_sql}) AS table ON table.pet_id = pets.id")
  .group("table.month").select("avg(table.count)")
```

コツ

* パーツに分けて出力する
* エラーがでたら、to_sqlしてなにが違うか確認する
* groupやjoinよりwhereで書くほうがあとあと使いやすい
* 最速なコードより最速で結果を見せるのが重要

これなら全部お願いされても10分以内にデータ出せるでしょ！！
でもqiitaの上でしかコード書いてないのでバグがないか自信なし。
第17回オフラインリアルタイムどう書くの参考問題 (回文基数)

回文基数 〜 横へな 2014.1.10 参考問題

http://nabetani.sakura.ne.jp/hena/ord17scheherazade/

最近始めた Haskell で書いてみました。

```hs
valList :: Int -> Int -> [Int]
valList x n = map (n^) [numDigits, (numDigits-1)..0]
  where numDigits = floor $ logBase (fromIntegral n) (fromIntegral x)

convert :: Int -> Int -> [Int]
convert x n
  | x < n = [x]
  | otherwise = map (snd) $ tail $ scanl (\acc y -> let z = floor $ fromIntegral(fst acc) / fromIntegral(y) in ((fst acc) `mod` y, z)) (x, 0) xs
  where xs = valList x n

solve x = if list == [] then "-" else show list
  where list = map (fst) $ filter (\xs -> reverse (snd xs) == (snd xs)) $ map (\n -> (n, convert x n)) [2..x]
```
[Ruby] forwardableとメソッドの呼び出し制限

forwardableの使い方などは[ここ](http://magazine.rubyist.net/?0012-BundledLibraries)が詳しい。

`extend Forwardable`すると`def_delegators`を利用して、特定のオブジェクトに処理を委譲することができる。
このとき、メソッドの呼び出し制限を超えてオブジェクトのメソッドにアクセスすることができる。

```rb
require "forwardable"

class Forwarded
  def pub
    p "pub"
  end

  def pro
    p "pro"
  end

  def pri
    p "pri"
  end

  protected :pro
  private :pri
end

class Forward
  extend Forwardable

  def_delegators :@forwarded, :pub, :pro, :pri

  def initialize
    @forwarded = Forwarded.new
  end
end

forward = Forward.new

forward.pub
# => "pub"
forward.pro
# => "pro"　(アクセスできる！！)
forward.pri
# => "pri"　(アクセスできる！！)
```

柔軟というか、なんというか。
StoryboardとContainerを多用した開発のメリットとデメリット

[Wantedly](https://www.wantedly.com/)で実際に開発しているstoryboardの一部公開してみました。

うまくいったなということをまだ公開してないアプリの実例を見せながら紹介します。

初めて作ったアプリでは、Containerの存在を知らず、TableViewをScrollViewControllerに埋め込んで、ページャーなどを実装していました。そのため、どうしてもコピペの多いアプリを作ってしまってました。

今回は、Viewの中にContainerをたくさん設置して、一覧を表示させる必要があるパーツはすべてUITableViewControllerを継承して作成しました。

![スクリーンショット 2014-01-09 23.22.59.png](https://qiita-image-store.s3.amazonaws.com/0/4585/1e0eb2ac-d7f4-f2c0-3c54-30bd7f0bf4fa.png)

その結果、

一覧画面を表示したり、
![スクリーンショット 2014-01-09 23.47.44.png](https://qiita-image-store.s3.amazonaws.com/0/4585/257efefd-2588-4e65-919f-b781d0f9d85e.png)

ローディングを出したり、
![スクリーンショット 2014-01-09 23.53.15.png](https://qiita-image-store.s3.amazonaws.com/0/4585/ff029825-0368-7d89-5304-386fe7e59a7c.png)

通信失敗後の更新ボタンを設置したり、
![スクリーンショット 2014-01-09 23.00.00.png](https://qiita-image-store.s3.amazonaws.com/0/4585/e4f17227-a134-fe6b-5795-85f5d3b0a58c.png)

することが、ある共通のUITableViewControllerを継承したクラスを使うことで実装できました。
※ スクリーンショットはまだ開発中なのでそのまま公開されるかは分かりません。

メリット
・ContainerとStoryboardとの組み合わせが非常によく実装がすごく早くなった
・TableViewでの分岐も減り、ViewControllerのコードが減って読みやすくなった
・どのViewControllerがどのViewControllerが繋がっているかすぐ分かるようになった

デメリット
・TableViewを多用するため、そのままだとスクロールが遅くなる
・Storyboardがノートパソコンの画面だと見にくい
・Storyboardを多用するため、頻繁にトラックパッドを使う必要がある
・そのためノートパソコンでの開発が増えて、好きなキーボードのタイピングが遅くなった。。

最後は気持ちになってしまいましたが、デメリット多く書いてますが、それ以上に開発効率がよかったので、Storyboard上でStoryboardを設置して、UITableViewController使うのはオススメです。

Wantedlyのアプリも近日出しますのでお楽しみに！！
https://www.wantedly.com/
テキストファイルを特定の行数の複数のファイルに分割する

```split_file_by_lines.rb
# encoding: utf-8

if ARGV.length != 2 then
  abort "引数の数が正しくありません。\nruby split_file_by_lines.rb source_file lines_limit"
end

source_file, lines_limit = ARGV
source_file_name = File.basename(source_file, '.*')
source_file_ext = File.extname(source_file)

lines = []
File.foreach(source_file) {|line|
  lines << line
}

div = lines.count.div(lines_limit.to_i)
file_count = div + 1

file_no = 1
lines.each_slice(lines_limit.to_i) {|e|
  # ファイル名に付与する連番を作成する
  file_no_suffix = "#{sprintf('%0' + file_count.to_s.length.to_s + 'd', file_no)}"
  
  # 分割したファイルを出力する
  out_file_name = "#{source_file_name}_#{file_no_suffix}#{source_file_ext}"
  File.open(out_file_name, 'w') {|f|
    f.write e.join
  }
  file_no += 1
}
```
iPhoneでメール送信


##追加するフレームワーク
MessageUI.framewark

##ソース
MessageUI/MessageUI.hをimportし、
デリゲートにUIActionSheetDelegate,MFMailComposeViewControllerDelegateを追加する。

```objective-c:.hファイル

#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>


@interface WebViewController : UIViewController<UIActionSheetDelegate,MFMailComposeViewControllerDelegate>{
}

@end
```
MessageUI/MFMailComposeViewController.hをインポート。



```objective-c:.mファイル


- (void)sendMail:(NSString *)url{
    MFMailComposeViewController *mailPicker = [MFMailComposeViewController new];
    mailPicker.mailComposeDelegate = self;
    [mailPicker setMessageBody:url isHTML:NO];
    [self presentViewController:mailPicker animated:TRUE completion:nil];
}

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
    switch (result){
        case MFMailComposeResultCancelled:
            break;
        case MFMailComposeResultSaved:
            break;
        case MFMailComposeResultSent:
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                            message:@"送信に成功しました"
                                                           delegate:nil
                                                  cancelButtonTitle:nil
                                                  otherButtonTitles:@"OK", nil];
            [alert show];
            break;
        }
        case MFMailComposeResultFailed:// 送信に失敗した場合
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                            message:@"送信に失敗しました"
                                                           delegate:nil
                                                  cancelButtonTitle:nil
                                                  otherButtonTitles:@"OK", nil];
            [alert show];
            break;
        }
        default:
            break;
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}

```

sendMailメソッドでメール送信のViewを作成し、
メール送信処理が完了後、mailComposeControllerメソッドが呼ばれる。
「製品のエディションによって機能が違う」をどう実装するか

「そっくりだけど少しだけ違う」

時にはそんな機能を実装しなければならないときがあります。

その違いごとにクラスをコピーしてちょっとずつ書き換えるなんて嫌ですよね？

C++だと手段が豊富にあるのでいろんなことができるのですが、その中の一つテンプレートの特殊化を使ったパターンを考えてみます。

「製品のエディションによって機能が違う」というシチュエーションを想像してみました。

```cpp:test.cpp
#include <iostream>

// Product type

namespace product_type {

    struct basic
    {
    };

    struct professional : basic
    {
    };

    struct ultimate : professional
    {
    };

} // namespace product_type

template <typename ProductType>
class settings
{
public:
    bool want_display_tool_tip = true;
};

template <>
class settings<product_type::ultimate>
{
public:
    bool want_display_tool_tip = true;
    bool enable_support_desk = true;
};

int main()
{
    using namespace std;

    settings<product_type::basic> settings_1;
    // cout << (settings_1.enable_support_desk ? "A" : "B") << endl;
    // ERROR: test.cpp:41:25: error: ‘class settings<product_type::basic>’ has no member named ‘enable_support_desk’

    settings<product_type::ultimate> settings_2;
    cout << (settings_2.enable_support_desk ? "A" : "B") << endl;
}
```

product_typeという名前空間の中に製品のエディションが定義してあります。

```cpp
template <typename ProductType>
class settings
{
public:
    bool want_display_tool_tip = true;
};
```

このクラスでデフォルトの実装をしています。

```cpp
template <>
class settings<product_type::ultimate>
{
public:
    bool want_display_tool_tip = true;
    bool enable_support_desk = true;
};
```

ULTIMATEエディションの時のみクラスを再定義してます。

また、誤ってBASICエディションでenable_support_deskを参照したときはコンパイル時にエラーにできます。こんな芸当はRubyにはできないですよね。

このように、C++の特殊化を使えば例外的なケースを表現できるのではないでしょうか。


もうちょっと書きたかったことがあるので続きます・・・。
ZombieObjectとは何か


[Effective Objective-C 2.0](http://www.amazon.co.jp/Effective-Objective-C-2-0-Matt-Galloway/dp/4798134198)の中に、ZombieObjectの事が書いてあり面白かったので、自分なりにまとめてみました。

ZombieObjectの話の前に、解放されたオブジェクトにアクセスするとどうなるのか？の話をします。

# 解放されたオブジェクトにアクセスするとどうなるのか?
使い終わり解放されたオブジェクトにアクセスすると、普通はクラッシュします。ARCの登場以前は、呼吸をするようにクラッシュしてましたが、ARC以後はその頻度も減りました。でもまだクラッシュするときはします。ニンゲンダモノ。シカタガナイネ。

このとき、「偶然にもクラッシュしない」場合が発生します。これは、オブジェクトを解放後、そのアドレスでアクセスした場合に、ゴミデータにアクセスできてしまったり、別オブジェクトがそこに割り当てられていたりなど、いろいろな原因があり得ます。
![ClashApp.xcodeproj_—_PAMViewController.m-19.png](https://qiita-image-store.s3.amazonaws.com/0/7946/f2a05059-9e8a-f1a0-25a8-3049fbe70249.png "ClashApp.xcodeproj_—_PAMViewController.m-19.png")
↑の例では、_assignString変数のアドレスに、偶然NSLogで使った“assignString=“という文字列が割り当てられて、クラッシュせずに動作してしまったんじゃないかな、と思います。

# ZombieObjectを有効にすると、解放したオブジェクトにアクセスすると止まるようになる
「時々クラッシュする」というのは非常にやっかいです。デバッグしても原因の特定が難しく、憶測でいろいろソースを修正してしまいがちです。そしてだいたい憶測は外れます。結果わけがわからない状態になったりもします。
ZombieObjectを有効にすると、このような「解放されたオブジェクトへのアクセス」があると、そこで100%止まるようになります。

# ZombieObjectを有効にするには
プロジェクトのSchemeを開き、”Diagnostics”で”Enable Zombie Objects”にチェックを入れます。
![スクリーンショット_2014_01_09_21_21.png](https://qiita-image-store.s3.amazonaws.com/0/7946/449d0c1c-481a-8454-f18f-76dbc724de68.png "スクリーンショット_2014_01_09_21_21.png")

この状態でデバッグ実行し、解放されたオブジェクトにアクセスすると、”message sent to deallocated instance 〜”といったログを出して止まるようになります。
![ClashApp.xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/7946/4d26e710-5d41-bf74-719d-e84f5058e586.png "ClashApp.xcodeproj.png")


# ZombieObjectは何をやっているのか
ここからは自分の推測も入っているため、間違っている可能性があります。

通常、オブジェクトをallocした場合、mallocにてメモリが確保されます。そしてretainCountが0となり解放された場合、freeでメモリが解放されます。この時メモリ上のデータはゴミとして残ります。このアドレスにアクセスした場合、もしかしたらクラッシュせずに動作するかもしれません。また、新しいオブジェクトが同じアドレスに生成(malloc)された場合、古いオブジェクトを参照していたはずのアドレスが残っていると、新しいオブジェクトへの参照として動作してしまう可能性があります。
![Skitch_から-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/7946/acb044f8-98b3-a2db-23c8-9d792fc9f531.jpeg "Skitch_から-2.jpg")

ZombieObjectが有効な場合、”オブジェクトを解放してもメモリを解放(free)せずに、ゾンビとして残す”ような挙動をします。
オブジェクトが解放される時、元々のオブジェクトのデータを残しゾンビ化します。次にオブジェクトがallocされても、ゾンビ化したオブジェクトのメモリには上書きせず、別領域をmallocします。またゾンビ化したオブジェクトは、どんなメソッドが呼ばれても例外を出すようになります。
![Skitch_から-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/7946/e2267bf5-c807-ed80-315b-691ba7cacb06.jpeg "Skitch_から-4.jpg")

この仕組みで、「解放されたオブジェクトにアクセスが来ると止まる」ようになります。
一方、この仕組みではメモリが解放されないので、どんどんメモリが肥大化するはずです。なので、いつもは無効にしておいて、時々クラッシュするような厄介な状態になったら有効にする、といった使い方が良いと思います。


# そういえばZombieって、ほかの場所で見た事あるような、、
InstrumentsでProfileするときに、”Zombies”ってありましたね。これは解放されたオブジェクトにアクセスした場合に停止して、「そのオブジェクトが何処でalloc/retain/releaseされたのか」を追っかける事が出来るので便利です。
![Profile__ClashApp_.png](https://qiita-image-store.s3.amazonaws.com/0/7946/4311692e-ba0c-04fb-9166-3481902447d3.png "Profile__ClashApp_.png")
self.hogehogeと_hogehogeの違いについて @propertyの話

```objc:Sample.h
@property(nonatomic) int hogehoge;
```

と@propertyの宣言をした場合、
Sample.mからこのプロパティにアクセスする方法は、
self.hogehoge = （値）;
_hogehoge = （値）;
という２通りの方法があります。

どちらの方法でも使い方はほぼ一緒ですが、少しだけ違いがあります。
それは、値を変更したときにオーバーライドしたセッターが呼ばれるかどうかです。

すなわち、
self.hogehoge = （値）;
のようにして値の変更を行った場合は、以下のメソッドが呼ばれます。

```objc:Sample.m
-(void)setHogehoge:(int)hogehoge{
    _hogehoge = hogehoge;
}
```

それに対して、
_hogehoge = （値）;
の場合は、上記のメソッドは呼ばれません。

従いまして、プロパティの値の変更に伴い何らかの処理を行いたいときには、
self.hogehoge = （値）;
を用いるのはアリかと思います。
例えば、

```objc:Sample.m
-(void)setHogehoge:(int)hogehoge{
    if(hogehoge > 5){
        hogehoge = 5;
    }
    _hogehoge = hogehoge;
}
```

とすることで、hogehogeの値が5より大きくならないようにすることが可能です。

また、

```objc:Sample.m
-(void)setHogehoge:(int)hogehoge{
    NSUserDefaults *uD = [NSUserDefaults standardUserDefaults];
    [uD setInteger:hogehoge forKey:@"HogeKey"];
    _hogehoge = hogehoge;
}
```

と書くことで、値の変更時に保存処理を行うことができます。
Processing2.0でSpheroを動かす


# はじめに

Spheroは知る人ぞ知るiphoneやandroidから操作することが出来るロボットボールである。タッチやフリック操作で、ボールを自在に操ることが出来る他、ボールを手にもって動かすことで入力インタフェースにもできる使い勝手の良いデバイスである。

![Sphero](http://www.wired.com/reviews/wp-content/uploads/2011/12/Sphero1.jpg)

このSphero、もちろん、iOS用やAndroid用の開発apiが公開されているのだが、もう少し手軽にパソコン（もっというとMac）から操作できないかと思い調べてみたら、案の定、rubyやpythonなどのスクリプト言語からアクセスする非公式のライブラリが提供されていた。しかし、自分が最近使っているのはProcessingであるため、できればProcessingで動かせると良い。そこで、簡単なラッパーを作ってGithubで公開（晒）してみた。

備忘録としてここに使い方を書いておく。

ちなみに拙い英語で、GithubのREADME.mdに使い方を書いてあるので、別にここを読まなくても使うことはできる（というか以下はREADME.mdの和訳です）。

# セットアップ

このプロジェクトは、py4jというパッケージを利用して、JavaからPythonのコードを実行できるようにしたラッパーである。そのため、必要なライブラリを自分で取ってくる必要がある。

* py4j: Gateway Server/Clientを介して、JavaとPythonのコードを双方のプログラムから呼び出すことができるようにするパッケージ
	* 以下からインストールすることができる http://py4j.sourceforge.net/download.html
* sphero: PythonのSphero制御パッケージ
	* pipでインストールできる
	```
	$ pip install sphero
	```
* slf4j: Java用のロギングインターフェースパッケージ（必要ないっちゃ必要ないけど、いつも使うので入れてしまいました）
	* 次からからダウンロードできます。
		http://www.slf4j.org/download.html
	* 最新バージョンをダウンロードして、解凍する
	* 解凍するといろいろでてくるが、以下のjarファイルをプロジェクトのcodeディレクトリにコピーする（なかったら、作る）
		* slf4j-api.jar
* logback: ロギングの実装パッケージ
	* 次からダウンロードできます http://logback.qos.ch/download.html
	* 最新バージョンをダウンロードして、解凍する
	* 解凍するといろいろでてくるが、以下のjarファイルをプロジェクトのcodeディレクトリにコピーする（なかったら、作る）
		* logback-classic.jar
		* logback-core.jar

プロジェクトのソースコードは、以下から持ってくることができる
```
$ git clone https://github.com/mountcedar/SpheroControl.git
```

すべての準備が整うと、プロジェクトのソースツリーは以下のようになっているはず。

```
SpheroControl/
├── GatewayServer.pde
├── README.md
├── Sphero.pde
├── SpheroControl.pde
├── code
│   ├── logback-classic-X.X.X.jar
│   ├── logback-core-X.X.X.jar
│   ├── py4jX.X.jar
│   └── slf4j-api-X.X.X.jar
└── engine
    ├── __init__.py
    └── gateway.py
```

# 使い方

プロジェクトの実行方法は、以下の通り。後は自分のやりたいことに従って、改造してください。

0. Spheroを振って、スリープ状態から起こす
1. SpheroControl.pdeを実行
2. つながるまでしばらく待ちます。
3. コネクションが確立するまで、Spheroは色を変えながら点滅していますが、確立すると青白い色で固定します。
4. サンプルプログラムで、drawが呼び出されるたびに色がランダムで変化するプログラムが走ります。
5. エスケープキーで終了します。
	* 注意として、エスケープキーではなく、Closeボタンで終了してしまうとバックグラウンドで動かしているpythonプロセスが終了しないままJavaの方だけが終了し、Pythonの方がゾンビプロセスとして残ります。その場合はkillコマンドなり、アクティビティモニタなりでPythonプロセスを強制終了してください。

APIはそんなに難しくないので、ソースコードを読んでください。Pythonプロセスがゾンビになりやすいことも含めて、自己解決できない方は手を出さない方が賢明かと思います（自分で公開しておいてごめんなさい）

# 最後に

ここまで書いて、ふと同じ時間でシリアル通信を使ったpure processingのコードも書けたのではないか・・と思い、若干後悔している。できれば、そちらにも手を出したい。こういうの作ったら、やっぱり、Sphero側に一報すべきなんだろうか・・

# 参考文献

* http://www.gosphero.com/ja/
* https://github.com/faulkner/sphero
* https://github.com/mountcedar/SpheroControl
Rails4だとviewのcacheに直接アクセスできない

Rails4ではviewのキャッシュ機構が変わり、何もしなければFragment Cacheに必ずdigestがつくようになりました。

```html+erb:hoge.html.erb
<%= cache "hoge" do %>
  <div></div>
<% end %>
```

このような記述をした場合、Rails4より前では

```rb:hoge.rb
Rails.cache.read("views/hoge")
# => "<div></div>"
```

このようにキャッシュのキー名に `views/` をprefixとしてつけることで、Rails.cacheの内容に直接アクセスすることができました。

しかし、Rails4からはerb内で `<%= cache "hoge" %>` のようにcacheヘルパーを使い、cacheの呼び出し・書き込みをするとdigestが付与されます。

つまり、Rails3までは

`views/hoge`

というkeyで保存されていたcacheが

`views/hoge-○○○○`

と言った形で、キーのsuffixとして、一見ランダムな文字列が付け足されるようになりました。

## 何が問題か

これがどう困るのかというと、controller等で

```rb
cached_html = Rails.cache.read("views/hoge")
```

のようなことができなることです。

## 解決法

根本的な解決にはなっていませんが、viewで `:skip_digest => true` を利用することで、digestを付与しないことができます。

```html+erb:hoge.html.erb
<%= cache "hoge", :skip_digest => true do %>
  <div></div>
<% end %>
```

これによって

```rb
cached_html = Rails.cache.read("views/hoge")
```

のように、 `Rails.cache` を利用して、cacheの中身を取得できます。

　
* * *

　

また、余談ですが、cacheのkeyにつくsuffixは完全にランダムな文字列ではなく、

```html+erb
<%= cache "hoge" do %>
  <!-- この部分にsuffixはよって生成される ->
<% end %>
```

`cache` ブロックの中身によって生成されています。

なぜならこのdigest機能の目的は、deployやコードの更新によって、 `cache` ブロック中身が変わった際に、昔のcacheを参照しないためにあるからです。

しかし、ブロックの中身からdigestを取得する方法は、残念ですが分かりませんでした。

また、もしかしたら、cacheのキー名からdigestを取得するRailsのAPIがあるかもしれません。誰か教えてください。
bundleコマンドにパスが通っていなかったときの対処法


bundlerをインストールする。

```bash
$ gem install bundler
```

確認のため`bundle -v`を実行する。

```bash
$ bundle -v
-bash: bundle: command not found
```

`command not found`と言われてしまった。
どこにインストールされたか確認する。

```bash
$ gem contents bundler | grep bin
/home/deploy/.gem/ruby/2.0.0/gems/bundler-1.5.1/bin/bundle
```

`/home/deploy/.gem/ruby/2.0.0/gems/bundler-1.5.1/bin`の下に発見した。
しかし、これを`PATH`に設定するとバージョンアップの度に更新しなければならない。

そんなバカな！

```bash
$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 2.0.12
  - RUBY VERSION: 2.0.0 (2013-11-22 patchlevel 353) [x86_64-linux]
  - INSTALLATION DIRECTORY: /home/deploy/.gem/ruby/2.0.0
  - RUBY EXECUTABLE: /usr/bin/ruby20
  - EXECUTABLE DIRECTORY: /home/deploy/.gem/ruby/2.0.0/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /home/deploy/.gem/ruby/2.0.0
     - /usr/local/lib64/ruby/gems/2.0.0
     - /usr/lib64/ruby/gems/2.0.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
     - "gem" => "--no-ri --no-rdoc"
  - REMOTE SOURCES:
     - https://rubygems.org/
```

`EXECUTABLE DIRECTORY`を使いましょう。

```bash
$ echo 'export PATH="$HOME/.gem/ruby/2.0.0/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
```

```bash
$ bundle -v
Bundler version 1.5.1
```
wicketstuff-googlechartsを試してみる

後輩に[wicketstuff-googlecharts](https://github.com/wicketstuff/core/wiki/GoogleCharts)の使い方を教えた時のサンプルコードがもったいないのであげておく。

## pom.xmlにdependencyを追加

```xml:pom.xml
  <dependency>
    <groupId>org.wicketstuff</groupId>
    <artifactId>wicketstuff-googlecharts</artifactId>
    <version>6.12.0</version>
  </dependency>
```

## HomePage.html

```html:HomePage.html
  <img wicket:id="chart"></img>
  <button type="button" wicket:id="refresh">更新</button>
```

## HomePage.java

```java:HomePage.java
public class HomePage extends WebPage {

  public HomePage() {
    IChartData data = new AbstractChartData() {

      @Override
      public double[][] getData() {
        Random r = new Random();
        int n = r.nextInt(10);
        return new double[][] { { n, 10 - n } };
      }
    };

    ChartProvider provider = 
      new ChartProvider(new Dimension(250, 100), ChartType.PIE, data);
    provider.setPieLabels(new String[] { "a", "b" });

    final Chart chart = new Chart("chart", provider) {

      @Override
      protected void onInitialize() {
        super.onInitialize();
        setOutputMarkupId(true);
      }
    };
    add(chart);

    add(new AjaxLink<Void>("refresh") {

      @Override
      public void onClick(AjaxRequestTarget target) {
        chart.invalidate();
        target.add(chart);
      }
    });

  }
}
```
注）serialVersionUIDは省略している。

AbstractChartDataのオブジェクトでグラフに表示するデータを、ChartProviderのオブジェクトでグラフの設定（サイズや形式、ラベルなど）が設定される。

Chart#invalicate()メソッドは、Ajaxでの更新時にグラフの設定やデータを再読み込み（Google ChartsへのURLの再生成）をするために実行している。

## 実行結果

![wicketstuff-googleCharts.png](https://qiita-image-store.s3.amazonaws.com/0/8064/2ee2e76b-c31f-309c-ce52-790ead91cd11.png)

更新ボタン押すと、グラフが更新される。
安藤ロイドブラウザメモ



* [スマｰﾄフォン(iPhone, Android)ブラウザのバグまとめ](http://tenderfeel.xsrv.jp/css/1177/)

* [Android4系のデフォルトブラウザでwidthが効かないバグとbackground-colorで回避出来るというメモ](http://kanonji.info/blog/2013/05/30/android4%E7%B3%BB%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7width%E3%81%8C%E5%8A%B9%E3%81%8B%E3%81%AA%E3%81%84%E3%83%90%E3%82%B0%E3%81%A8backgro/)

* [Android4.0とiframe](http://blog.webcreativepark.net/2012/07/20-010104.html)

* [AndroidやiPhoneのHTML,CSS,JavaScriptのバグまとめ](http://blog.webcreativepark.net/2012/03/13-093853.html)


* [スマートフォンサイトをデザインする上で知っておくべき10のTIPS](http://blog.webcreativepark.net/2011/06/16-103025.html)

* [【フロントエンドエンジニア向け】スマホ(iPhone/Android)ブラウザのクセ＆バグまとめ](http://matome.naver.jp/odai/2137820644688847801)
jQuery mobleとiOS7の組み合わせでハマった事

#jQuery mobleとiOS7の組み合わせでハマった事
jQuery moble + backbone.js の構成でスマートフォン向けwebアプリを作成中に
ios7だけ不具合で悩まされました。
その際の事を記録しておきます。

### 環境
+ ios7.04
+ jQuery mobile 1.3

## ページ遷移時に、ナビゲーションバーのbackボタンを押すと遷移がヘン
backボタンで戻ると、いきなりトップページに飛んだりする。
androidや、ios6では遷移前のページに正常に戻るが、ios7ではダメ。
よくよく調べると、backボタンでの戻りだけではなく、window.history を利用している所の挙動が
総じてヘン。
ggってみると OH…
[Work around for iOS 7 changePage / back button issue? - jQuery Forum](http://forum.jquery.com/topic/work-around-for-ios-7-changepage-back-button-issue)

**結果** window.history の代わりに、自前でページ履歴のマネージャを作って対応する羽目に。

## vclickの挙動がヘン
jQuery mobileのクリックイベントがトロいので、clickイベントではなくvclickイベントを使ってたのですが、
ios7だけ挙動がヘン。
popupメニューを開き、項目を選ぶためにタップすると、popupメニューが閉じた後も再度クリックイベントが
実行されてしまうような挙動になります。
(popupメニュークローズ後、popupメニューのウラに隠れていたボタン等のclickイベントも発火してしまう)

**結果** popupメニューだけvclickを使わず、clickを使う事で回避

**ios7.1では治ってるといいな**
【PHP】【HTML】関数とform送信を利用したプログラム

こんにちは。

初期表示で既に文字が表示されてはいますが、
form送信、関数をキーワードとして学習したメモです。


```html+php
<?php
	function check($subject,$points){
		echo $subject ."の結果" ;
		if($points > 75){
			echo "合格" ;
		}else{
			echo "不合格" ;
		}
		echo "(点数:" .$points .")" ;
	}

	var_dump($_POST['subject']) ;
	var_dump($_POST['points']) ;

	$subject = $_POST['subject'] ;
	$points = $_POST['points'] ;
?>
<html>
	<body>
		<form action="" method="post">

			<p>
				科目:<input type="text" name="subject">
				点数:<input type="text" name="points">
				<input type="submit" value="送信">
				<br />
<?php			check($subject,$points) ; ?>
			</p>
		</form>
	</body>
</html>
```

```html
<form action="" method="post">
```
ここでテキストボックスに入力された内容を
自分にPOST送信で返す。

```php
var_dump($_POST['subject']) ;
var_dump($_POST['points']) ;
```
ここで、実際にどんな値をうけとっているか確認。

```php
$subject = $_POST['subject'] ;
$points = $_POST['points'] ;
```
POSTで受け取った値を変数へ代入

```php
check($subject,$points) ;
```
2つの受け取った値をcheck関数へ反映させる。


実際に作ったものを、改めて日本語で話そうとすると
かなり頭使いますし、何かおかしい気がします・・・。
もっと柔らかくせねば。


一つのphpファイルで完結させていますが、
実際は別のファイルにHTML外のPHP箇所を記載して、呼び出すのでしょうか。

その時はrequireをつかうのか、ここで僕の頭は混乱してしまいます。
別ファイルからの継承や、読み取りの実際の方法がスッキリしていない。
これが関数やオブジェクト指向継承、クラス・・・
となってしまう原因でした。

日々調査ですね。

それでは、これからもよろしくお願いいたします。
playでフォームアクションを作成する


▼作成するフォーム▼
コントローラ：test
アクション名：testAction
フォームの値：value

##ビューの修正
次のようなフォーム用のhtmlを差し込む。

```test.scala.html
<form action="/test/testAction" method="get">
項目：<input type="text" name="value" /></br>
<input type="submit" value="送信">
</form>
```

##コントローラの修正
次のように新しくアクションを追加する。
formのインポートと変数も宣言する。

```Test.scala
import play.api.data.Form
import play.api.data.Forms._

val form = Form( "value" -> text )
def testAction = Action { implicit request =>
  val value = form.bindFromRequest.get
  Ok(views.html.create(value))
}
```

##ルートの修正
次のようにルーティングを追加する。

```routes
GET     /test/testAction       controllers.Test.testAction
```

以上、最もシンプルなフォームの作成。
例外の詳細を出力する


DEBUGビルドでのみ例外処理で落ちた時の詳細バグをConsoleに出力するためのコード群

通常リリースでもユーザーの環境での状態を出力して欲しければ、#ifdefは不要

```Objective-C:Application.m
#ifdef DEBUG
static void uncaughtExceptionHandler(NSException *exception);
#endif

- (void) applicationDidFinishLaunching:(NSNotification *)notification
{
#ifdef DEBUG
	NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
#endif
}// end - (void) applicationDidFinishLaunching:(NSNotification *)notification

#ifdef DEBUG
static
void uncaughtExceptionHandler(NSException *exception)
{
    NSLog(@"%@", exception.name);
    NSLog(@"%@", exception.reason);
    NSLog(@"%@", exception.callStackSymbols);
}
#endif
```
DEIM2014のLaTeXフォーマットの修正


超ニッチHowTo記事。

## 概要

[第6回データ工学と情報マネジメントに関するフォーラム（第12回日本データベース学会年次大会）](http://db-event.jpn.org/deim2014/)の論文を書いているのだが、itemizeとenumerateのインデントが不自然だったのでclsファイルをいじって修正した。

なお論文フォーマットは[論文募集ページ](http://db-event.jpn.org/deim2014/?%E8%AB%96%E6%96%87%E5%8B%9F%E9%9B%86,2)にて公開されている。

## 問題定義
itemizeとenumerate、つまり箇条書きをしても、字下げが行われず、入れ子構造の箇条書きをすると構造を把握しにくい配置になる。

我々はdeimj.clsファイルのenumerateとitemizeの設定を書き換えることで字下げを行うようにさせた。

## 修正内容

deimj.clsファイルの

```
\renewenvironment{enumerate}
```

と

```
\renewenvironment{itemize}
```

の部分に記述されている

```
\leftmargin\z@
```

を%%でコメントアウトした。

## 修正結果

```cls:deimj.cls\renewenvironment{enumerate}  {%% <   \ifnum \@enumdepth >3\relax\@toodeep\else    \advance\@enumdepth\@ne    \edef\@enumctr{enum\romannumeral\the\@enumdepth}%    \list{\csname label\@enumctr\endcsname}{%%%     \leftmargin\z@     \labelwidth2zw     \labelsep1zw     \itemindent4zw     \listparindent1zw     \topsep\z@\parsep\z@\partopsep\z@\itemsep\z@     \clubpenalty-200     \usecounter{\@enumctr}%     \def\makelabel##1{\hss\llap{##1}}}%    \fi}{\endlist}\newcommand{\labelitemi}{\leavevmode \raise.1zh\hbox to 1zw{\hss \textbullet\hss}}\newcommand{\labelitemii}{{\normalfont\bfseries\textendash}}\newcommand{\labelitemiii}{\textasteriskcentered}\newcommand{\labelitemiv}{\textperiodcentered}\renewenvironment{itemize}  {%% <   \ifnum \@itemdepth >3\relax\@toodeep\else    \advance\@itemdepth\@ne    \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%%%  \expandafter    \list{\csname \@itemitem\endcsname}{%     \topsep\z@\parsep\z@\partopsep\z@\itemsep\z@%%     \leftmargin\z@     \labelwidth1zw     \labelsep1zw     \itemindent3zw     \listparindent1zw     \clubpenalty-200\relax     \def\makelabel##1{\hss\llap{##1}}}%    \fi}{\endlist}
```
サーバーサイドでウェブページを操作する上で使えそうな手段

* ウェブスクレイピング
* ヘッドレスブラウザ

の二種類のやり方があるが、対象のページによってウェブスクレイピングで可能か、ヘッドレスブラウザが必要になってくるかは変わってくる

ウェブスクレイピング
--------------------

HTTP でアクセスして自前で解析・ポストなどを行う。

* Java なら Jsoup か HttpClient がお手軽そう
* Ruby なら Mechanize が鉄板
* PHP なら Simple HTML DOM Parser がお手軽そう

### Java: XPath (XMLパースのみ)

* http://takemori.jp/javasample/xpathsample

### Java: Apache Xalan (XMLパースのみ)

* http://ja.wikipedia.org/wiki/Apache_Xalan

### Java: Necohtml (HTML解析のみ)

* http://nekohtml.sourceforge.net/

### Java: Jsoup

* http://jsoup.org/
* http://cuhey.blogspot.jp/

### Java: HttpClient

* http://sinsengumi.net/blog/2010/10/java%E3%81%AEhttpclient-4-%E3%82%92%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%82/
* http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html

### Ruby: Nokogiri (HTML/XMLパースのみ)

* http://nokogiri.org/
* http://qiita.com/w650/items/e663fa2430145c456c4d

### Ruby: Mechanize

* http://www.xmisao.com/2013/10/05/ruby-www-mechanize.html

### PHP: Simple HTML DOM Parser (HTMLパースのみ)

* http://qiita.com/esehara@github/items/db231c99f8076aabdfb2
* http://www.crystal-creation.com/web-appli/technical-information/programming/php/library/simplehtmldom/


ヘッドレスブラウザ
------------------

Webkit の画面描画を仮想フレームバッファに出力することで画面描画をせずに動かせるウェブブラウザ。スクレイピングに対する利点は、JavaScriptなどで作られた動的なページに対しても操作ができる。

### JavaScript: Phantomjs + Node.js

Phantomjs は JavaScript ベースのヘッドレスブラウザで一番歴史が長い。単体で使うと、Webkit 組み込みの JavaScript エンジンを使った実行となるのでサーバー要素はないため、Node.js とブリッジするライブラリを使って組み合わせるのが、今回の用途に合う

### Ruby: Capybara-webkit or Poltergeist

* https://github.com/thoughtbot/capybara-webkit
* https://github.com/willnet/capybara-readme-ja (非公式日本語訳)
* http://takano32.blogspot.jp/2011/12/ruby-capybara.html
* https://github.com/jonleighton/poltergeist

Thoughtbot 社が開発している Ruby ベースのヘッドレスブラウザ。受け入れテストでよく使われるがこれも安定しているといえる。

Capybara-webkit と Poltergeist の二つのヘッドレスドライバがあるが、Poltergeistの方はPhantomjsベースな点やVfbに依存しないなどの点が違うらしい。

### PHP: Alpaca-webkit + Capybara-webkit

* http://chobie.hatenablog.com/entry/2012/03/18/220103
* https://github.com/chobie/alpaca-webkit

Capybara-webkit を起動した上で、ソケット通信で無理矢理 PHP のライブラリからブラウザの制御を行うという仕組みのもの。個人が思いつきで作ったものっぽいので安定性などは不明。
scalaを使って指定URLの画像をローカルに保存する


scalaを使い、特定のURLの画像を取得してローカルに保存する。

##ビルドの設定
scalax.ioを使うのでビルドの設定に下記の記述を追加する。

```build.sbt
libraryDependencies += "com.github.scala-incubator.io" %% "scala-io-file" % "0.4.2"
```

##ソースコード

```test.scala
import scalax.io._

object Filename {
  def unapply(url: String): Option[String] = {
    url.split("/").reverse.toList.headOption
  }
}

object Main {
  def main(args: Array[String]): Unit = {
    println("test start")
    var url = "保存したい画像のURL";
    val data = Resource.fromURL(url).byteArray
    println("downloading: %s ..." format url)
    url match {
      case Filename(file) => Resource.fromFile(new java.io.File("data", file)).write(data)
      case _ => sys.error("Oops!")
    }
    println("test end")
  }
}


```

これを実行するとプロジェクトのフォルダにdataというフォルダが作成され、その中に画像ファイルが保存される。
FMDatabase Code=7 "out of memory"


iOSライブラリ [FMDB](https://github.com/ccgus/fmdb) を使ってるときのエラー。

```
NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ ( \
                            item_id     INTEGER PRIMARY KEY AUTOINCREMENT, \
                            title       TEXT, \
                            on          INTEGER, \
                            sort        INTEGER, \
                            date        DATETIME \
                            );", TABLE_NAME];
```

なSQLで `[db executeUpdate:sql]` したとき、

```
Error Domain=FMDatabase Code=7 "out of memory" UserInfo=0xec4dee0 {NSLocalizedDescription=out of memory}
```

というエラーが出ました。

原因は、カラムの「on」が予約語だったため…
凡ミス…

on を item_on などの名前に変更して、解決できました。
sbtを使ったscalaの最小プロジェクト作成方法


scalaのビルドツールであるsbtを使って最小のプロジェクトを作成する方法。
(scalaのコードを書いて実行するだけ)

前提条件:sbtがインストールされていること

##プロジェクトの配置
ディレクトリを作成して中にscalaのソースを配置する。

```
$ mkdir test
$ cd test
$ vi test.scala
```

```test.scala
object Main {
  def main(args: Array[String]): Unit = {
    println("test start")
  }
}

```

##プロジェクトのビルド
sbtを起動してrunコマンドを実行する。

```
$ sbt
> run

```

すると『test start』と表示される。

##おまけ
ライブラリを追加したい場合、
build設定ファイルを作る。

直下にbuild.sbtというファイルを作り次のように記述を行う。

```build.sbt
name := "testProject"
version := "0.1"
libraryDependencies += XXXXXXX

```

※XXXXXXXはライブラリのリポジトリなど

この後にコンパイルをするとライブラリが自動的にダウンロードされビルドされる。

```
> compile

```
pythonでAES256


```
pip install -e git+https://github.com/ostinelli/PyAES256#egg=pyaes
```

使い方

```
import aes256
key = "aserghjerg4w5ygb8JHBr8ySuhrergiE"
encrypted = aes256.encrypt("My testing clear text", key)
decrypted = aes256.decrypt(encrypted, key)
print decrypted
# Out: My testing clear text
```

で

文字列的に扱いたいときは

```
import base64
encrypted_str = base64.b64encode(encrypted)
# Out: d/YSHFGxeeJhNdMeU0ukrKAP90bC0S+UpEWz1V/xOk4=
decrypted = aes256.decrypt(base64.b64decode(encrypted_str), key)
# Out: My testing clear text
```

iv(initial vector)はたぶん同じ値をずっと使ってる
NSMutableStringを使った箇所でが何故かiOS7でだけコケる

NSMutableStringをいじろうと思ったら以下のようなエラーが出ました。

```
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with insertString:atIndex:'
```

今まで以下のように無理やりキャストしていたのがダメだったみたいです。

```objc
NSMutableString *str = (NSMutableString *)self.text.text;
[str insertString:@"hoge" atIndex:insertIndex];
```

キャストでなく、ちゃんとNSStringをNSMutableStringに変換してコピーしてくれるメソッドがありました。

```objc
NSMutableString *str = [self.text.text mutableCopy];
```

これだけでなおりました。
ios6以下では発生しなかったので、ios7から仕様が変わったのかもしれません。
chef-docker cookbook を利用してdockerをインストールする。

# dockerをCentOS上にインストールしたりしたい

Mac OS Xの環境だと、
[dotcloud/docker](https://github.com/dotcloud/docker)のリポジトリを
```git clone``` し、```vagrant up --provision``` して...

という手順を踏む。けど、そのvagrant upしたイメージはubuntuになってる。

別にCentOSでもdockerインストールできるし、
自分が作ったVagrant box上(Ubuntu/DebianかRHEL系に限るが...)で
ホストにCentOS使ってみたいなと思って
なんかいいのないかな？って探してみたら
[chef-docker cookbook](https://github.com/bflad/chef-docker)を見つけた。

# サンプル

[paiming/Vagrant-template](https://github.com/aiming/Vagrant-template/tree/master/Sandbox-chef-docker)に、
CentOS及びubuntu向けのVagrantfileを用意した。

## 起動

```
vagrant up --provision centos
```

か

```
vagrant up --provision ubuntu
```

でインストールされる。

centosについては、サービスなどで運用している関係上、6.4のイメージを使うようにした。

![スクリーンショット 2014-01-09 12.06.12.png](https://qiita-image-store.s3.amazonaws.com/0/3985/21c3891a-c6ac-6082-1224-56dd2c15c010.png)

# chef-docker cookbookの使い道

このchef-docker cookbook、dockerをinstallするだけじゃなくて、
docker imageをビルドするためにも使える。

[参考](https://github.com/bflad/chef-docker#getting-started)

CIと組み合わせて、
Dockerfile内で利用しているdocker image作成レシピ(shell script等)が
更新されたらchef-docker cookbookを実行する、
作成したdocker container内で環境テスト(serverspecを利用するとか)して
いくとか、そんなやり方で使えるんじゃないかなと。