OmniAICreator/Qiita-1.07M huggingface dataset:
inputタグのrequiredやautofocus

通常inputタグのrequiredやautofocusは次のように記載することができます。

```html
<input type="text" class="form-control" placeholder="Email" required autofocus>
<input type="password" class="form-control" placeholder="Password" required>
```


Visualforceでこの書き方をするとエラーになるので次のように記載する必要があります。

```html
<input type="text" class="form-control" placeholder="Email" required="true" autofocus="true" />
<input type="password" class="form-control" placeholder="Password" required="true" />
```


こんな感じで"true","false"まで宣言することできちんとつかうことができます。
Visualforceで使うinputタグのrequiredやautofocus

通常inputタグのrequiredやautofocusは次のように記載することができます。

```html
<input type="text" class="form-control" placeholder="Email" required autofocus>
<input type="password" class="form-control" placeholder="Password" required>
```

Visualforceでこの書き方をするとエラーになるので次のように記載する必要があります。

```html
<input type="text" class="form-control" placeholder="Email" required="true" autofocus="true" />
<input type="password" class="form-control" placeholder="Password" required="true" />
```


こんな感じで"true","false"まで宣言することできちんとつかうことができます。
DockerでMosquittoを動かしたメモ


## これは何？

MQTTブローカー<b>Mosquitto</b>をdockerイメージで動かした時のメモです。

## dockerイメージのbuild手順

### 適当に作業ディレクトリを作る

```
$ mkdir -p docker/mosquitto
$ cd docker/mosquitto
```

### Dockerfileを作る

```docker:Dockerfile
FROM ubuntu
MAINTAINER Shin Hiroe <hogehoge@mail.com>

RUN echo "upgrade apt sources"
RUN apt-get update
RUN apt-get upgrade -y

EXPOSE 1883
RUN echo "install Mosquitto"
RUN apt-get install mosquitto -y
```

### Dockerfileをもとにイメージを作る

* -tオプションで<code>ubuntu:mosquitto</code>という名前をつけます

```
$ docker build -t ubuntu:mosquitto .
```

## ネットワーク設定

[はじめてのDocker on Mac OS X](http://dev.classmethod.jp/tool/docker/getting-started-docker-on-osx/)を参考にさせて頂きつつ、VirtualBoxでポートフォワーディングの設定をする。
今回はMQTTの標準ポート1883番を、単純にdockerコンテナの1883番にフォワードします。

## コンテナの起動

<code>-p 1883:1883</code>で先ほどVirtualBoxに設定したポートフォワードを指定して起動。

```
$ docker run -t -p 1883:1883 -i ubuntu:mosquitto mosquitto

1402742115: Warning: Mosquitto should not be run as root/administrator.
1402742115: mosquitto version 0.15 (build date 2013-08-23 19:23:43+0000) starting
1402742115: Opening ipv4 listen socket on port 1883.
1402742115: Opening ipv6 listen socket on port 1883.
```

rootで起動すべきではないですぞーって言われてますが、一応起動したようです。
Webスクレイピングの注意事項一覧

[2020/09/09追記]
本記事の内容は著作権法改正より前に記載されたものです。
最新の情報をご確認下さい。
* [著作権法の一部を改正する法律（平成30年法律第30号）について | 文化庁](https://www.bunka.go.jp/seisaku/chosakuken/hokaisei/h30_hokaisei/)
* [令和2年通常国会 著作権法改正について | 文化庁](https://www.bunka.go.jp/seisaku/chosakuken/hokaisei/r02_hokaisei/)

上記に関連して、次の記事を記載致しました。
* [【2020年度版】個人用クローラーの開発手順とその注意点 - Qiita](https://qiita.com/nezuq/items/9e297d0e3468c24e8afa)

---

#はじめに
Webスクレイピングで誰も嫌な思いをしなくて済むように、注意事項一覧を作りました。
ただ、法律の専門家による解釈ではないので責任は取れません。
この記事は、クリエイティブ・コモンズのCC-BYで公開致しますので、ご自由にご改修下さい。

#注意事項一覧
##データをダウンロードする時
###目的は下記のものに限る。
　* 個人や家族間で使用する
　* Web検索サービスを提供する
　* 情報解析をする
　※参考：著作権法第30条・著作権法第47条(6,7)
###対象コンテンツは下記のものに限る。
　* 文章（データベースのコンテンツの場合はコンテンツの一部のみに留めておく）
　* 画像（同上）
　* 音声（パブリックドメイン等のオープンなライセンスの物に限る）
　* 映像（同上）
　※参考：著作権法第30条・著作権法第47条(7)
###Webサイトへアクセスする時は下記の制限を守る。
　* [robots.txt/robotsメタタグ](http://whitehatseo.jp/robots-txt%E3%81%AE%E8%A8%98%E8%BF%B0%E4%BE%8B%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%92%E8%A7%A3%E8%AA%AC%E3%81%97%E3%81%BE%E3%81%99/)のアクセス制限内容を守る。
　* robots.txtがない場合でも、サーバアクセスの間隔を1秒以上空けるようにする。
　* Pragma:No-cacheメタタグが設定されているページはダウンロードしない。
　* rel=”nofollow”が設定されているリンクはクローラーで辿らない。
　* 会員のみが閲覧できるページの場合は利用規約を守る。
　* 情報収集を禁止する措置（ex.アクセス制限）がクローリング時に取られていた場合は、既に取得していた情報を含めて削除する。
　※参考：著作権法第47条(6)

##データを公開する時
###集計データを公開する場合は許可を取る必要はない。
ただし、個人が特定されるデータの場合は許可を取る必要がある。

　※著作権法は創作を保護する為の法律で、事実(ex.〇〇が△△個あった)は保護の対象にならない。
　
###個別データを公開する場合は許可を取る必要がある。
ただし、Web検索サービスで先方のサイトを紹介する為の利用は除きます。
（キャッシュ配信型のキュレーションサービスは、Web検索サービスと認められない可能性があります）

　※参考：著作権法第47条(6)


#著者のスタンス
著者は、著作権法第47条の7の情報解析目的であっても、第47条の6の制約を守った方が良いと考えています。
著作権法第47条の6は、検索サービス事業の一部を行う者も対象で、「ソフトウェアによるウェブサイト情報の収集・格納（クローリング）」はその一部です。
ただし、情報解析目的の場合は第47条の6の制約を守らなくても良いというのが一般的な解釈です。
※参考：[著作権法47条の6の解説（PDF） - きたおか法律事務所](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=9&cad=rja&uact=8&ved=0CFEQFjAI&url=http://www.i-law.jp/paper/copyright-search.pdf&ei=djfTU6H-B4qNuASZngE&usg=AFQjCNHKywviXsWTRyZ8MmnOBwKgu2dDpw&sig2=uCOVjWJ7_P1Dr3bQx54ALQ&bvm=bv.71778758,d.c2E)


#Q&A（2014/12/03 追記）
疑問点とそれに対する回答を書きました。
[ → Webスクレイピングの法律周りの話をしよう！](http://qiita.com/nezuq/items/3cc9772118ad112c18dc)

#記事のライセンス
![cc-by.png](https://qiita-image-store.s3.amazonaws.com/0/38787/e02e2c4a-70b3-52c6-14b7-c399dbe2cee1.png)
@nezuq
Vimで編集行の行番号を常にハイライトする

#行番号のハイライト
vimの行番号は、どうも仕様上、カーソルラインを有効しないとハイライトされないようです。

```vim:cursorlineの有効化
set cursorline
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/37721/12d25fd7-74d9-36df-d78c-86d97ec65618.png)

常にカーソルラインを表示するのが好きでないならば、cursorlineの色を付けないように設定します。

```vim:cursorlineの色をクリア
set cursorline
hi clear CursorLine
```

![2.png](https://qiita-image-store.s3.amazonaws.com/0/37721/6541d1fc-33a1-b7b5-919e-fde743209147.png)

これで常に編集行の行番号のみがハイライトされるようになりました。

#auto-cursorlineを改造
自分は加えてthincaさんの設定例をお借りして、しばらく手をはなしたり、
バッファを移動したりした際にcursorlineを表示するようにしています。

['cursorline' を必要な時にだけ有効にする / 永遠に未完成](http://d.hatena.ne.jp/thinca/20090530/1243615055)

参考にした設定そのままですと、行番号のみのハイライトはされませんので、初項の設定を入れた修正をします。

##設定例
```vim:vimrc
" 初期状態はcursorlineを表示しない
" 以下の一行は必ずcolorschemeの設定後に追加すること
hi clear CursorLine

" 'cursorline' を必要な時にだけ有効にする
" http://d.hatena.ne.jp/thinca/20090530/1243615055
" を少し改造、number の highlight は常に有効にする
augroup vimrc-auto-cursorline
  autocmd!
  autocmd CursorMoved,CursorMovedI * call s:auto_cursorline('CursorMoved')
  autocmd CursorHold,CursorHoldI * call s:auto_cursorline('CursorHold')
  autocmd WinEnter * call s:auto_cursorline('WinEnter')
  autocmd WinLeave * call s:auto_cursorline('WinLeave')

  setlocal cursorline
  hi clear CursorLine

  let s:cursorline_lock = 0
  function! s:auto_cursorline(event)
    if a:event ==# 'WinEnter'
      setlocal cursorline
      hi CursorLine term=underline cterm=underline guibg=Grey90 " ADD
      let s:cursorline_lock = 2
    elseif a:event ==# 'WinLeave'
      setlocal nocursorline
      hi clear CursorLine " ADD
    elseif a:event ==# 'CursorMoved'
      if s:cursorline_lock
        if 1 < s:cursorline_lock
          let s:cursorline_lock = 1
        else
          " setlocal nocursorline
          hi clear CursorLine " ADD
          let s:cursorline_lock = 0
        endif
      endif
    elseif a:event ==# 'CursorHold'
      " setlocal cursorline
      hi CursorLine term=underline cterm=underline guibg=Grey90 " ADD
      let s:cursorline_lock = 1
    endif
  endfunction
augroup END
```

##設定内容
追加した部分には `" ADD` と行末コメントしています。

```vim:追加設定
hi CursorLine term=underline cterm=underline guibg=Grey90
```

追加した上記の設定は、defaultのカラースキーム用ですので、お使いの設定によっては異なる場合があります。
`:highlight`で設定値を確認して下さい

```vim:初期状態の設定
hi clear CursorLine
```

上記の設定はお使いのcolorschemeの設定後に追加するようにしてください（上書きされるため）

#行番号のハイライト設定
編集行の行番号のハイライト色は `CursorLineNr` で設定できます

```vim:設定例
hi CursorLineNr term=bold   cterm=NONE ctermfg=228 ctermbg=NONE
```

![3.png](https://qiita-image-store.s3.amazonaws.com/0/37721/1b6892e1-9a06-e61a-867e-7079c59368b9.png)
Iterator パターン

```
コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない反復子を提供することを目的とする。
```
- [Iterator パターン - Wikipedia](http://ja.wikipedia.org/wiki/Iterator_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

### どういうパターン?

アイテムを持つコンテナオブジェクトと、アイテムの要素を列挙するイテレータを独立させるパターン

- コンテナクラス毎にイテレータを独自実装する必要がない
- イテレータに機能を追加したい場合、コンテナクラス毎に機能を追加する必要が無い

### rubyでは、内部イテレータが一般的

```
Rubyでは、Arrayなどのコンテナオブジェクトが、eachなどのイテレートするメソッドを持っている内部イテレータである
```

- [Iterator パターン - Wikipedia](http://ja.wikipedia.org/wiki/Iterator_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

内部イテレータ : ruby の Array のように、イテレータがコンテナ内部に実装されている
外部イテレータ : Iterator パターン のように、コンテナと、イテレータが独立したオブジェクトである

### 内部イテレータだと、コンテナ毎に必要なイテレータを実装する必要があるから不便じゃない?

なので、ruby の場合、each だけ実装すれば、Enumerable を mix-in することで、Enumerable が持つ機能を全て実現できるようになっている

```items.rb
class Items
  include Enumerable
  def initialize
    @items = []
  end

  def <<(item)
    @items << item
  end 

  def each
    @items.each do |item|
      yield item
    end
  end
end

items = Items.new
items << 'abc'
items << 'def'
items << 'ghi'

# Items には実装されていない #each_with_index が使えている!!
items.each_with_index do |item, i|
  puts "#{i} : #{item}"
end
```

## 上のような例の場合、そもそも配列を使えば良いんじゃない?

その通り
基本的には、配列で済むならば配列を使うべき
例えばこんな風に、要素毎に何かしら処理を施した結果を、each したい。みたいな時に便利


```downloader.rb
require "open-uri"

class Titles
  include Enumerable
  def initialize
    @urls = []
  end

  def <<(url)
    @urls << url
  end

  def each
    @urls.each do |url|
      open(url).read =~ %r|<title>(.*)</title>|
      yield $1
    end
  end
end

t = Titles.new
t << "http://www.google.co.jp"
t << "http://www.yahoo.co.jp"

puts t.map(&:upcase)
# GOOGLE
# YAHOO! JAPAN
```


## 参考

- [Iterator パターン - Wikipedia](http://ja.wikipedia.org/wiki/Iterator_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
- [module Enumerable](http://docs.ruby-lang.org/ja/2.0.0/class/Enumerable.html)
- [Rubyによるデザインパターン【Iterator】-君の子供たちに伝えたいのだけど- - Qiita](http://qiita.com/kidachi_/items/afa4c6c29a6eb6be487a)
- [Iterator.rd](http://www.rubycolor.org/dp/Iterator.html)
OSX 10.10 Yosemiteでhomebrewによるgccインストールのエラーを回避する方法

OSX 10.10 YosemiteのDeveloper Previewでは、homebrewで普通に`brew install gcc`でgccをインストールしようとするとエラーになると思います。gcc依存のformulaをインストールしてハマった人も多いでしょう。ここではパッチを当ててgccをインストールしてみます。

## 前提

- OSX 10.10 Developer Preview 4
- gcc 4.9.1

## 参考

[https://github.com/Homebrew/homebrew/issues/29845](https://github.com/Homebrew/homebrew/issues/29845)

## 方法

0. homebrewをアップデートしてgccのformulaを最新版にします。

		brew update

1. gccのformulaの編集モードに入ります。

		brew edit gcc

2. 2行目に以下の4行を追加します。

		patch do
		  url "https://gcc.gnu.org/bugzilla/attachment.cgi?id=33180"
		  sha1 "def0cb036a255175db86f106e2bb9dd66d19b702"
		end

	例

		class GCC < Formula
	
		  # Patch for OSX 10.10 Developer Preview 4
		  # ref. https://github.com/Homebrew/homebrew/issues/29845
		  patch do
		    url "https://gcc.gnu.org/bugzilla/attachment.cgi?id=33180"
		    sha1 "def0cb036a255175db86f106e2bb9dd66d19b702"
		  end
	  
		  def arch
		    if Hordware::CPU.type +== : intel
		    略

3. インストール

		brew install gcc


これでgcc依存のformulaを無事にインストールできるようになります。

以上
zsh でコマンドが失敗したときにプロンプトの色を変えてエラーを知らせる

シェルでコマンドを呼び出したときに、コマンド実行に失敗した場合は終了ステータスとして0以外を返すルールになっている。

```
% ls -z
ls: 無効なオプション -- 'z'
Try 'ls --help' for more information.
% echo $?
2
```

上の例のように終了ステータスは `echo $?` で確認できるんだけど、コマンドが成功したかどうかによってプロンプトの色を変えるようにもできるので紹介する。

## 例

こんな感じで.zshrcに書いておけばOK。

```
autoload -Uz colors
colors
PROMPT="%(?.%{${fg[green]}%}.%{${fg[red]}%})[%n@%m]%{${reset_color}%} %# "
```

![zsh_prompt2.png](https://qiita-image-store.s3.amazonaws.com/0/204/7ed0bcb4-c98e-06c5-cfd8-787a3c6774ba.png)

前回のコマンド呼び出しに成功したときは緑、失敗したときは赤になってる。プログラムのコンパイルとかしたときに成功したかどうかが分かりやすいので便利。

## 解説

`%(?.xxx.yyy)` という形式の記号を使ってる。これをプロンプト文字列として使うと「前回の終了ステータスが0ならxxx、0以外ならyyy」という意味になる。今回の例では「xxx = `%{${fg[green]}%}`」、「yyy = `%{${fg[red]}%}`」という風に違う色の指定を埋め込んでいるので、前回のコマンド呼び出しが成功したかどうかによって色が変わるようになってる。

詳細については man zshmisc(1) の「CONDITIONAL SUBSTRINGS IN PROMPTS」の「%(x.true-text.false-text)」を参照。
Sketch プラグイン制作所感・ええやんと思ったプラグイン

Sketch で作成したアートボードやその外に書く注釈とかをまるっと一枚の PNG にしてくれるプラグインを今朝作っていたらほぼできた所で思いっきり同じ物を見つけてしまい車輪の再開発をしていた事のむなしさをご報告いたします。

----

# 所感

Sketch プラグインスクリプトは Objective-C と JavaScript を足して二で割った感じでキモい
block とかが書けるんかよくわからない
Smalltalk が元々こんな感じなのかな Smalltalk 知らないので分からない

たとえば現在のビューを取り出して変数に突っ込む場合こんな感じ

```
// doc はグローバル変数 (MSDocument)
var view = [doc currentView]
```

# ドキュメント

http://bohemiancoding.com/sketch/support/developer/

ここを良く読めばある程度はできそう。

# ごっつええスクリプト

###Save Page to PNG
Sketch のページ全体を PNG にして保存してくれるプラグイン。
元の sketch ファイルと同じディレクトリに、同じ名前、拡張子は .png で保存する。
Sketch をもっていないデザイナー以外と、全体像を俯瞰して見るのに便利です。
[github](https://github.com/joshpuckett/SketchPlugins)


書き足していく
Abstruct Factorty パターン



![](http://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Abstract_Factory_UML_class_diagram.svg/650px-Abstract_Factory_UML_class_diagram.svg.png)

```
関連するインスタンス群を生成するための API を集約することによって、複数のモジュール群の再利用を効率化することを目的とする
```

- [Abstract Factory パターン - Wikipedia](http://ja.wikipedia.org/wiki/Abstract_Factory_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)


## 何をするの?

Clinet クラスが ConcreteFactory クラスに、ConcreteProduct の生成を移譲する

## 具体例

ファイルの download と、upload を行う処理 (Clientクラス)

```abstract_factory.rb
# ファイルを生成して、upload するという流れ
class FileUploader # Client
  def initialize(factory)
    @file_maker = factory.file_maker
    @uploader   = factory.uploader
  end

  def make_flie(items)
    @file = file_maker.make(item)
  end

  def upload
    uploader.upload(@file)
  end
end

class FileUploaderFactory # AbstructFactory
  def file_maker
    raise NotImplementedError
  end

  def uploader
    raise NotImplementedError
  end
end

class CsvFileScpUploderFactory < FileUploaderFactory # ConcreteFactory
  def file_maker
    @file_maker ||= CsvFileMaker.new # ConcreteProduct
  end

  def uploader
    @uploader ||= ScpUploder.new # ConcreteProduct
  end
end

class HttpFileFtpUploderFactory < FileUploaderFactory # ConcreteFactory
  def file_maker
    @file_maker ||= HttpFileMaker.new # ConcreteProduct
  end

  def uploader
    @uploader ||= FtpUploder.new  # ConcreteProduct
  end
end

# FileUploader は、どの ConcreteProduct を使って処理を行うかを、AbstructFactory のサブクラスに任せている
file_uploader = FileUploader.new(CsvFileScpUploderFactory.new) # CSV を SCP で upload
file_uploader.make_flie(%w[abc def])
file_uploader.upload

file_uploader = FileUploader.new(HttpFileFtpUploderFactory.new) # HTTP を FTP で upload
file_uploader.make_flie(%w[abc def])
file_uploader.upload

# 新しい処理が必要になったら、ConcreteFactory、ConcreteProduct を増やせばよいだけ
```

## いちいち、ConcreteFactory　を作るのめんどくない?

上記のような例の場合は、FileUploader のコンストラクタで動的に ConcreteProduct を指定するやり方でも良いと思う

```file_uploader.rb
class FileUploader
  def initialize(file_maker_name, uploader_name)
    @file_maker = Object.const_get("#{file_maker_name.to_s.capitalize}FileMaker").new
    @uploader   = Object.const_get("#{file_maker_name.to_s.capitalize}Uploader").new
  end
...
FileUploader.new(:http, :ftp) # HTTP を FTP で upload
FileUploader.new(:csv, :scp)  # CSV を SCP で upload
```

ただし、AbstructFactory の目的に **矛盾の無い ContcreteProduct の組み合わせの生成** というのもあるので、
ContcreteProduct の組み合わせに制限がある場合は、クラスとしてまとめてしまった方がより安全に運用できる

- 例えば、HTTPの場合、絶対にFTPしか許されない。とか


## Abstruct Factorty パターンと、Factorty Method パターンの違い

実際に処理を行うインスタンスの生成方法が異なる

- Abstruct Factorty パターン : インスタンスの生成をファクトリオブジェクトに委譲
- Factory Method パターン : インスタンスの生成をサブクラスに委譲

## 参考

- [Abstract Factory パターン - Wikipedia](http://ja.wikipedia.org/wiki/Abstract_Factory_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
- [オブジェクト思考: Factory (ファクトリ) パターン](http://think-on-object.blogspot.jp/2011/11/factoryfactory-methodabstract-factory.html#difference)
Rubyコーディング規約

規約に限らず自分でコーディングする際に気を付けていることです.

# 事前準備: チュートリアル

* [Ruby実習マニュアル](http://tutorial.jp/prog/ruby/rubyman.pdf)
* [Ruby on Rails Tutorial](http://railstutorial.jp/)

# ブランチ管理

* [Github flow](https://gist.github.com/Gab-km/3705015)に従います

# コーディング規約

* 基本的に[CookpadのRuby コーディング規準](https://github.com/cookpad/styleguide/blob/master/ruby.ja.md)に準拠します
  * ただしHashの空白囲みはしません 
* 不要な```self```は記述しません
* 不要な```return```は記述しません
* 不要なバックスラッシュは記述しません
* ファイルの末尾は改行1個で終わらせます
* 委譲の際は```Forwardable```を利用します
* 変数名、メソッド名ではどのような場合でも省略形を使いません
* 一般的な法則に準拠します
    * SOLID
        * SRP: Single Responsibility Principal
        * OCP: Open Closed Principal
        * LSP: Liskov Substitution Principle
        * ISP : Interface Segregation Principle
        * DIP : Dependency Inversion Principle
    * デメテルの法則(最小知識の法則)
    * 驚き最小の原則
    * ボーイスカウトの規則
    * YAGNI: You ain't gonna need it
    * DRY: Don't Repeat Yourself
    * KISS: Keep it simple, stupid

# RSpec
* [Better Specs](http://betterspecs.org/jp/) に従います
* [Shared Context](http://magazine.rubyist.net/?0035-RSpecInPractice#l9)をうまく利用します
* Ajaxのテストではコントローラテストでxhrメソッドを利用します
* FactoryGirlではDB saveが不要な場合はbuildを使います
* [shoulda-matchers](https://github.com/thoughtbot/shoulda-matchers)を積極的に利用します
* Cucumberは記述コストが高いので使いません. 代わりにカスタムマッチャをうまく利用します. http://railstutorial.jp/chapters/sign-in-sign-out?version=4.0#sec-cucumber
* Sexy Validationを利用します
* カスタムマッチャを適切に利用する
* privateなメソッドのテストは書かない
    * テストが必要ならクラスを分けてpublicにする

# Module
* ヘルパーモジュールの場合は-ableという名前にします

# Rails
* 規約通りの設定は省略する

# MySQL
* テンポラリテーブルは'CREATE TEMPORARY TABLE'で作成する
* 特に理由がなければCREATE TABLEでCHARSETとCOLLATEは設定しない
* インデックス
  * カーディナリティを考慮
  * カバリングインデックスを考慮 

# Model
* スキーマ定義
  * 外部キーには```integer```ではなく```references```を利用します
  * ```null: false```でnot null制約を設定します
  * 1カラムのインデックスは```index: true```で設定します
  * 1行文字列はstring型に, 複数行文字列はtext型にします
  * natural keyには```add_index :items, [:key1, :key2], unique: true```でUNIQUE制約を設定します

* 階層化する場合はtable_name_prefixメソッドを定義する
* パラメタの変数名はモデルでは`attributes`、コントローラでは`params`と名付けする

## SQL

* `INSERT INTO table(c1, c2)`でカラムを省略しない

# View
* ```render model```, ```render models```での_modelパーシャル呼び出しを積極的に利用します

# Controller
* [StrongParametersのネスト](https://github.com/rails/strong_parameters#nested-parameters)を正しく指定します

# Locale
* エラーメッセージの末尾には句点(。)をつける
* ネストした設定はネスト先のモデルでまとめて設定する

# フォーム
* collection_check_boxにはappend_hiddenオプションを設定
* 「〜」「未満、以下、以上」はどちらかに揃えます
* placeholderは積極的に設定します
* ラジオボタンにはラベルを設定します

```slim
label
  = f.radio_button :blood_type, :a, checked: f.object.blood_type
  | A型
```

* 入力不備のアラートは空の場合には基本的に出しません
* 未選択状態の場合は「▼項目名」のように選択肢と異なることがわかるようにします
* 必須項目には必須マークを表示します

# ワークフロー
* チケットへのコメントの際は前のコメントを再確認します

# プルリクエスト
* プルリクエスト作成前に各コミットを自分でレビューします

# Github
* インデントの差分確認ではw=1を指定する
GoをMacにインストールしてFizzBuzzをやってみた


最近巷で人気なGolang。
ちょっと興味出たのでやってみようかなと思って手持ちのMacにインストールしてHelloしたりFizzbuzz作ったりしてみた。

##インストール
Homebrew使ってるのでコマンド一発。

`brew install go`でインストールは完了。
あとはターミナル内で使うのでPathを通す必要がある。

```
$ echo 'export GOPATH= "/path/to/go/bin"' >> ~/.zshrc
$ echo 'export PATH="$PATH:$GOPATH"' >> ~/.zshrc
$ source ~/.zshrc
$ go
Go is a tool for managing Go source code.

Usage:

	go command [arguments]

The commands are:

    build       compile packages and dependencies
    clean       remove object files
    env         print Go environment information
    fix         run go tool fix on packages
    fmt         run gofmt on package sources
    get         download and install packages and dependencies
    install     compile and install packages and dependencies
    list        list packages
    run         compile and run Go program
    test        test packages
    tool        run specified go tool
    version     print Go version
    vet         run go tool vet on packages

Use "go help [command]" for more information about a command.

Additional help topics:

    c           calling between Go and C
    filetype    file types
    gopath      GOPATH environment variable
    importpath  import path syntax
    packages    description of package lists
    testflag    description of testing flags
    testfunc    description of testing functions

Use "go help [topic]" for more information about that topic.
```
これでインストールは完了。

##Hello Go.
拡張子は`hoge.go`になる。簡単で分かりやすい。
文法とかはJavaとかPythonに近い。…様な気がする。

```go:hello.go
package main

import "fmt"

func main() {
  fmt.Println("Hello go language.")
}
```

##Fizzbuzz
PGなら大体書いた事があるらしいFizzbuzz。
折角なので２つ書いてみた。

```go:fizzbuzz1.go
package main

import (
  "fmt"
  "strconv"
  )

func fizzbuzz(num int) string {
  for i := 0; i <= num;i++ {
    fizz := i % 3
    buzz := i % 5
    switch {
    case fizz==0 && buzz ==0:
      fmt.Println("fizzbuzz")
    case fizz==0 && buzz !=0:
      fmt.Println("fizz")
    case fizz!=0 && buzz ==0:
      fmt.Println("buzz")
    default:
      fmt.Println(strconv.Itoa(i))
    }
  }
  return "\nEnd"
}

func main() {
  fmt.Println(fizzbuzz(100))
}
```

```go:fizzbuzz2.go
package main

import (
  "fmt"
  "strconv"
  )

func execute(num int) string {
  fizz := num % 3
  buzz := num % 5
  if fizz==0 && buzz==0 {
    return "fizzbuzz"
  } else if fizz!=0 && buzz==0 {
    return "buzz"
  } else if fizz==0 && buzz!=0 {
    return "fizz"
  } else {
    return strconv.Itoa(num)
  }
}

func main() {
  for i:=0;i<100;i++ {
    fmt.Println(execute(i))
  }
}
```

再起使った書き方とかは今度やろうかなと思う。

##感想
書き方はちょい癖とかあるけど覚えれば結構書きやすいし
動作も軽めだし今後も利用頻度増えそうな良い言語かなぁと思う。

##参考
http://go-tour-jp.appspot.com/
http://golang.jp/
http://qiita.com/tenntenn/items/0e33a4959250d1a55045
golang.jpのとこに書いてある言語仕様のページは最低限な知識を得られるので必読だと思う。
GruntからMakeへ

load-grunt-configを使ってGruntfileに書く設定などをタスク毎に分割できるようになったとはいえ、1ファイルに書く量が減ってもファイルが分割されただけで、書くのが辛いのは変わらないままなのでgulpに移行……してみようかとも思ったのだけど、BrunchとかBroccoliとかビルドしたいだけなのになんでツールこんなにたくさんあるの、またトレンドとかで変わるんでしょ、node.jsベースのビルドツールからすこし離れてみようか、と久しぶりにMakefileを書いてみたりしたのでした。

それでも、ローカルでサーバを立てるところはGruntを使っていたりするところがなんだかなあという感じがしますが。LiveReloadも出来るインストールが簡単なサーバというのが見つからなかったのでまあしょうがないかというところ。

ファイルの監視には[fswatch](https://github.com/alandipert/fswatch)を使っています。なかなか便利なコマンドかも。

```json:package.json
{
  "private": true,
  "devDependencies": {
    "grunt": "^0.4.5",
    "grunt-contrib-connect": "^0.8.0",
    "grunt-este-watch": "^0.1.17",
    "jade": "^1.5.0",
    "node-sass": "^0.9.3"
  }
}
```

```coffeescript:Gruntfile.coffee
module.exports = (grunt) ->

  grunt.initConfig

    connect:
      server:
        options:
          base: 'public'
          livereload: true

    esteWatch:
      livereload:
        enabled: true

  grunt.loadNpmTasks 'grunt-contrib-connect'
  grunt.loadNpmTasks 'grunt-este-watch'

  grunt.registerTask 'default', ['connect', 'esteWatch']

  return
```

```mf:Makefile
# 入力元ディレクトリと出力先ディレクトリ
SRC  := source
DEST := public

# 各種ファイル（先頭が_で始まっているファイルは省く）
FILES := $(shell find $(SRC) -type f -regex '.*/[^_]*')

# Jade
# 出力先を変更するためpatsubstで置換 + JADE変数のリストの拡張子を置換
JADE := $(filter %.jade,$(FILES))
HTML := $(patsubst $(SRC)/%,$(DEST)/%,$(JADE:.jade=.html))

# Scss
# 出力先を変更するためpatsubstで置換 + SASS変数のリストの拡張子を置換
SASS := $(filter %.scss,$(FILES))
CSS  := $(patsubst $(SRC)/%,$(DEST)/%,$(SASS:.scss=.css))

# ローカルにインストールしたモジュールの実行ファイルのパス
BIN := $(shell npm bin)

# jadeコマンドとそれに渡すオプションの指定
JADEC := $(BIN)/jade
JADEFLAGS :=

# node-sassコマンドとそれに渡すオプションの指定
SASSC := $(BIN)/node-sass
SASSFLAGS := --output-style compressed

# JadeをHTMLに変換するコマンドの指定
$(DEST)/%.html: $(SRC)/%.jade
	@$(JADEC) $(JADEFLAGS) --out $(dir $@) $<

# ScssをCSSに変換するコマンドの指定
$(DEST)/%.css: $(SRC)/%.scss
	@$(SASSC) $(SASSFLAGS) $< $@

# HTMLとCSSを生成するallターゲット
# 生成した後、ついでにLiveReloadサーバに対してリクエストを投げる
.PHONY: all
all: $(HTML) $(CSS)
	-@curl http://localhost:35729/changed?files=`printf '$(notdir $?)' | tr ' ' ,`

# 生成したHTMLとCSSを削除するcleanターゲット
.PHONY: clean
clean:
	@$(RM) $(HTML) $(CSS)

# 一部の変数を書き換えてallターゲットを実行するdevターゲット
.PHONY: dev
dev: JADEFLAGS := --pretty
dev: SASSFLAGS := --source-comments map --source-map
dev: all

# fswatchを使ってファイルが変更されたらdevターゲットを実行するwatchターゲット
.PHONY: watch
watch:
	@fswatch -r $(SRC) | xargs -I{} $(MAKE) dev
```

ローカルサーバの起動は

```bash:Terminal
$ grunt
```

で、ビルドは

```bash:Terminal
$ make watch
```

か、`make all`か`make dev`とか。もしくはVimとかEmacsならwatchしなくてもエディタからmakeを実行しても良いのかもしれない。

---

自分一人ならこれでも良いのだけど、複数人で開発するときにMakefileだといろいろ困るかもしれない。GruntfileはメンテできてもMakefileをメンテできるJSerが多いとは思えないし……

Makefileの自動変数がなかなか覚えにくい。毎回書くたびに調べてるのだけどその分、短く書けているような気がしないでもないというか。あとパッと見なにやってるかわからない。

あとはWindows環境だとまあいろいろ困るというか。Windows環境も考慮する必要がある場合はGrunt等のほうが絶対に良いはず。

Makeの実行が速くてとっても良い感じ。Gruntは若干もたつきがある気がする。

Gruntのプラグインをたくさんインストールする必要がないところも良いと思う。
XVimで快適コーディング


https://github.com/JugglerShu/XVim
https://github.com/JugglerShu/XVim/blob/master/README_jp.md

XVimはその名が示す通りXcodeでVimの操作を実現するプラグインです。
Xcode使いでVimmerな方は歓喜なのではないでしょうか。

開発ブランチではXcode6用も鋭意開発中です。

##### 何はともあれclone&インストール

```console:
$ git clone git@github.com:JugglerShu/XVim.git
```

1. XVim.xcodeprojを開く
2. Xcode5の場合"XVim for Xcode5"を選択
3. "Edit Scheme"で"Build Configuration"で"Release"選択
4. ⌘+Bでビルド
	1. $HOME/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/XVim.xcpluginが作成される
5. Xcodeを再起動

#### .xvimrcの設定
Vimと同様に`~/.xvimrc`を設定することで各々好きなカスタマイズが可能です。
オプションは以下から。
https://github.com/JugglerShu/XVim/blob/master/Documents/Users/FeatureList.md

私はこんな感じで設定しています。

```~/.xvimrc
set incsearch
set hlsearch

set ignorecase
set smartcase
```

各々好きな設定で快適なXVimライフを!!
KarabinerのMouseKeyModeを使ってマウスから解放される

[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)はかつてKeyRemap4MacBookと呼ばれていたキーボードカスタマイズツールです。

MacOSXの使用者には当初から有名なソフトでしたが、バージョン10.1.0を使用してみたところ、Mouse Keys Mode v2なるものが追加されていました。
使用してみたところかなり使い勝手がよかったので覚え書きを書いておきます。

# インストール
インストール方法は以下の公式サイトに書かれています。
https://pqrs.org/osx/karabiner/index.html.ja
一般的なdmgファイルなので、ダブルクリックでインストーラが起動します。

# 設定
Mouse Keys Mode v2を有効にするには以下のチェックボックスをチェックします。
![Screen Shot 2014-07-27 at 1.48.20.png](https://qiita-image-store.s3.amazonaws.com/0/38221/36b97a9a-f441-d177-6473-5d91c63630af.png)

1. ApplicationsからKarabinerを起動
1. Change Keyをクリック
1. 検索欄でmouseと入力
1. Mouse Keys Mode v2のチェックボックスをチェック（Mouse Keys scroll direction: naturalもチェックしておいた方がスクロールする際に違和感がなくていいです。）
1. ReloadXMLをクリック

以上で有効になります。

#使い方
dを押しながらhjklで上下左右にマウスカーソルが移動します。
dを押しながらvで左クリック、nで右クリックです。
基本的にはd + hjkl。
必要に応じて、fastのf、scrollのsを追加するという風に覚えれば大丈夫です。

|キーバインド |動作  |
|:----------|:-----|
|d + hjkl|上下左右にカーソル移動（fを足すと早くなる）|
|d + s + hjkl|上下左右に画面をスクロール（fを足すと早くなる）|
|d + v|左クリック（vを押したままhjklでドラッグ）|
|d + b|中クリック|
|d + n|右クリック|
|d + i|ウィンドウの真ん中にカーソル移動|
Codeforces #257 div.2 B

# 概要

http://codeforces.com/contest/450/problem/B
[昨日](http://qiita.com/esplo77/items/f1c6f3e5b34c0980ba4f)に引き続き。
なかなか楽しい問題でした。
今回はScalaっぽいこともできます。

# 問題

超シンプル。
以下の数式がある。
$f_n$の値を$10^9+7$で剰余を取り出力せよ。

```math
f_1 = x; f_2 = y;\forall i (i \leq 2), f_i = f_{i-1} + f_{i+1}
```

```math
1 \leq n \leq 10^9
```

# アルゴリズム

## 式変形

まずは、馬鹿正直に与えられた数式を使ってみます。
早速サンプル１、$x=2,y=3,n=3$の時を考えましょう。
数式に当てはめて・・・

```math
f_3 = f_2 + f_4 \\
 = 3 + f_4 \\
 = ...
```

 __$f_4$ が出ちゃったのォ！？__ ﾀﾞﾚｶﾀｽｹﾃｰ

というわけで、式変形しましょう。

```math
(1) f_i = f_{i-1} + f_{i+1} \\
(2) f_{i+1} = f_i - f_{i-1} \\
(3) f_i = f_{i-1} - f_{i-2}
```

(3)を使うと、

```math
f_1 = x \\
f_2 = y \\
f_3 = f_2 - f_1 = y - x \\
f_4 = f_3 - f_2 = (y-x) - y = -x
```

やったね！どこまでも行ける！

## 速度的に

どこまでも行けるようになったのはいいですが…。
nが$10^9$とデカイので、O(n)でも死にそう。
O(logn)とかO(1)にしないと競プロ的にはアウト。

O(n)でもダメということは、フィボナッチとかでよくあるメモ化してもダメ。
冪乗でフィボナッチ数を求めるような、画期的な何かが必要ですね。

## 式変形アゲイン

というわけで、再度式を眺めてみます。
こういう時は、しばらく項を求めてみると何かが見えるもんです。
実際にしばらく求めてみましょう。

```math
f_5 = f_4 - f_3 = -x - (y-x) = y \\
f_6 = f_5 - f_4 = y - (-x) = y + x \\
f_7 = f_6 - f_5 = (y+x) - y = x \\
f_8 = f_7 - f_6 = x - (y+x) = y \\
f_9 = f_8 - f_7 = y - x
```

$f_7$が・・・。
__$f_1$に帰っちゃったのォ！？ﾀﾞﾚｶﾀｽ(ry__

不思議ですが、この性質を使えばnがいくら大きかろうか、$f_1$～$f_6$のどれかを使えばOK。
O(1)で求められます。

## 剰余

言語によって、以下のコードの結果が異なります。

```scala
-1 % 10
```

これが9になるか、-1になるかは言語それぞれですが、Scalaでは-1のままです。困った。

しょうがないので、以下のテクニックを使って、Mで剰余を取った時負数にならないようにします。

```scala
( ( -1 % M ) + M ) % M
```

# 解答

今回はJava的な書き方とScala的な書き方を分けてみます。

## Java的記述

6要素を持つ配列を用意して、そこに入れます。
念のため、Int - Intをする時にも剰余を取っておきます。

```scala
import scala.math.BigInt

object Main extends App {
  val sc = new java.util.Scanner(System.in)
  val x, y, n = sc.nextInt

  def solve( x: Int, y: Int, n: Int ): Int = {
    val M: Int = 1e9.toInt + 7

    val newN = (n-1) % 6

    var memo = new Array[Int](6)
    memo(0) = x
    memo(1) = y
    for( i <- (2 until 6) ) {
      memo(i) = ( memo(i-1) - memo(i-2) ) % M
    }

    ( ( memo(newN) % M ) + M ) % M
  }

  println( solve( x, y, n ) )
}
```

分かりやすいですね。
これで通ります。

## Scala的記述

関数型言語的には、無限リストを作ってn番目の要素を取り出すのが美しい気がします。
ついでにBigIntを使って、Int - Intをしても大丈夫なようにしておきます（BigIntの計算速度わからんけど）。

```scala
import scala.math.BigInt

object Main extends App {
  val sc = new java.util.Scanner(System.in)
  val x, y, n = sc.nextInt

  def solve2( x: Int, y: Int, n: Int ): Int = {
    val M: Int = 1e9.toInt + 7

    val newN = (n-1) % 6

    def tail(a: BigInt, b: BigInt): Stream[BigInt] = a #:: tail(b, b - a)
    val res = tail(x, y)(newN)
    ( ( ( res % M ) + M ) mod M ).toInt
  }

  println( solve( x, y, n ) )
}

```

なんとなく、エレガント。


# 結果

Time: 233ms
Memory: 0 KB
RubyGemsインストール時にドキュメントを生成させない


できるだけgemモジュールのインストールを高速化させたいので。

```console:~/.gemrc
$ echo 'gem: --no-ri --no-rdoc' >> ~/.gemrc
```

と設定すると思いますが、deprecatedだったりするので下記で対応

```console:~/.gemrc
install: --no-document
update: --no-document
```

バージョンがカオスになったりする人なんかは上記の両方で対応したほうがいいかも。
rbenvでrubyのバージョン管理をする


もう今更感満載ですが。

# Rubyのバージョン管理
Rubyのバージョン管理システムは代表的なものでrvmとrbenvの2つあり、
最近ではrbenvがデファクトスタンダードになっている。

ここでは一応両方の特徴を解説。

(2014/07/27追記)
@riocampos さんにご指摘頂きました。
irbやpryで日本語やUnicode文字列を扱う際は環境変数にreadlineのオプションを設定する必要があるみたいです。
詳しくは以下で。
http://d.hatena.ne.jp/riocampos+tech/touch/20140408/ruby_reinstall_caused_by_openssl_vulnerability

## rvm
https://rvm.io/
https://github.com/wayneeseguin/rvm

### 特徴
- homebrewでのインストールが可能
- 複数のRubyのバージョンを管理可能
- gemsetというgemの管理が可能
- シェルコマンドを書き換えるので色々な影響範囲が大きい
- .rvmrcというファイルを設定することで当該ディレクトリで使用するRubyのバージョンを指定することができる

## rbenv
https://github.com/sstephenson/rbenv

### 特徴
- homebrewでのインストールが可能
- 開発コミュニティが活発
- ruby-buildというプラグインを利用することで開発バージョンのRubyも利用が可能
- PATHを設定するだけで利用することが可能

## rbenvでのRubyのバージョン管理
### rbenvのインストール
#### gitでのインストール
```console:
# gitからcloneでインストール
$ git clone git@github.com:sstephenson/rbenv.git ~/.rbenv

# プラグインインストール用のディレクトリ作成
$ mkdir ~/.rbenv/plugins

# ruby-buildのインストール
$ git clone git@github.com:sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

# PATHの設定
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

※ PATHの設定で.bash_profileの部分については使用しているshellに応じて適宜変えて下さい。


#### homebrewでのインストール
```console:
$ brew install rbenv
```

```console:
$ gem install rbenv-rehash
```

### rbenvでのRubyのインストール
ここでは最新の安定バージョンである2.1.2をインストールします。

```console:
# インストール可能なRubyの一覧を表示
$ rbenv install -l

# Ruby 2.1.2のインストール
$ rbenv install 2.1.2

# インストールされているRubyの確認
$ rbenv versions
```

### rbenvでインストールしたRubyの管理
#### 全体で使うRubyのバージョンを設定
```console:
$ rbenv global 2.1.2

# インストールされているRubyの確認
$ rbenv versions
```

#### カレントディレクトリで使うRubyのバージョンを設定
```console:
$ rbenv local 2.1.2

# インストールされているRubyの確認
$ rbenv versions
```

### rbenv rehashの手間を減らす
rbenvでインストールしたRubyのgemをインストールをした後に`rbenv rehash`をする必要がありますが、
面倒なので下記で手間を減らすことが可能です。

### rbenvでのRubyのアンインストール
```console:
$ rbenv uninstall 2.1.2
```

### rbenv自体のアンインストール
```console:
$ rm -rf ~/.rbenv
$ rm -rf /usr/local/bin/rbenv
$ rm -rf /usr/local/Cellar/rbenv
```

.bash_profile等でPATHを設定した部分も削除して下さい
node-gypを使ってnative addonを作成する (1) - Hello World

Node.jsのaddonの作成をするためには[node-gyp](https://github.com/TooTallNate/node-gyp)を使う。

```bash
$ npm install -g node-gyp
```

## Hello World

```js
module.exports.hello = function() { return 'world'; }
```

と同じものをaddonで作る。

```cpp:hello.cc
#include <node.h>
#include <v8.h>

using namespace v8;

Handle<Value> Hello(const Arguments& args) {
  HandleScope scope;

  return scope.Close(String::New("Hello World!"));
}

void init(Handle<Object> exports) {
  exports->Set(String::NewSymbol("hello"),
      FunctionTemplate::New(Hello)->GetFunction());
}

NODE_MODULE(addon, init) // 後ろにセミコロンいらない
```

`NODE_MODULE`の後ろにセミコロンはいらない。

次に、`hello.cc`をビルドするために`binding.gyp` を用意する。

```json:binding.gyp
{
  "targets": [
    {
      "target_name": "addon",
      "sources": [
        "hello.cc"
      ]
    }
  ]
}
```

次に `node-gyp configure` で
現在のプラットフォーム用のビルドファイルを作る。
その後に`node-gyp build` を行う。

* `node-gyp clean` -- ビルドディレクトリの削除
* `node-gyp configure`  -- ビルドファイルの生成
* `node-gyp build` -- ビルドの実行
* 

```bash
$ node-gyp clean configure build
$ node-gyp rebuild # 上といっしょ
```

すると`build/Release/hello.node` が作られる

```js:hello.js
var addon = require('./build/Release/addon');

console.log( addon.hello() ); // Hello World!
```

[続きます](http://qiita.com/taizo/items/44bf02878f5fc0842703)

# 参考

* [Addons Node.js v0.10.29 Manual & Documentation](http://nodejs.org/docs/v0.10.29/api/addons.html)
* https://github.com/rvagg/node-addon-examples
Python Django入門 (1)


![django-logo-negative.png](https://qiita-image-store.s3.amazonaws.com/0/48136/e3f38a61-bab7-8ad1-173b-a76b82ae8b78.png "django-logo-negative.png")

はじめに
-------

### なぜPythonを選ぶか

かなり独断と偏見が入っていますが、

* シンプルな言語セット
    - 某言語のように、呪文のように短く書けることが命ではない。
        - それでいて、書くコード量は少なく、すっきりしている。
    - 某言語のように、記号を多用しない。
        - コードを書いている間Shiftキーを押しっぱなしにならない。
* 学習コストが低い。
    - 言語セットとしての文法は、わりと平易で、直感で理解できる。
    - 難しい書き方は、後から覚えればよい。
        - 文法書を読むのは、後からでいいでしょう。まずこの講座をやってみましょう。
    - Djangoフレームワークや、各種Pythonパッケージのソースを読んでも、
        - 言語仕様を駆使した難しい書き回しは少ない。
        - メンテナーでなくても意外と読める。

### なぜDjangoを選ぶか

* Pythonで作られたフルスタック・フレームワークであるということ。
    - 必要なものはすべて揃っている。
    - テンプレートはあれを持ってきて、DBアクセスはあれを持ってきて、ということがない。
    - もちろん、拡張するモジュールはあるが、基本はDjangoだけで完結する。

* ORM - Object Relational Mapping オブジェクト関係マッピング が優れている。
    - DBアクセスのためにSQLを1行も書かないこともできる。 
* 管理サイトが素晴らしい。
    - Djangoにはscaffoldはないが、管理サイトが秀逸（詳しくは講座の中で解説します）
    - 管理サイトだけで、データ投入、データ検証ができる。
    - 特にプロトタイプを作る局面で、生産コストが下がる。
* 学習コストが低い
    - 生の HTML、Javascript、CSSが基本だったりするが、最初に選ぶWebフレームワークとしてはシンプル。

この講座について
-------------

この講座は、[GeekLab.NAGANO](https://www.facebook.com/geeklab.nagano/) 主催の「Django入門」講座用教材として書き起こしました。

### 講座の概略

「モバイル・ファースト」の時代ですが、スマートフォン・アプリケーションのバックエンド開発をDjangoで作れる人材を育てたいと願っています。

講座の流れは、以下のようになります。

* Python、Djangoの開発環境構築
* Djangoで親子関係のあるDBモデルを定義する。
* DBモデルを管理サイトで保守する。
* DjangoのCRUDを書いてみる。
* Bootstrapを使う。
* スマホバックエンドを作る。(JSONを返すAPIを作る)

### 学習対象者

* JavaもしくはPHPは、やったことがあるんだけど、というPython以外の開発経験がある方を想定しています。
* 一部、UNIX的な知識が必要になるかもしれません。その場合まわりの誰かに助けを求めて下さい。

### サンプルコード

サンプルコードは、以下にあります。
講座の中ではコピペで構わないので、必要に応じて活用して下さい。

[https://github.com/kakky/mybook30](https://github.com/kakky/mybook30)

### 使用マシン

本編はMacを前提にお話します。

* Mac OS Xは、MacのGUIを被ったUNIXマシンです。
* コマンドプロンプトではなく、ターミナルは本当にUNIXターミナルです。
* 素の状態で、各種UNIXコマンドが使えます。
* UNIXソースコードが、そのままコンパイルできるので、UNIXのツールがそのまま動き、Web開発の親和性が高い。

Web系の開発では、Macをお薦めします。

とは言え、Windowsを使っている方も多いと思うので、環境構築の部分はWindows、Macのそれぞれを説明いたします。

それでは、

* [Python Django入門 (2) Win編](http://qiita.com/kaki_k/items/1fff7fefcf26dc4b69bc)
* [Python Django入門 (2) Mac編](http://qiita.com/kaki_k/items/e824cfcf089e75d43551)

のどちらかに進んで下さい。

> 【更新履歴 3.0】
> * Django 3.0 + JQuery 3.x + Bootstrap4 で書き直しました。
> * PyCharm の UI が結構変わっているので、スクショを貼り直しました。
> * IDE として eclipse の説明は削除しました。
> * まだ Python などのインストール時のスクショが古いままですが、お許し下さい。
>
> 【更新履歴 2.0】
> * Django 2.0 + JQuery 3.x + Bootstrap4 で書き直しました。
> * まだ Python や PyCharm のインストール時のスクショが古いままですが、お許し下さい。
>
> 【更新履歴 1.9】
> * Django 1.7 -> Django 1.9
> * eclipse -> PyCharm
> で書き直しました。
Parseを試してみる 2週目

[三連休なのでParseを試してみる](http://qiita.com/croquette0212/items/9cf1e1194991a99709d2) で周辺環境の準備でParse自体をあまり三連休中にいじれなかったので、その続き。

随時更新中。

# 4日目
## もう一度Gruntの復習
いまのbuildタスクの中身

```coffeescript
  grunt.registerTask "build", [
    "clean:dist"
    "wiredep"
    "jade"
    "useminPrepare"
    "concurrent:dist"
    "autoprefixer"
    "concat"
    "ngmin"
    "copy:dist"
    "cdnify"
    "cssmin"
    "uglify"
    "filerev"
    "usemin"
    "htmlmin"
  ]
```

* [wiredep](https://github.com/stephenplusplus/grunt-wiredep)ってなんだ -> bower.jsonに書いてある必要なコンポーネント(dep = dependencies)をindex.jadeの`// bower:js`から`// endbower`の間に`script`タグで突っ込んでくれるやつ
* [useminPrepare](https://github.com/yeoman/grunt-usemin#the-useminprepare-task)は?

> useminPrepare task updates the grunt configuration to apply a configured transformation flow to tagged files (i.e. blocks). By default the transformation flow is composed of concat and uglifyjs for JS files, but it can be configured.

* htmlを解析して、その後のconcatとかuglifyとか用の設定を作るっぽい。
* jade使うようにしてから、`grunt build`で`concat`とかがうまくいかないのは、ここが原因だった。
* [Short Circuits: Using Jade templates with Yeoman](http://thephuse.com/development/short-circuits-using-jade-templates-with-yeoman/)の6に書いてあった。

> By default, it’s going to look for those scripts in the same location as the index.html file it’s parsing, which is going to be .tmp in our case. Since all our files are actually still in /app, we need to indicate this to usemin. So, anywhere you have a usemin block that refers to files in /app, indcate it with (app).

* html2jadeで変換した際にインデントがおかしくなっているコメントがあって、そのせいで`useminPrepare`でconfigの作成ができていなかった。

* `concurrent`は? -> `concurrent:dist`に定義されてる複数のタスク`"copy:styles"`, `"imagemin"`, `"svgmin"`を高速化のために並列実行するよ、っていうだけ。

* gruntがやっぱりややこしいので、gulpに移行しようかな…[参考](http://qiita.com/yuku_t/items/dce7214f153173493315)
シェルのワンライナーで素数を求める

# シェルのワンライナーで素数を求める

* ```factor```コマンド使えば簡単にできるのに気付いた

```
$ for i in {1..100} ; do test "${i}" = "$(factor $i | sed 's/[0-9]*: *//' | sed '/^$/d')" && echo $i ; done
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
```
ジオデータのビジュアライズ２歩目-市区町村の色をマウスオーバーで変える

[前回](http://qiita.com/interestor/items/fd2ac773c9aecfc7c506)の続き。
D3.jsを使ってジオデータのビジュアライズができることを目指した第２回勉強会のまとめ。

**東京都の地図の各市区町村にマウスオーバー・クリックで色を変える**ところまで。

![alt](http://cdn-ak.f.st-hatena.com/images/fotolife/i/interestor/20140726/20140726223120.png)

----------------------------------------------------------

#前回のまとめ

ほとんどsawamur@githubの[投稿](http://qiita.com/sawamur@github/items/ec32237bcbaaba94108d)のまま。

```js:mapping.js

   var g,
        width = 900,
        height = 400;
    var base_fill_color = "rgb(150,150,150)",
    	  base_stroke_color = "rgb(30,30,30)";
    // svg要素を作成し、データの受け皿となるg要素を追加している
    map = d3.select('#map').append('svg')
        .attr('width', width)
        .attr('height', height)
        .append('g');

    // 同じディレクトリにあるgeojsonファイルをhttp経由で読み込む    
    d3.json("tokyo.geojson", function(json) {
           var projection,
                 path;
			var map_id;

           // 投影を処理する関数を用意する。データからSVGのPATHに変換するため。
           projection = d3.geo.mercator()
                  .scale(25000)
                  .center(d3.geo.centroid(json))  // データから中心点を計算
                  .translate([width*2, -height/1.3]);

            // pathジェネレータ関数
            path = d3.geo.path().projection(projection);
           //  これがenterしたデータ毎に呼び出されpath要素のd属性に
           //  geoJSONデータから変換した値を入れる                

            map.selectAll('path')
            .data(json.features)
            .enter()
            .append('path')
            .attr('id',function(d){
				map_id =  d.properties.N03_001+"_"+d.properties.N03_004;
				return(map_id);
			})
			.attr('d', path)
            .attr("stroke", base_stroke_color)
			.attr("fill", base_fill_color)
    });
```

#マウスオーバーで色を変える

マウスオーバーしたポリゴンの中の色・線の色を変える。

````.on('mouseover', function(d){}````部分に以下を記述

```js:mapping.js
//マウスオーバー時のインタラクション
.on('mouseover', function(){  
	this.attributes['stroke'].value = "yellow";//線の色を黄色
	this.attributes['fill'].value = "red";//ポリゴンの色を赤に
                        })
````
ちなみにマウスオーバーで色を変えると変えっぱなしになるので、マウスが上にあるときだけ色を変えたい場合にはマウスアウトで色を戻す

##マウスアウトの色を指定
```js:mapping.js							
// mouseooutの時のインタラクション	

.on('mouseout', function() {
           this.attributes['fill'].value = base_fill_color; //元の色に戻す
           }

````

##おまけ：クリック時に色を変える

```js:mapping.js
                // clickされた時のインタラクション	
.on('click', function(d) {
this.attributes['fill'].value = "blue";
 });

````

---------------------------------------

次回は地図とグラフを連携させるというそれっぽいかんじのことをやる。
A Tour of Go Exercise: Errors

# Exercise: Errors

http://go-tour-jp.appspot.com/#56

http://qiita.com/yanap/items/5f1085a828bdef8ab310

これにエラー処理を追加する

```go
package main

import (
    "fmt"
    "math"
)

type ErrNegativeSqrt float64

func (e ErrNegativeSqrt) Error() string {
    return fmt.Sprintf("cannot Sqrt nagative number: %g", float64(e))
}

func Sqrt(x float64) (float64, error) {
    if x < 0 {
    	return 0, ErrNegativeSqrt(x)
    }
    z := float64(2.)
    s := float64(0)
    for i := 0; i < 10; i++ {
        z = z - (z*z - x)/(2*z)
        if math.Abs(z - s) < 1e-10 {
            break;
        }
        s = z
    }
    return z, nil
}


func main() {
    fmt.Println(Sqrt(2))
    fmt.Println(Sqrt(-2))
}
```
OS X Mavericksでダブルクオーテーションが自動置換されるのをすべてのアプリケーションで防ぐ


OS X Mavericksからデフォルトでダブルクオーテーションやハイフンが自動で置換されてしまうようになりました。
コードを打つときなど、ダブルクオーテーションが自動で置換されてしまい煩わしい思いをしていたのですが、これを一括で無効にする方法があったので手順を記します。

1. システム環境設定を開く
2. キーボードを開く
3. ユーザ辞書に移動する
4. スマート引用符とスマートダッシュを使用のチェックを外す

![キーボード](https://qiita-image-store.s3.amazonaws.com/0/15182/47a094b0-7a60-4be8-18e5-06fd5cc5dd90.png)

## 参考
[OS X Mavericks: 書類のテキストを置き換える](http://support.apple.com/kb/PH14294?viewlocale=ja_JP)
【雛形】ローカル変数のスコープ独立性を維持しながら、クラス定義をする

#初投稿です
割と鎖国政策を敷いてきたために、今更になって初投稿だったりします。よろしくお願いします。

#こんな問題を抱えていませんか？
Javascriptって、スコープの維持に神経使う言語だったりしますが

* 割と単純な変数名を使っていたら、変数名が被ってしまい、訳の分からない挙動をし始めた
* 変数名の被りを排除するために、複雑な変数名、複雑なオブジェクト構造を構築してしまい、ソースの可読性が落ちた
* スコープ区切ったのはいいけれど、他のスコープからクラスの呼び出しがうまく行かない

#単純な方法でスコープを区切る事ができます
```coffeescript:example.class.coffee　(ひな形としても使えます)
(->
  $window = @
  variable01 = "test"
  class Example
    constructor : ->

    methods : ->

  # キモ②
  $window.Example = Example

# キモ①
).call(@)

```

#キモの部分
```coffeescript:①最上位の()
(->
  $window = @
  # クラス定義
).call(@)
```
.call(@) の部分は、JS上は .call(this); に置き換えられる訳ですが、
この部分のthisはつまりwindowになります。
.call()で呼び出された最上位スコープ内で使われるthisがつまりwindowになるので、
これを任意の変数(サンプルでは$window)に格納して、JSのwindowオブジェクトにアクセスする訳です

```coffeescript:②.call()スコープ内の下の方
$window.Example = Example
```
この部分で、Exampleのクラス定義を window.Example に代入しています。
この事により、.call()スコープ外からも、Exampleクラスを呼び出せるようになりますね。

#注意すべき事
**①クラス名が被らないように**
→クラス名が被ると、JS読み込みが後だったものにオーバーライトされてしまうので、注意が必要です。

**②巨大なクラスにならないように**
→ひとつのクラスに大量にコードを書きすぎると、保守性が下がるので、
予め機能を検討した上で、クラス分けして行くのがオススメです。


ちなみに、CoffeeScriptをコンパイルする際に、
自動的にスコープ切ってくれたりするケースもあるようですが、
私は逆に訳が分からなくなってしまったので、シンプルにコンパイルさせて、
スコープは自分で制御する派です。

#終わりに
以上です。もちろん、
複雑なClass定義をする際にはもっといい方法があると思いますが、
比較的小さなJS群を構築する際に、

* 今書いているクラススコープのコーディングに集中したい
* 他の変数に翻弄されたくない

と行った時に、うまく使ってもらえればと思います。
golangをMacOSX Maverickにインストールするには

いくつかの方法がある。gcc-goはよくわからないので省略

## オフィシャルサイトのバイナリを利用してインストールを行う

下記の場所からインストーラーをダウンロードし、インストールを行う

* [Downloads - The Go Programming Language](http://golang.org/dl/)


## Homebrewを利用してインストールを行う（クロスコンパイル環境なし）

### コマンドライン
```
brew install go
```

## Homebrewを利用してインストールを行う（クロスコンパイル環境あり）

```
brew install go --cross-compile-all
```

### 実行結果

```
[~]$ brew install go --cross-compile-all
==> Downloading https://storage.googleapis.com/golang/go1.3.src.tar.gz
######################################################################## 100.0%
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> ./make.bash --no-clean
==> Caveats
As of go 1.2, a valid GOPATH is required to use the `go get` command:
  http://golang.org/doc/code.html#GOPATH

`go vet` and `go doc` are now part of the go.tools sub repo:
  http://golang.org/doc/go1.2#go_tools_godoc

To get `go vet` and `go doc` run:
  go get code.google.com/p/go.tools/cmd/godoc
  go get code.google.com/p/go.tools/cmd/vet

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libexec/bin

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
?  /usr/local/Cellar/go/1.3: 7478 files, 1.2G, built in 4.5 minutes
```




## 情報源

* [Goはクロスコンパイルが簡単 - unknownplace.org](http://unknownplace.org/archives/golang-cross-compiling.html)
RuboCop | Style/StringLiterals

# RuboCop | Style/StringLiterals

## 概要

RuboCopの「Style/StringLiterals」警告について。

変数展開や文字列中にシングルクォートを含む場合など、特別な理由がなく
ダブルクォートを使っていないかチェックする。
%記法、ヒアドキュメントに関しては特別なチェックを行わない。
設定によっては、上記のようなケースでもダブルクォートを使うように
チェックすることもできる。

### 設定値一覧

|設定対象|対象|内容|デフォルト|
|:-----|:--|:---|:---:|
|EnforcedStyle|single_quotes|変数展開やエスケープの必要がない場合はシングルクォートを利用する|○|
|EnforcedStyle|double_quotes|変数展開やエスケープの必要がない場合はダブルクォートを利用する|--|

## StringLiterals

### 検証プログラム

~~~ruby:single_line_methods.rb
print "hoge"
print "hoge'hige'"
msg = 'msg'
print "hoge#{msg}"
print 'hoge'
print %Q(hoge)
print %q(hoge)
~~~

### 実行結果 デフォルト の場合

~~~yaml:.rubocop.yml
StringLiterals:
  EnforcedStyle: single_quotes
~~~

~~~bash
$ rubocop single_line_methods.rb
Inspecting 1 file
C

Offenses:

single_line_methods.rb:1:7: C: Prefer single-quoted strings when you don't need string interpolation or special symbols.
print "hoge"
      ^^^^^^

1 file inspected, 1 offense detected
~~~

### 実行結果 double_quotes に設定します

~~~yaml:.rubocop.yml
StringLiterals:
  EnforcedStyle: double_quotes
~~~

~~~bash
$ rubocop single_line_methods.rb
Inspecting 1 file
C

Offenses:

single_line_methods.rb:3:7: C: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.
msg = 'msg'
      ^^^^^
single_line_methods.rb:5:7: C: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.
print 'hoge'
      ^^^^^^

1 file inspected, 2 offenses detected
~~~

## 補足

この警告は rubocop -a で修正可能です。

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
Serverspec テスト対象のサーバ上でコマンド実行


```ruby
res = backend.run_command("uname -a")
```

SpecInfra::CommandResultオブジェクトが却ってくる
[specinfra/lib/specinfra/command_result.rb](https://github.com/serverspec/specinfra/blob/master/lib%2Fspecinfra%2Fcommand_result.rb)
tmux環境でrbenvによるバージョン変更が出来ない現象


##はじめに
みなさんこんにちは。
rbenvでバージョンを変更した後tmuxを使うと、バージョンが変更されてない（デフォルト状態？）現象が起こったので紹介します。

##現象
bashでrbenvのバージョンを確認（`ruby -v`）すると以下のようになった。
**※思い出しながらの投稿なので表示されているコードと実際のコードには若干間違いがあるかもしれないです**

```端末
MacBook-Air:~ user $ ruby -v
ruby 2.0.0p247 
```

tmuxの環境下で同じコマンドを打つと以下のようになる。

```tmux利用時
MacBook-Air:~ user $ ruby -v
ruby 1.8.7 
```

rbenvでバージョン指定しているはずなのに、tmuxでは有効になっていませんでした。
更に、もとからrailsはインストール済みだったのでバージョンを確認すると、tmuxを利用しない場合は問題ないがtmux利用時はrailsコマンドが`command not found`となり効かなくなる。
railsが消えた...。

##原因
`rbenv versions`をすると以下のようになっていた。

```端末
MacBook-Air:~ user $ rbenv versions
system
  1.9.3-p327
* 2.0.0-p247 (set by RBENV_VERSION environment variable)
```

指定したバージョンの後ろに`(set by RBENV_VERSION environment variable)`となっているのがポイント。
環境変数RBENV_VERSIONが設定されてしまっているのが問題のようです。
> 参考URL:http://rikei-webmemo.hateblo.jp/entry/2014/01/29/134019

試しにtmuxを利用していない状態で環境変数RBENV_VERSIONを確認してみました。

```端末
MacBook-Air:~ user $ echo $RBENV_VERSION
ruby 2.0.0-p247
```

tmux利用時は以下のようでした。

```tmux利用時
MacBook-Air:~ user $ echo $RBENV_VERSION

```

参照出来てないってことなんですかね。

##解決
以下のサイトを参考にさせて頂きました。ありがとうございます。
>tmux+rbenvの環境で指定したRubyが使われない件
>http://d.hatena.ne.jp/akishin999/20130627/1372284674

.bash_profileに以下のコードを、

```.bash_profile
export PATH=$HOME/.rbenv/shims:$PATH
```

.tmux_confに以下のコードを入力。

```.tmux_conf
set-environment -gu RBENV_VERSION
```

これでもう一度バージョンを確認してみると

```端末
MacBook-Air:~ user $ rbenv versions
  system
  1.9.3-p327
* 2.0.0-p247 (set by /Users/user/.rbenv/version)
```

指定バージョンの後ろが`(set by /Users/user/.rbenv/version)`となっていて変更されているのがわかりますね。
これでtmux利用時も指定したバージョンを利用することができるようになりました。
また、railsコマンドが`command not found`になっていた件も同時に解決しました。

##おわりに
今回の記事は現象発生時にリアルタイムで更新出来なかったため、コードなどの表記は若干違う可能性もあります。
あと、環境変数とかいろいろいぢくってて途中わけわからなくなった作業もあったので、これ以外に無意識になんかやったかもしれないです…。
まぁご参考程度によろしくお願いします。
SublimeTextにColorsublimeをインストールし、Themeをインストールする

初投稿です。

SublimeTextがすごいという噂を聞いたのと、
使っているMacが故障して、中身がサラの状態で返ってきたので導入してみることに。

![スクリーンショット 2014-07-26 21.40.32.png](https://qiita-image-store.s3.amazonaws.com/0/38510/6a6d82a1-1dbb-3636-2bec-3e857ce710d6.png)

うーん。

とりあえず色を変えよう。

ということで、本記事はColorsublimeからThemeをインストールするための個人メモとなります。

いろいろ調べたところ、
Colorsublime( http://colorsublime.com/ )というサービスを発見。

![スクリーンショット 2014-07-26 21.48.05.png](https://qiita-image-store.s3.amazonaws.com/0/38510/61f84d78-8052-d1a4-f5f0-152b2eac1570.png)

プレビューもできて、色のイメージがつきやすいです。

![スクリーンショット 2014-07-26 21.48.16.png](https://qiita-image-store.s3.amazonaws.com/0/38510/957b284d-8174-2a1c-bef8-0b746abaddcc.png)

「All Hallows Eve」という Theme が気に入ったので
これをSublime Textに反映していきます。
(コマンドなどはすべてMac前提です。)

# Colorsublime Packageのインストール
* [shift] + [command] + p　で「Package Control: Install Package」を呼び出します。

![スクリーンショット 2014-07-26 21.23.13.png](https://qiita-image-store.s3.amazonaws.com/0/38510/e146a495-0ae8-c8f9-2611-774939c9d2b2.png)

* Install Packageのダイアログがでてきたら、「Colorsublime」を探し、選択すると、インストールされます。（簡単！）

![スクリーンショット 2014-07-26 21.27.13.png](https://qiita-image-store.s3.amazonaws.com/0/38510/66b65120-cced-9e9e-c186-7010b45fa9a8.png)

# Colorsublime から Theme をインストールする

* [shift] + [command] + p　で「Colorsublime: Install Theme」を呼び出します。

![スクリーンショット 2014-07-26 21.29.12.png](https://qiita-image-store.s3.amazonaws.com/0/38510/cd52d0ce-0ad2-3d26-ed51-ed988a5fa0da.png)

* Theme が一覧で表示されるので、All Hallows Eve を検索して選択します。
   * カーソルを当てるとプレビューされます。

![スクリーンショット 2014-07-26 21.29.32.png](https://qiita-image-store.s3.amazonaws.com/0/38510/643a1376-0559-3240-9d7a-9df26020be15.png)

* 無事に、All Hallows Eveに変わりました！
    * 青とオレンジが好きなんです。 

![スクリーンショット 2014-07-26 21.33.46.png](https://qiita-image-store.s3.amazonaws.com/0/38510/650f9ec1-9008-3909-f9e6-52de2e1c0b76.png)

* ちなみに、Preferences: Settings - User に下記の1行が反映されています。
`"color_scheme": "Packages/User/Colorsublime/themes/All_Hallows_Eve.tmTheme",`


End of Document.