OmniAICreator/Qiita-1.07M huggingface dataset:
【phpMyadmin】phpMyadmin の設定保存場所の作成

各種設定を永続化させるためには設定保存場所を作る必要がある。

やることは以下の二つ。
・設定の保存場所となるデータベースをMySQLに作成
・設定ファイルに必要な情報を設定

###設定の保存場所となるデータベースをMySQLに作成
phpmyadmin/examplesディレクトリの配下のcreate_tables.sqlを実行して、データベースとテーブルを作成する。

自分はサーバにphpMyadminを入れているので、一旦ローカルにcreate_tables.sqlを持ってきてphpMyadminを使ってインポートした。

###設定ファイルに必要な情報を設定
phpmyadminディレクトリ配下にconfig.sample.inc.phpあるので、それをコピーして、config.inc.phpを作成する。

さらに以下のコメントを外す。

```php
/* Storage database and tables */
// $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
// $cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';
// $cfg['Servers'][$i]['relation'] = 'pma_relation';
// $cfg['Servers'][$i]['table_info'] = 'pma_table_info';
// $cfg['Servers'][$i]['table_coords'] = 'pma_table_coords';
// $cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages';
// $cfg['Servers'][$i]['column_info'] = 'pma_column_info';
// $cfg['Servers'][$i]['history'] = 'pma_history';
// $cfg['Servers'][$i]['tracking'] = 'pma_tracking';
// $cfg['Servers'][$i]['designer_coords'] = 'pma_designer_coords';
// $cfg['Servers'][$i]['userconfig'] = 'pma_userconfig';
```

参考
[phpMyAdmin の設定保存場所の設定]
(http://www.dbonline.jp/phpmyadmin/setting/index1.html)
ClojureでJubatusを利用してみる（Classifier：多値分類）

機械学習フレームワークのJubatusをClojureから利用するサンプルを作ってみました。
今回はClassifier（多値分類）のサンプルです。
公式サイトの [Python](http://jubat.us/ja/tutorial/classifier_python.html) [Ruby](http://jubat.us/ja/tutorial/classifier_ruby.html) [Java](http://jubat.us/ja/tutorial/classifier_java.html) のサンプルと内容は同じですので詳細はそちらを参照してください。

まずは、Leiningenで作ったプロジェクトでJubatusのJavaクライアントライブラリを使用する依存設定をしておきます。

```clj:project.clj抜粋
  :repositories [["jubatus" "http://download.jubat.us/maven"]]
  :dependencies [[us.jubat/jubatus "[0.6.,)"] [org.clojure/clojure "1.6.0"]]
```

`jubaclassifier -f shogun.json`でJubatusサーバを起動しておいて、以下のコードを実行すると

```core.clj
(ns jubatus-sample.core
  (:import [us.jubat.classifier ClassifierClient LabeledDatum]
           [us.jubat.common Datum]))

(def train-data
  {"徳川" ["家康" "秀忠" "家光" "家綱" "綱吉" "家宣" "家継" "吉宗" "家重" "家治" "家斉" "家慶" "家定" "家茂" #_"慶喜"]
   "足利" ["尊氏" "義詮" "義満" "義持" "義量" "義教" "義勝" "義政" "義尚" "義稙" "義澄" "義稙" "義晴" "義輝" "義栄" #_"義昭"]
   "北条" ["時政" "義時" "泰時" "経時" "時頼" "長時" "政村" "時宗" "貞時" "師時" "宗宣" "煕時" "基時" "高時" "貞顕" #_"守時"]})

(defn- make-datum [value]
  (.addString (Datum.) "name" value))

(defn train [client]
  (let [data (for [[k v] train-data]
               (map #(LabeledDatum. k (make-datum %)) v))]
    (.train client (shuffle (apply concat data)))))

(defn predict [client]
  (let [names ["慶喜" "義昭" "守時"]
        data (map #(identity [% (make-datum %)]) names)]
    (doseq [[n d] data]
      (->> (.classify client [d]) first (apply max-key #(.-score %)) .-label
           (#(println % n))))))

(def client (ClassifierClient. "127.0.0.1", 9199, "test", 1))
(train client)
(predict client)
```

以下の結果がプリントされました。うまく分類できているようです。

```text:結果
徳川 慶喜
足利 義昭
北条 守時
```
zshでsublimetext3を立ち上げる

1, 下記コマンドで.zshrcをvimで開く

vim ~/.zshrc

2,下記を入力する

alias subl="/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl"

3,保存して閉じて下記コマンドを実行
source .zshrc

4,下記コマンドで使えるようになる

subl　.
iOS Safari 向けモバイルサイトで、アプリバナーを表示


iPhone で WEBサイトを閲覧していると、たま〜に下記のようなアプリのバナーを見かけます。

![スクリーンショット 2014-08-15 15.56.51 のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/35733/a665042d-e57d-ae36-803e-5716d3dbb786.png "スクリーンショット 2014-08-15 15.56.51 のコピー.png")

このバナーをどうやってWEBサイトに仕込むのか、調べて試してみたのでメモ。といっても簡単で、iOS 6 以降では次の meta タグが効くので、この meta タグを書いておくと自動でバナーが表示される。

```html:
<meta name="apple-itunes-app" content="app-id=[アプリのID？]">
```

アプリのIDは、App Store で URL に表示されているもの。例えば Instagram の場合は、次のように `389801252` となる。

![スクリーンショット 2014-08-15 15.22.49.png](https://qiita-image-store.s3.amazonaws.com/0/35733/21cb4a6a-bbf5-430f-5289-9afd21ae41fd.png "スクリーンショット 2014-08-15 15.22.49.png")

なので、次のように meta タグを書くと、

```html:
<meta name="apple-itunes-app" content="app-id=389801252">
```

Instagram アプリのバナーが表示される。

![写真 2014-08-15 15 33 16 のコピー 2.png](https://qiita-image-store.s3.amazonaws.com/0/35733/3cc50d3a-f706-a42d-a077-a0da80af8a93.png "写真 2014-08-15 15 33 16 のコピー 2.png")

もし端末にアプリがダウンロードされていなければ、上記のバナーのように `表示` と表示され App Store にリンクすれるが、もしダウンロード済みの場合は、次のように `開く` となる(アプリが起動する)。

![写真 2014-08-15 15 34 24 のコピー 2.png](https://qiita-image-store.s3.amazonaws.com/0/35733/42529a0d-5f98-d517-2be2-f607373a7b05.png "写真 2014-08-15 15 34 24 のコピー 2.png")

# ほか

こちらにデモページを置きました(iPhone の Safari で見てください)。
⇒http://hkusu.github.io/iOS_itunesTag_demo/
Java書けない人がWebDriverを触る

## 環境
OSX 10.9.4
Eclipse Juno

# 準備（前半）
## Selenium2 WebDriver の DL
本体。
http://docs.seleniumhq.org/download/

スクロールすると、言語毎（Java, C#, Ruby, Python, Javascript[Node]）にDLリンクがあるので選択。
今回はJavaを選択。
ダウンロードしたらzipを展開して、どこかに置いておく。

## ChromeDriverのDL
ブラウザを操作するのに必要。
同じページの更に下にあります。
FirefoxDriverはデフォルトで入っているっぽいです。
zip展開しておく。

# 準備（後半）
## Eclipseでプロジェクト作成

1. プロジェクト一覧のところで右クリック -> New -> Java Project -> 適当に名前をつけて Finish
2. 作ったプロジェクトを右クリック -> New -> Package -> 適当に名前をつけて Finish
3. 作ったパッケージを右クリック -> New -> Class -> 適当に名前をつけて Finish

### Build Pathの設定

1. プロジェクトを右クリック -> Build Path -> Configure Build Path
2. [Source][Projects][Libraries][Order and Export]というタブがあるので、[Libraries]を選択
3. Add External JARs...を選択
4. さっき展開しておいた(selenium-2.x.xとかいうフォルダ名のはず)の中のjarファイルを2つとも選択してOpen
5. もう一度 Add External JARs... を選択
さっき選択した2つのjarと同じ所にlibsフォルダがあって、中にたくさんjarがあるので、全部選択してOpen
6. OKを押して終了

# 書く

- 作ったクラス（.java拡張子がついてる）をダブルクリックして開く。

http://docs.seleniumhq.org/docs/03_webdriver.jsp#introducing-the-selenium-webdriver-api-by-example

にサンプルコードが載っているので、写経。
（package名、class名は自分が指定した名前でもう書いてあるはず）

# 動かす

- 作ったクラスを右クリック -> Run As -> Java Application

Firefoxが立ち上がり、Consoleにログが出る！
（Consoleが見当たらない場合はメニューバーのWindow -> Show View -> Console）
```
Page title is: Google
Page title is: Cheese! - Google 検索
```
# Chromeで動かす
FireFoxをChromeに置き換えるだけと思いきや、それじゃ駄目らしいです。
http://kenichiro22.hatenablog.com/entry/20110825/1314280671

### chromedriver をソースコードの中に追加
1. Eclipse -> Preference を選択
2. 検索窓に"workspace"と入力
3. General > Startup and Shutdown > Workspaces がヒットするので選択
4. workspaceのpathが分かるので、Finderで開く
5. プロジェクト名のフォルダがあるので、その中に適当にフォルダを作り、chromedriverを入れる（例えばdriver/chromedriver、とか）
6. Eclipseに戻って、プロジェクトをrefresh(F5)とかすると追加したフォルダが反映されます

### コード修正
main(String[] args)の最初に
`System.setProperty("webdriver.chrome.driver", "driver/chromedriver");` を追加

最後に、firefoxをchromeに、FirefoxをChromeに置き換え、先程の手順で実行するとChromeが立ち上がります。

## 感想

この後は、Byとか何とかで色々できるようになるみたいです。
もっとEclipseのショートカットキーを覚えないと辛い。。
一方jsの場合は `npm install selenium-webdriver` でインストールできるけど、その後が？？）
wdというのもあるみたいだけど、やっぱり使い方が？？？
rbenv+ruby-buildを利用してUbuntuにRubyをインストールする

Rubyをそれぞれのバージョンごとにインストールできるアレです。
（Rubyの最新版は2.1.2/2014年8月15日現在）

## rbenvとruby-buildのインストール

リポジトリの更新をする。

	$ sudo apt-get update

必要なパッケージをインストールする。

	$ sudo apt-get install -y build-essential

gitをインストールする。

	$ sudo apt-get install -y git

rbenvをクローンする。

	$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

ruby-buildをクローンする。

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

.bashrcに追記する。

	$ echo 'export PATH="~/.rbenv/bin:$PATH"' >> ~/.bashrc
	$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc

シェルをリスタートする。

	$ source ~/.bashrc

インストール可能バージョンを一覧表示する。

	$ rbenv install -l

## 最新のRubyのインストールと利用

最新のRubyをインストールする。

	$ rbenv install 2.1.2

最新のRubyをデフォルトで使用する。

	$ rbenv global 2.1.2

Rubyのバージョンを確認する。

	$ rbenv versions
	  system
	* 2.1.2 (set by /home/vagrant/.rbenv/version)
	$ ruby -v
	ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]

## Rubyのバージョンを変えてみる
### rbenv global

過去のバージョンのRubyを利用する場合、対象のRubyをインストールして、

	$ rbenv install 2.0.0-p481


切り替える。

	$ rbenv global 2.0.0-p481
	$ rbenv versions
	  system
	* 2.0.0-p481 (set by /home/vagrant/.rbenv/version)
	  2.1.2
	$ ruby -v
	ruby 2.0.0p481 (2014-05-08 revision 45883) [x86_64-linux]

### rbenv local

プロジェクトごとにRubyのバージョンを変える場合、プロジェクトのディレクトリに移動し、

	$ mkdir sugoiproject
	$ cd sugoiproject

Rubyをインストールして、切り替える。

	$ rbenv install 1.9.3-p547
	$ rbenv local 1.9.3-p547
	$ rbenv versions
	  system
	* 1.9.3-p547 (set by /home/vagrant/sugoiproject/.ruby-version)
	  2.0.0-p481
	  2.1.2
	$ ruby -v
	ruby 1.9.3p547 (2014-05-14 revision 45962) [x86_64-linux]

### rbenv rehash

gemなどでライブラリをインストール後にパスを通すために必要。

	$ rbenv rehash

### 環境変数

環境変数からバージョンを指定することもできる。

バージョンを設定する。

	$ export RBENV_VERSION=2.1.2

バージョンを確認する。

	$ env | grep RBENV_VERSION
	RBENV_VERSION=2.1.2

バージョンを削除する。

	$ unset RBENV_VERSION

### 参考リンク

- [sstephenson/rbenv](https://github.com/sstephenson/rbenv#readme)
- [sstephenson/ruby-build](https://github.com/sstephenson/ruby-build#readme)
- [rbenvでRubyのバージョンを指定する方法 - Qiita](http://qiita.com/makoto_kw/items/cc73b628c9ef039f6e6f)
block / inline-block / inline 違い　


# block要素
・親要素の内容幅の全体に広がって配置される。
## 例
p div table ul ol form h1~h6 hr
# inline要素
・書式設定・強調など文中の一部分にだけの使用される。
・block要素の中にインライン要素を配置することはできるが、逆はできない。
## 例
span a strong
# inline-block要素
・inlineでありながら横幅や縦幅の指定ができる。
・html上の改行も反映して隙間が空いてしまうため、
間はコメントアウトしておく。
## 例
img input button
【質問】GCMサーバーから勝手に登録解除されてしまうことへの解決方法

Androidアプリを開発しているのですが、一部デバイスで通知が来ない不具合があります。
デバッグを行ってみたところ、アプリを起動時にはGCMサーバーへはregistration idは登録されています。
その後Webサーバーからアプリへメッセージングを行ってみると、送り先のアプリのデバッグが開始されるのですがデバッグの最初にonUnregisteredメソッドが呼び出されてしまい、GCMサーバーからregistration idが解除されているようです。

デバッグ中の端末は、Galaxy tabでAndroid4.0.4です。
アプリをアンインストールしたり、gcmサーバーから登録解除するコードが呼び出されたりしているわけでもありません。
ちなみに他のアプリ（LINEなどのアプリ）の通知は届きます。
また、パッケージ名を変えて同じアプリを作成し、動作させてみたのですが、こちらの通知は届きます。
（これが原因でしょうか。。。）

どなたか解決方法または通知が届かない原因をお教え頂けないでしょうか。
Test KitchenにDigitalOceanドライバを設定する

Test KitchenとVagrantで継続的にテストを進めてクックブックを制作していると下記の点で困ってきます。

- 手元のラップトップでやってるとCPUやメモリを食い過ぎてしょうがない。
- 複数のクックブックの制作とテストを同時進行できない。もしくは、できるけど遅い。
- それならDockerを試してみようと、MacBook Airでトライしてみると、あれ、結局VirtualBoxなんですね、とがっかりしてしまった。

割りとうれしいプラスアルファ
----

- DigitalOceanは割りと安いので費用対効果は十分あります。（※僕の場合１回のテストが今のところ約１円程度です。）
- DigitalOceanのコミュニティには親切に書かれたチュートリアルが多いので英語の勉強に意欲が湧いてきます。

手順
---------

####ステップ１．[DigitalOcean](https://cloud.digitalocean.com)でアカウントを作る

####ステップ２．[DigitalOcean - SSH Keys](https://cloud.digitalocean.com/ssh_keys)でssh公開鍵を登録する

####ステップ３．[DigitalOcean - Apps & API](https://cloud.digitalocean.com/settings/applications)でAPIバージョン２の鍵を作って環境変数として設定する（※すぐに消えるのでさっとコピペして下さい）

```
export DIGITALOCEAN_API2_KEY="2345"
```

####ステップ４．[DigitalOcean - API v1.0 Page](https://cloud.digitalocean.com/api_access)でAPIキーを作ります。クライアントIDと合わせて環境変数を設定する（※すぐに消えるのでさっとコピペして下さい）

```
export DIGITALOCEAN_CLIENT_ID="1234"
export DIGITALOCEAN_API_KEY="5679"
```

####ステップ５．SSH公開鍵のIDを調べて環境変数として設定する

下記コマンドで調べます。

```
curl -X GET https://api.digitalocean.com/v2/account/keys -H "Authorization: Bearer $DIGITALOCEAN_API2_KEY"
```

秘密鍵ファイルのパスと合わせて環境変数を設定します。

```
export DIGITALOCEAN_SSH_KEY_IDS="1234, 5679"
export DIGITALOCEAN_SSH_KEY_PATH="/path/to/ssh-private-key"
```

####ステップ６．必要な環境変数を再確認する

環境変数をざっとまとめると下記のようになります。お使いのシェルがbashの場合は``~/.bashrc``もしくは``~/.bash_profile``に、zshの場合は``~/.zshrc``もしくは``~/.zshenv``に書き込んでおいて下さい。

```
# DigitalOcean
export DIGITALOCEAN_CLIENT_ID="1234"
export DIGITALOCEAN_API_KEY="5679"
export DIGITALOCEAN_API2_KEY="2345"
export DIGITALOCEAN_SSH_KEY_IDS="1234, 5679"
export DIGITALOCEAN_SSH_KEY_PATH="/path/to/private/key"
```

####ステップ７．``kitchen-digitalocean``をインストールする

gemの場合。

```
gem install kitchen-digitalocean
```

bundlerの場合はGemfileを下記の通りにします。

```
source 'https://rubygems.org'

gem 'test-kitchen'
gem 'kitchen-digitalocean'
```

####ステップ８．``.kitchen.yml``を編集する

CentOS 7とUbuntu 14.04のx86_64アーキテクチャの場合は下記のようになります。

```
---
driver_plugin: digitalocean
driver_config:
  digitalocean_client_id: <%= ENV['DIGITALOCEAN_CLIENT_ID'] %>
  digitalocean_api_key: <%= ENV['DIGITALOCEAN_API_KEY'] %>
  ssh_key: <%= ENV['DIGITALOCEAN_SSH_KEY_PATH'] %>
  ssh_key_ids: <%= ENV['DIGITALOCEAN_SSH_KEY_IDS'] %>

provisioner:
  name: chef_solo

platforms:
  - name: centos-7
    driver_plugin: digitalocean
    driver_config:
      image_id: 4856048
  - name: ubuntu-14.04
    driver_plugin: digitalocean
    driver_config:
      image_id: 5141286
```

####ステップ９．別のディストリビューションのIDを調べる

下記コマンドで調べることができます。

```
curl -X GET https://api.digitalocean.com/v2/images -H "Authorization: Bearer $DIGITALOCEAN_API2_KEY"
```

以上です。``Region``や``Size``などを指定したい方は下記リンクを参照して下さい。

- https://developers.digitalocean.com/

参考にしたリンク
--------------

- [Github - test-kitchen/kitchen-digitalocean](https://github.com/test-kitchen/kitchen-digitalocean)
- [DigitalOcean - API](https://developers.digitalocean.com/)
MySQLのTimeZoneをJSTからUTCに変更する


# 環境
OSX 10.9.3
brew版 mysql

# 問題

```SELECT NOW();```の結果がJSTになってしまっている。

# 設定
## 現状の設定を確認する

```
mysql> show variables like '%time_zone%';
```

出力結果

```bash
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
```

## 設定ファイルの修正
```
$ vi ~/.my.cnf
```


```my.cnf
[mysqld_safe]
timezone = UTC
```

## 再起動

```
$ mysql.server reload
SUCCESS! Reloading service MySQL
```

## 確認

```
mysql> show variables like '%time_zone%';
```

出力結果

```bash
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM |
+------------------+--------+
```
ssh 複数のサイトとsshする場合configを設定すると便利

自分向けのメモです。(CentOS6.5)
今までは恥ずかしながらaliasしていました。

```sh
# ~/.ssh/config
Host deploy_test
    HostName        192.168.xxx.xxx
    IdentityFile    ~/.ssh/deploytest_id_rsa.test.org # そのサイトの公開鍵
    User            username
```

このファイルは他のユーザーから読めるといけないらしいので(bad owner or permissionsが出力される）、権限を設定します。

```bash
$ chmod 600 ~/.ssh/config
```

---- 

以下でサイトへ接続できます。

```bash
$ ssh deploy_test
```

# 公開鍵生成

deploytestのサーバーにて以下を行う(CentOS6.5の場合)

```bash
$ ssh-keygen
```

# 参考

- [~/.ssh/config で簡単に複数ホストへのSSH接続を管理する](http://superbrothers.hatenablog.com/entry/20090730/1248971671)
- [ssh で Bad owner or permissions エラー](http://futuremix.org/2005/10/openssh-config-permission)
jessevdk/go-flagsを使ってみる

## はじめに

pecoを使ってみて、どう実装しているのか気になったのでソースコードを読み始めました。まだ読み始めたばかりなので、全然理解できていないのですが、pecoで使われているjessevdk/go-flagsを使ってみたので、それについて書きたいと思います。内容としては、お試しで実装して動かしたことと、読んだドキュメントの紹介になります。

## 実装

``` sample.go
package main

import (
	"fmt"

	"github.com/jessevdk/go-flags"
)

type cmdOptions struct {
	OptHelp           bool   `short:"h" long:"help"`
	OptTTY            string `long:"tty"`
	OptQuery          string `long:"query"`
	OptRcfile         string `long:"rcfile"`
	OptNoIgnoreCase   bool   `long:"no-ignore-case"`
	OptVersion        bool   `long:"version"`
	OptBufferSize     int    `long:"buffer-size" short:"b"`
	OptEnableNullSep  bool   `long:"null"`
	OptInitialIndex   int    `long:"initial-index"`
	OptInitialMatcher string `long:"initial-matcher"`
	OptPrompt         string `long:"prompt"`
}

func main() {
	var err error

	// fmt.Print("Start\n")

	opts := &cmdOptions{}
	p := flags.NewParser(opts, flags.PrintErrors)
	args, err := p.Parse()
	if err != nil {
		fmt.Print("Error\n")
		return
	}

	if 0 < len(args) {
		fmt.Print(args[0] + "\n")
	}

	if opts.OptHelp {
		fmt.Print("OptHelp\n")
	}
	if opts.OptVersion {
		fmt.Print("OptVersion\n")
	}
	if opts.OptRcfile != "" {
		fmt.Print("OptRcfile: " + opts.OptRcfile + "\n")
	}
	if opts.OptNoIgnoreCase {
		fmt.Print("OptNoIgnoreCase\n")
	}
	if opts.OptInitialMatcher != "" {
		fmt.Print("OptInitialMatcher: " + opts.OptInitialMatcher + "\n")
	}
	if opts.OptQuery != "" {
		fmt.Print("OptQuery: " + opts.OptQuery + "\n")
	}
	if opts.OptPrompt != "" {
		fmt.Print("OptPrompt: " + opts.OptPrompt + "\n")
	}

	// fmt.Print("End\n")
}
```

## 試し方

まず、パッケージが必要になると思いますので、次のコマンドを実行します。

```
$ go get github.com/jessevdk/go-flags
```

次に、実行ファイルを作成するために、次のコマンドを実行します。

```
$ go build sample.go
```

ここまでの作業で、ソースファイルと同じフォルダに実行ファイルが作成されたと思います。ここでは`sample`という実行ファイルが作成されると思います。あとは、いろいろなオプションで実行ファイルを実行するだけです。しかし、どんなオプションで実行すれば試せるのでしょうか？

### どんなコマンドラインのオプションがこの実行ファイルにあるのか？

お試し実装の構造体の宣言のところなのですが、フィールドの宣言でバッククォートを使っています。これは未加工文字列リテラルで、バッククォート内の文字列シーケンスをそのまま使うものです。例えば、バックスラッシュをそのままバックスラッシュとして使います。

このバッククォートのところをよく見てみると、コマンドラインのオプションを定義しているように見えます。例えば、`-h`や`--help`というオプションを`-p`と`--print`にしたければ、次のようにソースファイルを編集すれば良さそうです。

``` go
-	OptHelp           bool   `short:"h" long:"help"`
+	OptHelp           bool   `short:"p" long:"print"`
```

C++言語の構造体を想像していたので、こういうことができるとは思っていませんでした。ぐぐってみると、[Go言語仕様翻訳(part5)](http://golang.jp/tag/go言語仕様/page/3)に次のようにありました。

```
フィールドの宣言には、オプションで文字列リテラルを使ってタグを指定することができます。タグはそれが記述されているフィールド宣言の全フィールドの属性となります。タグはリフレクションインタフェースを使って参照できますが、それ以外は無視されます。
```

ここまでの話で、おそらく、どんなコマンドラインのオプションがこの実行ファイルにあるのか読み解くことができるようになったと思います。時間のある方は確認してみてください。。。

## まとめ

Go言語を触りながら、[clib の使い勝手にマジ感動した](http://mattn.kaoriya.net/software/lang/c/20140627222830.htm)を思い出していました。github上にあるパッケージを手軽に利用できるというのは嬉しいですね。
（作成中）Data Visualization 勉強中

最近奥さんから、私の何かの占い（？）結果を聞き、思うところがあったので、
思ったことを書いてみたいと思います。

色々な方が書いていらっしゃいますが、
私も思うところがあるので書きたいと思います。

# Data Visualization はとても大切

## モチベーション
データ分析では、問題を定義する、解く、行動を起こす、という大まかなフローで進むと思います。
それぞれの要素一つひとつが大切ですが、データ分析という立場での成果を考えるとかけ算となり、どれも重要な要素だと思います。

特に、最後の「行動を起こす」というところが難しいと思います。

データ分析者は、分析結果や改善施策などを、
ビジネス側のメンバーやエンジニアや、時には経営メンバーや顧客に伝えます（協同することもありますね）。

結果を公開、適切な範囲に共有する、正しく伝える、伝わってほしい、など色々ありますが、
データ分析者が期待することは「相手に動いてほしい」ということではないでしょうか。

広告の目的は、それを見た人が「行動を起こす」「実行する」といったことにあると
聞いたことがあります。

分析というお仕事でも分析結果をみせることにより（コミュニケーション）、意思決定をしてもらう人、最適化や自動化するエンジニアたちに、行動を起こしてもらうということが大切です。
どんなに難しい方法やいい問題提起をしても、最終的に最後で「よくわからん」「ふーん」といった風にとられられて、背景や目的を理解してもらえず改善策が流れてしまうともったいないですし、分析者としての価値が出せなかったということになります。

私は数年間の分析のお仕事を通して、いくつかもどかしいコミュニケーションを経験して、
「図」による共有や報告が、いかに重要であるかを身をもって経験しました。

## R

Rで一番有名といわれているデータ、
FisherもしくはAndersonのアヤメの計測データを使って、
図によるストーリーを考えてみました。

```r
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
```
IE7で透過pngを表示したときに何故か白い斑点が現れる問題


IE7以下で透過pngを表示させた際、本来画像にはないはずの謎の白い斑点が出現する問題がありました。

しかし、同じ透過pngでもこの現象が発生する場合と発生しない場合があり、
その原因を探っていたところ、opacityをanimateさせたときにこの問題が起こるようです。
Androidのエミュレータからコマンド１つでアプリをアンインストールする

`adb` という SDK に同梱されているツールを使うと、コマンドラインからエミュレータ上のアプリをアンインストールできる。

```text:
> adb uninstall <package>
```

`<package>` には、アンインストールするアプリのパッケージ名を指定する。

パッケージ名は、 `AndroidManifest.xml` に記載されている。

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sample" ←これ
    android:versionCode="1"
    android:versionName="1.0" >
...
```

#参考
- [How to delete sample app from android emulator ? - Stack Overflow](http://stackoverflow.com/questions/2994407/how-to-delete-sample-app-from-android-emulator)
PHPを利用して crontab や at にジョブを登録する

php から cron や at にジョブを登録するための処理です。
基本的な処理と全体の流れを示すためにエラーチェックや入力値のチェック処理は示していませんが、実際にユーザから入力された情報を元に cron や at に登録する場合は入力値のチェック処理は必須です。

#cron#
`/usr/bin/crontab -` を実行してジョブを登録します。

実行頻度(frequency) に応じて以下の値が必須になります。

| 頻度 | 内容 | 必須項目 | 
|:-----|:-----|:---------|
|MONTH | 毎月指定日に実行する | $date, $time |
|WEEK  | 毎週指定曜日に実行する | $dayofweek, $time |
|DAY   | 毎日指定時間に実行する | $time |

最近の *crontab* で利用できる **@hourly** 等のを使った文字列での指定や、 **','** や **'-'** を使った範囲指定、 **'/'** を利用した間隔の指定には対応していません。
実行時間の指定は必須です。

```php
	/*
	 * 毎月/毎週/毎日 実行されるコマンドを cron に登録する
	 *
	 * $date:		毎月実行を指定した場合に実行される日を指定
	 * $time:		毎日実行を指定した場合に実行される時間を指定
	 * $dayofweek:	毎週実行を指定した場合に実行される曜日を指定
	 * $frequency:	実行の頻度 ("MONTH" | "WEEK" | "DAY")
	 * $command:	実行するコマンド
	 */

	/* cron への登録 */
	if(($cron = popen("/usr/bin/crontab -", "w"))){
		fputs($cron, _cronline($date, $time, $dayofweek, $frequency, $command));

		pclose($cron);
	}

	/* crontab に登録する行情報を生成 */
	function	_cronline($date, $time, $dayofweek, $frequency, $command)
	{

		$name = array(
			"MONTH" => array("day", $date),
			"WEEK" => array("dow", $dayofweek),
			"DAY" => array("dummy", null),
		);

		/* デフォルトは '*' */
		$day = $month = $dow = "*";

		/*
		 * MONTH の場合は $day に $date を代入
		 * WEEK の場合は $dow に $dayofweek を代入
		 * DAY の場合は未使用なので $dummy とする
		 */
		${$name[$frequency][0]} = preg_replace("!.*/!", "", $name[$frequency][1]);
		list($hour, $min) = split(":", $time);

		return(sprintf("%s  %s  %s  %s  %s  %s\n",
			$min, $hour, $day, $month, $dow, $command));

	}

```

#at#
`/usr/bin/at` を実行してジョブを登録します。
実行する月日時間の指定が必須です。
正しく登録された場合にジョブ番号をリターンします。

```php:
	/*
	 * 日時指定で1度だけ実行されるコマンドを at に登録する
	 *
	 * $hour:		実行する時を指定
	 * $min:		実行する分を指定
	 * $month:		実行する月を指定
	 * $day:		実行する日を指定
	 * $command:	実行するコマンド
	 */

	$year = date("Y");              /* 年を取得 */
	$now = time() + 60;             /* 1分後を取得 (マージン) */
	if($now > mktime($hour, $min, 0, $month, $day))
		$year++;                    /* 過去の月日なら来年を仮定 */

	/* at に登録 */
	$job = _atline($year, $month, $day, $hour, $min, $command);

	/* at コマンドへの登録処理 */
	function	_atline($year, $month, $day, $hour, $min, $command)
	{

		/*
		 * at コマンドでジョブを登録すると job 番号が取得できる。
		 * 後に atrm する場合に job 番号が必要なために
		 * proc_open() を利用して at(1) と双方向通信を行う
		 */

		/* at コマンドの入出力用パイプ */
		$desc = array(
			0 => array("pipe", "r"),
			1 => array("pipe", "w"),
			2 => array("pipe", "w"),
		);

		/* at コマンド実行 (at hhmm MMDDYYYY) */
		if(($proc = proc_open(sprintf("%s %02d%02d %02d%02d%04d",
				"/usr/bin/at", $hour, $min, $month, $day, $year), $desc, $pipe))){

			/* コマンド登録 */
			fputs($pipe[0], $command);
			fclose($pipe[0]);

			/* job 番号を STDERR から取得 */ 
			$buf = trim(fgets($pipe[2], 4096));
			fclose($pipe[2]);

			/* STDOUT close */
			fclose($pipe[1]);

			proc_close($proc);

			/* job 番号をリターン */
			return(preg_replace("/^job\s+(\d+).*$/", "$1", $buf));

		}
	}

```
SeleniumでJavaScriptを使ってWYSIWYG(CKEditor)の内容を取得/設定する方法

すごく頑張ってSeleniumを使ってiFrameの中を操作してたんだけど、JavaScriptでやれば楽々だった。。

#前提
CKEditorがこんな感じで設置してある場合。
(他の人がつくったページのテストを書いてるだけなので、CKEditorの設置方法？を知らないんだけど、↓の hoge という textarea を置き換えるとかそんな感じ？らしい？？)

```html:source_page
<textarea id="hoge" style="visibility:hidden; display: none;"></textarea>
<span id="cke_article_body">
  (…省略)
</span>
```

# サンプルコード
##テキスト入力
Rubyで受け取った変数はそのままJavaScriptで使うことはできないので `#{}` で使う。

```rb:set_text
# hogeの部分を環境に合わせて変更する
def set_text(text)
  @driver.execute_script("CKEDITOR.instances.hoge.setData('#{text}');")
end
```

##テキスト取得
`return` を入れて JavaScript の実行結果(CKEditorから取得したテキスト)を受け取る。

```rb:get_text
# ※hogeの部分を環境に合わせて変更する
def get_text
  text = @driver.execute_script("return CKEDITOR.instances.hoge.setData();")

  return text
end
```

#参考サイト(参考というかそのまんま)
■CKEDITOR で値を取得・設定する方法 « をぶろぐ
http://tetsuwo.tumblr.com/post/12457516199/ckeditor

■[CKEditor] WYSIWYGで編集中のデータを取得する | umbrella_process blog
http://www.umbrellaprocess.com/archives/233
綺麗な/etc/sysconfig/network-scripts/ifcfg-eth0の書き方


CentOS6の/etc/sysconfig/network-scripts/ifcfg-eth0はいくつか記述する方法があるが、綺麗な書き方。
NetworkManagerは使わない。

```:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=none
IPADDR=192.168.1.100
PREFIX=24
GATEWAY=192.168.1.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
ARPCHECK=no
```

参考までに/etc/sysconfig/networkはこんな感じ。
何も触ってない。

```:/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain
```
vaio type pにxpをusbメモリからインストール時にはまった点(wintoflash)

* USBメモリからのOSインストールでハマる点は、DISKの番号がずれること。
* vaio type pにインストール。
* USBメモリは2本あったほうが良いと思う。

# windows xpのusbインストーラ準備

* [wintoflash](http://www.forest.impress.co.jp/library/software/wintoflash/)をインストール。
* isoファイルの扱いも対応。

![スクリーンショット 2014-08-15 12.32.28.png](https://qiita-image-store.s3.amazonaws.com/0/25728/cf982bdc-82b5-9158-75ee-ca2e0a1d895a.png)


# 初回インストール完了後に、bootできない件

> 次のファイルが壊れているかまたは存在しないため、Windows を起動できませんでした:
> ＜Windows Root＞\system32\hal.dll
> 上記のファイルをインストールしてください

と出る。これはHDD内の c:\boot.ini のPATHが正しくないことが原因。
修正するためにレスキューUSBを作成する。

![スクリーンショット 2014-08-15 12.32.44.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8f9800ce-4a48-9ba9-759d-bb7f45a84943.png)

c:\boot.ini をUSBメモリにコピーし、母艦で編集して上書き保存。

```bash:
copy c:\boot.ini d:\boot.ini.txt
# boot.ini.txt を母艦で以下修正
```

```diff:boot.ini
- multi(0)disk(0)rdisk(1)partition(1)\WINDOWS”Microsoft Windows　XP　Professional” /fastdetect
+ multi(0)disk(0)rdisk(0)partition(1)\WINDOWS”Microsoft Windows　XP　Professional” /fastdetect
```

* 回復コンソールがUSBメモリの抜き出しに対応していたのに驚いた。

```bash:
copy d:\boot.ini.txt c:\boot.ini
exit
```


## asmsが必要です

* Windows XP のインストール時にエラー メッセージ "Windows XP Professional CD-ROM の 'asms' ファイルが必要です" が表示される
* コピー元を以下に修正しOK押下

```text:
w:\$WIN_NT$.~LS\I386\
```

* したのですがダメだったのでBIOSからUSBメモリでのBOOTをDISABLEにして、USBメモリを挿したままOS起動したらセットアップが続行した。


# type p driver

## 参考

* [How to install XP on Vaio P - Pocketables Forum](http://www.pocketables.com/forum/showthread.php?t=1906)

## driver

* [チップセット](http://www.dell.com/support/home/jp/ja/jpdhs1/product-support/product/inspiron-1210/drivers)
* [ATHEROS Wireless drivers for Windows](http://www.atheros.cz/atheros-wireless-drivers.php) AR928X
* [audio](http://www.fmworld.net/cgi-bin/driversearch/drvdownload.cgi?COLOR=1&DRIVER_NUM=E1008862)
* [bluetooth](ftp://ftp.vaio-link.com/PUB/OS/XPDOWNGRADE/Z11/DRIVERS/4%20BLUETOOTH%20DRIVER%20BROADCOM%205.1Z2Q108%20_%205.1.0.ZIP)
* [LAN](http://webpages.charter.net/ibagci/xp%20sony%20p.zip)
* [Video](http://download.kohjinsha.com/support/driver/KU00541.EXE)
* [スティックポインタ](http://www.sony.jp/support/vaio/download/EP0000181095.html)
* [vaiop_on_xp](http://www7a.biglobe.ne.jp/~schezo/vaiop/)
* [mactype](https://code.google.com/p/mactype/)


## windows 8.1 情報

[まだまだ現役、Vaio Type PにWindows 8をクリーンインストール | Windows8 Room](http://win8room.net/2012/12/16/1059.html)

## xp非対応アプリ

> プロシージャ エントリ ポイント InitializeConditionVariable がダイナミック リンク ライブラリ KERNEL32.dll から見つかりませんでした。 

こればっかりはだめだ

# お勧めアプリ

* Opera
  * chromeもfirefoxも重すぎ。IE8だとQiitaが対応していない
ffmpegを使ってディレクトリ内の全mp4ファイルのdurationを秒で取得する


```shell
for i in *.mp4; do ffmpeg -i $i 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,// | sed 's@\..*@@g' | awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'; done
```
Backlog のAPIのラッパー（PHP）

を書きました。[backlog-v2](https://github.com/atomita/backlog-v2)

## 使いかた

composerでatomita/backlog-v2をインストールして

```php
require "./vendor/autoload.php";

use \atomita\Backlog;
use \atomita\BacklogException;

$backlog = new Backlog('space-name', 'api-key');
try{
	$space = $backlog->space->get();
	var_dump($space);

	$comment = $backlog->issues->param('issue id')->comments->post(['content' => 'comment message']));
	var_dump($comment);
}
catch(BacklogException $e){
	// error処理
}
```

って感じ。
application/jsonで返ってくるAPIは、json_decodeして返します。

api-keyはbacklogの個人設定のところで作れます。
Send notifications iPhone/iPad using Amazon SNS and Rails

Short hand

```
sns = AWS::SNS.new(
  access_key_id: "key",
  secret_access_key: "key",
  region: "region")
client = sns.client
apns_payload = {aps: {alert: "hey it worked!", sound: "default"}}.to_json
message = {default: "this is the default", APNS: apns_payload }.to_json
client.publish message: message, topic_arn: "topic_arn", message_structure: "json"

```

References:

https://github.com/aws/aws-sdk-ruby/issues/336
http://www.jamesransom.net/?p=27
AngularJSでng-repeatを入れ子にした時の親のindexを取得する

ng-repeatを入れ子にした時に親のIndexを取得したかったので

```html
<div ng-repeat="hoge in hoges">
  <div ng-repeat="fuga in fugas">
    <p ng-show="$parent.$index % 3 == 0">hoge[3n].fugas</p>
    <p ng-show="$parent.$index % 3 != 0">hoge[!3n].fugas</p>
  </div>
</div>
```

何をしたいかわからないコードだけど、とりあえず`$parent.$index`で親のng-repeatからIndexを持ってこれるらしい。

```html
<div ng-repeat="(hogeIndex, hoge) in hoges">
  <div ng-repeat="fuga in fugas">
    <p ng-show="hogeIndex % 3 == 0">hoge[3n].fugas</p>
    <p ng-show="hogeIndex % 3 != 0">hoge[!3n].fugas</p>
  </div>
</div>
```

こんな感じでも書けるらしい
Synthの現状の問題点と今後の方針


気になった点をいくつか。

# 問題点
+ HTTP経由で`/html/**/*.html`を読み込んだ時とpreloadDataに入るビルドしたhtmlのデータのビルド方式が違う
+ 同じような理由でCoffeeScriptのビルド時に1.6.3のライブラリが混入していた事によって一部で動かないコードが生まれる問題が発生
+ Synthはバックエンドとフロントエンドを融合するとても素晴らしいツールだと思うが、jadeやejs等のビルドに関して共通のライブラリを通さないで表示するため、バージョンの差異による問題が発生しやすい

ejsが`/html/**/*.html`をHTTP経由でロードした時は正常に表示できるのに、preloadHTMLでサポートしていない問題はまもなく解決しそうです。


# 読み込む場所によってツールが違うカラクリ
`localhost/html/index.html`はharpJS経由(TerraformJSだったかもしれない)経由で表示される。その点に関してはSynthは一切関わらない構造になっている。
普通にAngularJSを使う限りではこれで問題は起きないはず。

しかし、preloadHTMLを読み込む時は独自でビルドして表示しているのだ。
https://github.com/JonAbrams/synth/blob/master/lib/frontendRenderer.js#L58

ココらへんもおいおい修正されていけば良いと思う
VisualStudioデバッガのコマンド引数経由で"%"を渡す

Microsoft Visual Studio (2012)のデバッガ経由で、コマンドライン引数に`%`を含む文字列を指定したとき、プログラム側に意図通りの文字列データが渡されない。

```c:dumparg.c
#include <stdio.h>
int main(int argc, char* argv[])
{
  printf("%s", argv[1]);
}
```

```
指定した文字列：foo-%05d.ext
渡される文字列："foo-\05d.ext" ("\05"は制御文字)
```

プログラムに意図通り文字`%`を与えるには、VisualStudioデバッガ側／コマンドライン引数上では`%25`を指定すること。

```
指定した文字列：foo-%2505d.ext
渡される文字列："foo-%05d.ext"
```
お盆なのでGo言語を触ってみた 〜 hello, world 編 〜


お盆休みなのでなにか新しいことを...と思って Go を触りました．
Mac だと brew で一発でインストールできました．便利ですね．

次は簡単なスクリプトをなにか作りたいと思います．

## 作業ログ

```

[issei@zion] ~ $ brew install go
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/go-1.3.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring go-1.3.mavericks.bottle.tar.gz
==> Caveats
As of go 1.2, a valid GOPATH is required to use the `go get` command:
  http://golang.org/doc/code.html#GOPATH

`go vet` and `go doc` are now part of the go.tools sub repo:
  http://golang.org/doc/go1.2#go_tools_godoc

To get `go vet` and `go doc` run:
  go get code.google.com/p/go.tools/cmd/godoc
  go get code.google.com/p/go.tools/cmd/vet

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libexec/bin

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
?  /usr/local/Cellar/go/1.3: 4339 files, 114M
[issei@zion] ~ $ go -v
flag provided but not defined: -v
Go is a tool for managing Go source code.

Usage:

        go command [arguments]

The commands are:

    build       compile packages and dependencies
    clean       remove object files
    env         print Go environment information
    fix         run go tool fix on packages
    fmt         run gofmt on package sources
    get         download and install packages and dependencies
    install     compile and install packages and dependencies
    list        list packages
    run         compile and run Go program
    test        test packages
    tool        run specified go tool
    version     print Go version
    vet         run go tool vet on packages

Use "go help [command]" for more information about a command.

Additional help topics:

    c           calling between Go and C
    filetype    file types
    gopath      GOPATH environment variable
    importpath  import path syntax
    packages    description of package lists
    testflag    description of testing flags
    testfunc    description of testing functions

Use "go help [topic]" for more information about that topic.

[issei@zion] ~ $ mkdir -p tmp/golang/hello
[issei@zion] ~ $ cd tmp/golang/hello/
[issei@zion] ~/tmp/golang/hello $ vi hello.go
[issei@zion] ~/tmp/golang/hello $ cat hello.go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
[issei@zion] ~/tmp/golang/hello $ go run hello.go
hello, world
```
PhpStorm で JavaScript の補完が効かなくなった


PhpStorm で JavaScript の補完が効かなくなった。

下記のようなコードを`a.js`などで保存してもメソッドの補完候補が表示されない。

![a_js_-_duce_-____work_bsc_duce_.png](https://qiita-image-store.s3.amazonaws.com/0/12272/35000f9c-02af-c10b-0439-55779ba5e4db.png "a_js_-_duce_-____work_bsc_duce_.png")


キャッシュクリアなど、あれこれ試行錯誤したところ、Composer でインストールされている`coffeescript/coffeescript`に含まれる `*.coffee` なスクリプトを消すと補完候補がでるようになった。

ただ、これは Laravel で asset-pipeline を実現する`codesleeve/asset-pipeline`の依存でインストールされているもので、`composer install`する度にファイルを消すのは面倒。

そこで、PhpStorm の CoffeeScript プラグインを無効にした。 

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/12272/d07a5a4e-bd48-242f-1f7f-1be13763ce5c.png "Preferences.png")

CoffeeScript は使ってないのでこれで解消。

![a_js_-_duce_-____work_bsc_duce_.png](https://qiita-image-store.s3.amazonaws.com/0/12272/09e5a8c1-dcd3-6f94-8dd9-e174d40e6ddf.png "a_js_-_duce_-____work_bsc_duce_.png")
Auto Layout 固有サイズに関するメモ


##固有サイズ(intrinsic content size)
イメージやテキスト用のビューについて、そのコンテンツを圧縮する、切り出すことなく表示するために必要な最小サイズのこと。
例えばボタンなら、タイトルとなる文字列が短くなったり長くなったりするのに合わせて、固有サイズが変わる。
これは、サイズに関するその他の制約が存在しない、または優先度が低い場合に有効となる。

固有サイズは、ビューのプロパティ`intrinsicContentSize`に設定される。

##- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize

すべての制約（サブビューの制約含めて）を考慮して、最適なサイズを返却する。
制約を考慮する際に、サブビューの固有サイズが利用される。

|targetSize|description|
|---|---|
|UILayoutFittingCompressedSize|コンテンツを表示するための最小サイズを指定する|
|UILayoutFittingExpandedSize|コンテンツを表示するための最大サイズを指定する|

##Content Compression Resistance Priority
固有サイズより小さなサイズの制約が設定されたときに、サイズを決定するために利用される優先度。
デフォルトでは高さ、幅ともに750が設定されている。

[私見]固有サイズより小さなサイズの制約が有効になるとコンテンツがすべて表示されない可能性があるので、固有サイズ自体の制約は高めの優先度になっていると考えられる。

##Content Hugging Priority
固有サイズより大きなサイズの制約が設定されたときに、サイズを決定するために利用される優先度
デフォルトでは高さ、幅ともに251が設定されている。
[私見]固有サイズより大きなサイズの制約は、デザイン上の意味を持つ場合もあると思うので、固有サイズ自体の制約は低めの優先度になっていると考えられる。

##システム定義の優先度、IBの作業領域

```objectivec
enum {
   UILayoutPriorityRequired = 1000,
   UILayoutPriorityDefaultHigh = 750,
   UILayoutPriorityDefaultLow = 250, // Content Hugging Priority には251が設定
   UILayoutPriorityFittingSizeLevel = 50,
};
typedef float UILayoutPriority;
```
![スクリーンショット_2014-08-15_9_10_46.png](https://qiita-image-store.s3.amazonaws.com/0/37895/e66f1c82-f819-5d0b-9e85-a5d5d93bfddd.png "スクリーンショット_2014-08-15_9_10_46.png")
pm-suspendからの復帰後に処理を入れる簡単な方法

suspendから復帰時に何か処理を入れたい場合がある。

```bash:.zshrc
s() {
  acpitool
  sudo /usr/sbin/pm-suspend
  sudo sh -c "echo 50 > /sys/class/backlight/psb-bl/brightness"
  acpitool
}
```

としておき、`s`を実行するとサスペンド、復帰時にその下の行が実行される。
10000の謎を解決した記事がなかった

#生年月日から年齢をたった一行で求めるやつ

もし生年月日が1992年9月28日だった場合、

```
$year = (int) ((date('Ymd')-date('Ymd',strtotime(19920928)))/10000);
```

まず、単純に今年から生まれた年を引く。
次にすでに今年誕生日が来ているかどうかを調べる。
来ていない場合は単純に引いた数から−１する。

例えば、今日、投稿日が2014年08月15日であるので

20140815 - 19920928 = 219887

まず「今年から生まれた年」を引く部分が前の２桁になる。
"21"9887なので２１
そしてその後ろに小数点を打つ。
つまり
###この小数点を前から２桁目の後、後ろから４桁目の前に打つ
ということが10000で割るということに等しい。
そして"21.9887となる。
そして「小数点以下を切り捨てる」ことで年齢が算出される。

今回、これを見つけて10000の謎を解明した記事がなくて困って考えたら普通に分かったので投稿。
簡単に生年月日から年齢を算出できるという点では非常に優れているのではないだろうか。
しかし、年齢の加算をどのタイミングで行うのかという議論などがある。

それでも簡単に使える点ではいいのではないだろうか。
まぁjavascriptでやれば誰も文句言わないからいいんだろうけどねw
【Rails】パラメータからcreateするときにはまったところメモ

例えば下のようなパラメータを受け取ったとします。

```rb
Parameters: 
{
  "utf8"=>"✓", 
  "user"=>{
    "name"=>"テスト　太郎",
    "age"=>"20",
    "country"=>"Japan"},
  "check"=>"true"
}
```

このパラメータの中からuserキーの中身をデータベースに入れたい場合、単純に考えて以下のように記述しました。

``` user_controller.rb
class UserController < ApplicationController
  def new
    省略
  end
  def create
    user = User.create(params[:user])
  end
end
```

なんとなく通りそうな気がしますが、実際は`ActiveModel::ForbiddenAttributesError`というエラーが吐かれます。
このエラーはGoo●le先生などに聞くと簡単に教えてもらえるのですが、Rails4のコア機能であるStrong Parametersの仕様による「検証通ってないよー」というエラーだそうです。
詳しくはTECHSCORE BLOGの[Rails4 の Strong Parameters でリクエストパラメータを検証する](http://www.techscore.com/blog/2013/01/29/rails4-%E3%81%AE-strong-parameters-%E3%81%A7%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%99%E3%82%8B/)などを参照して下さい。
ということで、書き直したのがこちら。

```user_controller.rb
class UserController < ApplicationController
  def new
    省略
  end
  def create
    user = params.require(:user).permit(:name, :age, :country)
    User.create(user)
  end
end
```

TECHSCORE BLOGによると、`user = params.require(:user).permit(:name, :age, :country)` の部分では「params が :user というキーを持ち、params[:user] は :name、:age、:country というキーを持つハッシュであること」を検証しているそうです。

大抵の記事ではこの方法で書いてあるので、これで通るだろうと思っていたのですが、まさかのエラー。
:name、:age、:country全てのキーに値が入っていたのに、:userは空だと言われてしまいました。
そんなまさか、と思ってもう一度実行するも同じエラー。
念のため全パラメータの値を確認するも、全部ちゃんと値が入っていました。
何故そのエラーが出たのかよくわからないまま悩んでいても仕方ないので別の方法をとり、以下のように修正しました。
別の方法とは言っても考え方は同じで「params が :user というキーを持ち、params[:user] は :name、:age、:country というキーを持つハッシュであること」

```user_controller.rb
class UserController < ApplicationController
  def new
    省略
  end
  def create
    user = params[:user].permit(:name, :age, :country)
    User.create(user)
  end
end
```

これでやっと通りました。
後から試したところどちらの方法でもちゃんと通ることを確認しましたが、未だに値が入っているのに:userが空だというエラーの原因はわからず…。
MSYS2でWindows上にコマンドライン環境を作る

# 更新履歴
2015.03.29 MSYS2を使った環境に変更

# 目的

ターミナル使ったUnixっぽい環境で作業したいならMacかLinux使ってろよとは言われますが、
Windowsでしかできない開発をしながらでも、ちょっとしたことにUnixのツールが使いたい。

個人的にはがっつりしたコマンドライン環境やLinuxに近い使い方をするならVagrantで作業するのが最近はいいんじゃないかと思います。
ただWindows上でもGUIではなくCUIで操作したいものがあると思うので環境を整えます。

# 環境

- Surface Pro 2
- 自作PC

どちらもWindows 8.1マシン

# 環境作成
## HOMEの設定

`C:\Users\username` の直下にドットファイルを置かれてほしくないので、`HOME` を設定する。
`HOME` を設定しておけば、今回のようにMinGWやCygwinからMSYS2にした場合でもシェルを起動した際のホームディレクトリは利用しているコマンドライン環境に依存しないものになる。

自分は Rapid Environment Editor を使って、`C:\Users\username\UnixHome` を `HOME` として設定した。
~~もちろんPATHを設定した後は面倒くさいけど再サインイン必須。~~
タスクマネージャからエクスプローラのプロセスを再起動すればOK。


## chocolateyのインストール

少し前は微妙とか自分でも言ってたけど、Microsoftが直々に開発しているOneGetでもChocolateyのリポジトリを使うらしいのと、Chocolateyで入らない物やインストール先が気に入らないものは手動で入れると割り切って使えば結構便利。

### Chocolateyで入れたものたち

- cmder
  - `choco install cmdermini.portable`

MinGWを使わないようにしたこと、Git for WindowsではなくMSYS2でGitを入れるため、CUI環境としてはCmderのみとりあえず入れる。
CUI以外のアプリケーションでChocolateyを使って入れているものはあるので使ってないわけではないですよ。

## MSYS2

MSYS2はMSYSと異なり64bit OS対応や内部ではMinGWが入っていますが`mingw-get`コマンドではなくArch Linuxで採用している`pacman`コマンドを利用したり、Gitがあったりパッケージが増えててバンザイ！な環境になっています。

### インストール
[MSYS2 installer](http://msys2.github.io/) から自分のOSに合ったものをダウンロード。
あとはインストーラーの指示に従い、サイトにもあるように`pacman`の更新まで行う。

```bash
pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime
# msys2_shell.batで立ち上げ直したあとに以下のコマンド
pacman -Su
```

#### 補足
MSYS2のインストール先には以下の3つのbatファイルが存在している。
- msys2_shell.bat
- mingw32_shell.bat
- mingw64_shell.bat

とりあえずmsys2_shell.batを立ち上げて以下のコマンドを叩いてみる。

```bash
pacman -Sl | grep git
```

先頭に msys/mingw32/mingw64 と書いてあるのはパッケージのカテゴライズである。
mingw32_shell.batで起動するとmingw32とmsysのカテゴリのパッケージは使えるが、mingw64は使えない。
その逆も然りである。
またmsys2_shell.batで起動するとmingw32/mingw64にカテゴライズされているパッケージはPATHが通っていないためインストールしてもそのままでは使えない。

### `PATH`の設定
ターミナルエミュレータはcmderを使うが、mingw32/mingw64として入れたパッケージが使えないから毎度batファイルを変えるというのも面倒なので`PATH`を設定する。
ここではOS依存ではなく、MSYS2という環境に依存するPATHとしたいので`.bash_profile`で設定しておく。

```bash
echo 'export PATH=/mingw64/bin:$PATH' > $HOME/.bash_profile
```

今回はこうしているが、例えばMSYS2で入れたGitをVisual Studioでも見えてほしい、とかの場合にはWindowsのシステムからユーザの`PATH`を指定したほうが良いかも？
その場合はちゃんと`C:\`で始まる絶対パスを指定するように。

### インストールしたもの
- git
  - `pacman -S git`
- openssh
  - `pacman -S openssh`
  
## cmder

変わったことは特にやっていないので最低限やったことを。

- フォントの変更
- monospaceの解除
- MSYS2のbashをtaskに登録し、デフォルト起動にする。Task定義のCommandsには以下を。
  - `"C:\msys64\usr\bin\bash.exe" --login -i`
  - スタートアップディレクトリを指定する場合は、別途指定すること


# まとめ

Windowsでコマンドライン環境作るのが面倒くさいとか言われるけど、~~MinGWとターミナルエミュレータをChocolatey経由で入れれば大体そろうのでいい感じ。~~
ざっと触った感じではMinGWでのCUI環境よりMSYS2の環境のほうが使い勝手がいいので、しばらくはこれでいけるんじゃないかって感じです。
もちろんMacやLinuxでは最初から揃ってると言われればそれまでですが。

他にコマンドライン環境を快適にするために入れたものがあれば追記します。

# 参考

- [開発者がSurfacePro3を買ったらまずやること - Qiita](http://qiita.com/tanakh/items/a1b4705fb58ef3c89800)
- [cmderの日本語フォントの幅を治す - Qiita](http://qiita.com/tukiyo3/items/8e477e48d3bebf9a04d1)
- [WindowsにMSYS2を導入して、Node.js を動作させるまでの手順 - Qiita](http://qiita.com/magichan/items/81fc400a9bf2c94c135b)
- [Windowsでgccなどを利用できるMSYS2の環境設定など - Qiita](http://qiita.com/chromabox/items/fd07bad3f426101fc4a6)
VisualStudio で mercurial を使える 'VisualHG'

#概要
VisualStudio 上でのプログラム開発においても、mercurial でのソース管理をしたくなりました。
調べて見たら VisualHG というプラグインでそれが実現できるということだったので、さっそく試してみた次第。

#VisualHG とは
Windows のエクスプローラーと連携する merucurial 実装である TortoiseHg をバックエンドとして、それを VisualStudio 上で利用できる様にするフロントエンドプラグインです。
コミットや同期など良く使う動作が VisualStudio の上から行えるので、フォーカスを離れる事無く開発に集中することができるようになります。

予め mercurial で管理されているリポジトリ下にあるソースコードを開くと、VisualHG が起動して管理状態を表示してくれるようになります。

#インストール
予めお使いの Windows 環境に [TortoiseHg](http://tortoisehg.bitbucket.org/ja/) がインストールされている必要があります。
Windows で mercurial を利用するための必須アイテムですので是非インストールしてください。

![vhg01.png](https://qiita-image-store.s3.amazonaws.com/0/50737/c11f80db-f0aa-d44e-5fa4-f106e0cc5945.png)
VisualStudio の「拡張機能と更新プログラム」で、オンラインギャラリーを 'visualhg' で検索すると見つかります。そこからダウンロード＆インストールして VS の再起動をしてください。



#使い方
VisualStudio の「オプション」から「Source Control」を選択し、ソース管理プラグインとして 'VisualHG' を使う様に設定します。

![vhg02.png](https://qiita-image-store.s3.amazonaws.com/0/50737/c3c09dfd-2692-5c62-ea6b-c11386c335d8.png)
予め mercurial のリポジトリで管理されている VSソリューション＆プロジェクトを読み込むと、ソリューションエクスプローラ上にソースコードの管理状態が表示されるようになります。

![vhg03.png](https://qiita-image-store.s3.amazonaws.com/0/50737/1a9ca2d9-34d5-d5aa-3b81-26503702ef4f.png)
ツールバーに VisualHG のツールバーを表示させておくと便利です。
左から「コミット」「状態」「ツリーブラウザ」「同期(push/pull)」「アップデート」と良く使う 5つが並んでおり、大体このツールバーで事足ります。
それ以外は File メニューやソリューションエクスプローラのコンテキストメニューから利用できますが、TortoiseHg を直接使う場合に比べあまりできることは多くありません。

##コミットしたくないファイルの指定
リポジトリディレクトリに ’.hgignore’ という名前のファイルを置いておくと、commit 時に表示しないようフィルタリングができます。
VisualStudio の個人環境ファイルである *.suo はコミットしたくないものですので、予め書いておくと便利です。

.hgignore
`syntax: glob
*.suo`


#Bitbucket をリポジトリにするには
VisualStudio で新規ソリューション＆プロジェクトを作った後それを mercurial で管理しようとした場合、VisualHG のみでの操作では実現できないと思います。VisualHG はあくまで既に mercurial で管理されているツリーを開いた時に使えるものなので。

なので新規プロジェクトに対しては TortoiseHg でリポジトリにする必要があります。
ソリューション＆プロジェクトがあるディレクトリで hg init やそれに相当する操作をすればローカルリポジトリが作成され他のサーバーを持たないローカルコミットができるようになります。
一人プロジェクトではこれだけで良い気がします。

ソール管理ツールの醍醐味としては Bitbucket 等のネットワーク上にリポジトリを置いて作業をしたくなるものですが、ローカルにリポジトリを作ってしまうとそれをネットワークに持っていくのが困難になります。
良くわかっていないのだけれども、ローカルのツリーを他のツリーにマージってできるのかな？

取りあえず、Bitbucket のWEBページで新規リポジトリを作成し、空っぽのリポジトリをローカルにクローン。できたリポジトリにソリューションをコピーした後 ADD してリポジトリでの管理開始、としてみました。
このへん良いやり方があったら教えてください。
caroucelコンポーネントの使い方


carouselコンポーネントを使ってフリック操作によるページめくりを行うシンプルな実装例。

動作環境

+ Sencha Touch 2.3.1
+ Sencha Cmd 5.0.1.231


まず、CarouselTestとしてアプリケーションを作ります。


`sencha -sdk$HOME/Code/Framework/touch-2.3.1 generate app CarouselTest carouseltest`

次に、carouseltest/app/view/Main.jsを次のように書き換えます。

```js:Main.js
Ext.define('CarouselTest.view.Main', {
     extend: 'Ext.Carousel',
     xtype: 'main',
     config: {
          xtype: 'carousel',
          fullscreen: true,
          direction: 'horizontal',
          items: [
               {
                    html: 'page-1',
                    style: 'background-color: red'
               },
               {
                    html: 'page-2',
                    style: 'background-color: blue'
               },
               {
                    html: 'page-3',
                    style: 'background-color: green'
               }
          ]
     }
})
```


1行目
クラスの定義

2行目
carouselコンポーネントを使うためにExt.Carouselクラスを継承

3行目
CarouselTest.view.Mainクラスの別名

4行目
configオプションの定義内容でコンポーネントの振る舞い・見た目を操作

5行目
xtype別名定義によりコンポーネントとしてcarouselを指定

6行目
全画面を有効にする

7行目
フリックの方向を水平に指定

8行目以下
carouselコンポーネント（正確にはCarouselTest.view.Mainクラス)が内包するコンポーネントを定義

3つのhtml要素をcarouselコンポーネントの子要素として定義


これで、carouseltestフォルダに移動して

`python -m SimpleHTTPServer`

とするとブラウザで [http://0.0.0.0:8000](http://0.0.0.0:8000) にアクセすることで以下の描画を行うアプリケーションを実行できます。

![Screen Shot 2014-08-15 at 12.57.52 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19083/408f040d-3361-dce6-a2cf-e25d1e4e3dc4.png "Screen Shot 2014-08-15 at 12.57.52 AM.png")
Ransackのsort_linkでデフォルトの第２ソートを指定する方法


Ransackのsort_linkを使用した時に、第２ソートはidの昇順となっているが、それを他の項目に変更する方法。

## 準備
確認用にtitleとbodyを持ったDialyをscaffoldして作成する。

**scaffold**
> rails generate scaffold dialy title:string body:text

**その他**
Gemfileに下記を追加してbundle installを実行。

```Gemfile
gem 'ransack', github: 'activerecord-hackery/ransack', branch: 'rails-4.1'

```

## Ransackの設定を行う
下記サイトのREADMEを参考に、scaffoldした状態にRansackのsort_linkの設定を追加する。

[Ransack](https://github.com/activerecord-hackery/ransack)


```dialies_controller.rb
  # GET /dialies
  # GET /dialies.json
  def index
    @q = Dialy.search(params[:q])
    @dialies = @q.result(distinct: true)
  end
```

```index.html.erb
<h1>Listing dialies</h1>

<table>
  <thead>
    <tr>
      <th>ID</th>
      <%= content_tag :th, sort_link(@q, :title) %>
      <th>Body</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @dialies.each do |dialy| %>
      <tr>
        <td><%= dialy.id %></td>
        <td><%= dialy.title %></td>
        <td><%= dialy.body %></td>
        <td><%= link_to 'Show', dialy %></td>
        <td><%= link_to 'Edit', edit_dialy_path(dialy) %></td>
        <td><%= link_to 'Destroy', dialy, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Dialy', new_dialy_path %>
```
Titleだけにsort_linkをつけている。

## 第２ソートを設定しない場合
何も設定しないとidの昇順がデフォルトの第２ソートになる。

![RansackSample1.png](https://qiita-image-store.s3.amazonaws.com/0/18110/038d9b04-39fb-0ac3-ed23-5ca2f77aa299.png "RansackSample1.png")


## 第２ソートを指定した場合
そこで、dialies_controller.rb#indexを下記に変更する。
(条件入れているところは、もっとうまく書きたい…）

```dialies_controller.rb
  # GET /dialies
  # GET /dialies.json
  def index
	# 第２ソート順にbodyの昇順を設定
    search_params = params[:q]
    search_params[:s] = [search_params[:s], "body asc"] unless (search_params.nil? || search_params[:s].nil?)
    
    @q = Dialy.search(search_params)
    @dialies = @q.result(distinct: true)
  end
```

***結果***
![RansackSample.png](https://qiita-image-store.s3.amazonaws.com/0/18110/f9d34d31-8dac-23ed-d182-d146687b6776.png "RansackSample.png")



idの昇順からbodyの昇順に第２ソートが変更されている。
今回は、Arrayで第２ソートを追加したけれどRansackのソースを見ると他にもHashとStringで指定出来るみたい。

```search.rb

   def sorts=(args)
      case args
      when Array
		# 省略
      when Hash
		# 省略
      when String
		# 省略
      else
        raise ArgumentError, "Invalid argument (#{args.class}) supplied to sorts="
      end
    end
    alias :s= :sorts=
```

viewだけで第２ソートを指定することって出来るんだろうか。
探し方が悪いのか、見つけられなかった。
git-flowで開発を管理

いまさら感もありますが、gitを利用した開発プロセスを一歩進めて、git-flowを導入仕様とする話。

#"git-flow" = ブランチ名称の使い方のルール

##３種類のブランチで開発フローを管理する

【３つのブランチ】
1.develop -> 開発というよりは、日本ではステージングというようなイメージ
2.feature -> 機能単位にブランチを構築する feature/login とか、 feature/signup とか。
3.hotfix  -> 本番リリースへの緊急バグFIXなどを実装するためのブランチ

![git-flow01.png](https://qiita-image-store.s3.amazonaws.com/0/50037/fce7f4e6-f90c-0ffc-bc94-f2a92d92969c.png)

## git-flowによる利点
###必要最低限のブランチの区分
CVSを利用している時も、ブランチを区切って開発していた際は

* ステージング用のブランチ（マージ用、唯一）
* 開発用のブランチ（開発ごとに作成）

みたいに切って使っていたので、概ねそれと同じ単位になります。
大きな違いと言えば、CVSにはリベースやチェリーピックなどの便利な機能はなかったので、
マージする際は「さぁ、やるぞ！！」という気合いが必要だったくらいでしょうか。

###分散リポジトリを最大限に活かせる
最近忘れがちですが、gitは分散リポジトリタイプのバージョン管理ツールです。
この特性をうまく活かす使い方としては、

* **一人で対応可能な機能については、ローカルブランチのみで開発**
* **複数人で作る機能については、リモートブランチのみで開発**

というような使い方ができる点は、非常に気に入っています。
一度作ったリモートブランチを削除するのは、とても面倒です。

リモートリポジトリを汚さないように気を使っていると、
自然と開発の人的リソースも工夫できるというのは一石二鳥だと思いました。

##git-flowの良くない点
* **ブランチ数が増えれば、マージコストが上昇する**

これはもう、どうしようも無い事なので、保険をかけていると思って諦めた方がいいと思います。

#git-flowを導入すると良いケース
1. **プロダクト開発**
長期にわたる開発の場合は、git-flowを導入するメリットは多々あります。
featureの使い方も、機能単位にする以外に、UIの改善フェーズ毎に区切ったりするのもいいでしょう。
gitのリベース機能を使えば、開発が終わった機能を他のfeatureブランチに取り込むのも簡単です。

2. **静的WEBサイトの運営**
特徴としてはプロダクト開発と多々同じ面がありますが、変更点であったり、
CSSがめちゃくちゃになってしまったりした時に、サクッと戻して見る事ができるので便利です。

#git-flowが向かないケース
1. **開発のゴールが決まっている**
開発のゴールは、どのプロジェクトでも決まっていますがwww
つまり、「１回リリースしたらしばらく改編はしない」などのケースです。
成果物を引き渡したらおしまい、というプロジェクトですね。
この場合は、masterの１本だけで開発した方が、
開発スピードが上がるので、そちらの利点の方が大きくなります。

2. **非常に小規模な開発**
言わずもがなですが、、、
バージョン管理自体を導入するかも検討した方がいいレベルのプロジェクトです。
ただし、ローカルなどで簡単にgit構築できるのであれば、
保険代わりにmaster１本で開発しておくといいでしょう。

#git-flowを導入するなら使いたいツール

##SourceTree
あの有名なJIRAなどの開発元であるAtlassianのツールです。
とりあえず今は無償で使えますが、いずれ有償になるぜ臭を漂わせているところが、
あまり好きになれない理由です。

とはいえ、現時点では非常に強力なgitのGUIツールですし、
git-flowに対応したUIも提供しているので、かなりオススメのツールです！！

【SourceTree ダウンロードページ】
https://www.atlassian.com/ja/software/sourcetree/overview
安全にファイルを操作する

# AtomicFile
API level 17からファイルを安全に操作するための仕組みとして`AtomicFile`が導入された。
これは書き込み開始時に元ファイルをバックアップし、失敗時にはロールバックすることでファイルの破損を防ぐ仕組みだ。
SupportLibraryにもr11から追加されているため、古い機種でも利用することができる。
http://developer.android.com/reference/android/support/v4/util/AtomicFile.html

# メソッド
## openRead
ファイル読み込みのための`FileInputStream`を取得する
前回のバックアップファイルが残っている場合、不正終了とみなして自動的にロールバックする
## readFully
`openRead`した内容を`byte[]`で取得する
## startWrite
ファイルの編集を行うための`FileOutputStream`を生成する
元ファイルが存在する場合はバックアップを生成する
## finishWrite
ファイルの操作成功時に呼び出すメソッド
バックアップファイルを削除する
引数の`FileOutputStream`は内部でcloseされる
## failWrite
ファイルの操作失敗時に呼び出すメソッド
バックアップファイルからロールバックを行う
引数の`FileOutputStream`は内部でcloseされる
## delete
元ファイル、バックアップファイルの両方を削除する
この処理では`startWrite`は必須ではない
## getBaseFile
元ファイルの`File`を返す


# 実装
````java
AtomicFile atomicFile = new AtomicFile(getFileStreamPath(FILENAME));
FileOutputStream fos = null;
try {
    // 書き込み開始
    fos = atomicFile.startWrite();

    fos.write(...);

    // 書き込み成功
    atomicFile.finishWrite(fos);
} catch (IOException ex) {
    // 書き込み失敗
    atomicFile.failWrite(fos);
}
````
# 補足
バックアップ処理は元ファイル名の末尾に`.bak`をつけたパスに`renameTo`しているようだ。
容量は食わないがコピーしているわけではないので、`startWrite`した後に元ファイルを参照したりしないように注意すること。
旧IEでmarginが2倍になってしまう問題

IE7以下でときどきmargin-topが何故か２倍になって表示されてしまう問題があります。

僕が遭遇した例では、

* 2カラムレイアウトを float: left; を使って実装した場合
* hrタグを使った場合

にmarginが２倍になるバグが見られました。


上記の問題への解決策としては、


```
2カラムレイアウトを float: left; を使って実装した場合
```
▶ 該当する箇所の親DOMに zoom: 1; を設定する


```
hrタグを使った場合
```

▶ hrタグの代替としてdivを利用する

ことで解決できました、