Как стать автором
Обновить
101
0
Олег @Olegas

Fullstack-разработчик

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

Любимая задачка на знание React

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров20K

Всем привет! Меня зовут Олег и я fullstack-программист в компании Тензор. Опыт в разработке, без малого, 20 лет (как-то раз батя спаял на кухне ZX Spectrum и все заверте..., сам не понял как так вышло). В данный момент являюсь тимлидом собственной команды разработчиков, которая периодически нуждается в пополнении толковыми программистами.

Как и многие руководители, я активно принимаю участие в подборе сотрудников для себя и помогаю на собесах коллегам соседних отделов.

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

Если вы тоже в вечном поиске классных фронтендеров или сами часто проходите собесы - велком в эту статью :)

Итак, задачка...
Всего голосов 23: ↑23 и ↓0+23
Комментарии56

Умные дворники: автоматизируем автомобиль

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

Рассказ об опыте создания "с нуля", от идеи до рабочего устройства, простой автоматизации для своего автомобиля. Используя микроконтроллер STM32 и CAN-шину автомобиля сделаем жизнь автолюбителя немного проще и приятнее.

Читать далее
Всего голосов 68: ↑66 и ↓2+64
Комментарии160

Как мы :hover на iOS побеждали…

Время на прочтение6 мин
Количество просмотров51K
Ни для кого, думаю, не секрет, что touch-устройства обрабатывают «мышиные» события несколько иначе, не так, как это происходит на десктоп-браузерах…

Самый яркий для меня пример, это обработка псевдокласса :hover. Для начала iOS7, например, не будет реагировать на hover если только на элемент, или его родителя, не навешена обработка события click. Это хорошо видно вот на этом примере: jsfiddle.net/H8EmG — сколько не тыкай пальцем в текст — никаких подчеркиваний не увидишь. А в этом примере jsfiddle.net/H8EmG/1 «тычок» пальцем в текст будет приводить к его подчеркиванию. Интересный факт — пока не ткнем в другой элемент, текст так и будет сидеть под ховером…

Другой интересный пример, это обработка появления элементов «по-наведению»: jsfiddle.net/ASRm9/1 Попробуйте нажать на текст. Сперва вы увидите текст «HOVER!», появившийся внутри строки, а вот второе нажатие уже вызовет alert('click'). Это происходит потому, что iOS понимает что за :hover что-то скрыто, и старается не сломать поведение, заложенное автором сайта.

Но однажды мы столкнулись с такой багой, объяснить которую мы не смогли до сих пор, а на ее локализацию потребовался не один день отладки на iPad… Желающие подробностей, а также хитрого, как мне кажется, способа решения, наверное, всех проблем с :hover разом — прошу под кат…

Читать дальше →
Всего голосов 28: ↑22 и ↓6+16
Комментарии13

Выполнение задач в бэкграунде

Время на прочтение4 мин
Количество просмотров117K
На Stackoverflow часто встречаются вопросы по выполнению на Android фоновых задач, в т.ч. и повторяющихся с заданным промежутком времени. Как правило, первое, что используется, это Service.

Такой подход в некоторых случаях может привести к тормозам и низкой скорости ответа пользовательского интерфейса. Расскажу когда так бывает и как с этим бороться…
Читать дальше →
Всего голосов 52: ↑45 и ↓7+38
Комментарии29

Делаем простейший сборщик ошибок для Android

Время на прочтение3 мин
Количество просмотров27K
При разработке приложения неизбежно приходится сталкиваться с ошибками в коде и/или окружении. И очень печально когда подобные ошибки встречаются не на тестовом телефоне/эмуляторе а у живых пользователей. Еще печальнее если это не ваш друг бета-тестер и толком никто не может объяснить что и где свалилось.

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

Что же делать? На помощь приедет возможность языка Java обрабатывать исключения (Exceptions), в том числе и непойманные (unhandled).

Читать дальше →
Всего голосов 59: ↑52.5 и ↓6.5+46
Комментарии13

Мошеннические Android-приложения. Ковыряем врага

Время на прочтение3 мин
Количество просмотров36K
Я являюсь разработчиком Android-приложения и слежу за появлением новых ссылок на него с помощью подписок Google. Сегодня утром я с радостью обнаружил в ящике письмо, в котором присутствовала новая ссылка на мое приложение. Все отлично! И отзыв положительный, и количество загрузок отличное от 0 вот только версия почему-то старая и… размер APK целых 3 мегабайта против оригинальных ~200К

После загрузки и распаковки APK (вспоминаем что APK это просто ZIP-архив) в нем обнаружилась «набивка» из 153 PNG файлов (переименованных зачем-то в .temp) со свидетелем из Фрязино и собственно «приложение»…

Как и следовало ожидать, от оригинального приложения там ничего не осталось. Ни иконки, ни, тем более, кода. А при дальнейшем рассмотрении (похоже что) ВСЕ файлы на androides-os.com — одна и та же программа! Я скачал несколько разных программ из разных разделов и все они были одного размера и с одинаковым содержимым!

Внутри оказалось нечто, которое по беглому анализу ресурсов оказалось приложением, запрашивающим активацию путем отправки SMS. Попробуем разобраться, куда и что отправляется…

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

Простой, казалось бы, вопрос по JavaScript

Время на прочтение1 мин
Количество просмотров5.3K
Есть простейший с виду код:

setInterval(function(){
     var xhr = new XMLHttpRequest();
     xhr.open('GET', 'json.txt', true);
     xhr.onreadystatechange = function() {
        if(this.readyState == 4 && this.status == 200) {
           console.log(this.responseText);
        }
     };
     xhr.send('');
}, 500);


Если оставить этот код работающим в, например, Google Chorme, скажем, на 1 час, он съедает память. Съедает методично. Если посмотреть в Developer Tools на профиль использования памяти видно что память таки чистится GC но не до конца. Со временем минимальная точка на графике после GC растет.

image

Аналогично рост потребления памяти видно и по about:memory. «Отжир» памяти стабильно видно и в FF…

Важное...
  • Файл json.txt лежит на localhost, его загрузка не занимает более 500мс гарантированно (я проверял).
  • Вывод в консоль я тоже отключал — память по прежнему отжирается.
  • EDIT без включенных developer tools — тоже течет, видно на about:memory.


Кроме этого кода более на данной странице никакого кода нет вообще.

Возможно я не понимаю как работает GC в JS, но по моему понятию тут нечему течь и нечему жить вечно. Может кто-то объяснить почему?

P.S. «Настоящей» утечки таки нет, если обновить страницу — память очищается.
P.P.S. Есть локальная жизненна потребность («требования бизнеса») оставлять подобный по структуре код на гораздо большие промежутки чем 1 час.

UPD: Оказывается есть даже тикет в хромиуме: code.google.com/p/chromium/issues/detail?id=52411
UPD: Якобы fixed in 9, но я проверяю на 10.
Всего голосов 49: ↑44 и ↓5+39
Комментарии91

Библиотека для работы с API Яндекс.Денег и демонстрационное Android-приложение

Время на прочтение3 мин
Количество просмотров3.4K
Добрый день, хабросообщество.

Хочу поделиться своей разработкой — Android-библиотекой для работы с API Яндекс.Денег.

Не далее чем 15 апреля Яндекс открыл API для работы с Я.Деньгами. Как и все ранее открытые API по работе с сервисами Яндекса, он основывается на авторизации через OAuth. В текущей реализации API позволяет запрашивать информацию об аккаунте, запрашивать список операций по счету и совершать платежи по шаблонам. Подробно — в документации, вопросы можно задать в клубе разработчиков.

В результате была запилена библиотека и демо-приложение для Android, работающее с кошельком через API.
Далее подробности
Всего голосов 33: ↑31 и ↓2+29
Комментарии2

Геопланировщик Hypocampo — теперь с Яндекс.Картами

Время на прочтение1 мин
Количество просмотров648
 

С момента первого анонса на хабре геопланировщика Hypocampo вышло несколько апдейтов, как с новым функционалом, так и с багфиксами. Многим понравилась идея, но для боле удобного использования не хватало Яндекс.Карт. Последняя версия, 0.1.4, преодолела это ограничение и теперь наряду с провайдером геокодирования можно выбрать и провайдера карт (поддерживаются Google и Yandex).
О прочих полезных нововведениях - под катом...
Всего голосов 11: ↑8 и ↓3+5
Комментарии9

Интеграционное тестирование web-приложения с Selenium WebDriver

Время на прочтение6 мин
Количество просмотров36K
Интеграционное тестирование (в отличие от Unit- или модульного тестирования) это тестирование не отдельных атомарных компонентов системы (классов) а результата их взаимодействия между собой в какой-либо среде.

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

О том, как можно Unit-тестировать JavaScript я писал ранее, сейчас же расскажу о процессе интеграционного тестирования, применяемого в команде.
Читать дальше →
Всего голосов 42: ↑42 и ↓0+42
Комментарии22

Hypocampo — геопланировщик

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

Добрый день, %username%.

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

Хочу представить свою разработку, призванную помочь избежать таких досадных недоразумений.

Hypocampo — приложение для Android, позволяющее планировать задачи привязывая их не ко времени, а к месту. Суть проста — выбираем место, добавляем к нему задачи. При нахождении вас в точке, для которой имеются запланированные активные задачи срабатывает напоминание.
Читать дальше →
Всего голосов 55: ↑49 и ↓6+43
Комментарии71

Небольшое замечание для тех, кто переходит на 1.4.3

Время на прочтение1 мин
Количество просмотров596
Особенность в 1.4.3 — проявляется в FF3.6.11

Простой пример:
<table>
	<tr>
		<td myAttr='1'>1.1</td>
		<td>1.2</td>
		<td>1.3</td>
		<td myAttr='1'>1.4</td>
	</tr>
	<tr>
		<td myAttr='1'>2.1</td>
		<td>2.2</td>
		<td>2.3</td>
		<td myAttr='1'>2.4</td>
	</tr>
</table>


Ранее, до 1.4.3, результат выполнения следующей jQuery-инструкции был равен 2 (выбраны элементы 1.2 и 1.3)
    $('tr').eq(0).find('td').eq(0).nextUntil('td[myattr=1]').length


В 1.4.3 результат будет равен… 3 (выбираются элементы 1.2, 1.3 и 1.4).
Судя по всему, дело в изменении алгоритмов поиска jQuery а именно, переходе на использование matchesSelector. Чтобы вернуть поведение в нужное русло надо взять значение аттрибута в кавычки:

    $('tr').eq(0).find('td').eq(0).nextUntil('td[myattr="1"]').length


Легкой отладки тебе, %username%!

UPD: Что интересно, IE8 (а скорее всего IE<9) не подвержен «багу». У него просто не реализован matchesSelector!

UPD: Есть подозрение, что это баг в FF3.6.11. В Chrome7 (у него есть matchesSelector!) баг не воспроизводится.
Всего голосов 8: ↑6 и ↓2+4
Комментарии4

Юнит-тестирование и CodeCoverage для Javascript-кода

Время на прочтение4 мин
Количество просмотров8K
В этой заметке расскажу о своем опыте юнит-тестирования JS-кода, опыте использования среды выполнения тестов js-test-driver, ее возможности code coverage и скручивании ежа с ужом, а именно данных о code coverage от js-test-driver и генератора отчетов о покрытии PHP_CodeCоverage. Расскажу и покажу как получить вот такие отчеты о покрытии кода...
Читаем дальше...
Всего голосов 63: ↑62 и ↓1+61
Комментарии29

Яндекс.Пробки: получаем области покрытия пробками + альтернативный пробочный гаджет

Время на прочтение2 мин
Количество просмотров3.5K
Не так давно Яндекс стал отдавать данные о пробках для большого количества других регионов, кроме Москвы, Питера, Киева и Екатеринбурга. Как разместить слой с пробками на своей карте я писал ранее. Сегодня разберемся как можно получить список регионов, в которых обрабатываются пробки.

У Яндекс.Пробок наряду с trf.maps.yandex.net/trf/stat.js есть еще trf.maps.yandex.net/trf/coverage.js. Этот скрипт рассказывает нам, какие регионы покрыты данными о пробках (ну или хотя бы такая информация поддерживается).

Вот что отдает данный скрипт...
Всего голосов 6: ↑1 и ↓5-4
Комментарии0

Размещаем слой с пробками на своей Я.Карте

Время на прочтение2 мин
Количество просмотров3K
API Яндекс.Карт на текущий момент не позволяет «автоматически» нанести на карту слой с пробками (UPD: имеется ввиду официально документированный способ, сопутствующие котнтролы, etc...) Впрочем, данная проблема все же решается довольно просто средствами API.

API имеет методы для размещения на карте собственного слоя. Слой карты характеризуется источником тайлов (YMaps.TileDataSource). Для создания источника требуется указать шаблон URL с тайлами.

Источник тайлов


Первая проблема — узнать адрес источника, используемого Я.картами. Решается просто — смотрим с помощью FireBug на карту с пробками и видим в самом верху <img /> с [src=http://trf.maps.yandex.net/tiles?l=trf&x=2500&y=1244&z=12&tm=1267986241] Здесь x,y и z — координаты тайла и информация о зуме карты. tm — временная отметка, за которую отдаются данные о пробках. Без указания параметра tm сервер тайлов отдает 404…
Читать дальше →
Всего голосов 8: ↑7 и ↓1+6
Комментарии7

Реализуем DI-контейнер на PHP5 с помощью Reflections

Время на прочтение5 мин
Количество просмотров1K
Этот топик для тех, кто представляет, что такое DI (Dependency Injection) но никогда не задумывался «как оно там унутре все работает».
Прочитать, что такое DI, можно например тут или тут

Не ставилось целью разработать свой Production DI-фреймворк. Хотелось разобраться как можно реализовать подобную функциональность наиболее удобно (Phemto, упомянутый выше, показался менее удобным, чем, например, способ от Microsoft Unity)

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

Посмотреть код реализации...
Всего голосов 8: ↑4 и ↓40
Комментарии4

Интересная техника сокрытия кодов JS «вируса»

Время на прочтение2 мин
Количество просмотров6.4K
Сегодня скинули код, дропающий на машину штатный вирус «отправьте SMS для разблокировки». Предысторию и методику чистки изложил force

Попробовал расковырять. Взял код, отформатировал, стал дебагать… Хм, интересно… В коде идет вызов (после приведения к читабельному виду)

window['eval'](var2);

А вот в var2 — бинарные данные. Ух ты… Но ведь eval не может выполнять бинарные данные!!!

И почему же в eval оказались бинарные данные?
Всего голосов 97: ↑89 и ↓8+81
Комментарии44

Получаем SPListItem из SPList. Очень быстро и очень медленно

Время на прочтение3 мин
Количество просмотров5.1K
При профилировании веб-части для SharePoint с удивлением обнаружил узкое место в SPListItemCollection.this[Guid]… Получение элемента списка по Guid'у, фактически первичному ключу, занимало уйму времени на большой коллекции.
Происходило это так

var uniqId = new Guid(/* get GUID somehow */);
SPList list = /* get list somehow */

SPListItem anItem = list.Items[uniqId];


* This source code was highlighted with Source Code Highlighter.
Под катом объяснение почему так и что с этим делать...
Всего голосов 56: ↑39 и ↓17+22
Комментарии19

Хочу коктейль! Сервис подборки коктейлей

Время на прочтение1 мин
Количество просмотров2.1K
imageНа далее как вчера на хабре был анонсирован сервис Яндекса по поиску коктейлей.

На основе базы, которой пользуется этот сервис, предлагаю вашему вниманию сервис подборки коктейлей. Суть проста — выбираем ингредиенты, получаем результат. Отображаются все коктейли, в которые входят выбранные ингредиенты. Как все вместе, так и по одиночке. Коктейль с наибольшим количеством совпавших ингредиентов выводится выше (релевантность! =) )

В общем лучше один раз увидеть, чем сто раз услышать.

Хочу коктейль!

UPD: Сервис по сути оффлайновый. Может работать на локали без внешнего подключения. Разве что картинки не будут подгружаться. База коктейлей в статике (как и в оригинальном сервисе)

UPD: Основное отличие от, скажем, inshaker.ru — более релевантная выдача по запрошенным компонентам.
Всего голосов 20: ↑11 и ↓9+2
Комментарии9

Кэширование селекторов для jQuery. Плагин

Время на прочтение1 мин
Количество просмотров3.7K
Простой плагин для jQuery, позволяющий закэшировать работу селекторов.
По наводке tenshi в камментах к habrahabr.ru/blogs/javascript/63119
Читать дальше →
Всего голосов 25: ↑17 и ↓8+9
Комментарии32
1

Информация

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