вторник, 5 января 2010 г.

Переход Ubuntu 9.10 Karmic Pulseaudio Alsa и другие "особенности"

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

=== Переезд на Ubuntu 9.10 ===
(x86 или 64 будет уточнятся по ходу дела)

===
=== Освобождения винта от данных ===
===

Решил слить все нужные данные на второй винт и сделать "чистую" установку.

Для гарантированного сливания 100+G пробовал использовать sbackup, опыт печальный,
когда архив получился 70G, и я его в целях проверки стал распаковывать на третий винт,
после 30 минут распаковки - выдал ошибку "неожиданный конец архива".

Итог: для переноса данный использовать rsync.
$ rsync --progress -luogthvr --delete-after from to

Плюс в том, что даже если чтото "оборвалось", можно быстрее "докачать" остатки.

===
=== Выбор 64 или 32 ===
===
Сначала я выбрал 64, про№;%?*(; со звуком, я решил поставить 32, но выяснилось что тут теже яйца.
Поэтому победа и тесты были проведены на 32, а на чистую я буду ставить 64 (пишу этот документ как
финишный 32 и как помятку по которой буду устанавливать 64).

===
=== Устанавливаем систему, избавляемся от Pulse, выбираем Alsa ===
===
Установить систему с LiveCD, применить все обновления.
Если коротко то проблема звука вылезла с Skype. Микрофон работал очень, тихо практически не слышно.
Также "тихо слышно" работала стандартная "Звукозапись".
Еще одни грабли вылезли на внешней звуковой карте, просто в 9.10 нет аналога gnome-sound-properties из 8,
и выбрать по человечески куда играть музыку в штатные колонки или стационартные я не могу.

Просто писец... Шаг назад в человечности.

===
=== Избавляемся от Pulse, выбираем Alsa ===
===
По материалам:
[1] Как избавиться от pulseaudio в Karmic (Ubuntu 9.10)
http://forum.ubuntu.ru/index.php?topic=69589.0
Спасибо Psy[H[] и Демагог, за их дельные посты.

[2] Re: Ubuntu's switch to pulseaudio broke accessibility for the blind
http://n2.nabble.com/Re-Ubuntu-s-switch-to-pulseaudio-broke-accessibility-for-the-blind-td3886061.html

Итак по порядку, что делал чтобы заработало у меня:
== из источника [1] ==
1. Собсвтенно урбать pulseaudio не сложно:
$ sudo apt-get remove pulseaudio gstreamer0.10-pulseaudio
это потянет соответсвтующие пакеты, ничего жизненно важного.
$ killall pulseaudio

2. NEW - не удалять потому что подменим gnome-volume-control Подтираем остатки мусора
$ gnome-session-properties
ищем там gnome-volume-control-applet и выключаем/удаляем. Он бесполезен, так как ничего не умеет кроме как в фоне ругаться на отсутствие pulseaudio.
еще прибиваем его в текущей сессии, чтобы не ныл:
$ killall gnome-volume-control-applet

3. Идем в
$ gstreamer-properties
известный в народе как "выбор мультимедийной системы" cтавим везде где можно ALSA,
в [1] 3тим пунктом указано еще одно не обязательное телодвижение, у меня заработало без него.

4. теперь нам нужен микшер. Выбор тут есть. И консольный alsamixer и кучка гуев к нему. Но самостоятельно парящие гуи в основном кривые. Поэтому автор скромно советует
$ sudo apt-get install xfce4-mixer
микшер качественный, без глюков и ничего особо серьезного по зависимостям за собой не тянет. Ставим, размещаем лончер команды xfce4-mixer на панели по вкусу.
При первом запуске микшер будет пуст - необходимо выбрать карту и видимые каналы.

5. Самое коварное - управление с клавиатуры
Обойтись можно тремя командами:
amixer sset Master 5+
amixer sset Master 5-
amixer sset Master toggle
соответственно увеличить, уменьшить, включить/выключить.
Данные команды можно повесить на на исполнение нужными кнопками через стандартную гномовскую утилиту,
"Добавить" новую команду.
$ gnome-keybinding-properties
также можно повесить как лончеры на панель.

6. последний шртих:
$ sudo apt-get install alsa-oss
чтобы приложения, написанные под oss тоже могли выводить звук через ALSA.

После этих шагов остались не приятные последствия: gnome-volume-control перестал работать (при запуске Система\Параметры\Звук, получаем "Ожидание ответа звуковой подсистемы").
И нет возможности менять звуковуй карту (слушать через внешнею USB TerraTec Aureon 5.1), что в предыдущей версии делалось через gnome-sound-properties.

Выход:
1) заменить gnome-volume-control (Ubuntu 9.10 Karmic) на его же из jaunty (из соответсвующей 32bit или 64bit).
2) добавить отсутвующий gnome-sound-properties.
Для обоих случаев - качаем пакеты содержащие их из предыдущей Ubuntu, разархивируем, берем нужные файлы, ложим их на нужные места к себе.

Установим 1):
Скачаем нужное (i386 или amd64 в зависимости от вашей платформы):
gnome-volume-control лежит в пакете gnome-media (/usr/bin/gnome-volume-control)
http://packages.ubuntu.com/jaunty/amd64/gnome-media/download
http://packages.ubuntu.com/jaunty/i386/gnome-media/download

$ sudo cp /usr/bin/gnome-volume-control /usr/bin/gnome-volume-control2
заменим на взятый из предыдущей версии
$ cd old_gnome-media_path/usr/bin/
$ sudo cp gnome-volume-control /usr/bin/
до кучи заменим и gnome-sound-recorder ("Звукозапись"), им мы сможем проверить правильную работу микрофона
$ sudo cp /usr/bin/gnome-sound-recorder /usr/bin/gnome-sound-recorder2
$ cd old_gnome-media_path/usr/bin/
$ sudo cp gnome-sound-recorder /usr/bin/

Установим 2):
Тут кроме копирования файла нужно скопировать sound-properties.glade, возмем его с ветки форума
http://www.4front-tech.com/forum/viewtopic.php?f=3&t=3324
http://www.4front-tech.com/forum/download/file.php?id=1
в этом же архиве лежит исполняемый файл и можно взять его
(не тянуть из пакетов, хотя если ты параноик.. то официальные ссылки ниже)
gnome-sound-properties лежит в пакете gnome-control-center (/usr/bin/gnome-sound-properties)
http://packages.ubuntu.com/jaunty/amd64/gnome-control-center/download
http://packages.ubuntu.com/jaunty/i386/gnome-control-center/download
копируем
$ sudo cp gnome-sound-properties /usr/bin/
$ sudo mkdir /usr/share/gnome-control-center/glade/
$ sudo cp sound-properties.glade /usr/share/gnome-control-center/glade/


=== Все теперь должно работать, удобно ===
Для быстрого переключения звуковой карты выведем команды на панель
gnome-sound-properties


=== Проверим скайпом ===
установим
для 32bit можно воспользоватся репозиторием
$ sudo gedit /etc/apt/sources.list
add line:
deb http://download.skype.com/linux/repos/debian/ stable non-free
$ sudo apt-get update
$ sudo apt-get install skype

для 64bit ставим из пакета
$ wget http://www.skype.com/go/getskype-linux-beta-ubuntu-64
и устанавливаем.
skype-ubuntu-intrepid_2.1.0.47-1_amd64.deb


В skype в настройке, убрать галку с "Устройства\Позволить skype автоматически подстраивать громкость".
Проверить что микрофон не выключен, что для input истойства volume не на нуле.
Сделать тестовый звонок, должно все работать.


=== Дальше идут обычные шаги, по установке софта которым я пользуюсь ===


# medibuntu
sudo wget --output-document=/etc/apt/sources.list.d/medibuntu.list http://www.medibuntu.org/sources.list.d/$(lsb_release -cs).list && sudo apt-get --quiet update && sudo apt-get --yes --quiet --allow-unauthenticated install medibuntu-keyring && sudo apt-get --quiet update


sudo apt-get install nautilus-gksu nautilus-open-terminal

суббота, 2 января 2010 г.

Rsync - способ синхронизации файлов

http://blog.jphoude.qc.ca/2007/12/01/simple-incremental-backup-rsync-ssh/
http://www.webnext.ru/blog/2007/07/02/rsync-howto.html

Разберём на примере:

rsync -e ssh --progress -lzuogthvr --compress-level=9 \
--delete-after root@:/home/ /home/

или

rsync -e ssh --progress -lzuogthvr --compress-level=9 \
--delete-after /home/ root@:/home/

зависит от того, в какую сторону синхронизируем файлы

Обратите внимание на последний слеш, так как он имеет значение для rsync. Если на конце исходной директории стоит «/», то это означает копирование содержимого директории; отсутствие слеша означает копирование директории и ее содержимого.

Ключи:

* e — заменяет протокол с rsh на ssh

* progress — вывод хода процесса работы на терминал
* l — пересоздание symlinks, это значит, что символические ссылки будут так же переноситься

* z — использовать сжатие
* u — update. Обновление, он будет пропускать файлы которые новей, чем на удалённом сервере

* o — установить владельца конечного файла таким же, как и у исходного
* g — установить группу конечного файла таким же, как и у исходного

* t — передача времени модификации и его обновление на удаленной системе. Этот ключ должен быть установлен для точной синхронизации
* h — вывод информации на терминал в удобном для чтения (human-readable) виде

* v — verbose. Вывод сообщений в терминал.
* r — рекурсивный режим

* n — отладочный режим
* compress-level — уровень сжатия

пятница, 18 декабря 2009 г.

Ссылки на сравнение Ruby on Rails и Django

http://www.magpiebrain.com/2005/08/14/a-comparison-of-django-with-rails/

http://blogs.ubc.ca/scottmcmillan/2009/02/26/django-vs-ruby-on-rails/


Интервью: новый веб-сервис "Яндекса" построен на языке Python и фреймворке Django
http://soft.compulenta.ru/346012/

понедельник, 7 декабря 2009 г.

nginx vps and related

http://www.youtube.com/watch?v=DB-ikoCnjvk

понедельник, 26 октября 2009 г.

Upload files in Django

http://livedev.org/2009/01/02/django-filefield-upload-to
http://www.nitinh.com/2009/02/django-example-filefield-and-imagefield/

Django amazon s3 storage

From: http://code.welldev.org/django-storages/wiki/Home
From: http://www.sourceguru.net/177/

Code:

from django.conf import settings
import S3

from django.core.files.storage import Storage

class S3Error(Exception):
"Misc. S3 Service Error"
pass

class S3Storage(Storage):
options = None

def __init__(self, options=None):
if not options:
options = settings.S3_SETTINGS
self.options = options
self.perm_tuple = (
'private',
'public-read',
'public-read-write',
'authenticated-read'
)
if self.options['default_perm'] not in self.perm_tuple:
self.options['default_perm'] = 'private'

self.connect()

def connect(self):
self.conn = S3.AWSAuthConnection(self.options['aws_key'], self.options['aws_secret_key'])

res = self.conn.check_bucket_exists(self.options['bucket'])

if res.status != 200:
res = self.conn.create_bucket(self.options['bucket'])
if res.http_response.status != 200:
raise S3Error, 'Unable to create bucket %s' % (self.options['bucket'])

return True

def exists(self, filename):
contents = self.conn.list_bucket(self.options['bucket'])
if filename in [f.key for f in contents.entries]:
return True
else:
return False

def size(self, filename):
contents = self.conn.list_bucket(self.options['bucket'])
for f in contents.entries:
if f.name == filename:
return f.size

return False

def url(self, filename):
server = self.options['bucket']
if not self.options['vanity_url']:
server += '.s3.amazonaws.com'
return 'http://' + server + '/' + filename


def save(self, filename, content):
try:
data = open(content.temporary_file_path()).read()
except IOError, err:
raise S3Error, 'Unable to read %s: %s' % (filename, err.strerror)

if not content.content_type:
content_type = mimetypes.guess_type(filename)[0]
if content_type is None:
content_type = 'text/plain'
else:
content_type = content.content_type

perm = self.options['default_perm']

res = self.conn.put(
self.options['bucket'],
filename,
S3.S3Object(data),
{
'x-amz-acl': perm,
'Content-Type': content_type
}
)

if res.http_response.status != 200:
raise S3Error, 'Unable to upload file %s: Error code %s: %s' % (filename, self.options['bucket'], res.body)


content.filename = filename
content.url = self.url(filename)

return filename

def delete(self, filename):
res = self.conn.delete(self.options['bucket'], filename)
if res.http_response.status != 204:
pass
#raise S3Error, 'Unable to delete file %s' % (filename)

return (res.http_response.status == 204)

def path(self, filename):
raise NotImplementedError

def open(self, filename, mode):
from urllib import urlopen
return urlopen(self.url(filename))

def get_available_name(self, filename):
import os
basefilename = os.path.splitext(filename)
i = 1
while self.exists(filename):
filename = '%s-%d%s' % (basefilename[0], i, basefilename[1])

return filename

пятница, 23 октября 2009 г.

Подборка ссылок на css стили/layout'ы

Layout's

http://matthewjamestaylor.com/blog/ultimate-3-column-holy-grail-pixels.htm