четверг, 24 июля 2008 г.

locate для Windows

В Lunux есть замечательная утилита - locate, которая ищет файлы и директории по именам. Причём, список файлов и директорий она берёт из своей базы, которая иногда обновляется. Конечно, файлы которые вы тягаете туда-сюда ей искать не стоит - они могли ещё не попасть в базу, или наоборот - в базе окажутся лишние записи. Казалось бы не очень то полезная программа? А вот и нет. Мне иногда нужно найти какие-то файлы, которые, как я знаю или давно существуют или их вообще нет. Например, сегодня я пытался найти программы ildasm и ilasm. Знаю, что вроде должны быть, но где? Есть конечно Far - Alt-F7 и... ищеееем. Но, по всему диску искать довольно долго. Есть ещё стандартный поиск windows, который возможно что-то кеширует, индексирует и ищет, но стандартные средства обычно настолько убоги, что у меня к ним давно развилась стойкая идиосинкразия (таки нашёл где блеснуть этим красивым словом :).

Вот тут то и пригодится эта утилита. Путём недолгих поисков был найден аналог под Windows
Её я и скачал и установил. Затем запустил Updtdb32.exe, который создал базу имён и путей файлов и директорий.
Ну собственно почти и всё. Теперь

C:\Program Files\locate>locate ildasm
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe.config

и

C:\Program Files\locate>locate ilasm
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ilasm.exe
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ilasm.exe.config


Всё отлично нашлось. Причём, что характерно не там где я ожидал. Я то искал в
C:\Program Files\Microsoft Visual Studio 9.0
C:\WINDOWS\Microsoft.NET\Framework\


Ну, а обновлять базу стоит по расписанию, с помощью Task Scheduler, стандартного сервиса Windows. Ох, что-то на меня опять идиосинкразия накатывает...
Поищу ка я аналог cron-а....

P.S. Обновил ссылку

понедельник, 21 июля 2008 г.

Велопробег тур-де-Палик

В воскресенье я, мой брат и ещё один товарищ устроили небольшой велопробег с препятствиями.
Запланировали выезд из Борисова в 7.30, езда по дорогам различной убитости через деревни разной убогости до озера Палик. Там совершаем ритуальное омовение и возвращаемся. Расчётное расстояние 100 км туда и обратно. Вроде ничего сложного.

В Борисов я должен был приехать на электричке, как раз к 7.30, но день начался весело с самого начала. Я опоздал на электричку - приехал на станцию и увидел самое что ни наесть печальное зрелище - отъезжающий поезд. Следующий был только через 2 часа, но я спросонья посчитал, что через 3.
Подумав(теперь мне не очень ясно, чем это я тогда думал), я решил ехать в Борисов на велосипеде, считая что приеду на час раньше следующей электрички.
60 км - не так уж и много, особенно по трассе. Но, не всё случилось так гладко - до Борисова оказалось 70 км, на половине пути начался дождь, и в довершении всего я забыл взять воду.
Но, я таки доехал до Борисова. На 20 минут раньше электрички.... Мда.

Затем мы быстро сориентировались, и выехали к Палику. Я конечно думал, что мы будем ехать асфальтированными или гравийными дорогами, ну в крайнем случае хорошими лесными. Но нет, отъехав от Борисова километров на 5-10, мы вломились в лес, по тому, что когда-то было дорогой.
Впрочем, чем дальше мы ехали, тем лучше становились дороги. Начиная от "тут невозможно проехать" до последних 6 км гравейки, перед Паликом.
На этой гравейке нас коварно застал ливень, от которого мы трусливо спрятались в кустах.

На озере мы классически искупались, побултыхали ногами, избавляясь от грязи и выдвинулись обратно. Назад мы выбрали вполне приличную дорогу - в начале гравейка километров на 20, а потом асфальт. И вот мы вернулись в Борисов.

Ну, а дальше уже совсем просто. Я сел на электричку и мужественно старался не уснуть. Как мне это удалось, сам не понимаю, но я умудрился не проспал свою остановку и в 00:10 уже был дома.
На одометре 185 км, в ногах слабость, в глазах - песок.
Спать....

А вот и фотоотчёт. Качество фотографий несколько страдает, но всё самое интересное увидеть можно :)

Первая лужа, заслуживающая внимания!


Дорога превращается... превращается... в элегантный бурелом.


Где же этот спутник летает ?...
(Кстати, GPS-навигатор - полезная штука. Без него бы мы наверное не вышли... Да и скорее всего не вошли :)


Фотоаппарат, подвешенный за ветку фотографирует, как ему вздумается!


Всё веселее и веселее !


Не всегда получается проехать лужу...


Бывают и досадные остановки


Выбираем поворот (ошиблись, кстати)


А вот и наш обед.


А тут местные аборигены развлекаются. Проехать мимо мы не могли !


Форсирую лужу


Приплыли


Ну это так, болото. Его мы не пересекали, просто место красивое.


А вот и Палик! Кто-то радуется... а кто-то просто моет кроссовки


Плавать тут не очень удобно - мелковато


Наш скромный лагерь


вторник, 15 июля 2008 г.

Перекись - лучший друг велосипедиста

Да, да вы не ошиблись. Я снова грохнулся с велика.
Сегодня, как всегда, ехал домой. Спешил. Нужно было заскочить на бордюр - обычное дело. Но были два обстоятельства: ехал я быстро, что само по себе не ново, а бордюр был под довольно острым углом к моему пути. Ну и естественно, переднее колесо я забросил на тротуар, а заднее почему-то не решилось последовать за передним, и заскользило вдоль бордюра, дальше по дороге. Ясное дело, велосипед не вынес такого противоречия и слёг. А я - вместе с ним.
Если бы не большая скорость, то я стандартно зашкрябал бы ногами, неуклюже спрыгнул с велосипеда и всего делов то.
Вобщем сильно я не пострадал - тока локоть привычно содрал. Облил его перекисью, вот и всё лечение.
За одно сходил в аптеку и купил ещё 2 бутылочки перекиси - друга должно быть много!

среда, 9 июля 2008 г.

Порыбалил на выходные

Как некоторым известно, в Беларуси были выходные с 3 по 6. И я, сграбастав удочку, поехал в деревню.
Ну, можно сказать выходные удались. Не считая того, что пришлось помогать в строительстве туалета-скворечника, я был свободен всё время. Поэтому мне удалось 2 раза побывать на оз. Глубля, 2 раза на местном болотце "Жуковщина" и 1 раз на озере Белоголовое.

На Глубле весело ловилась плотва и краснопёрка средней мелкости. Выловил штук по 20 за каждый заезд(это которых домой принёс. Много отпустил). В следующий раз возьму прикормку с собой, попытаюсь улучшить шансы.

На озеро Белоголовое добирались с небольшими приключениями. Ни я ни мой брат Андрей там ни разу не бывали. Ехали на мотоцикле, по смутным указаниям. Однако вскоре нашли какой-то луг, поросший травой почти по пояс. Оказалось что это подсохшее болото, предваряющее озеро. Андрей мигом намочил ноги - видимо резиновые сапоги были не копенгаген. Я - только штаны по пояс. Но это ничего, упорно проломились через мокрую от росы траву этак с пол километра. И тут наткнулись на нормальную тропинку, проложенную другими браконьерами(там вообще-то ловить запрещено). Ну ладно идём дальше. Проходим через небольшой подлесок и выходим на берег озера. Берег - это я немного загнул. Это не берег, а какая-то лодка... Очень хорошо ощущается, что метров 10 прилегающих к озеру просто напросто плавают! Всё качается, прогибается. Если попрыгать(слегка, конечно, а то провалишься не ровен час) берег начинает ходить ходуном вместе с местными кустами и кочками.
Хотя нами обещали там хороших карасей и линей, но ловилась одна мелочь - карасики сантиметров по 5, которых тут же и выпускали. Я словил и 2 мини-линей - размером с мизинец.
Хорошо прочувствовал разницу между моей удочкой и удой Андрея, которую одолжили у местных. Я на свою словил рыбок 10-15, на "не свою" попалось 2 или 3.
Но, с другой стороны это внушает надежду. Если местные такой палкой(по другому и не назовёшь) ловят по их словам хороших рыб, то чего я смогу наловить?..

Ну и наконец, местная достопримечательность - пруд "Жуковщина". В прошлом году она полностью пересохла и всё рыбу вытянули просто руками. Поэтому ходить туда было не резон, но... как-то утром больше идти было не куда и я завернул туда.
Ожидания превзошли мои самые смелые ожидания. Клевало довольно неплохо. Было выловлено 68 годных рыб, и некоторое кол-во отпущено. Правда отпустить можно было и больше - много мелочи, но я пожадничал.

И был пойман один хитрый карась, которого я словил только на 4-ый раз. (Хотя возможно это были разные караси). 2 раза он срывался с крючка, один раз оборвал леску, ну и в последний раз я его смог таи вытянуть. Он опять сорвался, но уже на берегу и я прихлопнул его рукой.

Собственно, это наверное самая большая моя рыба...

С нетерпением жду отпуска. Выловлю всех рыб!

Проблемы с cron

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

Проблема №1
В логе cron-а значилось, что скрипт выполнен, но правила не добавлялись. Если же запустить скриптик руками - всё срабатывало как надо.
Загадка.... Вскрылась она довольно быстро. Оказалось iptables лежит в /sbin, которого нет в PATH прои запуске cron-ом.
Так-так. Небольшое правило
*/1 * * * * env > cron-env
через пару минут создало файлик /root/cron-env, в котором я смог посмотреть с каким же окружением запускаются программы из-под крона:
SHELL=/bin/sh
USER=root
PATH=/usr/bin:/bin
SHLVL=1
HOME=/root
LOGNAME=root
_=/usr/bin/env
Да, PATH несколько хиловат... Модифицировал скрипт:
#!/bin/bash
PATH=$PATH:/sbin
iptables -I ....
Теперь всё заработало!
Итак, в час ночи inetuser получает доступ в интернет.

Следующим шагом было написание простого скрипта для скачивания файлов по списку. Написал и положил его в /home/sazarkevich/ndnl-download.sh. А так-же создал символьную ссылку /bin/ndnl-download.sh -> /home/sazarkevich/ndnl-download.sh
(всё это для того что-бы и скрипт не потерялся при переинсталяции сервера, и в PATH был доступен всем. Даже злосчастному cron-у)
Теперь оставалось только запускать этот скрипт в фоне, под пользователем inetuser в 01:10. Но тут появилась

Проблема №2
Надо сразу сказать, что хотя я проблему и решил, но причину не понял.
Итак, добавляем запись в crontab:
10 1 * * * su inetuser ndnl-download.sh &
Но, ничего не происходит.
Ладно, мы хитрые:
10 1 * * * su inetuser ndnl-download.sh > /tmp/ndnl-log 2>&1 &
Смотрим в лог и видим, что лох... То есть видим загадочную строку
/bin/bash: Access denied.
Што за фак? Ладно, учёные, не впервой. Создаём консоль с окружением совпадающим как у cron-а. Но, тут всё работает...
Значит дело не в переменных окружения. Нужно методом тыка пробовать различные командные строки. Но это долго: 1 проба занимает где-то 2 минуты. Пока пропишешь новое правило, пока оно сработает. Пока убедишься, что нифига не сработало. И тут я придумал вот что:
Надо поработать в консоли, которую создаст cron. Там и покрутить разные варианты.
Для этого я нашёл утилиту screen. screen как бы создаёт виртуальную консоль, от которой можно отключится, а затем подключится снова.
Были найдены нужные ключи. Следующая команда
screen -d -m
запускает новый сеанс и тут же отключается от него. Сеанс как бы висит в система и ждёт, когда к нему подключусь я - хитрый перец.
Замечательно, создаём правило
23 2 * * * screen -d -m
(02:23 - было ближайшее время срабатывания)
Ждём, проверяем:
# screen -list
13834..leela (Detached)
1 Socket in /var/run/screen/S-root
Оно! Набираем
# screen -r
и оказываемся в консоли, запущенной cron-ом. Тут же проверяем, воспроизводится ли проблема:
# su inetuser ndnl-download.sh
/bin/bash: Access denied.
Грандиозно. Воспроизводится.
Методом тыка приходим, что работает варианты
# su inetuser -с 'ndnl-download.sh'
# su inetuser /bin/ndnl-download.sh
выбираю второй, вписываю правило в crontab:
10 1 * * * su inetuser -c 'ndnl-download.sh > /tmp/ndnl-log 2>&1 &'
Всё работает! Уря.

Заключение.
Хочу ещё рассказать, как этого inetuser-а остановить, чтоб он не зарвался и не стал качать днём. Предусмотрено аж 3 'стопора':
1. В 8:50 с особым цинизмом убиваем все процессы пользователя inetuser:
killall -u inetuser
2. В 8:55 правила iptables очищаются, и снова запрещают интернет на сервере
/etc/init.d/iptables restart
3 Наконец, в 9:00 интерфейс eth0, который смотрит в интернет останавливается:
/etc/init.d/net.eth0 stop
Последнее скорее для забывчивых пользователей, которые всю ночь качали порево и утомлённые заснули на клавиатуре. Ну и проворонили резкое подорожание трафика в 9:00

P.S. Разобрался что за сообщение /bin/bash: access denied.
Оказывается скрипт запускался из /root директории, но от имени пользователя, который в этой директории не имел никаких прав. Видимо bash пытался найти исполняемый скрипт на месте, и тут его обламывали.