Developer Tales or everything about everything

28Дек/150

Роль senior-разработчика

Gesch‰ftsmann mit Visitenkarte

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

Хотя IT-индустрия является сравнительно молодой, уже существует дефицит талантов. Большинство проектов по разработке программного обеспечения терпят неудачу. Некоторые из них выходят за рамки выделенного бюджета. Наиболее распространенное мнение об этой проблеме у лидеров: "Есть стандартные пути, используя которые мы решаем проблемы, но наши решения часто не работают, поэтому выход один - сделать все возможное и посмотреть, сработает ли это".

Реальность, в которой мы живем допускает, что Senior Developer - это специалист, который имеет опыт разработки более 3-х лет. Таких людей ставят на позиции тим-лидов, и часто все идет не так, как ожидалось - достаточно плохо.

Это мой взгляд на понятия, которые мы используем в IT-индустрии. Действительно, оценка людей по трем критериям - это непозволительное упрощение всех нюансов, знаний и опыта, который необходим в данной сфере. Но как есть, так есть. Если мы будет классифицировать людей подобным образом, тогда из индустрии необходимо убрать время как параметр. Специалист с десятилетним опытом и человек, получивший опыт десяток раз за год - совершенно разные люди.

Просмотров: 794
Связано с категорией: Development Читать полностью
9Сен/140

Списки Selectize.JS и jQuery Validation

Selectize.JS - очень полезная вещь, когда хочется организовать красивые ниспадающие списки с возможностями автозаполнения, поиска и удаленной загрузки данных. jQuery.Validation - как очевидно из названия, плагин jQuery для проверки форм.

Проблема этих двух библиотек заключается в том, что одна по умолчанию игнорирует скрытые поля при проверке, а другая - намеренно эти поля скрывает. Эдакое противостояние двух сил :)

Чтобы подружить библиотеки, достаточно добавить три строчки кода:

Этот код необходимо разместить непосредственно после загрузки библиотеки jQuery Validation.

Селектор ignore сохраняет настройки по умолчанию с тем исключением, что в список для проверки включаются поля, генерируемые библиотекой Selectize.

Более подробно о селекторе:

  • :hidden:not([class~=selectized]) - игнорируем все скрытые поля, кроме полей с классом .selectized;
  • :hidden > .selectized - восстанавливаем поведение стандартного селектора - поля проверяются только если родительские DOM-элементы не являются скрытыми;
  • .selectize-control .selectize-input input - дополнительный селектор для исключения проверок динамически создаваемых полей библиотекой Selectize.

Просмотров: 1505
25Апр/141

Новое в Java 8

java8

18 марта 2014 года вышел первый стабильный релиз Java 8. Восьмая версия этого замечательного языка привнесла много новшеств. Плох тот разработчик, который не движется в ногу со временем :)

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

Просмотров: 7765
22Фев/140

ps_files_cleanup_dir: permission denied

В некоторых случаях, при определенной конфигурации сервера и интерпретатора PHP, в логах работы можно встретить записи, подобные этой:

session_start(): ps_files_cleanup_dir: opendir(/var/lib/php/session) failed: Permission denied (13)

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

Эта проблема встречалась в ОС Debian Linux, но знающие люди говорят, что такое возможно и в Ubuntu.

Способов решения этой проблемы несколько (упорядочено от наилучшего решения до наихудшего):

  1. Изменить владельца директории на пользователя, под которым запускается PHP. Сделать это можно с помощью команды chown. Естественно, Вы должны точно знать, что директория, в которой хранятя сессии, используется только для этой цели;
  2. Установить в файле конфигурации PHP session.gc_probability = 0. Эта конфигурация полностью отключит функцию удаления старых сессий. Т.к. в ОС Linux временные директории чистятся с помощью планировщика задач cron, то отключив GC, мы ничего не потеряем;
  3. Изменить директорию хранения сессий PHP на директорию, к которой можно обеспечить безопасный полный доступ для PHP. Для этого нужно изменить значение конфигурации session.save_path в php.ini;
  4. Назначить права 0777 на директорию с сессиями с помощью команды chmod. Этого лучше не делать, т.к. общий доступ к сессиям - потенциальная брешь в безопасности.

Просмотров: 1348
16Янв/141

Перемещение окна без заголовка с помощью мыши

Что делать, если хочется сделать красивое окно с помощью всех возможностей стилизации Qt и нужно убрать стандартный каркас окна операционной системы?

С кнопками "Свернуть", "Развернуть во весь экран", "Закрыть" все ясно - просто добавляет кнопки с такой же функциональностью в QToolBar или в любое другое место в окне.

Но остается еще одна задача - научить мышь перемещать окно, ведь окно, которое нельзя сдвинуть - это просто ужас для любого пользователя.

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

Поэтому, помимо mousePressEvent(MouseEvent*) и mouseMoveEvent(MouseEvent*), нужно добавить еще один обработчик событий: mouseReleaseEvet(QMouseEvent*).

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


Обнуление значений mpos в событии mouseReleaseEvent обеспечивает вменяемое поведение окна при нажатии на кнопки.
Просмотров: 3058
27Июн/130

DOSHERE или запуск командной строки в папке

Для более ранних версий Windows (например, Windows XP) выпускалась специальная программа DOSHERE, которая встраивала запуск командной строки из контекстного меню проводника.

Для Windows7 такой утилиты не предоставляется. Почему? Да потому что эта возможность встроена в ОС. Достаточно зажать Shift и кликнуть правой кнопкой на нужной директории. При таком действии в контекстном меню появляются дополнительные пункты, среди которых есть и такой:

 

 

 

 

Именно этим пунктом меню можно запустить командную строку в текущей директории. Profit! :)

Просмотров: 1679
31Янв/131

Планировщик задач crontab в Linux

Если у Вас есть высоконагруженный сайт, на котором выполняются ресурсоемкие операции, то, возможно, Вы захотите запускать такие задачи в фоновом режиме (например, генерация миниатюр изображений или обработка больших массивов данных). Запуск таких операций при обращении пользователя к странице сайта - не самая лучшая идея, т.к. это очень сильно затормозит генерацию страницы. Решение проблемы для операционных систем Linux - cron. Cron позволяет автоматически запускать определенные задачи в фоновом режиме через определенные промежутки времени. Cron может быть использован для самых различных целей: бэкап файлов и файловой системы, синхронизация файлов, установка обновлений. Планировщик является самым лучшим инструментом для запуска ресурсоемких задач.

Просмотров: 5419
17Дек/120

SuppressWarnings

Многие начинающие Java-разработчики рано или поздно встречаются с аннотациями и с далеко небезызвестной аннотацией @SuppressWarnings. Полезность этой аннотации в том, что она общепринята к использованию во всех IDE (Integrated Development Environment, такие как Eclipse, NetBeans или IntelliJ IDEA) и позволяет скрывать предупреждения компиляторов.

Предупреждения IDE

Интегрированные среды разработки довольно часто отображают не только ошибки, но и предупреждения, такие как: неявное преобразование типов, неиспользуемый код, неоптимизированный доступ, deprecated-объект и др.

Когда Вы точно уверены, что участок кода безопасен для выполнения, но среда разработки все равно показывает предупреждения, следует использовать аннотацию @SuppressWarnings.

Например, встретив такой код:

, большинство сред разработки в этом месте будут ругаться и отображать предупреждение "Unchecked Assignment", то есть - "Непроверенное/неявное присваивание".

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

Однако, часто бывает и так, что это предупреждение совсем не нужно - разработчик уверен в своих действиях и написанном коде. Тут на помощь приходит @SuppressWarnings. Если перепишем код из предыдущего примера так:

, то заметим, что предупреждение исчезнет. Здесь "unchecked" означает класс предупреждений, который необходимо отключить - "unchecked" как раз относится к неявному присвоению. Если заменить unchecked на другой класс, то предупреждение снова появится - нельзя заменить один класс другим (за исключением, может быть, класса "all", который работает не всегда).

Данную аннотацию можно применять на:

  1. Классы, интерфейсы, перечисления и аннотации;
  2. Поля классов;
  3. Методы классов;
  4. Параметры;
  5. Конструкторы;
  6. Локальные переменные.

В нашем примере под эффект аннотации попадает локальная переменная.

Следующий код даст абсолютно идентичный эффект, но, в добавок, скроет предупреждение о том, что метод method() не используется:

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

Классы предупреждений

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

В следующем списке указаны самые распространенные классы ошибок:

  1. all - игнорировать все предупреждения;
  2. boxing - игнорировать предупреждения, связанные с боксингом (оборачиванием примитивных типов (int, double, short и т.п.) в объектные типы (Integer, Double, Short и т.п.);
  3. cast - игнорировать предупреждения приведения типов;
  4. dep-ann - игнорировать предупреждения, связанные с использованием deprecated-аннотаций (аннотации подготовленные к удалению из библиотеки);
  5. deprecation - игнорировать использование deprecated-элементов (методы и поля подготовленные к удалению из библиотеки);
  6. fallthrough - игнорировать пропущенные операторы break в switch-блоках;
  7. finally - игнорировать finally-блоки, которые не используют return;
  8. hiding - игнорировать предупреждения о том, что локальная переменная скрывает другую переменную;
  9. incomplete-switch - игнорировать предупреждения о незавершенных switch-блоках (например, когда в таком блоке использованы не все элементы перечисления);
  10. nls - игнорировать предупреждения при обнаружении непереводимых символов (NLS String Literals);
  11. null - игнорировать предупреждения анализа NPE (Null Pointer Exception);
  12. rawtypes - игнорировать предупреждения, относящиеся к использованию нестандартных типов в шаблонах;
  13. restriction - игнорировать использования запрещенных объектов;
  14. serial - игнорировать отсутствие serialVersionUID для сериализуемых классов;
  15. static-access - игнорировать некорректный доступ к статическим переменным;
  16. synthetic-access -игнорировать неоптимизированный доступ к внутренним классам;
  17. unchecked - игнорировать неподтвержденные операции (неявные преобразования и т.п.);
  18. unqualified-field-access игнорировать неправомочный доступ к полям;
  19. unused - игнорировать предупреждения о коде, который не используется.

Просмотров: 4700
14Дек/126

Анализ производительности std::vector, std::list & std::deque

std_container_performance

В этой статье рассматривается тестирование производительности стандартных STL-контейнеров C++: std::vector, std::list и std::deque. Тестирование скорости работы контейнеров проводится для операций вставки, поиска и удаления.

Эта статья является переводом, оригинальная статья находится здесь.

В основном std::list следует использовать, если ожидается выполнение операций случайных вставок и удалений элементов из контейнера (сложность O(1) против O(n) для вектора (vector) или двусвязной очереди (deque)). Если рассматривать только сложность выполнения, то линейный поиск в обоих контейнерах эквивалентен - его сложность составляет O(n). Когда осуществляется вставка или удаление элементов в векторе или двусвязной очереди, все данные, следующие за позицией, над которой проводится операция, должны быть перемещены в памяти, фактически это означает, что каждый элемент должен быть скопирован. Именно по этой причине при определении производительности очень важен размер данных, короые будут помещены или уже находятся в контейнере.

Однако, теория обычно расходится с практикой: на практике часто используют кэш памяти. Данные в векторе располагаются последовательно, в то время, как данные списка могут быть размещены в разных участках памяти. Что это дает? Двусвязная очередь - это структура, которая нацелена на получение всех преимуществ std::list и std::vector и избежание их недостатков.

Все тесты проводились на Intel Core i7 Q 820 @ 1.73GHz на GCC 4.7.2 с параметрами -02 и -march=native. Код скомпилирован с поддержкой C++11 (-std=c++11).

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

Просмотров: 10919
25Авг/120

Оптимизация C++ в играх

cpp_optimization

Введение

Хорошо написанные игры на C++ часто проще поддерживаются и могут быть использованы в других играх, чем их аналоги на C. Но стоят ли они того? Могут ли программы, написанный на C++ обеспечить такую же скорость, как и C-аналоги?
С хорошим компилятором и знанием языка можно создавать эффективные игры на C++. В данной главе описаны техники, которые можно использовать, чтобы ускорить работу игр, написанных на C++. Предполагается, что вы знакомы с основами языка C++ и принципами оптимизации кода.

Один из главных принципов оптимизации, который можно повторять раз за разом – профилирование кода. При отсутствии профилирования программисты часто делают два типа ошибок. Во-первых, они оптимизируют не тот код. Большая часть программы не является критичной в отношении скорости выполнения, и оптимизация таких участков – пустая трата времени. Определять, какие участки являются критичными интуитивно не самый лучший подход – вы сможете обнаружить их только посредством прямых измерений (использования памяти и скорости выполнения). И, во-вторых, программисты иногда производят оптимизацию, которая наоборот замедляет скорость выполнения. Эта проблема очень актуальна в отношении к C++, где простая строка кода может сгенерировать невероятно большой машинный код. Поэтому программисту следует как можно чаще изучать машинный код, генерируемый компилятором и профилировать свои программы.

Просмотров: 2783
8Авг/122

Различия между Hashtable и HashMap в Java

В Java реализованы два довольно схожих объекта-контейнера: Hashtable и HashMap. Каждый разработчик когда-нибудь приходит к вопросу: "Чем, собственно, они различаются?".

Отличия Hashtable от HashMap:

  1. Hashtable является синхронизированным контейнером. То есть, этот контейнер безопасен при работе в несколько потоков, однако, это может немного повлиять на производительность;
  2. Hashtable, в отличие от HashMap, не позволяет хранить null-значения или использовать null в качестве ключа;
  3. От контейнера HashMap наследуется класс LinkedHashMap, который позволяет осуществлять быструю итерацию по объектам внутри контейнера - можно легко перейти от HashMap к LinkedHashMap. Hashtable лишен такой возможности.

Просмотров: 4923
Метки записи: , 2 Комментарии
25Июн/121

Информация об оперативной памяти в Linux

Удивителен и неповторим Linux в своем многообразии. Возникла недавно необходимость получить информацию об оперативной памяти и слотах, которые есть в машине под Linux'ом. Как оказалось, все далеко не просто в этом вопросе. Далее будет рассмотрена целая куча вариантов получения информации об оперативной памяти и железу, связанному с RAM.

Просмотров: 10471
22Июн/120

Цветовые модели

rgb

Цветовые модели очень часто используются как в веб-разработке, так и в разработке GUI-приложений и еще в очень многих областях программирования. Они же используются в Photoshop, а веб-разработчики, порой, проводят в нем не одну бессонную ночь :) Однако, далеко не все понимают смысл различных цветовых моделей, ведь очень часто достаточно обычной модели RGB. Рассмотрим цветовые модели RGB, HSV и CMYK. Заранее заявлю, что кроме сухой теории будет реализация отрисовки окна выбора цвета, такого же как в Photoshop.

Просмотров: 3566
9Июн/122

Конкатенация строк в Java

Время выполнения методов конкатенации

Строки в Java - своеобразный краеугольный камень. С одной стороны, работать со строками удобно, с другой - есть много нюансов, из-за которых приложения могут работать неправильно или очень медленно. Сегодня под увеличительную лупу попадает проблема конкатенации строк в Java.

Просмотров: 7507
4Июн/120

Временные метки

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

Так вот, в Qt получить временную метку достаточно просто, но не всегда приходит в голову именно такая конструкция:


Хотя, все это сподвижки родных библиотек C++:

В PHP немного проще:

Java:
Просмотров: 1725
Метки записи: , , , , Нет комментариев
30Май/120

Добавление сайта в поисковые системы

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

Просмотров: 3935
28Май/123

Запись памяти процесса

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

Просмотров: 6425
26Май/124

Сравнение строк в Java

Разработчики, погружающиеся в мир Java иногда впадают в недоумение, когда читают в книжке или на форумах что-нибудь подобное:

Никогда не используйте оператор сравнения (==) для сравнения строковых переменных. Используйте String.equals()

"Что серьезно?!" - спросите вы. Да, это действиетельно так. Пояснение ниже.

Просмотров: 11597
26Май/120

Количество сетевых подключений в Linux

Информацию о текущем количестве подключений в linux поможет выудить следующая команда:


Просмотров: 1895
Метки записи: , Читать полностью