...

суббота, 24 ноября 2018 г.

[Перевод] Конференция DEFCON 21. DNS может быть опасен для вашего здоровья. Часть 2

Конференция DEFCON 21. DNS может быть опасен для вашего здоровья. Часть 1

При этом предполагалось, что границы домена организации – это foo.com и вы никогда не захотите использовать www.com. Microsoft изменила это поведение DNS, потому что, очевидно, не все организации имеют два уровня для доменных имён.

Если ваш домен верхнего уровня – Великобритания, то при соединении с конкретным доменом ad.foo.co.uk поведение DNS по умолчанию будет выглядеть так:

То есть запрос будет отсылаться за границы вашего доменного имени на www.co.uk. Поэтому был создан случайный хотфикс, исправление безопасности, сужающее организационные границы домена до 3-х, и в этом случае деволюция DNS останавливалась после второго запроса www.foo.co.uk.

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

На следующем слайде показано дерево решений, которое использует Microsoft перед созданием запроса DNS.

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

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

Таким образом, компании вносят изменения через правку регистра или групповой политики, пытаясь восстановить первоначальное поведение DNS, но часть из них не может сделать это должным образом там, где поведение было изменено другим пакетом исправлений. Они пытаются отменить изменения, чтобы восстановить это утраченное поведение, потому что хотят, чтобы клиенты могли снова обращаться к foo.com.

Но в большинстве случаев, когда они не могут восстановить двухуровневую деволюцию, они просто избавляются от оригинального двухуровневого ограничения. Спасибо тебе, Microsoft, за Windows 7 — теперь вы можете изменить три уровня домена, существующие по умолчанию, на 2, но система не позволить сократить вам их до одного.

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

Первый домен – это сокращенное имя офисного коммуникатора Microsoft, который запрашивает внутренний SIP-сервер. Следующие два имени, которые я нашёл в Google – это сокращённые имена разделов реестра ключей, который содержит веб-прокси, поэтому я присвоил эти имена своим серверам и стал ждать, свяжутся ли со мной клиенты. И они это сделали.

После того, как я зарегистрировал sipinternal.com, я стал получал запросы от клиентов офисного коммуникатора – на слайде показан пример запроса регистрации одного из ресурсов DHL, и как выяснилось, в мире существует тысячи случайных устройств, которые попытались у меня зарегистрироваться.

Я немного «поиграл» с ними, и это выглядело как несколько атак, которые вредоносный SIP-сервер осуществляет против коммуникаторов клиентов. Об этом будет мой следующий рассказ о proxy-phoenix.com

Здесь имелось несколько конечных пользователей из IBM и HP, которые начали просить меня стать их прокси-сервером, и теперь они имеют клиент в Phoenix, который «пропихивает» proxy-phoenix в качестве короткого имени своим пользователям. Я подумал, что это интересно. Но set-proxy.com получился еще интереснее.

Первые запросы, которые я получил, были попытками тысяч клиентов Windows загрузить файл установочного пакета proxy. Я выяснил, что IP-адрес источника был зарегистрирован на Артура Андерсена, неудачную бухгалтерскую фирму, которая обанкротилась вместе с корпорацией Enron.

Компания Accenture отделились от своей консалтинговой группы, что придает больше смысла в следующей части. Из неё видно, что их политика использования мобильных устройств потерпела крах (смех в зале).

Они продвигают конфигурацию, которая ссылается на расположение пакета proxy по сокращённому имени домена. И тысячи iPhone и iPad откликнулись на это короткое имя и стали просить меня предоставить им эти пакеты файлов. Даже то, что данная конфигурация не позволяет клиентам получить запрашиваемое, не заставила их задуматься, и они выходили прямо в интернет, минуя прокси, чтобы запросить у меня эти файлы.

Присмотревшись внимательней, я заметил, что получаю запросы не только от Accenture, но и от их клиентов, подключенных к сети этой компании. Таким образом, Accenture через неправильный DNS ставило под удар не только свою локальную сеть, но и сети всех подсоединённых к ней клиентов, позволяя взломать все находящиеся там устройства. Со мной напрямую связывались устройства, принадлежащие работникам компаний IBM, HP, Dow, Nokia, GE, Merck, Medco. Все они просили меня быть их прокси, и скажу вам, что я ожидал лучшего от компании Accenture.

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

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

Надпись на слайде: «Вы не являетесь владельцем этого домена. Им являюсь я».

Я продемонстрировал некоторые довольно уникальные способы, при которых «переворот» бита в DNS может быть опасным. Однако бит-сквоттинг не является огромной угрозой, поэтому бывает более интересно совершать трюки с неожиданным поведением DNS, вызванным комбинацией «заплаток» Microsoft с оригинальной конфигурацией, что делает её совершенно невразумительной.

При этом одна из худших вещей, которые проделывают компании в отношении DNS, это 100% нанесение вреда самим себе по неосторожности.

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

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

Я решил изучить, сколько компаний вынуждены поступать таким образом, и это не составило для меня никакого труда. Я начал с обращения за помощью к поисковику Google, чтобы найти имена ключей реестра, хранящие список поиска для выходных данных конфигурации Windows IP и список поиска суффиксов DNS.

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

Я проштудировал Google и создал уникальный список доменов, а затем стал их регистрировать. При рассмотрении IP-конфигурации я наткнулся на DNS суффикс rsquanta и сделал его основой для своего списка регистрации доменов.

После регистрации доменов с искажёнными именами, приведёнными на следующем слайде, я стал получать тысячи запросов от мобильных устройств, которые даже не знали, к какой компании обращались. Но я это узнал. Оказалось, что суффикс доменного имени rsquanta.com принадлежит крупной тайваньской компании по производству компьютерного «железа» Quanta Computer, в которой занято 60 тысяч человек.

Они разработали и производят детский стодолларовый ноутбук OLPC и сотрудничают с Facebook, проектируя и собирая их новые серверы на основе своих устройств. Я получал запросы на автообнаружение прокси, серверов SMS, почтовых серверов, серверов передачи файлов. Существовали десятки способов, с помощью которых я мог спокойно завладеть этими устройствами в Таиланде и ввести эксплойты для кражи учетных данных или перехвата передаваемых файлов. После того, как они попросили меня помочь им найти нужные ресурсы, атака способом «человек посередине» выглядела бы тривиально.

Но когда я определил источники запросов, которые я получал на свои подставные сервера, это действительно меня поразило. Я обнаружил, что регулярный трафик исходил от клиентских сетей, что указывало на существование устройств Quanta Computer в компаниях Cisco, Apple, 3m и Dell.

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

Их «железо» прочно обосновалось в оборудовании известных компаний и имело отношение к конфиденциальной интеллектуальной собственности. Таким образом, существовало много пассивной информации, которую я мог извлечь из их трафика. Я владел списком имён каждого устройства в их сети, я видел трафик компаний, скрытый от публики, который указывал на наличие нового контракта. Если трафик внезапно прекращался, я мог предположить, что они утратили контракт, и мог отследить, куда они пойдут дальше, куда эти сотрудники путешествуют и где они бывают.

Например, я вижу, что рядом с офисом компании открылась химчистка с Wi-Fi, потому что сотни устройств посылают оттуда мне запросы время от времени. Я даже вижу, что в этом городе есть люди для Black Hat и DefCon, позже мы поговорим об этом (смех в зале).

Так что ошибка такого рода является довольно серьезной. Чтобы её избежать, пожалуйста, проверяйте свою конфигурацию DNS. Используйте интернет для выяснения деталей своей внутренней конфигурации с помощью таких ресурсов, как Pastebin и Bleeping Computer.

Наблюдайте за своими DNS логами и следите за тем, чтобы ваши клиенты и клиенты ваших партнёров и производителей выполняли запросы именно так, как вы от них этого ожидаете. Если вы отслеживаете логи, то легко определите часто запрашиваемые домены для каждого устройства, каждого корпоративного актива.

Пару лет назад я начал покупать просроченные домены, которые ранее использовался в качестве C&C серверов. (смех в зале). Это было очень весело, так что сначала я захотел понять, сколько ещё инфекции там оставалось, затем выяснить, какого рода устройства все еще оставались зараженными и где они находились.

Поиск доменов из «черного списка» не составил труда, поэтому у меня на выбор были тысячи доменов ценой по 99 центов, и несколько из них я купил. На следующем слайде показан первый купленный мной домен – microsoft-windows-security.com. Он был заражен вирусом Win32:EyeStye, это бот-троян, клавиатурный перехватчик, который использовался для кражи конфиденциальной информации. Он перехватывал вводимые данные, а затем отсылал их этому домену в виде незашифрованных сообщений. Я ничего с ним не делал, я просто посылал ему ошибку 404 всякий раз, как он хотел со мной связаться, но он всё равно пытался прислать мне украденные данные.

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

Множество таких ботов продолжают вслепую доставлять своему домену полезную нагрузку. Я зарегистрировал десятки таких доменов, охватывающих тысячи зараженных устройств. Эти представители сети ботнет были просто брошены своими предыдущими хозяевами, которые не захотели прилагать усилий для их закрытия, а просто оставляли их в сети, пока не истечёт срок использования домена. Так что я потратил свои первые 6 долларов вот на эти зараженные вирусами домены (аплодисменты в зале).

У меня было 23000 устройств, посылающих отчеты моему серверу, и все эти домены были взяты из опубликованных «черных списков». Почему же так много компаний позволяло своим клиентам связываться с доменами, которые давно считались вредоносными?

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

Один из клиентов 82 тысяч устройств моей сети запрашивал его регулярно, и когда я стал разбираться, то обнаружил, что этого просроченного на полгода домена не было ни в одном «черном списке» и о нём не было ни одного упоминания в Google. Это выглядело слишком подозрительно, так что я купил его, и его тотчас наводнили клиенты. Это был обычный «граббер», который отправлял свою полезную нагрузку в незашифрованном виде и контролировал 10 000 зараженных устройств по всему миру. Некоторые из них располагались в областях с высочайшим режимом безопасности, и я обнаружил, что одно из зараженных устройств принадлежит очистным сооружениям города Феникса.

Я обратился к кому-то там из этой компании и сказал, что смогу идентифицировать вирус, если мне пришлют образец зараженного файла. Как только они прислали мне образец, я загрузил его в Virustotal, и обнаружил, что ни один из 42-х антивирусных сканеров не смог идентифицировать этот вирус. Этой вредоносной программе было 2 года, и мне показалось странным, что она не была обозначена как угроза ни в одном антивирусе. Но что было еще более странно, это то, почему он был заброшен? Совершенно невидимый для антивирусов, он действительно представлял собой очень ценную вирусную инфекцию. И вот один из иронических примеров – это был QA инженер компании Symantec, надеюсь, здесь его нет.

Здесь я вижу, как он работает в интернет — системе продажи билетов, и в данном случае он закрывает билет по причине проблемы безопасности sim-карты продукта. Думаю, довольно печально, что часть вредоносного программного обеспечения, которому уже 2 года, все еще включается в список исключений антивирусной программы компании инженером, который работает над исключением опасных дефектов и обеспечением безопасности продуктов компании.
Существует довольно много зараженных устройств, принадлежащих высокопоставленным чиновникам и работникам государственных учреждений, например, судебному секретарю, нижней палате представителей Конгресса США, офисам денежных переводов, газетам и даже кассиру Кредитного Союза федеральных служащих в Лэнгли! Это определенно лучшие 99 центов, которые я когда-либо тратил.

Страшно подумать, что вероятно, существуют миллионы зараженных устройств, пытающихся достичь Command & Control серверов, доступ к которым больше не разрешается. Если вы используете открытый или локальный DNS практически любого крупного провайдера, не давайте зараженным устройствам возможности достичь всего, что они пытаются разрешить, при этом не имеет значения, существует такой домен или нет. Потому что они подделают ответ того, что не существует, и укажут вам IP-адрес целевой страницы по умолчанию. Так что лог сервера, который является хостом этой страницы, содержит несметное количество украденных данных. Вы думаете, хозяева хоста делают что-нибудь, чтобы предотвратить подобное?

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

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

Я зарегистрировал несколько доменов, которых сейчас нет ни в одном «черном списке». Все образцы вредоносного ПО, которое осталось незамеченным крупными поставщиками антивирусных программ, я нашёл, анализируя логи DNS. Для того, чтобы обнаружить такие вирусы, я действую так:

  • собираю логи DNS, которые мне предоставляют люди, в общую базу данных;
  • регулярно отслеживаю запрашиваемые имена, впервые появившиеся в моей среде;
  • нахожу имена, запрашиваемые только одним клиентом;
  • просматриваю даты регистрации и устанавливаю владельцев и страну регистрации нового домена;
  • ищу домены, разрешающие использовать IP-адрес 127.0.0.1, вероятно, их создают «ботаники».

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

Сайт Bro поддерживает регистрацию DNS-запросов и хранит логи запросов. Я очень рекомендую вам DNS Anomaly Detection – это простой сценарий, который сравнивает ваши вчерашние домены из верхних строчек запросов, с сегодняшними, и отмечает, когда что-либо изменяется.

Passive DNS – это недавно выложенный патч Microsoft, который получился действительно хорошей «заплаткой» для имеющейся проблемы, он позволяет «выхватывать» запросы и ответы из файлов с расширением .pcap или из интерфейса.

Response Policy Zones обладает отличной функцией, позволяющей тонкую настройку подходов к блокировке и перенаправлению запросов для конкретных доменов, которая основана на ответах аутентифицированных серверов доменов. Если вы используете его совместно с DNS Sinkholes, то можете выдать себя именно за тот удаленный сервер, запросы которому пытаются отправить ваши клиенты.

На последнем слайде приводятся ссылки на документацию, которая поможет вдохновить вас начать «раскопки» трафика DNS, при которых вы сможете найти намного больше того, чем ожидали.

Спасибо за то, что потратили на меня своё время! Можете связаться со мной в любое время по этому адресу: bobx@rot26.net.


Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас оформив заказ или порекомендовав знакомым, 30% скидка для пользователей Хабра на уникальный аналог entry-level серверов, который был придуман нами для Вас:Вся правда о VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps от $20 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps до декабря бесплатно при оплате на срок от полугода, заказать можно тут.

Dell R730xd в 2 раза дешевле? Только у нас 2 х Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 ТВ от $249 в Нидерландах и США! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?

Let's block ads! (Why?)

Linux Foundation учредил фонды для GraphQL и Ceph — зачем они нужны и чего от них ждать

Некоммерческий консорциум The Linux Foundation объявил о формировании сразу двух новых фондов: GraphQL Foundation и Ceph Foundation. Далее — подробнее о каждом из них.


/ фото Roderick Eime CC BY-ND

Зачем понадобились новые организации


Главная цель Linux Foundation — продвижение и стандартизация Linux. Однако консорциум также занимается развитием всей экосистемы открытого ПО и связанных с ней продуктов. Недавно к ним добавились язык запросов GraphQL и объектная сеть хранения данных Ceph.

Язык GraphQL разработали в Facebook в 2012 году. Это синтаксис, который описывает, как запрашивать данные, и используется для взаимодействия с серверами. Создавался он в качестве замены REST API. Что касается Ceph, то она появилась в 2007 году, и через семь лет проект поглотила корпорация Red Hat. Сперва решение разрабатывали для суперкомпьютеров, но потом Ceph начали применять для развертывания облачной инфраструктуры. По данным за 2017 год (PDF), Ceph используют две трети облаков на OpenStack.

В целом за последние три года GraphQL и Ceph приобрели популярность в компаниях разных размеров: от ИТ-гигантов до небольших стартапов. К примеру, среди пользователей GraphQL числятся сотни организаций, в числе которых Coursera, GitHub, The New York Times, Twitter и Pinterest. Объектную сеть хранения Ceph используют облачные провайдеры (Rackspace, Linode), крупные финансовые организации (Bloomberg, Fidelity), автопроизводители (BMW) и др.

Linux Foundation увидели потенциал этих решений и решили их поддержать. Консорциумом были учреждены два новых фонда GraphQL Foundation и Ceph Foundation.

Чем займется GraphQL Foundation


Отдельный фонд создали, чтобы ускорить развитие технологической экосистемы вокруг GraphQL. Финансовую и организационную поддержку окажут Linux Foundation и ряд компаний: GitHub, Netflix, Shopify, Twitter, Pinterest и другие. Один из создателей инструмента Ли Байрон (Lee Byron) надеется, что фонд поможет GraphQL стать отраслевым стандартом.

Пока что GraphQL Foundation находится в стадии формирования — окончательный список стейкхолдеров фонда будет утвержден позднее. Затем начнется отбор представителей технологического комитета и отдела маркетинга. Всё это планируют закончить через пару месяцев. После фонд начнет работу над проектами GraphQL. Их список доступен на GitHub.

Особенности Ceph Foundation


В фонд развития Ceph входит тридцать ИТ-гигантов, включая Canonical, Intel, Red Hat и SUSE. Цели и задачи фонда — те же, что и в случае GraphQL Foundation: освободить разработчиков от лишних задач, сформировать вокруг продукта экосистему и ускорить его развитие.

Члены фонда из Canonical, Amihan, Red Hat, ProphetStor и других компаний отмечают, что их личный опыт и экспертиза уже помогли внедрить в Ceph ряд улучшений, среди которых системы машинного обучения и функционал для работы с контейнерами приложений. Поддержка со стороны Linux Foundation станет «драйвером» для дальнейшего развития сети хранения.

Возможно, новый фонд также поможет устранить проблемы, которые возникают при использовании технологии в масштабных ИТ-инфраструктурах. Например, проблемы связанные с ошибкой Out Of Memory (OOM). Для их решения у Ceph-сообщества просто не хватало ресурсов. Сейчас ситуация должна измениться.

Что можно ожидать


Linux Foundation в прошлом уже создали ряд фондов. Например, Cloud Native Computing Foundation — для популяризации контейнеров — или Academy Software Foundation, который формировался для продвижения открытого ПО в индустрии кино и мультипликации. В целом фонд уже поддерживает более восьмидесяти открытых проектов, и они активно развиваются.


/ фото Christopher Michel CC BY

Но при всем при этом есть в портфолио Linux Foundation и относительно неудачные проекты. Например, перспективы операционной системы Tizen видятся ИТ-сообществу «туманными» из-за несовершенства самой платформы. Особенно выделяют неудачный интерфейс.

С другой стороны, в случае Ceph и GraphQL все может получиться удачнее. Число участников Linux Foundation ежедневно растет, а сам фонд наращивает капитал для поддержки своих проектов. У GraphQL Foundation и Ceph Foundation есть все шансы на активное развитие.



P.S. Другие материалы из нашего корпоративного IaaS-блога:
P.P.S. Наш канал в Telegram — об IaaS и виртуализации:

Let's block ads! (Why?)

[Из песочницы] Просто об «умном доме»: как сделать «умную» подсветку

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

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

spoiler title=«orange pi zero 256mb»>
orange pi zero 256mb.

Подключение


Дальше механичекая часть, тут ничего сложного. Точно так же, как к плате ардуино, только в соответсвии с выходами на orange pi.

Берем обычное реле для «самоделкиных». С одной стороны подключаем питание и управляющий пин, с другой стороны разрезаем провод питания нашего светильника и вставляем в реле ( в моем случае это была диодная лента).

Схема:

Вот и все, вы гений.

Немного кода


С технической частью на этом закончили. Переходим к софту, тут тоже все просто:
  1. Устанавливаем на sd карту armbian или любой другой линукс, но я выбрал именно этот. Рекомендую записать образ с помощью etcher.
  2. Далеее через apt-get устанавливаем java в 3 команды:
    #sudo add-apt-repository ppa:webupd8team/java   
    #sudo apt-get update
    #sudo apt-get install oracle-java8-installer
            
    
  3. С помощью гита добавим набор wiringPi для нашей платы ( он содержит в себе различные библиотеки для работы с gpio и всякие тулзы для этого же)
    Тоже не сложно:
    #git clone https://github.com/vladikoms/WiringOP-Zero.git
    #cd WiringOP-Zero
    #chmod +x ./build
    #sudo ./build
    

    Ну и проверим:
    #gpio -v
    #gpio readall
    

На этой части с платой закончили, переходим к компьютеру и любимым ide.

Сервер мы будем разворачивать на spring, так что идем на их сайт или же в ide создаем спринговый проект с градлом.

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

И тогда финальный скрипт долже выглядеть как-то так:

build.gradle
buildscript {
    ext {
        springBootVersion = '2.1.0.RELEASE'
    }
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.lary.sh'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

jar{
    baseName = 'SH'
    version = '0.0.1-SNAPSHOT'
}
repositories {
    mavenCentral()
    maven{

        url  "https://oss.sonatype.org/content/groups/public" //вот репозиторий
    }
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-data-rest')
    implementation('org.springframework.boot:spring-boot-starter-web')
    runtimeOnly('org.springframework.boot:spring-boot-devtools')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
    compile 'com.pi4j:pi4j-core:1.2-SNAPSHOT' //а вот зависимость
}



Отлично переходим к управляющему gpio классу:
Gpio.java
public class MyGpio{
    private  GpioController gpio ;
    private GpioPinDigitalOutput myLed;

    public Gpio() {

        try { // с ошибками не особо пока что запариваемся только прототип же( наверное)
            PlatformManager.setPlatform(Platform.ORANGEPI);// указываем , что  работаем с OrangePI
        } catch (PlatformAlreadyAssignedException e) {
            e.printStackTrace();
        }

        gpio= GpioFactory.getInstance();
        myLed = gpio.provisionDigitalOutputPin(OrangePiPin.GPIO_08); // инициализируем 8 пин как выход
                                                                    // то есть будем управлять его напряжением                              
    }
     
    public void light(){ // метод отвечающий за свечение
        if(myLed.isHigh()) myLed.low(); // если на выбранном пине высокое напряжение сделать его равным напряжению на земле
        else myLed.high();// иначе подать высокое напряжение на выбранный пин (8)
    }   
     public void blink(){ // ну и так помигать для виду
        for (int i =0;i<10;i++) {
            try {
                light();
                Thread.sleep(500);               
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    }                        
}


Представленный код достаточно простой и не предполагает хорошего управления пинами платы, но открывает дверь на пути к этому.

Ну и завершающая стадия создание контроллера в spring

GpioController.java
@Controller
public class GpioController {

    @RequestMapping("/blink")
    @ResponseBody
    public String blink(HttpServletResponse response, HttpServletRequest request )
    {
        Gpio gpio =new Gpio();
        gpio.blink();
        return "blink";
    }

    @RequestMapping("/light")
    @ResponseBody
    public void light(){
        Gpio gpio =new Gpio();
        gpio.light();
    }
}



Теперь пара последних телодвижений в виде создания jar файла при помощи gradle. После этого перенос по sftp на плату ( во многих иде можно настроить деплой напрямую) и запустить jar на устройстве. Далее идем в браузере на заветные 192.168.0.***:8080/light
и наслаждаемся, попутно надеясь, что это поможет сохранить наши пальцы ночью или включать свет, до прихода домой.

В следующей части (если когда нибудь доберусь до нее) обязательно покажу разные способы взаимодействия с нашим «умным» домом.

вот тут исходники
а тут работа с гребенкой (gpio)

Let's block ads! (Why?)

Хакеры украли более 21 млн рублей из российского банка

Изображение: Unsplash

Правоохранительные органы завершили предварительное расследование дела о хищении 21,5 млн рублей у одного из российских банков. Неназванная финансовая организация расположена в Якутии. Ее инфраструктура, включая банкоматы, была атакована с помощью трояна для получения удаленного доступа, деньги злоумышленники сконвертировали в криптовалюту и вывели за рубеж.

Что случилось


Согласно сообщению МВД, в июле 2017 года двое преступников с соучастниками с помощью вредоносного ПО получили удаленный доступ к системам банка и его банкоматам и похитили 21,5 млн рублей.

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

Статистика кибератак на сферу финансов


Несмотря на подобные новости, судя по статистике, ситуация с безопасностью в сфере финансов постепенно улучшается. К примеру, в 2015 в своем исследовании компания Group-IB рассказывала, что за год преступники вывели со счетов почти 100 млн. рублей, или 400 тысяч в сутки. В тот период времени в день происходило порядка 70 атак.

Управление безопасности ЦБ РФ в июне 2016 года привело свою статистику по атакам на финансовые организации. Согласно этим данным, в 2015 году на российские банки было совершено более 20 хакерских атак.

По самой свежей статистике FinCert – подразделение Центробанка по вопросам кибербезопасности финансовой сферы – с января по август 2018 г. целевые атаки на банки принесли преступникам 76,5 млн руб. Годом ранее доход киберпреступников составил 1,08 млрд рублей, и это несмотря на рост общего числа атак (22 в 2018 против 20 в прошлом году).

Согласно выводам экспертов FinCERT, ущерб от действий хакеров снижается из-за успешного противодействия их работе со стороны служб безопасности финансовых компаний и правоохранительных органов — например, в тюрьме оказался один из лидеров кибергруппировки Cobalt, которая похитила 1,16 млрд рублей у 240 российских банко. В итоге заработки злоумышленников упали почти в 20 раз.

Атакуют ли хакеры фондовый рынок


Иногда преступникам удается провести успешню атаку с серьезными последствиями и на компании, занимающиеся биржевой торговлей. Например, в 2015 году хакеры атаковали казанский «Энергобанк» с помощью трояна Corcow. С его помощью им удалось захватить контроль над компьютером в сети банка, на котором был установлен торговый терминал. Это позволило преступникам совершать несанкционированные операции по покупке и продаже валюты на Московско бирже. В результате манипуляций за 15 минут курс рубля упал на 15%, а компания потеряла 244 млн.

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

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

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

Помимо этого над безопасностью пользователей работают и сами брокерские компании. Например, пользователи торгового терминала SMARTx от ITI Capital могут активировать специализированный модуль риск-менеджмента. Он позволяет задавать ограничения при нарушении которых – например, достигнут определенный убыток – запрещается отправка новых заявок и открытие новых позиций.

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

При этом, главной «уязвимостью» большинства систем чаще всего являются пользователи, поэтому чаще всего атакуют именно их. К примеру, если количество кибератак на банки составляет пару десятков в год, то число кибернападений на клиентов идет на тысячи – в 2017 году «Сбербанк» еженедельно фиксировал около 5 тысяч атак на своих клиентов.

Для предотвращения таких атак пользователям стоит использовать для торговли на бирже «чистый» компьютер, который в обычное время не используется для веб-серфинга. Также стоит использовать двухакторную аутентификацию для логина в личный кабинет на сайте брокера, и не передавать данные для доступа к торговым счетам третьим лицам.

– Герман Григорян, начальник отдела DMA ITI Capital


Другие материалы по теме финансов и фондового рынка от ITI Capital:


Let's block ads! (Why?)

Программирование на языке Ада

Довелось намедни на одном белорусском ресурсе прочесть статью «10 языков программирования, которые больше никому не нужны». Среди «заживо погребенных» оказались Fortran, Basic, J#, Turbo Pascal, Ada и другие. Так вот, наибольшую полемику, как ни странно, вызвало обсуждение Aдa (надеюсь в этом месте я не оскорбляю чьи-либо чувства). Что, собственно говоря и сподвигло покопаться в этой увлекательной теме.

Ада получил свое название в честь той самой Ады Лавлейс, великого математика и первого в мире программиста (кстати, она единственный законнорожденный ребёнок знаменитого английского поэта Джорджа Гордона Байрона и его жены Анны Изабеллы Байрон). Этот язык был создан в конце семидесятых годов для бортовых систем военных объектов Пентагона.

Тем удивительней, что в 1989 году в СССР материализовался ГОСТ (он же государственный стандарт) по работе с данным языком программирования. Если покопаться в документе, то там можно найти массу интересных вещей. Вообще хочется снять шляпу перед предшественниками, сделавшими эту по-настоящему впечатляющую работу. Честно говоря, в 80-е в СССР, как ни странно, вообще с книгами по программированию судя по всему было неплохо. Вот тут краткая Ада-библиография.

Эксперты сходятся во мнении, что настоящих служителей Ада на постсоветском пространстве не так уж и много. Это и понятно. Все-таки, в основном данный язык применяется для программной разработки в авионике, атомной энергетике и в других промышленных отраслях, к которым на Java, ну никак, не подъедешь.

Стоит отметить, что язык изначально разрабатывался для встраиваемых систем. Отсюда — неразвитость Ады по части GUI и СУБД. А раз с этим у неё туго, то и шансов развиться не было. Зачем она массовому разработчику, ведь ~99% пользовательских приложений нуждаются в GUI и СУБД.

Синтаксис


У Ada – простой, понятный, легко читаемый синтаксис, который существенно снижает риск ситуаций, когда случайная опечатка приводит к тому, что код не становится формально неправильным, но существенно меняется его семантика.

Изначально, Ада — модульный язык программирования со строгой типизацией, унаследовавший синтаксис от Паскаль и Алгол. Если вы учили первый в школе или институте, то глядя на «Hello, World!» должны испытать ностальгию:

with Ada.Text_IO;


procedure Hello is
 
use Ada.Text_IO;

begin
 
Put_Line("Hello, world!");

end Hello;

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

Более поздние стандарты частично решали эти проблемы, но по понятным причинам, они не сделали из Ада второй Python. (с)

Где больше Ада?


Покопавшись в «этих-ваших» интернетах оказалось, что Boeing, Airbus и даже российские Ил-96 и Бе-200 летают благодаря программным разработкам из Ада. Вся авиация плотно сидит там же. ПО для атомных станций и даже банковская система, включая сети банкоматов от Ада тоже не далеко ушли. Аналогичное можно сказать про автопром.

Тем не менее, если сравнить количество запросов из HR на специалистов по С#, Python, Java, С++, то очевидно, что адептов Ада требуется в разы меньше. Но это не означает, что они вовсе не нужны. Не случайно в 2012 году были разработаны новые стандарты языка. Есть мнение, что совсем скоро он получит второе дыхание. Однако, справедливости ради, стоит отметить, что за его почти сорокалетнюю историю, подобных прогнозов было не мало.

Если вас заинтересовал данный язык и вы вдруг решили узнать, где сегодня в мире грызут гранит Ада, заходите по ссылке. Но, если вы спец по С++, то в Parallels для вас есть местечко. Велкам!

Let's block ads! (Why?)

[Из песочницы] Про Flutter, кратко: Основы

После доклада Юры Лучанинова, я решил для себя попробовать Flutter. Чтобы мозг размять, и чтобы было о чем похоливарить с мужиками на кухне. Дело пошло. Я начал смотреть, потом читать, потом писать. И вроде все получается, приложения запускаются, и то что объясняют — понятно, все просто. Но не без “но” — объясняют не все. А поскольку платформа, ЯП, подходы и даже предметная область для меня новые, то подобное вызывает раздражение, ведь у тебя “не запускается”, а ты даже не знаешь что гуглить: Dart/Flutter/Window/Screen/Route/Widget?

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


Про гайд

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

Писать я буду с перспективы веб-разработчика. Большинство из вас скорее всего знакомо со стэком веба, а аналогия со знакомой платформой лучше аналогии с постройкой домов или чего там еще, Animal, Dog, Foo, Bar…

Излагаться постараюсь кратко, чтобы не затягивать. Но для самых любознательных буду оставлять полезные ссылки по обсуждаемым темам.


Про платформу

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


  • В отличии от многих известных на сегодняшний день мобильных платформ, Flutter не использует JavaScript ни в каком виде. В качестве языка программирования для Flutter выбрали Dart, который компилируется в бинарный код, за счет чего достигается скорость выполнения операций сравнимая со Objective-C, Swift, Java, или Kotlin.
  • Flutter не использует нативные компоненты, опять же, ни в каком виде, так что не приходится писать никаких прослоек для коммуникации с ними. Вместо этого, подобно игровым движкам (а вы ведь знаете что у игр очень динамичный UI), он отрисовывает весь интерфейс самостоятельно. Кнопки, текст, медиа-элементы, фон — все это отрисовывается внутри графического движка в самом Flutter. После выше сказанного стоит отметить, что “Hello World” приложение на Flutter занимает совсем не много места: iOS ≈ 2.5Mb и Android ≈ 4Mb.
  • Для построения UI во Flutter используется декларативный подход, вдохновленный веб-фреймворком ReactJS, на основе виджетов (в мире веба именуемых компонентами). Для еще большего прироста в скорости работы интерфейса виджеты перерисовываются по необходимости — только когда в них что-то изменилось (подобно тому как это делает Virtual DOM в мире веб-фронтенда).
  • В добавок к выше сказанному, в фреймворк встроен Hot-reload, такой привычный для веба, и до сих пор отсутствовавший в нативных платформах.

О практической пользе этих факторов я очень рекомендую прочитать статью Android разработчика, который переписал свое приложение с Java на Dart и поделившегося своими впечатлениями. Сюда я лишь вынесу названное им количество файлов/строк кода до (написанное на Java) — 179/12176, и после (переписанное на Dart) — 31/1735. В документации можно найти подробное описание технических особенностей платформы. А вот ещё ссылка, если интересно посмотреть другие примеры работающих приложений.


Про Dart

Dart — язык программирования на котором нам предстоит писать приложения под Flutter. Он очень простой, и если у вас есть опыт работы с Java или JavaScript, вы быстро его освоите.

Я пытался написать обзорную статью о Dart, стремясь описать лишь необходимый минимум для изучения Flutter. Но в этом языке столько нюансов, что несмотря на несколько попыток написать такую статью, у меня так и не удалось сделать ее достаточно полной и в то же время короткой. С другой стороны, авторы A Tour of the Dart Language отлично справились с этой задачей.


Про подготовку

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

Ничего не дожидаясь, идем на страницу гайда по установке, выбираем платформу и по шагам выполняем инструкцию для установки платформы на нашу систему. В своем редакторе обязательно подключаем плагины. В том же гайде есть инструкция по настройке VS Code и IntelliJ. Для вашего редактора тоже найдутся плагины для Dart и Flutter (обычно нужно ставить два). Запускаем приложение и проверяем его работоспособность.

Подсказка для пользователей OSX. Мне жалко места занимаемого нарисованными рамками телефона в эмуляторе iOS, поэтому я их отключил и переключился на iPhone 8 (он не такой “длинный”):


  • Hardware → Device → iOS # → iPhone 8
  • Window → Show Device Bezels

Без кнопок жить можно, ведь есть хоткеи: Shift + Cmd + H — это домой, Cmd + Right — а это перевернуть телефон, остальное можно найти в меню Hardware. А вот экранную клавиатуру я советую включить, ведь важно понимать можно ли работать с приложением когда половина экрана регулярно перекрывается клавиатурой: Cmd + K (работает когда фокус находится на каком-то поле ввода).

iPhone 8 & iPhone X с рамками
iPhone 8 & iPhone X с рамками

iPhone 8 & iPhone X без рамок
iPhone 8 & iPhone X без рамок


Про структуру

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


  • lib/ — По принципам pub (менеджер пакетов Dart’а) весь код лежит в этой подпапке;
  • pubspec.yml — сюда записываются зависимости приложения, которые нужно установить для его запуска, точно как package.json, но есть нюанс, устанавливать их нужно не через стандартную утилиту Dart’а, о которой говорилось выше, а через команду Flutter’а: flutter pub get <package_name>;
  • test/ — вы ведь знаете что там? Запустить их можно вызвав flutter test;
  • ios/ & android/ — папки с настройками для каждой из платформ, там указывается какие права нужны для запуска приложения (доступ к локации, bluetooth), иконочки и все что специфично для платформы.

Со структурой разобрались, заходим в папку lib/ где нас ждет main.dart файл. Это, как вы можете догадаться, тот самый файл в котором мы должны запускать наше приложение. А запускается оно подобно как в языке C (и еще тонны других) вызовом функции main().


Про виджеты (Hello World здесь)

Во Flutter’е все построено на Widget’ах: тут и вьюшки, и стили с темами, и состояние в виджетах хранится. Есть два основных типа виджетов: со стейтом и без, но пока не об этом. Давайте с простого.

Удаляем все из main.dart. Вставляем следующий код внимательно вчитываясь в комментарии:

import 'package:flutter/widgets.dart'; // подключаем базовый набор виджетов

// Когда Dart запускает приложение он вызывает функцию main()
main() => runApp( // а функция runApp запускает Flutter
  Text( // этот виджет, он отрисовывает текст, такой себе <span>
    'Hello, World!!!', // первый аргумент — текст который нужно отобразить
    textDirection: TextDirection.ltr, // а здесь мы указываем направление текста
  ),
);

runApp(…) принимает единственный аргумент — виджет, который будет корневым для всего проекта. Кстати, его изменения Hot-reload подхватить не может, так что нужно будет перезапускать приложение.
Text(…) — Flutter не может просто отобразить строку на экране. Для вывода текста необходимо указать Text. textDirection. И это не выравнивание текста вроде text-align, если сравнивать с вебом, то это аналог direction. Часть API для интернационализации приложения. Text не заработает, пока не будет знать направление, но указывать его везде не придется — дальше мы разберем как настроить направление текста для всего приложения.

Уже запустили приложение? “Hello, World!” вывелся! Вроде бы… Да? Но что-то явно пошло не так.

Скриншот запущенного приложения

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

import 'package:flutter/widgets.dart';

main() => runApp(
  Center( // виджет, который выравнивает содержимое по центру
    child: Text(
      'Hello, World!',
      textDirection: TextDirection.ltr,
    ),
  ),
);

Center(…) — это виджет который позволяет разместить другой виджет, переданный в аргументе child, в центре по горизонтали и вертикали. Вы часто будете встречать child и children в приложениях Flutter, так как практически все виджеты используют эти имена для передачи виджетов, которые должны быть отрисованы внутри вызываемого виджета.

Композиции виджетов используются в Flutter для отрисовки UI, изменения внешнего вида, и даже для передачи данных. К примеру виджет Directionality(…) задает направление текста для всех дочерних виджетов:

import 'package:flutter/widgets.dart';

main() => runApp(
  Directionality(
    textDirection: TextDirection.ltr,
    child: Center(
      child: Text('Hello, World!'),
    ),
  ),
);

Посмотрим на еще один очень важный виджет и заодно преобразим внешний вид нашего приложения:

import 'package:flutter/widgets.dart';

main() => runApp(
  Directionality(
    textDirection: TextDirection.ltr,
    child: Container( // новый виджет! <div> в мире Flutter'а
      // Для виджета Container свойство color означает цвет фона
      color: Color(0xFF444444),
      child: Center(
        child: Text(
          'Hello, World!',
          style: TextStyle( // а у текста появился виджет, который его стилизует
            color: Color(0xFFFD620A), // задаем ему цвет текста
            fontSize: 32.0, // и размер шрифта
          ),
        ),
      ),
    ),
  ),
);

Скриншот HelloWorld приложения

Color(…) — цвет. В документации указаны разные способы его задания, но основным является просто передача числа в конструктор класса. В примере выше мы передаем конструктору число, записанное в шестнадцетиричной форме, что очень похоже на HEX, только вначале у нас добавилось еще два знака, означающих степень прозрачности цвета, где 0x00 — это абсолютно прозрачный, а 0xFF — это совсем не прозрачный.

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

Приложение на Flutter написано, дело сделано! В доках можно почитать как его собрать под Android и iOS, там же есть ссылочки чтобы вы узнали как его отправить в нужный Store. Кому этого мало, я ниже накидал еще пару строк про Flutter, может больше…


Про Stateless виджеты

Как использовать виджеты — мы разобрались, давайте теперь разбираться как их создавать. Выше уже упоминалось, что есть виджеты у которых есть состояние, и у которых его нет. До сих пор мы использовали только виджеты без состояния. Это не значит что у них его совсем нет, ведь виджеты это просто классы и их свойства могут быть изменены. Просто после того как виджет будет отрисован изменения его состояния не приведет к обновлению этого виджета в UI. К примеру, если нам нужно поменять текст на экране, нужно будет сгенерировать другой виджет Text и указать новое содержимое которое мы хотим отобразить. Такие виджеты можно назвать константными, если вы понимаете о чем я. И они простые, поэтому с них и начнем.

Чтобы создать Stateless виджет, нужно:


  1. Придумать красивое имя для нового класса;
  2. Унаследовать класс от StatelessWidget;
  3. Реализовать метод build(), который принимает BuildContext в качестве аргумента и возвращает какой-нибудь Widget.
import 'package:flutter/widgets.dart';

main() => runApp(
  Directionality(
    textDirection: TextDirection.ltr,
    child: Center(
      child: MyStatelessWidget()
    ),
  ),
);

class MyStatelessWidget extends StatelessWidget {
  // аннотация @override нужна для оптимизации, используя ее мы говорим,
  // что переопределенный метод из родительского класса мы использовать
  // не будем, так что компилятор может его выбросить
  @override
  Widget build(BuildContext context) { // [context] будет описан позже
    return Text('Hello!');
  }
}

Пример виджета с одним аргументом:

// …

class MyStatelessWidget extends StatelessWidget {
  // Все свойства Stateless виджета должны быть объявлены с final, или с const
  final String name; // обычное свойство
  MediumSimple(this.name); // обычный конструктор

  @override
  Widget build(BuildContext context) { // [context] будет описан еще ниже
    return Text('Hello, $name!');
  }
}

Про Stateless больше и добавить нечего…


Про Hot Reload

Обратите внимание, что при изменении содержимого нашего виджета приложение будет автоматически перерисовываться. После того, как мы вынесли виджет из функции main() Hot-reload стал нам помогать.

Важно также понимать, что из-за запущенного модуля для горячей замены приложение работает на порядок медленнее.


Про GestureDetector

GestureDetector виджет в действии

В следующей секции мы будем разбираться с StatefulWidget (с виджетами которые изменяются при изменении их состояния). Для того чтобы это было интересно, нам нужно это состояние как-то изменять, согласны? Мы будем изменять состояние виджета реагируя на касания по экрану. Для этого мы будем использовать GestureDetector(…) — виджет, который ничего не отрисовывает, но следит за касаниями на экране смартфона и сообщает об этом вызывая переданные ему функции.

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

import 'package:flutter/widgets.dart';

main() => runApp(
  Directionality(
    textDirection: TextDirection.ltr,
    child: Container(
      color: Color(0xFFFFFFFF),
      child: App(),
    ),
  ),
);

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: GestureDetector( // используется как обычный виджет
        onTap: () { // одно из свойств GestureDetector
          // Этот метод будет вызван, когда дочерний элемент будет нажат
          print('You pressed me');
        },
        child: Container( // нашей кнопкой будет контейнер
          decoration: BoxDecoration( // стилизуем контейнер
            shape: BoxShape.circle, // зададим ему круглую форму
            color: Color(0xFF17A2B8), // и покрасим его в синий
          ),
          width: 80.0,
          height: 80.0,
        ),
      ),
    );
  }
}

Нажимаем на синюю кнопку и видим сообщение в консоли. Нажимаем еще раз и снова видим сообщение в консоли. Еще раз… Ладно, хватит залипать.


Про Stateful виджеты

StatefulWidget — простые, даже проще чем StatelessWidget'ы. Но есть нюанс: они не существуют сами по себе, для их работы нужен еще один класс который будет хранить состояние этого виджета. При этом, его визуальная часть (виджеты из которых он состоит) также становятся его состоянием.

Для начала, посмотрим на класс виджета:

// …

class Counter extends StatefulWidget {
  // Изменяемое состояние хранится не в виджете, а внутри объекта особого класса,
  // создаваемого методом createState()
  @override
  State<Counter> createState() => _CounterState();
  // Результатом функции является не просто объект класса State,
  // а обязательно State<ИмяНашегоВиджета>
}

Выше мы создали “пустой” виджет, который реализовал очень простой метод createState(). Такое разделение презентации и состояния позволяет Flutter’у сильно оптимизировать работу приложения.

Объект состояния совершенно не сложный. Более того, он практически идентичен StatelessWidget'ам написанным нами выше. Его основное отличие — родительский класс.

// …

class _CounterState extends State<Counter> {
  // Внутри него мы наконец-то можем объявить динамические переменные,
  // в которых мы будем хранить состояние.

  // В данном случае, это счетчик количества нажатий
  int counter = 0;

  // А дальше все очень просто, мы имплементируем точно такой же метод
  // для отрисовки виджетов, который мы использовали в классе Stateless виджета.
  @override
  Widget build(BuildContext context) {
    // И тут практически ничего не изменилось с нашего последнего примера,
    // а то что изменилось — я прокомментировал:
    return Center(
      child: GestureDetector(
        onTap: () {
          // В момент, когда кнопка нажата, мы увеличиваем значение
          // перменной counter.
          setState(() {
            // setState() необходим для того, чтобы вызвать методы
            // жизненного цикла виджета и сказать ему, что пора обновится
            ++counter;
          });
        },
        child: Container(
          decoration: BoxDecoration(
            shape: BoxShape.circle,
            color: Color(0xFF17A2B8),
          ),
          width: 80.0,
          child: Center(
            child: Text( // выводим значение свойства counter
              '$counter', // чтобы следить за его изменением
              style: TextStyle(fontSize: 30.0),
            ),
          ),
        ),
      ),
    );
  }
}

Работающее Counter приложение

Обратите внимание, что имя класса начинается с нижнего подчеркивания. В Dart’е все имена начинающиеся с нижнего подчеркивания идентифицируют приватные значения. А состояние виджетов, в Flutter’е, принято оставлять приватными, хотя это не обязательно.

Какое замечательное приложение мы с вами сделали! Это отличный результат. Но перед тем как закончить эту часть курса, давайте рассмотрим еще пару интересных виджетов. Только в этот раз мы напишем больше кода, просто, чтобы было интереснее. Большая часть приложения должна быть вам знакома, а остальное вы уже должны были научиться понимать:

import 'package:flutter/widgets.dart';

main() => runApp(App());

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Directionality(
      textDirection: TextDirection.ltr,
      child: Container(
        padding: EdgeInsets.symmetric(
          vertical: 60.0,
          horizontal: 20.0,
        ),
        color: Color(0xFFFFFFFF),
        child: Content(),
      ),
    );
  }
}

class Content extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Counter('Manchester United'),
        Counter('Juventus'),
      ],
    );
  }
}

class Counter extends StatefulWidget {
  final String _name;
  Counter(this._name);

  @override
  State<Counter> createState() => _CounterState();
}

class _CounterState extends State<Counter> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.only(bottom: 10.0),
      padding: EdgeInsets.all(4.0),
      decoration: BoxDecoration(
        border: Border.all(color: Color(0xFFFD6A02)),
        borderRadius: BorderRadius.circular(4.0),
      ),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          // widget — это свойство класса State, в котором хранится
          // ссылка на объект создавший текущий стейт, то есть на наш виджет
          _CounterLabel(widget._name),
          _CounterButton(
            count,
            onPressed: () {
              setState(() {
                ++count;
              });
            },
          ),
        ],
      ),
    );
  }
}

class _CounterLabel extends StatelessWidget {
  static const textStyle = TextStyle(
    color: Color(0xFF000000),
    fontSize: 26.0,
  );

  final String _label;
  _CounterLabel(this._label);

  @override
  Widget build(BuildContext context) {
    return Text(
      _label,
      style: _CounterLabel.textStyle,
    );
  }
}

class _CounterButton extends StatelessWidget {
  final _count;
  final _onPressed;
  _CounterButton(this._count, {@required this._onPressed});

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        _onPressed();
      },
      child: Container(
        padding: EdgeInsets.symmetric(horizontal: 6.0),
        decoration: BoxDecoration(
          color: Color(0xFFFD6A02),
          borderRadius: BorderRadius.circular(4.0),
        ),
        child: Center(
          child: Text(
            '$_count',
            style: TextStyle(fontSize: 20.0),
          ),
        ),
      ),
    );
  }
}

Еще одно Counter приложение на Flutter

У нас появилось два новых виджета: Column() и Row(). Попробуйте сами догадаться, что они делают. А в следующей статье мы рассмотрим их подробнее, а также посмотрим еще не один виджет позволяющий компоновать вместе другие виджеты, и создадим симпатичное приложение используя Flutter библиотеку называющуюся Material.


Про домашнее задание

Если вам хочется почитать что-нибудь еще на досуге, вот список интересных ссылок:


Let's block ads! (Why?)

[recovery mode] Выводим лгуна на чистую воду: собеседование – это не трудовые отношения. Естественно

Высказывать свое мнение — это окей. Спорить выдирая фразы из контекста, перворячивая смысл на 180 градусов, придумывать то, чего нет – не окей. Подавать свое спорное мнение от имени гос органа и третьих лиц (юристов) – совсем не окей.

Эта краткая заметка – ответ на публикацию «Минтруд: тестовое задание — это трудовые отношения». Меня задела безаппеляционность автора, его стремление обмануть людей, неспособность читать законы и тексты так, как они написаны. Поэтому аналогично автору я послал расширенный вопрос в Минтруд и вот получил ответ. То, о чем мы все догадывались, подтвердилось.
Цитирую:

… работодатель вправе самостоятельно определять проведение такого рода мероприятий (простое собеседование, устное или письменное тестирование, «домашнее задание» и т.д.) и проводить конкурс на основе этих испытаний.
Ну и так далее, лень все перепечатывать
Таким образом собеседование не является началом трудовых отношений
image
image
image

Let's block ads! (Why?)