среда, 21 декабря 2011 г.
`Анонс идеи (с надеждой на содействие)
четверг, 18 августа 2011 г.
Состояние сервера
Adapter: SMBus I801 adapter at c800
in0: +1.48 V (min = +0.00 V, max = +3.32 V)
Vcore: +1.50 V (min = +0.00 V, max = +2.99 V)
+3.3V: +3.34 V (min = +2.97 V, max = +3.63 V)
+5V: +5.05 V (min = +4.50 V, max = +5.50 V)
+12V: +11.92 V (min = +0.00 V, max = +15.94 V)
fan1: 3321 RPM (min = 0 RPM)
fan2: 0 RPM (min = 0 RPM)
fan3: 1058 RPM (min = 0 RPM)
fan4: 0 RPM (min = 0 RPM)
temp1: +46.8°C (low = -127.0°C, high = +127.0°C)
M/B Temp: +38.5°C (low = -127.0°C, high = +127.0°C)
temp3: +39.8°C (low = -127.0°C, high = +127.0°C)
cpu0_vid: +1.525 V
function memdisp {
MEM=`free -mot | head -n 2 | tail -n 1`
COUNT=1
for ITEM in $MEM
do
if [ $COUNT -eq 2 ] ; then
printf " Total RAM:\t$ITEM Mb\n"
fi
if [ $COUNT -eq 3 ] ; then
printf " Used RAM:\t$ITEM Mb\n"
fi
if [ $COUNT -eq 4 ] ; then
printf " Free RAM:\t$ITEM Mb\n"
fi
COUNT=$[COUNT+1]
done
MEM=`free -mot | tail -n 2 | head -n 1`
COUNT=1
for ITEM in $MEM
do
if [ $COUNT -eq 2 ] ; then
printf " Total SWAP:\t$ITEM Mb\n"
fi
if [ $COUNT -eq 3 ] ; then
printf " Used SWAP:\t$ITEM Mb\n"
fi
if [ $COUNT -eq 4 ] ; then
printf " Free SWAP:\t$ITEM Mb\n"
fi
COUNT=$[COUNT+1]
done
}
UPTIME=`uptime`
D_UP=${UPTIME:2}
alias hi="
printf ' Hello \t`whoami`\n'
printf ' Today is:\t\t`date`\n'
printf ' Number of user login:\t\t`who | wc -l`\n'
printf ' uptime:\t$D_UP\n'
printf ' Sensors:\t`sensors -A`\n'
printf ' HDD1: \t`hddtemp -n /dev/sda`°C\n'
printf ' HDD2: \t`hddtemp -n /dev/sdb`°C\n'
memdisp
"
Today is: Thu Aug 18 13:15:45 MSD 2011
Number of user login: 1
uptime: 3:15pm up 3:19, 1 user, load average: 0.00, 0.01, 0.05
Sensors: adm1027-i2c-3-2e
in0: +1.48 V (min = +0.00 V, max = +3.32 V)
Vcore: +1.47 V (min = +0.00 V, max = +2.99 V)
+3.3V: +3.35 V (min = +2.97 V, max = +3.63 V)
+5V: +5.06 V (min = +4.50 V, max = +5.50 V)
+12V: +11.84 V (min = +0.00 V, max = +15.94 V)
fan1: 3262 RPM (min = 0 RPM)
fan2: 0 RPM (min = 0 RPM)
fan3: 1056 RPM (min = 0 RPM)
fan4: 0 RPM (min = 0 RPM)
temp1: +47.8°C (low = -127.0°C, high = +127.0°C)
M/B Temp: +37.2°C (low = -127.0°C, high = +127.0°C)
temp3: +39.0°C (low = -127.0°C, high = +127.0°C)
cpu0_vid: +1.525 V
HDD1: 36°C
HDD2: 39°C
Total RAM: 495 Mb
Used RAM: 195 Mb
Free RAM: 300 Mb
Total SWAP: 2053 Mb
Used SWAP: 0 Mb
Free SWAP: 2053 Mb
пятница, 5 августа 2011 г.
Всякие там HDD ID
В связи с переездом на новый хард (обзавёлся "зелёным" WD на 2Тб) столкнулся с проблемой, которая раньше обходила меня стороной - с HDD ID.
Если кто не знает, некоторое время назад, стоило изменить разметку диска, как Linux терял свои разделы. Это было связано с тем, что разделы в fstab нумеровались по физическому положению на диске - т.е. sda1 - первый праймари раздел на первом диске, sda5 - первый расширенный раздел и т.д.
То есть стоило впихнуть перед sda5 ещё один раздел, как sda5 переезжал на sda6 и если на нём располагались жизненно важные структуры (типа /usr или /home) система грузиться отказывалась и приходилось грузиться с лайвсиди и править fstab и grub.
Так вот комьюнити решило исправить недостаток. Выявилось сразу несколько решений среди которых наибольшую популярность приобрели UUID и hdd ID.
UUID в первую очередь проталкивала Canonical в своём не безызвестном дистрибе Убунту. hdd ID нашёл прибежище, например, в моей SuSE.
Идея проста и на первый взгляд хороша - назначается каждому разделу уникальный ID, который не теряется при изменении таблицы разделов. Он представляет собой нечитаемое нагромождение буков и цифр, повторения среди которых быть просто не может.
Казалось бы - проблема решена.
Однако не всё так славно. ID привязан к жёсткому диску и при миграции раздела с одного жёсткого диска на другой, ID имеет свойство меняться.
Так и произошло у меня - GRUB выдал ERROR 17, я залез в fstab и обнаружил... уже упомянутые абсолютно не читаемые сочетания буков и цифр.
Возник вопрос, где взять оные для моих целей. Ответ выяснился довольно быстро, но не очевидно, что я в итоге и решил написать тут (как водится, чтоб самому не забыть).
Чтобы выяснить HDD ID нужно просто посмотреть что находится в папке /dev/disk/by-id
Так как этот вариант кодировки указывает на жёсткий диск прямо в названии, вы легко можете понять какой ID какому разделу принадлежит.
Чтобы выяснить UUID можно чисто теоретически заглянуть в /dev/disk/uuid однако это даст вам мало, т.к. бессистемное сочетание буков и цифр никак не скажет вам о своих корнях. Для того, чтобы выяснить UUID в сочетании с физическим расположением диска, можно воспользоваться командой blkid. Если написать её без аргументов (причём не важно из под рута или нет) она выдаст вам красивую таблицу соответствия.
Единственная беда - все эти id'шники надо вбить в fstab и, в моём случае, в меню grub. Не очень удобно хоть и очевидно.
среда, 20 июля 2011 г.
Gallery2 и кириллица
История болезни
Есть такая дурная особенность веб-приложений и CMS написанных зарубежными авторами, а именно - отсутствие какого-либо респекта по отношению к чужим языкам в кодировках. В целом, Gallery2 построена вокруг UTF-8, что должно было в теории лишить её подобных недостатков. Однако, не тут то было.
После установки выяснилось, что в паре мест вместо русского текста наблюдаются кракозябры. Одно из них - список фотографий на боковой панели, второй - в сокращённом виде комментариев.
Попробовал погуглить, но решения своей проблемы не нашёл. Пришлось включать мозг :).
Итак, запустив firebug и разобрав страницу, я увидел функцию entitytruncate, которая замечательно подходила под оба описанных случая - и названия на боковой панели и сокращённые комментирии обрезаны, сиречь truncated.
Пошарив в папке галереи на предмет всяких обрезаний, нашёл следующее:
$find /usr/share/egroupware/gallery/|grep trunc
/usr/share/egroupware/gallery/gallery2/lib/smarty_plugins/modifier.entitytruncate.php
/usr/share/egroupware/gallery/gallery2/lib/smarty/plugins/modifier.truncate.php
Так как страничка под firebug'ом сослалась на entitytruncate, в него и заглянул.
И увидел там замечательные строки:
$string = GalleryUtilities::utf8ToUnicodeEntities($string);
с комментарием:
/*
* Convert multibyte characters to html entities and then get an entity-safe substring.
* Split the string exactly on the boundary. If there's no change, then we're done.
*/
который при переводе на понятный язык звучит, как "отрезаем ноги, чтобы член длинней казался".
И в дальнейшем все выводы преобразуются обрано строчкой типа
return GalleryUtilities::unicodeEntitiesToUtf8($piece);
Естественно, первым, что я попытался выяснить было "а накуа вообще переводить из utf-8 в старый юникод?"
И убрав все следы подобных переводов (первую строчку и в последующих убрав функцию
GalleryUtilities::unicodeEntitiesToUtf8() ).
Сохранив свою новую modifier.entitytruncate.php убедился, что решение работает.
Краказябры исчезли.
В принципе на этом можно было бы и остановиться, однако смутило одно - несмотря на указанное $breakWords=false обрезание происходит где попало, а в некоторых случаях на месте обрезки поперёк слова проявились символы �
Так как PHP я начал изучать относительно не давно, с ходу понять, что там не работает (с учётом того, что текст простенькой функции обрезания вызывает кучу других функций) у меня не получилось.
Однако перед этим чисто из праздного интереса я заглянул в файлик modifier.truncate.php и обнаружил там ту же функцию обрезки текста, только написанную на более человеческом языке и вполне мне понятную.
В общем, не долго думая, я переименовал modifier.truncate.php в modifier.entitytruncate.php, изменил в объявлении
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
$break_words = false, $middle = false)
на
function smarty_modifier_entitytruncate($string, $length, $etc = '...',
$break_words = false, $middle = false)
и всё заработало на этот раз так, как полагается.
Коротко решение
1. Находим в каталоге галереи modifier.entitytruncate.php и modifier.truncate.php и заменяем второй на первый.
В моём случае это:
$cp gallery2/lib/smarty/plugins/modifier.truncate.php gallery2/lib/smarty_plugins/modifier.entitytruncate.php
2. Открываем полученный modifier.entitytruncate.php в любимом текстовом редакторе.
$vim gallery2/lib/smarty_plugins/modifier.entitytruncate.php
3. Меняем строку
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
$break_words = false, $middle = false)
на
function smarty_modifier_entitytruncate($string, $length, $etc = '...',
$break_words = false, $middle = false)
4. Сохраняем файл и перезапускаем сервер:
#service apache2 restart
Дело сделано.
понедельник, 13 июня 2011 г.
Массовый откат пакетов в Ubuntu
Так как никаких резервных образов свеженастроенной в тестовых целях Ubuntu 11.4 у меня не было, а залез я в дебри не по самые ноздри, решил, что достаточно просто откатиться до версии GNOME 2 и всё само собой станет на свои места.
Только вот одна беда - как вообще откатить массово версии пакетов в Ubuntu? Покопавшись во встроенных функциях apt-get и synaptic, я уже было отчаялся (боже, как всё просто с YaST). Однако натолкнулся на утилиту ppa-purge подходящую по описанию на то что мне нужно.
И, как не странно, помогло.
Утилита делает примерно то, чего от нее ждут - откатывает версии пакетов с PPA на те, что с официальных репок. Работает она следующим образом:
В консоли набираем:
$ sudo ppa-purge ppa:
Вместо
В моём случае строка выглядела так:
$ sudo ppa-purge ppa:gnome3-team/gnome3
После этого пришлось согласиться на невосполнимые патери в виде пакетов, завязанных на gnome 3 и дело в шляпе.
среда, 25 мая 2011 г.
Linux и Proxy
Не долго думая, подрубил свой телефон с 3Г от Мегафона (продакт плэйсмент ^_^) к выньдовой машине и поднял прокси.
Чтоб не забыть, напишу ка как я это сделал...
Поднимаем простейший Proxy-сервер на Windows 7:
- Я решил воспользоваться простой и понятной прогой CCProxy, которую можно найти по этому адресу. Она бесплатна до 3-х юзверей, а больше нам и не надо. Установка в пару кликов, проблем вызвать не должна ни у кого.
- Заходим в Options, ищем снизу "Local IP-address", снимаем галочку с "Auto Detect" и выбираем из списка адрес в локальной подсети (мы ж не инету проксю открываем). Справа от выбранного адреса ставим галочку в чекбоксе. Тут же можно при желании поправить параметры по протоколам. Или оставить всё как есть. Жмём "Ok" .
- Заходим в Account Manager, меняем в выпадающем списке сверху "Permit Only", а ниже выбираем тип регулировки доступа к прокси (например по паролю или мак-адресу). Или даём доступ всем желающим.
- Создаём пользователя нажав кнопку "New" и указываем ту информацию, которую хотим требовать для аутентификации (например, имя пользователя и пароль). Если блокировка идёт по маку, его легко получить через функцию Auto Scan в главном окне Account Manager'а.
- Запускаем проксю и дело в шляпе.
- Тут тупо нужно зайти в шел и вбить строчку:
export http_proxy=http://proxy:port - если идентификация идёт по маку или ещё как.
Так же можно поступить с ftp проксёй:
export ftp_proxy=http://user:password@proxy:port
Дальше можно спокойно юзать всякие zypper install (моя OpenSuSE) аль apt-get install (Debian) или чем у вас там пакеты хапают с репок.