<?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-7022755517551007355</id><updated>2012-01-15T02:16:30.615+01:00</updated><category term='Redes'/><category term='Graph Visualization'/><category term='bugs'/><category term='Lazarus'/><category term='R2build'/><category term='Object oriented programming'/><category term='Files'/><category term='Alpha-beta pruning'/><category term='Windows'/><category term='NAS'/><category term='DBase'/><category term='Syntax Highlighting'/><category term='Simuladores'/><category term='RSA'/><category term='JQuery'/><category term='inheritance'/><category term='TDD'/><category term='Trac'/><category term='WMI'/><category term='Backup'/><category term='Encryption Algorithms'/><category term='University'/><category term='OLE'/><category term='Delphi'/><category term='Digital Identity'/><category term='Penjili'/><category term='AGILE'/><category term='Persistence'/><category term='IPTC'/><category term='Services'/><category term='Entrepreneur'/><category term='Subversion'/><category term='UTF-8'/><category term='Dijkstra'/><category term='Diaspora'/><category term='Photography'/><category term='Prim Algorithm'/><category term='Scada'/><category term='Perl'/><category term='DevExpress'/><category term='Concordion'/><category term='Fuzzy'/><category term='Extreme Programming'/><category term='Prezi'/><category term='Zaluum'/><category term='Compression'/><category term='Google SketchUp'/><category term='VBA'/><category term='Unicode'/><category term='AspectJ'/><category term='flickr'/><category term='Eclipse'/><category term='Scrum'/><category term='CruiseControl'/><category term='TFN'/><category term='redmine'/><category term='J2EE'/><category term='Free Pascal'/><category term='.NET'/><category term='Excel'/><category term='Death March'/><category term='ruby'/><category term='gnuplot'/><category term='QR2'/><category term='Cryptography'/><category term='Python'/><category term='fundamental rights'/><category term='VLO Framework'/><category term='Microsoft'/><category term='Currency'/><category term='English'/><category term='Google insight'/><category term='Matlab'/><category term='OpenSSL'/><category term='Mock'/><category term='Indy'/><category term='Abstract Factory'/><category term='lua'/><category term='ebook'/><category term='Direct2D'/><category term='Steve Jobs'/><category term='Artificial Intelligence'/><category term='Videos'/><category term='Access'/><category term='Kanban'/><category term='Scripts'/><category term='Processing'/><category term='Tron'/><category term='Speech SDK'/><category term='SSL'/><category term='Components'/><category term='email signature'/><category term='JSON'/><category term='Pair Programming'/><category term='Facebook'/><category term='Servlet'/><category term='Routes'/><category term='Icons'/><category term='Base64'/><category term='Peaberry'/><category term='Molecules'/><category term='Continuous Integration'/><category term='Certification'/><category term='Software configuration'/><category term='Profiling'/><category term='Cloud Computing'/><category term='Debian'/><category term='EADS'/><category term='Google wave'/><category term='Jobs'/><category term='Image processing'/><category term='InnoSetup'/><category term='PCB'/><category term='Google'/><category term='JDBC'/><category term='Open Source'/><category term='PHP'/><category term='copyright'/><category term='Chaining Method'/><category term='Google Chrome'/><category term='neuroplasticity'/><category term='XML-RPC'/><category term='Genetic Algorithms'/><category term='TBookMark'/><category term='twitter'/><category term='Interface oriented programming'/><category term='Tools'/><category term='Data Recovery'/><category term='Hardware'/><category term='Subclipse'/><category term='Ubuntu'/><category term='film'/><category term='communications'/><category term='Advanced Encryption Standard'/><category term='wetware'/><category term='TED'/><category term='Utilities'/><category term='Delphi 2010'/><category term='NetStat'/><category term='Delphi XE'/><category term='SQL'/><category term='Regular Expressions'/><category term='Jflex'/><category term='FIT'/><category term='Hibernate'/><category term='Geek'/><category term='Parsing'/><category term='Skills'/><category term='Thiessen'/><category term='ReportBuilder'/><category term='Productivity'/><category term='Flash'/><category term='RSS'/><category term='Computational geometry'/><category term='UOC'/><category term='ActiveX'/><category term='Visprint'/><category term='Ribbon Controls'/><category term='News'/><category term='Pragmatic Programming'/><category term='TStringGrid'/><category term='LINQ'/><category term='MySQL'/><category term='DLL'/><category term='ZeosDBO'/><category term='XML'/><category term='Fractals'/><category term='Extensions'/><category term='Blogger'/><category term='TKinter'/><category term='Vijeo Citect'/><category term='Refactoring'/><category term='social networks'/><category term='Compilers'/><category term='DUnit'/><category term='CUP'/><category term='Voronoi'/><category term='HTML'/><category term='Pathfinding'/><category term='neuroscience'/><category term='Debug'/><category term='Registro Windows'/><category term='VNC'/><category term='Industrial Automation'/><category term='Hacking'/><category term='JavaScript'/><category term='Exceptions'/><category term='Education'/><category term='Google Maps'/><category term='Windows Mobile'/><category term='Design patterns'/><category term='Modbus'/><category term='MVC'/><category term='Messaging'/><category term='Sharing'/><category term='Dependency Injection'/><category term='Comparison'/><category term='IT'/><category term='SQL Server'/><category term='RTTI'/><category term='P-Zaggy'/><category term='Security'/><category term='Robotics'/><category term='protobuf'/><category term='Augmented Reality'/><category term='C++'/><category term='Configuration library'/><category term='WSDL'/><category term='Virtual machines'/><category term='SMTP'/><category term='code rush'/><category term='2D'/><category term='Aspect oriented programming'/><category term='Winsock'/><category term='JUnit'/><category term='Operating System'/><category term='Unit Testing'/><category term='IDE Delphi'/><category term='Data Bases'/><category term='API Windows'/><category term='ADO'/><category term='TCanvas'/><category term='WorkFlow'/><category term='eReader'/><category term='Clipboard'/><category term='JBoss'/><category term='Internet'/><category term='OSGi'/><category term='Physics'/><category term='games'/><category term='ERP'/><category term='Generics'/><category term='Google Noop'/><category term='Java'/><category term='Science'/><category term='Industrial Control'/><category term='Web Service'/><category term='API'/><category term='Force-Directed Graph'/><category term='SOAP'/><category term='COM Objects'/><category term='Maths'/><category term='Jenkins'/><category term='3D'/><category term='google guice'/><category term='GEO'/><category term='Exif'/><category term='Convex Hull'/><category term='password'/><title type='text'>Random thoughts on coding &amp; technology</title><subtitle type='html'>Blog dedicated to software development in Delphi and others, Agile Development, eXtreme programming, Pragmatic thinking and learning, technology, entrepreneurship, photography and science.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default?start-index=101&amp;max-results=100'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>458</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-4185656162024732069</id><published>2012-01-15T02:09:00.001+01:00</published><updated>2012-01-15T02:16:30.630+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jflex'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Vijeo Citect'/><category scheme='http://www.blogger.com/atom/ns#' term='Regular Expressions'/><category scheme='http://www.blogger.com/atom/ns#' term='Compilers'/><category scheme='http://www.blogger.com/atom/ns#' term='P-Zaggy'/><category scheme='http://www.blogger.com/atom/ns#' term='VLO Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='CUP'/><category scheme='http://www.blogger.com/atom/ns#' term='TCanvas'/><title type='text'>Scripting Language with Thundax P-Zaggy</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-RvvCFHPzwiQ/TxIOLAMXIdI/AAAAAAAAC2U/lQzAYBcBamA/s1600/scripting.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="115" src="http://2.bp.blogspot.com/-RvvCFHPzwiQ/TxIOLAMXIdI/AAAAAAAAC2U/lQzAYBcBamA/s200/scripting.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In this article I will show you the approach taken to solve a common problem: &lt;b&gt;Creating your own Scripting Language using a compiler&lt;/b&gt;. Sometimes we need to create our own language and to achieve that we either can create from scratch a lexical&amp;nbsp;analyser&amp;nbsp;in a high level language&amp;nbsp;or use an open source automatic generator of lexical analysers. As I do not want to spent too much time in this task, I obviously chose the second one using an easy approach using &lt;a href="http://jflex.de/"&gt;JFLEX&lt;/a&gt; and &lt;a href="http://www.cs.princeton.edu/~appel/modern/java/CUP/"&gt;CUP&lt;/a&gt;. There are many to choose from, e.g. &lt;a href="http://www.antlr.org/"&gt;Antlr&lt;/a&gt;, &lt;a href="http://javacc.java.net/"&gt;JavaCC&lt;/a&gt;, &lt;a href="http://sablecc.org/"&gt;SableCC&lt;/a&gt;, &lt;a href="http://ssw.jku.at/Coco/"&gt;Coco/R&lt;/a&gt;, &lt;a href="http://byaccj.sourceforge.net/"&gt;BYacc/J&lt;/a&gt;, &lt;a href="http://beaver.sourceforge.net/"&gt;Beaver&lt;/a&gt;, etc. but I like the way &lt;b&gt;Cup/Jflex&lt;/b&gt; work together. &lt;b&gt;Jflex&lt;/b&gt; will automatically generate the finite automata of the lexical&amp;nbsp;analyser&amp;nbsp;through the &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Regular_expression"&gt;regular expressions&lt;/a&gt;&lt;/b&gt; that define the tokens from a language. CUP is a system written in Java used to generate LALR syntax analysers. Cup file will contain the syntax definition of the language (&lt;a href="http://en.wikipedia.org/wiki/Formal_grammar"&gt;Grammar&lt;/a&gt;) using a notation similar to &lt;a href="http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form"&gt;BNF (Backus-Naur)&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This approach will allow me to create a small compiler which will contain a lexical analyser, a syntax analyser and a semantic analyser without having to add extra workload to my simple &lt;b&gt;Language builder&lt;/b&gt;. &lt;b&gt;Cup/Jflex&lt;/b&gt; compiler will handle whether the language is well defined or not and in my Delphi project I only have a dummy function that will run if the previous compiler &lt;b&gt;returns 0 errors&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I have also taken advantage of the &lt;a href="http://sourceforge.net/apps/mediawiki/synedit/index.php?title=SynEdit_Home_Page"&gt;SynEdit&lt;/a&gt; multi-line edit control to enhance the visualization of the simple Scripting Language. The exposed example is pretty basic and it will help to keep the grammar out of the Delphi code. I have tried other Delphi alternatives like &lt;a href="http://goldparser.org/"&gt;GOLD parser&lt;/a&gt; and &lt;b&gt;Coco/R&lt;/b&gt; but I did not get the expected results. &lt;b&gt;So, If you have any better idea, please do let me know!&lt;/b&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-50FVnqECX50/TxIfn4LNBgI/AAAAAAAAC2c/ecyFeOiPi34/s1600/parse.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://4.bp.blogspot.com/-50FVnqECX50/TxIfn4LNBgI/AAAAAAAAC2c/ecyFeOiPi34/s320/parse.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This example will allow the user to define the graph by calling the layout object and connecting one node from another using a numeric description. In left side figure you can actually see the basics of the language and its definition. It invokes the &lt;b&gt;layout&lt;/b&gt; object and then it generates a connection from the &lt;b&gt;node(1)&lt;/b&gt; to &lt;b&gt;node(2)&lt;/b&gt; and it ends the sentence with &lt;b&gt;";"&lt;/b&gt; character. There is no need to define the nodes as if a node does not exist it will be automatically created. The compiler created will manage all kind of errors and warnings and it will inform the user about them. Check that it will inform whether you are committing a lexical error (&lt;i&gt;non recognized symbols, etc&lt;/i&gt;) and syntax error (&lt;i&gt;bad composed expressions&lt;/i&gt;) through an &lt;b&gt;Error&lt;/b&gt; or a semantic error (&lt;i&gt;duplicated lines&lt;/i&gt;) through a &lt;b&gt;warning&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A most developed example is shown in the following figure:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-dbLbrKqKtes/TxIikmpeiTI/AAAAAAAAC2k/pT6F5SEJx_o/s1600/error2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-dbLbrKqKtes/TxIikmpeiTI/AAAAAAAAC2k/pT6F5SEJx_o/s1600/error2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Once the language is free of errors, the generator is enabled and &lt;b&gt;P-Zaggy&lt;/b&gt; can build the graph using the instructions previously defined and analysed by the external compiler. Note that to be able to check the language you must have installed Java.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The following graph have been created using the basic language:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-9noGjDTWkqo/TxIjz8QV2mI/AAAAAAAAC2s/0QTMUpXwZbA/s1600/graph.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-9noGjDTWkqo/TxIjz8QV2mI/AAAAAAAAC2s/0QTMUpXwZbA/s1600/graph.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As you can see it is faster than placing all the objects with the mouse and we can use external tools to generate the script and then check them with the compiler.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Here you can get the latest version of the app:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/thundax-pzaggy/downloads/detail?name=ThundaxPZaggy%20v1.2.0%20build%20278.zip&amp;amp;can=2&amp;amp;q="&gt;Thundax P-Zaggy v1.2.0 build 278&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Jflex regular expressions:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: java"&gt;&amp;lt;YYINITIAL&amp;gt;layout {&lt;br /&gt;  if (CUP$parser$actions.verbose)&lt;br /&gt;    System.out.println(yytext());&lt;br /&gt;  pos += yytext().length();&lt;br /&gt;  return new Symbol(sym.layout, new sToken(pos - yytext().length(), yyline, yytext()));&lt;br /&gt;}&lt;br /&gt;&amp;lt;YYINITIAL&amp;gt;node  {&lt;br /&gt;  if (CUP$parser$actions.verbose)&lt;br /&gt;    System.out.println(yytext());&lt;br /&gt;  pos += yytext().length();&lt;br /&gt;  return new Symbol(sym.node, new sToken(pos - yytext().length(), yyline, yytext()));&lt;br /&gt;}&lt;br /&gt;&amp;lt;YYINITIAL&amp;gt;\( {&lt;br /&gt;  if (CUP$parser$actions.verbose)&lt;br /&gt;    System.out.println(yytext());&lt;br /&gt;  pos += yytext().length();&lt;br /&gt;  return new Symbol(sym.OpenBracket, new sToken(pos - yytext().length(), yyline, yytext()));&lt;br /&gt;}&lt;br /&gt;&amp;lt;YYINITIAL&amp;gt;\)  {&lt;br /&gt;  if (CUP$parser$actions.verbose)&lt;br /&gt;    System.out.println(yytext());&lt;br /&gt;  pos += yytext().length();&lt;br /&gt;  return new Symbol(sym.CloseBracket, new sToken(pos - yytext().length(), yyline, yytext()));&lt;br /&gt;}&lt;br /&gt;&amp;lt;YYINITIAL&amp;gt;tonode {&lt;br /&gt;  if (CUP$parser$actions.verbose)&lt;br /&gt;    System.out.println(yytext());&lt;br /&gt;  pos += yytext().length();&lt;br /&gt;  return new Symbol(sym.tonode, new sToken(pos - yytext().length(), yyline, yytext()));&lt;br /&gt;}&lt;br /&gt;&amp;lt;YYINITIAL&amp;gt;parameters  {&lt;br /&gt;  if (CUP$parser$actions.verbose)&lt;br /&gt;    System.out.println(yytext());&lt;br /&gt;  pos += yytext().length();&lt;br /&gt;  return new Symbol(sym.parameters, new sToken(pos - yytext().length(), yyline, yytext()));&lt;br /&gt;}&lt;br /&gt;&amp;lt;YYINITIAL&amp;gt;\. {&lt;br /&gt;  if (CUP$parser$actions.verbose)&lt;br /&gt;    System.out.println(yytext());&lt;br /&gt;  pos += yytext().length();&lt;br /&gt;  return new Symbol(sym.dot, new sToken(pos - yytext().length(), yyline, yytext()));&lt;br /&gt;}&lt;br /&gt;&amp;lt;YYINITIAL&amp;gt;\; {&lt;br /&gt;  if (CUP$parser$actions.verbose)&lt;br /&gt;    System.out.println(yytext());&lt;br /&gt;  pos += yytext().length();&lt;br /&gt;  return new Symbol(sym.endSentence, new sToken(pos - yytext().length(), yyline, yytext()));&lt;br /&gt;}&lt;br /&gt;&amp;lt;YYINITIAL&amp;gt;[0-9]+ {&lt;br /&gt;  if (CUP$parser$actions.verbose)&lt;br /&gt;    System.out.println(yytext());&lt;br /&gt;  pos += yytext().length();&lt;br /&gt;  return new Symbol(sym.INTEGER, new sToken(pos - yytext().length(), yyline, yytext()));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[ \t\r\n]+  { pos = 1; }&lt;br /&gt;[a-z]+          {&lt;br /&gt;  System.out.println("ERROR at line "+(Integer.valueOf(yyline)+1) + ": '" +yytext() + "' not recognized");&lt;br /&gt;  pos += yytext().length();&lt;br /&gt;  return new Symbol(sym.ff, new sToken(pos - yytext().length(), yyline, yytext())); }&lt;br /&gt;.   {&lt;br /&gt;  System.out.println("ERROR at line "+(Integer.valueOf(yyline)+1) + ": '" +yytext() + "' not recognized");&lt;br /&gt;  pos += yytext().length();&lt;br /&gt;  return new Symbol(sym.ff, new sToken(pos - yytext().length(), yyline, yytext()));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Cup grammar:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: java"&gt;terminal        sToken  layout, node, OpenBracket, CloseBracket, tonode, parameters, dot, endSentence, ff;&lt;br /&gt;&lt;br /&gt;terminal  sToken          INTEGER, ITEM, QUOTE;&lt;br /&gt;&lt;br /&gt;non terminal  scriptClass graphLine;&lt;br /&gt;non terminal    sToken          itemBracket, itemReturned;&lt;br /&gt;&lt;br /&gt;graphLine ::=  layout : t1&lt;br /&gt;   dot : t2&lt;br /&gt;   node : t3&lt;br /&gt;   itemBracket : e1&lt;br /&gt;   dot : t6&lt;br /&gt;   tonode : t7&lt;br /&gt;   itemBracket : e2&lt;br /&gt;          endSentence : t10&lt;br /&gt;          graphLine&lt;br /&gt;                        {:&lt;br /&gt;    scriptLines.AddTokens(e1, e2);&lt;br /&gt;    RESULT = scriptLines; :}&lt;br /&gt;          | error;&lt;br /&gt;&lt;br /&gt;itemBracket ::= OpenBracket : t4&lt;br /&gt;   itemReturned : e1&lt;br /&gt;   CloseBracket : t5 {: RESULT = (sToken)e1; :}&lt;br /&gt;                        | error;&lt;br /&gt;&lt;br /&gt;itemReturned ::= INTEGER : e1 {: RESULT = (sToken)e1; :}&lt;br /&gt;                 | error;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/LR_parser"&gt;LR Parser&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Parser"&gt;Parser&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/LALR_parser"&gt;LALR Parser&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-4185656162024732069?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/4185656162024732069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2012/01/scripting-language-with-thundax-p-zaggy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4185656162024732069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4185656162024732069'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2012/01/scripting-language-with-thundax-p-zaggy.html' title='Scripting Language with Thundax P-Zaggy'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-RvvCFHPzwiQ/TxIOLAMXIdI/AAAAAAAAC2U/lQzAYBcBamA/s72-c/scripting.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-4268070973364719863</id><published>2012-01-02T12:44:00.001+01:00</published><updated>2012-01-02T12:44:22.072+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>The rules of a creator’s life (the secret formula)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-hQ9V3mc0m6w/TwGXUUy8MHI/AAAAAAAAC2M/81VLkNK1gk0/s1600/rules-of-creators-life.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-hQ9V3mc0m6w/TwGXUUy8MHI/AAAAAAAAC2M/81VLkNK1gk0/s640/rules-of-creators-life.png" width="481" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="color: #555555; font-size: 14px; line-height: 22px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 20px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify; text-decoration: none;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;(source&amp;nbsp;&lt;a href="http://www.creativesomething.net/post/14919213087" style="color: #3f9291; text-decoration: underline;" target="_blank"&gt;&lt;b&gt;creativesomething.net&lt;/b&gt;&lt;/a&gt;).&amp;nbsp;&lt;span class="Apple-style-span" style="color: #434343; font-weight: normal; line-height: 25px;"&gt;Rules created by&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #434343; font-size: 14px; line-height: 25px;"&gt;&lt;a href="http://tannerchristensen.com/" style="border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; color: #0982df; text-decoration: none;"&gt;&lt;b&gt;Tanner Christensen&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #434343; font-size: 14px; font-weight: normal; line-height: 25px;"&gt;&amp;nbsp;of&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #434343; font-size: 14px; font-weight: normal; line-height: 25px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #434343; font-size: 14px; line-height: 25px;"&gt;&lt;a href="http://www.creativesomething.net/post/14309368349" style="border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; color: #0982df; text-decoration: none;"&gt;&lt;b&gt;Creative Something&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #434343; font-size: 14px; font-weight: normal; line-height: 25px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #434343; font-size: 14px; font-weight: normal; line-height: 25px;"&gt;showcases a&amp;nbsp;recipe&amp;nbsp;for success.&lt;/span&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/7022755517551007355-4268070973364719863?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/4268070973364719863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2012/01/rules-of-creators-life-secret-formula.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4268070973364719863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4268070973364719863'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2012/01/rules-of-creators-life-secret-formula.html' title='The rules of a creator’s life (the secret formula)'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-hQ9V3mc0m6w/TwGXUUy8MHI/AAAAAAAAC2M/81VLkNK1gk0/s72-c/rules-of-creators-life.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-627754865374463734</id><published>2011-12-30T19:00:00.000+01:00</published><updated>2011-12-30T21:04:53.245+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Vijeo Citect'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Regular Expressions'/><category scheme='http://www.blogger.com/atom/ns#' term='P-Zaggy'/><category scheme='http://www.blogger.com/atom/ns#' term='VLO Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><category scheme='http://www.blogger.com/atom/ns#' term='TCanvas'/><title type='text'>Finite automata to Regular Grammar with Thundax P-Zaggy</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-xvyBvoI3TD0/Tv3XJ8A6jFI/AAAAAAAAC1Q/q1IZAqnU64c/s1600/grammar.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-xvyBvoI3TD0/Tv3XJ8A6jFI/AAAAAAAAC1Q/q1IZAqnU64c/s1600/grammar.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Moving ahead with &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Finite-state_machine"&gt;FA&lt;/a&gt;&lt;/b&gt;, now we can generate the &lt;b&gt;right-linear grammar&lt;/b&gt; that corresponds to the finite automata generated. The system is pretty simple and basically what the algorithm does is to go recursively through every state and to store the production (&lt;b&gt;&lt;i&gt;A → bC&lt;/i&gt;&lt;/b&gt;) using the info from the transition and both states.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://1.bp.blogspot.com/-YIttFPchPTQ/Tv3cU9ZAeJI/AAAAAAAAC1c/0_jNyokI8HM/s1600/example.bmp" imageanchor="1" style="clear: right; display: inline !important; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-YIttFPchPTQ/Tv3cU9ZAeJI/AAAAAAAAC1c/0_jNyokI8HM/s1600/example.bmp" /&gt;&lt;/a&gt;&lt;b&gt;P-Zaggy&lt;/b&gt; will use description text to assign unique variable names to each state. Each transition in the graph matches a production in the &lt;a href="http://en.wikipedia.org/wiki/Linear_grammar"&gt;right-linear grammar&lt;/a&gt;. For example (&lt;i&gt;right side image&lt;/i&gt;), the transition from &lt;b&gt;“A”&lt;/b&gt; to &lt;b&gt;“B”&lt;/b&gt; along the transition &lt;b&gt;“a”&lt;/b&gt; matches the production &lt;b&gt;&lt;i&gt;“A → aB”&lt;/i&gt;&lt;/b&gt;. This production will be automatically added into the production list in the "&lt;b&gt;Finite Automaton (simulation)&lt;/b&gt;" tab. To generate the full grammar, just open your finite automata and press "&lt;b&gt;&lt;i&gt;Get grammar&lt;/i&gt;&lt;/b&gt;" button to get the &lt;b&gt;linear grammar&lt;/b&gt;. Now as any final state carries the production to λ,&amp;nbsp;&lt;b&gt;λ symbol&lt;/b&gt; has been added to the system as&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Empty_string"&gt;empty string&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In the following image you will see a general example with the automatically generated grammar:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-v_NcF_WwCu0/Tv3jjqpGf0I/AAAAAAAAC10/TkotxKgwbDs/s1600/grammar3.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-v_NcF_WwCu0/Tv3jjqpGf0I/AAAAAAAAC10/TkotxKgwbDs/s400/grammar3.bmp" width="271" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Example with&amp;nbsp;&lt;b&gt;λ string&lt;/b&gt;:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-lwiqPvEnbB0/Tv3n0LL2o8I/AAAAAAAAC2A/KLyEUHGFFD8/s1600/grammar4.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="186" src="http://1.bp.blogspot.com/-lwiqPvEnbB0/Tv3n0LL2o8I/AAAAAAAAC2A/KLyEUHGFFD8/s320/grammar4.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Demo video:&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/hYA9NB0OjpI" width="420"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Get the latest version from here:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/thundax-pzaggy/downloads/detail?name=ThundaxPZaggy%20v1.2.0%20build%20208.zip&amp;amp;can=2&amp;amp;q="&gt;Thundax P-Zaggy v1.20 build 208&lt;/a&gt;. (Executable)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Looking back/ahead:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This would be the last post of the year 2011 and I'm taking this moment to review all the good stuff I have been publishing in my blog, from the physics engine to different code snippets and all of them with the help of a big an bright Delphi community. I always find difficult to get round to writing more often but I always have my notebook with me and every time and idea pops out I am there to catch it. I have an endless list of really interesting stuff I would like to tackle and I hope next year would be more fruitful as there are less than 50 articles for this year (even though the visits have been increased to almost 6K per month wow!, &lt;b&gt;I am grateful for that!&lt;/b&gt;). I am also blissfully happy for putting grain of salt in the community as I have widely used the knowledge of others and it is great to pay back.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Next year I will be implementing different algorithms and I will be focusing on &lt;b&gt;grammars&lt;/b&gt;, &lt;b&gt;compilers&lt;/b&gt; and &lt;b&gt;AI&lt;/b&gt; as I am very keen on those subjects and as you already know I like a lot visual stuff (And everything or almost everything with my loved &lt;b&gt;Delphi&lt;/b&gt;). I'm preparing a roadmap about different utilities I have in mind and stay tuned for new and very interesting stuff!.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Happy new year 2012!.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;b&gt;Jordi Corbilla&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Finite-state_machine"&gt;Finite state machine&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Linear_grammar"&gt;Linear Grammar&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Regular_grammar"&gt;Regular Grammar&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Formal_language"&gt;Formal language&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Empty_string"&gt;Empty String&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/12/finite-automata-with-thundax-p-zaggy.html"&gt;Finite automata with Thundax P-Zaggy Part I&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/12/finite-automata-with-thundax-p-zaggy_29.html"&gt;Finite automata with Thundax P-Zaggy Part II&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cs.duke.edu/csed/jflap/"&gt;JFLAP (software for experimenting with formal languages)&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://delphi.about.com/od/objectpascalide/a/understanding-anonymous-methods-in-delphi.htm"&gt;Anonymous methods in Delphi&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://delphi.about.com/od/delphitips2009/qt/sort-generic.htm"&gt;Sort generic list&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-627754865374463734?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/627754865374463734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/12/finite-automata-to-regular-grammar-with.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/627754865374463734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/627754865374463734'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/12/finite-automata-to-regular-grammar-with.html' title='Finite automata to Regular Grammar with Thundax P-Zaggy'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-xvyBvoI3TD0/Tv3XJ8A6jFI/AAAAAAAAC1Q/q1IZAqnU64c/s72-c/grammar.bmp' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-9010409612027858432</id><published>2011-12-29T19:53:00.003+01:00</published><updated>2011-12-29T19:53:45.184+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Vijeo Citect'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Regular Expressions'/><category scheme='http://www.blogger.com/atom/ns#' term='P-Zaggy'/><category scheme='http://www.blogger.com/atom/ns#' term='VLO Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><category scheme='http://www.blogger.com/atom/ns#' term='TCanvas'/><title type='text'>Finite Automata with Thundax P-Zaggy part II</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-CbCxIpA62rc/TvykmFdaZaI/AAAAAAAAC0s/yfvQakRn_7I/s1600/DFA2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-CbCxIpA62rc/TvykmFdaZaI/AAAAAAAAC0s/yfvQakRn_7I/s1600/DFA2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Going on with the further enhancement of &lt;b&gt;P-Zaggy (&lt;a href="http://thundaxsoftware.blogspot.com/2011/12/finite-automata-with-thundax-p-zaggy.html"&gt;part I&lt;/a&gt;)&lt;/b&gt; to use its graph creation capability to run and simulate &lt;b&gt;DFA&lt;/b&gt;, I have released a new version (&lt;a href="http://code.google.com/p/thundax-pzaggy/downloads/detail?name=ThundaxPZaggy%20v1.2.0%20build%20180.zip&amp;amp;can=2&amp;amp;q="&gt;v1.2.0 build 180&lt;/a&gt;) which allows you to check a bunch of strings in batch. One the DFA is defined, we can easily test our input strings by adding them into the list and the application will check every item and it will populate the status with "&lt;b&gt;accepted/rejected&lt;/b&gt;" message. This version still only works with one char regular expressions &lt;b&gt;(^[A-Z]$)&lt;/b&gt; so more complex expressions &lt;b&gt;(^[A-Z]+$)&lt;/b&gt; will be used but not correctly adapted.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Examples:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-BZ5K9RAje98/TvyyuYH6q5I/AAAAAAAAC04/v54n5Rskfws/s1600/DFA.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="165" src="http://3.bp.blogspot.com/-BZ5K9RAje98/TvyyuYH6q5I/AAAAAAAAC04/v54n5Rskfws/s400/DFA.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-48ssLdTtleY/Tvyy9O9zyKI/AAAAAAAAC1E/ElaMDQvnh1Q/s1600/example.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="http://3.bp.blogspot.com/-48ssLdTtleY/Tvyy9O9zyKI/AAAAAAAAC1E/ElaMDQvnh1Q/s400/example.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/KuW5lTescD8" width="420"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://docwiki.embarcadero.com/VCL/en/RegularExpressionsCore.TPerlRegExList"&gt;Regular expressions&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-9010409612027858432?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/9010409612027858432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/12/finite-automata-with-thundax-p-zaggy_29.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/9010409612027858432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/9010409612027858432'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/12/finite-automata-with-thundax-p-zaggy_29.html' title='Finite Automata with Thundax P-Zaggy part II'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-CbCxIpA62rc/TvykmFdaZaI/AAAAAAAAC0s/yfvQakRn_7I/s72-c/DFA2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2906208331977365488</id><published>2011-12-29T03:25:00.000+01:00</published><updated>2011-12-29T18:03:36.506+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Vijeo Citect'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Regular Expressions'/><category scheme='http://www.blogger.com/atom/ns#' term='P-Zaggy'/><category scheme='http://www.blogger.com/atom/ns#' term='VLO Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><category scheme='http://www.blogger.com/atom/ns#' term='TCanvas'/><title type='text'>Finite Automata with Thundax P-Zaggy part I</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7Y1QNO3PjPQ/TvvGlbQoB6I/AAAAAAAACzw/HGIAHRTrl4A/s1600/fm.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="138" src="http://1.bp.blogspot.com/-7Y1QNO3PjPQ/TvvGlbQoB6I/AAAAAAAACzw/HGIAHRTrl4A/s200/fm.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I have moved forward the development of &lt;a href="http://sourceforge.net/projects/vloframework/"&gt;Thundax P-Zaggy&lt;/a&gt; with the addition of a &lt;a href="http://en.wikipedia.org/wiki/Deterministic_finite_automaton"&gt;Finite Automata&lt;/a&gt; &lt;u&gt;builder and simulator&lt;/u&gt;. "A &lt;b&gt;deterministic finite automaton (DFA)&lt;/b&gt; also known as &lt;b&gt;deterministic finite state machine&amp;nbsp;&lt;/b&gt;is a finite state machine that &lt;b&gt;&lt;i&gt;accepts/rejects&lt;/i&gt;&lt;/b&gt; finite strings of symbols and only produces a unique computation (or run) of the automaton for each input string. (&lt;a href="http://en.wikipedia.org/wiki/Deterministic_finite_automaton"&gt;wikipedia&lt;/a&gt;)". Building the automata with &lt;b&gt;P-Zaggy&lt;/b&gt; is quite simple, so let's start by building a &lt;b&gt;DFA&lt;/b&gt; for the following language:&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;L = {ba | ab&lt;i&gt;&lt;sup&gt;n&lt;/sup&gt;&lt;/i&gt;a,&amp;nbsp;n &amp;gt;&amp;nbsp;0}.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As it is shown in the previous image, the DFA would be as follows:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-XL7E-4HFmSs/TvvKeRvPc1I/AAAAAAAACz8/nnRt7ZGJsQA/s1600/Dibujo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://2.bp.blogspot.com/-XL7E-4HFmSs/TvvKeRvPc1I/AAAAAAAACz8/nnRt7ZGJsQA/s400/Dibujo.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;With the tool we would be able to create our diagrams placing the states and transitions. Once the diagram is set up, all transitions need to have the &lt;b&gt;transition string&lt;/b&gt; to change the ongoing state and &lt;u&gt;initial and final states need to be selected&lt;/u&gt; (using right click and selecting "&lt;b&gt;Mark as Start Node&lt;/b&gt;" for &lt;b&gt;Initial state&lt;/b&gt; and "&lt;b&gt;Mark as End Node&lt;/b&gt;" for &lt;b&gt;Final state&lt;/b&gt;).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-A2jlxfB1xJA/TvvMCrlp3-I/AAAAAAAAC0I/bdDZHmhOeR8/s1600/menu.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-A2jlxfB1xJA/TvvMCrlp3-I/AAAAAAAAC0I/bdDZHmhOeR8/s320/menu.jpg" width="194" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;We can start the simulation with very simple steps. Firstly, select the tab called "&lt;b&gt;Finite Automaton (simulation)"&lt;/b&gt; and enter the &lt;i&gt;test input string&lt;/i&gt; to test. Then press start button to internally initialize the graph as a DFA and press &lt;b&gt;step&lt;/b&gt; to process every character of the input string while the diagram is changing states and showing you which is the actual state and whether the string is being &lt;i&gt;accepted&lt;/i&gt; or &lt;i&gt;rejected&lt;/i&gt;. To set up a &lt;b&gt;single loop transition&lt;/b&gt;, select the &lt;b&gt;node&lt;/b&gt; and with right click select "&lt;b&gt;Set connector loop&lt;/b&gt;" and add text for the transition.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-zOhri3FTHKs/TvvN8ZQZaXI/AAAAAAAAC0U/4g8q7WacSlI/s1600/accept.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://2.bp.blogspot.com/-zOhri3FTHKs/TvvN8ZQZaXI/AAAAAAAAC0U/4g8q7WacSlI/s400/accept.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In this beta version, we can also use &lt;b&gt;Regular Expressions&lt;/b&gt; in our transitions thanks to the widespread use of regular expressions inside Delphi XE.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-4lGP6HjwLr8/TvxPeAlfoCI/AAAAAAAAC0g/trA3Xx5HJoQ/s1600/Dibujot.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-4lGP6HjwLr8/TvxPeAlfoCI/AAAAAAAAC0g/trA3Xx5HJoQ/s400/Dibujot.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;From the same screen we can test our regular expressions and check whether if they match or not. There are still some issues to tackle like "&lt;b&gt;empty string&lt;/b&gt;" and other considerations that I would be delving into detail in the following days. I am also working on a&amp;nbsp;&lt;b&gt;Layered-Tree-Draw Algorithm&lt;/b&gt; using&amp;nbsp;&lt;b&gt;&lt;a href="http://www.codeproject.com/KB/scripting/graphic_javascript_tree.aspx"&gt;Reingold-Tilford Algorithm&lt;/a&gt;&lt;/b&gt; and the enhancement of the better recognition of more &lt;b&gt;complex regular expressions&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Have a look at this preview of the functioning of the graph, it is really worth it:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/r_O3ynhkXZg" width="420"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Stay tuned and give &lt;b&gt;P-Zaggy&lt;/b&gt; a try from here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/thundax-pzaggy/downloads/detail?name=ThundaxPZaggy%20v1.2.0%20build%20155.zip&amp;amp;can=2&amp;amp;q="&gt;Thundax P-Zaggy v1.2.0 build 155&lt;/a&gt;. (there are two examples included).&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cs.wcupa.edu/~rkline/csc520/re-dfa-equiv.html"&gt;Regular language closure properties&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/vloframework/"&gt;VLO Framework&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/06/thundax-p-zaggy-presentation.html"&gt;Thundax P-Zaggy presentation&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/02/thundax-p-zaggy-v12-beta.html"&gt;Thundax P-Zaggy 1.2 beta&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.regular-expressions.info/delphi.html"&gt;Regular Expressions&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2906208331977365488?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2906208331977365488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/12/finite-automata-with-thundax-p-zaggy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2906208331977365488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2906208331977365488'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/12/finite-automata-with-thundax-p-zaggy.html' title='Finite Automata with Thundax P-Zaggy part I'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-7Y1QNO3PjPQ/TvvGlbQoB6I/AAAAAAAACzw/HGIAHRTrl4A/s72-c/fm.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-1451730767872273593</id><published>2011-12-10T01:46:00.001+01:00</published><updated>2011-12-13T23:02:35.038+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><category scheme='http://www.blogger.com/atom/ns#' term='Services'/><title type='text'>Install multiple instances of the same Delphi application service</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-HW58BswO75M/TufDzU5xBbI/AAAAAAAACzM/hbFwTF9mOR4/s1600/Dibujo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="170" src="http://1.bp.blogspot.com/-HW58BswO75M/TufDzU5xBbI/AAAAAAAACzM/hbFwTF9mOR4/s200/Dibujo.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In this article you will find an example on &lt;i&gt;How to install multiple instances of the same Delphi application service&lt;/i&gt; under Windows. This topic was raised a few years ago in &lt;a href="http://stackoverflow.com/questions/612587/is-it-possible-to-install-multiple-instances-of-the-same-delphi-service-applicat"&gt;StackOverflow&lt;/a&gt; and I have decided to give more details about how to use multiple instances of the same service.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The service needs to be unique in name and the best way to sort this out is using a parameter to describe the service in a unique way. The service itself will use this parameter to compose its name even though it is using the same &amp;nbsp;executable. In this example I will identify the services when installing the service using the command line with the following instruction: &lt;b&gt;&lt;i&gt;"myService /install Param1"&lt;/i&gt;&lt;/b&gt;. &lt;b&gt;&lt;i&gt;Param1&lt;/i&gt;&lt;/b&gt; will be used to compose the internal service name as &lt;b&gt;myServiceParam1&lt;/b&gt;. If we want to use another instance, just install a second service with a different param name as:&amp;nbsp;&lt;b&gt;&lt;i&gt;myService /install Param2&lt;/i&gt;&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;To achieve this is pretty simple, just create the service using your Delphi XE and then create the methods &lt;b&gt;ServiceBeforeUninstall&lt;/b&gt; and &lt;b&gt;ServiceCreate&lt;/b&gt;:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;unit uService;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, WinSvc;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TServiceExample = class(TService)&lt;br /&gt;    procedure ServiceCreate(Sender: TObject);&lt;br /&gt;    procedure ServiceBeforeUninstall(Sender: TService);&lt;br /&gt;  private&lt;br /&gt;    FDescription: String;&lt;br /&gt;    FPreviousName: String;&lt;br /&gt;    FPreviusDisplayName: string;&lt;br /&gt;  public&lt;br /&gt;    function GetServiceController: TServiceController; override;&lt;br /&gt;    { Public declarations }&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  ServiceExample: TServiceExample;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  ComObj;&lt;br /&gt;&lt;br /&gt;{$R *.DFM}&lt;br /&gt;&lt;br /&gt;procedure ServiceController(CtrlCode: DWORD); stdcall;&lt;br /&gt;begin&lt;br /&gt;  ServiceExample.Controller(CtrlCode);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TServiceExample.GetServiceController: TServiceController;&lt;br /&gt;begin&lt;br /&gt;  Result := ServiceController;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TServiceExample.ServiceBeforeUninstall(Sender: TService);&lt;br /&gt;begin&lt;br /&gt;  Name := FPreviousName + FDescription;&lt;br /&gt;  DisplayName := FPreviusDisplayName + FDescription;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TServiceExample.ServiceCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  FDescription := System.ParamStr(2);&lt;br /&gt;  FPreviousName := Name;&lt;br /&gt;  FPreviusDisplayName := DisplayName;&lt;br /&gt;  Name := Name + FDescription;&lt;br /&gt;  DisplayName := DisplayName + FDescription;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Notice the &lt;b&gt;&lt;i&gt;System.ParamStr(2)&lt;/i&gt;&lt;/b&gt; that will use the second parameter which was input from the command line. The first parameter is the &lt;b&gt;/install&lt;/b&gt; command needed to install the service.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;After the execution of the following commands:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;myService /install Param1&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;myService /install Param2&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;You will see two installed services using the same executable:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-BnJTgWBFBjA/TufHgXnzg5I/AAAAAAAACzU/0vvtbHH11T8/s1600/Dibujo2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-BnJTgWBFBjA/TufHgXnzg5I/AAAAAAAACzU/0vvtbHH11T8/s1600/Dibujo2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;To uninstall them, use the opposite command:&lt;br /&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;myService /uninstall Param1&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;i&gt;myService /uninstall Param2&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;But this &lt;u&gt;is not ending here&lt;/u&gt;. Now the services are installed, but neither the &lt;b&gt;service name&lt;/b&gt; is set nor the &lt;b&gt;description&lt;/b&gt;. To achieve this, we need to use the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms681987(v=vs.85).aspx"&gt;ChangeServiceConfig&lt;/a&gt; functions from &lt;b&gt;WinSvc - Service Control Manager unit&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Have a look at the complete source code:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;unit uService;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, WinSvc;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TServiceExample = class(TService)&lt;br /&gt;    procedure ServiceCreate(Sender: TObject);&lt;br /&gt;    procedure ServiceBeforeUninstall(Sender: TService);&lt;br /&gt;    procedure ServiceAfterInstall(Sender: TService);&lt;br /&gt;  private&lt;br /&gt;    FDescription: String;&lt;br /&gt;    FPreviousName: String;&lt;br /&gt;    FPreviusDisplayName: string;&lt;br /&gt;  public&lt;br /&gt;    function GetServiceController: TServiceController; override;&lt;br /&gt;    { Public declarations }&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  SERVICE_DESCRIPTION = packed record&lt;br /&gt;    lpDescription: PChar;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  PSERVICE_DESCRIPTION = ^SERVICE_DESCRIPTION;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  ServiceExample: TServiceExample;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;  SERVICE_CONFIG_DESCRIPTION = 1;&lt;br /&gt;&lt;br /&gt;function ChangeServiceConfig2(hService: SC_HANDLE; dwInfoLevel: DWORD; lpInfo: Pointer): BOOL; stdcall; external 'advapi32.dll' name 'ChangeServiceConfig2W';&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  ComObj;&lt;br /&gt;{$R *.DFM}&lt;br /&gt;&lt;br /&gt;procedure ServiceController(CtrlCode: DWORD); stdcall;&lt;br /&gt;begin&lt;br /&gt;  ServiceExample.Controller(CtrlCode);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TServiceExample.GetServiceController: TServiceController;&lt;br /&gt;begin&lt;br /&gt;  Result := ServiceController;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TServiceExample.ServiceAfterInstall(Sender: TService);&lt;br /&gt;var&lt;br /&gt;  SvcMgr, Svc: SC_HANDLE;&lt;br /&gt;  desc: SERVICE_DESCRIPTION;&lt;br /&gt;begin&lt;br /&gt;  SvcMgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);&lt;br /&gt;  if SvcMgr = 0 then&lt;br /&gt;    Exit;&lt;br /&gt;  try&lt;br /&gt;    Svc := OpenService(SvcMgr, PChar(Name), SERVICE_ALL_ACCESS);&lt;br /&gt;    if Svc = 0 then&lt;br /&gt;      RaiseLastOSError;&lt;br /&gt;    try&lt;br /&gt;      desc.lpDescription := PWideChar(ParamStr(0) + ' ' + FDescription);&lt;br /&gt;      ChangeServiceConfig( Svc, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE,SERVICE_NO_CHANGE, desc.lpDescription, nil, nil, nil, nil, nil, nil);&lt;br /&gt;      desc.lpDescription := PWideChar('Service Example with Params = ' + FDescription);&lt;br /&gt;      ChangeServiceConfig2(Svc, SERVICE_CONFIG_DESCRIPTION, @desc.lpDescription);&lt;br /&gt;    finally&lt;br /&gt;      CloseServiceHandle(Svc);&lt;br /&gt;    end;&lt;br /&gt;  finally&lt;br /&gt;    CloseServiceHandle(SvcMgr);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TServiceExample.ServiceBeforeUninstall(Sender: TService);&lt;br /&gt;begin&lt;br /&gt;  Name := FPreviousName + FDescription;&lt;br /&gt;  DisplayName := FPreviusDisplayName + FDescription;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TServiceExample.ServiceCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  FDescription := System.ParamStr(2);&lt;br /&gt;  FPreviousName := Name;&lt;br /&gt;  FPreviusDisplayName := DisplayName;&lt;br /&gt;  Name := Name + FDescription;&lt;br /&gt;  DisplayName := DisplayName + FDescription;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This solution is using the example provided by&amp;nbsp;&lt;a href="http://koochangmin.blogspot.com/2010/01/test.html"&gt;koochangmin&lt;/a&gt; on his Delphi blog. If you have a closer look at the &lt;b&gt;&lt;i&gt;ServiceAfterInstall&lt;/i&gt;&lt;/b&gt; method, you will find the composition of the name and description which will be used to populate the values in the service:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-25zjVsgx1nM/TufKL3V21vI/AAAAAAAACzc/bZSYx70cD50/s1600/Dibujo3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-25zjVsgx1nM/TufKL3V21vI/AAAAAAAACzc/bZSYx70cD50/s400/Dibujo3.jpg" width="340" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;That is the way the service needs to be created in order to let the application use the parameters in runtime.&lt;br /&gt;&lt;br /&gt;If you have any problem uninstalling the services, just use the SC command to delete the service:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;sc delete ServiceExampleParam1&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://koochangmin.blogspot.com/2010/01/test.html"&gt;Windows Service Managing Unit&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms681988(v=vs.85).aspx"&gt;ChangeServiceConfig2 function&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tenouk.com/cddeefunction3.html"&gt;Another Windows Service: A&amp;nbsp;supplementary&amp;nbsp;note&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.astahost.com/info/tifsls-delete-service.html"&gt;How to delete a service&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-1451730767872273593?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/1451730767872273593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/12/install-multiple-instances-of-same.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/1451730767872273593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/1451730767872273593'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/12/install-multiple-instances-of-same.html' title='Install multiple instances of the same Delphi application service'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-HW58BswO75M/TufDzU5xBbI/AAAAAAAACzM/hbFwTF9mOR4/s72-c/Dibujo.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2653887613547289591</id><published>2011-11-07T19:38:00.000+01:00</published><updated>2011-11-07T19:48:03.694+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='Videos'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Google and Facebook "Secrets" unveiled</title><content type='html'>&lt;div style="text-align: justify;"&gt;Here you can see an interesting video from one of the TED talks this year in which we can see how the information is filtered and presented according to our surfing (using algorithmic and personalized filters). It gives interesting reflections.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/wGq3HWILr6k" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Enjoy the video!.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2653887613547289591?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2653887613547289591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/11/google-and-facebook-secrets-unveiled.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2653887613547289591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2653887613547289591'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/11/google-and-facebook-secrets-unveiled.html' title='Google and Facebook &quot;Secrets&quot; unveiled'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/wGq3HWILr6k/default.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-6299555966736956302</id><published>2011-10-17T21:07:00.002+02:00</published><updated>2011-10-17T21:07:45.862+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Operating System'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Monitoring Desktop Heap Memory and troubleshooting issues (part II)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-afV1S9Ac0OM/TpxnjVC_lSI/AAAAAAAACyI/2lhrc38IwHY/s1600/heap.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"&gt;&lt;img border="0" height="187" src="http://1.bp.blogspot.com/-afV1S9Ac0OM/TpxnjVC_lSI/AAAAAAAACyI/2lhrc38IwHY/s200/heap.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Now that we know what &lt;i&gt;Desktop Heap Memory&lt;/i&gt; is and How works (&lt;a href="http://thundaxsoftware.blogspot.com/2011/10/monitoring-desktop-heap-memory-and.html"&gt;Monitoring Desktop Heap Memory and troubleshooting issues (part I)&lt;/a&gt;), we can extend this functionality and retrieve the &lt;b&gt;Heap size&lt;/b&gt; from our Delphi app and even better, create a new desktop with a&amp;nbsp;&lt;b&gt;specified heap size&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;To achieve this I am going to use the public &lt;b&gt;API functions&lt;/b&gt; introduced in&amp;nbsp;Windows Vista: &lt;b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms682127.aspx"&gt;CreateDesktopEx&lt;/a&gt;&lt;/b&gt;, which allows the caller to specify the size of desktop heap.And, &lt;b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms683238.aspx"&gt;GetUserObjectInformation&lt;/a&gt;&lt;/b&gt;&amp;nbsp;that includes a &amp;nbsp;flag for retrieving the desktop heap size (&lt;b&gt;UOI_HEAPSIZE&lt;/b&gt;).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Get Heap Size:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;To get the heap size, we just need to invoke the &lt;b&gt;GetUserObjectInformation&lt;/b&gt; using the &lt;b&gt;UOI_HEAPSIZE&lt;/b&gt; flag:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;procedure GetHeapSizeClick();&lt;br /&gt;var&lt;br /&gt;  HDesktop: HDESK;&lt;br /&gt;  UHeapSize: ULong;&lt;br /&gt;  tempDword: DWORD;&lt;br /&gt;begin&lt;br /&gt;  HDesktop := OpenInputDesktop(0, False, DESKTOP_CREATEMENU or&lt;br /&gt;    DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or&lt;br /&gt;    DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or&lt;br /&gt;    GENERIC_WRITE);&lt;br /&gt;&lt;br /&gt;  GetUserObjectInformation(HDesktop, UOI_HEAPSIZE, @UHeapSize, SizeOf(UHeapSize), tempDword);&lt;br /&gt;  OutputDebugString(PChar('UOI_HEAPSIZE ' + Inttostr(UHeapSize)));&lt;br /&gt;  CloseDesktop(HDesktop);&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;The output of the string is as follows:&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Debug Output: UOI_HEAPSIZE &lt;b&gt;12288&lt;/b&gt; Process Project1.exe (4224)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Where the value highlighted in bold, is the predefined size of your heap in the &lt;b&gt;SubSystems\Windows&lt;/b&gt; registry key.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Create a new desktop with a specific heap size:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Using the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ms682127.aspx"&gt;CreateDesktopEx&lt;/a&gt; or&amp;nbsp;&lt;b&gt;CreateDesktopExW&lt;/b&gt; (Unicode):&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;var&lt;br /&gt;  HDesktopglobal: HDESK;&lt;br /&gt;&lt;br /&gt;procedure CreateDesktop();&lt;br /&gt;var&lt;br /&gt;  UHeapSize: ULong;&lt;br /&gt;  tempDword: DWORD;&lt;br /&gt;begin&lt;br /&gt;  try&lt;br /&gt;    HDesktopglobal := CreateDesktopExW('Z', nil, nil, DF_ALLOWOTHERACCOUNTHOOK, GENERIC_ALL, nil, 3052, nil);&lt;br /&gt;  except&lt;br /&gt;    on e: exception do&lt;br /&gt;      ShowMessage(SysErrorMessage(GetLastError));&lt;br /&gt;  end;&lt;br /&gt;  if HDesktopglobal &amp;lt;&amp;gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    GetUserObjectInformation(HDesktopglobal, UOI_HEAPSIZE, @UHeapSize, SizeOf(UHeapSize), tempDword);&lt;br /&gt;    OutputDebugString(PChar('UOI_HEAPSIZE ' + Inttostr(UHeapSize)));&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure CloseDesk();&lt;br /&gt;begin&lt;br /&gt;  CloseDesktop(HDesktopglobal);&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We can check the result with dheapmon tool:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-8vUP03jkq78/Tpx7uToKJ2I/AAAAAAAACyQ/tdJ2yZxV_SU/s1600/heap2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="181" src="http://3.bp.blogspot.com/-8vUP03jkq78/Tpx7uToKJ2I/AAAAAAAACyQ/tdJ2yZxV_SU/s400/heap2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;With more details using &lt;b&gt;dheapmon -v&lt;/b&gt; and the looking for '&lt;b&gt;Z&lt;/b&gt;' desktop.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-TTUsjVjjhdE/Tpx8d-SSyEI/AAAAAAAACyY/XXS32mUouRY/s1600/heap3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="127" src="http://2.bp.blogspot.com/-TTUsjVjjhdE/Tpx8d-SSyEI/AAAAAAAACyY/XXS32mUouRY/s400/heap3.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;The output of the string is as follows:&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Debug Output: UOI_HEAPSIZE&amp;nbsp;&lt;b&gt;3052&lt;/b&gt;&amp;nbsp;Process Project1.exe (364)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Remember that the Desktop needs to be &lt;b&gt;closed&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/ntdebugging/archive/2007/07/05/desktop-heap-part-2.aspx"&gt;Desktop heap&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms683238.aspx"&gt;GetUserObjectInformation&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms682127.aspx"&gt;CreateDesktopEx&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-6299555966736956302?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/6299555966736956302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/10/monitoring-desktop-heap-memory-and_17.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6299555966736956302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6299555966736956302'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/10/monitoring-desktop-heap-memory-and_17.html' title='Monitoring Desktop Heap Memory and troubleshooting issues (part II)'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-afV1S9Ac0OM/TpxnjVC_lSI/AAAAAAAACyI/2lhrc38IwHY/s72-c/heap.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-5560064819427422938</id><published>2011-10-16T03:05:00.002+02:00</published><updated>2011-10-16T03:05:26.736+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Utilities'/><category scheme='http://www.blogger.com/atom/ns#' term='Extensions'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Chrome'/><title type='text'>Open a list of URLs</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-8Nk-zgaEdRE/TposYo3lSHI/AAAAAAAACx4/oZZDz6oQssc/s1600/images.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-8Nk-zgaEdRE/TposYo3lSHI/AAAAAAAACx4/oZZDz6oQssc/s200/images.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Going on with my previous entries, in this post I am releasing a little tool to open a web browser (in this case google chrome) and populate it with a list of stored URLs. This tool would be the culmination of the articles:&amp;nbsp;&lt;a href="http://thundaxsoftware.blogspot.com/2011/09/my-first-google-chrome-extension-get.html"&gt;My first Google Chrome extension (Get all URLs from Google Chrome tabs)&lt;/a&gt; and&amp;nbsp;&lt;a href="http://thundaxsoftware.blogspot.com/2011/09/get-chrome-active-tab-url-using-delphi.html"&gt;Get Chrome active tab URL using Delphi&lt;/a&gt;. And as you know, I love automating and when I am surfing the internet I like keeping track of my URLs and being able to retrieving and saving them easily.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;You can download the tool from &lt;a href="http://www.4shared.com/file/bL4lDO96/ThundaxDelphiURLBrowser.html?"&gt;here&lt;/a&gt;. The tool only needs the path to your browser (in my case google chrome) and a list of pre-saved &lt;b&gt;urls&lt;/b&gt; (for example the output list from my chrome extension).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The tool looks like this:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1HwyCT6Wabc/TpotEZJzKyI/AAAAAAAACyA/uQOMwlC_gpY/s1600/chromee.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="261" src="http://4.bp.blogspot.com/-1HwyCT6Wabc/TpotEZJzKyI/AAAAAAAACyA/uQOMwlC_gpY/s400/chromee.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;And it uses the &lt;b&gt;ShellExecute&lt;/b&gt; function from &lt;b&gt;ShellAPI&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Enjoy it!.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related Links:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://delphi.about.com/cs/adptips2004/a/bltip0504_4.htm"&gt;Open browser&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-5560064819427422938?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/5560064819427422938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/10/open-list-of-urls.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/5560064819427422938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/5560064819427422938'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/10/open-list-of-urls.html' title='Open a list of URLs'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-8Nk-zgaEdRE/TposYo3lSHI/AAAAAAAACx4/oZZDz6oQssc/s72-c/images.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-6966213899184181351</id><published>2011-10-16T02:48:00.000+02:00</published><updated>2011-10-18T18:45:05.073+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Operating System'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Monitoring Desktop Heap Memory and troubleshooting issues (part I)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Ot0ecbXaNYc/TpoEe0D_IdI/AAAAAAAACxY/PSTAZdLa4os/s1600/heap.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://4.bp.blogspot.com/-Ot0ecbXaNYc/TpoEe0D_IdI/AAAAAAAACxY/PSTAZdLa4os/s200/heap.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This article wants to put together a series of interesting articles to monitor the &lt;i&gt;desktop&lt;/i&gt; &lt;a href="http://en.wikipedia.org/wiki/Heap_memory"&gt;heap memory&lt;/a&gt; and finally put forward a little in-house tool to monitor the output of &lt;a href="http://www.airesoft.co.uk/desktopheapmonitor"&gt;Desktop Heap Information Monitor Tool v8.1&lt;/a&gt;&amp;nbsp;from &lt;a href="http://www.airesoft.co.uk/"&gt;AireSoft&lt;/a&gt; using the algorithm from "&lt;a href="http://thundaxsoftware.blogspot.com/2011/07/capturing-console-output-with-delphi.html"&gt;capturing output capture&lt;/a&gt;" from one of my previous posts.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;Installing "Desktop Heap Information Monitor Tool v8.1:&lt;/b&gt;&lt;br /&gt;To correctly install the &lt;a href="http://www.airesoft.co.uk/files/dheapdmp/dheapdmp.zip"&gt;tool&lt;/a&gt;&amp;nbsp;(&lt;b&gt;dheapdmp.zip&lt;/b&gt;), go to &lt;a href="http://www.airesoft.co.uk/desktopheapmonitor"&gt;AireSoft&lt;/a&gt; web page and follow the installation steps from the web. If an error pops up, follow the guidelines from the following links:&lt;br /&gt;- &lt;a href="http://www.eggheadcafe.com/microsoft/Windows-Debugging/31483162/dheapinst--driver-installation-error-occured-2.aspx"&gt;dheapInst - driver installation error occurred (2)&lt;/a&gt;.&lt;br /&gt;-&amp;nbsp;&lt;a href="http://blogs.msdn.com/b/alejacma/archive/2008/07/29/how-to-use-dheapmon-exe-to-troubleshoot-desktop-heap-issues.aspx"&gt;dheapinst - Driver Installation error occured (124)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If it helps, I got the error "&lt;b&gt;Driver Installation error occured (124)&lt;/b&gt;" and I fixed it by changing the compatibility of &lt;b&gt;dheapinst&lt;/b&gt; to &lt;b&gt;Windows Server 2003 SP1&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Once installed, if we run &lt;b&gt;dheapmon -l&lt;/b&gt; to install the monitor and then again &lt;b&gt;dheapmon&lt;/b&gt;, we will see the heap memory information:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-eCEa6gjuXH4/TpoUGJl-LKI/AAAAAAAACxg/4xSXUKY6vUw/s1600/heap22.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="197" src="http://1.bp.blogspot.com/-eCEa6gjuXH4/TpoUGJl-LKI/AAAAAAAACxg/4xSXUKY6vUw/s400/heap22.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;More about "Desktop heap memory":&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;The Desktop Heap Monitor is a tool that examines usage of desktop heap.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;WIN32 subsystem has internal heap area known as "&lt;b&gt;desktop heap&lt;/b&gt;." When you run a large number of Windows-based programs, "&lt;b&gt;Out Of Memory&lt;/b&gt;" error messages appear when you attempt to start new programs or try to use programs that are already running, even though &lt;u&gt;you still have plenty of physical and pagefile memory available&lt;/u&gt;.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;This behavior can occur if the desktop heap in the WIN32 subsystem is &lt;b&gt;depleted&lt;/b&gt;&lt;/i&gt;. To fix this problem follow the next workaround :&lt;br /&gt;-&amp;nbsp;&lt;a href="http://support.microsoft.com/kb/126962/"&gt;http://support.microsoft.com/kb/126962/&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;b&gt;source&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=17782"&gt;Microsoft&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Increasing "Desktop heap memory":&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To increase desktop heap memory, we can use the tool "&lt;a href="http://go.microsoft.com/?linkid=9743805"&gt;Microsoft Fix It 50496&lt;/a&gt;" that will increase the parameters automatically. If you want to fix it manually, you just need to go to the following registry path and tweak it:&lt;br /&gt;&lt;b&gt;- HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-u2SchnYOq5U/Tpom5CNrATI/AAAAAAAACxo/KiYetQqjAfg/s1600/registry.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="202" src="http://1.bp.blogspot.com/-u2SchnYOq5U/Tpom5CNrATI/AAAAAAAACxo/KiYetQqjAfg/s400/registry.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Where the default values for my windows vista are:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;%SystemRoot%\system32\csrss.exe&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;ObjectDirectory=\Windows&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;SharedSection=1024,12288,512&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Windows=On&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;SubSystemType=Windows&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;ServerDll=basesrv,1&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;ServerDll=winsrv:UserServerDllInitialization,3&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;ServerDll=winsrv:ConServerDllInitialization,2&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;ProfileControl=Off&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;MaxRequestThreads=16&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;i&gt;The first SharedSection value (1024) defines the heap size common to all desktops. This includes the global handle table.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;The second SharedSection value (12288) controls the size of the desktop heap that is associated with an interactive window station (used for Windows objects). This static value is used to prevent ill- behaved applications from consuming too many resources. Because the desktop heap is mapped into each process' address space, this value should not be set to an arbitrarily high value (as it would decrease performance), but should only be increased sufficiently to allow all the desired applications to run.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;The third SharedSection value (512) controls the size of the desktop heap for each desktop that is associated with a "non-interactive" window station.&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: right;"&gt;&lt;b&gt;source&lt;/b&gt; : &lt;a href="http://support.microsoft.com/kb/126962/"&gt;microsoft&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Monitoring Desktop Heap Memory:&lt;/b&gt;&lt;br /&gt;As it is quite difficult to monitor, I have developed a little tool that you can download from &lt;a href="http://www.4shared.com/file/MwRL_guJ/ThundaxHeapMonitorTool.html"&gt;here&lt;/a&gt;, to log every change on the table result.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-WEcNFh_xGJA/TpooUTpuJaI/AAAAAAAACxw/Fz5oNVO6zNg/s1600/Monitoring.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="377" src="http://2.bp.blogspot.com/-WEcNFh_xGJA/TpooUTpuJaI/AAAAAAAACxw/Fz5oNVO6zNg/s400/Monitoring.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Just point the tool to the &lt;b&gt;dheapmon&lt;/b&gt; executable and press start. Every &lt;b&gt;10s&lt;/b&gt; the output will be scanned and displayed into the component, taking into account the previous value, and if a change occurs it will be displayed in another colour.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;Final notes:&lt;/b&gt;&lt;br /&gt;Desktop Heap memory is related to "&lt;b&gt;&lt;a href="http://support.microsoft.com/kb/126962"&gt;Out of Memory&lt;/a&gt;&lt;/b&gt;" issues and this article will help you to work with this parameter and how to deal with it and monitor it.&lt;br /&gt;&lt;br /&gt;Stay tuned for Part 2, where I will go further with Desktop heap memory using Delphi.&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;Jordi Corbilla&lt;/i&gt;.&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/ntdebugging/archive/2007/01/04/desktop-heap-overview.aspx"&gt;Desktop Heap Overview&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.airesoft.co.uk/2009/10/desktop-heap-monitor-vista-7/"&gt;Desktop Heap Monitor for Windows Vista&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.airesoft.co.uk/desktopheapmonitor"&gt;Desktop Heap Memory for Windows Server 2008, Windows 7&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx"&gt;Download Windows Symbol Packages&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;184802"&gt;User32.dll or Kernel32.dll fails to initialize&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;840342"&gt;Applications may not run correctly in a Terminal Services environment&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/windows/hardware/gg463016.aspx"&gt;Debugging tools for Windows 32 bits&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://forums.cnet.com/7723-19411_102-383701.html"&gt;"Not enough storage is available to process this command"&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/914216"&gt;Error message that is similar to the following when you try to install the Desktop Heap Monitor tool: "dheapinst - Win32k.sys symbol load error, correct symbol required"&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-6966213899184181351?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/6966213899184181351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/10/monitoring-desktop-heap-memory-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6966213899184181351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6966213899184181351'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/10/monitoring-desktop-heap-memory-and.html' title='Monitoring Desktop Heap Memory and troubleshooting issues (part I)'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Ot0ecbXaNYc/TpoEe0D_IdI/AAAAAAAACxY/PSTAZdLa4os/s72-c/heap.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2310236259155410968</id><published>2011-10-08T23:59:00.000+02:00</published><updated>2011-10-08T23:59:38.481+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Steve Jobs'/><category scheme='http://www.blogger.com/atom/ns#' term='Videos'/><title type='text'>My tribute to a man who was a unique genius, Steve Jobs</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/8rwsuXHA7RA" width="420"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;i&gt;Steve Jobs was a unique creative genius whose life was far too brief&lt;/i&gt;. &lt;b&gt;Source&lt;/b&gt;: &lt;a href="http://www.macworld.co.uk/apple-business/news/index.cfm?newsid=3309222"&gt;macworld.co.uk&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2310236259155410968?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2310236259155410968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/10/my-tribute-to-man-who-was-unique-genius.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2310236259155410968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2310236259155410968'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/10/my-tribute-to-man-who-was-unique-genius.html' title='My tribute to a man who was a unique genius, Steve Jobs'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/8rwsuXHA7RA/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-4623470975708567912</id><published>2011-09-18T16:17:00.000+02:00</published><updated>2011-09-18T16:17:06.437+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Extensions'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Chrome'/><title type='text'>Get Chrome active tab URL using Delphi</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-r9g6hJk4hWo/TnXHOxOEkLI/AAAAAAAACww/wlMiz3xFQYw/s1600/log.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="53" src="http://3.bp.blogspot.com/-r9g6hJk4hWo/TnXHOxOEkLI/AAAAAAAACww/wlMiz3xFQYw/s200/log.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;After developing &lt;a href="http://thundaxsoftware.blogspot.com/2011/09/my-first-google-chrome-extension-get.html"&gt;my first Chrome extension&lt;/a&gt;&amp;nbsp;&lt;b&gt;to retrieve all URLs from Google chrome&lt;/b&gt;, I have been trying to reproduce the same behaviour using Delphi, but it was impossible. Chrome is still adding some new features and extending their extensions for developers. For example, others navigators such as Internet Explorer and Firefox they have a &lt;a href="http://en.wikipedia.org/wiki/Dynamic_Data_Exchange"&gt;DDE&lt;/a&gt; extension to retrieve some of the properties but not available for Chrome.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The best way I found was using FindWindow and SendMessage windows functions to get the text from the tab and get tue URL. It's not a win solution but will help you to retrieve the URL of the active page without copy-paste action, just by switching to the next tab and retrieving data from the tool.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The basic code to achieve this is the following one:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;function GetChromeActiveTabURL(Wnd: HWnd; Param: LParam): Bool; stdcall;&lt;br /&gt;var&lt;br /&gt;  urls: TStrings;&lt;br /&gt;  hWndMainWindow, hWndTab: HWND;&lt;br /&gt;  Buffer : array[0..255] of Char;&lt;br /&gt;  res : boolean;&lt;br /&gt;begin&lt;br /&gt;  res := true;&lt;br /&gt;  urls := TStrings(Param);&lt;br /&gt;  SendMessage(Wnd, WM_GETTEXT, Length(Buffer), integer(@Buffer[0]));&lt;br /&gt;  hWndMainWindow := FindWindow('Chrome_WidgetWin_0', Buffer);&lt;br /&gt;  application.ProcessMessages;&lt;br /&gt;  if hWndMainWindow &amp;lt;&amp;gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    hWndTab := FindWindowEx(hWndMainWindow, 0, 'Chrome_AutocompleteEditView', nil);&lt;br /&gt;    if hWndTab &amp;lt;&amp;gt; 0 then&lt;br /&gt;    begin&lt;br /&gt;      SendMessage(hWndTab, WM_GETTEXT, Length(Buffer), integer(@Buffer));&lt;br /&gt;      urls.Add(Buffer);&lt;br /&gt;      res := false;&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;  Result := res;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TUrlChrome.GetUrl(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  Urls: TStringList;&lt;br /&gt;begin&lt;br /&gt;  Urls := TStringList.Create;&lt;br /&gt;  try&lt;br /&gt;    EnumWindows(@GetChromeActiveTabURL, LParam(Urls));&lt;br /&gt;    Memo1.Lines.AddStrings(Urls);&lt;br /&gt;  finally&lt;br /&gt;    FreeAndNil(Urls);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;To get the &lt;a href="http://msdn.microsoft.com/en-us/library/ms633499(v=VS.85).aspx"&gt;class name window&lt;/a&gt;, we can use &lt;a href="http://www.softpedia.com/get/Security/Security-Related/Winspector.shtml"&gt;Winspector&lt;/a&gt; to inspect chrome and get the names for the main window and for the tabs:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Chrome_WidgetWin_0:&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-3G0GN7d2OpM/TnX2fcmUbVI/AAAAAAAACw8/qUeUzWcwTS4/s1600/win.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="278" src="http://3.bp.blogspot.com/-3G0GN7d2OpM/TnX2fcmUbVI/AAAAAAAACw8/qUeUzWcwTS4/s400/win.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Chrome_AutocompleteEditView:&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-_DJrjSgOTbg/TnX2eGVzuSI/AAAAAAAACw4/2b3SWO1UBPY/s1600/tab.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://3.bp.blogspot.com/-_DJrjSgOTbg/TnX2eGVzuSI/AAAAAAAACw4/2b3SWO1UBPY/s400/tab.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And you can get the tool from here: &lt;a href="http://www.4shared.com/file/K4J67vnt/ThundaxChromeURL.html"&gt;ThundaxChromeURL&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hZkPlbxhFGU/TnXrbS2XBRI/AAAAAAAACw0/kKKPSDFJodU/s1600/chrom.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://4.bp.blogspot.com/-hZkPlbxhFGU/TnXrbS2XBRI/AAAAAAAACw0/kKKPSDFJodU/s400/chrom.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I'm not proud of this solution, but at least it will work for current versions of Chrome. I also recommend to give a go to my &lt;a href="http://thundaxsoftware.blogspot.com/2011/09/my-first-google-chrome-extension-get.html"&gt;chrome extension&lt;/a&gt;&amp;nbsp;(It's not been published into Chrome market, it turns out that you have to pay a $5.00 fee), that is much better than the tool as it's able to get all urls.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/5222301/how-to-get-the-url-from-chrome-using-delphi"&gt;How to get url from chrome&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.softpedia.com/progDownload/Winspector-Download-117157.html"&gt;WinsPector Download&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms633497(v=vs.85).aspx"&gt;EnumWindows function&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.delphipages.com/forum/showthread.php?t=115353"&gt;Get list opened windows&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.swissdelphicenter.ch/torry/showcode.php?id=198"&gt;Get url instances internet explorer&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms633500(v=VS.85).aspx"&gt;FindWindowEx function&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/147929/c-sending-messages-to-google-chrome-from-c-application"&gt;Sending messages to Chrome&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms633515(v=VS.85).aspx"&gt;GetWindow function&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.swissdelphicenter.ch/torry/showcode.php?id=410"&gt;Enumerate windows and child windows&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/5086582/enumchildwindows-over-tabcontroller-items-in-the-untouched-tabs-are-not-captured"&gt;Enum child windows&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/6002044/enumwindows-and-enumchildwindows-to-keep-my-treeview-updated"&gt;Enum child windows treeview&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/Answers/246371/How-to-get-handles-of-tabs.aspx#answer1"&gt;Get handles of tabs&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-US/Library/ms633494.aspx"&gt;EnumChildWindows function&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-4623470975708567912?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/4623470975708567912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/09/get-chrome-active-tab-url-using-delphi.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4623470975708567912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4623470975708567912'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/09/get-chrome-active-tab-url-using-delphi.html' title='Get Chrome active tab URL using Delphi'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-r9g6hJk4hWo/TnXHOxOEkLI/AAAAAAAACww/wlMiz3xFQYw/s72-c/log.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-8894917063926777233</id><published>2011-09-17T21:45:00.001+02:00</published><updated>2011-09-18T12:18:10.662+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extensions'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Chrome'/><title type='text'>My first Google Chrome extension (Get all URLs from Google Chrome tabs)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-3w-bxqSD9OU/TnTxjo9xONI/AAAAAAAACwg/_lozgENiXoc/s1600/images.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://2.bp.blogspot.com/-3w-bxqSD9OU/TnTxjo9xONI/AAAAAAAACwg/_lozgENiXoc/s200/images.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As a good internet researcher I always have hundreds of tabs opened in my &lt;a href="http://www.google.com/chrome/?installdataindex=nosearch&amp;amp;hl=en-GB&amp;amp;brand=CHMA&amp;amp;utm_campaign=en-GB&amp;amp;utm_source=en-GB-ha-emea-uk-bk&amp;amp;utm_medium=ha"&gt;Chrome&lt;/a&gt; navigator and sometimes I find a bit of chore to copy and paste all the URL that I have done a research on and that any other day &lt;b&gt;I would be using again&lt;/b&gt;. So, that's my extension about, to display in a pop up window all the url's from all tabs to then copy them without problems (the correct name would be [search purposes] -&amp;gt; &lt;b&gt;&lt;i&gt;Get all URLs from Google Chrome tabs&lt;/i&gt;&lt;/b&gt;).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I have been struggling to write a little tool using Delphi, but it only works with &lt;b&gt;Internet explorer&lt;/b&gt; and &lt;b&gt;Mozilla firefox&lt;/b&gt;, so I thought it could be great to give &lt;a href="http://code.google.com/chrome/extensions/getstarted.html"&gt;chrome extensions&lt;/a&gt; a try.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;It is quite easy to develop and debug using all the development tools available from the navigator itself. As in the following example, I have opened 3 new tabs with the &lt;b&gt;&lt;a href="http://www.google.es/"&gt;www.google.es&lt;/a&gt;&lt;/b&gt; URL, and if we click the extension button, will get a pop up list with the URLs from all tabs:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-aHgPh--Xck4/TnT0867SjhI/AAAAAAAACwk/9wzgiTQeEa4/s1600/result.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="82" src="http://3.bp.blogspot.com/-aHgPh--Xck4/TnT0867SjhI/AAAAAAAACwk/9wzgiTQeEa4/s400/result.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The source code is as follows:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;manifest.json:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: jscript"&gt;{&lt;br /&gt;  "name": "Get All URL's Extension by Jordi Corbilla",&lt;br /&gt;  "version": "1.0",&lt;br /&gt;  "description": "Extension to display all the URL's from all TABs.",&lt;br /&gt;  "browser_action": {&lt;br /&gt;    "default_icon": "icon.ico",&lt;br /&gt;    "popup": "urlList.html"&lt;br /&gt;  },&lt;br /&gt;  "permissions": [&lt;br /&gt;    "tabs"&lt;br /&gt;  ],&lt;br /&gt;  "icons" : {&lt;br /&gt;&lt;br /&gt;    "48" : "icon.ico",&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    "128" : "icon.ico"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;urlList.html:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: jscript"&gt;&amp;lt;!DOCTYPE&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt; * Copyright (c) 2011 Jordi Corbilla. All rights reserved.  &lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;script&amp;gt;&lt;br /&gt;      chrome.tabs.getAllInWindow(null, function(tabs) {&lt;br /&gt;        tabs.forEach(function(tab){&lt;br /&gt;          myFunction(tab.url);	&lt;br /&gt;        });&lt;br /&gt;      });&lt;br /&gt;&lt;br /&gt;      function myFunction(tablink) {&lt;br /&gt;        console.log(tablink);&lt;br /&gt;        var oNewNode = document.createElement("LI");&lt;br /&gt;        urlList.appendChild(oNewNode);&lt;br /&gt;        oNewNode.innerText=tablink;  &lt;br /&gt;      }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;URL List&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;ul ID = urlList&amp;gt;&lt;br /&gt;    &amp;lt;/ul&amp;gt;&lt;br /&gt;  &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;You can download the extension from here: &lt;a href="http://www.4shared.com/file/DvLoNsdE/URLJCExtension.html"&gt;URLJCExtension.zip&lt;/a&gt;. To install, you only need to unzip the file and then go to&amp;nbsp;&lt;a href="chrome://extensions/"&gt;chrome://extensions/&lt;/a&gt;, expand developer mode and load my extension (from the unzipped folder):&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-gwlRISgabb0/TnT349cLCLI/AAAAAAAACwo/IwLv5LPW2Bw/s1600/extension.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://3.bp.blogspot.com/-gwlRISgabb0/TnT349cLCLI/AAAAAAAACwo/IwLv5LPW2Bw/s400/extension.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As the extension uses the console log method, you can see all the links in the console (just for debug purposes, but it's really good to have a go on it).&lt;br /&gt;&lt;br /&gt;Just right click on the extension icon and then "Inspect Pop-up" and you'll see the following window with the current list of urls:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ywAPi1Ud5OM/TnXFTg7c64I/AAAAAAAACws/XJszlqh8MFg/s1600/debug.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-ywAPi1Ud5OM/TnXFTg7c64I/AAAAAAAACws/XJszlqh8MFg/s400/debug.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Enjoy the extension!.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/217957/how-to-print-debug-messages-in-the-google-chrome-javascript-console"&gt;Print debug messages chrome console&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/6453860/how-to-match-a-url-from-a-tab-with-an-array-of-urls-google-chrome-extension"&gt;Array of URLs&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://supercollider.dk/2010/04/chrome-extensions-for-web-hackers-part-%E2%85%A1-background-pages-255"&gt;Chrome Extensions Hacking Part 2&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms535934(v=vs.85).aspx"&gt;appendChild method&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/1979583/how-can-i-get-the-url-for-a-google-chrome-tab"&gt;Get URL from chrome tab&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-8894917063926777233?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/8894917063926777233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/09/my-first-google-chrome-extension-get.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/8894917063926777233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/8894917063926777233'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/09/my-first-google-chrome-extension-get.html' title='My first Google Chrome extension (Get all URLs from Google Chrome tabs)'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-3w-bxqSD9OU/TnTxjo9xONI/AAAAAAAACwg/_lozgENiXoc/s72-c/images.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2640753993764039382</id><published>2011-08-26T18:14:00.000+02:00</published><updated>2011-08-26T18:14:05.525+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Chaining Method'/><category scheme='http://www.blogger.com/atom/ns#' term='Aspect oriented programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Dependency Injection'/><title type='text'>Fluent Interfaces example using Delphi</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-vu--nNY_6xo/Tle-M2RuTxI/AAAAAAAACwQ/WZssyPOclS8/s1600/chain200.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-vu--nNY_6xo/Tle-M2RuTxI/AAAAAAAACwQ/WZssyPOclS8/s1600/chain200.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I was introduced to &lt;a href="http://en.wikipedia.org/wiki/Fluent_interface"&gt;Fluent interfaces&lt;/a&gt; when I was developing with Java using &lt;a href="http://en.wikipedia.org/wiki/Dependency_injection"&gt;Dependency Injection&lt;/a&gt;&amp;nbsp;and somebody told me that it could be really interesting if I post an example using &lt;b&gt;Delphi&lt;/b&gt; and chaining method, and here I am!. I have developed a simple example that uses &lt;a href="http://en.wikipedia.org/wiki/Method_chaining"&gt;chaining methods&lt;/a&gt; to populate a &lt;i&gt;THouse&lt;/i&gt; object with &lt;i&gt;TDoors&lt;/i&gt; and &lt;i&gt;TWindows&lt;/i&gt; objects with the hope it will make it easy to understand the concept. There are several examples on the net, but I couldn't find any interesting enough. So this simple example will try to introduce you to "how to develop fluent interfaces using method chaining" with the aim of writing more readable code. The overview of the architecture is the following one, using &lt;b&gt;UML&lt;/b&gt; notation:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Z6eJforpTOQ/TlfDX616MtI/AAAAAAAACwU/-GSfsh0M0hM/s1600/uFI.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://1.bp.blogspot.com/-Z6eJforpTOQ/TlfDX616MtI/AAAAAAAACwU/-GSfsh0M0hM/s400/uFI.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The Fluent Interface unit example is as follows (uFI.pas) using generics and interfaces:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;// ***********************************************&lt;br /&gt;// @author  jordi corbilla&lt;br /&gt;// @comment Fluent interface composition example&lt;br /&gt;//&lt;br /&gt;// ***********************************************&lt;br /&gt;&lt;br /&gt;unit uFI;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;    Graphics, Contnrs, Generics.Collections, Classes;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;    TWindow = class;&lt;br /&gt;&lt;br /&gt;    IWindow = interface&lt;br /&gt;        function SetColor(color: TColor): TWindow;&lt;br /&gt;        function ToString(): string;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    TWindow = class(TInterfacedObject, IWindow)&lt;br /&gt;    private&lt;br /&gt;        FColor: TColor;&lt;br /&gt;    public&lt;br /&gt;        function SetColor(color: TColor): TWindow;&lt;br /&gt;        function ToString(): string; override;&lt;br /&gt;        class function New: TWindow;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    TDoor = class;&lt;br /&gt;&lt;br /&gt;    IDoor = interface&lt;br /&gt;        function SetColor(color: TColor): TDoor;&lt;br /&gt;        function ToString(): string;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    TDoor = class(TInterfacedObject, IDoor)&lt;br /&gt;    private&lt;br /&gt;        FColor: TColor;&lt;br /&gt;    public&lt;br /&gt;        function SetColor(color: TColor): TDoor;&lt;br /&gt;        function ToString(): string; override;&lt;br /&gt;        class function New: TDoor;&lt;br /&gt;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    IHouse = interface&lt;br /&gt;        function AddWindow(window: TWindow): IHouse;&lt;br /&gt;        function AddDoor(door: TDoor): IHouse;&lt;br /&gt;        function ToString(): String;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    THouseItemsList&amp;lt;T&amp;gt; = class(TObjectList)&lt;br /&gt;        function ToString(): string; override;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    TDoorList = class(THouseItemsList&amp;lt;IDoor&amp;gt;)&lt;br /&gt;        function ToString(): string; override;&lt;br /&gt;    public&lt;br /&gt;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    TWindowList = class(THouseItemsList&amp;lt;IWindow&amp;gt;)&lt;br /&gt;        function ToString(): string; override;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    THouse = class(TInterfacedObject, IHouse)&lt;br /&gt;    private&lt;br /&gt;        FDoorList: TDoorList;&lt;br /&gt;        FWindowList: TWindowList;&lt;br /&gt;    protected&lt;br /&gt;        function AddWindow(window: TWindow): IHouse;&lt;br /&gt;        function AddDoor(door: TDoor): IHouse;&lt;br /&gt;    public&lt;br /&gt;        property WindowList: TWindowList read FWindowList;&lt;br /&gt;        property DoorList: TDoorList read FDoorList;&lt;br /&gt;        class function New: IHouse;&lt;br /&gt;        function ToString(): String; override;&lt;br /&gt;        constructor Create();&lt;br /&gt;        destructor Destroy(); override;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;    SysUtils;&lt;br /&gt;&lt;br /&gt;{ THouse }&lt;br /&gt;&lt;br /&gt;function THouse.AddDoor(door: TDoor): IHouse;&lt;br /&gt;begin&lt;br /&gt;    Self.FDoorList.Add(door);&lt;br /&gt;    result := Self;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function THouse.AddWindow(window: TWindow): IHouse;&lt;br /&gt;begin&lt;br /&gt;    Self.FWindowList.Add(window);&lt;br /&gt;    result := Self;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor THouse.Create;&lt;br /&gt;begin&lt;br /&gt;    FDoorList := TDoorList.Create;&lt;br /&gt;    FWindowList := TWindowList.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor THouse.Destroy;&lt;br /&gt;begin&lt;br /&gt;    FreeAndNil(FDoorList);&lt;br /&gt;    FreeAndNil(FWindowList);&lt;br /&gt;    inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function THouse.New: IHouse;&lt;br /&gt;begin&lt;br /&gt;    result := Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function THouse.ToString: String;&lt;br /&gt;var&lt;br /&gt;    description: TStringList;&lt;br /&gt;begin&lt;br /&gt;    description := TStringList.Create;&lt;br /&gt;    try&lt;br /&gt;        description.Add(Self.FDoorList.ToString);&lt;br /&gt;        description.Add(Self.FWindowList.ToString);&lt;br /&gt;    finally&lt;br /&gt;        result := description.Text;&lt;br /&gt;        description.Free;&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TWindow }&lt;br /&gt;&lt;br /&gt;class function TWindow.New: TWindow;&lt;br /&gt;begin&lt;br /&gt;    result := Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TWindow.SetColor(color: TColor): TWindow;&lt;br /&gt;begin&lt;br /&gt;    Self.FColor := color;&lt;br /&gt;    result := Self;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TWindow.ToString: string;&lt;br /&gt;begin&lt;br /&gt;    result := 'Window color ' + ColorToString(FColor) + sLineBreak;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TDoor }&lt;br /&gt;&lt;br /&gt;class function TDoor.New: TDoor;&lt;br /&gt;begin&lt;br /&gt;    result := Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TDoor.SetColor(color: TColor): TDoor;&lt;br /&gt;begin&lt;br /&gt;    Self.FColor := color;&lt;br /&gt;    result := Self;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TDoor.ToString: string;&lt;br /&gt;begin&lt;br /&gt;    result := 'Door color ' + ColorToString(FColor) + sLineBreak;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ THouseItemsList }&lt;br /&gt;&lt;br /&gt;function THouseItemsList&amp;lt;T&amp;gt;.ToString: string;&lt;br /&gt;var&lt;br /&gt;    i: Integer;&lt;br /&gt;    description: String;&lt;br /&gt;begin&lt;br /&gt;    for i := 0 to Self.count - 1 do&lt;br /&gt;        description := description + ' ' + Self[i].ToString;&lt;br /&gt;    result := description;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TDoorList }&lt;br /&gt;&lt;br /&gt;function TDoorList.ToString: string;&lt;br /&gt;var&lt;br /&gt;    description: TStringList;&lt;br /&gt;begin&lt;br /&gt;    description := TStringList.Create;&lt;br /&gt;    try&lt;br /&gt;        description.Add('Number of doors: ' + inttostr(Self.count));&lt;br /&gt;        description.Add('Descriptions: ');&lt;br /&gt;        description.Add( inherited ToString);&lt;br /&gt;    finally&lt;br /&gt;        result := description.Text;&lt;br /&gt;        FreeAndNil(description);&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TWindowList }&lt;br /&gt;&lt;br /&gt;function TWindowList.ToString: string;&lt;br /&gt;var&lt;br /&gt;    description: TStringList;&lt;br /&gt;begin&lt;br /&gt;    description := TStringList.Create;&lt;br /&gt;    try&lt;br /&gt;        description.Add('Number of Windows: ' + inttostr(Self.count));&lt;br /&gt;        description.Add('Descriptions: ');&lt;br /&gt;        description.Add( inherited ToString);&lt;br /&gt;    finally&lt;br /&gt;        result := description.Text;&lt;br /&gt;        FreeAndNil(description);&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Now it comes when we can use the object using &lt;b&gt;FI notation&lt;/b&gt; in a more readable way:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;var&lt;br /&gt;    House: IHouse;&lt;br /&gt;begin&lt;br /&gt;    House := THouse.New.AddWindow(TWindow.New.SetColor(clFuchsia)).AddDoor(TDoor.New.SetColor(clWhite))&lt;br /&gt;        .AddWindow(TWindow.New.SetColor(clRed)).AddDoor(TDoor.New.SetColor(clGreen));&lt;br /&gt;    Memo1.Lines.Add(House.ToString);&lt;br /&gt;    House := nil;&lt;br /&gt;&lt;br /&gt;    House := THouse.New;&lt;br /&gt;    House.AddWindow(TWindow.New.SetColor(clRed)).AddWindow(TWindow.New.SetColor(clBlue)).AddWindow(TWindow.New.SetColor(clGreen));&lt;br /&gt;    House.AddDoor(TDoor.New.SetColor(clRed)).AddDoor(TDoor.New.SetColor(clBlue)).AddDoor(TDoor.New.SetColor(clGreen));&lt;br /&gt;    Memo1.Lines.Add(House.ToString);&lt;br /&gt;    House := nil;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Notice that now, we can chain our objects, composing the structure of the House by using the &lt;b&gt;AddWindow&lt;/b&gt; and &lt;b&gt;AddDoor&lt;/b&gt; method. To display the result I'm using the &lt;b&gt;ToString&lt;/b&gt; method that will do the job for my purpose.&lt;br /&gt;&lt;br /&gt;And the result of the previous execution:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Number of doors: 2&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Descriptions:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;Door color clWhite&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;Door color clGreen&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Number of Windows: 2&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Descriptions:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;Window color clFuchsia&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;Window color clRed&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Number of doors: 3&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Descriptions:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;Door color clRed&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;Door color clBlue&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;Door color clGreen&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Number of Windows: 3&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Descriptions:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;Window color clRed&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;Window color clBlue&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;Window color clGreen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Just play with it and you'll experience the powerfulness of this method. I hope you like it.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I'm looking forward to your comments.&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;b&gt;Jordi&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2640753993764039382?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2640753993764039382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/08/fluent-interfaces-example-using-delphi.html#comment-form' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2640753993764039382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2640753993764039382'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/08/fluent-interfaces-example-using-delphi.html' title='Fluent Interfaces example using Delphi'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-vu--nNY_6xo/Tle-M2RuTxI/AAAAAAAACwQ/WZssyPOclS8/s72-c/chain200.jpg' height='72' width='72'/><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-7164906712504454754</id><published>2011-08-22T22:08:00.002+02:00</published><updated>2011-08-22T22:14:00.740+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><category scheme='http://www.blogger.com/atom/ns#' term='Direct2D'/><category scheme='http://www.blogger.com/atom/ns#' term='Physics'/><category scheme='http://www.blogger.com/atom/ns#' term='Computational geometry'/><title type='text'>Building my own Delphi Physics Engine part IX</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-jHBJ5jwI4dc/TlF9AQkbBrI/AAAAAAAACwI/Du6WP16S9EU/s1600/Direct2d.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="168" src="http://2.bp.blogspot.com/-jHBJ5jwI4dc/TlF9AQkbBrI/AAAAAAAACwI/Du6WP16S9EU/s200/Direct2d.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;I'm quite familiar with &lt;a href="http://en.wikipedia.org/wiki/Graphics_Device_Interface"&gt;&lt;b&gt;GDI&lt;/b&gt;&lt;/a&gt;, the graphics provided under &lt;b&gt;Microsoft&lt;/b&gt; and which is widely used in Windows applications. &lt;a href="http://code.google.com/p/thundax-delphi-physics-engine/"&gt;TDPE&lt;/a&gt; is now ready to use &lt;a href="http://www.google.co.uk/url?sa=t&amp;amp;source=web&amp;amp;cd=1&amp;amp;ved=0CCoQFjAA&amp;amp;url=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fdd370990(v%3Dvs.85).aspx&amp;amp;ei=JYdRTr-mNY-DhQez_a3XBg&amp;amp;usg=AFQjCNHH9HLdxPoq3pJWm5RTGR77oPJQ4Q&amp;amp;sig2=1C6vNAUfUqoN9xoG9Nbr-A"&gt;Direct2D&lt;/a&gt; as now it's fully supported by &lt;b&gt;Delphi 2010&lt;/b&gt; and &lt;b&gt;XE&lt;/b&gt;. According to MSDN, &lt;b&gt;Direct2D&lt;/b&gt; is:&amp;nbsp;&lt;i&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;a hardware-accelerated, immediate-mode, 2-D graphics API that provides high performance and high quality rendering for 2-D geometry, bitmaps, and text. The Direct2D API is designed to interoperate well with GDI, GDI+, and Direct3D.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As I'm testing this under &lt;b&gt;Windows Vista&lt;/b&gt;, I've had to upgrade my windows version to &lt;b&gt;Service Pack 2&lt;/b&gt; and then I've installed the following update (&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=3274"&gt;KB971512&lt;/a&gt; - &lt;i&gt;The Windows Graphics, Imaging, and XPS Library contain the latest advancements in modern graphics technologies for gaming, multimedia, imaging and printing applications&lt;/i&gt;.). Direct2D is already installed in Windows 7.&lt;br /&gt;&lt;br /&gt;We can use the same methods from &lt;b&gt;&lt;a href="http://docwiki.embarcadero.com/VCL/en/Graphics.TCanvas"&gt;TCanvas&lt;/a&gt;&lt;/b&gt; for our &lt;b&gt;&lt;a href="http://docwiki.embarcadero.com/VCL/en/Direct2D.TDirect2DCanvas"&gt;TDirect2DCanvas&lt;/a&gt;&lt;/b&gt; as they derive from the same ancestor &lt;b&gt;&lt;a href="http://docwiki.embarcadero.com/VCL/en/Graphics.TCustomCanvas"&gt;TCustomCanvas&lt;/a&gt;&lt;/b&gt;. But you need to check the documentation for differences in the way they work.&lt;br /&gt;&lt;br /&gt;A simple way to use &lt;b&gt;Direct2D&lt;/b&gt; is as follows:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;uses&lt;br /&gt;    Direct2D, D2D1;&lt;br /&gt;&lt;br /&gt;procedure Paint();&lt;br /&gt;begin&lt;br /&gt;    if TDirect2DCanvas.Supported then&lt;br /&gt;    begin&lt;br /&gt;        d2dCanvas := TDirect2DCanvas.Create(Canvas, ClientRect);&lt;br /&gt;        try&lt;br /&gt;            d2dCanvas.RenderTarget.beginDraw;&lt;br /&gt;            d2dCanvas.RenderTarget.Clear(D2D1ColorF(clBlack));&lt;br /&gt;            d2dCanvas.RenderTarget.SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);&lt;br /&gt;            // drawing goes here&lt;br /&gt;            Paint(d2dCanvas);&lt;br /&gt;            d2dCanvas.RenderTarget.EndDraw;&lt;br /&gt;        finally&lt;br /&gt;            FreeAndNil(d2dCanvas);&lt;br /&gt;        end;&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Here is the result of the Physics Engine using a &lt;b&gt;Direct2D Render&lt;/b&gt; and a &lt;b&gt;GDI Render&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hwDhE4gZTJ8/TlK4XOrQcUI/AAAAAAAACwM/qKLsgqbfu7k/s1600/Dibujo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://4.bp.blogspot.com/-hwDhE4gZTJ8/TlK4XOrQcUI/AAAAAAAACwM/qKLsgqbfu7k/s400/Dibujo.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/_l9DLteBUtc?hl=en&amp;amp;fs=1" width="425"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;You will see the difference when switching from &lt;b&gt;GDI&lt;/b&gt; to &lt;b&gt;Direct2D&lt;/b&gt; as the performance is quite different. When it comes to Direct2D, my computer is getting quite slower as my graphic card is not powerful at all and we can see that it takes a while to render the image.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;GDI uses Pixel graphics but Direct2D can supports vector graphics as well, in which mathematical formulas are used to draw the lines and curves. Vector graphics provides high quality rendering independent of resolution of the device, while the pixelated graphics has dependency with resolution which may results in choppy graphics.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;Most of the GDI APIs are not using anti-aliasing and transparency. Ofcrouse there are functions to do so but always there’s programming cost for taking advantage of these features. Also if we apply transparency and anti-aliasing, the computations are done using CPU. Direct2D can take advantage of graphics hardware and delegate the computationally intensive tasks to &lt;a href="http://en.wikipedia.org/wiki/Graphics_processing_unit"&gt;GPU&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;Source : &lt;a href="http://www.codeproject.com/Articles/95054/Programming-Direct2D-Part-1"&gt;Programming Direct2D&lt;/a&gt;.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Get the latest version here: &lt;a href="http://www.4shared.com/file/gc8ltW55/ThundaxBallsDemo_v1584.html"&gt;ThundaxBallDemo v1.584&lt;/a&gt;.&lt;br /&gt;&lt;b&gt;Interaction:&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;b&gt;'d'&lt;/b&gt; will drop a box with a random colour and a constant angular velocity.&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;b&gt;'f'&lt;/b&gt; will drop a circle with a random colour and a constant angular velocity.&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;b&gt;'mouse interaction'&lt;/b&gt; mouse is able to grab items.&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;b&gt;'q'&lt;/b&gt; Enable/Disable &lt;b&gt;GDI&lt;/b&gt; or &lt;b&gt;Direct2D&lt;/b&gt; rendering.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; You need to have installed Direct2D to run the app using Direct2D, otherwise GDI will be used.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://docwiki.embarcadero.com/RADStudio/en/Using_the_Direct2D_Canvas"&gt;Using Direct2D&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/Articles/95054/Programming-Direct2D-Part-1"&gt;Programming Direct2D&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.infoq.com/news/2009/06/Windows-7-Graphics"&gt;Windows 7 Graphic Engine&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/08/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part VIII&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/06/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part VII&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/05/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part VI&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_05.html"&gt;Building my own Delphi Physics Engine part V&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_04.html"&gt;Building my own Delphi Physics Engine part IV&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part III&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine_10.html"&gt;Building my own Delphi Physics Engine part II&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part I&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-7164906712504454754?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/7164906712504454754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/08/building-my-own-delphi-physics-engine_22.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7164906712504454754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7164906712504454754'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/08/building-my-own-delphi-physics-engine_22.html' title='Building my own Delphi Physics Engine part IX'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-jHBJ5jwI4dc/TlF9AQkbBrI/AAAAAAAACwI/Du6WP16S9EU/s72-c/Direct2d.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-4186519833830600707</id><published>2011-08-10T23:04:00.002+02:00</published><updated>2011-08-10T23:05:02.208+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><category scheme='http://www.blogger.com/atom/ns#' term='Physics'/><category scheme='http://www.blogger.com/atom/ns#' term='Computational geometry'/><title type='text'>Building my own Delphi Physics Engine part VIII</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-XgLtjjG_2nI/TkLhUc0r8fI/AAAAAAAACwA/70vjSJhP-d8/s1600/TDPE2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-XgLtjjG_2nI/TkLhUc0r8fI/AAAAAAAACwA/70vjSJhP-d8/s1600/TDPE2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://code.google.com/p/thundax-delphi-physics-engine/"&gt;TDPE&lt;/a&gt; is almost ready and it will not take long to release the first&amp;nbsp;stable&amp;nbsp;library!. I am eager to continue working on the project trying to sort out different physic&amp;nbsp;scenarios&amp;nbsp;&amp;nbsp;to make my dynamic engine even more realistic. Do not hesitate to give it a try as you will find the experience quite interesting. I am still working on the n-edge object and the cutting tool and trying to &lt;a href="http://en.wikipedia.org/wiki/Code_refactoring"&gt;refactor&lt;/a&gt; all the code to cope with a &lt;a href="http://en.wikipedia.org/wiki/Multilayered_architecture"&gt;layer architecture&lt;/a&gt;. Using this concept, I want to structure my system in a way that every component works using a certain level of abstraction. As you see in the next figure, every object is allocated in the screen while there is another layer which is responsible for the collision detection and another one for the forces interaction. You will notice in the video that there are still little issues to tackle regarding the object interaction as sometimes we can experience overlapping.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ids4c--FLLw/TkLrAIQAEMI/AAAAAAAACwE/Eo8w1mkaAGQ/s1600/Dibujo.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://3.bp.blogspot.com/-ids4c--FLLw/TkLrAIQAEMI/AAAAAAAACwE/Eo8w1mkaAGQ/s320/Dibujo.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;In the figure above, you can see that now the items are not rigid and they interact with each other as they were real items. Notice that the square item will go through the round shape of the circle.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/zhmr2xmExZ8?hl=en&amp;amp;fs=1" width="425"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Enjoy the video!.&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Get the latest executable here: &lt;a href="http://www.4shared.com/file/bffzSTBq/ThundaxBallsDemo_v1504.html"&gt;ThundaxBallDemo v1.504&lt;/a&gt;.&lt;br /&gt;&lt;b&gt;Interaction:&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;b&gt;'d'&lt;/b&gt; will drop a box with a random color and a constant angular velocity&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;b&gt;'f'&lt;/b&gt; will drop a circle with a random color and a constant angular velocity&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;b&gt;'mouse interaction'&lt;/b&gt; mouse is able to grab items&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.edenwaith.com/products/pige/tutorials/collision.php"&gt;Collision Detection&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.essentialmath.com/CollisionDetection.pps"&gt;Collision Detection. Essential maths for programmers&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/06/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part VII&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/05/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part VI&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_05.html"&gt;Building my own Delphi Physics Engine part V&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_04.html"&gt;Building my own Delphi Physics Engine part IV&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part III&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine_10.html"&gt;Building my own Delphi Physics Engine part II&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part I&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-4186519833830600707?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/4186519833830600707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/08/building-my-own-delphi-physics-engine.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4186519833830600707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4186519833830600707'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/08/building-my-own-delphi-physics-engine.html' title='Building my own Delphi Physics Engine part VIII'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-XgLtjjG_2nI/TkLhUc0r8fI/AAAAAAAACwA/70vjSJhP-d8/s72-c/TDPE2.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-8450646618639274651</id><published>2011-07-10T22:07:00.002+02:00</published><updated>2011-07-20T23:38:50.781+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Continuous Integration for your Delphi projects using Jenkins CI</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-YZUFnYXo9gQ/Thn4ktXyuMI/AAAAAAAACvI/vjHFnmFt4ag/s1600/jenkins_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="63" src="http://1.bp.blogspot.com/-YZUFnYXo9gQ/Thn4ktXyuMI/AAAAAAAACvI/vjHFnmFt4ag/s200/jenkins_logo.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Going on with the utilization of &lt;a href="http://thundaxsoftware.blogspot.com/2011/07/delphi-msbuild.html"&gt;Msbuild&lt;/a&gt;, I'm putting forward this post using &lt;a href="http://en.wikipedia.org/wiki/Jenkins_(software)"&gt;Jenkins CI&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Continuous_integration"&gt;Continuous Integration&lt;/a&gt;) &lt;i&gt;previously known as &lt;a href="http://en.wikipedia.org/wiki/Hudson_(software)"&gt;Hudson&lt;/a&gt;&lt;/i&gt;, for your&amp;nbsp;Delphi&amp;nbsp;projects under Windows Vista.&amp;nbsp;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;In a nutshell, Jenkins provides an easy-to-use so-called continuous integration system, making it easier for developers to integrate changes to the project, and making it easier for users to obtain a fresh build. The automated, continuous build increases the productivity.&lt;/span&gt;&lt;/i&gt;&amp;nbsp;(Source: &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Meet+Jenkins"&gt;What is Jenkins?&lt;/a&gt;). With these simple steps I'll lead you&amp;nbsp;throughout the whole installation and configuration of your first &lt;b&gt;Delphi built project&lt;/b&gt; using &lt;b&gt;Jenkins CI&lt;/b&gt; and &lt;b&gt;MsBuild&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;1 . Download the latest version of Jenkins CI.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Use the following &lt;a href="http://mirrors.jenkins-ci.org/windows/latest"&gt;link&lt;/a&gt; to download the latest &lt;b&gt;windows installer&lt;/b&gt;, in my case &lt;b&gt;v1.419&lt;/b&gt;. The default installation path is&amp;nbsp;&lt;b&gt;C:\Program Files\Jenkins&lt;/b&gt; and there you'll find the service wrapper &lt;b&gt;jenkins.exe&lt;/b&gt; and the&amp;nbsp;Java&amp;nbsp;web archive (&lt;b&gt;jenkins.war&lt;/b&gt;) that is very useful to start the Jenkins if you have difficulties&amp;nbsp;installing&amp;nbsp;it with a container. It's very easy to run&amp;nbsp;Jenkins&amp;nbsp;by itself using the command: &lt;b&gt;java -jar jenkins.war&lt;/b&gt; (which uses &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Winstone"&gt;Winstone&lt;/a&gt; as a container).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-1Pd8jGf86jA/Thn8toD_Q4I/AAAAAAAACvM/fHG4ZB66NkE/s1600/jen3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="http://3.bp.blogspot.com/-1Pd8jGf86jA/Thn8toD_Q4I/AAAAAAAACvM/fHG4ZB66NkE/s320/jen3.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;2. Setting up environment variables.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;To make sure that Jenkins runs perfectly, we need to set up the &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Administering+Jenkins"&gt;JENKINS_HOME&lt;/a&gt; environment variable:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-gWIXuYzz_jU/Thn9ZMv6sNI/AAAAAAAACvQ/AY4Xkw6rGGU/s1600/jen4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="27" src="http://3.bp.blogspot.com/-gWIXuYzz_jU/Thn9ZMv6sNI/AAAAAAAACvQ/AY4Xkw6rGGU/s320/jen4.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;3. Adding administrator privileges to Jenkins windows service.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;We need to be sure that the service has enough permissions to be running. To do this, go to console and type down&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;services.msc"&lt;/b&gt;. Then look for &lt;b&gt;Jenkins&lt;/b&gt; service and add the log on information using an administrator account.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-dmGZ897VaEM/Thn_UsXk53I/AAAAAAAACvU/Wr8v2ZxvDUc/s1600/jen5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://3.bp.blogspot.com/-dmGZ897VaEM/Thn_UsXk53I/AAAAAAAACvU/Wr8v2ZxvDUc/s400/jen5.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;I had a lot of troubles trying to execute MSBuild from Jenkins until I realised that the service didn't have enough permissions.&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;4. Installing Jenkins CI plug-ins.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Once&amp;nbsp;everything&amp;nbsp;is done, we can go on with Jenkins and open a web explorer and type &lt;b&gt;&lt;a href="http://localhost:8080/"&gt;http://localhost:8080&lt;/a&gt;&lt;/b&gt;. Now we need to add the following&amp;nbsp;plug-ins:&amp;nbsp;&lt;b&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/MSBuild+Plugin"&gt;Jenkins MSBuild Plugin&lt;/a&gt;&lt;/b&gt; and&amp;nbsp;&lt;b&gt;&lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Setenv+Plugin"&gt;Hudson Setenv Plugin&lt;/a&gt;&lt;/b&gt;. To install them go to "&lt;b&gt;Manage Jenkins&lt;/b&gt;"-&amp;gt; "&lt;a href="http://localhost:8080/pluginManager/"&gt;Manage Pluggins&lt;/a&gt;" -&amp;gt; &lt;a href="http://localhost:8080/pluginManager/available"&gt;Available&lt;/a&gt; and look for them. Then, save the changes at the end of the page and &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Administering+Jenkins"&gt;reload&lt;/a&gt; Jenkins.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Once installed, you'll find them under the &lt;b&gt;Installed section&lt;/b&gt;:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-hvHZMn3_ei8/ThoBQBuGejI/AAAAAAAACvY/eod2OEisivE/s1600/jen6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://1.bp.blogspot.com/-hvHZMn3_ei8/ThoBQBuGejI/AAAAAAAACvY/eod2OEisivE/s400/jen6.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;5. Configure MSBuild.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Now the&amp;nbsp;plug-in is ready, and we need to&amp;nbsp;supply the path of our MSBuild. Go to "Manage Jenkins" -&amp;gt; "&lt;a href="http://localhost:8080/configure"&gt;Configure Jenkins&lt;/a&gt;" and add the Msbuild information in the MSbuild section:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-dw736B6VA3E/ThoCE2OtSGI/AAAAAAAACvc/AiVjviYFSSM/s1600/jen7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://3.bp.blogspot.com/-dw736B6VA3E/ThoCE2OtSGI/AAAAAAAACvc/AiVjviYFSSM/s400/jen7.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;6. Adding environment variables.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As we are trying to build Delphi projects we need to set up Jenkins with the same environment variables included in &lt;b&gt;rsvars.bat&lt;/b&gt; batch file.&amp;nbsp;Go to "Manage Jenkins" -&amp;gt; "&lt;a href="http://localhost:8080/configure"&gt;Configure Jenkins&lt;/a&gt;" and add the following environment variables according to your Delphi version:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9VY_8G8G2KE/ThoC18QegrI/AAAAAAAACvg/z2n6Bx_NCZg/s1600/jen8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://4.bp.blogspot.com/-9VY_8G8G2KE/ThoC18QegrI/AAAAAAAACvg/z2n6Bx_NCZg/s400/jen8.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;7. Setting up your project.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Start a new job with your project description and choose the "&lt;b&gt;Build a free-style software project&lt;/b&gt;" type. And add the following MSbuild information to build your project (&lt;b&gt;dproj&lt;/b&gt; file):&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-TkIImoT-O9I/ThoEF_PupsI/AAAAAAAACvk/aHqw93Zt7jo/s1600/jen9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="141" src="http://4.bp.blogspot.com/-TkIImoT-O9I/ThoEF_PupsI/AAAAAAAACvk/aHqw93Zt7jo/s400/jen9.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;8. Build your Project.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Everything is ready to do the build. Now execute the "Build now" option and you'll see your project being compiled and built using MSBuild.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2bi4J1IVyyo/ThoEtwno8VI/AAAAAAAACvo/u-1lBgSqukA/s1600/jen10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-2bi4J1IVyyo/ThoEtwno8VI/AAAAAAAACvo/u-1lBgSqukA/s320/jen10.jpg" width="286" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Now, you can add your Delphi projects and improve the &lt;b&gt;quality of your software&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related Links:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.mgm-tp.com/2010/04/hudson-continuous-integration-part1/"&gt;Hudson continuous integration&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Installing+Hudson+as+a+Windows+service"&gt;Installing Hudson as a service&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://christerblog.wordpress.com/2010/04/25/using-hudson-to-build-delphi-projects/"&gt;Using hudson to build delphi projects&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nickhodges.com/post/Getting-Hudson-set-up-to-compile-Delphi-Projects.aspx"&gt;Getting hudson set up to compile delphi projects&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://unxutils.sourceforge.net/"&gt;Unxutils&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-8450646618639274651?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/8450646618639274651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/07/continuous-integration-for-your-delphi.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/8450646618639274651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/8450646618639274651'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/07/continuous-integration-for-your-delphi.html' title='Continuous Integration for your Delphi projects using Jenkins CI'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-YZUFnYXo9gQ/Thn4ktXyuMI/AAAAAAAACvI/vjHFnmFt4ag/s72-c/jenkins_logo.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2674271346044989926</id><published>2011-07-04T20:08:00.000+02:00</published><updated>2011-07-04T20:08:10.988+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Delphi Msbuild</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-qndAtLskGYM/Tg5c39xLIzI/AAAAAAAACu0/_bqKeVoB7VE/s1600/System-Package-icon.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-qndAtLskGYM/Tg5c39xLIzI/AAAAAAAACu0/_bqKeVoB7VE/s1600/System-Package-icon.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://en.wikipedia.org/wiki/MSBuild"&gt;Msbuild&lt;/a&gt; has been included since &lt;a href="http://www.drbob42.com/examines/examin88.htm"&gt;Delphi 2007&lt;/a&gt; to automate our&amp;nbsp;Delphi&amp;nbsp;builds and manage our projects in a better way. I have developed a custom application to provide automated Builds for Delphi (2007 / 2009 / 2010 / XE -Win32) using &lt;b&gt;MSBuild&lt;/b&gt;. The app called &lt;i&gt;&lt;b&gt;Thundax Delphi Builder&lt;/b&gt;&lt;/i&gt; is available &lt;a href="http://www.4shared.com/file/-y8DF75T/ThundaxDelphiBuilder_v10__0c3c.html"&gt;here&lt;/a&gt; for &lt;b&gt;free&lt;/b&gt;. This little tool generates a &lt;b&gt;batch file&lt;/b&gt; to call the list of projects and it displays the information using a TMemo getting the info&amp;nbsp;from the console window&amp;nbsp;using a &lt;a href="http://en.wikipedia.org/wiki/Pipe_(Unix)"&gt;pipe&lt;/a&gt;&amp;nbsp;with the &lt;a href="http://thundaxsoftware.blogspot.com/2011/07/capturing-console-output-with-delphi.html"&gt;capture method from my previous post&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If you take a look at my application, you will see a output section and a configuration section. In the configuration section we need to add the list of projects to compile/build, the path of our Delphi binaries and the different MSBuild commands we want to execute.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PQLqjmceZpA/ThH8XIbx3zI/AAAAAAAACu4/14FDgRHVzWE/s1600/Build.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-PQLqjmceZpA/ThH8XIbx3zI/AAAAAAAACu4/14FDgRHVzWE/s400/Build.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;As soon as all the parameters are correct, we can hit the &lt;b&gt;"Build"&lt;/b&gt; button. The Build button generates a batch file called &lt;b&gt;build.bat&lt;/b&gt;. This batch file contains the list of all our projects with the correct commands for MSBuild. Just take a look at the generated batch file and you will understand what is this doing.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-LN3deXTorbY/ThH9KdQr8mI/AAAAAAAACu8/hbhVgGC6F1Q/s1600/success.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-LN3deXTorbY/ThH9KdQr8mI/AAAAAAAACu8/hbhVgGC6F1Q/s400/success.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;First of all, it sets the environment variables for the target compiler. It means that if you enter in the "Bin" section &amp;nbsp;the path to your DelphiXE binaries, it will set MSBuild for DelphiXE. To do this, we only need to run &lt;b&gt;rsvars.bat&lt;/b&gt; batch file which contains:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;@SET BDS=C:\Program Files (x86)\Embarcadero\RAD Studio\7.0&lt;br /&gt;@SET BDSCOMMONDIR=C:\Users\Public\Documents\RAD Studio\7.0&lt;br /&gt;@SET FrameworkDir=C:\Windows\Microsoft.NET\Framework\v2.0.50727&lt;br /&gt;@SET FrameworkVersion=v2.0.50727&lt;br /&gt;@SET FrameworkSDKDir=&lt;br /&gt;@SET PATH=%FrameworkDir%;%FrameworkSDKDir%;%PATH%&lt;br /&gt;@SET LANGDIR=EN&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Of course this tools is just a "&lt;b&gt;little tool&lt;/b&gt;" to help you understand how Msbuild works and how to invoke it from the command line. I use &lt;a href="http://en.wikipedia.org/wiki/Continuous_integration"&gt;continuous integration&lt;/a&gt; tools and some day I will talk about one of them, for example &lt;a href="http://hudson-ci.org/"&gt;Hudson continuous integration&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;PS:&lt;/b&gt; If you want to download the app, download my &lt;a href="http://www.4shared.com/file/118022569/c55fbc88/ThundaxCalcHash.html"&gt;Calc Hash&lt;/a&gt; to make sure that the MD5 hash is correct. To check it, download the app, remove the "&lt;i&gt;&lt;b&gt;&amp;nbsp;(0c3c3ab27a6000d8881974a411959828)&lt;/b&gt;&lt;/i&gt;." hash and check the file with the calc. If the app is correct, you should get the same hash.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2009/09/syntax-helper.html"&gt;Syntax helper&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/03/showing-folder-dialog-in-delphi.html"&gt;Showing the folder dialog&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/07/capturing-console-output-with-delphi.html"&gt;Capturing console output&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Inside-Microsoft-Build-Engine-2nd/dp/0735645248/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1309729887&amp;amp;sr=8-1"&gt;Inside Microsoft Build Engine&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2009/07/calculando-el-hash-md5-y-sha1.html"&gt;Hash MD5 and SHA1&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/558147/delphi-msbuild-build-configurations-from-command-line"&gt;Delphi MSBuild Build Configurations From Command Line&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="https://forums.embarcadero.com/thread.jspa?threadID=48715&amp;amp;tstart=0"&gt;MSBuild with RADStudio 2010 does not work&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/2590911/continuous-integration-system-for-delphi"&gt;Continuous Integration System for Delphi&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2674271346044989926?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2674271346044989926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/07/delphi-msbuild.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2674271346044989926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2674271346044989926'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/07/delphi-msbuild.html' title='Delphi Msbuild'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-qndAtLskGYM/Tg5c39xLIzI/AAAAAAAACu0/_bqKeVoB7VE/s72-c/System-Package-icon.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-1163070821594630423</id><published>2011-07-04T19:02:00.004+02:00</published><updated>2011-07-07T22:54:48.360+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Utilities'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><title type='text'>Capturing console output with Delphi 2010/XE</title><content type='html'>&lt;div style="text-align: justify;"&gt;This new method supersedes the previous &lt;a href="http://thundaxsoftware.blogspot.com/2009/06/capturar-la-salida-de-una-aplicacion.html"&gt;one&lt;/a&gt; using &lt;a href="http://maxxdelphisite.free.fr/doscmd.htm"&gt;TDosCommand&lt;/a&gt;. It's been tested and it works with Delphi 2010 and Delphi XE, so it's worth to give it a try. It's really easy to use and I'm preparing a little tool with it.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;//Anonymous procedure approach by Lars Fosdal&lt;br /&gt;type&lt;br /&gt;    TArg&amp;lt;T&amp;gt; = reference to procedure(const Arg: T);&lt;br /&gt;&lt;br /&gt;procedure TForm1.CaptureConsoleOutput(const ACommand, AParameters: String; CallBack: TArg&amp;lt;PAnsiChar&amp;gt;);&lt;br /&gt;const&lt;br /&gt;    CReadBuffer = 2400;&lt;br /&gt;var&lt;br /&gt;    saSecurity: TSecurityAttributes;&lt;br /&gt;    hRead: THandle;&lt;br /&gt;    hWrite: THandle;&lt;br /&gt;    suiStartup: TStartupInfo;&lt;br /&gt;    piProcess: TProcessInformation;&lt;br /&gt;    pBuffer: array [0 .. CReadBuffer] of AnsiChar;&lt;br /&gt;    dBuffer: array [0 .. CReadBuffer] of AnsiChar;&lt;br /&gt;    dRead: DWord;&lt;br /&gt;    dRunning: DWord;&lt;br /&gt;begin&lt;br /&gt;    saSecurity.nLength := SizeOf(TSecurityAttributes);&lt;br /&gt;    saSecurity.bInheritHandle := True;&lt;br /&gt;    saSecurity.lpSecurityDescriptor := nil;&lt;br /&gt;&lt;br /&gt;    if CreatePipe(hRead, hWrite, @saSecurity, 0) then&lt;br /&gt;    begin&lt;br /&gt;        FillChar(suiStartup, SizeOf(TStartupInfo), #0);&lt;br /&gt;        suiStartup.cb := SizeOf(TStartupInfo);&lt;br /&gt;        suiStartup.hStdInput := hRead;&lt;br /&gt;        suiStartup.hStdOutput := hWrite;&lt;br /&gt;        suiStartup.hStdError := hWrite;&lt;br /&gt;        suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;&lt;br /&gt;        suiStartup.wShowWindow := SW_HIDE;&lt;br /&gt;&lt;br /&gt;        if CreateProcess(nil, pChar(ACommand + ' ' + AParameters), @saSecurity, @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess) then&lt;br /&gt;        begin&lt;br /&gt;            repeat&lt;br /&gt;                dRunning := WaitForSingleObject(piProcess.hProcess, 100);&lt;br /&gt;                Application.ProcessMessages();&lt;br /&gt;                repeat&lt;br /&gt;                    dRead := 0;&lt;br /&gt;                    ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);&lt;br /&gt;                    pBuffer[dRead] := #0;&lt;br /&gt;&lt;br /&gt;                    //OemToAnsi(pBuffer, pBuffer);&lt;br /&gt;                    //Unicode support by Lars Fosdal&lt;br /&gt;                    OemToCharA(pBuffer, dBuffer);&lt;br /&gt;                    CallBack(dBuffer);&lt;br /&gt;                until (dRead &amp;lt; CReadBuffer);&lt;br /&gt;            until (dRunning &amp;lt;&amp;gt; WAIT_TIMEOUT);&lt;br /&gt;            CloseHandle(piProcess.hProcess);&lt;br /&gt;            CloseHandle(piProcess.hThread);&lt;br /&gt;        end;&lt;br /&gt;        CloseHandle(hRead);&lt;br /&gt;        CloseHandle(hWrite);&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;usage:&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;    CaptureConsoleOutput('java -version', '', &lt;br /&gt;                procedure(const Line: PAnsiChar) &lt;br /&gt;                begin&lt;br /&gt;                    Memo1.Lines.Add(String(Line)); &lt;br /&gt;                end&lt;br /&gt;     );&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;With all the help I got from &lt;i&gt;Lars&lt;/i&gt;, I've released a version of the function for test purposes. You can download the app from &lt;b&gt;&lt;a href="http://www.4shared.com/file/WVvkjzbi/ThundaxOutput.html"&gt;here&lt;/a&gt;&lt;/b&gt; (&lt;b&gt;Thundax Output&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-zxhhUrydzGg/ThYctdCPFNI/AAAAAAAACvA/eKDkc8BT4Tc/s1600/Dibujo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://1.bp.blogspot.com/-zxhhUrydzGg/ThYctdCPFNI/AAAAAAAACvA/eKDkc8BT4Tc/s400/Dibujo.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://delphi.about.com/cs/adptips2001/a/bltip0201_2.htm"&gt;Capture the output from DOS&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://delphi.wikia.com/wiki/Capture_Console_Output_Realtime_To_Memo"&gt;Capture output realtime to memo&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://winapi.freetechsecrets.com/win32/WIN32OemToCharBuff.htm"&gt;OemToCharBuff&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms647493(v=vs.85).aspx"&gt;OemToChar&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/958aca2x(v=vs.80).aspx"&gt;OemToAnsi&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-1163070821594630423?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/1163070821594630423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/07/capturing-console-output-with-delphi.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/1163070821594630423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/1163070821594630423'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/07/capturing-console-output-with-delphi.html' title='Capturing console output with Delphi 2010/XE'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-zxhhUrydzGg/ThYctdCPFNI/AAAAAAAACvA/eKDkc8BT4Tc/s72-c/Dibujo.jpg' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-3959214149589418188</id><published>2011-06-21T21:40:00.003+02:00</published><updated>2011-07-03T22:24:44.346+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><category scheme='http://www.blogger.com/atom/ns#' term='Physics'/><category scheme='http://www.blogger.com/atom/ns#' term='Computational geometry'/><title type='text'>Building my own Delphi Physics Engine part VII</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-GexCgR-kNzo/TgDl4O9D-VI/AAAAAAAACus/JUEZRXIERhI/s1600/TDPE2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-GexCgR-kNzo/TgDl4O9D-VI/AAAAAAAACus/JUEZRXIERhI/s1600/TDPE2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;After several weeks working on my &lt;b&gt;&lt;a href="http://code.google.com/p/thundax-delphi-physics-engine/"&gt;TDPE&lt;/a&gt;&lt;/b&gt; I think I managed it to get the desired outcome and now the displayed items show &lt;b&gt;more realistic features&lt;/b&gt;. In my previous versions, neither &lt;u&gt;&lt;a href="http://en.wikipedia.org/wiki/Angular_velocity"&gt;angular velocity&lt;/a&gt;&lt;/u&gt; nor &lt;u&gt;&lt;a href="http://en.wikipedia.org/wiki/Mass"&gt;mass&lt;/a&gt;&lt;/u&gt; was interacting in terms of moving an object and now, using different mathematical algorithms, the gravity and angular velocity are considered for every item. That means that as soon as a collision is originated, the resultant force will lean back or forward the object and it will be rotating or moving until the forces of the system reach a value close to zero.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This new approach has included a massive refactoring of the existing code to cope with this new behaviour that will deliver spectacular performances. During the following weeks I'm going to &amp;nbsp;focus on the cutting tool as now I only have to extent the &lt;b&gt;4-edges collision object&lt;/b&gt; to &lt;b&gt;n-edges&lt;/b&gt;. Once I have the &lt;b&gt;n-edges collision object&lt;/b&gt; then I would be able to generate small chunks of it and each piece would have its own behaviour giving you the feeling that the object has really been broken.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-rQ8ysUJQHpc/TgDtVRfKkBI/AAAAAAAACuw/jNwGXs0fy-A/s1600/mass.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-rQ8ysUJQHpc/TgDtVRfKkBI/AAAAAAAACuw/jNwGXs0fy-A/s1600/mass.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As it's shown in the image, when most or more than a half of the object is out of the base (in blue), the red box should lean forward and fall according to the laws of physics (falling using rotation instead of falling straight how it was before in previous versions).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The following video will show the results of applying the latest algorithms to my Engine:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/7AkUk9q0HBg?hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/7AkUk9q0HBg?hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Enjoy the video!.&lt;/div&gt;&lt;br /&gt;Get the latest executable here: &lt;a href="http://www.4shared.com/file/QgD_3xk0/Thundaxballsdemo_v1349.html"&gt;ThundaxBallDemo v1.349&lt;/a&gt;.&lt;br /&gt;&lt;b&gt;If you want to drop a box, press &lt;span class="Apple-style-span" style="color: red;"&gt;'d'&lt;/span&gt; and a new red box will fall.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.edenwaith.com/products/pige/tutorials/collision.php"&gt;Collision Detection&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.essentialmath.com/CollisionDetection.pps"&gt;Collision Detection. Essential maths for programmers&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/05/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part VI&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_05.html"&gt;Building my own Delphi Physics Engine part V&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_04.html"&gt;Building my own Delphi Physics Engine part IV&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part III&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine_10.html"&gt;Building my own Delphi Physics Engine part II&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part I&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-3959214149589418188?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/3959214149589418188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/06/building-my-own-delphi-physics-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/3959214149589418188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/3959214149589418188'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/06/building-my-own-delphi-physics-engine.html' title='Building my own Delphi Physics Engine part VII'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-GexCgR-kNzo/TgDl4O9D-VI/AAAAAAAACus/JUEZRXIERhI/s72-c/TDPE2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-480197427116367038</id><published>2011-06-15T22:11:00.016+02:00</published><updated>2011-07-20T23:05:34.781+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><title type='text'>Delphi Compiler version directives</title><content type='html'>&lt;div style="text-align: justify;"&gt;Due to recent release of &lt;b&gt;DelphiXE&lt;/b&gt;, here you can find a extended list of &lt;u&gt;delphi compiler version directives&lt;/u&gt; that will help you to upgrade your projects. These are very helpful If you plan on writing Delphi code that should work with several version of the Delphi compiler.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;{$IFDEF VER80}  - Delphi 1&lt;br /&gt;{$IFDEF VER90}  - Delphi 2&lt;br /&gt;{$IFDEF VER100} - Delphi 3&lt;br /&gt;{$IFDEF VER120} - Delphi 4&lt;br /&gt;{$IFDEF VER130} - Delphi 5&lt;br /&gt;{$IFDEF VER140} - Delphi 6&lt;br /&gt;{$IFDEF VER150} - Delphi 7&lt;br /&gt;{$IFDEF VER160} - Delphi 8&lt;br /&gt;{$IFDEF VER170} - Delphi 2005&lt;br /&gt;{$IFDEF VER180} - Delphi 2006&lt;br /&gt;{$IFDEF VER180} - Delphi 2007&lt;br /&gt;{$IFDEF VER185} - Delphi 2007&lt;br /&gt;{$IFDEF VER200} - Delphi 2009&lt;br /&gt;{$IFDEF VER210} - Delphi 2010&lt;br /&gt;{$IFDEF VER220} - Delphi XE&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://delphi.about.com/od/objectpascalide/a/compiler_ver.htm"&gt;Delphi compiler versions&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://orion.lcg.ufrj.br/RPMS/myrpms/lazarus/lazarus-components/virtualtrees/Compilers.inc"&gt;Compilers.inc&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-480197427116367038?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/480197427116367038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/06/delphi-compiler-version-directives.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/480197427116367038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/480197427116367038'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/06/delphi-compiler-version-directives.html' title='Delphi Compiler version directives'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-7082934923228854843</id><published>2011-06-14T23:49:00.011+02:00</published><updated>2011-06-14T23:51:47.946+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TED'/><category scheme='http://www.blogger.com/atom/ns#' term='Videos'/><title type='text'>A "moral operating system"</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.ted.com/speakers/damon_horowitz.html"&gt;Damon Horowitz&lt;/a&gt; calls for a "&lt;i&gt;moral operating system&lt;/i&gt;".&amp;nbsp;At &lt;a href="http://www.tedxsv.org/"&gt;TEDxSiliconValley&lt;/a&gt;, Damon Horowitz reviews the enormous new powers that technology gives us: to know more -- and more about each other -- than ever before. Drawing the audience into a philosophical discussion, Horowitz invites us to pay new attention to the basic philosophy -- the ethical principles -- behind the burst of invention remaking our world. &lt;b&gt;&lt;u&gt;Where's the moral operating system that allows us to make sense of it&lt;/u&gt;&lt;/b&gt;?&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="326" width="446"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt;&lt;param name="flashvars" value="vu=http://video.ted.com/talk/stream/2011X/Blank/DamonHorowitz_2011X-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/DamonHorowitz-2011X.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=1162&amp;lang=eng&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=damon_horowitz;year=2011;theme=new_on_ted_com;theme=a_taste_of_tedx;event=TEDxSiliconValley;tag=Culture;tag=Technology;tag=philosophy;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talk/stream/2011X/Blank/DamonHorowitz_2011X-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/DamonHorowitz-2011X.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=1162&amp;lang=eng&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=damon_horowitz;year=2011;theme=new_on_ted_com;theme=a_taste_of_tedx;event=TEDxSiliconValley;tag=Culture;tag=Technology;tag=philosophy;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: right;"&gt;&lt;b&gt;Source:&lt;/b&gt; &lt;a href="http://www.ted.com/talks/damon_horowitz.html"&gt;TED&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Enjoy the video!.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-7082934923228854843?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/7082934923228854843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/06/moral-operating-system.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7082934923228854843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7082934923228854843'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/06/moral-operating-system.html' title='A &quot;moral operating system&quot;'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-6864651377430539956</id><published>2011-06-14T20:41:00.098+02:00</published><updated>2011-07-03T22:24:44.382+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='OLE'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='ActiveX'/><title type='text'>OLE Automation with Delphi part II</title><content type='html'>&lt;div style="text-align: justify;"&gt;Going on with my previous post (&lt;a href="http://thundaxsoftware.blogspot.com/2010/02/ole-automation-with-delphi.html"&gt;OLE Automation with Delphi part I&lt;/a&gt;) where I was able to use the invocation of the "&lt;b&gt;Word.Application&lt;/b&gt;" service using &lt;a href="http://en.wikipedia.org/wiki/Component_Object_Model"&gt;COM&lt;/a&gt;. In this post I am going to show you how to detect if a service is available using &lt;a href="http://en.wikipedia.org/wiki/Object_Linking_and_Embedding"&gt;OLE&lt;/a&gt; Automation. First of all, I'm going to give you a brief overview of the &lt;a href="http://en.wikipedia.org/wiki/Windows_Registry"&gt;windows Registry&lt;/a&gt; and where are all these &lt;b&gt;COM class objects&lt;/b&gt; allocated, and then I will move forward to show the Delphi code that is used for this purpose.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;COM class objects&lt;/b&gt; are identified by a &lt;a href="http://msdn.microsoft.com/en-us/library/ms691424(v=vs.85).aspx"&gt;CLSID&lt;/a&gt; key:&lt;/div&gt;&lt;blockquote style="text-align: justify;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;A CLSID is a globally unique identifier that &lt;u&gt;identifies a COM class object&lt;/u&gt;. If your server or container allows linking to its embedded objects, you need &lt;u&gt;to register a CLSID&lt;/u&gt; for each supported class of objects&lt;/span&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;div style="text-align: right;"&gt;&lt;b&gt;source:&lt;/b&gt; &lt;a href="http://msdn.microsoft.com/en-us/library/ms691424(v=vs.85).aspx"&gt;msdn&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If we have installed Microsoft Word and look for "Word.Application" inside the registry, we will find the following information under &lt;b&gt;\HKEY_CLASSES_ROOT\Word.Application&lt;/b&gt;:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-pbVBhL_xzbM/TffEkILJDTI/AAAAAAAACuk/ZZt9fpr0z00/s1600/CLSID.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="142" src="http://4.bp.blogspot.com/-pbVBhL_xzbM/TffEkILJDTI/AAAAAAAACuk/ZZt9fpr0z00/s400/CLSID.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This entry has the CLSID key =&amp;nbsp;{000209FF-0000-0000-C000-000000000046}. This CLSID key has been set when the component was registered. We can look it up and check what executable or&amp;nbsp;routine&amp;nbsp;is invoking in the next key entry: &lt;b&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\&lt;/b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;{CLSID}&lt;/span&gt;&lt;/i&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--7wpx37Mk2s/TffHb4PaE9I/AAAAAAAACuo/Ieyp2xbxkdU/s1600/CLSID2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="132" src="http://2.bp.blogspot.com/--7wpx37Mk2s/TffHb4PaE9I/AAAAAAAACuo/Ieyp2xbxkdU/s400/CLSID2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As we can see, it shows the path of Microsoft word and with the option /Automation. Now that we know how to deal with the windows registry and how are set out CLSID keys, let's move on how to use this information with Delphi.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Check if the COM Class Object is registered:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;To ensure that the service is available, we can use the OLE32 methods available through &lt;b&gt;ActiveX&lt;/b&gt; and &lt;b&gt;ComObj&lt;/b&gt; units.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;unit Activex;&lt;br /&gt;&lt;br /&gt;function CLSIDFromProgID;               external ole32 name 'CLSIDFromProgID';&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Example of use:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;uses&lt;br /&gt;    ActiveX, ComObj;&lt;br /&gt;&lt;br /&gt;procedure TForm1.CheckCLSIDClick(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;    clsid: TCLSID;&lt;br /&gt;    sCLSID: string;&lt;br /&gt;    result: hResult;&lt;br /&gt;begin&lt;br /&gt;    // initialize COM&lt;br /&gt;    CoInitialize(nil);&lt;br /&gt;&lt;br /&gt;    // Get CLSID from Microsoft Word&lt;br /&gt;    result := CLSIDFromProgID('Word.Application', clsid);&lt;br /&gt;    sCLSID := GUIDToString(clsid);&lt;br /&gt;    try&lt;br /&gt;        OleCheck(result);&lt;br /&gt;        ShowMessage('Class Word.Application recognized with CLSID ' + sCLSID);&lt;br /&gt;    except&lt;br /&gt;        on e: EOleSysError do&lt;br /&gt;        begin&lt;br /&gt;            ShowMessage('Class Word.Application not recognized CLSID ' + sCLSID);&lt;br /&gt;        end;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    // deinitialize COM&lt;br /&gt;    CoUninitialize;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;Invoking the COM Class Object:&lt;/b&gt;&lt;br /&gt;Now that we are sure the &lt;b&gt;COM Class&lt;/b&gt; is registered, we can cater the &lt;b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms686615(v=vs.85).aspx"&gt;CoCreateInstance&lt;/a&gt;&lt;/b&gt; method to invoke the class with the proper context properties.&amp;nbsp;&lt;b&gt;dwClsContext&lt;/b&gt; is the context in which the code that manages the newly created object will run. The values are taken from the enumeration &lt;a href="http://msdn.microsoft.com/en-us/library/ms693716(v=vs.85).aspx"&gt;CLSCTX&lt;/a&gt;.&lt;br /&gt;We can find this enumerators in the &lt;b&gt;ActiveX&lt;/b&gt; unit with the following values:&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;{$EXTERNALSYM CLSCTX_INPROC_SERVER}&lt;br /&gt;  CLSCTX_INPROC_SERVER     = 1;&lt;br /&gt;  {$EXTERNALSYM CLSCTX_INPROC_HANDLER}&lt;br /&gt;  CLSCTX_INPROC_HANDLER    = 2;&lt;br /&gt;  {$EXTERNALSYM CLSCTX_LOCAL_SERVER}&lt;br /&gt;  CLSCTX_LOCAL_SERVER      = 4;&lt;br /&gt;  {$EXTERNALSYM CLSCTX_INPROC_SERVER16}&lt;br /&gt;  CLSCTX_INPROC_SERVER16   = 8;&lt;br /&gt;  {$EXTERNALSYM CLSCTX_REMOTE_SERVER}&lt;br /&gt;  CLSCTX_REMOTE_SERVER     = $10;&lt;br /&gt;  {$EXTERNALSYM CLSCTX_INPROC_HANDLER16}&lt;br /&gt;  CLSCTX_INPROC_HANDLER16  = $20;&lt;br /&gt;  {$EXTERNALSYM CLSCTX_INPROC_SERVERX86}&lt;br /&gt;  CLSCTX_INPROC_SERVERX86  = $40;&lt;br /&gt;  {$EXTERNALSYM CLSCTX_INPROC_HANDLERX86}&lt;br /&gt;  CLSCTX_INPROC_HANDLERX86 = $80;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Example of use:&lt;/b&gt;&lt;br /&gt;If we take a look again at the &lt;b&gt;Registry&lt;/b&gt; picture above, we will notice that our COM Class uses a &lt;b&gt;LOCAL_SERVER&lt;/b&gt; context, and that's the value that we will have to set in the &lt;b&gt;API&lt;/b&gt; method.&lt;br /&gt;&lt;br /&gt;This simple example will use the &lt;b&gt;COM CLSID&lt;/b&gt; to invoke &lt;b&gt;Microsoft Word&lt;/b&gt; and open it:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;uses&lt;br /&gt;    ActiveX, ComObj, Ole2;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;procedure TForm1.InvokeCLSIDClick(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;    clsid: TCLSID;&lt;br /&gt;    sCLSID: string;&lt;br /&gt;    result: hresult;&lt;br /&gt;    localCLSCTX: Integer;&lt;br /&gt;    IWordApp: IUnknown;&lt;br /&gt;    dispIWord: IDispatch;&lt;br /&gt;    AttrName: POleStr;&lt;br /&gt;    paramArgument: VARIANTARG;&lt;br /&gt;    disparam: DISPPARAMS;&lt;br /&gt;    dispIDs: TDispID;&lt;br /&gt;    did: TDispID;&lt;br /&gt;begin&lt;br /&gt;    // initialize COM&lt;br /&gt;    CoInitialize(nil);&lt;br /&gt;    localCLSCTX := CLSCTX_LOCAL_SERVER;&lt;br /&gt;    try&lt;br /&gt;        // Get CLSID from Microsoft Word&lt;br /&gt;        result := CLSIDFromProgID('Word.Application', clsid);&lt;br /&gt;        // sCLSID := GUIDToString(clsid);&lt;br /&gt;        OleCheck(result);&lt;br /&gt;        // create Microsoft Word instance&lt;br /&gt;        result := CoCreateInstance(clsid, nil, localCLSCTX, IID_IUnknown, IWordApp);&lt;br /&gt;        OleCheck(result);&lt;br /&gt;        // get IDispatch interface of received object&lt;br /&gt;        IWordApp.QueryInterface(IID_IDispatch, dispIWord);&lt;br /&gt;&lt;br /&gt;        // Invoke Microsoft Word&lt;br /&gt;        AttrName := 'Visible';&lt;br /&gt;        paramArgument.vt := VT_BOOL;&lt;br /&gt;        paramArgument.vbool := true;&lt;br /&gt;        disparam.cArgs := 1;&lt;br /&gt;        disparam.rgvarg := @paramArgument;&lt;br /&gt;        dispIDs := DISPID_PROPERTYPUT;&lt;br /&gt;        disparam.cNamedArgs := 1;&lt;br /&gt;        disparam.rgdispidNamedArgs := @dispIDs;&lt;br /&gt;&lt;br /&gt;        dispIWord.GetIDsOfNames(GUID_NULL, @AttrName, 1, LOCALE_SYSTEM_DEFAULT, @did);&lt;br /&gt;        result := dispIWord.Invoke(did, GUID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, disparam, nil, nil, nil);&lt;br /&gt;        OleCheck(result);&lt;br /&gt;    except&lt;br /&gt;        on e: EOleSysError do&lt;br /&gt;        begin&lt;br /&gt;            ShowMessage('Class Word.Application not found CLSID ' + sCLSID);&lt;br /&gt;        end;&lt;br /&gt;    end;&lt;br /&gt;    // release unused objects&lt;br /&gt;    dispIWord.Release;&lt;br /&gt;    IWordApp.Release;&lt;br /&gt;    // deinitialize COM&lt;br /&gt;    CoUninitialize;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://delphi.about.com/library/weekly/aa121404b.htm"&gt;An introduction to COM programming&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://my.safaribooksonline.com/book/programming/borland-delphi/9780768683707/interoperability-om-interop-and-the-platform-invocation-service/376#X2ludGVybmFsX0ZsYXNoUmVhZGVyP3htbGlkPTk3ODA3Njg2ODM3MDcvMzc1"&gt;Interoperability - COM&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.autoitscript.com/forum/topic/14867-trying-cocreateinstance-api/"&gt;CoCreateInstance API&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-6864651377430539956?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/6864651377430539956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/06/ole-automation-with-delphi-part-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6864651377430539956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6864651377430539956'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/06/ole-automation-with-delphi-part-ii.html' title='OLE Automation with Delphi part II'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-pbVBhL_xzbM/TffEkILJDTI/AAAAAAAACuk/ZZt9fpr0z00/s72-c/CLSID.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2732768078384300986</id><published>2011-06-08T21:21:00.027+02:00</published><updated>2011-07-03T22:24:57.324+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><title type='text'>Delphi Certification program</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_6Q13M-mj_Y/Te_Mfh3WdtI/AAAAAAAACug/jF11IJKYkMg/s1600/247971_10150196946867499_34960937498_7152828_7689134_n.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://1.bp.blogspot.com/-_6Q13M-mj_Y/Te_Mfh3WdtI/AAAAAAAACug/jF11IJKYkMg/s200/247971_10150196946867499_34960937498_7152828_7689134_n.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Embarcadero released yesterday the "&lt;b&gt;&lt;a href="http://www.embarcadero.com/certification"&gt;Delphi Certification Program&lt;/a&gt;&lt;/b&gt;" where you can get one of the Delphi certificates to distinguish yourself from other professionals.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;There are two certificates available:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- &lt;a href="http://www.embarcadero.com/certification/delphi-developer"&gt;Delphi Developer Certification&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- &lt;a href="http://www.embarcadero.com/certification/delphi-master"&gt;Delphi Master Developer Certification&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;For the Delphi developer certification, if you are a registered Delphi XE user or RAD Studio XE user, you are eligible to take the certification test free of charge. As &lt;a href="http://blogs.embarcadero.com/pawelglowacki"&gt;Pawel Glowacki&lt;/a&gt; told us in the &lt;a href="http://forms.embarcadero.com/forms/EM11Q2WebinarERStudio15June"&gt;Embarcadero Live Event&lt;/a&gt;, these certificates are to certify your skills and to stand out from the rest. I have been looking forward to them, and now I'm eager to start taking the tests!.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The certification test covers the following areas of knowledge:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Delphi Fundamentals&lt;/li&gt;&lt;li&gt;Data types, variables, and Constants&lt;/li&gt;&lt;li&gt;Procedures and Functions&lt;/li&gt;&lt;li&gt;Classes and Objects&lt;/li&gt;&lt;li&gt;Object Interfaces&lt;/li&gt;&lt;li&gt;Generics, Attributes and Anonymous Method&lt;/li&gt;&lt;li&gt;Database Concepts&lt;/li&gt;&lt;li&gt;Standards Routines and I/O&lt;/li&gt;&lt;li&gt;Libraries and Packages&lt;/li&gt;&lt;li&gt;Memory Management&lt;/li&gt;&lt;li&gt;Exceptions and Assertions&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2732768078384300986?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2732768078384300986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/06/delphi-certification-program.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2732768078384300986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2732768078384300986'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/06/delphi-certification-program.html' title='Delphi Certification program'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-_6Q13M-mj_Y/Te_Mfh3WdtI/AAAAAAAACug/jF11IJKYkMg/s72-c/247971_10150196946867499_34960937498_7152828_7689134_n.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2531000777689643649</id><published>2011-05-22T15:28:00.000+02:00</published><updated>2011-07-03T22:24:44.337+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Utilities'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Operating System'/><title type='text'>Getting OS information with Delphi</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-7WYnwG98h5s/TdkN7q7896I/AAAAAAAACuQ/TLJu3AT5lKI/s1600/Dibujo.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-7WYnwG98h5s/TdkN7q7896I/AAAAAAAACuQ/TLJu3AT5lKI/s1600/Dibujo.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If you would like to know all about your &lt;b&gt;OS&lt;/b&gt;, even for the latest versions like &lt;b&gt;&lt;i&gt;Windows 7 64 bits&lt;/i&gt;&lt;/b&gt; or &lt;b&gt;&lt;i&gt;Windows Server 2008 R2&lt;/i&gt;&lt;/b&gt; there is a fantastic library for this purpose.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.delphidabbler.com/"&gt;DelphiDabbler&lt;/a&gt; has a system information unit called &lt;a href="http://code.google.com/p/ddab-lib/downloads/detail?name=dd-sysinfo-3.3.1.zip&amp;amp;can=2&amp;amp;q="&gt;dd-sysinfo&lt;/a&gt; which contains a lot of helping methods to retrieve OS information.&amp;nbsp;It Contains various static classes, constant and type definitions and global&amp;nbsp;variables for use in providing information about the computer and the&amp;nbsp;operating system.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-r1u6BTd0_LI/TdkO8dmqnKI/AAAAAAAACuU/l5qIfbUktjY/s1600/SysOS.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="275" src="http://1.bp.blogspot.com/-r1u6BTd0_LI/TdkO8dmqnKI/AAAAAAAACuU/l5qIfbUktjY/s400/SysOS.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Related Links:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.delphidabbler.com/software/sysinfo?mid=3.2"&gt;http://www.delphidabbler.com/software/sysinfo?mid=3.2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://delphi.about.com/od/faqstipstricks/a/tipswin.htm"&gt;Windows OS and API&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2531000777689643649?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2531000777689643649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/05/getting-os-information-with-delphi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2531000777689643649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2531000777689643649'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/05/getting-os-information-with-delphi.html' title='Getting OS information with Delphi'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-7WYnwG98h5s/TdkN7q7896I/AAAAAAAACuQ/TLJu3AT5lKI/s72-c/Dibujo.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-6899697026950889892</id><published>2011-05-02T00:06:00.001+02:00</published><updated>2011-05-02T00:10:22.070+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Molecules'/><title type='text'>Particle Engine Simulator (P.E.S)</title><content type='html'>&lt;div style="text-align: justify;"&gt;I've just bumped into this fantastic &lt;b&gt;&lt;a href="http://www.partow.net/projects/pes/index.html"&gt;Particle Engine Simulator&lt;/a&gt;&lt;/b&gt; (P.E.S) from &lt;a href="http://www.partow.net/"&gt;Arash Partow&lt;/a&gt; and I'm sure you'll find really interesting his applications and insights into computational geometry and others. The PES, uses &lt;b&gt;OpenGL&lt;/b&gt; as a display interface and you can get incredible structures like this:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-A5VL-URFNgE/Tb3YYifEYCI/AAAAAAAACuM/FKC5Qs4Ju3o/s1600/11.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="337" src="http://1.bp.blogspot.com/-A5VL-URFNgE/Tb3YYifEYCI/AAAAAAAACuM/FKC5Qs4Ju3o/s400/11.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I'm sure that you'll enjoy tinkering with it!.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-6899697026950889892?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/6899697026950889892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/05/particle-engine-simulator-pes.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6899697026950889892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6899697026950889892'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/05/particle-engine-simulator-pes.html' title='Particle Engine Simulator (P.E.S)'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-A5VL-URFNgE/Tb3YYifEYCI/AAAAAAAACuM/FKC5Qs4Ju3o/s72-c/11.bmp' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-9067060091238824426</id><published>2011-05-01T22:00:00.000+02:00</published><updated>2011-07-03T22:24:44.391+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><category scheme='http://www.blogger.com/atom/ns#' term='Physics'/><category scheme='http://www.blogger.com/atom/ns#' term='Computational geometry'/><title type='text'>Polygonal approximation to circle</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-QHkrIE8RS5c/Tb2vADMlTUI/AAAAAAAACuE/PwSdaMGVJG4/s1600/Dibujo1.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-QHkrIE8RS5c/Tb2vADMlTUI/AAAAAAAACuE/PwSdaMGVJG4/s1600/Dibujo1.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In order to be able to tackle the "&lt;b&gt;cutting tool&lt;/b&gt;" for my &lt;a href="http://thundaxsoftware.blogspot.com/2011/05/building-my-own-delphi-physics-engine.html"&gt;TDPhysicsEngine&lt;/a&gt;, I need to work with &lt;b&gt;polygon approximations&lt;/b&gt; instead of a full drawn circle using the &lt;b&gt;Canvas.Ellipse&lt;/b&gt; Delphi function. To achieve this in the view layer is as easy as using &lt;b&gt;Canvas.Polygon&lt;/b&gt; function to draw a polygon using a list of calculated points. To calculate the points, we need to divide the circle in discrete chunks and then let the function draw the lines between points. The main reason what I'm doing that is to be sure that I can cut up a polygon and then use the resulting pieces as &lt;b&gt;new objects&lt;/b&gt; that will behave as &lt;b&gt;independent objects&lt;/b&gt;:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-btr_QYq5WqQ/Tb25WE8bzxI/AAAAAAAACuI/8ARfyVNKsOY/s1600/Dibujo2.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-btr_QYq5WqQ/Tb25WE8bzxI/AAAAAAAACuI/8ARfyVNKsOY/s1600/Dibujo2.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The function below will help you to draw the polygon:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;procedure GDIRenderer.CircleApproximation(xcenter, ycenter, Radius, Rotate: Double; style: TStyle);&lt;br /&gt;var&lt;br /&gt;    PArrow: array [1 .. points] of TPoint;&lt;br /&gt;    i: integer;&lt;br /&gt;    theta: Double;&lt;br /&gt;    x, y : double;&lt;br /&gt;    beforeBrushColor, beforePenColor: TColor;&lt;br /&gt;    beforePenWidth: integer;&lt;br /&gt;begin&lt;br /&gt;    beforeBrushColor := FCanvas.Brush.color;&lt;br /&gt;    beforePenColor := FCanvas.Pen.color;&lt;br /&gt;    beforePenWidth := FCanvas.Pen.Width;&lt;br /&gt;&lt;br /&gt;    FCanvas.Pen.color := style.PenColor;&lt;br /&gt;    FCanvas.Pen.Width := style.penWidth;&lt;br /&gt;    FCanvas.Brush.color := style.BrushColor;&lt;br /&gt;&lt;br /&gt;    for i := 1 to points do&lt;br /&gt;    begin&lt;br /&gt;        theta := Pi * ((i-1)/(points/2));&lt;br /&gt;        x := xcenter + (Radius* Cos(theta));&lt;br /&gt;        y := ycenter + (Radius* Sin(theta));&lt;br /&gt;        PArrow[i] := Point(Round(x), Round(y));&lt;br /&gt;    end;&lt;br /&gt;    FCanvas.Polygon(PArrow);&lt;br /&gt;&lt;br /&gt;    FCanvas.Brush.color := beforeBrushColor;&lt;br /&gt;    FCanvas.Pen.color := beforePenColor;&lt;br /&gt;    FCanvas.Pen.Width := beforePenWidth;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The big difficulty here is to model this behaviour in the model. I need to work more and think about it because for the moment it's adjusted as a sphere and it's not a good approximation.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-9067060091238824426?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/9067060091238824426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/05/polygonal-approximation-to-circle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/9067060091238824426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/9067060091238824426'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/05/polygonal-approximation-to-circle.html' title='Polygonal approximation to circle'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-QHkrIE8RS5c/Tb2vADMlTUI/AAAAAAAACuE/PwSdaMGVJG4/s72-c/Dibujo1.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-998216926988483643</id><published>2011-05-01T03:13:00.001+02:00</published><updated>2011-07-03T22:24:44.408+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><category scheme='http://www.blogger.com/atom/ns#' term='Physics'/><category scheme='http://www.blogger.com/atom/ns#' term='Computational geometry'/><title type='text'>Building my own Delphi Physics Engine part VI</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-XyAwc2p22CA/TbypqiWefUI/AAAAAAAACtw/lAiE3qvNWB0/s1600/bouncing.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-XyAwc2p22CA/TbypqiWefUI/AAAAAAAACtw/lAiE3qvNWB0/s1600/bouncing.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I've been quite busy lately and in this article I've focused on the &lt;b&gt;collision container&lt;/b&gt;. As you'll see in the following images and video, the&amp;nbsp;spheres&amp;nbsp;will be bouncing around, colliding with one another and with the surfaces inside the container that holds the entire &lt;b&gt;motion of the system&lt;/b&gt;. With a simple tweak, the physics engine is able to display the &lt;b&gt;unseen&lt;/b&gt; forces when objects are&amp;nbsp;being&amp;nbsp;"&lt;b&gt;&lt;i&gt;kicked&lt;/i&gt;&lt;/b&gt;". The key feature is that I want to show the resultant vectors that are involved in the collisions and the movement so the observant would have an idea of what's happening inside the model and which forces are being generated.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In the image below, you'll see the resultant force when the sphere has collided with the surface beneath. This leads me to the description of the &lt;a href="http://en.wikipedia.org/wiki/Elastic_collision"&gt;Elastic collision equations&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-i2cjUkFhjeA/TbysD1rBakI/AAAAAAAACt0/wW1QUOXHhDQ/s1600/collision.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://3.bp.blogspot.com/-i2cjUkFhjeA/TbysD1rBakI/AAAAAAAACt0/wW1QUOXHhDQ/s400/collision.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The following image shows all the vectors involved in the collision:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--6fubgq-H2Y/Tbyu4L3ebqI/AAAAAAAACt4/3M9aC1RpqSA/s1600/col2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://1.bp.blogspot.com/--6fubgq-H2Y/Tbyu4L3ebqI/AAAAAAAACt4/3M9aC1RpqSA/s400/col2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;And the video showing the dynamics:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/VWm-adq_HSk" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;You can download from here the last version of the application: &lt;b&gt;&lt;a href="http://www.4shared.com/file/CMx-3Prv/thundaxballsdemo_v1172.html"&gt;ThundaxBallsDemo v1.172&lt;/a&gt;&lt;/b&gt; that is &lt;a href="http://thundaxsoftware.blogspot.com/2011/04/signing-your-delphi-applications-with.html"&gt;digitally signed&lt;/a&gt;&amp;nbsp;(once the file is downloaded, right click, properties and go to the certificate and install it) to increase security. To add more spheres press &lt;b&gt;'a'&lt;/b&gt; and &lt;b&gt;'s'&lt;/b&gt;. To cut one of the bridges press &lt;b&gt;'z'&lt;/b&gt; and play!.&lt;br /&gt;&lt;br /&gt;I also have created the new logo for the Engine, let me know if you like it!.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ZKN3N4udJgQ/TbyzDgUT8kI/AAAAAAAACuA/m8F_IVjvRsM/s1600/TDPE2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-ZKN3N4udJgQ/TbyzDgUT8kI/AAAAAAAACuA/m8F_IVjvRsM/s1600/TDPE2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-oAtBFK7IZng/Tbyy9egtjXI/AAAAAAAACt8/VrhEthPC63E/s1600/TDPE.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="106" src="http://1.bp.blogspot.com/-oAtBFK7IZng/Tbyy9egtjXI/AAAAAAAACt8/VrhEthPC63E/s320/TDPE.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In few months the library would be ready here:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/thundax-delphi-physics-engine/"&gt;http://code.google.com/p/thundax-delphi-physics-engine/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Thanks for reading! and do not hesitate to leave any comment!.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;Solid maths is the programmer’s friend.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;Jordi&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.efg2.com/Lab/Library/Delphi/MathFunctions/General.htm"&gt;Math functions&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_05.html"&gt;Building my own Delphi Physics Engine part V&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_04.html"&gt;Building my own Delphi Physics Engine part IV&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part III&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine_10.html"&gt;Building my own Delphi Physics Engine part II&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part I&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-998216926988483643?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/998216926988483643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/05/building-my-own-delphi-physics-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/998216926988483643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/998216926988483643'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/05/building-my-own-delphi-physics-engine.html' title='Building my own Delphi Physics Engine part VI'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-XyAwc2p22CA/TbypqiWefUI/AAAAAAAACtw/lAiE3qvNWB0/s72-c/bouncing.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-9166768604016741031</id><published>2011-04-25T02:00:00.001+02:00</published><updated>2011-07-03T22:24:44.400+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><title type='text'>NIS 2010 SONAR raised when running executables compiled with Delphi 2010</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/-vH7kOuyaEjM/TbR-n_Edj3I/AAAAAAAACtk/mF3K2Fdulaw/s1600/Dibujo.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-vH7kOuyaEjM/TbR-n_Edj3I/AAAAAAAACtk/mF3K2Fdulaw/s1600/Dibujo.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Going on with my previous post (&lt;a href="http://thundaxsoftware.blogspot.com/2011/04/signing-your-delphi-applications-with.html"&gt;Signing your Delphi applications with Microsoft Signtool&lt;/a&gt;) in this post I'll explain different solutions to avoid &lt;a href="http://en.wikipedia.org/wiki/Antivirus_software#Problems_caused_by_false_positives"&gt;false positives&lt;/a&gt; by the &lt;i&gt;Antivirus&lt;/i&gt;. I've recently got an alert from my &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Norton_Internet_Security"&gt;NIS&lt;/a&gt; 2010&lt;/b&gt; (Norton Internet Security) &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/SONAR_(Symantec)"&gt;SONAR&lt;/a&gt;&lt;/b&gt; indicating that my application contains a &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Hacking_tool"&gt;HackTool&lt;/a&gt;&lt;/b&gt; and it has been &lt;u&gt;processed&lt;/u&gt; and &lt;u&gt;eliminated&lt;/u&gt; by SONAR (I'm trying to run one of my applications and now is a &lt;i&gt;high-risk program&lt;/i&gt; and should be deleted every time I try to run it):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-nwBvtpUOGRs/TbSyckX2g5I/AAAAAAAACto/BsMZJLLjyQ8/s1600/Historial.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="270" src="http://4.bp.blogspot.com/-nwBvtpUOGRs/TbSyckX2g5I/AAAAAAAACto/BsMZJLLjyQ8/s400/Historial.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Even though it socks, you need to go through the NIS and configure it using the instructions from &lt;a href="http://community.norton.com/t5/Norton-Internet-Security-Norton/SONAR-is-deleting-programs/m-p/192631?view=by_date_ascending#M96285"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. &amp;nbsp; Executable files created by compilers etc on development machines are deleted&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;We have identified the issue and are making incremental changes to fix the problem. Please ensure that you have the latest NIS patch installed 17.1.0.19 as that should minimize the occurrence of the issue.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;In addition to this, developers should exclude dev directories from security scans using the following steps:&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;On the main UI panel, under Computer click Settings. This will bring up the Settings dialog box.&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Under Scan Exclusions click Configure. This will display the Scan Exclusions&amp;nbsp;dialogue&amp;nbsp;box.&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Under the lower-half of the screen under Auto-Protect Exclusions click the Add button. This will bring up a&amp;nbsp;dialogue&amp;nbsp;to add a new item.&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Add the folder you want to exclude from SONAR.&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: right;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;i&gt;&lt;b&gt;source&lt;/b&gt;: &lt;a href="http://community.norton.com/t5/Norton-Internet-Security-Norton/SONAR-is-deleting-programs/m-p/192631?view=by_date_ascending#M96285"&gt;Norton community&lt;/a&gt;.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you are certain that SONAR has incorrectly quarantined a file, you may restore this file to its original location by selecting the appropriate entry in the Quarantine Log and clicking Options. This will display the Security Risk Details dialog:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-uvTNx_dmla0/TbS3V1LeDfI/AAAAAAAACts/p3diwVNtfUo/s1600/Dibujo1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="398" src="http://4.bp.blogspot.com/-uvTNx_dmla0/TbS3V1LeDfI/AAAAAAAACts/p3diwVNtfUo/s400/Dibujo1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;u&gt;Click Restore this file&lt;/u&gt;. This will show the Quarantine Restore dialog. Ensure that the &lt;b&gt;Exclude&lt;/b&gt; this risk from future scans is checked.&amp;nbsp;The file will be restored to its original location and will no longer be detected by SONAR. &lt;b&gt;According to Symantec&lt;/b&gt;&amp;nbsp;&lt;i&gt;this is unfortunately a known problem and they are working on a fix for it.&amp;nbsp;From now on the best thing you can do is to set the scan exclusions in the settings, with this, those folders will not be scanned and the files will not be false-detected&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It's important to update the Antivirus to the&lt;b&gt; latest&lt;/b&gt; version because most of these issues are already solved and there is no need on doing this.&lt;br /&gt;&lt;br /&gt;Other important thing is to bear in mind the &lt;b&gt;digital signature&lt;/b&gt; for our applications. If our executables are &lt;b&gt;digitally signed&lt;/b&gt; you won't have the &lt;b&gt;false positive&lt;/b&gt; problem with the AV because the application is &lt;b&gt;trusted&lt;/b&gt;. Please, go on with the &lt;b&gt;related links&lt;/b&gt; section to dig more with this issue and do not hesitate to comment if you have any doubt.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NIS version:&lt;/b&gt; 17.8.0.5&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/2006534/virus-in-delphi-7"&gt;Virus in Delphi 7&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/4237534/how-to-prevent-false-positive-virus-alarm-on-my-software"&gt;Antivirus false positive in my executables&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://edn.embarcadero.com/article/39851"&gt;W32/Induc-A “compile-a-virus” virus that can attack old versions of the Delphi development tool&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ginktage.com/2010/01/delphi-7-mcafee-and-virus/"&gt;Delphi 7 Mcafee and virus&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.garagegames.com/community/forums/viewthread/108917/2#comments"&gt;Norton SONAR is detecting my executable&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/3534050/my-software-is-not-a-virus-what-should-i-do"&gt;My software is not a virus&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://community.norton.com/t5/Norton-Internet-Security-Norton/NIS-2010-SONAR-raised-when-running-execs-compiled-with-Delphi/td-p/190238/page/2"&gt;NIS 2010 SONAR raised when running execs&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://community.norton.com/t5/Norton-Internet-Security-Norton/SONAR-is-deleting-programs/m-p/192631?view=by_date_ascending#M96285"&gt;SONAR is deleting programs&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://community.norton.com/t5/Norton-360/SONAR-is-deleting-programs-with-Norton-360/m-p/423002/message-uid/423002#U423002"&gt;SONAR is deleting programs with Norton 360&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-9166768604016741031?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/9166768604016741031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/04/nis-2010-sonar-raised-when-running.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/9166768604016741031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/9166768604016741031'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/04/nis-2010-sonar-raised-when-running.html' title='NIS 2010 SONAR raised when running executables compiled with Delphi 2010'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-vH7kOuyaEjM/TbR-n_Edj3I/AAAAAAAACtk/mF3K2Fdulaw/s72-c/Dibujo.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-5111837573521775401</id><published>2011-04-23T01:14:00.002+02:00</published><updated>2011-04-24T01:02:56.335+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSSL'/><title type='text'>Signing your Delphi applications with Microsoft Signtool</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-EgOyyKUiiHs/TbIFMTFvkkI/AAAAAAAACtM/Hf3_ELdJpw0/s1600/si.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-EgOyyKUiiHs/TbIFMTFvkkI/AAAAAAAACtM/Hf3_ELdJpw0/s200/si.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Today I'm coming with an interesting post about signing your &lt;b&gt;Delphi&lt;/b&gt; applications (win32) with Microsoft Signtool.&amp;nbsp;The &lt;a href="http://msdn.microsoft.com/en-us/library/aa387764(v=vs.85).aspx"&gt;SignTool&lt;/a&gt; tool is a command-line tool that digitally signs files, verifies signatures in files, or time stamps files. The tool is installed in the &lt;b&gt;\Bin&lt;/b&gt; folder of the &lt;a href="http://msdn.microsoft.com/en-us/windowsserver/bb980924.aspx"&gt;Microsoft Windows Software Development Kit (SDK)&lt;/a&gt; installation path.&amp;nbsp;SignTool is available as part of the Windows SDK, which you can download from &lt;a href="http://go.microsoft.com/fwlink/?linkid=84091"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;With few steps I'll show you how to create &lt;a href="http://en.wikipedia.org/wiki/PKCS12"&gt;PKCS#12&lt;/a&gt; certificate with &lt;a href="http://www.openssl.org/related/binaries.html"&gt;OpenSSL&lt;/a&gt; for windows and how to import this certificate into your applications. In most occasions we should use the certificate as a means of identifying the &lt;u&gt;author&lt;/u&gt; of an application and establishing &lt;b&gt;&lt;u&gt;trust relationships&lt;/u&gt;&lt;/b&gt; between applications.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Creating a PKCS#12 certificate with OpenSSL:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Once I have installed OpenSSL on your machine, we need to run the following commands to create the certificate.&amp;nbsp;To create a PKCS#12 certificate, you’ll need a private key and a certificate, so first of all, let´s create the certificate and the private key:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;"&gt;# create a file containing key and self-signed certificate&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;"&gt;openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-xcZ4L-xWX38/TbIHqj4AEbI/AAAAAAAACtQ/Qi4JnG-ejQE/s1600/Dibujo1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="197" src="http://3.bp.blogspot.com/-xcZ4L-xWX38/TbIHqj4AEbI/AAAAAAAACtQ/Qi4JnG-ejQE/s400/Dibujo1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Now we are ready to generate the &lt;b&gt;.pfx&lt;/b&gt; file (.PFX file (&lt;b&gt;Personal Information Exchange format&lt;/b&gt;) is the file containing both a public (.cer file) and a private (.pvk file) keys) with &lt;b&gt;myCert.pem&lt;/b&gt;:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;"&gt;# export mycert.pem as PKCS#12 file, mycert.pfx&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;"&gt;openssl pkcs12 -export -out mycert.pfx -in mycert.pem -name "My Certificate"&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-3shIuR-Q5j8/TbIIwz3w37I/AAAAAAAACtU/z6a1KeKqVEI/s1600/Dibujo2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="197" src="http://2.bp.blogspot.com/-3shIuR-Q5j8/TbIIwz3w37I/AAAAAAAACtU/z6a1KeKqVEI/s400/Dibujo2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;You'll be asked to enter a password for your certificate.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Importing the certificate with Singtool:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Now copy the &lt;b&gt;mycert.pfx&lt;/b&gt; file into the folder where your executable is placed and run the following command with Signtool:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;"&gt;Signtool sign /f mycert.pfx /p password thundaxballsdemo.exe&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-0SJHnVUz0JM/TbIKJjNrqqI/AAAAAAAACtY/T63xtjCW_rg/s1600/Dibujo3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="197" src="http://3.bp.blogspot.com/-0SJHnVUz0JM/TbIKJjNrqqI/AAAAAAAACtY/T63xtjCW_rg/s400/Dibujo3.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Now if we check our application it will be digitally signed with our certificate:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-D4ePLbgduJo/TbIKoKSNPMI/AAAAAAAACtc/t-KzDfq76-c/s1600/Dibujo4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="http://2.bp.blogspot.com/-D4ePLbgduJo/TbIKoKSNPMI/AAAAAAAACtc/t-KzDfq76-c/s400/Dibujo4.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-j9q71KNQCAU/TbIKxQOWW3I/AAAAAAAACtg/n4B2cJsgxQY/s1600/Dibujo5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-j9q71KNQCAU/TbIKxQOWW3I/AAAAAAAACtg/n4B2cJsgxQY/s400/Dibujo5.jpg" width="337" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Then you can install this certificate into the "&lt;i&gt;windows trusted &lt;a href="http://technet.microsoft.com/en-us/library/cc757138(WS.10).aspx"&gt;certification store&lt;/a&gt;&lt;/i&gt;".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.top20toolbar.com/misc/codesigncert.htm"&gt;How to create your own code signing certificate and sign an ActiveX component in Windows&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa388170(v=vs.85).aspx"&gt;Using Singtool to sign a file&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.madboa.com/geek/openssl/"&gt;OpenSSL commands&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://help.godaddy.com/article/4778?isc="&gt;Windows code with Microsoft Signtool&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-5111837573521775401?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/5111837573521775401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/04/signing-your-delphi-applications-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/5111837573521775401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/5111837573521775401'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/04/signing-your-delphi-applications-with.html' title='Signing your Delphi applications with Microsoft Signtool'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-EgOyyKUiiHs/TbIFMTFvkkI/AAAAAAAACtM/Hf3_ELdJpw0/s72-c/si.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-697227699099549850</id><published>2011-04-22T21:37:00.000+02:00</published><updated>2011-07-03T22:24:57.370+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Videos'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><title type='text'>Delphi XE team working</title><content type='html'>&lt;div style="text-align: justify;"&gt;Here you can see the latest videos from &lt;b&gt;Danysoft&lt;/b&gt; about team working with Delphi XE by Luis Alfonso Rey. The videos are in &lt;b&gt;Spanish&lt;/b&gt; and there have released the first 2 chapters and it is expected a series of 5 chapters.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/4iraROwrVrI" title="YouTube video player" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/SjESCaxEjTY" title="YouTube video player" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Enjoy the videos!.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-697227699099549850?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/697227699099549850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/04/delphi-xe-team-working.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/697227699099549850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/697227699099549850'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/04/delphi-xe-team-working.html' title='Delphi XE team working'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/4iraROwrVrI/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2948400204528609956</id><published>2011-04-05T22:42:00.000+02:00</published><updated>2011-04-05T22:42:56.858+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><title type='text'>Assertion failure ..\win32src\thread32.cpp at line 434</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-My4-Ll2JKEE/TZt0ja_Vr4I/AAAAAAAACtA/PLqi6ejSCEg/s1600/Error.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="164" src="http://4.bp.blogspot.com/-My4-Ll2JKEE/TZt0ja_Vr4I/AAAAAAAACtA/PLqi6ejSCEg/s320/Error.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;For the ones who are using &lt;b&gt;Delphi 2009&lt;/b&gt; under &lt;b&gt;Windows 7 (64-bits)&lt;/b&gt;, this error will show up during the debugging of your applications. This just happened to me today and I found a really interesting solution on &lt;b&gt;Embarcadero's Forums&lt;/b&gt;. This just happened to me few days ago and I thought it was normal because of the OS, but then I realised that something was going wrong and every minute I got that annoying message leaving my applications&amp;nbsp;non-functional and with the problem of restarting the &lt;b&gt;Delphi IDE&lt;/b&gt; again.The solution provided is quite easy and I can guarantee you that it works!.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;First of all, you need an hexadecimal editor. I used &lt;a href="http://mh-nexus.de/en/downloads.php?product=HxD"&gt;mh-nexus&lt;/a&gt;, an &lt;b&gt;open source&lt;/b&gt; version that you can get from &lt;a href="http://mh-nexus.de/downloads/HxDen.zip"&gt;here&lt;/a&gt;. Then the steps for solving the issue are the following ones:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;1. Close Delphi&lt;/div&gt;&lt;div style="text-align: justify;"&gt;2. Locate bordbk120N.dll (&lt;b&gt;C:\Program Files (x86)\CodeGear\RAD Studio\6.0\bin&lt;/b&gt;)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;3. Make a backup of the library (just in case).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;4. Open &lt;b&gt;bordbk120N.dll&lt;/b&gt; with &lt;b&gt;mh-nexus&lt;/b&gt; and locate the hex values:&amp;nbsp;“&lt;b&gt;01 00 48 74 47 80 3D&lt;/b&gt;”&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Qeb4SuRm-vc/TZt623dcFdI/AAAAAAAACtE/lszaplO0Lac/s1600/LocateString.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="371" src="http://1.bp.blogspot.com/-Qeb4SuRm-vc/TZt623dcFdI/AAAAAAAACtE/lszaplO0Lac/s400/LocateString.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;5. Replace “&lt;b&gt;74&lt;/b&gt;” with &amp;nbsp;“&lt;b&gt;EB&lt;/b&gt;”and save the changes.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-luwHHDE6BgI/TZt-Oy92OPI/AAAAAAAACtI/9PHZ84ymfUo/s1600/ReplaceString.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="367" src="http://2.bp.blogspot.com/-luwHHDE6BgI/TZt-Oy92OPI/AAAAAAAACtI/9PHZ84ymfUo/s400/ReplaceString.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;6. Restart Delphi and the error message should be gone.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://social.technet.microsoft.com/Forums/en-US/w7itproappcompat/thread/e56df407-bd0b-4ecc-b8a5-0a35bcd571cc/?prof=required"&gt;Delphi 2009 compile bugs&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="https://forums.embarcadero.com/thread.jspa?threadID=13634"&gt;setthreadcontext failed in Windows7 and D2009&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.monien.net/blog/index.php/2009/07/delphi-2009-windows-7-64-bit-debugger-crash-workaround"&gt;Delphi 2009 / Windows 7 / 64 bit Debugger Crash Workaround&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2948400204528609956?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2948400204528609956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/04/assertion-failure-win32srcthread32cpp.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2948400204528609956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2948400204528609956'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/04/assertion-failure-win32srcthread32cpp.html' title='Assertion failure ..\win32src\thread32.cpp at line 434'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-My4-Ll2JKEE/TZt0ja_Vr4I/AAAAAAAACtA/PLqi6ejSCEg/s72-c/Error.bmp' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2446039623529088996</id><published>2011-04-03T21:34:00.002+02:00</published><updated>2011-04-03T21:35:16.411+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TED'/><title type='text'>Google's driverless car</title><content type='html'>&lt;div style="text-align: justify;"&gt;Sebastian Thrun helped build Google's amazing driverless car, powered by a very personal quest to save lives and reduce traffic accidents. Jawdropping video shows the DARPA Challenge-winning car motoring through busy city traffic with no one behind the wheel, and dramatic test drive footage from TED2011 demonstrates how fast the thing can really go.&lt;/div&gt;&lt;div style="text-align: right;"&gt;Source: &lt;a href="http://www.ted.com/talks/sebastian_thrun_google_s_driverless_car.html"&gt;TED&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="326" width="446"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt;&lt;param name="flashvars" value="vu=http://video.ted.com/talk/stream/2011/Blank/SebastianThrun_2011-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/SebastianThrun_2011-embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=1109&amp;lang=eng&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=sebastian_thrun_google_s_driverless_car;year=2011;theme=tales_of_invention;theme=a_taste_of_ted2011;theme=design_like_you_give_a_damn;theme=new_on_ted_com;theme=what_s_next_in_tech;event=TED2011;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talk/stream/2011/Blank/SebastianThrun_2011-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/SebastianThrun_2011-embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=1109&amp;lang=eng&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=sebastian_thrun_google_s_driverless_car;year=2011;theme=tales_of_invention;theme=a_taste_of_ted2011;theme=design_like_you_give_a_damn;theme=new_on_ted_com;theme=what_s_next_in_tech;event=TED2011;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Google's car in action:&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/2w-Fd2JbgGA" title="YouTube video player" width="500"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2446039623529088996?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2446039623529088996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/04/googles-driverless-car.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2446039623529088996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2446039623529088996'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/04/googles-driverless-car.html' title='Google&apos;s driverless car'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/2w-Fd2JbgGA/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-6264875529600692167</id><published>2011-03-11T12:07:00.000+01:00</published><updated>2011-03-11T12:07:56.802+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Robotics'/><category scheme='http://www.blogger.com/atom/ns#' term='TED'/><title type='text'>Silicon-based comedy</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;i&gt;Heather Knight introduces Data, a robotic stand-up comedian that does much more than rattle off one-liners -- it gathers audience feedback (using software co-developed with Scott Satkin and Varun Ramakrishna at CMU) and tunes its act as the crowd responds. Is this thing on?&lt;/i&gt; Source: &lt;a href="http://www.ted.com/talks/heather_knight_silicon_based_comedy.html"&gt;TED&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="326" width="446"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt;&lt;param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/HeatherKnight_2010W-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/HeatherKnight-2010W.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=1058&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=heather_knight_silicon_based_comedy;year=2010;theme=celebrating_tedwomen;theme=the_creative_spark;event=TEDWomen;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talks/dynamic/HeatherKnight_2010W-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/HeatherKnight-2010W.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=1058&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=heather_knight_silicon_based_comedy;year=2010;theme=celebrating_tedwomen;theme=the_creative_spark;event=TEDWomen;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-6264875529600692167?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/6264875529600692167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/03/silicon-based-comedy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6264875529600692167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6264875529600692167'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/03/silicon-based-comedy.html' title='Silicon-based comedy'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2296623833591908319</id><published>2011-03-11T01:52:00.001+01:00</published><updated>2011-03-11T02:16:51.455+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Today is my last day at AEtech</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://lh4.googleusercontent.com/-lUGCgjWbq5I/TXkiRhBUM_I/AAAAAAAACsw/B64i-U8Df5Y/s1600/AETECH.GIF" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="87" src="https://lh4.googleusercontent.com/-lUGCgjWbq5I/TXkiRhBUM_I/AAAAAAAACsw/B64i-U8Df5Y/s200/AETECH.GIF" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;After 8 years of working with the most talented group of people I have ever met, I have decided to turn over a new leaf, working for a dynamic multinational delivering&amp;nbsp;financial solutions&amp;nbsp;Software in the UK. Today is my last day at &lt;a href="http://www.aetech.es/"&gt;AEtech&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-e4BSBkV2yVc/TXlwZ4sRU-I/AAAAAAAACs0/HmAAOi9nqbQ/s1600/2.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="https://lh6.googleusercontent.com/-e4BSBkV2yVc/TXlwZ4sRU-I/AAAAAAAACs0/HmAAOi9nqbQ/s200/2.jpg" width="182" /&gt;&lt;/a&gt;&lt;/div&gt;I can’t say enough good things about the friends I have made and the talented people who have taught me so much. When I started here I never could have guessed that I would be creating cutting-edge software for the Industrial Automation sector. The experience working in multidisciplinary teams with very skilled Engineers is something to be a reminder of the very well done work.&lt;br /&gt;&lt;br /&gt;Leaving &lt;b&gt;AETech&lt;/b&gt; is different than any other job I have left. Joining &lt;b&gt;AETech&lt;/b&gt; in 2003 was an easy decision and more strange was to have found success there. I felt like home, and even though it sounds stranger, &lt;b&gt;AETech&lt;/b&gt; is the first place I have worked where I feel I am part of the company instead of working for the company.&lt;br /&gt;&lt;br /&gt;I am confident that this new step in my career will bring new outcomes. The time will tell. Meanwhile, I will go on blogging, telling you my bests and&amp;nbsp;being&amp;nbsp;in touch.&lt;br /&gt;&lt;br /&gt;Many thanks to all of you who have filled with joy the past eight years. I am looking forward to what comes next and don't forget to follow me!.&lt;br /&gt;&lt;br /&gt;-Jordi&lt;br /&gt;London, UK ~ 2011&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2296623833591908319?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2296623833591908319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/03/today-is-my-last-day-at-aetech.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2296623833591908319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2296623833591908319'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/03/today-is-my-last-day-at-aetech.html' title='Today is my last day at AEtech'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/-lUGCgjWbq5I/TXkiRhBUM_I/AAAAAAAACsw/B64i-U8Df5Y/s72-c/AETECH.GIF' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-4508639158987844670</id><published>2011-03-04T13:23:00.000+01:00</published><updated>2011-03-04T13:23:00.170+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Virtual machines'/><title type='text'>All Boot disk</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-9fOeV200XIo/TXDDQzETApI/AAAAAAAACsg/lGWPjfsMhc8/s1600/logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="43" src="https://lh3.googleusercontent.com/-9fOeV200XIo/TXDDQzETApI/AAAAAAAACsg/lGWPjfsMhc8/s200/logo.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Today one of my colleagues showed me this great &lt;a href="http://www.allbootdisks.com/"&gt;site&lt;/a&gt; where you can download all the boot disk images from MSDOS 3.3 to Windows XP. Then you can use these images to start up a virtual machine. &lt;i&gt;These ISO CD-ROM images have been created to allow you to boot your  computer from a CD for the purpose of repairing various issues. The CD images are an exact copy of the boot diskette images. There is  no advantage to using these ISO images over a diskette image. Some  newer computers do not have a floppy drive installed, so these images  allow for compatibility of newer machines&lt;/i&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Great job!. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-4508639158987844670?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/4508639158987844670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/03/all-boot-disk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4508639158987844670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4508639158987844670'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/03/all-boot-disk.html' title='All Boot disk'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-9fOeV200XIo/TXDDQzETApI/AAAAAAAACsg/lGWPjfsMhc8/s72-c/logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-6836671061253175252</id><published>2011-02-05T02:13:00.005+01:00</published><updated>2011-07-03T22:24:44.371+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><category scheme='http://www.blogger.com/atom/ns#' term='Physics'/><category scheme='http://www.blogger.com/atom/ns#' term='Computational geometry'/><title type='text'>Building my own Delphi Physics Engine part V</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_nWD8gSvCXFk/TUyUSkHVIdI/AAAAAAAACsA/jGPmQmLwMF4/s1600/cloth.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="168" src="http://1.bp.blogspot.com/_nWD8gSvCXFk/TUyUSkHVIdI/AAAAAAAACsA/jGPmQmLwMF4/s200/cloth.bmp" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Today I felt inspired (after parts &lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine.html"&gt;I&lt;/a&gt;, &lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine_10.html"&gt;II&lt;/a&gt;, &lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine.html"&gt;III&lt;/a&gt; and &lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_04.html"&gt;IV&lt;/a&gt;) and I tried to do a &lt;b&gt;cloth simulation&lt;/b&gt; in the &lt;b&gt;Thundax Physics Engine&lt;/b&gt;. There are a lot of things to do, but at least I can start simulating different components very fast without too much implementation. I saw one amazing implementation of the "&lt;b&gt;processing cloth&lt;/b&gt;" in &lt;a href="http://www.jrc313.com/processing/cloth/index.html"&gt;JRC313.com&lt;/a&gt;. Even though the applet is written in JavaScript, the performance is quite impressive and it's a nice work.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;but, How it works?&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;i&gt;"Every line in the cloth simulation is technically called a constraint and every point is a point mass (an object with no dimension, just location and mass). All the constraints do is control the distance between each point mass. If two points move too far apart, it will pull them closer. If two points are too close together, it will push them apart. The cloth is really then just a collection of constraints and point masses in a never ending struggle."&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;i&gt;&lt;a href="http://www.andrew-hoyer.com/experiments/cloth/"&gt;Andrew Hoyer&lt;/a&gt;.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;using &lt;span class="Apple-style-span" style="color: #666666;"&gt;Relaxation&lt;/span&gt; in simple linear systems:&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_nWD8gSvCXFk/TUyYiQ-0fWI/AAAAAAAACsE/mj9ZG0GfCSk/s1600/cloth1.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="178" src="http://2.bp.blogspot.com/_nWD8gSvCXFk/TUyYiQ-0fWI/AAAAAAAACsE/mj9ZG0GfCSk/s320/cloth1.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In the case of this &lt;b&gt;cloth simulation&lt;/b&gt; all I needed to do was try satisfying the constraints as fast as I can. For things like simple rope simulations it may be necessary to satisfy several times (maybe 4 or 5). The more times you satisfy, the more rigid the constraint becomes. This process is known as &lt;a href="http://en.wikipedia.org/wiki/Relaxation_%28physics%29"&gt;relaxation&lt;/a&gt; and is amazing!.&amp;nbsp;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;The displacement will then be of the form y(t) = Ae − t / Tcos(μt − δ). The constant T is called the relaxation time of the system and the constant μ is the quasi-frequency&lt;/span&gt;&lt;/i&gt;. (&lt;b&gt;Wikipedia&lt;/b&gt;).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In the following videos you'll be able to check the performance of the simulated cloth. I took&amp;nbsp;advantage of my previous &lt;b&gt;bridge&lt;/b&gt; (&lt;b&gt;spring + particles&lt;/b&gt;) and I've concatenated a series of bridges to set up a virtual cloth. Now the movement is quite astonishing:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/LwTZWOEdYNg" title="YouTube video player" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In the second video I'm showing one of the new features for the next release: "&lt;b&gt;the cutting tool&lt;/b&gt;". I still need to think about it, but for simple objects it could be simple to &lt;b&gt;cut an object&lt;/b&gt; and see its reaction, like in the next video:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/Zc3AA6GPAT8" title="YouTube video player" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;You can download the last version of the executable file here: &lt;a href="http://www.4shared.com/file/AQGXJdUX/ThundaxBallsDemo_v152.html"&gt;thundax Balls demo v1.52&lt;/a&gt;. And maybe in a near future you'll be able to see something similar to the &lt;a href="http://toucharcade.com/2009/01/23/fantastic-contraption-physics-puzzler-for-iphone/"&gt;Puzzler for iPhone&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/V0CVWijogm4" title="YouTube video player" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Other interesting video about physics and games is &lt;b&gt;&lt;a href="http://www.crayonphysics.com/"&gt;Crayon Physics&lt;/a&gt; &lt;/b&gt;from&lt;b&gt; &lt;a href="http://www.kloonigames.com/blog/"&gt;Petri Purho&lt;/a&gt;&lt;/b&gt;:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="321" src="http://player.vimeo.com/video/1849263" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/1849263"&gt;Crayon Physics Deluxe&lt;/a&gt; from &lt;a href="http://vimeo.com/user795183"&gt;Petri Purho&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;I hope you enjoy the videos!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related Links:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.jrc313.com/processing/cloth/index.html"&gt;JRC313 Processing cloth&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://web.archive.org/web/20070610223835/http://www.teknikus.dk/tj/gdc2001.htm"&gt;Advanced Character Physics&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Methods_of_computing_square_roots"&gt;Methods of Comparing square roots&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.andrew-hoyer.com/experiments/cloth/"&gt;Andrew Hoyer Experiments&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://ajaxian.com/archives/touching-cloth-canvas-fu"&gt;Touching Cloth, Canvas Fu&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.darwin3d.com/gdm1999.htm"&gt;Game developer magazine&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://farseerphysics.codeplex.com/"&gt;Farseer Physics&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.crayonphysics.com/"&gt;Crayon Physics&lt;/a&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-6836671061253175252?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/6836671061253175252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_05.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6836671061253175252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6836671061253175252'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_05.html' title='Building my own Delphi Physics Engine part V'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nWD8gSvCXFk/TUyUSkHVIdI/AAAAAAAACsA/jGPmQmLwMF4/s72-c/cloth.bmp' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-5443781992943517599</id><published>2011-02-04T00:19:00.002+01:00</published><updated>2011-07-03T22:24:44.361+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><category scheme='http://www.blogger.com/atom/ns#' term='Physics'/><category scheme='http://www.blogger.com/atom/ns#' term='Computational geometry'/><title type='text'>Building my own Delphi Physics Engine part IV</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TUs10hcAz5I/AAAAAAAACr8/ijWtX2besF0/s1600/phy.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TUs10hcAz5I/AAAAAAAACr8/ijWtX2besF0/s200/phy.jpg" width="133" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I'm &lt;u&gt;still working&lt;/u&gt; on my solution, but I can &lt;b&gt;advance you a preview&lt;/b&gt; of the smoothness of the application. I have improved the &lt;b&gt;bridge particle&lt;/b&gt; and its interaction with external events. I'm working on a &lt;b&gt;TStyle&lt;/b&gt; class that will enhance the &lt;b&gt;GDIRender&lt;/b&gt; allowing the different particles to have a custom style on the screen and &lt;a href="http://en.wikipedia.org/wiki/Code_refactoring"&gt;refactor&lt;/a&gt; all the classes to improve the scalability and interoperability of the Engine. If you are interested on testing the application, you can get the latest version of it from here: &lt;a href="http://www.4shared.com/file/ZeayJROX/ThundaxBallsDemo_v11.html"&gt;&lt;b&gt;Thundax Ball Demo v1.1&lt;/b&gt;&lt;/a&gt;. In this version you will notice the improved interaction with the mouse and the circle particles. I have to work out a solution for the other particles, but I'm still designing the whole product and I need to test some of the features that I want to release in the next version. Once the version is ready, I will upload it on &lt;b&gt;Sourceforge&lt;/b&gt; just in case you feel the urge to play with it!.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Here you can see the new performance:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/PTNqGtRhIaM" title="YouTube video player" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related Links:&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #7c7c7c; font-family: 'Trebuchet MS',Trebuchet,sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul style="list-style-type: disc; margin: 0.5em 0px; padding: 0px 2.5em;"&gt;&lt;li style="border-style: none; margin: 0px 0px 0.25em; padding: 0px; text-indent: 0px;"&gt;&lt;span class="Apple-style-span" style="line-height: 22px;"&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part I&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li style="border-style: none; margin: 0px 0px 0.25em; padding: 0px; text-indent: 0px;"&gt;&lt;span class="Apple-style-span" style="line-height: 22px;"&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine_10.html"&gt;Building my own Delphi Physics Engine part II&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li style="border-style: none; margin: 0px 0px 0.25em; padding: 0px; text-indent: 0px;"&gt;&lt;span class="Apple-style-span" style="line-height: 22px;"&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part III&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-5443781992943517599?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/5443781992943517599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_04.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/5443781992943517599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/5443781992943517599'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine_04.html' title='Building my own Delphi Physics Engine part IV'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nWD8gSvCXFk/TUs10hcAz5I/AAAAAAAACr8/ijWtX2besF0/s72-c/phy.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-4596012910477336356</id><published>2011-02-02T23:57:00.004+01:00</published><updated>2011-02-04T00:32:51.186+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><category scheme='http://www.blogger.com/atom/ns#' term='Physics'/><category scheme='http://www.blogger.com/atom/ns#' term='Computational geometry'/><title type='text'>Building my own Delphi Physics Engine part III</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/_nWD8gSvCXFk/TUlHGvu_SzI/AAAAAAAACr4/EK8an7icZ_g/s1600/MVC.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://1.bp.blogspot.com/_nWD8gSvCXFk/TUlHGvu_SzI/AAAAAAAACr4/EK8an7icZ_g/s200/MVC.bmp" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Now I'm working on the &lt;b&gt;interactive part&lt;/b&gt; (Controller). Since now I only have developed the &lt;b&gt;model&lt;/b&gt; and the &lt;b&gt;view&lt;/b&gt; section of the &lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93View%E2%80%93Controller"&gt;MVC pattern&lt;/a&gt; and I'm implementing and testing the &lt;b&gt;controller&lt;/b&gt; part. The main problem is that the Engine is quite simple to implement and use until the visual control appears. Now I have to take into account all the &lt;b&gt;events&lt;/b&gt; that come from the outside (mouse, keyboard) and add subscribers to the object particles. With the design that I've implemented it is easy to make &lt;b&gt;extensible&lt;/b&gt; the &lt;i&gt;model and the view section&lt;/i&gt; because the Engine follows the &lt;i&gt;&lt;b&gt;"low cohesion high &lt;a href="http://en.wikipedia.org/wiki/Coupling_%28computer_programming%29"&gt;coupling&lt;/a&gt;"&lt;/b&gt;&lt;/i&gt; principle. My sister challenged me by trying to do something similar to the &lt;a href="http://code.google.com/p/ruicode/"&gt;ruicode&lt;/a&gt; project, where its&amp;nbsp;&lt;a href="http://code.google.com/p/ruicode/downloads/detail?name=ofxRuiPhysics2d_002.zip&amp;amp;can=2&amp;amp;q="&gt;&lt;b&gt;ofxRuiPhysics2d&lt;/b&gt;&lt;/a&gt; project (&lt;i&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Simple 2d physics addon for OF (&lt;a href="http://www.openframeworks.cc/"&gt;OpenFrameworks&lt;/a&gt;) using the Verlet integrator where it includes particles, collisions and springs&lt;/span&gt;&lt;/i&gt;) is quite astonishing. Here you can see one of its videos:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" class="youtube-player" frameborder="0" height="390" src="http://www.youtube.com/embed/iNXWxURqdiE" title="YouTube video player" type="text/html" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;And here is my &lt;b&gt;project:&lt;/b&gt; &lt;a href="http://www.4shared.com/file/_BLPWB-0/ThundaxBallsDemo.html"&gt;&lt;b&gt;Thundax balls demo.exe&lt;/b&gt;&lt;/a&gt;, a Delphi win32 application that will start a demo with balls, springs and collisions. In the following videos you'll see different performances of my tests. In the &lt;b&gt;first&lt;/b&gt; video I'm trying to simulate the environment with all the forces playing at the same time, and in the &lt;b&gt;second&lt;/b&gt; video you can see myself using the mouse interacting with the balls and the springs.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" class="youtube-player" frameborder="0" height="390" src="http://www.youtube.com/embed/9GwM9EDJV5Y" title="YouTube video player" type="text/html" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" class="youtube-player" frameborder="0" height="390" src="http://www.youtube.com/embed/Rc4t6itdK0Y" title="YouTube video player" type="text/html" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;I hope you enjoy the videos!.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine part I&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine_10.html"&gt;Building my own Delphi Physics Engine part II&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Related frameworks:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;It's amazing the large amount of physics Engine that are available on the net. I just google the words "&lt;a href="http://www.google.es/#hl=es&amp;amp;xhr=t&amp;amp;q=physics+engine+javascript&amp;amp;cp=25&amp;amp;pf=p&amp;amp;sclient=psy&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;oq=physics+engine+javascript&amp;amp;pbx=1&amp;amp;fp=70b8e0a014bbb7bc"&gt;Physics Engine&lt;/a&gt;" and here are the results:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Javascript, C, and Java Frameworks:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://box2d-js.sourceforge.net/"&gt;Box2D JS&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://cvslab.di.unipi.it/blogs/simula/"&gt;PhysJ&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;&lt;a href="http://pl4n3.blogspot.com/2010/07/bulletjs-javascript-physics-engine.html"&gt;PL4N3S World&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://mrdoob.com/projects/chromeexperiments/ball_pool/"&gt;DragBall experiments&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://physicsketch.appspot.com/"&gt;PhysicSketch&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://experiments.lionel.me/blocs/"&gt;WaterFall&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://mrdoob.com/projects/chromeexperiments/google_gravity/"&gt;Google Gravity&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jrc313.com/processing/cloth/index.html"&gt;Cloth Simulation&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://farseerphysics.codeplex.com/"&gt;Farseer Physics&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;ActionScript Frameworks:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cove.org/ape/"&gt;APE Framework&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;3D and Realistic Frameworks:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://www.geek.com/articles/games/lagoa-multiphysics-engine-is-simply-stunning-20100720/"&gt;Logoa Multiphysics&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-4596012910477336356?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/4596012910477336356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4596012910477336356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4596012910477336356'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/02/building-my-own-delphi-physics-engine.html' title='Building my own Delphi Physics Engine part III'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nWD8gSvCXFk/TUlHGvu_SzI/AAAAAAAACr4/EK8an7icZ_g/s72-c/MVC.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-8417319621739112468</id><published>2011-02-01T13:50:00.002+01:00</published><updated>2011-02-01T15:37:58.893+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Videos'/><category scheme='http://www.blogger.com/atom/ns#' term='code rush'/><title type='text'>Netscape Mozilla Documentary 1998 - 2000 ProJect Code Rush</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;b&gt;Now&lt;/b&gt; you can see the very inspiring and must-see film from &lt;a href="http://clickmovement.org/coderush"&gt;Code Rush&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;The year is early 1998, at the height of dot-com era, and a small team of Netscape code writers frantically works to reconstruct the company's Internet browser. In doing so they will rewrite the rules of software development by giving away the recipe for its browser in exchange for integrating improvements created by outside unpaid developers.&amp;nbsp;&amp;nbsp; The fate of the entire company may well rest on their shoulders.&amp;nbsp;&amp;nbsp; Broadcast on PBS, the film capture the human and technological dramas that unfold in the collision between science, engineering, code, and commerce&lt;/i&gt;.&lt;/div&gt;&lt;div style="text-align: right;"&gt;Source: &lt;b&gt;Code Rush&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" class="youtube-player" frameborder="0" height="390" src="http://www.youtube.com/embed/u404SLJj7ig" title="YouTube video player" type="text/html" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-8417319621739112468?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/8417319621739112468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/02/netscape-mozilla-documentary-1998-2000.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/8417319621739112468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/8417319621739112468'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/02/netscape-mozilla-documentary-1998-2000.html' title='Netscape Mozilla Documentary 1998 - 2000 ProJect Code Rush'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/u404SLJj7ig/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-1779618110592160938</id><published>2011-01-17T22:30:00.001+01:00</published><updated>2011-01-17T22:36:23.205+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Diaspora'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='social networks'/><title type='text'>DIASPORA* the new distributed social networking service</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TTSzprJoYyI/AAAAAAAACrw/2mCcSbLig8o/s1600/diaspora_facebook-300x215.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="143" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TTSzprJoYyI/AAAAAAAACrw/2mCcSbLig8o/s200/diaspora_facebook-300x215.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.joindiaspora.com/"&gt;Diaspora&lt;/a&gt; (stylized &lt;b&gt;DIASPORA*&lt;/b&gt;) is a free personal web server that implements a &lt;a href="http://en.wikipedia.org/wiki/Distributed_social_network"&gt;distributed social networking&lt;/a&gt; service. The project is currently under development by &lt;i&gt;Dan Grippi, Maxwell Salzberg, Raphael Sofaer, and Ilya Zhitomirskiy&lt;/i&gt;, students at New York University's Courant Institute of Mathematical Sciences.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The group was inspired to create &lt;b&gt;Diaspora&lt;/b&gt; by a &lt;u&gt;February 5, 2010&lt;/u&gt; speech from Columbia University law professor Eben Moglen to the &lt;a href="http://en.wikipedia.org/wiki/Internet_Society"&gt;Internet Society's New York Chapter&lt;/a&gt;, "&lt;b&gt;&lt;a href="http://www.youtube.com/watch?v=QOEMv0S8AcA"&gt;Freedom in the Cloud&lt;/a&gt;&lt;/b&gt;", in which Moglen described centralized social networks as "spying for free." In a New York Times interview Salzberg said "&lt;b&gt;When you give up that data, you’re giving it up forever ... The value they give us is negligible in the scale of what they are doing, and what we are giving up is all of our privacy&lt;/b&gt;."&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The project was announced on April 24, 2010 on Kickstarter and reached its initial $10,000 fund-raising goal in 12 days. In the weeks that followed, it raised $200,641.84 from 6479 backers, making it the second most successful Kickstarter project to date.&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;b&gt;source&lt;/b&gt;: &lt;a href="http://en.wikipedia.org/wiki/Diaspora_(software)"&gt;wikipedia&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="600"&gt;&lt;param name="movie" value="http://www.youtube.com/v/SehPS5J1lQA?fs=1&amp;amp;hl=en_GB"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/SehPS5J1lQA?fs=1&amp;amp;hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;Do you think that facebook will tremble with this new social service?&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-1779618110592160938?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/1779618110592160938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/01/diaspora-new-distributed-social.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/1779618110592160938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/1779618110592160938'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/01/diaspora-new-distributed-social.html' title='DIASPORA* the new distributed social networking service'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nWD8gSvCXFk/TTSzprJoYyI/AAAAAAAACrw/2mCcSbLig8o/s72-c/diaspora_facebook-300x215.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-311277506178183600</id><published>2011-01-16T21:07:00.002+01:00</published><updated>2011-01-17T17:40:17.543+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><title type='text'>Depth of field calculator</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_nWD8gSvCXFk/TTCTVz2kAeI/AAAAAAAACro/0tyBHdvqvvE/s1600/photo.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="192" src="http://3.bp.blogspot.com/_nWD8gSvCXFk/TTCTVz2kAeI/AAAAAAAACro/0tyBHdvqvvE/s200/photo.bmp" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This year I'm going to start talking about one of my &lt;u&gt;passions&lt;/u&gt;: &lt;a href="http://en.wikipedia.org/wiki/Photography"&gt;Photography&lt;/a&gt;. And for starting, here you can get one of my last applications: &lt;a href="http://www.4shared.com/file/1p_ZMTIs/ThundaxDoFCalculator.html"&gt;Thundax Depth of Field Calculator&lt;/a&gt;. With this Delphi win32 front-end application you'll be able to calculate the &lt;a href="http://en.wikipedia.org/wiki/Depth_of_field"&gt;&lt;b&gt;Depth of field&lt;/b&gt;&lt;/a&gt;&amp;nbsp;(&lt;i&gt;the portion of a scene that appears sharp in the image&lt;/i&gt;) measurements needed in photography. You need to select the &lt;a href="http://en.wikipedia.org/wiki/Circle_of_confusion"&gt;CoC&lt;/a&gt; (&lt;i&gt;Circles of Confusion&lt;/i&gt;) in microns from the sidebar (there is a little sheet with the normal values for different types of cameras), &lt;b&gt;the &lt;a href="http://en.wikipedia.org/wiki/Focal_length"&gt;focal length&lt;/a&gt;&lt;/b&gt; from the choices, and &lt;b&gt;the &lt;a href="http://en.wikipedia.org/wiki/Aperture"&gt;lens aperture&lt;/a&gt;&lt;/b&gt; from the choices. Enter the &lt;b&gt;subject distance in meters&lt;/b&gt; from the lens and the calculated values are returned for various other designations of subject distance as well as the near limit of &lt;a href="http://en.wikipedia.org/wiki/Visual_acuity"&gt;acuity&lt;/a&gt;, far limit of acuity, and the total depth of field, all in both &lt;b&gt;meters&lt;/b&gt; and &lt;b&gt;feet&lt;/b&gt;, &lt;b&gt;accurate&lt;/b&gt; and &lt;b&gt;rounded&lt;/b&gt;. The calculations are based on the very well known on-line DoF &lt;a href="http://www.csgnetwork.com/depthoffieldcalc2t.html"&gt;javascript&lt;/a&gt; calculator.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_nWD8gSvCXFk/TTCSL-lOSqI/AAAAAAAACrk/XmC_gECLJCc/s1600/dof.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="245" src="http://3.bp.blogspot.com/_nWD8gSvCXFk/TTCSL-lOSqI/AAAAAAAACrk/XmC_gECLJCc/s400/dof.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In my application you can see the difference of using different&amp;nbsp;apertures&amp;nbsp;(F numbers) while taking the photo. In the example you can see that the distance is the same, but the DoF grows.&amp;nbsp;The aperture is getting smaller and smaller, and the shutter speed is getting longer to compensate.&amp;nbsp;&lt;i&gt;The distance and aperture both play a big role in depth of field. You you want to play with it, for example: for a short depth of field (blurry background) get close and use a lower f-stop. And for a long depth of field (clear all the way through) get farther away and use a higher f-stop&lt;/i&gt;. The following example will help you to understand better the DoF:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_nWD8gSvCXFk/TTNLpAYqpUI/AAAAAAAACrs/1cwYqNoOqj4/s1600/ap.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="218" src="http://1.bp.blogspot.com/_nWD8gSvCXFk/TTNLpAYqpUI/AAAAAAAACrs/1cwYqNoOqj4/s320/ap.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;Picture from: &lt;a href="http://eviltaco.blogspot.com/2008/04/aperture-basics-part-i-aperture-and.html"&gt;Photo Basics&lt;/a&gt;.&lt;/i&gt;&lt;/div&gt;The different calculations are the following ones:&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;procedure TDoF.Calc(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;    focal: integer;&lt;br /&gt;    aperture: double;&lt;br /&gt;    CoC: double;&lt;br /&gt;    Hyperfocal: double;&lt;br /&gt;    distance: double;&lt;br /&gt;    NearF, FarF, doftotal: double;&lt;br /&gt;begin&lt;br /&gt;    distance := StrToFloat(Edit2.Text) * 1000 * 0.3048;&lt;br /&gt;    focal := getFocal(ComboBox1.Text);&lt;br /&gt;    aperture := getAperture(ComboBox2.Text);&lt;br /&gt;    CoC := StrToFloat(Edit1.Text);&lt;br /&gt;    photovalues.Values['Subject distance (inches)'] := FloatToStr(StrToFloat(Edit2.Text) * 12) + ' in';&lt;br /&gt;    photovalues.Values['Subject distance (meters)'] := FloatToStr(StrToFloat(Edit2.Text) * 0.3048) + ' m';&lt;br /&gt;    photovalues.Values['Subject distance (millimeters)'] := FloatToStr(StrToFloat(Edit2.Text) * 0.3048 * 1000) + ' mm';&lt;br /&gt;    Hyperfocal := 0;&lt;br /&gt;    if (aperture * CoC) &amp;gt; 0 then&lt;br /&gt;        Hyperfocal := Sqr(focal) / (aperture * CoC);&lt;br /&gt;    photovalues.Values['Hyperfocal distance for this lens/aperture combination (meters)'] := FloatToStr(Hyperfocal) + ' m';&lt;br /&gt;    photovalues.Values['Hyperfocal rounded distance for this lens/aperture combination (meters)'] := FormatFloat(f, Hyperfocal) + ' m';&lt;br /&gt;    photovalues.Values['Hyperfocal distance for this lens/aperture combination (ft)'] := FloatToStr(Hyperfocal * feet) + ' ft';&lt;br /&gt;    photovalues.Values['Hyperfocal rounded distance for this lens/aperture combination (ft)'] := FormatFloat(f, Round(Hyperfocal * feet)) + ' ft';&lt;br /&gt;    NearF := ((Hyperfocal * 1000 * distance) / ((Hyperfocal * 1000) + (distance - focal))) / 1000;&lt;br /&gt;    photovalues.Values['Near limit of acceptable sharpness (meters)'] := FloatToStr(NearF) + ' m';&lt;br /&gt;    photovalues.Values['Rounded near limit of acceptable sharpness (meters)'] := FormatFloat(f, Round(NearF)) + ' m';&lt;br /&gt;    photovalues.Values['Near limit of acceptable sharpness (ft)'] := FloatToStr(NearF * feet) + ' ft';&lt;br /&gt;    photovalues.Values['Rounded near limit of acceptable sharpness (ft)'] := FormatFloat(f, Round(NearF * feet)) + ' ft';&lt;br /&gt;    FarF := ((Hyperfocal * 1000 * distance) / ((Hyperfocal * 1000) - (distance - focal)) / 1000);&lt;br /&gt;    if FarF &amp;lt; 0 then&lt;br /&gt;    begin&lt;br /&gt;        photovalues.Values['Far limit of acceptable sharpness (meters)'] := 'Infinity';&lt;br /&gt;        photovalues.Values['Rounded far limit of acceptable sharpness (meters)'] := 'Infinity';&lt;br /&gt;        photovalues.Values['Far limit of acceptable sharpness (ft)'] := 'Infinity';&lt;br /&gt;        photovalues.Values['Rounded far limit of acceptable sharpness (ft)'] := 'Infinity';&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;    begin&lt;br /&gt;        photovalues.Values['Far limit of acceptable sharpness (meters)'] := FloatToStr(FarF) + ' m';&lt;br /&gt;        photovalues.Values['Rounded far limit of acceptable sharpness (meters)'] := FormatFloat(f, Round(FarF)) + ' m';&lt;br /&gt;        photovalues.Values['Far limit of acceptable sharpness (ft)'] := FloatToStr(FarF * feet) + ' ft';&lt;br /&gt;        photovalues.Values['Rounded far limit of acceptable sharpness (ft)'] := FormatFloat(f, Round(FarF * feet)) + ' ft';&lt;br /&gt;    end;&lt;br /&gt;    doftotal := Round(FarF - NearF);&lt;br /&gt;    if doftotal &amp;lt; 0 then&lt;br /&gt;    begin&lt;br /&gt;        photovalues.Values['Total depth of field (meters)'] := 'Infinity';&lt;br /&gt;        photovalues.Values['Total rounded depth of field (meters)'] := 'Infinity';&lt;br /&gt;        photovalues.Values['Total depth of field (ft)'] := 'Infinity';&lt;br /&gt;        photovalues.Values['Total rounded depth of field (ft)'] := 'Infinity';&lt;br /&gt;    end&lt;br /&gt;    else if (doftotal &amp;gt;= 0) and (doftotal &amp;lt; 0.001) then&lt;br /&gt;    begin&lt;br /&gt;        photovalues.Values['Total depth of field (meters)'] := '&amp;gt; 1 mm';&lt;br /&gt;        photovalues.Values['Total rounded depth of field (meters)'] := '&amp;gt; 1 mm';&lt;br /&gt;        photovalues.Values['Total depth of field (ft)'] := '&amp;gt; 0.0393 in';&lt;br /&gt;        photovalues.Values['Total rounded depth of field (ft)'] := '&amp;gt; 0.0393 in';&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;    begin&lt;br /&gt;        photovalues.Values['Total depth of field (meters)'] := FloatToStr(doftotal) + ' m';&lt;br /&gt;        photovalues.Values['Total rounded depth of field (meters)'] := FormatFloat(f, Round(doftotal)) + ' m';&lt;br /&gt;        photovalues.Values['Total depth of field (ft)'] := FloatToStr(doftotal * feet) + ' ft';&lt;br /&gt;        photovalues.Values['Total rounded depth of field (ft)'] := FormatFloat(f, Round(doftotal * feet)) + ' ft';&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Tell me if it's useful to you and if you need any other calculations&lt;/b&gt;.&lt;br /&gt;&lt;b&gt;PS:&amp;nbsp;The program is free for non-commercial use.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Depth_of_field"&gt;Depth of Field&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://javascript.internet.com/math-related/field-depth.html"&gt;Javascript DoF&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://margo.student.utwente.nl/simon/dofcalc/qdof.html"&gt;Calculate DoF&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://itunes.apple.com/us/app/field-tools/id305817254?mt=8"&gt;DoF iPhone App&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/dof-calc/wiki/ScreenShots"&gt;dof-calc&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.csgnetwork.com/depthoffieldcalc2t.html"&gt;dof calculator&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bobatkins.com/photography/technical/depth_of_field_calc.html"&gt;Multipurpose calculator&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-311277506178183600?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/311277506178183600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/01/depth-of-field-calculator.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/311277506178183600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/311277506178183600'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/01/depth-of-field-calculator.html' title='Depth of field calculator'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nWD8gSvCXFk/TTCTVz2kAeI/AAAAAAAACro/0tyBHdvqvvE/s72-c/photo.bmp' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-5511319662538780930</id><published>2011-01-13T13:26:00.001+01:00</published><updated>2011-01-13T13:26:00.330+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Videos'/><title type='text'>Technologies of the past</title><content type='html'>&lt;div style="text-align: justify;"&gt;This video brings me back very good memories, where there were still floppy disks and other storage devices. I still can remember how fragile was the &lt;span id="main" style="visibility: visible;"&gt;&lt;span id="search" style="visibility: visible;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Floppy_disk"&gt;&lt;i&gt;5 1/4&lt;/i&gt;-inch &lt;i&gt;floppy&lt;/i&gt; disk&lt;/a&gt; and my first installation of the &lt;a href="http://es.wikipedia.org/wiki/MS-DOS"&gt;MSDos 6.22&lt;/a&gt; with a bunch of disks.&lt;/span&gt;&lt;/span&gt; In a short time they won't be remembered. In the video shown there are few children in front of various relics&amp;nbsp; from 20 years ago and they are asked what they were for.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/gdSHeKfZG7c?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/gdSHeKfZG7c?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-5511319662538780930?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/5511319662538780930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/01/technologies-of-past.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/5511319662538780930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/5511319662538780930'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/01/technologies-of-past.html' title='Technologies of the past'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2265853274624393368</id><published>2011-01-11T13:48:00.002+01:00</published><updated>2011-01-11T14:19:25.634+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Generics'/><title type='text'>Comparing Methods using Generics</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_nWD8gSvCXFk/TSw5d-bMRPI/AAAAAAAACrg/HPdO6LXsajM/s1600/cup_generics.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://2.bp.blogspot.com/_nWD8gSvCXFk/TSw5d-bMRPI/AAAAAAAACrg/HPdO6LXsajM/s200/cup_generics.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;This is my first post of 2011. I will hopefully be doing more posts this year. These will include my work, tutorials, snippets of code and what I find on the web. Hopefully this year will be a good one, with new projects, more ideas and more motivation&lt;/i&gt;.&lt;br /&gt;In &lt;b&gt;Delphi 2009&lt;/b&gt; appeared the &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Generic_programming"&gt;Generics&lt;/a&gt; &lt;t&gt;&lt;/t&gt;&lt;/b&gt; (&lt;i&gt;containers-of-type-T&lt;/i&gt;) in the Delphi programming language. I have been playing with them in &lt;b&gt;Delphi 2010&lt;/b&gt; and here you can see my results. The new library is quite easy to use and with the help of this libraries we can enhance our code. We can also use the &lt;a href="http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/anonymousmethods_xml.html"&gt;Anonymous methods&lt;/a&gt; and call the function "&lt;i&gt;&lt;b&gt;inline&lt;/b&gt;&lt;/i&gt;" in the sort method.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Using the &lt;b&gt;Generics.defaults&lt;/b&gt; and &lt;b&gt;Generics.Collections&lt;/b&gt; we can build new &lt;b&gt;container&lt;/b&gt; or &lt;b&gt;comparer&lt;/b&gt; classes and pass to them the type-T (Integer, String, TObject, etc.).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Default comparer:&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This example will create an&lt;b&gt; Integer comparer&lt;/b&gt; and it will use a &lt;b&gt;TIntegerList&lt;/b&gt; to sort its values:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;unit uComparing;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;    generics.defaults, generics.collections;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;    TIntegerComparer = class(TComparer&amp;lt;Integer&amp;gt;);&lt;br /&gt;    TIntegerList = class(TList&amp;lt;Integer&amp;gt;);&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;end.&amp;nbsp;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;usage:&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;    integerList : TIntegerList;&lt;br /&gt;    i: Integer;&lt;br /&gt;begin&lt;br /&gt;    integerList := TIntegerList.Create(TIntegerComparer.default);&lt;br /&gt;    for i := 0 to memo1.Lines.count - 1 do&lt;br /&gt;        integerList.Add(StrToInt(Memo1.Lines[i]));&lt;br /&gt;    integerList.Sort;&lt;br /&gt;    for i := 0 to integerList.count - 1 do&lt;br /&gt;        Memo2.Lines.Add(IntToStr(integerList[i]));&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Custom Comparer:&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;The custom comparer will use a comparer method to sort the values in a descendant way.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush: delphi"&gt;unit uComparing;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;    generics.defaults, generics.collections;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;    TIntegerComparer = class(TComparer&amp;lt;Integer&amp;gt;)&lt;br /&gt;    public&lt;br /&gt;        function Compare(const Left, Right : Integer) : Integer; override;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;    TIntegerList = class(TList&amp;lt;Integer&amp;gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{ TIntegerComparer }&lt;br /&gt;&lt;br /&gt;function TIntegerComparer.Compare(const Left, Right: Integer): Integer;&lt;br /&gt;begin&lt;br /&gt;    result := Right - Left;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&amp;nbsp;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;usage:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;    integerList : TIntegerList;&lt;br /&gt;    i: Integer;&lt;br /&gt;begin&lt;br /&gt;    integerList := TIntegerList.Create(TIntegerComparer.create);&lt;br /&gt;    for i := 0 to memo1.Lines.count - 1 do&lt;br /&gt;        integerList.Add(StrToInt(Memo1.Lines[i]));&lt;br /&gt;    integerList.Sort;&lt;br /&gt;    for i := 0 to integerList.count - 1 do&lt;br /&gt;        Memo2.Lines.Add(IntToStr(integerList[i]));&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Anonymous Comparer:&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;The Anonymous comparer is created inside the sort method:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush: delphi"&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;    integerList : TIntegerList;&lt;br /&gt;    i: Integer;&lt;br /&gt;begin&lt;br /&gt;    integerList := TIntegerList.Create();&lt;br /&gt;    for i := 0 to memo1.Lines.count - 1 do&lt;br /&gt;        integerList.Add(StrToInt(Memo1.Lines[i]));&lt;br /&gt;    integerList.Sort(TIntegerComparer.Construct(&lt;br /&gt;       function (const Left , Right : integer): integer&lt;br /&gt;       begin&lt;br /&gt;         result := Left - Right;&lt;br /&gt;       end&lt;br /&gt;       ));&lt;br /&gt;    for i := 0 to integerList.count - 1 do&lt;br /&gt;        Memo2.Lines.Add(IntToStr(integerList[i]));&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://docwiki.embarcadero.com/CodeExamples/en/Generics_Defaults_TCustomComparer_%28Delphi%29"&gt;Generic Defaults TCustomComparer&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://docwiki.embarcadero.com/CodeExamples/en/Generics_Defaults_TComparer_%28Delphi%29"&gt;Generic Defaults TComparer&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://docwiki.embarcadero.com/CodeExamples/en/Generics_Defaults_TEqualityComparer_%28Delphi%29"&gt;Generic Defaults TEqualityComparer&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://delphi.about.com/od/delphitips2009/qt/sort-generic.htm"&gt;Sort Generic List using Anonymous Comparer method&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://interactiveasp.net/blogs/spgilmore/archive/2009/12/23/using-generics-in-delphi.aspx"&gt;Using generics in Delphi&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.coderfriendly.com/2009/05/09/evolving-the-java-language-generics-were-hard-to-implement/"&gt;Investigating generics&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Generic_programming"&gt;Generic Programming&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/anonymousmethods_xml.html"&gt;Anonymous Methods in Delphi&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2265853274624393368?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2265853274624393368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/01/comparing-methods-using-generics.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2265853274624393368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2265853274624393368'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2011/01/comparing-methods-using-generics.html' title='Comparing Methods using Generics'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nWD8gSvCXFk/TSw5d-bMRPI/AAAAAAAACrg/HPdO6LXsajM/s72-c/cup_generics.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-6310125048012665165</id><published>2010-12-29T14:07:00.002+01:00</published><updated>2010-12-29T15:46:22.173+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TKinter'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Mobile'/><title type='text'>PythonCE for Windows CE</title><content type='html'>&lt;div style="text-align: justify;"&gt;I'm playing with the &lt;b&gt;&lt;a href="http://pythonce.sourceforge.net/"&gt;PythonCE&lt;/a&gt;&lt;/b&gt; library for &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_CE"&gt;Windows CE&lt;/a&gt;&lt;/b&gt; devices, and I'm building a little &lt;i&gt;graphic application (GUI)&lt;/i&gt; with it just to be sure that the chosen technology is the appropriate. I've always used the &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=1dacdb3d-50d1-41b2-a107-fa75ae960856"&gt;embedded VC++ and VB&lt;/a&gt; and I think it's time to move on and try new things. I've tested this library on my &lt;b&gt;DELL Axim x50&lt;/b&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Firstly, you have to &lt;a href="http://pythonce.sourceforge.net/Wikka/Downloading"&gt;download&lt;/a&gt; the &lt;a href="http://pythonce.sourceforge.net/Wikka/PythonCE"&gt;PythonCE&lt;/a&gt; library for your device. Download &lt;a href="http://sourceforge.net/projects/pythonce/files/pythonce-smartphone/Python-2.5-20071004/"&gt;PythonCESetup.exe&lt;/a&gt; from &lt;a href="http://sourceforge.net/projects/pythonce/files/pythonce-smartphone/Python-2.5-20071004/PythonCESetup.exe/download"&gt;sourceforge&lt;/a&gt;. Once downloaded, you have to execute the &lt;b&gt;PythonCESetup.exe&lt;/b&gt; and it automatically will install the PythonCE on your WindowsCE device.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Once done, your pocket device will have installed the python command line:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_nWD8gSvCXFk/TRsjNYPtbvI/AAAAAAAACqs/VCQLyEqD-d0/s1600/pocket.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_nWD8gSvCXFk/TRsjNYPtbvI/AAAAAAAACqs/VCQLyEqD-d0/s1600/pocket.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Then, for &lt;u&gt;executing graphical applications&lt;/u&gt;, we need to install the &lt;b&gt;&lt;a href="http://wiki.python.org/moin/TkInter"&gt;TKinter&lt;/a&gt;&lt;/b&gt; library. You'll succeed if you follow the next instructions to install the TKinter library on your pocket device: &lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Using &lt;a href="http://pythonce.sourceforge.net/Wikka/Tkinter"&gt;&lt;b&gt;TKinter&lt;/b&gt;&lt;/a&gt; for Windows CE:&lt;/div&gt;&lt;br /&gt;&lt;div style="color: #666666; text-align: justify;"&gt;&lt;i&gt;To use Tkinter you have to download this additional software &lt;a href="http://prdownloads.sourceforge.net/pythonce/Tkinter-Files.zip?download"&gt;&lt;b&gt;Tkinter.zip&lt;/b&gt;&lt;/a&gt; and unpack it on your PDA.&lt;/i&gt;  &lt;/div&gt;&lt;ol style="color: #666666; text-align: justify;" type="1"&gt;&lt;li&gt;&lt;i&gt; The following archive contains 2 folders: "&lt;b&gt;Windows&lt;/b&gt;"  and "&lt;b&gt;tcl8.4.3&lt;/b&gt;". Put all the files in "&lt;b&gt;Windows&lt;/b&gt;" in the "&lt;b&gt;Windows&lt;/b&gt;" &lt;u&gt;folder&lt;/u&gt;  of your PDA. &lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt; Create a "&lt;b&gt;lib&lt;/b&gt;" folder in the "&lt;b&gt;Program files&lt;/b&gt;" folder of your PDA. &lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt; Inside the "&lt;b&gt;tcl8.4.3&lt;/b&gt;" folder in your archive you will find two  folders: "&lt;b&gt;library&lt;/b&gt;" and "&lt;b&gt;tk8.4&lt;/b&gt;". Copy the "&lt;b&gt;tk8.4&lt;/b&gt;" folder into the "&lt;b&gt;lib&lt;/b&gt;"  folder you just created on your PDA. &lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt; Copy all the files in "&lt;b&gt;library&lt;/b&gt;" into a folder named "&lt;b&gt;tcl8.4&lt;/b&gt;" you will create inside the same "&lt;b&gt;lib&lt;/b&gt;" folder.&lt;/i&gt;&lt;/li&gt;&lt;/ol&gt;If&amp;nbsp; you succeed, you can execute the next example and try it on our device:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;pre class="brush: python"&gt;from Tkinter import * &lt;br /&gt;&lt;br /&gt;def onCanvasClick(event):                  &lt;br /&gt;    print 'Got canvas click', event.x, event.y, event.widget&lt;br /&gt;&lt;br /&gt;root = Tk()&lt;br /&gt;root.title('MyAPP')&lt;br /&gt;canv = Canvas(root, width=100, height=100)&lt;br /&gt;img = PhotoImage(file='\\My Documents\\logo.gif')&lt;br /&gt;canv.create_image(240,250, image=img, anchor=CENTER)&lt;br /&gt;obj1 = canv.create_text(50, 30, fill="red", text='text1')&lt;br /&gt;obj2 = canv.create_text(50, 70, fill="red", text='text2')&lt;br /&gt;widget = Label(root, text='This is a Label')&lt;br /&gt;widget.config(bg='black', fg='yellow')             &lt;br /&gt;widget.pack(expand=YES, fill=BOTH)&lt;br /&gt;canv.bind('&amp;lt;Double-1&amp;gt;', onCanvasClick)                  &lt;br /&gt;canv.pack()&lt;br /&gt;root.mainloop()&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Output Example:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TRsjyeCeHhI/AAAAAAAACqw/BcNakxJS1Qc/s1600/pocketPyhton.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TRsjyeCeHhI/AAAAAAAACqw/BcNakxJS1Qc/s1600/pocketPyhton.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.java2s.com/Code/Python/CatalogPython.htm"&gt;Python &lt;/a&gt;&lt;a href="http://www.java2s.com/Code/Python/CatalogPython.htm"&gt;Examples&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-6310125048012665165?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/6310125048012665165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/12/pythonce-for-windows-ce.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6310125048012665165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6310125048012665165'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/12/pythonce-for-windows-ce.html' title='PythonCE for Windows CE'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nWD8gSvCXFk/TRsjNYPtbvI/AAAAAAAACqs/VCQLyEqD-d0/s72-c/pocket.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-421051936511190585</id><published>2010-12-21T13:37:00.008+01:00</published><updated>2010-12-23T10:42:24.109+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Redes'/><category scheme='http://www.blogger.com/atom/ns#' term='Education'/><title type='text'>Building today the schools of tomorrow</title><content type='html'>&lt;div style="text-align: justify;"&gt;This post is dedicated to &lt;a href="http://www.richardgerver.com/"&gt;Richard Gerver&lt;/a&gt; who attended the &lt;a href="http://www.globaleducationforum.org/"&gt;Global Education Forum&lt;/a&gt; held in Madrid this year, where different topics related to education were discussed. This video is the last one published in &lt;a href="http://www.redesparalaciencia.com/"&gt;Redes&lt;/a&gt; about &lt;a href="http://www.rtve.es/television/20101213/crear-hoy-escuelas-manana/385896.shtml"&gt;building today the schools of tomorrow&lt;/a&gt; (in Spanish).&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;embed allowfullscreen="true" allowscriptaccess="always" height="300" src="http://blip.tv/scripts/flash/showplayer.swf?autoStart=false%20&amp;amp;file=http://blip.tv/rss/flash/4541864" type="application/x-shockwave-flash" width="480"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Ua3528wx91c?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Ua3528wx91c?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #666666; text-align: justify;"&gt;&lt;i&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;"In The&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;XXI&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;century&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;the only&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;thing&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;we know for sure&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;is&lt;/span&gt; that it's &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;going&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;to&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;be very different&lt;/span&gt;&lt;span title="Haz clic para obtener traducciones alternativas"&gt;.&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;Now&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;the&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;industry&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;needs&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;more&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;imagination&lt;/span&gt;&lt;span title="Haz clic para obtener traducciones alternativas"&gt;,&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;more creativity,&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;more&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;skill&lt;/span&gt;ed &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;workers&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;to&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;work together&lt;/span&gt;&lt;span title="Haz clic para obtener traducciones alternativas"&gt;, with&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;a different mentality,&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;a&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;mentality&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;more&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;open&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;to&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;suggestions&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;from&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;others&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener traducciones alternativas"&gt;on their team&lt;/span&gt;&lt;span title="Haz clic para obtener traducciones alternativas"&gt;".&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;b&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title="Haz clic para obtener traducciones alternativas"&gt;Philip Hudson&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title="Haz clic para obtener traducciones alternativas"&gt;Director SEK Catalonia&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;b&gt;More videos: &lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=Bop9EcntlKY"&gt;Richard Gerver at Global education forum 1/9&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=RYXG9ETO0e4&amp;amp;feature=related"&gt;Richard Gerver at Global education forum 2/9&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=AJ6dohuv_TQ&amp;amp;feature=related"&gt;Richard Gerver at Global education forum 3/9&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=Gy8G_ceFitA&amp;amp;feature=related"&gt;Richard Gerver at Global education forum 4/9&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=7bB4RyzMLBE&amp;amp;feature=related"&gt;Richard Gerver at Global education forum 5/9&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=YKJVbDHvX3k&amp;amp;feature=related"&gt;Richard Gerver at Global education forum 6/9&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=ii2f4DTMJtU&amp;amp;feature=related"&gt;Richard Gerver at Global education forum 7/9&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=UrFI4mGSfTg&amp;amp;feature=related"&gt;Richard Gerver at Global education forum 8/9&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=YfCn3jMjqYo&amp;amp;feature=related"&gt;Richard Gerver at Global education forum 9/9&lt;/a&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-421051936511190585?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/421051936511190585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/12/building-today-schools-of-tomorrow.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/421051936511190585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/421051936511190585'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/12/building-today-schools-of-tomorrow.html' title='Building today the schools of tomorrow'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-685447086004120160</id><published>2010-12-21T00:29:00.001+01:00</published><updated>2010-12-21T09:37:07.204+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TED'/><category scheme='http://www.blogger.com/atom/ns#' term='Videos'/><category scheme='http://www.blogger.com/atom/ns#' term='Education'/><title type='text'>Changing education paradigms</title><content type='html'>&lt;div style="text-align: justify;"&gt;This post is dedicated to &lt;a href="http://www.ted.com/speakers/sir_ken_robinson.html"&gt;Ken Robinson&lt;/a&gt; an its "&lt;a href="http://www.ted.com/talks/ken_robinson_changing_education_paradigms.html"&gt;Changing education paradigms&lt;/a&gt;". "&lt;i&gt;Creativity expert Sir Ken Robinson challenges the way we're educating our children. He champions a radical rethink of our school systems, to cultivate creativity and acknowledge multiple types of intelligence"&lt;/i&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zDZFcDGpL4U?fs=1&amp;amp;hl=en_GB"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/zDZFcDGpL4U?fs=1&amp;amp;hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;Related videos:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ted.com/talks/ken_robinson_says_schools_kill_creativity.html"&gt;Schools kills creativity&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ted.com/talks/sir_ken_robinson_bring_on_the_revolution.html"&gt;Bring on the learning revolution&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Enjoy the video!.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-685447086004120160?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/685447086004120160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/12/changing-education-paradigms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/685447086004120160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/685447086004120160'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/12/changing-education-paradigms.html' title='Changing education paradigms'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-992117719330807779</id><published>2010-12-20T23:50:00.015+01:00</published><updated>2010-12-22T12:12:49.994+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Graph Visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='gnuplot'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><category scheme='http://www.blogger.com/atom/ns#' term='Fuzzy'/><title type='text'>Piecewise function plotter</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TQ9_L0ic_VI/AAAAAAAACqI/ALBBmGeGCmw/s1600/Dibujo1.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="118" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TQ9_L0ic_VI/AAAAAAAACqI/ALBBmGeGCmw/s320/Dibujo1.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I've been working lately on a &lt;a href="http://en.wikipedia.org/wiki/Front-end_and_back-end"&gt;front-end&lt;/a&gt; application to draw and generate the &lt;a href="http://en.wikipedia.org/wiki/Piecewise"&gt;piecewise-defined functions&lt;/a&gt; that are mainly used for the input &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Fuzzy_logic"&gt;fuzzy&lt;/a&gt;&lt;/b&gt; sets. This application is developed with Delphi and for generating the outputs it uses the &lt;a href="http://www.gnuplot.info/"&gt;&lt;b&gt;GNUplot&lt;/b&gt;&lt;/a&gt; and the &lt;a href="http://rinconmatematico.com/latexrender/"&gt;&lt;b&gt;LateX equation&lt;/b&gt;&lt;/a&gt; editor. The application is called &lt;b&gt;Thundax Piecewise v1.1&lt;/b&gt; and you can download it from &lt;b&gt;&lt;a href="http://www.4shared.com/file/wM2r5XVx/ThundaxPiecewise-Installer_v10.html"&gt;here&lt;/a&gt;&lt;/b&gt;. This win32 installation package contains the required files to work with the GNUplot. This software is for &lt;b&gt;academical purposes&lt;/b&gt; and with it you can define the &lt;i&gt;piecewise-defined functions&lt;/i&gt; without wasting your time trying to draw the graphs and the equations.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Using the application:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If you want to get the equations from the previous image, you only need to add the &lt;u&gt;&lt;b&gt;points (x,y)&lt;/b&gt;&lt;/u&gt; (defined as 4 points per graph), add the equation &lt;u&gt;&lt;b&gt;description&lt;/b&gt;&lt;/u&gt;, the &lt;u&gt;&lt;b&gt;range&lt;/b&gt;&lt;/u&gt; and the number of &lt;b&gt;&lt;u&gt;samples&lt;/u&gt;&lt;/b&gt;:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_nWD8gSvCXFk/TQ-JtMqWj3I/AAAAAAAACqM/xlyABQ9-TtY/s1600/Dibujo1.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="http://3.bp.blogspot.com/_nWD8gSvCXFk/TQ-JtMqWj3I/AAAAAAAACqM/xlyABQ9-TtY/s400/Dibujo1.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_nWD8gSvCXFk/TQ-QvoR_kBI/AAAAAAAACqY/OmYyPAsG4kA/s1600/dd.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The description of the parameters:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Points per graph:&lt;/b&gt; default value = 4. Number of points that are used to define the function:&lt;/li&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_nWD8gSvCXFk/TQ-QvoR_kBI/AAAAAAAACqY/OmYyPAsG4kA/s200/dd.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt; &lt;img border="0" height="131" src="http://3.bp.blogspot.com/_nWD8gSvCXFk/TQ-QvoR_kBI/AAAAAAAACqY/OmYyPAsG4kA/s200/dd.bmp" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;li&gt;&lt;b&gt;Range-x: &lt;/b&gt;Default value [0:30]. Range to be displayed at x-axis.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_nWD8gSvCXFk/TQ-Rebc5fOI/AAAAAAAACqc/RmU1nEfdWjE/s1600/Dibujo1.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="63" src="http://1.bp.blogspot.com/_nWD8gSvCXFk/TQ-Rebc5fOI/AAAAAAAACqc/RmU1nEfdWjE/s320/Dibujo1.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Range-y:&lt;/b&gt; Default value [-0.1:1.1]. Range to be displayed at y-axis.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TQ-SQdfnkDI/AAAAAAAACqg/1ZivSi9fsJc/s1600/Dibujo2.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TQ-SQdfnkDI/AAAAAAAACqg/1ZivSi9fsJc/s200/Dibujo2.bmp" width="41" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Samples:&lt;/b&gt; default value = 1. Number of samples for the x-axis. In a range from 1 to 10 with a sample of 1 it will show all the numbers.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_nWD8gSvCXFk/TQ-Rebc5fOI/AAAAAAAACqc/RmU1nEfdWjE/s1600/Dibujo1.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="63" src="http://1.bp.blogspot.com/_nWD8gSvCXFk/TQ-Rebc5fOI/AAAAAAAACqc/RmU1nEfdWjE/s320/Dibujo1.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once everything is done, you just need to let the application generate the graph output automatically using GNUPlot (If the function is not plotted, check the script and execute it into the GNUplot command prompt):&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_nWD8gSvCXFk/TQ-KEBsS1II/AAAAAAAACqQ/3PI-L3uPALA/s1600/Dibujo2.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://3.bp.blogspot.com/_nWD8gSvCXFk/TQ-KEBsS1II/AAAAAAAACqQ/3PI-L3uPALA/s400/Dibujo2.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;And then copy-and paste the output script to &lt;a href="http://rinconmatematico.com/latexrender/"&gt;Latex editor&lt;/a&gt; and get the piecewise function for each one:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_nWD8gSvCXFk/TQ-KWb5l8fI/AAAAAAAACqU/NuNK06rnnDI/s1600/ccd556292582eff632bdd8a59893feeb.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_nWD8gSvCXFk/TQ-KWb5l8fI/AAAAAAAACqU/NuNK06rnnDI/s400/ccd556292582eff632bdd8a59893feeb.gif" width="298" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The only thing the applications does, is to parse the input data and transform it as scripts for the GNUplot and Latex. The conversion is pretty simple and the scripts examples are like these:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;GNUPlot Script example:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;cold(x)=(x&amp;lt;=40? 0: cold2(x))&lt;br /&gt;cold2(x)=(x&amp;lt;=40 &amp;amp; x &amp;gt; 40? 1: cold3(x))&lt;br /&gt;cold3(x)=(x&amp;lt;=50 &amp;amp; x &amp;gt; 40? -0.1*x + 5: cold4(x))&lt;br /&gt;cold4(x)=(x&amp;lt;=50 &amp;amp; x &amp;gt; 50? 1: cold5(x))&lt;br /&gt;cold5(x)=(x&amp;gt;50? 0:0)&lt;br /&gt;cool(x)=(x&amp;lt;=40? 0: cool2(x))&lt;br /&gt;cool2(x)=(x&amp;lt;=55 &amp;amp; x &amp;gt; 40? 0.066667*x  -2.666667: cool3(x))&lt;br /&gt;cool3(x)=(x&amp;lt;=55 &amp;amp; x &amp;gt; 55? 1: cool4(x))&lt;br /&gt;cool4(x)=(x&amp;lt;=65 &amp;amp; x &amp;gt; 55? -0.1*x + 6.5: cool5(x))&lt;br /&gt;cool5(x)=(x&amp;gt;65? 0:0)&lt;br /&gt;justright(x)=(x&amp;lt;=60? 0: justright2(x))&lt;br /&gt;justright2(x)=(x&amp;lt;=65 &amp;amp; x &amp;gt; 60? 0.2*x  -12: justright3(x))&lt;br /&gt;justright3(x)=(x&amp;lt;=65 &amp;amp; x &amp;gt; 65? 1: justright4(x))&lt;br /&gt;justright4(x)=(x&amp;lt;=70 &amp;amp; x &amp;gt; 65? -0.2*x + 14: justright5(x))&lt;br /&gt;justright5(x)=(x&amp;gt;70? 0:0)&lt;br /&gt;warm(x)=(x&amp;lt;=65? 0: warm2(x))&lt;br /&gt;warm2(x)=(x&amp;lt;=75 &amp;amp; x &amp;gt; 65? 0.1*x  -6.5: warm3(x))&lt;br /&gt;warm3(x)=(x&amp;lt;=75 &amp;amp; x &amp;gt; 75? 1: warm4(x))&lt;br /&gt;warm4(x)=(x&amp;lt;=85 &amp;amp; x &amp;gt; 75? -0.1*x + 8.5: warm5(x))&lt;br /&gt;warm5(x)=(x&amp;gt;85? 0:0)&lt;br /&gt;hot(x)=(x&amp;lt;=80? 0: hot2(x))&lt;br /&gt;hot2(x)=(x&amp;lt;=90 &amp;amp; x &amp;gt; 80? 0.1*x  -8: hot3(x))&lt;br /&gt;hot3(x)=(x&amp;lt;=90 &amp;amp; x &amp;gt; 90? 1: hot4(x))&lt;br /&gt;hot4(x)=(x&amp;lt;=90 &amp;amp; x &amp;gt; 90? 1: hot5(x))&lt;br /&gt;hot5(x)=(x&amp;gt;90? 0:0)&lt;br /&gt;set yrange[-0.1:1.1]&lt;br /&gt;set xtics 0, 15&lt;br /&gt;set grid&lt;br /&gt;set samples 1001&lt;br /&gt;bind Close "exit gnuplot"&lt;br /&gt;plot [40:90] cold(x) ,cool(x) ,justright(x) ,warm(x) ,hot(x) &lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Notice that we use the function &lt;b&gt;bind Close "exit gnuplot"&lt;/b&gt; to bind the exit of the application once the user has closed the plotted graph. (And I think this function is available since version 4.4).&lt;br /&gt;&lt;b&gt;Latex Script example:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;cold(x)=\begin{Bmatrix}{0}&amp;amp;\mbox{if}&amp;amp; x\leq40\\{1}&amp;amp;\mbox{if}&amp;amp; 40&amp;lt; x \leq40\\{-0.1*x + 5}&amp;amp;\mbox{if}&amp;amp; 40&amp;lt; x \leq50\\{1}&amp;amp;\mbox{if}&amp;amp; 50&amp;lt; x \leq50\\{0}&amp;amp;\mbox{if}&amp;amp; x &amp;gt; 50\end{matrix}\\&lt;br /&gt;cool(x)=\begin{Bmatrix}{0}&amp;amp;\mbox{if}&amp;amp; x\leq40\\{0.066667*x  -2.666667}&amp;amp;\mbox{if}&amp;amp; 40&amp;lt; x \leq55\\{1}&amp;amp;\mbox{if}&amp;amp; 55&amp;lt; x \leq55\\{-0.1*x + 6.5}&amp;amp;\mbox{if}&amp;amp; 55&amp;lt; x \leq65\\{0}&amp;amp;\mbox{if}&amp;amp; x &amp;gt; 65\end{matrix}\\&lt;br /&gt;justright(x)=\begin{Bmatrix}{0}&amp;amp;\mbox{if}&amp;amp; x\leq60\\{0.2*x  -12}&amp;amp;\mbox{if}&amp;amp; 60&amp;lt; x \leq65\\{1}&amp;amp;\mbox{if}&amp;amp; 65&amp;lt; x \leq65\\{-0.2*x + 14}&amp;amp;\mbox{if}&amp;amp; 65&amp;lt; x \leq70\\{0}&amp;amp;\mbox{if}&amp;amp; x &amp;gt; 70\end{matrix}\\&lt;br /&gt;warm(x)=\begin{Bmatrix}{0}&amp;amp;\mbox{if}&amp;amp; x\leq65\\{0.1*x  -6.5}&amp;amp;\mbox{if}&amp;amp; 65&amp;lt; x \leq75\\{1}&amp;amp;\mbox{if}&amp;amp; 75&amp;lt; x \leq75\\{-0.1*x + 8.5}&amp;amp;\mbox{if}&amp;amp; 75&amp;lt; x \leq85\\{0}&amp;amp;\mbox{if}&amp;amp; x &amp;gt; 85\end{matrix}\\&lt;br /&gt;hot(x)=\begin{Bmatrix}{0}&amp;amp;\mbox{if}&amp;amp; x\leq80\\{0.1*x  -8}&amp;amp;\mbox{if}&amp;amp; 80&amp;lt; x \leq90\\{1}&amp;amp;\mbox{if}&amp;amp; 90&amp;lt; x \leq90\\{1}&amp;amp;\mbox{if}&amp;amp; 90&amp;lt; x \leq90\\{0}&amp;amp;\mbox{if}&amp;amp; x &amp;gt; 90\end{matrix}\\&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;I'm still working on this project and for the next milestone I'll try to add the &lt;b&gt;Weighted average method&lt;/b&gt; to calc the area of the graph and the ability to save the data of the project.&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Piecewise"&gt;Piecewise&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://t16web.lanl.gov/Kawano/gnuplot/intro/basic-e.html"&gt;http://t16web.lanl.gov/Kawano/gnuplot/intro/basic-e.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://t16web.lanl.gov/Kawano/gnuplot/intro/working-e.html"&gt;http://t16web.lanl.gov/Kawano/gnuplot/intro/working-e.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gnuplot.sourceforge.net/demo/fillcrvs.html"&gt;http://gnuplot.sourceforge.net/demo/fillcrvs.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://objectmix.com/graphics/140283-quiting-gnuplot-upon-closure-plotting-window.html"&gt;http://objectmix.com/graphics/140283-quiting-gnuplot-upon-closure-plotting-window.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gnuplot.sourceforge.net/demo/rainbow.html"&gt;http://gnuplot.sourceforge.net/demo/rainbow.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.intelligent-systems.info/classes/ee509/9.PDF"&gt;Example of a Mamdani/Larsen fuzzy controller &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rinconmatematico.com/latexrender/"&gt;Latex Render&lt;/a&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-992117719330807779?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/992117719330807779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/12/piecewise-function-plotter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/992117719330807779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/992117719330807779'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/12/piecewise-function-plotter.html' title='Piecewise function plotter'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nWD8gSvCXFk/TQ9_L0ic_VI/AAAAAAAACqI/ALBBmGeGCmw/s72-c/Dibujo1.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-3383636813664375554</id><published>2010-12-10T00:13:00.004+01:00</published><updated>2010-12-11T09:57:48.295+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><category scheme='http://www.blogger.com/atom/ns#' term='Physics'/><category scheme='http://www.blogger.com/atom/ns#' term='Computational geometry'/><title type='text'>Building my own Delphi Physics Engine part II</title><content type='html'>&lt;div style="text-align: justify;"&gt;Going on with my &lt;i&gt;&lt;b&gt;DPE&lt;/b&gt;&lt;/i&gt; (&lt;b&gt;Delphi Physics Engine&lt;/b&gt;) I've improved my old version (&lt;a href="http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine.html"&gt;Building my own Delphi Physics Engine Part I&lt;/a&gt;) of the &lt;a href="http://www.tedngai.net/experiments/jansen-mechanism.html"&gt;Jansen Mechanism&lt;/a&gt; by creating the rest of the legs displaced 120º each one. I've been fixing the &lt;a href="http://en.wikipedia.org/wiki/Damping"&gt;damping&lt;/a&gt; level of the framework just to be sure that the movements are as realistic as possible. In this version, the movement is quite realistic and we can trace the movement of the leg by plotting the kinetic analysis:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TQELaHM16UI/AAAAAAAACqE/bgpz1HAOZf8/s1600/new.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="347" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TQELaHM16UI/AAAAAAAACqE/bgpz1HAOZf8/s400/new.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="color: #999999;"&gt;&lt;i&gt;A &lt;u&gt;&lt;b&gt;physics engine&lt;/b&gt;&lt;/u&gt; is computer software that provides an approximate simulation of certain simple &lt;a href="http://en.wikipedia.org/wiki/Physical_system"&gt;physical systems&lt;/a&gt;, such as &lt;a href="http://en.wikipedia.org/wiki/Rigid_body_dynamics"&gt;rigid body dynamics&lt;/a&gt; (including &lt;a href="http://en.wikipedia.org/wiki/Collision_detection"&gt;collision detection&lt;/a&gt;), &lt;a href="http://en.wikipedia.org/wiki/Soft_body_dynamics"&gt;soft body dynamics&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Fluid_simulation"&gt;fluid dynamics&lt;/a&gt;, of use in the domains of computer graphics, video games and film. Their main uses are in video games (typically as middleware), in which case the simulations are in real-time. The term is sometimes used more generally to describe any software system for simulating physical phenomena, such as &lt;a href="http://en.wikipedia.org/wiki/High-performance_computing"&gt;high-performance scientific simulation&lt;/a&gt;. &lt;a href="http://en.wikipedia.org/wiki/Physics_engine"&gt;&lt;b&gt;Wikipedia&lt;/b&gt;&lt;/a&gt;.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;Here you can see the &lt;a href="http://en.wikipedia.org/wiki/Computer_generated_imagery"&gt;CGI&lt;/a&gt; result with the hanging version of the Jansen mechanism with one leg and with three legs:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/HtwgS_7xGwM?hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/HtwgS_7xGwM?hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;And the final version with the development of the Jansen machine. In this version (&lt;a href="http://www.4shared.com/file/-Sq02kbN/TestForcesProjectV2.html"&gt;Thundax Test Forces v2.exe&lt;/a&gt;) if you press &lt;b&gt;'p'&lt;/b&gt; the machine will start walking and if you want to change direction, you only need to press the &lt;b&gt;'z'&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/YllPbYDsDR8?hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/YllPbYDsDR8?hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;b&gt;What's next?&lt;/b&gt;. Now I'll try to reproduce different physics systems and show how it goes. The &lt;a href="http://www.um.es/fem/EjsWiki/index.php/Main/WhatIsEJS?"&gt;Easy Java Simulations&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Easy_Java_Simulations"&gt;tool&lt;/a&gt;, offers a wide range of &lt;a href="http://www.um.es/fem/EjsWiki/Main/Examples"&gt;examples&lt;/a&gt; that I would like to try.&lt;br /&gt;&lt;i&gt;&lt;b&gt;Enjoy the learning!.&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Related Links:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en-gb.facebook.com/pages/Theo-jansen-mechanism/106491746054694?sk=wiki"&gt;The Jansen Mechanism&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://ropesandpoles.blogspot.com/2008/07/theo-jansens-walking-sculptures.html"&gt;Theo Jansen's walking structures&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.myphysicslab.com/"&gt;MyPhysicsLab&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cs.cmu.edu/~baraff/sigcourse/index.html"&gt;Physically Based Modeling: Principles and Practice&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-3383636813664375554?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/3383636813664375554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine_10.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/3383636813664375554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/3383636813664375554'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine_10.html' title='Building my own Delphi Physics Engine part II'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nWD8gSvCXFk/TQELaHM16UI/AAAAAAAACqE/bgpz1HAOZf8/s72-c/new.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-1658096534593957403</id><published>2010-12-03T00:51:00.005+01:00</published><updated>2010-12-09T17:46:32.799+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><category scheme='http://www.blogger.com/atom/ns#' term='Physics'/><category scheme='http://www.blogger.com/atom/ns#' term='Computational geometry'/><title type='text'>Building my own Delphi Physics Engine part I</title><content type='html'>&lt;div style="text-align: justify;"&gt;&amp;nbsp;These days I've been working on my own Delphi Physics Engine based on the very well known &lt;a href="http://www.cove.org/ape/index.htm"&gt;APE&lt;/a&gt; (&lt;b&gt;ActionScript Physics Engine&lt;/b&gt;) with some improvements that will help developers to build models very fast. In this beta version I've done the following improvements:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Enhance &lt;u&gt;user performance&lt;/u&gt;.&lt;/li&gt;&lt;li&gt;Drastic reduction of &lt;u&gt;Memory leaks&lt;/u&gt;.&lt;/li&gt;&lt;li&gt;Improve the &lt;u&gt;interoperability&lt;/u&gt; between objects.&lt;/li&gt;&lt;li&gt;Improve &lt;u&gt;maths algorithms&lt;/u&gt; to collision detection.&lt;/li&gt;&lt;li&gt;Use the &lt;a href="http://thundaxsoftware.blogspot.com/2009/11/vlo-framework-on-sourceforge.html"&gt;&lt;b&gt;VLO&lt;/b&gt;&lt;/a&gt; &lt;b&gt;GDI Render&lt;/b&gt; to perform the drawing of the shapes.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;In this first insight into the Engine, I'm going to show you a model of the &lt;a href="http://www.tedngai.net/experiments/jansen-mechanism.html"&gt;Jansen mechanism&lt;/a&gt;, &lt;span id="main" style="visibility: visible;"&gt;&lt;span id="search" style="visibility: visible;"&gt;a kinetic sculpture that can move with the help of several pairs of legs.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-GgOn66knqA?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/-GgOn66knqA?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;I've built my own model taking advantage of the physic engine and imagination!.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_nWD8gSvCXFk/TPgsKmJVtGI/AAAAAAAACp0/7DqgX0Nmwis/s1600/Dibujo.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_nWD8gSvCXFk/TPgsKmJVtGI/AAAAAAAACp0/7DqgX0Nmwis/s1600/Dibujo.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TPgpfOYViFI/AAAAAAAACps/9FTOE8soUK0/s1600/Dibujo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;Here you can see my own model:&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/RmgD3Bl9I5A?hl=es&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/RmgD3Bl9I5A?hl=es&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The movement is still not very well performed, but it's due to the measures of the different parts of the sculpture. As for the calculation points, I've used the &lt;b&gt;next template&lt;/b&gt;:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_nWD8gSvCXFk/TPgr4_KZUiI/AAAAAAAACpw/8ZRvaZdIZKc/s1600/tj-magicnumbers_by_jansen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_nWD8gSvCXFk/TPgr4_KZUiI/AAAAAAAACpw/8ZRvaZdIZKc/s320/tj-magicnumbers_by_jansen.png" width="237" /&gt;&lt;/a&gt;&lt;/div&gt;You can download the demo project from here (&lt;b&gt;&lt;a href="http://www.4shared.com/file/MGHOj9Zl/TestForcesProject.html"&gt;Thundax Test Forces&lt;/a&gt;&lt;/b&gt;). To play with the application, you only need to press &lt;i&gt;&lt;b&gt;'z'&lt;/b&gt;&lt;/i&gt; to start the &lt;u&gt;kinetic sculpture&lt;/u&gt;, and as for the objects below the sculpture, press &lt;b&gt;'d'&lt;/b&gt; and you'll force a collision between two objects. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_nWD8gSvCXFk/TPgtn2wlD6I/AAAAAAAACp4/nZ1sgD_HCLE/s1600/Dibujo2.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="285" src="http://1.bp.blogspot.com/_nWD8gSvCXFk/TPgtn2wlD6I/AAAAAAAACp4/nZ1sgD_HCLE/s400/Dibujo2.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-XwhxBAH3Bk?hl=es&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/-XwhxBAH3Bk?hl=es&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;The next days I'll be improving the model (you can see the kinetic analysis that is plotted below the sculpture) and adding the extra foot to perform a fully movement.&lt;br /&gt;&lt;br /&gt;Enjoy the learning!.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=CufN43By79s&amp;amp;feature=related"&gt;Jansen Mechanism&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=bFlJ7Qo8LO0&amp;amp;feature=related"&gt;How to build a Jansen Mechanism&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mechanisms101.com/theo_jansen.html"&gt;Jansen Flash Animation&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=Q8gUvwM89A8"&gt;Jansen kinematic analysis&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.physicseditor.com/"&gt;Scythe Physics Editor&lt;/a&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-1658096534593957403?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/1658096534593957403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/1658096534593957403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/1658096534593957403'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/12/building-my-own-delphi-physics-engine.html' title='Building my own Delphi Physics Engine part I'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nWD8gSvCXFk/TPgsKmJVtGI/AAAAAAAACp0/7DqgX0Nmwis/s72-c/Dibujo.bmp' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-464430736659738731</id><published>2010-11-30T13:18:00.002+01:00</published><updated>2010-11-30T15:16:52.966+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><title type='text'>DelphiDoom for Delphi fans</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_nWD8gSvCXFk/TPTdqT4H1gI/AAAAAAAACpo/8Phxkb_RTB4/s1600/delphidoom3.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/_nWD8gSvCXFk/TPTdqT4H1gI/AAAAAAAACpo/8Phxkb_RTB4/s200/delphidoom3.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I've recently found &lt;a href="http://delphidoom.sitesled.com/"&gt;&lt;b&gt;Delphi Doom&lt;/b&gt;&lt;/a&gt;, an adaptation from the original &lt;b&gt;UNIX Doom C&lt;/b&gt; source code     to &lt;b&gt;Delphi.&lt;/b&gt; The project was finished in 2005 but the latest deploy was released on &lt;b&gt;&lt;/b&gt;&lt;b&gt;3 March&amp;nbsp;2008 (&lt;/b&gt;&lt;a href="http://delphidoom.sitesled.com/downloads.html"&gt;&lt;b&gt;Version: 1.0.2 build 383&lt;/b&gt;&lt;/a&gt;&lt;b&gt;). &lt;/b&gt;I've been tinkering with it and it's been great!. It cast me back when I was young, trying to pass all the levels by killing some hideous and very nasty monsters. &lt;i style="color: #999999;"&gt;This Application is a WIN32 port of the famous &lt;b&gt;Doom &lt;/b&gt;game created by &lt;a href="http://www.idsoftware.com/" target="_blank"&gt;ID Software&lt;/a&gt;.      The main difference of DelphiDoom is that is written in the &lt;b&gt;Pascal      programming language&lt;/b&gt;.      The source code has been translated from C to Pascal. In addition many new      features have been added to to expand the &lt;u&gt;old engine features&lt;/u&gt; and take      advantage of capabilities of modern computers&lt;/i&gt;. Remember that you need the &lt;a href="http://delphidoom.sitesled.com/documentation/howtogetiwad.html"&gt;IWAD&lt;/a&gt; file just for being able to pay. The &lt;a href="http://doom.wikia.com/wiki/IWAD"&gt;IWAD file&lt;/a&gt; is the file which contains all of the game data for a complete game.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Enjoy the game!.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/yr-lQZzevwA?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/yr-lQZzevwA?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-464430736659738731?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/464430736659738731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/delphidoom-for-delphi-fans.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/464430736659738731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/464430736659738731'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/delphidoom-for-delphi-fans.html' title='DelphiDoom for Delphi fans'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nWD8gSvCXFk/TPTdqT4H1gI/AAAAAAAACpo/8Phxkb_RTB4/s72-c/delphidoom3.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-6443143414836939770</id><published>2010-11-18T19:00:00.001+01:00</published><updated>2010-11-25T12:37:27.979+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Maths'/><category scheme='http://www.blogger.com/atom/ns#' term='2D'/><category scheme='http://www.blogger.com/atom/ns#' term='Physics'/><title type='text'>2d Physics with Delphi</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_nWD8gSvCXFk/TOVh1hGwxpI/AAAAAAAACpY/vVylvz6Ad1Q/s1600/mo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_nWD8gSvCXFk/TOVh1hGwxpI/AAAAAAAACpY/vVylvz6Ad1Q/s200/mo.jpg" width="191" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I'm modelling a series of objects with some physics and mathematics and I found interesting to talk about the library I am using: &lt;b&gt;&lt;a href="http://www.objectifstudio.com/oo_en/page11.html"&gt;Delphi APE&lt;/a&gt;&lt;/b&gt;. This fantastic library available for Delphi&amp;nbsp; (Windows) and Lazarus (Linux) allows very simple task as powerful as &lt;b&gt;gravity, collision processes, &lt;span class="Normal-C1"&gt;grouping behaviour and general process&lt;/span&gt;&lt;/b&gt;. Great the job done by &lt;b&gt;Alex cove&lt;/b&gt; and others like &lt;b&gt;Vincent&lt;/b&gt; and &lt;b&gt;Jeremy&lt;/b&gt; who helped him to make the conversion to Delphi.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This great library which I'm testing with &lt;b&gt;Delphi 2010&lt;/b&gt; is very easy to use and it shows a very interesting example combining different elements and letting them play. You can download the library from &lt;a href="http://www.objectifstudio.com/oo_en/archive/delphi/DelphiApe.zip"&gt;here&lt;/a&gt;, and test the different modelled items. The results are very well done and with simple steps we can achieve things like this:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TOVkYOB4GgI/AAAAAAAACpg/4bozmYS1_B0/s1600/Dibujo1.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TOVkYOB4GgI/AAAAAAAACpg/4bozmYS1_B0/s400/Dibujo1.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Another interesting library is the one done by &lt;b&gt;&lt;a href="http://www.algoryx.se/"&gt;Algoryx&lt;/a&gt;&lt;/b&gt; called &lt;a href="http://www.phunland.com/wiki/Home"&gt;&lt;b&gt;Phun&lt;/b&gt;&lt;/a&gt;.:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_nWD8gSvCXFk/TOVjW5aJUYI/AAAAAAAACpc/TAtPyMHfJq8/s1600/phun.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="85" src="http://3.bp.blogspot.com/_nWD8gSvCXFk/TOVjW5aJUYI/AAAAAAAACpc/TAtPyMHfJq8/s320/phun.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0H5g9VS0ENM?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/0H5g9VS0ENM?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related articles:&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.pascalgamedevelopment.com/showthread.php?5661-2d-Physics-Delphi-Ape-and-Delphi-Box-2d"&gt;Pascal game development&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/box2d-delphi/"&gt;Box2D Delphi&lt;/a&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-6443143414836939770?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/6443143414836939770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/2d-physics-with-delphi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6443143414836939770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6443143414836939770'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/2d-physics-with-delphi.html' title='2d Physics with Delphi'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nWD8gSvCXFk/TOVh1hGwxpI/AAAAAAAACpY/vVylvz6Ad1Q/s72-c/mo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-1858267349116128184</id><published>2010-11-17T18:42:00.001+01:00</published><updated>2010-11-25T12:38:00.760+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Follow us on Facebook</title><content type='html'>&lt;div style="text-align: justify;"&gt;Few days ago I set up the &lt;b&gt;&lt;a href="http://www.facebook.com/index.php#%21/pages/Thundax-Software/162366747116163"&gt;Facebook fan page&lt;/a&gt; &lt;/b&gt;just to let my followers be updated with my latest news. and posts. I hope you enjoy my posts and thanks for following.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TOP2fJEtHZI/AAAAAAAACpU/EOLMro6PeMw/s1600/Dibujo1.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="296" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TOP2fJEtHZI/AAAAAAAACpU/EOLMro6PeMw/s400/Dibujo1.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-1858267349116128184?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/1858267349116128184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/follow-us-on-facebook.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/1858267349116128184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/1858267349116128184'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/follow-us-on-facebook.html' title='Follow us on Facebook'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nWD8gSvCXFk/TOP2fJEtHZI/AAAAAAAACpU/EOLMro6PeMw/s72-c/Dibujo1.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-7334847652952470122</id><published>2010-11-17T14:41:00.019+01:00</published><updated>2010-11-25T12:40:49.540+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Artificial Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Alpha-beta pruning'/><title type='text'>Alpha-beta pruning algorithm with Delphi</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TOO5im5skTI/AAAAAAAACpE/aRoFjXx-DFI/s1600/Dibujo1.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="96" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TOO5im5skTI/AAAAAAAACpE/aRoFjXx-DFI/s200/Dibujo1.bmp" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I'm trying to get round to writing more often and to do my own research with some interesting and complicated algorithms. Given to my great passion for different types of algorithms, in &lt;a href="http://en.wikipedia.org/wiki/Artificial_intelligence"&gt;AI &lt;/a&gt;, I have found one very interesting and here you can get it build with Delphi 2010. With this solution, you'll be able to add values to the leaves and run the algorithm to find the nodes that will be evaluated and others that will be pruned. I've used my little &lt;a href="https://sourceforge.net/projects/vloframework/"&gt;framework&lt;/a&gt; to build the &lt;b&gt;structure&lt;/b&gt; (using a &lt;a href="http://en.wikipedia.org/wiki/Graphics_Device_Interface"&gt;GDI&lt;/a&gt; render) and then only focus on the algorithm that was the important part. &lt;b style="color: #999999;"&gt;&lt;a href="http://www.algorithmist.com/index.php/Alpha-beta_pruning"&gt;Alpha-beta pruning&lt;/a&gt;&lt;/b&gt;&lt;span style="color: #999999;"&gt; is a &lt;/span&gt;&lt;a href="http://www.algorithmist.com/index.php?title=Search_algorithm&amp;amp;action=edit&amp;amp;redlink=1"&gt;&lt;i style="color: #999999;"&gt;search algorithm&lt;/i&gt;&lt;/a&gt;&lt;span style="color: #999999;"&gt; which seeks to reduce the number of nodes that are evaluated in the &lt;a href="http://www.algorithmist.com/index.php?title=Game_tree&amp;amp;action=edit&amp;amp;redlink=1"&gt;search tree&lt;/a&gt; by the &lt;a href="http://www.algorithmist.com/index.php?title=Minimax&amp;amp;action=edit&amp;amp;redlink=1"&gt;minimax algorithm&lt;/a&gt;. It is a search with adversary algorithm used commonly for machine playing of two-player games (&lt;a href="http://www.algorithmist.com/index.php?title=Tic-tac-toe&amp;amp;action=edit&amp;amp;redlink=1"&gt;Tic-tac-toe&lt;/a&gt;, &lt;a href="http://www.algorithmist.com/index.php?title=Chess&amp;amp;action=edit&amp;amp;redlink=1"&gt;Chess&lt;/a&gt;, &lt;a href="http://www.algorithmist.com/index.php?title=Go_%28board_game%29&amp;amp;action=edit&amp;amp;redlink=1"&gt;Go&lt;/a&gt;, etc.). It stops completely evaluating a move when at least one possibility has been found that proves the move to be worse than a previously examined move. Such moves need not be evaluated further. Alpha-beta pruning is a sound optimization in that it does not change the result of the algorithm it optimizes (&lt;/span&gt;&lt;a href="http://www.algorithmist.com/index.php/Alpha-beta_pruning" style="color: #999999;"&gt;Algorithmist.com&lt;/a&gt;&lt;span style="color: #999999;"&gt;).&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The pseudo-code is quite simple, and it looks like this:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_nWD8gSvCXFk/TOO7XnhnNcI/AAAAAAAACpI/ZjZ5Gh0YW8o/s1600/al.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="140" src="http://1.bp.blogspot.com/_nWD8gSvCXFk/TOO7XnhnNcI/AAAAAAAACpI/ZjZ5Gh0YW8o/s400/al.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The structure of the application is very simple and the most difficult part is the simulation process where you need to draw every step of the algorithm.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_nWD8gSvCXFk/TOO8MuJ5qCI/AAAAAAAACpM/xfoJiiYG4tQ/s1600/minimax.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://1.bp.blogspot.com/_nWD8gSvCXFk/TOO8MuJ5qCI/AAAAAAAACpM/xfoJiiYG4tQ/s400/minimax.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;You can download the application from here (&lt;b&gt;&lt;a href="http://www.4shared.com/file/5_FHev_k/ThundaxAlphaBetaPruning.html"&gt;Thundax Alpha-beta pruning&lt;/a&gt;&lt;/b&gt;) and play with it to understand how the algorithm works.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_nWD8gSvCXFk/TOO9s3LS1EI/AAAAAAAACpQ/vkCQHLMw96U/s1600/minimax2.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://1.bp.blogspot.com/_nWD8gSvCXFk/TOO9s3LS1EI/AAAAAAAACpQ/vkCQHLMw96U/s400/minimax2.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This video shows the execution of the program:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/jYkzM88ZLG4?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/jYkzM88ZLG4?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;The code of the algorithm is explained as follows:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Alpha-beta algorithm:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;function TViewMinimax.alphabeta(Node: TNode; alpha: integer; beta: integer): integer;&lt;br /&gt;var&lt;br /&gt;    i: integer;&lt;br /&gt;    ret: integer;&lt;br /&gt;begin&lt;br /&gt;    if Node.isLeaf then&lt;br /&gt;        ret := Node.Value&lt;br /&gt;    else&lt;br /&gt;    begin&lt;br /&gt;        for i := 0 to Node.children.Count - 1 do&lt;br /&gt;        begin&lt;br /&gt;            alpha := max(alpha, -alphabeta(Node.children.Items[i], -beta, -alpha));&lt;br /&gt;            case Node.player of&lt;br /&gt;                tMAX:&lt;br /&gt;                    begin&lt;br /&gt;                        Node.Value := alpha;&lt;br /&gt;                        SetAlpha(Node, alpha);&lt;br /&gt;                        Node.visited := true;&lt;br /&gt;                    end;&lt;br /&gt;                tMIN:&lt;br /&gt;                    begin&lt;br /&gt;                        Node.Value := -alpha;&lt;br /&gt;                        SetBeta(Node, alpha);&lt;br /&gt;                        Node.visited := true;&lt;br /&gt;                    end;&lt;br /&gt;            end;&lt;br /&gt;            if beta &amp;lt;= alpha then&lt;br /&gt;                Break;&lt;br /&gt;        end;&lt;br /&gt;        ret := alpha;&lt;br /&gt;    end;&lt;br /&gt;    result := ret;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Drawing the nodes by using a pre-order method for iterating the &lt;a href="http://en.wikipedia.org/wiki/Binary_tree"&gt;binary tree&lt;/a&gt;:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;procedure TViewMinimax.Draw;&lt;br /&gt;begin&lt;br /&gt;    preorder(Self.FMinimax.root);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TViewMinimax.preorder(root: TNode);&lt;br /&gt;begin&lt;br /&gt;    if Assigned(root) then&lt;br /&gt;    begin&lt;br /&gt;        if root.children.Count &amp;gt; 0 then&lt;br /&gt;        begin&lt;br /&gt;            DrawLine(root, root.children.Items[0]);&lt;br /&gt;            DrawLine(root, root.children.Items[1]);&lt;br /&gt;            preorder(root.children.Items[0]);&lt;br /&gt;            preorder(root.children.Items[1]);&lt;br /&gt;        end;&lt;br /&gt;        DrawRectangle(root);&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TViewMinimax.DrawRectangle(Node: TNode);&lt;br /&gt;begin&lt;br /&gt;    Fcanvas.Font.Name := 'Arial';&lt;br /&gt;    Fcanvas.Brush.Style := bsSolid;&lt;br /&gt;    if Node.visited then&lt;br /&gt;        Fcanvas.Brush.Color := clRed&lt;br /&gt;    else&lt;br /&gt;        Fcanvas.Brush.Color := clWhite;&lt;br /&gt;    if Node.selected then&lt;br /&gt;        Fcanvas.Brush.Color := clGreen;&lt;br /&gt;    Fcanvas.Pen.Width := 2;&lt;br /&gt;    Fcanvas.Pen.Color := clBlack;&lt;br /&gt;    Fcanvas.Rectangle(Node.position.x - gap, Node.position.y - gap, Node.position.x + gap, Node.position.y + gap);&lt;br /&gt;    Fcanvas.TextOut(Node.position.x - 5, Node.position.y - 5, Inttostr(Node.Value));&lt;br /&gt;    Fcanvas.Brush.Color := clWhite;&lt;br /&gt;    if (Node.isLeaf) and (Node.Order &amp;lt;&amp;gt; 0) then&lt;br /&gt;        Fcanvas.TextOut(Node.position.x - 5, Node.position.y + 15, Inttostr(Node.Order));&lt;br /&gt;    if not Node.isLeaf then&lt;br /&gt;    begin&lt;br /&gt;        case Node.player of&lt;br /&gt;            tMAX:&lt;br /&gt;                begin&lt;br /&gt;                    if Node.alpha &amp;lt;&amp;gt; 0 then&lt;br /&gt;                        Fcanvas.TextOut(Node.position.x - 65, Node.position.y - 10, Inttostr(Node.Order) + ': a=' + Inttostr(Node.alpha));&lt;br /&gt;                    if Node.newAlpha &amp;lt;&amp;gt; 0 then&lt;br /&gt;                        Fcanvas.TextOut(Node.position.x - 65, Node.position.y + 5, Inttostr(Node.NewOrder) + ': a=' + Inttostr(Node.newAlpha));&lt;br /&gt;                end;&lt;br /&gt;            tMIN:&lt;br /&gt;                begin&lt;br /&gt;                    if Node.beta &amp;lt;&amp;gt; 0 then&lt;br /&gt;                        Fcanvas.TextOut(Node.position.x - 65, Node.position.y - 10, Inttostr(Node.Order) + ': ß=' + Inttostr(Node.beta));&lt;br /&gt;                    if Node.Newbeta &amp;lt;&amp;gt; 0 then&lt;br /&gt;                        Fcanvas.TextOut(Node.position.x - 65, Node.position.y + 5, Inttostr(Node.NewOrder) + ': ß=' + Inttostr(Node.Newbeta));&lt;br /&gt;                end;&lt;br /&gt;        end;&lt;br /&gt;        if Node.text &amp;lt;&amp;gt; '' then&lt;br /&gt;        begin&lt;br /&gt;            Fcanvas.Brush.Color := clyellow;&lt;br /&gt;            if (Node.newAlpha = 0) and (Node.Newbeta = 0) then&lt;br /&gt;                Fcanvas.TextOut(Node.position.x - 53, Node.position.y + 5, Node.text)&lt;br /&gt;            else&lt;br /&gt;                Fcanvas.TextOut(Node.position.x - 53, Node.position.y + 20, Node.text)&lt;br /&gt;        end;&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;Setting up the Minimax Algorithm:&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;procedure TForm1.Start1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;    vminimax: TViewMinimax;&lt;br /&gt;    minimax: TMinimax;&lt;br /&gt;    words: TStringList;&lt;br /&gt;    alpha, beta: integer;&lt;br /&gt;begin&lt;br /&gt;    minimax := TMinimax.Create;&lt;br /&gt;    if Edit1.Text &amp;lt;&amp;gt; '' then&lt;br /&gt;    begin&lt;br /&gt;        words := TStringList.Create;&lt;br /&gt;        SplitTextIntoWords(Edit1.Text, words);&lt;br /&gt;        minimax.AddNumbers(words);&lt;br /&gt;    end;&lt;br /&gt;    minimax.CreateTree;&lt;br /&gt;    Memo1.Lines.Clear;&lt;br /&gt;&lt;br /&gt;    Image1.Canvas.Brush.color := clwhite;&lt;br /&gt;    Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height);&lt;br /&gt;&lt;br /&gt;    vminimax := TViewMinimax.Create(Self.Image1.Canvas, minimax, Memo1);&lt;br /&gt;    if CheckBox1.Checked then&lt;br /&gt;        vminimax.time := 1000&lt;br /&gt;    else&lt;br /&gt;        vminimax.time := 0;&lt;br /&gt;    alpha := alphavalue;&lt;br /&gt;    beta := betavalue;&lt;br /&gt;&lt;br /&gt;    vminimax.Draw;&lt;br /&gt;    Self.Image1.Canvas.TextOut(951, 25 - 5, 'MAX');&lt;br /&gt;    Self.Image1.Canvas.TextOut(951, 127 - 5, 'MIN');&lt;br /&gt;    Self.Image1.Canvas.TextOut(951, 228 - 5, 'MAX');&lt;br /&gt;    Self.Image1.Canvas.TextOut(951, 328 - 5, 'MIN');&lt;br /&gt;&lt;br /&gt;    Start1.Enabled := false;&lt;br /&gt;    CheckBox1.Enabled := false;&lt;br /&gt;    vminimax.alphabeta(minimax.root, alpha, beta);&lt;br /&gt;    vminimax.Draw;&lt;br /&gt;    Start1.Enabled := true;&lt;br /&gt;    CheckBox1.Enabled := true;&lt;br /&gt;&lt;br /&gt;    FreeAndNil(words);&lt;br /&gt;    FreeAndNil(minimax);&lt;br /&gt;    FreeAndNil(vminimax);&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Splitting the text into numbers (comma separated values):&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;procedure SplitTextIntoWords(const S: string; words: TstringList);&lt;br /&gt;var&lt;br /&gt;    startpos, endpos: Integer;&lt;br /&gt;begin&lt;br /&gt;    Assert(Assigned(words));&lt;br /&gt;    words.Clear;&lt;br /&gt;    startpos := 1;&lt;br /&gt;    while startpos &amp;lt;= Length(S) do&lt;br /&gt;    begin&lt;br /&gt;        while (startpos &amp;lt;= Length(S)) and (S[startpos] = ',') do&lt;br /&gt;            Inc(startpos);&lt;br /&gt;        if startpos &amp;lt;= Length(S) then&lt;br /&gt;        begin&lt;br /&gt;            endpos := startpos + 1;&lt;br /&gt;            while (endpos &amp;lt;= Length(S)) and not (S[endpos] = ',') do&lt;br /&gt;                Inc(endpos);&lt;br /&gt;            words.Add(Copy(S, startpos, endpos - startpos));&lt;br /&gt;            startpos := endpos + 1;&lt;br /&gt;        end;&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Alpha-beta_pruning"&gt;Alpha-beta pruning Wikipedia&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://wolfey.110mb.com/GameVisual/launch.php"&gt;Alpha-beta pruning Java&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.java-forums.org/new-java/6884-alpha-beta-algorithm-game-tree.html"&gt;Alpha-beta algorithm&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://razonartificial.com/2010/08/algoritmo-minimax-un-jugador-incansable/"&gt;Algoritmo Minimax&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-7334847652952470122?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/7334847652952470122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/alpha-beta-pruning-algorithm-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7334847652952470122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7334847652952470122'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/alpha-beta-pruning-algorithm-with.html' title='Alpha-beta pruning algorithm with Delphi'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nWD8gSvCXFk/TOO5im5skTI/AAAAAAAACpE/aRoFjXx-DFI/s72-c/Dibujo1.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-7904100042730216323</id><published>2010-11-12T19:20:00.001+01:00</published><updated>2010-11-15T18:18:11.774+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Science'/><category scheme='http://www.blogger.com/atom/ns#' term='TED'/><category scheme='http://www.blogger.com/atom/ns#' term='Videos'/><title type='text'>I am my connectome</title><content type='html'>&lt;div style="text-align: justify;"&gt;This is another interesting TED video of &lt;a href="http://www.ted.com/speakers/sebastian_seung.html"&gt;Sebastian Seung&lt;/a&gt;. He is mapping a massively ambitious new model of the brain  that focuses on the connections between each neuron. He calls it our  "&lt;b&gt;connectome&lt;/b&gt;," and it's as individual as our genome -- and understanding  it could open a new way to understand our brains and our minds.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="326" width="446"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt;&lt;param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/SebastianSeung_2010G-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/SebastianSeung-2010G.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=967&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=sebastian_seung;year=2010;theme=how_the_mind_works;theme=new_on_ted_com;theme=a_taste_of_tedglobal_2010;event=TEDGlobal+2010;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talks/dynamic/SebastianSeung_2010G-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/SebastianSeung-2010G.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=967&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=sebastian_seung;year=2010;theme=how_the_mind_works;theme=new_on_ted_com;theme=a_taste_of_tedglobal_2010;event=TEDGlobal+2010;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Source:&lt;/b&gt; &lt;a href="http://www.ted.com/talks/sebastian_seung.html"&gt;TED Sebastian Seung&lt;/a&gt;. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-7904100042730216323?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/7904100042730216323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/i-am-my-connectome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7904100042730216323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7904100042730216323'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/i-am-my-connectome.html' title='I am my connectome'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-3306197296237852977</id><published>2010-11-10T23:22:00.002+01:00</published><updated>2010-11-25T12:43:47.831+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Artificial Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Genetic Algorithms'/><title type='text'>Genetic Algorithms (GA)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_nWD8gSvCXFk/TNnagoPfxiI/AAAAAAAACos/qwkDM85fRHc/s1600/mutation.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/_nWD8gSvCXFk/TNnagoPfxiI/AAAAAAAACos/qwkDM85fRHc/s200/mutation.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This semester I am expanding knowledge in terms of &lt;a href="http://en.wikipedia.org/wiki/Artificial_intelligence"&gt;Artificial Intelligence &lt;/a&gt;and one of the concepts that most captivated me was the resolution of problems using &lt;b&gt;genetic algorithms&lt;/b&gt;. These are based on coding the problem in chromosomes and genes into packages. After applying a series of functions, we need to mutate the population to reach our goal. and find the best solution. The definition from &lt;b&gt;wikipedia&lt;/b&gt; is: &lt;i style="color: #444444;"&gt;"The &lt;a href="http://en.wikipedia.org/wiki/Genetic_algorithm"&gt;&lt;b&gt;genetic algorithm&lt;/b&gt;&lt;/a&gt;&lt;b&gt; (GA)&lt;/b&gt; is a search heuristic that mimics the process of natural evolution. This heuristic is routinely used to generate useful solutions to optimization and search problems. Genetic algorithms belong to the larger class of &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Evolutionary_algorithm"&gt;evolutionary algorithms&lt;/a&gt;&lt;/b&gt; (&lt;b&gt;EA&lt;/b&gt;), which generate solutions to optimization problems using techniques inspired by natural evolution, such as &lt;a href="http://en.wikipedia.org/wiki/Heredity"&gt;inheritance&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Mutation_%28genetic_algorithm%29"&gt;mutation&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Selection_%28genetic_algorithm%29"&gt;selection&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Crossover_%28genetic_algorithm%29"&gt;crossover&lt;/a&gt;"&lt;/i&gt;.&lt;/div&gt;&lt;b&gt;Basically the algorithm works like this:&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_nWD8gSvCXFk/TNnb__oQIRI/AAAAAAAACo0/vbSn02aQ2wU/s1600/rhjan07g01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://1.bp.blogspot.com/_nWD8gSvCXFk/TNnb__oQIRI/AAAAAAAACo0/vbSn02aQ2wU/s320/rhjan07g01.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;There are several examples on the net which uses GA to solve common problems such as these:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://ai4r.rubyforge.org/geneticAlgorithms.html"&gt;Genetic Algorithm in Ruby: Travelling the salesman problem&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.riversoftavg.com/genetic_algorithms.htm"&gt;Genetic Algorithms with Delphi&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.efg2.com/Lab/Library/Delphi/Algorithms/index.html"&gt;Delphi Algorithms&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;One of the examples that best shows the use of &lt;b&gt;GA&lt;/b&gt; is the solution from &lt;a href="http://rogeralsing.com/2008/12/11/genetic-programming-mona-lisa-source-code-and-binaries/"&gt;&lt;b&gt;Roger Alsing&lt;/b&gt;&lt;/a&gt; where the algorithm is trying to copy an image generating polygons. These polygons are created in a population of chromosomes and they try to evolve to &lt;u&gt;fit &lt;/u&gt;the source image. I've been playing with it and it's great!. You can download the source code and the binaries from &lt;b&gt;&lt;a href="http://code.google.com/p/alsing/downloads/list"&gt;here&lt;/a&gt;&lt;/b&gt;. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Here you can see the results of playing with the application:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Genetic Vectorizer Example by Roger Alsing:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using my image (&lt;u&gt;40h of running time&lt;/u&gt;): &lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_nWD8gSvCXFk/TNq7RR-faGI/AAAAAAAACpA/asTMwgOi3nY/s1600/jor.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="340" src="http://2.bp.blogspot.com/_nWD8gSvCXFk/TNq7RR-faGI/AAAAAAAACpA/asTMwgOi3nY/s400/jor.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;using Einstein image (&lt;u&gt;20h of running time&lt;/u&gt;): &lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TNnbaOJPBnI/AAAAAAAACow/NTCHU3aeIvI/s1600/Dibujo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TNnbaOJPBnI/AAAAAAAACow/NTCHU3aeIvI/s400/Dibujo.jpg" width="395" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Video showing the start of the algorithm:&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/T00r7EK5BFU?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/T00r7EK5BFU?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In the video you can see the different steps the algorithm is doing by creating a population of chromosomes as polygons and trying to fit them by &lt;b&gt;shape&lt;/b&gt; and by &lt;b&gt;colour&lt;/b&gt; from the source image. The result of the application is the image shown&amp;nbsp; above.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://sodarace.net/"&gt;Sodorace&lt;/a&gt; game:&lt;/b&gt;&lt;br /&gt;&lt;div class="twoColumns"&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div class="columnA"&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div class="big" style="text-align: justify;"&gt;Sodarace is the on-line Olympics pitting human  creativity against machine learning in a competition to design robots  that race over 2D terrains using the Sodaconstructor virtual  construction kit.      &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_nWD8gSvCXFk/TNq6Ym6r3EI/AAAAAAAACo4/lFKUrX9jPOA/s1600/Dibujo3.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_nWD8gSvCXFk/TNq6Ym6r3EI/AAAAAAAACo4/lFKUrX9jPOA/s320/Dibujo3.bmp" width="320" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_nWD8gSvCXFk/TNq6gHqHXII/AAAAAAAACo8/2K8XtVm9Akk/s1600/Dibujo2.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_nWD8gSvCXFk/TNq6gHqHXII/AAAAAAAACo8/2K8XtVm9Akk/s320/Dibujo2.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Enjoy the learning!.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Related articles:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cs4fn.org/biology/evolutionsolution.php"&gt;The evolution solution revolution&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.edc.ncl.ac.uk/highlight/rhjanuary2007g01.php/"&gt;The basic algorithm for a GA&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://alt1040.com/2010/11/mona-lisa-algoritmos-geneticos-y-html5"&gt;Mona Lisa, algorithm Genetics&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Mapreduce"&gt;MapReduce&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://peterbraden.couchone.com/lisa/_design/lisa/index.html"&gt;The evolution of a smile&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/peterbraden/genetic-lisa/"&gt;Source code Genetic Lisa&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bitelia.com/2010/07/10-muy-entretenidos-experimentos-en-javascript-y-html5-para-hacer-en-tu-navegador"&gt;Fascinating experiments for JavaScript&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-3306197296237852977?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/3306197296237852977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/genetic-algorithms-ga.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/3306197296237852977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/3306197296237852977'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/genetic-algorithms-ga.html' title='Genetic Algorithms (GA)'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nWD8gSvCXFk/TNnagoPfxiI/AAAAAAAACos/qwkDM85fRHc/s72-c/mutation.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-6788627525814835583</id><published>2010-11-10T00:16:00.000+01:00</published><updated>2010-11-10T00:16:25.457+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Robotics'/><category scheme='http://www.blogger.com/atom/ns#' term='Videos'/><title type='text'>Outstanding videos of robots</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_nWD8gSvCXFk/TNnSNq_Sn7I/AAAAAAAACok/hfY_OeTYWiE/s1600/robot.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_nWD8gSvCXFk/TNnSNq_Sn7I/AAAAAAAACok/hfY_OeTYWiE/s200/robot.jpg" width="149" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;Due to  the recent contributions of the &lt;b&gt;scientific community&lt;/b&gt; about robots, here  are a collection of the best videos I found on the Web. &lt;/span&gt;&lt;span title=""&gt;It's amazing how technology improves and the number of mysteries that lie ahead. &lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;In  the following videos we can see the different robots built by &lt;b&gt;&lt;a href="http://www.bostondynamics.com/"&gt;Boston  Dynamics&lt;/a&gt;&lt;/b&gt; (for me the most outstanding are the &lt;b&gt;Big Dog&lt;/b&gt; and &lt;b&gt;Little Dog&lt;/b&gt;). &lt;/span&gt;&lt;span title=""&gt;And we can also find the new &lt;b&gt;Actroid-F&lt;/b&gt; presented recently in the &lt;a href="http://en.akihabaranews.com/68574/robot/actroid-f-makes-appearance-at-aist-lab-fair-wows-world"&gt;AIST Lab Fair&lt;/a&gt; and other different examples of robots.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;Boston Dynamics: Big Dog:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt; &lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/cHJJQ0zNNOM?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/cHJJQ0zNNOM?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;Boston Dynamics: Little Dog:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/nUQsRPJ1dYw?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/nUQsRPJ1dYw?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: small;"&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;Actroid-F in AIST Open Lab:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_nWD8gSvCXFk/TNnU35-Tu2I/AAAAAAAACoo/UAi_fwAF9xU/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="163" src="http://1.bp.blogspot.com/_nWD8gSvCXFk/TNnU35-Tu2I/AAAAAAAACoo/UAi_fwAF9xU/s400/1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/cFVlzUAZkHY?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/cFVlzUAZkHY?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;Transformer Robot:&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: center;"&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/STQ3nhXuuEM?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/STQ3nhXuuEM?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="" id="result_box" lang="en"&gt;&lt;span title=""&gt;I hope you enjoy the astonishing videos!&lt;/span&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/7022755517551007355-6788627525814835583?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/6788627525814835583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/outstanding-videos-of-robots.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6788627525814835583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6788627525814835583'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/outstanding-videos-of-robots.html' title='Outstanding videos of robots'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nWD8gSvCXFk/TNnSNq_Sn7I/AAAAAAAACok/hfY_OeTYWiE/s72-c/robot.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-5558839720125213036</id><published>2010-11-03T19:55:00.000+01:00</published><updated>2010-11-15T18:18:11.780+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='TED'/><category scheme='http://www.blogger.com/atom/ns#' term='Videos'/><title type='text'>David McCandless: The beauty of data visualization</title><content type='html'>&lt;div style="text-align: justify;"&gt;This is an interesting video from &lt;a href="http://www.ted.com/"&gt;TED&lt;/a&gt; talking about &lt;a href="http://www.ted.com/talks/lang/eng/david_mccandless_the_beauty_of_data_visualization.html"&gt;the beauty of data visualization&lt;/a&gt;. &lt;a href="http://www.ted.com/speakers/david_mccandless.html"&gt;David McCandless&lt;/a&gt; turns complex data sets (like worldwide military spending, media buzz, Facebook status updates) into beautiful, simple diagrams that tease out unseen patterns and connections. Good design, he suggests, is the best way to navigate information glut -- and it may just change the way we see the world.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="400" width="500"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt;&lt;param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/DavidMcCandless_2010G-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/DavidMcCandless-2010G.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=937&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=david_mccandless_the_beauty_of_data_visualization;year=2010;theme=the_creative_spark;theme=a_taste_of_tedglobal_2010;theme=new_on_ted_com;theme=presentation_innovation;theme=design_like_you_give_a_damn;event=TEDGlobal+2010;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="500" height="400" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talks/dynamic/DavidMcCandless_2010G-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/DavidMcCandless-2010G.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=937&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=david_mccandless_the_beauty_of_data_visualization;year=2010;theme=the_creative_spark;theme=a_taste_of_tedglobal_2010;theme=new_on_ted_com;theme=presentation_innovation;theme=design_like_you_give_a_damn;event=TEDGlobal+2010;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-5558839720125213036?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/5558839720125213036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/david-mccandless-beauty-of-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/5558839720125213036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/5558839720125213036'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/david-mccandless-beauty-of-data.html' title='David McCandless: The beauty of data visualization'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-7421299359089656580</id><published>2010-11-03T19:30:00.004+01:00</published><updated>2011-07-03T22:24:57.383+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><title type='text'>Presentation of the new Rad Studio XE and the new Visual Studio 2010 in Barcelona</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TNF75In8jtI/AAAAAAAACoQ/RVsueapLM70/s1600/eventosfall2010.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="112" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TNF75In8jtI/AAAAAAAACoQ/RVsueapLM70/s400/eventosfall2010.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;On November 24 will be held this seminar in Barcelona, which conveniently will show us the new features of the new &lt;b&gt;RAD Studio XE&lt;/b&gt;,&lt;b&gt; Delphi XE&lt;/b&gt;, &lt;b&gt;C++ Builder XE&lt;/b&gt;, &lt;b&gt;Delphi Prism XE&lt;/b&gt; and &lt;b&gt;RadPHP XE&lt;/b&gt;. I'll take this opportunity to learn in a practical way the latest additions, see examples of operation, contact other users, chat with the team and meet interesting &lt;a href="http://www.danysoft.com/"&gt;Danysoft&lt;/a&gt; promotions. &lt;b style="color: red;"&gt;I'm also attending&lt;/b&gt; the Visual Studio 2010 presentation which will show us practical themes that are awakening the community of developers. The new ASP.NET , the &lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93View%E2%80%93Controller"&gt;MVC&lt;/a&gt; Framework and the new features included in the &lt;a href="http://msdn.microsoft.com/es-es/library/ms735119%28VS.90%29.aspx"&gt;WCF&lt;/a&gt; (Windows Communication Foundation) will be the discussed topics.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;I'll see you there!.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related topics:&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.danysoft.com/danysoft/ven-a-conocer-el-nuevo-rad-studio-xe-en-barcelona.html"&gt;New Rad Studio XE in Barcelona.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.danysoft.com/danysoft/ven-a-conocer-las-novedades-de-visual-studio-2010-en-barcelona.html"&gt;New Visual Studio 2010 in Barcelona.&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-7421299359089656580?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/7421299359089656580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/presentation-of-new-rad-studio-xe-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7421299359089656580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7421299359089656580'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/11/presentation-of-new-rad-studio-xe-and.html' title='Presentation of the new Rad Studio XE and the new Visual Studio 2010 in Barcelona'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nWD8gSvCXFk/TNF75In8jtI/AAAAAAAACoQ/RVsueapLM70/s72-c/eventosfall2010.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-3478956550100436438</id><published>2010-10-21T11:29:00.003+02:00</published><updated>2010-11-02T09:17:42.181+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Unicode'/><title type='text'>Delphi Unicode Migration</title><content type='html'>&lt;div style="text-align: justify;"&gt;One of my colleagues found this interesting &lt;a href="http://edn.embarcadero.com/article/40307"&gt;document&lt;/a&gt; about migrating Delphi versions. I'm sure is very useful and this will help us to release a stable version before we move on to Delphi XE.&lt;/div&gt;&lt;br /&gt;Check out this SlideShare Presentation: &lt;br /&gt;&lt;div id="__ss_3371224" style="text-align: center; width: 477px;"&gt;&lt;div style="text-align: center;"&gt;&lt;b style="display: block; margin: 12px 0pt 4px;"&gt;&lt;a href="http://www.slideshare.net/KLM1984/delphi-unicode-migration" title="Delphi Unicode Migration"&gt;Delphi Unicode Migration&lt;/a&gt;&lt;/b&gt;&lt;object height="510" id="__sse3371224" width="477"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/doc_player.swf?doc=delphi-unicode-migration-100308185025-phpapp01&amp;stripped_title=delphi-unicode-migration&amp;userName=KLM1984" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse3371224" src="http://static.slidesharecdn.com/swf/doc_player.swf?doc=delphi-unicode-migration-100308185025-phpapp01&amp;stripped_title=delphi-unicode-migration&amp;userName=KLM1984" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="477" height="510"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="padding: 5px 0pt 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a href="http://www.slideshare.net/KLM1984"&gt;Kristy McHugh&lt;/a&gt;.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Other interesting document:&lt;b&gt; Reasons to migrate from Delphi 7 to Delphi 2009&lt;/b&gt;:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div id="__ss_1425883" style="width: 477px;"&gt;&lt;b style="display: block; margin: 12px 0pt 4px;"&gt;&lt;a href="http://www.slideshare.net/findling67/reasons-to-migrate-from-delphi-7-to-delphi-2009" title="Reasons to migrate from Delphi 7 to Delphi 2009"&gt;Reasons to migrate from Delphi 7 to Delphi 2009&lt;/a&gt;&lt;/b&gt;&lt;object height="510" id="__sse1425883" width="477"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/doc_player.swf?doc=reasonstomigratefromdelphi7todelphi2009whitepaper-090512183210-phpapp01&amp;stripped_title=reasons-to-migrate-from-delphi-7-to-delphi-2009&amp;userName=findling67" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse1425883" src="http://static.slidesharecdn.com/swf/doc_player.swf?doc=reasonstomigratefromdelphi7todelphi2009whitepaper-090512183210-phpapp01&amp;stripped_title=reasons-to-migrate-from-delphi-7-to-delphi-2009&amp;userName=findling67" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="477" height="510"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="padding: 5px 0pt 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a href="http://www.slideshare.net/findling67"&gt;Michael Findling&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-3478956550100436438?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/3478956550100436438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/delphi-unicode-migration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/3478956550100436438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/3478956550100436438'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/delphi-unicode-migration.html' title='Delphi Unicode Migration'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-6495865372688440976</id><published>2010-10-20T10:51:00.000+02:00</published><updated>2010-10-20T10:51:34.488+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>The conversation Prism</title><content type='html'>&lt;div style="text-align: justify;"&gt;The arts of listening, learning and sharing:&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;img height="368px" src="http://www.theconversationprism.com/size1024/" width="500px" /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Source&lt;/b&gt;:&amp;nbsp;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.theconversationprism.com/"&gt;www.theconversationprism.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-6495865372688440976?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/6495865372688440976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/conversation-prism.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6495865372688440976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6495865372688440976'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/conversation-prism.html' title='The conversation Prism'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2771760238459695361</id><published>2010-10-19T13:15:00.008+02:00</published><updated>2010-10-19T13:15:00.354+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AGILE'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programming'/><title type='text'>Clean Code: A Handbook of Agile Software Craftsmanship</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_nWD8gSvCXFk/TL1fag9EuKI/AAAAAAAACnw/APJMForVwf4/s1600/9780132350884.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_nWD8gSvCXFk/TL1fag9EuKI/AAAAAAAACnw/APJMForVwf4/s200/9780132350884.jpg" width="151" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;It recently arrived at my hands the book from Robert C. Martin: &lt;b&gt;Clean Code&lt;/b&gt;. Martin presents a revolutionary paradigm in his book: &lt;a href="http://rapidshare.com/files/368568082/Prentice.Hall.Clean.Code.A.Handbook.of.Agile.Software.Craftsmanship.Aug.2008.pdf"&gt;&lt;b&gt;A Handbook of Agile Software Craftsmanship&lt;/b&gt;&lt;/a&gt;. Martin has teamed up with his colleagues from Object Mentor to distil their best agile practice of cleaning code “on the fly” into a book that will instil within you the values of a software craftsman and make you a &lt;b&gt;better programmer&lt;/b&gt;-but only if you work at it.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Clean Code&lt;/b&gt; is divided into &lt;b&gt;three parts&lt;/b&gt;. The first describes the &lt;u&gt;principles, patterns, and practices&lt;/u&gt;&amp;nbsp;of writing clean code. The second part consists of several &lt;u&gt;case studies&lt;/u&gt; of increasing complexity. Each case study is an exercise in cleaning up code-of transforming a code base that has some problems into one that is sound and efficient. The third part is the &lt;u&gt;pay-off&lt;/u&gt;: a single chapter containing a list of heuristics and “smells” gathered while creating the case studies. The result is a knowledge base that describes the way we think when we write, read, and clean code. &lt;i&gt;Source: &lt;b&gt;&lt;a href="http://dotnetstory.softarchive.net/clean_code_a_handbook_of_agile_software_craftsmanship.239522.html"&gt;Clean Code Handbook&lt;/a&gt;&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="150" src="http://player.vimeo.com/video/13439458" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/13439458"&gt;Clean Code I: Arguments&lt;/a&gt; from &lt;a href="http://vimeo.com/user4296973"&gt;Mike C.&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="150" src="http://player.vimeo.com/video/13702091" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/13702091"&gt;Clean Code III: Functions&lt;/a&gt; from &lt;a href="http://vimeo.com/user4296973"&gt;Mike C.&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;b&gt;Related Links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://blog.justoaguilar.com/2010/08/clean-code-robert-c-martin/"&gt;Clean Code. Robert C. Martin&lt;/a&gt;.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://dotnetstory.softarchive.net/clean_code_a_handbook_of_agile_software_craftsmanship.239522.html"&gt;Clean Code Handbook&lt;/a&gt;.&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://vimeo.com/13702091"&gt;Clean Code Videos&lt;/a&gt;.&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2771760238459695361?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2771760238459695361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/clean-code-handbook-of-agile-software.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2771760238459695361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2771760238459695361'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/clean-code-handbook-of-agile-software.html' title='Clean Code: A Handbook of Agile Software Craftsmanship'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nWD8gSvCXFk/TL1fag9EuKI/AAAAAAAACnw/APJMForVwf4/s72-c/9780132350884.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-8289173288995011363</id><published>2010-10-18T21:36:00.000+02:00</published><updated>2010-10-18T21:36:00.423+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Utilities'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><title type='text'>Keeping track of a list by comparing it.</title><content type='html'>&lt;div style="text-align: justify;"&gt;Due to my &lt;b&gt;&lt;a href="http://www.4shared.com/file/8rvuZ8Wg/spwAgent.html"&gt;last application developed&lt;/a&gt;&lt;/b&gt;, I had to compare a list by scanning it and then present the results by including if any item was added or removed. For accomplish this task I've developed a little unit that is able to compare the list and show the results in a TMemo.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;pre class="brush: delphi"&gt;//@Author Jordi Coll&lt;br /&gt;//@2010&lt;br /&gt;&lt;br /&gt;unit uListCompare;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;    Classes, SysUtils;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;    TListCompare = class(TObject)&lt;br /&gt;        private&lt;br /&gt;            FList2: TStringList;&lt;br /&gt;            FList1: TStringList;&lt;br /&gt;            procedure SetList1(const Value: TStringList);&lt;br /&gt;            procedure SetList2(const Value: TStringList);&lt;br /&gt;        public&lt;br /&gt;            property List1: TStringList read FList1 write SetList1;&lt;br /&gt;            property List2: TStringList read FList2 write SetList2;&lt;br /&gt;            constructor Create();&lt;br /&gt;            destructor Destroy(); override;&lt;br /&gt;            procedure DumpList();&lt;br /&gt;            function ExistInList1(s: string): boolean;&lt;br /&gt;            function ExistInList2(s: string): boolean;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{ TListCompare }&lt;br /&gt;&lt;br /&gt;constructor TListCompare.Create;&lt;br /&gt;begin&lt;br /&gt;    FList1 := TStringList.Create;&lt;br /&gt;    FList2 := TStringList.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TListCompare.Destroy;&lt;br /&gt;begin&lt;br /&gt;    FreeAndNil(FList1);&lt;br /&gt;    FreeAndNil(FList2);&lt;br /&gt;    inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TListCompare.DumpList;&lt;br /&gt;var&lt;br /&gt;    i: Integer;&lt;br /&gt;begin&lt;br /&gt;    if List2.Count = 0 then&lt;br /&gt;    begin&lt;br /&gt;        for i := 0 to List1.Count - 1 do&lt;br /&gt;        begin&lt;br /&gt;            List2.Add(List1[i]);&lt;br /&gt;           log('New Item -&amp;gt;' + List1[i]);&lt;br /&gt;        end;&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;    begin&lt;br /&gt;        for i := 0 to List1.Count - 1 do&lt;br /&gt;        begin&lt;br /&gt;            if not ExistInList2(List1[i]) then&lt;br /&gt;                log('New Item -&amp;gt;' + List1[i]);&lt;br /&gt;        end;&lt;br /&gt;        for i := 0 to List2.Count - 1 do&lt;br /&gt;        begin&lt;br /&gt;            if not ExistInList1(List2[i]) then&lt;br /&gt;                log('Item doesn''t exist -&amp;gt;' + List2[i]);&lt;br /&gt;        end;&lt;br /&gt;        List2.Clear;&lt;br /&gt;        for i := 0 to List1.Count - 1 do&lt;br /&gt;            List2.Add(List1[i]);&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TListCompare.ExistInList1(s: string): boolean;&lt;br /&gt;var&lt;br /&gt;    found: boolean;&lt;br /&gt;    i: Integer;&lt;br /&gt;begin&lt;br /&gt;    i := 0;&lt;br /&gt;    found := false;&lt;br /&gt;    while (i &amp;lt; FList1.Count) and (not found) do&lt;br /&gt;    begin&lt;br /&gt;        found := FList1[i] = s;&lt;br /&gt;        inc(i);&lt;br /&gt;    end;&lt;br /&gt;    result := found;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TListCompare.ExistInList2(s: string): boolean;&lt;br /&gt;var&lt;br /&gt;    found: boolean;&lt;br /&gt;    i: Integer;&lt;br /&gt;begin&lt;br /&gt;    i := 0;&lt;br /&gt;    foundt := false;&lt;br /&gt;    while (i &amp;lt; FList2.Count) and (not found) do&lt;br /&gt;    begin&lt;br /&gt;        foundt := FList2[i] = s;&lt;br /&gt;        inc(i);&lt;br /&gt;    end;&lt;br /&gt;    result := found;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TListCompare.SetList1(const Value: TStringList);&lt;br /&gt;begin&lt;br /&gt;    FList1 := Value;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TListCompare.SetList2(const Value: TStringList);&lt;br /&gt;begin&lt;br /&gt;    FList2 := Value;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The only thing you have to do is fill the List1 with your items and then execute the procedure DumpList that will dump the information from List1 to List2 and will compare it to show the differences. This object can be called in a thread or a controlled loop.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-8289173288995011363?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/8289173288995011363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/keeping-track-of-list-by-comparing-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/8289173288995011363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/8289173288995011363'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/keeping-track-of-list-by-comparing-it.html' title='Keeping track of a list by comparing it.'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2732586475118722118</id><published>2010-10-18T21:18:00.009+02:00</published><updated>2010-10-21T11:16:38.396+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Utilities'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><title type='text'>Killing suspicious processes</title><content type='html'>&lt;div style="text-align: justify;"&gt;As a result of an experiment, we found out that one process was being run in my local machine by an &lt;b&gt;unknown user &lt;/b&gt;and this &lt;u&gt;trigger&lt;/u&gt; my curiosity to know more about this and which actions I could do to &lt;u&gt;fix it&lt;/u&gt;. Firstly, I decided to monitor the process and gather data from it by using some Delphi API libraries and secondly, build a little application to kill the process and keep a little log just in case. The application is called &lt;a href="http://www.4shared.com/file/8rvuZ8Wg/spwAgent.html"&gt;&lt;b&gt;Thundax Suspicious process watcher v1.1&lt;/b&gt;&lt;/a&gt; and it's able to filter processes by &lt;b&gt;unknown/known&lt;/b&gt; users and apply actions to them.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TLxVcPP9KTI/AAAAAAAACno/tnU6CmSyZ2Y/s1600/thun.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TLxVcPP9KTI/AAAAAAAACno/tnU6CmSyZ2Y/s400/thun.bmp" width="311" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Once the application is found (by the process to inspect text box) the utility kills the process and shows the resulted information. We can also force the &lt;b&gt;killing system&lt;/b&gt; to the known processes and use it to &lt;u&gt;force the end&lt;/u&gt; of and application by filtering it by &lt;b&gt;name&lt;/b&gt; and &lt;b&gt;user name&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In the next picture you can notice that I've terminated the execution of the &lt;b&gt;notepad.exe&lt;/b&gt; by simply adding it name and process user name (me).&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TLxXgwz0WeI/AAAAAAAACns/zgTw0U6XvMk/s1600/thun2.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TLxXgwz0WeI/AAAAAAAACns/zgTw0U6XvMk/s400/thun2.bmp" width="311" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The application &lt;b&gt;core&lt;/b&gt; is based on &lt;u&gt;two parts&lt;/u&gt;, the first one that is able to &lt;b&gt;search for the applications that are being run&lt;/b&gt; in your machine and the second one that is able to &lt;b&gt;kill a process by its PID&lt;/b&gt;. Here you can get the implemented code:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #990000; text-align: justify;"&gt;&lt;b&gt;Get process list:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;procedure ProcessList();&lt;br /&gt;var&lt;br /&gt;    hProcSnap: THandle;&lt;br /&gt;    pe32: TProcessEntry32;&lt;br /&gt;    Domain, User: string;&lt;br /&gt;    listItem: TListItem;&lt;br /&gt;begin&lt;br /&gt;    hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);&lt;br /&gt;    if hProcSnap = INVALID_HANDLE_VALUE then&lt;br /&gt;        Exit;&lt;br /&gt;    pe32.dwSize := Sizeof(ProcessEntry32);&lt;br /&gt;    ListView1.Clear;&lt;br /&gt;    listCompare.List1.Clear;&lt;br /&gt;    if Process32First(hProcSnap, pe32) = True then&lt;br /&gt;        while Process32Next(hProcSnap, pe32) = True do&lt;br /&gt;        begin&lt;br /&gt;            if GetUserAndDomainFromPID(pe32.th32ProcessID, User, Domain) then&lt;br /&gt;            begin&lt;br /&gt;                if RadioButton2.Checked then&lt;br /&gt;                begin&lt;br /&gt;                    listItem := ListView1.Items.Add;&lt;br /&gt;                    listItem.Caption := pe32.szExeFile;&lt;br /&gt;                    listItem.SubItems.Add(IntToStr(pe32.th32ProcessID));&lt;br /&gt;                    listItem.SubItems.Add(User);&lt;br /&gt;                    listItem.SubItems.Add(Domain);&lt;br /&gt;                    listCompare.List1.Add(pe32.szExeFile);&lt;br /&gt;                    if AnsiUpperCase(pe32.szExeFile) = AnsiUpperCase(Edit2.text) then&lt;br /&gt;                    begin&lt;br /&gt;                        if Edit3.text &amp;lt;&amp;gt; '' then&lt;br /&gt;                        begin&lt;br /&gt;                            if AnsiUpperCase(User) = AnsiUpperCase(Edit3.text) then&lt;br /&gt;                            begin&lt;br /&gt;                                Log('Application founded -&amp;gt;' + AnsiUpperCase(Edit2.text));&lt;br /&gt;                                if CheckBox3.Checked then&lt;br /&gt;                                begin&lt;br /&gt;                                    KillProcess(pe32.th32ProcessID);&lt;br /&gt;                                    Sleep(300);&lt;br /&gt;                                    Log('Application killed -&amp;gt;' + AnsiUpperCase(Edit2.text));&lt;br /&gt;                                end&lt;br /&gt;                            end;&lt;br /&gt;                        end&lt;br /&gt;                        else&lt;br /&gt;                        begin&lt;br /&gt;                            Log('Application founded -&amp;gt;' + AnsiUpperCase(Edit2.text));&lt;br /&gt;                            if CheckBox3.Checked then&lt;br /&gt;                            begin&lt;br /&gt;                                KillProcess(pe32.th32ProcessID);&lt;br /&gt;                                Sleep(300);&lt;br /&gt;                                Log('Application killed -&amp;gt;' + AnsiUpperCase(Edit2.text));&lt;br /&gt;                            end&lt;br /&gt;                        end;&lt;br /&gt;&lt;br /&gt;                    end;&lt;br /&gt;                end&lt;br /&gt;            end&lt;br /&gt;            else&lt;br /&gt;            begin&lt;br /&gt;                if RadioButton1.Checked then&lt;br /&gt;                begin&lt;br /&gt;                    // Suspicious Items&lt;br /&gt;                    listItem := ListView1.Items.Add;&lt;br /&gt;                    listItem.Caption := pe32.szExeFile;&lt;br /&gt;                    listItem.SubItems.Add(IntToStr(pe32.th32ProcessID));&lt;br /&gt;                    listItem.SubItems.Add('UNKNOW');&lt;br /&gt;                    listItem.SubItems.Add('UNKNOW');&lt;br /&gt;                    listCompare.List1.Add(pe32.szExeFile);&lt;br /&gt;                    if AnsiUpperCase(pe32.szExeFile) = AnsiUpperCase(Edit1.text) then&lt;br /&gt;                    begin&lt;br /&gt;                        Log('Application founded -&amp;gt;' + AnsiUpperCase(Edit1.text));&lt;br /&gt;                        if CheckBox2.Checked then&lt;br /&gt;                        begin&lt;br /&gt;                            KillProcess(pe32.th32ProcessID);&lt;br /&gt;                            Sleep(300);&lt;br /&gt;                            Log('Application killed -&amp;gt;' + AnsiUpperCase(Edit1.text));&lt;br /&gt;                        end&lt;br /&gt;                    end;&lt;br /&gt;                end&lt;br /&gt;            end;&lt;br /&gt;            Application.ProcessMessages;&lt;br /&gt;        end;&lt;br /&gt;    CloseHandle(hProcSnap);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function GetUserAndDomainFromPID(ProcessId: DWORD; var User, Domain: string): Boolean;&lt;br /&gt;var&lt;br /&gt;    hToken: THandle;&lt;br /&gt;    cbBuf: Cardinal;&lt;br /&gt;    ptiUser: PTOKEN_USER;&lt;br /&gt;    snu: SID_NAME_USE;&lt;br /&gt;    ProcessHandle: THandle;&lt;br /&gt;    UserSize, DomainSize: DWORD;&lt;br /&gt;    bSuccess: Boolean;&lt;br /&gt;begin&lt;br /&gt;    Result := false;&lt;br /&gt;    ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, false, ProcessId);&lt;br /&gt;    if ProcessHandle &amp;lt;&amp;gt; 0 then&lt;br /&gt;    begin&lt;br /&gt;        if OpenProcessToken(ProcessHandle, TOKEN_QUERY, hToken) then&lt;br /&gt;        begin&lt;br /&gt;            bSuccess := GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf);&lt;br /&gt;            ptiUser := nil;&lt;br /&gt;            while (not bSuccess) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) do&lt;br /&gt;            begin&lt;br /&gt;                ReallocMem(ptiUser, cbBuf);&lt;br /&gt;                bSuccess := GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, cbBuf);&lt;br /&gt;            end;&lt;br /&gt;            CloseHandle(hToken);&lt;br /&gt;&lt;br /&gt;            if not bSuccess then&lt;br /&gt;            begin&lt;br /&gt;                Exit;&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;            UserSize := 0;&lt;br /&gt;            DomainSize := 0;&lt;br /&gt;            LookupAccountSid(nil, ptiUser.User.Sid, nil, UserSize, nil, DomainSize, snu);&lt;br /&gt;            if (UserSize &amp;lt;&amp;gt; 0) and (DomainSize &amp;lt;&amp;gt; 0) then&lt;br /&gt;            begin&lt;br /&gt;                SetLength(User, UserSize);&lt;br /&gt;                SetLength(Domain, DomainSize);&lt;br /&gt;                if LookupAccountSid(nil, ptiUser.User.Sid, PChar(User), UserSize, PChar(Domain), DomainSize, snu) then&lt;br /&gt;                begin&lt;br /&gt;                    Result := True;&lt;br /&gt;                    User := StrPas(PChar(User));&lt;br /&gt;                    Domain := StrPas(PChar(Domain));&lt;br /&gt;                end;&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;            if bSuccess then&lt;br /&gt;            begin&lt;br /&gt;                FreeMem(ptiUser);&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;        CloseHandle(ProcessHandle);&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b style="color: #990000;"&gt;Kill process by PID&lt;/b&gt;:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;procedure KillProcess(pid: integer);&lt;br /&gt;var&lt;br /&gt;    h: THandle;&lt;br /&gt;begin&lt;br /&gt;    try&lt;br /&gt;        h := OpenProcess(PROCESS_TERMINATE, false, pid);&lt;br /&gt;        try&lt;br /&gt;            if h &amp;lt;&amp;gt; 0 then&lt;br /&gt;                TerminateProcess(h, 0);&lt;br /&gt;        finally&lt;br /&gt;            CloseHandle(h);&lt;br /&gt;        end;&lt;br /&gt;    except&lt;br /&gt;        ShowMessage('Error');&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Let me know if you have any doubt about the program or any improvement!.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.madshi.net/"&gt;madshi.net&lt;/a&gt;&lt;b&gt;.&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_20081003.html"&gt;Terminate process&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2732586475118722118?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2732586475118722118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/killing-suspicious-processes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2732586475118722118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2732586475118722118'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/killing-suspicious-processes.html' title='Killing suspicious processes'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nWD8gSvCXFk/TLxVcPP9KTI/AAAAAAAACno/tnU6CmSyZ2Y/s72-c/thun.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-6401753423290138972</id><published>2010-10-01T19:33:00.010+02:00</published><updated>2010-10-01T19:33:00.127+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Entrepreneur'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Entrepreneurs can change the world</title><content type='html'>&lt;div style="text-align: justify;"&gt;A very inspiring video!.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/T6MhAwQ64c0?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/T6MhAwQ64c0?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-6401753423290138972?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/6401753423290138972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/entrepreneurs-can-change-world.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6401753423290138972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6401753423290138972'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/entrepreneurs-can-change-world.html' title='Entrepreneurs can change the world'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-1485611574597031112</id><published>2010-10-01T19:24:00.001+02:00</published><updated>2010-10-01T19:24:00.329+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><title type='text'>Working with Microsoft Excel (.xlsx) files in Delphi 2010</title><content type='html'>&lt;div style="text-align: justify;"&gt;Due to the improvement of the new format of &lt;b&gt;Microsoft office 2007&lt;/b&gt; files (&lt;i&gt;.docx, .xlsx based on xml&lt;/i&gt;) the way we use to access this documents has changed. Instead of using &lt;a href="http://en.wikipedia.org/wiki/Object_Linking_and_Embedding"&gt;&lt;b&gt;OLE&lt;/b&gt;&lt;/a&gt; we can use the power of Delphi and the &lt;i&gt;type library Borland&lt;/i&gt; (&lt;a href="http://en.wikipedia.org/wiki/Component_Object_Model"&gt;&lt;b&gt;TLB&lt;/b&gt;&lt;/a&gt; Files).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In this article we'll talk about how to create the &lt;i&gt;TLB files&lt;/i&gt; and the code we need to access the .Excel (.xlsx file) of the example I've created.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;First of all, we need to import the components via -&amp;gt; &lt;b&gt;Component&lt;/b&gt; -&amp;gt;&lt;b&gt; Import a Type Library&lt;/b&gt;. Once we are there, we need to select the "&lt;b&gt;Microsoft Excel 12.0 Object Library&lt;/b&gt;" and go on with the import. Mark the "&lt;b&gt;Generate component wrappers&lt;/b&gt;" check-box and finally &lt;u&gt;&lt;b&gt;add the component to&lt;/b&gt;&lt;/u&gt; the working unit. This will generate the &lt;b&gt;Excel_TLB.pas&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Once we have integrated this file into our project, we need to go on with importing the second component: &lt;b&gt;Component&lt;/b&gt; -&amp;gt; &lt;b&gt;Import a Type Library&lt;/b&gt; and then install the "&lt;b&gt;Microsoft Office 12.0 Object Library&lt;/b&gt;". This will generate the &lt;b&gt;Office_TLB.pas&lt;/b&gt; (this unit is necessary because&lt;u&gt; it's used&lt;/u&gt; by &lt;b&gt;Excel_TLB.pas&lt;/b&gt;).&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TKX_qxCemiI/AAAAAAAACng/YQJr_FApnfo/s1600/exce.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TKX_qxCemiI/AAAAAAAACng/YQJr_FApnfo/s1600/exce.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: purple; text-align: justify;"&gt;&lt;u&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;1 - Knowing the number and name of the sheets of the Workbook.&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The following code will open a excel file and will load all the sheets into a combo box. Even though it represents a small portion of code, the library is quite complicated to use.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;procedure TForm1.LoadCombo();&lt;br /&gt;var&lt;br /&gt;    XLSXReader: Excel_TLB.TExcelApplication;&lt;br /&gt;    newWorkbook: Excel_TLB._Workbook;&lt;br /&gt;    objXLS: Excel_TLB.TExcelWorkbook;&lt;br /&gt;    objSheet: Excel_TLB.TExcelWorksheet;&lt;br /&gt;    i: Integer;&lt;br /&gt;begin&lt;br /&gt;    newWorkbook := XLSXReader.Workbooks.Add('C:\book1.xlsx', GetUserDefaultLCID);&lt;br /&gt;    objXLS := Excel_TLB.TExcelWorkbook.Create(nil);&lt;br /&gt;    objXLS.ConnectTo(newWorkbook);&lt;br /&gt;    objSheet := Excel_TLB.TExcelWorksheet.Create(nil);&lt;br /&gt;    for i := 1 to objXLS.Worksheets.count do&lt;br /&gt;    begin&lt;br /&gt;        objSheet.ConnectTo(objXLS.Worksheets[i] as _Worksheet);&lt;br /&gt;        ComboBox1.Items.Add(objSheet.Name);&lt;br /&gt;    end;&lt;br /&gt;    newWorkbook.Close(false, EmptyParam, EmptyParam, GetUserDefaultLCID);&lt;br /&gt;    FreeAndNil(objXLS);&lt;br /&gt;    FreeAndNil(objSheet);&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: purple; text-align: justify;"&gt;&lt;u&gt;&lt;b&gt;2 - Accessing to Excel fields.&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The following example will get the objSheet and will get all the data from the sheet and will dump into a dataset to display then the result into a grid.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="brush: delphi"&gt;procedure TForm1.Open(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;    XLSXReader: Excel_TLB.TExcelApplication;&lt;br /&gt;    newWorkbook: Excel_TLB._Workbook;&lt;br /&gt;    objXLS: Excel_TLB.TExcelWorkbook;&lt;br /&gt;    objSheet: Excel_TLB.TExcelWorksheet;&lt;br /&gt;    objWrapper: TExcelWrapper;&lt;br /&gt;begin&lt;br /&gt;    newWorkbook := XLSXReader.Workbooks.Add('C:\book1.xlsx', GetUserDefaultLCID);&lt;br /&gt;    objXLS := Excel_TLB.TExcelWorkbook.Create(nil);&lt;br /&gt;    objXLS.ConnectTo(newWorkbook);&lt;br /&gt;    objSheet := Excel_TLB.TExcelWorksheet.Create(nil);&lt;br /&gt;    objSheet.ConnectTo(objXLS.Worksheets['sheet1'] as _Worksheet);&lt;br /&gt;    objWrapper := TExcelWrapper.Create(objSheet);&lt;br /&gt;    if cdsExcel.Active then&lt;br /&gt;        cdsExcel.Close;&lt;br /&gt;    objManager.FillDataSet(cdsExcel);&lt;br /&gt;    cdsExcel.Open;&lt;br /&gt;    cdsExcel.First;&lt;br /&gt;    newWorkbook.Close(false, EmptyParam, EmptyParam, GetUserDefaultLCID);&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Then the code for getting the data from the sheet:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;procedure TExcelWrapper.FillDataSet(var cdsExcel: TAEClientDataSet);&lt;br /&gt;var&lt;br /&gt;    count: Integer;&lt;br /&gt;    i: Integer;&lt;br /&gt;    bFinished, correct: boolean;&lt;br /&gt;    Value: String;&lt;br /&gt;begin&lt;br /&gt;    if Assigned(FSheet) then&lt;br /&gt;    begin&lt;br /&gt;        try&lt;br /&gt;            cdsExcel.DisableControls;&lt;br /&gt;            count := 0;&lt;br /&gt;            i := 2;&lt;br /&gt;            LastModule := '';&lt;br /&gt;            bFinished := false;&lt;br /&gt;            while not bFinished do&lt;br /&gt;            begin&lt;br /&gt;                Value := FSheet.Cells.Item[i, 1];&lt;br /&gt;                if Value = '' then&lt;br /&gt;                    count := count + 1&lt;br /&gt;                else&lt;br /&gt;                begin&lt;br /&gt;                    count := 0;&lt;br /&gt;                    cdsExcel.Append;&lt;br /&gt;                    cdsExcel.FieldByName('Column1').AsString := FSheet.Cells.Item[i, 1];&lt;br /&gt;                    cdsExcel.FieldByName('Column2').AsString := FSheet.Cells.Item[i, 2];&lt;br /&gt;                    cdsExcel.FieldByName('Column3').AsString := FSheet.Cells.Item[i, 3];&lt;br /&gt;                end;&lt;br /&gt;                if count &amp;gt; 2 then&lt;br /&gt;                    bFinished := true;&lt;br /&gt;                i := i + 1;&lt;br /&gt;            end;&lt;br /&gt;            cdsExcel.Post;&lt;br /&gt;        finally&lt;br /&gt;            cdsExcel.EnableControls;&lt;br /&gt;        end;&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div style="background-color: white; color: purple;"&gt;&lt;u&gt;&lt;b&gt;3 - Things to take into account.&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;You need &lt;u&gt;to remember&lt;/u&gt; that the library creates an instance of &lt;b&gt;Excel application&lt;/b&gt;, and you &lt;u&gt;must close&lt;/u&gt; all the opened connections using the &lt;b style="color: blue;"&gt;Close&lt;/b&gt; procedure.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;newWorkbook.Close(false, EmptyParam, EmptyParam, GetUserDefaultLCID);&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush: delphi"&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Related links:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://powerdelphi.wikispaces.com/Exportar+Query+a+Excel"&gt;http://powerdelphi.wikispaces.com/Exportar+Query+a+Excel&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-1485611574597031112?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/1485611574597031112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/working-with-microsoft-excel-xlsx-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/1485611574597031112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/1485611574597031112'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/10/working-with-microsoft-excel-xlsx-files.html' title='Working with Microsoft Excel (.xlsx) files in Delphi 2010'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nWD8gSvCXFk/TKX_qxCemiI/AAAAAAAACng/YQJr_FApnfo/s72-c/exce.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-7186664517553048362</id><published>2010-09-30T20:37:00.002+02:00</published><updated>2010-09-30T20:37:00.792+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AGILE'/><title type='text'>AGILE 2010: Present and Future of Agilism in Spain</title><content type='html'>&lt;div style="text-align: justify;"&gt;I've post the last video of AGILE Spain conference held in July 2010, where very interesting topics were discussed. I'm sorry because it's in Spanish, but I hope you enjoy it!.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="390" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/fpOSFR3waHA&amp;hl=es_ES&amp;feature=player_embedded&amp;version=3"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/fpOSFR3waHA&amp;hl=es_ES&amp;feature=player_embedded&amp;version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="390"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-7186664517553048362?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/7186664517553048362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/09/agile-2010-present-and-future-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7186664517553048362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7186664517553048362'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/09/agile-2010-present-and-future-of.html' title='AGILE 2010: Present and Future of Agilism in Spain'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-7341354911160764169</id><published>2010-09-30T20:02:00.006+02:00</published><updated>2010-09-30T20:02:00.205+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Reflexion time - Adaptation is the Key</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_nWD8gSvCXFk/TKRLgXu0o4I/AAAAAAAACnY/xxs-YA6IS_Q/s1600/reflexion.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://4.bp.blogspot.com/_nWD8gSvCXFk/TKRLgXu0o4I/AAAAAAAACnY/xxs-YA6IS_Q/s200/reflexion.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;First of all, I would like to thank all the &lt;b&gt;positive comments&lt;/b&gt; I've received for my &lt;a href="http://www.thundaxsoftware.blogspot.com/"&gt;Blog&lt;/a&gt;. I'm truly happy because they inspire me to keep publishing interesting topics related with Delphi, Technology and Science. I can see that the page is widely visited throughout the world and the rate of daily visitors is quite good, but the users don't leave any feedback and sometimes this is a little disappointing. Anyway, I'll keep writing and doing my own research in order to improve myself and sharing my knowledge to the world.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Now&lt;/b&gt; I'm immersed on a &lt;i&gt;reflexivity's period&lt;/i&gt;, thinking about &lt;b&gt;job opportunities&lt;/b&gt;, new projects and &lt;b&gt;new interesting articles&lt;/b&gt; to publish. This month I've been working on new interesting projects, migrating versions from &lt;i&gt;Delphi 2007&lt;/i&gt; to &lt;i&gt;Delphi 2010&lt;/i&gt;, doing a big rewrite of code due to its internal changes with &lt;a href="http://www.indyproject.org/sockets/download/Files/Indy10.DE.aspx"&gt;&lt;b&gt;Indy10&lt;/b&gt;&lt;/a&gt; and other new features like &lt;a href="http://stackoverflow.com/questions/2138800/delphi-2010-generics-of-generics"&gt;generics&lt;/a&gt; and &lt;a href="http://thundaxsoftware.blogspot.com/2009/09/mas-sobre-la-rtti-de-delphi-2010.html"&gt;working with parameters&lt;/a&gt; (I'm eager to test the new &lt;b&gt;Delphi XE&lt;/b&gt;, but as soon as I finish the other projects). I've been as well working on a new system to improve the usability of working with &lt;b&gt;Microsoft Office 2007&lt;/b&gt; files such as &lt;b&gt;Excel files&lt;/b&gt; (&lt;b&gt;.xlsx&lt;/b&gt;) and &lt;b&gt;Word files&lt;/b&gt; (&lt;b&gt;.docx&lt;/b&gt;),&amp;nbsp; and some other projects as a &lt;b&gt;photographer&lt;/b&gt; doing a catalogue for a company!. As you can see this month has been pretty hectic and I never stop running. I have other projects in mind that I need to put into gear, but I need some time to meditate about them, but I'll keep you posted!.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I've been providing services as a &lt;b&gt;technological consultant&lt;/b&gt; to some companies in order to improve their &lt;b&gt;IT departments&lt;/b&gt; in a wide range of aspects like: &lt;i&gt;security, collaborative work and documentation&lt;/i&gt;. And all these experiences have been very rewarded to put into practise all the things learned during the last three years.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;With all of this, I just want to motivate &lt;b&gt;you&lt;/b&gt;, and remember to do &lt;b&gt;what you love&lt;/b&gt; to achieve all what you &lt;b&gt;want&lt;/b&gt;. I've been following this simple rule and everything is working fine. I can't complain of anything!.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Here you can see a very interesting video showing the power of adaptation:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/KMT1FLzEn9I?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/KMT1FLzEn9I?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Don't hesitate to comment in the blog and feel free to contact me through the &lt;a href="http://www.thundaxsoftware.org/Contacto.html"&gt;web&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If you have time, you can take a look at my &lt;a href="http://www.thundaxsoftware.org/portfolio/"&gt;portfolio&lt;/a&gt; and check out my passion for photography!. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-7341354911160764169?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/7341354911160764169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/09/reflexion-time-adaptation-is-key.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7341354911160764169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/7341354911160764169'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/09/reflexion-time-adaptation-is-key.html' title='Reflexion time - Adaptation is the Key'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nWD8gSvCXFk/TKRLgXu0o4I/AAAAAAAACnY/xxs-YA6IS_Q/s72-c/reflexion.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2217341038198625326</id><published>2010-09-16T19:12:00.003+02:00</published><updated>2010-10-01T10:01:34.988+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kanban'/><category scheme='http://www.blogger.com/atom/ns#' term='AGILE'/><title type='text'>LeanKit Kanban</title><content type='html'>&lt;div style="text-align: justify;"&gt;This week I've been working with the &lt;a href="http://leankitkanban.com/"&gt;LeanKit Kanban&lt;/a&gt;, a very interesting approach for using &lt;a href="http://en.wikipedia.org/wiki/Kanban"&gt;Kanban&lt;/a&gt; boards in Agile development. All of you know about my interests with the Agile approach, and I think that this interesting and &lt;b&gt;free&lt;/b&gt; (&lt;i style="color: red;"&gt;limited&lt;/i&gt;) tool will help you to &lt;b&gt;keep track&lt;/b&gt; of your daily work.&lt;br /&gt;&lt;br /&gt;Here you can see a mock up of my kanban board:&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_nWD8gSvCXFk/TKSuPzR21PI/AAAAAAAACnc/8vjBDn0EdDI/s1600/Dibujo1.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://2.bp.blogspot.com/_nWD8gSvCXFk/TKSuPzR21PI/AAAAAAAACnc/8vjBDn0EdDI/s400/Dibujo1.bmp" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In the &lt;a href="http://jesseliberty.com/"&gt;Jesse Liberty&lt;/a&gt; blog, you can find a very interesting &lt;b&gt;description&lt;/b&gt; of the &lt;a href="http://jesseliberty.com/2010/09/14/how-i-learned-to-stop-worrying-and-master-project-management/"&gt;Kanban&lt;/a&gt; tool:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;i style="color: #999999;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;What Kanban Does For You&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What is not obvious in looking at the board is how quickly it reveals bottlenecks, where I’m wasting time, and how to be as effective as possible.&amp;nbsp; The fact that it is all very visual, that you are moving these cards around and can see at a glance all the relevant information, makes it very easy to see what is stuck, and what is moving nicely.&lt;br /&gt;&lt;br /&gt;LeanKit Kanban has a number of features that I don’t personally use, but would have killed for in previous projects, such as advanced analytics that include diagrams for Cycle time, cumulative flow, process efficiency, work distribution and more.&amp;nbsp; The analytics allow a team to answer such critical questions&amp;nbsp; as “what is holding the project back?” and ”when will this item be ready?” with high confidence.&lt;br /&gt;&lt;br /&gt;I do use the notification capabilities, which turns what is usually a “polling” exercise in frustration into an “interrupt-driven” management approach; much better.&lt;br /&gt;&lt;br /&gt;The bottom line, for me, though, is that each “card” carries its entire history, its description, its priority, its due date and everything else I need to know about a sub-feature.&amp;nbsp; That is very clean and it fits well with the way I work.&lt;/i&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="text-align: right;"&gt;&lt;b style="color: #666666;"&gt;Jesse Liberty&lt;/b&gt;. &lt;/div&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2217341038198625326?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2217341038198625326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/09/leankit-kanban.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2217341038198625326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2217341038198625326'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/09/leankit-kanban.html' title='LeanKit Kanban'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nWD8gSvCXFk/TKSuPzR21PI/AAAAAAAACnc/8vjBDn0EdDI/s72-c/Dibujo1.bmp' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-2435680200068550832</id><published>2010-09-08T11:56:00.000+02:00</published><updated>2010-09-08T11:56:13.775+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Science'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Symphony of Science</title><content type='html'>&lt;div style="text-align: justify;"&gt;The Poetry of Reality is a music video that gathers sentences of 12 scientists and science enthusiasts, including Carl Sagan, Stephen Hawking, Richard Dawkins and Richard Feynman and others. There is real poetry in the real world and science is the poetry of reality.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/9Cd36WJ79z4&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=es_ES&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/9Cd36WJ79z4&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=es_ES&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;b&gt;Source:&lt;/b&gt; &lt;a href="http://www.lareserva.com/"&gt;La reserva.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-2435680200068550832?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/2435680200068550832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/09/symphony-of-science.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2435680200068550832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/2435680200068550832'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/09/symphony-of-science.html' title='Symphony of Science'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-4403722617336114926</id><published>2010-08-20T17:59:00.000+02:00</published><updated>2011-07-03T22:24:57.339+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Delphi XE'/><title type='text'>Delphi XE preview videos</title><content type='html'>&lt;div style="text-align: justify;"&gt;Here you can see the latest videos from embarcadero talking about the new version of Delphi called &lt;b&gt;Delphi XE&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;First preview:&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JJi9WsnHKiw&amp;rel=0&amp;border=1&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/JJi9WsnHKiw&amp;rel=0&amp;border=1&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;this second preview covers some of the third party tools that will be part of Delphi XE:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;FinalBuilder, used to manage the build process&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;The ability to invoke IDE operations (like audits, metrics, code formatting) from the command line, and so invoke them from external tools like FinalBuilder&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;The integrated version of profiling tool AQTime&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;The logging support provided by CodeSite, a nice tool written by Ray Konopka.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/kO63NrWxE8E&amp;rel=0&amp;border=1&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/kO63NrWxE8E&amp;rel=0&amp;border=1&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Source:&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.marcocantu.com/blog/delphi_xe_first_video.html%20"&gt;http://blog.marcocantu.com/blog/delphi_xe_first_video.html &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.marcocantu.com/blog/delphi_xe_second_video.html%20"&gt;http://blog.marcocantu.com/blog/delphi_xe_second_video.html &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-4403722617336114926?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/4403722617336114926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/08/delphi-xe-preview-videos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4403722617336114926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/4403722617336114926'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/08/delphi-xe-preview-videos.html' title='Delphi XE preview videos'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-6411422136593039189</id><published>2010-08-19T20:45:00.002+02:00</published><updated>2010-08-19T20:45:00.880+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Google success!</title><content type='html'>&lt;div style="text-align: justify;"&gt;This is an interesting Google video: &lt;b style="color: blue;"&gt;&lt;i&gt;Inside the Mind of Google: "Most successful company in the history of the world"&lt;/i&gt;&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/XZ5KJeee10I?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/XZ5KJeee10I?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;I hope you enjoy it!.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7022755517551007355-6411422136593039189?l=thundaxsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thundaxsoftware.blogspot.com/feeds/6411422136593039189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/08/google-success.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6411422136593039189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022755517551007355/posts/default/6411422136593039189'/><link rel='alternate' type='text/html' href='http://thundaxsoftware.blogspot.com/2010/08/google-success.html' title='Google success!'/><author><name>Jordi Corbilla</name><uri>https://profiles.google.com/117780965421418156555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-2jrT2H0x6To/AAAAAAAAAAI/AAAAAAAAAAA/1xJJi5pArfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022755517551007355.post-4525664938089716063</id><published>2010-08-19T19:37:00.002+02:00</published><updated>2010-08-19T19:37:00.690+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='TBookMark'/><title type='text'>TBookMark problem with Delphi 2010 and TList</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_nWD8gSvCXFk/TG02_qeoRkI/AAAAAAAACmc/NAsnUVqdN0g/s1600/delphi.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1e
