Geeks
7.98K subscribers
298 photos
19 videos
1.11K links
От гиков гикам!
Пишем о происходящем в информационных технологиях.

@shpaker и @qqalexqq
Download Telegram
Часть первая

Подготовительные работы

Итак, первое, что делаем - пишем функцию, которая (внезапно) отдаёт нам случайное булевое значение:

from random import random

def random_bool() -> bool:
return random() < 0.5

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

Генерация необходимых данных

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

def generate_row(
cells_count: int,
) -> List[bool]:
return [random_bool() for _ in range(cells_count)]


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

def generate_block(
width: int,
height: int,
) -> List[List[bool]]:
return [generate_row(width) for _ in range(height)]


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

И вот, свет увидела еще одна функция в одну строчку:

def reverse_block(
block: List[List[bool]],
) -> List[List[bool]]:
return [list(reversed(i)) for i in block]


Теперь мы можем сгенерировать все три части изображения. Вот приблизительно как-то так:

left = generate_block(width=cells_count // 2, height=cells_count)
spacer = generate_block(width=cells_count % 2, height=cells_count)
right = reverse_block(left)


Очевидно, что нам надо как-то их соединить, и для этого мы напишем вот такую функцию:

def concatenate_blocks(
left: List[List[bool]],
spacer: List[List[bool]],
right: List[List[bool]],
) -> List[List[bool]]:
result = list()
for i, left_row in enumerate(left):
right_row = right[i]
spacer_row = spacer[i]
line = [*left_row, *spacer_row, *right_row]
result.append(line)
return result


И вуаля!

def generate_data(
cells_count: int = 5,
) -> List[List[bool]]:
left = generate_block(width=cells_count // 2, height=cells_count)
spacer = generate_block(width=cells_count % 2, height=cells_count)
right = reverse_block(left)
return concatenate_blocks(left, spacer, right)


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

>>> from pprint import pprint
>>> data = generate_data()
>>> pprint(data)
[[False, True, True, True, False],
[False, True, False, True, False],
[False, True, True, True, False],
[False, True, True, True, False],
[True, False, False, False, True]]


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

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

>>> def data_to_str(data: List[List[bool]]) -> str:
>>> return "\\n".join(list("".join(list(map(lambda x: "#" if x else " ", row))) for row in data))
>>> print(data)
###
# #
###
###
# #
👍6🤡1
Часть 2

Генерация векторного изображения

Самый простой способ вывести изображение, состоящее из примитивов, это ручками слепить данные для SVG, и сохранить их в файл. SVG представляет из себя обычный XML. Я быстро сделал Jinja2-шаблон и циклом в нем нарисовал необходимые прямоугольники. Потом почесал затылок и решил, что Jinja2 всё таки пакет сторонний, а хочется свести количество зависимостей к нулю (спойлер: у меня так не выйдет).

Заглянем в будущее и рассмотрим фрагмент XML-файла, который у нас должен получиться:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="<http://www.w3.org/2000/svg>" viewBox="0, 0, 64, 64">
<rect x="0" y="0" width="64" height="64" style="fill:#933" />
<rect x="32" y="0" width="32" height="64" style="fill:#393" />
</svg>



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

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

- Основной блок в котором мы задаем размер области видимости. То есть главный прямоугольник в который и будет вписана аватарка. И в этот блок мы вписываем сгенерированные прямоугольники. Зададим значение вот такой чудесной строкой:

SVG_WRAPPER = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="<http://www.w3.org/2000/svg>" viewBox="0, 0, {width}, {height}">
{rects}
</svg>
"""


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

SVG_RECT_TAG = '<rect x="{x}" y="{y}" width="{width}" height="{height}" style="fill:{color}" />

Для получения готовых к использованию фрагментов XML будем использовать format для подмены значений в строках. И теперь мы можем написать функцию для создания svg-тега прямоугольника:

def make_svg_cell(
x: int,
y: int,
offset: int,
size: int,
color: Optional[str],
) -> str:
return SVG_RECT_TAG.format(
x=x*size+offset,
y=y*size+offset,
size=size,
color=color,
)


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

def make_svg_data(
data: List[List[bool]],
cell_size: int,
offset: int,
first_color: Optional[str],
second_color: Optional[str],
) -> str:
box_size = len(data) * cell_size + 2 * offset
box = make_svg_cell(
x=0,
y=0,
offset=0,
size=box_size,
color=first_color,
)
rects: List[str] = [box]
for y, row in enumerate(data):
for x, cell in enumerate(row):
if not cell:
continue
rect = make_svg_cell(
x=x,
y=y,
offset=offset,
size=cell_size,
color=second_color,
)
rects.append(rect)
svg_xml = SVG_WRAPPER.format(
rects="\\n".join(rects),
size=box_size,
color=first_color,
)
return svg_xml



И завершающий шаг, на котором можно проверить результат работы скрипта:

data = generate_data()
svg = make_svg_data(data, cell_size=16, offset=8, first_color="#fff", second_color="#f6f")
with open("test.svg", "w") as file:
file.write(data)

Теперь можно открыть файл и полюбоваться на сгенеренное. Если хочется растровое изображение, то самый простой способ его получить - конвертнув его из SVG (на pypi можно найти пакет CairoSVG, но в системе должна стоять либа cairo).
👍91😢1
Baidu получила первое разрешение в Китае на полноценный запуск такси без водителя и сразу в двух городах. Из ограничений: работать им можно только днём, на территории 13 квадратных километров в Ухане и 30 квадратных километрах в Чунцине. Учитывая, что города довольно крупные (там живёт больше 20 миллионов жителей), тест должен получиться масштабным, а в случае успеха должны будут добавляться и новые территории.

В компании со своей стороны заверяют, что их роботакси максимально безопасны - всё железо в бортовых системах дублировано, есть возможность удалённого управления машиной, а автопилот настроен таким образом, чтобы минимизировать любые риски аварий. Учитывая, что Baidu также тестирует свои роботакси и в США, с разрешением работы в Китае они становятся очень значительным игроком на этом рынке. https://www.engadget.com/baids-robotaxi-safety-driver-china-autonomous-self-driving-020024214.html
👍6🔥1
Яндекс запустил технологию перевода прямых трансляций на YouTube в открытое бета-тестирование.

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

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

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

Пока технология еще тестируется на YouTube-стримах, но команда Яндекс браузера планирует запустить ее и на Twitch.
🔥6👍2😢1
В последнее время стараюсь пробегать статанализаторами по файлам всех форматов в репозитории. На локальном хосте проверки осуществляю pre-commit’ом, а не локально - GitLab’ом. И каждый раз радуюсь как дитя, встречая в новостных лентах упоминания о новых линтерах. Сегодня утром прочитал об утилите checkmake для проверки Make-файлов. В описании репозитория указано, что инструмент “эксперементальный”, ну и даже без этой подписи складывается впечатление, что инструмент очень свежий, и еще не достаточно обкатан в боевых условиях. Но уже выглядит достаточно интересно. Поставил звёздочку и буду смотреть, на дальнейшую судьбу этого маленького проекта.

Шах и мат, мейк-файлы https://github.com/mrtazz/checkmake
👍7
Всё больше пользователей стримингов отписываются от них в течение нескольких месяцев после первоначальной подписки. Так, по статистике, 19% людей за последние два года отписались от трех и более крупных сервисов просмотра видео (а их всего пять), а раньше этот показатель был всего 6%. Конечно, нужно учитывать, что стримингов стало больше - двумя годами ранее их было не пять, а три и теперь люди часто следуют логике: "сегодня сериал досмотрю, а завтра переподпишусь на другой сервис". Но то, что подписка на сервис стала вещью непостоянной, вселяет всё меньше уверенности компаниям в том, что надо вкладывать большие деньги в свои проекты - тот же Netflix уже говорил, что будет больше вкладываться в кино со скромными бюджетами.

Как один из факторов отписок нужно учитывать и цены на стримингах - большинство из них стали брать больше денег, отменили льготные тарифы, а контента не стало в разы больше. Также окончание пандемии ознаменовалось тем, что снова можно ходить в кинотеатры, да и вообще выходить из дома - не нужно искать чем занять время сидя дома. Интересно, как будет с подписками на программы, ведь раньше предрекали, что именно за счёт ежемесячной оплаты разработчики смогут продолжать развивать выпущенный софт и он будет стабильно приносить им деньги. Не получится ли тут как со стримингами и после подписки на десяток программ люди начнут брать их на пару месяцев, а дальше массово отписываться? https://www.wsj.com/articles/streaming-services-deal-with-growing-number-of-subscribers-who-watch-cancel-and-go-11660557601
👍10
Шведский игровой издатель Embracer Group купил Middle-Earth Enterprises, которой принадлежат права на всю историю Властелина колец, Хоббита и всего, что связано с этой франшизой. Компания тут же заявила, что намерена снимать фильмы о героях вселенной, вроде Гэндальфа, Арагорна, Голлума и других. До этого Embracer выпускала только настольные игры по Властелину Колец и пока чётких планов именно об играх не прозвучало, зато известно, что будет выпущено ещё больше мерча для фанатов (как будто его нехватало).

Embracer Group за последние пару лет получили кучу инвестиций, на которые скупали крупные и мелкие компании на рынке видеоигр, причём от создателей сплошных AAA-проектов до разработчиков казуальных игр, и всё время заявляют о грядущих приобретениях. Насколько известно от разработчиков, этот издатель обычно не вмешивается в процесс создания игр и лишь контролирует происходящее, давая все необходимые средства для деятельности. Будем надеяться, что и с Властелином колец у них выйдет лучше, чем у Диснея с покупкой Звёздных Войн. https://arstechnica.com/gaming/2022/08/embracer-acquires-rights-to-tolkien-related-ip-teases-new-lotr-films/
😁4👍2💔21
Как построить систему обработки сообщений? Разбираем на примере конструктора чат-ботов

Когда: 25 августа, 17:00 (мск)
📍 Регистрация

Регистрируйтесь на вебинар и узнайте, что делать, если ни один из стандартных инструментов построения очередей не подходит. На встрече спикеры разберут принципы построения очередей на примере конструктора чат-ботов Smartbot Pro.

В программе:
🔹 Как построить архитектуру для отказоустойчивой обработки сообщений.
🔹 Какие требования выдвигать к брокеру сообщений, который обеспечивает взаимодействие сервисов между собой. Рассматриваем альтернативы RabbitMQ, Kafka, NATS.
🔹Какие инструменты использовать, чтобы создать универсальный брокер и обеспечить его отказоустойчивость.

Спикеры:
🔹 Монс Андерсон, архитектор Tarantool
🔹 Игорь Латкин, архитектор компании KTS

Зарегистрироваться
Третий день пользуюсь клавиатурой NuPhy Air75. Отличная беспроводная механика с низким профилем. Мне понравилось то, как она сделана и, как и большинство пользователей этой клавиатуры, восхищаюсь тем, как она выглядит. Только почему-то у разработчиков данной клавиатуры пристрастие к рисованным аниме-девочкам, поэтому с клавиатурой в комплекте идут наклейки и постер с рисованной девочкой. Ну и коробка оформлена соответствующе. Выглядит это все абсолютно нелепо и по-дешевому, но, слава богам, на самой клавиатуре и капсах ничего такого и нет. Этого поста бы не было, если бы на клавиатуре не  присутствовал переключатель win-mac и из всех углов не заявлялась поддержка MacOS из коробки. Так вот - это все правда, но жить с такой поддержкой на маке категорически нельзя.

Во-первых, слева от кнопки со стрелками расположен CTRL. В обычной клавиатуре от Apple это место занимает кнопка Option, нажимая которую со стрелками, ты можешь перемещаться в тексте между словами, а в случае с ctrl - у тебя меняются на экране приложения развернутые на полный экран. Такая подмена сильно раздражает. И все бы ничего, если бы клавиши можно было удобно переназначать, но тут появляется на горизонте вторая проблема. Выяснилось, что NuPhy не поддерживается проектом QMK. Но зато, можно скачать с сайта производителя клавиатуры утилиту NuPhy Console, для конфигурации клавиатуры и ремапинга клавиш. Доступна одна лишь версия утилиты (0.1) с не вкушающей пометкой толи альфа, толи бета. Утилита, в лучших традициях такого софта, доступна только под Windows. Конфигурация клавиш, вне зависимости от ползунка win-mac происходит тоже только для win-режима. Поэтому, чтоб на жить с этой клавиатурой комфортно на маке мне пришлось найти ПК с Windows и настроить клавиатуру (сама настройка предельно элементарна). Утилита меняет настройки клавиатуры всегда для режима win, и можно оставив клавиатуру подключенной по Bluetooth к маку, а проводом к Windows и, изменять настройки и сразу проверять поведение в MacOS. После этих не самых хитрых манипуляций оставляем ползунок режима в состоянии win и получаем удовольствие от использования клавиатуры на маке!

Пост написан не на правах рекламы, а клавиатуру я купил за фулпрайс в небезызвестном GeekBoards. Забавная приятная мелочь №1 - клавиатура приехала с заводской кириллицей на капсах. Досадное - у них нет в наличии бомбических чехлов от NuPhy под наванием NuFolio.

Забавная приятная мелочь №2: у меня есть промокод GEEKCLICK на брелочек от GeekBoards в подарок.
👍6😱1
NuPhy Air 75
👍8🔥4🥴2🤔1
Как и в других странах, в России наблюдается достаточно высокий спрос на ИТ-специалистов на рынке труда. Как правило, компаниям наиболее интересны соискатели уже с опытом работы над каким-либо коммерческим продуктом. И на старте своей ИТ карьеры достаточно трудно без каких-либо трудовых "ачивок" устроиться в стабильную компанию, в которой можно получить хороший опыт работы над продуктом. А что еще ценнее - над действительно хорошим и восстребованным продуктом. В последнее время все шире получает распространение практика проведения большими компаниями стажировок для начинающих специалистов. Так, например, на этой неделе Яндекс провел День стажера Young&&Yandex – лекции, знакомства с менеджерами, настолки, вечернее пати. По статистике компании более половины стажеров получают оффер. Мне кажется, что это круто и даже очень жаль, что такого не было во времена моего студенчества и старта работы в ИТ. В общем, если вам хочется в большое плавание в большом ИТ, то стажировка может дать вам отличный шанс.
👍10😁2🔥1
Forwarded from Skolkovo LIVE
😱 Переживаете, что скоро останемся без ноутбуков, телефонов и серверов? Без паники! Сделали краткий ликбез по российским процессорам.

На наши вопросы ответил Павел Кривозубов, руководитель направления «Робототехника и искусственный интеллект» ИТ-кластера «Сколково».

⚙️ Кто делает процессоры в России?

Производителей процессоров в стране не так много. Самые крупные — Baikal Electronics (линейка Baikal) и МЦСТ (линейка Эльбрус). Есть ряд других компаний, которые производят специализированные процессоры — например, чипы для радиотехники.

⚙️ А покупает их кто?

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

⚙️ Процессоры выпускают в России или на зарубежных фабриках?

Производство отечественных процессоров — таких как Baikal или Эльбрус — было на известной фабрике TSMC в Тайване. Она производит действительно большой объем процессоров по всему миру, но сейчас перестала работать с нашими компаниями.

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

⚙️ А почему стартап не может начать производить процессоры?

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

⚙️ Могут ли в России появиться свои производители процессоров, не уступающих западным аналогам?

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

#ЭкспертыФонда
😁21👍6🥴4👎1😱1🤣1🍌1
Как мигрировать в российское облако, не останавливая критичные сервисы? Об этом поговорим на вебинаре!

Когда: 20 сентября, 17:00 (мск)
📍 Регистрация

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

О чем поговорим на вебинаре:
🔹 Как реализуются функции Live Cloud Migration, Disaster Recovery и Cloud Backup на платформе VK Cloud.
🔹 Как создать консистентную копию критических компонентов вашей инфраструктуры.
🔹 Как повысить безопасность инженерной ИТ-инфраструктуры при миграции.
🔹 Как перевести критические системы на ресурсы нового облачного провайдера без даунтайма и создать резервную площадку в облаке.

Спикеры:
🔹 Тимур Явкин, архитектор облачных решений, VK Cloud
🔹 Сергей Самоукин, руководитель коммерческой группы, VK Cloud
👍5😁1🥴1
This media is not supported in your browser
VIEW IN TELEGRAM
Рекомендация для просмотра: Deep Mind подробно рассказывают, как ИИ используют для ускорения научных открытий. Спикером выступает Демис Хассабис, соучредитель и генеральный директор DeepMind.
Видео, как и многая другая современная и полезная информация о технологиях и разработке, на английском. Чтобы было проще смотреть, включите закадровый перевод видео в Яндекс Браузере. Если у вас его нет, установить на смартфон можно по ссылке.
😢31👍1🔥1
Фанаты сделали мод к Half-Life 2, добавляющий поддержку шлемов виртуальной реальности. Разработку они анонсировали ещё в 2017 году (за два года до анонса Half-Life Alyx) - тогда уже всё выглядело хорошо и красиво, но команда была маленькой и они быстро застопорились в развитии проекта - его получилось возродить только когда в прошлом году подключились новые энтузиасты. Теперь же появился доступ к публичной бете - там могут быть баги, но заявляется, что уже сейчас мод позволяет полностью пройти оригинальную игру со всем, что в ней было изначально.

В будущем нам обещана поддержка обоих дополнительных эпизодов Half-Life, доделка взаимодействия рук с оружием и его анимации, улучшение перемещения игрока и обновление графики (многим текстурам и объектам уже больше 18 лет). Но всё это, как мне кажется, мелочи - главное уже сейчас мод есть и совершенно бесплатен, и я не понимаю, что ещё нужно писать - надо срываться и бежать в него поскорее играть! https://www.engadget.com/half-life-2-vr-mod-now-available-184142626.html
👍92
Давно не слышал о dbm, но случайно увидел упоминание о нем в Твиттере. Если кратко, то это некий формат хранения “ключ-значение” данных, в котором и ключ и значение представляют из себя строки. Эдакий словарик состояние которого хранится на диске в файле т.е. это предельно простая для использования база данных. Вы только задумайтесь - формат разработан в 1979 году! Можно сказать, что dbm, в каком-то смысле является очень далеким предком, и даже некоторой предтечей появившихся позже nosql решений.

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

К слову, в питоне вся работа с dbm объектом в python происходит как с обычным словарем - ты запрашиваешь данные, указывая в ключ строку, а возвращается всегда байтовая последовательность:

import dbm

with dbm.open('my_store', 'c') as db:
db['key'] = 'value'
print(db.keys()) # ['key']
print(db['key']) # 'value'
print('key' in db) # True


Ну и, что вполне ожидаемо, работа с dbm проходит достаточно быстро.

https://remusao.github.io/posts/python-dbm-module.html
👍7
Занятное интервью о том, как и почему в Volvo используется язык программирования Rust. Статья на английском (переводов пока не встречал).

https://medium.com/volvo-cars-engineering/why-volvo-thinks-you-should-have-rust-in-your-car-4320bd639e09
🔥1
14 сентября вышла стабильная версия 2.0 среды разработки для отладочных платок Arduino. Все стало удобнее, симпатичнее, с темной темой и с интеграциями с облачными сервисами от самой Arduino.

https://blog.arduino.cc/2022/09/14/its-here-please-welcome-arduino-ide-2-0/
👍8