Использование локального принтера в сеансе удалённого доступа — RDP printer redirection/mapping

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


  1. Разрешить подключение локальных принтеров в удалённом сеансе:


  2. После подключения необходимо установить драйвер принтера (такой же, как вы используете локально). На примере Samsung SCX-4216F:

    Скачать и установить

    Принтер скорее всего появится в списке. УДАЛЯЕМ ЕГО.

    Удостоверяемся, что необходимый драйвер остался задействован. Файл → Свойства сервера → Драйверы:

    Отключаемся от RDP и подключаемся снова — локальный принтер должен появиться при подключении

Use cases:


  • Терминальный сервер 1С: печать на принтер, который стоит рядом

  • Терминальный сервер «…»: печать на принтер, который стоит рядом


Восстановление писем из архива Kerio Mail/Connect — вытащить иголку из стога

В один прекрасный день, у одной прекрасной дамочки пропали письма в Outlook'е, да при этом аж за три месяца. Очень странным это может показаться, но .pst и не такое умеет.

В качестве сервера почты работает Kerio Connect 7.0.1 build 1249. Включены бэкапы, но работают они не так, как хотелось бы — делается копия текущего состояния ящика (а у пользователей, конечно же, стоит удаление писем с сервера).

К счастью, когда-то давно мной была выставлена спасительная галочка в настройках — «сохранять архив сообщений», благодаря которой Kerio любезно складывал всю почту (почта raw — там и спам, при желании можно заставить kerio и вирусы туда класть) за последние полгода в архив. Вздохнули с облегчением.

Структура архива Kerio Connect/Mail

А структуры нет. Ну, я конечно же преувеличиваю.. Но она ужасна.
Архив делится на папки по месяцам. И все, чёрт побери, все письма за этот месяц лежат в одной папке. В моём случае писем было ≈15 тысяч. Что может быть проще — разделить почту на папки на уровне почтового сервера, выделив почтовые адреса как сущности.

Разделить архив по получателям

Ну, это было первой идеей. Позже руки опустились, к сожалению. Поскольку писем много, а нам нужен только один получатель — пойдём «лоб в лоб»: возьмём плохой и ужасный php, чудесный и прекрасный Notepad++, такой розовый и блондинистый Denwer.. В общем, как обычно.

Спасительный говнокод.

  1. <?php
  2.    foreach( new DirectoryIterator( '.' ) as $file ) {
  3.       if ( $file->isDot() || $file->isDir() || $file->getFilename == __FILE__ ) {
  4.          continue;
  5.       }
  6.       
  7.       $name = $file->getFilename();
  8.       $file = file_get_contents( './' . $name );
  9.       if ( preg_match( '/(whatShouldWeFind@domain.(ru|com))/', $file ) ) {
  10.          rename( './' . $name, '../#saved/' . $name );
  11.          echo "moved " . $name . PHP_EOL;
  12.       }
  13.       
  14.       echo "skipped " . $name . PHP_EOL;
  15.    }
Ах да — мне было лень, создайте сами папку #saved рядом с #messages. Скрипт класть в папку #messages. Запускать как-то так: cd dirWithArchive/2011-Jan/#msgs && /usr/local/php5/php script.php. В 9-й строке меняется необходимый получатель.

Подведём итог

Скрипт ужасен. Скрипт работает. Разработчики Kerio в очередной раз доказали, что продукт хорош до тех пор, пока его используют стандартно — поставили, взломали через ukaip86.exe, настроили и забыли.
Спасибо за внимание.

reset.css — так ли всё хорошо?

Наткнулся на необычный и интересный баг — <b> и <strong> не делают текст полужирным, если использовать reset.css от Eric A. and Kathryn S. Meyer:

Решение: закомментировать 23-ю строку в reset.css (font: inherit;). Пользуйтесь.

Интересное поведение Google Chrome

Наткнулся на удивительное: мало того, что Chrome кастомизирует страницу с ошибкой, так ещё и докладывает, что я не один не могу открыть сайт. Приятно.

jQuery.mousewheel: обработка событий колеса мыши

В данной статье мы будем пользоваться jquery.mousewheel.

Для того, чтобы обработать событие скролла, необходимо повесить listener на определённый элемент:
  1. $('#wrapper')
  2.    .mousewheel(function (event, delta) {
  3.       //code
  4.    })
  5. ;
Пример — как обработать скролл — делаем горизонтальную прокрутку блока при вращении колёсика мыши:
  1. $('#photo-wrapper')
  2.    .data('scrollLeft', -1) //для предотвращения блокировки вертикального скролла
  3.    .mousewheel(function (event, delta) {
  4.       if ( (!this.scrollLeft && delta > 0) || (this.scrollLeft == $(this).data('scrollLeft') && delta < 0) ) {
  5.          return true; //данный блок необходим для того, чтобы перестать блокировать вертикальный скролл, если горизонтальный закончился
  6.       }
  7.       
  8.       $(this).data('scrollLeft', this.scrollLeft); //сохраняем текущий скролл слева
  9.       
  10.       this.scrollLeft -= (delta * 300); //на сколько прокрутить блок? (размер скролла)
  11.       return false; //отключить вертикальный
  12.    })
  13. ;

jQuery's .animate вешает chrome/webkit на ≈10 секунд (загрузка процессора 100%)

Есть в одном проекте следующий код:
  1. $(t)
  2.    .css({'border': '9px solid #D9D9D9'})
  3.    .animate({'border': '9px solid #C62417'}, 'fast')
  4.    .animate({'border': '9px solid #D9D9D9'}, 'fast')
  5.    .animate({'border': '9px solid #C62417'}, 'fast')
  6.    .animate({'border': '9px solid #D9D9D9'}, 'fast')
  7. ;
И вешает он браузер (Google Chrome 11.0.696.28 beta) при вызове события.
В чём же проблема? Как выяснилось, проблема в том, что создаются несколько одинаковых анимаций последовательно.

Решение — заменить одинаковые цвета на практически не отличающиеся, но немного другие:
  1. $(t)
  2.    .css({'border': '9px solid #D9D9D9'})
  3.    .animate({'border': '9px solid #C62417'}, 'fast')
  4.    .animate({'border': '9px solid #D9D9D8'}, 'fast')
  5.    .animate({'border': '9px solid #C62418'}, 'fast')
  6.    .animate({'border': '9px solid #D9D9D9'}, 'fast')
  7. ;
Таким образом анимации становятся разными и проходят с загрузкой процессора ≈1%.

SSHFS — Альтернатива использованию SFTP/SSH клиентов

Больинство из нас работает с файлами сайта удалённо, через ftp или sftp/ssh. FTP жутко тормозной, в связи с чем я уже давно перешёл полностью на ssh (чего и вам советую).

Каким образом легко получить доступ к файлам, не используя sftp/ssh-клиент?

Есть такая чудо-штука, называемая fuse. На её основе можно делать файловые системы, которые находятся удалённо (например, smbfs). Так вот, существует sshfs, который позволяет примонтировать удалённый хост на локальный компьютер и работать с файлами так, будто они на вашем жёстком диске!

Debian-way howto:
  1. sudo apt-get install sshfs
  2. sudo mkdir /media/host-name
  3. sudo chown your-username /media/host-name
  4. sudo adduser your-username fuse
  5. sudo adduser your-username nogroup
  6. sudo gnome-session-save --logout
  7.  
  8. #after logout-login you can mount a host like this
  9. sshfs -o workaround=rename host-name.com:/working-dir/ /media/host-name
  10.  
  11. #and unmount a host like this
  12. fusermount -u /media/host-name

Как ещё упростить жизнь? :)

Я пользуюсь Убунтой, а в ней по умолчанию gedit. В настройках можно включить auto save, save backups, line numbers, auto indentation, right margin и плагин side pane, а также подсветку синтаксиса. Side pane позволяет по нажатию F9 открывать "проводник", в котором легко перейти в монтированную директорию и заняться работой.