OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者】Railsのvalidatesのpresenceでエラーメッセージが重複するのを防ぐ方法

validatesについて、presenceと他の制約が一緒に表示されてしまうのをなんとかしたい。という質問をよく受けます。そこで、解決策をまとめておくことにしました。


##エラーメッセージが重複で表示される

contact.rb

```rb
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: {with: VALID_EMAIL_REGEX}
```

この場合、何も入力しないと

```
・メールアドレスが入力されていません。
・メールアドレスが不正な値です。
```

※あらかじめエラーメッセージは、日本語化しています。

と表示されてしまいます。

## エラーメッセージが重複するのを防ぐ方法

contact.rb

```rb
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, format: {with: VALID_EMAIL_REGEX}, allow_blank: true
  validates :email, presence: true
```

このように書くことで、何も入力しない場合でも

```
・メールアドレスが入力されていません。
```

とエラーメッセージが重複するのを防ぐことができます。

### ポイント１

``` allow_blank: true ``` とすることで、``` validates :email, format: {with: VALID_EMAIL_REGEX} ``` が、メールアドレス（email)の入力が空の時に実行されないようにします。

### ポイント２

validatesを２つに分けることで、 ``` allow_blank: true ``` が ``` validates :email, format: {with: VALID_EMAIL_REGEX} ``` にかからないようにします。

## 補足

```rb
validates :email,
  presence: true,
  format: {with: VALID_EMAIL_REGEX, allow_blank: true}
```

このように一行で記述することもできます！ :smile:
Golangで指定した幅で文字列を丸める方法

# Golangで指定した幅で文字列を丸める方法
一定の文字数で文字列を丸めたい場合があります。

そんな場合はこちら

```lang:cutString

str = string([]rune(str)[:maxLen])

```

応用編
一定数で丸めて、語尾に「...」をつけたい場合があると思います。

```lang:cutStringData
func main() {
    // strという文字列を100文字で丸めて、語尾に「...」をつけて表示したい場合
    cutStringData(str,100,"...")
}
func cutStringData(str string, maxLen int, cutString string) string {
    if len(strings.Split(str, "")) < maxLen {
        maxLen = len(strings.Split(str, ""))
        cutString = ""
    }
    str = string([]rune(str)[:maxLen]) + cutString
    return str
}

```
Raspberry Pi の Image を SD カードに import・export する方法

[RaspberryPiのSDカードをバックアップ・リストアする](http://lotuseater365.tumblr.com/post/96620739773/raspberrypi%E3%81%AEsd%E3%82%AB%E3%83%BC%E3%83%89%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2%E3%81%99%E3%82%8B)の「（MAC）コマンドで」と書いてあるところを全面的に参考にする。


## SDカードへ書き込み
新しいディスクを入れてデバイス名を確認
$ diskutil list
確認したらアンマウント
$ diskutil unmountDisk /dev/disk2
フォーマットする
$ sudo newfs_msdos -F 16 /dev/disk2
書込む
$ sudo dd if=/Users/t_kida/Desktop/raspi.dmg of=/dev/disk2
※ `Control + T`で途中経過がみれます。

## SDカードから読み出し
元になるSDを入れる
デバイス名を確認する
$ diskutil list
ディスクイメージを吸い出す
$ sudo dd if=/dev/disk2 of=/Users/t_kida/Desktop/raspi.dmg

※ `Control + T`で途中経過がみれます。
canvasを便利にするfabric.jsの紹介と導入方法

#開発環境
mac OS X Yosemite
Chrome 48.0.2564.103 (64-bit)
fabric.js v1.5.0

#概要
##fabric.jsとは何か
canvasを拡張するJavaScriptライブラリです。
日本語の資料があまりないのでここで布教しようかと思います。

[公式サイト](http://fabricjs.com/)
[公式サイトが（非公式に？）日本語訳されているサイト](http://yamineko.lv9.org/Fabric.js%20Javascript%20Canvas%20Library/Fabric.js%20Javascript%20Canvas%20Library.html)※記載されているバージョンが古いので情報は新しくないかもしれません。ご注意を。
[github](https://github.com/kangax/fabric.js)

##どんな用途に使えるのか
マウス操作でcanvas内のオブジェクトを操作するなどの時には非常に便利だと思います。
手書きも簡単に実装できます。

公式には得意不得意について説明がされていますのでぜひ[こちら](https://github.com/kangax/fabric.js/wiki/When-to-use-Fabric)をご一読ください。

#インストール
##事前準備
以下URLよりダウンロード
[github](https://github.com/kangax/fabric.js/tags)
※2016年2月16日現在、v.16のrc1が出ていますが、ここでは正式版のv.15を採用しています。

distフォルダ中のfabric.jsまたはfabric.min.jsをフォルダへ配置すれば良いです。
CDNの場合は[http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js](http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js)を指定すれば良いです。

##html
こちらを元に以下のように作成しました。
[github html5-template](https://github.com/sixrevisions/html5-template)

```index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta charset="utf-8">
  <title>fabric.js test</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <!--[if lt IE 9]>
  <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
  <![endif]-->
  <style type="text/css">
    canvas {
      border: solid 3px #000;
    }
  </style>

</head>
<body>
  <p>テストキャンバスはこちら</p>
  <canvas id="test_canvas" width="500" height="500"></canvas>

  
<!-- SCRIPTS -->
<!-- Example: <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> -->
</body>
</html>
```

##JavaScript
動作確認だけなのでJavaScriptはこんな感じで書いておきます。

```index.html
  <script type="text/javascript">
    //window.onloadを使い、htmlが読み込みされてからスクリプトを動作させる。
    window.onload = function(){
      var canvas = new fabric.Canvas('test_canvas');
      
      canvas.isDrawingMode = true;
      canvas.freeDrawingBrush.color = '#000000';
      canvas.freeDrawingBrush.width = 5;
    }
  </script>
```

#解説。と気をつけること
##canvas layer
fabric.jsにおけるcanvasは`new fabric.Canvas(#id)`のように作成します。

この際気をつけるのはnewが動作した際にCanvas#idは`Canvas.upper-canvas`と`Canvas.lower-canvas#id`に分けられます。

※重要：説明はこちらを見てください。英語ですがわかりやすいです。
[How fabric canvas layering works](https://github.com/kangax/fabric.js/wiki/How-fabric-canvas-layering-works)

おそらくフリーハンドなど操作中のものはupper-canvasに配置され、位置が確定したものはlower-canvasに配置されているものと思われます。

従ってcanvasに対してcss:positionを使って位置を動かしたい場合、自分で作成した`Canvas#test_canvas`に対してではなく、`Div.canvas-container`に対して適用する必要があります。

##フリーハンドのパラメータ
`isDrawingMode`はtrue/falseでフリーハンド描画モードかそうでないかを切り替えられます。
使い方としてはjQueryでon/offするなどが考えられます。

他のパラメータはshadowなどがあります。
`canvas.freeDrawingBrush.setShadow("2px 2px 10px rgba(0,0,0,0.2)")`と書けば、フリーハンドで描いた線に影がつきます。

#今回使用したファイル
[github](https://github.com/seimiyajun/fabricjs_test/commit/148079a0768b0cc03fb2745cf99d61519e833dda?diff=unified)

とりあえずはこんな感じで。
続きはまた書きます。
Golangで文字列からタグを取り除く方法

# Golangで文字列からタグを取り除く方法
タグを抜き出して表示をしたい場合があります。
そんな時は正規表現を使ってうまく取り除くことができます。

```lang:removeTag
func removeTag(str string) string {
    rep := regexp.MustCompile(`<("[^"]*"|'[^']*'|[^'">])*>`)
    str = rep.ReplaceAllString(str, "")
    return str
}
```
マイクロフレームワークから始めるWebアプリ開発

#最初に結論

**無理してPyramidとかDjangoでやろうとせず、かつ自作Webサーバーみたいなものを構築しないですむんだ！**

#何があったか

##無職のくせになにもしなかった

前からもやもやと構想は練っていたWebサービス（ほぼ匿名掲示板みたいなもの）があったのだが、*自分が勝手に思っていた*最近の流行りで
「なんか大掛かりなフレームワーク使わないと行けないんだろうなあ」
と思いながらかれこれ半年過ごしてた。

##「それ、作ればいいじゃん」と言われた

知人とコワーキングスペースで出くわして世間話のついでに
「今こんなの考えてるんだ」
と話したら
「作ればいいじゃん。APIまでできたらマネタイズは何とかするよ」
と言われたため、ちょっと本気出した。
どちらかというと、まともに寝てない知人の姿を見たため本気を出した。

##とりあえずPyramidに手を出してみた

というわけでPythonでたまたま「小さく、早く、堅実な」という売り文句のPyramidを使ってみた。

```shell-session
pcreate -s starter MyProject
```

と打ち込んで、できたスクリプトを実行したらすぐに綺麗なトップ画面が出てきてすごく感動したのを覚えている。すっごく夢が広がった。

##ドキュメントを読むほど分からなくなっていった

しかし生成されたプロジェクトを改造しようとチュートリアルを見ながら触ったが、やっぱり理解の浅いルーティング周りの知識やモデルの作り方で躓いた。
モデルはできたにはできたが、結局MongoDBなのでPyMongoでJSONっぽく扱えるし
「作る必要あるか？　関数で直接ビューに渡してしまって良いのでは？　いや、そもそもRender Viewモデルって……」
などなど考えてフレームワークの理解に苦しんでいる自分が居た。
「こんな大掛かりな事をしなくてもいいよな」
と思ったりして、[いつかの二の舞い](http://qiita.com/manzyun/items/21f5396ee812f4e0eb86)になりそうな自分に不安を覚えた。

##「なーんかもっとシンプルな書き方あったよな」と思ってBottleのページに行った

求めていたものがあった。
「そうそう、コレくらい簡素でいいんだよ。僕のオツムの性能だったら」
そんなサンプルコードがトップページに載っていた。

そして僕は、マイクロフレームワークを使うことを決心した。
/* ただし、Flaskを選択。過去にちょっと挑戦したWerkzeugを作ったり、[PythonプログラマのためのRust入門](http://qiita.com/t2y/items/434854fab16159a7c0f7)を書いたArminさんだったため。 */

#「大は小を兼ねる」とは言うが

道具がでかすぎると手に余るのが現実だった。
棚を壁につける程度のDIYに、コンプレッサー式インパクトは必要だろうか？
ネットショッピングするだけなのに、ディスプレイを4つつけてもラグが起きないゲーミングPCが必要だろうか？

*道具がデカ過ぎたら小さくする。逆も然り？*　と思った。

#とりあえず悩んでる人へ

以下は自分が作るに当たって実践したことをつらつらと。

##まずドキュメントから作ってしまえ

「アプリの構想が思い浮かばない」
と悩んでいる人は、一度アウトプットしたほうが良い。チラシの裏でも構わない。
ただ、自分はSphinxで最初からドキュメントを作った。テストコードはまだちゃんと書けないけど、日本語で求めるものはなんとか書ける。
書けるものは積極的にアウトプットしたほうが、大切なことを忘れなくて済むかもしれない。

##結構でっかく（ちっちゃく）なりそうだったら思い切ってフレームワークを変えてしまったらどうだろう

今回まさにそれだった。
書きなおすのはコストかもしれないが、その後の改修の時間の方がプログラミングは長いと思ってる。
その見極めは難しいが、まずはマイクロフレームワークでやってみよう。

#おわりに

「Webアプリを作るのは初めてで、何から手を出せば良いのかわからない」
という人や
「プロトタイプを作りたいけど、大きなプロジェクトになるだろうから大きなフレームワークで作ってるけど、思い通りに進まない」
という人は、思い切ってマイクロフレームワークを使ってみよう。

マイクロフレームワークは「やりたいけど、うまくいかない（脳内シミュレーション込み）」という人の背中をそっと押してくれるものだと、今回の体験で思った。
line monitor > コア部分 (v0.9) > <ACK>などの単独のコントロールキャラクタの扱い追加

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

http://qiita.com/7of9/items/5e6a8c9f60b758c3e640
にて問題のあった`<ACK>`などの扱いを対応。

関連 http://qiita.com/7of9/items/eee48db0127ad68790f2

### code (v0.9)

[v0.9 @ github](https://github.com/yasokada/python-151113-lineMonitor/releases/tag/v0.9)


### 変更前

```py
def comrelay(rcvd, srccom, dstcom):
    str1 = srccom.read()
    if (len(str1) > 0):
        rcvd = rcvd + str1
    if "\n" in rcvd or "\r" in rcvd:
        print "rcvd=", rcvd
        dstcom.write(rcvd)
        return rcvd, True # new line = true

    return rcvd, False # new line = false
```

### 変更後

```py
def isControlCharOtherThanCRLF(code):
    if ord(code) == 13 or ord(code) == 10:
        return False
    return ord(code) < 32 

def comrelay(rcvd, srccom, dstcom):
    str1 = srccom.read()
    if len(str1) > 0 and isControlCharOtherThanCRLF(str1):
        print "rcvd:control char:" + str(ord(str1))
        dstcom.write(rcvd)
        return ".", True # new line = true
    if (len(str1) > 0):
        rcvd = rcvd + str1
    if "\n" in rcvd or "\r" in rcvd:
        print "rcvd=", rcvd
        dstcom.write(rcvd)
        return rcvd, True # new line = true

    return rcvd, False # new line = false
```

### 備考

- `<ACK>`などを受けたらとりあえず反対側のRS-232Cへ送信するようにしている。
- UDPへの送信は"."という文字にしているが、TODOにあるように`"<ACK>"`などの文字としたい気がする
- またはUnity側のソフト対応で"<ACK>"に変換するなども必要かも

とりあえず明日使いたいので上記で対応とする。

### fix bug

送信処理が間違っていた。
v0.9タグを付け直した。

[v0.9 @ github](https://github.com/yasokada/python-151113-lineMonitor/releases/tag/v0.9)

以下が動作するコード。
str1を送信するべきところをrcvdを送信していた。

```py
def isControlCharOtherThanCRLF(code):
    if ord(code) == 13 or ord(code) == 10:
        return False
    return ord(code) < 32 

def comrelay(rcvd, srccom, dstcom):
    str1 = srccom.read()
    if len(str1) > 0 and isControlCharOtherThanCRLF(str1):
        print "rcvd:control char:" + str(ord(str1))
        dstcom.write(str1)
        return ".", True # new line = true
    if (len(str1) > 0):
        rcvd = rcvd + str1
    if "\n" in rcvd or "\r" in rcvd:
        print "rcvd=", rcvd
        dstcom.write(rcvd)
        return rcvd, True # new line = true

    return rcvd, False # new line = false
```
2016年2月15日朝からXcodeにてValidateやUploadでエラーになる

## 事象
>Missing iOS Distribution signing indentity for Name
Xcode can request one for you

とのエラーが表示され操作が完了しない。

## 原因
Apple WorldWide Developer Relations Certification Authority の有効期限が切れている。

## 対応
以下から新しい中間証明書をダウンロード。
https://developer.apple.com/certificationauthority/AppleWWDRCA.cer

新しい証明書をキーチェーンに入れたら 表示 > 有効期限が切れた証明書を表示 を選択。
**ログイン** および **システム** の中から有効期限切れとなった Apple WorldWide Developer Relations Certification Authority を削除。

この段階で問題は解決されているはず。

## 余談
有効期限切れとなった Apple WorldWide Developer Relations Certification Authority を削除するだけでも状態的には問題ない様子。一応新しい物を入れますが。

試行錯誤している最中は**ログイン**の中から期限切れの物を削除しエラーが出たままになり頭を抱えていたが、**システム**からも削除することで解決となった。

## 追記 (2017/04/13)
キーチェーンにWWDRが存在していない場合はXcodeにバンドルされているWWDRが使用される模様。
存在する場合は、そのWWDRの妥当性によって動作が変化する。
その為以下のようになる。

・キーチェーンにWWDRが存在しない
　→XcodeにバンドルされているWWDRが使用される

・キーチェーンに**有効**なWWDRが存在する
　→キーチェーンのWWDRが参照され、有効なため正常動作となる

・キーチェーンに**無効**なWWDRが存在する
　→キーチェーンのWWDRが参照され、無効なためエラーとなる
[Xcode7] ipaファイルを作成し、実機で動作確認

2015/2/16
目的：xcodeプロジェクトを実機でdegub用と、Release用の動作確認を行う

# プロジェクトのEditSchemeを設定する
1. Product->Scheme->Edit Scheme
2. EditSchemeが開く
3. Archive->Info->Build ConfigurationをDebug or Releaseに設定する(debug用か、Realse用を選択)
![スクショ.jpg](https://qiita-image-store.s3.amazonaws.com/0/100514/00430399-ae0a-7539-1bd9-9edccf9f561a.jpeg)
![スクリーンショット 2016-02-16 18.21.05.png](https://qiita-image-store.s3.amazonaws.com/0/100514/c39756de-74a8-051f-af96-8d5be00c08ea.png)

# Archiveを実行する
1. Archiveを作成する(XcodeのメニューProduct->Archive)

# xcodebuildコマンドを叩く
- 以下のコマンド実行

`xcodebuild -exportArchive -archivePath #{作成したArchiveファイルのパス} -exportProvisioningProfile #{Provisioning Profile名} -exportPath #{ipaの出力パス} -exportFormat ipa`

## オプション説明
**ArchivePath**

- Archiveで作成された.xcarchiveのパス
- OrgnaizerのArchiveのリストの上で"Show in Finder"で確認 
- ~/Library/Developer/Xcode/Archives

**exportProvisioningProfile**

- ProvisioningProfileの指定
- AppleDeveloperのMemberCenterで表示されている、ProvisioningProfile名

**exportPath**

- ipaの出力先
- 例：~/Desktop/test

**exportFormat**

- フォーマットの指定
- ipaかpkgを選択する。

:soccer: 

# 作成したipaファイルをiTunesに取り込む
- 作成したipaをダブルクリック
<img width="682" alt="スクリーンショット 2016-02-16 19.07.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/100514/1600f010-5a0a-0fb2-6e08-97126c434397.png">
- 取り込んだipaのインストールボタンを押す
- 最後に適用を行う
<img width="1238" alt="スクリーンショット 2016-02-16 19.08.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/100514/0178eff3-39f7-3afa-5b00-32c24a098419.png">

**再度入れなおす場合はその都度、実機アプリをアンインストールする**
:eggplant: 

要点だけ抜粋して書きましたが、Xcodeの基礎から詳しい情報はこの本がとてもよく書いてありました。
<a  href="http://www.amazon.co.jp/gp/product/4774170399/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4774170399&linkCode=as2&tag=adlove0715-22">最新iOSプログラミング徹底解説</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=adlove0715-22&l=as2&o=9&a=4774170399" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
FuelPHPのセッション管理

# 環境
FuelPHP:1.7.3

# 概要
FuelPHPでセッションを管理する方法がいつくつかあるのでメモしておく。FuelPHPは、デフォルトの場合、セッションをCookieで管理している。ちなみに、今回はあまり関係してこないが、FuelPHPは、PHPのセッション機能を使用せず独自の方法でセッションを管理している（Cookieに保存するセッションデータは暗号化されている）。

# 事前準備
「fuel/app/config」内に「session.php」が無い場合、「fuel/core/config/session.php」からコピーしてくる。

# Cookie以外のセッション管理方法
## Fileで管理

```diff:fuel/app/config/session.php
    // expire sooner because it's not updated when it's not used. note that auto-initializing always loads the default driver
    'auto_initialize'   => true,
 
    // if no session type is requested, use the default
-   'driver'            => 'cookie',
+   'driver'            => 'file',
 
    // check for an IP address match after loading the cookie (optional, default = false)
    'match_ip'          => false,
```

上記のように変更することでセッションがファイルで管理される。

## DBで管理

```diff:fuel/app/config/session.php
    // expire sooner because it's not updated when it's not used. note that auto-initializing always loads the default driver
    'auto_initialize'   => true,
 
    // if no session type is requested, use the default
-   'driver'            => 'cookie',
+   'driver'            => 'db',
 
    // check for an IP address match after loading the cookie (optional, default = false)
    'match_ip'          => false,
```

ファイルを上記のように変更し、

```shell-session:ターミナル.app
php oil r session:create
```

上記コマンドで、セッションを管理するためのテーブルを作成する。
以上でセッションがDBで管理されるようになる。

# 補足

```shell-session:ターミナル.app
php oil r session:create
```

上記コマンドで生成されるテーブル定義は以下の通り。

```sql
CREATE TABLE `sessions` (
  `session_id` varchar(40) NOT NULL,
  `previous_id` varchar(40) NOT NULL,
  `user_agent` text NOT NULL,
  `ip_hash` char(32) NOT NULL,
  `created` int(10) unsigned NOT NULL,
  `updated` int(10) unsigned NOT NULL,
  `payload` longtext NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
S3のcsvをRDSに取り込む(DataPipelineで)

AWSのData pipelineで簡単にS3のcsvをRDSに取り込めたのでめも。

##設定
AWSのDataPipelineダッシュボードから、create new pipeline押して以下の設定


![スクリーンショット 2016-02-16 4.13.20 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20307/a3e3b6e4-4997-c70a-308a-279c4553bf11.png)

- name: 適当に名前
- description: 適当
- source: load S3 data into RDS MySQL を選ぶ
- RDS MySQL pass: mysql pass
- input s3 file path: 取り込みたいcsvファイル
- insert sql query: インサートクエリ
  - INSERT INTO log_test (col1, col2, col3, col4) VALUES (?, ?, ?, ?);
  - valuesの後は"?"にしないと動かなかった。placeholderかな。
- RDS MySQL connection string: 接続先mysqlホスト情報 
  - 例: jdbc:mysql://hoge.fuga.ap-northeast-1.rds.amazonaws.com:3306/table_name
- scheduleは好きなように
- logging: enabledを強くおすすめ。ログ吐きたいs3ディレクトリ指定

10分くらい気長に待つとtableにcsvデータ入ってます。
python > test<CR><LF><ACK><NAK>test2<CR><LF>を処理する実装例

```txt:動作環境
Raspberry Pi2 + raspbian (python serialインストール済み)
Windows 7 pro 32bit
```

### やりたいこと

RS-232C通信で使われるcontrol characterを扱うpython実装の確認


### 接続形態

![](http://yuml.me/diagram/class/[Win7]RS232C-->[クロス], [クロス]RS232C-->[Pi2])

USBシリアルケーブルを2本使用

- Win側 > SRC06-USB (バッファロー)
- Pi2側 > USB-RS232 (TFTEC JAPAN)

通信速度は 9600 bps

### ソフト

- Windows側: [RS232Cテストツール](http://www.vector.co.jp/soft/winnt/hardware/se411276.html)
  - `<ACK>`や文字列を一緒に送信できる

### code

Pi2側のコードは以下を実装してみた

[github](https://github.com/yasokada/python-151113-lineMonitor/blob/master/toLearn/160216commPrintable.py)

```160216commPrintable.py
#!/usr/bin/env python

import serial
import time

def isControlCharOtherThanCRLF(code):
    if ord(code) == 13 or ord(code) == 10:
        return False
    return ord(code) < 32

def main():
    con=serial.Serial('/dev/ttyUSB0', 9600, timeout=10)
    rcvd=''
    while 1:
        code = con.read()
        if len(code) > 0:
            if isControlCharOtherThanCRLF(code):
                print "control char:" + str(ord(code))
            else:
                rcvd = rcvd + code
        if "\n" in rcvd or "\r" in rcvd:
            print rcvd,
            rcvd = ''
        
main()
```

### 結果

Win7側のRS232Cテストツールから以下の文字列を送信してみた。

```
test<CR><LF><ACK><NAK>test2<CR><LF>
```

Pi2側(上記コードを実行)では以下となった

```
test
control char:6
control char:21
test2
```
git cherry-pick はどうでもいいところでもすごかった

- branch A から git checkout -b B で branch B を作る。両方のheadのcommithashはaaaaaになっている。
- branch Bに対して、git commit -a -m --amend を実行し、branch BのHEADのcommithashがbbbbbに変わる。
- branch Aに対して git cherry-pick bbbbb --theirs を実行すると、aaaaaの上に、bbbbbとaaaaaの差分だけの新しいコミットcccccが追加されているっ！

上書きもなく、conflictもなく、ダメも言わない、できるかぎりの最善策をとってくれる。

git すげー！！賢い！

どうでもいいネタでした。
Google Chrome のアプリや拡張機能、テーマが保存されている場所

今回が初投稿です。よろしくお願いします。

Google Chrome の拡張機能がどこに保存されているのかをよく忘れてしまうのでメモっておきます。

# 拡張機能が保存されているディレクトリ
## Mac
`/Users/(ユーザ名)/Library/Application Support/Google/Chrome/Default/Extensions`
## Windows
`C:\Users\(ユーザ名)\AppData\Local\Google\Chrome\User Data\Default\Extensions`

今回は Mac を中心に説明します。

![ディレクトリ一覧](https://qiita-image-store.s3.amazonaws.com/0/113895/187f294d-4f77-f32a-3128-1ac90d39ac07.png)

上記のパスにアクセスしてその中身を表示するとズラッとディレクトリが出てきます。一つ一つのディレクトリが一つの拡張機能に対応していて、それぞれの拡張機能の ID がそのままディレクトリ名(長ったらしい文字列)になっています。

調べたい拡張機能があればそのディレクトリにアクセスしてソースコードや画像などを見ることができます。しかしこれだとどのディレクトリにどの拡張機能のコードが入っているかわかりません。なので調べたい拡張機能の ID をまず調べます。

# 拡張機能の ID の調べ方
Chrome Web Store で調べたい拡張機能のページに移動します。Chrome Web Store にアクセスしてから拡張機能を検索する方法もありますが、インストール済みの拡張機能なので、拡張機能のページ(chrome://extensions)から拡張機能の`詳細`をクリックするか`デベロッパーのウェブサイト`をクリックすれば一発で移動できます(拡張機能によって Chrome Web Store へのリンクが異なります)。

![拡張機能IDの取得.png](https://qiita-image-store.s3.amazonaws.com/0/113895/877bb5cf-58b2-05bc-8e74-a4aeca45f00e.png)

Chrome Web Store に移動するとこのようなページに来ます。今回は例として Google ドキュメントの ID を調べます。このページの URL を見ると、`https://chrome.google.com/webstore/detail/google-docs/aohghmighlieiainnegkcijnfilokake` となっていて、この URL の一番最後のパス、今回でいう `aohghmighlieiainnegkcijnfilokake` が拡張機能のパスになります。

あとは、この ID と一致するディレクトリ名を探せば拡張機能のソースコードや画像を見ることができます！

# どういうときに使うのか？
自分は趣味で Chrome の拡張機能を作っているのですが、他の方が作った拡張機能で実装されている機能をどう実現するのかをネットで調べてもよくわからないときにその拡張機能のコードを見て参考にさせていただいていたりします。

また、Google Chrome ではテーマは一つしか適用されません。つまり、新しいテーマを適用すると、前のテーマは削除されてしまいます(ローカルからも削除されてしまいます)。なので、新しいテーマを適用する前に前のテーマのコードや画像を別の場所に保管しておけば、前のテーマが何だったか忘れてしまっても前のテーマに戻すことができます。

# まとめ
はじめての投稿なのでまだよくわかりませんがこんな感じでよいのでしょうか…?
もし質問やこうしたほうが良いなどがありましたらコメントくださるとうれしいです！
jQuery Validation Pluginを使用した時、フォームが検証済みになった時にボタンを有効にする

### バリデーションが通ったら送信ボタンを有効にする
jQueryのValidationプラグインには、これを設定するところはないので、自分で書く必要があるみたいです。

```js:script
$('input,textarea').on('keyup blur', function() {
    var $submitBtn = $('button[type=submit]');
    if ($("#myform").valid()) {
        $submitBtn.prop('disabled', false);  
    } else {
        $submitBtn.prop('disabled', 'disabled');
    }
});
```


### 完成コード

```html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Activate button if a form is valid.</title>
</head>
<body>
<form id="myform">
<p><input type="text" id="field" name="name" placeholder="おなまえ"></p>
<p><textarea name="comment" placeholder="コメント"></textarea></p>
<p><button type="submit" disabled="disabled">送信</button></p>
</form>
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="http://jqueryvalidation.org/files/dist/jquery.validate.min.js"></script>
<script>
$( "#myform" ).submit(function(e){
    e.preventDefault();
}).validate({
  submitHandler: function(form){
    form.submit();
  },
  rules: {
    name: {
      required: true,
      rangelength: [2, 10]
    },
    comment :{
        required: true,
    }
  }
});
$('input,textarea').on('keyup blur', function() {
    var $submitBtn = $('button[type=submit]');
    if ($("#myform").valid()) {
        $submitBtn.prop('disabled', false);  
    } else {
        $submitBtn.prop('disabled', 'disabled');
    }
});
</script>
</body>
</html>
```
[PHP]yumでPHP7をインストールする

# 準備

**リポジトリの追加**

PHPに特化したリポジトリがあるので、それを追加
https://webtatic.com/

**CentOS/RHEL 6.x:**
CentOS6.5にインストールするのを想定

```
$ sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
$ sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
```

# インストール
必要なパッケージを選んでインストール
https://webtatic.com/packages/php70/
上記ページの「Package」参照

```
$ sudo yum -y install php70w php70w-devel php70w-mcrypt php70w-mbstring php70w-mysqlnd php70w-pdo php70w-common php70w-xml php70w-opcache php70w-gd
```

# 確認

```
$ php -v
HP 7.0.3 (cli) (built: Feb  4 2016 21:15:42) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
```
Markdownで書けるSphinxの構築

# 背景

SphinxはPythonの各種ライブラリを始め様々なところで使用されているオープンソースのドキュメントシステムです。SphinxではreStructuredTextという軽量のマークアップ言語でドキュメントを記述しますが、今ではGitHubやQiitaなどのサービスに普及もあってMarkdownの方に慣れてしまっています[^使用感]。

そこでSphinxでもMarkdownで書ける環境を構築したいと思います。
[recommonmark](https://github.com/rtfd/recommonmark)というSphinxの拡張を使用します。

# 手順

virtualenvwrapperが使えるpython環境前提としています。

## 環境準備

```bash
$ mkvirtualenv sphinx
$ pip install sphinx recommonmark
```

## プロジェクト生成

```bash
$ sphinx-quickstart 
```

## 設定

conf.pyに以下の記述を追加します。

```py
from recommonmark.parser import CommonMarkParser

source_parsers = {
    '.md': CommonMarkParser,
}

source_suffix = ['.rst', '.md']
```

後は拡張子を`.md`にしてドキュメントを書けば自動的にMarkdownとしてコンパイルされます。

[^使用感]: あくまで個人的感想ですけど。。。
リポジトリの言語割合にドキュメントを含めないようにする方法

GitHubには各リポジトリがどういった言語で構成されているのかを表示する機能がある（↓こういうの）

![スクリーンショット 2016-02-16 17.31.03.png](https://qiita-image-store.s3.amazonaws.com/0/153/19041396-f1fe-f297-2cf8-ccef1efc4783.png)

デフォルトでGitHubがいい感じにしてくれるが、標準から外れたディレクトリ構成になっていると、意図しない感じになったりすることがある。具体的には、標準とは違う場所に

- 依存ライブラリが直接置かれている
- ドキュメントが書かれている

と言語の割合が狂う。例えば、↑の画像で引用したリポジトリではJavaScriptのモジュールを作っているが、標準とは少し違う場所にドキュメントを置いている都合で、意図せずCSSやHTMLが合算されてしまっている。気にしなければいいという話ではあるのだが、どうしても気持ち悪い場合はリポジトリルートに .gitattributes というファイルを用意して

```
special-vendored-path/* linguist-vendored
project-docs/* linguist-documentation
```

みたいにすることで解決することができる。こうすると special-vendored-path に入っているファイルは言語割合に含まれないだけでなく、GitHub上のdiffも閉じられる。 project-docs に入っているファイルは、単に言語割合に含まれなくなる。

そんな感じで設定したら無事にJavaScript 100%にすることができた。

![スクリーンショット 2016-02-16 17.36.34.png](https://qiita-image-store.s3.amazonaws.com/0/153/246001ca-a990-406b-46c5-99c2c4c4ecee.png)

## 参照

- https://github.com/github/linguist

    GitHubは言語割合機能をこのlinguist gemを使って実現しており、この記事で書いたことは全てREADMEに書いてある。

- https://github.com/yuku-t/textcomplete

    今回問題になっているリポジトリ
MeCab について（その２）「でも」は難しい [分割②]

MeCab の出力を学校文法に適合させる為に副助詞「でも」を分割している箇所がもう１つあります。
<hr>
それは、体言に続いて格助詞「で」＋並立の副助詞「も」が続くべきケースです。
副助詞「でも」→格助詞「で」＋並立の副助詞「も」に分割しています。
<hr>
<b>まとめ</b>

連結部分も列挙しようかと思ってましたが、飽きたのでやめます。
必要に応じて<a href="https://github.com/tmatsugaki/iPhone-libmecab">ソースコード</a>を見てください。
python > codeがprintableかどうかのチェック > ord()使用 / all(c in string.printable for c in hello)

RS-232C通信のコードが`<ACK>`などのコントロールキャラクタであるか、`G`などのprintableなものであるかの確認をしたい。

参考 http://python.civic-apps.com/char-ord/


以下を実装してみた。

http://ideone.com/XKsbnY

```checkCode.py
def	checkCode(code):
	if ord(code) < 32:
		print "not printable"
		
	if ord(code) >= 32:
		print "printable:", code	


code = chr(6) # <ACK>
checkCode(code)

code = chr(71) # G
checkCode(code)
```

```txt:結果
Success	time: 0.01 memory: 8968 signal:0
not printable
printable: G
```

http://stackoverflow.com/questions/3636928/test-if-a-python-string-is-printable
によると以下のような書き方もあるらしい。

```
>>> import string
>>> all(c in string.printable for c in hello)
True
```
世間に流通しているnokogiriのインストールで怒られた時の対処が古い

# 公式の対処法を見るべし
[Installing Nokogiri](http://www.nokogiri.org/tutorials/installing_nokogiri.html)

githubにも

>There are currently 1,237 Stack Overflow questions about Nokogiri installation.
>The vast majority of them are out of date and therefore incorrect. **Please do not use Stack Overflow.**

って書いてあるように

`bundle config build.nokogiri --use-system-libraries` ←これダメ！

ググるとあふれ出るこの対処はもう古いです。

**[ココ](http://www.nokogiri.org/tutorials/installing_nokogiri.html)**に行って対処するとスッと解決します。
(大事なことなので２回言いましたよ)
PHP:連想配列をキーでグループ化する


例えば、こういう食べ物の連想配列を

```php
<?php
$foods = [
	['name' => 'Apple', 'category' => 'fruits'],
	['name' => 'Strawberry', 'category' => 'fruits'],
	['name' => 'Tomato', 'category' => 'vegetables'],
	['name' => 'Carot', 'category' => 'vegetables'],
	['name' => 'water', 'category' => 'drink'],
	['name' => 'beer', 'category' => 'drink'],
];
?>
```

カテゴリごとにグループ化して、こんな感じにしたい:

```php
<?php
$expected = [
	'fruits' => [
		['name' => 'Apple', 'category' => 'fruits'],
		['name' => 'Strawberry', 'category' => 'fruits'],
	],
	'vegetables' => [
		['name' => 'Tomato', 'category' => 'vegetables'],
		['name' => 'Carot', 'category' => 'vegetables'],
	],
	'drink' => [
		['name' => 'water', 'category' => 'drink'],
		['name' => 'beer', 'category' => 'drink'],
	],
];
?>
```

## 実装案1: foreachを使ったよくある実装

```php
<?php

function array_group_by(array $items, $keyName)
{
	$groups = [];
	foreach ($items as $item) {
		$key = $item[$keyName];
		if (array_key_exists($key, $groups)) {
			$groups[$key][] = $item;
		} else {
			$groups[$key] = [$item];
		}
	}
	return $groups;
}

assert(array_group_by($foods, 'category') === $expected);
?>
```

更に短縮すると:

```php
function group_by(array $table, string $key): array
{
	$groups = [];
	foreach ($table as $row) {
		$groups[$row[$key]][] = $row;
	}
	return $groups;
}
```

## 実装案2: イミュータブル風

```php
<?php

function array_group_by2(array $items, $keyName)
{
	$keys = array_unique(array_column($items, $keyName));
	return array_combine($keys, array_map(function($key) use ($items, $keyName) {
		return array_values(array_filter($items, function ($item) use ($key, $keyName) {
			return $item[$keyName] == $key;
		}));
	}, $keys));
}

assert(array_group_by2($foods, 'category') === $expected);
?>
```

変数スコープとコレクションのAPI、辛すぎ・・・。やはりPHPは`foreach`を使うが良さそう。

## 実装案3: 先に入れ物を作ってforeachでミューテート

```php
<?php

function array_group_by3(array $items, $keyName)
{
	$groups = array_fill_keys(array_column($items, $keyName), []);
	foreach ($items as $item) {
		$groups[$item[$keyName]][] = $item;
	}
	return $groups;
}

assert(array_group_by3($foods, 'category') === $expected);
?>
```

実装案1と比べて、if-elseが無くなった。まずまずと言った感じ・・・？

## 実装案4: array_reduce

```php
function group_by(array $table, string $key): array
{
	return array_reduce($table, function (array $groups, array $row) use ($key) {
		$groups[$row[$key]][] = $row;
		return $groups;
	}, []);
}
```
requirements.txtの書き方注意点

BluemixでPython触ってて、ちょっと躓いたので、かいとく。

これだと落ちて...

```py
web.py
cloudant
numpy
scipy
scikit-learn
```

これだと大丈夫。

```py
web.py
cloudant
scikit-learn
scipy
numpy
```

あぁ...、逆順でsetup.pyが走っていくんだね(；´Д｀)
SELECTタグのアピアランスを、何がなんでもCSSだけでどうにかしたいあなたへ


ググるとラッパーを使うものほか、色々出てくるのですが、`<select>`単体だと`:after`擬似要素が使えなかったりと、難敵でした。ただ、時代は進んでSVGネイティブサポート時代。画像ファイルでなしに、SVGを埋め込めばいいじゃないか。

## SVGで三角を描く

SVGでシンプルなキャレットを描くとこんな感じ。かなり短いコードで書けます。[JSFiddleで試す](https://jsfiddle.net/cognitom/7v50n7Lu/)

```svg
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="5">
  <path d="M0,0 10,0 5,5z" fill="black" />
</svg>
```

## CSSに埋め込む

これをCSSの中で表記すれば、`<select>`要素のアピアランスをシンプルにコントロールできそう。というか、できた → [JSFiddleで試す](https://jsfiddle.net/cognitom/3ub3wp8a/)

```css
select {
  /* removes default appearance of select */
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  
  padding: .5em 22px .5em .5em;
  border-radius: 0;
  background-position: right;
  background-repeat: no-repeat;
  
  /* adds triangle image as a background  */
  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="18" height="5"><path d="M0,0 10,0 5,5z" fill="black" /></svg>');
}

select[disabled] {
  /* same image but gray */
  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="18" height="5"><path d="M0,0 10,0 5,5z" fill="gray" /></svg>');
}
```

以上。
Solr 5.4でインデックスのレストア

レストアAPIの使い方で微妙につまずいたのでメモ。

# 使い方

公式サイトのドキュメントをよく読めばよかったのですが、nameの指定がちょっと注意です。
https://cwiki.apache.org/confluence/display/solr/Making+and+Restoring+Backups+of+SolrCores

6.3でURL変更
https://cwiki.apache.org/confluence/display/solr/Making+and+Restoring+Backups

Backup APIで`snapshot.20160216120000`という、スナップショットができたとします。
最初は、`name=snapshot.20160216120000`と指定していたのですが、これだとうまくいかず。
ログを見ると、`snapshot.snapshot.20160216120000`にインデックスがありませんというエラーがでる。

つまり、`snapshot.<name>`の<name>を指定するということですね。Backup APIでもそこの箇所が指定できるとあったので、冷静に考えればそういうことだと・・・

# 結論

`
curl "http://localhost:8983/solr/core1/replication?command=restore&name=20160216120000"
`

という感じでOK。

# 蛇足

backup,restoreともに、locationでスナップショットがあるディレクトリを絶対パス・相対パスで指定できます。

backupの方はlocation=/backupとしたら、そういった形でログがでるのですが、restoreの方は`snapshot.20160216120000 //backup` という風に表示されるという。GETメソッドでもparamsのところでは/backupと表示されているので、そこのログメッセージの表示の仕方が問題かな。
【Unity備忘録】2^nでないテクスチャをインポートさせたときにサイズが変わらないようにする

#問題
Unityでテクスチャをロードさせると勝手にサイズが変わってしまう

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/0b7b76b3-8f42-aa7b-b5ae-d8d6b134e568.png)
↑ 87 x 78
↓ 64 x 64
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/dc7a9d44-0cd0-b662-c29c-cfbb3f2f8c43.png)

#サイズが変わらないようにする
import settings の設定を変更することで対処できます。手順は以下の通り。
1) "Texture Type"を Advancedにする
2) "Non Power of 2"をNoneにする
3) Applyを押す
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/7b461ba8-18ed-9664-97d6-3f16a789c588.png)

これで元の画像サイズが保たれるようになります
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/47967313-2daf-50fc-62fb-7abeab6d7172.png)
CollectionUtilsのとっても簡単なサンプル(Java8版)

前回、Apache Commons Collectionsのサンプルを記載しましたが、
これってJava8だと全然違うんじゃないか？と思ったので、Java8でどうなるのかやってみました。

~~[Apache Commons Collections 4.1 API](https://commons.apache.org/proper/commons-collections/javadocs/api-release/index.html)~~

```java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import lombok.AllArgsConstructor;
import lombok.Data;

/** サンプルクラス */
public class CommonsCollectionsSample8 {
  /** 人物クラス */
  @AllArgsConstructor
  @Data
  class Person {
    /** ID */
    private int id;
    /** 名前 */
    private String name;
    /** グループ */
    private int group;
  }

  /** サンプル */
  public void sample() {
    // 人物リスト
    List<Person> list = Arrays.asList(
        new Person(1, "a", 1),
        new Person(2, "b", 1),
        new Person(3, "c", 2),
        new Person(4, "d", 2),
        new Person(5, "e", 2));

    // 全て出力
    list.stream().forEach(person -> System.out.println(person.toString()));

    System.out.println("----------");

    // 名前リストを作る
    List<String> nameList = list.stream()
      .map(person -> person.getName())
      .collect(Collectors.toList());

    // 全て出力
    nameList.stream().forEach(name -> System.out.println(name));
    System.out.println("----------");

    // グループ1だけに絞る
    // 全て出力
    list.stream()
      .filter(person -> person.getGroup() == 1)
      .forEach(person -> System.out.println(person.toString()));
  }

  public static void main(String[] args) {
    new CommonsCollectionsSample8() {
      {
        sample();
      }
    };
  }
}
```

実行結果は下記の通りです。
前回と変わっていません。

```
CommonsCollectionsSample8.Person(id=1, name=a, group=1)
CommonsCollectionsSample8.Person(id=2, name=b, group=1)
CommonsCollectionsSample8.Person(id=3, name=c, group=2)
CommonsCollectionsSample8.Person(id=4, name=d, group=2)
CommonsCollectionsSample8.Person(id=5, name=e, group=2)
----------
a
b
c
d
e
----------
CommonsCollectionsSample8.Person(id=1, name=a, group=1)
CommonsCollectionsSample8.Person(id=2, name=b, group=1)
```

コードがずいぶんすっきりしました。
~~そして、CollectionUtilsのサンプルだったはずなのに、ほぼなくなっちゃいました。(A^^;~~

~~collectメソッドもなくしちゃいたかったんですが、~~
~~さらりと見ただけでは良く分からなかったので、次回の宿題にしたいと思います。~~

2018/7/5 修正
CollectionUtilsを完全に取り除きました。
cron と anacron の比較

# cron と anacron の比較

## cron の特徴
* 指定したスケジュール(日時・曜日・時・分の粒度で時間を指定)にジョブを実行する
* 指定した時刻に実行できなかった場合、次回の指定時刻まで待つ必要がある。
* /etc/crontab, /etc/crond 以下のファイル、各ユーザのcrontabファイルなど、様々なジョブの指定方法があり、誰でも設定できる。
* crondプロセスが常駐してジョブを実行する。

## anacron の特徴
* 指定したスケジュールにランダムな遅延を挿入してジョブを実行する。
* 指定した時刻に実行できなかった場合、実行できなかったジョブを再実行する機能がある。
* /etc/anacrontab でのみジョブの指定が可能で、rootユーザでしか設定できない。
* デーモンプロセスは存在しない。

# 両者の使い分け
anacron は、ランダムな遅延を挿入するため、複数のサーバで同時に実行したくない場合に使うと良いと考えられる。例えば、複数のサーバでログを収集し、1つのサーバに集約したり、負荷の高いサービスを複数サーバで提供していたりする場合などである。

しかし、同時に実行しないのが感覚的に気持ち悪かったりするので、基本的には cron で良いような…気がする…。
Rails | enums で 値を上書きする前の id を得る方法

# 解決

メソッドではなく。ハッシュを使う。

```rb
person[:gender] # => 0
```

# 問題

たとえば、こういうモデルがある場合。

```rb
class Person < ActiveRecord::Base
  enum gender: { male: 0, female: 1 }
end
```

enum はオリジナルのメソッドを書き換えるので。
0 とか 1 とかの元の値は取れなくなってしまう。

```rb
person = Person.first

person.gender # => "male"
```

解決は冒頭のとおり。


# 環境

- Rails 4.2.5



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
[git] ブランチまとめ

どうも、Git初心者です
add, commit, pushとかはできるようになりましたが、branch周りは毎回ググってて時間の無駄に感じたので自分メモにまとめます

ですので、QiitaのくせにQiitaらしくない記事になると思いますが、よろしくお願いします

# ブランチの確認
`git branch`
`*`は現在地を表す
# ブランチの作成
`git branch new`
newというブランチが作成される
# ブランチの切り替え
`git checkout new`
newというブランチに切り替わる
# ブランチの作成&切り替え
`git checkout -b new`
`git branch new`、`git checkout new`を順に行ったものと同じ
# ブランチのマージ
`git merge new`
現在いるブランチにnewがマージされる
# ブランチの削除
`git branch -d new`
new というブランチが削除される
vagrantでCentOS(linux)投入してPHPインストール

#vagrant インストール後

```:vagrant
$vagrant box add app(フォルダー名) http://puppet-vagrant-boxes.puppetlabs.com/centos-65-x64-virtualbox-nocm.box
...
インストール終了後

$cd app(フォルダー名)
$vagrant init
$vi Vagrantfile
```

#ファイル修正

```:Vagrantfile

[WINDOWS用]
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.synced_folder "C:\フォルダーパス", "/var/www/html", :create => true, :owner => 'vagrant', :group => 'vagrant', :mount_options => ['dmode=755,fmode=664']

[MAC用]
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.synced_folder "~/フォルダーパス", "/var/www/html", :create => true, :owner => 'vagrant', :group => 'vagrant', :mount_options => ['dmode=755,fmode=664']
```


```:vagrant
$vagrant up
```

#SSH接続

[WINDOWS]
SSH接続プログラム使用

[MAC]

```:vagrant
$vagrant ssh
```

#linux接続

```:linux
#sudo su -
vagrant(初期パスワード、もしパスワードを聞くなら)

#yum upgrade -y
...

#yum install mysql mysql-server mysql-devel httpd php php-devel php-pdo php-mbstring php-mcrypt php-mysql php-xml -y
...

#chkconfig httpd on
#chkconfig mysqld on
```

```:linux
各項目を修正
#vi /etc/httpd/conf/httpd.conf
```

```:/etc/httpd/conf/httpd.conf

#ServerTokens OS
ServerTokens ProductOnly

#Options Indexes FollowSymLinks
Options -Indexes FollowSymLinks

#AllowOverride None
AllowOverride All

#ServerSignature On
ServerSignature Off

#User aphache
User vagrant

#Group aphache
Group vagrant


最下部に追加
FileEtag None
RequestHeader unset If-Modified-Since
Header set Cache-Control no-store

EnableMMAP Off
EnableSendfile Off


<こちらはsymfony用なので特に修正する必要はありません>
#DocumentRoot "/var/www/html"
DocumentRoot "/var/www/html/web"

#<Directory "/var/www/html">
<Directory "/var/www/html/web">

:wq

```

```:linux
httpd起動
#service httpd start

#vi /etc/my.cnf
```

```:/etc/my.cnf
次をファイルに追加
[mysqld]
character-set-server=utf8
skip-character-set-client-handshake

[client]
default-character-set=utf8
```

```:linux
各項目を修正
#vi /etc/php.ini
```

```:/etc/php.ini
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_output = UTF-8

#expose_php = On
expose_php = Off

date.timezone = Asia/Tokyo
```

```:linux
サーバー再起動
#service httpd restart
#service mysqld start
```

```:linux
mysql接続
#mysql -u root
```

```:mysql
>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION;
FLUSH PRIVILEGES;
```

完了。
今更ながらよく使うrake dbコマンドをまとめる


# めんどくさいので完全にリセット

```
rake db:destory:all
rake db:create:all
rake db:migrate
```

# ENVを指定

```
rake db:create RAILS_ENV=test
```


# 〇〇こだけmigrateをやりなおし

```
rake db:migrate:redo STEP=1
```


# migrateだけやりなおし
```
rake db:migrate:reset
```


# バージョンを指定してmigrate

```
rake db:migrate version=20160118064441
```
macにredisをインストール

# インストール

iodocsというツールを検証するためにredisが必要だったのでインストールしたときのメモ。
homebrewを使います。

```
$ brew install redis
==> Downloading https://homebrew.bintray.com/bottles/redis-3.0.7.el_capitan.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring redis-3.0.7.el_capitan.bottle.1.tar.gz
==> Caveats
To have launchd start redis at login:
  mkdir -p ~/Library/LaunchAgents
  ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
Then to load redis now:
  launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
Or, if you don't want/need launchctl, you can just run:
  redis-server /usr/local/etc/redis.conf
==> Summary
🍺  /usr/local/Cellar/redis/3.0.7: 9 files, 876.3K
```

動作確認

```
$ redis-server -v
Redis server v=3.0.7 sha=00000000:0 malloc=libc bits=64 build=aa27a151289c9b98
```

# 起動・停止など

* 起動

```
$ redis-server
```

* クライアントツール起動

```
$ redis-cli
127.0.0.1:6379>
```

* 停止

redis-cli起動中に

```
127.0.0.1:6379> shutdown
```

もしくは下記コマンドを直接実行

```
$ redis-cli shutdown
```

# データの登録

```
$ redis-cli
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
```
[C++11] Sort with Lambda

A very sample way:

```cpp
sort(a.begin(), a.end(), [](int x, int y) { return x > y; });
```

Sort according another vector

```cpp
//sort array
vector<int> idx(n);
for (int i = 0; i < n; ++i) idx[i] = i;

// vector<int> a; another vector
sort(idx.begin(), idx.end(), [a](int i, int j) -> bool { return a[i] < a[j]; });
```

Sort struct or class

```cpp
struct Node {
    int id;
    string name;
};

sort(nodes.begin(), nodes.end(), [](const Node & a, const Node & b) { return a.id > b.id; });
```
一文字エイリアスはいいぞ！

一日に何十回もやる作業にかかる労力は最小にすべきだ、ということでいくつかのコマンドを一文字エイリアスにしてるので紹介してみます。

| 一文字 | 元のコマンド | 説明 |
|:-----------|:------------|:------------:|
| `g` | `git`  | サブコマンドについては後述。 |
| `s` | `git status --short --branch` | めちゃくちゃよく使う。何か変更する度、ほぼ習慣的に打っている |
| `d` | `git diff` | `s`はサマリ、`d`は詳細って感じで使い分けている |
| `m` | `git checkout master` | 実はこれも頻繁に実行しているコマンド |
| `t` | `tmux` | 実はこれは頻繁に実行していない |
| `b` | `bundle` | そこそこ頻度が高い |
| `r`| `repo`| 後述 |

実際の設定例は[こちら](https://github.com/fujimura/dotfiles/blob/4c7e19034cc78123b81d0ade2fb1f642e1fb9324/.zshrc#L21-L58)。


Gitのエイリアスも一文字がいくつかあります。

| 一文字 | 元のコマンド | 説明 |
|:-----------|:------------|:------------:|
|`l`|`log --decorate`|ログです|
|`f`|`fetch`|見ての通り|
|`g`|`grep --line-number --show-function --color --heading --break`|オプションの詳細は`man git-log`してくれ|

[設定例](https://github.com/fujimura/dotfiles/blob/4c7e19034cc78123b81d0ade2fb1f642e1fb9324/.gitconfig#L9-L28)

`r` はリポジトリのクローン、リポジトリへの移動、などが出来るコマンドです。[ghq](https://github.com/motemen/ghq)と[peco](https://github.com/peco/peco)を組み合わせて1年ちょっと前に作りました。補完が効き、移動先をインタラクティブに選べる。詳細はこちら http://qiita.com/fujimura/items/d9a48643a1071e9928ea

:bow: 皆さんの一文字エイリアスも教えてください :bow:
line monitor > はまった > 改良点: <CR>,<LF>終端文字列以外の扱い

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

自分の作成したラインモニタではまった。

現在のline monitorにおいては主に`<CR>`,`<LF>`で終端する文字列の通信を扱っている。コントロールキャラクタ単独などのコード(例`<ACK>`, `<NAK>`など)については正しく処理をしていなかった。

そのため、`<ACK>`などのコードを通信するソフトのモニタ時に通信そのものが正常に行われなくなり、動作がおかしくなってしまった。

そしてそれに気づくまで時間を30分ばかり取られた。

### 改良点

- `<CR>`,`<LF>`以外のコントロールキャラクタも瞬時に転送するようにする

この改良点は結構早めに対応したい気がする。

[utilComRelay](https://github.com/yasokada/python-151113-lineMonitor/blob/master/utilComRelay.py)
の以下の部分を変更しないといけない。

```utilComRelay.py
def comrelay(rcvd, srccom, dstcom):
    str1 = srccom.read()
    if (len(str1) > 0):
        rcvd = rcvd + str1
    if "\n" in rcvd or "\r" in rcvd:
        print "rcvd=", rcvd
        dstcom.write(rcvd)
        return rcvd, True # new line = true

    return rcvd, False # new line = false
```
nodebrewでnode.jsのバージョン切り替え

# nodebrewとは

node.jsのバージョン管理ツール。
複数バージョンを切り替えて使うことができる。
他にも`nvm`や`nbenv`がある。

`npm`はnodeのモジュール管理ツール。

# インストールの前に

既にnodeがインストール済みの場合、アンインストールする必要がある。

### homebrewでインストールした場合

```
$ brew uninstall node
```

### pkgでインストールした場合

* 下記のスクリプトをファイルなりに記載して実行する

```
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
```

* npmコマンドでインストールしたグローバルモジュールも削除

```
$ sudo rm -rf ~/.npm
```


# nodebrewインストール

下記のコマンド１行でインストールできる。

```
$ curl -L git.io/nodebrew | perl - setup
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:03 --:--:--     0
100 23752  100 23752    0     0   4928      0  0:00:04  0:00:04 --:--:-- 29072
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

* 画面出力に従ってパスを追加

環境によって、`.zshrc`なり`.bashrc`にパスを追加する

```
$ vi ~/.zshrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

* 動作確認

```
$ source ~/.zshrc
$ nodebrew help
```

# node.jsインストール

```shell-session:最新版をインストール
$ nodebrew install latest
```

```shell-session:安定版をインストール
$ nodebrew install stable
```

```shell-session:バージョン指定でインストール
$ nodebrew install v0.11.13
```

* 使うバージョンを指定

```shell-session:latest
$ nodebrew use latest
```

```shell-session:stable
$ nodebrew use stable
```

```shell-session:バージョン指定
$ nodebrew use v0.11.13
```

* バージョン確認

```shell-session:
$ node -v
$ npm -v
```
jQueryでタブ切り替え

#仕様
ごく普通のタブ。
#HTML
targetとtriggerにデータ属性を付与。

```html:HTML
<ul>
  <li data-tab-trigger='tab'>kuma</li>
  <li data-tab-trigger='tab'>tama</li>
  <li data-tab-trigger='tab'>kiso</li>
</ul>
<ul>
  <li data-tab-target='tab'>球磨だクマー</li>
  <li data-tab-target='tab'>多摩だニャー</li>
  <li data-tab-target='tab'>木曽だキソー</li>
</ul>
```
#JS
引数でロード時にアクティブになるタブを何番目にするか指定。
(0からカウントが始まるので注意）

```js:JQuery
var tabSwitch = function(active_num){
	var $trigger = $('[data-trigger-tab]'),
		$target  = $('[data-target-tab]'),
		$active;
	if(!$target.length) return;
	$target.addClass('is_Disable');
	$target.eq(active_num).removeClass('is_Disable');
	$trigger.eq(active_num).addClass('is_active');
	$trigger.on('click',function(){
		var num = $(this).index(),
			$active = $('.is_active'),
			hide_num = $active.index();
		$active.removeClass('is_active_tab');
		$target.eq(hide_num).addClass('is_Disable');
		$target.eq(num).removeClass('is_Disable');
		$trigger.eq(num).addClass('is_active');
	})
};
$(function(){
    tabswitch(0);
});
```
#CSS
```css:css
.is_Disable {
  display:none;
}
```
WebAPI覚え書き

##WebAPIとは
・HTTPプロトコルを利用してネットワーク越しに呼び出すAPI
・URIによって指定
・サーバ側の情報を書き換えたり、サーバ側に置かれた情報を取得できたりする
・ブラウザを使って人間が直接アクセスすることを目的としていない

##WebAPIの例
ProgrammableWebを参照
(http://www.programmableweb.com/category)

##WebAPIの利点
1.これまでは、サービスに組み込むために独自に用意する必要があったものが、Web APIを通じて利用可能な単体のサービスとして提供できる。
(IaaS、BaaS(Backend as a Service)、DaaS(Data Storage as a Service))
自前で運用するよりもコストが割安。

2.全く思いつきもしなかった発想の機能を、他の誰かがAPIを利用して作ることがある。
「APIの公開は様々なサービスが相互に連携しつつ形成するサービスのエコシステムのなかで、"接着剤"の働きをする」

3.「直接販売」から「間接販売」へ
個々のサービスが自らのウェブサイトで直接サービスを行うモデル
↓
APIを提供し、それを複数組み合わせたアプリがユーザーにサービスを行うモデル
（直営店だけでなく、小売でサービスを提供する）

##WebAPIの弱み(?)
**サードパーティJavaScript**
ー他のページに貼り付ける目的で提供されるJavaScriptファイル
JavaScriptを使ってブラウザからアクセスされるAPIなので、クライアント側のコードは簡単に読める。→不正アクセス、なりすましが容易
（例えば、ソーシャルゲームでアイテムを不正に大量入手する等）

そもそも、データを盗もうとしている人は、APIを公開していようがいまいが盗もうとする。
自分たちでAPIを公開しないと逆に情報の取得をコントロールできなくなる。

##API経由ですべきこと(しなければならないこと）
1.ECサイト
商品の検索や購入、オススメ情報の取得
2.写真共有サイト
写真の投稿やタグ付け
3.SNSサイト
他のページに自分のサービスの情報や機能を貼り付ける仕組みを提供する場合
バックエンドとなるAPIを設計する必要がある

##RESTとWeb API
「REST API」という言葉の使われ方について
###RESTとは、Webのアーキテクチャスタイル

アーキテクチャスタイルの例
・MVC（Model-View-Controller)
・パイプ&フィルタ(Pipe and Filter)
・イベントシステム(Event System)
など

|設計粒度|設計|設計の抽象化|
|:----------|:-----------|:------------|:------------|
|小|デザイン|デザインパターン||
|大|アーキテクチャ　|アーキテクチャスタイル(アーキテクチャ設計の指針、作法、流儀)|

|抽象化レベル|Webでの例|
|:-----------|:------------|
| アーキテクチャスタイル      |REST |
| アーキテクチャ     |ブラウザ、サーバ、プロキシ、HTTP、URI、HTML |
| 実装      |Apache、Firefox、Internet Explorer  |


###RESTの異なる定義
・Fielding※1のRESTアーキテクチャスタイルの原則に合わせたWebサービスシステム。
・RPCスタイルに合わせた簡易な XML(またはJSONなど）+HTTP インターフェイスを採用したシステム(SOAP※2は使わない) 。
( https://ja.wikipedia.org/wiki/REST より引用)
※1 HTTPプロトコル規格の主要著者の一人
※2 XML Webサービスのための、XMLベースのRPCプロトコル

「REST API」という言葉の使われ方は、２番目の意味で用いられる。


##最後に
Webサービス（人間用のインタフェース）もWebAPI（プログラム用のインタフェース）も同じWeb技術を使ったインタフェースであり、Web上にあるリソースである。

サービスを公開したら、APIも当然公開するよねー
ピュアCSSによる切り替え可能なタブ

CSS3から `:target` セレクタが導入され、ターゲット（URL末尾の `#hogehoge`）のIDを持つ要素を選択できるようになりました。`:target`セレクタを使うと、簡単なタブ切り替えが実装できます。

今回は次のようなタブを作りたいと思います。完成品は[こちら](http://codepen.io/ueokande/pen/VeRBvr)から。ピュアCSSのみでタブの切り替えもできます。

![css_tab.png](https://qiita-image-store.s3.amazonaws.com/0/102667/3756a374-741f-57e4-ab0e-4491ba4d51ab.png)

<i class='fa fa-html5'></i> HTML
----

タブの各アイテムは`<nav>`タグ内に存在し、各タブのリンク先は `href='#******'`で指定します。現在の状態はURLが持ちます。タブ内のコンテンツは、`.content` クラスが指定された `<div>` で記述し、各ターゲットに対応したIDをそれぞれの要素が持ちます。

```html:html
<nav>
  <a href='#home'>Home</a>
  <a href='#about'>About</a>
  <a href='#members'>Members</a>
  <a href='#links'>Links</a>
</nav>

<div id='home' class='content'>Home here</div>
<div id='about' class='content'>About here</div>
<div id='members' class='content'>Members here</div>
<div id='links' class='content'>Links here</div>
```
<i class='fa fa-css3'></i> CSS
----

タブの内容の要素にCSSを適用するだけで、タブ切り替えができます。大事なところだけ抜粋するので、細かいスタイルの指定は、[サンプル](http://codepen.io/ueokande/pen/VeRBvr)を参照して下さい。

タブ内容の`.content`はデフォルトで`display:none`して隠します。そしてURLで指定された要素 `.content:target` のみ、`display: block` で表示します。ターゲットは`<a>`リンクで変更されるので、タブのアイテムをクリックするとタブの内容が切り替わるというカラクリです。

```css:css
.content {
  display: none;
}

.content:target {
  display: block;
}
```

おわりに
----
`:target`セレクタを使ってタブができましたが、スクロールが発生したりといまいちです。タブの実装は別の手段のほうが良いかもしれませんね。`<input type='radio'>`でもできそうと思って調べてみたら、[先人達](https://www.google.co.jp/search?q=tab+css+radio)が既に実装していました。

CSS-TRICKSに`:target`を使った[別のサンプル](https://css-tricks.com/examples/Target/)がありました。こちらのほが `:target` の正しい使い方かもしれませんね。