OmniAICreator/Qiita-1.07M huggingface dataset:
Aptana Studio FTPでアップロードする


## FTPアップロードするメモ
プロジェクトを選択して、右クリックから「公開」>「Run Web Deployment Wizard」
を選択する。



![スクリーンショット 2015-06-03 16.27.21.png](https://qiita-image-store.s3.amazonaws.com/0/70430/104c8104-a22d-5173-9236-de2ab0a7a956.png "スクリーンショット 2015-06-03 16.27.21.png")

「FTP/SFTP/FTPS」を選択して、次へ進む。
![スクリーンショット 2015-06-03 16.27.48.png](https://qiita-image-store.s3.amazonaws.com/0/70430/a3b88d23-1360-2023-042e-b538b2348eda.png "スクリーンショット 2015-06-03 16.27.48.png")

FTPの接続設定をして、完了する。
![スクリーンショット 2015-06-03 16.28.07.png](https://qiita-image-store.s3.amazonaws.com/0/70430/bfadb835-aff7-61fe-dd48-b8c556b2b075.png "スクリーンショット 2015-06-03 16.28.07.png")

## 同期
プロジェクトを選択して「公開」> 「同期化」をクリックする

![スクリーンショット 2015-06-03 17.26.57.png](https://qiita-image-store.s3.amazonaws.com/0/70430/b63f9290-3010-04d4-c5f1-7a20d394b607.png "スクリーンショット 2015-06-03 17.26.57.png")

同期をスキップする場合、スキップ欄にチェックを入れたりして同期する。


## 同期対象外の設定
「command」+「,」から、環境設定の画面を表示する。

メニューからは、「環境設定」をクリックする。
![スクリーンショット 2015-06-03 17.29.52.png](https://qiita-image-store.s3.amazonaws.com/0/70430/b3ecbe66-0964-1a83-9736-3d32996a30e6.png "スクリーンショット 2015-06-03 17.29.52.png")


「Aptana Sutdio」> 「公開」を選択して、除外するパターンを追加する。
![スクリーンショット 2015-06-03 17.31.05.png](https://qiita-image-store.s3.amazonaws.com/0/70430/24f8acb4-fadc-901d-c879-749a0728ef86.png "スクリーンショット 2015-06-03 17.31.05.png")
FreeNASの定期スナップショットがエラーを吐く

FreeNAS で定期スナップショットを取っているのだけど、毎度古いスナップショットの DELETE ができないとエラーが出ている。

```
Failed to destroy snapshot 'export/public/section1@auto-20150507.1530-2w': cannot destroy snapshot export/public/section1@auto-20150507.1530-2w: unsupported version or feature
```

古くからバージョンアップを重ねている FreeNAS サーバーの場合は、zfs pool のバージョンをアップグレードしないとダメなようで、ここに書いてあった。

* [Failed to destroy snapshot](https://bugs.pcbsd.org/issues/4696)

```Yes needs 'zpool upgrade' to get async_destroy.```

おとなしくupgradeしましょう。

upgrade の操作は [Upgrading a ZFS Pool](http://doc.freenas.org/9.3/freenas_install.html#upgrading-a-zfs-pool) に紹介されているとおり。
LinuxOS導入機器のスペック確認方法のメモ


#CPU数

`$ cat /proc/cpuinfo | grep processor
processor       : 0
processor       : 1
`

#HDDサイズ

## 全体のサイズ
`# fdisk -l`
`Disk /dev/sda: 146.0 GB, 145999527936 bytes`

##パーティション毎のサイズ
`# df -vh`
`Filesystem            Size  Used Avail Use% Mounted on`
`/dev/sda1             129G   56G   66G  46% /`
`tmpfs                 2.0G     0  2.0G   0% /lib/init/rw`
`udev                  2.0G  128K  2.0G   1% /dev`
`tmpfs                 2.0G     0  2.0G   0% /dev/shm`

#メモリサイズ
`# cat /proc/meminfo`
`MemTotal:        4060484 kB`



他にも確認できるファイルやツールなどがあるけど、確認方法の一例として。
windowスクロール量の「累計値」を取得する

単純な「windowのスクロール量（scrollTop値）」ではなく、上下スクロール量の「累計値」を取得する方法を考えてみます。

スクロールの上下方向にかかわらず「スクロールによる移動量をひたすら加算し続ける」というイメージです。

# 実装結果とソースコード抜粋

<p class="codepen" data-height="300" data-theme-id="18225" data-default-tab="js,result" data-user="shouchida" data-slug-hash="wvzgKLq" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="qiita_6bef19395077f427111c">
  <span>See the Pen <a href="https://codepen.io/shouchida/pen/wvzgKLq">
  qiita_6bef19395077f427111c</a> by Sho Uchida (<a href="https://codepen.io/shouchida">@shouchida</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

~~~javascript:JavaScript
// jQuery使用

var $window = $(window);
	
// 上下スクロール量を累計
var sumScroll = {
	currentScrollTop: 0,
	diffScrollTop: 0,
	sumScrollValue: 0,

	// 初期化
	init: function() {
		var self = this;
		this.currentScrollTop = $window.scrollTop();
		$window.on('scroll', function() {
			self.update();
		});
	},

	// 更新
	update: function() {
		var scrollTop = $window.scrollTop();
		if (scrollTop === this.currentScrollTop) {
			return;
		}
		this.diffScrollTop = Math.abs(this.currentScrollTop - scrollTop);
		this.currentScrollTop = scrollTop;
		this.sumScrollValue += this.diffScrollTop;

		doSomething(this.sumScrollValue);
	}
};

// 上下スクロール量の累計値を利用した何らかの処理
function doSomething(value) {
	console.log(value);
}

$window.on('load', function() {
	sumScroll.init();
});
~~~

scrollイベントが発生するたびに、「直前のscrollTop値」と「現在のscrollTop値」を比較し、その差分を加算し続けます。

「2000px分スクロールするごとに画面内の表示が切り替わる」
といった演出に利用できそうです。
com.twitter.util.Futureのメモ

Finagleを使うときに出てくるので、そのメモ書き。
随時更新します。

# `Future`自体は同期的

`com.twitter.util.Future`は「計算がまだ完了していない可能性がある」ことを示す単なるモナドなので、非同期処理機構自体は分離されていて、`Future` 自体は非同期では動かない。

[com.twitter.util.Future.applyの挙動](http://qiita.com/taketon_/items/f8757ae6c00b08aeb0c8)を参照。

# `Future.apply` と `Future.value`

APIドキュメントにも記述があるが、`Future.value`は定数(constant value)を`Future`でリフトすることを明示的に示すもの。

```scala
Future.value("hogefuga")
```

一方、`Future.apply`は計算自体を`Future`でリフトするもの。これには `Exception` などをラップする機能がある。

```scala
def func: String = throw new Exception
val future = Future(func)
future.isThrow // => true
```
インスタンス生成後のクラスにメソッドを追加して実行してみる


## はじめに
インスタンス生成後のクラスにメソッドを追加し、メソッドが追加される前に生成されたインスタンスから参照できるのかやってみます。

## 実行してみる
```ruby
class Myclass
end

my = Myclass.new

class Myclass
    def hello
        puts "こんにちは。"
    end
end

my.hello #=>"こんにちは"
```

## 結果
できます。

## 理由
生成したインスタンスの中には、「クラスへの参照」と「インスタンス変数」があるだけで、メソッドは含まれていません。クラスを共有しているインスタンスはメソッドも共有していて、メソッドはインスタンスではなくクラスにあるので、実行できました。
How to install gem `mysql2' to mac with MAMP

MAMP でインストールした mysql に ruby からアクセスしたい。
しかるに `gem install mysql2` とするとエラーになる。

```bash
% gem install mysql2
This could take a while...
ERROR:  Error installing mysql2:
	ERROR: Failed to build gem native extension.

    /Users/maangie/.rvm/rubies/ruby-2.2.1/bin/ruby -r ./siteconf20150603-18362-t9oxdg.rb extconf.rb
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/maangie/.rvm/rubies/ruby-2.2.1/bin/$(RUBY_BASE_NAME)
	--with-mysql-dir
	--with-mysql-include
	--without-mysql-include=${mysql-dir}/include
	--with-mysql-lib
	--without-mysql-lib=${mysql-dir}/lib

extconf failed, exit code 1

Gem files will remain installed in /Users/maangie/.rvm/gems/ruby-2.2.1/gems/mysql2-0.3.18 for inspection.
Results logged to /Users/maangie/.rvm/gems/ruby-2.2.1/extensions/x86_64-darwin-14/2.2.0-static/mysql2-0.3.18/gem_make.out
```

要は mysql.h が無いのがいかん、と。

[MAMP Forum • View topic - mysql rails and gem install](http://forum.mamp.info/viewtopic.php?f=6&t=6314) に「the devel version of MAMP」を使えって書いてあるけど、その下に「I'm having a similar problem. I don't see the developer version of MAMP on the download page. Is it still there? (同様の問題を抱えています。the developer version of MAMP が見つかりません。まだありますか？)」とあるように、既にない。

それで、Homebrew でインストールすればいけるんじゃね？と…。

```bash
% brew install mysql
% gem install mysql2 -- --with-mysql-include=/usr/local/Cellar/mysql/5.6.25/include/mysql
```

なんか無理くりですけど…。

ちゃんと動きました。

```rb
require 'active_record'

# DB接続設定
ActiveRecord::Base.establish_connection(
  adapter:  'mysql2',
  host:     'localhost',
  username: 'username',
  password: 'password',
  database: 'mydb',
  socket:   '/Applications/MAMP/tmp/mysql/mysql.sock'
)

# テーブルにアクセスするためのクラスを宣言
class User < ActiveRecord::Base
end

# レコード取得
p User.all
```

`brew uninstall mysql` したら動きませんでした。あたり前田のクラッカー。
Vagrant 立ち上げると mount エラー が表示されちゃったときの解決方法（new

# vboxsf が壊れると

```
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

つー、エラーが表示され。下記サイトの手順とおりに行っても解消しなかったので、調査し解決したメモ。

> [vagrantでmountエラーの解決方法](http://qiita.com/osamu1203/items/10e19c74c912d303ca0b)
> [Failed to mount folders in Linux guest. This is usually because the "vboxsf" file system is not available.を直す方法](http://qiita.com/DQNEO/items/2375dd8002a831268cb5)

# vboxadd setup を再実行
ゲストOS上で下記のコマンドを実行する。

```
# sudo /etc/init.d/vboxadd setup
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If the following
module compilation fails then this could be the reason.
The missing package can be probably installed with
yum install kernel-devel-2.6.32-431.3.1.el6.x86_64

Building the main Guest Additions module                   [FAILED]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions              [  OK  ]
```

ああ。なんだかカーネルが。。っていってるので。

```
# yum install http://vault.centos.org/6.5/updates/x86_64/Packages/kernel-devel-2.6.32-431.3.1.el6.x86_64.rpm
# yum install gcc
```

再度、・・・結構コンパイルに時間がかかります。

```
# sudo /etc/init.d/vboxadd setup
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [  OK  ]
Building the shared folder support module                  [  OK  ]
Building the OpenGL support module                         [  OK  ]
Doing non-kernel setup of the Guest Additions              [  OK  ]
Starting the VirtualBox Guest Additions                    [  OK  ]
```

ゲストOSをlogoutして、ホストOSで

```
C:\> vagrant halt
C:\> vagrant up
```

うまくいった。
fluentd で Compute Engine のログを収集する

# はじめに
Google Compute Engine インスタンス上で走っている Docker コンテナの出力を Cloud Logging に集めたい。[fluentd](https://github.com/GoogleCloudPlatform/google-fluentd) と [fluent-plugin-google-cloud](https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud) を使うとサービスアカウントを使って認証してくれるので簡単に収集できる。

**バージョンアップに伴い下記の内容は古くなっています．2015年7月28日時点の情報は[こちら](http://qiita.com/jkawamoto/items/7e7e74da127b6362c61a)．**

# fluentd コンテナの準備
[reactivehub/google-fluentd-base](https://registry.hub.docker.com/u/reactivehub/google-fluentd-base/) というベースイメージがあったので，これを使うことにした．(ビルドステータスが若干不穏な感じなので別のものに変えた方が良いかもしれない．)

ログの収集設定は [公式](http://www.fluentd.org/guides/recipes/docker-logging)のものを使うことにする．よって，次の設定を適当なファイル名で保存．

```apache:docker.conf
<source>
  type tail
  path /var/lib/docker/containers/*/*-json.log
  pos_file /var/log/fluentd-docker.pos
  time_format %Y-%m-%dT%H:%M:%S
  tag docker.*
  format json
</source>
<match docker.var.lib.docker.containers.*.*.log>
  type record_reformer
  tag docker.all

  <record>
    container_id ${tag_parts[5]}
  </record>
</match>
```

なお，上記の設定では最終的に docker.all というタグのレコードが用意されるが，Cloud Logging 上ではこのタグ名に対応するコレクションが作られる．

ついでに fluentd の出力も収集するために次の設定も用意した．下記の場合，gfluentd というコレクションが作られる．

```apache:gfluentd.conf
<source>
  type tail
  path /var/log/google-fluentd/google-fluentd.log
  pos_file /var/log/google-fluentd.pos
  time_format %Y-%m-%dT%H:%M:%S
  tag gfluentd
</source>
```

続いて，reactivehub/google-fluentd-base を基にしたイメージを作成する Dockerfile を用意する．

```Dockerfile:Dockerfile
FROM reactivehub/google-fluentd-base

RUN /opt/google-fluentd/embedded/bin/gem install fluent-plugin-record-reformer \
                                                 fluent-plugin-google-cloud
ADD *.conf /etc/google-fluentd/config.d/
```

fluent-plugin-google-cloud は予めインストールされているはずなのだが，なぜか再インストールしないと認証エラーとなった．

# ビルドと実行
後はいつものようにビルドし，

```shell-session
$ docker build -t fluentd-agent .
```

docker のログが保存されているディレクトリをマウントしながら起動すれば良い．

```shell-session
$ docker run -d --name fluentd-agent -v /var/log/docker:/var/log/docker --add-host="metadata:169.254.169.254” fluentd-agent
```
Aptana Studio 日本語化（Mac）


## 日本語化パッチをダウンロード

http://mergedoc.osdn.jp から安定版をダウンロードする。
![スクリーンショット 2015-06-03 16.11.43.png](https://qiita-image-store.s3.amazonaws.com/0/70430/a413b01b-737b-3fff-03cf-821b6ccf009f.png "スクリーンショット 2015-06-03 16.11.43.png")
![スクリーンショット 2015-06-03 16.12.31.png](https://qiita-image-store.s3.amazonaws.com/0/70430/6496c98c-6a5e-8d19-b9bb-d8fd67dcc174.png "スクリーンショット 2015-06-03 16.12.31.png")

解凍したディレクトリから「features」と「plugins」の中身だけを、インストール先の「features」と「plugins」にコピーする。

## Aptanaの起動ファイルを修正
![スクリーンショット 2015-06-03 16.17.16.png](https://qiita-image-store.s3.amazonaws.com/0/70430/1af16120-5058-d16e-9a87-98546a030af7.png "スクリーンショット 2015-06-03 16.17.16.png")
アイコンを右クリックして「パッケージの内容を表示」から以下のパスのiniファイルを編集する。
/Applications/Aptana Studio 3/AptanaStudio3.app/Contents/MacOS/AptanaStudio3.ini

最後の次の行を追加する

```
-javaagent:/Applications/Aptana Studio 3/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```
C > 浮動小数点型変数はループカウンタとして使用しない


引用：組込みソフトウェア開発向けコーディング作法ガイド [C言語版]のR 2.1.2

```c:不適合
void func() {
    double d;
    for( d=0.0; d < 1.0; d += 0.1 ) {
    ...
```

```c:適合
void func() {
    int i;
    for(int i=0; i < 10; i++) {
    ...
```

> 浮動小数点数は、ループカウンタとして演算が繰り返されると、誤差が累積し、意図した結果が得られないことがある。このため、ループカウンタには整数型を使用すべきである。

関連して以下を思い出した。
http://d.hatena.ne.jp/toburau/20120114/1326558361

> float変数に1を1億回足した答えは1677万だ。

doubleの場合はもっと精度が高いので、上記floatのような問題はないだろうが、ループカウンタとしてdoubleを使う時はきちんとループするか確認するのがいいだろう。

。。。と書きながら疑問を持った。はたして本当にだめなのか?
http://ideone.com/GqZScD
にdouble型の1.0を1億回たすコードを用意してところ、結果は1億であった。

なぜコーディング規約で禁止されているか？
「組込み」がキーワードにあるように思う。

組込みの世界ではdoubleという型が内部的にはfloat型で実装される例がある。float型での場合、上記に見たように誤差が累積し、ループが正常に実行されなくなる。
doubleを内部的にdoubleできちんと扱う環境では、この問題は発生しない。

実行環境のdoubleの実装がどうなっているか、注意したほうがいいだろう。
Aptana Studio Gitからインポートする


***
※ コミットコメントが文字化けしたので、追記

***

## Gitからインポートするメモ
[Project Exploer」からインポートする。
![スクリーンショット 2015-06-03 15.51.39.png](https://qiita-image-store.s3.amazonaws.com/0/70430/cf0c5c55-70a8-1602-cb4e-c4707cbecaf3.png "スクリーンショット 2015-06-03 15.51.39.png")

「Git Repository as New Project」を選択する。
![スクリーンショット 2015-06-03 15.52.00.png](https://qiita-image-store.s3.amazonaws.com/0/70430/625ae799-7d16-f1db-8172-04475e585f1e.png "スクリーンショット 2015-06-03 15.52.00.png")

「URI」に対象のGitのURIを入力するs
![スクリーンショット 2015-06-03 15.55.43.png](https://qiita-image-store.s3.amazonaws.com/0/70430/62eb74d7-7bae-f1b4-2959-1b528fdd1117.png "スクリーンショット 2015-06-03 15.55.43.png")

ユーザー名とパスワード確認のダイアログが表示されるので、続けて入力する。


## コミットコメントが文字化けした場合

```
/Applications/Aptana Studio 3/AptanaStudio3.app/Contents/MacOS/AptanaStudio3.ini
```

に、以下の行を追加する

```
-Dfile.encoding=utf-8
```
特定のライブラリを指定してpod updateする方法


ヘルプを見れば一目瞭然なんですが、以下の方法でできます。

```shell
pod update [POD_NAMES ...]
```

例えば、AFNetworkingだけアップデートしたい場合は

```shell
pod update AFNetworking
```

複数指定してアップデートしたい場合はスペース区切りで指定する

```shell
pod update AFNetworking JSONModel
```
Amazon ECS(EC2 Container Service)についての簡単なメモ


はじめに
========

今更ながらAmazon ECSをちょっと使おうと思って調べたことのメモです。

概要・ぱっとみ感想
=====

* AWSのEC2上に Dockerコンテナを配備するためのサービス
* コンテナ同士の管理・連携などはAWS独自の仕様・仕組みで作られている（んだと思っている）
* Web Consoleがあるので、初心者にはより使いやすいかも
* コンテナ毎のメモリやCPUリソースの分配ルールが指定可能
* Docker Imageは Docker Hubから指定可能（独自Dockerリポジトリも可能？ [ここ](http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html)に `image` について `You can also specify other repositories with repository-url/image:tag.` と書いてあるので可能なように思える。SSL証明書とかがOKなものなら少なくともいけそう。）
* コンテナインスタンスはVPC内にたてることが可能


紛らわしい用語整理
-----

* コンテナインスタンス: EC2 Instanceのこと
* (Docker)コンテナ: Dockerにデプロイされる Docker Image のこと
	* つまり、１つのコンテナインスタンス(EC2)の中に複数のコンテナ(Docker)が稼働可能、という関係

ECSの概念
===========

ドキュメントとWebConsoleを触った感じから、自分の理解をちょっと図にしてみた。

![aws_ecs_pptx.png](https://qiita-image-store.s3.amazonaws.com/0/11124/ad3982b5-9862-24f3-6a2b-cc5a8159fee1.png "aws_ecs_pptx.png")

タスク定義(Task Definitions)
--------------

* 「タスク定義」は複数の「コンテナ定義」を持つ
* 「コンテナ定義」では、どのDocker Imageをどう実行するか（PortMap, VolumeMap, CPU/Memory割り当て) を決める。
* Memoryは上限値を定めるが、CPUは上限値ではなく「コンテナがお互いに窮屈になったら融通しあう割合」を指定する。つまりコンテナインスタンスのCPUが余っていたらCPUは100%使われる。

タスク定義は大事なので詳細はここを見ると良い。
http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html
    
クラスタ(Cluster)
-----------

* １つのクラスタ は 複数のサービス(Service)を持つ
* １つのクラスタ は 複数のコンテナインスタンス（EC2 Instance）を持つことができる
* １つのサービス は １つのタスク定義 を持つ
	* この時その「タスク定義」を「いくつ実行するか」を決める（タスク数を指定する）
	* ただし、十分なリソース（コンテナインスタンス内の）がないと指定したタスク数にならないことがある
		* CPU/Memoryが不足、Portが重複、など

* コンテナインスタンスは、EC2 Instanceで、デフォルトではDockerに最適化されたOS Imageである
	* (Amazon Linux に Docker Agentとかいうのが入っているっぽい). 
* EC2 InstanceにSSH鍵を指定して起動しておけば、そのコンテナインスタンスにSSH Loginも可能。

ECSの操作
=========

コンテナインスタンスの追加
------------
少なくとの以下の２つの方法で追加できた。

* コンテナインスタンスのEC2インスタンスを **EC2のコンソール**から `Launch More Like This` すると、ECSのクラスターの対象に追加される（された）。
* AutoScaling Groupがある場合は（適当にやったら自動的に追加されてた）、「最大」「希望」Instance数を上げれば追加される（された）。

サービスのデプロイ
-----------

* タスク定義をして、クラスタ（サービス＋コンテナインスタンス）を定義すれば自動的にサービスのTask定義が開始される。
* ただし、コンテナインスタンスのリソースが不足する場合は、指定したタスク数が起動しないことがある。

サービスの更新
----------

デプロイしたコンテナの更新や設定を変更する場合は、タスク定義を更新する形で行う。

* タスク定義には **Revision番号** がある。
* タスク定義の更新のときに「新しいRevisionの作成」という機能から、新たなタスク定義を行う。
* サービスが実行するタスク定義を指定するときも 実は「タスク定義＋Revision番号」で指定するので、その番号を更新することで、サービスの更新を行う。

つまり、「新たなタスク定義Revision追加」→「サービスが実行するタスク定義Revisionを更新」 という流れになる。

注意事項として、サービスを更新しても、古いRevisionのタスクは動いたままになるので、手動で古いタスクを停止しないといけない（勝手に止まったりしないという意味）。停止すると、（指定されたTask数に満たないし、コンテナリソースが余っているので）しばらくしたら新しいRevisionのタスクが起動することになる。

さいごに
=======

最初ややこしかったですが、多少なりとも理解できると、便利そうだなーと思えてきました。
AWSのアクセスキーの切り換え


AWSのアクセスキー、シークレットトークンはAWS証明書ファイル(~/.aws/credentials)に保存されている。
複数扱いたくなった場合は、プロファイルという形で複数登録ができる。
ひとつしか登録していない場合は`default`というプロファイル
プロファイルの切り換えはawsコマンドの`--profile`オプションや環境変数AWS_DEFAULT_PROFILEできりかえをすることができる。ただし、環境変数名はライブラリの実装しだい…。

* [aws-sdk-java は AWS_PROFILEだった](https://github.com/aws/aws-sdk-java/blob/cf21041bc0129512cd30431fc4a960f9e73e6cbc/aws-java-sdk-core/src/main/java/com/amazonaws/auth/profile/ProfilesConfigFile.java#L65)

# もっと詳しく

awsコマンドで`~/.aws/credentials`などの生成ができる。

## インストール

```
$ brew install awscli
```

## 設定

configureコマンドを利用する。
AWS_ACCESS_KEYやAWS_SECRET_ACCESS_KEYやREGIONを入力することになる。

```
$ aws configure
```


別のプロファイルの設定をする

``
$ aws configure --profile hogehoge
```

## 利用例

```
$ aws s3 ls --profile hogehoge
$ AWS_DEAFULT_PROFILE=hogehoge aws s3 ls
```

## 設定の優先順位の話

.aws/credentials に設定しているが、優先順位があって 

1. コマンドの引数
2. 環境変数
3. ~/.aws/credentials
4. ~/.aws/config
5. EC2インスタンスを使用している場合はインスタンスのロールなどから

参考 http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
TreasureDataでHiveクエリを書くとき - TD_SCHEDULED_TIMEを利用しよう

# はじめに
Treasure DataはHiveの関数以外に独自関数を。。。（略

[ドキュメント：Supported Hive UDFs](http://docs.treasuredata.com/articles/udfs)

ドキュメントを見れば、ここから下は不要だ。

# TD_SCHEDULED_TIME
これはクエリ実行時の現在時刻のunixtimeを返す関数です。スケジュールクエリ実行時に使います。

ちなみにHiveには[unix_timestamp()](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions)という実行時のunixtimeを返してくれる関数があります。
だがしかし、unix_timestamp()は**本当の現在時刻**を返してしまいます！！

スケジュールしているのが09:00:00だったとしても、実際にクエリが流れるのは09:00:30だったりしますよね。同じ時間にたくさんのスケジュールクエリを設定していたり、重いJOBを実行していたりすると時間ずれます。また、スケジュールクエリにはDelayオプションという実際の実行開始時間をずらすオプションもあります。

そんなわけで、TD_SCHEDULED_TIME()はスケジュールされた正確な時間を返します。もし、スケジュールされていないクエリを実行した場合は実際の時間を返します。もちろんDelayオプションで開始時間をずらしてもスケジュールされている時間です。

# まとめ
昨日との差分を計算したい。とかいうときは毎日同じ時間を条件に指定したいですよね。
そんなときはTD_SCHEDULED_TIME()を使いましょう！
Knockout.jsはじめの一歩【jQueryのDOM操作を部分的にKnockout.jsに置き換える】


Knockout.jsがすこぶる便利だったので、ご紹介したいと思います。

##jQueryの場合
こんなHTMLがあります。

```html:
<div>
  <div id="name">東京太郎</div>
  <div id="tel">03-3333-4444</div>
  <div id="address">東京都千代田区1-1-1</div>
</div>
```

jQueryを使ってAjax通信で取得したデータを使って書き換えます。

```javascript:
  $(document).ready(function(){
  	$.getJSON("http://xxxx/yyyy",function(json){
  		$("#name").text("").text(json.name);
  		$("#tel").text("").text(json.tel);
  		$("#address").text("").text(json.address);
  	});
  });
```

問題点はidやclassを指定しなければいけないところ。
デザイナーさんに渡した際に、idに連番を付けられたり別のものに変更されたりすると、いっぺんに動かなくなります。

##一部をKnockout.jsに書き換える。

HTMLはこんな感じに変更

```html:
<!--追加でknockout.jsをCDNから読み込み-->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script>

<div>
  <div data-bind="text: name">東京太郎</div>
  <div data-bind="text: tel">03-3333-4444</div>
  <div data-bind="text: address">東京都千代田区1-1-1</div>
</div>
```

data-bindという独自の属性を使うことによって、IDやclassから切り離すことができます。

knockout.jsではdata-bindとJavascriptを繋ぐviewModelというものを書きます。
そして、そのviewModel内のオブジェクトに変更をかけることで、DOM操作を実現することができます。


```javascript
$(document).ready(function(){

    // この部分がHTMLとJavascriptを繋ぐviewModelという部分。
	var viewModel = {
        name: ko.observable(),
        tel: ko.observable(),
        address: ko.observable()
    };
 
 	// おまじない
	ko.applyBindings(viewModel);  
	
	// jQueryを使って取得したデータを代入する部分が下記
	$.getJSON("http://xxxx/yyyy",function(json){
        viewModel.name(json.name);
        viewModel.tel(json.tel);
        viewModel.address(json.address);
    });
});      
```

DOMが読み込まれたあとに動くように記述します。
これで、DOM操作をidやclassと切り離すことができました。
Pythonでbottleを使うときに流用できるスクリプト

Pythonでbottleを使うときやはり色々最初から書くのは面倒臭い。
ということですぐに使えるように必要最低限中身を書いてそこから書くことにしている。

```main_app.py

#!/user/bin/env python
# -*- coding: utf-8 -*-
from bottle import route, run, template, request, static_file, url, get, post, response, error
import sys, codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)

@route("/")
def html_index():
	return template("index")

@route("/static/<filepath:path>", name="static_file")
def static(filepath):	
	return static_file(filepath, root="./static")


@get("/login")
def login():
    return """
        <form action="/login" method="post">
            Username: <input name="username" type="text" />
            Password: <input name="password" type="password" />
            <input value="Login" type="submit" />
        </form>
    """
@route("/login", method="POST")
def do_login():
    username = request.forms.get("username")
    password = request.forms.get("password")
    if check_login(username, password):
        response.set_cookie("account", username, secret="some-secret-key")
        return template("index", name=username)
    else:
        return "<p>Failed !</p>"
def check_login(username, password):
  if username == "admin" and password=="password":
    return True
  else:
    return False


@error(404)
def error404(error):
	return template("404")

run(host="localhost", port=8000, debug=True, reloader=True)
```

こんな感じでログイン機能自体も最初から書いておく。
エラーでの404だけは最初から書いて、500エラーとかは使うときに応じて追記。

```
myapp - bottle.py
		main_app.py
		
		/static
			- /css
			- /img
			- /js
		
		/views 
			- index.html
			- 404.html
```

こういう感じでディレクトリ作ればいいと思う。
ちなみにviewsのテンプレートファイルは拡張子が.tplである必要はない。
Webサイトにうまく繋がらなかったら Slack に投稿するメモ（PHP）

Webサイトにうまく繋がらなかったら Slack に投稿するメモです。
簡易監視用として利用しようと思います。

# Slack の設定

Configure Integrations → Incoming WebHooks → 投稿したいチャンネルを選んでAdd する。
すると Webhook URL というのが手に入るのでこれをメモしておく。

# Webサイトにうまく繋がらなかったら投稿する

```servercheck_slack.php
mb_language("ja");
mb_internal_encoding("UTF-8");

$URL = "http://example.com/";
$result = "";

//webアクセスチェック
if ($res = file_get_contents($URL)) {
    $result .= "";
} else {
    $result .= "<{$URL}|{$URL}> にアクセスできません\n";
}

//Slack投稿
if ($result != "") {
	$incomingUrl = 'https://hooks.slack.com/xxxxx'; // 発行されたWebhook URL
	$payload = array(
	    "text" => $result, // メッセージ（必須）
	    "username" => "web_bot", // 投稿者（サービス）名
	    "icon_emoji" => ":ghost:", // 投稿者名のアイコン http://www.emoji-cheat-sheet.com/
	    "channel" => "#xxxxx", // Channel（#または@から始まるchannel名）
	);
	$slacksubmit = slackIncomingWebhook($incomingUrl, $payload);
	var_dump($slacksubmit);
}

//Slack投稿用関数
function slackIncomingWebhook($url, $payload) {
    $headers = array();
    $params = array('payload' => json_encode($payload));

    $result = postRequest($url, $params, $headers);
    return $result;
}
//Slack投稿用関数
function postRequest($url, $params, $headers = array()) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
//    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 環境によってSSLで問題が起きる場合はコメントを解除してください。
    $result = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);
    if ($error) {
        throw new \Exception($error);
    }
    return $result;
}
```

# CRON を設定

10分おきくらいで設定する。

# 参考にしたページ

ありがとうございました。
http://www.bunnyhop.jp/lab-20141020/
http://blog.asial.co.jp/486
Groovyで*.tar.gzファイルを展開する方法

[Apache Commons Compress](https://commons.apache.org/proper/commons-compress/)を使用して展開してみる。
とりあえず以下のようなコードでできた。(Windows 7で確認した)

```groovy
#!/bin/env groovy

@Grab('org.apache.commons:commons-compress:1.+')
import org.apache.commons.compress.compressors.gzip.*
import org.apache.commons.compress.archivers.tar.*
import org.apache.commons.compress.utils.*


new BufferedInputStream(new GzipCompressorInputStream(new FileInputStream('./archive1.tar.gz'))).with { gzipInputStream ->
	new TarArchiveInputStream(gzipInputStream, 64 * 1024).with { tarInputStream -> // TODO: バッファサイズは適当
		def tarEntry
		while ((tarEntry = tarInputStream.nextTarEntry) != null) {
			def entryFile = new File("./${tarEntry.name}")
			if (tarEntry.isDirectory()) {
				entryFile.mkdirs()
			}
			else {
				if (!entryFile.parentFile.exists()) {
					entryFile.parentFile.mkdirs()
				}
				entryFile.withOutputStream { outputStream ->
					IOUtils.copy(tarInputStream, outputStream, 64 * 1024) // TODO: バッファサイズは適当
				}
				entryFile.with {
					// TODO: 更新日時以外は反映していない
					lastModified = tarEntry.modTime.time
				}
			}
		}
	}
}
```

tarの展開については、展開後に更新日時だけ反映している。更新日時以外の権限などは反映していない。

実際には、これに加えて、FTPダウンロード、MD5ハッシュ値判定、AsperaConnectダウンロード、SFTPアップロードなども一緒にやっているが、ここでは割愛した。

-----
参考資料
http://groovyarekore.blogspot.jp/2010/09/groovyapache-commons-compresstar_11.html
http://groovyarekore.blogspot.jp/2010/09/groovyapache-commons-compressgzip_20.html
Windows8.1 に Vagrant + Centos6.6 + Ruby on Rails 

##1.仮想マシンの構成
###1.boxを追加

```bat
vagrant box add centos66 https://github.com/tommy-muehle/vagrant-box-centos-6.6/releases/download/1.0.0/centos-6.6-x86_64.box
```
###2.仮想マシンを作成 

Vagrantfileの作成

```bat
vagrant init centos66
```

Vagrantfileの編集

```rb
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 3000, host: 4000
config.vm.network "private_network", ip: "192.168.33.10", auto_config: false
```
仮想マシンの起動

```bat
vagrant up
```

起動後はsshで接続可能
server : 127.0.0.1
user : vagrant
password : vagrant
※windowsなのでsshで接続するツールを用意する


###3.仮想マシンのスナップショットを作成
vagrant-vbox-snapshotをインストール

```bat
vagrant plugin install vagrant-vbox-snapshot
```
snapshotを作成する

```bat
vagrant snapshot take init
```
<hr>
###4.Gitのインストール
古いGitを削除して
ソースからインストール

```shell-session
# yum remove git
# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
# cd /usr/local/
# wget https://www.kernel.org/pub/software/scm/git/git-2.4.0.tar.gz 
# tar -zxvf git-2.4.0.tar.gz
# cd git-2.4.0
# ./configure --prefix=/usr/local
# make prefix=/usr/local all
# make prefix=/usr/local install
# git --version
```

###5.Postgresqlの設定
Postgresqlのインストール

```shell-session
# yum remove postgresql postgresql-devel postgresql-libs postgresql-server
# rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm
# yum install -y postgresql94-server postgresql-devel
# service postgresql-9.4 initdb
# service postgresql-9.4 start
# chkconfig postgresql-9.4 on
# su - postgres -c "
    psql -c \"UPDATE pg_database SET datistemplate=false WHERE datname='template1'\"
    psql -c \"DROP DATABASE template1\"
    psql -c \"CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UTF8'\"
    psql -c \"UPDATE pg_database SET datistemplate=true WHERE datname='template1'\"
    createuser -d -S -R vagrant
    "
```

###6.Rubyのインストール
まずはRubyのアンインストール

```shell-session
$ sudo yum -y remove ruby
```
 rbenvインストール(全てのユーザ対象)

```shell-session
# git clone git://github.com/sstephenson/rbenv.git /usr/local/rbenv
# echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile
# echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> /etc/profile
# echo 'eval "$(rbenv init -)"' >> /etc/profile
```
ruby-buildプラグインをインストール

```shell-session
# mkdir /usr/local/rbenv/plugins
# git clone git://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins
# cd /usr/local/rbenv/plugins
# ./install.sh
```
Host OSからreboot

```bat
vagrant reload
```

Rubyのインストール

```shell-session
# rbenv install -l
# rbenv install 2.2.2
# rbenv global 2.2.2
```

###7.Railsのインストール

```shell-session
# yum -y install libxml2 libxslt libxml2-devel libxslt-devel
# yum install sqlite-devel
# gem update
# gem install nokogiri -- --use-system-libraries
# gem install rails -v 4.2.1 --no-ri --no-rdoc
# ruby -v
```
PHPでDBからデータを取得するメソッド

**PHPでDBからデータを取得するメソッド一覧**

色んな取得方法があって分からなくなるのでメモ。

# fetchRow

　　戻り値 → １行の連想配列
　　結果が無かった場合の戻り値 → FALSE

# fetchOne

　　戻り値 → １列目１行目の値　（※配列ではない）
　　結果が無かった場合の戻り値 → FALSE

# fetchAll

　　戻り値 → ２次元連想配列
　　結果が無かった場合の戻り値 → 空配列

# fetchCol

　　戻り値 → １列目の全行（key は連番）
　　結果が無かった場合の戻り値 → 空配列

# fetchPairs

　　戻り値 → １列目の値が key で２列目の値が value の２次元配列
　　結果が無かった場合の戻り値 → 空配列

# fetchAssoc
　戻り値　→　最初の列名を添え字とした連想配列
　結果が無かった場合の戻り値 → 空配列
絶対UIスレッドで動作させたい処理の実装方法

メモ

```java:post.java
// Handlerにpost()させて呼び出す
// Handler自体はUIスレッド上でインスタンス生成すること
mHandler = new Handler();

// もしくはLooperでメインスレッドを指定して生成
mHandler = new Handler(Looper.getMainLooper());

mHandler.post(new Runnable() {
        @Override
        public void run() {
            // ここに処理
        }
    });
```

```java:post.java
// 「このViewのためにやるんだ！」っていうのであれば
// 指定のViewにpostするやり方の方が見た目わかりやすいのかもしれない
// （いいのかどうかは不明）
mTextView.post(new Runnable() {
        @Override
        public void run() {
            // ここに処理
        }
    });
```

``` java:post.java
// ActivityのrunOnUiThread()を利用する場合
mActivity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // ここに処理
        }
    });
```

現場からは以上です
(Mac版)BluemixのNode.jsアプリをローカル環境で実行する

ローカル環境でBluemixのNode.jsアプリを実行する方法は下記に記載されています。が、Macの場合ちょっとだけ手順が異なるので補足。

[BluemixにデプロイしたNode.jsアプリが起動しない！そんなときは、ローカル環境で確認しましょう](http://qiita.com/asmanabu/items/1aaf6ebb1023ddc25e9d)

上記にもありますが、BluemixのNode.jsはVCAP_SERVICESという環境変数を使っているので「OSの環境変数にVCAP_SERVICESを定義する」必要があります。

ので、 Bluemixアプリの[概要]-[環境変数]をまず確認して、コピーします(ここは上記記事と一緒です)。

![vcap_service.png](https://qiita-image-store.s3.amazonaws.com/0/76526/0ee8101f-597e-7bef-095e-480a5603c88d.png)

そして、Macの場合、ターミナルから下記のように実行してVCAP_SERVICEを定義します。
`export VCAP_SERVICES='{"cloudantNoSQLDB": [
{
         "name": "Cloudant NoSQL DB-i1",
         "label": "cloudantNoSQLDB",
         "plan": "Shared",
         "credentials": {
            "username": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx-bluemix",
            "password": "xxxxxxxxxxxxxxxxxx",
            "host": "xxxxx-xxxxx-xxx-xxx-xxxxxxxx-bluemix.cloudant.com",
            "port": 443,
            "url": "https://xxxxxxxxxxxxxxx-bluemix.cloudant.com"
         }
      }
   ]
}'`

export VCAP_SERVICES= の後に、環境変数をシングルクォーテーション(**'**)で囲っています。その後、'node app.js' で実行できます。

単に、ターミナルのコマンドの書き方の話といえばそれまでなのですが、ちょっとハマってしまったのでメモしてみました。
Groovyのちょっとしたこと「gebでhtmlUnitのオプションを設定する方法」

driverにクロージャを設定する。
そうすると、GebはBrowser.drive(closure)の際にこのクロージャによって初期化されたDriverを使用する。

以下の設定では、htmlUnitはJavaScriptを実行し、ScriptErrorの際にExceptionを投げない、セキュアでないSSL通信を許可する。
設定可能な項目は、[WebClientOptions](http://htmlunit.sourceforge.net/apidocs/com/gargoylesoftware/htmlunit/WebClientOptions.html)を参照してね。

```groovy:GebConfig.groovy
import geb.driver.DriverRegistry
import geb.driver.NameBasedDriverFactory

driver = (Settings.gebDriver)?Settings.gebDriver:'firefox'

if(driver=='htmlunit'){
  driver = {
    def htmlunitDriver = new NameBasedDriverFactory(classLoader,'htmlunit').getDriver()
    htmlunitDriver.webClient.options.setJavaScriptEnabled(true)
    htmlunitDriver.webClient.options.setThrowExceptionOnScriptError(false)
    htmlunitDriver.webClient.options.setUseInsecureSSL(true)
    htmlunitDriver
  }
}
```
Groovyで半角空白を含むコマンドを実行する方法

コマンドと引数を`String`の`List`で用意して`execute`を呼び出すとOSに依存しないシェル実行が可能になる。
`String`と同様に`List`に対しても`execute`系の機能が用意されている。
とは言っても、コマンド自体のパスについてはOS切り分けが必要になる場合が多い。(フルパスの場合は間違いなく切り分けが必要)

```groovy
['C:/Program Files/Application 1/Program 1.exe', '-a', 'a 1'].execute()
```

ちなみに`String`で、半角空白を含む部分を`"`などで自力で括ると、Windowsでは動くがMacOS Xでは動かないなどの事象が発生する。

-----
[GDK: java.util.List](http://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/List.html)
jQueryで要素を点滅させる

調べてみて下記の書き方が多かった。（ギャグではない）

~~~javascript
setInterval(function() {
    $('#flash').fadeOut(500, function() {
      $(this).fadeIn(500);
    });
}, 1000);
~~~


しかし、下記でも動く...

~~~javascript
setInterval(function() {
    $('#flash').fadeOut(500).fadeIn(500);
}, 1000);
~~~

jQueryのメソッドチェーンは、先に書いた処理が終わってから、後の処理を行う...はず...
（fadeOutの実行が終わってからfadeInするはず）

見やすいのでこの方法で書きたい（希望）
Macのセットアップログ


そういえばこないだ久し振りにMacを再セットアップしたので備忘録として残しておく。

## 前提

まず前提として普段の仕事はVirtualBox上のDebian上で行なっているので、Macに開発環境はほとんどインストールしていない。
ので基本的にMacに入れるのはユーティリィテ的なアプリがメイン。

## Macの再インストール

今はYosemiteを使っている。

上記のような前提があるのでMacの再セットアップ時はクリーンインストールが基本。

[ここ](https://support.apple.com/kb/PH18869?locale=en_US&viewlocale=ja_JP)にある方法でMacを初期化後インスールを行なうことになる。

1. Macを再起動して起動時(Appleマークが出てるとき)に Command+R を押し続けておく。
2. ディスクユーティリティでディスクを消去。
3. ディスクユーティリティを終了。
4. 「OS Xを再インストール」でインストール開始。

## アプリのインストール

で、Macにインストールするアプリ類は以下のようなもの。

### Xcode

普段OSXやiOS向けの開発は行なわないとはいえ、もろもろ必要になるのでインストール。
ついでにcommand line toolsを入れるけど、以前はPreferencesのDownloadsにあった項目が無くなっているので以下を実行する。

```
xcode-select --install
```

### brew

http://brew.sh/index_ja.html

Mac上のパッケージマネージャ。
基本のキですね。

### Emacs

http://www.gnu.org/software/emacs/

エディタ。

最近はbrewでちゃんと最新パッケージが提供されているので、Mac上に入れる場合は、brewで入れるのが一番管理しやすそう。
`brew linkapps emacs`で`/Applications`ディレクトリにアプリを用意してくれるんだけど、これがリンクになっていてLaunchBarで拾ってくれないので、`/usr/local/Cellar/emacs/24.5/Emacs.app`を`/Applications`に手動でコピーしている。(ちなみに`cp`コマンドを使うとアイコンが引き継がれなかった)

### VirtualBox

https://www.virtualbox.org/

開発をVirtualBox上でやっているので必須アプリ。

### AquqSKK

http://aquaskk.osdn.jp/

SKK入れないともはや日本語が打てないレベルなので必須アプリ。
ただ、公式のものはYosemiteには正式に対応していないので、

http://mzp.hatenablog.com/entry/2014/08/10/110223

で配布してくださっているバイナリを利用させてもらっている。

### Chrome

https://www.google.co.jp/chrome/

普段使いのChrome。

アカウントの切り替えはGoogle自体がサポートしていたりもするけど、個人的にはChromeのアカウント切り替えでプライベートと仕事用のアカウントを切り替えて使ってる。

### Chrome Canary

https://www.google.co.jp/chrome/browser/canary.html

Chormeの開発版。

### Dropbox

https://www.dropbox.com/ja/

いわずとしれた。

ちなみに、Automatorを使ってDropboxを複数起動できるようにしている。

### Google Drive

https://www.google.com/intl/ja_jp/drive/

こちらも同期用。

### Slack

https://slack.com/

社内の情報共有ややり取りはSlackでやってるので入れる。

### Skype

http://www.skype.com/ja/

MSに買収されたりでもうあんまり使いたくないけど、まだまだ必要なのでこれも仕方無く入れる。

### LaunchBar

https://www.obdev.at/products/launchbar/index.html

YosemiteではSpotlightもパワーアップしているので十分な感じもしなくはないけど、慣れ親しんだLaunchBarを手放せない。

### Airmail Beta

http://airmailapp.com/
https://rink.hockeyapp.net/apps/84be85c3331ee1d222fd7f0b59e41b04#_=_

メーラ。
普段使いがGoogle Appsなら使わない手はないと思う。
今のところBetaだと無料。
だけど、Betaなのでたまに壊れるw
心配な人はStable版を普通に買った方がいいかも。

### Atom

https://atom.io/

github謹製のエディタ。
Emacsがあるからいらないといえばいらないけど、一応レベル。

### Kobito

http://kobito.qiita.com/

この再セットアップを機にQiitaに記事を書いていきたいなーと思ったので、Kobitoを入れてみた。

### Keynote

https://www.apple.com/jp/mac/keynote/

プレゼン。

### Microsoft Office 2011

入れたくないけど仕事で必要なので…

( なんでOfficeのインストールでChromeやSafariを終了しないといけないのか… )

-----

アプリとしてはこんなものかな。
画像や映像系のアプリはほとんどいれていない。
あと、SNS系のアプリもMacにはほとんど入れない。(ブラウザで十分)

それにしても偏ってる感がすごいあるなぁ。
さくらのレンタルサーバーでCRONを追加する

さくらのレンタルサーバーでは、サーバーコントロールパネルからのCRONの設定は5個まで・・・という謎の制限がつらいのでそこではないところから追加するとき用のメモです。

# ターミナルを立ち上げてサーバーに接続する

`ssh username@username.sakura.ne.jp`

と入れると、パスワードを聞いてくるのでパスワードを入れる。

`crontab -e`

と入れると、vi というモノが立ち上がるので、
esc を押して編集モードにし、挿入する行に移動して、
i を押して編集準備をし、CRONの設定を書く。

例えば、5分ごとにあるphpファイルを動かしたい場合は、下記のようにする。
（事前にコピーしておいて貼り付けるだけにしておいたほうがラク）

`*/5 * * * * cd /home/username/path ; /usr/local/bin/php filename.php`

esc を押してコマンドモードにし、
`:q!` と入れると、保存せずに vi を終了
`:wq` と入れると、保存して vi を終了

`crontab: installing new crontab` という表示が出ていたら設定完了。

`crontab -l`　と入れて問題なく追加されてるようであれば、
Ctrl ＋ D とか C とかで ターミナル終了。


# さくらのサーバーコントロールパネルで見てみる

さくらのサーバーコントロールパネルに戻ると、6つめができてる。
よかったよかった。
【メモ】Rで3次自然スプライン(cubic natural spline) #rstatsj

```r:R
library(splines)
vars <- ns(cars$speed, 2)
data <- data.frame(cbind(cars, vars))

model <- lm(dist ~ X1 + X2, data)
summary(model)

library(ggplot2)
g <- ggplot(cars, aes(x=speed, y=dist)) + geom_point()
g + geom_smooth(method="lm", formula= y ~ ns(x, 2))
```

![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/2570/a76d9404-0375-c3b6-7155-cc54fe5b7670.png)
MySQL Workbench 6.2系を使っていてSQLの応答が無くなった

MySQL Workbenchを使うなら、現在最新の6.2系ではなく、5.2.47をオススメ。
6.2系はバグがあり、DBへの接続方式にStandard TCP/IP over SSHを選ぶと、selectの結果が100件以上とかになるとフリーズする。

Bug #73343　Workbench Freezes on Remote SSH Server Query
http://bugs.mysql.com/bug.php?id=73343

報告では1000件以下のselectを実行すると再現できるような事がかいてありましたが、私の環境では100件、場合によっては数十件で応答がなくなりました。

DBに踏台サーバー経由で接続したいとかの場合は該当しそうなので、メモ程度に。
mediumっぽいlightboxのなめらかなtransitionを書いた時のメモ

mediumの画像を拡大するときのインタラクション([例えばこの記事](https://medium.com/@vonwong/an-exclusive-look-inside-malaysia-s-newest-royal-palace-aaf5f884dad1))はクールですよね。Material Designでも視線を意識したインタラクションは重視されていたり、より手触りの良いWebの時代の為にこのへんの知見は貯めておきたいところです。

![2015-06-03 13_16_34.gif](https://qiita-image-store.s3.amazonaws.com/0/29793/efc49fa4-99b2-d893-7959-bd2e9d32f95c.gif)

自分の整理の整理の為にも、シンプルかなと思う方法だけメモしておきます。

#### 1. 拡大前要素の絶対位置を大きさを図る

```javascript
var originalPos = $("#hoge").get(0).getBoundingClientRect();
```

`getBoundingClientRect()`で絶対位置、大きさがわかります。返り値はこんな感じです。

```javascript
{ bottom: 22514.515625, height: 24244.515625, left: 0, right: 1141, top: -1730, width: 1141 }
```

jQueryのoffset()の中では`getBoundingClientRect()`を使ってるという噂を聞いたので、このへんは色々やり方があると思います。

#### 2. 拡大前要素の位置に複製したdivを重ねる

複製したdivを重ねます。width, heightを変更する可能性があるならdivのが後々楽だと思います。

```javascript
copy = $("<div/>").css({
  height: original.height(),
  width: original.width(),
  position: 'absolute',
  top: originalPos.top,
  left: originalPost.left,
  'transform-origin': 'center center'
  'transition-property': 'transform'
  'transition-duration': '0.25s'
  'transform': "translate(0,0) scale(1)"
});
$("body").append(copy);
```

transformで操作するので、transition指定して、やる気マンマンでスタンバっときます。

#### 3. 拡大後の状態に`transform`を使って変形させる

```js
scale = ...; //いい感じの大きさを計算
offsetX = ...; // いい感じの位置を計算
offsetY = ...; // いい感じの位置を計算

copy.css({'transform': "translate(" + parseInt(offsetX*10)/10 + "px," + parseInt(offsetY*10)/10 + "px) scale(" + scale + ")"});
```

#### 4. 戻す時はtransformを初期値に

```js
copy.css({'transform': "translate(0,0) scale(1)"}).one('webkitTransitionEnd MSTransitionEnd oTransitionEnd transitionend', function(){
  copy.remove()
});
```

transformを元に戻せば元の位置に戻ります。animationが終わったり、不要になったタイミングで要らないものは削除しときましょう。

以上です。
合わせて、overlayを敷くとかwidthとheightを変えるとか臨機応変に書けばいいと思います！
CSVデータの読み取りをなるべく楽にする

CSVでデータを扱うと次のように辛くなってくることがあります。

* 列のデータが何を現わすのかわからなくなる
* あげく、一行目にコメントを入れたりするようになってくる
* そのコメントもシステム側の意味とはずれてくる
* フィールドのアクセス順序に神経を使う
* 値がすべて文字列なので読み込んだ後の変換が面倒

そこで、次のようにオプションをつけまくると、rubyレベルで定義したような内容になってくれるので、かなり辛さを軽減できます。

```ruby
require "csv"

str = "
key,name,strength,publiced_at
bamboo_pole,竹ざお,2,2000-01-01
cudgel,こんぼう,4,2000-01-02
copper_sword,銅の剣,10.0,2000-01-03 15:00:00
"

CSV.parse(str, headers: :first_row, header_converters: :symbol, skip_blanks: true, converters: [:date_time, :date, :numeric]) do |line|
  p line.to_h
end
# >> {:key=>"bamboo_pole",  :name=>"竹ざお",   :strength=>2,    :publiced_at=>#<Date: 2000-01-01 ((2451545j,0s,0n),+0s,2299161j)>}
# >> {:key=>"cudgel",       :name=>"こんぼう", :strength=>4,    :publiced_at=>#<Date: 2000-01-02 ((2451546j,0s,0n),+0s,2299161j)>}
# >> {:key=>"copper_sword", :name=>"銅の剣",   :strength=>10.0, :publiced_at=>#<DateTime: 2000-01-03T15:00:00+00:00 ((2451547j,54000s,0n),+0s,2299161j)>}
```

"true" は true としたいときなどは、次のように new でいったんインスタンスを取得して convert メソッドで、変換する方法を定義すれば良いようです。

```rb
str = "
key,name,strength,public_flag,publiced_at
bamboo_pole,竹ざお,2,true,2000-01-01
cudgel,こんぼう,4,false,2000-01-02
copper_sword,銅の剣,10.0,true,2000-01-03 15:00:00
"
obj = CSV.new(str, headers: :first_row, header_converters: :symbol, skip_blanks: true, converters: [:date_time, :date, :numeric])
obj.convert { |value, info|
  case info.header
  when /_flag\z/
    value == "true"
  else
    value
  end
}
obj.each do |line|
  p line.to_h
end
# >> {:key=>"bamboo_pole", :name=>"竹ざお", :strength=>2, :public_flag=>true, :publiced_at=>#<Date: 2000-01-01 ((2451545j,0s,0n),+0s,2299161j)>}
# >> {:key=>"cudgel", :name=>"こんぼう", :strength=>4, :public_flag=>false, :publiced_at=>#<Date: 2000-01-02 ((2451546j,0s,0n),+0s,2299161j)>}
# >> {:key=>"copper_sword", :name=>"銅の剣", :strength=>10.0, :public_flag=>true, :publiced_at=>#<DateTime: 2000-01-03T15:00:00+00:00 ((2451547j,54000s,0n),+0s,2299161j)>}
```
How to eschew Deface error with Spree.

Spree の日本語ドキュメントってホント少ないですよね…。
と嘆いていても仕方ないので、google グループに投稿してみました。

https://groups.google.com/forum/#!msg/spree-user/m7eZ6tfrWDw/rB3NrYyIWJgJ

内容は

```
Deface: [ERROR] The original source for 'auth_shared_login_bar' has changed, this override should be reviewed to ensure it's still valid.
```

とゆーエラーが出てキモチ悪いんですけど。といったものですが、誰も答えてくれないorz
やっぱ英語がアレですから…。センター試験偏差値40切るくらいの勢いっすから…。TOEIC？なにそれおいしいの？

でまあ、自己解決しました。

コレを置けばオッケーです。

```app/overrides/auth_login_bar.rb
Deface::Override.new(virtual_path: "spree/shared/_nav_bar",
                     name: "auth_shared_login_bar",
                     insert_before: "li#search-bar",
                     partial: "spree/shared/login_bar",
                     disabled: false,
                     original: 'c00d67dfc0496d21a351b48c41a728412cb5ed2c')
```

もし僕の英語のドコが悪かったのか教えようという奇特な方がいらっしゃいましたら、ご教示頂けますようお願い申し上げますm(__)m
Linus: inline化は速くなるとは限らないんだぜ

http://www.realworldtech.com/forum/?threadid=150494&curpostid=150592

モダンなコンパイラは、バイナリサイズとか関数のサイズがでかく成りすぎない様に上手くインライン化してくれる。
それでも、コンパイラは何もかもを知っているわけでは無いので、時々誤った判断をする。

例えば、非常に頻繁に呼ばれるある関数fがある。
つまり、この関数fのほんの少しのコストの増大も、全体としては大きなコストになる。
しかし、コンパイラはそんな事は知らない。

fの中の非常に稀に呼ばれるコードパスの中に大きなスタックフレーム(といっても256byteとかそんくらい)を生成する関数gがある。
また、関数gはこのコードパスでしか呼ばれない。
gは稀にしか呼ばれないので、インライン化しても大してメリットは無いが、コンパイラはgが稀にしか呼ばれないなど分からない。
そのため、コンパイラはgの呼び出しはインライン化してしまう事がある。

Linuxのカーネル内では、この様な誤った最適化を防ぐために、noinlineキーワードを多用しているらしい。

また、最近のコンパイラは、スタックフレームの一部の生成を必要になるまで遅延させるコードを吐けるらしい。
Bashの組み込みシェル変数の確認方法について


シェルスクリプトを書いていて、予約語っぽい動きをするときは組み込みシェル変数の可能性があります。
`set`コマンドを打てばシェル変数を確認することができます。

```console
$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
...
```

シェルスクリプトよく分かっておらず、`printenv`とかで環境変数とか確認してもそんな変数ないな〜と思ってハマってしまいました。
Laravel5でLeague/CSVを使ってCSV作成＆ディスクに保存をサクッと実装する



League/CSVをダウンロードします。

```
composer require league/csv
```


そうすると、composer.jsonにこんなのが追記されます。

```
"league/csv": "^7.1"
```


あとは、該当のコントローラーで下記のように記載すればOK

```php:
// Writerのinclude
use League\Csv\Writer;

// 空のCSVオブジェクトを作成
$csv = Writer::createFromFileObject(new \SplTempFileObject());

// レコード追加
$csv->insertOne(array('id','name')); // これがheader行
$csv->insertOne(array('1','hoge'));
$csv->insertOne(array('2','hogemi'));

// CSVで保存（時間でファイルを作っています）
Storage::disk('local')->put(time().'.csv',$csv->__toString());

```

その他の関数等はこちらをご覧ください。
http://csv.thephpleague.com/
Ruby On RailsでMySQLのSocketエラーが出た時は素直にlocalhostを127.0.0.1に直すのが一番いいと思う

Ruby On RailsでMySQLを使っている時に、

`"can't connect to mysql database using /tmp/mysql.socket"`

といったエラーが出ることがあります。

これは、MySQL側で使っているsocketと、RubyのMySQLコネクタが使っているsocketが異なっているために発生する現象で、解決策は巷によく載っています。

だいたい書いてあるのは、

1) my.cnfのsocket設定２箇所をいじってMySQL側をRubyに合わせる
2) lib/ruby-mysql***のソースをいじって、Ruby側をMySQLに合わせる

の２つで、直接の原因であるsocket不一致を解消する方法として異存はないですが、

1)は、ほかのアプリ（例えばphpとか）やコマンドに影響でそうでこわい、
2)は、（個人の好みですが）なるべくgemとかで入ってるライブラリを手でさわりたくない

ってことで抵抗があります。

で、上記以外の方法として

3) database.ymlのhostのlocalhostを、127.0.0.1に変更する

というのがあります。

http://q.hatena.ne.jp/1273032729

これは、MySQLへの接続を、localhostでなくて、127.0.0.1として接続する方法ですが、
こうすると、通常エラーは解消されます。

なんでだろー、localhostも127.0.0.1も同じじゃねー？って思いますが、以下が参考になります。
http://qiita.com/TanukiTam/items/f6a08740d0fcda0db7be

MySQLは、localhost指定すると、問答無用でsocket接続を試みて、127.0.0.1だと通常のTCP/IP接続をするようです。

なので、3)は、そもそも元凶のsocket通信自体回避する方法です。

直すのあっという間だし、影響も自分のアプリだけなので、3)がいい気がしますが、ググってたどり着く回答は1)、2)が多くて、3)はちょっと控えめって感じです。

Railsに詳しくないので、hostの部分をlocalhostにしておいたほうがよい理由があるのかなー。
（MySQL、Railsに詳しい人の知見求む）
CurlでObjectStorageにファイルをアップロードする方法

#コマンドラインからファイルをアップロードしたい！
ちょっとしたファイルをObjectStorageにアップロードするには、ポータルからアップロードする方法があります。が、、ある程度大きい（２０メガ？）ぐらいのファイルになるとポータルを使ってファイルをアップロードできません。

そんな時にObjectStorageに手軽にファイルをアップロードする方法です。だたし、５Gを超えるファイルはこの方法では扱えませんのでご注意を！
環境はMacですが、Windowsでもcurlが使えればやり方は同じですので、試してみてください。
ObjectStorageからデータを取得する仕方はたくさん情報があったのですが、アップロードの方法がなかったので書いておきました。誰かの参考になれば幸いです。

#コマンドラインからの手順
コマンドラインからのファイルをアップロードする場合はざっくり以下の手順になります。めんどくさいですが、これをやらないと使えません！

1. 認証
2. URLを生成
3. ファイルをアップロード

#アップロード手順
##認証
まず、URL生成のためのtokenを取得します。
*${USER}*と*${API_KEY}*は自分のものを使用してください。
```
curl -v -s -f -I -H "X-Storage-User: $USER" -H "X-Storage-Pass: $API_KEY" -X GET https://tok02.objectstorage.softlayer.net/auth/v1.0/
```
いろんな値が返ってきますが、以下の値はこれから使用するのでメモしといてください。
***X-Storage-Url***
***X-Storage-Token***

##URLの生成
*${storage_url}*は***X-Storage-Url***の値に置き換えてください。*${CONTAINER}*はObjectStorageで作ったコンテナの名前です。*${filename}*はアップロードしたファイルの名前です。

```
url="${storage_url}/${CONTAINER}/${filename}"
```

これでURLが生成されるので、次のコマンドでファイルをアップロードしてください。
*${TMP_FILE}*はアップロードするファイルに、*${auth_token}*は***X-Storage-Token***に置き換えて実行してください。

##ファイルをアップロード
```
curl -i -T ${TMP_FILE} -s -X PUT -H "X-Auth-Token: ${auth_token}" $url
```

これだけでサクッとファイルをアップロードできます。

#シェルで処理したい人向け

めんどくさいからシェルでサクッと処理したい人向けに、下村くんが書いたシェルのコードも載せておきますので、ご参考までに

```lang:upload.sh
#!/bin/sh

USER='ユーザ名'
API_KEY='APIキー'
CONTAINER='コンテナ'
TMP_FILE='アップロードしたいファイル'

res=`curl -v -s -f -I -H "X-Storage-User: $USER" -H "X-Storage-Pass: $API_KEY" -X GET https://tok02.objectstorage.softlayer.net/auth/v1.0/`
token_flg=0
url_flg=0
for tmp in $res
do
    tmp=`echo $tmp | sed -e 's/[^a-zA-Z0-9:;,._/\\-]//g'`
    if [ $token_flg -eq 1 ]; then
        auth_token=$tmp
        token_flg=0
    fi

    if [ $url_flg -eq 1 ]; then
        storage_url=$tmp
        url_flg=0
    fi

    echo $tmp | grep -q 'X-Auth-Token\:'
    if [ $? -eq 0 ]; then
        token_flg=1
    fi

    echo $tmp | grep -q 'X-Storage-Url\:'
    if [ $? -eq 0 ]; then
        url_flg=1
    fi

done

filename=`basename ${TMP_FILE}`

url="${storage_url}/${CONTAINER}/${filename}"
curl -i -T ${TMP_FILE} -s -X PUT -H "X-Auth-Token: ${auth_token}" $url
```

#５G超えるファイルについて
この方法では５gを超えるファイルは扱えません。どうしても扱いたい場合はあきらめて、PBOXを使ってアップロードしてください（笑）
LumenのDB設定

## LumenのDB設定

### .envファイル

サンプルをコピーして作る。

~~~
cp .env.example .env
vi .env
~~~

~~~ .env:.env
DB_CONNECTION=mysql
DB_HOST=localhost
DB_DATABASE=scotchbox
DB_USERNAME=root
DB_PASSWORD=root
~~~

.envを読むように設定する。

~~~
vi bootstrap/app.php
~~~

~~~ php:bootstrap/app.php
Dotenv::load(__DIR__.'/../'); // 5行目アンコメント .envの読込
~~~

### ファサード設定

ファサードを使えるようにする。

~~~
vi bootstrap/app.php
~~~

~~~ php:bootstrap/app.php
$app->withFacades();// 22行目アンコメント ファサード有効
~~~

$app->withFacades()の中

~~~ php:vendor/laravel/lumen-framework/src/Application.php
class_alias('Illuminate\Support\Facades\App', 'App');
class_alias('Illuminate\Support\Facades\Auth', 'Auth');
class_alias('Illuminate\Support\Facades\Bus', 'Bus');
class_alias('Illuminate\Support\Facades\DB', 'DB');
class_alias('Illuminate\Support\Facades\Cache', 'Cache');
class_alias('Illuminate\Support\Facades\Cookie', 'Cookie');
class_alias('Illuminate\Support\Facades\Crypt', 'Crypt');
class_alias('Illuminate\Support\Facades\Event', 'Event');
class_alias('Illuminate\Support\Facades\Hash', 'Hash');
class_alias('Illuminate\Support\Facades\Log', 'Log');
class_alias('Illuminate\Support\Facades\Mail', 'Mail');
class_alias('Illuminate\Support\Facades\Queue', 'Queue');
class_alias('Illuminate\Support\Facades\Request', 'Request');
class_alias('Illuminate\Support\Facades\Schema', 'Schema');
class_alias('Illuminate\Support\Facades\Session', 'Session');
class_alias('Illuminate\Support\Facades\Storage', 'Storage');
class_alias('Illuminate\Support\Facades\Validator', 'Validator');
~~~


### DB使ってみるテスト

http://home.com/test-db にアクセス。

~~~ php:route.php
$app->get('/test-db', function() use ($app) {
   // テストテーブル作ってデータ入れる 
   if (!Schema::hasTable('test')) {
        Schema::create('test', function ($table) {
            $table->increments('id');
            $table->text('name');
        });
        DB::table('test')->insert(
            ['id' => 24, 'name' => 'yoshida']
        );
    }
    return DB::table('test')->get(); // [{"id":24,"name":"yoshida"}]
});
~~~