Оптимизируй это! или как нам обустроить компьютер |
|
|
Часть IVАктуализацияПродолжаем наш тяжёлый, но благодарный труд. Не грех автоматизировать некоторые операции, которые должны выполняться при наличии подключения к Сети. Начнём с синхронизации. Ни для кого не секрет, что в интернете есть множество серверов времени, с которыми можно синхронизировать часы домашнего компьютера. Windows может делать «это» раз в неделю по расписанию. Мы же остаёмся в душе молодыми, раз в неделю – это для пенсионеров, нам же хочется почаще, и не по унылому расписанию, а когда «накатит», - так гораздо романтичнее! Напомню, что мы рассматриваем вариант не с постоянным, а с эпизодическим подключением к Сети, и не хотелось бы, чтобы наш домашний комп проворонил синхронизацию только потому, что в запланированное время не было коннекта. А вы о чём подумали? Недавно перечитывал ранних Стругацких и вспомнил термин «эффектор», который мне понравился больше «манипулятора». Итак, первый рассматриваемый «эффектор» выполняет синхронизацию часов нашего компьютера с сервером времени (который, в свою очередь, синхронизируется с атомными часами).
#( Синхронизация NoLog NoDel RunOnce Time: 34 12 1 1 * 2007 Action: SWHide NormalPriority
HOST-EXIST: "psu.edu" IF TP-SYNC: clock.psu.edu TP-SYNC-RESULT 0<> IF CLEAR-ONCE ELSE BALLOON: "Часы компьютера" "синхронизированы с атомными часами" PLAY-SOUND: "%windir%\Media\chimes.wav" THEN THEN )# Листинг 1
Второе задание (листинг 2) обновляет вирусные базы антивируса DrWeb. Действительно, пусть наш дружок не только запускает и останавливает защиту, когда это нужно, но и следит за обновлениями. Если помните, от «родного» планировщика DrWeb мы отказались в процессе инсталляции, а обновлять антивирус вручную неспортивно; nnCron не забудет сделать это, не расстроится из-за медленного соединения или разрыва, его не позовёт ужинать жена и не отвлекут дети…
#( UpdateDrWeb RunOnce Time: 41 16 18 10 * 2007 NoLog NoDel AsLoggedUser LoadProfile CREATE file_name 258 ALLOT Action: SWHide NormalPriority
HOST-EXIST: "drweb.com" IF PROC-EXIST: "drwebupw.exe" NOT IF START-APPW: c:\progra~1\drweb\Drwebupw.exe /GO /QU BALLOON: "Антивирус" "Обновлён в %hh%:%mm%:%ss%" THEN )# Листинг 2
Модули, обезвреживающие шпионское и прочее вредоносное ПО, есть как в антивирусе DrWeb, так и в «Agnitum Outpost Firewall», и базы вредоносного ПО каждая система, естественно, обновляет. Но для вящего спокойствия не грех иногда воспользоваться и специализированной утилитой, заточенной на поиск и удаление именно вредоносного ПО, не вирусов. Я для этих целей использую мобильную версию «Ad-Aware se», которая может запускаться с флешки без инсталляции. По умолчанию лежит она в папке «C:\Program Files\Ad-Aware» и хлеба не просит, а при запуске честно ищет всякие бяки и предлагает удалить найденное. Софтинка бесплатная, русский интерфейс наличествует. Файл её базы данных, содержащей описания нехорошего ПО, называется «defs.ref» и находится в той же папке. База данных, естественно, нуждается в периодическом обновлении, и его, конечно же, можно выполнять вручную из интерфейса программы. Но это не наш метод. Задание «UpdateAdAware» определяет, были ли обновления на сайте разработчика с момента последней проверки. Если были, скачивает ZIP-архив с сайта разработчика, распаковывает его, полученную базочку подсовывает программе, а архивчик удаляет. Если у антивируса и файрволла есть собственные планировщики для автоматического обновления, пусть и анемичной наружности, то у Ad-Aware такового нет в принципе. И здесь уже невооружённым глазом видно преимущество использования своего собственного планировщика. В этом задании впервые вышли на сцену две утилитки: wget и pkunzip. И если со второй всё ясно, то первую представлю в двух словах. Wget – утилита, предназначенная для скачивания файлов, управляемая командной строкой. Именно то, что нам нужно! Каждый желающий может найти её Windows-дистрибутив в интернете. nnCron, конечно, имеет собственное средство для скачивания файлов, реализуемое плагином «http.spf», но у него есть два недостатка: невысокая скорость и некоторая глючность. Например, архив с программой ТВ этот плагин ни за что не желает скачивать. Слишком сурьёзный товарищ, а нам всё же ничто человеческое не чуждо… В-общем, совершенно не вижу, почему благородным донам не использовать Wget.
#( UpdateAdAware RunOnce Time: 41 16 18 10 * 2007 NoLog NoDel AsLoggedUser LoadProfile Action: SWHide NormalPriority
HOST-EXIST: "lavasoft.com" IF HTTP-CHANGED: "http://download.lavasoft.com/public/defs.zip" IF START-APPW: wget -O "%TEMP%\defs.zip" http://download.lavasoft.com/public/defs.zip
FILE-EXIST: "%TEMP%\defs.zip" IF START-APPW: pkunzip.exe -o "%TEMP%\defs.zip" "%TEMP%" FILE-MOVE: "%TEMP%\defs.ref" "C:\Program Files\Ad-Aware"
FILE-DELETE: "%TEMP%\defs.zip"
1 BalloonIcon ! BALLOON: "Ad-Aware" "Обновлён в %hh%:%mm%:%ss%" THEN THEN THEN )# Листинг 3
Боясь показаться назойливым, рискну всё же напомнить, что мы рассматриваем случай с непостоянным – периодическим – подключением к Сети. Поэтому всякие виджеты, которые только и умеют, что показывать погоду в доме и биржевые сводки – не про нас. К тому же, они жрут кучу ресурсов. Но благ всё же хочется, и ярлычок на рабочем столе, который покажет погоду на завтра даже при отсутствии коннекта, вовсе не буржуазное излишество, а вполне разумное удобство. Особенно актуально это для пользователей dial-up из села Разгуляево, у которых каждая копеечка на счету. Итак, обновляет прогноз задание «UpdateWeather». Нужно только заменить адрес «http://weather.rambler.ru/?id=3627» на соответствующий вашему населённому пункту.
#( UpdateWeather NoLog RunOnce Time: 13 20 17 4 * 2008 NoDel AsLoggedUser LoadProfile VARIABLE SEM_WEATHER Action: SWHide NormalPriority
HOST-EXIST: "rambler.ru" IF SEM_WEATHER GET START-APPW: wget -O "%USERPROFILE%\Рабочий стол\Прогноз погоды.html" http://weather.rambler.ru/?id=3627 BALLOON: "Прогноз погоды" "Обновлён в %hh%:%mm%:%ss%" SEM_WEATHER RELEASE THEN )# Листинг 4
Если не у всех ваших любимых сайтов есть RSS-ленты, а отслеживать обновления ресурсов всё же хочется, интернет может предложить на выбор сотни утилиток, которые займутся этим. Но то же самое может делать и nnCron, поэтому нужда в сторонних утилитах отпадает. Задание из листинга 5 иллюстрирует эту способность планировщика.
#( Отслеживание_новостей_на_сайтах RunOnce Time: 41 16 18 10 * 2007 NoLog NoDel AsLoggedUser LoadProfile 0 VALUE LET_DOWNLOAD Action: SWHide NormalPriority
HTTP-CHANGED: "http://www.israelshamir.net/ru.htm" IF BALLOON: "Исраэль Шамир" "написал что-то новое" THEN )# Листинг 5
Также было бы удобно получать уведомления о новой почте в вашем ящике, даже если почтовый клиент не запущен. И вовсе не обязательно для этого засорять память утилитками типа «Mail.ru Agent». В листинге 6 приведён пример задания для планировщика, которое каждые 5 минут (при наличии коннекта) проверяет почтовый ящик и сообщает о новых письмах. Проверяемых ящиков может быть несколько, и не только на MAIL.RU, но и на других почтовых серверах.
#( Проверка_почты NoLog AsLoggedUser LoadProfile Time: */5 * * * * * 0 VALUE number_of_messages VARIABLE SEM_POST Action:
SEM_POST GET HOST-EXIST: "mail.ru" IF S" pop.mail.ru" S" имя_усера_до_@mail.ru" S" пароль_усера" POP3-CHECK TO number_of_messages
number_of_messages 0 > IF BALLOON: "Новая почта" "кол-во сообщений: %number_of_messages%" THEN THEN SEM_POST RELEASE )# Листинг 6
«Эффектор» из листинга 7 обновляет с сервера www.teleweb.ru ТВ-программу и копирует её в папку, для этого предназначенную, по умолчанию – «C:\Program Files\BeholdTV\TVGuide»; вы можете изменить целевую папку. Теперь не придётся держать в оперативной памяти «агента» Beholder’а только для того, чтобы обновлять ТВ-программу. Ещё несколько освобождённых мегабайт в RAM… В этом задании также используются утилиты Wget и Pkunzip.
#( Update_TV_prog RunOnce Time: 41 16 18 10 * 2007 NoLog NoDel AsLoggedUser LoadProfile Action: SWHide NormalPriority
HOST-EXIST: "teleweb.ru" IF FILE-EXIST: "C:\Program Files\BeholdTV\TVGuide\BBC.ndx" IF CUR-DATE FILE-WRITE-DATE: "C:\Program Files\BeholdTV\TVGuide\BBC.ndx" DATE- 7 > IF START-APPW: wget -O "%TEMP%\jtv.zip" http://teleweb.ru/files/jtv.zip FILE-EXIST: "%TEMP%\jtv.zip" IF START-APPW: pkunzip.exe -o "%TEMP%\jtv.zip" "%TEMP%"
FILE-DELETE: "C:\Program Files\BeholdTV\TVGuide\*.ndx" FILE-DELETE: "C:\Program Files\BeholdTV\TVGuide\*.pdt"
START-APP: move "%TEMP%\*.ndx" "C:\Program Files\BeholdTV\TVGuide" START-APP: move "%TEMP%\*.pdt" "C:\Program Files\BeholdTV\TVGuide"
FILE-DELETE: "%TEMP%\jtv.zip"
0 BalloonIcon ! BALLOON: "ТВ-программа" "Обновлена в %hh%:%mm%:%ss%" THEN THEN THEN THEN )# Листинг 7
Наконец, задание «UpdateFromInternet», запускаемое каждый час, выполняет весь комплекс обновительных мероприятий, что благотворно сказывается как на удобстве использования нашего железного друга, так и на его способности не ломаться под ударами судьбы, то бишь, атаками извне.
#( UpdateFromInternet NoLog NoDel AsLoggedUser LoadProfile Time: 1 */1 * * * * VARIABLE SEM_UPDATE Action: SWHide NormalPriority
SEM_UPDATE GET Синхронизация RUN \ Проверка_почты RUN Отслеживание_новостей_на_сайтах RUN
UpdateDrWeb RUN UpdateAdAware RUN UpdateWeather RUN Update_TV_prog RUN SEM_UPDATE RELEASE )# Листинг 8
Таким образом, у нас автоматически обновляется широкий ассортимент ПО; список его можно расширять на ваше усмотрение. Нельзя не упомянуть о важности своевременного обновления собственно Windows. Этим может заниматься как сама операционная система через «автоматическое обновление», так и пользователь компьютера – вручную. Оптимизация ввода-выводаСо спокойной душой, раз и навсегда решив для себя вопросы автоматических обновлений, обратим своё внимание на дисковый ввод-вывод. Понимая основные принципы работы дисковой подсистемы, мы сможем так её подкрутить и подтянуть, чтобы сделать компьютеру благо, а себе обеспечить комфортную работу. Итак, есть два основных пути ускорения работы дисковой подсистемы. Во-первых, нужно оптимизировать работу того, что есть, используя для этого регулярное удаление временных файлов, регулярную дефрагментацию, а также минимизацию нагрузки на диск. Последний вопрос мы уже порешали, научившись запускать антивирусный файловый монитор, сильно нагружающий дисковую подсистему, только тогда, когда в нём есть необходимость. Второй метод ускорения – распараллеливание ввода-вывода. Для этого можно использовать RAID-массивы, два и более различных физических диска, технологию вроде «Ready boost» Windows Vista. Пойдём потихоньку от простого к сложному.
Очистка временных файловЭтим полезным делом у нас займутся два задания. Первое из них – «Очистка диска» - листинг 9. Рассмотрим его повнимательнее. Во первых его строках производится удаление файлов, шаблоны которых вручную описаны в файле «tmp_files_for_del.lst» (см. листинг 10). Расширять его можно почти до бесконечности, но делать это должен только грамотный товарищ, отдающий себе отчёт в своих действиях. Второй блок начинается с комментария «очистить корзину»; это действие не вполне однозначное, поэтому собственно действие закомментировано. Если вы считаете регулярную очистку корзины делом достойным и вельми полезным, раскомментируйте следующую строку. Эх, где-то теперь наш приснопамятный Бейсик с его нумерацией строк? Как удобно было ссылаться на строчки в программе!.. Ну да ладно, смотрим на то, что есть. А есть у нас следующий откомментированный блок: «Почикать старые ненужные ярлыки». Windows, как вы помните, запоминает запускавшиеся нами программы и ярлыки самых часто используемых приложений добавляет в меню «Пуск». К сожалению, команда Билли не озаботилась при этом очищать историю запуска, и там можно увидеть такое! Полюбопытствуйте, будете неприятно удивлены злопамятностью системы… Именно этот недостаток мы и исправляем: вначале удаляются все ярлыки с датой создания старше одного месяца, а затем таким же образом удаляются устаревшие ссылки на открывавшиеся когда-либо файлы. Следующий блок очищает неиспользуемые системой библиотеки из буферной (временной) папки «%SystemRoot%\system32\dllcache». Если к каким-либо файлам из этой папки не было обращения два и более месяцев, они точно не нужны в повседневной деятельности. А значит, эти файлы можно с чистой совестью удалить: объём этой папочки доходит до нескольких сот мегабайт. Кстати, ничего страшного при этом не произойдёт: при нужде в этих файлах Windows попросит у вас диск с дистрибутивом, и вопрос решится к взаимному удовольствию. Наконец, последний блок удаляет временные файлы, созданные MS Word’ом (~$*.doc, ~$*.rtf). Сделайте поиск по диску, и вы этих мусорных файлов насчитаете десятки и сотни.
#( Очистка_диска VARIABLE DISK_CLEAR VARIABLE file0 CREATE str0 258 ALLOT NoLog RunOnce NoDel Time: 30 18 30 9 * 2006 Action: SWHide NormalPriority
DISK_CLEAR GET S" Начало очистки диска" CRON-LOG
\ Удалить ненужные файлы S" C:\Program Files\nnCron\tmp_files_for_del.lst" R/O OPEN-FILE-SHARED THROW file0 ! BEGIN str0 1+ 255 file0 @ READ-LINE THROW WHILE str0 C!
RECURSIVE WITHDIRS PURGE-OLD: "%str0 COUNT%" -1 REPEAT
DROP file0 @ CLOSE-FILE DROP
\ Очистить корзину \ START-APP: "C:\Program Files\nncron\nncron.exe" -wp -runfile "C:\Program Files\nnCron\plugins\clearbin.spf"
\ Почикать старые ненужные ярлыки PURGE-OLDW: "C:\Documents and Settings\%USERNAME%\Recent\*.*" 30 START-APPW: attrib -H "C:\Documents and Settings\%USERNAME%\Recent"
\ Почикать устаревшие ссылки на когда-либо открывавшиеся файлы PURGE-OLDW: "%USERPROFILE%\Application Data\Microsoft\Office\Последние файлы\*.*" 30 START-APPW: attrib -H "%USERPROFILE%\Application Data\Microsoft\Office\Последние файлы"
\ Почикать старые драйвера RECURSIVE WITHDIRS PURGE-OLDA: "%SystemRoot%\system32\dllcache\*.*" 60
\ -------- Очистка временных файлов после MS Word -------- RECURSIVE SKIPERRORS FILESONLY FOR-FILES: "C:\~$*.*" RE-MATCH: "%FOUND-FILENAME%" "/(\.doc)|(\.rtf)$/i" IF FILE-DELETE: "%FOUND-FULLPATH%" THEN ;FOR-FILES \ ----------------------------------------------
S" Конец очистки диска" CRON-LOG
BALLOON: "Временные файлы" "удалены в %hh%:%mm%:%ss%" DISK_CLEAR RELEASE )# Листинг 9
C:\TEMP\*.* C:\Documents and Settings\Администратор\Local Settings\Temp\*.* C:\Documents and Settings\Администратор\Local Settings\Temporary Internet Files\*.* C:\Program Files\DrWeb\*.drw C:\Program Files\DrWeb\*.tmp C:\*.mdmp Листинг 10
Плавно переходим к следующим рассуждениям. В Windows есть приложение «Очистка диска», в котором есть опция «Сжатие старых файлов». Система отслеживает частоту обращения к файлам, и позабытые-позаброшенные старается сжать (средствами NTFS). Я предлагаю похожий механизм, с одним только отличием. Сжиматься будут не забытые файлы, а файлы хорошо сжимаемых типов: DOC, RTF, XLS, TXT, и т.д. Соответствующий «эффектор» приведён в листинге 11. Запустите его и почувствуйте разницу! На ваших дисках высвободятся сотни мегабайт. Подробно описывать это задание не буду, всё и так ясно из описания и комментариев в тексте.
#( Глубокая_очистка_дисков VARIABLE DISK_CLEAR_ADV NoLog NoDel RunOnce Time: 34 12 1 1 * 2007 0 VALUE FileAttributes VARIABLE file1 VARIABLE file2 CREATE str2 258 ALLOT VARIABLE _free_space Action: SWHide IdlePriority
DISK_CLEAR_ADV GET S" Начало глубокой очистки дисков" CRON-LOG S" C:\Program Files\nnCron\disks.lst" R/O OPEN-FILE-SHARED THROW file1 ! BEGIN str1 1+ 255 file1 @ READ-LINE THROW WHILE str1 C!
\ -------- Очистка дерьма после MS Word -------- RECURSIVE SKIPERRORS FILESONLY FOR-FILES: "%str1 COUNT%:\~$*.*" RE-MATCH: "%FOUND-FILENAME%" "/(\.doc)|(\.rtf)$/i"
IF FILE-DELETE: "%FOUND-FULLPATH%" THEN ;FOR-FILES \ -------- Сжатие сжимаемого ------------------- FILE-EXIST: "%str1 COUNT%:\" IF \ ~~~~~~~~~~ Определяем свободное место на диске ~~~~~~~~~~ str1 \ на стэк кладём адрес строки 1+ \ смещаемся на 1 символ, так-как у нас строка со счётчиком C@ \ берём 1 символ строки - это имя диска FREE-SPACE _free_space ! \ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ S" Перед сжатием файлов на диске %str1 COUNT%: своб.места: %_free_space @%" CRON-LOG
FILE-DELETE: "%FOLDER-TEMP%\Файлы нулевого размера.lst"
RECURSIVE SKIPERRORS FILESONLY FOR-FILES: "%str1 COUNT%:\*" RE-MATCH: "%FOUND-FILENAME%" "/(\.doc)|(\.dot)|(\.vsd)|(\.rtf)|(\.xls)|(\.xsd)|(\.bmp)|(\.txt)|(\.htm)|(\.html)|(\.mht)|(\.sql)|(\.dbf)|(\.ndx)|(\.idx)|(\.ib)|(\.bak)|(\.log)|(\.hlp)|(\.gid)|(\.cnt)|(\.pdf)|(\.xml)|(\.fdb)|(\.fbk)|(\.mdb)|(\.ms)|(\.rep)|(\.key)|(\.mde)|(\.xlt)|(\.pas)|(\.usa)|(\.ini)|(\.tmp)|(\.gif)|(\.old)|(\.err)|(\.mnu)|(\.lst)|(\.pst)|(\.frf)$/i"
IF 0. FILE-SIZE: "%FOUND-FULLPATH%" D=
IF \ Почикать файлы нулевого размера START-APP: echo "%FOUND-FULLPATH%" >>"%FOLDER-TEMP%\Файлы нулевого размера.lst" FILE-DELETE: "%FOUND-FULLPATH%" ELSE \ Сжать сжимаемое S" %FOUND-FULLPATH%" EVAL-SUBST DROP GetFileAttributesA 2048 <
IF \ Не стоит атрибутов "сжатый", "зашифрованный", "неиндексируемый" START-APPW: compact /c "%FOUND-FULLPATH%" >NUL ELSE S" %FOUND-FULLPATH%" EVAL-SUBST DROP GetFileAttributesA TO FileAttributes
\ Стоит атрибут "неиндексируемый" FileAttributes 8192 >
IF FileAttributes 10240 <
IF START-APPW: compact /c "%FOUND-FULLPATH%" >NUL THEN THEN THEN THEN THEN ;FOR-FILES
\ ~~~~~~~~~~ Определяем свободное место на диске ~~~~~~~~~~ str1 \ на стэк кладём адрес строки 1+ \ смещаемся на 1 символ, так-как у нас строка со счётчиком C@ \ берём 1 символ строки - это имя диска FREE-SPACE _free_space ! \ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ S" После сжатия файлов на диске %str1 COUNT%: своб.места: %_free_space @%" CRON-LOG THEN \ ---------------------------------------------- REPEAT
DROP file1 @ CLOSE-FILE DROP
S" Конец глубокой о |