Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
Un proiettore economico, che fa della portabilità e immediatezza i suoi punti di forza. Adatto per una camera da letto o per la casa vacanze, è basato su sistema proprietario Linux ma offre piena compatibilità ufficiale a Netflix
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
Un notebook sviluppato in collaborazione con GoPro ma che risponde al meglio alle necessità di tutti coloro che creano contenuti video: robustezza, design, potenza di calcolo e funzionalità si abbinano al meglio tra di loro, pur se a prezzo di un costo elevato per via della tanta memoria onboard
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090
Ho affidato ai due modelli lo stesso mestiere ma non lo stesso identico prompt: trasformare una storia illustrata in un video usando una RTX 3090 e modelli locali. Ne sono usciti due film, due applicazioni e due idee opposte di efficienza. Fucina, progettata con Fable 5, colpisce di più nei primi secondi. Storyboard Studio, costruito con ChatGPT/Codex, regge meglio sulla distanza e vince il confronto complessivo, ma di stretta misura
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-11-2015, 20:50   #21
JohnMarston
Member
 
Iscritto dal: Jun 2013
Messaggi: 133
Complimenti! Io ancora non ho risolto, ma secondo me hai centrato il problema!
JohnMarston è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2015, 21:49   #22
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da JohnMarston Guarda i messaggi
Complimenti! Io ancora non ho risolto, ma secondo me hai centrato il problema!
A proposito del tipo dell'array: non ho avuto molto tempo per darci un'occhiata, quindi ho
- stampato il vettore passato e scoperto che, sebbene i dati sono corretti, nashorn mantiene il tipo di array java (la signature e' Java);
- creato un nuovo array copiando i dati in un array javascript.

Sicuramente c'e' un modo migliore per fare questa cosa; comunque funziona.
Se vuoi provare, basta modificare la funzione hull in javascript cosi', e dovrebbe funzionare tutto (dico dovrebbe perche' non ho piu' verificato l'output, ma non ci sono piu' errori/eccezioni):

Codice:
function hull(jpointset, concavity, format) {
    var lower, upper, convex,
        innerPoints,
        maxSearchBBoxSize,
        maxEdgeLen = concavity || 20;

    if (jpointset.length < 4) {
        return jpointset;
    }
    print('Stampo il jpointset');
    for (var i = 0; i < jpointset.length; i++)
    {
        print(i + ") - [" + jpointset[i][0] + ", " + jpointset[i][1] + ")");
    }
    print('jpointset stampato');
    print('creo un array javascript. In questo modo l'array contiene gli stessi valori ma il tipo e' quello corretto');
    var pointset = new Array();
    for (var i = 0; i < jpointset.length; i++)
    {
        pointset[i] = jpointset[i];
    }

    pointset = _sortByX(_formatToXy(pointset, format));
    upper = _upperTangent(pointset);
    lower = _lowerTangent(pointset);
    convex = lower.concat(upper);
    convex.push(pointset[0]);

    maxSearchBBoxSize = Math.max(pointset[pointset.length - 1][0], _getMaxY(convex)) * MAX_SEARCH_BBOX_SIZE_PERCENT;
    innerPoints = pointset.filter(function(pt) {
        return convex.indexOf(pt) < 0;
    });
 
    return _xyToFormat(_concave(convex, Math.pow(maxEdgeLen, 2), maxSearchBBoxSize, grid(innerPoints)), format);
}
A questo punto dovrebbe essere tutto a posto. Tienici aggiornati.

MODIFICA - ero curioso ed ho controllato i valori di uscita e sono tutti corretti (vale a dire che ottengo gli stessi valori che si ottengono dall'html).
Ricorda pero' una cosa: gli array di javascript sono corrispondenti alle HashMap di java, non ai vettori. L'indice del vettore e' la chiave dell'hash map. Cmq i valori sono tutti li (esattamente quelli che hai scritto) e sono facili da usare.

Fammi sapere se ti servono piu' dettagli
__________________
In God we trust; all others bring data

Ultima modifica di sottovento : 02-11-2015 alle 07:28.
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 02-11-2015, 13:21   #23
JohnMarston
Member
 
Iscritto dal: Jun 2013
Messaggi: 133
Ottimo!!! Potrai anche non crederci, ma a me va in eccezione...
Mi devi postare il codice, sicuramente sbaglio qualcosa!!!
Per codice intendo tutta la classe perché aggiunte o sostituzioni blocchi, mi condanni!!!

Grazie!
JohnMarston è offline   Rispondi citando il messaggio o parte di esso
Old 02-11-2015, 13:29   #24
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ok, ti metto un po' di cose qui.
Per la cronaca: mi sono aiutato con le varie print() e con il debugger di Netbeans. Per farlo ho dovuto creare un progetto netbeans e fare qualche leggera modifica.
Se non riesci a far andare il codice che posto qui, contattami in privato e ti mando una mail con tutto

questo e' CHull.java:
Codice:
package com.sottovento;

import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class CHull
{
    static double[][] inputPoints = 
    {
        {0.441,   0.229},
        {0.436,   0.237},
        {0.386,   0.308},
        {0.389,   0.273},
        {0.389,   0.269},
        {0.386,   0.264},
        {0.386,   0.252},
        {0.386,   0.251},
        {0.386,   0.249},
        {0.383,   0.244},
        {0.377,   0.239},
        {0.377,   0.207},
        {0.377,   0.204},
        {0.368,   0.199},
        {0.278,   0.168},
        {0.26,    0.154},
        {0.258,   0.153},
        {0.258,   0.144},
        {0.257,   0.128},
        {0.231,   0.119},
        {0.229,   0.111},
        {0.226,   0.105},
        {0.215,   0.1},
        {0.122,   0.088},
        {0.114,   0.087},
        {0.102,   0.075},
        {0.102,   0.067},
        {0.093,   0.049},
        {0.003,   0.02},
        {0.01,    0.01},
        {0.064,   -0.026},
        {0.146,   0},
        {0.213,   0.005},
        {0.228,   0.001},
        {0.268,   0.081},
        {0.28,    0.093},
        {0.345,   0.163},
        {0.373,   0.16},
        {0.377,   0.159},
        {0.378,   0.159},
        {0.38,    0.159},
        {0.381,   0.159},
        {0.383,   0.159},
        {0.422,   0.199},
        {0.441,   0.229}
    };
    static String[][] mat2X ={{"0.064", "0.056", "0.043", "0.052", "0.063", "0.096", "0.101", "0.096", "0.09", "0.09", "0.093" },    
                           {"0.01", "0.008", "0.003", "0.005", "0.025", "0.051", "0.055", "0.057", "0.063", "0.068", "0.064" }};
    
    public static String toJavascriptArray(String[][] arr)
    {
        StringBuilder sb = new StringBuilder();
        
        sb.append("[");
        for(int i=0; i<arr[0].length; i++)
        {
            sb.append("[").append(arr[0][i]).append(",");
            sb.append(arr[1][i]).append("]");
            if(!(i==arr[0].length-1))
                sb.append(",");
        }
        sb.append("]");
        
        return sb.toString();
    }     

        
    public static void main(String[] args) throws Exception
    {
        System.out.println("array "+toJavascriptArray(mat2X));

        ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
        try
        {
            engine.eval(new FileReader("hull.js"));
        }
        catch (FileNotFoundException | ScriptException e)
        {
            // Penso di aver capito perche' il caricamento fallisce!! Il browser ha definito degli oggetti che probabilmente nashorn non ha definito!
            // Probabilmente il browser ha definito cose come window, document e cosi' via. Hull fa riferimento a questi oggetti, ma siccome nashorn non ne ha
            // nemmeno uno, hull fallisce
            e.printStackTrace(System.out);
        }

        Invocable invocable = (Invocable) engine;

//        Object result = invocable.invokeFunction("hull", inputPoints, 0.50); 
        Object result = invocable.invokeFunction("entryPoint", inputPoints, 0.50); 
//        Object result = invocable.invokeFunction("testMydata"); 
        System.out.println(result);
        System.out.println(result.getClass());        
    }        
}
Questo e' hull.js
Codice:
var entryPoint;

function testMydata()
{
    print('Call the entry point');
    entryPoint([[0.441,0.229], [0.436,0.237], [0.386,0.308], [0.389,0.273], [0.389,0.269], [0.386,0.264], [0.386,0.252], [0.386,0.251], [0.386,0.249], [0.383,0.244], [0.377,0.239], [0.377,0.207], [0.377,0.204], [0.368,0.199], [0.278,0.168], [0.26,0.154], [0.258,0.153], [0.258,0.144], [0.257,0.128], [0.231,0.119], [0.229,0.111], [0.226,0.105], [0.215,0.1], [0.122,0.088], [0.114,0.087], [0.102,0.075], [0.102,0.067], [0.093,0.049], [0.003,0.02], [0.01,0.01], [0.064,-0.026], [0.146,0], [0.213,0.005], [0.228,0.001], [0.268,0.081], [0.28,0.093], [0.345,0.163], [0.373,0.16], [0.377,0.159], [0.378,0.159], [0.38,0.159], [0.381,0.159], [0.383,0.159], [0.422,0.199], [0.441,0.229]], 0.50);
    print('Call was successful!');
}

    !function(e)
    {
        if ("object"==typeof exports && "undefined"!=typeof module)
        {
            console.log('(e) - checkpoint 1');
            module.exports=e();
        }
        else if ("function"==typeof define&&define.amd)
            define([],e);
        else
        {
//            var f;
//            "undefined"!=typeof window ?
//                f=window :
//                "undefined"!=typeof global ?
//                f=global :
//                "undefined"!=typeof self&&(f=self),
//                console.log('A questo punto, f=' + f);    // This for firefox
//                //print('A questo punto, f=' + f); // This for nashorn
//                f.hull=e()
            entryPoint = e();
        }
    }
    (function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&amp;require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&amp;require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
function Grid(points) {
    var _cells = [];

    points.forEach(function(point) {
        var cellXY = this.point2CellXY(point),
            x = cellXY[0],
            y = cellXY[1];
        if (_cells[x] === undefined) {
            _cells[x] = [];
        }
        if (_cells[x][y] === undefined) {
            _cells[x][y] = [];
        }
        _cells[x][y].push(point);
    }, this);

    this.cellPoints = function(x, y) { // (Number, Number) -> Array
        return (_cells[x] !== undefined && _cells[x][y] !== undefined) ? _cells[x][y] : [];
    };

    this.removePoint = function(point) { // (Array) -> Array
        var cellXY = this.point2CellXY(point),
            cell = _cells[cellXY[0]][cellXY[1]],
            pointIdxInCell;
        
        for (var i = 0; i < cell.length; i++) {
            if (cell[i][0] === point[0] && cell[i][1] === point[1]) {
                pointIdxInCell = i;
                break;
            }
        }

        cell.splice(pointIdxInCell, 1);

        return cell;
    };
}

Grid.prototype = {
    point2CellXY: function(point) { // (Array) -> Array
        var x = parseInt(point[0] / Grid.CELL_SIZE),
            y = parseInt(point[1] / Grid.CELL_SIZE);
        return [x, y];
    },

    rangePoints: function(bbox) { // (Array) -> Array
        var tlCellXY = this.point2CellXY([bbox[0], bbox[1]]),
            brCellXY = this.point2CellXY([bbox[2], bbox[3]]),
            points = [];

        for (var x = tlCellXY[0]; x <= brCellXY[0]; x++) {
            for (var y = tlCellXY[1]; y <= brCellXY[1]; y++) {
                points = points.concat(this.cellPoints(x, y));
            }
        }

        return points;
    },

    addBorder2Bbox: function(bbox, border) { // (Array, Number) -> Array
        return [
            bbox[0] - (border * Grid.CELL_SIZE),
            bbox[1] - (border * Grid.CELL_SIZE),
            bbox[2] + (border * Grid.CELL_SIZE),
            bbox[3] + (border * Grid.CELL_SIZE)
        ];
    }
};

function grid(points) {
    return new Grid(points);
}

Grid.CELL_SIZE = 10;

module.exports = grid;
},{}],2:[function(require,module,exports){
/*
 (c) 2014, Andrey Geonya
 Hull.js, a JavaScript library for concave hull generation by set of points.
 https://github.com/AndreyGeonya/hull
*/

'use strict';

var intersect = require('./intersect.js');
var grid = require('./grid.js');

function _formatToXy(pointset, format) {
    if (format === undefined) {
        return pointset;
    }
    return pointset.map(function(pt) {
        /*jslint evil: true */
        var _getXY = new Function('pt', 'return [pt' + format[0] + ',' + 'pt' + format[1] + '];');
        return _getXY(pt);
    });
}

function _xyToFormat(pointset, format) {
    if (format === undefined) {
        return pointset;
    }
    return pointset.map(function(pt) {
        /*jslint evil: true */
        var _getObj = new Function('pt', 'var o = {}; o' + format[0] + '= pt[0]; o' + format[1] + '= pt[1]; return o;');
        return _getObj(pt);
    });
}

function _sortByX(pointset) {
    return pointset.sort(function(a, b) {
        if (a[0] == b[0]) {
            return a[1] - b[1];                           
        } else {                                                    
            return a[0] - b[0];                                                           
        }
    });
}

function _getMaxY(pointset) {
    var maxY = -Infinity;
    for (var i = pointset.length - 1; i >= 0; i--) {
        if (pointset[i][1] > maxY) {
            maxY = pointset[i][1];
        }
    }
    return maxY;
}

function _upperTangent(pointset) {
    var lower = [];
    for (var l = 0; l < pointset.length; l++) {
        while (lower.length >= 2 && (_cross(lower[lower.length - 2], lower[lower.length - 1], pointset[l]) <= 0)) {
            lower.pop();
        }
        lower.push(pointset[l]);
    }
    lower.pop();
    return lower;
}

function _lowerTangent(pointset) {
    var reversed = pointset.reverse(),
        upper = [];
    for (var u = 0; u < reversed.length; u++) {
        while (upper.length >= 2 && (_cross(upper[upper.length - 2], upper[upper.length - 1], reversed[u]) <= 0)) {
            upper.pop();
        }
        upper.push(reversed[u]);
    }
    upper.pop();
    return upper;
}

function _cross(o, a, b) {
    return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]); 
}

function _sqLength(a, b) {
    return Math.pow(b[0] - a[0], 2) + Math.pow(b[1] - a[1], 2);
}

function _cos(o, a, b) {
    var aShifted = [a[0] - o[0], a[1] - o[1]],
        bShifted = [b[0] - o[0], b[1] - o[1]],
        sqALen = _sqLength(o, a),
        sqBLen = _sqLength(o, b),
        dot = aShifted[0] * bShifted[0] + aShifted[1] * bShifted[1];

    return dot / Math.sqrt(sqALen * sqBLen);
}

function _intersect(segment, pointset) {
    for (var i = 0; i < pointset.length - 1; i++) {
        var seg = [pointset[i], pointset[i + 1]];
        if (segment[0][0] === seg[0][0] && segment[0][1] === seg[0][1] ||
            segment[0][0] === seg[1][0] && segment[0][1] === seg[1][1]) {
            continue;
        }
        if (intersect(segment, seg)) {
            return true;
        }
    }
    return false;
}

function _bBoxAround(edge, boxSize) {
    var minX, maxX, minY, maxY;

    if (edge[0][0] < edge[1][0]) {
        minX = edge[0][0] - boxSize;
        maxX = edge[1][0] + boxSize;
    } else {
        minX = edge[1][0] - boxSize;
        maxX = edge[0][0] + boxSize;
    }

    if (edge[0][1] < edge[1][1]) {
        minY = edge[0][1] - boxSize;
        maxY = edge[1][1] + boxSize;
    } else {
        minY = edge[1][1] - boxSize;
        maxY = edge[0][1] + boxSize;
    }

    return [
        minX, minY, // tl
        maxX, maxY  // br
    ];
}

function _midPoint(edge, innerPoints, convex) {
    var point = null,
        angle1Cos = MAX_CONCAVE_ANGLE_COS,
        angle2Cos = MAX_CONCAVE_ANGLE_COS,
        a1Cos, a2Cos;

    for (var i = 0; i < innerPoints.length; i++) {
        a1Cos = _cos(edge[0], edge[1], innerPoints[i]);
        a2Cos = _cos(edge[1], edge[0], innerPoints[i]);

        if (a1Cos > angle1Cos && a2Cos > angle2Cos &&
            !_intersect([edge[0], innerPoints[i]], convex) &&
            !_intersect([edge[1], innerPoints[i]], convex)) {

            angle1Cos = a1Cos;
            angle2Cos = a2Cos;
            point = innerPoints[i];
        }
    }

    return point;
}

function _concave(convex, maxSqEdgeLen, maxSearchBBoxSize, grid) {
    var edge,
        border,
        bBoxSize,
        midPoint,
        bBoxAround,    
        midPointInserted = false;

    for (var i = 0; i < convex.length - 1; i++) {
        edge = [convex[i], convex[i + 1]];

        if (_sqLength(edge[0], edge[1]) < maxSqEdgeLen) { continue; }

        border = 0;
        bBoxSize = MIN_SEARCH_BBOX_SIZE;
        bBoxAround = _bBoxAround(edge, bBoxSize);
        do {
            bBoxAround = grid.addBorder2Bbox(bBoxAround, border);
            bBoxSize = bBoxAround[2] - bBoxAround[0];
            midPoint = _midPoint(edge, grid.rangePoints(bBoxAround), convex);            
            border++;
        }  while (midPoint === null && maxSearchBBoxSize > bBoxSize);

        if (midPoint !== null) {
            convex.splice(i + 1, 0, midPoint);
            grid.removePoint(midPoint);
            midPointInserted = true;
        }
    }

    if (midPointInserted) {
        return _concave(convex, maxSqEdgeLen, maxSearchBBoxSize, grid);
    }

    return convex;
}

function hull(jpointset, concavity, format) {
    var lower, upper, convex,
        innerPoints,
        maxSearchBBoxSize,
        maxEdgeLen = concavity || 20;

    if (jpointset.length < 4) {
        return jpointset;
    }
    print('Stampo il jpointset');
    for (var i = 0; i < jpointset.length; i++)
    {
        print(i + ") - [" + jpointset[i][0] + ", " + jpointset[i][1] + ")");
    }
    print('jpointset stampato');
    print('creo un array javascript');
    var pointset = new Array();
    for (var i = 0; i < jpointset.length; i++)
    {
        pointset[i] = jpointset[i];
    }

    pointset = _sortByX(_formatToXy(pointset, format));
    upper = _upperTangent(pointset);
    lower = _lowerTangent(pointset);
    convex = lower.concat(upper);
    convex.push(pointset[0]);

    maxSearchBBoxSize = Math.max(pointset[pointset.length - 1][0], _getMaxY(convex)) * MAX_SEARCH_BBOX_SIZE_PERCENT;
    innerPoints = pointset.filter(function(pt) {
        return convex.indexOf(pt) < 0;
    });
 
    return _xyToFormat(_concave(convex, Math.pow(maxEdgeLen, 2), maxSearchBBoxSize, grid(innerPoints)), format);
}

var MAX_CONCAVE_ANGLE_COS = Math.cos(90 / (180 / Math.PI)); // angle = 90 deg
var MIN_SEARCH_BBOX_SIZE = 5;
var MAX_SEARCH_BBOX_SIZE_PERCENT = 0.8;

module.exports = hull;
},{"./grid.js":1,"./intersect.js":3}],3:[function(require,module,exports){
function ccw(x1, y1, x2, y2, x3, y3) {           
    var cw = ((y3 - y1) * (x2 - x1)) - ((y2 - y1) * (x3 - x1));
    return cw > 0 ? true : cw < 0 ? false : true; // colinear
}

function intersect(seg1, seg2) {
  var x1 = seg1[0][0], y1 = seg1[0][1],
      x2 = seg1[1][0], y2 = seg1[1][1],
      x3 = seg2[0][0], y3 = seg2[0][1],
      x4 = seg2[1][0], y4 = seg2[1][1];
    return ccw(x1, y1, x3, y3, x4, y4) !== ccw(x2, y2, x3, y3, x4, y4) && ccw(x1, y1, x2, y2, x3, y3) !== ccw(x1, y1, x2, y2, x4, y4);
}

module.exports = intersect;
},{}]},{},[2])(2)
});
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 02-11-2015, 14:15   #25
JohnMarston
Member
 
Iscritto dal: Jun 2013
Messaggi: 133
Non c è verso di farlo andare... Va in eccezione...
Ti contatto in MP.
JohnMarston è offline   Rispondi citando il messaggio o parte di esso
Old 02-11-2015, 14:22   #26
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da JohnMarston Guarda i messaggi
Non c è verso di farlo andare... Va in eccezione...
Strano. Ho fatto altre prove ma continua ad andare.
Fai una prova tu: ho compilato il codice e creato un .jar. Lo trovi in allegato
Crea una nuova directory, scomprimi il contenuto (contiene solo il .jar ed il .js) e scrivi
java -jar TestNashorn.jar
vedrai un po' di scritte (i dati che vorresti stampare non vengono stampati perche' non si deve fare cosi', ma e' un dettaglio).

Quote:
Originariamente inviato da JohnMarston Guarda i messaggi
Ti contatto in MP.
Ok
Allegati
File Type: zip distribution.zip (6.0 KB, 0 visite)
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 02-11-2015, 14:32   #27
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Dimenticavo: puoi specificare
- tipo di eccezione ed eventuale stack trace;
- versione di java in uso (deve essere almeno 8)
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix HONOR CHOICE Projector Air Pro: piccolo, portati...
ASUS ProArt GoPro Edition è il notebook compatto per chi crea ASUS ProArt GoPro Edition è il notebook c...
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090 Fable e Sol a confronto: due cartoni animati cre...
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile Il tablet rugged leggero e sottile: Lenovo Think...
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot AMD Advancing AI 2026: l'hardware AMD per le ela...
BYD, boom in Giappone: la sua prima kei ...
L'Europa mette sul piatto 1,5 miliardi d...
Google dichiara risolto il bug della bat...
Intel apre i segreti dei chip Atom a una...
FC 27 stravolgerà il gameplay: me...
Microsoft conferma la super app Copilot:...
Svolta per il vaccino anti-HIV: team ann...
Il governo USA 'compra' una quota di Glo...
Veeam offre supporto a sei nuovi hypervi...
WINDTRE BUSINESS apre alle imprese il da...
DEF CON vieta gli occhiali smart da 'per...
Keychron annuncia ZGM, il primo firmware...
Zuckerberg prevede miliardi di agenti IA...
Benzina sempre più cara, boom di ...
DualSense White a 59,99€: il controller ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:14.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v