Опубликовал: vitaly volkov.

VLC

К вечной теме, на чем смотреть видео и слушать аудио. Ок?

Имхо для Linux систем VLC не подходит, ну никак! После мытарства по его плейлисту, который просто отвратителен в пользовании, я решил забить на него. Даже скины, которые на вид привлекательно изменяли внешность плеера, не помогут.

Два если:

- хотите слушать музыку, то поставьте foobar2000, да придется ставить wine, но линуксоиды? у кого он не стоит? -) Или можно поставить amarok, в общем для прослушивания музыки в линуксе достаточно софта, а вот с поддержкой cue не так уж и много, и все хромают когда в листе русские названия. А я любитель русского рока и lossless форматов :)

- хотите посмотреть видео, то пересоберите mplayer с выводом графики через видеокарту, потому что процессор со скаченными HD фильмам просто тупит. Да и вообще mplayer приятнее и пошустрее VLC.

Разбиение объектов на “равные” части

Предлагаю вашему вниманию небольшой снипет, который мы написали, когда понадобилось сделать вывод объектов по колонкам.

  1. from django import template
  2.  
  3.  
  4. register = template.Library()
  5.  
  6.  
  7. class SplitObjectsNode(template.Node):
  8.     def __init__(self, objects, list):
  9.         self._objects = template.Variable(objects)
  10.         self._list = list
  11.  
  12.     def render(self, context):
  13.         import math
  14.         columns_count = len(self._list)
  15.         objects = self._objects.resolve(context)
  16.  
  17.         for item in self._list:
  18.             context[item] = []
  19.  
  20.         if len(objects) == 0:
  21.             return
  22.  
  23.         dec = float(len(list(objects))) / columns_count
  24.         mid = int(math.ceil(dec))
  25.         pass_part = len(list(objects)) % columns_count
  26.         count_full_cols = columns_count – pass_part
  27.  
  28.         idx = 0
  29.         index = 0
  30.         for item in self._list:
  31.             step = mid
  32.             if idx >= pass_part and pass_part != 0:
  33.                 step = mid – 1
  34.             context[item] = objects[index: step + index]
  35.             index += step
  36.             idx += 1
  37.         return
  38.  
  39.  
  40. @register.tag
  41. def split_objects(parser, token):
  42.     """                                                                                                                                                                                                      
  43.    Split content of the objects to equal parts. Number of parts is a count of passed arguments to tag.                                                                                                      
  44.                                                                                                                                                                                                            
  45.    Example:                                                                                                                                                                                                
  46.    {% split_objects objects col1 col2 col3 %}                                                                                                                                                              
  47.    <table><tr><td>                                                                                                                                                                                          
  48.    {% for item in col1 %} {{ item.title }} {% endfor %}                                                                                                                                                    
  49.    </td><td>                                                                                                                                                                                                
  50.    {% for item in col2 %} {{ item.title }} {% endfor %}                                                                                                                                                    
  51.    </td><td>                                                                                                                                                                                                
  52.    {% for item in col3 %} {{ item.title }} {% endfor %}                                                                                                                                                    
  53.    </td></tr></table>                                                                                                                                                                                      
  54.    """
  55.     parts = token.contents.split()
  56.     if len(parts) < 3:
  57.         raise template.TemplateSyntaxError, "Tag should get at the least 3 arguments. Example usage is {% split_objects objects col1 col2 %}"
  58.  
  59.     tagname = parts.pop(0)
  60.     objects = parts.pop(0)
  61.     return SplitObjectsNode(objects, parts)

Набор горячих клавиш для работы с консолью

Если вы работаете с текстом в консоли, возможно правите какую то конфигурацию на сервере под никсами (к примеру генту), то возможно вам будет интересно и полезно узнать некоторые горячие клавиши которые вы вероятно никогда не использовали.

Возвратится на начало текущей строки Ctrl + A
Возвратится в конец текущей строки Ctrl + E
Удалить слово назад Alt + BackSpace
Удалить слово вперед Alt + D
Переместить курсор к началу следующего слова Alt + F
Переместить курсор к началу предыдущего слова Alt + B

Удалить символ перед курсором Ctrl + D

Данные комбинации поддерживаюца большинством никсовых систем.

PS.: имхо иногда удобно очень, чем тыкать мышкой

Zenwalk и мысль о укомплектованном пакете.

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

Очередным сюрпризом после установки явилось то, что версия питона стояла 2.6, так что обновлять его мне не пришлось, а сразу пошли установки пакетов – django, wxWidgets, wxPython, и еще всякого по мелочи.

Ну и плюс как обычно сделал себе полный набор девелоперского софта – Eclipse, lighttpd, php, mysql. Подумалось то что каждыйраз когда идет настройка новой оси или не совсем новой, то такие действия я повторяю из раза в раз. Пришла мысль сделать какой то пакет который бы при установке сразу же имел все необходимые мне вещи.

Возможно примусь за это в скором времени.

Основы emacs (внешняя ссылка)

После поисков редактора питоновских скриптов я прошустил довольно много, спрашивал, читал, изучал. Мне не нужен был ни Eclipse ни IDEA. Для моего домашнего ноута честно признатся таких монстров вообще не нужно.

В итоге остановился на emacs. Сейчас читаю классную статью, которую, если вы так же как и я решили перейти на emacs, можете прочитать вот

Кстати под Mac OS X есть отличная обертка над emacs Aquamacs

Вызов конструктора родительского класса

Христос Воскрес!

Воистину все постигается в чтении умных книг. Буквально недавно сообразил, какую возможно грубейшую ошибку мы совершили в создании одного приложения на Python. Мы использовали для вызова методов родительского класса super.

Пример:

  1. class B:
  2.  
  3.     def __init__(x, y):
  4.         self.x = x
  5.         self.y = y
  6.  
  7.     def setX(x):
  8.         self.x = x
  9.  
  10.  
  11. class A(B):
  12.     def __init__(x, y, r):
  13.         super(A, self).__init__(x, y)
  14.         self.r = r
  15.  
  16.     def setX(x):
  17.         super(A, self).setX(x + self.r)

А теперь посмотрим как было бы правильнее

  1. class B:
  2.  
  3.     def __init__(self, x, y):
  4.         self.x = x
  5.         self.y = y
  6.  
  7.     def setX(self, x):
  8.         self.x = x
  9.  
  10.  
  11. class A(B):
  12.     def __init__(self, x, y, r):
  13.         B.__init__(self, x, y)
  14.         self.r = r
  15.  
  16.     def setX(self, x):
  17.         B.setX(self, x + self.r)

Загрузка файлов на сервер

В последнее время перешел с GUI аплоада на утилиту rsync. А что? Очень даже удобно если набросать для проекта скрипт обновления. Но в простом случае я просто делаю что то вроде этого

rsync ~/workspace/example.php username@example.com:/var/www/example.com

Но можно и все содержимое каталога

rsync -r ~/workspace/* username@example.com:/var/www/example.com

Переход с Python 2.5 на Python 2.6

Решили перевести наш сервер на версию Python 2.6. Замечу что до этого использовали 2.5, что как оказалось является довольно устаревшей. Ну решили – начал переводить.

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

Скачал необходимую версию питона, скомпилил – все отлично, осталось перевести ссылку python и python-config на новую версию.

# rm /usr/bin/python /usr/bin/python-config
# ln -s /usr/local/bin/python2.6 /usr/bin/python
# ln -s /usr/local/bin/python2.6-config /usr/bin/python-config

Все отличненько и

# python --version

вернула 2.6.2, осталось пересобрать mod_python, чтобы он использовал обновленный питон. Сделал через обычный emerge.

В итоге все довольны, и осталось только переустановить все необходимые пакеты (дада, именно переустановить, обычное линкование не очень хороший метод), чтобы все проекты поднялись.

Перевод Drupal на BigStreet

Была поставлена задача перевести существующую базу с Drupal’а на BigStreet. Скажу сразу что скрипт писался исключительно в личных целях и на скорую руку.

Скрипт генерирует необходимые SQL запросы для их выполнения над базой BigStreet. Будьте осторожны в плане того что он не смотрит какие id у вас уже есть в существующей базе и некоторые запросы просто выдадут ошибку.

Я не учитывал комментарии незарегистрированных пользователей, поэтому если используете скрипт и вам они просто необходимы то можете немного дописать скрипт или сам БигСтрит на поддержку анонимных комментаторов.

Ну и собственно сам скрипт можно взять отсюда.

Скрипт можно выполнять через командную строку перенаправив вывод в отдельный файл.

Диверсанты

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

После поднятия NAT на Gentoo Linux, самым неведомым образом стал пропадать интернет, стал шурстить и дошурстил google до дырок. С сетевого адреса через утилиту arping удалось выявить виновника такого поведения, звонок в службу поддержки и выдача чужого MAC адреса поставила точку на наших бедах (ох надеюсь что это так)

Итак, если у вас пропадает интернет и появляется только после рестарта интерфейса, то будьте готовы что кто то использует ваш IP.

Исключительно эта ситуация касается только для выделенных внешних IP.