17 grudnia 2009

Roomba - tańczący robot - odkurzacz

Dziś moją uwagę przykuwa pewien wynalazek, który od wielu lat jest sławiony na świecie w robotycznych klimatach, u nas jednak nadal dość dziki. Mam na myśli odkurzacz, który jest robotem i potrafi odkurzać w tańcu - oto Roomba.



Zacnym krokiem w kierunku rozwoju tego robota jest otwarty protokoł komunikacyjny oraz książka Hacking-Roomba.

Ciekawostką jest, że otwarte API pozwala na programowanie przy pomocy języka Python - ciekawe czemu autorzy wybrali węża ... byćmoże na prostotę kodowania ;)

Przeraża cena jak na polskie realia :-) ok. 4500 PLN to dla wprawnego jednoosobowego elekronika / programisty / robotyka brzmi jak miesięczna pensja po 8 h dziennie w celu zbudowania kopii urządzenia ... pytanie, czy jest
to możliwe pozostawiam czytelnikowi :-)



POVDE Roomba Spec Spot from POV Previs on Vimeo.



Pozwolę sobie zacytować tutaj informacje handlowe, które ogólnie charakteryzują robota:

Sztuczna inteligencja

Zasłońmy sobie oczy i spróbujmy odkurzyć nieznane sobie mieszkanie. W takiej właśnie sytuacji znajduje się Roomba podczas pracy.


Algorytm sprzątania jest jedną z najbardziej strzeżonych tajemnic naukowców z firmy iRobot. Jest to wiedza zdobyta w czasie wypraw kosmicznych, w których uczestniczyły roboty skonstruowane przez twórców Roomby. Sygnał na Marsa biegnie kilka minut, więc ręczne sterowanie urządzeniem z Ziemi jest praktycznie niemożliwe. Robot w kosmosie musi radzić sobie sam. Nasze mieszkanie to dla Roomby nic innego jak nieznana przestrzeń Marsa dla wysłanych tam robotów. A jednak Roomba sprząta podłogi z dokładnością pokrycia powierzchni do 99,97%. Dla porównania człowiek tradycyjnym odkurzaczem w tym samym czasie sprząta niecałe 80% (badania Intertec). Roomba ma w sobie prawdziwy komputer pokładowy. To najinteligentniejsze urządzenie w naszych domach. Roomba zaczyna sprzątanie ruchem spiralnym, następnie jedzie wzdłuż ścian i wokół mebli. Sprząta pod łóżkami i meblami wyższymi niż 10 cm.


Czujniki

Roomba orientuje się w przestrzeni przy pomocy czujników dotykowych, podczerwieni oraz radiowych. Dzięki nim nie spada ze schodów, podąża wzdłuż ścian, objeżdża nogi od krzeseł, stołów i łóżek dokładnie wokół nich sprzątając. Roomba przy pomocy podczerwieni komunikuje się ze stacją dokującą i wirtualnymi latarniami, które prowadzą ją po domu. Roombę można programować na każdy dzień.



Zasilanie

Pomimo posiadania wielu niezależnych silników, Roomba zużywa podczas pracy jedynie 30 Wat, czyli kilkadziesiąt razy mniej energii niż tradycyjny odkurzacz. Zawdzięcza to oszczędnemu akumulatorowi, który po około 3 godzinnym ładowaniu potrafi pracować od 1 do 3 godzin, zależnie od rodzaju sprzątanej powierzchni oraz liczby mebli w pokoju. Roomba jest tak oszczędna i zarazem cicha, ponieważ posiada specjalnie dla niej zaprojektowany, niesłychanie wydajny 3-stopniowy system czyszczenia.

3-stopniowy system czyszczenia


Wirująca szczotka boczna wymiata brud wzdłuż ścian i z narożników. Dwie przeciwbieżnie obracające się szczotki główne (gumowa i z włosia) zbierają brud z podłogi i wykładzin. Najdrobniejszy kurzu zasysa podciśnieniem gumowa ssawa, która zużywa dużo mniej prądu niż tradycyjny odkurzacz. Roomba nie potrzebuje tak dużej siły ssania, ponieważ nie przepycha brudu przez długą rurę, tak jak zwykłe workowe odkurzacze. Posiadacze tradycyjnych odkurzaczy workowych doskonale znają nieprzyjemny zapach wydobywający się z urządzenia w czasie sprzątania. Temu zapachowi towarzyszy najdrobniejszy kurz, który wydostaje się poprzez otwory w workach i filtrach. W worku jest ciepło, ciemno i mnóstwo pożywienia dla roztoczy, bakterii i grzybów. Podczas sprzątania takim odkurzaczem zatruwamy powietrze w naszych domach najgroźniejszymi znanymi medycynie alergenami: odchodami roztoczy, zarodnikami grzybów i toksynami produkowanymi przez bakterie. Alergeny te są źródłem alergii, astmy i obniżenia odporności organizmu na inne choroby.

Szczotkowanie jest najlepszą metodą sprzątania, o czym przekonać się możemy obserwując maszyny czyszczące lotniska, supermarkety, czy ulice. Gdyby używały do sprzątania przepływu powietrza, to ludzi zasypywałaby grad drobnego piasku i kamieni w odległości kilkudziesięciu metrów za taką maszyną.

7 listopada 2009

Pobujaj w chmurach z Python lub PHP przy pomocy libcloud

Cloud computing (przetwarzanie sieciowe w chmurze) odnosi się do wielu dziedzin informatyki i przez ostatnie kilka lat stał się elementem ofert wielu poważnych firm hostingowych. Efekt to wiele różnych znaczeń przetwarzania w chmurach i wiele różnych interfejsów programistycznych API. Jedno jest pewne są takie zastosowania, w których chmury obliczeniowe ratują przedsiębiorców.



Faktem jest, że takie korporacje jak Amazon,
Google, Microsoft od wielu lat przed pojawianiem się tematu wykorzystywały chmury lub tzw. gridy w swoich infrastrukturach sieciowych, lecz dziś mogą mocami obliczeniowymi cieszyć również klienci indywidualni.

Jako przykład praktyczny wykorzystam zlecenie jakie miałem okazję wykonać ostatnio. Klient potrzebował zaindeksować i otagować kilka gigabajtów danych dostarczonych w postaci plików tekstowych na DVD-ROM. Algorytm indeksacji nie jest tajny, więc wspomnę tylko, że danych źródłowych docelowy miał kilka tytułów, kilka opisów w różnych językach oraz powiązane atrybuty. Po krótkim reserchu okazało się, że na maszynie lokalnej oraz na dostępnym wirtualnym hostingu skrypty muszą działać dokładnie ok. tygodnia, aby przetworzyć wszystkie dane i utworzyć tabelę wyników. Uwzględniłem tutaj tabele wyników pośrednich dla optymalizacji oraz cachowanie często powtarzających się atrybutów w pamięci RAM.



Jak na złość zlecenie zostało zaplanowane na 5 dni i klient był nieugięty w terminie. Postanowiłem dać zarobić właścicielom chur obliczeniowych i skorzystałem z usługi Amazon. Jedyne co zrobiłem, to wypożyczyłem moc obliczeniową z bazą danych mysql i cachowaniem na 3 dni. Koszt był wystarczająco niski i udało się wykorzystując chmury uzyskać bardzo zadowalające wyniki. Co ciekawe rozliczałem się za megabajt transferu oraz czas procesowa w używaniu bazy danych mysql ;-) Polecam - na pewno nie stracicie, ale będzie to pozytywne zauroczenie mocami, jakimi dysponuje taka chmurka.
Aby móc efektywnie korzystać z serwerów wirtualizacji i zrobić pierwszy krok do korzystania z przetwarzania sieciowego, należy zoptymalizować sprzęt oraz oprogramowanie pod kątem zbalansowania poboru mocy oraz wydajności. Uzyskanie odpowiedniej równowagi eliminuje problem przeciążenia serwerów, a zasoby dla aplikacji i oprogramowania mogą być przydzielane w zależności od potrzeby, by zapewnić ich optymalne działanie.




Niniejszą wypowiedzią chciałbym skierować uwagę i odnotować istniejące,
zarazem promowane na rynku usługi i API upraszczające używanie chmur do minimum.
Skupić się warto na tym, że niektóre API obsługują wielu providerół chmur.
Oto lista providerów chmur, z którymi warto się zapoznać:

http://incubator.apache.org/libcloud/ - zestawienie wspieranych chur przez API

http://www.simplecloudapi.org/ http://www.simplecloudapi.org/api PHP class API http://www.simplecloudapi.org/api/simple-queue

http://deltacloud.org/ http://deltacloud.org/api.html

http://webhosting.pl/print/Zend.oferuje.deweloperom.PHP.interoperacyjnosc.dla.chmur

http://incubator.apache.org/libcloud/getting-started.html Python example





Materiały:

Matt Mullenweg o roli Open Source w technologii chmur

Dokument PDF na temat konstruowania chmur obliczeniowych

Cloud computing - MultiCore klucz do wirtualizowanych systemow

5 listopada 2009

CSSPrism - edycja arkusza styli CSS na stronie www

Wszystkim lubiącym praktyczne aplikacje sieciowe polecić chciałbym CSSPrism. Sprytna aplikacja naspiana w języku Python i przy pomocy framework a Django oraz jQuery.



Prezentowany powyżej obrazek przedstawia stronę startową projektu CSSPrism - inspektora spektrum kolorów ;) Wprowadzamy adres URL do naszych styli, które chcemy edytować. Poniżej prezentuje pozostałę zrzuty ekranów ukazujące prostotę oraz czytelny interfejs użytkownika GUI.



12 września 2009

Puppet - zarządzanie farmami serwerów w centralnym miejscu

Kiedy poczujecie potrzebę zarządzania np: 17-toma, 40-toma, 150-cioma backendowymi serwerami lub podobną farmą to z wielką dozą radości przyjmiecie na swój host nr.1 takie narzędzia jak Capistrano oraz Puppet.



Oczywiście jak każdy administrator nie lubimy powtarzania wielokrotnego tych samych czynności :-) Jak Puppet coś tam robi na całej farmie w tym czasie można obejrzeć np: kolejny odcinek Big Bang Theory i spokojnie później przejrzeć logi :-) To oczywiście baaardzoooo pozytywny plan, bo przy kilkudziesięciu i więcej serwerów należy uwzględnić indywidualności w maszynach, które lubią się zdarzać np: w Piątek o 16-tej ;-) A niekiedy jedna maszyna mniej to znacznie większe obciążenie, któremu w weekend może nie podołać farma np: przy sprzedaży świątecznej w większym sklepie, w systemie aukcyjnym, wrzucania wielu fotek przez użytkowników na portalu społecznościowym etc.

Moim zdaniem warto poznać Puppet'a i się z nim zaprzyjaźnić ;)

Materiały:

http://docs.reductivelabs.com/guides/installation.html
http://reductivelabs.com/trac/puppet/wiki/BigPicture
http://zimowisko.macuk.pl/2010/puppet.pdf
http://www.ploug.org.pl/konf_08/materialy/pdf/02_Masewicz.pdf
http://reductivelabs.com/products/puppet/
http://changelog.complete.org/archives/519-thoughs-on-cfengine-bcfg2-and-puppet
http://dozzie.jogger.pl/2009/06/25/centralizacja-zarzadzania-serwerami-linuksowymi/
http://augeas.net/

4 lipca 2009

interakcja + dzwięk + visual framework = reactable

W świecie geeków oraz szeroko rozumianym świece akademickim istnieją różne zabawki dla dużych dzieci. Dla jednych włąściwie tylko zabawki, dla innych prace naukowe oraz jedyna pasja. Jedną z nich jest fantastyczne przedsięwzięć są festiwale muzyki elektronicznej z niestandarowymi instrumentami o nazwie Reactable.



W mniemaniu umuzykalnionej i wykształconej osoby grającej na klasycznym instrumencie może istnieć bariera do dźwięków, które nie wywodzą się z czystej klasyki. Na szczęście takiego problemu nie mają ludzie tworzący projekt Reactable. Postanowili oni stworzyć technologie wsprartą dedykowanym frameworkiem do zabawy z dźwiękiem.
Wymyślili do teogo celu następujące rozwiązanie. Wymagany jest do tego celu projektor graficzny + kamera + stół z szybą. Pod stołem umieszczony jest projektor rzutujący od dołu na stół obrazy oraz zwierciadło półprzeźroczyste z odpowiednio ustawioną kamerą, która widzi blat stołu. Umieszczając na blacie krążki z naklejonymi od dołu kształtami dołączamy do brzmień kolejne tony, instrumenty, efekty. Wówczas kamera przekazuje obraz do dedykowanego oprogramowania i steruje projekcją wideo. Stąd niesamowite efekty wizualizacji. Dźwięk wytwarzany jest na podstawie algorytmów, które pozwalają miksować i synchronizować brzmienia jakie posiadają zaprogramowane krążki.



Całość daje niesamowicie gwiezdny efekt :-) Popatrzcie sami:













Materiały dodatkowe:
Reactable - media
ReactiVision framework

2 lipca 2009

newt - konsolwe UI może być lżejsze od ncurses

W trosce o banalne wykorzystania konsoli do celów wybrania kilku parametrów z listy dostępnych, autorzy biblioteki programistycznej newt udowodnili, że wcale nie musimy pisać niesamowicie złożonego kodu. Okazuje się, że biblioteka newt jest tym, czego potrzebuje czasmi każdy programista i ułątwia znacząco życie w pisaniu dedykowanych narzędzi z czytelnym interfejsem tekstowym zawierającym formularze.

Dla przykładu, gdy będziemy posiadali potrzebę napisania kilku formularzy dla konsoli - o skali trudności jak w poniższych przykładach - zachęcam do użycia biblioteki newt w wersji dla języka Python - python-newt.

W prostocie siła - zapraszam do przeglądu możliwości na kilku poniższych fotkach.











Poniżej kod wjęzyku Python umożliwiający utworzenie prezentowaych na obrazkach formularzy:


#!/usr/bin/python

from snack import *
import sys

def help(screen, text):
raise ValueError, "foo"
ButtonChoiceWindow(screen, "Help", text, help = "Help on help")

t = TextboxReflowed(25, "Some text which needs to be wrapped at a good place.")
li = Listbox(5, width = 20, returnExit = 1)
li.append("First", "f")
li.append("Second", "s")
li.insert("Another", "a", "f")
li.delete("a")
ct = CheckboxTree(5, scroll = 1)
ct.append("Colors")
ct.addItem("Red", (0, snackArgs['append']), "red item key")
ct.addItem("Yellow", (0, snackArgs['append']))
ct.addItem("Blue", (0, snackArgs['append']))
ct.append("Flavors")
ct.addItem("Vanilla", (1, snackArgs['append']))
ct.addItem("Chocolate", (1, snackArgs['append']))
ct.addItem("Stawberry", (1, snackArgs['append']))
ct.append("Numbers")
ct.addItem("1", (2, snackArgs['append']))
ct.addItem("2", (2, snackArgs['append']))
ct.addItem("3", (2, snackArgs['append']))
ct.append("Names")
ct.addItem("Matt", (3, snackArgs['append']))
ct.addItem("Shawn", (3, snackArgs['append']))
ct.addItem("Wilson", (3, snackArgs['append']))
ct.append("Months")
ct.addItem("February", (4, snackArgs['append']))
ct.addItem("August", (4, snackArgs['append']))
ct.addItem("September", (4, snackArgs['append']))
ct.append("Events")
ct.addItem("Christmas", (5, snackArgs['append']))
ct.addItem("Labor Day", (5, snackArgs['append']))
ct.addItem("My Vacation", (5, snackArgs['append']))
b = Button("Button")
e = Entry(15, "Entry")
l = Label("label")
cb = Checkbox("checkbox")
r1 = SingleRadioButton("Radio 1", None, 1)
r2 = SingleRadioButton("Radio 2", r1)

def something():
print hello

screen = SnackScreen()

screen.helpCallback(help)

foo = EntryWindow(screen, 'Title', 'This is some text for the entry window',
['prompt', 'more', 'info'])

lbcw = ListboxChoiceWindow(screen, 'Title 2',
'Choose one item from the list below:',
('One', 'Two', 'Three', 'Four', 'Five'), default = 2,
help = "Help for a listbox")

sg = Grid(2, 3)
sg.setField(b, 0, 0, anchorLeft = 1)
sg.setField(e, 1, 0, (1, 0, 0, 0), anchorLeft = 1, anchorTop = 1)
sg.setField(l, 0, 1, (0, 1, 0, 0), anchorLeft = 1)
sg.setField(cb, 1, 1, (1, 1, 0, 0), anchorLeft = 1)
sg.setField(r1, 0, 2, (0, 0, 0, 0), anchorLeft = 1)
sg.setField(r2, 1, 2, (1, 0, 0, 0), anchorLeft = 1)

g = Grid(1, 3)

g.setField(t, 0, 0)
g.setField(li, 0, 1, (0, 1, 0, 1))
g.setField(sg, 0, 2)

g.place(1, 1)

screen.gridWrappedWindow(g, "title")

f = Form("This is some help")
f.add(li)
f.add(b)
f.add(e)
f.add(l)
f.add(cb)
f.add(r1)
f.add(r2)
f.add(t)

res = f.run()

screen.popWindow()

g = GridForm(screen, "Tree", 1, 2)
g.add(ct, 0, 0, (0, 0, 0, 1))
g.add(Button("Ok"), 0, 1)
g.runOnce()


screen.finish()

print "val", e.value()
print "check", cb.value()
print "r1", r1.selected()
print "listbox", li.current()
# returns a tuple of the wrapped text, the actual width, and the actual height
print res

print foo
print 'lbcw', lbcw
print "ct selected", ct.getSelection()
print "ct current", ct.getCurrent()


Ponadto dla wymagających istnieje też port formularzy do konsoli graficznej GTK - gnewt
Dostępny jest też tutorial do newt.



17 czerwca 2009

Przyspieszenie aplikacji z Google Perftools

Wielu ludzikom, którzy nie biorą na poważnie optymalizacji lub nie mają z nią potencjalnych problemów na codzień takie pojęcie jak profilowanie bywa długo obce. Mogą tylko się z tego cieszyć, bo w rękach ich bardziej doświadczonych kolegów od profilowania aplikacji spoczywa pewna magiczna moc.

Czasami bywamy pytani o to, jak można coś zrobić szybciej lub napisać tak, aby działało szybciej na tej samej maszynie. W sytuacji w której tematem optymalizacji jest jakiś nieskomplikowany język skryptowy typu Python, PHP, czy Ruby mamy do dyspozycji napisanie modułu w języku C. Zasadniczo te języki są napisane w C (C++) i zakładamy, że moduł napisany w języku źródłowym, w którym napisano dany język będzie szybszy. Sprawa się nieco komplikuje, gdy nie mamy takiego pomostu jak możliwość napisania kodu modułu w kodzie źródłowym języka. Jeszcze częściej nie mamy wpływu na sposób zarządzania pamięcią oraz wielowątkowością w danym języku skryptowym. Posłużę się dla przykładu językiem PHP, który posiada źródłową konwencję nazwaną Zend Engine. Jest to narzucony silnik stworzony poprzez firmę Zend i rozwijany przez deweloperów woluntariuszy na całym świecie. Niestety naleciałości, które ciągną się za nim od wielu lat ograniczają znacząco działanie tak istotnych mechanizmów języka jak wielowątkowość i odśmiecanie pamięci. Język ten w samych swoich źródłach jest pod tym kątem niedojrzały. Inna sytuacja jest w przypadku języka Python i Ruby. Słynna translacja języka Python w samym RPython (Restricted Python) - statycznym podzbiorze Pythona, który można skompilować do kodu bajtowgo Javy, CLR czy C, czyli projekt PyPy. Pozwala na bardzo rozwinięte horyzonty działania, które dla niewiedzących prowadzić mogą do definowania np: własnych zasad odśmiecania pamięci, sposobu działania wielowątkowości i całej gamy innych drobiazgów, które stawiają dość wysoko język Python na podeście :-) Nie znam dokładnie źródeł języka Ruby, ale widziałem, że są czytelne i można po nich wywnioskować, że doruwnuą projektowi takiemu jak Python, ale też zostawiają w tyle PHP Zend Engine.

Rozpisałem się o ogólnym spojrzeniu na źródła powszechnych języków skryptowych, aby naświetlić tylko, że dla niektórych języków temat optymalizacji, czyli profilowania na poziomie źródeł języka jest dość ograniczony. Lecz z kolei są takie języki skryptowe, które można profilować na poziomie wątków oraz zarządzania pamięcią. Projekty w ramach których dość czytelnie to zaprezentowano zawierają materiały dodatkowe. Wspomnę jeszcze, że nasz ulubiony googiel też się podpisuje do takich praktyk i posiada dość spore doświadczenie w tej materii. W soich serwerowniach dobierają procesory oraz z tego co mi wiadomo na farmach maszyn odbywa się również profilowane kompilowanego oprogramowania, aby jak najwięcej wycisnąć. Jest to jedna z nielicznych firm, która używa selekcjonowanych i wygrzewanych partii procesorów Pentium III oraz serwerownie stanowią klastry słabszych maszyn o przewidywalnej mocy obliczeniowej oraz przewidywalnym zużyciu energii. Skoro google udowodniło, że można nie kupować drogich serwerów IBM, czy Suna, czy tez HP jestem zgodny z nimi, że wówczas bez profilowania oraz optymalizacji zarówno hardware a przede wszystkim software nie wiele zdziałamy.

Przechodząc do części praktycznej chciałbym uchylić fragment tajemnicy przyspieszania aplikacji z Google Perftools. Materiał na temat przykładu profilowania znajdziecie tutaj.


Życzę pomyślnej lektury i zapraszam do podzielenia się refleksjami na ten temat.


Materiały dodatkowe:

Mastering the Art of Indexing

High Availability and Scalability Patches from Google

More on using Google Perftools with MySQL


Using the Google Perftools to speed up your MySQL server


Using the Google Perftools to speed up your MySQL server - example

Fast, multi-threaded malloc() and nifty performance analysis tools

Simple HTTP server for use with google-perftools pprof

TCMalloc : Thread-Caching Malloc


prof/PerfTools


This page describes how to setup and use PerfTools.

This CPU profiler used at Google

Spinlock


Practical Concurrency Patterns: Spinlock


Practical Concurrency Patterns: Lock-Free Operations

Spinlock example code

The performance of spin lock alternatives for shared-memory multiprocessors

HP - Spinlock Pool Parameter Summary

.NET Framework Class Library - SpinLock Structure

The Hoard Memory Allocator and Memory Management Studies

Generate Ruby Profiling Charts With Perftools

Profiling Ruby With Google’s Perftools

Distributed Innodb Caching with memcached

InnoDB: Innovative Technologies for Performance and Data Protection

9 czerwca 2009

Stackless Python - jak zrobić mikrowątki na localhost

Dziś zapraszam do kilku prób zrobienia z naszego lokalhosta maszyny z działającymi w tle mikrowątkami Stackless Python, które potrafią dość wiele zdziałać. Aby dowiedzieć się jak wiele polecam przeczytanie artykułu o grze EVE on-line, która bazuje na tym rozwiązaniu.

Ważnym wprowadzeniem będzie teoria na wikipedii dotycząca Distributed computing. Są różne podejścia do reazlizacji wielowątkowości i jej synchronizajci. Zasadniczo doceniam w tym artykule specyficzne, bo posiadające w API dosłownie kilka funkcji. Zaimplementowanych w taki sposób, że aż się miło testuje i wdraża takie rozwiązanie. Oczywiście porównuję tutaj API systemowe np: WINAPI i POSIX THREADS. Jest z tym nieco zabawy w projektowaniu i kodowaniu, dlatego przedstawiam Stackless Python, który może rowiązać więcej problemów niż tylko wymienione niewygody wielowątkowości w naszym systemie operacyjnym.

Okazuje się, że programowanie wielowątkowe na większą skalę wcale nie musi posiadać skomplikowanego API. Projektanci Stackless Python doskonale o tym wiedzieli i uprościli bazowe elementy API do następujących pojęć:

  • Tasklets

  • The Scheduler

  • Channels


Zacznę od bazowego przykładu, który pokazuje, jak rozpocząć zabawę z tą technologią. Do wykonania poniższego kodu będzie potrzebna obecność w naszym systemie pypy-stackless.

Tasklets są podstawowym budulcem dla stackless. Możesz utworzyć zadania tasklet przez dodanie zwykle funkcji lub metody klasy. Stworzony w ten sposób tasklet zostaje dodany do harmonogramu zadań. Zauważ, że kolejka taskletów i nie działaja, dopóki nie nastąpi wywołanie metody stackless.run().
Oto prosta demonstracja:
# example1.py

import stackless

def print_x(x):
print x

stackless.tasklet(print_x)('one')
stackless.tasklet(print_x)('two')
stackless.tasklet(print_x)('three')

stackless.run()

Uruchamianie przykładu oraz rezultaty działania:

$ pypy-stackless example1.py
one
two
three

Scheduler kontroluje kolejność, w jakiej tasklets są uruchamiane. Jeśli po prostu stworzysz kilka taskletów, będą uruchamiane w kolejności, w jakiej zostały utworzone. W ogólnej praktyce będzie to związane ze stworzeniem i wywołaniem dodanych taskletów za każdą iteracją ogólnego mechnizmu obiegu danych.
Zauważ, że gdy wywołujemy stackless.schedule(), aktywnym tasklet zatrzymuje się i ponownie wstrzykuje się do końca schedulera w kolejce, pozwalając następnemu taskletowi uruchomić się. Gdy wszystkie z aktywnych taskletów zostaną uruchomione, następuje przywoływanie pozostałych. To trwa do zakończenia wszystkich aktywnych taskletów. W ten sposób osiągamy wielowątkowość we współpracy z stackless.
Szybka demonstracja:

# example2.py

import stackless

def print_three_times(x):
print "1:", x
stackless.schedule()
print "2:", x
stackless.schedule()
print "3:", x
stackless.schedule()

stackless.tasklet(print_three_times)('first')

stackless.tasklet(print_three_times)('second')

stackless.tasklet(print_three_times)('third')

stackless.run()

Uruchamianie przykładu oraz rezultaty działania:

$ pypy-stackless example2.py
1: first
1: second
1: third
2: first
2: second
2: third
3: first
3: second
3: third



Channels czyli kanały umożliwiają wysyłanie informacji między tasklets. To realizuje dwie rzeczy:

Pozwala to na wymianę informacji między tasklets.
Pozwala to na kontrolę przepływu egzekucji.

Kolejna szybka demonstracja:


# example3.py

channel = stackless.channel()

def receiving_tasklet():
print "Recieving tasklet started"
print channel.receive()
print "Receiving tasklet finished"

def sending_tasklet():
print "Sending tasklet started"
channel.send("send from sending_tasklet")
print "sending tasklet finished"

def another_tasklet():
print "Just another tasklet in the scheduler"

Uruchamianie przykładu oraz rezultaty działania:
$ pypy-stackless example3.py



Recieving tasklet started
Sending tasklet started
send from sending_tasklet
Receiving tasklet finished
Just another tasklet in the scheduler
sending tasklet finished


Kilkoma słowami chciałbym podsumować opisane rozwiązanie w Stackless Python. Po pierwsze ilość dostępnych funkcji w API oraz sposób ich użycia szczególnie zachęca do zgłębiania i używania (4 - 6 funkcji). Zarazem niesamowitym osiągnięciem jest fakt, że tak wielki projekt gry on-line jak EVE bazuje na tak prostym i wydajnym rozwiązaniu.

Zachęcam do opisania swoich doświadczeń ze Stackless Python w komentarzach, chętnie podyskutuję.

Mariały dodatkowe:

Stackless Python Homepage

why stackless

Is Stackless Python for You?

Introduction to Concurrent Programming with Stackless Python

Wątki


http://www.archivum.info/pl.comp.lang.python/2008-03/msg00119.html

http://forum.gamedev.pl/index.php?action=printpage%3Btopic=6678.0


Kurs Pisania OS

Debug pamięci w Linuksie (pamięć od strony technicznej)

Dynamiczne zarządzanie pamięcią w C bez wycieków

Stackless Python - artykuly

CORBA Guru Steve Vinoski on REST, Web Services, and Erlang

6 czerwca 2009

Max/MSP + Arduino - udźwiękowienie głuchej maszyny

W wielu wymiarach mikroprocesorowych odkryć jest też taki, który powoduje, że głucha, cicha i stara zabawka leżąca w szuflkadzie jaką może być system mikroprocesorowy nagle ożywa i wydaje przeróżne - w tym niesamowite - dźwięki. Mam na myśli adaptacje Adruino w wersji MaxMSP.

Z materiału Arduino VS Max/MSP wynika, że najlepszym softem do zabawy będzie Maxduino. Zabawa może polegać na tym, że rozrysowujemy w aplikacji Max wykres działania / połączenia z systmem generatorem/syntezatorem dźwięku i uploadujemy program do naszej zabawki. Dodatkowe interfejsy mile widziane. Diody RGB, klawisze, czujniki natężenia światła i całą resztę można powiązać z syntezowaniem bitów, które sprawią, że na pozór cichy i bezduszny sprzęt nabierze niesamowitego wydźwięku i będzie w stanie nas zaskoczyć brzmieniem np: z gatunku ambient :-)

Oto kilka przykładów zrealizowanych pomysłów:






















Materiały dodatkowe:

http://www.music.mcgill.ca/~gary/306/week5/serial.html

http://www.tigoe.net/pcomp/code/category/category/MaxMSP

http://www.flickr.com/photos/gudmundsson/3234647715/

http://www.soundplusdesign.com/?p=1305

http://www.soundplusdesign.com/?cat=116

http://www.alimomeni.net/node/204

http://blog.soundsorange.net/2006/08/29/arduino-getting-the-usb-version-up-and-running-on-osx-using-pd/

http://ultranoise.es/blog/?p=213

26 maja 2009

Erlang + PHP - nastała era miksowanych rozwiązań

Jak sami wiecie najlepsze kanapki to takie, które mają wiele smakowitych składników :-)
Takie kanapki można porównać do połączenia technologii PHP oraz Erlang. Kontrast języka skryptowego PHP przeznaczonego do przetwarzania i tworzenia hipertekstu, prostych zadań po stronie serwera oraz ponadczasowego języka funkcyjnego z własnymi mikrowątkami do przetwarzania danych w chmurach obliczeniowych Erlang. Kontrast dość spory, więc postanowiłem sprawdzić, co wynika z zestawienia takich odrębnych tematów.


src: http://www.flickr.com/photos/tobiasschlitt/2644905363/

Niewątpliwie zaletą języka PHP jest jego popularność na sporej liczbie produkcyjnych serwerów serwujących dynamiczny kontekst, możliwość zestawienia połączeń z powszechnymi bazami danych, stały rozwój języka oraz prostota programowania w nim. Do tego spora społeczność znawców oraz zadających stale te same FAQ na forach powoduje mega popularyzację tematyki programowania stron oraz aplikacji internetowych. Przyglądając się rozwojowi języka z perespektywy kilku lat znajdziemy w jednym dość specyficznym temacie dość spory niedosyt. Dokładnie mam na myśli w brak wielowątkowości w języku PHP. Jest to może i śmieszne, ale bywa zgrozą na codzień dla poważniejszej kady developerów PHP. Nie będę rozpisywał się o tym, że takie języki skryptowe jak Python, Ruby, Lua mają wbudowaną obsługę wieloeątkowości ... i to je stawia zupełnie na innym podium ;)

Spoglądając z kolei na język Erlang i jego możliwości tworzenia nieograniczonej ilości wbudowanych mikrowątków, które są niezależne od platformy i wątków systemowych, można wymyślić wart świeczki pomost dla tych technologii. Warto też przytoczyć jakieś dwa przykłady, w których ten język osiągnął popularność i sukces tzn. serwer metakomunikatora ejabberd oraz baza danych Amazon SimpleDB. Chcących poznać pozostałe przykłady polecam wikipedia oraz google :)

Dla chcących wtajemniczyć się w dość ciekawy temat łączenia technologii polecam materiały dodatkowe, w których znajdują się opisy oraz objaśnienia jak takiego powiązania dokonać.

Zapraszam serdecznie chcących podyskutować o wydajności i szczegółach technicznych. Czy używacie w soich projektach takiego rozwiązania ? Czy wiecie może jakie są postępy nasza-klasa.pl we wbudowaniu ejabberd w ich portal ?



Materiały dodatkowe:

Persistent PHP processes in Erlang/OTP

PHP/Erlang aims to be a PHP extension with a simple set of functions for turning a PHP thread into an Erlang C-node

A PHP eval server for Erlang/OTP

peb (Php-Erlang Bridge) is an open-source php extension to run php as an Erlang cnode

Reading Serialized PHP Objects from Erlang

7 maja 2009

R - język statystyczny do wizualizacji danych eksperymentalnych

Pomimo brzmiącego wzniośle tytułu i wielkiej litery R na czątku artykuł nadal dotyczy on dziedziny programowania. Tym razem dotykam nieco odmiennego aspektu - narzędzia do statystycznej analizy danych R, które cieszy się dość sporą popularnością w kręgach naukowych, gdyż cytując wikipedię:
GNU R to język programowania i środowisko do obliczeń statystycznych i wizualizacji wyników.
Każdy czytelnik w tym miejscu może zadawać sobie zasadnicze pytanie:
co można w tym zrobić i dlaczego lepej niżeli w moim języku programowania ?.



Oto kilka cech, które pozostawiają w tyle moje ulubiony języki programowania i skłaniają mnie do użycia języka R:

  • dostarcza szeroką gamę technik statystycznych (liniowe i nieliniowe modelowanie, klasyczne testy statystyczne, analiza szeregów czasowych, klasyfikacja, grupowanie, etc)

  • łatwość z jaką można tworzyć dobrze zaprojektowane wykresy z jakością nadającą się do publikacji. Dotyczy to także symboli i formuł matematycznych

  • repozytorium pakietów CRAN, które zawiera ponad 1500 gotowych bibliotek do użytku w naszych statystykach - zaimplementowana jest spora liczba metod oraz przekształceń statystycznych

  • tekstowa i graficzna konsola obsługi, jak również możliwość uruchamiania przygotowanych skryptów

  • stworzenie wykresu często polega na wczytaniu w jednej linii danych ze źródła siecowego, plikowego, w tym popularne formaty CSV oraz Excel ! przypisaniu do zmiennej oraz w kolejnej linii wywołana funkcji plot() ze zminną(zmiennymi) przechowującą(przechowującymi) dane w argumencie. Efekt jest widoczny natychmiast w specjalnym oknie graficzym wykresów

  • powalająca na kolana baza rodzajów wykresów w postaci galerii z przykładami kodu w języku R
  • polecenia języka są intuicyjne i uproszczone do niezbędnego minimum:

    • package.install("nazwaPakietu", depedencies=TRUE) - dodawania pakietu, w efekcie czego pakiet jest pobierany z wskazanego repozytorum CRAN oraz kompilowany wraz z dokumentacją i przykładami użycia

    • library("NazwaBiblioteki") - użycie zainstalowanej biblioteki

    • nazwaBibliotek.funcka(argumenty) - użycie funckcji z biblioteki


  • tworzenie interaktywnych wykresów oraz możliwość używania akceleratorów grafiki 3D w wykresach

  • wbudowane przestrzenie nazw, profiler, debuger, garbage collector :-), których niekiedy może pozazdrościć język PHP

  • programowanie objaśniającego (pakiet Sweave)

  • funkcje statystyczne do przeprowadzania analizy regresji i analizy wariancji

  • funkcje do przeprowadzania klasyfikacji oraz analizy klastrowania

  • generatory liczb losowych oraz generatory liczb losowych z określonych rodzin rozkładów prawdopodobieństwa

  • funkcje do radzenia sobie z brakującymi obserwacjami oraz wstępną analizą danych

  • funkcje do korzystania z metody bootstrap i analizy przeżycia

  • prognozowanie na podstawie posiadanych danych !

  • możliwa edukacja w zakresie testów statystycznych dotyczących testowania hipotez o równości parametrów położenia, o równości parametrów skali, dotyczących prawdopodobieństwa sukcesu, procedury testowania istotności dla wybranych współczynników zależności pomiędzy dwoma zmiennymi oraz testy zgodności



Przegląd możliwości systemu R w wygodny sposób zarysowuje możliwości tego specyficznego języka programowania. Liczne prezentacje oraz artykuły umacnają mnie w przekonaniu, że warto wykreślać w tym języku wykresy z danych pomiarowych, szczególnie jeśli zależy mi na dokładności oraz pewności, że dany wykres reprezentuje wskazaną porcję danych.



Niesamowite jest to, że w języku R możemy osadzać np: język Python i odrotnie w języku Python możemy osadzać język R, co widać na poniższych stronach:

http://rpy.sourceforge.net/rpy_demo.html

http://rpy.sourceforge.net/

Oczywiście to kolejny plus na korzyść Pythona :-)


Materiały wideo do nauki języka R:



Oto linki pomocnicze:

http://processtrends.com/Learn_R_Toolkit.htm

http://processtrends.com/

http://www.r-ekonomia.pl/?ksiazki,11

http://www.personality-project.org/r/r.plottingdates.html

http://orgmode.org/worg/org-tutorials/org-R/org-R.php

http://www.nceas.ucsb.edu/scicomp/Dloads/RCourse/RShortCourseMeetThreeNotes.pdf

http://www.nytimes.com/imagepages/2007/01/22/science/20070123_SCI_ILLO.html

http://learnr.wordpress.com/2009/05/10/import-a-text-file-with-repeating-titles/

http://learnr.wordpress.com/2009/05/05/ggplot2-two-time-series-with-different-dates/

http://chartsgraphs.wordpress.com/

http://www.scribd.com/doc/2171544/R-Programming

http://www.scribd.com/doc/288555/dataR

http://www.scribd.com/doc/6187359/R-Matrix-Tutor

http://www.math.ncu.edu.tw/~chenwc/R_note/index.php?item=plot

http://commons.wikimedia.org/wiki/File:R-US_state_areas-1D_log.svg

http://commons.wikimedia.org/wiki/File:R_sin(theta)_Surface_Plot.png

http://commons.wikimedia.org/wiki/File:R-horsekick_totals-quantileplot%2Bquartiles.svg

http://www.r-project.org/other-docs.html

http://processtrends.com/toc_trend_analysis_with_Excel.htm

http://skiadas.dcostanet.net/uploads/RandSweaveInTextMate.mov


Alternatywa dla wykresów - wykresy kołowe:

http://mkweb.bcgsc.ca/circos/tableviewer/

http://mkweb.bcgsc.ca/talks/circos/

http://mkweb.bcgsc.ca/circos/?gallery

RepRap - samoreplikujący się robot Open Hardware + Open Source

W jednym z klasycznych dzieł fantastyki i dodatkowo "fantastycznym", którego nazwa wymknęła mi się z pamięci jest wątek o tym, jak roboty budują roboty. Do tego stopnia potrafią się replikować, że tworzą całe stada różnych wielkości oraz rodzajów robotów. Ludzie na stacji kosmicznej znikają, bo roboty potrzebują "podzespołów" t.j. ludzkie oczy ... i wszystko byłoby fikcją, gdyby nie fakt, że jest sobie XXI wiek i możemy śmiało powiedzieć, że jest to początek historii, która może zakończyć się niebawem mało "fantastycznie".

Przedstawiam dziś bardzo kreatywny projekt. Robot, który w kilkudziesięciu procentach potrafi się zreplikować.





Jest to projekt Open Source i Open Hardware. Znajdziecie pod nazwą RepRap. Jest on jednym z zastosowań dla opisywanego na łamach wielu blogów modułu Arduino i w pełni wykorzystuje go jako swój bazowy podzespół.

Robota tego nazwać można też drukarką 3D, gdyż jego rola polega na tym, że potrafi drukować z dość dużą precyzją z topionego plastyku dowolne wymyślne trójwymiarowe twory. Otwiera nam wyobrażnię, bo jak dotąd żyliśmy wyłącznie w świecie kolorowych reklam i druków oraz form seryjnie produkowanych w fabrykach. Prototypowanie odbywało się na urządzeniach frezujących/skrawających CNC. Od teraz prototyp możesz zrobić sam w domu i to przy użyciu ogólnie dosŧępnego sprzętu t.j. PC + Linux + kilka silników krokowych + nieco łączników metalowych + oczywiście odpowiedni software :-)

Wracając pamięcią do zagadnienia z tematu tzn. reprodukcji chciałbym zauważyć, że o ile istnieją standardy do różnych zastosowań, w weilu dziedzinach, wiele norm opisuje techniczne aspekty konstrukcji, o tyle niekt jeszcze nie stworzył standardu do robotów a o samoreplikujących się robotach już nie wspomnę. Polecam ważny dla robotyki artykuł Robot wciaz bez standardu i zachęcam do dyskusji na ten zapomniany temat. Kręgi akademickie możliwe, że zarzucą mi, iż mało w życiu robotów widziałem ... cóż, widziałem ich nie wiele, ale wiele nieudanych prób napisania standardu do takich maszyn jak roboty widziałem dość wiele. Każda kończyła się prywatyzacją standardu i okrzykiwaniem, żę to jest właśnie ten. Chyba potrzeba silnej firmy - może Google - która narzuci przemyślany standard - może z KML - do definiowania robota oraz jego możliwości i zadań. Może powstanie jakiś nowy superobiektowy język opisu i programowania robotów z interfejsami do sztucznej inteligencji. Do tego rozproszone agenty, które podpisany jako pluginy naszego robota, które potrafią współdzielić w sieci neuronowej doświadczenie i mamy roboty samoreplikujące się, które będą w stanie upiec nam np: ciastko, że aż palce lizać, hahhaaa :-)

Oto robot samoreplikujący się w akcji:

RepRap from Adrian Bowyer on Vimeo.




Oto co robot taki lubi jeść najbardziej:




Na dość radosny koniec przedstawam robota, którego zrobił RepRap, aby pingwiny miały się czym bawić :-)





Materiały dodatkowe:


http://www.flickr.com/photos/batistleman/

http://www.flickr.com/photos/batistleman/sets/72157612625523823/

http://www.flickr.com/photos/batistleman/sets/72157616965045763/

http://www.flickr.com/photos/batistleman/sets/72157617452928999/

http://www.coded.be/en/reprap

http://www.thingiverse.com/thing:688

http://itp.nyu.edu/physcomp/Tutorials/ArduinoBreadboard

http://objects.reprap.org/mediawiki/images/9/90/Laser-reprap.jpg


Software Open Source do RepRap:

http://sourceforge.net/project/showfiles.php?group_id=159590

http://reprap.org/bin/view/Main/Generation2Electronics#Arduino_Arduino_Clones_and_Sangu

http://sanguino.cc/

http://code.google.com/p/sanguino/downloads/list

Hardware do RepRap:

http://www.atmel.com/dyn/Products/Product_card.asp?part_id=3896

http://www.iearobotics.com/personal/juan/doctorado/Modulos-Y1/modulos-y1.html

http://fotos.iearobotics.com/index.php?album=modulos-repy-1

http://www.youtube.com/watch?v=x7OYkaXNGrY

http://www.youtube.com/watch?v=QmFV8lIZhB8

http://www2.parc.com/spl/projects/modrobots/chain/polybot/index.html

23 kwietnia 2009

Erlang, OTP, współbieżność, funkcyjność i rozproszenie aplikacji

O języku Erlang słyszymy przeróżne żarty, czytamy posty i co ciekawe znajdujemy nawet nieliczne w kraju oferty pracy. A tak na prawdę to słowa Erlang się boimy :-) Bo byćmoże posiada germańską naleciałość fonetyczną. Całkiem możliwe, że zapis kodu jest magiczny i przyzwyczajeni jesteśmy od szkoły średniej do zapisów typu:
"function ...() ... if {...} elseif {...} else {...} ... return ..."

Dodatkowo jeśli coś jest skomplikowane na pierwszy rzut oka i wyszukiwarka nie pisze słodkich ciekawostek o tym, że warto też to czasami zlewamy. Cóż, wiem to po sobie i znajomych, którzy brną coraz dalej w różne takie powszechne (czytaj komercyjne) trendy. Pochwalam zarazem wszystkich wytrwałych łowców historycznych i zagadkowych języków programowania tudzież udziwnionych rozwiązań t.j. LISP, Prolog oraz święty Erlang :-)





Na dzień dzisiejszy wydajność aplikacji (wykluczając rozwiązania google, ibm, oracle, amazon, częściowo facebook i pewnie kilka innych posiadających chmury obliczeniowe + gridy) jest uzyskiwana dzięki serwerom www, które dzięki interpretowaniu skryptów w profilowanych wątkach Fastcgi generują kod XML, HTML lub inny strumień informacji przy pomocy pipeline (lecz nie tylko) do przeglądarki klienta. Dość powszechny, uniwersalny i wydajny sposób, który posiada bardzo namacalne granice skalowalności.
Oczywiście ilość dostępnych maszyn (coraz częściej wirtualnych) oraz procesorów w tym wszelkich pamięci RAM zawsze będzie znacząca. Dodatkowo serwery cachujące typu memcache, moduły typu apc, etc zawsze się przydają. No tak baza danych master i slavy, których synchronizacji lub jeszcze lepiej replikacji pilnować, bo najlepsze jajca będą, jak kopie rekordów będą miały inne identyfikatory lub jak nagle slavy się oburzą i całe obciążenie spadnie na mastera. Może się też okazać, że lubimy NFS, sieciowe systemy plików lub nietypowe systemy plików w naszej aplikacji, które obciążają nasz serwerek i load w granicach 66.6 nas nieco dziwi. Praca administratora przy skalowaniu, profilowaniu też jest kosztowna i należy ją wrzucić do całkowitego rachunku ... to takie typowe założenia.

A co będzie jeśli to wszystko olejemy i użyjemy języka Erlang ?!


Wiadomo musimy nabyć odpowiednią wprawę, zrezygnować z typowych rozwiązań, nauczyć się kilku poleceń Eshell i posiadać marzenia :-) bo tylko One nas uratują, hahahahaaaa :-)
Weźmy pod uwagę, że w Erlangu każdy funkcjonalny kawałek kodu działa jako specjalny atomowy proces Erlanga, do tego dodam, że takich procesów można stworzyć nawet na bardzo słabym procesorze setki tysięcy. Ponadto dodam, że każdy proces z każdym może wymieniać komunikaty, co daje rozproszone podejmowanie decyzji i prawdziwie wielowątkową obsługę zdarzeń. Nie skłamię, jeśli napiszę, że język został ochrzczony w zastosowaniach dość wymagających i krytycznych czasowo tzn. w telekomunikacji. Służy(ł) do obsługi central oraz przełączników telekomunikacyjnych, gdzie raz uruchomiona aplikacja nie była wyłączana przez wiele lat i procesy w niej działające stale wykonywały swoje zadania. Mało tego, to może napiszę coś zabawniejszego, bo języku Erlang nie przejmujesz się błędami. Nie jest to bynajmniej parodia znanych nam powszechnie języków programowania, lecz ucieczka w stronę pisania bardzo wymagających aplikacji. Zarówno skupienie się na tym co się dzieje w procesach aplikacji, jak i odciążenie programisty stałym poprawianiem błędów swoich i cuchych. Jasne, że nie da się tego uniknąć, ale co powiecie na to, że jeśli kawałek kodu pada z powodu błędu to w tym czasie powołuje do życia instancje (swój klon), który zajmuje się dalej zadaniem. Dopieprzyć warto czymś, o czym wiele rozwiązań może tylko pomarzyć, czyli podmiana kodu w locie :-) Oczywiście administratorzy nie odniosą kolejnej klęski podczas klastrowania aplikacji, bo procesy Erlanga widzą się na maszynch, które posiadają połączenie sieciowe (rozpoznają się po nazwach). Dodajemy kolejny serwer uruchamiamy środowisko Erlanga i aplikacje, które widzą działające procesy na pozostałych połączonych maszynach.

Dodam, że firma Ericsson stosuje rozwiązania bazujące na tym języku od ponad 20-tu lat. Firma Google natomiast oparła swój meta komunikator GoogleTalk w oparciu o ejabberd, jabber (XMPP)serwer oraz klient do budowy dowolnych komunikatorów internetowych napisany i działający całkowicie w Erlangu. Tyle tytułem wstępu, resztę pozostawiam sprawnym obserwatorom i odkrywcom, którzy zechcą przejrzeć kilka prezentacji na temat języka Erlang i wyciągnąć pożyteczne wnioski.

By nie nawijać tylko o teorii pewnego dnia usiadłem sobie do kilku przykładów i zechciałem się nimi z Wami podzielić. Oto one:


Dodatkowe linki:
Referat - Erlang

Jabber we własnej domenie - uruchamiamy serwer

ejabberd we FreeBSD

All you wanted to know about the Erlang HiPE compile (but might have been afraid to ask)

Porównanie Erlang HiPE do Java 6 server

Erlang in Practice Episode 1: Sending and Receiving Chat Messages

Erlang in Practice Episode 3: Distributing Clients In A Multi-node Environment

Erlang in Practice Episode 5: Unit Testing with EUnit


Erlang community site Planet Erlang

Wtyczka do Eclipse dla programistów Erlanga

Introduction to the Open Telecom Platform

Erlang: Open Telecom Platform (Parts)

Erlang-Open-Telecom-Platform.ppt

http://www.slideshare.net/dennisbyrne/the-erlang-programming-language-presentation

http://www.slideshare.net/btedev/erlang-concurrency-presentation

Prezentacja oraz projekt łamania haseł na podstawie MD5 wykonany w Erlangu

http://www.slideshare.net/btedev/erlang-concurrency-presentation

http://github.com/btedev/erlang_md5crack/tree/master

http://github.com/btedev

19 kwietnia 2009

Newsqueak - programuj z przyjemnością swoje kanały danych działające w procesach

Dziś obejrzałem kolejny odcinek cotygodniowego zawodowego serialu na video.google.pl z serii Advanced Topics in Programming Languages p.t.
Advanced Topics in Programming Languages: Concurrency/message passing Newsqueak. Dotyczył on języka Newsqueak, który podobnie jak Haskell oraz Erlang stanowią dla mnie wielką zagadkę poznawczą :)

Oto omawiany filmik, gdyby ktoś się skusił:



Ogólnie wiadomo, że założenia konstrukcyjne mogą szokować. Tak też jest w przypadku języka Newsqueak, który dość jasno określa zasady:



  • odrzuć koncepcje programowania wielowątkowego bazującej na Andrew Birrell's ''An Introduction to Programming with Threads.''

  • odrzuć typowe podejście w programowaniu z maszyną stanów

  • zastanów się nad swoimi interfejsami i potraktuj je jako struktura danych zawierająca kanały komunikacyjne

  • pozwól swoim interfejsom działać jako procesy

  • spróbuj utworzyć kanały komunikacyjne (bazując na interfejsach), które w dedykowanych (odrębnych) procesach enkapsulują kanały informacyjne (transmisje Twoich danych)

  • stwórz oprogramowanie bez myślenia, że popełniasz błędy - nie tracąc czasu na debugowanie

  • nie zamartwiaj się zbytnio obciążeniem stworzonego systemu - to kwestia balancingu działających procesów




Materiały dodatkowe:

Montage: Breaking Windows into Small Pieces

Video example

Rob Pike wikipedia page Rob Pike

A Concurrent Window System

The Good, the Bad, and the Ugly: The Unix Legacy - Slides of his presentation at the commemoration of 1000000000 seconds of the Unix clock.

Newsqueak: A Language for Communicating with Mice article 2

Resources about threaded programming in the Bell Labs CSP style

WikiProject Plan 9

Genuinely Functional User Interfaces - Theories of Programming Languages, Cambridge University

Limbo programming language

Squinting at Power Series

Acme is a text editor and graphical shell from the Plan 9 from Bell Labs operating system, designed and implemented by Rob Pike.

List of Plan 9 applications plan9 papers

Rob Pike on newsqueak

Declarative event-oriented programming

The lecture notes about the Plan 9 window system

Inferno Programming With Limbo Inferno Programming With Limbo rapidfx

8 kwietnia 2009

Jak wektorki to tylko z Inkscape !

Od kilku lat używam do wszelakich grafik, rysunków, szkiców, schematów poglądowych oraz różnych ulotek, reklam i publikacji (w tym również www) aplikacji niezastąpionej o nazwie Inkscape.



Dziś odkryłem, że istnieje podręcznik do jakże praktycznego dzieła OpenSource. Praktycznego, to mało powiedziane. Powstają w nim na prawdę zalewające użytkowników Corela pomysły. Poniższy link dedykuję tym, którzy lubią w ojczystym języku posiadać książkę tego do ulubionego programu graficznego:

Instrukcja w języku polskim do programu do edycji grafiki wektorowej Inkscape

Oto znane linki do przykładowych prac wykonanych przy pomocy tej aplikacji oraz tutoriali:

The Inkscape tutorials weblog

Inkscape galleries

Inkscape showcase

Open Clipart Library

1 kwietnia 2009

Zbuduj robota na Prima Aprilis - konstrukcje papierowe kształcą

W dniu tak specyficznym postanowiłem dodać wzmiankę dla tych konstruktorów, dla których edukacja poprzez zabawę nie zna granic ;) Konstruowanie nie zawsze wiąże się z użyciem młotka, desek, silników, mikroprocesorów. Często do tego celu wystarczy najpowszechniejszy współczesny materiał jakim jest papier. Papierowe modele co prawda mogą być delikatne, ale zależnie od formy, grubości papieru i rodzaju zastosowanego kleju nie musi to stanowić reguły. I w tym cała magia ... kilka dostępnych w każdym kiosku na rogu potrzebnych rzeczy oraz jak zwykle niezastąpione źródło wiedzy internet i możemy budować roboty. Ojciec z synem znajdą na pewno wiele atrakcyjnych wynalazków, które posiadają rekonstrukcję modelarską z papieru. A w dobie zalewających iPodów powrót do korzeni - jakim jest zabawa w konstruowanie z papieru - czasami jest jedynym ratunkiem przed slęczeniem dziecka przed monitorem.




W ramach komentarzy podzielcie się proszę swoimi konstrukcjami. Powodzenia i miłej zabawy.

Jako dodatek zamieszczam stosik linków oraz kilka tutoriali dot. użycia Google SketchUp (okazuje się, że jest to alternatywa dla Blendera, aczkowiek Blendera również polecam).

Budowa modelu robota w programie Google SketchUp



SketchUp-Making a quick model



Sketchup - Modeling a tractor



How To Use Google SketchUp -- Modeling (Part 1)



How To Use Google SketchUp -- Modeling (Part 2)



Sketchup-Model a Lantern



Wirtualna szkoła z filmami do nauki programu Google SketchUp


Podstawy konstruowania modeli z papieru




Linki do stron z gotowymi do pobrania modelami robotów z papieru:

http://gundamandrobotanime.blogspot.com/search/label/papercraft?updated-max=2007-07-24T13%3A23%3A00-07%3A00&max-results=20

http://www.ss42.com/pt-scifiction.html

http://www.blogcatalog.com/topic/robot+paper+model/

http://jleslie48.com/gallery_models_scifi.html

http://jleslie48.com/gallery_models_real.html

http://www.marscenter.it/veicol.asp?pa=605

http://win1999.web.fc2.com/Oshiire/EXTRA/025/25.htm

http://www7a.biglobe.ne.jp/~sf-papercraft/Original/LensHeadB_tuned/LensHeadB_tuned.html

http://www.marshallalexander.net/




Temat pokrewny - modele papierowe rakiet i pojazdów kosmicznych:

http://jleslie48.com/ariane5ton/

http://jleslie48.com/deltavheavy/divh.html

http://jleslie48.com/cevton02/

http://jleslie48.com/tonmercury/

http://jleslie48.com/stbb/

http://jleslie48.com/lunarsurveyor/

http://jleslie48.com/energialeo/cs.html

http://jleslie48.com/leo0612/

http://jleslie48.com/leo_vulcan/

http://jleslie48.com/ton_acts0811/