TJ

Интернет

Султан Сулейманов

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

У этого пользователя десятки тысяч видео на YouTube с сотнями тысяч просмотров, о нём пишут крупнейшие мировые СМИ. Но никто не знает, что означают его ролики и почему их так много.

23 сентября 2013 года пользователь Webdriver Torso загрузил на YouTube первое видео. Всё, что оно содержит — красный и синий прямоугольники, которые за 10 секунд 10 раз произвольно изменяются в размерах и меняют своё местоположение на белом фоне. Действие происходит под сгенерированный на компьютере гудок.

Через полчаса Webdriver Torso загрузил ещё один ролик, затем ещё, ещё и через 8 месяцев канал уже насчитывает более 77 тысяч видео. Практически все построены по схожей схеме: 10 секунд, красный и синий прямоугольники, 10 слайдов, монотонный звук. И никаких намёков на то, чем это могло бы быть.

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

Мы не знаем, что это и почему это существует. Имя «tmpqjyiOb» не даёт никаких подсказок, а поле описания пустое. Кажется, мы были первыми, кто увидел эти видео.Wired

Так что же это? Читатель развлекательного сайта BoingBoing с псевдонимом Enkidu предположил, что Webdriver Torso является наследником номерных радиостанций, которые предположительно использовались разведслужбами для передачи данных шпионам на задании. Сигнал с таких станций, как и видео с цветными прямоугольниками, доступен всем желающим, но смысл передаваемых сообщений посторонним непонятен.

Кто-нибудь, кто очарован номерными радиостанциями, но разочарован тем, что пропустил расцвет Холодной войны — это может быть ваш шанс! Я разработчик, но это слишком далеко от сферы моих знаний… но я был бы счастлив скооперироваться с кем-нибудь заинтересованным.Enkidu, читатель BoingBoing

Enkidu в своей записи упоминает и набор сервисов Selenium для автоматизации различных задач, связанных с интернетом. Дело в том, что один из инструментов Selenium, позволяющий автоматически тестировать сайты, как раз называется Webdriver.

Издание The Daily Dot обратилось к разработчикам инструментов за комментарием, но Патрик Лайтбоди, работающий в Selenium с 2005 года, заявил, что его сервисы не имеют никакого отношения к этому видео. «Ролики выглядят так, будто кто-то пытается связаться с инопланетянами», — добавил Лайтбоди.

В комментарии к записи на BoingBoing о номерных радиостанциях нью-йоркский тестировщик программ Исаул Варгас рассказал, что в 2013 году он был на презентации европейской компании-разработчика программного обеспечения для телеприставок. Она использовала Webdriver от Selenium и программу для распознавания изображений, чтобы убедиться, что раскодирование и загрузка видео работают корректно.

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

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

В поисках истины Стивен Бекетт из «Би-би-си», используя API (программный интерфейс) YouTube, выкачал данные всех роликов в канале Webdriver Torso: названия, длительность, описания и другую информацию. Полученные сведения позволили сделать вывод о том, что автор канала — безустанная машина. Он никогда не спит, загружает каждый день по 400 роликов, а на Рождество, когда случился пик, новое видео появлялось каждые две минуты.

Но это не главное: у Webdriver Torso есть два ролика, отличающихся от остальных. Первое представляет собой отрезок из мультфильма Aqua Teen Hunger Force и доступно только для жителей Франции и только по платному доступу — за 1,99 доллара). Зато второе вызывает массу догадок и вопросов.

На шестисекундном ролике видна Эйфелева башня, снятая из окна, после чего в кадр попадает экран компьютера, на котором ничего не разобрать. Автор видео оставил комментарий к нему: он написал загадочную фразу «Матей очень умный».

Но кто такой Матей? Доподлинно это неизвестно, но The Guardian приводит две догадки: во Франции с публичными профилями есть два человека с таким именем. Один из них, Басараб Матей, работает над распознаванием изображений в Университете Париж-Север, а второй — Матей Манкас — изучает моделирование внимания в бельгийском Университете Монса.

The Guardian попросил их обоих сказать что-нибудь о загадочных роликах, но пока не получил ответа. Попытки «Би-би-си» связаться через Google+ с Webdriver Torso также пока не увенчались успехами. Зачем загружаются эти ролики и кто это делает, всё ещё остаётся загадкой.

Но Webdriver Torso определённо существует: 2 мая, после трёхнедельного перерыва, в канале появилось новое видео. Оно ничем не отличается от 77 тысяч предыдущих, кроме одного обстоятельства: автор лайкнул собственное творение.

Кто ты, мистер прямоугольники?
Султан Сулейманов,
TJournal

#Статья #YouTube #Webdriver_Torso

ZenCad

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


Прямоугольник

Плоский примитив — прямоугольник. Задаётся двумя сторонами. Допустимо не указывать вторую сторону, что будет соответствовать построению квадрата. Установка опции center совмещает геометрический центр тела с началом координат. При установке опции wire вместо залитой грани будет сгенерирован цикл прямоугольника.

Сигнатура:

rectangle(x, y, center=True/False, wire=True/False)
rectangle(a, center=True/False, wire=True/False)
square(a, center=True/False, wire=True/False) #alternate


Окружность/Круг

Окружность задаётся радиусом r. Установка необязательной опции

angle позволяет сгенерировать сектор круга / дугу окружности. При установке опции wire вместо залитой грани круга будет сгенерирована каркасная окружность.

Сигнатура:

circle(r=radius, wire=True/False)
circle(r=radius, angle=angle, wire=True/False)
circle(r=radius, angle=(start, stop), wire=True/False)


Элипс

Плоский примитив — эллипс. Задаётся двумя радиусами, причем r1 должен быть больше r2. Также можно построить сектор, указав угол или пару углов как необязательный параметр angle. При установке опции

wire вместо залитой грани будет сгенерирован каркас.

Сигнатура:

ellipse(r1=major, r2=minor, wire=True/False)
ellipse(r1=major, r2=minor, angle=angle, wire=True/False)
ellipse(r1=major, r2=minor, angle=(start, stop), wire=True/False)


Полигон

Плоский примитив — полигон. Строится по точкам вершин. При установке опции wire вместо залитой грани будет сгенерирован каркас (что аналогично закрытому полисегменту. ). pnts — массив точек вершин.

Сигнатура:

polygon(pnts=pnts, wire=True/False)


Правильный многоугольник

Плоский примитив — правильный многоугольник. Задаются радиус и количество вершин. При установке опции

wire вместо залитой грани будет сгенерирован каркас.

Сигнатура:

ngon(r=radius, n=vertexCount, wire=True/False)


Текст

Плоский примитив — текст. Создаёт грань на основе строки text, названия шрифта fontname и размера шрифта size. Шрифт выбирается из числа зарегистрированных в системе. Для регистрации дополнительных шрифтов используйте комманду register_font. Опция composite_curve Позволяет снизить количество составных объектов результирующей формы путём увеличения их сложности.

Сигнатура:

textshape(text, fontname, size, composite_curve=False)


Бесконечная плоскость

Бесконечная плоскость — специальный геометрический объект, который может использоваться в некоторых операцих над другими объектами. infplane().rotX(deg(90)).right(3)


Заполнение контура

Данная операция применяется к плоской замкнутой линии wire и превращает ее в грань.

Сигнатура:

fill(wire)
wire.fill() #alternate

Пример:

wire = sew([
segment((0,0,0), (0,10,0)),
circle_arc((0,10,0),(10,15,0),(20,10,0)),
segment((20,0,0), (20,10,0)),
segment((20,0,0), (0,0,0))
])
fill(wire)
ДоПосле

Интерполяция поверхности по массиву точек

Строит bspline поверхность интерполируя 2д массив точек. Масив задаётся двумерным списком. degmin и degmax задают минимальную и максимальную степени интерполяционного полинома, соответственно.

Сигнатура:

interpolate2(pnts, degmin=3, degmax=7)

Пример:

POINTS = points2([
[(0,0,0), (10,0,7), (20,0,5)],
[(0,5,0), (10,5,7.5), (20,5,7)],
[(0,10,2), (10,10,8), (20,10,5)],
[(0,15,1. 3), (10,15,8.5), (20,15,6)],
])
m = interpolate2(POINTS)
disp(m)
disp(POINTS, color=color.red)

Генерация прямоугольников вдоль линий (Управление данными) — ArcGIS Pro

В этом разделе
  1. Сводка
  2. Иллюстрация
  3. Использование
  4. Параметры
  5. Среды
  6. Лицензионная информация

Сводка

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

Иллюстрация

Параметры

Этикетка Объяснение Тип данных

Входные линейные объекты

Входные полилинейные объекты, определяющие пути объектов.

Слой объектов

Выходной класс объектов

Выходной класс полигональных объектов.

Класс объектов

Длина вдоль линии

(Необязательно)

Длина выходных полигональных объектов вдоль входных линейных объектов. Значение по умолчанию определяется пространственной привязкой входных линейных объектов. Это значение будет равно 1/100 экстента входного класса пространственных объектов по оси X.

Линейная единица

Длина, перпендикулярная линии

(Необязательно)

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

Линейная единица измерения

Метод пространственной сортировки

(дополнительно)

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

  • Верхний правый — функции начинаются в верхнем правом углу. Это значение по умолчанию.
  • Верхний левый — Элементы начинаются в верхнем левом углу.
  • Внизу справа — Элементы начинаются в правом нижнем углу.
  • Нижний левый — Элементы начинаются в левом нижнем углу.
Строка
 arcpy.management.GenerateRectanglesAlongLines(in_features, out_feature_class, {length_along_line}, {length_perpendicular_to_line}, {spatial_sort_method}) 
9 0026 Имя Объяснение Тип данных

in_features

Входные полилинейные объекты, определяющие путь объектов.

Слой объектов

out_feature_class

Выходной класс полигональных объектов.

Класс объектов

length_along_line

(Необязательно)

Длина выходных полигональных объектов вдоль входных линейных объектов. Значение по умолчанию определяется пространственной привязкой входных линейных объектов. Это значение будет равно 1/100 экстента входного класса пространственных объектов по оси X.

Линейный блок

length_perpendicular_to_line

(Необязательно)

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

Линейная единица

метод пространственной_сортировки

(необязательно)

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

  • UR — функции начинаются в правом верхнем углу. Это значение по умолчанию.
  • UL — Элементы начинаются в верхнем левом углу.
  • LR — Элементы начинаются в правом нижнем углу.
  • LL — Элементы начинаются в левом нижнем углу.
Строка

Пример кода

Пример GenerateRectanglesAlongLines (окно Python)

Следующий оконный скрипт Python демонстрирует, как использовать инструмент GenerateRectanglesAlongLines.

 импорт аркпи
arcpy.env.workspace = r"C:\data\US_Streams.gdb"
arcpy.management.GenerateRectanglesAlongLines("StreamReach", "riparian_zones",
                                              «250 метров», «180 метров», «УР») 

Среды

Текущая рабочая область

Информация о лицензировании

  • Базовая: Да
  • Стандартная: Да
  • Расширенная: Да
Связанные темы
90 216

  • Отзыв по этой теме?

    геометрия — Быстрый алгоритм для создания прямоугольников, содержащих некоторое количество 2D точек

    У меня есть одна проблема, с которой я борюсь. Учитывая следующее:

    • массив all_points , содержащий 2D-точки, каждая точка представлена ​​в виде кортежа (x, y) .
    • массив musthave_points , содержащий индексы точек, которые находятся в all_points .
    • целое число м , с м < len(all_points) .

    Вернуть список прямоугольников, в котором прямоугольник представлен кортежем, содержащим его 4 вершины ((x0, y0), (x1, y1), (x2, y2), (x3, y3)) , каждая прямоугольник должен удовлетворять следующим условиям:

    1. Содержит м точек из all_points , эти м точек должны полностью лежать внутри прямоугольника, то есть не на 4-х сторонах прямоугольника.
    2. Содержит все точки из musthave_points . Если musthave_points — это пустой список, прямоугольники должны удовлетворять только первому условию.

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

    Примечание: Одно простое решение грубой силы состоит в том, чтобы сначала сгенерировать все комбинации из m точек, каждая из которых содержит все точки из musthave_points . Для каждой комбинации создайте один прямоугольник, покрывающий все точки комбинации. Затем подсчитайте количество точек внутри прямоугольника, если количество точек равно м , это допустимый прямоугольник. Но это решение работает с факторной временной сложностью. Можете ли вы придумать что-то быстрее, чем это?

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

     импорт itertools
    импортировать numpy как np
    импорт cv2
    импортировать копию
    импорт системы
    из точки импорта shapely.geometry
    из shapely.geometry.polygon импортировать многоугольник
    # Кредит: https://github.com/dbworth/minimum-area-bounding-rectangle/blob/master/python/min_bounding_rect.py
    определение minBoundingRect (hull_points_2d):
     #print "Введите точки выпуклой оболочки: "
     # печать hull_points_2d
     # Вычислить ребра (x2-x1,y2-y1)
     ребра = np. zeros((len(hull_points_2d) - 1, 2)) # пустой массив из 2 столбцов
     для i в диапазоне (длина (ребра)):
     edge_x = hull_points_2d[i+1, 0] - hull_points_2d[i, 0]
     edge_y = hull_points_2d[i+1, 1] - hull_points_2d[i, 1]
     края [i] = [край_x, край_y]
     # Вычислить краевые углы atan2(y/x)
     edge_angles = np.zeros((len(edges))) # пустой массив из 1 столбца
     для i в диапазоне (len (edge_angles)):
     edge_angles[i] = np.math.atan2 (ребра [i, 1], ребра [i, 0])
     # Проверка углов в 1-м квадранте
     для i в диапазоне (len (edge_angles)):
     edge_angles[i] = np.abs(edge_angles[i] % (np.math.pi/2)) # нужны строго положительные ответы
     # Удалить повторяющиеся углы
     edge_angles = np.unique (edge_angles)
     # Протестируйте каждый угол, чтобы найти ограничивающую рамку с наименьшей площадью
     min_bbox = (0, sys.maxsize, 0, 0, 0, 0, 0, 0) # rot_angle, area, width, height, min_x, max_x, min_y, max_y
     для i в диапазоне (len (edge_angles)):
     R = np. array([[np.math.cos(edge_angles[i]), np.math.cos(edge_angles[i]-(np.math.pi/2))], [np.math.cos( edge_angles[i]+(np.math.pi/2)), np.math.cos(edge_angles[i])]])
     # Применяем это вращение к точкам выпуклой оболочки
     rot_points = np.dot(R, np.transpose(hull_points_2d)) # 2x2 * 2xn
     # Найти минимальные/максимальные точки x,y
     min_x = np.nanmin (rot_points [0], ось = 0)
     max_x = np.nanmax (rot_points [0], ось = 0)
     min_y = np.nanmin (rot_points [1], ось = 0)
     max_y = np.nanmax (rot_points [1], ось = 0)
     # Вычислить высоту/ширину/площадь ограничивающего прямоугольника
     ширина = макс_х - мин_х
     высота = макс_у - мин_у
     площадь = ширина * высота
     # Сохраняем наименьший прямоугольник, найденный первым (простой выпуклый корпус может иметь 2 ответа с одинаковой площадью)
     если (площадь < min_bbox[1]):
     min_bbox = (edge_angles[i], площадь, ширина, высота, min_x, max_x, min_y, max_y)
     # Пересоздаем матрицу поворота для наименьшего прямоугольника
     угол = min_bbox[0]
     R = np. array([[np.math.cos(угол), np.math.cos(угол-(np.math.pi/2))], [np.math.cos(угол+(np.math. пи/2)), np.math.cos(угол)]])
     # Проецирование точек выпуклой оболочки на повернутую рамку
     proj_points = np.dot(R, np.transpose(hull_points_2d)) # 2x2 * 2xn
     #print "Точки корпуса проекта равны \n", proj_points
     # мин./макс. точки x,y относительно базовой линии
     min_x = min_bbox[4]
     max_x = min_bbox[5]
     min_y = min_bbox[6]
     max_y = min_bbox[7]
     #print "Минимум x:", min_x, "Макс x:", max_x, "Минимум y:", min_y, "Макс y:", max_y
     # Вычислить центральную точку и проецировать на повернутый кадр
     center_x = (min_x + max_x)/2
     center_y = (min_y + max_y)/2
     center_point = np.dot([center_x, center_y], R)
     #print "Центральная точка ограничивающей рамки: \n", center_point
     # Рассчитать угловые точки и спроецировать на повернутый кадр
     Corner_points = np.zeros((4,2)) # пустой массив из 2 столбцов
     угловые_точки[0] = np.dot([max_x, min_y], R)
     угловые_точки[1] = np. dot([min_x, min_y], R)
     угловые_точки[2] = np.dot([min_x, max_y], R)
     угловые_точки[3] = np.dot([max_x, max_y], R)
     return (угол, min_bbox[1], min_bbox[2], min_bbox[3], center_point, angle_points) # rot_angle, area, width, height, center_point, angle_points
    класс PatchGenerator:
     def __init__(self, all_points, musthave_points, m):
     self.all_points = copy.deepcopy(all_points)
     self.n = len(все_точки)
     self.musthave_points = copy.deepcopy(musthave_points)
     м = м
     @статический метод
     def create_rectangle (точки):
     rot_angle, area, width, height, center_point, angle_points = minBoundingRect(points)
     вернуть угловые_точки
     @статический метод
     def is_point_inside_rectangle (прямоугольник, точка):
     баллы = точка (* точка)
     многоугольник = многоугольник (прямоугольный)
     возврат polygon.contains(pts)
     def check_valid_rectangle (я, прямоугольник, the_complement):
     # проверка, содержит ли прямоугольник какую-либо другую точку из `the_complement`
     для точки в the_complement:
     если self. is_point_inside_rectangle (прямоугольник, точка):
     вернуть ложь
     вернуть Истина
     деф сгенерировать (сам):
     прямоугольники = []
     # сгенерировать все комбинации из m очков, включая очки из musthave_points
     the_rest_indices = список (набор (диапазон (self.n)). разница (self.musthave_points))
     comb_indices = itertools.combinations(the_rest_indices, self.m - len(self.musthave_points))
     comb_indices = [self.musthave_points + список (inds) для inds в comb_indices]
     # для каждой комбинации
     для расчески в comb_indices:
     comb_points = np.array (self.all_points) [расческа]
     ## создаем прямоугольник, покрывающий все m точек
     прямоугольник = self.create_rectangle (comb_points)
     ## проверить правильность прямоугольника
     the_complement_indices = список (набор (диапазон (self.n)). разница (расческа))
     the_complement_points = список (np.array (self.all_points) [the_complement_indices])
     если self.