poniedziałek, 22 marca 2010

piątek, 12 marca 2010

Don't code while designing

There's plenty of comments all over the Internet about "coding now, designing later" made by seasoned developer's. Right now I'm working with my colleagues on a project that needs to be written from scratch. Fighting the need to write something first I decided I won't do any implementation in advance.
My working environment is MS Visual Studio 2008. Recently I found there a feature which turned out very useful in my current situation: Class Diagram. I'm going to implement basic MVC framework as I understand it based on various tutorials I've read. It may not be 100% correct. Sorry.
  1. Create new project in a new solution.
  2. Right click on project's name in Solution Explorer and choose View Class Diagram.
  3. Rename file Class1.cs to Model.cs and change Class1 name to Model.
  4. Add 2 more classes dragging them from Toolbox and giving names: View and Controller.
  5. To add a method to a class right click on class box and choose Add->Method or go to Class Details window and add the new method there. If you don't see Class Details window, right click on a class and choose Class Details.
  6. View should have methods: AttachDataSource and Update.
  7. Controller should have methods: AttachModel, RequestAttachingView, RequestChangeState.
  8. Model should have methods: AttachView, ChangeState, ServeData, UpdateViews
  9. You don't want your classes to directly depend from each other, but use interfaces instead. To extract interface right click on class box, choose Refactor->Extract Interface... and choose methodes and properties that will form an interface.
  10. Extract IView interface from View with methods: AttachDataSource, Update.
  11. Extract IViewDataSource from Model with method ServeData.
  12. Extract IControllable from Model with methods: AttachView, ChangeState.
  13. Now add field viewDataSource to View of type IViewDataSource.
  14. Add field view to Model of type IView.
  15. Add field controlledModel to Controller of type IControllable.
  16. For some more readability you can right click on a field and choose Show as Association.
Your current state should be something like this:
Hosted by imgur.com
Notice you didn't write anything in code yet. Next step will be implementation.

piątek, 5 marca 2010

Python i wykrycie beatu

W zasadzie nie wiem jak przetłumaczyć "beat" - uderzenie, rytm? Napisałem skrypt szukający beatów w pliku dźwiękowym. Jako materiał do analizy posłużyło pierwszy 10 sekund piosenki. Beat zdefiniowany jest jako skok chwilowej energii sygnału, co odbierane jest przez ucho jako głośniejszy dźwięk.
Więcej informacji tutaj: http://www.gamedev.net/reference/programming/features/beatdetection/
__author__ = "daniel"
__date__ = "$2010-03-04 00:21:00$"

from scipy.io import wavfile
import matplotlib.pyplot as pyplot
import numpy

if __name__ == "__main__":
# wczytanie pliku
fs, dane = wavfile.read("/home/daniel/Muzyka/steady10s.wav")
# laczenie dwoch kanalow w jeden
print dane.shape
dane = dane[:, 0] / 2.0 + dane[:, 1] / 2.0
# normalizacja
dane = dane / max(dane)
# obliczanie energii przenoszonej przez sygnal
dane = dane**2


# o tyle probek bedziemy skakac w czasie analizy
k = fs / 10
# dlugosc okna analizy
N = 2 ** 10
i = 0
# ilosc probek w pliku
length, = dane.shape
# const, ile razy wieksza musi byc wartosc energii sygnalu zeby uznany byl za beat
C = 2
srednia = []
# w ktorych momentach wykryto beat
beats = []
while i*k+N <= length:
srednia.append(abs(dane[i*k:i*k+N-1].mean()))
# sprawdzamy ostatnie 42 usrednienia, czyli ~1s
if (sum(srednia[-42:])/42 * C < srednia[-1]):
#print "Beat @", i*k+N/2, "i:", i
beats.append(i)
i+=1

srednia = numpy.array(srednia)
# skalowanie ybeats do 2-krotności średniej energii w danym punkcie (dla przejrzystosci)
ybeats = numpy.ones(shape=len(beats))
for i, b in enumerate(beats):
ybeats[i] *= srednia[b] * 2

# rysowanie wykresów (mocno podobne do matlaba)
pyplot.plot(srednia)
pyplot.hold(True)
pyplot.stem(beats, ybeats, 'k')
pyplot.title("Beats")
pyplot.savefig("/home/daniel/Obrazy/steady10sbeats.png")
pyplot.show()
A oto wynik: Hosted by imgur.com Szczęśliwym trafem Steady as she goes ma bardzo wyraźny rytm na początku, więc łatwo go wykryć. Kolejnym krokiem będzie analiza trudniejszego materiału.

Python i analiza dźwięku

Skrypt analizujący głośność dźwięku zapisanego w pliku wav napisany w Pythonie. Obliczana jest wartość średnia w oknie o długości N. Kolejne okna to k:k+N-1, 2*k:2*k+N-1, ... , gdy k < N to okna się nakładają. Na końcu z pomocą biblioteki matplotlib rysowany jest wykres głośności.
__author__ = "daniel"
__date__ = "$2010-03-04 00:21:00$"

from scipy.io import wavfile
import matplotlib.pyplot as pyplot

if __name__ == "__main__":
# wczytanie pliku
fs, dane = wavfile.read("/home/daniel/Muzyka/labedzie.wav")
# laczenie dwoch kanalow w jeden
dane = dane[:, 0] / 2.0 + dane[:, 1] / 2.0
# normalizacja
dane = dane / max(dane)

# o tyle probek bedziemy skakac w czasie analizy
k = fs / 10
# dlugosc okna analizy
N = 2 ** 13
i = 0
# ilosc probek w pliku
length, = dane.shape
srednia = []

while i * k + N < length: srednia.append(abs(dane[i*k:i*k+N-1].mean())) i+=1 pyplot.plot(srednia) pyplot.title("Wykres glosnosci") pyplot.show()

poniedziałek, 1 marca 2010

Kompilacja kernela 2.6.9 na RedHat 8.0

RedHat 8.0 zainstalowałem z 5 płyt CD z których w czasie instalacji potrzebne są chyba tylko 2 pierwsze.
W trakcie instalacji pozaznaczałem, że chcę mieć zainstalowane narzędzia programistyczne (m. in. kernel development).

Po ściągnięciu i rozpakowaniu kernela podawałem kolejno komendy:
make mrproper
make menuconfig (tu trzeba pamiętać, żeby obsługa ext3fs była wbudowana w kernel, a nie jako moduł, ponieważ partycja boot jest w ext3)
make dep
make clean
make bzImage
make modules
make modules_install (jako root, i nie "make module_install"!!!)

/sbin/mkinitrd /boot/initrd-2.6.9 2.6.9

cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.9
cp System.map /boot/System.map-2.6.9
ln -s /boot/System.map /boot/System.map-2.6.9

W pliku /boot/grub/grub.conf należy dodać wpis:
title Red Hat Linux (2.6.9)
root (hd0,0)
kernel /vmlinuz-2.6.9 ro root=LABEL=/
initrd /initrd-2.6.9.img

Błędy:
>> depmod can't open /lib/modules/2.4.18-14/modules.dep for writing
>> Warning: you may have to install module-init-tools
Rozwiązanie jest takie jak w warning - zainstalować module-init-tools. Przeprowadzi przez to ten poradnik: http://www.linuxquestions.org/linux/answers/Applications_GUI_Multimedia/How_to_Compile_2_6_kernel_for_RedHat_9_8 w krokach 2:4.

Grub: nie można znaleźć pliku, error 15. Czy na pewno przekopiowany jest bzImage i System.map ? Ścieżka powinna zaczynać się od /, a nie od /boot/ - patrz NOTICE w grub.conf.
Błąd "pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed" oznacza, że obsługa ext3fs nie jest wbudowana w kernel. Trzeba ją dodać z pomocą "y" w kroku z make menuconfig.

Teraz pozostaje tylko restart i użycie nowego kernela. Mi podczas wstawania systemu wyskoczyła tylko niepokojąca mnie informacja o jakichś problemach z eth0, ale do projektu nie będzie mi to potrzebne najprawdopodobniej, więc na razie się nie martwię.