суббота, 20 сентября 2008 г.

Запуск X приложений из крона

У начинающих линуксоидов, пытающихся запустить X приложения из крона, часто возникают сложности. Этих сложностей я насчитал 3 штуки, и сейчас мы их все разберём.

Но в начале хочу сказать, что все эти сложности могут проявляться и в других случаях - при попытках запустить графические приложения от root, поэтому для облегчения тестирования я буду использовать крышку ноутбука. Я буду ей махать, и при этом будет выполнятся скрипт /etc/acpi/default.sh. Точнее я буду просто давить маленькую кнопочку на ноутбуке, которая нажимается крышкой при закрытии. Эта кнопочка генерирует ACPI событие с группой "button" и событием "lid", по которому например можно гасить экран, или повергнуть систему в suspend. Причём скрипт запускается примерно в том-же окружении, что и cron-овские задачи, поэтому тестировать я буду здесь, а потом уже начисто проверять в cron. Намного проще нажать кнопку, чем ждать 1-2 минуты, не так ли?
Хотя, в системах , отличных от Gentoo, этот скриптик может оказаться в другом месте. Так что проверяйте всё сами - эксперимент, эксперимент и ещё раз эксперимент!

Итак, попробуем вывести на экран диалог с текстом. Для этого есть 2 программы:
1. xmessage - универсальная, не зависит от оконного менеджера, но не очень красивая.
Попробуйте запустить xmessage -center "Hello Sergey"
2. kdialog - в составе KDE
Пробуем так: kdialog --msgbox "Hello Sergey"

Я предпочитаю kdialog, как более симпатичный.
Пробуем использовать - вписываем вызов по событию lid:

lid)
kdialog --msgbox "Hello Sergey" > /err 2>&1
;;

не забываем перенаправить все сообщения в /err, чтоб было над чем подумать.

Давим кнопочку - ничего не происходит (и не удивительно, зачем бы я тогда тут распинался?). Читаем /err, и видим что-то подобное этому:

/etc/acpi/default.sh: line 31: kdialog: команда не найдена

Язык может быть и другим - зависит от настроек локали. Но, допустим вам не нравится русский, или вместо сообщения вы получили какие-то кракозябы? Это легко исправить:

lid)
export LC_ALL=C
export LANG=C
kdialog --msgbox "Hello Sergey" > /err 2>&1
;;

Теперь уже лучше:

/etc/acpi/default.sh: line 33: kdialog: command not found

Но почему происходит эта ошибка? Да потому что kdialog действительно not found - пути к ней не прописаны. Это можно исправить 2 способами - использовать полный путь, или модифицировать PATH
1.

lid)
export PATH=$PATH:/usr/kde/3.5/bin/
kdialog --msgbox "Hello Sergey" > /err 2>&1
;;

2. Прописать полный путь

lid)
/usr/kde/3.5/bin/kdialog --msgbox "Hello Sergey" > /err 2>&1
;;

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

Получаем вот что:

kdialog: cannot connect to X server

Бедняжка не может найти X сервер... Нужно ему помочь! Опять таки 2 способа указать сервер:
1. Указать из командной строки
kdialog --msgbox "Hello Sergey" -display :0
2. Задать переменную DISPLAY:
export DISPLAY=":0"
Второй способ мне кажется более удобным, так как не все программы поддерживают опцию -display

Пробуем:

lid)
export DISPLAY=":0"
/usr/kde/3.5/bin/kdialog --msgbox "Hello Sergey" > /err 2>&1
;;

И снова получаем получаем ошибку:

Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified

kdialog: cannot connect to X server :0

Сервер найден, но он нас не пускает - секьюрити, панимаиш...
И снова есть несколько путей(ну это же Линукс!):
1. Использовать программу xhost, которая просто разрешает коннектиться к серверу всем. Не очень безопасно, не так ли? Тем не менее его можно применять, например, если вы сидите дома и никого не боитесь (aka "я в домике").
'xhost +' разрешает всем коннектиться к серверу. Но, запускать эту программу надо не из скрипта! При запуске из скрипта у программы нет прав, чтоб изменять права, поэтому эту команду нужно впихнуть либо в автозагрузку X сервера, либо выполнить самому. Где находится эта автозагрузка, я без понятия, поэтому дальше этот способ рассматривать не будем.
2. Для авторизации клиентов используется файл указанный в переменной окружения XAUTHORITY. Если переменная не задана - используется файл $HOME/.Xauthority
Поэтому попробуем руту подсунуть файл авторизации пользователя:

lid)
export XAUTHORITY="/home/sazarkevich/.Xauthority"
export DISPLAY=":0"
/usr/kde/3.5/bin/kdialog --msgbox "Hello Sergey" > /err 2>&1
;;

И... Это работает!
3. Вариант похож на предыдущий, но просто в /root делаем ссылку на .Xauthority пользователя:
ln -s /home/sazarkevich/.Xauthority /root/.Xauthority
Клиент пытается авторизоваться на сервере, берёт файл авторизации $HOME/.Xauthority, а это оказывается файл уже авторизованного пользователя. Вуаля.
4. Последний вариант - запуск из под пользователя

lid)
export DISPLAY=":0"
su sazarkevich -c '/usr/kde/3.5/bin/kdialog --msgbox "Hello Sergey" > /tmp/err 2>&1'
;;

Заметьте, ошибки скидываем в /tmp/err, т.к. пользователь sazarkevich не имеет доступа к корневой директории!
При этом автоматически используется .Xauthority пользователя.

Конечно, это не вполне хорошее решение. Тут жёстко задан пользователь. Более того, вы всегда должны работать за сервером :0 - если вы запустите ещё один сервер, на него ничего выводится не будет.
Однако, если вы за компьютером работаете всегда под одним пользователем (не root, боже упаси), и не запускаете лишних X серверов, а это часто так и есть, то вариант вполне подходящий.

Теперь с учётом всех проблем пробуем запустить оповещение из cron-а:
1. Полный путь
2. задать DISPLAY
3. разрешить авторизацию

Если вы запускаете задачи крона пользователя (crontab -e -u sazarkevich), то 3-ий пункт не нужен - он автоматически выполняется по 4-ому методу.
Если почему-либо вы используете крон через root-а(crontab -e -u root), то 3-ий пункт необходим.

Вот примерно так:

SHELL=/bin/bash
DISPLAY=":0"
MAIL=sazarkevich
# Morning shotdown
0 9 * * * /usr/kde/3.5/bin/konsole -e /home/sazarkevich/bin/morning-poweroff.sh

Это у меня по утрам, в 9 часов, запускается консоль, в которой 60 секунд идёт обратный отсчёт. Если никто не позаботится нажать Ctrl+C во время обратного отсчёта - компьютер выключится. Если кто-то за ним в это время работает, то он может отменить выключение.

Вот так. Всё просто!

пятница, 19 сентября 2008 г.

Гимн ГАИ МВД Республики Беларусь

Я в общем-то не знал, что такое вообще существует. Гимн ГАИ... Они его что-ли с утра поют и перед дежурством?

Но не в этом дело. Хотят они себе гимн - их дело. Но такой гимн... Это сильно. Вот ссылка, скачать первый гимн. Кстати по стихам там никаких претензий, вся фишка в исполнении :)

Для тех, кто не станет качать, объясняю: гимн - чистый шансон. Единственно чего не хватает - это наблатыканой фени. А так - голос похож на Круга, так и ждёш

"Владимирский централ..."

;)

Полковник весь в делах.

Просадил сегодня 400 тысяч в казино под названием "бизнес по белоруски". Короче, я начинаю понимать, как это - вести бизнес в нашем хрустальном сосуде...

Но, по порядку.

Поехал сегодня утром узнать номера счетов, чтоб заплатить недобитков недоплаченные налоги. Перво-наперво зашёл в кабинет под загадочным названием "одно окно", но там видимо вообще ничего не делают, так как попросту переслали меня в другой кабинет. Оттуда отфутболили в третий, в котором, красящая ногти девушка, попросила обождать на коридоре. Погулял. Записал номера счетов со стенда и вернулся. Подошёл видимо как раз к моменту высыхания лака, ибо дальше меня приняли без проволочек, в спешном темпе - оказывается сразу после ногтей девушка спешит на совещание. Быстро выписала мне чего где нехватает, попутно выпытывая "ну признайтесь, вы же не платили" (а я не признавался), и убежала. Ну ладно, вроде всё что надо со мной, пора ехать в банк, где без меня скучает бухгалтер и платить по счетам.

По пути я заглянул в бумажку и занервничал: итого к уплате значилось 400 тысяч, а я с собой взял только 150 (до этого фигурировала цифра 100 и взял, так сказать, с запасом). А карточка у жены(ну вы же знаете этих жён...). Быстро звоню супруге, договариваюсь встретится и экспроприировать то что моё по праву - карточку, и продолжаю ехать в банк.

В банке бухгалтер смотрит на бумажку и грязно матерится(ну ладно, ладно... вздыхает). В бумажке говорится, что мы не уплатили подоходный налог за I квартал 2008 года. И это при том, что с 1 января 2008 мы этот налог не платим вообще - перешли на другую систему налогообложения. Бухгалтер звонит в налоговую и пытается узнать, откуда на нас свалилось это счастье? Оказывается, что в компьютер внесены данные, что мы подавали (а мы не подавали) какие-то акты о получении доходов и т.д., по которым нам начислен налог. Просим найти эти акты(а они должны храниться в налоговой) - их не могут найти. Актов нет, а цифры введены! Дурдом... Скорее всего данные просто ошибочно вбили, надо ехать ковырять этих горе налоговиков. Ладно, решили заплатить, а потом разбираться - главное чтоб банк видел меня всего в белом, и не крутил носом.

Зарегистрировали документы, и только собрались платить, как мне звонят из агентства, и сообщают, что БАНК ОДОБРИЛ КРЕДИТ. С одной стороны - ура, ура, ура, а с другой - а чего мы тут выёживаемся, платим не свои налоги? Но, платёжки-то зарегистрированы, надо платить, поэтому иду к банкомату... не работает. Иду в кассу - деньги с карточки можно снять только с 11.00. Капец какой-то. Ладно, тусуюсь полчаса, снимаю деньги и наконец оплачиваю то, что оплачивать и не стоило бы.

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

Короче, встал сегодня в 6 утра, на работу приехал к 12.00. 6 часов занимался не пойми чем - вёл бизнес... Зато наш, родной.

З.Ы. А квартиру мы наверное всё-таки купим :)

четверг, 18 сентября 2008 г.

Полковника завалили письмами

Вчера звонили из банка, чего-то уточняли.
Сегодня снова звонили с утра. Потом в обед позвонили, спросили телефон моей налоговой инспекции. А через пол часа позвонили и сказали, что у меня там с налогами не очень хорошо. Чего-то не заплачено :(

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

Короче, бухгалтер не знает, инспекция не сообщает, и тут в эту пакость наступает банк и видит меня, сплошь в догах и недоплатах.

Может получиться не смешно :(

среда, 17 сентября 2008 г.

Полковнику никто не пишет...

... и не звонит, и не телеграфирует.
Если предположить, что полковник - это я, то звонить должны были по поводу кредита ещё в понедельник, а то и в пятницу. Вчера позвонил сам - сказали, в банке какие-то технические неполадки, и как только так сразу и позвонят. Растёт опасение, что у них там сломался сервер гнилых отмазок, и кредит они хотят мне зарубить на корню. Это нехорошо...
С другой стороны понять их тоже можно: я же индивидуальный предприниматель, вещь в нашем государстве совершенно ненадёжная и эфемерная. Вот он есть, а вот его и нет - указом накрыло.

Вобщем, если откажут - переквалифицируюсь в управдомы.

четверг, 11 сентября 2008 г.

Кредит

Сдали в понедельник документы в Приорбанк для получения кредит на покупку квартиры.
Сидим, нервничаем - ждём результат, дадут ли? И если дадут, то сколько? Просили 48000 американских бабулек, но могут дать и меньше... А могут и вообще не дать. Обещали к концу недели или, в крайнем случае, в начале следующей огласить ответ.

Анкету заполнял пол дня. Куча вопросов и непонятных пунктов. А ещё добивают короткие места для ответов - под место работы жены отводится 10-15 клеточек. Ну и как вписать туда 'УЗ "Минская областная клиническая больница"'? Только по 3 буквы в клеточке, и то...

Вобщем, ждём-с...

понедельник, 1 сентября 2008 г.

Налоговая тоже шутит

Сегодня попёрся в налоговую, за справкой о доходах за последние 12 месяцев. Для банка. Кредит на квартиру значит взять хочу.
А в налоговую направился, потому что я индивидуальный предприниматель.
Всё бы ничего, но я туда вообще первый раз ехал - всё предыдущее время за меня отстреливалась бухгалтер. Я собственно вообще не в курсе чего там и как, я тока программировать обучен. Но, надо. Еду.

Ну, приехал, залез в одно окошко - послали. Пошёл в посланное - перенаправили к "своему" налоговому инспектору. А я знаю, кто он? Вообще, в первый раз слышу, что мне положен какой-то там "мой" инспектор. Стою, нервно дышу чистым воздухом(не курю потому что). Ну, думаю, капец: я зайду, и спрошу "а кто тут мой инспектор?". Как они должно быть удивятся. Занимаюсь, мол, коммерцией 3 года, а до сих пор с инспектором не познакомился. Ой, думаю, стыдно то как...

Ну ладно. Узнал я таки своего "шефа" - там на одном из стендиков, которые я изучал в тоске, было распределение инспекторов по районам. Мой значит - Иванов И.И. (фамилия изменена из соображений), и сидит он в 105 кабинете. Ладно, заходим в этот кабинетик и видим какую-то одинокую девушку, пьющую чай. На Иванова никак не тянет, поэтому я и спрашиваю(далее идёт реконструкция диалога):
- Э... Извините, а где я могу найти Иванова И.И. - спрашиваю я взволнованно
- А он тут не работает. Он в главной налоговой. - уверенно отвечает девушка.
- Э... Извините.... Э... - тут я понимаю, что лоханулся, и приехал наверное вообще не туда. Но адреса у меня нет, и поэтому я спрашиваю смущаясь: - а... адрес какой?
- Вообще-то я пошутила. - отвечает девушка с абсолютной выдержкой и серьёзнейшим лицом.

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

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

Да-с...

воскресенье, 31 августа 2008 г.

Принимаю поздравления и подарки

Я таки вчера женился...Принимаются поздравления (и соболезнования, если кто сочтёт нужным :)

Вообще, роспись планировалась на 19 сентября, без пышных торжеств, но с маленьким и уютным свадебным путешествием в Турцию/Египет. Однако как-то летом мы как-то случайно увидели рекламу о продаже новостроек в Боровлянах (8 км от Минска). Покрутили, повертели и оказалось, что в принципе мы можем купить квартиру. Разумеется путешествие при этом откладывается, но в замен мы получаем не менее уютную (и маленькую) квартиру.
После того, как мы определились, что в Египет не поедем, мы решили перенести заявление с 19 на 12 сентября и одновременно с этим отмазались от остатков торжеств - уговорили родителей, что расписываться будем совсем одни.
А недавно, мы заключили договор с риэлторским агентством, о покупке квартиры, и выяснилось, что для взятия кредита нам надо быть мужем и женой как можно быстрее. И мы направили свои ноги в ЗАГС что-бы в очередной раз перенесли роспись.
30 августа нас расписали. Как ни странно в торжественной обстановке :) При этом присутствовали 3 человека - мы и расписывающая нас сотрудница. Причём она не смогла превозмочь привычку и то отправляла нас на ручник (которого разумеется не было), то пыталась подозвать свидетелей (которые как оказалось и вовсе не обязательны - просто традиция).

Ну а вечером мы таки решили устроить небольшую попойку с моим другом и его женой - подругой моей жены (это мы типа дружим семьями ;) Поэтому мне сегодня не очень хорошо :)

четверг, 21 августа 2008 г.

Обрабатываем фотографии для блога

Последние 2 поста были прямо таки нашпигованы фотографиями. Разумеется, все они прошли некоторый осмотр и обработку:
1. Коррекция уровней
2. Кроп
3. Увеличение резкости
4. Изменение размера до 33%
5. Уменьшение качества до 80-85%
Последние 2 пункта нужны, чтоб не выкладывать 2-х мегабайтные файлы на блог. Кому они нужны, это же не "шыдевры"? После такой обработки фотографии весят около 200 кБ, что вполне приемлимо.
Первые 3 пункта разумеется нужно делать руками под неусыпным контролем, но вот последние 2... Их просто таки необходимо автоматизировать. Чем? Да вот хотябы imagemagick.
Вобщем, всё просто - будем использовать программу convert или modrify. Первая записывает результат в новый файл, а вторая меняет поданный на вход файл, что удобно и страшно.
Отконвертировать все jpg:
for i in *.jpg; do modrigfy -resize 33% -quality 85% $i; done

или, что боле безопасно
for i in *.jpg; do convert -resize 33% -quality 85% $i new-$i; done


Разумеется под виндой тоже можно такое написать, но там какой-то нечеловеческий язык BAT файлов... Тамошний FOR долго меня истязал перед тем, как заработать...

среда, 20 августа 2008 г.

В поисках голубых озёр. День 2

Представляю карту блужданий второго дня.

Как можно заметить путь с права несколько гм... запутан, и это не спроста. Дело в том, что мы позорно заблудились. Но, по порядку.
Во второй день было решено начать объезд озёр с Малого и Большого Болтиков. На малом мы уже бывали в детстве в целях купания, поэтому никаких проблем с его нахождением не должно было быть. Как обычно мы свернули возле д. Яцыны и стали искать поворот на Малый Болтик, который как мы знали там обязан быть. Через 2 километра мы решили, что проедем ещё пару и вернёмся назад. Но через 2 км возникла ещё одна дорога, которая вела на лево. Справедливо рассудив, что чем левее тем ближе к Болтику мы свернули. Такие дороги, которые вели всё левее и левее возникали довольно таки регулярно, но никакого Болтика и в помине не было.
Через некоторое время очередная дорога окончилась вырубкой.

Искать продолжение дороги на противоположном берегу вырубки было признано нецелесообразным, ибо похоже дорога именно сюда и вела. Во время пребывания на вырубке был замечен примечательный эффект - круговая радуга. К сожалению, вся целиком она никак не влазила, поэтому она "почти круговая".
После осмотра радуги и обсуждения, было решено отправиться совсем уж неприметной по дороге (а если быть точным то противопожарной полосе), которая вела левее вырубки, к неуловимому Болтику. Разумеется вскоре она сошла на нет и превратилась в лес.
Решительно откатив наш путь к последней хорошей дороге, мы поехали по ней, желая выехать хоть куда-нибудь. И наконец выехали. Куда-то.

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

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

Нехилые домики строят в этой деревне....
Затем мы стали ориентироваться снова и искать дорогу на Войшкуны. При этом сориентировали всё задом наперёд и поехали в обратном направлении.
Наконец мы выехали на мост, если это можно так назвать.

Ещё покатавшись по горным тропинкам мы стали подозревать неладное, и тут вскрылись и странности компаса, и реальное расположение сторон света на карте.
Наконец-то всё встало на свои места, и мы покатили в Войшкуны, откуда подъехали к восточному берегу оз. Балдук

Так-же была встречена местная аборигенка в "зачотном" состоянии. Жаль переодеваться ушла в кусты...


Чуть далее от Болдука было обнаружено оз. Болдучица, где я тут-же намочил ноги, пытаясь запечатлесь всё и вся.


Ещё немного покатавшись по местным дорогам, мы выехали небольшое на оз. Амшарец. Типичное болотистое озерцо. Кстати на одной из фоток были люди, которых я нещадно выфотошопил :)


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

Тут-же мы решили устроить обеденный перерыв. На фоне видны мои кроссовки, которые я просушиваю после Болдучицы :)


После обеда мы направились к озеру Карасик. Ничем не примечательное озеро, разве что находится совсем рядом с деревней Болдук.


Затем мы снова вернулись к озеру Болдук, которое, говорят, сплошь состоит из родников. В одном из таких мы и пополнили наши запасы воды. Специально для коленей.


Следующее, ничем не примечательное озеро - Окунёк. Похоже на Амшарец и Мёртвое(найденное в первый день)


Дальше мы проехались по ещё одному признаку цивилизации - по мосту. Мост вполне себе рабочий - по нему ездят... Я тоже проехал :)


И снова клон Амшарца. ИМХО Бог когда создавал эти озёра излишне налегал на инструмент Stamp!
Озеро Глухое:


Всё, почти закончили! Остались неуловимые Болтики. Снова вернувшись на исходную - д. Яцины мы попыталиь найти Малый Болтик. В этот раз навигационная удача улыбнулась нам! Озеро было найдено и отфотосессено.

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

Вода на этом озере как "кока-кола" - прозрачная и немного красно-коричневая.

Оставалось одно озеро. Неуловимый Большой Болтик. Мы снова вернулись к д. Яцыны, на исходную так сказать, и выехали.
Через некоторое время мы услышали шум, гам и прочие сопутствующие звуки отдыхающих. Отдыхающих было много - оказывается там устроено что-то вроде кемпинга. Сам кемпинг я снимать не стал - чего там интересного? Место, кстати, называется Мельница. Очевидно, тут когда-то была мельница.

Кстати, там даже есть баня!

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

Но я отвлёкся. Большой Болтик. Это уже стало навязчивой идеей. Он был где-то близко и в тоже время нигде его не было.
Дорога превратилась в чёрт знает что. Фотки, как я уже сказал не супер, но общее представление дают.
Вот тут мы "ехали"


И наконец... А!!! Мы увидели его. Большой Болтик, первый вид:


Затем я нашёл полулежащее дерево, и попытался на него залезть, с риском для здоровья, как минимум :)


На а через 20 метров оказалось что на дерево я лез совершенно зря :)

Как вы догадываетесь, на последней фотографии слева с верху виден кусок той самой берёзы на которую я залазил :)
Домой от Большого Болтика ехали с "комфортом" - по противопожарной полосе. Другой дороги к нему видимо нет...

Тут и сказке конец, а кто читал - холодец.