diff --git a/package.json b/package.json index 18c7eec..dd8d462 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "i18n:generate": "npm run format && node --loader ts-node/esm/transpile-only --no-warnings tools/translateContent.ts en && npm run format && node --loader ts-node/esm/transpile-only --no-warnings tools/translateContent.ts && npm run format" }, "lint-staged": { - "*.{js,cjs,mjs,ts,mdx,astro}": [ + "*.{js,cjs,mjs,ts,astro}": [ "eslint .", "astro check", "astro lint" @@ -59,4 +59,4 @@ "ts-node": "^10.9.2" }, "packageManager": "npm@10.2.5" -} +} \ No newline at end of file diff --git a/src/content/posts/ru/ades-wii-x360.mdx b/src/content/posts/ru/ades-wii-x360.mdx new file mode 100644 index 0000000..727d2f4 --- /dev/null +++ b/src/content/posts/ru/ades-wii-x360.mdx @@ -0,0 +1,160 @@ +--- +title: Я взломал сотни игровых консолей благодаря соку +ogOverride: Игровых консолей благодаря соку - я взломал сотни +description: Чем я занимался вместо вечеринок, когда был молод +pubDate: 2022-08-23T23:13:00Z +img: ~/assets/images/project-ades-wii-x360.png +imgAlt: Композиция Билла Гейтса, играющего в Guitar Hero в Мордоре после того, как его победил сок AdeS +translatedBy: gpt-4-1106-preview +checksum: fc24ef4e7a229ef942a8e6354fb03a773e1387e6bea654249883badf276bcc46 +--- + +import Puzzle from '~/assets/images/puzzle.png'; +import PuzzleNumbered from '~/assets/images/puzzle-numbered.png'; +import X360PowerSupply from '~/assets/images/x360-dvd-power-supply.jpg'; +import X360Linux from '~/assets/images/x360-linux.jpg'; +import KamikazeLocation from '~/assets/images/kamikaze-location.jpg'; +import WinbondExploitLines from '~/assets/images/winbond-exploit-lines.jpg'; +import XboxRRoD from '~/assets/images/xbox-rrod.jpg'; +import { Image } from 'astro:assets'; +import { YouTube } from '@astro-community/astro-embed-youtube'; + +В 2010 году AdeS (аргентинский бренд соков, позже приобретенный компанией Coca-Cola в 2016 году) провел конкурс в Facebook. +Это была игра-головоломка 4x4, в которой можно было выиграть Nintendo Wii. Условия для выигрыша приза были следующими: + +- Сделать это за минимально возможное время, и +- Сделать это за минимальное количество ходов + +Я бы не сказал, что я особенно хорош в головоломках 4x4, но это казалось хорошим вызовом для работы. + +Первые несколько секунд игры показывали решение (полностью сформированное изображение), а затем оно перемешивалось. + +У меня нет оригинального изображения, но вот стоковое фото для справки: + +две головоломки рядом, решение слева и перемешанная версия справа + +Однако в игре была одна особенность: таймер начинал отсчет ПОСЛЕ того, как вы сделали первый ход, давая вам возможность +"подумать" перед началом игры. + +Посмотрев на изображение, я сделал "второстепенное изображение" для игры, заменив перемешанные изображения числами. +Таким образом, было легче понять "как упорядочить их от 1 до 15": + +две головоломки рядом, решение слева и перемешанная версия справа, с наложенными числами + +Моему мозгу это больше нравилось... Но я не хотел тратить на это слишком много времени, поэтому я поискал решатель головоломок. Через несколько часов я нашел +один, который работал методом грубой силы, занимая довольно много времени, чтобы дать вам все лучшие и лучшие решения. Он давал вам несколько последовательностей чисел +через некоторое время, и тогда вы могли решить головоломку. + +Я потратил много времени на поиск "хорошей перемешанной головоломки", потому что хотел, чтобы ее можно было решить менее чем за 20 ходов, если возможно. +Через несколько дней и несколько перезапусков игры в Facebook **у меня было решение за 16 ходов**. + +Я усложнил себе задачу после этого из-за двух ограничений головоломки: количество ходов **И** время. Я использовал приложение для автокликов, где я захватывал скриншотом +перемешанную головоломку, а затем "решал" головоломку, следуя лучшей числовой последовательности. + +Все было готово к началу. + +Я нажимаю "Старт" в приложении для автокликов. + +Автоклик терпит неудачу в середине головоломки 💀 + +Я облажался, сделав автоклик слишком быстрым, и клик не зарегистрировался в игре. Я быстро вмешался, исправил некоторые неправильно нажатые плитки и закончил +последовательность вручную. Мой итоговый результат был **21 ход за 15 секунд**. + +За несколько дней до окончания срока я проверил таблицу лидеров, и игрок на втором месте решил ее примерно за 300 ходов и 20 минут. +На тот момент это даже не было конкуренцией. + +Через несколько дней мне сообщили через Facebook, что я выиграл. Класс! 🎉 + +Официальный пост AdeS был [вот этот](https://web.archive.org/web/20101028002731/http://www.ades.cl/blog/2010/06/ya-tenemos-los-ganadores-de-puzzle-ades/). +Вот видео, снятое на месте, когда я забрал консоль: + + + +## От Wii к Xbox 360 + +Я так хотел поиграть в [Alan Wake](https://ru.wikipedia.org/wiki/Alan_Wake)! Поэтому я даже не думал о том, чтобы оставить Wii, поэтому я быстро разместил его +на онлайн-форуме (покойся с миром, CHW 🪦), я мог продать его, купить Xbox 360 или обменять его сразу. + +И парень пишет мне, желая обменять свою недавно полученную 360 на Wii! Разве иногда этот мир не прекрасен? + +Оказывается, он выиграл свою Xbox 360, играя в онлайн-покер. Это была PAL-консоль (здесь, в Чили, мы NTSC), так что это была проблема, но +я все равно сделал обмен. В конце концов, я хотел разблокировать ее, чтобы иметь возможность играть в копии резервных копий. PAL-игры были на расстоянии загрузки торрента. + +_Извините, пиратские игры были тем способом, которым я мог играть в новые игры тогда. Спасибо, Microsoft!_ + +## Разблокировка и на Луну 🚀 + +Я нашел тему на том же форуме, где кто-то разблокировал Xbox 360 (его имя пользователя было darcito). Я пошел к нему домой (там он работал) +и наблюдал за процессом разблокировки с нескольких метров. + +"Ты шутишь? Он просто подключает DVD-привод к своему компьютеру через SATA и нажимает на несколько кнопок! Я могу сделать это 💩 сам!" + +### Оптические приводы + +И вот, в течение следующих нескольких месяцев, я узнал в интернете, как работает процесс разблокировки. У Xbox 360 были разные +поставщики оптических приводов, разные версии прошивки, и для каждого был уникальный метод разблокировки, но все сводилось к резервному копированию +уникального DVD Key консоли и прошивке привода с пользовательской прошивкой, разработанной c4eva. + +К концу года я скопировал стратегию darcito и открыл свою тему на форуме, разблокируя консоли у себя дома. +Несколько моддеров Xbox подключали DVD-привод с помощью той же консоли, но сообщество считало, что Microsoft может обнаружить, если консоль включена +без подключенного DVD-привода, ваша консоль была "помечена" (я не уверен, было ли это правильно или нет). + +В любом случае, я хотел защитить консоли своих клиентов от пометки, поэтому я разработал пользовательский блок питания с переключателями для +определенных линий напряжения (необходимых для разблокировки некоторых оптических приводов): + +пользовательский блок питания для DVD-приводов Xbox 360 + +Конечно, через некоторое время появились лучшие варианты продаж для моддеров, поэтому в конечном итоге я получил X360 USB Pro v2 от Team Xecuter. + +#### Сверление чипов (метод Камикадзе) + +Этот метод разблокировки оптических приводов был диким; я не собираюсь врать! Для Xbox 360 Slim, которые поставлялись с заблокированными чипами LiteOn DG-16D4S и Winbond +(были приводы LiteOn с чипами MXIC, которые не требовали этого), вам приходилось сверлить отверстие в чипе внутри DVD-привода. + +чип + +То, что мы пытались достичь с помощью Камикадзе, это достичь маленького провода и заземлить его, позволяя вам прошить пользовательскую прошивку на привод: + +раскапсулированный чип + +Я думаю, Microsoft не ожидал такого безумия ради игры в резервные копии. Никогда не недооценивайте силу хакеров. +Забавное сообщение, которое я нашел в Twitter по этому поводу: + +> MS: Хорошо, если мы соединим защиту от записи _изнутри_ пакета с проводом для связи, они не смогут просто отрезать контакт или дорожку + +> Моддеры: Подержи мой шаблон для сверления чипов + +### Сброс Glitch Hack + +28 августа 2011 года GliGli и Tiros (при помощи cOz) выпустили Reset Glitch Hack (или RGH) для Xbox 360. Это аппаратный эксплойт, который невозможно исправить +для запуска неподписанного кода. Через несколько дней сцена Xbox 360 медленно создавала инструменты для моддеров. Вам нужно было +быть умелым с паяльником. + +Найти подходящие чипы для себя в первые дни было сложно, но я нашел некоторые, которые работали. +Сегодня для RGH 3.0 даже не требуется чип. + +Вот фотография меня, загружающего Linux (диван, который вы видите там, был местом, где мои клиенты обычно ждали): + +Xbox 360, запускающий Linux + +Я действительно верю, что был одним из первых, кто предложил услугу RGH здесь, в Чили. Я обслуживал клиентов со всей страны как для разблокировки оптических приводов, так и для RGH. Ходьба на почту с Xbox 360 была еженедельной рутиной в течение долгого времени. Сумасшедшие и веселые времена. + +Копия отзывов о моих услугах все еще жива [здесь](https://www.capa9.net/temas/feedback-de-sbarrenechea.899146/). +Я встретил много очень приятных людей и до сих пор поддерживаю с ними связь. Все это благодаря соку AdeS. + +

+ я смотрю на сломанный Xbox 360 +

Я смотрю на RRoD (мертвый) Xbox 360

+

diff --git a/src/content/posts/ru/chile-leader-in-isp-speeds.mdx b/src/content/posts/ru/chile-leader-in-isp-speeds.mdx new file mode 100644 index 0000000..e423a0c --- /dev/null +++ b/src/content/posts/ru/chile-leader-in-isp-speeds.mdx @@ -0,0 +1,23 @@ +--- +title: 'Чили: Лидер в области высокоскоростного интернета' +description: 'Высокая скорость интернета в Чили, стремление к инновациям и доступность доступного оптоволоконного интернета выдвигают страну в лидеры технологической отрасли.' +pubDate: 2023-01-17T12:00:00Z +img: ~/assets/images/post-isp-speeds.png +imgAlt: 'Создано через Midjourney с текстом: Флаг Чили из оптоволокна, концепт-арт технологий, Чили, высокое разрешение, детализировано, реалистично, красочно, надежда --v 4 --ar 3:2' +translatedBy: gpt-4-1106-preview +checksum: de2f032e0d77db38b12574f196381860ec5d5532ccff6b40093af50f47402b97 +--- + +Согласно последнему исследованию [OOKLA](https://www.ookla.com/articles/global-index-internet-speed-growth-2022), Чили обладает самым быстрым стационарным широкополосным интернетом в мире. Страна возглавила мировой индекс Speedtest, опередив такие страны, как Китай и Сингапур. + +Данные показывают, что скорость стационарного широкополосного интернета в Чили составляет 216,46 мегабит в секунду (Мбит/с), что превосходит другие страны в топ-10, включая Китай (214,58 Мбит/с), Сингапур (214,23) и Таиланд (205,63). Это не первый раз, когда исследование подчеркивает высокую скорость интернета в Чили. В марте 2022 года [Uswitch](https://www.uswitch.com/broadband/global-broadband-index/) также поставил Чили во главу стран ОЭСР по скорости широкополосного доступа, с средней скоростью загрузки 189,36 Мбит/с. + +Чили также выделяется в [2022 World Broadband Speed League](https://es.statista.com/grafico/18015/paises-latinoamericanos-con-mejor-velocidad-de-internet/) от Statista как страна с лучшей позицией в Латинской Америке и Карибском бассейне по скорости загрузки, хотя в мировом рейтинге она занимает 27-е место. Высокие скорости интернета в Чили можно объяснить фокусом страны на улучшении и приоритете стационарных и мобильных широкополосных сетей. В мировом масштабе OOKLA обнаружила, что мобильные скорости загрузки увеличились примерно на 17% в прошлом году, а скорости стационарного широкополосного доступа выросли как минимум на 28%. + +Высокие скорости интернета в Чили также распространяются на крупные города, с Вальпараисо, [занявшим 2-е место в мире](https://www.ookla.com/articles/global-index-cities-announcement) по скорости стационарного широкополосного доступа после Пекина. + +Чили становится важной частью инноваций и технологического роста. Это дополнительно подтверждается недавним запуском [AWS Local Zones](https://www.datacenterdynamics.com/en/news/aws-launches-local-zones-in-perth-and-santiago/) в Сантьяго. Компания объявила, что Local Zones позволят обеспечить доставку приложений, требующих однозначной задержки в миллисекундах или локальной обработки данных. Это важный шаг для Чили и его технологической отрасли. Кроме того, сообщается, что [Amazon планирует построить новый дата-центр в Пуэнте-Альто, Чили](https://www.biobiochile.cl/noticias/economia/negocios-y-empresas/2022/07/27/amazon-inicia-solicitud-para-la-construccion-de-un-datacenter-en-puente-alto.shtml). Это еще больше укрепит позиции Чили как лидера в области технологий и инноваций. + +Еще одним аспектом, подчеркивающим стремление Чили к высокоскоростному интернету, является широкая доступность быстрых и доступных оптоволоконных соединений. Многие провайдеры предлагают симметричные оптоволоконные соединения на 400 Мбит/с по очень разумной цене. Кроме того, некоторые провайдеры, такие как [Mundo](https://www.tumundo.cl/fibra-10g/), предлагают ссылку на загрузку 10 Гбит/с. Доступность и доступность быстрого интернета является значительным преимуществом для частных лиц и предприятий в Чили. + +Технологическая отрасль Чили находится на подъеме благодаря высоким скоростям интернета, стремлению к инновациям и доступности быстрых и доступных оптоволоконных соединений. Запуск AWS Local Zones и планы по строительству нового дата-центра свидетельствуют о приверженности Чили быть лидером в этой области. Будущее выглядит многообещающим для технологической отрасли Чили. diff --git a/src/content/posts/ru/hello-world.mdx b/src/content/posts/ru/hello-world.mdx new file mode 100644 index 0000000..95a950d --- /dev/null +++ b/src/content/posts/ru/hello-world.mdx @@ -0,0 +1,24 @@ +--- +title: Привет, мир! +description: Я перезапустил веб-сайт, теперь он работает на Astro и распространяется по Edge! +pubDate: 2022-07-28T12:00:00Z +img: ~/assets/images/post-astro.png +imgAlt: Логотип Astro +translatedBy: gpt-4-1106-preview +checksum: a61036e479b20fce7a56b7ec975fdc96d0a34e855200ce32a1b5510ea0a35f45 +--- + +import { Image } from 'astro:assets'; +import OldWebsiteImage from '~/assets/images/old-website.png'; + +Если вы уже были здесь раньше, на этом веб-сайте несколько лет висело приветственное сообщение "привет". Но за это время многое изменилось! + +Скриншот того, как выглядел веб-сайт раньше + +В 2016 году веб-сайт был размещен на виртуальном сервере [DigitalOcean](https://digitalocean.com). Позже я решил открыть порты в своей собственной сети и использовал [DockerHub](https://hub.docker.com/r/barrenechea/barrenechea-website) для запуска веб-сайта в виде контейнера на моем сервере [Unraid](https://unraid.net). + +Перед переходом на размещение на Edge я использовал [Cloudflare Tunnel](https://www.cloudflare.com/products/tunnel/), чтобы уменьшить проблемы с динамическим IP, предоставляемым моим интернет-провайдером, и усилить "точки доступа" моей локальной сети. + +То, что вы сейчас читаете, это перестроенный веб-сайт, разработанный с помощью [Astro](https://astro.build). Возможность развертывания на Edge (в настоящее время я использую сеть [edge network](https://www.cloudflare.com/learning/cdn/glossary/edge-server/) от Cloudflare) является огромным улучшением как с точки зрения безопасности, так и с точки зрения производительности для конечных пользователей (то есть для вас!). + +Шрифт, который я выбрал для этого веб-сайта, - [Work Sans](https://fonts.google.com/specimen/Work+Sans). diff --git a/src/content/posts/ru/home-automation-and-security.mdx b/src/content/posts/ru/home-automation-and-security.mdx new file mode 100644 index 0000000..b57cf42 --- /dev/null +++ b/src/content/posts/ru/home-automation-and-security.mdx @@ -0,0 +1,21 @@ +--- +title: Преимущества и недостатки систем автоматизации дома для безопасности +description: Краткий обзор преимуществ и недостатков систем автоматизации дома для безопасности, включая Zigbee, Matter и Home Assistant. +pubDate: 2022-12-30T00:00:00Z +img: ~/assets/images/post-home-automation-and-security.png +imgAlt: 'Создано через Midjourney с текстом: цифровое представление дома с использованием линий света, аура защиты домашней безопасности, одиночные линии, впечатляюще, красочно, реалистично, рендеринг Octane --v 4 --ar 3:2' +translatedBy: gpt-4-1106-preview +checksum: 4357a220780b6c41cdceb6aada137fcf5adc2ab6710e37578cbc98e1b4ae58f8 +--- + +Системы автоматизации дома могут быть полезным инструментом для повышения безопасности жилища. Эти системы позволяют вам удаленно управлять и контролировать различные устройства в вашем доме, такие как освещение, замки и камеры, используя приложение для смартфона или другой тип панели управления. + +Популярным протоколом автоматизации дома является [Zigbee](https://ru.wikipedia.org/wiki/Zigbee), который представляет собой стандарт беспроводной связи, использующий радиоволны низкой мощности для соединения устройств. Zigbee является хорошим выбором для систем автоматизации дома, поскольку он относительно недорог и легок в настройке, а также может поддерживать большое количество устройств в одной сети. + +Однако у Zigbee есть некоторые ограничения в плане безопасности. По умолчанию он не использует шифрование, что означает возможность перехвата и чтения коммуникаций между устройствами. Кроме того, устройства Zigbee могут быть уязвимы для атак, если они не настроены и не защищены должным образом. + +Другой протокол автоматизации дома, который стоит рассмотреть, это [Matter](https://csa-iot.org/ru/all-solutions/matter/), более новый и надежный протокол, разработанный [Альянсом стандартов связи](https://en.wikipedia.org/wiki/Connectivity_Standards_Alliance) (ранее Альянсом Zigbee). Matter использует передовые методы шифрования для защиты коммуникаций между устройствами, что делает его более устойчивым к взлому и перехвату. Он также имеет более гибкую и открытую архитектуру, что позволяет ему поддерживать широкий спектр устройств и протоколов. + +Если вы хотите использовать систему автоматизации дома, которая легко настраивается и поддерживает широкий спектр устройств, вы также можете рассмотреть [Home Assistant](https://www.home-assistant.io). Home Assistant - это платформа автоматизации дома с открытым исходным кодом, которая работает на различных устройствах, включая Raspberry Pi и другие одноплатные компьютеры. Она поддерживает большое количество интеграций и имеет сильное сообщество пользователей и разработчиков. + +Независимо от выбранного вами протокола или платформы автоматизации дома, важно обеспечить безопасность и правильную настройку ваших устройств, чтобы ваш дом был максимально защищен. Это может включать использование надежных паролей, обновление программного обеспечения и прошивок, а также соблюдение лучших практик безопасности устройств. diff --git a/src/content/posts/ru/internationalization-a-journey-towards-linguistic-inclusion.mdx b/src/content/posts/ru/internationalization-a-journey-towards-linguistic-inclusion.mdx new file mode 100644 index 0000000..a90576c --- /dev/null +++ b/src/content/posts/ru/internationalization-a-journey-towards-linguistic-inclusion.mdx @@ -0,0 +1,96 @@ +--- +title: 'Интернационализация: Путь к Языковому Включению' +description: Мой сайт движется к интернационализации, преодолевая языковые барьеры, чтобы привлечь разнообразную аудиторию. +pubDate: 2023-12-27T12:00:00Z +img: ~/assets/images/post-i18n.jpg +imgAlt: 'Изображение, созданное Firefly Image 2 с текстом: награды за искусство, разветвленное дерево из лучей света и энергии, драматичное, впечатляющее, красочное, высокое разрешение, 4k uhd' +translatedBy: gpt-4-1106-preview +checksum: fd912ad7afc432dab6f20af7a9e4e64cc37991680e10f10f8095de4dd7a98dbb +--- + +import OldNavbar from '~/assets/images/post-i18n-old-navbar.png'; +import NewNavbar from '~/assets/images/post-i18n-new-navbar.png'; +import WrongEsTranslation from '~/assets/images/post-i18n-wrong-es-translation.png'; +import { Image } from 'astro:assets'; + +С самого начала работы над этой страницей я выбрал английский язык в качестве основного, предполагая, что он наиболее распространен в интернете. Однако недавно я узнал, что среди сетей Meta и X вторым по популярности языком является испанский. Лично у меня был долг показать мой контент на моем родном языке, и сегодня это стало реальностью. + +В последние дни я интернационализировал каждый уголок сайта, присваивая значения в формате ключ/значение для интерфейса и переводя содержимое проектов и постов автоматически с помощью LLM (Больших Языковых Моделей). + +## С чего начать, мой друг? + +Существует два основных аспекта, которые следует учитывать: пользовательский интерфейс и контент. + +Документация [Astro](https://docs.astro.build/ru/recipes/i18n/) и ее [исходный код](https://github.com/withastro/docs/tree/main/src/i18n) были довольно полезны для базовой логики, однако я внес несколько корректировок, чтобы адаптировать ее к моим потребностям и сохранить код как можно более чистым. + +Этот сайт в основном сосредоточен на содержании постов и, с точки зрения интерфейса, он довольно прост. Наибольшее количество статического текста было на главной странице, поэтому я начал извлекать каждое значение в объекты ключ/значение, позволяя представлению отображаться одинаково. + +```typescript +export const en = { + 'author.name': 'Sebastian Barrenechea', + + 'nav.fork': 'Fork me on GitHub', + 'nav.sr.open': 'Open navigation menu', + 'nav.home': 'Home', + 'nav.projects': 'Projects', + 'nav.posts': 'Posts', + 'nav.page': 'Page', + 'nav.language.select': 'Select language', + + 'hero.greeting': "Heey! I'm", + // ... +}; +``` + +Обработка маршрутов критически важна для определения страниц для построения. Astro облегчает это с помощью своей системы маршрутизации, позволяя язык быть доступным в качестве параметра: + +- Переместите все страницы из каталога `src/pages` в каталог `src/pages/[lang]`. +- Добавьте что-то вроде этого на каждую из страниц, которые требуют обработки i18n: + ```typescript + const { lang } = Astro.params; + ``` + +С английской версией работающей, я начал добавлять поддержку испанского. Здесь я столкнулся с дилеммой перевода: + +Скриншот главной страницы с испанскими текстами 'Últimos Publicaciones' и 'Ver todos los publicaciones', неправильно переведенными + +На английском я мог использовать одни и те же значения для проектов и постов, но не на испанском. + +В идеальном мире я бы использовал гендерно-нейтральный язык. Я мог бы выбрать "Proyectos recientes" и "Publicaciones recientes", что позволило бы мне переиспользовать слово. Однако, чтобы сохранить визуальную консистентность страницы, мне нужно было, чтобы фраза заканчивалась на "proyectos" или "publicaciones". После некоторых корректировок мне удалось полностью перевести это на всех представлениях (индекс, страницы навигации и шаблоны, использующие контент). + +И была проблема с компонентом выбора языка, который я использовал, который меня очень беспокоил. Компонент требовал класса `absolute` для позиционирования объектов под ним, что приводило к тому, что он переставал уважать поля страницы в случае очень длинного текста: + +
+ Скриншот предыдущей панели навигации с селектором языка в правом верхнем углу, выходящим за пределы поля +

Поле выделено красным, чтобы подчеркнуть проблему

+
+ +Я извлек этот компонент из [Starlight](https://starlight.astro.build/ru/) потому что он показался мне простым и минималистичным, но в итоге я заменил его на один из [Flowbite](https://flowbite.com/docs/components/navbar/#language-dropdown), реализовав интерактивность с помощью [API веб-компонентов](https://web.dev/articles/custom-elements-v1). Новый компонент требует дополнительной графики для каждого языка (флаг, используя [@iconify-icons/circle-flags](https://icon-sets.iconify.design/circle-flags/)), но это того стоит. + +Скриншот текущей панели навигации с селектором языка в правом верхнем углу + +## Но контента-то и не видно, а? + +Когда я настраивал содержимое сайта (проекты и посты) на соответствующий английский маршрут, сайт не мог найти контент на испанском, что приводило к странице без навигационного контента. Первые тесты я проводил вручную, переводя с помощью API OpenAI, а затем я автоматизировал процесс, чтобы упростить задачу. + +_Подробнее об использовании LLM в производстве можно узнать в предстоящем посте._ + +После завершения перевода проектов и постов на испанский язык, я внес некоторые корректировки в полученные переводы. Я установил испанский язык в качестве стандартной референции для автоматизированного процесса перевода и, после необходимых корректировок, воссоздал контент на английском языке. + +## Что теперь? + +Теперь добавить поддержку других языков удивительно просто! Есть определенные соображения, которые следует учитывать, такие как "предположение", что язык читается слева направо, что исключает такие языки, как арабский или иврит. Tailwind, фреймворк CSS, который я использую на этом сайте, нативно поддерживает LTR (слева направо) и RTL (справа налево), но некоторые детали нужно настроить (например, использовать класс `rtl:space-x-reverse` там, где это необходимо). + +С Германией на третьем месте по числу посетителей моего сайта, я без труда реализовал перевод на немецкий и скоро включу итальянский, французский, упрощенный китайский и исландский (I♥️Iceland). Хотя автоматизация упрощает процесс, важно проверять переводы на качество, так как они не всегда идеальны. В случае с английским я мог провести личную проверку; однако для языков, таких как немецкий, которым я не владею, я прибегал к помощи инструментов, таких как автоматический перевод в Google Chrome, чтобы проверить последовательность. Моя цель - в конечном итоге сотрудничать с носителями каждого языка, чтобы повысить стандарт предлагаемых переводов. diff --git a/src/content/posts/ru/linux-61-rust.mdx b/src/content/posts/ru/linux-61-rust.mdx new file mode 100644 index 0000000..177cd7f --- /dev/null +++ b/src/content/posts/ru/linux-61-rust.mdx @@ -0,0 +1,23 @@ +--- +title: 'Rust и Linux: Безопасность и Параллелизм в Основе' +description: 'Ядро Linux теперь включает Rust, язык, который подчеркивает надежность и производительность. Это значительный этап для Rust и ядра.' +pubDate: 2022-12-26T00:00:00Z +img: ~/assets/images/post-linux-rust.png +imgAlt: 'Создано через Midjourney с текстом: Пингвин Linux играет с крабом из языка программирования Rust, Антарктида, слоистое бумажное искусство, диорама, теневой ящик, объемное освещение --v 4' +translatedBy: gpt-4-1106-preview +checksum: a77b00f8e2496645c40683789da039c06fbe39ea3da03b8f8ed2a79474ff1a3d +--- + +Язык программирования [Rust](https://www.rust-lang.org/ru/) оказал значительное влияние в техническом мире с его недавним включением в ядро Linux [6.1](https://lkml.org/lkml/2022/12/11/206), начиная с 11 декабря 2022 года. Известный своей скоростью и надежностью, Rust — это компилируемый, статически типизированный язык, который подчеркивает безопасность, параллелизм и производительность. Если вы знакомы с C++, вы найдете синтаксис Rust легким для изучения. + +Итак, почему команда ядра Linux выбрала Rust, и что это значит для будущего языка? + +Одной из основных причин, по которой был выбран Rust, является его сильный акцент на безопасность. Ядро Linux управляет многими чувствительными задачами и информацией, поэтому важно иметь язык, который приоритизирует безопасность. Строгая проверка типов и система заимствований Rust помогают предотвратить распространенные ошибки программирования, которые могут привести к уязвимостям безопасности. + +Помимо безопасности, Rust также предлагает отличную поддержку параллелизма. Его концепция "владения" управляет памятью и предотвращает условия гонки, позволяя эффективно и надежно выполнять многозадачность. + +Но включение Rust в ядро Linux — это не только хорошие новости для ядра; это также значительный этап для Rust как языка. Использование в таком высокопрофильном проекте, как ядро Linux, несомненно привлечет больше внимания и принятия со стороны сообщества разработчиков. + +Важно отметить, что это только начало интеграции Rust в ядро Linux. Команда, стоящая за ядром, заявила, что планирует постепенно вводить больше функций Rust со временем, при этом обеспечивая, чтобы существующая функциональность не была нарушена. + +В заключение, добавление Rust в ядро Linux 6.1 является важным шагом как для ядра, так и для языка программирования Rust. Rust приносит свой акцент на безопасность и параллелизм в ядро, а также получает большую видимость и принятие как язык. Как говорится, "если это не сломано, не чини" - но в данном случае введение Rust кажется многообещающим шагом для будущего ядра Linux. diff --git a/src/content/posts/ru/multiarch.mdx b/src/content/posts/ru/multiarch.mdx new file mode 100644 index 0000000..85562c8 --- /dev/null +++ b/src/content/posts/ru/multiarch.mdx @@ -0,0 +1,38 @@ +--- +title: Мультиархитектурность во всём +description: Путешествие из мира x86/64 во вселенную архитектур. +pubDate: 2021-09-06T00:00:00Z +img: ~/assets/images/arm-x86.svg +imgAlt: Два чипа, один с надписью "x86", другой - "ARM". +translatedBy: gpt-4-1106-preview +checksum: fa8c71668cd9e14e1349122d69ac1a0696e5a23dff0182b9145a50b33a68cbf6 +--- + +Когда мы начинали закладывать наши первоначальные основы в [Finalis](https://www.finalis.com), я помню, как у меня возникла идея протестировать Graviton от AWS. +Это было неосуществимо в 2018 году без самостоятельной сборки. Но вот наступил 2022 год, и мы (как сообщество) все еще испытываем трудности с поиском поддержки ARMv8 в образах Dockerhub. + +Но в 2020 году произошло кое-что важное: Apple объявила о переходе Mac на Apple Silicon с двухлетним планом. + +В Finalis мы придерживаемся использования оборудования Apple для разработки программного обеспечения. Вы получаете операционную систему, похожую на Unix, и фантастическое качество экрана и звука для просмотра фильмов или чего-то еще 🍿. + +В 2020 году начался обратный отсчет. Если мы хотели продолжать приобретать новые устройства Apple в будущем, Finalis нужно было стать мультиархитектурной. + +## Docker + +Когда Apple выпустила M1, и мы его получили, Docker начал "ладить" с ним, но Docker на ARM имел некоторые проблемы в более ранних версиях, просто потому, что движок тестировался (нами, пионерными разработчиками). + +Позже казалось, что все в порядке: сторонние инструменты - большинство необходимых образов уже были доступны для ARM64, но не все. [browserless](https://github.com/browserless/chrome) был тем, с чем я начал бороться, чтобы собрать его на ARM64, и поэтому я отправил [pull request](https://github.com/browserless/chrome/pull/1847) с минимальными изменениями, необходимыми для его работы. + +Со сторонними инструментами все было покрыто, оставалось лишь убедиться, что Docker собирает наши собственные образы для ARM64. "Эй, вы используете TypeScript; это должно просто работать!"... Ну, если только ваши зависимости не требуют загрузки бинарных файлов во время выполнения `npm install`. + +Основная проблема? Бинарные файлы для ARM64 не предоставляются, что вынуждает собирать бинарные файлы во время выполнения `npm install` с помощью `make` (скрипты после установки?). С точки зрения конфигурации, немного любви в некоторых наших файлах `Dockerfile` было всем, что нам нужно, и это решило все проблемы. + +## Пайплайны + +Работая с GitHub Actions и имея дело с мультиархитектурностью, у вас есть два варианта: запустить два параллельных раннера (один сборка для x86/64 и другой для arm64) или запустить одного раннера для обеих архитектур. + +Я выбрал второй вариант для экспериментов через [docker buildx](https://docs.docker.com/build/buildx/). Следуя инструкциям по настройке для [build-push-action](https://github.com/docker/build-push-action#path-context), вы можете быстро получить рабочий пайплайн. + +Позволяя buildx управлять сборкой мультиархитектурности, вы можете пушить в Dockerhub, не имея дело с разными тегами для разных архитектур. Все ваши теги БУДУТ совместимы с мультиархитектурностью. + +Недостаток - время сборки: иметь два параллельных раннера на соответствующих архитектурах было бы намного быстрее, но пайплайн потребовал бы управления слиянием результатов в один тег. _Только если вам важно облегчить потребителям поиск правильного образа._ diff --git a/src/content/posts/ru/nvidia-mellanox-aspm.mdx b/src/content/posts/ru/nvidia-mellanox-aspm.mdx new file mode 100644 index 0000000..872b74e --- /dev/null +++ b/src/content/posts/ru/nvidia-mellanox-aspm.mdx @@ -0,0 +1,21 @@ +--- +title: Отсутствие поддержки ASPM в картах Mellanox от Nvidia +description: Исследование отсутствия поддержки ASPM в картах Mellanox от Nvidia и его влияние на энергоэффективность систем высокопроизводительных вычислений. +pubDate: 2023-01-02T12:00:00Z +img: ~/assets/images/post-nvidia-mellanox.png +imgAlt: 'Сгенерировано через Midjourney с текстом: Зеленый дата-центр Nvidia внутри стеклянной биосферы, излучающей серый газ, впечатляющий, красочный, реалистичный, объектив Canon, высокая детализация --v 4 --ar 3:2' +translatedBy: gpt-4-1106-preview +checksum: b1e34b15dbbd6f83541bbdf85e18490bfd8bf9eb64f5436fef6945d85dfd9b79 +--- + +Карты Mellanox от Nvidia не поддерживают ASPM (Active State Power Management — управление питанием в активном состоянии), функцию управления питанием, которая помогает снизить потребление энергии карт PCI Express (PCIe). Это проблематично, поскольку карты Mellanox используются во многих системах высокопроизводительных вычислений (HPC), в которых часто имеется большое количество устройств PCIe, которые могут значительно увеличивать энергопотребление системы. + +Но почему это важно? Одна из основных причин — экологическое воздействие потребления энергии. Системы HPC могут потреблять большое количество электричества, что приводит к выделению парниковых газов и способствует изменению климата. Улучшая энергоэффективность этих систем, мы можем помочь снизить их углеродный след и внести свой вклад в защиту окружающей среды. + +ASPM — ценная функция управления энергией, которая может значительно снизить энергопотребление системы, позволяя устройствам переходить в состояние низкого энергопотребления, когда они не используются. Если бы карты Mellanox поддерживали ASPM, это могло бы улучшить энергоэффективность систем HPC и снизить их углеродные выбросы. Это было бы выигрышным решением: это не только помогло бы снизить наше воздействие на окружающую среду, но и сэкономило бы деньги на счетах за электричество и улучшило бы производительность систем HPC за счет снижения энергетических узких мест. + +К сожалению, несмотря на запросы пользователей, Nvidia не предоставила обновлений прошивки для включения поддержки ASPM на картах Mellanox. Это разочаровывает, так как это был бы простой и эффективный способ улучшить энергоэффективность систем HPC. Неясно, почему Nvidia не предоставила эти обновления, но производителю следует учитывать этот вопрос и подумать о предоставлении необходимых обновлений прошивки. + +Тем временем нам нужно продолжать искать способы улучшения энергоэффективности систем HPC и снижения их воздействия на окружающую среду. Это может включать использование более эффективного оборудования, оптимизацию программного обеспечения и алгоритмов, а также внедрение других техник управления энергией. Например, некоторые системы HPC используют ограничение мощности или динамическое изменение напряжения и частоты (DVFS) для ограничения энергопотребления отдельных компонентов. + +Сосредоточив внимание на энергоэффективных технологиях и практиках, мы можем помочь снизить углеродный след систем HPC и оказать положительное влияние на мир. diff --git a/src/content/projects/ru/autodice.mdx b/src/content/projects/ru/autodice.mdx new file mode 100644 index 0000000..dc090e4 --- /dev/null +++ b/src/content/projects/ru/autodice.mdx @@ -0,0 +1,28 @@ +--- +title: AutoDice +description: Настольное приложение, которое подключается к нескольким сайтам для криптовалютных ставок в игре "Кости". +pubDate: 2015-07-27T01:46:14Z +link: https://github.com/barrenechea/AutoDice +img: ~/assets/images/project-autodice.png +imgAlt: Логотип проекта AutoDice +tags: + - CSharp + - DotNet6 +translatedBy: gpt-4-1106-preview +checksum: fe21a6f3a7ebc51da8cda273d79ba8ec1ce39668a8f9b475c0e2f7868f0dd221 +--- + +import { Image } from 'astro:assets'; +import FooterImage from '~/assets/images/autodice-infographic.png'; + +Этот проект начался, когда я изучал информатику, и это была лишь моя первая попытка создать что-то полезное и связанное с тем, чем я занимался в то время. + +Я отошел от Java GUI (который был ужасен) к C#, что позволило мне заняться [MahApps.Metro](https://mahapps.com/), что, как мне казалось, было круто в 2015 году (по сравнению со стандартными WinForms). + +Я запустил проект в 2015 году на [Bitcointalk](https://bitcointalk.org/index.php?topic=1135816.0) и [Github](https://github.com/barrenechea/AutoDice). Что выделяло приложение, так это пользовательский интерфейс и центр стратегий, позволяющий пользователям загружать и делиться своими стратегиями с другими. Для получения дополнительной информации вы можете проверить тему на Bitcointalk. + +В 2022 году я [обновил проект](https://github.com/barrenechea/AutoDice/commit/194cb75cbf924faa50528c8da1b259b2f51213f1) с .NET Framework 4.5 до .NET 6.0 в рамках технического обслуживания (и чтобы быть в курсе событий .NET). Я также удалил [Costura](https://github.com/Fody/Costura), так как это не способ упаковки вещей в .NET 6.0. + +Вот копия "инфографики", которую я создал в то время для моего поста на Bitcointalk: + +Инфографика AutoDice diff --git a/src/content/projects/ru/fl3xbl0w.mdx b/src/content/projects/ru/fl3xbl0w.mdx new file mode 100644 index 0000000..4398db3 --- /dev/null +++ b/src/content/projects/ru/fl3xbl0w.mdx @@ -0,0 +1,85 @@ +--- +title: fl3xbl0w +description: Проект по реверс-инжинирингу. Начался с беговой дорожки Bowflex Treadmill 22, но в итоге был обобщен для любого Android-устройства, продаваемого компанией Nautilus Inc. (Nautilus, Bowflex, Schwinn). +pubDate: 2022-05-28T10:28:00Z +img: ~/assets/images/project-fl3xbl0w.svg +imgAlt: логотип проекта fl3xbl0w +tags: + - ReverseEngineering + - Hardware + - Android +translatedBy: gpt-4-1106-preview +checksum: 3c68be7b1aeedf296c2ef7e572afbb18bf245164c15815cf15fb013ab8703dc1 +--- + +import { Image } from 'astro:assets'; +import HeaderImage from '~/assets/images/project-fl3xbl0w.png'; + +логотип flexblow + +Добро пожаловать в мою документацию по "Консоли Bowflex"! (как её называет Nautilus). + +Vantron является основой для большинства "умных устройств" компании Nautilus Inc. По сути, это планшет на Android с проприетарным программным обеспечением. Кроме того, меня заинтересовали некоторые аппаратные особенности. + +Я многое узнал благодаря предыдущим работам, которые нашел на [Reddit](https://www.reddit.com/r/Bowflex/comments/mi8wdo/unlocking_bowflex_velocore/) (спасибо [xasmx](https://www.reddit.com/user/xasmx/)!), что позволило мне глубже понять программное и аппаратное обеспечение машины. + +## Совместимые устройства (Android Jailbreak) + +После экспериментов с декомпилированными приложениями, я могу с уверенностью сказать, что следующая документация может быть экстраполирована тем или иным способом на следующие устройства Bowflex: + +### Беговые дорожки + +- Treadmill 22 / Treadmill 56 (одна и та же беговая дорожка. 56 имеет вход AC 220v, 22 имеет вход AC 120v) +- Treadmill 10 / Treadmill 25 (одна и та же беговая дорожка. 25 имеет вход AC 220v, 10 имеет вход AC 120v) + +### Велотренажеры + +- VeloCore + +### Max Trainer + +- Max Total 16 +- Max Trainer M9 + +У меня нет Max Trainer или VeloCore, но это должно работать, если у вас есть доступный USB-порт, исходя из результатов кода. + +Подтверждено работоспособность с версиями NautilusLauncher: + +- 5.0.0.350 +- 5.0.0.382 + +**Jailbreak уже был исправлен Nautilus.** + +## Документация + +### Общая информация + +- + Android Jailbreak + +- + Создание резервной копии содержимого вашей консоли + +- + Декомпиляция + +- + Особенности Bowflex + + +### В процессе работы + +- + Контроллер двигателя беговой дорожки + +- + дамп ROM + + +## Конечная цель + +Обеспечить максимальное количество будущих обновлений для моей беговой дорожки. + +Компания Nautilus, Inc. предлагает только 1-годичную гарантию на электронные компоненты, и когда я увидел, что механизм выключения машины (и, следовательно, планшета Android) заключается просто в "отключении переменного тока через задний переключатель", это меня напугало. Каждое устройство на базе Linux должно быть корректно выключено, чтобы избежать повреждения операционной системы, и этот планшет на Android не исключение. Так что, пока он работает, почему бы не получить от этого немного больше удовольствия? + +В конце концов, я хочу перехватить, понять и воссоздать коммуникацию, идущую к контроллеру двигателя на моей беговой дорожке, чтобы, если планшет выйдет из строя, у меня все равно осталось работающее устройство. diff --git a/src/content/projects/ru/fl3xbl0w/backup.mdx b/src/content/projects/ru/fl3xbl0w/backup.mdx new file mode 100644 index 0000000..0414da9 --- /dev/null +++ b/src/content/projects/ru/fl3xbl0w/backup.mdx @@ -0,0 +1,240 @@ +--- +title: Создание резервной копии содержимого вашей консоли - fl3xbl0w +description: Проект по реверс-инжинирингу. Началось все с беговой дорожки Bowflex Treadmill 22, но в итоге было обобщено для любой Android-машины, продаваемой компанией Nautilus Inc. (Nautilus, Bowflex, Schwinn). +pubDate: 2022-05-28T10:28:00Z +link: /ru/projects/fl3xbl0w +img: ~/assets/images/project-fl3xbl0w.svg +imgAlt: логотип проекта fl3xbl0w +tags: + - ReverseEngineering + - Hardware + - Android +translatedBy: gpt-4-1106-preview +checksum: 65ec4f05ff473ccae32695390fa759ddf2c4115337bf3223d577b481cd053ea0 +--- + +import { Image } from 'astro:assets'; +import DialogBackupConfirm from '~/assets/images/fl3xbl0w/dialog-backup-confirm.png'; + +После освобождения из `AppMonitorService` (или после получения любого обновления OTA) первое, что нужно сделать, это создать резервную копию как можно большего количества данных. + +Убедитесь, что вы уже подключены к консоли: + +```sh +> adb connect +``` + +## Резервное копирование содержимого /sdcard + +Там могут содержаться некоторые файлы, необходимые для нормальной работы машины после сброса настроек (в основном в папках `/sdcard/Android` и `/sdcard/Nautilus`). Мы сделаем резервную копию всего с помощью: + +```sh +> adb pull /sdcard/ . +``` + +## Резервное копирование APK + +Сначала получите список всех установленных на консоли пакетов (чтобы у вас была ссылка): + +```sh +> adb shell pm list packages -f +``` + +Они будут отображаться в следующем формате: `package:<расположение APK>=<имя пакета>` + +Вам нужно будет найти приложения, которые вы хотите резервировать. НЕ ВСЕ ПРИЛОЖЕНИЯ НЕОБХОДИМЫ, большинство из них - стандартные приложения Android, поэтому мы будем искать только "нестандартные приложения", используя некоторые фильтры: + +```sh +> adb shell pm list packages -f | grep -wviE 'com.android|com.google|framework-res|/vendor/overlay' +``` + +Вы увидите записи приложений от `com.nautilus`, `com.redbend`, `com.netflix`, `com.amazon`, `com.disney` и, возможно, еще некоторых в будущем. Мы захотим резервировать все, что видим в этом списке (скрытые уникальные идентификаторы, используйте свои результаты): + +```sh +> adb shell pm list packages -f | grep -wviE 'com.android|com.google|framework-res|/vendor/overlay' +package:/data/app/com.nautilus.sbctest-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.sbctest +package:/data/app/com.redbend.client-XXXXXXXXXXXXXXXX/base.apk=com.redbend.client +package:/data/app/com.nautilus.nlssbcsystemsettings-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.nlssbcsystemsettings +package:/system/priv-app/RBDualPartService/RBDualPartService.apk=com.redbend.dualpart.service.app +package:/data/app/com.netflix.mediaclient-XXXXXXXXXXXXXXXX/base.apk=com.netflix.mediaclient +package:/data/app/com.nautilus.nautiluslauncher-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.nautiluslauncher +package:/data/app/com.amazon.avod.thirdpartyclient-XXXXXXXXXXXXXXXX/base.apk=com.amazon.avod.thirdpartyclient +package:/data/app/com.nautilus.sbc_demo_app-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.sbc_demo_app +package:/data/app/com.nautilus.UtilityApp-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.UtilityApp +package:/data/app/com.nautilus.g4assetmanager-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.g4assetmanager +package:/data/app/com.nautilus.platform_hardwaretest-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.platform_hardwaretest +package:/data/app/com.nautilus.webviewer-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.webviewer +package:/data/app/com.nautilus.bowflex.usb-XXXXXXXXXXXXXXXX/base.apk=com.nautilus.bowflex.usb +package:/data/app/com.disney.disneyplus-XXXXXXXXXXXXXXXX/base.apk=com.disney.disneyplus +``` + +> ПРИМЕЧАНИЕ: `com.redbend.dualpart.service.app` исходит из `/system/priv-app/`, что означает, что оно останется установленным даже после сброса настроек. Мы можем резервировать его в любом случае, если вас интересует реверс-инжиниринг приложений. + +Давайте возьмем Disney Plus в качестве примера (скрытый уникальный идентификатор) + +``` +package:/data/app/com.disney.disneyplus-XXXXXXXXXXXXXXXX/base.apk=com.disney.disneyplus +``` + +Эта строка, исходя из упомянутого мной формата, будет: + +``` +Расположение пакета: /data/app/com.disney.disneyplus-XXXXXXXXXXXXXXXX/base.apk +Имя пакета: com.disney.disneyplus +``` + +Мы будем искать, какую версию приложения у нас есть с этой информацией. Давайте используем только что идентифицированное имя пакета и запустим: + +```sh +> adb shell dumpsys package com.disney.disneyplus | grep versionName +``` + +В моем случае я получил: + +```sh +> adb shell dumpsys package com.disney.disneyplus | grep versionName + versionName=2.4.2-rc2 +``` + +Теперь, чтобы создать резервную копию пакета Disney Plus, процедура будет следующей: + +```sh +> adb pull /data/app/com.disney.disneyplus-XXXXXXXXXXXXXXXX/base.apk . +``` + +Сразу после завершения перейдите в свой файловый менеджер и переименуйте только что созданный резервный файл `base.apk` в `com.disney.disneyplus-2.4.2-rc2.apk`. + +Формат, который я предлагаю для APK, учитывая этот пример, это: `<Имя пакета>-<версия>.apk` + +Теперь повторите процесс для остальных приложений. + +## Резервное копирование AppData + +Кажется, что можно резервировать _некоторые (не уверен, что все)_ данные приложений. + +_Имейте в виду, что не все установленные приложения генерируют данные приложений, или мы, как пользователь `shell`, можем не иметь разрешений на резервное копирование всего._ + +Создайте полную резервную копию всех установленных пользователем приложений: + +```sh +> adb backup -f appdata.adb -all -noapk -nosystem +``` + +В качестве альтернативы вы можете получить тот же результат с помощью альтернативной команды: + +```sh +> adb shell 'bu backup -all -noapk -nosystem' > appdata.adb +``` + +Обе команды запросят "подтверждение на экране" о том, что вы хотите сделать резервную копию. Нажмите на "**РЕЗЕРВИРОВАТЬ МОИ ДАННЫЕ**": + +экран подтверждения резервного копирования + +Если вы хотите извлечь содержимое (на Linux, macOS), вам понадобится `zlib-flate` из [qpdf](https://command-not-found.com/qpdf) и выполните: + +```sh +> dd if=appdata.adb bs=24 skip=1 | zlib-flate -uncompress | tar xf - +``` + +Есть некоторые интересные данные для `com.nautilus.bowflex.usb`. +Там есть личная информация (PII), поэтому **убедитесь, что хорошо проверили, какие файлы вы делитесь**. + +_Эти методы резервного копирования и извлечения взяты из [этого Gist](https://gist.github.com/AnatomicJC/e773dd55ae60ab0b2d6dd2351eb977c1). Я проверил только перечисленные там методы резервного копирования, которые безопасны для использования. **Если вы будете играть с восстановлением из Gist, вы на свой страх и риск**. Сообщите нам, если это работает!_ + +## Скрипт + +Я разработал быстрый и грязный скрипт на Python для резервного копирования некоторых содержимого (пока что без AppData). +**Проверено только на macOS с установленными android-platform-tools через brew**. +Прочитайте скрипт и убедитесь, что он имеет смысл для вас, прежде чем запускать его. + +```python +import sys +import os +import subprocess +from datetime import datetime + +# проверка наличия аргумента +if len(sys.argv) != 2: + print("Использование: python3 dump.py ") + sys.exit(1) + +ipaddr = sys.argv[1] + +# проверка доступности adb для shell +adb_path = subprocess.check_output(["which", "adb"]).decode("utf-8").strip() +if not os.path.exists(adb_path): + print("adb не найден") + exit() + +# настройка папки для резервного копирования с текущей датой и временем +dump_folder = os.path.join( + os.environ["HOME"], + "Desktop", + "nautilus_dump", + "{}".format(datetime.now().strftime("%Y-%m-%d_%H-%M-%S")), +) +if not os.path.exists(dump_folder): + os.makedirs(dump_folder) + +# подключение adb +print("Подключение к {}...".format(ipaddr)) +subprocess.call(["adb connect {}".format(ipaddr)], shell=True) + +# резервное копирование содержимого /sdcard +print("Резервное копирование содержимого /sdcard...") +subprocess.call(["adb pull /sdcard/ {}".format(dump_folder)], shell=True) + +# получение информации о APK +print("Резервное копирование APK...") +packages = ( + subprocess.check_output(["adb shell pm list packages -f"], shell=True) + .decode("utf-8") + .split("\n") +) + +# фильтрация пустых строк +packages = [x for x in packages if x.strip()] + +# фильтрация строк, содержащих "com.android", "com.google", "framework-res" +packages = [package for package in packages if package.find("com.android") == -1] +packages = [package for package in packages if package.find("com.google") == -1] +packages = [package for package in packages if package.find("framework-res") == -1] + +print("Найдено {} APK".format(len(packages))) + +for package in packages: + package_name = package.split("=") + package_name = package_name[len(package_name) - 1].strip() + package_version = ( + subprocess.check_output( + ["adb shell dumpsys package {} | grep versionName".format(package_name)], + shell=True, + ) + .decode("utf-8") + .split("=")[1] + .strip() + ) + + package_path = package.split(":")[1].split(".apk=")[0].strip() + package_path = "{}.apk".format(package_path) + print("Резервное копирование {} v{}...".format(package_name, package_version)) + + subprocess.call(["adb pull {} {}".format(package_path, dump_folder)], shell=True) + + os.rename( + os.path.join(dump_folder, os.path.basename(package_path)), + os.path.join(dump_folder, "{}-{}.apk".format(package_name, package_version)), + ) + +# резервное копирование appdata +print("Резервное копирование appdata.adb ...") +print('НАЖМИТЕ КНОПКУ "РЕЗЕРВИРОВАТЬ МОИ ДАННЫЕ" НА ЭКРАНЕ СЕЙЧАС !!!') +subprocess.call( + ["adb backup -f {}/appdata.adb -all -noapk -nosystem".format(dump_folder)], + shell=True, +) + +# отключение adb +print("Отключение...") +subprocess.check_output(["adb disconnect"], shell=True) +``` diff --git a/src/content/projects/ru/fl3xbl0w/decompiling.mdx b/src/content/projects/ru/fl3xbl0w/decompiling.mdx new file mode 100644 index 0000000..e8d103d --- /dev/null +++ b/src/content/projects/ru/fl3xbl0w/decompiling.mdx @@ -0,0 +1,57 @@ +--- +title: Декомпиляция - fl3xbl0w +description: Проект по реверс-инжинирингу. Началось все с беговой дорожки Bowflex Treadmill 22, но в итоге было обобщено для любого Android-устройства, продаваемого компанией Nautilus Inc. (Nautilus, Bowflex, Schwinn). +pubDate: 2022-05-28T10:28:00Z +link: /ru/projects/fl3xbl0w +img: ~/assets/images/project-fl3xbl0w.svg +imgAlt: логотип проекта fl3xbl0w +tags: + - ReverseEngineering + - Hardware + - Android +translatedBy: gpt-4-1106-preview +checksum: 8518d35224686427ed3a8679df5ba6f327c9f9e515bc86c0648d6f0ef5c44c0d +--- + +import { Image } from 'astro:assets'; +import JadxGUIScreen from '~/assets/images/fl3xbl0w/screen-jadx-init.png'; +import JadxGUISelect from '~/assets/images/fl3xbl0w/screen-jadx-open.png'; +import JadxGUIOpened from '~/assets/images/fl3xbl0w/screen-jadx-opened.png'; +import JadxGUISave from '~/assets/images/fl3xbl0w/screen-jadx-save.png'; +import JadxGUIPrefs from '~/assets/images/fl3xbl0w/screen-jadx-preferences.png'; + +Это предполагает, что у вас уже [есть свои собственные APK](/ru/projects/fl3xbl0w/backup). Имейте в виду, что, хотя я уточняю это для приложений Nautilus, это относится практически к любому Android-приложению, в которое вы хотите "заглянуть под капот". + +## Преобразование приложений в Java-код + +Следующие инструкции направлены на получение "читаемого кода", но вряд ли вы сможете скомпилировать их обратно в APK. Я использую это в качестве справки, чтобы понять разработчиков Nautilus. Если вы хотите изменить кодовую базу и переупаковать ее, перейдите к [Преобразованию приложений в Smali-код](#преобразование-приложений-в-smali-код). + +### Требования + +- [jadx](https://github.com/skylot/jadx) + +### Давайте откроем что-нибудь! + +После установки `jadx`, вы должны быть в состоянии открыть `jadx-gui`. Перейдите в Файл -> Открыть файлы... + +экран jadx-gui + +Найдите APK, который вы хотите, и нажмите на "Открыть файл": + +jadx-gui выбор apk + +И оттуда вы можете начать исследование: + +jadx-gui декомпиляция NautilusLauncher + +Если вы хотите сохранить проект как Java-файлы, перейдите в Файл -> Сохранить как gradle-проект: + +jadx-gui сохранение проекта + +Если это полезно, вот мои настройки `jadx-gui`: + +настройки jadx-gui + +## Преобразование приложений в Smali-код + +Сообщество проверило [это](https://www.reddit.com/r/Bowflex/comments/mi8wdo/unlocking_bowflex_velocore/) для применения некоторых патчей к нашим APK. Это будет работать только для несистемных приложений, так как без соответствующего ключа подписи приложение не будет иметь доступа к системным ресурсам (например, к последовательному порту). diff --git a/src/content/projects/ru/fl3xbl0w/jailbreak.mdx b/src/content/projects/ru/fl3xbl0w/jailbreak.mdx new file mode 100644 index 0000000..f0df582 --- /dev/null +++ b/src/content/projects/ru/fl3xbl0w/jailbreak.mdx @@ -0,0 +1,135 @@ +--- +title: Android Jailbreak - fl3xbl0w +description: Проект обратной инженерии. Началось все с беговой дорожки Bowflex Treadmill 22, но в итоге было обобщено для любого Android-устройства, продаваемого компанией Nautilus Inc. (Nautilus, Bowflex, Schwinn). +pubDate: 2022-05-28T10:28:00Z +link: /ru/projects/fl3xbl0w +img: ~/assets/images/project-fl3xbl0w.svg +imgAlt: логотип проекта fl3xbl0w +tags: + - ReverseEngineering + - Hardware + - Android +translatedBy: gpt-4-1106-preview +checksum: a77618521679b34a89354e6f2569cc84db8ffcb936c86608cc572c8cee531cc5 +--- + +import { Image } from 'astro:assets'; +import LogiKeys from '~/assets/images/fl3xbl0w/logi-keys.png'; +import ConsoleUSB from '~/assets/images/fl3xbl0w/console-usb.png'; +import Console01 from '~/assets/images/fl3xbl0w/console-01.gif'; +import Console02 from '~/assets/images/fl3xbl0w/console-02.gif'; +import Console03 from '~/assets/images/fl3xbl0w/console-03.gif'; +import Console04 from '~/assets/images/fl3xbl0w/console-04.gif'; +import Console05 from '~/assets/images/fl3xbl0w/console-05.gif'; +import Console06 from '~/assets/images/fl3xbl0w/console-06.gif'; +import Console07 from '~/assets/images/fl3xbl0w/console-07.gif'; +import Console08 from '~/assets/images/fl3xbl0w/console-08.gif'; + +Этот метод основан на том, что характеристики консоли Bowflex слишком слабы для современного программного обеспечения (на борту Android всего 2 Гб оперативной памяти). Именно поэтому, если мы действуем _быстрее планшета_, мы можем сделать jailbreak через `AppMonitorService` от Nautilus. + +_Можно ли это назвать атакой методом грубой силы?_ + +Вы можете перезагрузить машину в любой момент процесса, и все будет так, как должно быть. Нет риска для программного обеспечения при таких действиях. Попробуйте! + +## Требования + +- USB-клавиатура (проводная или беспроводная через USB-адаптер) с мультимедийными кнопками Home, Back. +- Быстрые пальцы! («интенсивная часть» должна произойти примерно за секунду) +- Компьютер с [adb](https://developer.android.com/studio/command-line/adb) ([ссылка для скачивания](https://developer.android.com/studio/releases/platform-tools)) + +Я использовал Logitech K600, но подойдет любая клавиатура с такими клавишами: + +клавиатура Logitech K600 + +_Клавиатуры Bluetooth, кажется, не могут подключаться через JRNY._ + +## Советы + +- Не пытайтесь «сделать все правильно» с первого раза. Нужно несколько попыток, чтобы понять «где кнопки появляются на экране», чтобы выработать мышечную память для действий по нажатию. +- НЕ БЕЙТЕ ПО ЭКРАНУ СИЛЬНО! Быстрота не означает разрушение. Я не несу ответственности за людей, слишком сильно ударяющих свои экраны. + +## Инструкции + +Сначала включим машину и подключим USB-клавиатуру к консоли Bowflex. Вы найдете ее с правой стороны: + +Указывает местоположение USB-порта консоли + +Убедимся, что клавиатура работает, нажав кнопку "Home" на клавиатуре. Это должно вызвать перезапуск приложения JRNY. + +анимация консоли + +В Android есть сочетание клавиш для закрытия текущего приложения через кнопку "Back", если удерживать ее в течение секунды или около того. +Поиграем немного с кнопкой "Back" - мы будем непрерывно закрывать приложение JRNY, как только оно снова откроется, пока не начнет появляться новый диалог: + +анимация консоли + +Хорошо, теперь веселая часть: Этот диалог принадлежит стандартной системе "проверки ошибок" Android. Мы просто "заставили Android думать", что NautilusLauncher плох (хорошо!). Давайте воспользуемся этим диалогом. + +Как только он появится, нажмите на "Информация о приложении". Нажав на "Информация о приложении", мы откроем приложение Настройки (которое находится в списке запрещенных `AppMonitorService`). Оно закроется примерно через секунду, поэтому нужно действовать быстро! Нажмите на кнопку "ОСТАНОВИТЬ ПРИНУДИТЕЛЬНО", а затем нажмите "ОК". + +анимация консоли + +Как только вы сможете нажать "ОК", вы можете отдохнуть (хорошая тренировка, правда?). Теперь давайте продолжим с открытиями на Reddit. Мы собираемся включить adb, нажав на значок "лупы" в правом верхнем углу и искать "Опции разработчика": + +анимация консоли + +Найдите IP-адрес консоли. Самый простой способ - через настройки Wi-Fi: + +анимация консоли + +Теперь, когда adb включен и у нас есть IP-адрес, перейдем к компьютеру и подключимся через adb. Откройте терминал и выполните `adb connect ` (в моем случае 10.0.0.205): + +```sh +> adb connect 10.0.0.205 +connected to 10.0.0.205:5555 +``` + +_При первом удаленном подключении через adb на экране будет запрошено подтверждение._ + +Давайте создадим пустой файл внутри `/sdcard/Pictures/` с именем `nautilus`. Вы можете узнать больше о "почему" в [Bowflex Quirks](/ru/projects/fl3xbl0w/quirks). + +```sh +> adb shell touch /sdcard/Pictures/nautilus +``` + +Теперь восстановим некоторые функции. Отправьте следующие команды через терминал: + +```sh +> adb shell settings put secure ntls_launcher_preference 0 +> adb shell settings put secure navigationbar_switch 1 +> adb shell settings put secure notification_switch 1 +> adb shell settings put secure statusbar_switch 1 +``` + +Вы увидите появление пользовательского интерфейса: + +анимация консоли + +Остался последний шаг - изменение стандартного лаунчера. Ищите "Приложения по умолчанию" и установите Quickstep как домашнее приложение: + +анимация консоли + +**Теперь вы свободны!** + +Это состояние сохранится до тех пор, пока NautilusLauncher будет принудительно остановлен. Оно сохраняется после перезагрузок. + +Если вы хотите вернуться к "стоковой" версии, просто откройте приложение `NautilusLauncher` (настоятельно рекомендую создать файл `/sdcard/Pictures/nautilus` заранее): + +анимация консоли + +## Заметки о "Системе Блокировки" + +`NautilusLauncher` является стандартным "Android лаунчером", что означает, что если приложение JRNY закрывается, оно немедленно "переоткроется". + +Есть еще один "замок безопасности", фоновый сервис в apk `NautilusLauncher`, называемый `AppMonitorService`. Декомпилируя apk, можно увидеть три интересные переменные: + +```java +public static final int MonitorIntervalSeconds = 1; +// Некоторые другие переменные +private static String[] TargtedAppsToKill = {"com.android.vending", "com.android.settings", "com.android.chrome", "com.google.android.gm", "com.google.android.youtube"}; +private static String[] TargtedAppsToBackground = {"com.google.android.googlequicksearchbox:interactor", "com.google.android.googlequicksearchbox:search", "com.google.android.googlequicksearchbox", "com.android.launcher3", "com.google.android.inputmethod.latin"}; +``` + +И таким образом, этот сервис "активно защищает" блокировку. С каждым закрытием приложения (через удержание кнопки "Back") будет попытка переоткрыть JRNY. Принудительно закрыв его, мы также деактивируем все фоновые сервисы. + +_(любые опечатки, которые вы можете видеть в резервных копиях кода, исходят от самих разработчиков Nautilus, а не от меня)_ diff --git a/src/content/projects/ru/fl3xbl0w/quirks.mdx b/src/content/projects/ru/fl3xbl0w/quirks.mdx new file mode 100644 index 0000000..2a69159 --- /dev/null +++ b/src/content/projects/ru/fl3xbl0w/quirks.mdx @@ -0,0 +1,124 @@ +--- +title: Особенности Bowflex - fl3xbl0w +description: Проект по реверс-инжинирингу. Начался с беговой дорожки Bowflex Treadmill 22, но в итоге был обобщен для любого Android-устройства, продаваемого компанией Nautilus Inc. (Nautilus, Bowflex, Schwinn). +pubDate: 2022-05-28T10:28:00Z +link: /ru/projects/fl3xbl0w +img: ~/assets/images/project-fl3xbl0w.svg +imgAlt: логотип проекта fl3xbl0w +tags: + - ReverseEngineering + - Hardware + - Android +translatedBy: gpt-4-1106-preview +checksum: b579f6715ec7bbcf25b8db49cedec3e9eeeac50513672a0984304f94203d593a +--- + +import { Image } from 'astro:assets'; +import HomeAssistantSensor from '~/assets/images/fl3xbl0w/homeassistant-hr-sensor.png'; + +### Файл `/sdcard/Pictures/nautilus` + +При декомпиляции `NautilusLauncher` можно увидеть ссылки на этот конкретный путь: + +```java +// путь: com/nautilus/nautiluslauncher/LauncherService.java +public void run() { + if (!new File("/sdcard/Pictures/nautilus").exists()) { + LauncherService.access$000(LauncherService.this).disableAdbDebug(); + LauncherService.access$000(LauncherService.this).enterKioskMode(); + return; + } + LauncherService.access$000(LauncherService.this).enableAdbDebug(); +} +``` + +```java +// путь: com/nautilus/nautiluslauncher/MainActivity.java +protected void onCreate(Bundle bundle) { + // ... + if (!new File("/sdcard/Pictures/nautilus").exists()) { + this.mPlatformControl.disableAdbDebug(); + this.mPlatformControl.enterKioskMode(); + } else { + this.mPlatformControl.enableAdbDebug(); + } + // ... +} +``` + +Эффект от размещения файла на его месте заключается в том, что `NautilusLauncher` будет активировать adb после каждой перезагрузки. Если файла НЕТ на месте, `NautilusLauncher` будет АКТИВНО ОТКЛЮЧАТЬ adb (если он был ранее включен). + +### Файл `/sdcard/Nautilus/redbend/Credentials.txt` + +Похоже, что [Red Bend Software](https://en.wikipedia.org/wiki/Red_Bend_Software) ([приобретенная Harman](https://news.harman.com/releases/harman-completes-acquisition-of-redbend), теперь я понимаю, **почему** столько ссылок на KNOX) предоставляет услуги OTA для оборудования Nautilus. Я нашел некоторые ссылки на этот файл внутри `com.redbend.client.apk`. + +```java +package com.redbend.client; +public class Ipl { + protected static final String AUTO_SELF_REG_FILE_PATH = "Credentials.txt"; + // ... + public static int iplGetAutoSelfRegDomainInfo(Context context, String[] strArr) { + // ... + File file = new File("/sdcard/Nautilus/redbend/"); + if (!file.exists()) { + file.mkdirs(); + } + copyAssets(context, "Credentials.txt", file.getCanonicalPath()); + bufferedReader = new BufferedReader(new FileReader(new File(file.getAbsoluteFile(), "Credentials.txt"))); + // ... + } + // ... +} +``` + +Также в `com.redbend.client.ClientService` мы можем найти: + +```java +// ... +public class ClientService extends SmmService { + // ... + @Override // com.redbend.app.SmmService, android.app.Service + public void onCreate() { + // ... + if (Ipl.iplGetAutoSelfRegDomainInfo(this, strArr) == 0) { + sendEvent(new Event("D2B_AUTO_SELF_REG_INFO").addVar(new EventVar("DMA_VAR_AUTO_SELF_REG_DOMAIN_NAME", strArr[0])).addVar(new EventVar("DMA_VAR_AUTO_SELF_REG_DOMAIN_PIN", strArr[1]))); + } + // ... + } + // ... +} +``` + +Исходя из этой информации, мы можем пометить содержимое файла `/sdcard/Nautilus/redbend/Credentials.txt` как: + +``` +Первая строка: DOMAIN_NAME +Вторая строка: DOMAIN_PIN +``` + +_`DOMAIN_PIN` похоже на реальный пин-код, так как это шестизначное число._ + +Есть некоторые учетные данные в "Сети Red Bend" для ассоциации машины с определенным брендом/продуктом для OTA обновлений. Я надеюсь, что эти учетные данные ИДЕНТИЧНЫ для всего оборудования Nautilus. Файл включен в APK `com.redbend.client` и извлекается при установке. + +Я нашел ссылки на `com.redbend.client` [здесь](https://www.mdxers.org/threads/com-redbend-clent-has-stopped.175897/), и мне показалось довольно забавным видеть его сбои в машине. Я надеюсь, что он не сбоит так часто в наших устройствах. + +### Монитор сердечного ритма Bluetooth + +Это было довольно просто расшифровать. Имя Bluetooth появляется как `CL831-xxxxxxx` _(номер скрыт)_ от [CHILEAF](https://www.chileaf.com/copy-cl830-health-monitor-armband-heart-rate-monitor-product/). + +При сканировании через [nRF Connect](https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-mobile), MAC-адрес устройства и некоторые ключевые данные были раскрыты: + +``` +Сердечный ритм: +UUID: 0x180D +Измерение сердечного ритма +UUID: 0x2A37 +``` + +Это казалось довольно стандартным, и [пост](https://community.home-assistant.io/t/ble-heartrate-monitor/300354/39) из сообщества Home Assistant уже разобрался в этом (не та же модель, но похоже, что монитор сердечного ритма использует стандартный протокол). Я создал файл конфигурации ESPHome [здесь](https://github.com/barrenechea/esphome-config-files/blob/master/bowflex-hr-monitor.yaml) в качестве концепции: + +Скриншот Home Assistant с монитором сердечного ритма diff --git a/src/content/projects/ru/fl3xbl0w/romdump.mdx b/src/content/projects/ru/fl3xbl0w/romdump.mdx new file mode 100644 index 0000000..bb9419b --- /dev/null +++ b/src/content/projects/ru/fl3xbl0w/romdump.mdx @@ -0,0 +1,163 @@ +--- +title: дамп ROM - fl3xbl0w +description: Проект по реверс-инжинирингу. Началось все с беговой дорожки Bowflex Treadmill 22, но в итоге было обобщено для любого Android устройства, продаваемого компанией Nautilus Inc. (Nautilus, Bowflex, Schwinn). +pubDate: 2022-05-28T10:28:00Z +link: /ru/projects/fl3xbl0w +img: ~/assets/images/project-fl3xbl0w.svg +imgAlt: логотип проекта fl3xbl0w +tags: + - ReverseEngineering + - Hardware + - Android +translatedBy: gpt-4-1106-preview +checksum: 6a0c1a15841526a3a7105047f409e1344aaceeb86d8e0b9446035f4ce1114c35 +--- + +import { Image } from 'astro:assets'; +import ConsoleMounted from '~/assets/images/fl3xbl0w/console-mounted.jpg'; +import VantronPCB from '~/assets/images/fl3xbl0w/vantron-pcb.jpg'; + +### Режим загрузчика Rockchip + +Аппаратное обеспечение Android работает на процессоре RK3399. Процессоры Rockchip имеют стандартный "режим загрузчика". + +Инструментарий, который я использовал: + +- Rockchip Driver Assistant v4.5 от [ChinaGadgetsReviews](https://chinagadgetsreviews.com/?s=Rockchip+Driver+Assistant) +- rkDumper 1.09 test из [этого поста на XDA](https://forum.xda-developers.com/t/tool-rkdumper-utility-for-backup-firmware-of-rockchips-devices.2915363/page-9#post-84229591) +- Android Tool Release v2.69 от [ChinaGadgetsReviews](https://chinagadgetsreviews.com/?s=android+tool+release) + +_Существует более новая версия драйвера для скачивания, но она известна своей несовместимостью с rkDumper._ + +Чтобы поиграть с этим, вам придется разобрать консоль Bowflex, открутить пластиковую заднюю крышку и собрать ее в "голом виде". +**Не пытайтесь этого делать, так как работа с аппаратным обеспечением Android в режиме загрузчика может привести к необратимому повреждению устройства.** + +Консоль с снятой задней крышкой + +Вот соответствующие части платы логики Android для вещей Rockchip: + +Печатная плата Vantron + +Вы можете держать приложение Android Tool Release открытым все время, чтобы использовать его в качестве справки и проверять, в каком режиме находится консоль. + +Когда машина включена в "нормальном режиме" и подключена к компьютеру, она идентифицируется как `NFTM-LAR`: + +``` +NFTM-LAR: + Product ID: 0x0001 + Vendor ID: 0x2207 (Fuzhou Rockchip Electronics Co., Ltd.) + Version: 3.10 + Speed: до 480 Мб/с + Manufacturer: Vanzo + Location ID: 0x14120000 / 9 + Current Available (mA): 500 + Current Required (mA): 500 + Extra Operating Current (mA): 0 +``` + +Когда машина выключена, подключена через USB к компьютеру, удерживается кнопка "Восстановление" и включается, она должна загрузиться в "режим загрузчика". Машина "издаст звук", но экран останется статичным. _Вы можете выключить, подождать минуту, включить, и машина загрузится нормально._ + +_Аппаратное обеспечение Android не обрабатывает "звук" после включения машины, но через другие платы Nautilus._ + +Теперь она будет отображаться на компьютере как `USB download gadget` (серийный номер скрыт): + +``` +USB download gadget: + Product ID: 0x330c + Vendor ID: 0x2207 (Fuzhou Rockchip Electronics Co., Ltd.) + Version: 99.99 + Serial Number: XXXXXXXXXXXXXXX + Manufacturer: Rockchip + Location ID: 0x14120000 +``` + +После запуска rkDumper против консоли мы получаем информацию о разделах: + +``` +"EFI PART" sign found (RKFP FW dump) + +Partition "EFI_part" (0x00004000) saved (format: RockChip RKFP dump) +Partition "uboot_a" (0x00002000) saved (format: Rockchip uboot image file) +Partition "uboot_b" (0x00002000) saved (format: Rockchip uboot image file) +Partition "trust_a" (0x00002000) saved (format: unknown) +Partition "trust_b" (0x00002000) saved (format: unknown) +Partition "misc" (0x00002000) saved (format: unknown) +Partition "resource" (0x00008000) saved (format: unknown) +Partition "kernel" (0x00010000) saved (format: unknown) +Partition "dtb" (0x00002000) saved (format: unknown) +Partition "dtbo_a" (0x00002000) saved (format: unknown) +Partition "dtbo_b" (0x00002000) saved (format: unknown) +Partition "vbmeta_a" (0x00000800) saved (format: unknown) +Partition "vbmeta_b" (0x00000800) saved (format: unknown) +Partition "boot_a" (0x00020000) saved (format: unknown) +Partition "boot_b" (0x00020000) saved (format: unknown) +Partition "backup" (0x00038000) saved (format: unknown) +Partition "security" (0x00002000) saved (format: unknown) +Partition "cache" (0x00100000) saved (format: unknown) +Partition "system_a" (0x00500000) saved (format: unknown) +Partition "system_b" (0x00500000) saved (format: unknown) +Partition "metadata" (0x00008000) saved (format: unknown) +Partition "vendor_a" (0x00100000) saved (format: unknown) +Partition "vendor_b" (0x00100000) saved (format: unknown) +Partition "oem_a" (0x00100000) saved (format: unknown) +Partition "oem_b" (0x00100000) saved (format: unknown) +Partition "frp" (0x00000400) saved (format: unknown) +Partition "sw_release" (0x00ed7000) saved (format: unknown) +Partition "video" (0x0047e000) saved (format: unknown) +Partition "userdata" (0x0169bbdf) saved (format: unknown) +``` + +`uboot_a` и `uboot_b` были успешно извлечены, но все остальные разделы, помеченные как `(format: unknown)`, плохо скопированы, из них извлечены только шестнадцатеричные значения `CC`. + +Похожий случай, как у меня, был задокументирован на [4pda](https://4pda.to/forum/index.php?s=&showtopic=614530&view=findpost&p=102427030), и после [вопроса](https://forum.xda-developers.com/t/tool-rkdumper-utility-for-backup-firmware-of-rockchips-devices.2915363/page-11#post-86678625) разработчику rkDumper, [он говорит](https://forum.xda-developers.com/t/tool-rkdumper-utility-for-backup-firmware-of-rockchips-devices.2915363/page-11#post-86687085), что должен быть установлен новый загрузчик RockChip. Следование этому методу пока кажется невозможным. + +### ADB + +Некоторые похожие данные можно найти через adb, но кажется невозможным сделать резервную копию, так как у нас нет прав root: + +```sh +> ls -al /dev/block/platform/ +total 0 +drwxr-xr-x 3 root root 60 2022-04-13 19:38 . +drwxr-xr-x 5 root root 1300 2022-04-13 19:38 .. +drwxr-xr-x 3 root root 700 2022-04-13 19:38 fe330000.sdhci +``` + +```sh +> ls -al /dev/block/platform/fe330000.sdhci/by-name/ +total 0 +drwxr-xr-x 2 root root 600 2022-04-13 19:38 . +drwxr-xr-x 3 root root 700 2022-04-13 19:38 .. +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 backup -> /dev/block/mmcblk0p15 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 boot_a -> /dev/block/mmcblk0p13 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 boot_b -> /dev/block/mmcblk0p14 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 cache -> /dev/block/mmcblk0p17 +lrwxrwxrwx 1 root root 20 2022-04-13 19:38 dtb -> /dev/block/mmcblk0p8 +lrwxrwxrwx 1 root root 20 2022-04-13 19:38 dtbo_a -> /dev/block/mmcblk0p9 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 dtbo_b -> /dev/block/mmcblk0p10 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 frp -> /dev/block/mmcblk0p25 +lrwxrwxrwx 1 root root 20 2022-04-13 19:38 kernel -> /dev/block/mmcblk0p7 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 metadata -> /dev/block/mmcblk0p20 +lrwxrwxrwx 1 root root 20 2022-04-13 19:38 misc -> /dev/block/mmcblk0p5 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 oem_a -> /dev/block/mmcblk0p23 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 oem_b -> /dev/block/mmcblk0p24 +lrwxrwxrwx 1 root root 20 2022-04-13 19:38 resource -> /dev/block/mmcblk0p6 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 security -> /dev/block/mmcblk0p16 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 sw_release -> /dev/block/mmcblk0p26 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 system_a -> /dev/block/mmcblk0p18 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 system_b -> /dev/block/mmcblk0p19 +lrwxrwxrwx 1 root root 20 2022-04-13 19:38 trust_a -> /dev/block/mmcblk0p3 +lrwxrwxrwx 1 root root 20 2022-04-13 19:38 trust_b -> /dev/block/mmcblk0p4 +lrwxrwxrwx 1 root root 20 2022-04-13 19:38 uboot_a -> /dev/block/mmcblk0p1 +lrwxrwxrwx 1 root root 20 2022-04-13 19:38 uboot_b -> /dev/block/mmcblk0p2 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 userdata -> /dev/block/mmcblk0p28 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 vbmeta_a -> /dev/block/mmcblk0p11 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 vbmeta_b -> /dev/block/mmcblk0p12 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 vendor_a -> /dev/block/mmcblk0p21 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 vendor_b -> /dev/block/mmcblk0p22 +lrwxrwxrwx 1 root root 21 2022-04-13 19:38 video -> /dev/block/mmcblk0p27 +``` + +### Другие идеи + +То, что мы можем сделать, это выпаять чип eMMC и прочитать его внешне, чтобы иметь возможность резервного копирования всего его содержимого. Это было бы хорошо для создания пользовательской прошивки, но я не буду выпаивать из моей ЕДИНСТВЕННОЙ консоли (было бы здорово иметь запасную). diff --git a/src/content/projects/ru/fl3xbl0w/treadmotor.mdx b/src/content/projects/ru/fl3xbl0w/treadmotor.mdx new file mode 100644 index 0000000..99d9a63 --- /dev/null +++ b/src/content/projects/ru/fl3xbl0w/treadmotor.mdx @@ -0,0 +1,61 @@ +--- +title: Контроллер двигателя беговой дорожки - fl3xbl0w +description: Проект обратной разработки. Началось все с беговой дорожки Bowflex Treadmill 22, но в итоге было обобщено для любой Android-машины, продаваемой компанией Nautilus Inc. (Nautilus, Bowflex, Schwinn). +pubDate: 2022-05-28T10:28:00Z +link: /ru/projects/fl3xbl0w +img: ~/assets/images/project-fl3xbl0w.svg +imgAlt: логотип проекта fl3xbl0w +tags: + - ReverseEngineering + - Hardware + - Android +translatedBy: gpt-4-1106-preview +checksum: 125dc0e721ef19aa62fa8845e79be4ef5b64f512cce349577c197254e25cf4bd +--- + +import { Image } from 'astro:assets'; +import B017D from '~/assets/images/fl3xbl0w/b017d.jpg'; +import TreadmillElectrical from '~/assets/images/fl3xbl0w/treadmill-electrical.png'; +import TreadmillComm from '~/assets/images/fl3xbl0w/treadmill-comm.png'; +import Molex from '~/assets/images/fl3xbl0w/molex.jpg'; + +_Это в основном относится к Treadmill 22 & Treadmill 56._ + +Плата управления двигателем производится компанией [Electronics Way Industry](https://web.archive.org/web/20231228174313/https://www.ewayindustry.com/ew-dc-b017.html). + +Контроллер платы управления двигателем B017D + +Исходя из [руководства по обслуживанию](https://download.nautilus.com/supportdocs/AM_OM/Bowflex/BFX.T10.T22.T25.T56.SM.EN.pdf), предоставленного компанией Nautilus Inc. ([резервная копия на archive.org](https://web.archive.org/web/20220409140737/https://download.nautilus.com/supportdocs/AM_OM/Bowflex/BFX.T10.T22.T25.T56.SM.EN.pdf)): + +Электрическая схема беговой дорожки + +И сосредоточив внимание конкретно на этой части: + +Путь коммуникации беговой дорожки + +Мы можем идентифицировать "кабель связи", который соединяет контроллер двигателя, как 5-контактный. Есть только один 5-контактный разъем. +Я пометил провода их соответствующими цветами (данные и переключатель оптоизолированы): + +| цвет провода | метка | +| ------------ | ----- | +| красный | GND | +| белый | RXD | +| черный | TXD | +| желтый | +12 | +| зеленый | SW | + +Плата не подключена напрямую к Android-консоли. + +Единственный 5-контактный разъем - это разъем бренда Molex. Поиск в Google "маленькие разъемы Molex" привел меня к изображению того, что они называют `Molex Micro-Fit 3.0 Single Row (5-Pin)`, который используется для подключения платы контроллера двигателя: + +Разъем Molex Micro-Fit 3.0 + +[Ссылка на AliExpress](https://aliexpress.com/item/32902205579.html) + +Рассматривая `NautilusLauncher.apk` через `jadx-gui`, я вижу, что они общаются с Android-планшетом с помощью их "Универсальной консоли" используя Serial на 230400 Baud (используя `/dev/ttyS4`). Но это НЕ то, что мы анализируем здесь. Это относится к коммуникации между Android и "Универсальной консолью". Мы исследуем связь между "Универсальной консолью" и "Платой управления двигателем". + +Попытка подключить ESP32 или серийный мост на базе CH340 напрямую к проводам между основанием беговой дорожки и платой контроллера Bowflex привела к тому, что основание беговой дорожки не инициализировалось правильно, поэтому я начал подозревать, что они используют RS232. + +Примечание: Подключившись только к GND и RXD, мы можем "увидеть" некоторую кажущуюся мусорной шестнадцатеричную информацию на скорости 9600 бод. Подключение к TXD приводит к тому, что основание беговой дорожки не инициализируется. + +-- Продолжение следует, мне нужно немного времени, чтобы поиграть с моим новым логическим анализатором -- diff --git a/src/content/projects/ru/openhaystack-esphome.mdx b/src/content/projects/ru/openhaystack-esphome.mdx new file mode 100644 index 0000000..3483b1f --- /dev/null +++ b/src/content/projects/ru/openhaystack-esphome.mdx @@ -0,0 +1,113 @@ +--- +title: OpenHaystack в ESPHome +description: Порт OpenHaystack как компонент ESPHome. Совместим со всеми устройствами Espressif BLE. +pubDate: 2022-06-23T10:42:00Z +link: https://github.com/barrenechea/esphome-config-files/tree/main/components/openhaystack +img: ~/assets/images/project-openhaystack.png +imgAlt: Логотипы OpenHaystack и ESPHome +tags: + - Hardware + - Embedded +translatedBy: gpt-4-1106-preview +checksum: 3d98279a41f3f41bf8b90d213cc20a02d8083438c29b65e9f8ae8d2d96d8a017 +--- + +[OpenHaystack](https://github.com/seemoo-lab/openhaystack) — это приложение, которое позволяет вам создавать собственные аксессуары, отслеживаемые сетью [Find My от Apple](https://developer.apple.com/find-my/). Они обратно разработали протокол Apple и задокументировали его, что является весьма впечатляющим проектом. + +Я хотел отслеживать свой электрический скутер на случай кражи. Хотя "официальный" способ создания аксессуаров был "приемлемым", оказалось, что он довольно проблематичен из-за нескольких проблем совместимости на разных платах Espressif. + +Поэтому я портировал его как компонент [ESPHome](https://esphome.io/), программного обеспечения, которое я уже использую для своих нужд в области встроенных устройств. + +## Почему ESPHome? Разве это не "для дома"? + +Я _немного_ одержим поддержанием моих IoT/встроенных устройств в актуальном состоянии (и, конечно же, вне любого облака, если возможно), поэтому ESPHome является привлекательным решением для обновления ваших устройств с помощью фреймворков Arduino и Espressif. Через ESPHome я могу "обновлять" свой скутер, когда захочу. + +## Почему это не официальный компонент? + +Я пытался! Я открыл [Add support for OpenHaystack #3584](https://github.com/esphome/esphome/pull/3584) и его [документацию поддержки](https://deploy-preview-2146--esphome.netlify.app/components/openhaystack.html), но понятно, что они не хотели его объединять. + +## Пример ESPHome - ESP32 + +```yaml +external_components: + - source: + type: git + url: https://github.com/barrenechea/esphome-config-files + ref: main + components: [openhaystack] + +esphome: + name: openhaystack-demo + +esp32: + board: wemos_d1_mini32 + +wifi: + ssid: <ваш-wifi-ssid> + password: <ваш-wifi-пароль> + +# Включить логи +logger: + +# Включить API Home Assistant +api: + +ota: + password: !secret ota_password + +openhaystack: + # Сюда идет ключ OpenHaystack, закодированный в Base64 + # Я настоятельно рекомендую обрабатывать его как секрет + key: !secret openhaystack_key +``` + +## Пример ESPHome - ESP32-C3 + +```yaml +external_components: + - source: + type: git + url: https://github.com/barrenechea/esphome-config-files + ref: main + components: [openhaystack] + +esphome: + name: openhaystack-demo + platformio_options: + board_build.flash_mode: dio + +esp32: + board: esp32-c3-devkitm-1 + variant: ESP32C3 + framework: + type: esp-idf + version: latest + sdkconfig_options: + CONFIG_FREERTOS_UNICORE: y + CONFIG_COMPILER_OPTIMIZATION_SIZE: y + # Включить поддержку WPA3 просто потому, что мы можем + CONFIG_WPA_SUITE_B_192: y + # Специфика для использования Bluetooth + CONFIG_BT_BLE_50_FEATURES_SUPPORTED: y + CONFIG_BT_BLE_42_FEATURES_SUPPORTED: y + # Исправить "Ошибка размера полезной нагрузки" - Увеличить тайм-аут Watchdog + CONFIG_ESP_TASK_WDT_TIMEOUT_S: '10' + +wifi: + ssid: <ваш-wifi-ssid> + password: <ваш-wifi-пароль> + +# Включить логи +logger: + +# Включить API Home Assistant +api: + +ota: + password: !secret ota_password + +openhaystack: + # Сюда идет ключ OpenHaystack, закодированный в Base64 + # Я настоятельно рекомендую обрабатывать его как секрет + key: !secret openhaystack_key +``` diff --git a/src/content/projects/ru/proverbia.mdx b/src/content/projects/ru/proverbia.mdx new file mode 100644 index 0000000..cf8d822 --- /dev/null +++ b/src/content/projects/ru/proverbia.mdx @@ -0,0 +1,19 @@ +--- +title: Скрипт Puppeteer Proverbia +description: Скрипт Puppeteer для получения "Цитаты дня" с сайта Proverbia и возвращения ее в виде JSON-ответа через консоль (stdout). +pubDate: 2021-06-26T12:49:00Z +link: https://github.com/barrenechea/puppeteer-proverbia-script +img: ~/assets/images/project-proverbia.png +imgAlt: Логотипы Puppeteer и Proverbia +tags: + - WebScraping + - TypeScript +translatedBy: gpt-4-1106-preview +checksum: 8f8f90b9dea64581151947921cf48cb8e0f779b5d1ff04aa0e63f8e449c5d9e5 +--- + +[Proverbia](https://proverbia.net) — это испанская коллекция известных цитат, поговорок, пословиц и афоризмов, организованная по темам и авторам. Это бесплатный сайт для вашего посещения, но они не предлагают никакого API для его использования. + +Я хотел разработать бота для Telegram, который доставлял бы пользователю "Цитату дня" с Proverbia, когда тот отправлял сообщение. Поэтому мне нужен был чистый способ программного запроса их цитат. + +И вот этот проект именно это и делает, и является быстрым и дружелюбным примером для демонстрации возможностей Puppeteer. diff --git a/src/content/projects/ru/textual.mdx b/src/content/projects/ru/textual.mdx new file mode 100644 index 0000000..720af69 --- /dev/null +++ b/src/content/projects/ru/textual.mdx @@ -0,0 +1,21 @@ +--- +title: Пайплайн Textual +description: Пайплайн GitHub Actions, который компилирует приложение Textual и также отключает его Менеджер Лицензий. +pubDate: 2022-03-17T18:41:00Z +link: https://github.com/barrenechea/Textual +img: ~/assets/images/project-textual.svg +imgAlt: Логотип приложения Textual +tags: + - Пайплайны + - Xcode +translatedBy: gpt-4-1106-preview +checksum: e6a75557647c0a08034a8711aa498f98840360f35ea417b5421e3e5baa533c37 +--- + +[Textual](https://www.codeux.com/textual) — это клиент [IRC](https://ru.wikipedia.org/wiki/Internet_Relay_Chat) для macOS. Я открыл для себя IRC, когда был ребенком. В то время это было для меня открытием, что можно общаться с случайными людьми со всего мира. + +В начале 2022 года я установил [OpenWRT](https://openwrt.org) на точку доступа Ubiquiti и увидел, что у них есть присутствие в сети [OFTC](https://www.oftc.net), и я подумал, что Textual — это отличный клиент IRC («апгрейд» моего старого комбо [mIRC](https://www.mirc.com)/[IRcap](https://www.ircap.com)). + +Технически Textual бесплатен (так как это проект с открытым исходным кодом), но в нем есть то, что они называют «Менеджер Лицензий», единственная цель которого — поддержка разработчиков проекта. К счастью, это всего лишь пара переменных, которые я настроил во время выполнения пайплайна, чтобы деактивировать его. + +Это был просто небольшой веселый проект для меня, чтобы проверить мои навыки работы с пайплайнами и бинарными файлами macOS. Textual крут. Вы определенно должны их поддержать. diff --git a/src/i18n/ru.ts b/src/i18n/ru.ts new file mode 100644 index 0000000..7ca6e93 --- /dev/null +++ b/src/i18n/ru.ts @@ -0,0 +1,68 @@ +import { es, type OptionalTranslations } from './es.ts'; + +export const ru: OptionalTranslations = { + 'author.name': 'Себастьян Барренечеа', + + 'nav.fork': 'Fork на GitHub', + 'nav.sr.open': 'Открыть навигационное меню', + 'nav.home': 'Главная', + 'nav.projects': 'Проекты', + 'nav.posts': 'Посты', + 'nav.page': 'Страница', + 'nav.language.select': 'Выбрать язык', + + 'hero.greeting': 'Привет! Я', + 'hero.description': 'Программист из Чили 🇨🇱', + 'hero.doing': + 'Вы можете найти меня, играющим с концепциями, новейшими технологиями и изучением увлекательного мира моделей машинного обучения.', + 'hero.currentEmployment': 'В настоящее время я работаю в компании', + 'hero.currentTeam': 'в команде DevOps', + 'hero.avatar.alt': 'Аватар, созданный с помощью ИИ', + 'hero.avatar.with': 'с', + + 'home.recentProjects': 'Недавние', + 'home.recentProjects.viewAll': 'Смотреть все проекты', + 'home.recentPosts': 'Недавние', + 'home.recentPosts.viewAll': 'Смотреть все посты', + + 'blog.translatedBy': 'Перевод выполнен', + + 'posts.paginationDescription': + 'Результаты моих мыслительных процессов, которые у меня случаются время от времени', + 'posts.by': 'Автор', + 'posts.on': 'на', + 'posts.pagination.older': 'Старые посты', + 'posts.pagination.newer': 'Новые посты', + + 'projects.paginationDescription': + 'Не обязательно всё, что я сделал, но то, что мне законно разрешено поделиться 😄', + 'projects.releasedOn': 'Выпущено', + 'projects.go': 'Перейти', + 'projects.pagination.older': 'Старые проекты', + 'projects.pagination.newer': 'Новые проекты', + + 'tags.Containers': 'Контейнеры', + 'tags.Architecture': 'Архитектура', + 'tags.Pipelines': 'Пайплайны', + 'tags.WebScraping': 'Веб-скрапинг', + 'tags.Blog': 'Блог', + 'tags.ReverseEngineering': 'Реверс-инжиниринг', + 'tags.Hardware': 'Аппаратное обеспечение', + 'tags.Embedded': 'Встроенные системы', + 'tags.undefined': 'неопределённый TAG', + + '404.title': 'Страница не найдена', + '404.description': 'Страница, которую вы ищете, не существует.', + '404.heading': 'Чего-то не хватает', + '404.body': + 'Страница, которую вы ищете, не существует. Возможно, вы неправильно ввели адрес или страница была перемещена.', + '404.back': 'Вернуться на главную страницу', + + 'footer.rights': 'Все права защищены', + 'footer.built': 'Создано с использованием', +}; + +// Default to Spanish translations if a key is missing +export const ruWithFallback: { [Key in keyof typeof es]: string } = new Proxy(ru, { + get: (target, name: keyof typeof es) => target[name] ?? es[name], +}) as { [Key in keyof typeof es]: string }; diff --git a/src/i18n/translations.ts b/src/i18n/translations.ts index d5d1ade..a9b1d8f 100644 --- a/src/i18n/translations.ts +++ b/src/i18n/translations.ts @@ -4,6 +4,7 @@ import deIcon from '@iconify-icons/circle-flags/de.js'; import frIcon from '@iconify-icons/circle-flags/fr.js'; import isIcon from '@iconify-icons/circle-flags/is.js'; import itIcon from '@iconify-icons/circle-flags/it.js'; +import ruIcon from '@iconify-icons/circle-flags/ru.js'; import saIcon from '@iconify-icons/circle-flags/sa.js'; import usIcon from '@iconify-icons/circle-flags/us.js'; import zhIcon from '@iconify-icons/circle-flags/zh.js'; @@ -16,6 +17,7 @@ import { frWithFallback } from './fr.ts'; import { isWithFallback } from './is.ts'; import { itWithFallback } from './it.ts'; import { ptWithFallback } from './pt.ts'; +import { ruWithFallback } from './ru.ts'; import { zhWithFallback } from './zh.ts'; export const languages = { @@ -39,6 +41,11 @@ export const languages = { icon: deIcon, translateFrom: 'en', }, + ru: { + label: 'Русский', + icon: ruIcon, + translateFrom: 'en', + }, zh: { label: '简体中文', icon: zhIcon, @@ -73,6 +80,7 @@ const langData = { en: enWithFallback, pt: ptWithFallback, de: deWithFallback, + ru: ruWithFallback, zh: zhWithFallback, ar: arWithFallback, fr: frWithFallback, diff --git a/src/pages/open-graph/[...path].ts b/src/pages/open-graph/[...path].ts index 1046125..7e40bcb 100644 --- a/src/pages/open-graph/[...path].ts +++ b/src/pages/open-graph/[...path].ts @@ -12,6 +12,7 @@ const descriptions = { en: 'Welcome to the official website of Sebastian Barrenechea. Discover my diverse range of personal projects and delve into thought-provoking blog posts.', pt: 'Bem-vindo ao site oficial de Sebastián Barrenechea. Descubra minha ampla gama de projetos pessoais e mergulhe em postagens de blog que convidam à reflexão.', de: 'Willkommen auf der offiziellen Website von Sebastian Barrenechea. Entdecken Sie meine vielfältige Palette an persönlichen Projekten und tauchen Sie ein in nachdenkliche Blog-Beiträge.', + ru: 'Добро пожаловать на официальный сайт Себастьян Барренечеа. Ознакомьтесь с моим разнообразным спектром личных проектов и погрузитесь в размышления, которые призывают к размышлению.', zh: '欢迎来到Sebastian Barrenechea的官方网站。发现我各种各样的个人项目,并深入思考引人深思的博客文章。', ar: 'مرحبًا بكم في الموقع الرسمي لسيباستيان بارينيشيا. استكشفوا مجموعتي المتنوعة من المشاريع الشخصية واستمتعوا بقراءة التدوينات التي تحفز التفكير.', fr: 'Bienvenue sur le site officiel de Sebastián Barrenechea. Découvrez ma gamme diversifiée de projets personnels et plongez dans des articles de blog qui invitent à la réflexion.',