OmniAICreator/Qiita-1.07M huggingface dataset:
XML中に実体参照していない & がある場合、ElementTree.parse で失敗するが、文字列置換で強引に修復

Python3でXML をパースしようと、

```python
from xml.etree import ElementTree
ElementTree.parse(xml_path)
```

した所、

```
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line *, column *
```

の例外が出て、処理が失敗しました。

XML (今回のは とあるEPUB の content xml )を読んだ所、

```xml
<dc:title id="title">ほげほげ&ふがふが</dc:title>
```

となっており、この & が実体参照されていないため失敗した様子。

lxml を使っている場合は、

[python - ParseError: not well-formed (invalid token) using cElementTree - Stack Overflow](http://stackoverflow.com/questions/13046240/parseerror-not-well-formed-invalid-token-using-celementtree)


ここにあるように、Parser クラスのコンストラクタに `recover=True` をつけることでいけそうですが、Python3 の `xml.etree.ElementTree.XMLParser` には `recover` 引数は無く、同等の方法がわかりませんでした。

そのため、正規表現で `&` -> `&amp;` に強引に置換して処理していますが、現状うまくいっています。

こんなコードで置換しました。

```python
re_entity = re.compile(r'(>[^<]*)(&)([^<]*<)')
re_replace = re.compile(r'&(?!\w*?;)')

def xml_repair(xml_source):
    """
    >>> xml_repair('<dc:title id="title">ほげ&ふが (ホゲ&フガ)</dc:title>')
    '<dc:title id="title">ほげ&amp;ふが (ホゲ&amp;フガ)</dc:title>'
    >>> xml_repair('<a>a&b&c&amp;d&quot;e</a>')
    '<a>a&amp;b&amp;c&amp;d&quot;e</a>'
    """
    def _replace(matcher):
        return re_replace.sub('&amp;', matcher.group(0))

    return re_entity.sub(_replace, xml_source)
```

(今回の件では特に必要ではなかったため) > と < に挟まれている部分のみ対象にしましたが、もしかしてその判定は行わずにxml すべてに `_replace` をかけてもいいかもしれません。

また、& ではなく ' などが入ってきたらやっぱり失敗するように思いますが(未検証)、これも今回は不要だったため考慮はしていません。
sshの設定（passwordなしでsshログイン（scp）する）

#パスワードなしでscp

まずは、
(1) ssh-keyを作る。
`$ ssh-keygen -t rsa`
すると、
`Enter file in which to save the key (/home/<user>/.ssh/id_rsa):`
と、「どこに鍵を保存しますか」と言われるので、特に問題がなければEnterを押してデフォルトのディレクトリ（~/.ssh/）に保存する。
次に、パスフレーズの設定を要求される
`Enter passphrase (empty for no passphrase):`
`Enter same passphrase again:`
ここでは、パスフレーズなしにしたいので、何も入力せずに、Enterを2回押す。
`$ ls ~/.ssh`
`id_rsa    id_rsa.pub`
これで鍵が~/.sshの中にできた。

(2) sshしたいサーバー側に公開鍵（public key）を覚えさせる。
`$ ssh-copy-id -i ~/.ssh/id_rsa.pub <user name>@<ip address>:`
ユーザーのパスワードが要求されるので入力すると、
サーバー側にログインして、~/.ssh/authorized_keysというファイルの中にpublic keyが保存されていることが確認できる。

おわり。

これで、これからsshやscpするときにパスワードなしで実行できる。

#追記

- 別の方法

sshpassコマンドの利用。以下をスクリプトにして，使うとパスワードを入力する手間が省けるが，スクリプト内にパスワードが露呈してしまう問題点がある。

`sshpass -p "your password" scp ./abc.txt <hostname>:/abc.txt`
フリー（OSS）のかんばん管理ツール「Wekan」を導入する

## Wekanの導入

OSSのかんばん管理ツール。
![wekan.png](https://qiita-image-store.s3.amazonaws.com/0/101086/46b464a1-65ce-4ad4-2199-ac111911a437.png)


チーム開発には[Pivotal Tracker](https://www.pivotaltracker.com/)というのを使っており
個々がシーケンシャルに優先度決めてタスクを消化するには良いのだが
タスクが増えてくると全体進捗と言うのが良く分からなくなってくる。
Epics機能はあるのだが、そこまで細かく見てられない状況もある。

Agileとは言えど、予算と大枠の期間にはコミットしなければならないため
機能および、そこに紐づく大きなタスクと課題をみるために「かんばん」を利用する。
タスクのpullはpivotalで継続して行うため、本来の役割とは違うかもしれないが、
**「タスクをソフトウェア開発プロジェクトの関係者が理解するために、プロセスを視覚化」**
という点を強調して利用したい。


## セットアップ

手頃な環境が CentOS 5.4 しかなかったので、ここに入れる。
やり方はすべて[ここ](https://github.com/wekan/wekan/wiki/Install-and-Update)に書いてあるが
Docker環境ではないし、SandStormはよく分からないしで、先ずはふつーに入れる。

### node.js のセットアップ

nvm を利用する。
環境依存だけど、gitは入っているが、証明書チェックは無効化させて落とす。
事前にnvmを入れたい適当なフォルダに移動しておくこと。

```shell-session:
# git config --global http.sslVerify false
# git clone https://github.com/creationix/nvm.git .
# source ./nvm.sh
```

で、説明見る限りでは  v0.10.40 を利用しろ と言っているので

```shell-session:
# export NVM_NODEJS_ORG_MIRROR=http://nodejs.org/dist
# nvm install v0.10.40
# nvm alias default v0.10.40
```

次回以降も有効になるようにログインシェルも追加。
パスは使っている環境に合わせること。

```shell-session:.bash_profile
if [[ -s xxxx/xxxx/nvm.sh ]];
 then source xxxx/xxxx/nvm.sh
fi
```

### mongoDB のセットアップ

レポジトリを指定する。

```shell-session:/etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```

そして、インストール。

```shell-session:
# yum install -y mongodb-org
```

mongoは良いのだが、データ量がとにかく多くなる傾向があるため
今回はjournalフォルダはシンボリックリンクで移動させる。
シンボリックリンクで移動させることに特に意味はなく
設定ファイルで対象を探るのが面倒だっただけ、です。。
下記、実際は作成したディレクトリの権限に気をつけること。

```shell-session
# mkdir /xxxx/mongo
# ln -s /var/lib/mongo /xxxx/mongo
```

で、サービスを起動

```shell-session:
# service mongod start
```

### Webkan 

https://github.com/wekan/wekan/releases/tag/v0.9
ここから落としてきて

```shell-session:
# cd （適当なディレクトリ）
# tar xzvf wekan-v0.9.0-rc1.tar.gz
# export MONGO_URL='mongodb://127.0.0.1:27017/wekan'
# export ROOT_URL='http://kanban.com'
# export MAIL_URL='smtp://user:pass@mailserver.example.com:25/'
# export PORT=8539
```

実際は、今回はメールサーバが
用意できなかったので「MAIL_URL」は設定してない。
ポートも適当だし、URLもかなり適当です。

## Webkan の起動

```shell-session:
#  node main.js &
```

起動時に立ち上げたいなら
mongoの自動起動と、上記環境変数設定を
~/.bash_profileに入れるの忘れずに。

http://(セットアップしたサーバのIP):8539/

問題なく利用可能になる。
WindowsでSVNチェックアウトした時にシンボリックリンクリンクがファイルになっちゃうのを戻すワンライナー

# WindowsでSVNチェックアウトした時にシンボリックリンクがファイルになるのを元に戻すワンライナー  

今までLinux上でなんでもやってたので気にもしてなかったですし、問題もなかったのですがWindows上で開発環境の構築があったので仮想環境と組み合わせ作成したので、Windows上でSVNチェックアウトを行うと、シンボリックリンクがファイルに置き換わるという（ファイルシステム上、サポートしてないから当たり前？）仕様を知らなくて、なんで動かないんだろう～と悩んでしまいました。  
  
sygwin上からだときっとうまくいくのかなぁと思いつつ、めんどくさいのでSVNで置き換わったファイルをシンボリックリンクに戻すワンライナーです。　（忘れそうなので忘備録）  

```shell-session
find . -regex "^\.[^\.]+"  | xargs grep -s 'link ' | perl -nlaF:link  -e 'unlink($F[0]);symlink($F[1],$F[0])'
```
  
これで動いたので、きっと大丈夫！
Storageにgroongaを利用する方法

前回はTokyoCabinetを利用する方法を載せましたが、今回はgroongaを利用する方法を載せます。
![images.jpg](https://qiita-image-store.s3.amazonaws.com/0/103558/6b32b333-b219-8700-f306-f5ce57f4322b.jpeg)

# 条件
server: 1台
storage type : <font color='red'><b>groonga</b></font>
ruby version : v2.1
ROMA version : v1.2.0
Installation type : rubygems

# 手順
## 1. install ROMA
```bash
$ gem install roma
```

## 2. make instance(Cluster)
```bash
$ mkroute localhost_10001 localhost_10002 --replication_in_host
ls -l
  -rw-r--r-- 1 root root 35693 Dec  2 05:35 localhost_10001.route
  -rw-r--r-- 1 root root 35693 Dec  2 05:35 localhost_10002.route
```
- 前回作成したものを使い回しても構いません

## 3. groonga インストール  
### CentOS
```bash
# rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
# yum makecache
# yum install groonga
# yum list groonga
  groonga.x86_64    5.0.5-1.el6     @groonga
```

### Ubuntu
```bash
# apt-get install software-properties-common
# add-apt-repository universe
# add-apt-repository ppa:groonga/ppa
# apt-get update
# apt-get install groonga
# dpkg -l groonga
||/ Name       Version         Architecture  Description
+++-=========-================-=============-=====================================================
ii  groonga    5.0.5-2~trusty1 amd64         Fulltext search engine (metapackage for library use)
```


## 4. Install rroonga(<font color='red'>r</font>uby bindings of g<font color='red'>roonga</font>)
![images.png](https://qiita-image-store.s3.amazonaws.com/0/103558/7f239a11-424c-095b-2a64-0374e75653fb.png)

### CentOS
```bash
# yum install groonga-libs groonga-devel
$ gem install rroonga
$ gem list | grep rroonga
rroonga (5.0.9)
```

### Ubuntu
```bash
# apt-get install libgroonga-dev
$ gem install rroonga
$ gem list | grep rroonga
rroonga (5.0.9)
```

## 5. config設定
```irb
$ mkconfig

Which storage will you use?
[1] Ruby Hash
[2] Tokyo Cabinet
[3] Groonga
> ### => 3を選択します
```
残りの設定はサーバや環境に合わせて入力してください
http://qiita.com/hiroaki-iwase/items/84bdce36f2f482e6c2c3

## 6. booting ROMA
```
romad localhost -p 10001 -d --config ./config.rb --replication_in_host
romad localhost -p 10002 -d --config ./config.rb --replication_in_host
```
- 作成したconfig.rbを指定してROMAを起動します

## 7. 確認
```
$ telnet localhost 10001

> stat st_class
  storages[roma].storage.st_class GroongaStorage
  END
```
StorageがGroongaStorageになっていることが確認できます

# ベンチマーク
以下にTokyoCabinetとgroonga, memory modeと他NOSQLのベンチマークがあります。
http://roma-kvs.org/blogs/blog-entry-8.html
![bench.png](https://qiita-image-store.s3.amazonaws.com/0/103558/c3a0868c-65e0-ec45-8f5a-0fd73c7791a9.png)

# 参照URL
ROMA Use Groonga for ROMA : http://roma-kvs.org/learn/groonga_lib.html
Groonga ドキュメント : http://groonga.org/ja/docs/
数値型設定のカラムに画面から全角数字の入力値をモデルで受け取り、半角数字変換する

#はじめに
データベースでINTなどの数値型設定をしているカラムに対し、画面から全角数字を入力したとしても、半角数字に変換して通したいと言ったニーズがあった場合、numericalityのバリデーションだと文字列扱いでエラーとなってしまいます。
ユーザーの入力値を強制的に変換させ、バリデーションにかからないようにする処理を書きました。
（フロントエンド側で処理する方法もありますが、ここではモデルで解決する方法を記載しています）

```ruby:app/models/item.rb
class Item < ActiveRecord::Base
  validates :price, numericality: { only_integer: true }

  def price=(value)
    value.tr!('０-９', '0-9') if value.is_a?(String)
    super(value)
  end
end
```
arduinoでアセンブラ

arduino unoでインライン アセンブラをやってみました。
#サンプルコード
```
byte b[32];
byte g;
void print_r()
{
	asm volatile(
		"push 	r16 \n\t"
		"push 	r17 \n\t"
		"push 	r18 \n\t"
		"push 	r19 \n\t"
		"push 	r20 \n\t"
		"push 	r21 \n\t"
		"push 	r22 \n\t"
		"push 	r23 \n\t"
		"push 	r24 \n\t"
		"push 	r25 \n\t"
		"push 	r26 \n\t"
		"push 	r27 \n\t"
		"push 	r28 \n\t"
		"push 	r29 \n\t"
		"push 	r30 \n\t"
		"push 	r31 \n\t"
		"sts 	(b),		r0 \n\t"
		"sts 	(b + 1),	r1 \n\t"
		"sts 	(b + 2),	r2 \n\t"
		"sts 	(b + 3),	r3 \n\t"
		"sts 	(b + 4),	r4 \n\t"
		"sts 	(b + 5),	r5 \n\t"
		"sts 	(b + 6),	r6 \n\t"
		"sts 	(b + 7),	r7 \n\t"
		"sts 	(b + 8),	r8 \n\t"
		"sts 	(b + 9),	r9 \n\t"
		"sts 	(b + 10),	r10 \n\t"
		"sts 	(b + 11),	r11 \n\t"
		"sts 	(b + 12),	r12 \n\t"
		"sts 	(b + 13),	r13 \n\t"
		"sts 	(b + 14),	r14 \n\t"
		"sts 	(b + 15),	r15 \n\t"
		"sts 	(b + 16),	r16 \n\t"
		"sts 	(b + 17),	r17 \n\t"
		"sts 	(b + 18),	r18 \n\t"
		"sts 	(b + 19),	r19 \n\t"
		"sts 	(b + 20),	r20 \n\t"
		"sts 	(b + 21),	r21 \n\t"
		"sts 	(b + 22),	r22 \n\t"
		"sts 	(b + 23),	r23 \n\t"
		"sts 	(b + 24),	r24 \n\t"
		"sts 	(b + 25),	r25 \n\t"
		"sts 	(b + 26),	r26 \n\t"
		"sts 	(b + 27),	r27 \n\t"
		"sts 	(b + 28),	r28 \n\t"
		"sts 	(b + 29),	r29 \n\t"
		"sts 	(b + 30),	r30 \n\t"
		"sts 	(b + 31),	r31 \n\t"
		"in 	r16,	0x3f \n\t"
		"sts 	(g),	r16 \n\t"
		::: "r16"
	);
	for (int i = 0; i < 32; i++)
	{
		Serial.print("r");
		if (i < 10)
		{
			Serial.print(0);
		}
		Serial.print(i);
		Serial.print(" = ");
		Serial.print(b[i] >> 4, HEX);
		Serial.print(b[i] & 0x0f, HEX);
		if ((i + 1) % 8)
		{
			Serial.print(" ");
		}
		else
		{
			Serial.println(";");
		}
	}
	Serial.print("flag: c = ");
	Serial.print(g & 0x01);
	Serial.print(" z = ");
	Serial.print((g >> 1) & 0x01);
	Serial.print(" n = ");
	Serial.print((g >> 2) & 0x01);
	Serial.print(" v = ");
	Serial.print((g >> 3) & 0x01);
	Serial.print(" s = ");
	Serial.print((g >> 4) & 0x01);
	Serial.print(" h = ");
	Serial.print((g >> 6) & 0x01);
	Serial.print(" t = ");
	Serial.print((g >> 6) & 0x01);
	Serial.print(" i = ");
	Serial.println(g >> 7);
	Serial.println(";");
	asm volatile(
		"lds 	r31,	(g) \n\t"
		"out 	0x3f,	r31 \n\t"
		"pop 	r31 \n\t"
		"pop 	r30 \n\t"
		"pop 	r29 \n\t"
		"pop 	r28 \n\t"
		"pop 	r27 \n\t"
		"pop 	r26 \n\t"
		"pop 	r25 \n\t"
		"pop 	r24 \n\t"
		"pop 	r23 \n\t"
		"pop 	r22 \n\t"
		"pop 	r21 \n\t"
		"pop 	r20 \n\t"
		"pop 	r19 \n\t"
		"pop 	r18 \n\t"
		"pop 	r17 \n\t"
		"pop 	r16 \n\t"
		:::
	);
}
void setup()
{
	Serial.begin(9600);
}
void loop()
{
	print_r();
	delay(900);
}

```
開発環境はどうする？

良い開発環境は、良いコードを生む。

というか、開発環境は人それぞれですが、どんな選択肢があるか書いてみます。

基本

Webアプリケーションなので、開発用サーバが必要ですが、
一昔前はXAMPとかWAMPとかいう、Apache＋MySQL＋PHPのパッケージソフトがほとんどでしたが、
やはり今は
Virtualbox＋Vagrantでサーバ自体をPC内で動かしてしまうというのが一番多いです。
お金持ちの環境だと、AWSなどのクラウドで１台サーバを借りてしまうというのもあります。

Vagrantの何が良いかと言うと、本番環境と同じサーバ上で開発が出来ることと、
オフラインの環境でも開発が継続出来ると言う事。

まあ、Vagrantは後日、投稿する予定なので詳細は後日。

サーバの次は、コードを書くアプリ。

Windowsだと、
秀丸、EmEditerと言った定番のテキストエディタ。
Macだと
CotEditer、Coda、SublimeTextと言った定番のテキストエディタ。

テキストエディタは、動作が軽快なので、勢いでコードを書くには最適ですが、
やはり、調べ物やコード補完をして欲しいとなると、総合環境IDEが使いたくなります。

IDEだと、
Eclipse+PluginとかjetBrain社の各言語シリーズのPHPStorm（PHP向け）やIntelliJ IDEAが
良く使っている人を見かけますし、使っています。
NetBeans派の方、ごめんなさい。。。

今年、突如現れたVisual Studio CodeとかAtomエディタなんかも今後が注目です。

あとは、サーバとファイルのやり取りするSCP（SFTP）ソフトだと、
WindowsはWinSCP、MacだとCyberduckなんかのアプリや
SSHターミナルから直接コマンドで転送してしまうという派も

昨今のプロジェクトだと、GitやGithubとの連携やSVNの連携なども、IDEの機能にあったりして、
コマンドで操作するサポートになるかも。


とりあえず、個人的な主観ですが、

PCにVirttual box+VagrantでLAMPの環境を作り、VagrantのシェアフォルダにIDEのプロジェクトを作成して、
実装が終わったソースはGitかGithubにpushしてしまう。
IDEは、個人的にはそんなに使いこなしていませんがVisual Studi Codeとか
有料ですが、以前から使っているIntelliJ IDEAがオススメ。

そんな開発環境がオススメです。

とは言っても、スクリプト言語は、検索機能（特にgrep）が充実したテキストエディタを併用するのは
避けられませんけどね。
Elasticbeanstalk with Docker でmackerel-agentを動かす時の設定と課題 - MackerelAdventCalendar 2015 7日目

[MackerelAdventCalendar](http://qiita.com/advent-calendar/2015/mackerel) 7日目の記事です。

# はじめに

私が所属しているVASILYでは、Zabbixで監視していたものをMackerelへ移行を行っており、新規で立てられるサーバーには、Chefでプロビジョニングする際にmackerel-agentが組み込まれるようになっています。

私が主に管理している広告配信サーバは、今年の6月にElasticBeanstalk with Dockerに置き換えました。multi-containerで構成しており、その一つにmackerel-agentのcontainerも組み込んでいます。
docker-mackerel-agentがDockerHubにあるので、Dockererun.aws.jsonで少し設定するだけで組み込めます。

```json
{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
~~snip~~
    {
      "name": "mackerel-agent",
      "image": "mackerel/mackerel-agent",
      "memory": 512,
      "links": [
        "ad-server",
        "nginx-proxy"
      ],
      "essential": true,
      "environment": [
        {"name": "apikey",  "value": "API_KEY"},
        {"name": "include", "value": "/etc/mackerel-agent/conf.d/*"},
        {"name": "auto_retirement",  "value": "1"}
      ],
~snip~
    }
  ],
~snip~

}
```

DockerとElasticBeanstalkでauto-scaling環境を構築しているので、その設定を数か所加えています。

## dockerのmetrics
- dockerのmetricsを取得するための設定
- /etc/mackerel-agent/conf.d/docker.conf

```toml
[plugin.metrics.docker]
command = "/usr/local/bin/mackerel-plugin-docker"
```

## display_name
- mackerel-agentのdocker containerのidがmackerelのdashboard上のホスト名となることへの対応になります
- /etc/mackerel-agent/conf.d/display_name.conf

```toml
display_name = "ad-server"
```

## host_status
- 起動/終了時のmackerel dashboard上のstatusを変更する対応
- /etc/mackerel-agent/conf.d/host_status.conf

```toml
[host_status]
on_start = "working"
on_stop = "poweroff"
```
しかし、```on_stop```はElasticBeanstalk+Dockerの環境では上手く動かない状態です。 [@songmu](htts://twitter.com/songmu) さんに相談したところ、停止処理時にインターネット上に出て行く必要があるとのことで、ElasticBeanstalkの環境は、instanceがいきなりterminateされるので、厳しい状態です。


# fluentdとの連携
fluentd-plugin-mackerelを利用して、広告の配信数、impression数、click数などをグラフ化して、日々の配信状況を監視したりもしており、広告管理ツール内にグラフを貼り付けたペライチのページをつくり、エンジニア以外にもグラフをざっくり確認してもらってりしています。
先日行われた [FasionTech Meetup](http://tech.vasily.jp/entry/fashion_tech_meetup_1)でfluentdとmackerelでカジュアルモニタリングというLTをしたりもしました。 

# auto-retirement
auto-scaling環境では、自動退役をしないとつらいので、設定をおこないました。
mackerel-agentには環境変数で ``` AUTO_RETIREMENT=1 ``` を設定すると自動退役してくれる機能がありますが、Docker環境ではうまくいかないということで、[@stanaka](https://twitter.com/stanaka) さんに[対応](https://github.com/stanaka/docker-mackerel-agent/commit/b74a3b4882630dfa9a4d6a8da7ef8d2a43d1d478) していただきました。 
これにより、``` auto-retirement=1 ```を環境変数で起動時に設定すると ``` docker stop mackerel-agent-containerid ``` で dockerを停止した際に、自動退役してくれるようになりました。

~~しかし残念ながら、```on_stop```と同様にinstanceがいきなりterminateされる環境では、処理がうまくhookできず、自動退役は実現できていない状態です。。~~
~~(**ElasticBeanstalkのinstance terminate時のhook処理の設定方法をご存知の方は教えて下さい。。。)~~

base-platformの選択により解決しました
http://qiita.com/tknzk/items/a6b1a9003ff26683b88a#_reference-0ee456eeb535cbab2a74



# まとめ
- 環境依存でうまく動かない機能がありますが、基本的には、少しの設定でよしなに動いてくれるMackerelは便利
- fluentdとの連携でservice metricsを簡単に登録できるので、カジュアルにグラフ化できて便利

明日は @tkuchiki さんです。
RubyとDockerを使って簡単に全文検索エンジンを始めてみよう

[Groonga Advent Calendar 2015](http://qiita.com/advent-calendar/2015/groonga)の7日目の記事です。前日は[@ktou](https://twitter.com/ktou)さんの[Groonga Meatup 2015：Groonga族2015](http://www.clear-code.com/blog/2015/12/6.html)でした！

Groongaには公式でDockerコンテナが用意されています。今回は[groonga/rroonga](https://hub.docker.com/r/groonga/rroonga/)を使ってRuby経由で簡単に全文検索を試してみましょう。

![rroonga-logo.png](https://qiita-image-store.s3.amazonaws.com/0/3885/66f499f8-ee70-18a2-0ac5-4de17f67393f.png "rroonga-logo.png")
![small_h.png](https://qiita-image-store.s3.amazonaws.com/0/3885/e95dea33-5cf9-e806-4050-1ca7be879caf.png "small_h.png")

## インストール
Dockerを使えるようにしてください。その後で以下のコマンドを実行します。Dockerを使うとインストールの失敗がないのがいいところですね！

```
$ docker run --name rroonga -it groonga/rroonga
```

## チュートリアル
[File: tutorial — rroonga - ラングバ](http://ranguba.org/rroonga/ja/file.tutorial.html)にRroongaの分かりやすいチュートリアルがあります。
docker run するとirbが立ち上げるので`require 'groonga'`してライブラリを読み込みます。(`-r groonga`と同じ効果があります)

```
irb(main):001:0> require 'groonga'
=> true
```

チュートリアルに沿ってコマンドを入力していきます。

```
irb(main):002:0> Groonga::Context.default_options = {:encoding => :utf8}
=> {:encoding=>:utf8}
irb(main):003:0> Groonga::Database.create(:path => "/tmp/bookmark.db")
=> #<Groonga::Database ...>
.
.
```

簡単なブックマークアプリケーションを作成しながら全文検索ライブラリの基本的な使い方を学ぶことができます。

```
>> items.add("http://en.wikipedia.org/wiki/Ruby")
=> #<Groonga::Record ...>
>> items.add("http://www.ruby-lang.org/")
=> #<Groonga::Record ...>
```

ブックマークが10〜100件くらいだと配列から検索してもいいですが、Rroongaでデータベースを構築しておくと数万〜数十万件とデータが増えてもとても高速に検索できます。素晴らしいですね。

```
>> records = comments.select do |record|
?>   record["content"] =~ "Ruby"
>> end
```

全文検索エンジンってどんな風に使うんだろう？と興味を持った方はぜひ一度お試しください。Groonga系は日本語の情報がとても多いので最初に始める人にもオススメです。
レゴを組み立てるようにパーツをちょっとずつ足していって、初心者のぼくが楽しみながら無理なくアプリをリリースできた方法

#楽しくプログラミングがしたい
このドキュメントでは、プログラミングの初心者だったぼくが、たった１つの方法論を知ったことで楽しくアプリを作れるようになったので、そのことについてシェアしたいと思います。

それまでのぼくは、iPhoneアプリの初心者むけ書籍を一通り読んで、１つ１つのメソッドはある程度理解していました。

例えば、どうやったら画面上にボタンを設置して、それを押した時の動作はどこにコーディングするのか、といったことは簡単にわかります。

でも、自分がつくりたいようなアプリを、どういう順でどうつくっていけばいいのか、ということになるとよくわかりませんでした。

最初に全体像を把握すればいいのかと考えて設計図的なものをつくってみたこともありました。でも、初心者だと自分のつくった設計図通りのプログラミングが自分のスキルでできるかどうかもわからないし、うまくいきませんでした。

ぼくにある転機が訪れました。

独学でプログラミングを習得するのが難しいと感じたぼくは、あるプログラミングの講座を受けたことでプログラミングのスタイルを身につけ、無事にアプリをリリースすることができました。

アップルに審査を出して、それが無事に通ったことがわかった時は本当に嬉しくて飛び上がりました。それは深夜だったのですが、文字通り本当に飛び上がっちゃったんです。笑

いつも見ているAppStoreに自分のアイコンがあるのを見た時はめちゃくちゃテンションが上がりました。

iPhoneアプリ開発に興味があるけどまだリリースをしたことがない、という方は是非一本リリースすることをお勧めします。何本ダウンロードされるか、とかいい評価をもらえるか、とかは全く関係なくリリースできた、ということだけでとても達成感があると思います。

#どうやってプログラムをつくったか
それでは具体的にその方法論についてお話しします。

それは、表題にあるようにレゴを組み立てるようにちょっとずつ継ぎ足して行って、気付いたら完成していたというスタイルでのプログラミングです。

大事なポイントが２つあります。それは、

・一気につくらず、必ずちょっとずつつくっていくこと
・それぞれのパーツが完璧に動くことを確認してから次のパーツをつくること

です。

実際にぼくがプログラミングをした時の流れはこんな感じです。

つくろうと思ったのは、自分の思考を整理するためのアプリです。
ふせんに課題とかをどんどん書き出していって、それを机の上で並び替えてグループ分けすると頭の中がスッキリします。それをiPad上でできたらいいなと思ったのです。

１つ目のパーツとして、画面をダブルタップしたらそこにテキストフィールドが表示されるようにしようと思いました。そのために行った手順はこんな感じです。


・画面のタップを検知するためにはどうすればいいか、どんなメソッドを使うのかを書籍やグーグルで調べました。
・それを実際にコーディングしました。
・printを使って、タップした時にデバッグエリアにTap!と表示されるようにして、ちゃんと機能していることを確認しました。
・次に、検知した時に、その座標をどうやったら分かるのかを調べました。
・またコーディングをして、デバッグエリアにきちんと座標が表示されることを確認しました。
・その座標にテキストフィールドを表示する方法を調べ、同じようにコーディングしました。

このようにして、自分が目指した通りに動くパーツが１つ完成しました。
ここまでを１つのプロジェクトとして保存しています。

次に、新しいプロジェクトを新規作成して、ドラッグしたらそこにテキストフィールドが追従してくるパーツをつくりました。やり方は全く同様です。

このように、次はどんな機能を実装していこうかなぁと考え、ちょっとずつパーツを増やしていったのです。

それが１５個くらいになった時、そろそろこれを１つにまとめればアプリになるかなぁと思いました。
そこで新規プロジェクトに今までのパーツをコピペしていき、まとめました。

これでとりあえず機能的には動くプログラムの完成です。

そこから画面の色とか装飾的な部分を整えて、アイコンをつくったりして納得できる状態になった時点でアップルに申請しました。

そこから約１週間ほどで審査を通り公開に至ったのです。

#この方法のまとめ
この流れをまとめると、レゴを組み立てるようにちょっとずつプログラミングする方法は以下のステップになります。

STEP１　どういうパーツをつくるのか考える。
STEP２　その動作を達成するためにどのメソッドを使えばいいか本やグーグルで調べる。（注）
STEP３　実際にコーディングする
STEP４　こまめにprint文を入れてうまく動作していることを確認する。うまくいかない時は、変数の値を出力して想定通りになっているかチェックする。
STEP５　必要なパーツが揃うまで繰り返し、最後に１つにまとめる。

（注）スキルの習得、ということを考えるとグーグルで調べて満足してしまうと実力がつきません。使うメソッドがわかったらAppleが用意してくれているリファレンスを読む習慣をつけましょう。

ぼくがプログラミングを教わったあきおさんの講座の情報はここにあります。
あきおさんは知識を教えてくれるだけでなく、自分で調べて学んでいけるようになる方法を教えてくださいます。プログラミングのスキルをつけたい方には自信を持ってお勧めします。

【アプリクリエイター道場 東京塾】
http://egg-is-world.com/app-creator-dojo-develop/

ぼくがシェアしたい内容は以上です。
iOSプログラミングを楽しみましょう！
iOSのログをリモートで確認するために安定のmatttさん製のAntennaを使う

USBで繋いでないときもNSLogの内容がみたい時ってありますよね？

特に位置情報系を使ったりするアプリなんかでは、今Regionに入った？出た？近づいている？って情報がとても気になります。

まあLocalNotificationでもいい場合も多いのですが、うざいし、iOS8以下だと過去分も見返せないなんてこともあると思います。

そんなときは、ここで紹介するAntennaという世界的に超有名なiOSエンジニアであるmatttさん作のライブラリを使って見ましょう！

自分が立てたサーバーに簡単にログ情報を送ってくれますよ！

## アプリ側の準備

Antennaを導入します。

https://github.com/mattt/Antenna

```Podfile
pod 'Antenna'
```

と書いて、

```
$ pod install
```

あとは使用する前にかならず

```objc
    [[Antenna sharedLogger] addChannelWithURL:[NSURL URLWithString:@"http://<YOUR_IP_OR_DOMAIN>:5000"] method:@"LOG"];
```

を実行しておきます。

あとはログがほしい場所で、

```objc
[[Antenna sharedLogger] log:@"Logging!!"];

or

[[Antenna sharedLogger] log:[NSString stringWithFormat:@"%@", @"hoge"]];
```

と書くだけです。NSLogの代わりに使って見ましょう。


## サーバー側の準備

https://github.com/mattt/rack-http-logger

Antennaと対になるWebアプリケーションが用意されてます。
Ruby製なのですが、これを書いたのもmatttさんってのがすごいですね(^q^)

こちらの構築も簡単です(Ruby自体の導入は省きます)。

```
git clone git@github.com:mattt/rack-http-logger.git
cd rack-http-logger/example
gem install foreman
bundle install
foreman start
```

これだけです！localhost:5000で立ち上がっているはずです。

あとはローカルネットワーク内であれば、ifconfigなど叩いてIPを取得して

Antennaの方の設定で`http://<確認したIP>:5000`などとして、自分のiPhoneの実機を同じWi-Fiにつなぐだけです。

これだけで、順次Logが呼ばれるたびに、出力が更新されていきます。

簡単便利！
Fnキー + （ホームポジションキー）をアローキーに

## Fnキー + （ホームポジションキー）をアローキーに

Dvorak Advent Calendar 7日目．

キーボードの種類によりますが，Fnキー押しながらQWERTYで言うJKL辺りのキーがアローキーやPageDownなどになっているキーボードがよくあります．     
この手のキーをよく使うアローキーにリマップするとカーソル移動が快適になります．
（要は標準の右下辺りのアローキーを使わないようにする事で手指の移動距離が減り結果的にタイピングが早くなり楽して打てます．）
Xcodeのブレークポイントで響子さんにシャウトしてもらおう

Xcode ではブレークポイントの停止時に音を鳴らしたり、特定のデバッガーコマンドを実行したり、シェルを実行したりといったアクションをブレークポイントごとに細かく指定できます。今回は**Log Message Action**を使って音声でブレークしたことを通知してみます。ちなみにタイトルの響子さんというのはMac OS Xの標準の読み上げボイスの名前がKyokoなのでアテで書いただけです。Kyokoさん以外にもOtoyaくんやKathyさんなどいろいろあります。

# Xcodeのブレークポイント
Xcodeのブレークポイントは開発者であれば使ったことが無い人は居ないでしょう。プログラム実行中に指定した行で実行を中断するためのデバッガーの機能です。設定は簡単。中断したいプログラム行の行番号をクリックするだけ。一度クリックで追加。もう一度クリックで一時的に無効化。削除したい場合は右クリックで「Delete Breakpoint」を選択するか、ドラッグ・アンド・ドロップで左右に追いやる。簡単ですね。また、設定したブレークポイントはブレークポイントナビゲーターで一覧表示できるのでソースコード中に散らばったブレークポイントもここで一元管理できます。

* Breakpoint Navigator  
<img width="450" alt="151206-0001.png" src="https://qiita-image-store.s3.amazonaws.com/0/6102/167a6976-3c01-22f4-e6e5-f04970c3059a.png">

# ブレークポイントの Action 設定

今回はブレークポイントを右クリックで「Edit Breakpoint」を選択し、ブレーク時の Action (挙動)を細かく設定してみましょう。

* 行数表示部分のブレークポイントを右クリックして「Edit Breakpoint」を選択。
<img width="450" alt="151206-0001.png" src="https://qiita-image-store.s3.amazonaws.com/0/6102/0c2e9c6b-a58f-0d10-b3bd-116d4b5e8ba9.png">

* ポップビューが表示されるので「Add Action」ボタンをクリック。
<img width="450" alt="151206-0001.png" src="https://qiita-image-store.s3.amazonaws.com/0/6102/8152497d-8180-00a9-7d99-245ee8eb3ef9.png">

* 「Log Message」をクリック。
<img width="450" alt="151206-0005.png" src="https://qiita-image-store.s3.amazonaws.com/0/6102/55f5efc9-43d9-bbf0-7df9-12cdbe9073ec.png">


# Log Message Action で設定できること

Log Message Action は名前の通りログメッセージをコンソールに出す目的で使用されますが、オプションの「Speak message」を選択することによって指定したメッセージを読み上げてくれます。

<img width="450" alt="151206-0005.png" src="https://qiita-image-store.s3.amazonaws.com/0/6102/225986b1-b041-144e-68f9-e6e8ab1b85d7.png">

メッセージは固定だけでなく %B でブレークポイントのスコープ名（メソッドの中であればメソッド名的な）、%H でブレークポイントを通過した回数などがパラメータとして用意されています。また、@〜@の中にコードを入れることでランタイムで評価した値を読み上げてもらうことも可能です。

例えば以下のようなメッセージを設定した場合、

> %Bで、%H回目のブレーク。ただいま@[NSDate date]@です。

ブレークポイントに停止した際に、次のような文章を読み上げてくれます。

> -viewDidLoadで、1回目のブレーク。ただいま2015-12-06 04:31:14 UTCです。


# say!
さて冒頭で Kyoko さん以外のボイスを紹介しましたが、残念ながら Log Message Action では声まで変えることはできません。なので、Shell Command で Mac OS X 標準の say コマンドを呼び出しメッセージを読み上げるようにします。方法は簡単で、ActionをShell Commandに変更し次のように設定すれば、say コマンドに文字列が渡ります。このとき -v オプションで名前を指定すれば Otoya や Kathy の声で読み上げてくれます。

* コマンド  
  ```/usr/bin/say```

* オプション  
  ```-v, Otoya, "%Bで、%H回目のブレーク。ただいま@[NSDate date]@です。"```

<img width="450" alt="151206-0005.png" src="https://qiita-image-store.s3.amazonaws.com/0/6102/85b7b89a-9f8e-53a1-5091-0705a87af6dc.png">


ところでsayコマンドのボイスですが、いつのまにか他のボイスが選択できなくなっていました。選択するには追加ダウンロードが必要で、システム環境設定→「音声入力と読み上げ」→「テキスト読み上げ」→「システムの声」から、事前に追加ダウンロードしておく必要があります。

<img width="450" alt="151206-0011.png" src="https://qiita-image-store.s3.amazonaws.com/0/6102/ac7c685d-73d9-f572-ce24-3496d7db8193.png">

# 使いドコロ
ここまで読んで全然実用的じゃ無いじゃん！って思った方。いえいえ。意外と使いドコロありますよ。
ブレークポイントって実機でテストしているとiPhoneの画面に集中しててbreakしてることに気付かないことってありませんか？
そういう時に響子さんにシャウトしてもらえば良いんです。しかもブレークポイントってポーズさせないことも出来るんです。普通だとあまり意味がないですが、ブレイクせずにシャウトだけしておけば、アニメーションとか複数の通信シーケンスを邪魔せず、ブレークポイントの通過を知らせてくれます。このロジックちゃんと通ってんのかな？って不安になるような時でもコードカバレッジを手軽に確認できるのは良いですね。

<img width="450" alt="151206-0011.png" src="https://qiita-image-store.s3.amazonaws.com/0/6102/a52cd292-f842-f35a-1c09-86da75e5cfee.png">

以上、ネタに走ったつもりが意外とまじめな実用ネタでつまらなくなっちゃいましたが、お試しあれ！
Arch Linuxを1GB DISKにVirtualbox込みでインストール

この記事はArch Linux Advent Calender 2015の7日目です。

* [Arch Linux インストール (非EFI) - Qiita](http://qiita.com/tukiyo3/items/48fb3b4b41642743d581)の内容が古くなったので作成。

```bash:ssh接続できるようにする
passwd
systemctl start sshd
```

```bash:DISKフォーマット
mkfs.btrfs /dev/sda1 -f
mount -o compress=zlib /dev/sda1 /mnt
#mount -o compress=lzo /dev/sda1 /mnt
```

```bash:/etc/pacman.d/mirrorlist(先頭に記述)
Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch
```

```bash:パッケージインストール
pacstrap /mnt base grub-bios openssh btrfs-progs
```

## virtualbox用

* [VirtualBox - ArchWiki](https://wiki.archlinuxjp.org/index.php/VirtualBox)

```bash:パッケージインストール
pacstrap /mnt mesa qt4 xorg-xauth sudo otf-ipafont
arch-chroot /mnt pacman -Scc

pacstrap /mnt virtualbox virtualbox-guest-utils
```

```bash:/mnt/etc/modules-load.d/virtualbox.conf
vboxdrv
vboxnetadp
vboxnetflt
vboxpci
```

## chroot

```bash:chroot
arch-chroot /mnt /bin/bash
```

```bash:chroot環境
# キャッシュのクリア
pacman -Scc

# ブートローダーの設定
mkinitcpio -p linux
grub-install --recheck /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

# sshdでX転送を許可
systemctl enable sshd
sed -i -e 's/#X11Forwarding no/X11Forwarding yes/' /etc/ssh/sshd_config

# ユーザの作成
useradd -m vagrant
passwd vagrant
usermod -aG wheel vagrant 
usermod -aG vboxusers vagrant

# locale
sed -i -e 's/#ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/' /etc/locale.gen
locale-gen
echo 'LANG="ja_JP.UTF-8"' > /etc/locale.conf

# ネットワーク設定
sed 's/eth0/enp0s3/' /etc/netctl/examples/ethernet-dhcp > /etc/netctl/enp0s3
netctl enable enp0s3
```

```bash:virtualbox用
systemctl enable vboxservice
```

```bash:chrootを抜ける
exit
```

## ssh鍵の設置

* /mnt/root/.ssh/authorized_keys をパーミッション`600`で設置しておく。

## fstab生成

```bash:fstab生成
genfstab -U -p /mnt >> /mnt/etc/fstab
```

```bash:再圧縮
btrfs filesystem defragment -r -czlib /mnt
#btrfs filesystem defragment -r -clzo /mnt
```

* これで disk: `692M`, mem: `15M`

```bash:再起動
reboot
```

## 再起動後の設定

```bash:rootでログイン
echo "%wheel ALL=(ALL) ALL" >> /etc/sudoers
timedatectl set-timezone Asia/Tokyo
```

----

# まとめ

* archlinuxは最小構成を作りやすく、勉強にもなって良いですね。
ChefとAnsibleの個人的な使い分け

オールアバウト Advent Calendar 7日目です。  

オールアバウトではChef Serverを使ってインフラを管理しています。
しかし、Chef-ZeroもしくはAnsibleも最適なタイミングがあるので、
個人的な使い分けを書いていきます。  

## Chef Server  
Chef Serverは現在、共有開発環境やステージング・本番環境に使用しています。
これにより、nodeの設定がChef Serverのweb管理画面から一通り確認できるようになっています。  
#### メリット
- Chefの特性として**べき等性**があるため、設定の更新が多いサーバーでは便利。
- nodeを集約管理するすることができるので、Chef Serverでnodeの設定を把握できる。
- Web管理画面があるため、ブラウザからでも操作可能。

#### デメリット
- Chef Serverの冗長化の構築・運用が辛い。
- 構成する要素が多いため、トラブルが発生した際の対応コストが高い。
- Chef Server構築する際に、学習コストと運用コストが高い。

## Chef-Zero
Chef-Zeroはlocal開発環境を作成する時や、Chef Serverにアップする
Cookbookの作成・修正を行う際に使用します。
また、この過程を踏む事によりgitでCookbookの管理ができます。
#### メリット
- Chef Serverと同じで、べき等性を担保できる。
- Boxファイルもあるため、構築のコストが低い。
- Cookbookさえ管理すれば、冗長構成を考えなくていい。

#### デメリット
- nodeを集約管理することができない。
- 設定の確認にはnodeに適用されているCookbookの確認が必要。

## Ansible
業務での使用はありませんが、個人的に利用しています。
nodeの設定を更新せずに、設定変更があったらnodeを作り直して使用しています。

#### メリット
- クライアントソフトウェアのインストールが不要。
- YAMLファイルでシンプルな記述が可能。
- cliから対話的に設定のインストールが可能。

#### デメリット
- Chefと同じようにべき等性を保とうとするのが大変。

# まとめ
#### Chef Server
複数台のサーバーを集約管理をしたい時や、オンプレなどを使用していて、
サーバー設定の更新が多いような場合に、使用するのが妥当ではないかと思います。
Chef Serverに対して変更をあまり加えない場合は、運用し始めたら安定して使用出来るので便利です。

#### Chef-Zero
local環境を作成したり、集約管理を考えない場合はChef-Zeroを使っておくのが無難ではないかと思います。
Cookbookの管理さえ気をつければ、サーバーの構成全てをコード管理する事が可能です。

#### Ansible
クラウドの様な環境でサーバーの設定変更を行わずに、新規構築する場合に向いていると思います。
Ansibleはインストールする内容や設定内容を、簡単に書けるのがメリットと思っています。
そのため、設定内容を素早く書いてしまい、作って壊す事が簡単に出来る
クラウドでの使用が向いていると思います。
Visual Studio Code: Task 機能に通知音を仕込む方法（特にWindowsの場合）

# 概要

Visual Studio Code の Task へ [Visual Studio Code: Task 機能に複数の任意のコマンドを簡単に仕込む方法](http://qiita.com/usagi/items/5a0f4edc99420173abb3) を数日前に整理した。次の Task への機能要求として、「音によるタスクの通知機能」が欲しい。

例によって vscode の task へ通知音を仕込む方法を強引に実現したので紹介したい。

# 背景

私は Visual Studio Code でも専ら C++ を扱っている。すると翻訳やリンクなどのビルドタスクの実行には多少の時間がかかる事が多い。また、昨今のビルドタスクは一般に CMake で管理する事が事実上のスタンダードの1つとして広く定着しつつあり、 ExternalProject など使っている場合にはその取得時間などもかかる。

そこで、従来他の環境ではタスク完了時に何らかの方法で音を鳴らして通知する事で、タスク中にも他の作業を行いつつ、タスク完了時には確実にすぐに元の作業へ戻れるようにしている。vscode の task 機能でもこうした多少の時間のかかるタスクについて同様に音による通知を行わせたい。

# 方法

「powershell.exe に Media.SoundPlayer オブジェクトを生成し同期再生させるワンライナー」を `task test` に仕込む例を挙げる。

tasks.json: 

```js
{ "version": "0.1.0"
, "command": "sh"
, "isShellCommand": true
, "showOutput": "always"
, "args": [ "-c" ]
, "tasks":
  [ { "taskName": "test"
    , "suppressTaskName": true
    , "args": [ "powershell.exe -Command '(New-Object Media.SoundPlayer(\\\"c:\\windows\\media\\alarm02.wav\\\")).PlaySync()'" ]
    }
  ]
}
```

音を鳴らすだけならば top-level に `sh` `-c` を渡す必要は無いが、前回の流れで任意の複数のコマンドを task で扱っている状況を想定した例とした。

これを応用して、以下のように `mkdir` `cd` `cmake` `ninja` からなる一連のビルドタスクの完了時に音を鳴らしして通知する task を vscode で実現できる。

```json
"args": [ "mkdir build; cd build && cmake .. -G Ninja && ninja; powershell.exe -Command '(New-Object Media.SoundPlayer(\\\"c:\\windows\\media\\alarm02.wav\\\")).PlaySync()'" ]
```

また、この方法は Windows 以外の環境でもそれぞれの環境にあわせた方法で同様に実現できる。あるいは Windows の `powershell.exe` を使う際には音声の再生以外にもインタラクティブシェル動作を要求しない機能であれば多くの場合に強引に組み込み可能である。

## 蛇足

- `Play` では `powershell.exe` は再生が始まるとほとんど同時に終了してしまい、結果非同期再生が行われない。そこで `PlaySync` により同期再生とするのが簡単な解決となった。
- 他の環境では、最も簡単には `echo -e "\a"` でベル制御文字をターミナルへ送る方法があるが、 vscode から実行される上ではベルを受け取っても音は出ないようなので使えない。

## ひとこと

多重エスケープは疲れるのであまり書きたいものではありませんが、タスク完了や中間ポイントでのサウンド通知はたいへん便利なので悩ましいところです。 vscode 本体機能としてタスク周りが強化されれば多重エスケープやコマンドによる強引なサウンド再生手法に頼る必要も無くなるかもしれませんね。

# References

- Qiita: [Visual Studio Code: Task 機能に複数の任意のコマンドを簡単に仕込む方法](http://qiita.com/usagi/items/5a0f4edc99420173abb3) 
- MSDN: [System.Media.SoundPlayer](https://msdn.microsoft.com/ja-jp/library/system.media.soundplayer.aspx)
技術英語 > this is an accident waiting to happen. > waiting for the signal to change

July 20, 2012

http://loe.org/shows/shows.html?programID=12-P13-00029
>  this is an accident waiting to happen.

<hr>
関連して思い出したのは

> waiting the signal to change
http://www.jp.onkyo.com/braille_essay/2014/jp01.htm

しかしながら、googleで"waiting the signal to change"で検索しても上記の記事のみだった。

<hr>
上記の代わりとして

> wait for the signal
http://ejje.weblio.jp/content/wait+for+the+signal

再度、"wait for the signal to change"で検索すると、たくさん検索結果が出てきた。

forをつけておくのが無難そう。
FileMaker14から導入されたプレースホルダテキスト


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の7日目

# FileMaker14から導入されたプレースホルダテキスト
[FileMaker Pro のプレースホルダテキスト](http://filemaker-jp.custhelp.com/app/answers/detail/a_id/14945/~/filemaker-pro-%E3%81%AE%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88)

## プレースホルダテキストを設定していない(従来どおりの)フィールド
![151207-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/44cad6a1-6387-6aed-e23c-3ca46a5eea74.png)

## プレースホルダテキストを設定すると
インスペクタでプレースホルダテキストを設定すると
![151207-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/3f3f2f3f-3150-f18a-7d94-f45163a54539.png)
こうなる
![151207-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/3ff587fe-4506-d959-e655-bf12bc6ec017.png)

## いちいち指定するの面倒すぎる
面倒なことはFileMakerにやらせる

フィールドの名前取ってくる関数はGetFieldName関数
>GetFieldName
目的 
参照されているフィールドの完全修飾名を返します。
構文 
GetFieldName ( フィールド名 )
引数 
フィールド名 - フィールド オブジェクトまたはフィールド名を参照するテキスト式の評価

```
GetFieldName ( Self )
```

![151207-04.png](https://qiita-image-store.s3.amazonaws.com/0/89027/7fda331b-1b03-ac07-f66c-c926eba2db25.png)

なんか微妙

フィールド名"::"の後ろだけの方がよさげ
ということで

```
GetValue ( Substitute ( GetFieldName ( Self ) ; "::" ; "¶" ) ; 2 )
```

とすると
![151207-05.png](https://qiita-image-store.s3.amazonaws.com/0/89027/7b09c84b-5e10-749a-96df-aebb619220b5.png)
となる
dockerのデータボリュームとそのバックアップ方法

データの永続化はdockerでよく課題になると思います。
docker docsには、Manage data in containersの節に、いくつかの方法が示されています。

https://docs.docker.com/engine/userguide/dockervolumes/

* データボリュームを利用する
* ホストのディレクトリにマウントする。

しばらく前まではホストのディレクトリに逃がしていたのですが、ホストのディレクトリとコンテナの中ではユーザの番号や書き込み権限の管理が違ったりして、うまくいかないことも多かったので、最近はまじめにデータボリュームを使うようにしています。

MySQLを例に、データボリュームとそのバックアップ方法をまとめてみます。

## データボリュームを作成してマウントする

データボリュームは、dockerfileの`VOLUME`で指定したディレクトリ、または`docker run`にて`-v`で指定したディレクトリに、自動で作られます。そしてそれは、コンテナとは別に管理され、`docker commit`や`docker export`してもデータボリュームの内容は含まれません。コンテナ間のデータ共有は、データボリュームによってのみ可能です。

イメージ
![container2.png](https://qiita-image-store.s3.amazonaws.com/0/3413/cc2b026f-9a03-a351-2857-eda5ce8617fa.png)

自動で作られるだけではなく、コマンドで作ることもできます。MySQLのデータを管理するデータボリューム作ってみます。
このデータボリュームの名前を`mysql_data`とします。

```
docker volume create --name mysql_data
```

データボリュームのリストは、コマンドで確認できます。

```
docker volume ls
DRIVER              VOLUME NAME
local               mysql_data
```

では、MySQLのコンテナにこのデータボリュームをマウントさせます。

```
docker run -d --name mysql -p 3306:3306 -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password mysql
```

確かに、マウントされていることが、`docker inspect`で確認できます。

```
docker inspect mysql

    ...

    "Mounts": [
        {
            "Name": "mysql_data",
            "Source": "/mnt/sda1/var/lib/docker/volumes/mysql_data/_data",
            "Destination": "/var/lib/mysql",
            "Driver": "local",
            "Mode": "z",
            "RW": true
        }
    ],

    ...
```

<del>なお、データボリュームはcreateすることができますが、標準の`local`の場合、一度コンテナに紐付けられると、そのコンテナが破棄された時にデータボリュームも一緒に破棄されます。よって、データボリュームを作成するときは、busyboxなどのコンテナにわかりやすい名前で紐つけておいたほうが良いと思われます。</del>


```
docker create --name mysql_data -v mysql_data:/var/lib/mysql busybox
```

(2015/12/09追記)確認しました。基本的にデータボリュームはコンテナを消しても削除されません。`--rm`をオプションにつけると、コンテナと一緒にデータボリュームを消す機能があるようです。


## データボリュームのバックアップ

コンテナやイメージと違い、データボリュームは単体でバックアップする方法は提供されていないようでした。このデータボリュームはプラグイン化されており、`docker volume create -d [plugin]`で指定できます。きっとバックアップは各プラグインで考えることなのだろうと思います。

ちなみに、上記の`docker inspect`の結果`local`と書かれていますが、実は`Source`のディレクトリがマウントされているだけです。バックアップには、このディレクトリを直接処理しても良いと思います。

よく登場するのは、他のコンテナにこのデータボリュームをマウントし、そこでバックアップをする方法です。なんだかなーとおもって、データバックアップ専用のコンテナ`74th/volumebackup`を作成しました。

https://hub.docker.com/r/74th/volumebackup/
https://hub.docker.com/r/74th/volumerestore/

以下のコマンドを実行すると、`mysql_data-YYYYMMDDHHmmss.tar.gz`というファイルにバックアップします。

```
docker run -v mysql_data:/target -v `pwd`:/export -e NAME=mysql_data 74th/volumebackup
```

復元するには、復元用コンテナ`を使います`

```
docker volume create --name mysql_data2
docker run -v mysql_data2:/target -v `pwd`:/import -e TARGETFILE=mysql_data-20151206124353.tar.gz 74th/volumerestore
```

最後に、このバックアップが使えることを確認します。

```
docker run -d --name mysql2 -p 3306:3306 -v mysql_data2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password mysql
```

## おわり

dockerは正義！なツールを発表しようと思っていましたが、まだ未熟なツールなので、ちゃんと理解していなかったデータボリュームについてまとめました。

[https://github.com/74th/flyingwhale](Flying Whale : any package management systems in the container)
UICollectionView の列数を設定する


列数をダイレクトに設定する方法はないので、画面のサイズから必要な列数に合うセルのサイズを計算して設定する。 
 
他に ```UICollectionViewDelegateFlowLayout``` プロトコルを実装したクラスを作成する方法があったが、恐らく下記の collectionView からLayoutを取り出して itemSize を直接設定する方法が一番簡単だと思う。

```swift
if let layout = collection.collectionViewLayout as? UICollectionViewFlowLayout{
    let cellWidth = floor(collectionView.bounds.width / 7)  // *7列*
    
    layout.itemSize = CGSizeMake(cellWidth, cellWidth)
    // ここからはオプション マージンとかをなくしている
    layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    layout.minimumInteritemSpacing = 0 // アイテム間?
    layout.minimumLineSpacing = 0 // 行間
    
}

//* 下記はViewController で指定する (マージン対策）
// これを設定するとスーパービューに自動で入るマージン(32pt)がなくなり、ピッタリ収まる。
// ただしレイアウト的にはあまりかっこよくないので、マージンを計算に入れてセルのサイズを決定するとより良いでしょう
// 詳しくはこの記事の下で
override func viewWillLayoutSubviews() {
    self.view.layoutMargins = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}


```
 
ただ ```UICollectionViewDelegateFlowLayout``` プロトコルを使用する場合も collectionView の delegate に ``UICollectionViewDelegateFlowLayout`` のメソッドを追加するだけなので、そう変わりはない。てっとり早い方法が上なだけ。

また delegateFlowLayout が ```collectionView:layout:sizeForItemAtIndexPath:```を実装していない時にしか有効にならない


>If the delegate does not implement the collectionView:layout:sizeForItemAtIndexPath: method, the flow layout uses the value in this property to set the size of each cell. This results in cells that all have the same size.

### レイアウト崩れ対策

ViewController の viewWillLayoutSubviews の直前で self.view.layoutMargins で自動的にマージンが作られるので、これをセルのサイズの計算に入れないとレイアウトが崩れてしまう。

計算に入れずに強引に対応するには、上記のコードの通りだが viewWillLayoutSubviews を override してその処理の中で layoutMargins を上書きしてしまえば良い。
**viewDidLoad でlayoutMarginsを指定しても、その後 viewWillLayoutSubviews までの間で上書きされてしまうので注意。**

参考にした記事
[Auto LayoutとSize Classesで謎の-16ptの記事を読んでもわからない人向けの説明](http://qiita.com/yimajo/items/10f16629200f1beb7852)
VS CodeのエクステンションをMarketPlaceに公開する

## はじめに
今回の情報はPreview版の[MarketPlace](https://marketplace.visualstudio.com/#VSCode)を元にしています。本リリースになった場合には異なる可能性があります。

## 事前準備

MarketPlaceにエクステンションを公開するためには、MicrosoftアカウントとVisual Studio Team Servicesに、メールアドレスを事前登録しておく必要があります。まだアカウントがない方は下記のサイトから作成しておいてください。

[Microsoftアカウント](https://www.microsoft.com/ja-jp/msaccount/)
[Visual Studio Team Services](https://www.visualstudio.com/ja-jp/products/visual-studio-team-services-vs.aspx)

## Personal Access Tokenの生成

アカウントの準備ができたら、公開のためのAcccess Tokenを　VS Tema Servicesのサイトから生成します。

![generateToen.png](https://qiita-image-store.s3.amazonaws.com/0/67429/8942869c-4c3a-bb3a-ceb6-8235e1ae7d5c.png)

まずは画面右上の自アカウントからMy Profileを選んで、左ペインで[Security]-[Persinal Access Tokens]画面で[Add]ボタンをクリックすると上図の画面にたどり着きます。公式アカウントによると[Accounts]は**all accessible accounts**、[Authorized Scopes]は**All scopes**にしないと動作しないらしいので注意してください。
後は、この画面で[Create Token]ボタンをクリックするだけです。Tokenは**1回しか表示されない**のでメモの取り忘れにはご注意を!!

## package.jsonの設定
package.jsonファイルの設定で最重要項目は**publisher**です。publisherは後述のvsceの設定と同じ名前にしないと後々エラーになってしまいます（大文字小文字も区別している気がします。間違いだったらごめんなさい）。また、iconを指定するとMarketPlaceにアイコンを表示できます。アイコンは128*128の正方形指定があります。また、galleryBannerを書いておくと、MarketPlace内のバナーをカスタマイズできます。

```json:package.json
"publisher": "yuichinukiyama",
"icon": "images/spellIcon.svg",
"galleryBanner": {
    "color": "#5c2d91",
    "theme": "dark"
}
```

## MarketPlaceへの公開
準備ができたらいよいよMarketPlaceにエクステンションを公開します。公開用ツールとして、**vsce**が提供されているので、インストールしておきます。
```
npm install -g vsce
```

### Publisherの設定
コマンドプロンプトからpubliserの登録とログインをします。下記のコマンドを実行する際には、Personal Access Tokenの入力が求められます。繰り返しになりますが、Personal Access Tokenは1回しか表示されないので、忘れてしまった方はTokenを再度登録しなしておく必要があります。
```
vsce create-publisher publisher名
vsce login publisher名
```

### packageの作成
作ったエクステンションをMarketlaceに公開せずに配布したい場合には、パッケージの生成をします（ということは、Marketplaceに公開するなら省略可能です）。そのためには、エクステンションのルートディレクトリに移動した後、以下のコマンドを実行します。
```
vsce package
```

### 公開
ここまで来れば後はもう公開できます。同じくルートディレクトリでpublishコマンドをたたくだけです。なお、Personal Acccess Token発効後にpubliser名を変更したりするとエラーになってしまいます。その際は、MarketPlaceの[manage Page](https://marketplace.visualstudio.com/manage/)から調整できます（vsixファイルを生成済みであれば、manage Pageからも公開できます）。
```
vsce publish
```
publishコマンドを実行すれば、package.jsonやREADME.mdを元に、MarketPlace内にページが自動生成されるともに、VS Codeからもインストールできるようになります。

![marketplace.png](https://qiita-image-store.s3.amazonaws.com/0/67429/5fc6ce46-7b0e-77d5-3202-dc9c86894060.png)


## MarketPlace上のエクステンションをインストールする
Marketplace上のエクステンションは、公開直後からVS Codeでインストール可能になります。コマンドで、[ext install エクステンション名]を記述して、ダウンロードボタンを押すだけです（以下の画面ショットはダウンロード後なので、右下のアイコンがアンインストールになっています）。
![install.png](https://qiita-image-store.s3.amazonaws.com/0/67429/685841a5-4191-58fe-755c-aeb4e5aaf40e.png)

## 参考
[vsce - Publishing Tool Reference](https://code.visualstudio.com/docs/tools/vscecli)
[Extension Manifest File - package.json](Extension Manifest File - package.json)
[TabSpacer（MarketPlace）](https://marketplace.visualstudio.com/items/yuichinukiyama.TabSpacer)
[TabSpacer（GitHub）](https://github.com/YuichiNukiyama/TabSpacer.git)
UICollectionViewCell のサブクラスを実装する


ステップ1 ```init(frame: CGRect)``` をオーバーライドして好きなレイアウトを実装する


>If you registered a class for the specified identifier and a new cell must be created, this method initializes the cell by calling its initWithFrame: method. For nib-based cells, this method loads the cell object from the provided nib file. 


ステップ2 UICollectionView の ```registerClass:forCellWithReuseIdentifier:``` を呼び出して実装したサブクラスを登録する

``` swift
collection.registerClass(myCellClass.self, forCellWithReuseIdentifier: "cell")

```


>You must register a class or nib file using the registerClass:forCellWithReuseIdentifier: or registerNib:forCellWithReuseIdentifier: method before calling this method.


参考

xib を使用する場合は ```registerNib:forCellWithReuseIdentifier:```  を登録するらしい
【FileMaker】仕様はここにも書ける

さて、FileMaker Advent Calendar 2015、7日目です。

みなさん仕様ってどこに持っていますか？
これがね、FileMakerで開発するときって仕様書がないことが多いんですよね。

なので、最近はここに書いてます。
![スクリーンショット 2015-12-05 20.03.05.png](https://qiita-image-store.s3.amazonaws.com/0/60538/3c12066a-7741-eafb-9fe7-29d7fa6f3ed3.png)
データベースの管理にある、リレーションシップ内です。

リレーションシップのテキスト（「A」）をクリックすると、メモ書きができるので、それを利用します。
![スクリーンショット 2015-12-05 20.00.42.png](https://qiita-image-store.s3.amazonaws.com/0/60538/e5dfb875-9389-b755-8f16-f4dde0cd05fb.png)

現場に行くと意外とご存じなくて「へぇ〜！」と言われまます。
![スクリーンショット 2015-12-05 20.00.56.png](https://qiita-image-store.s3.amazonaws.com/0/60538/c27401b0-50bb-729e-8043-98a4d0ed765d.png)

仕様書がないならFileMakerの中に残しておく、ということも保険としてやっておくといいですよ。
既存システムにWebAPIを設計、実装した時の反省点

日付が変わってしまいましたが、[Enterprise APIs Advent Calendar 2015](http://qiita.com/advent-calendar/2015/entapihack)の6日目です。

既存システムにWebAPIを実装した時に後から「ああしておけばよかった」「こうしておけばよかった」と思ったことをつらつら書いてみたいと思います。

# 前提

* 既存の業務システムにWebAPIを追加実装
* Web画面で出来ることをWebAPIでもできるようにする方針
* 確保した工数の都合で既存機能の業務処理は変更せずにI/F部分だけ追加実装
    * なのでリソースが既存画面に引きずられた

# リソース設計でミスった

前提にも記載した通り、既存画面の機能に対してWebAPIの口を作る方針で対応していたのですが、GETで取得するようなものは比較的簡単に設計を進めることができました。

しかし、登録系の操作に落とし穴がありました。

例えばレコード登録機能のリソース設計について、既存機能ではCSVファイルで一括レコード登録が出来るので以下のように設計しました。

```
POST /api/v1/hogehoge/records
※マルチフォームでCSV形式データを送信
```

後日、同じレコード登録で1件登録とZIPされた複数ファイルでの登録機能もあることに気がつきました。

この時、`POST /records`はもう使ってしまったので、素直なリソースを設定できなくなり、`POST /records/input`、`POST /*/records/zip` という微妙なリソースを割り当てることになってしまいました。

* `POST /records` で処理IDを取得
* `PUT /records/transactions/処理ID` で登録方法、データなどを登録
* `POST /records/transactions/処理ID` で登録処理

といった感じの流れにしておけば、複数の方法での登録処理に対応する時も整合性のある設計にできたんじゃないかと後悔しています。

# ドキュメントがWord

教訓：自分が渡されて困る形式にしてはいけない

デモ環境用意して、そこにリクエスト投げて動作を見れるような（Swaggerのような）ドキュメントを用意するべきでした。
社内政治とか、工数削減圧力とか、社内の採用実績、（フレームワーク使う場合）知名度などでExcel/Wordに流れることはありがち……。

# HATEOASが中途半端になった

ネット上のサンプル実装とか見て回って以下のような感じで返すようにしました。　

```js
{
  'link' : [
    {
      'url' : 'https://hoge.com/api/v1/records/1',
      'rel' : 'detail'
    }
  ]  
}
```

この形式だとどのHTTPメソッドを使えば良いのかよくわからないなぁ、と後から見て気がつきました。

どう解決するのが素直かな、と調べて回りましたが、シンプルにメソッド情報をつけるのが良さそうです。Paypalさんのドキュメントが参考になりました。

参考： https://developer.paypal.com/docs/integration/direct/paypal-rest-payment-hateoas-links/


# 終わりに

WebAPIの設計ノウハウはapigeeさんの[Web API Design - Crafting Interfaces that Developers Love](http://apigee.com/about/resources/ebooks/web-api-design)など参考になる情報が出ていますが、やはり実際のシステムに適用していくとなると頭を抱えることが多くあります。

1つ目に挙げた複数の登録方法、などはよくあるパターンなんじゃないかと思います。
こういった設計ノウハウを共有しあって **利用されやすい** WebAPIを作っていければいいなあ、と思います。

エンタープライズなシステム開発者の残業を減らすためにも！

明日の参加者はまだ登録されていないようなのでWebAPI設計に苦労された方がいましたら、是非登録してノウハウを教えていただければ幸いです。
UE4でAI(ビヘイビアツリー)を一時停止する方法

#概要
UE4でビヘイビアツリーで動作しているAIキャラクターを止めたい場合どうしたら良いのかな？と調べたらありました。

#停止のさせ方
**「StopLogic」**というノード。AIControllerの「Brain Component」から引っ張ってこれるもので、これを使用したサンプルブループリントが下記の画像です。

下記のブループリントは、一旦AIキャラクターを非表示にして、AIをストップさせています。
![stoplogic.png](https://qiita-image-store.s3.amazonaws.com/0/49072/4ca866b3-cbb7-f8fe-1023-76e03dbd4411.png)

#再開のさせ方
逆に一時停止したものを再開させるノードは下記です。

**「RestartLogic」**というノード。こちらも、AIControllerの「Brain Component」から引っ張ってくるものです。
下記のブループリントは、AIの動作を再開させてキャラクターを表示指定ます。上記のブループリントとペアに使用しています。
※ブループリントの流れ的には、AIを再開させたあと「Set Actor Hidden in Game」でActorを再表示させてます。

![RestartLogic.jpg](https://qiita-image-store.s3.amazonaws.com/0/49072/57b00713-03b1-7285-24a1-036277981ba4.jpeg)

#BrainComponentとは？
リファレンスのページを見るとブループリントになっているのは、上記の２つのみですが、C++では色々他にも使えそうなものがあるので、AIの細かい動作を作りたい場合は、リファレンスを見ると良さそうです。
*「ResumeLogic」
* 「IsPaused()」
* 「IsRunning()」
https://docs.unrealengine.com/latest/INT/API/Runtime/AIModule/UBrainComponent/index.html
簡易リバースプロキシ「ichigo」でWebアプリ開発が捗る話

## 概要

自社サービスの開発中、必要にかられてGOで簡単なリバースプロキシツールを作った話を書いてみます。

## 前提

自社サービスの開発を、次のような構成で進めています。

* フロントエンドとバックエンド（APIなど）をパスで振り分け
    * `/`の下はフロントエンド
    * `/api/`の下はAPI
    * その他にも色々・・・
* フロントエンドとバックエンドは、担当者もリポジトリも、動いているサーバも別
* それぞれサーバが開発環境、本番環境とテスト環境、のように複数の環境をもっている

## やりたいこと

前提の環境をもって、いざ開発をしようとローカル環境を構築するとなれば、

* ローカルにnginxでリバースプロキシを立てて管理するのは面倒くさい
* ちょっとした環境の変更があると共有がいちいち面倒くさい
* フロントエンド担当者がわざわざバックエンドをcloneだのpullだの面倒くさい
* 環境間でテストするためにわざわざnginxの設定書き換えるのも面倒くさい

と、面倒くさいことばかりになりがちです。

そこで、簡単なプロキシツールを作って、

* ローカルには自分の担当するサーバ（とプロキシツール）だけが動いていればいい
* 接続先の環境を容易に切り替えられる

ようになったら便利だなァ、というのが動機です。

## 作ってみた

これを手軽に実現できるよう、簡単なリバースプロキシツールを作ってみました。

[Ichigo (GitHub)](https://github.com/wacul/ichigo) 
![ichigo](https://raw.githubusercontent.com/wacul/ichigo/master/ichigo.png)

いちごです。美味しいですよね、いちご。

## 使い方

詳しい使い方は、GitHubのREADMEを御覧ください。
ここではかんたんな機能紹介まで。


* Ichigo経由でアクセスすると、画面左下にコントローラーが現れます。
![ichigo](https://raw.githubusercontent.com/wacul/ichigo/master/capture1.png)
* 各サーバーのプロキシ先を、コントローラで切り替えられます。
![ichigo](https://raw.githubusercontent.com/wacul/ichigo/master/capture2.png)

## ~~愚痴~~ 開発中のあれこれ

* この程度のツールを作るなら、Goってホント良い感じ。
    * Goっていい感じ。
* 世の中にありそうなもんだけどなァ、と思ったらなかなかなかった。
    * もっと賢いやり方あったら教えてほしい
* TypeScriptで頑張ってみたけど、やっぱりフロントエンド苦手。
    * でもやっぱりTypeScript最高。型付き言語最高。愛してる。（異論は認めます）
* Goっていい感じ。
* [gorilla/mux](https://github.com/gorilla/mux)とか、mux系は色々なライブラリがあるのに、もそっと柔らかいライブラリはないものなのか・・・。
    * `/*`はこっち、`/api/*`はあっち、とかやろうとすると、全部`/*`に吸い取られる罠
    * `net/http/httputil.ReverseProxy`最高！
* Goっていい感じ。
    * Goっていい感じ。
    * Gopher君ぺろぺろしたい

## Thanks

ちょっとした面倒を避けて、みんなの苺が美味しくなりますように
初代MacBook AirにLionを再インストールしようとしてエラーで悩んだ話

## 結論

時計（システムクロック）が狂っていただけでした。
時計を合わせることで、無事にインストールが進みましたとさ。

## 問題

初代MacBook Airを`command+R`で起動し、復元ユーティリティからMac OS X Lionの再インストールを実行したところ「インストールの準備中にエラーが起きました」とエラーメッセージが表示され、先へ進まず。
何度か試すも状況に変化なし。ネットワークには正しく接続されている模様。

## 突破口

インストール時のメニューに「インストールログ」的なものがあり、それを見てみると証明書関係のエラーが発生している様子。
そこでふと思いつく。「時計が狂っているのでは？」と。

## 解決

復元ユーティリティからターミナルを起動して`date`コマンドを実行。やはり時計の日時が狂っていました。
同じく`date`コマンドを用いて時計を合わせると、インストーラが先に進みました。

めでたしめでたし。
Swift : 画像の設定


Swift内で画像の設定をするときに使用。
Gifアニメーション的にアニメーションを動かしたり、
画像を再設定するときなど、初期値から切り替えるのにも使えます。


```
//outlet イメージビュー
    @IBOutlet weak var alianImage: UIImageView!	
//Action ボタンアクションなど
    @IBAction func updateImage(sender: AnyObject) {
            alianImage.image = UIImage(named: "test1.tiff")
    }
```