четверг, 12 января 2023 г.

воскресенье, 23 января 2022 г.

Превращаем блок питания EMC SPS в обычный бесперебойник

Волею судеб попал мне в руки блок гарантированного питания от EMC Clariion, CX3 или CX4 (за давностью документов уже не осталось). Само СХД было давно списано, а блок пылился на шкафу уже много лет. На самом блоке написано "Southboro, MA01772 Standby power supply". Парт намбер, если кому интересно - 100-809-017.
Естественно, возникло желание использовать его дома как обычный бесперебойник - все же 1200 ватт заявлено на наклейке. Сам он без шумящих вентиляторов, нет никаких пищящих динамиков, плоский, так что можно запихать куда-нибудь под шкаф в спальне и он не будет мешать спать. А металлический корпус спасет от пожара.

понедельник, 24 мая 2021 г.

Recalbox и не запускающийся Kodi

Развернул Recalbox чтобы поиграться на этом эмуляторе в что-нибудь старое и ламповое - и обнаружил, что в нем не запускается Kodi. Погуглив, выяснилось, что подобное поведение происходит при определенных моделях геймпада, в частности, на моем китайском "SHANWAN PS3/PC Gamepad", и кроме замены геймпада решения нет.

Авторы Recalbox пишут, что это баг Kodi - но на самом деле это их баг.

четверг, 10 сентября 2020 г.

Linux 5.8 на f1c100s и mmdebstrap

Продолжаю играться с Lichee Pi Nano - небольшой платой с 32-битным ARM процессором, поддерживающим Linux. Так как процессор f1c100s не одинок в своей серии, и попиново совместим с f1c200s - поиск по билдам Linux для f1c200s привел к репозитарию: https://github.com/xiaofengvskuye/linux/tree/f1c100s-v5.8 - там готовая Linux 5.8 с поддержкой всех "фишек" данного процессора: LCD экран с тачскрином, USB host, аудиовывод, выход на hdmi, даже, пишут, что можно использовать аппаратное ускорение декодирования видео, если собрать библиотеку cedar. 

четверг, 14 мая 2020 г.

Эмулятор мыши на Arduino

В свете удаленной работы, на все VDI в офисе расставили агента, определяющего активность пользователя. Первая мысль, которая пришла в голову - сделать имитатор мыши, благо в RDP или ICA сессии невозможно определить откуда именно пришли перемещения.

Программных реализаций мышкодвигателей - полно, так что в этот раз мне захотелось реализовать именно аппаратное решение.

Мысль была следующая. Arduino и подобные платы разработки видятся системой как USB to COM интерфейс. А в Windows, включая Windows 10, до сих пор присутствует поддержка Serial Mouse. Поэтому ничего сложного не составит сэмулировать подобную мышь без какой-либо пайки, а только штатными средствами имеющейся в наличии платы.

воскресенье, 19 апреля 2020 г.

EggBot из 101Hero

После приобретения Ender 3 Pro вместо примитивного 101Hero, возникла идея использвоать высвободившиеся запчасти подо что-то [бес]полезное. А тут как раз пришло время красить яйца, и вгляд упал на EggDuino-подобные поделки. Вот, например, с Thingiverse, там как раз моторы 28byj-48, которые шли в комплекте с принтером.

Первую попытку сделать яйцебот я предпринял еще весной прошлого года, и могу сразу сказать, что 28byj лучше не использовать - они очень сильно люфтят и нормальную картинку получить не удастся.

суббота, 11 апреля 2020 г.

Сборка Linux на Lichee Pi Nano

Приобрел себе плату Lichee Pi Nano. Производителем заявлена поддержка USB OTG, LCD экрана, SD карта и сборок Linux для ARM процессоров.

Как бывает часто с китайскими поделками - плата с наскоку не завелась. Оказалось, что сдохла встроенная SPI Flash. Сперва определялась 1 раз из 5, а после прогрева контактов паяльником вообще перестала работать. Пришлось делать загрузку с SD карты.

четверг, 2 мая 2019 г.

Доработка 3D принтера 101hero

В начале года  приобрел себе игрушку: 3D принтер 101Hero.


Принтер обладает крайне низкой ценой - и на этом все его достоинства заканчиваются. Корпус из пластика, моторы - люфтят и греются, хот-энд и экструдер нестандартные. Через пару дней печати noname PLA пластиком, у хот-энда лопнула карбоновая часть и горячий пластик начал сочиться отовсюду, кроме сопла.

среда, 18 апреля 2018 г.

Получение root на Mikrotik RouterOS версии 6.42

Алгоритм, предложенный мной ранее для получения интерактивного SHELL с правами рута более не работает. Начиная с версии 6.42 поменялся способ проверки наличия пакета option. Теперь не просто проверяется наличие файла /pckg/option, а дополнительно осуществляется проверка, что он является symbolic link в папку /bndl/.

Однако, по прежнему работает автоматический запуск скриптов, как я описал тут. Достаточно в скрипт добавить строки:
  1. rm -rf /pckg/option
  2. ln -s /bndl/dhcp /pckg/option
и мы снова получаем SHELL.

Либо можно запускать из скрипта свой собственный telnet/ssh демон, работающий на нестандартном порту.

четверг, 5 апреля 2018 г.

Запуск стороннего ПО на рутерах Mikrotik

В прошлом посте я описал один из способов получения рута на Mikrotik, путем создания симлинка на корневой каталог. Отмечу, что при использовании данного метода наблюдается один не смертельный баг - очень долго открывается меню работы с файлами через WebFig и WinBox, а так же медленно отрабатывают команды "/file print ...", "/file set ..." в скриптах (вплоть до отказа по таймауту). Вызвано это тем, что модуль /nova/bin/fileman, реализующий операции по работе с файлами, зачем-то при запуске каждой команды "/file", сканирует диски и собирает список всех находящихся на них файлов. Занимает это довольно долгое время, отсюда и "тормоза".
Но так как работа с файлами на Mikrotik и без этого весьма убога - данный баг не критичен. Лучше для работы с файлами использовать нативный BASH.

Разблокированный логин "devel" уже позволяет запускать на рутере стороннее ПО. Осталось найти способ автоматического запуска нужных нам команд при загрузке рутера, без необходимости подключения к нему по Telnet/SSH. Первой мыслью было попробовать написать скрипт, подключающийся с рутера самому к себе по SSH под "devel" и выполнять нужные команды - однако, этот вариант не работает. Kirils Solovjovs в своей jailbreak tool правит файловую систему рутера - я подобные изменения вносить не планирую, чтобы иметь минимум проблем после штатного апгрейда RouterOS. Поэтому, пришлось искать другой способ. И он нашелся.

пятница, 23 марта 2018 г.

Получение root на Mikrotik с USB портом

Вдохновившись прочтением презентации Kirils Solovjovs по поводу получения прав root и запуску своих приложений на RouterOS, надумал наконец поднять на своем RB951G-2HnD что-нибудь интересное, вроде полноценного bind9.

В версиях до 6.41 для получения рутованного shell было достаточно создать файл /nova/etc/devel-login (достигалось это путем создания файла бэкапа конфигурации, его исправления и последующей загрузки на устройство, см код тут, а в еще более старых версиях OS, как поступали китайские товарищи, можно было просто выполнить команду "/tool sniffer save file-name=../../nova/etc/devel-login"), однако, в последних версиях этот вариант был прикрыт. Вместо него теперь проверяется наличие пакета "option" при вводе логина devel.

воскресенье, 10 декабря 2017 г.

Выключение автозапуска ранее открытых приложений после перезагрузки Windows 10

Ориентировочно после билда 16299.15, наткнулся на крайне раздражающее поведение 10ки - она автоматически перезапускает приложения, которые были запущены перед нажатием на "ребут". Обычно это окна браузера, но подобному рестарту полежит так же и запущенный Regedit, который "пугает" окном UAC после перезагрузки, а так же ряд других приложений.

Об этом написано тут, и тут, и в куче еще мест. Способа "победить" данное поведение с помощью групповых политик не найдено (раньше, говорят, работало отключение "Use my sign-in info to automatically finish...", мне не помогло).

Приводится цитата инженера MS: 
Old behavior:
  • When you shut down your PC, all apps are closed
  • After reboot/restart, you have to re-open any app you'd like to use
New behavior:
  • When shutting down your PC, any open apps are "bookmarked" (for lack of a better word)
  • After reboot/restart, these apps will re-open automatically
If you want to start with no apps open (other than those set to auto-start via Task Manager/Start), you'll need to ensure all apps are closed before shutting down or restarting the PC.

вторник, 19 апреля 2016 г.

Колхозный хоум-сервер с мониторингом

Волею судеб досталось мне несколько SAS HDD дисков, материнская плата Asus P5K, Xeon E5450 с переходником на LGA755, и решил я сделать из них себе NAS. Да не просто NAS, а полноценный home server - с хостом виртуализации на Hyper-V в качестве "ядра", одной виртуалкой под файлопомойку и DLNA сервер, второй - под инфраструктурные сервисы вроде обхода роскомнадзора и KMS эмулятора, третьей - с 10кой под разные извращения, и еще даже немного ресурсов в запасе осталось :)

понедельник, 1 февраля 2016 г.

Тонкий клиент HP t610 как домашний медиацентр

Написать свои мысли сподвигла данная статья на хабре. В ней на основе тонкого клиента T610 автор поднимает home сервер на Centos 7.

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

Под рукой "внезапно" оказался тонкий клиент HP t610. ТК у меня был не t160 plus, как у автора статьи на хабре, а его "тощий" вариант - без райзера и возможности установить туда дополнительную видео или сетевую карту, зато вдвое меньшей толщины.


Что есть в наличии у t610:
  • Процессор AMD Dual-Core T56N 1.65 ГГц
  • Видеокарта Radeon HD 6320
  • Display Port и DVI
  • 2 USB3 и 4 USB2 порта
  • 2 PS/2 и 1 COM порт
  • Broadcom BCM57781 Gigabit Ethernet
  • WiFi+Bluetooth комбайн BCM943228HM8
  • 2 SATA разъема
  • 1 40-пиновый (ноутбучный) ATA
И самое главное - всё на пассивном охлаждении. То есть, идеально подходит для домашнего медиацентра - посторонние звуки издавать не будет, даже если будет оставаться включенным круглосуточно.


четверг, 15 мая 2014 г.

Установка Windows 2003 Server на недорогом VPS-хостинге

Понадобился мне на днях виртуальный сервер под Windows, работающий круглосуточно и находящийся на стабильном канале. Быстрый поиск по сайтам натолкнул на сервис где с большим отрывом по цене выделялась компания ITL DC 

На минимальном тарифе дают 1-ядерную виртуалку под KVM-QEMU c 15 Гб HDD, 512 Мб памяти и неограниченным трафиком. Данные параметры подходят под минимальные требования 2008r2, а 2003 сервер – будет просто летать.

Триального доступа к своим сервисам провайдер не дает, но можно заказать виртуалку сроком на 1 день, я так и сделал, чтобы поиграться. Следует отметить, что провайдер меряет сутки не от момента оплаты, а по концу дня своего местного времени, и виртуалка, оплаченная в обед «превратилась в тыкву» в 1 час ночи по Москве, хотя я рассчитывал ее покрутить еще и утром.

Преконфигурированными для данной конфигурации VPS доступны только линуксы – при попытке выбрать Windows получаем «For the OS 'Windows-Server-2008-R2-Web' at least 768 MiB of RAM is required», что не является правдой.
Меня же интересует Windows 2003 Server, который, увы никак не доступен на данном провайдере – ни среди готовых шаблонов, ни среди образов компакт-дисков. Конечно, можно написать, чтобы они добавили ISOшку, да еще и интегрировали туда драйвера virtio (иначе 2003 сервер не увидит жесткий диск), но это не наш метод.
На всякий случай выбираю шаблон с 32-битным Linux, тк 2003 сервер будет 32-битным.

Для установки 2003 сервера мы пойдём таким путем: разбиваем HDD на 2 части, в начале диска – 5 Гб раздел NTFS, он «примет» на себя Windows 2003. На вторую половину – ставится любая доступная операционка, из-под которой копируются установочные файлы Windows 2003 на первый раздел, первый раздел делается активным – и profit. После завершения установки Windows 2003 второй раздел можно будет удалить. В качестве «буферной» OS я использую windows 2008 r2, тк ее ISO образ доступен для монтирования. Но подойдет и любая другая OS, главное, чтобы была возможность из-под нее создать совместимый с Windows 2003 код MBR и бутсектор первого раздела.

понедельник, 25 февраля 2013 г.

Shim-ы и RT

С развитием эмулятора x86 Windows на Windows RT - практически каждый день сталкиваюсь с новыми багами в эмулируемых приложениях. Причем, причина некоторых "злостных" багов - не недостатки эмулятора, а кривость рук или природная лень авторов данных приложений.
То, что программы обращаются к блоку памяти после его освобождения или возвращают указатели на строки, выделенные на стеке - это еще мелочи. К выходу за пределы блока памяти  и к тому, что некоторые программы используют исключения Access Violation в своей нормальной работе вместо проверки параметров функций - я уже привык. Но вот некоторые конструкции заставляют переделывать большие участки существующего кода, просто чтобы заставить подобные программы хоть как-то работать. В итоге все-равно получается "не красиво", так как инече просто не реализуемо при использвоании имеющихся x86 движков (это я, например, про использование SuspendThread для синхронизации потоков). Так что вопрос о создании своего х86 движка, неуниверсального, но зато "заточенного" под конкретные нужды - давно решен утвердительно. Осталось только выделить на него время.

Чем больше занимаюсь проектом - тем больше начинаю уважать микрософт в плане поддержки старого софта на новых версиях Windows. И тем больше понимаю, что для осуществления запуска x86 программ на RT банального враппера поверх "родного" API и трансляции x86 команд будет недостаточно. В RT микрософт наконец выкинуло большие куски legacy кода, в некоторых случаях оставшегося еще со времен Windows 1.0, и реализация всех этих "костылей" теперь ложится на меня. Можно просто сравнить размер shim-ов в папке C:\Windows\AppPatch на RT и на настольной Windows 8. В релизе RT есть только несколько тестовых, в то время как в настольной - папка занимает более 10 мб. К счастью, формат базы shim-ов хоть и не документирован официально, но информации по нему предостаточно, так что можно "позаимствовать" данную базу в моем проекте.

По поводу application compatibility, и вообще по историческим апектам того, почему в windows некоторые вещи реализованы именно так, а не иначе - есть неплохой блог the old new thing. Его автор и книгу написал (найти ее скан не проблема), и выложил пару бесплатных глав. Одна из таких глав как раз посвящена историям про совместимость. И, читая данную книгу, я нахожу некоторые ошибки у себя. Как пример такой ошибки - вызов программой функции GetWindowLong(hwnd,DWL_DLGPROC) совершенно не означает, что hwnd == диалог, и программа хочет получить адрес его диалоговой процедуры. Ведь DWL_DLGPROC это просто константа 4, и в случае обычного окна - программа может хотеть прочитать второе слово из своих cbWndExtra, а храниться там может вообще все что угодно. Про это написано по приведенной выше ссылке в разделе "If it has eight bytes, it must be a dialog box".
Приходится определять класс окна (RealGetWindowClass) и смотреть диалог ли это. И только если диалог - добавлять спец обработку для эмуляции x86 диалоговых процедур.

вторник, 19 февраля 2013 г.

Citrix Streaming клиент и некомпилрующийся проект в Visual Studio 2012

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

15>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(249,5): error MSB4018: The "CL" task failed unexpectedly.
15>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(249,5): error MSB4018: System.AggregateException: One or more errors occurred. ---> System.ArgumentOutOfRangeException: Not a valid Win32 FileTime.
15>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(249,5): error MSB4018: Parameter name: fileTime
15>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(249,5): error MSB4018:    at System.DateTime.FromFileTimeUtc(Int64 fileTime)

либо:

1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(611,5): warning MSB6008: Forcing a rebuild of all sources due to an error with the tracking logs. Not a valid Win32 FileTime.
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(611,5): warning MSB6008: Parameter name: fileTime
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(611,5): error MSB6001: Invalid command line switch for "link.exe". Not a valid Win32 FileTime.
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(611,5): error MSB6001: Parameter name: fileTime

Ошибки плавают, возникают то в одном, то в другом месте, но во всех них идет жалоба на "неправильный" FileTime. Причем, Rebuild All - работает, "поломалась" только обычная компиляция.
Как оказалось виноват клиент Citrix (вот на что бы никогда не подумал - так именно на него). Подробнее тут:
http://connect.microsoft.com/VisualStudio/feedback/details/635940/invalid-command-line-switch-for-link-exe-when-building

Мы как раз на работе "играемся" с стримингом приложений цитрикса, чтобы упростить контроль за использованием ПО на рабочих станциях. Я на днях решил протестировать как оно работает на себе, поставил стриминг клиента - и поплатился.
Вылечилось удалением streaming клиента citrix. Вариант с правкой файлов проекта не проверял, так как у меня их более 70 штук в эмуляторе.

понедельник, 28 января 2013 г.

Борюсь с дедлоком в своем проекте эмулятора. Вещь неприятная - возникает рандомно при включении звука в HOMM3. Оказалась причина дедлока - библиотека Miles Sound System. Для синхронизации работы с основным потоком они не используют критические секции и подобные примитивы, а нашли более "оригинальный метод".
Как написано на их сайте, "John Miles first released MSS in 1991 in the early days of PC gaming". Во времена ДОС для синхронизации было популярно использовать команды CLI (запретить прерывания), сделать свои дела и потом вызвать STI (разрешить прерывания). Видать стояла перед Женькой задача "быстро портировать под windows", вот он взял и заменил CLI на SuspendThread, а STI на ResumeThread для основного потока программы. А о том, что основной поток может быть не единственным, или то, что этот поток может "держать" критическую секцию, которая может понадобится самому MSS, да и то, что использовать данные функции не оптимально хотя бы с точки зрения производительности - думать не надо. И работало все до тех пор, пока не пришел я со своим эмулятором. И засуспендил MSS основной поток в тот момент, когда эмулятор держал критическую секцию, и попробовал MSS начать дальше выполняться - а фиг вам, для этого надо взять ту же секцию, а остановленный поток ее держит и не отдает. И пришлось мне делать свою реализацию SuspendThread, учитывающую подобные "особенности" криворуких программистов, не умеющих пользоваться примитивами синхронизации и изобретающих свой велосипед. "Miles is super robust. Since we ship in so many games, Miles just gets better and better - it just doesn't crash", да, он не крашится. Он просто наглухо вешает вашу программу. Хотя я сужу по библиотеке более чем 10-летней давности, может быть в последних версиях, наконец, действуют более корректно.

И еще один перл от того же автора. На этот раз в библиотеке binkw32.dll:
          loc_100014C2:                          
                push    0              
                call    Sleep
                mov     eax, [esi+4Ch]
                test    eax, eax
                jnz     short loc_100014C2
Зачем нам евенты - есть же поллинг, так хорошо зарекомендовавший себя под ДОС! Будем опрашивать переменную до посинения обнуления. Хотя бы Sleep(0) догадался добавить, чтобы квант времени потока отдать. Только не сильно оно помогло, у меня в эмуляторе этот цикл превратился в вечный. Но это уже баг на моей стороне, "переоптимизировал".

mamaich, 28.01.2013

воскресенье, 27 января 2013 г.

Занимаюсь проектом - запуск x86 Windows программ на планшетнике под Windows RT. Нужно было найти наиболее "тормозящие" места в коде, а Visual Studio 2012 не имеет в себе профайлера для АРМ, там даже profile-guided optimization падает на более-менее больших объемах кода. В итоге пришлось в очередной раз писать свой профайлер. Раньше уже раза 3 делал такой же код, еще под Windows Mobile в порте QEMU, и как на зло - код нигде не сохранился.
Поэтому оставляю код тут, на будущее :)

CSet Counters;
bool volatile DumpProfiler=false;
bool ForEachFunc(unsigned int Idx, void *Data, void *Param)
{
 if(Data)
  LogInfo("%08X - %d\n",Idx,Data);
 return true;
}

HANDLE ProfThread=0;
DWORD WINAPI Profiler(
  _In_  LPVOID lpParameter
)
{
 CONTEXT Ctx;
 while(1)
 {
  SuspendThread(ProfThread);
  Ctx.ContextFlags=CONTEXT_CONTROL;
  GetThreadContext(ProfThread,&Ctx);
  ResumeThread(ProfThread);
  Counters.Set(Ctx.Pc,(void*)(1+(DWORD)Counters.Get(Ctx.Pc)));
  if(DumpProfiler)
  {
   Counters.ForEach(ForEachFunc,0);
  }
  Sleep(20);
 }
}

void InitProfiler()
{
 DuplicateHandle(GetCurrentProcess(),GetCurrentThread(),GetCurrentProcess(),&ProfThread,0,FALSE,DUPLICATE_SAME_ACCESS);
 CreateThread(0,0,Profiler,0,0,0);
}

Код - прост до ужаса. Параллельный поток останавливает интересующий нас поток программы, получает его PC и фиксирует сколько раз на этом месте мы были. Далее - в отладчике стопорим программу, ставим DumpProfiler=true, сортируем/фильтруем полученный лог в Excel-е по адресам - и анализируем в отладчике что где за функция вызывалась.

mamaich, 27.01.2013

четверг, 24 января 2013 г.

Ровно месяц назад у меня родилась дочка. Сегодня отмечаем ее первый мини день рождения.
Пока что она, как все мелкие дети только и делает что орет, спит, ест, и производит из еды что-то обратное. Однако в месяц уже видны отличия от зверька - пытается тренировать родителей, показывает что ей уже что-то не нравится, и, что удивило, на нее очень хорошо действует успокаивающая музыка. В частности поиском по "музыка для новорожденных" находится неплохой сборник от "Happy Baby" с мелодиями и колыбельными, записанными на фоне сердцебиения. Засыпает - сразу же как только ставлю такую мелодию, так что рекомендую, ссылка. Можно сказать, я хакнул дочь, заставив ее уходить в sleep mode по своему желанию :)
На торрентах можно найти и другие мелодии для детей от тех же авторов. Особенно вставили битлы переделанные под звуки как-бы из детского мобиля.

mamaich, 24.01.2012