mercoledì 30 settembre 2015

Mobius sul Quadcopter 250

Altro esperimento con il quadcopter con la camera Mobius



venerdì 18 settembre 2015

MongoDB - Script di MapReduce con uso di scope su map dinamico

Dovendo realizzare una MapReduce per il calcolo dei valori massimi e minimi in un determinato periodo (meteorologico) mi sono scontrato col il problema di passare ad una funzione di Map dei parametri dinamici provenienti da un ciclo.

Per risolvere questo problema bisogna utilizzare un parametro di scope quando si lancia l'esecuzione della MapReduce:


es:

var KEYS = {FIELD : 'test',PERIOD : 'Day'};

dbOne.rawdata.mapReduce(map,reduceMax,{out:{inline:1}, scope : {KEYS:KEYS}}).results;

e nella map posso usarlo:

var map = function(){


if(KEYS.PERIOD == 'Day')
...
emit(somefunction, this[KEYS.FIELD]);
...

};

esempio completo:



/***
Extract max a min data from rawtable of extracting data from La crosse WS1640
project: http://meteo.marcoberri.it
**/
var dbOne = db.getSisterDB('mbmeteolacrosse');
var periods = ['Hour','Day', 'Month', 'Year'];
for (var p in periods) {
var period =periods[p];
var fields = ['T1', 'H1', 'PRESS','WC', 'WS'];
for (var f in fields) {
var fieldName = fields[f];
var KEYS = {FIELD: fieldName, PERIOD: period};
var map = function(){
var periodFunction = "";
var day = (this.ts.getDate() <10 ? "0" + this.ts.getDate() : this.ts.getDate());
var month = (this.ts.getMonth()+1 < 10 ? "0" + (this.ts.getMonth()+1) : (this.ts.getMonth()+1));
if(KEYS.PERIOD == 'Hour')
periodFunction = (this.ts.getFullYear() + "-" + month + "-" + day + ":"+ (this.ts.getHours()<10 ? "0"+this.ts.getHours() : this.ts.getHours()) );
if(KEYS.PERIOD == 'Day')
periodFunction = (this.ts.getFullYear() + "-" + month + "-" + day );
if(KEYS.PERIOD == 'Month')
periodFunction = (this.ts.getFullYear() + "-" + month);
if(KEYS.PERIOD == 'Year')
periodFunction = this.ts.getFullYear();
emit(periodFunction, this[KEYS.FIELD]);
};
var reduceMin = function(date, values){
var min = values[0];
values.forEach(
function(val) {
if(!isNaN(val) && val < min)
min = val;
}
);
return min
};
var reduceMax = function(date, values){
var max = values[0];
values.forEach(
function(val) {
if(!isNaN(val) && val > max)
max = val;
}
);
return max
};
var c = dbOne.rawdata.mapReduce(map,reduceMin,{out:{inline:1}, scope : {KEYS:KEYS}}).results;
var fname = fieldName + 'Min' + period;
for(var i=0;i<c.length;i++){
var updateDate = {};
updateDate["$set"] = {}
updateDate["$set"][fname] = c[i].value;
updateDate["$set"]['ts'] = c[i]._id;
dbOne.maxmindata.update({'ts' : c[i]._id},updateDate,{'upsert':true});
};
var c = dbOne.rawdata.mapReduce(map,reduceMax,{out:{inline:1}, scope : {KEYS:KEYS}}).results;
var fname = fieldName + 'Max' + period;
for(var i=0;i<c.length;i++){
var updateDate = {};
updateDate["$set"] = {}
updateDate["$set"][fname] = c[i].value;
updateDate["$set"]['ts'] = c[i]._id;
dbOne.maxmindata.update({'ts' : c[i]._id},updateDate,{'upsert':true});
};
print(fieldName + " - for:" + period +" --> ok");
};
};
view raw MaxMinData.js hosted with ❤ by GitHub

mercoledì 9 settembre 2015

Spring MVC 4 - elenco chiamate REST

Ottimo controller REST per visualizzare l'elenco delle chiamate disponibili nel proprio MVC (tipo il file wsdl)
@Controller
public class ApiDocInfo {
private final RequestMappingHandlerMapping handlerMapping;
@Autowired
public System(RequestMappingHandlerMapping handlerMapping) {
this.handlerMapping = handlerMapping;
}
@RequestMapping(value = "/apidoc", method = RequestMethod.GET)
public void getApiDoc(Model model, HttpServletResponse response) {
model.addAttribute("handlerMethods", this.handlerMapping.getHandlerMethods());
try {
response.setContentType(MediaType.TEXT_HTML_VALUE);
StringBuffer sb = new StringBuffer();
sb.append("<html>");
sb.append("<body>");
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : this.handlerMapping.getHandlerMethods().entrySet()) {
sb.append("<div><hr>");
sb.append("<p>");
if (entry.getValue().getMethod()!= null) {
sb.append("<strong>" + entry.getValue().getMethod().getName() + "</strong>");
}
sb.append("</p>");
sb.append("</div>");
sb.append("<p>");
sb.append("<span>Path:</span><br>");
if (entry.getKey().getPatternsCondition().getPatterns() != null) {
sb.append("<strong>" +entry.getKey().getPatternsCondition().getPatterns() + "</strong>");
}
sb.append("</p>");
sb.append("</div>");
sb.append("<p>");
sb.append("<span>Method:</span>");
if (entry.getKey().getMethodsCondition().getMethods() != null) {
sb.append(entry.getKey().getMethodsCondition().getMethods());
}
sb.append("</p>");
sb.append("</div>");
sb.append("<p>");
sb.append("<span>Parameter annotation:</span><br>");
if (entry.getValue().getMethod().getParameterAnnotations()!= null) {
for(Annotation a[] : entry.getValue().getMethod().getParameterAnnotations()){
for(Annotation b : a){
if(!b.annotationType().isAnnotation())
continue;
if( b.annotationType().getSimpleName().equals("PathVariable"))
continue;
sb.append(b.annotationType().getSimpleName() + "<br/>");
}
}
}
sb.append("</p>");
sb.append("</div>");
sb.append("<p>");
sb.append("<span>Return Class:</span>");
if (entry.getValue().getMethod().getReturnType()!= null) {
sb.append(entry.getValue().getMethod().getReturnType());
}
sb.append("</p>");
sb.append("</div>");
sb.append("<p>");
sb.append("<span>Complete method:</span><br>");
sb.append(entry.getValue());
sb.append("</p>");
sb.append("</div>");
sb.append("<p>");
sb.append("<span>Params:</span><br>");
if (entry.getKey().getParamsCondition() != null) {
sb.append(entry.getKey().getParamsCondition());
}
sb.append("</p>");
sb.append("</div>");
}
sb.append("</body>");
sb.append("</html>");
response.getWriter().print(sb);
} catch (final IOException e) {
}
}
}
view raw ApiDocInfo.java hosted with ❤ by GitHub