2015年8月17日月曜日

P2P探訪 HetimaNetはDart:ioに対応しました。

hetimanetは、chrome用のsocket機能のみ提供していましたが、新たに、dart:ioに対応しました。hetimanetはdart用のライブラリです。


下記、機能に対応しています。

  • UDP
  • TCP
  • Http Server
  • Http Client
  • UPnP Portmap 



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import 'package:hetimanet/hetimanet.dart';
import 'package:hetimanet/hetimanet_dartio.dart';
//
//
main()  async {
  HetiSocketBuilderDartIO builder = new HetiSocketBuilderDartIO(); 
  UpnpPortMapHelper helper = new UpnpPortMapHelper(builder, "test");
  //
  // get network interface
  List<HetiNetworkInterface> interfaces = await builder.getNetworkInterfaces();
  for (HetiNetworkInterface i in interfaces) {
    print("<ni>${i.address} ${i.prefixLength} ${i.name}");
  }
  //
  // portmapping 
  try {
    StartGetExternalIp exip = await helper.startGetExternalIp(reuseRouter: true);
    print("<exip> ${exip.externalIp}");
  } catch (e) {
    print("<exip ERROR> ${e}");
  }
  //
  // get local ip
  try {
    StartGetLocalIPResult loip = await helper.startGetLocalIp();
    for(HetiNetworkInterface i in loip.networkInterface) {
      print("<glip> ${i.address} ${i.name}");      
    }
  } catch (e) {
    print("<glip ERROR> ${e}");
  }
  //
  // start portmap
  try {
    StartPortMapResult sp = await helper.startPortMap();
    print("<add> ${sp}");
  } catch (e) {
    print("<add ERROR> ${e}");
  }
  //
  // end portmap
  try {
    DeleteAllPortMapResult ep = await helper.deletePortMapFromAppIdDesc();
    print("<del> ${ep}");
  } catch (e) {
    print("<del ERROR> ${e}");
  }
}

Source

https://github.com/kyorohiro/dart_hetimanet
https://github.com/kyorohiro/dart_hetimanet/tree/master/example/HetimaPortMap

Port map chrome app

- Chrome Store

https://chrome.google.com/webstore/detail/hetimaportmap/naifildeohmcocnmibaampijofhcohif

--------------
kyorohiro work

http://kyorohiro.strikingly.com

2015年8月14日金曜日

P2P探訪 DHTを実装してみよう!! (6) おわり

GetPeersでInfoHashに対応するPeerを探す


  • GetPeersでPeerを探す
  • AnnouncePeerでP2Pネットワーク上に値を保存する


DHTを動作させてみよう


  • DHTを動作させてみよう!!


「P2P探訪 DHTを実装してみよう!! 」をQiitaに投稿しました。
http://qiita.com/kyorohiro/items/2c60fd072f61d2dc52c4

これで、ひととおり、説明したつもりです。

今後書き直したり修正した内容は、「なぜなにTorrent」のほうに反映していく予定です。多分、いまある、文章は全て入れ替わるはず。

GitBook なぜなにTorrent

https://www.gitbook.com/book/kyorohiro/doc_hetimatorrent/details

ソース

 https://github.com/kyorohiro/dart_hetimatorrent

REF

http://www.bittorrent.org/beps/bep_0005.html
http://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf

-------
Kyorohiro work

2015年8月11日火曜日

P2P探訪 なぜなにTorrent

Torrent Client開発時に得たノウハウは、「なぜなにTorrent」にまとめています。

https://www.gitbook.com/book/kyorohiro/doc_hetimatorrent/details

-------
Kyorohiro work




P2P探訪 DHTを実装してみよう!! (4) FindNodesでネットワークを構築する

FindNodeでネットワークを構築する

  • FindNodeクエリでネットワークを構築する
  • レスポンスを受けたらRootingTableを更新する

Qiitaに移動しました。


http://qiita.com/kyorohiro/items/62347c69075bdcb6fdc2





GitBook なぜなにTorrent

ソース

REF


-------
Kyorohiro work

http://kyorohiro.strikingly.com

P2P探訪 DHTを実装してみよう!! (3) kBucket RootingTable の実装編

RootingTableを実装してみよう。

  • KIdを実装する
  • kBucketを実装する
  • RootingTableを実装する

RootingTableを実装してみましょう。コードに落とす事で理解も深まります。

Qiitaに移動しました。





GitBook なぜなにTorrent

https://www.gitbook.com/book/kyorohiro/doc_hetimatorrent/details

ソース

 https://github.com/kyorohiro/dart_hetimatorrent

REF

http://www.bittorrent.org/beps/bep_0005.html
http://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf

-------
Kyorohiro work

http://kyorohiro.strikingly.com

2015年8月9日日曜日

P2P探訪 DHTを実装してみよう!! (2) MainlineDHTはKademuliaのkBucketを利用している

DHTに対応する。MainlineDHTはKademuliaのkBucketを利用している


  • 距離はXOR
  • kBucketでRootingTableを構築している

Qiitaに移動しました。






GitBook なぜなにTorrent

ソース

REF

----------
Kyorohiro work

P2P探訪 DHTを実装してみよう!! (1) Mainline DHTはTrackerなしでPeerを探すことができる。

GItbookで書いている内容を、見直す機会として、Bloggerに投稿してみた。

Mainline DHTはTrackerなしでPeerを探すことができる。


  • Trackerがなくてもデータを探せる
  • 六次の隔たりで実現している
  • 距離を定義してネットワークを構築する


本章では、Mainline DHT と呼ばれる機能の解説と実装をしていきます。

Qiitaに移動しました!!

2015年8月8日土曜日

P2P探訪 HetimaTorrentClient ver 0.1.0 implements DHT with Pure Dartlang


HetimaTorrentClient が ver 0.1.0 で DHT に対応しました。 


残念ながら、 Pre-Alpha バージョンで、まだまだ不安定です。


1GB近くある Big Buck Bunny の動画を使って、DHT経由でダウンロードするテストをしています。 


[DHT]
Torrent クライアントは通常、Trackerサーバーから他のTorrent クライアントを紹介してもらいます。しかし、この場合だと、もしも、Tracker Serverがダウンした場合は、うまく動作しません。しかし、 DHT をサポートしたクライアントは独自にP2Pネットワークを組み、Trackerサーバーの変わりをすることができます。

- bep5 

2015年8月6日木曜日

WegGL Trial with Dartlang draw rect


四角形を表示するサンプル




 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import 'dart:html' as html;
import 'dart:web_gl' as webgl;
import 'dart:typed_data' as data;

void main() {
  var canvas = new html.CanvasElement(width: 500, height: 500);
  html.document.body.append(canvas);

  webgl.RenderingContext GL = canvas.getContext3d();
  GL.clearColor(0.6, 0.2, 0.2, 1.0);
  GL.clear(webgl.RenderingContext.COLOR_BUFFER_BIT);

  // setup shader
  webgl.Shader vertexShader = loadShader(GL, webgl.RenderingContext.VERTEX_SHADER, 
          "attribute vec3 vp;\n" +
          "void main() {\n" +
          "  gl_Position = vec4(vp, 1.0);\n" +
          "}\n");

  webgl.Shader fragmentShader = loadShader(GL, webgl.RenderingContext.FRAGMENT_SHADER, 
          "precision mediump float;\n" +
          "void main() {\n" +
          " gl_FragColor = vec4(0.0,1.0,0.0,1.0);\n" +
          "}\n");

  webgl.Program shaderProgram = GL.createProgram();
  GL.attachShader(shaderProgram, fragmentShader);
  GL.attachShader(shaderProgram, vertexShader);
  GL.linkProgram(shaderProgram);
  GL.useProgram(shaderProgram);

  if (false == GL.getProgramParameter(shaderProgram, webgl.RenderingContext.LINK_STATUS)) {
    String message = "alert: Failed to linked shader";
    throw new Exception("${message}\n");
  }

  //
  // setup
  // leftup (x, y, z), leftdown, rightup, rightdown
  data.TypedData rectData = new data.Float32List.fromList([-0.8, 0.8, 0.0, -0.8, -0.8, 0.0, 0.8, 0.8, 0.0, 0.8, -0.8, 0.0]);
  data.TypedData rectDataIndex = new data.Uint16List.fromList([0, 1, 2, 1, 3, 2]);

  webgl.Buffer rectBuffer = GL.createBuffer();
  GL.bindBuffer(webgl.RenderingContext.ARRAY_BUFFER, rectBuffer);
  GL.bufferData(webgl.ARRAY_BUFFER, rectData, webgl.RenderingContext.STATIC_DRAW);

  webgl.Buffer rectIndexBuffer = GL.createBuffer();
  GL.bindBuffer(webgl.ELEMENT_ARRAY_BUFFER, rectIndexBuffer);
  GL.bufferDataTyped(webgl.RenderingContext.ELEMENT_ARRAY_BUFFER, rectDataIndex, webgl.RenderingContext.STATIC_DRAW);

  //
  // draw
  int locationVertexPosition = GL.getAttribLocation(shaderProgram, "vp");
  GL.vertexAttribPointer(locationVertexPosition, 3, webgl.RenderingContext.FLOAT, false, 0, 0);
  GL.enableVertexAttribArray(locationVertexPosition);
  GL.drawElements(webgl.RenderingContext.TRIANGLES, 6, webgl.RenderingContext.UNSIGNED_SHORT, 0);
}

webgl.Shader loadShader(webgl.RenderingContext context, int type, var src) {
  webgl.Shader shader = context.createShader(type);
  context.shaderSource(shader, src);
  context.compileShader(shader);
  if (false == context.getShaderParameter(shader, webgl.RenderingContext.COMPILE_STATUS)) {
    String message = "Error compiling shader ${context.getShaderInfoLog(shader)}";
    context.deleteShader(shader);
    throw new Exception("${message}\n");
  }
  return shader;
}

- source
https://github.com/kyorohiro/dart_hetimagl/tree/master/web

-------
Kyorohiro work

kyorohiro.strikingly.com

P2P探訪 About Hetima Torrent Tracker

dart製、hetimatorrent library は、Tracker Server と Tracker Client の機能をサポートしています。


support following spec
- bep0003
     http://www.bittorrent.org/beps/bep_0003.html
- bep0023
     http://www.bittorrent.org/beps/bep_0023.html

基本 Torrent Client は、Tracker Server を利用して、他のTorrent Clientをつがします。つまり、Torrent でデータを共有したい場合は、Tracker Server が必要になります。

hetimatorrent example: server code


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
a() {
  TrackerServer trackerServer = new TrackerServer(new HetiSocketBuilderChrome())
    ..address = "0.0.0.0"
    ..port = 6969;

  trackerServer.start().then((StartResult result) {});
  List<int> infoHash = new List.filled(20, 1);
  trackerServer.addInfoHash(infoHash);
  new Future.delayed(new Duration(minutes: 30)).then((_) {
    trackerServer.stop();
  });
}

hetimatorrent example: client code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
b() {
  TorrentFile torrentfile = null;
  // ..
  //create Torrent file Object from blob;
  // ..
  
  
  TrackerClient.createTrackerClient(new HetiSocketBuilderChrome(), torrentfile).then((TrackerClient client) {
    client.downloaded = 0;
    client.uploaded = 0;
    client.event = TrackerClient.EVENT_STARTED;
    client.requestWithSupportRedirect().then((TrackerRequestResult result) {
      print("${result}");
    });
  });
}


Source

- hetimatorrent library 

- HetimaTorrentTracker large sample

- Chrome store


-------
kyorohiro work

2015年8月5日水曜日

WegGL Trial with Dartlang clear screen

Dartlang は快適な開発環境を持ちます。Dart x Eclipse は、自動補完機能は優秀です。なので、Dartlang で WebGL の学習を始めることにしました。

まずは、画面をクリアするサンプルを書いた。




import 'dart:html' as html;
import 'dart:web_gl' as gl;

void main() {
  var canvas = new html.CanvasElement(width: 500, height: 500);
  html.document.body.append(canvas);

  gl.RenderingContext GL = canvas.getContext3d();
  double r = 0.6;
  double g = 0.2;
  double b = 0.2;
  double a = 1.0;
  GL.clearColor(r, g, b, a);
  GL.clear(gl.RenderingContext.COLOR_BUFFER_BIT);
}


ソース

https://github.com/kyorohiro/dart_hetimagl/tree/master/web

-------
Kyorohiro work

P2P探訪 hetimatorrent で mainline dht を サポートしました。

hetimatorrent で mainline dht (bep5) を サポートしました。

--

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
a() {
  KNode node = new KNode(new HetiSocketBuilderChrome(), verbose: true);
  String localIp = "0.0.0.0";
  int localPort = 28080;
  //
  //
  node.start(ip: localIp, port: localPort).then((_) {
    node.onGetPeerValue.listen((KGetPeerValue v) {
      print("---onGetPeerValue ${v.ipAsString} ${v.port} ${v.infoHashAsString} ");
    });
  });

  //
  // initial node
  String initailNodeIp = "0.0.0.0";
  int initailNodePort = 38080;
  node.addBootringNode(initailNodeIp, initailNodePort);
  
  //
  // search target
  List<int> infoHash = new List.filled(20, 4);
  node.startSearchValue(new KId(infoHash), 18080, getPeerOnly: true);
  
  new Future.delayed(new Duration(minutes:30)).then((_){
    print(node.rootingtable.toInfo());
    return node.stop();
  });

}
--

hetimatorrent は名前の通り、torrentプロトコルでまデータの共有ができます。
pure dartlang で書かれています。
今は、chrome application のみサポートしていますが、今後拡張予定です。`


What is DHT?

すでにP2Pネットワークに参加しているNodeを紹介してもらうと、それを元に、P2Pネットワークへ参加します。数10秒後には、数十回の問い合わせで。P2Pネットワークからデータを発見できるようになります。

Source

- hetimatorrent
  https://github.com/kyorohiro/dart_hetimatorrent
- heitnanet
  https://github.com/kyorohiro/dart_hetimanet
- dht sample
  https://github.com/kyorohiro/dart_hetimatorrent/tree/master/example/TorrentDHT
- bep5
 http://www.bittorrent.org/beps/bep_0005.html
- Kademlia; A Peer-to-peer Information System Based on the XOR Metric.
 http://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf


-------
Kyorohiro work

2015年8月1日土曜日

Eclipse での Dart製 Chrome app の開発

Chrome app 開発用に, DartEditorからEclipseに移行しました

DartEditorの開発が止まったので、Eclipseに移行しました。選択肢として WebStormを使うことも検討したのですが、 WebStormでのDart製のChromeアプリの開発が面倒だったので、Eclipseを利用することにしました。

- 標準でChrome アプリ用のテンプレートが含まれていない
- 標準でmanifest.json を右クリックからの動作確認ができない

Eclipseならば、簡単につかえます。

 
 
 

インストールが不便

しかし、素直にEclipseのインストールが上手できなくて、結構苦労しました。Dartiumを認識させ方が不明。Eclipseが起動しなくなるとか。

軽くEclipseでの環境の設定方法について解説したいと思います。
 
 
 

EclipseをInstallしよう

eclipse を手に入れましょう。僕はJava Developers版を利用しました。をhttp://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/marsr

選んだ理由は、余計なものが入っていなさそうだから。
 
 
 

Dart plugin をインストールしよう

1. Menu:Help --> Install New software..
2. addボタンを押す。Add Repositoryダイアログが表示される。
3. Nameをdartrepo. Locationを"http://www.dartlang.org/eclipse/update/channels/stable/"にして、OKボタンを押す。
4. Work with をdaerreoにする。自動でそうなるはず。
5, 表示されたものを選択して、Nextボタン等をおして、後は指示に従って進めてください。

 
 

Dart SDK をインストール

Dart SDK はプラグインからダウンロードできます。
1. Menu:Windows --> Preferences 。Preferencesダイアログが表示される。
2. Dart-> SDK
3. Dart SDK のところの、Downloadボタンを押してください

※ Preference Dialogに、 "Install at C:.asfas/asdfas/asdf/dart-sdk"といった感じでパスが表示されています。ここにインストールされます。
 
 
 

Dariumをインストールする

Dartiumをインストールします。https://www.dartlang.org/tools/dartium/ で手に入ります。zip圧縮されているので、解凍してください、
Preference Dialogに表示されている、"Install a c://aaa/aa/chromium"で指定されたフォルダーのの直下に、chrome.exeがある状態にしてください。



PS

これで、完了です。今回試した環境は以下の通り
Microsoft windows surface pro2 (8G memory, windows8) 
 
DartEditorはインストールすれば直ぐに使えてお勧めだったんだけど、開発が停止してしまった。
Dart Teamが推しているWeb Stormは有料だし、デフォルトでChrome App開発機能がない。
僕は、Eclipseが良いと思っている。

 
 

-------
Kyorohiro work