OmniAICreator/Qiita-1.07M huggingface dataset:
Twitter Streaming API の follow パラメータには userName ではなく userID を入れろという話

# つまり

タイトルでもう全て終わってるんですが、そういうことです。
日本語で見つけられなかったので書いておきます。

https://github.com/AvianFlu/ntwitter/issues/107
> You have to use the userID not the userName.
> （あなたが用いるべきなのは userID であって userName ではない。）

# こういうこと
## BAD
```js:app.js
client.stream( 'statuses/filter', { follow : 'maru8m' }, function( stream ) {
    stream.on( 'data', function( data ) {
        console.log( data.text );
    });
});
```
## GOOD
```js:app.js
client.stream( 'statuses/filter', { follow : 4893902929 }, function( stream ) {
    stream.on( 'data', function( data ) {
        console.log( data.text );
    });
});
```
#でした
なんか Streaming API がそのうち死ぬというタイミングらしいですが
（http://h.s64.jp/entry/2017/04/16/121647）
誰かの役に立つことを祈ります。
gemに投稿してみた

## tl;dr
仕事でプッシュ通知基盤を[gaurun](https://github.com/mercari/gaurun)に置き換えることを考えていたときに、Rubyから叩く時用のライブラリを作ってみた・・・んだけど、gaurun化は見送りになったので、ライブラリは個人的なgemとして公開してみるかー、で試した時のメモ。
もうすでに大量に書かれてるネタなので、今更感もあるけど、俺的にはお初だったんだもんで...(´・ω・`)

## やったこと
1. [ここ](https://rubygems.org/sign_up)からrubygemsのユーザ登録
2. [ここ](https://rubygems.org/profile/edit)の下の方にある**API ACCESS**の欄に書いてあるcurlを実行
3. ``bundle exec rake release`` を実行
4. [gaurun-ruby](https://rubygems.org/gems/gaurun-ruby)が公開されたことを確認して
5. (ﾟдﾟ)ｳﾏｰ


### ハマった箇所
rake relase を叩くときに

```
ERROR:  While executing gem ... (Gem::CommandLineError)
    Too many gem names (/Users/siukaido/private_work/gaurun-ruby/pkg/gaurun-ruby-0.2.4.gem, to, http://mygemserver.com); please specify only one
```

みたいなエラーが起きて、なぞすぎた。
Too many gem names ってことだし、すでに登録されてるとか？って思って rubygems で検索かけても引っかからないしで、(´・ω・`)って感じに。
なんだけど「おーけーぐーぐる」してみると、gemspec ファイルの一部をコメントアウトしないといけないらしい。
ってことで、そのコミットが[これ](https://github.com/siukaido/gaurun-ruby/commit/5b193f184d96da1553b9c164164e12b164560506)。

改めて reke release すると

```
gaurun-ruby 0.2.4 built to pkg/gaurun-ruby-0.2.4.gem.
Tag v0.2.4 has already been created.
Pushed gaurun-ruby 0.2.4 to rubygems.org
```

ってことで、成功
・・・これはエラーメッセージがおかしくないかい？
とりあえずLambda(Node)からDynamoDBにPutする

## やること
- Lambdaに、`AmazonDynamoDBFullAccess`PolicyをAttachしたRoleを設定(IAMから設定)
- AWSSDKの`AWS.DynamoDB.DocumentClient`を利用してPut
    - `AWS.DynamoDB`は使わない！(DynamoDB特有の書き方をしないといけなくなる。例えば、MapのListを保存しようと思った時には。。。)
        - 特有の書き方、例えばこんなの `'user_id': {'N': '12345'}`

サンプル

```js
const aws = require('./node_modules/aws-sdk');
const docClient = new aws.DynamoDB.DocumentClient();

const userInfo = {
	basic: {
		name: 'taro',
		age: 21,
		career: ['HOGE株式会社', 'HOGE2株式会社']
	},
	social: {
		twitter: 'https://hogehoge.twitter.com',
		facebook: 'https://hogehoge.facebook.com'
	}
}


const params = {
	TableName: 'user_sessions',
	Item: {
		user_id: 12345,
		last_accessed_at: (new Date()).getTime(),
		user_info: userInfo
	}
};

docClient.put(params, function(err, data) {
	if (err){
		console.log(err);
	} else {
		console.log(data);
	}
});
```
Vue.js / Nuxt.js で Cookies を isomorphic に扱えるライブラリを作った

※ この投稿は [ブログで公開した記事](http://blog.s64.jp/entry/vue-universal-cookies_released) を一部修正したものです

***

風邪をひいたので、休養の間に作った `vue-universal-cookies`, `nuxt-universal-cookies` を npm および GitHub へ公開しました。
Vue.js / Nuxt.js にてIsomorphicにCookiesを扱え、node標準のhttp, Express, ブラウザなどに対応したプラグインです。

https://github.com/S64/vue-universal-cookies

年明け約4時間前の滑り込み npmjs.com デビューです。

## Nuxt.js でのセットアップ

以下でインストールします。

```sh
npm install --save nuxt-universal-cookies
```

`nuxt.config.js` へ、以下のように`modules`を書き足します。今のところ`options`へ設定できる値はありません。

```js
// nuxt.config.js
module.exports = {
  modules: [
    {
      src: 'nuxt-universal-cookies',
      options: {}
    }
  ],
};
```

## Express でのセットアップ

正確には `vue-server-renderer` などを用いたSSR環境にて、ブラウザとExpress両方で共通のコンポーネントを利用する場合です。  
以下でインストールします。

```sh
npm install --save vue-universal-cookies
```

以下のように、サーバ / クライアント 両方でinstallします

```ts
// in TypeScript
import VueUniversalCookies from 'vue-universal-cookies'
import * as express from 'express';

Vue.use(VueUniversalCookies);
```

クライアント側で、以下のようにして設定します。

```ts
// in TypeScript
import VueUniversalCookies, { BrowserHandler } from 'vue-universal-cookies'

new Vue({
  cookies: ({
    handler: new BrowserHandler()
  } as VueUniversalCookies.Options)
});
```

Express側で、以下のように設定します。

```ts
// in TypeScript
import VueUniversalCookies, { ExpressHandler } from 'vue-universal-cookies'
import * as express from 'express';

app.use(/^.*/, (req: express.Request, res: express.Response) => {
  // do something
  
  new Vue({
    cookies: ({
      handler: new ExpressHandler(req, res)
    } as VueUniversalCookies.Options)
  });
  
  // do something
});

```

## 使用方法

以下のようにして利用できます。

```vue
<template>
  <div>
    <p>{{ $cookies.get('key') }}</p>
    <button v-on:click="$cookies.set('key', 'value', {})">Update</button>
  </div>
</template>
```
EmacsのTRAMPとmagitでリモートのリポジトリを扱えなかった件について

## はじめに

試した環境は下記です。

* OS  
  macOS High Sierra(10.13.2)
* GNU Emacs  
  25.3.1

EmacsのGitクライアントの[magit](https://magit.vc/)は
リモートサーバー上のファイルもローカルと同じように扱える[TRAMP](https://www.gnu.org/software/tramp/)モードでも
問題なくリポジトリを参照できるそうです。

ただ、なぜか私の環境だと失敗。。。
リモートサーバー上のGitリポジトリ内で`M-x magit-status`をミニバッファで入力しても
下記のようにリポジトリを新規作成するかどうかについて聞かれてしまいます。

```console
Create repository in /ssh:[サーバーホスト]:[リポジトリへのパス]? (y or n)
```

そこで、調べたところ下記の2つが考えられました。

* リモートサーバーのgitが見つけられない  
  これは可能性がありそうです。
* リモートサーバーのgitのバージョンがmagitに対応していない  
  下記のページのように`Error (magit): Magit requires Git >= 1.9.4, you are using 1.8.3.`のようなエラーが出るはず。  
  しかし出ていませんでした。  
  https://emacs.stackexchange.com/questions/27461/magit-doesnt-recognise-git-repo-through-ssh-connection

## まず、リモートのgitを見つけられるようにする

TRAMPではリモートのコマンドの検索パスはtramp-remote-pathで管理しているようです。
そのために、ここにリモートサーバー上のgitコマンドへのパスを追加。
(pushで先頭に追加することで別の古いバージョンを指さないように)

```emacs-lisp
(push "/usr/bin" tramp-remote-path)
```
しかし、結果は変わらず、、、
そのため、tramp-remote-pathの問題では無さそうなので他に怪しい所が無いか調べると、magitのgitのコマンドパスを直接指定している箇所が有りました。

```emacs-lisp
(setq magit-git-executable "/usr/local/bin/git")
```

これをコメントアウトして再実行すると、問題なくリモートのリポジトリをmagitで扱えるようになりました。

## まとめ

結局自分で`magit-git-executable`を直接指定していたことが問題でした。
別途コマンドの検索パスは正しく通しているのでこの行は削除することにしました。
TRAMP + magit すごく便利です。
SDカードのフォーマット

#手順
##１.ディスクユーティリティを開く。
![スクリーンショット 2017-12-29 9.35.35.png](https://qiita-image-store.s3.amazonaws.com/0/185846/967ea92e-5bfb-2eab-6b37-5e1eab85ef37.png)

##2.SDカードを選択して、削除をクリック。
![スクリーンショット 2017-12-29 9.36.30.png](https://qiita-image-store.s3.amazonaws.com/0/185846/5fff6811-0b64-cb45-286c-9c28d0d03eb0.png)

##3.削除を押す。
![スクリーンショット 2017-12-29 9.36.46.png](https://qiita-image-store.s3.amazonaws.com/0/185846/885020f9-5f2d-3a37-4fc1-2e52dbeecdcf.png)

以上

#参考
https://digitalfan.jp/355
ターミナルでしょっちゅう謎文字(豆腐っぽいの)が出る場合【001B [2 q】

![k.jpeg](https://qiita-image-store.s3.amazonaws.com/0/154157/f2e525d5-64aa-4ede-454e-358a88b49155.jpeg)

tmuxを使っているときに、ターミナルにたまに煽られるのですが、そのとき表示されるのが001Bを含む豆腐。
これがどうも作業に支障をきたすので、解決方法を調べてみたところ

```
set-option -g terminal-overrides ',xterm*:Cr=\E]12;gray\007'
```

を`~/.tmux.conf`に追記すればいいらしいです。
【問題解決】「Maven Clean」実行時に「Folder must not be a file」というエラーが発生


# 環境
* Eclipse Pleiades 4.7
* Maven 3.3.9 (Eclipse pleiadesに組み込まれていたもの. EMBEDDED）
* Java8
* Spring Boot 1.5.7

# 問題発生
「Maven Clean」実行すると、以下のエラーが発生しました。

```txt:console
1,Conrad Treasury Place,William & George Streets,4001
2017-12-31 21:50:37.227  INFO 16216 --- [  restartedMain] sample.DemoApplication                   : Started DemoApplication in 3.816 seconds (JVM running for 4.333)
2017-12-31 21:50:44.601  INFO 16216 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2017-12-31 21:50:44.601  INFO 16216 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2017-12-31 21:50:44.617  INFO 16216 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 16 ms
Exception in thread "File Watcher" java.lang.IllegalArgumentException: Folder must not be a file
	at org.springframework.util.Assert.isTrue(Assert.java:92)
	at org.springframework.boot.devtools.filewatch.FolderSnapshot.<init>(FolderSnapshot.java:55)
	at org.springframework.boot.devtools.filewatch.FileSystemWatcher$Watcher.getCurrentSnapshots(FileSystemWatcher.java:281)
	at org.springframework.boot.devtools.filewatch.FileSystemWatcher$Watcher.scan(FileSystemWatcher.java:254)
	at org.springframework.boot.devtools.filewatch.FileSystemWatcher$Watcher.run(FileSystemWatcher.java:239)
	at java.lang.Thread.run(Thread.java:748)

```

# 原因
Spring Bootが既に起動している状態で、「Maven Clean」を実行したことが原因でした。
エラーが出るのは当然かな。。。？

# 解決策
言うまでもなく、Spring Bootを停止してから、「Maven Clean」を実行することです。


# 参考にしたサイト
* [StackTrace with Spring DevTools and Maven clean command](https://github.com/spring-projects/spring-boot/issues/7162)
    - 下記のコメントで、Spring Bootが起動していることに気づきました。
    - >Are you running mvn clean while the application is running?
Wio LTE 回路図とブロック図

# 回路図と基板図

Wio LTEの回路図と基板図はwikiに掲載、公開されています。

[Wio LTE Cat.1 Resource](http://wiki.seeed.cc/Wio_LTE_Cat.1/#resource)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/10b37555-7e2b-2eae-9aeb-86d233e16a0c.png)

**[Eagle]**は[Autodesk Eagle](https://www.autodesk.co.jp/products/eagle/overview)というCADソフトのファイル形式です。CADソフトを使わないと参照することができませんが、配線をクリックして同一配線をハイライトさせたりとかできるので便利です。
**[PDF]**はPDFファイルなので、CADソフトを入れたくないっていう方はこちら。

**SCH**は回路図で、**BRD**は基板図です。

**回路図(SCH)**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/7e839318-bebd-03e3-bf57-22fe3b158393.png)

**基板図(BRD)**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/edcea58d-d80c-b9c2-b9bd-609dea7ffd9b.png)

# ブロック図

わりと回路規模が大きくて、いきなり回路図を見るのは大変なのでブロック図を書いてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/aa44447c-c268-273d-f866-60279271881f.png)
Emacsのjediのビューワーjedi-direxを使ってみる

## はじめに

試した環境については下記。

* OS  
  macOS High Sierra(10.13.2)
* GNU Emacs  
  25.3.1
* emacsのjediパッケージ  
  0.2.7
* python  
  2.7.12, 3.6.2

[jedi](http://tkf.github.io/emacs-jedi/latest/#command)はEmacsでPythonのコーディングを行うときにコード補完や定義への移動、ヘルプの表示など可能にするパッケージ。
(ジェダイという名前が気に入っています)

![公式サイトの画像](http://farm9.staticflickr.com/8261/8804536872_8d266b88ed_o.png)

ただ、公式サイトのQuick Startのとおりにやっても、なぜか`M-x jedi:install-server`のところでエラーが出てしまったので、下記のサイトを見ながらpipで直接jediとepcをインストールしました。
http://d.hatena.ne.jp/n-channel/20131220/1387551080

pipでインストールしたjediとepcのバージョンは下記です。

* jedi  
  0.11.1
* epc  
  0.0.5

このjediですが、extensionで下記のようなコードビューワーがあり、これがjedi-direxになります。

![jedi-direx](http://farm4.staticflickr.com/3784/8804246558_0b3c998050_o.png)

## jedi-direxのインストール

実際にjedi-direxをインストールして使ってみました。
まず、package-installを使ってインストール。

```emacs
M-x package-install RET jedi-direx RET
```
インストールされたバージョンは`20140310.236`でした。

そして下記を.emacsに追加してpythonファイルをpython-modeで開いてみました。

```emacs-lisp
(setq jedi:complete-on-dot t)
(define-key python-mode-map "\C-cx" 'jedi-direx:pop-to-buffer)
(define-key python-mode-map "\C-c\C-x" 'jedi-direx:switch-to-buffer)
(add-hook 'jedi-mode-hook 'jedi-direx:setup)
```

しかし、ここで下記のエラーが発生。

```console
deferred error : (error "\"AttributeError(\\\"module 'jedi.api' has no attribute 'defined_names'\\\",)\"")
```

どうやらjediを`M-x jedi:install-server RET`ではなくpipで直接インストールしたためバージョンが合っていないようです。
このdefined_namesは既にjediの0.11.0からドロップされていました。
https://github.com/tkf/emacs-jedi/issues/293

そのため0.10.2をインストール。

```console
$ pip uninstall jedi -y
Uninstalling jedi-0.11.1:
  Successfully uninstalled jedi-0.11.1
$ pip install jedi==0.10.2
Collecting jedi==0.10.2
  Using cached jedi-0.10.2-py2.py3-none-any.whl
Installing collected packages: jedi
Successfully installed jedi-0.10.2
```

Emacsを再起動して、もう一度試すとエラーは出ず、C-cxで無事jedi-direxのビューワーが表示されました。
TABキーでツリーが展開され、oキーを押すとそのラインに飛べます。
使いやすそうなので使っていきたいと思います。

<img width="613" alt="BaseHTTPServer_py.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/95869647-6eaf-3f05-d258-42b56f7d36be.png">

**2018/1/8追記**
`M-x jedi:install-server`が失敗した理由は単にvirtualenvが入っていないためでした。

```console
pip install virtualenv
```

[公式ドキュメント](http://tkf.github.io/emacs-jedi/latest/#command-line-program)にも記載有り。

手動で入れたパッケージをアンインストールした後、

```console
pip uninstall jedi epc
```

`M-x jedi:install-server`を入力することで無事インストールできました。

ちなみにインストールされたPythonのパッケージの場所は下記の中でした。

```
.emacs.d/.python-environments
```

ただし、この方法でインストールしても結局Emacsのjedi-coreパッケージ内のjediepcserver.pyが対応していないので下記のエラーは発生します。

```console
deferred error : (error "\"AttributeError(\\\"module 'jedi.api' has no attribute 'defined_names'\\\",)\"")
```

この件については既に修正のプルリクが出ていました。

https://github.com/tkf/emacs-jedi/pull/296
Tera Tarmのユーザ名がグレーアウトして入れられない。

##事象
Tera TarmでラズパイにSSH接続をしようとしたら、ユーザ名がグレーアウトしてpiにしたいのに出来なかった。

##原因
>TERATERM.INIの中で、CheckAuthListFirstの設定が1になっていると思われますので、0に変更してみて下さい。
\# 4.56以降では設定ダイアログから変更出来るようになる予定です

参考：https://ja.osdn.net/projects/ttssh2/forums/5841/16661/


##対処手順
###1.TERATERM.INIを開く
`C:\Program Files (x86)\teraterm` の中の`TERATERM.INI`を開きます。

![スクリーンショット 2017-12-26 15.45.08.png](https://qiita-image-store.s3.amazonaws.com/0/185846/0043e836-ed7b-50d6-46de-d90ff5a128f4.png)

###2. CheckAuthListFirst=0にする
![スクリーンショット 2017-12-26 15.45.44.png](https://qiita-image-store.s3.amazonaws.com/0/185846/b97b6201-f8c4-c96c-b5c9-250a0c813779.png)

##あとがき
昔に自分で設定したんだと思うが、すっかり忘れていたようです。。
Nature OpenSearch APIによる論文タイトルの取得

# Nature's API

学術雑誌"Nature"は以下のAPIを公開しています。(also see [API References](http://www.nature.com/developers/documentation/api-references/))

* [Blogs API](http://www.nature.com/developers/documentation/api-references/blogs-api/) : [nature.com blogs](http://blogs.nature.com/) を対象としたAPI
* [OpenSearch API](http://www.nature.com/developers/documentation/api-references/opensearch-api/) : [nature.com](https://www.nature.com/) を対象としたAPI

本稿はOpenSearch APIについての紹介記事です。
余談ですが、natureの更新情報を得るのみでしたら[web feed](http://www.nature.com/webfeeds/index.html)が与えられているため、こちらを使用するほうが楽かと思います。

# [The nature.com OpenSearch](https://www.nature.com/opensearch/)

OpenSearch APIはweb上で[リクエストフォーム](https://www.nature.com/opensearch/request)が与えられており、こちらでIndexを1つ以上選択、またParameterを適当に選択することで、検索することが可能です。

[OpenSearch API](http://www.nature.com/developers/documentation/api-references/opensearch-api/)ページで紹介されているcheatsheetがNot foundなので、[OpenSearch API](http://www.nature.com/developers/documentation/api-references/opensearch-api/)と[The nature.com OpenSearch](https://www.nature.com/opensearch/)を見ながらIndexやParameterを設定することとなります。


* Index
    - クエリ言語CQLやXMLスキーマのPAM (PRISM Aggregator Message)を設定します
    - prism.volume: NatureのVolumeに対応
    - prism.number: 同Number
    - prism.publicationDate: 出版日
         + なぜかデフォルトのメディアタイプ"SRU"ではヒットしませんが、"21 December 2017"のようなnature.comに記載された出版日で検索をかけることが可能です

* Parameter
    - APIの検索結果の書き出し方式について指定します
    - html上では指定しない場合、デフォルト値が指定される模様です
        - これはメディアタイプを指定しない書き出しでSRUフォーマットであったことから判断しています

* html sample
    * Volume 552 Number 7685について、jsonで書き出す場合、
    ``` https://www.nature.com/opensearch/request?interface=sru&query=prism.number+%3D+%227685%22+AND+prism.volume+%3D+%22552%22&httpAccept=application%2Fjson ``` で結果を得ることが出来ます。

# 論文タイトルの取得

あとはAPIの結果を加工するだけです。
Pythonのサンプルを載せておきます。

```python3

import requests
import json

def request_nature_api(vol, num):
	url = "https://www.nature.com/opensearch/request?query=prism.number+%3D+%22" + str(num) + "%22+AND+prism.volume+%3D+%22" + str(vol) + "%22&httpAccept=application%2Fjson"
	results = requests.get(url).text
	return(results)

def get_titles(data):
	id_dict = json.loads(data)
	for i in range(0,len(id_dict["feed"]["entry"]) ):
		print(id_dict["feed"]["entry"][i]["title"])


if __name__ == "__main__":
	volume = 552
	number = 7685
	results = request_nature_api(volume, number)
	get_titles(results)
```

エラーハンドラ等ないぱっと書いたものですので、適宜修正の必要があります。
毎週natureのタイトル等を自動で取得し、Slack等のSNSに流すのであれば、prism.publicationDateを指定して取得した方がいいかもしれません。

## 追記

PythonでOpenSearch APIを用いるモジュールを高橋さんが開発されました。 
https://github.com/takashi-takahashi/nature_open_search
rails5 on herokuでPostgreSQLのレコードをすべて消したい時の方法

## 背景

`rails5`開発中、テーブルを追加してアソシエーション後、`heroku`にデプロイしたりすると、アソシエーションキーとなるカラムが`nul`のため`No Method Error`が発生したりする。

このエラーをどうやってクリアすべきか、質問されたので、その時の解決方法を記載します。

## 解決方針

開発中でテストデプロイ段階だったてめ、レコードの全消去は悪影響がない。
そのため、`heroku`環境でレコード全消去する方針で進める。

## heroku run rails db:reset

ローカル開発環境では、`rails db:reset`でレコード全消去が可能。
`heroku`環境の場合、頭に`heroku run`をつけると良いので、以下のコマンドを実行。

```
$ heroku run rails db:reset
```

## Rails5本番環境でのコマンド誤操作機能

しかし、`Rails5`から本番環境では、削除系コマンドの誤操作を防止する機能が追加されたようで、下記エラーが発生。

```
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```

`DISABLE_DATABASE_ENVIRONMENT_CHECK=1`を付与してコマンドを実行すればよいようなので、
以下のコマンドを実行。

```
$ heroku run DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:reset
```

## heroku環境での権限問題

しかし、`heroku`環境では`rails db:reset`の権限がなく以下のエラーが発生。

```
FATAL:  permission denied for database "postgres"
DETAIL:  User does not have CONNECT privilege.
Couldn't drop database 'XXXXXXXXXXXXXXX'
rails aborted!
PG::ConnectionBad: FATAL:  permission denied for database "postgres"
DETAIL:  User does not have CONNECT privilege.
```

## heroku pg:reset DATABASE_URL

そこで`rails`経由ではなく直接`PostgreSQL`にアクセスする形で以下のコマンドを実行。

```
$ heroku pg:reset DATABASE_URL
```

※ここで`DATABASE_URL`は既に変数が組み込まれているはずなので、そのまま`heroku pg:reset DATABASE_URL`とコマンド実行してOKです。
※特に不要ですが、`DATABASE_URL`内に組み込まれている値が知りたい方は`heroku config`を実行して確認してみてください。

`heroku pg:reset DATABASE_URL`を実行するとすると、以下のような出力がある。

```
$ heroku pg:reset DATABASE_URL
 ▸    WARNING: Destructive action
 ▸    postgresql-〇〇〇-△△△ will lose all of its data
 ▸
 ▸    To proceed, type ●●● or re-run this
 ▸    command with --confirm ●●●

>
```

指示通り、以下のように`>`の後ろにタイプ。

```
$ heroku pg:reset DATABASE_URL
 ▸    WARNING: Destructive action
 ▸    postgresql-〇〇〇-△△△ will lose all of its data
 ▸
 ▸    To proceed, type ●●● or re-run this
 ▸    command with --confirm ●●●

> ●●●
```

`Resetting postgresql-〇〇〇-△△△... done`と出力されれば`pg:reset`成功です。

その後、`heroku run rails db:migrate`を実行すればテーブルが再作成される。

## まとめ

長々と書いてしまったが、レコードを消去したいときは、

```
$ heroku pg:reset DATABASE_URL
 ▸    WARNING: Destructive action
 ▸    postgresql-〇〇〇-△△△ will lose all of its data
 ▸
 ▸    To proceed, type ●●● or re-run this
 ▸    command with --confirm ●●●

> ●●●
Resetting postgresql-〇〇〇-△△△... done
$ heroku run rails db:migrate
```

でOKです。
paiza Python3で複数行入力を受け取る

タイトルが曖昧ですみません。

#背景&タイトルの意味

私はiPhoneから、python3で[paiza](https://paiza.jp)の問題に挑んでいます。

問題に取り組む際、[pythonista3](https://itunes.apple.com/jp/app/pythonista-3/id1085978097?mt=8)というアプリを使うのですが、テスト実行時に入力を渡す際、いちいち一行ずつ入力するのは面倒と考え、改行を含んだ複数行を一気に入力して、それをあたかも一行ずつの入力として扱いたいなと考えました。

#`input`にイテレータを入れてしまう

単刀直入に。解決に用いたコードが以下です。

```python3:python3
#'''
allinputs = iter(input().splitlines())
input = lambda : next(allinputs)
#'''
```

一つ目の`#'''`の`#`を取るとそのまま提出用コードに早変わりします。

1. 改行入り全入力を改行で区切った配列を作成
2. そのイテレータを吐くジェネレータを`input`関数に入れる
3. `input`関数があたかも一行ずつの入力に

#例

以下のように、一行目に配列の要素数`N`、その後に一行ずつ配列の要素が与えられる場合の例を示します。`pythonista3`での入力の渡し方のスクショも挙げておきます。

```plaintext:入力
5
apple
banana
orange
grape
melon
```

<img width="375" alt="E9AC5354-BAAC-429E-A96B-3EE5B30B6667.png" src="https://qiita-image-store.s3.amazonaws.com/0/205472/275f3125-cddd-006c-4a22-bf94c23612ce.png">

```python3:python3
#'''
allinputs = iter(input().splitlines())
input = lambda : next(allinputs)
#'''

N = int(input())
arr = [input() for _ in range(N)]

print('N : ',N)
print('arr : ',arr)
```

```plaintext:出力
N :  5
arr :  ['apple', 'banana', 'orange', 'grape', 'melon']
```

#終わりに

あんまり組み込み関数をいじるのは良くないかもしれませんが、例えば`my_input`関数等を用意したところで、混乱を招くだけですから、`input`を上書きするという形をとりました。

参考になれば幸いです。m(_ _)m

###2018/1/7 追記

pythonista3を使う場合は、ですが、一度コードを実行すると、アプリを終了させるまで`input`の中身が手作りイテレータ(もう空っぽ)になってしまうので、以下のように一度退避させておくといいです。

```python3:python3
_input = input
#'''
allinputs = iter(input().splitlines())
input = lambda : next(allinputs)
#'''

#ここに書きたいコードを書く

input = _input
```
きららファンタジアで使われているOSSライブラリ

- unity-gym
 - Android端末にGCM(Google Cloud Messaging)を使ってプッシュ通知をおこなうためのプラグイン。<br>リンク:[GitHub - kobakei/unity-gcm: Unity plugin for Google Cloud Messaging (GCM)](https://github.com/kobakei/unity-gcm)
- iTween
 - Unityのトゥイーン系アセット。<br>リンク:[iTween - アセットストア - Asset Store - Unity](https://www.assetstore.unity3d.com/jp/#!/content/84)
- unity-webview
 - UnityでWebview(アプリ内でWebページを表示する機能)を使用できるプラグイン。<br>リンク:[GitHub - gree/unity-webview](https://github.com/gree/unity-webview)
- MessagePack for Unity
 - UnityでMessagePackをシリアライズ、デシリアライズするライブラリ。<br>リンク:[GitHub - masharada/msgpack-unity: MessagePack implementation for Unity](https://github.com/masharada/msgpack-unity)
- Arvo,Oswald 
 - 商用可能なフォント。リンクは見つかりませんでした。情報提供して頂けると有難いです。
可用性(SLA)の一覧

SLAの計算をいつも忘れるので備忘というか一覧で残しておこうと思います。

※記載の時間は停止可能な時間

99％（ツーナイン）
年：3.65日
月：7.2時間
週：1.68時間
日：14.4分

99.9％（スリーナイン）
年：8.76時間
月：43.8分
週：10.1分
日：1.44分

99.99％（フォーナイン）
年：52.56分
月：4.38分
週：1.01分
日：8.66秒

99.999％（ファイブナイン）
年：5.26分
月：25.9秒
週：6・05秒
日：864ミリ秒
ざっくばらんメモ_18：kaggle, MCMC w/ human preference, classificationと文化


###kaggle recruit challenge
[code](https://github.com/festa78/kaggle_recruit_rest)
今までsklearnのGridSearchCV関数などを利用して
自動パラメータチューニングを行ってきたが、時間がかかる割に
性能が改善されない。
Trainデータ内でcross validationにより作るvalidationセットが実際の
テストデータと整合していないのか、あるいは別の原因があるのかも
しれない。
いずれにせよ、今回手動でsubmissionして得られるLBスコアを見ながら
手動でlightgbmとxgboostのパラメータをある程度チューニングし、
最後に２つの予測結果の平均を取ってみた所、
結果：LB0.492まで向上。
しかしこれ以上は新たなアプローチをしていかないと性能が上がらなそう
である。

###MCMC with human preferences
[NIPS 2017 John Platt's Opening Remarks](https://www.youtube.com/watch?v=L1jLpkvKPh0)より。
物理的な実験において、パラメータ設定を行う際に，
パラメータサンプリングの度に人からそれが好ましいかそうでないかのフィードバックを
もらう事で，human preferenceの山登りをするイメージでサンプリングパスを描く．

###classificationは現在の文化を表現する。
NIPS 2017 Keynoteである[The Trouble with Bias, Kate Crawford](https://youtu.be/fMym_BKWQzk)を見た。
まずプレゼンが非常に上手くてそこに感動したが、内容も非常に興味深かった。
内容は学習された機械学習モデルが持ってしまう望ましくないbias（例えば性差別的観点）
の問題についてのもの。
今までは、望ましくないbiasに対しては正則化してneutralizedして解決と考えていたが事は
そんなに単純ではないようである。
中でも面白かったのが、classificationの歴史とそれがいかにその時々の文化を象徴しているか
という事であった。
例えば、画像分類データで一番出てくる人名（クラス）はジョージ・ブッシュだと知られているが、
これは彼の画像がマスコミなどで頻繁に露出しており、それだけ社会的に重要視されてきた証である。
つまり社会的に、あるいは文化的にその時重要だったものがデータ分布を決定し、
またその分類に関するtaxonomyを決めてきたという事である。
実際分類の歴史を紐解くとそれは時代によって次々と変化しており、直近だと、google formで選べる
性別は２つから数十個に増えたらしい。
こうした事から、biasを直すという事はつまり文化、社会のレベルまで働きかける事が本質的には
必要で、データはneutralだから差別してしまう人間より遥か良いというような数年前の論調は間違いで、
上記の難問を解かない限り、またAI winterが来てしまうかもしれない。
Rails Tutorial のテストを RSpec で行う


# 2週目以降を RSpec でやってみては！？

Rails Tutorial のテストを RSpec でやってみました (まだ途中までだけど)。
元々の Tutorial は mini test ですが、実際の現場では RSpec が使われる方が多いような気がしているので、
2週目以降は RSpec を使ってみるというのはありかなと思います。

導入と最初の方のテストを書いてみたので、ご参考に。

# RSpec 導入編

## RSpec 導入の参考記事

https://qiita.com/shizuma/items/8221544601aa3d0770d2
https://qiita.com/barasixi/items/db1fe162f53c5ddacde0

## ざっくり導入手順

### Gemfile 修正

`rspec-rails` と `factory_bot_rails` を導入します。
今回書いた中では、まだ `factory_bot` は活躍しません。。。

```ruby
group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
  gem "rspec-rails"
  gem "factory_bot_rails"
end
```

### インストール

```console
$ bundle install
$ rails generate rspec:install
```

### 実行

```console
$ bundle exec rspec                                                                       
```

### 実行結果

テストがないので、実行できるかの確認だけとなります。

```
No examples found.


Finished in 0.00038 seconds (files took 0.10134 seconds to load)
0 examples, 0 failures
```

# 第3章のテストを RSpec で書く

Tutorial に合わせて、Controller のテストを書く。

### リスト 3.15: Aboutページのテスト (red)

```ruby:spec/controllers/static_pages_controller_spec.rb
require 'rails_helper'

RSpec.describe StaticPagesController, type: :controller do

  (省略)

  describe "GET #about" do
    it "returns http success" do
      get :about
      expect(response).to have_http_status(:success)
    end
  end
end
```

### 失敗の確認

```console
$ bundle exec rspec                                                                       

Failures:

  1) StaticPagesController GET #about returns http success
     Failure/Error: get :about

     ActionController::UrlGenerationError:
       No route matches {:action=>"about", :controller=>"static_pages"}
     # ./spec/controllers/static_pages_controller_spec.rb:20:in `block (3 levels) in <top (required)>'
```

### リスト 3.24: StaticPagesコントローラのタイトルをテストする (red)

チュートリアルに沿って書く。

```ruby:spec/controllers/static_pages_controller_spec.rb
require 'rails_helper'

RSpec.describe StaticPagesController, type: :controller do
  render_views

  describe "GET #home" do
    it "returns http success" do
      get :home
      expect(response).to have_http_status(:success)
      assert_select "title", "Home | Ruby on Rails Tutorial Sample App"
    end
  end

  (省略)
end
```
controller のテストですが、表示内容も確認したいので、`render_views` が必要。
`render_views` を書かないと、下記のようなエラーが発生するので注意。

```console
     NoMethodError:
       undefined method `document' for nil:NilClass
```

### リスト 3.30: 基本タイトルを使ったStaticPagesコントローラのテスト (green)

インスタンス変数ではなく、`let` を使用してみる。

```ruby:spec/controllers/static_pages_controller_spec.rb
require 'rails_helper'

RSpec.describe StaticPagesController, type: :controller do
  render_views

  let(:base_title) { 'Ruby on Rails Tutorial Sample App' }

  describe "GET #home" do
    it "returns http success" do
      get :home
      expect(response).to have_http_status(:success)
      assert_select "title", "Home | #{base_title}"
    end
  end
end
```

こんな感じで Rails Tutorial を RSpec で進めていければ良いかと思います。
boost::tokenizerでcsvをパースしてみました。

## C++における定番のcsvパーサーは？

C++csvファイルをパースするライブラリってないのかと思ってぐぐってみたが、
あまり「コレだ！」というのがなかったのでとりあえずboostを試してみました。


## こんな感じになりました。

```C++
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <boost/tokenizer.hpp>


std::vector < std::vector< std::string > > parse_csv(const char* filepath)
{
    std::vector< std::vector< std::string > > cells;
    std::string line;
    std::ifstream ifs(filepath);

    // csvを走査
    while (std::getline(ifs, line)) {
        
        std::vector< std::string > data;
        
        // 1行を走査
        boost::tokenizer< boost::escaped_list_separator< char > > tokens(line);
        for (const std::string& token : tokens) {
            data.push_back(token);
        }

        // 1行読み込んだ結果を入れる
        cells.push_back(data);
    }

    return cells;
}



int main(void)
{
    const auto cells = parse_csv("test.csv");
    for (const auto& rows : cells) {
        for (const auto& cell : rows) {
            std::cout << "<" << cell << "> " << std::endl;
        }
        std::cout << std::endl;
    }

    return 0;
}
```

## 実行環境
OS: ubuntu16.04LTS
コンパイラ: clang++ 5.0.0


## 入力と結果
```txt:入力
2017,"hoge",,field 1
2018,"huga",,field 4649
```

```txt:結果
<2017> 
\<hoge> 
<> 
\<field 1> 

<2018> 
\<huga> 
<> 
\<field 4649> 
```

## 感想
エラーハンドリングなしで書いたのでめちゃくちゃ簡単でした。
まあエラーハンドリングを書いたところで大してコードは膨らまないと思いますが。



## 参考
http://www.boost.org/doc/libs/1_66_0/libs/tokenizer
http://kaworu.jpn.org/cpp/boost::tokenizer%E3%81%A7CSV%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80
phpでfile_get_contentsからcurlに移行する



#file_get_contents() のメリット・デメリット
気軽にURLを指定してその内容を取得してくれる便利な関数で、簡単に実装できるというメリットがある。だが、思ったどおりタイムアウト時間を指定できないことがあるので、なるべく使わないようにしたい。

```php:file_get_contents()
$url = htmlspecialchars_decode("http://api.hoge.com/1/api.php");
$json = file_get_contents($url);
```
#curl のメリット
タイムアウト時間を細かく指定できる。file_get_contentsのようにタイムアウト時間が思った通り動かないことはないので、可用性や完全性を求める必要があるものには必須だ。

##移行する

```php:file_get_contents()
$url = htmlspecialchars_decode("http://api.hoge.com/1/api.php");
$json = json_decode(file_get_contents($url),true);
```

以上のコードがあったとすると、以下のcurlに置き換えられる。

```php:curl
$url = "http://api.hoge.com/1/api.php"; //URLを指定
$ch = curl_init(htmlspecialchars_decode($url));
$options = array(CURLOPT_RETURNTRANSFER => 1,
                 CURLOPT_TIMEOUT => 3 //タイムアウトするまでの時間
                );

curl_setopt_array($ch,$option);

$json_data = curl_exec($ch);
$json = json_decode($json_data,true);
```

file_get_contents()を使用していたらタイムアウト処理がうまくできなかったので、移行してみた。
もしもっと良い方法や美しい書き方があればコメントで教えてください！
[メモ]論文読み"Matching Networks for One Shot Learning"

Matching Networks for One Shot Learning
===

# 概要
* 論文: Matching Networks for One Shot Learning
  * (https://arxiv.org/pdf/1606.04080.pdf)
  * 2016-0613
  * Google DeepMindの人たちの論文
* 内容
  * one short learningのためのネットワーク(MatchingNet)とその学習方法の提案


# 事前準備
## One shot Learning

One short learningとは、Nクラスへの分類問題において、あるクラスに属する教師データが1個しかないような問題。

たとえば、人間の子供の場合、1枚のキリンの写真を見ればキリンを認識できるようになる。深層学習の場合、大量の教師データが必要になる。

深層学習以外の手法で1個の教師データから学ぶことができる方法もある。例えば、k-nearest neighbors法などがある。

## 問題設定
* Nクラス分類問題を解く。
* 各クラスの教師データはかなり少ない(1~5個程度)

各クラスに属するデータが少ないデータ・セット$S = \{(x_1, x_2), ..., (x_k, y_k)\}$ とする。
$x_i$ は入力データ(画像など)、$y_i$ は正解ラベル。

この$S$から分類器$c_S$を生成する写像 $M_{\theta}$ を精度良く学習できれば少ないデータから分類機を生成できる。

$$M_{\theta}: S \mapsto c_S$$
$$c_S: x \mapsto p \in R^N$$

$\theta$ はモデルパラメータ。$p$ は各クラスに属する確率を表す。

上の2式を組み合わせて
$$P_\theta(y|x, S) := \phi_y(M_{\theta}(S)(x))$$

$\phi_y$はベクトルからスカラーへのマップで$y$次元目の値を抜き出す。
$$\phi_j([v_1, ..., v_j, ..., v_N]) = v_j$$


# 提案手法
2つの要素から構成される。
* モデル: MatchingNet。AttentionやMemoryを取り入れたネットワーク。
* 学習方法: 少ない教師データから学習させる。

## Model Architecture
モデルは小さなsupport $S$ から分類器 $c_S$ を作る。

提案するモデルは下記のモデルから着想を得ている。

* seq2seq with Attention
* memory Networks
* pointer netrowks

モデルをシンプルに表現すると下記のように書ける。
$$y'=\sum_{i=1}^k a(x', x_i) y_i \ \ \ \ \ \ (1)$$

ここで

* $x_i$, $y_i$ は support set $S$ に含まれるサンプルとラベル
* $y_i$ はone-hotベクトル、$y'$ は各ラベルへの重み。(と思われる。)
* $a$ はattention構造
* $a$ を $X \times X$ 上のカーネルとみなせば、式(1)はkernel destance estimator(KDE)とみなせる。
* もっとも $x'$ から遠い $b$ 個の $x_i$ に対して $a(x', x_i)$ が0ならば、(k-b) nearest neighborsとみなせる。

## The Attention Kernel
式(1)の $a$ を決める必要がある。最もシンプルな構造はコサイン距離$c$を使って、その距離のsoftmaxをとる方法。

$a(h', x_i) = \exp(c(f(x'), g(x_i)) / \sum_{j=1}^k \exp(c(f(x'), g(x_j))$

ここで、$f$, $g$はニューラルネットによって近似する。
例えば、画像処理の場合にCNN、自然言語処理の場合に単語の埋め込み等を使う。

## 関数 g,f の詳細
$g(x_i)$ は他のデータにも依存して決める。なので、 $g(x_i, S)$ と表す。
まずneural network(CNNなど)を使って $g'(x)$ 入力データを変換する。
LSTMを使って $g$ を計算する。

$$g(x_i, S) = h^r_{i} + h^l_{i} + g'(x_i)$$

$$h^r_{i}, c^r_{i} = \text{LSTM}(g'(x_i), h^r_{i-1}, c^r_{i-1})$$

$$h^l_{i}, c^l_{i} = \text{LSTM}(g'(x_i), h^l_{i+1}, c^l_{i+1})$$

$f$ は LSTM with real-attention をつかって定義する。
(詳しくは、Order Matters: Sequence to sequence for sets, https://arxiv.org/abs/1511.06391)

$$f(x', S) = \text{attLSTM}(f'(x'), \{g(x_i, S)\}, K)$$

$$h_k', c_k = \text{LSTM}(f'(x'), [h_{k-1}, r_{k-1}], c_{k-1})$$

$$h_k = h'_k + f'(x')$$

$$r_{k-1} = \sum_{i=1}^{|S|} a(h_{k-1}, g(x_i)) g(x_i)$$

$$a(h_{k-1}, g(x_i)) = \text{softmax}(h_{k-1}^T g(x_i))$$

## 学習方法
$$\theta = \arg \max_{\theta} E_{L \sim T}
\left[
  E_{S \sim L, B \sim L}
  \left[
    \sum_{(x, y) \in B} \log P_{\theta}(y|x, S)
  \right]
\right]$$

* Tはタスク。クラスの集合。
* LはTから一様にサンプリングしたクラスの集合(5個程度)
* Sはsupport用に正解ラベルがLに含まれるデータの集合(25個程度)
* BはSを与えたときの学習用データ。
cmd.exe のフォントを変更する

Windows のコマンドプロンプトのフォントを変更しようとして詰まったので、備忘録として記事にします。Windows 10 を使っています。

# 結論
結論として、レジストリ
 `\HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe` の編集によりフォントを変えることができました[^1]。ただしこの方法は `C:\WINDOWS\system32\cmd.exe` を直接起動する（これをやる最短経路は Win + R → cmd → Enter だと思います）場合にのみ有効です。スタートメニューやタスクバーに登録されたショートカットから起動する `cmd.exe` にはこの設定は反映されません。

1. `regedit` で `\HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe` を開く
2. `FaceName` を好きなフォント名に変更。
3. cmd.exe を起動し、フォントが変更されていれば成功。

# その他の方法
次のような方法もあるようですが[^2]が私の環境では効きませんでした。
1. `regedit` で `\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont` を開く
2. `932`から始まる名前のキー（`932.`など）を作成し、値にフォント名を入力
3. コマンドプロンプトのタイトルバーの右クリックメニュー→プロパティ→フォントで、選択可能なフォントの一覧が表示される。
4. 一覧の中に2. で設定したフォントがあるはずなのでこれを選び、OK。

私の環境では 4.で自分が入れたフォントが出てきません。原因は不明ですが、cmd.exeを直接起動する場合には最初に挙げた方法でフォントを好きなものにできるのでひとまず良しとしました。

[^1]: この方法は[コマンドプロンプトのデフォルトフォント変更 - 日曜プログラミング](http://sunday-programming.hatenablog.com/entry/2014/03/10/163209) の内容ほぼそのままです。
[^2]: この方法のほうが一般的なようです。[Windows8：コマンドプロンプトのフォント変更 - すなばあそび。](http://sandbox.hatenadiary.com/entry/2013/06/01/165431) や [cmd.exe基礎 - Qiita](https://qiita.com/matarillo/items/122523c9e79617fabdcd#%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88) などに載っています。
Google HomeでのLine送信ではまったので！

# すごいよ！！ＩＦＴＴＴ（イフト）
還暦エンジニアのくせに、IFTTTって今まで知らなかった。 
ＩＦＴＴＴ（イフト）とは、多くのサービス（LineとかGmailとかGoogle Home）をノンプログラミング簡単にし実装できるらしい。しかもオリジナルを作成、公開したりできるらしい。 
いつのまにこんなことができるようになったんだ？ 
自分の無知にほとほと呆れてしまう。  

今回、こちらのページを参考に、Google HomeからLineにメッセージを送るようにしてみたときに、はまってしまったり、わからなかったりした部分をメモとして残しておこうと思う。

**伝言を Google Home に声で伝えれば内容をテキストで Line に送る、という機能を作った。とても簡単。** 
http://yasukawa.hamazo.tv/e7716426.html

## 全体の構成 IFTTTってなんだ？
大きな流れというか「やり方」ではなくて「やること」をわかっていなかったので、説明と実際が少しでも異なると行き詰ってしまった。 
ざっくり言うと、
1. **IFTTTというツールの集合体がある。** 
2. **その中から二つのツールを結合して**
3. **Appletを作成して条件をいれて発動させる**
ということみたいだ。  

今回使うのは、 
- **Google Homeから音声をテキストで取り込むGoogle Assistantツール** 
- **取り込んだテキストを送信するのが Lineツール** 
ということ。

## 大きな流れ
最初にやっておくべきことがある。これがわかっていないとちんぷんかんぷんになる。それは？
- **各ツールはそれぞれ使えるようにIDとかメアドとか登録する**
- **初回だけ各ツール別にに登録が必要(Connectボタン)**
- **IFTTT(イフト自体が初めての場合は初回登録が必要)

## はまったこと
- **思ったサービスがない⇒SearchとかMoreで探せる** 
- **Lineグループがわからなかったらググって調べる**  
どういうことかというと、Line Notifyをいうユーザー＝友達ができて、その人を含めた会話をする設定にするという意味になる。 
自分のLine IDからメッセージを送るイメージでいると意外と迷う。  
つまり、  
**「誰かに送信したい場合は自分+Line Notifyという友達+送りたい友たちを追加する必要がある。」**ということ。

**試行錯誤したものの、わかってしまえば「こんな単純なの」って、ほんと恥ずかしい....**

PS
説明不足や間違いがあったら教えてください。
AWS SAMとServerless Frameworkを比較してみた

この記事はServerless Advent Calendar 2017 ２３日目の記事です。

最近Serverless Frameworkを使っていたのですが、先輩に「今の時代はAWS SAMだぞ」と言われ、気になったので比べてみました。


## Serveless Frameworkの特徴

### **デプロイしやすい・速い**

まずこれが一番の特徴ですね。
下記の例みたいにたったコマンド２つですぐ動かせるサーバーレスアプリケーションが出来上がります。

```shell-session
$ serverless create --template hello-world
$ serverless deploy
```

もし↑と同じことSAMでやろうとした場合：

- リリースステージ用のバケットの作成
- Lambda関数のコーディング
- 設定ファイルを書く
- Lambda関数のzip化
- Cloudformationによるパッケージング

これらの作業を全て自分でやらなければなりません。
Serverless Frameworkを使うとこういったデプロイ前の準備作業をよしなにやってくれますね。

まぁスクリプトやらCIでそこは解決できるとは思いますが、そもそもそこに時間や手間をかけずに自分のアプリケーションだけに集中したい人であれば、Serverless Frameworkの方が圧倒的に使い勝手が良いのではないでしょうか。

### **連携可能なサービスが豊富**

Serverless FrameworkはAWSだけでなく、Azure FunctionsやGoogle Cloud Functionsなど他社のクラウドサービスでも利用できます。
もちろんそれぞれのサービスの仕様や特性をある程度把握した上で利用するべきですが、Serverless Frameworkから利用する部分に関してはほぼ変わりません。
特にデプロイはどのサービスも同じコマンドでできます。

```shell-session
$ serverless deploy
```

### **様々なプラグインが利用できる**

Serverless Frameworkは使い勝手がとても良いのですが、もちろんまだ足りない部分や痒い所に手が届かないときもあったりします。そういう時はプラグインで補ったりすることができます。
例えば、デプロイしたファンクション毎にDead letter queueを[serverless-plugin-lambda-dead-letter](https://github.com/gmetzker/serverless-plugin-lambda-dead-letter)で設定できたり、Serverless Frameworkの定義ファイル内でStep Functionsの設定を可能にする[serverless-step-functions](https://github.com/horike37/serverless-step-functions)などがあります。
Serverless Frameworkのコミュニティ自体が大きいので、様々なプラグインが多数みつかるのも良い点だと思います。



## AWS Serverless Application Modelの特徴

### **AWS関連サービスとの親和性が高い**

Cloud Formationを拡張したサービスなので当たり前かもしれませんが、AWSリソースとの連携がしやすい印象でした。
もしすでにCloud Formationを使ってきた方であればあまり不自由なくSAM利用できるでしょう。

```yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  PutFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs6.10
```
このように通常のCloudFormationのテンプレートに `Transform: AWS::Serverless-2016-10-31`　と１行追加すれば、SAMのテンプレートフォーマットを利用することができます。

### **ローカル環境でのテストが可能**

事前にDockerのインストールが必要になりますが、[AWS SAM Local](https://github.com/awslabs/aws-sam-local)をインストールすればローカル環境でのファンクションのテストが可能になります。

```shell-session
$ npm install -g aws-sam-local
```

以下のように実行したいファンクション名と渡したいリクエストのボディをjsonで指定するとテストが可能になります。

```shell-session
$ sam local invoke "FunctionName" -e event.json
```

また、Lambdaを起動するイベントのペイロードもエミュレートできます、以下が対象サービスです：

- S3
- Kinesis
- DynamoDB
- Cloudwatch Scheduled Event
- Cloudtrail
- API Gateway

生成したイベントのペイロードをローカルで起動するファンクションに以下のようにパイプラインで渡すことができます。

```shell-session
$ sam local generate-event s3 --bucket bucket-name --key xxxxx | sam local invoke "FunctionName" 
```

※ Serveless Frameworkも[serverless-dynamodb-local](https://github.com/99xt/serverless-dynamodb-local)と[serverless-offline](https://github.com/dherault/serverless-offline)というプラグインをインストールすればローカルでのテストも可能ですが、独自の設定が必要な上Node.js限定という欠点があります。

## まとめ

すこしサクッとさわってみて比べた印象ですが、今後他のクラウドサービスに切り替えたいかもしれない時やとにかくスピード重視でアプリケーションを動かしたいのであればServerless Frameworkがいいと思います。
もしアプリケーションをAWSのサービス中心で構成し、それなりに長く運用していくのであればAWS SAMが適しているかもしれません。
ただ、「アプリケーションを素早く本番運用できる状態にし、またサーバーやそれに関連するサービスの運用にかける時間をアプリケーションのコーディングに割り当てることを可能とし、ユーザーにより価値のあるサービスを提供する」といったサーバレスの思想に一番近いのはServerless Frameworkではないでしょうか。
2017年総振り返り

# 2017年総振り返り

## 最初に

今年ももう終わりということで、自分自身のこの1年、何を勉強してきたかをほんわか思い出してみたいと思います。

全然Tech系じゃないので、のちのち自身のブログの方へ移します。

大まかな流れとしては

Event for Diverse Game Engineers主催
↓↓↓
ソシャゲ開発でUnity4.6→2017に鞍替え
↓↓↓
自ら望んでVR開発してる、よむネコに移動
↓↓↓
.Net Conf 2017 Tokyo登壇
↓↓↓
Oculus Connect4参加
↓↓↓
VR技術者試験受験
↓↓↓
Microsoft MVPに応募

こんな感じです。

## 1月〜2月

EDGEの開催のために、会場の下見や企業様との打ち合わせを重ねていて忙しかったなぁ、ということだけ覚えています。

## 3月

EDGE開催です。様々な人にご協力頂いて、とても有用な勉強会を開催することが出来ました。2018年にも再度開催を行いたいと思います。

会場提供して頂ける方と、登壇してくださる方と、お手伝いスタッフさんは募集中です。

あとこの頃、花月嵐の期間限定ラーメン、万番菜にはまって週一で食べてました。６年半ぶりの復活と言わず、レギュラーメニューとして復活して欲しいくらいです。

## 4月〜7月末

本格的にC＃やUnityの勉強を行っていました。この頃はたまに勉強会に顔出してたくらいで、基本的にQiitaに記事を投稿しまくってました。

確か、その辺でVScodeについての記事を投稿したら結構見てくださる方がいて、嬉しかった記憶があります。現在108イイネを頂いているため、早く更新しなきゃという焦燥感に駆られています。

## 8月

株式会社よむネコに移動してVRゲーム開発に携わり始めました。UE4を本格的に使い出して、勉強勉強で励んでいた気がします。

## 9月〜11月

AIの勉強をしまくっていました。ここで得た知見の集大成が先日公開した例のAI記事となっています。

9月に確か、うすいさんの後押しもあり、C＃言語機能勉強会を行いました。普段合わないような人達とコミュニケーションを取れたのがとても楽しかったです。

10月は.NET Conf 2017 Tokyoに登壇したり、その翌日にUnreal Fest参加したり、翌週にOC4参加したりでイベント的な意味で忙しかったです。

OC4はマジで英語わからなくて死んでました。この時会場でにぅさんというフォロワーの方と初対面しました。あと白米が驚きのレベルで美味しくなかったです。あ、ステーキはめちゃくちゃうまかった。またアメリカ行きたい。

11月は特に業務も忙しくなっていく中、業務に差支えがない程度で、VR技術者試験の勉強したり、アドベントカレンダーの記事書いたりしてました。

多分結構目が死んでた気がします。

## 12月

今月です。アドベントカレンダーとVR技術者試験でわたわたしていました。遅刻もしたけどなんとかやり遂げられて良かったです。

AIの記事は、いろんな方の目に留めていただき、色々な感想をもらうことが出来ました。本当に有難うございます。特にalweiさん、三宅さん、Pavilionさんに褒められたのが嬉しかったです。あ、社内でも褒められました。

AIの記事を公開したあとに、ふと軽い気持ちでMVPってどのくらいの実績でいけるもんなのかな、と呟いたところ、現役MVPのみそさんが色々アドバイスをして下さり、更には岩永さんから推薦を頂いたため、いろんな後押しによって応募させていただくこととなりました。

結果がどうであれ、応募したという経験に意味があると思うのでダメでもまた頑張ります。

あとはこの月の半ばに唐揚げ忘年会をやりました。当初は人が集まらない想定でイベント公開してましたが、思いのほか20人ほど集まって下さり、とても楽しい時間を過ごすことが出来ました。また来年どこかで開催できたらなぁと思います。

## 来年の抱負

- 英語頑張ります。スタディサプリやりきります。
- Udemyの講座消化します。
- 読書スケジュール達成します。毎月2冊頑張るぞい。
- もっと勉強会登壇できるように頑張るので呼んでください。

## 最後に

私がここまで好きなことをあれこれやったり、イベントに参加したりできたのは、ひとえに皆様のご協力のおかげなのです。僕自身の努力自体はそこまで大きなものではないのですが、色々な機会を頂いたおかげで去年よりも大きくスキルアップができました。本当に有難うございます。また来年もどうぞよろしくお願い申し上げます。
curlコマンドを1秒ごとに実行する

##やりたいこと
以下のcurlコマンドを1秒ごとに実行したい。

```ruby:curlコマンド
curl https://www.coingecko.com/ja/%E7%9B%B8%E5%A0%B4%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88/%E3%83%AA%E3%83%83%E3%83%97%E3%83%AB/jpy | grep -e "今日のリップル の価格は <b><span>"
```
最近rippleコインに注目しているので、わざわざrippleチャートサイトにアクセスするのがめんどくさいので自動化して出力させる通知アプリを作りたい。

##結論

`watch`コマンドを使用する。

```ruby:1秒ごとに値を取得してきてくれるコマンド
watch -n 1 "curl https://www.coingecko.com/ja/%E7%9B%B8%E5%A0%B4%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88/%E3%83%AA%E3%83%83%E3%83%97%E3%83%AB/jpy | grep -e '今日のリップル の価格は <b><span>'"
```
まだ邪魔な部分があるけど一旦は気にしない。
アプリにするのは来年ーー
Windows 10 (Windows Subsystem for Linux) で Google Home に喋らせたい

多くの人がやっているので特に目新しくはないですが、個人のメモとして残します。

## やること

Windows Subsystem for Linux(以下、WSL) に google-home-notifier をセットアップして、何かを喋らせる

## WSL とは？とかなら

こちらとてもわかり易いので、読んでセットアップまでしちゃいましょう！

* [シス管系女子BEGINS 特別編 まんがでわかるWSL](http://system-admin-girl.com/comic/begins/sp-wsl/)


## Node.js のセットアップ

apt の向き先を日本のリポジトリに向けて、必要なパッケージをインストール

```bash
$ sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get install python-minimal make g++ libavahi-compat-libdnssd-dev
```

nodebrew と Node.js のセットアップ

```bash
$ curl -L git.io/nodebrew | perl - setup
$ echo 'PATH="$HOME/.nodebrew/current/bin:$PATH"' >> ~/.profile
$ source ~/.profile
$ nodebrew install-binary latest
$ nodebrew use latest
```

確認(2017/12/31 現在の表示)

```bash
$ node -v
v9.3.0
$ npm -v
5.5.1
```

必要なサービスの起動と自動起動化

```bash
$ sudo service dbus start
$ sudo service avahi-daemon start
$ sudo systemctl enable dbus
$ sudo systemctl enable avahi-daemon
```

## google-home-notifier のインストール

```bash
$ cd ~
$ git clone https://github.com/noelportugal/google-home-notifier.git
$ npm init
$ npm install google-home-notifier
```

## 動かしてみる

example.js という例がついているので、下記部分を修正後に保存する


```js
var deviceName = 'Google Home';  // <-- Google Home に設定した名前に書き換える
var ip = '192.168.1.20'; // <-- Google Home の IP アドレスに書き換える
var language = 'ja'; // <-- 書き換える

```

起動させる

```bash
$ node example.js ＆
```

メッセージの最後に例が表示されるので、コピペでそのまま実行してみると「へろぉ～ぅ ぐ～ぐる ほ～む」と話ししてくれるはず

```bash
GET example:
curl -X GET https://xxxxxxxx.ngrok.io/google-home-notifier?text=Hello+Google+Home
POST example:
curl -X POST -d "text=Hello Google Home" https://xxxxxxxx.ngrok.io/google-home-notifier
```
機械学習を勉強するなかで最適化数学を学ぶ意味とは

## 背景

ひょんなことから最適化数学を勉強して、それを記事にする必要が発生。
`機械学習のために役立つ最適化数学`という位置づけでの記事作成が必要なのです。

なので、最適化数学がどのような形で機械学習に役立つのかを調べてみた。

## 最適化数学とは？

`最適化数学`とは、`最適化問題`を解くための`数学`です。
読んでそのままなので引き続き説明が以下に続きます。

## 最適化問題とは？

例えば以下のような問題と向き合ってみましょう。

- `焼肉`は2000円/人前、`チキン南蛮`は600円/人前、`フライドポテト`は350円/人前
- `焼肉`は1200kcal/人前、`チキン南蛮`は1000kcal/人前、`フライドポテト`は850kcal/人前
- `焼肉`を食べるのに7分/人前、`チキン南蛮`を食べるのに10分/人前、`フライドポテト`を食べるのに15分/人前
- 予算は1万円
- 食事に使える時間は60分
- 食べていない時間はとんでもない皿洗いさせられるので100kal/分消費してしまう

この条件下で、もっともカロリーを摂取するにはどうすればよいでしょうか。

このような`ある条件下`で何かを`最大化`させたり`最小化`させたりする問題が`最適化問題`です。

## 機械学習での最小化

例えば`駅からの距離`、`部屋の広さ`、`築年数`から`家賃`を予測する機械学習を実装する流れは、

1. 大量の`駅からの距離`、`部屋の広さ`、`築年数`、`家賃`のデータを集める
2. 大量のデータから、法則（`家賃`の計算式）を導く

です。
しかしながら、`導かれる計算式の結果`と`家賃`には`差`が存在します。
（すべて計算式で1円たりとも違わずに表現できるはずがない）

この`差`が小さくなるように、計算式を考えていくことが機械学習の研究者たちのやるべきことでもあるのです。

## 最適化数学と機械学習の共通点

つまり、`機械学習`で`差を最小化させたい`とき`最適化数学`を使えるという事なのです。

これが`最適化数学が機械学習に役立つ理由`です。
では、頑張って`最適化数学`勉強していきます！
CakePHP3 コントローラとコンポーネントのコールバック呼び出し順

呼び出し順

1. Controller::initialize()
2. Component::initialize()
3. Component::beforeFilter(Event $event)
4. Controller::beforeFilter(Event $event)
5. Component::startup(Event $event)
6. Component::beforeRender(Event $event)
7. Controller::beforeRender(Event $event)
8. Component::shutdown(Event $event)
9. Controller::afterFilter(Event $event)


* [コントローラーのコールバックメソッド](https://book.cakephp.org/3.0/ja/controllers.html#id17)
* [コンポーネントのコールバック](https://book.cakephp.org/3.0/ja/controllers/components.html#id10)
Qiitaの記事をスマホから投稿する

- この記事について(2018/1/9追記)

↓のようなくどいことをしなくても、`下書き一覧`から新規投稿が可能であることを確認しました。(なぜこんな場所に…orz)

というわけで以下は参考、または小ネタ程度にお願いします。m(_ _)m

#書いた経緯

本当は別なことを書こうと思っていましたが、(それはそれで挙げます。)
とある事情[^1]により、スマホから投稿しなければならなくなり、ツボったのでそのことについて。

備忘録的な感じです。スマホから投稿しています。

時期によるのかもしれませんが、Qiitaはスマホからみると`投稿する`ボタンが(少なくとも私のiPhone Safariからは)見えません。

さらにQiitaはレスポンシブデザインにしているのか、`デスクトップ用サイトを表示`を押しても表示が変わらず。さぁ、困りました。

#押せないボタンを押してみる

ソースを確認するとクラス`st-Header_postButton`がついた`a`要素が件の要素のよう。

ということはこれでどうだ！

```javascript:bookmarklet
javascript: document.getElementsByClassName("st-Header_postButton")[0].click();
```

<img width="375" alt="9A3897BA-2962-4A60-820A-53DB40400AD4.png" src="https://qiita-image-store.s3.amazonaws.com/0/205472/32be773e-a67d-63a9-8ff2-6f604e7ee1b0.png">

ここでブックマークポチッとな！

<img width="375" alt="1849CD79-4A44-4CC5-B9F0-1B605FAC5F41.png" src="https://qiita-image-store.s3.amazonaws.com/0/205472/63ddcd7e-a163-7c06-dfb7-c981f851a593.png">

おぉ、投稿画面が開けた！

#終わりに

以上になります。一度投稿した記事を編集するには、記事ページのurlに`/edit`をつけるといいそうです。[^2]

[Qiitaのスマホサイトで記事を編集する](https://qiita.com/okmr-d/items/b40e41f0a6920c7c8db5)

この記事書き終わったら試してみるつもりです！(追記: 編集できました！)

ということで、では、またお会いしましょう。(適当に書いたので間違いがあれば編集リクエストください。よろしくお願いします。m(_ _)m)

- 2018/1/9 追記

`viewport`を変更して表示させる方法もあります。[「デスクトップ用サイトを表示」がうまくいかない時の必殺技 - Qiita](https://qiita.com/namn1125/items/5d5a39e7e4c3c2eed0b9)にまとめましたので、よかったら読んでみてください。m(_ _)m

[^1]: 当方受験生の身でして、PCを取り上げられているのです。センター1週間前に何してるんだお前！という話です。(^ ^;

[^2]: 現在は⚙マークから`編集する`を選べますので、実はこの方法はもう不要です。一応書き残しておきます。
gemやBundlerについてメモ(概要だけ）

Railsの勉強を始めて、gemとかBundlerとかなんぞやっておもったので勉強がてらメモしました。
間違い等あったら指摘していただくとうれしいです。

#gemとは
>多くのプログラミング言語と同様に、Ruby にも幅広いサードパーティのライブラリが提供されています。
>それらのほとんどは “gem” という形式で公開されています。RubyGems は (Ruby に特化した apt-get と同じようなパッケージングシステムで) ライブラリの作成や公開、インストールを助けるシステムです。

([https://www.ruby-lang.org/ja/libraries/]("https://www.ruby-lang.org/ja/libraries/")　より引用）

まず、Rubyには様々なライブラリ（例えばRuby on Rails)が存在するのですが、それを管理するのが、<b>RubyGems</b>というソフトウェアがあります。RubyGemsのおかげで、ライブラリのインストールやアンインストール、更新が可能になります。Ubuntuのapt-getみたいなものです。
そして、RubyGemsを使ってインストールされるRubyライブラリが<b>gemパッケージ</b>というカタチで配布されているのです。

ちなみにRubyGemsはRubyをインストールしたときについてくるのでRubyGemsのインストールに関して心配する必要はなさそうです。

#gemコマンドについて
RubyGemsを使ってRubyライブラリの管理（インストール、アンインストール、更新など）を行うコマンドを<b>gemコマンド</b>といいます。
用例をいくつか見てみましょう。
これはRubyGemsがどのように使われるかを確認してほしいだけなのでちょう基本しか書いていません。詳しくは[初心者は覚えておきたいRubygemsのコマンドまとめ]("https://qiita.com/muran001/items/14f34b735e0a6b4af98c")　を参照)

```
# 最新版のRubyライブラリをインストール
$ gem install <gemパッケージ名>

#Ruby on Railsの最新版をインストール
$ gem install rails

#パッケージのバージョンを指定してインストール
$ gem install <gemパッケージ名> -v <バージョン>

#Ruby on Railsの4.2をインストール
$ gem install rails -v 4.2

#インストールしたgem(Rubyライブラリ)を一覧で表示
$ gem list
```

#GemfileとBundlerについて

これまで述べてきたように、RubyGemsを使ってgemパッケージによりRubyライブラリをインストールしていくのです。しかし、複数のgemパッケージを個々にインストールすると問題が起こることがあります。
例えば、依存関係の問題（くわしくないので詳細は割愛）。また、複数人で開発を行う時、環境をそろえたいので、インストールするgemパッケージとそのバージョンを揃えるとき、一々確認しながらのインストールだと面倒です。

そういった問題をクリアにしてgemパッケージのインストールを行ってくれるのが<b>Bundler</b>です。
また、Bundlerによってインストールするgemパッケージを記述したものが、<b>Gemfile</b>です。

#Bundlerの使い方
(※Bundlerがどういうものかを確認するためのものです。実用的ではないので、実際にこれから使う方は別記事を参照してください。）

###1.Bundlerのインストール

BundlerもRubyGemsによりインストールを行います。

```bash
$ gem install bundler
```

###2.Gemfileを記述する。
```bash
$ bundle init
```
でGemfileの雛形が生成されるので、それを元に記述します。

###3.Gemfileを元にgemパッケージを一括でインストール

```bash
$ bundle install
```
ユニティちゃんをDeferred Renderingに対応するメモ(更新中)

Unity 2017のStandard AssetのPost-Processing Profileを色々使いたい。
でもDeferred Renderingすると、ユニティちゃんの描画が色々おかしい！

そこで調整方法をメモ。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/096bbdf7-3057-8380-20c1-71fe6012697a.png)

#まずは2017の機能を堪能する為にAsset Storeへ

ユニティちゃん
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/d87c7434-e70c-a13e-ecec-419a7a770091.png)

おなじみStandard Asset。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/ca86406c-740e-58c5-67d0-d75e50d72d1b.png)

しかし、楽しいImageEffectは「探さないで下さい」と書置きを残して去っているので連れ戻しに行く。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/f4f95624-3cd2-3b8a-ff33-d02f30c999aa.png)

```text:Readme.txt
The old image effects have been deprecated and moved to the Asset Store: https://www.assetstore.unity3d.com/#!/content/83913

We recommend that you now use the new post-processing stack. You'll find it at https://www.unity3d.com/postprocessing
```

リダイレクトされて下記へ飛ぶ。ZIPで貰いましょう。
https://github.com/Unity-Technologies/PostProcessing

# カメラの設定

そしてインポート（手動）。

ImageEffect用のプロファイルを下記で作成
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/1d1ca4ee-142f-bdc5-447e-cc5cfc90d03a.png)

カメラに突っ込む
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/69542a09-67fc-d380-c988-a173e309ebfb.png)

（もしかして最新版変わっている？）

# ImageEffectの設定

Deferred Renderingをしたいと思うのは、ライトをたくさん使いたい時などですが、ユニティちゃんはシェーダーの関係で夜のシーンに向かないです。私は下記の「Screen Space Reflection」を試したくてDeferred Renderingしました。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/425adb65-8717-da86-a24d-1290186f5f76.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175864/b8f7cb23-4aae-7444-eb65-dd42843f1282.png)

↓↓↓

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175864/4d01d893-0d6f-2f32-1fc3-dac01f984725.png)

おや、なんかもうすでにユニティちゃんの描画おかしくないですか。

あぁ。なんかサングラス的なものが。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/b100af85-7185-cf73-a253-ec625ba8b6b5.png)

# ユニティちゃんを修正してしまう。

色々おかしいのですが、まずこのサングラス的なものの正体はcheekです。
ほっぺを薄ピンクにしているシェーダーがレンダリング順が変わって誤作動してます。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/ca95c536-8869-6eb0-5ebb-ddba26301a10.png)
レンダリング順をTransparentまで遅らせます。

ほっぺはOK。ほっぺは。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/9e367750-48c7-244d-afbf-dce2a2f51a36.png)

今度はAnbient Occlusionが悪さしてます。
こっちはデフォルトだとこうなります。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/92a38eea-2d08-0db1-c766-70a8c5b2c371.png)

なので「Force Forward Compatibility」にチェック入れちゃいます。

これで対応できたかと思いきや。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/175864/30f344e6-0961-b21e-4a9d-28133444f93a.png)

お分かりいただけただろうか。
「Screen Space Reflection」は一度レンダリングした結果を再利用しています。
ともすれば、ユニティちゃんシェーダの書き込み順が悪さしているのは明らかです。


（続く）
C言語で学ぶシンプソンの公式による積分の近似計算

#シンプソンの公式とは
台形公式(https://qiita.com/stmtk/items/0d43372950fe3ee674be) では積分したい関数を何分割かして区間ごとに台形の面積を求めてそれらを足すと積分した値と近くなるという方法でした。
しかし、台形公式のページの絵を見ていただくとわかると思いますが、区間ごとに1次関数に近似して積分してるのと同じですね。1次関数で近似するとカーブを表現できない分誤差が出てしまいます。なので区間ごとに2次関数で近似するためのものがシンプソンの公式です。
$ f(x) $が3次以下の1変数多項式の場合

```math
\int_a^b f(x) dx = \frac{b - a}{6}\left(f(a) + 4 f\left(\frac{a + b}{2}\right) + f(b)\right)
```

# 導き方
まず、ラグランジュの補間多項式(https://qiita.com/stmtk/items/e622bfb1e65b76d33fa1) を使って$ \left(a, f(a)\right), \left(\frac{a + b}{2}, f(\frac{a + b}{2})\right) , \left(b, f(b)\right) $の三つの点を通る2次関数を求めます。そして積分すると、シンプソンの公式と一致するはずです。証明は書くのがめんどくさいので省きます。

#ソースコード

```simpson.c
#include <stdio.h>
#include <math.h>

#define EPS (1.0e-6)
#define f(x) ((x)*(x))

int main(){
    double a = 0, b = 2, sum = 0;
    for(double x = a; x < b; x += EPS * 2){
        sum += (f(x) + 4 * f(x + EPS) + f(x + EPS * 2));
    }
    sum *= (b - a) * (EPS / 6);

    printf("%f\n", sum);
}
```