Обновить
994.05

Программирование *

Искусство создания компьютерных программ

Сначала показывать
Порог рейтинга
Уровень сложности

Наследование в Hibernate: выбор стратегии

Время на прочтение22 мин
Охват и читатели119K
Наследование является одним из основных принципов ООП. В то же время, значительное количество корпоративных приложений имеют в своей основе реляционные базы данных

Главное противоречие между объектно-ориентированной и реляционной моделями заключается в том, объектная модель поддерживает два вида отношений («is a» — “является”, и «has a» — “имеет”), а модели, основанные на SQL, поддерживают только отношения «has a».

Иными словами, SQL не понимает наследование типов и не поддерживает его.

Поэтому на этапе построения сущностей и схемы БД одной из главных задач разработчика будет выбор оптимальной стратегии представления иерархии наследования.

Всего таких стратегий 4:

1) Использовать одну таблицу для каждого класса и полиморфное поведение по умолчанию.

2) Одна таблица для каждого конкретного класса, с полным исключением полиморфизма и отношений наследования из схемы SQL (для полиморфного поведения во время выполнения будут использоваться UNION-запросы)

3) Единая таблица для всей иерархии классов. Возможна только за счет денормализации схемы SQL. Определять суперкласс и подклассы будет возможно посредством различия строк.

4) Одна таблица для каждого подкласса, где отношение “is a” представлено в виде «has a», т.е. – связь по внешнему ключу с использованием JOIN.

Можно выделить 3 главных фактора, на которые повлияет выбранная вами стратегия:

1) Производительность (мы используем “hibernate_show_sql”, чтобы увидеть и оценить все выполняемые к БД запросы)

2) Нормализация схемы и гарантия целостности данных (не каждая стратегия гарантирует выполнение ограничения NOT NULL)

3) Возможность эволюции вашей схемы

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

Итерируемый объект, итератор и генератор

Время на прочтение10 мин
Охват и читатели221K
Привет, уважаемые читатели Хабрахабра. В этой статье попробуем разобраться что такое итерируемый объект, итератор и генератор. Рассмотрим как они реализованы и используются. Примеры написан на Python, но итераторы и генераторы, на мой взгляд, фундаментальные понятия, которые были актуальны 20 лет назад и еще более актуальны сейчас, при этом за это время фактически не изменились.


Читать дальше →

36 материалов о нейросетях: книги, статьи и последние исследования

Время на прочтение8 мин
Охват и читатели122K
Что делать, если хочется побольше узнать про нейронные сети, методы распознавания образов, компьютерное зрение и глубокое обучение? Один из очевидных вариантов — подыскать для себя какие-либо курсы и начать активно изучать теорию и решать практические задачи. Однако на это придется выделить значительную часть личного времени. Есть другой способ — обратиться к «пассивному» источнику знаний: выбрать для себя литературу и погрузиться в тему, уделяя этому всего полчаса-час в день.

Поэтому, желая облегчить жизнь себе и читателям, мы сделали краткую подборку из книг, статей и текстов по направлению нейросетей и глубокого обучения, рекомендуемых к прочтению резидентами GitHub, Quora, Reddit и других платформ. В неё вошли материалы как для тех, кто только начинает знакомство с нейротехнологиями, так и для коллег, желающих расширить свои знания в этой области или просто подобрать «легкое чтение» на вечер.

Читать дальше →

RailsClub 2017: Интервью с Richard Schneeman

Время на прочтение3 мин
Охват и читатели1.5K
Привет!

Мы вовсю готовимся к предстоящей конференции RailsClub 2017 (все случится 23 сентября) и беседуем с нашими спикерами о жизни и программировании. Сегодня Михаил Моргунов разговаривал с Richard Schneeman из Heroku, Ruby Hero 2016, Топ 50 Rails contributors.

image

Почему в докладе ты хочешь поговорить о потоках в Ruby?
Читать дальше →

ИИ для покера: как научить алгоритмы блефовать

Время на прочтение16 мин
Охват и читатели45K
image

О том как совершенствуется искусственный интеллект, можно судить по обычным играм. За последние два десятилетия алгоритмы превзошли лучших мировых игроков: сначала пали нарды и шашки, затем шахматы, «Своя Игра» (Jeopardy!), в 2015 году — видеоигры Atari и в прошлом году — Го.


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


Но как обстоит дело с играми с неполной информацией?


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

Читать дальше →

Как создать расистский ИИ, даже не пытаясь. Часть 2

Время на прочтение9 мин
Охват и читатели8.2K
В первой статье мы успели осознать, как легко и непринужденно ИИ впитывает человеческие предрассудки в логику своих моделей. Как я и обещала, выкладываю вторую часть перевода, в которой мы разберемся, как измерить и ослабить влияние расизма в ИИ с помощью простых методов.


Напомню: мы закончили на том, что наш классификатор считал идею пойти в итальянский ресторан в 5 раз лучше, чем в мексиканский.
Читать дальше →

Встраиваем WebRTC плеер для живых трансляций с вебкамер и IP камер

Время на прочтение4 мин
Охват и читатели11K

Всем известно, каким образом внедряется обычный плеер для видеороликов (VOD — видео по требованию). Как правило, это плеер, который скачивает контент фрагментами по HTTP и играет эти фрагменты в <video/> элементе браузера.

В этой статье мы расскажем о внедрении WebRTC-плеера для воспроизведения живых (Live) потоков с веб-камер и IP камер.
Читать дальше →

Настоящий Offline Perfect Forward Secrecy для ваших продуктов

Время на прочтение6 мин
Охват и читатели5.9K
Привет, %username%!


Что может быть проще, чем отправить зашифрованное сообщение собеседнику?

Берём его публичный ключ, свой приватный, считаем Diffie-Hellman, загоняем после KDF результат в какой-нибудь AES, и готово. Но, если один из приватных ключей украдут, всё, весь перехваченный до этого трафик будет без проблем расшифрован.

Мы расскажем как с этим борются современные мессенджеры и транспортные протоколы, а так же дадим вам инструмент для внедрения PFS в свои продукты.
Читать дальше →

Используйте Stream API проще (или не используйте вообще)

Время на прочтение7 мин
Охват и читатели191K

С появлением Java 8 Stream API позволило программистам писать существенно короче то, что раньше занимало много строк кода. Однако оказалось, что многие даже с использованием Stream API пишут длиннее, чем надо. Причём это не только делает код длиннее и усложняет его понимание, но иногда приводит к существенному провалу производительности. Не всегда понятно, почему люди так пишут. Возможно, они прочитали только небольшой кусок документации, а про другие возможности не слышали. Или вообще документацию не читали, просто видели где-то пример и решили сделать похоже. Иногда это напоминает анекдот про «задача сведена к предыдущей».


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

Читать дальше →

RustGo: вызов Rust из Go с почти нулевым оверхедом

Время на прочтение21 мин
Охват и читатели12K

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


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


Этот пост о слегка неадекватном эксперименте по вызову Rust кода из Go в попытке сделать это настолько быстро, чтобы могло сравнится с вызовом ассемблера. Вам не нужно знать Rust или про внутренности компилятора, достаточно понимать, что такое линкер.

Читать дальше →

Какой язык программирования выбрать для работы с данными?

Время на прочтение12 мин
Охват и читатели87K


У начинающего специалиста по данным (data scientist) есть возможность выбрать один из множества языков программирования, который поможет ему быстрее освоить данную науку.

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

Наглядное объяснение чисел с плавающей запятой

Время на прочтение4 мин
Охват и читатели248K
image

В начале 90-х создание трёхмерного игрового движка означало, что вы заставите машину выполнять почти не свойственные ей задачи. Персональные компьютеры того времени предназначались для запуска текстовых процессоров и электронных таблиц, а не для 3D-вычислений с частотой 70 кадров в секунду. Серьёзным препятствием стало то, что, несмотря на свою мощь, ЦП не имел аппаратного устройства для вычислений с плавающей запятой. У программистов было только АЛУ, перемалывающее целые числа.

При написании книги Game Engine Black Book: Wolfenstein 3D я хотел наглядно показать, насколько велики были проблемы при работе без плавающей запятой. Мои попытки разобраться в числах с плавающей запятой при помощи каноничных статей мозг воспринимал в штыки. Я начал искать другой способ. Что-нибудь, далёкое от $(-1)^S * 1.M * 2^{(E-127)}$ и их загадочных экспонент с мантиссами. Может быть, в виде рисунка, потому что их мой мозг воспринимает проще.

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

7 правил хорошего тона при написании Unit-тестов

Время на прочтение4 мин
Охват и читатели40K

“Хорошими манерами обладает тот,
кто наименьшее количество людей
ставит в неловкое положение.”
Дж. Свифт


Привет, коллеги! Сегодня я бы хотел поговорить о Unit-тестировании и некоторых “правилах” при их написании. Конечно, они неформальные и не обязательны к выполнению, но при их соблюдении всем будет приятно и легко читать и поддерживать тесты, которые вы написали. Мы в Wrike видели достаточно Unit-тестов, чтобы понять основные проблемы, которые возникают при их написании и поддержке, и сформулировать несколько правил для их предотвращения.

Читать дальше →

Ближайшие события

Создание языка программирования с использованием LLVM. Часть 9: Добавляем отладочную информацию

Время на прочтение32 мин
Охват и читатели7.7K
Оглавление:

Часть 1: Введение и лексический анализ
Часть 2: Реализация парсера и AST
Часть 3: Генерация кода LLVM IR
Часть 4: Добавление JIT и поддержки оптимизатора
Часть 5: Расширение языка: Поток управления
Часть 6: Расширение языка: Операторы, определяемые пользователем
Часть 7: Расширение языка: Изменяемые переменные
Часть 8: Компиляция в объектный код
Часть 9: Добавляем отладочную информацию
Часть 10: Заключение и другие вкусности LLVM

9.1. Введение


Добро пожаловать в главу 9 руководства “Создание языка программирования с использованием LLVM”. В главах с 1 по 8, мы построили маленький язык программирования с функциями и переменными. Что случится, если что-то пойдёт не так, как тогда отлаживать программу?
Читать дальше →

Идеальная ОС: переосмысление операционных систем для десктопа

Время на прочтение17 мин
Охват и читатели41K
TL;DR: К концу этого эссе я надеюсь убедить вас в следующих фактах. Во-первых, что современные десктопные операционные системы никуда не годятся. Они раздутые, тормознутые и напичканы легаси-хламом, а кое-как работают только благодаря закону Мура. Во-вторых, что инновации в десктопных ОС прекратились около 15 лет назад, а основные игроки вряд ли собираются много вкладывать в них снова. И наконец, я надеюсь убедить вас, что мы можем и должны начать с нуля, усвоив уроки прошлого.

«Современные» десктопные ОС раздуты


Возьмём Raspberry Pi. За 35 долларов я могу купить отличный компьютер с четырьмя процессорными ядрами, каждое на частоте более гигагерца. У него также есть 3D-ускоритель, гагабайт оперативки, встроенные WiFi с Bluetooth и Ethernet. За 35 баксов! И всё-таки для многих задач, которые я хочу на нём запустить, Raspberry Pi ничем не лучше компьютера на 66 мегагерц, который был у меня в колледже.


Читать дальше →

Новости онлайн-курсов Mail.Ru Group: «Программирование на Python»

Время на прочтение5 мин
Охват и читатели41K


Вчера мы запустили на Coursera новый онлайн-курс «Программирование на Python» совместно с МФТИ, чтобы научить всех желающих программировать на этом языке. Курс читают разработчики, применяющие Python в проектах, которыми ежедневно пользуются миллионы людей. Курс покрывает все необходимые для ежедневной работы программиста темы, а также рассказывает про многие особенности языка, которые часто опускают при его изучении.

BigDL: глубинное обучение — к услугам пользователей больших данных и исследователей данных

Время на прочтение4 мин
Охват и читатели3.9K
Большие данные и их анализ играют важнейшую роль в современном мире, где повсеместно используются сети и электронные устройства. Идет непрерывное объединение возможностей больших данных, аналитики и машинного/глубинного обучения. В декабре 2016 года мы создали BigDL — распределенную библиотеку глубинного обучения с открытым исходным кодом для Apache Spark. Цель создания этой библиотеки — объединение сообщества глубинного обучения и сообщества больших данных. Далее в этой статье приводится описание недавних усовершенствований в выпуске BigDL 0.1.0 (а также в предстоящем выпуске 0.1.1).


Читать дальше →

Удобное использование Redux в vue-компонентах

Время на прочтение2 мин
Охват и читатели9.5K
vue mixinsНедавно перешел с PolymerJS на VueJS для некоторых задач. Совместно с polymer использовал Redux через библиотеку polymer-redux. Поэтому вся бизнес-логика уже была сформирована на уровне redux store. Для связки vue и redux выбрал библиотеку vuedeux. В awesome vue в разделе redux представлена еще одна библиотека для связки с redux — revue, но мне показалось эффективней использовать именно vuedeux, за счет интеграции redux store непосредственно в «свой redux» для vue vuex, для возможного использования его в будущем.
Читать дальше →

Простенький скрипт поиска возможно осиротевших файлов проекта

Время на прочтение3 мин
Охват и читатели6K
Леность ли моя тому причиной или болезненная неприязнь к комбайнам, но у меня как-то не сложились отношения с большими толстыми довольными IDE. Довольствуюсь простым ламповым Geany и несколькими самописными скриптами, количество коих растёт по мере необходимости.

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

О некоторых таких скриптах решил попробовать писать сюда. Может, кому пригодятся (да и заточить под себя какой-нибудь из них всегда можно). Если нет — ругайтесь в комментариях, учту. Итак.
Читать дальше →

Selenium для всех: как мы учим QA-инженеров работать с автотестами

Время на прочтение9 мин
Охват и читатели87K


Привет, Хабр! Меня зовут Виталий Котов, я работаю в Badoo в отделе QA, занимаюсь автоматизацией тестирования, а иногда и автоматизацией автоматизации тестирования.


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

Читать дальше →

Вклад авторов