воскресенье, 29 мая 2011 г.

Проблемы со звуком в wine

Что-то странное произошло со звуком в wine, пока я ковырялся с идеей записать через audacity мелодию с nosefart (проигрыватель музыкальных файлов для nes). Сам-то процесс описан тут, но ничего интересного не получилось.

Попутно оказалось, что /dev/dsp в убунту 11.04 отсутствует, зато можно эмулировать oss через alsa примерно так: поставить из репозитория пакет alsa-oss и запускать программы командой
aoss nosefart myFile.nsf

А с wine помогло следующее: в winecfg во вкладке "Аудио" поставил DirectSound - аппаратное ускорение - эмуляция, и вроде, всё запищало нормально.

пятница, 20 мая 2011 г.

Запись Audio CD под linux

Создать образ аудио-диска:
cdrdao read-cd -v 2 --device /dev/dvdrw --read-raw --datafile imagen.bin imagen.toc

Записать образ на болванку:
cdrdao write -v 2 --device /dev/dvdrw --speed 4 --buffers 64 imagen.toc

вторник, 17 мая 2011 г.

Установить часовой пояс из командной строки

через GUI:
control.exe timedate.cpl

через командную строку:
rundll32.exe shell32.dll,Control_RunDll timedate.cpl,,/Z Russian Standard Time
rundll32.exe shell32.dll,Control_RunDll timedate.cpl,,/Z N. Central Asia Standard Time
либо
control.exe timedate.cpl,,/Z N. Central Asia Standard Time
(список часовых поясов: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\)

Кстати, посмотреть настройки часового пояса, в частности, можно тут:
HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation

под Win7, говорят, вообще есть специальная утилита:
tzutil.exe /l -посмотреть список часовых поясов
tzutil.exe /g -посмотреть настройки часового пояса
tzutil.exe /s "Russian Standard Time" -установить часовой пояс

среда, 4 мая 2011 г.

воскресенье, 1 мая 2011 г.

Обновление Debian с Lenny до Squeeze

Согласно красивой старинной легенде можно обновить свой рабочий, но "морально устаревший" Debian при помощи следующей последовательности действий:
1. меняем в файле /etc/apt/sources.list все вхождения lenny на squeeze (в vim это делается так :%s/lenny/squeeze/gi)
2. обновляем список пакетов: sudo apt-get update
3. обновляем менеджер пакетов: sudo apt install apt dpkg aptitude
4. обновляем систему: sudo apt-get dist-upgrade
и, казалось бы, всё...Фигушки. Есть другая красивая легенда, что на этом всё только начинается.

Перво-наперво, строка:
deb http://volatile.debian.org/debian-volatile squeeze/volatile main contrib non-free
оказывается, не работает, и нужно использовать:
deb http://ftp.debian.org/debian squeeze-updates main

Далее начались чудеса при обновлении. А именно, apt-get чего-то там пошерстил часа два, а потом тихо умер, пожаловавшись на "слишком много ошибок". Выяснилось, что все беды - из-за заглючившего shared-mime-info. Глючил он примерно так:
Unknown media type in type 'all/all'
Unknown media type in type 'all/allfiles'
Unknown media type in type 'uri/mms'
Unknown media type in type 'uri/mmst'
Unknown media type in type 'uri/mmsu'
Unknown media type in type 'uri/pnm'
Unknown media type in type 'uri/rtspt'
Unknown media type in type 'uri/rtspu'
Unknown media type in type 'fonts/package'
Unknown media type in type 'interface/x-winamp-skin'
Окаалось, это - известный баг. Решением было найти в /usr/share/mime/packages/kde.xml все упоминания соответствующих типов и поудалять их. Правда, после этого ошибка всё равно осталась, но зато одна:
update-mime-database.real: undefined symbol: g_malloc0_n
Эту проблему удалось не решить, но обойти, прописав в начало скрипта:
/var/lib/dpkg/info/shared-mime-info.postinst
волшебную команду exit 0
(как оказалось впоследствии, g_malloc0_n свидетельствует о том, что не сработало обновление пакета libglib2.0-0, а старая версия <= 2.24, и эту самую g_malloc0_n не содержит. Пришлось качать пакет вручную, удалять из /usr/lib/ упоминания о libglib и обновляться apt-get -f install новый_libglib.deb)

Зато у меня теперь есть Squeeze! С дикой текстовой консолью при загрузке (в середине процесса перескакивает с tty1 на tty5, говорят, лечится заменой в файле /etc/default/bootlogd строки BOOTLOGD_ENABLE=Yes на строку BOOTLOGD_ENABLE=No - нифига), с какой-то графической байдой в grub (правда, помогает вот эта подсказка), с тормозящим KDE или неработающим Xfce, а так всё хорошо, буду изучать дальше...

И, да! Я научился отключать и восстанавливать загрузку иксов по умолчанию:
update-rc.d -f gdm remove или update-rc.d -f kdm remove
update-rc.d -f gdm defaults или update-rc.d -f kdm defaults
соответственно.

воскресенье, 24 апреля 2011 г.

Отправка SMS через usb-модем с использованием Python

После окончательного перехода на убунту отказалась работать .NET-фреймворковская программка, через которую работала отправка SMS-сообщений. Возникла естественная мысль переписать её, скажем, на питоне. Благодаря подсказкам это оказалось совсем тривиально:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import serial
import time
import random

# процедура для отправки строки в модем и получения ответа
def str_send (ser, textline):
print "<<" + textline
ser.write(textline)

out = ''
N = 10
while N > 0:
time.sleep(1)
while ser.inWaiting() > 0:
out += ser.read(1)

if ('OK' in out) or ('ERROR' in out) or ('>' in out):
print ">>" + out
N = 1

N -= 1

# функция преобразования телефонного номера в формат, пригодный для SMS
def PhoneNumberToSMS(number):
number += 'F'
result = '0B' + '91'
i = 0
while i < len(number):
result += number[i+1] + number[i]
i += 2
return result

# функция, кодирующая юникодную строку в формат SMS
def TextToSMS(text):
b = text
result = ''
i = 0
while i < len(b):
o = ord(b[i])
result += ("%0.2X" % (o/256)) + ("%0.2X" % (o%256))
i += 1
return result

# вводим с консоли сообщение и переводим его в юникод
message = raw_input('Текст сообщения:\n')
message = message.decode('utf-8')

# если сообщение большое - режем его на кусочки для механизма конкатенации SMS
chunks = []

if len(message) > 70:
while len(message) > 66:
chunks.append(message[:66])
message = message[66:]

if len(message) > 0:
chunks.append(message)

# готовим номер группы сообщений и устанавливаем 6-й бит SMS_SUBMIT_PDU
SMS_SUBMIT_PDU = "11"
CSMS_reference_number = ""
if len(chunks) > 1:
SMS_SUBMIT_PDU = "51"
CSMS_reference_number = "%0.4X" % random.randrange(1,65536)

# связываемся с модемом
ser = serial.Serial("/dev/ttyUSB0", 115200, timeout=1)
ser.open()

# устанавливаем нужный формат передачи данных
str_send(ser, 'AT+CMGF=0\r')

# передаем кусочки сообщения
i = 1
for chunk in chunks:
emessage = TextToSMS(chunk)
if CSMS_reference_number != "":
emessage = "06" + "08" + "04" + CSMS_reference_number + \
("%0.2X" % len(chunks)) + ("%0.2X" % i) + emessage
sms = \
"00" + \
SMS_SUBMIT_PDU + \
"00" + \
PhoneNumberToSMS("7383XXXXXXX") + \
"00" + \
"08" + \
"AA" + \
"%0.2X" % (len(emessage)/2) + \
emessage
str_send(ser, 'AT+CMGS=' + str(len(sms)/2-1) + '\r')
str_send(ser, sms + '\x1A')
i += 1

# отвязываемся от модема
ser.close()

NB. import serial заработает только если будет установлен модуль pySerial (aptitude install python-serial)

Python CGI

Полезная информация:
http://www.tutorialspoint.com/python/python_cgi_programming.htm
http://kairblog.ru/post/7033/