Вводная лекция в язык C#, для тех кто знает программирование и в особенности C++. В статье будет уделено внимание наиболее важным отличиям языков, будут обсуждаться вопросы производительности и эффективного кода.
Другие интересные статьи по C# ищите тут: http://itw66.ru/blog/c_sharp/
Написание компактного и эффективного кода в C#: http://itw66.ru/blog/c_sharp/520.html
Александр Сычев "Разделяй и властвуй: CQRS в iOS"IT Event
В сложных мобильных приложениях, работающих с большим объемом постоянно изменяющихся данных, задача их синхронизации и своевременного обновления в разных модулях становится нетривиальной. В своем докладе я предлагаю отойти от привычных подходов и применить практику разделения ответственности на команды и запросы, предполагающую использование разных моделей для обновления и чтения информации. Я продемонстрирую области, в которых этот подход поможет мобильным разработчикам эффективно развивать их приложения. Слушатели узнают о сложностях, с которыми им придется столкнуться при его адаптации и о том, как их следует решать.
Рассказ будет интересен опытным разработчикам, сталкивающимся в своей практике с задачей развития высокопроизводительных приложений со множеством потоков данных.
Вводная лекция в язык C#, для тех кто знает программирование и в особенности C++. В статье будет уделено внимание наиболее важным отличиям языков, будут обсуждаться вопросы производительности и эффективного кода.
Другие интересные статьи по C# ищите тут: http://itw66.ru/blog/c_sharp/
Написание компактного и эффективного кода в C#: http://itw66.ru/blog/c_sharp/520.html
Александр Сычев "Разделяй и властвуй: CQRS в iOS"IT Event
В сложных мобильных приложениях, работающих с большим объемом постоянно изменяющихся данных, задача их синхронизации и своевременного обновления в разных модулях становится нетривиальной. В своем докладе я предлагаю отойти от привычных подходов и применить практику разделения ответственности на команды и запросы, предполагающую использование разных моделей для обновления и чтения информации. Я продемонстрирую области, в которых этот подход поможет мобильным разработчикам эффективно развивать их приложения. Слушатели узнают о сложностях, с которыми им придется столкнуться при его адаптации и о том, как их следует решать.
Рассказ будет интересен опытным разработчикам, сталкивающимся в своей практике с задачей развития высокопроизводительных приложений со множеством потоков данных.
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"IT Event
"Выбор хранилища для проекта — важная часть разработки. Раньше в Android, было сложно: много различных ORM-библиотек на SQLite, есть NoSQL библиотеки, но нет чего-то действительно быстрого и легкого в работе.
Появление Realm изменило всё. В докладе мы сравним его с популярными SQLite ORM библиотеками, посмотрим что быстрее, с чем проще работать. В конце доклада пара слов об еще одном, новом и интересном инструменте, который сравнимым с Realm."
This presentation will teach you to never repeat yourself and organize your code correctly for reuse.
It also illustrates advantages of the use of third-party libraries.
Доклад рассматривает тонкости nodejs, а так же преимущества Evented I/O для серверных приложений. Будет предоставлен ряд рекоммендаций по правильному построению архитектуры, модульности, масштабированию, дизайну кода. Краткое введение в технологию программирования "волокнами" (fibers) и ряд других эффективных практик.
Михаил Рахманов рассказывает о паттерне Promise и его использовании в iOS разработке.
Краткие тезисы:
- Что такое promises?
- Использование promises в iOS разработке (существующие библиотеки и подходы)
- Реализация promises библиотекой PromiseKit (основные методы, цепочки promises, обработка ошибок)
- Какие задачи можно решить с помощью promises, а какие - нельзя
- Использование promises на примере приложения: драм-машины с возможностью сохранять аудио-дорожки
- Подведение итогов: преимущества и недостатки.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"IT Event
"Выбор хранилища для проекта — важная часть разработки. Раньше в Android, было сложно: много различных ORM-библиотек на SQLite, есть NoSQL библиотеки, но нет чего-то действительно быстрого и легкого в работе.
Появление Realm изменило всё. В докладе мы сравним его с популярными SQLite ORM библиотеками, посмотрим что быстрее, с чем проще работать. В конце доклада пара слов об еще одном, новом и интересном инструменте, который сравнимым с Realm."
This presentation will teach you to never repeat yourself and organize your code correctly for reuse.
It also illustrates advantages of the use of third-party libraries.
Доклад рассматривает тонкости nodejs, а так же преимущества Evented I/O для серверных приложений. Будет предоставлен ряд рекоммендаций по правильному построению архитектуры, модульности, масштабированию, дизайну кода. Краткое введение в технологию программирования "волокнами" (fibers) и ряд других эффективных практик.
Михаил Рахманов рассказывает о паттерне Promise и его использовании в iOS разработке.
Краткие тезисы:
- Что такое promises?
- Использование promises в iOS разработке (существующие библиотеки и подходы)
- Реализация promises библиотекой PromiseKit (основные методы, цепочки promises, обработка ошибок)
- Какие задачи можно решить с помощью promises, а какие - нельзя
- Использование promises на примере приложения: драм-машины с возможностью сохранять аудио-дорожки
- Подведение итогов: преимущества и недостатки.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
— Что делать, если у вас много асинхронного кода и он выглядит как лапша?
— Как делать системы проще, используя подходы и принципы из мира функционального программирования.
Solit 2014, EcmaScript 6 in Action, Трухин Юрий solit
Юрий Трухин, Россия. Эксперт по облачным технологиям хостинговой компании InfoboxCloud. В прошлом – обладатель статуса Microsoft Most Valuable Professional. Гик, стратег, разработчик. Подробнее на trukhin.com
«Обзор InfoboxCloud для разработчиков». Development секция. Высокий уровень подготовки. Для разработчиков.
В этом докладе будет рассказано об устройстве InfoboxCloud из первых рук, о деталях внутренней реализации, о том, какую пользу несет облако для разработчиков и о будущем InfoboxCloud. Будут рассмотрены 2 кита облачных технологий: IaaS и PaaS без vendor-lock. Отличная возможность спросить обо всём, что касается PaaS/IaaS непосредственно архитектора и разработчика этих систем.
«EcmaScript 6 in Action». Development секция. Для разработчиков.
Поговорим о том, как жизнь разработчиков изменится с приходом нового стандарта.
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Александр Гранин, "Декларативно-функциональный дизайн на С++11"Platonov Sergey
Декларативный дизайн кода? Функциональное программирование? Эти идеи вне мира С++ существуют довольно давно, и позволяют по-новому взглянуть на традиционные проблемы, на борьбу со структурной и алгоритмической сложностью ПО. Развиваясь в кулуарах от программирования, эти идеи стали привлекать все больше мейнстримных разработчиков, так как позволяют решать многие задачи более элегантным способом. И вот вышел С++11, переняв некотоыре инструменты из мира функционального программирования. Однако консервативная enterprise-среда не спешит использовать их в повседневной практике. В этом докладе будут рассмотрены проблемы декларативного дизайна ПО и как в этом помогают новые функциональные возможности С++11.
Доклад о дизайне кода в функциональном стиле на C++, представленный вниманию плюсовиков на C++ User Group Novosibirsk 2014.
В качестве демонстрационного проекта была реализована игра "Амбер" по мотивам "Хроник Амбера" Р. Желязны.
https://github.com/graninas/Amber
Гуманитарные специальности в IT-индустрии
Анна Астахова, старший аккаунт-менеджер в компании Nоveо.
Noveo — международная IT‑компания. Наши главные офисы разработки ПО находятся в Новосибирске и Санкт-Петербурге, представительства — в Москве, Париже, Лондоне и Сиэтле.
3. Key-Value mechanism
KVC — механизм, позволяющий обращаться к свойствам объекта, используя строковые
идентификаторы — ключи (Key). Ключи можно выстраивать в цепочку (KeyPath), обращаясь к
вложенным свойствам. KVC основывается на методах протокола NSKeyValueCoding .
Это позволяет решить во время выполнения к какому свойству обратиться.
NSString *valueB = [myObject valueForKey:@"someString"];
NSString *valueC = [myObject valueForKeyPath:@"parentObject.someString"];
Key-Value Coding
4. Key-Value mechanism
@interface Person : NSObject
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSNumber *age;
//...
@end
{
[
"name": "Alice",
"age": 22,
...
],
[
"name": "Bob",
"age": 24,
...
]
}
Нужно создать массив объектов Person из полученного JSON
Key-Value Coding
5. Key-Value mechanism
Key-Value Coding
NSArray *personsDescriptions = /*...*/;
NSMutableArray *persons = /*...*/;
// Вручную работаем с каждым свойством
for (NSDictionary *personDescription in personsDescriptions) {
Person *person = [[Person alloc] init];
person.name = personDescription[@"name"];
person.age = personDescription[@"age"];
//...
}
6. Key-Value mechanism
Key-Value Coding
NSArray *personsDescriptions = /*...*/;
NSMutableArray *persons = /*...*/;
// Вручную работаем с каждым свойством
for (NSDictionary *personDescription in personsDescriptions) {
Person *person = [[Person alloc] init];
person.name = personDescription[@"name"];
person.age = personDescription[@"age"];
//...
}
// Автоматический проход по всем свойствам
for (NSDictionary *personDescription in personsDescriptions) {
Person *person = [[Person alloc] init];
for (NSString *key in personDescription.allKeys) {
[person setValue:personDescription[key] forKey:key];
}
}
7. Key-Value mechanism
Key-Value Coding
NSArray *personsDescriptions = /*...*/;
NSMutableArray *persons = /*...*/;
// Вручную работаем с каждым свойством
for (NSDictionary *personDescription in personsDescriptions) {
Person *person = [[Person alloc] init];
person.name = personDescription[@"name"];
person.age = personDescription[@"age"];
//...
}
// Автоматический проход по всем свойствам
for (NSDictionary *personDescription in personsDescriptions) {
Person *person = [[Person alloc] init];
for (NSString *key in personDescription.allKeys) {
[person setValue:personDescription[key] forKey:key];
}
}
Нужна осторожность: только мы отвечаем за правильность ключей.
8. Key-Value mechanism
KVC позволяет включать в качестве ключей в KeyPath не только объекты, но и коллекции
объектов. На выходе мы получим коллекцию, аггрегирующую значения заданного поля у всех
элементов коллекции.
@interface Person : NSObject
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSNumber *age;
//...
@end
//...
@property (strong, nonatomic) NSArray *myPersons;
//...
NSArray *allNames = [self valueForKeyPath:@"myPersons.name"];
Key-Value Coding
9. Key-Value mechanism
KVC предоставляет несколько операторов для обработки значений элементов коллекции:
@avg, @max, @min, @distinctUnionOfObjects и др.
@interface Person : NSObject
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSNumber *age;
//...
@end
//...
@property (strong, nonatomic) NSArray *myPersons;
//...
NSArray *avgAge = [self valueForKeyPath:@"myPersons.@avg.age"];
Key-Value Coding
10. Key-Value mechanism
NSPredicate позволяет делать достаточно хитрые запросы (с фильтрами и выражениями), в том числе при
доступе к значениям через KVC. Синтаксис выражений похож на SQL запросы и может использовать
регулярные выражения.
@interface Person : NSObject
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSNumber *age;
//...
@end
//...
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS 'Bob'"];
NSLog(@"Bobs: %@", [people filteredArrayUsingPredicate:predicate]);
NSPredicate
11. Key-Value mechanism
По умолчанию обращение по несуществующему ключу вызывает исключение, поэтому нужно
реализовать одну из политик:
● Следить за тем, что мы не обращаемся к несуществующим ключам
● Переопределить методы, обрабатывающие обращение к несуществующим ключам
(valueForUndefinedKey: и setValue: forUndefinedKey: )
Значения при использовании KVC имеют тип id, поэтому:
● При обращении к скаляру (BOOL, int, float, ...) через KVC, он автоматически
оборачивается в NSNumber.
● При обращении к структуре (struct) через KVC, она автоматически оборачивается в
NSValue.
● При присваивании значения nil скаляру через KVC, вызывается метод
setNilValueForKey: , в котором нужно определить желаемое поведение.
Key-Value Coding
12. Key-Value mechanism
Для поддержки работы KVC нужно правильно именовать методы-акцессоры:
● Имя геттера должно совпадать с именем свойства
● Имя сеттера должно иметь префикс set
@property (strong, nonatomic) NSString *name;
//...
- (NSString *)name {...}
- (void)setName:(NSString *)name {...}
Key-Value Coding
13. Key-Value mechanism
Key-Value Coding
Чтобы обеспечить поддержку KVC/KVO для свойства, нужно соблюдать правила руководства
по KVC compliance.
По умолчанию свойства стандартных классов нельзя считать KVC-совместимыми, а
документация явно указывает какие свойства обладают этим свойством.
14. Key-Value mechanism
KVO — механизм поверх KVC, реализующий автоматическую нотификацию объекта об
изменениях значений свойств (в общем случае) другого объекта. (паттерн Observer)
Объект, который хочет получать такие нотификации должен:
● Подписаться на нотификации, указав получателя, объект и KeyPath для отслеживания,
свой контекст, дополнительные опции (например нотификация до или после изменения
значения).
● Обрабатывать полученные нотификации, проверив что они действительно должны быть
обработаны. (Родительский класс мог так же подписаться на нотификации и их нужно
передать в super).
● По необходимости или в конце жизненного цикла отписаться от всех ранее созданных
подписок.
Key-Value Observing
16. Key-Value mechanism
● Создаём контекст. Он помогает определить, принадлежат ли нам полученные
нотификации.
static void *const myContext = (void *)&myContext;
● Подписываемся на изменения значений. (например в init)
[self.myPerson addObserver:self
forKeyPath:@"name"
options:NSKeyValueObservingOptionNew
context:myContext];
● Отписываемся от нотификаций. (например в dealloc)
[self.myPerson removeObserver:self
forKeyPath:@"name"
context:myContext];
Key-Value Observing
17. Key-Value mechanism
● Получаем и обрабатываем нотификации.
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if (context == myContext) {
Person *person = (Person *)object;
NSLog(@"New value is %@.", person.name);
}
else {
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context];
}
}
Key-Value Observing
18. Key-Value mechanism
KVO поддерживает свойства, не имеющие под собой ivar, например для которых значение
вычисляется каждый раз в геттере.
@property (copy, nonatomic) NSString *firstName;
@property (copy, nonatomic) NSString *lastName;
@property (readonly, nonatomic) NSString *fullName;
- (NSString *)fullName
{
return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
}
Key-Value Observing
19. Key-Value mechanism
KVO поддерживает свойства, не имеющие под собой ivar, например для которых значение
вычисляется каждый раз в геттере.
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
{
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"fullName"]) {
NSArray *affectingKeys = @[@"lastName", @"firstName"];
keyPaths = [keyPaths setByAddingObjectsFromArray:affectingKeys];
}
return keyPaths;
}
Key-Value Observing
20. Key-Value mechanism
● Нотификации от всех объектов и всех KeyPath приходят в один обработчик.
● Если мы переименовали свойство, мы ответственны за обновление всех строк с KeyPath, куда это
свойство входило.
● Каждый объект должен обрабатывать все те и только те нотификации, на которые он подписан. (Нельзя
отдавать в super свою нотификацию, не стоит обрабатывать нотификации, предназначенные для
super.)
● Нельзя не отписываться от нотификаций, на которые мы подписались.
● Нельзя отписываться дважды от одной и той же нотификации.
● Нельзя проверить подписан ли объект на ту или иную нотификацию.
● Если кто-то использует свойство для KVO, к нему нельзя обращаться через ivar, или нужно вручную
нотифицировать об изменении значения (willChangeValueForKey: / didChangeValueForKey:).
● KVO с трудом поддерживает отслеживание изменений внутри коллекции.
Key-Value Observing
21. Key-Value mechanism
Для избавления от страданий создано много вариантов обёрток, скрывающих API KVO.
● ReactiveCocoa
[RACObserve(model, keyname) subscribeNext:^(NSString *newValue) {
//...
}];
● KVOBlocks
[model
addObserver:self
forKeyPath::@"keyname"
options:NSKeyValueObservingOptionNew
context:nil
withBlock:^(NSDictionary *change, void *context) {
//...
}];
Key-Value Observing