OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi 3とL-03C（前提環境①）

●[Raspberry Pi環境の全体はリンクを参照](http://qiita.com/nabepy/items/47704696e41b10d86186)

# 必要なもの
    - Raspberry Pi 3の準備　インストールから起動まで
    - インターリンクLTE
    - L-02C
　
# インターリンクLTEの契約

私は1GB/月プラン、SMSオプション付で契約、iPadなどの流用も考えてnanoSIM版を購入しました。申込すると1週間程度で到着しますよというメールが届きます。1週間後ポストに投函されていました。

また、インターリンクのAPNは「lte-mobille.jp」になります。利用されるAPN情報もメールで通知されます。

# L-02Cの調達
L-02Cとはドコモのデータ端末です。もう販売していません。私はヤフオクで入手しました。
入手したL-02CにインターリンクのSIMを挿したあと、そのL-03CをRaspberry Pi 3に挿入します。Raspberry Pi 上のデバイスファイル名を確認します。このとき、L-02C側がCD-ROMとしてマウントされている場合があります。その際はいろいろググって設定してみてください。
$ ls /dev
今回はttyUSB2で認識しています。

# cuのインストール、設定
$ sudo apt-get install cu

$ cu -s 19200 -l /dev/ttyUSB2
Connected.
at
OK
at+cgdcont=1, "ip","lte-mobile.jp"
OK
~.

困ったらat[enter]を連打してください。

# wvdialのインストール、設定
インターリンクLTEとL-03Cを入手したら、ダイヤルアップ接続するためにwvdialをインストールします。
$ sudo apt-get install wvdial
続行しますか?[Y/n]　Yを押します。

wvdial.confを設定します。以下の設定はL-03Cの場合のため、他のLTEモデムとは異なる場合があります。
$ sudo vi /etc/wvdial.conf

```sh:wvdial.conf
[Dialer Defaults]
Modem Type = Analog Modem
Phone = *99***1# 
Username = ********@d1.sim.moe 
Password = ******** 
New PPPD = yes
Carrier Check = no
Auto Reconnect = yes
Stupid Mode = yes

ISDN = 0
Init1 = ATZ
Init2 = ATH
Init3 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init4 = AT+CGDCONT=2,"IP","lte-mobile.jp"
Dial Command = ATD
Baud = 460800
Modem = /dev/ttyUSB2
```
接続確認します。接続する際、Wi-FiがONになっている場合は必ず切断してください。
$ sudo wvdial

インターリンクLTEの契約はSMS送受信オプションもつけてますが、私のほうではいまのところ成功しておりません。

# グローバルIPが割り振られているかの確認
Windowsクライアントなど他の機器からpingを打てば繋がりますが、折角なので簡単なWebサーバを立てて確認します。node.jsでHTTPサーバをつくります。
今回はDownloadsディレクトリにつくります。viコマンドなどで以下のファイルを作成します。
$ vi web.js

```text:web.js
var http = require('http');
http.createServer(function(req,res){
    res.writeHead(200, {'Content-Type':'text/plain'});
    res.end('Hello World\n');
}).listen('8080');
console.log('Server running at http://127.0.0.1:8080');
```
$node web.js
でHTTPサーバを起動します。適当な別の機器のWebブラウザで、http://(インターリンクLTEで割り当てられている固定IPアドレス):8080を叩くとHello Worldが表示されれば成功です。

この記事はここまでになります。
windowsでdocker-toolbox + goのhello world

# 参考
ほぼここのまま
http://qiita.com/macoshita/items/827ae5ac245b94ed4b4c

#docker-toolboxをインストール
https://www.docker.com/products/docker-toolbox


#docker-compose.ymlを作成
```docker-compose.yml
version: '2'

services:
  app:
    image: 'golang:1.6-onbuild'
    volumes:
      - 'data:/go'
      - '.:/go/src/app'
    ports:
      - '8080:8080'
    command: 'go run main.go'

volumes:
  data:
    driver: 'local'
```
```main.go
// main.go
package main

import (
    f "fmt"
)

func main() {
    f.Println("hello world")
}
```



#docker-quickstart-terminalを起動
![0c0999b342b127fedf1b5b4df871572e.png](https://qiita-image-store.s3.amazonaws.com/0/181461/adf2add6-c16f-0a02-cac1-5d1887677fd1.png)


# 実行
```
docker-compose run app go-wrapper download
docker-compose up
```
![6b61b09240dcfcd6c5c19850e61adb10.png](https://qiita-image-store.s3.amazonaws.com/0/181461/8d541666-c8d6-8b42-f156-634061dd2058.png)
iPhoneとVPN接続したりして持ち運んでデモをするRaspberry Pi環境

私は営業先などでVPNの環境を見せたり、望んでいることをその場で実現できる様を見せる機会があるため、Raspberry Piをサーバとして環境を整えました。そのときの環境設定を紹介します。さくらのVPSサーバも持っていますが、手元にサーバを持つことが営業ネタになると思ってつくりました。
この記事は持ち運ぶ目的のために、いろいろな方々のブログを参考にしました。詳しい説明はリンクを貼っておりますのでそちらをご参考ください。それらのブログの内容から必要な箇所を拝借、参照し、一連の動作の流れを説明いたします。私も今年の2月頃からRaspberry Piを触りはじめましたので、わりかし初めての方でもこのページに紹介されている順に設定すると、ひととおり動作するようになっていると思います。

■[Raspberry Pi 3の準備](http://qiita.com/nabepy/items/40c39de8bbb4446a6613)
- 必要なもの　　
- Raspberry Pi 3のインストール
- Raspberry Pi 3の初期設定

■[Raspberry Pi 3とL-03C（前提環境①）](http://qiita.com/nabepy/items/586bce0e45e93e3b9809)
- 必要なもの
- インターリンクLTEの契約
- L-03Cの調達
- cuのインストール、設定
- wvdialのインストール、設定

■Raspberry Pi 3にモニタをつける（前提環境②）
- 必要なもの
- Kuman 3.5インチ ディスプレイ 
- OSOYOO HDMI 3.5インチLCDディスプレイ

■Raspberry Pi 3を持ち運ぶ
- 必要なもの
- Panasonic QE-AL201

■Raspberry Pi 3でいろいろ
- [Raspberry Pi 3をOpenVPNサーバにする（前提環境③）](http://qiita.com/nabepy/items/aed364531dca9d20a079)
    前提環境①の状態で
- [Raspberry Pi 3をAsteriskサーバにする](http://qiita.com/nabepy/items/3e3d79670b9c0d0e1982)
    前提環境③の状態で
- Raspberry Pi 3でOpenCVを使う
　※予定
 　前提環境②の状態で
- Tensorflow 

■今後やる予定メモ(2017/5/7現在)
・音声認識
・FM送受信

■(番外)
「Raspberry Pi 3の準備」とは別にRaspberry Pi  Zero Wで実施した
・piromoriから輸入
・はんだづけ
・設定
　技適がまだ通っていないため、キーボード、モニタはUSB接続にて設定
 
 # スキル
 linuxシェルコマンド

この記事はここまでになります。
リフレクションを利用してmainメソッドを呼び出したい


たとえばコマンドラインツールを開発していると、`main`メソッドをテストしたりデバッグしたりしたいということがあります。そのような場合リフレクションを使うと便利ですが、どのようにすれば`main`メソッドをリフレクションから実行できるでしょうか? その結論が以下のサンプルです。

```java
try {
    Method mainMethod = Sample.class.getMethod("main", String[].class);
    String[] args = {"arg1", "arg2", "arg3"};
    mainMethod.invoke(null, (Object) args);
} catch (NoSuchMethodException 
            | SecurityException 
            | IllegalAccessException
            | IllegalArgumentException
            | InvocationTargetException e) {
    e.printStackTrace();
    throw new RuntimeException(e);
}
```

ポイントとしては`invoke`でしょうか。__第1引数に`null`を与えて、以降の可変長引数部分は`Object`にキャストした`args`を指定する。__この2点を守って楽しくリフレクションしましょう(´・ω・`)
5. FUJITSU Cloud K5の検証は止まっています(解決済み)

このページは、
FUJITSU Cloud サービス K5 を使ってみる - Qiita
http://qiita.com/ynott/items/a256669c692625c5fd25
の「5. FUJITSU Cloud K5の検証は止まっています(問い合わせ中)」のページです。

さてさて、K5 を使ってみてレポートしてみたら面白そうだよね～ぐらいの軽い感覚で開始した
この「FUJITSU Cloud サービス K5 を使ってみる」ですが、検証が止まってしまっています。

どこで止まっているかと言いますと、

【デモ動画（全体）】K5 IaaS仮想システム作成の流れ～ポータル利用編～
https://www.youtube.com/watch?v=rHGzkoxT0Ww

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/29d817e5-7515-c1f7-567f-97b07aa55b17.png)
の「①内部ネットワークの作成」です。


まず、内部ネットワークを作成する時には「ネットワーク」の「仮想ネットワーク」から右上の「＋」ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/7eca10b8-4bfd-dcba-bd4d-53ff0636ab91.png)

すると、仮想ネットワーク作成画面が表示されるので、一つずつ入力していきます。

## 1. 仮想ネットワークを指定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/3f572624-c3ab-0d23-10df-16f2455002ac.png)

## 2. サブネットを指定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/2932ffc8-c7d6-2ecd-680f-a9ed374ceff7.png)

## 3. サブネット詳細を指定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/9bc26084-1c39-0e46-f4cb-e2f5a1272858.png)

でOKなのですが、最後で「作成」ボタンを押すとしばらくして、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/1203e06a-bdd3-65fe-8637-318e0196a5c3.png)
が出ます。。。

残念。

今、サポートデスクに問い合わせ中です。

解決したら、こちらにアップしようと思います。

まだ解決していませんが、以下の様に一応、仮想ネットワークは作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/a09326d2-c501-5b1c-aaf4-d40723adb0ae.png)

サブネットの状態は、以下の様な感じ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/ae10eb31-f158-a44c-4793-60ec3ab64c2a.png)

サブネットに何も入ってないのは、正しいのかどうか判断がつきません。
私の単なる勘違いならいいのですが。。。
ripple-libからrippledに接続する手順

バッチなどで都度接続するやり方です

# npmインストール

```
npm i ripple-lib
```

# nodejs6

[チュートリアル](https://ripple.com/build/rippleapi-beginners-guide/)にのっているがこんな感じ


```
'use strict';
const RippleAPI = require('ripple-lib').RippleAPI;

const ripple_main = (api) => {
    return api.getLedger().then(res => res.ledgerVersion).then(current_ledger => {
        // 行いたい処理
    })
}

const main = () => {
    const api = new RippleAPI({server: 'wss://s1.ripple.com:443'});
    api.on('connected', () => {
        console.log('Connection is open now.');
    });
    api.on('disconnected', (code) => {
        if (code !== 1000) {
            console.log('Connection is closed due to error.');
        } else {
            console.log('Connection is closed normally.');
        }
    });
    return api.connect().then(() => ripple_main(api) ).
        then(() => api.disconnect() ).
        then(() => process.exit(0)).
        catch(console.error);
}

main()
```

# nodejs7

async / await版

```
'use strict';
const RippleAPI = require('ripple-lib').RippleAPI;

const ripple_main = async (api) => {
    const current_ledger = await api.getLedger().then(res => res.ledgerVersion)
    // 行いたい処理
}

const main = async () => {
    const api = new RippleAPI({server: 'wss://s1.ripple.com:443'});
    api.on('connected', () => {
        console.log('Connection is open now.');
    });
    api.on('disconnected', (code) => {
        if (code !== 1000) {
            console.log('Connection is closed due to error.');
        } else {
            console.log('Connection is closed normally.');
        }
    });
    await api.connect()
    await ripple_main(api)
    await api.disconnect()
    return process.exit(0)
}

main().catch(console.error)
```

# ps 

process.exit(0)入れないと接続が切れないことがある
公式のチュートリアルにもあるんだよな
この問題昔からあった気がする
https://github.com/you21979/node-ripple-trade-helper/issues/8
これに関連？ http://qiita.com/you21979@github/items/cad9f5f6fa77e9d36107
swift クロージャ 省略記法 $0

##クロージャの文法

```
 { ( parameters ) -> return type in 
    statements
}
```
 
 
一般的に以下のような記述があったとします。

```
let array = [“Taro”, “Hanako”, “Jiro”, “Aki”, “Jun"]
func later(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}

var sortArray = array.sorted(by: later)
```

`sorted(by:)` メソッドは配列の内容と同じ型の2つの引数を取り、Bool値を返すことで、1つ目の値が2つ目の値の前後に並べ替えるかを示します。
今回の例では、配列の内容がString値のため、`(String, String) -> Bool`  型のクロージャを必要とします。


クロージャの文法通りに正しく記述するとなると以下のようになります。
クロージャ式構文の引数は、デフォルト値を持つことができません。

```
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})
```

このインラインクロージャの引数と返り値の型の宣言は、先ほどの later(_: _:)関数の宣言と同じになっています。そのためどちらも `(s1: String, s2: String) -> Bool` と書かれています。

クロージャの本文は`in` から開始されます。この`in` はクロージャの引数と返り値の型宣言が終了したことを明示します。
そのため、1行にして記述することもできます。
クロージャの本文が複数行になる際は、`;`で区切ることで1行に記述することも可能ですが、swiftらしい記述ではありません。

```
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 })
```


##型推論
{}内は`sorted(by:)`メソッドの引数として渡されるため、Swiftでは引数と返り値の型推論が可能です。今回の場合では、(String, String) -> Boolの型でないといけないため、クロージャ内で型の定義を省略できます。全ての型が推論出来るため、矢印`->`と引数を囲う括弧もまた省略されます。

```
reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 })
```

##暗黙的な戻り値
単一式クロージャでは暗黙的にその結果を返すことが出来ます。そのため、宣言から`return`を省略することができます。

```
reversedNames = names.sorted(by: { s1, s2 in s1 > s2 })
```

この省略は必ずしも適用出来るわけではないですが、今回では、`sorted(by:)`メソッドの引数にはBool値がクロージャにて返されなければ行けません。クロージャ本体ではBool値を返す単一式(s1 > s2)が含まれているため、`return`を省略することができます。


##引数名の省略
Swiftのインラインクロージャでは、簡略化された引数名を提供しています。クロージャの引数の値を `$0,$1,$2…`で参照することができます。
クロージャの式内でこれらの短縮形の引数を使用する際に、クロージャの引数のリストもまた省略することが出来ます。省略された名前と型は、関数の型から推測されます。そして、クロージャの本文のみで構成されているため、`in`も省略できます。

```
reversedNames = names.sorted(by: { $0 > $1 })
```

`$0`が第一引数、`$1`が第二引数を参照します。


###参考
Apple公式ドキュメント
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94
【Rails】deviseでUserの子要素のvalidationにcurrent_userを使いたい

ユーザー(User)が複数の記事(article)を一対多で持っている。
そしてユーザーは記事の作成・更新・削除を行うことができる。

このような実装を行った際、記事の所有者がdeviseのヘルパーであるcurrent_useであることをチェックするためにタイトルのような処理が必要となりました。

更新処理時のチェックとなるとモデルで行った方が自然。
しかしdeviseのヘルパーcurrent_userですが、モデルでは使用することができません。

その為更新処理前にモデルに対してcurrent_userを渡してあげる必要がありました。
データ更新処理の前に __@article.current_user = current_user__ を追加します。

## 実装

```rb:articles_controller.rb
...(省略)
  def update
    @article = Article.find(params[:id])
    @article.current_user = current_user  # これを追加
    if @article.update_attributes(article_params)
      flash[:success] = "記事を更新しました"
      redirect_to articles_url
    else
      render 'edit'
    end
  end
...(省略)
```

これでモデルにcurrent_userが受け渡されたので、モデル側のバリデーションに使うことができます。

```rb:article.rb
...(省略)
  validate :check_user
  attr_accessor :current_user
...(省略)
  def check_user
    errors[:current_user] = "user does not have permission" unless user == current_user
  end
```

これでたとえば
http://[ドメイン]/articles/[article.id]
にURLで直接アクセスし、更新したり、POSTで更新を行ったとしても更新エラーとなります。

## その他

これで更新時に記事の所有者チェックが行われるようになりました。
しかし実際には更新画面に遷移させないべきですし、削除時にはvalidationが動いてくれないため、
before_destroyの使用やコントローラーでのチェックが必要となります。
deviseは便利で頼もしいgemですが標準ヘルパーのみで油断していると致命的なセキュリティ問題を抱えかねませんので注意していきたいですね。

もし関連付け段階でもっといい実装方法などありましたら、教えていただけると大変ありがたいです。
35歳だけどRailsチュートリアルやってみた。[第4版 8章 8.3 ログアウト まとめ&解答例]

#はじめに
最近、プロジェクト管理業務が業務の大半を占めており、
プログラムを書く機会がなかなかありません。

このままだとプログラムがまったく書けない人になってしまう危機感（迫り来る35歳定年説）と、
新しいことに挑戦したいという思いから、
[Ruby on Rails チュートリアル実例を使ってRailsを学ぼう 第4版](https://railstutorial.jp/)を学習中です。
業務で使うのはもっぱらJavaなのですが、Rails楽しいですね。


これまでEvernoteに記録していましたが、ソースコードの貼付けに限界を感じたため、
Qiitaで自分が学習した結果をアウトプットしていきます。

個人の解答例なので、誤りがあればご指摘ください。

##8.3 ログアウト
###本章での学び
####セッションの破棄
セッションの破棄は、`destroy`アクションで行う。

####セッションの破棄
セッションからユーザIDを削除するために、`delete`メソッドを使用する。
（DELETEリクエストを発行する）
結果、ユーザIDはnilになる。

```
session.delete(:user_id)
```

####log_outメソッドの実装
Sessionヘルパーにlog_outメソッドを実装する。

```
def log_out
  session.delete(:user_id)
  @current_user = nil
end
```

####log_outメソッドの呼び出し
Sessionsコントローラの`destroy`アクション内で、log_outメソッドを呼び出す。
ログアウト後は、トップページへリダイレクトさせる。

```
def destroy
  log_out
  redirect_url root_url
end
```

####ログアウト機能のテスト
0.ログイン中であることを確認する

```
  assert is_logged_in?
```

1.ログアウトパスへDELETEリクエストを送信する

```
  delete logout_path
```

2.ログイン中ではないことを確認する

```
  assert_not is_logged_in?
```

3.リダイレクト先がトップページであることを確認する

```
  assert_redirected_to root_rul
```

4.リダイレクトする

```
  follow_redirect!
```

5.ログインリンクが表示されていることを確認する

```
  assert_select "a[href=?]", login_path
```

6.ログアウトリンクが表示されていないことを確認する

```
  assert_select "a[href=?]", logout_path, count: 0
```

7.ユーザープロフィールリンクが表示されていないことを確認する

```
  assert_select "a[href=?]", user_path(@user), count:0
```


###演習1
*ブラウザから [Log out] リンクをクリックし、どんな変化が起こるか確認してみましょう。また、リスト 8.31で定義した３つのステップを実行してみて、うまく動いているかどうか確認してみましょう。*

ログイン状態画面を表示する。

![image](https://qiita-image-store.s3.amazonaws.com/0/98130/a5804bd6-19f0-3654-4b14-baf50bda1bde.png)

Cookiesにも値が入っていることを確認。

![image](https://qiita-image-store.s3.amazonaws.com/0/98130/74758e09-c4bd-33bf-e58e-bef7f638731b.png)

`Log out`リンクをクリックすると、トップページに遷移することを確認。
ログアウトリンク、ユーザプロフィールリンクが表示されていないことを確認。

![image](https://qiita-image-store.s3.amazonaws.com/0/98130/eb573c5a-cf9c-a8e1-5058-4f8435f66c4a.png)

###演習2
*cookiesの内容を調べてみて、ログアウト後にはsessionが正常に削除されていることを確認してみましょう。*

sessionの値が変わっていることを確認。

![image](https://qiita-image-store.s3.amazonaws.com/0/98130/ac01f3b3-5f9e-1d53-07ba-fed0cfe9b9a8.png)


#おわりに
ついに8章が終わりました。
だんだん難しくなってきましたが、なんとか終了することができました。
かなり現場の開発に近い実践的な内容で、非常に楽しいです。
大変ですが楽しみながら、紙一重の努力を積み重ねていきます。
Ruby on Railsで、DBのテーブルの構造を変えるためにマイグレーションファイルを作成する

Ruby on Railsでのアプリ作成時、データベースのテーブルの構造を変えたい時に必要な手順をメモ。
テーブルの構造を変える…カラムを削除/追加する、とか

#テーブルの構造を変える時はマイグレーションファイルを作成する
テーブルを作成するときと同様、構造を変える時もマイグレーションファイルを作成する。以下をターミナルで実行。
(rails g migrationに続けてクラス名を指定する。)

```:ターミナル
 # bundle exec rails g migration Add(クラス名)To(テーブル名) (カラム名):(型)
 $ bundle exec rails g migration AddNicknameToUsers nickname:string
 # => マイグレーションファイルの作成
```
これを実行するとマイグレーションファイルが作成される。
次に、マイグレーションファイルを変更して、テーブルの構造を書き変える。


#マイグレーションファイルを編集する
マイグレーションファイルを確認すると、以下ような内容のファイルができている。

```ruby:db/migrate/20170514114058_add_rate_to_products.rb
class AddRateToProducts < ActiveRecord::Migration
  def change
  end
end
```
このchangeメソッド内に記述する。

追加したい時はadd_column。

```ruby
add_column :テーブル名, :カラム名, :カラムの型
```
削除したい時はremove_column。


```ruby
remove_column :テーブル名, :カラム名, :カラムの型
```
記述例は以下の通り。


```ruby:db/migrate/20170514114058_add_rate_to_products.rb
class AddRateToProducts < ActiveRecord::Migration
  def change
    add_column :books, :price, :integer
  end
end
```

#rake db:migrateを忘れずに

```:ターミナル
$ bundle exec rake db:migrate
== AddPriceToBooks: migrating ==========================
-- add_column(:books, :price, :integer)
   -> 0.0500s
```

#マイグレーションファイルを作成する理由
Sequel Proなどのアプリケーションは、データベースを直接操作することができる。しかし、複数人で開発を行う場合、アプリケーション上で操作すると、個々人でデータベースが異なる、ということになってしまう。それを避ける為、データベース操作の際には、必ずマイグレーションファイルを作成して操作する必要がある。
DBpediaから緯度経度を持つ世界遺産データだけを取得する

# はじめに
日頃、世界遺産データを集めたDBを作りたいと思っています :map: 
そこで今回は、wikipediaをLOD(Linked Open Data)化した[DBpedia](http://wiki.dbpedia.org/)をデータソースとして、世界遺産のデータを取得したいと思います。
取得したいデータ項目については以下にまとめました。
概要・画像は必須としたいところですが、データとして紐付いていない世界遺産が覗かれてしまうことを防ぐため、必須としません。

- 取得したいデータ
    - 世界遺産名
    - 緯度
    - 経度
    - 概要(あれば)
    - 画像(あれば)
  



# SPARQL 
PREFIXのURIを調べるには、[prefix.cc](http://prefix.cc/)を使うのがオススメです。
DBpediaのSPARQL Endpointは、[こちら](http://dbpedia.org/sparql)。
Endpointを開いたら、Query TextにSPARQLを入力して、Run QueryをクリックすればOK。
ちなみに、Result Formatで、HTML, XML, JSON, Turtleなど出力フォーマットをお好みで選択できます。

```
PREFIX geo:  <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>

select distinct ?name ?lat ?long ?abstract  where {
?s rdf:type dbo:WorldHeritageSite.
?s rdfs:label ?name.
?s geo:lat ?lat.  
?s geo:long ?long.

optional {
?s foaf:depiction ?depict.
?s dbo:abstract ?abstract.
}
FILTER ( lang(?name) = "en" )
FILTER ( lang(?abstract) = "en" )
}
```

今回の肝となる世界遺産データの判定には、`dbo:WorldHeritageSite.`を用いました。
`?s rdf:type dbo:WorldHeritageSite.`の通り、`rdf:type`が`dbo:WorldHeritageSite.`であるsubjectを取得しています。
基本的には、これで一発でDBpediaから世界遺産データだけを取得することができます。 

このフィルター後、世界遺産名、緯度、経度を順に`?name`、`?lat`、`?long`の変数に当てます。
orが表現できる`optional`句を用いて、概要、画像を順に`?depict`、`?abstract`の変数に当てます。

最後に`FILTER`句を用いて、世界遺産名・概要データは英語表記であるものだけに絞りました。
これをつけておかないと、多言語表記のデータも取得してしまいます。 
`lang`関数を用いて、表記言語を判定しています。

# おまけ:どれくらい網羅しているの? 
```
PREFIX geo:  <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>

select distinct count(?name) where {
?s rdf:type dbo:WorldHeritageSite.
?s rdfs:label ?name.

FILTER ( lang(?name) = "en" )
}
``` 
こちらのSPARQLを投げてみたところ、取得できた世界遺産データは、713件でした。
日本ユネスコ協会の[こちらのページ](http://www.unesco.or.jp/isan/about/)によると、登録されている世界遺産は1052件(2016年12月現在)。
このデータを参考にすると、DBpediaの世界遺産データの網羅率は、約68%。 (2017年5月)

DBpediaの情報元はwikipediaであるので、情報の更新/LODへの変換等の理由のためにすべてを網羅できていないのでしょう。
または、今回は`dbo:WorldHeritageSite`を用いたが別のresourceを使うと違った結果になるだろう。
どんなschemeでどんな属性がついているかぱっとわからないことは、LODの難しさだとは思う。
golangの競技プログラミング用の実践メモ

必要な時に思い出したい操作をメモ。あと似たような操作はこれ起点にググれるように。
一部パッケージは省略しています。

# 標準入力
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

var sc = bufio.NewScanner(os.Stdin)

func read() string {
	sc.Scan()
	return sc.Text()
}

func main() {
	sc.Split(bufio.ScanWords) // スペース区切りの設定
	// sc.Split(bufio.ScanLines)    // 一行丸ごと読む設定
	n, _ := strconv.Atoi(read()) // int
	str := read()                // string

	// array
	a := make([]int, n)
	for i := 0; i < n; i++ {
		a[i], _ = strconv.Atoi(read())
	}

	// map
	m := map[int]int{}
	for i := 0; i < n; i++ {
		m[i], _ = strconv.Atoi(read())
	}

	// 中身の確認用
	fmt.Println(n, str, a, m)
}
```
基本の処理です。コピペで使えるように全文貼っておきます。

# 標準入力（一度に最後まで読む場合）
```go
sc := bufio.NewScanner(os.Stdin)
a := []string{}
for sc.Scan() {
	a = append(a, sc.Text())
}
```
入力値から入力の終わりがわからない場合はこっち。

# 文字列を一文字ずつ舐める
```go
str := "hello"
for i, v := range str {
	fmt.Println(i, string(v))
}
```

# 文字列を指定した文字で分割
```go
str := "23x2x97x0"
fmt.Println(strings.Split(str, "x"))
```
ちなみに、ホワイトスペースで区切るなら strings.Fields(string) を使います。

# スライスとマップの宣言
```go
array1 := []int{} // 中身を入れて宣言できる
array2 := make([]int, 0) // 長さを指定して宣言できる
m := map[string]bool{}
```
まだ忘れがちなのでメモ。

# 指定した位置の要素を削除
```go
func delete(a []int, i int) []int {
	a = append(a[:i], a[i+1:]...)
	return a
}
// a = delete(a, i)
```
```go
func delete2(a *[]int, i int) {
	tmp := *a
	*a = append(tmp[:i], tmp[i+1:]...)
}
// delete2($a, i)
```
二種類書いておきます。条件にもよりますが、大抵の場合は上の方が高速です。
※mapならdelete(m, key)で消せます。
※じゃあmapでいい気がしますが、ソートが使えなかったりrangeで取り出す順番がランダムだったりするので使い分けですね。

# ソート
```go
array := []int{5, 1, 4, 2, 3}
sort.Sort(sort.IntSlice(array))
```
[]intの場合はこれ。

# すでに走査した値を記憶する
```go
type point struct {
	x, y int
}

func (e point) key() string {
	return fmt.Sprintf("%v", e)
}

func main() {
	visited := map[string]bool{}

	pt := point{0, 0}

	key := pt.key()
	if visited[key] {
		// すでに到達済みの場合の処理
	}
	visited[key] = true

	// まだ到達していない場合の処理
	// etc...
	
	// 中身の確認用
	// fmt.Println(visited)
}
```
手っ取り早く枝刈りする場合に。必要に応じてkeyの表現を変えて使います。

# スライスの内容まで見る比較
```go
reflect.DeepEqual(array1, array2)
```
あまり使わなそうですが必要になったので。
なおなお・ArchLinux インストール覚書

[ArchLinux インストール覚書](http://qiita.com/katz_engineer/items/f032a24cb273c4eb6669)より始めたArchLinuxプロジェクト。btrfsにおけるスナップショットを整備しました。

この時点でスナップショットに手を出したのは、[ちょっとした目論見](http://qiita.com/katz_engineer/items/d0404a896f2faa267fb8)がありましてですね。その話は別稿にて。

# ディレクトリ構造の仕様

どうでもいい部分に関しては前例を踏襲した方がいい。というわけで[Snapper](https://wiki.archlinuxjp.org/index.php/Snapper)を参考にします。この通りではなくて一捻りしますが。

```
(subvolid=5)
 │
 ├─ @ : 使用中のルートファイルシステム
 │  │
 │  ├ usr
 │  ├ bin
 │  ├ ...
 │  │
 │  └ .snapshots : @のスナップショットの格納場所
 │     │
 │     ├ ＜年月日時分秒＞.ss  : @のスナップショット
 │     ├ ＜年月日時分秒＞.txt : スナップショットの注釈を格納するテキストファイル
 │     ├ ...
 │
 ├─ 他のサブボリューム
```

スナップショットとはサブボリュームであり、ディレクトリ構造で見ればファイルではなくてディレクトリですが、拡張子 .ss を付けます。これは注釈を残しておきたいと考えたからです。注釈の方は普通のテキストファイルとして拡張子 .txt を付けます。こいつと区別するために拡張子を付けときたいのでした。

ファイル名の方を番号ではなくて日時にしているのは、番号の計算とかそういう一手間を省きたかったからです。スクリプトを組むならどうにでもなりますが、最初は手でコマンドラインをいじる事になりますので、簡単な方法で取得できて、それなりに順番を表現できるファイル名にしたかったのでした。

そもそも最初から[Snapper](https://wiki.archlinuxjp.org/index.php/Snapper)使えばいいじゃん、という意見は却下。仕事ならそれも検討しますけど、そもそも趣味全開で勉強を兼ねてやってる作業ですから。動作原理などを理解する為に、手作業で賄える範囲は可能な限り手作業で賄いたいのです。

# 作業

## スナップショット格納場所 /.snapshots を作成

何の捻りもありません。

```
# mkdir /.snapshots
```

## スナップショットを作る実験

btrfs のスナップショットについてはぐうぐる先生がこれでもかってくらい教えてくれますので、ここでは詳細は省略。

```
# fn=$(date +%Y%m%d%H%M%S)
# btrfs subvolume snapshot -r / /.snapshots/$fn.ss
Create a readonly snapshot of '/' in '/.snapshots/20170514202947.ss'
# echo test of snapshot >/.snapshots/$fn.txt
```

## スナップショットを軽く確認

btrfs のサブボリュームとしてどう見えているかを調べてみます。

```
# btrfs subvolume list /
ID 258 gen 684 top level 5 path @
ID 266 gen 678 top level 258 path var/lib/machines
ID 267 gen 683 top level 258 path .snapshots/20170514202947.ss
```

きちんとサブボリュームになっているようです。
次に、書き込み禁止になっているかを調べてみます。

```
# echo test >/.snapshots/$fn.ss/test.txt
-bash: /.snapshots/20170514202947.ss/test.txt: Read-only file system
```

やった:thumbsup:
Erlang mapsの関数 "簡易" 説明

# Erlang mapsの関数 "簡易" 説明

mapsの関数はどんなものがあるのか、1行の簡単な説明とサンプルコードを記載。
詳しい情報は公式リファレンス参照。

元ネタ(公式リファレンス) http://erlang.org/doc/man/maps.html

すぐ機能を探して確認できて、どう動くかざっくり把握できるように記述。
解説の順番は、主観に基づく重要度で並べました。

このページのTODO:

* ほぼ書きっぱなしなので、間違いがないか見直す。
* 余裕があればもうちょっとマシな肉付けをする。しかし、どうせ書くなら、別のライブラリを増やしたいところ。
* サンプルコードも要改善

## 空のMapsを作成する - maps:new/0

```
M0 = maps:new(),
```

## Mapsに値を追加する - maps:put/3

```
M1 = maps:put(a, 1, M0),
M2 = maps:put(b, 2, M1),
M3 = maps:put(c, 3, M2),
M4 = maps:put(d, "abc", M3),
M5 = maps:put(e, <<"アイウエオ"/utf8>>, M4),   
```
    
## Mapsから値を取得する - maps:get/2, maps:get/3

```
1 = maps:get(a, M5),
not_found = maps:get(g, M5, not_found),
```

## Mapsから値を削除する - maps:remove/2

```
M4 = maps:remove(e, M5),
M3 = maps:remove(d, M4),
```
    
## Mapsから値を探して取得する - maps:find/2

```
{ok,_} = maps:find(e, M5),
error  = maps:find(g, M5),
```

## Mapsに指定のキーがあるか確認する - maps:is_key/2

```
true  = maps:is_key(a, M5),
false = maps:is_key(x, M5),
```

## Mapsに登録されたデータ数を得る - size/1

```
5 = maps:size(M5),
1 = maps:size(M1),
0 = maps:size(M0),
```
    
## Mapsに登録されたキーのリストを得る - keys/1

```
[a,b,c] = lists:sort( maps:keys(M3) ),
```

## Mapsに登録された値のリストを得る - values/1

```
[1,2,3] = lists:sort( maps:values(M3) ),
```

## Mapsをキーと値のタプルのリストにする - to_list/1

```
[{a,1},{b,2}] = maps:to_list(M2),
```

## キーと値のタプルのリストからMapsを得る - from_list/1

```
M2 = maps:from_list([{a,1}, {b,2}]),
```

## Mapsに任意のふるいをかけて新しいMapsを作る - filter/2

```
FilterdM = maps:from_list([{a,1},{c,3}]),
FilterdM = maps:filter(fun(_K, V) -> (V rem 2) =:= 1 end, M3),
```

## Mapsに畳み込み演算を行う - fold/3

```
6 = maps:fold(fun(_, V, Acc) when is_integer(V) -> V+Acc;
                 (_, _, Acc) -> Acc
              end,
              0,
              M5),
```

## Mapsの各値に対して任意の加工を行った結果を返す - map/2

```
NewMap = maps:from_list([{a,10},{b,20},{c,30}]),
NewMap = maps:map(fun(_K, V) -> V*10 end, M3),
```

## 2つのMapsをマージする - merge/2
% 同じキーがある場合、2つ目のMapsの値を優先する

```
MapA  = maps:from_list([{a,10},{b,20}]),
MapB  = maps:from_list([{a,1}, {c,30}]),
MapAB = maps:from_list([{a,1}, {b,20}, {c,30}]),
MapAB = maps:merge(MapA, MapB),
```

## Mapsの任意のキーの値を更新する - update/3

```
UpdateMap1 = maps:from_list([{a,1},{b,2}]),
UpdateMap2 = maps:from_list([{a,10},{b,2}]),
UpdateMap2 = maps:update(a,10, UpdateMap1),
```

## Mapsの任意のキーの値を関数を用いて更新する - update_with/3

```
UpdateMap2 = maps:update_with(a, fun(V) -> V*10 end, UpdateMap1),
```

## update_with/3から、もしキーがなかった場合のデフォルト値を指定できる関数 - update_with/4

```
UpdateMap3 = maps:from_list([{a,1},{b,2},{c,3}]),
UpdateMap3 = maps:update_with(c, fun(V) -> V*10 end, 3, UpdateMap1),
```

## Mapsから指定のキーのみでMapsを再作成する - with/2

```
WithKeys = [a,c],
WithMap1 = maps:from_list([{a,1},{b,2},{c,3}]),
WithMap2 = maps:from_list([{a,1},      {c,3}]),
WithMap2 = maps:with(WithKeys, WithMap1),
```

## with/2と逆に指定のキー以外でMapsを再作成する - without/2

```
WithMap3 = maps:from_list([{b,2}]),
WithMap3 = maps:without(WithKeys, WithMap1),
```

## Mapsから任意のキーの値と、そのキーを削除したMapsを返す - take/2

```
{2, M1} = maps:take(b, M2),
```
x軸 y軸の取得　基本メモ

```js
function mouseFn(){
　let hover_target = $('.other_hover_2');
  let mouse_e = {
    parentOffset : hover_target.offset(),
    play : function(e){
      relX = e.pageX - this.parentOffset.left;
      relY = e.pageY - this.parentOffset.top;
      hover_target.find('要素').css({top:relY, left:relX})
    },
  };
    hover_target.on('mouseenter mouseout', function(e) {
      mouse_e.play(e);
    })
};
```

ポイントは引数の参照とoffset()の利用が大事かなと個人的に思います。

では、参考までに
レイヤーを指定したフレーム数でずらしていく

```js
var myCompFrame = app.project.activeItem.frameRate;
var target=1;
var myTime =target/myCompFrame;
var myLay=app.project.activeItem.selectedLayers;
//alert(myLay.length)

for (var i=0; i<myLay.length; i++){
    
var set=myLay[i].inPoint=myTime+[i/myCompFrame]; 
    }
```
このコードでは１フレずつずれていきます。


#15フレーム毎にずらしたいなら


```jsx
var myCompFrame = app.project.activeItem.frameRate;
var myCompDur = app.project.activeItem.duration;
var target = "0:00:15"; //frame
var adtime = currentFormatToTime(target, myCompFrame, myCompDur);
var myLay = app.project.activeItem.selectedLayers;

app.beginUndoGroup("");
    for (var i=0; i<myLay.length; i++){
        myLay[i].inPoint = adtime*i;
        myLay[i].outPoint = myCompDur;
    }
app.endUndoGroup();

```
CentOS で docker 使う時に

docker-py が無いと言われる。提供しているパッケージは二つある。

```
[matsudak@localhost apps]$ yum info docker-python python-docker-py
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Available Packages
Name        : docker-python
Arch        : x86_64
Version     : 1.4.0
Release     : 115.el7
Size        : 94 k
Repo        : extras/7/x86_64
Summary     : An API client for docker written in Python
URL         : http://www.docker.com
License     : ASL 2.0
Description : An API client for docker written in Python

Name        : python-docker-py
Arch        : noarch
Version     : 1.10.6
Release     : 1.el7
Size        : 101 k
Repo        : extras/7/x86_64
Summary     : An API client for docker written in Python
URL         : https://github.com/docker/docker-py/
License     : ASL 2.0
Description : An API client for docker written in Python
```

→ とりあえず `yum install docker-python` で動いた 

→ だめだった

```
Package docker-python is obsoleted by python-docker-py, trying to install python-docker-py
```

python-docker-py がいいっぽい
golangのお勉強5 + apex + lambda


## intellijの環境とディレクトリ

* ディレクトリ
	* 素直に$HOMEのGOPATHを使いsrcもvendorもとりあえず使わない
	* HOMEの配下にmyprojectとか適当なディレクトリでとりあえず作成
* 設定
	* global libなどgo側の設定だけだと変更できなかったのでdirectories設定から追加（必要なぶんだけ）
	* direnvもカレントだけ設定するだけ
	* goがわの設定のproject libraryも特に使わない

Documentation · go-lang-plugin-org/go-lang-idea-plugin Wiki
https://github.com/go-lang-plugin-org/go-lang-idea-plugin/wiki/Documentation

* gitを呼び出すときにgofmtできる
* find usagesで用法が検索できるので便利らしい（gopathが統一されてるから事例が調べやすいのかな）
* デバッグにはdelveをつかうらしい

## ビルドを早くする

Goでビルドが遅くなってきたらやってること - Qiita
http://qiita.com/kai-zoa/items/464471b71c682dd3bb83

> 原因になっていそうなライブラリを事前にビルドして、$GOPATH/pkgにアーカイブをインストール

* `go build -x`で詳細が観れる
* `go build -i`で事前にアーカイブできる
* `go clean -i`でアーカイブを除去

## go import

MacにGo言語の開発環境を構築する【IDE編】 | フリップフラップ
http://blog.flup.jp/2016/02/17/dev_golang_intellij/

> この機能を使う注意として、先ほどのvendorをExcludedしていないと、glide upとかした時に追加された外部パッケージにも走ってしまい、予期しない不具合が生じてしまうことがあります（実際、ビルドエラーになってハマりました）。

------------------------------------------------------------------------------------------------
	なるほど。。vendorじゃないけどグローバルのGOPATHをよんでるからなあ。。編集可能性があるぶんだけにすべきかも。
------------------------------------------------------------------------------------------------

## ゴリラmux

go - Gorilla Mux for sub path Routing - Stack Overflow
http://stackoverflow.com/questions/28351063/gorilla-mux-for-sub-path-routing

値の取得は`articleId := mux.Vars(req)["article_id"]`

## swaggerで生成されるファイルとのパスの兼ね合い

ステージをbasepathにしているからなのか、どうもうまくいかない。
router.goを手動で変更。
（どのみち生成されたファイルはそのままではちゃんと動かなかったのですでに手が入っている。）
swagger-editorと綺麗に同期したまま実装が進められればいいのになあ。
いまのところはできないので、プロキシ統合はざっくりルートからやってしまって、
あとはコードでルーティング。

## flagパッケージ

Go言語でコマンドラインオプションを扱う — そこはかとなく書くよん。
http://tdoc.info/blog/2013/04/11/go_flag.html

便利ね。

## apexの使い方の例

ApexでAWS Lambdaファンクションを管理する ｜ Developers.IO
http://dev.classmethod.jp/cloud/aws/how-to-manage-aws-lambda-functions-with-apex/

`--dry-run`とかfunction.jsonとかあるのか。。
フック機能も便利だな。。
`apexignore`でコンパイル前のソースは除外するのか。。

## エラーが出る

なかなか解決しない。。

https://github.com/golang/go/issues/16570
Getting Started - The Go Programming Language
https://golang.org/doc/install#uninstall
SVNからGitへ移行/リポジトリの分割/リポジトリの階層構造変更　まとめ

これまで使っていた会社のSubversionをGitへ移行した時の備忘録。
移行の際、リポジトリの分割作業も行ったので合わせてまとめる。補足情報は箇条書きで記載している。

# SVNからGitへ移行
SVNからの移行は、GitにSVN連携用のgit svnコマンドが用意されている。基本的な流れは以下。

1. git svn initでSVNと連携したGitのリモートリポジトリを作成。
1. git svn fetchでSVNからデータを取り出し。
1. 途中Warrningで処理がストップした場合は、git pruneの後に再度git svn fetchで再開する。
1. 全てfetchし終えたら、git gc --aggressiveでガーベジコレクトする。

まずは、initとfetchから。

```bash
$ git svn init --no-metadata --trunk=/ (SVNリポジトリのパス) (Gitリモートリポジトリのパス)
$ git svn fetch
```
- 上記のコマンドを一括で行える、git svn cloneコマンドもあるが、移行処理中に失敗した為、今回は使用しなかった。
- --trunkオプションは、SVNのリモートリポジトリがルート直下に展開されたtrunkしか無かった為、そのままルート（/）を指定。
- --no-metadataは、SVNのメタ情報を含めない為に指定。

fetch中にWarrningが出ることがあるので、その時はgit pruneを使って綺麗にする。

```bash
$ git prune
$ git svn fetch　（止まった所から再開される）
```
全て取得し終わったら、git gc --aggressiveコマンド（ガーベジコレクト）で、圧縮する。

```bash
git gc --aggressive
```
git log で正常に移行されているかを確認し、問題なければ移行完了。

- 再度git svn fetchでSubversionのコミットを反映させる場合は、git svn fetchの後に、git merge --no-ff (リモートのパス名)で可能。

# リポジトリから特定のディレクトリを履歴ごと削除
移行作業の本当の闘いはこれからである。なぜなら、私の会社のSVNリポジトリは9GBほどに及ぶ為、このまま使うとGitのお手軽さが完全に失われる。（cloneに30分かかるとか...）

なので、まずはGitに移行したリポジトリ内で分割できそうなところは分けることにした。

例）repos.git内のarchiveディレクトリを、archive.gitとして別リポジトリに分割

```:分割前
+ repos.git
  + archive
  + web
  + database
  + …
```

```:分割後
+ repos.git
　　+ web
　　+ database
　　+ …

+ archive.git
　　+ archive
```

1. Gitの共有リポジトリから作業スペースにclone
1. git filter-branch を使って、履歴ごとファイルを削除
1. 後は別途共有リポジトリを作り、そこへpushする
1. 分割したいリポジトリ分、これを繰り返す。

- １．の作業スペースは、ある程度スペックの高いLinuxサーバで行うことをお勧めする。git filter-branchコマンドは重い処理かつリポジトリが大きいほど時間がかかるので...。
- filter-branchにはちょっとした癖があったので以降で詳しく記載。
- git filter-branchを使うと、SVNからのfetchができなくなる為、リポジトリの分割は移行の最終段階で行う必要がありそう。

まずは、clone。

```bash
git clone http://hoge.com/git/(リポジトリ名).git
```
次にgit filter-branchをするが、長時間の処理が予想される為、nohupコマンドで出力をログファイルに吐き、なおかつ末尾に「&」を付けてバックグラウンドで実行できるように。

```bash
nohup git filter-branch -f --tree-filter "rm -f -r (削除ディレクトリ)/" HEAD >> /(workspace)/out.log &
```

- まずは、--tree-filterオプションを付けて削除する。
- ディレクトリを指定する際は、末尾に'/'を入れる。また、スペース区切りで複数指定可能。
- 実行時は、nohupコマンドで標準出力をログファイルに指定する。（ターミナルソフトからのSSHが切れるとプロセスが消える為）
- 進捗状況を確認するなら、tail -f /(workspace)/out.logで何時でも確認可能。

上記処理の後、再度git filter-branchを、次は--index-filterオプションを付けて、履歴を削除する。

```bash
nohup git filter-branch -f --index-filter "git rm -rf --ignore-unmatch (削除ディレクトリ)/" --prune-empty >> /(workspace)/out.log &
```

- 通常は--tree-filterか--index-filterのどちらか実行するだけで良いはずなのだが...。
- --ignore-unmatchオプションは、当てはまる対象がない時のエラーを無視できる。
- --prune-emptyオプションは、commit logから消した時に生まれうる、コメントのみの空commitも消してくれる。

# リポジトリの階層構造変更
SVNからの移行作業及び、リポジトリの分割までできたのでこれにて[～完～]といきたいところだが、そうは問屋がなんとかである。

リポジトリを分割した際、ディレクトリの階層構造を変更したい（というより、階層を１段上げたい）ことがあるはず。そんな几帳面さんの為に、階層構造の変更についてもまとめる。

例）archiveディレクトリ内のディレクトリやファイル達を、archive.git直下へ移動。

```:変更前
+ archive.git
  + archive
    + dir1
    + dir2
    + …
```

```:変更後
+ archive.git
  + dir1
  + dir2
  + …
```

と言っても、以下のコマンドを一発実行すれば良いだけである。

```bash
git filter-branch -f --subdirectory-filter (dir) -- --all
```
Persistent homologyを計算してみた

突然だけど、persistent homologyをRで計算してみたのでまとめておく。

## パッケージ
TDA
https://cran.r-project.org/web/packages/TDA/index.html

## sample data
spreadsheetで適当にデータを生成。
今回は$S^1$と$T^2$

### 円周

```math
x = r \cos(\theta) \\
y = r \sin(\theta)
```
この式と、
`r = 1 + .1 * rand()`, `(theta) = 2 * pi() * rand()`
をあわせて、spreadsheetで1000dataを生成

<img width="455" alt="スクリーンショット 2017-05-14 18.19.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/d3800cab-8266-b8b6-a4c2-184bb0ba86c2.png">

### トーラス

```math
x = (R+r \cos(\varphi))\cos(\theta) \\
y = (R+r \cos(\varphi))\sin(\theta) \\
z = r\sin(\varphi)
```

と、
`R=5`、`r = 2+.2*rand()`
をあわせて、spreadsheetで1000dataを生成

<img width="765" alt="スクリーンショット 2017-05-14 18.20.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/42c24ca5-1f98-e15e-5af9-9661d2b5535b.png">


## snippet

$T^2$の場合
data名は`d_torus`

`d_torus %>>% (.[1:1000,]) %>>% (select(., x, y, z)) %>>% (alphaComplexDiag(.)) %>>% (.[["diagram"]]) %>>% (plot(., diagLim=c(0,10), rotated=F))`

RStudioにて。
libraryはTDAに加えてdplyrとpipeRとを使用。

pipeRの2つめの部分`(.[1:1000,])`で使用するデータ量を選択。
例えば、`(.[1:10,])`とすれば、最初の10行をサンプルとしてPersistent Homologyを計算。


## 結果

出力はpersistent diagramで。

### 円周

それぞれ、10点、100点、1000点での散布図とpersistent diagramを。

#### 10点
<img width="551" alt="スクリーンショット 2017-05-14 18.28.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/a31c9f5c-b386-4261-7cd0-febec35e7823.png">

![persistent_s1_10.png](https://qiita-image-store.s3.amazonaws.com/0/172474/a79e356e-51c5-2d2a-fc17-0b1ece15e033.png)

#### 100点
<img width="550" alt="スクリーンショット 2017-05-14 18.28.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/6dd43053-aefb-470e-8127-371e18a07135.png">

![persistent_s1_100.png](https://qiita-image-store.s3.amazonaws.com/0/172474/d7977d57-bd67-293d-02f0-7becf8eaa03d.png)

#### 1000点
<img width="546" alt="スクリーンショット 2017-05-14 18.28.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/28cc9963-71a6-f806-6010-c40e7028b4bc.png">
![persistent_s1_1000.png](https://qiita-image-store.s3.amazonaws.com/0/172474/a0c8223e-bc36-cfb4-5de8-f6733ce94b48.png)

#### 講評
10点だけだと、$S^1$と認識するのはかなり厳しい。
単純にdeath - birth$b_1 = 1$と評するためには連結成分が複数あることを認めなければならなさそう。

100点以上あれば、明らかに半径1程度の円でありそうであることを認めて良さそう。
100点から1000点になると、1次元のホモロジー類の生成のタイミングが早いことが見て取れる。

### トーラス
spreadsheetで立体的な出力ができなかったので、こちらはpersistent diagramのみ

#### 10点
![persistent_torus_10.png](https://qiita-image-store.s3.amazonaws.com/0/172474/09df6701-54c5-3558-42ac-741b478d86f3.png)

#### 100点
![persistent_torus_100.png](https://qiita-image-store.s3.amazonaws.com/0/172474/da2f10fe-1be6-c3ea-f76f-20398ccb437d.png)

#### 1000点
![persistent_torus_1000.png](https://qiita-image-store.s3.amazonaws.com/0/172474/28aef488-59f5-2beb-f994-61b23780361f.png)

#### 講評
1000点あれば、$b_0 = 1, b_1 = 2, b_2 = 1$の$T^2$であろうことが見て取れる。
が、100点ではそういう認識をするのは厳しい。
（100点では$S^1$とhomotopy equivalentな物体に見える）

persistent homologyは、次元に呪われそうな予感がプンプンしますね。
簡単にJSONのパースができるSwiftyJSONのインストール方法

JSONのパースは普通にswiftでやるとかなり煩雑なコードになるのでSwiftyJSONを用いて行う．
詳細は次を参照: https://github.com/SwiftyJSON/SwiftyJSON

## まずはSwiftyJSON入れるのに必要なライブラリ等入れる
以下参照:  
http://qiita.com/daikuro/items/1e3758f58783e12e8a52  
https://cocoapods.org/

#### 1. cocoapodsのインストール (ruby必要, 2017/5/10 v2.4.1p11)
`$ gem install cocoapods`
#### 2.Teminal再起動
#### 3. cocoapodsがインストールされているか確認&setup(setupは10分弱かかる)
`$ pod --version` -> `1.2.1`  

#### 4. 初期設定
プロジェクトのあるディレクトリ (.xcodeproj)で
`$ pod init`を実行するとPodfilefが作成される．

## SwiftyJSONを実装する
以下参照  
http://qiita.com/daikuro/items/1e3758f58783e12e8a52  
https://github.com/SwiftyJSON/SwiftyJSON#integration

#### 1. PodfileをSwiftJSON用に修正
**(Before)**

```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'MySampleApp' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for MySampleApp

end
```

**(After)** 
 
```
platform :ios, '10.3'
use_frameworks!

target 'MySampleApp' do
  pod 'SwiftyJSON'
end
```


#### 2. ライブラリのインストール
```
$ pod install
Analyzing dependencies
Downloading dependencies
Installing SwiftyJSON (3.1.4)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `MySampleApp.xcworkspace` for this project from now on.
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
```

#### 3.この後xcodeでbuildする
ちなみに.xcodeprojからビルドするとfailedする．.xcworkspaceのファイルができているのでそこからbuildする．  
参照: http://qiita.com/sutchan/items/0a78042261ca3f0a7d91

#### 4.あとはViewController.swift等に`import SwiftyJSON`を追加すれば使えるようになる

## [追記(2017/6/13)] SwiftPM経由でSwiftyJSON導入
#### 1. 該当ディレクトリに移動
`$ cd MySampleApp`

#### 2. Setup
```
$ swift package init --type=executable
Creating executable package: BudgetBrain
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/main.swift
Creating Tests/
```
#### 3. `Package.swift`にパッケージ指定
```Package.swift
import PackageDescription

let package = Package(
    name: "YOUR_PROJECT_NAME",
    targets: [],
    dependencies: [
        .Package(url: "https://github.com/SwiftyJSON/SwiftyJSON.git", versions: Version(1, 0, 0)..<Version(3, .max, .max)),
    ]
)
```

#### 4. ビルドする
```
$ swift build
Fetching https://github.com/SwiftyJSON/SwiftyJSON.git
Cloning https://github.com/SwiftyJSON/SwiftyJSON.git
Resolving https://github.com/SwiftyJSON/SwiftyJSON.git at 3.1.4
Compile Swift Module 'SwiftyJSON' (1 sources)
Compile Swift Module 'YOUR_PROJECT_NAME' (1 sources)
Linking ./.build/debug/YOUR_PROJECT_NAME
```
React Routerで正規表現を使ってパスパラメータの形式を指定する


# 問題

React Routerのv4系で

- `/entires/:id`でエントリ参照画面へ遷移させたい
  - ただし`/entries/1`のように`:id`には整数値だけ入れたい

というルーティングをやりたいとします。

# 解決法

## 正規表現を使う

[Path-to-RegExp](https://github.com/pillarjs/path-to-regexp)というライブラリと同じ方法で、正規表現を使って、`:id`にマッチする形式を指定することができます。

```
<BrowserRouter>
  // ...
  <Route path="/entries/:id(\d+)" component={Entry} />
  // ...
</BrowserRouter>
```

`/entries/:id(\d+)`のように書くことで、パラメータ`:id`でマッチさせるルールを正規表現で指定しています。ここでは、数字1桁以上がマッチするようにしています。

# 参考

- [React Router: Declarative Routing for React.js](https://reacttraining.com/react-router/web/api)
- [pillarjs/path-to-regexp: Express-style path to regexp](https://github.com/pillarjs/path-to-regexp)
プログラミング言語Go読書会#8(5.3-5.7)[2017/05/10]

[Go読書会 #8](https://lancers-engineer.connpass.com/event/56186/) が[ランサーズ株式会社](https://www.lancers.co.jp/)で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容は[プログラミング言語Go](https://www.amazon.co.jp/dp/4621300253/?&_encoding=UTF8&tag=amesho-22&linkCode=ur2&linkId=7e29043d833086d36f8b64c2ed3721b2&camp=247&creative=1211)を冒頭から皆で読み進めていくというものです。

## 進捗した内容

+ 5章 関数
    + 5.3 複数戻り値
    + 5.4 エラー
      + 5.4.1 エラー処理戦略
      + 5.4.2 ファイルの終わり(EOF: End of File)
    + 5.5 関数値
    + 5.6 無名関数
      + 5.6.1 警告：ループ変数の捕捉
    + 5.7 可変個引数関数

## 話題に上がった話

### 5.3 複数戻り値

ここでは、`Goの複数返値と例外がない理由`について話題になりました。例外(exception)がない理由は[こちら](http://golang.jp/go_faq#exceptions)に書かれていまして、複数戻り値が返るのとエラーへの設計思想とでこうなっているということでした。あとは、空リターン(bare return)を使うと、名前付き返値を持つ関数の値が帰るところが興味深かったです。ただし、その記述の直後にこの機能は余り使わない方がいいという但し書きが書かれていたので使うときは気をつけたいです。

+ 参考
  + [Defer, Panic, and Recover](https://blog.golang.org/defer-panic-and-recover)

### 5.4.1 エラー処理戦略

ここでは、Goのエラー処理に対する取り組み方が話題になりました。最近の言語の場合は例外を発生させてそこにスタックトレースを出力させて発生したエラーの内容を表示する方式ですが、Goの場合は通常のifなどのフローを使用をして報告するようにしていている点が特徴的でした。

### 5.5 関数値

ここでは、`ファーストクラス値(first-class value)`であることが話題になりました。概ね[このような](https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E7%B4%9A%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)話だということで、関数から返したり、関数に渡したりすることが出来るところのメリットについて話になりました。一番簡単なところだと、例題にも出ているフローと実際に処理をする部分を分けたりすることができてコードに汎用性がでたりするところとかでしょうか。参加者のかたから話題にからめて関数型の話がでてきてちょっと盛り上がりました。

### 5.6 無名関数

ここでは、無名関数のメリットについてが話題になりました。簡単なところでいうと、関数の外部からアクセス出来る必要の無い処理を内部に書けたり、このあと出てくる並列処理をgoに渡すときに楽に書けるとか、命名する必要がない処理をまとめられるとか素言うところじゃないかと思います。

### 5.6.1 警告：ループ変数の捕捉

この話は、forループで変数がメモリの位置を共有することにより、先程出てきた無名関数などを組み合わせて実行すると予想外の実行結果になるという話です。これは、慣れてない人ははまりますね。気をつけたいです。


ここまで読んだところで時間になりました。次回は 5.8 関数遅延呼び出しからです。
PsiTransfer (uploader) にnginxでuploadにアクセス制限をかける

![upload.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f7396fd6-693c-cca4-30a5-b9b3a9e934c5.png)

## 参考

* [PsiTransfer - 自前で立てるファイル共有サーバ MOONGIFT](http://moongift.jp/2017/05/psitransfer-%e8%87%aa%e5%89%8d%e3%81%a7%e7%ab%8b%e3%81%a6%e3%82%8b%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e5%85%b1%e6%9c%89%e3%82%b5%e3%83%bc%e3%83%90/)

https://hub.docker.com/r/psitrax/psitransfer/
https://hub.docker.com/r/psitrax/psitransfer/~/dockerfile/

dockerのimageがalpineベースで40MBほどと小さい。

https://github.com/psi-4ward/psitransfer

## アクセス制限

uploadできる人を制限したかった。basic認証でもよいですね。

```bash:ファイル準備
mkdir data
chown -R 1000 data 

mkdir nginx
touch nginx/proxy

touch docker-compose.yml
```

```yaml:docker-compose.yml
uploader:
  image: psitrax/psitransfer
  restart: always
  #ports:
  # - "3000:3000"
  volumes:
   - /etc/localtime:/etc/localtime
   - ./data:/data

nginx:
  image: nginx
  restart: always
  environment:
    - TZ=Asia/Tokyo
  volumes:
    - ./nginx/proxy:/etc/nginx/conf.d/default.conf
  ports:
    - "8080:8080"
  links:
    - uploader
```

```nginx:nginx/proxy
server {
	listen 8080;
	location / {
		limit_except GET {
			allow XX.XX.XX.XX; #uploadを許可したいIP
			allow 127.0.0.1;
			deny all;
		}
		proxy_pass http://uploader:3000;
		break;
	}
}
```

```bash:起動
docker-compose up -d
```

http://ipaddress:8080/ にアクセス

許可しているIP以外からのアクセスはuploadが失敗すること、
ダウンロードは可能なことを確認。

![block.png](https://qiita-image-store.s3.amazonaws.com/0/25728/87922c36-2d33-381f-9531-3fc5853bcdf7.png)
Inno SetupのUI部品のメンバ名

Inno Setupで少し凝ったUIを作ろうとすると、UI部品のTWizardFormクラス内でのメンバ名を知りたくなります。しかし、Inno SetupではTWizardFormクラスに全UI部品が定義されていて、どのメンバがどのUI部品を示すのか非常にわかりにくくなっています。そこで、今回は各ウィザードの画面に並ぶUI部品のメンバ名（図中propertyで始まるもの）と文面の.islファイルに定義されている名称（図中[Messages]で始まるもの）を一挙紹介します。

- **wpWelcome**
![01wpWelcome.png](https://qiita-image-store.s3.amazonaws.com/0/83170/4440e269-ce5a-35fa-fc64-b0edaa65f1f2.png)
- **wpLicense**
![02wpLicense.png](https://qiita-image-store.s3.amazonaws.com/0/83170/f14587d6-1a6e-cde9-b94c-d7be8ae89431.png)
- **wpPassword**
![03wpPassword.png](https://qiita-image-store.s3.amazonaws.com/0/83170/05f07a52-37e7-e1a5-daa2-0d934bee3294.png)
- **wpInfoBefore**
![04wpInfoBefore.png](https://qiita-image-store.s3.amazonaws.com/0/83170/0628e7c4-9425-d2c4-39f3-e2672ba966ed.png)
- **wpUserInfo**
![05wpUserInfo.png](https://qiita-image-store.s3.amazonaws.com/0/83170/64c5ae88-3d37-01c5-279e-36a938355dd2.png)
- **wpSelectDir**
![06wpSelectDir.png](https://qiita-image-store.s3.amazonaws.com/0/83170/8d5b8a35-0807-a72e-a3ce-c76073d778ae.png)
- **wpSelectComponents**
![wpSelectComponents .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83170/75e78b61-accf-d602-ee7b-0bc6c42fb884.png)
- **wpSelectProgramGroup**
![08wpSelectProgramGroup.png](https://qiita-image-store.s3.amazonaws.com/0/83170/dbc5a66b-f473-3b1f-8fab-6b44731ffd54.png)
- **wpSelectTasks**
![09wpSelectTasks.png](https://qiita-image-store.s3.amazonaws.com/0/83170/09b2e049-e549-2c82-40c0-675dabe7dad7.png)
- **wpReady**
![10wpReady.png](https://qiita-image-store.s3.amazonaws.com/0/83170/c4f396e7-5bed-d717-992d-c3b038f61127.png)
- **wpPreparing**
![11wpPreparing.png](https://qiita-image-store.s3.amazonaws.com/0/83170/1330e639-ea3c-c14e-4c8b-cd3752f54139.png)
- **wpInstalling**
![12wpInstalling.png](https://qiita-image-store.s3.amazonaws.com/0/83170/74fc5372-6144-3356-4ad5-3fb8b1ed509a.png)
- **wpInfoAfter**
![13wpInfoAfter.png](https://qiita-image-store.s3.amazonaws.com/0/83170/053a2042-f85a-3c89-9248-8484aac32e36.png)
- **wpFinished**
![14wpFinished.png](https://qiita-image-store.s3.amazonaws.com/0/83170/a80e56e7-f22e-4d7b-2ce2-2cb4b15ffcdd.png)
デザインパターン学習メモ：「Composite」

## このパターンの目的
GoF本より引用する。

> 部分―全体階層を表現するために、オブジェクトを木構造に組み立てる。Compositeパターンにより、クライアントは、個々のオブジェクトとオブジェクトを合成したものを一様に扱うことができるようになる。(P.175)

ここでいう木構造は、Linuxのファイルとディレクトリを想像するとイメージしやすいかもしれない。

Compositeパターンに当てはめると、ファイルとディレクトリは共通のインタフェースを持つことになる。クライアントはそれらを「同じもの」として扱い（ポリモーフィズム）、同じ方法（メソッド）で操作する。

## 実装例

```java:Item.java
// 共通のインタフェース
// Component役
public abstract class Item {

	public abstract String getName();

	public abstract int getPrice();
}
```

```java:Food.java
// 単品メニューを表す
// Leaf役
public class Food extends Item {
	private String name;
	private int price;

	public Food(String name, int price) {
		this.name = name;
		this.price = price;
	}

	@Override
	public String getName() {
		return this.name;
	}

	@Override
	public int getPrice() {
		return price;
	}
}
```

```java:SetMenu.java
// セットメニューを表す
// Composite役
public class SetMenu extends Item {
	private String name;
	private List<Item> items;

	public SetMenu(String name, List<Item> item) {
		this.name = name;
		this.items = item;
	}

	@Override
	public String getName() {
		return this.name;
	}

	@Override
	public int getPrice() {
		Iterator<Item> iterator = getIterator();
		int price = 0;
		while (iterator.hasNext()) {
			Item item = iterator.next();
			price += item.getPrice();
		}
		return price;
	}

	private Iterator<Item> getIterator() {
		return items.iterator();
	}
}
```

``` java:Client
// Mainクラス
// Client役
public class Client {
	public static void main(String[] args) {
		// 単品の値段を取得
		Item food = new Food("Cheeseburger", 130);
		System.out.println(food.getPrice());

		// セットメニューの値段を取得
		Item[] items = { new Food("Cheeseburger", 130),
				new Food("Orange Juice", 100) };
		Item setMenu = new SetMenu("Cheeseburgar Set", Arrays.asList(items));
		System.out.println(setMenu.getPrice());
	}
}
```

```text:結果
130
230
```



## 実装の解説
 * 単一のモノをあらわすインスタンス(Food.java)も集合をあらわすオブジェクト(SetMenu.java)も、同じgetPrice()で金額を取得できている
 * 上記では実装していないが、集合をあらわすほうのクラス(Composite役、SetMenu.java)に要素の追加と削除が必要になる場合、その処理をどこに実装すべきか問題になる。ケースバイケースで対応する。
    * 共通のインタフェースに実装する
        * 方法１：空の（何もしない）メソッドを用意して、「Leaf役(Food.java)」では何もしない動作とする
        * 方法２：デフォルトで例外を発生させるようにして、「Leaf役(Food.java)」で呼ばれた場合はエラーとする
    * 集合をあらわすクラス（Component役、SetMenu.java）に実装する
        * ポリモーフィズムを壊すおそれがある

## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一 / 吉田　和樹 監訳、ソフトバンククリエイティブ
 * 結城浩（2004）『Java言語で学ぶ　デザインパターン入門』SBクリエイティブ
VMware Fusion上のWindowsで5ボタンマウスを使えるようにする方法

![SteerMouse.png](https://qiita-image-store.s3.amazonaws.com/0/157734/23a2751e-9242-6c4c-dfe2-1fd47a3fe6ff.png)
ステアーマウスのアプリケーションごとの設定でVMware Fusion用の設定を作成する。
ボタン4には第4クリック、ボタン5には第5クリックを割り当てる。
これでVMware上のWindowsで5ボタンマウスが使える。

以下、確認した動作環境。

- Mac mini (Mid 2011)
- macOS Sierra 10.12.4
- ステアーマウス 5.1
- VMware Fusion 8.5.6（Windows7 64bit、Windows10 64bitで確認）
- Logicool M570
WP REST APIのjsonが表示されなくて、最初の１歩目でつまづいた(404)


##とりあえず自分のサイトのデータを見てみようとアクセスしてみた

```
***/wp-json/wp/v2/
```

結果は404
なぜ・・・？

##原因を調べてみる

- サーバが対応していない→同環境の別のサイトでは見れたので×
- WPのバージョンの問題？→最新にしても変わらないため×
- も、もしかしてパーマリンク初期設定のままだから？→変えてみたところ見れたため○

うそ。。。！と思うようなことが理由でした
パーマリンクを変えないとmod_rewriteが動かないので、このURLが見れないようです

##おまけ：パーマリンクを変更しなくても見れるURL

```
***/?rest_route=%2Fwp%2Fv2
```
Vagrant 1.9.4にしたらvagrant up --provider=hypervできない

vagrant_1.8.5からvagrant_1.9.4にアップデートしたら下記のようなエラーががが

The provider 'hyperv' that was requested to back the machine
'default' is reporting that it isn't usable on this system. The
reason is shown below:

The Hyper-V provider requires that Vagrant be run with
administrative privileges. This is a limitation of Hyper-V itself.
Hyper-V requires administrative privileges for management
commands. Please restart your console with administrative
privileges and try again.

調べたらバグの模様
https://github.com/mitchellh/vagrant/issues/8527

対応方法はこちら↓
https://github.com/mitchellh/vagrant/pull/8548/commits/1dfc646fb3dd0f7b22a45d6c17ae0669933d7011