OmniAICreator/Qiita-1.07M huggingface dataset:
初心者によるPHP学習のすすめ

サーバーサイドプログラミング Advent Calendar 2017 25日目

サーバーサイドプログラミングの勉強を始めたばかりの素人ですが、私の勉強方法を共有しながら
「サーバーサイドプログラミングに興味はあるけど、まず環境構築でまずつまづいちゃうよ」
って人の背中を少しでも押して一緒に成長出来れば幸いです！

こういう方を対象です↓
・まず色々と環境構築の設定の仕方を調べたけど、そこで心折れちゃった。

私もそうなのですが「勉強しよう！」と思った時に勉強を始めたいのです。
（モチベーションを上げながら、最終的にドハマりするタイプ。）

そこで色々調べてみて下記のツールを利用する事にいきつきました。
「Progate」（https://prog-8.com/）

「Progate」とは
Web上でプログラミングを勉強できる無料学習ソフト
「HTML＆CSS」「JavaScript」「jQuery」「Ruby」「PHP」「Java」「Python」「Swift」「SQL」など幅広く学習できます。
よくある「動画で見て覚えて」という学習ソフトではなく、解説スライドと実際にコードを打ち込む練習スライドがセットになっているので、１つ１つのコードを確認しながら練習ができます。

このツールのおすすめポイント以下の通り
・環境設定の必要なし
・無料（無料会員登録が必要）
・練習画面と解説画面が一緒で分かりやすい
・見た目がおしゃれ
・いろいろなプログラミングにとりあえず触れられる

…そうです。このツールは私にぴったりだったのです。
似たようなツールを色々探しましたが、使いやすさで「Progate」を選びました。
今はPHPから初めてますが、少しずつモチベーションが上がってきている段階です。
う少しPHPを楽しんだら、本格的にPHPにのめり込んでいこうかと考えている今日この頃でした。

無料登録で始められるので、興味のある方はぜひご利用をおすすめします！
初投稿で緊張しましたが、また勉強報告なりなんなり投稿してみます。
自然非言語処理第２１日目： マルチモーダルな非言語処理（応用編）

![multi.jpg](https://qiita-image-store.s3.amazonaws.com/0/78052/9ed45a5a-4ee9-dff4-bb36-f64fb9a3ff03.jpeg)

みなさんは人と会話するとき、どうやって会話しますか？

電話を使いますか？
テレビ電話を使いますか？
それとも直接対面で話しますか？

これらにはどんな違いがありますか？

今回はそんな感じの話をしようと思います。

# マルチモーダル・インタラクションのメカニズム
先程の疑問なのですが、何が違うのかというと、

- 電話では聴覚のみで会話する
- テレビ電話では視覚と聴覚のみで会話する。体の一部しか見えない。
- 対面では視覚と聴覚はもちろん嗅覚でも相手の状態を知り、会話する。もちろん全身が見える。

ということで、感覚の種類が異なるということでした。

**めでたしめでたし。**

ではありません。

一見すると感覚がただ追加されただけのように見えますが、実は知覚や認識の面では大きく異なってきます。一番わかりやすい差は、テレビ電話では起こせても電話では起こせないMcGurk効果という現象[1]を起こすことができる点です。
McGurk効果とは人間の音声認識において視覚と聴覚を相互利用しているために通常ではありえないような刺激を受けると、聴覚での認識と異なった認識結果が得られるという現象です。たとえば、baという声を流しながら、映像ではgaという口の動きをさせた映像を見せると、daと聞こえてきます。
ちなみにわかりやすい動画はこちらになります。
https://www.youtube.com/watch?v=Fke7GWcT5ko

このように音声とは通常聴覚への刺激のみで認識していると思われがちですが、視覚への刺激も同時に使い認識していることが分かります。
さらに、実験参加者の目の動きを計測しながら、人が喋る映像を見せると、実験参加者は目を見るのではなく口の方を無意識的に見ていることがわかっています。つまり、音声認識では、無意識的に視覚が読唇術のようなことを行い、音声の認識を補完しているのです。
このように複数の感覚を利用する現象や方法を**マルチモーダル**と言い、その要素である感覚などのことを**モダリティ**といいます。

通常、人間は世界をマルチモーダルで認識しています。以前説明した近接学がなぜ応用編だったのかというと、近接学が運動、聴覚、視覚などのマルチモーダルで構成されるためだからです。逆に１つのモダリティのみで認識することは電話のようなかなり人工的に作られた環境でしか起こらないのです。もちろん認識だけではなく、われわれは会話においてもマルチモーダルに行動しています。たとえば、音声を出すためには、言語野で言葉を考えつつ、口を動かす運動をしながら、聴覚で音量などをフィードバック制御しつつ、ときには表情を作ったり、手を動かしたり、たくさんのモダリティを使って相手とコミュニケーションをはかります。

では、脳内ではどのようにマルチモーダルな非言語情報を処理しているのでしょうか。
一般的には連合野と呼ばれる部分で感覚情報を統合し、やり取りしています。たとえば、側頭連合野では聴覚と視覚を統合しています。このように感覚は統合されて認識を行います。ちなみに体性感覚と運動に関する連合野はありませんが、大脳皮質では隣にあり、脊髄で体性感覚と筋肉がつながっています。

# 実装： これまでのやつをごった煮にした人間っぽいもの
それでは人間では普通に行われているマルチモーダルインタラクションの仕組みを機械にも実装してみましょう。
今回はそれぞれの認識をモジュール化し、ROSでつなぐようにしましょう。

## 材料
開発用PC（Win） 1
動作用PC（Ubuntu） 1
Webカメラ 1
Unity 1
ROS 1
など

## ソースコード
**（時間があったらね）**

## 実験結果
これまでよりもコミュニケーションの幅が大きく広がったと思います。

# まとめ
今回は人間は複数の感覚をもとにコミュニケーションしているという話をしました。
では逆にマルチモーダルで情報が揃っていないと行けないはずなのに、モダリティが一部欠けてしまうと認識としてはどうなってしまうのかというクロスモーダル現象の話をします。

#参考文献
[1] McGurk, Harry; MacDonald, John (1976), “Hearing lips and seeing voices”, Nature 264 (5588): 746-748
KotlinではArrayListの最後のindexを取得するlastIndexというプロパティがある


ArrayListの最後のindexを取得する時、通常であれば次のように書くことが多いと思います。

```kotlin
val list = ArrayList<String>()
list.add("hoge")
println(list.size - 1) // 今までのやり方
```

このような`-1`のようなコードが出てくるとプログラムが理解しにくくなります。
よって自分では書かないか、意識しないで使える形になっている方が好ましいと思います。
kotlinではCollections.ktでArrayListにゲッタを追加する形で拡張されているので、次のようにしてArrayListの最後のindexを取得すること出来ます。

```kotlin
val list = ArrayList<String>()
list.add("hoge")
list.add("fuga")
println(list.lastIndex) // kotlinの拡張を使うやり方。実行結果は1
```

ちょっとしたことですが、プログラムがわかりやすくなりますね。

ちなみに定義は以下のように普通に`サイズ - 1`で実装されていました。

```kotlin:Collections.kt
/**
 * Returns the index of the last item in the list or -1 if the list is empty.
 *
 * @sample samples.collections.Collections.Lists.lastIndexOfList
 */
public val <T> List<T>.lastIndex: Int
    get() = this.size - 1
```
【Rails5.1】NginxでX-XSS-Protectionヘッダを指定するとChromeに怒られる


# 発生した事象
セキュリティ対策としてNginxにX-XSS-Protectionヘッダを入れたが、Chromeの開発者ツールでエラーが出る。

## 環境
- AWS
- Ubuntu 16.04
- Nginx
- Unicorn 5.3.1
- Rails 5.1
- Ruby 2.4.1

## エラー内容
Chromeの開発者ツールで以下のエラーが出ます。

```
Error parsing header X-XSS-Protection: 1; mode=block, 1; mode=block: expected semicolon at character position 14. The default protections will be applied.
```

## 原因
原因は、**NginxとRailsアプリケーションで2重にヘッダを出力しているため**でした。
以下のteratailの記事が参考になりました。
[http通信ヘッダーエラー？](https://teratail.com/questions/12013)

[Railsセキュリティガイド](https://railsguides.jp/security.html)によると、標準でX-XSS-Protectionヘッダを入れるとのことです。

> Railsアプリケーションから受け取るすべてのHTTPレスポンスには、以下のセキュリティヘッダーがデフォルトで含まれています。

```
config.action_dispatch.default_headers = {
  'X-Frame-Options' => 'SAMEORIGIN',
  'X-XSS-Protection' => '1; mode=block',
  'X-Content-Type-Options' => 'nosniff'
}
```

確かに、[Railsソースコード](https://github.com/rails/rails/search?utf8=%E2%9C%93&q=X-XSS-Protection&type=)にも記載がありました。

```
27        "X-Frame-Options" => "SAMEORIGIN",
28	      "X-XSS-Protection" => "1; mode=block",
29	      "X-Content-Type-Options" => "nosniff",
30	      "X-Download-Options" => "noopen",
```

## 問題への処置
`Nginx`の`conf`から、X-XSS-Protectionヘッダを外す。

# おわりに
Qiitaでも、NginxとRailsのセキュリティに関するメモが記載されていますが、
**Rails5.1では、'X-XSS-Protectionは不要**です。
MacOSXアプリからSwift3でShellscriptファイルを実行したかった。

とりあえずどうやるのって調べたら。
NSTaskクラスっていうのがあるらしいが、
使ってみると、、、


<img width="796" alt="スクリーンショット 2017-12-25 14.27.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/110418/069b1595-d932-b713-2f87-0a3ec724db08.png">

無い！！
と思ったけど、Xcode親切だった。。
Processクラスになったで！と教えてくれてました。

ということで以下、実装です。

```
//　対象のshファイルがあったらif文内を実行
if let path: String = Bundle.main.path(forResource: "testShellscript", ofType: "sh") {

    let task = Process()

    task.launchPath = "/bin/sh"

　　　　　　　　//　ここは実行引数を、実行コマンドのあとに幾つでも設定可能か。。？
    task.arguments = [path, "--option", "testArguments2"]

　　　　　　　　// シェルの出力結果を受け取るPipeの設定
    let pipe = Pipe()
    task.standardOutput = pipe

    // シェルを実行
    task.launch()
    task.waitUntilExit() //　シェルの実行が終わるまで待つ

    // シェルの結果を取得
    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
    
    // outputに結果が格納されるよ！
    print("\(output!)")

} else {

    print("指定されたファイルが見つかりません。")

}
```

あとはプロジェクト直下に対象のshファイルを置いておきます。

それからそのコマンドの実行権限がちゃんとないとダメみたいですね。

Automatorでできないような、細かいshellの実行を
MacOSXアプリでたくさん作って行きたいですね！
SequelizeのTransactionをAsync/Awaitで使うTips

async/awaitで書くことも増えてきたので、SequelizeのTransactionもPromise脱却したい！ということで改めて調べてみた。

## AsIs

``` Javascript
(targetId) => {
  sequelize.transaction((t) => {
    return User.destory({
      where: {
        id: targetId
      },
      transaction: t
    }).then((result) => {
      // Transaction has been committed
    }).catch((error) => {
      // Transaction has been rolled back
    });
  });
```

今までやってたのがこんな感じのPromiseチェイン。Sequelize公式もこんな書き方を紹介してるけど、チェインが長くなるとどこでロールバックされるのかパッと見分からないと感じてた。
そこで、以下のようにTransactionのコールバック内でasync/awaitにしてみたりして。。。

``` Javascript
sequelize.transaction(async (t) => {
  await User.destory({
    where: {
      id: targetId
    },
    transaction: t
  });
});
```

これで失敗すれば自動的にロールバックされる、らしいのだけども個人的にはやっぱり把握しずらい。

## ToBe

sequelize.transaction() は transactionオブジェクトをreturnするで、そのままasync/awaitの記法で使える。

``` Javascript
async (targetId) => {
  const t = await sequelize.transaction();
  try {
    const result = await User.destroy({
      where: {
        id: targetId
      },
      transaction: t
    });
    await t.commit(); // Transaction has been committed
    return result;
  } catch(error) {
    await t.rollback(); // Transaction has been rolled back
    return error;
  }
```

処理の成否は明示的に commit / rollbackを実行する必要があるので、手間と感じる人もいるだろけど、自分的にはコードが読みやすくなるのでこっちのが好み。
[JQuery] カーソルキーの↑↓でinputのフォーカスを移動させる

Qiitaの新着記事を眺めていたら
　[jQuery JavaScript 「↓」、「↑」キーでinputのフォーカスを移動させる](https://qiita.com/ayies128/items/ef976ce6e6beffb28c84)
という記事を見かけまして。

ああ、そういえば昔同じことやったな　と記憶から引っ張り出してみました。
おそらくこちらのほうが先の記事よりもスマートな実現方法ではないかな、と思います。

# やりたいこと
縦に並んだINPUTコントロールを、カーソルキーの↑↓で移動したい。


# 前提条件
* JQuery使用。
* カーソルでフォーカス移動したいコントロールは、同じクラス名を持つこと。  
  それ用にクラスを設定すればいいだけなので、使えない状況は無いはず。

# ソース
```html:html
<INPUT type="text" class="sample_class"><BR>
<INPUT type="text" class="sample_class"><BR>
<INPUT type="text" class="sample_class"><BR>
<INPUT type="text" class="sample_class"><BR>
<INPUT type="text" class="sample_class"><BR>
```

```javascript:javascript
$(document).on("keydown", ".sample_class", function(e){

	var index		=	null;
	var selector	=	".sample_class";

	//	↑キー
	if ( e.keyCode == 38 ){
		index	=	$(selector).index(this);
		if (index > 0){
			$(selector).eq(index-1).focus();
		}
		return;
	}
	//	↓キー
	if ( e.keyCode == 40 ){
		index	=	$(selector).index(this);
		if (index < $(selector).length - 1 ){
			$(selector).eq(index+1).focus();
		}
		return;
	}
});
```

# 簡単に解説
* キーDownイベント。
* イベントが発生したコントロールの index を取得。
* 押されたカーソルキーによって index に `-1` or `+ 1` し、
  そのindexのコントロールを指定して `focus()` する。
* index が境界外に出ないように条件をつける。
JavaScript 「!!」これはなんですの!?

# はじめに
[JavaScript Advent Calendar 2017 \- Qiita](https://qiita.com/advent-calendar/2017/javascript)の24日目の記事です。

小ネタですが空いてたので失礼します:bride_with_veil:

# 導入
みなさんはこんなソースを見たことがありますか？

```js
var hoge = !! document.getElementById('hoge');
```

これを見たときの僕はこんな感じです。

``!`` < 「やあ」
知ってる知ってる否定!否定だよ!

``!!`` < 「よろしくね」
ん?流れ変わったな...否定の否定...え、なにこれ怖い...

# ``!!``はboolean型への型変換だった
結論から言うとそういうことです。
そもそも``!``自体が「否定」とbooleanへの型変換を行う役割があるそうです。
挙動をまとめると以下のようになります。

```html
<div id="hoge">ホゲホゲホゲー</div>
```

```js
var hoge1 = document.getElementById('hoge');
console.log(hoge1);
// result: <div id="hoge">ホゲホゲホゲー</div>
var hoge2 = ! document.getElementById('hoge');
console.log(hoge2);
// result: false
var hoge3 = !! document.getElementById('hoge');
console.log(hoge3);
// result: true

var huga1 = document.getElementById('huga');
console.log(huga1);
// result: null
var huga2 = ! document.getElementById('huga');
console.log(huga2);
// result: true
var huga3 = !! document.getElementById('huga');
console.log(huga3);
// result: false
```

以下のコードとの違いは??あるのでしょうか？教えてすごい人:dancer:

```js
var hoge4 = Boolean(document.getElementById('hoge'));
console.log(hoge4);
// result: true
```

# 最後に
下記のサイトを参考にさせていただいたのですが、他にも色々ありますね。
できるだけシンプルに書くのがいいのか、誰でもわかるように書くのがいいのか...
それはプロジェクト次第でしょう:open_hands:

# 参考
- [JavaScriptの謎コードまとめ](http://www.f-sp.com/entry/2016/11/18/190732)
Visual Studio | WPF > Window > 拡大して表示する (各種コントロールも拡大)

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
```

[c++ Builder > form > フォームの大きさをコードで拡大する > this->ScaleBy(120,100);](https://qiita.com/7of9/items/1248086df6a4688a4668)
の処理をWPFではどのように実装するか。

### 処理

以下とした

- XAMLにてSizeToControl="WidthAndHeight"を設定
- XAMLにてViewboxを使用
    - 中にGrid(Height, Width固定)を使用
        - 中にコントロールを配置する
- code behindにおいてViewboxの(Height, Width)を変更する

### 参考

- https://stackoverflow.com/questions/1417004/how-to-relative-scale-size-of-user-control
- [Visual Studio | WPF > 実装: デザイン時と実行時のウィンドウサイズの違いの対策 > XAML対応](https://qiita.com/7of9/items/ccc7a20d253440bdc8c4)

### code

```MainWindow.xaml
<Window x:Class="_171225_t1400_scaleBy.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171225_t1400_scaleBy"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        SizeToContent="WidthAndHeight">
    <!-- SizeToContent を指定した-->
    <Viewbox Name="VWB_outer"
            StretchDirection="Both" Stretch="Uniform"
                Height="320" Width="515">
        <Grid Height="320" Width="515">
            <Button Name="Button1"
            Content="Button" Height="30" Click="Button_Click"/>
            <Label Content="Label" HorizontalAlignment="Left" Margin="28,36,0,0" VerticalAlignment="Top"/>
            <CheckBox Content="CheckBox" HorizontalAlignment="Left" Margin="111,47,0,0" VerticalAlignment="Top"/>
            <RadioButton Content="RadioButton" HorizontalAlignment="Left" Margin="312,37,0,0" VerticalAlignment="Top"/>
            <RadioButton Content="RadioButton" HorizontalAlignment="Left" Margin="312,69,0,0" VerticalAlignment="Top"/>
        </Grid>
    </Viewbox>
</Window>
```

```MainWindow.xaml.cs
using System.Windows;

namespace _171225_t1400_scaleBy
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        static bool s_bfEnlarged = false; // 拡大済かどうか

        public MainWindow()
        {
            InitializeComponent();
        }
       
        static readonly double kScaleFactor = 1.5;

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (s_bfEnlarged)
            {
                VWB_inner.Height = VWB_inner.Height / kScaleFactor;
                VWB_inner.Width = VWB_inner.Width / kScaleFactor;
                s_bfEnlarged = false;
            } else {
                VWB_inner.Height = VWB_inner.Height * kScaleFactor;
                VWB_inner.Width = VWB_inner.Width * kScaleFactor;
                s_bfEnlarged = true;
            }
        }
    }
}
```

### 実行例

拡大なし
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3f0e6a58-129e-2cab-35f0-2ad6de5a8eae.png)

拡大あり
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/402e7aa6-534b-1bdc-ec22-c1924556f7f6.png)
PHP5.4に対応するXdebugは2.4.1

# コマンド

```shell-session
$pecl install xdebug-2.4.1
.
.
.
Build process completed successfully
Installing '/usr/lib64/php/modules/xdebug.so'
install ok: channel://pecl.php.net/xdebug-2.4.1
configuration option "php_ini" is not set to php.ini location
You should add "zend_extension=xdebug.so" to php.ini
$echo "zend_extension=/usr/lib64/php/modules/xdebug.so" > /etc/php.d/xdebug.ini
```


# 最新

```shell-session
$pecl install xdebug
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
pecl/xdebug requires PHP (version >= 5.5.0), installed version is 5.4.16
No valid packages found
install failed
```

# 見た

[Xdebug: Downloads](https://xdebug.org/download.php)
5.3以下のサポート終了の記述はあったが、5.4のそれらしきはなかったので最新から下っていった。
[PHP5.3系にxdebugをインストールする際のあれこれ | Skyarch Broadcasting](https://www.skyarch.net/blog/?p=3508)


# 環境

* CentOS7 64bit
* PHP 5.4.16

***

リモートデバッグしようとしたが、9000ポートその他諸々でもタイムアウトするので、(`xdebug.remote_log = "/log"`でわかる)
ネットワークかセキュリティの問題が濃厚で挫折。
Linux に Gnuplotをインストール

#環境
* Linux Mint MATE 18.2

#gnuplotをインストールする
gnuplotはグラフを描画するフリーソフトとして有名です。今回はこのインストールで躓いたところをメモとして書いておきます。

Linuxにgnuplotをインストールする方法は様々なホームページで紹介されています。私も、

```bash
$ sudo apt-get install gnuplot
$ sudo apt-get intall gnuplot-x11
```
と入力してgnuplotをインストールしました。しかしターミナル上で

```bash
$ gnuplot
```
と入力して起動すると、一番下に「Terminal type is now 'unknown'」の文字。これではグラフをプロットできない・・・。

```bash
gnuplot> set terminal
```
でターミナル候補を見てみると、x11やwxtなどの文字が見当たらない・・・。

果たしてどうしたものか、と困っていたのですが、いろいろやっていると、ターミナル上にgnuplot5-x11っていうのをインストールできるよという文字があったので試しにインストール。
ターミナル上で

```bash
$ gnuplot5-x11
```
と打つと、gnuplotが起動し、最終行には「Terminal set type to 'wxt'」の文字が。無事セット出来ていました。試しに

```bash
gnuplot> plot sin(x)
```
と打つと、正弦波がちゃんと描画されました。
構成図を作るのにロゴが欲しい時の話

## 本編

https://worldvectorlogo.com/ja

以上。

とても便利っぽくて共有したくなったので。
当然、取得したロゴの取り扱いは各公式のアナウンスにしたがってください。

最初からSVGでdownloadできるのでサイズの変更やトリミングも簡単で便利さが溢れてます。
自分用に構成図作ったりするだけならとても重用しますね。

## 蛇足
- 検索がなかなか優秀。<br>
awsで検索するとS3やEC2などもろもろ出してくれるし、railsで検索すればrubymineまで出してくれる。
「合同勉強会 in 大都会岡山 -2017 Winter-」で発表してきました


「スマートスピーカー Advent Calendar 2017 」 25日目です。

# はじめに

2017/12/23に岡山の合同勉強会で「スマートスピーカー徹底比較」という内容で発表してきました。

[合同勉強会 in 大都会岡山 \-2017 Winter\- \- connpass](https://gbdaitokai.connpass.com/event/58025/)

[スマートスピーカー徹底比較](https://www.slideshare.net/tomoyukitochihira/2017-84881075)

内容は以前に公開したスマートスピーカー3種類の比較に最新情報を足して話をしました。

[音声アシスタントのAmazon AlexaとGoogle AssistantとLINE Clovaを比較した \- Qiita](https://qiita.com/tochi/items/7baf2451a9085cf4c972)

せっかくなので前回からの差分を抜き出してみたいと思います。

# Alexaでプッシュ通知が可能に

Alexaのみですがプッシュ通知ができるようになりました。
現在のスマートスピーカーは基本的には、人からの発話の指示によって処理を行います。
しかしプッシュ通知を使えばサーバー側で処理をしてAlexa側にリクエストを返すことが可能となります。
現在は申請制になっています。申請が許可されればスキルで使えるようになるようです。

[Expanded Developer Preview of Notifications for Alexa Skills : Alexa Blogs](https://developer.amazon.com/ja/blogs/alexa/post/833b9af4-26e6-47d2-a13d-bdbd9a257512/expanded-developer-preview-of-notifications-for-alexa-skills)

下記のフォームから申請が可能です。

[Online Survey Software \| Qualtrics Survey Solutions](https://alexa.au1.qualtrics.com/jfe/form/SV_72lplGGegxNZ9Ln)

プッシュ通知が使えるようになればまた記事を書きたいと思います。

# Google Assistantでも日本語対応のハードウェア開発が可能に

[「Googleアシスタント」のSDKが日本語をサポート　日本語を話す端末開発が可能に \- ITmedia NEWS](http://www.itmedia.co.jp/news/articles/1712/22/news073.html)

この発表により日本語に対応したGoogle Home系のスピーカーが各社から発売されそうですね。
やはり、ハードウェアの種類が増えればより普及速度が早まりそうですね。
ぜひ、1部屋に1台の規模で増えてくると開発にも夢が広がりそうです。

# まとめ

最初の比較記事から1ヶ月程度しか経過していませんが、それでも差分が出てくるという所にスマートスピーカーが急激に成長しているのがわかります。
これからも積極的に追いかけていきたいと思います。
WSLでDockerを使えるようにする

WSL ( windows subsystem for linux )　で　windowsでbashが使えるようになりました！しかしdockerは使うことができません！

いくつかコマンドをたたくとdockerができるようになったのでメモ

#参考
https://medium.com/@sebagomez/installing-the-docker-client-on-ubuntus-windows-subsystem-for-linux-612b392a44c4
国際バカロレアのComputer ScienceのIA　[アドバイス募集中]

#IBで学ぶプログラミング

こんにちは、僕は現在「国際バカロレア」略して「IB」の大学試験に向けて勉強している高校生です。

６科目のうち一つはコンピューターサイエンス (CS) のスタンダードレベルを選びました。プログラミングはまだ始めたばかりで、Javaの基礎を今学校で学んでます。

#IAとは？

のちにInternal Assessmentという各科目で出されるのですが、これはIBの最終的な点数20~30%をも占めるとても重要な課題です。

CSは、学校にある問題をプログラミングで解決するためのプロジェクトを考案しなければなりません。この課題で、今まで学んだJavaの知識（Arrays, Loop, Linear Searchなど）がどれだけ利用されているかが評価の対象となり、高得点を得るための鍵となっています。

#アドバイス募集

僕はまだIAにどんなプロジェクトをすればいいかまだわからないので、いろんなアドバイスを募集しています。

学校でどのようなプログラムがあったら便利だと思いますか？

ありがとうございます。
【Laravel(Lumen)】saveメソッドを使うとデータが一行しか登録されない原因

後日の禍とならぬようここに書き残しておきます。
  
# TL;DR
**save**メソッドを使うときは`new`してから使用すること。
もしくは**create**メソッドを使うこと。


# データが一行しか入らない

CSVインポート機能等で一行読み込んでインサート・・・という処理を書くときに恐らく
**foreach**等を使って行数分、処理を実行させるかと思うのですが、

処理例）

``` import.php
// CSVから読み込んだ行数分saveを行う
foreach ($csvList as $attributes) {
    $this->fill($attributes)->save();
}
```

その時に**save**メソッドを使ってるとデータが一行しか入らないという現象に遭遇します。
（具体的にはCSVの場合、最終行のデータしか入っていないようになってるはず）

# 原因

それもそのはずで、リーダブルに書いてある通り、
**save**メソッドを使うときは`new`してから使用しないと同じインスタンスを何回も**save**する、という動きになってしまいます。

[Eloquent：利用の開始 5.4 Laravel](https://readouble.com/laravel/5.4/ja/eloquent.html)
>モデルから新しいレコードを作成するには新しいインスタンスを作成し、saveメソッドを呼び出します。

なので**save**メソッドを使うときは必ず`new`してから使用するか、**create**メソッドを使用するようにしましょう

ということでした。
  
※**create**メソッドを使用する場合は必ず`$fillable` か `$guarded` を指定すること！
  
# 参考
- [Eloquent：利用の開始 5.4 Laravel](https://readouble.com/laravel/5.4/ja/eloquent.html)
- [Laravel 複数レコードを一気にDBへ格納する方法 | たきもと.com](http://kengotakimoto.com/post-2562/)
素数日カレンダーを作ってみた

2017年最後の素数日(12/19)に書こうと思ってた記事なのですが、今日書いてるけど許されたい…

# 素数日とは
YYYYMMDD表記の8桁の数字が素数の日です。
それをお知らせする素数日botは以前紹介しました。

https://qiita.com/anapple07/items/069895c66978c1cee1ef


…しかし、素数日をお知らせすると、「次の素数日はいつ？」と尋ねられるので、
素数日カレンダーを作りました。

#素数日カレンダー爆誕

## やること
- 一月のカレンダーを表示して、素数日の日だけに色をつける
- お金かけたくないのでgithub pagesを使う = JavaScriptでかく


## 結果
![スクリーンショット 2017-12-25 12.33.25.png](https://qiita-image-store.s3.amazonaws.com/0/138771/28be4408-5a4d-fd89-871d-64a80782fa21.png)

とりあえずサイレントリリース()は、当月のみで、前後の月には対応していませんでした。

```html
<!doctype html>
<head>
    <script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.7.0/fullcalendar.min.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.7.0/fullcalendar.min.css">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <title>素数日カレンダー</title>
</head>
<body>
    <div id="calendar"></div>
</body>
</html>
```

`FullCalendar()`を使うとこれのみでカレンダーが表示されます :) 便利！

https://fullcalendar.io/docs/
この辺りで色々カスタマイズできます :)


## とりあえず見せてみた

![スクリーンショット 2017-12-25 11.55.08.png](https://qiita-image-store.s3.amazonaws.com/0/138771/509e1d90-48ab-c943-1ab6-b52f8d315c28.png)


そして、アップデートで前後の月にも対応しました。

![スクリーンショット 2017-12-25 11.55.17.png](https://qiita-image-store.s3.amazonaws.com/0/138771/0c46dfee-0e70-b545-6eeb-cadbfe7d6e5b.png)


というわけで、ここから地獄の高速化がはじまるわけですが、github pages使わず、GAEとかに乗せて書き換えるのが、冬休みの宿題でした:confounded:

[カレンダーはここから](https://anapple07.github.io/PrimeNumberCalendar/)
PostgreSQLをちゃんと勉強したら捗ったシリーズ

# はじめに
PostgreSQLをメインに使うようになってからなんか書ける方法でしか書けないのでちゃんと[公式のドキュメント](https://www.postgresql.jp/document/)を読みました。
日本語のドキュメントが整っているのはありがたいことです。

小並な感想を述べると大変勉強になりました。
- 書く量が減った
- 他でゴニョゴニョせずSQLだけで完結するようになった
- なんか楽しくなった

その中でよく使うシリーズを下記に記します。

# 日付ごとに集計したい時

```postgres
SELECT generate_series::date FROM generate_series(
'2017-08-21'::date,
'2017-10-09'::date, '1 day')
```

これを普通に日付ごとにgroup by するやnつとleft joinすれば
無いレコードも含めた集計がしやすい。

# いろんな条件の件数とかみる

```postgres
select count(id) ,
count(id) filter (where 条件1) -- 条件1に当てはまる物の数,
count(id) filter (where 条件2) -- 条件2に当てはまる物の数,
...
```

# 時間帯ごととかの集計

タイムスタンプから時間だけとか、日付だけとか抽出する

```postgres
extract(hour from created_at) as hour
```


# JOINしなくても良い時

マスターデータとかをJOINしていたところは存在しないkeyとかが無いので下記の書き方のほうがシンプル

```postgres
SELECT *
FROM data d, mst_table m
WHERE d.mst_id = m.id;
```

# 平均値とか出す時

`PARTITION BY`で指定したColumnでグルーピングした時の値の平均値を出せる。
もちろん他にも合計とか別の集約関数をあててあげれば別の集計ができる。

```postgres
SELECT date, value, 
       avg(value) OVER (PARTITION BY date) 
FROM empsalary;
```

# グループセット

例えばこんなテーブルがあったとします。

```postgres
SELECT * FROM items_sold;
```
 brand | size | sales
-------|------|-------
 Foo   | L    |  10
 Foo   | M    |  20
 Bar   | M    |  15
 Bar   | L    |  5


## カラムごとの集計結果をパット見たい

- 日付ごとのグルーピング、時間帯ごとのグルーピングの結果みたいな〜とか
- 性別、年齢それぞれのグルーピングの結果みたいな～とか

```postgres
SELECT brand, size, sum(sales) FROM items_sold GROUP BY GROUPING SETS ((brand), (size), ());
-- ()のなかみなしで全てをグルーピング
```

 brand | size | sum
-------|------|-----
 Foo   |      |  30
 Bar   |      |  20
|      | L    |  15
|      | M    |  35
|      |      |  50

人数ごと、期間ごとの集計を一括でできます。


## それぞれのサブセットをつくって集計

性別、年齢ごと、あとは男性かつ20代とか細かくもみたいな〜のようなとき

`CUBE`を使うとサブセットを展開して`grouping sets`を用意してくれます

```postgres
SELECT brand, size, sum(sales) FROM items_sold GROUP BY GROUPING SETS (CUBE(brand, size));
-- 等価
SELECT brand, size, sum(sales) FROM items_sold GROUP BY GROUPING SETS ((brand, size),(brand), (size), ());
```

 brand | size | sum
-------|------|-----
 Foo   |      |  30
 Foo   | L    |  10
 Foo   | M    |  20
 Bar   |      |  20
 Bar   | M    |  15
 Bar   | L    |  5
|      | L    |  15
|      | M    |  35
|      |      |  50


# (おまけ)そこまでやらんでも〜なやつ

休・祝日抜いてくる条件

```postgres
WHERE EXTRACT(DOW FROM date) IN (0, 6)  -- 土日
OR EXTRACT(MONTH FROM date) * 100 + EXTRACT(DAY FROM date) IN (101, 211, 429, 503, 504, 505, 811, 1103, 1123, 1223) -- 固定の祝日
OR (EXTRACT(DOW FROM date) = 1 AND EXTRACT(DAY FROM date) > 14 AND EXTRACT(DAY FROM date) < 22 AND EXTRACT(MONTH FROM date) IN (7, 9)) -- 海の日、敬老の日
OR (EXTRACT(DOW FROM date) = 1 AND EXTRACT(DAY FROM date) > 7 AND EXTRACT(DAY FROM date) < 15 AND EXTRACT(MONTH FROM date) IN (1, 10)) -- 成人の日、体育の日
OR (EXTRACT(MONTH FROM date) = 3 AND EXTRACT(DAY FROM date) = FLOOR(20.8431 + 0.242194 * (EXTRACT(YEAR FROM date) - 1980)) - FLOOR((EXTRACT(YEAR FROM date) - 1980) / 4)) -- 春分
OR (EXTRACT(MONTH FROM date) = 9 AND EXTRACT(DAY FROM date) = FLOOR(23.2488 + 0.242194 * (EXTRACT(YEAR FROM date) - 1980)) - FLOOR((EXTRACT(YEAR FROM date) - 1980) / 4)) -- 秋分
```


# おわりに
SQLは楽しい。
これらはパフォーマンスを意識していないため(filterはあかんとかきくから)そのへんはご注意ください。
バニラJSでajaxを実装してみる


個人的なメモとして残しておく

## なぜVaillaJSを使うのか


なぜVanilla JSを使うのかというととにかくパフォーマンスがいいそうで。
下のサイトに書かれています。
http://vanilla-js.com/

爆速で有名のdev.toもVanllaだそうです。

https://dev.to/

## Ajaxを実現してみる


* jQueryの場合

```javascript

$.ajax({
  type: 'GET',
  url: '/my/url',
  success: function(resp) {

  },
  error: function() {

  }
});

```

* VanillaJSの場合

```javascript

      var request = new XMLHttpRequest();
      request.open('GET', '/my/url', true);

      request.onload = function() {
          if (request.status >= 200 && request.status < 400) {
              // Success!
              console.log("成功")
          } else {
              console.log("失敗")
          }
      };

      request.onerror = function() {
          console.log("失敗")
      };

      request.send();
```


なにか間違ってたりしたらコメントください。お願いします😓
テスト駆動開発「第1部 多国通貨 14章~17章」のまとめ

![https://www.amazon.co.jp/dp/B077D2L69C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1](https://qiita-image-store.s3.amazonaws.com/0/143609/d9c793c7-e942-84ec-8b75-5183a4e1c0bb.jpeg)

現在友人達とテスト駆動開発の本を輪読してます。
自分の担当ぶんの「第1部 多国通貨 14章~17章」の内容をアウトプットとしてまとめます。

本には実際のコードも掲載されているのですが、そちらは章続きの内容になっていてこのパートの部分だけ抽出してもよくわからないので割愛します。

同じく輪読されている方がいますので、今までの章については下記記事をみるとわかります。
下記記事にも書いてありますが、実際のコードを見たい方は書籍を購入されると良いと思います。(Java / JUnitです)
http://tf6533.hateblo.jp/entry/2017/12/18/135510



## 学習用テストと回帰テスト

#### 1. シンプルな実装を心がける。複雑に考えすぎず、今やるべきことをそのままテストに書く  
TDDの基本を忘れない。まずはテストを通すことを優先する。

#### 2. その後、処理の抽出などのリファクタリングを行ってテストを完成させていく  
テストを書いている間に処理に悩むようなことがあったら、**学習用テスト**を記述して検証する。実装内部だけで使うヘルパークラスなどを新たに作成する場合は、開発メンバーとの足並みによってそのクラスのテストを書くかどうか判断する

#### 3. リファクタリングをしている間、予期せぬ不具合が出た場合は**回帰テスト(退行テスト)**を記述して、不具合を再現・特定する


### 学習用テスト
API、言語の仕様が期待通りに動くかを確認するためのテスト。プロダクトで使ったことのない新しい機能や、パッケージの新機能などが正常に動くかどうかを確認する。このテストが通らなければ、既存のプロダクトコードでのテストも必然的に通らないことがわかる。

### 回帰テスト/退行テスト
不具合、ミスが発見されたときに状況を再現してどこで不具合が起きたのかを確認するためのテスト。


## テスト任せとコンパイラ任せ

#### 1. まずはこうなったら良いというテストを書く

#### 2. 修正が必要な場合は抽象度を落として、より具体的なテストを書いてまず動作させる
#### 3. 連鎖的な修正を避けるため、依存の終端（ゴール）から書き始め、頂点（テストケース）まで到達させる
変更ごとにテストを動かし、グリーンであること（コントローラブルであること）を確かめながら先へ進む

#### 4. コンパイルエラーが出たら、それをTODOリスト代わりにして修正作業を行う
最終的にコンパイラに従って修正していけば連鎖的な修正がすべて収まるようなところまで持っていく

## 将来の読み手を考えたテスト
将来、自分以外がこのコードを読むことを考えながらテストを書く。
今自分が考えていることを、将来の書き手に使えるための役割をテストに担ってもらう。
テストを書くときには、読者のことを考えながら書くのが何より大事。

#### これまでのプログラミングスタイルとTDDの比較・計測を自分自身で行い、TDDのメリットを活かせるようにする
コーディングの時間だけでなく、デバッグ・結合・人への説明(PJメンバー・開発メンバーなど)に要する時間もしっかり考慮に入れる

## 多国通貨の全体ふりかえり
- 各章でのプロセスを経て作った成果物のふりかえりの章

#### ここから先はどうなるのか？
TODOリストが終わったらコードを批判的に見てみる。改良箇所はまだまだ多数。TODOが空になったら設計を見直す良いタイミングなので、齟齬がないか、テストは足りているか（意図した/期待した通りの結果になっているか）、重複はないかなど、新たな設計の必要性がないか考えてみる

#### メタファー
実際の式・クラスの使われ方に応じてその都度最適化していくことで、コードはよりきれいになる。

#### テスティングフレームワークの使用状況
テストの実行は何回だったか、実行間隔はどれくらいかを計測する。例えば間隔が長かった場合はどのような要因で長くなったのか、などをふりかえっていく。筆者は純粋にコードを書いていたときは1分に１回テストを実行していた。

#### コードメトリクス
クラス、メソッドの数はどれくらいか？
行数はどれくらいか？
条件式やループが深すぎて複雑になりすぎていないか？（循環的複雑度が高すぎないか？）

#### プロセス
一連のプロセスにどれくらいの変更が必要になっているか？
1. 小さいテストを追加
2. 全てのテストを動かし、失敗することを確認
3. 変更
4. 再び全てのテストを動かし、成功することを確認
5. リファクタリング

#### テスト品質
代表的な計測手法
1. ステートメントガバレッジ（網羅的なテスト）
2. 欠陥挿入(プロダクトコードの任意の行の意味合いを変え、わざとテストコードを失敗させる)

##### カバレッジを上げる方法
より多くのテストを書くことでカバレッジは上がるが、テストを増やすことによって全ての入力の組み合わせを担保するのではなく、同じテストのままでコードを減らすことによってより多くの組み合わせをカバーする（ロジックをシンプルにする）ことでもカバレッジは上がる

## 最後のふりかえり
1. テストをきれいに機能させるアプローチは、仮実装・三角測量・明白な実装
2. テストとコードの間の重複除去が、設計を駆動する
3. TDDを回していると、テスト間のギャップを制御する能力がつく
Markdown→HTML（Githubスタイル） with Docker & Pandoc

## メモ

pandocの環境をいちいち構築するのがだるすぎるので、Pandocのdockerイメージを使ってMarkdownからHTMLに変換する。

docker導入は以下を参照。
https://qiita.com/tsnb/items/d10d2770c08abc60b500

## 環境
dockerは入っている前提。
- CentOS 7(Core)
- docker 17.09.0-ce
- proxyあり
- firefoxで確認

```
$ ./pandoc.sh test.md

$ ls
test.md(入力) test.md.html(吐き出されるhtmlファイル) github.css(変更したもの)
```

https://gist.github.com/andyferra/2554919/github.css
をローカルにコピーしてきて、以下のように変更する。para.pngとdirty-shade.pngをwebからとってくるようにする。


```bash:github.css
38c38
<   background: url("../../images/modules/styleguide/para.png") no-repeat 10px center;
---
>   background: url("https://raw.githubusercontent.com/gollum/gollum/master/lib/gollum/public/gollum/images/para.png") no-repeat 10px center;
85c85
<   background: transparent url("../../images/modules/pulls/dirty-shade.png") repeat-x 0 0;
---
>   background: transparent url("https://raw.githubusercontent.com/gollum/gollum/master/lib/gollum/public/gollum/images/dirty-shade.png") repeat-x 0 0;


```

```bash:pandoc.sh
$ docker run --rm -v `pwd`:/source jagregory/pandoc $1 -s -f markdown_github --mathjax=https://gist.githubusercontent.com/yohm/0c8ed72b6f18948a2fd3/raw/624defc8ffebb0934ab459854b7b3efc563f6efb/dynoload.js -t html5 -c github.css -o $1.html
```

プロキシ環境は以下をつけておく。（環境変数を設定するか、直でプロキシ設定を書く）
```
-e HTTPS_PROXY=${HTTPS_PROXY} -e HTTP_PROXY=${HTTP_PROXY}
```


# 結果

入力mdは以下。適当。

```md

### test

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

```bash:aaa.sh
echo "test"
ls
echo {0..10}
        ```

|a|b|c|
|:---|:---|:---|
|d|e|f|
|g|h|i|

**aaaa**

=========

---------

1. aaa
2. bbb
3. ccc

- aaa
- bbb
- ccc

`--help`

![github](https://upload.wikimedia.org/wikipedia/commons/2/29/GitHub_logo_2013.svg)


~~nonoonononono~~

```rb
num = 0
while num < 2 do
   print("num = ", num)
end
print("End")
      ```

$f(x) = ax^2 + bx + c$

\:kissing_closed_eyes: chu?

------
##### リンク

- [github][github_link_url]

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

[github_link_url]: https://github.com

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


```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152194/b1de5025-7da0-e7e2-abeb-97a20a00cdfd.png)

数式がうまくいってない。。--mathjaxでも--mathmlでもダメぽ。。
とりあえず放置。時間ある時に試してみる。
 



参考：
https://qiita.com/tukiyo3/items/dba8e8e7c87e91d5893a
NIPS2017雑感メモ

#NIPSとは？
LongBeach@USで開催された機械学習のICMLと並ぶ主要な国際会議NIPS 2017に参加してきました。論文の査読は厳しく、採択率は20％台と言われています。口頭発表やチュートリアルのビデオをオンラインで調光したり、プロシーディングがWebで公開されている論文を読むことができます。とはいえ、口頭発表を聞いたりポスター発表のディスカッションに参加したり休憩時間中の会話などからも学びがあるため、最先端の研究を知るために参加する意義は大きいと思います。

#NIPSはアカデミックな会議ではなくなった？！
NIPSの参加者は桁違いに増加中です！１０年前は、百人単位の参加者だったのが、５年前から、１０００人台を優に超えて来て、昨年は5000人、今年は８０００人(!)の参加者がいました。このペース
行くと２０３５年には７０億人を突破するそうですｗｗｗ

大学の教員や企業の研究所などの人員の絶対数からすると、明らかに桁違いに多いので、なぜだろうと思いましたが、会場には投資ファンドから派遣されて来た社員や、フロントエンドの実装を普段の職務にしているエンジニアなど幅広い層の参加者がいた模様です。
実際に、スポンサー企業の一つが機械学習企業への投資ファンドで、エンジニアや研究ではなく、ファンドのリクルートをやっていたりしました。また、1年前に設立されたばかりのgraphcoreというハードウェア・アーキテクチャのスタートアップ企業がスポンサーで出展したりしていました。
また、prowlerというスタートアップ企業が本会議に論文を４つ発表するなど、大企業による人工知能スタートアップ企業の買収の嵐が終わっても次々と最先端の人工知能技術を売りにするスタートアップ企業が立ち上がっているとも感じました。
日本の企業においてはビジネスーアカデミックと区切りをつける傾向も見受けられます。しかし、世界レベルでは、機械学習関連の技術革新のスピードがあまりにも速くなり過ぎてしまった、かつ、そのインパクトが桁違いに巨額の利益に関わり出遅れが企業の存続にとって致命的になることが認識されているが故に、最先端の国際会議に直接規模の大小を問わずテック企業がデモを出展したり論文を発表したりする必要があるのではないかと感じました。

#ポスト深層学習＆ポスト深層強化学習
分野のトレンドとしてはディープラーニングや深層強化学習のブームが続いてはいますが、さらに「次」を見据えたチュートリアル＆招待講演＆論文発表なども行われていました。
###  推論(Reasoning)や関係(Relation)の学習、関連するプログラミングフレームワーク
今の深層学習の苦手な作業をできるようにしようという試みです。
最近Uberが発表して話題になったフレームワークPiRoなどに代表されるような確率的プログラミングの説明を含むチュートリアルも充実していました。
またスタンフォード大学の先生から、社会科学に現れる人間同士の関係性を分析するために、確率的推論を用いているという紹介もありました。
###  脳科学の知見に基づく表現学習
招待講演で、脳のshallow learning via deep representation of brain というキーワードとともに、脳科学や神経科学の知見にもとずいた「自然に複雑な」情報の表現
###ロボティクスへの実用を見据えた深層強化学習
囲碁やゲームプレイなどで有名になった分野ではありますが、さらに複雑な環境における学習に必要なピースとして以下が挙げられていました。
1. マルチタスク学習　（複数のタスクを同時並行で学習）
2. One Shot Learning   （１つの事例を一般化して学習）
3. 報酬の階層化　（報酬）
###メタラーニング
これは、ちょっと説明しずらいのですが、大雑把にいうと「資料を探すときは最初に目次を見る」と言った、特定の知識や分野に限らない普遍的な学習方法の取得に関する発表やワークショップが盛り上がっていました。
マルチタスクよりもさらに野心的で「学習の方法」も学習させたい、つまり、人間が学習の方法を一つ一つ開発する必要がなくなるようにしよう！というものです。
###純粋数学の輸入
グラフ理論など離散数学や組み合わせ論の分野の第一人者が機械学習に新規参入したり、常微分方程式&力学系&最適輸送という解析学の先端的な分野を機械学習へ輸入しようなどの発表やワークショップも見受けられ、実装されていたりしました。

# Fairness and Bias in Machine Learning
突然ですが、明日から法律で「あなたの整体データをAIに入力して、犯罪者である傾向があるかチェックします！傾向の数値が一定値以上のものは、実際に犯罪を犯していなくても刑務所に入れます！」なんて決まったらどうしますか？
あるいは、「裁判の有罪OR無罪をAIに決めてもらいます」という社会についてどう思うでしょうか？

機械学習が実社会で使われるようになってくると、その使われ方が公平を伴わないものであった場合には、AIの名の下による専制を人間自体が招いてしまうこともあります。チュートリアルや招待講演の背後にある懸念は、すでに社会の中での少数派である特定の宗教、人種、性的指向性を持つ人々が受けている不公平な法的取り扱いを、データに潜む不公平なバイアスを考慮しないにもかかわらず「AIが判断しているのだから従え！」と強制されるような事態を、防ぎたいということだと感じました。

関連して、DeepMind社にAIと倫理に関するプロジェクト( https://deepmind.com/applied/deepmind-ethics-society/ )が立ち上がっていることも紹介されていました。実際にこちらのプロジェクトでは、裁判の量刑をAIに決めさせた結果として、同一の犯罪内容であっても、特定の人種に対してだけ重大な刑罰が課させる傾向があることを調べている研究者が紹介されています。
mini_racerのインストールでこける

bundle install しようとしたらlibv8のインストールでこける。
エラーを見るとlibv8, mini_racerのインストールで引っかかってるみたい。

## 環境
* macOS High Sierra
* ruby 2.4.0
* Rails 5.1.0

## エラー内容
```bash
$ bundle install


...

An error occurred while installing mini_racer (0.1.9), and Bundler cannot continue.
Make sure that `gem install mini_racer -v '0.1.9'` succeeds before bundling.
 
In Gemfile:
 
  mini_racer
```

## 対処法

Gemfile.lockを直接編集してlibv8とmini_racerのバージョンを上げた。

```diff:Gemfile.lock

// 変更前
- mini_racer (0.1.9)
- libv8 (~> 5.3)
 
// 変更後
+ mini_racer (0.1.14)
+ libv8 (~> 5.9)
```

## 結果
OK!

```
$ bundle install


...

Bundle complete!
```
MongooseOS で I2C センサー読んだり書いたり飛ばしたりする

# 経緯
自分の研究室はセンサデータを扱うことが多いので、プロトタイプに室内の気温などの値が欲しいことがよくあります。
そのたびにメンバーが個々で電子工作したり Arduino でセンシング環境を作ったりしてます。
**毎回各自自前で実装するのはめっちゃ無駄です。**


なので、みんなで取ってこれるもの欲しいねってことで作りました。

# やったこと

* ラボの気温と湿度をセンシング
* ディスプレイに表示
* MQTT で配信

# 使ったもの

* ボード: ESP8266
* 気温・湿度センサ: SHT31
* ディスプレイ: AQM0802
* MQTT broker: Thingspeak
* Mongoose OS + mjs


![IMG_7702.JPG](https://qiita-image-store.s3.amazonaws.com/0/40717/8b874b81-792c-7c4e-3599-17a9fe1dbd8f.jpeg)

# 成果物
リポジトリ: https://github.com/elzup/leilei

# 気温・湿度を読み取る!
[MongooseOS \+ mjs で I2C 気温センサを読み取る \- Qiita](https://qiita.com/elzup/items/37bc0bcd01c3663e2be5)

# ディスプレイに書く!
ハードコーディングで自前で実装しました。mjs 辛すぎる。。

https://github.com/elzup/leilei/commit/180c6277ed19e543081a932d433c2ebfff914253

# ThingSpeak に飛ばす!
ThingSpeak に MQTT API があるのでそれを使いました。
https://jp.mathworks.com/help/thingspeak/publishtoachannelfeed.html

```
$ curl -XGET "https://api.thingspeak.com/channels/xxx/feeds.json?api_key=xxx" |jq ".feeds[3]"
######################################################################## 100.0%
{
  "created_at": "2017-12-25T02:38:09Z",
  "entry_id": 4,
  "field1": "25.592813",
  "field2": "30.153353"
}
```

とれました。
これで研究室メンバーががいつでも研究室の気温をとれてハッピーです :tada:

# 感想など
### 今回のいいところ
i2C のセンサを使っているので、ハブに生やして他のセンサも拡張できます。
ThingSpeak をホストに使っているので MQTT にかぎらず REST API でも取ってこれます。(MQTT over Websocket も使えます)

### Mongoose OS について
mos という cli が強くて、ブラウザアプリも充実しています。[ローカルエディタでの開発環境を整えた](https://qiita.com/elzup/items/fd2617b7e86ff2357c6b)けど、補完が効かなかったりモジュール対応させたいです。
secret key 関係の設定をどうすればいいのかまだわからないです。mos.yml で環境変数とれたりすれば幸せ。
RailsのDBとmigrationファイルとschemaの関係

## 背景

データベースのテーブルに「カラムを追加して」とか「カラム削除して」とかお願いすると、なぜかできないって方がたまにいたりする。

なぜかなと思ってよくよく確認して見ると、

- `migration`ファイルを編集して、`rails db:migrate`するだけだったり
- `schema.rb`を編集するだけだったり

みたいなことがあるようです。

なので、データベースのテーブルなどが生成、編集されるフローをまとめてみることにしました。

## データベースのテーブルなどが生成、編集されるフロー

簡単な流れを書くと以下のとおりです。

1. `database.yml`の作成(データベースの設計図に当たる)
2. `rails db:create`の実行(`database.yml`を元にデータベースを作成)
3. `migration`ファイル(`xxxxxxxxx_create_blogs.rb`みたいなやつ)の作成(テーブルの設計図に当たる)
4. `rails db:migrate`の実行(`migration`ファイルを元にテーブルを作成編集)
5. 4の結果が`schema.rb`に反映される

では順を追って説明していきます。

## database.ymlについて

これは`rails new`で自動作成されるので、あまり意識しませんよね。
実は`database.yml`を元にデータベースが作成されているのです。

## rails db:createについて

これは`database.yml`を元にデータベースを作成するコマンドです。
テーブル云々には関係無いです。
つまりアプリケーション作成において、1度実行するだけでよいコマンドです。
（まれにDB壊してもう一度作りたいときとかは2回目を実行したりもします）

## migrationファイルについて

これは`scaffold`とか`rails g model`とかで自動生成されたりもします。
ただ、`migration`ファイルはテーブルの設計書にすぎないです。

## rails db:migrateについて

これは`migration`ファイルを元にテーブルを作成編集するコマンドです。
つまり、`migration`ファイルを作っただけではテーブルは変化しません。
`rails db:migrate`を実行してテーブルが変化します。

### ここ重要！

さらに、一度設計書として参照された`migration`ファイルは、次回以降の`rails db:migrate`参照対象からはずれます。

つまり、一度作ったテーブルを変更するには、新しい`migration`ファイルを作成し、`rails db:migrate`を実行する必要があるのです。

※`roll back`などを使う方法もありますが、ここでは割愛します。

## schema.rbについて

`rails db:migrate`の実行結果が反映されるファイルです。

## まとめ

- 一度作ったテーブルを変更するには、新しい`migration`ファイルを作成し、`rails db:migrate`を実行する必要がある
- `schema.rb`は結果を反映するだけ。編集してもテーブルが変化するわけではない。`schema.rb`を削除してもアプリは動くのです。

※ただ、`schema.rb`は他の使いみちがあるので、削除はおすすめしません。
Speech Editor

Okkkkk! Finally Christmas is coming and today is my turn to share my idea on this advance calendar. First all of , Merry Christmas everyone! I hope you guys have a great day today. Ok , so now let's start. Today we are going to build a speech editor which you just say and let the computer type for you. You guys know what , since I was a kid, I have always trying to find a way to make thing done easy and could help other people do less work but get great results that is the reason why I choose software engineering as my college major. Before we start to talk about our project,please allow be to introduce myself first. My name is Visal a year 4 software engineering student at KIT. I think you guys know that as a student there is ton of assignments and typing those assignment is very time consuming. I always imagine that "What if there is someone who could type those assignment for me?", "What if I go to sleep and get up with those typing complete?". Because of that question I have come up with an idea with is speech editor or speech writer.You just say , the computer will type for you, wow isn't it amazing?My dream come true i guess hehe. Ok so today We are going to build only the core function of our application which is you say and computer type (We don't build the GUI sorry xD).
Ok let's start.

#REQUIREMENT

1. python 3.6
2. pyaudio
3. google speech recognition API

#Step 1- Installing Requirement

If you are using mac follow this :

```bash
$ brew install portaudio
$ pip install pyaudio
$ pip install SpeechRecognition
```

If you are using Linux or Window follow this :

```bash

pip install pyaudio
pip install SpeechRecognition

```

#Step 2- Start Building Our Core

```python3
import speech_recognition as sr
r = sr.Recognizer()
try:
with sr.Microphone() as mic:
        print("SAY : ")
        while True:
audio = r.listen(mic)
            print(r.recognize_google(audio))
except Exception as e:
print(e)
```

#Step 3- Let's Test Our Program
Okkkkkkk! Now let's us run the program and start talking.
First of all let say "Merry Christmas"
<img width="669" alt="Screen Shot 2017-12-25 at 9.27.42 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/211896/5710a742-cdb4-4bc4-65c6-970aea044790.png">

Bingo! It works like a charm.
OK guys that's it. Thank everyone for spending your precious time joining with me.Again , I hope you guys having a great great day. MERRY CHRISTMAS!
CreateJS NEXT: Pointクラスに新らしく加わるメソッドを使ってみる

EaselJSの次期バージョン(NEXT)の[`Point`クラスに3つのメソッドが加えられました](https://github.com/CreateJS/EaselJS/pull/764)。xy座標値をただもっているだけだった`Point`クラスには、その演算のためのメソッドが備えられていくようです。新しいメソッドのサンプルコードをご紹介します。

#Point.polar()とoffset()メソッド
静的メソッド[`Point.polar()`](http://www.fumiononaka.com/Business/html5/FN1712003.html#method_polar)は、原点(0, 0)からの距離(length)および水平軸となすラジアン角(angle)を引数に渡すと、その座標の`Point`オブジェクトを返します。距離を一定にして角度を変えていけば、円運動が簡単に表せるのです。

```js
point = createjs.Point.polar(length, angle);
```

[`Point.offset()`メソッド](http://www.fumiononaka.com/Business/html5/FN1712003.html#method_offset)はxy座標値を引数にして、参照するインスタンスの座標に足しこみます。もとのオブジェクトの座標がその分ずれるということです。

```js
point.offset(x, y);
```
もっともこれまでも、つぎのように書けば済みました。メソッドを使うと、少し見やすくなるというくらいでしょうか。

```js
point.x += x;
point.y += y;
```
以下のサンプル001では、つぎのような関数(setOnCircle())で円軌道上にオブジェクト(circle)を置いています。メソッド`Point.polar()`は原点を(0, 0)とするので、`Position.offset()`により中心座標(center)にずらしました。なお、`Point.polar()`メソッドの第3引数に`Point`オブジェクトを渡すと、新たなインスタンスはつくらず、そのオブジェクトにxy座標が与えられます。関数の引数に渡す角度(angle)を動かせば円軌道のアニメーションです。

```js
function setOnCircle(angle) {
    createjs.Point.polar(radius, angle, position);
    position.offset(center.x, center.y);
    circle.x = position.x;
    circle.y = position.y;
}
```

####サンプル001■CreateJS NEXT: Point.polar() and offset() methods
[![Point_polar_offset.png](https://qiita-image-store.s3.amazonaws.com/0/128949/af8aaf54-b8f0-0017-527c-943894d48e08.png)
\>\> jsdo.itへ](http://jsdo.it/FumioNonaka/qiiN)

#Point.interpolate()メソッド
静的メソッド[`Point.interpolate()`](http://www.fumiononaka.com/Business/html5/FN1712003.html#method_interpolate)は、はじめのふたつの引数(point1とpoint0)の座標が結ばれた直線上に座標を定めて、`Point`オブジェクトとして返します。座標を決めるのは第3引数の比率(f)です。

```js
point = createjs.Point.interpolate(point1, point0, f);
```

比率(f)が1なら第1引数(point1)、0だと第2引数(point0)の座標になります。0から1の間では2点間、1より大きいと第1引数の外、マイナスのときは第2引数の外の座標のオブジェクトが返されます。比率を変えることで、直線上のすべての点が表せるのです。

以下のサンプル002は、つぎの抜き書きのような関数(move())でふたつの座標(startとend)が結ばれた直線上にオブジェクト(circle)を置いています。比率(f)を連続して変化させれば、直線的なアニメーションになるのです。なお、なお、`Point.interpolate()`メソッドの第4引数に`Point`オブジェクトを渡すと、新たなインスタンスはつくらず、そのオブジェクトにxy座標が与えられます。

```js
function move() {

    createjs.Point.interpolate(start, end, f, position);
    circle.x = position.x;
    circle.y = position.y;

}
```

####サンプル002■CreateJS NEXT: Point.interpolate() method
[![Point_interpolate.png](https://qiita-image-store.s3.amazonaws.com/0/128949/b81e343f-25d8-6295-9355-97a3bfc17b57.png)
\>\> jsdo.itへ](http://jsdo.it/FumioNonaka/WGm0)
Elmで一人花札

※本記事は工事中です
正月企画🎍で何か作りたいと思いとりあえず案だけ考えてみる。TDDっぽくテストケース→モデルケースの順で書いてみた。

"花札"とは
https://www.nintendo.co.jp/n09/hana-kabu_games/

##内容
https://github.com/dcsyhi/hanafuda

##更新
```Elm:Model.elm
module Model exposing (..)

import Cards exposing (..)

--Model


type alias Model =
    { yamafuda : Yamafuda
    , tefuda : Tefuda
    , bafuda : Bafuda
    , aifuda : Aifuda
    , result : Hand
    }


initModel : Model
initModel =
    { yamafuda =
        [ tsuru, maku, tsuki, ame_tofu, houou, uguisu, hototogisu, yatsuhashi, cho, inoshishi, kari, sakazuki, shika, tsubame, matsu_tan, ume_tan, sakura_tan, fuji_tan, ayame_tan, botan_tan, hagi_tan, kiku_tan, momiji_tan, yanagi_tan, matsu_kasu1, matsu_kasu2, ume_kasu1, ume_kasu2, sakura_kasu1, sakura_kasu2, fuji_kasu1, fuji_kasu2, ayame_kasu1, ayame_kasu2, botan_kasu1, botan_kasu2, hagi_kasu1, hagi_kasu2, susuki_kasu1, susuki_kasu2, momiji_kasu1, momiji_kasu2, kiku_kasu1, kiku_kasu2, yanagi_kasu, kiri_kasu1, kiri_kasu2, kiri_kasu3 ]
    , tefuda = []
    , bafuda = []
    , aifuda = []
    , result = None "" 0
    }


{-| 手札の絵札リスト
-}
type alias EfudaListT =
    EveryDict Efuda Maisu

{-| 手札の絵柄リスト
-}
type alias EgaraListT =
    EveryDict Egara Maisu


{-| 場札の絵札リスト
-}
type alias EfudaListB =
    EveryDict Efuda Maisu

{-| 場札の絵柄リスト
-}
type alias EgaraListB =
    EveryDict Egara Maisu


{-| 合札の絵柄リスト
-}
type alias EfudaListA =
    EveryDict Efuda Maisu

{-| 合札の絵柄リスト
-}
type alias EgaraListA =
    EveryDict Egara Maisu


{-| 札の枚数
-}
countYamafuda : Maisu
countYamafuda =
    let
        model =
            initModel
    in
    List.length model.yamafuda


countTefuda : Maisu
countTefuda =
    let
        model =
            initModel
    in
    List.length model.tefuda


countBafuda : Maisu
countBafuda =
    let
        model =
            initModel
    in
    List.length model.bafuda


countAifuda : Maisu
countAifuda =
    let
        model =
            initModel
    in
    List.length model.aifuda


{-| 手札の追加
-}
drawTefuda : Card -> Tefuda -> Tefuda
drawTefuda card tefuda =
    card :: tefuda

putBafuda : Card -> Bafuda -> Bafuda
putBafuda card bafuda =
    card :: bafuda


shuffle : Yamafuda -> Yamafuda
shuffle yamafuda =
    let
        yama_left =
            take 37 yamafuda

        yama_right =
            drop 11 yamafuda
    in
    append yama_right (reverse yama_left)


shuffleMany : Yamafuda -> Yamafuda
shuffleMany yamafuda =
    yamafuda |> shuffle |> shuffle |> shuffle |> shuffle


settingTefuda : (Yamafuda, Tefuda) -> (Yamafuda, Tefuda)
setting yamafuda tefuda =
    let
        picked = head yamafuda
        case picked of
            Just picked -> picked
            Nothing -> ""
    in
        (tail yamafuda) (drawTefuda picked tefuda)


settingTefudaMany : Tefuda -> Tefuda
settingTefudaMany tefuda =
    tefuda |> settingTefuda |> settingTefuda |> settingTefuda |> settingTefuda |> settingTefuda |> settingTefuda
```

#参考記事
★[Elm開発における思考フロー](https://qiita.com/ababup1192/items/629585f8b2ae953a9b47)
★[関数型言語Elmでテスト駆動開発](https://qiita.com/ababup1192/items/e9dc36ee0a2839d0bad3)
jQuery JavaScript 「↓」、「↑」キーでinputのフォーカスを移動させる

# はじめに
[JavaScript Advent Calendar 2017 \- Qiita](https://qiita.com/advent-calendar/2017/javascript)の23日目の記事です。

小ネタですが空いてたので失礼します:bride_with_veil:

# :lifter:何がやりたいか
縦にテキストボックスが並んでいるフォームがあるとします

```html
<table>
    <tr>
      <td>
        <input type="text" class="sample-input" id="sample64">
      </td>
    <tr>
    <tr>
      <td>
        <input type="text" class="sample-input" id="sample256">
      </td>
    <tr>
    <tr>
      <td>
        <input type="text" class="sample-input" id="sample512">
      </td>
    <tr>
    <tr>
      <td>
        <input type="text" class="sample-input" id="sample128">
      </td>
    <tr>
</table>

```
イメージはこんな感じ
<img width="159" alt="スクリーンショット 2017-05-12 10.41.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/1599e5cb-288b-9f1e-146e-35fa7fe7db6e.png">

この各input間を「↓」、「↑」キーで移動できるようにしたいのです。
（実際には左右にもinputがあり、tabでは移動できない画面です）

# :gear:各機能

## 「↓」、「↑」のイベント取得
keydownイベントそ取得してなんのキーが押されたかをkeyCodeを使って調べるだけです。
keyCodeは以下の通り。

| keyCode | キー |
|:--|:--:|
| 37 | ← |
| 38 | ↑ |
| 39 | → |
| 40 | ↓ |

ソースはこんな感じ。

```js
// 対象フォーム群のキーダウンイベントを取得
$(".sample-input").on("keydown", function(e) {
	if(e.keyCode === 40) {
        // 「↓」キーが押されました
	}else if(e.keyCode === 38) {
        // 「↑」キーが押されました
	}
});
```

## フォーカスの移動
.focus()で指定した要素にフォーカスを移動できる。

```js
$("#id").focus();
```

# :japanese_goblin:問題発生
## ちょっと待て
今回のフロントの実装では、連番ではなく**DBのID（以後「d_id」と呼ぶ）**をinputのidに付与していたので

```html
<input type="text" class="sample-input" id="sample64←ココ！">
```
id+1とかで次を指定できない:sob:
## 強引に問題解決
一番良かったのは、idの前方一致で$(this)の次の要素が取得すること（感じ取ってくださいw）。
でもちょっと実装が思い浮かばなかったので強引に解決！
そうだ、d_idリストを用意してしまおう:neutral_face:

```js

// d_idリストを用意
// d_id_list = [64, 256, 512, 128]
// （今回はPHPで実装しています）
var d_id_list = [];

<?php 
    $set = '';
    foreach ($array as $value) {
        if($set){
            $set .= ',';
        }
        $set .= $value;
    }
    echo "d_id_list = [{$set}];";
?>
```

# :tada:完成
全てを合体させて完成したのが以下のソース

```js

// d_idリストを用意
// d_id_list = [64, 256, 512, 128]
// （今回はPHPで実装しています）
var d_id_list = [];

<?php 
    $set = '';
    foreach ($array as $value) {
        if($set){
            $set .= ',';
        }
        $set .= $value;
    }
    echo "d_id_list = [{$set}];";
?>



// 対象フォーム群のキーダウンイベントを取得
$(".sample-input").on("keydown", function(e) {

    // キーダウンイベントを検知した要素のidからd_idを取得
    // その値とd_idリストを使用してd_idリストのindexを取得する
    d_id_list_index = d_id_list.indexOf(Number($(this).attr("id").replace("sample","")));

        // 「↓」キーが押された && 最終要素ではない
	if(e.keyCode === 40 && d_id_list_index < d_id_list.length-1) {

        // d_idリストと先ほど取得したd_idリストでの自分のindexを使用して1つ下のinputへfocusを移す
        $("#sample"+d_id_list[d_id_list_index+1]).focus();

    // 「↑」キーが押された && 最初の要素ではない
    }else if(e.keyCode === 38 && d_id_list_index > 0) {

        // d_idリストと先ほど取得したd_idリストでの自分のindexを使用して1つ上のinputへfocusを移す
    	$("#sample"+d_id_list[d_id_list_index-1]).focus();

	}

});
```

これが一番スマートではないと思います:kissing_heart:

#
ラグランジュの補間多項式

# ラグランジュの補間多項式とは

## ラグランジュの補間多項式の目的

二つの点$ (x_0, y_0), (x_1, y_1) $が与えられたときそれらの点を通る直線は1つに定まります。同じように点が三つ与えられたときはそれらを通る放物線は1つに定まりますね。これを一般化すると、$ 
( n + 1 ) $個の点が与えられた時、それらを通るn次関数は一つに定まりますよね。これを求めるのがラグランジュ多項式です。

## 具体的にどういう風に求めるか
まず与えられた点の数だけ
3つの点$ (x_0, y_0), (x_1, y_1), (x_2, y_2) $が与えらえてるとします。まず、与えられた点の数だけ関数を作ります
1. $ f_0(x) = (x - x_1) (x - x_2) $
2. $ f_1(x) = (x - x_2) (x - x_0) $
3. $ f_2(x) = (x - x_0) (x - x_1) $
これらの方程式には次のような特徴があります
1. $ f_0(x_1) = f_1(x_2) = 0 $
2. $ f_1(x_2) = f_1(x_0) = 0 $
3. $ f_2(x_0) = f_2(x_1) = 0 $
なので、次の式が成り立ちます

```math

\begin{eqnarray}

 \frac{y_0 f_0(x_i)}{f_0(x_0)} = \left\{
 \begin{array}{l}
   y_0, i =  0\\
    0, i \in \{1, 2\}
 \end{array}\right. \\

\frac{ y_1 f_1(x_i)}{f_1(x_1)} = \left\{
\begin{array}{l}
    y_1, i =  1\\
    0, i \in \{0, 2\}
\end{array}\right. \\

\frac{ y_2 f_2(x_i)}{f_2(x_2)} = \left\{
\begin{array}{l}
    y_2, i =  2\\
    0, i \in \{0, 1\}
\end{array}\right.
\end{eqnarray}
```

なので$ g(x) = \sum_{k = 0}^{2} y_k \frac{f_k(x)}{f_k(x_k)} $とすると、

```math
  g(x_0) = y_0 \\
  g(x_1) = y_1 \\
  g(x_2) = y_2 \\
```
きちんと$ g(x) $は$(x_0, y_0), (x_1, y_1), (x_2, y_2) $を通っているのがわかります。

## 一般化
$ n + 1 $個の点$ (x_0, y_0), (x_1, y_1) ..... (x_n, y_n) $まず、$ f_i(x) $の一般化ですね。

```math
f_i(x) = \frac{\prod_{k = 0}^n(x - x_k) }{ (x - x_i) }
```
この関数は先ほど確かめた通り次の特徴を持ちます。

```math
k \neq i \Rightarrow f_i(x_k) = 0
```
なので、求めたい関数は

```math
\sum_{ k = 0 }^n \frac{ y_i f_k(x) }{ f_k(x_k) }
```
になります。
PRML 5章 ニューラルネットワーク(5.1,5.2)の項目整理

## この記事の目的
これからPRMLの第5章（5.1-5.2）を読み始める人に対する項目整理です。

## 5章（5.1〜5.2）の全体像
5章はニューラルネットワークです。ついにきました。

* 5.1...フィードフォワードネットワーク
* 5.2...ネットワーク訓練について


## 5章で取り上げられる項目
### 5.1 フィードフォワードネットワーク
フィードフォワードネットワーク、つまり閉じた有向経路が存在せず、必ず入力方向から出力方向にデータが流れることを保証するニューラルネットワークについてのセクションとなります。

解説されている項目は以下の通り

* 隠れユニットの定義(基底関数)
* 多層パーセプトロン
* 重み空間対称性

### 5.2 ネットワーク訓練
誤差逆伝播(5.3)のための準備のセクションです。誤差を定義したり、その誤差をどう最適化するかなどについて。

* 誤差関数を定義(回帰問題の場合とクラス分類問題の場合)
    * 二乗和誤差関数...回帰問題における誤差関数
    * 交差エントロピー関数...クラス分類問題における誤差関数
* 誤差関数のパラメータ最適化
    * 局所二次近似
    * 勾配情報を利用することによる最適化...勾配情報を使うと計算量を大きく削減できる
    * 勾配降下法

## 解くべき演習問題
解くべき演習問題を四つ選ぶとしたらこんな感じ？

* 演習5.2...尤度関数最大化と誤差関数最適化が等価であること
* 演習5.6...誤差関数の微分
* 演習5.12...局所的極小点である事の必要十分条件がヘッセ行列Hが正定値であること
* 演習5.13...勾配情報利用による計算量削減について