<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pamiętnik programisty</title>
	<atom:link href="http://piotr.doniec.eu/devlog/feed/" rel="self" type="application/rss+xml" />
	<link>http://piotr.doniec.eu/devlog</link>
	<description>Jeszcze jeden blog WordPress</description>
	<lastBuildDate>Thu, 04 Feb 2010 09:30:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Prosty przykład wykorzystania Java Servlets, JPA, Oracle 10XE i Glassfish v3</title>
		<link>http://piotr.doniec.eu/devlog/2010/02/prosty-przyklad-wykorzystania-java-servlets-jpa-oracle-10xe-i-glassfish-v3/</link>
		<comments>http://piotr.doniec.eu/devlog/2010/02/prosty-przyklad-wykorzystania-java-servlets-jpa-oracle-10xe-i-glassfish-v3/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 20:03:41 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[glassfish]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[servlet]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=408</guid>
		<description><![CDATA[Celem tego wpisu jest pokazanie w jaki sposób stworzyć dynamiczną prostą aplikację WWW wykorzystującą technologię Java Servlets pobierającą dane z lokalnie dostępnej bazy danych Oracle 10g XE z wykorzystaniem JPA. Całość ma obsługiwać Glassfish v3.
Struktura relacyjna w bazie danych jest bardzo prosta, ale wystarczająca do zapoznania z  JPA &#8211; składa się z tabeli zawierającej [...]]]></description>
			<content:encoded><![CDATA[<p>Celem tego wpisu jest pokazanie w jaki sposób stworzyć dynamiczną prostą aplikację WWW wykorzystującą technologię Java Servlets pobierającą dane z lokalnie dostępnej bazy danych Oracle 10g XE z wykorzystaniem JPA. Całość ma obsługiwać Glassfish v3.<br />
Struktura relacyjna w bazie danych jest bardzo prosta, ale wystarczająca do zapoznania z  JPA &#8211; składa się z tabeli zawierającej dane studentów takie jak imię, nazwisko i z z tabeli opisującej grupy dziekańskie. Obie tabele powiązane są relacją wiele-do-jednego, także grupa może składać się z wielu studentów, natomiast każdy student przynależy do dokładnie 1 grupy.<br />
<span id="more-408"></span><br />
Na wstępie zaznaczam, że jestem początkujący w tej dziedzinie. Jeśli ktoś bardziej doświadczony, znajdzie jakieś nieścisłości lub błędy to proszę o pozostawienie komentarza. Chętnie poprawię i przy okazji czegoś się nauczę.<br />
Opisana wyżej struktura bazy danych jest reprezentowana przez dwie encje połączone relacją i wygląda to następująco:<br />
<center><img src="http://piotr.doniec.eu/devlog/wp-content/uploads/2010/02/jpa_entities1.jpg" alt="jpa_entities" title="jpa_entities" width="516" height="165" class="alignnone size-full wp-image-427" /></center></p>
<p>Java Persistence Api (JPA) jest wykorzystywane do mapowania encji zapisanych w bazie danych (wiersze tabeli) na ich obiektową reprezentację również nazywaną encją. Zbieżność terminów może powodować konsternację dlatego w dalszej części wpisu przez pojęcie encja należy rozumieć tylko odpowiednio opisaną klasę w języku Java.<br />
W ogólnym wypadku każda klasa spełniająca wymogi JavaBean tj. posiadająca bezparametrowy konstruktor oraz metody get i set dla pól może zostać przekształcona w encję. Dla przykładu, Grupa może zostać opisana przez taki komponent:</p>
<pre class="brush: java">
package eu.doniec.piotr.bean

public class Grupa {
    private Long id;

    private String nazwa;
    private String opis;

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getNazwa() { return nazwa; }
    public void setNazwa(String nazwa) { this.nazwa = nazwa; }
    public String getOpis() { return opis; }
    public void setOpis(String opis) { this.opis = opis; }
}
</pre>
<p>Modyfikacja do postaci encji, możliwej do wykorzystania przez JPA do obsługi danych zawartych w tabeli Grupy polega na opisaniu klasy metainformacjami &#8211; adnotacjami z pakietu javax.persistence. Gotowa klasa przedstawia się następująco:</p>
<pre class="brush: java">
package eu.doniec.piotr.persistence;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@NamedQuery(
    name=&quot;findAllGroups&quot;,
    query=&quot;SELECT g FROM Grupa g&quot;
)
@Table(name=&quot;GRUPY&quot;)
public class Grupa implements Serializable {

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String nazwa;
    private String opis;

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getNazwa() { return nazwa; }
    public void setNazwa(String nazwa) { this.nazwa = nazwa; }
    public String getOpis() { return opis; }
    public void setOpis(String opis) { this.opis = opis; }
}
</pre>
<p>Podobnie sytuacja wygląda z klasą Studenta, choć tu sytuacja jest trochę inna. Struktura bazy danych wymaga aby tabela STUDENCI posiadała ograniczenie FOREIGN_KEY na dodatkowe pole GRUPA_ID. W takiej sytuacji w ramach encji Student umieszczamy odwołanie do encji Grupa. Właściwość ta jest dodatkowo oznaczona adnotacją @ManyToOne oznaczającą właśnie że wielu studentów może przynależeć do jednej grupy.</p>
<pre class="brush: java">
package eu.doniec.piotr.persistence;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.ManyToOne;
import javax.persistence.JoinColumn;

@Entity
@NamedQuery(
    name=&quot;findAllStudents&quot;,
    query=&quot;SELECT s FROM Student s&quot;
)
@Table(name=&quot;STUDENCI&quot;)
public class Student implements Serializable {
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private Long nr_indeksu;

    private String imie;
    private String nazwisko;

    @ManyToOne
    private Grupa grupa;

    public Long getNr_indeksu() { return nr_indeksu; }
    public void setNr_indeksu(Long nr_indeksu) { this.nr_indeksu=nr_indeksu; }
    public String getImie() { return imie; }
    public void setImie(String imie) { this.imie = imie; }
    public String getNazwisko() { return nazwisko; }
    public void setNazwisko(String nazwisko) { this.nazwisko = nazwisko; }
    public Grupa getGrupa() { return grupa; }
    public void setGrupa(Grupa grupa) { this.grupa = grupa; }
}
</pre>
<p>Encje są zdefiniowane, pozostało jeszcze je wykorzystać. W tym celu powstanie servlet, który wyświetli nr indeksu, nazwisk i przydział studenta do grupy. W celu wykorzystania stworzonych obiektów trzeba utworzyć obiekt EntityManager&#8217;a, a raczej &#8220;wstrzyknąć&#8221; go do aplikacji &#8211; uzyskuje się to annotacją @PersistenceContext. Utworzony w ten sposób EntityManager jest zarządzany przez kontener aplikacji tzw. container-managed. Sensowne wydaje się wstrzyknięcie go w klasie implementującej ServletContextListener i zapisanie w kontekście servletu, w ten sposób łatwo będzie się do niego dostać:</p>
<pre class="brush: java">
package eu.doniec.piotr.listeners;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.ServletContext;

import javax.persistence.PersistenceContext;
import javax.persistence.EntityManager;

@WebListener()
public class ContextListener implements ServletContextListener {

    @PersistenceContext
    private EntityManager em;

    private ServletContext context;

    public void contextInitialized(ServletContextEvent sce) {
        context = sce.getServletContext();
        context.setAttribute(&quot;EntityManager&quot;, em);
    }

    public void contextDestroyed(ServletContextEvent sce) {
        context.removeAttribute(&quot;EntityManager&quot;);
    }
}
</pre>
<p>Na tym etapie, pozostało już tylko stworzenie serwletu i konfiguracja połączenia z bazą danych. Ostatni, prymitywny fragment kodu wypisuje na ekran nr indeksu, nazwisko i nazwę grupy do której zapisany jest student.</p>
<pre class="brush: java">
package eu.doniec.piotr.servlets;

import eu.doniec.piotr.persistence.Student;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import javax.persistence.EntityManager;
import javax.persistence.Query;

@WebServlet(name=&quot;studenci&quot;, urlPatterns={&quot;/studenci&quot;})
public class Studenci extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType(&quot;text/html;charset=UTF-8&quot;);
        PrintWriter out = response.getWriter();
        try {
            EntityManager em = (EntityManager)getServletContext().getAttribute(&quot;EntityManager&quot;);
            Query q = em.createNamedQuery(&quot;findAllStudents&quot;);

            out.println(&quot;&lt;html&gt;&quot;);
            out.println(&quot;&lt;head&gt;&quot;);
            out.println(&quot;&lt;title&gt;Servlet studenci&lt;/title&gt;&quot;);
            out.println(&quot;&lt;/head&gt;&quot;);
            out.println(&quot;&lt;body&gt;&quot;);
            out.println(&quot;&lt;h1&gt;Servlet studenci at &quot; + request.getContextPath () + &quot;&lt;/h1&gt;&quot;);

            out.println(&quot;&lt;table&gt;&quot;);
            out.println(&quot;&lt;tr&gt;&lt;th&gt;Numer indeksu&lt;/th&gt;&lt;th&gt;Nazwisko&lt;/th&gt;&lt;th&gt;Grupa&lt;/th&gt;&lt;/tr&gt;&quot;);

            List studenci =  q.getResultList();
            for (Iterator iter = studenci.iterator(); iter.hasNext();) {
                Student s = (Student) iter.next();
                out.println(&quot;&lt;tr&gt;&quot;);
                out.println(&quot;&lt;td&gt;&quot; + s.getNr_indeksu() +&quot;&lt;/td&gt;&quot;);
                out.println(&quot;&lt;td&gt;&quot; + s.getNazwisko() + &quot;&lt;/td&gt;&quot;);
                out.println(&quot;&lt;td&gt;&quot; + s.getGrupa().getNazwa() +&quot;&lt;/td&gt;&quot;);
                out.println(&quot;&lt;/tr&gt;&quot;);
            }

            out.println(&quot;&lt;/body&gt;&quot;);
            out.println(&quot;&lt;/html&gt;&quot;);
        } finally {
            out.close();
        }
    } 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
}
</pre>
<p>Plik persistence.xml:</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;persistence version=&quot;1.0&quot; xmlns=&quot;http://java.sun.com/xml/ns/persistence&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&quot;&gt;
  &lt;persistence-unit name=&quot;baza-danych-nauczyciela-pu&quot; transaction-type=&quot;JTA&quot;&gt;
    &lt;provider&gt;oracle.toplink.essentials.PersistenceProvider&lt;/provider&gt;
    &lt;jta-data-source&gt;jdbc/bazanauczyciela&lt;/jta-data-source&gt;
  &lt;/persistence-unit&gt;
&lt;/persistence&gt;
</pre>
<p>Sposób stworzenie źródła danych dla Oracle pod Glassfish wystarczająco dobrze opisany jest tu: <a href="http://technology.amis.nl/blog/1276/configuring-a-oracle-datasource-on-glassfish">http://technology.amis.nl/blog/1276/configuring-a-oracle-datasource-on-glassfish</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2010/02/prosty-przyklad-wykorzystania-java-servlets-jpa-oracle-10xe-i-glassfish-v3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scons &#8211; alternatywa dla Make, Qmake i podobnych</title>
		<link>http://piotr.doniec.eu/devlog/2010/01/scons-alternatywa-dla-make-qmake-i-podobnych/</link>
		<comments>http://piotr.doniec.eu/devlog/2010/01/scons-alternatywa-dla-make-qmake-i-podobnych/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 12:35:20 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Inne]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=404</guid>
		<description><![CDATA[Scons jest oprogramowaniem którego zadaniem jest ułatwienie budowania binarnej wersji napisanego kodu. Twórcy zachwalają swoje dzieło jako między platformowe, łatwiejsze w użyciu i szybsze. Bazuje na Pythonie i dlatego postanowiłem się nim trochę zainteresować.
Pierwsze próby zakończyłem sukcesem. Co mi się bardzo spodobało to możliwość wyboru kompilatora. Mając do dyspozycji g++ z MinGW oraz Visual C++ [...]]]></description>
			<content:encoded><![CDATA[<p>Scons jest oprogramowaniem którego zadaniem jest ułatwienie budowania binarnej wersji napisanego kodu. Twórcy zachwalają swoje dzieło jako między platformowe, łatwiejsze w użyciu i szybsze. Bazuje na Pythonie i dlatego postanowiłem się nim trochę zainteresować.<br />
Pierwsze próby zakończyłem sukcesem. Co mi się bardzo spodobało to możliwość wyboru kompilatora. Mając do dyspozycji g++ z MinGW oraz Visual C++ Compiler, można zadecydować który z nich ma zostać użyty.<br />
Najprostszy plik z instrukcją zdudowania programu to 1 linia:</p>
<pre class="brush: python">
Program(&#039;main.cpp&#039;)
</pre>
<p>Na Windows domyślnie zostanie wykorzystany (o ile dostępny) kompilator Microsoftu. Jeśli jednak chcemy użyć g++, wystarczy dopisać jeszcze jedną linię:</p>
<pre class="brush: python">
env = Environment(tools = [&#039;mingw&#039;], CC = &#039;gcc&#039;, CCFLAGS = &#039;-O2&#039;)
env.Program(&#039;main.cpp&#039;)
</pre>
<p>Piewsze lody przełamane, kolejne próby będą sprawdzały łatwość dołączania zewnętrzych bibliotek jak boost czy qt.</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2010/01/scons-alternatywa-dla-make-qmake-i-podobnych/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SOAP w Pythonie</title>
		<link>http://piotr.doniec.eu/devlog/2010/01/soap-w-pythonie/</link>
		<comments>http://piotr.doniec.eu/devlog/2010/01/soap-w-pythonie/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 15:13:44 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[tricky]]></category>
		<category><![CDATA[webservices]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=396</guid>
		<description><![CDATA[Mimo że sam język jest uważany za potężny z dostępną dużą ilością bibliotek, to nie do koońca jest to prawda. SOAP w Pythonie niestety ale po prostu leży. Są 2 biblioteki umożliwiające tworzenie webserviców i tak naprawdę 2 które umożliwiają korzystanie z już utworzonych. Ja swoje próby rozpocząłem od soaplib, biblioteki która została porzucona przez [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-400" title="soap_python" src="http://piotr.doniec.eu/devlog/wp-content/uploads/2010/01/soap_python-300x227.jpg" alt="soap_python" width="210" height="159" />Mimo że sam język jest uważany za potężny z dostępną dużą ilością bibliotek, to nie do koońca jest to prawda. SOAP w Pythonie niestety ale po prostu leży. Są 2 biblioteki umożliwiające tworzenie webserviców i tak naprawdę 2 które umożliwiają korzystanie z już utworzonych. Ja swoje próby rozpocząłem od soaplib, biblioteki która została porzucona przez twórców, ale w wyniku tzw. forków w miarę często pojawiają się nowe wersje. Niestety był to błąd.<br />
<span id="more-396"></span><br />
Nowe wersje od niezależnych twórców charakteryzują się większą bądź mniejszą ilością błędów. Najlepszą wersją okazała się wersja <strong>cuker soaplib</strong>, nie spełniała tylko 1 wymogu &#8211; generowania jakiegokolwiek kodu na podstawie WSDL. Jest to pewne nadużycie z mojej strony, biblioteka dostarczyła skrypt o nazwie wsdl2py, ale potrafił on poprawnie sparsować i zinterpretować plik wsdl utworzony tylko przez soaplib, co trzeba przyznać jest lekką &#8220;kichą&#8221;. Szkoda, biblioteka aktywnie rozwijana, wiązałem z nią spore nadzieje &#8211; odpadła.<br />
<strong>Suds</strong> to druga biblioteka związana z SOAP, aktywnie rozwijana, chwalona za łatwość korzystania, niestety przykłady dotyczą tylko tworzenia klinetów, serwerów poprostu tworzyć się nie da? W połączeniu z soaplib mogł by to być całkiem ciekawy duet.<br />
Biblioteka webserwisów dla Pythona <strong>ZSI</strong>,  w założeniu ma umożliwiać tworzenie i korzystanie z różnych webserviców, niestety projekt został porzucony w 2007 roku. Ale mimo to miłe zaskoczenie, dostarczane skrypty wsdl2py i wsdl2dispatch bez problemu radzą sobie z przykładowy wsdl dostępnymi w internecie. Tworzone są 3 pliki które potem można wykorzystać do implementacji serwera i klienta. Jednakże żeby nie było zbyt miło, serwer dostarczony z biblioteką jest jedno wątkowy. Jeśli operacje obsługi żądania jednego klienta są czasochłonne, to na ten czas serwer nie odpowiada na żądania innych klientów. Fatalna sprawa, ale! światełko w tunelu, ZSI można połączyć z Apache&#8217;m poprzez wykorzystanie mod_python ( oczywiście nie mogło być wersji dla python 2.6, na szczęście VS poradziło sobie z kompilacją ). Kolejna ślepa uliczka &#8211; jak bym tworzył stronę WWW. Przychodzi żądanie tworzone są wszystkie klasy a po zakończeniu obsługi usuwane &#8211; nie tak sobie wyobrażałem mój system rozproszony, zamiast w Pythonie mógłbym go napisać w PHP (sic!). Powrót do ZSI i eureka, ktoś bardziej doświadczony w tym języku dopisał kilka linii kodu do źródła i serwer stał się wielowątkowy! Połączenie idealne, wielowątkowość obsługi żądań, nie niszczenie wszystkiego po zakończeniu obsługi, możliwośc wypisywania komunikatów na ekran konsoli.<br />
Źródło rozwiązania: http://osdir.com/ml/python.pywebsvcs.general/2008-06/msg00019.html . Autor wykorzystał co prawda ZSI-2.1-a1, ale poprawka działa również na ostatniej stabilnej wersji ZSI-2.0</p>
<p>Na wszelki, skopiowany kod poprawki poniżej:</p>
<blockquote><p>&#8212; ZSI-2.1-a1/ZSI/ServiceContainer.py 2007-08-08 00:56:37.000000000 +0200<br />
+++ ServiceContainer.py 2008-06-19 13:50:11.000000000 +0200<br />
@@ -5,6 +5,7 @@</p>
<p>import urlparse, types, os, sys, cStringIO as StringIO, thread,re<br />
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer<br />
+from SocketServer import ThreadingMixIn<br />
from ZSI import ParseException, FaultFromException,<br />
FaultFromZSIException, Fault<br />
from ZSI import _copyright, _seqtypes, _get_element_nsuri_name, resolvers<br />
from ZSI import _get_idstr<br />
@@ -30,6 +31,7 @@<br />
SimpleWSResource<br />
SOAPRequestHandler<br />
ServiceContainer<br />
+ ThreadedServiceContainer<br />
&#8220;&#8221;"<br />
class NoSuchService(Exception): pass<br />
class UnknownRequestException(Exception): pass<br />
@@ -141,12 +143,16 @@<br />
return SendFault(FaultFromException(e, 0, sys.exc_info()[2]), **kw)</p>
<p>-def AsServer(port=80, services=()):<br />
+def AsServer(port=80, services=(), threaded=False):<br />
&#8221;&#8217;port &#8211;<br />
services &#8212; list of service instances<br />
+ threaded &#8212; in modo multithread ?<br />
&#8221;&#8217;<br />
address = (&#8221;, port)<br />
- sc = ServiceContainer(address, services)<br />
+ if threaded:<br />
+ sc = ThreadedServiceContainer(address, services)<br />
+ else:<br />
+ sc = ServiceContainer(address, services)<br />
sc.serve_forever()</p>
<p>@@ -467,6 +473,11 @@<br />
def removeNode(self, url):<br />
self._nodes.removeNode(url)</p>
<p>+class ThreadedServiceContainer(ThreadingMixIn, ServiceContainer):<br />
+ &#8221;&#8217;Multithreaded version of ServiceContainer.<br />
+ &#8221;&#8217;<br />
+ pass<br />
+</p>
<p>class SimpleWSResource(ServiceSOAPBinding):</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2010/01/soap-w-pythonie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HSSPOJ &#8211; zadanie które nie dawało mi spokoju</title>
		<link>http://piotr.doniec.eu/devlog/2010/01/hsspoj-zadanie-ktore-nie-dawalo-mi-spokoju/</link>
		<comments>http://piotr.doniec.eu/devlog/2010/01/hsspoj-zadanie-ktore-nie-dawalo-mi-spokoju/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 19:37:11 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[Algorytmika]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[spoj]]></category>
		<category><![CDATA[teoria gier]]></category>
		<category><![CDATA[tricky]]></category>
		<category><![CDATA[twierdzenie Sprague-Grundy'ego]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=381</guid>
		<description><![CDATA[Zadanie z konkursu algorytmicznego dla uczniów szkół średnich. Zwróciłem na nie uwagę, gdyż współczynnik poprawnych rozwiązań wynosił lekko ponad 30%, a skoro to konkurs dla licealistów to powinienem sobie dać radę. I tu pierwszy szok, nic z tego&#8230; Wiedza jaką dysponowałem okazała się daleko nie wystarczająca, a próby znalezienia rozwiązania podanego na tacy spełzły na [...]]]></description>
			<content:encoded><![CDATA[<p>Zadanie z konkursu algorytmicznego dla uczniów szkół średnich. Zwróciłem na nie uwagę, gdyż współczynnik poprawnych rozwiązań wynosił lekko ponad 30%, a skoro to konkurs dla licealistów to powinienem sobie dać radę. I tu pierwszy szok, nic z tego&#8230; Wiedza jaką dysponowałem okazała się daleko nie wystarczająca, a próby znalezienia rozwiązania podanego na tacy spełzły na niczym. Co dodatkowo rozbudziło moją ciekawość to fakt że na forach poświęconych programowaniu, nikt nie szuka pomocy.<br />
Zadanie finalnie okazało się rozbudowaną grą Nim, ale bez znajomości jednego twierdzenia teorii gier prawdopodobnie siedziałbym na tym jeszcze dłuuuugo&#8230;<br />
Treść zadania dostępna pod adresem <a href="http://hs.spoj.pl/problems/HS09GAME/">http://hs.spoj.pl/problems/HS09GAME/</a><br />
<span id="more-381"></span><br />
Wspomniane twierdzenie to Twierdzenie Sprague-Grundy&#8217;ego. Gra przestawiona w zadaniu spełnia wszystkie założenia pozwalające na skorzystanie z twierdzenia. W połączeniu z dokładnie omówioną optymalną strategią, opisem pozycji wygrywających i przegrywających w grze Nim, pierwszą część zadania można rozwiązać w zaledwie 9 liniach</p>
<pre class="brush: python">
# gry - lista skladajaca sie z list reprezentujacych gre. Kazda reprezentacja
# gry to kolejna lista zaiwerajaca ilosc &#039;kijkow&#039; na kolejnych stosach
def graj(gry):
    sg = (0, 0, 1, 1, 2, 2, 3)
    for gra in gry:
        g = []
        reszty = []
        for stos in gra:
            reszta = int(stos)%7
            g.append(sg[reszta])
            reszty.append(reszta)
        wynik = reduce(lambda x,y: x^y, g)

        if wynik :
            print &quot;Julia wins.&quot;
        else :
            print &quot;Robert wins.\n&quot;
</pre>
<p>Lekki problem pojawia się przy ustalaniu ruchu wygrywającego. Nie wiem czy istnieje jakieś szybsze rozwiązanie niż takie trochę brute-force&#8217;owe która ja wykorzystałem. Polega ono na stwierdzeniu na jakiej pozycji ( wygrywającej czy przegrywającej ) znalazł by się gracz gdyby nie było jednego stosiku, a następnie obliczeniu czy da się odjąć taką liczbę patyczków żeby zostawić przeciwnika na pozycji przegrywającej.<br />
Dodatkowo oprócz wskazania ruchu wygrywającego należy wskazać ten podczas którego bierze się najwięcej patyczków ze stosu o najmniejszym numerze, co w lekki sposób komplikuje sprawę.:</p>
<pre class="brush: python">
        stos_wygrywajacy = 0;
        licznik = 0
        blokada_5 = False
        blokada_3 = False

        # odwrocenie list, sprawdzanie od konca
        gra_rev = gra[:]
        gra_rev.reverse()

        g_rev = g[:]
        g_rev.reverse()

        reszty.reverse()
        for reszta in reszty:
            # lista reszt bez kolejnych stosow
            tmpr = reszty[:]
            tmpr.pop(licznik)

            # xor wartosci f. Sprague-Grundy&#039;ego
            # bez kolejnych stosow
            tmpg = g_rev[:]
            tmpg.pop(licznik)
            tmpw = reduce(lambda x,y: x^y, tmpg ,0)

            if sg[reszta-5] == tmpw and int(gra_rev[licznik]) &gt;= 5:
                wygrywajacy = 5
                stos_wygrywajacy = len(reszty) - licznik
                blokada_5 = True
            elif sg[reszta-3] == tmpw and int(gra_rev[licznik]) &gt;= 3 and blokada_5 == False:
                wygrywajacy = 3
                stos_wygrywajacy = len(reszty) - licznik
                blokada_3 = True
            elif sg[reszta-2] == tmpw and int(gra_rev[licznik]) &gt;= 2 and blokada_5 == False and blokada_3 == False:
                wygrywajacy = 2
                stos_wygrywajacy = len(reszty) - licznik

            licznik += 1
</pre>
<p>Jeśli ktoś zna szybsze rozwiązanie chętnie je przeanalizuję <img src='http://piotr.doniec.eu/devlog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Zaznaczam, że nie dam sobie głowy uciąć że algorytm jest poprawny, bo nie ma już możliwości zgłoszenia rozwiązania &#8211; upłynęły terminy.</p>
<p><strong><em>EDIT</em></strong>:<br />
Lekko poprawiona wersja, działa trochę szybciej, natomiast i tak nie umożliwia zdobycia maximum punktów. Jesli nie ma jakiejś sztuczki na ruch wygrywający, a podejrzewam że coś jest, to lepiej zakodzić to w C&#8230;</p>
<pre class="brush: python">
        stos_wygrywajacy = 0
        blokada_3 = False
        blokada_2 = False
        licznik = 0
        for reszta in reszty :
            tmpg = g[:]
            tmpg.pop(licznik)
            tmpw = reduce(lambda x,y: x^y, tmpg, 0)

            if sg[reszta-5] == tmpw and int(gra[licznik]) &gt;= 5:
                wygrywajacy = 5
                stos_wygrywajacy = licznik + 1
                break
            elif sg[reszta-3] == tmpw and int(gra[licznik]) &gt;= 3 and blokada_3 == False:
                wygrywajacy = 3
                stos_wygrywajacy = licznik + 1
                blokada_3 = True
            elif sg[reszta-2] == tmpw and int(gra[licznik]) &gt;= 2 and blokada_3 == False and blokada_2 == False:
                wygrywajacy = 2
                stos_wygrywajacy = licznik + 1
                blokada_2 = True
            licznik += 1
</pre>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2010/01/hsspoj-zadanie-ktore-nie-dawalo-mi-spokoju/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Adnotacje w servlet 3.0</title>
		<link>http://piotr.doniec.eu/devlog/2009/12/adnotacje-w-servlet-3-0/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/12/adnotacje-w-servlet-3-0/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 17:43:58 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[glassfish]]></category>
		<category><![CDATA[jee]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=369</guid>
		<description><![CDATA[W JSR 315: Java Servlet 3.0 Specification zdefiniowano dodatkowe, nowe adnotacje mające na celu ułatwienie tworzenia aplikacji. Referencyjna implementacja została już zawarta w jednym z &#8220;nocnych wydań&#8221; serwera Glassfish. Dziwi zatem fakt że informacja o tym że servlety nie wymagają już odpowiednich wpisów w deskryptorze rozmieszczenia ( ang. deployment descriptor ) nie została umieszczona w [...]]]></description>
			<content:encoded><![CDATA[<p>W JSR 315: Java Servlet 3.0 Specification zdefiniowano dodatkowe, nowe adnotacje mające na celu ułatwienie tworzenia aplikacji. Referencyjna implementacja została już zawarta w jednym z &#8220;nocnych wydań&#8221; serwera Glassfish. Dziwi zatem fakt że informacja o tym że servlety nie wymagają już odpowiednich wpisów w deskryptorze rozmieszczenia ( ang. deployment descriptor ) nie została umieszczona w oficjalnym tutorialu. Mimo że przykładowe projekty dla serwletów w SDK 6 zostały napisane od nowa żaden z nich nie wykorzystuje nowych adnotacji.<span id="more-369"></span><br />
Dodane adotacje to: @WebServlet, @ServletFilter, @WebServletContextListener, @WebInitParam oraz @MultipartConfig więcej informacji na ich temat można znaleźć w pakiecie javax.servlet.annotation.<br />
Przykładowe wykorzystanie:</p>
<div class="codecolorer-container java mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@WebServlet<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;HelloWorld&quot;</span>, urlPatterns<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #0000ff;">&quot;/helloworld&quot;</span><span style="color: #009900;">&#125;</span>, displayName<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;DISPLAY NAME&quot;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> HelloWorld <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #009900;">&#123;</span><br />
<br />
@Override<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> doGet<span style="color: #009900;">&#40;</span>HttpServletRequest request, HttpServletResponse response<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">throws</span> ServletException, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">IOException</span></a> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//processRequest(request, response);</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/12/adnotacje-w-servlet-3-0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>NetBeans 6.8 + Glassfish v3 + jee examples</title>
		<link>http://piotr.doniec.eu/devlog/2009/12/netbeans6-8-glassfish-jeetutorial/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/12/netbeans6-8-glassfish-jeetutorial/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 19:15:15 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=351</guid>
		<description><![CDATA[Lekko interesując się Java EE napotkałem pewien problem, związany z kompilacją przykładowego kodu, dotyczącego jeszcze jee 5. Mimo że wszystkie wymagane biblioteki zostały zlokalizowane i dodane do projektu, i tak występowały błędy kompilacji związane z nieodnalezieniem pakietu javax.persistance.
Większość wypowiedzi na forach dotyczy sytuacji w której wspomnianych bibliotek w projekcie nie ma. Ja miałem pewność że [...]]]></description>
			<content:encoded><![CDATA[<p>Lekko interesując się Java EE napotkałem pewien problem, związany z kompilacją przykładowego kodu, dotyczącego jeszcze jee 5. Mimo że wszystkie wymagane biblioteki zostały zlokalizowane i dodane do projektu, i tak występowały błędy kompilacji związane z nieodnalezieniem pakietu <em>javax.persistance</em>.<br />
Większość wypowiedzi na forach dotyczy sytuacji w której wspomnianych bibliotek w projekcie nie ma. Ja miałem pewność że pod tym względem wszystko jest w porządku, gdyż przeniesienie projektu na dysk C:\ umożliwiało bezproblemowa kompilację. Rozwiązanie problemu znalazłem tu: <a href="http://forums.netbeans.org/post-42466.html" target="_blank">http://forums.netbeans.org/post-42466.html</a>. Przed kompilacją projektu bookstore1 należy jeszcze zbudować bookstore będąc w jakiś sposób projektem nadrzędnym. W przeciwnym wypadku pojawi się wspomniany błąd.</p>
<p>Poniższy film przedstawia jak z pomocą NetBeans 6.8 poprawnie zbudować projekt i zdeployować go na serwerze aplikacji. W moim przypadku serwerem aplikacji jest Glassfish v3.<br />
<center><!-- Smart Youtube --><span class="youtube"><object width="480" height="360"><param name="movie" value="http://www.youtube.com/v/UFQY2bPreeE&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/UFQY2bPreeE&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" type="application/x-shockwave-flash" allowfullscreen="true" width="480" height="360" ></embed><param name="wmode" value="transparent" /></object></span></center></p>
<p>Na deploy&#8217;u jednak nie koniecznie musi się skończyć. Wiele przykładów do SDK 5 wymaga połączenia z bazą danych. Tak jest z aplikacją <i>bookstore</i>, wykorzystaną w poprzednim filmie. Mimo że została poprawnie umieszczona na serwerze, nie może pobrać danych, o czym informuje zgłoszony wyjątek. Konfiguracja bazy oraz połączenia<br />
<center><!-- Smart Youtube --><span class="youtube"><object width="480" height="360"><param name="movie" value="http://www.youtube.com/v/se1gBnANoW0&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/se1gBnANoW0&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" type="application/x-shockwave-flash" allowfullscreen="true" width="480" height="360" ></embed><param name="wmode" value="transparent" /></object></span></center></p>
<p>Jej to moje pierwsze screencasty <img src='http://piotr.doniec.eu/devlog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/12/netbeans6-8-glassfish-jeetutorial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Przezroczyste okienka z WinAPI</title>
		<link>http://piotr.doniec.eu/devlog/2009/10/przezroczyste-okienka-z-winapi/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/10/przezroczyste-okienka-z-winapi/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 12:24:08 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[tricky]]></category>
		<category><![CDATA[winapi]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=270</guid>
		<description><![CDATA[Wraz z pojawieniem się systemu Windows 2000, pojawiły się nowe funkcje systemowego API. Jedną z nich jest możliwość tworzenia okien o dowolnym stopniu przezroczystości. Efekt jest dość ciekawy i sporo programów ma możliwość ustawienia przezroczystości własnego okienka. Moim celem było umożliwienie sterowania przezroczystością okien centralnie z jednego programu i to nie zależnie od tego czy [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-339 alignleft" title="transparent_windows2" src="http://piotr.doniec.eu/devlog/wp-content/uploads/2009/10/transparent_windows21.jpg" alt="Przezroczyste okna z winAPI" width="244" height="220" />Wraz z pojawieniem się systemu Windows 2000, pojawiły się nowe funkcje systemowego API. Jedną z nich jest możliwość tworzenia okien o dowolnym stopniu przezroczystości. Efekt jest dość ciekawy i sporo programów ma możliwość ustawienia przezroczystości własnego okienka. Moim celem było umożliwienie sterowania przezroczystością okien centralnie z jednego programu i to nie zależnie od tego czy okno takie zostało do tego przystosowane czy też nie. Po przeczytaniu tego wpisu, każdy samodzielnie będzie mógł napisać podobną aplikację</p>
<p><span id="more-270"></span></p>
<p>Aby istniała możliwość ustawiania przezroczystości dla okna, musi być ono utworzone w sposób do tego przystosowany. Wystarczy skorzystać z innej funkcji tworzącej okno, nie <code>CreateWindow</code>, a <code>CreateWindowEx</code></p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HWND CreateWindowEx<span style="color: #009900;">&#40;</span><br />
&nbsp; DWORD dwExStyle<span style="color: #339933;">,</span><br />
&nbsp; LPCTSTR lpClassName<span style="color: #339933;">,</span><br />
&nbsp; LPCTSTR lpWindowName<span style="color: #339933;">,</span><br />
&nbsp; DWORD dwStyle<span style="color: #339933;">,</span><br />
&nbsp; <span style="color: #993333;">int</span> x<span style="color: #339933;">,</span><br />
&nbsp; <span style="color: #993333;">int</span> y<span style="color: #339933;">,</span><br />
&nbsp; <span style="color: #993333;">int</span> nWidth<span style="color: #339933;">,</span><br />
&nbsp; <span style="color: #993333;">int</span> nHeight<span style="color: #339933;">,</span><br />
&nbsp; HWND hWndParent<span style="color: #339933;">,</span><br />
&nbsp; HMENU hMenu<span style="color: #339933;">,</span><br />
&nbsp; HINSTANCE hInstance<span style="color: #339933;">,</span><br />
&nbsp; LPVOID lpParam<br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>To co umożliwia później modyfikacje przezroczystości jest ukryte w ramach dodatkowego stylu okna, podawanego poprzez argument <code>dwExStyle</code>. Lista dopuszczalnych wartości jest długa, ale warto się z nią zapoznać. W tym konkretnym przypadku należy zainteresować się wartością <code>WS_EX_LAYERED</code>, utworzone wtedy okno będzie tzw. Layered Window, które obsługuje modyfikacje przezroczystości. Do ustawienia nowej wartości kanału alpha służy <code>SetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWROD dwFlags)</code> &#8211; szczegóły w dokumentacji.<br />
Pełny kod tworzący przykładowe, półprzezroczyste okno:</p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">#include &lt;windows.h&gt;</span><br />
<br />
LRESULT CALLBACK WndProc<span style="color: #009900;">&#40;</span>HWND<span style="color: #339933;">,</span> UINT<span style="color: #339933;">,</span> WPARAM<span style="color: #339933;">,</span> LPARAM<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #993333;">int</span> WINAPI WinMain<span style="color: #009900;">&#40;</span>HINSTANCE hInstance<span style="color: #339933;">,</span> &nbsp; HINSTANCE hPrevInstance<span style="color: #339933;">,</span><br />
LPSTR lpCmdLine<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> nCmdShow<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; MSG msg<span style="color: #339933;">;</span><br />
&nbsp; HWND hwnd<span style="color: #339933;">;</span><br />
&nbsp; WNDCLASSEX wcx<span style="color: #339933;">;</span><br />
&nbsp;<br />
&nbsp; wcx.<span style="color: #202020;">cbSize</span> <span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>wcx<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">style</span> <span style="color: #339933;">=</span> CS_HREDRAW <span style="color: #339933;">|</span> CS_VREDRAW<span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">lpfnWndProc</span> <span style="color: #339933;">=</span> WndProc<span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">cbClsExtra</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">cbWndExtra</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">hInstance</span> <span style="color: #339933;">=</span> hInstance<span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">hIcon</span> <span style="color: #339933;">=</span> LoadIcon<span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> IDI_APPLICATION<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">hCursor</span> <span style="color: #339933;">=</span> LoadCursor<span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> IDC_ARROW<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">hbrBackground</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>HBRUSH<span style="color: #009900;">&#41;</span>GetStockObject<span style="color: #009900;">&#40;</span>WHITE_BRUSH<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">lpszMenuName</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>LPCSTR<span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;MainMenu&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">lpszClassName</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>LPCSTR<span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;MainWClass&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; wcx.<span style="color: #202020;">hIconSm</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>HICON<span style="color: #009900;">&#41;</span>LoadImage<span style="color: #009900;">&#40;</span>hInstance<span style="color: #339933;">,</span> MAKEINTRESOURCE<span style="color: #009900;">&#40;</span>5<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> IMAGE_ICON<span style="color: #339933;">,</span><br />
&nbsp; GetSystemMetrics<span style="color: #009900;">&#40;</span>SM_CXSMICON<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> GetSystemMetrics<span style="color: #009900;">&#40;</span>SM_CYSMICON<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>UINT<span style="color: #009900;">&#41;</span>LR_DEFAULTCOLOR<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; RegisterClassEx<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>wcx<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; hwnd <span style="color: #339933;">=</span> CreateWindowEx<span style="color: #009900;">&#40;</span>WS_EX_LAYERED<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>LPCSTR<span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;MainWClass&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>LPCSTR<span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;Sample&quot;</span><span style="color: #339933;">,</span> WS_OVERLAPPEDWINDOW<span style="color: #339933;">,</span> CW_USEDEFAULT<span style="color: #339933;">,</span> &nbsp;CW_USEDEFAULT<span style="color: #339933;">,</span> CW_USEDEFAULT<span style="color: #339933;">,</span> CW_USEDEFAULT<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>HWND<span style="color: #009900;">&#41;</span>NULL<span style="color: #339933;">,</span> &nbsp;<span style="color: #009900;">&#40;</span>HMENU<span style="color: #009900;">&#41;</span>NULL<span style="color: #339933;">,</span> hInstance<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>LPVOID<span style="color: #009900;">&#41;</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; ShowWindow<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> nCmdShow<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; SetLayeredWindowAttributes<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> 0<span style="color: #339933;">,</span> 180<span style="color: #339933;">,</span> LWA_ALPHA<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; UpdateWindow<span style="color: #009900;">&#40;</span>hwnd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>GetMessage<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> &nbsp;0<span style="color: #339933;">,</span> 0<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; TranslateMessage<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; DispatchMessage<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; <span style="color: #b1b100;">return</span> msg.<span style="color: #202020;">wParam</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
LRESULT CALLBACK WndProc<span style="color: #009900;">&#40;</span>HWND hwnd<span style="color: #339933;">,</span> UINT uMsg<span style="color: #339933;">,</span> WPARAM wParam<span style="color: #339933;">,</span> LPARAM lParam<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span>uMsg<span style="color: #009900;">&#41;</span><br />
&nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">case</span> WM_CREATE<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">case</span> WM_PAINT<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">case</span> WM_DESTROY<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; PostQuitMessage<span style="color: #009900;">&#40;</span>0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> DefWindowProc<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> uMsg<span style="color: #339933;">,</span> wParam<span style="color: #339933;">,</span> lParam<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>To co należy zrobić, aby kontrolować przezroczystość okien innych niż własne przedstawia się następująco:</p>
<ol>
<li>1. Pobrać wszystkie otwarte okna typu top-level</li>
<li>2. Nadać oknom styl <code>dwExStyle</code></li>
<li>3. Zmienić wartość kanału alpha</li>
</ol>
<p><strong>1. Pobrać wszystkie otwarte okna typu top-level</strong><br />
Dobrym pomysłem wydaje się pobranie uchwytu do rodzica wszystkich okien(Desktop/Pulpit) i przejście w pętli po liście jego dzieci (jak wiadomo każde okno ma kilka przydatnych wskaźników, między innymi do okna-brata). Mogłoby to wyglądać tak:</p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HWND hDesktop <span style="color: #339933;">=</span> GetDesktopWindow<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
HWND hChild <span style="color: #339933;">=</span> GetWindow<span style="color: #009900;">&#40;</span>hDesktop<span style="color: #339933;">,</span> GW_CHILD<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
HWND hTemp<span style="color: #339933;">;</span><br />
<span style="color: #808080; font-style: italic;">/* ... */</span><br />
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>hTemp <span style="color: #339933;">!=</span> GetWindow<span style="color: #009900;">&#40;</span>hChild<span style="color: #339933;">,</span> GW_HWNDLAST<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #808080; font-style: italic;">/* ... */</span><br />
&nbsp; hTemp <span style="color: #339933;">=</span> GetWindow<span style="color: #009900;">&#40;</span>hChild<span style="color: #339933;">,</span> GW_HWNDNEXT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Pomysł <strong>zły</strong> ! Okazuje się że taka pętla może działać w nieskończoność. Wzmianaka na temat takiego przypadku znajduje się nawet w dokumentacji. Dlatego należy wykorzystać inny sposób, polegający na użyciu funkcji <code>BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)</code>:</p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">EnumWindows<span style="color: #009900;">&#40;</span>EnumWindowsProc<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #808080; font-style: italic;">/* ... */</span><br />
BOOL CALLBACK EnumWindowsProc<span style="color: #009900;">&#40;</span>HWND hwndChild<span style="color: #339933;">,</span> LPARAM lParam<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #993333;">char</span> buffer<span style="color: #009900;">&#91;</span>100<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #993333;">int</span> count <span style="color: #339933;">=</span> GetWindowText<span style="color: #009900;">&#40;</span>hwndChild<span style="color: #339933;">,</span> buffer<span style="color: #339933;">,</span> 100<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>count <span style="color: #339933;">&amp;&amp;</span> IsWindowVisible<span style="color: #009900;">&#40;</span>hwndChild<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">/* ... */</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #b1b100;">return</span> TRUE<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p><strong>2. Nadać oknom styl <code>dwExStyle</code></strong><br />
Wydaje się najtrudniejsze, przecież dodatkowy styl należy podać przy tworzeniu okna, a okna które widzimy zostały już przecież utworzone. Na szczęście z pomocą przychodzi funkcja <code>LONG SetWindowLong(HWND hWnd, int iIndex, LONG dwNewLong)</code>:</p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SetWindowLong<span style="color: #009900;">&#40;</span>hwndChild<span style="color: #339933;">,</span> GWL_EXSTYLE<span style="color: #339933;">,</span> WS_EX_LAYERED<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p><strong>3. Zmienić wartość kanału alpha</strong><br />
Bardziej uważni czytelnicy już na pewno wiedzą jak wygląda zestaw parametrów i jak skorzystać z <code>SetLayeredWindowAttributes</code>. Wykorzystanie pokazane 3 listingi wyżej, przy okazji tworzenia &#8220;własnego&#8221; przezroczystego okna.</p>
<p>I to tyle  tym temacie, wypada jeszcze stworzyć GUI, może obsługę tray&#8217;a. Program wydaje się &#8220;magiczny&#8221; a korzysta raptem z 4 funkcji API systemowego.</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/10/przezroczyste-okienka-z-winapi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Karta X100P i Kernel Panic</title>
		<link>http://piotr.doniec.eu/devlog/2009/09/karta-x100p-i-kernel-panic/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/09/karta-x100p-i-kernel-panic/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 10:14:43 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[VoIP]]></category>
		<category><![CDATA[dahdi]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[x100p]]></category>
		<category><![CDATA[zaptel]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=262</guid>
		<description><![CDATA[Mimo nowych wersji zarówno Trixboxa i Astersika, problem nadaj pozostaje. Po skonfigurowaniu karty, w czasie wyłączania systemu kernel dostaje zadyszki o czym informuje znienawidzonym komunikatem &#8220;KERNEL PANIC&#8221;. Od ostatniego wpisu na ten temat ( jeszcze na stary blogu, który trafił szlag podczas aktualizacji WP) trochę się zmieniło. Nie ma już co szukać pliku KXXZaptel, bo [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://piotr.doniec.eu/devlog/wp-content/uploads/2009/09/x100p-300x209.jpg" alt="Karta x100p" title="Karta x100p" width="300" height="209" class="alignleft size-medium wp-image-265" />Mimo nowych wersji zarówno Trixboxa i Astersika, problem nadaj pozostaje. Po skonfigurowaniu karty, w czasie wyłączania systemu kernel dostaje zadyszki o czym informuje znienawidzonym komunikatem &#8220;KERNEL PANIC&#8221;. Od ostatniego wpisu na ten temat ( jeszcze na stary blogu, który trafił szlag podczas aktualizacji WP) trochę się zmieniło. Nie ma już co szukać pliku KXXZaptel, bo znalezienie go oznacza że nasz system jest lekko zacofany &#8211; Zaptel jest obecnie znany jako DAHDI. Również zawartość odpowiedniego pliku jest lekko inna, ale mimo wszystko można problem rozwiązać.<br />
Co należy zrobić to w /etc/rc6.d odnaleźć plik KXXdahdi, u mnie jest to K92dahdi i zakomentować poniższy fragment, okolice linii 235:</p>
<blockquote><p>
# Unload drivers<br />
#shutdown_dynamic<br />
#echo -n &#8220;Unloading DAHDI hardware modules: &#8221;<br />
#if unload_module dahdi; then<br />
#       echo &#8220;done&#8221;<br />
#else<br />
#       echo &#8220;error&#8221;<br />
#fi<br />
#if [ "$LOCKFILE" != '' ]; then<br />
#       [ $RETVAL -eq 0 ] &#038;&#038; rm -f $LOCKFILE<br />
#fi
</p></blockquote>
<p>i zamykanie systemu zaczyna działać jak należy. Może sam problem nie jest zbyt uciążliwy gdyż działający serwer VoIP nie jest często resetowany. Ale zabawa zaczyna się gdy zaistnieje potrzeba przeprowadzenia takiej operacji zdalnie&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/09/karta-x100p-i-kernel-panic/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tworzenie okienka w asm</title>
		<link>http://piotr.doniec.eu/devlog/2009/09/tworzenie-okienka-w-asm/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/09/tworzenie-okienka-w-asm/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 12:08:45 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[asm]]></category>
		<category><![CDATA[winapi]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=244</guid>
		<description><![CDATA[Wiadomo że stworzenie okienka przy wykorzystaniu języka C i WinAPI nie jest zadaniem trudnym. Nawet w dokumentacji od MS można znaleźć gotowy przykład. Jest to natomiast zadanie bardzo żmudne i z reguły z pełnym zrozumieniem pól i dopuszczalnych wartości dla wymaganych struktur robi się to tylko raz. Potem albo się kopiuje gotowy standardowy kod wprowadzając [...]]]></description>
			<content:encoded><![CDATA[<p>Wiadomo że stworzenie okienka przy wykorzystaniu języka C i WinAPI nie jest zadaniem trudnym. Nawet w dokumentacji od MS można znaleźć gotowy przykład. Jest to natomiast zadanie bardzo żmudne i z reguły z pełnym zrozumieniem pól i dopuszczalnych wartości dla wymaganych struktur robi się to tylko raz. Potem albo się kopiuje gotowy standardowy kod wprowadzając tylko pewne czasami zmiany odbiegającego od typowego zastosowania, albo przyjmuje że &#8220;się umie&#8221; i &#8220;zna fundament&#8221; i przesiada na WindowsForms. Ale można pójść w drugą stronę, stworzyć okienko w assmeblerze i tym samym uzyskać miano rycerza hardcoru.<span id="more-244"></span></p>
<p>Może dziwić ale zbudowanie okna korzystając z języka maszynowego nie jest trudno. Objętość programu jest zbliżona do tego utworzonego standardowo z wykorzystaniem C. Ponadto korzystając z kompilatora dostarczonego przez Microsoft (MASM) istnieje możliwość bardzo łatwego dostępu do funkcji API systemu Windows. Ponad to kompilator dostarcza wiele ułatwiających życie makr.</p>
<div class="codecolorer-container asm mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br /></div></td><td><div class="asm codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">386</span><br />
<span style="color: #000000; font-weight: bold;">.model</span> <span style="color: #000000; font-weight: bold;">flat</span><span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">stdcall</span><br />
<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000000; font-weight: bold;">casemap</span><span style="color: #339933;">:</span><span style="color: #000000; font-weight: bold;">none</span><br />
<span style="color: #000000; font-weight: bold;">include</span> &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">c</span><span style="color: #339933;">:</span>\masm32\<span style="color: #000000; font-weight: bold;">include</span>\windows<span style="color: #339933;">.</span><span style="color: #00007f; font-weight: bold;">inc</span><br />
<span style="color: #000000; font-weight: bold;">include</span> &nbsp;<span style="color: #000000; font-weight: bold;">c</span><span style="color: #339933;">:</span>\masm32\<span style="color: #000000; font-weight: bold;">include</span>\user32<span style="color: #339933;">.</span><span style="color: #00007f; font-weight: bold;">inc</span><br />
<span style="color: #000000; font-weight: bold;">includelib</span>&nbsp; <span style="color: #000000; font-weight: bold;">c</span><span style="color: #339933;">:</span>\masm32\lib\user32<span style="color: #339933;">.</span>lib<br />
<span style="color: #000000; font-weight: bold;">include</span> &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">c</span><span style="color: #339933;">:</span>\masm32\<span style="color: #000000; font-weight: bold;">include</span>\kernel32<span style="color: #339933;">.</span><span style="color: #00007f; font-weight: bold;">inc</span><br />
<span style="color: #000000; font-weight: bold;">includelib</span>&nbsp; <span style="color: #000000; font-weight: bold;">c</span><span style="color: #339933;">:</span>\masm32\lib\kernel32<span style="color: #339933;">.</span>lib<br />
<br />
WinMain <span style="color: #000000; font-weight: bold;">proto</span> <span style="color: #339933;">:</span><span style="color: #000000; font-weight: bold;">DWORD</span><span style="color: #339933;">,:</span><span style="color: #000000; font-weight: bold;">DWORD</span><span style="color: #339933;">,:</span><span style="color: #000000; font-weight: bold;">DWORD</span><span style="color: #339933;">,:</span><span style="color: #000000; font-weight: bold;">DWORD</span><br />
<br />
<span style="color: #000000; font-weight: bold;">.data</span> <span style="color: #666666; font-style: italic;">; zainicjalizowanie zmienne</span><br />
&nbsp; &nbsp;ClassName <span style="color: #000000; font-weight: bold;">db</span> <span style="color: #7f007f;">&quot;SimpleWinClass&quot;</span><span style="color: #339933;">,</span>0<br />
&nbsp; &nbsp;AppName <span style="color: #000000; font-weight: bold;">db</span> <span style="color: #7f007f;">&quot;Our first Window&quot;</span><span style="color: #339933;">,</span>0<br />
<span style="color: #000000; font-weight: bold;">.data</span>?&nbsp; &nbsp;<span style="color: #666666; font-style: italic;">; niezainicjalizowane zmienne</span><br />
&nbsp; &nbsp;hInstance HINSTANCE ?<br />
&nbsp; &nbsp;CommandLine LPSTR ?<br />
<span style="color: #000000; font-weight: bold;">.code</span><br />
&nbsp; &nbsp;start<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> GetModuleHandle<span style="color: #339933;">,</span>NULL<br />
&nbsp; &nbsp; &nbsp; <span style="color: #00007f; font-weight: bold;">mov</span> hInstance<span style="color: #339933;">,</span><span style="color: #00007f;">eax</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> WinMain<span style="color: #339933;">,</span>hInstance<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>CommandLine<span style="color: #339933;">,</span>SW_SHOWDEFAULT<br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> ExitProcess<span style="color: #339933;">,</span>0<br />
&nbsp; &nbsp; &nbsp; <br />
WinMain <span style="color: #000000; font-weight: bold;">proc</span> hInst<span style="color: #339933;">:</span>HINSTANCE<span style="color: #339933;">,</span>hPrevInst<span style="color: #339933;">:</span>HINSTANCE<span style="color: #339933;">,</span>CmdLine<span style="color: #339933;">:</span>LPSTR<span style="color: #339933;">,</span>CmdShow<span style="color: #339933;">:</span><span style="color: #000000; font-weight: bold;">DWORD</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">LOCAL</span> wc<span style="color: #339933;">:</span>WNDCLASSEX<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">LOCAL</span> msg<span style="color: #339933;">:</span>MSG<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">LOCAL</span> hwnd<span style="color: #339933;">:</span>HWND<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>cbSize<span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">SIZEOF</span> WNDCLASSEX<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>style<span style="color: #339933;">,</span>CS_HREDRAW <span style="color: #00007f; font-weight: bold;">or</span> CS_VREDRAW<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>lpfnWndProc<span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">OFFSET</span> WndProc<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>cbClsExtra<span style="color: #339933;">,</span>NULL<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>cbWndExtra<span style="color: #339933;">,</span>NULL<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">push</span> hInstance<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">pop</span> wc<span style="color: #339933;">.</span>hInstance<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>hbrBackground<span style="color: #339933;">,</span>COLOR_WINDOW<span style="color: #339933;">+</span>1<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>lpszMenuName<span style="color: #339933;">,</span>NULL<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>lpszClassName<span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">OFFSET</span> ClassName<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">invoke</span> LoadIcon<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>IDI_APPLICATION<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>hIcon<span style="color: #339933;">,</span><span style="color: #00007f;">eax</span><br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>hIconSm<span style="color: #339933;">,</span><span style="color: #00007f;">eax</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">invoke</span> LoadCursor<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>IDC_ARROW<br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">mov</span> wc<span style="color: #339933;">.</span>hCursor<span style="color: #339933;">,</span><span style="color: #00007f;">eax</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">invoke</span> RegisterClassEx<span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">addr</span> wc <br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">invoke</span> CreateWindowEx<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">ADDR</span> ClassName<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">ADDR</span> AppName<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WS_OVERLAPPEDWINDOW<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CW_USEDEFAULT<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hInst<span style="color: #339933;">,</span>\<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL <br />
&nbsp; &nbsp; <span style="color: #00007f; font-weight: bold;">mov</span> hwnd<span style="color: #339933;">,</span><span style="color: #00007f;">eax</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> ShowWindow<span style="color: #339933;">,</span>hwnd<span style="color: #339933;">,</span>CmdShow<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> UpdateWindow<span style="color: #339933;">,</span>hwnd &nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">WHILE</span> TRUE<br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> GetMessage<span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">ADDR</span> msg<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>0<span style="color: #339933;">,</span>0<br />
&nbsp; &nbsp; &nbsp; <span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">BREAK</span> <span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">IF</span><span style="color: #009900; font-weight: bold;">&#40;</span>!<span style="color: #00007f;">eax</span><span style="color: #009900; font-weight: bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> TranslateMessage<span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">ADDR</span> msg<br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> DispatchMessage<span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">ADDR</span> msg<br />
&nbsp; &nbsp; <span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">ENDW</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span>msg<span style="color: #339933;">.</span>wParam &nbsp; <br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">ret</span><br />
<br />
WinMain <span style="color: #000000; font-weight: bold;">endp</span><br />
<br />
<br />
WndProc <span style="color: #000000; font-weight: bold;">proc</span> hWnd<span style="color: #339933;">:</span>HWND<span style="color: #339933;">,</span>uMsg<span style="color: #339933;">:</span>UINT<span style="color: #339933;">,</span>wParam<span style="color: #339933;">:</span>WPARAM<span style="color: #339933;">,</span>lParam<span style="color: #339933;">:</span>LPARAM<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">IF</span> uMsg==WM_DESTROY<br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> PostQuitMessage<span style="color: #339933;">,</span>NULL<br />
&nbsp; &nbsp;<span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">ELSE</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">invoke</span> DefWindowProc<span style="color: #339933;">,</span>hWnd<span style="color: #339933;">,</span>uMsg<span style="color: #339933;">,</span>wParam<span style="color: #339933;">,</span>lParam<br />
&nbsp; &nbsp; &nbsp; <span style="color: #00007f; font-weight: bold;">ret</span><br />
&nbsp; &nbsp;<span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">ENDIF</span><br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span><span style="color: #00007f;">eax</span><br />
&nbsp; &nbsp;<span style="color: #00007f; font-weight: bold;">ret</span><br />
<br />
WndProc <span style="color: #000000; font-weight: bold;">endp</span><br />
<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">end</span> start</div></td></tr></tbody></table></div>
<p>Nie ma co wiele tłumaczyć. Kod jaki jest interpretowany przez MASM wygląda już niemalże jak język wysokiego poziomu(niektórzy mówią że C to język niskiego poziomu, ale to dlatego że nie umieli znaleźć określenia dla Javy, C# itp.) Bardzo fajnym makrem jest <code>invoke</code> uruchamiające zadaną procedurę i umożliwiające podanie listy argumentów poprzez rozdzielenie przecinkiem. Bardzo przyjemna alternatywa dla push&#8217;owania w odwrotnej kolejności.<br />
Jedyny wniosek jaki można wysnuć to to że jeżeli ktoś umie programować z wykorzystaniem WinAPI w C, to i bez problemu zastosuje go w assemblerze. Oczywiście nie ma obowiązku korzystania z MASM, do API można się także dostać korzystać z innych assemblerów np. NASM ( polacam zapoznanie się z nasmx).</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/09/tworzenie-okienka-w-asm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O JSP słów kilka</title>
		<link>http://piotr.doniec.eu/devlog/2009/07/o-jsp-slow-kilka/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/07/o-jsp-slow-kilka/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 14:58:46 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[jee]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=226</guid>
		<description><![CDATA[W swoim wcześniejszym wpisie, zatytułowanym JSP, JSF, GlassFish &#8211; mini słowniczek napisałem że JSP jest wykorzystywane jako warstwa widoku w modelu MVC. Jest to oczywiście prawda ale jak się niedawno dowiedziałem, w znaczny sposób spłyciłem zastosowanie JSP. Okazuje się bowiem że samo JSP jest idealnym sposobem na tworzenie prostych aczkolwiek dynamicznych stron WWW w których [...]]]></description>
			<content:encoded><![CDATA[<p>W swoim wcześniejszym wpisie, zatytułowanym <a href="http://piotr.doniec.eu/devlog/2009/03/jsp-jsf-glassfish-mini-slowniczek/">JSP, JSF, GlassFish &#8211; mini słowniczek</a> napisałem że JSP jest wykorzystywane jako warstwa widoku w modelu MVC. Jest to oczywiście prawda ale jak się niedawno dowiedziałem, w znaczny sposób spłyciłem zastosowanie JSP. Okazuje się bowiem że samo JSP jest idealnym sposobem na tworzenie prostych aczkolwiek dynamicznych stron WWW w których nie ma potrzeby podziału na poszczególne warstwy Model &#8211; Widok &#8211; Kontroler. Co więcej okazuję się że każda strona JSP również jest servletem i zachowuję się w sposób podobny.<br />
<span id="more-226"></span><br />
Strona JSP to na dobrą sprawę kod HTML/XHTML z pewnymi dodatkami które zapewniają dynamiczność takiej strony. Te &#8220;pewne dodatki&#8221; to tzw. skryptlety, czyli poprstu kod Javy umieszczony w kodzie stron JSP pomiędzy znacznikami <code><% ... %></code>. Jest to rozwiązanie bardzo podobne do umieszczania kodu PHP w ramach kodu HTML. Jak wiadomo mieszanie logiki aplikacji ze sposobem prezentacji nie jest dobrym pomysłem, ale na dobry początek trzeba zacząć od czegoś prostego. Aby nie był to &#8220;suchy wpis&#8221; przedstawiam przykład(pochodzi książki Head First Servlets &#038; JSP):</p>
<pre class="brush: java">
package foo;

public class Licznik {
    private static int liczba;
    public static synchronized int getLiczba() {
        liczba++;
        return liczba;
    }
}
</pre>
<p>to kod wstawiony do strony JSP korzystający z licznika powinien wyglądać następująco:<br />
<code><% out.println(foo.licznik.getLiczba());  %></code></p>
<p>Oprócz znacznika skryptletu który został przed chwilą zaprezentowane w stronach JSP można spotkać również inne, np.</p>
<ul>
<li>Dyrektywa: <%@ ... %>, np: <code><%@page contentType="text/html; charset=UTF-8" %></code> ustawia typ treści</li>
<li>Wyrażenie <%= ... %>, np. <code><%= Licznik.getLiczba() %> spowoduje wyświetlenie aktualnego stanu licznika. </code></li>
<li>Definicja: <%! ... %>, umożliwia definiowanie zmiennych i metod które są później &#8220;wstrzykiwane&#8221; do tworzonej klasy servletu. W ramach tych znaczników jesteśmy upoważnieni do przeciążenia metod <code>jspInit</code> oraz <code>jspDestroy</code> które są wywoływane odpowiednio przy powoływaniu servletu do życia i przy jego usuwaniuz kontenera. Z uwagi na fakt że definicje metod zawartych w obrębie znacznika defincji stają metodami servletu, nie ma tu dostępu do zmienny <code>request</code> i <code>response</code></li>
</ul>
<p>Jak wspomniałem każda strona JSP jest servletem. Strona jest tłumaczona przez kontener na odpowiedni servlet. Wykorzystanie różnych znaczników do zaprezentowania innego typu zawartości ułatwia kontenerowi konwersję. I tak dyrektywy są używane aby kontrolować jak kontener ma przetłumaczyć a następnie wykonać kod strony, skryptlety są po prostu przepisywane do kodu servletu natomiast wyrażenia są przekazywane jako parametry odpowiednich funkcji.</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/07/o-jsp-slow-kilka/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
