OmniAICreator/Qiita-1.07M huggingface dataset:
php.iniの置き場所

cakephpを使ってwebアプリを作ろうと思ったら、導入して、とりあえず実行してみたら

```text
Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /var/www/html/cakephp/lib/Cake/Cache/CacheEngine.php on line 60

Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /var/www/html/cakephp/lib/Cake/Cache/CacheEngine.php on line 60
```

って警告されました。
なんのことかよくわからなかったのですが、

date_default_timezone_get()

使ってるけど、デフォルトのタイムゾーン設定してないじゃん
ってことらしい。
http://kforce-ueda.hatenablog.com/entry/2014/01/22/095059

なのでphp.iniのModule　Settingなる場所をいじる必要があるらしく、php.iniを探そうとしたが場所がわからない。

なので調べるとどうやら、自動インストールした場合は

/etc/php.ini

にあるらしいので、

date.timezoneを変更しました。
http://oshiete.goo.ne.jp/qa/3220382.html


ちなみに
CacheEngin.phpを下記に書き換えました。
たぶん６０行目くらいにあります。

```php
if (!is_numeric($this->settings['duration'])) {
			date_default_timezone_set('Asia/Tokyo');
			$this->settings['duration'] = strtotime($this->settings['duration']) - time();
		}
		return true;
	}
```

この設定したら、いろいろエラーが解消しました。
brewのzsh-completionsを使ってzshの補完を強化する


## やりたいこと

railsを触りだしたので、慣れていないコマンドの補完をzsh上でしてほしくなった。

## 環境

- Mac OS 10.9.2
- zsh 5.0.5 (x86_64-apple-darwin13.0.0)
	- brew install zsh したものを使用している

## やったこと

### zsh-completionsをインストール
```
brew install zsh-completions
```

`/usr/local/share/zsh-completions` の下に補完用のファイルがわらわら出来ている。

### ~/.zshrc に設定を追記

```.zshrc
if [ -e /usr/local/share/zsh-completions ]; then
    fpath=(/usr/local/share/zsh-completions $fpath)
fi
```

### 動作確認

ターミナルを開き直すか、`source ~/.zshrc` で再読み込みをして確認。

rails (+スペース)まで入力してタブキーを押して無事に補完がでました。

```
$ rails 
application      -- Generate the Rails application code
benchmarker      -- See how fast a piece of code runs
console      c   -- Start the Rails console
dbconsole    db  -- Start a console for the database specified in config/database.yml
destroy      d   -- Undo code generated with "generate"
generate     g   -- Generate new code
plugin           -- Install a plugin
profiler         -- Get profile information from a piece of code
runner       r   -- Run a piece of code in the application environment
server       s   -- Start the Rails server
```

## 参考リンク

http://mitukiii.hatenablog.com/entry/2013/06/06/190840
https://github.com/zsh-users/zsh-completions
Kobitoを使ってみる


Kobioとかとりあえず使い勝手とか見てみる。いろいろ使いながら書いてみるだけ。

- プレビューがあるのはいいよね
- 改行が入らないとリストにはならないようだ
- これは単純にMarkdown記法の作法ってことかな？
- 記法そのものは思ったより数が少ない感じ
- HTMLタグは使えるからどうにかしたかったらそっち使えってことか
- kobitoからQiitaにアップしようとすると結構落ちる？API叩きにいくところに問題があるのかな？

## 画像の投稿


![DSCF2234.jpg](https://qiita-image-store.s3.amazonaws.com/0/40572/03dbf2bb-db65-047a-2066-f792a845b125.jpeg "sample.jpg")

おーiPhotoからドラッグで画像つけれた。
これは便利!
あ、でも画像はqiitaにアップロードれるようだけど、扱いはどうなってるのだろう？

- 画像URLを見ると単純にS3にアップロードされてるようだ
- kobitoに入ってた説明では一枚500kbで一月2MB(公開で記事を投稿すると100MB)という制限になってるけど、500kb以上のサイズがアップロードできた
- http://blog.qiita.com/post/77048159860/auto-image-compression 公式ブログ見ると、最大1MBと書いてあるので、こっちが正しいのだろう
- 1MBを超える画像は自動で圧縮されるみたい
- 自分がアップロードした画像一覧とかないか探してみたけどこれも特になさそう=>今月のアップロード容量は設定から確認できる
- アップロードした画像一覧の確認と削除とかはそのうちなんだろうか？

## テーブル

| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| This       |        This |     This     |
| column     |      column |    column    |
| will       |        will |     will     |
| be         |          be |      be      |
| left       |       right |    center    |
| aligned    |     aligned |   aligned    |

- いくつか作法とかルールがあるようだ
- 行ごとに背景色が勝手に変わる
- 必ず最上段は見出しでBoldになる
- 見出しは一行のみ
- 見出しの後に行揃えを指定可能な区切り線を指定する
- 区切り線は基本---で指定する
- 行揃えは左右中央の3つ、デフォルトは左寄せ
- |:---| =>左寄せ
- |---:| =>右寄せ
- |:--:| =>センタリング
- 区切り行は3文字以上の指定が必要っぽい
- つまり、||の間が3文字以上であればよい
- 可能な書式 => |:--| / |:-:| / |---|
- |:-:| は :-: で3文字だからOKなんだと思う

## プレビューモードと編集位置

- ある程度書き進んだ時に、下の方をプレビューで確認したいが変更のたびにプレビューが一番上に戻ってしまうのはちょっと残念
- 位置を覚えて移動してほしいなあ
- 間違ってたので打ち消し線使おうと思ったら~~打ち消し~~は使えないのね
- \<del>打ち消し\</del>ってすると<del>こうなるようだ</del>。ちょっとめんどい
- \~~による打ち消しがサポートされたようだけど、kobitoにはまだ反映されてない(1.9.1)次の更新で使えるようになるかな？
- プレビュー位置の移動は、編集位置と同期して動く、ただし、大きな画像が入るとその位置情報が崩れるためプレビューとソースの位置が合わなくなることがある。というのが正しそう

## 編集履歴

- Qiitaにアップロードした時点で履歴が作られる
- つまり、Git commit + push
- 履歴は公開されるようだが、非公開の間の履歴も公開されちゃうんだろうな
- 履歴は部分的に削除とかはできないっぽい、記事自体の削除はできるのでそれで対応なのかな
- 公開した記事はプルリクエストを受け付けられるようになっていて、修正依頼とかが来る、ってまんまGitHubだ

## 文字装飾

- 色付けはできないっぽい
- **強調**、 _イタリック_、見出しだけっぽい
- 指定するには*か_で囲む、一つだと_イタリック_で2つだと**強調**
- 指定の際には、前に半角スペースが必要。後ろにも必要と書いてあったけど、それはなくてもいいようだ

## 見出し

>
# H1 Qiita上では背景がグレーになる
## H2 下線が装飾としてつく
### H3
#### H4
##### H5
###### H6

## コード

`print 'code without Syntax highlighting'`
単純に\`\`で囲むとコードとして扱う`print "このようにインラインで使える"`が、シンタックスハイライトはしない。

```python
print 'code with Syntax highlighting'
```
\`\`\`で囲むと、インラインでは使えなくなるが、シンタックスハイライトされる。
\`\`\`言語名 とすると、言語の種類が最初に表記されシンタックスハイライトも言語に合ったものになる。
=>chromeでは言語名は表示されなかった。kobito内のプレビューでは出てる。

```
print 'code with Syntax highlighting'
```
シングルクオートだと、こうなっちゃうようだ

```
print "code with Syntax highlighting"
```
ダブルクオートだと大丈夫
=>これも、kobito内だと何かしらシンタックスハイライトを仕様としているが、Qiitaにアップすると装飾なしに変更されていた


```python:print.py(日本語もOK)
print 'code with Syntax highlighting'
```
そもそも言語をちゃんと指定しなさいということだな
\`\`\`言語名:ファイル名　としておくと、ファイル名をつけれる。
フルパスとか日本語でもOKなようなので、任意の文字列といったほうが正しいようだ

- デフォルトのシンタックスハイライトはなにかはよくわからないな=>そもそも指定しないと装飾なしになったようだ
- kobito内蔵のレンダリングがQiitaの最新版と違うとかかもしれないな
- http://qiita.com/Qiita/items/e84f5aad7757afce82ba 仕様詳細
テーブルのvarchar型をHibernateでLocalDate型としてマッピングする

org.jadira.usertypeでhibernateのusertypeのサポートしてるのでこれを使うと楽です

```java
@Column
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDateAsString")
private LocalDate myDate; 
```

中身はhibernateのEnhancedUserTypeを実装してるAbstractSingleColumnUserTypeを継承してvarcharとLocalDateをマッピングしてくれてます

```java


package org.jadira.usertype.dateandtime.joda;

import org.jadira.usertype.dateandtime.joda.columnmapper.StringColumnLocalDateMapper;
import org.jadira.usertype.spi.shared.AbstractSingleColumnUserType;
import org.joda.time.LocalDate;

public class PersistentLocalDateAsString extends AbstractSingleColumnUserType<LocalDate, String, StringColumnLocalDateMapper> {

    private static final long serialVersionUID = -1039569606757252201L;
}
```
JavaScriptのスタイルガイドまとめ(おすすめ4選)


# はじめに

スタイルガイド自体は各々のルールでかなりの数が存在しますが、
下記のおすすめ4選を押さえておけば問題ないと思います。

# おすすめ４選

## Google JavaScript Style Guide

Googleによる、最も代表的なスタイルガイドです。
時間のない方は、これだけにでも目を通しておく事をおすすめします。

JavaScriptのBad Partsについても述べられています。

英語：https://google.github.io/styleguide/javascriptguide.xml
日本語：http://www38.atwiki.jp/aias-jsstyleguide2/pages/1.html

Closure Linterを使用することで、チームでの統一がしやすくなります。
[グーグル製JavaScript文法チェッカー](http://www.publickey1.jp/blog/10/google_javascript_style_guidejavascript.html)

## jQuery JavaScript Style Guide

説明不要のフロントの定番、jQueryによるスタイルガイドです。

英語：https://contribute.jquery.org/style-guide/js/

## Airbnb JavaScript Style Guide

GitHub上で最も人気のある[^1]、[Airbnb](http://www.atmarkit.co.jp/ait/articles/1211/30/news123.html)のスタイルガイドです。

特徴は翻訳者であるmitsuruogさんの[こちらのブログ](http://blog.mitsuruog.info/2013/02/airbnb-javascript.html)で述べられていますが、下記二点となります。

- オープンな議論を通じてスタイルが決定していること。
- スタイルについてパフォーマンスに関するエビデンスがあること。

英語：https://github.com/airbnb/javascript
日本語：http://mitsuruog.github.io/javacript-style-guide/

## Node.js Style Guide

GitHub上で人気のある[^1]、[Mr.felixge](http://felixge.de/)によるNode.jsのスタイルガイドです。

前述のスタイルガイドとは異なり、`var`の使いかた等、
Node.jsでよくみられる使いかたを推奨しています。

英語：https://github.com/felixge/node-style-guide
日本語：http://popkirby.github.io/contents/nodeguide/style.html

# まとめ

スタイルガイドはそれぞれ推奨、非推奨が異なっている場合があります。
絶対にこれが正解ということではなく、あくまでケースバイケースです。

個人的に重要だと感じる事は一つで、
「個人なら個人で、チームならチームで一貫性を保つ」
ことだと思います。

[^1]: 執筆時点2014/04/06での人気(Star数)となります。

# 外部アカウント

技術情報のみつぶやくアカウント作成しました。JavaScriptは最新情報も追っていきます。
[Twitterはこちら]
(https://twitter.com/takeharumikami)
[Feedlyのフォローはこちら]
(http://cloud.feedly.com/#subscription%2Ffeed%2Fhttp%3A%2F%2Fqiita.com%2Ftakeharu%2Ffeed)

# おすすめの記事

入門者がつまづく、thisの挙動を4種類に分けて簡単に学ぶならこれ。Apply, callの挙動までわかる。
[JavaScriptの「this」は「4種類」？」](http://qiita.com/takeharu/items/9935ce476a17d6258e27)

JavaScriptはオブジェクト指向？プロトタイプベースのオブジェクト指向を学ぶなら。
[JavaScriptのプロトタイプからオブジェクト指向を学ぶ](http://qiita.com/takeharu/items/809114f943208aaf55b3)
使ってるUbuntuが64bitなのか32bitなのか確認する

#その情報が必要になった時って
大体忘れてる頃なのです。

#確認します。

```bash
$ uname -a
Linux tea 3.8.0-37-generic #53~precise1-Ubuntu SMP Wed Feb 19 21:37:54 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
```

`x86_64`の文字があるので64bitぽい

#判断基準は
`uname -a`の結果に、
* `i686 i686 i386`などと表示されれば32bit
* `x86_64`や`amd64`などと表示されれば64bit

#でも出てくる情報が多くてよくわからないね…
`uname -m`や`uname -i`が非常にわかりやすい
`getconf LONG_BIT`という手もある
##ただし
`uname -m`はハードウェアとしてのCPUのbit数を確認するものなようなので、注意

#結局
`getconf LONG_BIT`が一番わかりやすくていいと思う


###蛇足
`gcc -v`してTargetの欄を見るのもあり（煩雑
[WIP]GDC2014木曜日と金曜日メモ

GDC2014の振り返り。帰国後2週間ほど調子が悪く寝ていた。
木曜日と金曜日の分をやっと纏めたので、それを載せる。

## Crimewatch 2.0: Redesigning EVE Online's Policing System

http://schedule.gdconf.com/session-id/825945

EveOnlineに於ける治安監視システムの作り直しの話。作り直す前のシステムでは、攻撃された被害者は、加害者にのみ半減期することを許可していた。そうすると、どこまでが反撃可能なのか曖昧になってしまい、管理が大変になった。そのため最終的に、犯罪を犯したものはその後、15分誰からもペナルティなしで攻撃できるという形に切り替えた。
複雑なシステムを、修正しようと更に複雑さを導入するのはまずいという言葉が印象的だった。

## Evolving the Server-Side Architecture of League of Legends

http://schedule.gdconf.com/session-id/826112

LoLのサーバサイドの進化の話。最初は、javaのjarの塊で、1boxの上に他のサーバプログラムとともに乗っていた、人気が出るに連れて、チャットマッチングのようなプログラムは分離させていき、サーバも台数も増やした。それでも劇的なユーザー増加に押されてて、サーバのデバックが難しくなった。設計上の大きな決断は、そのようなサーバプログラムを、マイクロサービス・プログラムとして作りなおしたことだ。設計として心がけたのは、HTTPを使ったRestfuilなサービスとして書きなおしたことになる。Restfulなりソースベースのサービスはゲームとよくマッチすると言っていた。

## Managing Code Complexity in Asynchronous Distributed Server Architectures

http://schedule.gdconf.com/session-id/825586

C++で、コードジェネラータを使って、自動でC++の通信部分を作る話。xmlを使っていたり、eventドリブン形式だったりと、関係者から嫌な汗が出るどこかで見たシステムを見ているようだった。コルーチンのコードもxmlで書けるぜーというサンプルが、結構ひどくて、会場がざわついていた。
なんか色々酷かった気がする。

## Sexism and the Game Industry: An Empirical Study

http://schedule.gdconf.com/session-id/826004

ゲーム産業における性差の話。何故ゲーム業界には女性が少ないのかの話。大きく分けて2つの側面があり、ガラスの天井と、ボーイズ・クラブとしての側面だ。ガラスの天井は、昇進に於ける不合理な扱いで、ボーイズクラブは、男子校的なノリのことだ。女性はその場にいないことになってしまう。最後にもう少し中性的なゲーマー文化は作れないかという話で終わっていた。

## Overview of the Chinese Mobile Game Ecosystem

http://schedule.gdconf.com/session-id/828047

中国のモバイル市場の概況。
4億5千万のユーザーが居る。200億ドル規模の市場で、モバイルゲームは、50億ドル程度。要は急成長している。モバイルのマーケットはユーザーシェアでは、Androidが圧倒的だが、iOSユーザーの方が金払いは良い。
アンドロイドのマーケットストアは乱立しており、QihooやBidoo,Tencent,Wandoujiaあたりが大手。
開発者とストアの取り分は、50%50%というたてまえだが、実際は、開発者はもっと低い。三割くらいが取り分のようだ。
ゲームカテゴリでは、カードバトルパズルアクションRPGが強い。
コンバージョン率は、カードバトルが最も高く、ARPPUはRPGとストラテージが高い。ARPPUが50ドルを超えるとかちょっとしたお金持ちだなッて思う。
8万のゲームスタジオがあり、毎日100個のゲームがリリースされる。


## Curating Video Game Culture: The New Wave of Video Game Events

http://schedule.gdconf.com/session-id/825914

ゲームカルチャーのキューレーションの話。ニューヨーク、ロサンジェルス、トロント、オースティン、ロンドンで、ゲームをメインに据えたコミュニテーやコミュニテースペースのオーガナイザーが集まって、各都市のゲームコミュニティーの現状を報告していた。ゲームと言っても新しいゲームではなく古いゲームが多く、それをみんなで遊ぶような形式が多い。ゲームを中心に音楽やったり単純に遊んだりと、ゲーマーとよりはゲームを介して地域の再生やコミュニティの再生を願っているような気もした。


## Accessibility: Lessons Learned from Designing for Gamers with Disabilities

http://schedule.gdconf.com/session-id/825922

障害とゲームデザインの話。ゲームの世界を盛り上げるためのギザギザのフォントは読みにくいで、読みやすくするオプションがあったり、字幕をつけたりできる。
ゲームデザインのガイドラインがあり、色盲の人がどのように画面が見えるかシミュレートして、改善するツールもある。
16時間開発者を使えば、12%のゲームで、字幕が作れて、14%のゲームで、失読症の人向けのフォントが、有効にできる。
といろいろ実例を上げて説明していたが、講演後の質問では、そのような障害を持った人をどのようにテスターにするか？どのように見つけたらよいかという点に質問が集中していた。
FreeBSD で bundle install で nokogiri をインストールする。

[nokogiri](http://nokogiri.org/) ( [gem](http://rubygems.org/gems/nokogiri) ) のインストール時に libxml/libxslt/iconv への依存がある。

インストール時に gem のときは `gem install nokogiri -- --with-xml2-lib=/usr/local/lib --with-xml2-include=/usr/local/include/libxml2 --with-xslt-lib=/usr/local/lib --with-xslt-include=/usr/local/include/libxslt --with-iconv-lib=/usr/local/lib --with-iconv-include=/usr/local/include` とすればよいが、 [bundler]
(http://bundler.io/) ( [gem](http://rubygems.org/gems/bundler) ) の場合、以下のように `bundle config` を利用する。

* `bundle config build.nokogiri -- --with-xml2-lib=/usr/local/lib --with-xml2-include=/usr/local/include/libxml2 --with-xslt-lib=/usr/local/lib --with-xslt-include=/usr/local/include/libxslt --with-iconv-lib=/usr/local/lib --with-iconv-include=/usr/local/include`

この内容は *~/.bundle/config* にストアされ、 `bundle install` 時などに参照される。

ただし、この状態だと `bundle config` で変な位置で改行が入ってしまうため、 `bundle install` 時に *Syntax error: Unterminated quoted string* が発生する。

対策として、 `vim ~/.bundle/config` などして改行を取り除くとよい。

# 参照

* [Cucumber実行時に Nokogiri + LibXMLの警告が発生 | CreativeStyle](http://kadoppe.com/archives/2012/03/cucumber実行時に-nokogiri-libxmlの警告が発生.html)

  libxml/libxslt/iconv オプションの例示

* [What to do if libxml2 is being a jerk](https://github.com/sparklemotion/nokogiri/wiki/What-to-do-if-libxml2-is-being-a-jerk)

  `bundle config` コマンドの例示
ざわちんメイクにエンジニアが学ぶべきこと

# ざわちんメイクにエンジニアが学ぶべきこと

## ざわちんメイクとは？

 * 有名なの
  [http://matome.naver.jp/odai/2138784001230533201](ものまねメイク　ざわちんが、嵐５人コンプリートｗｗｗｗｗ)

## 何を学べというの？

 * 他人の特徴をトレース出来るとかすごくないか？

## エンジニアはコミュ力が足りない？

 * よく言われますね？
 * ここで他業種を見てみよう！
 * やべぇ、このヒトヤベェってなった

## 理由

 * 自分がなってみたい人間になれるだけの観察眼
  * あ、ざわちんとは全くもって無関係ですし、出来ればマスクしてていいからお近づきになりたいです。
 * 相手の特徴を捉える観察眼
  * 見た目の特性だけでも、どれだけ相手に興味を持って接してるかという類稀なことだと思う
 * 見た目の特性とかエンジニアに必要？
  * 必要！超必要！
  * 残念だけど、ぱっと見で納得してもらわないとなんだよ！！

## 結論

 * ざわちん、すげー
Rubygems を Ruby と別パスで利用する。

環境変数で *GEM_HOME* を指定する。

このパスの配下に gem がインストールされる。

例えば `export GEM_HOME=$HOME/.local/Rubygems/2.1.1` 等。

# 確認した環境

* FreeBSD 10.0
* Ruby 2.1.1.p76
* Rubygems 2.2.2
githubで2段階認証を設定したらpushできなくなった


## 現象

keyの設定は正常。

```
$ ssh -T git@github.com
Warning: Permanently added 'github.com,192.30.252.128' (RSA) to the list of known hosts.
Hi myoan! You've successfully authenticated, but GitHub does not provide shell access.
```

しかし、正しいpasswordを入れてもinvaildと言われてしまう。

```
Username for 'https://github.com': myoan
Password for 'https://myoan@github.com':
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/myoan/repository.git/'
```

しかも、以前はきちんとpushは出来ていた。

## 原因
githubの2段階認証をonにすると、httpsプロトコルで登録してるrepositoryごとにOAuthのアクセストークンを生成する必要があるっぽい。

## 解決策

(追記)はい、投稿から10秒で良さげな解決策をだされている投稿を見つけました。
- 参照 [hubを2-factor authentication（2要素認証）有効でも使いたい](http://qiita.com/izumin5210/items/28dfd5fa9e03fb68c042)

解決策は2つ。

### 1. レポジトリ用にアクセストークンを生成する
どうしても安全に利用したい場合(社用で開発しているものとか)

- 参照: [Creating an access token for command-line use](https://help.github.com/articles/creating-an-access-token-for-command-line-use)

ただし、この場合アクセストークンをpushの度に聞かれることになる。

試してないけど、macならosxkeychainを利用できるらしい。
- 参照: [Set Up Git](https://help.github.com/articles/set-up-git)

(keychain使ってないんだけどどうしよう...)

### 2. gitプロトコルつかう
自分用のレポジトリはgitプロトコルを使えばいいと思う。
(追記: gitプロトコルを明示しました。uasiさん、ご指摘ありがとうございました)

```
$ git remote set-url origin git://git@github.com:myoan/repository.git
$ git push

Counting objects: 5, done.
Writing objects: 100% (3/3), 255 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:myoan/repository.git
   6ec9b96..100c737  master -> master
```


自分用と会社用のを分けようかなぁ...
Javaでメソッド内部に名前付クラスを定義する（ネタ）

普通にできる。でもあまり使わない。

```MethodInner.java
package neta;

public class MethodInner {
    public static void main(String[] args) {
        new MethodInner().proc();
        class ThreadB extends Thread{
            public void run(){
                System.out.println("runB1:"+ getClass());
            }
        }
        new ThreadB().start();
        new ThreadC().start();
    }

    private void proc() {
        class ThreadB extends Thread{
            public void run(){
                System.out.println("runB2:"+ getClass());
            }
        }
        new ThreadB().start();
    }
    
    static class ThreadC extends Thread{
        public void run(){
            System.out.println("runC:"+ getClass());
        }
    }
}
```

```
runB2:class neta.MethodInner$2ThreadB
runB1:class neta.MethodInner$1ThreadB
runC:class neta.MethodInner$ThreadC
```
Railsで本番環境でCSSが読み込まれなかったとき簡易メモ


`be rake assets:precompile RAILS_ENV=production`

`be rails s -e production`

したらCSSが読まれなかった

`be rake tmp:pids:clear`
            
`be rake tmp:sessions:clear`

`be rake tmp:sockets:clear`

`be rake tmp:cache:clear`

したらCSS反映された

## 例外

```:config/environments/production.rb
config.assets.precompile += %w( 任意のjs )
```

に設定してassets_pipelineで扱うcss/jsから分離したいjsファイルがあったんですが、ちょっと今ハマってます。`be rails s -e production`時にCSSもJSも読み込まれない。

エラーは

```
ActionController::RoutingError (No route matches [GET] "/assets/application-7dff9baa60e76434a2f68850d117df69.css"):

ActionController::RoutingError (No route matches [GET] "/assets/non_precompile/new_student_lectures_checkbox-3302b9a153efe192e717277e9ff36e6d.js"):
```

くそう
PHP「関数」、「特定の文字列を抜き取る」


##メールアドレスからドメイン名(.com)を取り出す作業をPHPの関数で実行してみる。
↓今回の目標(メールアドレスからドメイン名を取得する)
![php01.png](https://qiita-image-store.s3.amazonaws.com/0/35975/028afd76-4966-4c5b-d5cc-01d39021be9f.png "php01.png")


##今回使う関数

* メールアドレスの「@」が何文字目かを調べる関数
* メールアドレスの「○」文字目から後ろの文字列を取り出す関数

## strpos関数を使って「@」の位置を抽出する

```php
<?php
echo strpos("mail@tsukishimaao.com", "@");
?>  //4

```

実行結果↓
![php2.png](https://qiita-image-store.s3.amazonaws.com/0/35975/1e7060b2-e196-0ca8-ee42-2fed2686f9ec.png "php2.png")

「strpos関数」は、文字列から指定された値を探す関数です。見つかった位置を数値で返します。ただし、その値は0から始まるので、「4」が返されたという事は「5文字目」に含まれている事を示しています。
上記の例では、メールアドレスから検索した「@」が5番目に見つかったので、0から数えて`4`の値が出ました。


## substr関数とは？
### 「文字の一部を切り取る」関数

まず「substr関数」の使用例を見てみましょう。

```php

<?php
echo substr("mail@tsukishimaao.com", 5, 12);
?>  //tsukishimaao


```

実行結果↓
![php03.png](https://qiita-image-store.s3.amazonaws.com/0/35975/d0825911-f814-7f3c-bed0-4f8ea9f7a149.png "php03.png")

この関数で何が起こってるか説明していきます。

`echo substr("mail@tsukishimaao.com", 5, 12);`の最後尾に`, 5, 12`と数字が入っています。
これは

「`mail@tsukishimaao.com`の先頭から`5番目`の文字を頭にそこから`12番目`の文字までを取得する。」

という意味です。

ただし、「数の数え方は０からです」。

よって`mail@tsukishimaao.com`の先頭から5番目(最初は0番目)は`tsukishimaao`の`t`になります。

次に、そこから`12文字分を`を取得なので`t`から12個かぞえて行くと12文字目は`tsukishimaao`の`o`です。

よって、取得した合計は='tsukishimaao'ということになります。


### 指定位置から後の文字列すべてを取得
もし、下の様に「取得する文字数」を省略したらどうでしょう？

```php

<?php
echo substr("mail@tsukishimaao.com", 5);
?>  // tsukishimaao.com


```
実行結果↓
![php04.png](https://qiita-image-store.s3.amazonaws.com/0/35975/fb88db55-641d-c743-7969-103cc1ff151b.png "php04.png")

つまり`0`から数えて`5`文字以降すべての文字列が取得されています。

現実的にはこちらの方が使用度が多いのではないかと思います。


## PHPスクリプト

メールアドレスからドメイン名を取得するPHPスクリプトを実際に書いてみます。

```php
<?php
$a = "mail@tsukishimaao.com";
$b = strpos($a, "@");

echo substr($a, $b);
?>  // @tsukishimaao.com 

```
実行結果↓
![php05.png](https://qiita-image-store.s3.amazonaws.com/0/35975/4f1f0eb9-9f5f-11c1-94aa-9fa6a28d6e10.png "php05.png")

まだ`@`がついてますが、ここまで抽出出来ました。

### 最後に@を消して完成する。

以下の様に対応します。↓
(`substr関数`の2番目のパラメーターに[+1]を追加する)

```php
<?php
$a = "mail@tsukishimaao.com";
$b = strpos($a, "@");

echo substr($a, $b + 1);
?>
```
実行結果↓
![php06.png](https://qiita-image-store.s3.amazonaws.com/0/35975/3c79d405-9c28-edc7-5586-bf61169f096c.png "php06.png")


以上簡単では有りましたが、phpの「文字列関数」を利用して、メールアドレスからドメイン名を取得するをやってみました。
MongoDBのインストール（homebrew）


mongodbをhomebrewでインストール

これはSSL付き

```lang:コンソール
brew install mongodb --with-openssl
```

このメッセージがでて反応がないので、あきらめる

```
/usr/local/opt/scons/bin/scons install --prefix=/usr/local/Cellar/mongodb/2.
```

これはSSLなし

```lang:コンソール
brew install mongodb
```

こっちは、成功！

起動設定

```lang:コンソール
ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
```

起動

```lang:コンソール
mongod
```

コマンドラインクライアント起動

```lang:コンソール
mongo
```



## 参考にしたサイト
[MacにmongoDBをインストールする。そしてちょっと使ってみる。](http://nigohiroki.hatenablog.com/entry/2013/01/05/234631)

[macでmongoDBのインストールから起動まで](http://dackdive.hateblo.jp/entry/2014/02/09/020251)

[Install MongoDB on OS X](http://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/)
zsh環境下でrails、gemコマンドを補完したい


zsh環境でRuby on Railsの開発を行おうと思ったら`rails`コマンドを補完してくれないじゃないですか…！
ということでzsh-completionsを導入して補完できるようにします。

**zsh-completions**
[https://github.com/zsh-users/zsh-completions](https://github.com/zsh-users/zsh-completions)

MacとLinuxで`.zshrc`ファイルを共有しているので、`brew`からは導入しません。

##Procedure

以下導入コマンド。

```zsh
mkdir ~/.zsh
cd ~/.zsh
git clone git://github.com/zsh-users/zsh-completions.git
```

`.zshrc`の更新。ドットファイルを共有しているならば、毎回する必要はありません。

```zsh
echo # ------------------------------------------------------------------------ >> ~/.zshrc
echo # zsh-completions >> ~/.zshrc
echo # ------------------------------------------------------------------------>> foo.txt
echo 'if [ -d ${HOME}/.zsh/zsh-completions/src ] ; then' >> ~/.zshrc
echo '   fpath=(${HOME}/.zsh/zsh-completions/src $fpath)' >> ~/.zshrc
echo '   compinit' >> ~/.zshrc
echo fi >> ~/.zshrc
```

あとはおまじないをします。

```zsh
source ~/.zshrc
rm ~/.zcompdump
compinit
```

##Note

本当は`echo '   compinit' >> ~/.zshrc`をする必要はないのかもしれません。
しかし自分のMac OSX、CentOS6.5環境だと端末を開くたびに`compinit`をする必要がありそうなので、書き込んでいます。
当然ログイン時の起動速度にかなり影響を与えるので、不快な場合は実行しないでください。


## Appendix

今回は以下のサイトを参考にさせていただきました。

**zsh-completions でコマンドの補完を増やす**
[http://transitive.info/2013/03/03/zsh-completions/](http://transitive.info/2013/03/03/zsh-completions/)

**brewのzsh-completionsを使ってzshの補完を強化する**
[http://qiita.com/maru_cc/items/4dfaa99be7bf95cf68bb](http://qiita.com/maru_cc/items/4dfaa99be7bf95cf68bb)
UITableViewCellの高さを動的に変更する（初心者向け）


中・上級者には当たり前なことばかりだと思うけど、けっこう苦労して調べたのでまとめておきたい。

## 環境
Xcode5でiOS7をターゲットという前提で。
UIはStoryBoardでつくります。


## 1. UILabelの設定

UITableViewCellの中に、UIImageViewとUILabelをsubviewとして持つという単純な構造。

<img src="http://i.gyazo.com/aa92a2f88bf1ef005a77c6a81878b0f2.png">

* Lines(numberOfLines）を0にする。
* Line Breaks(lineBreakMode)を"Character Wrap"にする。


これでテキストが複数行に渡る長さでも改行して表示してくれる。

## 2. (CGFloat)tableView:heightForRowAtIndexPath: 
読んで字のごとく、各行の高さを決めるメソッド。
tableView:cellForRowAtIndexPath: よりも先に呼び出される。

```objective-c
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
	// 表示したい文字列
    NSString     *text = _objects[indexPath.row];
	// 表示最大幅・高さ
    CGSize     maxSize = CGSizeMake(200, CGFLOAT_MAX);
	// 表示するフォントサイズ
    NSDictionary *attr = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:17.0]};
    
	// 以上踏まえた上で、表示に必要なサイズ
    CGSize modifiedSize = [text boundingRectWithSize:maxSize
                                             options:NSStringDrawingUsesLineFragmentOrigin
                                          attributes:attr
                                             context:nil
                           ].size;
    
	// 上下10pxずつの余白を加えたものと70pxのうち、大きい方を返す
    return MAX(modifiedSize.height + 20, 70);
}
```

## 3. (UITableViewCell*)tableView:cellForRowAtIndexPath:
おなじみのメソッド。
sizeToFitメソッドを呼び出して、表示する文字列にあわせてUILabelのサイズを伸縮する。

```objective-c
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    UILabel *label = (UILabel*)[cell viewWithTag:UITableViewCellLabelTag];
    label.text = _objects[indexPath.row];

	// 表示する文字列にフィットするように伸縮
    [label sizeToFit];
    
    return cell;
```


## 完成図
<img src="http://i.gyazo.com/103d848573790c7a2c137c317983df2b.png">

文章がアレですが、世界の諺を引用しているだけであまり深い意味はないです。
頭の体操的な問題3_ランダムに数を選ぶ

2014.4.26の第15回ゆるびぃ会で出題した問題の記録です。

問. 1から100までの整数から10個をランダムに選ぶ
==========
- 今回は岡野さんが問題を考えてくれました。
- 重複はダメ。
- 制限時間は10分。
- 言語はなんでもOK。

ちなみに私は以下のように書きました。
----------

```ruby:sample.rb
[*1..100].sample(10)
```

Rubyだとあまりに簡単なのでclojureでも書いてみました。

```clj:sample.clj
(take 10 (shuffle (range 1 101)))
```

これ「100から10個選ぶ」だからsampleでも良いですけど10000000から10個選ぶだとsampleでは遅いので頭を使わないといけないかもしれません。
ちょっと考えてみました。（2014-04-27 08:11 ちょっと修正）

```rb:sample2.rb
def random_take(n, max)
  [].tap do |ary|
    break ary if max < n
    r = Random.new
    while ary.size < n
      i = r.rand(1..max)
      ary << i unless ary.include? i
    end
  end
end

p random_take(10, 10000000)
```

「もっと良い解き方がある！」とか、sample使わないで書くわ、という方はコメントお願いします。
コメントでもコードを書けます。
Rails4 has_manyとかのオプションについて


Rails4でhas_manyにオプションつけたいなーと思ったら、ちょっとつまづいてしまったのでめも。

```rb:rails3_user_model.rb

has_many :messages, :order =>("created_at DESC")
```
orderは取得する順序ををいじるやつ。
userが多のメッセージを持っててメッセージを取得する時、作られた逆順、つまり新しいメッセージを最初に取得したい場合、こんな書き方をする。

わけだけれど、

```rb:ArgumentError
Unknown key: :order. Valid keys are: :class_name, :class, :foreign_key, :validate 
#以下略
```

怒られる。英語が読めなくてもだいたい意味は分かる。
「order_keyはないよ、あるのはこういうの」ということ。
orderがなくなったのではなく書き方が変わったらしい。

http://stackoverflow.com/questions/18284606/deprecated-warning-for-rails-4-model-with-order

英語が読めなくてもなんとなく分かる。
「lambdaを渡せ」
と。
で、こう書く。

```rb:rails4_user_model.rb

has_many :messages, ->{order("created_at DESC") }
```
あんま詳しくないけどlambda式のことかと思う。

まあとりあえずこれで動く。
includeとかでも上のエラーが出たことあるけど、これで動くんだと思う。

公式には普通に書いてるんだろうなーと思う次第。
英語よめなきゃなー。
【質問】Ctrlキー併用のenthumbleの動作について

初めて投稿します。よろしくお願いいたします。
本日、enthumbleをダウンロードして試しております。
以下について、ご教示頂けるでしょうか？

iniファイルの設定
-
Semicolon={left}
:={right}
@={up}
/={down}
L={PgUp}
.={PgDn}
K={Home}
,={End}

【質問】
-
上記設定で秀丸エディターでの挙動を記述します。
Ctrlと同時押下の動作を、通常キーと異なるのは仕様なのでしょうか？


１．Shiftと同時押下（文字列の選択）
-
Shiftと以下のキーとの同時押下は、通常キーの動作と同様

{left}、{right}、{up}、{down}
{PgUp}、{PgDn}、{Home}、{End}

２．Ctrlと同時押下（文頭・文末に移動）
-
{Home}、{End}：動作せず

３．CtrlとShiftと同時押下（文頭から文末を選択）
-
{Home}、{End}：Shiftのみを押下したときの動作
Javaのお勉強のためにさくっとtomcat環境を作ってみる(Ubuntu)

訳あってJSPのお勉強をしなくてはならなかったので
Ubuntu(12.04)にtomcat環境をつくってあれこれできるようにしてみる。

## JRE/JDKのインストール

[こちら](https://www.digitalocean.com/community/articles/how-to-install-java-on-ubuntu-with-apt-get)を参考にインストール
(今回はOracle Java)

```shell-session
$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java7-installer
```

## Tomcatのインストール

```shell-session
$ sudo apt-get install tomcat7 tomcat7-admin tomcat7-common tomcat7-docs tomcat7-examples tomcat7-user
```

インストール後8080ポートで自動でサーバーが起動する。
デフォルトだと`CATALINA_BASE=/var/lib/tomcat7`になっているが、
パーミッションとかめんどくさいし適当なユーザーのホームディレクトリ以下にプロジェクトディレクトリきって作業したかったのであれこれ探していると、
`tomcat7-instance-create`なるコマンドを発見。(`tomcat7-user`に入ってる模様)
任意のディレクトリで

```shell-session
$ tomcat7-instance-create [direcotoryname]
```

を実行すると、指定したディレクトリ以下に

```shell-session
.
├── bin
│   ├── setenv.sh
│   ├── shutdown.sh
│   └── startup.sh
├── conf
│   ├── catalina.properties
│   ├── context.xml
│   ├── logging.properties
│   ├── server.xml
│   ├── tomcat-users.xml
│   └── web.xml
├── logs
├── temp
├── webapps
└── work
```

上記がセットアップされる。
この状態で`bin/startup.sh`を実行すると`localhost:8080`でサーバーが起動、(先に`service tomcat7 stop`しとく)
`webapps`以下に何もないのでブラウザでアクセスすると真っ白な画面が表示される。
このままだと寂しいので`/var/lib/tomcat7/webapps`をコピってきてサーバーを再起動すると(サーバーの終了は`bin/shutdown.sh`)
It works!画面が表示されているのを確認できる。
また、Tomcat Managerも利用できるようにしたいので、`/var/lib/tomcat7/conf/Catalina/localhost/manager.xml`を
上記で作成した`conf`ディレクトリ以下にコピーし、
同ディレクトリ内にある`conf/tomcat-users.xml`の`<tomcat-users>...</tomcat-users>`内に以下を記入

```xml
<role rolename="manager-gui"/>
<user username="tomcat" password="s3cret" roles="manager-gui"/>
```

サーバーを再起動後、 http://localhost:8080/manager/html にアクセスし、
Basic認証にID:`tomcat`、PASS:`s3cret`を入力すると画面表示できる。
[SystemVerilog]svlibの紹介

##svlibって？
米国の設計コンサル会社Velirab社が今年のDVConで発表したSystemVerilogのパッケージらしい。ライセンスはApache2.0形式。
http://www.verilab.com/resources/svlib/

ざっくり見たところ、SystemVerilogのテストコーディングの手助けするパッケージっぽい。正規表現といった文字列のマニピュレーションと、今はini、ゆくゆくはYAMLをサポートしてテストシステムを組めるようになっている。

中身はSystemVerilog書かれたメソッドと、足りないものはDPIでC言語をimportしている。

##やろうとしたけど
現時点ではドキュメントが十分とは言えず、サンプルコードもあまりないので挫折orz
ソースコードは、いじってはいけないBaseクラスといじれるクラスがある。まあimportすれば良さげな感じ。

##ちょっと使ってみよう
ドキュメントにはツールとしてQuesta/Incisive/VCSを想定したコンパイル方法が記述されている。
ISE? Vivado? 知らない子ですね。ModelSim ASEだったらいけそうな気がする。

Whitepaperからちょっと拝借してコードを書いてみた。
svlibパッケージをimportさせ、走らせるには、svlib.fに書かれているパスを編集する必要がある。

```sv:tb.sv
`include "svlib_macros.svh"

module tb();
  import svlib_pkg::*;

  string cdir;

  initial begin

    cdir = sys_getCwd();

    $display("Current directory is %s", cdir);

    $finish(1);

  end

endmodule
```

実行すると、カレントディレクトリが表示される。

##今後に期待
もうちょっとドキュメントを充実させてくれると面白いかも。
応用例が思いついたらまた書いてみようかと思います。
今はとりあえずのメモ程度に後悔しておきます。
AntでForce.comのソースコード中の文字列を置換する

Force.comでパッケージ開発しているリリース組織用に名前空間をセットしたり、開発用／テスト用／本番用で外部参照するURLを変えたり、スクリプトをキャッシュさせないためにURL末尾にユニーク文字列を追加したりしたくなることがあります。

そんなときは、Antのreplaceタスクで書き換えてしまうのがお手軽です。

# 前提とするファイル構成
ここでは下記のようなファイル構成となっているとします。
```
[プロジェクト]
 ├ build.properties
 ├ build.xml
 ├ [build](自動で作成する)
 ├ [resource]
 |　├ [SampleResource]
 |　└ [...]
 └ [src]
　　├ [pages]
　　｜　├ SampleView.page
　　｜　└ SampleView.page-meta.xml
　　├ [staticresources]
　　｜　├ SampleResource.resource
　　｜　└ SampleResource.resource-meta.xml
　　└ [...]
```

# ソースコード中の文字列を置換する
ここでは名前空間を本番用に置換するためのビルドファイルをサンプルとしました。

そのまま書き換えてしまうとビルドのたびにソースコードが変更されてしまうので、一旦コピーして変換するようにします(ソースコード (1))。

その後、名前空間を本番用に変換します(ソースコード(2))。
ここでは、「NAMESPACE」という文字列を「sampleapp」という文字列に置き換えています。

最後に、ソースコードをデプロイします(ソースコード(3))。

```xml
<target name="release">
  <echo message="release: ${now}" />
  <echo message="username: ${sf.username}" />
  <echo message="serverulr: ${sf.serverurl}" />

  <!-- (1)前回のソースコードを削除してソースコードをコピーする -->
  <delete dir="${build.dir}/src" />
  <copy todir="${build.dir}/src" preservelastmodified="true">
    <fileset dir="${src.dir}" />
  </copy>

  <!-- (2)ソースコードを変換する -->
  <replace
    dir="${build.dir}/src"
    token="NAMESPACE"
    value="sampleapp">
    <exclude name="**/*.xml" />
  </replace>

  <!-- (3)ソースコードをデプロイする -->
  <sf:deploy
    username="${sf.username}"
    password="${sf.password}"
    serverurl="${sf.serverurl}"
    maxPoll="${sf.maxPoll}"
    deployRoot="${build.dir}/src"
  />
</target>
```

# まとめ
もうほとんどForce.comは関係なく、Antの話になってしまっていますが、Force.comのパッケージ開発でちょっとAntに詳しくなっておくとリリース作業を大幅に自動化できます。
他の高機能なビルドツールに比べてAntはお手軽に導入でき、学習コストも低いので個人的にはとてもオススメです。

Enjoy Deploying!
[Xcode][Objective-C]状態を表す定数の宣言方法（typedef enum）

オブジェクトの状態を表現するためにNSIntegerやNSStringを使用することがあると思います。

例えば、追加や編集を受け持っているViewControllerについて、動作を変更させたいときです。

動作の変更方法はいくつかやり方があると思いますが、私はViewControllerにstateプロパティを宣言し、呼び出し元から遷移するときに追加の場合は1、編集の場合は2を代入することで動作を変更させています。

この時に、直値で1や2をコーディングしてしまうと呼び出し元にも呼び出し先にも1や2が出てきてしまいます。（リファクタリングでいうマジックナンバー）

こういった時に使えるのがtypedef enumです。

Appleの公式サンプルソースにもよく出てくる方法なのでベストプラクティスなんだと思います。

宣言する箇所は呼び出し先のヘッダーファイル（.h）の@interfaceの後ろです。

```objectivec:sample.h
typedef enum : NSInteger {
    STATE_ADD = 1,
    STATE_EDIT
} State;
```

この例ではSTATEというtypedef enumを宣言しています。
型はNSIntegerです。
そして、カッコ内にSTATE_ADDとSTATE_EDITという名前を登録します。
STATE_ADDは1、STATE_EDITは2が代入されます。
（連番が代入される）

このように宣言しておくと、このクラスの中でSTATE_ADDやSTATE_EDITが定数として使用できます。
また、このクラスをimportしたクラスでも使用することが可能です。

さらに、Stateをメソッドの引数に指定すればメソッドの呼び出し元にSTATE_ADDかSTATE_EDITのどちらかを選択させることが出来ます。

以上、状態を表す定数の宣言方法でした^^
elasticsearchのCompletion Suggesterをさわる

最近、検索エンジン及びサジェストエンジンとしてelasticsearchを検討しているのでメモ。

## Completion Suggesterとは
登録されたワードを前方一致で検索する機能。「ピ」っていれたら「ピンクフロイド」が出たり「ジ」っていれたら「ジェネシス」って出るアレを実現する技術。

### 公式ドキュメント
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html

## mappingの登録
```javascript
PUT /music/song/_mapping
{
  "song": {
    "properties": {
      "name": {"type": "string"},
      "artist": {"type": "string"},
      "released": {"type": "integer"},
      "suggest": {
        "type": "completion",
        "index_analyzer": "simple",
        "search_analyzer": "simple"
      }
    }
  }
}
```

## データ登録
先ほどのマッピングに合うデータを登録します。

この時、mappingで定めたpropertiesに加えて`suggest`属性を登録しておくのがミソ。

この`suggest`キーに登録された値が前方一致の対象になります。

```javascript
// データ1
PUT /music/song/1
{
  "name": "Love in your Eyes",
  "artist": "Caravan",
  "released": "13123131",
  "suggest": "Love in your Eyes"
}


// データ2
PUT /music/song/2
{
  "name": "Lovely Baby",
  "artist": "Unknown",
  "released": "13123131",
  "suggest": "Lovely Baby"
}
```

## クエリ発行
`/インデックス名/_suggest`に対してPOSTします。(typeは含めない）。 

`song-suggest`の部分は何でもいいっぽいです。サジェスト結果がこのキー名で参照できます。

```javascript
POST /music/_suggest
{
  "song-suggest": {
    "text": "love",
    "completion": {
      "field": "suggest"
    }
  }
}

// 結果
{
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "song-suggest": [
      {
         "text": "love",
         "offset": 0,
         "length": 4,
         "options": [
            {
               "text": "Love in your Eyes",
               "score": 1
            },
            {
               "text": "Lovely Baby",
               "score": 1
            }
         ]
      }
   ]
}
```

## その他
データ登録時に`payload`でサジェスト結果にデータを付加したり、`weight`でサジェストの優先順位をつけることができるっぽいです。
お名前.comを使ってHerokuのルートドメインを設定する

アプリを作って、さあルートドメインで公開だ！！Herokuを使うぞ！！

と意気込んだ結果、どうやらHerokuでルートドメインを利用するのはなんか面倒くさそう。

[Heroku Custom Domain](https://devcenter.heroku.com/articles/custom-domains#root-domain)によると、Aレコードの設定はさせてくれないらしい。

代替手段は公式ドキュメントにいくらか記述されているけど、もともとお名前.comで取得したドメインなので、別のところに引っ越しをするのは面倒臭い。

そんな訳で、色々と調べていたら、[Dozens.jp](https://dozens.jp/)というサービスを見つけたので、これらを活用していきます。

## Dozens.jpの設定


### Domainの追加
`Add Domain`からドメインの追加を行います。`Domain Name`に設定をしたドメインを入力して`Create`これだけ。

### Recordの追加

追加したドメインの編集画面から、`Add Record`を開き、レコードを追加します。`Type`はCNAME、`Content`は`hogehoge.heroku.com`なHerokuによって初期にもらえるドメインを指定します。


### お名前.comの設定

登録しているドメインのネームサーバーを

 - ns1.dzndns.com
 - ns2.dzndns.com
 - ns3.dzndns.com
 - ns4.dzndns.com

へ変更します。

終わり。

### 終わりに

`Heroku お名前.com`でググると、かつてAレコードへの設定をサポートしていたころの記事が沢山でてきて、怖いです。

お名前.comを利用している以上、CNAMEの設定でホスト名をルートドメインにすることができないっぽいのが面倒なため、今回は別のサービスを噛ませることになりました。

Herokuの方針としては、ルートドメインの設定はさせないってことなんですかね？
Sublime Text 3を導入しました

# Sublime Text3を2、3時間かけて導入したので備忘録としてまとめたいと思います。

まず、Sublime Textってなんだって人には「かっこいいテキストエディタ」と思ってもらえばいいと思います。そしてプラグインがめっちゃ捗ります。

一応、有料のテキストエディタです。(40ドルくらいだったかな)でも、無償版で全部の機能が使えるんです。これはありがたい。気に入れば、お金払ってもいいかなって額ですね。導入した結果から言うと僕はいずれ買うと思いますね(笑)

機能的なことに関してはyoutubeなんかにもあるので見たら一気に欲しくなる代物ですね。

Sublime Textは2と3があるんですが3はまだベータ版です。ですが、まあいいかと思って3を導入しました。

ダウンロードは公式ページから。

### これは英語のソフトなんですが、日本語化が簡単なのでそこで諦めないで！

## 手順
1. インストールが簡単にできるようになるプラグイン
2. japanize(日本語化)
3. SFTP(FTPが使えるようになる)必要な人だけ
4. セーブと同時にブラウザをリロード出来るプラグイン
5. フラットデザイン
6. カラー変えれるやつ
7. Linterとかの文法チェック
8. emmet短縮コマンド

# あとはドットインストールのSublimeText2で詳しく教えてくれるwww
Perl の @- と @+ のペナルティが高すぎる

初投稿のテストを兼ねて。

### greple の高速化

[greple](http://kaz-utashiro.github.io/greple/) というコマンドを作っている (Markdown が壊れているのはご勘弁を)。

中身は少し気の利いた grep コマンドということだが、それは本題ではなく、こいつに正規表現で "." 、つまり1文字にマッチするパターンを検索させると、こういうひどい結果になる。

> % wc -c C1.bm1
> 196483 C1.bm1
> % time greple . C1.bm1 > /dev/null
> 62.587u 0.094s 1:02.71 99.9%	0+0k 0+0io 0pf+0w

もちろん、こんな使い方をするのが悪くて、マッチするパターンが少なければ、もっと普通の時間で終了する。

> % time greple .+ C1.bm1 > /dev/null
> 2.353u 0.015s 0:02.37 99.5%	0+0k 0+0io 0pf+0w
>
> % time greple '(?=never)match' C1.bm1 > /dev/null
> 0.093u 0.010s 0:00.10 100.0%	0+0k 0+0io 0pf+0w

### `@-` と `@+` のアクセスが遅い

仕方ないかと諦めていたのだが、今日、ちょっとした変更を加えてみると、このように劇的に速くなった (とは言ってもまだ遅いのだが)。

> % time greple . C1.bm1 > /dev/null
> 4.669u 0.056s 0:04.73 99.5%	0+0k 0+0io 0pf+0w

変えたのは一ヶ所だけで、

```pl
while (/pattern/g) {
    my($s, $e) = ($-[0], $+[0]);
    ...
```

という部分を

```pl
while (/(pattern)/g) {
    my($s, $e) = (pos() - length($1), pos());
    ...
```

にしただけ。

配列 `@-` と `@+` には、マッチした先頭と末尾のオフセットが格納される。パターン全体が `$-[0]`, `$+[0]`、最初のグループが `$-[1]`, `$+[1]` という具合だ。`pos()` は、マッチした直後のオフセットを表すので `$+[0]` と同じ。そこからマッチした文字列の長さを引けば `$-[0]` と同じになるので、やっていることは同じ。

どうもこの配列にアクセスする負担が極端に大きいようなのだ。ただ、同じファイルに対して簡単なプログラムを作って試してみても、多少の差はあるものの、ここまでひどい違いは出ない。

### Unicode がいけないらしい

もう少し試してみると、utf8 から内部コードに変換するとひどいことになることがわかってきた。しかし、パターンマッチに時間がかかるのではなく、やはり配列にアクセスするのが遅く、これは `pos()` についても同様で、変換しない時に比べると極端に遅くなる。

そして、マッチ対象文字列の後ろに行けば行くほど指数関数的に遅くなっていく。先頭の10000文字の処理には0.34秒しかかからないのに、140000-150000文字を処理するのには7.43秒かかる。どうやら、値を求めるために、文字列の先頭から何かを計算しているような気がするのだ。

ちなみに、環境は OS X 10.9 標準の perl5.16。5.12 でも同様。これより新しいバージョンでは試していない。もう少し追求したいところだが、これにかまかけてると作業が進まないので、この辺で切り上げることにする。

![perl-offsetvar-penalty](https://qiita-image-store.s3.amazonaws.com/0/36551/f768e561-182d-992e-8ae5-0a4a25d58498.png)
MRTGの設定ファイル(mrtg.cfg)メモ

お仕事でMRTG(のグラフ作成エンジンだけ)を利用することになったので，mrtg.cfgの設定メモを残します．
**今回は，設定メモと解説できる部分だけ記述する形ですのでインストールなどの環境構築は省かせていただきます．**

とりあえず，自分が触ったところ位しか記述していません．時間があったりしたら追記をしていくかも．だいたいは，cfgmakerを行うことで自動で生成されるのでそれを編集する形にはなると思います．いちから自分で書く人もいると思いますが．．．

(インストール方法などは，時間があれば投稿します．まだまだ自分でも理解できていない部分や間違って勉強した部分があるので，参考程度に見ていただけるとありがたいです． ~~[MRTG 日本語公式サイト](http://www.mrtg.jp/doc/)に行けばだいたい分かる気はするが・・・~~ )

# mrtg.cfgメモ&解説
## 1. グローバルキーワードとオプションキーワード
### 1.1. グローバルキーワード
#### WorkDir
ログファイルとWebページが生成される場所を指定.

**注意事項**：WorkDirは，HtmlDir / ImageDir / LogDirの設定を上書きします．

* 設定例

```
WorkDir: /usr/local/www/apache22/data/mrtg
```

### 1.2. オプションキーワード
#### HtmlDir
htmlファイルがどこにあるかを指定.

* 設定例

```
HtmlDir: /usr/local/www/apache22/data/mrtg
```

#### ImageDir
画像ファイルがどこにあるかを指定.

**注意事項**：ImageDirは，HtmlDirの下に設定する必要がある．

* 設定例

```
ImageDir: /usr/local/www/apache22/data/mrtg/images
```

#### LogDir
ログがどこに蓄積されるかを指定.

* 設定例

```
LogDir: /usr/local/www/apache22/data/mrtg/logs
```

#### Refresh
Webページのリフレッシュ頻度の指定．
定義されていない場合は，デフォルトは300秒(5分)が設定される．

* 設定例

```
Refresh: 600
```

#### Interval
MRTGの呼び出し頻度の指定．
デフォルトは5分．

頻度を下げる場合は，Intervalで指定．
これにより以下の二つのことが行われます．

* 生成されたWebページに呼び出し間隔の正しい情報が含まれる．
* 生成されたWebページのMETAヘッダにより，キャッシュはこのページの生存期間がわかる．
　

* 設定例

```
Interval: 10
```

#### IconDir
MRTGのアイコンディレクトリの指定．

* 設定例

```
IconDir: /usr/local/www/apache22/data/mrtg/icon
```

#### Language
出力フォーマットを選択した言語に切り換える．

* 設定例

```
Language: UTF-8
```

#### RunAsDaemon
デーモンモードでの運用を有効にする．

**デーモンモードの目的**：MRTGを一度起動しておけばネイティブモードのようにcronで定期的に起動する必要をなくすため．これにより，設定ファイルのロードとパースが一回で済み計算機資源を節約できる．

**重要**：デーモンモードでは，MRTG自身は測定間隔のタイミングにのみ責任がある． 従って，Intervalキーワードを適切な値に設定する必要がある．

**注意事項その1**：デーモンモードを利用する時にはMRTGはcronで定期的に起動してはいけない．そうしないとそれぞれのプロセスが永遠に動くことになるため．代わりに，MRTGをコマンドプロンプトもしくはシステムの起動スクリプトから起動するようにします．

**注意事項その2**：設定ファイルを変更した場合には，それを反映するためにプロセスの再起動が必要．

* 設定例

```
RunAsDaemon: YES
```

MRTGを特定のユーザ/グループの権限で動かしたい場合,コマンドラインの--user=ユーザ名と--group=グループ名のオプションを使います.

```
mrtg --user=mrtg_user --group=mrtg_group mrtg.cfg
```

## 2.ターゲットとオプションキーワード
### 2.1.ターゲット毎の設定
監視するターゲットは，それぞれユニークな名前で同定できなければいけません．この名前は，ターゲット毎のそれぞれのパラメータに付加される．また，生成されるWebページ，ログファイル，イメージの名前にも利用される．

#### Target
MRTGに何を監視するのかを明示する．
また，Targetキーワードは，広範なフォーマットの引数を取る．

最も基本的なフォーマとは， ``ポート:コミュニティ名@IPアドレス``となる．

* 設定例

```
Target[wan1]: 2:public@192.168.0.1
```

#### MaxBytes
監視されている2つの値(UP/DOWN)が到達できる最大値.
ルータのトラフィックを監視している場合，ポートが転送可能なbyte/secで指定．
もしMaxBytesより高い数値が返された場合は無視される．

* 設定例

```
MaxBytes[wan1]: 1250000
```

#### Title
グラフ表示用に生成されるWebページのタイトル.

* 設定例

```
Title[wan1]: WAN1のトラフィック量
```

### 2.2. ターゲット毎のオプションキーワード
#### PageTop
生成されるWebページにおいて，グラフの前に追加する文字列．

* 設定例

```
PageTop[WAN1]: トラフィック量グラフ
```

#### RouterUptime
帯域使用率を複数のインタフェースから算出した場合，ルータの稼働時間と名前がWebページに表示されない場合がある．その場合は，RouterUptimeキーワードでそのコミュニティ名とアドレスを指定し直す必要がある．

* 設定例

```
Target[wan1]: 1:public@192.168.0.1 + 2:public@192.168.0.1
 RouterUptime[kacisco.comp.edu]: public@192.168.0.1
```

# 参考文献
[MRTG 日本語公式サイト](http://www.mrtg.jp/doc/)
Thunderbirdで受信したメールの添付ファイルをPythonで抜き取る

前に[メールに添付されたPDFをテキスト形式にする](http://qiita.com/usopyon/items/83eeaaf3404752e03223)という投稿をしたら、割と人気があったようで、これを

* procmail/fetchmailを使わず、Thunderbirdを使う
* 添付されたPDFではなくZipファイルを扱う

という改造をしたバージョンについて書く。

[18.4. mailbox — 様々な形式のメールボックス操作](http://docs.python.jp/2/library/mailbox.html)に

> 十分な注意を、何か他のプロセスによっても同時に変更される可能性のあるメールボックスを更新する時は、払わなければなりません。そのようなタスクをこなすのに最も安全なメールボックス形式は Maildir で、 mbox のような単一ファイルの形式を並行した書き込みに利用するのは避けるように努力しましょう。

とか

> mbox 形式には幾つかのバリエーションがあり、それぞれオリジナルの形式にあった欠点を克服すると主張しています。

みたいに書いてあったので、[メールに添付されたPDFを...](http://qiita.com/usopyon/items/83eeaaf3404752e03223)ではCygwinのprocmail/fetchmailでMaildir形式として読み込んでいたが、Thunderbirdで扱われているmbox形式は（多少の方言はあるにしても）Pythonのmailboxライブラリで読めるので、Python.orgの公式バイナリを使っている。

Thunderbidrはメールを保存するディレクトリは、ランダムな８文字で生成されるので、そのあたりを書き換える必要がある。

```py
#coding:utf-8

import os
import os.path
import sys

import email
import mailbox
import mimetypes

maildir =
'C:\\Users\\t.uehara\\AppData\\Roaming\\Thunderbird\\Profiles\\abcdef12.default\\Mail\\pop.example.com\\Inbox'

tempdir = 'C:\\Users\\t.uehara\\Downloads\\'

def extractMime(message):

    for part in message.walk():

        if part.get_content_maintype() == 'multipart':
            continue

        fname = part.get_filename()
        if fname != None:

            if fname.find(".zip") != -1:
                zipname = tempdir+fname

                # Zipファイルが存在する場合は処理を飛ばす
                if os.path.isfile(zipname) == False:
                    fp = open(zipname, 'wb')
                    fp.write(part.get_payload(decode=True))
                    fp.close()
                    print zipname

if __name__ == '__main__':

    for message in mailbox.mbox(maildir):
        extractMime(message)
```

Zipファイルを保存するだけでなく、圧縮されたログファイルを読み込み、適当な処理をすることもできるが、ちょっと混みいったソースコードになったので、コメント等で要望があれば書き足すことにする。
sqlite3で使えるPRAGMA文

```shell-session
sqlite>PRAGMA hoge
```
で`hoge`の部分に指定できるやつの一覧。

- application_id
- auto_vacuum
- automatic_index
- busy_timeout
- cache_size
- cache_spill
- case_sensitive_like
- checkpoint_fullfsync
- collation_list
- compile_options
- database_list
- defer_foreign_keys
- encoding
- foreign_key_check
- foreign_key_list
- foreign_keys
- freelist_count
- fullfsync
- ignore_check_constraints
- incremental_vacuum
- index_info
- index_list
- integrity_check
- journal_mode
- journal_size_limit
- legacy_file_format
- locking_mode
- max_page_count
- mmap_size
- page_count
- page_size
- query_only
- quick_check
- read_uncommitted
- recursive_triggers
- reverse_unordered_selects
- schema_version
- secure_delete
- shrink_memory
- soft_heap_limit
- synchronous
- table_info
- temp_store
- user_version
- wal_autocheckpoint
- wal_checkpoint
- writable_schema

http://www.sqlite.org/pragma.html
brewのgit archive-allでエラーが出る時の対処

## 症状: こんなエラーが出る

```
$ git archive-all --prefix=pf3gnuchains-20140426 pf3gnuchains-20140426.tgz
Traceback (most recent call last):
  File "/usr/local/bin/git-archive-all", line 432, in <module>
    help="prepend PREFIX to each filename in the archive. OUTPUT_FILE name is used by default to avoid tarbomb")
  File "/Users/monaka/.pythonbrew/pythons/Python-2.7/lib/python2.7/optparse.py", line 1018, in add_option
    raise TypeError, "invalid arguments"
TypeError: invalid arguments
```

## 対処: オレオレPythonを切る

たぶん，brew が管轄していないPythonが悪さをしている．pythonbrew の場合は，下記のようにして，一時的にオレオレ Python を無効にする．

```
pythonbrew off
```
GruntFrontOsaka 勉強会


2014/04/26

## Sass+Compass+Gruntで快適コーディング 

@sigesaba さん


06/28 に産業創造館でPHP関西2014があるよー

### Task Runner

1. GruntのTask
	
	1. Less/Sassのコンパイル
	2. ブラウザの自動リロード
	3. Javascript のコンパイル

自動化＝JavascriptでできるTask

### How do i Install?

黒い画面でインストールするので、難しい人は難しいかも

1. Node.js
2. Grunt-cli
3. 2 つの設定ファイル
	2. package.json
		1. Grunt の依存を解消
		1. grunt のプラグイン
		2. プラグインは公式から。
		3. http://gruntjs.com/plugins
	1. GruntFile.js
		3. 実行するタスクを書く
		2. 自分でかけるけど、基本ひな形からコピペっぽい

### Sass + Compass + Grunt

1. Grunt で web server を動かす
2. sass ファイルが更新されたら自動コンパイル

Plugin

1. Honebuto
2. Grunt Sass
3. Grunt Compass

4. 公式のプラグインは grunt-contrib-*** がつく

後でGuthubに上げる

走らせるのは、Gruntコマンドで一発。

### まとめ

- Grunt で自動化しよう。楽できる。
- わからん所があれば知ってる人に聞いてみるのが近道

## Grunt のあんなこといいな、できたらいいな

@astronaughts さん

Chatwork でモバイルの開発やってます

### Grunt っていろいろできる

Plugin: 2,711 (2014/04/25)

どんなことができるのか紹介しますー

スライド: https://speakerdeck.com/astronaughts/grunt-falseannakotoiinadekitaraiina

#### ファイルの更新plugin

ファイルをずーっと監視してて、更新があればタスクを実行。いちいちgruntコマンドの実行は面倒なので、必須です。

- Grund-contrib-watch
	公式。ドキュメントはある

- Grund-este-watch
	速い


#### 動くな、まだ変化が見られない

- grunt-newer

	ファイル更新があって、変更があったかどうか見ている

#### 並んで

- Grunt-Concallent

	テンプレート作成・ドキュメント生成・テスト実行とかとか

#### それここに置きます

- Grunt-contrib-copy
- Grunt-contrib-clean

#### コンパクトにして

- Grunt-contrib-cssmin
- Grunt-contrib-htmlmin

css/html を minifyする

#### サイズを抑える

- Grunt-contrib-imagemin

png/jpeg を圧縮

#### テスト

- grunt-...
- Grunt-mocha-test

Testing Framework を実行させる

#### リクエストしていい？

- Grunt-http

Grunt が http を投げて、取ってきたコンテンツを保存する


#### サーバにデプロォォイ

- grunt-{rsync,ftp-deploy,sftp-deploy,s3}

#### あ、その環境変数じゃないです

- Grunt-env

タスクごとに環境変数を変えたい時に。ネタ切れ…？


#### パッケージのアップデート忘れてた

- Grunt-bump

これ使うとpackage.jsonを上げてくれます

#### っしゃ、みやざ（ｒｙ

- Grunt-aoimiyazaki

タスク完了時に、みやざ（ｒｙが歌います。

#### 僕が作ったやつ

- Grunt-chatwork
	タスク完了した時にchatworkに投げる
- Grunt-tishadow
	マイナーだけど、Githubでスターもらった
- Grunt-play
	タスク完了した時に音声ファイルを実行させる



## Gruntの罪と罰

@kamyam さん


普段はJS。node.jsとか。

### What is Grunt

Task Runner = 作業時間の短縮

設定ファイルがめんどい

- Cake を使いながら ViewをWatchとか…

### *テンプレート化されたフォルダー構成などで使うと効果を発揮する*

- 会社のテンプレートエンジン
- Framework とか
- Yeaman

使うときは、プロジェクト初期から使うのがいいかも

### 便利な所

- grunt-exec
- grunt-shell

Grunt の実行で　DB も起動している


ライブリロードは、JSかCSSか、どっちかだけがリロードされる

### アレな所

- 500行のGruntfile.jsはどうよ。
- 設定が…
- 更新が頻繁なので、ロードマップを見るのがいい

### Grunt vs gulp

http://gulpjs.com

Gruntが遅いのでできたプロジェクト

### Middleman

ライブリロードはこっちのほうがはやい…

コストと導入のバランスが大事よ。


## LT: WebStorm+GruntなゆるJS使いから見たTypeScriptとCoffeeScriptの使いどころ

@tanakahisateru さん

スライド: http://www.slideshare.net/tanakahisateru/grunt-frontosaka1lttanaka

30人枠に50人だったので、喋れば出れるということででた。

### CoffeeScript

構文がIndent構造

GruntファイルをCoffeeScriptで書くためだけに使ってる

### TypeScript

TSDなんとか。npmでインストールできる。

## LT: Task Sample

@atuyl さん

grunt-htmlmagickの紹介: https://github.com/AtuyL/grunt-htmlmagick


気力尽き果てた…
かな入力モードで入力できない文字をJavaScriptでなんとかする方法

# 経緯
かな入力中によく使う記号入力させてくれ的な謎の要望が来て対応したときのメモ。
環境はInternetExplorerで、かつMS-IME使っている場合限定。GoogleIMEとか使ってると動かない。

# コード
```js
var charTable = {
    'ﾞ' : '@',
    'ﾚ' : '=',
    'ｹ' : '*'
};
$("input[type=text],textarea").on("keydown", function(e){
    var converted = charTable[e.char];
    if (e.keyCode === 229 && e.shiftKey && converted) {
        e.key = e.char = converted;
        this.value += converted;
        e.preventDefault();
    }
});
```

# 日本語入力中のキーイベント

keydownとkeyupが発生する。keypressは発生しない。

`event.keyCode`は入力キーの場合、常に229。

ローマ字入力、かな入力の判定は、`event.char` または `event.key`で行う(どっちも同じのが入ってるっぽい)。
MS-IMEを使っていると、`event.char`にローマ字入力の場合は半角英数字、かな入力の場合は半角カナが入っていて、それで判定してる。
JQueryで読み込み時とリサイズ時にブラウザサイズに横幅を合わせる

# レスポンシブデザインとかの横幅100%をJQueryで処理

## こんな時に便利

- video要素ではwidthおよびheight属性は、パーセントでの値指定が出来ない
- レスポンシブデザインされていないページを処理する場合

## 読み込み時とリサイズ時を同時に処理する

読み込み時だけで処理するとブラウザサイズを変更した時に対応出来ないので、
JQueryでは`load`と`resize`を合わせて記載すればOK!

```javascript:sample.js
$(window).on('load resize', function(){
// 処理を記載
});
```

## 読み込み時とリサイズ時を同時に処理する

例えば、下記のようなhtmlだと

````html:index.html
<div id="wrapper">
　内容
</div>
````

`$(window).width()`でブラウザの横幅を取得し、要素のwidth属性に値をセットする。
height属性は、widthの値と動画の元サイズ比率から自動判断される為今回は特に設定なし。

````javascript:sample.js
var w = $(window).width() * 1.05; //IEに対応させる為1.05倍
$('div#wrapper').attr('width', w);
````

## 完成系

これで完成。

````javascript:sample.js
$(window).on('load resize', function(){
var w = $(window).width() * 1.05;
$('div#wrapper').attr('width', w);
});
````
node.jsの勉強(express4)



## expressのインストール

expressのインストール管理者権限で実行しないとエラーになった。sudoで

```lang:コンソール
sudo npm install -g express
```

アプリケーションのテンプレートを作成
（アプリを作るディレクトリの親にて、アプリケーション名を指定してexpress）

これは、ejsを使う場合

```lang:コンソール
express -t ejs {アプリのフォルダ名}
```

【修正】バージョン３以降でejsを使う場合は、

```lang:コンソール
express -e {アプリのフォルダ名}
```

だった。


アプリのディレクトリに移動してモジュールの依存インストール

```lang:コンソール
cd {アプリのフォルダ名}
npm install -d
```

実行。
起動しない。。。

```lang:コンソール
node app.js
```

バージョンの確認

```lang:コンソール
express -V
```

package.jsonの中のscriptsを確認
startでサーバーが起動するようになっていた

```
  "scripts": {
    "start": "node ./bin/www"
  },
```

scriptsで設定したコマンドは
npm {コマンド}で実行できるみたい

これで起動

```lang:コンソール
npm start 
```

ブラウザで

```
http://localhost:3000/
```

見れた。

![Express.png](https://qiita-image-store.s3.amazonaws.com/0/41550/ef9b85ae-29cb-0797-cded-d3ab6bd9011b.png "Express.png")




終了は

```
control + c
```








## gihyo.jp 基礎から学ぶNode.js メモ

[基礎から学ぶNode.js](http://gihyo.jp/dev/serial/01/nodejs)を見ながら、express4 & osx の環境で勉強したメモです。


### ExpressでWebアプリの雛形を生成の読み替え

[第3回　Express.jsを使ったWebアプリケーションを構築](http://gihyo.jp/dev/serial/01/nodejs/0003?page=2)

EJSのひな形の設定がexpress4はこれだった

```
express -e firstapp
```

### Express　サーバー起動の読み替え

[第3回　Express.jsを使ったWebアプリケーションを構築](http://gihyo.jp/dev/serial/01/nodejs/0003?page=2)


node app.jsが反応しなかったので、これで起動

```lang:コンソール
npm start 
```


### routesの設定を読み替え

[第3回　Express.jsを使ったWebアプリケーションを構築](http://gihyo.jp/dev/serial/01/nodejs/0003)

リクエストのバインドをどこに書けばいいか悩んで、
routes/index.js に書いた。

```js:js
var express = require('express');
var router = express.Router();

/* GET home page. */
var items = [
    { "text": "1st Post." }
    , { "text": "2nd Post." }
];

router.get('/', function(req, res) {
  res.render('index', { title: 'Entry List',items: items });
});


router.get('/form', function(req, res) {
    res.render('form', { title: 'New Entry' })
});

router.post('/create', function(req, res){
    console.log(req.body.text);
    res.redirect('/');
});

module.exports = router;


```











## 参考にしたサイト

[基礎から学ぶNode.js](http://gihyo.jp/dev/serial/01/nodejs)