Как стать автором
Поиск
Написать публикацию
Обновить

Разработка

Сначала показывать
Порог рейтинга

Приглашаем на второй Cloud․ru Tech Lab: DevOps — митап для DevOps- и SRE-инженеров 🎙️

📅 Дата: 22 мая в 18:00
📍 Место: Москва, Goelro Loft, Большая Почтовая улица, 40с4

Мы продолжаем серию технических митапов Cloud․ru Tech Lab — в этот раз обсудим сложности DevOps-процессов и разберем DevOps-практики на реальных кейсах.

Темы докладов:

  • ClusterAPI как цель, Terraform как мост: управляем жизненным циклом платформы — Олег Одинцов, Старший инженер платформы App.Farm, РСХБ-Интех.

  • Автомасштабирование K8s в ноль: от базы до хардкора — Илья Смирнов, Архитектор решений, Cloud․ru.

  • Calico CNI: жизнь после запуска — Александр Качмашев, Инженер, Точка.

  • Как организовать сетевую связность Bare C kubernetes — Антон Паус, DevOps-инженер, Cloud․ru.

Также в программе afterparty c нетворкингом, легкими напитками и закусками.

Мы предусмотрели два формата участия:

  • офлайн — для тех, кто планирует лично посетить площадку,

  • онлайн — для тех, кто хочет посмотреть доклады в записи.

Зарегистрироваться на митап 👈

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

🗯️ Про метрики на отдельном порту.

Далее про то как сделать выделенный порт и http-пулл для promitheus-метрик, так вот докладываю👇

Мы используем embedded tomcat как и великое множество других Java-проектов(остальным сил и терпения), по этому этот пост применительно к нему.

📍Для создания выделенного порта достаточно создать отдельный коннектор спринговой java-конфигурацией и проинициализировать его через TomcatServletWebServerFactory.

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

P.S. Не хочу быть злом по этому в комменты в свою телегу выложу класс в текстовом варианте😁

Теги:
Всего голосов 3: ↑1 и ↓2+1
Комментарии2

Опасности Apache POI 📍

Наверняка многие из вас юзают Apache POI. Для тех, кто не знает: это джаванская либа для работы с файлами Microsoft Office и OOXML — всякие Excel, Word и прочее.

А в чём опасность?

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

Включается это так:
// Отслеживаем ширину для автосайзинга
sheet.trackAllColumnsForAutoSizing();
// ... генерируем строки Excel-файла
// Автосайзим столбцы
sheet.autoSizeColumn(columnIndex);

Проблема: эта тема крайне ресурсоёмкая на больших объёмах данных. На тесте с 100 строками — всё быстро. На проде с 600К строк — 20 минут превращаются в 4 часа. 4 часа, Карл! Чего оно там делает вообще?!)

У нас такое не раз уезжало в прод и штука эта совсем неприятная я вам скажу:

  • Отчёт не собирается вовремя;

  • Заказчик негодует;

  • Паника, крики — в общем, ну его этот трекинг! 😅

Что делать?

В 99% случаев: достаточно автосайзинга только для заголовков:

// Включаем автосайзинг
sheet.trackAllColumnsForAutoSizing();
// Генерируем заголовки
//...
// Автосайзим колонки
sheet.autoSizeColumn(columnIndex);
// Выключаем трекинг
sheet.untrackAllColumnsForAutoSizing();
//... продолжаем генерацию

В 1% случаев: нужно отавтосайзить 1-2 столбца из сотен. Тогда делаем точечный трекинг:

// Трекинг только нужных колонок
sheet.trackColumnForAutoSizing(columnIndex);
// ... генерация данных
// Автосайзим
sheet.autoSizeColumn(columnIndex);

Ну и можно конечно вручную задавать ширину столбцов, но это не всегда удобно.

P.S. Метод autoSizeColumn() очень тяжёлый. Выдержка из джавадоки:

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

P.S.S. Еще кстати поя умеют не буферизовать весь excel’ник в память при генерации, надеюсь вы все этим пользуетесь ибо обратное дико некармическая тема)) Знаете ж как?

Приходите к телегу, там обсуждаем наши кровавые энтерпрайзы: https://t.me/umenyarabotaet

Теги:
Всего голосов 3: ↑2 и ↓1+2
Комментарии5

Что такое «совершенные» и «избыточные» числа? Рассказывают эксперты ИТ-компании «Криптонит».

Наверняка вы знакомы с понятием «делители числа». Например, у шестёрки кроме неё самой есть три делителя: 1, 2, и 3. Если сложить их, получится ровно шесть (1+2+3=6). Числа, у которых сумма делителей, не считая самого числа, равна самому числу, называются совершенными.

Если же сумма делителей оказывается больше самого числа, то такие числа называются избыточными. Самое малое избыточное число: 12. У него много делителей: 1, 2, 3, 4, 6. Если их сложить, получится 16, а 16 > 12.

Понятия совершенных и избыточных чисел возникли ещё в Древней Греции. Их описали пифагорейцы, заложившие основы учения о свойствах чисел и их классификации.

Какие же свойства есть у избыточных чисел?

  • 12 — наименьшее избыточное число. Проверьте сами!

  • все числа, кратные избыточному числу, также являются избыточными. Раз 12 – избыточное число, значит 24, 36, 48 и т.д. тоже будут избыточными;

  • существуют как чётные, так и нечётные избыточные числа;

  • наименьшее нечётное избыточное число – 945. Сможете ли назвать все его делители?

У совершенных чисел свойства другие:

  • все известные совершенные числа чётные;

  • возможность существования нечётных совершенных чисел не доказана и не опровергнута;

  • сумма обратных величин всех делителей совершенного числа, включая само число, всегда равна двум. Пример для обратных делителей числа 6: 1/1 + 1/2 + 1/3 + 1/6 = 2;

  • все известные совершенные числа заканчиваются на 6 или 8 (6, 28, 496 и т.д.);

  • совершенные числа используются для вычисления простых чисел Мерсенна.

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

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

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Как тестировать фронтенд?

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

  • Без unit-тестов и автоматических e2e-тестов ручное тестирование занимает много времени. К тому же человек, скорее всего, при регрессионном тестировании что-то пропустит, и баги попадут в production. Особенно это актуально для больших проектов с большой кодовой базой.

  • Без автоматических тестов страшно рефакторить код. А если нет выстроенной архитектуры с соблюдением low coupling/high cohesion, то этот страх вполне оправдан. А без регулярного пересмотра кода приложение рано или поздно превратится в большой комок грязи.

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

  • Тесты - это дополнительная документация к коду. Причём такую документацию не получится держать в неактуальном состоянии, иначе упавшие тесты не пропустят код в production при наличии настроенного шлюза проверки качества в CI/CD пайплайне.

Это всё прекрасно и, как показывает практика, работает, как ожидается, но остаются вопросы.

  • Как тестировать уровень представления приложения? Например, в случае с каким-нибудь фреймворком с использованием React это будут React-компоненты, виджеты, представляющие отдельные элементы пользовательского интерфейса. Тестировать там, по сути, нужно функцию. Передали ряд аргументов (пропсов или состояний) - получили одно представление. Передали другие аргументы - другое. Зависимость результата от набора аргументов - однозначная. Чтобы это проверить, можно использовать тесты со скриншотами. Я предпочитаю snapshot-тесты, они дают больше контроля, но работают довольно медленно и могут быть хрупкими, если недостаточно грамотно отделять слой представления от логики.

  • А что со временем написания кода вместе с тестами? Будем ли мы вовремя успевать сдавать новые модули и радовать наших пользователей и руководство? Я думаю, что это не совсем правильные вопросы. Спрашивать надо о том, сколько будут стоить ошибки, попавшие на production из-за отсутствия тестов? Если ваше приложение - landing page с минимумом логики, то вряд ли цена ошибки будет высока. В небольшой кодовой базе её будет легко локализовать и исправить. А если вы работаете с финансами и у вас миллионы пользователей? В этом случае цена ошибки на production будет намного выше.

  • Как донести необходимость тестов до команды и правильно включить автоматизацию тестирования в процесс разработки? Это на самом деле серьёзный вопрос. Не все разработчики понимают, зачем вообще тесты на фронтенде и обоснование их необходимости может вылиться в не слишком продуктивный холивар. А если продавливать такое решение сверху, то без понимания и принятия командой этого решения будут попытки обойти систему и снижение мотивации. Мне когда-то в подобной ситуации помогла практика парного программирования и выстраивание инженерной культуры в команде (совместное чтение технической литературы, архитектурные встречи с использованием white board).

А какие практики для тестирования применяете вы?

Теги:
Рейтинг0
Комментарии0

В 2ГИС мы пишем на Go и помогаем инженерам перейти на него с других языков. Знакомство с Go открывает возможность контрибьютить в одну из самых востребованных технологий современности. На Go написаны проекты, без которых сложно представить мир распределённых систем: K8s, CockroachDB, Badger, Prometheus, VictoriaMetrics, Jaeger, NATS, Temporal. 

Переход на Go — реальность! В карточках рассказываем, как это получилось у Саши

Хочешь так же? Прямо сейчас ищем ребят с Java и C#.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии8

Android-приложение «Контакты»: работает — не трогай

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

Чтобы заменить стандартные типы полей, нужно добавить новую базу данных с доступными типами полей, а также реализовать отображение и возможность выбора поля. Для этого пришлось во многом переписать код редактирования полей контакта, где и без этого логика была непростой. Теперь стало совсем сложно: при добавлении или обновлении поля в contentProvider нужно указывать тип поля, так что мы начали указывать «custom».

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

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

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

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

Дмитрий Бражник, старший инженер-программист в департаменте разработки мобильных приложений YADRO, рассказал в статье, как его команда пыталась допилить стандартное AOSP-приложение «Контакты» и к чему они в итоге пришли.

Теги:
Всего голосов 3: ↑2 и ↓1+2
Комментарии0

Почему учёным не вручают Нобелевскую премию по математике и информатике

7 октября 2024 года были объявлены нобелевские лауреаты по физике. Ими стали крупные специалисты в области искусственного интеллекта Джон Хопфилд и Джеффри Хинтон. Премия им присвоена «За фундаментальные открытия и изобретения, обеспечивающие машинное обучение с помощью искусственных нейронных сетей».

Исторически так сложилось, что за открытия в информатике и математике не присваивают Нобелевских премий, но иногда математики получают эту высокую награду по другим наукам. Например, Леонид Канторович стал обладателем Нобелевской премии по экономике в 1975 году за вклад в развитие линейного программирования, а Джон Нэш – за свои работы по теории игр в 1994 году.

Так случилось и в этом году, и Нобелевскими лауреатами стали два учёных – специалиста в области искусственного интеллекта. Почему премия дана именно по физике? Этот вопрос мы задали директору Института информационных технологий, математики и механики ННГУ Николаю Золотых.

«Хопфилд разработал ассоциативную нейронную сеть, умеющую запоминать паттерны и далее находить их в новых образах. В своих разработках он использовал методы из физики: нахождение паттерна заключается в минимизации спиновой энергии. Развивая эти идеи, Хинтон построил так называемую машину Больцмана, которая ещё лучше решает эти и подобные задачи. Хинтон сделал очень много для развития искусственного интеллекта, в частности. Он по праву считается одним из отцов глубокого обучения. И его открытия в машинном обучении тесно связаны с теми или иными разделами физики», – рассказал Николай Юрьевич.

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

«Говорят, что вначале математика была в списке наук, по которой должны были выдаваться премии. Однако потом сам Нобель её вычеркнул. Достоверной причины не известно. Возможно, он хотел видеть в списке наук только те, открытия в которых имеют большое значение для практики. Сейчас, в 21 веке, мы думаем, что ни у одного учёного нет и доли сомнения, что математика – обильна всевозможными приложениями и её открытия – мощный двигатель прогресса!».

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

Например, в Университете Лобачевского ведутся исследования в области искусственного интеллекта как в направлении разработок инструментария для решения практических задач из различных областей – медицины, промышленности, сельском хозяйстве, так и фундаментальные исследования. Новые методы и алгоритмы доверенного искусственного интеллекта с приложениями в медицине разрабатывает Центр исследований в сфере искусственного интеллекта, созданный в 2023 году под руководством Николая Золотых.

В научно-образовательном центре «Физика твёрдотельных наноструктур», директором которого выступает Алексей Михайлов, и в НИИ нейронаук под руководством директора Сусанны Гордлеевой активно ведутся исследования в области нейроморфного искусственного интеллекта и разработка новой – мемристорной – элементной базы для систем искусственного интеллекта будущего. Такие системы должны решить актуальную проблему огромного энергопотребления современных больших нейронных сетей. И об этом мы расскажем уже совсем скоро.

Автор: Светлана Таирова

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Собеседование инженера: взгляд со стороны нанимающих специалистов

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

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

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

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

Теги:
Всего голосов 6: ↑6 и ↓0+7
Комментарии0

Охота на Google

Антимонопольный иск к Alphabet (материнская структура Google) назначен на 2 мая. Министерство юстиции США обвиняет компанию в монополизации рынков поиска и интернет-рекламы. Как это может закончиться?

Если Google не удастся отделаться штрафом, она может быть принуждена продать какие-то из своих подразделений. В первую очередь речь идёт о браузере Google Chrome. И покупатели уже на низком старте.

Отметим, что в США нечасто дробят технологических гигантов. Последний известный случай – разделение телеком-компании AT&T в 1995 году. Чаще обходится штрафами, и рынок сам выправляет ситуацию. Например, в 2000-х годах компания Microsoft считалась монополистом на рынке операционных систем и офисных программ. Но смогла отбиться от обвинений в монополии. А сейчас iOS и Android приносят владельцам ОС больше денег, чем Windows.

Уже во времена обвинений Microsoft стало ясно, что браузер – важный инструмент доступа к пользователю. Большинство применяют ту поисковую систему, которая установлена по умолчанию. Google с браузером Chrome выиграла рынок настольных браузеров, а потом ещё и заняла ¾ мобильного рынка со своей операционкой Android. В которой, естественно, по умолчанию для поиска использовался поисковик Google. Вдобавок Google заключала эксклюзивные договоры с Apple, Samsung и другими производителями, чтобы её поисковик использовался по умолчанию. При запросах пользователя Google отдаёт приоритет своим сервисам и показывает контекстную рекламу, которая до сих пор даёт компании основной доход: 73% выручки в первом квартале 2025 года Alphabet получила от направлений поиска и рекламы Google.

Неудивительно, что отвечающее за Google Chrome направление готовы купить конкуренты. Только не все могут это сделать – Apple, Amazon и Meta (признана в России экстремистской организацией и запрещена) сами попали под антимонопольное расследование. Поэтому первым о готовности купить браузер Google заявила компания OpenAI, известная созданием ChatGPT. Её ИИ-чат и ранее называли конкурентом поисковику Google, а купив популярный браузер, она сможет более активно общаться с пользователями. Учитывая, что OpenAI 31 марта получила рекордные инвестиции в 40 млрд долл., деньги на покупку браузерного подразделения у неё есть.

Остаётся интрига, решится ли американская фемида вмешаться в бизнес одной из крупнейших компаний страны или юристам поисковика удастся свести дело к штрафам?

Теги:
Всего голосов 12: ↑12 и ↓0+21
Комментарии1

Cloud.ru Evolution Stack AI-bundle — разрабатываем первое в России гибридное облако с поддержкой искусственного интеллекта 🦾

❓ Что за инструмент? Cloud.ru Evolution Stack AI-bundle — это будущая конфигурация модульной облачной платформы для создания частных, гибридных или распределенных облаков на базе on-premise IT-инфраструктуры, которая позволит быстро и безопасно разрабатывать AI-продукты.

🖥 Особенности и преимущества. Cloud.ru Evolution Stack AI-bundle будет базироваться на наших собственных разработках и open source компонентах. Благодаря этому вы сможете реализовывать гибридные сценарии: например, обучать модели в публичном облаке, а инференс выполнять в частном контуре, либо переносить процесс в публичное облако в периоды высокой нагрузки.

Отказоустойчивость и безопасность облачной платформы будут достигнуты технологией высокой доступности (HA), планировщиком распределенных ресурсов (DRS) и трехкратным резервированием. А еще инфраструктура технологического стека будет размещена в дата-центрах уровня Tier III, где персональные данные хранятся по 152-ФЗ и пройдена аттестация УЗ-1.

👨‍💻 Кому будет полезно:

  1. Крупному бизнесу.

  2. Федеральным и региональным органам власти, компаниям госсектора, операторам КИИ и ЗОКИИ.

  3. Внутренним и внешним провайдерам, которые предоставляют IT-сервисы. 

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

✍️ Где, как и для чего использовать. Платформа подойдет для end-to-end ML-разработки, локального развертывания, кастомизации и дальнейшего масштабирования моделей. Например, вы сможете использовать:

Чтобы узнать больше о возможностях платформы Cloud.ru Evolution Stack и выходе новой конфигурации, смотрите доклад с конференции GoCloud 2025 — запись скоро будет на сайте.

Теги:
Рейтинг0
Комментарии0

PEP 750: t-строки в 3.14

Недавно ревьюил один интересный PR в CPython: в питон добавили еще один способ форматировать строки. Теперь – со специальным АПИ для внешних интеграций. Расскажу: как и зачем.

Основная причина: использовать f строки удобно, но нет никакого АПИ для перехвата момента "вставки" или интерполяции значений. Например, при форматировании html или sql – требуется специальным образом делать escape для значений. И раньше код вида f"{template}" представлял собой дыру в безопасности и потенциальное место для XSS.

string.templatelib.Template

Новый префикс t не будет создавать объект str, он будет создавать объект класса string.templatelib.Template:

>>> user = 'sobolevn'
>>> template = t"Hi, {user}"
>>> template
Template(strings=('Hi, ', ''), interpolations=(Interpolation('sobolevn', 'user', None, ''),))

>>> from string.templatelib import Template
>>> isinstance(template, Template)
True

Обратите внимание, что при создании template – у нас не произошло форматирование сразу. Мы создали объект, у которого есть свойства strings и interpolations, из которых можно собрать финальную отформатированную строку.

Давайте посмотрим на примере. Допустим, мы хотим формировать URL из наших данных:

>>> domain = 'example.com'
>>> query = 'python string formatting is too complex'
>>> template = t'https://{domain}?q={query}'

И сам код логики форматирования, где мы будем вставлять значения разным способом. Если у нас шаблон query, то мы будем использовать quote_plus для его форматирования. Остальные значения – будем вставлять как есть:

>>> from string.templatelib import Template, Interpolation
>>> from urllib.parse import quote_plus

>>> def format_url(template: Template) -> str:
...     parts = []
...     for part in template:
...         match part:
...             case str() as s:  # regular string
...                 parts.append(s)
...             case Interpolation(value, expression='query'):
...                 parts.append(quote_plus(value))
...             case Interpolation(value):
...                 parts.append(value)
...     return ''.join(parts)

И вот результат:

>>> format_url(template)
'https://example.com?q=python+string+formatting+is+too+complex'

Только теперь наш Template был отформатирован. Нами. Ручками.
У нас есть полный контроль за процессом форматирования. Вот в чем суть данного ПЕПа.

Фичи одной строкой

  • Работает = как обычно в f строках: t'{user=}'

  • Есть привычные определители формата: !r, !s, .2f, тд

  • t строки можно конкатенировать: t'Hello' + t' , world!' и t'Hello, ' + 'world'

  • Поддерживается режим raw строк: rt"Hi \n!"

Как устроено внутри?

Интересные места имплементации:

>>> import dis
>>> user = 'sobolevn'
>>> dis.dis('t"Hi, {user}"')
  0           RESUME                   0

  1           LOAD_CONST               2 (('Hi, ', ''))
              LOAD_NAME                0 (user)
              LOAD_CONST               1 ('user')
              BUILD_INTERPOLATION      2
              BUILD_TUPLE              1
              BUILD_TEMPLATE
              RETURN_VALUE

Обсуждение: как вам еще один способ форматирования строк?

Если понравилось – заходи в тг, где я рассказываю, как я делаю CPython.

Теги:
Всего голосов 10: ↑10 и ↓0+13
Комментарии7

Ищу запчасти линейного актуатора подъемной ноги от офисного стола SteelCase Migration SE

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

На фото, раскуроченный двигатель и плата контроллера, внутри подъемной колонны.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Ближайшие события

Для себя я определил архитектуру так:

Архитектура программной системы - это набор ограничений, которые формируют и направляют реализацию системы в сторону максимизации её ценности

Архитектура - это набор ограничений
Архитектура - это набор ограничений
  • Это набор ограничений: архитектура задаёт рамки/правила по которым должна строиться система

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

  • Архитектура максимизирует ценность: ограничения поставлены так, чтобы вписываясь в них система принесла больше ценности. Именно архитектура определяет: какими паттернами реализовывать бизнес-логику, как связываться со сторонними сервисами, из каких категорий будет состоять программный код

И я придумал для этого метафору. Представьте, что мы строим дом. Тогда:

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

Системный дизайнер:
Он как дизайнер интерьеров. Определяет назначение каждой комнаты, учитывая уже наложенные архитектурные ограничения. Где будет гостиная, где спальня, где рабочий кабинет и т.п. И расставляет мебель (структурные ограничения), руководствуясь назначением каждой комнаты (поведенческие ограничения). И всё это так, чтобы живущим в квартире людям было удобно.

Программист:
Это рабочий, который по чертежам дизайнера положит паркет, подключит фурнитуру и соберёт мебель.

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

  • Системный архитектор - senior (опытный программист, способный спроектировать кластер контейнеров)

  • Системный дизайнер - middle (программист, способный спроектировать один контейнер)

  • Программист - junior (любой программист, способный работать внутри контейнера по готовым ограничениям)

Теги:
Всего голосов 4: ↑3 и ↓1+2
Комментарии0

Работаем в лоб: Прямое редактирование XML форм Joomla

Используя событие onContentPrepareForm можно изменять почти любую форму Joomla, но методов класса Joomla\CMS\Form\Form обычно не хватает для работы со сложными формами (например с полями типа subform).

Но есть простое решение - работать с формой как c экземпляром SimpleXMLElement.

Получаем XML формы.

echo $form->getXml()->asXMl();
die;

Отправляем его в ChatGPT с описанием что и как надо изменить в форме, и просим написать PHP-код.

Например у меня такая форма:

<?xml version="1.0"?>
<form>
	<config>
		<fieldset label="PLG_CONTENT_WISHBOXRADICALMARTCDEKORDERREGISTRATOR_FIELDSET_LABEL" name="wishboxradicalmartcdekorderregistrator"
                  addfieldprefix="Joomla\Component\Wishboxradicalmartcdek\Administrator\Field">
			<field name="wishboxradicalmartcdekorderregistrator" type="subform"
                   label="PLG_CONTENT_WISHBOXRADICALMARTCDEKORDERREGISTRATOR_FIELD_REGISTRATOR_LABEL"
                   buttons="add,remove,move"
                   multiple="false"
                   hiddenLabel="true">
				<form>
					<fieldset>
						<field name="order_number_prefix" type="text"
                               label="COM_WISHBOXRADICALMARTCDEK_FIELD_ORDER_NUMBER_PREFIX_LABEL"
                               default="test_" />
					</fieldset>
				</form>
			</field>
		</fieldset>
	</config>
</form>

И для изменения атрибута default поля order_number_prefix получаем следующий код:

$fields = $xml->xpath('//field[@name="wishboxradicalmartcdekorderregistrator"]/form/fieldset/field[@name="order_number_prefix"]');

$fields[0]['default'] = 'Test ';

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

Теги:
Рейтинг0
Комментарии0

Я доделал компилятор C на Python.

Баги всё ещё есть но их намного меньше

Его я назвал pycc.

Если хотите попробовать, вот гитхаб: https://github.com/SystemSoftware2/pycc

Всё остальное смотрите там.

[UPD]: А за что минусуете?

Теги:
Всего голосов 7: ↑6 и ↓1+6
Комментарии2

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

Основные фичи:

  • помимо шаблонизации файлов умеет шаблонизировать входной поток (stdin), используя переменные среды и результат выводить в выходной поток (stdout). Также как это делает envsubst

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

  • написана на C++ и собрана в статический бинарник x86 размером 350КБ без каких-либо дополнительных зависимостей, что позволяет её включать прямо в репозиторий и использовать в пайплайнах

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

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

Несколько примеров использования:

Простая подстановка переменной среды:

echo "Hello, {{ USER }}!" | muenvsubst

Шаблонизируем файл:

muenvsubst -i ./config.yml.j2 -o ./config.yml -d ./includes/

Использование переменных в шаблоне:

muenvsubst <<EOF
{%- set username = upper(USER) -%}
Hello, {{ username }}!
EOF

Использование флагов и условий:

USE_GREETER=yes muenvsubst << EOF
## if default(USE_GREETER, null) | toBool
Hello, {{ USER }}!
## else
Bye, {{ USER }}!
## endif
EOF

Использование циклов и разделение строки в список по символу:

USERS="John,Mark,Peter" muenvsubst << EOF
{%- for user in split(USERS,",") -%}
Hello, {{ user }}!
{%- endfor -%}
EOF

Использование инклюдов:

muenvsubst << EOF
## set USER="John"
## include "greeter.j2"
EOF

Файл инклюда greeter.j2:

Hello, {{ USER }}!
Теги:
Всего голосов 4: ↑4 и ↓0+6
Комментарии3

МойОфис Экосистема: мы собрали офисные инструменты в единую рабочую среду

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

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

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

Мы разделили наши продукты на 4 семейства и изменили их названия. Теперь это настольные документы («Документы Настольные»), чат и видеозвонки («Сквадус»), веб-документы («Документы Онлайн») и почта для организаций («МойОфис Почта» и «Мейлион»). Для упрощения навигации мы также обновили и названия приложений. Теперь текстовый редактор называется «МойТекст», табличный редактор — «МоиТаблицы» и так далее. Это позволяет легко идентифицировать все компоненты экосистемы по единому стилю наименований.

Читайте подробнее об Экосистеме МойОфис здесь.

Теги:
Всего голосов 25: ↑25 и ↓0+27
Комментарии2

Как автоматизировать распознавание текста с изображений?

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

Раньше в моём арсенале был только pytesseract (Python-библиотека для распознавания текста). Она работала, но с серьёзными ограничениями:
➖Плохо справлялась с разными шрифтами
➖Теряла точность на низкокачественных изображениях
➖Путала языки, если текст был мультиязычным

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

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

Обзор моделей для OCR
Прошерстив не один десяток источников, я выделил две наиболее популярные на текущий момент модели:
1️⃣ GPT-4 mini — высокая точность, но платная.
2️⃣ Google Gemini 2.0 Flash — высокая точность + бесплатный лимит.

Выбор без раздумий пал на Gemini. На момент публикации бесплатные лимиты от Google следующие:
✔️ 15 запросов в минуту
✔️ 1 млн токенов в минуту (ввод + вывод)
✔️ 1 500 запросов в сутки

Как взаимодействовать с Gemini?
1️⃣ Получаем API-ключ в Google AI Studio
2️⃣ Через API отправляем изображение в base64 + промпт
3️⃣ Получаем распознанный текст в ответе

Но есть важный нюанс: сервис не работает с российскими IP

Что делать, если Gemini недоступна?
Если у вас по какой-то причине нет возможности получить доступ к серверам Google AI Studio, то можно воспользоваться сервисами, которые предоставляют доступ к различным open-source моделям. Например, DeepInfra.
Плюсы:
✔️ Нет блокировок по геолокации
✔️ Гибкая тарификация
Минусы:
✖️ Нет бесплатного тарифа

Примеры скриптов выложил на github (https://github.com/vmtest439/britalb_ocr)

Если вам понравился пост и вы хотите читать больше подобного контента, то можете подписаться на мой авторский Telegram-канал BritLab!

Теги:
Всего голосов 4: ↑2 и ↓20
Комментарии3

Microsoft признала, что задействовала ИИ в рекламе Surface Pro и Surface Laptop для создания кадров в которых было мало движения. В ролике специально сделана быстрая смена кадров, чтобы зрители не успевали всматриваться в детали.

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

Для создания видео специалисты из Microsoft сначала сгенерировали изображения при помощи текстовых подсказок и визуальных референсов. Затем полученные картинки были загружены в видеогенераторы Hailuo и Kling. Какие именно генераторы использовались для создания изображений, в компании не уточнили.

Теги:
Рейтинг0
Комментарии4