OmniAICreator/Qiita-1.07M huggingface dataset:
S3の利用料金を正しく理解する(意外と知らない"期間"の考え方)


##はじめに

S3の料金って、$0.033/GBというのはよく見かけるし、周知の事実だと思います。

営業が「S3って安いですよ！1GBで月4円くらいですよ！」って触れ込んだりしますが、
でもこれ、`「期間」に触れられていない`ので、正しく理解できているとは言えません。

厳密には、`月の平均使用量に対して、$0.033/GB課金される`という意味なのです。


以下、簡単な例とともに、課金の考え方について整理しておきます。

##考え方

<b>例）1/1に10GB、1/31に100GBのファイルをUPした場合</b>

単純に考えると、
>月末、S3上には110GBあるから、110GB * $0.033 = $3.63

と考えたくなるのですが、実際はそうではありません。

>
　10GBを744時間使用
　100GBを24時間使用

と考えます。
つまり、

>
 10GB  * 744h = 7440GB
 100GB *  24h = 2400GB
 月平均使用量 = (7440GB + 2400GB) ÷ 744h = 13.17 GB
 
と考え、これに対して$0.033が課金されます。
よって、

>13.17GB * $0.033 = $0.43


となります。単純計算するよりも安くなります。
そりゃそうですよね。110GBをひと月まるまる使ってる訳じゃないんですから。


##まとめ

ざっくり見積もる分には前者で構わないのですが、運用開始後にお客様がコストの実績計算することを考えると
こういう考え方を知っていた方が良いと思います。
そんな時に"もう一歩"踏み込んだ説明ができると、お客様からの信頼もグッと上がると思いますので、
ご参考になれば幸いです、、、って当たり前か。FAQにも書いてあるし。（笑）

なお、今後値下げされる可能性大なので、
将来的な見積もりする際にここまでやってもほぼ無意味という現実もありますのでご注意を。
Macのターミナルからunityを起動する

Macのターミナル作業中、Unityを起動するのにGUI操作するのが面倒くさいので。

#カレントディレクトリをプロジェクトとして開く

```
/Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath "`pwd`" &
```

`pwd`が`.`だとうまくいかなかった。
カレントディレクトリがUnityプロジェクトじゃない場合は、普通のプロジェクト選択画面が出るみたい。

#より便利に

いちいち打ってたらそっちのが面倒くさいので、シェル関数にする。
（aliasにしたかったけど、pwdがうまく展開できなかった）
ついでに引数でプロジェクトを指定できるようにする。

```sh:.bashrc
unity () {
        local project_path=""
        if [ $# -ge 1 ] ; then
                if [ -d "$1" ] ; then
                        project_path="$(cd "$1" && pwd)"
                else
                        project_path="$(cd "$(dirname "$1")" && pwd)"
                fi
        else
                project_path="`pwd`"
        fi
                echo "unity open project : ${project_path}"
                /Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath "${project_path}" &
}
```

おわり。
【PHP】指定年月の末日を取得する方法

指定日時が取得できるmktimeを使用する。
日に0を指定すると前月の末日が取得できるのがポイント

```php
$lastday = new DateTime(date('Y-m-d',        //日付の形式 Y：年(西暦4桁)、m：月(01～12)、d：日(01～31)
                             mktime(0,       //時
                                    0,       //分
                                    0,       //秒
                                    '03'+1,  //月(翌月)
                                    0,       //日(0を指定すると前月の末日)
                                    '2015'   //年
                                   )));

```

```php:出力
$lastday->format('Y-m-d');  // '2015-03-31'
```
[Rails4] link_to でアンカー(#hogehoge)を使いたい場合など

めもです。

```rb:routes
kuchikomi   GET /kuchikomis/:id/:tab_id(.:format)  kuchikomis#show {:tab_id=>"all_kuchikomi_tab"}
```

で

```rb
/kuchikomis/1234/good_kuchikomi_tab#good_kuchikomi1234
```

↑な感じのURLにしたいとき。

```erb
<%= link_to hoge_path(kuchikomi.id, "good_kuchikomi_tab", :anchor => "good_kuchikomi" + kuchikomi.id.to_s), class: "pull-left" do %>
```

↑こう。

やり方はこんな感じで、:anchor => "hogehoge"  でいける。 anchor: "hogehoge"でも。

（URL自体が、例としてでも綺麗じゃないけど、今回は、、、）
SublimeText2でのタブ移動ショートカットをchromeっぽくする

[SublimeText2] -> [Preferences] -> [Key Bindings - Defaults]に以下記入

```
/*
自分用
*/
[
	{ "keys": ["ctrl+shift+tab"], "command": "prev_view" },
	{ "keys": ["ctrl+tab"], "command": "next_view" }
]
```
【CakePHP2.x】曜日の表示を日本語化する

PHPのdate関数を使うと、容易に曜日を取得できます。


```php
date('D',strtotime('2015-02-25'))； // Wed(3文字の短縮形)
date('l',strtotime('2015-02-25'))； // Wednesday(フルスペル)
```

取得できるのは英語ですが、これを日本語化する方法を紹介します。

-----

###**■設定**

・cakephp/app/Locale/jpn/LC_MESSAGES/default.po に以下の記述を追加する
　ファイル、フォルダがなければ新規作成する。

```text
msgid "Sun"
msgstr "日"
msgid "Mon"
msgstr "月"
msgid "Tue"
msgstr "火"
msgid "Wed"
msgstr "水"
msgid "Thu"
msgstr "木"
msgid "Fri"
msgstr "金"
msgid "Sat"
msgstr "土"
msgid "Sunday" 
msgstr "日曜日" 
msgid "Monday" 
msgstr "月曜日" 
msgid "Tuesday" 
msgstr "火曜日" 
msgid "Wednesday" 
msgstr "水曜日" 
msgid "Thursday" 
msgstr "木曜日" 
msgid "Friday" 
msgstr "金曜日" 
msgid "Saturday" 
msgstr "土曜日" 
```




###**■使用方法**

__(string)関数を使い曜日をdefault.poの内容でローカライズし、日本語化します。
簡単ですね！

```php
__date('D',strtotime('2015-02-25'))； // 水
__date('l',strtotime('2015-02-25'))； // 水曜日
```
Redmine共存のために、bundle install --path した際のハマリ。

CentOS5.11でRedmine2.5→3.0へ移行時のハマりメモ。

そもそもRails3.2.19＋ImageMagick6.8で
<code>
gem install rmagick
</code>
するとエラーになるので、
http://qiita.com/znz/items/6ea0a284a2fb91ac740f
を参考に回避していました。

この状態でgemをsystemインストールしたRails3.2.19上で、Redmine2.4＆2.5が3インスタンス動いていた。

ここにRedmine3を追加するので、Rails4と共存させるためにbundleでpath指定。
<code>
bundle install --path vendor/bundler --without development test
</code>

これだとImageMagick6.8では上記の対処をしても、rmagickがエラーでインストールされない。
vendor/bundler配下に、rmagickを置いてもbundle installでやっぱりエラー。

rubyを2.1.5に入れ替えるついでにImageMagickを↓に入れ替えるとすんなりbundle installが通って、rmagick 2.13.4がインストールされた　Σ(ﾟдﾟ;)
http://www.imagemagick.org/download/ImageMagick-6.9.0-9.tar.gz
Rで回答結果を複数まとめて表にする

アンケート調査の際、例えば５段階で回答してもらう設問が５つあるときに、それをまとめてレポートしたいことがある。
これを統計パッケージのRを使って、実現する。
tableを使うとクロス集計になってしまう。

好きな食べ物（それぞれ１−５で回答）
  * ごはん
  * パン
  * ピザ
  * ケーキ

こんな感じの設問をまとめて以下のような表にする感じ。

![image](https://qiita-image-store.s3.amazonaws.com/0/33061/f21fa366-d7ce-ab3c-ae0e-98782fe192b4.png)


関数を作っておくと便利。

```r:ma_sample.r
# 各選択肢に対する回答数と回答の平均値
ma_one <- function(x) c(table(x),mean(x))
# 全体を一つの表にまとめて、ラベルをつける

create_ma <- function(x,y,z) {
	  ma_res <- t(sapply(x,ma_one))
	  dimnames(ma_res) <- list(y,z)
	  return(ma_res)	  
	  }
res <- create_ma(r, c("ごはん","パン","ピザ", "ケーキ"),c("1","2","3","4","5","平均"))
```

出力はxtableを使うことで、LaTeXのソースなどを出力できる。

マルチアンサーのケースでは、ma_oneの後に回答数の合計を入れておくとよい。
【CakePHP2.x】命名規則まとめ


CakePHPではいろいろと命名規則がある。
\#従わなくても何とかなるようだが、それだとこのフレームワークの恩恵は受けられないんじゃないかなw

| 種類　　　　| 規約 　　　　| 例　　　　　　|
|:-----------|:------------|:------------|
|テーブル名 |【アンダースコア型】、【複数形】 |oranges、salaries、shift_patterns|
|フィールド名 |【アンダースコア型】、【単数形】|pattern、work_hour|
|モデル名 |テーブル名を【キャメル型】、【単数形】にしたもの |shift_patternsテーブルのモデル名：ShiftPattern|
|コントローラー名 |関連させるモデルクラスの【キャメル型】、【複数形】+Controller |モデルクラスShiftPatternを使用するコントローラー：ShiftPatternsController|
|ビュー名(フォルダ) |コントローラーの【キャメル型】、【複数形】|ShiftPatternsControllerクラスのビューフォルダ：ShiftPatterns |
|ビュー名(フォルダ下のファイル)|アクションを【アンダースコア型】+.ctp |ShiftPatternsControllerクラスのindex()アクションのビューはindex.ctp |

　

-----

【アンダースコア型】
単語の間を”_”で区切ること。

【キャメル型】
単語の頭を英大文字にし単語を繋げること。

【単数形】【複数形】
単語を単数形とするか複数形とするかの違い。
複数の単語を複数形で表現する場合は最後の単語のみ複数形とする。
【CakePHP2.x】開発環境構築手順【Windows eclipse xampp】

###**■環境**

Windows7 Pro
eclipse4.3 Kepler
xampp1.8.2
CakePHP2.5.8

-----
###**■構築手順**

**(1)Pleiades All in One 日本語ディストリビューションをダウンロードする。**

http://mergedoc.sourceforge.jp/
↑こちらからダウンロードする。

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/70897/ee832950-1824-ed8a-0474-96ca83de8d97.png)

Full Editionをダウンロードする。
xamppも付属してくるので楽ちん。

ダウンロードしたzipを任意の場所に解凍する。
pleiadesフォルダの下にeclipseフォルダ、xamppフォルダがある構成。

![pleiades.png](https://qiita-image-store.s3.amazonaws.com/0/70897/213b8016-413a-0bdf-4c9a-1adc218a4aeb.png)

　
**(2)CakePHPをダウンロードする。**

http://cakephp.jp/
↑からダウンロードする。

![cakephp.png](https://qiita-image-store.s3.amazonaws.com/0/70897/a2f81ab8-43ab-cb6e-83df-cce902960687.png)

zipがダウンロードされるので、解凍し、フォルダごとeclipseのワークスペース下に配置する。

　
**(3)xampp付属のApache、MySQL、PHPの設定を行う**

この辺をきちんとやっておかないと、xamppからApache、MySQLは起動しないとかなって泣く羽目に。

[1]Apacheの設定
①～\xampp\apache\conf\httpd.conf

・以下の記述を追加する。

==================================
\<virtualHost localhost:80>
    ServerName localhost
    DocumentRoot "eclipseワークスペースのフルパス"
\</virtualHost>

\<Directory "eclipseワークスペースのフルパス">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Require all granted
\</Directory>

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

・相対パスになっている部分を絶対パスにする
例：
ServerRoot "/xampp/apache"
↓
ServerRoot "C:/pleiades/xampp/apache"


②～\xampp\apache\conf\extra\httpd-ssl.conf

・相対パスになっている部分を絶対パスにする


③～\xampp\apache\conf\extra\httpd-xampp.conf

・相対パスになっている部分を絶対パスにする


[2]MySQLの設定
①～\xampp\mysql\bin\my.ini

・相対パスになっている部分を絶対パスにする

・以下の一行を追加し、文字コードをUTF8にする

character-set-server = utf8

　
[3]PHPの設定

①～\xampp\php\php.ini

・相対パスになっている部分を絶対パスにする

・以下のコメントアウト行を解除(先頭の;を削除)し、文字コードをUTF8にする

L830付近
;default_charset = "UTF-8"

・タイムゾーンを変更する

L1044付近
date.timezone = Asia/Tokyo
に変更する。

　
**(4)CakePHPの初期エラーを取り除く**

(1)～(3)まで行って、xamppを起動して、
http://localhost/
に接続するとエラーがいくつか出るので、その原因を取り除く。

![CakePHP導入時の初期エラー.png](https://qiita-image-store.s3.amazonaws.com/0/70897/9d08670d-3df5-e8fa-7e86-8ea302863ee2.png)

※以下「～app」はCakePHPフォルダ下と読み替えてください。

①～app/Config/core.php  を開き、以下のように修正する。

・「Security.salt」で検索し、Security.saltの値を別の適当な英数字に変更
・「Security.cipherSeed」で検索し、Security.cipherSeedの値を別の適当な数値に変更

②app\Config\database.php.default  のファイル名を database.php  に変更する。

③database.php を編集し、自分のデータベース設定に合わせて修正する。
　修正するのはユーザー名、パスワード、データベース名の３項目。
　データベースを作成していない場合はphpMyAdminで作成する。

④DebugKitを導入する。

・DebugKitをダウンロードする。(https://github.com/cakephp/debug_kit)
・ダウンロードしたzipファイルを解凍して、app/Pluginフォルダ下に配置する。
・フォルダ名を「DebugKit」にリネームする。
・app/Config/bootstrap.phpに「CakePlugin::load('DebugKit');」と追加する。


![CakePHP導入時の初期エラーを取り除いた.png](https://qiita-image-store.s3.amazonaws.com/0/70897/a44cd75a-75dc-aaa4-6de3-5116621e6649.png)
PHPで誰でもすぐに始められる小さなCI

タイトルはPHPに絞ってますが、他の言語でも同じようなことは出来ると思います。

# 前提

* インターネットに接続できること
* Gitを使っていること
* shellがちょっと分かること

# CI環境を準備するのは大変

何を目的としているかわからないメソッドに対してテストを書いたり、
CIサーバー（サービス）を導入するために偉い人を説得したり、CIは始めることが一番大変なのではと思います。

手元にあるものだけで手っ取り早くCIしたいですよね？

# Gitのpre-commmitを利用しましょう

Gitを利用していればcommitしない人なんていませんね。
commitするたびにツールが走ればいいんです。
gitのpre-commitにチェックツールを走らせるように書いておくだけ、
物凄くお手軽にCI環境が構築できますね！

# pre-commitで使えるツール

色々使えるツールがあります。

## php -l

これはインターネットに繋がっていなくてもPHPが利用できれば使えますね。
PHPのシンタックスエラーを見つけてくれます。
白い画面になるのを防げる優れものです。

## phpmd

良くないコードを見つけて起こってくれるツールです。
使い方やインストールについては以下投稿を見ましょう。

[PHPの静的コード解析ツール『PHPMD』を使ってみた。](http://qiita.com/yuji0602/items/28b0c2363bae8fce055a)

## php-cs-fixer

特定のコーディング規約にコードをフォーマットしてくれるツールです。
細かい設定書こうとすると難易度上がります。

[PHP-CS-Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer)

## security-checker

composerでインストールしたライブラリに脆弱性が出ていないかチェックしてくれるツールです。
コードの静的解析を行うのではなく、特定の脆弱性の報告されたライブラリを利用していないかどうかをチェックしてくれます。

[security-checker](https://github.com/sensiolabs/security-checker)

# pre-commitのサンプル

以下のサンプルは`php -l`、`phpmd`をコミット時に変更したPHPファイルに対して走らせるものです。
問題が一つでも見つかるとコミットさせてもらえません。

```sh:pre-commit
#!/bin/sh

if git rev-parse --verify HEAD >/dev/null 2>&1
then
	against=HEAD
else
	against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

exec 1>&2

EXIT_CODE=0

error_check() {
  if [ $1 -gt 0 ]; then
    EXIT_CODE=$1
  fi
}

cecho () {
	str=$1
	color=$2
	echo "\033[0;${color}m${str}\033[0;39m"
}

cecho '##########################' 32
cecho '# Checking PHP syntax... #' 32
cecho '##########################' 32
echo ''

for CHECK_FILE in `git diff-index --name-status ${against} -- | grep -E '^[AUM].*\.php$' | cut -c3-`; do
  php -l ${CHECK_FILE}
  error_check $?
done

echo ''

cecho '################' 32
cecho '# Run phpmd... #' 32
cecho '################' 32

for CHECK_FILE in `git diff-index --name-status ${against} -- | grep -E '^[AUM].*\.php$' | cut -c3-`; do
  vendor/bin/phpmd ${CHECK_FILE} text codesize,design,naming,unusedcode
  error_check $?
done

if [ ${EXIT_CODE} -gt 0 ]; then
  cecho 'Commit Failed...' 31
else
  cecho 'Pre commit check all green!!' 32
fi

echo ''
exit ${EXIT_CODE}
```

下記画像はシンタックスエラーがあった場合の画面。

![スクリーンショット 2015-03-05 14.27.02.png](https://qiita-image-store.s3.amazonaws.com/0/28406/82337417-0b94-99f6-2532-b03de26c7b8e.png)


# まずは小さいことから始めましょう！

小さな改善の積み重ねが大きな改善になるのです。
sortの挙動がロケールによって変わってハマる

# あらまし

お仕事の成果物チェックを `find . -type f | sort` と`diff -q`で比較して足りないファイルがないかチェックするようにした。

```bash
find . -type f | sort > files.txt
diff -q files-expected.txt files.txt
```

手元の環境で問題がなかったのでいざJenkinsで動かしたところ、
奇妙なことにまったく同じディストリビューション、コマンド、ファイルを入力に使ったにも関わらずエラーとなった。

# 調査

問題を最小化してみた。

```shell-session:手元
$ find . -type f | sort
A.txt
B.txt
a.txt
b.txt
```

```shell-session:Jenkins
$ find . -type f | sort
a.txt
A.txt
b.txt
B.txt
```

大文字と小文字の扱いが変わっているようだ。

# 原因

手元とJenkins環境を徹底的に調べたところ、LANGの値が異なった。

```shell-session:手元
$ echo $LANG
ja_JP.UTF-8
```

```shell-session:Jenkins
$ echo $LANG
en_US.UTF-8
```

# 検証

```shell-session:LANG=C
$ echo -e "a\nb\nA\nB"| LANG=C sort
A
B
a
b
```

```shell-session:LANG=ja_JP.UTF-8
$ echo -e "a\nb\nA\nB"| LANG=ja_JP.UTF-8 sort
A
B
a
b
```

```shell-session:LANG=en_US.UTF-8
$ echo -e "a\nb\nA\nB"| LANG=en_US.UTF-8 sort
a
A
b
B
```

やはり`LANG`が影響している。

# `sort`は`LANG`を見ているのか

`sort`のman pageには`LANG`を見るとは一言も書いていない。

ではどこから差が来るのか

http://linux.die.net/man/3/strcoll
http://linux.die.net/man/3/setlocale

とてもわかりにくいが、整理すると以下のようになる。

* `strcoll()`という文字比較関数が標準Cライブラリにある
* この関数は、`LC_COLLATE`というロケールカテゴリによって挙動が変わる
* ロケールを参照する場合、`LC_COLLATE`のカテゴリなら、`LC_ALL`, `LC_COLLATE`, `LANG`の順に値を見ていく

どうやらロケールの値は環境変数で変えられるようで、
今回は`LANG`の値が異なったことが原因で挙動が違ったようだ。

ロケールの値は`locale`で参照できる（コメント欄参照 THX @magicant ）

# 最後に

メジャーなコマンドラインツールが異なる挙動を示したらとりあえず`locale`を。
Xamlで、ObservableCollectionを使う

#どんな時に困るのか
Xamlを記述している時に、データが無いと困ることが、良くあります。
そんな時は、下記のように、d:DesignProperties.DataContextタグを使用します。

```xaml:Test.xaml
<d:DesignProperties.DataContext>
  <x:Array Type="{x:Type entity:SampleInfomation}">
    </entity:SampleInfomation>
    </entity:SampleInfomation>
    </entity:SampleInfomation>
  </x:Array>
</d:DesignProperties.DataContext>
```

ところが、クラス内で、ObservableCollectionを利用しているとXamlに記述することができません。
ObservableCollection<T>というジェネリクスな型指定がだめなようです。

#解決策

下記のようなクラスを用意します。
entityクラスのcsファイル内に、併記しておくと良いかも知れません。

```csharp:ObservableCollection_SubItem.cs
public class ObservableCollection_SubItem : ObservableCollection<SubItem> {}
```

```xaml:Test.xaml
<d:DesignProperties.DataContext>
  <x:Array Type="{x:Type entity:SampleInfomation}">
    </entity:SampleInfomation>
      <!-- ObservableCollectio<SubItem> Items へデータを追加 -->
      <entity:SampleInfomation.Items>
        <entity:ObservableCollection_SubItem>
          <entity:SubItem/>
          <entity:SubItem/>
          <entity:SubItem/>
        </entity:ObservableCollection_SubItem>
      </entity:SampleInfomation.Items>
    </entity:SampleInfomation>
    </entity:SampleInfomation>
  </x:Array>
</d:DesignProperties.DataContext>
```

Xamlだけでは、解決できませんがダミーデータを用意するときに覚えておくと便利です。
Qiita の人気プログラミング言語

Qiita の人気プログラミング言語ですが、下のようになってました。TIOBE Index の[人気プログラミング言語](http://bonk.red/articles/Misc/popular_languages.html)とはずいぶん違ってますね。

投稿数では Ruby が１位、フォロアの数では JavaScript が１位です。仕事でやっている言語は、Java とか C# が多そうですが、趣味としては Ruby, JavaScript など軽量級の言語の方が人気があるようです。

Objective C は投稿数が少ないですが、Swift は人気があるようです。お手軽さが受けているんでしょうか。

投稿数とフォロアの関係ですが、全体としては、投稿数よりフォロアの数がずっと多いです。でも、Go や Bash は投稿数の方が多くて面白いです。Ruby もフォロアのほうが多いですが、投稿数との比率で考えると、投稿数が多くて「書いている人」がずいぶん多いんですね。

![qiita_langs](https://s3-us-west-2.amazonaws.com/tiny10be/wiki/img/qiita_kw.png)

詳しいデータは下のリンクから ...

[Qiita キーワードの投稿数とフォロア数のグラフ](http://bonk.red/proj/angular/qiita_kw.html)
[Qiita キーワード投稿数とフォロア数の一覧表](http://bonk.red/proj/angular/qiita_kw_list.html)
linux > あるフォルダをd:\workとしてリンクしたい (他の方法で対処済み)

解決策は見つかっていない。

Windows版とLinux版のあるソフトがあり、Windowsのソフトで処理したファイル群をlinuxに持っていき、引き続き処理をしたい。

ソフト内部で色々な場所で作業フォルダ(d:\work)を参照していて、その設定を全部変えるのはバイナリファイルも含んであることから難しい。

そこで、

    /work/test/software/work
をシンボリックリンクで
    
    d:\work
としてごまかせないかと思案している。

でも、そもそも、d:\workとしてシンボリックリンクをはることができないように思う。

<hr>
(追記 15/03/05)
バイナリファイルもありダメと思っていたのだが、とりあえず複数の設定ファイルに記載されているフォルダを置換処理してみたところ、当面の目的は果たせた。

置換処理は[こちら](http://qiita.com/ironsand/items/0eeec9eedc3591abbe3f)が参考になった。
複数の要素でgroupし、countした結果を整形したい。

以下のようなテーブルがあり、

```rb
create_table "subtasks", force: true do |t|
  t.integer  "task_id",                              null: false
  t.integer  "product_id",                           null: false
end
```

以下のコードを実行すると

```rb
SubTask.all.group(:product_id, :task_id).count
```

以下のような結果が得られるとする、

```rb
{[1, 1]=>3, [1, 2]=>5, [2, 3]=>5, [3, 4]=>3}
```

しかし、以下のような結果が欲しい。

```rb
{1=>{1=>3, 2=>5}, 2=>{3=>5}, 3=>{4=>3}}
```

この場合は、以下のようにreduceを使うことで実現は可能。

```rb
SubTask.all.group(:product_id, :task_id).count.reduce({}) do |result, (key, value)|
  product_id, task_id = key
  result[product_id] ||= {}
  result[product_id][task_id] = value
  result
end
```

よりシンプルに書く方法ががありましたら、ご教授ください。

# see also
http://stackoverflow.com/questions/26610039/return-a-query-with-nested-results-with-rails-activerecord
Nginxのgzipが動いているか確認する方法 ~ クライアントサイド~

Webリクエストはサーバーサイドで、gzipで圧縮されて、クライアントで展開する。
これにより、サーバー、クライアント両サイドで、通信速度、使用帯域を有効活用している。

さらに詳しく:
http://en.wikipedia.org/wiki/HTTP_compression

サーバーサイドでは、例えば、Nginxで

```
gzip on;

```

gzip_static モジュールで、gzipを有効にして対応します。

```
gzip_static on;
gunzip on;
```

さらに詳しく:
http://qiita.com/cubicdaiya/items/2763ba2240476ab1d9dd
http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html


実際、クライアントサイドでちゃんとgzipで受け取って解凍しているかを確認してみるには、Curlをつかって、Headerで、gzip, deflateを受け取れることを明示し、リクエストを行います。

```
$curl -I -H 'Accept-Encoding: gzip,deflate' http://example.com/app.js
```

レスポンスHearderに、　`Content-Encoding: gzip` があれば動いています。

動いている時
![Screen Shot 0027-03-05 at 10.56.21.png](https://qiita-image-store.s3.amazonaws.com/0/1232/e81b694b-9450-9350-4076-f25873936660.png)

動いていない時
![Screen Shot 0027-03-05 at 13.37.22.png](https://qiita-image-store.s3.amazonaws.com/0/1232/f6c87354-4774-234c-a95a-7001d358e0ee.png)
ScalaでHello Worldを表示するまで

# Scalaの環境構築
## Javaのバージョンを確認する。
java及びjavacが1.7以降であれば、そのままでOK。
もし1.6であれば最新版をインストール。

 [JDK8ダウンロードページ - Oracle](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)

```
$ java -version
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)

$ javac -version
javac 1.8.0_05
```

## sbtインストール
Scalaをインストールしなくても、sbtがインストールしてくれる。
### homebrew
```
$ brew install sbt
```
### MacPorts
```
$ sudo port install sbt
```

## giter8インストール
### homebrew
```
$ brew install giter8
```
### MacPorts派の人
MacPortsのものはバージョンが古いので、下記のやり方でインストール。

```
$ curl https://raw.githubusercontent.com/n8han/conscript/master/setup.sh | sh
$ cs n8han/giter8
```

## テンプレを準備
作業用のディレクトリ直下で、適当なテンプレを使用
最初は簡単に、Mainの中でHello Worldとだけ書いて実行するのが良い。

```
$ g8 --list
(テンプレがでてくる。その中から選ぶ)
$ g8 chrislewis/simple-scala-project 
```

## テンプレのディレクトリまで移動
src/main/scalaの下に、ソースがある。
build.sbtがある場所で、下記コマンドをうつ。
初回のみいろいろとインストールするので時間がかかる。

```
$ sbt
（インストール）

> run
Hello World！
```

## jarファイルの作成
```
> assembly
```
このコマンドで、jarファイルを作る。
.classをzipしたものがjar。

## jarを実行してみる
```
> exit

$ java -jar target/scala-2.11/simple-scala-project-1.0.0.jar
Hello　World！
---
bitnami Redmine3.0(Win版) を入れたらApacheが起動しなかった(解決済)

Windows版のbitnami Redmine3.0をインストールしてみたらすんなり動いてくれなかったのでメモ

##環境
Windows7 Pro 64bit

#不具合1
##症状
 Apacheだけ起動しない

##原因
　httpd.confに記述されている環境変数をセットする記述の部分でSyntax Errorが発生
 ※自宅のPC(Win8.1)ではこの症状が出なかったので何か環境依存がある？

##対応
　・該当行コメントアウト
　・手動でWindowsの環境変数を設定

##対応詳細

　ログの確認をしたところWindows側のアプリケーションログで以下のエラーが出ていた
(コントロールパネルの管理ツールの中にある「イベントビューア」で確認できる)

```
  The Apache service named 
    
   reported the following error: >>> 
   AH00526: Syntax error on line 569 of C:/Bitnami/redmine-3.0.0-0/apache2/conf/httpd.conf: 
```

httpd.confの569行目は以下の記述
```
SetEnv PATH "${PATH};C:\Bitnami\redmine-3.0.0-0/apache2/bin"
```

環境変数のPATHをセットしているだけのようなのでコメントアウト。手動で環境変数をセットして解決



##不具合２

##症状

　不具合1解決後、Internal ErrorでRedmineが立ち上がらなかった

##原因
　DBの初期化処理が途中で失敗していてデータベースが空だった。
　Bitnamiインストーラのウィザードの中でAdminユーザの設定に日本語で氏名を入力したため、初期化処理の実行に失敗していたと考えられる

##対応
　・DB初期化のスクリプトの該当部分を手動でローマ字に修正
　・手動でDB初期化を実行

##対応詳細
ログの確認
C:\Bitnami\redmine-3.0.0-0\apps\redmine\htdocs\log\production.log

下記のようなメッセージがあった
```
ActiveRecord::StatementInvalid (Mysql2::Error: Table 'bitnami_redmine.settings' doesn't exist: SHOW FULL FIELDS FROM `settings`):
```

phpMyAdminでデータベースを確認したらデータベースに初期データが入っていなかった

※DBのユーザとパスワードが分からないときは下記を参照
C:\Bitnami\redmine-3.0.0-0\apps\redmine\htdocs\config\database.yml

bitnamiコンソールを起動
C:\Bitnami\redmine-3.0.0-0\use_redmine.bat

```
cd ./apps/redmine/htdocs
ruby ./bin/rake db:migrate RAILS_ENV="production"
```

ここでエラーが出た(ちゃんと記録残してないけど001_setup.rbでinvalid charactersか何かそんなメッセージが行番号付きで出ていた)

下記ファイルの該当行をチェック
C:\Bitnami\redmine-3.0.0-0\apps\redmine\htdocs\db\migrate\001_setup.rb

290行目あたりの下記の記述に文字化けした文字が含まれていた
```
    # create default administrator account
    user = User.new :firstname => "○○○",
                    :lastname => "○○○",
```

ローマ字表記に書き換えて再度初期化処理を実行
```
ruby ./bin/rake db:migrate RAILS_ENV="production"
ruby ./bin/rake redmine:load_default_data RAILS_ENV="production"
```

言語を選択して完了
VCCW を heteml に Wordmove でデプロイする手順


俺的メモです。

# 公開URL

```heteml
/web 			#サイトルート
/web/wordpress 	#WP
```
とする。

# 下準備
hetemlでssh開通しとく（鍵認証も）
hetemlでDB作成しとく

# WordMove実行
Movefileをhetemlの情報にあわせて修正（DBとFTPのとこ）

```local
vagrant ssh

cd /vagrant
wordmove push --all
```
たぶんDBでコケるはず（hetemlとwordmove相性悪い）

なので手作業で
DBをエクスポート＆インポート（sequel proで一発）

# 残りは手作業
vccwと運用パスが同じなら飛ばす。

※このあたりはVCCWのWP実行パスがなんか変な感じで手作業になっちゃう。いい方法思いつかないのでこれで…。

/webに `.htaccess`と`index.php`をコピー
/web/wordpress に`.htaccess`をコピー
/web の`index.php`を修正（WPのパスに合わせる）

```index.php
require( dirname( __FILE__ ) . '/wordpress/wp-blog-header.php' );
```

さらに
/wordpressに`wp-config`をコピー＆hetemlのDB情報に改変

さらに
`WP_HOME`と`WP_SITEURL`をhetemlのパスに合わせる

```wp-config.php
define( 'WP_HOME', 'http://hoge.heteml.jp' );
define( 'WP_SITEURL', 'http://hoge.heteml.jp/wordpress' );
```


最後に
~/web/index.html を消す

```heteml
rm ~/web/index.html
```

で、http://hoge.heteml.jp にアクセスすればそっくりそのまま移行出来てるはず

#注意
TypeSquareなどのドメインによるアクセス制限のあるサービスも適宜変更してあげないと表示されない（あたりまえ）
sketch で ai ファイルからのsvgフォント化する際のなにがし

#はじめに
これは、svgフォントをする際に私がつまづいた点の解決法をまとめたものです。あしからず

#SVG font
案件によっては、しばしば アイコン類を font-awesome よろしくsvgフォント化して管理していることでしょう。

#Gulp Sketch
ここで非常にお世話になっている gulp sketch のことを書いておきます。
https://github.com/cognitom/gulp-sketch
非常に優秀な点は、テンプレートを自分で編集出来る点です。
個人的には、scss ファイル等のメタ言語ファイルに出力しつつ、mixinとして定義しておくことで アイコン自体を他の部品に導入できるように整えておくとかよくします。

ここら辺は今回関係ないので割愛。

#アイコン化
じゃあ、アイコン化しましょうといわれて、そうそうできるものではない!(私だけかも)。
なぜなら私はデザイナーではなく、エンジニアよりな人間であるからだ(言い訳)。
とはいっても、こういうことはフロントエンドがよきようにやってしまう方が手っ取り早いケースが多いと思うので頑張って、メモ的な雰囲気で残します。

#状況
以下にまとめます。

* アイコンは ai ファイルだった
* gulp-sketch, つまり sketch でアイコン化している。

というケースです。

#陥りがちなケース

###アイコンをコピペして出力したらまっくろ！

というもの。例えば、線だけの丸が真っ黒とかとか。なぜか？
path で書かれているからですね。
color は 閉じた path の内側に塗られるから。当たり前か。

#対応
sketch には便利な機能があります。

### vectorize stroke

というもの。簡単にいうと、パスをベクター化する。まんまですね。
場所は Layer > Paths の中にあります。

こうすることで、path がそれ自身で囲まれた パスに変わります。
これで一安心。というわけでした。
Crashlyticsのbetaを使っていたら、MacのCrashlyticsAppでクラッシュした話

**Testflightapp.com**が閉鎖したので、最近**Crashlytics**の**beta**を使うようになりました。

凄く出来が良いのですが、テスト配信しようとしたらMacAppがクラッシュしたので対応策をメモしておきます。

# クラッシュまでの手順
1. アプリをアーカイブし、CrashlyticsのMacアプリからDistributionsを選択します。
2. 画像にある"Distribute"をクリックします。
![スクリーンショット 2015-03-05 11.45.57.png](https://qiita-image-store.s3.amazonaws.com/0/11156/bab7d602-b188-13ad-6e0c-39cbfa3e369f.png)
3. クラッシュしました


# なぜクラッシュしたのか
本来、この当たり前の操作でクラッシュは起きないのですが、"Group"の設定に問題がありました。

テスターが多いためグループ機能を使っているのですが、そこに**Untitled Group**があるとクラッシュします。

 ![スクリーンショット 2015-03-05 11.48.21.png](https://qiita-image-store.s3.amazonaws.com/0/11156/c55a0e14-ead9-5906-ca55-ea8a17bd2b60.png)

# 対応
**Untitled Group**を削除すればクラッシュせずに起動します。

# まとめ
何の情報もなく落ちるので原因判明に苦労しました。
自分以外の人がうっかり追加してしまうこともあるので、もし同様の現象でクラッシュしている方は**Manage Groups**を確認してください。

Crashlyticsには本件報告済みなので、何かしら分かりやすいアラート出るようになると良いなと思います。
[備忘録] SublimeText 3 から ATOMに乗り換える

# 目的
日本語周りがダメダメなSublimeTextでMarkdownを書くのが嫌になったのでATOMに乗り換える．
複数のPCで環境をつくるときのための個人的なメモ．

# インストール
ここから取ってくる．→ https://atom.io/
インストールに関しては特に問題がないと思う．

### PROXY設定
会社環境だとProxyの設定が必要な場合がある．
[ctrl+,] でSettingsを開いて，[Open Config Folder]から設定ファイル直下に.apmrcファイルを作成．
.apmrcファイルに以下の文言を追加する．

```shell-session
   http-proxy=http[s]://[proxy.url]:[proxy.port]
   https-proxy=http[s]://[proxy.url]:[proxy.port]
```

### Plugin
Pluginはいろいろ紹介されているけど，とりあえず以下のものを導入．
　- autocomplete-plus
　- autocomplete-plus-jedi
　- file-icons
　- japanese-wrap
　- linter
　- merge-conflicts
　- minimap
　- project-manager
　- script

その他は臨機応変に．

### Key Bindings
Pluginをいろいろ入れたはいいんだけど，KeyBindingが重複していて欲しい機能が使えない．個人的にはSublime Text 3 時代に多用していた[ctrl-b]の割り当てが変更になっているため，この辺をアレンジする．

[ctrl+,] -> [KeyBindings] からkeymap.csonを開いて以下の文言を追記．

```shell-session
'.platform-win32':
#   'ctrl-b': 'fuzzy-finder:toggle-buffer-finder'
    'ctrl-b': 'unset!'
    'ctrl-b': 'script:run'

'.platform-win32 atom-text-editor, .platform-linux atom-text-editor':
#   'ctrl-shift-B': 'script:run'
    'ctrl-shift-B': 'unset!'
    'ctrl-shift-B': 'fuzzy-finder:toggle-buffer-finder'
```

これでちょっとは使い勝手が良くなるはず．

### Theme
Themeに関しては人それぞれの好みだけれども，まぁ書きやすいの選んだらいいかなぁ，って感じですね．個人的にはFlatlandのSyntax Themeが書きやすかった．UI Themeはそのまま．

### Settings
- Python書きなのでIgnored Namesに「*.pyc」を追加．
- Font Familyを「Consolas, Meiryo」にする．そのままだと中華フォントになるので読みにくいとか．
- Font Sizeは「14」
- 個人的にはPrferred Lineが嫌いなので1600とか大きな数字をぶち込んどいた．
- Tabは4です．2だとやり辛い．

### TreeView
- [Settings]を開いてPackages->Tree Viewを開く．Hide Ignored NamesとHide VCS Ignore Filesにチェックを入れる．

現在加筆中．もうちょっといじってみよう．
Project Euler 34

問題
---
145は面白い数である. 1! + 4! + 5! = 1 + 24 + 120 = 145となる.

各桁の数の階乗の和が自分自身と一致するような数の和を求めよ.

注: 1! = 1 と 2! = 2 は総和に含めてはならない.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2034

回答
---
ある数が階乗の和になっているか否かを判定する関数を作った。

```py
def is_wa_of_kaijo(i,kaijos):
  s = 0
  for j in str(i):
    s+= kaijos[int(j)]
  if i == s:
    return True
  else:
    return False
```

当該関数を用いて、最大値と考えられる範囲で全数検索を行ったが、とても遅かった。
なお、n>=7で10**n -1 > 9!*nなので、最高でも9!*7までの範囲を検索すれば十分である。

```py
def main():
  MAX = math.factorial(9)*7
  kaijos = [math.factorial(x) for x in range(0,10)]
  ans = 0
  for i in range(3,MAX):
    if is_wa_of_kaijo(i,kaijos):
      ans += i
  print ans
```

異なるアプローチとして、先に最大7因子の階乗の和セット型オブジェクトを作成し、当該階乗の和セット型オブジェクトに対して全数検索をかけるということを試してみた。検索の母集団が少なくなるため、少なくとも判定部分は高速になるはずである。
なお、階乗の和リストを作成する際にその因子を覚えさせようとしたが、非常に複雑な処理となってしまったため、実装を断念した。
なお、ゼロの階乗は1であるが、最初の時点では、足し算をしない状態のリストの値を保持するため、0としている。

```py
def main2():
  kaijos = [0] + [math.factorial(x) for x in range(1,10)]
  kaijos2 = set(x1+x2 for x1 in kaijos for x2 in kaijos)
  kaijos3 = set(x1+x2 for x1 in kaijos for x2 in kaijos2)
  kaijos4 = set(x1+x2 for x1 in kaijos2 for x2 in kaijos2)
  kaijos7 = set(x1+x2 for x1 in kaijos3 for x2 in kaijos4)
  kaijos[0] = 1
  ans = -3
  for i in kaijos7:
    if is_wa_of_kaijo(i,kaijos):
      ans += i
  print ans
```

ジェネレータの内包表記を少し増やすバージョンも考えてみた。

```py
def main3():
  kaijos = [0] + [math.factorial(x) for x in range(1,10)]
  kaijos7 = set(x1+x2+x3+x4+x5+x6+x7 for x1 in kaijos for x2 in kaijos for x3 in kaijos for x4 in kaijos for x5 in kaijos for x6 in kaijos for x7 in kaijos)
  kaijos[0] = 1
  print len(kaijos7)
  ans = -3
  for i in kaijos7:
    if is_wa_of_kaijo(i,kaijos):
      ans += i
  #print ans
```

実行時間
main2()  0.484
main3() 18.011

この実行時間の差が何に起因するのか、のちに調査してみようと思う。
SourceTreeでローカル環境で除外するファイルを設定する

version 1.6.12.0で設定しました。
他バージョンでは差異があるかもしれません。

# ローカル環境で除外するファイルを設定する

sublime textなどでCtagsを使うと、
.tags
.tags_sorted_by_file
が自動生成されSourceTreeでcommitをする際にcommit対象になるので邪魔。
これを管理しないようにローカル環境で除外するファイルを設定する。

まず、適当な名前で適当な場所に空ファイルを作成する。
今回は 
C:\Users\user\Documents\app
配下に
local_gitignore
としてからファイルを作成した。

次にツール→オークション→Gitでグローバル無視リストの…でさっき作成した空ファイルを指定する。

![cp.JPG](https://qiita-image-store.s3.amazonaws.com/0/57634/1f6a8c5f-a09f-5276-0749-f4da430c9993.jpeg)

最後にファイルを編集で、ローカル環境でgit管理から除外するファイルを記載すればOK
djangoカスタムフィルタの引数について

最近、データ分析等でPythonをやり始めたばかりで、どうせならWebViewもPythonでやろうとDjangoを利用していた際に、テンプレート側から辞書オブジェクトを参照するために、カスタムフィルタを作成して参照しようとしたところ、ハマった箇所があったのでここにメモしておきます。

## カスタムフィルタ
> Djangoのテンプレートで呼び出し可能な関数の一つ
http://django-docs-ja.readthedocs.org/en/latest/howto/custom-template-tags.html

辞書オブジェクトを参照するカスタムフィルタ 
templatetags/helper.py  

```py
from django import template
register = template.Library()

def get_dict_val(var,args):
    dict_val = var
    keys = [arg.strip() for arg in args.split(',')]
    for key in keys:
        dict_val = dict_val[key]
    return dict_val
register.filter('dict_val',get_dict_val)
```

- テンプレート側

```django
{{ dict_obj|get_dict_val:'key1,key2' }}
```

この方法で辞書オブジェクトに参照が出来ます。 
カンマで区切ることで多階層のオブジェクトまで参照可能です。

```py
{"1":{"0001":"営業部"}}
```

しかし、この方法だとテンプレート側からの引数は文字列でないと処理が出来ないため、変数をカスタムフィルタに渡すことが出来ません。(forループ内の処理のオブジェクト等)

- テンプレート側

```django
# エラー
{% for row in data %}
  <p>{{ dict_obj|get_dict_val:row.no,row.busho_code }}</p>
{% endfor %}
```

## 結論
1度、2つの変数をカンマで区切り文字列を作成、その後引数に渡すという形を取りました。 

- カスタムフィルタにカンマで結合する関数を追加
templatetags/helper.py 

```py
def join_comma(var,args):
    return "%s,%s" % (var,args)
register.filter('join_comma',join_comma)
```

- テンプレート側  
withテンプレートタグを使用することで一時的に変数を作成することが可能

```django
{% for row in data %}
  {% with row.no|join_comma:row.busho_code as shain_id %}
  <p>{{ dict_obj|get_dict_val:shain_id }}</p>
  {% endwith %}
{% endfor %}
```

カスタムフィルタの引数については今までも議論があるようです
https://code.djangoproject.com/ticket/1199

なるべくview側で済ませる設計にする必要があると思いますが、仕様上どうしてもテンプレート側で辞書オブジェクトに直接アクセスしないといけない状況も出てくるかもしれないので、やり方を上記に残しておきました。
Android SDK Manager の Add-on を登録する方法

compileSdkVersion に使う SDK を Android SDK Manager でダウンロードできたら便利だなと思い、Android SDK の https://dl.google.com/android/repository/addon.xml を参考に下記のファイルを作成しました。

```xml:addon.xml
<?xml version="1.0" encoding="UTF-8"?>
<sdk:sdk-addon xmlns:sdk="http://schemas.android.com/sdk/android/addon/7" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <sdk:add-on>
        <sdk:vendor-id>bina1204</sdk:vendor-id>
        <sdk:vendor-display>bina1204</sdk:vendor-display>
        <sdk:name-id>bina1204_apis</sdk:name-id>
        <sdk:name-display>bina1204 APIs</sdk:name-display>
        <sdk:description>Android + bina1204 APIs</sdk:description>
        <sdk:api-level>21</sdk:api-level>
        <sdk:revision>1</sdk:revision>
        <sdk:libs/>
        <sdk:archives>
            <sdk:archive>
                <sdk:size>1204</sdk:size>
                <sdk:checksum type="sha1">ca2996579607b53c3eb5352a60763b8a33b19d9a</sdk:checksum>
                <sdk:url>addon-bina1204-21.zip</sdk:url>
            </sdk:archive>
        </sdk:archives>
    </sdk:add-on>
</sdk:sdk-addon>
```

\<sdk:archives\> に指定したファイルが \<ANDROID-SDK\>/add-ons/ に展開されます。checksum は下記のコマンドで取得しました。

    sha1sum addon-bina1204-21.zip

addon.xml と addon-bina1204-21.zip をサーバにアップロードし、Android SDK Manager > Tools > Manage Add-on Sites ... > User Defined Sites にその URL を追加すると、一覧に bina1204 APIs が表示されました。

![addon.png](https://qiita-image-store.s3.amazonaws.com/0/58593/7bb5b498-28c0-d7b3-a3db-6bed4d1ec2f0.png)

## コマンドで登録する場合

\<HOME\>/.android/ に下記のファイルを作成します。

```text:repositories.cfg
count=1
src00=http\://gsbina.com/repository/addon.xml
```

count はサイトの数を指定します。
下記のコマンドで Android SDK に追加されている項目の番号を確認します。

    android list sdk --all

そして、下記のコマンドでインストールします。番号は仮に 78 とします。

    android update sdk --all --no-ui --filter 78

これでインストールが開始されます。
titleタグはfunctions.phpの中に書くのがよい（かも）


前々からつくろうと思っていた自分のブログをようやく作り始めました。
今回はWordPressで構築することに。

WordPressでブログサイト構築をしていく中で、今まで自分が行ってきた方法とは違うものを少し取り入れていこうと考えています。その一環として、head内に記述するtitleタグを変更してみたいと思います。

## titleタグとは

titleタグはhtmlタグの1つで、表示されているページのタイトルを表すものです。
記入する場所はhead内。その中でも、できるだけ上のほうが良いのかなと思っています。

ちなみに個人的にはhead内はこんな順番で並べていることが多いです。

	<head>
		<meta charaset="utf-8">
		<title>ここにタイトルが入ります</title>
		<link rel="stylesheet" href="cssファイルへのパス" type="text/css">
	</head>

端折った項目もありますが、こんなかんじです。

## 従来の書き方

今までWordPressでサイト構築をするときはどこにtitleタグを書いていたのかと言うと、上記htmlコードと同じくhead内に書いていました。

そして、トップページを表示しているときは「サイトのタイトル」のみ表示。その他のページ（シングルページや固定ページ、カテゴリーページなど）を表示したときには、「ページタイトル｜サイトタイトル」の形で表示をしていました。

ページタイトルとサイトタイトルを区切る記号はそれぞれですが、かなり多くのサイトで使っている表示方法ではないでしょうか。

これをWordPressのコードに直すとこんな感じ。

	<head>
		<title><?php wp_title('|', true, 'right'); ?><?php bloginfo('name'); ?></title>
	</head>

bloginfo()でブログタイトルを呼び出し。
wp_title()でページタイトルを呼び出し。
wp_titleのパラメーターで、ブログタイトルとの区切り線の設定や、区切り線の表示位置なども決めています。詳しい内容は公式サイトを見ていただけたらと思います。

参考サイト：[テンプレートタグ/bloginfo - WordPress Codex 日本語版](http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/bloginfo)


参考サイト：[テンプレートタグ/wp title - WordPress Codex 日本語版](http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_title)

## 今回、採用した書き方

従来の書き方でも全く問題無いと思います。ですが今回は新しい試みということで、最新の公式テーマ「Twenty Fifteen」で使われているtitleタグの出し方を採用しました。

それは今までのようにhead内にtitleタグを書き、その中にテンプレートタグを書いていくということは行いません。

今回、どこで設定をするのかというと、functions.phpの中で設定を行います。
functions.phpの中に1行追加するだけ！

	add_theme_support('title-tag');
	
この1行を追加するだけでOK！
ページを表示すると従来の書き方と同じように表示してくれました。

## 注意事項

この方法、functions.phpに1行追加するだけで使えてすごく便利です。
が、ひとつ注意事項があります。
それは、WordPressのバージョン。
バージョンが4.1と2015年3月5日現在で最新バージョン（ひとつまえ？）のwordpressでなければ使えません。
あまりアップデートをされずにWordPressを使っている方のところでは使えないこともあるので気をつけてください。
CordovaでのTypeError “Cannot set property connection of #<Navigator>エラー回避方法

Cordovaを使用したAndroidアプリ開発にて、Cordova自体のバグを回避する方法を会得したので、メモ。


まず、以下のエラーが発生。

```console
TypeError “Cannot set property connection of #<Navigator>
```

上記エラーは、Android SDKのバージョンが、4.0.3以下で起きている。

また、タチの悪いことに、このエラーは、アプリの立ち上がりの際に発生するため、その後の処理が進まない。

で、詳しくエラーの原因を見ていると、以下のエラーメッセージが。。。

```console
Uncaught TypeError: Cannot set property connection of # which has only a getter at file:///android_asset/www/cordova.js:512
```

これは、Cordova自体のバグで、自分のソースコードのバグではない。

そこで、とりあえず、以下のように、Try Catchで、エラーを回避する方法を採用し、事なきを得た。

対象は、以下の2ファイルの512行目あたり。

1. platforms/android/assets/www/cordova.js
2. platforms/android/platform_www/cordova.js

```js
   function clobber(obj, key, value) {
      try {
        exports.replaceHookForTesting(obj, key);
        obj[key] = value;
        // Getters can only be overridden by getters.
        if (obj[key] !== value) {
            utils.defineGetter(obj, key, function() {
                return value;
            });
        }
      }
      catch (e){
        console.error('clobber error '+e+', obj='+JSON.stringify(obj)+', key='+JSON.stringify(key)+', value='+JSON.stringify(value));
      }
    }
```

同様の現象で困っている方、よかったら参考にしてみてください。
sublime text で 特定のファイルにすばやく移動する

## ■やりたいこと
・web開発用のフォルダをまるっと sublime text に追加して使っている。
・今まで左に表示するサイドバーからファイル名を選択して新規タブで開いていたけど、ファイルが多いと探すのが大変＆時間がかかるので効率よく移動したい。


## ■やり方
### Goto Anythingを使う

開いているフォルダーからファイルを検索する

```
Ctrl（Win）／Command（Mac）＋ P
```

さらに、先頭に記号を入力すると下記の機能が利用できるようになる。

```
:　→　Goto Line（指定した行番号へ移動）
@　→　Goto Symbol（functionや、CSSセレクターなどをシンボルとして検索）
#　→　ファイル内検索。他の検索機能とは違い、入力に対する候補一覧が表示
```

## ■所感
コマンドパレット（ctrl + shift + p）はよく使ってたのに、Goto Anythingはほとんど使ってなかった。使いこなしたら便利そうなのでどんどん使っていきたい。


## ■参考記事
「プログラミングやマークアップで特に役立つ、Sublime Textの標準機能」
http://www.buildinsider.net/small/sublimetext/02
Monaca開発入門_00


Node.js進捗だめです(´@ω@｀)

## 導入

iPhoneでもAndroidでも動くアプリケーションを作成したい。
簡単な機能だけなのでMonacaで開発することにしました。
Monacaは端的に言うとHTML5でモバイル開発ができるプラットフォームです。中身はPhoneGapです。
ネイティブの機能ざくざく使おうとしたら面倒ですけど、APIから情報取ってきて表示するだけなのでこれで十分。

## 利点
 - AndroidとiPhoneのアプリが1コストで作成できる
 - bootstrapが使えるのでUI作成らくちん
 - 学習コストが少なくて済む。HTML5なので潰しも効く

iPhone言語は覚えてもiPhoneでしか使えないので正直やりたくない。
あと単体の利点ではないですが、各種ブラウザ対応をしないで済むのでWebアプリケーションとしてまじめに組むより楽だと思います。
ユーザー側としても、Webアプリをブックマークさせるよりホーム画面から直接起動できる方が手順が少なくて済みますしね。


## 準備
 - [Monaca公式](https://ja.monaca.io/)からアカウントを取得
 - Monacaデバッガをデバッグ機にインストール
 - Monacaクラウドで開発開始！

らくちんです。

## 目標
取り敢えずRSSリーダー。
RSS取得解析リスト表示、あとはお気に入り機能が付けば十分かと。
macでlzhファイルをコマンドラインで解凍する方法

# Homebrewをインストール
入ってなかったらインストールします。

```bash
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
```bash
brew -v
# Homebrew 0.9.5
```

# brewでlhaをインストール
```bash
brew install lha
```
```bash
lha --version
# LHa for UNIX version 1.14i-ac20050924p1 (i686-apple-darwin13.4.0)
```

# lhaコマンドで解凍
```bash
lha e kaitoushitai_fairu.lzh
```

# finderで確認
解凍されたフォルダがあるはず

```bash
open .
```
MySQLのバージョンを調べました

MySQLのバージョンを調べました。

mysqlに-Vもしくは--versionオプションをつけると良いみたいです。

```
mysql -V
mysql  Ver 14.14 Distrib 5.5.20, for Linux (x86_64) using readline 5.1
```

```
mysql --version
mysql  Ver 14.14 Distrib 5.5.20, for Linux (x86_64) using readline 5.1
```
バージョンの結果が得られました。
Go by Example: Structs


(この記事は [Go by Example: Structs](https://gobyexample.com/structs) を翻訳したものです。)

Goの構造体はフィールドの型の集合体です。それらはレコードを形成するためにデータをまとめるに役に立ちます。

```go
package main

import "fmt"

// このpersonの構造体はnameとageというフィールドを持っています。
type person struct {
    name string
    age  int
}

func main() {

	 // この文法は新しい構造体を作成します。
    fmt.Println(person{"Bob", 20})
    
    // 構造体を初期化するときに、フィールドに値を代入できます。
    fmt.Println(person{name: "Alice", age: 30})
    
    // 省略されたフィールドはzero valueが入ります。
    fmt.Println(person{name: "Fred"})
    
    &プレフィックスは構造体へのポインタです。
    fmt.Println(&person{name: "Ann", age: 40})
    
    // 構造体のフィールドへアクセスするのには. でアクセスします。
    s := person{name: "Sean", age: 50}
    fmt.Println(s.name)

	// 構造体のポインタに対しても.がつかえます。この場合、ポインタは自動的に参照されます。
    sp := &s
    fmt.Println(sp.age)
    
    // 構造体は変更可能です。
    sp.age = 51
    fmt.Println(sp.age)
}


```

```
	
$ go run structs.go
{Bob 20}
{Alice 30}
{Fred 0}
&{Ann 40}
Sean
50
51

```
【RubyOnRails】Rails Grape + Carrierwaveで画像をアップロード

#概要
画像のアップロードについて簡単な資料がなかったのでメモ

```ruby:upload.rb
class ClassName < Grape::API
    resource "path" do
        params do
          requires :upload_file, type: Hash
        end
        post do
            begin
                #TODO 認証処理
                #TODO トランザクション処理
                Model.create({
                    upload_file: params[:upload_file]
                })
                return "succeeded"
            rescue #=> e
                #TODO 例外処理
                return "failed"
            end
        end
    end
```

Hashで受け取ってそれを設定するだけでCarrierwaveがうまいことしてくれます。

Chromeのアドオンpostmanにて動作確認が簡単に出来ます。
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/3a06b15e-ee50-f8d2-e46b-300fc76c2aa1.png)
Xamlで繰り返し要素を記述する

#概要
XAMLを書いていると単純な要素を複数並べたいと思う時があります。
TextBlockを10個並べるのに、TextBlockが10個並ぶのは、効率的ではないですよね。
HAMLとかJADEのように、XAMLのプリプロセッサが欲しくなるところですが、ItemsControlを使う事によってある程度解消することが可能です。
ItemsControlは、List系のコントロールの親クラスです。

#Styleを用意する
ItemsControlを使うとしても記述量が多くなっては、逆効果ですのでStyleを使って、共通的な項目を纏めておきます。

```xaml:CommonResourceDictionary.xaml
    <Style x:Key="HorizontalItemsControl" TargetType="ItemsControl">
        <Setter Property="Margin" Value="0" />
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled" />
        <Setter Property="ItemsControl.ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ItemsControl.ItemContainerStyle">
            <Setter.Value>
                <Style TargetType="ContentPresenter">
                    <Setter Property="Margin" Value="0" />
                </Style>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="VerticalItemsControl" TargetType="ItemsControl">
        <Setter Property="Margin" Value="0" />
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled" />
        <Setter Property="ItemsControl.ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Vertical" />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ItemsControl.ItemContainerStyle">
            <Setter.Value>
                <Style TargetType="ContentPresenter">
                    <Setter Property="Margin" Value="0" />
                </Style>
            </Setter.Value>
        </Setter>
    </Style>
```

#ItemsControlを記述する。
ItemsSourceの記述量が多いのがちょっと気になりますが、Xamlだけで繰り返し要素を簡単に記述することができました。

```xaml:Test.xaml
<ItemsControl Style="{DynamicResource HorizontalItemsControl}">
  <ItemsControl.ItemsSource>
    <x:Array xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:sys="clr-namespace:System;assembly=mscorlib"
             Type="sys:String">
      <sys:String>1</sys:String>
      <sys:String>2</sys:String>
      <sys:String>3</sys:String>
      <sys:String>4</sys:String>
      <sys:String>5</sys:String>
      <sys:String>6</sys:String>
      <sys:String>7</sys:String>
      <sys:String>8</sys:String>
      <sys:String>9</sys:String>
      <sys:String>10</sys:String>
      <sys:String>11</sys:String>
      <sys:String>12</sys:String>
    </x:Array>
  </ItemsControl.ItemsSource>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Label Content="{Binding}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>
```
PerlアプリでBuild.PLを作って依存するCPANをインストールする


# 目的

* Perlアプリを作ったので公開したい(第三者に渡したい)
* 依存するCPANがたくさんあるので、ちゃんとインストールしてほしい

# 使うもの

* perlbrew
	* 自分のマシンに入ってるCPANを一度アンインストールして、クリーンな状態からやり直すのはイヤだったので、独立した環境が欲しかった
	* 参考にしたのは [perlbrewで構築するモダンなPerl環境](http://www.seeds-std.co.jp/seedsblog/611.html)
* Module::Build
	* Build.PLを使いたかった
	* Makefile.PLでもよかった気がするが、アプリ自体のコンパイルは今回想定していないし、試してない

# 手順

## perlbrew で perl をインストール

```
$ curl -kL http://install.perlbrew.pl | bash
$ source ~/perl5/perlbrew/etc/bashrc
```

これで perlbrew 側の perl が使われるようになる。

```
$ perlbrew available
```

インストールできるPerlのバージョンが表示される。

```
$ perlbrew install 5.21.9
```

でインストールをする。かなり時間がかかる。

perl にオプションを渡したいときは、

```
$ perlbrew install 5.21.9 -Dusethreads
```

のようにここでオプションを渡す。

```
$ perlbrew list
  perl-5.21.9
```
とするとインストール済みのバージョンが表示される。

```
$ perlbrew switch 5.21.9
```
で実際に使用するよう切り替える。

```
$ perlbrew list
* perl-5.21.9
```

使用中のバージョンには＊マークがつく。

もしアンインストールしたいときは uninstall すればいいが、インストール済みのCPANなども一緒に消えるので注意。

```
$ perlbrew uninstall perl-5.21.9
```

## perlbrew で cpanm を有効にする

```
$ perlbrew install-cpanm
```

## Build.PLを用意する

```
$ cpanm Module::Build
```
をして別途インストールしておく必要がある。

Build.PLのファイルを作る。

```
$ vi Build.PL
```
内容は、こんな感じ。

```
use Module::Build;
my $build = Module::Build->new(
     module_name => 'Test::Web',
     license => 'perl',
     requires => {
                  'perl'           => '5.6.1',
                  'Mojolicious'    => '6.01'
                 },
  );
$build->create_build_script;
```

# 実行

```
$ perl Build.PL
```

で足りていないCPANがあるとエラーが出て、Build installdeps を実行しろというメッセージが出る。

perlbrewでインストールした直後だとCPANが全然入ってないので、CPANをrequiresにした場合は必ずエラーになるはず。

生成された Build ファイルを言われた通りに実行する。

```
$ ./Build installdeps
```

perlbrewのCPANにインストールされる。


これで目的のPerlアプリを動かしてみて、CPANが足りていなければエラーになるので、そのCPANをBuild.PLに追加する。
何回か繰り返して、必要なCPANが全てBuild.PLに記載されたら終わり。
Perlアプリと一緒にBuild.PLも配布すればいい。
Go by Example: Pointers



(この記事は [Go by Example: Pointers](https://gobyexample.com/pointers) を翻訳したものです。)


Goは、[pointers](http://en.wikipedia.org/wiki/Pointer_(computer_programming))をサポートしています。プログラムのの中で値とで構造体への参照を渡すことができます。


```go
package main

import "fmt"

// zeroval, zeroptrの2つの関数を値と比較してポインタがどのように動くかを見ていきます。zerovalはintのパラメータを持っています。引数が渡される事によってパラメータに代入されます。zerovalは呼ばれた関数の中の変数とは違うivalのコピーを得ます。
func zeroval(ival int) {
    ival = 0
}

// zeroptrは対照的に*intがパラメータです。これは、intのポインタをパラメータとして取ることを意味します。関数のbody中の*iptr参照先の値をメモリアドレスを参照しそのアドレスの現在の値を取得します。ポインターを参照して代入される値は参照された値を変更します。
func zeroptr(iptr *int) {
    *iptr = 0
}

func main() {
    i := 1
    fmt.Println("initial:", i)
    zeroval(i)
    fmt.Println("zeroval:", i)

	// &i 文法はiのメモリのアドレスを返します。たとえば,下記の例はiへのポインタです。
    zeroptr(&i)
    fmt.Println("zeroptr:", i)

	// ポインタはプリントすることもできます。
    fmt.Println("pointer:", &i)
}
```

```
$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100
```
【備忘録】border-radius

順番間違えたりするのでメモ

## border-radius指定

border-top-left-radius: ○○px;
border-top-right-radius: ○○px;
border-bottom-left-radius: ○○px;
border-bottom-right-radius: ○○px;

※chrome,firefoxで-webkit-border-radius、moz-border-radiusと指定しなくても効くの確認済み

## border-radius効くのは

IE8は効かない！！！
・IE9~,firefox,chrome

参考にする：
http://caniuse.com/#feat=border-radius

## 触る用

http://jsdo.it/RicoLiz/3uKE
定期実行の手法3パターンとその活用例


# 1. 定期実行の手法3パターン
- cronによる定期実行（crontabもしくはcron.dの活用）
- Jenkinsによる定期実行
- プログラムによる定期実行（while文とsleepメソッドの活用）

## 1-1. cronによる定期実行
### crontabの使い方
- `crontab -e`：edit。crontabファイルの編集。
- `crontab -l`：list。crontabファイルの内容表示。
- `crontab -r`：remove。crontabファイルの削除。

crontabファイルの書き方は下記の通り。

```
分　時　日　月　曜日　コマンド
```

||設定可能な数値|
|:--|:--|
|分|`0-59`|
|時|`0-23`|
|日|`1-31`|
|月|`1-12` or `jan-dec`|
|曜日|`0-7 (0,7は日曜)` or `sun-sat`|

||設定例|説明|
|:--|:--|:--|
|リスト|0,15,30,45|カンマ区切りで複数条件指定|
|範囲|1-5|1,2,3,4,5と同義|
|共存|1,3,5-7|1,3,5,6,7と同義|
|間隔値|1-7/3|1,4,7と同義|

※`crontab -e`は推奨しません。個人的には`cron.d`の使用をオススメします。

（参考URL）
▼crontab -e は「絶対に」使ってはいけない
http://d.hatena.ne.jp/ozuma/20120711/1342014448

### cron.dの使い方
記述方法はcrontabと同様。

```
sudo vim /etc/cron.d/hogehoge
```

- `hogehoge`ファイルに実行したいコマンドを書けばOK！

### cronの活用例
10分おきにroot権限で`test.php`を実行し、標準出力と標準エラー出力をログファイルに書き足す。

```
$ sudo vim /etc/cron.d/hogehoge

*/10 * * * * root php /path/to/test.php >> /var/log/hogehoge/fuga.log 2>&1
```

- `*/10 * * * *`：10分おき
- root：root権限で実行
- `php /path/to/test.php`：test.phpファイル実行
- `>>`：出力をファイルの末尾に追加
- `/var/log/hogehoge/fuga.log`：はき出し先のログファイル
- `2>&1`：標準出力と標準エラー出力を同じファイルに出力
- おまけ：`tail -f /var/log/hogehoge/fuga.log`により、ログの更新をリアルタイムにチェック出来る

## 2. Jenkinsによる定期実行
### Jenkinsの使い方
- ジョブを選択し「設定」をクリックすると、Jenkinsのジョブ設定が出来る
- 「定期的に実行」にチェックを入れると、スケジュールの設定が可能となる
- スケジュールの書き方はcronと同じ
- 「シェルの実行」の欄に実行したいシェルスクリプトを書けばOK！

### Jenkinsの活用例
毎日24:30（日本時間）にphpファイルを実行させ、結果をメールで送る。

```
30 15 * * *
```
- `分　時　日　月　曜日`：GMTの15時30分に毎日実行
- 日本時間はグリニッチ標準時間（GMT）より9時間進んでいる

```
REPORT_DIR="$WORKSPACE"/target
mkdir -p "$REPORT_DIR"
/usr/bin/php /path/to/test.php > "$REPORT_DIR"/report.csv
DATE=`date +%Y/%m/%d`
cat "$REPORT_DIR"/report.csv | /bin/mail -s "${DATE} デイリーレポート" -r aa@hoge.co.jp -c bb@hoge.co.jp -c cc@hoge.co.jp dd@hoge.co.jp ee@hoge.co.jp
```

- `$WORKSPACE`：`build.xml`の`<workspace>`に記述された環境変数
  - （例）`/var/lib/jenkins/workspace/ジョブ名`
- `$REPORT_DIR`：僕が勝手に作った変数
- `/usr/bin/php /path/to/test.php > "$REPORT_DIR"/report.csv`：phpスクリプトの実行結果をCSVファイルに書き出す
- `date +%Y/%m/%d`：現在の日付を取得
- メールコマンドについてはこちら参照
  - http://qiita.com/shuntaro_tamura/items/40a7d9b4400f31ec0923

- おまけ
  - `$JENKINS_HOME`：`/var/lib/jenkins`
  - `build.xml`のパス：`$JENKINS_HOME/jobs/ジョブ名/builds/ビルド番号/build.xml`

## 3. プログラムによる定期実行
### php
```
while (1) {
    // 処理
    sleep(5 * 60); // 5分おき
}
```

### Java
```
while (true) {
    // 処理
    try{
        Thread.sleep(5 * 60 * 1000); // 5分おき
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
```
golang で string のポインタを取得する

# string のポインタが必要になる状況

string の*ゼロ*は空文字列```""```です．nil になることはありません．ただし，空文字列とは別に特別な値を取りたいこともあります．

たとえば ORM ライブラリ [gorm](https://github.com/jinzhu/gorm) の Hstore (key=>valueが入れられる postgresql のカラム)は

```
type Hstore map[string]*string
```

と定義されていて，key=>valueの value の方を文字列のポインタで扱うようになってます．これは DB の方の value が NULL をとれたりする(空文字列じゃなくてNULLがセットできる)ためです．

# 文字列のポインタを得る

```
a := &"Hello, World"
```

とやっても

```
cannot take the address of "Hello, World"
```

と怒られます．

# 解決方法

**(1)いったん変数に代入してそのアドレスを取る**

```
tmp := "Hello, World"   
a := &tmp
```

**(2)アドレスを返す関数を用意しておく**

```
func toPtr(s string) *string {
    return &s
}

a := toPtr("Hello, World")
```

# 設計を見直す？

普通は string のポインタ使ってる時点で何かおかしいんで，こういうこと考えなきゃいけないときは設計を見直した方が良さそうです．

NULL の時もある文字列みたいなものを表現するのに，sql パッケージには[sql.NullString](http://golang.org/pkg/database/sql/#NullString) というものが用意されています．

```
type NullString struct {
        String string
        Valid  bool // Valid is true if String is not NULL
}
```

フラグを立てて，Valid じゃないときは NULL として扱うようになってます．

どうしても NULL と空文字列を区別するような文字列が必要になったら，こういった仕組みの型を別に用意した方が良さそうです．


---
※前に書いた記事がポエムっぽかったのでそちらは[はてな](http://ikawaha.hateblo.jp/entry/2015/03/04/184857)に移しました．
5分でできるVagrantでDjangoの環境構築

Webアプリケーションの開発をする方法としてフレームワークを使用する方法があります。フレームワークには色々とありますが今回はPythonで開発ができる[Django](https://www.djangoproject.com/)を使用します。また、開発環境の構築方法としてテスト用のローカルの環境を作りたいのでVagrantを使用して作成します。

# Vagrantのセットアップ
## Vagrantの初期化と起動
今回はゲストOSとしてUbuntuを使用します。[Vagrant](https://www.vagrantup.com/)のインストールは事前にしておいてください。また、VMとして[VirtualBox](https://www.virtualbox.org/)を使用しています。

また、vagrantのboxとしては”hashicorp/precise64”を使用しています。Vagrantのboxに入っていない場合には次のコマンドによりVagrantのboxに追加をしておいてください。

```
$ vagrant box add hashicorp/precise64
```

Vagrantを実行する際には適当なフォルダを作成して、その中で実行するのが良いでしょう。ここでは、~/Vagrant/Djangoというフォルダを作りそこで実行しています。

```
$ mkdir -p ~/Vagrant/Django
$ cd ~/Vagrant/Django
$ vagrant init hasjicorp/precise64
```
できたVagrantファイルの設定を変更します。ここではlocalhost(127.0.0.1)のポート12345でDjangoにアクセスするようにします。
適当なエディタでVagrantfileを開きます。

```
$ vim Vagrantfile
```
ファイル内に以下の内容を追加します。

```
config.vm.network "forwarded_port", guest: 8000, host: 12345
```

設定した条件でVagrantを起動します。

```
$ vagrant up
```

起動したVM内に入ります。

```
$ vagrant ssh
```

# Djangoのインストールと起動
起動したVM上にDjangoをインストールします。

まずpipをインストールします。pipはPythonで書かれたパッケージソフトウェアをインストール・管理するためのパッケージ管理システムです。これを使うことにより、簡単にDjangoをインストールすることができるようになります。

```
vagrant@precise64:~$ sudo apt-get install python-pip
```

pipによりDjangoをインストールします。その後、django-admin.pyを使ってプロジェクトを作成します。

```
vagrant@precise64:~$ sudo pip install Django
vagrant@precise64:~$ sudo django-admin.py startproject spam
```

DBのマイグレードを行いサーバを動かします。Djangoはポート8000で動作していますが、ホスト側からはVagrantで設定した127.0.0.1:12345からアクセスすることになります。

```
vagrant@precise64:~$ cd spam/
vagrant@precise64:~/spam$ sudo python manage.py migrate
vagrant@precise64:~/spam$ sudo python manage.py runserver 0.0.0.0:8000
```

起動後にVagrantファイルで事前に設定したローカルホスト(127.0.0.1:12345)にアクセスすることで、Djangoが動作していることがわかります。

![Welcome_to_Django_と_Welcome_to_Django.png](https://qiita-image-store.s3.amazonaws.com/0/33620/6868d845-c4cb-9efb-8722-d6c09187bf36.png "Welcome_to_Django_と_Welcome_to_Django.png")