27 дек. 2012 г.

Adobe reader bookmarks

Выяснилось, что Adobe Reader, который должен быть во всех смыслах канонической читалкой PDF-документов, не умеет такой, казалось бы, привычной и естественной функции как закладки. И если при периодических открываниях рекламных проспектов это не столь необходимо, то при чтени многостраничной документации - просто must have.
Если сменить читалку по какой-либо причине не хочется или не можется, а помнить, что и где читал в последний раз не получается, то вот этот ресурс рекомендует следующее. 
Во-первых, можно включить опцию запоминания состояния открытого документа: Редактирование - Установки - Документы - Восстанавливать при открытии документов прежние параметры просмотра.
Во-вторых, можно подключить специальный JS-апплет, реализующий недостающий "закладочный" функционал. Брать здесь, класть сюда: %Adobe Reader Homedir%\Reader\Javascripts\ , в настройках включать поддержку JS так: Редактирование - Установки - JavaScript - Активировать Acrobat JavaScript, там же Активировать пункты меню по полномочиям на исполнение сценария JavaScript. После перезапуска приложения в меню Просмотр должны появиться пункты для работы с закладками.

20 дек. 2012 г.

Windows API: Обход ограничения на максимальную длину пути.

Есть категория людей, идущих столь далеко по пути каталогизации и упорядочивания своих файлов, что рано или поздно сталкивается с ошибкой при создании очередной папочки (или длинно-описательного имени файла) вида "Имя файла (папки) слишком длинно, укоротите или создайте в другом месте". По этому поводу нашлась хорошая статья на MSDN.
Если вкратце, то да, существует в WinAPI ограничение на максимальную длину пути MAX_PATH, равная 260 символам. Обойти его можно, обращаясь к файлам/папкам через префикс \\?\ (максимальная длина пути в таком случае - 32 767 символов). То есть, например,
mkdir "\\?\C:\very-very-very\long-long\path\filename.ext"
Создать такое прводоником у меня не получилось (может, плохо пытался), однако внутри созданной из командной строки папки новые подпапки создаются проводником без вопросов.

28 нояб. 2012 г.

VMWare vCenter Backup

Так как для полноценной работы vCenter-а требуется отдельный сервер (в идеале не виртуализированный им же), то имеется дополнительная точка отказа, которую следует забэкапить. 
Все необходимые для развертывания в другом месте данные хранятся в MSSQL-ной базе. Однако для того, чтобы новоявленный vCenter смог собрать обратно "под себя" ESXi-хосты и виртуалки на них, нужен еще набор SSL-сертификатов, которыми сервера обмениваются при начальной настройке. Лежат они тут:
  • Windows 2003: %ALLUSERSPROFILE%\Application Data\VMware\VMware VirtualCenter
  • Windows 2008: %ALLUSERSPROFILE%\VMWare\VMware VirtualCenter
Подробности можно уточнить в базе знаний VMWare.

26 нояб. 2012 г.

Flash player download link

Всем, кого не устраивает текущая модель распространения Adobe Flash Player (да, зло, но зло иногда необходимое, а обновлять это решето надо), этот пост есть. Это ссылка на текущую версию Flash player-а, по ней загружается полный дистрибутив (15+ MB), а не инсталлер. Для IE отдельная ссылочка.

15 нояб. 2012 г.

vSphere volume increasing

Скатился от поста в день до поста в месяц...

Памятка: в VMWare vSphere в любой виртуалке в выключенном состоянии и, при установленных vmware-tools, во включенном можно увеличивать размер виртуального жесткого диска (если, конечно, гостевая файловая система в состоянии это изменение корректно обработать). Однако, если к ВМ применен снапшот, проводить любые изменения образов не позволяется. Решение - удалить/применить снапшоты.

26 окт. 2012 г.

Oracle Linux + vmware-tools

Пришлось тут Oracle Linux 6.3 в ESXi устанавливать. Споткнулся на установке vmware-tools. К сожалению, аналогичного дебиановскому build-essential мета-пакета для установки средств разработки я не нашел, поэтому пришлось всё необходимое для первичной компиляции vmware-tools искать по крупицам. В итоге, прежде чем запускать vmware-config-tools.pl следует установить:
yum install fuse make gcc binutils kernel-uek-devel-`uname -r` kernel-uek-headers-`uname -r`
 Конфигурационный скрипт должен в итоге сам определить, где находится gcc и linux-headers.

16 авг. 2012 г.

SketchUp OpenGL Error

Очередная короткая заметка, на этот раз о Google SketchUp. На свежей (12.04) Xubuntu эта софтина была установлена в wine и отлично полдня отработала. Однако после ребута запускаться отказалась с ошибкой вида Error: ChoosePixeFormat failed и невозможностью инициализации OpenGL.
Беглые раскопки в интернетах показали, что баг известен и решается изменением одного параметра в реестре, а именно 
HKEY_CURRENT_USER\Software\Google\SketchUp6\GLConf ig\Display\HW_OK
Его нужно выставить в "1".
После этого SketchUp отлично запускается.

24 июл. 2012 г.

Перевод регистра

Чтобы не забыть, простенькое заклинание на sed для смены регистра:
Большой в маленький:
's/[[:upper:]]/\l&/g'
Маленький в большой:
's/[[:lower:]]/\u&/g'
Употребить можно, к примеру, так:
echo $BIG_WORD | sed -e 's/[[:upper:]]/\l&/g'

27 июн. 2012 г.

net view + Системная ошибка 58

Пусть кто-то сэкономит ту пару рабочих часов, которые я просидел над поисками решения следующей проблемы:  после того, как "ничего не делали"(с) с рабочей станции (Windows XP)  перестало пускать на сетевые ресурсы сервера (Debian + Samba) с ошибкой вида "Возможно, у вас нет прав на использование этого сетевого ресурса", если используется проводник, и "системной ошибкой 58" при попытке сунуться через консоль (net view). Естественно, никаких настроек на стороне сервера и клиента не изменялось. И, конечно же, всё, что только можно, было проверено, перезапущено, перенастроено и перезагружено. 
Корень зла - в обновлении KB2536276, одно из действий которого - запрет на использование нешифрованных паролей. По ссылке выше описываются и возможные проблемы, возникающие после установки этого обновления, а также методы их решения или обхода. Если вкратце, то можно:
  • поправить ключ EnablePlainTextPassword в ветке HKEY_LOCAL_MACHINE\System\CurrentControlSet\services\LanmanWorkstation\Parameters, выставив значение "0";
  • поправить конфиг samba на linux-сервере (/etc/samba/smb.conf), добавив опцию encrypt passwords = yes;
  • удалить это обновление с помощью мастера установки и удаления программ.
З. Ы. Решение первоначально было найдено тут, за что автору большое спасибо.

20 июн. 2012 г.

parted + 4k кластер

Оставлю краткую заметку по выравниванию раздела по 4k кластеру в parted:

# parted /dev/sda

mkabel msdos # создание таблицы разделов
unit s
mkpart primary 64 -1 # Если разделов несколько, то каждый должен начинаться с номера, кратного 8-и
ignore? y
set 1 raid on #метим для последующей сборки в md-raid
quit

9 июн. 2012 г.

Adaptec ServerRAID 7k + Linux control

RAID-контроллер - штука хорошая и достаточно самостоятельная, однако иметь за ним пригляд в системе мониторинга все же стоит. Для получения статуса самого контроллера, логического диска (RAID-массива), а также входящих в его состав физических дисков, используется ряд утилит, отдельных для различных производителей RAID-контроллеров: aacraid, arcconf, mpt-status, megaraid-status, hpacucli и так далее. 
Сегодня речь пойдет о контроллере, установленном в сервере IBM eServer 346, который в Debian определяется как:
lspci | grep RAID
08:0e.0 RAID bus controller: Adaptec ServeRAID Controller (rev 07)
Linux работает с ним через модуль ядра ips. Знакомые мне до сего момента утилиты для работы с контроллерами от Adaptec эту железку видеть отказывались.
В итоге выяснилось, что для этой серии RAID-контроллеров (Adaptec ServerRAID 7k) имеется отдельная утилитка - ipssend, взять которую можно отсюда или с CD, поставляемого IBM вместе с контроллером.
Синтаксис у нее аналогичен знакомому arcconf:
ipssend GETCONFIG 1 | less
Found 1 IBM ServeRAID controller(s).
Read configuration has been initiated for controller 1...
Например, статус RAID-массива можно получить так:
 ipssend GETCONFIG 1| grep "Status of logical drive" | awk {'print $6'}
 Okay
P. S.: Достаточно хорошая страница с информацией о многих RAID-контроллерах в Debian.

29 мая 2012 г.

Windows 98 + CUPS IPP

Случается, что до сих пор можно встретить компы с win98 на борту. Причины разные: где-то железо тех же лет исправно работает, а обновляться дорого\не хочется\не нужно, где-то софт стоит специфический, где-то еще что-то. Так или иначе, но приходится работать с тем, что есть. У многих современных принтеров драйверов под эту ОС уже нет, поэтому организовать печать становится проблематично. Однако в таких случаях выручает возможность печатать с неким "generic" драйвером по http/ipp на CUPS. 
Другое дело, что  win98 из коробки не умеет отсылать задания на печать по этому протоколу. Чтобы научить ее этому, нужно установить дополнение WPNPINS.EXE. После этого необходимо перезагрузиться. Далее можно добавить принтер с адресом http://servername:631/printers/printername и generic-драйвером.

11 мая 2012 г.

CUPS + Error 400 Bad request

В свежих редакциях CUPS (1.4.x и выше) стал проявляться такой баг: при заходе по адресу https://hostname:631 выдается ошибка
400 Неверный запрос
400 Bad request
В error.log это выглядит как:
Request from "localhost" using invalid Host: field "hostname:631"
Обращение к IP-адресу проходит успешно. Для решения проблемы нужно в cupsd.conf добавить директиву ServerAlias, в качестве параметра указать нужный hostname или "*"
 ServerAlias example.org
 ServerAlias *

28 мар. 2012 г.

openfire + openjdk

Один раз сделал, забыл. Чтобы в третий раз снова не искать решение, оставлю здесь.
Openfire из коробки не умеет работать с openjdk (который сейчас по умолчанию в дебианах-убунтах ввиду смены лицензионной политики относительно jre товарищей из Oracle). Для того, чтобы научить jabber-сервер запускаться в среде openjdk, меняем в /etc/init.d/openfire вот это:

if [ -z $JAVA_HOME ]
then
        t=/usr/lib/jvm/java-1.5.0-sun && test -d $t && JAVA_HOME=$t
        t=/usr/lib/jvm/java-6-sun && test -d $t && JAVA_HOME=$t
fi
на это:
 if [ -z $JAVA_HOME ]
then
        t=/usr/lib/jvm/java-1.5.0-sun && test -d $t && JAVA_HOME=$t
        t=/usr/lib/jvm/java-6-sun && test -d $t && JAVA_HOME=$t
        t=/usr/lib/jvm/java-6-openjdk && test -d $t && JAVA_HOME=$t
fi
Всё.

15 мар. 2012 г.

Xerox WorkCentre 4118 + печать из CUPS

Внезапно словился инопланетный баг. Почти как этот. При печати на расшаренный с winxp принтер Xerox WorkCentre 4118 любой информации через CUPS железка, подумав, выдавала с десяток страниц "посланий с Марса". Так как с самой винды, да и с других тоже, задания уходили и печататались нормально, то источником проблемы был объявлен PostScript-драйвер под linux для данного принтера. Обновление оного и прочие шаманства с настройками результата не дали. Не-PS драйвера никто под этот принтер не предлагает. Решение было найдено здесь. Если кратко - меняем в CUPS-е драйвер на SamsungML-7050. И все.

13 мар. 2012 г.

Удаленный запуск pg_dump

Оставлю себе краткую памятку, как организовать утаскивание дампа PostgreSQL-ной базы на удаленную машину.
  • на сервере с БД правим pg_hba.conf (обычно в /var/lib/pgsql/data/), добавляя строчку вида
 host    all        all    ts    md5
Иными словами, разрешаем подключения с указанного хоста ts с md5-авторизацией.
  • Если ходить будем пользователем postgres, то нужно задать ему пароль. 
root@pg:/var/lib/pgsql# su - postgres
postgres@pg:~$ psql
postgres=# ALTER USER postgres WITH PASSWORD 'mypass';
В противном случае создаем пользователя (интерактивная команда createuser от имени postgres).
  • Перезапускаем сервер БД
root@pg:/var/lib/pgsql# /etc/init.d/postgresql restart
  •  На удаленной машине устанавливаем клиентскую часть (для того, чтобы был доступен pg_dump)
 root@spl-ts:/# aptitude install postgresql-client
  •  в домашнем каталоге пользователя, от имени которого будет запускаться pg_dump, создаем файлик с правами 0600 следующего содержания
echo "pg:5432:*:postgres:mypass" > /home/keeper/.pgpass
chown keeper:keeper /home/keeper/.pgpass
chmod 0600  /home/keeper/.pgpass
  • Проверяем правильность настроек
keeper@ts:~$ psql -U postgres -h pg -w
psql (9.0.6, server 9.0.4-alt1)
Type "help" for help.

postgres=#

22 февр. 2012 г.

Mediawiki-1.18 Upload Error

После обновления движка локальной корпоративной wiki (до mediawiki-1.18) словил пренеприятный баг: попытка загрузить в систему файл приводила к MediaWiki internal error. Более подробная отладка ($wgShowExceptionDetails = true; в LocalSettings.php) выявила следующее:
 Warning: pg_query() [function.pg-query]: Query failed: ERROR: syntax error at or near ")" LINE 1: ...ploadStash::stashFile Delayer */ FROM "uploadstash" WHERE ) ^ in /srv/www/wiki/includes/db/DatabasePostgres.php on line 253
Warning: pg_query() [function.pg-query]: Query failed: ERROR: current transaction is aborted, commands ignored until end of transaction block in /srv/www/wiki/includes/db/DatabasePostgres.php on line 253
Original exception: exception 'DBQueryError' with message 'A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: http://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script
Query: DELETE FROM "uploadstash" WHERE )
Function: UploadStash::stashFile
Error: 1 ERROR: syntax error at or near ")"
LINE 1: ...ploadStash::stashFile Delayer */ FROM "uploadstash" WHERE )
^
' in /srv/www/wiki/includes/db/Database.php:860
 Поиски решения привели на багзиллу проекта с обсуждением подобной ошибки. Выяснилось, что проблема известна, подтверждена и над ее решением ведется работа. На момент написания этого поста имеется возможное решение, которое заключается в легкой правке строчки #296 файла includes/upload/UploadStash.php (относительно корневого каталога вашей mediawiki): строчку
'us_key', 
следует заменить на 
array( 'us_key' ),
В моем случае это решение сработало.

Многопальцевые щелчки в synaptics-vased тачпадах.

Если у вас есть ноут с тачпадом, поддерживающим мультитач, то достаточно удобным, на мой взгляд, дополнением к two-fingers scrolling (включать который по умолчанию умеют уже многие дистрибутивы) является возможность эмуляции правого и среднего клика. К примеру, тап двумя пальцами эмулирует нажатие правой кнопки мыши, а тап тремя пальцами - средней. Сделать это просто ибо все уже украдено до нас (с). Создаем в директории с конфигурационными файлами  X.org-а (или берем готовый, если имеется, 50-synaptics.conf) файлик следующего содержания:
Section "InputClass"
        Identifier "touchpad catchall"
        Driver "synaptics"
        MatchIsTouchpad "on"
        MatchDevicePath "/dev/input/event*"
        Option    "HorizScrollDelta"    "0"
        Option "TapButton1" "1"
        Option "TapButton2" "2"
        Option "TapButton3" "3"
EndSection
Собственно, все. После перезапуска Х-сервера настройки должны подхватиться. Вообще, драйвер x11-input-synaptics умеет достаточно много чего, и все его возможности включаются и настраиваются подобным образом - через Option в Section "InputClass". Достаточно подробное описание доступных опций имеется, конечно же, в man synaptics.

З.Ы.: В принципе, никто не отменял возможность вышеперечисленные правки внести и прямо в xorg.conf, однако в современных дистрибутивах его зачастую днем с огнем не сыщешь - конфигурация собирается динамически с использованием конфигурационных каталогов /usr/share/X11/xorg.conf.d/ (по-поему, есть везде), /etc/X11/xorg.conf.d/ (такой есть в OpenSuSE), а может и еще где-то; для конкретного дистрибутива можно уточнить расположение этих каталогов в man xorg.conf.d .

18 янв. 2012 г.

Disable shutdown via ConsoleKit/PolicyKit

При свежей установке терминального сервера (Debian + LXDE + NX) случился пренеприятный косяк - приходящий в терминальный сеанс пользователь внезапно получал возможность остановить и перезагрузить сервер. При этом ни в группе powerdev, ни в sudoers, ни еще где-то записей об этом пользователе не было. Более того, из эмулятора терминала внутри nx-сессии также было невозможно сделать poweroff или reboot. 
Раз проблема проявляется только при взаимодействии с окружением рабочего стола, пришлось покопаться в PolicyKit. Однако, так как опыта тонкой настройки этого сервиса у меня нет, то я решил ограничиться следующим workaround-ом: в файле /etc/dbus-1/system.d/ConsoleKit.conf находим следующие строки:

    <allow send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.ConsoleKit.Manager"/>
    <allow send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.ConsoleKit.Seat"/>
    <allow send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.ConsoleKit.Session"/>
    <allow send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.DBus.Properties" />
    <allow send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="Restart"/>
    <allow send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="CanRestart"/>
    <allow send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="Stop"/>
    <allow send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="CanStop"/>

и меняем на

<deny send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.ConsoleKit.Manager"/>
    <deny send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.ConsoleKit.Seat"/>
    <deny send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.ConsoleKit.Session"/>
    <deny send_destination="org.freedesktop.ConsoleKit"
          send_interface="org.freedesktop.DBus.Properties" />
    <deny send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="Restart"/>
    <deny send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="CanRestart"/>
    <deny send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="Stop"/>
    <deny send_destination="org.freedesktop.ConsoleKit"
           send_interface="org.freedesktop.ConsoleKit.Manager"
           send_member="CanStop"/>


Таким образом все, кто входит в политику default (а это вообще все, ага ;) ), получают запрет на выполнение команд по выключению, перезагрузке, переходу в спящий режим и так далее. Конечно, главным недостатком этого "костыля" является то, что даже локальная X-сессия будет аналогично ограничена в возможности выключить компьютер. Но мы говорим о терминальном сервере, поэтому это некритично.

10 янв. 2012 г.

server system info

Жутко полезная статейка об утилите, позволяющей узнать информацию о внутренностях серверов. Информативность вывода напрямую зависит от того, насколько разговорчив BIOS конкретной материнской платы. Например, HP-шные серверы могут рассказать даже о своих partnumber-ах.

Firefox & JRE from tarballs

Запишу, дабы не забыть, рецепт добавления поддержки Java в Firefox в случае, если и то и другое ставится в систему ручками (распаковкой tarball-ов). Идеологически от способа установки ничего не меняется - Firefox-у достаточно указать местонахождение библиотеки, через которую он с имеющейся в системе java-машиной общается. Интересно то, что сегодня (Firefox 9.0.1, jre-1.6.0_30) java-машина в "Дополнениях" появляется при добавлении библиотеки libnpjp2.so вместо привычной libjavaplugin_oji.so. Таким образом, порядок действий такой:
  • качаем Firefox (9.0.1)
  • качаем jre (6u30)
  • распаковываем то и другое в /opt/
  • создаем директорию /opt/firefox/plugins
  • создаем симлинк: ln -s /opt/jre1.6.0_30/lib/i386/libnpjp2.so /opt/firefox/plugins/
Profit.
Если всем пользователям браузера не нужно давать возможность пользования java-плагином, правильнее положить ссылку в ~/.mozilla/plugins/