Содержание статьи

Есть вопросы — присылай на faq@real.xakep.ru.

 

Q: Какой инструмент ты можешь посоветовать, чтобы найти на сайте медленные страницы, чтобы впоследствии оптимизировать их?

A:Наверное, каждый веб-мастер знает о таком инструменте для аналитики, как Google Analytics (www.google.com/analytics). С недавнего времени сервис обзавелся новым интерфейсом (он постепенно становится доступным всем пользователям) и некоторыми новыми фичами. Одна из них занимается как раз тем, что измеряет время загрузки отдельных страниц сайта. По умолчанию, правда, такая возможность отключена. Чтобы включить бенмарк необходимо добавить одну строчку в скрипт GA (тот JS-код, который вставляется в каждую страницу веб-проекта и необходим для сбора и отправки данных Google’у), а именно обращения к функции _trackPageLoadTime(), который должен происходить после вызова _trackPageview():

// Вариант для асинхронного кода GA:
_gaq.push(['_trackPageview']);
_gaq.push(['_trackPageLoadTime']);
// Вариант для стандартного кода GA:
pageTracker._trackPageview();
pageTracker._trackPageLoadTime();

После этого данные о времени загрузки страницы ты сможешь найти в отчете «Содержание - Скорость загрузки сайта». В отчет будут включены все страницы ресурса, отсортированные в списке по времени загрузки в секундах.

 

Q: Каким образом можно сделать полный бэкап профайла отдельного пользователя Windows и всех пользователей сразу? Чтобы без проблем перенести профиль в другую систему?

A:Можно было бы объяснить, как это сделать вручную, но лучше всего с задачей справятся специализированные утилиты вроде Backup Utility (code.google.com/p/backup-utility-4) и DataGrab (sites.google.com/a/obxcompguy.com/foolish-it/vb6-projects/datagrab), которые полностью автоматизируют процесс.
Вторая из утилит создает резервную копию выбранного профиля (при желании можно сделать бэкап всех профайлов сразу), а также любых других выбранных папок и оформляет резервную копию в виде исполняемого файла. Соответственно, для переноса профилей в другую систему, в том числе недавно установленную, необходимо лишь запустить этот exe-шник.

 

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

A:Знакомая проблема. Ведь даже для получения аккаунта разработчика Apple, придется воспользоваться факсом (WTF?!). Проще всего «отправить бумажку» через специальный сервис вроде www.myfax.com/free. Совершенно бесплатно, замечу.

 

Q: Посоветуй SOCKS5-прокси, который можно установить на удаленном Linuxшелле.

A:Ты, возможно, удивишься, но в большинстве случаев поднять на Linux-хосте сокс можно всего одной командой:

ssh -N -D 0.0.0.0:1080 localhost

Таким образом, мы включаем динамическую переадресацию портов (флаг «-D») с 1080 порта и взаимодействие с клиентами по протоколам SOCKS4 и SOCKS5 (то есть точно так же, как и любой другой SOCKS5-прокси). Опция «-N» указывает, что процессу необходимо работать в idle-режиме без запуска каких-либо команд на localhost’е. Можно также запустить ssh в фоновом режиме, добавив при запуске ключ «-f». Важно, что для выполнения команды тебе не нужны рутовые привилегии. Но они понадобятся, если ты захочешь сделать контроль доступа при помощи iptables:

iptables -A INPUT --src 1.2.3.4 -p tcp --dport 1080 -j ACCEPT
iptables -A INPUT -p tcp --dport 1080 -j Reject

С помощью этих команд мы разрешаем подключения с IP-шника 1.2.3.4 и запрещаем любые другие (для 1080 порта). Но если очень хочется отсечь левые подключения, которые обязательно будут, а рутовых прав нет, то можно воспользоваться довольной простой proxy-оберткой, написанной на Perl’е, — TCP proxy (github.com/pkrumins/perl-tcp-proxy). В сценарии явным образом прописывается список допустимых для подключения IP-адресов (переменная @allowed_ips). TCP proxy будет стартовать на указанном порту и переадресовывать на наш SOCKS-сервер только те запросы, которые разрешены. Сам демон SSH при этом нужно запустить немного по-другому:

ssh -N -D 55555 localhost

При такой конфигурации никто не сможет подключиться к SOCKS извне, кроме приложений, запущенных на localhost’е.

 

Q: Подскажи, как правильно (без лишних костылей и софта) ограничить список программ, которые может запускать Windowsпользователь?

A:Задача «на ура» решается с помощью стандартного механизма Windows, который называется «Политика ограниченного использования программ» (SRP). Если быть точным, то через редактор групповой политики (GPO). Наша задача — запретить пользователю запуск любых приложений, кроме нескольких разрешенных (ты их определяешь сам) и тех, которые необходимы ему для выполнения входа в систему. Так, чтобы юзер мог просто залогиниться в систему, ему обязательно нужно предоставить доступ к следующим системным приложениям:

C:Windowsexplorer.exe
C:WindowsSystem32csrss.exe
C:WindowsSystem32dwm.exe
C:WindowsSystem32rdclip.exe
C:WindowsSystem32taskhost.exe
C:WindowsSystem32TSTheme.exe
C:WindowsSystem32userinit.exe

Это обязательный список — без этих приложений пользователь даже не сможет зайти в систему. Теперь пошагово пройдем по процессу создания нужной политики:

  1. Запускаем консоль управления («Пуск - Выполнить» - mmc).
  2. Выбираем в меню «Файл - Добавить или удалить оснастку».
  3. Кликаем на «Редактор объектов групповой политики» (GPO).
  4. Жмем «Добавить».
  5. Кликаем «Обзор», указываем пользователя, который будет добавлен в GPO.
  6. Кликаем «Готово» и потом «ОК». Теперь в консоли управления ты видишь дерево с корневым элементом «Политика <имя пользователя».
  7. Переходим в «Конфигурация пользователя st Конфигурация Windows do Параметры безопасности» и кликаем правой кнопкой по «Политики ограниченного использования программ» и выбираем «Создать политику ограниченного использования программ».
  8. В дереве появятся два новых элемента. Кликаем на «Уровни безопасности».
  9. Дважды кликаем по элементу «Запрещено» и устанавливаем этот уровень безопасности по умолчанию. С этого момента пользователь не сможет запускать никакие приложения, кроме разрешенных.
  10. Переходим в раздел «Дополнительные правила». Удаляем отсюда мусор, который создала система (элементы, начинающиеся с «%HKEY_LOCAL_MACHINE...»).
  11. Остается добавить правила, разрешающие запуск необходимых для пользователя приложений и тех элементов, которые я перечислил выше, и необходимые для нормальной работы юзера в системе.

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

 

Q: Какую базу данных посоветуешь для простых проектов?

A:Если нужно что-то очень простое, то мой совет — SQLite (www.sqlite.org), которая при всей простоте использования является частью многих серьезных проектов.

Многие программы поддерживают SQLite в качестве формата хранения данных (особенно в Mac OS и iPhone OS, Android).

Базой данных SQLite удобно управлять через консольную утилиту sqlite3 или GUI-приложение вроде SQLite Browser (sqlitebrowser.sourceforge.net), SQLiteSpy (www.yunqa.de/delphi/doku.php/products/sqlitespy/index) и SQLite Manager (addons.mozilla.org/ru/firefox/addon/sqlite-manager). Чтобы глубже вникнуть в процессы, происходящие внутри SQLite, рекомендую посмотреть видеолекции от ее создателя Ричарда Хиппа (bit.ly/mCQlxA).

 

Q: Какой самый простой способ захостить файлы с удаленной машины?

A:Недавно открыл для себя один замечательный хак, представляющий собой всего одну команду:

$ python -m SimpleHTTPServer

Эта команда поднимает на 8000 порту (по умолчанию) полноценный веб-сервер с контентом текущей директории (т.е. той, откуда она была выполнена). Демон стартует на всех интерфейсах одновременно (адрес 0.0.0.0). Если в папке будет index.htm, то он соответствующим образом будет обработан при обращении. Если же его не окажется, то ты увидишь листинг текущей директории.

Очень удобно. Все это хозяйство работает потому, что в стандартной поставке Python есть модуль SimpleHTTPServer. А поскольку Python сейчас есть в поставке большинства Linux-дистрибутивов, то хак с большой вероятностью заработает практически везде.

Ничего не мешает провернуть то же самое и под виндой, если в ней установлен пайтон.

 

Q: Как незаметно удалить антивирус с удаленной машины?

A:Хочу рассказать об одном довольно забавном способе, в который я долго не мог поверить, когда мне его показали. Его мне продемонстрировал один знакомый администратор, которому необходимо было сразу со всех машин в локальной сети удалить корпоративную версию Symantec Antivirus.

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

Причем обязательно было обойтись без перезагрузки. Как сделать это на 300 компьютерах одновременно? Недолго думая, приятель посмотрел, как антивирус предлагает удалить его вручную. Для этого в ветке реестра HKEY_LOCAL_MACHINE SOFTWAREMICROSOFTWINDOWSCURRENT VERSIONUNINSTALL он нашел запись, которая касалась Symantec Antivirus. Его идентификатор был {BA4B71D1-898E4306-AE87-8BA7A596F0ED}. В параметре UninstallString явно указывалось, что деинсталляция осуществляется через стандартную службу MsiExec.exe. Уже просто скопировав значение этого параметра в командную строку, можно было запустить процесс удаления программы с компьютера.

Но нам-то нужно «тихое» удаление. Оказалось, что если добавить несколько ключей MsiExec.exe, то провести операцию можно вообще без всякого шума:

MsiExec.exe /norestart /q/x{BA4B71D1898E-4306-AE87-8BA7A596F0ED}
REMOVE=ALL

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

psexec \computer_name MsiExec.exe /norestart /q/x{BA4B71D1-898E-4306AE87-8BA7A596F0ED} REMOVE=ALL

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

 

Q: Как прокачать свой аккаунт на Dropbox, используя реферальную систему? Одних только левых email’ов не хватает: программа каким-то образом определяет уникальность системы.

A:Если говорить начистоту, то мой тебе совет. Если тебе действительно нужны дополнительные гигабайты для Dropbox-ящика, то не обломайся: купи премиальный аккаунт. За счет этого сервис может позволить миллионам пользователей пользоваться его услугами совершенно бесплатно. Но если по сути вопроса, то уникальность пользователя Dropbox определяется по MAC-адресу. Так что для каждого нового реферала, который будет прибавлять 250 Мб к объему контейнера Dropbox, нужно:

  1. Зарегистрироваться с уникальным email’ом.
  2. Войти в систему, используя такую регистрацию.

Если под Linux’ом Mac-адрес для сетевого адаптера меняется через ifconfig, то под виндой тебе понадобится специальная утилита Technitium MAC Address Changer v5 Release 3 (www.technitium.com). К слову, энтузиасты уже успели написать скрипт, который автоматизирует процесс прокачки профиля Dropbox (habrahabr.ru/blogs/services/120526).

 

Q: Вот задачка, как бы ты ее решил? В JavaScript есть некоторые данные, на их основе необходимо сгенерировать новый кусок HTML-страницы (по шаблону) и вставить в DOM. Как это лучше всего реализовать?

A:Главный вопрос: как хранить шаблон и как наиболее удачно вставить в этот шаблон данные? Решение этой задачки, честно скажу, я открыл для себя из блога Степана Резника (sreznikov.blogspot.com). А он, в свою очередь, позаимствовал его из лекций Дугласа Крокфорда. Идея в том, чтобы добавить в прототипы объекта String метод supplant, который в строке ищет выражения, заключенные в фигурные скобки {}. Каждое найденное выражение используется как ключ к переданному объекту, и, если по этому ключу лежит строковое или числовое значение, то выражение в фигурных скобках заменяется этим значением.

String.prototype.supplant = function(o)
{
return this.replace(/{([^{}]*)}/g, function(a, b) {
var r = o[b];
return typeof r === 'string' ||
typeof r === 'number' ? r : a;
}
);
};

Как это работает. Для примера берем следующие данные:

var data = { url: '/test/', thumb_src: 'test.gif', thumb_width: 60, thumb_height: 30, caption: 'Трам-парам!' };

И используя функцию supplant, вставляем их в заранее подготовленный шаблон:

var template = '<div class="preview"> <p class="image"><a href="{url}"><img src="{thumb_src}" width="{thumb_width}" height="{thumb_height}"/></a></p><p class="caption">{caption}</p></div>';
var result = template.supplant(data);

Это определенно наиболее изящное решение, в отличие от варианта, когда приходится вручную создавать элементы (createElement) и аппендить их (appendChild) в DOM.

 

Q: Можно ли, не залезая в дебри APIвызовов, отслеживать изменения в файловой системе и в зависимости от этого выполнять определенные действия?

A: Конечно, можно, и особенно изящно, если в системе есть PowerShell (по умолчанию входит в Windows 7 и Windows Server 2008 R2). Делается это так:

1.Создаем новый объект System.IO.FileSystemWatcher и задаем для него несколько настроек:

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $searchPath
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true

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

2.Теперь определим несколько событий, которые будут отслеживаться, когда $watcher заметил изменения в файловой системе. Простой обработчик при обнаружении изменения файлов будет выглядеть так:

$changed = Register-ObjectEvent
$watcher "Changed" -Action {
write-host "Changed: $($eventArgs.FullPath)"}

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

3.Установленные события будут отлавливаться до тех пор, пока не завершится Powershellсессия, но их можно «выгрузить» принудительно:

Unregister-Event $changed.Id

Кстати, даже если ты ничего не знаешь об этой PowerShell, то разобраться с ней не составит большого труда. Рекомендую PowerGUI (www.powergui.org) в качестве среды разработки, чтобы скрипты писать стало еще веселее.

 

Q: Каким образом можно сделать полный дамп памяти приложения? Только пойми меня правильно: не PE-дамп, а именно дамп всего адресного пространства приложения? Есть несколько процессов, в которых крайне интересно покопаться :).

A:Подходящих утилит немного. Одна из них — Process Memory Dumper (evilfingers.com/tools//ProcessMemoryDumper.php), которая в кругу компьютерных криминалистов чаще называется PMD. Это GUI-приложение, в котором ты можешь выбрать нужный процесс и получить для него DumpedProcess.dmp, в котором будет помещен дамп его адресного пространства.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии