Категория: Компьютеры

Заметки о программировании и на околокомпьютерные темы

Вложенные категории: Игры, Delphi

Google Pay

А что, в гугл-плей действительно нельзя публиковать даже бесплатное ПО, если не заплатить 25 баксов? Я тут написал штуку для московских велопарковок

Обычное приложение грузится полчаса, потом надо тыкать “Без регистрации”, потом у него данные на карте вчерашние, потому, что оно обновить не смогло, и непонятно, как я должен был об этом узнать.

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

Как её выложить-то теперь?

И ещё может кто знает, почему APK получаются такие огромные? Классов с гулькин нос, а скомпилированный код (.dex) 6 мегабайт.

О борьбе за остановку и неостановку служб

Службы в Windows задумывались как возможности системы, которые можно выбирать и запускать по желанию. Хочешь расшаривать файлы – запусти службу “Сервер”, хочешь печатать документы – запусти “Диспетчер печати”.

Для этого добрые силы в Microsoft сделали им команды запуска и остановки, а также настройки (запускать автоматически, по желанию, запретить запуск). Но злые силы с каждым годом всё больше ломают эти правила:

1. Некоторые службы стало нельзя останавливать. Без них система принудительно перезапускается через минуту, а вскоре запретили и команду остановки. С каждым годом таких сервисов всё больше (в Windows 10 уже штук 8).

2. Некоторые можно останавливать, но нельзя изменить тип запуска – они запускаются автоматически. Таких ещё 3-4 штуки.

3. Многие службы можно останавливать и можно перевести в режим “вручную”, но их всё равно принудительно запускает Windows Explorer. Какой тогда смысл в настройке “вручную”?

4. Начиная с Windows 7 появился ещё один вид издевательства: службы, которые восстанавливают свой режим работы. Их можно установить во “вручную”, но через 20 минут они всё равно выставят себя в “автоматически” (например, служба BITS). Какого чёрта, а?

(ещё)

Список служб как будто специально составлен так, чтобы в нём никто не мог разобраться:

1. Нигде не сказано, что именно делает каждая служба, и для чего требуется.

2. В Windows XP было модно давать службам “описания” вроде “Служба оркестратора управления командами. Требуется для клиентов, использующих оркестрацию управления командами. Если отключить эту службу, все компоненты, зависящие от неё, не смогут запуститься”. В Windows 10 описания службам просто не дают.

3. Множатся службы, с виду делающие одно и то же. Например, netman, netprofm, NlaSvc, NcaSvc, nsi, WcmSvc все как будто занимаются поддержанием списка сетей на компьютере. У пяти нянек дитя без глазу: попробуйте угадать, какая из них нужна, чтобы иконка сетевых подключений в Windows 10 работала правильно? (Ответ: WcmSvc. А в Windows 7 и ранее что-то другое).

Наконец, правая рука у Microsoft не знает и не любит то, что делает левая. Кроме служб различное ПО запускает в фоновом режиме бесконечные COM-объекты, обработчики WMI и вспомогательные процессы (Explorer особенно грешит этим). Убить их окончательно тоже нельзя, как и отключить ненужный функционал. Кортана в русских версиях не работает, а если б и работала, мне не нужна – но обслуживающий её процесс будет запущен, сколько не убивай.

И Microsoft ещё говорит, что идёт какая-то борьба за производительность, скорость загрузки и экономию батарей!

Освойте системы контроля версий

Если у вас есть пара дней на то, чтобы освоить один какой-нибудь продвинутый инструмент из мира технарей, освойте системы контроля версий (Mercurial или Git – под Windows я точно советую Mercurial). О программистах я даже не говорю, но если вы пишете книги, переводите (тем более вместе с другими), храните какие-то заметки, короче говоря, работаете с текстом, регулярно обновляя его, вы ещё этого не знаете, но вы без Mercurial как без рук.

Что скрывается за страшными словами “система контроля версий”?

Вы ставите на компьютер специальную программу, TortoiseHg.

Щёлкаете правой клавишей по папке – “Создать репозиторий”.

Дальше вы кладёте в эту папку какие-то текстовые файлы – например, исходники программы или книгу, которую пишете. И каждый раз, когда вы что-то в них исправили, щёлкаете по папке правой клавишей и говорите “Commit”. И пишете пояснение: “Переписал драку героя с инопланетянами”.

Через некоторое время вам кажется, что прежняя драка с инопланетянами была лучше. Вы щёлкаете по папке правой клавишей и говорите: “История изменений”. Программа показывает вам, каким был ваш текст вчера, позавчера, в самом начале, и как он менялся. Как у страницы в Википедии. К любой версии можно вернуться.

(Но это не всё.)

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

С Mercurial всё проще. Во-первых, он показывает вам, что поменялось в каждом варианте. Во-вторых, он сам умеет их объединять. Вы щёлкаете правой клавишей по папке, говорите “Отправить на сервер”. Редактор у себя дома щёлкает по своей папке, говорит “Получить с сервера”. И видит, что от последней версии на сервере растут два хвоста: ваш и его. Он щёлкает по вашему, выбирает “совместить” и Mercurial сам совмещает правки. На случай, если он сам не сможет, он предложит вам – подсветив каждое разногласие и дав выбрать.

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

  • Камень “а вдруг я изменю, а получится хуже”. Если получится хуже, вернётесь к старой версии.
  • Камень “а вдруг я не все чужие исправления заметил”. Mercurial показывает все исправления.
  • Камень “сейчас я поправлю, а он там какую-нибудь старую версию редактирует и всё затрётся”. Mercurial следит, объединяет, и главное – никогда не даст затереть. Однажды внесённая в него версия остаётся в нём навсегда.

Мало того!

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

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

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

Чтобы освоить системы контроля версий нужно некоторое время, но это такой могущественный молоток, что когда вы им овладеете, гвозди будут торчать из каждого косяка, вы будете ходить по всему дому и заколачивать, и заколачивать. А благодаря TortoiseHg / TortoiseGit, работа с ними уже стала достаточно простой даже для обычного пользователя.

Скажу, что Git по функциям не сильно отличается от Mercurial, но я советую последний, поскольку у него удобнее интерфейс под Windows. Если вы работаете из консоли, то совершенно неважно – выбирайте любой (Git сейчас популярнее).

Бэкдор-апдейты

Кстати, поскольку апдейты в винде теперь почти принудительные, а содержание их внезапно перестали документировать, резко возрастает вероятность, что апдейт могут поставить “лично одному человеку”. Например, ФСБКГБ решило за вами последить, направляет запрос в Майкрософт и те вам удалённо ставят следилку.

В России заблокирована Википедия.
UPD: Разблокирована.

Наверное, воду пробуют. Чтобы потом “ну так это уже давно”, “не в первый раз блокируют же”.

Skype export

Сделал простой скрипт skype-export, который экспортирует все контакты скайпа и все логи переговоров с ними в текстовом формате, каждый контакт в свой файл. Так их можно архивировать на случай, если Скайп вдруг начнёт удалять старые логи или слетит при переустановке.

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

Mercurial local per-repo .hgignore

What do you do if you need to ignore some local files, but would prefer not to commit that rule to everyone in .hgignore?
(E.g. you've created a folder in the repo for your own needs)

There's a global .hgignore which you can configure from %PROFILE%\hgrc, but using it to list all exceptions from everywhere is ugly.

Turns out you can add per-repository .hgignore overrides this way too! Edit repo's hgrc:
[ui]
ignore = .hg/.hgignore-local

It wouldn't be committed as it's inside .hg, and it would be parsed in addition to repo's normal .hgignore.

Секретно не выключалась!

Один из секретов быстрой загрузки Windows 10 в том, что иногда она и не выключалась! Этот сюрприз можно обнаружить в эвентлоге. Говоришь ей “Выключить компьютер”, винда закрывает программы, завершает пользовательский сеанс и… уходит в глубокий спящий режим, причём полусекретный: не мигает лампочкой на корпусе. Когда в следующий раз включаешь компьютер, она просто просыпается, а чтобы обмануть глупых человеков, показывает обычную заставку.
Поэтому может выйти, что думаешь, что после установки программы уже пять раз перезагружался, а на самом деле ещё ни разу.

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

Component-Based Servicing (CBS)

Пока OneGet собирается стать package manager для винды, в винде уже некоторое время есть работающий менеджер пакетов. Называется он CBS (Component-Based Servicing). Он работает так, как положено нормальному менеджеру: помнит, какой файл кто перезаписал, и может удалить пакет А, если некоторые его файлы перезаписаны пакетом Б. Даже лучше, он хранит все версии файла с помощью WinSxS (Side-by-side assemblies). Он поддерживает обновление всех установленных пакетов через Windows Update (это та самая галочка “Получать обновления для других продуктов Майкрософт”).

Он содержит хоть и не исчерпывающую компонентизацию Windows, но гораздо большую, чем видно в системе на первый взгляд. Более подробной была только компонентизация XP Embedded в билдере. Вершину этого айсберга можно увидеть в “Установке и удалении программ”, “установка компонентов Windows”. Представленный там список – это так называемые Features. В CBS каждый пакет может содержать одну или несколько отключаемых опций, как компоненты установки в MSI. А число пакетов гораздо больше, большинство из них не содержат никаких Features.

Но как обычно, кто-то в Майкрософт сделал полезное дело, а другой приказал всё спрятать и запретить. Большая часть пакетов скрыта, а сам CBS запрятан так глубоко в недра системы, что о нём почти никто не слышал. Прежде, чем им пользоваться, нужно посрывать некоторые предохранители. Считайте это проверкой, как в Гарри Поттере: некоторые заклинания можно использовать только тем волшебникам, которые сумели до них додуматься.

Пакеты перечислены в
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\
Чтобы нормально с ними работать, нужно взять ownership всего раздела Component Based Services с детьми + дать на него с детьми право записи Администраторам.

Большая часть системных пакетов скрыта, у них Visibility=2. Чтобы пакеты были видны в dism.exe, нужно поставить 1.
У любого пакета может быть подключ Owner, где перечислены родительские пакеты. В таком случае самостоятельно его удалить нельзя. Большая часть системных пакетов входит в состав родительских “гранд-пакетов” Windows Home, Windows Pro и Windows Enterprise. Чтобы их можно было удалять, нужно их оттуда исключить и сделать самостоятельными пакетами. Массово это делает утилита install_wim_tweak (видимость она тоже включает):
install_wim_tweak /o

Для управления пакетами есть утилита dism.exe:
dism /Online /Get-Packages
Показывает все установленные пакеты, у которых в параметре Visibility стоит 1.

dism /Online /Get-Features
Показывает все отключаемые компоненты (те, что видно в “Удаление компонентов Windows”). Компоненты группируются по пакетам, но у большинства пакетов компонентов нет, а видимые компоненты на самом деле лежат в паре виртуальных пакетов. В общем, простым взведением флагов компонентизировать остальные пакеты нельзя.

dism /Online /Get-Features /Packagename=[имя]
Можно убедиться, что у большинства пакетов выключаемых компонентов нет, и их можно только удалять.

dism /Online /Remove-Package /Packagename=[имя]
Удаляет пакет из системы навсегда. Чтобы восстановить его, /Add-Package придётся скормить установочный .cab-файл, которого у вас нет, так что думайте. Существует слабый шанс выдрать этот файл из установочного диска винды, но обычно там всё уже в распакованном виде. Скорее всего, для восстановления удалённых пакетов придётся делать repair-install системы.
Обновления по удалённым пакетам приходить не будут.

Почему /Online – потому, что dism может редактировать оффлайн-образы системы в папке. Также dism заодно умеет просматривать установки MSI с помощью /Get-Apps и устанавливать-удалять пакеты Appx (/Get-AppxPackage), чем все пользуются для удаления установленных в винду стильных модных калькуляторов.

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

Как понять, какие пакеты что значат? Это сложно, у большинства пакетов названия неговорящие, а часто и не такие, как у конечного продукта. Пакеты также описаны в:
C:\Windows\servicing\Packages
На каждый там лежит XML-файл с описанием пакета, компонентов и обновлений, иногда есть описание (description), хотя редко. По ряду пакетов есть информация в MSDN, хотя она больше касается unattended installation и того, какие параметры пакета можно настроить. Кроме этого остаётся гуглить, часто название технологии что-нибудь подсказывает.

Также во время обслуживания пакетов подключается ключ HKLM\COMPONENTS из C:\Windows\system32\config\COMPONENTS, который содержит много непонятной информации. Как с его помощью сопоставить файлы (assemblies) пакетам я пока не выяснил.

Логи к CBS ведутся в C:\Windows\Logs\CBS, это волшебное место и при диагностике ошибок Windows Update.

Пакеты, которые можно с удовольствием удалить:

Ненужные фичи:
Microsoft-Windows-OneDrive-Setup-Package – окончательно добивает OneDrive, который дедка бил-бил, не разбил.
Microsoft-Windows-OfflineFiles-Package – кто-нибудь этим пользуется?
Microsoft-Windows-Shell-HomeGroup-Package
Microsoft-Windows-Shell-HomeGroup-Package-printscan
Microsoft-Windows-EnterpriseClientSync-Host-Package – это WorkFolders.
Microsoft-Windows-WorkplaceJoin-Package – ещё одна разновидность “синхронизации папок с работой”. Briefcase, OfflineFiles, WorkFolders, WorkplaceJoin, кто больше?
Microsoft-Windows-PeerDist-Client-PackageBranchCache, если у вас сервера BranchCache-документов нет, то не нужен.

Ненужные свистелки и бренчалки:
Microsoft-Windows-Cortana-Package – но осторожно: возможно, удалится и поиск вообще
Microsoft-OneCore-Networking-XboxLive-Package – некоторые другие пакеты по Xbox, возможно, не стоит удалять – какие-то игры могут на них рассчитывать
Microsoft-OneCore-Networking-XboxLive-WOW64-Package

Ненужные технологии:
Microsoft-Hyper-V-* – Пакетов 30 на эту тему. Если адреналин задул в паруса души, можно поудалять.
Microsoft-Windows-IIS-WebServer-Package – впрочем, отключается и из Features.
Microsoft-Windows-IIS-WebServer-AddOn-Package
Microsoft-Windows-IIS-WebServer-AddOn-2-Package

Майкрософт следит за тобой:
Microsoft-WindowsFeedback-Package
Microsoft-Windows-Prerelease-Client-Package [он же Microsoft-Windows-DiagTrack-Package]

CBS просто замечательны в том, что разбивают Винду на пакеты. Чего же в них недостаёт?
1. Зависимостей между пакетами. Сейчас можно удалить пакет, который нужен другому пакету. В компонентизаторе Windows XP Embedded зависимости были, хотя зачастую пакеты и тянули за собой всё подряд потому, что их зависимости были плохо компонентизированы.
2. Установки из онлайн-репозиториев. Здесь преуспевает OneGet, а CBS умеет устанавливать только cab-файлы.
3. Регистрации нескольких репозиториев. Не все хотят обновляться только через Windows Update, какие-то программы хотели бы выкладывать обновления в собственных репозиториях.
4. Подробной информации о содержимом пакета. Куча пакетов непонятно зачем нужна.

Бонус!

Пока я писал эту заметку, я написал свою собственную утилиту для управления пакетами! Называется CBSEnum:

Она представляет их в виде дерева (хотя вообще в реестре они лежат кучей), позволяет удалять пачками, показывает какую-то справку, какую удалось добыть из Windows\servicing. Также может скрывать/восстанавливать пакеты от DISM.

OneGet

Одна из бед Windows – это что в ней нет собственного package manager. Но Виндоус решила переплюнуть Линукс, и теперь есть package manager manager!

OneGet

Это штука, которая поддерживает множество типов пакетов. Например, в комплекте есть плагин MSI, возвращающий список всех установленных на компьютере MSI-пакетов (добрая половина инсталляторов). Есть плагин chocolatey – тоже, оказывается, развитый репозиторий, который ещё и поддерживает “автоматически обновляемые пакеты” (т.е. сам сервер выпускает новую версию, когда она выходит на стороннем ресурсе). Пишут о 2800 программах (не считая версий)!

Всё это богатство доступно из командной строки:
Install-Package Firefox
Install-Package Thunderbird

Но не работает, поскольку в версии, попавшей в Windows 10, провайдер chocolatey недоступен, и все способы его добавить не дают возможности установить ПО (хотя поискать по спискам можно). Придётся ждать, когда его починят.

У авторов большие планы, хотят добавить поддержку всех крупных систем распространения модулей (например, питоновский pip или ruby gems).

Это штука с одной стороны очень интересная и полезная, с другой – надо подумать, решает ли она все проблемы? Что chocolatey, что oneget по большому счёту не лезут внутрь инсталляторов. chocolatey вообще часто скачивает готовый инсталлятор и формирует пакет “запустить msi с ключом тихой установки”. Они решают задачу пакетной установки программ.

Но другая цель менеджеров пакетов – это борьба с бардаком. Пользователь имеет право знать, какие файлы на его компьютере кто и зачем установил. Бесхозного мусора не должно быть. К сожалению, во всех современных системах программы сыплют всем подряд куда попало. Бросают свои модули в системные папки, пишут логи в папку Windows, создают временные директории в корнях дисков, складывают в папках данных свои исполняемые файлы, засыпают папку пользователя всевозможными “Моими проектами Visual Studio” и “Моими фотографиями со стиральной машины”. Андроид создавался с нуля, но в нём такой же дикий запад.

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

Автор OneGet пишет, объясняя такое решение: “Для Windows сделано что-то в духе двух миллионов программ, сложно ждать, что их все начнут перепаковывать”. Согласен, но иначе никак. Это главный смысл менеджера пакетов. Без него менеджер не менеджер, а пусть комфортная, очень удобная, но программа для автоматизации установки, вот и всё.

Скоро я напишу о настоящем менеджере пакетов, который тихой сапой есть в винде уже давно, но стараниями Майкрософт своей роли не выполняет и почти не известен.