...

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

Пара мыслей об особенностях Российского Data Science

Сегодня на Moscow Data Science Major рассказывал про приватность, этичный Data Science, и много интересных технических новинок. Люди внимательно слушали, задавали вопросы, благодарили. Но то что произошло потом было очень показательно. Об этом под катом.

А потом был доклад про новые Российские наработки по НЛП с вот этим вот слайдом.

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

И самое страшное даже не в том, что при этом был нарушен целый ряд федеральных законов (№ 323 статья 13 и №152 как минимум). Самое страшное, на мой взгляд, в том, что почти никто не увидел в этом ничего неожиданного и нехорошего…

Мне очень хочется верить, что я не прав, и автор изменил имена и адрес этого человека, но вероятность этого мала — и клиника, и упомянутый врач реально существуют и работают в Санкт-Петербурге. И на этом слайде по чистой случайности не оказались записи МОИХ разговоров с операторами этой очень популярной в Петербурге клиники…

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

Let's block ads! (Why?)

[Из песочницы] Как я делал линейно-интерактивный ИБП (Часть 1)

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

Введение


Начнём со структурной схемы ИБП. Она приведена ниже:

В общем-то классика жанра. Входное напряжение через реле K3, K1, K2 и K4 проходит на выход и питает нагрузку. При этом оно также поступает на основной трансформатор ИБП, питает схему и заряжает аккумулятор. Зарядное устройство намеряно не выделено отдельным блоком, потому его функции выполняет инвертор, но об этом будет рассказано подробнее.

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

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

А при повышенно вот такое:

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

Измерение входного и выходного напряжения


Для измерения используем вот такую незамысловатую схему (промоделирована в MicroCap, потом полностью проверена в «железе»):

V4, V5 — это источники, имитирующий входное и выходное напряжение.

На операционниках собраны простые усилители. При помощи R11, R12 формируется напряжение смещения величиной примерно в 1,5В.

Резисторы подобраны таким образом, чтобы при напряжениях 270В размах на выходах операционников составлял 2,5 В. Больше такой дешёвый операционник как LM358 выдать не сможет, да нам и не нужно.

Эпюры сигналов показаны ниже:

В вышеприведённой схеме есть одна хитрость. Это использование конденсатора C1. Давайте посмотрим на эпюры напряжений, если его исключим.

Это ситуация, когда есть входное напряжение и есть выходное:

Пока отличий от схемы с конденсатором нет. Но давайте представим, что V5 — это входное напряжение. И тут вдруг бац, оно пропадает. Мы работаем от инвертора и у нас есть только выходное напряжение (про модифицированную синусоиду пока забываем, сейчас это неважно). В результате получаем вот такие эпюры:

Ничего себе! Операционник теперь выдаёт нам совсем другое напряжение, хотя по факту ничего не изменилось! А всё почему? Потому что отсутствует связь по переменному току, т.к. нет конденсатора!

Кто-то может сказать, а зачем вообще городить эту цепь из параллельно соединённых конденсатора C1 и резистора R13? Всё для повышения уровня защиты. Ведь у нас узел измерения гальванически связан с входной сетью. Резистор R13 уменьшает ток. Сажать фазу или ноль (неизвестно каким образом пользователь воткнёт вилку в розетку) с цифровой землёй крайне опасно. А наличие резистора уменьшает ток до 1-2 мкА.

Далее хотел бы показать осциллограммы сигналов после высокоомных резисторов R1 и R4:

И на выходе операционников:

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

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

Let's block ads! (Why?)

[Из песочницы] Прибор для измерения СО2

Тридцать шесть градусов красоты

[Из песочницы] Интересности и полезности python

Я уже несколько лет программирую на python, однако, недавно осознал, что множество полезных приёмов и интересных моментов прошли мимо меня, возможно, я не один такой, поэтому решил перечислить их здесь, надеюсь, данные приёмы пригодятся кому-то в работе или побудят познакомиться с этим языком поближе.
Как и во многих языках в python 1 эквивалентно True, а 0 — False, то есть
 1 == True.

Казалось бы, и что в этом такого? Однако, это имеет некоторые побочные эффекты, связанные с тем, что одинаковые объекты обязаны иметь одинаковые хеши, соответственно у вас не получится запихать в один словарь ключ 1 и True.
 >>> a = {1: "one", 0: "zero", True: "true", False: "false"}
# -> {1: 'true', 0: 'false'}


Так же это разрешает следующие операции:
 >>> print(2 * False + True)
# -> 1


В данном примере строки использовались в качестве значений словаря, однако, зачастую хочется использовать строки в качестве ключей словаря, меня всегда раздражало, что при создании словаря с помощью фигурных скобок, строки нужно указывать в кавычках, хотелось бы их опустить, это возможно, если создавать словарь через конструктор dict().
 >>> {"one": 1, "two": 2, "three": 3} == dict(one=1, two=2, three=3)
# -> True


Кроме того, с помощью фигурных скобок создаются не только словари, но и множества(set).
 >>> a = {1, 2, 3}


Для объединения двух множеств мне почему-то хочется воспользоваться оператором +, наверно, из-за способа конкатенации строк. Однако, python не поддерживает данный оператор для множеств. Но разумеется, это не значит, что нам всегда придётся пользоваться функциями, создатели подошли к данному вопросу более системно и добавили в язык поддержку основных операций над множествами (а не только объединения) и «повесили» их на логические операторы.

a = {1, 2, 3}
b = {0, 2, 4}
print(a & b)     # -> {2}
print(a | b)     # -> {0, 1, 2, 3, 4}
print(a ^ b)     # -> {0, 1, 3, 4}
print(a - b)     # -> {1, 3}, однако один арифметический
                 # оператор всё же оставили


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

www.python.org/downloads/release/python-370
mail.python.org/pipermail/python-dev/2017-December/151283.html


d = dict(zero='Cero', one='Uno', two='Dos', three='Tres', four='Cuatro',
         five='Cinco', six='Seis', seven='Siete', eight='Ocho', night='Nueve')

for index, (key, value) in enumerate(d.items()):
    print(f"{index} is {key} in England and {value} in Spain")


Обратите внимание не строку вывода, она начинается с префикса f — это особый тип строк, введённый в python 3.6.

Всего в python три вида строк: обычные, обозначаемые кавычками без префиксов, сырые\не обрабатываемые(raw), в которых спец-символы, вроде, \n не обрабатываются и вставляются как текст и собственно f-строки.

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


print("result" + str(2))     # Простая конкатенация строк, python не осуществляет
                             # автоматическое приведение всех аргументов к 
                             # строковому типу, это остаётся за программистом
print("result", 2)           # print может принимать несколько аргументов через запятую,
                             # в таком случае они будут выводиться через пробел,
                             # вам не нужны преобразовывать выводимые объекты в строку,
                             # в отличие от предыдущего способа
print("result %d" % 2)                 # %-синтаксис, сделан по аналогии с языком C.
print("result %d %.2f" % (2, 2))       # https://docs.python.org/3.4/library/string.html#formatspec
print("result %(name)s" % {"name": 2}) # также разрешено создавать именованные метки

print("{}".format(2))                  # У класса строки есть метод format()
                                       # он позволяет опускать тип выводимой переменной
print("{0} {1} {0}".format(1, 2)) # так же можно указать номер переменной и таким образом
                                        # вывести её два раза
                                        # нумерация начинается с нуля
# если число переданных переменных меньше использованных в выводе, будет сгенерированно исключение
print("{} {}".format(2))            # -> IndexError: tuple index out of range
print("{0} {0}".format(2, 3))       # -> 2 2 Однако если передано слишком много переменных
                                    # код отработает без ошибок
from math import pi                 # при таком выводе так же поддерживаются строки формата
print("{:.2f}".format(pi))          # -> 3.14

from string import Template         # возможен и такой способ вывода
s = Template("result  $res")        # однако он не получил большого распространения


Теперь добавили ещё и f-строки. В них доступны любые переменные из области видимости, можно вызывать функции, получать элементы по ключу, кроме того, они поддерживают строки формата.

from math import pi
result = 4
name = "user"
print(f"{name:84s} pi= {pi:.2f}, result={result}, {name[2]}")
# -> user                                                                                 pi= 3.14, result=4, e

from datetime import datetime
print(f"{datetime.now():%Y:%m-%d}")


Кроме того они быстрее всех остальных способов вывода, так что, если вам доступен python3.6 рекомендуется использовать именно их.

Одна из наикрутейших фишек python — в нём упаковываются и распаковываются не объекты и примитивы, а параметры и коллекции.


def func(*argv, **kwargs)


Однако, есть один архитектурный недостаток в реализации:
  • argv — кортеж, его значения нельзя изменять, нельзя добавлять или удалять значения
  • kwargs — словарь, изменяемый, поэтому кеширование невозможно

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

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

Обсуждали создание типа frosendict, однако пока его не добавили (хотя как минимум одно применение ему уже есть — в качестве kwargs). За неизменяемый словарь приходится отдуваться namedtuple. А также за записи и простенькие классы.

Кто в студенческие\школьные годы писал циклы для вывода значений массива и бесился из-за запятой в конце, каждый раз решал, забить или переписать, чтобы было красиво, и только на курсе 2-3 узнал о методе join? Или я один такой?

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


a = list(range(5))
print(" ".join(a))                 # -> TypeError: sequence item 0: expected str instance, int found
print(" ".join(str(i) for i in a)) # -> 0 1 2 3 4
print(*a)                          # -> 0 1 2 3 4


Так как строки — тоже коллекции, то их так же можно «джойнить».

print('-'.join("hello"))             # -> h-e-l-l-o


Рассмотрим строку из предыдущего примера.

print(" ".join(str(i) for i in a)) # -> 0 1 2 3 4


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

print(sum(i**2 for i in range(10))) # -> 285


Кроме того, круглые скобки можно опускать и при создании кортежей:

article = "python", 2018, "LinearLeopard"            # объявление кортежа
theme, year, author = "python", 2018, "LinearLeopard"# распаковка кортежа
theme, year, _ = "python", 2018, "LinearLeopard"     # слева и справа должно
                                                     # находиться одинакове число
                                                     # переменных, можно подчеркнуть,
                                                     # что вам какая-то не нужно,
                                                     # обозначив её через
                                                     #  подчёркивание
theme, _, _ = "python", 2018, "LinearLeopard"        # имена могут повторяться
theme, * author = "python", 2018, "LinearLeopard"    # можно объявить жадный
                                                     # параметр, который съест
                                                     # все неподходящие,
                                                     # разумеется, допустим
                                                     # только один
                                                     # жадный оператор


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

def sortwords(*wordlist, case_sensitive=False):


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

Можно и так.


def func(first, second, *, kwonly):


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

def add_to(elem, collection=[]):
    collection.append(elem)
    return collection


a = ["a", "c"]
print(add_to("b", a))           # -> ['a', 'c', 'b']

print(add_to("a"))              # -> ['a']
print(add_to("b"))              # -> ['a', 'b']  Откуда здесь 'a'?


Значения по умолчанию ф-ция хранит в поле __defaults__, можно в любой момент узнать, что там находится.

print(add_to.__defaults__) # -> (['a', 'b'],)


Так как аргумент по умолчанию (пустой список) создался в момент старта программы и не пересоздаётся каждый раз заново, мы получили именно такое поведение.

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


def add_to(elem, collection=None):
    collection = collection or []
    collection.append(elem)
    return collection


Обратите внимание на команду

collection = collection or []


это более короткий (и менее понятный, хотя не для всех) аналог

collection = collection if collection else []

Let's block ads! (Why?)

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

Привет, Хабр! Представляю вашему вниманию перевод статьи " Machine learning can control tsetse flies аnd thus reduce sleeping sickness".

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

Исследование, проводимое в Сенегале, показало, что эта идея осуществима. За последние пять лет самцы мухи цеце, стерилизованные с использованием гамма-лучей, выпускались три раза в неделю в зараженные районы. Это позволило снизить местную популяцию мух на 98%, с соответствующим снижением заболеваемости сонной болезнью. Но такие проекты требуют огромного количества стерильных самцов, которых нужно разводить и доставлять своевременно, а это сложно.

Одна из проблем, заключается в том, что разведение самцов неизбежно затрагивает и размножение самок. Сортировка по половой принадлежности необходима для того чтобы производить облучение исключительно самцов. Элементарное облучение обоих полов вызывает проблемы, поскольку для стерилизации самок требуется более высокая доза облучения, которая может вызвать гибель самцов. Сортировка Цеце заключается в выжидании, пока мухи не вылупятся из куколок. Одновременно охлаждая их, чтобы уменьшить метаболизм и, следовательно, их активность. Отделение самцов от самок производится вручную при помощи кисточки. Самец отличается от самки наличием усиков, что помогает его идентифицировать. Этот процесс является эффективным, но трудозатратным и занимающим много времени. Зелда Моран из Колумбийского университета, считает, что есть способ лучше.
В 2014 году г-жа Моран, которая в то время была исследователем в энтомологической лаборатории Международного агентства по атомной энергии, в Вене, выполняя подобную работу, заметила, что куколки самки и самца цеце развиваются по-разному. Взрослые мухи появляются из куколок через 30 дней после окукливания. Хотя куколки мухи цеце непрозрачны, мисс Моран обнаружила, что в определенных условиях освещения, например в инфракрасных лучах, можно было заметить, что крылья насекомых начали темнеть. В случае с самками это происходит примерно через 25-26 дней после окукливания. В случае мужчин это происходит позже: через 27-29 дней после окукливания. В принципе, это дает возможность сортировать мух, прежде чем они выйдут из их куколок.

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

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

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

Let's block ads! (Why?)

Приглашаем на Android Devs Meetup 8 сентября

Мы рады пригласить всех интересующихся Android-разработкой на восьмой Android Devs Meetup Mail.Ru Group. Эксперты и разработчики мобильных приложений расскажут о технологиях мобильной разработки, обсудят особенности использования новых инструментов и подходов, поделятся личным опытом. Митап проходит в преддверии конференции MBLT DEV 2018, гостей и авторов лучших вопросов ожидают подарки от организаторов конференции и Mail.Ru Group.
Программа встречи под катом.

«Автоматизация темизации приложения. Генерация стилей, ресурсов и атрибутов», Даниил Попов, Mail.Ru Group


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

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

«Обзор DI фреймворков», Дмитрий Конуров, e-legion


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

«Модуляризация Андроид приложения», Иван Крыгин, Авито


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

Круглый стол со спикерами на тему «Новые библиотеки и фреймворки от Google: бросаемся внедрять или ждём»


Каждый год Google выдает пакет новых библиотек в состоянии беты или альфы, и призывает переходить на них, но всё это глючит. Разработка под Android превращается в какой-то фронтенд: постоянные эксперименты с новыми глючными библиотеками. Так всё-таки, использовать или нет все эти новинки?

Сбор участников и регистрация: 11:30
Начало докладов: 12:00
Адрес: г. Москва, офис компании Mail.Ru Group, Ленинградский проспект, 39, стр. 79.

Для участия необходимо зарегистрироваться тут.

Let's block ads! (Why?)

Шпионские штучки: остаться в секрете

О криптоустройствах и машинах не раз упоминалось в предыдущих статьях. Но как обеспечить безопасную передачу ключей и кодов, без которых работа секретных служб и шпионов была бы равна «0». Существует Международный Шпионский Музея, экспонатами которого являются тысячи всяких шпионских штук и приспособлений, часто это обычные предметы ежедневного обихода. Ранее на одном из ресурсов был опубликован топ-10 наиболее известных и неизвестных шпионских вещей этого музея. Среди них (извините, но не всегда предметы обихода):


  • Собачья какашка — передатчик
  • Пень – радио жучок
  • Голубь — камера
  • Болгарский зонтик
  • Шифрдиск
  • Шифровальная машина Энигма
  • Ботинок с передатчиком
  • Микрообъективная камера
  • Камера пальто
  • Пистолет – губная помада


Пень – радио жучок


Пистолет – губная помада


Собачья какашка — передатчик


Камера пальто


Ботинок с передатчиком

Секретные устройства


На примере этого ореха, становится понятным такая вещь — любой предмет домашнего обихода может быть превращен в секретное устройство. Орехи использовались Секретной службой СССР, КГБ, в течение многих лет для передачи One-Time Pad (OTP) секретным агентам, которые трудились под прикрытием в Западной Европе. OTP код обычно состоит из страниц, на которых размещены наборы случайных букв или номеров. Каждая страница с OTP кодом использовалась только один раз, после чего немедленно уничтожалась.

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

Грецкий орех чистили, оставляя только скорлупу. Книги OTP обычно состояли из двух типов страниц: с черным и красным текстом. Черный текст использовался для декодирования сообщений, в то время как красный текст предназначался для отправки сообщений. Тончайшая бумага не занимала много места и легко складывалась. На странице размещались группы из 5 знаков, 10 строк по 6 столбцов на страницу, все слаживалось в виде гармошки. Страницы связывались друг с другом ниткой, и скрывались внутри ореха. Затем две половинки грецкого ореха соединялись при помощи клея. Отличить такие секретные орехи от реальных было очень сложно.

Такие орехи с сюрпризом внутри были обнаружены в доме агента КГБ в 1980-х годах в Западной Германии. После его ареста немецкое разведывательное управление и Управление уголовной полиции обыскали квартиру шпиона. Ничего обнаружено не было, но вот одному из офицеров пришла в голову мысль проверить орехи, которые «спокойно» лежали в миске на столе. Большинство из них ничем не отличались от обычных, но парочка орехов почему-то выделялась из «толпы» своими меньшими размерами. Так и были обнаружены OTP страницы, на каждой — 60 5-значных групп знаков.

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

Как с минимальными затратами оборудовать надежный тайник?


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

Поддельный болт


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

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

Монеты


Использовать для тайника мелкие предметы, которые вы обычно носите с собой, может оказаться разумной идеей, а может и нет
.
Во времена холодной войны агенты использовали в качестве тайников полые монеты, в них хранили секретные коды, сообщения, микрофильмы или яд – на крайний случай. Агентами ЦРУ успешно использовалось такое приспособление в виде серебренной монеты. Отличалась она от обычной немного по весу, хотя ощутить это на практике было сложно. Открыть ее можно было только при нажатии в определенную точку на одной из сторон монеты.

В КГБ также разработали такой тайник в виде монет еще 1950-х годах. В полой монете шпион мог спокойно хранить микропленки или микрокарточки. Такой тайник открывался иголкой, необходимо было найти мелкое отверстие на лицевой части монеты и просунуть в него иглу.

Mонетка в 50 евроцентов идентична любой другой, за исключением того, что ее можно разделить на две части. Она состоит из двух частей, в центре имеется небольшое отделение для хранения «секретных» шпионских штук. Такое устройство не откроется ненароком в самый неподходящий момент, чтобы получить доступ к внутреннему тайнику, агенту необходимо использовать специальное алюминиевое кольцо. Монета вставляется в это кольцо, а затем сильно «выстукивается» об стол (или другой твердый предмет).

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


Видео инструкция от Александра Полуляха, как сделать тайник в обиходной монете номиналом в одну гривну

Туристический комплект или косметичка шпиона


Так сказать, вот где можно было разгуляться шпиону. Во времена «холодной войны» популярным предметом среди агентов был туристический комплект. Такие наборы путешественников использовались СССР и Восточной Германией, в них перевозились поддельные паспорта, ОТП коды, секретные документы.

В 1960-е набор для личной гигиены был неотьемлемым аксессуаром деловых людей, путешествующих по всему миру. Большой кожаный кошелек, габариты которого 28 x 17 x 5 см, вмещал бритву, зубную щетку, пилочку для ногтей, зеркало для бритья, зубные щетки, щетку для ткани, расческу и другие вещи необходимые в дороге.

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

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

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

3 месяца бесплатно при оплате новых Dell R630 на срок от полугода — 2 х Intel Deca-Core Xeon E5-2630 v4 / 128GB DDR4 / 4х1TB HDD или 2х240GB SSD / 1Gbps 10 TB — от $99,33 месяц, только до конца августа, заказать можно тут.

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?)

Нативный русский язык из Xorg в rdesktop — мелочь, а приятно

У всех людей свой опыт использования Linux десктопа, но лично для меня очень важным является тандем linux desktop + rdesktop в виртуальные машины. Причины тому — определенный софт, который зачастую работает только под Windows, или работает под Windows лучше, а также необходимость тестировать всякие виндовые штуки.

Такая конфигурация рабочего стола ставит назойливую проблему — в Windows свои языки и их переключение, в Linux — свои, соответственно постоянно попадаешь в необходимость 3-4 раза переключиться, пока не получится. Тем более, если в Xorg язык выбирается не пооконно, а глобально.
Я решил исследовать эту проблему и решить ее как-то нативно для всех режимов, чтобы русские буквы набирались в окне rdesktop ровно также, как они набираются в окнах Xorg. Постараюсь кратко описать суть и технологию такого решения.

Суть проблемы заключается в том, что технология RDP предполагает передачу сканкодов, а не каких-то конкретных символов. Соответственно в rdesktop есть штатные keymap'ы, которые автоматически выбираются исходя из текущей локали.

Таким образом необходимо:
1. Создать специальную раскладку для Windows, в которой одновременно будут присутствовать как английские, так и русские символы, выбираемые каким-то модификатором.
2. Сделать keymap, который будет передавать русские буквы как сканкод с модификатором. Штатный keymap «ru» сделан так, что он отправляет русские символы как AltGr+сканкод. В нем не хватает только символа "№".

Такие раскладки существуют (например Cyrilock), но ни одной нормально работающей я не нашел, поэтому используя Microsoft Keyboard Layout Creator v1.4 я сделал свою. MKLC собирает dll раскладки и делает ей инсталлятор. На кнопках в ней определены английские символы, русские символы определены как AltGr+кнопка (из цифр определить нужно только 3 — №, остальные передаются корректно).

Для работы нужно два файла:
1. Скачать установщик раскладки, установить ее на Windows и оставить единственной. Если вы будете подключаться не через rdesktop, а через консоль — английский язык работать будет, русские буквы можно набирать через Ctrl-Alt.

В линуксе необходимо положить keymap в глобальный (/usr/share/rdesktop/keymaps) или пользовательский (~/.rdesktop/keymaps) каталог.

Несколько нюансов:
1. В keymap добавлено значение ISO_Next_Group 0x0, чтобы нажатие кнопок переключения языка не передавалось на ту сторону и упомянутый выше знак №.
2. Для справки — у меня переключение осуществляется через Caps Lock, индикатором и пооконным контроллером переключения занимается gxkb.
3. Если вы исправляете раскладку и собираете ее через MKLC — всегда называйте ее по разному и перезагружайте машину, он постоянно цепляет старые версии библиотеки раскладки. Перед перезагрузкой ее лучше всего деинсталлировать.
4. В Windows реальное положение раскладок не всегда соответствует настройкам клавиатуры, иногда там появляются лишние. Верное состояние показывает только панель переключения языка.
5. MKLC зачастую не в состоянии исправить название раскладки, для этого ее надо загрузить из установленных в системе и пересохранить исходный файл.

Ссылки:
1. Инсталлятор готовой раскладки.
2. Keymap rdesktop.
3. Исходник раскладки для MKLC v1.4.

Let's block ads! (Why?)

Новые возможности FLProg – ESP8266 как контроллер, а не модем

ESP8266 создан для использования в умных розетках, mesh-сетях, IP-камерах, беспроводных сенсорах, носимой электронике и так далее. Одним словом, ESP8266 появился на свет, чтобы стать мозгом грядущего «Интернета вещей».

Предусмотрено два варианта использования чипа:
1) в виде моста UART-WIFI, когда модуль на базе ESP8266 подключается к существующему решению на базе любого другого микроконтроллера и управляется AT-командами, обеспечивая связь решения с инфраструктурой Wi-Fi;
2) реализуя новое решение, использующее сам чип ESP8266 в качестве управляющего микроконтроллера.
Первый сценарий был реализован в проекте FLProg достаточно давно. Реализуется он с помощью любого из недорогих китайских ESP8266-модулей. Хорошо подходит любителям ардуино и тем, у кого уже есть в руках готовая схематика и отлаженная прошивка на базе чего-то своего, горячо любимого.

Второй вариант сценария предусматривает написание индивидуальной прошивки для управления чипом «изнутри». (До выхода FLProg 3.1 прошивка должна быть написана для фирменного компилятора. Начиная с этой версии, появилась возможность писать прошивки на языках FBD и LAD в среде FLProg).

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

Ключевые характеристики

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

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

Управляет всем этим интегрированным хозяйством расширенная версия 32-битного процессора Tensilica’s L106 Diamond series. Что же интересного внутри?

• 802.11 b/g/n protocol
• Wi-Fi Direct (P2P), soft-AP
• Integrated TCP/IP protocol stack
• Integrated TR switch, balun, LNA, power amplifier and matching network
• Integrated PLL, regulators, and power management units
• +20.5dBm output power in 802.11b mode
• Supports antenna diversity
• Power down leakage current of < 10uA
• SDIO 2.0, SPI, UART
• STBC, 1x1 MIMO, 2x1 MIMO
• A-MPDU & A-MSDU aggregation & 0.4μs guard interval
• Wake up and transmit packets in < 22ms
• Standby power consumption of < 1.0mW (DTIM3)

Ultra Low Power Technology

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

Секрет прост — сложно создать устройство, подключенное к WiFi, достаточное время, работающее на автономном питании. Потребители не готовы менять батареи в датчиках каждые два-три месяца. Поэтому «выход в сеть» приходилось обеспечивать мостами, подключенным к постоянному электричеству. ESP8266 должен решить эту проблему. Теперь Wi-Fi можно использовать даже в автономных датчиках, работающих на небольших батареях. Благодаря использованию продвинутых механизмов управления энергопотреблением решения.

Если бегло посмотреть на характеристики потребления чипа, можно остаться в неведении. 215mA в режиме передачи — ничего особенного? Да, но стоит вчитаться в даташит и начинаешь понимать перспективы решения. ESP8266 потребляет около 60uA в режиме глубокого сна (с работающими часами реального времени) и меньше 1.0mA (DTIM=3) или меньше 0.5mA (DTIM=10) в режиме поддержания

Источник

Let's block ads! (Why?)

[Из песочницы] Детская игрушка на логических элементах

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

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

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

До времени создания игрушки у меня уже некоторое время пылилась на полке Arduino Uno — ожидала, пока я смогу придумать что-то полезное кроме системы автополива цветов, которая, кроме скуки кромешной сама по себе, была чуть менее чем совсем мне не нужна. Я подумал, что вот и наступил ее (Arduino) час, ведь нужно с чего-то начинать. Почитав мануалы для матрицы, я узнал, что кроме того, что просто так к Arduino ее не подключить (только для нее одной нужно 16 выводов, которых в моей Arduino нет), управлять всеми светодиодами одновременно нельзя. Можно одновременно светить определенными диодами либо в одной строке, либо в одном столбце (управление общим катодом, либо общим анодом). И если делать это последовательно и достаточно быстро, человек перестает воспринимать мигание и видит стабильную картинку. Также я узнал, что для Arduino существуют готовые драйверы и библиотеки, которые берут на себя боль управления этим процессом. И вот факт отсутствия такого драйвера на тот момент предрешил исход всего проекта.

Пока я все прокрастинировал и откладывал выбор лучшего места для покупки драйвера, мне попала на глаза статья о работе триггерных систем. Для моего мозга гуманитария она стала настоящим открытием, дающим понимание того, как на примитивном уровне устроена память. Тогда-то я и задался вопросом, смогу ли я обойтись без Arduino и сделать свой проект на основе триггеров и логических схем.

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

После некоторых раздумий в голове образовалась схема, в которой тактовый сигнал с помощью трех последовательно подключенных JK-триггеров преобразовывается в двоичный код, а затем с помощью логических схем — в восьмеричный. Детально о данном виде триггеров можно почитать хотя бы на Википедии. Если коротко, то у него есть два входа (J и K) и два выхода (Q и Q̄ ), а также вход синхронизации (CLK). При подаче логической единицы на один из входов при следующим импульсе синхронизации единица отобразится на соответствующем выходе и сохранится на нем независимо от того, будет ли снова подаваться синхронизирующий импульс и будет ли меняться значение на выбранном вводе при условии, что на втором вводе будет оставаться ноль. Если подать единицу на второй ввод, а на первый ноль, то при следующем импульсе синхронизации значение первого выхода поменяется на ноль, а второго на единицу. А вот если на оба входа триггера подать единицу, то при каждом импульсе синхронизации единица будет попеременно появляться на одном из выходов. И если взять два триггера, на синхронизирующий вход первого подать тактовый импульс, а на синхронизирующий вход второго выход сигнал с выхода Q̄ первого, то в результате выход Q1 будет выводить единицу каждые два такта, а Q2 — каждые четыре. Таким образом получится двухразрядный двоичный счетчик. И если добавить таким же образом третий триггер, то за счет третьего разряда можно досчитать бинарным кодом до восьми — то, что надо.

image

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

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

Решением стала микросхема памяти. Для моей задачи хорошо подходила память EEPROM (Electrically Erasable Programmable Read-Only Memory) — программируемая память с возможностю электрического стирания с параллельным вводом/выводом. У памяти есть насколько адресных входов, которые, по сути, являются разрядами бинарного адреса ячеек памяти. То есть, если у памяти n адресных входов, можно запрограммировать 2^n ячеек. Количество выводов памяти — это так называемая "длина слова", или же фактическая длина бинарной строки, которую можно записать в каждую ячейку. Произведение количества ячеек на длину слов определяет объем памяти в битах.

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

И опять отсутствие опыта не дало мне адекватно оценить сложность процесса. Ведь память нужно запрограммировать, а для этого нужен программатор — прибор ощутимо дорогой для того, чтоб приобрести его для разовой игрушечной поделки. Гугление показало, что теоретически можно было сделать это с помощью Arduino. Но для программирования нужно одновременно подавать сигналы и на адресные входы чипа памяти и на выводы, которые в последствии должны воспроизводить сигнал. А еще нужны сигналы управления записью чипа. То есть, опять больше, чем доступно пинов. Дополнительное гугление открыло для меня сдвиговый регистр — чип, который запоминает задаваемую последовательность нулей и единиц и отображает их на параллельных выходах. Зачастую такие чипы работаю еще и как буфер и имеют выход, который может последовательно воспроизвести сигналы на входе. То есть, если подключить к нему следующий такой же регистр, то можно параллельно отобразить в два раза большую последовательность, чем для одного. По мере ввода строки, первая ее часть пройдет через первый регистр как через буфер на второй, а остальная часть останется на первом регистре. Добавив третий регистр, можно утроить длину строки и т.д. Для реализации этого нужно было написать скетч на незнакомом мне языке программирования. Но имея некий опыт в Python и множество примеров в интернете, после череды проб и ошибок эта задача оказалась вполне выполнима. Скетч можно взять на гитхабе.

И вот скетч написан, микросхема подсоединена, запуск и… ничего — память не программируется. Несколько проб, изменение параметров записи, и никаких результатов. Микросхема у меня была W27C512-45Z. Внимательное чтение мануалов показало неприятный момент. Для записи на определенный контакт микросхемы необходимо подать ток 0.03А напряжением 12В. Я подумал, что просто купил не совсем подходящий чип. Но прошерстив прилавки местных магазинов электро компонентов, я убедился, что 12В нужно всем. Лабораторного блока питания у меня не было. Блоков на 12В в доме полно, но все они импульсные, к тому же ток порядка 1А. Да простят меня опытные инженеры за такое кощунство, но отчаявшись, я решил попробовать, не случится ли чуда с теми блоками, что были под рукой. Не случилось. Первые два прохода записи не дали ничего, а после третьего микросхема перестала подавать признаки жизни.

В интернете я нашел упоминания о некой микросхеме ST662AB — преобразователе 5В-12В — который в сборе с нужным набором конденсаторов должен давать необходимые ток и напряжение. По факту найти микросхему оказалось непросто. В результате заказал ее из Китая, еще и SMD. А что же делать от четырех до шести недель доставки? Правильно, учиться. Пролистывая статьи по программированию памяти, я натолкнулся на упоминание о микросхеме, которую можно программировать при 5В. Речь шла о AT28C256. И действительно, в даташитах к ней никакого упоминания о 12В не было. Нужно брать! Правда микросхема для моих нужд была немного избыточна, так как позволяла сохранить 256Кб: 8-битный выход для 32К адресов, что с учетом занятых трех адресных пинов для сигналов синхронизации строк, оставляло возможность закодировать аж 4096 изображений (мне бы хватило и 10). Кроме того, доставку пришлось сделать аж из Великобритании. Но других вариантов я не нашел, и в конце концов, память можно повторно перепрограммировать, и когда игрушка утратит актуальность, чип можно будет использовать где-то еще. Так через четыре дня память была у меня. Тестовый прогон скетча, и счастье — все работает.

Осталось последнее — решить, сколько будет кнопок, нарисовать картинки 8х8 и реализовать добавление сигналов от кнопок в схему. Прикинув место на доске, я остановился на пяти кнопках. Учитывая никчёмный спрос в сравнении с ресурсом памяти, самым простым способом было подавать сигнал от каждой кнопки напрямую на отдельный вход, не применяя никакого кодирования. Правда, пришлось решать еще задачу переключения между картинками. Можно было использовать кнопки с фиксацией нажима. Но такая реализация не подходила для использования годовалым ребенком, ведь тогда перед нажатием на следующую кнопку надо было отжать работающую, да и была достаточно примитивна сама по себе. Хотелось придумать схему для кнопок без фиксации, при которой нажатие каждой кнопки бы сохранялось, да еще и отменяя нажатие предыдущей. Я читал про особенности применения разных видов триггеров, надеясь что какой-то из них может решить эту задачу самостоятельно, но увы. Посидев немного с листком и карандашом, я придумал следующую схему (пример для трех кнопок).

Вначале необходимо все кнопки подключить на некий коллектор, который на выходе будет давать единицу при нажатии на любую из кнопок. Для этого подойдет OR ключ. Так как чаще всего микросхемы ключей имеют только два входа, необходимо подключить первые две кнопки на один ключ, далее его выход подключить на первый вход второго ключа, а на его второй вход — третью кнопку. Таким способом можно продолжить подключать больше кнопок, добавляя новый ключ для каждой последующей. Кроме того, каждую кнопку нужно подключить на отдельный XOR ключ и на J вход отдельного JK-триггера. На второй вход XOR ключей подключить выход OR буфера, а выход каждого XOR ключа — на K вход соответствующего JK-триггера. Таким образом, нажимая, например, на кнопку 1, на J1 будет подаваться единица, а XOR1 срабатывать не будет, так как на него подается единица и от кнопки, и от OR буфера. На выходе Q1 также появится и будет сохраняться единица. В то же время сработают XOR2 и XOR3, подавая единицу на K2 и K3. И если на Q2 или Q3 до этого была единица, она сменится нулем.

image

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

image

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

Для сборки всей схемы я хотел заказать готовую плату. Но из списка доступных фирм, предлагавших услуги по изготовлению плат по макету, самый дешевый вариант двусторонней платы мне предложили почти за $25. Не знаю, может это и нормальная стоимость, но мне показалась многовато. Кроме того, у меня совсем нет опыта проектирования макетов. И еще я нахожу процесс пайки очень приятным и успокаивающим. Поэтому я купил универсальную плату, рулон разноцветной проволоки, необходимые компоненты и на несколько вечеров засел за сборкой. Так как все компоненты работают от напряжения от 5В до 12В. Для удобства, я сделал питание от батарейки 9В.

Как все в результате работает можно посмотреть тут.
В качестве "сердца" всей схемы я использовал генератор импульсов. Я не был уверен, какая точно нужна частота тактового импульса, поэтому воспользовался готовой схемой с регулировкой. Осциллографа у меня, к сожалению, нет, но по сопоставлению регулировок и даташита схемы, используется где-то 1КГц. Здесь на видео показано как меняется частота с низкой до более высокой, можно рассмотреть, как прорисовываются строки матрицы.

Спасибо за внимание.

Let's block ads! (Why?)

пятница, 31 августа 2018 г.

«Кроме работы я еще работаю» — 10 вопросов программисту, третий выпуск

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

Дима Трабо, 22 года, андроид-разработчик днем, музыкант и звукорежиссер ночью. Выпускник ИГЭУ, основной язык — Java, но еще знает C, Kotlin, Assembler, C# и JS.

1. Расскажи о фиче, которую ты реализовал и которой гордишься.


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

Пришлось несколько дней существовать на developer.android.com, но оно того стоило. Я осознал, что проект может следовать задуманной модели, а не наслаивать одно на другое с такими связями, что задумаешься о бренности бытия.

Ну и помню как в универе гордился, что получилось сделать некое подобие стробоскопа, реагирующего на определенный диапазон частот. Хоть это и было развлечением с Ардуинкой на пару вечеров, но код был знатный. Преобразование Фурье – сила!

2. А теперь — про самый лютый факап.


Факапов постоянно много. Все же стабильность андроида — тема бесконечная. Самые ненавистные траблы появляются при интеграции сторонних продуктов (пальцем показывать не будем) или из-за аппаратных ограничений. Решение подобных проблем уже мутирует в отдельный вид искусства.

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

В самом начале, на самом первом проекте, когда не понимал происходящего, ленился и любил копипастить из stack overflow — накосячил в одном приложении. Скажем так, в условной ленте новостей в определенные лунные сутки посты начинали повторяться через каждые 5-6 постов. При тестировании аномалию не выявили, и все пошло в релиз.

Конечно, никто в тот день не умер. Кроме рейтинга приложения.

3. Опиши свое рабочее пространство: от кресла и монитора до сред программирования и любимых утилит.


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

Рабочий ноут: i5 7-го поколения, 8 ГБ ОЗУ, Windows 10, второй монитор. Все довольно шустро, приятно, хорошо, жалоб нет, только с эмуляторами надо аккуратней. Периодически бывают мысли о маке, потому что UNIX, iossdk + еще несколько фишек.

Из софта — ожидаемая AndroidStudio. Полностью устраивает и радует (хотя может просто сравнить не с чем) + встраиваемые плагины устраняют все недостатки. GitHub — способ скоротать свободное время. Боготворю GitKraken. Ну и вспомогательные: Postman, SublimeText, DBeaver.

4. По какому принципу ты выбираешь работу? Стек, продукт, бытовые условия, деньги?


Это мое первое рабочее место в IT. Я учился на третьем курсе ИГЭУ на кафедре «Пром. электроника и микропроцессорные системы». По традиции на лето мы должны были найти себе практику на распределении и поехать куда-нибудь в места столь отдаленные (на АЭС например). Все, кроме IT компаний выглядело удручающе. Опыта у меня не было, знаний тоже, было только желание.

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

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

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

5. Что в технологиях и языках, которые ты используешь, ты бы хотел исправить?


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

6. Где лучше перенимать чужой опыт — в вузе, на конфах, на Хабре? Еще где-то?


Самое эффективное – совместная работа с толковыми чуваками. Тут сразу все необходимое: новости, советы, идеи, «так не делают, делают вот так», подзатыльники, линки и т.д.

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

Конфы — интересно, но поверхностно в большинстве случаев.

Хабр — «почитать перед сном». Полезностей много, но и воды тоже.

Книги очень помогают, если написаны человеком.

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

7. Будь у тебя неограниченные ресурсы (время, деньги, мощности, люди), каким проектом ты бы занялся?


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

Из чего-то далекого: интересует био-нейро-кибернетика. Штука фантастическая, но реальная. Да и звучит романтично…

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

8. Как ты отдыхаешь? Что делаешь кроме работы?


Кроме работы я еще работаю. Есть подработка звукорежиссером в кавер-группе. Очень помогает отвлечься. Частые поездки, новые лица, иногда просто фантастические мероприятия не дают появиться ощущению, что сижу на одном месте.

Я люблю музыку, но IT-сфера более обширна, стабильна и независима. Заработать опыт крутого звукаря, сделать имя и цену набить в РФ — это подвиг.

9. Расскажи про три любимые книги — учебную, научно-популярную и художественную.


Учебная: Мне почему-то кажется, что они все почти одинаковые, но пусть будет Шилдт «Java8. Полное Руководство», «Паттерны проектирования в Java» (автора не помню).
Сейчас начал Блох «Effective Java», но рано еще давать оценку.

Научпоп: в голову приходит Эриксон «Искусство Эксплойта». Очень громкое название, но перечитывать точно буду. Я еще нигде не видел, чтобы в таком маленьком объеме так много всего было. Красивая подводка, основные фишки С и программирования вообще, дальше основы ассемблера и, что наверное самое крутое, взаимосвязь одного с другим. Основы сетей, основные хакерские приколы и т.д. Просто очень крутая книга.

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

10. Если прямо у тебя на глазах в ИИ проснется сознание, что ты ему скажешь?


Я бы спросил, чем хорошее отличается от плохого. Ну а дальше скинул исходники на гитхаб.

Вопрос от предыдущего героя: зная, что обратно не вернуться, полетел бы ты на Марс в первой экспедиции?


Это как если бы ты не доделал старый проект, а тебе уже дали новый.

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

Раз уж люди-человеки заселяют Марс, то пусть заселение начнется не с технических новшеств, а с человечности.

Бонус: задай вопрос другому разрабу


Если бы твою профессию, дело всей жизни и то, чем ты кормишь близких (семью) в один прекрасный день объявили незаконным, что бы ты сделал?

Let's block ads! (Why?)

Умный город изнутри — взгляд Huawei

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

В теории все выглядит просто, но на деле тем, кто развивает идеологию умного города, приходится сталкиваться с массой барьеров, как типичных для крупных IT-проектов, так и индивидуальных, например, для ЖКХ. И это серьезно усложняет процесс.

Некоторое время назад мы представили свое видение умного города — концепцию Smart/Safe City. Под катом — детальный взгляд на нее с позиции бизнеса и технических специалистов.

Идеи и компоненты


Концепция умного города (Smart/Safe City) включает в себя компоненты из самых разных областей жизнедеятельности, потребителями которой являются как бизнес и госорганизации, так и сами жители городов. И прежде чем говорить о деталях идеи, пройдемся по ее основным составляющим.

Умный транспорт


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

Что может дать бизнесу и городскому хозяйству умный транспорт:

  • управление движением городского транспорта;
  • работы служебных автопарков и таксопарков.

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

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

Безопасность и полиция


Один из наиболее востребованных и проработанных сценариев умного города на сегодняшний день — это безопасность (в контексте защиты от преступности).
Улицы городов по всему миру оснащаются камерами видеонаблюдения, подключенными к единой системе сбора и обработки информации, что позволяет снизить объем преступлений. Хорошо иллюстрирует перспективность этой концепции пример Кении, где по мере развертывания современных сетей связи и реализации проекта «Безопасный город» уровень преступности в среднем по стране за один только 2015 год упал на 46%.

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

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

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

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

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

Умное потребление ресурсов


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

Хотя счетчики расхода различных ресурсов внедряются давно, в этой сфере, если можно так выразиться, пока не пройден даже «уровень 0» — то есть внедрение интеллектуальных систем находится на начальной стадии. Необходимо не только внедрить датчики во всех сферах ЖКХ, но и собрать данные в единую платформу для централизованного управления. В масштабах нашей страны это задача на годы и миллиардные бюджеты.

В мире есть примеры городов, активно внедряющих умное потребление ресурсов. В частности, Барселона внедрила автоматизированное управление уличным освещением с учетом времени суток и погодных условий. Учитывая благоприятные климатические условия (и серьезные проблемы с загрязнениями городского воздуха), здесь активно используется солнечная энергия — для нагрева воды в зданиях, а также питания интерактивных табло остановок общественного транспорта. При участии города разрабатывается модульная open source платформа Sentilo, собирающая и анализирующая информацию со счетчиков потребления основных ресурсов, датчиков погоды, окружающего шума и т.п. (система работает уже более трех лет, ее работу можно оценить на официальном сайте sentilo.io). В 2015 Барселона удостоилась звания «самого умного города на планете».

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

Другие сферы


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

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

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

Стоит отметить, что разделения отраслей в данном перечне весьма условно. Множество задач решаются на стыке, к примеру, анализа ресурсов и логистики. Хороший пример такого проекта — интеллектуальный сбор мусора в Dubai Silicon Oasis (свободной экономической зоне в Dubai, где активно внедряются технологии умных городов).

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

Кроме того, есть идеи, собирающие в себе решения сразу из нескольких сфер. К примеру, умные офисные здания, являющиеся частью умного города. Smart building внедряет учет и интеллектуальное управление потреблением основных ресурсов на своем уровне, что в конечном счете влияет и на эффективность «работы» систем всего города.

Проблемы внедрения


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

Барьер 1: неясная экономика


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

Основной камень преткновения — сроки окупаемости проектов. Бизнесу нужны рыночные стратегии, которые дадут прибыль в ближайшие пять лет (в России с учетом экономической ситуации — в течение трех лет), а умный город — это инвестиции в более отдаленные перспективы. И нестыковка бизнес-кейсов — серьезный тормоз развития умного города; это один из основных факторов, из-за которых smart city развиваются пока не так активно, как могли бы.

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

К примеру, в Чехии построили умное освещение вдоль дорог. Проект был инициирован бизнесом и окупился. Но одной из его основных составляющих была замена ламп освещения. А такие задачи, как правило, выполняются муниципалитетами на собственные средства.

Барьер 2: сложности с тиражированием


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

Кстати, в России стоимость основных ресурсов относительно других стран мира сравнительно низкая, что выливается в несколько иную экономику проектов сбережения. Отчасти поэтому концепция умного города у нас начинается с другой стороны — с безопасности. Да, Санкт-Петербург и Москва, в определенной степени, уже оснащены камерами видеонаблюдения. Но в других городах-миллионниках и, тем более в регионах, ситуация с ними много хуже.

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

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

Барьер 3: информационная безопасность


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

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

Барьер 4: legacy


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

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

Концепция Huawei


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

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

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

В теории решение, аналогичное умному городу Huawei, можно построить и на базе открытых или сторонних компонентов. Но тут придется уделить дополнительное внимание вопросу трудозатрат (стоимости), а также последующей поддержке решения. Ведь разработанную инфраструктуру необходимо не только развернуть, но и превратить в работающий инструмент. По опыту других отраслей, где внедряются крупные IT-решения, opensource-проекты живут ровно до того момента, пока не придут серьезные промышленные конкуренты.

Платформа агрегации и анализа данных


Сердцем системы является mediation-платформа агрегации и обработки данных OceanConnect, обеспечивающая работу с миллионами конечных устройств.

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

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

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


Инфраструктура Huawei поддерживает целый спектр общепризнанных стандартов связи и протоколов взаимодействия с датчиками. В частности, для большинства современных IT-протоколов в ней предусмотрены коннекторы. В общей сложности интегрировано уже более 170 интерфейсов, а открытый SDK позволяет при необходимости добавлять новые.

Аппаратная составляющая решения подбирается под конкретный проект, у самой Huawei предусмотрен целый класс собственных DCP-решений (развитие Huawei AR с интегрированными стандартами и протоколами IoT), но могут использоваться и сторонние продукты.

Конечные устройства


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

Конечные приложения


Со стороны приложений у OceanConnect есть открытый API взаимодействия с внешними системами.

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

Взгляд в будущее


Умным городам предрекают большое будущее. Однако когда оно наступит, пока не ясно. Технологически для этого все готово: есть инструменты анализа Big Data, соответствующее серверное оборудование, датчики, способные работать по десять лет без подзарядки аккумулятора, и соответствующие стандарты связи. Но этому рынку очень не хватает технологической стабильности — окончательного выбора доминирующих стандартов и формирования бизнес-моделей, когда станет понятно, как здесь можно работать и зарабатывать.

Подобный процесс мы наблюдали пару десятилетий назад на рынке сотовой связи. Тогда было множество стандартов, помимо GSM, но сейчас они все либо ушли, либо занимают определенные несущественные ниши. На массовом рынке GSM одержал безоговорочную победу. Аналогичный процесс ожидает и сектор интернета вещей. Рано или поздно все придет к одному или нескольким общим стандартам и станет понятна бизнес-модель, по которой будет работать рынок.

Как мы уже писали, чтобы бизнес заинтересовался умным городом, он должен понимать финансовые перспективы. Пока же рынок не устоялся, и многие не хотят быть первыми — поскольку именно первопроходцам обычно достается не только основная прибыль, но и масса нерешенных проблем (и еще не факт, что прибыль в итоге покроет поиск решений). Однако отложить этот проект вовсе не позволяет еще один фактор — прогрессирующий рост урбанизации во всем мире. Города становятся не только центрами экономической и культурной, но и основными источниками ВВП.
Рост городских агломераций и связанные с ним проблемы перенаселения вынуждают заказчиков по всему миру пробовать различные высокотехнологичные решения. И в ответ на этот пока еще невысокий спрос вендоры активно продвигают свои видения концепции умных городов, чем активно заняты и мы.

Let's block ads! (Why?)