<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2464965528232475951</id><updated>2011-12-20T07:30:36.892-08:00</updated><category term='C#'/><category term='C++'/><category term='PHP'/><category term='Python'/><category term='Flash'/><category term='Jetty'/><category term='SQL'/><category term='Linux'/><category term='CajuScript'/><category term='VirtualBox'/><category term='Nginx'/><category term='Solaris'/><category term='Coisas da Vida'/><category term='Java'/><category term='BSD'/><category term='Jogos'/><title type='text'>eduveks</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>36</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-8991909367267195524</id><published>2011-03-25T09:25:00.001-07:00</published><updated>2011-03-25T09:37:58.118-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Resolve the IP Number from a Host Name</title><content type='html'>This sample translate the IP number from www.google.com. But you can even use &lt;b&gt;localhost&lt;/b&gt; or &lt;b&gt;localmachinename&lt;/b&gt; to gets the local or external IP number of the local machine.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;arpa/inet.h&amp;gt;&lt;br /&gt;#include &amp;lt;netdb.h&amp;gt;&lt;br /&gt;int main() {&lt;br /&gt;    char hostName[] = "www.google.com";&lt;br /&gt;    struct hostent *host;&lt;br /&gt;    if ((host = gethostbyname(hostName)) == NULL) {&lt;br /&gt;      fprintf(stderr, "(mini) nslookup failed on '%s'", hostName);&lt;br /&gt;      return 1;&lt;br /&gt;    }&lt;br /&gt;    struct in_addr h_addr;&lt;br /&gt;    h_addr.s_addr = *((unsigned long *) host-&gt;h_addr_list[0]);&lt;br /&gt;    const char *ip = inet_ntoa(h_addr);&lt;br /&gt;    std::cout &lt;&lt; ip &lt;&lt; std::endl;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-8991909367267195524?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/8991909367267195524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2011/03/resolve-ip-number-from-host-name.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/8991909367267195524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/8991909367267195524'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2011/03/resolve-ip-number-from-host-name.html' title='Resolve the IP Number from a Host Name'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-6403577467113174729</id><published>2011-03-25T09:03:00.001-07:00</published><updated>2011-03-28T06:05:18.020-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Convert Integer to String without itoa</title><content type='html'>This solution is based from &lt;a href="http://www.cplusplus.com/forum/beginner/1057/" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;sstream&amp;gt;&lt;br /&gt;int main() {&lt;br /&gt;    int i = 100;&lt;br /&gt;    std::stringstream ss;&lt;br /&gt;    ss &lt;&lt; i;&lt;br /&gt;    fprintf(stderr, ss.str().c_str());&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-6403577467113174729?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/6403577467113174729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2011/03/convert-integer-to-string-without-itoa.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6403577467113174729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6403577467113174729'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2011/03/convert-integer-to-string-without-itoa.html' title='Convert Integer to String without itoa'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-8568966177097967846</id><published>2011-03-25T08:55:00.000-07:00</published><updated>2011-03-25T09:02:27.072-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>GNU/C++ Simple Send Mail</title><content type='html'>See the &lt;a href="c-send-mail.html"&gt;Microsoft Visual C++ Simple Send Mail here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I did the class below for GNU C++ based in these links:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/58210/c-smtp-example" target="_blank"&gt;Solution to send a mail in GNU/C++&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://cs.baylor.edu/~donahoo/practical/CSockets/WindowsSockets.pdf" target="_blank"&gt;Transitioning from UNIX to Windows Socket Programming&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;SendMail.h&lt;/span&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;#ifndef _SENDMAILHEADER&lt;br /&gt;#define _SENDMAILHEADER&lt;br /&gt;&lt;br /&gt;#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;#include &amp;lt;arpa/inet.h&amp;gt;&lt;br /&gt;#include &amp;lt;string&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define HELO "HELO\r\n"&lt;br /&gt;#define DATA "DATA\r\n"&lt;br /&gt;#define QUIT "QUIT\r\n"&lt;br /&gt;&lt;br /&gt;namespace mail {&lt;br /&gt; class SendMail {&lt;br /&gt; private:&lt;br /&gt;  int sock;&lt;br /&gt;  char buf[BUFSIZ];&lt;br /&gt;  void send_socket(char *s)&lt;br /&gt;  {&lt;br /&gt;   send(sock, s, strlen(s), 0);&lt;br /&gt;   //fprintf(stderr, s); &lt;br /&gt;  }&lt;br /&gt;  void read_socket()&lt;br /&gt;  {&lt;br /&gt;   int len = recv(sock, buf, BUFSIZ, 0);&lt;br /&gt;   //fprintf(stderr, ((std::string)buf).substr(0, len).c_str()); &lt;br /&gt;  }&lt;br /&gt; public:&lt;br /&gt;  char* HostIp;&lt;br /&gt;  unsigned short HostPort;&lt;br /&gt;  char* To;&lt;br /&gt;  char* From;&lt;br /&gt;  char* Subject;&lt;br /&gt;  char* Message;&lt;br /&gt;  SendMail() {&lt;br /&gt;   HostPort = 25;&lt;br /&gt;  };&lt;br /&gt;  ~SendMail() { };&lt;br /&gt;  void Send() {&lt;br /&gt;   struct sockaddr_in hostAddr; &lt;br /&gt;   if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) &lt; 0) {&lt;br /&gt;    fprintf(stderr, "SendMail: socket() failed"); &lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   hostAddr.sin_family = AF_INET; &lt;br /&gt;   hostAddr.sin_addr.s_addr = inet_addr(HostIp); &lt;br /&gt;   hostAddr.sin_port = htons(HostPort); &lt;br /&gt;   if (connect(sock, (struct sockaddr *) &amp;hostAddr, sizeof(struct sockaddr_in)) != 0) {&lt;br /&gt;    fprintf(stderr, "SendMail: connect() failed"); &lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   read_socket();&lt;br /&gt;   send_socket((char*)HELO);&lt;br /&gt;   read_socket();&lt;br /&gt;   send_socket((char*)"MAIL FROM: "); &lt;br /&gt;   send_socket(From);&lt;br /&gt;   send_socket((char*)"\r\n");&lt;br /&gt;   read_socket();&lt;br /&gt;   send_socket((char*)"VRFY ");&lt;br /&gt;   send_socket(From);&lt;br /&gt;   send_socket((char*)"\r\n");&lt;br /&gt;   read_socket();&lt;br /&gt;   send_socket((char*)"RCPT TO: ");&lt;br /&gt;   send_socket(To);&lt;br /&gt;   send_socket((char*)"\r\n");&lt;br /&gt;   read_socket();&lt;br /&gt;   send_socket((char*)DATA);&lt;br /&gt;   send_socket((char*)"Subject: ");&lt;br /&gt;   send_socket(Subject);&lt;br /&gt;   send_socket((char*)"\r\n");&lt;br /&gt;   read_socket();&lt;br /&gt;   send_socket(Message);&lt;br /&gt;   send_socket((char*)"\r\n");&lt;br /&gt;   send_socket((char*)".\r\n");&lt;br /&gt;   read_socket(); &lt;br /&gt;   send_socket((char*)QUIT);&lt;br /&gt;   read_socket();&lt;br /&gt;   close(sock);&lt;br /&gt;  };&lt;br /&gt; };&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#endif&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Usage:&lt;/span&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;#include "SendMail.h"&lt;br /&gt;&lt;br /&gt;int main(int argc, char** argv) {&lt;br /&gt; mail::SendMail* sendmail = new mail::SendMail();&lt;br /&gt; sendmail-&gt;HostIp = (char*)"192.168.1.10";&lt;br /&gt; sendmail-&gt;From = (char*)"mail@address.com";&lt;br /&gt; sendmail-&gt;To = (char*)"mail@address.com";&lt;br /&gt; sendmail-&gt;Subject = (char*)"Test!";&lt;br /&gt; sendmail-&gt;Message = (char*)"Content:\nTest 123...";&lt;br /&gt; sendmail-&gt;Send();&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-8568966177097967846?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/8568966177097967846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2011/03/gnuc-simple-send-mail.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/8568966177097967846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/8568966177097967846'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2011/03/gnuc-simple-send-mail.html' title='GNU/C++ Simple Send Mail'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-2212445651165096770</id><published>2011-03-25T04:00:00.000-07:00</published><updated>2011-03-25T09:00:21.502-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>VC++ Simple Send Mail</title><content type='html'>See the &lt;a href="gnuc-simple-send-mail.html"&gt;GNU/C++ Simple Send Mail here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I did the class below for Visual C++ based in these links:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/58210/c-smtp-example" target="_blank"&gt;Solution to send a mail in GNU/C++&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://cs.baylor.edu/~donahoo/practical/CSockets/WindowsSockets.pdf" target="_blank"&gt;Transitioning from UNIX to Windows Socket Programming&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;SendMail.h&lt;/span&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;#ifndef _SENDMAILHEADER&lt;br /&gt;#define _SENDMAILHEADER&lt;br /&gt;&lt;br /&gt;#include "stdafx.h"&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;Winsock2.h&amp;gt;&lt;br /&gt;#include &amp;lt;Windows.h&amp;gt;&lt;br /&gt;#include &amp;lt;string&amp;gt;&lt;br /&gt;&lt;br /&gt;#pragma comment(lib, "ws2_32.lib")&lt;br /&gt;&lt;br /&gt;#define HELO "HELO\r\n"&lt;br /&gt;#define DATA "DATA\r\n"&lt;br /&gt;#define QUIT "QUIT\r\n"&lt;br /&gt;&lt;br /&gt;namespace mail {&lt;br /&gt; class SendMail {&lt;br /&gt; private:&lt;br /&gt;  int sock;&lt;br /&gt;  char buf[BUFSIZ];&lt;br /&gt;  void send_socket(char *s)&lt;br /&gt;  {&lt;br /&gt;   send(sock, s, strlen(s), 0);&lt;br /&gt;   //fprintf(stderr, s); &lt;br /&gt;  }&lt;br /&gt;  void read_socket()&lt;br /&gt;  {&lt;br /&gt;   int len = recv(sock, buf, BUFSIZ, 0);&lt;br /&gt;   //fprintf(stderr, ((std::string)buf).substr(0, len).c_str()); &lt;br /&gt;  }&lt;br /&gt; public:&lt;br /&gt;  char* HostIp;&lt;br /&gt;  unsigned short HostPort;&lt;br /&gt;  char* To;&lt;br /&gt;  char* From;&lt;br /&gt;  char* Subject;&lt;br /&gt;  char* Message;&lt;br /&gt;  SendMail() {&lt;br /&gt;   HostPort = 25;&lt;br /&gt;  };&lt;br /&gt;  ~SendMail() { };&lt;br /&gt;  void Send() {&lt;br /&gt;   struct sockaddr_in hostAddr; &lt;br /&gt;   WSADATA wsaData;&lt;br /&gt;   if (WSAStartup(MAKEWORD(2, 0), &amp;wsaData) != 0) {&lt;br /&gt;    fprintf(stderr, "SendMail: WSAStartup() failed"); &lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) &lt; 0) {&lt;br /&gt;    fprintf(stderr, "SendMail: socket() failed"); &lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   memset(&amp;hostAddr, 0, sizeof(hostAddr)); &lt;br /&gt;   hostAddr.sin_family      = AF_INET; &lt;br /&gt;   hostAddr.sin_addr.s_addr = inet_addr(HostIp); &lt;br /&gt;   hostAddr.sin_port        = htons(HostPort); &lt;br /&gt;   if (connect(sock, (struct sockaddr *) &amp;hostAddr, sizeof(hostAddr)) &lt; 0) {&lt;br /&gt;    fprintf(stderr, "SendMail: connect() failed"); &lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   read_socket();&lt;br /&gt;   send_socket(HELO);&lt;br /&gt;   read_socket();&lt;br /&gt;   send_socket("MAIL FROM: "); &lt;br /&gt;   send_socket(From);&lt;br /&gt;   send_socket("\r\n");&lt;br /&gt;   read_socket();&lt;br /&gt;   send_socket("VRFY ");&lt;br /&gt;   send_socket(From);&lt;br /&gt;   send_socket("\r\n");&lt;br /&gt;   read_socket();&lt;br /&gt;   send_socket("RCPT TO: ");&lt;br /&gt;   send_socket(To);&lt;br /&gt;   send_socket("\r\n");&lt;br /&gt;   read_socket();&lt;br /&gt;   send_socket(DATA);&lt;br /&gt;   send_socket("Subject: ");&lt;br /&gt;   send_socket(Subject);&lt;br /&gt;   send_socket("\r\n");&lt;br /&gt;   read_socket();&lt;br /&gt;   send_socket(Message);&lt;br /&gt;   send_socket("\r\n");&lt;br /&gt;   send_socket(".\r\n");&lt;br /&gt;   read_socket(); &lt;br /&gt;   send_socket(QUIT);&lt;br /&gt;   read_socket();&lt;br /&gt;   closesocket(sock); &lt;br /&gt;   WSACleanup(); &lt;br /&gt;  };&lt;br /&gt; };&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#endif&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Usage:&lt;/span&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;#include "stdafx.h"&lt;br /&gt;#include "SendMail.h"&lt;br /&gt;&lt;br /&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt; mail::SendMail* sendmail = new mail::SendMail();&lt;br /&gt; sendmail-&gt;HostIp = "192.168.1.10";&lt;br /&gt; sendmail-&gt;From = "mail@address.com";&lt;br /&gt; sendmail-&gt;To = "mail@address.com";&lt;br /&gt; sendmail-&gt;Subject = "Test!";&lt;br /&gt; sendmail-&gt;Message = "Content:\nTest 123...";&lt;br /&gt; sendmail-&gt;Send();&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-2212445651165096770?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/2212445651165096770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2011/03/c-send-mail.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/2212445651165096770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/2212445651165096770'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2011/03/c-send-mail.html' title='VC++ Simple Send Mail'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-4145827492718230778</id><published>2010-09-17T02:24:00.000-07:00</published><updated>2010-10-04T14:23:56.326-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Force JPA load Identity ID after Insert</title><content type='html'>When you have an ID into your Entity Classe from Database and that is Identity, if you do an insert action the ID of this Entity isn't reloaded by default with the ID that was generated by Database, through JPA.&lt;br /&gt;&lt;br /&gt;A sample of an ID of Identity kind:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;    @Id&lt;br /&gt;    @Basic(optional = false)&lt;br /&gt;    @GeneratedValue(strategy=GenerationType.IDENTITY)&lt;br /&gt;    @Column(name = "Id")&lt;br /&gt;    private Integer id;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To refresh the ID value with the ID that was generated by the Database on insert action, you need put more this below in your AbstractFacade.Create(EntityClass):&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;        getEntityManager().flush();&lt;br /&gt;        getEntityManager().refresh(entity);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-style:italic;"&gt;getEntityManager().flush()&lt;/span&gt; - Will do the commit to Database execute the insert action.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-style:italic;"&gt;getEntityManager().refresh(entity)&lt;/span&gt; - Will refresh the entity object with a new ID that was inserted.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Full sample of the &lt;span style="font-weight:bold;"&gt;AbstractFacade.java&lt;/span&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;package org.test.ejb;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;import javax.persistence.EntityManager;&lt;br /&gt;&lt;br /&gt;public abstract class AbstractFacade&lt;T&gt; {&lt;br /&gt;    private Class&lt;T&gt; entityClass;&lt;br /&gt;&lt;br /&gt;    public AbstractFacade(Class&lt;T&gt; entityClass) {&lt;br /&gt;        this.entityClass = entityClass;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected abstract EntityManager getEntityManager();&lt;br /&gt;&lt;br /&gt;    public void create(T entity) {&lt;br /&gt;        getEntityManager().persist(entity);&lt;br /&gt;        getEntityManager().flush();&lt;br /&gt;        getEntityManager().refresh(entity);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void edit(T entity) {&lt;br /&gt;        getEntityManager().merge(entity);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void remove(T entity) {&lt;br /&gt;        getEntityManager().remove(getEntityManager().merge(entity));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public T find(Object id) {&lt;br /&gt;        return getEntityManager().find(entityClass, id);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public List&lt;T&gt; findAll() {&lt;br /&gt;        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();&lt;br /&gt;        cq.select(cq.from(entityClass));&lt;br /&gt;        return getEntityManager().createQuery(cq).getResultList();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public List&lt;T&gt; findRange(int[] range) {&lt;br /&gt;        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();&lt;br /&gt;        cq.select(cq.from(entityClass));&lt;br /&gt;        javax.persistence.Query q = getEntityManager().createQuery(cq);&lt;br /&gt;        q.setMaxResults(range[1] - range[0]);&lt;br /&gt;        q.setFirstResult(range[0]);&lt;br /&gt;        return q.getResultList();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int count() {&lt;br /&gt;        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();&lt;br /&gt;        javax.persistence.criteria.Root&lt;T&gt; rt = cq.from(entityClass);&lt;br /&gt;        cq.select(getEntityManager().getCriteriaBuilder().count(rt));&lt;br /&gt;        javax.persistence.Query q = getEntityManager().createQuery(cq);&lt;br /&gt;        return ((Long) q.getSingleResult()).intValue();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If you publish your JPA Create action in a Web Services, you will need return to client side an Entity instance to client know what is the new ID. Cause the Entity instance of the Client side can't be refresh with changes inside Server.&lt;br /&gt;Like:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;    @WebMethod(operationName = "create")&lt;br /&gt;    public BusinessEntity create(@WebParam(name = "businessEntity")&lt;br /&gt;    BusinessEntity businessEntity) {&lt;br /&gt;        ejbRef.create(businessEntity);&lt;br /&gt;        return businessEntity;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-4145827492718230778?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/4145827492718230778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2010/09/jpa-load-identity-id-after-insert.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/4145827492718230778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/4145827492718230778'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2010/09/jpa-load-identity-id-after-insert.html' title='Force JPA load Identity ID after Insert'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-2642006489455089294</id><published>2010-09-15T03:14:00.000-07:00</published><updated>2010-11-02T18:00:33.969-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Web Service - A cycle is detected in the object graph. This will cause infinitely deep XML...</title><content type='html'>When a Web Service that uses an EJB that exposes an Entity Class and this Entity Class makes relationships with another Entity Class, may be you will receives this error:&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(255, 0, 0); font-size: 10px;"&gt;&lt;br /&gt;Caused by: javax.xml.bind.MarshalException&lt;br /&gt; - with linked exception:&lt;br /&gt;[com.sun.istack.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: org.test.data.Business[id=1] -&gt; org.test.data.BusinessType[id=1] -&gt; org.test.data.Business[id=1]]&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:269)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.BridgeImpl.marshal(BridgeImpl.java:100)&lt;br /&gt;        at com.sun.xml.bind.api.Bridge.marshal(Bridge.java:141)&lt;br /&gt;        at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:317)&lt;br /&gt;        ... 35 more&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold; color: rgb(255, 0, 0); font-size: 14px;"&gt;Caused by: com.sun.istack.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: org.test.data.Business[id=1] -&gt; org.test.data.BusinessType[id=1] -&gt; org.test.data.Business[id=1]&lt;/span&gt;&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:248)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.XMLSerializer.pushObject(XMLSerializer.java:537)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:631)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:65)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:168)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:155)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:340)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:152)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:340)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:65)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:168)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:155)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:340)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)&lt;br /&gt;        at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:264)&lt;br /&gt;        ... 38 more&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To this error above you can found solutions saying to use this interface:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;com.sun.xml&lt;span style="font-weight:bold; color: rgb(255, 0, 0)"&gt;.internal&lt;/span&gt;.bind.CycleRecoverable&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;NetBeans recognize this package and not mark like an error. But on compile time this package does not exist to compiler side. Perhaps you will receive this error when compiles:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(255, 0, 0);"&gt;&lt;br /&gt;/home/eduveks/project/wstest/src/org/test/data/Business.java:8: package com.sun.xml.internal.bind does not exist&lt;br /&gt;import com.sun.xml.internal.bind.CycleRecoverable;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On my view this error is a bug of NetBeans that recognizes this package when isn't a valid package to Java compiler. To test this bug you only need put this "import com.sun.xml.internal.bind.CycleRecoverable;" into any Java file and you will see that NetBeans don't says nothing and accept as well, but if you "Clean and Build" the error will show up.&lt;br /&gt;&lt;br /&gt;The correct package is &lt;span style="font-style:italic;"&gt;(without &lt;span style="font-weight:bold;"&gt;.internal&lt;/span&gt;)&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;import com.sun.xml.bind.CycleRecoverable;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To uses that package path above you need add it:&lt;br /&gt;&lt;br /&gt;Project Properties -&gt; Libraries -&gt; "Add Library...", select &lt;span style="font-weight:bold;"&gt;JAXB 2.2&lt;/span&gt; and "Add Library". &lt;br /&gt;&lt;br /&gt;A sample how to implements the &lt;span style="font-weight:bold;"&gt;com.sun.xml.bind.CycleRecoverable&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt; &amp;nbsp; &amp;nbsp; &amp;gt; Business.java&lt;/span&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;package org.test.data;&lt;br /&gt;&lt;br /&gt;import com.sun.xml.bind.CycleRecoverable;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import java.util.Collection;&lt;br /&gt;import javax.persistence.Basic;&lt;br /&gt;import javax.persistence.CascadeType;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.GeneratedValue;&lt;br /&gt;import javax.persistence.GenerationType;&lt;br /&gt;import javax.persistence.Id;&lt;br /&gt;import javax.persistence.JoinColumn;&lt;br /&gt;import javax.persistence.ManyToOne;&lt;br /&gt;import javax.persistence.NamedQueries;&lt;br /&gt;import javax.persistence.NamedQuery;&lt;br /&gt;import javax.persistence.Table;&lt;br /&gt;import javax.xml.bind.annotation.XmlID;&lt;br /&gt;import javax.xml.bind.annotation.XmlIDREF;&lt;br /&gt;import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;&lt;br /&gt;import org.test.data.adapter.IntegerAdapter;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = "Business")&lt;br /&gt;@NamedQueries({&lt;br /&gt;    @NamedQuery(name = "Business.findAll", query = "SELECT b FROM Business b"),&lt;br /&gt;    @NamedQuery(name = "Business.findById", query = "SELECT b FROM Business b WHERE b.id = :id"),&lt;br /&gt;    @NamedQuery(name = "Business.findByNome", query = "SELECT b FROM Business b WHERE b.name = :name"),&lt;br /&gt;public class Business implements Serializable, CycleRecoverable {&lt;br /&gt;    private static final long serialVersionUID = 1L;&lt;br /&gt;    @Id&lt;br /&gt;    @Basic(optional = false)&lt;br /&gt;    @GeneratedValue(strategy=GenerationType.IDENTITY)&lt;br /&gt;    @Column(name = "Id")&lt;br /&gt;    private Integer id;&lt;br /&gt;    @Basic(optional = false)&lt;br /&gt;    @Column(name = "Name")&lt;br /&gt;    private String name;&lt;br /&gt;    @JoinColumn(name = "BusinessTypeId", referencedColumnName = "Id")&lt;br /&gt;    @ManyToOne(optional = false)&lt;br /&gt;    private BusinessType businessType;&lt;br /&gt;&lt;br /&gt;    public Business() {&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Business(Integer id) {&lt;br /&gt;        this.id = id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Business(Integer id, String name) {&lt;br /&gt;        this.id = id;&lt;br /&gt;        this.name = name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @XmlID&lt;br /&gt;    @XmlJavaTypeAdapter(value = IntegerAdapter.class, type = String.class)&lt;br /&gt;    public Integer getId() {&lt;br /&gt;        return id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setId(Integer id) {&lt;br /&gt;        this.id = id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getName() {&lt;br /&gt;        return name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setName(String name) {&lt;br /&gt;        this.name = name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @XmlIDREF&lt;br /&gt;    public BusinessType getBusinessType() {&lt;br /&gt;        return businessType;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setBusinessType(BusinessType businessType) {&lt;br /&gt;        this.businessType = businessType;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public int hashCode() {&lt;br /&gt;        int hash = 0;&lt;br /&gt;        hash += (id != null ? id.hashCode() : 0);&lt;br /&gt;        return hash;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public boolean equals(Object object) {&lt;br /&gt;        // TODO: Warning - this method won't work in the case the id fields are not set&lt;br /&gt;        if (!(object instanceof Business)) {&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;        Business other = (Business) object;&lt;br /&gt;        if ((this.id == null &amp;&amp; other.id != null) || (this.id != null &amp;&amp; !this.id.equals(other.id))) {&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public String toString() {&lt;br /&gt;        return "org.test.data.Business[id=" + id + "]";&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    @Override&lt;br /&gt;    public Object onCycleDetected(Context cntxt) {&lt;br /&gt;        System.out.println("CycleRecoverable.onCycleDetected # ".concat(this.toString()));&lt;br /&gt;        Business n = new Business();&lt;br /&gt;        n.setId(this.getId());&lt;br /&gt;        return n;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt; &amp;nbsp; &amp;nbsp; &amp;gt; BusinessType.java&lt;/span&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;package org.test.data;&lt;br /&gt;&lt;br /&gt;import com.sun.xml.bind.CycleRecoverable;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import java.util.Collection;&lt;br /&gt;import javax.persistence.Basic;&lt;br /&gt;import javax.persistence.CascadeType;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.GeneratedValue;&lt;br /&gt;import javax.persistence.GenerationType;&lt;br /&gt;import javax.persistence.Id;&lt;br /&gt;import javax.persistence.NamedQueries;&lt;br /&gt;import javax.persistence.NamedQuery;&lt;br /&gt;import javax.persistence.OneToMany;&lt;br /&gt;import javax.persistence.Table;&lt;br /&gt;import javax.xml.bind.annotation.XmlID;&lt;br /&gt;import javax.xml.bind.annotation.XmlIDREF;&lt;br /&gt;import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;&lt;br /&gt;import org.test.data.adapter.IntegerAdapter;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = "BusinessType")&lt;br /&gt;@NamedQueries({&lt;br /&gt;    @NamedQuery(name = "BusinessType.findAll", query = "SELECT bt FROM BusinessType bt"),&lt;br /&gt;    @NamedQuery(name = "BusinessType.findById", query = "SELECT bt FROM BusinessType bt WHERE bt.id = :id"),&lt;br /&gt;    @NamedQuery(name = "BusinessType.findByName", query = "SELECT bt FROM BusinessType bt WHERE bt.name = :name")})&lt;br /&gt;public class BusinessType implements Serializable, CycleRecoverable {&lt;br /&gt;    private static final long serialVersionUID = 1L;&lt;br /&gt;    @Id&lt;br /&gt;    @Basic(optional = false)&lt;br /&gt;    @GeneratedValue(strategy=GenerationType.IDENTITY)&lt;br /&gt;    @Column(name = "Id")&lt;br /&gt;    private Integer id;&lt;br /&gt;    @Basic(optional = false)&lt;br /&gt;    @Column(name = "Name")&lt;br /&gt;    private String name;&lt;br /&gt;    @OneToMany(cascade = CascadeType.ALL, mappedBy = "BusinessType")&lt;br /&gt;    private Collection&lt;Business&gt; businessCollection;&lt;br /&gt;&lt;br /&gt;    public BusinessType() {&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public BusinessType(Integer id) {&lt;br /&gt;        this.id = id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public BusinessType(Integer id, String name) {&lt;br /&gt;        this.id = id;&lt;br /&gt;        this.name = name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @XmlID&lt;br /&gt;    @XmlJavaTypeAdapter(value = IntegerAdapter.class, type = String.class)&lt;br /&gt;    public Integer getId() {&lt;br /&gt;        return id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setId(Integer id) {&lt;br /&gt;        this.id = id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getName() {&lt;br /&gt;        return name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setName(String name) {&lt;br /&gt;        this.name = name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @XmlIDREF&lt;br /&gt;    public Collection&lt;Business&gt; getBusinessCollection() {&lt;br /&gt;        return businessCollection;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setBusinessCollection(Collection&lt;Business&gt; businessCollection) {&lt;br /&gt;        this.businessCollection = businessCollection;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public int hashCode() {&lt;br /&gt;        int hash = 0;&lt;br /&gt;        hash += (id != null ? id.hashCode() : 0);&lt;br /&gt;        return hash;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public boolean equals(Object object) {&lt;br /&gt;        // TODO: Warning - this method won't work in the case the id fields are not set&lt;br /&gt;        if (!(object instanceof BusinessType)) {&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;        BusinessType other = (BusinessType) object;&lt;br /&gt;        if ((this.id == null &amp;&amp; other.id != null) || (this.id != null &amp;&amp; !this.id.equals(other.id))) {&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public String toString() {&lt;br /&gt;        return "org.test.data.BusinessType[id=" + id + "]";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object onCycleDetected(Context cntxt) {&lt;br /&gt;        System.out.println("CycleRecoverable.onCycleDetected # ".concat(this.toString()));&lt;br /&gt;        BusinessType n = new BusinessType();&lt;br /&gt;        n.setId(this.getId());&lt;br /&gt;        return n;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You need mark the IDs with &lt;span style="font-weight:bold;"&gt;@XmlID&lt;/span&gt;&lt;span style="font-style:italic;"&gt;(only before the &lt;span style="font-weight:bold;"&gt;get&lt;/span&gt; method, before the variable declaration don't works)&lt;/span&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;    @XmlID&lt;br /&gt;    @XmlJavaTypeAdapter(value = IntegerAdapter.class, type = String.class)&lt;br /&gt;    public Integer getId() {&lt;br /&gt;        return id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setId(Integer id) {&lt;br /&gt;        this.id = id;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And mark all &lt;span style="font-weight:bold;"&gt;Collection&lt;/span&gt; relationships methods with &lt;span style="font-weight:bold;"&gt;@XmlIDREF&lt;/span&gt;&lt;span style="font-style:italic;"&gt;(only before the &lt;span style="font-weight:bold;"&gt;get&lt;/span&gt; method, before the variable declaration don't works)&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt; &amp;nbsp; &amp;nbsp; &amp;gt; BusinessType.java&lt;/span&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;    @XmlIDREF&lt;br /&gt;    public Collection&lt;Business&gt; getBusinessCollection() {&lt;br /&gt;        return businessCollection;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setBusinessCollection(Collection&lt;Business&gt; businessCollection) {&lt;br /&gt;        this.businessCollection = businessCollection;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Sample of the &lt;span style="font-weight:bold;"&gt;IntegerAdapter.java&lt;/span&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;package org.test.data.adapter;&lt;br /&gt;&lt;br /&gt;import javax.xml.bind.annotation.adapters.XmlAdapter;&lt;br /&gt;&lt;br /&gt;public class IntegerAdapter extends XmlAdapter&lt;String, Integer&gt; {&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Integer unmarshal(String v) {&lt;br /&gt;        return Integer.parseInt(v);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public String marshal(Integer v) {&lt;br /&gt;        return v.toString();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-2642006489455089294?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/2642006489455089294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2010/09/web-service-cycle-is-detected-in-object.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/2642006489455089294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/2642006489455089294'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2010/09/web-service-cycle-is-detected-in-object.html' title='Web Service - A cycle is detected in the object graph. This will cause infinitely deep XML...'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-1339099636071128989</id><published>2010-07-29T09:03:00.001-07:00</published><updated>2010-10-04T14:12:25.114-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='BSD'/><category scheme='http://www.blogger.com/atom/ns#' term='Solaris'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Automate Command-line Programs</title><content type='html'>I had to automate a command-line program. Then I did this script like a sample that do auto control to &lt;span style="font-weight:bold;"&gt;vi&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;This way is possible control any kind of command-line program.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;#!/bin/python&lt;br /&gt;&lt;br /&gt;import subprocess&lt;br /&gt;import time&lt;br /&gt;import threading&lt;br /&gt;&lt;br /&gt;class ProcessRunner(threading.Thread):&lt;br /&gt;   def run(self):&lt;br /&gt;       self.process = subprocess.Popen(["vi /tmp/xpto &gt; /tmp/viOutput"], shell = True, bufsize = 1000, stdout = subprocess.PIPE, stdin = subprocess.PIPE, stderr = subprocess.STDOUT)&lt;br /&gt;&lt;br /&gt;pr = ProcessRunner()&lt;br /&gt;pr.start()&lt;br /&gt;&lt;br /&gt;time.sleep(1)&lt;br /&gt;&lt;br /&gt;pr.process.stdin.write("i\n")&lt;br /&gt;pr.process.stdin.flush()&lt;br /&gt;&lt;br /&gt;time.sleep(1)&lt;br /&gt;&lt;br /&gt;pr.process.stdin.write("Content xpto... :P\n")&lt;br /&gt;pr.process.stdin.flush()&lt;br /&gt;&lt;br /&gt;time.sleep(1)&lt;br /&gt;&lt;br /&gt;pr.process.stdin.write(chr(27))&lt;br /&gt;pr.process.stdin.flush()&lt;br /&gt;&lt;br /&gt;time.sleep(1)&lt;br /&gt;&lt;br /&gt;pr.process.stdin.write(":wq\n")&lt;br /&gt;pr.process.stdin.flush()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If is necessary read some content from program output, you can put the output in a temp file, in this case goes to &lt;span style="font-weight:bold;"&gt;/tmp/viOutput&lt;/span&gt;. See with attention the line of the &lt;span style="font-weight:bold;"&gt;subprocess.Popen&lt;/span&gt;. Another way is use the &lt;span style="font-weight:bold;"&gt;pr.process.stdout&lt;/span&gt; but it dont work fine for me.&lt;br /&gt;&lt;br /&gt;The command &lt;span style="font-weight:bold;"&gt;pr.process.stdin.write(chr(27))&lt;/span&gt; write the "character" ESC, like the keyboard key.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-1339099636071128989?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/1339099636071128989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2010/07/automate-command-line-programs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/1339099636071128989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/1339099636071128989'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2010/07/automate-command-line-programs.html' title='Automate Command-line Programs'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-8626429602157369726</id><published>2010-02-04T02:22:00.000-08:00</published><updated>2010-02-04T03:01:53.219-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Solaris'/><title type='text'>NC (NetCast) vs Printers (Impressoras)</title><content type='html'>Sobrou para mim configurar as novas impressoras Samsung SCX-6345N no Solaris, e como é óbvio e uma grande pena não tem drivers, ou pelo menos que funcione bem, pois apesar de haver um driver PPD supostamente para o LP em Solaris, não funcionou nem a pau.&lt;br /&gt;&lt;br /&gt;Fiz tudo o possível para fazer funcionar estas impressoras em Solaris via LP, pois era uma situação de urgência fazer o sistema da Reuters (Kondor) utilizar as novas impressoras.&lt;br /&gt;&lt;br /&gt;Após muitas tentativas e alguns e-mails trocados com o suporte da Samsung, e até um programa da Samsung para instalar a impressora em modo gráfico (X11) que "configuraria automaticamente" o LP, também não funcionou. E após também de muitas folhas de erros e cabeçalho de jobs terem sido impressos sem nunca sair o conteúdo desejado. Após tudo isto e um pouco mais... o suporte da Samsung recomendou eu usar o comando:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# cat testprint.ps | nc -w 2 192.168.193.191 9100&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Fiquei sético, mas como não havia muito mais a fazer, lá fui eu experimentar isto, e para a minha surpresa... não é que funcionou!&lt;br /&gt;&lt;br /&gt;Por acaso eu já tinha pensado nisto, em abrir uma conexão com a impressora direto e mandar o conteúdo PostScript e ver se ela imprimia ou se ficava maluca. Mas não sabia que existia um comando simples para isto.&lt;br /&gt;&lt;br /&gt;O comando NC (NetCast) não vem no Solaris 10, por isso fui ao Sunfreeware.com pegar o pacote:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sunfreeware.com/programlistsparc10.html#nc"&gt;http://www.sunfreeware.com/programlistsparc10.html#nc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Depois é só instalar o pacote:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;#pkgadd -d nc-110-sol10-sparc-local.gz&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Na configuração da impressora no Kondor (Reuters) ficou apenas assim:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;nc -w 2 192.168.193.191 9100&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Portanto é executar o nc passando o IP e a PORTA da impressora. O &lt;b&gt;-w 2&lt;/b&gt; apenas quer dizer que tem o timeout de 2 segundos.&lt;br /&gt;&lt;br /&gt;A desvantagem desta solução é que perde-se o controle das impressoras com o LP, ou seja, para o Solaris é como se elas não existissem. Então a administração LP e a configuração das impressoras no /etc/lp e os comandos ("lpstat -a", "enable PRINTER" e "disable PRINTER"), tudo isto passa a servir para nada! :D&lt;br /&gt;&lt;br /&gt;Como para nos a solução do NC (NetCast) é suficiente, passamos a trabalhar assim.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NC (NetCast)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;netcat is a simple unix utility which reads and writes data across network connections, using TCP or UDP protocol. It is designed to be a reliable "back-end" tool that can be used directly or easily driven by other programs and scripts. At the same time, it is a feature-rich network debugging and exploration tool, since it can create almost any kind of connection you would need and has several interesting built-in capabilities. Netcat, or "nc" as the actual program is named, should have been supplied long ago as another one of those cryptic but standard Unix tools.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.computerhope.com/unix/nc.htm"&gt;http://www.computerhope.com/unix/nc.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Esta solução de imprimir diretamente para uma impressora de rede usando o NC (NetCast) também é válida para Linux e Unix em geral.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-8626429602157369726?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/8626429602157369726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2010/02/nc-netcast-vs-printers-impressoras.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/8626429602157369726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/8626429602157369726'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2010/02/nc-netcast-vs-printers-impressoras.html' title='NC (NetCast) vs Printers (Impressoras)'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-44312928100440880</id><published>2009-10-20T08:30:00.000-07:00</published><updated>2009-10-21T08:51:24.393-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solaris'/><title type='text'>Solaris - PDF Printer</title><content type='html'>Precisei encarar este desafio de configurar uma impressora de PDF em Solaris, para receber a impressão de documentos em PostScript apartir do Kondor.&lt;br /&gt;&lt;br /&gt;Encontrei este link que ajudou bastante:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://aplawrence.com/SCOFAQ/FAQ_scotec7printtofile.html"&gt;http://aplawrence.com/SCOFAQ/FAQ_scotec7printtofile.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Então os passos que fiz e cheguei ao sucesso são...&lt;br /&gt;&lt;br /&gt;Criar a pasta que irá conter o script que receberá a os dados de impressão:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# mkdir /usr/local/PDFprinter&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Criar uma outra pasta que irá conter o arquivos de PDF:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# mkdir /var/PDFprinter&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Gerar este arquivo de script em &lt;b&gt;/usr/local/PDFprinter/start&lt;/b&gt; que será usado para preparar o device da impressora e manter o device em sincronização com o script de impressão:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;mknod /dev/PDFprinter p&lt;br /&gt;chmod 777 /dev/PDFprinter&lt;br /&gt;while true&lt;br /&gt;do&lt;br /&gt;    cat /dev/PDFprinter | /usr/local/PDFprinter/print&lt;br /&gt;done&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Permissões de execussão:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# chmod +x /usr/local/PDFprinter/start&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Gerar o script de impressão em &lt;b&gt;/usr/local/PDFprinter/print&lt;/b&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;date=`date "+%G%m%d_%H%M%S"`&lt;br /&gt;tempFileName="/tmp/PDFprinter_$date"&lt;br /&gt;while read stuff&lt;br /&gt;do&lt;br /&gt;    echo $stuff &gt;&gt; $tempFileName&lt;br /&gt;done&lt;br /&gt;cat $tempFileName | grep -v "#####" &gt; $tempFileName.tmp&lt;br /&gt;mv $tempFileName.tmp $tempFileName&lt;br /&gt;fileName="/var/PDFprinter/PDFprinter_$date.pdf"&lt;br /&gt;ps2pdf -sPAPERSIZE=a4 $tempFileName $fileName&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O comando ps2pdf faz parte do pacote ghostscript:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sunfreeware.com/programlistsparc10.html#ghostscript"&gt;http://www.sunfreeware.com/programlistsparc10.html#ghostscript&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E para definir o tamanho do papel é com o parâmetro &lt;b&gt;ps2pdf -sPAPERSIZE=a4 ...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Permissões de execussão:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# chmod +x /usr/local/PDFprinter/print&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Preparar e iniciar o device da impressora:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# /usr/local/PDFprinter/start &amp;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Registrar o device da impressora e activar a impressora:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# lpadmin -p PDFPrinter -v /dev/PDFprinter&lt;br /&gt;# accept PDFPrinter&lt;br /&gt;# enable PDFPrinter&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Agora é só mandar alguma coisa em PostScript para imprimir nesta impressora e ver o resultado em arquivos temporários em &lt;b&gt;/tmp&lt;/b&gt;, e caso gere o PDF com sucesso deverá estar em &lt;b&gt;/var/PDFprinter&lt;/b&gt;;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-44312928100440880?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/44312928100440880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2009/10/solaris-pdf-printer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/44312928100440880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/44312928100440880'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2009/10/solaris-pdf-printer.html' title='Solaris - PDF Printer'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-5141108508471773971</id><published>2009-09-28T10:33:00.000-07:00</published><updated>2009-09-28T10:45:34.274-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Process ID</title><content type='html'>Quando se faz um serviços Unix em Java para poder fazer os scripts de stop, kill, etc, é preciso o PID (número do processo), então para tal é preciso gerar um arquivo que contém esta informação.&lt;br /&gt;&lt;br /&gt;Portanto este código faz exatamente isto, gera um arquivo com o PID da aplicação Java:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;java.io.BufferedWriter bw = null;&lt;br /&gt;try {&lt;br /&gt;    bw = new java.io.BufferedWriter(new java.io.OutputStreamWriter(new java.io.FileOutputStream("my.pid")));&lt;br /&gt;    String pidInfo = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();&lt;br /&gt;    bw.write(pidInfo.substring(0, pidInfo.indexOf('@')));&lt;br /&gt;} finally {&lt;br /&gt;    if (bw != null) bw.close();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-5141108508471773971?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/5141108508471773971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2009/09/proccess-id.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/5141108508471773971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/5141108508471773971'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2009/09/proccess-id.html' title='Process ID'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-7508631032524922653</id><published>2009-06-19T10:04:00.000-07:00</published><updated>2009-06-24T05:18:32.138-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Jetty'/><title type='text'>Jetty e Web Services com JAX-WS</title><content type='html'>O Jetty é um poderoso servidor web, disto não há dúvidas, mas no que toca a web services paira uma nuvem negra, não há muita documentação e nem integração com IDEs.&lt;br /&gt;&lt;br /&gt;Depois de pesquisar um pouco vi que era possível integrar com o JAX-WS.&lt;br /&gt;&lt;br /&gt;Não encontrei nenhuma explicação detalhada de como fazer, e que explicasse também a parte do cliente, então resolvi fazer o download do JAX-WS e ver os exemplos e a documentação, e a conclusão que cheguei segue abaixo.&lt;br /&gt;&lt;br /&gt;Levando em consideração que já tem o Jetty configurado e rodando, no meu caso foi a versão 6 e com o JDK 6.&lt;br /&gt;&lt;br /&gt;Fazer o download do JAX-WS no meu caso foi a versão 2.1.7 em:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://jax-ws.dev.java.net/"&gt;https://jax-ws.dev.java.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Descompactar e em &lt;b&gt;jaxws-ri/docs/UsersGuide.html#3.1_Server&lt;/b&gt; da para ver alguma explicação de como fazer.&lt;br /&gt;&lt;br /&gt;Copiar todos os &lt;b&gt;jars&lt;/b&gt; que estão na pasta &lt;b&gt;lib do JAX-WS&lt;/b&gt; para a pasta &lt;b&gt;lib/ext do Jetty&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Agora no seu projeto web criar as seguintes classes de exemplo (também estão em &lt;b&gt;jaxws-ri/samples/fromjava/src&lt;/b&gt;), aqui dei alguma melhoria nas anotações:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-&gt;&lt;/b&gt; fromjava/server/&lt;b&gt;AddNumbersImpl.java&lt;/b&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;package fromjava.server;&lt;br /&gt;import javax.jws.WebService;&lt;br /&gt;import javax.jws.WebMethod;&lt;br /&gt;import javax.jws.WebParam;&lt;br /&gt;import javax.servlet.ServletContext;&lt;br /&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;import javax.servlet.http.HttpServletResponse;&lt;br /&gt;import javax.xml.ws.WebServiceContext;&lt;br /&gt;import javax.xml.ws.handler.MessageContext;&lt;br /&gt;import javax.annotation.Resource;&lt;br /&gt;@WebService&lt;br /&gt;public class AddNumbersImpl {&lt;br /&gt;    @Resource&lt;br /&gt;    private WebServiceContext context;&lt;br /&gt;    @WebMethod(operationName = "add")&lt;br /&gt;    public int addNumbers(@WebParam(name = "first") int number1, @WebParam(name = "second") int number2) throws AddNumbersException {&lt;br /&gt;        // SERVLET - IF NEED SERVLET RESOURCES. For example to do session control.&lt;br /&gt;        MessageContext messageContext = context.getMessageContext();&lt;br /&gt;        ServletContext servletContext = (ServletContext)messageContext.get(MessageContext.SERVLET_CONTEXT);&lt;br /&gt;        HttpServletRequest servletRequest = (HttpServletRequest)messageContext.get(MessageContext.SERVLET_REQUEST);&lt;br /&gt;        HttpServletResponse servletResponse = (HttpServletResponse)messageContext.get(MessageContext.SERVLET_RESPONSE);&lt;br /&gt;        // --&lt;br /&gt;        if (number1 &lt; 0 || number2 &lt; 0) {&lt;br /&gt;            throw new AddNumbersException("Negative number cant be added!",&lt;br /&gt;                "Numbers: " + number1 + ", " + number2);&lt;br /&gt;        }&lt;br /&gt;        return number1 + number2;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;-&gt;&lt;/b&gt; fromjava/server/&lt;b&gt;AddNumbersException.java&lt;/b&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;package fromjava.server;&lt;br /&gt;public class AddNumbersException extends Exception {&lt;br /&gt;    String detail;&lt;br /&gt;    public AddNumbersException (String message, String detail) {&lt;br /&gt;        super (message);&lt;br /&gt;        this.detail = detail;&lt;br /&gt;    }&lt;br /&gt;    public String getDetail () {&lt;br /&gt;        return detail;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Acrescentar no &lt;b&gt;web.xml&lt;/b&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;listener&amp;gt;&lt;br /&gt;    &amp;lt;listener-class&amp;gt;com.sun.xml.ws.transport.http.servlet.WSServletContextListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;lt;/listener&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;    &amp;lt;description&amp;gt;JAX-WS endpoint - fromjava&amp;lt;/description&amp;gt;&lt;br /&gt;    &amp;lt;display-name&amp;gt;fromjava&amp;lt;/display-name&amp;gt;&lt;br /&gt;    &amp;lt;servlet-name&amp;gt;fromjava&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;    &amp;lt;servlet-class&amp;gt;com.sun.xml.ws.transport.http.servlet.WSServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;    &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;    &amp;lt;servlet-name&amp;gt;fromjava&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;    &amp;lt;url-pattern&amp;gt;/addnumbers&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;E junto com o web.xml criar o arquivo &lt;b&gt;sun-jaxws.xml&lt;/b&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'&amp;gt;&lt;br /&gt;    &amp;lt;endpoint&lt;br /&gt;        name='fromjava'&lt;br /&gt;        implementation='fromjava.server.AddNumbersImpl'&lt;br /&gt;        url-pattern='/addnumbers'/&amp;gt;&lt;br /&gt;&amp;lt;/endpoints&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Feito isto, é rodar o Jetty e ver o WSDL:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;http://localhost:8080/WSTester/addnumbers?WSDL&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Onde o &lt;i&gt;WSTester&lt;/i&gt; é o nome do seu projeto.&lt;br /&gt;&lt;br /&gt;Agora temos que criar as classes para chamar o web service, para isto o JAX-WS trás o bin/wsimport, no meu caso como estou no Linux vou usar o .sh, caso esteja no Windows é só usar o .bat, criar as pastas &lt;b&gt;src&lt;/b&gt; e &lt;b&gt;dest&lt;/b&gt; dentro da pasta do JAX-WS.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ chmod +x bin/wsimport.sh&lt;br /&gt;$ mkdir dest&lt;br /&gt;$ mkdir src&lt;br /&gt;$ bin/wsimport.sh -d dest -s src http://localhost:8080/WSTester/addnumbers?WSDL&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;O wsimport vai gerar o código das classes para invocar o web service na pasta src, e as classes compiladas em dest.&lt;br /&gt;&lt;br /&gt;Eu peguei na pasta src/fromjava e copiei para o um outro projeto de aplicação do tipo consola em Java. Assim pode chamar o web service:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TestAddNumbers.java&lt;/b&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;package javaapplicationWSTester;&lt;br /&gt;import fromjava.server.*;&lt;br /&gt;public class TestAddNumbers {&lt;br /&gt;    public static void main(String[] args) throws AddNumbersException_Exception {&lt;br /&gt;        int result = new AddNumbersImplService().getAddNumbersImplPort().add(3, 5);&lt;br /&gt;        System.out.println(result);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;O processo é simples, ter a classe do web service, configurar no web.xml e no sun-jaxws.xml, gerar as classes de invocação com o wsimport e boa :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-7508631032524922653?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/7508631032524922653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2009/06/jetty-e-web-services-com-jax-ws.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/7508631032524922653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/7508631032524922653'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2009/06/jetty-e-web-services-com-jax-ws.html' title='Jetty e Web Services com JAX-WS'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-4101664949431481580</id><published>2009-05-18T15:11:00.000-07:00</published><updated>2009-05-18T15:32:06.652-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>SUDO + PHP - Executando comandos como Root no PHP</title><content type='html'>É preciso saber qual é o usuário de execução do PHP:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?php echo exec("whoami"); ?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Editar o /etc/sudoers, este arquivo tem que ter permissões apenas de leitura, não pode ficar com permissões de escrita, por isso antes de editar o arquivo dê permissões de escrita:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# chmod u+w /etc/sudoers&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Depois de editar, tire a permissão de escrita:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# chmod u-w /etc/sudoers&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Então adicionar no /etc/sudoers no&lt;span style="font-weight: bold;"&gt; fim do arquivo&lt;/span&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;%USUARIO_DO_PHP     ALL= NOPASSWD: /CAMINHO/DO/COMANDO&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Se não colocar no fim do arquivo pode ter outra regra depois que anule esta nova regra.&lt;br /&gt;&lt;br /&gt;No PHP é só executar o comando com o SUDO:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?php echo exec("sudo /CAMINHO/DO/COMANDO.sh"); ?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Caso não tenha sucesso, verifique os logs de segurança:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# tail -n 100 /var/log/secure&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Se tiver esta mensagem de erro:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;May 18 16:56:41 SERVIDOR sudo: USUARIO_DO_PHP : sorry, you must have a tty to run sudo ; TTY=unknown ; PWD=/PASTA/DO/PHP ; USER=root ; COMMAND=/CAMINHO/DO/COMANDO&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Então é preciso ir no /etc/sudoers e comentar a seguinte linha que contém o "Defaults    requiretty", assim:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# Defaults    requiretty&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Assim deverá funcionar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-4101664949431481580?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/4101664949431481580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2009/05/sudo-php-executando-comandos-como-root.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/4101664949431481580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/4101664949431481580'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2009/05/sudo-php-executando-comandos-como-root.html' title='SUDO + PHP - Executando comandos como Root no PHP'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-7165620962584205884</id><published>2009-03-13T15:16:00.000-07:00</published><updated>2009-03-13T15:34:24.331-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Ubuntu, iniciando o Compiz &amp; NVIDIA com Antialiasing</title><content type='html'>Para por configurar o Compiz no arranque do Gnome, vá em:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;System -&gt; Preferências -&gt; Sessões&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;E adicione o Compiz:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;Nome: Compiz&lt;br /&gt;Comando: compiz --replace &amp;amp;&lt;br /&gt;Comentário: Desktop 3D&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Fica assim o Compiz configurado para sempre iniciar no arranque do Gnome.&lt;br /&gt;&lt;br /&gt;Depois de configurar a qualidade de antialiasing e outras configurações em:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;Systema -&gt; Administração -&gt; NVIDIA X Server Settings&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Fazer as devidas configurações, principalmente a do "Antialiasing Settings".&lt;br /&gt;&lt;br /&gt;Para que o Gnome carregue as configurações do driver no arranque da sessão, edite o arquivo:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;/usr/share/xsessions/gnome.desktop&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A linha do parâmetro "Exec", para:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;Exec="nvidia-settings -l &amp;amp;&amp;amp; /usr/bin/gnome-session"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Assim sempre que o Gnome iniciar ele vai aplicar as configurações do driver e rodar o Compiz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-7165620962584205884?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/7165620962584205884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2009/03/ubuntu-iniciando-o-compiz-nvidia-com.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/7165620962584205884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/7165620962584205884'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2009/03/ubuntu-iniciando-o-compiz-nvidia-com.html' title='Ubuntu, iniciando o Compiz &amp; NVIDIA com Antialiasing'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-6955407384977284731</id><published>2009-02-05T04:13:00.000-08:00</published><updated>2009-02-05T04:28:00.530-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Erro do AJAX .Net no Internet Explorer, comédia!</title><content type='html'>Bem que o IE é uma porcaria todo mundo sabe. Tirando a lentidão do coitado ainda é cheio de bugs, e cá vai mais um.&lt;br /&gt;&lt;br /&gt;Em aplicações .Net ASPX com AJAX, pode acontecer de algum sortudo ter o seguinte erro de JavaScript após algum tempo de execução:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; color: #ff0000;"&gt;Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.&lt;br /&gt;Details: Error parsing near '&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E o melhor deste erro é que só acontece no IE, no Firefox funciona sempre perfeitamente. Basicamente um problema exclusivo do IE, ainda não sei por que não colocam o Firefox nas empresas, a desculpa de que não é corporativo não cola.&lt;br /&gt;&lt;br /&gt;Para resolver isto a "melhor" maneira para o usuário é, limpar os arquivos temporários e reiniciar o browser :D&lt;br /&gt;&lt;br /&gt;Andei procurando a algumas semanas uma solução para isto e a única que me ajudou foi neste link, lá em baixo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/leftslipper/archive/2007/02/26/sys-webforms-pagerequestmanagerparsererrorexception-what-it-is-and-how-to-avoid-it.aspx#6815054"&gt;http://weblogs.asp.net/leftslipper/archive/2007/02/26/sys-webforms-pagerequestmanagerparsererrorexception-what-it-is-and-how-to-avoid-it.aspx#6815054&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:10px;"&gt;# re: Sys.WebForms.PageRequestManagerParserErrorException - what it is and how to avoid it&lt;br /&gt;Friday, January 02, 2009 1:20 PM by Arjan Douwes&lt;br /&gt;I am experiencing the same issue with my Ajax.net website. After adding         &amp;lt;customErrors mode="Off"/&amp;gt; to the web.config file at &lt;system.web&gt; the problem seems to be that the site is being hosted on a webfarm and the SessionState is being encrypted using the MAC Address. The issue with webfarms is that the EnableViewStateMac is by default set to True which causes problems.&lt;br /&gt;In the web.config I changed the &amp;lt;Page&amp;gt; tag to &amp;lt;Page EnableViewStateMac="False"&amp;gt;&lt;br /&gt;I also added&lt;br /&gt;EnableEventValidation="false"  EnableViewStateMac="false"&lt;br /&gt;to the &amp;lt;%@ Page ... directive of the aspx pages.&lt;br /&gt;These two changes to the website solved my issue.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ou seja, mudar no web.config o customErrors:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;customErrors mode="Off"/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;E colocar nos ASPX que trabalham com AJAX:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;%@ Page Language="C#" EnableEventValidation="false"  EnableViewStateMac="false" ...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Pronto, no meu caso resolveu, e se tiveres sorte também poderá resolver.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-6955407384977284731?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/6955407384977284731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2009/02/erro-do-ajax-net-no-internet-explorer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6955407384977284731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6955407384977284731'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2009/02/erro-do-ajax-net-no-internet-explorer.html' title='Erro do AJAX .Net no Internet Explorer, comédia!'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-4396135480317149109</id><published>2009-02-04T09:40:00.000-08:00</published><updated>2009-02-08T05:04:19.616-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jogos'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Compilando a última versão do WINE no Ubuntu</title><content type='html'>Para quem não sabe, o WINE permite rodar aplicações Windows em Linux/BSDs sem precisar de uma cópia do Windows. Basicamente, com ele é possível rodar a maioria dos programas desenvolvidos para Windows no Linux.&lt;br /&gt;&lt;br /&gt;WINE quer dizer: Wine Is Not an Emulator! O WINE não é um emulador por que ele não emula a arquitetura de processadores do Windows, o Intel x86, ele simplismente consegue executar os binários do Windows na arquitetura em que esta rodando, como uma ponte entre os binários do Windows e o sistema nativa em que ele esta rodando (Linux/BSDs) independente da arquitetura do processador.&lt;br /&gt;&lt;br /&gt;O Ubuntu tem o WINE disponível no repositório oficial, mas nunca é a versão mais resente, e como estão sempre melhorando para rodar melhor os programas Windows, convém mante-lo atualizado. &lt;br /&gt;&lt;br /&gt;O WINE pode consumir bastante recursos da máquina, dependendo das aplicações que ele vai rodar (jogos por exemplo).&lt;br /&gt;&lt;br /&gt;Por estas e outras o melhor é estar sempre com a versão mais recente e compilado para ter melhor desempenho.&lt;br /&gt;&lt;br /&gt;Antes de mais, instalar as dependências do WINE:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ sudo apt-get build-dep wine&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Mas estas dependências não são completas, por isso veja em:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.winehq.org/"&gt;http://wiki.winehq.org/Recommended_Packages&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E baixe e execute o arquivo de script de dependências correspondente a sua versão do Ubuntu, no meu caso:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ wget http://winezeug.googlecode.com/svn/trunk/install-wine-deps.sh&lt;br /&gt;$ chmod +x install-wine-deps.sh&lt;br /&gt;$ sudo ./install-wine-deps.sh&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Fazer o download da última versão do arquivo de source (.tar.bz2) do WINE em:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.winehq.org/"&gt;http://www.winehq.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Extrair o arquivo baixado. Através da console entrar dentro da pasta de sources do WINE e fazer:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ ./configure&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Se no final do "./configure" obtiver o seguinte warning:&lt;br /&gt;&lt;br /&gt;&lt;font color="red"&gt;&lt;i&gt;configure: WARNING: No OpenGL library found on this system.&lt;br /&gt;OpenGL and Direct3D won't be supported.&lt;/i&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Então os links simbólicos da libGL não devem estar corretas, analise com: &lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ ls /usr/lib/libGL* -o&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;É preciso que o link simbólico /usr/lib/libGL.so -&gt; /usr/lib/libGL.so.XXX.XX esteja a apontar para a versão mais recente, onde "XXX.XX" é a identificação da versão mais alta, ou seja a mais recente, da libGL. Caso exista o link simbólico remova-o:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ sudo rm /usr/lib/libGL.so&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;E agora crie o link simbólico para a versão mais recente que tiver:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ sudo ln -s /usr/lib/libGL.so.XXX.XX /usr/lib/libGL.so&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tem que ser feito o ./configure outra vez, e agora sem o warning:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ ./configure&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Dependências e configurações feitas com sucesso, agora só falta compilar e instalar:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ make depend &amp;&amp; make&lt;br /&gt;$ sudo make install&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Pronto! Será criado menus para o WINE no menu de programas, e através da console é só executar:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ wine ARQUIVO_EXECUTAVEL_DO_WINDOWS.exe&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para ver a lista dos programas suportados e a nível da qualidade de execução:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://appdb.winehq.org/"&gt;http://appdb.winehq.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-4396135480317149109?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/4396135480317149109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2009/02/compilando-ultima-versao-do-wine-no.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/4396135480317149109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/4396135480317149109'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2009/02/compilando-ultima-versao-do-wine-no.html' title='Compilando a última versão do WINE no Ubuntu'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-2059502807759003347</id><published>2009-02-03T08:16:00.000-08:00</published><updated>2009-02-03T17:15:06.817-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='VirtualBox'/><title type='text'>Virtualização para servidores com VirtualBox</title><content type='html'>O que não falta agora é soluções de virtualização.&lt;br /&gt;&lt;br /&gt;Mas a mais simples e com excelente performance na minha opinião é com o VirtualBox, dá para fazer tudo que é preciso com muita simplicidade e rapidez.&lt;br /&gt;&lt;br /&gt;Para virtualização em desktop o VirtualBox já vem reinando a algum tempo.&lt;br /&gt;&lt;br /&gt;E para servidor, muitos não apostam por que simplismente não sabem que é possível, mas dá! E não é preciso ter ambiente gráfico, usando o VRDP pode-se administrar a máquina remotamente. Mas convém ter o ambiente gráfico, tudo fica muito mais fácil, e hoje em dia não vejo por que não ter ambiente gráfico no servidor, pois o que não falta é ambientes gráficos levezinhos que nem afetam a performance do servidor.&lt;br /&gt;&lt;br /&gt;Existe uma solução para máquinas virtuais usando OpenSolaris e VirtualBox, chamda xVM Server:&lt;br /&gt;&lt;a href="http://xvmserver.org/"&gt;http://xvmserver.org/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.sun.com/software/products/xvmserver/index.xml"&gt;http://www.sun.com/software/products/xvmserver/index.xml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mas como já tenho o CentOS redondinho, agora é tarde.&lt;br /&gt;&lt;br /&gt;Bem, então eu resolvi fazer de tudo para ter o VirtualBox trabalhando no servidor com o Windows 2003 Server em máquina virtual dentro do VirtualBox no CentOS 5.&lt;br /&gt;&lt;br /&gt;Melhor impossível, ficou perfeito, excelente performance, fácil administração, todos serviços funcionando lindamente.&lt;br /&gt;&lt;br /&gt;Vamos ao que interessa. Basicamente CentOS 5 com o VirtualBox instalado, com a máquina virtual para o Windows Server 2003 instalada e configurada, isto é moleza e o que não falta é tutoriais pela net ensinando como fazer isto com screenshots e tudo, e o VirtualBox é muito intuitivo. Por isso este não é o âmbito aqui.&lt;br /&gt;&lt;br /&gt;Agora a parte mais complicada, que tive que pesquisar bastante, para fazer com que o CentOS comunicasse com o Windows Server. O que me ajudou mais a desvendar isto foi este script: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.savvyadmin.com/virtualbox-host-interface-networking-with-nat/"&gt;http://www.savvyadmin.com/virtualbox-host-interface-networking-with-nat/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mas como nem tudo é perfeito, este script não serve no CentOS, é preciso algumas alterações.&lt;br /&gt;&lt;br /&gt;Então em primeiro lugar, configurar o IP da máquina virtual, ir no Windows 2003 Server e configurar o TCP/IP assim:&lt;br /&gt;&lt;br /&gt;IP address: 192.168.20.201&lt;br /&gt;Subnet mask: 255.255.255.0&lt;br /&gt;Default gateway: 192.168.20.1&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_w3IQ9eKR2S4/SYjjQzHK5XI/AAAAAAAAABs/oQ9PKRUIjZc/s1600-h/Win2003SrvTcpIP.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_w3IQ9eKR2S4/SYjjQzHK5XI/AAAAAAAAABs/oQ9PKRUIjZc/s320/Win2003SrvTcpIP.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5298734839339083122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Feito isto, ir no CentOS e criar uma interface de rede virtual:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# /usr/bin/VBoxTunctl -u root&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Depois disto, pode verificar com o "/sbin/ifconfig -a" se aparece o tap0. Pronto ai esta a nossa interface de rede virtual.&lt;br /&gt;&lt;br /&gt;É preciso configurar no VirtualBox para usar a nova interface de rede virtual, a tap0. Ir nos "Settings" da máquina virtual, em "Network", no "Attached to", mudar para "Host Interface", e selecionar a tap0. Para ir nos "Settings" tem que desligar a máquina virtual.&lt;br /&gt;&lt;br /&gt;Settings da Máquina Virtual &gt; Network &gt; Attached to &gt; Host Interface&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_w3IQ9eKR2S4/SYjf0La1-qI/AAAAAAAAABU/1V-zBzdVE3g/s1600-h/VirtualBoxNetwork.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 238px;" src="http://4.bp.blogspot.com/_w3IQ9eKR2S4/SYjf0La1-qI/AAAAAAAAABU/1V-zBzdVE3g/s320/VirtualBoxNetwork.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5298731049112959650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Agora é preciso configurar a interface de rede virtual:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# /sbin/ip link set tap0 up&lt;br /&gt;# /sbin/ip addr add 192.168.20.1/32 dev tap0&lt;br /&gt;# /sbin/route add -host 192.168.20.201 dev tap0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Deverá conseguir "pingar" a máquina virtual:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# ping -c 1 192.168.20.201&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Se for preciso rodar ASPX no servidor, ai esta a solução, só configuar no nginx para fazer proxy reverso do IIS no IP 192.168.20.201, e já vai funcionar perfeitamente.&lt;br /&gt;&lt;br /&gt;A máquina virtual até aqui não tem acesso a internet. Para resolver isto é preciso fazer isto:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# /sbin/sysctl net.ipv4.ip_forward=1&lt;br /&gt;# /sbin/iptables -t nat -A POSTROUTING --out-interface eth0 -j MASQUERADE&lt;br /&gt;# /sbin/iptables -A FORWARD --in-interface tap0 -j ACCEPT&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;E também configurar os DNSs, primário e secundário, da máquina virtual, com os mesmos dados DNSs do CentOS, para ver os DNSs do CentOS:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# cat /etc/resolv.conf&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Agora deverá ter a internet funcionando no Windows.&lt;br /&gt;&lt;br /&gt;Podemos iniciar a máquina virtual pela linha de comando, só que ficamos sem acesso ao ambiente gráfico do VirtualBox. Para então ter acesso a máquina virtual convém configurar o VRDP no VirtualBox para acessar a máquina virtual remotamente:&lt;br /&gt;&lt;br /&gt;Settings da Máquina Virtual &gt; Remote Display &gt; Enable VRDP Server&lt;br /&gt;&lt;br /&gt;Settings da Máquina Virtual &gt; Remote Display &gt; Port = 3089&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_w3IQ9eKR2S4/SYjgBE9MwrI/AAAAAAAAABc/vj9rzLVGORA/s1600-h/VirtualBoxRemoteDisplay.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 238px;" src="http://3.bp.blogspot.com/_w3IQ9eKR2S4/SYjgBE9MwrI/AAAAAAAAABc/vj9rzLVGORA/s320/VirtualBoxRemoteDisplay.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5298731270716310194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;É importante mudar o número da porta, por que a porta do VRDP é a mesma do Terminal Services, da para trocar o número da porta do Terminal Services no regedit, mas é mais simples ai no VRDP, e assim já se evita um conflito.&lt;br /&gt;&lt;br /&gt;Só que assim o VirtualBox vai deixar entrar qualquer um pelo VRDP sem autenticação, então convém bloquear a porta do VRDP para que ninguem fora do CentOS consiga controlar a máquina virtual:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# /sbin/iptables -A INPUT -p tcp -i eth0 --dport 3089 -j REJECT --reject-with tcp-reset&lt;br /&gt;&lt;br /&gt;# /sbin/iptables -A INPUT -p tcp -i eth1 --dport 3089 -j REJECT --reject-with tcp-reset&lt;br /&gt;&lt;br /&gt;# /sbin/iptables -A INPUT -p udp -i eth0 --dport 3089 -j REJECT&lt;br /&gt;&lt;br /&gt;# /sbin/iptables -A INPUT -p udp -i eth1 --dport 3089 -j REJECT&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Assim a porta do VRDP fica protegida para que ninguem que venha das interfaces de rede externas consiga conectar.&lt;br /&gt;&lt;br /&gt;Para conectar via VRDP é só usar o tsclient:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# tsclient&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;No tsclient em computer colocar: &lt;br /&gt;&lt;br /&gt;localhost:3089&lt;br /&gt;&lt;br /&gt;E em protocol:&lt;br /&gt;&lt;br /&gt;RDPv5&lt;br /&gt;&lt;br /&gt;Clicar em "Connect", e pronto! Já conseguimos controlar a máquina virtual remotamente quando estivermos executando ela em background, isto será muito útil.&lt;br /&gt;&lt;br /&gt;No Windows 2003 Server podemos ter o Terminal Services, e para acessar o terminal services através da internet ou rede temos que fazer uns ajustes, pois a porta do Terminal Services é a mesma do VRDP, então temos que mudar uma ou outra porta, como já mudamos a porta padrão do VRDP para 3089, então o Terminal Services vai funcionar bem na porta 3389.&lt;br /&gt;&lt;br /&gt;Então para por o Terminal Services a funcionar é preciso ativar, no Windows Server:&lt;br /&gt;&lt;br /&gt;Control Panel &gt; System &gt; Remote &gt; Enable Remote Desktop on this computer&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_w3IQ9eKR2S4/SYjgJZIwX-I/AAAAAAAAABk/NYZDZ_j20Qw/s1600-h/Win2003SrvTSActivation.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 280px; height: 320px;" src="http://4.bp.blogspot.com/_w3IQ9eKR2S4/SYjgJZIwX-I/AAAAAAAAABk/NYZDZ_j20Qw/s320/Win2003SrvTSActivation.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5298731413572444130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E agora é fazer NAT para a porta do Terminal Services:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# /sbin/iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 3389 -j DNAT --to 192.168.20.201:3389&lt;br /&gt;&lt;br /&gt;# /sbin/iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 3389 -j DNAT --to 192.168.20.201:3389&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;E assim fica o Terminal Services disponível, e o mesmo pode ser feito para outros serviços do Windows que precisam estar disponíveis externamente, como MSSQLServer.&lt;br /&gt;&lt;br /&gt;Há outros exemplos desta configuração usando bridges, mas acho que assim fica muito mais simples.&lt;br /&gt;&lt;br /&gt;Para iniciar a máquina virtual pela linha de comando é assim:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;/usr/bin/VBoxVRDP -startvm NOME_DA_MAQUINA_VIRTUAL_NO_VIRTUALBOX&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para quando o servidor iniciar, iniciar também a máquina virtual e carregar toda configuração, coloquei os seguintes comandos no /etc/rc.local:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;/usr/bin/VBoxTunctl -u root&lt;br /&gt;/sbin/sysctl net.ipv4.ip_forward=1&lt;br /&gt;/sbin/ip link set tap0 up&lt;br /&gt;/sbin/ip addr add 192.168.20.1/32 dev tap0&lt;br /&gt;/sbin/route add -host 192.168.20.201 dev tap0&lt;br /&gt;/sbin/sysctl net.ipv4.ip_forward=1&lt;br /&gt;/sbin/iptables -t nat -A POSTROUTING --out-interface eth0 -j MASQUERADE&lt;br /&gt;/sbin/iptables -A FORWARD --in-interface tap0 -j ACCEPT&lt;br /&gt;/sbin/iptables -A INPUT -p tcp -i eth0 --dport 3089 -j REJECT --reject-with tcp-reset&lt;br /&gt;/sbin/iptables -A INPUT -p tcp -i eth1 --dport 3089 -j REJECT --reject-with tcp-reset&lt;br /&gt;/sbin/iptables -A INPUT -p udp -i eth0 --dport 3089 -j REJECT&lt;br /&gt;/sbin/iptables -A INPUT -p udp -i eth1 --dport 3089 -j REJECT&lt;br /&gt;/sbin/iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 3389 -j DNAT --to 192.168.20.201:3389&lt;br /&gt;/usr/bin/nohup /usr/bin/VBoxVRDP -startvm winserver &gt; /dev/null &amp;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tem muita gente que acha deselegante usar o rc.local, mas eu não acho deselegante, muito pelo contrário, afinal pra que que ele serve? :P&lt;br /&gt;&lt;br /&gt;No meu caso, em um AMD Opteron Quad-Core com 4GB de RAM, o Windows 2003 Server em máquina virtual de 512MB com o VirtualBox demora 6 segundos para estar completamente inicializado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-2059502807759003347?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/2059502807759003347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2009/02/virtualizacao-para-servidores-com.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/2059502807759003347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/2059502807759003347'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2009/02/virtualizacao-para-servidores-com.html' title='Virtualização para servidores com VirtualBox'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_w3IQ9eKR2S4/SYjjQzHK5XI/AAAAAAAAABs/oQ9PKRUIjZc/s72-c/Win2003SrvTcpIP.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-6316844076790670502</id><published>2008-12-17T03:31:00.000-08:00</published><updated>2008-12-17T03:44:55.448-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Chamando Web Services sobre HTTPS</title><content type='html'>Utilizar web service sobre HTTPS é da mesma forma que um web service HTTP.&lt;br /&gt;&lt;br /&gt;Adicionar a referência web ao projeto, com a url HTTPS.&lt;br /&gt;&lt;br /&gt;O uso do web service a nível de código é a mesma coisa.&lt;br /&gt;&lt;br /&gt;Só que ao tentar chamar o web service poderá acontecer de obter esta mensagem erro:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;font-style:italic;"&gt;The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Colocando este código antes da chamada ao web sersvice provavelmente irá resolver o problema:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate&lt;br /&gt;{&lt;br /&gt;    return true;&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Basicamente é por que o .Net esta rejeitando o certificado por não ser um certificado válido, com o código acima, mesmo não sendo um certificado válido ele irá aceitar o certificado, e conseguirá comunicar com o web service.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-6316844076790670502?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/6316844076790670502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/12/chamando-web-services-sobre-https.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6316844076790670502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6316844076790670502'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/12/chamando-web-services-sobre-https.html' title='Chamando Web Services sobre HTTPS'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-4460416114964962941</id><published>2008-11-27T02:58:00.000-08:00</published><updated>2010-07-29T10:01:17.593-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='BSD'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Solaris'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Script Python para consumir Web Services em .Net</title><content type='html'>Tive um desafio a poucos dias. Que foi consumir Web Services feitos em .Net a partir de um servidor Solaris 10 via processo.&lt;br /&gt;&lt;br /&gt;De todas as soluções possíveis que estive a ver, a melhor foi usar Python.&lt;br /&gt;&lt;br /&gt;Encontrei este exemplo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://users.skynet.be/pascalbotte/rcx-ws-doc/postxmlpython.htm"&gt;http://users.skynet.be/pascalbotte/rcx-ws-doc/postxmlpython.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Assim fiz o &lt;span style="font-weight: bold;"&gt;WebServiceGenericClientNet.py&lt;/span&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;# by eduveks&lt;br /&gt;&lt;br /&gt;import sys, httplib, array&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;    host = ""&lt;br /&gt;    url = ""&lt;br /&gt;    namespace = ""&lt;br /&gt;    header = ""&lt;br /&gt;    method = ""&lt;br /&gt;    params = {}&lt;br /&gt;&lt;br /&gt;    for arg in sys.argv[1:]:&lt;br /&gt;        if host == "" and arg.find("host=") == 0:&lt;br /&gt;            host = arg[len("host="):]&lt;br /&gt;        elif url  == "" and arg.find("url=") == 0:&lt;br /&gt;            url  = arg[len("url="):]&lt;br /&gt;        elif namespace == "" and arg.find("namespace=") == 0:&lt;br /&gt;            namespace = arg[len("namespace="):]&lt;br /&gt;        elif header == "" and arg.find("header=") == 0:&lt;br /&gt;            header = arg[len("header="):]&lt;br /&gt;        elif method == "" and arg.find("method=") == 0:&lt;br /&gt;            method = arg[len("method="):]&lt;br /&gt;        elif arg.find("param_") == 0:&lt;br /&gt;            params[arg[len("param_"):arg.find("=")]] = arg[arg.find("=") + 1:]&lt;br /&gt;&lt;br /&gt;    SOAP_Request = ""&lt;br /&gt;    SOAP_Request += "&amp;lt;soap:Envelope"&lt;br /&gt;    SOAP_Request += " soap:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\""&lt;br /&gt;    SOAP_Request += " xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\""&lt;br /&gt;    SOAP_Request += " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""&lt;br /&gt;    SOAP_Request += " xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\"&amp;gt;"&lt;/code&gt;&lt;div&gt;&lt;code class="prettyprint"&gt;&lt;div&gt;&lt;div&gt;    if header != "":&lt;/div&gt;&lt;div&gt;        SOAP_Request += "&amp;lt;soap:Header&amp;gt;"&lt;/div&gt;&lt;div&gt;        SOAP_Request += header&lt;/div&gt;&lt;div&gt;        SOAP_Request += "&amp;lt;/soap:Header&amp;gt;"&lt;/div&gt;&lt;/div&gt;    SOAP_Request += "&amp;lt;soap:Body&amp;gt;"&lt;br /&gt;    SOAP_Request += "&amp;lt;"+ method +" xmlns=\""+ namespace +"\"&amp;gt;"&lt;br /&gt;    for param in params.keys():&lt;br /&gt;        SOAP_Request += "&amp;lt;"+ param +"&amp;gt;"+ params[param] +"&amp;lt;/"+ param +"&amp;gt;"&lt;br /&gt;    SOAP_Request += "&amp;lt;/"+ method +"&amp;gt;"&lt;br /&gt;    SOAP_Request += "&amp;lt;/soap:Body&amp;gt;"&lt;br /&gt;    SOAP_Request += "&amp;lt;/soap:Envelope&amp;gt;"&lt;br /&gt;&lt;br /&gt;    http = httplib.HTTP(host)&lt;br /&gt;    http.putrequest("POST", url)&lt;br /&gt;    http.putheader("Host", host)&lt;br /&gt;    http.putheader("User-Agent", "Python")&lt;br /&gt;    http.putheader("Content-type", "text/xml; charset=\"UTF-8\"")&lt;br /&gt;    http.putheader("Content-length", "%d" % len(SOAP_Request))&lt;br /&gt;    http.putheader("SOAPAction", "\""+ namespace + method +"\"")&lt;br /&gt;    http.endheaders()&lt;br /&gt;    http.send(SOAP_Request)&lt;br /&gt;&lt;br /&gt;    http_response_statuscode, http_response_statusmessage, http_response_header = http.getreply()&lt;br /&gt;    SOAP_Response = http.getfile().read()&lt;br /&gt;    if http_response_statuscode == 200 and http_response_statusmessage == "OK":&lt;br /&gt;        print SOAP_Response[SOAP_Response.find("&amp;lt;"+ method +"Result&amp;gt;") + len("&amp;lt;"+ method +"Result&amp;gt;"):SOAP_Response.find("&amp;lt;/"+ method +"Result&amp;gt;")]&lt;br /&gt;    else:&lt;br /&gt;        print "### ERROR ###############"&lt;br /&gt;        if SOAP_Response.find("&amp;lt;faultstring&amp;gt;") &amp;gt; -1:&lt;br /&gt;            print SOAP_Response[SOAP_Response.find("&amp;lt;faultstring&amp;gt;")  + len("&amp;lt;faultstring&amp;gt;"):SOAP_Response.find("&amp;lt;/faultstring&amp;gt;")]&lt;br /&gt;        print "Response: ", http_response_statuscode, http_response_statusmessage&lt;br /&gt;        print http_response_header&lt;br /&gt;        print SOAP_Response&lt;br /&gt;&lt;br /&gt;except:&lt;br /&gt;    print "### ERROR ###############"&lt;br /&gt;    for err in sys.exc_info():&lt;br /&gt;        print err&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para executar o script basta dar permissões de execução e executar:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;chmod +x WebServiceGenericClientNet.py&lt;br /&gt;./WebServiceGenericClientNet.py host=localhost url=/HelloWorld.asmx namespace=http://tempuri.org/ method=HelloWorld param_strSay=HelloWorld&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O output é:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;HelloWorld&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Os parâmetros do WebServiceGenericClientNet.py são:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;host:&lt;/span&gt; Endereço do servidor&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;url:&lt;/span&gt; Endereço do web service&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;namespace:&lt;/span&gt; Namespace do web service, que pode ser encontrado vendo o WSDL, http://localhost/HelloWorld.asmx?WSDL&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;method:&lt;/span&gt; Método do web service a ser chamado&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;param_*NOME_DO_PARAMETRO*:&lt;/span&gt; Caso o método precise de parâmetros, podem ser definidos assim, atenção a ordem.&lt;br /&gt;&lt;br /&gt;Além de usar este script no Solaris, também acabei por usar este script para chamar web services apartir do .Net/C#, pois são web services que serão atualizados constantemente, com novos métodos e talz, e em vez de ficar atualizando o WSDL, basta chamar diretamente com o script a queima-roupa, e a configuração da chamada dos web services pode ser feita a partir de configurações em base de dados. Para fazer isto no .Net/C# foi só lançar um processo assim:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;System.Diagnostics.Process process = new System.Diagnostics.Process();&lt;br /&gt;process.StartInfo.UseShellExecute = false;&lt;br /&gt;process.StartInfo.RedirectStandardOutput = true;&lt;br /&gt;process.StartInfo.RedirectStandardError = true;&lt;br /&gt;process.StartInfo.CreateNoWindow = true;&lt;br /&gt;process.StartInfo.FileName = "C:\Python26\python.exe";&lt;br /&gt;process.StartInfo.Arguments = "WebServiceGenericClientNet.py host=localhost url=/HelloWorld.asmx namespace=http://tempuri.org/ method=HelloWorld param_strSay=HelloWorld";&lt;br /&gt;process.StartInfo.WorkingDirectory = "C:\Python26\";&lt;br /&gt;process.Start();&lt;br /&gt;string output = process.StandardOutput.ReadToEnd();&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: -webkit-monospace; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: -webkit-monospace; font-size: 13px;"&gt;O script suporta a configuração do header, passando o argumento header=... para o script.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: -webkit-monospace; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: -webkit-monospace; font-size: 13px;"&gt;Para explorar e ver fácilmente os SOAPs enviados e recebidos na chamada de um web service, existe o WebServiceStudio:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: -webkit-monospace; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: -webkit-monospace; font-size: 13px;"&gt;&lt;a href="http://www.codeplex.com/WebserviceStudio"&gt;http://www.codeplex.com/WebserviceStudio&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-4460416114964962941?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/4460416114964962941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/11/script-python-para-consumir-webservices.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/4460416114964962941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/4460416114964962941'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/11/script-python-para-consumir-webservices.html' title='Script Python para consumir Web Services em .Net'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-987918422050221284</id><published>2008-09-15T15:07:00.000-07:00</published><updated>2008-11-27T03:32:35.409-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jogos'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Nvidia vs Ubuntu</title><content type='html'>O driver da Nvidia que vem por padrão no Ubuntu tem alguns bugs, como este:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nvnews.net/vbulletin/showthread.php?t=106790"&gt;http://www.nvnews.net/vbulletin/showthread.php?t=106790&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Aqui estão os screenshots do bug:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://home.arcor.de/cziepke/ut2004/"&gt;http://home.arcor.de/cziepke/ut2004/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_w3IQ9eKR2S4/SM7iOh6vktI/AAAAAAAAAAc/dZs4BFFfI90/s1600-h/Shot00011.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_w3IQ9eKR2S4/SM7iOh6vktI/AAAAAAAAAAc/dZs4BFFfI90/s320/Shot00011.jpg" alt="" id="BLOGGER_PHOTO_ID_5246379355184009938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_w3IQ9eKR2S4/SM7iU704TgI/AAAAAAAAAAk/KlUAzZvj14E/s1600-h/Shot00015.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_w3IQ9eKR2S4/SM7iU704TgI/AAAAAAAAAAk/KlUAzZvj14E/s320/Shot00015.jpg" alt="" id="BLOGGER_PHOTO_ID_5246379465217953282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Para instalar o driver que resolve o problema, o NVIDIA-Linux-x86-177.13-pkg1.run, não é tão simples assim, eu pensava que era...&lt;br /&gt;&lt;br /&gt;Baixei aqui o driver:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nvnews.net/vbulletin/showthread.php?t=118602"&gt;http://www.nvnews.net/vbulletin/showthread.php?t=118602&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Consegui instalar, mas o Xorg ficou todo estragado, fiquei com a resoluão de 800x600 e o driver vesa, então procurei e encontrei a solução num forum francês:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forum.ubuntu-fr.org/viewtopic.php?id=249234"&gt;http://forum.ubuntu-fr.org/viewtopic.php?id=249234&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O que fiz então foi o seguinte:&lt;br /&gt;&lt;br /&gt;Fiz logout, e mudei para o terminal 1 (ctrl + alt + F1), fiz o login, e matei o GDM:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;# sudo killall gdm&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Feito isto o Xorg deverá esta morto, verifique no terminal 7  (ctrl + alt + F7), se esta tudo preto.&lt;br /&gt;&lt;br /&gt;Agora remova tudo que esta instalado da nvidia:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ sudo apt-get remove --purge nvidia*&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Instalar os headers do kernel e o xorg-dev:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ sudo apt-get install build-essential linux-headers-`uname -r` xserver-xorg-dev&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Faça um backup da configuração do Xorg:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.good.backup&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Agora é só instalar o driver, diga Yes para tudo:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ sudo sh NVIDIA-Linux-x86-177.13-pkg1.run&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Se durante a instalação der erro, dizendo que não consegue criar alguns arquivos, veja o caminho, provavelmente como aconteceu comigo será preciso criar a pasta:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;$ sudo mkdir /usr/lib/nvidia&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Depois é só voltar a executar a instalação e diga Yes para tudo mais uma vez:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;$ sudo sh NVIDIA-Linux-x86-177.13-pkg1.run&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Reiniciar o computador, e pronto, os gráficos deverão estar muito melhores, e o UT2004 sem bugs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Guarde o arquivo de instalação, pois sempre que for instalado um novo kernel será preciso reinstalar o driver.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-987918422050221284?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/987918422050221284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/09/nvidia-vs-ubuntu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/987918422050221284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/987918422050221284'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/09/nvidia-vs-ubuntu.html' title='Nvidia vs Ubuntu'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_w3IQ9eKR2S4/SM7iOh6vktI/AAAAAAAAAAc/dZs4BFFfI90/s72-c/Shot00011.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-7462000250205022500</id><published>2008-09-05T05:35:00.000-07:00</published><updated>2008-09-05T07:26:18.661-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jogos'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Unreal Tournament 2004 - Linux Dedicated Server</title><content type='html'>Nossa como é bom voltar a jogar UT2004 :P&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Downloads&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Servidor:&lt;br /&gt;&lt;code class="prettyprint"&gt;$ wget http://downloads.unrealadmin.org/UT2004/Server/DedicatedServer3323.zip&lt;/code&gt;&lt;br /&gt;BonusPack:&lt;br /&gt;&lt;code class="prettyprint"&gt;$ wget http://downloads.unrealadmin.org/UT2004/Server/dedicatedserver3339-bonuspack.zip&lt;/code&gt;&lt;br /&gt;Anticheater:&lt;br /&gt;&lt;code class="prettyprint"&gt;$ wget http://downloads.unrealadmin.org/UT2004/AntiCheat/UTSecure2K4-111.zip&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Quem for jogar, convêm ter o MegaPack instalado, para evitar que fique fazendo download:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ut2004.com/ut2004/downloads.html"&gt;MegaPack - 12/13/05 - 205 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Instalação&lt;/b&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ unzip DedicatedServer3323.zip&lt;br /&gt;$ mv UT2004-Dedicated-3323 UT2004srv&lt;br /&gt;$ unzip -o dedicatedserver3339-bonuspack.zip -d UT2004srv&lt;br /&gt;$ unzip -o UTSecure2K4-111.zip -d UT2004srv&lt;br /&gt;$ chmod +x UT2004srv/System/ucc*&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Configuração&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Não apague nenhuma linha do arquivo, apenas altere as linhas indicadas abaixo.&lt;br /&gt;&lt;br /&gt;Editar o UT2004.ini:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;$ vim UT2004srv/System/UT2004.ini&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Habilitar a administração web:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;[UWeb.WebServer]&lt;br /&gt;bEnabled=True&lt;br /&gt;ListenPort=7775&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Alterar o nome do servidor:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;[Engine.GameReplicationInfo]&lt;br /&gt;ServerName=Nome Do Teu Servidor&lt;br /&gt;ShortName=Nome Servidor&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Liberar para quem não tem o jogo original poder jogar, e desabilitar a verificação de keys:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;[IpDrv.MasterServerUplink]&lt;br /&gt;DoUplink=False&lt;br /&gt;UplinkToGamespy=False&lt;br /&gt;SendStats=False&lt;br /&gt;ServerBehindNAT=False&lt;br /&gt;DoLANBroadcast=False&lt;br /&gt;bIgnoreUTANBans=True&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Executar&lt;/b&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;$ cd UT2004srv/System&lt;br /&gt;$ sudo ./ucc-bin server DM-Gael?game=XGame.xDeathMatch?mutator=XGame.MutQuadJump?AdminName=admin?AdminPassword=XXXXX?GamePassword=XXXXX ini=UT2004.ini log=UT2004.log -nohomedir&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Os &lt;b&gt;XXXXX&lt;/b&gt; são as senhas, a senha para entrar no servidor é a &lt;b&gt;?GamePassword=XXXXX&lt;/b&gt;, substitua os XXXXX por uma senha mais intuitiva do seu entender. Os parametros ?Admin* são os dados para entrar na administração web pelo endereço http://servidor:7775.&lt;br /&gt;&lt;br /&gt;Se obtiver este erro:&lt;br /&gt;&lt;font color="red"&gt;&lt;i&gt;./ucc-bin: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory&lt;/i&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para resolver este erro é preciso fazer um link simbólico para a versão 5.* da libstdc++, que fica na pasta /usr/lib/libstdc++*, no meu caso fiz assim:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;$ sudo ln -s /usr/lib/libstdc++.so.5.0.7 /usr/lib/libstdc++.so.5&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Agora é só executar de novo!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Jogar&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para jogar no servidor, é só ir na lista de servidores online dentro do jogo e clicar com o botão direito e no menu que aparece ir em "Open Ip", e colocar o endereço do servidor!&lt;br /&gt;&lt;br /&gt;Quem não tem o jogo original pode jogar no teu servidor usando este crack:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://m0008.gamecopyworld.com/games/pc_unreal_tournament_2004.shtml"&gt;Unreal Tournament 2004 v3369 PRIVATE WINDOWS SERVER PATCH&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Detalhes da Configuração&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Na linha de execução tem os parâmetros:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DM-Gael?game=XGame.xDeathMatch?mutator=XGame.MutQuadJump&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;DM-Geal se refere ao Mapa, você pode colocar o nome de outro mapa, basta ver os mapas disponíveis em UT2004srv/Maps/*.&lt;br /&gt;&lt;br /&gt;O game= XGame.xDeathMatch é o tipo de jogo, todos os tipos de jogos:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Assault:&lt;/b&gt; AS-MotherShip?game=UT2k4Assault.ASGameInfo&lt;br /&gt;&lt;b&gt;CTF:&lt;/b&gt; CTF-FaceClassic?game=XGame.xCTFGame&lt;br /&gt;&lt;b&gt;Bombing Run:&lt;/b&gt; BR-Serenity?game=XGame.xBombingRun&lt;br /&gt;&lt;b&gt;DoubleDomination:&lt;/b&gt; DOM-SunTemple?game=xGame.xDoubleDom&lt;br /&gt;&lt;b&gt;DeahtMatch:&lt;/b&gt; DM-Rankin?game=XGame.xDeathMatch&lt;br /&gt;&lt;b&gt;Invasion:&lt;/b&gt; DM-Antalus?game=SkaarjPack.Invasion&lt;br /&gt;&lt;b&gt;LastManStanding:&lt;/b&gt; DM-Morpheus3?game=BonusPack.xLastManStandingGame&lt;br /&gt;&lt;b&gt;Mutant:&lt;/b&gt; DM-Deck17?game=BonusPack.xMutantGame&lt;br /&gt;&lt;b&gt;Onslaught:&lt;/b&gt; ONS-Torlan?game=Onslaught.ONSOnslaughtGame&lt;br /&gt;&lt;b&gt;TeamDeathMatch:&lt;/b&gt; DM-Rankin?game=XGame.xTeamGame&lt;br /&gt;&lt;br /&gt;O mutator=XGame.MutQuadJump é o mutator, pode remover isto se não quiser nenhum mutator, todos os tipos de mutators:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Arena:&lt;/b&gt; XWeapons.MutArena&lt;br /&gt;&lt;b&gt;Beserk:&lt;/b&gt; UnrealGame.MutBerserk&lt;br /&gt;&lt;b&gt;Big Head:&lt;/b&gt; UnrealGame.MutBigHead&lt;br /&gt;&lt;b&gt;Delayed Spawn:&lt;/b&gt; UnrealGame.MutDelayedSpawn&lt;br /&gt;&lt;b&gt;Float-Away Corpses:&lt;/b&gt; XGame.MutHeliumCorpses&lt;br /&gt;&lt;b&gt;InstaGib:&lt;/b&gt; XGame.MutInstaGib&lt;br /&gt;&lt;b&gt;Zoom InstaGib:&lt;/b&gt; XGame.MutZoomInstaGib&lt;br /&gt;&lt;b&gt;LowGravity:&lt;/b&gt; UnrealGame.MutLowGrav&lt;br /&gt;&lt;b&gt;No Adrenaline:&lt;/b&gt; XGame.MutNoAdrenaline&lt;br /&gt;&lt;b&gt;No Super Weapons:&lt;/b&gt; XWeapons.MutNoSuperWeapon&lt;br /&gt;&lt;b&gt;Quad Jump:&lt;/b&gt; XGame.MutQuadJump&lt;br /&gt;&lt;b&gt;AutoHealing:&lt;/b&gt; XGame.MutRegen&lt;br /&gt;&lt;b&gt;Slow Motion Deaths:&lt;/b&gt; XGame.MutSlomoDeath&lt;br /&gt;&lt;b&gt;Species Specific Stats:&lt;/b&gt; XGame.MutSpeciesStats&lt;br /&gt;&lt;b&gt;UDamage Reward:&lt;/b&gt; XGame.MutUDamageReward&lt;br /&gt;&lt;b&gt;Vampire :&lt;/b&gt;XGame.MutVampire&lt;br /&gt;&lt;b&gt;UTV2004S (UTV2004 in SeeAll mode):&lt;/b&gt; UTV2004s.utvMutator&lt;br /&gt;&lt;b&gt;UT2k3 Style Weapon Throwing/Boosting:&lt;/b&gt; XGame.MutFastWeapSwitch&lt;br /&gt;&lt;b&gt;UTClassic:&lt;/b&gt; UTClassic.MutUTClassic&lt;br /&gt;&lt;b&gt;Lightning Gun 2 Sniper Rifle:&lt;/b&gt; UTClassic.MutUseSniper&lt;br /&gt;&lt;b&gt;Sniper Rifle 2 Lightning Gun:&lt;/b&gt; UTClassic.MutUseLightning&lt;br /&gt;&lt;b&gt;Camouflage Combo (RRRR):&lt;/b&gt; Bonuspack.MutCrateCombo&lt;br /&gt;&lt;b&gt;Pint-sized combo (LLLL):&lt;/b&gt; Bonuspack.MutPintSizeCombo&lt;br /&gt;&lt;b&gt;BigWheels:&lt;/b&gt; Onslaught.MutBigWheels&lt;br /&gt;&lt;b&gt;Light Weight Vehicles:&lt;/b&gt; Onslaught.MutLightweightVehicles&lt;br /&gt;&lt;b&gt;Onslaught Weapons:&lt;/b&gt; Onslaught.MutOnslaughtWeapons&lt;br /&gt;&lt;b&gt;Jumping Vehicles:&lt;/b&gt; Onslaught.MutWheeledVehicleStunts&lt;br /&gt;&lt;b&gt;Vehicle Arena:&lt;/b&gt; OnslaughtFull.MutVehicleArena&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Referência&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dragonbe.be/index.php?module=unreal_tournament2004"&gt;DragonBe - Unreal Tournament 2004 Dedicated Server&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gentoo-wiki.com/HOWTO_Setup_A_UT2004_Dedicated_Server"&gt;Gentoo - UT2004 Dedicated Server Installation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forums.epicgames.com/showthread.php?t=477085"&gt;LINUX; UT2004-bin: error while loading shared libraries: libstdc++.so.5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Compre o jogo orignal!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Este jogo esta barato e vale a pena ter o original.&lt;br /&gt;&lt;br /&gt;É um excelente jogo, e é dos jogos que mais se preocupa em ter suporte nativo ao Linux, por isso também, não deixe de colaborar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-7462000250205022500?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/7462000250205022500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/09/unreal-tournament-2004-linux-dedicated.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/7462000250205022500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/7462000250205022500'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/09/unreal-tournament-2004-linux-dedicated.html' title='Unreal Tournament 2004 - Linux Dedicated Server'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-6358306491228726314</id><published>2008-09-01T04:02:00.000-07:00</published><updated>2008-09-05T02:48:38.556-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Nginx'/><title type='text'>Nginx</title><content type='html'>Conheci o Nginx no &lt;a href="http://www.guj.com.br/posts/list/94193.java"&gt;forum do GUJ.com.br&lt;/a&gt;, depois com os resultados que o &lt;a href="http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/"&gt;Fabio Kung postou no blog da Caelum&lt;/a&gt;, fiquei convencido que o Nginx seria a melhor solução para os meus problemas.&lt;br /&gt;&lt;br /&gt;E depois que conheci o Nginx já não quero mais nada, estou extremamente satisfeito, excelente robustez.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.vivaolinux.com.br/artigo/Nginx-Poderoso-servidor-WEB-para-Linux/"&gt;Para instalar o Nginx fiz um artigo no VivaOLinux.com.br que ensina como fazer a instalação e os links do site e da documentação.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Consegui fazer uma configuração simples para configurar multiplos domínios virtuais, segue a configuração:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;worker_processes  5;&lt;br /&gt;error_log  logs/error.log;&lt;br /&gt;events {&lt;br /&gt;        worker_connections  1024;&lt;br /&gt;}&lt;br /&gt;http {&lt;br /&gt;        include                 mime.types;&lt;br /&gt;        default_type            application/octet-stream;&lt;br /&gt;        sendfile                on;&lt;br /&gt;        tcp_nopush              on;&lt;br /&gt;        tcp_nodelay             on;&lt;br /&gt;        keepalive_timeout       65;&lt;br /&gt;        gzip                    on;&lt;br /&gt;        gzip_min_length         1100;&lt;br /&gt;        gzip_buffers            16 8k;&lt;br /&gt;        gzip_types              text/plain text/html text/xml text/xhtml text/css text/js application/x-javascript application/json;&lt;br /&gt;        error_page   500 502 503 504  /50x.html;&lt;br /&gt;        server {&lt;br /&gt;                listen          80;&lt;br /&gt;                server_name     _;&lt;br /&gt;                root            /home/websites/$host;&lt;br /&gt;                location / {&lt;br /&gt;                        index  index.html index.htm index.jsp;&lt;br /&gt;                }&lt;br /&gt;                location ~ \.jsp$ {&lt;br /&gt;                        proxy_pass http://localhost:8080;&lt;br /&gt;                        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;                        proxy_set_header Host $http_host;&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Repare nesta linha:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;root            /home/websites/$host;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ai em /home/websites/* eu tenho os atalhos para as pastas reais dos domínios.&lt;br /&gt;&lt;br /&gt;Então por exemplo para acrescentar um novo domínio dominio.com:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;ln -s /home/dominio.com /home/websites/dominio.com&lt;br /&gt;ln -s /home/dominio.com /home/websites/www.dominio.com&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Assim para configurar um novo domínio no Nginx é só adicionar um novo atalho no /home/websites neste caso.&lt;br /&gt;&lt;br /&gt;Ativar compressão gzip:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;gzip                    on;&lt;br /&gt;gzip_min_length         1100;&lt;br /&gt;gzip_buffers            16 8k;&lt;br /&gt;gzip_types              text/plain text/html text/xml text/xhtml text/css text/js application/x-javascript application/json;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para o Nginx encaminhar os JSPs para o Jetty:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;location ~ \.jsp$&lt;br /&gt;        proxy_pass http://localhost:8080;&lt;br /&gt;        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;        proxy_set_header Host $http_host;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-6358306491228726314?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/6358306491228726314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/09/nginx.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6358306491228726314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6358306491228726314'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/09/nginx.html' title='Nginx'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-6479061616569112251</id><published>2008-08-21T04:56:00.000-07:00</published><updated>2008-09-11T06:25:14.006-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Movie Clip Fit</title><content type='html'>Um problema básico hoje em dia para fazer resize em flash é posicionar os movieclips corretamente, existe este projeto que facilita a vida para fazer resize do flash dentro do browser:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://swffit.millermedeiros.com/"&gt;http://swffit.millermedeiros.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Baseado neste projeto fiz este objeto que ajuda a ajusta as posições dos movieclips dentro do flash de acordo com o resize:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint javascript"&gt;&lt;br /&gt;var fit = {&lt;br /&gt; baseStageWidth: Stage.width,&lt;br /&gt; baseStageHeight: Stage.height,&lt;br /&gt; oldStageWidth: Stage.width,&lt;br /&gt; oldStageHeight: Stage.height,&lt;br /&gt; xLeft: 0,&lt;br /&gt; xRight: 1,&lt;br /&gt; yTop: 0,&lt;br /&gt; yBottom: 1,&lt;br /&gt; xMovies: new Array(),&lt;br /&gt; xs: new Array(),&lt;br /&gt; xAligns: new Array(),&lt;br /&gt; x: function (mv:MovieClip, align:Number, x:Number) {&lt;br /&gt;  if (align == null) {&lt;br /&gt;   align = this.xLeft;&lt;br /&gt;  }&lt;br /&gt;  this.xMovies.push(mv);&lt;br /&gt;  if (x == null) {&lt;br /&gt;   if (align == this.xLeft) {&lt;br /&gt;      x = mv._x;&lt;br /&gt;   } else if (align == this.xRight) {&lt;br /&gt;    x = mv._x + mv._width;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  this.xs.push(x);&lt;br /&gt;  this.xAligns.push(align);&lt;br /&gt; },&lt;br /&gt; yMovies: new Array(),&lt;br /&gt; ys: new Array(),&lt;br /&gt; yAligns: new Array(),&lt;br /&gt; y: function (mv:MovieClip, align:Number, y:Number) {&lt;br /&gt;  if (align == null) {&lt;br /&gt;   align = this.yTop;&lt;br /&gt;  }&lt;br /&gt;  this.yMovies.push(mv);&lt;br /&gt;  if (y == null) {&lt;br /&gt;   if (align == this.yTop) {&lt;br /&gt;      y = mv._y;&lt;br /&gt;   } else if (align == this.yBottom) {&lt;br /&gt;    y = mv._y + mv._height;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  this.ys.push(y);&lt;br /&gt;  this.yAligns.push(align);&lt;br /&gt; },&lt;br /&gt; widthMovies: new Array(),&lt;br /&gt; widths: new Array(),&lt;br /&gt; width: function (mv:MovieClip) {&lt;br /&gt;  this.widthMovies.push(mv);&lt;br /&gt;  this.widths.push(mv._width);&lt;br /&gt; },&lt;br /&gt; heightMovies: new Array(),&lt;br /&gt; heights: new Array(),&lt;br /&gt; height: function (mv:MovieClip) {&lt;br /&gt;  this.heightMovies.push(mv);&lt;br /&gt;  this.heights.push(mv._height);&lt;br /&gt; },&lt;br /&gt; proportionalMovies: new Array(),&lt;br /&gt; proportionalWidths: new Array(),&lt;br /&gt; proportionalHeights: new Array(),&lt;br /&gt; proportional: function (mv:MovieClip) {&lt;br /&gt;  this.proportionalMovies.push(mv);&lt;br /&gt;  this.proportionalWidths.push(mv._width);&lt;br /&gt;  this.proportionalHeights.push(mv._height);&lt;br /&gt; },&lt;br /&gt; fix: function () {&lt;br /&gt;  for (var k:Number = 0; k &lt; this.widthMovies.length; k++) {&lt;br /&gt;   this.widths[k] = (Stage.width * this.widths[k]) / this.oldStageWidth;&lt;br /&gt;   this.xMovies[k]._width = this.widths[k];&lt;br /&gt;  }&lt;br /&gt;  for (var k:Number = 0; k &lt; this.heightMovies.length; k++) {&lt;br /&gt;   this.heights[k] = (Stage.height * this.heights[k]) / this.oldStageHeight;&lt;br /&gt;   this.heightMovies[k]._height = this.heights[k];&lt;br /&gt;  }&lt;br /&gt;  for (var k:Number = 0; k &lt; this.proportionalMovies.length; k++) {&lt;br /&gt;   var ratioW = Stage.width / this.proportionalWidths[k];&lt;br /&gt;   var ratioH = Stage.height / this.proportionalHeights[k];&lt;br /&gt;   if (ratioW &lt; ratioH ) {&lt;br /&gt;    this.proportionalWidths[k] = this.proportionalWidths[k] * ratioW;&lt;br /&gt;    this.proportionalHeights[k] = this.proportionalHeights[k] * ratioW;&lt;br /&gt;   } else {&lt;br /&gt;    this.proportionalWidths[k] = this.proportionalWidths[k] * ratioH;&lt;br /&gt;    this.proportionalHeights[k] = this.proportionalHeights[k] * ratioH;&lt;br /&gt;   }&lt;br /&gt;   this.proportionalMovies[k]._width = this.proportionalWidths[k];&lt;br /&gt;   this.proportionalMovies[k]._height = this.proportionalHeights[k];&lt;br /&gt;  }&lt;br /&gt;  for (var k:Number = 0; k &lt; this.xMovies.length; k++) {&lt;br /&gt;   this.xs[k] = (Stage.width * this.xs[k]) / this.oldStageWidth;&lt;br /&gt;   if (Stage.align.indexOf("L") &gt; -1) {&lt;br /&gt;      this.xMovies[k]._x = this.xs[k];&lt;br /&gt;   } else {&lt;br /&gt;      this.xMovies[k]._x = ((this.baseStageWidth - Stage.width) / 2) + this.xs[k];&lt;br /&gt;   }&lt;br /&gt;   if (this.xAligns[k] == this.xRight) {&lt;br /&gt;    this.xMovies[k]._x -= this.xMovies[k]._width;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  for (var k:Number = 0; k &lt; this.yMovies.length; k++) {&lt;br /&gt;   this.ys[k] = (Stage.height * this.ys[k]) / this.oldStageHeight;&lt;br /&gt;   if (Stage.align.indexOf("T") &gt; -1) {&lt;br /&gt;      this.yMovies[k]._y = this.ys[k];&lt;br /&gt;   } else {&lt;br /&gt;      this.yMovies[k]._y = ((this.baseStageHeight - Stage.height) / 2) + this.ys[k];&lt;br /&gt;   }&lt;br /&gt;   if (this.yAligns[k] == this.yBottom) {&lt;br /&gt;    this.yMovies[k]._y -= this.yMovies[k]._height;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  this.oldStageWidth = Stage.width;&lt;br /&gt;  this.oldStageHeight = Stage.height;&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Se quiser que um movieclip fique sempre na posição x e y de acordo com o resize, basta passar a referência do movieclip para as funções x e y:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint javascript"&gt;&lt;br /&gt;fit.x(MovieClip);&lt;br /&gt;fit.y(MovieClip);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ou então se precisar que um movieclip tenha o tamanho dinâmico de acordo com o resize, basta passar a referência do movieclip para as funções width e height:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint javascript"&gt;&lt;br /&gt;fit.width(MovieClip);&lt;br /&gt;fit.height(MovieClip);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para fazer resize em porporção, ideal para imagens, use:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint javascript"&gt;&lt;br /&gt;fit.proportional(MovieClip);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;E para fazer alinhamentos, por exemplo alinhar um movieclip colado ao lado direito:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint javascript"&gt;&lt;br /&gt;fit.x(MovieClip, fit.xRight);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;E para alinhar colado a base:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint javascript"&gt;&lt;br /&gt;fit.y(MovieClip, fit.yBottom);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Os alinhamentos suportados para o x são fit.xLeft&lt;i&gt;(padrão)&lt;/i&gt; e fit.xRight, e para y são fit.yTop&lt;i&gt;(padrão)&lt;/i&gt; e fit.yBottom.&lt;br /&gt;&lt;br /&gt;O alinhamento esta preparado apenas para a configuração padrão de alinhamento do Flash e para o "TL" (alinhamento Top/Left):&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint javascript"&gt;&lt;br /&gt;Stage.scaleMode = "noScale";&lt;br /&gt;Stage.align = "TL";&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Outros parâmetros de alinhamento não foram testados.&lt;br /&gt;&lt;br /&gt;No exemplo do swffit tem a função calcSize que é chamada quando cada resize é feito, é preciso adicionar a função fix, para cada vez que for feito o resize ajustar as posições:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint javascript"&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;function calcSize() {&lt;/span&gt;&lt;br /&gt;fit.fix();&lt;br /&gt;&lt;span style="font-style: italic;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Veja o video que demonstra como utilizar:&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="532" class="BLOG_video_class" id="BLOG_video-1050aa8625ff6fce" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v2.nonxt6.googlevideo.com/videoplayback?id%3D1050aa8625ff6fce%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330446241%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D655D0769CB4CFF0C5FFEAC75BE835B271D65A9B4.1690FB8319F89E38670DA20E495BADD7CED784CE%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D1050aa8625ff6fce%26offsetms%3D5000%26itag%3Dw160%26sigh%3DexDQWUctGW0fONfbW85dsRLEGwc&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="640" height="532" bgcolor="#FFFFFF"flashvars="flvurl=http://v2.nonxt6.googlevideo.com/videoplayback?id%3D1050aa8625ff6fce%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330446241%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D655D0769CB4CFF0C5FFEAC75BE835B271D65A9B4.1690FB8319F89E38670DA20E495BADD7CED784CE%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D1050aa8625ff6fce%26offsetms%3D5000%26itag%3Dw160%26sigh%3DexDQWUctGW0fONfbW85dsRLEGwc&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-6479061616569112251?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=1050aa8625ff6fce&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/6479061616569112251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/08/movie-fit.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6479061616569112251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6479061616569112251'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/08/movie-fit.html' title='Movie Clip Fit'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-5787955136960960765</id><published>2008-06-09T08:34:00.000-07:00</published><updated>2008-06-11T02:57:02.165-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>GlassFish vs Apache</title><content type='html'>Gastei um tempinho para desvendar certos mistérios por trás desta configuração e contornar alguns problemas.&lt;br /&gt;&lt;br /&gt;Para configurar segui o post do &lt;a href="http://weblogs.java.net/blog/jfarcand/archive/2006/03/running_glassfi_1.html"&gt;Jean-Francois Arcand's&lt;/a&gt; e da &lt;a href="http://weblogs.java.net/blog/amyroh/archive/2006/08/glassfish_suppo.html"&gt;Amy Roh's&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Então vamos lá!&lt;br /&gt;&lt;br /&gt;Primeiro no Apache, instalar o mod_jk:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;apt-get install libapache2-mod-jk&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Configurar o conteúdo do arquivo &lt;span style="font-weight:bold;"&gt;/etc/apache2/mods-available/jk.load&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Modulo do mod_jk&lt;br /&gt;LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so&lt;br /&gt;# Arquivo de configuração&lt;br /&gt;JkWorkersFile /etc/apache2/mod_jk_worker.properties&lt;br /&gt;# Arquivo de log&lt;br /&gt;JkLogFile /var/log/apache2/mod_jk.log&lt;br /&gt;# Nível de detalhe dos logs [debug/error/info]&lt;br /&gt;JkLogLevel debug&lt;br /&gt;# Formato das mensagens de log&lt;br /&gt;JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "&lt;br /&gt;# JkOptions indica para enviar SSL KEY SIZE&lt;br /&gt;JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories&lt;br /&gt;# JkRequestLogFormat define o formato dos requests no Log&lt;br /&gt;JkRequestLogFormat "%w %V %T"&lt;br /&gt;# Envia todos jsp para o GlassFish&lt;br /&gt;JkMount /*.jsp worker1&lt;br /&gt;# Envia todos os acessos ao meu projeto web para o GlassFish&lt;br /&gt;JkMount /WebApplication/* worker1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Na última linha, o WebApplication se refere ao nome do nosso projeto no GlassFish, coloque aqui o nome do teu projeto no GlassFish.&lt;br /&gt;&lt;br /&gt;Agora falta configurar o &lt;span style="font-weight:bold;"&gt;/etc/apache2/mod_jk_worker.properties&lt;/span&gt;, com este conteúdo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Define 1 worker usando ajp13&lt;br /&gt;worker.list=worker1&lt;br /&gt;# Define as propriedades do worker1 (ajp13)&lt;br /&gt;worker.worker1.type=ajp13&lt;br /&gt;worker.worker1.host=localhost&lt;br /&gt;worker.worker1.port=8009&lt;br /&gt;worker.worker1.lbfactor=50&lt;br /&gt;worker.worker1.cachesize=10&lt;br /&gt;worker.worker1.cache_timeout=600&lt;br /&gt;worker.worker1.socket_keepalive=1&lt;br /&gt;worker.worker1.socket_timeout=300&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Agora vamos ao GlassFish...&lt;br /&gt;&lt;br /&gt;No Glassfish configurar as seguintes opções da JVM:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$GLASSFISH_HOME/bin/asadmin create-jvm-options -Dcom.sun.enterprise.web.connector.enableJK=8009&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;E também:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$GLASSFISH_HOME/bin/asadmin create-jvm-options -Dcom.sun.enterprise.web.connector.enableJK.propertyFile=/etc/apache2/mod_jk_worker.properties&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para confirmar se ficou bem configurado, verifique o arquivo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$GLASSFISH_HOME/domains/domain1/config/domain.xml&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Procurar neste arquivo por:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;jvm-options&amp;gt;-Dcom.sun.enterprise.web.connector.enableJK=8009&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;&amp;lt;jvm-options&amp;gt;-Dcom.sun.enterprise.web.connector.enableJK.propertyFile=/etc/apache2/mod_jk_worker.properties&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Fazer o download do &lt;a href="http://archive.apache.org/dist/tomcat/tomcat-5/v5.5.16/bin/apache-tomcat-5.5.16.zip"&gt;apache-tomcat-5.5.16.zip&lt;/a&gt;, e pegar o &lt;span style="font-weight:bold;"&gt;tomcat-ajp.jar&lt;/span&gt;, só serve o jar desta versão, os das versões superiores não funcionam, provocam o seguinte erro no GlassFish:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;color:#f00;"&gt;Caused by: java.lang.NoSuchMethodError: org.apache.coyote.Response.getContentLengthLong()J&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois do download, procurar o &lt;span style="font-weight:bold;"&gt;tomcat-ajp.jar&lt;/span&gt; dentro do zip:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;apache-tomcat-5.5.16/server/lib/tomcat-ajp.jar&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;E copiar este jar para dentro do GlassFish:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$GLASSFISH_HOME/lib/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Também são precisos os jars &lt;span style="font-weight:bold;"&gt;commons-modeler&lt;/span&gt; e &lt;span style="font-weight:bold;"&gt;commons-logging&lt;/span&gt;, que podem ser adquiridos aqui:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://commons.apache.org/downloads/index.html"&gt;http://commons.apache.org/downloads/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Modeler:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://commons.apache.org/downloads/download_modeler.cgi"&gt;http://commons.apache.org/downloads/download_modeler.cgi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Logging:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://commons.apache.org/downloads/download_logging.cgi"&gt;http://commons.apache.org/downloads/download_logging.cgi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Copiar estes dois jars também para dentro do:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$GLASSFISH_HOME/lib/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Feito isto, é preciso reiniciar o Apache e o GlassFish, e agora deverá estar funcionando através do Apache:&lt;br /&gt;&lt;br /&gt;http://localhost/WebApplication&lt;br /&gt;&lt;br /&gt;Assim através do Apache da para acessar os projetos publicados no GlassFish!&lt;br /&gt;&lt;br /&gt;O porto 8009 que configuramos para o JK não tem nada haver com o porto web do GlassFish, o mod JK usa um protocolo próprio para comunicar com o Tomcat/AJP, e o GlassFish o que faz é inicia um novo porto usando o JK do Tomcat para poder comunicar com o mod_jk no Apache, e para testar se este porto esta funcionando pode-se usar o telnet e ver se conecta:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;telnet localhost 8009&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Futuramente pretendo investigar sobre &lt;a href="http://blogs.sun.com/dadelhardt/entry/loadbalancing_with_mod_jk_and_glassfish"&gt;Load Balancing usando o Apache e Glassfish&lt;/a&gt; e espero falar sobre isto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-5787955136960960765?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/5787955136960960765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/06/glassfish-vs-apache.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/5787955136960960765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/5787955136960960765'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/06/glassfish-vs-apache.html' title='GlassFish vs Apache'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-7587248210357219983</id><published>2008-05-09T02:40:00.000-07:00</published><updated>2008-09-01T06:53:17.094-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Backup</title><content type='html'>A alguns anos fiz um sistema de backups em ShellScript e hoje configurei ele num servidor novo, e reparei como ele tem sido útil e tem resultado muito bem, resolvi partilhar.&lt;br /&gt;&lt;br /&gt;Criar as pastas:&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;# mkdir /backup&lt;br /&gt;# mkdir /backup/log&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Criar os seguintes arquivos:&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;# touch /backup/backup&lt;br /&gt;# touch /backup/backup.start&lt;br /&gt;# touch /backup/backup.end&lt;br /&gt;# touch /backup/directory&lt;br /&gt;# touch /backup/run&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Dar permissões de execução:&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;# chmod +x /backup/backup&lt;br /&gt;# chmod +x /backup/backup.start&lt;br /&gt;# chmod +x /backup/backup.end&lt;br /&gt;# chmod +x /backup/run&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Os backups diários serão guardados dentro da pasta &lt;span style="font-weight:bold;"&gt;/backup/daily&lt;/span&gt;. E os mensais sempre no dia 1 serão guardados dentro da pasta &lt;span style="font-weight:bold;"&gt;/backup/monthly&lt;/span&gt;. Não é preciso criar estas pastas, elas são criadas automaticamente.&lt;br /&gt;&lt;br /&gt;Colar este conteúdo no arquivo &lt;span style="font-weight:bold;"&gt;/backup/backup&lt;/span&gt;:&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;echo ""&lt;br /&gt;echo -e "\e[40;32;1m Backup \e[0m"&lt;br /&gt;echo ""&lt;br /&gt;echo -e "\e[44;33;1m Start \e[0m"&lt;br /&gt;echo ""&lt;br /&gt;dir1="/backup"&lt;br /&gt;dir2=$1&lt;br /&gt;echo -ne "\e[34;1mcomand.begin\e[0m   \e[32mstart\e[0m \e[30;5m...\e[0m"&lt;br /&gt;$dir1/backup.start&lt;br /&gt;echo -e "\e[31;1m end \e[0m"&lt;br /&gt;echo ""&lt;br /&gt;dateDay=`date "+%d"`&lt;br /&gt;dateMonth=`date "+%m"`&lt;br /&gt;dateYear=`date "+%Y"`&lt;br /&gt;folder1=$dir1/daily/$dateDay&lt;br /&gt;folder2=$dir2/daily/$dateDay&lt;br /&gt;echo -ne "\e[34;1mWork Folder\e[0m $folder1 \e[32mstart\e[0m \e[30;5m...\e[0m"&lt;br /&gt;rm -dfr $folder1&lt;br /&gt;mkdir -p $folder1&lt;br /&gt;echo -e "\e[31;1m end \e[0m"&lt;br /&gt;echo ""&lt;br /&gt;if [[ $dir2 != "" ]]; then&lt;br /&gt;        echo -ne "\e[34;1mWork Folder\e[0m $folder2 \e[32mstart\e[0m \e[30;5m...\e[0m"&lt;br /&gt;        rm -dfr $folder2&lt;br /&gt;        mkdir -p $folder2&lt;br /&gt;        echo -e "\e[31;1m end \e[0m"&lt;br /&gt;        echo ""&lt;br /&gt;fi&lt;br /&gt;echo -e "\e[40;31;1m BACKUP: directory \e[0m"&lt;br /&gt;echo "   |"&lt;br /&gt;_x=0&lt;br /&gt;_to=""&lt;br /&gt;for i in `cat /backup/directory`; do&lt;br /&gt;        if [ $_x = 0 ]; then&lt;br /&gt;                _to=$folder1/$i.tar.gz&lt;br /&gt;                echo -ne "   | $i   \e[32mstart\e[0m \e[30;5m...\e[0m"&lt;br /&gt;                _x=1&lt;br /&gt;        else&lt;br /&gt;                tar -czPf $_to $i&lt;br /&gt;                if [[ $dir2 != "" ]]; then&lt;br /&gt;                        cp -rf $_to $folder2&lt;br /&gt;                fi&lt;br /&gt;                echo -e "\e[31;1m end \e[0m"&lt;br /&gt;                _x=0&lt;br /&gt;        fi&lt;br /&gt;done&lt;br /&gt;echo "   |____________________________________________________"&lt;br /&gt;echo ""&lt;br /&gt;echo -ne "\e[34;1mcomand.end\e[0m   \e[32mstart\e[0m \e[30;5m...\e[0m"&lt;br /&gt;$dir1/backup.end $folder1&lt;br /&gt;echo -e "\e[31;1m end \e[0m"&lt;br /&gt;if [ $dateDay = 01 ]; then&lt;br /&gt;        folderMonthly1=$dir1/monthly/$dateYear.$dateMonth.$dateDay&lt;br /&gt;        echo -ne "\e[34;1mMonthly Backup]\e[0m $folderMonthly1 \e[32mstart\e[0m \e[30;5m...\e[0m"&lt;br /&gt;        mkdir -p $folderMonthly1&lt;br /&gt;        cp -rf $folder1 $folderMonthly1&lt;br /&gt;        echo -e "\e[31;1m end \e[0m"&lt;br /&gt;        if [[ $dir2 != "" ]]; then&lt;br /&gt;                folderMonthly2=$dir2/monthly/$dateYear.$dateMonth.$dateDay&lt;br /&gt;                echo -ne "\e[34;1mMonthly Backup]\e[0m $folderMonthly2 \e[32mstart\e[0m \e[30;5m...\e[0m"&lt;br /&gt;                mkdir -p $folderMonthly2&lt;br /&gt;                cp -rf $folder2 $folderMonthly2&lt;br /&gt;        fi&lt;br /&gt;        echo ""&lt;br /&gt;fi&lt;br /&gt;echo ""&lt;br /&gt;echo -e "\e[44;33;1m End \e[0m"&lt;br /&gt;echo ""&lt;br /&gt;echo -e "\e[40;32;1m by eduveks \e[0m"&lt;br /&gt;echo ""&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O arquivo &lt;span style="font-weight:bold;"&gt;/backup/run&lt;/span&gt; é o que inicia o backup e grava o output no arquivo de log, colocar o seguinte conteúdo:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;logFileName=`date "+%Y-%m-%d_%H-%M-%S"`&lt;br /&gt;/backup/backup &lt;span style="font-weight:bold;"&gt;"/mnt/backupmirror"&lt;/span&gt; &gt; /backup/log/$logFileName&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Atenção ao &lt;span style="font-weight:bold;"&gt;"/mnt/backupmirror/backup"&lt;/span&gt;, esta opção é para fazer uma cópia do backup para outra pasta, no meu caso sempre uso um servidor secundário para ter um espelho do backup original, e esta pasta é uma pasta montada remotamente ao outro servidor.&lt;br /&gt;&lt;br /&gt;Os arquivos &lt;span style="font-weight:bold;"&gt;/backup/backup.start&lt;/span&gt; e &lt;span style="font-weight:bold;"&gt;/backup/backup.end&lt;/span&gt;, servem para poder colocar comandos para serem executados antes e depois do backup respectivamente, por exemplo para fazer o mount e o umount de uma partilha remota, preparando o cenário da cópia secundária. Ou ainda para parar serviços e reinicia-los no fim, por exemplo para o MySql antes de começar o backup e no fim voltar a inicializa-lo. Gravar nestes arquivos o conteúdo:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Finalmente o arquivo &lt;span style="font-weight:bold;"&gt;/backup/directory&lt;/span&gt; serve para dizer as pastas que deverá ser feito backup, adicionar aqui o nome que vai ter o &lt;span style="font-weight:bold;"&gt;arquivo&lt;/span&gt;.tar.gz e qual a pasta que vai ser armazenada neste arquivo, no seguinte formato:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;DB_NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/var/lib/mysql/DB_NAME&lt;br /&gt;USER1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/home/USER1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Depois de tudo afinado vamos executar o backup, assim podemos ver o output:&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;# /backup/backup&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Se tudo correu bem, o backup deverá estar em:&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;# /backup/daily/01/DB_NAME.tar.gz&lt;br /&gt;# /backup/daily/01/USER1.tar.gz&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Onde o "01" é o número do dia do mês atual.&lt;br /&gt;&lt;br /&gt;Assim a cada dia haverá uma pasta com os backups deste dia, e no dia 1 de cada mês, o backup deste dia estará em:&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;# /backup/monthly/2008.05.01/01/DB_NAME.tar.gz&lt;br /&gt;# /backup/monthly/2008.05.01/01/USER1.tar.gz&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;E executar o backup passando uma pasta para ser o espelho do backup:&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;# /backup/backup /tmp&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Poderá reparar que também dentro do /tmp passará a ter o conteúdo do backup.&lt;br /&gt;&lt;br /&gt;Feito o teste, voltar a ver como esta o &lt;span style="font-weight:bold;"&gt;/backup/run&lt;/span&gt;, verificar se esta tudo certo, e testa-lo:&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;# /backup/run&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Dentro da pasta /backup/log deverá ter o log do backup:&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;# cd /backup/log&lt;br /&gt;# ls&lt;br /&gt;# cat 2008-05-01_11-51-53&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Agora só falta configurar no crond para executar o backup, criar um arquivo no &lt;span style="font-weight:bold;"&gt;/etc/cron.daily/backup&lt;/span&gt;, com o seguinte conteúdo:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint bash"&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;/backup/run&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Pronto, agora o backup irá ser executado todos os dias, e assim temos uma solução bem simples e prática para fazer backups...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-7587248210357219983?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/7587248210357219983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/05/backup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/7587248210357219983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/7587248210357219983'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/05/backup.html' title='Backup'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-6205422337077481222</id><published>2008-05-07T19:59:00.000-07:00</published><updated>2008-05-08T02:58:51.924-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Ubuntu 8.04 vs RaLink RT2561/RT61</title><content type='html'>Após uma longa batalha, finalmente posso desfrutar do prazer do wireless :P&lt;br /&gt;&lt;br /&gt;Tentei durante alguns dias configurar a rede wireless, por duas vezes consegui, mas não ficou bom, e depois parou de funcionar.&lt;br /&gt;&lt;br /&gt;O problema era que conseguia conectar, e até o ping funcionava mas muitooo lento, com 200ms, e as vezes não funcionava, e depois por mais que insistisse o DNS não funcionava e não consegui que algum site abrisse, mesmo o site do router, então começei a fazer buscas frenéticas atrás da solução, medidas de desespero.&lt;br /&gt;&lt;br /&gt;Para começar verifique o modelo da tua placa:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;$ lspci | grep RaLink&lt;/span&gt;&lt;br /&gt;02:09.0 Network controller: RaLink RT2561/RT61 rev B 802.11g&lt;br /&gt;&lt;br /&gt;Primeiro tentei desta forma, utilizando os drivers do Windows:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://i-eat-noobs.blogspot.com/2007/08/get-wireless-working-in-ubuntu-704.html"&gt;http://i-eat-noobs.blogspot.com/2007/08/get-wireless-working-in-ubuntu-704.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ralinktech.com/ralink/Home/Support/Windows.html"&gt;http://www.ralinktech.com/ralink/Home/Support/Windows.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Usei o PCI/mPCI/CB(RT256x/RT266x), mas como diz a descrição ao lado, vem o drive da RT61 para o Windows Vista, mesmo assim tentei, o cabextract, e o unshield e ainda com o wine, não consegui pegar o arquivo .inf que o ndiswrapper pede, por motivos de força maior deste jeito a coisa não vai e tive que ir atrás de outra solução.&lt;br /&gt;&lt;br /&gt;Mais pesquisas, e descobri que muitos já tiveram este problema e indicavam que tinha a ver com o Driver mesmo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ubuntuforums.org/showthread.php?t=550351"&gt;http://ubuntuforums.org/showthread.php?t=550351&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Além de muitos outros...&lt;br /&gt;&lt;br /&gt;Então encontrei esta dica para instalar o driver para Linux oficial da RaLink:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ubuntuforums.org/showthread.php?p=4867439"&gt;http://ubuntuforums.org/showthread.php?p=4867439&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ralinktech.com/ralink/Home/Support/Linux.html"&gt;http://www.ralinktech.com/ralink/Home/Support/Linux.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Usei o RT2501PCI/mPCI/CB(RT61:RT2561/RT2561S/RT2661), a instalação não foi bem como diz na dica, foi quase, cosegui instalar e configurar, mas não consegui de nenhuma forma que funcionasse, ficou bem mais rápido as mensagens do ping mas sempre sem sucesso, e também o nm-applet não reconheceu mais o wireless, reparei que por mais que tentasse alterar a configuração da conexão, no iwconfig ficava sempre igual, nenhuma configuração era alterada. Comecei a ver que estava sem saída de novo...&lt;br /&gt;&lt;br /&gt;Resolvi rever os passos, e se olhar melhorar para este link:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ralinktech.com/ralink/Home/Support/Linux.html"&gt;http://www.ralinktech.com/ralink/Home/Support/Linux.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tem lá em baixo... "The rt2x00 Open Source Project"... rt2x00 que porcaria é esta, resolvi clicar, tudo que precisava para ter esperança:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;This project is a development effort to provide free, stable and feature rich Linux drivers for&lt;br /&gt;wireless 802.11b/g/i cards based on the following Ralink chipsets: rt2400, rt2500, rt2570, &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;rt61&lt;/span&gt; and rt73.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Em downloads fiz o download do "Last beta release: v1.1.0-b2", mas como tenho muita sorte, ao tentar compilar deu erro na compilação...&lt;br /&gt;&lt;br /&gt;Agora só falta a última chama de esperança, o "CVS hourly tarball: rt61-CVS", o que correu muito bem, e mais simples impossível.&lt;br /&gt;&lt;br /&gt;Fazer o download:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rt2x00.serialmonkey.com/rt61-cvs-daily.tar.gz"&gt;http://rt2x00.serialmonkey.com/rt61-cvs-daily.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Extrair:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;$ tar -xzf rt61-cvs-daily.tar.gz&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No meu caso foi:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;$ cd rt61-cvs-2008050721/Module&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dá para ver que o projeto não esta abandonado.&lt;br /&gt;&lt;br /&gt;Compilar e instalar, com a conta do root:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# make &amp;&amp; make install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Caso de erro na compilação deve ser que falta instalar o source da versão do kernel que esta sendo usado, ter atenção a isto, é preciso ter a source do kernel instalada.&lt;br /&gt;&lt;br /&gt;Feito isto falta registrar o novo module:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# echo "rt61" &gt;&gt; /etc/modules&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Também pode tentar um "modprobe rt61", mas convém fazer um: &lt;span style="font-weight:bold;"&gt;Reboot&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;O nm-applet reconheceu o wireless, consegui conectar facilmente, logo de primeira a internet funcionou, e vim fazer este post com tudo fresquinho na cabeça, são agora 4:50 da manhã e seja o que Deus quiser amanhã no trabalho, ou melhor hoje :P&lt;br /&gt;&lt;br /&gt;Usei a configuração manual, que na automática pediu a senha 2 vezes e ai cancelei e fui tentar no manual e funcionou muito bem com WEP (ASCII).&lt;br /&gt;&lt;br /&gt;Também fui testar alguns sites mais pesado, e reparei que ficou muito mais rápido que no outro notebook com windows... muito rápido mesmo, demorou, custou, mas valeu a pena.&lt;br /&gt;&lt;br /&gt;Próximo é passo configurar com WPA em vez de WEP...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-6205422337077481222?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/6205422337077481222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/05/ubuntu-804-vs-ralink-rt2561rt61.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6205422337077481222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6205422337077481222'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/05/ubuntu-804-vs-ralink-rt2561rt61.html' title='Ubuntu 8.04 vs RaLink RT2561/RT61'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-6669998506935402799</id><published>2008-04-20T16:57:00.000-07:00</published><updated>2008-04-21T09:33:19.918-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BSD'/><title type='text'>DragonFlyBSD - Instalação de pacotes</title><content type='html'>Hoje começei a brincar com o DragonflyBSD, e até agora estou gostando, vários detalhes facilitados comparado a outros BSDs.&lt;br /&gt;&lt;br /&gt;Mas depois de instalar e ao tentar usar o &lt;span style="font-weight:bold;"&gt;pkg_search&lt;/span&gt;, tive o seguinte erro:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;No pkgsrc(7) tree found.  Fetching pkg_summary(5) file.&lt;br /&gt;fetch: http://pkgbox.dragonflybsd.org/packages/DragonFly-1.12/i386//All/pkg_summary.bz2: Not Found&lt;br /&gt;fetch: http://pkgbox.dragonflybsd.org/packages/DragonFly-1.10.1/i386//All/pkg_summary.bz2: Not Found&lt;br /&gt;Unable to fetch pkg_summary(5) file.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Tentei abrir estas URLs no browser mas também sem sucesso, então comecei a fuçar e descobri este site:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pkgsrc-box.org/"&gt;http://www.pkgsrc-box.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Que tem os packages do DragonflyBSD, então fuçando neste site descobri que aqui tem a lista dos packages:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pkgsrc-box.org/packages/stable/DragonFly-1.10/All/"&gt;http://www.pkgsrc-box.org/packages/stable/DragonFly-1.10/All/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E também o precioso pkg_summary.bz2:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pkgsrc-box.org/packages/stable/DragonFly-1.10/All/pkg_summary.bz2"&gt;http://www.pkgsrc-box.org/packages/stable/DragonFly-1.10/All/pkg_summary.bz2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E da versão 1.12 estão aqui:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pkgbox.dragonflybsd.org/packages/DragonFly-1.12/stable/All/"&gt;http://pkgbox.dragonflybsd.org/packages/DragonFly-1.12/stable/All/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Boa, mas agora como configurar para usar estas URLs em vez das que vem por default?! Procurei e procurei no /etc e nada, então resolvi arriscar e fiz:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;vi /usr/bin/pkg_search&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Boas notícias é um script mesmo e logo nas primeiras linhas estava a string com as preciosas URLs, é preciso dar permissões de escrita no arquivo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;chmod u+w /usr/bin/pkg_search&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Mudei as linhas do &lt;span style="font-weight:bold;"&gt;PKGSRCBOX1&lt;/span&gt; e do &lt;span style="font-weight:bold;"&gt;PKGSRCBOX2&lt;/span&gt; para:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;PKGSRCBOX1=http://pkgbox.dragonflybsd.org/packages/DragonFly-1.12/stable/&lt;br /&gt;PKGSRCBOX2=http://www.pkgsrc-box.org/packages/stable/DragonFly-1.10/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Depois foi só usar o &lt;span style="font-weight:bold;"&gt;pkg_search&lt;/span&gt;, o qual funcionou perfeitamente.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;pkg_search nano&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para usar o &lt;span style="font-weight:bold;"&gt;pkg_add&lt;/span&gt; precisei passar a url completa do arquivo, as dependências são instaladas automaticamente se estiverem na mesma URL base:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;pkg_add http://pkgbox.dragonflybsd.org/packages/DragonFly-1.12/stable/All/nano-2.0.7.tgz&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-6669998506935402799?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/6669998506935402799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/04/dragonflybsd-instalaao-de-pacotes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6669998506935402799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6669998506935402799'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/04/dragonflybsd-instalaao-de-pacotes.html' title='DragonFlyBSD - Instalação de pacotes'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-330900978130436160</id><published>2008-04-08T05:56:00.000-07:00</published><updated>2008-05-08T03:06:44.570-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>LVM vs Mount</title><content type='html'>Se por acaso ao tentar montar uma partição no Linux e der com o seguinte erro:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0); font-weight: bold;"&gt;mount: unknown filesystem type 'LVM2_member'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O problema é que as partições do disco foram registradas na LVM.&lt;br /&gt;&lt;br /&gt;Minha distribuição é o OpenSuse 10.3, mas em princípio esta solução servirá para qualquer Linux.&lt;br /&gt;&lt;br /&gt;Podemos ver a estrutura LVM com o comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;# /sbin/pvs&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; PV         VG     Fmt  Attr PSize PFree&lt;br /&gt; &lt;b&gt;/dev/sdb1&lt;/b&gt;  &lt;b&gt;system&lt;/b&gt; lvm2 a-   5,86G 5,86G&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para mais detalhes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;# /sbin/pvscan&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; PV &lt;b&gt;/dev/sdb1&lt;/b&gt;   VG &lt;b&gt;system&lt;/b&gt;   lvm2 [5,86 GB / 5,86 GB free]&lt;br /&gt; Total: 1 [5,86 GB] / in use: 1 [5,86 GB] / in no VG: 0 [0   ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Precisamos do VG Name, mais detalhes ainda:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;# /sbin/pvdisplay /dev/sdb1&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; --- Physical volume ---&lt;br /&gt; PV Name               &lt;b&gt;/dev/sdb1&lt;/b&gt;&lt;br /&gt; VG Name               &lt;b&gt;system&lt;/b&gt;&lt;br /&gt; PV Size               5,86 GB / not usable 3,73 MB&lt;br /&gt; Allocatable           yes&lt;br /&gt; PE Size (KByte)       4096&lt;br /&gt; Total PE              1499&lt;br /&gt; Free PE               1499&lt;br /&gt; Allocated PE          0&lt;br /&gt; PV UUID               lPwtfx-5ocj-eXah-gqcX-1bCd-kcod-YN96is&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Com o VG Name que no meu caso é "&lt;span style="font-weight:bold;"&gt;system&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Podemos agora remover o Volume Group:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# vgremove system&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Volume group "system" successfully removed&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Se voltar a fazer o pvs, pvscan ou pvdisplay, verificamos que o disco já não tem o VG Name (Volume Group Name).&lt;br /&gt;&lt;br /&gt;Falta remover definitivamente a partição da LVM, com o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# pvremove /dev/sdb1&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Labels on physical volume "/dev/sdb1" successfully wiped&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Se tentar montar a partição agora não vai ser possível, vai dar sempre esta mensagem, mesmo definindo o type:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# mount /dev/sdb1 /mnt/hd1&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mount: you must specify the filesystem type&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Então é preciso fazer um reboot, para que os dispositivos dos discos sejam recarregados:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# reboot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois do reboot verifique com o pvs, pvscan ou pvdisplay, para ter a certeza que a partição já não esta registrada.&lt;br /&gt;&lt;br /&gt;Agora só falta montar a partição normalmente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# mount /dev/sdb1 /mnt/hd1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para mais informações veja a documentação:&lt;br /&gt;&lt;a href="http://tldp.org/HOWTO/LVM-HOWTO/"&gt;http://tldp.org/HOWTO/LVM-HOWTO/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E para saber para que serve a LVM e mais informções:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux)"&gt;http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-330900978130436160?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/330900978130436160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/04/lvm-vs-mount.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/330900978130436160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/330900978130436160'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/04/lvm-vs-mount.html' title='LVM vs Mount'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-5640414217030513680</id><published>2008-03-28T17:17:00.000-07:00</published><updated>2008-10-24T15:20:33.816-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='CajuScript'/><title type='text'>Que tal uma sintaxe em Portugues?</title><content type='html'>&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;IMPORTANTE: O conteúdo deste post é sempre atualizado para a última versão do CajuScript.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Exemplo de uma sintaxe em Português usando o CajuScript.&lt;br /&gt;&lt;br /&gt;Faça o download do &lt;a href="http://www.cajuscript.org/"&gt;CajuScript&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Na mesma pasta em que esta o jar do CajuScript crie o arquivo &lt;i&gt;"&lt;span style="font-weight: bold;"&gt;carregaSintaxePortugues.cj&lt;/span&gt;"&lt;/i&gt;, com o seguinte conteúdo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;color:green;" &gt;[CODE]&lt;/span&gt;&lt;br /&gt;$java.util.regex&lt;br /&gt;&lt;br /&gt;syntaxPT = org.cajuscript.Syntax()&lt;br /&gt;syntaxPT.setIf(Pattern.compile("^[\\s+s|s]e\\s*([\\s+|[\\s*\\(]].+)\\s*faz"))&lt;br /&gt;syntaxPT.setElseIf(Pattern.compile("^[\\s+o|o]u\s+se\\s*([\\s+|[\\s*\\(]].+)\\s*faz"))&lt;br /&gt;syntaxPT.setElse(Pattern.compile("^[\\s+o|o]u\\s+senao\\s+fa[z\\s+|z]$"))&lt;br /&gt;syntaxPT.setIfEnd(Pattern.compile("^[\\s+f|f]i[m\\s+|m]$"))&lt;br /&gt;syntaxPT.setLoop(Pattern.compile("^[\\s+e|e]nquanto\\s*([\\s+|[\\s*\\(]].+)\\s*faz"))&lt;br /&gt;syntaxPT.setLoopEnd(Pattern.compile("^[\\s+f|f]i[m\\s+|m]$"))&lt;br /&gt;syntaxPT.setTry(Pattern.compile("^[\\s+t|t]enta\\s*([\\s+|[\\s*\\(]].+)\\s*faz"))&lt;br /&gt;syntaxPT.setTryCatch(Pattern.compile("^[\\s+p|p]ega\\s+o\\s+err[o\\s+|o]$"))&lt;br /&gt;syntaxPT.setTryFinally(Pattern.compile("^[\\s+f|f]inalment[e\\s+|e]$"))&lt;br /&gt;syntaxPT.setTryEnd(Pattern.compile("^[\\s+f|f]i[m\\s+|m]$"))&lt;br /&gt;syntaxPT.setFunction(Pattern.compile("^[\\s+f|f]uncao\\s*([\\s+|[\\s*\\(]].+)\\s*faz"))&lt;br /&gt;syntaxPT.setFunctionEnd(Pattern.compile("^[\\s+f|f]i[m\\s+|m]$"))&lt;br /&gt;syntaxPT.setNull(Pattern.compile("nulo"))&lt;br /&gt;syntaxPT.setReturn(Pattern.compile("retorna"))&lt;br /&gt;syntaxPT.setImport(Pattern.compile("importa\\s+"))&lt;br /&gt;syntaxPT.setRootContext(Pattern.compile("raiz\\."))&lt;br /&gt;syntaxPT.setContinue(Pattern.compile("continua"))&lt;br /&gt;syntaxPT.setBreak(Pattern.compile("para"))&lt;br /&gt;syntaxPT.setOperatorOr(Pattern.compile("[\\s+|)\\s*]ou[\\s+|(\\s*]"))&lt;br /&gt;syntaxPT.setOperatorAnd(Pattern.compile("[\\s+|)\\s*]e[\\s+|(\\s*]"))&lt;br /&gt;&lt;br /&gt;org.cajuscript.CajuScript.addGlobalSyntax("PT", syntaxPT)&lt;br /&gt;&lt;br /&gt;$"exemploSintaxePortugues.cj"&lt;br /&gt;&lt;span style="font-weight: bold;color:green;" &gt;[/CODE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E também o arquivo &lt;i&gt;"&lt;span style="font-weight: bold;"&gt;exemploSintaxePortugues.cj&lt;/span&gt;"&lt;/i&gt;, com o seguinte conteúdo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;color:green;" &gt;[CODE]&lt;/span&gt;&lt;br /&gt;caju.syntax: PT&lt;br /&gt;&lt;br /&gt;importa java.lang&lt;br /&gt;&lt;br /&gt;// IF = SE&lt;br /&gt;x = 10&lt;br /&gt;se x &amp;lt; 10 e x &amp;gt; 0 faz&lt;br /&gt;System.out.println("X menor que 10!")&lt;br /&gt;ou se x &amp;gt; 10 e x ! 10 faz&lt;br /&gt;System.out.println("X maior que 10!")&lt;br /&gt;ou se x = 10 ou x ! 0 faz&lt;br /&gt;System.out.println("X igual 10!")&lt;br /&gt;ou senao faz&lt;br /&gt;System.out.println("X menor que 1!")&lt;br /&gt;fim&lt;br /&gt;&lt;br /&gt;// LOOP = ENQUANTO&lt;br /&gt;x = 0&lt;br /&gt;enquanto x &amp;lt; 100 e x &amp;gt;= 0 faz&lt;br /&gt;System.out.println(x)&lt;br /&gt;x += 1&lt;br /&gt;se x = 10 faz&lt;br /&gt;para&lt;br /&gt;ou senao faz&lt;br /&gt;continua&lt;br /&gt;fim&lt;br /&gt;fim&lt;br /&gt;&lt;br /&gt;// FUNCTION = FUNCAO&lt;br /&gt;x = 5&lt;br /&gt;funcao addWithX(v1, v2) faz&lt;br /&gt;retorna raiz.x + v1 + v2&lt;br /&gt;fim&lt;br /&gt;x = addWithX(10, 20)&lt;br /&gt;System.out.println("X = "+ x)&lt;br /&gt;&lt;br /&gt;// TRY/CATCH = TENTA/PEGA&lt;br /&gt;tenta e faz&lt;br /&gt;"".substring(0, -1)&lt;br /&gt;pega o erro&lt;br /&gt;System.out.println("Erro: "+ e.getMessage())&lt;br /&gt;finalmente&lt;br /&gt;System.out.println("Finalmente...")&lt;br /&gt;fim&lt;br /&gt;&lt;br /&gt;System.out.println("\n\nSyntax em portugues executada com sucesso!\n")&lt;br /&gt;&lt;br /&gt;Thread.sleep(10000)&lt;br /&gt;&lt;span style="font-weight: bold;color:green;" &gt;[/CODE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora é só executar com o comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;color:green;" &gt;[CODE]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;java -jar cajuscript.jar carregaSintaxePortugues.cj&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;color:green;" &gt;[/CODE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pronto! :P&lt;br /&gt;&lt;br /&gt;Não convêm usar acentos na sintaxe, por que pode dar alguns problemas de encoding ao transportar o arquivo por vários sistemas operacionais, como do linux para o windows. Mas quem não arrisca não petisca.&lt;br /&gt;&lt;br /&gt;Toda sugestão é bem vinda.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-5640414217030513680?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/5640414217030513680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/03/que-tal-uma-sintaxe-em-portugues.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/5640414217030513680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/5640414217030513680'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/03/que-tal-uma-sintaxe-em-portugues.html' title='Que tal uma sintaxe em Portugues?'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-4327739740150081895</id><published>2008-02-23T08:09:00.000-08:00</published><updated>2008-05-08T03:16:17.527-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Apache 2.2 - Modules</title><content type='html'>No Apache 2.2 resolveram mudar os nomes dos modulos, o que tem dado alguma dor de cabeça...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://httpd.apache.org/docs/2.2/new_features_2_2.html#module"&gt;Lista da mudanças nos nomes dos modulos.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se tiver o seguinte erro:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight:bold;"&gt;[CODE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Starting httpd: httpd: Syntax error on line 170 of /etc/httpd/conf/httpd.conf: Cannot load /etc/httpd/modules/mod_access.so into server: /etc/httpd/modules/mod_access.so: cannot open shared object file: No such file or directory&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight:bold;"&gt;[/CODE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Segue a lista dos modulos corrigido:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight:bold;"&gt;[CODE]&lt;/span&gt;&lt;br /&gt;LoadModule authz_host_module modules/mod_authz_host.so&lt;br /&gt;LoadModule auth_basic_module modules/mod_auth_basic.so&lt;br /&gt;LoadModule authn_anon_module modules/mod_authn_anon.so&lt;br /&gt;LoadModule authn_dbm_module modules/mod_authn_dbm.so&lt;br /&gt;LoadModule auth_digest_module modules/mod_auth_digest.so&lt;br /&gt;LoadModule ldap_module modules/mod_ldap.so&lt;br /&gt;LoadModule authnz_ldap_module modules/mod_authnz_ldap.so&lt;br /&gt;LoadModule include_module modules/mod_include.so&lt;br /&gt;LoadModule log_config_module modules/mod_log_config.so&lt;br /&gt;LoadModule env_module modules/mod_env.so&lt;br /&gt;LoadModule mime_magic_module modules/mod_mime_magic.so&lt;br /&gt;LoadModule cern_meta_module modules/mod_cern_meta.so&lt;br /&gt;LoadModule expires_module modules/mod_expires.so&lt;br /&gt;LoadModule deflate_module modules/mod_deflate.so&lt;br /&gt;LoadModule headers_module modules/mod_headers.so&lt;br /&gt;LoadModule usertrack_module modules/mod_usertrack.so&lt;br /&gt;LoadModule unique_id_module modules/mod_unique_id.so&lt;br /&gt;LoadModule setenvif_module modules/mod_setenvif.so&lt;br /&gt;LoadModule mime_module modules/mod_mime.so&lt;br /&gt;LoadModule dav_module modules/mod_dav.so&lt;br /&gt;LoadModule status_module modules/mod_status.so&lt;br /&gt;LoadModule autoindex_module modules/mod_autoindex.so&lt;br /&gt;LoadModule asis_module modules/mod_asis.so&lt;br /&gt;LoadModule info_module modules/mod_info.so&lt;br /&gt;LoadModule dav_fs_module modules/mod_dav_fs.so&lt;br /&gt;LoadModule vhost_alias_module modules/mod_vhost_alias.so&lt;br /&gt;LoadModule negotiation_module modules/mod_negotiation.so&lt;br /&gt;LoadModule dir_module modules/mod_dir.so&lt;br /&gt;LoadModule imagemap_module modules/mod_imagemap.so&lt;br /&gt;LoadModule actions_module modules/mod_actions.so&lt;br /&gt;LoadModule speling_module modules/mod_speling.so&lt;br /&gt;LoadModule userdir_module modules/mod_userdir.so&lt;br /&gt;LoadModule alias_module modules/mod_alias.so&lt;br /&gt;LoadModule rewrite_module modules/mod_rewrite.so&lt;br /&gt;LoadModule proxy_module modules/mod_proxy.so&lt;br /&gt;LoadModule proxy_ftp_module modules/mod_proxy_ftp.so&lt;br /&gt;LoadModule proxy_http_module modules/mod_proxy_http.so&lt;br /&gt;LoadModule proxy_connect_module modules/mod_proxy_connect.so&lt;br /&gt;LoadModule cache_module modules/mod_cache.so&lt;br /&gt;LoadModule suexec_module modules/mod_suexec.so&lt;br /&gt;LoadModule disk_cache_module modules/mod_disk_cache.so&lt;br /&gt;LoadModule file_cache_module modules/mod_file_cache.so&lt;br /&gt;LoadModule mem_cache_module modules/mod_mem_cache.so&lt;br /&gt;LoadModule cgi_module modules/mod_cgi.so&lt;br /&gt;&lt;span style="color: green; font-weight:bold;"&gt;[/CODE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fiz isto no CentOS 5.1, mas deve ajudar na configuração em outras distribuições.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-4327739740150081895?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/4327739740150081895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/02/apache-22-modules.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/4327739740150081895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/4327739740150081895'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/02/apache-22-modules.html' title='Apache 2.2 - Modules'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-6536086044341704489</id><published>2008-02-13T03:45:00.000-08:00</published><updated>2008-11-13T09:44:54.092-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coisas da Vida'/><title type='text'>Anaconda? Sucuri? Ou história de pescador?</title><content type='html'>Acho que toda gente já deve ter recebido algum e-mail falando sobre esta cobrinha:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_w3IQ9eKR2S4/R7LY_amJOQI/AAAAAAAAAAM/d-4uwzcJe6U/s1600-h/sucuri01.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_w3IQ9eKR2S4/R7LY_amJOQI/AAAAAAAAAAM/d-4uwzcJe6U/s320/sucuri01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5166430306530048258" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_w3IQ9eKR2S4/R7LY_amJORI/AAAAAAAAAAU/fTTO6eUaetQ/s1600-h/sucuri02.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_w3IQ9eKR2S4/R7LY_amJORI/AAAAAAAAAAU/fTTO6eUaetQ/s320/sucuri02.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5166430306530048274" /&gt;&lt;/a&gt;&lt;br /&gt;E acompanha um texto do gênero:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight:bold;"&gt;[CODE]&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;a&gt;Anaconda...&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Sucuri em Barra do Piraí - RJ &lt;br /&gt;VEJAM SÓ O TAMANHO DA &lt;br /&gt;"BOQUINHA" DA CRIANÇA.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Acreditem,  esta sucuri morreu eletrocutada na cerca elétrica &lt;br /&gt;que separa a empresa Thyssen, em Barra do Piraí - RJ,  de uma &lt;br /&gt;fazenda vizinha. &lt;br /&gt;O acontecimento parou a fábrica, e o dia inteiro &lt;br /&gt;foi o maior entra e sai de biólogos do Rio e São Paulo, &lt;br /&gt;para analisarem a cena que se tornou motivo de &lt;br /&gt;preocupação para todos. &lt;br /&gt;&lt;br /&gt;Será preciso rever conceitos sobre acampar e passar a noite às &lt;br /&gt;margens de represa pescando. &lt;br /&gt;Reparem no formato de sua barriga, que ela estava bem alimentada. &lt;br /&gt;Segundo a turma da segurança da Thyssen e o pessoal da prefeitura &lt;br /&gt;de  Barra do Piraí, os órgãos responsáveis estão assustados, &lt;br /&gt;pois este animal, segundo os especialistas, só vive na Amazônia e Pantanal. &lt;br /&gt;É, os especialistas também se enganam.&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;span style="color: green; font-weight:bold;"&gt;[/CODE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como já tinha recebebido vários e-mails com estas imagens, e desta vez me chamou a atenção no título dizer "Anaconda" e no texto dizer "Sucuri", eu pensava que Anaconda e Sucuri fossem espécies diferentes, mas o wikipedia diz que Sucuri é uma espécie de Anaconda:&lt;br /&gt;&lt;a href="http://pt.wikipedia.org/wiki/Anaconda"&gt;http://pt.wikipedia.org/wiki/Anaconda&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ok, boa, aprendi qualquer coisa, agora e o resto?&lt;br /&gt;&lt;br /&gt;Joguei no Google: &lt;i&gt;"sucuri morreu eletrocutada"&lt;/i&gt; e também &lt;i&gt;"anaconda morreu eletrocutada"&lt;/i&gt;...&lt;br /&gt;&lt;br /&gt;Aparece varios links, e comecei a ver o que diziam:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wporfirio.blogspot.com/2007/12/sucuri-em-barra-do-pira-rj.html"&gt;...cerca elétrica que separa a&lt;br /&gt;empresa Thyssen, em Barra do Piraí - RJ...&lt;/a&gt;&lt;br /&gt;Há foi daqui que o e-mail veio. -.-&lt;br /&gt;&lt;br /&gt;&lt;a href="http://conhecimentonet.blogspot.com/2008/02/anaconda-em-resenderj.html"&gt;...Fábrica da Votorantim em Resende (RJ), de uma fazenda vizinha próxima ao Rio Paraíba do Sul...&lt;/a&gt;&lt;br /&gt;Opa afinal foi em Resende no Rio de Janeiro, só que na fábrica Votorantim! -.^&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pescacananeia.com.br/anacondaeletrocutada.htm"&gt;...Siderúrgica Thyssen, de Barra do Piraí (PR)...&lt;/a&gt;&lt;br /&gt;Não não, foi na Siderúrgica Thyssen e foi na barra do Piraí mesmo... só que fica no Pará!?!?! o.O&lt;br /&gt;&lt;br /&gt;E eu garanto que estas fotos foram tiradas lá me casa, num domingo de manhã quando faltou a luz fui no quintal e vi lá a cobra na cerca elétrica, tinha acabado de comer o meu cão, o problema é saber como ela conseguio entrar e depois não conseguio sair, e coitadinho do meu cão Fubá... :P&lt;br /&gt;&lt;br /&gt;Mais um daqueles e-mails com informação bem informativa! As fotos impressionam, mas o texto... vai na volta até foi na Bolívia ou EUA...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-6536086044341704489?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/6536086044341704489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/02/anaconda-sucuri-ou-histria-de-pescador.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6536086044341704489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/6536086044341704489'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/02/anaconda-sucuri-ou-histria-de-pescador.html' title='Anaconda? Sucuri? Ou história de pescador?'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_w3IQ9eKR2S4/R7LY_amJOQI/AAAAAAAAAAM/d-4uwzcJe6U/s72-c/sucuri01.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-2592984736122548111</id><published>2008-02-13T03:13:00.000-08:00</published><updated>2008-02-13T07:50:16.611-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coisas da Vida'/><title type='text'>Apagão mundial a 29 Fev 08 (PELO NOSSO PLANETA) ???</title><content type='html'>Recebi um e-mail bem engraçado dizendo o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight:bold;"&gt;[CODE]&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Apagão mundial a 29 Fev 08 (PELO NOSSO PLANETA)&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Apagão mundial: No dia 29 de Fevereiro de 2008 das 19:55 às 20:00 horas&lt;br /&gt;propõe-se apagar todas as luzes e se possível todos os aparelhos&lt;br /&gt;eléctricos, para o nosso planeta poder 'respirar'.&lt;br /&gt;&lt;br /&gt;MARCAR NA AGENDA!!!!!&lt;br /&gt;&lt;br /&gt;Se a resposta for massiva, a poupança energética pode ser brutal.&lt;br /&gt;Só 5  minutos, para ver o que acontece.&lt;br /&gt;Sim, estaremos 5 minutos às escuras, podemos acender uma vela e&lt;br /&gt;simplesmente ficar a olhar para ela, estaremos  a respirar nós e o&lt;br /&gt;planeta.&lt;br /&gt;Lembrem-se  que a  união faz a força e a Internet pode ter muito poder&lt;br /&gt;e podemos mesmo fazer algo em grande.&lt;br /&gt;Passa a notícia, se tiveres amigos a viver noutros países envia-lhes e&lt;br /&gt;pede-lhes que façam a tradução e adaptem as horas.&lt;/i&gt;&lt;br /&gt;&lt;span style="color: green; font-weight:bold;"&gt;[/CODE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Claro que para averiguar a veracidade dos fatos fui jogar no Google e numa pesquisa rápida a única referência a isto que encontrei foi:&lt;br /&gt;&lt;a href="http://tresemdezembro.blogspot.com/2008/02/what-do-you-say.html"&gt;http://tresemdezembro.blogspot.com/2008/02/what-do-you-say.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Não há link para uma notícia de um jornal sério por exemplo, e como é óbvio é mais uma daquelas coisas que alguém resolveu inventar.&lt;br /&gt;&lt;br /&gt;Fiquei a pensar como isto não faz sentido, por exemplo, sempre que vou dormir tudo em casa fica desligado, logo faço um grande apagão lá em casa (afinal a conta da luz não é barata), se eu dormir 5 minutos a mais (como custumo fazer todos os dias e saio sempre atrasado) já estou colaborando com o planeta!&lt;br /&gt;&lt;br /&gt;Agora vai ser lindo ver um bando de gente desligando tudo durante 5 minutos. E eu vou fazer o contrário, vou ligar tudo! Por isso em vez de desligar tudo no dia 29, vamos liguar tudo e vamos ver se a companhia elétrica aguenta :P&lt;br /&gt;&lt;br /&gt;Mas pelo que parece houve uma iniciativa mundial com esta finalidade, mas em 1 de fevereiro de 2007. &lt;a href="http://jn.sapo.pt/2007/02/01/sociedade_e_vida/apagao_mundial_preocupa_rede_electri.html"&gt;Como pode ser verificado aqui.&lt;/a&gt; Então parece que gostaram da idéia e resolveram organizar um evento destes todo ano, neste ano já vai com atraso...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-2592984736122548111?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/2592984736122548111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/02/apago-mundial-29-fev-08-pelo-nosso.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/2592984736122548111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/2592984736122548111'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/02/apago-mundial-29-fev-08-pelo-nosso.html' title='Apagão mundial a 29 Fev 08 (PELO NOSSO PLANETA) ???'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-8479739945670795106</id><published>2008-01-14T15:08:00.001-08:00</published><updated>2008-10-01T08:42:34.887-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Restaurar Base de Dados no SQLServer</title><content type='html'>Podia ser muito mais simples, mas para que facilitar se da para complicar? E para eu nunca esquecer como restaurar uma base de dados no SQLServer, resolvi fazer este post.&lt;br /&gt;&lt;br /&gt;Quando se tenta pelas vias normais e da o erro:&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(255, 0, 0);"&gt;Restore failed for Server...&lt;/span&gt;&lt;br /&gt;E tenta por script e da outro erro:&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(255, 0, 0);"&gt;Directory lookup for the file...&lt;/span&gt;&lt;br /&gt;E se a base de dados esta em uso:&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(255, 0, 0);"&gt;Exclusive access could not be obtained because the database is in use.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Então esta faltando é os comandos corretos...&lt;br /&gt;&lt;br /&gt;Limpar as conexões ativas:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;USE Master&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ALTER DATABASE YOUR_DATABASE_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;USE Master&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; ALTER DATABASE YOUR_DATABASE_NAME SET MULTI_USER WITH ROLLBACK IMMEDIATE&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; GO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para poder ver o nome do Data e do Log, e ainda outros dados do backup, informações precisosas para o próximo passo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;RESTORE FILELISTONLY FROM DISK = 'C:\BACKUP.bak'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora é so fazer o restore assim:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;RESTORE DATABASE NewDataBaseName FROM DISK = 'C:\BACKUP.bak'&lt;br /&gt;WITH&lt;br /&gt;MOVE 'BackupDatabase_Data' TO 'C:\MSSQL\Data\NewDataBaseName.mdf',&lt;br /&gt;MOVE 'BackupDatabase_Log' TO 'C:\MSSQL\Data\NewDataBaseName.ldf'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora já sei aonde encontrar isto mais rápido da próxima vez :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-8479739945670795106?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/8479739945670795106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/01/restaurar-base-de-dados-no-sqlserver.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/8479739945670795106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/8479739945670795106'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/01/restaurar-base-de-dados-no-sqlserver.html' title='Restaurar Base de Dados no SQLServer'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-2449476172778342762</id><published>2008-01-13T04:27:00.000-08:00</published><updated>2008-01-31T12:55:44.749-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>NetBeans 6 vs OpenSuse 10.3</title><content type='html'>Se tiver problemas com OpenSuse 10.3 para rodar o NetBeans 6, o bug-buddy acusando um bug e parando a execução logo na inicialização. Então vou explicar como instalar o JDK 6 e o NetBeans 6 no OpenSuse 10.3 e resolver este problema.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight:bold;"&gt;Instalação JDK 6:&lt;/span&gt;&lt;br /&gt;- Em &lt;a href="http://java.sun.com"&gt;java.sun.com&lt;/a&gt; abrir o link para o Java SE, depois fazer o download do JDK 6 Update 4 versão para  Linux o que tem a extenção .rpm.bin: &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;jdk-6u4-linux-x64-rpm.bin&lt;/span&gt;&lt;br /&gt;- Dar permissões de execução para o arquivo:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;chmod +x jdk-6u4-linux-x64-rpm.bin&lt;/span&gt;&lt;br /&gt;- Executar:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;./jdk-6u4-linux-x64-rpm.bin&lt;/span&gt;&lt;br /&gt;- Vai ser criado no mesmo diretório varios arquivos *.rpm, para instalar execute: &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;sudo /sbin/yast2 -i jdk-6u4-linux-amd64.rpm&lt;/span&gt;&lt;br /&gt;- O JDK 6 será instalado em:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;/usr/java/jdk1.6.0_04&lt;/span&gt;&lt;br /&gt;- E também terá estes atalhos para o jdk:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;/usr/java/latest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;/usr/java/default&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight:bold;"&gt;Instalação NetBeans 6:&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;- Em &lt;a href="http://www.netbeans.org"&gt;www.netbeans.org&lt;/a&gt; faça o download do NetBeans 6 versão Linux, eu usei a versão "All".&lt;br /&gt;- Dar permissões de execução para o arquivo:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;chmod +x netbeans-6.0-linux.sh&lt;/span&gt;&lt;br /&gt;- Eu instalei em /opt, caso queira instalar ai também faça assim:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;sudo mkdir /opt/netbeans-6.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;sudo chmod a+rwx /opt/netbeans-6.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;sudo mkdir /opt/glassfish-v2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;sudo chmod a+rwx /opt/glassfish-v2&lt;/span&gt;&lt;br /&gt;- Agora execute o arquivo de instalação do NetBeans 6, e escolha a pasta de instalação, se for no &lt;span style="font-weight:bold;"&gt;/opt/netbeans-6.0&lt;/span&gt; escolha esta pasta e o GlassFish também &lt;span style="font-weight:bold;"&gt;/opt/glassfish-v2&lt;/span&gt;, e eu coloquei em JDK &lt;span style="font-weight:bold;"&gt;/usr/java/latest&lt;/span&gt;.&lt;br /&gt;- Será criado atalhos no desktop e nos programas.&lt;br /&gt;- Execute...&lt;br /&gt;&lt;br /&gt;Caso de Error, do bug-buddy, como aconteceu no meu caso, ele pode ser removido, não vai fazer falta, para o remover execute:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;sudo zypper rm bug-buddy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora é só executar outra vez e deverá ter o problema resolvido, e o NetBeans 6 a funcionar perfeitamente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-2449476172778342762?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/2449476172778342762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/01/netbeans-6-vs-opensuse-103.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/2449476172778342762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/2449476172778342762'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/01/netbeans-6-vs-opensuse-103.html' title='NetBeans 6 vs OpenSuse 10.3'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-5561997386757633972</id><published>2008-01-11T06:07:00.000-08:00</published><updated>2008-01-11T06:54:10.128-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>TextBoxRevolution</title><content type='html'>Precisei fazer uma TextBox com fundo transparente e também imagem de fundo, totalmente customizada, procurei na net e encontrei uma base, então resolvi melhorar e organizar bem o código, e esta ai o resultado.&lt;br /&gt;&lt;br /&gt;Uma coisa que as vezes faz falta no Windows.Form, é o Attributes nos Controls, algo que temos no Asp.Net mas não no Windows.Form, e como eu também precisava deste recurso na TextBox então resolvi implementar isto também, por isso esta TextBox também suporta o Attributes, TextBoxRevolution.Attributes, assim já é possível anexar outros objetos ao Control.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight: bold;"&gt;[CODE]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;using&lt;/span&gt; System&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;using&lt;/span&gt; System&lt;span style="color:#000000"&gt;.&lt;/span&gt;Collections&lt;span style="color:#000000"&gt;.&lt;/span&gt;Generic&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;using&lt;/span&gt; System&lt;span style="color:#000000"&gt;.&lt;/span&gt;Windows&lt;span style="color:#000000"&gt;.&lt;/span&gt;Forms&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;using&lt;/span&gt; System&lt;span style="color:#000000"&gt;.&lt;/span&gt;Drawing&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;using&lt;/span&gt; System&lt;span style="color:#000000"&gt;.&lt;/span&gt;Drawing&lt;span style="color:#000000"&gt;.&lt;/span&gt;Imaging&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;using&lt;/span&gt; System&lt;span style="color:#000000"&gt;.&lt;/span&gt;Runtime&lt;span style="color:#000000"&gt;.&lt;/span&gt;InteropServices&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;using&lt;/span&gt; System&lt;span style="color:#000000"&gt;.&lt;/span&gt;ComponentModel&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;namespace&lt;/span&gt; TextBoxRevolutionTest&lt;br /&gt;&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff; font-weight:bold"&gt;static class&lt;/span&gt; Program&lt;br /&gt;    &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#008000; font-style:italic"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#008000; font-style:italic"&gt;/// The main entry point for the application.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#008000; font-style:italic"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;[&lt;/span&gt;STAThread&lt;span style="color:#000000"&gt;]&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; &lt;span style="color:#000000"&gt;Main&lt;/span&gt;&lt;span style="color:#000000"&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            Application&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;EnableVisualStyles&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;            Application&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;SetCompatibleTextRenderingDefault&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;false&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            Form form &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;Form&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;            form&lt;span style="color:#000000"&gt;.&lt;/span&gt;Text &lt;span style="color:#000000"&gt;=&lt;/span&gt; &amp;quot;TextBoxRevolution&amp;quot;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            form&lt;span style="color:#000000"&gt;.&lt;/span&gt;Width &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;450&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            form&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;250&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; text &lt;span style="color:#000000"&gt;=&lt;/span&gt; &amp;#64;&amp;quot;&lt;br /&gt;            The Foundations of the GPL&lt;br /&gt;            Nobody should be restricted by the software they use. There are four freedoms that every user should have:&lt;br /&gt;                * the freedom to use the software for any purpose,&lt;br /&gt;                * the freedom to share the software with your friends and neighbors,&lt;br /&gt;                * the freedom to change the software to suit your needs, and&lt;br /&gt;                * the freedom to share the changes you make.&lt;br /&gt;            When a program offers users all of these freedoms, we call it free software.&lt;br /&gt;            Developers who write software can release it under the terms of the GNU GPL. When they do, it will be free software and stay free software, no matter who changes or distributes the program. We call this copyleft: the software is copyrighted, but instead of using those rights to restrict users like proprietary software does, we use them to ensure that every user has freedom.&lt;br /&gt;            &amp;quot;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            TextBoxRevolution textBoxRevolution &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;TextBoxRevolution&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;            textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Name &lt;span style="color:#000000"&gt;=&lt;/span&gt; &amp;quot;textBoxRevolution&amp;quot;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Dock &lt;span style="color:#000000"&gt;=&lt;/span&gt; DockStyle&lt;span style="color:#000000"&gt;.&lt;/span&gt;Fill&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Control&lt;span style="color:#000000"&gt;.&lt;/span&gt;Name &lt;span style="color:#000000"&gt;=&lt;/span&gt; &amp;quot;textBoxRevolutionOut&amp;quot;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Transparent &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;TopMargin &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;5&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;BorderStyle &lt;span style="color:#000000"&gt;=&lt;/span&gt; BorderStyle&lt;span style="color:#000000"&gt;.&lt;/span&gt;None&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Multiline &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;ForeColor &lt;span style="color:#000000"&gt;=&lt;/span&gt; Color&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;FromArgb&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Text &lt;span style="color:#000000"&gt;=&lt;/span&gt; text&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;Select&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Background &lt;span style="color:#000000"&gt;+=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; TextBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;OnBackground&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;textBoxRevolution_Background&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            form&lt;span style="color:#000000"&gt;.&lt;/span&gt;Controls&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;Add&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;textBoxRevolution&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            Application&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;Run&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;form&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;static&lt;/span&gt; Image &lt;span style="color:#000000"&gt;textBoxRevolution_Background&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;TextBoxRevolution textBoxRevolution&lt;span style="color:#000000"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            Color topColor &lt;span style="color:#000000"&gt;=&lt;/span&gt; Color&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;FromArgb&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#000000"&gt;235&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;237&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;241&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            Color bottomColor &lt;span style="color:#000000"&gt;=&lt;/span&gt; Color&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;FromArgb&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#000000"&gt;225&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;229&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;232&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#000000"&gt;(&lt;/span&gt;textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Control&lt;span style="color:#000000"&gt;.&lt;/span&gt;Name&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;EndsWith&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&amp;quot;Over&amp;quot;&lt;span style="color:#000000"&gt;))&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                topColor &lt;span style="color:#000000"&gt;=&lt;/span&gt; Color&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;FromArgb&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#000000"&gt;249&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;247&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;255&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;                bottomColor &lt;span style="color:#000000"&gt;=&lt;/span&gt; Color&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;FromArgb&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#000000"&gt;238&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;234&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;255&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;            Bitmap img &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;Bitmap&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Width&lt;span style="color:#000000"&gt;,&lt;/span&gt; textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            Graphics g &lt;span style="color:#000000"&gt;=&lt;/span&gt; Graphics&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;FromImage&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;img&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            g&lt;span style="color:#000000"&gt;.&lt;/span&gt;SmoothingMode &lt;span style="color:#000000"&gt;=&lt;/span&gt; System&lt;span style="color:#000000"&gt;.&lt;/span&gt;Drawing&lt;span style="color:#000000"&gt;.&lt;/span&gt;Drawing2D&lt;span style="color:#000000"&gt;.&lt;/span&gt;SmoothingMode&lt;span style="color:#000000"&gt;.&lt;/span&gt;AntiAlias&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            g&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;FillRectangle&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;SolidBrush&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;topColor&lt;span style="color:#000000"&gt;),&lt;/span&gt; &lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Width&lt;span style="color:#000000"&gt;,&lt;/span&gt; textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            g&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;FillRectangle&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;SolidBrush&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;bottomColor&lt;span style="color:#000000"&gt;),&lt;/span&gt; &lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height &lt;span style="color:#000000"&gt;/&lt;/span&gt; &lt;span style="color:#000000"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Width &lt;span style="color:#000000"&gt;-&lt;/span&gt; &lt;span style="color:#000000"&gt;50&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height &lt;span style="color:#000000"&gt;/&lt;/span&gt; &lt;span style="color:#000000"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            g&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;FillEllipse&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;SolidBrush&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;bottomColor&lt;span style="color:#000000"&gt;),&lt;/span&gt; textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Width &lt;span style="color:#000000"&gt;-&lt;/span&gt; &lt;span style="color:#000000"&gt;100&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height &lt;span style="color:#000000"&gt;/&lt;/span&gt; &lt;span style="color:#000000"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;100&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;20&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            g&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;FillRectangle&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;SolidBrush&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;bottomColor&lt;span style="color:#000000"&gt;),&lt;/span&gt; textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Width &lt;span style="color:#000000"&gt;-&lt;/span&gt; &lt;span style="color:#000000"&gt;50&lt;/span&gt;&lt;span style="color:#000000"&gt;, (&lt;/span&gt;textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height &lt;span style="color:#000000"&gt;/&lt;/span&gt; &lt;span style="color:#000000"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;) +&lt;/span&gt; &lt;span style="color:#000000"&gt;10&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Width&lt;span style="color:#000000"&gt;,&lt;/span&gt; textBoxRevolution&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height &lt;span style="color:#000000"&gt;/&lt;/span&gt; &lt;span style="color:#000000"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; img&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;namespace&lt;/span&gt; System&lt;span style="color:#000000"&gt;.&lt;/span&gt;Windows&lt;span style="color:#000000"&gt;.&lt;/span&gt;Forms&lt;br /&gt;&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff; font-weight:bold"&gt;public class&lt;/span&gt; TextBoxRevolution &lt;span style="color:#000000"&gt;:&lt;/span&gt; TextBox&lt;br /&gt;    &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public delegate&lt;/span&gt; Image &lt;span style="color:#000000"&gt;OnBackground&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;TextBoxRevolution textBoxRevolution&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public event&lt;/span&gt; OnBackground Background&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        PictureBox pictureBox &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;null&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        Dictionary&lt;span style="color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;gt;&lt;/span&gt; attributes &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; Dictionary&lt;span style="color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#000000"&gt;TextBoxRevolution&lt;/span&gt;&lt;span style="color:#000000"&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            pictureBox &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;PictureBox&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;            pictureBox&lt;span style="color:#000000"&gt;.&lt;/span&gt;Dock &lt;span style="color:#000000"&gt;=&lt;/span&gt; DockStyle&lt;span style="color:#000000"&gt;.&lt;/span&gt;Fill&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;ShortcutsEnabled &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;false&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;Cursor &lt;span style="color:#000000"&gt;=&lt;/span&gt; Cursors&lt;span style="color:#000000"&gt;.&lt;/span&gt;Arrow&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;Controls&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;Add&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;pictureBox&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; Dictionary&lt;span style="color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;gt;&lt;/span&gt; Attributes&lt;br /&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;get&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; attributes&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;set&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                attributes &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;value&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; transparent &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;false&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; Transparent&lt;br /&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;get&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; transparent&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;set&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                transparent &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;value&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; PictureBox Control&lt;br /&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;get&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; pictureBox&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; topMargin &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; TopMargin&lt;br /&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;get&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; topMargin &lt;span style="color:#000000"&gt;* -&lt;/span&gt;&lt;span style="color:#000000"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;set&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                topMargin &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;value&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;protected override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; &lt;span style="color:#000000"&gt;WndProc&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;ref Message m&lt;span style="color:#000000"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;base&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;WndProc&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;ref m&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;switch&lt;/span&gt; &lt;span style="color:#000000"&gt;(&lt;/span&gt;m&lt;span style="color:#000000"&gt;.&lt;/span&gt;Msg&lt;span style="color:#000000"&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000ff; font-weight:bold"&gt;case&lt;/span&gt; Win32&lt;span style="color:#000000"&gt;.&lt;/span&gt;WM_PAINT&lt;span style="color:#000000"&gt;:&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color:#000000"&gt;Draw&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color:#0000ff; font-weight:bold"&gt;break&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000ff; font-weight:bold"&gt;case&lt;/span&gt; Win32&lt;span style="color:#000000"&gt;.&lt;/span&gt;WM_HSCROLL&lt;span style="color:#000000"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color:#0000ff; font-weight:bold"&gt;case&lt;/span&gt; Win32&lt;span style="color:#000000"&gt;.&lt;/span&gt;WM_VSCROLL&lt;span style="color:#000000"&gt;:&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;Invalidate&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color:#0000ff; font-weight:bold"&gt;break&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; &lt;span style="color:#000000"&gt;Draw&lt;/span&gt;&lt;span style="color:#000000"&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            Bitmap bmpCaptured &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;Bitmap&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;ClientRectangle&lt;span style="color:#000000"&gt;.&lt;/span&gt;Width&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;ClientRectangle&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            Bitmap bmpResult &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;Bitmap&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;ClientRectangle&lt;span style="color:#000000"&gt;.&lt;/span&gt;Width&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;ClientRectangle&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            Rectangle r &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;Rectangle&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;ClientRectangle&lt;span style="color:#000000"&gt;.&lt;/span&gt;Width&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;ClientRectangle&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            Win32&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;CaptureWindow&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; ref bmpCaptured&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#000000"&gt;(&lt;/span&gt;Transparent&lt;span style="color:#000000"&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;SetStyle&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;ControlStyles&lt;span style="color:#000000"&gt;.&lt;/span&gt;SupportsTransparentBackColor&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;BackColor &lt;span style="color:#000000"&gt;=&lt;/span&gt; Color&lt;span style="color:#000000"&gt;.&lt;/span&gt;Transparent&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;            ImageAttributes imgAttrib &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;ImageAttributes&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#000000"&gt;(&lt;/span&gt;Transparent&lt;span style="color:#000000"&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                ColorMap&lt;span style="color:#000000"&gt;[]&lt;/span&gt; colorMap &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; ColorMap&lt;span style="color:#000000"&gt;[&lt;/span&gt;&lt;span style="color:#000000"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;];&lt;/span&gt;&lt;br /&gt;                colorMap&lt;span style="color:#000000"&gt;[&lt;/span&gt;&lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;] =&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000"&gt;ColorMap&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;                colorMap&lt;span style="color:#000000"&gt;[&lt;/span&gt;&lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;].&lt;/span&gt;OldColor &lt;span style="color:#000000"&gt;=&lt;/span&gt; Color&lt;span style="color:#000000"&gt;.&lt;/span&gt;White&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;                colorMap&lt;span style="color:#000000"&gt;[&lt;/span&gt;&lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;].&lt;/span&gt;NewColor &lt;span style="color:#000000"&gt;=&lt;/span&gt; Color&lt;span style="color:#000000"&gt;.&lt;/span&gt;Transparent&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;                imgAttrib&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;SetRemapTable&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;colorMap&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;            Graphics g &lt;span style="color:#000000"&gt;=&lt;/span&gt; Graphics&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;FromImage&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;bmpResult&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;try&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                g&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;DrawImage&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#000000"&gt;Background&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;),&lt;/span&gt; r&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;ClientRectangle&lt;span style="color:#000000"&gt;.&lt;/span&gt;Width&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;ClientRectangle&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height&lt;span style="color:#000000"&gt;,&lt;/span&gt; GraphicsUnit&lt;span style="color:#000000"&gt;.&lt;/span&gt;Pixel&lt;span style="color:#000000"&gt;,&lt;/span&gt; imgAttrib&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;catch&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;            g&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;DrawImage&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;bmpCaptured&lt;span style="color:#000000"&gt;,&lt;/span&gt; r&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; TopMargin&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;ClientRectangle&lt;span style="color:#000000"&gt;.&lt;/span&gt;Width&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;ClientRectangle&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height&lt;span style="color:#000000"&gt;,&lt;/span&gt; GraphicsUnit&lt;span style="color:#000000"&gt;.&lt;/span&gt;Pixel&lt;span style="color:#000000"&gt;,&lt;/span&gt; imgAttrib&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            g&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;Dispose&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;            pictureBox&lt;span style="color:#000000"&gt;.&lt;/span&gt;Image &lt;span style="color:#000000"&gt;= (&lt;/span&gt;Image&lt;span style="color:#000000"&gt;)&lt;/span&gt;bmpResult&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;Clone&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; ContentHeight&lt;br /&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;get&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; LinesCount &lt;span style="color:#000000"&gt;*&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;base&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;Font&lt;span style="color:#000000"&gt;.&lt;/span&gt;Height&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; LinesCount&lt;br /&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;get&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; EM_GETLINECOUNT &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;186&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; lineCount &lt;span style="color:#000000"&gt;=&lt;/span&gt; Win32&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;SendMessage&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;base&lt;/span&gt;&lt;span style="color:#000000"&gt;.&lt;/span&gt;Handle&lt;span style="color:#000000"&gt;,&lt;/span&gt; EM_GETLINECOUNT&lt;span style="color:#000000"&gt;,&lt;/span&gt; IntPtr&lt;span style="color:#000000"&gt;.&lt;/span&gt;Zero&lt;span style="color:#000000"&gt;,&lt;/span&gt; IntPtr&lt;span style="color:#000000"&gt;.&lt;/span&gt;Zero&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; lineCount &lt;span style="color:#000000"&gt;+&lt;/span&gt; &lt;span style="color:#000000"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff; font-weight:bold"&gt;public class&lt;/span&gt; Win32&lt;br /&gt;    &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; WM_MOUSEMOVE &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x0200&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; WM_LBUTTONDOWN &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x0201&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; WM_LBUTTONUP &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x0202&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; WM_RBUTTONDOWN &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x0204&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; WM_LBUTTONDBLCLK &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x0203&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; WM_MOUSELEAVE &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x02A3&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; WM_PAINT &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x000F&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; WM_ERASEBKGND &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x0014&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; WM_PRINT &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x0317&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; EN_HSCROLL &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x0601&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; EN_VSCROLL &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x0602&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; WM_HSCROLL &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x0114&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; WM_VSCROLL &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x0115&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; EM_GETSEL &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x00B0&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; EM_LINEINDEX &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x00BB&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; EM_LINEFROMCHAR &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x00C9&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; EM_POSFROMCHAR &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x00D6&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;[&lt;/span&gt;&lt;span style="color:#000000"&gt;DllImport&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&amp;quot;USER32&lt;span style="color:#000000"&gt;.&lt;/span&gt;DLL&amp;quot;&lt;span style="color:#000000"&gt;,&lt;/span&gt; EntryPoint &lt;span style="color:#000000"&gt;=&lt;/span&gt; &amp;quot;PostMessage&amp;quot;&lt;span style="color:#000000"&gt;)]&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public static&lt;/span&gt; extern &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; &lt;span style="color:#000000"&gt;PostMessage&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;IntPtr hwnd&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff"&gt;uint&lt;/span&gt; msg&lt;span style="color:#000000"&gt;,&lt;/span&gt; IntPtr wParam&lt;span style="color:#000000"&gt;,&lt;/span&gt; IntPtr lParam&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;[&lt;/span&gt;&lt;span style="color:#000000"&gt;DllImport&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&amp;quot;USER32&lt;span style="color:#000000"&gt;.&lt;/span&gt;DLL&amp;quot;&lt;span style="color:#000000"&gt;,&lt;/span&gt; EntryPoint &lt;span style="color:#000000"&gt;=&lt;/span&gt; &amp;quot;SendMessage&amp;quot;&lt;span style="color:#000000"&gt;)]&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public static&lt;/span&gt; extern &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; &lt;span style="color:#000000"&gt;SendMessage&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;IntPtr hwnd&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; msg&lt;span style="color:#000000"&gt;,&lt;/span&gt; IntPtr wParam&lt;span style="color:#000000"&gt;,&lt;/span&gt; IntPtr lParam&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;[&lt;/span&gt;&lt;span style="color:#000000"&gt;DllImport&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&amp;quot;USER32&lt;span style="color:#000000"&gt;.&lt;/span&gt;DLL&amp;quot;&lt;span style="color:#000000"&gt;,&lt;/span&gt; EntryPoint &lt;span style="color:#000000"&gt;=&lt;/span&gt; &amp;quot;GetCaretBlinkTime&amp;quot;&lt;span style="color:#000000"&gt;)]&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public static&lt;/span&gt; extern &lt;span style="color:#0000ff"&gt;uint&lt;/span&gt; &lt;span style="color:#000000"&gt;GetCaretBlinkTime&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const int&lt;/span&gt; WM_PRINTCLIENT &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x0318&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const long&lt;/span&gt; PRF_CHECKVISIBLE &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x00000001&lt;/span&gt;L&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const long&lt;/span&gt; PRF_NONCLIENT &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x00000002&lt;/span&gt;L&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const long&lt;/span&gt; PRF_CLIENT &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x00000004&lt;/span&gt;L&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const long&lt;/span&gt; PRF_ERASEBKGND &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x00000008&lt;/span&gt;L&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const long&lt;/span&gt; PRF_CHILDREN &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x00000010&lt;/span&gt;L&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;const long&lt;/span&gt; PRF_OWNED &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000"&gt;0x00000020&lt;/span&gt;L&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;public static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; &lt;span style="color:#000000"&gt;CaptureWindow&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;System&lt;span style="color:#000000"&gt;.&lt;/span&gt;Windows&lt;span style="color:#000000"&gt;.&lt;/span&gt;Forms&lt;span style="color:#000000"&gt;.&lt;/span&gt;Control control&lt;span style="color:#000000"&gt;,&lt;/span&gt; ref System&lt;span style="color:#000000"&gt;.&lt;/span&gt;Drawing&lt;span style="color:#000000"&gt;.&lt;/span&gt;Bitmap bitmap&lt;span style="color:#000000"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;            Graphics g2 &lt;span style="color:#000000"&gt;=&lt;/span&gt; Graphics&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;FromImage&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;bitmap&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; meint &lt;span style="color:#000000"&gt;= (&lt;/span&gt;&lt;span style="color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="color:#000000"&gt;)(&lt;/span&gt;PRF_CLIENT &lt;span style="color:#000000"&gt;|&lt;/span&gt; PRF_ERASEBKGND&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            System&lt;span style="color:#000000"&gt;.&lt;/span&gt;IntPtr meptr &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; System&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;IntPtr&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;meint&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            System&lt;span style="color:#000000"&gt;.&lt;/span&gt;IntPtr hdc &lt;span style="color:#000000"&gt;=&lt;/span&gt; g2&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;GetHdc&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;            Win32&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;SendMessage&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;control&lt;span style="color:#000000"&gt;.&lt;/span&gt;Handle&lt;span style="color:#000000"&gt;,&lt;/span&gt; Win32&lt;span style="color:#000000"&gt;.&lt;/span&gt;WM_PRINT&lt;span style="color:#000000"&gt;,&lt;/span&gt; hdc&lt;span style="color:#000000"&gt;,&lt;/span&gt; meptr&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            g2&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;ReleaseHdc&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;hdc&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;            g2&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000"&gt;Dispose&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;return true&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: green; font-weight: bold;"&gt;[/CODE]&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-5561997386757633972?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/5561997386757633972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2008/01/textboxrevolution.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/5561997386757633972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/5561997386757633972'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2008/01/textboxrevolution.html' title='TextBoxRevolution'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-8061501048261180174</id><published>2007-06-04T03:54:00.001-07:00</published><updated>2007-06-06T06:11:28.022-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Cache</title><content type='html'>Por razões de desempenho, para fazer menos requisições e execuções de querys na DB, surgio a necessidade de fazer cache, mas como manter os filtros e os resultado de diversas querys distintas? Tive a idéia de fazer serialização dos DataTable, e para isto fiz uma classe, que pode além de DataTable, fazer serialização de qualquer objecto que suporte serialization.&lt;br /&gt;&lt;br /&gt;Exemplo do uso da classe Cache:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight: bold;"&gt;[CODE]&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#2B91AF'&gt;Cache&lt;/span&gt; cache = &lt;span style='color:#3D81EE'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;Cache&lt;/span&gt;(&lt;span style='color:#2B91AF'&gt;WebConfigurationManager&lt;/span&gt;.AppSettings[&lt;span style='color:#f2984c'&gt;&amp;quot;CacheFolder&amp;quot;&lt;/span&gt;]);&lt;br /&gt;&lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (cache.PleaseSaveMe(query))&lt;br /&gt;{&lt;br /&gt;cache.Save(query, dv.Table, &lt;span style='color:#2B91AF'&gt;WebConfigurationManager&lt;/span&gt;.AppSettings[&lt;span style='color:#f2984c'&gt;&amp;quot;CacheTime&amp;quot;&lt;/span&gt;]);&lt;br /&gt;}&lt;br /&gt;&lt;span style='color:#3D81EE'&gt;else&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;(&lt;span style='color:#2B91AF'&gt;DataTable&lt;/span&gt;)cache.Load(query);&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: green; font-weight: bold;"&gt;[/CODE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Neste caso usei a query para servir de ID para o Cache, ou seja sempre que for uma query diferente é gravado em Cache o DataTable gerado por esta query, ou se for uma query já executada então o DataTable é recuperado.&lt;br /&gt;&lt;br /&gt;Descrição:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight: bold;"&gt;[CODE]&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#3D81EE'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;Cache&lt;/span&gt;(&lt;span style='color:#f2984c'&gt;&amp;quot;CACHE_FOLDER&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (cache.&lt;b&gt;PleaseSaveMe&lt;/b&gt;(&lt;span style='color:#f2984c'&gt;&amp;quot;CACHE_ID&amp;quot;&lt;/span&gt;))&lt;br /&gt;{&lt;br /&gt;cache.&lt;b&gt;Save&lt;/b&gt;(&lt;span style='color:#f2984c'&gt;&amp;quot;CACHE_ID&amp;quot;&lt;/span&gt;, &lt;span style='color:#2B91AF'&gt;CACHE_OBJECT&lt;/span&gt;, &lt;span style='color:#f2984c'&gt;&amp;quot;CACHE_TIME&amp;quot;&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;span style='color:#3D81EE'&gt;else&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;(&lt;span style='color:#2B91AF'&gt;CACHE_OBJECT&lt;/span&gt;)cache.&lt;b&gt;Load&lt;/b&gt;(&lt;span style='color:#f2984c'&gt;&amp;quot;CACHE_ID&amp;quot;&lt;/span&gt;)&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: green; font-weight: bold;"&gt;[/CODE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CACHE_FOLDER&lt;/b&gt; é o caminho para a pasta que vai conter os arquivos de cache.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CACHE_ID&lt;/b&gt; é o ID de referência de um objeto em cache, é a chave para poder recupera-lo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CACHE_OBJECT&lt;/b&gt; é o objecto que será gravado em cache, lembrando que tem o objeto tem que suportar serialization.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CACHE_TIME&lt;/b&gt; define o tempo em que o objeto ficará em cache, pode ser passado no seguinte formato (também é possível em long):&lt;br /&gt; &amp;nbsp; - &lt;b&gt;"2W"&lt;/b&gt; = 2 semanas&lt;br /&gt; &amp;nbsp; - &lt;b&gt;"5D"&lt;/b&gt; = 5 dias&lt;br /&gt; &amp;nbsp; - &lt;b&gt;"1H"&lt;/b&gt; = 1 hora&lt;br /&gt; &amp;nbsp; - &lt;b&gt;"15M"&lt;/b&gt; = 15 minutos&lt;br /&gt; &amp;nbsp; - &lt;b&gt;"50S"&lt;/b&gt; = 50 segundos&lt;br /&gt;&lt;br /&gt;&lt;b&gt;cache.PleaseSaveMe&lt;/b&gt; verifica se é necessário gravar o cache.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;cache.Save&lt;/b&gt; grava um novo ou sobrepõe o objeto em cache.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;cache.Load&lt;/b&gt; recupera o objeto que esta em cache.&lt;br /&gt;&lt;br /&gt;Para cada objeto em cache é gerado 3 arquivos.&lt;br /&gt;&lt;br /&gt; &amp;nbsp; - [GUID]&lt;b&gt;.id.cache&lt;/b&gt; identificador do cache, o tal ID que é passado no save, e que é usado para recuperar o objeto.&lt;br /&gt;&lt;br /&gt; &amp;nbsp; - [GUID]&lt;b&gt;.obj.cache&lt;/b&gt; arquivo do objeto serializado.&lt;br /&gt;&lt;br /&gt; &amp;nbsp; - [GUID]&lt;b&gt;.time.cache&lt;/b&gt; tempo que esta em cache.&lt;br /&gt;&lt;br /&gt;Código da Class Cache:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight: bold;"&gt;[CODE]&lt;/span&gt;&lt;br /&gt;&lt;div style='text-autospace:none'&gt;&lt;span style='color:#3D81EE'&gt;using&lt;/span&gt;&lt;span style=''&gt; System;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style='color:#3D81EE'&gt;using&lt;/span&gt;&lt;span style=''&gt; System.IO;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style='color:#3D81EE'&gt;using&lt;/span&gt;&lt;span style=''&gt; System.Runtime.Serialization;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style='color:#3D81EE'&gt;using&lt;/span&gt;&lt;span  style=''&gt; System.Runtime.Serialization.Formatters.Binary;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style='color:#3D81EE'&gt;public&lt;/span&gt;&lt;span  style=''&gt; &lt;span style='color:#3D81EE'&gt;class&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;Cache&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;{&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;const&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; ID_EXT = &lt;span style='color:#f2984c'&gt;&amp;quot;.id.cache&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;const&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; TIME_EXT = &lt;span style='color:#f2984c'&gt;&amp;quot;.time.cache&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;const&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; OBJ_EXT = &lt;span style='color:#f2984c'&gt;&amp;quot;.obj.cache&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;private&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; folder = &lt;span style='color:#f2984c'&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;const&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;long&lt;/span&gt; WEEK = 6048000000000L;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;const&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;long&lt;/span&gt; DAY = 864000000000L;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;const&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;long&lt;/span&gt; HOUR = 36000000000L;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;const&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;long&lt;/span&gt; MINUTE = 600000000L;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;const&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;long&lt;/span&gt; SECOND = 10000000L;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;      &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; Cache(&lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; _folder)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;      {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        folder = _folder;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;      }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; GetGuid(&lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; id)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt;[] files = &lt;span style='color:#2B91AF'&gt;Directory&lt;/span&gt;.GetFiles(folder);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; guid = &lt;span style='color:#f2984c'&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;foreach&lt;/span&gt; (&lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; file_id &lt;span style='color:#3D81EE'&gt;in&lt;/span&gt; files)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            &lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (file_id.EndsWith(ID_EXT))&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#2B91AF'&gt;StreamReader&lt;/span&gt; srID = &lt;span style='color:#3D81EE'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;StreamReader&lt;/span&gt;(file_id);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (id == srID.ReadToEnd())&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    guid = file_id.Replace(folder, &lt;span style='color:#f2984c'&gt;&amp;quot;&amp;quot;&lt;/span&gt;).Replace(ID_EXT, &lt;span style='color:#f2984c'&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                srID.Close();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (guid != &lt;span style='color:#f2984c'&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#3D81EE'&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;return&lt;/span&gt; guid;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;object&lt;/span&gt; Load(&lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; id)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; fileOBJ = folder + GetGuid(id) + OBJ_EXT;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#2B91AF'&gt;FileStream&lt;/span&gt; fsOBJ = &lt;span style='color:#3D81EE'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;FileStream&lt;/span&gt;(fileOBJ, &lt;span style='color:#2B91AF'&gt;FileMode&lt;/span&gt;.Open);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;object&lt;/span&gt; obj = &lt;span style='color:#3D81EE'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;BinaryFormatter&lt;/span&gt;().Deserialize(fsOBJ);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        fsOBJ.Close();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;return&lt;/span&gt; obj;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;void&lt;/span&gt; Save(&lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; id, &lt;span style='color:#3D81EE'&gt;object&lt;/span&gt; obj, &lt;span style='color:#3D81EE'&gt;long&lt;/span&gt; lifeTime)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        Save(id, obj, lifeTime.ToString(), &lt;span style='color:#3D81EE'&gt;true&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;void&lt;/span&gt; Save(&lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; id, &lt;span style='color:#3D81EE'&gt;object&lt;/span&gt; obj, &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; lifeTime)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        Save(id, obj, lifeTime, &lt;span style='color:#3D81EE'&gt;false&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;private&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;void&lt;/span&gt; Save(&lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; id, &lt;span style='color:#3D81EE'&gt;object&lt;/span&gt; obj, &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; lifeTime, &lt;span style='color:#3D81EE'&gt;bool&lt;/span&gt; lifeTimeIsLong)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        Clear(id);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (!lifeTimeIsLong)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; timeType = lifeTime.Substring(lifeTime.Length - 1);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            &lt;span style='color:#3D81EE'&gt;long&lt;/span&gt; time = &lt;span style='color:#2B91AF'&gt;Convert&lt;/span&gt;.ToInt64(lifeTime.Substring(0, lifeTime.Length - 1));&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            &lt;span style='color:#3D81EE'&gt;switch&lt;/span&gt; (timeType.ToUpper())&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;case&lt;/span&gt; &lt;span style='color:#f2984c'&gt;&amp;quot;W&amp;quot;&lt;/span&gt;:&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    lifeTime = &lt;span style='color:#f2984c'&gt;&amp;quot;&amp;quot;&lt;/span&gt;+ (time * WEEK);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#3D81EE'&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;case&lt;/span&gt; &lt;span style='color:#f2984c'&gt;&amp;quot;D&amp;quot;&lt;/span&gt;:&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    lifeTime = &lt;span style='color:#f2984c'&gt;&amp;quot;&amp;quot;&lt;/span&gt;+ (time * DAY);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#3D81EE'&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;case&lt;/span&gt; &lt;span style='color:#f2984c'&gt;&amp;quot;H&amp;quot;&lt;/span&gt;:&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    lifeTime = &lt;span style='color:#f2984c'&gt;&amp;quot;&amp;quot;&lt;/span&gt;+ (time * HOUR);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#3D81EE'&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;case&lt;/span&gt; &lt;span style='color:#f2984c'&gt;&amp;quot;M&amp;quot;&lt;/span&gt;:&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    lifeTime = &lt;span style='color:#f2984c'&gt;&amp;quot;&amp;quot;&lt;/span&gt;+ (time * MINUTE);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#3D81EE'&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;case&lt;/span&gt; &lt;span style='color:#f2984c'&gt;&amp;quot;S&amp;quot;&lt;/span&gt;:&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    lifeTime = &lt;span style='color:#f2984c'&gt;&amp;quot;&amp;quot;&lt;/span&gt;+ (time * SECOND);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#3D81EE'&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;default&lt;/span&gt;:&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#3D81EE'&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; file = folder + &lt;span style='color:#2B91AF'&gt;Guid&lt;/span&gt;.NewGuid().ToString();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; file_id = file + ID_EXT;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; file_time = file + TIME_EXT;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; file_obj = file + OBJ_EXT;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#2B91AF'&gt;StreamWriter&lt;/span&gt; swID = &lt;span style='color:#2B91AF'&gt;File&lt;/span&gt;.CreateText(file_id);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        swID.Write(id);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        swID.Close();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#2B91AF'&gt;StreamWriter&lt;/span&gt; swTIME = &lt;span style='color:#2B91AF'&gt;File&lt;/span&gt;.CreateText(file_time);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        swTIME.WriteLine(&lt;span style='color:#2B91AF'&gt;DateTime&lt;/span&gt;.Now.Ticks.ToString());&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        swTIME.WriteLine(lifeTime);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        swTIME.Close();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#2B91AF'&gt;MemoryStream&lt;/span&gt; msOBJ = &lt;span style='color:#3D81EE'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;MemoryStream&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;BinaryFormatter&lt;/span&gt;().Serialize(msOBJ, obj);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#2B91AF'&gt;FileStream&lt;/span&gt; fsOBJECT = &lt;span style='color:#2B91AF'&gt;File&lt;/span&gt;.Create(file_obj);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        fsOBJECT.Write(msOBJ.ToArray(), 0, (&lt;span style='color:#3D81EE'&gt;int&lt;/span&gt;)msOBJ.Length);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        fsOBJECT.Flush();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        fsOBJECT.Close();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        msOBJ.Close();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;bool&lt;/span&gt; PleaseSaveMe(&lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; id)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt;[] files = &lt;span style='color:#2B91AF'&gt;Directory&lt;/span&gt;.GetFiles(folder);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;bool&lt;/span&gt; found = &lt;span style='color:#3D81EE'&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;bool&lt;/span&gt; result = &lt;span style='color:#3D81EE'&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;foreach&lt;/span&gt; (&lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; file_id &lt;span style='color:#3D81EE'&gt;in&lt;/span&gt; files)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            &lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (file_id.EndsWith(ID_EXT))&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; file_time = file_id.Replace(ID_EXT, TIME_EXT);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#2B91AF'&gt;StreamReader&lt;/span&gt; srID = &lt;span style='color:#3D81EE'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;StreamReader&lt;/span&gt;(file_id);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#2B91AF'&gt;StreamReader&lt;/span&gt; srTIME = &lt;span style='color:#3D81EE'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;StreamReader&lt;/span&gt;(file_time);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; _id = srID.ReadToEnd();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;long&lt;/span&gt; createTime = &lt;span style='color:#2B91AF'&gt;Convert&lt;/span&gt;.ToInt64(srTIME.ReadLine());&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;long&lt;/span&gt; lifeTime = &lt;span style='color:#2B91AF'&gt;Convert&lt;/span&gt;.ToInt64(srTIME.ReadLine());&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                srID.Close();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                srTIME.Close();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (id == _id)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    found = &lt;span style='color:#3D81EE'&gt;true&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (&lt;span style='color:#2B91AF'&gt;DateTime&lt;/span&gt;.Now.Ticks - lifeTime &amp;gt; createTime)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                        result = &lt;span style='color:#3D81EE'&gt;true&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#3D81EE'&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (found == &lt;span style='color:#3D81EE'&gt;false&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            &lt;span style='color:#3D81EE'&gt;return&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;true&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;return&lt;/span&gt; result;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;void&lt;/span&gt; Clear()&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        Clear(&lt;span style='color:#f2984c'&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    &lt;span style='color:#3D81EE'&gt;public&lt;/span&gt; &lt;span style='color:#3D81EE'&gt;void&lt;/span&gt; Clear(&lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; id)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt;[] files = &lt;span style='color:#2B91AF'&gt;Directory&lt;/span&gt;.GetFiles(folder);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        &lt;span style='color:#3D81EE'&gt;foreach&lt;/span&gt; (&lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; file_id &lt;span style='color:#3D81EE'&gt;in&lt;/span&gt; files)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            &lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (file_id.EndsWith(ID_EXT))&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; file_time = file_id.Replace(ID_EXT, TIME_EXT);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#2B91AF'&gt;StreamReader&lt;/span&gt; srID = &lt;span style='color:#3D81EE'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;StreamReader&lt;/span&gt;(file_id);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#2B91AF'&gt;StreamReader&lt;/span&gt; srTIME = &lt;span style='color:#3D81EE'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;StreamReader&lt;/span&gt;(file_time);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;string&lt;/span&gt; _id = srID.ReadToEnd();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;long&lt;/span&gt; createTime = &lt;span style='color:#2B91AF'&gt;Convert&lt;/span&gt;.ToInt64(srTIME.ReadLine());&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;long&lt;/span&gt; lifeTime = &lt;span style='color:#2B91AF'&gt;Convert&lt;/span&gt;.ToInt64(srTIME.ReadLine());&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                srID.Close();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                srTIME.Close();&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (id == _id)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#2B91AF'&gt;File&lt;/span&gt;.Delete(file_id);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#2B91AF'&gt;File&lt;/span&gt;.Delete(file_time);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#2B91AF'&gt;File&lt;/span&gt;.Delete(file_id.Replace(ID_EXT, OBJ_EXT));&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                &lt;span style='color:#3D81EE'&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;span style='color:#3D81EE'&gt;if&lt;/span&gt; (&lt;span style='color:#2B91AF'&gt;DateTime&lt;/span&gt;.Now.Ticks - lifeTime &amp;gt; createTime)&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    {&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                        &lt;span style='color:#2B91AF'&gt;File&lt;/span&gt;.Delete(file_id);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                        &lt;span style='color:#2B91AF'&gt;File&lt;/span&gt;.Delete(file_time);&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                        &lt;span style='color:#2B91AF'&gt;File&lt;/span&gt;.Delete(file_id.Replace(ID_EXT, OBJ_EXT));&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                    &lt;/span&gt;&lt;span style=''&gt;}&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;                }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;            }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;        }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;    }&lt;/span&gt;&lt;/div&gt;  &lt;div style='text-autospace:none'&gt;&lt;span style=''&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: green; font-weight: bold;"&gt;[/CODE]&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-8061501048261180174?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/8061501048261180174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2007/06/cache.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/8061501048261180174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/8061501048261180174'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2007/06/cache.html' title='Cache'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2464965528232475951.post-694057438680496187</id><published>2007-06-04T02:29:00.000-07:00</published><updated>2008-09-01T06:57:53.297-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Object.clone();</title><content type='html'>Para entender como funciona a clonagem de objetos em Java fiz este exemplo, basta analizar o codigo e a execuçao, e tirar as proprias conclusões :P&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight: bold;"&gt;[CODE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;class&lt;/span&gt; RunVehiclesClone {&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;static&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;void&lt;/span&gt; main(String[] args) {&lt;br /&gt;                System.out.println();&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;===================================&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println();&lt;br /&gt;                run();&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;===================================&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println();&lt;br /&gt;                runClone();&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;===================================&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println();&lt;br /&gt;                runCloneDeep();&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;===================================&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println();&lt;br /&gt;                runCloneSerialization();&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;===================================&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println();&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;private&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;static&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;void&lt;/span&gt; run() {&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;-----------------------------------&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;NORMAL&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;-----------------------------------&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                java.util.List&amp;lt;Vehicle&amp;gt; listVehicles = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; java.util.ArrayList();&lt;br /&gt;                                &lt;br /&gt;                Vehicle vehicle = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; Vehicle();&lt;br /&gt;                vehicle.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Vehicle&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                VehicleDescription vehicleDescription = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; VehicleDescription();&lt;br /&gt;                vehicleDescription.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Description&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                vehicle.setVehicleDescription(vehicleDescription);&lt;br /&gt;                &lt;br /&gt;                listVehicles.add(vehicle);&lt;br /&gt;                &lt;br /&gt;                Vehicle superBike = vehicle;&lt;br /&gt;                superBike.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;SuperBike&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                superBike.getVehicleDescription().setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Kawasaki Ninja ZXR6&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                listVehicles.add(superBike);&lt;br /&gt;                        &lt;br /&gt;                Vehicle car = vehicle;&lt;br /&gt;                car.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Car&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                car.getVehicleDescription().setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Audi A3&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                listVehicles.add(car);&lt;br /&gt;                &lt;br /&gt;                System.out.println();&lt;br /&gt;                &lt;span style="color: #3D81EE;"&gt;for&lt;/span&gt; (Vehicle _vehicle : listVehicles) {&lt;br /&gt;                        System.out.println(_vehicle);&lt;br /&gt;                        System.out.println();&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;private&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;static&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;void&lt;/span&gt; runClone() {&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;-----------------------------------&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;CLONE&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;-----------------------------------&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                java.util.List&amp;lt;Vehicle&amp;gt; listVehicles = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; java.util.ArrayList();&lt;br /&gt;                                &lt;br /&gt;                Vehicle vehicle = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; Vehicle();&lt;br /&gt;                vehicle.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Vehicle&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                VehicleDescription vehicleDescription = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; VehicleDescription();&lt;br /&gt;                vehicleDescription.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Description&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                vehicle.setVehicleDescription(vehicleDescription);&lt;br /&gt;                &lt;br /&gt;                listVehicles.add(vehicle);&lt;br /&gt;                &lt;br /&gt;                Vehicle superBike = (Vehicle)vehicle.clone();&lt;br /&gt;                superBike.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;SuperBike&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                superBike.getVehicleDescription().setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Kawasaki Ninja ZXR6&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                listVehicles.add(superBike);&lt;br /&gt;                        &lt;br /&gt;                Vehicle car = (Vehicle)vehicle.clone();&lt;br /&gt;                car.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Car&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                car.getVehicleDescription().setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Audi A3&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                listVehicles.add(car);&lt;br /&gt;                &lt;br /&gt;                System.out.println();&lt;br /&gt;                &lt;span style="color: #3D81EE;"&gt;for&lt;/span&gt; (Vehicle _vehicle : listVehicles) {&lt;br /&gt;                        System.out.println(_vehicle);&lt;br /&gt;                        System.out.println();&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;private&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;static&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;void&lt;/span&gt; runCloneDeep() {&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;-----------------------------------&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;CLONE &amp;gt; DEEP&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;-----------------------------------&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                java.util.List&amp;lt;Vehicle&amp;gt; listVehicles = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; java.util.ArrayList();&lt;br /&gt;                                &lt;br /&gt;                Vehicle vehicle = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; Vehicle();&lt;br /&gt;                vehicle.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Vehicle&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                VehicleDescription vehicleDescription = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; VehicleDescription();&lt;br /&gt;                vehicleDescription.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Description&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                vehicle.setVehicleDescription(vehicleDescription);&lt;br /&gt;                &lt;br /&gt;                listVehicles.add(vehicle);&lt;br /&gt;                &lt;br /&gt;                Vehicle superBike = (Vehicle)vehicle.cloneDeep();&lt;br /&gt;                superBike.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;SuperBike&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                superBike.getVehicleDescription().setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Kawasaki Ninja ZXR6&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                listVehicles.add(superBike);&lt;br /&gt;                        &lt;br /&gt;                Vehicle car = (Vehicle)vehicle.cloneDeep();&lt;br /&gt;                car.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Car&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                car.getVehicleDescription().setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Audi A3&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                listVehicles.add(car);&lt;br /&gt;                &lt;br /&gt;                System.out.println();&lt;br /&gt;                &lt;span style="color: #3D81EE;"&gt;for&lt;/span&gt; (Vehicle _vehicle : listVehicles) {&lt;br /&gt;                        System.out.println(_vehicle);&lt;br /&gt;                        System.out.println();&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;private&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;static&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;void&lt;/span&gt; runCloneSerialization() {&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;-----------------------------------&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;CLONE &amp;gt; SERIALIZATION&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                System.out.println(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;-----------------------------------&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                java.util.List&amp;lt;Vehicle&amp;gt; listVehicles = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; java.util.ArrayList();&lt;br /&gt;                                &lt;br /&gt;                Vehicle vehicle = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; Vehicle();&lt;br /&gt;                vehicle.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Vehicle&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                VehicleDescription vehicleDescription = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; VehicleDescription();&lt;br /&gt;                vehicleDescription.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Description&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                vehicle.setVehicleDescription(vehicleDescription);&lt;br /&gt;                &lt;br /&gt;                listVehicles.add(vehicle);&lt;br /&gt;                &lt;br /&gt;                Vehicle superBike = (Vehicle)vehicle.cloneSerialization();&lt;br /&gt;                superBike.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;SuperBike&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                superBike.getVehicleDescription().setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Kawasaki Ninja ZXR6&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                listVehicles.add(superBike);&lt;br /&gt;                        &lt;br /&gt;                Vehicle car = (Vehicle)vehicle.cloneSerialization();&lt;br /&gt;                car.setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Car&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                car.getVehicleDescription().setName(&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Audi A3&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                &lt;br /&gt;                listVehicles.add(car);&lt;br /&gt;                &lt;br /&gt;                System.out.println();&lt;br /&gt;                &lt;span style="color: #3D81EE;"&gt;for&lt;/span&gt; (Vehicle _vehicle : listVehicles) {&lt;br /&gt;                        System.out.println(_vehicle);&lt;br /&gt;                        System.out.println();&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #737373;"&gt;//////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3D81EE;"&gt;class&lt;/span&gt; Vehicle &lt;span style="color: #3D81EE;"&gt;implements&lt;/span&gt; java.io.Serializable, Cloneable {&lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;private&lt;/span&gt; String name = &lt;span style="color: #f2984c;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;private&lt;/span&gt; VehicleDescription vehicleDescription = &lt;span style="color: #3D81EE;"&gt;null&lt;/span&gt;;&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; Vehicle() {&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;void&lt;/span&gt; setName(String _name) {&lt;br /&gt;                name = _name;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; String getName() {&lt;br /&gt;                &lt;span style="color: #3D81EE;"&gt;return&lt;/span&gt; name;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;void&lt;/span&gt; setVehicleDescription(VehicleDescription _vehicleDescription) {&lt;br /&gt;                vehicleDescription = _vehicleDescription;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; VehicleDescription getVehicleDescription() {&lt;br /&gt;                &lt;span style="color: #3D81EE;"&gt;return&lt;/span&gt; vehicleDescription;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; Object clone() {&lt;br /&gt;                &lt;span style="color: #3D81EE;"&gt;try&lt;/span&gt; {&lt;br /&gt;                        &lt;span style="color: #3D81EE;"&gt;return&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;super&lt;/span&gt;.clone();&lt;br /&gt;                } &lt;span style="color: #3D81EE;"&gt;catch&lt;/span&gt;(CloneNotSupportedException e) {&lt;br /&gt;                        &lt;span style="color: #3D81EE;"&gt;throw&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; Error (&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Cannot clone this object.&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; Object cloneDeep() {&lt;br /&gt;                &lt;span style="color: #3D81EE;"&gt;try&lt;/span&gt; {&lt;br /&gt;                        Vehicle vehicle = (Vehicle)&lt;span style="color: #3D81EE;"&gt;super&lt;/span&gt;.clone();&lt;br /&gt;                        VehicleDescription _vehicleDescription = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; VehicleDescription();&lt;br /&gt;                        _vehicleDescription.setName(getVehicleDescription().getName());&lt;br /&gt;                        vehicle.setVehicleDescription(_vehicleDescription);&lt;br /&gt;                        &lt;span style="color: #3D81EE;"&gt;return&lt;/span&gt; vehicle;&lt;br /&gt;                } &lt;span style="color: #3D81EE;"&gt;catch&lt;/span&gt;(CloneNotSupportedException e) {&lt;br /&gt;                        &lt;span style="color: #3D81EE;"&gt;throw&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; Error (&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Cannot clone this object.&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; Object cloneSerialization() {&lt;br /&gt;                java.io.ObjectOutputStream oos = &lt;span style="color: #3D81EE;"&gt;null&lt;/span&gt;;&lt;br /&gt;                java.io.ObjectInputStream ois = &lt;span style="color: #3D81EE;"&gt;null&lt;/span&gt;;&lt;br /&gt;                &lt;span style="color: #3D81EE;"&gt;try&lt;/span&gt; {&lt;br /&gt;                        java.io.ByteArrayOutputStream bos = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; java.io.ByteArrayOutputStream();&lt;br /&gt;                        oos = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; java.io.ObjectOutputStream(bos);&lt;br /&gt;                        oos.writeObject(&lt;span style="color: #3D81EE;"&gt;this&lt;/span&gt;);&lt;br /&gt;                        oos.flush();&lt;br /&gt;                        java.io.ByteArrayInputStream bin = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; java.io.ByteArrayInputStream(bos.toByteArray());&lt;br /&gt;                        ois = &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; java.io.ObjectInputStream(bin);&lt;br /&gt;                        &lt;span style="color: #3D81EE;"&gt;return&lt;/span&gt; ois.readObject();&lt;br /&gt;                } &lt;span style="color: #3D81EE;"&gt;catch&lt;/span&gt;(Exception e) {&lt;br /&gt;                        &lt;span style="color: #3D81EE;"&gt;throw&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;new&lt;/span&gt; Error (&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;Cannot clone this object.&lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                } &lt;span style="color: #3D81EE;"&gt;finally&lt;/span&gt; {&lt;br /&gt;                        &lt;span style="color: #3D81EE;"&gt;try&lt;/span&gt; {&lt;br /&gt;                                oos.close();&lt;br /&gt;                                ois.close();&lt;br /&gt;                        } &lt;span style="color: #3D81EE;"&gt;catch&lt;/span&gt;(Exception e) {&lt;br /&gt;                        }&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; String toString() {&lt;br /&gt;                &lt;span style="color: #3D81EE;"&gt;return&lt;/span&gt; name + &lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #f2984c;"&gt; - &lt;/span&gt;&lt;span style="color: #f2984c;"&gt;&amp;quot;&lt;/span&gt; + vehicleDescription;&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #737373;"&gt;//////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3D81EE;"&gt;class&lt;/span&gt; VehicleDescription &lt;span style="color: #3D81EE;"&gt;implements&lt;/span&gt; java.io.Serializable {&lt;br /&gt;        String name = &lt;span style="color: #f2984c;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;br /&gt;        java.sql.Connection con = &lt;span style="color: #3D81EE;"&gt;null&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; VehicleDescription() {&lt;br /&gt;                &lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; &lt;span style="color: #3D81EE;"&gt;void&lt;/span&gt; setName(String _name) {&lt;br /&gt;                name = _name;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; String getName() {&lt;br /&gt;                &lt;span style="color: #3D81EE;"&gt;return&lt;/span&gt; name;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #3D81EE;"&gt;public&lt;/span&gt; String toString() {&lt;br /&gt;                &lt;span style="color: #3D81EE;"&gt;return&lt;/span&gt; name;&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green; font-weight: bold;"&gt;[/CODE]&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2464965528232475951-694057438680496187?l=eduveks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduveks.blogspot.com/feeds/694057438680496187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eduveks.blogspot.com/2007/06/objectclone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/694057438680496187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2464965528232475951/posts/default/694057438680496187'/><link rel='alternate' type='text/html' href='http://eduveks.blogspot.com/2007/06/objectclone.html' title='Object.clone();'/><author><name>Eduardo Velasques</name><uri>http://www.blogger.com/profile/07740722956768785970</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
