Как стать автором
Обновить
0
Иван @SpongeBobFanread⁠-⁠only

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

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

Основные принципы настройки Garbage Collection с нуля

Время на прочтение7 мин
Количество просмотров49K
В данной статье я бы не хотел заострять внимание на принципе работы сборщика мусора — об этом прекрасно и наглядно описано здесь: habrahabr.ru/post/112676. Хочется больше перейти к практическим основам и количественным характеристикам по настройке Garbage Collection в JVM — и попытаться понять насколько это может быть эффективным.

Количественные характеристики оценки эффективности GC


Рассмотрим следующие показатели:

  • Пропускная способность Мера, определяющая способность приложения работать в пиковой нагрузке не зависимо от пауз во время сборки и размера необходимой памяти
  • Время отклика Мера GC, определяющая способность приложения справляться с числом остановок и флуктуаций работы GC
  • Размер используемой памяти Размер памяти, который необходим для эффективной работы GC


Как правило, перечисленные характеристики являются компромиссными и улучшение одной из них ведёт к затратам по остальным. Для большинства приложений важны все три характеристики, но зачастую одна или две имеют большее значение для приложения — это и будет отправной точкой в настройке.
Читать дальше →
Всего голосов 26: ↑25 и ↓1+24
Комментарии11

Определение модульного теста

Время на прочтение7 мин
Количество просмотров17K
В наших с вами интернетах недавно поднялся нешуточный шум по поводу того, жив ли TDD сейчас, нужен ли он, и в каком виде. Все началось со статьи Дэвида Хансона «TDD is dead. Long living testing», после которой последовали статьи многих авторов и живые обсуждения этой проблемы включая hangout вместе с Дэвидом, Кентом Беком и Мартином Фаулером (кстати, очередной hangout будет завтра, 16 мая).

Но немногие знают, что за несколько дней до этого все тот же Мартин Фаулер постарался дать определение модульного теста (bliki:UnitTest), перевод которого представлен ниже. А после перевода идут кое-какие мои мысли по этому поводу.
Читать дальше →
Всего голосов 40: ↑38 и ↓2+36
Комментарии16

Транзакционная память: история и развитие

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

Определение


Параллельное программирование сложно. При использовании систем с общей памятью не обойтись без синхронизации доступа параллельных процессов/потоков к общему ресурсу (памяти). Для этого используются:
  • блокировки (mutex);
  • алгоритмы без блокировки (lockless, lock-free);
  • транзакционная память.


Транзакционная память — технология синхронизации конкурентных потоков. Она упрощает параллельное программирование, выделяя группы инструкций в атомарные транзакции. Конкурентные потоки работают параллельно1, пока не начинают модифицировать один и тот же участок памяти. К примеру, операции добавления узлов в красно-чёрное дерево (анимация в заголовке) способны работать параллельно в нескольких потоках.
Скрытый текст
/* Move item from one list to another */
int move(list *from, list *to) {
    __transaction_atomic {
        node *n = pop(from);
        push(to, n);
    }
}

Читать дальше →
Всего голосов 79: ↑78 и ↓1+77
Комментарии34

Разъяснение http2

Время на прочтение25 мин
Количество просмотров195K
На днях Даниэль Штенберг, один из участников группы HTTPbis IETF, которая ведёт разработку протокола http2, опубликовал в своём блоге крайне интересный документ «http2 explained». Небольшой PDF-документ на 26 страницах весьма доступным языком рассказывает о предпосылках и деталях реализации протокола http2.

Как мне кажется, на сегодняшний день это одно из самых лучших разъяснений о том, что такое протокол http2, зачем он нужен, как он повлияет на веб-разработку и какое будущее ждёт Интернет в связи с его появлением. Думаю, что всем людям, причастным к веб-разработке и веб-строению, информация будет полезна, ведь ожидается, что стандарт http2 будет принят уже в июне этого года после завершающей встречи группы HTTPbis в Нью Йорке.
Читать дальше →
Всего голосов 162: ↑153 и ↓9+144
Комментарии51

Методы распознавания текста

Время на прочтение6 мин
Количество просмотров118K
Буквально вчера прошла 61-я студенческая научная конференция в Южном Федеральном Университете в городе Таганроге, на которой я представлял доклад по методам распознавания текста на графических изображениях. И хотелось бы поделиться этим с еще большим количеством слушателей и читателей. Кому интересно почитать про велосипеды студента-новичка в этой области, прошу под кат.
Картинки и кусочки кода присутствуют.
Читать про велосипеды
Всего голосов 22: ↑13 и ↓9+4
Комментарии6

Распознавание автомобильных номеров в деталях

Время на прочтение9 мин
Количество просмотров151K
image
Настало время подробно рассказать, как работает наша реализация алгоритма распознавания номеров: что оказалось удачным решением, что работало весьма скверно. И просто отчитаться перед Хабра-пользователями — ведь вы с помощью Android приложения Recognitor помогли нам набрать приличного размера базу снимков номеров, снятых совершенно непредвзято, без объяснения как снимать, а как нет. А база снимков при разработке алгоритмов распознавания самое важное!
Читать дальше →
Всего голосов 69: ↑69 и ↓0+69
Комментарии40

Анатолий Вассерман: о будущем, интеллекте и социализме

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


Анатолий Александрович Вассерман широко известный в России политолог и мыслитель. Оставивший свой след в русскоязычном интернет-фольклоре как «Онотоле», ставший объектом многочисленных шуток и анекдотов, он продолжает сохранять чувство юмора и остроту ума. Специально для нашего блога на Хабре, мы решили взять интервью у Анатолия Александровича, поговорить со знаменитым интеллектуалом об IT, науке, памяти, будущем и даже политике.
о программировании, книгах и гаджетах в жилетке читайте под катом
Всего голосов 192: ↑114 и ↓78+36
Комментарии160

Многомодульный Java-проект с Gradle. Шаг за шагом

Время на прочтение11 мин
Количество просмотров190K
Очень много статей о Gradle написано. И со своей стороны хотелось бы добавить в копилку такую пошаговую инструкцию, прочтение которой, я надеюсь, позволит тем, кто плохо знаком с Gradle, “распробовать” и продолжить самостоятельно изучать этот инструмент.

Данная статья не будет подробно описывать такие темы, как плагины gradle (plugin), задачи (task), зависимости (dependencies), автоматическое тестирование и прочие прелести этого сборщика проектов. Во-первых, каждая тема заслуживает отдельной статьи или даже серии статей, а во-вторых, на эти темы уже есть статьи на хабре, например: Gradle: Tasks Are Code, Gradle: Better Way To Build. А еще на официальном сайте Gradle есть прекрасно написанный Gradle User Guide. Я же cфокусирую внимание на непосредственном решении поставленной задачи, и все сопутствующие темы будут описаны в рамках этой самой задачи.
Сначала определимся с целью, что же мы хотим получить на выходе? А цель указана в заголовке статьи. Мы хотим получить проект с несколькими модулями, который собирается с помощью Gradle. И так, приступим.
Читать дальше →
Всего голосов 25: ↑23 и ↓2+21
Комментарии18

Факторный анализ для чайников

Время на прочтение3 мин
Количество просмотров97K
Думаю многие из нас, хотя бы однажды интересовались искусственным интеллектом и нейронными сетями. В теории нейронных сетей далеко не последнее место занимает факторный анализ. Он призван выделить так называемые скрытые факторы. У этого анализа есть много методов. Особняком стоит метод главных компонент, отличительной особенностью которого является полное математическое обоснование. Признаться честно, когда я начал читать статьи по приведенным выше ссылкам — стало не по себе от того, что я ничего не понимал. Мой интерес поутих, но, как это обычно бывает, понимание пришло само по себе, нежданно-негаданно.
Поехали..
Всего голосов 61: ↑52 и ↓9+43
Комментарии17

Создание Zero Player Game, используя libgdx

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

Идея


  1. Игровое пространство — клетчатое поле ограниченное рамкой
  2. Существующие типы клеток:
    • Пустая клетка — белый
    • Стена — чёрный
    • Зверь — красный
    • След — коричневый
    • Дом — зелёный
  3. Перемещение зверя оставляет неисчезающий след
  4. При запуске генерируется лабиринт
  5. Зверь знает состояние соседних клеток и на основании этого строит карту при перемещении
  6. При перемещении зверь расходует силы, которые восстанавливаются в доме(+5) или на любой клетке(+1)
  7. При столкновении звери объединяются в стаи(дома переносятся в соседние точки), если несколько зверей одновременно отдыхают в доме их карты объединяются
  8. (Не реализовано)Разные «кланы» случайным образом объединяются или воюют
  9. (Не реализовано)Генетический алгоритм для различных поведений зверей, случайно перемешивающиеся при размножении(+мутации), более перспективный вид выживет в войнах

Читать дальше →
Всего голосов 30: ↑25 и ↓5+20
Комментарии2

Терминологию master/slave в фреймворке django заменили на leader/follower из соображений политкорректности

Время на прочтение1 мин
Количество просмотров63K
Сегодня в мастер ветку Django приняли совершенно дикий с точки зрения логики pull request.

Во всем проекте, включая код, общепринятые термины master/slave были изменены на leader/follower.

Вот как обосновал это автор патча fcurella:
Документация и некоторые тесты содержат ссылки на master/slave конфигурацию БД.
Несмотря на то что эта терминология использовалась достаточно долгое время, эти термины могут нести расистcкую подоплеку для пользователей.
Этот патч заменяет все использования master и slave на leader и follower.

Видимо Мизулина это достаточно интернациональный термин, а не только российский.
Всего голосов 221: ↑206 и ↓15+191
Комментарии254

Документ в перспективе, что с ним делать? Корректировка результатов бесконтактного сканирования и фотографий документов

Время на прочтение7 мин
Количество просмотров18K
Идея данной статьи возникла у нас после прочтения статьи «Как работает автоматическое выделение документа на изображении в программе ABBYY FineScanner?», опубликованной на Хабре компанией ABBYY, в которой подробно описан алгоритм определения границ документа на образе, полученном камерой мобильного телефона.
Статья, безусловно, интересная и полезная. Мы, «с чувством глубокого удовлетворения» отметили, что ABBYY использует в работе те же математические алгоритмы, что и мы, и благоразумно опускает некоторые детали, без которых точность определения границ документа существенно снижается.
Думаю, что по прочтении статьи у некоторой части читателей возник резонный вопрос: «А что делать с обнаруженным на снимке документом дальше?» Отвечу словами Чеширского Кота Алисе: «А куда ты хочешь прийти?» Если конечная цель – «вытащить» из снимка текстовые данные, тогда нужно максимально облегчить задачу системе распознавания. Для этого в первую очередь нужно исправить перспективные искажения, бич всех фотоснимков документов «от руки». Если не решить эту проблему, попытка распознать данные может дать результат, сравнимый с попытками распознавания капчи. На фрилансерских сайтах с завидной регулярностью появляются «верующие» в победу машинного интеллекта над капчой за мелкий прайс. Блажен, кто верует, но мы сейчас не об этом.
Итак, в данной статье мы попытаемся подхватить эстафету у ABBYY и рассказать на своем опыте, как можно с минимальными затратами привести призмообразный, в лучшем случае, документ, который мы идентифицировали на снимке (спасибо ABBYY за науку), к прямоугольной форме, желательно с сохранением исходных пропорций. Экзотические случаи, вроде пятиугольных или овальных документов мы пока не рассматриваем, хотя, вопрос интересный.
Читать дальше →
Всего голосов 37: ↑35 и ↓2+33
Комментарии12

Дорог ли native метод? «Секретное» расширение JNI

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

Для чего Java-программисты прибегают к native методам? Иногда, чтобы воспользоваться сторонней DLL библиотекой. В других случаях, чтобы ускорить критичный алгоритм за счет оптимизированного кода на C или ассемблере. Например, для обработки потокового медиа, для сжатия, шифрования и т.п.

Но вызов native метода не бесплатен. Порой, накладные расходы на JNI оказываются даже больше, чем выигрыш в производительности. А всё потому, что они включают в себя:
  1. создание stack frame;
  2. перекладывание аргументов в соответствии с ABI;
  3. оборачивание ссылок в JNI хендлы (jobject);
  4. передачу дополнительных аргументов JNIEnv* и jclass;
  5. захват и освобождение монитора, если метод synchronized;
  6. «ленивую» линковку нативной функции;
  7. трассировку входа и выхода из метода;
  8. перевод потока из состояния in_Java в in_native и обратно;
  9. проверку необходимости safepoint;
  10. обработку возможных исключений.

Но зачастую native методы просты: они не бросают исключений, не создают новые объекты в хипе, не обходят стек, не работают с хендлами и не синхронизованы. Можно ли для них не делать лишних действий?

Да, и сегодня я расскажу о недокументированных возможностях HotSpot JVM для ускоренного вызова простых JNI методов. Хотя эта оптимизация появилась еще с первых версий Java 7, что удивительно, о ней еще никто нигде не писал.
Читать дальше →
Всего голосов 48: ↑47 и ↓1+46
Комментарии23

Программирование-по-Контракту в Java

Время на прочтение31 мин
Количество просмотров52K
Добрый день.
В рамках детальной проработки курса удаленного образования «Java Core» я пишу серию публикаций и делаю несколько переводов наиболее популярных статей.

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

Сейчас я предлагаю Вам на рассмотрение мой перевод «Programming With Assertions» с некоторыми комментариями.

Оригинальная публикация не только детально объясняет варианты использования ключевого слова assert в Java и то, как реализована поддержка данного механизма на уровне загрузки классов, но также является достаточно неформальным введением в Разработку-по-Контракту (Design-by-Contract).




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



Программирование с утверждениями (oracle.com: Programming With Assertions)

Утверждение (assert) — это оператор (statement) языка программирования Java, который позволяет вам проверить свои предположения о программе. Например, если вы пишете метод, вычисляющий скорость частицы, можно «утверждать», что расчетная скорость меньше скорости света.

Каждое утверждение содержит логическое выражение, которое, по вашему мнению, будет верным в момент выполнения. В противном случае, система выбросит исключение. Проверяя, что логическое выражение на самом деле верно, утверждение (assert) подтверждает ваши предположения (ожидания) о поведении программы, увеличивая уверенность в том, что программа не содержит ошибок.
Читать дальше →
Всего голосов 28: ↑24 и ↓4+20
Комментарии2

Тестовое задание моей мечты

Время на прочтение3 мин
Количество просмотров61K
Около полугода назад я стал замечать, что доля javascript’a в моих личных проектах заметно выросла. Выполнять роль заурядного пхпэшника на моём нынешнем рабочем месте стало не в радость. В то же время, создание одностраничных приложений и изучение премудростей фронтэнда доставляло куда больше удовольствия.

А ведь работа должна приносить удовольствие, правда? В итоге появилось стойкое желание сменить поле деятельности и переквалифицироваться из стандартного “PHP Developer” в модного “Javascript/Frontend Ninja”.

Нашел подходящую контору, отправил CV, договорился о дате тестового задания. На тот момент я чувствовал себя достаточно подготовленным, всё-таки за плечами неплохое знание Backbone, парочка одностраничных приложений, эксперименты с Canvas, Google Maps, Node.js, Websockets и прочими. В общем было что показать.

Но тестовое задание приближалось и надо было готовиться. Первым делом я загуглил “javascript interview questions” и тут же прифигел. В голове завертелась мысль: “Почему все эти задания настолько оторваны от реального мира?”

Читать дальше →
Всего голосов 111: ↑80 и ↓31+49
Комментарии94

Хуки — это просто (часть 2)

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

Некоторое время назад я писал вводную статью о хуках (что это, зачем нужно, Hello world). Статья задумывалась простой, минималистичной и, вроде бы, такой и получилась. Единственный упрёк, который я услышал в комментариях — «Зачем же брать библиотеку Microsoft Detours, которая для коммерческого использования стоит 10 000$ ?». Замечание справедливое. В этой статье я приведу тот же пример с использованием другой библиотеки ценой примерно в 20 раз меньше (что уже вполне себе в рамках разумного) — madCodeHook.

Для лучшего понимания данной статьи рекомендуется сначала прочитать первую часть.
Читать дальше →
Всего голосов 25: ↑23 и ↓2+21
Комментарии12

Поиск работы Java Middle Developer (наблюдения и впечатления)

Время на прочтение3 мин
Количество просмотров61K
И вот настал момент, когда я твердо решила распрощаться с родной и уютной компанией-интегратором и найти работу поинтереснее. За три недели активного поиска получила массу впечатлений, коими и хотела бы поделиться.

Входные данные

Место действия – Москва. Мидл в заголовке поста — некая условность, в заголовке резюме значилось просто «Java разработчик». Опыта в Java – 1.5 года в пресловутом интеграторе, до этого 4+ года в PHP (думаю, подобная ситуация сейчас не редкость). Поскольку дети и ипотеки у меня отсутствуют, деньги были не решающим фактором – главное, интерес и потенциальное развитие.
Читать дальше →
Всего голосов 63: ↑51 и ↓12+39
Комментарии56

Денормализация деревьев

Время на прочтение3 мин
Количество просмотров12K
Очень часто за основу архитектуры приложения берётся дерево. Простой пример: есть страны, в странах — области, в областях — города, в городах — организации, в организациях — работники, товары или что-либо ещё. Использование дерева вполне логично и оправдано. Иерархичность такой системы показывает некая абстрактная таблица. Назовём её object:

CREATE TABLE object (
  id NUMBER(11),
  parent_id NUMBER(11),
  type VARCHAR2(16) NOT NULL,
  name VARCHAR2(255) NOT NULL,
  CONSTRAINT pk_object PRIMARY KEY (id),
  CONSTRAINT fk_object_parent FOREIGN KEY (parent_id) REFERENCES object (id) ON DELETE CASCADE ENABLE
);

Наполним её какими-нибудь данными:

id  |  parent_id  |  type     |  name
------------------------------------------------------
1   |  NULL       |  country  |  Россия
2   |  1          |  region   |  Московская область
3   |  1          |  region   |  Новосибирская область
4   |  2          |  city     |  Москва
5   |  3          |  city     |  Новосибирск

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

-- Выбрать все города России
SELECT *
  FROM object
    WHERE type = 'city'
    START WITH id = 1 CONNECT BY PRIOR id = parent_id;

-- Выбрать страну, в которой находится Новосибирск
SELECT *
  FROM object
    WHERE type = 'country'
    START WITH id = 5 CONNECT BY PRIOR parent_id = id;

Однако проблемы появляются, когда записей в таблице становится на столько много, что любой рекурсивный запрос выполняется минуты две, а то и больше. Менять всю архитектуру как-то поздновато… Тут-то нам на помощь и приходит денормализация дерева. В этой статье я расскажу об одном из способов такой денормализации.
Читать дальше →
Всего голосов 14: ↑12 и ↓2+10
Комментарии9

Заржавели мозги — перейди через мост. The Bridge by Ty Tailor

Время на прочтение3 мин
Количество просмотров49K
На Хабре полно математиков и физиков, которым будет интересно узнать об одной любопытной компьютерной игре «The Bridge». Она не вот чтобы прям свежая, я не ее автор и в тематику хабра она с трудом попадает, но я думаю что для этой инди-игры здесь найдутся почитатели. Уже минут 30 как я завершил прохождение зеркальной части игры — до сих пор под впечатлением, и хотел бы чтобы еще кто-то кроме меня остался доволен собой, математикой, Ньютоном и Эшером.

image

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

Дизайн и архитектура в ФП. Введение и Часть 1

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

Введение


В мире функционального программирования есть один большой пробел, а именно почти не освещена тема высокоуровневого дизайна больших приложений. Я решил для себя изучить этот вопрос. Есть ли существенные отличия дизайна приложений в ФП-мире от оного в мире императивном? Что такое «каноничный ФП-код»? Какие существуют идиомы разработки, есть ли смысл вообще говорить о паттернах проектирования в применении к ФП? Эти и другие важные вопросы часто вспыхивают то там, то здесь, но покамест мне не известно ни одной книги, аналогичной книге Банды Четырех. Вероятно, мои изыскания уже кто-то повторил, однако тем лучше: схожие результаты подтвердят правильность, иные — укажут на место в теории, которое необходимо доработать.
Читать дальше →
Всего голосов 34: ↑33 и ↓1+32
Комментарии41

Информация

В рейтинге
Не участвует
Откуда
Люберцы, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность