Баг месяца: эстафета от PC-Lint к PVS-Studio

Недавно мы опубликовали 2 статьи про ТОП 10 ошибок в открытых проектах C++ и C# за предыдущий 2016 год. Статьи понравились читателям и это натолкнуло на мысль: почему бы не сделать такой ТОП для каждого месяца? Ведь на нашем сайте огромная база ошибок, которая хорошо структурирована и из которой можно выбрать самые интересные баги, найденные в определенный промежуток времени. В этой заметке будет рассказано о новой рубрике «Баг месяца» и о том, из чего мы исходили, когда готовили список ошибок для нее.

Picture 1


Кто-то может сказать, что у Gimpel Software уже была такая рубрика и мы позаимствовали идею. Это не так. Общее у нас только название и то, что на каждый месяц приходится по какому-то определенному багу.

Начнем с того, что хотя номер диагностики бага месяца Gimpel Software реально существует, код, который представлен под ним, искусственно создан в виде задачки с забавным описанием, например: «Санта и его эльфы автоматизируют свою систему доставки Рождества, но один из эльфов сделал критическую ошибку, которая вызвала то, что в некоторых фрагментах кода действие происходит в непредсказуемом порядке», или: «Шон О’Флаэрти, возможно, был немного подвыпившим, когда писал программу ежегодного празднования Дня Святого Патрика в его пабе. Хотя он ее и не закончил, тут все-же есть небольшая проблема». Тут же предлагается найти этот баг самостоятельно, а ниже можно проверить себя и посмотреть в чем была проблема.

Мы же брали реальные ошибки, которые содержат проверенные нами Open Source проекты за несколько лет. Причем старались выбирать явные баги, которые будут понятны не только самому подготовленному читателю. Например, всеми любимый copy-paste, который встречается почти в каждом проекте, или различного рода опечатки. Помимо куска кода с ошибкой также приведена диагностика, с помощью которой PVS-Studio ее нашел и разъяснение, в чем собственно проблема. Ниже добавлена ссылка на статью о проверке данного проекта, где можно посмотреть, какие еще баги в нем содержались.

Как написано на официальном сайте Gimpel Software, их первый «баг месяца» был найден в марте 1991 года и список продолжал пополняться в течение 21 года. В свое время они были очень популярны и хорошо рекламировали PC-Lint. С 2012 года обновление этого раздела прекратилось, но разработчики надеются, что «баг месяца» может быть воскрешен в будущем.

Ну а пока этого не произошло, мы решили, так сказать, взять эстафету у PC-Lint и создать свой «баг месяца» с блэкдж.. Open Source проектами и найденными ошибками в них.

Picture 3

Итак, было просмотрено большое количество проектов, которые мы проверяли с января 2014 по март 2017 года и выбрано 54 интересных ошибки: 39 для C/C++ языка и 15 для C#, так как поддержка C# началась только с 2016 года. С обновляемой таблицей багов можно ознакомиться по этой ссылке https://hownot2code.com/the-bug-of-the-month/.

Как уже говорилось выше, для составления данного раздела мы произвели анализ нашей существующей базы ошибок и регулярно пополняющегося списка проверенных Open Source проектов. Возможно, эти материалы также будут интересны и полезны читателям, поскольку могут использоваться в виде рекомендаций к тому, как не совершать одни и те же ошибки, смогут помочь в исследованиях, связанных с повышением надежности программного обеспечения и способствовать выработке стандарта кодирования.

Объяснить распространенность большинства подобных ошибок (особенно их присутствие в крупных проектах) можно тем, что на практике не всегда удается быть внимательным и держать под контролем каждую строчку кода, особенно когда их сотни тысяч. Отсюда и появляются ошибки Copy-Paste, неопределенное поведение, разыменовывание нулевого указателя, опечатки и разные другие баги, с которыми поможет справиться статический анализ кода.

Для того, чтобы таких ошибок становилось меньше, а качество кода лучше, предлагаем скачать и воспользоваться PVS-Studio на своем проекте. Возможно вам удастся найти свой интересный баг месяца, о котором вы впоследствии сможете рассказать сообществу разработчиков и уберечь их от подобной ошибки. А пока можно потренироваться и попробовать самостоятельно найти ошибки в известных Open Source проектах — http://q.viva64.com/.

Примечание. В недавно выпущенной версии PVS-Studio 6.14 появилась поддержка Visual Studio 2017, Roslyn 2.0 / C# 7.0 для C# анализатора (см. историю версий).

Итак, добро пожаловать: The bug of the month!

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Ekaterina Milovidova. Bug of the month: taking the baton from PC-Lint to PVS-Studio
ссылка на оригинал статьи https://habrahabr.ru/post/324704/

Запись при чтении в postgresql: скандалы, интриги, расследования

Я уже рассказывал про мониторинг запросов postgresql, в тот момент мне казалось, что я полностью разобрался, как postgresql работает с различными ресурсами сервера.

При постоянной работе со статистикой по запросам постгреса мы начали замечать некоторые аномалии. Я полез разбираться, заодно очередной раз восхитился понятностью исходного кода постгреса:)

Под катом небольшой рассказ о неочевидном поведении postgresql.

SELECTы "пачкают" страницы

То есть SELECT вызывает модификацию каких-то записей, которые постгрес будет записывать на диск.

Начну с краткого пояснения механизма MVCC, используемого постгресом для обеспечения транзакционной целостности.
Все изменения в базе данных происходят в ходе транзакций, у каждой транзакции есть идентификационный номер txid (int32).
Постгрес оперирует данными таблиц в виде так называемых tuple (кортеж). Тупл несет в себе как непосредственно данные конкретной строчки в таблице, так и метаданные связанные с этими данными:

Источник: www.interdb.jp

xmin — номер транзакции, которая создала этот tuple
xmax — номер транзакции, которая пометила этот tuple как удаленный

  • Если мы делаем INSERT в таблицу, он создает новый tuple (xmin=txid)
  • DELETE — помечает туплы, которые подходят под условие как удаленные (xmax=txid)
  • UPDATE делает условно DELETE + INSERT.

Когда мы выполняем SELECT, он помимо непосредственно поиска и выборки данных из таблицы делает еще и проверку видимости (visibility check).
Очень упрощенно, некоторая транзакця с номером txid1 "видит" данный тупл, если выполняется условия:

xmin < txid1 < xmax

Но изменения в кортежах происходят сразу, а транзакция может выполняться еще продолжительное время, поэтому в ходе проверки видимости необходимо удостовериться, завершились ли транзакции с номерами xmin, xmax и если да, то с каким статусом. Информацию о текущем
состоянии каждой транзакции постгрес хранит в CLOG (commit log).

Так как проверять состояние большого количества транзакций в CLOG достаточно дорого по ресурсам, разработчики решили "закэшировать" эту информацию прямо в заголовке тупла. То есть когда какой-то SELECT видит к примеру, что xmin завершилась, он сохраняет это в так называемый hint bits — структуру поверх infomask, в которой записаны состояния транзакций xmin и xmax.

Как происходит изменение туплов при чтении, мы разобрались, осталось вспомнить, что такое "страницы" и почему они бывают "грязными":)

Дело в том, что работать с данными в памяти и на диске практически всегда эффективнее большими блоками. Таким блоком в постгресе является "страница", она содержит в себе какое-то количество туплов и метаинформация о них. Когда мы модифицируем хотя бы один тупл страницы, вся она помечается как "грязная", то есть отличающаяся по состоянию на диске, и должна быть синхронизирована. При этом почти всегда изменения записываются еще и в WAL, чтобы иметь возможность восстановить целостность данных после аварийного завершении процесса БД.

SELECT может вызывать синхронную запись на диск

Как известно, вся работа с данными в pg ведется через buffer cache, если нужных данных там нет, постгрес прочитает их с диска (c использованием OS page cache) и поместит в кэш.
При этом, если в кэше нет места, то из него вытесняется наименее востребованная страница. И наконец, если страница-кандидат на вытеснение оказывается "грязной", она должна быть записана на диск в тот же момент времени.

FrozenTransactionId

В начале статьи я упомянул, что счетчик транзакций в постгресе 32-битный, то есть он сбрасывается через каждые ~2 млрд тразакций.
Чтобы проверка видимости не превращалась в тыкву при сбросе счетчика транзакций, есть специальный процесс — wraparound vacuum.

До версии 9.4 этот процесс заменял xmin у тупла на специальное значение FrozenTransactionId=2. Транзакция с этим номером считалась старше любой другой транзакции. C 9.4 в тупл просто проставляется флаг, что xmin "заморожен", а сам xmin остается неизменным.

Для совсем внимательных: есть специальная константа BootstrapTransactionId=1, которая тоже старше всех других транзакций 🙂

Итого

Большинство случаев "странного" (по обывательскому мнению) поведения посгтреса вызвано оптимизацией производительности.
Пока ковырялся с постгресом нашел замечательную книгу "The Internals of PostgreSQL", рекомендую всем, кто не встречал ранее.

ссылка на оригинал статьи https://habrahabr.ru/post/324494/

Обзор 3D-принтеров FlashForge

Всем привет. Сегодня мы подготовили обзор на две модели 3D-принтеров — FlashForge Dreamer и FlashForge Creator Pro.

  • FlashForge –это китайская компания Zhejiang Flashforge 3D Technology Co., Ltd. Созданная в 2011 году и на сегодняшний день являющаяся одной из крупнейших в Китае. В прошлом году компания произвела 30 тысяч 3D-принтеров и заняла 4-е место по объему продаж 3D-принтеров в мире.
  • FlashForge Dreamer и FlashForge Creator Pro – принтер входящий в 10-ку лучших на сайте энтузиастов 3D-печати 3DHUBS.

На 3DHUBS очень много положительных отзывов как от новичков, так и от продвинутых пользователей. Эти принтеры ценят за очень удачное соотношение цены и качества.



Технические характеристики

Как видно из технических характеристик принтеры почти ничем не отличаются. Разве что Dreamer — более новая и продвинутая модель, с кучей небольших улучшений, которые могут быть полезны пользователю.

Внешний вид.
Во внешнем виде отличий больше. Dreamer по сравнению с Creator Pro стал более компактным.

Катушки с пластиком убираются внутрь принтера, а не вешаются снаружи. С одной стороны — это позволяет дополнительно просушивать пластик внутри камеры принтера, с другой катушку от 1кг и больше будет впихнуть проблематично. А если «заводить» пластик снаружи придется снимать крышку.

В FlashForge Creator Pro такой проблемы нет. Можно повесить катушки на корпус или распечатать держатель катушки. В крышке предусмотренно пространство для подачи пластика вне камеры.

Механика.

Кинематика принтеров аналогична и сделана по наиболее популярной схеме. Здесь ничего нового.
Головка движется по осям X и Y, платформа по оси Z.

Печатающая голова как небольшой бегемот – тяжелая, но всеядная. Принтер без проблем печатает не только ABS и PLA, но и более капризными, мягкими видами пластика.

Или допустим Woodforce от Fiber Force.

Кстати пластик оказался очень интересным. Сопло не забивает и пахнет деревом. Очень легко шкурится.

Самое интересное это обдув Dreamer. С виду кожух обдува стоит только на левом сопле. И никаких больше отличий от того же Flash Forge Greater Pro нет.

Основное отличие стало заметно при первой печати. Сзади у принтера расположены 2 достаточно больших вентилятора. Они выдувают воздух из камеры.

С боков находятся решетки вентиляции, через которые внутрь принтера засасывается воздух.

Получается, внутри камеры при печати постоянно циркулирует воздух. На удивление это оказалось отличным решением для печати PLA. Обдув происходит со всех сторон печатающейся детали. Даже небольшие детали получаются отлично, без «подтеков».

Creator Pro такой стабильностью похвастаться не может. В жаркую погоду небольшим изделиям из PLA может не хватать обдува.

До кучи FlashForge Dreamer оснастили удобным сенсорным дисплеем и Wi-FI.

Слайсер.

В качестве слайсера предлагается использовать FlashPrint. Достаточно удобная программа с приятным интерфейсом, к тому же частично русифицированная. Это может стать большим плюсом для начинающих печатников.

В программе есть несколько достаточно полезных функций. Например возможность разрезать модель.

Плоскость разреза можно задать мышкой или по одной из осей.

Возможность расставить поддержки вручную – это то чего так часто не хватало мне в Cura. Поддержки есть 2 видов.

Трубки (они стоят по умолчанию)

И столбики.

НО самая интересная на мой взгляд функция — это, возможность преобразования рисунков в объемные барельефы.

В программе есть быстрые настройки печати. (низкое – 0,30мм стандарт – 0,18мм и высокое – 0,14мм. При выборе PLA пластика появляется наилучшее качество печати это слой 0,08мм.). Это будет удобно новичкам во время первых шагов.

Есть и расширенные настройки для более точной настройки параметров печати. Что бы включить расширенные настройки нужно открыть вкладку файл — настройки и переключится с Basic Mode на Expert Mode.

Настройки ретракта, скорости печати поддержки, ширины стенки для чистки сопла при печати двумя видами пластика и многое другое.

Печатные тесты

Ну и конечно обзор не был бы полным без печатных тестов.

FlashForge Creator Pro

ABS от ESUN, слой 0,15.



PLA от ESUN, слой 0,15.



И самое интересное — печать с поддержками.

ABS+HIPS

PLA+PVA

FlashForge Dreamer

ABS+HIPS от ESUN, слой 0,15.

PLA+PVA

CARBON FIBER фирмы NYLFORCE, толщина слоя 0,15

PLA, цвет Bronze, фирма Esun, толщина слоя 0,14

Пластик Woodforce фирмы Fiber Force и синий PLA фирмы ESUN, толщина слоя 0,18

Постапокалиптическая уточка из мягкого Cheetah фирмы Ninjatek, толщина слоя 0,18, заполнение 0%

Слой 0,18, принтер Flashforge Dreamer. Пластик eCopper и eAlfill фирмы Esun.

Итоги

Оба принтера на удивление выдают очень достойный результат печати «из коробки» без всяких «допиливаний» и шаманских настроек.

FLASHFORGE Creator Pro по качеству печати не отстает от своего старшего брата FlashForge Dreamer. Максимум к чему можно придраться это недостаточный обдув небольших моделей из PLA у Creator Pro.

Визуально же FlashForge Dreamer на мой взгляд более «домашний» принтер. Аккуратный, компактный. Плюс возможность подключения по WI-FI что бы не тянуть лишних проводов. Но тут уже каждый решит сам стоит ли переплачивать за эстетику и комфорт или нет.

По традиции минутка рекламы)
Покупая оборудование в нашей компании, вы получаете 10 преимуществ:

1. Возможность воспользоваться программой Trade In.
2. Гарантия — 12 месяцев
3. Инструкция на русском языке
4. Техническая поддержка в течении всего срока эксплуатации
5. Вы покупаете 3D-принтер у официального дистрибьютора в России
6. Бесплатная доставка.
7. Бесплатное обучение в нашем офисе.
8. Возможность купить принтер в кредит через банки ТКС, ОТП, Ренессанс.
9. 10% скидка на пластик навсегда.
10. Возможность ознакомиться с принтером в нашем демо-зале.

Обзор подготовлен специалистом по 3D-печати компании Цветной Мир, Панфиловой Анной.

Подписывайтесь на наши группы в Facebook и VK, чтобы быть в курсе последних событий.

www.facebook.com/groups/cvetmir3d
vk.com/cvetmir3d
www.youtube.com/channel/UCnfeyFh3TKIVpMCMi1zd0fA
ссылка на оригинал статьи https://geektimes.ru/post/287232/

Делаем более-менее универсальный калькулятор услуг для сайта

Беглый анализ открытых данных показывает, что ежедневно в среднем 5 человек оставляют заявки на создание калькулятора на биржах фриланса — а еще несколько сотен интересуются вопросом в поиске. Часто запросы стандартны — и, конечно, на рынке сложился целый набор готовых предложений: от плагинов для конкретных CMS до калькуляторов, которые можно приобрести у студий. Рекорд, обнаруженный нами (см. в первом комментарии) — 24 999 рублей за довольно обычное решение.

Да, рынок есть рынок. Но поскольку мы в основном работаем с людьми, чьи сайты сделаны на конструкторах, у них нет 25 тысяч на один виджет, возникло желание написать калькулятор, которым они смогли бы пользоваться самостоятельно — и без изучения HTML, JS, JQuery и CSS.

В процессе работы над проектом нам удалось реализовать несколько находок в логике работы и дизайне калькулятора. Ими, а также полезными инструментами, и хотим поделиться с сообществом.


По сути, у нас получился довольно универсальный онлайн-конструктор калькуляторов, результат работы в котором можно встроить на любую платформу, поддерживающую вставку HTML.

Как устроен конструктор калькуляторов

Пишем свою адаптивность

Лайфхак: как упростить формулы до азбуки

Чистим код с GULP (а не тем, о чем вы могли подумать)

Есть ли жизнь после жизни?


Как устроен конструктор калькуляторов

Начиная проект, мы обсуждали довольно хардкорные идеи, но в итоге пришли к drag-n-drop интерфейсу сборки, плюс админке, в которой человек может хранить и настраивать свои калькуляторы.

В начале было пустое поле. Регистрируясь на сервисе впервые, человек действительно видит пустую страницу с единственной кнопкой добавления нового проекта-калькулятора.

В будущем на этой странице будут появляться снимки-ссылки на калькуляторы пользователя, вот как тут:

Для создания скриншота-превью калькулятора в кабинете мы использовали PhantomJS. Штука очень удобная, когда ты уже создал несколько калькуляторов, — при входе в кабинет сразу понятно, где какой из проектов.

Люди любят ползунок. Это стало понятно, когда мы запустили первых людей на сервис, и они стали выбирать, из каких элементов создать виджет.

Сам интерфейс создания калькулятора устроен похоже с ЛК — есть большое пустое поле, на которое можно добавлять элементы из боковой панели. Для старта мы выбрали 8 элементов. Пять отвечают непосредственно за калькулятор — это ползунок, выпадающий список, галочка, текстовое поле (для сбора почт, адресов и т.д.) и переключатель. Еще три — за привлекательность (картинка) и опцию заказа — текстовый блок и кнопка. Самым востребованным элементом из всех оказался ползунок.


Сначала для создания ползунка мы выбрали расширения jQuery Scrollbar, но штука странно себя вела на мобильных. Поэтому мы взяли и модифицировали расширение JQuery-Range-Slider. Остальные элементы написали и стилизовали сами

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

Этот момент стал одним из самых хлопотных при отладке. Но зато сейчас запись процессов, происходящих на странице, когда человек перетаскивает элемент в калькулятор (это самый ресурсозатратный момент), выглядит так:

Мы максимально порезали обработчики, оставив только необходимый минимум. С оптимизацией на клиентской части нам здорово помог инструмент Timeline из Google Chrome Developer Tools.

Исходно все элементы хранятся в объекте FIELDS — у каждого есть типовой HTML-шаблон и список опций. После перетаскивания элемента в рабочую область, нужные опции прилетают с сервера и подставляются в шаблон — например, на кнопку навешены отправка информации о заказе владельцу и клиенту: по почте через наш сервер, либо по смс — пока через API SmsSimple, но мы ищем другой сервис (и будем рады рекомендациям).

Чтобы подставлять опции, к прототипу строки мы написали свой метод Signe. Работает он так:

При этом мы стараемся защититься от вставки исполняемых кодов в шаблон: прежде всего на стороне сервера удаляются теги <скрипт>, а основная защита построена на экранировании спецсимволов + эскейп тегов.

Drag’n’drop по-своему. Идея «бери больше — кидай дальше», на наш взгляд, это самый удобный способ сборки чего бы то ни было для обычного пользователя. Ну хотя бы потому, что красиво.

Когда мы рассматривали существующие решения для создания калькуляторов, в них смущала некая «прибитость элементов гвоздями» — факт, что элементы можно расположить довольно строго определенным образом: например, только друг под другом, а не рядом. Хотелось уйти от этого, для чего мы придумали систему точек.


Cетка невидимых пользователю точек

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

Что это дает? Пользователь сразу может выбрать между таким:

И вот таким вариантом расположения элемента:

При движении мы постоянно проверяем, находится ли мышь над калькулятором, а под капотом запоминаем тип перетаскиваемого поля и позицию, в которую нужно его бросить.

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


Для создания самих визуальных эффектов при сборке калькулятора мы использовали jQuery UI и Animate.css

Абстрагируемся от системы мер и весов. Поскольку решение хотелось сделать универсальным и простым, мы отказались от дополнительных полей, в которых при создании калькулятора человек бы выбирал метры, граммы или рубли. Условные обозначения можно вписать — но чисто для удобства и ориентира. Для всех текстовых элементов мы использовали движок Medium Editor – очень удобный и простой текстовый редактор.

Чтобы доказать, что конструктор подходит для чего угодно, мы наделали разных примеров. А один из примеров наделал шума среди первых тестеров:

«Шаблон «расчет количества мяса» — просто убил: по картинке понятно, что шашлык, а по градациям — такое впечатление, будто из всех этих людей собрались шашлык делать) Ржали всем отделом».


Пощупать калькулятор-шаблон, который развеселил целый отдел, можно здесь

Картинки — это важно. Для лучшего знакомства с товаром или услугой логично добавить изображения над теми же галочками или иным полем, отвечающем за выбор. Благодаря сетке точек, получилось реализовать вставку картинки в любую область рабочего поля. Иногда это полезно:


За тему с ёлочками спасибо Владимиру Гынгазову, автору канала “Adobe Muse по-русски”

Сама реализация загрузки картинок сделана через FileSystem API&File API — весь процесс отлично описан в этой статье.

«А поиграться с…?» Логично дать пользователю возможность подстроить цвета текстов, кнопок, фона и т.д. под цвета сайта. Для вызова и создания цветовой палитры мы использовали виджет Spectrum.

Хранение данных и автосохранение. Данные о клиентской части калькулятора хранятся в формате JSON. Вы можете увидеть их структуру, просто написав в консоли SAVER.json на сервисе.

Автосохранение происходит при каждом действии, если в калькуляторе есть активность. Изменения параллельно сохраняются и в DOM, причем каждый раз мы проверяем:

  • Есть ли в JSON все данные из DOM.
  • Есть ли в DOM все данные из JSON.

Если же в пределах 4 секунд ничего не происходит, калькулятор останавливает автосохранение до новых правок — так мы избавляемся от бессмысленных запросов к серверу.

Превью. Чтобы не затрачивать ресурсы браузера клиента, мы решили не анимировать интерфейс предпросмотра с помощью jQuery — поскольку с анимацией отлично справляется и CSS3: достаточно поменять класс в корне интерфейса, и у области просмотра изменится ширина и наружное оформление, стилизованное под смартфон и планшет.


Внимание на консоль

Само создание адаптивной версии калькулятора стало отдельной песней.


Div-ная верстка: пишем свою адаптивность

В конструкторе сайтов uKit, для которого исходно создавался наш проект, используется сетка Twitter Bootstrap — популярное и заслуженное решение, чтобы адаптировать веб-элементы под экран посетителя. Но бутстреп предполагает два варианта дизайна: таблицу или колонку. Поэтому мы разработали собственный вариант адаптации калькулятора.

Т.к. структура калькулятора хранится в JSON, у нас есть родительский массив со строками, а в каждой строке — массив ячеек. Помимо этого, в ячейке есть массив суб-строк (и суб-ячеек), чтобы внутри было не одно поле, а несколько. Структура ячеек показана ниже:

У калькулятора есть родительский блок со стилем display: table, внутри у него есть table-row и table-cell, соответственно. Сам калькулятор отрисовывается на сайте во фрейме. Внутри фрейма размещены стили для адаптации — и когда фрейм становится достаточно узким, калькулятор без изменения HTML-сетки перебрасывает поля на новые строки. Сделано это с помощью изменения стиля display: если на широком калькуляторе это table-cell, то на узком становится block, и наше поле оказывается на новой строке.

Исходно-десктопный вид калькулятора зависит от ширины контейнера, в котором он находится, а калькулятор стремится показать в одной строке как можно больше полей. При сужении экрана функция, которая перестраивает сетку, проходит по всем строкам калькулятора, и если в строке есть «лишние» ячейки, ниже создается новая строка.

  • Если сам сайт с калькулятором адаптирован под мобильные устройства, контейнер с калькулятором будет занимать всю ширину устройства без масштабирования.
  • Если же сайт не адаптирован под мобильные устройства, калькулятор будет отображаться в меньшем масштабе — а его вид повторять вид для ПК.

Аналогично и в редакторе: когда пользователь меняет ширину своего проекта, перед ним отображается фрейм с копией его калькулятора. Как только ресайз завершен, под фреймом рисуется новая сетка, фрейм незаметно для пользователя скрывается — и можно продолжать работу с полями и формулами.


Упрощаем работу с формулами

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

Вместо этого всего в отдельной вкладке есть элементы калькулятора в виде схемы. Схема содержит названия переменных и диапазоны значений для каждого из элементов калькулятора.


Чтобы задействовать какое-то поле в расчете, достаточно указать его переменную в окошке слева. Формул может быть несколько: в этом случае в калькуляторе отображается несколько результатов, например “Обычная цена” и “Цена со скидкой”.

Переменные начинаются с буквы “A”. Если полей больше, чем букв в латинском алфавите, к имени переменной добавится еще одна буква: “AA” и так далее. Каждая буква связана с числовым id конкретного поля в калькуляторе. Найти готовое решение для преобразования числа в латинские буквы и комбинации букв нам не удалось. Поэтому мы написали следующий метод:

DAT.varName(9) // I
DAT.varName(39) // AM
DAT.varName(9650215) // UCALC

Будем рады, если он вам пригодится (с вопросами можно стучаться к condor-bird).


Оптимизируем скорость загрузки

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

То есть, пора было отрезать ломоть калькулятор от сервиса. Встал выбор между двумя путями:

Быстрым. В том же превью грузится виджет калькулятора — можно скрыть все элементы интерфейса конструктора, оставив поля, сетку и калькулирование — и вот он, по сути, виджет для стороннего сайта.

Но быстрый путь был отвергнут — потому что он замедлял загрузку: мы получили бы 1959 килобайт, 269 из которых заняли бы все CSS-ки, используемые в сервисе. А ведь одно из главных требований к виджету на сайте — чтобы он грузился быстро.

И правильным. Тут мы пошли к GULP — чтобы обрезать все лишнее, вроде переноса строк, и собрать один минифицированный файл. В общем, сделать код максимально чистым. Заметьте, что пошли не к более модному сейчас RequireJS.

И на то есть важная причина — у нас был 41 файл (и, соответственно, 41 запрос к серверу), а мы хотели уместить все в один запрос. С GULP мы получили то, что хотели.


Это наш дефолтный шаблон. Была скорость загрузки курильщика


Стала скорость загрузки здорового человека

Теперь мы оставляем от 140 до 180 килобайт — в зависимости от числа полей. Для каждого типа поля есть две версии: короткая и вдвое короче — для стороннего сайта.

А что насчет скорости исполнения скрипта, спросите вы?


Это огромный калькулятор расходов на свадьбу, созданный реальным пользователем. Было так.


Тот же проект. Стало так

Как видно на картинке ниже, самым тяжеловесным остается текстовое поле — его мы будем оптимизировать дальше, отдавая на сайт только опцию, которую выбрал пользователь (в настройках поля есть выбор между телефоном, почтой, текстом, числовым значением и т.д.). В остальном для каждого калькулятора мы подключаем только используемые модули.

После загрузки на стороннем сайте калькулятор больше не обращается к нашему серверу: все формулы и прочее необходимое зашиты в загруженный на сайте код.


Упрощаем автообновление калькулятора, встроенного на сайт

В идеальном случае пользователь собрал калькулятор, получил код для встраивания на сайт — и наступило счастье.

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

Поэтому для каждого встроенного калькулятора мы делаем две версии:

  1. Опубликованную — ту, что непосредственно встроена на сайт.
  2. Редактируемую — ту, которую можно открыть и начать править в личном кабинете.

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

Первые выводы

Состоят в том, что при создании онлайн-калькулятора и его админки, — задаче, имеющее массу готовых решений, — много места для новинок. Кому-то в новинку все, как brizing — uCalc стал первым боевым проектом, в котором ему доверили работу джуниора. Но и остальные открыли для себя много нового.

Открытий явно станет больше — и вы можете подкинуть нам еще идей и задачек: проект находится на стадии открытого тестирования, и мы будем благодарны всем, кто найдет время пощупать решение и отписать мысли и ощущения в комментариях, либо в личку мне, brizing и condor-bird.
ссылка на оригинал статьи https://habrahabr.ru/post/324620/

Записки майнтейнера: resurrection

В 2010 я стал майнтейнером в ALT Linux: прошёл все этапы процедуры принятия в Team: получил статус кандидата, провёл пробную сборку пакета под руководством ментора damir@ (Дамир Шайхутдиров), получил свой ник (lamp@), почту, сгенерил и зарегистрировал gpg ключи для подписи пакетов и ssh ключи для доступа к git.alt.

Как так получилось? Всё началось с моего первого знакомства с Debian Linux в 2005 году. Потом были эксперименты с Ubuntu, развесёлые линуксовки местного LUG и наполеоновские планы продвижения Linux в масштабах страны и отдельно взятом Ростове-на-Дону. Тем временем в 2007 компания ALT Linux выиграла всероссийский открытый конкурс на разработку и поставку пакета свободного ПО для школ. Вышел дистрибутив ALT Linux школьный. Начались пилотные внедрения СПО в школах трех российских регионов. И Ростовский LUG решил принять активное участие во всём этом. Мы стали сотрудничать с ALT Linux, посещать школы как официальные представители и помогать внедрять школьный дистрибутив. Даже организовали обучающий семинар для учителей. Подробнее об этом можно прочесть в нашем блоге. Разумеется всё это делалось безвозмездно и в свободное от работы время (обычно по субботам).

Я также думал о том, что можно предложить школьникам как инструмент для начального изучения программирования. И обнаружил в ALT Linux пакет basic256. Списался с автором-разработчиком Джеймсом Рено (James Reneau) и стал на какое-то время соразработчиком (перевод интерфейса, справки, мелкие улучшения в коде). Само собой — стал майнтейнером. Почти год (с апреля 2010 по январь 2011) старательно сопровождал basic256 и выпустил 7 сборок. Также принял участие в переводе книги Джеймса «Хотите научиться программировать?».

К сожалению, после бурного 2010го школьный проект в Ростове-на-Дону (и не только) фактически сошел на нет. На первый план вышли более актуальные задачи и я забросил свои обязанности майнтейнера. Однако, последние пару лет подумывал вернуться. И наконец размышления трансформировались в конкретные шаги. Связался с ребятами из ALT, получил добро, заручился поддержкой ментора glebfm@ (Глеб Фотенгауэр-Малиновский) и приступил к делу.

1. Моё новое старое железо

К сожалению, старичок ноутбук eMachines M6810, специально купленный для работы c ALT Linux в марте 2010 за 6 тыс. руб, давно отдал концы. Благо в моём хозяйстве обнаружился ноут Samsung P28 (Celeron 1.5Ghz) c 512Mb RAM, без жесткого диска и БП, доставшийся по случаю совершенно бесплатно. Докупил к нему БП и переставил 60Gb хард c почившего eMachines. Установил Simply Linux 7.0.5 — и рабочая лошадка была готова. Да, ещё приобрёл с хорошей скидкой (150 руб) USB WiFi TP-LINK TL-WN723N, поскольку в моём Samsung модуля WiFi не оказалось.

2. Переход к 8й ветке

Первое, что посоветовал ментор — обновиться до ветки p8. Что я и проделал, с некоторыми приключениями, которые вряд ли стоят особого внимания. Посетил страницу https://www.altlinux.org/Update и выполнил серию команд:

$ sudo apt-repo rm all
$ sudo apt-repo add p8
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo update-kernel

Перезагрузился и — вуаля, у меня свеженькая версия:

$ cat /etc/altlinux-release
Simply Linux 7.95.0 (Dory)

В качестве бонуса — заработал USB WiFi TP-LINK. Вообще, к слову, Simply Linux производит очень приятное впечатление. Система хорошо сбалансирована, приемлемо откликается даже на моём слабом железе. Xfce настроен Window-like (лично мне всё равно, но для только пришедшего с Windows удобно). Цветовая гамма приятна для глаз. Плюс прикольная картинка на рабочем столе.

3. Восстановление доступа

Ключевой вопрос — что с моими ключами? Понятно, они были на eMachines, но тот хард был переформатирован. Однако ещё тогда, по совету своего первого ментора я сохранил две папки (.gnupg и .ssh) на другом ноутбуке.

Начнём с gpg ключей. Это два файла (pubring.gpg и secring.gpg) из моей старой папки .gnupg. Эти ключи нужны для подписи srpm и тегов в git. Копирую их из запароленного архива в домашнюю папку и выполняю команду:

$ gpg —with-fingerprint secring.gpg

а затем показываю результат ментору (через telegram). Он сравнивает fingerprint моего ключа с тем, который есть в keyring-е ключей членов Team. Отпечаток совпадает. Да, ключи те самые.

Импортирую:

$ gpg —import pubring.gpg
$ gpg —import secring.gpg
$ rm *.gpg

Самое время вспомнить пароль. Создаю пустой файл и пытаюсь его подписать:

$ touch test_file
$ gpg -ab test_file

в ответ gpg запрашивает у меня фразу-пароль. Вот это уже серьёзная проблема. Какой пароль я мог использовать в далёком 2010? Делаю несколько попыток, результат один: Неверная фраза-пароль; попробуйте ещё раз… «Забыть пароль — всё равно что утратить ключи», — тем временем пишет ментор. И тут меня словно осеняет! Пробую свою догадку — срабатывает. Файл подписан и я вспомнил свой пароль!

Пришло время для ssh ключей (из моей старой папки .ssh). Они нужны для подключения с серверам сборки (gyle.altlinux.org) и синхронизации git-репозитария (gitery.altlinux.org). Снова обращаюсь к своему запароленному архиву, извлекая оттуда два файла (id_dsa и id_dsa.pub). И затем:

$ ssh-add id_dsa
$ cp id_dsa .ssh
$ cp id_dsa.pub .ssh
$ rm id_dsa*

кроме того создаю в .ssh файл (vim ~/.ssh/config) cледующего содержания:

Host git.alt     HostName gitery.altlinux.org     Port 222     User git_lamp  Host gyle.alt     HostName gyle.altlinux.org     Port 222     User git_lamp

После нескольких безуспешных попыток доступа добавляю в ~/.ssh/config первой строкой:

PubkeyAcceptedKeyTypes +ssh-dss

Это приходится делать потому что современные openssh-clients считают (справедливо) DSA плохим алгоритмом, его использование нужно разрешать явно. А мои ключи именно DSA (в ближайшее время их надо обновить на RSA по совету ментора). Проверяю доступ командой:

$ ssh git.alt help
Enter passphrase for key ‘/home/lamp/.ssh/id_dsa’:

Ввожу пароль и получаю список доступных команд. Доступ восстановлен, я снова в ALT Linux Team. Следующий шаг — собрать пакет. Но это будет уже новая история…
ссылка на оригинал статьи https://habrahabr.ru/post/324692/