Pull to refresh
0
0
Никита Кузнецов @Braidner

User

Send message

Меняем Java на Scala. Базовое приложение

Reading time16 min
Views33K
Здравствуй, Хабр.

Лето на дворе, скоро отпуск и появилось немного свободного времени поделиться наработками, каким-то опытом по написанию Web приложений на Java платформе. Как основной язык я буду использовать Scala. Это будет похоже на небольшой гайд, как человеку с опытом Java постепенно начать использовать Scala и не отказываться от уже имеющихся у него наработок.

Это первая часть из серии статей, в которой мы уделим внимание базовой структуре приложения. Ориентирована на людей знающих Java, работавших со Spring, Hibernate, JPA, JSP и другими 3-4ех буквенными сокращениями. Я попытаюсь рассказать как максимально быстро и безболезненно начать использовать Scala в ваших проектах и по-другому проектировать ваше новое приложение. Все это будет вокруг проекта, который должен выполнять ряд требований:
1. Приложение полностью закрыто, работаем только после авторизации
2. Наличие удобного API (REST мы забудем (он уже история) и напишем что-то вроде Google AdWords API, со своим SQL like запросником)
3. Возможность запуска на сервере приложений так и без него
4. i18n
5. Миграция БД
6. Среда для разработки должна разворачиваться через Vagrant
7. И, по мелочи, логирование, развертывание…

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

Читать дальше →
Total votes 36: ↑27 and ↓9+18
Comments14

Аниматор из России работает над созданием 3D версии интро к Futurama

Reading time1 min
Views76K


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

Сейчас же аниматор работает над созданием 3D версии интро к сериалу, причем часть работы уже проделана. Это — самое начало вступления, выполненное весьма и весьма тщательно.

Читать дальше →
Total votes 131: ↑122 and ↓9+113
Comments48

Приводим в порядок css-код. Опыт Яндекса

Reading time6 min
Views89K
Всем привет!

Я работаю над фронтендом огромного проекта — поисковой выдачи Яндекса. И у нас, как и у любого другого большого веб-проекта, есть огромное количество css-кода и немаленькая команда, которая с ним взаимодействует.

Когда много людей, используя разные инструменты, пишут и редактируют css, со временем этот css может получиться очень запутанным, неконсистентым и в целом начинает выглядеть плохо. Например, кому-то удобнее писать вендорные префиксы в одном порядке, кому-то — в другом, кто-то ставит кавычки вокруг url, кто-то — нет, а кто-нибудь фикся срочную багу к релизу мог бы, к примеру, написать position: relative в начале блока свойств, незаметив что где-нибудь внизу между color и box-shadow, уже есть position: absolute, и долго гадать, почему у него ничего не работает.



Но несмотря на то, что все пишут код по-разному, у нас в репозитории идеальный порядок: css-код полностью консистентен, и прекрасно выглядит. Весь.

Как мы этого добились, можно прочитать под катом.
Читать дальше →
Total votes 174: ↑169 and ↓5+164
Comments70

Отправка уведомлений Zabbix в скайп (звонки со скайпа — бонусом)

Reading time7 min
Views23K
image

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

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

Тогда у меня и зародилась идея — «А давайте админам звонить в критических ситуациях!»

За реализацией и скриптами — прошу под кат.
Читать дальше →
Total votes 34: ↑27 and ↓7+20
Comments51

Создание API: в рамку и на стену

Reading time5 min
Views57K
Каждый программист — проектировщик API. Хорошие программы состоят из модулей, а протокол взаимодействия модулей — это тоже API. Хорошие модули используются повторно.

API — это большая сила и большая ответственность. У хорошего API будут благодарные пользователи; поддержка плохого превратится в кошмар.

Публичный API — не воробей, опубликуешь — не уберешь. Есть только одна попытка сделать все правильно, поэтому постарайся.

API должно быть легко использовать, но сложно использовать неправильно. Сделать что-то простое с помощью такого API должно быть просто; сложное — возможно; сделать что-то неправильно должно быть невозможно, или, по крайней мере, трудно.

API должен описывать сам себя. Изучение кода на таком API не вызывает желания читать комментарии. Вообще, комментарии редко нужны.

Перед разработкой API собери требования с долей здорового скептицизма. Осознай общие задачи и реши их.

Оформляй требования как шаблоны использования API. Сверяйся с ними в процессе проектирования.
Читать дальше →
Total votes 154: ↑143 and ↓11+132
Comments97

Видео-курс по Swift на русском языке

Reading time1 min
Views115K
Здравствуй, Хабр!

Мы сделали видео-уроки по языку Swift на основе бесплатной книги The Swift Programming Language от Эппл.



Все 32 урока доступны на нашем сайте. Несколько уроков – под катом.
Читать дальше →
Total votes 146: ↑129 and ↓17+112
Comments62

Секретная служба США покупает софт, распознающий сарказм в соцсетях

Reading time1 min
Views53K


В заказе, выложенном онлайн в понедельник, СС описывает потребность в сервисе, способном, среди прочего, анализировать большие объёмы данных из социальных медиа и визуализировать результат. Распознавание сарказма — только одна из многочисленных функций требуемого софта, но именно она привлекла внимание журналистов «Вашингтон пост», заголовки в котором звучат (в тестовых, надо полагать, целях): «Секретной службе нужен софт, который распознаёт сарказм в социальных сетях. (Ага, удачи)» и «Секретной службе нужен софт, который распознаёт сарказм в социальных сетях. Не сомневаемся, что это сработает».
Читать дальше →
Total votes 109: ↑85 and ↓24+61
Comments80

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

Reading time23 min
Views436K
Это первая часть статьи, посвященной такому языковому механизму 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 или его потомками.
Читать дальше →
Total votes 67: ↑47 and ↓20+27
Comments24

Умный дом — дешево и сердито

Reading time3 min
Views176K
Всю свою сознательную жизнь мечтал сделать если уж не весь мир, то хотя бы свое собственное жилище похожим на дома из фантастических фильмов. Чтобы, заходя после тяжелого трудового дня домой, мне заботливо включали свет, вежливо здоровались, сообщали о происшествиях, а на выходе предупреждали о погоде за бортом и закрывали за мной дверь. Чтобы мне не приходилось идти, запинаясь, в темноте к кровати, а можно было бы лечь, и только потом выключить свет со своего гаджета, который всегда под рукой.

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

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

Но для начала я бы хотел вам рассказать про аппаратную часть «рабочей лошадки» дома – RC-2(room controller). Я давно пишу прошивки под AVR МК, поэтому в качестве мозга нашего контроллера будет известная Atmega 8-16PU, которая есть во всех магазинах радиодеталей. Да, ее старший брат используется в уже надоевшей всем Arduino Uno, но мы будем держаться от нее подальше.
Читать дальше →
Total votes 57: ↑44 and ↓13+31
Comments89

Конструирование типов в Scala

Reading time5 min
Views9.5K
При построении многослойных («enterprise») систем часто оказывается, что создаются ValueObject'ы (или case class'ы), в которых хранится информация о каком-либо экземпляре сущности, обрабатываемом системой. Например, класс

case class Person(name: String, address: Address)


Такой способ представления данных в системе обладает как положительными свойствами:
  • строго типизированный доступ к данным,
  • возможность привязки метаинформации к свойствам с помощью аннотаций,


так и некоторыми недостатками:
  • если сущностей много, то таких классов также становится довольно много, а их обработка требует много однотипного кода (copy-paste);
  • потребности отдельных слоёв системы в метаинформации могут быть представлены аннотациями к свойствам этого объекта, но возможности аннотаций ограничены и требуют использования reflection'а;
  • если требуется представить данные не обо всех свойствах объекта сразу, то созданные классы использовать затруднительно;
  • затруднительно также представить изменение значения свойства (delta).


Мы хотим реализовать фреймворк, позволяющий создавать новые «классы» (типы, конструкторы этих типов, объекты новых типов) инкрементно, используя наши собственные «кирпичики». Попутно, пользуясь тем, что мы сами изготавливаем «кирпичики», мы можем достичь таких полезных свойств:
  • возможность описывать отдельные свойства сущностей (с указанием типа данных в этом свойстве и любой метаинформации, необходимой приложению, в форме, подходящей именно для этого приложения);
  • возможность оперировать со свойствами экземпляров строго типизированным образом (с проверкой типов на этапе компиляции);
  • представлять частичную/неполную информацию о значениях свойств экземпляра сущности, пользуясь объявленными свойствами;
  • создавать тип объекта, содержащего частичную информацию о свойствах экземпляра сущности. И использовать этот тип наравне с другими типами (классами, примитивными типами и др.).

Читать дальше →
Total votes 16: ↑14 and ↓2+12
Comments8

Spring изнутри. Этапы инициализации контекста

Reading time11 min
Views350K


Доброго времени суток уважаемые хабравчане. Уже 3 года я работаю на проекте в котором мы используем Spring. Мне всегда было интересно разобраться с тем, как он устроен внутри. Я поискал статьи про внутреннее устройство Spring, но, к сожалению, ничего не нашел.

Всех, кого интересует внутреннее устройство Spring, прошу под кат.
Читать дальше →
Total votes 57: ↑53 and ↓4+49
Comments16

Оставьте ссылку на свой профиль — и добавьте к себе одного хабражителя

Reading time3 min
Views30K
image Привет!
Всё просто. Вы берёте и пишете, кто вы, что делаете, и оставляете ссылку на свой профиль. Или на свой проект.

Причин две:
  • Во-первых, меня регулярно просят посоветовать дизайнера, художника, разработчика и так далее. Я не знаю другого способа сделать это лучше.
  • Во-вторых, я что-то реально опасаюсь перспектив развития Рунета, и поэтому хочу соединить друг с другом напрямую как можно больше людей. Добавляйтесь в профили к тем, кто вам близок.
Читать дальше →
Total votes 147: ↑106 and ↓41+65
Comments314

Перевод учебника по алгоритмам

Reading time1 min
Views166K


Рад сообщить, что вышел перевод отличнейшего учебника Дасгупты, Пападимитриу, Вазирани «Алгоритмы», над которым я работал последние несколько лет. В книге многие алгоритмы объяснены гораздо короче и проще, чем в других учебниках: с одной стороны, без излишнего формализа, с другой — без потери математической строгости. Откройте книгу на каком-нибудь известном вам алгоритме и убедитесь в этом. =)

В общем, угощайтесь: печатный вариант перевода, электронный вариант перевода (PDF), печатный вариант оригинала, электронный вариант оригинала (PDF).
Читать дальше →
Total votes 323: ↑321 and ↓2+319
Comments109

Imagine Cup 2014 или первый опыт создания игры

Reading time7 min
Views13K
Девять месяцев назад у меня начался 2 курс университетской жизни: занимался спортом, учился, но не было никакой работы или большого увлечения, за которыми я бы проводил много времени, разве что видео игры.

Но спустя пару месяцев узнал, что у нас на кафедре работают ребята над созданием своих собственных игр. Я был заинтересован, ведь это было круто, наплыло сразу столько вопросов и идей в голове: «Как они это делают? А я ведь и сам хотел бы сделать свою игру. Как работает команда при создании игры? Как поддерживать атмосферу?» и т.д.

Когда посмотрел на то, что они уже сделали, не думая, написал одному из ребят в социальной сети, он был преподавателем по программированию, поэтому я был с ним знаком. Я долго ждал ответа и дождался, мы около часа разговаривали: заваливал его интересующими меня вопросами, а он охотно на них отвечал, это чувствовалось. Наконец я сказал: «Я ХОЧУ ДЕЛАТЬ ИГРЫ С ВАМИ! Возьмёте меня к себе? Я умею программировать!», на что он сказал, что они подумают с командой и примут решение. Не прошло и двух дней, как мне сказали: «Мы берём тебя!», я был очень доволен.

И вот уже через несколько дней мы все собираемся в уютной кафешке в центре города для того, чтобы обсудить план своих действий, текущие наработки и идеи. Я с увлечением смотрел на то, как они все обсуждают, показывают рисунки различных прототипов – все это было для меня новым и очень увлекательным. Мы решили, что будем работать на новом для нас игровом движке Unity3D, потому что он мультиплатформенный и постоянно растёт функционально. Решение было вполне аргументировано, ребята ранее работали с множеством других аналогов и даже писали свой движок на основе XNA. Мне ничего не оставалось, как согласиться.

Долгое время пришлось осваивать базовые функции и операции в Unity. Но постепенно все встало на свои места и начались получаться первые наработки.

Изначально я научился создавать 3D-местности: задаёшь размеры для плоскости, а затем на ней вырисовываешь различными кисточками горы и впадины. Можно создать очень реалистичный рельеф, затем наносишь текстуры, создаёшь воду, небо, солнце, и твой маленький виртуальный мир готов. Сначала я не мог поверить, что все так просто. Постепенно круг моих задач рос: работа с камерами, создание управления…

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

Но, в конце концов, мы пришли к тому, что игра потребует очень много времени, сил и средств, поэтому мы решили «заморозить» текущий проект игры и начали думать над созданием новой, более «реальной» для нашего текущего уровня в разработке.

Ну вот что у нас получилось:



Читать дальше →
Total votes 28: ↑22 and ↓6+16
Comments4

Анализ утечек PermGen памяти в Java

Reading time7 min
Views57K

О чем речь?


Кто занимался веб-разработкой на Java, наверняка сталкивался с такой проблемой как java.lang.OutOfMemoryError: PermGen space. Возникает она, как правило, после перезапуска веб-приложения внутри сервера без перезапуска самого сервера. Перезапуск веб-приложения без перезапуска сервера может понадобиться в процессе разработки, чтобы не ждать лишнее время запуска самого сервера. Если у вас задеплоено несколько веб-приложений, перезапуск всего сервера может быть гораздо дольше перезапуска одного веб-приложения. Или же весь сервер просто нельзя перезапускать, так как другие веб-приложения используются. Первое решение, которое приходит на ум – увеличить максимальный объем PermGen памяти, доступный JVM (сделать это можно опцией -XX:MaxPermSize), но это лишь отсрочит падение, после нескольких перезапусков вы снова получите OutOfMemoryError. Хорошо было бы иметь возможность сколько угодно раз перезапускать и передеплоивать веб-приложение на работающем сервере. О том, как побороть PermGen, и пойдет дальнейший разговор.

Читать дальше →
Total votes 33: ↑32 and ↓1+31
Comments20

10 способов сделать резервную копию в PostgreSQL

Reading time5 min
Views271K
Многие разговоры про бэкапы начинаются с присказки что люди делятся на две категории… так вот я отношусь к тем людям которые делают бэкапы. Правильно настроенное резервное копирование и проверка резервных копий укрепляет сон. А наличие заранее написаных и проигранных инструкций по восстановлению вообще укрепляет пищеварение и иммунитет. Так вот, за время работы с PostgreSQL мне довелось часто настраивать резервное копирование, при этом условия и требования были самые разные. Однако при этом набор инструментов за редким исключением оставался неизменным. В этой статье поделюсь своим опытом в деле, как можно брать резервные копии PostgreSQL.
image

Читать дальше →
Total votes 41: ↑39 and ↓2+37
Comments18

Гарнитура AfterShokz Bluez. Звук напрямую в мозг

Reading time7 min
Views84K
Не секрет, что технология передачи звука через кость существует уже довольно давно. Однако, в массовых продуктах впервые мы столкнулись с этим в Google Glass. Все же помнят, что там нет никакого наушника, который вставляется в ухо, а есть лишь вибрационная пластина, которая передаёт звук практически напрямую в голову. Оказывается, это не единственное решение на рынке и уже сейчас есть гарнитура, которая работает по такому же принципу. И, несмотря на ужасающее название «костная гарнитура», модель Aftershokz Bluez действительно передаёт звук и прекрасно функционирует. Давайте же рассмотрим её подробнее.


Читать дальше →
Total votes 55: ↑48 and ↓7+41
Comments83

Как понять NullPointerException

Reading time5 min
Views281K
Эта простая статья скорее для начинающих разработчиков Java, хотя я нередко вижу и опытных коллег, которые беспомощно глядят на stack trace, сообщающий о NullPointerException (сокращённо NPE), и не могут сделать никаких выводов без отладчика. Разумеется, до NPE своё приложение лучше не доводить: вам помогут null-аннотации, валидация входных параметров и другие способы. Но когда пациент уже болен, надо его лечить, а не капать на мозги, что он ходил зимой без шапки.

Итак, вы узнали, что ваше приложение упало с NPE, и у вас есть только stack trace. Возможно, вам прислал его клиент, или вы сами увидели его в логах. Давайте посмотрим, какие выводы из него можно сделать.
Читать дальше →
Total votes 51: ↑36 and ↓15+21
Comments36

Бесплатная книга «Game Programming Patterns» от программиста Electronic Arts Боба Найстрома

Reading time1 min
Views84K
Боб Найстром, программист, проработавший восемь лет в компании Electronic Arts, закончил работу над книгой «Game Programming Patterns». Она доступна бесплатно на сайте gameprogrammingpatterns.com. Писать книгу Боб Найстром начал четыре года назад. Большинство книг, посвящённых программированию игр, говорит он во введении, либо подробно раскрывают какой-то из аспектов создания игры — физический движок, графику, искусственный интеллект, либо описывают процесс создания игры в определённом жанре от начала до конца. Ему очень не хватало книги, рассказывающей о решении типовых задач, возникающих перед программистом, книги достаточно универсальной, не привязанной к жанрам или конкретным подсистемам игр. И поэтому он решил написать такую книгу сам.
Читать дальше →
Total votes 95: ↑94 and ↓1+93
Comments30

JSR 133 (Java Memory Model) FAQ (перевод)

Reading time25 min
Views148K
Добрый день.
В рамках набора на курс «Multicore programming in Java» я делаю серию переводов классических статей по многопоточности в Java. Всякое изучение многопоточности должно начинаться с введения в модель памяти Java (New JMM), основным источником от авторов модели является «The Java Memory Model» home page, где для старта предлагается ознакомится с JSR 133 (Java Memory Model) FAQ. Вот с перевода этой статьи я и решил начать серию.
Я позволил себе несколько вставок «от себя», которые, по моему мнению, проясняют ситуацию.
Я являюсь специалистом по Java и многопоточности, а не филологом или переводчиком, посему допускаю определенные вольности или переформулировки при переводе. В случае, если Вы предложите лучший вариант — с удовольствием сделаю правку.
Этот статья также подходит в качестве учебного материала к лекции «Лекция #5.2: JMM (volatile, final, synchronized)».

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

Ну и да, приходите учиться ко мне!


JSR 133 (Java Memory Model) FAQ


Jeremy Manson и Brian Goetz, февраль 2004

Содержание:
Что такое модель памяти, в конце концов?
Другие языки, такие как C++, имеют модель памяти?
Что такое JSR 133?
Что подразумевается под «переупорядочением» (reordering)?
Что было не так со старой моделью памяти?
Что вы подразумеваете под «некорректно синхронизированы»?
Что делает синхронизация?
Как может случиться, что финальная поля меняют значения?
How do final fields work under the new JMM?
Что делает volatile?
Решила ли новая модель памяти «double-checked locking» проблему?
Что если я пишу виртуальную машину?
Почему я должен беспокоиться?
Читать дальше →
Total votes 56: ↑51 and ↓5+46
Comments32

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity