Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
Работа с данными - это ключевая функция большинства приложений. Но работать с данными не так просто как кажется. С одной стороны, нам нужна производительность, с другой все best practices диктуют нам принцип persistence ignorance, с третьей еще и хочется писать красивый и понятный код. Как найти баланс между всем этим? Чем хороший IRepository отличается от плохого? Что такое CQRS и причем тут функциональное программирование? Об этом и пойдет речь, а так же немного граблей и личного опыта.
Сегодня многие фреймворки, такие как Prism или Autofac, позволяют разработчику организовать модульную структуру приложения. При этом часто бывает непонятно, для чего ещё нужны модули, кроме как для пресловутой "красоты архитектуры".
В рамках доклада я расскажу о том, какие существуют подходы к организации модульной структуры, в каких фреймворках они реализованы и для решения каких задач дает преимущество каждый подход.
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETDev2Dev
ASP.NET MVC простой и распространённый инструмент. Но строить на его основе большое веб-приложение не так просто. Туториалы не раскрывают проблем возникающих при росте проекта. Зачастую, изначально стройная архитектура размазывается с каждой следующей итерацией.
Я хочу поделиться своим опытом. Рассказать об основных проблемах и предложить выбранные мной решения.
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №9 "Безопасность баз данных". Лектор - Павел Щербинин.
Открывается лекция рассказом о резервном копировании (о логических и физических резервных копиях, о выборе данных для копирования). Затем определяется терминология для обсуждения дальнейших вопросов. После этого рассматриваются основы учётных записей: таблицы доступа, привилегии, виды записей. Обсуждаются SQL-injection, список смежных вершин (Adjacency Set), вложенное множество (Nested Set), материализованный путь (Materialized Path) и комбинированный подход.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
Работа с данными - это ключевая функция большинства приложений. Но работать с данными не так просто как кажется. С одной стороны, нам нужна производительность, с другой все best practices диктуют нам принцип persistence ignorance, с третьей еще и хочется писать красивый и понятный код. Как найти баланс между всем этим? Чем хороший IRepository отличается от плохого? Что такое CQRS и причем тут функциональное программирование? Об этом и пойдет речь, а так же немного граблей и личного опыта.
Сегодня многие фреймворки, такие как Prism или Autofac, позволяют разработчику организовать модульную структуру приложения. При этом часто бывает непонятно, для чего ещё нужны модули, кроме как для пресловутой "красоты архитектуры".
В рамках доклада я расскажу о том, какие существуют подходы к организации модульной структуры, в каких фреймворках они реализованы и для решения каких задач дает преимущество каждый подход.
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETDev2Dev
ASP.NET MVC простой и распространённый инструмент. Но строить на его основе большое веб-приложение не так просто. Туториалы не раскрывают проблем возникающих при росте проекта. Зачастую, изначально стройная архитектура размазывается с каждой следующей итерацией.
Я хочу поделиться своим опытом. Рассказать об основных проблемах и предложить выбранные мной решения.
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №9 "Безопасность баз данных". Лектор - Павел Щербинин.
Открывается лекция рассказом о резервном копировании (о логических и физических резервных копиях, о выборе данных для копирования). Затем определяется терминология для обсуждения дальнейших вопросов. После этого рассматриваются основы учётных записей: таблицы доступа, привилегии, виды записей. Обсуждаются SQL-injection, список смежных вершин (Adjacency Set), вложенное множество (Nested Set), материализованный путь (Materialized Path) и комбинированный подход.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Лекция 5. MapReduce в Hadoop (алгоритмы)Technopark
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №10 "Нереляционное решение в области баз данных — NoSQL". Лектор - Станислав Ступников.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №10 "Нереляционное решение в области баз данных — NoSQL". Лектор - Станислав Ступников.
Вводная часть посвящена определению и истории развития концепции NoSQL. Даются характеристики, рассказывается о способах использования. Рассматриваются виды NoSQL БД, теоретические основы NoSQL, а в конце лекции обсуждаются недостатки NoSQL-решений, а также проводится сравнение разных NoSQL-решений.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Лекция 1. Введение в Big Data и MapReduceTechnopark
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Лекция 3. Распределённая файловая система HDFSTechnopark
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
СУБД 2013 Лекция №1 "Введение и начало проектирования"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №1 "Введение и начало проектирования"
Лектор - Павел Щербинин.
В лекции обсуждаются значение и роли баз данных в IT, даются определения БД и СУБД. Затем рассказывается о реляционной модели данных, об основах реляционной алгебры. Далее говорится непосредственно о проектировании БД: каковы критерии оценки модели данных, особенности концептуального проектирования, этапы проектирования, что такое логическое проектирование. Остальная часть лекции посвящена типам данных MySQL: NULL, целые числа, числа с плавающей точкой, бинарные, строки, дата и время.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
о некоторых вопросах бинарной совместимости в C++corehard_by
При написании кода на C++ часто появляются вопросы о том, как он будет взаимодейтсвовать с внешним миром. Ответить на эти вопросы порой бывает нелегко, и причиной этому служит отсуствие описания ABI в стандарте C++. В докладе рассмотрим, что такое ABI, и как программисты C++ живут в отсутсвии стандарта на него.
Multithreading in java past and actualYevgen Levik
In this talk I’d like to give you an overview of java.util.concurrent package and represent useful Java concurrency tools. I’ll cover the core functionality and the state-of-the-art API (Executors, Accumulators, StampedLock etc).
Simple examples in github (https://github.com/levik666/OverviewInJavaUtilConcurrent)
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
Этот доклад продолжает тему моего выступления с прошлого DotNext про сложную науку о микрооптимизациях. Вас ждут новые увлекательные истории о том, что же происходит под капотом .NET-программ. Будем обсуждать различия разных C# и JIT компиляторов (Roslyn и RyuJIT в том числе), медитировать на IL и ASM листинги, а также разбираться с особенностями современных CPU.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
СУБД 2013 Лекция №8 "Конфигурирование базы данных"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №8 "Конфигурирование базы данных". Лектор - Павел Щербинин.
Сначала объясняются основы конфигурирования и общие принципы настройки. Далее рассказывается об области видимости, о настройке использования памяти, обсуждается размер блока ключей key_cache_block_size. Рассматривается устройство и использование кэша InnoDB, а также кэшей потоков и таблиц. Затем говорится об особенностях ввода/вывода в InnoDB. Далее рассказывается о табличном пространстве, оптимизации файловой сортировки, переменных состояния. Финальная часть лекции посвящена репликации: настройка, синхронизация, топология, планирование пропускной способности, администрирование и обслуживание, проблемы и их решения.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №7 "Оптимизация запросов и индексирование". Лектор - Павел Щербинин.
Вначале рассказывается об оптимизации доступа к данным, о декомпозиции соединения и состоянии запроса. Далее идёт большой блок, посвящённый оптимизатору запросов (изменение порядка соединения, применение алгебраических правил эквивалентности, оптимизации COUNT(), MIN(), MAX(), вычисление и свертка константных выражений, покрывающие индексы, оптимизация подзапросов, раннее завершение, сравнение по списку IN() и распространение равенства). Затем последовательно рассматриваются такие вещи, как соединение (JOIN) в MySQL, оптимизатор сортировки, коррелированные подзапросы, слияние и непоследовательный просмотр индексов, функции SELECT & UPDATE, COUNT(). После этого рассказывается об оптимизации запросов с помощью JOIN, GROUP BY, DISTINCT и LIMIT со смещением. В конце лекции даётся информация о кэшировании запросов, объединённых таблицах и секционировании.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №5 "Определение узких мест". Лектор - Павел Щербинин.
Вначале рассказывается о подсистемах хранения: MyISAM, InnoDB, Memory, о критериях выбора подсистем хранения, приводятся практические примеры. Затем обсуждается тема индексирования (B-tree, хеш-индексы) и EXPLAIN (столбцы id, table, possible_keys, key, key_len).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-запросы". Лектор - Павел Щербинин.
Лекция открывается рассказом о том, что такое профилирование запроса, каковы его этапы выполнения в MySQL. Рассказывается о том, как планировать запрос, как осуществляется протоколирование запросов, как собирается статистика. Объясняются основы индексирования, подробно обсуждаются стратегии индексирования для достижения высокой производительности: изоляция столбца, кластерные индексы (преимущества и недостатки), размещение данных в MyISAM и InnoDB, покрывающие индексы. Далее затрагивается тема нормализации и денормализации, а также таблиц счётчиков. В завершении рассказывается о версионировании схемы БД: о методах инкрементных изменений, идемпотентных изменений, уподобления структуры БД исходному коду.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №4 "Расширенные возможности работы с базами данных. Триггеры и хранимые процедуры"
Лектор - Павел Щербинин.
Первая часть лекции посвящена хранимым процедурам (использование, примеры кода, аспекты безопасности при использовании хранимых процедур): LOOP, REPEAT, WHILE, HANDLER, курсоры, EXECUTE. Во второй части рассказывается о триггерах: BEFORE, AFTER, INSTEAD OF, о специальных таблицах inserted, updated и deleted, об использовании триггеров для поддержания целостности и бизнес-логики, о проблемах при использовании триггеров, приводятся примеры кода. В завершающей части лекции обсуждаются вопросы, связанные с транзакциями: концепция A.C.I.D.; уровни изоляции ANSI/ISO (SET TRANSACTION ISOLATION LEVEL); взаимовлияние транзакций и проблемы lost update, dirty read, non-repeatable read и phantom read; технология MVCC (контроль версионирования конкуренции); конкуренция; параллельность и согласованность.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №3 "Выборка данных (продолжение). Транзакции"
Лектор - Павел Щербинин.
Лекция начинается с рассказа о добавлении данных и операторе INSERT, о модификации данных и операторе UPDATE, об удалении данных и операторе DELETE. Затем небольшая часть лекции посвящена пользовательским переменным. После этого даётся информация о подзапросах: SUBQUERIES, ROW SUBQUERIES, SUBQUERIES in FROM. Далее говорится об агрегации (UNION), о семействе функций JOIN и соединении таблиц, а в завершение лекции — о понятии VIEW (каковы преимущества, ограничения и особенности, алгоритмы использования и изменение).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №2 "Модификация данных. Выборка данных (начало)"
Лектор - Павел Щербинин.
Сначала завершается рассмотрение типа данных MySQL «Дата и время». Затем рассказывается о создании таблиц (CREATE TABLE): create_definition, column_definition, reference_defenition, обновление кортежа в родительском отношении. Далее обсуждается процедура изменения таблицы (ALTER TABLE), выборка данных и оператор SELECT, а также фильтрация (формирование групп, агрегаторы).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
2. План лекции
1. Random
2. Time и Date
3. I/O streams
4. Serialization
5. Reflection
6. SAX & DOM
7. Resource System
2
3. Random
Нет понятия случайного числа
Есть последовательности чисел с заданным распределением
Pseudorandom number generator — алгоритм, порождающий
последовательность чисел, элементы которой почти
независимы друг от друга и подчиняются заданному распределению
3
4. Алгоритм случайности
4
java.util.Random
Linear Congruential Pseudorandom Number Generator (See Donald
Knuth, The Art of Computer Programming, Volume 3, Section 3.2.1.)
modulus
multiplier
increment
seed
5. Параметры случайности
5
Source m (multiplier) a (increment) c
Borland C/C++ 232 22695477 1
glibc (used by GCC) 231 1103515245 12345
Borland Delphi, Virtual Pascal 232 134775813 1
Microsoft Visual/Quick C/C++ 232 214013 (343FD16) 2531011 (269EC316)
Microsoft Visual Basic (6 and earlier) 224 1140671485
(43FD43FD16)
12820163 (C39EC316)
C++11 231 − 1 16807 0
C++11's minstd_rand[9] 231 − 1 48271 0
MMIX by Donald Knuth 264 6364136223846793005 1442695040888963407
Java's java.util.Random, 248 25214903917 11
6. Random in java
Random rnd = new Random();
rnd.nextInt(100); – вернет случайное число от 0 до 99
При каждом запуске последовательность будет новой
Random rnd = new Random(1L);
rnd.nextInt(100); – вернет случайное число от 0 до 99
При каждом запуске последовательность будет прежней
Math.random(); – вернет случайное число типа double
от 0 до 1
При каждом запуске последовательность будет новой
6
7. Субъективная случайность
…Sid Meier found that if a player lost too many 2-to-1 battles in a
row, they would get frustrated. Instead of risking a player shutting
the game down, Sid changed the math :o)
7
Видео (Sid Meier GDC 2010):
http://www.youtube.com/watch?v=bY7aRJE-oOY
8. План лекции
8
1. Random
2. Time и Date
3. I/O streams
4. Serialization
5. Reflection
6. SAX & DOM
7. Resource System
9. Time & Date
9
Работа со временем
От миллисекунд до даты
UNIX или POSIX time – время с 1 января 1970 в секундах
Форматирование даты и времени для пользователей
Как хранить время в приложении и в базе
Подписка на таймер
Работу со временем лучше перенести в TimeHelper
10. TimeHelper
10
public class TimeHelper {
public static long getTimeInMs(){
Date date = new Date();
return date.getTime();
}
public static int getPOSIX(){
Date date = new Date();
int millisInSecond = 1000;
return (int)(date.getTime() / millisInSecond);
}
public static String getUserDateFull(Locale locale){
Date date = new Date();
DateFormat dateFormatter =
DateFormat. getDateInstance(DateFormat.FULL, locale);
return dateFormatter.format(date);
}
}
11. Timer
11
java.unil.Timer
java.unil.TimerTask
Порядок работы:
Создаем timer
Создаем класс унаследованный от TimerTask
Пишем в методе run() код, который будет выполнен по таймеру
Передаем в timer таск и время, через которое надо выполнить таск
Ждем положенное время
PROFIT!!!
Выключаем timer через timer.cancel();
12. Timer
12
int timeMs = 10000;
TimeService.instance().start();
TimeService.instance().sheduleTask(new TimerTask(){
public void run() {
System.out.append("Timer run!n");
TimeService.instance().stop();
}
}, timeMs);
13. План лекции
13
1. Random
2. Time и Date
3. I/O streams
4. Serialization
5. Reflection
6. SAX & DOM
7. Resource System
14. I/O, потоки
I/O ― общение с внешними устройствами (файлы, принтеры, сеть и т.д.)
Поток ― объект который представляет источник или приемник данных
Поток основан на последовательности битов данных
14
InputStream
OutputStream
15. InputStream
public abstract class InputStream
Основные методы:
abstract int read()
int read(byte[] b)
void mark(int readlimit)
void reset()
void close()
Основная задача ― читать байт за байтом из входного потока
15
17. FilterInputStream
Decorator pattern
Переопределяет все методы InputStream вызывая методы поля in
Наследники этого класса могут менять работу потока в поле in
17
public class FilterInputStream extends InputStream
private InputStream in;
protected FilterInputStream(InputStream in){
this.in = in;
}
19. Decorator
Рассмотрим сериализованные java объекты, которые лежат в gzip архиве
и которые мы хотим быстро прочесть.
19
Для начала откроем inputstream для файла:
FileInputStream fis = new FileInputStream("/objects.gz");
Читать побитово для нас слишком долго -- буферизуем чтение:
BufferedInputStream bis = new BufferedInputStream(fis);
Файл зазипован -- нам надо его разархивировать:
GzipInputStream gis = new GzipInputStream(bis);
Теперь десиериализуем java объекты:
ObjectInputStream ois = new ObjectInputStream(gis);
И, наконец, прочитаем:
SomeObject someObject = (SomeObject) ois.readObject();
21. Закрытие потоков
Для особождения ресурсов все потоки должны быть закрыты
BufferedReader br = null;
try{
//code
br = new BufferedReader(isr);
//code
} catch (Exception e){
System.err.println("Error: " + e.getMessage());
} finally {
if(br != null){
try {
br.close();
} catch (IOException e) {
System.err.println("Error: " + e.getMessage());
}
}
}
21
22. План лекции
22
1. Random
2. Time и Date
3. I/O streams
4. Serialization
5. Reflection
6. SAX & DOM
7. Resource System
23. Сериализация
Перевод объекта в формат данных удобный для хранения и передачи
Процесс должен быть обратимым
23
Объект Метаданные
24. Сериализация
Примеры сериализации
24
Запись в бинарный файл
Запись в xml файл
Запись в json string
Запись blob в базу данных
Пересылка по сети между
процессами
Описание объекта в стихах и пересылка почтовым голубем
25. interface Serializable
25
Обьект класса реализующего интерфейс Serializable можно
сериализовать
Результат сериализации ― массив байт
Обычно объекты сериализуют в файл, в blob или в сетевой поток
Процесс сериализации:
Создание потока представляющего направление сериализации
Создание ObjectOutputStream для этого потока
26. Что будет сериализовано
26
Все поля сериализуемого объекта должны быть Serializable
Все поля будут сериализованы
Поля родительских классов реализующих Serializable
будут сериализованы
Если родительский класс НЕ реализует Serializable,
то при десериализации для него будет вызван конструктор
по-умолчанию
27. Что НЕ будет сериализовано
27
Поле которое не надо сериализовать нужно пометить как transient
private transient long time;
Статические поля сериализваны НЕ будут
При десериализации static и transient поля будут заполнены
значениями по-умолчанию
28. Serialization Object
28
public class SerializationObject implements Serializable {
private String name; // name = Zoe
private int age; // age = 31
…
}
29. Запись в файл
SerializationObject object = new SerializationObject("Zoe",
31);
FileOutputStream fileOut = new FileOutputStream("test.bin");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(object);
out.close();
29
30. Десериализация
30
Чтение происходит в обратном порядке
родительские классы
классы переменных родительских классов
объекты родительских классов
значения переменных родительских классов
классы переменных
значения переменных
31. План лекции
31
1. Random
2. Time и Date
3. I/O streams
4. Serialization
5. Reflection
6. SAX & DOM
7. Resource System
32. Reflection
Возможность проверить структуру объекта в runtime
Возможность изменить поведение объекта в runtime
32
Сериализация
Serializable – пустой интерфейс
Мы не написали ни строчки кода для сериализации объекта
Reflection разбирает объект и переводит его в массив байт
33. Используя Reflection можно
33
Получить список переменных класса
Получить список методов класса
Получить список конструкторов класса
Создать объект, вызвав его конструктор
Вызвать метод
Поменять область видимости переменной или метода
34. Минусы Reflection
34
Если задачу можно решить без reflection ―
ее лучше решить без reflection
Потеря производительности
Не работает в окружении с повышенной безопасностью (applet-ы)
Разрушение ОО архитектуры
35. java.lang.Class
Основные методы класса Class
static Class<T> forName(String className)
String getCanonicalName()
Fields[] getField(String name)
Class[] getInterfaces()
Method[] getMethods()
Constructor[] getConstructors()
35
― объект, который представляет в runtime данные Class о классе объекта
36. java.lang.Class
Как получить Class<?> объект
Class<?> clazz = object.getClass()
Class<?> clazz = className.class //в том числе для простых типов
Class<?> clazz = Class.forName(“java.io.Serializable”)
Class[] clases = clazz.getInterfaces()
36
39. ReflectionHelper
39
public static void setFieldValue(Object object, String fieldName, String
value){
try {
Field field =
object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
if(field.getType().equals(String.class)){
field.set(object, value);
} else if ( field.getType().equals(int.class)){
field.set(object, Integer.decode(value));
}
field.setAccessible(false);
} catch(…){…}
}
40. План лекции
40
1. Random
2. Time и Date
3. I/O streams
4. Serialization
5. Reflection
6. SAX & DOM
7. Resource System
41. XML Serialization
41
Данные объекта ― иерархически упорядоченные поля
простых типов
XML документ ― иерархически упорядоченные тэги со строками
Имя переменной ― имя тэга
Значение переменной ― строковое значение тэга
42. Отличия XML
42
Занчительно проще редактировать
Значительно проще версионировать
Нет привязки к типу
Нет привязки к особенностям языка
Избыточна
Медленное чтение и запись
43. SAX parser
Simple API for XML (SAX)
Стандартное средство обработки XML документов
43
Обходит XML дерево
Посещает каждую ноду дерева
Для каждой ноды вызывает 3 callback-а
44. SAX parser
44
Порядок работы:
Читаем формат документа
Читаем первый тэг ― сообщаем приложению, что обработка начата
Читаем содержимое тэга
Сообщаем приложению содержимое тэга
Рекурсивно обращаемся ко всем вложенным тэгам
Сообщаем приложению, что обработка завершена
45. SAX parser методы
45
org.xml.sax.helpers.DefaultHandle
r
Методы для обработки тегов во время обхода документа:
startDocument()
startElement(…)
characters(…)
endElement(…)
endDocument()
Обход дерева
46. Десериализация XML
46
Задача:
Разработать XML формат для документа так чтобы
Можно было понять класс десериализуемого объекта
Тэг с именем переменной содержал
Атрибуты для восстановления переменной
Значение переменной
Записать ресурсы игры в выбранном формате
47. Простой XML документ
47
<class type=“main.SerializationObject”>
<name>Zully</name>
<age>23</age>
</class>
Порядок обработки SAX парсером:
startDocument
startElement class
startElement name
endElement name
startElement age
endElement age
endElement class
endDocument
48. Handler
public class SaxEmptyHandler extends DefaultHandler {
private static String CLASSNAME = "class";
private Object object;
private String element;
public void startElement(String uri, String localName, String qName, Attributes
attributes) {
…
}
public void endElement(String uri, String localName, String qName) {
...
}
public void characters(char ch[], int start, int length) {
…
}
}
48
49. Используем Reflection
public void startElement(String uri, String localName, String qName, Attributes attributes) {
if(qName != CLASSNAME){
element = qName;
}
else {
String className = attributes.getValue(0);
System.out.println("Class name: " + className);
object = ReflectionHelper.createIntance(className);
}
}
public void endElement(String uri, String localName, String qName) {
element = null;
}
public void characters(char ch[], int start, int length) {
if(element != null){
String value = new String(ch, start, length);
System.out.println(element + " = " + value);
ReflectionHelper.setFieldValue(object, element, value);
}
}
49
50. DOM parser
50
Document Object Model
Сначала прочитаем весь XML, потом обойдем все ноды
javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.DocumentBuilder
org.w3c.dom.Document
File fXmlFile = new File(“test.xml”);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
51. SAX & DOM сравнение
51
SAX parser DOM parser
SAX (Simple API for XML) парсер не создает никакой
внутренней структуры. Вместо этого, он берет все
вхождения компонентов во входящем документе в виде
событий (events) и говорит клиенту что он читает,
поскольку он читает через входящий документ.
DOM (Document Object Model) парсер создает древовидную
структуру в памяти из входящего документа и лишь потом
ждет запросов от клиента.
SAX парсер всегда отдает клиенту лишь куски документа. Всегда отдает клиенту целый документ, независимо от
того, сколько в действительности необходимо
пользователю.
Менее требователен к ресурсам и занимаемому
свободному месту в случае использования больших
входящих документов (потому что он не создает
внутренней структуры). Также он запускается быстрее и
более легок в изучении, чем DOM парсер.
Имеет богатый функционал. Создает DOM-дерево в памяти
и позволяет доступаться к любой части документа, а также
модифицировать его. Но он не рационально распоряжается
свободным местом в случае использования огромных
документов.
Используйте в следующих случаях:
▪ Входящий документ слишком велик для доступной
памяти
▪ Когда необходимо прочитать лишь небольшой
участок документа.
▪ Используя SAX, вы используете меньшее количество
памяти и производите меньше динамических
резерваций памяти.
Используйте в следующих случаях:
▪ Вашему приложению необходимо иметь доступ к
различным частям документа и использование
собственной структуры столь же сложно, как и
использование дерева DOM.
▪ Вашему приложению необходимо изменять дерево
очень часто и данные должны быть сохранены на
определенный период времени.
52. План лекции
52
1. Random
2. Time и Date
3. I/O streams
4. Serialization
5. Reflection
6. SAX & DOM
7. Resource System
53. Resource
53
― интерфейс для всех объектов со статическими данными
Resource
Конкретный ресурс можно собрать на основе XML документа
Ресурс одного типа может быть описан несколькими
XML документами
Уникальность игрового ресурса ― путь к его XML файлу
XML документы для ресурсов создают дизайнеры
Все параметры игры должны быть в ресурсах
54. Resource Systen
54
Ресурсная система
XML файлы с описанием игровых объектов
Инструменты для редактирования XML файлов
Инструменты для создания игровых объектов по ресурсам
55. Resource Systen
55
В Allods Online
3 года разработки
> 200 000 ресурсов
Загрузка всех ресурсов примерно 30 минут
На разработке ресурсной системы 2 программиста
На разработке редакторов 3 программиста
Ресурсы создавали > 10 дизайнеров
57. ДЗ
57
Вынести все параметры в XML файлы
Создать interface Resource и class GMResource
Создать class ResourceFactory (singleton)
GMResource resource =
(GMResource) ResourceFactory.instance().get(“./data/GMConfig.xml”)
58. ResourceSystem *
58
Загрузка всех ресурсов при старте сервера
Используем VFS.instance().getIterator(“./data”)
Все ресурсы храним в директории ./data
Обходим все файлы и создаем все ресурсы
Ресурсы храним в Map<String, Resource>