From f1b0965d96f997a5be6adfe5420ec22ede94f765 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Wed, 9 Nov 2011 11:04:44 +0100 Subject: [PATCH 01/37] Misc changes --- root/static/img/zoom-new.png | Bin 0 -> 37521 bytes root/static/js/jquery.sparkline.min.js | 94 +++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 root/static/img/zoom-new.png create mode 100644 root/static/js/jquery.sparkline.min.js diff --git a/root/static/img/zoom-new.png b/root/static/img/zoom-new.png new file mode 100644 index 0000000000000000000000000000000000000000..1336d417f2d345cf1edf2d201ff346461854deda GIT binary patch literal 37521 zcmdSgWl$Z#+aP)*xFiI3had-cm*DOMcR0Aa1$QU7TL|v%?#{v8CD_4j$@|~h+Wm5C z?|nbru9}&i=k(Nc&rHo!onJrUit-XDhKg8u=gVygZ`t_`4B0K*>-G&XjtOGDDBdg3 zbT%~hK4W)%dUw0Lx>^M*$b@7K-rj>r{}3}g{I3#J7_<4psN;Cy=k5Kna-i^^AGm!s z*+2GOUn;hCQ!a>+e64(|o{75#A658rW)oUF$I9h=7$o%{JKvR7oT?lXrT(&vnsQ@4 zzK0f{!%cAZ-z1tgfBqP$q>Yt`_|wMd+eiJ=$MWAQG=;2r5D@$|Hdd-CA6L(3*==<& zL4b-ghWtYQZ_5o6BagY+(Y`NBM1IvmDQD5g+CI6lYBS5|)!G(sVXk_|`sH-Gpe}D~@HoeMK(_fj2@uS5 zyrTM?em=GzXLy2ccEfWOr+4U=CVnhWAXg{iB{(yni>*;JTjH&$=I%hpk37!eaz5%4 z!$;-d<#LB-ulC67F|+Vy>+EhwW9Bp)BQsg|4GOw@@Ru>rp)cT9-(n~iTueC91eFOg z^T?dUMk!&Uv>HYc*+;oTXkBor3p$n?AxBR4xKeKcn~{m783#)Ci!Yf~ z9=Kfb@|F{P#?9cDkx5fX_gI3~rit6lly7~w(&V>#5xkH$1@n;9nA)e934Xf1B7x75 z3R8~LjLR@8a3sqn^6IJQ5EbRMk)>OGZ46dy_?d_unA&pfFSeb`+F_ap2dQ_nu9Bf! zlNCodw_ggbYQD%u-fNA`6#I-hFRU-pA2nu=#8C(cQ3TewPBmz+Xz~Cu439PIMwc+% zjt-)PLFp`e2Xrjo#`Cvl_2SOJB-$9cej5{FO_F=LiGxfg<^0ksq zvCxd5s7+M*!;?<%{6|mJ=asO}b44Yy6yaVKf19a$HF!3z2;X{w&){NakZ_O~l8)FY zF%zR=$l8$WiZ5&I2#Ecr4bLvzSPK0Fdrt|M!79@@Lh`f44AB{qkNOQq*}JC8DwIZF zw>e7|)JAQXh6f2)%?~VNvm)K3e^1{HB1;lj{vqckx$c5s+td(Yv1b>b6pG5UP_Tf) zb-;&9uufRm4ZD2o#S?ZkHVfwxHc8VZlMhKI?aXjx_|q+8EMCehe4>N9$=xK�s@$ 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 literal 0 HcmV?d00001 diff --git a/root/static/js/jquery.sparkline.min.js b/root/static/js/jquery.sparkline.min.js new file mode 100644 index 0000000..fe745b4 --- /dev/null +++ b/root/static/js/jquery.sparkline.min.js @@ -0,0 +1,94 @@ +/* jquery.sparkline 1.6 - http://omnipotent.net/jquery.sparkline/ +** Licensed under the New BSD License - see above site for details */ + +(function($){var defaults={common:{type:'line',lineColor:'#00f',fillColor:'#cdf',defaultPixelsPerValue:3,width:'auto',height:'auto',composite:false,tagValuesAttribute:'values',tagOptionsPrefix:'spark',enableTagOptions:false},line:{spotColor:'#f80',spotRadius:1.5,minSpotColor:'#f80',maxSpotColor:'#f80',lineWidth:1,normalRangeMin:undefined,normalRangeMax:undefined,normalRangeColor:'#ccc',drawNormalOnTop:false,chartRangeMin:undefined,chartRangeMax:undefined,chartRangeMinX:undefined,chartRangeMaxX:undefined},bar:{barColor:'#00f',negBarColor:'#f44',zeroColor:undefined,nullColor:undefined,zeroAxis:undefined,barWidth:4,barSpacing:1,chartRangeMax:undefined,chartRangeMin:undefined,chartRangeClip:false,colorMap:undefined},tristate:{barWidth:4,barSpacing:1,posBarColor:'#6f6',negBarColor:'#f44',zeroBarColor:'#999',colorMap:{}},discrete:{lineHeight:'auto',thresholdColor:undefined,thresholdValue:0,chartRangeMax:undefined,chartRangeMin:undefined,chartRangeClip:false},bullet:{targetColor:'red',targetWidth:3,performanceColor:'blue',rangeColors:['#D3DAFE','#A8B6FF','#7F94FF'],base:undefined},pie:{sliceColors:['#f00','#0f0','#00f']},box:{raw:false,boxLineColor:'black',boxFillColor:'#cdf',whiskerColor:'black',outlierLineColor:'#333',outlierFillColor:'white',medianColor:'red',showOutliers:true,outlierIQR:1.5,spotRadius:1.5,target:undefined,targetColor:'#4a2',chartRangeMax:undefined,chartRangeMin:undefined}};var VCanvas_base,VCanvas_canvas,VCanvas_vml;$.fn.simpledraw=function(width,height,use_existing){if(use_existing&&this[0].VCanvas){return this[0].VCanvas;} +if(width===undefined){width=$(this).innerWidth();} +if(height===undefined){height=$(this).innerHeight();} +if($.browser.hasCanvas){return new VCanvas_canvas(width,height,this);}else if($.browser.msie){return new VCanvas_vml(width,height,this);}else{return false;}};var pending=[];$.fn.sparkline=function(uservalues,userOptions){return this.each(function(){var options=new $.fn.sparkline.options(this,userOptions);var render=function(){var values,width,height;if(uservalues==='html'||uservalues===undefined){var vals=this.getAttribute(options.get('tagValuesAttribute'));if(vals===undefined||vals===null){vals=$(this).html();} +values=vals.replace(/(^\s*\s*$)|\s+/g,'').split(',');}else{values=uservalues;} +width=options.get('width')=='auto'?values.length*options.get('defaultPixelsPerValue'):options.get('width');if(options.get('height')=='auto'){if(!options.get('composite')||!this.VCanvas){var tmp=document.createElement('span');tmp.innerHTML='a';$(this).html(tmp);height=$(tmp).innerHeight();$(tmp).remove();}}else{height=options.get('height');} +$.fn.sparkline[options.get('type')].call(this,values,options,width,height);};if(($(this).html()&&$(this).is(':hidden'))||($.fn.jquery<"1.3.0"&&$(this).parents().is(':hidden'))||!$(this).parents('body').length){pending.push([this,render]);}else{render.call(this);}});};$.fn.sparkline.defaults=defaults;$.sparkline_display_visible=function(){for(var i=pending.length-1;i>=0;i--){var el=pending[i][0];if($(el).is(':visible')&&!$(el).parents().is(':hidden')){pending[i][1].call(el);pending.splice(i,1);}}};var UNSET_OPTION={};var normalizeValue=function(val){switch(val){case'undefined':val=undefined;break;case'null':val=null;break;case'true':val=true;break;case'false':val=false;break;default:var nf=parseFloat(val);if(val==nf){val=nf;}} +return val;};$.fn.sparkline.options=function(tag,userOptions){var extendedOptions;this.userOptions=userOptions=userOptions||{};this.tag=tag;this.tagValCache={};var defaults=$.fn.sparkline.defaults;var base=defaults.common;this.tagOptionsPrefix=userOptions.enableTagOptions&&(userOptions.tagOptionsPrefix||base.tagOptionsPrefix);var tagOptionType=this.getTagSetting('type');if(tagOptionType===UNSET_OPTION){extendedOptions=defaults[userOptions.type||base.type];}else{extendedOptions=defaults[tagOptionType];} +this.mergedOptions=$.extend({},base,extendedOptions,userOptions);};$.fn.sparkline.options.prototype.getTagSetting=function(key){var val,i,prefix=this.tagOptionsPrefix;if(prefix===false||prefix===undefined){return UNSET_OPTION;} +if(this.tagValCache.hasOwnProperty(key)){val=this.tagValCache.key;}else{val=this.tag.getAttribute(prefix+key);if(val===undefined||val===null){val=UNSET_OPTION;}else if(val.substr(0,1)=='['){val=val.substr(1,val.length-2).split(',');for(i=val.length;i--;){val[i]=normalizeValue(val[i].replace(/(^\s*)|(\s*$)/g,''));}}else if(val.substr(0,1)=='{'){var pairs=val.substr(1,val.length-2).split(',');val={};for(i=pairs.length;i--;){var keyval=pairs[i].split(':',2);val[keyval[0].replace(/(^\s*)|(\s*$)/g,'')]=normalizeValue(keyval[1].replace(/(^\s*)|(\s*$)/g,''));}}else{val=normalizeValue(val);} +this.tagValCache.key=val;} +return val;};$.fn.sparkline.options.prototype.get=function(key){var tagOption=this.getTagSetting(key);if(tagOption!==UNSET_OPTION){return tagOption;} +return this.mergedOptions[key];};$.fn.sparkline.line=function(values,options,width,height){var xvalues=[],yvalues=[],yminmax=[];for(var i=0;imaxy){maxy=normalRangeMax;}} +if(options.get('chartRangeMin')!==undefined&&(options.get('chartRangeClip')||options.get('chartRangeMin')maxy)){maxy=options.get('chartRangeMax');} +if(options.get('chartRangeMinX')!==undefined&&(options.get('chartRangeClipX')||options.get('chartRangeMinX')maxx)){maxx=options.get('chartRangeMaxX');} +var rangex=maxx-minx===0?1:maxx-minx;var rangey=maxy-miny===0?1:maxy-miny;var vl=yvalues.length-1;if(vl<1){this.innerHTML='';return;} +var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var canvas_width=target.pixel_width;var canvas_height=target.pixel_height;var canvas_top=0;var canvas_left=0;var spotRadius=options.get('spotRadius');if(spotRadius&&(canvas_width<(spotRadius*4)||canvas_height<(spotRadius*4))){spotRadius=0;} +if(spotRadius){if(options.get('minSpotColor')||(options.get('spotColor')&&yvalues[vl]==miny)){canvas_height-=Math.ceil(spotRadius);} +if(options.get('maxSpotColor')||(options.get('spotColor')&&yvalues[vl]==maxy)){canvas_height-=Math.ceil(spotRadius);canvas_top+=Math.ceil(spotRadius);} +if(options.get('minSpotColor')||options.get('maxSpotColor')&&(yvalues[0]==miny||yvalues[0]==maxy)){canvas_left+=Math.ceil(spotRadius);canvas_width-=Math.ceil(spotRadius);} +if(options.get('spotColor')||(options.get('minSpotColor')||options.get('maxSpotColor')&&(yvalues[vl]==miny||yvalues[vl]==maxy))){canvas_width-=Math.ceil(spotRadius);}} +canvas_height--;var drawNormalRange=function(){if(normalRangeMin!==undefined){var ytop=canvas_top+Math.round(canvas_height-(canvas_height*((normalRangeMax-miny)/rangey)));var height=Math.round((canvas_height*(normalRangeMax-normalRangeMin))/rangey);target.drawRect(canvas_left,ytop,canvas_width,height,undefined,options.get('normalRangeColor'));}};if(!options.get('drawNormalOnTop')){drawNormalRange();} +var path=[];var paths=[path];var x,y,vlen=yvalues.length;for(i=0;imaxy){y=maxy;} +if(!path.length){path.push([canvas_left+Math.round((x-minx)*(canvas_width/rangex)),canvas_top+canvas_height]);} +path.push([canvas_left+Math.round((x-minx)*(canvas_width/rangex)),canvas_top+Math.round(canvas_height-(canvas_height*((y-miny)/rangey)))]);}} +var lineshapes=[];var fillshapes=[];var plen=paths.length;for(i=0;i2){path[0]=[path[0][0],path[1][1]];} +lineshapes.push(path);} +plen=fillshapes.length;for(i=0;imax)){max=options.get('chartRangeMax');} +var zeroAxis=options.get('zeroAxis');if(zeroAxis===undefined){zeroAxis=min<0;} +var range=max-min===0?1:max-min;var colorMapByIndex,colorMapByValue;if($.isArray(options.get('colorMap'))){colorMapByIndex=options.get('colorMap');colorMapByValue=null;}else{colorMapByIndex=null;colorMapByValue=options.get('colorMap');} +var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var color,canvas_height=target.pixel_height,yzero=min<0&&zeroAxis?canvas_height-Math.round(canvas_height*(Math.abs(min)/range))-1:canvas_height-1;for(i=values.length;i--;){var x=i*(options.get('barWidth')+options.get('barSpacing')),y,val=values[i];if(val===null){if(options.get('nullColor')){color=options.get('nullColor');val=(zeroAxis&&min<0)?0:min;height=1;y=(zeroAxis&&min<0)?yzero:canvas_height-height;}else{continue;}}else{if(valmax){val=max;} +color=(val<0)?options.get('negBarColor'):options.get('barColor');if(zeroAxis&&min<0){height=Math.round(canvas_height*((Math.abs(val)/range)))+1;y=(val<0)?yzero:yzero-height;}else{height=Math.round(canvas_height*((val-min)/range))+1;y=canvas_height-height;} +if(val===0&&options.get('zeroColor')!==undefined){color=options.get('zeroColor');} +if(colorMapByValue&&colorMapByValue[val]){color=colorMapByValue[val];}else if(colorMapByIndex&&colorMapByIndex.length>i){color=colorMapByIndex[i];} +if(color===null){continue;}} +target.drawRect(x,y,options.get('barWidth')-1,height-1,color,color);}}else{this.innerHTML='';}};$.fn.sparkline.tristate=function(values,options,width,height){values=$.map(values,Number);width=(values.length*options.get('barWidth'))+((values.length-1)*options.get('barSpacing'));var colorMapByIndex,colorMapByValue;if($.isArray(options.get('colorMap'))){colorMapByIndex=options.get('colorMap');colorMapByValue=null;}else{colorMapByIndex=null;colorMapByValue=options.get('colorMap');} +var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var canvas_height=target.pixel_height,half_height=Math.round(canvas_height/2);for(var i=values.length;i--;){var x=i*(options.get('barWidth')+options.get('barSpacing')),y,color;if(values[i]<0){y=half_height;height=half_height-1;color=options.get('negBarColor');}else if(values[i]>0){y=0;height=half_height-1;color=options.get('posBarColor');}else{y=half_height-1;height=2;color=options.get('zeroBarColor');} +if(colorMapByValue&&colorMapByValue[values[i]]){color=colorMapByValue[values[i]];}else if(colorMapByIndex&&colorMapByIndex.length>i){color=colorMapByIndex[i];} +if(color===null){continue;} +target.drawRect(x,y,options.get('barWidth')-1,height-1,color,color);}}else{this.innerHTML='';}};$.fn.sparkline.discrete=function(values,options,width,height){values=$.map(values,Number);width=options.get('width')=='auto'?values.length*2:width;var interval=Math.floor(width/values.length);var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var canvas_height=target.pixel_height,line_height=options.get('lineHeight')=='auto'?Math.round(canvas_height*0.3):options.get('lineHeight'),pheight=canvas_height-line_height,min=Math.min.apply(Math,values),max=Math.max.apply(Math,values);if(options.get('chartRangeMin')!==undefined&&(options.get('chartRangeClip')||options.get('chartRangeMin')max)){max=options.get('chartRangeMax');} +var range=max-min;for(var i=values.length;i--;){var val=values[i];if(valmax){val=max;} +var x=(i*interval),ytop=Math.round(pheight-pheight*((val-min)/range));target.drawLine(x,ytop,x,ytop+line_height,(options.get('thresholdColor')&&val1){var canvas_width=target.pixel_width-Math.ceil(options.get('targetWidth')/2),canvas_height=target.pixel_height,min=Math.min.apply(Math,values),max=Math.max.apply(Math,values);if(options.get('base')===undefined){min=min<0?min:0;}else{min=options.get('base');} +var range=max-min;for(var i=2,vlen=values.length;i1){var canvas_width=target.pixel_width,canvas_height=target.pixel_height,radius=Math.floor(Math.min(canvas_width,canvas_height)/2),total=0,next=0,circle=2*Math.PI;for(var i=values.length;i--;){total+=values[i];} +if(options.get('offset')){next+=(2*Math.PI)*(options.get('offset')/360);} +var vlen=values.length;for(i=0;i0){end=next+(circle*(values[i]/total));} +target.drawPieSlice(radius,radius,radius,start,end,undefined,options.get('sliceColors')[i%options.get('sliceColors').length]);next=end;}}};var quartile=function(values,q){if(q==2){var vl2=Math.floor(values.length/2);return values.length%2?values[vl2]:(values[vl2]+values[vl2+1])/2;}else{var vl4=Math.floor(values.length/4);return values.length%2?(values[vl4*q]+values[vl4*q+1])/2:values[vl4*q];}};$.fn.sparkline.box=function(values,options,width,height){values=$.map(values,Number);width=options.get('width')=='auto'?'4.0em':width;var minvalue=options.get('chartRangeMin')===undefined?Math.min.apply(Math,values):options.get('chartRangeMin'),maxvalue=options.get('chartRangeMax')===undefined?Math.max.apply(Math,values):options.get('chartRangeMax'),target=$(this).simpledraw(width,height,options.get('composite')),vlen=values.length,lwhisker,loutlier,q1,q2,q3,rwhisker,routlier;if(target&&values.length>1){var canvas_width=target.pixel_width,canvas_height=target.pixel_height;if(options.get('raw')){if(options.get('showOutliers')&&values.length>5){loutlier=values[0];lwhisker=values[1];q1=values[2];q2=values[3];q3=values[4];rwhisker=values[5];routlier=values[6];}else{lwhisker=values[0];q1=values[1];q2=values[2];q3=values[3];rwhisker=values[4];}}else{values.sort(function(a,b){return a-b;});q1=quartile(values,1);q2=quartile(values,2);q3=quartile(values,3);var iqr=q3-q1;if(options.get('showOutliers')){lwhisker=undefined;rwhisker=undefined;for(var i=0;iq1-(iqr*options.get('outlierIQR'))){lwhisker=values[i];} +if(values[i]rwhisker){target.drawCircle((routlier-minvalue)*unitsize+canvas_left,canvas_height/2,options.get('spotRadius'),options.get('outlierLineColor'),options.get('outlierFillColor'));}} +target.drawRect(Math.round((q1-minvalue)*unitsize+canvas_left),Math.round(canvas_height*0.1),Math.round((q3-q1)*unitsize),Math.round(canvas_height*0.8),options.get('boxLineColor'),options.get('boxFillColor'));target.drawLine(Math.round((lwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),Math.round((q1-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),options.get('lineColor'));target.drawLine(Math.round((lwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/4),Math.round((lwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height-canvas_height/4),options.get('whiskerColor'));target.drawLine(Math.round((rwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),Math.round((q3-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),options.get('lineColor'));target.drawLine(Math.round((rwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/4),Math.round((rwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height-canvas_height/4),options.get('whiskerColor'));target.drawLine(Math.round((q2-minvalue)*unitsize+canvas_left),Math.round(canvas_height*0.1),Math.round((q2-minvalue)*unitsize+canvas_left),Math.round(canvas_height*0.9),options.get('medianColor'));if(options.get('target')){var size=Math.ceil(options.get('spotRadius'));target.drawLine(Math.round((options.get('target')-minvalue)*unitsize+canvas_left),Math.round((canvas_height/2)-size),Math.round((options.get('target')-minvalue)*unitsize+canvas_left),Math.round((canvas_height/2)+size),options.get('targetColor'));target.drawLine(Math.round((options.get('target')-minvalue)*unitsize+canvas_left-size),Math.round(canvas_height/2),Math.round((options.get('target')-minvalue)*unitsize+canvas_left+size),Math.round(canvas_height/2),options.get('targetColor'));}}else{this.innerHTML='';}};if($.browser.msie&&!document.namespaces.v){document.namespaces.add('v','urn:schemas-microsoft-com:vml','#default#VML');} +if($.browser.hasCanvas===undefined){var t=document.createElement('canvas');$.browser.hasCanvas=t.getContext!==undefined;} +VCanvas_base=function(width,height,target){};VCanvas_base.prototype={init:function(width,height,target){this.width=width;this.height=height;this.target=target;if(target[0]){target=target[0];} +target.VCanvas=this;},drawShape:function(path,lineColor,fillColor,lineWidth){alert('drawShape not implemented');},drawLine:function(x1,y1,x2,y2,lineColor,lineWidth){return this.drawShape([[x1,y1],[x2,y2]],lineColor,lineWidth);},drawCircle:function(x,y,radius,lineColor,fillColor){alert('drawCircle not implemented');},drawPieSlice:function(x,y,radius,startAngle,endAngle,lineColor,fillColor){alert('drawPieSlice not implemented');},drawRect:function(x,y,width,height,lineColor,fillColor){alert('drawRect not implemented');},getElement:function(){return this.canvas;},_insert:function(el,target){$(target).html(el);}};VCanvas_canvas=function(width,height,target){return this.init(width,height,target);};VCanvas_canvas.prototype=$.extend(new VCanvas_base(),{_super:VCanvas_base.prototype,init:function(width,height,target){this._super.init(width,height,target);this.canvas=document.createElement('canvas');if(target[0]){target=target[0];} +target.VCanvas=this;$(this.canvas).css({display:'inline-block',width:width,height:height,verticalAlign:'top'});this._insert(this.canvas,target);this.pixel_height=$(this.canvas).height();this.pixel_width=$(this.canvas).width();this.canvas.width=this.pixel_width;this.canvas.height=this.pixel_height;$(this.canvas).css({width:this.pixel_width,height:this.pixel_height});},_getContext:function(lineColor,fillColor,lineWidth){var context=this.canvas.getContext('2d');if(lineColor!==undefined){context.strokeStyle=lineColor;} +context.lineWidth=lineWidth===undefined?1:lineWidth;if(fillColor!==undefined){context.fillStyle=fillColor;} +return context;},drawShape:function(path,lineColor,fillColor,lineWidth){var context=this._getContext(lineColor,fillColor,lineWidth);context.beginPath();context.moveTo(path[0][0]+0.5,path[0][1]+0.5);for(var i=1,plen=path.length;i';this.canvas.insertAdjacentHTML('beforeEnd',groupel);this.group=$(this.canvas).children()[0];},drawShape:function(path,lineColor,fillColor,lineWidth){var vpath=[];for(var i=0,plen=path.length;i'+' ';this.group.insertAdjacentHTML('beforeEnd',vel);},drawCircle:function(x,y,radius,lineColor,fillColor){x-=radius+1;y-=radius+1;var stroke=lineColor===undefined?' stroked="false" ':' strokeWeight="1" strokeColor="'+lineColor+'" ';var fill=fillColor===undefined?' filled="false"':' fillColor="'+fillColor+'" filled="true" ';var vel='';this.group.insertAdjacentHTML('beforeEnd',vel);},drawPieSlice:function(x,y,radius,startAngle,endAngle,lineColor,fillColor){if(startAngle==endAngle){return;} +if((endAngle-startAngle)==(2*Math.PI)){startAngle=0.0;endAngle=(2*Math.PI);} +var startx=x+Math.round(Math.cos(startAngle)*radius);var starty=y+Math.round(Math.sin(startAngle)*radius);var endx=x+Math.round(Math.cos(endAngle)*radius);var endy=y+Math.round(Math.sin(endAngle)*radius);if(startx==endx&&starty==endy&&(endAngle-startAngle)'+' ';this.group.insertAdjacentHTML('beforeEnd',vel);},drawRect:function(x,y,width,height,lineColor,fillColor){return this.drawShape([[x,y],[x,y+height],[x+width,y+height],[x+width,y],[x,y]],lineColor,fillColor);}});})(jQuery); \ No newline at end of file From 1a6499acb8161c03c0f8946b97d6bb3d84edc97e Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Wed, 9 Nov 2011 11:05:21 +0100 Subject: [PATCH 02/37] Replaced zoom controls. Changed default country list style. --- root/comp/page.html | 12 ++++++------ root/country/comp/page.html | 2 +- root/country/index.html | 2 +- root/index.html | 32 +++----------------------------- root/region/comp/page.html | 2 +- root/region/index.html | 2 +- root/static/css/cpp.css | 19 ++++++++++++++++++- 7 files changed, 31 insertions(+), 40 deletions(-) diff --git a/root/comp/page.html b/root/comp/page.html index 9cfd904..0dd00dd 100644 --- a/root/comp/page.html +++ b/root/comp/page.html @@ -7,7 +7,7 @@ my $static = $c->uri_for('/static'); my @nav = ( { href => '/', name=>'Home', }, - { href => '/country/', name=>'Countries', }, + { href => '/region/', name=>'Countries', }, { href => '/incident/', name=>'Incidents', }, ); @@ -48,6 +48,7 @@ + % if($map) { @@ -60,10 +61,10 @@
We collect and show the state of the Internet from across the world @@ -87,7 +88,6 @@
    -
  • About
  • Contribute
  • Terms & Conditions
  • Privacy Policy
  • diff --git a/root/country/comp/page.html b/root/country/comp/page.html index a745e44..3edd4a5 100644 --- a/root/country/comp/page.html +++ b/root/country/comp/page.html @@ -1,3 +1,3 @@ -<&| /comp/page.html, nav_active=>'/country/' &> +<&| /comp/page.html, nav_active=>'/region/' &> <% $m->content() %> \ No newline at end of file diff --git a/root/country/index.html b/root/country/index.html index ac80203..75e3a4b 100644 --- a/root/country/index.html +++ b/root/country/index.html @@ -17,8 +17,8 @@

    Country list
  • Content:
diff --git a/root/index.html b/root/index.html index 4e1102f..81b652f 100644 --- a/root/index.html +++ b/root/index.html @@ -10,38 +10,12 @@

Current Incidents

$(document).ready(function(){ - function zoomPad(options) { - - this.control = new OpenLayers.Control.ZoomPanel(options); - - OpenLayers.Util.extend(this.control,{ - draw: function(px) { - // initialize our internal div - OpenLayers.Control.prototype.draw.apply(this, arguments); - px = this.position.clone(); - - // place the controls - this.buttons = []; - - var sz = new OpenLayers.Size(18,18); - var centered = new OpenLayers.Pixel(px.x+sz.w/2, px.y); - - this._addButton("zoomin", "zoom-plus-mini.png", centered.add(0, 5), sz); - this._addButton("zoomout", "zoom-minus-mini.png", centered, sz); - return this.div; - } - }); - return this.control; - } - map = new OpenLayers.Map('map',{ -/* controls: [ + controls: [ new OpenLayers.Control.Navigation(), - new zoomPad({}), + new OpenLayers.Control.ZoomPanel(), new OpenLayers.Control.KeyboardDefaults() - ], - numZoomLevels: 6 - */ + ] }); var cloudmade = new OpenLayers.Layer.CloudMade("CloudMade", { key: '<% $c->config->{'CloudMade'}->{'api_key'} %>', diff --git a/root/region/comp/page.html b/root/region/comp/page.html index a745e44..3edd4a5 100644 --- a/root/region/comp/page.html +++ b/root/region/comp/page.html @@ -1,3 +1,3 @@ -<&| /comp/page.html, nav_active=>'/country/' &> +<&| /comp/page.html, nav_active=>'/region/' &> <% $m->content() %> \ No newline at end of file diff --git a/root/region/index.html b/root/region/index.html index d208dd7..594d40a 100644 --- a/root/region/index.html +++ b/root/region/index.html @@ -15,8 +15,8 @@

Continent list
  • Content:
  • diff --git a/root/static/css/cpp.css b/root/static/css/cpp.css index aa10ed5..5a5ea6f 100644 --- a/root/static/css/cpp.css +++ b/root/static/css/cpp.css @@ -230,6 +230,24 @@ h1 span.country { top: 180px !important; } +.olControlZoomPanel div { + background-image: url('../img/zoom-new.png') !important; +} + +div.olControlZoomPanel { + top: 160px !important; +} + +div.olControlZoomToMaxExtentItemInactive { + display: none; +} + +div.olControlZoomOutItemInactive { + top: 18px !important; +} + + + ul.linkbar { font-family: "Helvetica Neue","Helvetica","Arial",sans-serif; font-size: 12px; @@ -313,4 +331,3 @@ h2:hover ul.inline { } */ - From 8969c98aad8eb5209f2ed8d8f9e99c20cb306f4f Mon Sep 17 00:00:00 2001 From: Simon Funke Date: Wed, 9 Nov 2011 10:13:17 +0000 Subject: [PATCH 03/37] add Croatia to the country list --- tmp/countryInfo.xml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tmp/countryInfo.xml b/tmp/countryInfo.xml index aec88f4..969af08 100644 --- a/tmp/countryInfo.xml +++ b/tmp/countryInfo.xml @@ -4750,4 +4750,23 @@ 33.056305 -22.417738 + +HR +Croatia + + + + + + + + + + + + + + + + From 1f0cf043a162b7d868e5db8484496119bcc26ced Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Wed, 9 Nov 2011 11:14:10 +0100 Subject: [PATCH 04/37] Fixed country ordering in region list --- lib/CPP/Object/Result/Region.pm | 1 + root/region/index.html | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/CPP/Object/Result/Region.pm b/lib/CPP/Object/Result/Region.pm index 22f07de..8a459f5 100644 --- a/lib/CPP/Object/Result/Region.pm +++ b/lib/CPP/Object/Result/Region.pm @@ -117,5 +117,6 @@ __PACKAGE__->has_many( # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:wozagY2AxIulZR8kA9iY5w __PACKAGE__->many_to_many('incidents' => 'region_incidents', 'incident'); + __PACKAGE__->many_to_many('countries' => 'region_countries', 'country'); 1; diff --git a/root/region/index.html b/root/region/index.html index 594d40a..0014793 100644 --- a/root/region/index.html +++ b/root/region/index.html @@ -27,8 +27,8 @@

    Continent list

    <% $region->name %>

    -% foreach my $rc ($region->region_countries) { -% my $country = $rc->country; +% foreach my $country ($region->countries->search({},{order_by=>'name'})) { +%# my $country = $rc->country; <% $country->name %>
    % }
    From 3a61d3a6183ffea2c1f0ff50b02f71fe6e597ed4 Mon Sep 17 00:00:00 2001 From: Simon Funke Date: Wed, 9 Nov 2011 10:18:14 +0000 Subject: [PATCH 05/37] remove croatia again as it was a duplicate --- tmp/countryInfo.xml | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/tmp/countryInfo.xml b/tmp/countryInfo.xml index 969af08..bf91ed4 100644 --- a/tmp/countryInfo.xml +++ b/tmp/countryInfo.xml @@ -4751,22 +4751,4 @@ -22.417738 -HR -Croatia - - - - - - - - - - - - - - - - From 723dee343f5ad663ed3964578d9242880d863b3c Mon Sep 17 00:00:00 2001 From: Simon Funke Date: Wed, 9 Nov 2011 10:21:56 +0000 Subject: [PATCH 06/37] fix xml --- tmp/countryInfo.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/tmp/countryInfo.xml b/tmp/countryInfo.xml index bf91ed4..aec88f4 100644 --- a/tmp/countryInfo.xml +++ b/tmp/countryInfo.xml @@ -4750,5 +4750,4 @@ 33.056305 -22.417738 - From d2645b14f05f9374d4ffb572cc56583d7508b637 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Wed, 9 Nov 2011 14:31:45 +0100 Subject: [PATCH 07/37] Added incidents and interactive map markers. --- bin/import-mlabs | 105 +++++++++++++++++++++++++++++++++++ root/static/img/blackout.gif | Bin 0 -> 13133 bytes 2 files changed, 105 insertions(+) create mode 100755 bin/import-mlabs create mode 100644 root/static/img/blackout.gif diff --git a/bin/import-mlabs b/bin/import-mlabs new file mode 100755 index 0000000..e11d6c2 --- /dev/null +++ b/bin/import-mlabs @@ -0,0 +1,105 @@ +#!/usr/bin/env perl +use strict; +use encoding 'utf8'; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use warnings; +use Carp; +use Data::Dumper; +use Config::Any; +use XML::Simple; +use CPP::Object; +use WWW::Mechanize; +use JSON::XS; +use DateTime::Format::Strptime; + +my($db,$seen,$URL); +my $config_dir = $FindBin::Bin.'/..'; +my @config = glob('*.conf'); +my $cfg = Config::Any->load_files({files => \@config, use_ext=>1}); +for(@{$cfg}) { + my($filename,$config)=%$_; + if(my $section = $config->{'Model::DB'}) { + $db = CPP::Object->connect($section->{connect_info}); + } + if(my $url = $config->{DataSource}->{MLabs}) { + $URL = $url; + } +} +die("Can't connect to database") unless $db; + +my $xs = XML::Simple->new(); +my $json = JSON::XS->new(); +my $strp = new DateTime::Format::Strptime( + pattern => '%Y-%m-%d', + locale => 'en_US', + time_zone => 'GMT', + ); +my $mech = WWW::Mechanize->new(); +$mech->get($URL.'/country_maps.json'); +my $js = $mech->content(); +print $js; +my $list = $json->decode($js); +foreach my $country_rec (@{$list}) { + my $id = $country_rec->{country_code}; + my $country = $db->resultset('Country')->find($id); + $mech->get($URL.'country_measurements.json?country_code='.$id); + my $data = $json->decode($mech->content()); + print Dumper($data); + foreach my $rec (@{$data}) { + if($rec->{suspicious}) { + my $ts = $strp->parse_datetime($rec->{month}); + my $incident = $db->resultset('Incident')->create({ + 'type' => '15', + 'ts' => $ts, + 'descr' => 'Suspicious connectivity drop', + 'lat' => $country_rec->{latitude}, + 'lon' => $country_rec->{longitude}, + }); + $country->add_to_country_incidents({ + incident => $incident, + }); + } + } +} +exit(0); + +my $xml = $xs->XMLin("$FindBin::Bin/../tmp/countryInfo.xml"); +#print Dumper($xml); +foreach my $country (@{$xml->{country}}) { + print join(":",$country->{countryCode},$country->{countryName})."\n"; + my $id = $country->{countryCode}; + my $found = $db->resultset('Country')->find($id); + my $obj = $found ? $found : $db->resultset('Country')->create({ + id => $id, + }); + $obj->name($country->{countryName}); + $obj->bb_nw_lat($country->{bBoxNorth}); + $obj->bb_se_lat($country->{bBoxSouth}); + $obj->bb_nw_lon($country->{bBoxWest}); + $obj->bb_se_lon($country->{bBoxEast}); + $obj->update(); + check_region($country); + if(!$found) { + $obj->add_to_region_countries({ + region => $country->{continent}, + }); + } +} + +sub check_region { + my $country = shift; + my $id = $country->{continent}; + next if $seen->{continent}->{$id}; + my $obj = $db->resultset('Region')->find($id); + if(!$obj) { + $obj = $db->resultset('Region')->create({ + id => $id, + type => 'continent', + name => $country->{continentName}, + }); + $obj->update(); + ++$seen->{continent}->{$id}; + } + +} diff --git a/root/static/img/blackout.gif b/root/static/img/blackout.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b10aa2c3ee10105f31e71d85f51ed69932f3fd8 GIT binary patch literal 13133 zcmeI3XOt6F6vqcdcUf%MJF|n`O{OH-Y{n!DW?euHBD)HrsIxOK*)f^o%&f_-4GnW`9h%(EQErVljX%&Eatb7qyQxXZm;Pn#enIKE;m`#r;WI(quZWtnXKPe>9Tsf z1jqRURjOx&010WdFg}OinKrp5Yb%6|kU`!Y40vQ0om@d=>G5~@xU8oCW00d*YP#4Gm2*z}w zE|38bjOjvMAOj#6(}lV~20$>T3w41EfM84)>H--6!I&=81u_7FF$Xx=7}JHiKn6fCrVDj}41nO(rmLZL@`IT4xJQAW>ljk{`>#L$ z_#x1~%F8dk z_`>tgJ^ReEr=NQAiKR;(f9%mm9$x&=gAXja|Gs7iyx{!#=bd}b*=L=3#=O%{J9X}yQ%*kV#1m#8KWpZU Date: Wed, 9 Nov 2011 14:31:48 +0100 Subject: [PATCH 08/37] Added incidents and interactive map markers. --- lib/CPP/Controller/Root.pm | 21 ++++++++++++ lib/CPP/Object/Result/Incident.pm | 18 ++++++++-- lib/CPP/Object/Result/IncidentType.pm | 12 +++++-- root/comp/page.html | 5 +-- root/country/view.html | 12 +++++-- root/index.html | 47 +++++++++++++++++++++++++-- root/static/css/cpp.css | 5 ++- sql/cpp-data.sql | 2 ++ sql/cpp.sql | 1 + 9 files changed, 110 insertions(+), 13 deletions(-) diff --git a/lib/CPP/Controller/Root.pm b/lib/CPP/Controller/Root.pm index 1107e35..f2ddb72 100644 --- a/lib/CPP/Controller/Root.pm +++ b/lib/CPP/Controller/Root.pm @@ -1,6 +1,7 @@ package CPP::Controller::Root; use Moose; use namespace::autoclean; +use JSON; BEGIN { extends 'Catalyst::Controller' } @@ -61,6 +62,26 @@ it under the same terms as Perl itself. =cut +our $json = JSON->new(); + +sub incidents :Path { + my($self,$c) = @_; + my($ret); + foreach my $rec ($c->model('DB::Incident')->search({},{order_by=>'ts desc',rows=>50})->all) { + my($data); + map {$data->{$_} = $rec->$_} qw(lat lon); + $data->{ts} = $rec->ts->strftime('%Y-%m-%d'); + $data->{type} = $rec->type->id; + $data->{name} = $rec->type->name; + if(my @countries = $rec->countries()) { + $data->{country} = $countries[0]->id; + } + + push @{$ret}, $data; + } + $c->response->body($json->encode($ret)); +} + __PACKAGE__->meta->make_immutable; 1; diff --git a/lib/CPP/Object/Result/Incident.pm b/lib/CPP/Object/Result/Incident.pm index c9a4bf8..d905c21 100644 --- a/lib/CPP/Object/Result/Incident.pm +++ b/lib/CPP/Object/Result/Incident.pm @@ -43,6 +43,13 @@ __PACKAGE__->table("incident"); set_on_create: 1 set_on_update: 1 +=head2 ts + + data_type: 'datetime' + datetime_undef_if_invalid: 1 + is_nullable: 1 + locale: 'es_MX' + =head2 type data_type: 'varchar' @@ -105,6 +112,13 @@ __PACKAGE__->add_columns( set_on_create => 1, set_on_update => 1, }, + "ts", + { + data_type => "datetime", + datetime_undef_if_invalid => 1, + is_nullable => 1, + locale => "es_MX", + }, "type", { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 16 }, "source", @@ -175,8 +189,8 @@ __PACKAGE__->has_many( ); -# Created by DBIx::Class::Schema::Loader v0.07002 @ 2011-10-15 22:58:22 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:gp7YcORO8Lb63HKfbC/BsA +# Created by DBIx::Class::Schema::Loader v0.07002 @ 2011-11-09 12:17:11 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:rCBs0DFarClwvkzX5RcT0g __PACKAGE__->many_to_many('countries' => 'country_incidents', 'country'); __PACKAGE__->many_to_many('regions' => 'region_incidents', 'region'); diff --git a/lib/CPP/Object/Result/IncidentType.pm b/lib/CPP/Object/Result/IncidentType.pm index 1b62da5..771bb3a 100644 --- a/lib/CPP/Object/Result/IncidentType.pm +++ b/lib/CPP/Object/Result/IncidentType.pm @@ -32,6 +32,12 @@ __PACKAGE__->table("incident_type"); is_nullable: 0 size: 255 +=head2 class + + data_type: 'varchar' + is_nullable: 1 + size: 255 + =cut __PACKAGE__->add_columns( @@ -39,6 +45,8 @@ __PACKAGE__->add_columns( { data_type => "varchar", is_nullable => 0, size => 16 }, "name", { data_type => "varchar", is_nullable => 0, size => 255 }, + "class", + { data_type => "varchar", is_nullable => 1, size => 255 }, ); __PACKAGE__->set_primary_key("id"); @@ -60,8 +68,8 @@ __PACKAGE__->has_many( ); -# Created by DBIx::Class::Schema::Loader v0.07002 @ 2011-10-15 22:58:22 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:2i02wTMw6LpXi5KGW8HR2w +# Created by DBIx::Class::Schema::Loader v0.07002 @ 2011-11-09 12:17:11 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:CGeGC0qZG4MvxapYSeVG/g # You can replace this text with custom content, and it will be preserved on regeneration diff --git a/root/comp/page.html b/root/comp/page.html index 2e9a018..b0e99b4 100644 --- a/root/comp/page.html +++ b/root/comp/page.html @@ -1,7 +1,8 @@ <%args> $title => '' - $nav_active => '/', + $nav_active => '/' $map => 1 + $body => '' <%perl> my $static = $c->uri_for('/static'); @@ -55,7 +56,7 @@ % } - +>
    diff --git a/root/country/view.html b/root/country/view.html index f4c97d2..bf2870c 100644 --- a/root/country/view.html +++ b/root/country/view.html @@ -57,10 +57,10 @@

    The state of the Internet in
    <% $country->name %>

    Current incidents

    -% my $incidents = $country->incidents->search({}); +% my $incidents = $country->incidents->search({},{order_by=>'ts desc'}); % if($incidents->count > 0) { % foreach my $incident ($incidents->all) { -
  • <% $incident->descr |h %>
  • +
  • <% $incident->ts->strftime('%Y-%m-%d') %><% $incident->descr |h %>
  • % } % } else {
    No incidents reported for <% $country->name |h %>
    @@ -119,7 +119,13 @@

    Lobbying activity var map; var pad = 1; $(document).ready(function(){ - map = new OpenLayers.Map('map'); + map = new OpenLayers.Map('map',{ + controls: [ + new OpenLayers.Control.Navigation(), + new OpenLayers.Control.ZoomPanel(), + new OpenLayers.Control.KeyboardDefaults() + ] + }); var cloudmade = new OpenLayers.Layer.CloudMade("CloudMade", { key: '<% $c->config->{'CloudMade'}->{'api_key'} %>', styleId: 48233 diff --git a/root/index.html b/root/index.html index 3cafb66..3b88662 100644 --- a/root/index.html +++ b/root/index.html @@ -1,4 +1,4 @@ -<&| /comp/page.html, title=>'Home' &> +<&| /comp/page.html, title=>'Home', body=>'home' &>
    @@ -6,7 +6,7 @@ SHOW: TODAY : LAST WEEK | - + REPLAY LAST WEEK @@ -21,7 +21,7 @@

    Current Incidents

    diff --git a/root/static/css/cpp.css b/root/static/css/cpp.css index 3ddf4cf..8168c9f 100644 --- a/root/static/css/cpp.css +++ b/root/static/css/cpp.css @@ -3,7 +3,10 @@ } body { - background-color: #B1CED6; + background-color: #FFFFFF; +} + +body.home { background: #B1CED6 url("../img/bg.gif") top left repeat-x; } diff --git a/sql/cpp-data.sql b/sql/cpp-data.sql index c394228..9401cb0 100644 --- a/sql/cpp-data.sql +++ b/sql/cpp-data.sql @@ -9,3 +9,5 @@ insert into incident_type values ('10','Bandwidth Throttling','restriction'); insert into incident_type values ('11','Radio Frequency jamming','restriction'); insert into incident_type values ('12','Radio Frequency jamming','restriction'); insert into incident_type values ('13','Radio Frequency jamming','restriction'); + +insert into incident_type values ('15','Connectivity Issue','blackout'); diff --git a/sql/cpp.sql b/sql/cpp.sql index 0809bff..80a8618 100644 --- a/sql/cpp.sql +++ b/sql/cpp.sql @@ -76,6 +76,7 @@ create table incident ( id integer auto_increment not null, date_created datetime, last_updated datetime, + ts datetime, type varchar(16), source varchar(16), source_id varchar(64), From 9c5c869625eebdfd39ca1719c55fe73fe44ff5bd Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Wed, 9 Nov 2011 14:58:21 +0100 Subject: [PATCH 09/37] Added ts validation --- root/country/view.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/root/country/view.html b/root/country/view.html index bf2870c..40c4aca 100644 --- a/root/country/view.html +++ b/root/country/view.html @@ -60,7 +60,7 @@

    Current incidents

    % my $incidents = $country->incidents->search({},{order_by=>'ts desc'}); % if($incidents->count > 0) { % foreach my $incident ($incidents->all) { -
  • <% $incident->ts->strftime('%Y-%m-%d') %><% $incident->descr |h %>
  • +
  • <% $incident->ts ? $incident->ts->strftime('%Y-%m-%d') : '' %><% $incident->descr |h %>
  • % } % } else {
    No incidents reported for <% $country->name |h %>
    From d6f7c7157d46201f486a93367198596e98284f28 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Wed, 9 Nov 2011 15:00:23 +0100 Subject: [PATCH 10/37] Added ts validation --- lib/CPP/Controller/Root.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/CPP/Controller/Root.pm b/lib/CPP/Controller/Root.pm index f2ddb72..3ee9256 100644 --- a/lib/CPP/Controller/Root.pm +++ b/lib/CPP/Controller/Root.pm @@ -70,7 +70,7 @@ sub incidents :Path { foreach my $rec ($c->model('DB::Incident')->search({},{order_by=>'ts desc',rows=>50})->all) { my($data); map {$data->{$_} = $rec->$_} qw(lat lon); - $data->{ts} = $rec->ts->strftime('%Y-%m-%d'); + $data->{ts} = $rec->ts ? $rec->ts->strftime('%Y-%m-%d') : ''; $data->{type} = $rec->type->id; $data->{name} = $rec->type->name; if(my @countries = $rec->countries()) { From 226b866496a928a64535211d2ffab30c6a3a8dee Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Tue, 15 Nov 2011 15:35:26 +0100 Subject: [PATCH 11/37] Dangling changes post-eu-hackathon --- bin/import-mlabs | 44 ++++++++++++++++++++----- lib/CPP/Controller/Root.pm | 30 ++++++++++++++++-- root/country/view.html | 17 ++++++++-- root/index.html | 60 +++++++++++++++++++++++++++-------- root/static/img/mockdata.png | Bin 0 -> 20000 bytes sql/cpp-data.sql | 1 + 6 files changed, 127 insertions(+), 25 deletions(-) create mode 100644 root/static/img/mockdata.png diff --git a/bin/import-mlabs b/bin/import-mlabs index e11d6c2..f114332 100755 --- a/bin/import-mlabs +++ b/bin/import-mlabs @@ -36,25 +36,53 @@ my $strp = new DateTime::Format::Strptime( time_zone => 'GMT', ); my $mech = WWW::Mechanize->new(); -$mech->get($URL.'/country_maps.json'); +if(0) { + $mech->get($URL.'/country_maps.json'); + my $js = $mech->content(); + print $js; + my $list = $json->decode($js); + foreach my $country_rec (@{$list}) { + my $id = $country_rec->{country_code}; + my $country = $db->resultset('Country')->find($id); + $mech->get($URL.'country_measurements.json?country_code='.$id); + my $data = $json->decode($mech->content()); + print Dumper($data); + foreach my $rec (@{$data}) { + if($rec->{suspicious}) { + my $ts = $strp->parse_datetime($rec->{month}); + my $incident = $db->resultset('Incident')->create({ + 'type' => '15', + 'ts' => $ts, + 'descr' => 'Suspicious connectivity drop', + 'lat' => $country_rec->{latitude}, + 'lon' => $country_rec->{longitude}, + }); + $country->add_to_country_incidents({ + incident => $incident, + }); + } + } + } +} + +$mech->get($URL.'/city_maps.json'); my $js = $mech->content(); print $js; my $list = $json->decode($js); -foreach my $country_rec (@{$list}) { - my $id = $country_rec->{country_code}; +foreach my $city_rec (@{$list}) { + my $id = $city_rec->{country_code}; my $country = $db->resultset('Country')->find($id); - $mech->get($URL.'country_measurements.json?country_code='.$id); + $mech->get($URL.'city_measurements.json?city='.$city_rec->{city}); my $data = $json->decode($mech->content()); - print Dumper($data); foreach my $rec (@{$data}) { if($rec->{suspicious}) { my $ts = $strp->parse_datetime($rec->{month}); my $incident = $db->resultset('Incident')->create({ - 'type' => '15', + 'type' => '16', 'ts' => $ts, 'descr' => 'Suspicious connectivity drop', - 'lat' => $country_rec->{latitude}, - 'lon' => $country_rec->{longitude}, + 'lat' => $city_rec->{latitude}, + 'lon' => $city_rec->{longitude}, }); $country->add_to_country_incidents({ incident => $incident, diff --git a/lib/CPP/Controller/Root.pm b/lib/CPP/Controller/Root.pm index 3ee9256..5533a4c 100644 --- a/lib/CPP/Controller/Root.pm +++ b/lib/CPP/Controller/Root.pm @@ -64,10 +64,10 @@ it under the same terms as Perl itself. our $json = JSON->new(); -sub incidents :Path { +sub incidents :Local { my($self,$c) = @_; my($ret); - foreach my $rec ($c->model('DB::Incident')->search({},{order_by=>'ts desc',rows=>50})->all) { + foreach my $rec ($c->model('DB::Incident')->search({type=>15},{order_by=>'ts desc',rows=>50})->all) { my($data); map {$data->{$_} = $rec->$_} qw(lat lon); $data->{ts} = $rec->ts ? $rec->ts->strftime('%Y-%m-%d') : ''; @@ -82,6 +82,32 @@ sub incidents :Path { $c->response->body($json->encode($ret)); } + +sub incident_timeline :Local { + my($self,$c) = @_; + my($ret); + foreach my $rec ($c->model('DB::Incident')->search({type=>15},{order_by=>'ts'})->all) { + my($data); + map {$data->{$_} = $rec->$_} qw(lat lon); + my $ts = $rec->ts ? $rec->ts->strftime('%Y-%m-%d') : ''; + $data->{ts} = $ts; + $data->{type} = $rec->type->id; + $data->{name} = $rec->type->name; + if(my @countries = $rec->countries()) { + $data->{country} = $countries[0]->id; + } + if($ts) { + push @{$ret->{$ts}}, $data; + } + } + my $data; + foreach my $ts (sort keys %{$ret}) { + push @{$data}, {ts=>$ts,data=>$ret->{$ts}}; + } + $c->response->body($json->encode($data)); +} + + __PACKAGE__->meta->make_immutable; 1; diff --git a/root/country/view.html b/root/country/view.html index 40c4aca..34efc8d 100644 --- a/root/country/view.html +++ b/root/country/view.html @@ -57,10 +57,18 @@

    The state of the Internet in
    <% $country->name %>

    Current incidents

    -% my $incidents = $country->incidents->search({},{order_by=>'ts desc'}); + +
    + +

    Connectivity Status

    +Based on MLabs data +% my $incidents = $country->incidents->search({type=>15},{order_by=>'ts desc'}); % if($incidents->count > 0) { % foreach my $incident ($incidents->all) { -
  • <% $incident->ts ? $incident->ts->strftime('%Y-%m-%d') : '' %><% $incident->descr |h %>
  • +
  • +<% $incident->ts ? $incident->ts->strftime('%Y-%m-%d') : '' %> +<% $incident->descr |h %> +
  • % } % } else {
    No incidents reported for <% $country->name |h %>
    @@ -68,6 +76,11 @@

    Current incidents


    +

    Currently Functioning Circumvention

    +TOR VPN DNS PROXY + +
    +

    Current legislation

    From 4776713e5e4f2eab9aaaea73ab7c08c09b12f91e Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Tue, 15 Nov 2011 16:03:27 +0100 Subject: [PATCH 13/37] Changed map bg to avoid annoying flash on redraw. --- root/static/css/cpp.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/root/static/css/cpp.css b/root/static/css/cpp.css index 14013dd..1854164 100644 --- a/root/static/css/cpp.css +++ b/root/static/css/cpp.css @@ -290,7 +290,7 @@ div.country-list { } #map { - background-color: #444; + background-color: #B0CDD5; } h1 { From e49a1404f517d8afa577e9a74a548aa0f0924d45 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Tue, 15 Nov 2011 20:10:50 +0100 Subject: [PATCH 14/37] Fixed country URL --- root/comp/page.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/root/comp/page.html b/root/comp/page.html index 86442e5..a2f65fb 100644 --- a/root/comp/page.html +++ b/root/comp/page.html @@ -70,7 +70,7 @@
    From 3798faa333af716044ab40ac17f11e6611c6c59f Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Tue, 15 Nov 2011 20:10:57 +0100 Subject: [PATCH 15/37] Added about page --- root/about.html | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 root/about.html diff --git a/root/about.html b/root/about.html new file mode 100644 index 0000000..a9fbd2d --- /dev/null +++ b/root/about.html @@ -0,0 +1,29 @@ +<&| /comp/page.html, title=>'About' &> + +
    + +  + +
    + +
    +
    + +

    About

    + + We've added data to a branch of the ChokepointProject based on two + data sources: +
      +
    1. Broadband statistics provided by Measurement Lab (M-Lab) and
    2. +
    3. theTransparency Reports published by Google.
    4. +
    + The former contains continuous information about the Internet speed at + various locations in the world. By analyzing this data, + ChokepointProject automatically estimates the Internet connectivity for + almost every country and city. + +
    +
    +
    + + From 255abe64a97c6229d24d1ce40e5686b07135ab39 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Tue, 15 Nov 2011 20:11:00 +0100 Subject: [PATCH 16/37] Added about page --- lib/CPP/Controller/Root.pm | 3 +++ root/index.html | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/CPP/Controller/Root.pm b/lib/CPP/Controller/Root.pm index 5533a4c..32e07b3 100644 --- a/lib/CPP/Controller/Root.pm +++ b/lib/CPP/Controller/Root.pm @@ -107,6 +107,9 @@ sub incident_timeline :Local { $c->response->body($json->encode($data)); } +sub about :Local { + +} __PACKAGE__->meta->make_immutable; diff --git a/root/index.html b/root/index.html index 0529dd4..2e79bc5 100644 --- a/root/index.html +++ b/root/index.html @@ -146,7 +146,6 @@

    Current Incidents

    //marker.events.register('mousedown', marker, function(evt) { alert(this.icon.url); OpenLayers.Event.stop(evt); }); //markerArray[i] = marker; markers.addMarker(marker); - map.addControl(new OpenLayers.Control.LayerSwitcher()); } } }); From 7cee836a325016fbadf26cb7b674d7ff7a4b64b1 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Thu, 17 Nov 2011 07:17:56 +0100 Subject: [PATCH 17/37] Fixed issues #5, #6, #9 --- root/static/img/panel_closed.png | Bin 0 -> 36875 bytes root/static/img/panel_open.png | Bin 0 -> 36921 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 root/static/img/panel_closed.png create mode 100644 root/static/img/panel_open.png diff --git a/root/static/img/panel_closed.png b/root/static/img/panel_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..f61f78c0bcf0ae07dd51893771def8f8f2811c0b GIT binary patch literal 36875 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 literal 0 HcmV?d00001 diff --git a/root/static/img/panel_open.png b/root/static/img/panel_open.png new file mode 100644 index 0000000000000000000000000000000000000000..fd8aa554af34cc357722fa3b3dcc197ce20fe498 GIT binary patch literal 36921 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 M?f2pKoc` Date: Thu, 17 Nov 2011 07:18:00 +0100 Subject: [PATCH 18/37] Fixed issues #5, #6, #9 --- root/country/view.html | 35 ++++++++++++++++++++++++++--------- root/index.html | 3 +++ root/static/css/cpp.css | 36 ++++++++++++++++++++++++++++++++++++ root/static/js/script.js | 20 +++++++++++++++----- 4 files changed, 80 insertions(+), 14 deletions(-) diff --git a/root/country/view.html b/root/country/view.html index 34efc8d..516ea00 100644 --- a/root/country/view.html +++ b/root/country/view.html @@ -20,10 +20,10 @@

    The state of the Internet in
    <% $country->name %> embed
  • - [f] +
  • - [t] +
  • @@ -31,13 +31,13 @@

    The state of the Internet in
    <% $country->name %> follow: @@ -61,17 +61,31 @@

    Current incidents


    Connectivity Status

    -Based on MLabs data + % my $incidents = $country->incidents->search({type=>15},{order_by=>'ts desc'}); % if($incidents->count > 0) { + % } else { -
    No incidents reported for <% $country->name |h %>
    +
    No connectivity incidents reported for <% $country->name |h %>
    % }
    @@ -139,6 +153,9 @@

    Lobbying activity new OpenLayers.Control.KeyboardDefaults() ] }); + $(map.getControlsByClass('OpenLayers.Control.Navigation')).each(function(){ + this.disableZoomWheel(); + }) var cloudmade = new OpenLayers.Layer.CloudMade("CloudMade", { key: '<% $c->config->{'CloudMade'}->{'api_key'} %>', styleId: 48233 diff --git a/root/index.html b/root/index.html index 2e79bc5..8df3a6a 100644 --- a/root/index.html +++ b/root/index.html @@ -120,6 +120,9 @@

    Current Incidents

    new OpenLayers.Control.KeyboardDefaults() ] }); + $(map.getControlsByClass('OpenLayers.Control.Navigation')).each(function(){ + this.disableZoomWheel(); + }) var cloudmade = new OpenLayers.Layer.CloudMade("CloudMade", { key: '<% $c->config->{'CloudMade'}->{'api_key'} %>', styleId: 48233 diff --git a/root/static/css/cpp.css b/root/static/css/cpp.css index d5d2b0d..670466b 100644 --- a/root/static/css/cpp.css +++ b/root/static/css/cpp.css @@ -420,3 +420,39 @@ h2:hover ul.inline { } */ + +a.panel { + padding-left: 8px; +} +a.open { + background: transparent url("../img/panel_open.png") center left no-repeat; +} +a.closed { + background: transparent url("../img/panel_closed.png") center left no-repeat; +} + +div.panel { + border-top: 1px solid #f8f8f8; + margin:4px 4px 4px 0px; + padding:8px 8px 8px 16px; + background:#fff; +} + +.phidden { + display:none; +} + +ul.incident { + margin:0; + padding:0; +} + +ul.incident li { + list-style: none; + padding:8px; +} + + +ul.incident li:nth-child(odd) { + background:#f8f8f8; +} diff --git a/root/static/js/script.js b/root/static/js/script.js index 206efd4..305fabd 100644 --- a/root/static/js/script.js +++ b/root/static/js/script.js @@ -1,8 +1,18 @@ /* Author: -*/ - - - - + */ +$(document).ready(function() { + $('a.panel').click(function() { + var panel = $(this); + var id = panel.attr('id'); + if (panel.hasClass('open')) { + panel.removeClass('open').addClass('closed'); + $('#panel_' + id).hide(); + } else { + panel.removeClass('closed').addClass('open'); + $('#panel_' + id).show(); + } + return false; + }); +}); \ No newline at end of file From 527f7281633c70a7d27b73a238094f0aa8d4560e Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Thu, 17 Nov 2011 18:06:22 +0100 Subject: [PATCH 19/37] Fixed about page. Added link back to home page. --- root/about.html | 44 +++++++++++++++++++++++------------------ root/comp/page.html | 2 +- root/static/css/cpp.css | 9 +++++++++ 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/root/about.html b/root/about.html index a9fbd2d..4018208 100644 --- a/root/about.html +++ b/root/about.html @@ -1,26 +1,32 @@ -<&| /comp/page.html, title=>'About' &> +<&| /comp/page.html, title=>'About', body=>'home' &> -
    - -  - -
    - -
    -
    +
    +

    About

    + + +

    +What we did: +

    +

    +Broadband statistics provided by Measurement Lab (M-Lab) and theTransparency Reports published by Google. +The former contains continuous information about the Internet speed at various locations in the world. +By analyzing this data, we can estimate the Internet connectivity status for the countries and cities covered by the data. +

    +

    + Our main aim has been working to build a platform to give people a tool to know what's happening in their country now + and over the historical period, augmented with information on law and lobbying activities. We created a branch of + our application for the hackathon and this is the result of 1,5 days work. +

    +

    + We are displaying dummy data alongside real data for this example. The current incident data is fake. It?s only there to give + you an idea of where this app will be heading. If you are interested, contact us at chokepointproject.net +

    +

    + Team for the hackday: Chris Pinchen, Ruben Bloomgarten, James Burke, Simon Funke, Florian Rathgeber +

    - We've added data to a branch of the ChokepointProject based on two - data sources: -
      -
    1. Broadband statistics provided by Measurement Lab (M-Lab) and
    2. -
    3. theTransparency Reports published by Google.
    4. -
    - The former contains continuous information about the Internet speed at - various locations in the world. By analyzing this data, - ChokepointProject automatically estimates the Internet connectivity for - almost every country and city.
    diff --git a/root/comp/page.html b/root/comp/page.html index a2f65fb..f3e6f85 100644 --- a/root/comp/page.html +++ b/root/comp/page.html @@ -61,7 +61,7 @@
    - EU Hackathon: Exploring mLab data to generate
    connectivity status report per country
    + EU Hackathon: Exploring mLab data to generate
    connectivity status report per country
    diff --git a/root/static/css/cpp.css b/root/static/css/cpp.css index 670466b..2c579be 100644 --- a/root/static/css/cpp.css +++ b/root/static/css/cpp.css @@ -456,3 +456,12 @@ ul.incident li { ul.incident li:nth-child(odd) { background:#f8f8f8; } + +#about { + margin: 80px 0px; + background: #fff; + padding: 32px; + -moz-border-radius: 16px; + -webkit-border-radius: 16px; + border-radius: 16px; +} From fb4aadef136ef6b1a62d5c4b9b4f4980e2f08761 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Thu, 17 Nov 2011 18:23:44 +0100 Subject: [PATCH 20/37] Switch play button on action --- root/index.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/root/index.html b/root/index.html index 8df3a6a..3668a54 100644 --- a/root/index.html +++ b/root/index.html @@ -103,6 +103,8 @@

    Current Incidents

    diff --git a/root/static/css/cpp.css b/root/static/css/cpp.css index 2c579be..f6ce157 100644 --- a/root/static/css/cpp.css +++ b/root/static/css/cpp.css @@ -465,3 +465,27 @@ ul.incident li:nth-child(odd) { -webkit-border-radius: 16px; border-radius: 16px; } + + +.incident .ts { + float:right; + color: #888; + text-transform: uppercase; + font-size: 0.8em; +} + +.incident .type { + font-weight: bold; +} + +.attack .type { + color: #f00; +} + +.restriction .type { + color: #ffb500; +} + +.blackout .type { + color: #000; +} \ No newline at end of file diff --git a/sql/cpp-data.sql b/sql/cpp-data.sql index 5bc5f98..6ad5f8b 100644 --- a/sql/cpp-data.sql +++ b/sql/cpp-data.sql @@ -12,3 +12,5 @@ insert into incident_type values ('13','Radio Frequency jamming','restriction'); insert into incident_type values ('15','Connectivity Issue','blackout'); insert into incident_type values ('16','Connectivity Issue','blackout'); +insert into incident_type values ('17','Government takedown request','restriction'); +insert into incident_type values ('18','User takedown request','restriction'); diff --git a/sql/cpp.sql b/sql/cpp.sql index 80a8618..c8ab4d2 100644 --- a/sql/cpp.sql +++ b/sql/cpp.sql @@ -77,10 +77,12 @@ create table incident ( date_created datetime, last_updated datetime, ts datetime, + ts_end datetime, type varchar(16), source varchar(16), source_id varchar(64), usr varchar(64), + name varchar(255), descr text, lat real, lon real, @@ -92,8 +94,8 @@ create table incident ( create table country_incident ( incident integer, country varchar(16), - foreign key (incident) references incident(id), - foreign key (country) references country(id), + foreign key (incident) references incident(id) on delete cascade, + foreign key (country) references country(id) on delete cascade, primary key (incident,country) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 04b9334d37d749911054f572b880934b474f9cf1 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Tue, 22 Nov 2011 00:58:28 +0100 Subject: [PATCH 22/37] Fixed typo --- root/country/view.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/root/country/view.html b/root/country/view.html index c34d2c1..6912ce5 100644 --- a/root/country/view.html +++ b/root/country/view.html @@ -110,7 +110,7 @@

    Transparency Data

    % foreach my $incident ($transparency->all) {
  • -Blackout +Restriction <% $incident->name |h %> From 15632bd347cfb6b82ae1e388e6f7bdf394311a37 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Tue, 22 Nov 2011 13:51:06 +0100 Subject: [PATCH 23/37] Added data availability and :visit indicator to country names. Closes #13 . --- root/static/img/country_clicked.png | Bin 0 -> 283 bytes root/static/img/country_not_clicked.png | Bin 0 -> 316 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 root/static/img/country_clicked.png create mode 100644 root/static/img/country_not_clicked.png diff --git a/root/static/img/country_clicked.png b/root/static/img/country_clicked.png new file mode 100644 index 0000000000000000000000000000000000000000..5b7cd438faa6cf69022d791676ccbf7e4f88ba2d GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u@pObhHwBu4M$1`kk47*5n0T@ zz%2yAjF;}#{Q(Nfl(C#5R5WfrBD=NDxcD>w(67H)lP22>{o zQs-Qhnpl#VpQjL#nVZUBXsB;wq;F_=>S|dTP(`t)i(`ny)ZPiULJkH3Zt;(JxR#!B zX>BfOd6H4YthdPIF&kHThnvrgAC+Hk=a<_b>@A#C-LOuRx1pGiL2{zWg1-&!E=vS% zUpvL1qA%pIbxm|!%1ec~CElC<2&^-&TXJh#*t74(&tEMzm-gCsy14X2@I&kGxkkRz TVvh#`t!MCb^>bP0l+XkKsDfbn literal 0 HcmV?d00001 diff --git a/root/static/img/country_not_clicked.png b/root/static/img/country_not_clicked.png new file mode 100644 index 0000000000000000000000000000000000000000..5341d54914d3dc0ca5b34d3ea6b2f85a929c2d01 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u@pObhHwBu4M$1`kk47*5n0T@ zz%2yAjF;}#{Q(Nfl(C#5R5WfrBD=NDxcD>w(67H)lP22>{o zQs-Qhnpl#VpQjL#nVZUBXsB;wq;F_=>S|dTP{kBa7sn8ZsjU|_@*Xk}XnlA;Q7~hL zF+mLP;y{`rVh8Uw$bWQge!L2UFqPHOvBn z47<3PX4IZ?ls6PzB0RmYfMK^h$AbO#^V%;L)*IWUW-83}WgG^7B)!JQI``71xH~}iF?hQAxvX Date: Tue, 22 Nov 2011 13:51:12 +0100 Subject: [PATCH 24/37] Added data availability and :visit indicator to country names. Closes #13 . --- root/country/index.html | 7 ++++--- root/region/index.html | 7 ++++--- root/static/css/cpp.css | 14 +++++++++++++- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/root/country/index.html b/root/country/index.html index 75e3a4b..1e04aca 100644 --- a/root/country/index.html +++ b/root/country/index.html @@ -1,9 +1,10 @@ <&| comp/page.html, title=>'Country list' &> <%perl> -my($COUNTRY,$LETTER); +my($COUNTRY,$LETTER,$HASDATA); foreach my $country ($c->model('DB::Country')->all) { my($id,$name)=($country->id,$country->name); $COUNTRY->{$id} = $name; + $HASDATA->{$id} = $country->incidents->count > 0; push @{$LETTER->{lc(substr($name,0,1))}}, $id; } @@ -35,11 +36,11 @@

    <% $letter %>


  • % }
    - \ No newline at end of file + diff --git a/root/region/index.html b/root/region/index.html index 0014793..46a109d 100644 --- a/root/region/index.html +++ b/root/region/index.html @@ -1,9 +1,10 @@ <&| comp/page.html, title=>'Country list' &> <%perl> -my($COUNTRY,$LETTER); +my($COUNTRY,$LETTER,$HASDATA); foreach my $country ($c->model('DB::Country')->all) { my($id,$name)=($country->id,$country->name); $COUNTRY->{$id} = $name; + $HASDATA->{$id} = $country->incidents->count > 0; push @{$LETTER->{lc(substr($name,0,1))}}, $id; } @@ -29,11 +30,11 @@

    <% $region->name %>

    % foreach my $country ($region->countries->search({},{order_by=>'name'})) { %# my $country = $rc->country; -<% $country->name %>
    +<% $country->name %>
    % }

    % }
    - \ No newline at end of file + diff --git a/root/static/css/cpp.css b/root/static/css/cpp.css index f6ce157..e8856b8 100644 --- a/root/static/css/cpp.css +++ b/root/static/css/cpp.css @@ -295,6 +295,18 @@ div.country-list { column-gap: 10px; } +div.country-list a.country { + padding-left: 10px; +} + +div.country-list a.hasdata { + background: transparent url('../img/country_not_clicked.png') center left no-repeat; +} + +div.country-list a.hasdata:visited { + background: transparent url('../img/country_clicked.png') center left no-repeat; +} + #map { background-color: #B0CDD5; } @@ -488,4 +500,4 @@ ul.incident li:nth-child(odd) { .blackout .type { color: #000; -} \ No newline at end of file +} From 11c1f6a3acec3f287839b10a63d9e50d177635a9 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Tue, 22 Nov 2011 13:53:38 +0100 Subject: [PATCH 25/37] Added home button. Closes #14. --- root/comp/page.html | 1 + 1 file changed, 1 insertion(+) diff --git a/root/comp/page.html b/root/comp/page.html index f3e6f85..758ae95 100644 --- a/root/comp/page.html +++ b/root/comp/page.html @@ -69,6 +69,7 @@
      +
    • home
    • about
    • countries
    • blog
    • From 41217717450c8754a280058dfb2f7d605a0f03b7 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Tue, 22 Nov 2011 15:02:50 +0100 Subject: [PATCH 26/37] Default country list now by continent. Fixed notice on empty GTD incident list. Closes #16. --- root/comp/page.html | 2 +- root/country/view.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/root/comp/page.html b/root/comp/page.html index 758ae95..1c14e80 100644 --- a/root/comp/page.html +++ b/root/comp/page.html @@ -71,7 +71,7 @@
    diff --git a/root/country/view.html b/root/country/view.html index 6912ce5..f958b7f 100644 --- a/root/country/view.html +++ b/root/country/view.html @@ -124,7 +124,7 @@

    Transparency Data

    % } % } else { -
    No connectivity incidents reported for <% $country->name |h %>
    +
    No censorship or user data disclosure incidents reported for <% $country->name |h %>
    % }
    From 922a266b1623ac088b8a892a17522a2e03722f69 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Thu, 24 Nov 2011 15:19:08 +0100 Subject: [PATCH 27/37] Added "State of the Internet" div --- root/index.html | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/root/index.html b/root/index.html index 3668a54..f139524 100644 --- a/root/index.html +++ b/root/index.html @@ -17,7 +17,7 @@
    - +

    Current Incidents

    @@ -139,6 +139,12 @@

    Current Incidents

    var offset = new OpenLayers.Pixel(4,4); var icon = new OpenLayers.Icon('<% $c->uri_for('/static') %>/img/red_Square_8px.gif',size,offset); //var markerArray = new Array(); + $.getScript('http://j.maxmind.com/app/country.js',function(){ + var code = geoip_country_code(); + $('#homecountry-link').attr('href','/country/'+code.toUpperCase()); + $('#homecountry-name').html(geoip_country_name()); + $('#homecountry').show(); + }); $.ajax('incidents',{ dataType: 'json', success: function(data,status,xhr) { From c73055b4caf67e5f2ffabd1bdf88d3eaa14488fe Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Sat, 10 Dec 2011 03:52:59 +0100 Subject: [PATCH 28/37] Killed map keyboard navigation. Enabled social networking links. Added section panels. --- root/country/view.html | 51 ++++++++++++++++++++---------------------- root/index.html | 17 +++++++------- 2 files changed, 32 insertions(+), 36 deletions(-) diff --git a/root/country/view.html b/root/country/view.html index f958b7f..4ec2a04 100644 --- a/root/country/view.html +++ b/root/country/view.html @@ -27,14 +27,13 @@

    The state of the Internet in
    <% $country->name %>
  • share:
  • @@ -42,32 +41,21 @@

    The state of the Internet in
    <% $country->name %> follow: - -
  • - download: -

  • - -

    Connectivity Status

    +

    Connectivity Status

    +
    API @@ -95,10 +83,12 @@

    Connectivity Status

    % } else {
    No connectivity incidents reported for <% $country->name |h %>
    % } +

    -

    Transparency Data

    +

    Transparency Data

    +
    API @@ -126,15 +116,18 @@

    Transparency Data

    % } else {
    No censorship or user data disclosure incidents reported for <% $country->name |h %>
    % } +

    -

    Currently Functioning Circumvention

    +

    Currently Functioning Circumvention

    +
    TOR VPN DNS PROXY +

    -

    Current legislation +

    Current legislation

    +
    % my $legislation = $country->country_contents->search({id=>'LEGISLATION'}); % if($legislation->count>0) { <% $legislation->content |h %> % } else {
    No legislation data for <% $country->name |h %>
    % } +

    -

    Lobbying activity +

    Lobbying activity

    +
    % my $lobbying = $country->country_contents->search({id=>'LOBBYING'}); % if($lobbying->count>0) { <% $lobbying->content |h %> % } else {
    No lobbying data for <% $country->name |h %>
    % } +
    +
    @@ -193,8 +191,7 @@

    Lobbying activity map = new OpenLayers.Map('map',{ controls: [ new OpenLayers.Control.Navigation(), - new OpenLayers.Control.ZoomPanel(), - new OpenLayers.Control.KeyboardDefaults() + new OpenLayers.Control.ZoomPanel() ] }); $(map.getControlsByClass('OpenLayers.Control.Navigation')).each(function(){ @@ -218,7 +215,7 @@

    Lobbying activity var incident = incidents[i]; marker = new OpenLayers.Marker(new OpenLayers.LonLat(incident.lon,incident.lat).transform(prj,map.getProjectionObject()),icon.clone()); marker.incident = incident; - markers.addMarker(marker); + markers.addMarker(marker); } }); diff --git a/root/index.html b/root/index.html index 3668a54..566937b 100644 --- a/root/index.html +++ b/root/index.html @@ -1,6 +1,6 @@ <&| /comp/page.html, title=>'Home', body=>'home' &> -
    +
    @@ -12,7 +12,7 @@ SHOW: TODAY : LAST WEEK | - + REPLAY LAST WEEK
    @@ -105,12 +105,12 @@

    Current Incidents

    var markers; var img_play = '<% $c->uri_for('/static') %>/img/playButton.png'; var img_pause = '<% $c->uri_for('/static') %>/img/pauseButton.png'; -function pause(millis) +function pause(millis) { var date = new Date(); var curDate = null; - - do { curDate = new Date(); } + + do { curDate = new Date(); } while(curDate-date < millis) } @@ -118,8 +118,7 @@

    Current Incidents

    map = new OpenLayers.Map('map',{ controls: [ new OpenLayers.Control.Navigation(), - new OpenLayers.Control.ZoomPanel(), - new OpenLayers.Control.KeyboardDefaults() + new OpenLayers.Control.ZoomPanel() ] }); $(map.getControlsByClass('OpenLayers.Control.Navigation')).each(function(){ @@ -150,7 +149,7 @@

    Current Incidents

    marker.events.register('mousedown', marker, function(evt) { document.location='/country/'+this.incident.country; OpenLayers.Event.stop(evt); }); //marker.events.register('mousedown', marker, function(evt) { alert(this.icon.url); OpenLayers.Event.stop(evt); }); //markerArray[i] = marker; - markers.addMarker(marker); + markers.addMarker(marker); } } }); @@ -193,7 +192,7 @@

    Current Incidents

    $('#ts').html(''); markers.display(true); $('#btPlay').attr('src',img_play); - + } } setTimeout(animate,500); From 567ea702ac5684b73294cdf47e0270bfd92122b5 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Sat, 10 Dec 2011 05:12:06 +0100 Subject: [PATCH 29/37] CSS fixes --- root/country/view.html | 4 +-- root/static/css/cpp.css | 45 ++++++++++++++++------------ root/static/img/country_clicked.png | Bin 283 -> 952 bytes 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/root/country/view.html b/root/country/view.html index 4ec2a04..04f43fc 100644 --- a/root/country/view.html +++ b/root/country/view.html @@ -60,7 +60,7 @@

    Connectivity Statusid |u%>">API -
    Based on M-Lab data
    +
    Based on M-Lab data
    % if($incidents->count > 0) {
      @@ -93,7 +93,7 @@

      Transparency Data

      API - + % if($transparency->count > 0) {
        diff --git a/root/static/css/cpp.css b/root/static/css/cpp.css index e8856b8..e5f0cb6 100644 --- a/root/static/css/cpp.css +++ b/root/static/css/cpp.css @@ -7,8 +7,8 @@ body { } body.home { - background: #B1CED6 url("../img/bg.gif") top left repeat-x; - + background: #B1CED6 url("../img/bg.gif") top left repeat-x; + } @@ -36,7 +36,7 @@ header { } #subtitle { -font-size:1.2em; +font-size:1.2em; background:#fff; float: left; //margin-top:10px; @@ -54,11 +54,11 @@ position: absolute; top: 450px; width: 400px; margin-left: 1px; -z-index: 9000; +z-index: 9000; } #playbutt img { -margin-bottom:4px; +margin-bottom:4px; } .playcontroltext { @@ -72,23 +72,23 @@ position: absolute; top: 450px; width: 400px; margin-left: 780px; -z-index: 9000; +z-index: 9000; + - } -a#playbutton:hover { +a#playbutton:hover { background: url("../img/playButton.png")no-repeat 0 0; } a#playbutton:active { background: url("../img/pauseButton.gif")no-repeat 0 0; - - + + } .incidents{ @@ -96,7 +96,7 @@ background: url("../img/pauseButton.gif")no-repeat 0 0; margin-left: 0; padding-left: 1em; text-indent: -1em; - + } hr { @@ -104,12 +104,12 @@ hr { } div.incidents ul li { - - + + } .line { -border-top: #000 solid 2px; +border-top: #000 solid 2px; width:900px; } @@ -128,7 +128,7 @@ footer { #bottomnav { font-weight: normal; float: right; - + margin-right: 60px; margin-bottom: 40px; } @@ -298,13 +298,16 @@ div.country-list { div.country-list a.country { padding-left: 10px; } - -div.country-list a.hasdata { +div.country-list a.hasdata:link { background: transparent url('../img/country_not_clicked.png') center left no-repeat; } div.country-list a.hasdata:visited { + /* + * Please note that background-image *will* be ignored: http://hacks.mozilla.org/2010/03/privacy-related-changes-coming-to-css-vistited/ + */ background: transparent url('../img/country_clicked.png') center left no-repeat; + color: #666; } #map { @@ -437,10 +440,10 @@ a.panel { padding-left: 8px; } a.open { - background: transparent url("../img/panel_open.png") center left no-repeat; + background: transparent url("../img/panel_open.png") center left no-repeat; } a.closed { - background: transparent url("../img/panel_closed.png") center left no-repeat; + background: transparent url("../img/panel_closed.png") center left no-repeat; } div.panel { @@ -501,3 +504,7 @@ ul.incident li:nth-child(odd) { .blackout .type { color: #000; } + +a.data-source { + text-decoration: underline; +} \ No newline at end of file diff --git a/root/static/img/country_clicked.png b/root/static/img/country_clicked.png index 5b7cd438faa6cf69022d791676ccbf7e4f88ba2d..516dca0854fdf4cf555d7f4ac7ce95099f5b70a4 100644 GIT binary patch delta 912 zcmV;B18@AB0=Nf|BYy(!X+uL$Nkc;*P;zf(X>4Tx0C)j~RL^S@K@|QrZmG~B2wH0n zvUrdpNm;9CMbtL^5n^i$+aIn^?(HA4S&Z{q7i9qd_rpchyaeF z2|+X^Rom=NBnCl)bNPGc*m@6vTUNt+`**T;t(wxdng@jaK;TE3*($K_7jX(%5(0=k z-=QhTbO_($*z)X;IZkMl5$Pm3xkbkDT%plY4M}%UrP7R`-;xo0_`v z;5)_TnYkJs*VD-3b4^}+mDF~VS4Wntd3wB>>>5ApSC=v7f;ErCbFlmIEnk()mnn=C z#p6};>VHdwby_hu-=A!MJ3Znq&n~srbFGPsH&&aMXZ>nO`|hf|ljc?VPhR!${AbO? zW8x_>CU%PFA&Hm8F7cAsOREdwU~R_;ot1_u(ruCYB-LPGn!NQdT|ZlRy+(fw^-+`= z%+gee_kY4FWHg<*4sZI8+sFJDLsC-LCD&z3 z7PFaEV(E6+nbRF^9HBWv_r#}4Ws~}^@e#27uu}Q?tWw#2P8!yMm-=tOy!}PMc#DYu z0Fg5me{e}eK~xwSjgUbOfG`LIq2Dv{;sf+)^{xkvz7M-Z2-=!R(m>f+NXsHZG4^xK zxcA*KAzLIXkQEXdsT?zy?w~`aykG?@r~&hKEE%gzYi6d|S2uysO!~Uw2)$=nG%z~x m6TTrheRTx~2q6Fc@C*7DHoY@I{9OP5002ov22Mn-LSTXzue;d* delta 256 zcmdnNKAUNRay4nJa0`Jj{BSR8j2d;us<^wReK8kb{AMTV?zs9z3Tw7WVAB@$*-U&85Beoh~jt5&Y2ld#;i1wAkZ;K>HayUHx3vIVCg!01;DO Aw*UYD From 96381db35ee80c82ce15f12bde0b4a655eac9151 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Sun, 11 Dec 2011 11:28:24 +0100 Subject: [PATCH 30/37] Disabled animation button --- root/index.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/root/index.html b/root/index.html index 6410409..507bce4 100644 --- a/root/index.html +++ b/root/index.html @@ -11,7 +11,9 @@ SHOW: TODAY : LAST WEEK | + REPLAY LAST WEEK From 47c7801f9ce16d7d966b6c731d676dc5e12cc7af Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Sun, 11 Dec 2011 11:35:13 +0100 Subject: [PATCH 31/37] Disabled animation panel. Linked dummy data to about page. Added new copy to about page. --- root/about.html | 24 ++++++++++++++---------- root/comp/page.html | 2 +- root/index.html | 27 +++++++++++++-------------- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/root/about.html b/root/about.html index 4018208..563e9fa 100644 --- a/root/about.html +++ b/root/about.html @@ -7,24 +7,28 @@

        About

        -What we did: +What we did:

        -Broadband statistics provided by Measurement Lab (M-Lab) and theTransparency Reports published by Google. -The former contains continuous information about the Internet speed at various locations in the world. -By analyzing this data, we can estimate the Internet connectivity status for the countries and cities covered by the data. +We built this test version of a planned larger platform using broadband statistics provided by Measurement Lab (M-Lab)and the Transparency Reports published by Google. The former contains continuous information about the Internet speed at various locations in the world. By analyzing this data, we can estimate the Internet connectivity status for the countries and cities covered by the data.

        - Our main aim has been working to build a platform to give people a tool to know what's happening in their country now - and over the historical period, augmented with information on law and lobbying activities. We created a branch of - our application for the hackathon and this is the result of 1,5 days work. +Our main aim has been working to build a platform to give people a tool to know what's happening in their country now and over the historical period, augmented with information on law and lobbying activities. We created a branch of our application for the hackathon and this is the result of 1,5 days work.

        - We are displaying dummy data alongside real data for this example. The current incident data is fake. It?s only there to give - you an idea of where this app will be heading. If you are interested, contact us at chokepointproject.net +Some use of dummy data:

        - Team for the hackday: Chris Pinchen, Ruben Bloomgarten, James Burke, Simon Funke, Florian Rathgeber +The landing page of this example app is displaying dummy data for the current incidents listed under the map. It’s there to give you an idea of what this application could become. Obviously getting radar jamming data is a completely different from monitoring internet traffic. +

        +

        +We need more data: +

        +

        +If you know of relevant data sets either historical or dynamic that you think would benefit this project, please let us know. +

        +

        +Team for the hackday: Chris Pinchen, Ruben Bloomgarten, James Burke, Simon Funke, Florian Rathgeber

        diff --git a/root/comp/page.html b/root/comp/page.html index 1c14e80..fe1d8db 100644 --- a/root/comp/page.html +++ b/root/comp/page.html @@ -61,7 +61,7 @@
      @@ -70,31 +69,31 @@

      Current Incidents

    • Blackout - Internet blackout in Azerbaijan >> + Internet blackout in Azerbaijan >>
    • Restriction - Destination IP blocking in Syria >> + Destination IP blocking in Syria >>
    • Attack - Website Defacement in Paris >> + Website Defacement in Paris >>
    • Attack - Denial of Service attack in Azabaijan >> + Denial of Service attack in Azabaijan >>
    • Blackout - Cell Towers blackout in Mongolia >> + Cell Towers blackout in Mongolia >>
    • From 2c5beffb53b82ffe5922ac9b38a647930fdd10e6 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Sun, 11 Dec 2011 21:00:39 +0100 Subject: [PATCH 32/37] Fixed "smart" quotes --- root/about.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/root/about.html b/root/about.html index 563e9fa..51c48f4 100644 --- a/root/about.html +++ b/root/about.html @@ -10,7 +10,7 @@

      About

      What we did:

      -We built this test version of a planned larger platform using broadband statistics provided by Measurement Lab (M-Lab)and the Transparency Reports published by Google. The former contains continuous information about the Internet speed at various locations in the world. By analyzing this data, we can estimate the Internet connectivity status for the countries and cities covered by the data. +We built this test version of a planned larger platform using broadband statistics provided by Measurement Lab (M-Lab)and the Transparency Reports published by Google. The former contains continuous information about the Internet speed at various locations in the world. By analyzing this data, we can estimate the Internet connectivity status for the countries and cities covered by the data.

      Our main aim has been working to build a platform to give people a tool to know what's happening in their country now and over the historical period, augmented with information on law and lobbying activities. We created a branch of our application for the hackathon and this is the result of 1,5 days work. @@ -19,13 +19,13 @@

      About

      Some use of dummy data:

      -The landing page of this example app is displaying dummy data for the current incidents listed under the map. It’s there to give you an idea of what this application could become. Obviously getting radar jamming data is a completely different from monitoring internet traffic. +The landing page of this example app is displaying dummy data for the current incidents listed under the map. It's there to give you an idea of what this application could become. Obviously getting radar jamming data is a completely different from monitoring internet traffic.

      We need more data:

      -If you know of relevant data sets either historical or dynamic that you think would benefit this project, please let us know. +If you know of relevant data sets either historical or dynamic that you think would benefit this project, please let us know.

      Team for the hackday: Chris Pinchen, Ruben Bloomgarten, James Burke, Simon Funke, Florian Rathgeber From 1e856be3081d4871e2eb9d7e2317f48d2c208ee9 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Mon, 12 Dec 2011 11:59:44 +0100 Subject: [PATCH 33/37] Fixed #homecountry styling. --- root/static/css/cpp.css | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/root/static/css/cpp.css b/root/static/css/cpp.css index e5f0cb6..82cb5e0 100644 --- a/root/static/css/cpp.css +++ b/root/static/css/cpp.css @@ -507,4 +507,12 @@ ul.incident li:nth-child(odd) { a.data-source { text-decoration: underline; -} \ No newline at end of file +} + +#homecountry { + margin-top: 5px; +} + +#homecountry a { + text-decoration: underline; +} From c0fc04fbdf36500ca8654618e5445d7cfd136c3b Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Mon, 19 Dec 2011 18:38:10 +0100 Subject: [PATCH 34/37] Added note for dummy data in home. Zapped extraneous whitespace in country detail. --- root/index.html | 3 ++- root/static/css/cpp.css | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/root/index.html b/root/index.html index b193d2b..77a9d0f 100644 --- a/root/index.html +++ b/root/index.html @@ -21,7 +21,8 @@

      -

      Current Incidents

      +

      Current Incidents

      +
       (Based on dummy data)
      diff --git a/root/static/css/cpp.css b/root/static/css/cpp.css index e5f0cb6..0cfeb0e 100644 --- a/root/static/css/cpp.css +++ b/root/static/css/cpp.css @@ -111,6 +111,7 @@ div.incidents ul li { .line { border-top: #000 solid 2px; width:900px; +clear:both; } @@ -273,7 +274,7 @@ footer { } #content { - margin-top: 190px; + margin-top: 40px; } h2.initial { @@ -321,6 +322,10 @@ h1 { text-transform: uppercase; } +h1.float { + float:left; +} + h1 span.country { font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif; font-size: 28px; @@ -507,4 +512,8 @@ ul.incident li:nth-child(odd) { a.data-source { text-decoration: underline; +} + +.source-note { + margin: 15px 0 0 0; } \ No newline at end of file From 932b60d30d7f5bacd444370fa8c3216c29eb7cdd Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Wed, 21 Dec 2011 16:06:57 +0100 Subject: [PATCH 35/37] Added link from 'dummy data' to about page. Added Javier's name to about page. --- root/about.html | 2 +- root/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/root/about.html b/root/about.html index 51c48f4..6d3a399 100644 --- a/root/about.html +++ b/root/about.html @@ -28,7 +28,7 @@

      About

      If you know of relevant data sets either historical or dynamic that you think would benefit this project, please let us know.

      -Team for the hackday: Chris Pinchen, Ruben Bloomgarten, James Burke, Simon Funke, Florian Rathgeber +Team for the hackday: Chris Pinchen, Ruben Bloomgarten, James Burke, Simon Funke, Florian Rathgeber, Javier Arturo Rodríguez.

      diff --git a/root/index.html b/root/index.html index 77a9d0f..ea02793 100644 --- a/root/index.html +++ b/root/index.html @@ -22,7 +22,7 @@

      Current Incidents

      -
       (Based on dummy data)
      +
       (Based on dummy data)
      From 66586329f8b4661bd837c2e4ea77e38cbd47b1c5 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Wed, 21 Dec 2011 19:48:03 +0100 Subject: [PATCH 36/37] Fixed Ruben's last name, complete with pronunciation guide. --- root/about.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/root/about.html b/root/about.html index 6d3a399..f4b81ca 100644 --- a/root/about.html +++ b/root/about.html @@ -28,7 +28,7 @@

      About

      If you know of relevant data sets either historical or dynamic that you think would benefit this project, please let us know.

      -Team for the hackday: Chris Pinchen, Ruben Bloomgarten, James Burke, Simon Funke, Florian Rathgeber, Javier Arturo Rodríguez. +Team for the hackday: Chris Pinchen, Ruben Bloemgarten, James Burke, Simon Funke, Florian Rathgeber, Javier Arturo Rodríguez.

      From cee15d258aa0d6f50b55c2f6127e9168d47482c8 Mon Sep 17 00:00:00 2001 From: Javier Arturo Rodriguez Date: Thu, 22 Dec 2011 11:59:56 +0100 Subject: [PATCH 37/37] Fixed typo --- root/about.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/root/about.html b/root/about.html index f4b81ca..6daadae 100644 --- a/root/about.html +++ b/root/about.html @@ -19,7 +19,7 @@

      About

      Some use of dummy data:

      -The landing page of this example app is displaying dummy data for the current incidents listed under the map. It's there to give you an idea of what this application could become. Obviously getting radar jamming data is a completely different from monitoring internet traffic. +The landing page of this example app is displaying dummy data for the current incidents listed under the map. It's there to give you an idea of what this application could become. Obviously getting radar jamming data is completely different from monitoring internet traffic.

      We need more data: