Записи с темой: борьба с техникой (список заголовков)
23:59 

Никого нет дома

Пытался установить драйвер. Через setup.exe драйвер не поставился, выскочил файл в блокноте с инструкцией о том, как ставить из inf-файла. Но это, хвала богам, я умел и так. Операционная система Windows 7.

Однако при попытке установки выскакивало сообщение "Установка драйвера провалилась. Не удаётся найти указанный файл".

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

Запустил своего большого друга -- procmon.exe. Установщик копирует файлы, поэтому поставил в фильтры запрос CreateFile, а программу -- mmc.exe (установку драйверов производит непосредственно Microsoft Management Console). Результат -- иной чем SUCCESS.

Это, однако, не дало необходимого результата. Я видел, что в процессе установки не находятся некоторые файлы. Они были во временной папке с GUID в качестве имени. Я скопировал туда все файлы, которые имели отношение к драйверу (я знал, где они лежат), но при следующей установке... создалась новая папка с другим именем. В которой, ясное дело, файлы обнаружены опять не были. Стало ясно, что дело не в этом. Походу, mmc просто проверял, что файлов НЕ существует, чтобы их туда скопировать.

Тогда я включил отображение всех операций от mmc и обнаружил, что он пишет в лог. Постоянно. Ура! Я открыл этот лог и нашёл там то, что искал -- сообщения об ошибке при поиске файла. Он не мог найти файл "DeviceName_E_Series.dll". Остальные файлы с подобными именами (A_Series, B_Series...) он успешно нашёл. Включая файл, соответствующий моему устройству.

Я зашёл в папку с файлами драйвера и обнаружил там файл "DeviceName E Series.dll". Приплыли. Именно для устройства этой серии разработчики случайно поставили пробел вместо нижнего подчёркивания!

В общем, драйвер встал, хотя я остался крайне недоволен, что для установки драйвера устройства нужно наличие ВСЕХ файлов, даже не касающихся его напрямую. У меня есть основания полагать, что остальные файлы просто не эксплуатируются.

Почему же я не мог при помощи проц-мона обнаружить те файлы, которые хотел скопировать mmc?

Потому что он их открывал не при помощи CreateFile. Для этого он использовал запрос QueryDirectory (!). Который в случае отсутствия файла возвращал NO SUCH FILE. Даже не знаю, какой функции API он соответствует. Единственная схожая по названию функция существует только в драйверском API, который при установке, даже драйверов, использоваться, по идее, не должен...

@темы: Программы, Борьба с техникой

23:59 

Программа, электроника и механика: надёжность

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

Когда-то я обнаружил, что электронщики матерятся сильнее, чем программисты. И понял, почему. Ошибки и неполадки в электронных схемах сложнее диагностировать и устранить.

С отладкой механических устройств я по работе почти не сталкивался. Но в те пару раз, когда это всё-таки происходило, я обнаружил ещё более интересную вещь: неполадки в механической части ещё сложнее диагностировать и устранить, чем в электронной. Штанги не доходят туда, куда нужно (а если доходят, то не фиксируются в нужном положении). Колёсики заедают. А "посмотреть", что происходит на самом деле -- возможности практически нет.

Однако, существует широко распространённое мнение, что если устройство функционирует чисто механически -- то это "на века". Электронные приборы гораздо нежнее и легко выходят из строя. А уж программа -- это вообще что-то эфемерное. Каждый первый разработчик ПО в лицензионном соглашении пишет, что отказывается от ответственности за то, что сотворила его программа (и за то, что не сотворила, тоже). А программы, за которые разработчик отвечает своей шкурой, стоят совсем других денег.

Откуда же берётся, что механическое устройство такое надёжное? Дело в сложности. Те механические устройства, которые надёжные, содержат в себе, к примеру, сотни элементов. Они перемещаются, к примеру, 10 раз в секунду, не больше. Или просто вертятся без остановки. А процессор? Сколько в нём транзисторов? Зависит от процессора, но, к примеру, 731 млн (2008 год, Core i7 "Bloomfield"). А частота -- 2 ГГц (он же). Это частота, с которой могут перекидываться транзисторы внутри. Если бы механическое устройство состояло из такого же количества частей, оно бы проработало весьма недолго. Ибо поломка любой детали -- кирдык.

Вот и получается, что если пересчитать на время работы, то электронное устройство может отказывать быстрее, чем механическое.

С программами дела обстоят несколько иначе. Если программа не зависит от внешних факторов, кроме предусмотренных "входных данных", её надёжность будет примерно такая же, как у электроники, на которой она работает. То есть -- прошивка микроконтроллера даст сбой либо из-за ошибок в самой прошивке (которые относительно просто обнаружить), либо из-за сбоя электроники. Но на практике прошивки редко воспринимаются пользователями как "программа". Когда говорят о надёжности программы, имеют ввиду чаще всего прикладное ПО, работающее под какой-либо ОС. И на этой ОС кроме самой программы тусуется ещё десяток посторонних программ. И всё это взаимодействует друг с другом и с ОС непредсказуемым образом. То есть, выход программы из строя может быть вызван неизвестным количеством внешних факторов (помимо сбоев электроники и ошибок самой программы). Кто же согласится нести ответственность за такое?

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

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

@темы: Борьба с техникой, Мысли, Наблюдения, Программирование, Электроника

23:59 

Герострат

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

Однако в гугле действительно могут забанить. Но банят там не ищущих. А тех, кого ищут. И я познал это на собственном опыте.

Мой дневник на пару дней пропал из выдачи гугла по запросам, связанным с Pixel Dungeon -- а это у меня основной источник незнакомых людей. Почему -- не знаю. Потом появился снова.

Так вот, когда банят в гугле -- это не очень приятно!

@темы: Борьба с техникой

23:59 

Заразный пофигизм

Есть у нас в соседнем отделе человек с очень интересной способностью.

Допустим, устройство, за которое отвечает он, не работает (а точнее, работает неправильно). Сроки горят -- надо чтобы срочно заработало. Что делать -- неизвестно. Я весь обеспокоен по этому поводу. Нервничаю. Иду к нему.

Рассказываю, мол, так-то и так-то. Что делать, всё пропало!

Он такой: Ну...

И начинает что-то рассказывать про это устройство. И уже через 2-3 минуты я понимаю. Что да, действительно, устройство не работает... ну и пёс с ним. И так спокооойно, хорошооо становится.

Понять бы, как он это делает!

@темы: Восприятие, Борьба с техникой

23:43 

О вреде синтетики

Есть у нас на работе один чел -- он меня бесит. Потому что он всё время сначала заряжается статическим электричеством, а потом им всех бьёт.

Было у меня устройство к компьютеру подсоединено. Я с ним работал. Этот чел подошёл и стал о чём-то рассказывать. Показывает на моём мониторе что-то.

Как там говорят? "Между нами как будто искра пробежала"? Вот искра пробежала между его металлической ручкой, которой он показывал, и монитором.

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

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

@темы: Электроника, Борьба с техникой

23:51 

Гальваническая развязка

Поставил телефон заряжать. И оставил дома (так было задумано). Рядом с компьютером положил.

Пришёл, решил покопировать файлы. А телефона в "Проводнике" нету. Ну, такое бывает. Это значит, что он работает в режиме "только зарядка". Стал копаться в настройках ведроида -- а там про подключение к компьютеру вообще ничего не написано. И в области уведомлений тоже ничего. Странно.

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

@темы: Фейлы, Борьба с техникой

23:24 

Вий

Открываю жмейл, смотрю на письма. Вижу, что некоторые помечены как "важные". Окей, о большинстве я догадываюсь, почему они так помечены. Но вот, к примеру, реклама Лабиринта-то тут причём? Поднёс мышку к другим меткам, там написана причина. А посмотрим, почему помечено важным вот это, лабиринтовое письмо?


Я протёр глаза. Но изображение не изменилось. На всякий случай заскриншотил. Волшебный кролик, понимаете?

ЗАГУГЛИЛ. ОКАЗАЛОСЬ.

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

ООоокееей.

UPD. В английской версии пишет, кстати, "according to our magic sauce.".

@темы: Программы, Борьба с техникой

23:59 

Самый лучший помощник

Начальник: Кто-нибудь в экселе разбирается?
Я: Я не очень разбираюсь, но я вам помогу.

Проблема оказалась такая. В присланном ему документе вместо столбцов A, B, C... были 1, 2, 3... и формулы из-за этого работали иначе.

Я туплю, не знаю, что делать. А он вдруг говорит:
-- О, у меня же жена в эксель хорошо знает!

Интересно, почему он сразу об этом не вспомнил. Звонит жене.

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

@темы: Программы, Борьба с техникой

22:39 

Ещё один способ сделать архив дневника diary.ru

Многие взволнованы, что архив дневника никак не придёт. Поэтому преходят к альтернативным методам сохранения дневников: kxena.diary.ru/p214074272.htm .

Администрация же не рекомендует подобные методы, т.к. те создают нагрузку на сервер.

Мой метод создаёт минимальную нагрузку на сервер, но большую нагрузку на мозг! Не для средних умов. И с учётом требования по IQ -- это неподробная инструкция.
Требуется винда. Думаю, будет работать начиная с 2000-й.

Используйте данный метод на свой страх и риск. Если вас забанят -- я не виноват.

Уже четыре дневника так сохранил.

(линуксоидам понравится)

@темы: Лайфхак, Борьба с техникой

23:59 

Китай

Я уже встречался с чужими механическими фейлами при проектировании электроники.

И вот ещё один.

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

Все крепёжные отверстия в плате оказались сделаны очень точно: отлично влезла внутрь корпуса и надёжно закрепилась.

Однако.

На плате ещё были раз'ёмы, к которым мы, вообще-то, собирались подключаться. И вот эти раз'ёмы оказались загорожены конструкцией корпуса. Таким образом, доступ к ним снаружи отсутствует. При этом расстояние от плоскости раз'ёма до стенки корпуса оказалось около 5 мм. Поэтому подключить туда кабель и вывести его в другом месте корпуса не представляется возможным. Ответная часть раз'ёма в эту щель тупо не влезает.

Видимо, корпус придётся пилить.

@темы: Борьба с техникой, Фейлы, Электроника

23:59 

Провайдер c2_free и полноэкранные уведомления

Согласен, что Wi-Fi у меня включён был. Однако в моей памяти не осталось записей о том, что я когда-либо подключался к сети c2_free.

Также у меня был включён браузер, но на фоне.

А вот чего в смартфоне не было, так это симки.

Это ведроид, 6.0.1.

Когда я включил экран, я обнаружил полноэкранное сообщение о том, какой провайдер c2_free хороший и как мне рекомендуется к нему подключиться. При этом это не было окно браузера (по крайней мере, не было панели инструментов, которая у меня всегда включена). Это было похоже на PUSH-уведомления, которые я не разрешал (может, они были включены по-умолчанию?), но с картинками. Или на всплывающие сообщения от оператора. Сверху были кнопки "Подключить" и "Отмена" (не в стиле ОС), которые, естественно, я не стал нажимать. Вместо этого я нажал кнопку "назад" самого смартфона. Уведомление пропало. После этого я обнаружил следующее:

1. Сеть c2_free оказалась подключённой.
2. Она попала в список сохранённых сетей (надеюсь, всё же я к ней когда-то подключался, ибо если сеть сама подключается и добавляет себя в список сохранённых, это совсем страшно).
3. В истории браузера страницы провайдера c2_free не упоминаются.

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

Кто-нибудь видел подобное? Как это вообще возможно?

@темы: Борьба с техникой

23:59 

In God We Struct

Написано:

struct
{
//...
} A,B,C;


Это должно об'являть три переменных, типом которых является (безымянный) тип этой структуры.

Однако компилятор сообщает, что вместо A,B,C он ожидает идентификаторы. Но ведь это и есть идентификаторы!

Проверяю на кириллицу -- не подходит, буквы латинские. Заменяю на A0,B0,C0 -- всё работает.

Странно.

ОКАЗАЛОСЬ

что в заголовочном файле уже были строки:

#define A 0
#define B 1
#define C 2

В итоге последняя строка определения переменных после подстановок выглядела так:

} 0,1,2;

Да, тут идентификаторов действительно нет.

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

@темы: Борьба с техникой, Говнокод, Программирование

23:54 

Вызывает Хьюстон

Есть два измерительных устройства. Они выполняют одну функцию, поэтому мы подключаем к установке только одно из них. Смотря что есть. Одно работает через виртуальный COM-порт. Другое -- USB.

Включили USB-вариант. На старом компьютере работает, на новом не работает. На это раз, в отличие от предыдущего случая, и компы, и ПО полностью одинаковые.

По логам выходит, что устройство всё-таки включено, но показометр почему-то не показывает. Идущее в коплекте с устройством тестовое ПО результат показывает, т.е. устройство исправно, а дело в нашем ПО.

В процессе отладки выясняется, что хотя логи и показывают, что устройство включено, фактически данные с него не считываются. А конкретно -- не запускается поток считывания данных. Но на другом компе поток запускается. Почему же?

Потому что я лох.

Я сделал в своё время автоматическое определение, включено устройство или нет. Делалось оно так:
1. Попробовать открыть COM-порт с фиксированным номером (жёстко зашито в код). Номер тринадцать, если что.
2. Если удалось, то включено устройство первого типа.
3. Если не удалось, поискать USB-устройство.
4. Если USB-устройство обнаружено, то включено устройство второго типа.
5. Если ничего нет -- устройства отсутствуют, работаем так (это факультативный модуль).

Обратите внимание на второй пункт. Проверяется только возможность открытия порта. Кто там висит -- никого не волнует. Кроме того, имеется любопытное последствие -- если порт открылся, проверка USB-устройства уже не производится.

В наших компьютерах и без этого устройства много устройств, которые видны как COM-порты. И винда их распределяет случайным образом. И вот на втором компе по случайности 13-й порт существовал (хотя к нему ничего не было подключено). И программа думала, что установлено устройство первого типа. И запускала поток считывания данных для устройства первого типа. Он слал запросы... в космос.

@темы: Борьба с техникой

23:58 

Шерлок Х.

В работе оборудования появились странные симптомы.

Система такая: программа .exe и библиотека .dll . К компу подключено оборудование, которое глючит. ПО самописное, исходники есть.

Занялся дифференциальной диагностикой.

На другой установке с той же .exe+.dll -- всё работает с любым комплектом оборудования.
Тот же комплект оборудования, подключённый к другой установке -- работает.
Другой комплект оборудования, подключённый к первой установке -- не работает.

Переустановить систему?

Воспользовался последним средством -- скопировал ВСЮ папку с ПО на другую установку, а не только .exe+.dll . И оборудование начало глючить.

Что же это значит? Дело в папке с ПО, но не в .exe и не в .dll . Остаётся только один вариант -- конфигурационный файл.

И действительно -- в нём были ошибочные значения (вне диапазона), которые в определённый момент были туда занесены пользователем. А начало глюков с редактированием файла он не связал.

@темы: Борьба с техникой

23:59 

Ударил из тьмы прожектор

Когда-то я смеялся над фонариками на солнечной батарейке, пока их не увидел вживую -- решение-то рабочее.

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

Но вот это решение как раз оказалось нерабочим. Потому что датчик движения был реализован через фотодиод. Без подсветки. Он реагирует на движение как на изменение освещённости. Посему в непроглядной темноте ночного деревенского сортира не функционирует.

@темы: Электроника, Борьба с техникой

22:52 

Я не такая жду трамвая

"Чтобы скачать альбом целиком, нажмите здесь."

Жму.

"Ошибка: чтобы скачать альбом целиком, нужно зарегистрироваться. Нажмите здесь."

Регистрируюсь.

"Ошибка: чтобы скачать альбом целиком, нужно войти."

Вхожу.

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

ААААРГХ!

@темы: Борьба с техникой

23:58 

Как я позвонил себе на жёсткий диск

Не буду вдаваться в технические детали. Скажу коротко -- прежде, чем записать во флеш-память внутри микроконтроллера, её надо стереть.

В контроллерах STM32 для этого есть специальная операция. Надо в специальный регистр записать не менее специальное значение. И ещё -- номер сектора для стирания. Секторов штук 10-15 (в разных моделях по разному).

Я стирал два сектора -- номер 10 и номер 11. По очереди.

Управляющий регистр 32-битный, там ещё куча других настроек. Трогать я их не хотел. Поэтому я воспользовался побитовым "или":

FLASH->CR|=sector<<3;//установить номер сектора: биты 3-6.

И тут я заметил, что когда я стираю сектор 10, всё хорошо. Сектор 11 -- всё хорошо. Но когда я после этого опять стираю 10 -- происходит ошибка стирания. Нет, все статусные регистры хороши, но когда я де-факто смотрю в содержимое памяти, оказывается, что она не стирается! Долго прохожу с отладчиком, грешу на недостаточное напряжение питания, на закончившиеся циклы перезаписи (хотя 10000 израсходовать не так просто).

Потом начинаю уже параноидально проверять содержимое всех управляющих и статусных регистров флеш-модуля после каждой строчки. И обнаруживаю, что стирание происходит у сектора 11, а не 10! То есть, я всё время стирал не тот сектор?!

Т.е. я передаю в регистр сектор 10, а в регистре указано:

ХХХХХХХХ ХХХХХХХ ХХХХХХХХ Х0011ХХХ

(как вы догадались, номера секторов выше были в двоичной системе счисления)

Тут я понял, что виной всему было побитовое логическое или. 1|0 будет 1. То есть после записи сектора 11 (3) в регистр, запись 10 (2) поверх него давала опять 11 (3).

Т.е. мне надо было не просто НАБИТЬ ЕДИНИЦАМИ нужные поля, а набить конкретными значениями, включая нули. Побитовое "или" тут уже не подходит. В итоге я решил проблему так:

FLASH->CR=(FLASH->CR&0xFFFFFF00)|(sector<<3);//ценные биты были только в старших трёх байтах

А ведь в ассемблере для этого есть специальная команда -- BFI.

@темы: Борьба с техникой, Программирование

23:56 

Докажи, что ты не верблюд

Есть два измерительных модуля в одном из приборов, которые мы делаем -- Module1 и Module2. Меряют разные характеристики. Один давление, другой температуру.

Разные экземпляры прибора могут быть укомплектованы разным набором модулей. И вот данный конкретный экземпляр имел только Module2. И его эксплуатировали 4 месяца не включая этот модуль. Но понадобилось включить. И оказалось, что модуль не работает.

Начинаю отлаживать ПО. И вижу картину маслом:

void InitModule2()
{
if(Settings.bModule1Installed==false)
return;
//далее инициализация модуля2
}


То есть: если в приборе НЕ установлен модуль 1 (а он и не был установлен), прекратить инициализацию модуля 2! Модули более-менее независимы. Это меня удивило. Я сделал svn blame. Эта команда позволяет установить, кто является автором каждой строчки кода (и у неё есть синоним -- svn praise, лол). В результате этого я выяснил, что данную строчку написал начальник. Как раз 4 месяца назад. И тогда же обновляли ПО на данном приборе.

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

@темы: Борьба с техникой, Говнокод, Программирование

22:57 

Как мне помогали вспомнить пароль к московским ГосУслугам

Московские ГосУслуги -- это вам не федеральные.

Чтобы зарегистрироваться в московских ГосУслугах мне даже не понадобилось лично являться в МФЦ. Проблемы начались позже. Когда я забыл пароль.

(эпопея)

@темы: Борьба с техникой, Случай из жизни

23:58 

Парадокс близнецов

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

Время на часах -- 14:00. Выполняю в программе операцию, которую хотел проверить. Захожу в лог -- а там последняя запись -- 13:52. Что такое?! Как так?! Проделал ещё раз операцию -- то же.

Потом меня стали терзать смутные сомнения. Я отодвинул окошко, загораживающее часы в трее.

13:53.

Работал на целевом компьютере я по удалёнке. И смотрел время по часам основного компа. Часы целевого компа отставали на 8 минут.

@темы: Борьба с техникой, Программирование

Untitled

главная