OmniAICreator/Qiita-1.07M huggingface dataset:
MindMup > 1 January 2017でサービス停止 / MindMup 2への移行が必要

MindMup を使っていたら以下のメッセージが表示された。

> You are using an old version of MindMup which will be removed on 1 January 2017. Upgrade to MindMup 2 to keep using the service.

MindMup 2を使うことになる。

v2.0用ファイル変換後にMyMindなどでのファイルオープンなどが気になる。

v2.0用に変換したファイルはMyMindでは開くことができなくなった。
File-Download asでMindMup(v1.0)ファイルに変換はできるが、使いやすさは悪くなる。
Goのpathとfilepathでは動作が異なる　Windowsでも正しくパスを扱う

goにはパスを操作するパッケージが、標準で `path` と `path/filepath` の2つ有ります。

- https://golang.org/pkg/path/
    - Package path implements utility routines for manipulating slash-separated paths.
    - スラッシュをセパレータとして常に使用
- https://golang.org/pkg/path/filepath/
    - Package filepath implements utility routines for manipulating filename paths in a way compatible with the target operating system-defined file paths.
    - システムのセパレータを使用

`Base,Dir,Join,Split` 等が両方に用意されていますが、ローカルファイルを操作する場合等は `filepath` の方を使うのがベターです。

## サンプルコード

```go
package main

import (
	"fmt"
	"path"
	"path/filepath"
)

func main() {
	fmt.Println("===== Windows Style Path =====")
	winInput := `C:\Windows\System32\drivers\etc\hosts`
	fmt.Println("input: ", winInput)
	fmt.Println("path.Dir: ", path.Dir(winInput))
	fmt.Println("path.Base: ", path.Base(winInput))
	fmt.Println("filepath.Dir: ", filepath.Dir(winInput))
	fmt.Println("filepath.Base: ", filepath.Base(winInput))

	fmt.Println("===== UNIX Style Path =====")
	unixInput := "/etc/hosts"
	fmt.Println("input: ", unixInput)
	fmt.Println("path.Dir: ", path.Dir(unixInput))
	fmt.Println("path.Base: ", path.Base(unixInput))
	fmt.Println("filepath.Dir: ", filepath.Dir(unixInput))
	fmt.Println("filepath.Base: ", filepath.Base(unixInput))
}
```

https://play.golang.org/p/17MH9zqrub

## Linuxでの実行結果

```
===== Windows Style Path =====
input:  C:\Windows\System32\drivers\etc\hosts
path.Dir:  .
path.Base:  C:\Windows\System32\drivers\etc\hosts
filepath.Dir:  .
filepath.Base:  C:\Windows\System32\drivers\etc\hosts
===== UNIX Style Path =====
input:  /etc/hosts
path.Dir:  /etc
path.Base:  hosts
filepath.Dir:  /etc
filepath.Base:  hosts
```

Linuxでは `path` `filepath` 共に正常な値を取得できます。

## Windowsでの実行結果

```
===== Windows Style Path =====
input:  C:\Windows\System32\drivers\etc\hosts
path.Dir:  .
path.Base:  C:\Windows\System32\drivers\etc\hosts
filepath.Dir:  C:\Windows\System32\drivers\etc
filepath.Base:  hosts
===== UNIX Style Path =====
input:  /etc/hosts
path.Dir:  /etc
path.Base:  hosts
filepath.Dir:  \etc
filepath.Base:  hosts
```

Windowsでは、 `filepath` が意図した値を取得できています。
UI > Mindmup > UIの変更 > googleドライブのファイルを開く

```txt:動作環境
mindmup.com
```

これまではwww.mindmup.comに接続して、すぐに自分が作成したgoogle drive上のmupファイルを開くことができていた。

今日見たところ、www.mindmup.comに接続すると各種説明などのページが表示されるようになった。google driveのファイルを開く手順が煩雑になった。

以下が一番早い。

1. googleからgoogle driveを開く
2. 検索ボックスにてキーワードで検索
3. ファイル上で右クリックして、「アプリで開く」でMindMup もしくは MindMup 2.0を選択する

新規作成する場合は上記で開いた後に「File」-「New」など実行する。

MindMup 2.0は処理が重いので、こちらをいつメインにするかは悩みどころ。

MindMup 2.0になった大きな違いは「View」-「Map Theme」にて表示方法が増えたこと。
それ以外の機能は従来のものとほとんど変わらない気がする。
Macでターミナルからの引数付きの起動ではまったこと

#Macのターミナルからの引数付きの起動ではまったこと

MacでもWindowsとかのアプリみたいに引数指定起動で動作を変えたりしたいなぁと

で、

```
$ open -a hoge.app aaa.txt bbb.txt
```

とかやっても、アプリの引数に渡ってこなかった。

##正解は

```
$ hoge.app/Contents/MacOS/hoge aaa.txt bbb.txt
```

だった！

*（それは残像だ！本体はそっちか）*

##ところで

これって、他のアプリから引数付きで呼び出したい場合もContents以下のものを叩く感じが妥当なのだろうか？
（それともopenみたいな何か別な手段があるのか）

まぁ、Unityのバッチビルドもそうみたいだから正解かな
https://docs.unity3d.com/ja/current/Manual/CommandLineArguments.html
【Xcode】Storyboardを複数に分割して管理する方法

少し複雑なアプリを作ろうとするとビューが増えて一つのStoryboadだと見にくくなります。
そこでStoryboard Referenceを使ってStoryboardを分割して管理する方法を解説していきます。

# デモ
![story4.gif](https://qiita-image-store.s3.amazonaws.com/0/135478/36c1f4ab-08ba-98f0-c495-f19ede3d7539.gif)


# 手順

1. Tabbed Applicationで新規プロジェクトを作成し、First ViewとSecond Viewを削除しておきます。
![スクリーンショット 2016-10-23 16.31.32.png](https://qiita-image-store.s3.amazonaws.com/0/135478/4235f228-c9ac-0a50-9eac-82ef4dc9be9c.png)
<br>

2. タブ数分のStoryboardファイルを作成します。⌘+Nでファイルの新規作成画面に移動します。
今回はタブを3つにするので3つのStoryboardファイルを作成しました。(A.storyboard、B.storyboard、C.storyboard)
![a.png](https://qiita-image-store.s3.amazonaws.com/0/135478/a6f4175c-af50-6c3e-8c98-3bb04dc6c5e9.png)
<br>

3. Storyboard Referenceをタブ数分(3つ)設置します。
![b.png](https://qiita-image-store.s3.amazonaws.com/0/135478/1daebb18-e032-0b3e-df47-d31c76604e8b.png)
<br>

4. Storyboard ReferenceにStoryboardを設定していきます。3つとも同じように設定します。
![c.png](https://qiita-image-store.s3.amazonaws.com/0/135478/d69f143f-42ff-c6ff-8fae-186e9c2f4ca1.png)
<br>

5. control+ドラッグでStoryboard ReferenceにSegueを接続。
![d.png](https://qiita-image-store.s3.amazonaws.com/0/135478/1f220149-fc43-d4ee-67f4-0270f908b927.png)
3つとも同じように設定します。
![スクリーンショット 2016-10-23 17.01.35.png](https://qiita-image-store.s3.amazonaws.com/0/135478/8ff6d33c-07f3-ae58-a4fa-f929cfe9aeba.png)
<br>

6. 分割されたStoryboardの設定
View Controllerを設置して、「Is Initial View Controller」にチェックを入れます。
Tab Bar Controllerで接続されるのでTab Bar Itemを設置。
ついでにLabelでStoryboardのIDも入れて置きました。
これを3つとも同様に設定し、完了です。
![e.png](https://qiita-image-store.s3.amazonaws.com/0/135478/ba5f342c-7ea0-9b9d-ba6a-260d08534bd6.png)

# 起動時に表示されるタブを変更する
デフォルトでは一番左のタブが起動時に表示されるようになっています。
変更するにはAppDelegate.swiftにselectedIndexで指定します。

```AppDelegate.swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        if let initialTab = self.window!.rootViewController as? UITabBarController  {
            
            // 0が一番左のタブ
            initialTab.selectedIndex = 2 // 左から3つ目のタブを指定
        }
        return true
    }

    func applicationWillResignActive(_ application: UIApplication) {
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
    }

    func applicationWillTerminate(_ application: UIApplication) {
    }
}

```

# 起動時にロードするStoryboardを変更する
Tab Bar Controllerを使わずにStoryboardを分割した場合、起動時にロードするStoryboardを任意のStoryboardに指定したい場合があると思います。
その場合は、プロジェクト→TARGETS→General→Main Interfaceから指定できます。
![g.png](https://qiita-image-store.s3.amazonaws.com/0/135478/3ec67705-018a-4aab-638c-b1d46c9747a9.png)

# 関連記事
・[【Swift3】コードで画面遷移を行う方法](http://qiita.com/The_Shimon/items/6c3d6bcd6bfffbfd970d)
silverlight と Unity3D の連携

#シリーズ目次

- silverlight と Unity3D の連携
- [IISサーバーでUnity Web Playerを公開するとき](http://qiita.com/sasaco/items/85e077230e9b7099c249)
- [Unity Web Player をブラウザの画面に合わせて起動する](http://qiita.com/sasaco/private/c9fbcf1c81372918455e)


# silverlight と unity の親子関係

これを使う
 [HtmlHost for Silverlight](http://c1.grapecity.com/SuperProducts/HtmlHostSilverlight/)

![rink.png](https://qiita-image-store.s3.amazonaws.com/0/142847/9c7c1bfc-ba10-3239-abe1-083b7d96a0ed.png)


# silverlight のイベントをunity に通知する方法

①. silverlight のイベントを 親Htmlのjabascript に通知する
[HTMLのボタンからSilverlightを操作するには？](http://blog.livedoor.jp/silverlighttips/archives/51429483.html)

②. iframeの親から子の操作をする
[iframeの親から子、子から親の操作をする](http://cly7796.net/wp/javascript/operation-of-iframe/)

③. 親Htmlのjabascript から unity にイベントを通知する
[WEBページとUnity Web Playerの連携をJavascriptで行う【ブラウザ連携！】](http://www.absolute-keitarou.net/blog/?p=834#Unityjavascript)


# unity のイベントをsilverlight に通知する方法

④. unity のイベントを 親Htmlのjabascript に通知する
[Unity Web Player とブラウザーの通信](https://docs.unity3d.com/ja/current/Manual/UnityWebPlayerandbrowsercommunication.html)

⑤. iframeの子から親の操作をする
[[JavaScript]iframeの親の関数をコールする](http://temping-amagramer.blogspot.jp/2010/08/javascriptiframe.html)

⑥. 親Htmlのjabascript から silverlight にイベントを通知する
[HTMLのボタンからSilverlightを操作するには？](http://blog.livedoor.jp/silverlighttips/archives/51429483.html)
ネットから自分の公開鍵を取得してauthorized_keysに追加する

巷に溢れている例のコマンドの改良版。

HTTP、HTTPS

```bash
wget https://github.com/nishimura.keys -O - | awk '{gsub(/^$/,"nishimura@github.com",$3);print}' >> authorized_keys
```


SSH

```bash
ssh example.com 'cat .ssh/id_rsa.pub' | awk '{gsub(/^$/,"nishimura@example.com",$3);print}' >> authorized_keys
```

awkでコメントが無ければ追加する。あればそのまま。
githubはコメントが無いけれど他のサーバーならあるかもしれないので判別する。

`awk`や`perl`を使わずに`grep`や`cat`で出来ないものか…。
./stack.sh: line 488: generate-subunit: command not found の解決方法

```
./stack.sh: line 488: generate-subunit: command not found
```

このメッセージの解消方法

## 原因

`generate-subunit` が入っていない。

## 対策

`generate-subunit` を入れる。

```
# pipを入れる
curl https://bootstrap.pypa.io/get-pip.py | python

# os-testr（generate-subunitを内包してる）
pip install -U os-testr
```

[openstack/os\-testr: OpenStack tooling for interacting with testr](https://github.com/openstack/os-testr)

終わり
font-familyに游明朝を使用してはいけない理由

「[Chromeでも読みやすい游ゴシックを指定する方法 ](http://qiita.com/RinoTsuka/items/1e7b3ca1325e704bbc41)」にご興味を示していただいた方、お待たせしました。
游明朝を基準とした`font-family`を指定するにはどうしたら良いかの記事になります。
Macでは問題ないのでWindowsについての内容になります。

## 先に結論
ゴシック体のようにバグを回避しつつも適用させる。
そんなこと明朝体では出来ません。

游明朝で問題になるのは`font-weight: 500;`なので、コレを絶対に使用しないというコーディングルールがあれば、通常の記述で問題無いでしょう。（フレームワーク等で指定されているものは直しましょう）
よって游明朝を指定する場合は下記のようになります。

```css
.yu-mincho{
  font-family: "Yu Mincho", "YuMincho";
}
```

ただし、IEのバグが回避できないので、個人的にはどうしても明朝体を使用したい場合は素直にWebフォントか画像を使うのがベストだと思います。

## 游明朝がダメな理由
游ゴシックとは違い、Chrome、Operaの游明朝`font-weight`100～300は特筆するほど細くはありません。そもそも明朝体自体細いので気にならないのでしょう。ただ、たしかに他のブラウザよりも文字が細いです。

細い理由は游ゴシックと同様、`Regular`が適用されず`Light`をブラウザが無理やり太くさせているからです。

細さが気にならないならそのまま`font-family: "Yu Mincho"`でも良い。
ですが、游明朝の問題点はそこではありません。

游明朝はChrome、Operaで見ると`font-weight: 500;`が`Bold`になっています。
Firefox、Internet Explorerでは`normal`で表示されます。

## weight500をnormalにする
```css
@font-face {
  font-family: "Yu Mincho";
  src: local("Yu Mincho Regular");
  font-weight: 500;
}
```

Chrome、Operaの`font-weight: 500;`がダメならゴシック体のときのように、特定の太さだけ指定して上げれば良い。
...ダメでした。
上記のコードを書いても一切の変化が無く`Bold`のままです。

## weight500をboldにする
Chrome、Operaの`font-weight: 500;`が`Bold`ならば、Firefox、Internet Explorerを`Bold`にすれば良いじゃない！

```css
@font-face {
  font-family: "Yu Mincho";
  src: local("Yu Mincho Demibold");
  font-weight: 500;
}
```

※ 游明朝の`bold`の書体名は`Yu Mincho Demibold`です。

これでなんと！全ブラウザの`font-weight`600～900が極太になるではありませんか！
どうやら`font-weight: 500;`を基準として、ブラウザが無理やり太くしたものが600～900に適用されてしまいます。

この指定の仕方をすると`font-weight: bold;`が極太になるので游明朝が使い物にならなくなります。

## 下に隙間が空くIEのバグ
Internet Explorerで游ゴシックと同様に、文字の下に大きく隙間が空いてしまうバグがあります。
游ゴシックではIEだけ「メイリオ」を適用することで回避していたのですが、Windowsで游明朝に変わる明朝体は「MS P明朝」になります。
見難い「MS P明朝」を適用するぐらいならゴシック体の「メイリオ」を適用するでしょう。
そのため、明朝体の代替フォントが無いため、IEハックをしても代わりが「メイリオ」になってしまうのです。

## 游明朝を基準とした明朝体の指定方法
ありません。

どうしても游明朝が使いたい場合は

```css
.yu-mincho{
  font-family: "Yu Mincho", "YuMincho", serif;
}
```

上記のように普通に指定します。
ただし、游明朝が指定されているものには`font-weight: 500;`は使ってはいけません。
`font-weight`の`normal`は400、`bold`は700なので`font-weight: 500;`という記述がcssファイル上に存在しなければ問題ないでしょう。
自分に関係ないSSIDを隠す（見ないようにする）

![!27abbcc0-7a09-47d2-8031-934a1c48f85c.png](https://qiita-image-store.s3.amazonaws.com/0/67318/62f885eb-07d3-bb04-2d73-78b9066c8c7a.png)
SSIDをステルスにするのではなく、飛んでいる無線のSSIDをフィルタして見ないようにする方法。

下の例では「応仁のLAN」という名前のSSIDをフィルタしてリスト表示しないようにします。

```dos:コマンドプロンプト(管理者)
DOS>netsh wlan add filter permission=block ssid="応仁のLAN" networktype=infrastructure
フィルターをシステムに追加しました。
```
[ブックマーク]ZSHでPATH変数内の重複を取り除く

どんどん追加すると長くなって見難いので、自前でチェックするかなんとか考えていたが、簡単にできるのはありがたい。

```zsh
typeset -U path
```

http://d.hatena.ne.jp/yascentur/20111111/1321015289
Gzip圧縮したデータをオンメモリで取得する


[gzip.GzipFile] を使うとPythonコードでGzip圧縮ができますが、普通にやるとファイルに出力してしまいます。
[StringIO.StringIO] (file-like object) を使って、出力したGzip圧縮済みデータを回収します。

> ↓は Mac OS 10.10.1、Python2.7.11、utf-8 でやってます。
> エンコーディング等異なるとちょっと結果も変わります。

## 圧縮して取得する

```pycon
>>> from gzip import GzipFile
>>> from StringIO import StringIO

>>> io = StringIO()

>>> with GzipFile(fileobj=io, mode='wb') as f:
...     f.write('データ１')
...     f.write('データ２')
...     f.write('データ３')

>>> io.getvalue()
'\x1f\x8b\x08\x00JM\rX\x02\xff{\xdc\xdc\xfe\xb8y\xcf\xe3\xa6\xfd\xef\xf7L|\x8c`OBbO\x06\x00\xb9M\x7f\xca$\x00\x00\x00'
```

## (おまけ) 解凍してみる

```pycon
>>> io = StringIO()
>>> io.write('\x1f\x8b\x08\x00JM\rX\x02\xff{\xdc\xdc\xfe\xb8y\xcf\xe3\xa6\xfd\xef\xf7L|\x8c`OBbO\x06\x00\xb9M\x7f\xca$\x00\x00\x00')
>>> io.seek(0)

>>> with GzipFile(fileobj=io, mode='rb') as f:
...     print f.read()

データ１データ２データ３
```


[gzip.GzipFile]:http://docs.python.jp/2/library/gzip.html
[StringIO.StringIO]:http://docs.python.jp/2/library/stringio.html
メソッド名の最後に！のあるなしについて

rubyのメソッド名の最後に!が付いているのを、たまに見かけるが、これのあるなしがどのように違うのか？
結論からいうと、!は他のメソッドの英語と同じメソッド名の一部であるので、!がメソッド名の最後にあるなしに関わらず、rubyは同じように解釈をする。

ただ、組み込み関数では、レシーバが更新される場合(破壊的)とそうでない場合(非破壊的)を、!のあるなしで区別しているように感じました。
ruby on rails の負荷対策

ruby on rails で実装していて基本的だが重要な負荷対策が２つあったので、紹介したい。
eager-loadingと、indexの追加です。

**eager-loading**

eager-loadingは、N+1問題を解決するためにあります。
N+1問題とは、データをDBから取り出そうとするとき、
sqlの処理がN+1回走ってしまう問題です。これを解決するのが、eager-loadingです。

eager-loadingは、事前にデータをロードするというもので、このN+1問題を解決してくれます。

具体的には、userとbookモデルが1対多の関係になっていた場合、以下のようになります。

```
**book.user.nameで毎回、userを抽出するsqlが発行されてしまう**

@books = Book.all
@books.each do |book|
  puts book.user.name 
end
```


```
**eager-loadingで解決できる**

@books = Book.all.includes(:user)
@books.each do |book|
  puts book.user.name 
end
```


includes(:user)によって事前にローディングして解決できます。

**indexの追加**

データベースのテーブルからデータを抽出する際、通常は上から順番にデータを見ていき、該当するデータを抽出します。データ量が多いと時間がかかるので、検索しやすいようにしてくれるのがindexになります。

indexの貼り方は以下になります。

```
**indexの貼り方(migrationファイルに記述)**

class AddIndexToテーブル名 < ActiveRecord::Migration
  def change
    add_index :テーブル名, カラム名
  end
end
```
[Python]PandasのSeriesの使い方


### 前準備

```
import pandas as pd
from pandas import Series
```



#### Seriesとは

```
obj = Series([3,9,12])
obj

0     3
1     9
2    12
dtype: int64
```

SeriesはNumpyの配列に似ていますが、indexを使ってデータに名前をつけることが出来ます。

##### 値一覧取得

```
obj.values
array([ 3,  9, 12])
```

##### key一覧取得

```
obj.index
RangeIndex(start=0, stop=3, step=1)
```

##### keyの更新

```
ww2_cas = Series([8700000, 4300000, 3000000, 2100000, 400000], index=['USSR', 'Germany', 'China', 'Japan', 'USA'])
ww2_cas

USSR       8700000
Germany    4300000
China      3000000
Japan      2100000
USA         400000
dtype: int64
```

個別のデータにインデックスを使ってアクセスもできます

```
ww2_cas['USA']
400000

ww2_cas>4000000
USSR        True
Germany     True
China      False
Japan      False
USA        False
dtype: bool

ww2_cas[ww2_cas>4000000]
USSR       8700000
Germany    4300000
dtype: int64

'USSR' in ww2_cas
True
```

##### Seriesから辞書型へ

```
ww2_dic = ww2_cas.to_dict()
ww2_dic
{'China': 3000000,
 'Germany': 4300000,
 'Japan': 2100000,
 'USA': 400000,
 'USSR': 8700000}
```

##### 辞書型からSeriesへ

```
ww2_Series = Series(ww2_dic)
ww2_Series
China      3000000
Germany    4300000
Japan      2100000
USA         400000
USSR       8700000
dtype: int64
In [ ]:

```

##### nullがあるかどうか

```
countries = ['China', 'Germony', 'Japan', 'USA', 'USSR', 'Argentina']
obj2 = Series(ww2_dic, index=countries)
obj2

China        3000000.0
Germony            NaN
Japan        2100000.0
USA           400000.0
USSR         8700000.0
Argentina          NaN
dtype: float64

pd.isnull(obj2)

China        False
Germony       True
Japan        False
USA          False
USSR         False
Argentina     True
dtype: bool
```

##### nullではないもの

```
pd.notnull(obj2)

China         True
Germony      False
Japan         True
USA           True
USSR          True
Argentina    False
dtype: bool
```


#### Seriesの名前
Seriesには全体に名前をつけることができる

```
obj2.name = '第二次世界大戦の死傷者'
obj2

China        3000000.0
Germony            NaN
Japan        2100000.0
USA           400000.0
USSR         8700000.0
Argentina          NaN
Name: 第二次世界大戦の死傷者, dtype: float64
```
QMC > link > improvement for the GPU renderer > the licensing of QMC sampling from NVIDIA

TensorFlowでQMC(Quasi Monte Carlo)を使っている例を探していて、別のQMC利用を見つけた。

https://www.fxguide.com/quicktakes/nvidia-gpu-tech-conference-2015-day-1-report/

> A lot of improvement for the GPU renderer is the licensing of QMC sampling from NVIDIA. The QMC (Quasi-Monte Carlo) method uses low-discrepancy sequences instead of pseudorandom number generators. In layman terms this means the distribution seems more random - while not being - but avoids the clumping that is natural in random or pseduorandom sequences. The more evenly random the samples, the less samples for the same perceived anti-alising or noise for example. Chaos licensed this from NVIDIA (which uses it in Mental Ray/iRay). This is important for Chaos as the GPU renderer uses random sampling much more than the CPU production renderer, and thus uses the QMC to produce - in some cases - a better noise floor than the main production renderer.

サンプリングにQMCを使っている。
Mersenne Twisterを含めた従来のrandom numberと比べて`avoids the clumping`とある。

積分の収束が早くなったり、MNISTの学習が早まるなどはこの`avoids the clumping`というのが効いているのだろう。

なお、Neural Networkで検索していて別のQMC(Quantum Monte Calro)も見つかった。こちらは原理は未消化。
https://arxiv.org/abs/cond-mat/9807008
link > 陣屋コネクト > 旅館のシステムを経営者が実装し活用

[クロスロード](http://www.tv-tokyo.co.jp/crossroad/)という番組で紹介されていたシステム。

陣屋コネクト
http://www.jinya-connect.com/databox/data.php/about_ja/code

- スタッフが各自使いやすい端末を所持
   - スマホ、タブレット、PC
- 駐車場に入ってきた車のナンバープレートから顧客情報を取得
   - 上記の端末に連絡がいく
   - スタッフが所定の位置に待機して効率良く対応
- スタッフが各自仕入れた情報を入力し情報共有
- 過去に滞在したお客の情報をデータベースとして活用

などなど。
上記システムを入れることで、不要な作業などを減らし効率化している。

興味をひかれたのは、経営者自体が元エンジニア(本田?)でその人自身がシステムを構築している点。

使用者自らが継続開発するシステムというのは、要求が直接分かり、それを使いたいように実装するので、かなり良いシステムができるのではと思う。

もちろん使用するスタッフの意見も取り入れて開発はしているだろう。
端末操作に不慣れな人でも分かりやすいように表示するなどの工夫が紹介されていた。

salesforceプラットフォームというものの上にシステムを構築しているようだ。
技術英語 > complicated code is a sign that you don't understand your program well enough to make it simple.

@ Code Complete (No. 14852 / 36077)

> complicated code is a sign that you don't understand your program well enough to make it simple.

@ 社員をサーフィンへ行かせよう by Yvon Chouinard (シュイナード) 

> 必要性から生じたデザインは、たいてい必要最小限（ミニマリズム）だ。

...

> 複雑さは、機能面の必要性が整理されていないことの表れであることが多い。

@ C++のためのAPIデザイン by マーティン・レディら

> `3. 機能を追加する必要が出た時、シンプルなAPIに追加するほうが、複雑なAPIに追加するよりはるかに簡単である

APIに余分な一般性を持たせたくなる時の、その衝動を抑えるべき理由の1つ。
port 4786 (Cisco Smart Install用) を閉じる

* port 4786は[Cisco Smart Install](https://www.cisco.com/en/US/docs/switches/lan/smart_install/release_12.2_53_se/configuration/guide/commands.pdf)で使われる。
    * 初期設定でポート開放されている。

## 現象

以下のようなログが`show log`で出力された。

```rb
Oct 21 20:12:46 MDT: %SM-4-BADEVENT: Event 'ibcs_e_download_msg_req_recv' is invalid for the current state 'ibcs_s_accept': smi_ibc_serv SMI IBCS sm
-Traceback= XXXXXXX 1C2E850 1C1AC2C 1C2EDF4 1C2F5EC 1C2F7B8 1C1C40C 1C1C5BC 1C1C74C 1C1CA60 1C1B0B4 1B9774C 1B8E1D8
Oct 21 20:12:46 MDT: %SM-4-BADEVENT: Event 'ibcs_e_download_msg_resp_send' is invalid for the current state 'ibcs_s_accept': smi_ibc_serv SMI IBCS sm
-Traceback= XXXXXXX 1C2E878 1C1AD58 1C2EDF4 1C2F5EC 1C2F7B8 1C1C40C 1C1C5BC 1C1C74C 1C1CA60 1C1B0B4 1B9774C 1B8E1D8
Oct 21 20:12:46 MDT: VSTACK_ERR: smi_ibc_dl_handle_events : invalid message
```

1. `ibcs_e_download_msg_req_recv`で検索すると以下該当あり。
1. [InfoSec Handlers Diary Blog - Request for Packets TCP 4786 - CVE-2016-6385](https://isc.sans.edu/diary/21625)
1. `CVE-2016-6385`で検索すると以下ページがヒット。
1. [JVNDB-2016-005153 - JVN iPedia - 脆弱性対策情報データベース](http://jvndb.jvn.jp/ja/contents/2016/JVNDB-2016-005153.html)

## 対処

* [Cisco IOS and IOS XE Software Smart Install Memory Leak Vulnerability](https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20160928-smi#fixed)

```
(config)# no vstack
```

* port 4786が閉じたことを確認。

```diff:
#show vstack config
- Role: Client (SmartInstall enabled)
+ Role: Client (SmartInstall disabled)
  Vstack Director IP address: 0.0.0.0

  *** Following configurations will be effective only on director ***
  Vstack default management vlan: 1
  Vstack management Vlans: none
  Join Window Details:
     Window: Open (default)
     Operation Mode: auto (default)
  Vstack Backup Details:
     Mode: On (default)
     Repository: 
```
openFrameworks 0.9.5 for iOSでlibrary not found for -lcrt1.3.1.o のエラーが出たときの対処法

openFrameworks 0.9.5 for iOSをダウンロードしてexampleProjectをビルドしたところ、library not found for -lcrt1.3.1.o が出ました。ググってみたところCocoaPod関連のエラーの様で、このあたり (https://blog.tagbangers.co.jp/2015/12/03/Xcode_library_not_found_for_marumaru) を参考にCocoaPodのサイインストールなどしましたが、「Target BuildSettingsのBuild Active Architecture OnlyをYesにしないと動作しないかもしれません」で嵌ってました。

Yesにしてみたところ、無事ビルド成功。
pod installしていないプロジェクトでもYesにしたらコンパイルできたので、CocoaPod自体の再インストールが果して必要だったのかどうかはちょっとわかりませんが、とりあえず、解決したので、記録として残しておきます。
Raspberry PiのIPアドレスを起動時に送るスクリプト

[地味に便利！Raspberry Piが起動したらIPアドレスを通知するチャットボットを作る](https://dotstud.io/blog/raspberry-pi-ip-notification/)
という記事があって、かなり便利なんだけどNodeを使うのはめんどうなのとHipChatじゃないところへ送りたいのでちょっと改造してみました。

作るものはRaspberry Pi起動時に実行するシェルスクリプトとIPアドレス受け取るサーバー用のPHP
今回はPHPにしたけど、たぶんSlackとかのwebhookに適当に変えてもできるはず

## IP送信シェルスクリプト
```bash:sendip.sh
res=`ifconfig`
url="http://example.com/raspberrypi.php"
curl -X POST -d "text=${res}" ${url}
```
ifconfigの内容をcurlでphpのサーバーへpostしているだけ。


## 受け取るPHP
```php:raspberrypi.php
<?php
$filename = "rsip.txt";
if (isset($_POST["text"])) {
  $res = $_POST["text"];
  echo file_put_contents($filename, date(DATE_ATOM).'<br>'.$res);
} else {
  echo '<pre>';
  echo file_get_contents($filename);
  echo '</pre>';
}
```

こっちも単純で、postで受け取った内容を```ip.txt```というファイル名に保存して、
ブラウザで表示するときは、このファイルの中身を表示させるかたち


## 起動時に実行するように仕組む

そして起動させる毎にこのshellを実行させるように`/etc/rc.local`に書き加える

```bash:/etc/rc.local
sh sendip.sh
```

## できあがり
これでRaspberry PiのIPアドレスを起動時送ってくれる。ディスプレイとかキーボードとか繋ぐ必要なし！

```
2017-07-22T19:11:17+09:00
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx
          inet addr:192.168.11.8  Bcast:192.168.11.8  Mask:255.255.255.0
          inet6 addr: xxxx::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1818525245 errors:0 dropped:0 overruns:0 frame:0
          TX packets:30853428 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:126241847614 (117.5 GiB)  TX bytes:11555247080 (10.7 GiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:11135533 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11135533 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:7879172002 (7.3 GiB)  TX bytes:7879172002 (7.3 GiB)
```

できたものはこんな感じ
ちょっと見にくいが、```192.168.```とかページ内検索で引っ掛ければすぐ出てくるのでとりあえずは問題ない。



まあPHP側で抽出するように書き加えれば良い気がする、面倒だからやらないけど。。。
Re: リストをシャッフルする関数

[こちらの記事](http://qiita.com/penguinshunya/items/f90a1df5fdb6ee7962e5)にArrayで書かれていたのを見て、Vectorの方が速いと耳にしたことがあったので書いてみました。

```haskell
module Main where

import Control.Monad (zipWithM_)
import Control.Monad.ST (ST)
import qualified Data.Vector.Unboxed as VU
import qualified Data.Vector.Unboxed.Mutable as VUM
import System.Random (getStdRandom, randomR)

main :: IO ()
main = print =<< shuffle ([1..10000000]::[Int])

shuffle :: (VU.Unbox a) => [a] -> IO [a]
shuffle xs = do
  let m = length xs - 1
  randoms <- mapM (\i -> getStdRandom (randomR (0, i))) [m,m-1..1]
  return $ VU.toList $ VU.modify (\vum -> swaps vum [m,m-1..1] randoms) $ VU.fromList xs
  where
    -- | Mutable Vector -> Swap Indexes A -> Swap Indexes B -> ST s ()
    swaps :: (VU.Unbox a) => VUM.MVector s a -> [Int] -> [Int] -> ST s ()
    swaps = zipWithM_ . VUM.swap
```

所要時間は2/3くらいになりますが、こんなに時間がかかるものなのですかね？
```[m,m-1..1]```が共通だからと名前をつけたら遅くなったのは、キャッシュされたせいかな。
Atomエディタでプロジェクトごとにテーマを変える

Atomはプラグインが多く様々な用途で使用することができるため、マークダウンや文書オンリーで使用したり複数の言語で使用したりと、様々な用途で使用する場合に、プロジェクト(用途)ごとにエディタの色を変えたいこともあると思います。

手順を以下に記載します。

## `project-manager`パッケージのインストール

`project-manager`パッケージを使用します。インストールしてください。

### `project-manager`の設定

各プロジェクトで以下の設定を行います。
プロジェクトを開いた状態で、Macの場合`command+shift+p`でパレットを開いてください。
`Project Manager: Edit Project`にて、現在開いているプロジェクトの情報をセットできます。タイトルを入力して`Save`してください。

![](https://qiita-image-store.s3.amazonaws.com/0/37910/148a8f7b-afc4-bf81-af34-fe02fd0f4377.png)

余談ですが、この設定により`command+control+p`でいつでもプロジェクトディレクトリを開くことができます。


### テーマやシンタックスをプロジェクトごとに指定する

`Project Manager: Edit Projects`で、cson形式の設定ファイルを開きます。
以下の様な感じで、`settings, core, themes`などを追記してください
ここの`themes`で指定したUI及びSyntax名が、このプロジェクトと紐づけられます。

```cson
[
  {
    title: "myProject"
    paths: [
      "/path/dir1"
      "/path/dir2"
    ]
    settings:
      core:
        themes: [
          "atom-dark-ui-slim"
          "pen-paper-coffee-syntax"
        ]
  }
]
```

なお、UI及びSyntaxの名称は、`Themes`で選択できる名称ではなく、インストールしたパッケージ名です。デフォルトのテーマを含むインストール済みのパッケージ名は、メニューバーの[Atom]-[Preference]で表示される[Settings]タブの、`Themes`の、`Installed Themes`で確認できます。

追記:

- プロジェクトに複数のディレクトリを指定することができます。(配列で指定可能。)

### テーマやシンタックスの更新

- 現在のAtomのバージョンでは、`複数のプロジェクトを同時起動している && (ファイル検索を開く or Setting画面を開く)`をすると、全てのプロジェクトに、現在のカレントプロジェクトのUIが適用されてしまう様です。
- 個人的には、以下の様にプロジェクトをupdateして我慢しています。
  - configのkeybindから`your keymap file`を`keymap.cson`を開く
  - keymapに以下を追加する
  
```cson:windows/linux
'.platform-win32, .platform-linux':
  'alt-shift-U': 'project-manager:update-projects'
```
```cson:mac
'.platform-darwin':
  'cmd-ctrl-u': 'project-manager:update-projects'
```
 - これで、`Ctrl+Alt+U`(macの場合`cmd+ctrl+u`)で、定義を元に戻しています。

---
[参考]
http://stackoverflow.com/questions/36983176/atom-editor-theme-syntax-per-project-or-open-window
Androidアプリ開発のための、Android端末の開発者モード設定方法

#はじめに
　この記事では、これからAndroidアプリ開発に際し、実機テストをするためにAndroid端末を「開発者モード」に設定する方法を解説します。また、USBケーブルでの開発アプリインストールと実機デバッグのため、「USBデバッグ」モードの設定方法を解説します。

#Android端末を開発者モードに設定する。
まず、Android端末のトップメニューから
「設定」→「端末情報」とタップします。
「端末情報」画面を下の方にスクロールすると「ビルド番号」という項目があるので、ここを7回タップします。
<img width="240" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/103726/fd150183-e7ab-ef08-eee9-d5081d8b951d.jpeg">

すると、「これでデベロッパーになりました！」みたいなメッセージが出ます。
※端末によってはでないかも知れません。

<img width="240" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/103726/cb87a458-9971-8a1d-d8ff-699fb3ff723b.jpeg">

これで開発者モードに設定できました。
「端末情報」から「設定」メニューに戻ると、今までなかった「開発者向けオプション」メニューが出ていることを確認してください。

<img width="240" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/103726/35a3adac-b330-7016-7ba1-eba8b85c4262.jpeg">


#Android端末で「USBデバッグ」を有効にする

　前項で出現した「開発者向けオプション」メニューにタップして入ります。
「開発者向けオプション」メニューの中に「USBデバッグ」という項目がありますので、タップして有効にします。
※写真のようにポップアップが出ることがあります。「OK」を選択して有効にしてください。
<img width="240" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/103726/99bbf0de-0e5b-d52e-e414-39b4562b4fe3.jpeg">

お疲れ様です、これでAndroid端末の準備が整いました。

#外部参考サイト
◆AndMem「Android端末を「デバッグモード」(USBデバッグ)に設定する」
http://andmem.blogspot.jp/2012/10/androiddebugmode.html
owncloudでlatex編集&コンパイル

#サーバにowncloudを導入した
これでドキュメントやら画像やらをデバイス間で同期できる。

#cloudlatex風のlatexリアルタイムプレビューがほしくなった
latexを編集してコンパイルコマンド打ってという作業をGUI上でやってほしいのでowcloudのアドオンを導入することとした

#centos上のowncloudに新しいアドオンを追加する方法
/var/www/htm/owncloud/apps/以下にアドオンを配置する
権限を適当に合わせとく
ownCloud上でアプリの追加から該当アプリを追加する

#LatexTex Editor and Compilerを導入
https://apps.owncloud.com/content/show.php?content=151441&forumpage=3
laravel5でMiddlewareを用いた暗号化通信への強制リダイレクト


### はじめに
昨今，セキュリティーの重要性が高まっていくなか，現在あるWebAPIを提供するためにlaravelで開発しているところですが，これからの時代は暗号化通信が基本となるので自分がネットで類似する記事を探したところあまりヒットしなかったので，メモ程度に残します．

### Middleware
簡単に説明すると，Middlewareは特定のルートに関連付けられた動作を行う前に読み込まれるフィルター機能のようなものです．
そのほかにもいろいろとログイン画面へ飛ばすとか，laravel4の時にあった機能で特定のルートに関連付けられた動作を終えたあとに作動させるフィルターも作れます．
（laravel4のときはApp::beforeおよびApp::afterで実装されていましたが，laravel5ではMiddlewareで実現させるように変更されたようです）

### 実装
まず，コマンドラインなどでlaravelのプロジェクトのルートへ移動します．

```
cd /var/www/app
```

次に```php artisan```でMiddlewareを作ります．

```
# php artisan make:middleware AppBefore
```
 
今回はAppBeforeというネームでMiddlewareを作成します．
次に```app/Http/Kernel.php```の```$middleware```に```'App\Http\Middleware\AppBefore'```を追加します．

```php:/app/Http/Kernel.php
<?php namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel {

	/**
	 * The application's global HTTP middleware stack.
	 *
	 * @var array
	 */
	protected $middleware = [
		'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
		'Illuminate\Cookie\Middleware\EncryptCookies',
		'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
		'Illuminate\Session\Middleware\StartSession',
		'Illuminate\View\Middleware\ShareErrorsFromSession',
		'App\Http\Middleware\VerifyCsrfToken',
		'App\Http\Middleware\AppBeforeFilter',
	];
```

そして，Middlewareを編集します．

```php:/app/Http/Middleware/AppBefore.php
<?php namespace App\Http\Middleware;

use Closure;

class AppBeforeFilter {

	/**
	 * Handle an incoming request.
	 *
	 * @param  \Illuminate\Http\Request  $request
	 * @param  \Closure  $next
	 * @return mixed
	 */
	public function handle($request, Closure $next)
	{
		if (!$request->secure() && env('APP_ENV') === 'local') {
            return redirect()->secure($request->getRequestUri());
    }

		return $next($request);
	}

}
```

上記はHTTPリクエストは暗号化通信で行われており，かつ環境がローカル環境であるかを確認し，そうでなければ，暗号化通信へ強制的にリダイレクトさせるようになっています．

上記の方法で暗号化通信へ切り替えることができますが，少しいじればいろいろなことができそうです．
もちろんここではしませんが，何らかのビューを返すこともできるはずです．
Bash設定

自分のところでやっときたい設定メモ。
もっと弄るとこあれば追記。

```bash
# エイリアス設定
alias ll='ls -al'
alias rm='rm -i'

# プロンプトの表示設定
# \u:ユーザー名
# \w:カレントディレクトリ名
# $ :rootのときは#、一般ユーザーのときは$表示
PS1='[\u@\w]$ '
```

`source ~/.bashrc`と同じ。
価値検証をする

# 価値検証とは

スタートアップを始める際、最も気をつけないといけないのは「誰にも必要とされないものを作る」ということ。
このリスクを防ぐために、解決しようとしている課題を顧客が持っているのか、またそれは解決に値する課題なのかを学習することを目的に行う検証。

## 解決に値する課題は以下の3つの質問に集約できる

> - それは顧客が必要としているものですか？（必要性）
> - 顧客はお金を支払ってくれますか？支払ってくれないのであれば、誰が支払ってくれますか？（成長性）
> - それは解決可能ですか？（実現性）
> 
> [Running Lean ―実践リーンスタートアップ (THE LEAN SERIES) P.9](http://amzn.to/2ed5TY7)

# 課題と顧客を明確にする

まずは、解決しようとしている課題とその課題を持っている顧客を明確にします。
課題と顧客は短い文章でメモしておいて、仮説検証後に定期的に更新します。

## 課題仮説

- 解決しようとしている重要な課題を3つメモする
- 現状、その課題をどのように解決しているのかをメモする

## 顧客仮説

- 課題を持つ顧客をメモする
- その中でアーリーアダプタとなりそうな人はどんな人かを考える

# 実験する

なるべく短い時間で、課題仮説と顧客仮説を検証する。
何も作らないで検証できるのが一番嬉しい！

## 反証可能な仮説を立てる

> 反証可能な仮説とは、間違いがはっきりわかる仮説
> 反証可能な仮説 = 具体的で反復可能な行動 + 期待する計測可能な成果
> [Running Lean ―実践リーンスタートアップ (THE LEAN SERIES) P.65, 66](http://amzn.to/2ed5TY7)

反証可能な仮説を立てないと実験結果に自信を持てない。

x: イベントにいっぱい人を集める
o: ○○○勉強会を開催して、参加者の60%にユーザー登録してもらう

## インタビューする

### 誰にインタビューするのか: 顧客セグメント。知り合いから初めてなるべく遠くの人へ

- まずは顧客セグメントに合致する知り合いから始めてインタビューを練習する
- インタビュー後、顧客セグメントに合致する知り合いを紹介してもらってどんどん遠くの人に

### 何を聞くのか: 大切なのは顧客の課題を理解すること

- こんなの作るんですけど、使いたいですか？っていう質問はダメ。
    - 顧客は正しい解決方法を知っているわけではない
    - 顧客からはあくまでも課題を聞く
    - 解決方法は自分たちが考える


もっと学ぶ:

- [Running Lean ―実践リーンスタートアップ (THE LEAN SERIES)](http://amzn.to/2ed5TY7)
- [人間と話す: Lean Customer Development (Lean Startup Update 2015)](http://www.slideshare.net/takaumada/lean-customer-development-lean-startup-update-2015)
コードレビュー７つのポイント

##コードレビュー７つのポイント
http://www.slideshare.net/rootmoon/ss-38278479 のまとめ。個人的に得られた教訓

###１．レビューの観点を明確にすること→指摘の制度があがる
・コーディングスタイルの観点
・セキュリティの観点
・保守性の観点
・トランザクションの観点（リカバリなど）
・リリース時に事故が起きないか？

###２．わが身に変えることを恐れずに指摘する
・自分のことは棚に上げる
・鋭く突っ込みを入れられないならレビューの意味はない
・指摘して自分の耳が痛いなら、自分にとっても成長のチャンスだととらえる。

###３．なぜ悪いコードなのかを論理的に説明すること
・「なんとなく汚い」は指摘ではない
・悪いコードだと判断したなら、相手が納得できるように論理的に説明する。
・論理的に説明できないなら、指摘をすべきではない。

###４．良いコードについて共通認識を持つこと
・コードレビューのあとに雰囲気が悪くなるのはチームで「いいコード」の認識がそろっていない証拠
・「いいコード」を共有することでチームとして成長する。
・認識をそろえるためには、あるコードを題材にディスカッションの機会を設けるといい。

###５．小さい単位でレビューを繰り返すこと
・大きな単位だとレビューする側もされる側も、出番が回ってきにくい。
　－機会を増やすことでみんながレビュー体験をする/小口化することで習慣化する。
・30分～1時間程度で見れる分量が丁度いい。

###６．指摘は素直な気持ちで受け入れること
・指摘を素直に受けとめられないと成長できない。
・受け入れた後は同じ失敗を繰り返さない
- 漠然とコードレビューを受けて、その場はその場で何とかやり過ごして、また同じ失敗を繰り返すメンタルモデルではダメ。
###７．指摘は人格否定ではないことを理解すること
・自分が一生懸命書いたコードに対して手厳しく指摘を受けるのはつらいこと。
・でも、指摘するのはコードであって、あなたの人格を否定しているわけではありません
・お互いに「コード」の話をしている、ということを理解したうえで指摘をしましょう。
PLSQL サンプル

#この記事について#
備忘録です。
PLSQLを職場で使う必要があるので、どうやって書くかを確認するために投稿しました。

*SPOOLはSQLPLUSのコマンドなので、PLSQLの処理内部に組み込めないのですね・・・。驚きました。

<参考>
http://www.oracle.co.jp/forum/thread.jspa?threadID=8011405

#使い方#
1.SQLファイル作成
2.SQLファイル実行

#1.SQLファイル作成#
[SPOOL サンプル]
(http://qiita.com/Amebayashi/items/8bc2f7b26aedb0f27ec8)
のdata.sqlを作成

```PLSQL_select.sql
-- selectで発行したカラムの中身を標準出力・ファイル出力するプログラム

-- 実行文を非表示に設定
-- 標準出力に出力に設定
SET ECHO OFF
SET SERVEROUTPUT ON

--任意フォルダにログ出力を開始する。ファイル名はselect_tes.log
spool C:\tmp\select_tes.log
	
-- 宣言
DECLARE
	personName varchar2(10); -- 型:varchar2で変数を宣言

BEGIN --実行の始まり

	-- select項のperson_name の値を変数 personName に格納する
	select person_name into personName from person where person_id = '001';
	
	-- 標準出力にメッセージを表示するためのパッケージを利用し、出力
	DBMS_OUTPUT.PUT_LINE('人物の名前は');
	DBMS_OUTPUT.PUT_LINE(personName);
	
END; --実行の終わり
/

-- ログ出力終了
spool off
```

#2.SQLファイル実行#
SQLPLUSで実行。
SQL> @[任意フォルダパス]\data.sql
SQL> @[任意フォルダパス]\PLSQL_select.sql
データをストリーミングでGzip圧縮する


## やりたい事

* データを複数回 (部分ごと) に分けてGzip圧縮する
* 圧縮済みの部分データを取得できる

> [FlaskのStreaming Contents] でGzipデータを動的に作りながら返したかったので。

## コード

GzipStreamクラス (自作)。

```py
#!/usr/bin/env python
# encoding: utf-8

from gzip import GzipFile
from StringIO import StringIO


class GzipStream(object):
    
    def __init__(self):
        self._io = StringIO()
        self._gf = GzipFile(fileobj=self._io, mode='wb')
        self._pos = 0
    
    def push(self, content):
        '''
        push a part of content.
        '''
        assert not self._gf.closed
        self._gf.write(content)
        self._gf.flush()
    
    def pop(self):
        '''
        :return: A part of gzipped content, or "None" that means EOF.
        '''
        current_pos = self._io.len
        
        if self._gf.closed and current_pos == self._pos:
            return None
        
        part = self._io.getvalue()[self._pos:current_pos]
        self._pos = current_pos
        
        return part
    
    def close(self):
        '''
        you must call this.
        '''
        if not self._gf.closed:
            self._gf.close()
    
    def __enter__(self):
        ''' なくてもいい '''
        return self
    
    def __exit__(self, exc_type, exc_value, traceback):
        ''' なくてもいい '''
        self.close()
```

以下のように使ってみる。

```pycon
>>> from streamgzip import GzipStream

>>> gs = GzipStream()

>>> gs.push('hello ')
>>> gs.pop()
'\x1f\x8b\x08\x00\xfd\xcf\x0cX\x02\xff\xcaH\xcd\xc9\xc9W\x00\x00\x00\x00\xff\xff'

>>> gs.push('world ')
>>> gs.push('!!')
>>> gs.pop()
'*\xcf/\xcaIQ\x00\x00\x00\x00\xff\xffRT\x04\x00\x00\x00\xff\xff'

>>> gs.close()
>>> gs.pop()
'\x03\x00\xb7\xc8\xd4%\x0e\x00\x00\x00'

>>> print gs.pop()
None
```

データが正しいか検証してみる。

```pycon
>>> from gzip import GzipFile
>>> from StringIO import StringIO

>>> io = StringIO()
>>> io.write('\x1f\x8b\x08\x00\xfd\xcf\x0cX\x02\xff\xcaH\xcd\xc9\xc9W\x00\x00\x00\x00\xff\xff*\xcf/\xcaIQ\x00\x00\x00\x00\xff\xffRT\x04\x00\x00\x00\xff\xff\x03\x00\xb7\xc8\xd4%\x0e\x00\x00\x00')
>>> io.seek(0)
>>> gzfile = GzipFile(fileobj=io, mode='rb')
>>> gzfile.read()
'hello world !!'
```


[FlaskのStreaming Contents]:http://flask.pocoo.org/docs/0.11/patterns/streaming/
postgreSQLコマンドとMySQLコマンドの比較


データベース選択

```:postgres
psql databasename
```

```:mysql
mysql -uroot -p databasename
```

データベース一覧

```:postgres
\l
```

```:mysql
show databases;
```

データベース選択

```:postgres
\c databasename
```

```:mysql
use databasename;
```


テーブル名一覧

```:postgres
\dt
```

```:mysql
show tables;
```

テーブル詳細

```:postgres
\d tablename
```

```:mysql
desc tablename
```
ChromeブラウザのGoogle Analytics表示遅すぎ問題を解決

Chromeでブラウジングしている際、Google Analyticsなど、一部のGoogleサービスで表示が異常に遅く、その都度別ブラウザで開いていました。

ブラウザ設定を一部変更したら解決したのでメモ。

## 設定変更方法
1. 以下のURLをクリックする（もしくはブラウザのアドレスバーに入力）
[chrome://flags/#enable-quic](chrome://flags/#enable-quic)

2. 以下の項目を"無効"にする
![スクリーンショット 2016-10-24 0.02.53.png](https://qiita-image-store.s3.amazonaws.com/0/113553/edab7a97-6c90-3908-1b08-fca8ee29a9a0.png)

3. 画面下部の"今すぐ再起動"をクリックして、ブラウザを再起動する。
![スクリーンショット 2016-10-24 0.03.44.png](https://qiita-image-store.s3.amazonaws.com/0/113553/0dc5fcb0-33b1-8f39-2e5b-8fd533370fb4.png)

## 参考
[Chrome上のGoogleサービスの読み込みが遅すぎます。](https://productforums.google.com/forum/#!msg/chrome-ja/mLjFNOAfQTk/51jVyILvCgAJ)
既存サービスの暗号化パスワードを、Sorceryを使った新サービスに移行


現在弊社では、とあるRails製Webメディアの大規模改修を実施中です。それに伴い、メディアの情報や登録ユーザーの情報を移行する必要がありました。今回取り上げているのは、ユーザー情報、特に暗号化されたパスワードの移行に関してです。



## 環境

- Ruby 2.3.1
- Rails 5
- MySQL 5.7

## 既存サービスは独自の認証方式
まず、既存サービスでは特定の認証Gemは使用しておらず、独自の認証方式を採用しているようでした。パスワードの暗号化に関しては、以下のようなロジックとなっていました(実際とは少し違います)。

```rb
crypted_password = Digest::SHA1.hexdigest("#{salt}#{password}")
```

つまり、ユーザー毎に生成されるsaltと、ユーザーが入力したパスワードをつないだ文字列を入力として、SHA1方式でハッシュを生成しているようです。

## 改修後の新サービスではSorceryを使う
一方で、改修後の新サービスでは認証GemのSorceryが導入されます。Sorceryの標準暗号化方式が、前述した既存サービスでの暗号化方式と一致していればよいのですが、そう都合よくは行きません。

なので、新サービスのSorcery内で使用される暗号化方式を、前述した既存サービスの暗号化方式に合わせる必要があります。

## Sorcery設定ファイルの編集

Sorceryには、md5、sha1、sha256、aes256等、各種暗号化方式が元々準備してあります。設定ファイルを編集し、使用する暗号化方式を指定します。

```rb:config/initializers/sorcery.rb

Rails.application.config.sorcery.configure do |config|
~中略
    config.encryption_algorithm = :sha1
end
```

前述したように、既存ではsha1が使われていたので、それに合わせました。

## Sorcery内のSHA1暗号化方式を変更

上記の設定だけで済めば良かったのですが、既存サービスのSHA1を介した暗号化と、SorceryデフォルトでのSHA1を介した暗号化では、入力値が微妙に違うみたいです。

具体的には、

```rb
# 既存サービス
crypted_password = Digest::SHA1.hexdigest("#{salt}#{password}")

# sorceryのデフォルト
crypted_password = Digest::SHA1.hexdigest("#{password}--#{salt}")
```

という感じで、Sorceryではユーザーが入力したパスワードとsaltの順番が逆になっており、さらにpasswordとsaltの間にハイフンが二つ入るようです。というわけで、Sorcery内でSHA1暗号化を行っている部分を改造します。

```rb
require 'digest/sha1'

module Sorcery
  module CryptoProviders
    class SHA1
      include Common
      class << self
        def encrypt(*tokens)
          tokens = tokens.flatten
          digest = tokens.shift
          # 下記の*tokensとdigestを入れ替えた
          stretches.times { digest = secure_digest([*tokens, digest].join) }
          digest
        end

        def secure_digest(digest)
          Digest::SHA1.hexdigest(digest)
        end
      end
    end
  end
end
```

これで、Sorcery内の暗号化方式を、既存サービスのものに一致させることができました。

## まとめ

日本語の情報が見つからなったので最初は不安になりましたが、案外あっさり終わりました。今回は、CryptoProviders::SHA1を直接編集しましたが、encryption_algorithmにcustomを指定することで、独自の暗号化方式を定義することも可能なので、そちらを用いたほうがよかったかもしれません。
Railsのテンプレートにpublicに保管されたhtml.erbファイルを挿入する


# 背景と目的
* テンプレートで<%= render partial: xxx %>として、xxxの箇所にpublicのパスを指定しても読み込みができなかった。
* ``public/``に保管したhtml.erbファイルをテンプレートに挿入したい！

# コード

* 挿入したいファイル

```public/insert.html.erb
<h3>erbファイルを挿入</h3>
<span>1 + 2 + 3は<%= 1 + 2 + 3 %>だよ。</span>

```

* 挿入するためのヘルパー

```xxx_helper.rb
def insert_erb(url: '')
	raw ERB.new(File.open(url).read).result(binding)
end
```

* 挿入される側のテンプレート

```app/views/xxx/index.html.erb
<%= insert_erb(url: 'public/insert.html.erb') %>
```

# 結果
<a href="https://gyazo.com/dcf54335827d461a1fbf5d71a62c44b6"><img src="https://i.gyazo.com/dcf54335827d461a1fbf5d71a62c44b6.png" alt="https://gyazo.com/dcf54335827d461a1fbf5d71a62c44b6" width="257"/></a>

# 解説
* ERBクラスを使って、読み込んだファイルをerbで解釈して出力する。
* result(binding)は [こちらを参照]("http://blog.livedoor.jp/maru_tak/archives/50689342.html")
* raw：ERBで実行された文字列をそのまま出力するための命令。もし、これをつけないと不等号（＜＞とか）などの特殊記号を ``&lt;``と ``&gt;``に変換されてしまう。

もし、下記のようにERBの出力の際にrawを使わない場合、

```xxx_helper.rb
def insert_erb(url: '')
	ERB.new(File.open(url).read).result(binding)
end
```

insert_erb(url: 'public/insert.html.erb')は下記の出力になってしまう。

```
  &lt;h3&gt;erbファイルを挿入&lt;/h3&gt;
&lt;span&gt;1 + 2 + 3は6だよ。&lt;/span&gt;
```

# 応用
* html.erb内では、テンプレートと同様に@yyy 変数も使えます。


# 参考
* http://stackoverflow.com/questions/24844336/how-to-make-html-erb-file-work-outside-of-rails
* http://railsdoc.com/references/raw
ティモウィーンをハックする

[ティモウィーン](http://jp.leagueoflegends.com/ja/featured/skins/the-teemoing-2016/sacrifice-minions)

1. クリックできる状態にする
2. chromeの`chrome dev tool`を開く(windowsなら`ctrl + shift + i`)
3. `setInterval(()=>document.querySelector('#MainClick').click(), 10)`をコンソールに張り付けて`Enter`

![teemoween.gif](https://qiita-image-store.s3.amazonaws.com/0/46870/19be522c-f27d-f6bf-7c69-b71e0ff3d8b4.gif)
SPOOL サンプル

#この記事について#
備忘録です。
流したSQLのエビデンスを取るのに便利かなと思って作成しました。

#使い方#
1.SQLファイル作成
2.SQLファイル実行

#1.SQLファイル作成#

```sql:data.sql

--サンプルテーブル
create table person
(
person_id char(3) ,
person_name varchar2(10),
updatedate date,
constraint pk_emp primary key( person_id )
);

--サンプルデータ
INSERT INTO person (person_id,person_name,updatedate) values ('001','taro',( SELECT SYSDATE FROM DUAL ));
```
```sql:spool_sample.sql
--spoolサンプルプログラム


--ECHO ON はスクリプト実行によるコマンド文を表示する設定。
--TIMING ON はSQLの実行時間を表示する設定。
set echo on
set timing on


--ファイル名に現在日を設定するためにdual表で現在日を取得
column log_date new_value log_date_text noprint
select to_char(sysdate,'yyyymmdd') log_date from dual;

--任意フォルダにログ出力を開始する。ファイル名はspool_yyyymmdd_tes.log
spool C:\tmp\spool_&log_date_text._tes.log


---- ログ表示ここから。出力したいSQLを記述

select
*
from
person
;

---- ログ表示ここまで。出力したいSQLを記述


-- ログ出力終了
spool off 
/

```

#2.SQLファイル実行#
SQLPLUSで実行。
SQL> @[任意フォルダパス]\data.sql
SQL> @[任意フォルダパス]\spool_sample.sql
Rcpp: 引数にvectorを使うかIntegerVectorなどを使うか

Rcppには、Rの各種ベクトル・行列に対応するクラスがひと通り用意されている。`IntegerVector` `NumericMatrix`などだ。一方、Rcppで関数を書くときには標準ライブラリのstd::vectorを使うことも許されている。例えば、`std::vector<int>`型の引数を取る関数を定義してそれをRから用いる場合、Rのベクトルオブジェクトが舞台裏でC++の整数ベクトル型に変換されるので、同様の挙動が得られる。

関数内で行列演算などの数値計算をたくさん行う場合には、Rcpp上の型を用いるほうが様々な演算が定義されているので便利だし効率もいい。だけど、そこまでの数値計算を要さない処理である場合、標準ライブラリを使っていた方がC++に慣れていれば書きやすい意味もある。

変数をどう受け渡すのが良いか、変換効率について比較した。結論としては

- 入力変数のサイズがあまり大きくなければ差はそれほどない。
- `IntegerVector`が引数の関数にはRから整数ベクトルを渡すと速い（型変換がないため）が、実数ベクトルを渡すと型変換が起こって遅くなる。
- 同様に`NumericVector`を取る関数にはRから実数ベクトルを渡すと速いが、整数ベクトルを渡すと型変換が起こって遅くなる。
- 標準ライブラリのベクトルを用いると、必ず型変換が起こるので遅い。

[テストコード](https://gist.github.com/kota7/1407f77093062ccaf8a7289bab34b410)

![stdVector-v-RcppVector.png](https://qiita-image-store.s3.amazonaws.com/0/80588/16481489-566c-1eb5-3d63-e786cc766298.png)



```r
library(Rcpp)
library(dplyr)
library(ggplot2)
library(microbenchmark)


cppFunction(
  'void TakeRcppIntVector(Rcpp::IntegerVector x)
  {
    return;
  }'
)

cppFunction(
  'void TakeStdIntVector(std::vector<int> x)
  {
    return;
  }'
)

cppFunction(
  'void TakeRcppRealVector(Rcpp::NumericVector x)
  {
    return;
  }'
)

cppFunction(
  'void TakeStdRealVector(std::vector<double> x)
  {
    return;
  }'
)



# performance check
d <- NULL
for (s in 1:6)
{
  intvec <- rep(1L, 10^s)
  realvec <- rep(1, 10^s)
  m <- microbenchmark(TakeRcppIntVector(intvec), TakeStdIntVector(intvec),
                      TakeRcppIntVector(realvec), TakeStdIntVector(realvec),
                      TakeRcppRealVector(intvec), TakeStdRealVector(intvec),
                      TakeRcppRealVector(realvec), TakeStdRealVector(realvec))
  cat(sprintf("\n size = 1e+%d\n", s))
  print(m)
  m <- as.data.frame(m)
  m$size <- 10^s
  d <- rbind(d, m)
}


v <- group_by(d, size, expr) %>%
  summarize(Mean = mean(time), Med = median(time),
            LB = quantile(time, 0.1), UB = quantile(time, 0.9))
v$input <- ifelse(grepl("intvec", v$expr), "pass integer", "pass numeric")
v$func <- sub("\\(.*\\)", "", v$expr)
ggplot(v, aes(x = size, y = Med, color = input)) +
  geom_point() + geom_line() + 
  xlab("Vector Size") + ylab("Time (nano sec)") +
  geom_ribbon(aes(ymin = LB, ymax = UB, fill = input), 
              alpha = 0.3, size = 0) +
  scale_y_log10() + scale_x_log10() +
  facet_grid(~func) +
  theme(legend.position="bottom")
```
ターミナルからmacの通知センターに投稿する

ターミナルやシェルスクリプトで何か時間のかかる処理をする際に、完了時やエラー時の通知ができないかなあと思っていた所、[terminal-notifier](https://github.com/julienXX/terminal-notifier)が便利そうだったのでメモ。

## terminal-notifierについて
 - macOSのユーザー通知を送るためのコマンドラインツール
 - macOS 10.8以上で利用可能
 - https://github.com/julienXX/terminal-notifier

## terminal-notifierのインストール
homebrew経由で簡単にインストールできます。

```sh
$ brew install terminal-notifier
```

## 使い方
オプションで表示メッセージや通知音を指定します。
こちら以外にも、アイコン画像やURLも指定できるようです。

```sh
$ terminal-notifier -title "タイトル" -subtitle "サブタイトル" -message "メッセージ" -sound default
```

こんな風に通知されます。\\\ ティロリン！ //
![スクリーンショット 2016-10-23 23.10.47.png](https://qiita-image-store.s3.amazonaws.com/0/113553/deb1789b-077d-3497-f84c-a7713e2f166f.png)

デフォルトの音を変えても楽しいですね。

``` sh
# 例)Blow,Bottle,Frog,Funk,Glass,Hero,Morse,Ping,Pop,Purr,Sosumi,Tink
$ terminal-notifier -message "ポッ" -sound Pop
```
３ヶ月でMVPを作る - Week 6, 7, 8

##進歩
![image02.png](https://qiita-image-store.s3.amazonaws.com/0/104858/96ef981f-ec7b-1436-e755-fb56bc6546d2.png)
ようやく念願のhttps://triplor.coからアクセスができるように！
（ただなぜか画像が潰れてる）




##やったこと
-DBのスキーマ設計
-旅行を登録するControllerとModelの制作
-httpsアクセスが可能に
-質問サイト（teratailとstack overflow）への質問の投稿２


##学び
-DBのまとめがすごい。。
http://www.databaseanswers.org/data_models/﻿
-DBを設計する時に最初に読んだ方がいいかも
http://www.slideshare.net/nippondanji/db-engineerstudyanim﻿
-Route53のAリコードはこれ！
https://aws.amazon.com/jp/getting-started/get-a-domain/﻿
-ドメイン名だとwelcome-to-nginx-on-the-amazon-linux-amiとなる時の解決策
http://ja.stackoverflow.com/questions/29757/
-https接続がうまくいかない時に確認するプロセス（自分用）
https://plus.google.com/u/1/107221871269602934448/posts/1Y6DwJTKA7o
-https接続の時に特に役に立った記事。
http://bibunkaplan.com/newsandblog/archives/800﻿
-分かりやすいログの解説。
http://knowledge.sakura.ad.jp/beginner/3424/﻿

（全ての学びはここに👇）
https://plus.google.com/u/1/107221871269602934448

##これから
-rubyについての知識を深める（完全に基礎力が足りなさすぎる。。）
--パーフェクトRubyをもう一度確認
--HackerRankのRubyにチャレンジ


##感想

第6週目、第7週目はまったく開発に手をつけられなかったのは、完全に中だるみです。。。今週に入ってから少し作業したおかげでようやくIPアドレスだけでなく、ドメイン名とhttpsでサイトに接続できるようになった。ただEC2上のアプリを最新状態にする方法がわからなくて、一度ディレクトリを削除してからgit cloneしてしまってから、ユーザーを登録すると毎回アプリがうまく作動しない。。AWS関連でもう２０時間以上使っているので、これからはローカルでアプリを作って、最後にEC2上に公開したい。白馬の王子様が現れてAWS関連の問題を解決してほしい！
EIPのリリース (Oregon)

# マネージメントコンソール (VPC オレゴンリージョン)

https://us-west-2.console.aws.amazon.com/ec2/v2/home?region=us-west-2#Addresses:sort=publicIp にアクセスします。


* 削除するElastic IPのチェックボックスをONにします。

* 「アクション」ボタンをクリックし、「アドレスの解放」を選択します。
* (確認ダイアログ)「解放」ボタンをクリックします。

# 完了
VPNコネクションの削除 (東京)

マネージメントコンソール (VPC 東京リージョン)
=============================================

VPNコネクションの削除
----------------------

https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1#vpns:

* 削除するVPNコネクションのチェックボックスをONにします。

* 「削除」ボタンをクリックします。
* (確認ダイアログ)「削除」ボタンをクリックします。


カスタマゲートウェイの削除
-------------------------

https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1#cgws:

削除するカスタマゲートウェイのチェックボックスをONにします。

* 「削除」ボタンをクリックします。
* (確認ダイアログ)「削除」ボタンをクリックします。


仮想プライベートゲートウェイの削除
-------------------------

https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1#vgws:

削除する仮想プライベートゲートウェイのチェックボックスをONにします。

* 「仮想プライベートゲートウェイの削除」ボタンをクリックします。
* (確認ダイアログ)「削除」ボタンをクリックします。


# 完了
[JAWS-UG CLI] EC2:#7 インスタンスの削除 (Oregon)

AWS CLIを利用して、EC2のインスタンスを削除してみます。

前提条件
========

* [JAWS-UG CLI] 総合案内: http://qiita.com/tcsh/items/14c3278f69ab073afe0f を確認して、必要な手順を終えていること。
* ハンズオンで利用したEC2インスタンス以外のインスタンスが稼動していないこと。

EC2への権限
-----------

* EC2に対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.11.2
* AWS CLI 1.7.39

```bash:コマンド:
aws --version
```

```text:結果(例):
aws-cli/1.7.39 Python/2.7.5 Darwin/13.4.0
```


0. 準備
=======

0.1. リージョンの決定
---------------------

```bash:変数の設定:
export AWS_DEFAULT_REGION='us-west-2'
```


0.2. 変数の確認
---------------

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       ec2Full-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
      access_key     ****************LOAQ shared-credentials-file
      secret_key     ****************I1O1 shared-credentials-file
          region           us-west-2              env    AWS_DEFAULT_REGION
```

profileが '\<not set\>'  と表示される場合は、以下を実行してください。

```bash:コマンド:
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
```


0.3. 稼動インスタンスを確認
---------------------------

同一リージョンで稼動しているインスタンスのインスタンスIDを確認します。

```bash:コマンド:
ARRAY_EC2_INSTANCE_ID=$( \
  aws ec2 describe-instances \
    --filters Name=instance-state-name,Values=running \
    --query 'Reservations[].Instances[].InstanceId' \
    --output text \
) \
  && echo ${ARRAY_EC2_INSTANCE_ID}
```

```text:結果(例):
i-xxxxxxxx
```


2. EC2インスタンス削除
======================


2.1. EC2インスタンス削除
------------------------

```bash:変数の設定:
EC2_INSTANCE_ID=$(echo ${ARRAY_EC2_INSTANCE_ID} | sed 's/ .*$//') \
  && echo ${EC2_INSTANCE_ID}
```

```bash:変数の確認:
cat << ETX

        EC2_INSTANCE_ID: ${EC2_INSTANCE_ID}

ETX
```

```bash:コマンド:
aws ec2 terminate-instances \
  --instance-ids ${EC2_INSTANCE_ID}
```

```json:結果(例):
      {
        "TerminatingInstances": [
          {
              "InstanceId": "i-xxxxxxxx",
              "CurrentState": {
                  "Code": 32,
                  "Name": "shutting-down"
              },
              "PreviousState": {
                  "Code": 16,
                  "Name": "running"
              }
          }
        ]
      }
```


2.2. EC2インスタンスの状態確認
------------------------------

```bash:コマンド:
EC2_INSTANCE_STATE=$( \
  aws ec2 describe-instances \
    --instance-ids ${EC2_INSTANCE_ID} \
    --query 'Reservations[].Instances[].State.Name' \
    --output text \
) \
  && echo ${EC2_INSTANCE_STATE}
```

```text:結果:
terminated
```

同一リージョンでインスタンスが起動していないことを確認します。

```bash:コマンド:
ARRAY_EC2_INSTANCE_ID=$( \
  aws ec2 describe-instances \
    --filters Name=instance-state-name,Values=running \
    --query 'Reservations[].Instances[].InstanceId' \
    --output text \
) \
  && echo ${ARRAY_EC2_INSTANCE_ID}
```

```text:結果:
(戻り値なし)
```

完了
======