From 338fe37218c3fba9fe8113279585937db02d6276 Mon Sep 17 00:00:00 2001 From: cubedro Date: Thu, 23 Apr 2015 16:17:31 +0300 Subject: [PATCH] added histogram --- models/history.js | 38 ++++++------ models/node.js | 2 - public/css/style.css | 56 +++++++++++++++++- public/fonts/Simple-Line-Icons.ttf | Bin 0 -> 35304 bytes public/js/controllers.js | 27 +-------- public/js/directives.js | 92 +++++++++++++++++++++++++++++ public/js/filters.js | 5 ++ public/js/script.js | 56 ++++++++++++++++-- views/index.jade | 14 ++--- 9 files changed, 227 insertions(+), 63 deletions(-) create mode 100755 public/fonts/Simple-Line-Icons.ttf diff --git a/models/history.js b/models/history.js index 1a20517..1f35315 100644 --- a/models/history.js +++ b/models/history.js @@ -1,12 +1,14 @@ var _ = require('lodash'); var MAX_HISTORY = 1008; -var MAX_PROPAGATION = 36; +var MAX_PEER_PROPAGATION = 36; var MAX_BLOCK_PROPAGATION = 96; +var MIN_PROPAGATION_RANGE = 1; +var MAX_PROPAGATION_RANGE = 20000; +var MAX_BINS = 40; var History = function History(data) { - // this._items = new Array(MAX_HISTORY); this._items = []; var item = { @@ -24,8 +26,6 @@ var History = function History(data) }, propagTimes: [] }; - - // _.fill(this._items, item); } History.prototype.add = function(block, id) @@ -99,18 +99,20 @@ History.prototype.bestBlock = function(obj) History.prototype.getNodePropagation = function(id) { - var propagation = new Array(MAX_PROPAGATION); + var propagation = new Array(MAX_PEER_PROPAGATION); var bestBlock = this.bestBlock().height; + _.fill(propagation, -1); var sorted = _(this._items) .sortByOrder('height', false) - .slice(0, MAX_PROPAGATION) + .slice(0, MAX_PEER_PROPAGATION) .reverse() .forEach(function(n, key) { - var index = MAX_PROPAGATION - 1 - bestBlock + n.height; + var index = MAX_PEER_PROPAGATION - 1 - bestBlock + n.height; + if(index > 0) { @@ -124,27 +126,21 @@ History.prototype.getNodePropagation = function(id) History.prototype.getBlockPropagation = function() { - var propagation = new Array(MAX_BLOCK_PROPAGATION); - var bestBlock = this.bestBlock().height; - var i = 0; - - _.fill(propagation, -1); + var propagation = []; var sorted = _(this._items) .sortByOrder('height', false) - .slice(0, MAX_PROPAGATION) + .slice(0, MAX_BLOCK_PROPAGATION) .reverse() .forEach(function(n, key) { - if(i < MAX_BLOCK_PROPAGATION) + _.forEach(n.propagTimes, function(p, i) { - _.forEach(n.propagTimes, function(p, i) - { - propagation.push({block: n.height, propagation: _.result(p, 'propagation', -1)}); - propagation.shift(); - i++; - }); - } + var prop = _.result(p, 'propagation', -1); + + if(prop >= 0) + propagation.push(prop); + }); }) .value(); diff --git a/models/node.js b/models/node.js index e972a69..e85419e 100644 --- a/models/node.js +++ b/models/node.js @@ -52,8 +52,6 @@ var Node = function Node(data) this.info = data.info; if(typeof data.ip !== 'undefined'){ - if(data.ip === '::ffff:127.0.0.1') - data.ip = '84.117.82.122'; this.info.ip = data.ip; this.setGeo(data.ip); } diff --git a/public/css/style.css b/public/css/style.css index 6bc760e..c3660e4 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -114,7 +114,7 @@ div.small-title-miner { color: #aaa; } -.big-info span.big-details { +.big-info .big-details { display: block; font-weight: 200; font-size: 50px; @@ -122,7 +122,7 @@ div.small-title-miner { letter-spacing: -4px; } -.big-info.chart span.big-details { +.big-info.chart .big-details { padding-top: 15px; } @@ -157,7 +157,7 @@ div.small-title-miner { } .blocks-holder .block-count { - font-family: 'Lucida Console', monaco, "Courier New", Courier, monospace; + font-family: 'Lucida Console', "Courier New", Courier, monospace; font-weight: bold; font-size: 10px; padding-top: 3px; @@ -230,6 +230,11 @@ table td i:before { } .th-nodename { + width: 300px; + text-overflow: ellipsis; +} + +.th-nodetype { width: 200px; } @@ -319,4 +324,49 @@ table td i:before { .hoverinfo .propagationBox { top: 3px; +} + +svg { + overflow: visible !important; +} + +svg .bar { + fill: #1f77b4; + shape-rendering: crispEdges; +} + +svg .bar:hover { + opacity: 0.8; +} + +svg .line { + fill: none; + stroke: #ff0000; + stroke-width: 2px; + shape-rendering: auto; +} + +svg .bar .a { + fill: #aec7e8; +} + +svg .bar text { + text-anchor: end; + font-size: 12px; +} + +svg .axis path, +svg .axis line { + fill: none; + stroke: rgba(255,255,255,0.15); + shape-rendering: crispEdges; +} +svg .axis text { + fill: #777; + font-size: 10px; + letter-spacing: 0px; + font-family: "Source Sans Pro"; + font-weight: 700; + -webkit-font-smoothing: subpixel-antialiased; + -moz-font-smoothing: subpixel-antialiased; } \ No newline at end of file diff --git a/public/fonts/Simple-Line-Icons.ttf b/public/fonts/Simple-Line-Icons.ttf new file mode 100755 index 0000000000000000000000000000000000000000..2194f1f87ffb06e2664e4e56e8656060967e4f9f GIT binary patch literal 35304 zcmdqKcYIt|nKypV?QME58cos6sB5Ir%t)54=5EWj9Je^J6FJR}Q>+w+Bm|=1B&6d| zLRkV1u+#t!yRsBt~h+d z$&U(xdPWd#O&_}az-9IJX9BqPb9}0Ya6@jgIdJo=@bALY*dIdq^tA`Bx%}SmZTOZT+~LLh&DkS2+<2fgyi*X4 zCGpO?1!@~U-Jd#i@P&dp2x8+IG6c7?D@055PC)7 zY`rdsj6aEPY5pnv%!h@i(0BAlcRHoU=@5TR6xeY=5p*`iuE6p7#`nJqG2u?SK|wz? z|4{wKzv(O1UM7q$2xkPgaCSlHMcuM&?;Qul;GP# zjeREU5pL)EeL^3`Y8&=TsClVzJ=xgD*svs5t}f1!4KU z=Tuto2-CvMvip|x3!cn`BCa#+(fdGWulcuuUr9HvcjLPxl+N{xEtH-%AQIyAdb!CWS0Kc1A$o;g3ei+4DMOF<0;>3xAH0SMlr! z?ulZ=<3a+@Z4pu!m$YCAreFy+XvdA#XN0VfL(TF+0c~v;Is~ua6Z}Fz2nrz~EOZK8 zLbuQ(^r8<-LccH|l!ZZ|B21EsaJTSg;U3{$;XdJh;Q`@6;UVEI!g1kY;jO~kgtrUt5FQcUDZEQ~x9}d} z&xH31j|%S--Y=XG9uqzwd{Foh`X7DikQu&-V$P+SrHj1F|9`)63vUO5xr99pZjHD8EZv#DHvQ#{o!OUpIxA*3 zWFN}Oxp%b%fItM%FI{$Z9wd-5m zS9Cwn{f!>Ar?=_i$b*lPE_1Ri`ZC~wuwSOKO9s1g^dqvxdn^yegihmuM z8u{?b?8;kL5t{``om~KLULbn%v5Y9xaZu;zu^=DPh z%|dSGVJR`9xy2S143{$l)m01yl*(XjV2o7ukD;1>{&5)F-N@Yrs49Tx+Qn94nFPr{=i_ND0Xz{fwq=>sg!SN3+NpkqNu7yyFSTexdXj{-f8qjnfQEdaEy&IbOf4P zEf0jzdNe59%4)??I#(Q!V?hyfD@Jpwk00^%Lw=$#5Gb%`mj)PR3Rz^_&%0pO}tUtMTdNx`36_ zBk5ptM{c@(!-n?h%+A;(Q+;~L6-bYtb1#30z{i-qgz+zfPYUJApW3iuwcugJf-{=6 z>KNl~aYtes+KU^bQMcmV9@vvgQCm_Epe=qk8;^e_X0GkDEkzl&EK!_lHe+3Kc{7TM zj#q8Q)j|8pF3VC}%8+e~(v6KayvWl}Pb6TOcGK}IFi-fC1c6@oA zOZ8JUM$6k}xXn~*wAYGQJ=oYiJ$A(E?ZF{SH~T)iy4m;5CZ0P|a$Jk<_z~`L?p}Hh zSY!BAGy;iyE5C5T)g^n2a>DQY;c$RtQB#8J~LvrBEw} zf{{W#sAdbRSSF%sM15g4`y5deZSIy_TTQjTpczvxiHU|gQS)r<nF-r{S#g|sL7Vu`-sbXBS+7eA5BM@-?<(bp=`swLc|=*&%d)8Gq77R}2J16aj-3c5>%4*N z1YND4K)FDi-QYCFnfHPRhOF zwNES*!~Nv}`ZvPHM2F3yUm{>a;Jmf0hxLlNY!2TlXS!N8*NHCWC$ykLE7Z5OYGoy> z)QEcUEU@XyU@t4;8*gDh)MQz6A2yk&Dx&IX3HsV5491wm(u%BQGYs^dG*!hmN89>p z(>_fUnY8=jl-s&85XvR5j9xPhbHZiiag&|Cc}!NV9z|j~-fh)V+nC`pa$%LJtZb-qD8!73oIjZIsNmKj zGp`J!lUHI2n;8QP!tS2%FpPm>cI%s%Zg@TNN^|s<7MtnOs7IW>Dt4u>Go@K1>?ENG z`ui#9uMc|Q0cWIXVmZ9}wZ0vhMf1M_8S0hqnAiaF{H{o@6%YBnOG+VQvsnu>f+2go!#t z{4WngAoIX#Ao=NJ6|@8XQv~_+4?v)U4WSI!j*44*MN${Cnu@2O7ojO=bQ%O$9vJ16 zTCMe0*#nWzfLpTyGKh;wUN90*usuASZMB(Cv;A(j?(#{tJK@PB;u%lUW63_3?sf-l z%`2L%-hq#b41{JSEY0?&{oOGSb9sUx(;pT+0XrU2+)6lR2Rtm|GebeQ%Ny>MT?ZRRMju!jjAFh7fbRq_9g?4MjDog<$wfF>0u$Wu*df z*^s?S(d&+>YRv5wlODy89XL@4a>ec%uu5_6gT(+=tmU^=l&j?M5vU>%5*Qg04WS@g zFtl0C=*YJ9^POW)9!pOzOf&C^+3D2-rIBg&w42^M@y+}|x$QrlefGVJjvc#5I6IEN z`uKIz?|)bSx;5o@y?+{W>;m+|htUs!BVgGHtY0fjwPJvi8WEcsE=M4MIaLL!g<=lO z3F>5)b+*0fGx#quO_Lu2p=f)Au~0D*R7J_Q6-m@$ss03GEd!~TE{eq;J@Uwp9{J#t z$Iy}WuX3UE7kv9EMNuU)2Kw{_VwR*Tic6K$LGzWdzY!6x3t+1RcH141>E+4g^R-|skBrIayhE+5GG&fj`sQtyNHdu?Oe9Z9; z@=%Hcm59m?^QxwU4@rfDW$qdn+JEey;=y1%aQQCwU}QM(kXT3<#;#Ir|1oySF7{A_ zE$}KH?(d$`jYL7dCvj|5fbRIny=*G~XMJ5$nwBU?_r{Lxy@yS;QN5RJk3HZ#eGG~u z6tG++0u8K+!(ye7^@uoy;}A%}DWTa;V5}62k*yqI11c*7zM_b&$O%PZ&CE zfx?qHLz8uVNRlyMqhoV1y}^SF)EAD@#S%+kET+~{=i#sv)ruBUoE|Z5S9ilmZ0-gNyqbXWi*2kb5uJnfqcP8DcB#5lm_}? zW-YfJB<2e+A3HO?5~}A&{m0NM98HHwphCt-)1VV?sQ)IyjA_<^a`uQ*1ec(CNTMpS z#S<)D|1C4>3;6sNauImW5IE~S(92>?4QRQor)0?bL2awhjYzQ!1yy!xNxe$er%1P| zj~nbG^%*X9*geVM8B)KnNgG-^jmu{Y?f7xc0RK7!{`D^Kujbqolwwn)a<&Nysc|cl zcp5jPz%j`36dRMWy7=wTIeW)0uy<2UXofuToeAiL2|BcPX}ZPymi|RP1+VMNWco6_ zLC6%ha@iB4vufW|CI$%`%u&ksCLOtP62g--nL{8 zmdZ}&ELn@A#EH)_4LQ4qLdOk9CNwO-`x*4brdfDl(|T&!!utKG7B;_V@lDE}G%SqO zTF&-!3nR@?C2#PatoADvl zrAcag+^fo(OZ5gMM>CQFURgFVc~oyKXDEgusgh(Ax-cSLMMIKQ%v8n5MLjqT*(-Y% zZ}fXrmnx~=L?@5}x->j-AC6t>9!+=q{RuyN_L0MrH{@i=a>=oxDY+~>tI&m^@5YmL z)g>8iQLiq_F2(DIoCeVZrGQ6q$)fIw<_yWDf`JsfFpIhhc)o=jI$|iTi)}ZoK0GA3 zY)KlBiDEb`E@LhgF_+#A9J2#hCCO&u%5E_fgf@kqBXQS@c}sc|1Cme!zlKeRDFxm~ zWaD&ibx^BB*pJhn`&2dD^RJLOM!^_`i5$CtM2jXQ`PFa2hLXv^Q0+@;`xey?aeER zPZO5wLA{^gi0fgZ@CcMUjXp3)xQ0lTN0ptgRUm)@ARsgfU)4wvdLNWZN2P=j%3DHK z2{jY~w?RUqVg*1^Ww2PKvSjkG-R+5V!b&A$fkbZXid9?2Eo*!r)n^#G%T9L&A{}<_ zl3}TO^1i-x>U7!kFy_;Jnw}9QGw$`9khu{}*31pNCucWyMtrJU^%@qeQ-78{+@g8X zKFLZ1RJCXCrrvf|VA%vZzdy}PmMBGo9sQDN<}00>R`vK+SM4X#+>_Pc^^ zjjYYI(RyhrA?1R8zp7h$B;!`ZX}T~SVDq!3`-_(8jcn2lWu>?Ev;BIgluZX*v7B4+ zyZc>%cjUv6bOE$-T0*xaIY+Ya@Oe6iig_Si@ zCUX^FNw5`)7)WkM5!2(S7uoYrF9)iS^3)paRceE16c{?oNu8|2wAi$@t~560i}@=( zt`$EZ7l&R90Go{VpR$ESc5+hx_s;9UW?lMcB zc-rsog&i6o@5b3*g7^Ix`e!%%2ZNY}Yv31{LZiUqpiPiQ;bt5N0^35Zp??sT2_3ys zs}Av!BYJ3IR~H>|(@y76m1&waB67n+V$%naCK*m}jGAhB!F zGWa}8NZ9Dg@IJ$Mou+h0C2jSPDy~$uwLwvCXU3Kb43`uiR1I_gujR7^7 zw8;?FO%n6kOc`FSNzrauUtd(j;2KRM^9yvh4RrSe=&l{QJwz$Xg@PK1^AOB17~|+w z!ZKH)1tbvYhy`629NMw+$zPbh9l@_k& zMx8!McE=vT=_;5jdWIXa10^ONXy}_Sx^>d55e7vol{E@Y}vbOQ$=bS}u1Yl=6zA zJM065p(spANTMhveMT@GE{39D>E3WpY8&$xl7o6YD+3J9Xrcw38kg*7)E8I7c1DUv zLUKrH?`+9gE7I-$U#0O^qRp+g6}If9jmrvI>`7Y*^;0EM9p_iASfZsT?8C!C#c(*J z`;u@+NC|*CifY-uu-n%fPI#^XET~(emO%w1mW}I!$%3Ex+tb6=z<642yx*@Re6d(E z?Zum?({oF&wXKlpa-k~F*GibDr!Y_Z5CtGa!0QI76G_fNk*yH|L;xopp?gI-QXREi za-b8AQWc6A4M6rlPYckDRZ{6yE@J8z+!%DrN?0=7z!NRCwKWf%5Qveadt_Zyl$b3W z9;U?n_UnG@zhr95<)+7{Dv~9!h?cTb8t_^Zz?aKV{Y96SzHWDNbwW2pt1TQfM~8F6 z>4?TeTemX1GN#M#38rAQ*hXttOK;om>sYuayW!%CH>3-(WXdqxineZcCdSXtpVzW6 zsTpojR8v6$!O7N7gCXdb}JP?d?tfy0G4uOoLb^xa@TfYMetbUnE^@iSl01a84xaw?x1 z^n?dPo^q(OH4OnsaRq&lzq!`tGMWn`&_E{5s-@fnzTU|`Y;y?(rjeWx6!^wZLpD8!h?E%gsdm_NLLP`EDUsxJA$6A|D3k~V%3-xu z0z)kiw6aXT7RuME*vmnGq_V{t9t4NB^aFRh`v-2v#;?Em;5{N+ud2E-U%#5IxxBvf zY1u7*mL+dlkKi=e-UrH_{l@)lL=XV{DuoY`;T8#l*f}- zud?jn!)}sC`eL24sBu4d=rFL)jfjM4)|@NhyiOS776{K*w1SlOW-E$lK&9xkB-Ch1 zMXQAt+q2Wq$}7;O6&1}mui37p8^4Bt{S4}&AIaYg)jX3 z?Nw|o2o(%=rIERCVEw>FY1&mk-<3KzSAVZ8$vO+D9#vU;*}AeJiMLg=ht^zt@tQ+M zAY{cvU3VLBT;v7@a$W@tQ@=hH4i70di|J8s*g90*yt#U)7aBh4Wejyci@FyO=~N|L zDbG<{G8YMRA@&_9aj*rICkfb(v5ADM3K=jpOjAD5)NBNYML;*~>_r|3Fz-ch)=eiR zi<$Cyu%q>z@W5G8a@w@(4+RzX$m-nC{+;A|_#bX1IJzRYX5}Zd`Hcq;ZY*RUH++(R z%4Ej70AlFOobpS)i;|NF zIoK@hD-A9%VCY?}1P?XHj+%w`G`*@mU_n2ubns|tSTN$S^3$<$J#dlUxenaPw~Bwi@QBRPdZnW{gf>={k*BK?vC?mcC~{b==U zx#Ef~Jr;IZ7dZf=?K{a)KE|35Y23kXGAYO4CBefsC&&x4h6s%G#gQ_q{FpKDr@K#iu*gv_5 zYGpU$?I0fE*z^uK!LdQ-MCz3#6aWJ?d;<8eGv1N@X-C!bn{Ve9!rPmN)BPiy*Yn}@ zZXe@U$F?t?t8YxFPx1f9*~k?sFVrh9zv$(=sVhd9V{(wspG_Y0S=4aLcW`pq`SJ8Z zy1tNhd_rf@2VVi2(F$%+qi7f)+D&hNL&t2IM6maBz6`K$>K>E|hHK0ABMsW7^UY|0 zacG#TvX2?Ws_Xx2(+r!hA7^Q*6GdFWSX#C}PbX-@=27^xE3ge(rhFkJLk0u<)W(f0 z^B5u2aOyf=bIzB8MLT+BH|a8R7UBpYJ*2T36 z`q|g2vhp)o{u!o-VIowAMSz-T08i@MWVyc;IA3Ov9+bwDEK5@`$trm!2Js-Pn#c~e zwe%VlT>TmAtMbR-VO#VNV+6lPm?T*yf0AC#whwi3nY@7cwg5~jfl=(^2y3pAA+F+3 zX(&T*6G?%5CX|8OA`=M$f}#>QiP;z;5X+%wplm;1S)X6&357f>**JaI-vO^X&`|o! z$aGPb*%xGTrvp@^@j7t(?IF)kJ)xNy{&n%i_4l8gl4ob-pUQHJV}Efh=3hW-KY%}_ z3zlIG^&I2$MiZ#vsw3@+SUs;gcgljm0GkyDFa#)-gYrZcBh9A_0LBPD8SINfz*UQ; zT33%p*A-h^qC*J$0^Q8v>$aA@RIT=t#89}FDzUj!r|RRUPNh$tWOMi+WF^uX%^t|F z%tl)y0oTka!rV@sipN@}`&&~3C&$Orr%rL->1piVwmHu35+IMQeO~8l1cNt)VqeF!8;*X(jUQLqpR;$E?WLL3oLL zJ`vBu?F$VK|7V=9J^Wzwy*ez)`ul=?P~0+b2j6(i3fEuswWQioEk4eh30qizpQ#rk zK-M_~4HS6TjKuK>0`wq0fh21gW>v8^2+teE$H0q9fmVdjL(GOF(Dval{rwkIzvu%3 zw7at>na~yOns>X>j~|dKD&xQ)kzlz(dI8t%DjC(8*>LbXp-L2BN%2W@cNwk~huKA@wel|6 ztsG_ZZ*YXk7jPA_1%xyU1~hxo8}2gA%GIoA#?&jvRQdY9o8#6kuT#UH8G>HiB4nsv zp&RD1B<>I&Nk9#uN=nVANfBRBDf%MpSC5@|j7gTEe&GF&5iD5$_T1cwxj8nE&wE#o zjlmaoK()p3i7}hKN3+A_`mr+mWT}3vGEic-)zA+lYiaJEMhv+h`X03L0LKCdu|>n( zEDvp4DQei(icYj5p}Ga_m8YzKl6CovZv2y`pV6UDfA`t%viVZB{n_t!Wd{uXpCw#1 znBJ2sJp0}DY~SJ;w($;8yaTYtEi(QGW)B`YaxfYQ9yt;U#N?p-CQ*Eo9JneR@E((oDj-GR>BQD)I>AZ0e18Ca z9b{)aq+%>Lc3`{^D@p~?K#ND@2z&UYThmnh4Z?~ivY5<)lp^-oFN1N~jfT&mA%FSYh{+NG96uU*{ITeN$U z(gTmCKO&c_P3KJ#`JsJi-5P06+;ld9(H z=;`W;$0c?|N;AROT$R{^4>GB`ss6n;>XZG_?YB$)tKWHqN%43#BY!|sHuh!;r72n6 zah;|llDVv+6+3eeEAr~DmT1Sgtc^RoDGJ{7QDkpqfG9$n3UERi0H1U4gHP|h*)%XeaQRf^#q8Ni_ zu|4zzUL28TvyCUxF{feRAW`s=k0R$J4$U37ZIS9OHS~3GuY9=`0a6(sGzYeDrgVa{ zMq;A%^26=sOFYu^W(0Rmrx*C8Gy>R*M*6IalZ)m+sG6XTL$J5kde|%H_<{vM^AH&{xuINE%?D^242>*d1 zHS@=I83ITC>xEB1d`BF3%V(QbBN1S8h zL@&Zoi9uBdDSC=ftTOerCQG?oDaS@km-)!` z)UdgaeF*#4fBgpHU;97)`i=F^S2kBFn`g59xm^D;Ij{klNQWQ?fWFZbARMNlz&gq+ zNJ9gh#?^OdAPv(DxWJ;B1{D@Kr32PiGtly(|3YnaLJbusg1ULCA_|iA(4|+r4VYTY z-vzkT*QLnH9ea1b0b#p}(&>*y4kGD*npkT2b4iTBrP9?UtE$|ks4BZvRXXuao2Rph zOKyMQ%BTx){?+s#Y+zTg3txX^mlkF*-&JwD9dyA{ss_GrQ_WI(6%h?axcO5H?oOj+x z@fbo8c%L?O#wh3>S%G=zW*Gu3c~nLNvRujf2lJUo&JBVo<`fuB9C<0Tvnyn~{;*4` z!WY}XDbHhj`rg6vE85t**kWoJ!9ElQB+y^G^q-oh7f!5v1D6Y^824o zWwT(Z7~h7T=z+eLh73lQ4beJ+CCWayE6`LQLILxR1@7>oVj$zgW%!$5vbX{#=Vqae z&h4mg;Zxg-{h9ii<8w1R*h0WH2QV8|Oz+q+j@duwu;ID-44a$7Ij1iq_>(C2r2_xr z7~WsROlpWAV)#zP0*{!7VZ1zLhh!0o68u)xGR0b^My4ctX+Y6F4O4uMrpnx>HD$ms z=oGY&InDt1sk`gn%H`P5Q2kqMD94TsDNe*ULTpttjg%O3NO_nd!5`*9w`q0A{7JE6 zW*Pyru9uZ}%$NU4R~pC#V)DQNz16Wv}(R z`d5&{!8Xq*8G2uaV-C;J?sLkFHGKlka|6+Br&%3(k{?k^QP|Zf$n!Q>O`VOmm%vqs zd;)OA2C4|zEtWk9(bI|ubhargF~$M^r^{wKbcJ)ce8?RFn?yXsHC_cZ15U*f(nbouTB$A9yiGiT1Q*TH?S zF4Ns|$OI)DbUSL3CG~;O7^fSERXP|3TxAaH%S2EH=ip*Rv>**4FAQ^Nai6Ovjq~h; z8VBt_uEVj~J``7Bd>+at<`a1~J}xKYYBHbyAh$L@&$n0dEx-|?`7{gzF&7HyGcgdEtfj5k_xQoHUP(cD$Sfz!$Vy1Q96JhB!i0vg6nc zvLlbm(t1V1#FO4Fi&Ki{8(rP;?(^fz0*~3w)spYe)0u1{F80aiZ215fEw=vWfh^k!X9>x!I#1UG!*ie6<{=LNZRENNJKtH z;0r>;J#1vyeYk~E1Bx|`qbrC)$7F**)k2t9z_Zz}SM+Lz?K0a^J-wlz;xc=phR<#3 zi4K`n4l{RmSTPaYlh^mxPs>t1B*`q*CMiMFj=;e8`PvY$-!a1OzYm^T9f5a>dV@?} zvCa2dk&8N#V7kF@Pfu%`5%aCjSh^DGbzfQkj?|veJuUH29*@iH*Yh5+YZ!t4IlnK{ z*B7zPkSxVIq|^6qRW$1c6)}eN@O!N==O5?v(WU==eH1RkOa@67G=#dscy*+DNGrqn z@ZZ!;@2CDz;I^FtmSP=4Pzjv3?Eki(o=4O@I>^P2A;#p`7DY2}ge0fDCdXHnCF_=z z5CjK1un)uDBoGRVBR~a7+~hWmK+uahRnVNkNYD}X0~OIRdybD(o8O!1D@80b zs7SF+Ne&f|)S2FIU?f|0HQ3`mT>q}zk(TgYtsthc{IR~ zat>zRWZ;Mc1x9DAN!DFd7p5;DE9~jp?_e`{2I2^ zGr(u7#8+wqRmd+A{N(@1fn|`QLwOf)V&NNDjYg5tHIPSx%c(iF2vtzkpsIV|mG4DB zvWI1hIc}g25C!4>0odnsOMmr8=O1Oa?A~*0XFE%PJeio-gvv0jC+JGas_1Xc02w&2 z$>U)gDTuLxC?Pl4i!V0X(NjJkYRocBs2n03LH4=__HCHB@WP3%sZh8N&L2(bv&Edx z6L1G5DQI{{GlLs83=YG!%qDZ5V6?Lgx--oXy!k9WF1p%fQxwe(H){j0M_-&lU!39* zd4vP61-&eDwLmy6w>g_ydrkvhy{PHuB0zmLpg&D7Oc^HWTrxNlOgc&r#8;sHLq5cF zC)hj^5Yy0|&ZN_48oO++l{`d(#N89GIATBlq3n^Lb%(vy_jTLSe`tHd|M`sk9Z^0bKf}KN zeo>s&RLNGcMS{*BIGUYRZAsN;VWA*90*cvd9kyOK+z_jOQATv&okNeLMa!j$*sAu-YwVv+i<-+4)3$0|^s2igcd**Z*}sQQ_EW5( zL0PHfLqPOumxJ!YUkYUhoC1aolrn6`;7bLS6f;fx)dAY7gUFcF2M!u>^YV_EonA}2 z;aXieU$%c@$x~mRde?`(Qf7nOvXMwO@)5peo85a%bIrG z=6}?LY-^`}Vc;iZU88on%&XK(dyPufAAeH3KS%&Qw0BTG?d zGwk6M&7>4~=5f*i2`x|2L`v0X*=&YF@iWdAT|#*yf({($bI_kotRYkZT`P#V8 zt_9331u|6gJo<)fTnJ&%B4C8_4S)PTw{3(^g>|$0Rku4!A7>ezFMga|Tqcz(67B8N#ID5Jg{-CS7Z| zJXKNfYuh(&RCQCnsh}ln&lduLaG>Jk9(jr<`7n~vgC1Z3!Uk)L%@tLLf$++-N_8W({raKvgzrdQ$pF|>ugiC)ad zL@~Lb8FRDPot;aoH+}o4`kZQhAk*8MAqos6lYtMI>V9CnbeNWoY?<1*lfvFPW`7#- z(a(XKP}bGUWDs!@Alu~8uQ{H+;vf#-`wzf(nyp9~1hEtZEn;&?atQoB*Z`deInILoewPSC9=-Sz8$CtOQ)ffJ#D3;1FCQ0$A7 zzbcZA*$l-m!iQ5G5mAL;la)0gIZ=psKddFJmki@+BVoK`W$IsfNpxu+*49?YyIgks zS>BI%BPf$VA(XLSdiq6C`K?n})yuB3dpf&{1o$cc5*FR$@U zS6lq+>Gq*FisB`*eBmK~OLh8hQa;@CdGGdW%6Fu3-j}Lw{|L_dQobes*#bCr1zwP= z(C_D%Y7B5FY&E1ksNtqXf{bE{plaAEH2<*h3kjbPoT8+{7PJtuUWj=h$*UFy^%in) zumjH&gG5i@7h$ZlvFFunwh!Eg9Bi9HK4GUYdkRJu+ib(J%I<>(d+%l&$-wdrD&q0# zwJ95V9pAT+qkSKOI$8SOhWUZM(eNOoFj|qLuXgf_H=3HV1y-VU58_u1ya2`{`{B~Q zx>%smPmIerS_J1Ru@kh9bTN?{jUXoMkSW(i26Ch0z&s-eltf>k zQ^DkG$XSI!fGk&#k3izXjg@R%kD+&~ybTB|!Ny z4*x~6E*7-F3`g%tIGunh;~c>|yOhvd{C05lyYFF>i}|>VDYZ9#@1A!*^Kc{E_p;&O zs-sI~{x*4GdMV>pZl>@e><6i?FE$c-_a^r*D+8VkuKahy*iZ~)!4;;rZM!lf8M@D*}A!ZdPR_!JCC))Rrl2txn?(Rq;& zE;uQg;kM0hcCtPCLrMN&v;*kIWS{syqdDwkiqRj66edw=PbS-w^%wXTTf@KR(pOoC zlRlW?aTJDeD2|=fRi?q8z{YVyvi;Y5`wZVY7?u-*ME>j!%#vGR=OImyfT0@fHVPbb zAR`<#)6|>W*8aYupJ0)T?MI4G1xF33Md2J14R+5N`Ms4{2*@Q z{40mA)QnU@bom2zK=-$Vy&a_hGQp!DVUh-gG7r?dow?Qa3yZxuUx!QGt0^N``RQUU z*%lOaDE~N=(#CM!%=>Ih8gQree8p&26$m78qarDr+Aajo@E6^w;^cO*;Iiy|)G&+~ z!iu|xye`Bht09AJ!rKa!5gujuDDtGRu!O%OxIJMi#glObcx9$inc@aD=lFo z)0@7a_t8R94<(d{BI`Tzt7K`rA~Rn>w{ly3IZt%oqP!&CLBlF}A^6-E<&pyn64*(J z05#&uWxiMybPEgtGEArs!IB%oht?$k`uDqzj%ZsC%g6k|us0Yq3W^y?b~WTn10Z~| z-2S@)tm$AlguE<&IO+FV;m%mD$bB}B%#1;ofPaCTB2JVUX)uu2oJO%nnxbR(lPD+> zbug}*?7aHskJF+-cYOW+H@?--_8&8}Q<{n{a<%5?~b{-V$zN>~HX$+JZgGX4=6Q9w^k0DmsP3m=ZC8qvHCZu&xT|BYAH ze;*6^G;_00iLm>C83ck+(H}yn5Bp{;QU96*Al}sEoC$y+7i~?aV`?~*So77WFJ#f( zzfr@!h!j^mo5=GY4+JgI?+f_-#1ED*Swfh`1)&2A$<&IObGT9feTqrZzu4C1WGD`D z6qz)2o*xnph1v1?@r4XKD>QAD^qz36B_dsW7&0>fw;WcmnCO?pA8Rqz=X%=okNDM7 zy31?3kZ60n6?$GB22Q~Bzf!{4P*}d^up}q;>Z;73A&5WJ;_<|=>nT$WtPJ2T8@Ugp zYkJ^M_!V@`Vk4@#1aP22l~z#Ya|6Wk%fiJt3j-ZN5F$r0*w%2tvNMtkL9Ks-nHo*! z%jHdF=56fMk0aeA8csn@d9YVX-_F=pQF4h}Mc85W=e?aPJ3CW|3|qIp{_oC#d>irt zkkAan$5X>@44x{I1=H}ke1iP~^D6^dDi&T|QAlNY%J}4pU`;&saf($-wl!nb>c4MB zs^!_}qs_Rq)xEu0AOuH`*^&CQ6qSZ(>K1yRB+TG_CorceCvPjH4>zrxU^?<`NKI?i z@oQAz2*7D5UcKUy9|P_xE*EHWHJnwWbXhnnXS=#Ha=Nd_l?)&|JrkM(4V-PvuJe*{3o+%oR$tgr5q<;=xM{ZS{k(p04C-D!F>c z1tr{#|0PduLwPkIQFInQVd&7G;`VogRGU?DywT-+(>v`f@gXi---En>U{H-PHSQ}} z31G)S__<~2-zgvk!qAcLfb~0cL(+^QVr2vDlOW6mSHPv&w*EULWLf%u=(e*s$H>wO zAbO76gUAVnt-EM*UVV5m4m7K|@cJsb)&{Yj+gHG$m~EKC4O{U28V z3BCAY-cS0v&yI+q=vnb z9jAFkVR`63XMG9c@qWx1A-_!FK)t92f&W7N7#1vo%6QR5c1Dmd zU8Z>VJ5ZQ(5tIeTW!^tjKNWQx#~9CnUK2cadOfXH*Npd}(I&D~8kHq-R6v?bUb=Iy zkr#ORwMd5UAirKPTyl(8RGxjYev-F=h@w9HN6%l$IQ8(G$PL%L!RwIh>?_V-MZ3j9 z4Z1#OEGo#_gP$H|9SM(K5qVIM6%eT!aj6s}2oAwyfl}iG$%9WG7x>ax#T+H;Rp3Pf zbrDVtm8M9h6HXwB71?~m#etW9{C?aSKfQQkxBcy@1diGzd<_AVG$0YDH^0j9<*2M!+$-}`-9!zsuoe;*4 zV-u1JS6sxn5tEH@;aVifUOa=R{|ZDIGJ)Y5>~`)m4C`iW1Ueo;|g zgb^4yLo@Qk3EG~)LK#-aODBkCPQ1j#FMa{xCA5lhbMBMhCI_iR(b$`5jZe@hLx z3%r77$vSp|22$fXSJP@h&pXxxx)+L3wNe`FcZ>`657~%#z;b)-DHieiBJx&E^AXG| zZPOH=y*Y|=hjbm$yR%qWL)&Rs1rLI_4gCU%uwb9AT`0QpxWgyz#TnFs{PxZG{2Y3D z1AGQogHLd+umx@ac!0QaxC$-<=!gAWr1q076M+;UHRm z&vcpjmt9}R>noIj8K7nMNJUK{{)ZMRfaVSWg%)VQ>MPi(6l(kfr4Fn_Aw~qw0SQ6M z6uz)aD~~`UL$AcsG)aldg7kGA^ zKkqc2ciOSTNN+xg=QVjN*9izhAx6)gf;m_)#E@Qg?i9E?kA5;D)6)xxi{kvA4roon zI`2KUfWY50n@_*|gwvLD`Z55&1h^M8Wx@*hST-9*BB%i^z_Ib%e?wQkjCOdKa{+xv z6Ej3fry!YpV+AdA0>k*|wayqI{GY}8j+@zI8A2;X-eNgXYUp~D| zj@-d*Gx<))g^BX!0*VzcnC0&fbN7CV%#}44x z6xi^ey-a6omTT&M;92}R&0~0|F+=!=Sny*0N%Q0^AK`O1d(S=O%GsM=hXE>v&|bKv_@cX{L?W&j>p?NL>Fo!jk$@=0yYsnj({cyGq0fY4 z!DJ#7TkmyyeXSXf$MX7u{++k(^aj|%m7BA}Skg?2*jR6}H{a8f?-dh<-?Y84N_uns z-gq>mX`yKR8*W$18#MHgD+bvf=}C_6-aQ)c0L#NVk~-$=@0QJ1(uH1i&N^vnOXCj> z4H=!UoX7VppU3m(9xR{K=<}r|W9suPjdaiFXf|N;+*erZE2cPg_oggPagXY?5V$`c73*q2A>P8?ce`x$Ks;Pu)qE* z@1#{yftGViwa*C^I_I6QY{|>t`Lb>x{`rcwdL3jrEAs?U>SPUzZ=$*6!g3rNSxPH; zg2d7#Y%m%<2M@<4DwLShsPb&pX1f~8+`jbTDMv-O5;GcLdz^=iPyT zo2A@=JCV4C740N8i>0LvSzYzQN)=Lj3`JASt4xhkL8tiG7J$)kq9N^=SeV?LBpV>D#xo>hCJQ9V>z1MiYv;W2)`+zRZ9Hf5@>f58?qyz@-cR$0 zfexO6hOq^^PHqZcJC5W!*A6I10j@pb4;X)*FHX7u<`Z`{XiZK*N*HG# zMZM(<)>xy3zP0Gmfo!Uzh@O$HyDT=|)3pJo#0zS*=@$*7_yH0-A1D~Qs2k3rygC7u zOKlq@#Pv^W+X#iY!C)m&qq$zOqfqfREY4{if}9PlcUkMKUbL=_&bAFrPJI;kq@)ZR z2HKki^5&qHf4q5nhicPEJ8iCGoPUg(`IzGbrLmKQ4Up|$fNXccHo~t*aTowvw*y~l z09(ouC0F=Z^dwiwN&p6rOCOwr{tg{#oSz$aNyjO-?PUE7e`a&th!|ouy6{Z0k}_ai zWOXiM4HYDlz;DUG9mwO)9o?cJs_FVn){6`y)`nkV2!!fG?8Hz0rv!U!M)Unxw&fqQ zs}(tce18PGh*-v=EgNQ_Kqf!_307b5X@B<#N&3X!p)uSqFZ2Pne;Brt2dkwxni!W^ zi;l(8V6IdtRUEP?D+WeK*+(kja3!0) zBr827%b)dS59Ctm_O9EyzwUNFC3fG|-8G6ebe6>zIlk#K@bp~MvLUr?nbV|~Gc_=; zS4p%;H_>6olo&^^4)V~V`<5#?Z(%s^*g5!`=Md4OFUz!`KJPyJ0{aQ(CPh4v#DYai z+%Xd38f?wkR%vzJWpeb`>vjU&c+9f4L1wM)Aj!1`E7o*WSMI!o3sC%Az{*MoQ$7fh zH4QGlwsReA_b6I!=gp6Exw*`zXyDze@iT;cu~T|`4PHE&JCKqfw;D7O9D^+RTGmxs zxC%g0jjtp^tA~I%a~f)h;%_ls^3(8wJgr=;$0tH7J40h3tUMMAMY>wYQmb~ijz=ul zf6#Z-bjR!#USuNFVvBKKq$@R%y2((!imHB1_U02~q0W_|iI5aCTPISxSEa@xtCGLL zS9G!^){){@$3rm^hdWoD6{zGqZ7?8s~sbDn#&@k5Oe1XSBam`(6tW^d1g0Pe@sKv>c zWxxNk-lHErdUVI;q4!#m-`{`frT1T|JUX;t$5EW^f3FpuyX1jOE_ncba?bNGOJD1W z#bu+*=dZ&!X{Hp|?;kAP^2u9o-LrMYLvRK>eCW`_2WKc1VVo+?e<}szpuAxUV{e`|$i8|EDxMZFM>n3U*YOgqR1NDjWXPYpbi_OsOD*!rW_vLpZ7x^6--{)sI}-%wmxZMSB zRZm)AsMd*t+cDyLt}v9CncTAd=BDD2ufPj_GVKG^gIsAt{eF(Ipw<2m14AoskS~C{ED8Om{0lOI;V2+|0z$X2JQtE( zthyA~i7VaSySGkt_xOyV4izgssr?gHU~q76II`^xKJU6uI%$s&Nwnlf%j+h$?)7aku7a;sRcpljl?pj>s*(x- z`sT_c@U#*|+JS~(Sdxb{!2Pa`-vr5_4Xq5q5|f~h2l0^mgKJ2m>_2*uRc@#$RVH`Uu0`tFy?cA-3Oj@}MMEjjs&uT-vBJiBRF-ab}o^bW@=I7o;lhS3!e zP&4!Q+`6~NR+(l_p&`&V`!rNSOR}w3AN}*2It#9#-BV%<_sm>ymma~-V37QCahqs5FF*#os1RAQN~be`}j;d8>5QB9h+v_2S^3ljKfnHtgx$gPMk zL^qRCKw=6tcj^y)fD1CR5HUOu2Bab27bJ*(kr+l)5~LFWrW#KP#F2(oG(~=pE212t z`ou!9QYu%=xRs8JH9Qk*;))2OE+IS%Z{zwTE#8D|Q^X3sVxBE@$a>iC4_h&-&FwKn z2;!J#dOdk7ZsI(CCZL0)bEm9EP|A#3d5_nWd^Uu;Xn5RhxQ}kvS>XM zWO2}Exe&}QwTR5^bKAa(B!!rm(cx|%LE4wZR$&t1HwjRdReiS0hv=vjex(TO>-w-x zJIbbYO-7s{`vL`S53h&$0O92|-JX2X7cr3Vp)06ex}N3hT#!VTe)%ScFet9mVy*9*at zmhG+bf?1^0swEnVu#9PvI@8iwR*MJ;90z8b0Ic<{1710NG!!}-mc0k=idg6MnJexNyFHggfT7uj zapR2!z5-I@5|2B4_X_sKTS9Vh#v6I_m}QNIGDkY%K>pq3GG=a0!eKREap@AZfmsW83wFTAD-nv2H&E z?dj6{+21HgO9p~=dmku3kY+S(KF&k=YM91++0wOtzsILjv#` zj6mUB^1!1S(4q1n1ZHYwtY#FcAYq|cK@oPQU%6}@gyy=-lzw98=N{Jo<1Nbe-ESG* z{&9Q{4{uk_th-co%Bh#~+s-|FOQY!GEf_0Wv;Qn|QsyCB+h}z*%J6BZz{ohj5J9~9 z{=d%7v^k0*jN|*y?q)Z;_z8UDr|={A#y6Dzp7|58K+0lYO!v%mKfmsoo#~$L=jn$wg?s^B z)4t%pN=;m%;i?9JmBiNe{AI7Rx3}zF%J2o*R5_Q)4(E!6+;BE?elL}1^10HIu98{U zwYdSy2L|wKQ{(CGj>GLsPg6;zfGbyDoa044oXMr<_OZ<@Ak$keQMa&|Yeu%VqC&;n zOe)7R|Fux&?F*$YQ@P?6rRMzE%?f_)V63jI%CIhjrY_}P{JS!FE-7Owb7_Dc4IA=} zrLL|L$Hl1b$m*22dRAlOs%mu=-6Up;>GV(--l~Q_S8CZCEBOO;dloe`k8D}r(m(@6 zv~SzbWf#o7;>yDKQ}yPWU%FQ}t+mIoLAC|FSMjXH^-mx5>{z!;K4;B(JN=8iQJFk% z6vy`pDCF+VX3qWM@)2}Be(Aa{JFKq5&8_P3W0I7ayoFfOcTDtyjqTVGJ_{V^F-=kO zg~fL3x(_Y7h{*NPSjUgM9XC4sg!xVq0U5PK2(0&k2RbuE}ao(6ORv zS$|*HQEExIPMH%Ug`8JxYiV2;c8;$Y>tD0BZ>(oyIb75_SZr%64sw0lEY|jL+$rRM zX=}7(tYh`vrLnHCwXiZDqM_lq$v4`+c3HV0U0z)p<(Xo?Ig{?;YQ)7sTKAcoOTX+F zVl7V7M=>*PMx)cb&kFRJlEl;Ov;3rZhEAmOif2Z+_x`^&-|_@f#t|nck2tE!{wVTvlu-bcU(w8-VJq6`s*Zkp zXbf1!Vzwk*=*Ci-<@d1HxSaii3i{B`F_~2~7`y{~A>dBj#a`xWRN33S2Q^r*X^`vE zA%;(bfe;afIYzmL53q43x*j9gfKiNL923}x`>+Z3V>2f40Jh*kY{fQg#|}J%hp`j8 z@CbHe5BB0wJch^d1fIk`dX+zbr%=a1OyLlwaTrH%6vx0%Q%;>7#|fOoDa_+(JcDQP z9G=GuTuI_3oW{#|1+U^YypA_;25;gmyp6Lo12~8Ccn9y|J$eCsA0OaDe1wm20iV#* z-KSio{xf`zFYqNUQtSINuHY+totvMTo~YGoCLI4Kw6*UjbQStZXeqsAX_<{I=_<{I=_<{I=_<{I= z_|&UTT9EYr$xhu*-xjw;g&Y! Y=6j1jlOpxo+1WVP?`OupGy5j|8*ns+>i_@% literal 0 HcmV?d00001 diff --git a/public/js/controllers.js b/public/js/controllers.js index 127cc8b..f434173 100644 --- a/public/js/controllers.js +++ b/public/js/controllers.js @@ -24,6 +24,7 @@ function StatsCtrl($scope, $filter, socket, _, toastr) { $scope.nodes = []; $scope.map = []; + $scope.blockPropagationChart = []; $scope.latency = 0; @@ -125,7 +126,6 @@ function StatsCtrl($scope, $filter, socket, _, toastr) { case "blockPropagationChart": $scope.blockPropagationChart = data; - makeBlockPropagationChart(); break; @@ -175,31 +175,6 @@ function StatsCtrl($scope, $filter, socket, _, toastr) { }); } - function makeBlockPropagationChart() - { - jQuery('.spark-blockpropagation').sparkline(_.map($scope.blockPropagationChart, function(history) { - if(typeof history.propagation === 'undefined') - return -1; - - return history.propagation; - }), { - type: 'bar', - negBarColor: '#7f7f7f', - zeroAxis: false, - barWidth : 2, - barSpacing : 1, - tooltipSuffix: ' ms', - chartRangeMax: 8000, - colorMap: jQuery.range_map({ - '0:1': '#10a0de', - '1:1000': '#7bcc3a', - '1001:3000': '#FFD162', - '3001:7000': '#ff8a00', - '7001:': '#F74B4B' - }) - }); - } - function addNewNode(data) { var index = findIndex({id: data.id}); diff --git a/public/js/directives.js b/public/js/directives.js index d7337b7..30bc00f 100644 --- a/public/js/directives.js +++ b/public/js/directives.js @@ -75,4 +75,96 @@ angular.module('netStatsApp.directives', []). }); } }; +}]). + directive('histogram', ['$compile', function($compile) { + return { + restrict: 'EA', + scope: { + data: '=' + }, + link: function(scope, element, attrs) { + var margin = {top: 0, right: 0, bottom: 0, left: 5}; + var width = 285 - margin.left - margin.right, + height = 173 - margin.top - margin.bottom; + + var TICKS = 40; + + var x = d3.scale.linear() + .domain([0, 20000]) + .rangeRound([0, width]) + .interpolate(d3.interpolateRound); + + var y = d3.scale.linear() + .range([height, 0]) + .interpolate(d3.interpolateRound); + + var xAxis = d3.svg.axis() + .scale(x) + .orient("bottom") + .ticks(4, ",.1s") + .tickFormat(function(t){ return t/1000 + "s"}); + + var yAxis = d3.svg.axis() + .scale(y) + .orient("left") + .ticks(4); + + var line = d3.svg.line() + .x(function(d) { return x(d.x + d.dx); }) + .y(function(d) { return y(d.y); }) + .interpolate('basis'); + + scope.init = function() { + + var data = d3.layout.histogram() + .frequency(true) + .bins(x.ticks(TICKS)) + (scope.data); + + y.domain([0, d3.max(data, function(d) { return d.y; })]); + + element.empty(); + + var svg = d3.select(".d3-blockpropagation").append("svg") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + + svg.append("g") + .attr("class", "x axis") + .attr("transform", "translate(0," + height + ")") + // .attr("transform", "translate(0,0)") + .call(xAxis); + + svg.append("g") + .attr("class", "y axis") + .attr("transform", "translate(0, 0)") + // .attr("transform", "translate(" + width + ", 0)") + .call(yAxis); + + + svg.selectAll(".bar") + .data(data) + .enter().insert("rect", ".axis") + .attr("class", "bar") + .attr("x", function(d) { return x(d.x) + 1; }) + .attr("y", function(d) { return y(d.y); }) + .attr("rx", 1.5) + .attr("ry", 1.5) + .attr("width", x(data[0].dx + data[0].x) - x(data[0].x) - 1) + .attr("height", function(d) { return height - y(d.y); }); + + svg.append("path") + .attr("class", "line") + .attr("d", line(data)); + } + + scope.init(); + + scope.$watch('data', function() { + scope.init(); + }, true); + } + }; }]); \ No newline at end of file diff --git a/public/js/filters.js b/public/js/filters.js index a4fc293..d5f42e7 100644 --- a/public/js/filters.js +++ b/public/js/filters.js @@ -50,6 +50,11 @@ angular.module('netStatsApp.filters', []) tmp[0] = tmp[0].replace('Ethereum(++)', 'Eth'); + if(tmp[0].indexOf('pyethapp') === 0) + { + tmp[0] = 'pyeth'; + } + if(tmp[1][0] !== 'v' && tmp[1][2] !== '.') { tmp.splice(1,1); diff --git a/public/js/script.js b/public/js/script.js index 475bf2f..05d034e 100644 --- a/public/js/script.js +++ b/public/js/script.js @@ -20,8 +20,56 @@ }); moment.relativeTimeThreshold('s', 60); - moment.relativeTimeThreshold('m', 60); - moment.relativeTimeThreshold('h', 24); - moment.relativeTimeThreshold('d', 28); - moment.relativeTimeThreshold('M', 12); + moment.relativeTimeThreshold('m', 60); + moment.relativeTimeThreshold('h', 24); + moment.relativeTimeThreshold('d', 28); + moment.relativeTimeThreshold('M', 12); + + + json = [4292,12436,13141,14268,14650,0,55,774,891,1045,1184,1520,1786,1819,2103,2523,2846,2895,3010,3219,13046,0,284,507,525,1410,1531,1673,1803,1978,2652,2961,4224,4863,5056,12281,0,561,812,903,2161,2210,2312,2450,2559,2725,3273,4559,4727,5868,7777,0,1621,6982,9008,14035,0,1181,2753,2782,3580,3945,5779,7936,21489,0,196,1587,1611,1648,2603,2998,3802,4265,4464,5323,5606,6551,9982,10417,0,884,989,1202,1247,1282,2297,2577,2735,2935,3288,4261,4652,4706,4855,6509]; + + // var data = lineData = d3.layout.histogram() + // .frequency(true) + // .bins(x.ticks(40)) + // (json); + + // y.domain([0, d3.max(data, function(d) { return d.y; })]); + + /* Start drawing */ + + + + // d3.tsv("histogram.tsv", type, function(error, histogram) { + // var n = d3.sum(histogram, function(d) { return d.y = d.a; }); + + // y.domain([0, d3.max(histogram, function(d) { return d.y; })]); + + // var bar = svg.insert("g", ".axis") + // .attr("class", "bar") + // .selectAll("g") + // .data(histogram) + // .enter().append("g") + // .attr("transform", function(d) { return "translate(" + x(d.x) + ",0)"; }); + + // bar.append("rect") + // .attr("class", "b") + // .attr("x", 1) + // .attr("y", function(d) { return y(d.b); }) + // .attr("width", x(histogram[0].dx) - 1) + // .attr("height", function(d) { return height - y(d.b); }); + + // bar.append("rect") + // .attr("class", "a") + // .attr("x", 1) + // .attr("y", function(d) { return y(d.y); }) + // .attr("width", x(histogram[0].dx) - 1) + // .attr("height", function(d) { return height - y(d.a); }); + + // bar.filter(function(d) { return d.y / n >= .0095; }).append("text") + // .attr("dy", ".015em") + // .attr("transform", function(d) { return "translate(" + x(histogram[0].dx) / 2 + "," + (y(1000) + 6) + ")rotate(-90)"; }) + // // .attr("transform", function(d) { return "translate(" + x(histogram[0].dx) / 2 + "," + (y(d.y) + 6) + ")rotate(-90)"; }) + // .text(function(d) { return formatPercent(d.y / n); }); + // }); + })(); \ No newline at end of file diff --git a/views/index.jade b/views/index.jade index f6cbdf8..8fb01c5 100644 --- a/views/index.jade +++ b/views/index.jade @@ -65,16 +65,16 @@ block content span.small-title block time span.big-details.spark-blocktimes - div.col-xs-4.stat-holder - div.big-info.chart - span.small-title block propagation - span.big-details.spark-blockpropagation - div.col-xs-4.stat-holder div.big-info.chart span.small-title difficulty span.big-details.spark-difficulty + div.col-xs-4.stat-holder.pull-right + div.big-info.chart.double-chart + span.small-title block propagation + histogram.big-details.d3-blockpropagation(data="blockPropagationChart") + div.col-xs-4.stat-holder div.big-info.chart span.small-title transactions @@ -106,9 +106,9 @@ block content table.table.table-striped thead tr.text-info - th - i.icon-node(data-toggle="tooltip", data-placement="top", title="Node name", ng-click="orderTable(['-stats.active', 'info.name'], false)") th.th-nodename + i.icon-node(data-toggle="tooltip", data-placement="top", title="Node name", ng-click="orderTable(['-stats.active', 'info.name'], false)") + th.th-nodetype i.icon-laptop(data-toggle="tooltip", data-placement="top", title="Node type", ng-click="orderTable(['-stats.active', 'info.node'], false)") th.th-latency i.icon-clock(data-toggle="tooltip", data-placement="top", title="Node latency", ng-click="orderTable(['-stats.active', 'stats.latency'], false)")