Лаунчер Minecraft [TLauncher 2.885] [Windows/MacOS/Linux]
Linux/MacOS:
Загрузить TLauncher Beta.jar
[5 Mb]
Существует так же лаунчер для Minecraft: Pocket Edition под названием TLauncher PE ! С ним можно установить моды, текстуры, скины, карты и сиды в один клик.
TLauncher 2.4
После версии 1.6, разработчики представили новый официальный лаунчер, который поставил крест на пиратах, но мы спасём Вас, выложив отличную альтернативу. Он намного лучше, чем даже от разработчиков игры, так как в нём всё намного стабильнее, больше настроек и функций. Поэтому, вам стоит обратить внимание на этот Лаунчер для Minecraft.
Вопрос: Есть ли в лаунчере вирусы?
Ответ: Естественно нет! Мы добропорядочный сайт, которому доверяют множество пользователей. Все антивирусы считают, что данный файл безопасен, поэтому причин для волнения не должно быть. Чтобы удостовериться в этом, можете посмотреть отчёт антивирусов ТУТ .
Вопрос: Раньше работал лаунчер/игра, теперь нет, что делать?
Ответ: Попробуйте полностью удалить папку с майнкрафтом, только перед этим сохраните ваши миры из папки saves (Полный путь к папке с игрой — c:\Users\ИМЯ Пользователя\AppData\Roaming\.minecraft\), далее нужно заново скачать TLauncher по ссылкам выше и попробуйте теперь запустить игру/лаунчер.
Вопрос: Я скачал и попытался запустить программу, но высветила какая-то ошибка связанная с Java, что мне делать?
Ответ: Видно у вас не стоит или не последняя версия Java, скачать её можно с нашего сайта или с официального .
Вопрос: У меня нет версий в списке — «не установлено», новости не грузятся, как исправить?:
Ошибка соединения TLauncher 2.0
Ответ: У вас отсутствует подключение к интернету или антивирус и брандмауэр блокируют соединение. Поэтому добавьте лаунчер в исключения антивируса и брандмауэра. П.С. Не помогло? Попробуйте перекачать лаунчер по ссылке в начале новости, мало ли.
Вопрос: Какие именно версии Майнкрафт присутствуют в данном лаунчере?
Ответ: В нём есть абсолютно все, от самых старых до последних версий (Как например новый Minecraft 1.15). А так же есть Forge 1.14.4, Optifine 1.14.4, Forge 1.13.2, OptiFine 1.13.2, OptiFine 1.13.1, OptiFine 1.13, OptiFine 1.12, Forge 1.12, OptiFine 1.11, Forge 1.11, OptiFine 1.10.2, Forge 1.10.2, OptiFine 1.9, Forge 1.9, OptiFine 1.8.9, Forge 1.8.9, Forge 1.8, OptiFine 1.8, Forge 1.7.10, OptiFine 1.7.10, Forge 1.5.2, OptiFine 1.5.2 и другие.
Вопрос: Чем этот лаучнер отличается от того же TLauncher Legacy?
Ответ: Полностью всем, от внешнего вида (который более приятный), до интересного функционала: система мод-паков (установка модов, карты в один клик), система скинов с поддержкой плащей и HD! Существуют более мелкие плюсы, такие как, область с новостями игры, где быстро можно изучить последние нововведения. Быстрая техническая поддержка по различным вопросам и многое другое.
Вопрос: А может MLauncher лучше?
Ответ: Это в корне не верно, ведь можно назвать его урезанным, который имеет только список серверов. TL же, имеет и этот плюс — свой список серверов Майнкрафт, а так же все другие плюсы описанные в новости, которые не реализованы в млаунчере. К тому же, отсутствие введение новых функций негативно сказывается на гемплей игроков.
Вопрос: Какая последняя версия TLauncher?
Ответ: На данный момент последней стабильной версией является TLauncher 2.841.
Найти решения других проблем, можно на специальной странице: Решение проблем TLauncher.
Разработчики с гордостью заявляют, что он самый простой в использовании, в этом вы можете убедится прочитав небольшой обзор по лаунчеру.
Смотря на скриншот в начале статьи, вы видите что большая часть лаунчера занимает веб страница, на которой отображаются последние новости версий игры, а иногда и самого портала. Поэтому вы всегда увидите что вышла новая версия, а так же сможете прочитать что в ней изменилось, поэтому не нужно будет искать эту информацию в интернете.
На главной странице лаунчера в нижнем левом углу есть поле для ввода ваше никнейма, который будет использоваться в сетевой игре.
Под этой строкой есть другой выпадающий список, в нём вы можете найти версии игры, обычно стоит последняя версия, или та, которую вы запускали в последний раз.
Выбрав версию, которая у вас не загружена, вам будет предложено её установить, нажав на кнопку «Установить» (Так как это пиратский лаунчер Minecraft, он установит игру бесплатно):
Скачивание версии Майнкрафт в TLauncher 2.4
По умолчанию, в лаунчере майнкрафт не нужно нечего менять в настройках, но если хотите, то можете посмотреть что там есть:
Настройки в TLauncher 2.4
К тому же, с крупным обновление 2.0, у TLauncher появилась своя собственная система скинов, теперь не придётся использовать сторонние. А это даёт больше плюсов — стабильность и больше плюшек. Чтобы поставить, нужно пройти регистрацию на сайте TLauncher , поставить скин и авторизоваться в самом лаунчере. Потом выбрать версию с иконкой TL и запустить. Можете прочитать более подробный гайд по установке скинов в TLauncher, у нас на сайте в отдельной статье разобрано всё по полочкам.
Скины в TLauncher 2.0
В новом крупном обновлении 2.4 разработчики порадовали собственной системой установки модов в один клик. В нижнем правом углу лаунчера появилась кнопка TL MODS, нажав на которую, можно открыть страницу с каталогом и управлением новой системы.
Главная страница мод-пак системы в TLauncher 2.4
Вся новая система завязана на мод-пака (сборках с модами). Первая вкладка так и называется — мод-паки, в ней можно найти различные сборки на разные тематики: военные, фэнтези, технические и другие. Каталог достаточно большой, можно выбрать категорию для быстрого поиска.
Полное описание мод-пака в TLauncher 2.4
Нажав на интересный вам мод-пак, откроется полное описание. Где можно найти краткую информацию о сущности сборки, а так же вкладки картинки; версии; моды; ресурс-паки; карты. Чтобы начать играть на нём, достаточно нажать на «Установить» и он появится в списке версий, запускаем его и готово!
Создание мод-пака в TLauncher 2.4
Естественно через эту систему можно создать собственный мод-пак, наполнив его различными модами, картами и ресурс-паками. Система помогает пользователю при различных проблемах и в частности думает за него о совместимости модов. К тому же, есть система бэкапа и ручной установки. Действительно достойное обновление!
Плюсы данного лаучера:
— Стабильность;
— Не нужен постоянный доступ в Интернет;
— Простота в использовании;
— Мультиязычность;
— Все версии игры + с модами;
— Тонкая настройка игры;
— Анализ крашей и ошибок;
— Постоянные обновление;
— Каталог с модами, ресурс-паками и картами. И их установка в один клик!
— Мультиплатформенность;
— Бесплатная установка скина;
— Возможность поставить плащ и HD скины;
— Анимационные плащи!
1. Устанавливаем Java. (Если какая-то ошибка, читаем пункт 2.)
2. Заходим в настройки -> Защита и безопасность -> нажимаем на замок и вводим логин и пароль от компьютера -> из пункта: «Разрешить использование программ, загруженных из» выбираем «Любого источника», выскочит предупреждение, соглашаемся.
Защита и безопасность в OS X
3. Скачиваем по ссылке выше лаунчер (Ссылка под названием MacOS/Linux).
4. Запускаем двойным щелчком левой кнопки мыши лаунчер.
TLauncher 2.4 MacOS
История версий:
2.75 Релиз:
— Мелкие изменения.
2.75 Релиз:
— Мелкие изменения.
2.74 Релиз:
— Улучшена система вывода информации о скачивании файлов.
— Мелкие изменения.
2.745 Beta:
— Исправление ошибок.
2.731 Beta:
— Исправлена проблема с pastebin.
2.721 Beta:
— Исправление ошибок.
2.72 Релиз:
— Исправлена проблема с достижениями;
— Исправлена проблема ssl при запуске лаунчера;
— Исправлена ошибка краша из-за памяти.
— Мелкие изменения.
2.72 Beta:
— Исправление ошибок.
2.71 Релиз:
— Обновлены иконки категорий в Шейдерах;
— Заменены старые репозитории на актуальные;
— Обновлён сертификат;
— Исправление ошибок.
2.71 Beta:
— Исправление ошибок.
2.699 Beta:
— Исправление ошибок.
2.698 Beta:
— Исправление ошибок.
2.697 Beta:
— Исправление ошибок.
2.696 Beta:
— Исправление ошибок.
2.695 Beta:
— Исправление ошибок.
2.694 Beta:
— Исправление ошибок.
2.693 Beta:
— Исправление ошибок.
2.692 Beta:
— Обновлены иконки категорий в Шейдерах;
— Заменены старые репозитории на актуальные;
— Обновлён сертификат;
— Исправление ошибок.
2.69:
— Шейдеры в мод-пак системе!
— Обновлена цифровая подпись;
— Исправление ошибок.
2.685 Beta:
— Исправление ошибок.
2.684 Beta:
— Обновлена цифровая подпись файла;
— Исправление ошибок.
2.683 Beta:
— Исправление ошибок.
2.682 Beta:
— Шейдеры в мод-пак системе уже доступны!
— Исправление ошибок.
2.681 Beta:
— Исправление ошибок.
2.68:
— Исправление ошибок.
2.672 Beta:
— Исправление ошибок.
2.671 Beta:
— Исправление ошибок.
2.67:
— Исправление ошибок.
2.669 Beta:
— Исправление ошибок.
2.668 Beta:
— Исправление ошибок.
2.667 Beta:
— Исправление ошибок.
2.666 Beta:
— Исправление ошибок.
2.665 Beta:
— Исправление ошибок.
2.664 Beta:
— Исправление ошибок.
2.663 Beta:
— Исправление ошибок.
2.662 Beta:
— Исправление ошибок.
2.661 Beta:
— Исправление ошибок.
2.66:
— Исправление ошибок.
2.66 Beta:
— Исправление ошибок.
2.65:
— Исправление ошибок.
2.65 Beta:
— Исправление ошибок.
2.64 Beta:
— Исправление ошибок.
2.63 Beta:
— Исправление ошибок.
2.62 Beta:
— Исправление ошибок.
2.61 Beta:
— Исправление ошибок.
2.6 Beta:
— Исправление ошибок.
2.586 Beta:
— Исправление ошибок.
2.585 Beta:
— Исправление ошибок.
2.584 Beta:
— Исправление ошибок.
2.583 Beta:
— Добавлены версии TL к 1.14.
— Исправление ошибок.
2.582 Beta:
— Исправление ошибок.
2.581 Beta:
— Исправление ошибок.
2.58 Beta:
— Исправление ошибок.
2.57 Beta:
— Исправление ошибок.
2.56 Beta:
— Поддержка Forge 1.13.2.
— Исправление ошибок.
2.55 Beta:
— Исправление ошибок.
2.54 Beta:
— Исправление ошибок.
2.53:
— Новогоднее обновление!
— Исправление ошибок.
2.53 Beta:
— Исправление ошибок.
2.52 Beta:
— Исправление ошибок.
2.51 Beta:
— Исправление ошибок.
2.5 Beta:
— Исправлена проблема при подключении к серверу, ошибка «Network is unreachable’.
2.49 Beta:
— Исправлена проблема с запуском Minecraft 1.13.2.
— Исправление ошибок.
2.48:
— Добавлена поддержка Rift и OptiFine 1.13 и 1.13.1
— Исправление ошибок в мод-паках.
2.48 Beta:
— Исправление ошибок.
2.47 Beta:
— Добавлены версии OptiFine 1.13 и 1.13.1
2.46 Beta:
— Поддержка Rift Mods.
2.45 Beta:
— Поддержка Optifine 1.13;
— В настройках лаунчера появилась система полного удаления файлов игры и настроек;
— Улучшения в системе обновления лаунчера;
— Улучшена поддержка Java 10;
— Исправлена ошибка с картами в мод-паках.
2.44 Beta:
— Исправление ошибок.
2.43 Релиз:
— Новая страница с мод-паками. Создание своих сборок или скачивание готовых.
— Поддержка Minecraft 1.13.
2.43 Beta:
— Исправление ошибок.
2.42 Beta:
— Исправление ошибок.
2.41 Beta:
— Исправление ошибок.
2.393 Beta:
— Исправление ошибок.
2.392 Beta:
— Исправление ошибок.
2.391 Beta:
— Исправление ошибок.
2.39 Beta:
— Исправление ошибок.
2.37 Beta:
— Новое окно обновления! Яркое и современное, а так же больше возможностей преподнести для вас новости.
2.36 Beta:
— Техническое обновление с обязательным обновлением до 2.37.
2.35 Beta:
— Исправление ошибки с низким ФПС в игре.
2.34 Beta:
— Исправление ошибок.
2.33 Beta:
— Улучшена функция удаления мод-пака;
— Исправление ошибок
2.32 Beta:
— Улучшена стабильность снапшотов;
— Исправление ошибок
2.31 Beta:
— Исправление ошибок
2.3 Beta:
— Исправление ошибок
2.28 Beta:
— Исправления связанные с блокировкой Amazon в России (Теперь точно должна загружаться игра).
2.27 Beta:
— Исправления связанные с блокировкой Amazon в России.
— Исправлена ошибок связанных с системой мод-паков и общие улучшения.
2.26 Beta:
— Исправлена ошибок связанных с системой мод-паков и общие улучшения.
2.25 Beta:
— Исправлена ошибок связанных с системой мод-паков и общие улучшения.
2.24 Beta:
— Встречайте систему мод-паков: Устанавливайте моды, текстур-паки и карты в один клик!
2.23 Beta:
— Исправлена ошибка с запуском снапшота 17w43.
— Добавлена поддержка Java 9.
2.22 Релиз:
— Добавлены версии Optifine 1.12 и ForgeOptifine 1.12.
— Исправление ошибок.
2.22 Beta:
— Исправление ошибок.
2.21 Beta:
— Добавлены версии Optifine 1.12 и ForgeOptifine 1.12.
2.20:
— Исправлена ошибка java.lang.NullPointerException: Complete version is NULL.
2.20 Beta:
— Исправление ошибок.
2.19:
— Исправление ошибок.
2.18:
— Исправлена ошибка при запуске снапшота 17w13b;
— Другие исправления.
2.18 Beta:
— Исправлена ошибка при запуске снапшота 17w13b.
2.17 Релиз:
— Обновлена система установка игры;
— Теперь скины TLauncher.org отображаются по умолчанию всем пользователям лаунчера — даже без использование аккаунтов;
— Исправление ошибок.
2.17 Beta:
— Обновлена система установки игры.
2.16 Beta:
— Исправление ошибок.
2.15 Beta:
— Исправление ошибок.
2.14 Beta:
— Новая иконка у лицензионных аккаунтов;
— Исправлена ошибка с чекбоксом Полноэкранный режим;
— Исправление ошибок.
2.12 Релиз:
— Исправление ошибок.
2.12 Beta:
— Исправление ошибок.
2.1 Релиз:
— Добавлены версии ForgeOptiFine 1.11 и ForgeOptiFine 1.10.2;
— Исправлена ошибка при заходе на сервер с главной страницы.;
— Другие исправления ошибок.
2.091 Beta:
— Исправление ошибок.
2.09 Beta:
— Исправление ошибок.
2.08 Beta:
— Исправление ошибок.
2.07 Beta:
— Исправление ошибок.
2.06 Beta:
— Исправление ошибок.
2.05 Beta:
— Исправление ошибок.
2.04 Beta:
— Исправлена ошибка с консолью разработчика;
— Исправлена ошибка с авторизацией через аккаунты TLauncher;
— Исправлена ошибка с блокировкой поля для ввода логина;
2.03 Релиз:
— Исправлены ошибки с запуском игры.
— Исправлена ошибка при входе в игру связанная с лицензионными аккаунтами.
— Совершенно новый дизайн лаунчера!;
— Устанавливайте собственный скин на сайте tlauncher.org;
— Добавлены следующие переводы лаунчера: Немецкий, Польский, Итальянский, Румынский, Испанский, Китайский.
— Исправлена проблема с Java 7.
— Обновление перед релизом!.
— Улучшения в дизайне (Бета!).
— Улучшения в дизайне (Бета!).
— Новый дизайн приложения (Бета!).
— Автоустановка новой версии Java 8 для пользователей Java 7
— Исправление ошибок
— Повышена защита аккаунтов
— Добавлены иконки к версиям в окошках серверов
— Исправлены ошибки с отображением скинов на серверах.
— Устанавливайте собственный скин благодаря авторизации tlauncher.org.
— Новый язык: Китайский.
— Полоска загрузки лаунчера появляется раньше.
— Новые языки лаунчера: Итальянский, Португальский, Польский и Румынский.
— Библиотеки лаунчера теперь хранятся в папке указанной в настройках.
— Уменьшили размер лаунчера, опять!
— Улучшили систему обновления.
— Исправлены ошибки.
— Теперь лаунчер весит в 2 раза меньше! (Все библиотеки перенесены в отдельную папку, скачиваются один раз)
— Три новых языка лаунчера: Немецкий, Французский и Испанский
— Исправлена проблема при установке версий вручную.
— Исправление ошибок.
— Исправлена ошибка при установке версий в ручном режиме.
— Теперь при возникновении ошибки, вы сможете при отправке отчёта на сервер указать свою почту и ваши комментарии к ошибке.
— Другие мелкие исправления.
— Поддержка новой версии игры 1.9!
— Улучшение загрузки фона в лаунчере.
— Система сбора статистики.
— Исправление ошибок.
— Исправление проблем с последними версиями снапшотов.
— Улучшение загрузки фона в лаунчере.
— Улучшение аналитики.
— Исправление ошибок.
— Добавлены статистические функции, которые помогут разработчикам в развитии лаунчера.
— Исправление ошибок.
— Релиз новой версии! Добавлены все нововведения из бета версий (Лицензионные аккаунты, отдельная страница для серверов).
— Улучшена система зеркал.
— Исправление ошибок.
— Добавлены новые функции к релизу (Пока не доступны!)
— Исправление ошибок.
— Возможность авторизации через лицензионные аккаунты от Mojang, то есть это даст возможность играть на лицензионных серверах и использовать официальную систему скинов.
Добавление лицензионного аккаунта Minecraft
— Релиз новой версии! Добавлены все нововведения из бета версий.
— Исправление ошибок.
— Добавлено зеркало для данных (При недоступных основных серверах, лаунчер будет функционировать нормально запрашивая всё с зеркал);
— Исправление ошибок.
— Система отправки ошибок пользователя;
То есть, при возникновении любых ошибок, вам будет предложено отправить её нам, чтобы бы мы решили!
Отправка ошибки в TLauncher 1.93
— Система отзывов в лаунчере (Для бета версий под кнопкой ‘Играть’. Для релизных в меню настроек);
Если у вас есть пожелания или же, вы нашли недочёт в нашем лаунчере, через систему отзывов вы можете сообщить нам об этом!
Отзыв в TLauncher 1.93
— Автоподключение к серверу из новостной страницы (Если размещается сервер);
Если на странице с новостями мы размещаем сервера, вы можете в один клик подключится к нему и начать играть. Достаточно навести курсор на IP сервера и появится меню, в котором нужно выбрать «Зайти на сервер».
Автоподключение к серверу в TLauncher 1.93
— Улучшения лаунчера на Linux системах;
— Исправлены недоработки в дизайне лаунчера на Mac OS X;
— Исправление ошибок.
1.9:
– Обновление консоли: добавлена поддержка pastebin.
– Поддержка Java 8 для старых Forge 1.6.4-1.7.2.
– Добавлены версии Forge и OptiFine для 1.2.5 и 1.4.7.
– Возвращены версии с LiteLoader.
– Полностью обновлёно строение репозиториев.
– Добавлено обнаружение конфликта java и антивируса касперского.
– Обновлён интерфейс настроек.
1.8 — Исправлен конфликт потоков, который вызывался деятельностью Антивируса Касперского.
1.1 — Совсем новый дизайн лаунчера; Поддержка премиум входа; Исправлено множество багов;
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Shell scripts for downloading and installing last version of TLauncher
License
IvanivAnton/TLauncer-Linux-Installer
Name already in use
- Local
- Codespaces
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
TLauncher Linux Installer
Shell scripts for downloading and installing last version of TLauncher at Linux OS
Successfuly tested on
- Ubuntu 20.04 LTS, KDE
- Ubuntu 18.04 LTS, Gnome
Install these packages before install
- curl
- unzip
- openjdk-8-jre
- openjfx
TLauncher asks for root rights due to fact that if you run without root privileges, then there are problems with the graphics (gpu)
How to launch Launcher on Linux?
My original article. A very long time ago, back in 2011, a computer game called Minecraft, famous to this day, was released, founded by just one developer, a little later Mojang AB was bought out by the global company Microsoft.

How do we launch Launcher on linux ? It couldn't be simpler! I use an Ubuntu-based system, the entire installation can be described in just a few steps.
1. Go to the downloads panel below and download the jar archive from my link.
2. Go to the terminal and enter this command to install Java on linux:
$ sudo apt update && sudo apt install openjdk-8-jdk

3. Action with the jar archive that was downloaded, drag it to the desktop, right-click, then properties > Rights

After going to the Rights tab, check the box "Allow file execution as a program". Each linux distribution has its own working environment, the names of the items may look different, including the windows, but the essence is the same

Success! Now right-click on our jar archive > open with help . and select the application "open-JDK java 8" and that's it, personally the installation did not take me more than 2 minutes


So we installed Java and launched Tlancher on the Linux kernel, the frame counter is overestimated more than on Windows, but this is logical, we do not run this game through Wine, but we do it by means of the system. I hope you liked the article! Play to your health
Как запустить Tlauncher на Linux?
Ещё очень давно, уже в далеком 2011 году вышла знаменитая по сей день компьютерная игра под названием Minecraft основанная всего одним разработчиком, чуть позже компания Mojang AB была выкуплена мировой компанией Microsoft.

Как же нам запустить Tlauncher на linux ? Проще некуда! Я использую систему на базе Ubuntu, всю установку можно описать всего в несколько шагов.
1. Переходим на официальный сайт Tlauncher(а) или качаем jar архив по этой ссылки, сразу после нажимаем на большую кнопку «Скачать Tlauncher» и выбираем версию для Linux, если только вы не скачали jar архив по второй ссылки.
2. Переходим в терминал и вводим данную команду для установки Java в linux:

3. Действие с jar-архивом который был скачен, перетащите его на рабочий стол, кликните правой кнопкой мыши, далее свойства > Права

После перехода во вкладку Права поставьте галочку в пункте «Позволять выполнение файла как программы». У каждого дистрибутива lunux свое рабочее окружение, названия пунктов может выглядеть по иному, в том числе и окошки, но суть одна

Успех! Теперь правой кнопкой мыши по нашему jar-архиву > открыть с помощь… и выбираем приложение «open-JDK java 8» и на этом все, лично установка не заняла у меня более 2-ух минут


Вот мы установили Java и запустили Tlancher на ядре Linux, счетчик кадров завышается больше чем на Windows, но это и логично, мы не запускаем данную игру через Wine, а делаем это средствами системы. Надеюсь статья вам понравилась! Играйте на здоровье
Во-перввх зачем инструкция, если Майнкрафт под Линуксом ставится проще чем под виндой? Всё делается и без консоли. Во-вторых: последние версии требуют java17 минимум
я когда нажимаю правой кнопкой мыши на архив нет кнопки »свойства» или «права»
0409 | 36 events @ 4 min: F, WordPad + Новости проекта

Индия запустила в космос станцию Aditya-L1, которая будет исследовать Солнце. Доберётся до нужной орбиты через 126 дней.

Космический корабль SpaceX Crew Dragon вернулся с МКС на Землю. На борту четыре человека, в т.ч. наш космонавт Андрей Федяев.
Клиенты Dell заказали серверы для ИИ на 2 млрд $. Акции компании +21% за день, рекордный скачок за пять лет.
Девять китайских компаний, в т.ч. Alibaba T-Head и Baidu StarFive, объединились в альянс China RISC-V Industry Alliance. Договорились упростить продажу лицензий на патенты архитектуры RISC-V и не подавать в суд друг на друга за их нарушение.
# Software
▸[4] Apple запустила багбаунти для iPhone 14 Pro. Рассылает смартфоны с отключённой защитой и с шелл-доступом.
▸[5] Google Saved удаляет сохранённые ссылки на торренты и другие сайты, нарушающие авторские права.
▸[6] Ядро Linux 6.5 доступно для Ubuntu. Инструкция в статье.
▸[7] Microsoft прекратила поддержку WordPad. Приложение скоро исчезнет из Windows.
▸[8] Apple сделала сайт с описанием всех своих приложений.
▸[9] Apple закрыла приложение iTunes Movie Trailers.
▸[10] Релиз Nitrux 3.0: форк Debian без systemd, пропатчили уязвимости процов Intel и AMD, несколько новых утилит шифрования и драйверов.
▸[11] Релиз Linux Lite 6.6: форк Ubuntu, добавили языки, в т.ч. русский, нейронку-помощницу в разделе «Справка» и новые обои.
▸[12] Google Maps тестируют новую цветовую схему.
▸[13] Релиз ArcaOS 5.1: форк OS/2, добавили поддержку UEFI и дисков более 2 Тб.
# Hardpron
▸[14] Камера наружного наблюдения Bosch Eyes Outdoor Camera II: 1080p, мимикрирует под софит. Цена 350 €.

▸[15] Консоль Xbox Series S black: ПЗУ 1 Тб, корпус чёрного цвета, в остальном не отличается от базовой модели. Цена 350 $.

▸[16] Видеокарты XFX Radeon RX 7800 XT и RX 7700 XT версии MERC и QICK: характеристик нет. В продаже на этой неделе, QICK по 450 и 500 $, цены MERC нет.

# Business
▸[17] Суд штата Джорджия будет стримить слушания по делу Дональда Трампа на YouTube.
▸[18] Московский государственный университет запустил суперкомпьютер МГУ-270 для обучения нейросетей. Мощность 400 Петафлопс.
▸[19] Церковь Саентологии выступила против законопроекта США «О праве на ремонт», который обяжет её опубликовать схему Электропсихометра.
▸[20] Новостной сайт Gizmodo уволил переводчиков испанской версии. Статьи теперь публикует нейросеть.
▸[21] Европол взломал шифрование чатов EncroChat, Sky ECC и ANOM. Полиция Сербии, используя сообщения из них, накрыла наркоторговцев с 2,7 тоннами кокаина.
▸[22] Биржа Nasdaq перенесла систему работы с ценными бумагами на серверы AWS.
▸[23] Выручка Broadcom во II квартале: +8,9 млрд $, +5%, чем год назад. Чистая прибыль: +3,3 млрд $, +7%.
▸[24] Пентагон запустил сайт с информацией об НЛО.
▸[25] Фонд Нобеля передумал приглашать на церемонию вручения премии нашего, белорусского и иранского послов из-за протеста шведских политиков.
▸[26] Профсоюз голливудских актёров начал голосование о забастовке в индустрии видеоигр из-за внедрения нейросетей.
▸[27] Apple отказалась разрабатывать систему для iCloud, которая ищет фотографии с сексуальным насилием над детьми. Заявила, что это создаст новый вектор хакерских атак.
▸[28] Соцсеть X обновила пользовательское соглашение: будет обучать нейросеть на постах юзеров.
▸[29] Уволенные сотрудники Twitter подали уже 2200 судебных исков против Маска. Говорят, не выплатил выходные пособия.
▸[30] Британское детское печенье Paw Patrol отзывает продукцию из магазинов. Компания забыла продлить домен и теперь там порносайт.
▸[31] Оператор спутниковой связи Globalstar, услуги которого покупает Apple, забронировал места в ракетах SpaceX на 64 млн $ в 2025.
▸[32] МТС купила долю 85% сервиса продажи билетов на концерты Ticketscloud и собирается выкупить его полностью в течение двух лет. Почём не говорит, но менее 900 млн ₽.
▸[33] SpaceX закинула на орбиту 21 спутник Starlink.
▸[34] Huawei запустила ЦОД в Саудовской Аравии для госсектора и филиалов китайских компаний.
▸[35] Директор по продукту [CPO] Binance уволился. Не сказал почему.
# Спасибо @fix4fix за Пикабу-донат!
# Новости проекта
# Аудиоверсия
+ Звуки начала и конца
+ Hardpron читает Алёна, чтобы Филиппу было не так одиноко

OPQAM, IJKL, 67890. О том, как нам реально повезло с курсорными клавишами

Клавиатура Суры ПК8000
Первый компьютер появился у меня дома в 6 лет. Это была Сура ПК8000 с черно-белым телевизором. Затем я попробовал игры на MSX-2 с цветным монитором, различные модели БК, PC и ZX Spectrum.
Последний был моим любимцем на протяжении нескольких лет. Он достался мне в корпусе от “Суры”, которую собирали на заводе в Пензе, с черно-белым монитором “Корвет” и двумя дисководами. Естественно, что в начале 90-х я понятия не имел, как выглядит настоящий “Спектрум”. Важнее было, что софта для него, в отличие от “Суры” и БК, было навалом, а клоны были во многих семьях и проблем с обменом коллекциями не существовало.
Что бесило, так это кривые сочетания клавиш управления во многих играх. Какой синклер-джойстик? Почему OPQAM? Есть же нормальные курсорные стрелки на клавиатуре?

Скриншот выбора управления в игре Rolling Thunder (Keyboard ― те самые OPQAM)
Что еще хуже, при написании программ приходилось либо долго втыкать в мелкие наклейки на клавишах, либо заучивать сочетания. Отдельных кнопок для управления курсором или того же backspace не было.
Почитав историю Синклера, я решил, что это было сделано в угоду дешевизне, минитюаризации, а еще потому, что многие использовали в играх джойстик.
Но после того, как я посмотрел на клавиатуры популярных компьютеров конца 70-х и начала 80-х, я решил, что создатели ПК не особенно заморачивались, и взяли за базу печатные машинки. Действительно, кому могут понадобиться курсорные клавиши, расположение которых будет одинаковым на всех клавиатурах, которые можно нажимать одной рукой, да еще вслепую?
Хотя нет, в Apple настолько заморочились, что на Apple Lisa и Macintosh курсорных клавиш не было вообще. Так покупателей приучали пользоваться мышкой.

Клавиатура Apple M0110
Пожалуй, все неудобства и “боль” пользователей при переходе с модели на модель можно понять только показав, как это было.
❯ Худшие из худших
На печатных машинках курсорные клавиши не были нужны, но на компьютерах для перемещения по листингам, меню, управлению в играх вроде бы необходимы?
Однако, возникает ощущение, что создатели компьютеров просто не пользовались своими творениями, т.к. на некоторых моделях типа Атари 400, 800 и 800XL клавиатура в неизменном виде существовала несколько лет.
Apple
Про Apple Lisa и Macintosh я написал в самом начале. На Apple II курсорные клавиши появились. Но… только влево и вправо. Было бы интересно понять логику.

Клавиатура Apple II
Неудобство проявлялось еще и в том, что в играх управление было совершенно разным. Например, в Ms.Pac-Man клавиши A и Z отвечали за вверх-вниз, а в Lode Runner управление было вообще без курсорных клавиш ― IJKL.

Скриншот игры Ms.Pac-Man
Полноценный блок был добавлен в модели Apple IIc и IIe

В Apple III разработчики снова учудили, и расположили клавиши, как получилось (три клавиши в ряд, а одна сверху).

Пользоваться любым из решений одной рукой неудобно. Но хуже всего, что пересесть с ПК одного производителя на на другой было реальным кошмаром.
Atari 400, 800, 800XL (1979)
Для управления курсором приходилось удерживать Control, а в младшей модели еще и мириться с мембранной клавиатурой.

BBC Micro (1981)
Раскладка уже в ряд, и без CTRL.

То есть, если вы работали на Атари, а потом вдруг решили перейти на BBC, нужно переучиваться заново пользоваться клавиатурой.
HP 9835 (1979)
Маленькие клавиши в верхней части корпуса размещены так, что положить руки, ничего не задев, не получится.

Кстати, порядок клавиш отличается и от Атари и от BBC Micro.
TRS-80 (1977) и Tandy Color Computer (1980)
Есть вверх, вниз, влево, вправо, но на разных частях клавиатуры.

Casio
Надо отметить, что в Японии дела обстояли ничуть не лучше.

Портативный ПК Casio FX 9000p
Commodore
Очень странным мне показалось решение в Commodore 64, который получил огромную популярность и репутацию игрового ПК. Обратите внимание — за вверх-вниз и влево-вправо отвечают по одной клавише. Хорошо, хоть кнопку shift разместили так, чтобы можно было управлять одной рукой.

Commodore 128 получил уже рядную раскладку:

А вот в Commodore Plus/4, на мой взгляд, вышло совсем неудачное решение. Блок с курсорными кнопками слишком мал и подойдет только для редактирования текста.

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

Клавиатура Amiga 1000
А вот Amiga 500 и 2000 уже получили Т-образное расположение.
❯ Под занавес. Первыми были вовсе не IBM!
Я был убежден, что изобретение стандарта принадлежит IBM, но оказалось, что еще раньше появления клавиатуры IBM Modem M (1985) по-крайней мере, две компании использовали Т-образное расположение курсорных клавиш. Но, надо отдать должное, IBM повлияла на широкое распространение этого варианта.
Я специально потратил время на поиск картинок старых компьютеров и терминалов. Первые клавиатуры с привычным нам расположением появились еще в 1970 или раньше.

Терминал ADDS Consul 880
А более современный вариант появился в 1982 году благодаря Digital Equipment.

Плохих примеров реализации курсорных клавиш очень много. Во время подготовки статьи я не раз мысленно говорил “спасибо” дизайнерам и разработчикам, благодаря которым можно легко пересесть за другой компьютер, и продолжить редактировать свой пост, не спотыкаясь, на чужой клавиатуре.
Если у вас есть предположения, почему так долго не было единого стандарта, или у вас есть объяснение логики производителей, поделитесь в комментариях!
Больше интересных статей в нашем блоге на Хабре. Недорогие сервера для ваших проектов — здесь.

Умер «отец» легендарного текстового редактора, который обожают программисты
Скоропостижно скончался создатель легендарного текстового редактора Vim Брам Моленар. Инструмент с более чем 30-летней историей, который по-прежнему любим разработчиками ПО, остался без главного «поставщика» патчей.
Умер Брам Моленар
Нидерландский программист, автор и ключевой разработчик текстового редактора Vim Брам Моленар (Bram Moolenaar) умер 3 августа 2023 г. Ему было 62 года. По сообщению родственников, опубликованному в Google Groups проекта Vim, причиной смерти Моленара стало быстро прогрессирующее заболевание.
Vim (Vi imporoved) – свободный экранный текстовый редактор с открытым исходным кодом, портированный на большинство современных платформ. Vim является клоном классического редактора vi для операционной системы Unix, в котором однако же не используется программный код vi. Вместо этого из соображений лицензионной чистоты в качестве основы для Vim изначально использовался другой клон vi – Stevie.
За 31 год существования Vim Моленар внес наибольший вклад в его развитие. Так, согласно данным Github, пользователь brammool добавил в проект в период с 2004 по 2023 г. 16515 коммитов и почти 3,5 млн строк кода. Ближайший конкурент Моленара по производительности в рамках проекта Vim yegappan может похвастаться 69051 коммитом и принятыми патчами на 69 тыс. строк кода в совокупности.

Похороны Моленара состоятся на его родине – в Нидерландах. О точных времени и месте проведения прощальной церемонии семья Моленара объявит отдельно.
Что такое Vim
Vim отличает большая гибкость и широкие возможности настройки редактора, а также максимально лаконичный интерфейс. Управление программой осуществляется при помощи текстовых команд, а не путем выбора соответствующих пунктов меню или нажатия кнопок, расположенных на экране. Vim поддерживает несколько тысяч модулей расширения, которые, к примеру, позволяют превратить редактор в практически полноценную интегрированную среду разработки – с подсветкой синтаксиса и интеграцией с операционной системой.
Исходный код распространяется на условиях особой charityware-лицензии, совместимой с GNU GPL 2.0. Она предоставляет пользователю право свободно копировать, модифицировать и распространять программу и призывает по возможности жертвовать деньги благотворительной организации ICCF Holland, у истоков которой стоит Моленар.
Сверхпопулярный инструмент разработчика
Согласно опросу, проведенному Stack Overflow, популярной площадкой для программистов, в 2023 г. своей любимой средой разработки программного обеспечения Vim назвало 22,29% респондентов.
По показателю популярности среди аудитории портала Vim уступил лишь Notepad++ (24,54%), IntelliJ IDEA (26,82%), Visual Studio (28,43%) и Visual Studio Code (73,71%). Редактор Брама Моленара оставил позади такие инструменты разработчика как Android Studio (16,82%), PyCharm (14,63%), Eclipse (9,9%), Emacs (4,69%).
Краткая биография Брама Моленара
Брам Моленар родился в 1961 г. в Лиссе (Южная Голландия). В 1985 г. окончил Делфтский университет (Делфт, Нидерланды) по специальности «электротехника» (electrical engineering).
В 1988 г. Моленар, став обладателем компьютера Amiga, занялся разработкой аналога текстового редактора vi, который не был представлен на этой платформе. Взяв за основу один из клонов vi – Stevie, программист значительно обогатил его функциональность.
В этом же году плоды его труда, получившие название Vim (тогда – Vi Imitarion; «имитация Vi»), вошли в подборку дисков с бесплатным ПО, распространяемым Фредом Фишем (Fred Fish) – другим видным деятелем сферы ПО с открытым исходным кодом того времени, который, в частности, известен благодаря своему вкладу в разработку отладчика GNU Debugger (GDB).
Усилиями сторонних программистов Vim был портирован на ряд других платформ, таких как MS-DOS и Unix. С выходом версии 1.22 в 1992 г. Vim расшифровывается как Vi Improved («Vi усовершенствованный»).
Помимо Vim, Моленар известен как автор проекта A-A-P по созданию инструментария для легкой сборки программ и создатель экспериментального языка программирования Zimbu c С-подобным синтаксисом и некоторыми возможностями по контролю за стилем написания кода – для обеспечения лучшей его читаемости.
Наконец, именно Моленар основал ранее упомянутую ICCF Holland и вплоть до самой смерти выступал ее казначеем.
ICCF Holland – небольшая неправительственная организация, действующая на территории Уганды (Африка), которая оказывает помощь жертвам СПИДа, в частности детям, оставшимся без попечения родителей. Организация помогает сиротам в получении базовых образовательных и медицинских услуг.
В период с 2006 по 2021 г. Моленар являлся сотрудником офиса Google в Цюрихе (Швейцария). Часть своего свободного времени он по-прежнему уделял поддержке Vim.

Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android

Для многих разработчиков приложений далеко не секрет, что экосистема Android не предполагает написание полностью нативных приложений: в этой платформе очень многое завязано на Java и без ART можно запустить только простые службы без какого-либо интерфейса. Однако, есть один способ писать практически под «голый» Linux, не перекомпилируя ядро и при этом пользоваться самыми интересными фишками устройства без оверхеда в виде тяжелого Android: ускорение 3D-графики (OpenGLES), микшер звука, ввод с различных устройств, OTG, Wi-Fi и если очень постараться — даже 3G. Это открывает множество разных интересных применений старым устройствам: «железо» смартфонов зачастую гораздо мощнее современных недорогих одноплатников. Сегодня я покажу вам, как написать и запустить программу, которая полностью написанное на C без Android, на No-Name Android-смартфоне практически без модификаций. Интересно? Жду вас в статье!
❯ Что нам нужно знать?
Даже относительно старые устройства флагманского сегмента обладают весьма неплохими характеристиками. Зачастую они гораздо мощнее современных дешевых одноплатников и могут выполнять самые разные задачи: эмуляция консолей, работа в качестве плееров, да даже просто сделать настольные часики самому было бы здорово. Но есть одно но — это Android. Платформа от Google может тормозить даже на достаточно мощном железе, что резко ограничивает потенциально возможные применения подобных гаджетов. Да и многие программисты не особо хотят заморачиваться и учить API Android для реализации каких-то своих проектов.

Но конечно же, есть один способ писать нативные программы, при этом используя все ресурсы смартфона/планшета. Для этого нужно понимание, как работает процесс загрузки на многих Android-гаджетах:
Первичный загрузчик (BootROM) инициализирует какую-то часть периферии и загружает вторичный загрузчик (U-boot/LK).
Вторичный загрузчик, используя определенные аргументы (например зажата ли какая-то кнопка) выбирает, с какого раздела грузить ядро системы.
После загрузки ядра Linux и подключения ramdisk начинается выполнение процессов системы.
Как раз в третьем пункте и лежит ключ к способу, который будем использовать мы. Дело в том, что в смартфоне обычно есть несколько boot-разделов и у каждого свой образ ядра Linux со своим ramdisk. Первый из них — это знакомый моддерамboot.img, который отвечает за загрузку системы и инициализирует железо/монтирует разделы/подготавливает окружение к работе (.rc файлы) и запускает главный процесс Android —zygote. При этом используется собственная реализация init от Android.

Второй, не менее знакомый многим раздел —recovery, отвечает за так называемый режим восстановления, в котором мы можем сбросить данные до заводских настроек/очистить кэши или прошить кастомную прошивку. Вероятно, многие из вас замечали, насколько быстро ваш девайс загружает этот режим, гораздо быстрее, чем загрузка обычного Android. И именно в его реализацию нам нужнозаглянуть(я намеренно выбрал бранч версии 2.3 — т.е Gingerbread для простоты):

А recovery оказывается самой обычной нативной программой, написанной на C со своим небольшим фреймворком для работы с графикой и вводом. В процессе загрузки режима recovery, скрипт запускает одноименную программу в /sbin/, благодаря которому мы видим простую и понятную менюшку. Так почему бы не использовать этот раздел в своих целях и не написать какую-нибудь нативную программу самому?
Как я уже говорил выше, в этом режиме доступны многие аппаратные возможности вашего смартфона, за исключением модема. Используя полученную информацию, предлагаю написать наше небольшое приложение под Android-смартфон без Android сами!
❯ Подготавливаем окружение
В первую очередь, хотелось бы отметить, что программы под «голый» смартфон можно писать не только на C/C++. Нам доступен как минимум FPC, который довольно давно умеет компилировать голые бинарники под Android. Кроме того, мы можем портировать маленькие embedded-версии интерпретаторов таких языков, как lua, micropython и duktape (JS).
Однако в случае нативных программ, есть два важных правила, которые необходимо понимать. Во-первых, в Android используется собственную реализацию стандартной библиотеки libc — bionic, в то время как на десктопных дистрибутивах используется glibc. Между собой они не совместимы — именно поэтому вы не можете просто взять и запустить консольную программу для Raspberry Pi, например.

А второе правило заключается в том, что начиная с версии 4.1, Androidтребует, чтобы все нативные программы были скомпилированы в режиме -fPIE — т. е. выходной код должен не зависеть от адреса загрузки программы в виртуальную память. Для этого достаточно добавить ключ -fPIE, однако учтите, что если вы разрабатываете программу под Android 4.0 и ниже, то fPIE наоборот необходимо убрать — старые версии Androidнеподдерживают такой способ генерации кода и будут вылетать с Segmentation fault.
Для разработки нам понадобится ndk — там есть все необходимые заголовочники и компиляторы для нашей работы. Я используюndk r9c, поскольку в свежих версиях Google регулярно может что-то сломать.
ndk-build, к сожалению, здесь работать не будет, поэтому Makefile придется написать самому. Я составил полностью рабочий Makefile, который без проблем скомпилирует валидную программу, вам остаётся лишь поменять NDK_DIR.
NDK_DIR = D:/android-ndk-r11c/
TOOLCHAIN_DIR = $(NDK_DIR)toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/
GCC = $(TOOLCHAIN_DIR)arm-linux-androideabi-g++
PLAT_DIR = $(NDK_DIR)platforms/android-17/arch-arm/usr/
LINK_LIBS = -l: libEGL.so -l: libGLESv1_CM.so
OUTPUT_NAME = cmdprog
build:
$(GCC) -I $(PLAT_DIR)include/ -L $(PLAT_DIR)lib/ -fPIE -Wl,-dynamic-linker=/sbin/linker $(LINK_LIBS) -static -o $(OUTPUT_NAME) main.cpp micro2d.cpp
После этого пишем простенькую программу, которая должна вывести «Test» и компилируем её.
❯ Деплоим на устройство
Несмотря на то, что грузиться мы будем в режим recovery, нам всё равно будет доступен adb, через который мы сможем запускать и отлаживать нашу программу. Это очень удобно, однако по умолчанию adb включен только в TWRP, который нужно сначала найти или портировать под ваш девайс (на большинство старых брендовых устройств порты есть, на нонейм придется портировать самому — гайды есть в интернете). Под ваше устройство есть TWRP? Отлично, распаковываете recovery.img с помощью так называемой «кухни» (MTKImgTools как вариант):

Открываете init.recovery.service.rc и убираете оттуда запуск одноименной службы (можно просто оставить файл пустым).

Запаковываем образ обратно тем же MTKImgTools и прошиваем флэшером для вашего устройства — в моём случае, это SP Flash Tool (MediaTek):

Заходим в режим рекавери и видим зависшую заставку устройства и звук подключения устройства к ПК. Если у вас установлены драйвера, то вы сможете без проблем зайти в adb shell и попасть в терминал для управления устройством. Теперь можно закинуть программу — прямо в корень рамдиска (записывается программа в ОЗУ, но при переполнении, телефон уйдет в ребут — осторожнее с этим). Пишем:
adb push cmdprog /: adb shell chmod 777 cmdprog ./cmdprog
И видим результат. Наша программа запускается и работает!

Это просто отлично. Однако я ведь обещал вам, что мы напишем программу, которая сможет выводить графику и обрабатывать ввод, предлагаю перейти к практической реализации!
❯ Выводим графику
Для вывода графики без оконных систем, мы будем использовать API фреймбуфера Linux, которое позволяет нам получить прямой доступ к массиву пикселей на экране. Однако учтите, что этот способ полностью программный и может оказаться тормозным для вашего приложения: скорость работы прямо-пропорциональна разрешению дисплея вашего устройства. Чем выше разрешение, тем ниже филлрейт. В моём случае, матрица была с разрешением 960×540, 32млн цветов, IPS — очень недурно, согласны?
Фреймбуфер Linux может работать с самыми разными форматами пикселя, имейте это ввиду. На некоторых устройствах может быть 16-битный формат (262 тысячи цветов, RGB565), на моём же оказался 32х-битный с выравниванием по строкам (имейте это также ввиду). 32х битный формат. Работать с ним легко: открываем устройство /dev/graphics/fb0, получаем параметры (разрешение, формат пикселя), делаем mmap для отображения буфера с пикселями на экране в память нашего процесса и выделяем второй буфер для двойной буферизации дабы избежать неприятных мерцаний.
void m2dAllocFrameBuffer()
<
fbDev = open(PRIMARY_FB, O_RDWR);
fb_var_screeninfo vInfo; fb_fix_screeninfo fInfo;
ioctl(fbDev, FBIOGET_VSCREENINFO, &vInfo);
ioctl(fbDev, FBIOGET_FSCREENINFO, &fInfo); fbDesc.width = vInfo.xres;
fbDesc.height = vInfo.yres;
fbDesc.pixels = (unsigned char*)mmap(0, fInfo.smem_len, PROT_WRITE, MAP_SHARED, fbDev, 0); f
bDesc.length = fInfo.smem_len; fbDesc.lineLength = fInfo.line_length;
backBuffer = (unsigned char*)malloc(fInfo.smem_len); memset(backBuffer, 128, fInfo.smem_len);
printf(«Framebuffer is %s %ix%ix%i\n», (char*)& fInfo.id , fbDesc.width, fbDesc.height, vInfo.bits_per_pixel, fInfo.type);
>
Если не сделать предыдущий шаг и запускать нашу программу параллельно с recovery, то они обе будут пытаться друг друга «перекрыть» — эдакий race condition:

После этого пишем простенькие функции для блиттинга картинок (в том числе с альфа-блендингом). В инлайнах и критичных к скорости функциям лучше не делать условия на проверку границ нашего буфера — лучше «отрезать» ненужное еще на этапе просчета ширины/высоты:
__inline void pixelAt(int x, int y, byte r, byte g, byte b, float alpha)
<
if(x < 0 || y < 0 || x >= fbDesc.width || y >= fbDesc.height) return;
unsigned char* absPtr = &backBuffer[(y * fbDesc.lineLength) + (x * 4)];
if(alpha >= 0.99f)
<
absPtr[0] = b;
absPtr[1] = g;
absPtr[2] = r;
>
else <
absPtr[0] = (byte)(b * alpha + absPtr[0] * (1.0f — alpha));
absPtr[1] = (byte)(g * alpha + absPtr[1] * (1.0f — alpha));
absPtr[2] = (byte)(r * alpha + absPtr[2] * (1.0f — alpha));
> absPtr[3] = 255; >
for(int i = 0; i < image->height; i++)
<
for(int j = 0; j < image->width; j++)
<
byte* ptr = &image->pixels[((image->height — i) * image->width + j) * 3]; pixelAt(x + j, y + i, ptr[0], ptr[1], ptr[2], alpha);
>
>
И загрузчик TGA:
CImage* m2dLoadImage(char* fileName) <
FILE* f = fopen(fileName, «r»);
printf(«m2dLoadImage: Loading %s\n», fileName);
if(!f)
<
printf(«m2dLoadImage: Failed to load %s\n», fileName);
return 0;
>
CTgaHeader hdr;
fread(&hdr, sizeof(hdr), 1, f);
if(hdr.paletteType)
<
printf(«m2dLoadImage: Palette images are unsupported\n»);
return 0;
>
if(hdr.bpp != 24) <
printf(«m2dLoadImage: Unsupported BPP\n»);
return 0;
>
byte* buf = (byte*)malloc(hdr.width * hdr.height * (hdr.bpp / 8));
assert(buf);
fread(buf, hdr.width * hdr.height * (hdr.bpp / 8), 1, f);
fclose(f);
CImage* ret = (CImage*)malloc(sizeof(CImage));
ret->width = hdr.width;
ret->height = hdr.height;
ret->pixels = buf;
printf(«m2dLoadImage: Loaded %s %ix%i\n», fileName, ret->width, ret->height);
return ret;
>
И попробуем вывести картинку:
m2dInit();
test = m2dLoadImage(«test.tga»);
test2 = m2dLoadImage(«habr.tga»);
while(1)
<
m2dClear();
m2dDrawImage(test, 0, 0, 1.0f);
m2dDrawImage(test2, tsX — (test2->width / 2), tsY — (test2->height / 2), 0.5f);
m2dFlush();
>

Не забываем про порядок пикселей в TGA (BGR, вместо RGB), меняем канали b и r местами в pixelAt и наслаждаемся картинкой на большом и классном IPS-дисплее:


Производительность отрисовки не очень высокая, однако если оптимизировать код (копировать непрозрачные картинки сразу сканлайнами и убрать проверки в инлайнах), то будет немного шустрее. Google для подобных целей сделали собственный простенький софтрендер —libpixelflinger.
Есть вариант для быстрой и динамичной графики: использовать GLES, который без проблем доступен и из recovery. Однако, насколько мне известно (в исходники драйверов посмотреть не могу), указать фреймбуфер в качестве окна не получится, поэтому в качестве Surface для рендертаргета у нас будет служить Pixmap (так называемый off-screen rendering), которому нужно задать правильный формат пикселя (см. документацию EGL). Рисуем туда картинку с аппаратным ускорением и затем просто копируем в фреймбуфер с помощью memcpy.
❯ Обработка нажатий
Однако, ни о каких GUI-программах не идёт речь, если мы не умеет обрабатывать нажатия на экране с полноценным мультитачем! Благо, даже механизм обработки событий в Linux очень простой и приятный: мы точно также открываем устройство и просто читаем из него события в фиксированную структуру. Эта черта мне очень нравится в архитектуре Linux!
Каждое устройство, которое может передавать данные о нажатиях, находится в папке /dev/input/ и имеет имя вида event. Как узнать нужный нам event? Нам нужен mtk-tpd — реализация драйвера тачскрина от MediaTek (у вашего чипсета может быть по своему), для этого загружаемся в Android и пишем getevent. Он покажет доступные в системе устройства ввода — в моём случае, это event2:

Из event можно читать как в блокирующем, так и не в блокирующем режиме, нам нужен второй. Более того, в них можно инжектить события, что я показывал в статье про создание своей консоли из планшета с нерабочим тачскрином:
// Open input device evDev = open(INPUT_EVENT_TPD, O_RDWR | O_NONBLOCK);
После этого, читаем события с помощью read и обрабатываем их. На устройствах с резистивным тачскрином, передается просто ABS_POSITION_X, на устройствах с поддержкой нескольких касаний — используетсяпротокол MT. Когда пользователь нажал на экран, посылается нажатие BTN_TOUCH с значением 1, а когда отпускает — соответственно BTN_TOUCH с значением 0. Разные драйверы тачскрина используют разные координатные системы (насколько я понял), в случае MediaTek — это абсолютные координаты на дисплее (вплоть до ширины и высоты). На данный момент, я реализовал поддержку только одного касания, но при желании можно добавить трекинг нескольких нажатий:
void m2dUpdateInput()
<
input_event ev;
int ret = 0;
while((ret = read(evDev, &ev, sizeof(input_event)) != -1))
<
if(ev.code == ABS_MT_POSITION_X) tsState.x = ev.value;
if(ev.code == ABS_MT_POSITION_Y) tsState.y = ev.value;
if(ev.code == BTN_TOUCH) tsState.isPressed = ev.value == 1;
>
tsState.cb(tsState.isPressed, tsState.x, tsState.y); >
Теперь мы можем «возить» логотип Хабра по всему экрану:
void onTouchUpdate(bool isTouching, int x, int y) <
if(isTouching)
int main(int argc, char** argv) <
printf(«Test\n»);
m2dInit();
test = m2dLoadImage(«test.tga»);
test2 = m2dLoadImage(«habr.tga»);
printf(«Volume: %i %i\n», vol, muteState);
m2dAttachTouchCallback(&onTouchUpdate);
while(1) <
m2dUpdateInput();
m2dClear();
m2dDrawImage(test, 0, 0, 1.0f);
m2dDrawImage(test2, tsX — (test2->width / 2), tsY — (test2->height / 2), 0.5f);
m2dFlush();
>
return 0;
>

В целом, это уже можно назвать минимально-необходимым минимумом для взаимодействия с устройством и использованию всех его возможностей на максимум без Android. Более того, такой метод заработает почти на любом устройстве, в том числе и китайских NoName, где ни о каких исходниках ядра и речи нет. Теперь вы можете попытаться использовать ваше старое Android-устройство для чего-нибудь полезного без необходимости изучать API Android.
❯ Звук, модем и другие возможности
Для звука нам придётся использовать ALSA — поскольку эта подсистема звука сейчас используется в большинстве устройств на Linux. Судя по всему, тут есть режим эмуляции старого и удобного OSS, поскольку устройства /dev/snd/dsp присутствует. Однако, вывод в него какого либо PCM-потока не даёт ничего, поэтому нам пригодится ALSA-lib.
Другой вопрос касается модема и сети. И если Wi-Fi ещё можно поднять (wpa_supplicant можно взять из раздела /system/), то с модемом будут проблемы — нет единого протокола по общению с ним и кое-где, чтобы его заставить работать, нужно будет немного попотеть. Не стесняйтесь изучать исходники ядра (MediaTek охотно делится реализацией вообще всего — там и RIL, и драйвер общения с модемом) и смотреть интересующие вас фишки!
❯ Заключение
Как мы с вами видим, у старых девайсов все еще есть перспективы стать полезными в какой-либо сфере даже без Android на борту. На тех устройствах, где нет порта Ubuntu или обычного десктопного Linux, всё равно сохраняется возможность писать нативные программы и попытаться приносить пользу.
Не стесняйтесь лезть и изучать вендорские исходники — это даёт понимание, как работают устройства изнутри. Собственно, благодаря такому ежедневному копанию исходников системы и появилась данная статья! 🙂

Госдума РФ утвердила законопроекты, которые могут помешать участию граждан в крупных СПО-проектах
Государственная Дума РФ в третьем, окончательном, чтении приняла законопроекты №346588-8, №346769-8 и №346750-8, запрещающие участие граждан РФ в незарегистрированных в специальном реестре иностранных некоммерческих организациях, и вводящие, среди прочего, уголовную ответственность за организацию деятельности подобных организаций. Закон вступит в силу после того как пройдёт утверждение в Совете федерации и будет подписан президентом. У продвигаемого закона есть очень серьёзный побочный эффект — под его действие потенциально попадает участие во многих международных проектах, занимающихся разработкой свободного программного обеспечения.
Большая часть крупных открытых проектов, не принадлежащих коммерческим компаниям, зарегистрированы именно как некоммерческие организации для того, чтобы иметь возможность легально принимать и распоряжаться пожертвованиями, а также оплачивать труд наёмных работников. Так как критерии применения закона не определены, под его действие можно притянуть что угодно: от коммитов в репозиторий и до отправки сообщения об ошибке. Под угрозой преследования по новым статьям не только обычные пользователи СПО-проектов, но и сотрудники российских компаний, осуществляющие разработку и внедрение СПО по программе импортозамещения, так как делать это без участия в апстриме невозможно (российские разработчики активно делятся частью наработок с исходными проектами, а также сообщают о найденных ошибках).
Примеры курируемых некоммерческими организациями крупных СПО-проектов, без которых не обходится ни один дистрибутив Linux, включая отечественные ALT Linux, Astra Linux, Rosa Linux и др.:
Ядро Linux (управляется The Linux Foundation);
Вся GNU-обвязка каждого дистрибутива, включая стандартные утилиты (sed, awk, cat и т.д.), загрузчик операционной системы GRUB, компиляторы языков программирования C/C++, набор GnuPG, применяющийся для подписи пакетов во всех дистрибутивах, и т.д. (Free Software Foundation);
Веб-браузер Firefox и почтовый клиент Thunderbird (Mozilla Foundation);
СУБД PostgreSQL (The PostgreSQL Foundation);
СУБД MariaDB (MariaDB Foundation);
Пользовательское окружение KDE, включая все входящие в комплект поставки приложения, а также графический редактор Krita, офисный пакет Kalligra Office (KDE e.V.);
Пользовательское окружение GNOME, включая все входящие в комплект поставки приложения, а также графический редактор GIMP, офисный пакет GOffice (GNOME Foundation);
Язык программирования Python (Python Foundation);
Язык программирования PHP (PHP Foundation);
Язык программирования Perl (Perl Foundation);
Язык программирования Rust (Rust Foundation);
Среда разработки Eclipse и платформа Jakarta EE (Eclipse Foundation);
Офисный пакет LibreOffice (Open Document Foundation);
Офисный пакет OpenOffice, а также http-сервер Apache, сервер приложений Tomcat и др. (Apache Software Foundation);
Дистрибутив Debian, на котором основаны некоторые отечественные дистрибутивы Linux (организации Debian France, Debian.ch);
Операционная система FreeBSD, включая её ядро и все компоненты (FreeBSD Foundation);
Операционная система OpenBSD, сервер OpenSSH, а также множество стандартных утилит работы с SSH (The OpenBSD Foundation).
Операционная система NetBSD (NetBSD Foundation);
Автоматическое включение VPN на iPhone
Двое человек в комментариях попросили рассказать, как сделать автоматическое включение. Ранее это было доступно только для ограниченно числа приложений, сейчас — свобода. За идею и возможность спасибо @storminside.
Острожно! Дальше много скринов!
Для начала заходим в приложен «Команды» переходим снизу в пункт «автоматизация» и создаем новую, нажав на «+» сверху справа.

Далее выбираем нужное приложение: instagram, TikTok, Safari и т.д.; обращаем внимание на пункт «Открыто»

Далее выбираем активность — в поиске вводим и выбираем VPN

Обязательно выбирайте какой именно vpn нужен:

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

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

А и еще, опция появилась недавно. Тестировал на iOS 16.4.1. Но на относительно новой 16.1.2 пункт с впн отсутствует. В таком случае только обновляться.
Круто вообще, что такая штука появилась. Да и выпендриться можно среди близких и девушек, что вы погромист 😀 При быстром впн, будто и нет блокировок, и весь интернет свободен и вся жизнь впереди)
Ответ на пост «Как с вероятностью 95% оценить, что ваше устройство взломано?»
То, что посоветовал ТС — лютая клоунада. Но если же вам действительно хочется проверить, а не сливается ли чего лишнего с вашего компьютера, то рекомендую обратить внимание на Simple Wall. Простой интерфейс, удобная настройка, открытый исходный код — то что нужно, чтобы закрыть все исходящие соединения для непрошенных гостей и чуть больше контролировать, что творится в вашей системе. Ссылочка на гитхаб для роднуль

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

Анонс бесплатного курса "Командная строка для разработчиков"
По нашему опыту, современному backend-разработчику неплохо бы понимать Linux на каком-то уровне. Свои мысли насчёт того, зачем разработчику Linux, мы недавно оформили в виде статьи, вызвавшей особо бурные обсуждения.
Кто-то считает, что без линукса действительно никуда. Кто-то считает, что разработчику и в винде комфортно. Кому-то наши примеры показались выдуманными. Кто-то нашёл примеры очень жизненными.
На наш вкус, линукс полезен, но существует непростая проблема высокого порога входа. Есть либо огромные книги вроде Advanced Bash-Scripting Guide, либо фрагментарные статьи совершенно разного уровня качества, либо различные курсы. Курсов много разных, но у нас своё видение. Как в классическом комиксе про стандарты:

Сообщество любит отправлять новичков читать мануалы, что мега-полезно, но довольно непросто. Кстати, на курсе мы разберём, как читать man-ы.
Наша мотивация по созданию курса
Мы довольно давно готовим молодых python-разработчиков, и начинаем именно с базовых знаний в Linux, прививая желание и умение работать в терминале. Вдохновляясь курсом «Поколения Python» на степике, мы решили сделать свой бесплатный курс «Командная строка для разработчиков», посвящённый терминалу Linux, языку bash и базовому администрированию. Начинающим разработчикам поможем преодолеть неловкость перед текстовым терминалом, опытным разработчикам покажем неочевидные и полезные в работе фишки для увеличения продуктивности.
Курс начинался с оффлайна, а переход в онлайн требует существенной переработки материала. Поэтому релизимся поэтапно, выпуская новые уроки по мере готовности.
Подробнее о курсе
Курс сильно завязан на практику, поэтому обязателен компьютер с линуксом в каком-то виде. Мы предлагаем три варианта:
Ubuntu в качестве гостевой операционной системы. Для этого в системе виртуализации (virtualbox, VMWare или любой другой) поставить Ubuntu.
Ubuntu в качестве основной операционной системы. Годится любой Linux-дистрибутив или даже macOS.
Ubuntu в WSL2, он же Windows Subsystem for Linux.
Начало курса неспешное и подходит совсем для начинающих. При этом мы обращаем внимание на важные детали, на которые часто никто не обращает внимание. Например, когда выбирать короткие, а когда выбирать длинные флаги команды? Есть ли разница между ls -al, ls -la и ls —all?
Примерная структура курса
Модуль 1. Пользуемся Ubuntu. Осваиваем терминал
Введение в курс.
Перемещаемся по файловой системе.
Работаем с файловой системой.
Редактор текста, работаем с файлами. Создаём и запускаем скрипты.
Процессы, знакомимся с PID, ps | grep и конвейером.
Используем ctrl-r и работаем с историей команд. Алиасы.
Модуль 2. Программируем в Ubuntu. Основы Bash
Bash для разработчика, несколько занятий. Полезные однострочники на примере изменения формата файлов, сортировки в разных вариациях.
Всё про поиск — конкретных файлов, поиск внутри файлов .
Виртуальная файловая система proc. Используем proc, PID, PPID, дескрипторы стандартных потоков, файловые дескрипторы, аргументы командной строки, подменяем PATH. Переменные окружения (как они работают, область и время действия), в том числе PATH и HOME. Спецсимволы < > >> 2> 2>> &>.
Работаем с учётными записями в Ubuntu. Разграничиваем права доступа.
Применяем sudo и root. Немного про безопасность, проблемы копирования из терминала, про пакеты, которые ставятся курлом.
Добро пожаловать на курс «Командная строка для разработчиков»! Введение и первое занятие уже доступно.
Интереса ради, мы спросили ChatGPT, нужен ли линукс для питонистов.
ChatGPT о важности Linux для python-разработчика
Python-разработчикам может быть полезно использовать операционную систему Linux в своей работе по ряду причин.
Во-первых, Linux обычно является основной платформой для серверных приложений и веб-серверов, которые часто используются для хостинга Python-приложений. Разработчики, работающие с серверными приложениями, должны быть знакомы с Linux, чтобы установить, настроить и поддерживать серверное окружение.
Во-вторых, многие инструменты и библиотеки для Python, такие как NumPy, SciPy и Pandas, часто предназначены для работы в Linux-подобных операционных системах. Разработчики, которые используют эти инструменты, будут иметь преимущество, если они работают на Linux.
В-третьих, Linux предлагает множество инструментов командной строки, которые могут значительно упростить и ускорить разработку. Например, Linux-разработчики могут использовать командную строку для автоматизации задач, обработки данных, управления пакетами и тестирования кода.
Наконец, Linux является бесплатной и открытой операционной системой, которая имеет широкое сообщество разработчиков и пользователей. Это означает, что Python-разработчики могут получить доступ к большому количеству бесплатных инструментов, библиотек и ресурсов, которые могут помочь им в их работе.
В целом, использование Linux может значительно улучшить производительность и эффективность работы Python-разработчика, поэтому знание и опыт работы с этой операционной системой могут быть ценными навыками для разработчика.
Как считаете, правы ли нейросети?

Обаятельный робот-сортировщик из Lego "Spike Prime"
Последний год я плотно увлеклась лего-робототехникой, программированием для детей и подобными вещами, потому что моя сестра открыла клуб технического творчества «Кубарий».
Пока мой любимый набор — Spike Prime. Он весёлый и яркий, лёгкий в сборке, а возможностей у него много.
Я только недавно плотно занялась изучением этого набора, прохожу курс по нему на Фоксфорде. Уже начинаю изобретать собственные простые постройки, но что-то сложное изобрести мне пока тяжело, так что осваиваю интересные инструкции из интернета.
Это робот, который сортирует кубики по цветам. В наборе есть датчик цвета. Выглядит, как попугайчик или, возможно, кобра.
В сборке не самая простая модель, лучше давать взрослым или уже опытным ученикам.
Вот такая копия у меня получилась:
Пожалуй, самое интересное и полезное для меня в механизме было то, что подъём и закрытие челюсти контролируются одним и тем же мотором. Получается, при подъёме неизбежно закрывается челюсть и наборот.
Программируются такие роботы с помощью простого языка scratch, состоящего из цветных блоков. В видео есть пример программы, но мне пришлось её немного переделать.

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

Оставила попуга собранным, чтобы показывать ученикам. Они ставили эксперименты, например он так же успешно сортирует лего-человечков из серии майнкрафт, у которых квадратная голова.
Из сложностей — у попугая иногда сбивается положение шестерёнок и мотора, приходится поправлять. И если я выключаю его, когда он в нижней точке, а потом включаю — он не может вернуться в исходное положение. Скорее всего, потому что он возвращается в положение 0 «самым коротким путём», и когда он в нижней точке этот короткий путь противоречит его конструкции.
Один из учеников вдохновился и решил собрать такого же, но со своими дополнениями.
Если у вас есть на примете интересные инструкции и идеи для лего-роботехники, буду рада их услышать.
Парсим яндекс диск при помощи Python
В данный момент я работаю контент-менеджером в «крупном» интернет — магазине. В моём случае, это больше 100 000 позиций.
Иногда приходится сталкиваться с такой проблемой: поставщик присылает фотографии со ссылками на яндекс диск. Это крайне неудобно, потому что приходится ходить по каждой ссылке и скачивать изображение к себе, а затем уже загружать на сервер и т.д.
Готового решения я не нашел и решил написать свою реализацию работы с яндекс диском. Хорошо, что я знаю python.
У меня было 2 версии программы:
когда по ссылке находится папка с картинками, python скачивает эту папку как зип файл, затем распаковывает. Все манипуляции записываются в csv файл, путь до файла с картинками
когда по ссылке идёт только одна картинка, в данном случаи все немного проще, не нужны лишние действия с распаковкой картинок
p.s. ещё были 2 побочные небольшие программки: 1-я для уменьшения размера картинки, 2-я для переименования картинок (менялся пробел на дефис)
Приступим к реализации
скачать и установить python c официального сайта https://www.python.org/downloads
открыть любимый редактор кода (я использую vscode) https://code.visualstudio.com
подключить следующие стандартные библиотеки: urllib.parse, csv, os, zipfile. Установить библиотеку requests https://pypi.org/project/requests/ (для отправки запроса на сервер)
для полного фен-шуя можно использовать виртуальное окружение, дабы не засорять систему ненужными пакетами. Подробнее о virtualenv можно ознакомится по ссылке https://docs.python.org/3/tutorial/venv.html или же использовать poetry.
Ссылки на яндекс диск имеют вид: https://disk.yandex.ru/d/xNBn7lE1_Y5knQ . Чтобы их можно было скачать, они должны быть публичными.
Обратимся к API яндекс. После ключа public_key=»вставляем_ссылку_на_файл»
В ответе мы получаем json, из которого нам нужно получить значение по ключу href. Полученное значение и будет нашей прямой ссылкой к файлу.

Пожалуй, на этом хватит теории, теперь, постараюсь внятно объяснить, как всё это можно применить в контексте python.
# создаем новый файл и подключаем нужные нам библиотеки
import requests
from urllib.parse import urlencode
import csv
import os
import zipfile
Для начало создадим функцию, которая будет возвращать нам ссылку для скачивания:
final_url = base_url + urlencode(dict(public_key=public_link))
response = requests.get(final_url)
parse_href = response.json()[‘href’]
return parse_href
Файлы могут быть в разных форматах: ссылки могут быть на одну или несколько картинок. В первом случае можно напрямую скачивать картинку по ссылке. Во втором, если по ссылке несколько картинок, то при скачивании мы получаем архив, который требует дополнительных действий (распаковку).
Далее, мы скачиваем файлы и в зависимости от его типа выполняем действия: просто записываем в результирующий файл или же переходим к его распаковке с последующей записью.
В итоге, мы получаем файл result_data.csv со ссылками на фотографии на нашем жестком диске:

В добавок, у нас на жёстком диске появляется папка со скаченными картинками в папке download_files.
Полностью посмотреть код можно в репозитории на гитхаб.
p.s. Официальная документация по API Яндекс. Диска
Братишка с пикабу подсказал готовую библиотеку на питоне. Спасибо b4ro тык.
p.s.s. Немного поразмышляв, я подумал, что неплохо было бы написать, тесты. Пройтись линтером по коду. Добавить функцию переименования файлов. Может быть что-нибудь ещё?)
Спасибо за прочтение! Комментарии, лайки, дизлайки, предложения, пожелания крайне приветствуются.
Забугорная халява 2009
В далеком 2009 году, когда деревья были большими, Убунту на дисках присылали совершенно бесплатно, стоило только попросить на официальном сайте. До последнего не верил, пока не забрал диск на почте России. Жаль, что в 2011 лавочку прикрыли.


Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера

К сожалению, в наше время многие старые, но весьма неплохие по характеристикам гаджеты отправляются напрямую в помойку, и их владельцы не подозревают, что им можно найти применение. Сервер, мультимедийная-станция, да даже просто как TV-приставка — люди в упор не замечают сфер, где старенький планшет мог бы быть полезен. Но как быть, если посвящаешь жизнь портативным гаджетам, кодингу и копанию в железе? Правильно: сделать довольно мощную игровую консоль из старого планшета самому! Сегодня вам расскажу, как я сделал свою портативную приставку из планшета с нерабочим тачскрином, Raspberry Pi Pico и 8 кнопок! За рабочим результатом прячется несколько дней работы: поиск UART на плате, разработка контроллера геймпада на базе RPi Pico, написание приложения-сервиса, которое слушает события и отправляет их в подсистему ввода Linux в обход Android. Интересно? Тогда жду вас под катом!
❯ Мотивация
Прошло уже практически 10 лет с того момента, как у меня появилась моя первая портативная консоль. Несмотря на то, что я был заядлым ПК-игроком, я уже успел посмотреть на PS3 и PSP, но денег на их покупку у меня особо не было, да и к тому времени уже был в наличии Android-планшет. Но к моему 13-летию в 2014 году, когда я ходил и выбирал себе будущий девайс на день рождения, отец и мама решили подарить мне мою первую портативную консоль. Изначально, я уговаривал её купить мне целых два девайса, но бюджет был ограничен 4.000 рублей, а я хотел взять смартфон Fly IQ239 и консоль JXD S601 одновременно:

Однако, увидев здоровую 7-дюймовую консоль в магазине TREC (думаю, жители южной части РФ помнят такой), мама уговорила меня взять именно её, мотивируя это «ну и чего ты будешь тыкаться в этот мелкий экран? Возьми большую». После покупки гаджета, я был доволен: играл какие-то игрушки с ретро-платформ, устанавливал игры на Android, сидел в ВК через Kate Mobile. Что еще нужно было школяру? Однако, планшет прожил у меня недолго: с очередного лага я психанул и ударил по нему кулачком, унеся на тот свет и дисплей и тачскрин. Так консолька и пролежала в подвале около 8 лет. Впрочем, мне продолжали импонировать подобные устройства и в прошлом году я купил и написал про несколько подобных девайсов.

Несколько месяцев назад, мой читатель Кирилл Севостьянов с Хабра прислал мне HTC HD2 в качестве донора и планшет Prestigio PMP7170B3G, который был рабочим, но… у него отказал тачскрин. Я всё думал, чего бы с ним сделать и решил реализовать игровую консольку своими руками из подручных средств. Идея крутилась в голове довольно давно, но реализовал я её только сейчас.
❯ Что нам нужно сделать?
Итак, что должно быть у портативной консоли? Чипсет, дисплей, звук, ОС — это всё нам уже предоставляет планшет. Нам остаётся лишь сделать свой геймпад. Давайте подумаем, что нам будет нужно для того, чтобы его сделать и передавать от него события на планшет:
Контроллер для геймпада: тут нам подойдет практически любой микроконтроллер, который работает от 3.3в. Выбор большой: Arduino Pro Mini 3.3v, ESP32, RPi Pico. Я остановился на последнем: недавно я взял себе две штучки «пощупать» их — и они мне очень понравились!
Физический интерфейс: с планшетом нужно как-то общаться. У нас есть три варианта: USB (не факт, что поддержка преобразователей включена в ядре), UART и SPI/I2C на пятачках тачскрина (потребуют написания драйвера т. к. в android-устройствах нет прямого доступа к SPI/I2C из userland’а). Я остановился на UART: его легко найти на большинстве китайских планшетов, а если не получилось — то на помощь может прийти схема платы.
Программная реализация: как это будет работать? Я решил реализовать геймпад в виде сервиса на Android, который слушает состояния кнопок с UART и «инжектит» события напрямую в драйвер ввода. Таким образом, поддержка нашего геймпада появляется даже в самой системе — можно управлять менюшкой или приложениями как с клавиатуры!
С планом определились, пора начать с программной части: сначала нам обязательно понадобится ROOT-доступ. Его получение на разных девайсах отличается — на prestigio уже был порт CWM и я просто поставил SuperSU. Без ROOT доступа мы не сможем использовать UART!

Теперь нам нужно найти пятачки UART на плате. Разведен он не везде, но в случае устройств на MediaTek — почти всегда, ещё и пятачки подписаны. На моём планшете он нашёлся сразу: был между двух металлических экранов и соответствовал 4-ому каналу UART. Получить к нему доступ можно в /dev/ttyMT3. Я использую ESP32 в качестве UART преобразователя: подпаиваемся к RX/TX, запускаем putty и заходим в adb shell. Определяем бодрейт (скорость) нашего UART порта — на MediaTek он обычно равен 921600, на других чипсетах — 115200. Пытаемся что-то вывести и хоба — мы уже можем «поболтать» с планшетом!

❯ Приложение-сервис
Итак, у нас уже есть доступ к UART и мы можем общаться с планшетом из внешнего мира. Но получить события с кнопок пол дела, нужно их ещё и послать в систему. Для этого есть целых три способа:
InputManager.injectInputEvent — именно этим методом пользуется команда input, которую вы можете использовать через adb. Но увы, он работает только при наличие разрешения INJECT_EVENTS, который доступен только системным приложениям — находятся они в /system/app и подписаны тем же сертификатом, что и остальная прошивка.
Модуль uinput дает возможность создать виртуальное устройство ввода и посылать события из userland’а — т. е. из прикладного приложения. У моего планшета было устройство /dev/uinput, но lsmod показывал, что сам модуль не загружен. Так что отметаем — он есть не везде.
Прямой инжект событий в character устройство — весьма грязный хак, который позволяет инжектить события, не притворяясь системным приложением, но имеет некоторые ограничения. Именно его я и выбрал и о ограничениях ниже.
Сначала нам нужно узнать, какие кнопки поддерживают загруженные устройства ввода в системе. Для этого используем команду getevent -li. Там есть разные устройства ввода, в том числе и тачскрин (если вам нужно симулировать нажатия на экран), мне же подошёл драйвер физических кнопок mtk-kpd. Он занимается обработкой кнопок громкости, включения и т. п. Тут важно обратить внимание на то, что если попытаться послать кнопку, которое устройство не реализует (например пробел), то ничего не произойдет:

Инжект событий я писал на C, т. к. это требовало прямой записи input_event, а в Java прокинул его через Jni. Концепция простая: открываем устройство /dev/input/event2 и посылаем в него события ввода и синхронизации (это обязательно!), которые затем Android читает и обрабатывает:
#include <linux/uinput.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <android/log.h>
#include <jni.h>
int uinput;
extern «C» JNIEXPORT void JNICALL Java_com_monobogdan_inputservicebridge_InputNative_init(JNIEnv *env, jclass clazz) <
uinput = open(«/dev/input/event2», O_WRONLY);
__android_log_print(ANDROID_LOG_DEBUG , «Test», uinput >= 0 ? «Open event OK» : «Failed to open event»); >
void emit(int fd, int type, int code, int val) <
struct input_event ie; ie.type = type;
ie.code = code; ie.value = val;
ie.time.tv _sec = 0;
ie.time.tv _usec = 0;
write(fd, &ie, sizeof(ie)); >
extern «C» JNIEXPORT void JNICALL Java_com_monobogdan_inputservicebridge_InputNative_sendKeyEvent(JNIEnv *env, jclass clazz, jint key_code, jboolean pressed) <
__android_log_print(ANDROID_LOG_DEBUG , «Test», «Send»);
emit(uinput, EV_KEY, key_code, (bool)pressed ? 1 : 0);
emit(uinput, EV_SYN, SYN_REPORT, 0);
>
Основной обработкой занимается сервис, который я реализовал в отдельном потоке: он слушает события с UART и посылает соответствующие изменения состояния через sendKeyEvent. На вход приходят простые сообщения вида:
U L где U/D — нажато, не нажато, а L — однобайтовый идентификатор кнопки. В случае L — это влево, R — вправо и т. п. Вся доступная раскладка хранится в словаре. Причём само чтение из UART реализовано костылем с чтением «чужого» stdout, т. к. android-приложения не умеют сами по себе работать с root правами. В теории, это могло дать неприятный оверхед, но на практике никакого серьезного инпут лага это не создает. Не забываем сделать устройство event записываемым — ставим ему права 777:
package com.monobogdan.inputservicebridge;
public class InputListener extends Service <
private static final int tty = 3;
private InputManager iManager;
private Map<Character, Integer> keyMap;
private Method injectMethod;
private Process runAsRoot(String cmd)
<
try <
return Runtime.getRuntime().exec(new String[] < "su", "-c", cmd >);
>
catch (IOException e)
<
e.printStackTrace();
return null;
>
>
@override
public void onCreate() <
super.onCreate();
// According to linux key map (input-event-codes.h)
keyMap = new HashMap<>();
keyMap.put(‘U’, 103);
keyMap.put(‘D’, 108);
keyMap.put(‘L’, 105);
keyMap.put(‘R’, 106);
keyMap.put(‘E’, 115);
keyMap.put(‘B’, 158);
keyMap.put(‘A’, 232);
keyMap.put(‘C’, 212);
InputNative.init();
try <
runAsRoot(«chmod 777 /dev/input/event2»).waitFor();
> catch (InterruptedException e) <
throw new RuntimeException(e);
>
Executors.newSingleThreadExecutor().execute(new Runnable() <
@override
public void run() <
Process proc = runAsRoot(«cat /dev/ttyMT» + tty);
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
while(true)
<
try <
String line = reader.readLine();
if(line != null && line.length() > 0) <
Log.i(«Hi», «run: » + line);
boolean pressing = line.charAt(0) == ‘D’;
int keyCode = keyMap.get(line.charAt(2));
Log.i(«TAG», «run: » + keyCode);
InputNative.sendKeyEvent(keyCode, pressing);
>
>
catch(IOException e)
<
e.printStackTrace();
>
/*try <
Thread.sleep(1000 / 30);
> catch (InterruptedException e) <
e.printStackTrace();
>*/
>
>
>);
>
@override
public IBinder onBind(Intent intent) <
return null;
>
>
Таким образом, если мы отправляем с ПК «D L» — система считает, что мы зажали стрелку влево, а U L — считает что мы отпустили. Но если mtk-kpd поддерживает стрелки и еще некоторые действия без каких либо проблем, то enter в список обрабатываемых кнопок не входит: придется мудрить! И тут нам приходит на помощь механизм трансляции кодов кнопок в действия: они хранятся в специальных файлах .kl в /system/usr/keylayout/. Я назначил DPAD_CENTER на… кнопку регулировки громкости звука! Ну, а почему бы и нет. 🙂 Таким образом можно переназначить уже имеющиеся кнопки громкости на, например, start/select.

❯ Геймпад
После того, как сервис был готов и отлажен, нужно было реализовать хардварную часть проекта — сам геймпад. В качестве контроллера я, как уже говорил, выбрал Raspberry Pi Pico на базе МК RP2040 — бодреньком контроллере с двумя ARM Cortex-M0 ядрами. Стоит копейки, а в отличии от ESP’шек, его SDK не такое перегруженное и выглядит более приближенным к bare-metal.

На данный момент, я решил развести все кнопки на бредборде — макетной плате без пайки, т. к. макеток для пайки у меня под рукой не было. Сделал примитивный геймпад:

Развел на соответствующие GPIO:

И написал примитивную прошивку, которая отслеживает состояние кнопок. В прошивке точно так же есть словарь, задающий ассоциацию между физическими пинами и «виртуальными» кнопками. При нажатии или отжатии кнопки, программа изменяет стейт и отсылает новое состояние планшету.
Собираем всё вместе и тестируем. Хоба, всё работает, мы можем перемещаться по менюшке используя наш геймпад!

А почему бы не попробовать поиграть в какую-нибудь игру? Ну мы же консоль вроде делаем: берём эмулятор NES, биндим кнопки в настройках и наслаждаемся игрой в Марио!
❯ Заключение
Реализация этого проекта заняла у меня не так уж и много времени: всего около 3-х дней работы по вечерам. Вероятно кто-то спросит: «а чего ты просто Bluetooth геймпад не купил?». Так это не прикольно ведь. Гораздо приятнее играть в девайс, к которому ты приложил руку сам. Более того, не у всех старых планшетов есть BT. Обошёлся на данной стадии проект недорого: планшет мне подарили бесплатно (точно также у вас дома может лежать подобный), RPi Pico — 350 рублей, кнопки по 10 рублей/штучка.
В целом, я сам по себе обожаю копаться в различных железках и их софтварной части (вспомнить хотя-бы статью про перекомпиляциюu-boot из вендорских исходников для нонейм консоли), а созидать что-то свое вообще вызывает какие-то нереальные всплески эндорфина — оно и понятно! 🙂
Однако несмотря на то, что мы уже имеем рабочий «прототип», проект далёк от завершения: я намерен довести его до конца и окончательно перевоплотить старый планшет в автономную игровую консоль (и рассказать об этом во второй части статьи). Для этого мне понадобится распечатать корпус и кнопки на 3D-принтере. К сожалению, у меня в городе ни у кого особо нет 3D-принтеров, поэтому начну копить на Ender 3, а от вас, читателей, с удовольствием почитаю мнение в комментариях и советы касательно выбора принтера!