Задать вопрос
  • Маштабируемые графики без библиотек: SVG или Canvas?

    lastuniverse
    @lastuniverse
    Делал как то забавы ради на canvas: https://game.lastuniverse.ru/graph.01/

    Масштабируется:
    колесиком мыши (пропорционально)
    alt+колесиком мыши (по вертикали)
    Перетаскивается мышкой

    картинки
    5c8f64a9ab23d265628305.png5c8f64c3e7211482234549.png5c8f64cb9481d503846658.png
  • Построение 3D модели человека на основании фото. Как сделать быстро и удобно?

    lastuniverse
    @lastuniverse
    Несколько лет назад (может даже и более 10 лет назад) компанией autodesk был анонсирован сервис 1234 catch (ныне является частью сервиса 123D apps, который достаточно качественно решает вашу задачу.
    Работало это так:
    1. Объект сканирования устанавливался неподвижно (если это человек, то он мог быть одет во что угодно, никаких размалеваных квадратами футболок и сканирующих лазерных лучей)
    2. Пользователь делал видеозапись путем перемещения камеры по окружности в 360 гр. вокруг.
    3. данная видеозапись заливалась на сервис
    4. сервис обрабатывал видеозапись, строя 3D модель

    Вот видеоролик, показывающий как это работает сейчас
  • Как найти соответствие ключ-значение = значение ключ в массиве?

    lastuniverse
    @lastuniverse
    Без энтузиазма


    Так как известный мне JavaScript считает синтаксически неверными записи типа
    [21: 31, 22: 14, 23: 1, 24: 35, 25: 6, 26: 16, 27: 13, 28: 78, 29: 1,30: 42, 31: 21, 32: 31, 33: 15,34: 20, 35: 24]
    и [[24: 35], [21: 31]]

    взял на себя смелость заменить на
    {"21":31,"22":14,"23":1,"24":35,"25":6,"26":16,"27":13,"28":78,"29":1,"30":42,"31":21,"32":31,"33":15,"34":20,"35":24}
    и {"21":31,"24":35} соответственно.
  • Что толкового можно написать опираясь на модуль Net (Nodejs)?

    lastuniverse
    @lastuniverse
    Да что угодно, опирающееся на сетевой стэк. Например свой FTP, minecraft server, proxy и другие сервера и клиенты, включая узкоспециализированные такие как vnc клиент с последующей трансляцией управления в браузер. Перечислять можно бесконечно.
    Лично я, как любитель изобретать велосипеды, написал для собственных нужд 2 класса, позволяющих достаточно легко обмениваться служебными json сообщениями:
    детский трехколесный велик

    сам недомодуль (красоты не ждите:):
    const net = require("net");
    
    function send(event, data){
    	this.write(
    		JSON.stringify({
    			event: event,
    			data: data
    		})+"\n"
    	);
    }
    
    class Server extends EventEmitter {
    	constructor(options={}){
    		super();
    		this.clients = {};
    		this.host=options.host||'0.0.0.0';
    		this.port=options.port||'8020';
    		this.server = net.createServer ((client)=>{
    			client.send = send;
    			client.on('data', data=>{
    				try{
    					const str = data.toString();
    					const json = JSON.parse(""+str);
    					if( json && json.event && json.data!==undefined){
    						this.emit(json.event, json.data, client);
    					}
    				}catch(err){
    					console.log('\n\nError parse json', err);
    				}
    			});
    
    			client.on('close', data=>{
    				// ...
    			});
    		});
    	}
    
    	listen(host, port){
    		this.host=host||this.host;
    		this.port=port||this.port;
    		this.server.listen(this.port, this.host);
    		console.log('Server was ben started as ' + this.host + ':' + this.port);
    	}
    }
    module.exports.Server = Server;
    
    
    class Client extends EventEmitter {
    	constructor(options={}){
    		super();
    		this.host=options.host||'192.168.0.1';
    		this.port=options.port||'8020';
    		this.client = new net.Socket();
    		this.client.send = send;
    		this.client.on('data', data=>{
    			data.toString().split(/[\n\r]+/).forEach(str=>{
    				if( !str || str.search(/^[\s\n\r]+$/)+1 ) return;
    				try{
    					const json = JSON.parse(""+str);
    					if( json && json.event && json.data!==undefined){
    						this.emit(json.event, json.data, this.client);
    					}
    				}catch(err){
    					console.log('\n\nError parse json ', err);
    				}
    			});
    		});
    
    		this.client.on('close', ()=>{
    			console.log('Connection closed');
    			this.emit("disconnect", {});
    			setTimeout(()=>{
    				this.connect()
    			}, 6000);
    		});
    
    		this.client.on('error', ()=>{
    			console.log('Connection error');
    			this.emit("disconnect", {});
    			this.client.destroy();
    			
    		});		
    	}
    
    	
    	connect(host, port){
    		this.host=host||this.host;
    		this.port=port||this.port;
    		this.client.connect(this.port, this.host, (err)=>{
    			this.emit('connect', {}, this.client);
    			if(err) reject(err);
    		});
    	}
    }
    module.exports.Client = Client;


    узкоспециализированный сервер на его базе:
    const storrage = require("./modules/storrage.js");
    const users = storrage("../config/users.json",{});
    const config = storrage("../config/config.server.json",{});
    
    const NU = require("./modules/net-union.js");
    const server = new NU.Server();
    const clients = {};
    
    function getUser(data){
        if( !data || !data.login || !data.password )
            return false;
        const user = users[data.login];
        if( !user || user.password != data.password)
            return false;
        return user;
    }
    
    server.on("avance", (data, client )=>{
        const user = getUser(data.auth);
        if( !user ) return client.end();
        
        const username = data.auth.login;
        clients[username] = client;
        user.points-=data.avance;
        client.send("points", user.points);
    });
    
    server.on("unlock", (data, client )=>{
        console.log("unlock", data);
        const user = getUser(data);
        if( !user ) return client.end();
    
        const username = data.login;
        clients[username] = client;
        user.points--;
        client.send("points", user.points);
    });
    
    function update_points(username,amount) {
        if( !amount ) return;
        
        const user = users[username];
        if( !user ) return;
    
        const client = clients[username];
        if( !client ) return;
    
        client.send("points", user.points);
        client.send("message", "Количество минут "+(amount<0?"уменьшено":"увеличено")+" на "+amount+".\nОсталось "+user.points+" минут");
    }
    
    server.listen(config.url.host, config.url.port);
    
    module.exports.server = server;
    module.exports.update_points = update_points;


    ну и клиент)
    const manage = require("./modules/manage.js");
    const storrage = require("./modules/storrage.js");
    const config = storrage("./config/config.client.json",{});
    
    
    const NU = require("./modules/net-union.js");
    const client = new NU.Client();
    
    var count = 0;
    var avance = 0;
    var server;
    var isConnect = false;
    
    // при подключении к серверу отправить запрос на авторизацию
    client.on("connect", (data, serv )=>{
    	if(isConnect) return;
    	isConnect = true;
    	server = serv;
        console.log('\n\nПодключился к ' + client.host + ":" + client.port);
        if(avance)
        	server.send("avance", {auth: config.auth, avance: avance});
    });
    
    // при отключении к серверу переходим в автономный режим
    client.on("disconnect", (data)=>{
    	console.log("client.on disconnect");
    	isConnect = false;
    });
    
    
    // при получении количества баллов обновить счетчик
    client.on("points", (points, serv )=>{
    	console.log("client.on points", points);
    	count = points;
    	notify();
    });
    
    // при получении сообщения - вывести уведомление
    client.on("message", (message, serv )=>{
    	console.log("client.on message", message);
    	manage.notify("Таймер", message);
    });
    
    client.connect(config.url.host, config.url.port);
    
    function notify() {
    	if(count>8 && count%10===0){
    		manage.notify("Таймер", "Осталось "+count+" минут");
    	}else if(count==5){
    		manage.notify("Таймер", "Осталось "+count+" минут");
    	}else if(count>1 && count<5){
    		manage.notify("Таймер", "Осталось "+count+" минуты");
    	}else if(count==1){
    		manage.notify("Таймер", "Осталась 1 минута");
    	}else if(count<1){
    		manage.notify("Таймер", "ВРЕМЯ ВЫШЛО");
    		lock()
    	}
    }
    
    function lock() {
    	setTimeout(function() {
    		manage.lock(config.auth.login);
    	}, 20000);
    }
    
    function observe_session() {
    	console.log("next time");
    	manage.isLocked(config.auth.login, isLocked=>{
    		if(isLocked) return;
    
    		if( isConnect ){
    			server.send("unlock", config.auth);
    		}else{
    			count--;
    			avance++;
    			notify();
    		}
    	});
    	setTimeout( observe_session , 60000 );
    }
    setTimeout( observe_session , 10000 );

  • Нейронная сеть под мою задачу с чего начать?

    lastuniverse
    @lastuniverse
    Гораздо более подходящая задача для начинабщего в ИНС - создание и обучение ИНС дающей оценку например опасности ситуации на шашечном поле (игра в шашки) всего будет 256 входов и один выход, количество скрытых слоев и колличество нейронов в них подбираете сами. Обучающие, тестовые и контрольные выборки составляются на основе сыгранных партий, записей которых в инете множество.

    Решив эту задачу вы более или менее поймете что такое ИНС, их слабые и сильные стороны, что и как влияет на количество скрытых слоев и колличество нейронов в них и многое другое.

    Далее уже можно изучать рекуррентные ИНС и различные их вариации (lstm и прочие)
  • Поиск программы для изменение изображения?

    lastuniverse
    @lastuniverse
    Очевидно, что данное изображение не является результатом програмной обработки фотографии а нарисованно человеком. Об этом говорит наложение теней штрихами. Штрихи имеют произвольные направления на всем пространстве изображения, но при этом в местах где тени бросают относительно ровные геометрические объекты, такие как скосы крыш, направления штрихов выбраны так, как это сделал бы человек. Любому алгоритму, предназначенному для обработки изображений достаточно сложно объяснить, чем отличаются грани скоса крыш от тех же скосов колон или деревьев.
    Так же обратите внимание на штрихрвку большого дерева слева. Штрихи выполнены группами с различным направлением штриховки, при этом некоторые из групп имеют незначительные наложения в зонах контакта с соседними группами, а концы штрихов имеют характерные закругления, возникающие когда штриховка делается рукой (не программно).
    Так же обратите внимание на вертикаль коллон. Они кривые, не вертикальные и не параллельные. Это также указывает на руку художника а не на програмную обработку фотографии.
    Конечно вполне возможно написать алголитм преобразования фотографий в подобную картинку, но такой алгоритм будет очень узкоспециализированным, и на мой узгляд вкладывать много времени в его разработку, написание и отладку нецелесообразно.

    Само изображение скорее всего рисовалось с использованием графического планшета и программы для рисования типа krita
    https://ru.m.wikipedia.org/wiki/Krita
  • Как сделать 2.5D игру html5?

    lastuniverse
    @lastuniverse
    однозначно надо делать что то типа алиеншутера да еще и с сетевой игрой)))
  • Как сделать 2.5D игру html5?

    lastuniverse
    @lastuniverse
    Дмитрий Петров, надо бы обменятся контактами, но не хочу светить ту мыло и телефон)
  • Как сделать 2.5D игру html5?

    lastuniverse
    @lastuniverse
    profesor08, и я о том же. С точки зрения мерности пространства никаких дробных D в принципе существовать не может. Это не более чем пиар термин. И соответственно под него можно подвести все, что хоть чуть выбивается из классического 2D но не дотягивает до полноценного 3D
  • Как сделать 2.5D игру html5?

    lastuniverse
    @lastuniverse
    Как вариант изометрию можно назвать 2.5D. Так же, можно назвать и первый wolf, и многое другое. Термин 2.5D используется достаточно часто и к месту и не к месту, но всилу своей надуманости не имеет четких границ применимости (рожден пиар менеджерами а не мерностью пространства)
  • Jquery не пашет, что со мной не так?

    lastuniverse
    @lastuniverse
    Вова, тут совершенно не место для того чтобы показывать свой "стиль" общения. На тостере в почете спокойный, деловой стиль, с четкими формулировками поясняющими суть вопроса. Перечитайте последний комментарий profesor08, в нем содержится ответ на Ваш вопрос.
  • Почему не работает роутинг в Express.js через Router?

    lastuniverse
    @lastuniverse
    Михаил, все 3 ответа верные, но этот более правильный с точки зрения понятности и переносимости кода
  • Какая библиотека поможет в реализации следующего drag n drop на React?

    lastuniverse
    @lastuniverse
    Приложение полностью офтопик, но в нем есть немного drag & drop, возможно будет интересно ознакомится

    5c8ac2f98e63c274013366.png
  • WebSocket js как изменить host?

    lastuniverse
    @lastuniverse
    Сделать параллельно второе подключение к другому адресу и при отправке сообщения указывать какому из алресатов (по какому из соединений) его отправлять.
  • Как сделать клон сайта, который сам является клоном?

    lastuniverse
    @lastuniverse
    Почему бы Вам не задать вопрос по существу?
    Например такой "Какие существуют способы/сервисы/библиотеки для автоматического распознавания/подбора капчи?"
  • Построение 3D модели человека на основании фото. Как сделать быстро и удобно?

    lastuniverse
    @lastuniverse
    То что вы говорите - теория. Практика же показывает что возможны варианты. У тех же растянутых футболок есть за что зацепится. Градиент освещенности, изгибы и складки самой материи и многое другое. Спорить не буду, растянутая футболка может существенно понизить точность модели, но почему вы решили что полученной точности недостаточно для достижения поставленных целей? При этом надо учитывать, что достаточное количество фотографий с хорошим разрешением напротив, способны существенно повысить точность модели.
  • Как можно решить проблему с addEventListener('click')?

    lastuniverse
    @lastuniverse
    Совсем не хочется открывать ! )