2015年10月21日水曜日

Flutter x Dartlang で Androidアプリ作成

Flutter x Dartlang で Androidアプリ作成


QiitaにFlutter x Dartについて投稿しました。

Flutterを使うことで、AndroidやiOSなどの Mobile Platform 向けのアプリが Native な Dartlang で開発できるようになります


[投稿]
http://qiita.com/kyorohiro/items/c478b98dd364050d23e5

[GitBook]
調べたことはgitbookにまとめています

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




-------
Kyorohiro work

http://kyorohiro.strikingly.com



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://app.gitbook.com/@kyorohiro/s/nazenani-torrent/
https://nazenani-torrent.firefirestyle.net/

-------
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



2015年7月30日木曜日

Strikingly を利用してポートフォリオを作成しました。kyorohiro.strikingly.com

Strikingly を利用してポートフォリオを作成しました。

kyorohiro.strikingly.comで公開しています。kyorohiroが無職になってから、2〜3ヶ月経過しました。公開しているもの、未公開で粛々と進めているもの等色々ありますが、自プロジェクトが発散してしまいました。10〜20ほどまで増えました。

今更ですが、無職で自由に時間が使える期間も無制限にあるわけでもないことに、気がつきました。

なるたけ短い期間で成果物を公開して、世の中に何かしらの影響を与えていけるように、整理していきたいと考えています。

で、kyorohiro.strikingly.comに成果が出せそうな物を載せて、それに、労力をかけることにしました。
 
 
 
 

まずは、P2P関連のものだけまとめました

近々で、Outputがていたのは、Dart 向けのP2P関連のライブラリでした。とりあえず、プロジェクトごとにリンクだけ載せました。今は、ほぼリンクだけ、ゴールとかは書けてません。

 
 
 
 

学習内容もプロジェクト形式で公開します

ただ、今回、kyorohiro.strikingly.comにまとめるに当たって、気がいた事として、非公開のもので、私ひとりで行っているものは、あまり良い形でまとまってませんでした。

こなれていない分野のプログラムとかドキュメントとかxxxとかは、公開するのが、とても恥ずかしいのですが、P2P関連のものみたく、赤裸々に公開していくと良いかなぁ〜。と思いました。

なので、適当にプロジェクト名をつけて、ゴールを決めて、kyorohiro.strikingly.comで公開します。

よろしくお願いします。



2015年7月28日火曜日

P2P探訪 dart_hetimatorrent へ、DHT関連のコードを追加しました。

dart_hetimatorrent (https://github.com/kyorohiro/dart_hetimatorrent)へ、DHT関連のコードを追加しました。

やっぱり、DHT対応は必要!!

HetimaTorrentClientを、pre-AlphaからBeta相当へ格上げすべく、さまざまな作業をしていました。実環境で使用してみたちころ、Trackerサーバーが死んでるために、ダウンロードできない状況におちいる事がかなりありました。

しかし、このような場合でも、Bittorrentでは、ダウンロードが可能なことがありました。DHTが効果的に動作しているようです。

プリ実装しました。

実運用を考えると、HetimaTorrentClientでもDHT対応を実現すべきと判断しました。先週からコーディングを始めました。そして、プリ実装を終えました。シミュレーター上ではとりあえず動作しています。

ver 0.1.0として、来週公開予定です。


今後、HetimaTorrentClient に、組み込みながら性能を上げていく予定です。特に問題がなければ、HetinaTorrentClient ver 0.1.0として、DHTに対応したclientを今週末ないし、来週中には公開します。



https://chrome.google.com/webstore/detail/hetimatorrentclientpre-al/bepllifcfhpjoijdddiafgmclfhgjnfb


2015年7月16日木曜日

P2P探訪 P2Pファイル共有アプリ。 HetimaTorrentClient (pre-Alpha) ver 0.0.3 をリリースしました。

P2Pファイル共有アプリ。 HetimaTorrentClient (pre-Alpha) ver 0.0.3 をリリースしました。
https://chrome.google.com/webstore/detail/hetimatorrentclientpre-al/bepllifcfhpjoijdddiafgmclfhgjnfb

Dart製の Chrome App です。まだまだ不安定。今回は、Torrent ライブラリの部分も、Dartlang を用いて、フルスクラッチで書きました。 興味のある型は以下をご確認くだい。 ( https://github.com/kyorohiro/dart_hetimatorrent )
BEP 0003 ( http://www.bittorrent.org/beps/bep_0003.html) に準拠しています。もちろん、pre-Alpha版なので、まだまだ安定していません。安定版はもう少々お待ち下さい。

 

 
 
 
 

[PS]

- HetimaTorrentTracker とセットで利用してください

Torrent Clientは、データを配信する際に、Trackerサーバーが必要になります。hetima torrent library では、このサーバーアプリも用意しています。 名前をHetimaTorrentTrackerと言います。こちらも、Chrome Appです。



- ノウハウは「なぜなにトレント」を参照してください

Torrent Clientを作成した時の発見したことをチュートリアル形式で、ドキュメント化しています。P2Pアプリの作成について興味のある方はこちらも御覧ください。
(※ 書きかけです。)
当面は、gitbook版の方で更新していきますが、整形したものをpaboo版にも展開する予定です。









mbedtls dart の 開発を始めた web wasm ffi io flutter

C言語 で開発した機能を、Dart をターゲットとして、Web でも サーバーでも、そして Flutter  でも使えるようにしたい。 そこで、mbedtls の 暗号化の部分を Dart 向けのPackageを作りながら、 実現方法を試行錯誤する事にした。 dart...