OmniAICreator/Qiita-1.07M huggingface dataset:
webpackerでRailsにReactを導入するまでの手順書

# 前書き

Rails5.1でwebpackやReactなどフロントエンド周りの開発が簡単に行える様になりました。
(普段Reactをメインで使っている人にとっては素晴らしいニュース)

既存のRailsプロジェクトにReact開発環境を導入するまでの手順をまとめます。

# 導入までの流れ

## webpackerの導入

```rails new```時にオプションで指定する事もできますがここでは、単純に```rails new```して、
後からwebpackerを導入する場合とします。

```
$ rails new my_app
```

Gemfileにwebpackerを追記します。

```rb
source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

...

# webpackerを追加
gem 'webpacker'

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'capybara', '~> 2.13'
  gem 'selenium-webdriver'
end

...

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

bundleを実行

```
$ bundle
```

bundle実行後webpackerに対して色々なコマンドが使える様になります。
以下のコマンドでプロジェクトにwebpackerの各種ファイルを生成します。

```
$ rails webpacker:install
```
上記実行後、ルートディレクトリに下記の4ファイルが生成されます。

* .babelrc
* .postcssrc.yml
* package.json
* yarn.lock

また、フロントエンド開発用の各種ディレクトリやファイルが追加されます。

* app以下にjavascriptディレクトリが生成される。
    * ここでReactのコードを書いていきます。
    * app/javascript/packs/application.jsがエントリーファイルとなります。
* bin以下に、webpackやwebpack-dev-server実行用のファイルが生成される。
* configのwebpack以下にloader関連のファイルが生成される。
* node_modulesが生成される。
    * ```rails webpacker:install```実行すると、```yarn install```も実行されます。


ここまでで、webpackerの導入は完了です。

## Reactの導入

webpackerの導入が終わったので、webpackerでReact開発ができる設定を追加していきます。
とはいっても簡単で、下記のコマンドが用意されているので実行するだけです。

```
$ rails webpacker:install:react
```
上記のコマンド実行で、.babelrcへの追記やpackage.jsonの追記が行われ、
React開発に必要な環境が完成します。

## ERBへの追記

実際動作を確認する為に、ERBにJSのインクルードを記述します。
これも簡単でwebpacker用にヘルパーが準備されています。
動作確認の為、適当なcontrollerとviewを作成します。

```
$ rails g controller tests index
```

index.html.erbを以下の様に修正します。

```app/views/tests/index.html.erb
<div id="mountNode"></div>
<%= javascript_pack_tag 'hello_react' %>
```
javascript_pack_tagヘルパーは、app/javascript/packs以下のエントリーとなるファイル名をインクルードします。
**hello_react** は```rails webpacker:install:react```時に生成されたエントリとなります。

## サーバーの起動

開発環境ではRail用のWebサーバとwebpack用のサーバの両方の起動が必要です。

```
$ rails s
```

```
$ bin/webpack-dev-server
```

いちいち2回コマンドを打ち込むのは面倒なので、
package.jsonのスクリプトにコマンドを追記します。

```package.json
...

  "scripts": {
    "start": "rails s & bin/webpack-dev-server"
  },

...
```

```
$ yarn start
```

上記で、2つのサーバーが立ち上がります。


## 動作確認

デフォルトなら```http://localhost:3000```にアクセスします。

以下の画面が出ていれば成功です。


![スクリーンショット 2017-06-28 13.04.55.png](https://qiita-image-store.s3.amazonaws.com/0/129216/077d6084-25af-18db-7dd2-038d4c80e970.png)

# あとがき

webpackerを使う事でものすごく簡単にReact開発環境を構築できました。
webpackの設定や、loaderの追加なども柔軟にできそうです。
(SSRしたければ、react-on-railsが良さそう)

各環境に合わせてのビルド様コマンドもwebpackerが提供しているので、
ビルドも柔軟に対応できそうです。

次回はwebpackerのビルド周りについてまとめます。
ggplot2::geom_spokeで線分(スポーク)を描く

見つけたのでメモ。こういうのがさくっと描けます:

![fig0-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/1f3ead10-7793-c570-2af6-db6dfdef5ad2.png)

geom_spokeとは
---------------

ある座標点(x, y)から，向き(angle)と半径(radius)を指定することで線分(segment)を描くものです。似たようなものとして，`geom_segment`がありますが，こちらは座標の開始点(x, y)と終了点(xend, yend)を指定するのが違いです。

というか`geom_spoke`は受け取ったデータのangleとradiusからxendとyendを算出し，GeomSegmentをベースに組み立ててるんだと思います。

使い方
------

### 参考ドキュメント

ggplot2の公式サイトにある，以下のドキュメントを参照してください:

[Line segments parameterised by location, direction and distance — geom\_spoke • ggplot2](http://ggplot2.tidyverse.org/reference/geom_spoke.html)

また，基本は`geom_segment`なので，そちらのドキュメントも参照するとなおいいかと:

[Line segments and curves — geom_segment • ggplot2](http://ggplot2.tidyverse.org/reference/geom_segment.html)

### 基本的な使い方

前準備としてライブラリ読み込みと使うデータを準備

``` r
library(dplyr)
library(tidyr)
library(ggplot2)

df <- crossing(x = 1:5, y = 1:4) %>% 
  mutate(angle = runif(20, 0, 2 * pi)) %>% 
  mutate(speed = rnorm(20, 0.4, 0.2) + 0.3) %>% 
  mutate(label = LETTERS[1:20])
```

では，このデータを使って早速プロットしてみます:

``` r
g <- ggplot(df, aes(x, y))

g + geom_spoke(aes(angle = pi, radius = 0.5)) +
   geom_point()
```

![fig1-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/c7011263-424d-056b-807b-bbe4c643e03f.png)

このように，`aes()`でangleとradiusを指定すると，その角度とその半径で線分が描かれます。もちろん変数で指定するのもOKです:

``` r
g + geom_spoke(aes(angle = angle, radius = speed)) +
  geom_label(aes(label = label))
```

![fig2-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/420ff07f-9303-b0f7-fb48-f6b3eeb61259.png)

今回はついでに各開始点に`geom_label`でラベルを重ねました。あと，矢印にもできます:

``` r
g + geom_spoke(aes(angle = angle, radius = speed), arrow = arrow()) +
  geom_label(aes(label = label))
```

![fig3-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/43ae35d9-29e5-6671-d3d6-016bfa00754f.png)

矢印に関しては，上述した`geom_segment`のドキュメント，もしくは`?arrow`を参照してください。

応用例
------

私の方でちょっと遊んでみます。

``` r
# データを編集
df2 <- df %>% 
  mutate(x_rnd = rnorm(20, 3, 1)) %>% 
  mutate(y_rnd = rnorm(20, 3, 1)) %>% 
  mutate(group = case_when(
    between(angle, 0, pi/2) ~ "右上",
    between(angle, pi/2, pi) ~ "左上",
    between(angle, pi, pi*3/2) ~ "左下",
    between(angle, pi*3/2, pi*2) ~ "右下"
  ))

# 色々加えてみる
ggplot(df2, aes(x_rnd, y_rnd, group = group)) + 
  geom_spoke(aes(angle = angle, radius = speed, color = group),
                arrow = arrow(length = unit(df2$speed * 0.04, "npc"))) +
  geom_label(aes(label = label, color = group), show.legend = FALSE)
```

![fig4-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/c8c62c0f-b6e8-e077-3982-813761d0d95d.png)


このような感じとなります。活用例としては，気象データの風の可視化や，人の動きの可視化など，いろいろあると思います。色々試してみてください。

**Enjoy!**
Emacsは美しい(Magitに激しく感動した話）

タイトルは指摘あったので変更しました

ここ半月ほどGitとGithubにすごく悩まされてる。
原因はGitの概念を理解できていないこと、それと編集したファイルをとりあえず何でもかんでもコミットしてしまってレビューを大変にしてしまうところ
これはいけない...
そこでいろいろ調べて見たり教えてもらったりして調べると以下のことがわかった。

## tig
まず最初に教えてもらったのはtigというツール。
> tigいいですよ。tig

とのことで導入したらすごく良かった...
導入は`brew install tig`でオッケー
Macはかんたん(*´ω｀*)

あとはgitのレポジトリからtigと打ち込むだけで利用できる。
なんてこったCUIなのにいろいろ操作できるぞ(ﾟдﾟ)！
もうこれでいいんじゃないかな....

## Magit
僕がEmacsを利用するのはプログラムを書くとき一番無駄な時間がカーソルを動かすことにあると思っているからだったり。
それならマウスが存在しないであろう時代、ないしはマウスが使えない環境で使われているエディタを使えば良い！と考えて使ってたりします。実際、２０年以上の歴史を持ちながら多数のIDEと渡り歩けるテキストエディタはEmacsの他にはVimしかないと思う。（もともと僕はVimmer(ﾟдﾟ)！）
でなるべく手を離さず、つまりテキストエディタから離れず起動しっぱなして最もGitを操作できるやつが優勝...
そこで調べてたら出てきたのが`Magit`さん。
結構有名らしい。

多くのEmacsユーザは自らのEmacsを大改造する。もちろん僕も。
僕は自分の`init.el`に

```
;; Git関連
(require 'magit)
(define-key global-map (kbd "M-g") 'magit-status)
```
こう書いてる。
メタキーとgを入力するとMagitさんが立ち上がる。
これは先のtigみたいなものがEmacs上で起動し、そしてそのまますべての操作ができるというツールだ。
tigにはpush機能が存在しないがMagitにはpush機能すら存在する...。無敵すぎる。
`magit-status`が起動した状態だとなんのファイルを編集したのかが一目瞭然。ステージングエリアにあげたいファイルにあわせて`s`を押せばステージングに`u`を押せばアンステージングとなる。
それがおわれば`c`を２度ほど押せばコミットに移行する。メッセージを書いて`Ctrl - c`を２回実行すればCOMMITされ`P`を押せばプッシュできる。
すげぇ... 

ほかにももっとコマンドがあって
`b`を２回押せばブランチを切り替えることも
`z`押して`k`を押せばstashを始末することもできる
`M`でいきなりローカルリポジトリを設定することもできるのでEmacsから離れずにすべての操作を完結することができる。
すげぇぇ
Array() as default callback

```javascript
const doSomethingSync = (params, callback = Array) => {
  if (!validate(params)) {
    return callback(new Error(), null);
  }

  const result = calc(params);
  return callback(null, result);
};

// Retrieve as returning values.
const [err, result] = doSomethingSync(params);

// Retrieve with node-style callback.
doSomethingSync(params, (err, result) => { });
```
圏論の図式をSwiftで描く

圏論の勉強をかねて図式をSwiftで描くプログラムを作っています。
今作っているのは次のようなものです。

https://github.com/KatagiriSo/RDCategoryWriter

これを使えばSwiftで圏の対象の表示位置と射を定義することでxymatrixを吐き出すことができます。

例として

```swift:category.swift
// 全体の大きさを決定する
let maxsize = (4,4)
var matrix:[String:(Int,Int)] = [:]

// 圏の対象 A,B,C,D　 配置する。
["A","B","C","D"].enumerated().forEach {
  matrix[$0.1] = ($0.0,0)
}

// 射の指定　A->B->C->D
let abcds = [["A","B","f"],["B","C","g"],["C","D","h"]]
let abcdArrows = abcds.map { Arrow($0) }

// 圏の対象 E　　ここでA,B,C,DはEへの射をもつ
matrix["E"] = (3,3)
let others = ["A","B","C","D"].enumerated().map {
   Arrow([$0.1,"E","z" + "\($0.0)"])
}

let arrows = abcdArrows + others

display(matrix:matrix, matrixsize:maxsize, arrows:arrows)
```

のようにコードを書くことで以下のような図式を描くことができます。

![picture.jpg](https://qiita-image-store.s3.amazonaws.com/0/6734/1f5bc613-b85e-7322-4ed2-6cbc31bdda8a.jpeg)



現状は簡単な図式しか書けませんがさらに複雑な図式が書けるようにしていければと思います。
ServiceNow Jakartaアップデートトピックス？ - ホームページをPDFにエクスポート出来るようになってた -

ServiceNowのバージョン「Jakarta」での変更点？
[まとめはこちら](http://qiita.com/Kisaragi13/items/3f332bb2a5b2a561f423)

# ホームページをPDFにエクスポート出来るようになってた
リリースノートから記載が見つからなかったので、そもそもJakartaでの変更点なのかどうか、またホームページのみなのかどうかは不明。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/a44c9058-9c7c-3934-9bf9-046b8799f7f3.png)

# 関連記事
> - [ServiceNow Jakartaアップデートトピックスまとめ](http://qiita.com/Kisaragi13/items/3f332bb2a5b2a561f423)
GCDメモ dispatch_queue_set_specific

## dispatch queueにキー、バリューデータを関連付ける。

```objc:keyvalue
void
dispatch_queue_set_specific(dispatch_queue_t queue, const void *key,
	void *context, dispatch_function_t destructor);
```
 
* セットしたcontextはdispatch_queue_get_specificで取得できる。
* デストラクタは新しいコンテキストが同じキーでセットされたとき、またはキューの参照がすべてリリースされた後に、"default priority global concurrent queue"をもつコンテキストによって呼び出される。

#### queue
* セットするqueueを指定する。NULLは許されない。

#### key
* keyはコンテキスにセットするキーであり、典型的にはサブシステムに固有な静的変数へのポインタ。
* keyはポインタとしてのみ比較される。
* 直接に文字定数のポインタを使用するのは推奨されない。
* NULLは無効
 
#### context
* 　キーに関連するデータ、NULLでも良い。
*  オブジェクトについての新しいサブシステム固有のコンテキスト。NULLでもよい。
 
#### destructor
 * デストラクタ関数へのポインタ。ここでcontextのリリースをすることができる。NULLでも良い。コンテキストがNULLのときは無視される。
Rails5.1のリクエスト・レスポンス処理まとめ

# 前書き

```redirect_to :back```がRails5.1で使えなくなっていたので、
Rails5.1のリクエスト・レスポンス処理を整頓しました。

# リクエスト

## paramsメソッド

* リクエスト情報を取得する
* paramsで取得できるリクエスト情報
    * ポストデータ(form)
    * クエリ情報(URLの末尾の?以降)
    * ルートパラメータ(ルートで定義されたパラメータ(books/1の1))
* 配列やハッシュも受け取り可能

```rb
render plain: params[:id]
```

### マスアサインメント脆弱性を回避する --StrongParams

* ActiveRecord元々の機能
* new/update_attributesなどのマスアサインメント系のいたずら防止の為に行う。
* StrongParamsはホワイトリスト対策で、予め設定可能な値を明示的に宣言しておく。

```rb
params.require(model).permit(attr, attr...)
```

## request.headersメソッド

* リクエストのヘッダー情報を取得できる
* ヘッダー情報以外にもサーバー環境変数なども含まれる
    * 使用している環境によって変化することがある

```rb
request.headers[XXXX]
```

* Accept
    * クライアントがサポートしているコンテンツの種類
* Accept-Language
    * クライアントの対応言語
* Authorization
    * 認証情報
* Host
    * 要求先のホスト名
* Referer
    * リンク元のURL
* User-Agent
    * クライアントの種類

### requestオブジェクトの他のメソッド

* accepts
* authorization
* body
* fullpath
* get?
* host
* host_with_port
* local?
* method
* port
* port_string
* protocol
* remote_ip
* request_method
* scheme
* server_software
* ssl?
* standard_port?
* url
* xml_http_request?

# レスポンス

| **メソッド** | **概要** |
| :--- | :--- |
| render | テンプレートの呼び出し・テキスト/スクリプトの出力など、汎用的な結果出力手段 |
| redirect_to | 指定されたアドレスに処理をリダイレクト |
| send_file | 指定されたファイルを出力 |
| sen_data | 指定されたバイナリデータを出力 |
| head | 応答ヘッダーのみを出力 |
| respond_to | ファイルフォーマットに応じてマルチフォーマットに対応してレスポンス |

## renderメソッド

### テンプレート呼び出し系

アクション名と異なるテンプレートファイルを呼び出す

```rb
render action: 'index'
```

異なるコントローラのテンプレートを呼び出す

```rb
render template: 'hello/view'
```

アプリ外のテンプレートを呼び出す

```rb
render file: '/data/template/list'
```

* action, template, fileは省略可能

```rb
render 'index'
render 'hello/view'
render '/data/template/list'
```

### コンテンツ出力系

* renderはテンプレートファイルを呼び出すだけではない
* MVCの考え方には反するが使える

#### plain

指定された文字列をそのまま出力する

```rb
render plain: [text]
```

#### html

text/html形式の文字列を出力する

```rb
render html: '<div style="color:red;">hello</div>'
```

#### inline

指定された文字列をERBテンプレートと解釈して結果を出力する

```rb
render inline: <%= @books %>
```

#### json

json形式で結果を出力する
レスポンスヘッダーにapplication/jsonも付与してくれる。

```rb
render json: @todos

### その他オプション

#### content_typeオプション

以下の様にcontent_typeをオプションで指定可能

```rb
render plain: 'hello', content_type: 'text/comma-separated-values'
```

#### statusオプション
 
ステータスコードを指定可能

```rb
render json: todos, status: 200
```

### 二重レンダリングに注意

renderは途中で処理が抜けない為、もしif文などの途中でrenderするなら明示的にreturnする必要がある。

## headメソッド

コンテンツ本体だけではなく、ただステータスコードのみを返したいケースに利用

```rb
head 404
```

シンボルでも指定可能

```rb
head :ok # 200
head :not_found # 404
head :forbidden # 403
```

## redirect_toメソッド

指定されたページ(URL)にリダイレクト(移動)する

```rb
redirect_to /todos
```
様々な指定方法がある

```rb
redirect_to 'http://todos/show'
redierct_to action: :show
redirect_to controller: :todos, action: :show
redirect_to todos_show_path
```
## redirect_backメソッド

1つ前のページにリダイレクトするメソッド
Rails4系までは```redirect_to :back```を使っていた。

```rb
redirect_back fallback_location: <URL>
```
直前のURLが見つからない場合は\<URL>に遷移する

# まとめ

redirect_back以外はRails4とあまり変わってなかった。
RailsをAPIサーバとして作る時に、JBuilderを使うか悩んだが、
RailsAPIモードでもJSONを返す時はrenderで返していたので、
renderで単純にレスポンスしてあげるのがベストかと思いました。

別件ですが、webpackerを使ってReact+Railsパターンが簡単にビルドできので、
次はその記事を書こう思います。
dockerインストール手順備忘録 on ubuntu in vagrant

# ubuntuのvagrantを用意
boxが無い場合は追加
```terminal
$ vagrant box add ubuntu/trusty64
```
作業用ディレクトリ作って入って
```terminal
$ vagrant init ubuntu/trusty64 && vagrant up
```
vagrant のubuntuに入る

```terminal
$ vagrant ssh
```

# dockerをインストールする準備（CE版）

dockerに必要なの入れる
```
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
```
docker 公式GPG鍵を追加
```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

※これでdockerのgpg鍵が入ってるのが確認できる
```
$ sudo apt-key fingerprint 0EBFCD88
```
## アーキテクチャを確認
```
$ dpkg --print-architecture
```
amd64なら
```
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```
armhfなら
```
$ sudo add-apt-repository \
   "deb [arch=armhf] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```
# いよいよdockerをインストールする
パッケージをアップデート
```
$ sudo apt-get update
```
dockerをインストール
```
$ sudo apt-get install docker-ce
```
※本番環境では、これでバージョンを指定できる
```
sudo apt-get install docker-ce=<VERSION>
```

## これで確認
```
sudo docker run hello-world
```
うまくいけば
Hello from Docker!

みたいなのが出るはず。
NTPサーバ構築、クライアント設定、centos7

#NTPサーバ構築
yum -y install ntp

vi /etc/ntp.conf

許可する範囲を指定
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.2.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.200.0 mask 255.255.255.0 nomodify notrap
restrict 172.16.0.0 mask 255.255.240.0 nomodify notrap

同期をとるサーバを指定
server ntp.nict.jp iburst

#NTPクライアント
yum -y install ntp

\#restrict default kod nomodify notrap nopeer noquery
\#restrict -6 default kod nomodify notrap nopeer noquery
restrict default ignore                                           初期状態としてすべての問い合わせを無視
restrict 192.168.100.2 mask 255.255.240.0 nomodify notrap noquery  NTP サーバーとの通信を許可

\#server 0.centos.pool.ntp.org iburst
\#server 1.centos.pool.ntp.org iburst
\#server 2.centos.pool.ntp.org iburst
\#server 3.centos.pool.ntp.org iburst
server 192.168.100.2 iburst                                      参照する NTP サーバー

#NTP起動
systemctl start ntpd
systemctl status ntpd

#NTP自動起動
systemctl enable ntpd

#NTP自動起動確認
systemctl list-unit-files -t service

※ピンポイントで確認したい場合
systemctl list-unit-files | grep ntpd
ntpd.service                                enabled
ntpdate.service                             disabled

#NTP動作確認
ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
\=============================================================================
*192.168.100.2   133.243.238.243  2 u   63   64    1    0.900    0.823   0.722

#ibrust
初回(初回以外でも条件を満たせばよいが、条件が厳しい)の通信時に2秒間隔で8パケット(8回分のポーリング)を一気に送る。これにより8回分の通信結果を短時間(8回送出するまでに16秒程度)で得る事ができ、同期先を選択するための材料を揃えることができる。
配列の途中に配列を挿入する JavaScript編


# まずは基本。配列と配列を結合する

```js
    var p = [1,2,3,5];
    var p2 = [7,11,13];
    p = p.concat(p2);
    console.log(p);
    //[1,2,3,5,7,11,13]
```    
# 配列の途中に配列を挿入したい
  
```js
    var p = [1,2,3,5,13];
    var p2 = [7,11];
    p.splice(4,0,p2);
    console.log(p);
    //[1,2,3,5,[7,11],13] //違う、そうじゃない
```  
# こう書くと良い
  
```js
    var p = [1,2,3,5,13];
    var p2 = [7,11];
    Array.prototype.splice.apply(p,[4,0].concat(p2));
    console.log(p);
    //[1,2,3,5,7,11,13]
```   
# 元ネタ
[How to insert an item into an array at a specific index?](https://stackoverflow.com/questions/586182/how-to-insert-an-item-into-an-array-at-a-specific-index)

# spliceの仕様
[Array.prototype.splice() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)

>
```js
array.splice(index, howMany, [element1][, ..., elementN]);
```

こういう構文仕様なので、引数を配列化して、追加したい配列をconcatすれば綺麗な配列が出来るので、後はapplyすれば良いだけだった。
これ書いた人天才だね。


# ちなみに
JavaScript編とか書いていますが、他の言語編を書く予定は今のところありません。
SEOメモ　170628

お世話になっております。

Googleページランクが0なのを解決するため
メモ失礼します。

```

ページランク（※Google ページランクとは？）


分析項目

分析結果

コメント

Google ページランク PR 0

0 / 10
 

Googleにまだ認識されていない可能性があります。どんなに良いサイトでも検索エンジンに巡回されなければ意味がありません。
[原因]・公開したばかり。・どこにもリンク登録をしていない。

[対処]サイトにロボットを呼び込む（サイトマップの作成、サイト登録）
 被リンクを増やす（検索エンジン登録、テキスト広告）
 
 
インデックス数（※インデックス数とは？）


分析項目

分析結果

コメント

Google でのインデックス数
参照 9 件

1 / 10
 

検索エンジンに1,2ページ程度しかインデックスされていません。
[原因]公開して間もない。サイト全体のページ数が少ない。サイトマップページが存在しない。

[対処]サイトにロボットを呼び込む（サイトマップの作成、サイト登録）
 ```
コンテンツの高さに合わせて、可変するboxの作り方

コンテンツの高さに合わせて、可変するboxの作り方。

1.コンテンツ同士間の幅を調整するための、paddingや、marginだけをかける。
2.boxにpaddingをかけて、コンテンツとbox間のスペースを調整。

※boxにheightは指定しない。
※コンテンツとbox間の幅は、boxのpaddingのみで調整。
活性化関数のSigmoid、Tangent 、ReLu、Leaky ReLuの違い

一般的な活性化関数の違いについてメモ。
結論から言うとReLuを使おう。
それでもDead Neuronsが生まれるならLeaky ReLuなど使おう。

ここにはもっと細かく書かれてる。
https://github.com/EmbraceLife/sigmoid-SEE-vs-relu-softmax-cross-entropy/blob/master/relation-sigmoid-SSE-vs-relu-softmax-cross-entropy.ipynb


#Sigmoid or Logistic

```
f（x）= 1 / (1 + exp（-x）)
```

- 勾配爆発問題
- 第2に、その出力はゼロにセンタリングされません。これは、勾配の更新を異なる方向に行きすぎるようにします。0 <出力<1であり、最適化がより困難になる。
- シグモイドは飽和してグラデーションを殺します。
- シグモイドは収束が遅い。

![スクリーンショット 2017-06-28 11.31.57.png](https://qiita-image-store.s3.amazonaws.com/0/64334/0bf76ece-a5bc-70df-833d-d1496a466e0e.png)

#Hyperbolic Tangent

```
f（x）= (1 - exp（-2x）) / (1 + exp（-2x）)
```

-1から1までの範囲-1すなわち-1 <出力<1であるため、出力はゼロにセンタリングされます。
ですが勾配の問題は存在。

![スクリーンショット 2017-06-28 11.34.05.png](https://qiita-image-store.s3.amazonaws.com/0/64334/0155caa9-76d9-3943-f923-cae718028fbe.png)

#ReLu
これは過去2〜3年で非常に普及しました。最近Tanh関数とのコンバージェンスが 6倍改善されていることが証明されました。
機械学習とコンピュータサイエンスでは、最もシンプルで一貫性のあるテクニックと方法が優先され、最良の方法であることに気付きました。したがって、消失勾配の問題を回避し、修正する。ほとんどすべての深い学習モデルは現在 ReLuを使用しています。
しかし、その限界は、ニューラルネットワークモデルの隠れ層内でのみ使用すべきであるということです。
したがって、出力層では、Classification問題にSoftmax関数を使用してクラスの確率を計算し、回帰問題に対しては単純に線形関数を使用する必要があります。
ReLuのもう1つの問題は、勾配がトレーニング中に壊れやすく、死ぬことがあるということです。それは、いかなるデータポイントでも再び活性化されないようにする、ウエイトの更新を引き起こす可能性があります。ReLuがDead Neuronsをもたらすと言うだけである。
この問題を解決するために、Dead Neuronsの問題を解決するためにLeaky ReLuという別の修正が導入されました。更新を生かし続けるために、小さなスロープが導入されています。

![スクリーンショット 2017-06-28 11.36.09.png](https://qiita-image-store.s3.amazonaws.com/0/64334/e4ed572f-5ca4-bd54-7a17-7c177b37b1b7.png)


#結論
今日ではReLuを使用するべきです.ReLuは隠されたレイヤーにのみ適用する必要があります。我々のモデルが訓練中に死んだニューロンを形成するならば、漏れやすいReLuまたはMaxout関数を使うべきです。
SigmoidとTanhは、神経ネットワークモデルの訓練に多くの問題を引き起こす、勾配が消える問題のため、今日は使用されるべきではないということだけです。



#参考
https://medium.com/towards-data-science/activation-functions-and-its-types-which-is-better-a9a5310cc8f
NotificationとKVOを使って動画を自動ループ

動画の状態と、動画が終わったタイミングをKVOを使って監視してNotificationを使って状態の変更をキャッチして動画をループさせます。

# 環境

- Xcode8
- Swift3


# 実装

```swift

import UIKit
import AVFoundation

class ViewController: UIViewController {
     /*
     動画を再生させる画面作る
     */
    lazy var player: AVPlayer = {
        var player: AVPlayer = AVPlayer(playerItem: self.playerItem)
        player.actionAtItemEnd = AVPlayerActionAtItemEnd.none
        return player
    }()
    
    
    lazy var playerItem: AVPlayerItem = {
        var playerItem: AVPlayerItem = AVPlayerItem(asset: self.asset)
        return playerItem
    }()
    
    
    lazy var asset: AVURLAsset = {
        var asset: AVURLAsset = AVURLAsset(url: self.url)
        asset.resourceLoader.setDelegate(self, queue: DispatchQueue.main)
        return asset
    }()
    
    
    lazy var playerLayer: AVPlayerLayer = {
        var playerLayer: AVPlayerLayer = AVPlayerLayer(player: self.player)
        playerLayer.frame = UIScreen.main.bounds
        playerLayer.backgroundColor = UIColor.clear.cgColor
        return playerLayer
    }()


     /*
     動画のURLを定義している
     */
    var url: URL = {
        var url = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
        return url!
    }()
    
    
     /*
     viewDidLoad
     */
    override func viewDidLoad() {
        super.viewDidLoad()

        //動画のアイテムを監視
        playerItem.addObserver(self, forKeyPath: "status", options: .new, context: nil)
        
        //動画が終わったタイミングを監視
        NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidReachEnd(_:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
        
        //画面、動画が現れる
        view.layer.addSublayer(playerLayer)
        
        //動画を再生
        player.play()
    }


    // 監視対象の値に変化があった時に呼ばれる
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {}
    
    //動画を一番最初まで巻き戻す的な
    func playerItemDidReachEnd(_ notification: Notification) {
        
        player.seek(to: kCMTimeZero)
    }
}

//AVAssetResourceLoaderDelegate使わなきゃいけないから拡張
extension ViewController : AVAssetResourceLoaderDelegate {
    
}

```

# 参考

[SwiftでKVOを試してみる](http://llcc.hatenablog.com/entry/2015/08/11/235115)
[[Swift3.0] KVO(Key-Value Observing)による変数の監視](http://joyplot.com/documents/2016/10/17/swift-key-value-observing/)

# ソース

[GitHub](https://github.com/Ryosuke-Hujisawa/Automatic-loop-of-video-using-Notification-and-KVO)

[NotificationとKVOを使って動画を自動ループさせる ](http://off.tokyo/blog/2017/06/28/notification%E3%81%A8kvo%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%8B%95%E7%94%BB%E3%82%92%E8%87%AA%E5%8B%95%E3%83%AB%E3%83%BC%E3%83%97%E3%81%95%E3%81%9B%E3%82%8B/)
rspecのprepend_beforeの実行順について調べてみた


rspec 3.5.0で調査。

```rb
require 'rails_helper'

RSpec.describe 'sample', type: :model do

  prepend_before { puts "outside prepend_before" }
  before { puts "outside before" }

  context "context" do
    prepend_before { puts "inside prepend_before" }
    before { puts "inside before" }

    it { expect(true).to eq true }
  end
end
```

実行結果

```
outside prepend_before
outside before
inside prepend_before
inside before
```

`inside prepend_before`よりも`outside before`が先なのね。
変えてくれないかなこの挙動。
create-react-appでSASSファイルを使う方法

以前までは「PostCSS推奨」みたいな方針だったせいか、SASS(SCSS)ファイルは使えなかったので、
npm ejectしたものをゴニョゴニョして無理やり使ってたんだけど、公式のGithubの方にいつの間にか
SASS(SCSS)ファイルに対応する方法が載ってたので、忘れないようにメモ。

詳細は[ここ](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-a-css-preprocessor-sass-less-etc)に載ってるよ。（英語だけど。）


1.
create-react-appコマンドで作成した雛形ファイルの中（package.jsonがあるディレクトリ）で以下のパッケージをインストール

```
npm install node-sass-chokidar --save-dev
```

「[node-sass-chokidar](https://www.npmjs.com/package/node-sass-chokidar)」と言うのは、SASS(SCSS)ファイルの変更を監視して、node-sassでコンパイルを行ったりすることが出来るラッパーライブラリらしい。

2.
package.jsonのscriptsの項目に以下のコマンドを追加。

```js
"build-css": "node-sass-chokidar src/ -o src/",
"watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive",
```

これで、```npm run watch-css```を実行するとSASS(SCSS)ファイルを変更すると同じディレクトリにCSSファイルを作成してくれる。

ただ、今のままだと、```npm run start```や```npm run build```を実行した時に、SASS(SCSS)ファイルのコンパイルを行ってくれない。。。
なので、以下のパッケージとコマンドも追加。

3.

```
npm install --save-dev npm-run-all
```

```diff
"scripts": {
     "build-css": "node-sass-chokidar src/ -o src/",
     "watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive",
-    "start": "react-scripts start",
-    "build": "react-scripts build",
+    "start-js": "react-scripts start",
+    "start": "npm-run-all -p watch-css start-js",
+    "build": "npm run build-css && react-scripts build",
     "test": "react-scripts test --env=jsdom",
     "eject": "react-scripts eject"
   }
```

[npm-run-all](https://www.npmjs.com/package/npm-run-all) は npm-scripts の連結実行を管理するためのパッケージ。
これを使って、```watch-css```と```start-js```のコマンドを連結実行することで、
SASS(SCSS)ファイルを更新した時にも全体の更新が実行される。

```build``` コマンドも同じ感じで、SASS(SCSS)ファイルのコンパイルを実行した後に、全体のビルドが実行される。

まぁ、SASS何かとっとと卒業して、PostCSSに移行したらいいんだろうけど、
SASS資産もまだまだ使いたいから、とりあえず、これでしばらくは困らないだろう。
UIPickerViewを使うときに気をつけること

```swift
class ViewController: UIViewController,UIPickerViewDelegate, UIPickerViewDataSource {
  // ソースコード
}
```

ここからコードを書き進めると、`Type ‘ViewController’ does not conform to protocol ‘UITableViewDataSource’` というエラーがで続けました。

```swift
func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return list.count
```

これを書くと、エラーがでなくなった！
どうやら、必須で書かないといけないコードらしい！
Android M以上で CustomTabsでChromeが開かない問題の対応


## 前置き
* Android M以上でブラウザの「優先アプリ」指定をしていると[custom-tabs-client/shared](custom-tabs-client)の [CustomTabsHelper.getPackageNameToUse(context)](https://github.com/GoogleChrome/custom-tabs-client/blob/master/shared/src/main/java/org/chromium/customtabsclient/shared/CustomTabsHelper.java#L63) を利用してもChromeが起動しない問題の対応です。


## 問題
* PackageManager#queryIntentActivities の挙動が変わったため。

## 対応
* [PR](https://github.com/GoogleChrome/custom-tabs-client/pulls)が出ているのでそれを取り込みましょう。
* 私は以下のように判定して使っています。


```java:Helperクラス
    public static CustomTabsIntent createCustomTabsIntent(Context context) {
        String packageName = CustomTabsHelper.getPackageNameToUse(context);
        CustomTabsIntent intent = new CustomTabsIntent.Builder()
                .setShowTitle(true)
                .setToolbarColor(ContextCompat.getColor(context, R.color.white)).build();

        if (packageName != null) {
            intent.intent.setPackage(packageName);
        }
        return intent;
    }
```
ACLの基本


ACL(Access Contorol List)はルーターがパケットの転送を条件によって許可、または拒否したりするリストのこと。イメージとしては某SNSのブロック機能とそっくりですね（笑）
ACLのイメージは簡単に言えば下記の図のようなものだと思ってください。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/161833/3de69071-2f06-f466-3cbc-e3b04f79e094.png)

上記の図を某SNSのブロック機能に置き換えてみると…
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/161833/30d55f2c-b048-976d-9305-d1bd787eeece.png)


このACLには標準ACLと拡張ACLがあります。
・標準ACL→ACL条件に送信元IPアドレスだけを指定できる。
・拡張ACL→送信元IPアドレスだけではなく、宛先IPアドレス、プロトコル、ポート番号が指定できる。

先ほどのホストXのIPアドレスを192.168.20.1というIPアドレス指定したとして、ホストXからのパケットを拒否するコマンド設定は以下のようになります。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/161833/3778ef55-5d6b-ce33-5ac4-fef213c61876.png)

 
更に、下記のコマンドを使用することでACLをインタフェースに適用することでパケットフィルタリングを行います。

ip access group <ACL番号> <inまたはout>を用います。

今回はホストXからホストZへのパケットを禁止したいのでインタフェースFa0/1に対してパケットフィルタを行います。

in→インバウンド
out→アウトバンド
![image.png](https://qiita-image-store.s3.amazonaws.com/0/161833/f2c799b5-b90f-d7b2-b791-a1436a7c9744.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161833/226c31c8-9d2c-2b6c-d1e7-8297eb1c7227.png)


<まとめ>
ACLは特定のホストからのパケットを禁止したいときに使います。
もしわからなくなったら、某SNSのブロック機能を思い出してみてください！
pandas メモ

# 8桁の数字を日付型に変換
- test.csv

| YMD | a | b | c |
|:---:|:-:|:-:|:-:|
|20100301|1|2|3|
|20110229|4|5|5| 

```py3

df = pd.read_csv("test.csv", parse_dates=['YMD'],index_col=0)
```

# 異なるカラム名で結合

```py3
df3 = pd.merge(df1, df2, left_on='df1_col', right_on='df2_col')
```
[Android] ジェスチャー取得のコードをスッキリ書く

ジェスチャーを取得するコードは、一旦`GestureDetector`のインスタンスを作成して各イベントを全てOverrideし、さらにTouchイベントを定義してイベントを渡す、といった感じで長くなりがちです。Activiy/Fragment等にこれらのコードを書くと長くなり可読性が落ちてしまいます。

解決策として次のようなUtilクラスを用意しておくと、ジェスチャーを取得するコードを短く書くことができます。

```java:GestureUtils.java
public abstract class GestureUtils {

    public static void setListener(Context context, View view, GestureListenerAdapter adapter) {
        final GestureDetector gestureDetector = new GestureDetector(context, adapter);
        view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent e) {
                return gestureDetector.onTouchEvent(e);
            }
        });
    }

    public static abstract class GestureListenerAdapter implements GestureDetector.OnGestureListener {
        @Override
        public boolean onDown(MotionEvent e) {
            return false;
        }

        @Override
        public void onShowPress(MotionEvent e) {

        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return false;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            return false;
        }

        @Override
        public void onLongPress(MotionEvent e) {

        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            return false;
        }
    }
}
```

例として、あるView(コード例中の`someView`)に対する`onSingleTapUp`イベントを取得するコードは次のようになります。

```java:例
GestureUtils.setListener(someContext, someView, new GestureUtils.GestureListenerAdapter() {
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        // .. do someThing
        return false;
    }
});
```

スッキリ！
simple_formを使うと、collection_selectで表示が崩れる


# simple_formを使って、collection_selectで表示が崩れる場合

☓

```haml
= f.collection_select :article_type_id, ArticleType.all, :id, :name
```
これだと表示が崩れます。

○

```haml
= f.input :article_type_id, collection: ArticleType.all, label_method: :name, value_method: :id, include_blank: false
```
これでちゃんと表示されます。
react-native-git-upgrade で Apple Mach-O Linker (ld) Error Group! が出たときの解決方法


React Nativeのバージョンアップで、"Apple Mach-O Linker (ld) Error Group!"というエラーが出て、2日ほど悩んだので、解決方法をメモしておきます。

# 発端

React Native 0.41.2 -> 0.45.0に↓の手順に従って、react-native-git-upgradeを使ってアップグレードした。

Upgrading to new React Native versions
https://facebook.github.io/react-native/docs/upgrading.html

Androidは問題なく動作したのだが、iOSがエラー頻発。npmのパッケージの問題だったり、いろいろあったが割愛。
どうにか、iOSシミュレーターでアプリが起動するようにはなった。

![Kobito.Z32jnK.png](https://qiita-image-store.s3.amazonaws.com/0/53927/a7ad187a-3700-758e-d55e-dcd613c8a1da.png "Kobito.Z32jnK.png")

最後に、Archiveしてipaファイルを生成しようとしたら、"Apple Mach-O Linker (ld) Error Group!"というエラーがでて、Stack Overflowなどで紹介されているあらゆる方法を試したが解決せず。

## エラーを詳しく

もうバージョンを下げたままで行くかと絶望しかけたが、なにか基本的なことを見落としている感覚があったので、Xcodeのエラーの見方について調べた。
で、実はXcodeにはErrorの詳細を見る方法があった。

![エラー詳細](https://qiita-image-store.s3.amazonaws.com/0/53927/fda53931-6a51-c073-fbf7-eabc9e68c114.png)

赤丸で示したところを押すと以下の画面に。

![Kobito.Pp1iAC.png](https://qiita-image-store.s3.amazonaws.com/0/53927/1cd5783d-d3a2-6884-8c7d-3a80cd6a0a80.png "Kobito.Pp1iAC.png")

	ArchiveIntermediates/hohoho/BuildProductsPath/Release-iphoneos/libReact.a(RCTWebSocketModule.o)
	/Users/deguchi/Library/Developer/Xcode/DerivedData/hohoho-gbncvuhsltiqyzdxdmgvxwlfsfdm/Build/Intermediates/ArchiveIntermediates/hohoho/BuildProductsPath/Release-iphoneos/libRCTWebSocket.a(RCTWebSocketModule.o)
	ld: 279 duplicate symbols for architecture arm64
	clang: error: linker command failed with exit code 1 (use -v to see invocation)

## 原因

cocoapodのpod installが通らないので、調べたところ以下の書き方が必要だった。

	　react_path = '../node_modules/react-native'
	  yoga_path = File.join(react_path, 'ReactCommon/yoga')

	  pod 'React', :path => react_path, :subspecs => [
	    'Core',
	    'RCTText',
	    'RCTImage',
	    'RCTWebSocket', # needed for debugging
	    'RCTNetwork',
	  ]
	  pod 'Yoga', :path => yoga_path

よくわからないまま、これを書いてpod installしていたのだが、"Apple Mach-O Linker (ld) Error Group!"の意味は、React以下に、ライブラリが入ったので、Xcodeでライブラリを読み込んでいると、Archiveのときに二重に読み込まれてるというのではねられるということだった。

## 解決方法

~~アプリ -> general -> Linked Frameworks and Libraries~~

![ライブラリ削除.png](https://qiita-image-store.s3.amazonaws.com/0/53927/9056a5b7-d6a9-7410-44e3-e27006f019e9.png)

~~赤丸のライブラリを削除して、Archiveしたところ無事に通った！長かった…。~~

これでArchiveは成功するのだが、アプリが落ちる問題が出た。

結局、以下のようにPodfileを変更したところ、問題が解消した。長すぎた…。

	　react_path = '../node_modules/react-native'
	  yoga_path = File.join(react_path, 'ReactCommon/yoga')

	  pod 'React', :path => react_path
	  pod 'Yoga', :path => yoga_path


React Nativeは、いろいろ簡単にしてくれるのだが、基礎になってるところを知らないと、こういうところで代償を払うことになるという例でした。
Go - irisとgomailでテンプレート使ってメール送信する

[iris](https://github.com/kataras/iris)でテンプレート使ってメール送信するサンプルコードが[ここ](https://github.com/iris-contrib/examples/blob/master/e-mail/main.go)にありました。
自分は[gomail](https://github.com/go-gomail/gomail)というのを今使っているので、gomail用にちょっと修正しました。

mailパッケージというのを作って一応汎用的にしてみました。

```mail.go
package mail

import (
	"github.com/kataras/iris"
	"github.com/kataras/iris/context"
	"gopkg.in/gomail.v2"
	"bytes"
)

func Send (app *iris.Application, from string, to string,
	sub string, view string, layout string, vars context.Map) error {

	m := gomail.NewMessage()
	m.SetHeader("From", from)
	m.SetHeader("To", to)
	m.SetHeader("Subject", sub)
	buff := &bytes.Buffer{}
	app.View(buff, view, layout, vars)
	m.SetBody("text/plain", buff.String())
	d := gomail.Dialer{Host: "localhost", Port: 25}
	err := d.DialAndSend(m)
	return err
}
```

上記をインポートして下記のように使います。

```send.go
func send() error {
	err := mail.Send(
		app,
		"from@example.com",
		"to@example.com",
		"お問合せありがとうございます",
		"mail/contact.html",
		"mail/layout.html",
		context.Map{
			"Company": "会社名",
			"Name":  "ご担当者様",
			"Mail": "to@example.com",
			"Content": "お問い合わせ内容",
		},
	)
	return err
}
```
text/plainをtext/htmlに変えればHTMLメールが送れます。
Go - メール送信

[go-gomail/gomail](https://github.com/go-gomail/gomail)というのがスター1000個以上あるので使ってみます。Ubuntu16.04にpostfixを入れてGmailで送信されるように設定してます。

とりあえず下記で送信されました。

```main.go
package main

import (
	"gopkg.in/gomail.v2"
)

func main() {
	m := gomail.NewMessage()
	m.SetHeader("From", "from@example.com")
	m.SetHeader("To", "to@example.com")
	m.SetHeader("Subject", "Hello!")
	m.SetBody("text/plain", "Hello!")

	d := gomail.Dialer{Host: "localhost", Port: 25}
	if err := d.DialAndSend(m); err != nil {
		panic(err)
	}
}
```

添付とか、HTMLメールとかもできるみたいなので、今度やってみます。
Fully Convolutional Networks (FCN) の最終層のfeature mapサイズを求める

Segmentationや、SSD, YOLO(v2)といったsingle shot系のベースネットワークとしてFully Convolutional Networks (FCN) を利用していると、入力画像サイズが可変なので、任意の入力画像サイズに対し出力されるfeature mapのサイズを明示的に知りたいときがある。

例えばstride=2にしたダウンサンプルを4回行うと、出力されるfeature mapのサイズは入力画像の大体1/16になる。入力サイズを16の倍数に制限してしまえば単純に16で割れば良いが、端数のケースも考慮したい。Paddingなしの2x2 maxpoolingとかであれば、単純に16で割って端数を切り捨てれば良い。

ResNet系では、paddingあり、stride=2の3x3の畳み込みでダウンサンプルするケースが多いので、そういうケースでfeature mapのサイズを明示的に求めたい。
Kerasで言えば、下記のような畳み込み。

```py3
Conv2D(32, 3, strides=2, padding="same")
```

`x`を入力サイズ、`count`をstride=2でダウンサンプルする回数とすると、出力されるfeature mapのサイズは下記で求められる。

```py3
def down_sample(x, count):
    for _ in range(count):
        x = (x + 1) // 2

    return x
```

これは下記でも同じ。

```py3
def down_sample(x, count):
    return (x + pow(2, count) - 1) // pow(2, count)
```

ランダムな入力サイズで確認（Keras実装）。

```py3
import numpy as np
from keras.models import Sequential
from keras.layers import Conv2D


def down_sample(x, count):
    return (x + pow(2, count) - 1) // pow(2, count)


def main():
    model = Sequential()
    model.add(Conv2D(16, 3, strides=2, padding="same", activation="relu", input_shape=(None, None, 3)))
    model.add(Conv2D(32, 3, strides=2, padding="same", activation="relu"))
    model.add(Conv2D(64, 3, strides=2, padding="same", activation="relu"))
    model.add(Conv2D(128, 3, strides=2, padding="same", activation="relu"))

    for _ in range(10):
        h, w = np.random.randint(300, 600), np.random.randint(300, 600)
        data = np.ones((1, h, w, 3))
        ch, cw = down_sample(h, 4), down_sample(w, 4)
        result = model.predict(data)
        print("result: {}, calculated: ({}, {})".format(result.shape[1:3], ch, cw))


if __name__ == '__main__':
    main()
```
Go – validationチェック

下記を使うと簡単にバリデーションチェックできるっぽい。
<a href="https://github.com/go-playground/validator" target="_blank">go-playground/validator</a>

irisでコンタクトフォームつくってるのですが、フォームから会社名、氏名、メアド、内容を取得してます。Contactという構造体のタグにvalidate:"〜"という形でバリデーションルールを書くことで、ルールを追加できます。
irisはctx.PostValue()でフォームの送信内容を収得できるので、Contact構造体のインスタンス？に送信内容を入れて、validator.New().Struct(contact)とやることで、バリデーションチェックしてくれます。エラーなければnilを返します。

```contact.go
import (
	_"github.com/kataras/iris"
	"github.com/kataras/iris/context"
	"gopkg.in/go-playground/validator.v9"
)

type Contact struct {
	Company	string
	Name	string `validate:"required"`
	Mail	string `validate:"required,email"`
	Content	string `validate:"required"`
}

func contactPost(ctx context.Context) {
	contact := &Contact{
		Company: ctx.PostValue("company"),
		Name: ctx.PostValue("name"),
		Mail: ctx.PostValue("mail"),
		Content: ctx.PostValue("content"),
	}
	v := validator.New()
	err := v.Struct(contact)
	if err != nil{
		ctx.ViewData("inputErr", true)
		ctx.ViewData("input", contact)
	}else{
		//send mail
	}
	setDefaultVars(ctx)
	ctx.View("hoge/contact.html")
}
```

最初、構造体のフィールド名を小文字にしていたのですが、小文字だとどうもこのバリデーションライブラリが動きませんでした。
DynamoDBと「強力な整合性のある読み込み」とCAP定理のこと

# 何
- DynamoDBの参照はデフォルトが結果整合性なのでCAP定理のAP型(一貫性を犠牲にして可用性をとった設計)と紹介されていた。では「強力な整合性のある読み込み」オプションをどう考えたら良いのか？
- AP型のDynamoDBで、強力な・・・を選べば(+Cで)CAP定理の限界を超えた！な訳はないはず。

## CAP定理とは(wikipediaより)
- ノード間のデータ複製において、同時に次の3つの保証を提供することはできない
1. 一貫性 (Consistency)：すべてのデータ読み込みにおいて、最新の書き込みデータもしくはエラーのどちらかを受け取ること
1. 可用性 (Availability)：単一障害点が存在しないこと
1. 分断耐性 (Partition-tolerance)：通信可能なサーバーが複数のグループに分断されないこと

## 考えるヒント1
- 
 http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html
- 強力な整合性のある読み込みは、ネットワークの遅延または停止があった場合には利用できなくなる可能性があります。

## 考えるヒント2
- https://aws.amazon.com/jp/dynamodb/faqs/
- 結果整合性のあるオプションを選択すると、読み込みスループットが最大限に向上します。

## 考えるヒント３
- http://dev.classmethod.jp/cloud/aws/dynamodb-new-parameter-consistent-read/
- 強力な整合性のある読み込みは)書き込まれている3箇所より2箇所の値を読み取り、一致すればその値を、一致しなければもう1箇所の値を読んで2箇所に書き込まれている値を返す、という仕組みになります。

## 現時点のアイデア
- 「強力な整合性」は、分散ノードの値を複数みて比較しないといけないため、値を参照するまでの時間が伸びているという意味で「可用性が落ちている(CP型)」と考える。
- ネットワークの問題がないときにCA型、ネットワークの問題があるときにAP型になる、と考える。

## 別の方向から考える
- MySQLでレプリケーション遅延が起きれば、一貫性が損なわれるのでAP型になっている。(スレーブはCを捨ててAを実現している)
- 思考実験１）マスターとスレーブの値をすべて取得して、一致したときだけ値を返すようにラップすれば、CP型になる？(一致するまでは結果を返せないのでAを捨てている)
- 思考実験２）遅延したスレーブは切り捨てて、マスターと遅延していないスレーブだけが値を返すようにラップすれば、CA型になる？(ネットワークの問題により故障していないノードが使えなくなるのでPを捨てている)

## その他
- Dynamoの論文が読めるらしいので読んでみよう
- http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf
【Vagrant】pythonで簡易のAPIサーバを立てる

案の定はまったのでメモ

#以下の手順で解決
1・[pipを使えるようにする](http://qiita.com/TatchNicolas/items/ca6b8007d914bdef3662)
2・MySQLdbをpip installできない。[このサイトを参考に解決](http://vayacico.hatenablog.com/entry/2017/04/24/003443)
3・Phantomjsが使えない。[このサイトを参考に解決](https://www.craneto.co.jp/archives/1203/#yum)
4・mysqlでテーブルにINSERTしようとしたらできなかった。DBのcollation、charsetの設定がutf8ではなかったのが原因。[このサイトを参考に解決](http://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a)
5・次はmysqlサーバに外部接続できなかった。[このサイトを参考に解決](http://yosugi.hatenablog.jp/entry/2013/06/23/185240)　
```mysql> GRANT ALL PRIVILEGES ON *.* TO root@'192.168.%' IDENTIFIED BY 'root のパスワード' WITH GRANT OPTION;```

TODO: 後日コマンドを明記しまとめる
【Vagrant】MyPhpAdminを使えるようにする

　くそはまったのでメモ。

#以下の参考リンクを見ながらもがく
１・[httpd/mysqlのインストール・設定](http://qiita.com/harhogefoo/items/a359f42755ac7d49ad28)
２・[MyPhpAdminは結局この方法でしか自分の環境だと入らなかった](https://lab.unicast.ne.jp/2014/06/11/install_phpmyadmin_to_centos_using_yum/)
３・[が、それにはepelが必要で、それも自分の環境ではこの方法でしか入らなかった](http://dqn.sakusakutto.jp/2013/02/centos6_yum_remi_epel_rpmforge.html)
4.あれ？でも普通に ```sudo yum install epel-release``` で入れたっけ？
5・でも```Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again```というエラーがでたので、[このリンクのコマンドで解決](http://qiita.com/jshimazu/items/54d053c4aa067cd6e998)
6・で、192.168.33.10/phpmyadminから接続を試みたら403 Forbiddenが返されたので[この方法で解決](http://ivystar.jp/database/mysql/yum%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9Fphpmyadmin%E3%81%8C%EF%BD%A2forbidden%EF%BD%A3%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%9F%E6%99%82/)

TODO: 後日コマンドを記述しまとめる
RealSenseのまばたき精度をデバイス別比較

RealSenseでまばたき(EXPRESSION_EYES_CLOSED_LEFT/RIGHT)がどうにも納得いかなかったので、普通のWebCamと比較した際の動画です。

※環境依存なのであくまで一例です。

要点
　　右目のぴくぴくをどうにかしたい。

条件
　　RealSenseSDK：2016 R3
　　場所：室内
　　照明：天井中央シーリング(蛍光灯)
　　ターゲット：右目が壁側(右側が若干影る)
　　まぶたの動かし方：だいたい3秒ずつ開眼→普通→薄目→閉目

カメラ：RealSense SR300
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">まずRealSenseです。<br>条件は三秒ずつ、開眼→普通→薄目→閉目です。 <a href="https://t.co/YY6NryVcVl">pic.twitter.com/YY6NryVcVl</a></p>&mdash; 琴葉 葵（偽） (@Hv2RMjHzDyqXVIr) <a href="https://twitter.com/Hv2RMjHzDyqXVIr/status/879730944017432576">2017年6月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

カメラ：Logicool HD Webcam C270
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">お次は普通のWebCamです。<br>条件は同じで三秒ずつ、開眼→普通→薄目→閉目です。 <a href="https://t.co/bASvPY6C5R">pic.twitter.com/bASvPY6C5R</a></p>&mdash; 琴葉 葵（偽） (@Hv2RMjHzDyqXVIr) <a href="https://twitter.com/Hv2RMjHzDyqXVIr/status/879732063666003970">2017年6月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

モデル情報
http://www.nicovideo.jp/watch/sm24368983

普通状態の時間が短いのでわかりにくくなってしまいましたが、普通のカメラのほうが若干ぴくぴくが収まってると思います。
開始3秒～6秒あたりの右目のまぶたに注目してもらえれば分かるかなぁ、というレベルですね。
ただ、実際に使う時は平滑化入れて使うので、右目が薄目だったり閉じちゃったりで固定されちゃう事が多く、結構目立つのです。
Railsのコントローラも通信ごとにインスタンス化されている


## 前提

Railsの処理の流れでルータからコントローラへの流れは以下のように説明することが多い。

```
URLが/blogsでHTTPメソッドがGETの時、rake routesよりblogsコントローラのindexアクションに誘導される
```

理にはかなってる。
ただ具体的にどんな処理が行われているかは想像しにくいので、少し踏み込んで説明する。

## コントローラのアクションに誘導する具体的な処理とは

結論から先に言うと `BlogsController` というクラスの `インスタンス` を生成し、BlogsControllerのインスタンスメソッドである `index` を実行している。
つまり以下のようになる。

```rb
BlogsController.new.index
```


コントローラもインスタンスを生成する？
ちょっとイメージしづらいので、モデルを例に説明していこう。

```rb:app/models/blog.rb
class Blog < ActiveRecord::Base
end
```

こちらは `Blogクラス` からインスタンスが生成され、saveメソッドやcreateメソッドでblogsテーブルにレコードとなって保存される。

```
irb(main):008:0> blog = Blog.new(title: 'aaa', content: 'bbb')
=> #<Blog id: nil, title: "aaa", content: "bbb", created_at: nil, updated_at: nil>
irb(main):009:0> blog.save
   (1.5ms)  begin transaction
  SQL (4.5ms)  INSERT INTO "blogs" ("title", "content", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["title", "aaa"], ["content", "bbb"], ["created_at", "2017-06-27 16:38:13.612348"], ["updated_at", "2017-06-27 16:38:13.612348"]]
   (1.1ms)  commit transaction
=> true
```

イメージは確かにこちらのがしやすいのは事実。


一方でコントローラはどうか？

```rb:app/controllers/blogs_controller.rb
class BlogsController < ApplicationController
  def index
    @blogs = Blog.all
  end
  
  def show
    # 省略
  end
  
  def new
    @blogs = Blog.new
  end
  
  # 省略
end
```

コントローラも `BlogsController` という `クラス` で構成されている。
こちらも同様にインスタンスを生成することは普通に可能なのだ。

## railsコンソールでコントローラをインスタンス化してみる


試しにrailsコンソールで実行してみると良い。
ここではblogsコントローラのindexアクションを実行させてみよう。

```
irb(main):001:0> blogs_controller = BlogsController.new
=> #<BlogsController:0x007fe748b92580 @_action_has_layout=true, @_routes=nil, @_request=nil, @_response=nil>
irb(main):001:0> blogs_controller.index
  Blog Load (3.5ms)  SELECT "blogs".* FROM "blogs"
=> #<ActiveRecord::Relation [#<Blog id: 1, title: "タイトルA", content: "内容A", created_at: "2016-12-14 11:10:31", updated_at: "2016-12-14 11:10:31">, #<Blog id: 2, title: "タイトルB", content: "内容B", created_at: "2017-06-11 04:19:43", updated_at: "2017-06-11 04:19:43">, #<Blog id: 3, title: "タイトルB", content: "内容B", created_at: "2017-06-11 04:19:43", updated_at: "2017-06-11 04:19:43">]
```

これを見ると `@blogs = Blog.all` と同じ結果が返ってきてるのが確認できる。
なぜなら `BlogsController` というクラスのインスタンスを生成し、BlogsControllerのインスタンスメソッドである `index` を実行させることで、 `index内に記述されている処理が実行される` からだ。
つまりコントローラの処理も、オブジェクト指向に則って実行されていることがわかる。

newアクションの実行も同様。
今度は変数に入れず、イッパツで実行させてみる。

```
irb(main):001:0> BlogsController.new.new
=> #<Blog id: nil, title: nil, content: nil, created_at: nil, updated_at: nil>
```

１つ目の `new` はRubyが用意している `特異メソッド` 。
２つ目の `new` は `BlogsController` クラス内に定義してある `インスタンスメソッド` 。
両者は全くの別物ということも気をつけなければならない。


ちなみに他のアクションはブラウザからの情報（パラメータ）が必要なため、railsコンソール上では実行できない。

## まとめ

1. URLが/blogsでHTTPメソッドがGETの時、rake routesよりコントローラとアクションが `blogs#index` に定まる。
2. BlogsControllerクラスのインスタンスが生成される
3. BlogsControllerクラスのインスタンスメソッドであるindexを実行する
4. indexの中に記述されている `@blogs = Blog.all` が実行される
PHP Manual 読書会(9回目)(関数)

PHPに慣れる為に週1ぐらいで更新していきます。PHP Manualを読んで実験して行きます。

前回:[PHP Manual 読書会(8回目)(制御構造2)](http://qiita.com/amesho/items/80c0c81051fab09eca04)


## [可変関数](http://php.net/manual/ja/functions.variable-functions.php)

> PHP は可変関数(variable functions)の概念をサポートします。 これにより、変数名の後に括弧が付いている場合、その値が何であろうと PHPは、同名の関数を探し実行を試みます。 この機能は、コールバック、関数テーブル等を実装するために使用可能です。

変数名の後ろに括弧がついていると同名の関数を探しにいくそうです。

```php
<?php

function hoge() {
    echo "hello\n";
}

$name = 'hoge';

$name();
```

```sh
hello
```

## [無名関数](http://php.net/manual/ja/functions.anonymous.php)

> 無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。 コールバック パラメータとして使う際に便利ですが、用途はそれにとどまりません。
> 無名関数の実装には Closure クラスを使っています。

```php
<?php

function run($callback) {
    echo get_class($callback) . "\n";
    $callback(1);
}

run(function($num){
    echo "$num\n";
});
```

```
Closure
1
```

`get_class`を使うとClosureがとれました。
あるディレクトリの中にあるスプレッドシート(.xlsx)を一括でCSVに変換したい

スプレッドシートを一括でダウンロードしたのを、CSVに変換したいと思った。

ざっと60個ぐらいあったので、手でやりたくなかった。
シェル芸は苦手意識あったけど、やってみた。

本当はもっとキレイにかけるんだと思うが、とりあえず動作はするのでよしとする。


# 変換コマンドのインストール
`pip install xlsx2csv`

# 該当ディレクトリに移動して実行

```bash
ls |xargs -n 1 sh -c 'path=$0; xlsx2csv $0 ${path//.xlsx/.}csv'
```

一応、補足しておくと、
lsで一覧を出して、その引数を xargs に -nの数ずつだけ(つまり１)引数として渡す。
配列の添字と一緒で、$0でアクセスできる。
pathという変数に一回引数を入れておいて、`${path//.xlsx/.}` でファイル名のreplaceを行って、`.xlsx`をなくして、CSVをつける。

説明忘れてたけど、xlsx2csvの基本構文はこんな感じ↓。

`xlsx2csv <xlsx_file_path> <csv_file_path>`

なので、ループで

```bash

xlsx2csv 1.xlsx 1.csv
xlsx2csv 2.xlsx 2.csv
xlsx2csv 3.xlsx 3.csv
xlsx2csv 4.xlsx 4.csv
```

みたいな処理がされてると思ってもらえればいい。
(実際にはファイルネームをちゃんと見てやってるので、名前が連番になってる必要はない)
あたし 30 代だけど夏のラ王のサイトが読めない

# あたし 30 代だけど夏のラ王のサイトが読めない

## 起

[514355911513](http://www.rao.jp/natsuno_rao/)
（ ＾ω＾）
読めない ...

![www.rao.jp-natsuno_rao-before.jpg](https://qiita-image-store.s3.amazonaws.com/0/2580/24508d4b-0830-6728-b654-f331cf31a4cf.jpeg)

## 承

そんなあなた (僕も含む) のために JavaScript の力で何とかしてみました。

```javascript
/**
 * @fileOverview 夏のラ王のなんかいなあんごうをかいどくするすくりぷと
 */

(() => {

  /* 変換テーブル */
  const table = `あいうえおＡＢＣＤＥ
かきくけこＦＧＨＩＪ
さしすせそＫＬＭＮＯ
たちつてとＰＱＲＳＴ
なにぬねのＵＶＷＸＹ
はひふへほＺ？！－／
まみむめも￥＆　　　
や（ゆ）よ＊＃　　　
らりるれろ１２３４５
わをん゛°６７８９０`;

  /* テーブルを 2 次元配列にする */
  const MAT = table.split('\n').map(a => {
    return a.split('');
  });

  /**
   * 2 桁の番号を文字にする
   * @param {string} nn
   * @returns {string}
   */
  const charAtPokebel = nn => {
    const m = nn.split('').slice(0, 2).map(n => {
      return n - 1 < 0 ? 9 : n - 1;
    });
    return MAT[m[0]][m[1]];
  };

  /**
   * ポケベル風テキストを含む Node 一覧を取得
   * @param {HTMLElement} node
   * @returns {Array}
   */
  const getPokebelTextNode = (node) => {
    const nodes = [];
    const walker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null, false);
    let el;
    while (el = walker.nextNode()) {
      if (/\d+/.test(el.textContent)) {
        nodes.push(el);
      }
    }
    return nodes;
  };

  /**
   * 変換する
   * @param {HTMLElement} node
   */
  const convert = (node) => {
    getPokebelTextNode(node)
    .forEach((el) => {
      el.parentNode.style.whiteSpace = 'nowrap'; // 改行されると困るので阻止する
      el.textContent = el.textContent.replace(/(\d{1,2})/g, (m) => {
        return charAtPokebel(m);
      });
    });
  };

  convert(document);

})();
```

## 転

ブックマークレットにしたためましたのでお使いください。

```javascript
javascript:(function(){var d="\u3042\u3044\u3046\u3048\u304a\uff21\uff22\uff23\uff24\uff25 \u304b\u304d\u304f\u3051\u3053\uff26\uff27\uff28\uff29\uff2a \u3055\u3057\u3059\u305b\u305d\uff2b\uff2c\uff2d\uff2e\uff2f \u305f\u3061\u3064\u3066\u3068\uff30\uff31\uff32\uff33\uff34 \u306a\u306b\u306c\u306d\u306e\uff35\uff36\uff37\uff38\uff39 \u306f\u3072\u3075\u3078\u307b\uff3a\uff1f\uff01\uff0d\uff0f \u307e\u307f\u3080\u3081\u3082\uffe5\uff06 \u3084\uff08\u3086\uff09\u3088\uff0a\uff03 \u3089\u308a\u308b\u308c\u308d\uff11\uff12\uff13\uff14\uff15 \u308f\u3092\u3093\u309b\u00b0\uff16\uff17\uff18\uff19\uff10".split(" ").map(function(a){return a.split("")}),e=function(a){a=a.split("").slice(0,2).map(function(a){return 0>a-1?9:a-1});return d[a[0]][a[1]]},f=function(a){var c=[];a=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);for(var b;b=a.nextNode();)/\d+/.test(b.textContent)&&c.push(b);return c};(function(a){f(a).forEach(function(a){a.parentNode.style.whiteSpace="nowrap";a.textContent=a.textContent.replace(/(\d{1,2})/g,function(a){return e(a)})})})(document)})();
```

## 結

やったぜ (画像はムリですゆるしてください)

![www.rao.jp-natsuno_rao-after.jpg](https://qiita-image-store.s3.amazonaws.com/0/2580/5eff91a7-b87f-38d8-b87a-f277150a21b3.jpeg)