среда, 4 марта 2020 г.

Машина Тьюринга

Почему-то никак не удавалось найти какую-нибудь машину Тьюринга, для которой можно было бы удобно составлять программы. Пришлось набросать самому:
Машина Тьюринга

С полубесконечной лентой. Всё по канону - каретка считывает символ, берёт своё текущее состояние и на основе этой пары делает работу: пишет новый символ, меняет своё состояние и сдвигается влево/вправо или остаётся на месте. Для решения учебных задачек - типа, "заменить в строке все символы b на c" - вполне подходит.

Пусть лежит для коллекции.
Если что, там же болтаются худо-бедно работающие эмуляторы нормального алгоритма Маркова и машины с неограниченными регистрами.

среда, 19 февраля 2020 г.

Windows 10: где хранятся ссылки на обои

Если использовали в качестве обоев рабочего стола какую-то не ту картинку, она ещё долго будет о себе напоминать, болтаясь в списке доступных вариантов выбора. Чтобы её оттуда удалить, надо залезть в реестр:
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers
и удалить параметр, содержащий путь к ненужной картинке.

Литература:
https://www.howtogeek.com/370417/how-to-clear-recently-used-desktop-background-images-from-windows-10-settings/

вторник, 18 февраля 2020 г.

RDP: общий буфер обмена

При подключении по RDP на одной машине перестал работать в сессии общий буфер обмена. Оказалось, за эту полезную функцию отвечает процесс rdpclip.exe. Перезапустил (прибил в диспетчере задач и из диспетчера же задач запустил), общий буфер обмена восстановился.

Литература:
https://1cloud.ru/help/windows/rdp-sessija_problemy_s_buferom_obmena

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

InstallShield - ошибка 1720

При разворачивании msi-пакета на очередной машине под управлением Windows 7 обнаружилась проблема: в самом начале установки пакет выдаёт ошибку "1720 Ошибка пакета установщика Windows. Сценарий, требующуюся для завершения установки не может быть выполнен. Обратитесь к системному инженеру или к поставщику пакета", и установка прекращается.

Попробовал запустить установку с журналированием. Делается это, напомню, командой:
msiexec /i пакет.msi /L*V журнал.log

В файле журнал.log в результате оказывается много всего, но сориентироваться, с какого момента всё пошло не так, можно. В моём случае это оказалась некая CustomAction. Имя этой CustomAction из журнала выудить можно, а что именно она делает - загадка.

Однако, оказалось, всё не так плохо. Есть специальный просмотрщик/редактор инсталляционных пакетов, Orca.exe, входящий в состав Windows SDK, который позволяет посмотреть эти самые CustomAction-ы.

В моём случае это оказалась проверка на наличие .NET 4. Проверка представляет собой VB-скрипт, который, будучи вытащен в отдельный vbs-файл, запускается без проблем, а вот в русле инсталляции работать отказывается. Скрипт этот выглядит так:
NetFrameworkTargetVersion = GetRegistryKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\TargetVersion", "0.0.0")
if NetFrameworkTargetVersion = "0.0.0" or NetFrameworkTargetVersion <> "4.0.0" then
  NetFrameworkUrl = "http://www.microsoft.com/ru-ru/download/details.aspx?id=17718"  
  InfoMsg = "Для корректной работы требуется Microsoft .Net Framework 4 или более старшая версия"
  InfoMsg = InfoMsg + "Ссылка для скачивания представлена ниже"
  InputBox InfoMsg, "Программа - Установка", NetFrameworkUrl
  Err.Clear
  Err.Raise 100
end if

function GetRegistryKey(RegistryKey, DefaultValue)
  Dim WSHShell, value
  On Error Resume Next
  Set WSHShell = CreateObject("WScript.Shell")
  Value = WSHShell.RegRead(RegistryKey)
  if Err.number <> 0 then
    GetRegistryKey = DefaultValue
  else
    GetRegistryKey = Value
  end if
  Set WSHShell = Nothing
end function
Почему он так себя ведёт, так и осталось загадкой. В сети, правда, есть слухи, что из соображений безопасности вызов WScript.Shell не приветствуется в CustomAction-ах.

Однако, пакет-то развернуть надо. Пришлось в инталляционном пакете при помощи всё той же Orca.exe удалить все CustomAction-ы, содержащие проверки такого рода, и тогда инсталляция прошла нормально.

P.S. Там правда, есть ещё одна тонкость. Если программа была установлена раньше, а теперь не даёт себя изменить/удалить из-за вышеописанной проблемы, то патч msi-пакета ничего не даст: дело в том, что копия установочного пакета сохранена в папке C:\Windows\Installer (имя копии можно узнать из вышеупомянутого файла журнал.log). Поэтому при запуске пакета будет запущена его сохраненная копия. Если же перед запуском прибить эту самую копию, тогда пропатченный пакет отработает нормально.

воскресенье, 22 декабря 2019 г.

Что-то не захотели вместе жить KVR16N11S8/4 и HX316C10F/8 на ASUS H81M-R.
Что ж, буду знать.

среда, 27 ноября 2019 г.

Я, кажется, носом клюю над альбомом
Своих фотографий. А так берегла!
Куда ж их девать? Разослать по знакомым?
Пусть вспомнят: такая жила да была…
И будут валяться застывшие «миги»,
Пока молодые не вычистят дом,
Чтоб новые вещи, и новые книги,
И новые фото расставить кругом.
Знакомая мамы… А около – папа,
А шляпка-то, шляпка! Комичный наряд,
Такие носили лет сорок назад.
И все эти даты, событья, этапы,
А с ними же платья, причёски и шляпы –
В камин полетят.
(Ларисса Андерсен)

пятница, 13 сентября 2019 г.

linux: команда ping и административные привилегии

Заинтересовал исходный код команды ping. Быстро нашелся работающий пример, но насторожило, что работает этот пример только с правами администратора.

Выяснилось, что дело в конструкции socket(AF_INET, SOCK_RAW, IPPROTO_ICMP). Оказывается, непривилегированным пользователям не позволено открывать raw-сокеты. Сделано это, как я понял, из соображений безопасности: raw-сокеты относятся к третьему уровню модели OSI, и могут ничего не знать о портах и прочих прелестях TCP, UDP и т.д., отдавая обработку IP-пакетов целиком на откуп программисту.

Однако возникает закономерный вопрос: команда ping же как-то работает без sudo. Подобное поведение возможно благодаря хитрым правам, розданным файлу /bin/ping. Если у нас есть файл /home/huh-muh/myprog, и мы хотим сделать его таким же крутым, этого можно достигнуть двумя путями.

1. Выполнить последовательность команд:
# chown root:root /home/huh-muh/myprog
# chgrp u+s /home/huh-muh/myprog

2. Либо воспользовавшись capabilites:
#filecap /home/huh-muh/myprog net_raw net_admin

или

#setcap cap_net_raw,cap_net_admin=eip /home/huh-muh/myprog

Посмотреть, какие права даны программе, можно командой:

#getcap /home/huh-muh/myprog