OmniAICreator/Qiita-1.07M huggingface dataset:
AWSアカウントに連携したMFA（２段階認証）端末が故障・紛失した場合の復旧について

## はじめに
趣味開発で自分用のAWSアカウントをお持ちの方はけっこういらっしゃると思いますが、そうした際に自分しか使わないためアカウントは１つ（IAMでそんな複数アカウント作らない）で、MFA（２段階認証）はせっかくだし有効可しとこうってことがよくあるかと思います。

そしてMFAで登録したデバイスが突然故障したり、紛失してしまうことなんかがあるともうアカウントに入れなくて＼(^o^)／ｵﾜﾀ状態になることがあると思います。

・・・というか自分なんですけどね(´；ω；｀)ﾌﾞﾜｯ

この記事はそんな事態になったときのアカウントへのログインができるようになるまでの忘備録です。
参考サイトでは日本語で解決する方法がありましたが、自分の拙い英語でもなんとかサポートの人と会話できて計１０分くらいで復旧まで持っていけたので、急ぎの必要がある場合なんかは参考にしてみてもらえればと思います。

## 手順
### MFAのサポートページから情報を入力
https://aws.amazon.com/forms/aws-mfa-support

2016/12/3現在でのフォームでは下記のような情報が必要だったので入力してSubmitしました。

```
Problem with Authentication Device
My device was lost, stolen, or damaged.

Primary phone number
+81-90-19xx-xxxx

Secondary phone number
空でOK

Country associated with your phone number
Japan(日本)
```

### 英語のサポートからの電話対応
送信してから１０分くらいでシアトルから電話がかかってきます。
臆せずに電話をとりましょう。

他にもちょっと会話ありましたが要約するとだいたいこんな感じの会話内容でした。

```
saku) Hello. My iPhone broken, so I can't login my AWS management console.
saku) Please help me.

AWS)  OK. What your AWS accont id?
saku) My aws account id is hoge@example.com.
 (ここであなたのAWSアカウントの登録メールアドレスを答えてください)

AWS)  And please tell me your mobile phone number.
saku) OK. My phone number is 090-19xx-xxxx
 (ここであなたの電話番号を答えてください)

AWS)  OK, I send you to email, and say passcode which write in email.

saku) OK, I'll check email.
saku) Let me see...
saku) Oh, I recieved email which subject is 'Your AWS Inquiry'
saku) Passcode is XXXX XXXX.
 (ここであなたのメールアドレスに送付されたパスコードを答えてください)

AWS)  OK, I disable your MFA login, please try login again.
saku) I can logged in! Thank you very much!!
```

ポイントは３つ
 1. AWSのログイン用ID（メールアドレス）を答える
 2. 電話番号聞かれるので答える
 3. 確認用メールが送られてくるのでそのメールに記載された認証コード（自分のときは８文字の英字でした）を答える

上記を答えると、サポートの人がMFAを無効化してくれるのでログインを試してみましょう。
無事ログインできたなら成功です。
サポートの方に最大限の謝辞をのべましょう(∩´∀｀)∩

いちおう参考までにサポートから送付されたパスコードのスクショを貼っておきます。
<img width="576" alt="Your_AWS_Inquiry.png" src="https://qiita-image-store.s3.amazonaws.com/0/34824/30a8ed1a-3fb2-e58a-1246-3ff34f23887b.png">

###参考サイト
* [iPhone5sの交換からAWSコンソールへログインできなくなって復活したところまでの顛末](http://blog.mittostar.info/2014/07/13/iphone5s%E3%81%AE%E4%BA%A4%E6%8F%9B%E3%81%8B%E3%82%89aws%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%B8%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3/)

## おわりに
MFA（二段階認証）の情報の移行とかってけっこう面倒ですよね。
というか備えをしてないと本当に面倒なことになるなぁ、と身を持って体験しました（^^;
これを機に [Authy](https://www.authy.com/) へ乗り換えもしましたが便利ですね！
Authyかわいいよ、Authy。

あと最近ストックのボタンの位置が目立たないところに移動したので、万が一のときのために保持しておきたい方はご注意いただければと思います。
公式の告知はこちら。
http://blog.qiita.com/post/153200849029/qiita-like-button
教材用計算機オブジェクト　Java版

先にアップしたVBS版の計算機オブジェクト操作に続いて、Java版の計算機オブジェクトです。

---
はじめは加減算電卓の抽象オブジェクトです。kotaeという実数変数を用意して静的操作を重ねていきます。ゲッターメソッドをあえて用意していないので、電卓.tasu(0.0)を働かせて戻り値を吐き出させます。
kotae = 0.0; のコードをコンストラクタとして明確にすると、さらによい教材になります。
実際の実習では、目の前で示します。
 
~~~Dentaku1.java
public class Dentaku1 {
  Double kotae = 0.0;
  public Double tasu(Double kazu) {
    return kotae += kazu;
  }
  public Double hiku(Double kazu) {
    return kotae -= kazu;
  }
}
~~~

---
加減算計算機オブジェクトDentaku1を操作するサンプルプログラムです。

~~~Dentaku_Sousa1.java
public class Dentaku_Sousa1 {
  public static void main( String args[] ) {
  	Dentaku1 d1 = new Dentaku1();
	d1.tasu(5.0);
	d1.hiku(2.0);
    System.out.println("答は" + d1.tasu(0.0));
	
	Dentaku2 d1 = new Dentaku1();
	d2.tasu(7.0);
	d2.hiku(d1.tasu(0.0));
    System.out.println("答は" + d2.tasu(0.0));
  }
}
~~~
2つの計算機d1とd2を実体化（インスタンス化）し、計算をさせ答えを表示させる単純なコードです。d1とd2の連係操作をしています。
要領が分かった段階で、各実習者に実習コードは任せます。

---
続いてはDentaku1を継承して、乗算と除算機能も付け加えた四則演算計算機を定義します。

~~~Dentaku2.java
public class Dentaku2 extends Dentaku1 {
  public Double kakeru(Double kazu) {
    return kotae *= kazu;
  }
  public Double waru(Double kazu) {
    return kotae *= kazu;
  }
}
~~~
これを呼び出せば四則演算できます。
逆に言えば、kakeru()メソッドとwaru()メソッドもDentakuクラスに入れてしまえば、このような回りくどいことをする必要はないわけで、これが教材としての方便です。

---
では、Dentaku2の操作プログラム例です。

~~~Dentaku_Sousa2.java
public class Dentaku_Sousa2 {
  public static void main( String args[] ) {
  	Dentaku1 d1 = new Dentaku1();
	d1.tasu(5.0);
	d1.hiku(2.0);
    System.out.println("答は" + d1.tasu(0.0));
	
	Dentaku2 d2 = new Dentaku2();
	d2.tasu(5.0);
	d2.kakeru(2.0);
    System.out.println("答は" + d2.tasu(0.0));
  }
}
~~~
このようにd1インスタンスは加減算しかできませんが、d2は加減乗除ができます。
オブジェクト指向プログラミングの実感的理解はこのような実習を積み重ねて深めさせていきます。
NSAttributedStringのお手軽Extension


# はじめに

UILabelの行間を調整したり、見た目をカスタムするときによくお世話になるNSAttributedStringですが、指定するKeyをよく忘れるし、指定方法が面倒なのでお手軽Extensionにしてみました。

# 実装

行間調整などについてはNSParagraphStyleなので、Extensionはそれぞれ追加しました。
メソッドチェーンで繋げて書けるようにしてあります。

```swift:
public extension NSMutableAttributedString {
    public func setFont(font : UIFont, range : NSRange) -> Self{
        addAttribute(NSFontAttributeName, value: font, range: range)
        return self
    }

    public func setTextColor(color : UIColor, range : NSRange) -> Self {
        addAttribute(NSForegroundColorAttributeName, value: color, range: range)
        return self
    }

    public func setBaseLineOffset(offset : CGFloat, range : NSRange) -> Self {
        addAttribute(NSBaselineOffsetAttributeName, value: offset, range: range)
        return self
    }

    public func setLetterSpacing(letterSpacing : CGFloat, range : NSRange) -> Self {
        addAttribute(NSKernAttributeName, value: letterSpacing, range: range)
        return self
    }

    public func setParagraphStyle(style : NSParagraphStyle, range : NSRange) -> Self {
        addAttribute(NSParagraphStyleAttributeName, value: style, range: range)
        return self
    }
}

public extension NSMutableParagraphStyle {
    public func setLineHeight(min min : CGFloat, max : CGFloat) -> Self {
        self.minimumLineHeight = min
        self.maximumLineHeight = max
        return self
    }

    public func setTextAlignment(alignment : NSTextAlignment) -> Self {
        self.alignment = alignment
        return self
    }

    public func setLineBreak(lineBreakMode : NSLineBreakMode) -> Self {
        self.lineBreakMode = lineBreakMode
        return self
    }

    public func setLineSpace(lineSpacing : CGFloat) -> Self {
        self.lineSpacing = lineSpacing
        return self
    }
}
```

## 使用例

下記のようにすっきり書けました。

```swift:
let string = "テスト"
let attributedString = NSMutableAttributedString(string: string)
                .setFont(14, range: NSMakeRange(0, string.length))
                .setLetterSpacing(2.0, range: NSMakeRange(0, string.length))
                .setParagraphStyle(NSMutableParagraphStyle()
                    .setLineHeight(min:20.0, max:20.0)
                    .setTextAlignment(.Center), range: NSMakeRange(0, string.length))
label.attributedText = attributedString
```

## おまけ

UILabelでラベルの高さを取得したい場合は`boundingRectWithSize`をよく使用しますが、AttributedTextで高さを取得したい場合のUILabelのextensionです。

```swift:
public extension UILabel {
    public var attributedLabelFrame : CGRect {
        get {
            guard let attributedText = self.attributedText else {
                return .zero
            }
            return attributedText.boundingRectWithSize(CGSizeMake(self.frame.width, self.frame.height), options: .UsesLineFragmentOrigin, context: nil)
        }
    }
}
```
git submoduleの自分メモ

Railsの上にWordPressを置きたかったのでsubmoduleでやってみた。

まずはメインリポジトリとサブモジュール用のリポジトリ、どちらも普通にリポジトリ登録。


メインリポジトリでsubmoduleを登録する

```
git submodule add リモートリポジトリ パス
```


RailsでWordPressを動かす場合パスは public/blogとか



addしてcommitしておく



本番でcloneする

```
git submodule update --init
```



もしサブモジュールに更新があったときは

```
git submodule foreach git pull origin master
```

で最新版をpullしてこれる


stashはこれ

```
 git submodule foreach 'git stash'
```
コンパイラとは何かについての簡易メモ

## コンパイラについてのメモ

### 概要
コンパイラとは人が書くプログラムを機械語に変換するプログラムのこと

人が使えるプログラミング言語（例えばjavaやphp）は、あくまで人が使うための言語で、機械が直接理解できるものではない。
人が書いた処理を機械に実行してもらうためには、機械に理解できるように変換しなければならない。その変換処理が記述されたプログラムがコンパイラー。

ちなみに、compilerを日本語に訳そうとすると、意味として最初に出てくるのは「編集者」という意味。
「人が書いたプログラムを編集して機械語に訳すもの」とすると覚えやすいかも。ただやっていることは編集というよりも変換なので注意。
最近の(ごく自分の周りだけの)Slack活用について

サァアドベントカレンダーの11日目です！！

きょうは技術ネタと言うよりは開発する上でのコミュニケーションにフォーカスした話をしようと思います。

さくらでは前からSlack勢がこっそり活動していましたが、今年7月の組織改定でよりフラットな体制になったと同時にSlackが標準のコミュニケーションツールとして利用されるようになりました。そんなさくら(の自分の周り)ではどのようにSlackが使われているかを簡単に紹介したいと思います。

# チャンネルについて

たくさんありますのできれいには分類できませんが、おおざっぱにいえば以下のようなチャネルが存在しています。

- 大きい単位のくくり、恒常的に存在する系
    - サービスごとのチャンネル（たとえばVPSとかレンタルサーバーとか）
    - 組織体制でいうところのグループごとのチャンネル
    - 常時発生しているタスク(運用など)のためのチャンネル
    - 社内業務の問い合わせ窓口としてのチャンネル
- より細分化されたチャンネル、短期間のことが多い
    - 開発している機能ごとのチャンネル（つぎにVPSに追加される○○機能とか）
    - 社内社外のイベント対応用のチャンネルなど
- 個人用のチャンネル
    - 分報や気付いたことをメモする自分専用のチャンネル
- 趣味のチャンネル
    - 完全に業務外の物もありますが、特定の言語や技術についてのチャンネルとか

（いまみると734個のチャンネルが存在してます）

## 個人用のチャンネルとは

個人用とは言えその人しか参加できないという物ではないです。いつでもオープンになっており、だれでもウェルカムになっています。`times_username` というチャンネル名で作られています。
基本的にはその人と一緒に作業することが多い人が参加しています。

次のような使い方が多いです。

- 今何をしているのか誰に報告するでもなく垂れ流す
- ちょっとした気づきをメモ感覚で書き込む
- プロジェクトのチャンネルに書くほどではない話題を会話するときにつかう
- 個人的にヒットしたネタを書き込むと共感してくれる人が現れる可能性が、
- 困ったことがあれば書き込んでおくと誰かがヒントをくれたりします

Slackに個人用のチャンネルがあることで、相手がいま空いている時間帯かどうかや書き込むほどの話題かどうかといったことを気にせずに、気軽に会話/議論することができるのでより円滑なコミュニケーションにつながっているのでは、と感じています。

# ツールについて

## Botたち

たくさんのBotが動いていますが、主な物を紹介します。

- 仕事支援系
    - サイボウズガルーンに登録されているスケジュールを教えてくれるBot
    - 日々の情報共有（勤怠の連絡や作業状況など）の時間になると各メンバーに発言するように司会進行するBot
    - ○○の在庫状況を教えてくれるBot
    - すぐに忘れちゃう資料のありかを教えてくれるBot
- ちょっとしたツール系
    - Wikipedia / Uncyclopedia を検索して結果を教えてくれる
    - 画像検索してくれる
    - 雨雲が近づいてきたら教えてくれる
    - 電車の遅延状況をお知らせしてくれる

などなどです。

# そして技術ネタへ

個人的には Botは [BotKit](https://github.com/howdyai/botkit) を使って作ることが多いです。
BotKitでslackのBotを作る記事はいくつかありそうなのでここでは紹介しません。
と思いましたが、機会があれば[次回](http://qiita.com/t-mimura/items/d6541ec596bdebea5a7b)はBotの作り方について書きたいと思います。

それでは良いクリスマスを！！ 🎄
オフラインリアルタイムどう書くE10 の問題

@Nabetani さんが主催するオフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/53794 )で問題を出させてもらいました。

問題は「塗って繋ぐ」という名前で、詳細は
http://mtsmfm.github.io/2016/12/03/doukaku-e10.html
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
似たような問題をもっと解きたいという方は、Doorkeeper の コミュニティページ
http://yhpg.doorkeeper.jp/
に @Nabetani さんの過去問リンク集がありますので、そちらをご覧になると良いと思います。
CSSからSassへ、そしてCSS設計を導入した流れ

みなさんスタイルシートはどのように管理していますか？
今日は私が辿ったCSSの管理についてお伝えできればと思います。

# 5000行のCSSを1つのスタイルシートに書いていた
一番最初にWebサイトを作ったときは全部のページのCSSを一つのスタイルシートに読み込んでいました。
今思えば、無駄なコードも多くて保守管理などもってのほかです。

# SassとGulpを導入して、ページごとにスタイルシートを作成
数回の案件を乗り越えて、SassとGulpを導入しました。
ここで、ページごとに初めてスタイルシートを分けることを覚えたので、比較的保守管理しやすくなり、事故が減りました。
ベンダープレフィックスも自動で付与をしてくれるので、Sassとgulpはなんて便利なんだと感動したのを覚えています。

# 命名規則にBEMを採用
命名規則に特にルールがなかったので、いくらSassでスタイルシートを分けたところで最終的には、ひとつのCSSファイルが読み込まれるので、予期せぬスタイルの崩れが起きることがありました。
なので、命名規則にBEMを設けることで、更に事故率が減りました。

# CSS設計のFLOCSSを導入
ここまでディレクトリ管理などはなにも考えてなかったんですが、CSS設計を導入し、更に保守管理しやすくしようと思い、命名規則にMindBEMdingを採用されていて、コンポーネント思考なFLOCSSを導入しました。
どのディレクトリにどの関連のスタイルがあるかも一目瞭然になりました。そして、コンポーネントを作成し、スタイルの使い回しが多くなったことで、無駄なコードを大幅に減らすことができました。

# 最後に
まだCSS設計や命名規則、gulpの導入などしていない人は、是非導入を検討してみてください！
自分の.gitignoreさらす

タイトルの通り。

```
###### Editor debris ########

*.org
*~
¥#*

# spyder
.spyderproject/

# pycharm
**/.idea/

###### Python debris ########

*.pyc


###### Impl. specific debris ########

*.log

# tensorflow
*events.out.tfevents*

# waf/maf
.waf*
.lock*
**/build/
wscript*.py

###### Work routines debris ########

**/build/
output/
work/
```
【PHP】変数

この記事は[PHP総復習カレンダー](http://qiita.com/advent-calendar/2016/php_beginner)2日目の記事です！
時はすでに12月3日ですが細かいことは気にしない＼(^o^)／

2日目は変数についてです！
PHPというよりプログラミングの共通の概念に近いですが、おさらいしていきましょう！

## 変数とは
変数は、「値をしまっておく箱」のようなものです。1度しまった値を別のところで取り出したり、新しい値を代入して再利用したりします。

PHPでの変数の宣言（変数の作り方）は、 `$` をつけます。

```php
<?php

$name = 'chan-toku';

echo $name;	// 'chan-toku' と表示される

$num = 1;

$num = $num + 1;

echo $num;		// 2と表示される
```

数値(integer)に `''` は必要ありません。 `''` でくくって数値を書く場合は、文字列(string)として扱われます。
計算や制御が意図しない結果になることがあるので注意しましょう！

変数名は、小文字多文字を区別し、先頭に数字はつけられません。

```php
<?php

$name = 'chan-toku';

$Name = 'ちゃんとく';	// $nameとは別物

$article_title = 'PHP総復習カレンダー';	// '_'で繋げることができる

$2day = '変数';	// エラーになります
```
## 変数のスコープ
変数のスコープは、その変数を扱える場所、呼び出せる場所です。
クラスや関数内で定義する際の「ローカルスコープ」と、どこからでも呼び出せる「グローバルスコープ」があります。

### グローバルスコープ

```php
<?php

$days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];

foreach ($days as $day) {
	if ($day === 'Sat') {
		$message = '今日は土曜日!';
	}
}

echo $message; // '今日は土曜日!'

```

制御構造のブロック内で宣言された変数も、ブロック外やファイル外から呼び出すことができます。

### ローカルスコープ

```php
<?php

$date = '12月3日';

function tomorrow() {
	$date = '12月4日';
	echo $date;	// '12月4日'
}

echo $date;	// '12月3日';
```

クラスや関数内で変数を宣言しても、グローバルスコープの変数には影響しません。

## スーパーグローバル変数
ここまでの「ユーザーが定義し、定義後も値を書き換えられる変数」に対して、PHP実行時に自動的に定義され、スコープを問わず参照可能なスーパーグローバル変数があります。

`$_SERVER`, `$_COOKIE`, `$_SESSION`等々たくさんあるのですが、フォームで送信された値を受け取る時に使う`$_GET`の例を挙げてみます。

```php
<?php

// フォームからGETで'name=chan-toku'を送信した時

echo $_GET['name']	// 'chan-toku'
```

このように、`$_GET`を宣言していないのに、自動で値を定義してくれます。

## 変数のエラー
宣言していない変数を参照しようとすると、エラーが生じます。PHPには変数があるか調べる`isset()`があるので、状況に応じて使います。

```php
<?php

echo $name; // エラー

var_dump(isset($name)); // false

$article_day2 = '変数';

var_dump(isset($article_day2)); // true

if (isset($article_day2)) {
    $message = '2日目の記事を投稿しました！';
}
```


## まとめ
変数はプログラミングの基本。適当な名前をつけると予期せぬ上書きをしてしまったり、スコープを間違えると変数を参照できずエラーが生じたりします。
さらに変数名のつけ方には守った方がよいルールなどがあるのですが、別の日に可読性なんかの話と一緒にまとめようと思います！


今日か明日は私が関数について書きます！！！
Swift愛好会の一年を振り返ってみる

# Swift愛好会とは

Swift好きが集まってわいわい『楽しむ会』です。

レベル、経験等不問
- Swiftが好きな人！
- Swiftを好きになる予定の人
- むしろSwiftから好かれている人

大歓迎です。

---

# Swift愛好会１周年！

2016/11月でSwift愛好会は１周年を迎えました。
１周年を記念して[開発合宿](https://love-swift.connpass.com/event/43865/)も開催しています。
合宿の様子は[Swift愛好会アドベントカレンダー](http://qiita.com/advent-calendar/2016/love_swift)の４日目で報告します。

---

# Swift愛好会のルール

『とりあえず乾杯！』から始まります。

---

# 開催周期

月一回開催を目標に開催しています。
- 平日：談義
- 休日：耐久もくもく会＋談義

---

# 談義？

LTのようなものです。
LTとの違って談義は時間が『無制限』！
誰でもどんなネタでも好きなだけしゃべれます。

---

# 運営メンバー

jollyjoester：乾杯する人
n0bisuke：運営する人
afroscript：運営する人
tamiko：運営する人
ReikoGotou：運営する人
HimiSato：運営する人

---

# 始まったきっかけ

n0bisukeとafroscriptともうやんカレーを食べてたらやることになりました。

![top_10.jpg](https://qiita-image-store.s3.amazonaws.com/0/8868/4571cffb-b84f-e2d7-8be6-102dcc15b72e.jpeg "top_10.jpg")


---

# 初回開催

2015/11/14！
初回の談義はjollyjoesterによる『俺がSwiftを好きな理由』でした。

![12339595_1092909137410753_2722322693569028826_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/8868/6e66fc2d-8d64-bbf3-16dd-766bbd6a89ac.jpeg "12339595_1092909137410753_2722322693569028826_o.jpg")

---

# これまでの開催回数

12回

---

# 累積参加人数

たぶん500人くらい

---

# 最多出席者の出席回数

９回！（1２回中）

---

# 最多出席者

es_kumagai＆ichigoroさん

---

# 感謝のお二人へ

---

# 『すべて熟知Tシャツ』をプレゼントします！
これからもよろしくお願いします！

![Cvx0L4MUIAAXI5T.jpg](https://qiita-image-store.s3.amazonaws.com/0/8868/f31de697-c4a4-2014-48dd-2193829a061b.jpeg "Cvx0L4MUIAAXI5T.jpg")

---

# 出席回数上位ランカー

|順位|回数|connpass_id|
|---|---|---|
|１位|９回|es_kumagai, ichigoro|
|２位|８回|hirose_yudai, fumiyasac|
|３位|６回|kohei_tabata, shingo_tamaki_948|
|４位|５回|codelynx, DaisukeNagata|

---


# 最多談義回数

８回！（1２回中）

---

# 最多談義者

es_kumagaiさん

---

# 談義回数上位ランカー

|順位|回数|connpass_id|
|---|---|---|
|１位|８回|es_kumagai|
|２位|６回|hirose_yudai, fumiyasac|
|３位|５回|jollyjoester|
|４位|４回|kohei_tabata|

---

# 皆勤賞

なし

（運営のjollyjoester、afroscriptが１回お休み）

---

# 最長談義時間

１時間20分（es_kumagaiさんかkishikawaさん）

---

# 称号

|称号|connpass_id|
|---|---|---|
|Swift界のプリンス|es_kumagai|
|UI番長|fumiyasac|
|スター乞食|hirose_yudai|
|ガジェット部長|shingo_tamaki_948|

---

# 会場提供

感謝！

|会場|回数|
|---|---|---|
|レバレジーズ|４回|
|dots.|３回|
|G's ACADEMY TOKYO|３回|
|21cafe|２回|

---

# 飲んだお酒の総額

だいたい15万円くらい

---

# 総括

みなさまに支えられて想像以上に盛り上がっtail！
『ゆるい、優しい、温かい、けど真剣』ってのがこの会の特徴かなと思います。
今後もSwift愛好会を続けていきたいです！

---

# 今後の目標

Swift界の住民の家（拠り所）となる！

Swift愛好会のメンバーで世の中を良くする！
- OSSへのコントリビュート
- 多くの人の役に立つライブラリ
- ドキュメントの翻訳
などなど

---

# 運営について

運営についての振り返りは[IT勉強会/コミュニティ運営 Advent Calendar](http://qiita.com/advent-calendar/2016/event-management)で書く予定です。

---

# Swift愛好会に興味がある方へ

ぜひ[グループ](https://love-swift.connpass.com/)に参加ください！

---

以上
SotaにWebSocketサーバを立て、ブラウザから操作する

# SotaにWebSocketサーバを立て、ブラウザから操作する

こんにちは。ヤマロボエンジニアの鵜澤です。

今回は、ヴィストン株式会社が販売しているコミュニケーションロボットSotaに、Javaで作ったWebSocketサーバーを立ててみました。

## 動作している感じ

ブラウザから起動するラジコン的な何か

[![SotaServer](http://img.youtube.com/vi/F_x_msVC1dw/0.jpg)](http://www.youtube.com/watch?v=F_x_msVC1dw)

## 概要

Sotaに登録できるアプリケーションは`jar`の形式で、
`java -jar アプリケーションjarファイル`で実行できるようにする必要があります。
`MANIFEST.MF`でクラスパスを指定すれば、Sota内部のライブラリを読み込むこともできますが、今回はサーバー、Sota用ライブラリ等全てが入った、`実行可能jar`を作成していきます。

使ったソースは[`yamarobo/SotaServer`](https://github.com/yamarobo/SotaServer)に上がっています。
`WebSocket`サーバがクライアントから受け取ったメッセージに応じて、
`CRobotMotion`を通じてSota命令を出すような構成にします。

ソースはこちらから入手可能です。
ソースをクローンしてきたら中に入り、`gradle build`を実行すると`build/libs`以下にjarが作成されます。
あとはSotaにjarを登録すれば、ポート`3000`にブラウザでアクセスすると画面が表示されます。

[関連記事](http://qiita.com/yamarobo/items/5c71336b4dfa4c6c3c3e): Sotaへのアプリケーション登録方法を書いた過去の記事です。

## 内容

開発環境は以下です。

* Java8: version "1.8.0_102"
* Eclipse: Version: Neon.1a Release (4.6.1)
* Gradle 3.2

`WebSocket`のサーバとしては`jar`にまとめる必要があるため軽量なサーバである`jetty`を使います。ビルドは`gradle`を使って、`jetty`関連の`jar`をプロジェクトに追加しています。

## 作動させる

[`yamarobo/SotaServer`](https://github.com/yamarobo/SotaServer)からソースをクローンしてきてください。
クローンしたソースの`gradle.build`を作動させて`jar`を作成します。
`build`タスクを実行すると、サーバを単独実行するのに必要なものが一つにまとまった`jar`が作成されます。

転送方法などは過去の記事を参照ください。

配置完了後、再起動すると背中のボタンから登録したアプリを実行できます。
実行後、ブラウザからSotaの`IP`にポート`3000`でアクセスすると、画面が表示され、WebSocket通信が開始されます。

プルダウンからコントローラを選んで、アクションをさせてみましょう。
サンプルにはいくつかの決まったアクションの他に、`manual`アクションというものがあり、Sotaの各関節の値をブラウザから操作できるようになっています。

各関節の可動範囲の制御は一応行なっていますが、組み合わせによっては接触の恐れがあるため、まずは200くらいの幅で作動させてください。

## 感想

vstoneMagicの命令ブロックにはTCP/IPのサーバが用意されているみたいです。。。

読んでくださりありがとうございました。

## 参考

* WebSocket - http://qiita.com/supertaihei02/items/b5d55f5d73ada010d6d1
ビジービーバー関数と神託

[チューリングマシン](https://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%9E%E3%82%B7%E3%83%B3)は習ったと思う。
無限の長さのテープの上を動く、記憶を持った、テープを書き換えられる機械。
わからない人はwikipediaを読むと良いと思う。多分わからなくなる。

[神託機械](https://ja.wikipedia.org/wiki/%E7%A5%9E%E8%A8%97%E6%A9%9F%E6%A2%B0)とは、
神託（オラクル、ある種類の問題を1ステップで解く概念上の装置）を持つチューリングマシンである。

例えば巡回セールスマン問題のようなNP困難クラスに属する問題も、「巡回セールスマン問題を解くオラクル」を持つ神託機械にかかれば1ステップで解決される。

実際には今のところそんな便利なものはないので、巡回セールスマン問題は定数時間どころか多項式時間で求めることは不可能だし、近似解を求めるので人類は精一杯である。

[ビジービーバー関数](https://ja.wikipedia.org/wiki/%E3%83%93%E3%82%B8%E3%83%BC%E3%83%93%E3%83%BC%E3%83%90%E3%83%BC)のような、計算不能関数でさえ、神託としては仮定できる。

ビジービーバー関数とは、計算不能関数である。
nを入力として持つビジービーバー関数はΣ(n)と書かれることが多く、
Σ(0)=0、Σ(1)=1、Σ(2)=4、Σ(3)=6、Σ(4)=13、…である。

ビジービーバー関数とは、
・0と1をテープを使って読み書き可能な、
・n個の状態を持つことができるチューリングマシンが
・有限個の1をテープに書き
・有限時間内に終了状態になるときの
・1の個数Σ(n)（もしくはそれまでのステップ数S(n)）
である。

つまり、全て（[4(n+1)]^2n個）のチューリングマシンをシミュレーションして、上の条件をみたす1の個数を求めればいい。[^2]
[^2]: このように計算可能と思われるが、[4(n+1)]^2n個のチューリングマシンをシミュレーションして、それが有限個の1をテープに書いて、「停止する」かを判断できる基準がない(停止性問題)ので、実は「計算可能」ではない。
はい。
お疲れ様でした。
ビジービーバー関数の値がわかりました。

だから、Σ(0)=0、Σ(1)=1、Σ(2)=4、Σ(3)=6、Σ(4)=13が知られている。
それならば、ビジービーバー関数を与えてくれる神託機械があれば何ができるか。

S(n)のビジービーバー関数は停止するまでの最大ステップ数を与える。
そしてビジービーバー関数はその定義から有限である。
そして「実用上の電子計算機はチューリング機械よりも遥かに複雑であり、また有限の記憶領域しか持たないが、『計算機で原理上解ける問題』は『チューリング機械で解ける問題』と同じであるといわれている。」[出典:Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%9E%E3%82%B7%E3%83%B3)

これを使って、フェルマーの最終定理を証明する。
反例を1つ見つけることで証明できるフェルマーの最終定理などは、フェルマーの最終定理を検証するプログラムを書き、それをチューリングマシンに実装する。
もしもフェルマーの最終定理の反例を見つけたら止まるプログラムを実装した場合、（反例を見つけ）有限ステップで終了するか、（フェルマーの最終定理は正しいため反例を見つけず）無限ステップ実行され続けるかである（排中律）。

今までだと、フェルマーの最終定理の反例はどこにあるか全く見当がついていない。
だからフェルマーの最終定理の反例が見つからなかったとしても、もしかしたら1ステップ後に見つかるかもしれないと、待ち続ける。
でも、ビジービーバー関数は有限の値を持つ。
ビジービーバー関数の値が有限だということは、ビジービーバー関数の値よりも多いステップ数を実行してなお停止していない「フェルマーの最終定理の反例を見つけるプログラム」は無限ステップ実行され続ける。
だから、ビジービーバー関数だけのステップを計算して、「フェルマーの最終定理の反例を見つけるプログラム」が停止すれば反例を見つけ、停止しなければフェルマーの最終定理が正しいという結果が得られる（なお、n=6で7.4×10^36534ステップ以上である）[出典](https://arxiv.org/pdf/0906.3749.pdf)。

ビジービーバー関数は便利。

神託は便利。

みなさんも神託を使いましょう。

<br>
<br>
<br>
<br>
<br>
<br>
ここからは、便利な神託の使い方の話。
<br>
<br>
Gott würfelt nicht.

数年前、進路を迷っていた。
サイコロを振ったら3が出たので、進路を東京大学に決めた。

その話をすると、「なんで自分で考えて決めなかったの？」といわれる。
考えなかったわけじゃない。考えた末、サイコロで決めることに決めているのだから。

東京大学に進学したくなかったし、他の大学に進学したいとも思わなかった。もちろん働きたくもなかったし、働かずに将来の不安に怯えることもしたくなかった。
しかも、進路なんて最適解が計算できるわけじゃない。
東京大学に行ったほうが平均年収は高いかもしれないが、優秀な人がいる環境に行ったら比べられてつらいに決まってる。少なくともそういう人はいる。

こんな難しい問題に対して、確信を持って選ぶことができるわけがない。
ネガティブで根に持つタイプは、
迷った末に自分で決めて、不幸になったら、その時の自分を恨むだろう。
他人に相談して決めてもらって不幸になったら、その人を恨むだろう。

だから、サイコロに進路を委ねた。
サイコロと投げることによって出目が決まる過程は美しい。
何を考慮するかとか、いつまでに決めようとか、そんな悩みを全てを圧倒する決定力がある。
誰にも左右できない力によって決められる美しさを思い出しながら、大学生活を送ることができる。

神託としてサイコロを使うとき、偶然に委ねるのは、文字通り神に委ねるのに似ている。
自分の命や進路を自分で管理するなんて恐れ多い。
サイコロは神（託）だ。

サイコロの目に従い不幸になったとしても、少なくともそれにより誰かを恨むことはない。
むしろ、違う選択肢を選んだ場合、もっと不幸になったかもしれないと思う。
サイコロを振った瞬間、選択を委ねたのだから、
Schreiben Sie Gott nicht vor, was er zu tun hat.
スライスしたスプライトの数だけプレハブ化せずに楽をする 


スプライトをスライスした数だけプレハブ化して、それぞれ `Instantiate` で作りたい数値を作成する方法だとプレハブ化する数が多いと大変です。

ひとつだけプレハブを作成しておいて、実行時に Sprite を差し替える方法だと用意するプレハブがひとつで済むので管理が楽になります。

## Sprite Editor でスプライトをスライスする

![スクリーンショット 2016-12-03 15.22.28.png](https://qiita-image-store.s3.amazonaws.com/0/1900/c95ef2dd-545c-2c66-97a4-5f7764293cc4.png "スクリーンショット 2016-12-03 15.22.28.png")

## プレハブをひとつ作る

スライスした数値のひとつを Hierarchy にドロップしてプレハブ化します。

このプレハブを実行時に `Instantiate` して複数の数値を作ります。SpriteRenderer コンポーネントの Sprite を差し替えることで任意の数値を作成します。

ここでは digit という名前でプレハブ化しました(下図)。

![スクリーンショット 2016-12-03 15.38.18.png](https://qiita-image-store.s3.amazonaws.com/0/1900/fdf280f8-0c88-c320-3843-1c2d52c7b4d1.png "スクリーンショット 2016-12-03 15.38.18.png")

## 実行時に SpriteRenderer のスプライトを差し替える

```csharp
using System;
using UnityEngine;

public class Main : MonoBehaviour
{
    void Start()
    {
        Sprite[] sprites = Resources.LoadAll<Sprite>("digits");
        var sprite = Array.Find(sprites, e => e.name == "digits_3"); // 「3」のスプライト

        var prefab = Resources.Load<GameObject>("Prefabs/digit");
        for (int i = 0; i < 3; i++)
        {
            var obj = Instantiate(prefab); // プレハブのクローンのインスタンスを作る
            obj.transform.position = new Vector3(i, 0, 0);

            // アタッチされている SpriteRenderer の Sprite を差し替える
            var renderer = obj.GetComponent<SpriteRenderer>();
            renderer.sprite = sprite;
        }
    }
}
```

実行すると、3 の数字が 3 つ作れています(下図)。

![スクリーンショット 2016-12-03 15.33.07.png](https://qiita-image-store.s3.amazonaws.com/0/1900/fe84b635-f40d-33bb-922b-1c570f923530.png "スクリーンショット 2016-12-03 15.33.07.png")

## 参考

- [ResourcesからスライスしたSpriteを取得する3つの方法](http://tsubakit1.hateblo.jp/entry/20131222/1387654182)

数値画像の素材は、[ぴぽや倉庫](http://piposozai.wiki.fc2.com/)さんからお借りしました。
Sotaに自作のjarを登録する方法

# Sotaに自作のjarを登録する方法

こんにちは。ヤマロボエンジニアの鵜澤です。

この記事では、ヴィストン株式会社が販売しているコミュニケーションロボットSotaに、Javaで作ったアプリケーションを登録する方法を紹介します。

## Sotaにアプリケーションを登録する。

公式ではSotaに自作のアプリケーションを登録する方法が二つ紹介されています。

1. [VstoneMagicを使ってみる](http://www.vstone.co.jp/sotamanual/index.php?VstoneMagic%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)
2. [Javaでプログラミングしてみる](http://www.vstone.co.jp/sotamanual/index.php?Java%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)

これらの方法には以下の特徴があります。

1の方法はアプリケーションの起動を、Sotaの設定モード > アプリの実行(背中の上下ボタン同時押し)から行えます。
アプリケーションはGUIでの作成になりますが標準で定義されている命令ブロックを使用すればかなりのことができるようです。
(例えばTCP/IPサーバー、クライアントの両方が用意されているみたいです [参考](http://www.vstone.co.jp/sotamanual/index.php?VstoneMagic%2F%E5%91%BD%E4%BB%A4%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF))
ただし、ある程度制約があることは許容しないといけません。


2の方法はアプリケーションをJavaで記述できるためかなり自由に作成できます。
しかしアプリケーションの実行は、`ssh`で接続し、エントリポイントとなるスクリプトを実行しないといけません。
ちょっと気軽に起動といった風にはできないです。

こういった経緯から、Javaで書いたアプリケーションをSotaのボタン操作だけで実行する方法を探してみました。

## (補足)SotaManager.jar

Sotaを起動するとデフォルトで`SotaManager.jar`というプログラムが起動しています。
このプログラムはSotaの設定モードなどの機能を提供しており、
今回行いたいアプリケーションの登録もこのプログラムに`jar`を認識させることで可能になります。

`SotaManager.jar`はSotaが起動した時に
`/home/vstone/vstonemagic/app/jar/app.properties`を読み込みます。
この中に`jar`の登録情報を追加してあげれば良いと推測できます。

`SotaManager.jar`による`jar`の起動は`java -jar`で行われます。
プロパティの記述にオプションを指定できる箇所があるみたいなので、それを利用することもできますが、今回は使いません。

またアプリケーションの選択時に再生される音声は、`jar`を配置したディレクトリにある`title.wav`という`wav`ファイルが使用されるのでそれも準備します。
これはウェブでテキストを`wav`に変換してくれるサイトがあるのでそれを利用しました。

## 準備

サンプルソースは[`GitHub`](https://github.com/yamarobo/HelloSota)からクローンしてきてください。

このリポジトリは次のものが含まれています；

1. `make_jar.sh`: ソースをコンパイルするためのシェルスクリプト
2. `src`: サンプルのソース
3. `sound`: アプリで使う音声ファイル
4. `title.wav`: `SotaManager`がアプリ起動時に呼び出す音声ファイル

## 手順

まずは`make_jar.sh`実行して`jar`ファイルを作成してください。必要な[ライブラリ群](https://github.com/vstoneofficial/SotaSample/tree/master/lib)のダウンロードも含まれますので1分くらい時間がかかります。

アプリケーションをSotaに登録するために必要なことは、
Sotaへのjarファイルの転送と必要なファイルの展開、設定ファイルに追記することです。
まずは転送と展開を行います。

### 転送と展開

Sotaにファイルを転送します。接続するためのユーザ、パスワード、IPなどの調べ方は[公式](http://www.vstone.co.jp/sotamanual/index.php)から確認してください。

`scp`等でファイルを送信します。
Sota内の`/home/vstone/vstonemagic/app/jar`以下に`HelloSota`というディレクトリを作成し、その中に`jar`を配置してください。

`/home/vstone/vstonemagic/app/jar/HelloSota`に移動し、`HelloSota.jar`の中から`title.wav`、`sound`を展開しておきます。

```sh
jar xvf HelloSota.jar title.wav sound
```

次に設定ファイルに追記します。

### 設定ファイルの記述

`/home/vstone/vstonemagic/app/jar/app.properties`に次の設定を追加します。


```propertiies
...
  app1.title=HelloSota
  app1.workingdir=HelloSota/
  app1.jar=HelloSota.jar
  app1.type=app
  app1.trigger=
  app1.triggeroption=
```

注意: `app1`の番号はすでに`app1`の設定が存在する場合は`app2`、という感じで適宜ずらしてください。

以上で登録が完了です。

Sotaを再起動し、背中のボタンを操作して「設定モード > アプリの実行」から登録したアプリケーションを起動してみてください。

## 感想

以下のことが嬉しいな、と思いました。

* アプリの起動がボタン操作なので、javaで作ったある程度複雑なアプリをエンジニア以外の人に使ってもらえる。
* ウェブに接続したり可能性が広がる気がする。

以上です、お付き合いいただきありがとうございます。
Linux MintにOracle 11g をインストールした後にやったこと備忘録

近いうちにOracle Databaseを使うことになりそうなので、Linuxが入ったPCにインストールしたんですが、データベースに接続するときに毎回コマンドを求められたり、ルート権限にログインしなければならなかったりでめんどくさかったので、シェルスクリプトにしてワンクリックで実行できるようにしました。

実行環境

- Linux Mint 18 64bit
- Oracle Database 11g XE

#データベースへの接続
データベースの接続をするのにroot権限に入った後に

    su - oracle

でoracleに入って、oracle_env.shを実行し

    sqlplus

SQLを起動できるんですが、毎回oracle_env.shを実行するのがめんどくさいしSQLを起動するのに2回もパスワードを求められるのが億劫だったのでシェルスクリプトへ

#シェルスクリプトの作成
Linuxでのシェルスクリプトは、.shのファイルです。
ここに 

    su
    su - oracle
    sqlplus

という内容のスクリプトを作成し実行したのですが、1行目のコマンドが実行されてパスワードを要求、rootに入れたのですが、2行目が実行されない...
exitでrootから抜けると2行目が実行されるも、rootから抜けているために認証できない...
どうしたものかと悩んだところ、隠しファイルになっている.bashrcにコマンドを入れるとパスが通って.bashファイルがある場所に入った段階でコマンドが
実行されるようでsu - oracleでここのディレクトリに移動した段階で、oracle_env.shの実行とsqlplusを実行すればいいのではと考えました。

#結局
シェルスクリプトは、

    sudo su - oracle

というコマンドで、oracleディレクトリに入ることにし、入った段階でsqlplusが起動できるように

    oracle_env.sh実行コマンド
    sqlplus

というコマンドを.bashファイルの最後に追記しました。

後は、スクリプトを起動するためのDesktopEntryを作ってワンクリックで起動

#追記
SQLPlusが.bashなくてコマンドの履歴が出ないでいろいろと不都合だったので、rlwrapというツールをインストールして.bashを

```
   rlwrap sqlplus
```
に変更

コマンドの履歴が見れるようになりました

#まとめ
もしかしたらこれだと使っていくうちに不便になるかもしれないのでそうなったら別の手を考えるしかないですね
githubのconflictをlocalで確認する

# conflictしちゃった...

![Screen Shot 2016-12-03 at 14.53.20.png](https://qiita-image-store.s3.amazonaws.com/0/119783/0a67514d-efac-b742-cf1e-67ef8433fe21.png)

！！！conflict発生！！！どうしよう。。。
と思い、github上で確認しようとしたものの、どこがconflictしているのか、さっぱりわからない。今回は他人のpull requestを確認していたので、どこがconflictしているかを確認して見ます。もっと手早く、どこがconflictをしているかご存知の方がいらっしゃったら、ぜひ教えてください。

# まずはremoteのbranchをlocalに取り込む
今回localに、conflictを起こしたbranchがなかったので、取り込みます。  
まず、remoteのbranchを確認。

```
git branch -r
```

  

```
git checkout -b 好きなbranch名 origin/取り込みたいremoteのbranch名
```

# localでmergeさせる
```
git checkout (マージされる方・取り込まれる方のbranch名)
```
```
git merge (マージする方)
```
# git pullしてみる
筆者はgit mergeする時点でconflictが出るかと思ったが、出なかった。

```
git pull
```

すると、conflictが起こった！
# conflictの確認
```
<<<<<<< HEAD
現在あなたが書いているコード
System.out.println("Hello boys");
=======
現在github上にあるコード
System.out.println("Hello girls");
>>>>>>> 01232123445677876543221123456787654321
```
やっと確認できた！

# まとめ
githubはconflictを起こしたことは教えてくれるが、どのコードでconflictしたのか教えてくれない。。。もっと簡単に調べる方法はないのだろうか？

## 参考文献
[Gitマージの基本　マージ・競合・競合解決・マージしなおし](http://qiita.com/LOUIS_rui/items/8e66f6f8f1a536830081) 閲覧日2016/12/03
[[初心者向け]git幼稚園児がgit小学生になるまでに覚えたコマンド（順次更新）](http://qiita.com/AK_fighter/items/11070fe87b8eb00f0879) 閲覧日2016/12/03
初心者のEJDBメモ③：DBを開く〜閉じる

# 概要
初心者がEJDBを簡単にまとめます。
概要の理解を最優先とするため、厳密な表記は省きます。

今回はDBを開いて閉じるまでの手順です。
EJDBの概要は[こちら](http://qiita.com/Level3Mark5/items/5c2a9d4a504228fef287)。

# EJDBライブラリの読込み
EJDBは、アプリケーションにとってローカルファイルの操作です。
アプリケーションは、EJDBのライブラリを利用してファイルの操作を行います。

EJDBパッケージのインストール、ライブラリの導入は[概要編](http://qiita.com/Level3Mark5/items/5c2a9d4a504228fef287)を参照。

# データベースを開く
openを使います。
返却値はDBのインスタンスです。

```
var EJDB = require("ejdb");

// DBファイルのopen
var jb = EJDB.open("データベース名"[, オープンモード][, コールバック関数]);
```

* データベース名
データベース名を指定します。

* オープンモード（オプション）
データベースを開くモードを指定します。
`|`で区切る事で複数指定可能です。デフォルトは`JBOWRITER | JBOCREAT`です。
  * JBOREADER … 読取専用
  * JBOWRITER … 書込み可能
  * JBOCREAT  … DBが無ければ作る
  * JBOTRUNC  … 中身を空にして開く

* コールバック関数（オプション）
データベースを開いた後に呼び出す、コールバック関数を指定します。  
 * 指定した場合 … openは非同期で動作
 * 指定が無い場合 … openは同期で動作

# データベースを閉じる
closeを使います。
すでにDBが閉じてる場合、何もしません。

```
var jb = EJDB.open("testdb");

// DBファイルのclose
jb.close([コールバック関数]);
```

* コールバック関数（オプション）  
エラーを受け取るコールバック関数を指定します。

```
// DBファイルのclose
jb.close(function(err){
    console.log(err);
});
```
複数のcsvファイルを結合するシェルスクリプト（1個目のファイル以外は1行目を削除）

[複数のcsvファイルを結合するバッチ（1個目のファイル以外は1行目を削除）](http://qiita.com/mihonak/items/dd8e49737bac09f66d00)
を書きましたが、
シェルスクリプトでも書いてみました。

```bash:join.sh
#!/bin/sh

counter=0

for file in `\find . -maxdepth 1 -name '*.csv'`;
do
	echo $file
	if [ $counter == 0 ]; then
		cat $file > result.csv
	else
		sed -e '1d' $file >> result.csv
	fi
	counter=`expr $counter + 1`
done

read -p "Press [Enter] key to resume."
```
Extreme learning machineを実装してみた

## Extreme Learning Machine (ELM) とは?

ELMは特殊な形式のフィードフォワードパーセプトロンです。隠れ層を1層持ちますが、隠れ層の重みはランダムに決定し、出力層の重みを擬似逆行列を使って決定します。イメージ的には、隠れ層はランダムな特徴抽出器を多数作って、出力層で特徴選択をしてやるといった感じです。

ELMは次のような特性を持っています。

* 解いているのは単なる擬似逆行列なので、高速に解を求めることができる
* 凸な問題（局所解がない）
* 任意の関数を近似可能（普通のパーセプトロンと同じ)
* 任意のactivationが使用可能（微分できる必要なし）

## 実装

```python
import numpy as np


class ExtremeLearningMachine(object):
    def __init__(self, n_unit, activation=None):
        self._activation = self._sig if activation is None else activation
        self._n_unit = n_unit

    @staticmethod
    def _sig(x):
        return 1. / (1 + np.exp(-x))

    @staticmethod
    def _add_bias(x):
        return np.hstack((x, np.ones((x.shape[0], 1))))

    def fit(self, X, y):
        self.W0 = np.random.random((X.shape[1], self._n_unit))
        z = self._add_bias(self._activation(X.dot(self.W0)))
        self.W1 = np.linalg.lstsq(z, y)[0]

    def transform(self, X):
        if not hasattr(self, 'W0'):
            raise UnboundLocalError('must fit before transform')
        z = self._add_bias(self._activation(X.dot(self.W0)))
        return z.dot(self.W1)

    def fit_transform(self, X, y):
        self.W0 = np.random.random((X.shape[1], self._n_unit))
        z = self._add_bias(self._activation(X.dot(self.W0)))
        self.W1 = np.linalg.lstsq(z, y)[0]
        return z.dot(self.W1)
```

## テスト

とりあえずirisで試してみる。

### 方法

```python
from sklearn import datasets

iris = datasets.load_iris()
ind = np.random.permutation(len(iris.data))

y = np.zeros((len(iris.target), 3))
y[np.arange(len(y)), iris.target] = 1

acc_train = []
acc_test = []
N = [5, 10, 15, 20, 30, 40, 80, 160]
for n in N:
    elm = ExtremeLearningMachine(n)
    elm.fit(iris.data[ind[:100]], y[ind[:100]])
    acc_train.append(np.average(np.argmax(elm.transform(iris.data[ind[:100]]), axis=1) == iris.target[ind[:100]]))
    acc_test.append(np.average(np.argmax(elm.transform(iris.data[ind[100:]]), axis=1) == iris.target[ind[100:]]))
plt.plot(N, acc_train, c='red', label='train')
plt.plot(N, acc_test, c='blue', label='test')
plt.legend(loc=1)
plt.savefig("result.png")
```

### 結果

![result.png](https://qiita-image-store.s3.amazonaws.com/0/152362/66ebcd00-9351-7465-1be9-d01260344506.png)

### 結論

* いじるパラメータが少ないので普通のニューラルネットワークよりもチューニング楽そう
* 汎化性能が高いとか元論文にかいてあったが、普通にオーバーフィッティングする。
* fitもtransformもめちゃくちゃ高速なので、いろいろと用途がありそう。
Oracleのrow_numberとDISTINCTを組み合わせて使うと重複が排除されない。

DISTINCTとrow_numberを合わせて使うとDISINCTの前にrow_numberが行われるためか、同じレコードで違う連番が振られてしまう。

下記のようなテーブルがあったとして、sectionとその連番を取得したいとする。

Staff

|section  |department  |id |
|---|---|---|
|A  |1  |001|
|A  |2  |002|
|B  |1  |003|
|B  |2  |004|


SQLはこんな感じ。

```
SELECT DISTINCT
       section
     , row_number() OVER (PARTISION BY section
                          ORDER BY section) section_cnt
  FROM Staff
```


上記のSQLだと、DISTINCTを実行する前にrow_numberが実行されてしまうため、下記のような検索結果になってしまう。

|section  |section_cnt |
|---|---|
|A  |1  |
|A  |2  |
|B  |1  |
|B  |2  |

本当は下記のように検索したい。

|section  |section_cnt |
|---|---|
|A  |1  |
|B  |2  |



一旦、DISTINCTで取得したデータから連番を取得することで、重複を排除した後の連番が取得できる。

```
SELECT T1.section
     , row_number() OVER (PARTISION BY T1.section
                          ORDER BY T1.section) section_cnt
  FROM (SELECT DISTINCT
               section
          FROM Staff
       ) T1
```
Rails5.1に向けてフロントエンド周りで起こっている革命まとめ

こんにちは

Rails5.1に向けて、DHHの[jqueryを依存から外す発言](https://github.com/rails/rails/issues/25208)を発端にフロントエンド周りが急激に発展しているので、簡単にですがまとめてみました。
各issue, PRの詳細には踏み込みませんが、知見に溢れているので読んでみるの推奨です。

間違い、足りないものがあったら編集リクエストお願いします。

- jQuery依存を無くす話が出る
    - [rails(issue): Drop jQuery as a dependency](https://github.com/rails/rails/issues/25208)
- jquery-ujsはjqueryに依存しないようにする
    - [jquery-ujs: Drop jQuery as a dependency](https://github.com/rails/jquery-ujs/pull/474)
    - "jquery"-ujsじゃなくなったので名前変更
        - [rails-ujs](https://github.com/rails/rails-ujs)誕生
- 実際にRailsからjquery依存がなくなる
    - [rails: Drop jQuery as a dependency](https://github.com/rails/rails/pull/27113)
- jsライブラリを入れる方法がnpmパッケージを使う流れに
    - new時にnpm環境を整えてくれる`--yarn`オプションを追加
        - [rails: Add Yarn support in new apps using --yarn option](https://github.com/rails/rails/pull/26836)
        - [yarn公式](https://yarnpkg.com/)
        - 最初は`--npm`だったのだけど、「yarnの方がいいよね」ってことで`--yarn`になった
        - 諸々置き場所は`vendor/package.json`, `vendor/node_modules/`になる
            - [Yarn: Move node_modules, package.json, and yarn.lock file to vendor](https://github.com/rails/rails/pull/27245)
            - フロントエンドとは関係ないけど、`Gemfile`/`Gemfile.lock`もアプリルートじゃなくて`vendor/Gemfile`, `vendor/Gemfile.lock`に移したいって言ってる
                - https://github.com/rails/rails/pull/26836#issuecomment-263982088
    - sprockets4にnode_modules配下のパッケージへのパス解決追加
        - [sprockets: NPM support: Add support for resolving main from npm's package.json](https://github.com/rails/sprockets/pull/405)
- DHHが「5.1にwebpackを取り入れようかと思うんだけど（意訳）」って言い出す
    - 次のコメント以下を参照 https://github.com/rails/rails/pull/26836#issuecomment-264237397
    - webpacker gemを提案
        - [rails: Basic --webpack delegation to new webpacker gem](https://github.com/rails/rails/pull/27288)
        - [webpacker gem](https://github.com/rails/webpacker)
        - [webpacker gem簡単解説](http://qiita.com/itkrt2y/items/69c31e695b1b39915d00)
    - まだまだ方針が示されただけなので、貢献するチャンス満載です

Rails使っているフロントエンドガチ勢の方々、今が活躍するチャンスですよ！！！
Lubuntu 16.10 設定

## 自動ログイン

* [LightDM - Debian Wiki](https://wiki.debian.org/LightDM)

```/etc/lightdm/lightdm.conf.d/01_my.conf
[SeatDefaults]
autologin-user=ユーザ名
autologin-user-timeout=0
```

```
service lightdm restart
```

## その他

```bash:フォルダ名英語化
LANG=C xdg-user-dirs-gtk-update
```

## packages

```
sudo apt install -y \
 vino bash-completion tig ranger ack-grep autossh expect man-db

vino-preferences
gsettings set org.gnome.Vino require-encryption false

sudo apt install -y \
 thunderbird xfce4-terminal xfce4-screenshooter xtightvncviewer

sudo apt install -y \
 w3m nkf wget curl docker.io docker-compose
```

```bash:docker
sudo gpasswd -a ユーザ名 docker
```
【FileMaker】意外と敷居が高いらしい - スクリプトトリガ - OnModeEnterとOnModeExit

はい、今日は、[AdventCalendar 2016 FileMaker Tips](https://qiita.com/advent-calendar/2016/filemaker-tips/) 12/03の記事です。

今日は、スクリプトトリガの[OnModeEnter](https://www.filemaker.com/help/14/fmp/ja/html/script_trigg.36.17.html#433271)と[OnModeExit](https://www.filemaker.com/help/14/fmp/ja/html/script_trigg.36.18.html#433321)です。

まずは、どういう動きか、↓でどうぞ。
https://youtu.be/nCZGW3zosyk

レイアウトが切り替わった後と、切り替わったレイアウトから抜ける時（別のレイアウトへ移動する時）にかかるスクリプトトリガです。

今回の例では、印刷レイアウトに移動した際にグローバルフィールドを更新し、元のレイアウトに戻る際に印刷後の編集としてグローバルフィールドの値を更新しています。

グローバルフィールドのデータセット確認として、元のレイアウトに「印刷文言」を表示していますが、確認用なので、実際には不要なこともあります。
![スクリーンショット 2016-12-03 14.35.15.png](https://qiita-image-store.s3.amazonaws.com/0/60538/1dd73212-c819-3bf3-d681-8f579c2c8ee4.png)

仕込むときは、移動した先のレイアウト（今回の場合は印刷レイアウト）の設定になります。

レイアウトを切り替えた際に動くOnModeEnterは、「レイアウト設定」のスクリプトトリガでOnModeEnterで動くスクリプトを指定します。
![スクリーンショット 2016-12-03 14.37.22.png](https://qiita-image-store.s3.amazonaws.com/0/60538/630a9fd2-1eea-341b-5310-0586c82782d5.png)

レイアウトを抜ける時（別のレイアウトに切り替わる直前）に動くスクリプトトリガOnModeExitで動くスクリプトも同様に指定します。
![スクリーンショット 2016-12-03 14.37.48.png](https://qiita-image-store.s3.amazonaws.com/0/60538/ea6e6698-be4e-335b-3edc-c75d7a951860.png)

「印刷」ボタンを作って、印刷が終わったらグローバルフィールドの更新を行えばいいじゃないか、という実装方法もありますが、このスクリプトトリガを使うメリットは、
・印刷するスクリプトは印刷するスクリプトで専念させる
・印刷が終わった後、レイアウトを切り替える際のみに必要となる処理をスクリプトトリガにまかせる
というような、仕様の切り分けが行えます。

なぜ仕様の切り分けが必要かというと、印刷スクリプトでレイアウトを切り替える際の処理も入れてしまうと、印刷後レイアウトを切り替える処理のみに仕様変更が入った場合に、不要なミスを埋め込みやすいということがあります。
これは、小さなことですが、修正するときは不要な箇所を触らない、というメリットもあります。

もちろん、レイアウト切り替えを行わない印刷後の後処理の場合は今回のスクリプトトリガOnModeExitは使えませんので、別スクリプトにするなどの対策が必要です。

ということで、本日はレイアウトの切り替えで使えるOnModeEnterとOnModeExitをお送りしました！
最低限のセキュリティ対策（WEB）

   <img src="https://qiita-image-store.s3.amazonaws.com/0/142313/5254eef7-0659-2605-55d2-1fa0de10d746.jpeg" width="100%" height="400"alt="不正アクセス画像"><br>
#引用/参考書籍
「Webアプリエンジニア養成読本」

#最低限のセキュリティ対策（WEB）<br>
WEBアプリを制作する上で最低限気を付けなければ<br>
ならないセキュリティについての学習です。<br><br>
不正なアクセスやトラブル、またユーザの操作<br>
によって第三者に被害を与えてしまうことを防ぐ、<br>
セキュリティの確保がWebアプリにも必要です。<br>
ここで、代表的なセキュリティホールを2つほど<br>
紹介し、対策を考えていきます。<br>
ちなみに運用時のサーバにおけるセキュリティ<br>
対策も必要ですが、今回は触れません。<br><br>

##XSSの概念と対策<br>
クロスサイトスクリプティング（XSS）とは、<br>
ユーザがフォームなどで情報を入力する<br>
Webアプリがあり、入力→送信されたデータを<br>
再びユーザにHTMLとして描画する際に<br>
不適切な処理を行っている為に<br>
何かしらの攻撃に繋がってしまうことを<br>
指します。<br>
最も顕著なのが、<br>
他人のWebサイトへ、悪意のあるスクリプトを埋め込むこと。<br>
JavaScriptのコードが埋め込まれているテキスト<br>
を「そのまま」HTMLとして描画すると、<br>
意図せず実行されてしますケースです。<br>
開発者側としてはマークアップされていない<br>
文章をフォームに入力してもらいたいはずが、<br>
そこにJavaScriptのコードが書かれていたら<br>
どうでしょう。<br>
JavaScriptが実行されることを応用すると、<br>
ブラウザに保存されているクッキーの値を取得したり<br>
表示を強制的に書き換えたり、勝手にデータを送信<br>
したりという可能性があります。<br><br>


###セキュリティホール①<br>
「危険」なのでXSS対策を行う<br>
基本的には、ユーザーから投稿されたテキスト<br>
に書かれたHTMLのタグを実行させないために、<br>
文字列をｻﾆﾀｲｼﾞﾝｸﾞ（ｴｽｹｰﾌﾟ）させます。<br><br>
※ｻﾆﾀｲｼﾞﾝｸﾞ：入力データの無害化。<br>
※ｴｽｹｰﾌﾟ：特殊文字を適切な文字列に置換。<br><br>
たとえば、<br>
HTMLではタグを**<　**と**　>**でくくりますが、<br>
それらを文字参照を使い**&amp;lt;**と**&amp;gt;**に変換<br>
させてやるのです。<br>
するとWebブラウザはタグと解釈はせずに、<br>
**<　**と**　>**を表示してくれます。<br>
HTMLｻﾆﾀｲｼﾞﾝｸﾞは、Webアプリケーション<br>
フレームワークの「テンプレート」という<br>
機能にデフォルトで導入されていて、<br>
とくに意識せずとも「勝手に」ｻﾆﾀｲｼﾞﾝｸﾞ<br>
されていることが多いですが、<br>
それに頼るだけでなく、XSSの原理と<br>
対策を把握しておくことが大事。<br><br>
自分でやるには、まず前提として<br>
「サーバーサイドのプログラム言語（PHP、Ruby等）」<br>
を使える事が必要です。<br><br>
**具体的な対策のやり方**<br>


ユーザーが入力した値（テキストやaタグ（URL）、imgタグ（画像）に対して）<br>
をそれぞれのプログラム言語に<br>
用意されている。関数に通せば済みます。<br>
例としてPHPとRubyの関数を紹介します。<br>

**PHP**

```php:htmlｻﾆﾀｲｽﾞ
htmlspecialchars($str, ENT_QUOTES, ‘UTF-8′);
```

```php:a,imgタグ
if (substr($_POST['url'],0,10) == "javascript:") {
  die("Illegal URL!\n");
}
```

**Ruby**

```ruby:htmlｻﾆﾀｲｽﾞ
sanitize(文字列 [, tags => "許可するHTMLタグ名", attributes => "許可するHTML属性名"])
```

<br>

##CSRFの概念と対策<br>
CSRFはクロスサイトリクエストフォージュリ<br>
の略で、悪意ある人がユーザに被害を与える<br>
攻撃方法です。<br>
攻撃を受けた場合、勝手に掲示板へ書き込み<br>
をしたり、クレジットのオンライン決済を<br>
したりという可能性があり「危険」です。<br>

###セキュリティホール②<br>
CARFを防ぐ為に、一つは、<br>
フォーム表示する際、**type**属性の値が<br>
**hidden**である**input**要素の値に、<br>
セッションIDなどの攻撃者が知り得ない<br>
秘密の文字列を入れて、webアプリ側で照合することです。<br>
XSSと同じく、フレームワークが対策用の<br>
機能、ライブラリを提供しているので、<br>
実装する場合はそちらを使うとよいです。<br><br>
※「hiddenフィールドは画面には表示されず，<br>
　複数のWebページ間でデータの受渡しを<br>
　行う際に利用されるHTMLフォーム項目である。」<br><br><br>


わたしのような個人制作者は、セキュリティの部分<br>
など、疎かにしてしまいがちです。<br>
自分で注意し、自分や第三者が困る事のないよう<br>
心掛けたいところです。<br>
vvvvのライセンスについて

#vvvvのライセンスについて
下記、公式のホームページを参考にまとめました。
https://vvvv.org/licensing


#非商用での利用
__非商用での利用は無料です__
非商用かどうかは厳密には決めておらず、グレーな領域をあることも認識ているため、
ユーザーの良心を信じているというのが開発元の方針。

#商用での利用
##Full license
__1ライセンス　500ユーロ__

__期限__：購入日から1年までの最新バージョンは、永久に使える。
　　　購入日から1年後、更新があったバージョンは割引で追加購入可能。

__1ライセンスの考え方__
・一度に起動できるPCのライセンスは一台分


##weekly license
__1ライセンス　200ユーロ__
__期限__：7日間。7日間における最新のバージョンまで有効となる。


__1ライセンスの考え方__
・Full licenseと同様に、一度に起動できるPCのライセンスは1台分

##OEM
vvvvを利用して製品など生産品を作っている場合など、
エンドユーザーが直接vvvvを使用したアプリケーションなどを行わない場合。

公式の購入ではなく、__メールで金額を相談する。__
上述の公式のlicenseのリンクに記載されているメールに送り、相談する。

#割引
4ライセンス以上同時購入する場合、複数購入による割引があります。

#コピープロテクション「protektor」
プロジェクトのコピープロテクションをかけるためのUSBドングルとして__「protektor」__があります。

__1ライセンス　125ユーロ or 11ユーロ__
フルライセンスで現在使用中のライセンスと合わせて購入できます。
短期間の利用では、リースがあります。

__購入方法__：メールにて問い合わせをし、購入する。

※ 価格において、125ユーロで差があるのですが、
　気にせず選んで的なことが書いていますが、これは・・・罠？w
　コピープロテクションについて知らなかったので、今度買ってみようかと思います。


#おわりに
導入含め、無料で機能制限なくvvvvをはじめられるところがとても良いところです。
ライセンスを購入しなくても、開発者が関知するところはないかもしれませんが、
今のような使用環境の維持や、さらなる開発を支援していくためには、
ライセンスによる購入が開発者にとっては支えになっているはず。

商用利用を考えている方は、しかるべき時に是非導入していただけたらと思います。


__Enjoy your Patching Life!!__
変数について

##ローカル変数
`name = takuto`
スコープは、定義されたブロック、メソッド、クラス、モジュールの定義の終わりまで。
##グローバル変数
`$name`
スコープは、プログラム全体。つまり、どこからでも呼び出せるため使用には注意が必要。
Packer初心者がお送りするトラブルシューティング

packerを触りたての時に発生したエラーを共有します。

# インスタンスにt2.micro選んだらVPCなんちゃらって言われた

まずpackerを動かしてみたいから、VPC設定はなしにして
安いt2.microで実行してみよう！
→エラー

~~~
==> amazon-ebs: Error launching source instance: VPCResourceNotSpecified: The specified instance type can only be used in a VPC. A subnet ID or network interface ID is required to carry out the request.
==> amazon-ebs: 	status code: 400, request id:
~~~

## 原因

t2系のインスタンスはVPC内でしか起動できない。
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/t2-instances.html

## 対策

t2系インスタンスを使いたいのであれば、packerでVPC内にインスタンスが作成できるように設定を行う。
VPC内にインスタンスを作る必要がないのであれば、VPC不要のインスタンスを選択。m3系とか。
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-vpc.html#vpc-only-instance-types

# sudoできない旨のエラー

~~~
sudo: sorry, you must have a tty to run sudo
~~~

## 原因

ssh_ptyがfalseになっている。

## 対策

ssh_ptyの値は、デフォルトが`false`なので、packerの設定ファイルで`true`にする。
https://www.packer.io/docs/templates/communicator.html#ssh_pty

~~~
...
  "builders": {
    ...
    "ssh_pty": true
  }
}
~~~

# コマンドラインでsudoしたらエラー

以下のように、コマンドライン上で`sudo`を行うと、

~~~
...
  "provisioners": [
    {
      "type": "shell",
      "inline": ["sudo echo foo"]
    }
  ]
}
~~~

きっと以下のエラーが出迎える。

~~~
sudo: sorry, you must have a tty to run sudo
~~~

## 原因

`Defaults requiretty`が有効になっている。

## 対策

/etc/sudoersの`Defaults.requiretty`をコメントアウトする。

~~~
...
  "provisioners": [
    {
      "type": "shell",
      "inline": ["sed -i -e 's/^\\(Defaults.*requiretty\\)/#\\1/' /etc/sudoers", "sudo echo foo"]
    }
  ]
}
~~~
集計時、グループ内の種類のカウントをするSQL

SQLでグループ内の種類をカウントしたい場合は以下のようにすると、取得できる。

COUNTでNULLをカウントされない仕様を利用しているから、データベースによっては利用できないかも。
(Oracleだと使える。)

社員テーブルの部内の課の種類の数をカウントしている。

```
sample.sql

SELECT 部
     , COUNT(DISTINCT CASE WHEN 課 = 'ABC'
                           THEN NULL
                           ELSE 課 END) 課件数
     , COUNT(社員ID) 社員件数
  FROM 社員
 GROUP BY 部
```
FTPでログイン失敗でハマったのでメモ

# FTPでログイン失敗からの解消をメモ
## FTPでログイン失敗する
###こんなエラーが出てた

```
hoge:~ hoge$ ftp <リモートIP>
Connected to <リモートIP>.
220 Hello. FTP server ready.
Name (<リモートIP>:hoge): hogehoge
331 Please specify the password.
Password:
530 Login incorrect.
ftp: Login failed
```

認証に失敗してる感じでした。。。

最初からホストに対して２１番接続OKだったので、こんな感じで切り分け
１．単純にOSユーザのパスワード設定ミス
２．/etc/vsftpd/vsftpd.conf等設定ファイルの設定ミス
３．PAM認証で失敗している

###OSユーザのパスワード設定ミスを確認
実際にログインして、`/var/log/secure`で、ログ確認

パスワードミスの場合は下記のようなログが出てくるはず。。。
が、今回は出てきてなかったので、これではなかった。。。。

```shell:/var/log/secure
vsftpd[****]: pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=<ユーザ名> rhost=<リモートホスト>  user=<ユーザ名>
```

次！

###vsftpd.conf等設定ファイルの設定ミス
これは色々なサイトを参考に下記ファイルを確認。。。

```
chroot_list
ftpusers
user_list
vsftpd.conf
```

問題はなさそうな感じでした。

次！！

###PAM認証で失敗している

```shell:/var/log/secure
vsftpd[****]: pam_tally2(vsftpd:auth): user <ユーザ名> (<ID>) tally 49, deny 6
```

このログのみ出ていた。。。
よくよく調べるとpam_tally2でログイン失敗しまくるとロックがかかることが判明
`deny 6`なので、６回失敗したらロックがかかる仕組み
調べるとこんな感じ

```
# pam_tally2 -u <ユーザ名>
Login           Failures Latest failure     From
<ユーザ名>             49         <日付>   <リモートIP>
```

49回失敗しちゃってるから、ロックがかかってしまってログインできない。。。
ので、失敗回数をリセットしてあげます！

```
# pam_tally2 -u <ユーザ名> --reset
Login           Failures Latest failure     From
<ユーザ名>              0
```

失敗回数０になったことを確認！

ログインしてみると。。。

```
hoge:~ hoge$ ftp <リモートIP>
Connected to <リモートIP>.
220 Hello. FTP server ready.
Name (<リモートIP>:hoge): hogehoge
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
```

解消！！！(๑•̀ㅂ•́)و✧
Ruby on Rails 4からRuby on Rails5にアップグレードした時の修正箇所まとめ

また同じ作業を行う機会があるかもしれないので、Railsのバージョンを上げる際に行ったことをメモしておこうと思います。

# 変更したRuby on Railsバージョン
Version 4.2.7.1 → Version 5.0.0.1

# バージョンアップに伴って修正した箇所
## Gemのバージョン・依存関係を修正
Version 4.2.7.1のGemfileの内容でBundle install or Bundle updateすると、バージョンが古くて依存関係が解決できないという趣旨のメッセージが表示される。
そのため、表示されたメッセージに従ってGemfileのバージョンを修正すると解決。

## turbolinksを無効化している部分のlink_toパラメータの書き換え
turbolinksの仕様変更に伴い、JavaScript（JQUERY）のイベントが発火しないページがあったため、

【Rails4】
```
<%= link_to "リンク", new_hoge_path, { "data-no-turbolink" => "false" } %>
```

【Rails5】
```
 <%= link_to "リンク ", new_hoge_path , data: { turbolinks: false } %>
```
に変更。

## 「redirect_to :back」を「redirect_back」に変更
「redirect_to :back」はDeprecatedらしいので、「redirect_to :back」の部分は「redirect_back」に書き換え。

----- 参考URL-----
https://makandracards.com/alexander-m/39297-rails-5-improve-redirect_to-back-with-new-redirect_back-method


## 【Rspec】i18nが原因らしきエラーの発生
Rspecでテストを流した際に、
「**Hoge2rtranslation missing: ja.activerecord.errors.hoge1.event.attributes.hoge2.required**」
とエラーメッセージが表示され、一見、i18nの変換エラーかと思ったが、hoge2のモデルデータをFactoryGirl.create(hoge2)で作れば解決。

## 【Rspec】発生エラーの種類
```
expect do
  //テストコード
end.to raise_error( ActiveRecord::RecordNotUnique )
```
の「ActiveRecord::RecordNotUnique 」例外は
「ActiveRecord::RecordInvalid」
に変更されていました。
そのため、
```
expect do
　//テストコード
end.to raise_error( ActiveRecord::RecordInvalid )
```
に変更。

# 感想
修正はいろいろと原因を調べながら１～２日程度で完了。
思いのほか短期間で済んで良かった。
規模が大きいといろいろなエラーが連鎖的に出そうな・・
初心者のEJDBメモ②：データ構成編

# 概要
初心者がEJDBを簡単にまとめます。
概要の理解を最優先とするため、厳密な表記は省きます。

今回はデータ構成についてです。
EJDBの概要は[こちら](http://qiita.com/Level3Mark5/items/5c2a9d4a504228fef287)。

# データ管理の構成
## データベース
* データを管理する一番大きな単位  
* アプリケーションと同環境上にファイルで作成される

## コレクション
  * いわゆるテーブル  
    データを種別ごとに管理する
  * 例：「中古車管理」データベース
    * 「在庫車」コレクション
    * 「オーダー」コレクション

## ドキュメント
  * いわゆるレコード  
    データを管理する最小単位
  * jsonテキスト形式
  * key項目"_id"以外は自由なスキーマレス  

データ構成イメージ

```
"データベースA": {
  "コレクションA": {[
    { _id:固有のKEY1, 任意のデータ},
    { _id:固有のKEY2, 任意のデータ},
              :
    { _id:固有のKEYn, 任意のデータ}
  ]},
  "コレクションB": {[
    { _id:固有のKEY1, 任意のデータ},
    { _id:固有のKEY2, 任意のデータ},
              :
    { _id:固有のKEYn, 任意のデータ}
  ]}
}
```

# データ例
* 「中古車管理」データベース
  * 「在庫車」コレクション

```
    { _id: '0001',  
      maker: '日産',  
      name: 'スカイライン',  
      status: '貸出中'  
    },  
    { _id: '0002',  
      maker: 'ホンダ',  
      name: 'インテグラtypeR',  
      status: '修理中',  
      color: 'championshipホワイト'
    }  
```
持っていたら『おっ』と思われそうな公式グッズ。

#Apple
テーブルクロス
http://apple.corpmerchandise.com/custompage.aspx?cpn=productDetail&pid=42424

#Adobe
ソフト別のクッション
http://www.adobebrandedmerchandise.com/12x12-Pillow-Mnemonics-P159.aspx
まさかのルービック・キューブ
http://www.adobebrandedmerchandise.com/Mnemonics-Rubiks-Cube-P282.aspx
Adobeの傘っておしゃれですね。。
http://www.adobebrandedmerchandise.com/Rainbow-Umbrella-P184.aspx

#Google
Doodleのステッカーなんていいかも。
https://shop.googlemerchandisestore.com/Google+Redesign/Office/Stickers/Google+Doodle+Decal.axd

#Github
Githubはこれ一択でしょうね・・・
http://github.myshopify.com/products/atom-shirt

#Microsoft
エクセル大臣ぽい感じになれそう。
https://www.microsoftmerchandise.com/Shop#/product/T-Shirts/MIC011186-SW-I-Simply-Excel-T-shirt-Green

#Ruby on Rails 
なんかもうどれもっていても面白そうですね。
特に下着は。
http://www.cafepress.com/rubystuff/4904676

#HackforPlay
コメントアウトのロゴがいい感じ！
https://utme.uniqlo.com/jp/front/mkt/commodities/JIgWdCI?locale=ja