• Как правильно верстать маленькие картинки (декор)?

    vanxant
    @vanxant
    1. Можно отдельными блоками с position: absolute
    2. Можно множественным бэкраундом (через запятую), типа background: #fff url(1.png) top left no-repeat, url(2.png) 100px 200px no-repeat, url(3.png) -100px -50px no-repeat;
    Ответ написан
    2 комментария
  • Как отсортировать массив БЕЗ учёта регистра?

    vanxant
    @vanxant
    Т.к. вопрос в яндыксе, отвечу.
    Делай раз:
    setlocale(LC_COLLATE,"ru_RU.UTF-8");
    Делай два:
    sort($a,SORT_LOCALE_STRING | SORT_FLAG_CASE)
    Ответ написан
    Комментировать
  • Удаленные сотрудники с Западной Украины

    vanxant
    @vanxant
    Забейте.
    Майдан приходит и уходит, а кушать хочется всегда.
    Ну и Луцк это не Львив и не Ивано-Франкивск.
    Ответ написан
    Комментировать
  • Есть ли у нас аналог DARPA?

    vanxant
    @vanxant
    Если кратко, то нет.
    Если подробнее, то (… много мата...) нет.
    Вообще у истории забавные казусы.
    В СССР была очень грамотная система планирования R&D вообще — государство заказывало не просто отдельные изыскания и проекты, но систему целиком (то есть страна покупала не просто новый самолёт, а завод по производству этих самолётов вместе со всеми патентами, смежными производственными линиями, ремонтными базами и так далее). Американцы очень кусали локти по этому поводу, так как экономия для государства получалась колоссальной.
    С другой стороны, результаты отдельных исследований и патенты, хотя и принадлежали формально государству, охранялись намного строже, чем в странах дикого капитализма — и не из-за режима секретности, а чтобы о них не пронюхали парни из соседнего НИИ. В итоге страна владела кучей изобретений, которые не покидали родной завод.
    Ответ написан
    1 комментарий
  • Как грамотно называются отступы?

    vanxant
    @vanxant
    Уши. Это называется ушами.
    Ответ написан
    Комментировать
  • А не поможете с прогнозированием продаж?

    vanxant
    @vanxant
    У вас классическая задача на методы оптимизации (man методы оптимизации).

    Сначала введите обозначения:
    Goal — плановая выручка
    для i-того товара
    price[i] — цена
    qty[i] — остаток на складе
    w[i] — сложность продаваемости
    plan[i] — искомый план

    Дальше советую начать со случая двух товаров, так это всё очень наглядно. Как разберетесь с двумя — разберетесь и с любым количеством.
    Берете ручку, рисуете график.
    По оси x у вас plan[1], по оси y — plan[2].
    Рисуете две прямых и помечаете области под ними:
    plan[1]<=qty[1]
    plan[2]<=qty[2]
    Рисуете еще одну прямую и заштриховываете область НАД ней
    plan[1]*price[1] + plan[2]*price[2] >= Goal

    Заштрихованный треугольник, который получился — это ваше пространство потенциальных решений. Если треугольника не получилось, значит при ваших исходных данных решить задачу вообще нельзя (нужно или снижать хотелку, или повышать запасы на складах).

    Часть углов может иметь дробные координаты — округляем их до целых так, чтобы новые координаты лежали внутри пространства решений.

    Для случая трёх товаров у вас получится не треугольник, а пирамидка из 4 точек, для 1000 товаров — 1001-мерная «пирамидка» из треугольников.

    Дальше выписываете вашу целевую функцию:
    Ф(plan[]) = plan[1]*w[1] + plan[2]*w[2] (… + plan[i]*w[i] + ....)
    Вам нужно найти точку в пространстве решений, в котором ваша функция будет иметь минимум. Таким образом вы найдете миниальный план продаж, при котором выполняются все ваши ограничения.

    Вы халявщик, потому что ваша целевая функция Ф — линейная. Можно доказать, что её минимум будет лежать в одном (или нескольких) углах треугольника/пирамидки. Поэтому вам нужно просто посчитать значения Ф во всех углах и выбрать среди них те, где значене Ф() будет минимальным.
    Почему возможно несколько минимальных решений — ну если например у вас два товара с одинаковой ценой и одинаковой сложностью, то вам без разницы, продать один или другой.
    Собственно всё, задача решена.
    Ответ написан
    2 комментария
  • Как правильно спроектировать протокол обмена данными между клиентом и веб-сервисом?

    vanxant
    @vanxant
    Во-первых, забудьте про XML, его придумали бюрократы. Вот пусть они его и используют в своих банках и налоговых. Для парсинга и кодирования JSON достаточно пары функций по 10 строк каждая. Для парсинга XML, даже если в нем пару значений, нужно подгружать монструозные библиотеки.

    Во-вторых, раз уж вы делаете веб-приложение, используйте возможности протокола HTTP. Это значит идеология REST, а не RPC. То есть вместо каких-то там «процедур» или «функций», вы пляшете от объектов и стандартных действий.
    Например, у вас есть объект с идентификатором obj_id. Для любого доступа к нему используется URL вида

    example.com/path/to/obj_id

    Далее по этому URL-у возможны 4 действия (http verb):
    GET example.com/path/to/obj_id — получить данные объекта
    PUT example.com/path/to/obj_id — изменить объект
    DELETE example.com/path/to/obj_id — удалить объект
    POST example.com/path/to/ — создать новый объект в папке /path/to
    GET example.com/path/to/ — получить все объекты в папке /path/to

    В зависимости от результата операции, вы должны возвращать правильные коды ошибок (200 OK, 404 Not Found, 403 Forbidden и т.п.).

    Параметры более сложных запросов идут как get-параметры, ну например
    GET example.com/path/to/?search=blabla
    — искать объекты
    Или можно часть параметров перенести в урл:
    GET example.com/my/report/01.01.2011-31.12.2011/
    Ответ написан
    4 комментария
  • Просить или нет оплату за ТЗ?

    vanxant
    @vanxant
    Отдельный договор на составление ТЗ вполне себе общепринятая вещь в крупных проектах. Сначала оплачивается и пишется ТЗ, а уже по утвержденному ТЗ детально просчитывается стоимость проекта.

    Если заказчик готов с вами работать — он такое примет без вопросов. А вот если он отказывается — значит он изначально хотел вас кинуть, еще спасибо скажете, что удалось рано от него избавиться.
    Ответ написан
    Комментировать
  • Регистрация своей фирмы

    vanxant
    @vanxant
    Не вижу смысла регистрировать ооо через фирму.
    Фирма вам сделает а) документы б) приведет за ручку к нотариусу и в налоговую и в) заберет документы из всяких фондов.
    Документы делаются докуметноведом www.documentoved.ru/ за 500 рублей — там все хорошо, проверено десятками тысяч регистраций, и скорее всего лучше, чем в среднестатистической рег. фирме. При оформлении документов десять раз перепроверить всю вводимую информацию, особенно почтовые индексы, даты и т.п. — там где можно случайно опечататься. Налоговая при регистрации эти данные почти не проверяет, вносит как подали — ну и получите на выходе бомбу замедленного действия в виде неправильных данных в ЕГРЮЛ. Как проверит ваши данные регфирма — это вопрос.
    К нотариусу и в налоговую все равно надо идти, если только у фирмы нет карманного нотариуса, который приходит в офис этой фирмы. «Дружественный» фирме нотариус плох тем, что он доверяет фирме и просто подмахивает. Независимый нотариус тщательно проверяет все данные, у нас например выловил штук 5 ошибок, бегали перепечатывали форму. Также у нотариуса сразу стоит заверить копию протокола о назначении ген. дира (и спряатать её, не показывая налоговой). Она очень пригодится, когда пойдете в серьезный банк, полезете в крупные тендеры и т.п. — а взять ее будет негде.

    Да, при самостоятельной регистрации гендиру придется по разу пробежаться по налоговой и фондам — но после начала работы фирмы ему еще много раз придется туда бегать. Так хотя бы выяснит где это, когда работает, телефоны и все прочее, так что это время ему зачтется.

    Суммарно самостоятельная регистрация занимает недели 2-3, но там по паре часов в день и то не каждый.
    Готовьте пачку бумаги листов 500 и соответсвующее количество тонера в принтере.
    Ответ написан
    2 комментария
  • Как вы считаете, какой форум безопаснее?

    vanxant
    @vanxant
    Simple Machines Forum.
    Уже несколько лет им пользуюсь, всё прекрасно. Вспоминая invision — аж оторопь берет.
    Ответ написан
    2 комментария
  • Nginx. Почему процессы, а не потоки?

    vanxant
    @vanxant
    А с безопасностью совсем просто.
    На shared-хостинге натыкано 100500 юзеров, у каждого своя папка и свой конфиг сайта.
    Если каждый процесс nginx-a запущен с правами своего пользователя, то вся головная боль по допуску-недопуску одних юзеров в каталоги других юзеров лежит на ОС (и она с ней блестяще справляется). Если бы были потоки от одного-единственного юзера www-data, то ничего не мешало бы юзеру Пете сделать симлинк или просто ссылку в своём конфиге на папку юзера Васи и копаться в его файлах через веб-сервер.
    Ответ написан
    Комментировать
  • Веб-дизайнер должен разбираться в HTML и CSS?

    vanxant
    @vanxant
    Каждый должен заниматься только тем, что умеет хорошо.
    Если дизайнер может верстать хорошо — вперед, отлично, он аццки крут.
    Если не может — то в общем и ладно, хороших верстальщиков намного больше, чем хороших дизайнеров.

    Раньше, действительно, были кое-какие вещи, которые было очень трудно реализовать в html-коде. Дизайнерам приходилось про эти ограничения знать.
    Но это было до эпохие IE6, как ни странно.
    Сегодня верстка слоями — эта прямая калька со слоёв фотошопа. Если верстальщик не может просто скопировать информацию из одного файла в другой — значит он профнепригоден.
    Ответ написан
    3 комментария
  • Высоконагруженный сокет-сервер?

    vanxant
    @vanxant
    1. Забудьте про треды и тем более процессы, 5-10к тредов не выдержит никакая ось.
    2. Соответственно только неблокирующий ввод-вывод. Один поток занимается только i/o и сбрасывает полученные данные другим потокам… Вы бы сказали всё же какая у вас задача, а то это пальцем в небо.
    3. Нормально реализовать неблокирующий и/о с первого раза сложно, со второго тоже… Там внутрях каждой оси много «трюков», которые нет-нет да заблокируют ваш поток. Очень советую использовать libevent или что-то вроде того.
    4. Если уж собираете статистику и всё такое, не изобретайте велосипед и возьмите хотя бы SQLite. Иначе опять же соберете кучу граблей и косяков с конкурентностью, взаимными блокировками потоков, крахом базы при падении сервера, рейсами и прочими прелестями многопоточки. SQLite можно встроить прямо в вашу прогу, для внешнего наблюдателя её как бы и не будет.
    Ответ написан
    1 комментарий
  • Посоветуйте клавиатуру

    vanxant
    @vanxant
    Главная засада всех таких миниклавиатур — загнанный хз куда правый шифт. А на его месте какой-нибудь PgUp, стрелка вверх или вынь-кей. Если вы привыкли к слепому десятипальцевому — с такой клавиатурой вы повеситесь.
    Еще некоторые альтернативно-одаренные гении любят лепить какую-нибудь г… ноклавишу правее Esc. Тоже будете много материться, если вы привыкли жать искейп наощуп как самую крайнюю.
    Так что тщательно изучайте фотографии выбранной клавы.
    Ответ написан
  • Альтернатива вебмани?

    vanxant
    @vanxant
    С приемом платежей на банковские карты очень много подводных камней.
    Вообще, если хотите нормально принимать деньги — делайте ИП или какой там у него аналог в Беларуси, и принимайте деньги обычным безналом (в том числе через всякие платежные системы).
    Ответ написан
    Комментировать
  • Функция jQuery — антипаттерн God Object?

    vanxant
    @vanxant
    Надо разделять функцию и неймспейс. С неймспейсом все нормально, так же как с приведенным выше Math. А вот $ как функция — таки-да, God Object, если под этим понимать нарушение принципа единственности области ответственности «в особо крупном размере». Чтобы в этом убедиться, достаточно посмотреть её исходный код.
    	function( selector, context, rootjQuery ) {
    		var match, elem, ret, doc;
    
    		// Handle $(""), $(null), or $(undefined)
    		if ( !selector ) {
    			return this;
    		}
    
    		// Handle $(DOMElement)
    		if ( selector.nodeType ) {
    			this.context = this[0] = selector;
    			this.length = 1;
    			return this;
    		}
    
    		// The body element only exists once, optimize finding it
    		if ( selector === "body" && !context && document.body ) {
    			this.context = document;
    			this[0] = document.body;
    			this.selector = "body";
    			this.length = 1;
    			return this;
    		}
    
    		// Handle HTML strings
    		if ( typeof selector === "string" ) {
    			// Are we dealing with HTML string or an ID?
    			match = quickExpr.exec( selector );
    
    			// Verify a match, and that no context was specified for #id
    			if ( match && (match[1] || !context) ) {
    
    				// HANDLE: $(html) -> $(array)
    				if ( match[1] ) {
    					context = context instanceof jQuery ? context[0] : context;
    					doc = (context ? context.ownerDocument || context : document);
    
    					// If a single string is passed in and it's a single tag
    					// just do a createElement and skip the rest
    					ret = rsingleTag.exec( selector );
    
    					if ( ret ) {
    						if ( jQuery.isPlainObject( context ) ) {
    							selector = [ document.createElement( ret[1] ) ];
    							jQuery.fn.attr.call( selector, context, true );
    
    						} else {
    							selector = [ doc.createElement( ret[1] ) ];
    						}
    
    					} else {
    						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
    						selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
    					}
    
    					return jQuery.merge( this, selector );
    
    				// HANDLE: $("#id")
    				} else {
    					elem = document.getElementById( match[2] );
    
    					// Check parentNode to catch when Blackberry 4.6 returns
    					// nodes that are no longer in the document #6963
    					if ( elem && elem.parentNode ) {
    						// Handle the case where IE and Opera return items
    						// by name instead of ID
    						if ( elem.id !== match[2] ) {
    							return rootjQuery.find( selector );
    						}
    
    						// Otherwise, we inject the element directly into the jQuery object
    						this.length = 1;
    						this[0] = elem;
    					}
    
    					this.context = document;
    					this.selector = selector;
    					return this;
    				}
    
    			// HANDLE: $(expr, $(...))
    			} else if ( !context || context.jquery ) {
    				return (context || rootjQuery).find( selector );
    
    			// HANDLE: $(expr, context)
    			// (which is just equivalent to: $(context).find(expr)
    			} else {
    				return this.constructor( context ).find( selector );
    			}
    
    		// HANDLE: $(function)
    		// Shortcut for document ready
    		} else if ( jQuery.isFunction( selector ) ) {
    			return rootjQuery.ready( selector );
    		}
    
    		if (selector.selector !== undefined) {
    			this.selector = selector.selector;
    			this.context = selector.context;
    		}
    
    		return jQuery.makeArray( selector, this );
    
    Ответ написан
  • Может ли 1С продавать чужой OpenSource софт?!!!?

    vanxant
    @vanxant
    Право продавать они разумеется имеют, точно так же как, например, Red Hat.
    Я даже вам расскажу, кто это покупает в России. В крупной фирме юристы, например, могут требовать, чтобы всё ПО было лицензионным. И скачанные из интернета распечатки GPL тут не канают. В случае с 1С вы получаете напечатанную лицензию, договор, диски, счета-фактуры — в-общем всю ерундистику, после которой никакой самый наглый проверяющий не сможет доказать, что вы пользуетесь контрафактом.
    Ответ написан
    Комментировать
  • На чём писать демона

    vanxant
    @vanxant
    Вообще на современных плюсах с современными же либами (mysql++) работа с мускулом получается просто на удивление приятно. =)
    Так что на чем умеете — на том и пишите.
    Ответ написан
    Комментировать