Archive

Archive for October, 2007

Загадка!

October 19th, 2007 9 comments

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

Итак, есть следующий код:

#!/bin/sh

get_size() {
if [ "`uname`" = "FreeBSD" ]; then
r=`stat -f %z $1`
else
r=`stat -c %s $1`
fi
return $r
}

if [ -z $1 ]; then
echo "usage: print_size ";
else
get_size $1;
echo $?
fi

Вот результат работы скрипта:
asveshnikov@fe08a023fb1cc27a:~/tmp$ ls -la
total 112
drwxr-xr-x 2 asveshnikov asveshnikov 4096 2007-10-19 15:38 .
drwxr-xr-x 85 asveshnikov asveshnikov 8192 2007-10-19 13:15 ..
-rw-r--r-- 1 asveshnikov asveshnikov 39781 2007-08-29 15:22 DSC02473.jpg
-rw-r--r-- 1 asveshnikov asveshnikov 49553 2007-08-31 17:41 DSC02481.jpg
-rwxr-xr-x 1 asveshnikov asveshnikov 231 2007-10-19 15:27 print_size.sh
asveshnikov@fe08a023fb1cc27a:~/tmp$ ./print_size.sh print_size.sh
231
asveshnikov@fe08a023fb1cc27a:~/tmp$ ./print_size.sh DSC02473.jpg
39781

Как видите, абсолютно рабочий код, проверялся в Linux и FreeBSD.
При этом он имеет просто ужасную.. нет, чудовищную проблему переносимости, которую при некоторых обстоятельствах крайне сложно обнаружить в скриптах несколько большего размера – какую?

p.s. угадавший первым будет умничкой :)

UPD:

Уже двое человек указали на то, что `uname` желательно взять еще и в кавычки. Вобщем, предлагаю не мелочиться, здесь проблема если и есть, то явно не “чудовищная”. Чтобы больше никого не смущать этим, подправил код.

Решено!

Михаил достаточно подробно описал проблему:

Если не брать в голову отсутствие кавычек вокруг $1, а также неполный способ определения размера файла (под солярой нет stat, например), то мне кажется основная проблема в возврате значения из функции. На самом деле таким образом можно вернуть только целое, причем очень ограниченное, так как по сути возвращается код завершения функции (если не изменяет память – максимум – 256). таким образом на больших файлах получим неверное значение.

Решением может служить использование для возврата глобальное переменной, либо через echo.

С моей стороны осталось лишь пояснить, почему проблема является “чудовищной” – она запросто может привести к порче данных, так как никакие сообщения об ошибках выводиться не будут. Ну и выглядит внешне этот код вполне надежным, так что отлавливать такой баг может быть задачей не из легких.

Собственно, основные проблемы возникают при портировании скрипта с sh на bash:

asveshnikov@fe08a023fb1cc27a:~/tmp$ ls -al DSC02473.jpg
-rw-r--r-- 1 asveshnikov asveshnikov 39781 2007-08-29 15:22 DSC02473.jpg
asveshnikov@fe08a023fb1cc27a:~/tmp$ bash print_size.sh DSC02473.jpg
101

Kubuntu 7.10 && Enlightenment 0.17

October 19th, 2007 2 comments

Смешанные чувства: нет эйфории, которая была с 7.04: просто прервал работу на полчаса, поставил новую систему, добавил с десяток нужных мне пакетов и продолжил работу.

И уже в процессе работы стал натыкаться на приятные мелочи: dolphin, который действительно мне показался шагом вперед в плане юзабельности, KNetworkManager, в котором появилось окошко статуса, strigi – служба полнотекстового поиска по локальным файлам, и еще опера, которая теперь доступна из ‘Canonical partner’ – репозитория.

Хм. Да вроде бы и все.

Куда больше интересного произошло на работе: нам выдали по второму монитору и видеокарте, и я пару часов потратил на приятнейшие хлопоты с подключением-настройкой всего этого добра. Выяснилось, правда, что по-нормальному со вторым монитором (в режиме xinerama) не работает ни одна из привычных мне систем: в KDE просто не получилось на него вывести никакой полезной информации, в enlightenment 0.16 обнаружился неприятный глюк – смазывался текст при манипуляциях с окнами. Наверняка все заработало бы в режиме TwinView или MergedFB, но у меня вторая видеокарта – старая ATI под слот PCI, поэтому другого варианта не было.

скриншот с офсайта
Искать счастья я стал в e17, и.. нашел!! Я в полном восторге от нее! Все, чем мне нравился e16 там осталось, но как плюс – красивые темы, полноценная панель управления, гениальнейший диалог быстрого запуска, плагины и сносная поддержка xinerarma.

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

Все равно, в итоге я от самых простых вещей теперь тащусь, как удав по стекловате!!

Categories: UNIX Tags: , ,