OmniAICreator/Qiita-1.07M huggingface dataset:
js フィボナッチ数列の奇数を合計する

##お題
与えられた引数（正の数）と同じかそれ以下のフィボナッチ数列の奇数を合計する。
[フィボナッチ数](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0) wikipedia
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …

例　引数10の場合、10が返ってくる。
10以下の奇数のフィボナッチ数は1,1,3,5で合計は10のため

```js
function sumFibs(num) {
//write your code.
}

sumFibs(4);//Fibs[1,1,2,3] sum 5
```

##出力結果　例

```js
sumFibs(4000000) //4613732
sumFibs(4) //5
sumFibs(75024) //60696
sumFibs(75025) //135721
```

##つかったもの
push()
reduce()
if文
for文

##考え方
・引数までのフィボナッチ数列を求めて配列に入れる。→奇数を合計して返す
・フィボナッチ数は配列の最後から一番目と二番目を足して配列に追加する処理をfor文で繰り返して取得する
・配列の奇数の合計はreduce()を使ってもとめる。
・奇数はif文の条件に2で割ってあまりが0以外のものと設定してもとめる。

##コード

```js
function sumFibs(num) {
//引数numまでのフィボナッチ数列をもとめる
  var arrFib = [0,1];
  for (var i = 1; i <=num;) {
      arrFib.push(i);
      i = arrFib[arrFib.length - 1] + arrFib[arrFib.length - 2];
  }
//配列の奇数を合計する
  var res = arrFib.reduce(function(prev, curr) {
      if (curr%2 !== 0) return prev + curr;
      else return prev;
    });
  return res;
}

sumFibs(4);
```

###他にもコードが浮かんだ方、コメントお待ちしております。
Goでの time.Location のあれこれ

## `time.LoadLocation()`

それぞれのタイムゾーン情報は、以下のようにして取得できる。

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	utc, _ := time.LoadLocation("UTC")
	fmt.Println(utc.String())
	fmt.Println(time.Now().In(utc))

	jst, _ := time.LoadLocation("Asia/Tokyo")
	fmt.Println(jst.String())
	fmt.Println(time.Now().In(jst))
}
```



```bash
$ go run main.go
UTC
2017-01-07 07:07:11.411502827 +0000 UTC
Asia/Tokyo
2017-01-07 16:07:11.411913577 +0900 JST
```

### ローカルタイムゾーン

サーバーのローカルタイムゾーン情報は、
以下のように明示的にタイムゾーン名を指定せずに、`"Local"` を引数とすると取得できる。

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	local, _ := time.LoadLocation("Local")
	fmt.Println(local.String())
}
```


```bash
$ go run main.go
Local
```

ちなみに、以下のように空文字列を引数とすると、`UTC`が返ってくる。

```go
package main

import (
    "fmt"
    "time"
)

func main() {
    utc, _ := time.LoadLocation("")
    fmt.Println(utc.String())
}
```

```bash
$ go run main.go
UTC
```

なお、`LoadLocation()` を使わずに、

- サーバーのタイムゾーン
- `UTC`

には直接アクセスすることも出来る。

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	utc := time.UTC
	fmt.Println(utc.String())

	local := time.Local
	fmt.Println(local.String())
}
```

```bash
$ go run main.go
UTC
Local
```
スクロールしたら表示されるバナーを閉じるを押したら、再度スクロールしても再表示されないようにしたい。

# 実現したいこと
ワードプレスでテーマはsimplicity子テーマを使い、サイトを作成しています。 
フッターの所（画面の一番下）に固定されて表示されるオーバーレイバナーを作りたいです。 
ある程度スクロールしたら表示されて、閉じるのボタンを押せば非表示になるようにしたいです。
# 解決したいこと
①今の段階で、ある程度スクロールしたら表示されるようになり、閉じるボタン押しても非表示は実現できてますが、その後スクロールすると再度バナーが表示されてしまいます。閉じるボタンを押したらスクロールしても再表示されないようにしたい。

次に解決したい 
②bottom: 0pxにしているのにバナーが画面の一番下に表示されず、一番下から少し上に表示される。

次の次に解決したい 
③閉じるボタンのクリックの範囲を閉じるボタンの画像の部分だけにしたい。今は画像が表示されている列全体に範囲がある

# ソースコード
ｈｔｍｌ

```
<div id="banner">
<div id="bannerin"><a href="http://....."><img src="http://....jpg" /></a>
<p id="closebanner"><a><img src="http://......jpg" /></a></p>
</div></div>
```
CSS

```
#bannerin
{
    display: block;
    width: 100%;
    position: fixed;
    left: 0px;
    bottom: 0px;
    z-index: 998;
    text-align: center;
    padding: 0 auto;
}

#closebanner

{
    width: 100%;
    position: fixed;
    left: 0px;
    bottom: 1px;
    z-index: 999;
    text-align: right;
    padding: 0 auto;
}
```
footer-insert.php

```
<script>
jQuery(function() {
    var bann = jQuery('#banner');
    bann.hide();
    jQuery(window).scroll(function () {
        if (jQuery(this).scrollTop() > 400) { // 400pxで表示
            bann.fadeIn();
        } else {
            bann.fadeOut();
        }
    });
});
</script>

<script>
jQuery('#closebanner').click(function(){
        jQuery('#banner').hide();

    });

</script>
```

詳しい方何卒よろしくお願い申し上げます
APNs Provider APIとAPNs Auth Keyを使ったAPNs送信【毎年のAPNS証明書更新が不要に】

# はじめに
APNs Provider APIとAPNs Auth Keyを使うと、
旧来のAPNs Push通知とくらべて様々なメリットがあります。

## アプリ毎に証明書を用意しなくて良い
HTTPヘッダーに付与するバンドルIDを変えるだけで、
対象のアプリを切り替え可能です。


## 証明書を更新しなくて良い
いままではAmazon SNSやLogPushなど複数の配信方法を使っていると、
証明書の更新が地味に手間でした。
APNs Auth Keyは有効期限が無いので、毎年の更新もれの心配もしなくて安心です。


## HTTP2 + JWT(JSON Web Token)なので実装がシンプル
HTTPヘッダーにJWTトークンを入れて、HTTP2でPOSTするだけなので簡単です。

複数の端末に配信する場合も、HTTP2なので単一のコネクションで複数回POSTするだけです。


## デメリット
Amazon SNSがまだ対応してません。（07/1/7現在）


# 準備
バンドルID, デバイストークンの他に、
Apple Developer Programのサイトから下記のデータを用意します。

* Term ID
* APNs Auth Key

## Term ID
Membershipページに記載されています。

## APNs Auth Key
Certificates, Identifiers & Profiles
↓
左メニューの「Certificates」 - 「APNs Auth Key」
↓
右上の「＋（Add）」ボタン
↓
「Apple Push Notification Authentication Key (Sandbox & Production)」
を選択して「Continue」
↓
発行したAPNs Auth Keyの「Key ID」とダウンロードできる「p8ファイル（プライベートキー）」を使います。


# ソースコード
nodejsを使った、複数のiPhoneへ送信する実装です。
https://github.com/m-hosoi/node-apns-provider-api
パスワードリセット機能を作った

## はじめに
この記事は「こうすればパスワードリセット機能作れる!」じゃなくて、「こういう仕様にしたけど漏れ無いかな？」ぐらいのノリで作っているので、参考にする場合は自己責任でおねがいします。(そんなこと書かずとも基本的には自己責任なんだけど)指摘歓迎です。(そんなこと書かずとも基本的には指摘歓迎なんだけど)

作ったパスワードリセット機能は、メールアドレスをアカウント登録時に用意しておき、うっかりパスワード忘れてしまった人向けに、パスワードリセット用のURLを送付してリセットしてもらうものです。

TrainStampRally https://train.ponkotuy.com という自作のゲームに、独自のアカウント認証があるので、これに対して実装しました。

## 使ってるもの
APIサーバはよくあるScala + Playframeworkプロジェクトで、JSONを返すだけのAJAX的な実装。クライアントはCoffeeScript + Vue.jsでレンダリングしてます。

認証はplay2-auth pluginを使ってBasic認証しており、パスワードはBCryptで保存しているので、生パスワードは開発者も知ることはできない状態になっています。

メールを送信する必要があります。様々な方法があると思いますが、今回はAmazonSESを使っています。一定量は無料で使えるので、この程度ならほぼ無料で使えるでしょう。

## 仕組み
まずはユーザからパスワードリセット要求があります。

```
PUT /api/password_reset
```

このとき現行仕様ではEmailアドレスを要求しますが、Emailアドレス忘れてもユーザ名とかで検索できる仕様にすることは可能だと考えています(単に面倒くさかっただけ)

リセット要求がきたらmailアドレスからアカウントを検索、該当アカウントにUUIDを発行します。臨時のアクセスキーみたいなものですね。該当アカウントが既にUUIDを発行していた場合は削除します。java.util.UUIDのrandomUUIDメソッドで発行し、パターンは完全ランダムです。(サーバや日付に依存した値は入らない)

その後、UUID付きのURLが書いてあるメールを送信します。

```
※このメールはAmazonSESによって送信されています

TrainStampRallyのパスワードリセットメールです。
心当たりのない方は無視するか返信で教えていただけると幸いです。

以下のURLにてパスワードを再設定することができます。

https://train.ponkotuy.com/auht/password_reset.html?secret=a0202ae2-4c77-4f87-a5fe-d0dd0fbdecd9

有効期間は1日間のみです。それ以降は再送してください。
```

内容はこのようなものです。

記載URLでは新しいパスワードを設定するフォームがあります。このページはsecretの文字に関係なく表示されますが、この値を用いてAPIサーバに

```
DELETE /api/password_reset
```

を発行します。当然先のUUIDと新しいpasswordのデータを入れます。1日以内に発行されたUUIDと照合し、ヒットすれば新しいpasswordが設定され、UUIDは削除されます。

以上でパスワードリセットが完了するという仕組みです。

## AmazonSES補講
今回使ったAmazonSESですが、リリースしてから、外部にメールを出すには申請が必要で申請に1営業日掛かると気付きました。アホす。
AmazonSESは1通辺りが安いですが到達率を一定以上に保つ必要があるなど、色々条件が多いので、大した数にならないパスワードリセットでは他のサービスを使った方が楽かもしれません。
pic12f629 と pickit3 を 接続

#仕様
・pickit3(以下kit)のpin
➤1
　2
　3
　4
　5
　6

・pic12f629(以下pic)のpin
8-7-6-5
).　　|
1-2-3-4

・mplab ideは8.92verを使用(idexではない)

#注意
・デスクトップで行うこと、ノートpcだと安定しない
(ノートpcはpickitのstatusランプが点灯しないことがある)
・picとkitをつなぐ作業を完了してからkitをpcに接続する

#手順
###pic側
・picの1,4pinを10kΩの抵抗でつなぐ
・kitの1pinをpicの4pinとつなぐ
・kitの2pinをpicの1pinとつなぐ
・kitの3pinをpicの8pinとつなぐ
・kitの4pinをpicの7pinとつなぐ
・kitの5pinをpicの6pinとつなぐ

###pc側
・mplab ideを起動
・programmer->select programmer->pickit3を選択(ここでpickit3のstatusランプが緑になる)
・programmer->settings->powerでpower target...のチェックボックスをチェック、適用を押してOKを押す(ウィンドウが出てくるが、基本的に大丈夫なのでOKを押す。心配なら頑張って読む）
・outputタブのpickit3タブを見てtarget ID revision = 0000000b(idは環境によって違うかも)とでたら成功(outputタブはview->Outputで出せる)
・target device id expected (0000...)とかでてたら失敗
Bluemix：簡易ETLサービスDataConnect（Data Set Catalogを試す）

DataConnectの基本的な使い方は以下のような記事でいろいろ書いてきましたが、毎回毎回、データ・ソースへの接続定義から、スキーマやテーブルを探し当てて...と同じような作業を何回もしなければならず、ちょっと面倒でした。

また、DBの構成よくわかってないアプリ屋さんとかが見ると、いちいちDBのことを聞かれて「セルフサービスの簡易ETL」としたらちょっと不便な部分もあったのかなと思います。
http://qiita.com/azzeten/items/a0b604c67d993387ff5e
http://qiita.com/azzeten/items/f74b7070feedb956f925

Data Set Catalogというのが出来て、要はよく使うテーブル等についてはダイレクトにそれが指定できるようにブックマークというか、「データセット」として定義してしまおうという考え方のようです。

よく使うものはこんなかんじで指定してあげると・・↓
![スクリーンショット 2017-01-07 14.42.13.png](https://qiita-image-store.s3.amazonaws.com/0/119378/f96eac73-904e-cc34-da41-19c95ce055c5.png)

ETLジョブを定義するときも、ダイレクトに指定できるようになりました↓
（従来は、Connectionからいちいちたどる必要がありました）
![スクリーンショット 2017-01-07 14.51.30.png](https://qiita-image-store.s3.amazonaws.com/0/119378/751f0b8b-2420-728f-06f9-19de60896c91.png)


初見の人やアプリの人でも、「このデータセットはどこのDBのどこの情報で、いつ作られたものなのか」というのが確認できる画面も準備されています。
![スクリーンショット 2017-01-07 14.42.39.png](https://qiita-image-store.s3.amazonaws.com/0/119378/51eb96f4-1549-ff99-9fd2-37c4b06cfe74.png)


![スクリーンショット 2017-01-07 14.43.36.png](https://qiita-image-store.s3.amazonaws.com/0/119378/6f3e4583-dfa9-acd1-e8f0-cac42dfa0ab6.png)
RedShiftでSQLだけで前の行との比較を行う / LAG()関数

# やりたかったこと

例えば、こういう何かの購買日が管理されているテーブル( `purchase_log` とする)があったとして、

| purchase_date | user_id |
| --- | --- | --- |
| 2016-12-01 | AAA | 
| 2016-12-02 | BBB | 
| 2016-12-02 | AAA | 
| 2016-12-04 | BBB | 

ユーザーごとに **何日おきに購入されているか** を調べたかった。

# やりかた

サブクエリを駆使して行同士の差分を計算する方法もあるが、ソート可能なユニークキーが存在していないといけないなどスキーマに依存する。

そこで `LAG()` というウィンドウ関数を使えば、ソートに気をつけるだけでできる。やったね！

# SQLの例

`purchase_log` テーブルの場合、こんな感じで購買日ごとの購買間隔を計算する。

```
SELECT
  purchase_date,
  user_id,
  purchase_date - LAG(purchase_date, 1) OVER (ORDER BY user_id ASC, purchase_date ASC) AS interval_days
FROM purchase_log
ORDER BY user_id ASC, purchase_date ASC;
```

とすると、

```
 purchase_date | user_id | interval_days 
---------------+---------+---------------
 2016-12-01    | AAA     |              
 2016-12-02    | AAA     |             1
 2016-12-02    | BBB     |             0
 2016-12-04    | BBB     |             2
```

こんな感じで返ってくる。

あとは一時テーブルに入れるなりして、邪魔なデータ( `user_id` の境界とか)を良い感じにして、平均購買間隔などそれっぽい指標を集計すればよろし。

# おわりに

私の場合は十分実用に耐えうる処理速度でした。window関数活用していきたい。

http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_Window_functions.html

BigQueryでも同様のことができそう。

https://cloud.google.com/bigquery/query-reference
I created the interface of hospital dashboard which shows clinical data on the web page.


https://github.com/riow1983/Hospital_dashboard_ver.0.1



I created the interface of hospital dashboard which shows clinical data on the web page.

Python's library Flask and Bokeh make it possible to create beautiful interactive web page without writing a piece of JavaSript.

For the purpose of letting the page work in the environment which stants alone, I saved BokehJS and BokehCSS in the "static"
repository. You don't nead to copy and paste the long scripted chunk of js and css.

Files and directory:
main.py
/static
  bokeh-0.12.2.min.js
  bokeh-0.12.2.min.css
  bokeh-widgets-0.12.2.min.js
  bokeh-widgets-0.12.2.min.css
/templates
  index.html
  
As you can see, the version of these files is 0.12.2, which must be equal to your Bokeh's version. 
So please change the number to fit to you.
And of course these are for only the web page interface. The database interactions are not concerned here and the 
plotted data(graph) is just sample.

Future plan:
• Put pandas.DataFrame(table) into the page with csv download botton.
• Make the layout of index.html more attractive.



(以下日本語で)
どうも医療情報技師のホリウチです。
病院の医療情報部門にいると院内各所からデータ抽出の依頼が来ます。その都度DWHからデータを抽出し、ExcelやAccessなどを使って加工する、その繰り返しにうんざりしている人もいるかも知れません。

ところでそんなデータ抽出業務をできる限り自動化し、欲を言うなら常に最新のデータに自動更新されて、院内のスタッフ誰もがどこからでも、どのタイミングでも最新のデータにアクセスできるようになったら、経営改善にも繋がって、医療情報部門の面目躍如になるんじゃないか、と思いませんか？

電子カルテ端末には必ずWebブライザが未使用のまま放置されています。これを使わない手はありません。

Pythonのライブラリ(Flask, Bokeh)を使ってJavaScriptを自前で書くことなく病院ダッシュボードを自作することは可能だと思います。今回はそんな発想のもと作成したプロトタイプをgithubに公開してみました。今後はここで開発を進めて行きたいと考えております。
【Memo】mustache記法のテンプレートエンジンswigでVue.jsを使う時は、デリミタをエスケープする必要がある


今年一発目の投稿になります。
仕事で初めてVue.jsを使おうと思い、案件に組み込もうとしたらdata部分が出力されないという状況でハマったのでメモしておきます。

## なぜ出力されなかったのか

結論としては、テンプレートエンジン内のVue.jsの`{{ mustache }}`は、swigの文法として認識されるため出力されません。※swigのdataとしては定義していないため出力されなかった

Vueとして認識させるには、テンプレート内に`{% raw %} 〜 {% endraw %}`で括る必要があるようです。

swigの記事ではなく、[ twigテンプレートエンジンでvue.jsを使うとデリミタがコンフリクトする。](http://arata.hatenadiary.com/entry/2014/04/26/224836)を参照して対応してみました。

自社の開発では、テンプレートエンジンswigを使ってコーディングしています。このswigでは `{{ mustache }}`という記法で書きます。

雛形のテンプレートをベースにページごとにコーディングしていきます。
この時に雛形に記述されている`{{ title }}`などをページ単位で宣言して出力させます。

Vue.jsでv-forで表示させるには、以下のpage.htmlで記述した`{{ todo.text }}`を記述します。

Vue.jsのソースコードを `{% raw %} 〜 {% endraw %}`で括ることで`{{ mustache }}` を通常の文字列として認識させることができVue.jsとして認識させることができます。

``` default.html
<!-- 雛形テンプレート -->
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
<meta name="description" content="{{ description }}">
<meta name="keywords" content="{{ keywords }}">
</head>
<body class="{{ page }}">
<main>
{{ contents | safe }}
</main>
</body>
</html>
```

``` page.html
---
layout: default.html
title: "ページタイトル"
description: "ページの説明がはいります。"
keywords: "キーワード,キーワード"
page: "page"
---

<h1>Vue.jsを表示させる v-forでdataを表示させた例</h1>
{% raw %}
<div id="app">
  <ol>
    <li v-for="list in lists">
      {{ list.text }}
    </li>
  </ol>
</div>
{% endraw %}
```

``` app.js
var app;
app = new Vue({
  el: '#app',
  data: {
    lists: [
      { text: 'JavaScript' },
      { text: 'Vue.js' },
      { text: 'swig' }
    ]
  }
});
```

ソースはサンプルですが、上記のような形で対応する必要があるようです。
今回はswigでしたが`{{ mustache }}`記法のテンプレートエンジンであれば同じような状態になると思われるので、きちんと除外させることがチェックポイントだと思います。

* Django、Jinja2、Twig など

実務では、違う問題かと思って色々調べてドハマリしてしまいました。
なんで？この環境だけ表示がされないのだろうと思ったら、今の環境と他の環境との違いをきちんと俯瞰してみることが大切ですね。。

初歩的なことですが、分からずハマるポイントだと思うのでメモしておきます。

##  参考記事

* [ twigテンプレートエンジンでvue.jsを使うとデリミタがコンフリクトする。](http://arata.hatenadiary.com/entry/2014/04/26/224836)
gzipコマンドで圧縮時の出力先ファイルを指定する

## 通常

> $ gzip hogehoge.sql

とコマンドを実行するとカレントディレクトリに `hogehoge.sql.gz` が作成されて、もとの `hogehoge.sql` は消えるはずです。

ですが、ディスク容量に余裕がない時など、他のパーティションのディレクトリに保存したいときとかあると思います。

## 出力先を指定する

> $ gzip hogehoge.sql -c > /tmp/hogehoge.gz

`-c` オプションで出力を標準出力に書き出し、元ファイルを変更しないようにすることができます。`--stdout`, `--to-stdout` も同じ意味のオプションになります。

なので、標準出力の出力先として出力先ファイルパスを指定するとそちらに圧縮された内容が出力されます。

## こんな使い方も

> $ gzip hogehoge.sql -c | ssh 192.168.1.100 "cat > /tmp/hogehoge.sql.gz"

こうするとgzipした圧縮ファイルを 192.168.1.100 のホストへSSH転送することもできます。
Laravel Homestead の第３の使い方

<img width="468" alt="スクリーンショット 2017-01-07 13.09.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/18306/f0dd29b2-87dc-c3b5-9baf-48cb8ec9d19a.png">

Laravelで開発するときに必要なvm環境を一式揃えてくれる便利なツールの1つ。Homesteadです。

マニュアル通りにセットアップすると設定ファイル一式が ~/.homestead に保存されます。このディレクトリをバックアップしておけば万が一のときにもすぐに環境を整えられるメリットがあります。

第２の方法としてプロジェクト毎にインストールする方法が紹介されています。
この方法は複数人のプロジェクトで運用する場合にバージョンを合わせられるなどのメリットがありそうです。

今回はこれら２つの方法のどちらでもない、第３の運用方法を紹介したいと思います。

## homestead置き場を作る

```bash
$ mkdir work/vm/homestead
$ cd work/vm/homestead
```

# git init

```bash
$ git init
```

# composer

composer.json を作成し、以下のように記述します。
ここでは最新の4系を指定していますが、過去バージョンを指定することでPHP5.6やPHP7.0のvmを作ることもできます。

```copmoser.json
{
    "require-dev": {
        "laravel/homestead": "^4.0"
    }
}
```

```bash
$ composer install
```

vendor以下にhomesteadがインストールされたと思います。

# make

ドキュメントのプロジェクト毎にインストールする場合と同じように、コマンドを叩きます。

```bash
$ php vendor/bin/homestead make
```

カレントディレクトリに `Vagrantfile` や `Homestead.yaml` ができているでしょう。
`Homestead.yaml` を自分の環境に合わせて編集してください。

# vm起動

```bash
$ vagrant up
(省略)
```

暫く待つと、Homestead が起動してきます。

# 忘れずに

ここで安心せずに、git commit そして git push しておきましょう。
二次元セルオートマトン（ライフゲーム）


[一次元セルオートマトン](http://qiita.com/kumatoki/items/76f9c521d87a04a519d0)の続き。
詳細は[wiki](https://ja.wikipedia.org/wiki/ライフゲーム)へ。
二次元セルオートマトンの中でもこのルールのことをライフゲームと呼ぶようです。

# Ruby

## init
`Array.new`にブロックを渡すと良しなに初期化してくれます。

```ruby
class Lifegame
  attr_accessor :cells

  def initialize(y = 0,x = 0)
    @cells = Array.new(y) { Array.new(x,0) }
  end
```

## rule
前回と違いパターンないしルールは固定。
自分の生死と周囲の生きている数を元に明日の生死が決まります。
孤独だと死。騒がしくても死。丁度良いと生き返ったりします。

```ruby
  def rule(*cs)
    case cs
    when [1, 2] then 1
    when [1, 3] then 1
    when [0, 3] then 1
    else 0
    end
  end
```

## apply
配列の外を参照しない様に確認しながら、
周囲の生きている数を数え上げ、ルールに適応します。
前回教えていただいたproductが使えスッキリしてます。

```ruby
  def apply
    sy = @cells.size
    sx = @cells[0].size
    as = [-1,0,1]

    @cells = @cells.map.with_index { |cy,iy|
      cy.map.with_index { |c,ix|
        rule(c,
          as.product(as).map { |ay,ax| 
            if ay == 0 && ax == 0
              0
            else
              y = iy + ay
              x = ix + ax
              if y >= 0 && y < sy && x >= 0 && x < sx
                @cells[y][x]
              else
                0
              end
            end
          }.reduce(:+)
        )
      }
    }
  end
```

## random
セルを手で打つのはだるいのでランダムに任せます。
一応ブロックで調整できます。
コクのある乱数など試して見ましょう。

```ruby
  def random
    @cells = @cells.map { |y|
      y.map { |x| 
        if block_given?
          yield x
        else
          rand(2) 
        end
      }
    }
  end
```

## show, run
clearコマンドでターミナルの画面でアニメーション（遅い）
その場合はsleepで調整。

```ruby
  def show
    @cells.map { |y| y.map { |x| x == 0 ? " " : "O" }.join + "\n" }.join + "\n"
  end

  def run n = 200,m = 0.1
    g = 0
    for nn in 1 .. n
      system "clear"
      puts "Gen: #{g}\n#{show}"
      g += 1
      apply
      sleep m
    end
  end
end
```

## main
サイズが大きすぎると遅いので調整しましょう。
私のターミナルは縦25*横100しかないのでこれくらいで十分です。
めっちゃフォントを大きくしてます。

```ruby
require "io/console"
y,x = IO.console.winsize
cs = Lifegame.new(y-3,x)
cs.random { (rand(2) + rand(2) + rand(2)) / 3 }
cs.run(50)
```

![lifegame_terminal.gif](https://qiita-image-store.s3.amazonaws.com/0/154291/5e5bee81-e412-e7fa-604a-6b574bd501ea.gif)

# end
ttygif使って見たけどいまいちカクカク。
実際はもう少しなめらかです。
PostgreSQLの内部の処理とEXPLAIN文について

#はじめに
業務でクエリチューニングを行った際に、EXPLAIN文を使うことがあったので勉強がてらまとめました。
PostgreSQL内部で何を行っているかざっくりと理解しておいたほうが、EXPLAIN文を理解すやすいと思ったので一緒に調べました。

###そもそもクエリチューニングとは
クエリを調整して使用するメモリや実行速度を改善するようなことを言います。
実際に出力される結果に変更はされないように行います。

#PostgreSQL内部の全体的なクエリ処理のフロー
###1. 接続の確立
1プロセスに1ユーザーのクライアント/サーバモデルによって実装されています。
接続が確立されたら、クライアントからサーバへ問い合わせを送ることができるようになります。

###2. 構文の確認
構文の確認を行う部分を**パーサ**と呼びます。
パーサでは平文のテキストとして渡される問い合わせの文字列が正しいかを確認して、正しい場合には構文解析ツリーが返され、正しくない場合にはエラーを返します。

###3. 書き換え
パースツリーを解析してクエリツリーに変換します。
その際にテーブルが実際に存在するかどうかをチェックし、存在していたらテーブル名をOIDに変換している部分を**アナライザ**と呼びます。

OIDは、Let's Postgresによると
> オブジェクト識別子とは、PostgreSQLがDB内部に格納している様々なオブジェクト(テーブルやインデックス、関数、演算子、データ型定義などなど)を一意に識別するためのIDです。

クエリを書き換えることによってVIEWやRULEを実装している部分を**リライタ**と呼びます。
(ここら辺があまり理解できていないなく、かなりざっくりとしているので必要に応じてドキュメントを参考にしてください。)

###4. 最適な実行方法を決める
これらを元に、最適な実行計画を作成する部分を**プランナ/オプティマイザ**と呼びます。
ここでは結果が変わらないすべての経路を作成し、それぞれのコストを比較して一番早い経路を選択します。

例えばインデックスがある場合、インデックスを使用するパターンとインデックスを使用しないパターンを比較してより効率的である方を実行計画とします。

###5. 実行する
実際に実行する部分を**エクゼキュータ**と呼びます。
プランナ/オプティマイザで作成された計画を元に実行し、実行結果をクライアントへ返却します。

#EXPLAIN文
一言で言うとプランナ/オプティマイザが生成する実行計画を表示する構文です。
プランナ/オプティマイザで最適な実行計画を決めるために使用されるコストの見積もりや、実際に実行される時間などを計測することができます。

PostgreSQLで決めれられている実行計画が、実際に最適なのかを確認するためにEXPLAIN文で確認することで、クエリチューニングに活かすことができる。

##実際にEXPLAIN文を使用してみる
セレクト文の前にEXPLAINをつけるだけで、そのセレクト文の実行計画やコスト見積もりを見ることができる。
今回はidにインデックスがはってあるuserテーブルを例としてみる。

```sql
EXPLAIN SELECT * FROM user WHERE id <= 100;
-- 下記が出力結果
Index Scan using monitor_pkey on user  (cost=0.28..50.77 rows=27 width=361);
```
##出力結果の確認方法
###実行計画

```sql
Index Scan using monitor_pkey on user
```
そのままですがmonitor_pkeyを使用してuserテーブルをIndex Scanするという実行計画を立てています。
「Index Scan」とはインデックスを使用してスキャンをするテーブルスキャンの一種です。
全件を検索する場合は「Seq Scan」、ビットマップを使用する場合は「Bitmap Scan」などが使用されます。

###コストの見積もり
```sql
(cost=0.28..50.77 rows=27 width=361);
```
・costは..の左側が初期コスト(最初の行を返すまでのコスト)、
・costは..の右側がトータルコスト(最後の行を返し終わるまでのコスト)
・rowsは推定された行数
・widthは推定された入力サイズ

となっています。

###コストの単位について
コスト1.00はシーケンシャルの読み込み1回分のコストと同じになっています。

##where句の条件だけ変えてみる
```sql
EXPLAIN SELECT * FROM user WHERE id <= 600;
-- 下記が出力結果
Seq Scan on user  (cost=0.00..88.01 rows=389 width=361)
```

今回は対象となるidを600以下に設定しました。
先ほどまでは「Index Scan」が行われていたのですが、今回は「Seq Scan」(全件検索)となっています。
そのため、初期コストがかからないものの、トータルコストが高くなっています。

indexが機能しているかはこのようにして確認することができます。

#実際のコストを計測するには
今までのEXPLAIN文では、コストの見積もりを出力しています。
しかし、見積もりと実際のクエリを実行する場合ではコストが変わってきます。

##EXPLAIN ANALYZE文を使用する
```sql
EXPLAIN ANALYZE SELECT * FROM user WHERE id <= 600;
-- 下記が出力結果
Seq Scan on user  (cost=0.00..88.01 rows=389 width=361) (actual time=0.007..0.213 rows=387 loops=1)
   Filter: (id <= 600)
   Rows Removed by Filter: 974
 Planning time: 0.075 ms
 Execution time: 0.241 ms
```

実際にクエリを実行して、実際の計測データを表示しています。

#まとめ
EXPLAIN文でクエリチューニングの前後を比較することでどの程度改善されたのか数字で計れますし、インデックスが想定通りになっているのかわかりそうです。
プランナ/オプティマイザで決められた実行計画を変更する方法も書こうかと思ったのですが、案外ボリューミーになってしまいそうなので次回にします。

# 参考
下記のpostgresqlのドキュメントを参考にしたのでより詳しく知りたい方はご覧ください。
[PostgreSQL 9.6.5文書](https://www.postgresql.jp/document/9.6/html/query-path.html)
[PostgreSQLクエリ実行の基礎知識 ～Explainを読み解こう～](https://www.slideshare.net/MikiShimogai/postgre-sql-explain)
[Let's Postgres](https://lets.postgresql.jp/documents/technical/object_data_type/1)
JavaでSolrを使おうとしてエラーになったときのまとめ (Solr6.x)

# はじめに

　Solrjを使っていてエラーになったときの対処方法を備忘録としてまとめておきます。順次増えていくかも。

# SolrServerを初期化する際のエラー

　一般的にSolrServerを初期化する際には以下のコードになります。

```java:SolrServerSample.java
import java.io.IOException;
import org.apache.solr.client.solrj.*;
import org.apache.solr.client.solrj.impl.*;

public class SolrServerSample {
	public static void main(String[] args) throws SolrServerException, IOException {
		String url = "http://localhost:8983/solr/exampleCore";
		SolrClient solr = new HttpSolrClient.Builder(url).build(); // ※1 SolrServerを初期化する部分
	}
}
```

　上記※1の部分で発生するエラーをまとめます。

## クラスが見つからない

　具体的には以下のようなエラーです。

- java.lang.NoClassDefFoundError: org/apache/http/client/HttpClient
- java.lang.NoClassDefFoundError: org/apache/http/Header
- java.lang.NoClassDefFoundError: org/apache/http/entity/mime/content/ContentBody
- java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

　必要なjarファイルがビルドパスに含まれていない可能性があります。予めダウンロードしていると思われる、solr6.x.xフォルダ内の、dist -> solrj-lib フォルダにある以下のjarをビルドパスに含めてください。(xはバージョン番号)

- httpclient-x.x.x.jar
- httpcore-x.x.x.jar
- httpmime-x.x.x.jar
- slf4j-api-x.x.x.jar

## slf4j関連

　具体的には以下のようなエラーです。

- Failed to load class "org.slf4j.impl.StaticLoggerBinder".
- org.apache.solr.common.SolrException: Unable to create HttpClient instance.

[slf4jのダウンロードページ](http://www.slf4j.org/download.html)から最新のslf4jをダウンロードし、中にある以下のjarファイルをビルドパスに追加してください。(xはバージョン番号)

- slf4j-api-x.x.x.jar
- slf4j-simple-x.x.x.jar
- jcl-over-slf4j-x.x.x.jar

なお、すでに上述のjarが存在していた場合は一旦除去して、最新のものに入れ替えてください。

# SolrInputDocumentを生成する際のエラー

```java:SolrDocumentSample.java
import java.io.IOException;
import org.apache.solr.client.solrj.*;
import org.apache.solr.client.solrj.impl.*;

public class SolrDocumentSample {
	public static void main(String[] args) throws SolrServerException, IOException {
		String url = "http://localhost:8983/solr/exampleCore";
		SolrClient solr = new HttpSolrClient.Builder(url).build();

		SolrInputDocument document = new SolrInputDocument(); // ※2 SolrInputDocumentを生成する部分
	}
}
```

上記※2の部分で発生するエラーをまとめます。

## クラスが見つからない

　具体的には以下のようなエラーです。

- java.lang.NoClassDefFoundError: org/noggit/CharArr

　必要なjarファイルがビルドパスに含まれていない可能性があります。予めダウンロードしていると思われる、solr6.x.xフォルダ内の、dist -> solrj-lib フォルダにある以下のjarをビルドパスに含めてください。(xはバージョン番号)

- noggit-x.x.jar
１０秒で分かるrailsでバルクインサートする方法

バルクインサートについては後述しますが、まずは手順

##  gem【activerecord-import】をインストールする
```rb:Gemfile
gem 'activerecord-import'
```

```rb:terminal
$ bundle install
```

## バルクインサート処理
ここではわかりやすいようにカラム構成が全く同じ
Person1,Person2というモデルを使用します。
Person1の全データをPerson2に詰め替える処理を実装します。
Peson1,Peson2は以下のカラムを持ちます。

- name
- gender




```rb:
# 配列の初期化、この配列にオブジェクトを詰めていく
array = []
# Person1のデータ元にPerson2のオブジェクトを作成し、それをarrayに詰めていく
Person1.all.each do |person|
  array << Person2.new(name:person.name, gender:person.gender)
end

# バルクインサート処理
Person2.import array

```

以上！
* * *

## バルクインサートとは
**データを一括でDBにインサートする処理のこと**
バルクインサートを使用せずに上記を実現しようとすると
Person1に入っているデータの数だけinsert文が発行されるので
件数が多いと処理が遅くなったり、負荷が大きくなったりします。
SQLを比較すると一目瞭然です。

```sql:バルクインサートを使わない
INSERT INTO Person2 (name, gender) VALUES ("幾三","男");
INSERT INTO Person2 (name, gender) VALUES ("よしみ","女");
INSERT INTO Person2 (name, gender) VALUES ("ジェロ","男");
```

```sql:バルクインサートを使うと
INSERT INTO Person2 (name, gender) VALUES ("幾三","男"),("よしみ","女"),("ジェロ","男");
```

バルクインサートを使用するとクエリの発行が１回になっています。
iOSアプリが何回もリジェクトされた後にAppleからフォローアップされる件

# はじめに
三回リジェクトされたアプリを放置していたらAppleの方からお電話いただき、「そんなこともあるんだ！」と思ったので他の方に共有の意味でまとめてみます。

# カリフォルニアから電話がかかってきた
三ヶ月前にiOSアプリを作り申請しましたがリジェクトされました。
理由はよくある4. 2 DESIGN: MINIMUM FUNCTIONALITYです。自分でもそうだろうな、、まぁ通ればラッキーくらいの感覚で作ったアプリだったので納得。その後2回申請しましたが、いまだに審査通らず。そんな感じでダラダラしていた休日に携帯電話にカリフォルニアからの電話がかかってきて次のような留守電が流暢な日本語で残っていました。

「こんにちは、AppleのXXです。Appleのレビューのものです。申請いただいているXXのアプリについてフォローアップをさせていただきたく電話しました。（中略）折り返し電話ください。」

留守電を聞いて、あぁ、なるほど。

早速案内いただいた番号に電話をかけます。

そのまま数字を入力しても、そんな電話番号はないと言われます。あぁ、国際電話ってそのままかけられないのか、、と思ってググると、

+1(xxx)xxx-xxxxの+の部分は0を1秒以上長押しすると入力できます。とのことなので再度試します。

# 無事に電話がつながると

相手: Hello xxx(全然聞き取れず）

自分: あ、、、Hello I'm Tatsuya..あぁーー

相手: 日本の方ですか?

自分: あ、はい、そうです。さきほどXXさんからお電話いただいたのですが。

という感じで、ネイティブの日本語で対応されました。担当の方の名前は明らかに日本人。

電話の要件としては、レビューの内容について何か質問がないか？ということです。リジェクト理由は理解してたので、そんなに質問はなかったのですが、どんな改修をすれば審査に通るかを遠回しにアドバイスいただきました。

ついでに、どういうタイミングでこの電話は来るのか？を質問してみると、申請、リジェクトを何回か繰り返してるとこうやって電話いただけるとのこと。「俺らの審査を通らないと公開させないぜ！」という強気な印象を勝手に持っていたので、そういうフォローがあるのにはびっくりでした。

# 電話の後の対応
iTunesConnectの問題解決センターに、「さっき電話したけどでなかったよ、都合いいときに電話くださいね」といった内容のメッセージが英語で来てました。（自分が電話をかける前のタイミングで）

「あ、これ聞くの忘れた！」という質問事項があったので日本語で質問してみました。おそらく担当者はキーボードの問題で日本語はうてないけど見て意味は理解してもらえると思ったので。さっそく英語で回答が返ってきて納得の回答。

そういえば以前に、審査に関してAppleに電話して英語でやりとりをすることもできるが、日本語OKな方に変わってもらうこともできると聞いたことがあります。なるほど確かに日本語OKな方がいるということを身をもって体験しました。ひょっとしたら、電話に限らず問題解決センター上でのやりとりも日本語で書いたら日本人の方が回答くれるのかもです。（誰か知ってる人いればコメントください）

# まとめ
何回もリジェクトされると、Appleからフォローアップと称して日本語で電話がかかってくることがあります。
電話に出れなくても留守電を残してくれるので気がつけます。効果的に活用して審査を通しましょう！
緯度経度からメッシュコードに変換するPython script

10進数表記の緯度経度からメッシュコードに変換するPython scriptです.
(たまには，communityに貢献しようかと．．．)

```Coordinate2MeshCode.py
def Coordinate2MeshCode( dLat, dLng ):
    # cf: http://white-bear.info/archives/1400
    # Make sure the input values are decimal 
    iMeshCode_1stMesh_Part_p = dLat *60 // 40;
    iMeshCode_1stMesh_Part_u = ( dLng - 100 ) // 1;
    iMeshCode_2ndMesh_Part_q = dLat *60 % 40 // 5;
    iMeshCode_2ndMesh_Part_v = ( ( dLng - 100 ) % 1 ) * 60 // 7.5;
    iMeshCode_3rdMesh_Part_r = dLat *60 % 40 % 5 * 60 // 30;
    iMeshCode_3rdMesh_Part_w = ( ( dLng - 100 ) % 1 ) * 60 % 7.5 * 60 // 45;
    iMeshCode = iMeshCode_1stMesh_Part_p * 1000000 + iMeshCode_1stMesh_Part_u * 10000 + iMeshCode_2ndMesh_Part_q * 1000 + iMeshCode_2ndMesh_Part_v * 100 + iMeshCode_3rdMesh_Part_r * 10 + iMeshCode_3rdMesh_Part_w;
    return iMeshCode;
```

Kobitoからのuploadテストも兼ねました．

# 更新履歴
Jan7,2017: 致命的な問題をひとまず修正 (@shiracamusさん、ご指摘どうもありがとうございます)
1. 演算順序のミス
2. 恥ずかしい英語のミス
Pythonというか、プログラマとしてのコードの綺麗な書き方を学んだ方がいいですね、私。。。
演算結果を確認して、続いて修正します
vagrant up 時に [default] GuestAdditions versions on your host (5.1.12) and guest (5.1.10) do not match. と表示される。

GuestAdditions の version が古いとのことなので、以下を実行する。

```
vagrant plugin install vagrant-vbguest
…
vagrant vbguest
…
vagrant halt
==> default: Attempting graceful shutdown of VM...
vagrant up
…
[default] GuestAdditions 5.1.12 running --- OK.
…
```

---
以上です。
Nexus 6 に OTA image を適用して Android 7.1.1 にアップグレードした

手元で実行した手順を備忘に記します。これを参考にする場合は自己責任で。

## 下準備

### 母艦側

1. adb コマンドを使えるようにする
  - Arch Linux だと android-tools に入ってるはず
  - 他の環境のことはぐぐってもらった方が早そうなので書かない
2. udev で Nexus 6 が認識されるようにする
  - http://yslibrary.net/2016/09/15/connect-recoverymode-android-ubuntu/ みたいなことをすれば良い
3. OTA image の zip file を落とす
  - https://developers.google.com/android/ota にある
  - 「Terms and conditions」があるので良く読んで「ACKNOWLEDGE」すると一覧が出る
  - Nexus 6 の「2017年1月5日」イメージなら「N6F26Q」

### Nexus 6 側

1. バックアップを取る
    - と言いながら面倒だから取らなかったけど、取らないとドキドキするから取るべき
1. 「開発者向けオプション」を ON にする
    - 「設定」にまだ「開発者向けオプション」が無い場合には「設定」>「端末情報」で最下にある「ビルド番号」を連打
    - 「設定」に「開発者向けオプション」がある場合はタップしてスイッチを ON に入れる
1. 「USBデバッグ」を有効にする
    - 「開発者向けオプション」内の「デバッグ」のところにある

## 実作業

1. Nexus 6 とコンピュータを USB で繋いで「USBデバッグ」を許可する
    - USB で繋ぐとダイアログが出るので「OK」する
2. adb が動くか確認
    - `adb devices` とか打って "List of devices attached" の後に "XXXXXXXXXX    decive" みたいなのが出れば OK
    - ダメならぐぐって何とかする
3. bootloader に移行する
    - 具体的には `adb reboot bootloader` を実行
    - その瞬間に再起動がかかり、横たわってお腹を開いたドロイド君が現れる
    - 背景が真っ黒で不気味だけどがんばる
4. 「Recovery Mode」に移行する
    - bootloader では volume up/down と power ボタンが使える
    - volume down を何度か押すとメニューが切り替わって「RECOVERY MODE」が出るので power を押す
    - 再起動してさっきより致命的っぽいドロイド君が現れる
    - ドロイド君のお腹から赤▲で中に!が描いてあるのが出てるけど驚かない
    - No Command って出てて怪しいけど驚かない
5. 「Android Recovery」メニューを出す
    - power を押しながら volume up を押す
    - ドロイド君が消えて画面上にメニューが出る
6. 「Apply update from ADB」を選ぶ
    - volume up/down で選んで power で選択
    - 画面最下に「Now send the package you want to apply\nto the device with "adb sideload <filename>"...」のようなものが出るはず
7. OTA image を送ってアップデートする
    - 母艦で `adb sideload <filename>` を実行
    - もちろん `<filename>` は準備で落としたファイルを指定
    - `error: insufficient permissions for device` とか出たら `adb kill-server` して `sudo adb start-server` してみると良いかも
    - 母艦でも Nexus 6 でもそれぞれの進捗が出るので見比べてみると楽しい
    - 終わると「Android Recovery」メニューに戻る
8. 再起動する
    - メニューの一番上が「Reboot system now」だと思うのでそれを選んだ状態で power を押す
    - 再起動に普段よりも時間が掛かった、バックアップを取ってなかったので暫く後悔しながら眺めた
9. バージョンを確認する
    -「設定」の「端末情報」を訪れ各種情報が更新されていることを確認する

## 感想

アップデートなだけあり、Factory Image で flash したり CyanogenMod を入れるのに比べると手順が少なく楽だった
Travis でのテストを事前にローカルで試す

# 概要
[![English](https://img.shields.io/badge/English-here-lightgrey.svg?style=flat)](https://www.jkawamoto.info/blogs/test-remote-ci-scripts-locally/)

[![Loci Logo](https://jkawamoto.github.io/loci/img/image.png)](https://jkawamoto.github.io/loci/)
[GitHub](https://github.com/) などでホストしているプロジェクトのテストに，[Travis CI](https://travis-ci.org) などのクラウド CI サービスを利用するケースは多いだろう．

基本的に，ローカルの開発環境でテストに通ったことを確認してから，コミット，プッシュを行うはずなので，Travis 上でもテストはパスするはずである．しかし，Travis の設定ファイルである`.travis.yml`のミスや，依存ライブラリの追加忘れなどのうっかりで時々テストが失敗する．特に依存ライブラリの場合，開発環境ではたまたまインストールされていると，ローカルでのテストはパスしてしまうため，見落とすことがある．

テストが失敗すると，ローカル環境で修正の後，再プッシュとなりリモートブランチのコミット履歴が汚れて行くので，ミスはできるだけ避けるべきである（特に，他人のリポジトリでやらかすと気まずい）．そこで，Python または Go 言語のプロジェクト用に，[Docker](https://www.docker.com/) を使ってローカルにまっさらな環境を用意し，`.travis.yml`に記載された通りにテストを実行するツール，[Loci](https://jkawamoto.github.io/loci/) を作成した．

## デモ
[![asciicast](https://asciinema.org/a/126089.png)](https://asciinema.org/a/126089)

# インストール
まず，[Docker](https://www.docker.com/) が必要になるので，あらかじめインストールしておく（Docker の導入方法については割愛する）．

Loci のインストールは，[Go](https://golang.org/) がインストールされている環境ならば，

```shell-session
$ go get github.com/jkawamoto/loci
```

Homebrew がインストールされている環境ならば，

```shell-session
$ brew tap jkawamoto/loci
$ brew install loci
```

にて行える．それ以外の場合は，GitHubに[コンパイル済みのバイナリ](https://github.com/jkawamoto/loci/releases)があるので，ダウンロードしてパスの通ったところへ置けば良い．


# 使い方
カレントディレクトリに，`.travis.yml` がある場合，`loci` コマンドを実行するだけで良い．別ファイルをテストする場合は，`loci <filepath>`とファイルパスを渡す．

Loci はカレントディレクトリ以下に含まれるファイルを持ち，`.travis.yml` に記載されたパッケージをインストールしたコンテナイメージを作成する．元になるイメージは `ubuntu:latest` である．初回実行時は，パッケージのインストールなどである程度の時間を要するが，2回目以降は，依存パッケージに変更がなければ，過去のコンテナイメージを適宜再利用する（Dockerの機能）．

もし自前で， APT キャッシュサーバや PyPI キャッシュサーバを用意している場合，`--apt-proxy` や `--pypi-proxy` フラッグを使うことで，それらを利用するようになる．（参考: [QNAP に Apt キャッシュサーバを建てる](http://qiita.com/jkawamoto/items/fe0f098642b95e60a7c2), [QNAP に Pypi キャッシュサーバを建てる](http://qiita.com/jkawamoto/items/082af79bdf9a381a1d1b)）

全部のコマンドオプションは次の通り．

~~~
loci [global options] [script file]

  If script file isn't given, .travis.yml will be used.

GLOBAL OPTIONS:
   --name NAME, -n NAME  creating a container named NAME to run tests,
                         and that container will not be deleted.
   --tag TAG, -t TAG     creating an image named TAG.
   --base TAG, -b TAG    use image TAG as the base image.
                         (default: "ubuntu:latest")
   --verbose             verbose mode, which prints Dockerfile and
                         entrypoint.sh.
   --apt-proxy URL       URL for a proxy server of apt repository.
                         [$APT_PROXY]
   --pypi-proxy URL      URL for a proxy server of pypi repository.
                         [$PYPI_PROXY]
   --http-proxy URL      URL for a http proxy server. [$HTTP_PROXY]
   --https-proxy URL     URL for a https proxy server. [$HTTPS_PROXY]
   --no-proxy LIST       Comma separated URL LIST for which proxies won't
                         be used. [$NO_PROXY]
   --help, -h            show help
   --version, -v         print the version
~~~


# 今後の予定
現在のところ，Python　と　Go　にしか対応していないので，随時対応言語を増やす予定．
Ubuntu 16.04にEmacs 25.1をインストールする

Ubuntu 16.10でも同じ。
ソースからビルドしてもいいが、パッケージを公開してくれている人がいるのでそれを使わせてもらう。

```
sudo add-apt-repository ppa:kelleyk/emacs
sudo apt-get update
sudo apt-get install emacs25
```

Emacs24がインストールされていた場合はupdate-alternativesで設定変更してEmacs25に切り替える。

```
sudo update-alternatives --config emacs
```

インストール完了。

```shell-session
hoge@hoge:~$ emacs --version
GNU Emacs 25.1.2
Copyright (C) 2016 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
```


## 参考
http://askubuntu.com/questions/851633/emacs-25-on-ubuntu-16-10
汎用的なカウンター


デモ：http://codepen.io/mo4_9/pen/ZLGzwj

`loop`: ループ
`stop`: 最大値（最小値）までいったら頭打ち

`prev()`: 前に戻る
`next()`: 次に進む

`getCurrentIndex()`: 現在のインデックス
`getNextIndex()`: 次のインデックス
`getPrevIndex()`: 前のインデックス


```javascript:Counter.js
export default class Counter {
  constructor(opts = {}) {
    this.max = opts.max;
    this.min = isNaN( opts.min ) ? 0 : opts.min ;
    this.index = opts.index || this.min;
    this.type = opts.type || 'loop';
  }
  prev() {
    this.index--;
    this._check();
  }
  next() {
    this.index++;
    this._check();
  }
  _check() {
    if (this.type === 'loop') this._checkLoop();
    if (this.type === 'stop') this._checkStop();
  }
  _checkLoop() {
    if(this.index > this.max) this.index = this.min;
    if(this.index < this.min) this.index = this.max;
  }
  _checkStop() {
    if(this.index > this.max) this.index = this.max;
    if(this.index < this.min) this.index = this.min;
  }
  getCurrentIndex() {
    return this.index;
  }
  getNextIndex() {
    let result;
    if (this.type === 'loop'){
      result = (this.index >= this.max) ? this.min : this.index + 1 ;
    }
    if (this.type === 'stop'){
      result = Math.min(this.max, this.index + 1);
    }
    return result;
  }
  getPrevIndex() {
    let result;
    if (this.type === 'loop'){
      result = (this.index <= this.min) ? this.max : this.index - 1 ;
    }
    if (this.type === 'stop'){
      result = Math.max(this.min, this.index - 1);
    }
    return result;
  }
}
```
ELBのPre-WarmingのついでにEBSのPre-Warmingを調べた

#はじめに
最近下記の記事を書いたのですが、

[ELB暖気運転(Pre-Warming)申請についていくつかサポートに問い合わせた](http://qiita.com/Batchi/items/fcf56088d64d5d5c019b)

直後にEBSにもPre-Warmingという概念があるのを思い出したので、
勢いそのままについでに書くことにします。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/155963/8057fc3b-771a-40f1-cbc8-441a688f59fa.jpeg)


http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-amazon-elastic-block-store-ebs/45

#EBSのPre-Warmingとは
ざっくりいうと下記のとおりです。

- スナップショットからリストアした直後のEBSボリュームはIOがめっちゃ遅い
- どのくらい遅いかというと5%~50%分遅い
- 事前にコマンドによって読み込み処理を行えば上記を回避できる
- その処理をPre-Warmingという

付け加えると下記のとおり。

- 以前はスナップショットからのリストアだけでなく、新規ボリューム作成時にも遅かった
- 今は遅くないのでPre-Warmingはむしろやらないほうがいい
- Pre-Warmingというのは昔の呼称で、今は初期化（initialization）という

##きちんとドキュメントで読みたい
下記をご参照ください。
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-initialize.html

>新しい EBS ボリュームは、利用可能になるとすぐに最大のパフォーマンスを発揮し、初期化 (以前は事前ウォーミングと呼ばれました) を必要としません。ただし、スナップショットから復元されたボリュームのストレージブロックは、アクセスするためには事前に初期化する必要があります (Amazon S3 からプルダウンしてボリュームに書き込みます)。この準備処理には時間がかかるため、初めて各ブロックにアクセスした場合に、I/O 操作のレイテンシーの著しい増加が発生する可能性があります。ほとんどのアプリケーションにとって、ボリュームの存続期間全体でこのコストを割り当てることは、許容範囲内です。一度データにアクセスされると、パフォーマンスは元に戻ります。

>ボリュームを使用する前に、そのボリュームのすべてのブロックを対象に、読み取りを実行することで、本番環境におけるパフォーマンスの低下を回避することができます。このプロセスを「初期化」と呼びます。スナップショットから作成された新しいボリュームの場合は、ボリュームを使用する前に、データのあるすべてのブロックを読み取る必要があります。

#Pre-Warmingに使うコマンド
##Linuxの場合
###dd
`$ sudo dd if=/dev/xvdf of=/dev/null bs=1M`
###fio
`$ sudo fio --filename=/dev/xvdf --rw=randread --bs=128k --iodepth=32 --ioengine=libaio --direct=1 --name=volume-initialize`
##Windowsの場合
###dd
`C:\>dd if=\\.\PHYSICALDRIVEn of=/dev/null bs=1M --progress --size`
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ebs-initialize.html

#あと少し気になった箇所
>スナップショットから復元された io1 ボリュームを初期化している間は、ボリュームのパフォーマンスが想定レベルの 50% を下回る場合があります。このため、ボリュームの [I/O Performance] ステータスチェックでは warning 状態が表示されます。これは想定の動作です。初期化中の io1 ボリュームの warning 状態は無視してかまいません。

io1とはつまり「プロビジョンド IOPS SSD」のことですが、
なぜio1だけ言及されているのか、他のボリュームタイプでは無視してはいけないのか？
というのが気になります。（詳細未確認）

#おわりに
スナップショットとしてS3に保管されているデータ。
それらはリストア後のEBSボリュームの、
各ストレージブロックに初回アクセスが合った際に「プルダウン」されてくる。

「プルダウン」には少し時間がかかるので、
ボリューム全体まとめて一気に「プルダウン」しておきましょう、
というのがPre-Warming（初期化）のイメージでしょうか。

「初期化」と聞くと「え、全部データ消えちゃうの」と一瞬思いましたが、
そんなことはありませんでした。

>dd ユーティリティまたは fio ユーティリティを使用します。ボリュームのすべてのデータが保持されます。

あと、あまり積極的にはやらなくてもいいよ、
というニュアンスを感じました。

>実運用時は事前ウォーミングが不可能なケースもあるため、運用要件から判断して実行可能であれば取り込む程度でOK

とはいえ本番環境に適用する前には、
こういった注意事項があると頭の片隅に置いておいたほうが良さそうですね。

以上です。
Electronでローカルディレクトリとリモートディレクトリを同期する一番簡単な方法

シンプルに考えるならrsyncでということになるのだろうけど、一般向けアプリを作ろうとしているときには少し注意が必要です。そうです、パスワードの壁。

基本的に公開鍵認証などを使用して楽ちんにローカルファイルとリモートファイルを同期するためのコマンドであるため、公開鍵認証を前提に語られる。

とはいえ、ユーザーに公開鍵認証を設定した上で使ってねってことにするとなるとハードルが上がる。コードを書く人ならともかく、そうでない人の方が多いというところですね。。

そんでもってnpmのrsyncとかgrunt-rsyncとかがひっかかってくるわけなんですけど、やっぱりrsync。。

いっそのこと、rsyncをハックしてやろうかと燃えかけそうになったものの、そんな暇はなさそうなので、さらに掘り下げて探したらいいのがありました。

![スクリーンショット 2017-01-07 6.39.21.png](https://qiita-image-store.s3.amazonaws.com/0/144150/2a566f1c-5aae-834f-f76b-2659043750a0.png)

これね、いい感じです。

普通にftpでパスワード認証でディレクトリ同期ができました。
コードを見るとそのシンプルさがわかるかと思います。

## インストール
```
npm i ftpsync --save
```

## 使い方
```
var ftpSync = require('ftpsync');

var options = {
  host: 'localhost',
  user: 'testuser',
  pass: 'password',
  local: '/your/local/directory',
  remote: 'directoryname'
};

ftpSync.settings = options;
ftpSync.run(function(err, result) {

  ... your code ...

});
```
`※2017年1月7日時点：npmから飛べるGithubのアドレスにあるサンプルコードに誤字がありましたので注意してください。上記コードは修正版なのでそのまま動きます`

クリックイベントとかで発火するとワンクリックでバックアップとれるみたいな感じですかね。

めだってないけどこれはいい。（自分のつくろうとしているアプリに関しては・・）

基本的にローカルディレクトリとリモートディレクトリで簡単に同期したいかつ、ローカルでnode使う場合ということでかなり限定的な用途であることは間違いないが、「npm rsync」とかでググり疲れて途方に暮れている方がいれば良いかもしれません。

## 参照

https://www.npmjs.com/package/ftpsync

では。

## 2017/1/16 追記
sftp-sync-deploy↓の方がよさげ。Electronでつかっていたのですが、ftpsyncは再帰的処理で結構こけた。
これはけっこう安定していてよい。

***sftp-sync-deploy***
https://www.npmjs.com/package/sftp-sync-deploy
技術英語 > Let me explain. / Let go of me.

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 303 / 12833)

> Let me explain.

<hr>
関連して思い出したのは

http://eigozuki.com/html/reibun/let-go-of.shtml
> Let go of me.
> 放してくれ。

初めて聞いた時に単語の並びが面白くて覚えた。

ビバリーヒルズ青春白書でブランドンがブレンダに言っていた場面があったが、どのエピソードかは失念した (memory lapse)。
ELB暖気運転(Pre-Warming)申請についていくつかサポートに問い合わせた

#はじめに
急激なトラッフィク増が見込まれる際に、
予めELBをスケール(アウト/アップ)しておいてくれる暖気運転。

実際の申請方法等はこちらのサイト様の記述が詳しいです。

http://dev.classmethod.jp/cloud/aws/elastic-load-balancing-pre-warming/
http://qiita.com/takachan/items/80c343e03789b01adcf9

上記のページを参照していくつか疑問に思ったことがありましたので、
サポートに問い合わせを行いました。

以下に回答の要旨を記載していきます。

##補足
- 問い合わせを行ったサポートプランは「Developer」です。
- 質問および回答を丸写しで載せるわけではないので、私の解釈の仕方が誤っている可能性があります。

#Q1.暖気運転前のELBの処理性能の目安はあるか
申請する項目に、リクエスト数 （リクエスト/秒）やスループット (bit/秒)などがあるので、
「このくらいの数字だったらわざわざ暖気する必要ないよ」という目安が聞ければという意図で聞いてみました。

##A1.目安としてお答えできるものはない
- AWSでは日々設備増強/構成改善を行っており、ELB のベースラインパフォーマンスも変動する
- サポート内でも具体的な情報は共有されておらず、目安として一概に案内できない
- 実際に申請が出された後に、ELB担当部署がスケールの必要性も含めて検討している

#Q2.暖気運転申請が出されるケースの参考情報はあるか
実際に暖気運転申請が出されるケースとしては、どの程度の規模の数字になるのか。
（1時間でxxxリクエスト…）
（バックエンドのインスタンスとしてがインスタンスタイプxxが○○台…など）
参考として聞ける情報があればと思い質問しました。

##A2.参考としてお答えできるものはない
- A1.とほぼ同様
- 暖気運転の必要性も兼ねて一度申請を出してもらうことが多い」

※ここで「一旦情報をもらえれば必要性だけでも確認します」と回答いただいたのですが、
　サポートプラン「Developer」のままで確認いただけるのかは聞き損ねました。

#Q3.暖気運転により追加料金はかかるか
料金表の記載からかからないだろうと想定していましたが、
念のため聞いてみました。

- Elastic Load Balancing 時間（または 1 時間未満）あたり
- Elastic Load Balancing によって処理されるデータ 1 GB あたり

https://aws.amazon.com/jp/elasticloadbalancing/classicloadbalancer/pricing/

##A3.いいえ
かかりませんでした。

#Q4.ELBのスケールイン時にセッション切れは起こらないか
例えば、AutoScalingによってバックエンドのインスタンスがスケールインすると、
それによってセッション切れが生じるという可能性があります。
（それを防ぐためにキャッシュサーバにセッション情報を外出しにする）

同じようなことが、暖気運転でスケールアウトされたELBの
スケールイン時に起こらないか、という疑問が生じたので質問しました。

##A4.基本的に起こらない
- スケール対象のノードは一定時間維持するようにしている
- 新規セッションは受け付けないが既存のセッションに対しては一定の猶予時間を設けている
- 猶予時間は正確な値を公表していないが、数十分以上である

#Q5.暖気運転の期間はどこまで指定できるか
スケールさせておくことによる追加料金は発生しないので、
極端な話「1年間ずっと暖めておいてください」もできるのか聞いてみました。

##A5.基本的には2週間程度
- 特別な事情があっても一ヶ月程度
- それ以上必要な場合は個別にヒアリングして妥当性を判断する


#おわりに
以上、質問およびその回答でした。
情報の正確性を保証するものではありませんので、
参考として捉えていただければと思います。

マネージドであるがゆえに、
ユーザーによる設定ではなく申請という形になるのが興味深いですね。

以下、蛇足です。

##蛇足1.スケールされたことの確認
IPアドレスによってスケールを確認できるようです。
http://itpro.nikkeibp.co.jp/atcl/column/16/121200298/121200002/
>ALB、CLBともスケーリングの仕組みは公開されていないが、各テストケース実施前と実施後にnslookupコマンドを実行し、ALBおよびCLBの状態を監視。IPアドレスが変更された場合はスケールアップ、IPアドレスが増えた場合はスケールアウトが発生したとみなす。

##蛇足2.ELBによって自動的にENIもできる
他のENIと同じように、AWSマネジメントコンソールから確認できます。
ちょっと特殊なのは下記のあたり。
- アタッチメントの所有者：amazon-elb
- 説明：ELB ＜ELB名＞

##蛇足3.暖気運転？暖機運転？
恐らく暖気運転が正。下記は誤字か。

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/155963/ec0046ca-b8c0-5e00-e884-dfc4d44a47bb.jpeg)

###追記
コメントにてご指摘いただき、「暖機」のほうが日本語として正しそうです！


以上です。
Cloud9でPython3のDjango環境を5分でつくる

### 経緯 ###
Cloud9でTemplateにDjangoを選択し、よし新しいDjangoをさっさと作るっぺー、と勢い付いても、
Cloud9ではデフォルトでPython2.7になっているため、何これズコー:scream:、とやる気が削がれてしまいます。
そんな訳で、**Python3**のDjangoプロジェクト開発環境を5分で準備する手順を整理します。

### 最初 ###
* Workspace name : お好みで（たとえば、piyo）
* Template : Django
* ユーザ名 ： 説明の便宜上、ここではpikotaroとします。あなたのユーザ名で読み替えてください。

### Cloud9におけるPythonバージョンの変更 ###
メニュー項目のCloud9から遷移し、Python2から3へ変更します
Cloud9 > Preferences > Python Version: Python3

### Python3へのシンボリックリンク張り ###
```bash
$ sudo mv /usr/bin/python /usr/bin/python2
$ sudo ln -s /usr/bin/python3 /usr/bin/python
$ python --version
python 3.4.3 
```

### Djangoのインストール ###
pip3でインストールをやり直します。
やり直さないとエラーが起きます。

```bash
$ sudo pip3 install django
```

### ALLOWED_HOSTSの設定 ###
Cloud9で**自動的に設定されるホスト名**を、settings.pyのALLOWED_HOSTSにセットする必要が有ります。
セットしなければエラーが起きます。
**自動的に設定されるホスト名**は、Cloud9の仕様で、上記**最初**のワークスペース名とユーザ名に基づきます。

```py3:settings.py
ALLOWED_HOSTS = ['piyo-pikotaro.c9users.io']
```

### 準備完了 ###
以上より、好きなようにPythonコードをガシガシ書いて、
通常と同じくメニュー項目の:arrow_forward:Run Projectをクリック、またはコマンドラインから

```bash
$ python manage.py runserver $IP:$PORT
```

を叩いて、
プロジェクトを実行する事が可能です。

以上
Djangoでモジュールを複数ファイルで構成する

タイトルの用語とかが正しいのかはたいへん疑問。。。。。。

自分向けの備忘録

# 目的
Djangoを利用したプログラムを作成する際に、
アプリケーションの規模が大きくなった際に都合が良いように、
ビューやモデルなどのモジュール?を複数ファイルに分割するための手順を整理する。
# 前提
環境は以下の通り

```
Ubuntu 16.04
python 3.5.2
django 1.10.5
```

# 手順

ここではmodels.pyを複数ファイルに分割してみる。

# modelを複数ファイルに分割

```bash:初期状態
__init__.py
admin.py
apps.py
migrations
models.py
tests.py
views.py
```

ここではmodels.pyを1ファイル=1モデルクラスとできるように修正する。

```bash:modelsディレクトリと__init__.pyファイルを準備
__init__.py
admin.py
apps.py
migrations
models
    __init__.py
    task.py
tests.py
views.py
```

上のコードのようにmodels.pyを削除しmodelsディレクトリを準備し、
その中に＿＿init.py＿＿ファイルとモデルクラスを記述したファイル
(ここでは、task.py)を作成する。

```python:task.py
from django.db import models


class Task(models.Model):
    """
    Task to do.
    """
    name = models.CharField(max_length=30)
    startTime = models.DateTimeField()
    endTime = models.DateTimeField()
    memo = models.CharField(max。_length=200)
```


```python:__init__pyファイル
from webui.models.task import Task # 上で作成したクラスをインポートする
```

# viewを複数ファイルに分割

ファイルの分割方法は同じ。
1. views.pyを削除
2. viewsディレクトリを作成
3. viewsディレクトリ配下に適当なファイルを作成
3. views/＿＿init＿＿.pyファイルを作成
4. ＿＿init＿＿.pyファイルで3.で作ったファイル内のクラス、メソッドをインポート
　  

```bash:ファイル分割
__init__.py
admin.py
apps.py
migrations
models
    __init__.py
    task.py
tests.py
views
    __init__.py
    task_view.py
```

## urls.pyへの記述
viewモジュールについてはurls.pyへの記述が必要となる

### メソッドベースでビューを定義している場合
[viewsを複数ファイルに分ける](https://www58.atwiki.jp/conn1/sp/pages/35.html)
のようにしている場合は以下の通り

```python:urls.py(メソッドベース)
urlpatterns = [
    ...,
    url(r'^適当な正規表現', アプリケーション名.views.ファイル名.メソッド名)
]
```

from ... importで指定する方法も本項の冒頭に上げたリンク先では
記述しているけれども、同じメソッド名が指定できなくなるので上のコード例を
用いたほうが**多分良い**と思う。

### クラスベースでビューを定義している場合
[Django の views.py をクラスにする](http://blog.naru.se/2012/12/django-viewspy.html?m=1) にあるようにクラス単位の場合は
以下のようになる。

```python:urls.py(クラスベース)
urlpatterns = [
    ...
    url(r'^/URLの正規表現/$', アプリケーション名.views.viewのクラス名.as_view()),
    ...
]
```
こちらもメソッドベースの場合と同様にfrom ... importを宣言することで
パッケージ名の記述は不要になるはず。


# 参考資料

[Django の views.py をクラスにする](http://blog.naru.se/2012/12/django-viewspy.html?m=1) 
[viewsを複数ファイルに分ける](https://www58.atwiki.jp/conn1/sp/pages/35.html)
centos7.2のRaspberryPi3でyumができない

## こんな症状
`yum update`すると以下のエラーが出てしまいます。

```
# yum update
読み込んだプラグイン:fastestmirror
base                            | 3.6 kB  00:00:00     
http://mirror.centos.org/altarch/7/kernel/armhfp/kernel-%24kvariant/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
To address this issue please refer to the below knowledge base article 

https://access.redhat.com/articles/1320623

If above article doesn't help to resolve this issue please create a bug on https://bugs.centos.org/



 One of the configured repositories failed (CentOS Kernels for armhfp),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo=centos-kernel ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable centos-kernel
        or
            subscription-manager repos --disable=centos-kernel

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=centos-kernel.skip_if_unavailable=true

failure: repodata/repomd.xml from centos-kernel: [Errno 256] No more mirrors to try.
http://mirror.centos.org/altarch/7/kernel/armhfp/kernel-$kvariant/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
```

## 原因
404を出している `http://mirror.centos.org/altarch/7/kernel/armhfp/kernel-%24kvariant/repodata/repomd.xml` のURLを見てみると`$kvariant`がエスケープされてそのまま入っているようです。
この原因はわからなかったのですが、取得先のURL（http://mirror.centos.org/altarch/7/kernel/armhfp/ ）を見てみると`kernel-rpi2/`というディレクトリが用意されていました。
自分の端末はRaspBerryPi3ですが、ここを参照させることにしましょう。

## 解決方法
`vi /etc/yum.repos.d/CentOS-armhfp-kernel.repo`

```
[centos-kernel]
name=CentOS Kernels for armhfp
baseurl=http://mirror.centos.org/altarch/7/kernel/$basearch/kernel-$kvariant
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
       file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-AltArch-Arm32
```

この
`baseurl=http://mirror.centos.org/altarch/7/kernel/$basearch/kernel-$kvariant`
を
`baseurl=http://mirror.centos.org/altarch/7/kernel/$basearch/kernel-rpi2`
に置き換えてました。
再三ですが、RaspBerryPi3ですが、`rpi3`というディレクトリはないので、`rpi2`を参照しております。

変更できたら、
`yum clean all` してから
`yum update`

で問題なくupdateできるかと思います！
SoundCloudでSorry! Something went wrongと言われたとき

SSL証明書関連の不具合でSoundCloud等一部のサイトが正常に表示されない問題で詰んだので解決策をメモしておきます。

## 現象
私は、SoundCloudとBOOTHでページが正常に表示されない問題が発生しました。
具体的には、SoundCloudへアクセスすると、以下のようなメッセージが表示されてページが正常に表示されなくなってしまいました。
```
Sorry! Something went wrong
Is your network connection unstable or browser outdated?
```
![image.png.jpeg](https://qiita-image-store.s3.amazonaws.com/0/61960/76b4ffde-b827-8141-aa1b-8b222d7bcb8c.jpeg)
> 画像参照元：http://s18.postimg.org/o7kjt7a2h/image.png?noredir=1

## 解決策
この事象は、CRL（Certificate Revocation List）、およびOCSP（Online Certificate Status Protocol）のキャッシュをクリアすることによって解決します。

> Online Certificate Status Protocol（OCSP）は、X.509公開鍵証明書の失効状態を取得するための通信プロトコルである。 RFC 6960 で規定されており、インターネット標準トラック上にある。
> 引用元：[Online Certificate Status Protocol（OCSP） - Wikipedia](https://ja.wikipedia.org/wiki/Online_Certificate_Status_Protocol)

> CRLとは、失効したデジタル証明書のリスト。認証局（CA）や検証局（VA）が管理する。
> 引用元：[CRLとは｜証明書失効リスト｜Certificate Revocation List](http://e-words.jp/w/CRL.html)

### Windowsの場合

1. スタートメニューから「ファイル名を指定して実行」を起動（Windowsキー+Rでも代用可能）

2. cmdと入力しEnter

3. 以下のコマンドを入力しEnterキーで実行

`certutil -urlcache * delete`

### MacOSX(10.11以下)

__以下コマンド実行後必ずシステムを再起動してください__

以下のコマンドを実行します。

`sudo rm /var/db/crls/*cache.db`

このコマンドにより、以下のファイルが削除されます。

- /var/db/crls/crlcache.db

- /var/db/crls/ocspcache.db

### MacOSX(10.12 Sierra)

以下のコマンドを実行

`sqlite3 ~/Library/Keychains/*/ocspcache.sqlite3 'DELETE FROM ocsp;'`

## 参考サイト
1. https://soundcloudcommunity.com/soundcloud-on-your-computer-230066/soundcloud-on-safari-not-working-help-7342594

2. http://status.soundcloud.com/post/151755800920/vendor-downtime-causing-certificate-messages

3. https://support.globalsign.com/customer/portal/articles/1353318