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


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

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

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

Пишем Guard

Вторник, 13 Июня 2017 г. 11:34 (ссылка)



Привет, хабр!



Есть несколько способов проверять аргументы на правильность. Например, для проверки на null можно использовать:




  1. if (!ReferenceEquals(arg, null)) throw…

  2. Code Contracts: Contract.Requires(!ReferenceEquals(arg, null))

  3. Guard.IsNotNull(arg, nameof(arg))



В статье я рассмотрю только третий вариант (все примеры кода — для C#, однако некоторые из них будут полезны и в Java).



Ошибка №1: не подготовились к проверкам аргументов и в теле метода



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

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



Итак, для начала лучше всего заранее договориться об именованиях обоих случаев. Например, Guard.IsNotNull для тела метода и Guard.ArgumentIsNotNull для аргументов



Ошибка №2: вызов string.format при каждой проверке



Сразу примеры ошибочного кода:



Guard.IsNotNull(connection, $"Unable to setup connection with host {host} and port {port}")
Guard.IsNotNull(connection, string.Format("Unable to setup connection with host {0} and port {1}", host, port)) // это просто развернутая строчка выше


Оба примера выше генерят строку на каждую проверку (в теории, все Guard не бросают исключений на боевом сервере, то есть мы генерим немало строк просто для того, чтобы их потом съел сборщик мусора).

Исправленный вариант:



public static class Guard
{
public static void IsNotNull(object value, string format, params object[] formattingArgs) // тут мы сконструируем строку в самый последний момент, когда выделение небольшого куска памяти уже не будет ударять по производительности
}


На самом деле вариант выше тоже плохой. В нем уже не создается строка, однако на каждый вызов метода создается новый массив formattingArgs. Конечно, для него выделяется меньше памяти, однако такие методы всё равно будут нагружать на сборщик мусора.

Самое обидное, что программа будет тормозить, однако простой профайлинг не подстветит проблему. У вас просто программа будет чаще останавливаться для очистки памяти (я исправил такую ошибку в одной из программ, сборка мусора стала занимать вместо прежних 15% всего лишь 5%).



Итак, поступаем так же, как сделано в string.Format: нагенерим побольше методов для разного числа аргументов.



public static class Guard
{
public static void IsNotNull(object value, string errorMessage)

public static void IsNotNull(object value, string errorMessageFormat, object arg1)

public static void IsNotNull(object value, string errorMessageFormat, object arg1, object arg2)

public static void IsNotNull(object value, string errorMessageFormat, object arg1, object arg2, object arg3)
}


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

Рассмотрим вызов метода: Guard.IsNotNull(connection, "Unable to setup connection with host {0} and port {1}", host, port). Переменная port имеет тип int (чаще всего по крайней мере). Получается, что для того, чтобы передать переменную по значению, .Net каждый раз будет создавать int в куче, чтобы передать его как object. Эта ситуация будет встречаться намного реже, но всё же будет.

И другая проблема — если изначальный проверяемый объект — это value type (например, мы проверяем на null в generic методе, который не имеет ограничений на тип).

Исправить это можно увеличением созданием Generic методов для проверок:



public static class Guard
{
public static void IsNotNull(TObject value, string errorMessage)

public static void IsNotNull(TObject value, string errorMessageFormat, TArg1 arg1)

public static void IsNotNull(TObject value, string errorMessageFormat, TArg1 arg1, TArg2 arg2)

public static void IsNotNull(TObject value, string errorMessageFormat, TArg1 arg1, TArg2 arg2, TArg3 arg3)
}


Ошибка №3: отсутствие кодогенерации



Как видно выше, для того, чтобы удобно проверять значения на null нам надо:




  1. Создать два набора функций — для проверки аргументов и для проверок в теле метода

  2. В каждом наборе — создать кучу дубликатов, который будут содержать один и тот же код



Без кодогенерации относительно сложно добавлять новые функции, а уж тем более менять их.



Еще улучшения



Пункты ниже не ускорят вашу программу, а просто незначительно улучшат читаемость



ReSharper Annotations



Часто ReSharper ругается, что значение может быть null, хотя его вроде бы проверили с помощью Guard'а. В этом случае можно либо начать постепенно забивать на предупреждения в коде (что может быть чревато), либо объяснить проверяющим, что всё нормально. Полный список аттрибутов можно просмотреть здесь, однако вот полезные для нас:




  • AssertionMethodAttribute и AssertionConditionAttribute — они вдвоем объяснят системе, что метод только проверяет аргумент, а заодно и распишут, что именно проверяют

  • NoEnumerationAttribute — покажет, что если передать на вход IEnumerable, то по нему никто не будет итерироваться

  • CollectionAccessAttribute — если вы вдруг решили проверить все аргументы коллекции (например, что их не больше пяти, и что они не null), то с помощью этого аттрибута можно сказать, что именно происходит с коллекцией (чтение, запись и т.д.)

  • StringFormatMethodAttribute — объясняет, что один из параметров является строкой, которую потом будут использовать как формат. В этом случае её дополнительно проверят, что она может быть разобрана string.Format, что число аргументов соответствует ожиданиям и т.д. Я, кстати, еще не видел проекта, в котором была бы отключена эта проверка, и в котором после её включения не было бы ошибок, что string.Format просто не может выполниться



Записывать больше информации



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




  1. Тип (а лучше — вызов ToString у него), который оказался некорректным.

  2. Если есть еще аргументы для сравнения — то информацию о них тоже

  3. Полный stacktrace (т.к. иначе он обрезается до места, где исключение было поймано)



Заключение



Надеюсь, эта статья поможет сравнительно просто улучшить проверки в вашем коде.

Немного ранее я реализовал все наработки в библиотеке (исходный код под MIT лицензией) — так что можете просто использовать её (или скопировать код к себе и т.д.)


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

https://habrahabr.ru/post/330150/

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

15 лучших рецептов для Умного Дома с ioBroker

Вторник, 06 Июня 2017 г. 14:18 (ссылка)

ioBroker — это конструктор с помощью которого можно собрать свой Умный Дом.







Но ведь каждому нужно что-то своё, и у каждого разные предпосылки и возможности, бюджет, доступное свободное время на планирование и реализацию, вкусы и предпочтения. Равнодушному к процессу автоматизирования соседу, но ценящему комфорт, скорость и дизайн элитных приборов — это одно, а увлеченному автоматизацией и экспериментами, другое.

ioBroker — это универсальный конструктор, позволяющий реализовать самые сумасшедшие и невероятные идеи в области Домашней Автоматизации.

Для большей наглядности, приведу Вам 15 лучших рецептов из “Кулинарной книги” от ioBroker

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




  1. Электический подогрев полов в ванной автоматически включается в 6 часов.

  2. Жалюзи на окнах считывают информацию из календаря о времени восхода солнца и именно тогда открываются, пока хозяин еще мирно спит в кровати.

  3. Просыпаемся, встаём, идем по коридору, свет автоматически включается. Одновременно сенсор движения сообщает эту информацию чайнику и кофеварке.

  4. Коферка включается, чайник начинает кипятить воду. Включается музыка или телевизор, а также определенная сцена для освещения, которую мы сами предварительно настроили и назвали “Доброе утро”

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

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

  7. Просим Алеху соединить нас по скайпу с мамой. Про Алексу будет отдельная книга.

  8. С помощью Алексы мы можем полностью управлять домом одним только голосом: включать, выключать, убавлять свет, открывать и закрывать окна, включать и выключать термостаты, музыку итд. Это очень удобно, если готовишь еду и руки заняты.

  9. Выходя из дома, важно нажать одну единственную кнопку, и Умный Дом выключит везде свет, отключит приборы, убавит отопление, выключит музыку, телевизор и сообщит о том, что вы забыли закрыть окна или внутреннюю дверь в сад.

  10. Умный Дом вышлет сообщение с фото в телеграмм о том, кто и во сколько ушел, пришел, звонил в дверь. Очень удобно, если приходит уборщица, или соседка полить цветы, за котом наблюдать, за детьми, которые ушли в школу или вернулись из школы с толпой друзей и готовы разнести квартиру.

  11. Если кто-то забыл ключ, то можно дистанционно открыть дверь. Если кто-то забыл закрыть дверь, то Умный Дом обязательно свяжется с вами или соседями, чтобы они проконтроллировали ситуацию.

  12. Естественно о любой, непредусмотренной регламентом активности в доме, Умный Дом сразу будет сообщать удобным способом. Может напугать грабителя громкой сиреной и яркокрасным мигающим освещением, заставляя покинуть помещение и вызывая полицию.

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

  14. Можно из отпуска наблюдать за любимым цветком в горшке, если установить туда сенсор, который будет сообщать об освещенности, составе почвы и влажности.

  15. Перед сном, за час, всё освещение в доме убавляется и переключается на цвета заката, чтобы организм настраивался на сон. Уже лежа в постели можно попросить Алексу поставить будильник на 6 часов и выключить все приборы в доме, не вставая с кровати.


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

https://habrahabr.ru/post/330332/

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

Amazon Alexa Skill Smart Home c Open Source платформой для Домашней Автоматизации ioBroker

Четверг, 01 Июня 2017 г. 23:36 (ссылка)

Сначала немного о том, что же такое ioBroker?



И о том, кто же является разработчиком ioBroker?




ioBroker это OpenSource проект, который разрабатывается сообществом специалистов информатиков. Каждый, кто интересуется темой Smart Home может присоединиться к проекту и под лицензией MIT на Github начать разрабатывать приложения. Дополнительно имеется обширный форум для конечных пользователей, в котором активно обсуждаются новые идеи, проблемы и пожелания клиентов. Опытные разработчики, некоторые из которых имеют 17 лет опыта работы в промышленной автоматизации на ведущих немецких фирмах консультируют по вопросам автоматизации дома, и её внедрения. Проверенные и отработанные идеи размещаются на так называемом Trello-Whiteboard, это доска с текущими, актуальными заданиями, таким образом любой может на неё заглянуть и быть в курсе происходящего.







Техническая реализация платформы ioBroker



ioBroker полностью разработан на Node.js, интуитивно понятный, гибко подстраивающийся под новые условия, очень легко дополняемый и расширяемый. Каждый, кто владеет JavaScript, может заниматься расширением возможностей системы ioBroker.

Посредством адаптеров ioBroker может общаться с большим количеством разных систем из области Умный Дом (например Homematic, KNX, FS20) и Home Entertainment(развлечения) (z.B. Sonos, Dreambox, AV-Receiver и SmartTV). Кроме того встроена возможность обмена данными с различными интернет-сервисами Webservices (например weatherunderground.com) и разнообразными базами данных (например MySQL, InfluxDB oder Graphite).



Установка операционной системы и железа Hardware



ioBroker работает на всём оборудовании и всех операционных системах, на которых можно запустить Node.js (ARM, x86, Windows, Linux, OSX). При этом не имеет значения какой “компьютер” вы используете Raspberry, Windows-Server, Synology-NAS или MacOS. Так как ioBroker для каждого нового драйвера запускает новый Node.js- процесс, то оперативная память становится ограничивающим фактором. Для каждого отдельного драйвера требуется примерно 10-60 Мб, в зависимости от сложности. Итак, каждый пользователь, даже не являясь профессионалом может применять систему ioBroker. Те, кто не хочет связываться с Linux, могут вместо него запросто использовать Windows.

Еще одно незаменимое преимущество, это создание системы из нескольких серверов, работающих, как одно целое (Multihost). Например, если со временем, пользователь расширит свою систему домашней автоматизации и его Raspberry станет работать очень медленно, он может просто инсталлировать вторую Raspberry, чтобы распределить между ними текущие задания. Самая сильная отличительная черта ioBroker возможность визуализации. Посредством Drag & Drop можно разрабатывать сложные и красивые изображения-визуализации для дома.



youtu.be/nCjFuV5oR_Q







Первый запуск ioBroker



Те, кто впервые запускают ioBroker, сначала пугаются сколько возможностей и драйверов имеется у этой системы. Разработчики ioBroker создали помощника поиска устройств и сервисов — Wizard. С помощью Wizard можно автоматически распознавать и подключать большое количество стандартных приборов от совершенно разных производителей.





Видео для большей наглядности:



youtu.be/OmpFRHG755M



Какие драйвера уже имеются для ioBroker?



Освещение, лампы: Philips Hue, Osram Lightify

Развлечение, телевидение, музыка: Samsung TV, LG TV, Sonos, Logitech Harmony, Onkyo, Squeezebox, Yamaha

Голосовое управление: Apple Homekit, Alexa

Домашнее оборудование, пылесосы, газонокосилки, принтеры: Botvac Saugroboter, Worx Landroid Rasenm"aher, Epson Drucker, Amazon-Dash Button, Xiaomi Vacuum Cleaner

Сервисы календарь от гугла, прогноз погоды, емейл: Feiertage, Kalender (z.B. Google Calendar), Deutscher Wetterdienst (предупреждения), E-Mail-Versand

Smart Home системы различных производителей: Netatmo, Homematic, innogy SmartHome

Прочие адаптеры: DMX512 устройства Art-Net, B-Control Energy Manager, FS20, Max!, Chromecast, HMS, EM1000WZ,), FHEM, Foobar 2000, Fritzbox, Fronius конвертер, KNX, Buderus KM200, KODI, Mega-D, Modbus, MqTT, MPD Protocol, nooLite, разные UPS/USV, Pushover, Pushsaver, Pushbullet, RFLink, TR-064,…



И напоследок самое интересное.



ioBroker также работает с Amazon Alexa



Для тех, кто владеет самыми азами английского или немецкого языка, мы написали сертифицированный компанией Амазон адаптер ioBroker-Skill, который позволяет голосом через Amazon Alexa управлять устройствами в доме. Настройка проходит в несколько шагов:




  • Создаётся account ioBroker-Cloud-Account и генерируется App-ID

  • Устанавливается и конфигурируется адаптер Cloud-Adapter

  • ioBroker-Skill активируется в самой Alexa

  • Затем ioBroker-Skill соединяется с ioBroker-Cloud

  • Дальнейшую подробную информацию можно прочитать в инструкции или на форуме.





youtu.be/i5WZFClqksc



alexa.amazon.de/spa/index.html#skills/dp/B01MRXCC3J



Видео:

youtu.be/bTS6J2EkOYQ

youtu.be/i5WZFClqksc



Спасибо за внимание, буду готовить новую статью




Какую систему автоматизации вы используете у себя дома?




































































Проголосовал 1 человек. Воздержавшихся нет.





Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.


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

https://habrahabr.ru/post/330026/

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

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

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

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

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

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

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

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

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

Sleep Master

Суббота, 04 Марта 2017 г. 18:55 (ссылка)

bigimg (197x700, 84Kb)
gLlz2Qf3VP1Iq6j1lH2xIDvksPKWP35Ec6zreeXLQ48iyuLjkdIY6KrWs08oPDaL

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

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

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

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

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

Следующие 30  »

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

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

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