poniedziałek, lipca 02, 2007

Nowości w poniedziałek:
  1. Paul Deitel - JSON w poczcie " Deitel Buzz Online Newsletter: JSON (JavaScript Object Notation) Resource Center 29 June"
  2. Jak wygląda porównanie Google z Microsoft - http://no2google.wordpress.com/2007/06/24/life-at-google-the-microsoftie-perspective/
  3. Różnorodne skrypty - http://www.jdhitsolutions.com/scripts
  4. Jak wystartować z XAML - http://msdn2.microsoft.com/en-us/library/ms752299.aspx
  5. Grożna ORCA mimo, że beta - http://redmondmag.com/columns/article.asp?EditorialsID=1813
  6. Linuks powoli nabiera sił - http://redmondmag.com/features/article.asp?editorialsid=742:
    1. Sprawa cała polega na wypracowaniu przez ruch wokół Linuksa tzw. stosu aplikacji (STACK). Dopóki takiego stosu się Linuks nie dorobi dopóty nie będzie traktowany poważnie w kręgach korporacyjnych. Stos stanowi platformę na której mogł wyrosnąć cały ekosystem aplikacji. Drugim ważnym celem jest integracja i współdziałanie (interoperability and integration) a funkcjonalność była na drugim planie.
      1. Myślenie twórców Linuksa polega na rozwiązywaniu problemów informatycznych bez szerszego spojrzenia na całość. Tworzyli wiele nieskoordynowanych projektów.
      2. Pierszwy stos w środowisku Linuks to LAMP.
      3. Innym podejściem są prace Linux Foundation nad projektem LSB (Linux Standard base) tak aby LSB-certyfikawana aplikacja działała na dowolnej LSB-certyfikowanej dystrybucji Liniksa.
      4. W obszarze tworzenia aplikacji jest projekt Eclipse
      5. Ciągle jednak brakuje tego, co najbardziej liczy się w rozwiązaniach korporacyjnych - interoperability. Aplikacje open-source tworzyły tzw. point solution (wyspowe rozwiązania)
      6. Obok LAMP powstaje stos WAMP
      7. Firma SpikeSource - jako pierwsza dostrzegła potrzebę wypracowania takiego stosu aplikacyjnego. W maju doszło do porozumienia m. nią a MS w sprawie kooperacji. Bill Hilf - ogłosił, że w/w firma będzie certyfikowała swoje rozwiązania na platformie Windows.
    1. Przykład takiego stosu:
    2. Open Source Stacks on Windows
      Enterprise open source isn't just for GNU/Linux anymore. The following selection of applications also runs on Windows.

      Web Server

      Database

      Middleware

      Business Intelligence

      Enterprise Content Management

      CRM

      ERP

      Porównanie stosów:

Gillmor’s Internet plate tectonics by ZDNet's Dan Farber -- Steve Gillmor riffs on my post about Yahoo’s lack of a social networking hub, where I state: “Yahoo is about making connections, but right now its more of loose federation of Web applications and services–many spokes without a strong hub to hold together a social Web. Yahoo 360 has been a failure as a social [...]

niedziela, lipca 01, 2007

Tworzenie aplikacji przy pomocy Eclipse. Mnóstwo opcji wprost poraża. Ale z tego początkowego chaosu wyłania się taki obraz, należy:
  1. Ściągnąć Eclipse IDE for Java EE Developers - http://www.eclipse.org/downloads/moreinfo/jee.php# (zawiera narzędzia do obsługi stron www, oraz dodać jakiś serwer aplikacyjny
  2. Jakiś serwer aplikacyjny, są dostępne takie:
    1. Apache Tomcat
    2. Websphere - http://www.ibm.com/websphere
    3. JBoss - http://sourceforge.net/projects/jboss/
    4. JOnAS -http://wiki.jonas.objectweb.org/xwiki/bin/view/Main/WebHome
    5. Oracle OC4J - http://www.oracle.com/technology/tech/java/oc4j/index.html
    6. Inne poprzez wizarda - opcja New server
  3. Zasoby do JBoss: This is the jboss-4.0.4.GA release for the Java EE? 1.4 codebase. For information on the APIs that make up Java EE 1.4, see Java EE v1.4 Documentation.
    For a comprehensive tutorial on Java EE 1.4, see The Java EE? 1.4 Tutorial. A jboss-4.0.x getting started guide that is based on contents from the tutorial can be found in JBoss Application Server Documentation Library
  4. Inne zasoby javy:
    1. Tworzenie + zaosby nt. nowości i WS: http://java.net/
    2. JavaPedia - http://wiki.java.net/bin/view/Javapedia
    3. JavaScripting - inne języki w implementacji Java:
      1. Rhino - http://developer.mozilla.org/en/docs/Rhino_JavaScript_Compiler
    4. WebStart - http://wiki.java.net/bin/view/Javapedia/JNLP
    5. Jak to naprawdę skorzystać z JNLP - http://java.sun.com/developer/technicalArticles/Programming/jnlp/
    6. Subskrybcja kanałów IBM - http://www.ibm.com/developerworks/library/wa-gizmos/#custom
    7. Jak pracować z OC4J - http://www.eclipse.org/webtools/community/tutorials/OracleServerAdapter/OracleServerAdapter.html
    8. Moduł do pobierania z HTTP - http://www.oracle.com/technology/tech/java/oc4j/1013/how_to/how-to-httpclient/doc/how-to-httpclient.html
    9. http://www.ibm.com/developerworks/java/library/os-jws/
    10. http://www.eclipse.org/webtools/community/tutorials/OracleServerAdapter/OracleServerAdapter.html
    11. http://www.onlamp.com/pub/a/onlamp/2007/06/28/the-power-of-google-gears-part-1.html
    12. http://spring.javabeat.net/articles/2007/06/spring-mvc-web-framework-introduction/4
  5. Artykuł IBM (stary) o servletach:
    1. Jedną z wbudowanych metod jest init. Może ona służyć do "ładowania domyslnych danych lub połączeń z bazą"
    2. Servlet jest wielowątkowy. Dla każdego żądania tworzy własny jego wątek. Patrz rys. niżej.
    3. Uwaga na ważny szczegół: żądania request/response są przetwarzane niezależnie w każdej instancji servleta.
    4. "Ręczne" uruchamianie servletów jest proste: należy sobie skompilować .java do .class i następnie "wrzucić" do katalogi servlet.

piątek, czerwca 29, 2007

Piątek
  1. Przy podejściu do wytwarzania aplikacji na platformie Java można wybrać dwie drogi:
    1. ewolucyjna - powoli przechodzić na tę platformę (impelmentując najpierw servlety i ajax - tka jak to zademosntrowałem. Muszę jeszcze nagrać show jak to się robi
    2. rewolucyjna - rzucamy wszystko i uczymy się. Po roku może będzie jakiś efekt.
  2. Google dostrzegł nową możliwość marketinową - ogłosił epokę gadżetów (tzw. gadget ecosystem) - jest to segment oprogramowania zorientowany wokół małych programów dodatkowych, uruchamianych w środowisku desktop pracujących w tle. Do ich uruchomienia wymagane jest runtime. W przypadku Google jest to oparty o XML Desktop platform. Produkcję wichajstrów zapoczątkował Apple. Googel oferuje swoje w dwóch wersjach: lokalnej jako Desktop lub ze swojej strony. Dodatkowo firma ta ogłosiła projekt open-source Jackfield do uruchamiania gadżetów na Linuksie (docelowo ma uruchamiać gadżety z Yahoo Widget Engine, MS Sidebar i Mac). Na podstawie betanews.
  3. Informacja o Yahoo:kupiła w zeszłym (2006) roku serwis photo-sharing Flickr oraz Konfabulator, który wytwarza aplikacje desktopowe zwane "widgets," lub dodatki (add-ons).
  4. Należy przeszukać Google API dla: Gear, Base, Docs and Spreadsheets ...
  5. Tutaj jest strona do API dla gadżetów - http://www.google.com/apis/gadgets/
  6. Tworzenie, zbieranie i udostępnianie danych w środowisku pracy grupowej to dopiero czybek góry lodowej, następny poziom to publikowanie tych danych w postaci strumienia RSS. Google zachęca by w swych produktach do wizualizacji danych wykorzystywać dokumenty i arkusze poprzez API.
  7. Uwaga Google faktycznie ma już wykresu w arkuszu.
  8. Ciekawe odnośniki:
    1. Blog na temat dokumentów - http://google-d-s.blogspot.com/
    2. GData - http://code.google.com/p/google-gdata/
    3. Data API blog - http://googledataapis.blogspot.com/2007/05/see-your-google-spreadsheet-data-in.html
    4. Gadgets API - http://www.google.com/apis/gadgets/
    5. Najprostszy - http://www.google.com/apis/gadgets/gs.html
    6. Więcej o tym - http://www.google.com/apis/gadgets/docs-home.html
    7. GWT - http://googlewebtoolkit.blogspot.com/
    8. Gears - http://gearsblog.blogspot.com/

środa, czerwca 27, 2007

Ciekawe adresy zebrane w środę:
  1. http://msdn2.microsoft.com/en-us/library/ms268890(VS.80).aspx - wprowadzenie do SMART TAG
  2. Poszukiwarka rozwiązań programistycznych - http://www.koders.com/
  3. Szukanie prawdy - What’s Your Ethics IQ? (http://www.hemispheresmagazine.com/nov06/cybersidebar.html)
  4. By Bruce Weinstein, Ph.D.The Ethics Guy®

    Introduction
    The secret to living a satisfying, happy life is to be found in five simple principles. We’ve known about these principles for more than 5,000 years. Nearly every religious tradition in the world teaches them, as do parents in every country. Without them, civilization would be impossible, because there would be nothing but chaos. These principles have a transforming effect on who we are and where we go in life. They are the principles of ethics, and they are as follows:

    1. Do no harm.
    2. Make things better.
    3. Respect others.
    4. Be fair.
    5. Be loving.

    Yes, these principles are simple, but deceptively so, because too often we let fear, anger, or other negative emotions get us off track. This creates a downward spiral, and it’s sometimes difficult to get back to where we want to be.

    For example, how often do we really keep “do no harm” in mind during our daily interactions with people? If a clerk at the grocery store is nasty to us, don’t we return the nastiness and tell ourselves, “Serves them right?” We may, but if we do, we harm the other person. In so doing, we harm our own soul—and this is one of the reasons why we shouldn’t return nastiness with more of the same.
    You might wonder, “If these principles are so commonplace, why do I need to be reminded about them?”

    It’s true that they’re commonplace, but it’s also true that in our hectic, overcommitted lives, we get so caught up in the details of getting through the day that it’s easy to forget how important these principles are in everything we do. We’re also tempted every day to ignore them and to place value on things that ultimately aren’t that important. So taking a few steps back to consider these principles is helpful.

    On the surface, the principles are about making a difference in the lives of other people. To this extent, taking them seriously seems like something we have to do, something we ought to do, something that, quite frankly, we’d rather not do.
    What we’ll discover through this quiz, however, is that making ethics our central concern is actually the best way to lead a richer, more fulfilled life. A life that helps us get the things we want: the right partner, a job we love, and a place where we want to live. By taking ethics seriously, we serve as role models to our children and increase the chances that they will go into the world and make us proud.

    Recent scandals in the news show the risks we take when we neglect these principles: public humiliation, shame, and in some cases, a lengthy visit to prison. But the main reason for taking ethics seriously is not the dangers of failing to do so, but rather because it’s the right thing to do.

    The path to a happier, more fulfilled life lies in becoming reacquainted with the principles of ethics, which tell us how we should treat one another. When we act with integrity, we feel better about ourselves. We then create the conditions for making many wonderful choices in our own lives. When we take the high road in all that we do, we give a gift to others—and ourselves. It’s the greatest gift of all.

    I’ll show you why

  5. Problem JINI - http://www.infoq.com/articles/in-process-java-net-integration, http://reyelts.dyndns.org:8080/jace/release/docs/index.html
  6. Co robi RH - http://blogs.tedneward.com/2007/03/22/RedHat+Inc+The+Next+Microsoft.aspx
  7. Co może RESIN - http://www.caucho.com/download/ - łączy PHP i J2EE
  8. InterOp Forms Toolkit dla VFPhttp://weblogs.foxite.com/bernardbout/archive/2007/06/20/4126.aspx
  9. http://openid.net/ - OpenID

wtorek, czerwca 26, 2007

Toolbar.live.com
Windows.Live.Favorities
JAVA
  1. http://www.visualbuilder.com/jsp/tutorial/pageorder/14/
  2. http://www.jspin.com/
  3. http://www.scbr.com/docs/products/dhtmlxGrid/
  4. http://www.jspin.com/home/tutorials
  5. http://www.jsptut.com/Scriptlets.jsp
  6. http://www.developer.com/tech/article.php/626401
  7. http://www.betanews.com/article/Microsoft_VP_Interoperability_CrossPlatform_Efforts_Go_Back_30_Years/1182788179
  8. http://www.isvinnovation.com/

  1. Każda aplikacja w tym i internetowa składa się z warstw:
    1. Klient lokalny:
      1. przeglądarka internetowa (niekompatybilne implementacje języka JavaScript, brak dostępu do zasobów lokalnych)
      2. inny kontener np. klient MS VS - niweluje te braki
      3. Bazujemy na języki JavaScript z jego rozszerzeniami obiektowymi (wychodzimy poza ramy podstawowe)
      4. Wymagane jest przyjęcie rozwiązań szkieletowych w zakresie GUI i operacji na DOM, ułatwiających tworzenie
    2. Serwer internetowy:
      1. Tradycyjny serwer internetowy oparty o rozszerzenie mod Apache (np. mod_python)
      2. Integracja platformy języka skryptowego np PHP z Apache (skompilowanie do Apache)
    3. Serwer aplikacji:
      1. Podział na wyspecjalizowane serwery aplikacyjne np. ZOPE
      2. Kontener dla uruchamiania języka JAVA zgodny ze specyfika J2EE: Tomcat (wzorcowy), WebSphere CE (CodeGlue), pełny WebSphere oraz wiele innych niezgodnych w szczegółach ze sobą implementacji BEA, JBOSS
      3. MS IIS 7.0
    4. Serwer bazodanowy:
      1. Oracle
      2. Informix
      3. DB2
  2. Warstwa
    C/s
    Web 1.0
    Web 1.0
    Web 2.0 AJAX
    Klient
    90%-100%
    0%
    5%
    85%
    Serwer internetowy

    100%
    5%
    5%
    Serwer aplikacyjny

    0%
    85%
    5%
    Serwer bazodanowy
    10%-0%
    0%
    5%%
    5%

  3. Wydaje się, że obecnie najbardziej rozwojowe są dwie hermetyczne platformy komercyjne (oferujące pełne, spójne i ciągle rozwijane technologie):
    1. Platforma .Net
    2. Platforma J2EE
  4. Wzorowane na J2EE ale znaczne bogatsze i rozbudowane środowisko .NET firmy MS oferuje pełna gamę narzędzi deweloperskich i środowisk wykonywalnych (serwerów) od urządzeń mobilnych aż po serwery korporacyjne. Wykorzystanie serwerów jest przeźroczyste dla programisty.
  5. MS Visual Studio 2005 jest wzorcem dla innych środowisk
  6. Wiele firm trzecich udostępnia (płatne oczywiście) ale o dużej jakości dodatki, które b. dobrze się integrują z klientem i serwerami MS (bo wiedzą jakie maja API) np. BO, CR.
  7. Światełko w tunelu - istnieje jednak interoperability między .NET i J2EE, chociażby poprzez WebServices
  8. Istnieje środowisko analogiczne po stronie Java (na etapie doganiania) ale jest rozczłonkowane:
    1. Chaos i brak stabilizacji
    2. Każda technologia jest innej firmy lub grupy deweloperów nic ich nie jednoczy poza chęcią wypromowania swej implementacji danego standardu
    3. Brak wspólnej platformy i jednolitego API
    4. Wykorzystuje się wiele projektów open-source ("pasożytnictwo" ponieważ na nich powstają wersje płatne), które dostosowuje się do własnych potrzeb (a to jest podatne na błędy i wymaga naprawdę dużej wiedzy)
    5. Mnogość dostępnych rozwiązań jest przeszkodą, przecież w końcu trzeba wybrać jakieś jedno rozwiązanie końcowe, dobrze gdy wybierzemy rozwiązanie "prawidłowe", które jest rozwijalne i powszechnie stosowane
    6. Niekompatybilność nawet między implementacją (rozszerzeniami) nawet EJB
    7. Tarcie wśród deweloperów jakie rozwiązanie jest jedynie słuszne np. Java Suna, IBM Java, czy Open Java
  9. Przekonanie o awaryjności i braku skalowalności rozwiązań serwerowych MS jest nieprawdziwe
  10. Środowisko MS jest tanie (koszt oprogramowania i sprzętu) i ma małe wymagania sprzętowe
  11. Elastyczność (agility). Można i należy budować aplikacje w środowisku heterogenicznym (już nawet baza nie musi być wspólna nie mówiąc o serwerach aplikacyjnych czy internetowych, wspólny musi być klient (czyli JavaScript) i mechanizm jednokrotnego logowania np. OpenID). Kryterium wyboru platformy musi być zgodne z wyborem klienta
  12. Możliwa i konieczna jest symbioza i wymienialność na poziomie serwerów: od wspólnego serwer baz danych.
  13. Przeciwieństwo podejścia hermetycznego - powstają aplikacje Web 2.0 gdzie część serwerowa jest mniej ważna, główny nacisk kładzie się na przetwarzaniu po stronie klienta
  14. Oparcie się na lokalnej przeglądarce internetowej (gruby klient w klasycznej architek.) jako kontenerze pozwala na mashup, czyli na konwergencję wielu platform serwerowych i przykrycie ich wspólną warstwą, nierozróżnialną przez klienta
  15. Dynamiczne języki mają się dobrze, mało kto pamięta, że MS pierwszy rozpoczął promocję języków skryptowych wprowadzając i rozwijając sławny Basic a potem Visual Basic. Wygląda na to, że teraz po latach wraca do swego pomysły. Na tegorocznym TechEd wprowadził temat DLR (dynamic language runtime obok działającej już CLR) platformy .NET Framework 3.5, w której poczesne miejsce będą miały właśnie te języki (od IronPython po IronRuby). Ukłon w stronę open-source - będą otwarte dla wszystkich chętnych. Z jednym zastrzeżeniem - serwisy SOA, tam mają królować jedynie CLR (wraz z WCF i serwerami w stylu BizTalk).
  16. Wg. MS języki dynamiczne mają swoje miejsce i to jest front-end aplikacji (tj. ASP.NET, Windows Forms, WPF, dynamic languages w śrosowisku ASP). Oznacza to funkcję wykorzystania i pobierania serwisów.(Na podstawie serwisu BetaNews: Microsoft's .NET Evangelist Spells Out Future Role for Dynamic Languages)
  17. Sun również widzi konieczność uproszczenia procesu wytwarzania oprogramowania poprzez wsparcie w środowisku Java języków dynamicznych (JavaScript, Python, Ruby). Java została otwarta dla środowiska open source, ale Sun ma tutaj wiodącą rolę.
  18. Kryzys głównych założeń J2EE, szczególnie EJB. Proponuje się lekkie EJB 3.0.
  19. Rozwój aplikacji WEB 2.0 (mashup) opartych o AJAX
  20. Google - oferuje wsparcie dla technologii mashup oraz narzędzia dla programistów w środowisku Java, .NET, Python, PHP. Google WebToolkit, Google Gears.
  21. Powstają bezpłatne rozwiązania szkieletowe tzw. framework np. Yahoo (głównie GUI), prototype (głównie niewizualne), dojo, rico. Dr.Dobbs - opis i ocena tych szkieletów. Jest wiele szkieletów specjalistycznych bazujących na tych rozwiązaniach.
  22. Demokracja jest dobra, ale musi ktoś rządzić.
  23. Powstaje wiele rozwiązań firm trzecich oferujących rozwiązania płatne np. Nitobi, Infragristic.
  24. IBM - przyjmuje postawę wyczekującą. Środowisko Eclipse (kupione przez IBM od firmy kanadyjskiej) zostało usamodzielnione (niezależne od IBM). Niesamowita ilość wtyczek, niezgodność wtyczek z wersjami brak koordynacji. IBM daje wolną rękę grupie Eclipse skupia się natomiast na rozwoju płatnego środowiska Rational po przejęciu tej firmy (formalna metodyka). Wielkie plany i projekty ale mało konkretów (czyli brak wersji produkcyjnych). Otwarta platforma Eclipse jest w fazie rozwoju, płatne rozwiązanie WSAD (z Rational) jest dopracowane
  25. Jython (JPython) - wersja 2.2 (ostatnia wersja 2.1 -była w 2001 roku). Numer wersji odzwierciedla wersję CPythona z której przejęto biblioteki. Uwaga przewiduje się wersję 3.0, która podobnie jak wersja CPythona nie będzie kompatybilna z poprzednimi wersjami.
  26. Głównym kontenerem do uruchamiania aplikacji jest ciągle przeglądarka internetowa. Rozwiązania szkieletowe skutecznie niwelują niezgodności między przeglądarkami.
  27. Istnieje możliwość wykonywania aplikacji internetowych w innych klientach lokalnych (obiekty XMLHTTP, oraz komponenty WebBrowser oparte o silniki IE lub FF) co ma swoje zalety (obsługa natywna lokalnych zasobów) i wady (konieczność instalacji - ale to nie jest aż taka przeszkoda dzięki platformie .NET)
  28. Głównym środowiskiem uruchamiania jest platforma Windows Client i nie wolno tego bagatelizować, część rozwiązań internetowych musi wykorzystywać wspierane przez MS technologie czyli głównie .NET.
  29. Coraz większy nacisk kładzie się na przetwarzanie w przeglądarce (co jest zgodne z AJAX)
  30. Ajax jest pojęciem szerokim, ma dwie strony implementacji
  31. Niezależnie od wyboru technologii krótko czy długoplanowej należy:
    1. Przeszkolić ponownie w zaawansowanym wykorzystaniu JavaScript w oparciu o obiektowość i szkielet
    2. Wybrać i zatwierdzić) metodologię tworzenia aplikacji (AJAX?)
    3. Wybrać i wdrożyć pomocne rozwiązania szkieletowe w zakresie obsługi GUI w przeglądarce oraz DOM
    4. Wybrać środowisku do tworzenia aplikacji w HTML (HateHTML, PSPad, MS VWD)
    5. Przeszkolić w zakresie narzędzi do testowania HTML (MS VWD, FireBug) oraz metodologii formalnych opartych na jUnit
    6. Wybrać i wdrożyć protokół przekazywania danych między warstwami: XML, JSON
    7. Rozpoznać środowisko Eclipse i wybrać niezbędne do pracy wtyczki oraz elementy z oferty Rational dla wsparcia środowiska Java
    8. Przeszkolić w Java
    9. Wybrać i zakupić komponenty serwerowe
  32. Należy obserwować rozwój aplikacji w Google, Yahoo, MS, Eclipse
15.11.2006
  • Firma TrendMicro - udostępnia również jak i inne firmy skanner online. Jego instalacja odbywa się poprzez technologię ActiveX (zresztą tak działają wszystkie przeglądarkowe skanery) i jakoś to działa. Dziwne, że nikt nie zrobił skanera dla Mozilli. Może jeszcze za mały rynek dla tych rozwiązań.
  • Użyteczne programy: ba.exe - bios agent do poznania wszystkich wersi BIOS (ważne gdy chcemy go zaktualizować), PC-Clean do czyszczenie systemu, PC Wizard + CPU Z.
  • Siatki do wyświetlania danych - danych w większości przypadków jest dużo, nie mieszczą się na ekranie (formularzu, stronie webowej). Zachodzi potrzeba ich porcjowania. Problemów jest wiele: porcjowanie ma być elastyczne (podawać można jako parametr liczbę wierszy do jednorazowego wyświetlenia), wydajne (nie pobieramy od razu wszystkich danych do pamięci operacyjne lecz jedynie tzw. porcje), efektywne (zwalniamy pulę połączeń z bazą). Aby porcjowanie miało sens musi mieć wsparcie w motorze bazy danych, np. instrukcja SQL SELECT musi wspierać możliwość ograniczenia pobrania danych (FIRST 10, LIMIT 10). Musi być także jakiś mechanizm zaznaczania aktualnej pozycji w tabeli (MS nazywa to bookmark). Do problemu wykorzystania mechanizmów motora bazy można podejść dwojako Należy przeszukać możliwości w zakresie zaznaczania porcji danych w mechanizmach metod dostępu poprzez ODBC (sprawdzone - te mechnizmy działają, patrz przykład w tabelce poniżej)/ JDBC (lub ich odpowiedniki w innych językach np. ADODB w PHP) lub też podejść na niski poziom i wykorzystać specyfikę polecenia SQL SELECT dla danej bazy (korzystać z ROWID, FIRST, procedur wbudowanych) oraz specyfiki aplikacji (specjalne wykorzystanie kluczy głównych). Tak czy inaczej jest to trudny problem dla developera i raczej lepiej zdać się na jakieś gotowe narzędzia, za które czasami trzeba trochę zapłacić. A warto, gdyż możemy od razu skupić się na merytoryce zagadnienia szczególnie gdy klient chce od siatki sortowania, przesuwania (w lewo/prawo) i sortowania kolumn. Czasami mamy szczęście i w danym języku czy środowisku programowania mamy wbudowane takie narzędzia (.NET ma DataGrid, PHP ma tzw. pager'a - notabene kiepsko u niego z wydajnością, JDeveloper/Netbeans oferuje siatki danych całkiem dobrej jakości). Alternatywne podejścia:
    • Inna sprawa to filozoficzna, czy możemy użytkownikowi ukryć dane przez pokazanie mu tylko ich części. Czasami nieświadomy użytkownik szuka jakiś danych na ekranie i stweirdza, że ich tam nie ma (a tym czasem są one na następnych stronach). Przy takim potraktowniu problemu można zrobić tak: użytkownik niech sam określi zapytanie i wybierze jakie dane chce oglądać (nalezy mu udostępnić filtr selekcji bazujący na jego wiedzy o tym co chce zobaczyć + Limit ilości wybranych wierszy w zapytaniu). Nie czarujmy się zbyt dużo danych i tak nie przeanalizuje.
    • Dane mają być porcjowane nie na serwerze ale u klienta. W tym przypadku klient pobiera dane z serwera i wkłada do pojemnika lokalnego zwalniając zasoby połączeniowe z bazą (oddając do puli połączenie). Dzięki temu wszystkie operacja odbywają się lokalnie (na sprzęcie skądinąd coraz bardziej wyrafinowanym). Tak myśli MS - tzw. offline dataset. Nawiasem mówiąc VFP w wersji miał pojęcie tzw. offline table. Dane są przetwarzane lokalnie. Najważniejsze jest to co będzie potem - synchronizacja z danymi na serwerze. Wybrano metodę optymistyczna tj. wolno wszystko edytować i zmieniać a dane są zapisywane do bazy centralnej zakładając, że nie ma konfliktów. Ważną sprawą jest wybór pojemnika klient, może to być nawet przeglądarka internetowa lub coś bardziej skomplikowanego.
  • Zasoby:

Przykład "żywcem" wzięty z produkcji (chodzi!)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- #include file="adovbs.inc" --><HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=8529">

<SCRIPT LANGUAGE=javascript>
<!--
function mSkocz(iSkocz)
{
window.location.href="Karta_List.asp?page="+iSkocz;
}
//-->
</SCRIPT>

<%
Response.Expires = -1000 'Makes the browser not cache this page
Response.Buffer = True 'Buffers the content so our Response.Redirect will work

iRozmiarStr = 10
mW = ""

If Request.QueryString("page") = "" Then
iBiezacaStr = 1
Else
iBiezacaStr = CInt(Request.QueryString("page"))
End If

set cn = CreateObject("ADODB.Connection")
set rs = CreateObject("ADODB.Recordset")
rs.PageSize = iRozmiarStr
' rs.CursorLocation = adUseClient ' Bardzo ważne w przypadku bazy Informix
rs.CacheSize = iRozmiarStr
cnstr = "DSN=mssql;UID=inventuser;PWD=userinvent"
cn.ConnectionString = cnstr
cn.Open
rs.ActiveConnection = cn
rs.Open "Select nr_inw,admin_id,typ_sprz,lokalizacja, pokoj from sprzet order by 1 asc", cnstr, adOpenStatic, adLockReadOnly, adCmdText

iLiczbaStr = rs.PageCount

If iBiezacaStr > iLiczbaStr Then iBiezacaStr = iLiczbaStr
If iBiezacaStr < 1 Then iBiezacaStr = 1

Response.Write "<table FONT='Arial Narrow' ALIGN='CENTER' border='1'>" & vbCrLf

Response.Write vbTab & "<tr>" & vbCrLf

For I = 0 To rs.Fields.Count - 1
Response.Write vbTab & vbTab & "<th>"
Response.Write rs.Fields(I).Name
Response.Write "</th>" & vbCrLf
Next

rs.AbsolutePage = iBiezacaStr

iNRWiersza = 1

Response.Write vbTab & "</tr>" & vbCrLf
Do While iNrWiersza <= iRozmiarStr And Not rs.EOF
Response.Write vbTab & "<tr>" & vbCrLf
Response.Write vbTab & vbTab & "<td>"
Response.Write mPokazLink(rs.Fields(0))
Response.Write "</td>" & vbCrLf
For I = 1 To rs.Fields.Count - 1
Response.Write vbTab & vbTab & "<td>"
Response.Write rs.Fields(I)
Response.Write "</td>" & vbCrLf
Next 'I
Response.Write vbTab & "</tr>" & vbCrLf
iNRWiersza = iNRWiersza + 1
rs.MoveNext
Loop

Response.Write "</table>" & vbCrLf
Response.Write "<p ALIGN='CENTER'>Strona " & iBiezacaStr & " / " & iLiczbaStr
Response.Write ", Rozmiar strony=" & iRozmiarStr & "<p>"
%>
<BODY>
<%
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
%>
</P><P ALIGN='CENTER'>
<%
iNast = iBiezacaStr + 1
iPoprz = iBiezacaStr - 1
iOst = iLiczbaStr
iPierw = 1
Response.Write "<INPUT id=button1 type=button value='Pierwszy' name=button1 onclick='mSkocz(" & iPierw & ")'>"
Response.Write "<INPUT id=button2 type=button value='Poprzed.' name=button2 onclick='mSkocz(" & iPoprz & ")'>"
Response.Write "<INPUT id=button3 type=button value='Następny' name=button3 onclick='mSkocz(" & iNast & ")'>"
Response.Write "<INPUT id=button4 type=button value='Ostatni ' name=button4 onclick='mSkocz(" & iOst & ")'>"
Function mPokazLink(mPole)
mPokazLink = "<B><A HREF='wiersz.asp?mID=" & mPole & "'>" & mPole & "</A></B>"
end function
%>
</P>
</BODY></HTML>

<%
Response.Expires = -1000 'Makes the browser not cache this page
Response.Buffer = True 'Buffers the content so our Response.Redirect will work

' If Session("UserLoggedIn") <> "true" Then
' Response.Redirect("login.asp")
' End If

mKlucz = Request.QueryString("mID")

Response.Write "<P><B>KLUCZ=" & mKlucz & "<P>"

if mKlucz <> "" then
mWhere = " where nr_inw = '" & mKlucz & "'"
end if
set cn = CreateObject("ADODB.Connection")
set rs = CreateObject("ADODB.Recordset")
' cnstr = "DSN=mssql;UID=sa;PWD=piotrola"
cnstr = "DSN=mssql;UID=inventuser;PWD=userinvent"
cn.ConnectionString = cnstr
cn.Open
rs.ActiveConnection = cn
rs.Open "Select * from sprzet" & mWhere, cnstr

Response.Write "<table FONT='Arial Narrow' ALIGN='CENTER' border='1'>" & vbCrLf
For I = 0 To rs.Fields.Count - 1
Response.Write vbTab & "<tr>" & vbCrLf

Response.Write vbTab & vbTab & "<td>"
Response.Write rs.Fields(I).Name
Response.Write "</td>" & vbCrLf

if rs.Fields(I).Type <= 14 then
mAlign = "<td align='right'>"
else
mAlign = "<td align='left'>"
end if
Response.Write vbTab & vbTab & mAlign
Response.Write rs.Fields(I)
Response.Write "</td>" & vbCrLf

Response.Write vbTab & "</tr>" & vbCrLf
Next 'I
Response.Write "</table>" & vbCrLf
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing

%>

sdsds

poniedziałek, czerwca 25, 2007

Lista plików związana z korektami:
  1. mLib_kor.js
    Biblioteka funkcji JS
    testarr.php
    Tworzenie tablicy do edycji korekt
    kor_zapisz.php
    Zapisz korektę do tablicy tymczasowej
    dok_zapisz.php
    Zapisz dokument o korekcie
    korektaZam.php
    Wejście do korekt zamówień
    dok_weryf.php

    pokazKor.php

    style_kor.css

    syle.css

    editKor.php

    kor_pobierz.php

    jestKorekta.php
    Czy jest podobna korketa w toku
    pobierzKlucz.php
    kor_form
    proc wbudowana do korekt
    dod_form
    proc wbudowana do planu










  2. Sprawy organizacyjne - serwer weglokoksowy - 192.168.254.166 (admincoig/ginewr@951)(marekw/zaq12wsx)
  3. VFP gdy wysyła znaki do internetu poprzez XMLHTTP zawsze przekodowuje je na UTF-8 (automatycznie), dlatego skrypt po stronie serwera powinien przekodować je na ISO Latin 2 (bo taki jest standard przechowania danych w polach tekstowych)
  4. Ciekawe strony:
    1. www.ajaxpro.info - przykładowa lekcja: http://www.ajaxpro.info/Examples/DataSets/default.aspx
    2. jsc.sourceforge.ne - przykłady appletów
    3. ajaxrain.com
    4. gliff - dla dzieci
  5. Usuń znaki "dziwne" w polach tekstowych
  6. Co z escape i innymi funkcjami w JS
  7. Quintura - ciekawa przeglądarka
  8. Zasoby publiczne - jarjawor
  9. Wykorzystanie możliwości InterOp Form
  10. Wybór frameworka dla AJAX - "AJAX: selecting a framework that fits" - http://www.drdobbs.com/dept/webservices/199203087
  11. Kursy ASP.NET dla JSP - http://www.learn2asp.net/jsp/Campaign.aspx?RefID=CMP001
  12. Jakis framework musi być dla JS
  13. Tigermouse - framework dla AJAX w PHP - http://tigermouse.epsi.pl/doku.php?id=otherframeworks
  14. IBM DB2 przechowuje XML natywnie - http://www.db2mag.com/story/showArticle.jhtml?articleID=191502768, uwaga na dostęp do nowych typów danych: "C/C++ and scripting solutions such as PHP and Perl often use an ODBC interface to SQL data. The DB2 CLI extends the ODBC 3.51 API with support for additional types, including the new XML type.

    When writing CLI programs, the symbolic SQL data type for XML columns is SQL_XML and the default symbolic C data type is SQL_C_BINARY. Permissible conversions include SQL_C_CHAR, SQL_C_WCHAR, and SQL_C_DBCHAR. The default precision for XML columns is 0, but it's a defined length for external routines.

    IBM is deprecating the type 2 JDBC driver for DB2 9. It suggests moving to the IBM DB2 Driver for JDBC and SQLJ, a single driver that combines type 2 and type 4 features. It supports the Java Transaction Service (JTS), Java Transaction API (JTA), JDBC 3.0 API, and SQLJ capabilities that have JDBC counterparts.

    To access DB2 from Java, developers can use static SQL with SQLJ and dynamic SQL with JDBC. Java does not have an XML type, so invoking the JDBC GetTypeInfo metadata method will report the type of an XML column as java.sql.Types.OTHER.

    Using JDBC ResultSet.getXXX methods, you can retrieve an entire XML column or a sequence from the column. When you retrieve XML data using a JDBC getXXX method, it's in a serialized string format. The getXXX method will output the result in the format corresponding to the method name (for example, getAsciiStream). In the case of ResultSet.getObject, you can cast the object to the DB2Xml type, assign it to a DB2Xmlobject and use a DB2Xml.getDB2XXX method to output the data to the desired type.

    An enhanced set of add-ins for Microsoft Visual Studio 2005 include support for building and testing .Net applications using XML data stored in DB2 9. DB2 includes providers for OLE DB and ADO.Net, including the DB2 .Net Data Provider, the OLE DB .Net Data Provider and the DB2 Data Provider for .Net Framework 2.0. The OLE DB Provider and OLE DB .Net Data Provider don't support the new XML type. To access an XML column with use the ODBC .Net Data Provider, you map it to SQL_LONGVARCHAR."


Niedziela
  1. http://www.netzgesta.de/glossy/
  2. Historia rozwoju przeglądarek - http://upload.wikimedia.org/wikipedia/commons/7/74/Timeline_of_web_browsers.svg
  3. Filozofia historii - http://www.friesian.com/philhist.htm
  4. http://popurls.com/
  5. http://web2.0slides.com/ - przegląd aplikacji web2, są aplikacje, które nawet filozofom sie nie śniły
  6. Sposoby na wydajność i osiągnięcie sukcesu (http://zenhabits.net/2007/02/top-10-productivity-hacks-overview/)
    1. Pamiętaj o MIT (most important things) w ciągu dnia (mimo wielu przeszkód)
    2. Wstawaj wcześnie
    3. Filtruj czytane przez siebie informcje
    4. Utrzymuj ład i porządek w miejscu pracy
    5. Zacznij pracę wcześniej
    6. Unikaj spotkań
    7. Unikaj niekoniecznych prac, rób to co posuwa cię do celu
    8. Zacznij dzień od najtrudniejszych zadań
    9. Pracuj bez sieci jak długo to jest możliwe
    10. Zrób coś co cię bardzo pasjonuje
  7. Yahoo GUI - np. menu jest świetne w konteście nowego Portalu AS, problem tylko jak zapewnić bezpieczny login
  8. Obserwuj stronę - ajaxian.com
  9. JayRock - implementacja JSON w .NET
  10. http://braincast.nl/samples/jsoneditor/ - edytor struktur JSON (ciekawy)
  11. Dywagacje na temat Pink Floyd - http://amix.dk/blog/viewEntry/19139
  12. MagicDom - http://amix.dk/blog/viewEntry/19196
  13. Co nowego w Google Gears - http://ajaxian.com/archives/audible-ajax-episode-21-dojo-offline-on-google-gears
  14. Nowe, rewolucyjne podejście do uwierzytelnienia - http://whobar.org/related-resources/
  15. Wynalazki Google jako API:
    1. http://code.google.com/support/bin/answer.py?answer=70654
    2. Google Account Authentication API
  16. Dean Edwards - http://dean.edwards.name/weblog/
  17. 7 technik, ktore warto poznać - http://www.digital-web.com/articles/seven_javascript_techniques/
  18. Calvin Hsia - June 21 - http://blogs.msdn.com/calvin_hsia/ - uruchom dowolny program w VFP
  19. Rick S - JavaScript dilema - http://west-wind.com/weblog/
  20. Bezpieczeństwo w MS WS- http://msdn.microsoft.com/msdnmag/issues/03/04/ws-security/default.aspx
  21. Korzystanie w WS w kliencie JS - http://www.codeproject.com/useritems/clientproxyfor_webservice.asp
  22. http://domscripting.com/book/sample/
  23. Kursy MS - http://www.learn2asp.net/web/Campaign.aspx

sobota, czerwca 23, 2007

Piatek
  1. Konwersja formularzy VFP na .NET i innych obiektów - http://www.vfpconversion.com/Tools.aspx
  2. Przykład pobierania danych z Internetu Rick - http://www.west-wind.com/presentations/wchttp.htm, a tu jest więcej programów pomocniczych
  3. Przykład jak pobierać dane z Internetu w .NET - http://www.west-wind.com/presentations/dotnetWebRequest/dotnetWebRequest.htm
  4. Lista narzędzi do VFP - http://west-wind.com/webtools.asp, np. do wsparcie SOAP 2.0
  5. Stosowanie Generics w C# z blogu markusa:
  6. ArrayList myForms = new ArrayList();
    myForms.Add(new Form());
    myForms.Add(new Form());
    myForms.Add(new CustomerEditForm());
  7. Lub w VFP:
  8. LOCAL myForms
    myForms = CreateObject("ArrayList")
    myForms.Add(CreateObject("Form"))
    myForms.Add(CreateObject("Form"))
    myForms.Add(CreateObject("CustomerEditForm"))
  9. Jak przejrzeć listę:-
  10. foreach (Form frm in myForms)
    {
    frm.Show();
    }
  11. A jak się zabezpieczyć przed podaniem złego typu danych?
  12. List<Form> myForms = new List<Form>();
    myForms.Add(new Form());
    myForms.Add(new Form());
    myForms.Add(new Button()); // Compiler Error!!!
  13. Takie ogolne zasoby o VFP - http://www.objenv.com/cetus/oo_visual_foxpro.html a to jest hostowane na http://www.cetus-links.org/ (tamże są linki do np. Java - jak tworzyć skryptlety)
  14. Uwaga można popracować trochę nad rozwiązaniem Java Applet (DLL lokalne można ręcznie lub poprzez WinAPI w VFP łatwo zainstalować)
  15. Uniezależnić się od kontenera dbc w aplikacjach VFP, np. kursy walut.
  16. VFP link - http://www.markusegger.com/Articles/Article.aspx?quickid=0606026
  17. Weblog Strahl - http://west-wind.com/weblog/ (dylemat jaki wybrać framework)
  18. Rozsądne korzystanie z AJAX - http://www.thinkvitamin.com/features/ajax/responsible-asynchronous-scripting
  19. Klasyk JS - http://simonwillison.net/tags/javascript/
  20. O JS - http://simonwillison.net/tags/javascript/, ciekawe linki:
    1. http://javascript.weblogsinc.com/2006/07/31/xmlhttprequest-in-ie-7/ - nieprawda, że w IE 7 jest natywna obsługa XMLHTTP
    2. http://javascript.weblogsinc.com/2006/08/01/rotating-solar-system/ - solar system
    3. http://widgets.yahoo.com/workshop/ - jednak Yahoo Widgets
    4. http://thinkvitamin.com/, http://ajaxian.com/
  21. Dziel się ciekawymi slajdami - www.slideshare.com np. - http://www.slideshare.net/simon/javascript-libraries-the-big-picture/
  22. Rozszerzenia w JS na bazie Yahoo GUI - http://extjs.com/
  23. Ciekawe jak testować wykonanie skrypty w IE (a nawet w FF) mając do dyspozycji VWD - bernicode
  24. Tamże ciekawe dywagacje na temat stosowania eval (to jest wywołanie kompilatora JS) w JS (znany architekt JavaScriptu - Douglas Cronkford, zabrania stosowania tej instrukcji). Autor pokazuje, że rozumne stosowanie eval pozwala na szybsze wykonanie kodu
  25. Biblioteki w JS (np. prototype) są piękne, ale zabierają dużo miejsca (71KB) można jes skompresować (nawet do 31KB) jak? Tutaj jest odpowiedż.
  26. Super, super indeks do tutoriali - GoToAPI - http://www.gotapi.com/html
  27. Mamy nową bilbilotekę prototype - http://prototypejs.org/2007/5/1/prototype-1-5-1-released
  28. Kurs szybkiego wprowadzenia do prototype - http://www.refreshaustin.org/presentations/prototype-scriptaculous-crash-course/
  29. Tutoriale od Dustin Diaz - http://www.dustindiaz.com/
  30. Może to być dobry edytor JS w środowisku Eclipse - http://www.spket.com/
  31. Super strona o AJAX - ajaxian.com i tam artykuł - Base diving with Gears, Google spreadsheet, FF 3 będzie miał wbudowane wsparcie dla SQLLite

poniedziałek, czerwca 18, 2007

Adresy o SSL:
  1. SSL in WinHTTP - nowość w .NET Framework 3.0, klient wystawia certyfikat uwierzytelniający (z lokalnego repozytorium) do serwera przy pomocy protokołu WinHTTPS (dla aplikacji korzystających z COM) lub WinHTTP API (w C++). W przypadku obiektu WinHTTP mamy nowe polecenie WinHttpRequest.SetClientCertificate :
    • // Instantiate a WinHttpRequest object.
    • var HttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
    • // Open an HTTP connection.
    • HttpReq.Open("GET", "https://www.fabrikam.com/", false);
    • // Select a client certificate.
    • HttpReq.SetClientCertificate( "LOCAL_MACHINE\Personal\My Middle-Tier Certificate");
    • // Send the HTTP Request.
    • HttpReq.Send();
  2. Oto pełna lista funkcji w nowym WinHTTP (w .NET framework 3.0) - http://msdn2.microsoft.com/en-us/library/aa384257.aspx
  3. Wystaw swoje (klienckie) akredytacje do serwera- SetCredentials(...) - http://msdn2.microsoft.com/en-us/library/aa384112.aspx
  4. Zalecenia bezpieczeństwa stosowania WinHTTP - http://msdn2.microsoft.com/en-US/library/aa384266.aspx
  5. Forum MSDN - http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=47&SiteID=1
  6. Przykład w C++ na WinHTTP - http://www.codeproject.com/internet/webcrawler.asp
  7. Web Browser Express - http://msdn2.microsoft.com/en-us/library/ms379558(vs.80).aspx
  8. Autentykacja w WinHTTP -http://msdn2.microsoft.com/en-us/library/aa383144.aspx
Poniedziałek:
  1. JSP porady (Best Practices) - http://www-128.ibm.com/developerworks/java/library/j-jsp05133.html
  2. Jak stosować Hibernate - http://mycodeblog.blogspot.com/search/label/Hibernate
  3. Zachowanie stanu -hibernacja - http://www.hibernate.org/152.html

sobota, czerwca 16, 2007

Sobota

  1. Właśnie wróciłem z Krakowa. Byliśmy tam z synem Piotrusiem w Muzeum Lotnictwa.
  2. Poczatki tworzenia apliacji webowych o dużej inetraktywności - http://www.alexhopmann.com/xmlhttp.htm, autor trochę broni się przed atakami bardziej od niego utytułowanego Adam Bosworth (tu ). Myślę, że prawda leży gdzieś pośrodku.
  3. Waga - należy uznać język JavaScript za pełnoprawny język programowanie do obsługi narzędzia komunikacyjnego z Internetem tj. przeglądarki internetowej. Dopóki sposobem do uruchamiania stron www z Internetu jest przeglądarka dopóki język ten ma rację bytu i musi być uznawany.
  4. MS również nie pozostaje w tyle za twórcami narzędzi wspomagających technologię AJAX - stworzył bibliotekę AJAX 1.0
  5. Blog w MSDN o IE.
  6. Bardzo mądry blog - http://flex2.blogspot.com/feeds/posts/default
  7. Szkolenie - http://www.netbeans.org/kb/55/vwp-helloweb.html
  8. Jak używać XML to we właściwej wersji - http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx
  9. Ciekawe czy firmy wspierające J2EE np. JBoss czy BEA ma własne rozszerzenia w postaci jakiś datagrid.
  10. Świetny artykuł na temat interoperability (kooperacji i wymiany) w betanews - rozmowa z TOM ROBERTSON, General Manager for Interoperability and Standards, Microsoft. Cztery filary interoperability:
    1. standardy (nie ma jednego standardu w danej technologii, powinno być kilka standardów do wyboru ale wszystkie one powinny być w stanie współpracować ze sobą),
    2. swobodny dostęp do technologii (na zasadzie open source, podpisania umowy o wymianie IP lub licencji otwartej MS Open Specification Promise),
    3. współpraca zespołów oraz
    4. wymienialność aplikacji

czwartek, czerwca 14, 2007

Czwartek
  1. Dynamiczne języki mają się dobrze, mało kto pamięta, że MS pierwszy rozpoczął promocję języków skryptowych wprowadzając i rozwijając sławny Basic a potem Visual Basic. Wygląda na to, że teraz po latach wraca do swego pomysły. Na tegorocznym TechEd wprowadził temat DLR (dynamic language runtime obok działającej już CLR) platformy .NET Framework 3.5, w której poczesne miejsce będą miały właśnie te języki (od IronPython po IronRuby). Ukłon w stronę open-source - będą otwarte dla wszystkich chętnych. Z jednym zastrzeżeniem - serwisy SOA, tam mają królować jedynie CLR (wraz z WCF i serwerami w stylu BizTalk).
  2. Wg. MS języki dynamiczne mają swoje miejsce i to jest front-end apliakacji (tj. ASP.NET, Windows Forms, WPF, dynamic languages w śrosowisku ASP). Oznacza to funkcję wykorzystania i pobierania serwisów.(Na podstawie serwisu BetaNews: Microsoft's .NET Evangelist Spells Out Future Role for Dynamic Languages)
  3. http://www.code-magazine.com/article.aspx?quickid=0703112&page=6
  4. http://www.codinghorror.com/blog/archives/000857.html
  5. http://www.almaer.com/blog/archives/001516.html
  6. http://www.ploug.org.pl/school.php
  7. http://yuiblog.com/blog/2007/06/12/module-pattern/
  8. http://www.expertsrt.com/tutorials/Rod/ajaht.php
  9. http://blog.pmarca.com/2007/06/essential_html_.html
  10. http://theundersigned.net/2007/06/time-to-learn-a-bit-ajax/
  11. http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1633254&SiteID=1
  12. http://www.miniajax.com/

wtorek, czerwca 12, 2007

Ciekawy wtorek

  1. Do otwarcia połączenia sieciowego na poziomie HTTP służy WinHTTP - jest dosyć dobrze udokumentowany na MSDN, należy zwrócić uwagę na dwa polecenia:
    1. Ustawienie akredytacji dla serwerów:
      1. WinHttpReq.SetCredentials( "marekw@coig.katowice.pl", "Trava16", HTTPREQUEST_SETCREDENTIALS_FOR_PROXY );
      2. WinHttpReq.SetCredentials( "marekw@coig.katowice.pl", "Trava16",HTTPREQUEST_SETCREDENTIALS_FOR_SERVER );
    2. Ustawienie serwera proxy:
      1. WinHttpReq.SetProxy( HTTPREQUEST_PROXYSETTING_PROXY, "proxy.coig.com:3128", "*.microsoft.com");
    3. Dzięki tym zabiegom unikamy zapytania o konto/hasło co jest b. ważne gdy tworzymy aplikacje serwerowe.
  2. Na serwerze istnieją trzy narzędzia pomocnicze do administrowania HTTP i SSL przy wykorzystaniu WinHTTP:
    1. WinHTTPCfg - do zarządzania certyfikatami
    2. ProxyCfg - do zarządzania ustwaieniami proxy
    3. WinHTTPTrace - przeglądanie dziennika transmisji
  3. Forum - http://www.derkeiler.com/Newsgroups/microsoft.public.platformsdk.security/2004-04/subject.html#223

poniedziałek, czerwca 11, 2007

Pracowity poniedziałek:
  1. Przechodzenie przez proxy - WinHTTPs
  2. Serwis udostępniający slide-y (http://www.slideshare.net/tag/javascript):
    1. http://www.slideshare.net/Adieu/advanced-javascript/
  3. Nowe podejścia do skryptów w JS (http://www.easy-reader.net/, ):
    1. Stosowanie:
      1. debugger'a np. Firebug
      2. testowane Selenium
    2. Inteligentne trasowanie programu - http://www.easy-designs.net/code/jsTrace

niedziela, czerwca 10, 2007

Linki niedzielne:
  1. Finjan Secure browsing - wtyczka do przeglądarki IE/FF sprawdza adresy
  2. SQL Server Compact Edition i ksiązki online
  3. GG - "Oracle sql develper" -> HTML Express Tutorial -> PHP/NET tworzenie aplikacji
  4. http://raphaelstolt.blogspot.com/2007/06/handling-json-responses-on-client-side.html
  5. http://zedgraph.org/wiki/index.php?title=Sample_Graphs - ZedGraph Control
    1. Opis na codeproject - http://www.codeproject.com/csharp/zedgraph.asp
  6. Bezpieczeństwo - http://iterativerose.com/Presentations/Intro_to_Security.zip
    1. Prezentacje - http://iterativerose.com/Presentations/JimHolmes-FundamentalsOfSecurity.wmv
  7. Książka - encyklopedia o open-source projektach dla .NET - spis treści - http://iterativerose.com/WinDevPowerTools/TOC.aspx
  8. http://ekrantz.com/index.php/2007/06/06/json-and-associative-arrays.html
  9. http://framework.zend.com/ - framework od Zenda
  10. Oracle i: BLOB, PL/SQL, XML, HTML Express
  11. http://weblogs.foxite.com/bernardbout/default.aspx - ciekawy weblog o VFP
  12. http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,af69b23d-39ff-424f-aa2b-6c25a05aa80e.aspx
  13. http://www.tek-tips.com/
  14. O .NET - http://www.tek-tips.com/
  15. O VFP - http://west-wind.com/wconnect/weblog/ShowEntry.blog?id=533

sobota, czerwca 09, 2007

Koniec TechEd (reportaż z BetaNews):
  1. MS wreszcie chce wspierać standardy (nawet JSON), i zrozumiał, że nie można zmuszać użytkownika do swoich rozwiązań, jeśli są inne rozwiązanie, ktore to robią w bardziej elegancki i wygodniejszy sposób.
  2. Server Core Installation (m.in. IIS) dla MS Server 2008 oznacza naśladowanie Linuxa (będzie to interfejs znakowy)
  3. Poprawa wsparcie standardów w IE, Doug Stamper kierownik tego projektu nie ma łatwego zadanie (spaceruje po cienkiej linie - z jednej strony chce lepiej wspierać standardy W3C z drugiej nie chce sytuacji w której nowy IE 8 nie będzie otwierał "starych" stron wykonanych w starych technologiach IE)
  4. Micro .NET Framework oraz DLR - dynamic language runtime dla IronPython (Ruby i Basic)
  5. SilveLight - poważny konkurent dla Adobe, ale co z tego wyjdzie. Zaletą jest możliwość towrzenia aplikacji w VS 2005.

środa, czerwca 06, 2007

Narzędzia dla deweloperów:

  1. SELENIUM dla Firefox
  2. http://www.squarefree.com/bookmarklets/webdevel.html - badanie strony webowej
  3. http://www.squarefree.com/bookmarklets/webdevel.html - shell
  4. http://jroller.com/page/aalmiray/?anchor=running_groovy_on_an_applet - jak obsługiwać applety z JS
  5. http://blogs.msdn.com/calvin_hsia/archive/2007/05/16/allowing-optional-parameters-in-your-com-objects.aspx - Calvin Hsia
  6. http://json.org/JSONRequest.html
  7. http://blog.monstuff.com/archives/000296.html
  8. Na podstawie (http://www.quirksmode.org/blog/archives/2005/09/addevent_recodi.html) - http://ejohn.org/apps/jselect/event.html
  9. http://jsc.sourceforge.net/
  10. http://www.oracle.com/technology/tech/java/ajax.html
  11. Oracle Instant + Tora
  12. http://tools.devshed.com/?go=1&option=com_mechtools&tool=9&url=http%3a%2f%2fblog%2emonstuff%2ecom%2farchives%2f000287%2ehtml

Klient Oracle pod windows:
  1. Można zainstalować na szybko sterowniki typu instant. Są do ściągnięcia na stronie Oracle'a. Do ODBC są oddzielne i do JDBC. Procedura instalacyjna przebiega bezboleśnie. Trzeba pamiętać jedynie (i to jest bardzo ważne) o zainicjowaniu zmiennych środowiskowych:
  • NLS_LANG=POLISH_poland.EEMSWIN1250 oraz
  • TNS_ADMIN=c:orac
  1. Należy jeszcze utworzyć w katalogu gdzie jest zainstalowany ten "instantClient" plik tnsnames.ora o przykładowej treści:
  2. c3 = (DESCRIPTION = (ADDRESS = (PROTOCOL= TCP)(Host= c3)(Port=1522)) (CONNECT_DATA = (SID = devy)) )

Wprawki w Oracle:

  1. create sequence S_NPDES_ADDRESS_HISTORY increment by 1 start with 1 nocache;
  2. create or replace trigger kursy_BEFORE_INSERT
    before insert on kursy for each row
    declare
    v_Id Number;
    BEGIN
    If :new.mId Is Null or :new.mId < 1 Then
    select seq_kursy.nextval into v_Id from dual;
    :new.mId := v_Id;
    End If;
    End;
  3. insert into kursy values ('xxxx',1,'xx',2,0);

wtorek, czerwca 05, 2007

Co każdy programista Windows powinien wiedzieć (tu ). Opublikowano tu listę zagadnień, które powinien zanać każdy .NET-owiec. Jednym z ważniejszych zagadnień jest znajomość różnicy między wątkiem (thread) a procesem (process).

  1. Wątek to:
    • A private virtual address space
    • An executable program that is mapped into the process' virtual address space
    • A list of open handles to system resources that are accessible to all threads in the process
    • An access token (a security context that identifies the user, security groups, and privileges associated with the process)
    • A process ID (unique identifier)
  2. Proces to:
    • The neighborhood, bounded by its limits (A private virtual address space)
    • The drug den conversion operation (An executable program that is mapped into the process' virtual address space)
    • The tally of all the stores the Narayans now run (A list of open handles to system resources that are accessible to all threads in the process)
    • Information on the outsiders0 [An access token (a security context that identifies the user, security groups, and privileges associated with the process)]
    • The stain-encrusted hoodie [A process ID (unique identifier)]
    • At least one gang member (At least one thread of execution) – after all, how do you have a drug den conversion operation without anyone working towards it?

  3. Pytanie nie jest banalne, Windows znacznie lepiej zarządza wątkami. Dlatego przy przenoszeniu do środowiska Windos oprogramowania pisanego pod Linux'a się problemy wydajnościowe, szczególnie gdy apliakcja przenoszona napisana była w procesach (wątki w Linux są nowością). Firma Zen współpracuje właśnie z MS nad zwiększeniem efektywności działania PHP (przepisuje go na wątki?) pod Windows.

poniedziałek, czerwca 04, 2007

Triki w JS (http://developer.mozilla.org/en/docs/A_re-introduction_to_JavaScript)

  1. Tworzenie obiektów:
    1. var obj = new Object();
    2. var obj = {};
  2. Dostęp do nich:
    obj.name = "Simon" var name = obj.name; lub
    obj["name"] = "Simon"; var name = obj["name"];
  3. obj.for = "Simon"; // Syntax error, because 'for' is a reserved word obj["for"] = "Simon"; // works fine
  4. var obj = {     name: "Carrot",     "for": "Max",     details: {         color: "orange",         size: 12     } }
  5. > obj.details.color orange > obj["details"]["size"] 12
  6. Pętla: 
    for (var i = 0, len = a.length; i < len; i++) {     // Do something with a[i] }
  7. for (var i = 0, item; item = a[i]; i++) {     // Do something with item }
  8. for (var i in a) {   // Do something with a[i] }
  9. a[a.length] = item;                 // same as a.push(item);
  10. a.toString(), a.toLocaleString(), a.concat(item, ..), a.join(sep), a.pop(), a.push(item, ..), a.reverse(), a.shift(), a.slice(start, end), a.sort(cmpfn), a.splice(start, delcount, [item]..), a.unshift([item]..)
  11. Inne funkcje: 
    function add() {     var sum = 0;     for (var i = 0, j = arguments.length; i < j; i++) {         sum += arguments[i];     }     return sum; }  > add(2, 3, 4, 5) 14
  12. Functions

    Along with objects, functions are the core component in understanding JavaScript. The most basic function couldn't be much simpler:

    function add(x, y) {     var total = x + y;     return total; } 

    This demonstrates everything there is to know about basic functions. A JavaScript function can take 0 or more named parameters. The function body can contain as many statements as you like, and can declare its own variables which are local to that function. The return statement can be used to return a value at any time, terminating the function. If no return statement is used (or an empty return with no value), JavaScript returns undefined.

    The named parameters turn out to be more like guidelines than anything else. You can call a function without passing the parameters it expects, in which case they will be set to undefined.

    > add() NaN // You can't perform addition on undefined 

    You can also pass in more arguments than the function is expecting:

    > add(2, 3, 4) 5 // added the first two; 4 was ignored 

    That may seem a little silly, but functions have access to an additional variable inside their body called arguments, which is an array-like object holding all of the values passed to the function. Let's re-write the add function to take as many values as we want:

    function add() {     var sum = 0;     for (var i = 0, j = arguments.length; i < j; i++) {         sum += arguments[i];     }     return sum; }  > add(2, 3, 4, 5) 14 

    That's really not any more useful than writing 2 + 3 + 4 + 5 though. Let's create an averaging function:

    function avg() {     var sum = 0;     for (var i = 0, j = arguments.length; i < j; i++) {         sum += arguments[i];     }     return sum / arguments.length; } > avg(2, 3, 4, 5) 3.5 

    This is pretty useful, but introduces a new problem. The avg() function takes a comma separated list of arguments - but what if you want to find the average of an array? You could just rewrite the function as follows:

    function avgArray(arr) {     var sum = 0;     for (var i = 0, j = arr.length; i < j; i++) {         sum += arr[i];     }     return sum / arr.length; } > avgArray([2, 3, 4, 5]) 3.5 

    But it would be nice to be able to reuse the function that we've already created. Luckily, JavaScript lets you call a function and call it with an arbitrary array of arguments, using the apply() method of any function object.

    > avg.apply(null, [2, 3, 4, 5]) 3.5 

    The second argument to apply() is the array to use as arguments; the first will be discussed later on. This emphasizes the fact that functions are objects too.

    JavaScript lets you create anonymous functions.

    var avg = function() {     var sum = 0;     for (var i = 0, j = arguments.length; i < j; i++) {         sum += arguments[i];     }     return sum / arguments.length; } 

    This is semantically equivalent to the function avg() form. It's extremely powerful, as it lets you put a full function definition anywhere that you would normally put an expression. This enables all sorts of clever tricks. Here's a way of "hiding" some local variables - like block scope in C:

    > var a = 1; > var b = 2; > (function() {     var b = 3;     a += b; })(); > a 4 > b 2 

    JavaScript allows you to call functions recursively. This is particularly useful for dealing with tree structures, such as you get in the browser DOM.

    function countChars(elm) {     if (elm.nodeType == 3) { // TEXT_NODE         return elm.nodeValue.length;     }     var count = 0;     for (var i = 0, child; child = elm.childNodes[i]; i++) {         count += countChars(child);     }     return count; } 

    This highlights a potential problem with anonymous functions: how do you call them recursively if they don't have a name? The answer lies with the arguments object, which in addition to acting as a list of arguments also provides a property called arguments.callee. This always refers to the current function, and hence can be used to make recursive calls:

    var charsInBody = (function(elm) {     if (elm.nodeType == 3) { // TEXT_NODE         return elm.nodeValue.length;     }     var count = 0;     for (var i = 0, child; child = elm.childNodes[i]; i++) {         count += arguments.callee(child);     }     return count; })(document.body); 

    Since arguments.callee is the current function, and all functions are objects, you can use arguments.callee to save information across multiple calls to the same function. Here's a function that remembers how many times it has been called:

    function counter() {     if (!arguments.callee.count) {         arguments.callee.count = 0;     }     return arguments.callee.count++; }  > counter() 0 > counter() 1 > counter() 2 

    Custom objects

    In classic Object Oriented Programming, objects are collections of data and methods that operate on that data. Let's consider a person object with first and last name fields. There are two ways in which their name might be displayed: as "first last" or as "last, first". Using the functions and objects that we've discussed previously, here's one way of doing it:

    function makePerson(first, last) {     return {         first: first,         last: last     } } function personFullName(person) {     return person.first + ' ' + person.last; } function personFullNameReversed(person) {     return person.last + ', ' + person.first } > s = makePerson("Simon", "Willison"); > personFullName(s) Simon Willison > personFullNameReversed(s) Willison, Simon 

    This works, but it's pretty ugly. You end up with dozens of functions in your global namespace. What we really need is a way to attach a function to an object. Since functions are objects, this is easy:

    function makePerson(first, last) {     return {         first: first,         last: last,         fullName: function() {             return this.first + ' ' + this.last;         },         fullNameReversed: function() {             return this.last + ', ' + this.first;         }     } } > s = makePerson("Simon", "Willison") > s.fullName() Simon Willison > s.fullNameReversed() Willison, Simon 

    There's something here we haven't seen before: the 'this' keyword. Used inside a function, 'this' refers to the current object. What that actually means is specified by the way in which you called that function. If you called it using dot notation or bracket notation on an object, that object becomes 'this'. If dot notation wasn't used for the call, 'this' refers to the global object. This is a frequent cause of mistakes. For example:

    > s = makePerson("Simon", "Willison") > var fullName = s.fullName; > fullName() undefined undefined 

    When we call fullName(), 'this' is bound to the global object. Since there are no global variables called first or last we get undefined for each one.

    We can take advantage of the 'this' keyword to improve our makePerson function:

    function Person(first, last) {     this.first = first;     this.last = last;     this.fullName = function() {         return this.first + ' ' + this.last;     }     this.fullNameReversed = function() {         return this.last + ', ' + this.first;     } } var s = new Person("Simon", "Willison"); 

    We've introduced another keyword: 'new'. new is strongly related to 'this'. What it does is it creates a brand new empty object, and then calls the function specified, with 'this' set to that new object. Functions that are designed to be called by 'new' are called constructor functions. Common practise is to capitalise these functions as a reminder to call them with new.

    Our person objects are getting better, but there are still some ugly edges to them. Every time we create a person object we are creating two brand new function objects within it - wouldn't it be better if this code was shared?

    function personFullName() {     return this.first + ' ' + this.last; } function personFullNameReversed() {     return this.last + ', ' + this.first; } function Person(first, last) {     this.first = first;     this.last = last;     this.fullName = personFullName;     this.fullNameReversed = personFullNameReversed; } 

    That's better: we are creating the method functions only once, and assigning references to them inside the constructor. Can we do any better than that? The answer is yes:

    function Person(first, last) {     this.first = first;     this.last = last; } Person.prototype.fullName = function() {     return this.first + ' ' + this.last; } Person.prototype.fullNameReversed = function() {     return this.last + ', ' + this.first; } 

    Person.prototype is an object shared by all instances of Person. It forms part of a lookup chain (that has a special name, "prototype chain"): any time you attempt to access a property of Person that isn't set, JavaScript will check Person.prototype to see if that property exists there instead. As a result, anything assigned to Person.prototype becomes available to all instances of that constructor via the this object.

    This is an incredibly powerful tool. JavaScript lets you modify something's prototype at any time in your program, which means you can add extra methods to existing objects at runtime:

    > s = new Person("Simon", "Willison"); > s.firstNameCaps(); TypeError on line 1: s.firstNameCaps is not a function > Person.prototype.firstNameCaps = function() {     return this.first.toUpperCase() } > s.firstNameCaps() SIMON 

    Interestingly, you can also add things to the prototype of built-in JavaScript objects. Let's add a method to String that returns that string in reverse:

    > var s = "Simon"; > s.reversed() TypeError on line 1: s.reversed is not a function > String.prototype.reversed = function() {     var r = "";     for (var i = this.length - 1; i >= 0; i--) {         r += this[i];     }     return r; } > s.reversed() nomiS 

    Our new method even works on string literals!

    > "This can now be reversed".reversed() desrever eb won nac sihT 

    As I mentioned before, the prototype forms part of a chain. The root of that chain is Object.prototype, whose methods include toString() - it is this method that is called when you try to represent an object as a string. This is useful for debugging our Person objects:

    > var s = new Person("Simon", "Willison"); > s [object Object] > Person.prototype.toString = function() {     return '<Person: ' + this.fullName() + '>'; } > s <Person: Simon Willison> 

    Remember how avg.apply() had a null first argument? We can revisit that now. The first argument to apply() is the object that should be treated as 'this'. For example, here's a trivial implementation of 'new':

    function trivialNew(constructor) {     var o = {}; // Create an object     constructor.apply(o, arguments);     return o; } 

    This isn't an exact replica of new as it doesn't set up the prototype chain. apply() is difficult to illustrate - it's not something you use very often, but it's useful to know about.

    apply() has a sister function named call, which again lets you set 'this' but takes an expanded argument list as opposed to an array.

    function lastNameCaps() {     return this.last.toUpperCase(); } var s = new Person("Simon", "Willison"); lastNameCaps.call(s); // Is the same as: s.lastNameCaps = lastNameCaps; s.lastNameCaps(); 

    Inner functions

    JavaScript function declarations are allowed inside other functions. We've seen this once before, with an earlier makePerson() function. An important detail of nested functions in JavaScript is that they can access variables in their parent function's scope:

    function betterExampleNeeded() {     var a = 1;     function oneMoreThanA() {         return a + 1;     }     return oneMoreThanA(); } 

    This provides a great deal of utility in writing more maintainable code. If a function relies on one or two other functions that are not useful to any other part of your code, you can nest those utility functions inside the function that will be called from elsewhere. This keeps the number of functions that are in the global scope down, which is always a good thing.

    This is also a great counter to the lure of global variables. When writing complex code it is often tempting to use global variables to share values between multiple functions - which leads to code that is hard to maintain. Nested functions can share variables in their parent, so you can use that mechanism to couple functions together when it makes sense without polluting your global namespace - 'local globals' if you like. This technique should be used with caution, but it's a useful ability to have.

    [Closures

    This leads us to one of the most powerful abstractions that JavaScript has to offer - but also the most potentially confusing. What does this do?

    function makeAdder(a) {     return function(b) {         return a + b;     } } x = makeAdder(5); y = makeAdder(20); x(6) ? y(7) ? 

    The name of the makeAdder function should give it away: it creates new 'adder' functions, which when called with one argument add it to the argument that they were created with.

    What's happening here is pretty much the same as was happening with the inner functions earlier on: a function defined inside another function has access to the outer function's variables. The only difference here is that the outer function has returned, and hence common sense would seem to dictate that its local variables no longer exist. But they do still exist - otherwise the adder functions would be unable to work. What's more, there are two different "copies" of makeAdder's local variables - one in which a is 5 and one in which a is 20. So the result of those function calls is as follows:

    x(6) // returns 11 y(7) // returns 27 

    Here's what's actually happening. Whenever JavaScript executes a function, a 'scope' object is created to hold the local variables created within that function. It is initialised with any variables passed in as function parameters. This is similar to the global object that all global variables and functions live in, but with a couple of important differences: firstly, a brand new scope object is created every time a function starts executing, and secondly, unlike the global object (which in browsers is accessible as window) these scope objects cannot be directly accessed from your JavaScript code. There is no mechanism for iterating over the properties of the current scope object for example.

    So when makeAdder is called, a scope object is created with one property: a, which is the argument passed to the makeAdder function. makeAdder then returns a newly created function. Normally JavaScript's garbage collector would clean up the scope object created for makeAdder at this point, but the returned function maintains a reference back to that scope object. As a result, the scope object will not be garbage collected until there are no more references to the function object that makeAdder returned.

    Scope objects form a chain called the scope chain, similar to the prototype chain used by JavaScript's object system.

    A closure is the combination of a function and the scope object in which it was created.

    Closures let you save state - as such, they can often be used in place of objects.

    Memory leaks

    An unfortunate side effect of closures is that they make it trivially easy to leak memory in Internet Explorer. JavaScript is a garbage collected language - objects are allocated memory upon their creation and that memory is reclaimed by the browser when no references to an object remain. Objects provided by the host environment are handled by that environment.

    Browser hosts need to manage a large number of objects representing the HTML page being presented - the objects of the DOM. It is up to the browser to manage the allocation and recovery of these.

    Internet Explorer uses its own garbage collection scheme for this, separate from the mechanism used by JavaScript. It is the interaction between the two that can cause memory leaks.

    A memory leak in IE occurs any time a circular reference is formed between a JavaScript object and a native object. Consider the following:

    function leakMemory() {     var el = document.getElementById('el');     var o = { 'el': el };     el.o = o; } 

    The circular reference formed above creates a memory leak; IE will not free the memory used by el and o until the browser is completely restarted.

    The above case is likely to go unnoticed; memory leaks only become a real concern in long running applications or applications that leak large amounts of memory due to large data structures or leak patterns within loops.

    Leaks are rarely this obvious - often the leaked data structure can have many layers of references, obscuring the circular reference.

    Closures make it easy to create a memory leak without meaning to. Consider this:

    function addHandler() {     var el = document.getElementById('el');     el.onclick = function() {         this.style.backgroundColor = 'red';     } } 

    The above code sets up the element to turn red when it is clicked. It also creates a memory leak. Why? Because the reference to el is inadvertently caught in the closure created for the anonymous inner function. This creates a circular reference between a JavaScript object (the function) and a native object (el).

    There are a number of workarounds for this problem. The simplest is this:

    function addHandler() {     var el = document.getElementById('el');     el.onclick = function() {         this.style.backgroundColor = 'red';     }     el = null; } 

    This works by breaking the circular reference.

    Surprisingly, one trick for breaking circular references introduced by a closure is to add another closure:

    function addHandler() {     var clickHandler = function() {         this.style.backgroundColor = 'red';     }     (function() {         var el = document.getElementById('el');         el.onclick = clickHandler;     })(); } 

    The inner function is executed straight away, and hides its contents from the closure created with clickHandler.

    Another good trick for avoiding closures is breaking circular references during the window.onunload event. Many event libraries will do this for you. Note that doing so disables bfcache in Firefox 1.5, so you should not register an unload listener in Firefox, unless you have other reasons to do so.

Przekładaniec ciąg dalszy (na podst. betanews)
Tym projektem G. zademonstrował chęć wzięcia większego udziału na scenie AJAX-a (nawet MS zapisał się do grupy wspierającej tworzenie standardów wokół tej technologii). Firma G chce przede wszystkim stworzyć ogólnie zaakceptowany standard, a dzięki swemu autorytetowi, szanse na to są spore. Dodatkowo G opiera rozwiązanie przechowywania stanu aplikacji w fazie offline na bazie lokalnej SQLlite (dotychczasowe stosowanie technologii cookies jest mało wygodne i ma mnóstwo ograniczeń np. rozmiar danych). Innym słowem chodzi o zmusznenie przeglądarki do zapamietania swego stanu.
Użytkownik aplikacji webowych zaczyna być ostrożny, nie chce przechowywać swoich kluczowych plików na obcym serwerze w Internecie, nie chce również aby ktoś inny miał do nich dostęp poprzez Internet.
Google Gear polega na zabezpieczenie protokołu transmisji na poziomie sesji (session laye security - ssl) oraz na polityce zaufanego źródła - żaden proces, za wyjątkiem procesów uruchomionych przez lokalną aplikację nie może mieć dostępu do lokalnych zasobów (same origin policy). Dodatkowym zabezpieczeniem jest modułowa budowa aplikacji z rozdzieloną funkcjonalnością. Cześć webowa wysyła zapytania o dane lokalne do warstwy "Data Switch Layer" (taki data brooker podobny do mechanizmu CORBA czy COM) i tylko poprzez nią ma dostęp do zasobów lokalnych.

piątek, czerwca 01, 2007

Gear czyli przekładnia (nadzieja SaaS):
Nowa inicjatywa Google polegająca na zaoferowaniu aplikacji klienckiej do przeglądania online Internetu i zapamiętywania informacji lokalnie spotkała się z dużym echem. Za ZDNet ( What Google Gears means for SaaS developers by ZDNet's Phil Wainewright -- Gears is almost a defensive announcement, an admission that the browser needs to move up a gear (pun intended) if it's going to stay relevant to the needs of Web application users.):
Wymagania aplikacji web2 są tak duże (powoli funkcjonalnością przypominają aplikacje klienckie), że możliwości obecnych przeglądarek już niewystarczające. Rozszerzenie funkcjonalności przeglądarek internetowych raczej nie wchodzi w rachubę (zmiany w JS przebiegają b.powoli ponieważ muszą być zgodne ze standardem). Dlatego buduje się rozszerzenia - programy klienckie do pobrania ze strony twórcy aplikacji (zabezpieczone - podpisane cyfrowo z certyfikatem). Ale tu nie tylko chodzi o offline expirience (praca w trybie lokalnym, bez połączenia z Internetem), a raczej o pełne RCA: multimedia, grafika, dostęp do zasobów lokalnych (pliki i urządzenia), szybką reakcję, dostęp do pakietów biurowych. Jednym słowem - greater client-side functionality.
Już mamy na rynku takie technologie: Yahoo Widget, Silverlight czy Apollo, na razie są one niszowe. Wszystkie one niebezpieczne ponieważ "wpuszczają" programy z Internetu do lokalnego komputera.
Chodzi o zbudowanie czegoś pośredniego między aplikacjami uruchamianymi w środowisku przeglądarki a "pełnokrwistą" aplikacją desktop-ową.
Google ma szanse na powodzenie z uwagi na swój autorytet jako pioniera wprowadzającego nowe i udane rozwiązania. Google może pociągnie i nada rozpędowi tą inicjatywę.


Lista tematów:
  1. search.live.com - czasami dobrze jest poszukać zgodnie z nastawieniem MS (jak oni patrzą na problem)
  2. myEclipse -środowisko do Java już za 30 $ rocznie
  3. CodeGear Borland - daje środowisko do tworzenia aplikacji w PHP (ok.250 Eu)
  4. Ciekawy link do historycznej dyskusji Jobs/Gates
  5. Strona do prototype - http://prototypejs.org/
    1. Tutorial - http://prototypejs.org/learn
  6. Przegląd darmowych frameworków do tworzenia tabel (grid) w JS (po stronie klienta) - smashingmagazine.
  7. Enterprise Grid - nitobi
  8. Mootools - przykłady - http://www.chrisesler.com/mootools/index.html
  9. Studium użyteczności - http://www.usability.gov/
  10. Serwer a la furl - http://swik.net/json/del.icio.us%2Ftag%2Fjson/JSON+in+Java/82uu
  11. KompozEr - nowy, poprawiony NVU.
  12. Why Google is more dangerous than Microsoft by ZDNet's Donna Bogatin -- Why Google is More dangerous than Microsoft
  13. Video prezentacje techniczne - http://www.bestechvideos.com/2007/05/31/microsoft-mix07-partying-with-php-and-the-microsoft-platform/
  14. Lekcje Ajaxa - http://www.ajaxlessons.com/2006/03/07/ajax-workshop-4-live-data-with-json-prototypejs/
  15. Blogi - http://blogs.zdnet.com/

czwartek, maja 31, 2007

Nowości AJAX-owe:
  1. Super tutorial o nauce AJAX-a - Max Kiesler.
  2. Biblioteka obsługi SSH w .NET - http://www.tamirgal.com/home/dev.aspx?Item=sharpSsh
  3. Powyższa biblioteka bazuje na innej bibliotece firmy Mentalis. Tutaj są projekty: http://www.mentalis.org/soft/projects.qpx
  4. Ciekawe książki na http://www.infoq.com/minibooks/ruby/
  5. Instruktaż stosowania - http://msdn.microsoft.com/vstudio/express/beginner/

poniedziałek, maja 28, 2007

JSON tu i tam:

  1. Serwer - PHP
    1. $i = array(
      array("id" => 1, "name" => "sumardi"),
      array("id" => 2, "name" => "hassan"),
      array("id" => 3, "name" => "ruby")
      );
    2. echo json_encode($i);
    3. Zwróci - [{"id":1,"name":"sumardi"},{"id":2,"name":"hassan"},{"id":3,"name":"ruby"}]
  2. Klient - JS
    1. for(var i = 0; i < json.length; i++)
      {
      console.info(json.id + " " + json.name);
      }

Ataki na logowanie:

  1. Można logować się do systemu poprzez podanie konta/hasła w czystej postaci, ale to ma swoje wady - podatność na in-the-middle attack tzn. można się podszyć pod dane konto stosując "lewy" serwer DNS (aby temu zapobiec często używa się OpenDNS), wszystko widać w czasie transmisji i w bazie (w kolumnach gdzie się przechowujekont/hasło)
  2. Można hashować hasło po stronie klienta (biblioteka jsSHA2.js na stronie http://anmar.eu.org/,

<form onsubmit="pwField.value = b64_sha256(pwField.value);">

Co to daje? Brak wiedzy o haśle, a nawet jego długości. Wady - musi być włączony JS w przeglądrce, atak słownikowy, atak replay atack (wystarczy podstawić hash zamiast hasła) dlatego podczas transmisji stosuje się tunel SSL.

  1. Można do tego dodać dane specyficzne dla użytkownika np.: <form onsubmit="pwField.value = b64_hmac_sha256(userId.value, pwField.value);">
  2. Wykorzystanie schematu pytanie-odpowiedź (challenge-response) zwanej też CHAP (http://pajhome.org.uk/crypt/md5/auth.html implementacja MD5 i SHA1) - hasło po stronie klienta jest hashowane dodatkowo przy pomocy informacji przysłanej przez serwer

Formaty informacji zakodowanej:

  1. Uwaga - do podpisywania i sprawdzania potrzebne są biblioteki kryptograficzne. Można wyróżnić trzy rodzaje:
    1. CAPICOM - lokalny ActiveX, który można po specjalnych zabiegach uruchamiać w przeglądarce IE, zaleta jest automatyczna dostępność (element CAPICOM jest zawsze obecny w MS Windows XP)
    2. Sigillum - ale nie wiem jak ją dostarczyć do klienta (wpakować do portalu jako "element do pobrania" i zainstalowania)
    3. AspCrypt - automatycznie instaluje się w trakcie wejscia na stronę, działa tylko w IE i w środowisku serwera MS IIS, wydatek ok. 250 USD
  2. PKCS#7 - Informacja jest zakodowana wraz z certyfikatem i kluczem publicznym w tzw. kopercie ("envelope"), można ją odczytać pod warunkiem posiadania klucza prywatnego zawartego w kopercie certyfikatu. Możliwe jest składanie też wielu podpisów. Do odcyfrowania takiej koperty wystarczy jeden klucz prywatny. Public-Key Cryptography Standards (PKCS) are RSA Data Security, Inc.'s series of de-facto standard formats for public-key cryptography. Among all the PKCS standards, PKCS#7 is probably the most widely used one. It describes a general syntax for data that may have cryptography applied to it, such as digital signatures and digital envelopes.
  3. The S/MIME secure mail standard uses PKCS#7 for its digitally signed and encrypted messages. Certificate requests and certificate store (.spc) files also normally use the PKCS#7 format. Every PKCS#7 blob usually encapsulates some content (such as an encrypted message or signed hash value) and one or more certificates used to encrypt or sign this content.

  4. CMS - ...

  5. XML-SIG - ...