OmniAICreator/Qiita-1.07M huggingface dataset:
validates_email_format_of を使った email バリデーション


Eメールアドレスのバリデーションは多くのgemがあると思いますが今回は

[validates_email_format_of](https://github.com/validates-email-format-of/validates_email_format_of)

を使った方法で試しました．

RFC 2822 と RFC 3696 に準拠したバリデーションをしているようです．



## インストール

Gemfile に下記を追加します．

```
gem 'validates_email_format_of'
```

インストールします

```
$ bundle install
```

## 使ってみる

こんな感じでバリデーションを設定します．

```
class Hoge < ActiveRecord::Base
 validates :email, :email_format => {:message => 'エラ〜メッセージ〜'}
end
```


簡単ですね！！
Macのターミナルで単語ごとにカーソル移動をする方法


## 次の単語へ進む

以下の２種類

* `Esc + f`
* `option + →`

## 前の単語に戻る

* `Esc + b`
* `option + ←`

## ちなみに

カーソルを最後に移動するなら
`Ctrl + e`

カーソルを最初に移動するなら
`Ctrl + a`
erbをslimに変換する

ネットを検索したところ、シェルを利用した方法がいくつか紹介されていましたが、erb2slim単体でも変換できるようです。(html2slim 0.1.0で確認)

```rb
# Gemfile
gem 'html2slim'
```

```bash
bundle exec erb2slim app/views app/views 
# -dを付けるとslimに変換した後にerbを削除する
bundle exec erb2slim app/views app/views -d
```

----
参考
http://www.mocchiblog.com/?p=14680
開発と本番サーバで設定を切り替える

```php:
$debug = "off";
$hostname = php_uname("n");

switch(true) {
case (preg_match("/^web(0[1-9]|10).srv$/", $hostname)):
        define('WORK_ENV', 'DEPLOYED');
        $BASE_URL = 'http://hoge.fuga';
        break;
case ("staging.srv" == $hostname):
        define('WORK_ENV', 'STAGING');
        $BASE_URL = 'http://devel.hoge.fuga';
        break;
default:
        define('WORK_ENV', 'local');
        $BASE_URL = 'http://localhost:8888';
        $debug = "on";
        break;
}
```
AWS(EC2)のCentOSにphp5.4以降をインストール


Apache2.4をインストールする必要があるらしい。。。
<pre>yum install httpd24</pre>
あとは必要なバージョンのインストールをするだけ、
php5.5以降はphp-mysqlは無くてphp-mysqldがあった。
一度「list」で確認した方が良いかも。
<pre>yum list php*</pre>

参考サイト：http://higan96.hatenablog.com/entry/2013/02/14/195328

メモ<pre>yum install php55-devel php55-mbstring php55-fpm php55-mysqlnd php55-mcrypt</pre>
Xamarin.Mac: HelloMac アプリケーション終了


# Xamarin Studio 5.5 

##  Xamarin.Mac Classic API 

![image](https://raw.githubusercontent.com/hdknr/scriptogr.am/master/qiita/20141011-xamarin-mac-hello/1.png)



![image](https://raw.githubusercontent.com/hdknr/scriptogr.am/master/qiita/20141011-xamarin-mac-hello/2.png)



# XCode で Outlet作成

## ボタン

MainWindow.xib を開き、 "Push Button" をドラッグ&ドロップ

![image](https://raw.githubusercontent.com/hdknr/scriptogr.am/master/qiita/20141011-xamarin-mac-hello/3.png)

## ボタンのOutlet
- Assistant Editor を開く(MainWindowController.h)
- Closeボタンに Controlキー + マウスクリックで、エディタにドラッグ&ドロップ

![image](https://raw.githubusercontent.com/hdknr/scriptogr.am/master/qiita/20141011-xamarin-mac-hello/4.png)

~~~objc:MainWindowController.h

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>


@interface MainWindowController : NSWindowController {
    NSButton *CloseButton;
}
@property (assign) IBOutlet NSButton *CloseButton;

@end
~~~

~~~ objc:MainWindowController.m

#import "MainWindowController.h"

@implementation MainWindowController
@synthesize CloseButton;

@end
~~~

- XCode閉じる

~~~
Peeko:HelloMac hide$ find . -name "*.m" -print
./obj/Xcode/0/AppDelegate.m
./obj/Xcode/0/MainWindow.m
./obj/Xcode/0/MainWindowController.m
./obj/Xcode/1/AppDelegate.m
./obj/Xcode/1/MainWindow.m
./obj/Xcode/1/MainWindowController.m
~~~

# MainWindow.designer.cs

- MainWindow.xibで編集したので、 MainWindow.designer.csファイルに自動的に作成される
- ただし、CloseButtonがOutletで定義されるクラスは MainWindowsController(MainWindowsController.h/.m にOutlet定義したので)

~~~csharp:MainWindow.designer.cs

using MonoMac.Foundation;
using System.CodeDom.Compiler;

namespace HelloMac
{
	[Register ("MainWindowController")]
	partial class MainWindowController
	{
		[Outlet]
		MonoMac.AppKit.NSButton CloseButton { get; set; }
		
		void ReleaseDesignerOutlets ()
		{
			if (CloseButton != null) {
				CloseButton.Dispose ();
				CloseButton = null;
			}
		}
	}

	[Register ("MainWindow")]
	partial class MainWindow
	{
		
		void ReleaseDesignerOutlets ()
		{
		}
	}
}
~~~

# MainWindowController.cs

##  メインWindow

- 自動生成 されてます

~~~csharp:MainWindowController.cs

		public new MainWindow Window {
			get { return (MainWindow)base.Window; }
		}
~~~
		
## 終了ボタン

- WindowDidLoad() をオーバーライド

~~~csharp:MainWindowController.cs

		public override void WindowDidLoad ()
		{
			this.CloseButton.Activated += (object sender, EventArgs e) => {
				Window.Close();
			};
		}
~~~
		
		
# AppDelegate.cs

- CloseButtonをクリックすると MainWindowインスタンスがClose()される
- がAppDelegateは行きているのでアプリケーションは終了しません
- AppDelegate管理のWindowが閉じた時にAppDelegateを終了するようにApplicationShouldTerminateAfterLastWindowClosedをオーバーライドしてtrueを返す

~~~csharp:AppDelegate.cs

public override bool ApplicationShouldTerminateAfterLastWindowClosed (NSApplication sender)
{
    return true;
}
~~~
MagicalRecordでiCloudを使う


MagicalRecordでiCloud使うのが大変だったのでメモ。つーかMagicalRecordのバグだなこれ（[#749](https://github.com/magicalpanda/MagicalRecord/issues/749), [#787](https://github.com/magicalpanda/MagicalRecord/issues/787)）。

# 手順
## Devleoper CenterでAppの設定

Identifiers -> App IDsから任意のアプリを選択してiCloudを有効にする。

![kobito.1412996179.616869.png](https://qiita-image-store.s3.amazonaws.com/0/29860/bc52b764-1787-4114-aaf3-74ed909f02a1.png "kobito.1412996179.616869.png")


## CapabilitiesでiCloudの設定

Servicesは **iCloud Documents** を選択。Containerは **Use default container** を使います。

![kobito.1412996036.513826.png](https://qiita-image-store.s3.amazonaws.com/0/29860/7ecdecdd-8577-4b91-ce95-df1858155733.png "kobito.1412996036.513826.png")


## CloudKitをリンクする

![kobito.1412996108.087771.png](https://qiita-image-store.s3.amazonaws.com/0/29860/9b4ca687-1c61-12a7-564c-95453d8dedb8.png "kobito.1412996108.087771.png")



## CoreDataスタックを初期化する

MagicalRecordでiCloudを利用するように初期化する。iCloudを含めて初期化するメソッドはいくつかあるが `MagicalRecord:setupCoreDataStackWithiCloudContainer:contentNameKey:localStoreNamed:cloudStorePathComponent:`を使う。ちなみに`MagicalRecord:setupCoreDataStackWithiCloudContainer:localStoreNamed:`は使えませんでした。

```objectivec
// このメソッドは使えない
//[MagicalRecord setupCoreDataStackWithiCloudContainer:@"iCloud.com.example.Example"
//                                     localStoreNamed:@"Example"];

// こっちを使う
[MagicalRecord setupCoreDataStackWithiCloudContainer:@"iCloud.com.example.Example"
                                      contentNameKey:@"Example"
                                     localStoreNamed:@"Example.sqlite"
                             cloudStorePathComponent:nil];
```


## 同じアプリを複数のデバイスにインストールして確認する

同じアプリを複数のデバイスにインストールしてデータを更新します。もう一方のデバイスでアプリを立ち上げると、同じデータがコピーされます。タイミング等はよくわからない。


# MagicalRecordのバグ？

`MagicalRecord:setupCoreDataStackWithiCloudContainer:localStoreNamed:`は最初の引数にiCloudコンテナIDを渡す。内部的に`PFUbiquitySetupAssistant`クラスを呼び出してオプションとしてコンテナIDを渡すのだが、PFUbiquitySetupAssistantのオプションはピリオドを受け付けないのでエラーになる。

`MagicalRecord:setupCoreDataStackWithiCloudContainer:contentNameKey:localStoreNamed:cloudStorePathComponent:`は直接コンテナ名を渡すことが出来るのでこちらで代用している。

MagicalRecordのバグのようなので将来的には修正されるかもしれない（チケット無かったら上げておきます）。

# 参考

* [About Incorporating iCloud into Your App](https://developer.apple.com/library/mac/documentation/General/Conceptual/iCloudDesignGuide/Chapters/Introduction.html)
* [iCloud プログラミング入門](http://d.hatena.ne.jp/glass-_-onion/20120728/1343471940)
* [iOS How-To : Using Core Data with iCloud](https://goddess-gate.com/dc2/index.php/post/452)
* [Designing for Core Data in iCloud](https://developer.apple.com/library/ios/documentation/General/Conceptual/iCloudDesignGuide/Chapters/DesignForCoreDataIniCloud.html)
* [CoreDataとUIManagedDocumentとiCloudと(1)](http://blog.gentlesoft.net/article/56077280.html)
ムーブコンストラクタを作って push_back してみる

ムーブコンストラクタがどういう動きをするのか調べるために下記のようなコードを書いてみた。
まずムーブコンストラクタなしの場合。

```cpp
#include <iostream>
#include <vector>

using namespace std;

struct Obj
{
	Obj()
	{
		cout << "constructor" << endl;
	}
	
	Obj(const Obj& o)
	{
		cout << "copy constructor" << endl;
	}
	
/* ムーブコンストラクタなしの場合
	Obj(Obj&& o)
	{
		cout << "move constructor" << endl;
	}
*/
};


int main() {
	
	std::vector<Obj> v;
	
	cout << "1\n";
	v.push_back(Obj());
	cout << "2\n";
	v.push_back(Obj());
	cout << "3\n";
	v.push_back(Obj());
	
	return 0;
}
```

**コンソール出力**

```
1
constructor
copy constructor
2
constructor
copy constructor
copy constructor
3
constructor
copy constructor
copy constructor
copy constructor
```

push_back のたびにコピーコンストラクタが呼ばれている。
多めにコピーコンストラクタが呼ばれるのは vector のリサイズのときにメモリの再確保＆コピーが行われているため。

ムーブコンストラクタを追加してみると、

**コンソール出力**

```
1
constructor
move constructor
2
constructor
move constructor
copy constructor
3
constructor
move constructor
copy constructor
copy constructor
```

push_back のときにムーブコンストラクタが呼ばれるようになった。
しかし、vector の再確保＆コピーのときには相変わらずコピーコンストラクタが呼ばれている。

そのため、ムーブコンストラクタの恩恵を十分に生かすにはあらかじめ reserve しておいた方が良さそうだ。

**最終的なコード**

```cpp
#include <iostream>
#include <vector>

using namespace std;

struct Obj
{
	Obj()
	{
		cout << "constructor" << endl;
	}
	
	Obj(const Obj& o)
	{
		cout << "copy constructor" << endl;
	}
	
    // ムーブコンストラクタありの場合
	Obj(Obj&& o)
	{
		cout << "move constructor" << endl;
	}
};


int main() {
	
	std::vector<Obj> v;

    // v に予め容量を確保
    v.reserve(3);
	
	cout << "1\n";
	v.push_back(Obj());
	cout << "2\n";
	v.push_back(Obj());
	cout << "3\n";
	v.push_back(Obj());
	
	return 0;
}
```

**コンソール出力**

```
1
constructor
move constructor
2
constructor
move constructor
3
constructor
move constructor
```

コンストラクタ ＆ ムーブコンストラクタだけになった。

## 追記

頂いたコメントをもとに内容を加筆。

std::vector の push_back 時にコピーコンストラクタが呼ばれてしまう原因は、自作クラスのムーブコンストラクタに noexcept 修飾子を付けていなかったことが原因だったようだ。

std::vector は push_back の内部で std::move_if_noexcept() を使って要素を移動している。

この std::move_if_noexcept() がどのような動作をするかというと、

* ムーブコンストラクタに noexcept 修飾子を付がついている（=「このコンストラクタは例外を投げないよ」とコンパイラに明示している）ときには右辺値参照&&をリターン
* noexcept 修飾子がついていないときは const 左辺値参照をリターン

とのこと。
上記の自作クラスの例では、ムーブコンストラクタに noexcept 修飾子がついていないために const 参照が返され、コピーコンストラクタが呼ばれてしまっていた。

参考
[cpprefjp:move_if_noexcept (C++11)](https://sites.google.com/site/cpprefjp/reference/utility/move_if_noexcept)

そこで、クラスを下記のように修正した

```cpp

struct Obj
{
    /* ... */
	
    // ムーブコンストラクタに noexcept を付ける
	Obj(Obj&& o) noexcept
	{
		cout << "move constructor" << endl;
	}
};
```

noexcept を付けてあげると、下記のようにコピーコンストラクタが呼ばれていたところでムーブコンストラクタが呼ばれるようになった。

```
1
constructor
move constructor
2
constructor
move constructor
move constructor
3
constructor
move constructor
move constructor
move constructor
```

これで安心して push_back が使える。
CircleCIでFulltext Keyを含んだstructure.sqlを流す

schema.rbじゃなくてstructure.sqlでスキーマ情報を管理してるんだけど、一部のテーブルがFULLTEXT KEYを使っていて、circleciでDB初期化する際に落ちてしまう。

とりあえず、イケてないけどこんな感じで無理やり該当の行を取り除いて対応した。

もっと良い方法ないかなあ

```circle.yml
checkout:
  post:
    - sed '/FULLTEXT\sKEY/d' -i db/structure.sql
    - sed -e ':loop; N; $!b loop; ;s/,\n)/\n)/g' -i db/structure.sql
```
devise + paranoiaで論理削除を考慮したバリデーション

このエントリの内容だけだとDevise側の実装でうまくいかなかったので。
http://dangerous-animal141.hatenablog.com/entry/2014/09/08/133533

gem 'paranoia_uniqueness_validator'を追加した上で
下記のバリデートを追加

```rb
  validates :email,
    :presence => true,
    :uniqueness_without_deleted => true
```

これだけだとNotUniqueなバリデートエラーが返る。

deviseのライブラリを覗いてみるとこうなってる。

```rb
# lib/devise/models/validatable.rb
validates_uniqueness_of :email, :allow_blank => true, :if => :email_changed?
```

ので、ユニークチェックが余分にかかってしまう。
これをキャンセルして:uniqueness_without_deleted => trueだけが効くようにするために、ResouceModelに下記足してやる。

```rb
def email_changed?
  false
end
```

※ Rails3での挙動なので、4こんなことやんなくてもいいのかもしれない
GitHub EducationでのOrganization Account（Reseach Group）の申請方法

## 経緯

研究グループで研究用のWebシステムの開発を始めるにあたり、最初はprivateなgitリポジトリを用意したいなー。いっそGithub Enterprise申請するかなーと思っていたら、[GitHub Education](https://education.github.com/)のOrganizationアカウントの無期限割引が申請ができるんじゃないかと気がついた。

検索してみると、日本でもいくつかの大学の研究室やサークルでBronze〜Goldプラン分の割引を申請できているみたい。

> http://pioneerboy.hatenablog.com/entry/2014/05/23/165457
> http://pastak.hatenablog.com/entry/2014/03/02/225846
> http://d.hatena.ne.jp/hig3r/20140215/1392453009
> http://blog.falconsrv.net/articles/471

pioneerboyさんの記事をたどると研究グループはSilver：20リポジトリプランが原則なのかな？

これが使えると大変ありがたい。研究グループ用に申請してみたところ、無事にSilverプラン分の割引をしてもらうことができたので、現時点での申請方法を残しておく。

## 申請方法

申請したい組織（研究グループ・サークル等）用の[Organizationアカウント](https://github.com/organizations/new)を作成する。入力項目は組織名、領収書送付先のメールアドレス、初期プラン、チームメンバー。初期プランはOpenSourceで良い。チームメンバーも後から登録できる。

次に、GitHub Educationの[申請ページ](https://education.github.com/discount_requests/new)で、Stepごとに必要事項を入力していく。

### Step1

組織内での役職（役割）と、個人、Organizationのどちらのアカウントの割引を申請するのかを入力する。自分に最も近い役割と、'Organization account'を選ぶ。選ぶとStepが増える。

### Step2

どのOrganizationアカウントの割引を申請するのかと、そのOrganizationアカウントに最も近い属性を選ぶ。今回は、研究グループでの開発用のアカウントを申請したかったので、'Research group'を選択した。ここでの選択で、次Stepからの入力項目が変わる。

### Step3

Research groupの詳細を入力する。入力項目は、グループ名、グループのURL、いくつのプライベートリポジトリが必要か、活動に商用/営利目的が含まれるか、研究資金をどうしているか。今回は、リポジトリ数はSilver Planにあわせて20にした。研究資金のテキスト入力は、学内の資金とか、競争的資金とか、研究グループの資金を獲得してる方法を素直に英語で入力すれば良いみたい。

### Step4

申請者の情報を入力する。入力項目は、氏名、教育機関に所属していることの確認（教育機関発行のメールアドレスと、学生証・教職員証の写真）、教育機関名、研究グループでのGitHubの利用計画。もしGitHubの個人アカウントに教育機関発行のメアドを登録していなければ、[Settings→Emails](https://github.com/settings/emails)で追加登録しておく必要がある。利用計画には、あまり難しいことは考えず、素直に「研究用のWebシステム開発や新人のトレーニングに使いたいんだよー」といった旨を英文で記入した。

### その後
'submit request'ボタンを押せば、申請が完了され、「審査したら連絡するよ」といった旨のメッセージが表示される。今回の場合は数日で、「君のOrganizationアカウントをSilver Planにアップグレードしておいたよ! Have an Octotastic day!」といったメールが届いた。

作成したOrganizationアカウントのSettings→billingを見ると、確かにSilverPlan用のクーポンが適用されていた。早速2つのプライベートリポジトリを登録。ありがたい。

![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/8064/ad12cd64-f2df-10d5-088d-57aa21075e7e.jpeg)

登録画面や入力内容は英語だけど、そんなに高い英語能力が無くても完了できるので、中高生とかでも部活や学生アカウントの割引を申請できるんじゃないかな。
rails4+deviseでログアウトリンクが機能しない時に見るtips

基本的にはこう書く

```haml
= link_to destroy_[user]_session_path, method: :delete
```

忘れがちなポイントとして

- パス名はdestroy_[scope名]_session_path
- scope名を適切に、デフォルトはuserですがadminとかの場合は変更する
- deleteメソッドなので、リンクの場合は明示的に指定する

があるかと思いました。
haxe.unitで(warning) no assertエラーが出たら

https://github.com/johnfn/haxe.unit/blob/master/TestRunner.hx#l191

```haxe:TestRunner.hx#l185~186
if (test.currentTest.success) {
    if (test.currentTest.done){...
```

テストの実行はされているけれども、テストが終わってない状態。
`assertEquals()`が処理されてないので`trace()`でどこまで行ったか確認すればおk。

今回は僕が複雑なEnumに慣れてなくてとりあえずDynamicにしといてテストを通そうとしてswitchパターンマッチ内のassertが呼ばれなかったのが原因。

haxe情報をwebに増やさねばな
ヤフオクAPI レスポンスがなくなりました。

昨日の午後から、ヤフオクAPIの
「出品中」
https://auctions.yahooapis.jp/AuctionWebService/V2/mySellingList
「出品終了分」
https://auctions.yahooapis.jp/AuctionWebService/V2/mySellingList
「入札中」
https://auctions.yahooapis.jp/AuctionWebService/V2/myBidList
のレスポンスがありません。

実際使っているのは、
マイ・オークション表示系サンプルの、
出品終了分の部分にに少し手を加えて、
自社データベースに落札データを登録する、ということをしていますが、
10月10日(金)13時頃までは問題なく使用できていましたが、
16時頃に使用したところ、レスポンスがありませんでした。

マイ・オークション表示系サンプルを
そのまま走らせてみても、「出品中」「出品終了分」「入札中」のレスポンスがありません。
それ以外は、動作しています。

ちなみに、ストアIDです。

業務に支障が出ておりますので、
一刻も早く解決したいのですが、お調べいただけますでしょうか。
「Rails4＋RSpecでCapybara入門」の連載記事（計25回）

Capybaraでよく使うマッチャ＆メソッドをメモ。
オプションとかよく忘れるし。

* [第1回：have_titleマッチャでタイトル内容を確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-title)
* [第2回：have_contentマッチャでコンテンツ内容を確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-content)
* [第3回：have_linkマッチャでリンク内容を確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-link)
* [第4回：have_cssマッチャで指定したタグの内容を確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-css)
* [第5回：have_buttonマッチャで指定したボタンを確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-button)
* [第6回：have_fieldマッチャで指定した入力フィールドを確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-field)
* [第7回：have_checked_fieldマッチャで指定したチェックボックス/ラジオボタンを確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-checked-field)
* [第8回：have_unchecked_fieldマッチャで指定したチェックボックス/ラジオボタンを確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-unchecked-field)
* [第9回：have_selectマッチャで指定したセレクトボックスの選択内容を確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-select)
* [第10回：click_onメソッドでボタンをクリックする](http://blog.enogineer.com/2014/10/11/rails-capybara-click-on)
* [第11回：fill_inメソッドでフォームにテキストを入力する](http://blog.enogineer.com/2014/10/11/rails-capybara-fill-in)
* [第12回：selectメソッドでセレクトボックスから要素を選択する](http://blog.enogineer.com/2014/10/11/rails-capybara-select)
* [第13回：chooseメソッドでラジオボタンから要素を選択する](http://blog.enogineer.com/2014/10/11/rails-capybara-choose)
* [第14回：checkメソッドでチェックボックスを選択する](http://blog.enogineer.com/2014/10/11/rails-capybara-check)
* [第15回：uncheckメソッドでチェックボックスを選択解除する](http://blog.enogineer.com/2014/10/11/rails-capybara-uncheck)
* [第16回：findメソッドでオブジェクトを取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-find)
* [第17回：find_buttonメソッドでボタン要素を取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-find-button)
* [第18回：find_fieldメソッドでフィールド要素を取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-find-field)
* [第19回：find_by_idメソッドでid要素を取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-find-by-id)
* [第20回：find_linkメソッドでリンク要素を取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-find-link)
* [第21回：allメソッドで要素リストを取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-all)
* [第22回：nativeメソッドでネイティブオブジェクトを取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-native)
* [第23回：find＆nativeメソッドでmeta要素をテストする](http://blog.enogineer.com/2014/10/11/rails-capybara-meta-content)
* [第24回：Basic認証が必要なページをテストする](http://blog.enogineer.com/2014/10/11/rails-capybara-basic-auth)
* [第25回：ログインが必要なページをテストする](http://blog.enogineer.com/2014/10/11/rails-capybara-login)
時間のかかるSQLを実行する簡単な方法


##はじめに

DB構築直後や検証環境でのデータがない時に遅いSQL文が必要になる時がたまにあります。たとえば、「RDSのMySQLでSlow queryの設定をしたけど本当に動いているのか確認したい」といった時です。そんな時に使える小技となります。ちなみにMySQLやOracleだけでなく他のDBでも使えますので、こちらではsqlite3を使って試しています。

##データを作る 

ここではtestという数値型のカラムを一つ持つテーブルをつくって、そこに10行レコードを追加しています。既にテーブルがある場合はそちらもつかえます。

``` SQL
sqlite> create table test (item1 int);
sqlite> select count(*) from test;
0
sqlite> insert into test values (1);
sqlite> insert into test values (2);
sqlite> insert into test values (3);
sqlite> insert into test values (4);
sqlite> insert into test values (5);
sqlite> insert into test values (6);
sqlite> insert into test values (7);
sqlite> insert into test values (8);
sqlite> insert into test values (9);
sqlite> insert into test values (10);
sqlite> select count(*) from test;
10
```

##遅いSQL文を実行する

こんな感じのSQLを実行します。

``` SQL

sqlite>  select count(*) from test a , test b , test c , test d , test e;
100000

```

交差結合(cross join)を利用しています。テーブルが1つしかなくても別名をつけることで結合可能です。上のSQL文は各テーブルの各レコードが別のテーブルの全レコードと結合することになりますので、10の5乗の10万レコードが返されます。

でも、これでは最近のPCでは一瞬でデータが返ってきます。ということで、もう一工夫して、このSelect文の結果をtestテーブルにつっこみます。

``` SQL

sqlite> insert into test (item1) select a.item1 item1 from test a , test b , test c , test d , test e; 

sqlite> select count(*) from test;
100010

``` 

10万レコードのテーブルができました。で、ここに最初のSQL文を実行すると応答が返ってこないSQLが実行できます。中断するにはCtrl+cを入力してください。

## まとめ

小ネタということでデータがない時に遅いSQL文を実行する方法を説明しました。sqliteはシンプルでシステムテーブル等のレコード数があまりなく、テーブルを作っていますが、MySQL、Postgres、Oracleなどではシステムテーブルに結構なレコード数があるので、テーブル作成の必要はないとおもいます。
時間のかかるSQLはCPUバウンドになります。監視ツールのチェック等にも使えます。運用環境だと悪影響を与えること間違いなしですので気をつけてください。

ではでは。
WinJSをブラウザで使ってみる


WinJSを使ってデモページを作ってみました。

[デモページ]
http://tatsuowatanabe.github.io/WinJsFirstStep/
[GitHubリポジトリ]
https://github.com/TatsuoWatanabe/WinJsFirstStep/

WinJSのデモページは[Try WinJS](http://try.buildwinjs.com)があるのですが、
実際にWebページとして作ってみると戸惑うことも多かったので、Try WinJS のサンプルコードを利用してWebページを作って練習したものが上記デモページです。


## 参考

[WinJS project by Microsoft Open Technologies]
https://github.com/winjs

[Try WinJS]
http://try.buildwinjs.com


日本マイクロソフト ものえおさむ さんの記事
[WinJS3.0 がリリースされました。]
http://blogs.msdn.com/b/osamum/archive/2014/09/19/winjs3-0.aspx

## 感想
WinJSがオープンソースになってまだ間がないためか、リファレンスがまだ十分に整備されていない印象です。公式リファレンスや他のWeb上の情報などでサンプルコードを探しても、欲しい情報が見つからないことが多いので、手探りでとりあえず書いて動かしてみる、という状況が多かったです。

一番参考になったのはTypeScriptの型定義ファイル[winjs.d.ts](https://github.com/borisyankov/DefinitelyTyped/blob/master/winjs/winjs.d.ts)でした。
クラスやメソッドの詳細な定義が Visual Sttudio 上ですぐ参照できるのは便利です。
今回のデモページはTypeScriptでコーディングしたので、型定義の参照の恩恵を受けることができました。
AnsibleでLinuxに最新版のpecoをインストールする


pecoのインストールに限った話ではないのですが、githubでreleaseされている最新版をAnsibleでインストールしたいことがあって書いた。Macだとbrew install 一発なんだけど、Linuxで使いたかったので。

## tl;dr
完成形

```yaml:peco.yml
- name: Get latest peco version
  shell: >
    curl -sI https://github.com/peco/peco/releases/latest | awk -F'/' '/^Location:/{print $NF}'
      register: peco_latest_version

- name: Download latest peco
  get_url: url=https://github.com/peco/peco/releases/download/{{ peco_latest_version.stdout }}/peco_linux_amd64.tar.gz dest=/tmp/peco_linux_amd64.tar.gz

- name: Extract peco
  unarchive: src=/tmp/peco_linux_amd64.tar.gz dest=/tmp/

- name: Copy to /usr/bin/
  copy: src=/tmp/peco_linux_amd64/peco dest=/usr/bin/ mode=0755
```

## 最新バージョンを取得
インストール時に一番新しいのを使いたいので自動で最新版を取得する。

```yaml:
- name: Get latest peco version
  shell: >
    curl -sI https://github.com/peco/peco/releases/latest | awk -F'/' '/^Location:/{print $NF}'
  register: peco_latest_version
```

https://github.com/peco/peco/releases/latest にアクセスしてredirect先のurlを取得して、awkでバージョンを切り出し、peco_latest_versionに格納。

## ダウンロードして、コピー
```yaml:
- name: Download latest peco
  get_url: url=https://github.com/peco/peco/releases/download/{{ peco_latest_version.stdout }}/peco_linux_amd64.tar.gz dest=/tmp/peco_linux_amd64.tar.gz

- name: Extract peco
  unarchive: src=/tmp/peco_linux_amd64.tar.gz dest=/tmp/

- name: Copy to /usr/bin/
  copy: src=/tmp/peco_linux_amd64/peco dest=/usr/bin/ mode=0755
```

1.  https://github.com/peco/peco/releases/download/{{ peco_latest_version.stdout }}/peco_linux_amd64.tar.gzからダウンロード
2.  解凍
3. /usr/binにパーミッション指定してcopy

## 参考
http://stackoverflow.com/questions/21439239/github-latest-release
vagrant-kvmを使ってVMを立ち上げる


[vagrant-kvmでWindowsを利用する方法](http://qiita.com/knqyf263/items/d9576651bb9f84530351)という特殊なものを先に取り上げましたが、普通にLinuxのVMを立ち上げる場合を取り上げたいと思います。
VMのOS自体はなんでも良いのですが、ここはあえてUbuntu on Ubuntuという形でやってみます。

#環境
- ホストOS
 - Ubuntu 14.04
- ゲストOS
 - Ubuntu 14.04
- KVM
 - virsh 1.2.2
- Vagrant 1.6.5 
- vagrant-kvm 0.1.9


#VMセットアップ
##boxに追加
http://www.vagrantbox.es/ から欲しいboxを選びます。
選んだら、それを使ってboxに追加します。
少し時間がかかります。

```console
$ vagrant box add ubuntu14.04 https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box
```

##イメージの変換
vagrant mutateを使ってイメージを変換します。

```console
$ vagrant mutate ubuntu14.04 kvm
$ vagrant box list
ubuntu14.04 (kvm, 0)
ubuntu14.04 (virtualbox, 0)
```

kvmのものがboxに追加されていればOKです。

##起動
`vagrant init`してから`vagrant up`するだけです。
ただし、`vagrant up`の時にはproviderをkvmに指定して上げる必要があります。

```shell-session
$ vagrant init ubuntu14.04
$ vagrant up --provider=kvm
Bringing machine 'default' up with 'kvm' provider...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 192.168.123.7:22
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Host unreachable. Retrying...
    default: Warning: Connection refused. Retrying...
==> default: Machine booted and ready!
==> default: Creating shared folders metadata...
==> default: mounting p9 share in guest
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: to force provisioning. Provisioners marked to run always will still run.
```

以上です。
kvmでもVagrantを使えば非常に簡単にVMを作ったり壊したり出来ます。
SH-02F(Android4.2.2)でBLEモジュールKonashiを使う

みんな**KitKat**持ってて、もはや需要がないであろう記事ですが備忘録として残します。
今のスマホの支払い、あと1年2か月くらい残ってるし…

KonashiってAndroidで使えるの？
============================
最近はほとんどコミットがなく、開発は活発とは言えませんがSDKがあります。
[YUKAI/konashi-android-sdk](https://github.com/YUKAI/konashi-android-sdk)

BLEってAndroid4.3からじゃないっけ？
================================
4.3未満でもメーカー側で対応しているケースがあり、SHARPの端末もAndroid 4.3からバックポートしています。
[Android 4.2搭載端末での Bluetooth Low Energy API 利用方法](https://sh-dev.sharp.co.jp/android/modules/download/?/api_ble42)

プロジェクトの作成
================
API Level 18をターゲットにしてプロジェクトを作成します。

```bash
# idを調べる
$ android list target | grep android-18
id: 13 or "android-18"
# プロジェクトを作成。
# アクティビティの名前はMainActivityにしておくと
# サンプルと同じなので楽。
# パッケージ名はテキトーに
$ android create project -n KonashiLED -t 13 -p KonashiLED -k com.nocd5.konashi.led -a MainActivity
$ cd KonashiLED
# konashi-android-sdkをライブラリプロジェクトに追加
$ android update project -l ../konashi-android-sdk/Konashi -p .
```

konashi-android-sdk/samples/KonashiSampleBasic内の以下のファイルをコピー

* libs/
* res/
* ic_launcher-web.png

ソースコードも内容は丸ごとコピーですが、パッケージ名はプロジェクト作成時のものに合わせ修正します。

[Android 4.2搭載端末での Bluetooth Low Energy API 利用方法](https://sh-dev.sharp.co.jp/android/modules/download/?/api_ble42)を参考にAndroidManifest.xmlを編集します。

```diff
diff -r be8789f6c9e1 AndroidManifest.xml
--- a/AndroidManifest.xml	Sat Oct 11 01:41:32 2014 +0900
+++ b/AndroidManifest.xml	Sat Oct 11 01:45:14 2014 +0900
@@ -12,4 +12,10 @@
             </intent-filter>
         </activity>
     </application>
+    <uses-sdk
+        android:minSdkVersion="17"
+        android:targetSdkVersion="18" />
+    <uses-feature android:name="jp.gr.java_conf.ble_profile.api.gatt"/>
+    <uses-permission android:name="android.permission.BLUETOOTH"/>
+    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
 </manifest>
```

Konashi Android SDKの修正
========================
そのままだと**BLE**をサポートしていると見なされないので以下のように修正し
`jp.gr.java_conf.ble_profile.api.gatt`も許容するようにします。
ちなみに`PackageManager.FEATURE_BLUETOOTH_LE`の定義は`android.hardware.bluetooth_le`です。

```diff
diff --git a/Konashi/src/com/uxxu/konashi/lib/KonashiBaseManager.java b/Konashi/src/com/uxxu/konashi/lib/KonashiBaseManager.java
index 49657b2..e24118e 100644
--- a/Konashi/src/com/uxxu/konashi/lib/KonashiBaseManager.java
+++ b/Konashi/src/com/uxxu/konashi/lib/KonashiBaseManager.java
@@ -385,7 +385,8 @@ public class KonashiBaseManager implements BluetoothAdapter.LeScanCallback, OnBl
     /////////////////////////////////////////////////////////////
     
     private boolean isSupportBle(Context context){
-        return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);
+        return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE) ||
+               context.getPackageManager().hasSystemFeature("jp.gr.java_conf.ble_profile.api.gatt");
     }
     
     protected boolean isEnableAccessKonashi(){
```

デプロイ
=======
あとはビルドしてインストールするだけです

```bash
$ ant debug
$ adb -d install -r bin/KonashiLED-debug.apk
```
**うごいたー**
![DSC_0004.jpg](https://qiita-image-store.s3.amazonaws.com/0/52493/97ecfe81-20e6-d8e8-0a16-dca7b867a5ab.jpeg)
jQueryのprop()でdisabled属性を切り替える

buttonタグなどのdisabled属性の切り替えを、jQueryのprop()によって切り替える方法です。

```html:ボタンのHTML
<button id="pugi">送信</button>
```
# disabledを外す場合

```js:ボタンを有効にする
$("#pugi").prop("disabled", false);
``` 
disabledが外れてボタンが有効になります。

# disabledをつける場合

```js:ボタンを無効にする
$("#pugi").prop("disabled", true);
```
disabledがついてボタンが無効になります。

# おまけ
disabled属性をつけるとサーバーと通信してくれません。通信したい場合はreadonly属性を使います。
【jQuery】SVGのviewBoxでハマる

jQueryの、attrメソッドは自動的にlowercase(小文字化)するため、SVGのviewBox(viewboxではなく)属性を変更できない。
そのため、以下のようにsetAttributeを利用し、設定する必要がある。

```js:fail
$("#mySVG").setAttribute("viewBox","0 0 1000 1000");
```


```js:success
document.getElementById("mySVG").setAttribute("viewBox","0 0 1000 1000");
```

※自動で小文字化するのは、HTMLに準拠しているためである。 SVGを使うことを考慮していないため対応しないのだろう。
Org-modeで編集中のファイルをMarkedでプレビューする


Org-modeで編集中の拡張子が`.org`のファイルを、Markdownに変換してMarked(2)でプレビューします。
元々拡張子が`.md`のファイルはそのままプレビューします。

新し目のOrgが入っていることと、もちろんMarkedがあることが前提です。
init.elかどこかに以下を追加してください。

```lisp
(defun markdown-preview-file-with-marked ()
  "run Marked on the current file (convert it to markdown in advance if the file is *.org)."
  (interactive)
  (if (string= (file-name-extension buffer-file-name) "org")
      (org-md-export-to-markdown) nil)
  (shell-command
   (format "open -a /Applications/Marked\\ 2.app %s"
	   (shell-quote-argument
	    (concat (file-name-sans-extension buffer-file-name) ".md")))))

(global-set-key "\C-cm" 'markdown-preview-file-with-marked)

```

`C-c m`でプレビューします。

ええと。。ぶっちゃけいまいちです。
Orgファイルをプレビューする場合、結局コマンドでプレビューするだけなので、Markedのリアルタイム更新の恩恵を受けられません。
保存時のフックにしたほうがいいかも。
あと、Emacs Lispはいつも場当たりで書いているのでコードも変かもしれません！
【kagome】形態素解析のラティスをグラフで表示できるようにしてみた

# 概要
Pure Go な形態素解析器 kagome で，形態素解析過程で利用しているラティスを graphviz の dot format で出力できるようにしてみました．辞書同梱なので，バイナリ1つででちょこちょこ遊べます．解析器をリファクタリングする際に内部状態を表示するのに作ってみました．kagome はリファクタリングして v0.2.0 になりました．速度向上，テスト重点なので機能的には特に変化なしですが，全面的に書き換わっているのでもしよければ遊んでみてください．
ラティスの表示には [graphviz](http://www.graphviz.org/) が必要です．

# インストール

```
go get github.com/ikawaha/kagome/...
```

# ソース

https://github.com/ikawaha/kagome 

# 使い方
入力のエンコードはは utf8 である必要があります．引数にテキストを与えてやると，graphviz の dot fromat でグラフを出力するので，それを dot コマンドに喰わせて画像に変換します． 

```
$ lattice -v すもももももももものうち | dot -Tpng -o a.png
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```

![a.png](https://qiita-image-store.s3.amazonaws.com/0/44487/ae7107ed-0f4c-50e3-7d97-73067a53ae6e.png)

色がついているパスが Viterbi アルゴリズムで選択された最善パスです．
短い文でも結構複雑なグラフになりますね．グラフ化することで形態素解析器のバグもいくつかとれました :octocat:
1つのSlackで複数チームにログインする方法


こんにちは，最近3チーム以上にまたいでSlackログインすることになりちょっとだけ困っている [@isseium](http://twitter.com/isseium) です．


## 注意事項

**※ここで紹介しているアプリケーションはSlack公式アプリなのか不明なので自己責任でご利用ください**
（追記）Slack公式Twitterがつぶやいていたようなので大丈夫な気はします．
https://twitter.com/SlackHQ/status/507318603171897344

## これまでのやりかたと課題

いままで複数チームでのログインをするには，次のような方法がありました．

- [公式サイトの見解](https://slack.zendesk.com/hc/en-us/articles/201405046-Can-I-belong-to-more-than-one-Slack-team-)
- [Macでslackアプリを複数立ち上げる (上の記事のほぼ日本語訳）](http://qiita.com/mikesorae/items/28e53091b94527bc1388) 

これらの対応でMac上でSlackアプリを2つ起動し，それぞれ別チームでログインすることができるのですが，アプリを起動し直すと同じチームのログインになっていたりとちょっと使い勝手が微妙でした．

## Slack Beta というものを見つけた

いい加減なんとかしたいなーと思って ```slack multiple``` で検索したら下記のブログを見つけました．


[SLACK BETA FOR MAC WITH MULTIPLE TEAM SUPPORT](http://dor.ky/slack-beta-for-mac-with-multiple-team-support/)


アプリのダウンロード先はこちら: https://rink.hockeyapp.net/apps/06bd6493684f65a3b8f47aca92c9006e

## こんな画面です

![](https://www.evernote.com/shard/s31/sh/a3408e7d-c47e-48f0-b5e6-72e7db2745e9/95d36bedb9ef6c22663a64346b1534b0/deep/0/Cursor.png)

試しに使ってみようと思います．

## ちなみに 
画面例にある ipukun は hubot で動いています．
詳しくは，メインの調教師の @sasarkyz さんの記事をご覧下さい．

[slack の hubot に今北産業機能追加してみた](http://qiita.com/sasarkyz/items/3b99a2b21d1ab4872ac9)
[Hubot と Jenkins をつかって heroku への Deploy 環境を用意した](http://qiita.com/sasarkyz/items/7fde53e01d90b57a48df)
[slack の hubot で毎朝ポケモンバトルを遊べるようにしてみた](http://qiita.com/sasarkyz/items/ed0f59f0817540dc4196)
Mac に Egison を cabal install してみた。

## 前置き

Egison ( http://www.egison.org/ )。
Mac 用のパッケージインストーラが用意されているが、少しバージョンが古い（2014/10/10 現在）。
Linux のインストール方法（ http://www.egison.org/getting-started/getting-started-linux.html ）を参考に、Hackage で配布されている最新の Egison をインストールしてみたのでその覚書。

## 環境

* Mac OSX Mavericks 1.9.5 (10.8.x でもほぼ同様）
* Homebrew

## インストール

Xcode、Homebrew のインストール・アップグレードは省略
あと `brew info haskell-platform` したら「ghc と cabal-install をインストールしてね」と言われたので↓

### ghc, cabal-install のインストール

```
$ brew install ghc cabal-install
```

※インストールログ消えちゃったけれど、Mavericks 用の ghc パッケージがインストールされたっぽい。Mountain Lion の時は Mountain Lion 用のパッケージ。

確認

```
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.8.3
$ cabal --version
cabal-install version 1.20.0.3
using version 1.20.0.2 of the Cabal library
```

### Egison インストール

```
$ cabal update
$ cabal install egison egison-tutorial
```

### パス追加

インストール先が特殊なので、パスを無理矢理通しておく。

```
$ vi ~/.bash_profile
#《中略、最後尾に以下の3行を追記 for 10.9》
PATH=$HOME/Library/Haskell/ghc-7.8.3/lib/egison-tutorial-3.3.6/bin:$PATH
PATH=$HOME/Library/Haskell/ghc-7.8.3/lib/egison-3.3.12/bin:$PATH
export PATH
```

※今手元に環境がないが、10.8 だと違うメモが手元に残っていたのでその情報も↓

```
$ vi ~/.bash_profile
#《中略、最後尾に以下の1行を追記 for 10.8》
export PATH=$HOME/.cabal/bin:$PATH
```

確認。

```
$ egison --version
3.3.12
$ egison-tutorial --version
3.3.6
```

### 動作確認

CodeIQ の q1026 所謂 #右仮面 問題を Egison で解いてみた。

```q1026_answer.egi
;; CodeIQ q1026 Answer for Egison (http://www.egison.org/)
(define $fibs
  (letrec {[$fibs-gen (lambda [$a $b] {a @(fibs-gen b (+ a b))})]}
    (fibs-gen 0 1)))
 
(define $main
  (lambda [$args]
    (print (S.intercalate "," (map show (take 20 fibs))))
    ; => 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181
  ))
```

動作確認。

```
$ egison q1026_answer.egi
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181
$ /usr/bin/egison q1026_answer.egi # ←パッケージインストーラでインストールした Egison 3.3.2
Parse error at: "egison" (line 6, column 8):
unexpected reserved word "define"
expecting expression
```
ArduinoとGroveスターターキットのセットアップ方法


## 1. ArduinoIDEのダウンロードとセットアップ
以下のサイトからArduinoIDEをダウンロードしてください。
http://arduino.cc/en/Main/Software
ArduinoIDEはWindows用とMac用、Linux用がありますので、お使いのコンピューターにあったものをダウンロードしてください。

ダウンロードしていただいたら、インストーラーの指示に従ってインストールしてください

## 2. Arduinoとコンピューターをつないで、Lチカを試してみる
インストールが終わりましたら、USBケーブルでArduinoとPCを接続しましょう。

![IMG_1623.jpg](https://qiita-image-store.s3.amazonaws.com/0/41825/5ba8022b-f7d3-35df-1767-ff6e5a718871.jpeg "IMG_1623.jpg")


つなぎましたら、ArduinoIDEを立ち上げてください。

ファイル -> スケッチの例 -> Basics -> Blinkを選んで開いてください。

Uploadボタンを押して、プログラムをArduinoに書き込みましょう。

ArduinoのLEDが点滅すれば、書き込み成功です。

書き込みがうまく行かない場合は以下の項目をチェックしてください。

1. ツール -> マイコンボード -> ArduinoUnoを選んでください。
2. (mac)ツール -> シリアルポート -> /dev/tty/usb*** (***の部分はお使いのUSBケーブルにより異なります。)
2. (win)ツール -> シリアルポート -> COM*** (***の部分はお使いのPCにより異なります)

## 3. GroveシールドをArduinoとつなぐ
Arduinoが正常に動作しましたら、一度ArduinoをUSBケーブルが抜いてください。

次にArduinoとGroveスターターキットのシールドを接続します。

![IMG_1618.jpg](https://qiita-image-store.s3.amazonaws.com/0/41825/5afc9d35-75e0-c02a-b824-ccd6d781a2eb.jpeg "IMG_1618.jpg")


接続できましたら次にGroveスターターキットのセンサーモジュールを同梱のケーブルでGroveシールドとつなぎます。

![IMG_1619.jpg](https://qiita-image-store.s3.amazonaws.com/0/41825/6994a06a-cb32-07be-0e40-85d7a3d897f4.jpeg "IMG_1619.jpg")

Groveモジュールをつないだら、再度ArduinoとコンピュータをUSBケーブルでつなぎましょう。

Groveスターターキットのサンプルを以下のサイトからダウンロードして、実行してみましょう。
https://github.com/Seeed-Studio/Sketchbook_Starter_Kit_for_Arduino

### スターターキットに同梱されているGroveモジュール

|Groveモジュール|用途|
|:--|:--|
|ボタン|スイッチとして使います|
|LED|点滅、点灯できます|
|光センサ|明るさを検知できます|
|ボリューム|回転角度を検知できます|
|サウンドセンサ|音を検知できます|
|温度センサ|温度を測定できます|
|ブザー|ブザー音をならすことができます|
|サーボモータ|角度を指定して動かすことが出来るモーター|
|RGBLCDディスプレイ|数字や文字を表示できます。いろいろな色に光らせることも可能|
|リレー|スイッチ|


## 4. 外部サイト
Arduino日本語リファレンス
http://www.musashinodenpa.com/arduino/ref/
Groveスターターキット販売ページ
http://www.switch-science.com/catalog/1812/
Groveスターターキット Githubページ (こちらでサンプルファイルをダウンロードしてください)
https://github.com/Seeed-Studio/Sketchbook_Starter_Kit_for_Arduino
1行にJSON形式で1ドキュメントが記録されたデータを読み込んで一つ一つに処理をする ruby サンプル

自分用のメモです。

一行に一つのJSONデータが書かれたデータを読み込んで何かしたいことがたまにあるので、そのスニペット的なものとして。

最近は fluentd とか mongod とか何かと json データを扱うことが多いのです。

```rb
require 'json'

def process(j)
  puts JSON.pretty_generate(j)
end

begin

  i, f, s = 0 , 0 , Time.new
  while d = STDIN.readline
    i+=1
    begin
      process(JSON.parse(d))
    rescue => e
      puts e
      f+=1
    end
  end

rescue EOFError => e
  # do nothing.
end

puts "-- summary --"
puts "count #{i}"
puts "ok    #{i-f}"
puts "error #{f}"
puts "sec   #{Time.new - s}"
```

使い方は、こんな風にする。

さっきのファイルを jsonwalk.rb として保存し、標準入力から json データを読み込ませる。

```
$ echo '{"name" : "yahoo", "age" : 10}
{"name": "google", "age" : 5    }' | ruby jsonwalk.rb 

{
  "name": "yahoo",
  "age": 10
}
{
  "name": "google",
  "age": 5
}
-- summary --
count 2
ok    2
error 0
sec   0.000177
```

よしよし。
MacでDockerメモ


## インストール

http://dev.classmethod.jp/tool/docker-1-0-mac-osx-upgrade/
[Installing Docker on Mac OS X（公式サイト：英語）](http://docs.docker.com/installation/mac/)

## セットアップ

[はじめてのDocker on Mac OS X](http://dev.classmethod.jp/tool/docker/getting-started-docker-on-osx/)

## お役立ち

[はじめてのDocker on EC2](http://dev.classmethod.jp/cloud/aws/firststep-docker-on-ec2/)

## Docker Hub

[Docker Hubの使い方とGitHubからのDockerイメージ自動ビルド (1/2)](http://www.atmarkit.co.jp/ait/articles/1408/26/news038.html)

## Scala & Play Framework

[ScalaでAndroid開発 - Docker編](http://qiita.com/ikuo/items/dddf1276167f942d1bb6)
[Docker開発環境 - Typesafe ActivatorでScalaをインストール](http://masato.github.io/2014/06/29/docker-devenv-scala-typsafe-activator/)
[DockerでPlay Frameworkの環境をつくってみる for CentOS](http://shigemk2.hatenablog.com/entry/2014/05/06/Docker%E3%81%A7Play_Framework%E3%81%AE%E7%92%B0%E5%A2%83%E3%82%92%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B_for_CentOS)

## AWS Elastic beanstalk　にデプロイ

[Docker を Mac で使ってみた（Nodeアプリ例）](http://havelog.ayumusato.com/develop/server/e601-docker_on_mac.html)
[Elastic Beanstalk with Docker と OpsWorks で Node + MongoDB する](http://havelog.ayumusato.com/develop/infrastructure/e606-aws_elasticbeanstalk_and_opsworks.html)
Elixir try-throw-catch

# Elixir try-throw-catch

## 概要
Elixir の try-throw-catch について。

throw ・ catch を利用することで特定の条件の場合に
catch に遷移するロジックを記述できます。

## try-throw-catch の例
### サンプル仕様

乱数 1-100 を生成します。
基本は FizzBuzz のルールで返却値を決定しますが、
11の倍数なら %{value: 実際の数値} の形式のハッシュを返却します。
50回繰り返して処理結果を確認します。

~~~
defmodule ExceptionSample do
  def random_exec do
    x = :random.uniform(100)
    strx = Integer.to_string(x)
    cond do
      rem(x, 11) == 0 -> %{value: x}
      rem(x, 15) == 0 -> "FizzBuzz" <> strx
      rem(x, 5) == 0 -> "Buzz" <> strx
      rem(x, 3) == 0 -> "Fizz" <> strx
      true -> x
    end
  end

  def try_rescue do
    try do
      x = ExceptionSample.random_exec
      cond do
        is_binary(x) -> x
        is_integer(x) -> x
        true -> throw(x)
      end
    catch
      x ->
        IO.puts "catch"
        x
    end
  end

  def try_rescue_times(0) do
    # do nothing
  end

  def try_rescue_times(n) do
    IO.inspect ExceptionSample.try_rescue
    try_rescue_times(n - 1)
  end
end

ExceptionSample.try_rescue_times(50)
~~~

* 出力

~~~
"FizzBuzz45"
73
"Buzz95"
"Fizz51"
32
"FizzBuzz60"
92
67
"Fizz48"
"FizzBuzz60"
"FizzBuzz15"
"Fizz21"
"Buzz70"
16
56
catch
%{value: 22}
46
43
1
"Fizz57"
"Fizz48"
41
31
"Fizz6"
58
catch
%{value: 99}
34
19
"Fizz21"
4
89
"Fizz84"
83
catch
%{value: 33}
26
"Fizz81"
2
"Fizz3"
"Buzz5"
"Fizz6"
catch
%{value: 99}
"Fizz57"
61
"Fizz39"
67
catch
%{value: 88}
"FizzBuzz90"
"Buzz80"
59
"FizzBuzz30"
~~~

## 参照
* http://elixir-lang.org/docs/stable/elixir/Kernel.SpecialForms.html#try/1
* http://elixir-lang.org/docs/stable/elixir/Kernel.html#throw/1
* http://elixir-lang.org/getting_started/17.html
Itamae 関連記事

# Itamae 関連記事

更新日: 2014/12/24 23:46:32

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Docker  Vagrant + Itamae で Docker の Hello world #docker #itamae #vagrant](http://qiita.com/tbpgr/items/d27845082dd49c36142f)|2014/11/25 22:32:34|1|
|2|[Docker ＋ Itamae でレシピ作成の試行錯誤を 高速化 :rocket: #itamae #docker](http://qiita.com/tbpgr/items/0f2545779b015e34e777)|2014/12/24 23:42:00|0|
|3|[Itamae  Definitions で 板前によるパッケージインストール機能にトイレ操作機能を統合し、木とSLと乳牛を調達する #devops #itamae](http://qiita.com/tbpgr/items/b47510b01db8697f94c1)|2014/10/20 21:58:52|0|
|4|[Itamae  Itamae を使って Ubuntu 14.04 LTS 環境へ Ruby 2.1.3 , Rails 4.1.8 のインストール #itamae #ruby](http://qiita.com/tbpgr/items/1674798179ff223b1d86)|2014/12/05 23:01:46|0|
|5|[Itamae  Node Attributes #devops #itamae](http://qiita.com/tbpgr/items/68cee756ffa2ced2580a)|2014/10/21 22:54:24|1|
|6|[Itamae  Ohai 連携オプション #devops #itamae](http://qiita.com/tbpgr/items/6eb6947cfca190184d84)|2014/10/20 22:07:39|1|
|7|[Itamae  dry-run オプションで変更を行わずに動作を確認。板前がトイレを設置せずにトイレ感を味わってみる。 #devops #itamae](http://qiita.com/tbpgr/items/9a796c9ee92037d332ca)|2014/10/10 22:13:35|1|
|8|[Itamae  recipe plugin で 板前によるトイレ設置をプラグイン化する #devops #itamae](http://qiita.com/tbpgr/items/10e48679e6535cd1adf8)|2014/10/16 22:07:55|1|
|9|[Itamae  resource plugin で 板前によるトイレ操作機能を追加する #devops #itamae](http://qiita.com/tbpgr/items/6fd0610b5ccfd3b1770a)|2014/10/17 22:59:09|0|
|10|[Itamae  ssh コマンドでリモートプロビジョニング #devops #itamae](http://qiita.com/tbpgr/items/78aa0d01c6eefb98a9c9)|2014/10/10 22:09:39|0|
|11|[Itamae  vagrant オプションで Vagrantにトイレを設置 #devops #itamae](http://qiita.com/tbpgr/items/491dafe00643d3331b82)|2014/10/14 22:12:55|0|
|12|[Itamae  vagrant-itamae plugin で Vagrantにトイレを設置 #devops #itamae](http://qiita.com/tbpgr/items/24787ba14dd3d3903ef1)|2014/10/14 22:20:39|3|
|13|[Ruby  Itamae の gem を探知するソナー itamae-sonar で Plugin を検索する #ruby #itamae](http://qiita.com/tbpgr/items/a52886522c053ccc9b09)|2014/12/04 23:49:58|3|
|14|[Vagrant  Vagrant + Itamae で middleman 環境を構築し、 Vagrant Share で Vagrant Could に公開する #vagrant ](http://qiita.com/tbpgr/items/44135d1463d07c0489d4)|2014/11/21 00:20:50|3|
|15|[軽量・高速版 Chef 「Itamae」。 プロビジョニングツールの学習コスト低下。Berkshelfからの解放。Chef Solo から Chef Zero への移行からの解放 #devops #itamae](http://qiita.com/tbpgr/items/3b6796c1cfc3c3e5521f)|2014/10/09 22:18:08|22|
Itamae | ssh コマンドでリモートプロビジョニング #devops #itamae

# Itamae | ssh コマンドでリモートプロビジョニング #devops #itamae

## 概要
プロビジョニングツール Itamae 
ssh コマンドでリモートプロビジョニング。

## ssh コマンド仕様
ssh の help は以下。

~~~bash
$ itamae help ssh
Usage:
  itamae ssh RECIPE [RECIPE...] -h, --host=HOST

Options:
  -j, [--node-json=NODE_JSON]      
  -n, [--dry-run], [--no-dry-run]  
  -h, --host=HOST                  
  -u, [--user=USER]                
  -i, [--key=KEY]                  
  -p, [--port=N]                   
      [--ohai], [--no-ohai]        
      [--vagrant], [--no-vagrant]  
  -l, [--log-level=LOG_LEVEL]      
                                   # Default: info
      [--color], [--no-color]      
                                   # Default: true

Run Itamae via ssh
~~~

## 試行
### 仕様
* tree をインストールするだけのレシピを利用。

~~~
package "tree" do
  action :install
end
~~~

* 対象サーバーは、 192.168.33.99 とする。
* user は vagrant

### 実行

~~~
# ssh コマンドでローカル環境からプロビジョニング実行
$ itamae ssh -h 192.168.33.99 -u vagrant recipe.rb

# 192.168.33.99 に ssh 接続して tree のインストール結果を確認
$ vagrant ssh
$ tree --version
tree v1.5.3 (c) 1996 - 2009 by Steve Baker, Thomas Moore, Francesc Rocher, Kyosuke Tokoro
$ seq 10 | xargs mkdir
$ tree
.
|-- 1
|-- 10
|-- 2
|-- 3
|-- 4
|-- 5
|-- 6
|-- 7
|-- 8
`-- 9
~~~

## 参照
* [Itamae GitHub](https://github.com/ryotarai/itamae)
* [Itamae Vagrant GitHub](https://github.com/chiastolite/vagrant-itamae)
* [軽量・高速版 Chef 「Itamae」。 プロビジョニングツールの学習コスト低下。Berkshelfからの解放。Chef Solo から Chef Zero への移行からの解放 #devops #itamae](http://qiita.com/tbpgr/items/3b6796c1cfc3c3e5521f)
MessageVerifier を使えばパスワード再発行メールの実装が簡単になる

# MessageVerifier とは？
Rails 4.1 でアナウンスされた[新機能](http://edgeguides.rubyonrails.org/4_1_release_notes.html#message-verifiers)。だと思ってる人が多いですが、4.1 でオモテに出てきたというだけで実は結構前から埋もれてたっぽい。(3.0.20 では使えた)
cookie_session の実装に使われているので、その辺りのコードを掘ったことのある人はご存知と思います。

さて、「パスワード再発行メール」のよくある実装はこんな。

1. users テーブルに、 token と token_expire_at のカラムを用意
1. 64文字くらいのランダム文字列を生成して token にセット
1. token_expire_at に有効期限をセットしてレコード保存
1. token を含むURLをユーザにメールで送信
1. ユーザがURLを開くと token がサーバに渡ってくるので、 ``User.find_by(token: token)`` でユーザを引っ張ってくる
1. 有効期限を確認し、期限内であれば処理続行

users テーブルにカラムを2つ足すのがちょっとね。

これを、 MessageVerifier を使うと以下のように出来ます。

1. 64文字くらいの key を用意しておく。(システム全体で1つあればOK)
1. ``"[123,'2014/10/12 12:34:56']"`` という文字列(123 は user_id、日時は期限) を key で暗号化し、 100文字弱の token を生成。どこにも保存しなくてOK
1. token を含むURLをユーザにメールで送信
1. ユーザがURLを開くと token がサーバに渡ってくるので、同じ key で復号
1. user_id と期限が得られるので、期限内であれば処理続行

**token カラム要らない！！！**

注意点は、 key が漏洩すると token が偽造されてしまうということ。まああまり大きな問題ではないでしょう。

# やり方

Rails 4.1 以降

```ruby
class UserMailer < ActionMailer::Base
  def password_reset(user)
    token = Rails.application.message_verifier(:password_reset).generate([user.id, 1.day.since])
    mail(to: user.email, body: edit_password_reset_url(token))
  end
end

class PasswordResetController < ApplicationController
  def edit
    user_id, expire_at = Rails.application.message_verifier(:password_reset).verify(params[:token])
    # ごにょごにょ
  rescue ActiveSupport::MessageVerifier::InvalidSignature
    # invalid token
  end
end
```

それ以前

```ruby
PASSWORD_RESET_KEY = 'hogefugahofefuga....'

class UserMailer < ActionMailer::Base
  def password_reset(user)
    verifier = ActiveSupport::MessageVerifier.new(PASSWORD_RESET_KEY)
    token = verifier.generate([user.id, 1.day.since])
    mail(to: user.email, body: edit_password_reset_url(token))
  end
end

class PasswordResetController < ApplicationController
  def edit
    verifier = ActiveSupport::MessageVerifier.new(PASSWORD_RESET_KEY)
    user_id, expire_at = verifier.verify(params[:token])
    # ごにょごにょ
  rescue ActiveSupport::MessageVerifier::InvalidSignature
    # invalid token
  end
end
```
どっちでも簡単ですね。
あー過去の実装全部コレで書き直したい。。。

# ちょっと気になっていること
デフォルトの digest method が SHA1 なんだけど、 SHA1オワコン説を考慮したほうがいいのかどうか。

```
ActiveSupport::MessageVerifier.new(PASSWORD_RESET_KEY, 'SHA256')
```
で指定は出来るのだけど、何を指定すればいいのやら。
KxSMBの使い方


iOSからWindowsのファイル共有機能にアクセスするまでをつらつらと書いていきます。

## サンプルプロジェクトの起動まで

https://github.com/kolyvan/kxsmb

上記のURLにアクセスし、プロジェクトをダウンロードする。(git cloneでも可)

ターミナルでダウンロードしてきたプロジェクトのルートに移動し、`rake`コマンドを実行する。

```
cd kxsmb
rake
```

すると、ターミナルにズラーーーっとログが流れるのでしばらく待つ。
終わったら、サンプルプロジェクトを起動する。

## Windowsにアクセスする

### Windows側での作業

- Wi-Fiに接続する。(iOS端末と同一のWi-Fiに接続する必要があります。)
- コマンドプロンプトを開き、`ipconfig`と入力し、Enter。
- 表示されたログの中の、`IPv4アドレス`の部分に表示されているIPアドレスを控えておく。

※自分の環境の場合、`Wireless LAN adapter ワイヤレス　ネットワーク接続`の部分に記載されていたもので通りました。

### Xcode側での作業

- 2014/10/10現在、本来UIAlertView上に表示されるTextFieldが表示されないので、`TreeViewController`の`192行目辺り`に直接`_newPathField`にパスをセットする処理を記述した。


```objectivec
_newPathField.text = @"smb://Windows側の作業で控えたIPアドレス/";
```

### クライアント側での作業

- 起動時に表示されるアラートでGoをタップすれば接続される。
- 接続後、`SMB Authorization`という画面が表示されるので、値を入力してDoneをタップする。

以上の手順でiOSからWindowsにアクセスすることが出来ます。

## サンプルプロジェクトでできること（仮）

このサンプルプロジェクトでは＋ボタンをタップすると新規フォルダを`New Folder`という名前で作成します。

また、ファイルを選択するとDownloadすることも出来ます。
jpgの場合、ダウンロードした時点で画面下部に画像が表示されました。
OpenFL(Haxe)の拡張モジュールを作るのも割と簡単


#まえがき
なぜか続いた拡張モジュールシリーズ。

ちょっと前に試してたのが発掘されたので。
正直、自分でもあんまりよくわかってないけどOpenFL周辺は日本語情報が全然ないのでとりあえず書く。

#準備する

どれが必要なライブラリか忘れたけど、このあたりがあれば拡張は作れる。無いなら`haxelib install LIBNAME`

```
➜  ExtensionExample git:(master) ✗ haxelib list
haxelib_client: [3.1.0-rc.4]
hxcpp: [3.1.39]
hxlibc: [1.1.4]
lime-tools: [1.5.7]
lime: [1.0.1]
openfl: [2.0.1]
```

#スケルトン生成
Limeでもコマンドでスケルトンが作れるので実行するだけ。

`lime create extension TestExtension`

`TestExtension/project/common`にC++のソースがあるのでいい感じにいじってください。今回は取り敢えずスケルトンのママ進める。

#拡張モジュールのビルド
`cd TestExtension/project`に移動して`haxelib run hxcpp Build.xml -DHXCPP_M64`

`HXCPP_M64`の部分はほかプラットフォームだと変わるはず。何にかはしらない。

#リンクを貼る
`TestExtension/ndll/Mac64/TestExtension.dylib`
は出来るんだけど.ndllが必要って後に怒られる。
`ln -s TestExtension/ndll/Mac64/TestExtension.dylib TestExtension/ndll/Mac64/TestExtension.ndll`
とすればとりあえず解決できる。正しい解決方法は知らない。

#OpenFLから呼ぶ
TestExtensionがあるディレクトリにTestAppを作る。その中にMain.hxとproject.xmlを作る。それぞれ中身は以下。

```Main.hx
class Main {
    public static function main(){
        var t = new flash.text.TextField();
        t.text = Std.string(TestExtension.sampleMethod(42));
        flash.Lib.current.addChild(t);
        trace(t.text);
    }
}
```

```project.xml
<?xml version="1.0" encoding="utf-8"?>
<project>
    <meta
        title="TestApp"
        package="me.labe.testapp"
        version="1.0.0"
        company="Laurent Bedubourg"
    />
    <app
        main="Main"
        path="Export"
        file="TestApp"
    />
    <source path="." />
    <haxelib name="openfl" />
    <include path="../TestExtension" />
</project>

```

#TestAppのビルド、実行
TestAppに移動して、`lime test cpp`で画面に味も素っ気も無いウインドウが表示されたら完成。

#あとがき
リンク貼るあたりが残念。というか前やった時はこの手順やった記憶ないんだけどなあ。識者のアドバイス求む。
作業途中の変更内容を保存する

以前、[gitの作業状態を他のリポジトリにコピーする](http://qiita.com/nysalor/items/247447b1c695ac2891e1)という記事を書きましたが、これは既にリポジトリに追加していあるファイルのみ有効で、まだ一度もステージしていないファイルについてはコピーできませんでした。最近、別のやり方でステージングしていないものも含めて変更内容を保存する方法を思いついたので書きます。

```~/.gitscripts``` 以下に ```git-xxx``` というシェルスクリプトを作成することで ```git xxx``` というサブコマンドを追加できます。今回はそれを利用して ```git port``` というコマンドを作成します。

```bash:git-port
#!/bin/sh

date=`date "+%Y%m%d-%H%M%S"`
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
host=`hostname -s`

git checkout -b "wip-${date}"
git add .
git add -u

git commit -m "[WIP] temporary commit from ${branch} on ${host}"
```

[gistにも投稿しています](https://gist.github.com/nysalor/9c984314eb12e4b441b0)。

このシェルスクリプトは、 ```WIP-日付-時刻``` というブランチを作成し、現在の変更内容をコミットします。（WIPはWork In Progressの略です）
作成されたWIP-xxブランチをリモートにpushして、差分を移したい他の作業環境に移動したら、元のブランチとこのブランチの両方をpullします。
そして差分を適用したいブランチに切り替えて、このコミットをcherry-pickすれば、差分をそっくり適用することができます。
適用した後は ```git reset HEAD^1``` でコミットを取り消せば、最新のコミットからの差分がステージされていない状態になるので、以後は作業を続行して任意のコミットを重ねることができます。
ただし、リモートリポジトリを経由するのでCIを設定している場合にビルドが走ってしまうなどの弊害はあるので注意して下さい。
【Android】adb shell date は System User or radio Groupじゃないと反映されない


ちょっと前に書いた記事の続き。

**[【Android】Terminalから端末時間を変更する - adb shell date](http://qiita.com/operandoOS/items/144315014228fd954a00)**

## date.cの実装

[toolbox配下](http://tools.oesf.biz/android-4.4.4_r1.0/xref/system/core/toolbox/)の**[date.c](http://tools.oesf.biz/android-4.4.4_r1.0/xref/system/core/toolbox/date.c)**の実装を確認してみました。
http://tools.oesf.biz/android-4.4.4_r1.0/xref/system/core/toolbox/date.c#118

```c
fd = open("/dev/alarm", O_RDWR);
ts.tv_sec = tv.tv_sec;
ts.tv_nsec = tv.tv_usec * 1000;
res = ioctl(fd, ANDROID_ALARM_SET_RTC, &ts);
//res = settimeofday(&tv, NULL);
if(res < 0) {
    fprintf(stderr,"settimeofday failed %s\n", strerror(errno));
    return 1;
}
```

まあ予想はしていましたが、**/dev/alarm**に書き込んでる。

## /dev/alarmのPermission

ということで、/dev/alarmのPermissionを確認してみた。

```
root@vbox86p:/ # ll /dev/alarm                                                 
crw-rw-r-- system   radio     10,  54 2014-10-10 20:57 alarm
```

ふむふむ。
system userが持ち主で、radio groupなら読み書きできると。
その他のuserは、読み込みだけですね。

## まとめ

普通にadb shellで入るとdateコマンドの実行は反映されないのは、Permissionの問題ということです。
**adb root**等でRoot権限になればshellからでも変更できます。