В начале 2008 г. бурно обсуждался Федеральный закон от 19.07.2007 N 195-ФЗ, которым в Налоговый кодекс (НК) была внесена поправка о предоставлении льготы по НДС при реализации прав на программы для ЭВМ и базы данных. Прошло три года, Минфин высказал свое мнение о порядке применения льготы, разработчики и дистрибьюторы подстроили под них договорные схемы, страсти поутихли. Однако подошло время налоговых проверок за период с 2008 г., когда принятые в отрасли схемы ухода от НДС попадут под пристальное внимание налоговых органов. Устоят ли они в судах? Попробуем разобраться.
Начнем с сути поправки. Законом установлено, что не подлежит обложению НДС (освобождается от налогообложения) реализация (а также передача, выполнение, оказание для собственных нужд) на территории РФ исключительных прав на программы для электронных вычислительных машин, базы данных, а также прав на использование указанных результатов интеллектуальной деятельности на основании лицензионного договора. На первый взгляд, казалось бы, не хитрая формулировка, но насколько полно она ложится на реальные схемы создания и распространения программного обеспечения?
Мой частный дом отапливается при помощи электрических конвекторов. Всё в них хорошо: и лёгкость монтажа и автоматическое управление температурой и режим день/ночь и режим 50% мощности. Но есть и минус — датчик температуры воздуха закреплён прямо на корпусе конвектора, поэтому нагревается и остывает вместе с ним. Из-за этого конвектор включается/выключается гораздо чаще, чем хотелось бы, невозможно установить желаемую температуру воздуха в комнате, т.к. реальная будет ниже градусов на 5, да и на надёжности постоянные переключения реле сказываются негативно. Можно было, конечно, удлинить датчик температуры и отнести его подальше, но это не наш метод. Т.к. я давно занимаюсь беспроводными технологиями и есть наработки, то решил оснастить конвектор беспроводным датчиком температуры. Это позволит разместить его в любом месте комнаты, не тянуть провода, а если нужно, использовать не один, а несколько датчиков и рассчитывать среднюю по комнате температуру. (Под катом картинки)
Ситуация с 3д-принтерами напоминает ситуацию с Linux-дистрибутивами, особенно для новичка. Огромная куча конструкций под кодовыми именами, половина из которых поставляется в собранном виде, половину надо собирать как конструктор из деталей, а для еще одной половины все детали надо найти самому, да еще и напильником поработать. Кстати, откуда взялась третья половина — тоже непонятно. Попробуем в этом всем разобраться.
На базе нашей платформы Wiren Board (компактный индустриальный компьютер с Linux и разными интерфейсами) мы сделали навороченный контроллер для домашней автоматизации Wiren Board Smart Home (ARM9 64MB RAM, GSM/GPRS, Ethernet, Wi-Fi, USB, 2xRS-485/Modbus, CAN, 2 реле, ASK/FSK радиомодуль 433MHz, NRF24L01+ и т.д.), к которому можно подключить кучу всяческих проводных и беспроводных исполнительных устройств и датчиков от разных систем и производителей. Устройство готово и протестировано. На устройства из первой большой партии мы открываем заказ с доставкой до майских праздников по специальной цене.
Для понимания этой статьи читатель должен иметь начальный опыт разработки windows-приложений в среде Qt Creator.
В примерах используются Qt Creator 3.0.0 (MinGW) и Qwt-6.1.0.
Qwt – графическая библиотека, позволяющая значительно упростить процесс визуализации данных в программе. Упрощение заключается в следующем: нет необходимости вручную прописывать элементы отображения, такие как шкалы координат, сетки, кривые данных и проч. Следует лишь задавать параметры этих элементов.
Аналогия: для того, чтобы построить график в Excel Вы выбираете данные и настраиваете параметры их отображения: минимум и максимум шкал, цвет кривых, подписи данных и др. За визуализацию отвечает Excel – сами элементы Вы не программируете.
Особо отмечу, что Qwt позволяет работать с достаточно большими объемами данных (я работал с 200 000 точек) без возникновения раздражающих «тормозов».
В данной статье мы будем отображать кривую на графике, масштабировать ее, перемещаться по графику, смотреть координаты курсора. Таким образом, мы реализуем минимальный функционал, необходимый для вывода и просмотра графиков. В последующих статьях наш графический редактор будет оснащен дополнительными возможностями.
Qwt – графическая библиотека, позволяющая значительно упростить процесс визуализации данных в программе. Упрощение заключается в следующем: нет необходимости вручную прописывать элементы отображения, такие как шкалы координат, сетки, кривые данных и проч. Следует лишь задавать параметры этих элементов.
В части №1 (постепенно разрастающегося) цикла статей мы:
• подключили Qwt к Qt Creator;
• построили график;
• настроили оси координат;
• изменяли масштаб графика (приближали/удаляли его);
• перемещались по полю графика;
• отображали координаты рядом с курсором по щелчку мышкой.
В части №2 мы расширим функциональность нашего визуализатора:
• добавим строку состояния;
• сохраним координаты клика в переменных и отобразим их в строке состояния;
• добавим кнопку на панель управления;
• добавим на панель управления QwtCounter (поле для номера, значение которого можно изменять стрелками, см. картинку).
• зададим с помощью QwtCounter смещение графика x;
• нажатием на кнопку сместим график на ранее заданную величину х.
Примечание: В рамках этой статьи при добавлении элементов управления GUI не используется.
Периодически на Хабре появляются топики, повествующие о тендерных процессах глазами либо заказчика, либо участника.
Люди, пишущие от лица заказчиков, говорят, что не все так плохо и страшно. Участники же, наоборот, отвечают, что результаты не оправдывают затраченных усилий. За время своей трудовой деятельности я закупал для разных структур и по разным нормативным документам. Это были и федеральные структуры, и госкорпорации и частные компании. Поэтому я постараюсь, основываясь на своем опыте, рассказать об особенностях проведения закупок в учреждениях исполнительной власти, крупных коммерческих структур и предприятий с государственным участием.
Пост является личной подборкой полезных и нужных онлайн сервисов, которые позволяют бесплатно (или условно бесплатно) создавать действительно крутые вещи и разворачивать их в Сети. Не претендую на новизну или на полноту, но буду счастлив, если кому пригодится.
Всем нам иногда хочется попробовать новую идею, запилить какой-нибудь сайтик про манулов, но чтоб обязательно на node.js, хайлоад реди, с мемкешем, монго, фейловером и с претензией на мировое господство. У меня для Вас хорошие новости: благодаря щедрости проклятых западных капиталистов всё это можно получить совершенно бесплатно.
Цель данной статьи — помочь C и C++ программистам понять сущность того, чем занимается компоновщик. За последние несколько лет я объяснил это большому количеству коллег и наконец решил, что настало время перенести этот материал на бумагу, чтоб он стал более доступным (и чтоб мне не пришлось объяснять его снова). [Обновление в марте 2009: добавлена дополнительная информация об особенностях компоновки в Windows, а также более подробно расписано правило одного определения (one-definition rule).
Типичным примером того, почему ко мне обращались за помощью, служит следующая ошибка компоновки:
g++ -o test1 test1a.o test1b.o
test1a.o(.text+0x18): In function `main':
: undefined reference to `findmax(int, int)'
collect2: ld returned 1 exit status
Если Ваша реакция — 'наверняка забыл extern «C»', то Вы скорее всего знаете всё, что приведено в этой статье.
На хабре не очень много уроков по созданию игр, почему бы не поддержать отечественных девелоперов?
Представляю вам свои уроки, которые учат создавать игры на C++ с использованием SDL!
Что нужно знать
Хотя бы начальные знания C++ (использовать будем Visual Studio)
Терпение
О чем эта часть?
Мы создадим каркас для всех игр, в качестве отрисовщика будем использовать SDL. Это библиотека для графики.
В следующих постах будет больше экшена, это лишь подготовка :)
Привет %username%! У нас отличные новости: вышла официальная версия NinjaMock — онлайн-сервиса для создания прототипов. Теперь ты можешь рисовать отличные прототипы веб- и мобильных приложений совершенно бесплатно!
Часто, когда разработчик выбирает движок для очередного магазина, он обычно оценивает этот вопрос по нескольким критериям:
Платный/бесплатный (если платный, то сколько).
Какой функционал есть «из коробки».
Насколько легко докрутить какой-то свой функционал.
Как много он потянет товаров, чтобы на хостинг не разориться.
Насколько гибкие политики безопасности, чтобы обеспечить совместную работу различных отделов.
Какие платежные системы поддерживаются.
Под катом я расскажу о новой готовой сборке интернет-магазина, которая разрабатывалась с учетом этих критериев, и думаю, может заставить призадуматься даже искушенных разработчиков.
В конце статьи видео с кратким обзором движка и двумя способами установки
Важно!!! Забыл сказать: кто поленится посмотреть видео, но развернет у себя сборку, логин/пароль в админку по умолчанию: admin/admin.
Сразу скажу, что разворачивая данную сборку, вы сразу получаете вот такой сайт. То есть сразу есть модель каталога, регистрация/авторизация через соцсети, оплата через робокассу и т.п. (само собой на своей копии надо будет прописать в конфигах свои данные робокассы и привязать сайт к социалкам).
Основа движка (а так же довольно большая предыстория)
За основу был взят фреймворк MODX Revolution. Только не торопитесь плеваться и закрывать страницу. Это не в точности тот MODX, с которым вам возможно приходилось встречаться. Я с MODX работаю с начала 2009-го года, и знаю его вдоль и поперек. И да, я как и многие сталкивался со многими его минусами (типа шаблонов и чанков в базе данных, тормоза и т.п.). Плюс к этому до знакомства с MODX много работал с различными самописками и другими движками, и на MODX-е я остался именно за его гибкость. Да, мне не все в нем нравится, но он позволяет с легкостью многое в нем изменить, при этом не трогая самого ядра. В процессе у меня появилось несколько компонентов, которые дополняют или меняют определенный функционал MODX-а. Вот парочка наиболее важных из них: phpTemplates — позволяет статические MODX-шаблоны вызывать как обычные php-файлы. modxSmarty — Подключает для фронта шаблонизатор Smarty и дополняет его некоторыми плюшками, обеспечивая тесное взаимодействие с самим MODX-ом. shopModx — модуль для разработки интернет-магазинов.
В итоге MODX обретает не только полноценную шаблонизацию, но и гораздо бОльшую производительность. Сайты с десятками тысяч документов работают с откликом 0,02 — 0,6 секунд. Плюс к этому можно практически полностью забить на синтаксис самого MODX-а, и если вы умеете программировать на php и знаете Smarty — то здесь в разработке у вас никаких проблем не возникнет.
Но одна из самых важных вещей в MODX-е, которая точно меня держит цепями — это система пакетов (модулей для MODX-а). Она реально классная. Я даже написал модуль, который позволяет создавать свои собственные репозитории пакетов. Это особенно полезно различным веб-студиям и активным разработчикам. При этом самая вкусняшка заключается в том, что упаковывать можно не только отдельные модули, но и вообще все что угодно на сайте, хоть целиком, хоть по отдельности, хоть весь сайт вообще. Так появились снапшоты MODX-сайтов. Изначально это было реализовано только на самом modxcloud.com (официальный хостинг от разработчиков MODX-а), но совершенно без документации и каких-либо релизов ими был выложен скрипт vapor, который предназначался для того, чтобы любой мог сделать снимок своего сайта и закинуть его на modxcloud.com. При этом обратная связь как бы и не подразумевалась (то есть брать снимки с modxcloud.com и разворачивать на любом своем хостинге). Не буду вдаваться в подробности, но я взял этот vapor, модифицировал его и добавил ему еще один скрипт (import.php). Теперь с помощью этого скрипта можно как делать снимки сайтов, так и разворачивать их поверх чистого сайта. Скачать мой vapor можно из официального репозитория. И вот как раз с этим вапором я взял курс не только на отдельные модули, но и на готовые сборки сайтов.
В чем смысл таких сборок?
Смысл в том, что когда на проекте используется сразу несколько каких-то отдельных компонентов, которые совместно должны дать какой-то ожидаемый результат, важно не только их наличие, но и тонкая настройка, чтобы обеспечить наилучший эффект + максимальную гибкость. И понятно, что для этого надо не только очень хорошо их знать, но и иметь опыт применения, знать как лучше сделать, какие подводные камни бывают и т.п. А вот если дать разработчику уже готовый сайт, где уже все установлено и настроено, то потолок вхождения и объем работ снижаются в разы.
Вот эта сборка как раз и есть готовый интернет-магазин на базе моих и стандартных модулей, обеспечивая наилучшую производительность, гибкость и управляемость.
Что уже есть в этой сборке?
Добавлен компонент Billing. На этом модуле завязано все, что связано с заказами, оплатой и т.п.
Корзина перестала существовать отдельно. Теперь Корзина — это еще не оформленный Заказ (Order). Теперь даже не оформленные заказы хранятся в базе данных, что как минимум позволяет видеть кого что интересует, а так же определять реальный процент конверсии и выявлять возможные ошибки.
Компонент Basket (Корзина) остался, но почти все, что связано с самими заказами, перенесено в Billing. Basket и дальше останется отдельным модулем, а в Billing-е будет только необходимый минимум логики. Рассчет на то, что сам механизм заказа, оплаты и т.п. можно будет реализовывать в любых сторонних модулях, которые будут взаимодействовать с биллингом.
Добавлен и сверстан новый шаблон по умолчанию с использованием bootstrap. Много всяких аджаксовых плюшек и полноценное JS-API.
Добавлен табличный редактор документов.
Добавлено управление заказами.
Добавлен личный кабинет пользователя, регистрация, смена пароля, восстановление пароля и т.п.
Настроена регистрация через Login, смена/восстановление пароля и т.п.
Добавлен модуль modHybridAuth (авторизация через социальные сети). Пока четко проверены Twitter, Facebook и Google, но должны и другие работать.
Подключен сервис оплаты Robokassa.
Настроены политики безопасности:
Контент-менеджер;
Администратор магазина;
Менеджер магазина;
Продвинутый менеджер магазина.
Что дальше делать с этим сайтом после установки?
Делаете копию шаблона и меняете в нем все, что угодно. Шаблонизация на Smarty, входные данные массивами, все процессоры на классах. То есть не трогая ядра, можно переделать сайт как угодно.
Пример, как добавлять еще платежные системы
Вот у нас есть оплата через робокассу, и стоит задача прикрутить еще какой-нибудь способ оплаты. Посмотрим, как это делается.
Это базовый процессор для любых типов оплаты.
<?php
/*
Абстрактный класс на проведение оплаты.
Его нельзя вызывать напрямую, чтобы исключить случаи инжекта оплаты.
Этот класс должен расширяться другим классом конкретной платежной системы,
чтобы использовать методы проверки платежа самой платежной системы
*/
abstract class modWebPaymentsCreateProcessor extends modObjectCreateProcessor{
public $classKey = 'Payment';
protected $BillingProcessorsPath;
public function checkPermissions() {
// Проверяем подпись платежной системы
$ok = $this->checkSignature();
if($ok !== true){
$this->error($ok);
return false;
}
return parent::checkPermissions();
}
public function initialize(){
$this->BillingProcessorsPath = MODX_CORE_PATH . 'components/billing/processors/';
$this->setDefaultProperties(array(
'currency_id' => $this->modx->getOption('shopmodx.default_currency'),
));
if(!$this->getProperty('paysystem_id')){
return $this->error("Не был получен ID платежной системы");
}
return parent::initialize();
}
public function beforeSet(){
$this->setProperties(array(
"createdby" => $this->modx->user->id ? $this->modx->user->id : null,
"date" => time(),
));
return parent::beforeSet();
}
public function beforeSave(){
if(
!$currency_id = (int)$this->getProperty('currency_id')
OR !$currency = $this->modx->getObject('modResource', $currency_id)
OR ! $currency instanceof ShopmodxResourceCurrency
){
return $this->error("Не был получен объект валюты");
}
if(
!$paysystem_id = (int)$this->getProperty('paysystem_id')
OR !$paysystem = $this->modx->getObject('Paysystem', $paysystem_id)
OR ! $paysystem instanceof Paysystem
){
return $this->error("Не был получен объект платежной системы");
}
// Проверяем, если указан счет платежной системы, то надо убедиться, что
// он еще не числится в биллинге
if($paysys_invoice_id = $this->object->get('paysys_invoice_id')){
if($this->modx->getCount($this->classKey, array(
'paysys_invoice_id' => $paysys_invoice_id,
'paysystem_id' => $paysystem_id,
))){
return $this->error("Данный счет уже создан в системе.");
}
}
$this->object->addOne($currency);
$this->object->addOne($paysystem);
return parent::beforeSave();
}
/*
Обязательно надо прописывать метод, в котором будет выполняться проверка
подписи с сервера платежной системы
*/
abstract protected function checkSignature();
protected function log($msg, $level = null){
if($level === null){
$level = xPDO::LOG_LEVEL_INFO;
}
$this->modx->log($level, "[Basket - ".__CLASS__."] {$msg}");
$this->modx->log($level, print_r($this->getProperties(), true));
return $msg;
}
protected function error($msg){
return $this->log($msg, xPDO::LOG_LEVEL_ERROR);
}
/*
Логируем все ошибки процессора, на всякий случай
*/
public function failure($msg = '',$object = null) {
$this->error($msg);
if(!empty($this->object) && is_object($this->object)){
$this->error(print_r($this->object->toArray(), true));
}
return parent::failure($msg,$object);
}
public function cleanup() {
/*
// Если оплата прошла успешно, то обновляем статус заказа
*/
if($order_id = $this->object->get('order_id')){
$this->modx->runProcessor('mgr/orders/status/pay', array(
'order_id' => $order_id,
), array(
'processors_path' => $this->BillingProcessorsPath,
));
// На всякий случай сбрасываем счетчик ошибок, если вдруг в вызываемом
// процессоре были ошибки
$this->modx->error->reset();
}
return $this->success($this->getSuccessMessage(), $this->object);
}
protected function getSuccessMessage(){
return '';
}
}
return 'modWebPaymentsCreateProcessor';
Он абстрактный, и его нельзя вызвать напрямую, так как у каждой конкретной платежной системы свои механизмы проверки платежа. Но этот класс уже обеспечивает всю необходимую логику, и от расширяющего процессора ждет только одного: подтверждения правильности платежа и установки суммы и прочих данных платежа.
А вот расширяющий процессор конкретно для робокассы:
Как видно, это всего 60 строчек кода. Но в результате не только будет проведена оплата с учетом кто платил, через что, сколько и т.п., но и будет автоматически изменен статус заказа на Оплачен. И вот прикрутить еще какой-нибудь способ оплаты — это всего несколько десятков строк.
Итоги
В итоге, получился на самом деле очень не плохой движок. Сразу скажу, что помимо гибкости, производительность у него тоже весьма не плохая. Как раз недавно наткнулся на топик, в котором народ рассуждал, что даже 40 000 товаров уже напрягает не хило их магазины. Я делал магазины на shopModx с десятками тысяч товаров без всяких особых ухищрений, и все нормально работает. И даже если товаров будут сотни тысяч (я уже делал один на 150 000 товаров), то с небольшими доработками магазин и столько потянет.
И самое главное: эта сборка совершенно бесплатная! Конечно мы всегда открыты для приема донейтов от благодарных разработчиков, но де факто движок полностью бесплатный.
И напоследок видео с кратким обзором движка и двумя способами установки.
pChart — это PHP-библиотека для создания графиков, гистограмм и диаграмм. В отличие от большинства схожих библиотек, pChart бесплатна (распространяется под GPL лицензией). Из бесплатных главный соперник — Google Chart API.
Помимо класса, который рендерит изображения, есть классы для подготовки данных для построения графиков, а так же встроенный механизм кэширования.
Digital Ocean — лоукостер на рынке облачных VPS провайдеров. Пользуется технологией виртуализации KVM. Хорош по соотношению цена/качество и бла-бла-бла, вы сами всё это знаете.
Но есть в нём и несколько минусов, одним из которых является ограничение в поддерживаемых операционных системах. Официальная позиция хостера состоит в том, что место на дисках в дроплетах (образах виртуальных машин) может быть расширено из панели управления без необходимости переустановки системы, поэтому загрузчик туда лучше не ставить. В связи с этим, libvirt не читает загрузчик внутри образа, а использует предустановленное в панели управления ядро с хостовой машины.
Поддержку загрузки пользовательских ядер они обещают сделать со дня на день… уже чуть больше года.
Решил все-таки написать статью про SQLite, в которой хочу обобщить свой 3-х летний опыт использования этой БД под Windows. Вижу, что тема популярная, но информации мало.
Эта статья не для начинающих программистов.
Она не является учебником по SQL.
Она не агитирует использовать SQLite.
Она не агитирует не использовать SQLite.
Статья написана в виде вопросов от гипотетического новичка в SQLite и ответов на них (поскольку информации очень много и так хоть немного проще ее структурировать).