MCP

среда, 31 декабря 2014 г.

Итоги моего года

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

Наверное, в будущем, надо писать в блокнотик, потому что всё уже забылось, а что не забылось — не помню в каком году было...   В общем, из того, что вспомнилось:

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

Архиватор, это офигенная штука! Пока изучал и писал свой, начал разбираться в алгоритмах, их устройстве и теперь уже понимаю с полувзгляда, что можно сделать с набором файлов, как их можно пожать  К сожалению, играться с архиватором гораздо веселее, чем довести его до ума. Поэтому, наигрался вдоволь, но более или менее рабочий вариант представляет собой аццкий говнокод, который надо будет переписывать, ибо видеть его страшно. Впрочем, как допишу, постараюсь написать отдельные посты про это дело, благо я даже делал доклад, и у меня есть слайды и куча желания о чём рассказать. Пример слайда:

С поиском разницы в файлах пришлось изобретать велосипед: ибо это не обычный дифф, а дифф файлов, находящихся на разных компьютерах в разных датацентрах. И обмен информации следует максимально сократить. А потом ещё и подумать — искать разницу, или плюнуть и отдать файл целиком. Т.е. в отличии от теории, надо пользоваться жёсткими эвристиками для оценки требуемых действий. И это интересно.

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

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

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

PS: А ещё я научился собирать кубик Рубика за полторы минуты. А потом разучился. И полностью разучился собирать обычные, дешёвые кубики.

воскресенье, 28 декабря 2014 г.

Новогоднее RDP

Скоро новый год, а значит выходные, т.е. к серверам лучше не прикасаться, а если прикасаться, то аккуратно. Естественно, Microsoft всех приучило, что самый простой и ненапряжный способ это сделать - RDP (нет, конечно, PowerShell рулит и бибикает, но назвать этот способ простым, как-то язык не поворачивается).

Итак, RDP живёт, проблем вроде бы нет, но... в один прекрасный момент вы обнаруживаете следующую картину, которые можете наблюдать продолжительное время без видимых результатов.


Другими словами, при попытке подключения — RDP тупит, а потом идёт отлуп с пространными объяснениями, что всё плохо.
Вы дома, сервер далеко, к нему не подойти и не пнуть ногами. Подключиться — не удаётся.
Практика показывает, что это частое явление при разрывах сети. Т.е. кроме разрыва соединения, ещё появляются такие шикарные эффекты. Причем страдают обычно 8-ые винды (т.е. Windows Server 2012 и 2012 R2)
Что в этом случае можно сделать?

Для начала, конечно же выполнить пункт номер 0 — иметь пути отхода и дырку в фаирволле. Причём делать это по-возможности всегда. Т.е. у вас всегда должно быть как минимум 2 пути подключения к серверу (например через рабочий компьютер и через другой сервер), и желательно на определённые IP иметь хороший список открытых портов для этих дружественных компов. Винда это вам не Linux, тут одним SSH не обойдёшься, особенно когда так тупит RDP!

Вариант первый, банальный и неинтересный:
shutdown /m \\server /r /t 1
Отправляем компьютер в ребут... очевидно и неинтересно. Надо идти другими путями. Другие пути заключаются в том, что надо бы перепустить службу Remote Desktop, которая зовётся TermService.

Тут 2 варианта:
sc \\server restart TermService (оцените синтаксис команды относительно предыдущей)

Или же, с помощью мышки: mmc.exe, добавить остнаску, службы, другой компьютер, перезапуск.

Но, тут как всегда нас ждёт сюрприз... в 90% случаях служба зависнет и не захочет останавливаться. Так что придётся добивать её ногами. Битьё усложняется тем, что она висит в процессе svchost.exe (благо обычно на нужном ничего полезного нет).

Так что
tasklist /s server /svc | findstr TermService (оценили синтаксис?)
taskkill /s server /pid 123456

Ну и запускаем службу. Вроде просто и очевидно, но как всегда лезут нюансы: если у нас плохо с логином и паролем (а мы дома, а не в домене), то получим отказ в доступе. Некоторые команды имеют возможность указать логин с паролем, некоторые используют существующее соединение (net use \\server\c$ - получим замечательное подключение и для управления), некоторые просто отказываются работать.

Можно применить PowerShell, создать сессию на сервер и там всё сделать, но ведь его надо настроить... добавить доверие... в общем если вы не занимаетесь этим специально, работать не будет.

Так что, если всё плохо и ничего не работает, то придётся ползти в сторону Sysinternals, а именно PsTools, и через psexec уже всё делать. Что удивительно, работает это гораздо надёжнее, чем встроенные средства системы. Даже если не разбираться, можно написать


psexec \\server tasklist /svc

И получить тот же результат (да, мне лень изучать другие команды из этого набора ).

Собственно, зачем я это написал? Вроде очевидные вещи. Да в общем-то с двумя простыми целями: в очередной раз поныть на винду, и показать, что если что-то не работает, можно всё-таки обойтись без перезагрузки.

UPD: Спустя время, надо бы добавить ещё пару команд, которые помогут решить подобную проблему. Ибо у Microsoft всё устроено очень сложно, половина команд может работать, а другая половина не работать с дурацкими сообщениями вида (не шутка):
Couldn't access server:

The operation completed successfully.

Соответственно, tasklist /svc в нашём случае можно заменить на
sc queryex TermService

А вот с taskkill посложнее. Может прокатить скрипт на PowerShell
Invoke-Command -ComputerName server -ScriptBlock {Stop-Process -Id 123456 -Force} -Credential DOMAIN\user