Алексей Кирпичников — Как хранить логи сервиса в базе данных и не погубить пр...Yandex
На примере Python, MongoDB и Яндекс.Такси рассказывается о том, как хранить логи сервиса в базе данных — о том, какие задачи помогает решать такое хранилище логов и чем оно отличается от других, более распространенных вариантов.
Неважно какой фреймворк вы используете, внутри всё равно будет ваш уникальный код под проект, со своей структурой и логикой. Его нужно поддерживать, а коллегам нужно в него вникать. Как минимизировать порог вхождений и в целом облегчить поддержку проекта? Какие инструменты и подходы можно использовать, или сделать самому, для анализа, даже не кода, а проекта в целом? Константин поделится своим взглядом на этим вопросы и какие могут быть решения.
Алексей Кирпичников — Как хранить логи сервиса в базе данных и не погубить пр...Yandex
На примере Python, MongoDB и Яндекс.Такси рассказывается о том, как хранить логи сервиса в базе данных — о том, какие задачи помогает решать такое хранилище логов и чем оно отличается от других, более распространенных вариантов.
Неважно какой фреймворк вы используете, внутри всё равно будет ваш уникальный код под проект, со своей структурой и логикой. Его нужно поддерживать, а коллегам нужно в него вникать. Как минимизировать порог вхождений и в целом облегчить поддержку проекта? Какие инструменты и подходы можно использовать, или сделать самому, для анализа, даже не кода, а проекта в целом? Константин поделится своим взглядом на этим вопросы и какие могут быть решения.
Introduction to new technologies present in MySQL which enable developing next gen applications. Technologies like JSON and document store, or microservices. Slides in Russian
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaEvgeniy Kuzmin
- For which data types MongoDB is more suitable.
- Basic tips for optimizing performance.
- How to quickly and easily speed up a high-load project that uses MongoDB as the main data repository.
- How to build queries and use indexes.
Caching on highload Drupal site - Alexander ShumenkoDrupalCampDN
Рассмотрим создание тегированной системы кеширования сущностей для high load сайта на Drupal. В ходе доклада будут рассмотрены наиболее интересные моменты реализации (построение цепочки тегов) так же рассмотрены проблемы и способы их решения.
Шаблонизаторы упрощают процесс формирования HTML и только. Но браузеру нужен совсем не HTML, а DOM. Необходимо преобразование. И вот тут начинается самое интересное: танцы с бубном и стрельба по ногам. В докладе пойдёт речь об общепринятом подходе получения DOM фрагмента, постпроцессинге и альтернативах. Сравним, измерим и узнаем как это делать быстрее всего.
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Roman Dvornov
Опенсорсный JavaScript-фреймворк с нестандартными подходами, ориентированный на разработку одностраничных приложений. Обновление шаблонов и стилей без перезагрузки страницы, развитые механизмы работы с данными, высокая производительность, инструменты разработчика и многое другое.
Доклад с конференции WSD, Санкт-Петербург, 8 июня 2013
Видео: http://www.youtube.com/watch?v=cVbbkwkhNQg
Презентация со встречи сообщества SPb Python Interest Group рассказывающая об устройстве словарей в Python.
В презентации рассмотрена работа словаря в CPython 2.x, словаря в CPython 3.x, а также рассмотрены изменения в CPython 3.6.
Помимо CPython рассмотрены версии словаря в альтернативных реализациях Python, таких как PyPy, IronPython и Jython.
Introduction to new technologies present in MySQL which enable developing next gen applications. Technologies like JSON and document store, or microservices. Slides in Russian
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaEvgeniy Kuzmin
- For which data types MongoDB is more suitable.
- Basic tips for optimizing performance.
- How to quickly and easily speed up a high-load project that uses MongoDB as the main data repository.
- How to build queries and use indexes.
Caching on highload Drupal site - Alexander ShumenkoDrupalCampDN
Рассмотрим создание тегированной системы кеширования сущностей для high load сайта на Drupal. В ходе доклада будут рассмотрены наиболее интересные моменты реализации (построение цепочки тегов) так же рассмотрены проблемы и способы их решения.
Шаблонизаторы упрощают процесс формирования HTML и только. Но браузеру нужен совсем не HTML, а DOM. Необходимо преобразование. И вот тут начинается самое интересное: танцы с бубном и стрельба по ногам. В докладе пойдёт речь об общепринятом подходе получения DOM фрагмента, постпроцессинге и альтернативах. Сравним, измерим и узнаем как это делать быстрее всего.
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Roman Dvornov
Опенсорсный JavaScript-фреймворк с нестандартными подходами, ориентированный на разработку одностраничных приложений. Обновление шаблонов и стилей без перезагрузки страницы, развитые механизмы работы с данными, высокая производительность, инструменты разработчика и многое другое.
Доклад с конференции WSD, Санкт-Петербург, 8 июня 2013
Видео: http://www.youtube.com/watch?v=cVbbkwkhNQg
Презентация со встречи сообщества SPb Python Interest Group рассказывающая об устройстве словарей в Python.
В презентации рассмотрена работа словаря в CPython 2.x, словаря в CPython 3.x, а также рассмотрены изменения в CPython 3.6.
Помимо CPython рассмотрены версии словаря в альтернативных реализациях Python, таких как PyPy, IronPython и Jython.
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"Yandex
В докладе пойдёт речь о методе сериализации произвольных данных, который применяется в Яндексе. Этот метод основан на отображаемых в память (mmapped) файлах и не требует операции декодирования. Мы рассмотрим его преимущества и недостатки, поговорим об общих принципах такой сериализации и об устройстве отображаемых аналогов стандартных контейнеров.
Гуманитарные специальности в IT-индустрии
Анна Астахова, старший аккаунт-менеджер в компании Nоveо.
Noveo — международная IT‑компания. Наши главные офисы разработки ПО находятся в Новосибирске и Санкт-Петербурге, представительства — в Москве, Париже, Лондоне и Сиэтле.
3. Хранение данных
Принципиально выделяются следующие способы хранения данных:
● UserDefaults
● Файлы
○ plist
○ NSCoding
○ БД SQLite
○ кастомные форматы
● CoreData (физически данные хранятся как правило в SQLite файле)
Хранение данных в iOS
4. Хранение данных
Наиболее простой способ сохранить / загрузить данные. Используется в основном для
хранения настроек приложения и других мелких сущностей. Работает только с ограниченным
набором стандартных типов.
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:42 forKey:@"MyInteger"];
[userDefaults setObject:@"SomeString" forKey:@"MyString"];
[userDefaults setBool:YES forKey:@"MyFlag"];
[userDefaults synchronize];
BOOL myFlag = [userDefaults boolForKey:@"MyFlag"];
NSInteger myInt = [userDefaults integerForKey:@"MyInteger"];
NSString *myString = [userDefaults objectForKey:@"MyString"];
NSUserDefaults
5. Хранение данных
Каждое приложение выполняется в “песочнице”, в том числе имеет доступ только к своим
папкам. У каждого приложения есть следующий набор папок:
● NSDocumentDirectory — документы (бэкапятся, видны пользователю в iTunes)
● NSLibraryDirectory — настройки, БД и т.д. (бэкапятся, но не видны пользователю)
● NSCachesDirectory — файлы, которые гарантированно могут быть скачаны снова (не
бэкапятся и могут быть автоматически удалены системой при нехватке памяти).
● NSDownloadsDirectory — не будут удалены системой, но не бэкапятся.
● …
Хранение данных в iOS
6. Хранение данных
Ресурсы приложения хранятся отдельно и доступны только для чтения.
По умолчанию все ресурсы приложения попадают в одну папку, и должны иметь разные имена
(или явно указывать какие папки проекта должны сохранять структуру при копировании в
ресурсы).
Получение пути к ресурсу по имени файла:
[[NSBundle mainBundle] pathForResource:@"filename" ofType:@"ext"];
Хранение данных в iOS
7. Хранение данных
NSArray *docsDirs = nil;
NSString *docsDir = nil;
...
docsDirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [docsDirs objectAtIndex:0];
Получение пути к документам
8. Хранение данных
NSFileManager позволяет получать список, размеры и атрибуты, проверять наличие по
заданному пути, создавать, переносить и удалять файлы и папки, создавать и удалять
символические ссылки, а также управлять хранением бэкапов файлов в iCloud.
NSFileManager
9. Хранение данных
Создаём директорию и получаем новый список файлов и каталогов в домашней директории:
NSString *path = [docsDir stringByAppendingPathComponent:@"MyDir"];
NSError *error = nil;
[[NSFileManager defaultManager]
createDirectoryAtPath:path
withIntermediateDirectories:YES
attributes:nil
error:&error];
NSArray *contents =
[[NSFileManager defaultManager]
contentsOfDirectoryAtPath:docsDir
error:&error];
NSFileManager
10. Хранение данных
NSString в файле
Сохранение и загрузка строки в / из файла:
[@"42"
writeToFile:filepath
atomically:YES
encoding:NSUTF8StringEncoding
error:&error];
NSString *string =
[NSString
stringWithContentsOfFile:filepath
encoding:NSUTF8StringEncoding
error:&error];
11. Хранение данных
PList (Property List) — стандартный для iOS и MacOS формат хранения стандартных коллекций,
содержащих данные стандартных типов:
● NSString — UTF-8 строка
● NSNumber — Строка с десятичным числом
● NSNumber <true/> или <false/>
● NSDate — ISO 8601 представление
● NSData — Base64 представление
● NSArray — <array>, может содержать любое количество других объектов
● NSDictionary <dict>, чередование <key> и других объектов
PList
12. Хранение данных
На самом деле это обычный XML:
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
</dict>
</plist>
PList
13. Хранение данных
Сохранение и загрузка массива в / из файла:
[@[@2, @3, @4] writeToFile:filepath atomically:YES];
NSArray *array = [NSArray arrayWithContentsOfFile:filepath];
Сохранение и загрузка словаря в / из файла:
[@{@"2": @2, @"3": @3} writeToFile:filepath atomically:YES];
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:filepath];
Хранение коллекций в PList
14. Хранение данных
NSCoding — протокол, абстрагирующий возможность сериализации и десериализации любых
объектов.
NSCoder — абстрактный класс, представляющий набор методов для сериализации /
десериализации объектов.
NSKeyedArchiver / NSKeyedUnarchiver — конкретные реализации NSCoder, отвечающие
за сериализацию / десериализацию полей объекта по ключам и предоставляющие возможность
использовать файл как хранилище.
NSCoding
17. Хранение данных
@interface Person : NSObject <NSCoding>
@property (copy, nonatomic) NSString *name;
@property (readwrite, nonatomic) NSInteger age;
@end
@implementation Person
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.name forKey:@"name"];
[coder encodeInteger:self.age forKey:@"age"];
}
- (instancetype)initWithCoder:(NSCoder *)decoder
{
// if ([super conformsToProtocol:@protocol(NSCoding)]) { ... }
if ((self = [self init])) {
name_ = [decoder decodeObjectForKey:@"name"];
age_ = [decoder decodeIntegerForKey:@"age"];
}
return self;
}
@end
Только программист отвечает
за соответствие ключей.
Если в очередной версии
программы появится новое
поле, и мы попытаемся
загрузить новый объект из
старого файла, возникнет
исключение.
NSCoding
18. Хранение данных
Как избежать ошибок при загрузке объекта:
● Проверять наличие соответствующего поля методом
- (BOOL)containsValueForKey:(NSString *)key
● Не использовать строковые литералы для ключей, а использовать например следующую
обёртку, позволяющую компилятору находить ошибки в ключах:
#define STR_PROP( prop ) NSStringFromSelector(@selector(prop))
[coder encodeObject:self.someProp forKey:STR_PROP(someProp)];
● Хранить номер версии формата объекта и перед загрузкой остальных полей выбирать
десериализатор соответствующей версии.
NSCoding
19. Хранение данных
При работе с БД:
● Объём вспомогательного кода больше.
● О надёжности и производительности думает отдельный компонент.
● Хорошо подходит для работы с большим количеством однородных данных.
● Продвинутые возможности поиска, фильтров и других "хитрых" запросов.
DB vs NSCoding
20. Хранение данных
● Реляционная БД, ограниченно поддерживающая SQL.
● Популярный стандарт с open-source реализацией. Написан на C. Поддерживается практически на всех
платформах.
● Очень надёжная реализация. (Объём тестов в >1000 раз больше самой реализации.)
● Богатая документация.
● Стандартно поддерживается iOS SDK.
● Упрощённая схема общения между клиентским кодом и движком БД (движок встраивается прямо в
программу). Это упрощает код и ускоряет общение с БД.
● Упрощённая схема физического хранения данных (всё в одном блокируемом файле).
● Тип столбца не определяет тип хранимого значения, то есть в любой столбец можно занести любое
значение.
21. Хранение данных
пример запроса (чтение нескольких строк)
sqlite3 *_contactDB;
NSString *_databasePath;
char *query_stmt = [@"SELECT name FROM people WHERE age=30" UTF8String];
char *dbpath = [_databasePath UTF8String];
sqlite3_stmt *statement;
//...
sqlite3_open(dbpath, &_contactDB);
sqlite3_prepare_v2(_contactDB, query_stmt, -1, &statement, NULL);
while (sqlite3_step(statement) == SQLITE_ROW) {
NSString *name = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text
(statement, 0)];
//...
}
sqlite3_finalize(statement);
sqlite3_close(_contactDB);
22. Хранение данных
FMDB
● Сторонняя библиотека с открытым исходным кодом.
● Обёртка поверх SQLite.
● Предоставляет API для SQLite на Objective-C (не C).
● Удобное приведение данных к нужному типу.
● Удобное асинхронное выполнение транзакций в блоках.
23. Хранение данных
NSString *dbPath = /*...*/;
NSString *createTableQuery = @"CREATE TABLE people (id INTEGER PRIMARY KEY DEFAULT NULL, name
TEXT DEFAULT NULL, age INTEGER DEFAULT NULL)";
FMDatabase *database = [FMDatabase databaseWithPath:dbPath];
[database open];
[database executeUpdate:createTableQuery];
[database close];
FMDB пример запроса (создание таблицы)
24. Хранение данных
FMDB пример запроса (вставка нескольких строк)
FMDatabaseQueue *queue = [[FMDatabaseQueue alloc] initWithPath:dbPath];
[queue inDatabase:^(FMDatabase *db) {
[db beginTransaction];
for (Person *person in people) {
[db executeUpdate:@"INSERT INTO people (name, age) VALUES (?, ?)",
person.name,
@(person.age)];
}
[db commit];
}];
25. Хранение данных
FMDatabaseQueue *queue = [[FMDatabaseQueue alloc] initWithPath:dbPath];
[queue inDatabase:^(FMDatabase *db) {
FMResultSet *results = [db executeQuery:@"SELECT * FROM people WHERE age=?", @30];
while ([results next]) {
NSString *name = [results stringForColumn:@"name"];
int age = [results intForColumn:@"age"];
//...
}
}];
FMDB пример запроса (чтение нескольких строк)