Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 861 сообщений
Cообщения с меткой

счастье есть - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

Процедурные макросы в Rust 1.15

Пятница, 10 Февраля 2017 г. 18:10 (ссылка)

Ребята, свершилось! После долгих шести недель ожидания наконец вышла версия Rust 1.15 с блекджеком и процедурными макросами.



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



А что же это дает простым смертным? Практически бесплатную [де]сериализацию, удобный интерфейс к БД, интуитивный веб фреймворк, выводимые конструкторы и много чего еще.



Да, если вы все еще не добрались до этого языка, то сейчас самое время попробовать, тем более, что теперь установить компилятор и окружение стало можно одной строкой:



curl https://sh.rustup.rs -sSf | sh


Впрочем, обо всем по порядку.



Немного истории



Долгое время автоматически выводить можно было только стандартные маркеры и типажи, такие как Eq, PartialEq, Debug, Copy, Clone.



Вместо ручной реализации достаточно было написать #[derive(имя_типажа)], а остальное компилятор делал за нас:



#[derive(Eq, Debug)]
struct Point {
x: i32,
y: i32,
}


Программистам, работавшим с Haskell, все это должно быть очень знакомо (включая названия), да и применяется оно примерно в тех же случаях. Компилятор, обнаружив атрибут derive, пройдется по списку типажей и реализует для них стандартный набор методов в меру своего понимания.



Например, для типажа Eq будет реализован метод fn eq(&self, other: &Point) -> bool путем последовательного сравнения полей структуры. Таким образом, структуры будут считаться равными, если равны их поля.



Конечно, в тех случаях, когда желаемое поведение отличается от поведения по умолчанию, программист может определить реализацию типажа собственноручно, например так:



use std::fmt;

impl fmt::Debug for Point {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "My cool point with x: {} and y: {}", self.x, self.y)
}
}


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



Процедурные макросы



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



Процедурные макросы позволяют добавить в язык элемент метапрограммирования и тем самым существенно упростить рутинные операции, такие как сериализация или обработка запросов.



Ну хорошо, скажете вы, это все чудесно, а где же примеры?



Сериализация



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



А если нет? Если данные представляют собой набор сложных структур со строками произвольной длины, массивами, хеш таблицами и B-деревьями? Так или иначе, такие данные придется сериализовать.



Конечно, в истории Computer Science такая задача возникала неоднократно и ответ обычно кроется в библиотеках сериализации, навроде Google Protobuf.



Традиционно программист строит метаописание данных и протоколов на специальном декларативном языке, а затем все это дело компилируется в код, который уже используется в бизнес-логике.



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



// Подключаем библиотеку и макро-определения
#[macro_use]
extern crate serde_derive;

// Подключаем поддержку JSON
extern crate serde_json;

// Наша структура
#[derive(Serialize, Deserialize, Debug)]
struct Point {
x: i32,
y: i32,
}

fn main() {
// Создаем экземпляр структуры
let point = Point { x: 1, y: 2 };

// Конвертируем экземпляр в строку JSON
let serialized = serde_json::to_string(&point).unwrap();

// На печать будет выведено: serialized = {"x":1,"y":2}
println!("serialized = {}", serialized);

// Конвертируем строку JSON обратно в экземпляр Point
let deserialized: Point = serde_json::from_str(&serialized).unwrap();

// Ожидаемо, результат будет: deserialized = Point { x: 1, y: 2 }
println!("deserialized = {:?}", deserialized);
}


Помимо JSON библиотека Serde поддерживает еще массу форматов: URL, XML, Redis, YAML, MessagePack, Pickle и другие. Из коробки поддерживается сериализация и десериализация всех контейнеров из стандартной библиотеки Rust.



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



Чтение конфигурации



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



Достаточно создать файл в одном из поддерживаемых форматов и просто десериализовать его в структуру конфигурации вместо унылого парсинга и разбора параметров по одному.



Работа с БД



Разумеется, одной сериализацией дело не ограничивается. Например, библиотека Diesel предоставляет удобный интерфейс к базам данных, который тоже стал возможен благодаря процедурным макросам и автоматическому выводу методов в Rust:



Пример работы с БД
// ...
#[derive(Queryable)]
pub struct Post {
pub id: i32,
pub title: String,
pub body: String,
pub published: bool,
}
// ...
fn main() {
let connection = establish_connection();
let results = posts.filter(published.eq(true))
.limit(5)
.load::(&connection)
.expect("Error loading posts");

println!("Displaying {} posts", results.len());
for post in results {
println!("{}", post.title);
println!("----------\n");
println!("{}", post.body);
}
}


Полный пример можно найти на сайте библиотеки.



А что там с вебом?



Может быть, мы хотим обработать пользовательский запрос? И снова возможности языка позволяют писать интуитивный код, который «просто работает».



Ниже приведен пример кода с использованием фреймворка Rocket который реализует простейший счетчик:



Смотреть
struct HitCount(AtomicUsize);

#[get("/")]
fn index(hit_count: State) -> &'static str {
hit_count.0.fetch_add(1, Ordering::Relaxed);
"Your visit has been recorded!"
}

#[get("/count")]
fn count(hit_count: State) -> String {
hit_count.0.load(Ordering::Relaxed).to_string()
}

fn main() {
rocket::ignite()
.mount("/", routes![index, count])
.manage(HitCount(AtomicUsize::new(0)))
.launch()
}


Или, может быть, надо обработать данные из формы?



#[derive(FromForm)]
struct Task {
complete: bool,
description: String,
}

#[post("/todo", data = "")]
fn new(task: Form) -> String { ... }


Выводы



В общем и целом становится понятно, что механизмы метапрограммирования в Rust работают очень неплохо. А если вспомнить, что сам язык является безопасным в отношении памяти и позволяет писать безопасный многопоточный код, свободный от состояния гонок, то все становится совсем хорошо.



Очень радует, что теперь эти возможности доступны и в стабильной версии языка, ведь многие жаловались, что ночные сборки приходилось использовать только из-за Serde и Diesel. Теперь такой проблемы нет.



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


Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/321564/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Licoris_Infernum

на сохранении (1 сентября 2015)

Понедельник, 08 Ноября 2016 г. 00:27 (ссылка)

Вчера пошла к своему Г. Дождалась очереди чтобы стать на учёт... Стала и направили меня в больницу на сохранении. После сдачи крови, ЭКГ и УЗИ меня положили на сохранение. По осмотру у меня эрозия шейки матки, что страшно меня напугало и тонус по задней стенке. Сказали, что от этого и боли и тошнота. Взяли ещё кучу анализов и вот второй день я в больнице. Сейчас назначили колоть магнезию и глюкозку. Жутко болючие уколы однако. И про писали таблетки. Сегодня на осмотре врач сказала, что по результатам анализов ещё добавит лекарства. Зато в больнице спокойно, тихо. Кормят вполне не плохо. Хотя у меня дробленое питание. Есть понемногу по 7-8раз в день. Ну и пока с новостями все. Плод сказали хорошо растёт. Матка мягкая и закрытая.

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
vancsoftremat

NicoTea спрей от курения

Понедельник, 19 Сентября 2016 г. 10:25 (ссылка)

bigimg (197x700, 84Kb)
k33Kdr4MiYjySA1ZV0JZ6NusZEvjAvFv0gcH6p7cmecRp9V8m4PvKWJlFINAUTySLZyfyeDEZaaXzR2PYgJYDuTgb31gsfGCVPShXnZfi7EbiCN9Tt4
k33Kdr4MiYjySA1ZV0JZ6NusZEvjAvFv0gcH6p7cmecRp9V8m4PvKWJlFINAUTySLZyfyeDEZaaXzR2PYgJYDuTgb31gsfGCVPShXnZfi7EbiCN9Tt4

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] Выбираем длинный путь (или прощай MAX_PATH)

Пятница, 05 Августа 2016 г. 15:33 (ссылка)





Многим пользователям ПК под управлением ОС Windows, не говоря о разработчиках, знакомы проблемы при работе с длинными (более 260 символов, MAX_PATH) путями файлов или каталогов.



В данной статье рассматриваются способы избавления от этого пережитка при разработке приложений на различных платформах (WinApi, .Net Framework, .Net Core) и активации нативной поддержки длинных путей в Windows 10 (Anniversary Update).



Приложения Win API



В приложениях, которые используют Win API для работы с файлами, рецепт избавления от ограничения MAX_PATH был известен с незапамятных времён – необходимо было использовать Unicode версию функции с окончанием «W» для работы с директорией или файлом и начинать путь с префикса \\?\. Это давало возможность использовать пути длинной до 32767 символов.



В Windows 10 (1607) поведение функций для работы с файлами изменилось: появилась возможность отключить проверку ограничений MAX_PATH на уровне системы.



Это коснулось следующих функций:
Для работы с каталогами: CreateDirectoryW, CreateDirectoryExW, GetCurrentDirectoryW, RemoveDirectoryW, SetCurrentDirectoryW. И для работы с файлами: CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.



Это избавляет от необходимости использовать префикса \\?\ и потенциально даёт шанс приложениям, работающим напрямую или косвенно через Win API, получить поддержку длинных путей без необходимости их пересборки. Как активировать эту возможность описано в конце статьи.



.Net Framework



Хотя .Net Framework и использует Win API для работы с файлами — предыдущее изменение не принесло бы результата, т.к. в код BCL встроены предварительные проверки на допустимость длинны имён каталогов и файлов, и до вызова функций Win API дело даже не доходило, выдавая известное исключение. По многочисленным просьбам сообщества (более 4500 на UserVoice) в версии 4.6.2 из кода BCL вырезали проверки ограничения длинны пути, отдав это на откуп операционной и файловой системам!



Вот что это даёт:


  • При использовании префикса “\\?\” мы можем работать с длинными путями как в Win API,
    Directory.CreateDirectory("\\\\?\\" + long_dir_name);

  • Если активировать нативную поддержку длинных имен файлов Windows 10 (1607), то даже не потребуется использовать префикс!



Как включить:


  • Использовать .Net Framework 4.6.2 как цель при сборке приложения.

  • Использовать конфигурационный файл, например, если приложение уже было собрано под .Net 4.0:
















.Net Core



Тут поддержку длинных путей анонсировали ещё в ноябре 2015 года. Видимо сказалось Open Source природа проекта и отсутствие строгой необходимости обеспечения обратной совместимости.



Как включить:

Всё работает из коробки. В отличие от реализации в .Net Framework – тут нет необходимости в добавлении префикса “\\?\” – он добавляется автоматически при необходимости.



Вот тут можно посмотреть пример.



Как включить поддержку длинных путей в Windows 10 (1607)



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



Включить встроенную поддержку длинных путей можно создав или изменив следующий параметр системного реестра: HKLM\SYSTEM\CurrentControlSet\Control\FileSystem Параметр LongPathsEnabled (Тип: REG_DWORD) 1 – соответствует значению включено.







Или через групповые политики (Win+R\gpedit.msc) Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths.Оно же в локализованном варианте: Конфигурация компьютера > Административные шаблоны > Система > Файловая система > Включить длинные пути Win32.







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

Но они сходятся в формате задания данной опции:





true




С CMD, к сожалению, это не сработает, на данный момент, из-за особенностей работы с путями, а в PowerShell должно всё заработать.



P.S.



На этом мой небольшой пятничный пост заканчивается, оставив за рамками вопросы полноты реализации поддержки длинных путей в Windows 10 (1607), или работоспособность при использовании различных комбинаций редакций Windows, файловых систем и API. По мере поступления новых фактов и результатов экспериментов пост будет обновляться.



Спасибо за внимание!
Original source: habrahabr.ru.

https://habrahabr.ru/post/307186/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] Выбираем длинный путь (или прощай MAX_PATH)

Пятница, 05 Августа 2016 г. 15:33 (ссылка)





Многим пользователям ПК под управлением ОС Windows, не говоря о разработчиках, знакомы проблемы при работе с длинными (более 260 символов, MAX_PATH) путями файлов или каталогов.



В данной статье рассматриваются способы избавления от этого пережитка при разработке приложений на различных платформах (WinApi, .Net Framework, .Net Core) и активации нативной поддержки длинных путей в Windows 10 (Anniversary Update).



Приложения Win API



В приложениях, которые используют Win API для работы с файлами, рецепт избавления от ограничения MAX_PATH был известен с незапамятных времён – необходимо было использовать Unicode версию функции с окончанием «W» для работы с директорией или файлом и начинать путь с префикса \\?\. Это давало возможность использовать пути длинной до 32767 символов.



В Windows 10 (1607) поведение функций для работы с файлами изменилось: появилась возможность отключить проверку ограничений MAX_PATH на уровне системы.



Это коснулось следующих функций:
Для работы с каталогами: CreateDirectoryW, CreateDirectoryExW, GetCurrentDirectoryW, RemoveDirectoryW, SetCurrentDirectoryW. И для работы с файлами: CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.



Это избавляет от необходимости использовать префикса \\?\ и потенциально даёт шанс приложениям, работающим напрямую или косвенно через Win API, получить поддержку длинных путей без необходимости их пересборки. Как активировать эту возможность описано в конце статьи.



.Net Framework



Хотя .Net Framework и использует Win API для работы с файлами — предыдущее изменение не принесло бы результата, т.к. в код BCL встроены предварительные проверки на допустимость длинны имён каталогов и файлов, и до вызова функций Win API дело даже не доходило, выдавая известное исключение. По многочисленным просьбам сообщества (более 4500 на UserVoice) в версии 4.6.2 из кода BCL вырезали проверки ограничения длинны пути, отдав это на откуп операционной и файловой системам!



Вот что это даёт:


  • При использовании префикса “\\?\” мы можем работать с длинными путями как в Win API,
    Directory.CreateDirectory("\\\\?\\" + long_dir_name);

  • Если активировать нативную поддержку длинных имен файлов Windows 10 (1607), то даже не потребуется использовать префикс!



Как включить:


  • Использовать .Net Framework 4.6.2 как цель при сборке приложения.

  • Использовать конфигурационный файл, например, если приложение уже было собрано под .Net 4.0:
















.Net Core



Тут поддержку длинных путей анонсировали ещё в ноябре 2015 года. Видимо сказалось Open Source природа проекта и отсутствие строгой необходимости обеспечения обратной совместимости.



Как включить:

Всё работает из коробки. В отличие от реализации в .Net Framework – тут нет необходимости в добавлении префикса “\\?\” – он добавляется автоматически при необходимости.



Вот тут можно посмотреть пример.



Как включить поддержку длинных путей в Windows 10 (1607)



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



Включить встроенную поддержку длинных путей можно создав или изменив следующий параметр системного реестра: HKLM\SYSTEM\CurrentControlSet\Control\FileSystem Параметр LongPathsEnabled (Тип: REG_DWORD) 1 – соответствует значению включено.







Или через групповые политики (Win+R\gpedit.msc) Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths.Оно же в локализованном варианте: Конфигурация компьютера > Административные шаблоны > Система > Файловая система > Включить длинные пути Win32.







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

Но они сходятся в формате задания данной опции:





true




С CMD, к сожалению, это не сработает, на данный момент, из-за особенностей работы с путями, а в PowerShell должно всё заработать.



P.S.



На этом мой небольшой пятничный пост заканчивается, оставив за рамками вопросы полноты реализации поддержки длинных путей в Windows 10 (1607), или работоспособность при использовании различных комбинаций редакций Windows, файловых систем и API. По мере поступления новых фактов и результатов экспериментов пост будет обновляться.



Спасибо за внимание!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/307186/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<счастье есть - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda