OmniAICreator/Qiita-1.07M huggingface dataset:
resize2fsで16TBの壁を突破する

## tl;dr

デバイス名は任意に置換して下さい。

```shell-session
## resize2fs >= 1.43
$ sudo e2fsck -f /dev/md1
$ sudo resize2fs -b /dev/md1
$ sudo e2fsck -f /dev/md1
$ sudo resize2fs /dev/md1
```

## story
raidで実用量20TB上に、気付かずに16TBのext4のパーティションを作成して、データを突っ込んでしまったのが事の始まり。

パーティション作成時に、ext4の64bitフラグを明示的に有効にしてやらないと、16TBより大きいパーティションが作れない。

ググってみたが、あとから64bitの壁を超えることはできない旨の内容が出てくる。

* [ext4 を 16TB より大きくする](http://ssig33.com/text/ext4%20%E3%82%92%2016TB%20%E3%82%88%E3%82%8A%E5%A4%A7%E3%81%8D%E3%81%8F%E3%81%99%E3%82%8B)

しかし、その検索結果の中にE2fsprogsのMLがあった。

* [Re: [PATCH 11/54] tune2fs: call out to resize2fs for 64bit conversion (Linux Ext4)](http://www.spinics.net/lists/linux-ext4/msg47019.html)

内容を読むと、`tune2fs`で、`tune2fs -O 64bit`をやろうとするユーザ向けの`resize2fs`を使う方法についての優しいメッセージを表示する機能を追加するものだった。＝ resize2fsを使えば、あとから64bitフラグを有効にできる！！

パッチの適用先などを追っていった所、まだリリースされてない物だったので、レポジトリから最新のソースを取得して冒険にでることになった。

## how to

```shell-session
## e2fsprogsのビルド&インストール
$ git clone git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
$ cd e2fsprogs
$ mkdir build
$ cd build
$ ../configure --prefix=/usr/local
$ make
$ make check
$ sudo make install

## 64bitフラグの有効化
$ sudo tune2fs -O 64bit /dev/md1
tune2fs 1.43-WIP (18-May-2015)

Please run e2fsck on the filesystem.

After running e2fsck, please run `resize2fs -b /dev/md127' to enable 64-bit mode.
$ sudo e2fsck /dev/md1
e2fsck 1.43-WIP (18-May-2015)
/dev/md1: clean, 94181/536870912 files, 3476142818/4294967295 blocks

$ resize2fs -b /dev/md1
resize2fs 1.43-WIP (18-May-2015)
Please run 'e2fsck -f /dev/md1' first.

$ e2fsck -f /dev/md1
e2fsck 1.43-WIP (18-May-2015)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/md1: 94181/536870912 files (15.4% non-contiguous), 3476142818/4294967295 blocks

$ resize2fs -b /dev/md1
resize2fs 1.43-WIP (18-May-2015)
Converting the filesystem to 64-bit.
The filesystem on /dev/md127 is now 4294967295 (4k) blocks long.

## パーティションの拡張
$ e2fsck -f /dev/md1
e2fsck 1.43-WIP (18-May-2015)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/md127: 94181/536870912 files (15.4% non-contiguous), 3476168421/4294967295 blocks

$ resize2fs /dev/md1
resize2fs 1.43-WIP (18-May-2015)
Resizing the filesystem on /dev/md127 to 4883606400 (4k) blocks.
The filesystem on /dev/md127 is now 4883606400 (4k) blocks long.
```

やったー
ブロックの束縛についての理解



# selfは、定義された場所のself

```ruby

class A
  def call_block(&block)
    block.call
  end
end


class B
  a = A.new
  
  a.call_block do
    p self
    p 'hoge'
  end

end

# 結果
#-> B
#-> 'hoge'

```

Aクラスの中ではなく、Bクラス

# もちろんBクラスのメソッドは使える。

```ruby

class B
  def self.b_method
    p 'Bメソッドです'
  end

  a = A.new
  a.call_block do
    p self
    self.b_method
  end
end



# 結果
#-> B
#-> 'Bメソッドです'

```


# Aメソッドはレシーバを明示しないと使えない。

```ruby

class A
  def call_block(&block)
    block.call
  end

  def a_method
    'Ａメソッドです'
  end
end


class B

  a = A.new
  a.call_block do
    a.a_method
  end
end

# -> 'Aメソッドです。'

```

# その場のローカル束縛を連れて行く

```ruby
class A
  def call_block(&block)
    block.call
  end
end


a = A.new
v = "hoge"
a.call_block do
  p v
end


# 結果
#-> 'hoge'
```

# 

# まとめ
***ブロックは、その場の束縛を連れて行く。***


# ブロックへの引数の渡し方
## yield

```ruby
class A
  def call_block
    yield('hoge')
  end
end

a = A.new
a.call_block{ |sentence| p sentence }
```

## &修飾
```ruby
class A
  def call_block(&block)
    block.call('hoge')
  end
end

a = A.new
a.call_block{ |sentence| p sentence }
```
【AWS】【API Gateway】SwaggerでREST APIを一元管理


AWS API Gateway上のAPIをSwaggerファイルから作成・更新してみます。

## 前提

- [AWS CLI](http://aws.amazon.com/cli/) 1.9.1以降
- [Maven](https://maven.apache.org)

## 準備

AWS Labsが提供する以下のツールを使います。

- [awslabs/aws-apigateway-importer](https://github.com/awslabs/aws-apigateway-importer)

1. リポジトリのclone

```
git clone https://github.com/awslabs/aws-apigateway-importer.git
cd aws-apigateway-importer
```

2. ビルド

```
mvn assembly:assembly
```

## 使い方

### APIの新規作成

SwaggerのスキーマファイルからAPI Gateway上でAPIを新規に作成します。

1. 実行

	```
	./aws-api-import.sh --create [Swaggerのスキーマファイル]
	```

	※ Windowsの場合は`./aws-api-import.cmd`を使います。

2. 実行結果

	**リソース**

	![resource.png](https://qiita-image-store.s3.amazonaws.com/0/15414/fda52880-dd02-1474-7315-90e0ceeceada.png "resource.png")

	**モデル**

	![models.png](https://qiita-image-store.s3.amazonaws.com/0/15414/67157a87-4665-b220-5d3a-73e606546f8b.png "models.png")


### APIの更新

Swaggerのスキーマファイルを元にAPI Gateway上のAPIを更新します。

1. API IDの取得

	```
	aws apigateway get-rest-apis
	```

	更新したいAPIの`id`の値を取得します。

	例:

	```
	{
    	"items": [
       	 {
       	     "description": "Move your app forward with the Uber API",
       	     "createdDate": xxxxxxxxxx,
       	     "id": "xxxxxxxxxx",
       	     "name": "Uber API"
       	 },
       	 {
       	     "description": "Flashcard API",
       	     "createdDate": xxxxxxxxxx,
       	     "id": "xxxxxxxxxx",
       	     "name": "Flashcard API"
       	 },

	    ]
	}
	```

2. 実行

	先ほど取得したIDとSwaggerのスキーマファイルを元にAPIを更新します。

	```
	./aws-api-import.sh --update [API ID] [Swaggerのスキーマファイル]
	```

	※デプロイしていない場合

## その他

Swaggerではvendor extensionによってベンダが仕様を拡張できるようになっています。

AWS API Gatewayでは現在`x-amazon-apigateway-auth`と`x-amazon-apigateway-integration`という項目が用意されていて、認証方法やバックエンドとの接続を設定できるようになっています。
MacでTensorFlowのTypeError: __init__() got an unexpected keyword argument 'syntax'を解決する

GoogleのTensorFlowが凄いらしいので使ってみようと思ったらエラーが出てつまづいてしまったので、同じような境遇の人のために解決方法をメモしておきます。

## インストール
```
$ pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl
```

## エラー
```
>>> import tensorflow as tf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/tensorflow/__init__.py", line 4, in <module>
    from tensorflow.python import *
  File "/usr/local/lib/python2.7/site-packages/tensorflow/python/__init__.py", line 13, in <module>
    from tensorflow.core.framework.graph_pb2 import *
  File "/usr/local/lib/python2.7/site-packages/tensorflow/core/framework/graph_pb2.py", line 16, in <module>
    from tensorflow.core.framework import attr_value_pb2 as tensorflow_dot_core_dot_framework_dot_attr__value__pb2
  File "/usr/local/lib/python2.7/site-packages/tensorflow/core/framework/attr_value_pb2.py", line 16, in <module>
    from tensorflow.core.framework import tensor_pb2 as tensorflow_dot_core_dot_framework_dot_tensor__pb2
  File "/usr/local/lib/python2.7/site-packages/tensorflow/core/framework/tensor_pb2.py", line 16, in <module>
    from tensorflow.core.framework import tensor_shape_pb2 as tensorflow_dot_core_dot_framework_dot_tensor__shape__pb2
  File "/usr/local/lib/python2.7/site-packages/tensorflow/core/framework/tensor_shape_pb2.py", line 22, in <module>
    serialized_pb=_b('\n,tensorflow/core/framework/tensor_shape.proto\x12\ntensorflow\"d\n\x10TensorShapeProto\x12-\n\x03\x64im\x18\x02 \x03(\x0b\x32 .tensorflow.TensorShapeProto.Dim\x1a!\n\x03\x44im\x12\x0c\n\x04size\x18\x01 \x01(\x03\x12\x0c\n\x04name\x18\x02 \x01(\tb\x06proto3')
TypeError: __init__() got an unexpected keyword argument 'syntax'
```

## 解決方法
```
pip uninstall protobuf
pip uninstall tensorflow
brew uninstall protobuf
pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl
```

protobufのバージョンが3.0.0a4になっていたらOKのようです。

```
import google.protobuf
>>> print google.protobuf.__version__
3.0.0a4
```

## 参考

[0.5.0 wheel install on Mac OS X using Homebrew python broken #11](https://github.com/tensorflow/tensorflow/issues/11)
docker-composeでインストールしたredmineからDBダンプ取得する


２週くらい周ってやっとコンテナ便利かな？って思えて来ました。
久々に触ったら環境変わりすぎててビビった

[参考](http://hogehuga.com/post-774/)

DBのダンプくらい取れないと使い物にならなそうだったので、ダンプ方法を調べたメモ。

## docker-compose.yml 確認

設定周りが書いてあるdocker-compose.ymlに下記の記述を確認する

```
postgresql:
  image: sameersbn/postgresql:9.4-7
  environment:
    - DB_USER=redmine
    - DB_PASS=password
    - DB_NAME=redmine_production
```

## 対象サーバのIPアドレスを確認する

### 対象のCONTAINER IDを確認する

```
  # docker ps -a
  CONTAINER ID        IMAGE                        COMMAND                CREATED             STATUS              PORTS                            NAMES
  be78dd326cba        sameersbn/redmine:3.1.1-3    "/sbin/entrypoint.sh   About an hour ago   Up 35 minutes       443/tcp, 0.0.0.0:10083->80/tcp   docker_redmine_1
  562616aac362        sameersbn/postgresql:9.4-7   "/sbin/entrypoint.sh   About an hour ago   Up 35 minutes       5432/tcp                         docker_postgresql_1
```

### 対象のIPを確認する

```
  # docker inspect --format="{{ .NetworkSettings.IPAddress }}" 562616aac362
  172.17.0.18
```

この時点でpsqlで繋ごうとするとエラーが出る

```
  # psql -h 172.17.0.18 -dredmine_production
  パスワード:
  psql: FATAL:  password authentication failed for user "root"
```

ユーザがredmineじゃないとダメそう。

```
# psql -U redmine -h 172.17.0.18 -d redmine_production
ユーザ redmine のパスワード:
psql (9.4.5)
"help" でヘルプを表示します.

redmine_production=>
```

繋がった。ということでダンプ

```
 # pg_dump -U redmine -h 172.17.0.18 -d redmine_production > dump.sql
```

## 余談

yml見れば直感的に設定分かるし、compose便利すぎ
analytics関連で役立つgem「rack-tracker」についてのメモ

GAやVWOなどのanalytics関連のタグを埋め込むときに役立ちそうなGem「rack-tracker」についてメモを残す。

[rack-tracker](https://github.com/railslove/rack-tracker)

詳しいことはGithubのページに書いてあるので簡単な使い方をメモする。ほぼ自分のためのメモ。

## 設定

`config/initilizers`に`rack-tracker.rb`のようなファイルを作成し以下のように設定を記述する。

```ruby:rack-tracker.rb
config = MyApplication::Application.config
config.middleware.use(Rack::Tracker) do
  handler :google_analytics, { tracker: 'U-XXXXX-Y' }
end
```


## イベント取得

イベントを送信する時は`tracker`メソッドを使い、以下のようなコードをcontrollerなどに書く。

```ruby
tracker do |t|
  t.google_analytics :send, { type: 'event', category: 'カテゴリ名', action: 'アクション名', label: 'ラベル名', value: '値' }
    end
```

## おまけ

ちなみにGAのみのでよいなら「rack-google-analytics」というのもある。みたところGAだけならこっちの方がシンプルかも

[rack-google-analytics](https://github.com/kangguru/rack-google-analytics)

VWOやGoogleTagMangerなど複数のanalytics関連のタグを入れるのであればいちいち手で入れるよりも簡単に配置できる。

YahooTagManagerなど想定外のタグマネージャなんかは[ここ](https://github.com/railslove/rack-tracker/blob/master/lib/rack/tracker/google_tag_manager/google_tag_manager.rb)の実装をまねて実装し、[設定](http://qiita.com/tomato360/items/2f1497858efa4c8ceb13#%E8%A8%AD%E5%AE%9A)の`handler`で同じように登録すればできないことはない（イレギュラーなのでちゃんと動くかは不安）。
ログインしないでSSH接続できるかをまとめて確認する

know_hosts にないホストの接続は yes/no確認が出でるので .ssh/config に以下を記述する。※ echo yes | もありっちゃありだが。

```bash
Host *
    StrictHostKeyChecking no
```

以下をファイルに保存して実行。
- .ssh/configで指定したホスト名なら username@ の指定は不要。
- エラーメッセージも出したければ -qオプションをはずす。

```bash
# ホストの一覧
check_hosts=(
    server1
    server2
    server3
    server4
    ...
)

for host in ${check_hosts[*]}
do
    ssh -q username@${host} -- :;
    if [ $? = 0 ]; then
        echo -e "\033[36m$host: ssh connection OK\033[0m"
    else
        echo -e "\033[31m$host: ssh connection denied\033[0m"
    fi
done
```
フレームワークへの勘違い

システム開発においては、今や切っても切り離せない程、「フレームワーク」が当たり前となっています。
そんな「フレームワーク」に関する間違いや思い違いを、筆者の視点で書いていきたいと思います。

■フレームワークって、何？

そもそも、フレームワークとは何でしょうか。
調べると、「雛形」「枠組み」などと解釈されています。
では、何の「雛形」や「枠組み」なのでしょうか。
おおよそは、「アプリケーションの雛形」とか「Webシステムの枠組み」となっていると思います。
しかし、実際は「システム（アプリケーション）を作るための本質的な枠組み」です。
「標準」とか「骨子」と言っても良いでしょう。

例えば、家を作るのに、土台や柱を組んで、家を建てていきます。その為に「『なんたら工法』で、丈夫で早く、高い品質」となります。
現在のフレームワークは、この「なんたら工法」を示しています。
しかし、筆者が言うのは、家を立てるために、ユーザーから要件を聞き、必要な強度設計や各部屋の配置、材料選定や、実際の工程の管理、出来上がった後のフォローや改築などの、一連の手順や方法をフレームワークとする、と言う事です。

この認識が違うため、フレームワークを使ったのに、生産性が上がらなかったり、品質が確保できなかったりします。

そういったことを踏まえて、書いていきたいと思います。
なお、万能なフレームワークはないと思いますが、筆者の言うフレームワークなら、「システムを開発する」という点で、広範囲にカバーできると思います。

■フレームワークの実情

現在、沢山のフレームワークは存在していますが、結局のところ、「製造」工程でしか活用できていません。
「設計」ではフレームワークに従った設計をしているように見えますが、多くの場合、それは偶然です。
実際に経験した人も多いと思うのですが、設計書を見た時に「これって、どうやって実装するの？」と、悩むことがあると思います。
なぜならば、フレームワークを意識しないで設計し、それを「フレームワーク部品（筆者は世の中のフレームワークを、この様に呼んでいます）」に当てはめようとするからです。
つまり、フレームワークの本質を理解せずに、システム開発でフレームワークを無理に使おうとしているわけです。
これだったら、昔ながらの「共通部品（ライブラリ）」と、何ら変わりません。

余談ですが、かつてどこかのSIerが「広義のフレームワーク」「狭義のフレームワーク」と話をしている事を、インターネットで読んだことがあります。
例えば、.NETは狭義のフレームワークだと。
当時は、納得したのですが、今思えば、「広義」「狭義」の表現は、不適切だと思います。
フレームワークとして考える際のレイヤーの違いだと思います。
なので、表現するなら「低水準フレームワーク」「高水準フレームワーク」です。
ただし、筆者の言うフレームワークと、本質的に違うと思います。
部品レベルのフレームワークにこだわる限り、ブラック・プロジェクトは、なくならないでしょう。

■フレームワークはどうあるべきか

冒頭でも示したとおり、「システムを開発するため」にフレームワークはあるべきだと思っています。
では、フレームワークには何が必要なのか。
もちろん、現在の数多ある「フレームワーク（部品）」が示すように、システムを構成する要素を、抽象化した部品は必要です。
それによって、プログラムする際に、部品をカスタマイズすることで、簡単に欲しい機能が作れます。
しかし、これの根本的な問題は、部品の使い方がわからない場合に、悩む必要があり、それに多大なエネルギーを必要とすることです。
多大なエネルギーを必要とする理由は、「システムを開発するために必要な、システムの一部である。」ものとしての抽象化が中途半端な事が要因です。

例えば、テレビのリモコンの使い方を悩む人は少ないと思います。
なぜなら、「電源を入れる／切る」「チャンネルを指定する」「ボリュームを変える」ことができるのが、テレビのリモコンとして最低限備わっているものであり、リモコンの形状を見て、直感的に操作できるからです。
フレームワークにも同様に、直感的に分かる事ができれば、簡単に扱うことができます。
ただし、勘違いしてはいけないのが、ＴＶのリモコンと違って、フレームワークを扱う人は、専門家であり、その道に精通する（もしくは、精通しようとしている）人たちです。
つまり、考え方に方向性がある人達です。
そういった人達が、感覚的に（もしくは、自然に）思考して想像が付くようなところまで、抽象化していなくては行けないと思います。

VisualBasicによって、テキトーにプログラムしてもテキトーにシステムが動く様になってしまった関係で、そういったプログラマが増えてしまいました。
また、そう言ったプログラマに乗じて、設計者の責務を果たさないSEが増えてしまいました。
そんなSEばかりなので、ポリシーもなく要件定義して、上流がグダグダになってしまい、結果、下流が燃え盛るプロジェクトが多くなっています。
結局、荒れないプロジェクトも、蓋を開ければ、ユーザーに我慢をさせる事で、凌いでいる現状ではないでしょうか。

フレームワークのあるべき姿は、こういった現状に対する枠組みとなり、整然としたシステム開発ができるためのもの、であるべきだと思います。
それは、フレームワークを部品レベルで考えていては、できることではありません。

補足しますが、現存するフレームワークがダメなわけではありません。
ただ、抽象化が足りないですし、機能面やトレンドにこだわりすぎです。
よく「MVCフレームワーク」とか言いますが、それは、「なんだかよくわからないが、MVCなら、良いらしい」としか判断できないエンジニアを煽っているだけに過ぎません。
MVCなのは当たり前です。情報→判断→動作（結論）がそうであるように、アウトプットがあるものはすべて、この構成（仕組み）になります。
空気がないと人が生きていけないのと同じくらい、当たり前です。
それを、フレームワーク（と言っても、部品）の売りにしている時点で、根本的に間違っています。

■最後に

タイトルの意味をわかって頂けたでしょうか。
多分、言われるまでもなくわかっている人は多いと思います。
ただ、よくわかってない人やSIer、そういった人やSIerに変に教育されてしまった人やソフトハウスのエンジニアもまた、非常に多いと思います。
今（もしくは、過去）、携わっているプロジェクトが、なにか違うと思った人は、考え方の一つとして、参考にしていただければと思います。
Git 1合目(windows)

# 目次
1. windowsの設定（win7）
2. コマンドメモ

# 1. Windowsでの設定まとめ
⇒sourcetreeでgitの操作 ＆ bakclogのgitリポジトリを使用して課題と連携させる

参考：
■サルでもわかるGit入門
http://www.backlog.jp/git-guide/

## 1-1 ツールのインストール
- Git bash
https://git-scm.com/

- TortoiseGit
https://tortoisegit.org/

- SourceTree
https://ja.atlassian.com/software/sourcetree/overview/


## 1-2 windowsの設定（win7）
パスを繋げる
参考：
http://next.matrix.jp/config-path-win7.html

システム環境変数：
⇒Path
C:\Program Files\TortoiseGit\bin;C:\Program Files\Git\bin;

## 1-3 sourcetreeでbacklogのブランチをクローンする

SSH接続したいので、事前にputtyの鍵登録をしておく。
### 1.puttyのインストール
http://yebisuya.dip.jp/Software/PuTTY/
### 2.鍵をつくる
https://osdn.jp/projects/winscp/wiki/ui_puttygen
### 3.公開鍵をbacklogに登録。
### 4.SSHリポジトリをGitページから取得して、sourcetreeにてクローン。
### 5.コミットメッセージに課題IDを入れることで課題に紐づけられる。


# 2. コマンドメモ

git branch

git checkout -b ブランチ名


git status
git log

git add .
git commit -am "コメント"

git push origin ブランチ名

git pull origin ブランチ名
UPDATEやDELETEにLIMIT指定ができることを知った

全レコードをUPDATEやDELETEする恐怖から開放される。

## 参考

* [MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.2 DELETE 構文](https://dev.mysql.com/doc/refman/5.6/ja/delete.html)
* [MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.11 UPDATE 構文](https://dev.mysql.com/doc/refman/5.6/ja/update.html)
* [SQLite3 - sqliteのupdateはlimit出来ない - Qiita](http://qiita.com/ashdik/items/ec3b3cf7d80182298854)
* [削除する行数と並べ替えの指定(LIMIT,ORDER BY句) - データの追加と削除 - MySQLの使い方](http://www.dbonline.jp/mysql/insert/index11.html)

## 動作確認

```mysql:14レコードある
mysql> select count(*) from messages WHERE stat = 'hoge';
+----------+
| count(*) |
+----------+
|       14 |
+----------+
1 row in set (0.00 sec)
```

```mysql:limit2で2レコード消える
mysql> delete from messages WHERE stat = 'hoge' limit 2;
Query OK, 2 rows affected (0.00 sec)
```

```mysql:12レコードある
mysql> select count(*) from messages WHERE stat = 'hoge';
+----------+
| count(*) |
+----------+
|       12 |
+----------+
1 row in set (0.00 sec)
```
bugspots を実際に利用してみて

# bugspotsについて
[igrigorik/bugspots](https://github.com/igrigorik/bugspots)
[グーグルのバグ予測アルゴリズムを実装したツール「bugspots」について](http://qiita.com/okappy/items/e5fc62f9026e0d73c3e9)
[グーグルのバグ予測アルゴリズムを実装したツール「bugspots」、オープンソースで公開 － Publickey](http://www.publickey1.jp/blog/12/bugspots.html)
上記記事が参考になります。

面白そうだし、品質あがるのであればやってみたい、やってみよう。

# やってみるぞ
導入の仕方は、READMEに書いてある通りで動くので割愛。

実行。go。

```bash
$bugspots .
Scanning . repo
        Found 1234 bugfix commits, with 1234 hotspots:

        Fixes:
                - fix a comment
                - Fixed index hogehoge
        Hotspots:
                0.8875 - Gemfile.lock
                0.8478 - Gemfile
                0.7712 - app/controllers/hoges_controller.rb
                0.3702 - app/views/hoges/index.text.slim
```

## 日本語でコミットメッセージ書いていると。。

スコアリングの数式の中で、 【バグフィックスのコミット回数】を使用しているのですが、その判定が、デフォルトでは、commit messageに `fix(es|ed)` `close(s|d)` が含まれるか否か、になっています。

[bugspots/scanner.rb at master · igrigorik/bugspots](https://github.com/igrigorik/bugspots/blob/master/lib/bugspots/scanner.rb#L8)

```rb
  def self.scan(repo, branch = "master", depth = 500, regex = nil)
    regex ||= /\b(fix(es|ed)?|close(s|d)?)\b/i
```

日本語commit messageが許されている環境であれば、ここの指定方法を多少いじってあげた方が良さそうです。

```bash
$bugspots . -w 修正
```

もしくは、

```bash
$bugspots . --words ["修正,fix,bug"]
```

で、バグフィックスコメントの対象の指定を変える事ができます。

または

```bash
$bugspots -r "fix(es|ed)?"
```

で、正規表現も使えるようです。

## 対象branchは、デフォルト master
例え、現在いるbranchが何であろうと、実際にbugspotsが走査するのは、デフォルトだとmaster branchのようです。

[bugspots/bugspots at master · igrigorik/bugspots](https://github.com/igrigorik/bugspots/blob/master/bin/bugspots#L47)

```rb
# Set master as the default branch
options[:branch] ||= "master"
```

そのため master branchがなければ、

```
lib/bugspots/scanner.rb:13:in `scan': no such branch in the repo: master (ArgumentError)
```

こんなエラーがでます。

もしくは、branchを明示的に指定してあげれば平気そう

```bash
bugspots /path/to/git/repo -b develop
```

# 感想
- commit messageの指定は、日本語が混ざる場合、工夫が必要そう
- 直近の開発がスコアが高くなるので、新機能開発をしているフェイズでは、スコアリングに偏りが出やすい
    - それを認識した上で、「ここすげー古い機能なのに、スコア高いぞ」とかはありかも
- 面白い
tensorflowの初心者向けMNISTチュートリアルをやってみた。

Googleが機械学習ツール「[TensorFlow](http://tensorflow.org/)」をリリースしたので、さっそくチュートリアルをやってみた。

インストールは以下のようにする。

```bash
$ pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl
```

今のところ、Python2にしか対応していないようで、Python3で同じようにインストールしようとしたら失敗した。
numpyなど依存関係のあるものも自動的にインストールされる。

以下、公式サイトにある「[MNIST For ML Beginners](http://tensorflow.org/tutorials/mnist/beginners/index.md)」にあるものをメモ書きしながら実装してみた。
（なお、input_dataというのはtensorflowの関数ではなく、[ここ](https://tensorflow.googlesource.com/tensorflow/+/master/tensorflow/g3doc/tutorials/mnist/input_data.py)にあるものをinput_data.pyという名前で保存しておく必要がある。）

```python
# -*- coding : utf-8 -*-

import tensorflow as tf
import input_data

# mnistデータを取得）
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 入力情報を持たせるためにplaceholderを定義する。
# shape(第2引数)の次元にNoneを指定すると、どんな長さの次元数であっても対応できる。
x = tf.placeholder("float", [None, 784])

# 重みとバイアスを保持するVariableを定義する。
# Variableは操作によって値を修正することのできる変数。
W = tf.Variable(tf.zeros([784, 10])) # 重み 784次元の入力を受けて10次元の出力を返す
b = tf.Variable(tf.zeros([10])) # バイアス 10次元の出力に加えられる

# ニューラルネットモデルを定義する。
# 入力xと重みWの行列積(tf.matmul)の出力にバイアスbを加え、ソフトマックスで最終的な出力を決定する。
y = tf.nn.softmax(tf.matmul(x, W) + b)

# 以上でニューラルネットモデルの定義は終わり。
# 以下は、訓練・評価の実装
# (今回のサンプルでは、交差エントロピーで評価して学習しています。)

# 教師データ(正しい答え)を保持するplaceholderを定義する。
y_ = tf.placeholder("float", [None, 10])

# 交差エントロピーの計算式を定義する。
# 教師データy_とモデルからの出力yの対数をとったものとの積を取り、全体の合計を計算する
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))

# 各ステップにおけるモデルの更新方法を定義する。
# 1ステップごとに0.01の更新率で交差エントロピーが最小になるようにする。
# (ニューラルネットの学習には誤差逆伝搬法が用いられるが、これはモデルが何かで判定しているらしい。)
# (ここでは、y = tf.nn.softmax(...)としたので誤差逆伝搬法がニューラルネットの更新に採用されるようだ。)
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

# すべての変数を初期化するための準備をする。
init = tf.initialize_all_variables()

# Sessionを定義し、すべての変数を初期化する。
sess = tf.Session()
sess.run(init)

# 訓練を行う
# mnistデータをSessionに渡して訓練を行い、train_stepの定義に合わせてモデルを更新する。
for i in range(1000):
	batch_xs, batch_ys = mnist.train.next_batch(100)
	sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

# 性能評価のための評価式を定義する。
# 入力データに対するモデルの出力yと教師データy_が一致しているか確認する。
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

# 最終的な性能評価は平均値で決定することを定義する。
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

# テストデータとそのラベルを使って性能を評価する。
print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
```

実装していて思ったことは、機械学習用のツールとしてもすごいが、数値解析用のツールとしてもかなり優秀だと思った。簡単に行列計算が定義できて、計算速度も速い印象。
学習機の実装は他のライブラリに比べてかなり簡潔にかけるが、このチュートリアルだけだとブラックボックスな部分が多くてそれが少し気になった。
公式のチュートリアルにはディープラーニングに関してのものもあるので、そちらも試してみたい。
ラジオボタン・チェックボックスの大きさをCSSで変更する方法

##背景
スマホやタブレットで見ると、デフォルトのラジオボタンやチェックボックスって小さくて使い辛いですよね。そこで、ラジオボタンとチェックボックスの大きさを変更したいものの、jQueryとか画像とかは使いたくない。
ということで、CSSのみで変更する方法を試してみました。
##方法
[transform:scale()](http://www.htmq.com/css3/transform_scale.shtml)を使うことで出来るようになります。
（下記の例では1.5倍の大きさにしています）

``` lang:responsive.css
input[type="radio"] , input[type="checkbox"]{
   -webkit-transform: scale(1.5);
   transform: scale(1.5);
   margin-right: 0.5em;
```
##注意
[transform:scale()](http://www.htmq.com/css3/transform_scale.shtml)はCSS3ですので、古いブラウザでは対応してません。
Macのhomebrewでnkfをインストールしたらalready installed, it's just not linkedと出た時の対策

##背景
文字コードの変換を行うための**nkf**を使う必要が出てきましたが、僕のMacoBookにはnkfが入っていませんでした。
そこで、homebrewを使ってインストールをしようとしたところ少し躓いたので、メモしておきます。

##まずはインストールをやってみた
`$ brew install nkf`

##インストールはできたようだがコマンドが見つからない
インストール後、--versionしてもコマンドが無いとエラーが出た

```
$ nkf --version
-bash: nkf: command not found
```

そこで再度インストールしようとしたところ　リンクされてないというエラーが出た

```
$ brew install nkf
Warning: nkf-2.1.3 already installed, it's just not linked
```

##リンクをしようとするも権限の問題で不可だった

```
$ brew link nkf
Linking /usr/local/Cellar/nkf/2.1.3... 
Error: Could not symlink share/man/ja/man1/nkf.1
/usr/local/share/man/ja/man1 is not writable.
```

##書き込み権限を変更して、再度インストールしたら解決

```
sudo chmod o+w /usr/local/share/man/ja/man1
```

再度リンクをするように設定
```
$ brew link nkf
```
これで動くようになりました。
レコメンド入門メモ

# レコメンドとは
レコメンド（recommend）

［名］(スル)《「リコメンド」とも》
1. 勧めること。推薦すること。「CDを―する」
2. オンラインショップなどで、利用者の好みにあった物品やサービスを推薦する手法。利用者の購入履歴やアンケート、好みが似た他の利用者の情報を分析し、適切な物品やサービスを絞り込んで推薦することにより、売り上げを高めるのがねらい。レコメンデーション。

出典 : デジタル大辞泉 https://kotobank.jp/word/%E3%83%AC%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%89-661550

# つまり?
ユーザの欲している情報へのアクセスの手助けをするためのしくみ。

「この商品を買った人はこんな商品も買っています」
→狭義のレコメンド

広義の意味としては、
単純なもの、行動にあった提示をする。
→ユーザの行動履歴を使用しない

# 検索との違い
レコメンドと検索は。「見つからない商品を見つける」という意味で同じ。
検索という行為に対して情報を表示するか、
検索を指定なくても情報を表示するか
の差でしかない。

# レコメンドの手法の種類

## 【インテンションベースフィルタリング】
任意のコンテンツを、情報提供者の意志ですすめる
→売りたいものをおすすめする。
　在庫の解消や、売り出したい商品をアピールする時に使用。
　導入が楽。

## 【協調フィルタリング】
行動履歴から壮観を計算して近似値を導き出しレコメンドする。
→行動が似ている人に推薦する際に有効

## 【コンテンツベースフィルタリング】
カテゴリーごとに推薦する商品などを決めて、
ルールベースでレコメンドする手法

## 【ベイジアンネットワーク】
コンテンツの特徴語として抽出されたキーワードについて、
確率統計的な手法を用いて相関を導き出しレコメンドする手法
→レコメンドするコンテンツへの行動履歴を必要とせず、
　同時性が高いことが特徴の一つ

# 効果の高いレコメンドを提供するには
重要なのはモデル (レコメンドのルール、手法)
入力/出力において、複数のレコメンド手法を掛けあわせて、
サービスにあったモデルを作成することが重要
JAVA Calendarクラス

<FONT color="#ff0000">■Dateインスタンスから「6つのint値」を生成する</font>
**Date d = new Date();
Calendar c = Calendar.getInstance();
c.setTime(d);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);**

```java
■例①

import java.util.Calendar;
import java.util.Date;

public class Test02 {
	public static void main(String[] args) {
		Date nowTime = new Date();
		Calendar c = Calendar.getInstance();
		c.setTime(nowTime);
		int y = c.get(Calendar.YEAR);
		System.out.println("今年は" + y + "です");
		int m = c.get(Calendar.MONTH);
		System.out.println("今日は" + m + "月です");
		int d = c.get(Calendar.DAY_OF_MONTH);
		System.out.println("今日は" + m + "月" + d + "日です");
		int h = c.get(Calendar.HOUR);
		System.out.println("今の時間は" + h + "時です");
		int min = c.get(Calendar.MINUTE);
		System.out.println("今の時間は" + h + "時" + min + "分です");
		int s = c.get(Calendar.SECOND);
		System.out.println("今の時間は" + h + "時" + min + "分" + s + "秒です");
		System.out.println(y + "年" + m + "月" + d + "日" + h + "時" + min + "分" + s + "秒です。");

	}
}

■例①実行結果
今年は2015です
今日は10月です
今日は10月11日です
今の時間は2時です
今の時間は2時51分です
今の時間は2時51分11秒です
2015年10月11日2時51分11秒です。
```



<FONT color="#ff0000">■「6つのint値からDateインスタンスを生成する</font>
**Calendar c = Calendar.getInstance();**
**c.set(年,月,日,時,分,秒);&nbsp;&nbsp;&nbsp;又は&nbsp;&nbsp;&nbsp;c.set(Calendar.～,値);**
**Date d = c.getTime();**
※～にはYEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE、DAYなどを指定する。

```java
■例②
import java.util.Calendar;
import java.util.Date;

public class Test02 {
	public static void main(String[] args) {

		Calendar c = Calendar.getInstance();
		c.set(2020, 11, 24, 23, 15, 17);
		Date past = c.getTime();
		System.out.println(past);
		c.set(Calendar.MONTH, 11 - 1);
		Date past2 = c.getTime();
		System.out.println(past2);
		c.set(2017, 5, 17, 13, 13, 24);
		Date past3 = c.getTime();
		System.out.println(past3);
		c.set(Calendar.DAY_OF_MONTH, 2);
		Date past4 = c.getTime();
		System.out.println(past4);

		System.out.println("11月に設定したい↓ 11月より-1した値を入れる");
		c.set(Calendar.MONTH, 10);
		Date past5 = c.getTime();
		System.out.println(past5);

	}
}

■例③実行結果
Thu Dec 24 23:15:17 JST 2020
Tue Nov 24 23:15:17 JST 2020
Sat Jun 17 13:13:24 JST 2017
Fri Jun 02 13:13:24 JST 2017
11月に設定したい↓ 11月より-1した値を入れる
Thu Nov 02 13:13:24 JST 2017
```

■例③解説
Java CalendarクラスのMONTHには０～１１の値が入っている(実際の月よりも1少ない)ので
出力するときに＋１した値にすると正しい月が表示されます。


■Calendarクラス
Dateクラスだけでは年月日や時刻など普段使っている形式をを扱うことは出来ません。
このページでは日付・時刻の表示・操作に使用するCalendarクラスについて解説します。このクラスで年、月日、時刻、曜日が分かりやすい形で表示されます。 またロケール、タイムゾーンに即して表示が可能です。

■ファクトリメソッド
Calendarクラスのコンストラクタはアクセスレベルがprotectedで宣言されており、他のクラスから使用することができません。そのため、Calendarオブジェクトを生成するときは、Calendarクラスで用意されているファクトリメソッドを使用します。 すなわち静的メソッドのgetInstanceを使うことで、現在の環境に合った暦を操作するインスタンスを得ることができます。
Macのデスクトップに隙間なくウィンドウを並べる

Macのデスクトップに隙間なくウィンドウを並べたい

マルチウィンドウは素敵なシステムですが、ウィンドウとウィンドウの間のデスクトップが手持ち沙汰に表示されているスペース、気になりませんか？
デスクトップという貴重な不動産に存在するデットスペース、**私は許せません。**
そんなわけで隙間なくウィンドウを並べてしまいましょう。

そんな望みを叶えてくれるツールがBetterTouchTool

ここからダウンロードできます。
http://www.boastr.net/

<img width="982" alt="Screen Shot 2015-11-10 at 18.41.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/e032fa03-a1d2-681c-8385-8c534c033acb.png">

すかさず設定で
Maximize Window Left
Maximize Window Right
Maximize Window
Restore Old Window Size

にショートカットキーを割り付けます。
これで一発でウィンドウを最大化、右半分に最大化、左半分に最大化、元に戻す、ができるようになります。

追加で
Resize Window to Top Right Quater /Corner
Resize Window to Top Left Quater /Corner
Resize Window to Bottom Right Quater /Corner
Resize Window to Bottom Left Quater /Corner

にショートカットキーを割つければ、最大4分割できます。

<img width="400" alt="Screen Shot 2015-11-10 at 18.43.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/d2dbfd5b-c1b7-49de-542c-e29e09ad700a.png">


EL Capitanいらずですな。

これでデスクトップの隙間にオサラバです！
NICのデバイス名と製品名を紐付ける

ethtool で NIC のドライバ情報の `bus-info` を表示します。

```
ethtool -i ens32 | grep bus-info
```

下記のように表示されるので `02:00.0` の部分を覚えておきます。

```
bus-info: 0000:02:00.0
```

lspci で PCI デバイスを表示します。

```
lspci
```

表示された一覧の先頭が↑の `02:00.0` と一致するものを探します。

```
02:00.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
```
golangでシグナルを拾ってgracefulにgoroutineを停めたい・改

# golangでシグナルを拾ってgracefulにgoroutineを停めたい・改

これの続き。
http://qiita.com/arc279/items/c44d4a18a851ff454c64

ちょっとまとめてみた。名前は適当。
使い方は `main()` を見られたし。

```main.go
package main

import (
	"fmt"
	"os"
	"os/signal"
	"sync"
	"syscall"
	"time"
)

type Gracefully struct {
	trapSig  []os.Signal
	callback func(os.Signal) bool
	procs    []func()
}

func NewGracefully(callback func(os.Signal) bool, sig ...os.Signal) *Gracefully {
	self := Gracefully{
		trapSig:  sig,
		callback: callback,
		procs:    make([]func(), 0),
	}
	return &self
}

func (self *Gracefully) Append(proc func()) {
	self.procs = append(self.procs, proc)
}

func (self *Gracefully) Run() {
	var wg sync.WaitGroup
	wg.Add(len(self.procs))

	exitChan := make([]chan int, len(self.procs))
	for i, _ := range self.procs {
		exitChan[i] = make(chan int, 1)
	}

	for i, proc := range self.procs {
		go func(ch chan int, proc func()) {
			defer wg.Done()
			for {
				select {
				case <-ch:
					return
				default:
					// なんらかの並行処理するやつ
					proc()
				}
			}
		}(exitChan[i], proc)
	}

	signalChan := make(chan os.Signal)
	signal.Notify(signalChan, self.trapSig...)

	go func() {
		for {
			sig := <-signalChan
			for _, trap := range self.trapSig {
				if sig == trap {
					if self.callback(sig) {
						// callbackがtrueを返したら抜ける
						for _, c := range exitChan {
							c <- 1
						}
					}
				}
			}
		}
	}()

	wg.Wait()
}

func main() {

	// HUP と USR2 を拾って、HUPの時は抜けたいコールバック
	g := NewGracefully(func(sig os.Signal) bool {
		fmt.Println(sig)
		return sig == syscall.SIGHUP
	}, syscall.SIGHUP, syscall.SIGUSR2)

	procs := []string{
		"proc1",
		"proc2",
		"proc3",
		"proc4",
		"proc5",
		"proc6",
		"proc7",
	}

	for _, p := range procs {
		// javascriptみたいｗ
		g.Append(func(s string) func() {
			return func() {
				fmt.Println(s)
				time.Sleep(500 * time.Millisecond)
			}
		}(p))
	}

	g.Run()

	fmt.Println("stop gracefully")
	os.Exit(0)
}
```

## ビルドして実行

```bash
$ go build -o sample main.go && ./sample
```

## シグナルを送る

### HUPだと停まる

```bash
$ kill -SIGHUP `pgrep -f sample`
```

### USR2だと停まらない

```bash
$ kill -SIGUSR2 `pgrep -f sample`
```

### それ以外は拾わない

```bash
$ kill -SIGUSR1 `pgrep -f sample`
```
Spreeの商品に様々なオプションを追加する

デフォルトのSpreeは、チェックボックスによるバリエーション登録しかできません。

取り扱う商材によっては、ショッピングカードから様々なオプションを指定できる必要がありますよね。

そんなときに活躍するのがこのエクステンションです。

[spree_flexi_variants](https://github.com/QuintinAdam/spree_flexi_variants)

## spree_flexi_variantsができること

このエクステンションは、大きく２つの機能を提供してくれます。

Ad Hoc Optionsと、Product Customizationsです。

### Ad Hoc Options

デフォルトのSpreeでは、多くのバリエーションのある商品を取り扱う場合、それらを個別に登録しなければなりません。この機能を使うと、あらかじめオプションのセットを登録しておいてそれを商品に適用できるようになります。

また商品ごとに利用不可のオプションも設定できます。この機能は"Ad Hoc Exclusions"と呼ばれています。

### Product Customizations

商品に高度なカスタマイズを加える機能です。例えば「Cut to length 5.82cm」、「'thanks for the memories'と刻印してほしい」、自分の画像をアップロードしたい、、等のオプションを追加できます。これらのオプションは、個別に課金体系も設定することができるようになっています。

公式より画像をお借りしました。こんなイメージです。

![spree_flexi_variants.png](https://qiita-image-store.s3.amazonaws.com/0/7323/a11dafcd-0a39-b7e0-73c0-b16c4f3922be.png)


## エクステンションのインストール

オリジナルのリポジトリはこちらのURLからアクセスできます。

[jsqu99/spree_flexi_variants](https://github.com/jsqu99/spree_flexi_variants)

しかしながら、オリジナルはSpreeのバージョン`3-0-stable`に対応していません。

下記のフォークが`3-0-stable`に対応していたのでこちらを使わせてもらうことにしました。

[QuintinAdam/spree_flexi_variants](https://github.com/QuintinAdam/spree_flexi_variants)

`Gemfile`に下記を追加します。

    gem 'spree_flexi_variants', github: 'QuintinAdam/spree_flexi_variants', branch: 'spree-3-0-stable'

コマンドを実行。

```
bundle install
bundle exec rails g spree_flexi_variants:install
```

これで完了です！簡単ですね。

必要に応じて`bundle exec rake db:migrate`もしてください。

### 公式ドキュメントはこちら

https://github.com/jsqu99/spree_flexi_variants/wiki
ELMはじめの一歩

ELMでHello Worldを出すまで。

環境：よせみて 10.10.5
ELMのバージョン：0.15.1

##Elm Platformのインストール
[公式](http://elm-lang.org/install)からインストーラーをダウンロードして、インストールしましょう。
クリックを連打しておけばとりあえず大丈夫です。たぶん

<img width="620" alt="スクリーンショット 2015-11-10 16.38.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/51404/601ea634-f5e5-bc84-f02f-85455b76eb59.png">


` elm`とターミナルで叩いて以下で出ればインストールできています。
 
```
Elm Platform 0.15.1 - a way to run all Elm tools

Usage: elm <command> [<args>]

Available commands include:

  make      Compile an Elm file or project into JS or HTML
  package   Manage packages from <http://package.elm-lang.org>
  reactor   Develop with compile-on-refresh and time-travel debugging
  repl      A REPL for running individual expressions

You can learn more about a specific command by running things like:

  elm make --help
  elm package --help
  elm <command> --help

In all these cases we are simply running 'elm-<command>' so if you create an
executable named 'elm-foobar' you will be able to run it as 'elm foobar' as
long as it appears on your PATH.
```


#ファイルの作成
ELMはelmファイルをコンパイルするとhtml（またはJS)を吐きます。
なのでhello.elmを作成します。
中身はExampleの[hello world!](http://elm-lang.org/examples/hello-html)を貼っつけます。

```elm:hello.elm
import Html exposing (text)

main =
  text "Hello, World!"
```

#ビルド

` elm-make hello.elm --output=hello.html` 

でhello.htmlが作成されます。

![ QiitaHelloWorld.png](https://qiita-image-store.s3.amazonaws.com/0/51404/285a05a6-413c-53b9-f7cc-7cd68678b17e.png)

こんな感じです。これでスタートラインに立てました。

#エラー
```
Error when searching for modules imported by module 'Main':
    Could not find module 'Html'

Potential problems could be:
  * Misspelled the module name
  * Need to add a source directory or new dependency to elm-package.json
```
と怒られれたら、パッケージが足りていないので[公式](https://github.com/elm-lang/elm-package)から持ってきましょう。
` elm-package install evancz/elm-html` 


#参考
1. http://codezine.jp/article/detail/8986
2. http://doloopwhile.hatenablog.com/entry/2014/12/02/200000
JAVA 日付を扱うDate d = new Date();


**■currentTimeMillis()**
■Main23.java

```java
public class Main23 {
	public static void main(String[] args) {
long start = System.currentTimeMillis();

		long end = System.currentTimeMillis();
		System.out.println("処理にかかった時間は・・・"
				+ (end -start) + "ミリ秒でした" );

	}
}
```

■実行結果
処理にかかった時間は・・・0ミリ秒でした
<br>
__________________________________________________
<FONT color="#ff0000">■現在日時を持つDateインスタンスの生成</font>
**Date d = new Date();**
■簡単現在日時表示

```java
		Date now2 = new Date();
		System.out.println("現在日時は" + now2 + "です。");
```

<FONT color="#ff0000">■指定時点の日時を持つDateインスタンスの生成</font>
**Date d = new Date(long 値);**
long値の日時を持つインスタンス生成

**■Date(long 値)**
引数に1970年1月1日午前0時からの経過時間をミリ秒で指定し、指定したミリ秒が表す日時を保持したDateオブジェクトを生成します。

```java
■例①
import java.util.Date;

public class Test02 {
	public static void main(String[] args) {
		Date past = new Date(1447205637038L);
		System.out.println(past);
	}
}

■実行結果
Wed Nov 11 10:33:57 JST 2015
```


■Main23.java

```java
import java.util.Date;
public class Main23 {
	public static void main(String[] args) {

		Date now = new Date();
                System.out.println(now);
		System.out.println(now.getTime());
		Date past1 = new Date(1316622225935L);
		System.out.println(past1);

	}
}
```

■実行結果
Tue Nov 10 18:32:38 JST 2015
1447147958455
Thu Sep 22 01:23:45 JST 2011


■実行結果
現在日時はTue Nov 10 19:11:29 JST 2015です。
Kivyの環境構築からHello Worldと表示するまで

# あらまし
勉強会を開催した際、環境構築に躓いてしまう例が多々あるようなのでメモ。
この方法が正解とは限らないのであしからず。

## Kivyとは
ちなみに。KivyとはPython製のNUI開発のためのフレームワークのこと。クロスプラットフォームで動作しマルチタッチに対応したGUIアプリケーションなどを比較的容易に開発することできます。

# Kivyの環境構築
環境構築を行なうため http://kivy.org/#download より、それぞれのOSにあったものをダウンロードしてください。
<img width="938" alt="スクリーンショット 2015-11-10 12.06.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/98851/5f3a283d-0455-fca0-ebb6-61fe2006a0c7.png">

## Windows
Windowsの環境構築は比較的容易です。
まず最初に、ダウンロードしたKivy-1.9.0-py\*.\*-win32-x\*\*.exeを実行します。(*はバージョン番号など)
そうすると、同一ディレクトリ内にKivy-1.9.0-py\*.\*-win32-x\*\* というフォルダができます。中身は画像のような感じです。
![dir_kivy.PNG](https://qiita-image-store.s3.amazonaws.com/0/98851/bd3884c5-7df2-88bb-12e2-df54c479e07d.png)

この中のkivy-\*.\*.batをダブルクリックして起動します。
![kidou.PNG](https://qiita-image-store.s3.amazonaws.com/0/98851/d3ad1ff4-da0f-9af7-0008-f31a35afcca6.png)
そうすると環境設定済でコマンドプロンプトが立ち上がります。
あとは、ソースコードのあるディレクトリに移動するなりして
```python <ファイル名>.py```
と実行すればOKです。(コマンドプロンプトを閉じないように注意)

環境変数とかパスとかいろいろ設定してあげると便利になりますが、今回は割愛します。
## Mac
Macも容易に構築できます。
ダウンロードしてきたKivy-1.9.0-rev3-osx.dmgを開くと以下、画像のように表示されます。
<img width="529" alt="スクリーンショット 2015-11-10 12.04.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/98851/22366017-6fb4-c6f0-ba6d-c4c9e495cc29.png">

まず、最初に KivyをApplicationsに入れましょう。その後、MakeSymlinksをダブルクリックして実行してください。
その後、ターミナルを起動して以下のように打ち込んでください。
``` $ kivy ```

上手くいくと画像のようにPythonが起動するはずです。
<img width="571" alt="スクリーンショット 2015-11-10 11.50.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/98851/604cb878-14ef-bc6e-3aff-4b8e57ab20e5.png">
これで環境構築は完了です。
あとは、ソースを書くだけ。実行は、
``` $ kivy <ファイル名>.py ```
とするだけです。


## Linux(Ubuntu)
Ubuntuでの環境構築方法です。今回はvirtualenvなどの環境は使いません。
まず、最初に次のコマンドを実行して
``` $ sudo add-apt-repository ppa:kivy-team/kivy```

Python2なら次のコマンドを
```$ sudo apt-get install python-kivy```

Python3なら次のコマンドを
```$ sudo apt-get install python3-kivy```

こちらは、試してないのでわかりませんが、コマンドは```$ kivy```もしくは ```$ python```で実行できると思います。

# Hello Worldと表示してみる
## まずは普通に
```py:main.py
import kivy
kivy.require('1.9.0')

from kivy.app import App
from kivy.uix.label import Label

class HelloApp(App):
    
    def build(self):
        return Label(text='Hello World')

if __name__ == '__main__':
    HelloApp().run()

```

## Kv言語を使って
Kivyの特徴でもあるKv言語を使ってHello Worldと表示してみます。
Kv言語はCSSみたいなものだと思ってください。

```py:main.py
import kivy
kivy.require('1.9.0')

from kivy.app import App
from kivy.uix.label import Label

class HelloApp(App):
    
    def build(self):
        return Label()

if __name__ == '__main__':
    HelloApp().run()

```

Kv言語を記述したファイル名は```hello.kv```としてください。
これは、お約束で```class HelloApp(App):``` のクラス名のAppより前の名前にする必要があります。```MainApp(App):```だったら```main.kv```という名前にします。

```kv:hello.kv
#:kivy 1.9.0

<Label>:
	text: 'Hello World'

```

実行結果(すこし、フォントサイズを大きくしてます)
![hello_world.PNG](https://qiita-image-store.s3.amazonaws.com/0/98851/d3e599ce-ad15-6322-1364-82a3f1f0cbbf.png)


以上、環境構築からHello Worldまで表示する方法でした。
「間違っているよ」などは、お気軽コメントなどください。

Kivyの勉強会も定期的にに開催しているので、興味がありましたら・・・・。
http://pyky.connpass.com/
ActiveAdmin でデータベースと関連しないフォームを作成する方法

たとえばデータベースの books テーブルに title カラムだけが存在する場合。

次のように、存在しないカラムを指定してフォームを作ろうとすると、エラーが起こる。

```rb:app/admin/books.rb
ActiveAdmin.register Book do
  form do |f|
    f.inputs do
      f.input :title
      f.input :message
    end

    f.actions
  end
end
```

この場合。
モデルに attr_accessor などでメソッドを追加してやれば、動くようになる。

```rb:app/models/book.rb
class Book < ActiveRecord::Base
  attr_accessor :message
end
```



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
processingで配列をシャッフル

これが正しい方法かどうかわかりませんが、
processingで配列をシャッフルしてみました。

~~~java

//ベースの配列
String[] base_arr = {"aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg"};
//シャッフルした配列
String[] rand_arr = new String[base_arr.length];
//いろいろ操作用配列
String[] temp_arr;
//乱数格納用変数
int num = 0;

for (int i = 0; i < rand_arr.length; i++) {

	//要素1個の仮配列を作成
	temp_arr = new String[1];
	//ベース配列のサイズから乱数を作成
	num = int (random (base_arr.length));

	//出来た乱数のインデックスの要素を抜き出して仮配列に入れる
	temp_arr = subset (base_arr, num, 1);
	//シャッフル配列に仮配列0番目を代入
	rand_arr[i] = temp_arr[0];
	//上2行について
	//rand_arr[i] = subset (base_arr, num, 1);
	//としたいところだが、
	//文字 = 配列（エラー）
	//となる（抜き出した要素が1個でもあくまでも配列）ので
	//一旦要素1個の仮配列に入れる

	//次にベース配列より1個少ないサイズの仮配列を作成
	temp_arr = new String[base_arr.length - 1];
	//仮インデックス用の変数
	int count = 0;
	//ベース配列のサイズ分だけループして
	for (int j = 0; j < base_arr.length; j++) {
		//先ほど出た乱数以外の要素をベース配列から抽出
		if (j != num) {
			temp_arr[count] = base_arr[j];
			count += 1;
		}
	}
	//ベース配列と要素が1個抜けた仮配列を入れ替え
	//（ベース配列はサイズが1個減り、抜き出された要素は無くなる）
	base_arr = temp_arr;

}

println (rand_arr);

~~~
GithubのPR番号から該当のPRの内容をfetchしてくる(refspecに依存しないで)

今までrefspecに依存したコマンドを書いてたんだけど、レポジトリ持ってくるごとに設定するのめんどくなったので。

↓こういうのを.gitconfigのaliasに設定した。

```
cop  = "!sh -c 'git fetch origin refs/pull/$0/merge && git checkout FETCH_HEAD -B origin/pull/$0'"
```

例えば42番のPR持ってきたかったら

```
git cop 42
```

とかってやる。mergeじゃなくてhead持ってきたいとかはお好みで。
docker-backupをdata volumeのデータをバックアップする

# この文書に書いてあること

docker-backupというコンテナを使って、VOLUMEのバックアップをとります。

## 使ったコンテナ

* [boombatower/docker-backup](https://github.com/boombatower/docker-backup)
* [Docker Hub](https://hub.docker.com/r/boombatower/docker-backup/)

このコンテナを使うことのよさなどは、本家をみてもらうとよいです。

## 経緯

docker private registry どうかなぁとおもって、あまり深く考えずに使いはじめました。
結果、dockerを動かすホストが増えてきているからか、意外と役に立っています。

### とりあえず立てたdocker private registry が意外と便利だったのですが、、、

docker private registry v2用ウェブインターフェースを探していてるときに
以下の記事を読んで
* [docker_registry - WebUIから Docker Registry 2.0上のimageをDELETE - Qiita](http://qiita.com/tukiyo3/items/0d3814b78f555e78d0f5)

読んだ結果
* 試してみたいなぁと思った
* イメージのDELETEもしたいしなぁと思った
以上のような理由で、docker private registryのコンテナを再起動したくなりました。

ついでにデータが docker private registry 内にあるので、できたらこれを機に分離したいなぁと思いました。

## 背景にある動機

以下の２つやりたいので、まずはバックアップをとりたいとおもいました。

* docker private registry のコンテナを更新、再起動
* バックアップをとり、Data Volume Containerに移行したい。(それがベストな解決策かはわかっていない。。。が、いまはこの話題ではない)


# 本題、バックアップ実行

以下のようなコマンドでバックアップとれます。
これを実行すると、カレントディレクトリに、backup.tar.xzが作成されます。

```
docker run --rm \
  --volumes-from バックアップしたいコンテナ \
  -v $(pwd):/backup \
  boombatower/docker-backup backup
```

詳しい使い方は、使ったコンテナのところにある、本家のドキュメントをみてもらいたいです。

### docker-backupの動き(想像)

詳しくは本家のドキュメントをよんでもらったほうがよいですが、
ソースをさらったみたところ、
docker-backup がバックアップをしたいコンテナについて

```
cat /proc/mounts
```
した結果を、調べてくれて
volume を探してうまくバックアップしてくれるようです。

### docker-backupが動いているときの様子

8Gのメモリのマシン上で、docker private registry コンテナの、/var/lib/registryが9.1Gの状況で、
実際に試した感じだと、
メモリを残り100MBくらいまでつかって、そのあたりでフラフラしながら
バックアップを進めてくれるようでした。

# 追記(2016-05-11)

4Tくらいのコンテナのデータをバックアップしようとしたら、結構時間がかかるとのこと。
xzがかなりがんばっていた模様でした。

# 参考情報

* [DockerとData Volume Containerのお話 - Qiita](http://qiita.com/kxphotographer/items/4788a25d9ebe6a434e46)
"Unity"+"leap motion" [練習二つ]: VRGUI Project

<h2>VRGUI Project： 「CheckBox作る」</h2>
<h3>Goal: 空間に浮かぶGUIを作る</h3><ul>
<li><font color=red>Step 1: UnityでLeap Motionを使ってGesture Motion認識ができる。</font></li>
<li><font>Step 2: uGUIでメニューを作って空間に浮かべる</font> </li>
<li>Step 3:メニュー選択。任意のGameObjectからRaycastを飛ばしてメニューを選択できる。選択状態で色を変える。できたら音も。</li>
<li>Step 4:メニューで選択した項目を実行。メニューに任意のアクションを割り当てられるように実行する。</li>
</ul>
<hr/>
Step1.
<h3>CheckBox作る</h3>
CheckBoxをタッチしたらの時色を変える。

<img width="1440" alt="Screen Shot 2015-11-10 at 17.15.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/520a5365-53a1-4189-bc08-f1dac5beec77.png">

<img width="1440" alt="Screen Shot 2015-11-10 at 17.16.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/67457cc2-d25f-f34c-4f63-e8b36df45f2e.png">
ー
ユーチューブ
https://youtu.be/6qYSAkAYWCQ

ー
Chrome+WYSIWYGエディタで動画を埋め込むと空白で表示される

フォーム入力にエディタ(tinyMCE)を使用しており、動画を埋め込むことができるのだが、確認画面で動画が再生されず、空白として表示される

コンソールを見ると以下のエラーが出ていた

```
The XSS Auditor refused to execute a script in 'http://hoge.com/foo/bar' because its source code was found within the request. The auditor was enabled as the server sent neither an 'X-XSS-Protection' nor 'Content-Security-Policy' header.
```

ブラウザの仕様でフォームPOST時にXSS対策をしており、そのチェックにひっかかっているよう(Chrome, Safariのみ再現)

対策として

* XSSチェックをオフするヘッダを出力する
* formタグのactionの要素をシングルクォーテーションで囲む

の2つがあるが、後者は微妙.

フレームワークを使用していたこと、また該当ページにおいて別ロジックでユーザー判定をしていたため、XSSチェックはいらないので前者をとる

CakePHPの例

```php

	function hoge() {
            // POSTできた場合
            if($this->data){
	            $this->header('X-XSS-Protection: 0');
                //以下何らかの処理
            }
	}
```

参考:
http://qiita.com/mimoe/items/e43445dc8bb214e1906a
http://gqevu6bsiz.chicappa.jp/google-chrome-%E3%81%AExss%E4%BB%95%E6%A7%98%E3%81%AB%E3%81%AF%E3%81%BE%E3%82%8B%E3%80%82/
railsでriotjsをセットアップする＋riotjsからjsonをとってくる(via jQuery.get)

なんか巷では`riotjs-rails`を使うらしいが、これが何故かGem installedなのにファイルがコピーされずに、`assets/application.js`からrequireしても怒られる。

くっそいので、違うのをさがしたら[あった](https://github.com/bjarosze/riot_js-rails)。

````ruby:Gemfile
gem 'riot_js-rails'
````

````shell
$ bundle install
````

````js:assets/application.js
//= require riot
//= require riot_rails
````

これで動くようになる。あとは、タグファイル(`filename.tag`)を`assets/javascript`内に置けば、`riot.tag()`としてコンパイルして読み込んでくれるようになる（もちろん、.tagもrequireされないとダメだとおもう）

Riot.jsではAjaxしたかったので、[jsonを取得してデータをとってくる](http://www.tutorialsavvy.com/2015/05/getting-started-with-riot-js-part4.html/)ちょっと怪しいサイトを参考にして以下の様な感じ。

````html:assets/javascript/sample.tag
<fuck>
  <h2>{opts.header}<h2>
  <ol>
    <li each={list}>
      {user.name.first}
    </li>
  </ol>
  <script>
    var self = this;
    this.list = []; 
    opts.dataRequest.done( function(data){ 
      self.list = data.results;
      self.update(this.list) 
    })
  </script>
</fuck>
````

````slim:view/fuck/index.slim
fuck
javascript:
  riot.mount('fuck', 'テスト'
    dataRequest: $.get("http://api.randomuser.me/?results=3") 
  });
````

このsample.tagはコンパイルされると以下の様な感じである

````js:sample.js
riot.tag('large_categories', '<h2>{opts.header}</h2> <ol> <li each="{list}"> {user.name.first} </li> </ol>', function(opts) {
    var self = this;
    this.list = []; 
    opts.dataRequest.done( function(data){ 
      self.list = data.results;
      self.update(this.list) 
    })
});
````

しかしこのタグファイル、以下の問題がある

### HTMLとJSが共存しているのをriot_js-railsがコンパイルするので、
- slimで書けない
- coffeescript で書けなくもない（`<script type="coffee">`でイケルが、gemが直指定されてる？のかcoffee-scriptなんて無え！とエラーになる）
- Bracketsではカラースニペットが効かない（.tagという拡張子だから…）

うーん、.slimではカスタムタグだけ宣言しておいて、`riot.mount()`については、コントローラとして、単独の.js.coffeeファイルで書いて、カスタムタグはホントにコンポーネントとして、表示するだけにするのが、意図通り綺麗かも？

### `assets/javascript`にViewが居るのが…

コントローラかどっかルーティング弄れば`views/`の中でもコンパイルしてくれるようにできるかも

まあ、でもそのぐらいでしょうか。ちょっとおもしろそうなので、もう少しがんばっていじってみる。
Unityでのcallbackサンプル

callbackとかの使いみちが今ひとつわかってないので、簡単なサンプルだけ書いてみました。

https://github.com/kakikubo/callback-sample

![image](https://qiita-image-store.s3.amazonaws.com/0/57477/258bc478-bb76-3bbb-0574-a0e2cc99c379.png)

上記のgithubにあるソースを実行していただければわかりますが、入力された文字列を「送信」すると一気に３つの要素(それぞれ、hierarchy上にBold,Italic,Bold&Italicに設定されています)が書き換わります。

３つの要素はどれも同じスクリプト(Textile.cs)がついており、「送信」を押した際に「フォームにセットされた文字列」がきちんと要素自身を書き換えるような処理をしています。

もっとわかりやすい例がないかなと思ったんですが、取り急ぎ
gitbucket→hubot→hipchat

# 参考
- [gitbucket→hubot→slack連携](http://qiita.com/yo-iida/items/be265427faf44f6d6f96)

# 設定方法

## hubotのスクリプトを実装

#### 使用しているライブラリ

- [charltoons/hipchatter](https://github.com/charltoons/hipchatter)

#### スクリプト

```coffeescript

# Description:
#   gitbucket to Hubot
#
# Commands:
#   None
#

Hipchatter = require('hipchatter')
hipchatter = new Hipchatter(your_auth_token)

module.exports = (robot) ->
  robot.router.post "/hubot/gitbucket-to-hubot/:room/:room_notification_token", (req, res) ->
    { room } = req.params
    { room_notification_token } = req.params
    { body } = req

    try
      if body.payload
        json = JSON.parse body.payload
        for i in [json.commits.length-1..0]
          message  = "<a href='#{json.pusher.html_url}'>#{json.commits[i].author.name}</a> pushed to branch #{json.ref} of <a href='#{json.repository.html_url}'>#{json.repository.full_name}</a> <br>"
          message += "- #{json.commits[i].message} (<a href='#{json.commits[i].html_url}'>#{json.commits[i].id.substring(0, 7)}</a>)"

          if message?
            hipchatter.notify room,
              message: message
              color: "yellow"
              message_format: 'html'
              token: room_notification_token
            , (err) ->
              if err == null
                res.end "OK"
              else
                console.log("error: #{err.message}")
                res.end "Error"
          else
            robot.messageRoom room, "gitbucket integration error."
            res.end "Error"
    catch error
      robot.send
      res.end "Error"

```

## gitbucketの設定

- リポジトリ > Settings > Service Hooks
- WebHook URLSに`http://your.hubot.site:9999/hubot/gitbucket-to-hubot/room_name/room_notification_token`を入力して「Test Hook」ボタンを押下
 - room_nameとroom_notification_tokenには適切な値を入力してください
 - room_nameが日本語の場合は正常に送信されないので、代わりにそのRoomの`API ID`を指定してください
- hipchatにメッセージが表示されたら成功
- 「Add」ボタンを押下する

## 注意事項

* Room名に日本語や空白が含まれていると動かない。
インストールしたモジュールをpython2.7と3.4の2つのバージョンで使えるようにしておく

#事の発端
pre-installされていたされていたpython2.7に加えて授業で使用を必須とされたpython3.4をインストールして今まで作業をしていたのだが、こういう浮気行為をしているとたまに以下の様な問題（というか混乱）を招くことになる。

- 3.4で使おうと思ってダウンロードとしてモジュールがなぜか使えない。vice versa
- たまにどっちのverでモジュールをインストールしたか忘れてしまう。
- etc

一時期どっちかのverを残してあとはvirtualenvを使えばいいかと思っていたのですが、結果的には2つ残しておくという決断に至りました。virtualenvは近いうちにもう一度有効活用してみたいですが。

#ということで
色々調べた結果、[installing lxml to run with python3.4 on OS Mavericks](http://comments.gmane.org/gmane.comp.python.lxml.devel/7123)というサイトでユーザーが全く同じことで悩んでいることに気づく。

>
A:
From the log file I gather that everything runs more or less as expected
until it hits a glitch towards the very end, which I reproduce below. I
don't really understand them, but I note that the whole installation
process is geared towards the 2.7 version of Python that is part of the
system. I haven't found instructons on how to force pip to look for Python
3.4. Perhaps it doesn't matter.
>

>
B:
It does: pip installs stuff for the same version of Python that you used
to run pip. You can use 'python3.4 -mpip install lxml', or maybe your Python 3.4
install created a /usr/local/bin/pip3.4 script or something.
>

どうやらpipを動かすときに使っているpythonのバージョンと関係している模様。なのでpipにpython3.4 verのlxmlを取得してくれよと命令を付け加えてあげないといけないっぽい。ということで`python3.4 -mpip install lxml`を実行。

#つまり
恐らくですが（そして他の代用策もたくさんあると思いますが）現時点で僕が知り限りではpythonのモジュールをインストールする際は毎回`python3.4 -mpip install module`で行わないといけません。pipのデフォがpython2.7になっているからです。モジュールによってバージョンサポートが違うので互換性が会わないとインストールの時点でエラーを吐くことがあります。
Railsでメソッド呼び出し元をログに出力する

このメソッドどこから呼ばれてるんだって調べるときにはPryを使ったりするかも知れませんが、大量に呼ばれたりしてるといちいち止めていられません。そこでログに呼び出し元を吐き出して後から調べるということをしてみたくなった時のための方法。

`Logger.new('log/hogehoge.log').debug caller[0]`

これを呼び出し元を調べたいメソッドに仕込んでおくと指定したlogファイルに直近の呼び出し元が書かれていくので後で調べていくのに便利です。