Some engineer's blog

Гирляндный автомат

Новый год хороший праздник! В этот момент наряжают елки, украшают квартиры и дома. Если в наличии много Китайских гирлянд и световых приборов (лазеров в особенности) то всей этой технике необходимо время чтоб "остыть". Значит надо чередовать периоды включения и выключения. Напрашивающееся своей простотой решение ввиде горстки Китайских-же суточных таймеров по 150рэ не шибко хорошо потому что период там жестко задан 15 либо 30 минут. А хочется большей энтропии :) 

win32 S.M.A.R.T. disk drive statistics inventory

Еще одна полезная утиль потребовавшаяся на одной работе

MS System Center Configuration Manager не умеет инвентаризировать "искаропке" SMART-статистику дисков. поэтому на коленке был быстро оформлен код который получает эту статистику. и потом VBS скриптом загонял в WMI откуда его уже преспокойно читал SCCM в цикле очередной инвентаризации

Win32 COM server doing Monitor EDID inventory saving to WMI

очередной старинный мелкий проектик писанный для целей внутренней инвентаризации мониторов в среде MS System Center Configuration Manager (SCCM). Дело в том что имевшиеся на рынке решения не умели делать инвентаризацию если на консоли (Session-0) никто не залогинен.
Вот сидит пользователь в RDP, или вообще после включения машинки не логинился, а обычные утилиты (EnTech MonInfo) не могли нормально доставать в этом случае информацию о подключенных мониторах. Кроме всего этого NOIDMIF файлики отжили свое в SCCM 2012 и новых. Самый верный способ это провайдер WMI собственный который сразу как его дернула инвентаризация или еще кто - выдал свежую актуальную информацию.

MS outlook mailbox inventory and default delivery from cmd

Продолжая публикацию старых полезных утилит из прошлого (2011-2014).

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

хелп должен сказать всё что умеет утиля.

tested on MS Outlook 2003/2007/2010/2013 versions
usage: outlookdeliverychanger.exe <function> <parameter>
where <function> is one of the:
/list - print on console all mail profiles,accounts,stores for current user
/listxml - export to XML file specified in <parameter> all mail profiles,accounts,stores for current user
/exportdef - export default delivery to XML file specified in <parameter>
/importdef - import default delivery from XML file specified in <parameter>
/setdefmailbox - set default delivery to mailbox
/setdefbypath - set default delivery to PST store path in <parameter>
/delstorebypath - remove store from profile by full path in <parameter>
/dellocalstores - remove all LOCAL stores from profile (not on exchange server)
/delnondefstores - remove all NON DEFAULT delivery (files) stores from profile

tinyxml2 с поддержкой utf-16

Частенько, очень, нужно без конвертации дополнительной (WideCharToMultiByte и т.п.) работать нативно с utf-16 типом данных (MFC CString Wide char string aka UNICODE) в Win32.

Заморочился в 2013м году и перепилил tinyxml2 для поддержки прямой. Только важный момент:

-теперь библиотека работает только с UTF-16 данными. никакой utf8 не поддерживается!

зато можно смело работать с UNICODE строками в MSVC2010-2015 

 

Управление отоплением (ТЭН)

Тепло это хорошо. Когда теплом можно управлять не вставая с дивана - еще лучше!

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

  • Реле коммутируем (управляем включением\выключением)
  • Симистором коммутируем при прохождении напряжения через ноль (Zerocross) (управляем включением\выключением)
  • Симистором коммутируем после прохождения через нуль на определенное время (управляем мощностью)
  • Смешанный способ - при прохождении через нуль коммутируем симистором , потом включаем реле закорачивая симистор (таким образом симистор не нагревается при прохожении больших токов) (управляем включением\выключением)

По алгоритмам:

  • Гистерезисом
  • PID-петлей. или PI-петлей т.к. Derivative в больших инертных системах не нужен по большому счету.

а я Alwill AVAST капратифный сломал ;)

Перенос моей статьи, для истории, из ЖЖ (livejournal.com)

АВАСТовский ADNM север оказывается крайне легко можно положить на лопатки вместе с дистрибуцией сигнатурок и прочими вещами. Как так легко да еще и не привелегированным пользователем? А просто элементарно!
Все началось сегодня с того что обьем сикельной базы разросся буквально гигабайтами за пару суток. Наловить столько вирусни нереально, стали разбираться. Обнаружили смешной просчет архитектуры клиент-серверной у аваста:
клиентская часть антивируса (агент) высылает на сервер строковые (да, прямо огромные строки!) данные о каждом своем чихе. Например о том что у него ошибка доступа к файлу какому-либо ;))) Северная часть не задумываясь(!) мигом делает INSERT INTO в таблицу Events (без индексов кстати) и вставляет вот эту вот огромную текстовую строку от клиента ;)
Пример строки (не самой длиной):
AAVM - scanning error: x_AavmCheckFileDirectEx: avfilesScanReal of C:\WINDOWS\TEMP\shshost.dll failed, 00000005.

когда сделали запрос в сикельной базе аваста SELECT COUNT(generated), objectname from events where generated >='02-17-2009' group by objectname
....увидели что каждый клиент успевает "настрелять" таких строк сотнями тысяч ;)


Вывод: если создавать произвольные файлы локально на клиентской машине (не требует прав) с "правильными" расширениями но в таком режиме доступа когда DENY_READWRITE сторонним процессам. клиент AVAST от этого сходит с ума и начинает атаковать свой сервер (и локальный event log машины кстати!)... У сервера мало того что нет тротлинга сообщений, так еще и внутренняя форма хранения этой информации - крайне неоптимизированна с точки зрения дизайна базы данных :(

Prof of concept писать не буду - это уже незаконно.

 

Windows 2008 Fileserver cluster

Перенос моей статьи, для истории, из ЖЖ (livejournal.com)

Переезд с файлового сервера под 2003 на новую 2008 дает много интересного
но, к сожалению, есть и неприятности. Пока я столкнулся со следующим:

  1. Для отключения offline cache (net share ...=... /cache:none) потребовалось писать Win32 приложение, которое будет дергать напрямую API NetShareSetInfo() поскольку для кластерных шар 2008го команда net share /cache НЕ РАБОТАЕТ!
  2. В 2003м была полезная фича: авторасшаривание каталогов в определенной директории. Это сильно экономило время затрачиваемое на создание, например, хомешников юзерей. Теперь такого функционала нету, о чем официально заявляла команда разработчиков. Пришлось убить время и написать Win32 приложение, которое будет само следить за операциями с директориями в указанном пути и шарить или убирать соответствующий ресурс.

 

Для решения первой проблемы исходный код http://pastebin.com/f1dccba49
Для решения второй проблемы код тут http://pastebin.com/f635cac65

Оба проекта собираются в VS2008SP1 с поддержкой UNICODE и далее на используемые кластера
ставится Visual C Runtime Redistributable 2008 x32 SP1 комплект, а потом сами ЕХЕшники.

Если у кого-то вдруг возникнут эти проблемы и не будет под рукой VS - отпишитесь ниже, я выложу
ЕХЕшники готовые.

 

Hyper-V в заметки хозяйке.

Перенос моей статьи, для истории, из ЖЖ (livejournal.com)

Много раз проделывал "расширение" VHD дисков размера Y до размера X но именно сегодня удалось напороться в продакшене(!) на багу известную всем со времен Virtual PC 2007: после расширения Windows отказывается грузится ругаясь на невозможность чтения диска NTLDRом.

Я решал её нетривиально и как обычно своим дремучим способом:
сначала загрузился в WinPE и убедился что диск полностью читабелен и _без каких либо ошибок_ (chkdsk сказал никаких проблем).
Потом посмотрел diskpartом и заметил любопытный сдвиг начала партиции на 32килобайта... Дальше сразу возникла идея что раз NTLDR таки отказался удовлетворять мою машинку в нужде загрузки вкрячить туда новый вистовый BOOTMGR. Собсно так и получилось, только вот создать _с нуля_ чистый boot configuration storage у меня не вышло (bcdedit /createstore && bcdedit /create && bcdedit /set && bcdedit /displayorder).
Создаваемое "с нуля" мною хранилище не содержало базовых классов посему напрочь отказывалось корректно работать поэтому я скопировал начальный файл хранилища (bcd) прямо с WinPE и добавил туда секцию касательно ntldr и legacy Operating System.

В результате - продакшен сервер отлично загрузился в Windows Server 2003 :)

Newer posts → Home ← Older posts