OmniAICreator/Qiita-1.07M huggingface dataset:
Jekyllを使って静的サイトを生成し、S3にホスティングする。

# 流れ

- Vagrant環境にJekyllをインストールする。
- 新規にサイトを構築する。
- ローカルで記事を投稿する。
- s3_websiteを使ってS3にアップロードする。
- コンテンツを確認する。 

# Vagrant環境にJekyllをインストール

```
$ mkdir jekyll
$ cd jekyll/
$ rbenv exec bundle init
```

```rb:Gemfile
source "https://rubygems.org"

gem "therubyracer"
gem "jekyll"
```

```
$ rbenv exec bundle install --path vendor/bundle
```

新規サイトをジェネレート。

```
$ bundle exec jekyll new new-site
```

サイトの確認。

```
$ cd new-site/
$ bundle exec jekyll serve --host 0.0.0.0
```

http://localhost:4000/

# ローカルで記事の投稿

記事を書く。

```
$ cd _posts/
$ vi 2014-09-22-hogehoge.md
---
layout: post
title: fugafuga
---

- fumufumu
- fumufumu
- fumufumu
```

ビルドする。

```
$ cd ..
$ bundle exec jekyll build
```

サイトの確認をする。

```
$ bundle exec jekyll serve
```

http://localhost:4000/2014/09/22/hogehoge.html

# S3にアップロード
[s3_website](https://github.com/laurilehmijoki/s3_website)を使ったら便利そうだったので、これを利用します。

ともあれインストール。

```Gemfile
source "https://rubygems.org"
gem "therubyracer"
gem "jekyll"
gem "s3_website"
```

```
$ rbenv exec bundle install
```

s3_website.ymlの書き出しと設定をする。

```
$ cd new-site/
$ bundle exec s3_website cfg create
```

```s3_website.yml
s3_id: [AWS Access Key Id]
s3_secret: [AWS Secret Access Key]
s3_bucket: [バケット名]
s3_endpoint: ap-northeast-1
```

バケットの作成をする。CloudFrontは使わないことに。

```
$ bundle exec s3_website cfg apply
Applying the configurations in s3_website.yml on the AWS services ...
Bucket snippets.itayan.com now functions as a website
Bucket snippets.itayan.com is now readable to the whole world
No redirects to configure for snippets.itayan.com bucket
Do you want to deliver your website via CloudFront, the CDN of Amazon? [y/N]
```

openjdk-7のインストール。

```
$ sudo apt-get install python-software-properties
$ sudo add-apt-repository "deb http://archive.canonical.com/ precise partner"
$ sudo apt-get update
$ sudo apt-get install openjdk-7-jre
$ java -version
java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.1) (7u65-2.5.1-4ubuntu1~0.12.04.2)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)
```

S3に書き出しをする。

```
$ bundle exec s3_website push
...
[info] Summary: Created 6 files. Transferred 30.5 kB, 6.0 kB/s.
[info] Successfully pushed the website to http://[バケット名].s3-website-ap-northeast-1.amazonaws.com
```

サイトの確認をする。

http://[バケット名].s3-website-ap-northeast-1.amazonaws.com

# サイトの更新

ローカルでサイトの編集をし、ビルドをしてから

```
$ bundle exec jekyll build
```

書き出せばよい。

```
$ bundle exec s3_website push
```

# Route53で独自ドメイン運用

せっかくなので独自ドメインでの運用方法も。

Management Consoleにログインし、Route 53を選択。

- `Hosted Zones`を押す。
- 対象ドメインを選択し、`Go to Record Sets`を押す。
- `Create Record Set`を押す。

```
Name: [ホスト名]
Type: A - IPv4 address
Alias: Yes
Alias Target: s3-website-ap-northeast-1.amazonaws.com
```

- `Create`を押す。

はい、これだけ。


### 参考リンク

- [Jekyll入門 (全11回) - プログラミングならドットインストール](http://dotinstall.com/lessons/basic_jekyll)
VagrantのCentOSにRails環境を構築

==============================

### 参考
+ [はじめてのRuby on Rails インストール（VagrantとCentOSとrbenvとRuby 2.0.0でRails 4.0の環境構築の手順）](http://shgam.hatenadiary.jp/entry/2013/10/13/175515)
+ [rbenv を使って ruby をインストールする(CentOS編)](http://qiita.com/inouet/items/478f4228dbbcd442bfe8)
+ [【CentOS】Ruby と Ruby on rails すら無い状態から Redmine をインストールする！【rbenv】](http://oki2a24.com/2014/02/08/try-to-install-ruby-and-redmine/)
+ [rbenvで複数のバージョンのrubyを使用する環境を整える](http://memo.yomukaku.net/entries/ApoFwmf)


### ssh
```
$ vagrant ssh
```


### gitを入れる
```
$ sudo yum -y install git
```


CentOSにrbenvを入れる
----------------
### rbenvを入れる
```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

### パス、環境変数の設定
```
# PATH に追加
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

# .bash_profile に追加
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# 上記設定の再読み込み
$ exec $SHELL -l
```

### ruby-build を インストール（clone）する
```
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```



rbenv経由でRubyを入れる
----------------
### ruby の最新版を確認
```
$ rbenv install --list
```

### rubyのインストール
```
$ rbenv install -v 2.0.0-p481
```


rbenv環境確認
------------------
### 再読み込み
```
$ rbenv rehash
```

### インストールされているruby一覧を確認
```
$ rbenv versions
* system (set by /home/vagrant/.rbenv/version)
  2.0.0-p481
```

### グローバルに設定
```
$ rbenv global 2.0.0-p481
$ ruby -v
```


Railsのインストール
-------------------
### gemのアップデート
```
$ gem update --system
```

### Bundlerのインストール
```
$ gem install bundler
```

### Railsを入れる
```
$ gem install rails --no-ri --no-rdoc
```

### rehashはめんどくさいので自動化
```
$ gem install rbenv-rehash
```
> これ使わないと、gemをインストールするたびにrbenv rehashする必要があるらしい

### 反映
```
$ rbenv rehash
```


WebServer(httpd)のインストール
--------------------
### httpd
```
$ sudo yum -y install httpd
$ sudo service httpd start
$ sudo chkconfig httpd on

# ファイアウォールを切る
$ sudo service iptables stop
$ sudo chkconfig iptables off
```

### フォルダ共有(シンボリックリンク)
```
$ sudo rm -rf /var/www/html
$ sudo ln -fs /vagrant /var/www/html
```
MacにVagrantを入れる

===================

### 参考
+ [Vagrant セットアップ (Mac)](http://qiita.com/inouet/items/b36638adc2b5772db457)



手順
--------------------
### Vagrantのインストール
**[Vagrant 公式サイト](http://www.vagrantup.com/)**

上記公式サイトから、 vagrant_x.x.x.dmg をダウンロードし インストール


### VirtualBoxのインストール
**[VirtualBox 公式サイト](https://www.virtualbox.org/)**

VirtualBox-x.x.x-xxxxx-OSX.dmg をダウンロードし インストール


### Boxの追加
```console
$ vagrant box add centos64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
```


### 仮想マシンを作る
```console
$ mkdir -p ~/Vagrant/CentOS64
$ cd ~/Vagrant/CentOS64
$ vagrant init centos64
$ vagrant up
```

### 仮想マシンの起動・状態確認・停止
```console
$ vagrant up
$ vagrant status
$ vagrant suspend
```


### 仮想マシンへの接続
```console
$ vagrant ssh
```


### ネットワークの設定 
```console
$ vi Vagrantfile
# config.vm.network :private_network, ip: "192.168.33.10"
 ↑ ここのコメントアウトを削除
```

リロード
```
$ vagrant reload
```
Laravel 4で日本語表記の月リスト生成ヘルパーを自作する

日本語表記の月のリストを生成するヘルパーがほしかったので、[カスタムマクロ](http://laravel4.kore1server.com/docs/html#custom-macros)を使って自作してみた。

まず、マクロ定義ファイル（`app/macros.php`など）に下記のマクロを定義する。

```php:app/macros.php
Form::macro('selectJaMonth', function ($name, $selected = null, $options = array())
{
    $jaMonths = array(
        '1'  => '1月',
        '2'  => '2月',
        '3'  => '3月',
        '4'  => '4月',
        '5'  => '5月',
        '6'  => '6月',
        '7'  => '7月',
        '8'  => '8月',
        '9'  => '9月',
        '10' => '10月',
        '11' => '11月',
        '12' => '12月',
    );

    return Form::select($name, $jaMonths, $selected, $options);
});
```

中身は`Form::select()`をラップして月の配列を渡しているだけ。

次に、`app/start/global.php`などでマクロ定義ファイルを読み込む。

```php:app/start/global.php
require app_path().'/macros.php';
```

最後に、定義したマクロをビューで呼び出せば、日本語表記の月のリストを生成できる。

```php
Form::selectJaMonth('month')
```
Playgroundで実行可能なドキュメントを作成する

Xcode6で作った.playgroundファイルをFinderから開くと...

![スクリーンショット 2014-09-23 4.16.59.png](https://qiita-image-store.s3.amazonaws.com/0/8399/87dc4af6-8f0a-4f7a-d9f2-ac64f4f5e571.png)

こんな感じのパッケージになってます。このパッケージングの形式は [Interactive Learning Document Format](https://developer.apple.com/library/prerelease/mac/documentation/Swift/Reference/Playground_Ref/Chapters/InteractiveLearning.html#//apple_ref/doc/uid/TP40014789-CH3-SW4)と呼ばれており、swiftのコードだけじゃなくてHTMLを混ぜたりできるようになってます。

content.xcplaygroundが全体のメタデータになってて、中身はこんな感じ

```xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='1.0' sdk='iphonesimulator'>
    <sections>
        <code source-file-name='section-1.swift'/>
    </sections>
</playground>
```

パッケージ内にHTMLやswiftのファイルを置いて、↑のようなインデックスを書いてやれば、playgroundが実行可能なドキュメントとして出来上がる、ってわけです。

ただ、これらを手作業で作るのは結構面倒です。で、ググったらmarkdownからplaygroundファイルを生成してくれるツールを公開している人がいました。なぜかnode.jsで作られてます。

[jas/swift-playground-builder](https://github.com/jas/swift-playground-builder)

こいつを使えば、まずこういう markdownを書いて・・

![スクリーンショット 2014-09-23 4.14.16.png](https://qiita-image-store.s3.amazonaws.com/0/8399/aa0fd792-f5bc-1500-172d-56499131b94f.png)

以下のコマンドを実行すれば・・・

```
playground tutorial.md -p ios
```

以下のような実行可能なドキュメントが出来上がります。もちろんコードの部分は編集可能なので、いろいろ試すことができます。

![スクリーンショット 2014-09-23 4.13.30.png](https://qiita-image-store.s3.amazonaws.com/0/8399/89cd967d-3697-8c24-f222-24132e3af724.png)

以下にplaygroundファイルをzipで固めたものをupしてあるので、DLすれば動かせます（ちなみに内容は超適当）。

[tutorial.playground](https://dl.dropboxusercontent.com/u/6024578/qiita_playground/tutorial.playground.zip)

swiftの技術情報とかをこの形式でまとめて公開すれば未来っぽい感じのドキュメントになりそうなんですが、まあwebブラウザで見れるならともかく、いちいちDLさせて開かなきゃいけない、ってところであんまり流行らないだろーなー。と思いつつ。。。
railsでcsv出力する時はviewで整形したほうがわかりやすくない？

railsでcsv出力したいときありますよね。

どういう方法でやろっかなーとザッとググってみたら、csv生成をcontroller内に直接書いたりModelにメソッド定義して`Model.to_csv(records)`みたいなかんじでやってるコードが結構出てきます。

けど、csvもhtmlやjsonなんかと同じようにviewで書いたほうがなんかスッキリする気がしたのでやってみました。

```rb:app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all

    respond_to do |format|
      format.html do
        @users = @users.page params[:page]
      end
      format.csv do
        send_data render_to_string, filename: "users-#{Time.now.to_date.to_s}.csv", type: :csv
      end
    end
  end
end

```

```rb:app/views/users/index.csv.ruby
require 'csv' # initializersとかに書いたほうがいいかも

CSV.generate do |csv|
  cols = {
    'ID'     => ->(u){ u.id },
    '姓名'   => ->(u){ "#{u.last_name} #{u.first_name}" },
    '性別'   => ->(u){ u.sex },
    '誕生日' => ->(u){ u.birthday.strftime('%Y年%m月%d日') },
    '所持金' => ->(u){ number_to_currency u.money }
  }

  # header
  csv << cols.keys

  # body
  @users.each do |user|
    csv << cols.map{|k, col| col.call(user) }
  end
end

```

```rb
# csvダウンロードへのリンクはこんなかんじで
= link_to 'Download CSV', users_path(format: :csv)

```

viewのテンプレートを`.ruby`として素のrubyで書いて、controller側で`render_to_string`で文字列としてとってきて`send_data`でレスポンスとして投げつけてます。
controller側は`format.csv`だけでも大丈夫なんですが、今回はファイル名を指定したかったのでこんなかんじに。

今回は標準ライブラリの`CSV`で書きましたが、テンプレートを素のrubyで書くので自分の好きなように書けるのはなかなかいいんでないかと。

あと、別の表示項目のcsvも必要だなーと思ったらその分view書いてから、action増やすなりrenderするview分けるなりでどんどん増やしやすい＆Modelなんかに直接書くより見通しがいいんでないかと思います。

----

投稿してから、[同様のものが既出](http://qiita.com/retosu/items/5bda7bd5a55c20fc89c0)だと気づいたけど、気にしないことにしました :stuck_out_tongue_closed_eyes:
AWSのLinuxインスタンスにログインできなくなった時の対処法

起動ディスクのボリュームを別のインスタンスに繋いで編集後に戻す方法を解説します。
分かる人は、この一文だけでOKと思いますが、幾つか引っかかったので自分用の備忘録もかねてメモします。
（もっと良い方法があれば教えてください m(_ _)m ）

検索するとAmazonのサイトでも同じ方法を紹介していました。
[Amazon EC2 インスタンスに関するよくある質問](http://aws.amazon.com/jp/instance-help/)

##状況

Amazon Web Service上に作成したLinuxインスタンスで、インスタンス自体は起動しているが外部から接続できない。
（インスタンスの起動に失敗する場合にも対応可能）

##対応

###1. トラブルを起こしたインスタンスを停止

###2. インスタンスのルートボリュームをDetach

作業前にボリュームの「Name」タグに適切な名前を付けておくと分かり易いです。

###3. レスキュー用に新しいインスタンスを作成

トラブルを起こしたインスタンスと同じAvailability zoneに作成します。
（普通にAWSコンソールで作業していれば同じになります）

(注意）Amazon Linuxのインスタンスが良いです。
初めはUbuntuのインスタンスを作成して作業しましたが(今回トラブルを起こしたのがUbuntuのインスタンスだったので)、デバイス名の規則の関係からかAttach後にうまく起動しませんでした。

###4. レスキュー用のインスタンスにAttach

2.でDetachしたボリュームをレスキュー用インスタンスに接続します。
この時にデバイス名をメモしておく。「/dev/sdb」など。

###5. マウントポイントを作成する

レスキュー用のインスタンスに接続し、rootになってから次のコマンドを投入します(以降の処理は全てrootユーザーで行う)。

```shell-session
[root@resq ~]# mkdir /mnt/attached_disk
```

###6. デバイスの本名（本来のデバイス名）を確認する

AWSのLinuxインスタンスはディスクデバイスを別名で管理しているので、次のコマンドで本来のデバイス名を確認します。

```shell-session
[root@resq ~]# ls -l /dev/（4.でメモしたデバイス名）
```

今回の例では下のコマンド。リンクになっているので、この場合は「/dev/xvda1」が本来のデバイス名です。

```shell-session
[root@resq ~]# ls -l /dev/sda1
lrwxrwxrwx 1 root root 5 May 14 15:26 /dev/sda1 -> xvda1
```

###7. マウントする

次のコマンドで作成したマウントポイントにマウントします。

```shell-session
[root@resq ~]# mount /dev/xvda1 /mnt/attached_disk
```

###8. マウントしたディスクで問題のある部分を修正する

トラブルによってケースバイケース。
私の場合は/etc/profile.d/にあるトラブルの元になっていたファイルを削除。

###9. レスキュー用インスタンスを停止し、作業したボリュームをDetach

###10. Detachしたボリュームを、元のインスタンスにAttach

（注意）Attachする際にデバイス名として「/dev/sda1」を指定します。これを指定しないと、ルートボリュームとして認識されません。

###11. 元のインスタンスを起動し、無事に接続できればOK

###12. レスキュー用インスタンスを削除して終了
Windows8.1環境下におけるVirtualBoxのネットワークアダプタ設定のトラブルについて

##症状
　VIrtualBoxのネットワークアダプタ設定で、ブリッジアダプター等の設定が出来ない。[名前]項目にデバイスがリストアップされない。あるいは急に使えなくなった。

キーワード: VirtualBox, ネットワーク, アダプタ, 名前, 未選択, Windows8.1

##対処法
　一つ確認したい。**VirtualBoxをインストールした後にWindows8.1へアップグレードしていないだろうか？**もしそうなら結論から言うと一度VirtualBoxをアンインストールして、再度インストールすれば解決する可能性がある。
　**ウラは取っていない**が、予想するにWindows8から8.1にアップグレードする際にドライバが書き換わっているのではないだろうか。そうなると、8の時に設定した情報が8.1では通じなくなる…という流れなのではと考えている。再インストールする事で、その設定値が適切に再設定されるのだ。あくまで予想なので、その全容をご存知の方は補足を頂けたら幸い。

※同じ情報がVirtualBox Maniaでひっそり出ていたが、こちらにも書いておく。
iOS8シミュレータでキーボードが表示されなくなった場合の対処方法


## はじめに

iOS8のシミュレータでアプリのデバッグをしていた際に、突然キーボードが表示されなくなり、下記のエラーがコンソールに表示されていました。

![スクリーンショット 2014-09-23 1.31.58.png](https://qiita-image-store.s3.amazonaws.com/0/31823/6019c86e-5dbc-3440-fbf8-72c9dc2dcf39.png "スクリーンショット 2014-09-23 1.31.58.png")

```
Can't find keyplane that supports type 4 for keyboard iPhone-Portrait-NumberPad; using 3876877096_Portrait_iPhone-Simple-Pad_Default
```

こちらの原因として、PCから直接UITextViewなどに入力した際に、ハードウェアキーボードを使用するモードに切り替わってしまい、ソフトウェアキーボードが無効になってしまっているようです。

## 対処方法

メニューバーから下記のチェックを解除します。


`iOS Simulator -> Hardware -> Keyboard -> Connect Hardware Keyboard`

![スクリーンショット 2014-09-23 1.32.34.png](https://qiita-image-store.s3.amazonaws.com/0/31823/d838de7b-d458-309c-8e0e-22f984232d0d.png "スクリーンショット 2014-09-23 1.32.34.png")


# 参考資料

* [Xcode iOS 8 Keyboard types not supported (stackoverflow)](http://stackoverflow.com/questions/24871532/xcode-ios-8-keyboard-types-not-supported)
インストール環境としてDockerを使う


このリポジトリのInstall方法を見て、そういう手もあるか！とちょっと目から鱗でした。
https://github.com/dockerimages/docker-tools

これがインストール方法のコマンドです。

```bash
$docker run -v /home/frank/oha:/target dockerimages/docker-tools
```

Dockerイメージ内にインストールに必要な環境があって-vオプションでインストール場所を指定しているのです。
これなら実行には必要ないけどインストール時にgccとpythonとあれとこれとそれが必要なんだよねぇ～みたいな時でも簡単にインストールできますね。
phpに後から拡張モジュールを追加する

環境
OS:Ubuntu14.04
PHP:5.6.0
thinkpad T440p

phpに後からモジュールを追加して有効したいときにはsourceファイルの下にextというディレクトリがあるのでそこにあるものをビルドして設定を有効にする
php5.6のsourceは~/work/php-5.6.0にあるとする

#追加例

##mcrypt
インストール手順
http://php.net/manual/ja/mcrypt.installation.php

```
cd ~/work/php-5.6.0/ext/mcrypt
phpize
./configure --with-mcrypt  #php5.6のsourceコンパイル時につけてもいい

configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
```

何か怒られた。必要なものをインストールしておく

```
cd ~/work
wget http://jaist.dl.sourceforge.net/project/re2c/re2c/0.13.7.5/re2c-0.13.7.5.tar.gz
tar zxvf 
cd re2c-0.13.7.5
./configure
make 
sudo make install

sudo apt-get install libmcrypt-dev
```

モジュール追加作業再開(phpizeは先ほどやったので省略)

```
cd ~/work/php-5.6.0/ext/mcrypt
./configure --with-mcrypt
make
make test
sudo make install

Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-zts-20131226/
```
これで.soファイルがインストールされる
次にphp.iniファイルを編集して認識させる
php.iniがないならsourceディレクトリにあるphp.ini-productionなどのスケルトンをphp -iで見れるconfigurationの位置にコピーしておく（例えば、/usr/local/lib/php.ini)
extension_dirの位置と.soファイル名を追記する

```php.ini
extension_dir = "/usr/local/lib/php/extensions/no-debug-zts-20131226/"
extension=mcrypt.so
```

php -mで確認

##openssl
http://php.net/manual/ja/openssl.installation.php

```
cd source_dir/ext/openssl
phpize
./configure --with-openssl
make
make test
sudo make install

Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-zts-20131226/
```

php.iniにextension追記

```php.ini
・・・
extension=openssl.so
・・・
```
php -mで確認

##zip
http://php.net/manual/ja/zip.installation.php

```
cd source_dir/ext/zip
phpize
./configure --enable-zip
make
make test
sudo make install

Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-zts-20131226/
```
php.iniに追記

```php.ini
・・・
extension=zip.so
・・・

php -mで確認
```
Amazon DynamoDB制限事項


これは2014/09/22時点の内容です。
AWSのサービスは頻繁にアップデートされるので随時調査が必要です。

* http://aws.amazon.com/jp/dynamodb/faqs/
* http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html
* http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Limits.html (日本語)

## テーブル数

* 1アカウント1リージョンあたり256個まで（サポートに依頼すれば緩和できる）

## レコードサイズ

* １つの項目（レコード）の合計サイズは ~~64KBまで~~ 。（属性名と属性値を含む）

→ 400KBまでに拡張されました。(2014/10/8)
http://www.allthingsdistributed.com/2014/10/document-model-dynamodb.html


## BatchWriteItem

* Put または Delete で最大 25 項目
* 合計リクエストサイズは最大 1 MB

## BatchGetItems

* 1 回の応答のサイズ制限は 1 MB
* 最大 100 個の項目

## Query

* 1 応答あたりのサイズ上限は 1 MB

## Scan

* 合計サイズが1 MBまで。以降はLastEvaluatedKeyを使って取得。


## スループット

* スループットの上限はなし
* ただし、10,000 書き込み/秒または 10,000 読み込み/秒を超える場合は要連絡

## LSI(Local Secondary Index)

* LSI は [MC4] のすべての要素（テーブルとインデックス）の合計サイズを、ハッシュキー値ごとに 10 GBに制限します。
* 各テーブルに最大 5 個まで。

→ MC4て何じゃ。翻訳もれかな。

* LSIは、ハッシュおよび範囲キーがあるテーブルでのみ使用できます。ハッシュキーのみのテーブルでは LSI は使用できません。

## GSI(Global Secondary Index)

* 1クエリは 1 つの GSI しか使用できない。

## 項目コレクション

項目コレクションとは

> Amazon DynamoDB では、項目コレクションとは、テーブルおよび
> テーブルのローカルセカンダリインデックス全体で同じハッシュキーを持つ
> 任意の項目グループです。


* Amazon DynamoDB のすべての項目コレクションには、10 ギガバイトの最大サイズ制限が適用されます。
* 項目コレクションに対する 10 GB 制限は、ローカルセカンダリインデックスを含まないテーブルには適用されません。1 つ以上のローカルセカンダリインデックスを含むテーブルのみに影響します。

→　どっちだよ。
php5.6.0のインストール

環境
OS:Ubuntu14.04
DB:MariaDB 10.0.11 InnoDB、 PostgreSQL 9.3.5
Apache:2.4.10
thinkpad T440p

php本体と、apacheやdatabase用の拡張モジュールを適当に入れてみる

#インストール
sourceをダウンロード
http://php.net/downloads.php
展開(~/work/php-5.6.0$)

```
~/work/php-5.6.0$ ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql=mysqlnd --with-pdo-pgsql --with-pgsql

configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path
```
怒られた。PostgreSQLを標準と違う場所に入れていたため。

```
~/work/php-5.6.0$ ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql=mysqlnd --with-pdo-pgsql=/home/k/pgsql_work --with-pgsql=/home/user/pgsql_work
```
PostgreSQLをインストールしたディレクトリを指定していると上手く行く。後は
make
make test
sudo make install

#Apacheの設定
httpd.confを編集してモジュールをロードするようにする

```httpd.conf
#コメントアウトされていたら外す
LoadModule php5_module        modules/libphp5.so

#なければ追加、.phpファイルをphpファイルとしてパース出来るようにする
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
```

#確認
documentrootの下にphpinfo.phpをおいて確認
DocumentRootはhttpd.confに書いてある（"/usr/local/apache2/htdocs"とか自分で好き勝手設定する）

```phpinfo.php
<?php
phpinfo();
```

~$ apache_start 
http://localhost:8080/phpinfo.php
にアクセス

5.6のバージョンが見れたらOK

#phpで有効になっているモジュールの確認

```
php -m
・・・
mysql
mysqli
mysqlnd
pcre
PDO
pdo_mysql
pdo_pgsql
pdo_sqlite
pgsql
・・・

```
PostgreSQL 9.3.5インストールメモ

postgresql install memo

version:9.3.5

sourceをダウンロードしてinstall

```
./configure --prefix=/home/user/pgsql_work
make
make install
```
インストールしたディレクトリにデータを入れるディレクトリの作成

```
cd ~/pgsql_work
mkdir data
```
起動,接続

```
/home/user/pgsql_work/bin/initdb -D /home/user/pgsql_work/data
/home/user/pgsql_work/bin/postgres -D /home/user/pgsql_work/data >/home/user/pgsql_work/logfile 2>&1 &
/home/user/pgsql_work/bin/createdb test
/home/user/pgsql_work/bin/psql test
```
JSON-LD for Java

### JSON-LD for Java
JavaでJSON-LDを扱うためのライブラリが公開されていたのでメモ. 

GitHub - jsonld-java/jsonld-java JSON-LD implementation for Java
https://github.com/jsonld-java/jsonld-java

東京メトロの公開データがJSON-LD形式なのでいくつかでも参考になりそう. 
(コンテストに限ってはこのライブラリを駆使する程ではないかもしれないけれど...)

### Code example

```java
// Open a valid json(-ld) input file
InputStream inputStream = new FileInputStream("input.json");
// Read the file into an Object (The type of this object will be a List, Map, String, Boolean,
// Number or null depending on the root object in the file).
Object jsonObject = JsonUtils.fromInputStream(inputStream);
// Create a context JSON map containing prefixes and definitions
Map context = new HashMap();
// Customise context...
// Create an instance of JsonLdOptions with the standard JSON-LD options
JsonLdOptions options = new JsonLdOptions();
// Customise options...
// Call whichever JSONLD function you want! (e.g. compact)
Object compact = JsonLdProcessor.compact(jsonObject, context, options);
// Print out the result (or don't, it's your call!)
System.out.println(JsonUtils.toPrettyString(compact));
```

キーワードチェックのユーティリティなんかも用意されている様子.  

```java
    static boolean isKeyword(Object key) {
        if (!isString(key)) {
            return false;
        }
        return "@base".equals(key) || "@context".equals(key) || "@container".equals(key)
                || "@default".equals(key) || "@embed".equals(key) || "@explicit".equals(key)
                || "@graph".equals(key) || "@id".equals(key) || "@index".equals(key)
                || "@language".equals(key) || "@list".equals(key) || "@omitDefault".equals(key)
                || "@reverse".equals(key) || "@preserve".equals(key) || "@set".equals(key)
                || "@type".equals(key) || "@value".equals(key) || "@vocab".equals(key);
    }
```
apache 2.4.10のインストール

参考（コンパイルとインストール）
http://httpd.apache.org/docs/2.4/install.html

環境
OS:Ubuntu14.04
thinkpad T440p

#インストール

pcre 8.35を予めmake installしておく
http://www.pcre.org/

sourceのダウンロード
http://httpd.apache.org/download.cgi#apache24
展開(~/work/httpd-2.4.10$)

srclibの下にapr-1.5.1.tar.gzとapr-util-1.5.3.tar.gzを取得して展開
https://apr.apache.org/download.cgi

~/work/httpd-2.4.10/srclib$ ls
Makefile.in  apr-1.5.1  apr-1.5.1.tar.gz  apr-util-1.5.3  apr-util-1.5.3.tar.gz

ディレクトリ名はそれぞれaprとapr-utilに変更する
~/work/httpd-2.4.10/srclib$ ls
Makefile.in  apr  apr-1.5.1.tar.gz  apr-util  apr-util-1.5.3.tar.gz

source直下に戻ってビルド（~/work/httpd-2.4.10$）
./configure
make
sudo make install

#起動

~/work/httpd-2.4.10$ sudo /usr/local/apache2/bin/apachectl -k start

```
/usr/local/apache2/bin/httpd: error while loading shared libraries: 
libpcre.so.1: cannot open shared object file: No such file or directory
```

怒られた
最初にインストールしたpcreが認識されていないので認識させる
~/work/httpd-2.4.10$ sudo ldconfig

ついでにサーバ名設定を/usr/local/apache2/conf/httpd.confに追記

```httpd.conf

#ServerName www.example.com:80
ServerName localhost
```

ポートを8080に変更

```httpd.conf
#Listen 12.34.56.78:80
Listen 8080
```

再度実行
~/work/httpd-2.4.10$ sudo /usr/local/apache2/bin/apachectl -k start

ブラウザで8080番ポートを指定してアクセス
http://localhost:8080/

It worksと出ればOK

#停止
~/work/httpd-2.4.10$ sudo /usr/local/apache2/bin/apachectl -k stop

#再起動
~/work/httpd-2.4.10$ sudo /usr/local/apache2/bin/apachectl -k restart
CentOSにGhostScript9.1をソースから入れる

yumだとバージョンが8.7とか？らしく、
バージョン9.xが欲しかったのでソースから入れる。

## 事前に
これが要るそうなので事前に入れておく。

```
sudo yum install -y libXt-devel
```

## ソースファイルを入手
wgetで直接手に入れられるアドレスが見つからなかった・・・

ので、下記からダウンロードして、ディレクトリに手動配置した。
[http://sourceforge.jp/projects/sfnet_ghostscript/](http://sourceforge.jp/projects/sfnet_ghostscript/)
ダウンロードしたもの：ghostscript-9.10.tar.gz

```
[root@localhost src]# pwd
/usr/local/src

[root@localhost src]# ll
-rwxrwxrwx.  1 root root 35282727  9月 22 06:21 2014 ghostscript-9.10.tar.gz
```

## tar.gzを展開

```
tar xzvf ghostscript-9.10.tar.gz
```

```
[root@localhost src]# ll
合計 34460
drwxrwxr-x. 31 1000 1000     4096  9月 22 06:29 2014 ghostscript-9.10
-rwxrwxrwx.  1 root root 35282727  9月 22 06:21 2014 ghostscript-9.10.tar.gz
```

## ./config～make installする

```
cd ghostscript-9.10
./configure --disable-compile-inits --with-x --with-drivers=ALL --without-luratech --with-libiconv=gnu --prefix=/usr/local
make
make install
```

## 参考
* [CentOS 6.3にGhostscript 9.07とTeXLive 2012をインストールする](http://dokoka.org/wiki.cgi?page=CentOS+6%2E3%A4%CBGhostscript+9%2E07%A4%C8TeXLive+2012%A4%F2%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB%A4%B9%A4%EB)
* [Centos 6.4 + ghostscript 9.07 で日本語](http://granular.blog39.fc2.com/blog-entry-60.html)
* [Ghostscript SourceForge.net](http://sourceforge.jp/projects/sfnet_ghostscript/)
Mac OS X でOsaka-等幅を使う方法

# Osakaフォント
Osaka-等幅（Osaka-Mono）はmacにデフォルトで入っている唯一の等幅フォントです．
しかし，通常Osaka-等幅は指定出来ず，monospaceでOsakaを使わなければプロポーショナルフォントになってしまいます．
Osakaなんて等幅でしか使わないよ，という人はプロポーショナルなOsakaを封じてしまいましょう．
# Font Book.app
まず，アプリケーションから「Font Book.app」を開いてください．

![スクリーンショット 2014-09-22 20.37.45.png](https://qiita-image-store.s3.amazonaws.com/0/42214/e5316c3c-603a-e355-e445-9c3f4d1aefec.png)

一覧から「Osaka」を開いて「レギュラー」を副ボタンでクリック，使用停止してください．

![スクリーンショット 2014-09-22 20.38.00.png](https://qiita-image-store.s3.amazonaws.com/0/42214/1e102355-7a0f-1631-d6ba-1a18526e809e.png)

警告が出ますが問題ないので，遠慮なく使用停止してください．
レギュラーの文字が灰色になり，「切」の文字が出たらOKです．

![スクリーンショット 2014-09-22 20.40.21.png](https://qiita-image-store.s3.amazonaws.com/0/42214/921ee027-2e85-f214-1cab-83226cdb05d5.png)

これでmonospaceでなくてもOsakaをフォントとして指定すればOsaka-等幅を使えるようになります．
Kivyのインストール

PythonでiPhoneアプリを含めてクロスプラットフォーム開発する上ではKivyを使うのが良いらしいのでインストールすることにした．


以下の記事を参考にした．
http://kuroneko0208.hatenablog.com/entry/2014/03/15/163924


自分の環境はvirtualenvを使ってpython環境を区分けしているので微妙に違う部分もあるけど基本的には同じ．

1. cythonインストール
- pygameインストール
（※パッケージの前提条件を自分の環境は満たしていたので追加インストールなし）
- kivyインストール


コマンド的には以下のとおり
***
pip install cython
pip install hg+http://bitbucket.org/pygame/pygame
pip install git+https://github.com/kivy/kivy.git
***



途中でpythonのsetuptoolsのバージョンが古くて怒られたが
***
    The required version of setuptools (>=1.1.6) is not available,
    'easy_install -U setuptools'.
    (Currently using setuptools 0.6c11 (/Users/hogeuser/.virtualenvs/python_brew/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg))
    The required version of setuptools (>=1.1.6) is not available,
'easy_install -U setuptools'.
(Currently using setuptools 0.6c11 (/Users/hogeuser/.virtualenvs/python_brew/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg))
***


対策前進で問題なし
***
$ easy_install -U setuptools
***
集落の教え100読書メモ1

　デザインを仕事にしてきた方から紹介されて、[集落の教え100](http://www.amazon.co.jp/dp/4395005640)を読み始めました。ソフトウェアエンジニアとして、ソフトウェア設計は建築や芸術に通ずるものがあるのではないかという考えに至っています。ゆっくりですが、そのメモを残していきたいと思います。まずは[100のうちの1から3](http://togetter.com/li/421469)から。

# 1.あらゆる部分
```
　「あらゆる部分を計画せよ。あらゆる部分をデザインせよ。偶然に出来ていそうなスタイル、なにげない風情、自然発生的な見かけも、計算しつくされたデザインの結果である。」
```

``` P.8
　そうした諸部分を観察してゆくと、たまたまそうなってしまったかに伺える結果でも、次第に作った人の意図が見えてくるのかものなのだ。
　私達が設計するにあたっては、もちろん全ての部分をデザインしきれるものではない。したがって、どのような部分に意味を付与するか、何を持って＜意味ある部分＞として設定するかが課題となる。
```
　ソフトウェア設計も人がやっていることです。数学的にかつ論理的に辻褄が合い、構造的に美しいアウトプットを行うことをソフトウェアは可能にしますが、使うのも作るのも人である以上、人によるゆらぎと変化は避けられません。
　そういう意味で、全てに対して完璧を目指すのではなく、「どの部分に意味を付与するか」のようなこと（例えばフレームワークのような）を常に明確に時には変えながらソフトウェア設計を行っていこうと思いました。

# 2.同じもの
```
「同じものはつくるな。同じものになろうとするものは、すべて変形せよ」
```

``` P.10
集落に現状している諸要素は、すべて基本形の＜変形＞であって、それぞれは類似していると同時に差異をも指摘できるという性質を持っている。
　集落のもつ美学の特徴は、ひとるのカテゴリーのもとにつくられる部分の集合（たとえば住居の集合、換気塔の集合）は、要素間の類似と差異によって説明されるという点にある。集落が、どことなく一体性を保ちながら変化に豊んでいるのは、そうした諸部分の関係性によっている。
```
　プログラミングにはDRY（Don't Repeat Yourself）原則がありますが、重複が無いようにという意味では似ています。プログラミングの視点でのDRYというのは、重複は無駄とかメンテナンス性が損なわれるという意味合いはもちろんありますが、この章を読んで、そのような側面だけでなく、全く同じ人間が2人ともいないように、人間の営み自体同じものは2つと無いのだから、人間が使うソフトウェアも同じものがあるのは不自然だ、とも解釈できると思いました。

# 3.場所
```
「場所に力がある。」
```

``` P.12
　場所は、空間と同様に、さまざまに定義可能であり、その意味では便宜的に定義すればよい。場所を巧妙に定義することによって、想像力も豊かになるだろう。集落が教えるところは、場所をニュートラルに規定するのではなく、それに蓄えられた歴史の力、そこに潜在する自然力等々の力学的特性として把握せよという指示であって、アリストテレスが説明したように、空間を「容器」として捉える（運動をうながす原因としての性格）のことである。
```
　システム開発には多くの制約があります。会社の文化であったり、お客さんの特性であったり。プログラミングのようなどちらかというと普遍的に近い要素に加え、その制約を「容器」として捉え、それに逆らうのではなく、存在する前提でシステムを作っていくのが必要だと思います。
MacのターミナルでObjective-Cをコンパイルする方法


「新言語Swift！ ObCに比べて読みやすい！ iOSアプリ開発始めるぜえええ！！」と意気込んでいた一ヶ月ほど前の私ですが、まだ世の中にはObjective-Cで書かれたライブラリや情報が多く、SwiftだけでなくObjective-Cも文法ぐらいは理解する必要があるとようやく悟りました。

だいたいの文法を頭に入れるためにコマンドラインで練習をしようとするも、なかなかコンパイルが成功せず。つまった・・・。

今回進めたかったのはこちら↓ ソースコードも少し引用させていただいています。

一番初めのObjective-Cプログラム (3/3)
http://www.atmarkit.co.jp/ait/articles/0810/08/news117_3.html

Singer.h, Singer.m, Song.h, Song.m, main.mを作成してコンパイルします。main.mだけ載せておきます。

```main.m
#import "Song.h"
#import "Singer.h"

int main(void) {

    id song;
    id singer;

    song = [[Song alloc] init];
    [song setLyrics:@"それが僕達の奇跡"];
    
    singer = [[Singer alloc] init];
    [singer setSong:song];
    [singer sing];

    return 0;
}
```

## Foundationの場所を絶対パスで指定したらできた

私ははじめ、多くのチュートリアルと同様に以下のようにimportしておりました。

```Singer.m
#import <Foundation/NSObject.h>
#import <stdio.h>
（略）

```

するとコンパイルできず。

```
$ gcc -c main.m
```

-framework Foundationをつけてみたり、gccの最新版を入れてみたり、clangに変えてみたりしましたが効果なし。

「そもそもどこにあるんじゃあああ」とGoogle先生に叫んだら、ここにFoundationがどこに入ってるか書いてあると教えてくれました。

Foundation Framework Reference
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/ObjC_classic/_index.html

力技で美しくないけれどとりあえずこれでコンパイルは通るようになりました。


```
$ gcc -c main.m
$ gcc -c Song.m
$ gcc -c Singer.m
$ gcc -o myFirstProgram main.o Song.o Singer.o -framework Foundation
```

ちなみにgccをそのままclangに変えてもいけます。clangの方が王道みたいですね。∑
Knockout.JSのmapping pluginを使う


適当なAPIがJSONを返す際、mapping pluginを使うとViewModelの作成が楽になるのでメモ。

# 環境
Rails:4.0.3
gem:knockoutjs-rails

# 準備
```application.js
//= require knockout
//= require knockout.mapping
```
これを追加するだけ。かんたん。

# json

```js
{
  name: 'Scott',
  children: [
    { id : 1, name : 'Alice' },
    { id : 2, name : 'Tarou'}
  ]
}
```

# mappingとbindings
```coffeescript
view_model = ko.mapping.fromJS("先ほどのJsonが入る")
ko.applyBindings(view_model)
```

# Viewから使う
```haml
%h3{data: {bind: 'text: name'}}
%ul{data: {bind: 'foreach: children'}} Children
  %li{data: {bind: 'text: id'}}
  %li{data: {bind: 'text: name'}}
```

# まとめ
データ構造がそのままViewModelになり、かつ、各要素はbinding済みになる。ko.computed等込み入ったことがやりたい場合は幾つか方法があるみたいなので次回。
オブジェクトに差し込まれるモジュールが持つメソッド名のaccessorとその実行結果を追加する関数


```ruby
def create(obj, mod)
    obj.extend(mod)
    mod.instance_methods.each do |name|
        obj.instance_variable_set("@js_#{name}", obj.send(name))
    end

    obj
end
```

# なんぞ？
javascript側にDecoratorで処理した結果も格納して渡したかったから、こういうのおっけーかな〜と思ってやってみた。けど、tag_helper周りがしんどいので、そこら辺は素直にRailsでやったほうが良さげだった...
rspec3で複数のテストをまとめてpending

rspecにて以下のようなコードで特定のexampleをpendingに出来るのはもちろんご存知ですね。この例だと3つあるexampleの内、最初の一つがpendingになります。

```rb
describe User do
  describe 'validations' do
    describe 'username' do
      xit { is_expected.to    allow_value('hamada_akira').for(:username) }
      it { is_expected.to_not allow_value('hamada-akira').for(:username) }
      it { is_expected.to_not allow_value('hamada.akira').for(:username) }
    end
  end
end
```

### contextやdescribeについてもxでpending出来ないかな?

さすがrspec3。複数のテストを一気にpendingしたいなぁ〜、という時は以下のように`describe`についても`xdescribe`できます。`context`についても同様に`xcontext`でpending出来ます。

```rb
describe User do
  describe 'validations' do
    xdescribe 'username' do
      it { is_expected.to     allow_value('hamada_akira').for(:username) }
      it { is_expected.to_not allow_value('hamada-akira').for(:username) }
      it { is_expected.to_not allow_value('hamada.akira').for(:username) }
    end
  end
end
```

[RSpec 3の重要な変更(example groupの新しいエイリアス)](http://nilp.hatenablog.com/entry/2014/05/28/003335)
[Go] 構造体の初期化方法まとめ

# はじめに

構造体の初期化方法の違いについてまとめました。


# 実行環境

[Go Playground (go1.3.1)](http://play.golang.org/p/1VcPUlPk_3)


# 本記事で使用する構造体

以下の構造体を例に説明していきます。

```go
//
// 親クラス（のようなもの）
//
type Animal struct {
	Name string
	Age  int
}

//
// 子クラス（のようなもの）
//
type Cat struct {
	Animal // 構造体の埋め込み（以下の「補足」を参照）
	ServantName string
}
```

##　補足（構造体の埋め込みについて）

Go 言語に「クラスの継承」という概念はありません。しかし、「構造体の埋め込み」を使うことで、それに似たようなことが実現できます。

```go
//
// Cat 構造体の初期化
//
c := Cat{}

//
// Name は本来 Animal 構造体のフィールド変数だが、「構造体の埋め込み」を使うことで、
// Cat 構造体のフィールド変数と同じようにアクセスすることができる。
//
c.Name = "kuro"
fmt.Println(c.Name) // => kuro
```

詳細は、[実践Go言語](http://golang.jp/effective_go#embedding)を参照してください。


# 複数行で初期化する方法

## Animal 構造体（親クラスのようなもの）

```go
a := Animal{}
// var a Animal = Animal{} // 上記と同じ意味
// var a Animal           //  上記と同じ意味

a.Name = "hoge"
a.Age = 5
```

## Cat 構造体（子クラスのようなもの）

```go
c := Cat{}
// var c Cat = Cat{} // 上記と同じ意味
// var c Cat         // 上記と同じ意味

c.Name = "kuro"
c.Age = 1
c.ServantName = "taro"
```


# 一行で初期化する方法

## Animal 構造体（親クラスのようなもの）

### フィールド名を指定しない場合

```go
a := Animal{"hoge", 5}
// var a Animal = Animal{"hoge", 5} // 上記と同じ意味
```

フィールド変数の一部を省略することはできません。

```go
a := Animal{"hoge"} // => too few values in struct initializer
```

### フィールド名を指定する場合

フィールド変数の順番は好きなように指定できます。

```go
a1 := Animal{Name: "hoge", Age: 5}
a2 := Animal{Age: 5, Name: "hoge"}
```

フィールド名を指定する場合は、フィールド変数の一部を省略することができます。

```go
a1 := Animal{Age: 5}       // => { 5}　   : Name はゼロ値（string 型の場合は、空文字列）になる
a2 := Animal{Name: "hoge"} // => {hoge 0} : Age はゼロ値（int 型の場合は、0）になる
```

## Cat 構造体（子クラスのようなもの）

### フィールド名を指定しない場合

```go
c := Cat{Animal{"kuro", 1}, "taro"}
// var c Cat = Cat{Animal{"kuro", 1}, "taro"} // 上記と同じ意味
```

フィールド変数の一部を省略することはできません。

```go
c := Cat{Animal{"kuro", 1}} // => too few values in struct initializer
```

### フィールド名を指定する場合

フィールド変数の順番は好きなように指定できます。

```go
c1 := Cat{Animal: Animal{"kuro", 1}, ServantName: "taro"}
c2 := Cat{ServantName: "taro", Animal: Animal{"kuro", 1}}
```


フィールド名を指定する場合は、フィールド変数の一部を省略することができます。

```go
c := Cat{Animal: Animal{"kuro", 1}}　// => {{kuro 1} } : ServantName はゼロ値（string 型の場合は、空文字列）になる
c := Cat{ServantName: "taro"}       // => {{ 0} taro} : Animal 構造体の各フィールド（Name：string型、Age：int型）はゼロ値になる
```


# new を使う方法

```go
a := new(Animal)
// a := &Animal{} // 上記と同じ意味

a.Name = "hoge"
a.Age = 5
```

`new(Animal)`　は、`&Animal{}` と同じ意味です。`new(Animal)` は、Animal 構造体へのポインタを返します。


## new(Animal) と &Animal{} の違い

`&Animal{}` は、一行で初期化することができますが、`new(Animal)` はできません。

```go
//
// 一行で初期化できる。
//
a1 := &Animal{"hoge", 5}

//
// 一行で初期化できない。new(Animal) でなければならない。
//
a2 := new(Animal{"hoge", 5}) // => Animal literal is not a type
```


# おまけ（make について）

make はマップ、スライス、チャネルを初期化するために使う関数です。構造体の初期化には使えません。new と混同しやすいので注意してください。

```go
a := make(Animal)　// => cannot make type Animal
```


# 参考文献

[実践Go言語](http://golang.jp/effective_go)

[How to Initializing embedded struct field using a struct literal?](https://groups.google.com/forum/#!topic/golang-nuts/FS_H0SiEioA)
Vagrantでheroku向けの環境を作ってみる

# 概要
Herokuでなにかアプリを作ってみたいと思い、簡単に開発環境を構築できないか調べていたら、こんなものをみつけました。

https://vagrantcloud.com/cbumgard/boxes/nodejs

Vagrantを使用して開発環境を構築するもののようです。Herokuにも対応しているようで、ちょっと調べつつ実行してみたことの忘備録です。

# 使用環境
* Vagrant
* Virtual box
* nodejs-vagrant

## nodejs-vagrantに含まれるもの
* Ubuntu 12.04 32-bit 
* Node.js
* MongoDB
* Redis 
* Heroku 
* Travis-CI
* git
* vim

# 開発環境の構築
## Vagrantのインストール
下記を参照。
http://vagrantup.com

## VirtualBoxのインストール
下記を参照。
https://www.virtualbox.org/wiki/Downloads

## Vagrant Boxのインストール
Vagrant、Virtual boxインストールの後、次のコマンドを実行する。

	mkdir DIR && cd DIR
	vagrant init cbumgard/nodejs
	vagrant up
	vagrant ssh




**NOTE: Vagrantからのインストール中にNFS（ネットワークファイルシステム）のフォルダの同期のためのパスワードを聞かれる。**

### ソースコード
ソースコードは次のgithubから入手可能。
https://github.com/cbumgard/nodejs-vagrant

# 動作確認

## 仮想マシン中のコードの変更とホストマシンの同期

ホストマシンのホームディレクトリ（~/）はVagrant中の仮想マシンの/host/に同期している。例えばホストマシンの~/code/フォルダ中にソースを仮想マシンと同期して使用したい場合には、仮想マシンの/host/codeで使用することができる。

## MongoDBとRedisの確認
コンソール中で以下のコマンドを実行して確認。

	mongo
	redis-cli

## GitHub
GitHubのセットアップ。

	ssh-keygen -t rsa

公開鍵が作成されるので、仮想マシン中の~/.ssh/id_rsa.pubを自分のGitHubアカウントのhttps://github.com/settings/ssh にコピーする

	git config --global user.name '<your name>'
	git config --global user.email <your email>

## Heroku
下記のコマンドを実行してHerokuのセットアップを行う。

	heroku login
	heroku keys:add

## Travis-CI
下記コマンドを実行して確認する。

	travis login
	travis login --pro

### travisにログインしようとすると、エラーとなった
以下のエラーが出力。

	Outdated CLI version, run `gem install travis` or use --skip-version-check.

travisがインストールされていなかったようなので、次のコマンドでインストールした。
	
	sudo gem install travis
Touch ID: Local Authentication の機能を追加してみる


- [Introduction to Touch ID | Xamarin](http://developer.xamarin.com/guides/ios/platform_features/introduction_to_touchid/) の写経


# Local Authenticationするゲートの画面を追加

## View Controller をRoot画面で追加

追加する

![image](https://lh4.googleusercontent.com/-zO-MKDUzxAU/VB_wfBG80aI/AAAAAAAAA0s/ZsDIkbeocmI/w248-h308-no/1.%2BAdd%2BNew%2BView%2BController.png)

リネームする

![image](https://lh6.googleusercontent.com/-uFJNGteyZKQ/VB_wfVnS1rI/AAAAAAAAA1c/m7-LcfBYRl8/w422-h264-no/2.%2BName%2Bit.png)

Rootにする

![image](https://lh6.googleusercontent.com/-2gAEPZ28z1M/VB_wfCur0zI/AAAAAAAAA00/GQXuHihc-tE/w622-h374-no/3.%2BChange%2Bthe%2BRoot%2BView%2BController%2Bto%2Bthe%2Bnew%2Bone.png)


ボタン追加とリネーム

![image](https://lh4.googleusercontent.com/-gYNGHVx5faQ/VB_wgGW176I/AAAAAAAAA1I/xaEPQsBzZMU/w888-h327-no/5.%2BRename%2Bthe%2BButton.png)


新Rootから旧Rootにセグエ追加

![image](https://lh5.googleusercontent.com/-cwqFTwbt810/VB_wgC5tLRI/AAAAAAAAA1M/M6Lx6jI0rs0/w649-h301-no/6.%2BAdd%2Bnew%2BSegue%2Bfrom%2BRoot%2Bto%2Bthe%2Bold%2Broot.png)

リネーム

![image](https://lh3.googleusercontent.com/-NSeX1JuPPZE/VB_wgnjUaGI/AAAAAAAAA1Q/MA4tPOttZEA/w902-h290-no/7.%2BRename%2Bthe%2Bnew%2BSegue.png)


# ボタンのハンドラ追加

追加したボタンをダブクリして、ハンドラ追加してコードをコピペ:

~~~csharp

		void AuthenticateMe (UIButton sender) 
		{	 
			var context = new LAContext(); 
			NSError AuthError; 
			var myReason = new NSString("To add a new chore"); 

			if (context.CanEvaluatePolicy(
				LAPolicy.DeviceOwnerAuthenticationWithBiometrics, 
				out AuthError)){ 

				var replyHandler = new LAContextReplyHandler((success, error) => 
					{ 
						this.InvokeOnMainThread(()=>{ 
							if(success){ 
								Console.WriteLine("You logged in!"); 
								PerformSegue("AuthenticationSegue", this); 
							} else{ 
								//Show fallback mechanism here 
							} 
						}); 
					}); 
				context.EvaluatePolicy(
					LAPolicy.DeviceOwnerAuthenticationWithBiometrics, myReason, replyHandler); 
			}; 
		}

		partial void AuthenticateButton_TouchUpInside (UIButton sender)
		{
			this.AuthenticateMe(sender);
		}
~~~		

# ターゲットOS変更

![image](https://lh6.googleusercontent.com/-wn6DSDGMdhQ/VB_whDKyOJI/AAAAAAAAA1Y/2tGeCn_3PbU/w831-h524-no/8.%2BChange%2BiOS%2BTarget%2Bto%2B8.png)


# 実行

親指だと認証と追ってしまうので、人差し指使ってスクショ取ったために認証エラーになっている。親指だと認証通って、セグエでPushする先のView Controllerに移動します。

![image](https://lh3.googleusercontent.com/-D5brbz1ykSA/VB_0kU7W8mI/AAAAAAAAA2I/De4zzfA8dcI/w322-h572-no/22%2B-%2B1)
CapybaraのPoltergeistを使ったテストでブラウザの別のタブに移動する

例えばRailsのFeature Specsなんかでリンクをクリックするとページ遷移せずに新しいタブが開いて、そちらのタブの内容をCapybaraでテストしたい場合があると思います。通常は新しいタブが開いても元のページのままなのですが、Poltergeistの`within_window`というメソッドを使うとタブを移動することが出来ます。

```rb
handle = page.driver.browser.window_handles.last

page.driver.browser.within_window(handle) do
  # ブロック内ではタブが移動
  expect(page).to have_css('canvas')
end
```

なおmasterブランチには`switch_to_window`というメソッドが追加されており、こちらはメソッド実行後にタブが移動します。
node.jsでログをファイル出力する


ロギングは設定が簡単なlog4jsを使用します。

### log4jsインストール

```
npm install log4js --save
```

### ログ設定ファイルを作る

```
vi logger.js
```

filenameの指定で「./」ここはプロジェクトルートをさすので注意

```logger.js
var log4js = require('log4js');
var logger = exports = module.exports = {};
log4js.configure({
     appenders: [
         {
             "type": "file",
             "category": "request",
             "filename": "./logs/request.log",
             "pattern": "-yyyy-MM-dd"
         }
	]
});

logger.request = log4js.getLogger('request');
```

### logsディレクトリを作る
```
mkdir logs
```

### ログ出力してみる！
```
vi index.js
```

```index.js
var express = require('express');
var router = express.Router();
var logger = require('./logger');


router.get('/', function(req, res) {
  logger.request.info('url:'+ decodeURI(req.url));
  res.send(200);
});
```

### ログファイルを確認
```
[2014-09-22 18:34:58.943] [INFO] request - http://localhost:3000/
```
ok!

### まとめ
* 設定ファイルのfilenameパス設定ではまった...
* シンプルで使いやすい
* 次はfluentd と組み合わせてログ活用したい
HTMLのinput type="reset"の仕様を勘違いしていた

# HTMLのinput type="reset"の仕様を勘違いしていた

よくフォームのクリアとして

```html
<input type="reset" value="クリア" />
```

みたいなHTMLを使っている記事を見かけますが、どうやら、その使い方はおかしいらしい。

[W3Cのドキュメント](http://www.w3.org/TR/html401/interact/forms.html#h-17.2.1)を読んでみると、どうやら`type="reset"`はHTMLが読み込まれた段階での値にリセットするということだった。つまり

```html
<input type="text" value="hello" />
<input type="reset" value="クリア" />
```

とかの場合は、クリアボタンを押したときには、フォームが空白になるわけではなく、"hello"に戻ってしまう。

なので、値を空にするためにはちゃんとjavascriptとかで、空にするように記述しないといけないみたい。。。
TF-IDF Cos類似度推定法

# TF-IDF Cos類似度推定法

TF-IDF Cos類似度推定法は文書の類似度を計算するのによく使われている方法です。大きく分けて、

- TF-IDFの計算
- Cos類似度の計算

の二つのステップに分かれます。

## TF-IDFの計算
TF-IDFは名前の通り、TFとIDFの積を表しています。ある単語のTF-IDFがその単語の重要度になります。

### TF
TFは対象の文章の中でどれだけその単語が重要かを表す指標です。現れる単語数をN, その単語の出現回数をnとすると

```
TF = n/N
```

で表されます。
端的に言うと、**繰り返し出現している単語が大事**ということです。

### IDF
IDFはその単語自体がどれだけ特徴的な言葉かを表す値です。
例えば、「する」や「なる」などは多くの文章に含まれる単語なので重要度は低く、「爆発」や「破壊」などは滅多に使うことのない言葉なので、重要度が高いということです。

全体でD個の文章を持ったデータベースがあるとして、そのうち、対象の単語を含む文章がd個あったとき、IDFは以下の式で表されます。

```
IDF = -log(d/D)
```

ここで、d/Dは対象の単語が使われている文章の割合で、0〜1の範囲のものです。全ての文章に含まれている単語（割合=1）のとき、重要度はないので、IDF=0になり、一つも含まれていない単語(割合=0)とときは無限大になります。情報理論の知見がある人には、単語の情報量といったら分かりやすいかもしれません。

降水確率100%で雨が降っても普通のことですが、降水確率0%のときに雨が降ったらすごく驚く、みたいな感じの話です。

## Cos類似度の計算

ベクトル**v1**, **v2**の内積は

```
v1・v2= |v1||v2|cosθ
```

で表されます。
二つのベクトルが同じ方向を向いていたときは`cosθ=1`, 反対方向を向いていたときは`cosθ=-1`になるので、これを類似度の指標として使おうという考え方です。

文章の類似度は単語の出現頻度の列で表されます。

例えば、次の二つの文章があるとします。

- 「リンゴとみかん、みかんとバナナ」という文章A
- 「リンゴとバナナ、バナナとキウイ」という文章B

これらをそれぞれ文章に表すと

```
A: (リンゴ, みかん, バナナ, キウイ) = (1, 2, 1, 0)
B: (リンゴ, みかん, バナナ, キウイ) = (1, 0, 2, 1)
```

というベクトルになります。

この二つのベクトルの類似度を求めると

```
A・B = 1*1 + 2*0 + 1*2 + 0*1 = 3
|A| = sqrt(1*1 + 2*2 + 1*1 + 0*0) = sqrt(6)
|B| = sqrt(1*1 + 0*0 + 2*2 + 1*1) = sqrt(6)
```

となり、

```
cosθ = A・B/|A||B| = 3/sqrt(6)sqrt(6) = 3/6 = 0.5
```

となるので、類似度は0.5となります。

## TF-IDF Cos類似度推定法

TF-IDF Cos類似度推定法ではCos類似度の計算方法に使うベクトルの成分をTF-IDFにしたものです。

例えば、さっきの例では、リンゴ、

```
TF(A,リンゴ) = 1/4, TF(A,みかん) = 2/4, TF(A,バナナ) = 1/4, TF(A,キウイ) = 0
TF(B,リンゴ) = 1/4, TF(B,みかん) = 0, TF(B,バナナ) = 2/4, TF(B,キウイ) = 1/4
```

それぞれのIDFを
仮に、IDF(リンゴ) = 10, IDF(みかん) = 5, IDF(バナナ) = 3, IDF(キウイ) = 1とすると、TF-IDFのベクトルは

```
A: (リンゴ, みかん, バナナ, キウイ)=(1/4*10, 2/4*5, 1/4*3, 0*1) = (2.5, 2.5, 0.75, 0)
B: (リンゴ, みかん, バナナ, キウイ)=(1/4*10, 0*5, 2/4*3, 1/4*1) = (2.5, 0, 1.5, 0.25)
```

あとはさっきと同じようにcosθを計算するだけです。

```
A・B = 2.5*2.5 + 2.5*0 + 0.75*1.5 + 0*0.25 = 7.375
|A| = 3.614, |B| = 2.926

cosθ = 0.6974
```

となって、0.6974という類似度が算出されます。
Laravel 4 production 環境での php artisan migrate や db:seed の実行


Laravel 4.2 の production 環境で、`php artisan migrate` や `php artisan db:seed` を実行すると、本当に実行して良いか確認を求められる。

![1. vagrant@jtsc__share (tmux).png](https://qiita-image-store.s3.amazonaws.com/0/12272/7d38e1e1-5dd5-41c0-12b1-dd0305b712ee.png "1. vagrant@jtsc__share (tmux).png")

コンソールで手動で実行する場合は、`y` を入力すれば良いのだが、デプロイツールで自動実行している場合は、`--force` オプションを付けると強制的に実行できる。

```
$ php artisan migrate --env=production --force
```

Ansible でデプロイしようとして、`php artisan migrate` を実行したところで処理が止まるので、おかしいなあと思ったら、これでした。
Ruby 1.9.3以降でパスワード付きZipをメールで送りたい

# Ruby 1.9.3以降でパスワード付きZipをメールで送りたい

今回やりたかったのはパスワード付きだったのに、開発が継続されているGemではパスワード付きができなかった。なので、無理矢理`zip`コマンドを使ってパスワード付きのファイルを作ってやることに。

これにはGemはとくに必要なし。

## Mailer

```
class SampleMailer < ActionMailer::Base
  default from: "test@fusic.co.jp"

  def sample
    password = "password" #パスワードを入力

    if @scores.count>0
      dir = "#{Rails.root}/tmp/send_files/"
      file_name = "sample-#{Time.now}"

      File.open(dir+file_name+".txt", 'w') do |f|
        f.print("いちぎょうめ\n")
        f.print("にぎょうめ\n")
      end

      # zipで固めて
      system "zip -P #{password} '#{dir}#{file_name}.zip' '#{dir}#{file_name}.txt' -j"

      # 添付する
      attachments[file_name+".zip"] = File.read("#{dir}#{file_name}.zip")

      # 使った後はゴミになるので削除
      File.delete(dir+file_name+".txt")
      File.delete(dir+file_name+".zip")
    end

    mail to: emails # メール送信
  end
end

```

## 注意点
サーバーにデフォルトでは`zip`は入ってないと思うので

```
sudo yum install -y zip
```

してやりましょう。
【Git】remoteにpush済のファイルを以前の状態に戻す方法


###使いどころ
remoteにpushしたファイルをpush以前の状態に戻したい

```
$ git log --online
af71fff commit3
274c385 commit2 # hoge.rbを間違ってpushした
58408c8 commit1
```

commit2で変更するつもりのないファイルをcommitした場合、
そのファイルだけcommit1の状態に戻したい。

###コマンド

```
git checkout -p {戻したい状態のコミットのハッシュ値} {戻したいファイル名}
```

上の例だと

```
git checkout -p 58408c8 hoge.rb
```

でhoge.rbだけcommit1の状態に戻せる。
self XSS についてと、SNS の JS コンソールいろいろ

昔からあるみたいなんだけど、qiita で記事検索してみたら無かったので投稿してみる。
selfXSS について。

# とっても便利な JS コンソール
ちょっとした JS コードを動かすなら、chrome の JavaScript コンソールが便利だ。
chrome の右上、[八卦](http://ja.wikipedia.org/wiki/%E5%85%AB%E5%8D%A6)で言うと「乾」みたいなマークを押し、ツール→ JavaScript コンソール で画面下側にコンソールが開いて、色々と実験が出来る。
同じものが Mac なら command + option + J で開く。手元に windows PC が無いが、たぶん ctrl + shift + j とかで開くはず。

ある日、facebook を開いているときに JS コンソールを開いたら、次のような警告が出た。

![スクリーンショット 2014-09-22 17.05.14.png](https://qiita-image-store.s3.amazonaws.com/0/38864/6fc4f1ed-8056-01d2-088f-e5e0f44a6e7d.png)

悪意のあるコードを貼り付け無いように注意するとともに、 [セルフXSSとは何ですか](http://www.facebook.com/selfxss) というページへのリンクが貼られている。

我々開発者は、SNS や EC サイト開発の際、不断の努力によって「A さんが B さんの個人情報を奪う」というのを防いでいる（ドヤァ）。
ところが、「A さんが A さん自身の個人情報を見る」というのはどうにも対策しようが無い。これを防いでしまうと、SNS が SNS でなくなってしまうからだ。
だから、ある程度盗みにくくすることはできるけれども、悪意のある第三者が善意のユーザーをだまくらかして、ユーザー自身が悪意のあるコードを貼り付けてしまうのを防ぐことが完全には出来ない。

それを受けての、この JS コンソールだと思われる。

# その他の SNS
## Twitter
![スクリーンショット 2014-09-22 18.20.23.png](https://qiita-image-store.s3.amazonaws.com/0/38864/30e7df19-bcae-2123-5fbe-fde6ff857f34.png)
特に注意文は無いが、console.log 関数を上書きして何も表示されないようにしている。

## Google+
![スクリーンショット 2014-09-22 18.21.42.png](https://qiita-image-store.s3.amazonaws.com/0/38864/32100c3b-646c-bd60-faa3-1a651746ce63.png)

## mixi
![スクリーンショット 2014-09-22 18.23.08.png](https://qiita-image-store.s3.amazonaws.com/0/38864/6151f34c-4e5e-5725-a779-fcfaa9aa36b9.png)
mixiェ…

# まとめ
self XSS への対策については（まだあんまり調べてないけど）、

- Facebook, Google+ のようにコンソールに警告を出す
- Twitter のように console や alert など、主要な API を何もしない関数に上書きしてしまう

などの合わせ技が有効かと思われる。
gulpfileをTypeScriptで書いて安心を得よう

Gruntと比較すると```gulp```のgulpfile（設定ファイル）はコードの記述が多くを占めるので、TypeScriptで記述したくなります。幸い、```gulp```は```interpret```というモジュールでgulpfileを読み込むので、altJSで記述するのは比較的簡単にできます。

gulpfileをTypeScriptで記述するためには、**```typescript-require```**というモジュールをinstallしておく必要があります。

```shell-session:typescript-requireのインストール
$ npm install --save-dev typescript-require
```

後は**gulpfile.js**を**gulpfile.ts**にリネームして、それ以降TypeScriptとしてコーディングするだけです。

ちなみに、```gulp```の定義ファイルも提供されているので取得しておくと便利です。

```shell-session:定義ファイルのインストール（必要ならtsdも）
$ npm install -g tsd
$ tsd query gulp -rosa install
```

```ts:gulpfile.ts
/// <reference path="./typings/tsd.d.ts"/>
import gulp = require('gulp');

gulp.task('default', () => {
    // 色々
    // ゴリゴリコード書いてもコンパイラさんが手伝ってくれるよ！安心だね！
});
```

そのまま```gulp```コマンドを実行すればgulpfile.tsが読み込まれます。

```shell-session:defaultビルド
$ gulp
```
rspec3で引数を持つメソッドチェーンをstub化する

rspec3ではstub_chainが廃止された。

これ

```rb
AnimalPage.where('title like ?', "%#{word}%").page(1).per(per_page).title_asc
```

たとえばこんな感じ

```rb
allow(AnimalPage).to receive_message_chain(:where, :page, :per, :title_asc)
  .with(anything).with(1).with(per_page).with(no_args)
  .and_return([])
```

`allow`は`expect`でもいける。
引数なしのパターン、`with()`にすると怒られた。
SublimeText2 から SQL を実行

個別の sublime-project ファイルにビルドシステムを設定しておく。
こんな感じ。

```json:Build.sublime-project
{
    "folders":
    [
        {
            "path": "/Users/xxxx"
        }
    ],
    "build_systems" : [{
        "name": "PostgreSQL",
        "cmd": ["psql", "-U", "username", "dbname", "-f", "$file"],  
        "selector": "source.sql"
    }, {
        "name": "MySQL",
        "cmd": ["mysql", "-u", "user", "-pxxx", "dbname", "--default-character-set=utf8", "-e", "source $file"],
        "selector": "source.sql" 
    }]
}
```

あとはSQLファイルを開いて `Tool->Build System` で設定。
すると `⌘+B` でSQL実行結果が表示されます。
Rails4 + bootstrap3


## 環境
* Mac OS X 10.9.4 Darwin
* Rails 4.1.5
* Ruby 2.1.2p95
* gem 2.2.2
* bundle 1.7.2
* rbenv 0.4.0
* rake 10.3.2

## インストール手順
$ rails new bootstrap_test
$ cd bootstrap_test
$ rails g scaffold book title:string value:integer
$ rake db:migrate
$ vim Gemfile

```ruby:
# Twitter Bootstrap
gem 'twitter-bootstrap-rails'
gem "therubyracer"
gem "less-rails"
```

$ bundle install
$ rails g bootstrap:install
$ rails g bootstrap:layout application fluid
$ rails s
Winows7にchefでnode.jsを導入する

Windows用のchef-soloとknife-soloが導入済みの状態で始めました。

色々調べたところ、windowsでchefを上手く使うには、windowsというcookbookは必須な様子。
knife cookbook site install windows

windowsには下記のcookbookが必要な様子。
knife cookbook site install chef_handler

nodeをインストールしたいので、これをゲット。
Windows用node.jsのcookbookは、これが良いようです。
knife cookbook site install nodejs-windows

cookbookの正体が知りたいときはこのサイトへ。
https://community.opscode.com/

まとめますと、

win_default.json　のようなファイルに、

```
{
    "run_list" : [
            "recipe[windows]",
            "recipe[nodejs-windows]"
                ]
                }
```

のように書いておいて、chef-repo　直下に置いて、

knife cookbook site install chef_handle
knife cookbook site install windows
knife cookbook site install nodejs-windows

とやって、必要なcookbookをゲットしておいて、

chef-solo -c solo.rb -j win_default.json

を実行します。実行は管理者権限で行ってください。

これでnodeのインストーラーが実行されますが、PATHは自分で設定しないといけません。これも自動化するのが次の課題ですが、windowsではどうやるんだろう。

cookbook取得の自動化を考えているのですが、それよりも、chef-repoを丸ごとgitしておくのが一般的なんですかねえ。

Windowsでchefを利用するのは、あまり簡単にいかないですね。
それでも、可能な限りchefを使った方がメリットが大きいと思います。複数名のメンバーに開発用PCを配布してプロジェクトを進める場合、開発環境を揃えるのに有益だと思います。でもcookbookが少なかったり、webサイト等での情報が少なかったりして、まだこなれてないのかな、と思います。
Laravel 4 Viewテンプレートファイルの拡張子を追加する


Laravel 4 では、`View::make()` で読み込むテンプレートファイルは、拡張子が `.php` か `.blade.php` になっています。

下記のように、View::make() に直接、拡張子を追加すると、`data.js.php` というファイルではなく、フレームワークが `.` を `/` に置換するため、`data/js/php.(php|blade.php)`として解釈されます。

```php
Route::get('/', function() {
    return View::make('data.js.php');
});
```

独自の拡張子を利用したい場合は、`View::addExtension()` を使って、テンプレートファイルの拡張子として認識させます。

下記では、`js.php` という拡張子のファイルを PHP ファイルとして扱うように指定しています。

```php
View::addExtension('js.php', 'php'); // js.php という拡張子を、PHP として扱う

Route::get('/', function() {
    return View::make('data'); // 拡張子は記述しない
});
```