Как стать автором
Обновить
44
0
Arseniy Seroka @JagaJaga

Chief executive officer @ Serokell

Отправить сообщение

Android компонент с нуля — 2 — Лупа для изображения

Время на прочтение6 мин
Количество просмотров17K
Время от временя в интернете, в основном на сайтах различных магазинов и торговых площадок, мы сталкиваемся с программной лупой, позволяющей рассмотреть более детально фотографии различных товаров (что то подобное реализовано на сайте www.ebay.com). Созданием такой лупы для платформы Android мы и займёмся (специально для новичков).
Читать дальше →
Всего голосов 30: ↑27 и ↓3+24
Комментарии11

[Перевод] Различия в разработке под BlackBerry и Android

Время на прочтение6 мин
Количество просмотров15K
От переводчика: данный текст должен помочь комментаторам из этой и этой тем, желающим узнать, как обстоят дела с разработкой для BlackBerry 10.



Я хочу поделиться с вами собственным опытом разработки для Android и BlackBerry. Речь пойдёт не только о, собственно, программировании, но также об анализе статистики и получаемой прибыли.

Я ни в коем случае не хочу судить о платформах, лишь делюсь своими впечатлениями и фактами.
Читать дальше →
Всего голосов 23: ↑21 и ↓2+19
Комментарии15

Заземлённые указатели

Время на прочтение8 мин
Количество просмотров52K
pointres, gnd

Не так давно, один из сотрудников покинул наш коллектив и присоединился к компании, занимающийся разработкой программного обеспечения, связанного с встраиваемыми системами. Ничего особенного в этом нет, всегда и везде, кто-то уходит, а кто-то приходит. Всё зависит от количества плюшек, удобства и предпочтений. Интересно другое. Человек искренне переживает за состояние кода на новом месте работы, что в результате и вылилось в эту совместную статью. Тяжело, «просто программировать», когда знаешь, что такое статический анализ кода.
Читать дальше →
Всего голосов 112: ↑94 и ↓18+76
Комментарии140

Pixel-perfect верстка Android макетов

Время на прочтение7 мин
Количество просмотров56K
Разрабатывать интерфейс Android приложений — непростая задача. Приходится учитывать разнообразие разрешений и плотностей пикселей (DPI). Под катом практические советы о верстке макетов дизайна Android приложений в Layout, который совпадает с макетом на одном устройстве а на остальных растягивается без явных нарушений дизайна: выхода шрифтов за границы; огромных пустых мест и других артефактов.

UPD: Пост спорный, но много ценных советов в комментариях


Читать дальше →
Всего голосов 87: ↑60 и ↓27+33
Комментарии83

Пять подводных камней при использовании shared_ptr

Время на прочтение15 мин
Количество просмотров137K
Класс shared_ptr — это удобный инструмент, который может решить множество проблем разработчика. Однако для того, чтобы не совершать ошибок, необходимо отлично знать его устройство. Надеюсь, моя статья будет полезна тем, кто только начинает работать с этим инструментом.

Я расскажу о следующем:
  • что такое перекрестные ссылки;
  • чем опасны безымянные shared_ptr;
  • какие опасности подстерегают при использовании shared_ptr в многопоточной среде;
  • о чем важно помнить, создавая свою собственную освобождающую функцию для shared_ptr;
  • какие существуют особенности использования шаблона enable_shared_from_this.

Читать дальше →
Всего голосов 57: ↑56 и ↓1+55
Комментарии53

Совместный запуск Linux и baremetal OS

Время на прочтение4 мин
Количество просмотров16K
Недавно я выложил в сеть под BSD лицензией небольшой проект на 8 килострочек C кода. Официально это коллекция бенчмарков для моих клиентов — вендоров промавтоматики. Код очень специфический, и, на первый взгляд, малоприменим за пределами узкой области PLC и motion control. Но есть небольшая изюминка, на которой я не очень акцентировал внимание в статье на IDZ. В поставку бенчмарков включена baremetal среда для их исполнения. В этом посте я опишу, что это такое, и как ее можно использовать.
Читать дальше →
Всего голосов 31: ↑30 и ↓1+29
Комментарии13

Смертные грехи Программиста

Время на прочтение3 мин
Количество просмотров55K
Я знаю, что мой глас так и останется гласом вопиющего в пустыне администратора. Кто я, собственно? Всего лишь администратор, жалкое подобие демиурга, которым является Программист. Он – создатель сущего, а мой удел всего лишь поддерживать его творения в работающем состоянии и молиться, чтобы паства, то есть, пользователи, не распяли меня, когда у них что-то не работает.

Но даже Программист грешен, если не соблюдает семь заповедей.

Не возомни паству пастырем


Программист любит верить в то, что запускающий его программу пользователь подобен администратору. Увы, увы, такого права ему чаще всего никто не давал, поэтому если Программист об этом не подумал, то птица скорби Симург возносит свои крылья над администратором.
Читать дальше →
Всего голосов 182: ↑137 и ↓45+92
Комментарии92

Я оглянулся посмотреть не оглянулась ли она… или история о том, как я был сам себе провайдером в начале 2000-х

Время на прочтение8 мин
Количество просмотров64K
Интернет в нашем городе появился стандартно — в виде государственного монополиста связи, устроившего модемный пул в несколько десятков каналов. Доступ к Всемирной паутине пришел не на пустое место — уже несколько лет процветала сеть Fidonet, насчитывавшая у нас целых три ноды и до сотни подписчиков-поинтов. Номер своего поинта уже и не вспомню, но где-то в архивах на дисках еще пылится подборка нужного софта — тоссера, голдеда, продвинутой «звонилки» и прочего.
Так что модемы у многих были, равно как и желание поскорее приобщиться к мировой сети.



Читать дальше →
Всего голосов 156: ↑155 и ↓1+154
Комментарии53

Оптимизируем, оптимизируем и еще раз оптимизируем

Время на прочтение5 мин
Количество просмотров24K
По долгу службы мне периодически приходится пользоваться профайлером, так как требования к производительности серверов задокументированы и не могут опускаться ниже определенного уровня. Помимо некоторых очевидных архитектурных изменений и решений частенько находятся повторяющиеся места от модуля к модулю, от одного проекта к другому, которые создают дополнительную нагрузку на виртуальную машину, которыми и хочу поделиться.
Так уж случилось, что на глаза чаще всего попадался код работы с Date потому с него и начнем:

Date

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

    public boolean isValid(Date start, Date end) {
        Date now = new Date();
        return start.before(now) && end.after(now); 
    }

Казалось бы — вполне очевидное и правильное решение. В принципе, да, за исключением двух моментов:
  • Использовать Date сегодня в java — уже, пожалуй, моветон, учитывая тот факт, что почти все методы в нем уже Deprecated.
  • Нету смысла создавать новый объект даты, если вполне можно обойтись примитивом long:

    public boolean isValid(Date start, Date end) {
        long now = System.currentTimeMillis();
        return start.getTime() < now && now < end.getTIme(); 
    }


SimpleDateFormat

Очень часто в веб проектах возникает задача перевести строку в дату или наоборот дату в строку. Задача довольно типичная и чаще всего выглядит так:

    return new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z").parse(dateString);

Это правильное и быстрое решение, но если серверу приходится парсить строку на каждый пользовательский реквест в каждом из сотен потоков — это может ощутимо бить по производительности сервера в виду довольно тяжеловесного конструктора SimpleDateFormat, да и помимо самого форматера создается множество других объектов в том числе и не легкий Calendar (размер которого > 400 байт).

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

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

Но решения есть и их как минимум 2:
  • Старый, добрый ThreadLocal — cоздаем SimpleDateFormat для каждого потока 1 раз и переиспользуем для каждого последующего запроса. Данный подход поможет ускорить парсинг даты в 2-4 раза за счет избежания создания объектов SimpleDateFormat на каждый запрос.
  • Joda и ее потокобезопасный аналог SimpleDateFormat — DateTimeFormat. Хоть йода в целом и медленнее дефолтного Java Date API в парсинге дат они идут наравне. Несколько тестов можно глянуть тут.

Читать дальше →
Всего голосов 50: ↑38 и ↓12+26
Комментарии34

Мультиквайногенератор

Время на прочтение9 мин
Количество просмотров18K
На хабре месячник квайнов, поэтому хочу поделиться своими разработками, которые проделывал ещё четыре года назад.

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

Поскольку мы имеем дело с текстами программ и результатами их исполнения, то было бы естественно взглянуть на это дело как на функции над строками.
Читать дальше →
Всего голосов 77: ↑76 и ↓1+75
Комментарии14

Пишем приложения для Google Glass

Время на прочтение7 мин
Количество просмотров18K
Несколько дней назад я имел возможность основательно попрактиковаться в разработке приложений для Google Glass. Полученный опыт растеряется со временем, так как пока разрабатывать что-то ещё под “очки” не планирую. Чтобы поделиться пока ещё свежими впечатлениями решил написать этот топик.
Думаю, всем кто интересуется Google Glass известно, что представляет собой программная “начинка” этого гаджета. Да, это Android 4 с адаптированным launcher-ом. Да, в “очках” вполне можно запускать обычные android-приложения, установив их туда через adb. Известно вам наверняка и про Mirror API, который до недавнего времени считался единственным способом официально предоставить свой сервис пользователю Google Glass. Ниже я немного расскажу о использовании этого инструмента. Но главное, о чём хотелось бы рассказать — как писать под Google Glass полноценные android-приложения, используя пока ещё не официальный Glass Development Kit.
Читать дальше →
Всего голосов 30: ↑28 и ↓2+26
Комментарии6

Неэффективный программист или как взломать свой мозг за 2 дня

Время на прочтение9 мин
Количество просмотров190K


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


Интернет сделал нас ленивыми!

Почему? Кто в последний раз посмотрел видео больше 3х минут? Кто прочитал пост больше 2 страниц? Какой заголовок более привлекателен, «63 способа бла-бла-бла» или «3 проверенных метода бла-бла-бла»? А если эти три проверенных метода выделены от основного текста, то это вообще гуд (можно не читать текст вовсе, а просто пробежаться по выделенным подзаголовкам).

В этом свои плюсы. Наш мозг эволюционировал, и обрабатывает информацию быстрее, чем, скажем, 15-20 лет назад (да и эволюционирует быстрее, чем это было возможно век назад). Как компании справляются с высокими нагрузками? Как процессор выполняет программу по возможности быстро? С помощью кэширования! (как вариант, но самый приоритетный). Что делает наш мозг, чтобы справиться с большой нагрузкой? Кэширует! Что именно и как — оставим на размышление ИИшникам (специалистам по искусственному интеллекту). В противном случае при увеличении размера обрабатываемой информации время «отклика» бы увеличилось в разы, и на ответ на «как добраться до ближайшей больницы?» уйдет больше времени, чем человек «в силе ждать». «Сила ждать» тоже уменьшилась, «размер» нашего терпения уменьшился, и мы быстро устаем, если продолжительность видео большая, размер статьи большой (на самом деле продолжительность может не влиять на терпение, больше всего влияет полезная информация, если «воды» меньше или вовсе нет, то и терпеть ничего не приходится, посему данный пост написан «эз лаконик эз посибл»).
Убедиться в этом
Всего голосов 258: ↑207 и ↓51+156
Комментарии176

Краткое введение в GNU autoconf

Время на прочтение5 мин
Количество просмотров50K
I saw a book entitled «Die GNU Autotools» and I thought «My feelings exactly». Turns out the book was in German1. ©

Можно долго рассуждать о несовершенстве сего инструментария, о превосходстве CMake/QMake/подставьте_вашу_любимую систему сборки, но проекты, использующие autotools, окружают нас повсюду, и стоит как минимум знать, что это за зверь и с чем его едят, чтобы при попытке сделать, а то и отправить разработчикам патч, не править автосгенерированные файлы, чем я не так давно занимался.

Так же следует понимать, что именно autoconf системой сборки не является вообще, это система конфигурации перед сборкой. autoconf почему-то многие считают неким монстром, «проверяющим 15 давно несуществующих версий компилятора Fortran, а потом поддержку ключей этими компиляторами», что не совсем верно, ибо оно делает ровно то, что ему скажут. Другое дело, что многие просто копипастят его конфиг из проекта в проект, в итоге результат получается ужасающим.

В данной статье (планируется всё же осилить цикл) я хотел бы рассказать про autoconf, зачем он нужен и как его использовать.
Читать дальше →
Всего голосов 66: ↑62 и ↓4+58
Комментарии25

Семьи типов и Покемоны

Время на прочтение11 мин
Количество просмотров20K

Предисловие


Когда я начал изучать Хаскель, я был почти сразу поражён. Для начала, нырнув с головой в актуальные рабочие проекты, открыл, что большинство настоящих библиотек используют языковые расширения, присутствующие только в GHC (Glasgow Haskell Compiler). Это меня покоробило слегка, прежде всего потому, кто захочет использовать язык настолько немощный, что будет необходимо использовать расширения, присутствующие лишь у одного поставщика. Ведь так?
Хорошо, я решился снова это осилить и узнать всё об этих расширениях, и я вывел три горячих топика для общества Хаскеля, которые решали похожие проблемы: Обобщённые Алгебраические Типы Данных, Семьи Типов и Функциональные Зависимости. Пытаясь найти ресурсы, которые обучают о них, я смог найти только статьи, описывающие, что это такое, и как их использовать. Но никто, на самом деле, не объяснял зачем они нужны!.. Поэтому я решил написать эту статью, используя дружественный пример, пытаясь объяснить зачем всё-таки нужны Семьи Типов.



Вы когда-нибудь слышали про Покемонов? Это замечательные существа, которые населяют Мир Покемонов. Вы можете считать, что они как животные с экстраординарными способностями. Все покемоны владеют стихией, и все их возможности зависят от этой стихии. Например, покемон Огненной стихии может дышать огнём, в то время как покемон Водной стихии может брызгать струями воды.
Покемоны принадлежат людям, и их специальные способности могут быть использованы во благо для продуктивной деятельности, но некоторые люди всего лишь используют своих покемонов для борьбы с другими покемонами других людей. Эти люди называют себя Тренерами Покемонов. Это может сначала звучать как жестокое обращение с животными, но это очень даже весело и все, похоже, рады, включая покемонов. Имейте в виду, что в мире покемонов, кажется, всё в порядке, даже если 10-летние покидают дом, дабы рисковать своими жизнями ради того, чтобы стать самыми лучшими Тренерами Покемонов, как будто никто и никогда таковыми не становился.

Мы собираемся использовать Хаскель для того, что бы представить ограниченную (и даже несколько упрощённую, да простят меня фанаты) часть мира покемонов.
Читать дальше →
Всего голосов 35: ↑28 и ↓7+21
Комментарии7

Замена Dropbox на BitTorrent Sync + Raspberry Pi

Время на прочтение2 мин
Количество просмотров65K


Для Raspberry Pi нашли ещё одно полезное применение. Мини-компьютер отлично справляется с бэкапом и синхронизацией файлов между различными устройствами. К нему можно подключить внешний диск или большую флэшку, и RPi готов работать круглосуточно, синхронизируя файлы с компьютеров, ноутбуков и Android-устройств (скоро выйдет и клиент для iOS). Незачем платить за облачный сервис, если можно сделать такое же удобное «облако» у себя дома, и бесплатно.

Американский программист Джек Минарди опубликовал пошаговую инструкцию, как запустить BitTorrent Sync на Raspberry Pi.
Читать дальше →
Всего голосов 89: ↑79 и ↓10+69
Комментарии62

Бюджетная маркерная доска за 730 рублей своими руками

Время на прочтение3 мин
Количество просмотров154K
В хабратопике Фотографии рабочих мест хабражителей и… был один интересный комментарий от хабрапользователя hermit931

… Ах да — у меня не совсем доска, а из старого окна рама со стеклом ) разница не большая, только в весе :)

И в мозге сразу возникла мысль: «Зачем я выкинул старые деревянные окна при ремонте квартиры !» Мозг продолжил выдавать мысли: «Как сделать маркерную доску с наименьшими денежными затратами и наибольшей долговечностью и эффективностью».

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

Мы с коллегой проанализировали все хабратопики по изготовлению маркерных досок своими руками и разделили их на две группы:

1) Маркерные доски по технологии: подложка + цветной фон + стекло

Контрастная и долговечная маркерная доска
Идеальная маркерная доска
Маркерная доска своими руками

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

2) Маркерные доски с применением самоклеящейся пленки или скотча на белой бумаге

Бюджетная маркерная доска
Маркерная доска

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

Хотелось совместить прочность первой группы и дешевизну второй. Кому интересно, что у нас получилось — прошу под кат.

Читать дальше →
Всего голосов 56: ↑45 и ↓11+34
Комментарии53

[C++] Всё ли мы знаем об операторах new и delete?

Время на прочтение4 мин
Количество просмотров82K
Привет! Ниже речь пойдет об известных всем операторах new и delete, точнее о том, о чем не пишут в книгах (по крайней мере в книгах для начинающих).
На написание данной статьи меня побудило часто встречаемое заблуждение по поводу new и delete, которое я постоянно вижу на форумах и даже(!!!) в некоторых книгах.
Все ли мы знаем, что такое на самом деле new и delete? Или только думаем, что знаем?
Эта статья поможет вам разобраться с этим (ну, а те, кто знают, могут покритиковать:))
Читать дальше →
Всего голосов 94: ↑78 и ↓16+62
Комментарии40

Тройка полезных монад

Время на прочтение4 мин
Количество просмотров47K
Внимание: перед тем как читать текст ниже, вы уже должны иметь представление о том, что такое монады. Если это не так, то прежде прочитайте вот этот пост!

Перед нами функция half:


И мы можем применить её несколько раз:
half . half $ 8
=> 2


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


half x = (x `div` 2, "Я только что располовинил  " ++ (show x) ++ "!")


Что ж, отлично. Но что будет если вы теперь захотите применить half несколько раз?
half . half $ 8


Вот то, что мы хотели бы, чтобы происходило:


Спойлер: автоматически так не сделается. Придётся всё расписывать ручками:
finalValue = (val2, log1 ++ log2)
    where (val1, log1) = half 8
          (val2, log2) = half val1


Фу! Это ни капли не похоже на лаконичное
half . half $ 8


А что, если у вас есть ещё функции, имеющие лог? Напрашивается такая схема: для каждой функции, возвращающей вместе со значением лог, мы бы хотели объединять эти логи. Это побочный эффект, а никто не силён в побочных эффектах так, как монады!
Читать дальше →
Всего голосов 63: ↑58 и ↓5+53
Комментарии7

Обзор новых возможностей С++14: Часть 1

Время на прочтение10 мин
Количество просмотров139K
В апреле в Бристоле прошла встреча комитета С++, на которой были рассмотрены первые предложения по внесению изменений в новый стандарт С++14. Все рассматриваемые в этой статье изменения были одобрены на этой встрече и уже занимают свое почетное место в последней версии черновика нового стандарта (N3690 от 15 мая 2013).

Краткий перечень:
  • Автоматическое определение типа возвращаемого значения для обычных функций
  • Обобщенная инициализация захваченных переменных лямбд с поддержкой захвата-по-перемещению
  • Обобщенные (полиморфные) лямбда-выражения
  • Упрощенные ограничения на создание constexpr функций
  • Шаблоны переменных
  • exchange
  • make_unique
  • Обособленные строки
  • Пользовательские литералы для типов стандартной библиотеки
  • optional
  • shared_mutex и shared_lock
  • dynarray

Читать дальше →
Всего голосов 72: ↑68 и ↓4+64
Комментарии86

Кручу-верчу, запутать хочу: углы Эйлера и Gimbal lock

Время на прочтение3 мин
Количество просмотров127K


Выставите любой палец левой руки вперед. Давайте, не стесняйтесь, никто не будет над вами смеяться. Это нужно для важного эксперимента. Выставили? Теперь представьте что вы — это ваш палец (ну и бред). Повернитесь под прямым углом направо, затем наверх, и наконец налево. Где вы оказались? Правильно, в том же месте, но уже на спине.

С некоторой натяжкой именно так работает вращение с помощью углов Эйлера. Немного непредсказуемо и неудобно, не правда ли? Углы Эйлера имеют несколько недостатков, но есть одно особенно нехорошее свойство из-за которого вы не захотите с ними связываться. Его имя — Gimbal lock.

В русском языке gimbal lock называют по-разному: шарнирный замок, блокировка осей, складывание рамок. К сожалению, по запросам в поисковике с такими ключевыми словами выдаётся много мусора, а статья в Википедии оставляет желать лучшего, поэтому я сам расскажу вам об этом феномене и предложу как с ним бороться.

Внимание! Заходя под кат вы подвергаетесь риску поломать голову.
Ха! Я ничего не боюсь! Где этот gimbal lock?
Всего голосов 67: ↑60 и ↓7+53
Комментарии37

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность