Как стать автором
Обновить
-3
0

Пользователь

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

LifeTrak: бюджетные спортивные часы + фитнес трекер

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


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

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

Спортивные часы/фитнес трекеры LifeTrak — как раз бюджетные устройства, с хорошей функциональностью. LifeTrak Move C300 и LifeTrak ZoneC410- две модели от LifeTrak, на которые стоит обратить внимание.

Читать дальше →
Всего голосов 29: ↑25 и ↓4+21
Комментарии29

Основы безопасности операционной системы Android. Безопасность на уровне Application Framework. Binder IPC

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

Вступление


После небольшого перерыва я продолжаю объяснять базовые принципы как обеспечивается безопасность в операционной системе Android. Сегодня я начну описывать безопасность на уровне Application Framework. Но чтобы понять данную тему, вначале необходимо рассмотреть как в Android реализован механизм межпроцессного взаимодействия (Inter-Process Communication (IPC)). Этот механизм называется Binder IPC, и сегодня мы будем рассматривать его особенности. Все, кому интересно, добро пожаловать!
Читать дальше →
Всего голосов 29: ↑29 и ↓0+29
Комментарии7

Кроссворд из RegEx

Время на прочтение1 мин
Количество просмотров22K
Crossword Наткнулся в интернете на очередную игру для программистов.
На этот раз объектом издевательств стали регулярные выражения — авторы сделали Regex Crossword, где вместо вопросов — набор регулярных выражений.
Описание и правила под катом
Всего голосов 56: ↑47 и ↓9+38
Комментарии35

Исключения в Java, Часть I (try-catch-finally)

Время на прочтение23 мин
Количество просмотров438K
Это первая часть статьи, посвященной такому языковому механизму Java как исключения (вторая (checked/unchecked) вот). Она имеет вводный характер и рассчитана на начинающих разработчиков или тех, кто только приступает к изучению языка.

Также я веду курс «Scala for Java Developers» на платформе для онлайн-образования udemy.com (аналог Coursera/EdX).

1. Ключевые слова: try, catch, finally, throw, throws
2. Почему используем System.err, а не System.out
3. Компилятор требует вернуть результат (или требует молчать)
4. Нелокальная передача управления (nonlocal control transfer)
5. try + catch (catch — полиморфен)
6. try + catch + catch + ...
7. try + finally
8. try + catch + finally
9. Вложенные try + catch + finally


1. Ключевые слова: try, catch, finally, throw, throws


Механизм исключительных ситуаций в Java поддерживается пятью ключевыми словами
  • try
  • catch
  • finally
  • throw
  • throws


«Магия» (т.е. некоторое поведение никак не отраженное в исходном коде и потому неповторяемое пользователем) исключений #1 заключается в том, что catch, throw, throws можно использовать исключительно с java.lang.Throwable или его потомками.
Читать дальше →
Всего голосов 67: ↑47 и ↓20+27
Комментарии24

Выделенный сервер в Европе по цене обеда в кафе!

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

На хабре уже было несколько статей про французского хостинг-провайдера OVH, поэтому не буду рассказывать в подробностях о компании и ее услугах, а лишь обращу ваше внимание на одно крайне привлекательное, на мой взгляд, предложение…

Читать дальше →
Всего голосов 39: ↑25 и ↓14+11
Комментарии66

Лямбда-выражения в Java 8

Время на прочтение19 мин
Количество просмотров463K
В новой версии Java 8 наконец-то появились долгожданные лямбда-выражения. Возможно, это самая важная новая возможность последней версии; они позволяют писать быстрее и делают код более ясным, а также открывают дверь в мир функционального программирования. В этой статье я расскажу, как это работает.

Java задумывалась как объектно-ориентированный язык в 90-е годы, когда объектно-ориентированное программирование было главной парадигмой в разработке приложений. Задолго до этого было объектно-ориентированное программирование, были функциональные языки программирования, такие, как Lisp и Scheme, но их преимущества не были оценены за пределами академической среды. В последнее время функциональное программирование сильно выросло в значимости, потому что оно хорошо подходит для параллельного программирования и программирования, основанного на событиях («reactive»). Это не значит, что объектная ориентированность – плохо. Наоборот, вместо этого, выигрышная стратегия – смешивать объектно-ориентированное программирование и функциональное. Это имеет смысл, даже если вам не нужна параллельность. Например, библиотеки коллекций могут получить мощное API, если язык имеет удобный синтаксис для функциональных выражений.

Главным улучшением в Java 8 является добавление поддержки функциональных программных конструкций к его объектно-ориентированной основе.
Читать дальше →
Всего голосов 60: ↑51 и ↓9+42
Комментарии24

Никогда не проверяйте e-mail адреса по стандартам RFC

Время на прочтение7 мин
Количество просмотров180K
Множество сайтов требуют от пользователя ввода адреса электронной почты, и мы, как крутые и щепетильные разработчики, всегда стремимся проверять формат введенных адресов строго по стандартам RFC. Благодаря этому наши приложения и сайты проверяют формат e-mail корректно и не имеют проблем с юзабилити, а мы сладко спим, потому что уверены, что все работает как надо.
Ага, как бы не так!
Всего голосов 141: ↑119 и ↓22+97
Комментарии103

Слишком быстрый, слишком мегаморфный: что влияет на производительность вызова метода в Java?

Время на прочтение9 мин
Количество просмотров21K
От переводчика:
спор сторонников написания final везде и всюду и их противников сродни спору остроконечников и тупоконечников. Как и в некоторых других сообществах, в нашей компании этот вялотекущий спор шел годами. И только эта статья Ричарда Вэрбёртона (Richard Warburton) позволила нашим остроконечникам взять верх.


О чём речь?

Начнем с небольшого рассказа. Несколько недель назад я отправил в список рассылки Java core libs своё предложение убрать модификатор final с некоторых методов. В результате возникло несколько тем для дискуссии. Одна из них, например, — выяснить, в какой степени ухудшится производительность вызова метода, который был final, если этот final с него убрать.

У меня были некоторые соображения о том, возникнет регрессия производительности или нет, но я сначала попытался узнать, публиковал ли кто-нибудь уже результаты бенчмарков по этому вопросу. К сожалению, я ничего не смог найти. Это не означает, что они не существуют или что другие люди не исследовали ситуацию, но я не встречал никакого кода, прошедшего экспертную проверку. Так что самое время написать несколько бенчмарков.
Читать дальше →
Всего голосов 42: ↑42 и ↓0+42
Комментарии5

Не дразните программиста

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

Вы устали? Хотите выпустить пар? Вам требуется передышка? Предлагаю вам присоединится ко мне, тем более, что на дворе пятница.
Читать дальше →
Всего голосов 424: ↑394 и ↓30+364
Комментарии126

Первые несколько миллисекунд HTTPS соединения

Время на прочтение10 мин
Количество просмотров169K
После нескольких часов чтения обзоров, Боб с нетерпением нажал на кнопку перехода к оформлению заказа на галлон цельного молока, и…
Воу, что только что произошло?


Интересно? Прошу под кат
Всего голосов 242: ↑237 и ↓5+232
Комментарии36

Устанавливаем Linux-программы на смартфон под управлением Android

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


Многие владельцы Android-фонов испытывают трудности с запуском настоящего Linux-софта на своих девайсах. По всем законам он вроде должен здесь работать, да вот только для его установки почему-то нужны права root, сам он распространяется в каких-то самодельных инсталляторах, а выбор программ сильно ограничен. Эта статья предложит ответ на вопрос, почему так получилось, и подскажет решение — удобный способ установки и запуска почти любого Linux-софта в Android.
Подробности
Всего голосов 110: ↑93 и ↓17+76
Комментарии41

Android. Обзор боевых приложений

Время на прочтение2 мин
Количество просмотров320K
Доброго времени суток!

Наряду со статьей "iPhone: MiTM атака из кармана", родилась почти аналогичная статья про Android.

Мы уже знаем, на что способен iPhone. Уступает ли ему Android?

Было рассмотрено около 25 боевых приложений. Хочу предоставить вам результат маленького исследования. Многие приложения даже не запустились, некоторые подвесили телефон намертво, но некоторые даже работали!

Весь софт тестировался на телефоне LG Optimus, с версией Android 2.3.

Итак, краткий обзор боевого софта на Android:

Читать дальше →
Всего голосов 255: ↑238 и ↓17+221
Комментарии49

Как на самом деле работает mod_rewrite. Пособие для продолжающих

Время на прочтение17 мин
Количество просмотров278K
image
Эта статья выросла из идеи продвинутого обучения наших сотрудников технической поддержки работе с mod_rewrite. Практика показала, что после изучения имеющихся в большом количестве учебников на русском языке саппортам хорошо дается решение шаблонных задач, но вот самостоятельное составление правил происходит методом проб и большого количества ошибок. Проблема заключается в том, что для хорошего понимания работы mod_rewrite требуется изучение оригинальной англоязычной документации, после чего — либо дополнительные разъяснения, либо часы экспериментов с RewriteLog.

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

Я предполагаю, что читатель уже знаком с тем, что такое mod_rewrite, и не буду описывать его основы, которые легко найти в интернете. Также нужно отметить, что в статье освещается работа mod_rewrite при использовании его директив в файле .htaccess. Отличия при работе в контексте <VirtualHost> изложены в конце статьи.

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

Почему так происходит?
Читать дальше →
Всего голосов 208: ↑203 и ↓5+198
Комментарии25

Erlang для самых маленьких. Глава 1: Типы данных, переменные, списки и кортежи

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

Добрый день, дорогие хабражители.

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


Если интересно - давайте начнем...
Всего голосов 95: ↑88 и ↓7+81
Комментарии65

Руководство по магическим методам в Питоне

Время на прочтение28 мин
Количество просмотров602K
Это перевод 1.17 версии руководства от Rafe Kettler.


Содержание


  1. Вступление
  2. Конструирование и инициализация
  3. Переопределение операторов на произвольных классах
  4. Представление своих классов
  5. Контроль доступа к атрибутам
  6. Создание произвольных последовательностей
  7. Отражение
  8. Вызываемые объекты
  9. Менеджеры контекста
  10. Абстрактные базовые классы
  11. Построение дескрипторов
  12. Копирование
  13. Использование модуля pickle на своих объектах
  14. Заключение
  15. Приложение 1: Как вызывать магические методы
  16. Приложение 2: Изменения в Питоне 3


Вступление


Что такое магические методы? Они всё в объектно-ориентированном Питоне. Это специальные методы, с помощью которых вы можете добавить в ваши классы «магию». Они всегда обрамлены двумя нижними подчеркиваниями (например, __init__ или __lt__). Ещё, они не так хорошо документированны, как хотелось бы. Все магические методы описаны в документации, но весьма беспорядочно и почти безо всякой организации. Поэтому, чтобы исправить то, что я воспринимаю как недостаток документации Питона, я собираюсь предоставить больше информации о магических методах, написанной на понятном языке и обильно снабжённой примерами. Надеюсь, это руководство вам понравится. Используйте его как обучающий материал, памятку или полное описание. Я просто постарался как можно понятнее описать магические методы.
Читать дальше
Всего голосов 143: ↑139 и ↓4+135
Комментарии59

Маленькие хитрости Java. Часть 2

Время на прочтение5 мин
Количество просмотров109K
В продолжение первой статьи я добавлю еще несколько штрихов о наиболее часто встречающихся ошибках и просто плохом коде, с которым часто приходится иметь дело при работе с уже написанными проектами. Я не выносил это в первую часть, так как эти ситуации встречаются гораздо реже, но поскольку первая часть вызвала много позитивных отзывов, решил продолжить. Спасибо всем комментаторам, отзывам и замечаниям. Я постараюсь избежать допущенных ошибок. Итак, продолжим:

Buffered Streams

//медленно
InputStream is = new FileInputStream(file);
int val;
while ((val = is.read()) != -1) {
}
//быстро
InputStream is = new BufferedInputStream(new FileInputStream(file));
int val;
while ((val = is.read()) != -1) {
}

Казалось бы — очевидная истина, неправда ли? Но как показал чужой код и опыт собеседования кандидатов, часть разработчиков определенно не понимает в чем преимущество буферизованных стримов. Кто до сих пор не разобрался — метод read() класса FileInputStream:
public native int read() throws IOException;

Согласитесь, каждый раз делать системный вызов, чтобы считать один байт несколько расточительно. Собственно для того, чтобы избежать этой проблемы и были созданы оболочки-буферы. Все что они делают — при первом вызове системного read() считывают несколько больше (в зависимости от указанного размера буфера, котрый по умолчанию равен 8 кб) и при следующем вызове read() считывают данные уже из буфера. Прирост производительности — на порядок. Системные вызовы, на самом деле, это не всегда плохо, например:
System.arraycopy(src, srcPos, dest, destPos, length);

В случае копированния массива — системный метод будет гораздо быстрей реализованного на java. И еще — считывайте данные порциями, а не по байтам, это тоже позволит прилично сэкономить.
Читать дальше →
Всего голосов 93: ↑84 и ↓9+75
Комментарии91

Может пора спускаться с облаков?

Время на прочтение3 мин
Количество просмотров35K
Ну чтож, пост на тему «наболело».
Скажу сразу для тех, кто хочет подчерпнуть что-то из текста: морали нет, выводов нет. Просто мысли о наболевшем.

Последние несколько недель тревожат меня 2 темы в плане Интернета:
1. Слежка органов.
2. Непостоянство сервисов.

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

Ну а о втором мы стали слышать/читать чуть ли не каждый день.
Самое интересное, что воспринимается это все как само собой разумеющееся, т.е. ну да, закрыли тот или иной сервис по той или иной причине.
Я и так этим не пользовался. Ну или пользовался, но не очень. Так что ладно.
Ну или очень даже пользовался и мне дико обидно, но что поделаешь…
Я подпишу какую-нибудь петицию, чтобы его не закрывали и буду надеяться, хотя четко знаю, что он все равно закроется.
Читать дальше →
Всего голосов 99: ↑69 и ↓30+39
Комментарии84

Распараллеливание с минимальными правками в коде

Время на прочтение1 мин
Количество просмотров13K
Пусть у вас есть метод, вызываемый во многих местах, и вызов которого хочется сделать параллельным. Это можно сделать, не меняя код вызова метода и код самого метода. Нужно только создать расширение объемлющего класса, и изменить код создания объекта.

Было:
class Service {
  public void longJob(Object arg) {...}
}
...
Service s=new Service();
...

s.longJob(arg);


Стало:
class Service {
  public void longJob(Object arg) {...}
}
class ServiceWrapper extends Service {
...
}
...
Service s=new ServiceWrapper() ;
...

s.longJob(arg);

Читать дальше →
Всего голосов 37: ↑22 и ↓15+7
Комментарии37
2

Информация

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