<?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-12185523</id><updated>2012-01-07T14:44:20.239-08:00</updated><category term='v'/><title type='text'>vox populi vox dei</title><subtitle type='html'>Personally I’ve always appreciated the emphasis on Populi versus Dei especially considering tumultuous, fractious and socialist history of Europe. But what it expresses best is the materialistic notion that perfection, i.e. God, is possible from the voice of the people and that truth resides in each and everyone of us. So this is my food for thoughts blog article about software technology from C/C++/C# to PHP/JAVA Android and iOs.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default?start-index=101&amp;max-results=100'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>224</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-12185523.post-2303521699392052764</id><published>2012-01-07T14:43:00.000-08:00</published><updated>2012-01-07T14:44:20.248-08:00</updated><title type='text'>Marketing Technology behind $35 billion in holiday 2011 ecommerce sales</title><content type='html'>Great article about Web Analytics&lt;br /&gt;&lt;br /&gt;http://www.darrenherman.com/2011/12/30/marketing-technology-behind-35-billion-in-holiday-2011-ecommerce-sales/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-2303521699392052764?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/2303521699392052764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=2303521699392052764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/2303521699392052764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/2303521699392052764'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2012/01/marketing-technology-behind-35-billion.html' title='Marketing Technology behind $35 billion in holiday 2011 ecommerce sales'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-8684764803302989719</id><published>2011-12-13T14:14:00.001-08:00</published><updated>2011-12-13T14:14:56.504-08:00</updated><title type='text'>Create Bootable USB Windows 7</title><content type='html'>bootable USB guide, here we assume that you are using either Vista or Windows 7 to create a bootable USB.&lt;br /&gt;&lt;br /&gt;1. Insert your USB (4GB+ preferable) stick to the system and backup all the data from the USB as we are going to format the USB to make it as bootable.&lt;br /&gt;&lt;br /&gt;2. Open elevated Command Prompt. To do this, type in CMD in Start menu search field and hit Ctrl + Shift + Enter. Alternatively, navigate to Start &gt; All programs &gt;Accessories &gt; right click on Command Prompt and select run as administrator.&lt;br /&gt;&lt;br /&gt;3. When the Command Prompt opens, enter the following command:&lt;br /&gt;&lt;br /&gt;DISKPART and hit enter.&lt;br /&gt;&lt;br /&gt;LIST DISK and hit enter.&lt;br /&gt;&lt;br /&gt;Once you enter the LIST DISK command, it will show the disk number of your USB drive. In the below image my USB drive disk no is Disk 1.&lt;br /&gt;&lt;br /&gt;4. In this step you need to enter all the below commands one by one and hit enter. As these commands are self explanatory, you can easily guess what these commands do.&lt;br /&gt;&lt;br /&gt;SELECT DISK 1 (Replace DISK 1 with your disk number)&lt;br /&gt;&lt;br /&gt;CLEAN&lt;br /&gt;&lt;br /&gt;CREATE PARTITION PRIMARY&lt;br /&gt;&lt;br /&gt;SELECT PARTITION 1&lt;br /&gt;&lt;br /&gt;ACTIVE&lt;br /&gt;&lt;br /&gt;FORMAT FS=NTFS&lt;br /&gt;&lt;br /&gt;(Format process may take few seconds)&lt;br /&gt;ASSIGN&lt;br /&gt;&lt;br /&gt;EXIT&lt;br /&gt;&lt;br /&gt;Don’t close the command prompt as we need to execute one more command at the next step. Just minimize it.&lt;br /&gt;&lt;br /&gt;5. Insert your Windows DVD in the optical drive and note down the drive letter of the optical drive and USB media. Here I use “D” as my optical (DVD) drive letter and “G” as my USB drive letter.&lt;br /&gt;&lt;br /&gt;6. Go back to command prompt and execute the following commands:&lt;br /&gt;&lt;br /&gt;6.1. Change directory to the DVD’s boot directory where bootsect lives:&lt;br /&gt;d:&lt;br /&gt;cd d:\boot&lt;br /&gt;&lt;br /&gt;6.2. Use bootsect to set the USB as a bootable NTFS drive prepared for a Vista/7 image. I’m assuming that your USB flash drive has been labeled disk G:\ by the computer:&lt;br /&gt;bootsect /nt60 g:&lt;br /&gt;&lt;br /&gt;(Where “G” is your USB drive letter)&lt;br /&gt;&lt;br /&gt;7. Copy Windows DVD contents to USB.&lt;br /&gt;&lt;br /&gt;You are done with your bootable USB. You can now use this bootable USB as bootable DVD on any computer that comes with USB boot feature (most of the current motherboards support this feature).&lt;br /&gt;&lt;br /&gt;Note that this bootable USB guide will not work if you are trying to make a bootable USB on XP computer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-8684764803302989719?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/8684764803302989719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=8684764803302989719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8684764803302989719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8684764803302989719'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/12/create-bootable-usb-windows-7.html' title='Create Bootable USB Windows 7'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-6072384100324281582</id><published>2011-11-13T13:01:00.000-08:00</published><updated>2011-11-13T13:02:34.490-08:00</updated><title type='text'>Illusion</title><content type='html'>If your brain works normally&lt;br /&gt;&lt;br /&gt;This is another example of an amazing illusion!!! The last sentence is so true. &lt;br /&gt;&lt;br /&gt;If your eyes follow the movement of the rotating pink dot, the dots will remain only one color, pink. &lt;br /&gt;&lt;br /&gt;However if you stare at the black '+ ' in the center, the moving dot turns to green.&lt;br /&gt;Now, concentrate on the black ' + ' in the center of the picture. After a short period, all the pink dots will slowly disappear, and you will see only a single green dot rotating. &lt;br /&gt;&lt;br /&gt;It's amazing how our brain works. There really is no green dot, and the pink ones really don't disappear. This should be proof enough, we don't always see what we think we see. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-BoNgVaUsQWY/TsAwWH6AzAI/AAAAAAAAASE/r72XuQQ8SmU/s1600/OFFICERT1112.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 300px;" src="http://3.bp.blogspot.com/-BoNgVaUsQWY/TsAwWH6AzAI/AAAAAAAAASE/r72XuQQ8SmU/s320/OFFICERT1112.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5674588687124450306" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-6072384100324281582?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/6072384100324281582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=6072384100324281582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6072384100324281582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6072384100324281582'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/11/illusion.html' title='Illusion'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-BoNgVaUsQWY/TsAwWH6AzAI/AAAAAAAAASE/r72XuQQ8SmU/s72-c/OFFICERT1112.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-583423178140187515</id><published>2011-11-04T14:26:00.000-07:00</published><updated>2011-11-04T16:36:17.785-07:00</updated><title type='text'>Eclipse &amp; Tomcat - Create a Webapp - Hello World Tutorial</title><content type='html'>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&lt;br /&gt;&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;&lt;head&gt;&lt;br /&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;&lt;br /&gt;&lt;title&gt;Untitled Document&lt;/title&gt;&lt;br /&gt;&lt;/head&gt;&lt;br /&gt;&lt;br /&gt;&lt;body&gt;&lt;br /&gt;&lt;table border="1" width="100%" id="table1"&gt;&lt;br /&gt;  &lt;tr&gt;&lt;br /&gt;    &lt;td&gt;Directory Structure under: &lt;b&gt;C:\xampp\tomcat\bin\webapps&lt;/b&gt;\&lt;b&gt;mytomcat-eclipse-helloworld-scratch&lt;/b&gt;&lt;br&gt;&lt;br /&gt;      &lt;br&gt;&lt;br /&gt;      List of Directories:&lt;br&gt;&lt;br /&gt;      &lt;br&gt;&lt;br /&gt;      \WEB-INF &lt;br&gt;&lt;br /&gt;      \WEB-INF\lib &lt;br&gt;&lt;br /&gt;      \WEB-INF\src &lt;br&gt;&lt;br /&gt;      \WEB-INF\src\java &lt;br&gt;&lt;br /&gt;      \WEB-INF\src\myeclipse &lt;br&gt;&lt;br /&gt;      \WEB-INF\classes &lt;br&gt;&lt;br /&gt;      \pages &lt;br /&gt;      &lt;p&gt;List of files:&lt;br&gt;&lt;br /&gt;        &lt;br&gt;&lt;br /&gt;        \index.jsp&lt;br&gt;&lt;br /&gt;        \pages &lt;br&gt;&lt;br /&gt;        \pages\myhelloworld_bean.jsp&lt;br&gt;&lt;br /&gt;        \pages\myhelloworld_jstl.jsp &lt;br&gt;&lt;br /&gt;        \WEB-INF\web.xml&lt;br&gt;&lt;br /&gt;        \WEB-INF\lib\jstl.jar - copy this file.&lt;br&gt;&lt;br /&gt;        \WEB-INF\lib\standard.jar - copy this file. &lt;br&gt;&lt;br /&gt;        \WEB-INF\src\myeclipse\MyHelloWorldBean.java&lt;br&gt;&lt;br /&gt;        \WEB-INF\src\myeclipse\MyHelloWorldServlet.java&lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;1 &lt;a href="http://www.eclipse.org/downloads/"&gt;Download and Install Eclipse&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;  Eclipse IDE for Java Developers&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;2 &lt;a href="http://www.apachefriends.org/en/xampp-windows.html"&gt;Download and Install XAMPP&lt;/a&gt;&lt;/b&gt; to its default location&lt;br /&gt;&lt;br /&gt;XAMPP comes really handy with&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;blockquote&gt;&lt;br /&gt;    &lt;p&gt;Apache 2.2.21&lt;br /&gt;&lt;br /&gt;      MySQL 5.5.16&lt;br /&gt;&lt;br /&gt;      PHP 5.3.8&lt;br /&gt;&lt;br /&gt;      phpMyAdmin 3.4.5&lt;br /&gt;&lt;br /&gt;      FileZilla FTP Server 0.9.39&lt;br /&gt;&lt;br /&gt;      Tomcat 7.0.21 (with mod_proxy_ajp as connector)&lt;br /&gt;&lt;br /&gt;    &lt;/p&gt;&lt;br /&gt;  &lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;3  &lt;a href="http://www.eclipsetotale.com/tomcatPlugin.html"&gt;Download Eclipse Tomcat Launcher plugin&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;At the time of this article &lt;a href="http://www.eclipsetotale.com/tomcatPlugin/tomcatPluginV33.zip"&gt;tomcatPluginV33.zip&lt;/a&gt;&lt;br /&gt;  &lt;p&gt;Extract the archive &lt;a href="http://www.eclipsetotale.com/tomcatPlugin/tomcatPluginV33.zip"&gt;tomcatPluginV33.zip&lt;/a&gt; under C:\eclipse\plugins this should create a sub folder com.sysdeo.eclipse.tomcat_3.3.0&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;4 Set JAVA_HOME&lt;/b&gt; to C:\Program Files\Java&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;5 Set JRE_HOME&lt;/b&gt; to C:\Program Files\Java\jre6&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;6 Let's get started&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To give you the big picture, in the steps below, you will use Eclipse to &lt;br /&gt;  create the following directory structure and files. &lt;br&gt;&lt;br /&gt;  This examples Tomcat &amp;quot;webapps&amp;quot; directory is located at:&lt;br&gt;&lt;br /&gt;  &lt;b&gt; C:\xampp\tomcat\bin\webapps&lt;/b&gt;&lt;br&gt;&lt;br /&gt;  &amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;7 Eclipse - Create a Java Project&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;8&lt;/b&gt; Launch Eclipse&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;9&lt;/b&gt; Tomcat Plugin &lt;/li&gt;&lt;br /&gt;&lt;p&gt; The Sysdeo Tomcat Plugin is our best friend. After you have installed it, you will notice these buttons and menues in your IDE. &lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-gTpiZG3DzDY/TrR1-c16AdI/AAAAAAAAARU/dRFfSY1CJCs/s1600/tomcatplugin.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 175px; height: 140px;" src="http://2.bp.blogspot.com/-gTpiZG3DzDY/TrR1-c16AdI/AAAAAAAAARU/dRFfSY1CJCs/s320/tomcatplugin.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5671287546520928722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt; The left button starts Tomcat, the middle button stops it, the right button restarts Tomcat. Right now, they won't work if you press them. To enable them, you first need to configure a few things. Go to the menu &amp;quot;Window-&amp;gt; Preferences&amp;quot; there, you will see this dialogue box. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Configure Tomcat Plugin&lt;br /&gt;&lt;p&gt;Windows--&amp;gt;Preferences--&amp;gt;Tomcat  &lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;p&gt; Now you need to go to the menu item &amp;quot;Tomcat&amp;quot; and select your Tomcat version. At the time of writing that would be the 7.x version. Now we adjust the field &amp;quot;Tomcat Home&amp;quot; to point to the install directory that we selected before at install time. The Sysdeo plugin now knows where to look for the server.xml file and automatically assumes the standard path to look for the file. Eclipse is now able to manage this configuration file, i.e. add a new &amp;amp;lt;context&amp;amp;gt; for a new application&lt;br /&gt;    &lt;br /&gt;&lt;p&gt;Browse for tomcat home and select tomcat version&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-7_foSRO9lUE/TrR2dR6ejKI/AAAAAAAAARg/C_hwiiXbAEQ/s1600/tomcatpluginpreferences.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 306px;" src="http://2.bp.blogspot.com/-7_foSRO9lUE/TrR2dR6ejKI/AAAAAAAAARg/C_hwiiXbAEQ/s320/tomcatpluginpreferences.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5671288076163255458" /&gt;&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Click on JVM settings and add JVM Parameters  &lt;br /&gt;&lt;p&gt;-Xmx2000M&lt;br /&gt;&lt;p&gt;-Xms1000M&lt;br /&gt;&lt;p&gt;-XX:MaxPermSize=128m            &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-aceZ1xTrPQM/TrR2oYyEtII/AAAAAAAAARs/kurUpJ0iltY/s1600/tomcatjvm.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 310px;" src="http://4.bp.blogspot.com/-aceZ1xTrPQM/TrR2oYyEtII/AAAAAAAAARs/kurUpJ0iltY/s320/tomcatjvm.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5671288266985616514" /&gt;&lt;/a&gt;&lt;br /&gt;  &lt;br /&gt;&lt;p&gt; Now we are ready to test start our Tomcat server. Click on the start button in the Tomcat menu and watch the console output. If Tomcat boots up without any stacktraces open your browser, and try to open the following address &lt;a href="http://localhost:8080/"&gt;http://localhost:8080/&lt;/a&gt; . If you see an image&lt;br /&gt;&lt;br /&gt;    that is similar, to the one below everything is working okay&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-IKYf_OcdQOc/TrR21Nw1b3I/AAAAAAAAAR4/TJIra3yhSBE/s1600/tomcat.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 180px;" src="http://4.bp.blogspot.com/-IKYf_OcdQOc/TrR21Nw1b3I/AAAAAAAAAR4/TJIra3yhSBE/s320/tomcat.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5671288487365930866" /&gt;&lt;/a&gt;        &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;10&lt;/b&gt; File, New, Project, &lt;b&gt;Java Project&lt;/b&gt;, Next&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;11&lt;/b&gt; Project Name: &lt;b&gt;mytomcat-eclipse-helloworld-scratch&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;12 &lt;/b&gt;&lt;font color="#FF0000"&gt;UnCheck&lt;/font&gt; - Use default location.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;13&lt;/b&gt; Click &amp;quot;Browse&amp;quot; and navigate to the Tomcat webapps&amp;quot; &lt;br /&gt;      directory (ex:&lt;b&gt; C:\xampp\tomcat\bin\webapps&lt;/b&gt;&lt;b&gt;\webapps&lt;/b&gt;). &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;14&lt;/b&gt; This is a little tricky so follow closely.&amp;nbsp; We want to create a &lt;br /&gt;      new directory.&lt;br /&gt;      &lt;ul&gt;&lt;br /&gt;        &lt;li&gt;Note:&amp;nbsp; The &amp;quot;webapps&amp;quot; directory should be selected.&lt;/li&gt;&lt;br /&gt;        &lt;li&gt;Click &amp;quot;Make New Folder&amp;quot;&lt;/li&gt;&lt;br /&gt;        &lt;li&gt;In the browse window list, you should be able replace the words &amp;quot;New &lt;br /&gt;          Folder&amp;quot; with: &lt;b&gt;mytomcat-eclipse-helloworld-scratch&lt;/b&gt;&lt;br&gt;&lt;br /&gt;          Note:&amp;nbsp; If you can't, in the browse window scroll to the &amp;quot;New &lt;br /&gt;          Folder&amp;quot; and right click, choose &amp;quot;Rename&amp;quot; and change the folder name to&lt;br /&gt;          &lt;b&gt;mytomcat-eclipse-helloworld-scratch&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;        &lt;li&gt;Click &amp;quot;OK&amp;quot;.&lt;/li&gt;&lt;br /&gt;        &lt;li&gt;Check the value of &amp;quot;Location:&amp;quot; to make sure you have selected the &lt;br /&gt;          correct folder.&lt;br&gt;&lt;br /&gt;          Location should now show: &lt;b&gt;C:\Tomcat\Tomcat6.0\webapps\mytomcat-eclipse-helloworld-scratch&lt;/b&gt; &lt;/li&gt;&lt;br /&gt;        &lt;li&gt;Click &amp;quot;Next&amp;quot; to go to the &amp;quot;Java Settings&amp;quot; screen.&lt;/li&gt;&lt;br /&gt;      &lt;/ul&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;15 &lt;/b&gt;Source Folder&lt;br /&gt;      &lt;ul&gt;&lt;br /&gt;        &lt;li&gt;Click &amp;quot;Create new source folder&amp;quot;.&lt;br&gt;&lt;br /&gt;          &lt;b&gt;Folder name: &lt;font color="#FF0000"&gt;WEB-INF/src&lt;br&gt;&lt;br /&gt;          &lt;/font&gt;&lt;/b&gt;Click &amp;quot;Finish&amp;quot;&lt;/li&gt;&lt;br /&gt;        &lt;li&gt;Right click on &amp;quot;src&amp;quot; and choose &amp;quot;Remove from Build Path&amp;quot;.&amp;nbsp; &lt;br /&gt;          Later you will delete the folder.&lt;br&gt;&lt;br /&gt;          (Note: We just created the src file in a directory that web users &lt;br /&gt;          can't directly get to: &lt;font color="#FF0000"&gt;&lt;b&gt;WEB-INF/src&lt;/b&gt;&lt;/font&gt;)&lt;/li&gt;&lt;br /&gt;      &lt;/ul&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;16 &lt;/b&gt;Output Folder&lt;br /&gt;      &lt;ul&gt;&lt;br /&gt;        &lt;li&gt;Change the &amp;quot;Default output folder&amp;quot; to: &lt;b&gt;mytomcat-eclipse-helloworld-scratch/&lt;font color="#FF0000"&gt;WEB-INF/classes&lt;br&gt;&lt;br /&gt;          &lt;/font&gt;&lt;/b&gt;(Note: Currently the default will be: &lt;br /&gt;          mytomcat-eclipse-helloworld-scratch&lt;b&gt;/&lt;font color="#FF0000"&gt;bin&lt;/font&gt;&lt;/b&gt;)&lt;/li&gt;&lt;br /&gt;      &lt;/ul&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;17 &lt;/b&gt; Click &amp;quot;Finish&amp;quot;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;18 &lt;/b&gt; In the &amp;quot;Package Explorer&amp;quot; right click on &amp;quot;src&amp;quot; and choose delete.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;19 Eclipse - Build Path&lt;/b&gt; - add the Tomcat lib jars files.&lt;br /&gt;   &lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Right click on the project.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Click &amp;quot;Build Path&amp;quot;, &amp;quot;Configure Build Path&amp;quot;, then &lt;br /&gt;  click the tab &amp;quot;Libraries&amp;quot;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Check to see if &amp;quot;&lt;b&gt;&lt;font color="#FF0000"&gt;JRE System Library&lt;/font&gt;&lt;/b&gt;&amp;quot; &lt;br /&gt;  is listed.&amp;nbsp; If not complete the next steps in this bullet.&lt;br&gt;&lt;br /&gt;  Click &amp;quot;Add Library&amp;quot;, &amp;quot;&lt;b&gt;&lt;font color="#FF0000"&gt;JRE System Library&lt;/font&gt;&lt;/b&gt;&amp;quot;, &lt;br /&gt;  &amp;quot;Next&amp;quot;, &amp;quot;Finish&amp;quot;.&lt;br&gt;&lt;br /&gt;  Note: Under the tab &amp;quot;Order and Export&amp;quot; this lib file should be directly &lt;br /&gt;  under the WEB-INF/src directory.&lt;br&gt;&lt;br /&gt;  You can't compile .java files without this library!!!&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Click &amp;quot;Add External JARs&amp;quot;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Browse to the &lt;b&gt;Tomcat common library directory.&lt;br&gt;&lt;br /&gt;  &lt;/b&gt;Ex:&lt;b&gt; C:\xampp\tomcat\lib&lt;/b&gt; &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Select all of the JAR files (Ctrl-A), then click &amp;quot;Open&amp;quot;.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Click &amp;quot;OK&amp;quot; to leave the &amp;quot;Java Build Path&amp;quot; screen.&lt;/li&gt;&lt;br /&gt; &lt;/ul&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;20 &lt;/b&gt;Create the &amp;quot;&lt;b&gt;WEB-INF\lib&lt;/b&gt;&amp;quot; Folder&lt;br /&gt;   &lt;ul&gt;&lt;br /&gt; &lt;li&gt;Right click on &amp;quot;WEB-INF&amp;quot;, &amp;quot;New&amp;quot;, &amp;quot;Folder&amp;quot;.&amp;nbsp; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;Folder name: &lt;b&gt;lib&lt;/b&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Click &amp;quot;Finish&amp;quot;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;Library files&lt;/b&gt; - for this project we will be using 2 .jar files:&lt;br /&gt; &lt;b&gt;standard.jar&lt;/b&gt; &amp;amp; &lt;b&gt;jstl.jar&lt;/b&gt;.&amp;nbsp; &lt;br&gt;&lt;br /&gt; These 2 jar files need to reside in: &lt;b&gt;webapps\mytomcat-eclipse-helloworld\WEB-INF\lib&lt;/b&gt;&lt;br /&gt; &lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://www.thomasyounsi.com/tomcat/mytomcat-eclipse-helloworld-scratch-lib.zip"&gt;&lt;br /&gt; mytomcat-eclipse-helloworld-scratch-lib.zip&lt;/a&gt; - download and extract this &lt;br /&gt; zip file into the new &amp;quot;lib&amp;quot; directory you just created.&lt;br&gt;&lt;br /&gt; Note:&amp;nbsp; If you downloaded the files in this tutorial you will have this &lt;br /&gt; file in the directory:&lt;br&gt;&lt;br /&gt; Pathname: &lt;b&gt;tomcat\tutorial_tomcat_eclipse\webapps\mytomcat-eclipse-helloworld-scratch-lib.zip&lt;br&gt;&lt;br /&gt; &lt;/b&gt;(Note: These lib files came from the Apache JSTL project called &lt;br /&gt; &amp;quot;standard&amp;quot;.)&lt;/li&gt;&lt;br /&gt; &lt;li&gt;If you don't place the files properly in the lib directory you will get &lt;br /&gt; compile errors etc...&lt;/li&gt;&lt;br /&gt; &lt;/ul&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;21 &lt;/b&gt;Create the &amp;quot;&lt;b&gt;WEB-INF\src\myeclipse&lt;/b&gt;&amp;quot; &lt;b&gt;&lt;font color="#0000FF"&gt;Package&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;   &lt;ul&gt;&lt;br /&gt; &lt;li&gt;Right click on &amp;quot;&lt;b&gt;&lt;font color="#0000FF"&gt;WEB-INF/src&lt;/font&gt;&lt;/b&gt;&amp;quot; (not &lt;br /&gt; &amp;quot;WEB-INF&amp;quot;), &amp;quot;New&amp;quot;, &amp;quot;&lt;b&gt;&lt;font color="#0000FF"&gt;Package&lt;/font&gt;&lt;/b&gt;&amp;quot;.&amp;nbsp; &lt;br /&gt; Folder name: &lt;b&gt;myeclipse&lt;/b&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Click &amp;quot;Finish&amp;quot;&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;22 &lt;/b&gt;Create the &amp;quot;pages&amp;quot; Folder&lt;br /&gt;   &lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Right click on &amp;quot;&lt;b&gt;mytomcat-eclipse-helloworld-scratch&lt;/b&gt;&amp;quot;, &lt;br /&gt;  &amp;quot;New&amp;quot;, &amp;quot;Folder&amp;quot;.&amp;nbsp; Folder name: &lt;b&gt;pages&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Click &amp;quot;Finish&amp;quot;&lt;/li&gt;&lt;br /&gt; &lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;23 &lt;/b&gt;Create the &amp;quot;&lt;b&gt;WEB-INF\web.xml&lt;/b&gt;&amp;quot; file.&lt;br /&gt;   &lt;ul&gt;&lt;br /&gt; &lt;li&gt;Right click on &amp;quot;&lt;b&gt;WEB-INF&lt;/b&gt;&amp;quot; (not &amp;quot;WEB-INF/src&amp;quot;), &amp;quot;New&amp;quot;, &amp;quot;&lt;b&gt;&lt;font color="#0000FF"&gt;File&lt;/font&gt;&lt;/b&gt;&amp;quot;.&amp;nbsp; &lt;br /&gt; File name: &lt;b&gt;web.xml&lt;/b&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://www.thomasyounsi.com/tomcat/web.xml"&gt;web.xml&lt;/a&gt; - &lt;br /&gt; copy this content into the file.&amp;nbsp; Right click on the filename, open &lt;br /&gt; with, Text Editor.&amp;nbsp; If you open with the XML editor you can't copy and &lt;br /&gt; paste.&amp;nbsp; After you copy-n-paste, then open with &amp;quot;XML Editor&amp;quot;.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Notice the 2 tags: &amp;lt;servlet&amp;gt; &amp;amp; &amp;lt;servlet-mapping&amp;gt;.&amp;nbsp; This is planning &lt;br /&gt; for the .java servlet file we will create.&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;br /&gt; &lt;b&gt;24 &lt;/b&gt; Create the &amp;quot;&lt;b&gt;index.jsp&lt;/b&gt;&amp;quot; file&lt;br /&gt; &lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Right click on &amp;quot;&lt;b&gt;mytomcat-eclipse-helloworld-scratch&lt;/b&gt;&amp;quot;, &amp;quot;New&amp;quot;, &amp;quot;&lt;b&gt;&lt;font color="#0000FF"&gt;File&lt;/font&gt;&lt;/b&gt;&amp;quot;.&amp;nbsp; &lt;br /&gt; File name: &lt;b&gt;index.jsp&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://www.thomasyounsi.com/tomcat/index.jsp.txt"&gt;index.jsp&lt;/a&gt; - &lt;br /&gt; copy this content into the file. (&lt;b&gt;&lt;font color="#FF0000"&gt;Warning&lt;/font&gt;&lt;/b&gt;: &lt;br /&gt;  If the server &amp;amp; browser doesn't show this file as a Text file then do a &lt;br /&gt;  view source so you can copy-n-paste.)&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Note:&lt;ul&gt;&lt;br /&gt;   &lt;li&gt;This JSP has just HTML tags.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt; &lt;/ul&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;25 &lt;/b&gt; Create the &amp;quot;&lt;b&gt;MyHelloWorldBean.java&lt;/b&gt;&amp;quot; Java source file.&lt;br /&gt;   &lt;ul&gt;&lt;br /&gt; &lt;li&gt;Right click on &amp;quot;&lt;b&gt;&lt;a href="webapps/myeclipse-helloworld.zip" style="text-decoration: none"&gt;&lt;font color="#000000"&gt;myeclipse&lt;/font&gt;&lt;/a&gt;&lt;/b&gt;&amp;quot; &lt;br /&gt; under the directory &amp;quot;WEB-INF/src&amp;quot;, &amp;quot;New&amp;quot;, &amp;quot;&lt;font color="#0000FF"&gt;&lt;b&gt;Class&lt;/b&gt;&lt;/font&gt;&amp;quot;.&amp;nbsp; &lt;br /&gt; &lt;br&gt;&lt;br /&gt; Name: &lt;b&gt;MyHelloWorldBean&lt;br&gt;&lt;br /&gt; &lt;/b&gt;Click &amp;quot;Finish&amp;quot;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;br /&gt; &lt;a href="http://www.thomasyounsi.com/tomcat/MyHelloWorldBean.java.txt"&gt;MyHelloWorldBean.java&lt;/a&gt; - &lt;br /&gt; copy this content into the file. (&lt;b&gt;&lt;font color="#FF0000"&gt;Warning&lt;/font&gt;&lt;/b&gt;: &lt;br /&gt; If the server &amp;amp; browser doesn't show this file as a Text file then do a view &lt;br /&gt; source so you can copy-n-paste.)&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;26 &lt;/b&gt; Create the &amp;quot;&lt;b&gt;MyHelloWorldServlet.java&lt;/b&gt;&amp;quot; Java source file.&lt;br /&gt;   &lt;ul&gt;&lt;br /&gt; &lt;li&gt;Right click on &amp;quot;&lt;b&gt;&lt;a href="webapps/myeclipse-helloworld.zip" style="text-decoration: none"&gt;&lt;font color="#000000"&gt;myeclipse&lt;/font&gt;&lt;/a&gt;&lt;/b&gt;&amp;quot; &lt;br /&gt; under the directory &amp;quot;WEB-INF/src&amp;quot;, &amp;quot;New&amp;quot;, &amp;quot;&lt;font color="#0000FF"&gt;&lt;b&gt;Class&lt;/b&gt;&lt;/font&gt;&amp;quot;.&amp;nbsp; &lt;br /&gt; &lt;br&gt;&lt;br /&gt; Name: &lt;b&gt;MyHelloWorldServlet&lt;br&gt;&lt;br /&gt; &lt;/b&gt;Click &amp;quot;Finish&amp;quot;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;br /&gt; &lt;a href="http://www.thomasyounsi.com/tomcat/MyHelloWorldServlet.java.txt"&gt;MyHelloWorldServlet.java&lt;/a&gt; - &lt;br /&gt; copy this content into the file. (&lt;b&gt;&lt;font color="#FF0000"&gt;Warning&lt;/font&gt;&lt;/b&gt;: &lt;br /&gt; If the server &amp;amp; browser doesn't show this file as a Text file then do a view &lt;br /&gt; source so you can copy-n-paste.)&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;27 &lt;/b&gt; Create the &amp;quot;&lt;b&gt;myhelloworld_jstl.jsp&lt;/b&gt;&amp;quot; JSP file.&lt;br /&gt;   &lt;ul&gt;&lt;br /&gt; &lt;li&gt;Right click on &amp;quot;&lt;b&gt;pages&lt;/b&gt;&amp;quot;, &amp;quot;New&amp;quot;, &amp;quot;&lt;font color="#0000FF"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/font&gt;&amp;quot;.&amp;nbsp; &lt;br /&gt; &lt;br&gt;&lt;br /&gt; File Name: &lt;b&gt;myhelloworld_jstl.jsp&lt;br&gt;&lt;br /&gt; &lt;/b&gt;Click &amp;quot;Finish&amp;quot;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;br /&gt; &lt;a href="http://www.thomasyounsi.com/tomcat/myhelloworld_jstl.jsp.txt"&gt;myhelloworld_jstl.jsp&lt;/a&gt; - &lt;br /&gt; copy this content into the file. (&lt;b&gt;&lt;font color="#FF0000"&gt;Warning&lt;/font&gt;&lt;/b&gt;: &lt;br /&gt; If the server &amp;amp; browser doesn't show this file as a Text file then do a view &lt;br /&gt; source so you can copy-n-paste.)&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;28 &lt;/b&gt; Create the &amp;quot;&lt;b&gt;myhelloworld_bean.jsp&lt;/b&gt;&amp;quot; JSP file.&lt;br /&gt;   &lt;ul&gt;&lt;br /&gt; &lt;li&gt;Right click on &amp;quot;&lt;b&gt;pages&lt;/b&gt;&amp;quot;, &amp;quot;New&amp;quot;, &amp;quot;&lt;font color="#0000FF"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/font&gt;&amp;quot;.&amp;nbsp; &lt;br /&gt; &lt;br&gt;&lt;br /&gt; File Name: &lt;b&gt;myhelloworld_bean.jsp&lt;br&gt;&lt;br /&gt; &lt;/b&gt;Click &amp;quot;Finish&amp;quot;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;br /&gt; &lt;a href="http://www.thomasyounsi.com/tomcat/myhelloworld_bean.jsp.txt"&gt;myhelloworld_bean.jsp&lt;/a&gt; - &lt;br /&gt; copy this content into the file. (&lt;b&gt;&lt;font color="#FF0000"&gt;Warning&lt;/font&gt;&lt;/b&gt;: &lt;br /&gt; If the server &amp;amp; browser doesn't show this file as a Text file then do a view &lt;br /&gt; source so you can copy-n-paste.)&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;29 &lt;/b&gt; Reload the webapp or Stop Tomcat.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;30&lt;/b&gt;Test your Web App&lt;br /&gt;  &lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;31 &lt;/b&gt; Start Tomcat and/or Reload this WebApp&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;32 &lt;/b&gt; Go to: &lt;br /&gt; &lt;a href="http://localhost:8080/mytomcat-eclipse-helloworld-scratch/pages/myhelloworld_jstl.jsp"&gt; http://localhost:8080/mytomcat-eclipse-helloworld-scratch/pages/myhelloworld_jstl.jsp &lt;/a&gt;   &lt;/li&gt;&lt;br /&gt;   &lt;br /&gt;      &lt;blockquote&gt;&lt;br /&gt;              &lt;br /&gt;                              &lt;p align="center"&gt;&lt;strong&gt;Hello World (JSTL Example)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;                              &lt;br /&gt;                              &lt;/p&gt;&lt;br /&gt;                           &lt;br /&gt;      &lt;/blockquote&gt;&lt;br /&gt;      &lt;br /&gt;      &lt;p&gt;JSTL Example (c:out): Hello World &lt;/p&gt;&lt;br /&gt;      &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;      &lt;li&gt;&lt;b&gt;33 &lt;/b&gt; Go to:  &lt;a href="http://localhost:8080/mytomcat-eclipse-helloworld-scratch/pages/myhelloworld_bean.jsp"&gt;http://localhost:8080/mytomcat-eclipse-helloworld-scratch/pages/myhelloworld_bean.jsp&lt;/a&gt; &lt;/li&gt;&lt;br /&gt;   &lt;blockquote&gt;&lt;br /&gt;    &lt;br /&gt;                    &lt;p align="center"&gt;&lt;strong&gt;Hello World (JSP &amp;amp; Java Bean Example)&lt;br /&gt;                       &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;                     &lt;br /&gt;      &lt;/blockquote&gt;&lt;br /&gt;      &lt;p&gt; Bean Example MyHelloWorld.getStrMyMessage(): Hello World &lt;/p&gt;&lt;br /&gt;      &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;34 &lt;/b&gt; Go to:  &lt;a href="http://localhost:8080/mytomcat-eclipse-helloworld-scratch/MyHelloWorldServlet"&gt;http://localhost:8080/mytomcat-eclipse-helloworld-scratch/MyHelloWorldServlet&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;br /&gt;                  &lt;blockquote&gt;&lt;br /&gt;                    &lt;p align="center"&gt;&lt;strong&gt;Hello World (Servlet Example)&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;                 &lt;br /&gt;  &lt;/blockquote&gt;&lt;br /&gt;  &lt;p&gt;Hello World&lt;/p&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt; &lt;b&gt;35 &lt;/b&gt; Optional - Change Text - Hello World &lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;Using Eclipse, modify&lt;/b&gt; the following files then Reload the web app &lt;br /&gt;    or Stop/Start Tomcat.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;br /&gt;    &lt;li&gt;&lt;b&gt;filename:&lt;/b&gt; index.jsp&lt;br&gt;&lt;br /&gt;      For the title &amp;amp; h1 tags change the following:&lt;br&gt;&lt;br /&gt;      from:&lt;br&gt;&lt;br /&gt;      mytomcat-eclipse-helloworld&lt;br&gt;&lt;br /&gt;      to:&lt;br&gt;&lt;br /&gt;      mytomcat-eclipse-helloworld&lt;font color="#FF0000"&gt;-scratch&lt;/font&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;filename:&lt;/b&gt; WEB-INF\src\myeclipse\MyHelloWorldBean.java&lt;br&gt;&lt;br /&gt;      from:&lt;br&gt;&lt;br /&gt;      setStrMyMessage(&amp;quot;Hello World&amp;quot;);&lt;br&gt;&lt;br /&gt;      to:&lt;br&gt;&lt;br /&gt;      setStrMyMessage(&amp;quot;Hello World &lt;font color="#FF0000"&gt;- Hi&lt;/font&gt;&amp;quot;);&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;filename:&lt;/b&gt; WEB-INF/src/myeclipse/MyHelloWorldServlet.java&lt;br&gt;&lt;br /&gt;      from:&lt;br&gt;&lt;br /&gt;      &amp;lt;p&amp;gt;Hello World&amp;lt;/p&amp;gt;&lt;br&gt;&lt;br /&gt;      to:&lt;br&gt;&lt;br /&gt;      &amp;lt;p&amp;gt;Hello World &lt;font color="#FF0000"&gt;- Hi&lt;/font&gt;&amp;lt;/p&amp;gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;filename:&lt;/b&gt; pages/myhelloworld_jstl.jsp&lt;br&gt;&lt;br /&gt;      from:&lt;br&gt;&lt;br /&gt;      &lt;font COLOR="#008080"&gt;&amp;lt;&lt;/font&gt;&lt;font COLOR="#3f7f7f"&gt;&lt;u&gt;c:out&lt;/u&gt;&lt;/font&gt;&lt;br /&gt;      &lt;font COLOR="#7f007f"&gt;value&lt;/font&gt;=&lt;font COLOR="#2a00ff"&gt;&lt;i&gt;&amp;quot;Hello &lt;br /&gt;        World&amp;quot;&lt;/i&gt;&lt;/font&gt;&lt;font COLOR="#008080"&gt;/&amp;gt;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;      to:&lt;br&gt;&lt;br /&gt;      &lt;font COLOR="#008080"&gt;&amp;lt;&lt;/font&gt;&lt;font COLOR="#3f7f7f"&gt;&lt;u&gt;c:out&lt;/u&gt;&lt;/font&gt;&lt;br /&gt;      &lt;font COLOR="#7f007f"&gt;value&lt;/font&gt;=&lt;font COLOR="#2a00ff"&gt;&lt;i&gt;&amp;quot;Hello World &lt;br /&gt;      - Hi&amp;quot;&lt;/i&gt;&lt;/font&gt;&lt;font COLOR="#008080"&gt;/&amp;gt;&lt;/font&gt;&lt;/li&gt;&lt;br /&gt;  &lt;/ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;Reload Web App or Stop/Start Tomcat Service &lt;/b&gt;&lt;br /&gt;    &lt;font color="#FF0000"&gt;(because you changed a .java file!)&lt;/font&gt; - see steps &lt;br /&gt;    above!&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Test your Web App again&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/body&gt;&lt;br /&gt;&lt;/html&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-583423178140187515?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/583423178140187515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=583423178140187515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/583423178140187515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/583423178140187515'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/11/eclipse-tomcat-create-webapp-hello.html' title='Eclipse &amp; Tomcat - Create a Webapp - Hello World Tutorial'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-gTpiZG3DzDY/TrR1-c16AdI/AAAAAAAAARU/dRFfSY1CJCs/s72-c/tomcatplugin.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-8032873833423547638</id><published>2011-11-03T13:44:00.000-07:00</published><updated>2011-11-09T10:59:12.840-08:00</updated><title type='text'>Matlab relative path issue in prj and MWArray.dll nightmare on Windows 7 64 bit</title><content type='html'>Whenever you want to create a deployment project, you obviously would like to add it to source control repository for others to use..... But you will face a major issue...&lt;br /&gt;The main problem is that the .prj file which deploytool creates contains absolute paths which will not work on other computers!. This is really bad to see that this is still the case in MatLab R2011a.... Really!  So I decided to use Visual Studio 2005 vcproj file to maintain my deployment project because Visual Studio 2005 project support relative path pretty damn well! Thank you Microsoft Visual Studio Team!. I decided to create a WIN32 utility using MFC to convert the relative path to absolute path using the vcproj file and generate a Matlab PRJ file. In my case I am targetting C# .Net Assembly. Here is the source code!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define _CRT_SECURE_NO_DEPRECATE&lt;br /&gt;#include "stdafx.h"&lt;br /&gt;#include "vcproj2matlabprj.h"&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;#include &lt;ctype.h&gt;&lt;br /&gt;#include &lt;errno.h&gt;&lt;br /&gt;#include "xmlParser.h"&lt;br /&gt;#include "win32utility.h"&lt;br /&gt;&lt;br /&gt;CString RelativePathToAbsolutePath(LPCTSTR contentRelativePath,LPCTSTR rootPath, BOOL &amp;bRelativePathToParentFolders);&lt;br /&gt;&lt;br /&gt;void PrintFileName(XMLNode xNode,LPCTSTR pszRootFolder);&lt;br /&gt;&lt;br /&gt;FILE *_pOutMakeFile = NULL;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#if !defined (WIN32)&lt;br /&gt;#define _strdup strdup&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;#ifdef _DEBUG&lt;br /&gt;#define new DEBUG_NEW&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;// The one and only application object&lt;br /&gt;&lt;br /&gt;CWinApp theApp;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])&lt;br /&gt;{&lt;br /&gt;    int nRetCode = 0;&lt;br /&gt;&lt;br /&gt;    // initialize MFC and print and error on failure&lt;br /&gt;    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))&lt;br /&gt;    {&lt;br /&gt;        // TODO: change error code to suit your needs&lt;br /&gt;        _tprintf(_T("Fatal Error: MFC initialization failed\n"));&lt;br /&gt;        nRetCode = 1;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        CString strRootFolder;&lt;br /&gt;        CString strVCProjShortFilename;&lt;br /&gt;        CString csPath;&lt;br /&gt;        CString csFilenameNoExt;&lt;br /&gt;        CString csExtension;&lt;br /&gt;        CString strVCProj;&lt;br /&gt;        CString strMathlabProj;&lt;br /&gt;        CString strMathLabRootPath;&lt;br /&gt;        CString strClassName;&lt;br /&gt;        CString strNamespace;&lt;br /&gt;&lt;br /&gt;        if ( argc &lt; 4 )&lt;br /&gt;        {&lt;br /&gt;            printf("Usage: %s &lt;InFile1.vcproj]&gt; &lt;OutMathlabPrjFile.prj&gt; [MathLab 2011a RootPath EG: \"C:\\MATLAB\\R2011a\"]\n",argv[0]);&lt;br /&gt;            return 1;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        XMLNode xMainNode=XMLNode::openFileHelper(argv[1],"VisualStudioProject");&lt;br /&gt;&lt;br /&gt;        strRootFolder = CString(argv[1]);&lt;br /&gt;        strMathlabProj = CString(argv[2]);&lt;br /&gt;        GetPathFromFileName(strRootFolder);&lt;br /&gt;&lt;br /&gt;        strVCProj = CString(argv[1]);&lt;br /&gt;        strVCProjShortFilename = CString(argv[1]);&lt;br /&gt;        strMathLabRootPath = CString(argv[3]);&lt;br /&gt;        &lt;br /&gt;        GetFileNameComponents(strMathlabProj, // in&lt;br /&gt;         csPath, csFilenameNoExt, csExtension); // out&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;        if ( xMainNode.isEmpty() )&lt;br /&gt;        {&lt;br /&gt;            printf("Not valid input file [%s]\n", argv[1]);&lt;br /&gt;            return 2;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        XMLNode xNode;&lt;br /&gt;&lt;br /&gt;        xNode = xMainNode.getChildNode("Configurations");&lt;br /&gt;&lt;br /&gt;        // Try to open output file&lt;br /&gt;        _pOutMakeFile = fopen(argv[2],"w");&lt;br /&gt;        if ( _pOutMakeFile == NULL )&lt;br /&gt;        {&lt;br /&gt;            printf("Can not open output file [%s]\n", argv[2]);&lt;br /&gt;            return 3;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // Generate Header&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;deployment-project&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;configuration target=\"target.net.component\" target-name=\".NET Assembly\" name=\"%s\" location=\"%s\" file=\"%s\" build-checksum=\"3479764310\"&gt;\n",csFilenameNoExt.GetBuffer(0),csPath.GetBuffer(0),strMathlabProj.GetBuffer(0));&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.project.name&gt;%s&lt;/param.project.name&gt;\n",strMathlabProj.GetBuffer(0));&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.target.type&gt;.NET Assembly&lt;/param.target.type&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.appname&gt;%s&lt;/param.appname&gt;\n",csFilenameNoExt.GetBuffer(0));&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.intermediate&gt;${PROJECT_ROOT}\\%s\\src&lt;/param.intermediate&gt;\n",csFilenameNoExt.GetBuffer(0));&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.output&gt;${PROJECT_ROOT}\\%s\\distrib&lt;/param.output&gt;\n",csFilenameNoExt.GetBuffer(0));&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.embed.ctf&gt;true&lt;/param.embed.ctf&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.tbx_on_path&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;item&gt;all&lt;/item&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;/param.tbx_on_path&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.warnings&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;warning.fullpath&gt;on&lt;/warning.fullpath&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;warning.duplicate&gt;on&lt;/warning.duplicate&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;warning.option.ignored&gt;on&lt;/warning.option.ignored&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;warning.libname&gt;on&lt;/warning.libname&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;warning.demo&gt;on&lt;/warning.demo&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;/param.warnings&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.framework&gt;option.net.framework.default&lt;/param.net.framework&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.assembly.type&gt;option.assembly.type.private&lt;/param.assembly.type&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.encryption.key.file /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.enable.remoting&gt;false&lt;/param.net.enable.remoting&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.tsa.enable&gt;false&lt;/param.net.tsa.enable&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.tsa.assembly /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.tsa.interface /&gt;\n");&lt;br /&gt;        strNamespace = csFilenameNoExt;&lt;br /&gt;        strNamespace.MakeUpper();&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.tsa.namespace&gt;%s&lt;/param.net.tsa.namespace&gt;\n",strNamespace.GetBuffer(0));&lt;br /&gt;        strClassName = csFilenameNoExt;&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.tsa.superclass&gt;C%s&lt;/param.net.tsa.superclass&gt;\n",strClassName.GetBuffer(0));&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;unset&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.project.name /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.target.type /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.appname /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.intermediate /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.output /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.embed.ctf /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.tbx_on_path /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.warnings /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.framework /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.assembly.type /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.encryption.key.file /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.enable.remoting /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.tsa.enable /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.tsa.assembly /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.tsa.interface /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;param.net.tsa.namespace /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;/unset&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;fileset.classes&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;entity.package name=\"\"&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;entity.class name=\"C%s\"&gt;\n",strClassName.GetBuffer(0));&lt;br /&gt;&lt;br /&gt;        // Print list of files&lt;br /&gt;        xNode = xMainNode.getChildNode("Files");&lt;br /&gt;        PrintFileName(xNode,strRootFolder);&lt;br /&gt;&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;/entity.class&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;/entity.package&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;/fileset.classes&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;fileset.resources /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;fileset.package /&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;build-deliverables&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;file name=\"%sNative.dll\" location=\"${PROJECT_ROOT}\\%s\\distrib\" optional=\"false\"&gt;%sdistrib\\%sNative.dll&lt;/file&gt;\n",csFilenameNoExt.GetBuffer(0),csFilenameNoExt.GetBuffer(0),strRootFolder.GetBuffer(0),csFilenameNoExt.GetBuffer(0));&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;file name=\"%s.dll\" location=\"${PROJECT_ROOT}\\%s\\distrib\" optional=\"false\"&gt;%sdistrib\\%s.dll&lt;/file&gt;\n",csFilenameNoExt.GetBuffer(0),csFilenameNoExt.GetBuffer(0),strRootFolder.GetBuffer(0),csFilenameNoExt.GetBuffer(0));&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;file name=\"readme.txt\" location=\"${PROJECT_ROOT}\\%s\\distrib\" optional=\"false\"&gt;%sdistrib\\readme.txt&lt;/file&gt;\n",csFilenameNoExt.GetBuffer(0),strRootFolder.GetBuffer(0));&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;file name=\"%s_overview.html\" location=\"${PROJECT_ROOT}\\%s\\distrib\" optional=\"false\"&gt;%sdistrib\\%s_overview.html&lt;/file&gt;\n",csFilenameNoExt.GetBuffer(0),csFilenameNoExt.GetBuffer(0),strRootFolder.GetBuffer(0),csFilenameNoExt.GetBuffer(0));&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;/build-deliverables&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;matlab&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;root&gt;%s&lt;/root&gt;\n",strMathLabRootPath.GetBuffer(0));&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;path&gt;\n");&lt;br /&gt;        //fprintf(_pOutMakeFile,"&lt;directory&gt;C:\\My Documents\\MATLAB&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\general&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\ops&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\lang&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\elmat&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\randfun&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\elfun&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\specfun&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\matfun&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\datafun&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\polyfun&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\funfun&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\sparfun&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\scribe&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\graph2d&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\graph3d&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\specgraph&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\graphics&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\uitools&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\strfun&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\imagesci&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\iofun&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\audiovideo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\timefun&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\datatypes&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\verctrl&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\codetools&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\helptools&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\winfun&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\winfun\\NET&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\demos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\timeseries&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\hds&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\guide&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\plottools&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\local&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\matlab\\datamanager&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\simulink&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\instrument&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\coder\\matlabcoder&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\simulink&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\simulink\\slresolve&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\blocks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\components&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\fixedandfloat&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\fixedandfloat\\obsolete&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\simdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\simdemos\\aerospace&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\simdemos\\automotive&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\simdemos\\industrial&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\simdemos\\simfeatures&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\simdemos\\simgeneral&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\dee&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\glue&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\glue\\studio&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\dastudio\\depviewer&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\stateflow\\stateflow&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\simulink\\MPlayIO&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\simulink\\dataobjectwizard&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\hdlshared&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\rtw&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\asap2\\asap2&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\asap2\\asap2\\user&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\common\\can\\blocks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\common\\tgtcommon&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\connectivity&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\pil&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\shared&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\rtw\\datadiff\\GUI&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\rtw\\datadiff\\GUI\\Icons&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\rtw\\datadiff\\API&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\rtw\\cgv\\API&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\rtw\\misra&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulinkcoder&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\accel&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\blocks\\library&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\blocks\\obsolete&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\fixedandfloat\\fxpdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\simulink\\modeladvisor&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\simulink\\modeladvisor\\fixpt&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\stateflow\\sfdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\stateflow\\coder&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\adivdsp&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\adivdsp\\vdspdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\adivdsp\\mdlinfo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\adivdsp\\tfl&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\adivdsp\\vdspblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\adivdsp\\rtw&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\aero\\aero&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\mapgeodesy&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\aero\\astdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\asynciolib&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\AUTOSAR\\AUTOSAR&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\blackfin&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\blackfin\\blks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\blackfin\\blks\\mex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\blackfin\\blks\\masks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\blackfin\\blackfindemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\c166\\c166&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\c166\\blocks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\c166\\c166demos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\foundation\\utils\\resource_config&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\can&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\can\\canblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\can\\canmasks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\can\\canmex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\cgir_fe&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\coder\\codegendemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\coder\\emlcodermex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\coder_foundation\\tfl&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\simtargets&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\coder\\coder&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\comm\\comm&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\comm\\commutilities\\comminit&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\comm\\commutilities\\commmex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\comm\\commutilities&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\comm\\commdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\comm\\commdeprecated&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\help\\toolbox\\comm\\examples&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\testconsole&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\comparisons&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\compiler&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\compiler\\compilerdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\control\\control&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\control\\ctrlguis&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\control\\ctrlobsolete&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\control\\ctrlutil&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\control\\ctrldemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\help\\toolbox\\control\\examples&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\controllib\\engine&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\controllib\\engine\\options&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\controllib\\engine\\optim&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\controllib\\general&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\controllib\\graphics&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\controllib\\requirements&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\curvefit\\curvefit&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\curvefit\\splines&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\curvefit\\cftoolgui&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\curvefit\\sftoolgui&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\curvefit\\curvefitdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\optimlib&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\daq\\daq&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\daq\\daqguis&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\daq\\daqdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\daq\\daqblks\\daqblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\daq\\daqblks\\daqmasks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\daq\\daqblks\\daqmex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\dastudio&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\des\\desblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\des\\desmasks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\des\\desmex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\des\\desdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\distcomp&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\distcomp\\distcomp&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\distcomp\\user&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\distcomp\\mpi&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\distcomp\\pctdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\distcomp\\parallel&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\distcomp\\parallel\\util&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\distcomp\\lang&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\distcomp\\cluster&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\distcomp\\gpu&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\dotnetbuilder\\dotnetbuilder&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\dotnetbuilder\\dotnetbuilderdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\dsp\\dsp&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\dsp\\dsputilities&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\dsp\\dsputilities\\dspinit&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\dsp\\dsputilities\\dspmex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\dsp\\dspdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\filterdesignlib&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\system&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\dspblks\\dspblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\dspblks\\dspmex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\fixedpoint\\fixedpoint&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\help\\toolbox\\dsp\\examples&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\dsp\\filterdesign&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\eclipseide&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\eclipseide\\eclipseidedemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\eclipseide\\mdlinfo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\eclipseide\\registry&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\eclipseide\\tfl&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\edalink\\edalink&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\edalink\\foundation\\hdllink&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\edalink\\extensions\\modelsim\\modelsim&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\edalink\\extensions\\modelsim\\modelsimdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\edalink\\extensions\\incisive\\incisive&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\edalink\\extensions\\incisive\\incisivedemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\edalink\\extensions\\discovery\\discovery&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\edalink\\extensions\\discovery\\discoverydemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\tlmgenerator\\foundation&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\tlmgenerator\\foundation\\rtw&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\tlmgenerator\\foundation\\tlmgeneratordemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\eda\\edagraph&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\eda\\fil&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\eda\\fil\\fildemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\eda\\fpgaautomation&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\eda\\hdlparser&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\ecoder&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\ecoder\\ecoderdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\mpt&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\mpt\\mpt&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\mpt\\user_specific&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\embeddedcoder&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\eml\\eml&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\exlink&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\fixedpoint\\fidemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\fixedpoint\\fixedpointtool&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\spcuilib&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\siglib&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\fixpoint&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\fixpoint\\fpca&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\edalink\\extensions\\fpgaautomation\\fpgademos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ghsmulti&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ghsmulti\\multidemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ghsmulti\\mdlinfo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ghsmulti\\multiblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ghsmulti\\tfl&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ghsmulti\\rtw&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\hdlcoder\\hdlcoder&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\hdlcoder\\hdlcoder\\hdlwa&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\hdlcoder\\hdlcoderdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\hdlfilter\\hdlfilter&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\hdlfilter\\hdlfiltdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\iarew&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\iarew\\blks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\iarew\\iarewdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\iarew\\mdlinfo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\iarew\\templates&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\pjtgenerator&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\pjtgenerator\\rtw&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\pjtgenerator\\hookpoints&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\pjtgenerator\\tgtpref2&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\pjtgenerator\\profiler&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\pjtgenerator\\mdlinfo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\pjtgenerator\\blks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\pjtgenerator\\blks\\masks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\pjtgenerator\\blks\\tlc_c&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\pjtgenerator\\blks\\utils&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\autointerface&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\autointerface\\ideregisterplugins&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\util&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\errorhandler&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\lfsocket\\lfsocket&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\foundation\\xmakefile&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\idelinkdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\ident\\ident&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\ident\\nlident&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\ident\\idobsolete&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\ident\\idguis&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\ident\\idutils&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\ident\\iddemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\ident\\iddemos\\examples&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\ident\\idhelp&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\images\\colorspaces&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\images\\images&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\images\\imdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\images\\imuitools&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\images\\iptformats&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\images\\iptutils&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\imageslib&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\imaq\\imaq&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\imaqlib&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\imaq\\imaqdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\imaq\\imaqblks\\imaqblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\imaq\\imaqblks\\imaqmasks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\imaq\\imaqblks\\imaqmex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\instrument\\instrument&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\instrument\\instrumentdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\instrument\\instrumentblks\\instrumentblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\instrument\\instrumentblks\\instrumentmex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\instrument\\instrumentblks\\instrumentmasks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\sam\\m3i&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\slvnv\\simcoverage&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\mpc555dk&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\mpc555dk\\common\\configuration&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\mpc555dk\\mpc555demos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\mpc555dk\\mpc555dk&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\mpc555dk\\pil&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\mpc555dk\\rt\\blockset\\mfiles&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\mpc555dk\\rt\\blockset&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\optim\\optim&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\optim\\optimdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\data_manager\\data_manager&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\equation_language\\equation_language&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\foundation\\foundation&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\gl\\core\\m&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\gl\\sli\\m&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\logging\\base\\m&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\logging\\mli\\m&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\network_engine\\ne_support&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\network_engine\\network_engine&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\ne_sli\\ne_sli&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\pmir\\pmir&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\pm_sli\\pm_sli&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\powersys\\powersys&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\powersys\\DR\\DR&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\powersys\\drives\\drives&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\powersys\\facts\\facts&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\powersys\\DR\\DRdemo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\powersys\\drives\\drivesdemo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\powersys\\facts\\factsdemo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\powersys\\powerdemo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\simscape\\compiler\\core\\m&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\simscape\\compiler\\sli\\m&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\simscape\\simscapedemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\simscape\\engine\\core\\m&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\simscape\\engine\\mli\\m&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\simscape\\engine\\sli\\m&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\simscape\\foundation\\simscape&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\simscape_language\\simscape_language&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\simscape\\library\\m&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\simscape\\simscape\\m&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\simulation\\base\\m&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\physmod\\unit_manager\\unit_manager&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\slvnv\\reqmgt&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\slvnv\\slvnv&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\slvnv\\rmidemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rf\\rf&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rf\\rfdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rf\\rftool&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rfblks\\rfblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rfblks\\rfblksmasks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rfblks\\rfblksmex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rfblks\\rfblksdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rptgen\\rptgen&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rptgen\\rptgenv1&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rptgen\\rptgendemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rptgenext\\rptgenext&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rptgenext\\rptgenextv1&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rptgenext\\rptgenextdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\rptgen&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\rtwin\\rtwin&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\rtwin\\rtwindemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\rtwdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\rtwdemos\\rsimdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simulink\\blocks\\sb2sl&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\eml\\eml&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\sigbldr&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\slcontrollib&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\signal\\signal&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\signal\\sigtools&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\signal\\sptoolgui&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\signal\\sigdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simrf\\simrf&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simrf\\simrfmasks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\simrf\\simrfdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\help\\toolbox\\simrf\\examples&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\sl3d\\sl3d&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\sl3d\\sl3ddemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\slcontrol\\slcontrol&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\slcontrol\\slctrlguis&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\slcontrol\\slctrlutil&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\slcontrol\\slctrldemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\slcontrol\\slctrlobsolete&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\sldv&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\slvnv&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rptgenext\\slxmlcomp&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\stats\\stats&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\stats\\statsdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\stats\\classreg&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\statslib&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\symbolic\\symbolic&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\symbolic\\symbolicdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\targetdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\foundation&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\foundation\\utils&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\foundation\\blks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\foundation\\blks\\mex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\foundation\\blks\\masks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic2000&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic2000\\rtw&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic2000\\utils&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic2000\\blks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic2000\\blks\\mex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic2000\\blks\\masks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic2000\\tic2000demos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic6000&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic6000\\rtw&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic6000\\tfl&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic6000\\utils&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic6000\\blks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic6000\\blks\\mex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic6000\\blks\\sysobj_mex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic6000\\blks\\masks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic6000\\tic6000demos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\operatingsystem\\linux\\blks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\operatingsystem\\linux\\blks\\masks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\operatingsystem\\linux\\blks\\mex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\operatingsystem\\linux\\src&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\operatingsystem\\vxworks\\blks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\operatingsystem\\vxworks\\blks\\mex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\operatingsystem\\vxworks\\blks\\masks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\operatingsystem\\vxworks\\src&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\operatingsystem\\windows\\blks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\operatingsystem\\windows\\blks\\masks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\operatingsystem\\windows\\blks\\mex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\intelhost\\tfl&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\shared&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\shared\\ti&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\shared\\ti\\mdlinfo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\shared\\ti\\utils&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\shared\\ti\\blks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\shared\\ti\\blks\\mex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\shared\\ti\\blks\\masks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\etargets\\etargets&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\etargets\\etargets\\demoutils&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\testmeaslib&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\tasking\\tasking&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\tasking\\taskingdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rtw\\targets\\tasking\\tasking\\taskingblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\testmeaslib\\general&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\testmeaslib\\graphics&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\shared\\testmeaslib\\simulink&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic5000&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic5000\\blks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic5000\\blks\\mex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic5000\\blks\\masks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\target\\extensions\\processor\\tic5000\\tic5000demos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ticcs&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ticcs\\ccsblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ticcs\\ccsdemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ticcs\\ccsdemos\\util&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ticcs\\ccslinkblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ticcs\\ccslinkblks\\rtdxsimblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ticcs\\lic&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ticcs\\mdlinfo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ticcs\\tfl&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ticcs\\util&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ticcs\\rtw&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\ticcs\\envChecker&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\vision\\vision&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\vision\\visionutilities&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\vision\\visionutilities\\visioninit&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\vision\\visionutilities\\visionmex&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\vision\\visiondemos&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\help\\toolbox\\vision\\examples&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\wavelet\\wavelet&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\wavelet\\wmultisig1d&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\wavelet\\wavedemo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\wavelet\\compression&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\wrworkbench&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\wrworkbench\\mdlinfo&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\wrworkbench\\registry&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\idelink\\extensions\\wrworkbench\\wrworkbenchblks&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;directory&gt;${MATLAB_ROOT}\\toolbox\\rptgen\\xmlcomp&lt;/directory&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;/path&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;/matlab&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;platform&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;unix&gt;false&lt;/unix&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;mac&gt;false&lt;/mac&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;windows&gt;true&lt;/windows&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;win2k&gt;false&lt;/win2k&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;winxp&gt;true&lt;/winxp&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;vista&gt;false&lt;/vista&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;linux&gt;false&lt;/linux&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;solaris&gt;false&lt;/solaris&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;osver&gt;5.1&lt;/osver&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;os32&gt;true&lt;/os32&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;os64&gt;false&lt;/os64&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;arch&gt;win32&lt;/arch&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;matlab&gt;true&lt;/matlab&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;/platform&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;/configuration&gt;\n");&lt;br /&gt;        fprintf(_pOutMakeFile,"&lt;/deployment-project&gt;\n\n");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return nRetCode;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void PrintFileName(XMLNode xParentNode, LPCTSTR pszRootFolder)&lt;br /&gt;{&lt;br /&gt;    CString strRootFolder = pszRootFolder;&lt;br /&gt;&lt;br /&gt;    int n=xParentNode.nChildNode();&lt;br /&gt;    for( int i = 0; i &lt; n; i ++ )&lt;br /&gt;    {&lt;br /&gt;        XMLNode xNode = xParentNode.getChildNode(i);&lt;br /&gt;        if ( !strcmp(xNode.getName(), "File" ) )&lt;br /&gt;        {&lt;br /&gt;            const char *pcFileName = xNode.getAttribute("RelativePath");&lt;br /&gt;            char *pcNewStr = _strdup(pcFileName );&lt;br /&gt;&lt;br /&gt;            // Find the file extension&lt;br /&gt;            char *ext = strrchr(pcNewStr, '.');&lt;br /&gt;            if ( NULL != ext &amp;&amp; !strcmp(ext, ".m")) &lt;br /&gt;            {&lt;br /&gt;                CString strFullFilename;&lt;br /&gt;                BOOL bRelativePathToParentFolders;&lt;br /&gt;                CString strRelativePath = pcNewStr;&lt;br /&gt;&lt;br /&gt;                if (IsCurrentDirPath(&amp;strRelativePath)) &lt;br /&gt;                {&lt;br /&gt;                    CString strSubPath;&lt;br /&gt;                    // remove .\ and append path&lt;br /&gt;                    int pos = strRelativePath.Find("\\");&lt;br /&gt;                    int len = strRelativePath.GetLength();&lt;br /&gt;                 if ( pos &gt; 0 ) {&lt;br /&gt;                  strSubPath = strRelativePath.Right(len-pos-1);&lt;br /&gt;                 }&lt;br /&gt;                    // append&lt;br /&gt;                    strFullFilename = strRootFolder + strSubPath;&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                 strFullFilename = RelativePathToAbsolutePath(strRelativePath,strRootFolder, bRelativePathToParentFolders);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                fprintf(_pOutMakeFile,"&lt;file&gt;%s&lt;/file&gt;\n", strFullFilename.GetBuffer(0) );&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            free( pcNewStr );&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            PrintFileName(xNode,strRootFolder);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CString RelativePathToAbsolutePath(LPCTSTR contentRelativePath,LPCTSTR rootPath, BOOL &amp;bRelativePathToParentFolders)&lt;br /&gt;{&lt;br /&gt; CString strContentPath;&lt;br /&gt; CString strFullPath;&lt;br /&gt; CString tempPath = _T("");&lt;br /&gt;&lt;br /&gt; strContentPath.Format(_T("%s"),contentRelativePath);&lt;br /&gt; tempPath.Format(_T("%s"),contentRelativePath);&lt;br /&gt;&lt;br /&gt; // First let's convert to the right kind of path seps:&lt;br /&gt; strContentPath.Replace('/', PATH_SEPARATOR);&lt;br /&gt; CString fullPath = rootPath;&lt;br /&gt; int sepIndex = fullPath.ReverseFind(PATH_SEPARATOR);&lt;br /&gt;&lt;br /&gt; // put those together, and we've got our full path&lt;br /&gt; if (sepIndex &gt;= 0) &lt;br /&gt; {&lt;br /&gt;  BOOL gotPath = FALSE;&lt;br /&gt;  CString strAbsoluteFullPath;&lt;br /&gt;  bool bRelativeUp = false;&lt;br /&gt;&lt;br /&gt;  CString beginStr = strContentPath.Left(3);&lt;br /&gt;  bRelativeUp = ( beginStr.CompareNoCase(REL_PATH_STR_WIN) == 0 || beginStr.CompareNoCase(REL_PATH_STR_MAC) == 0 || beginStr.CompareNoCase(REL_PATH_STR_UNIX) == 0 );&lt;br /&gt;  bRelativePathToParentFolders = bRelativeUp;&lt;br /&gt;&lt;br /&gt;  strFullPath = fullPath.Left(sepIndex + 1);&lt;br /&gt;&lt;br /&gt;  if (!strContentPath.IsEmpty() &amp;&amp; strFullPath != contentRelativePath &amp;&amp; bRelativeUp) {&lt;br /&gt;   CString extension;&lt;br /&gt;   int period = strContentPath.ReverseFind('.');&lt;br /&gt;   if ( period &gt;= 0 )&lt;br /&gt;    extension = strContentPath.Right(strContentPath.GetLength()-period-1);&lt;br /&gt;&lt;br /&gt;   if ( (extension.GetLength() == 3) || (extension.GetLength() == 1)) {&lt;br /&gt;    //strContentPath.Replace(_T("..\\"), _T(".\\"));&lt;br /&gt;    CreateFullPath(&amp;strAbsoluteFullPath, strFullPath, strContentPath);&lt;br /&gt;    strFullPath = strAbsoluteFullPath;&lt;br /&gt;    strFullPath.Replace('/', PATH_SEPARATOR);&lt;br /&gt;&lt;br /&gt;    gotPath = FileExist(strFullPath);&lt;br /&gt;    if (gotPath)&lt;br /&gt;     return strFullPath;&lt;br /&gt;    else&lt;br /&gt;     return CString(_T(""));&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;    return CString(_T(""));&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;   int sepIndex = strContentPath.ReverseFind(PATH_SEPARATOR);&lt;br /&gt;   if (sepIndex &gt;= 0) {&lt;br /&gt;    // We have a full path already&lt;br /&gt;    gotPath = FileExist(strContentPath);&lt;br /&gt;    if (gotPath)&lt;br /&gt;     return strContentPath;&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   // We have a relative path (subfolder)&lt;br /&gt;   CString extension = _T("");&lt;br /&gt;   int period = strContentPath.ReverseFind('.');&lt;br /&gt;   if ( period &gt;= 0 )&lt;br /&gt;    extension = strContentPath.Right(strContentPath.GetLength()-period-1);&lt;br /&gt;&lt;br /&gt;   if (extension.GetLength() == 3) {&lt;br /&gt;    // single file name no sub folder&lt;br /&gt;    strFullPath = strFullPath + strContentPath;&lt;br /&gt;    gotPath = FileExist(strFullPath);&lt;br /&gt;    if (gotPath)&lt;br /&gt;     return strFullPath;&lt;br /&gt;    else&lt;br /&gt;     return CString(_T(""));&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; } &lt;br /&gt; else &lt;br /&gt; {&lt;br /&gt;  strFullPath = fullPath;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; strFullPath += tempPath;&lt;br /&gt;&lt;br /&gt; return strFullPath;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;This will solve the following issue :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/1790417/matlab-deployment-add-files-to-source-control"&gt;http://stackoverflow.com/questions/1790417/matlab-deployment-add-files-to-source-control&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now let's look at a sample Matlab script which can be converted to an assembly.&lt;br /&gt;&lt;br /&gt;Follow the following link&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c"&gt;http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is a big problem when targeting .NET 4.0 for a client referencing a generated assembly targeting .NET 4.0 as far as I am concerned which should be fixed ASAP by Mathworks. This problem still remains with Matlab R2011a. &lt;br /&gt;A C# client targeting .NET 4.0 will not run on Windows 7 64 bit. When the C# client will try to instantiate the class wrapper for the generated Matlab assembly using new, an exception will be thrown. Only  32  bit OS such as the old Windows XP will support both the .NET Framework 2.0 and 4.0. But not Windows 7 64 bit running as 32 bit. There is a dependency with .NET 2.0 for MWArray.dll at least I can't find the v4 version anywhere under C:\MATLAB\R2011a. Because .NET Framework 2.0 won't install on Windows 7 64 bit, I highly request the Mathworks folks to release MWArray.dll for .NET 4.0 and create a dependency with the 4.0 version when building the assembly. I always check target 4.0 but the dependency is still the 2.0. Maybe this is a fallback and I am missing the 4.0 version or maybe it is not supported.&lt;br /&gt;&lt;br /&gt;Deployment Runtime&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mathworks.com/help/toolbox/compiler/f12-999353.html"&gt;http://www.mathworks.com/help/toolbox/compiler/f12-999353.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-8032873833423547638?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/8032873833423547638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=8032873833423547638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8032873833423547638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8032873833423547638'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/11/matlab-relative-path-issue-in-prj.html' title='Matlab relative path issue in prj and MWArray.dll nightmare on Windows 7 64 bit'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-6743798367730704730</id><published>2011-11-03T00:16:00.000-07:00</published><updated>2011-11-03T00:17:05.696-07:00</updated><title type='text'>Google engineer Steve Yegge let the frustration fly in a post regarding the Mountain View's plucky social network</title><content type='html'>http://www.minyanville.com/dailyfeed/2011/10/13/google-engineer-calls-google-a/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-6743798367730704730?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/6743798367730704730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=6743798367730704730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6743798367730704730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6743798367730704730'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/11/google-engineer-steve-yegge-let.html' title='Google engineer Steve Yegge let the frustration fly in a post regarding the Mountain View&apos;s plucky social network'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-7508663893527683894</id><published>2011-11-01T23:35:00.001-07:00</published><updated>2011-11-01T23:35:53.516-07:00</updated><title type='text'>Really adobe</title><content type='html'>One update every two months.... Give me break!!!!&lt;br /&gt;&lt;br /&gt;Sept 13, 2011 10.1.1 Q Latest release. This a regular quarterly update with security enhancements, improvements to stability, and bug fixes.&lt;br /&gt;Jun 14, 2011 10.1 Q This is a major update that provides security fixes, feature updates, and major enhancements such as Protected View for Acrobat.&lt;br /&gt;Apr 21, 2011 10.0.3 OOC This patch fixes a vulnerability and provides an updated Flash player.&lt;br /&gt;Mar 21, 2011 10.0.2 OOC This patch fixes a vulnerability and provides an updated Flash player.&lt;br /&gt;Feb 8 2011 10.0.1 Q Numerous security fixes as well as improvements to Protected Mode, QTP support, Flash, and support for SCCM via newly released SCUP catalogs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-7508663893527683894?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/7508663893527683894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=7508663893527683894' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7508663893527683894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7508663893527683894'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/11/really-adobe.html' title='Really adobe'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-3017168225096509269</id><published>2011-11-01T19:06:00.000-07:00</published><updated>2011-11-01T19:18:29.545-07:00</updated><title type='text'>Convert Mathlab to C# assembly</title><content type='html'>Step 1 Install Mathlab 2011&lt;br /&gt;&lt;br /&gt;Step 2 Install Visual Studio 2010&lt;br /&gt;&lt;br /&gt;Step 3 native compiler&lt;br /&gt;&lt;br /&gt;make sure you runmex -setup to select your target C++ compiler &lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-l2qEVm-sJa8/TrCoZ4DGsiI/AAAAAAAAARI/cRMa1_eZUmA/s1600/mex-setup.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 147px;" src="http://4.bp.blogspot.com/-l2qEVm-sJa8/TrCoZ4DGsiI/AAAAAAAAARI/cRMa1_eZUmA/s320/mex-setup.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5670217093355057698" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Step 4 To create an Assembly launch Mathlab 2011 &lt;br /&gt;&lt;br /&gt;Select New Deployment Project then select the target Type&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-aN9Ex2WBfr8/TrCnvimCckI/AAAAAAAAAQ8/yv0StSFFgLY/s1600/Deploy_Mathlab.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 202px;" src="http://3.bp.blogspot.com/-aN9Ex2WBfr8/TrCnvimCckI/AAAAAAAAAQ8/yv0StSFFgLY/s320/Deploy_Mathlab.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5670216366041494082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Step 5 Finally build .NET Assembly&lt;br /&gt;&lt;br /&gt;The sub folder will contain the Assembly DLL and Native DLL&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-3017168225096509269?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/3017168225096509269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=3017168225096509269' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/3017168225096509269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/3017168225096509269'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/11/convert-mathlab-to-c-assembly.html' title='Convert Mathlab to C# assembly'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-l2qEVm-sJa8/TrCoZ4DGsiI/AAAAAAAAARI/cRMa1_eZUmA/s72-c/mex-setup.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-7129216808975826155</id><published>2011-11-01T14:05:00.000-07:00</published><updated>2011-11-01T14:30:52.151-07:00</updated><title type='text'>Small, simple, cross-platform, free and fast  C++ XML Parser</title><content type='html'>Small, simple, cross-platform, free and fast  C++ XML Parser &lt;br /&gt;&lt;br /&gt;Business Intelligence &lt;br /&gt;TIMi added value &lt;br /&gt;This project started from his frustration that he could not find any simple, portable XML Parser to use inside all my projects (for example, inside the award-winning TIMi software suite created by the Business-Insight company). Let's look at the well-known Xerces C++ library: The complete Xerces project is 53 MB! (11 MB compressed in a zipfile). In 2003, He was developping many small tools. He was using XML as standard for all my input/ouput configuration and data files. The source code of his small tools was usually around 600KB. In these conditions, don't you think at 53MB to be able to read an XML file is a little bit "too much"? So he created his own XML parser. His XML parser "library" is composed of only 2 files: a .cpp file and a .h file. The total size is 104 KB &lt;br /&gt;&lt;br /&gt;Here is how it works: The XML parser loads a full XML file in memory, it parses the file and it generates a tree structure representing the XML file. Of course, you can also parse XML data that you have already stored yourself into a memory buffer. Thereafter, you can easily "explore" the tree to get your data. You can also modify the tree using "add" and "delete" functions &lt;br /&gt;and regenerate a formatted XML string from a subtree. Memory management is totally transparent through the use of smart pointers (in other words, you will never have to do any new, delete, malloc or free)("Smart pointers" are a primitive version of the garbage collector in Java).&lt;br /&gt;&lt;br /&gt;To the best of his knowledge, there exists no other "non-validating C++ XML parser" that is as simple and as powerfull.&lt;br /&gt;&lt;br /&gt;Well Tiny XML is pretty powerful too!&lt;br /&gt;&lt;br /&gt;Here are the characteristics of the XMLparser library:&lt;br /&gt;&lt;br /&gt;Non-validating XML parser written in standard C++ (DTD's or XSD's informations are ignored). &lt;br /&gt;&lt;br /&gt;Cross-plateform: the library is currently used every day on Solaris, Linux (32bit and 64bit) and Windows to manipulate "small" PMML documents (10 MB).&lt;br /&gt;The library has been tested and is working flawlessly using the following compilers: gcc (under linux, Mac OS X Tiger and under many unix flavours), Visual Studio 6.0, Visual Studio .NET (under Windows 9x,NT,2000,XP,Vista,CE,mobile), Intel C/C++ compiler, SUN CC compiler, C++ Borland Compiler. The library is also used under Apple OS, iPhone/iPad OS, Amiga OS, QNX and under the Netburner plateform. To the best of my knowledge, i think that all plateforms are now supported. &lt;br /&gt;The parser builds a tree structure that you can "explore" easily (DOM-type parser). &lt;br /&gt;The parser can be used to generate XML strings from subtrees (it's called rendering). You can also save subtrees directly to files (automatic "Byte Order Mark"-BOM support). &lt;br /&gt;Modification or "from scratch creation" of large XML tree structures in memory using funtions like addChild, addAttribute, updateAttribute, deleteAttribute,... &lt;br /&gt;It's SIMPLE: no need to learn how to use dozens of classes: there is only one simple class: the 'XMLNode' class (that represents one node of the XML tree). &lt;br /&gt;&lt;br /&gt;Very efficient (Efficiency is required to be able to handle BIG files): &lt;br /&gt;The string parser is very efficient: It does only one pass over the XML string to create the tree. It does the minimal amount of memory allocations. For example: it does NOT use slow STL::String class but plain, simple and fast C malloc 's. It also allocates large chunk of memory instead of many small chunks. Inside Visual C++, the "debug versions" of the memory allocation functions are very slow: Do not forget to compile in "release mode" to get maximum speed. &lt;br /&gt;The "tree exploration" is very efficient because all operations on the 'XMLNode' class are handled through references: there are no memory copy, no memory allocation, never. &lt;br /&gt;&lt;br /&gt;The XML string rendering is very efficient: It does one pass to compute the total memory size of the XML string and a second pass to actually create the string. There is thus only one memory allocation and no extra memory copy. Other libraries are slower because they are using the string concatenation operator that requires many memory (re-)allocations and memory copy. &lt;br /&gt;&lt;br /&gt;In-memory parsing &lt;br /&gt;Supports XML namespaces &lt;br /&gt;Very small and totally stand-alone (not built on top of something else). Uses only standard &lt;stdio.h&gt; library (and only for the 'fopen' and the 'fread' functions to load the XML file). &lt;br /&gt;&lt;br /&gt;Easy to integrate into you own projects: it's only 2 files! The .h file does not contain any implementation code. Compilation is thus very fast. &lt;br /&gt;Robust. &lt;br /&gt;Optionnally, if you define the C++ prepocessor directives STRICT_PARSING and/or APPROXIMATE_PARSING, the library can be "forgiving" in case of errors inside the XML. &lt;br /&gt;&lt;br /&gt;He has tried to respect the XML-specs given at: http://www.w3.org/TR/REC-xml/ &lt;br /&gt;Fully integrated error handling : &lt;br /&gt;The string parser gives you the precise position and type of the error inside the XML string (if an error is detected). &lt;br /&gt;The library allows you to "explore" a part of the tree that is missing. However data extracted from "missing subtrees" will be NULL. This way, it's really easy to code "error handling" procedures. &lt;br /&gt;&lt;br /&gt;Thread-safe (however the global parameters "guessUnicodeChar" and"strictUTF8Parsing" must be unique because they are shared by all threads). &lt;br /&gt;Full Native Supports for a wide range of character sets &amp; encodings: ANSI (legacy) / UTF-8 / Shift-JIS / GB2312 / Big5 / GBK. &lt;br /&gt;Under Windows, Linux, Linux 64 bits &amp; Solaris, they have additionnaly: Unicode 16bit / Unicode 32bit widechar characters support that includes: &lt;br /&gt;For the unicode version of the library: Automatic conversion to Unicode before parsing (if the input XML file is standard ansi 8bit characters). &lt;br /&gt;For the ascii version of the library: Automatic conversion to legacy or UTF-8 before parsing (if the input XML file is unicode 16 or 32bit wide characters). &lt;br /&gt;&lt;br /&gt;The XMLParser library is able to handle successfuly chinese, japanese, cyrilic and other extended characters thanks to an extended UTF-8 encoding support, Shift-JIS (japanese) and to GB2312/Big5/GBK encoding support (chinese) (see this UTF-8-demo that shows the characters available). If you are still experiencing character encoding problems, he suggest you to convert your XML files to UTF-8 using a tool like iconv (precompiled win32 binary). &lt;br /&gt;&lt;br /&gt;Transparent memory management through the use of smart pointers. &lt;br /&gt;&lt;br /&gt;Support for a wide range of clearTags that are containing unformatted text:&lt;br /&gt;{![CDATA[ ... ]]}, {!-- ... --}, {PRE} ... {/PRE}, {!DOCTYPE ... } &lt;br /&gt;Unformatted texts are not parsed by the library and can contain items that are usually 'forbidden' in XML (for example: html code) &lt;br /&gt;Support for inclusion of pure binary data (images, sounds,...) into the XML document using the four provided ultrafast Base64 conversion functions. &lt;br /&gt;The library is under the Aladdin Free Public License(AFPL).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A small tutorial&lt;br /&gt;Let's assume that you want to parse the XML file "PMMLModel.xml" that contains:&lt;br /&gt;( all &lt; replace by { and all &gt; replace by } ) &lt;br /&gt;&lt;br /&gt;{?xml version="1.0" encoding="ISO-8859-1"?&gt;&lt;br /&gt;{PMML version="3.0"  xmlns="http://www.dmg.org/PMML-3-0"  xmlns:xsi="http://www.w3.org/2001/XMLSchema_instance"}  &lt;br /&gt;{Header copyright="Frank Vanden Berghen"}&lt;br /&gt;     Hello World!     &lt;br /&gt;{Application name="&amp;lt;Condor&gt;" version="1.99beta" /}  &lt;br /&gt;{/Header}&lt;br /&gt;  {Extension name="keys"} &lt;br /&gt;    {Key name="urn"}{/Key} &lt;br /&gt;  {/Extension}  &lt;br /&gt;{DataDictionary}    &lt;br /&gt;{DataField name="persfam" optype="continuous" dataType="double"}&lt;br /&gt; {Value value="9.900000e+001" property="missing" /}&lt;br /&gt;{/DataField}    &lt;br /&gt;{DataField name="prov" optype="continuous" dataType="double" /}    &lt;br /&gt;{DataField name="urb" optype="continuous" dataType="double" /}   &lt;br /&gt;{DataField name="ses" optype="continuous" dataType="double" /}  &lt;br /&gt;{/DataDictionary}  &lt;br /&gt;{RegressionModel functionName="regression" modelType="linearRegression"}    {RegressionTable intercept="0.00796037"}      &lt;br /&gt;{NumericPredictor name="persfam" coefficient="-0.00275951" /}      &lt;br /&gt;{NumericPredictor name="prov" coefficient="0.000319433" /}&lt;br /&gt;{NumericPredictor name="ses" coefficient="-0.000454307" /}&lt;br /&gt;{NONNumericPredictor name="testXmlExample" /&gt;    &lt;br /&gt;{/RegressionTable}  &lt;br /&gt;{/RegressionModel}&lt;br /&gt;{/PMML}&lt;br /&gt;&lt;br /&gt;Let's analyse line by line the following small example program: &lt;br /&gt;&lt;br /&gt;#include &lt;stdio.h&gt;    // to get "printf" function&lt;br /&gt;#include &lt;stdlib.h&gt;   // to get "free" function&lt;br /&gt;#include "xmlParser.h"&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;  // this open and parse the XML file:  &lt;br /&gt;XMLNode xMainNode=XMLNode::openFileHelper("PMMLModel.xml","PMML");&lt;br /&gt;  // this prints "&lt;Condor&gt;":&lt;br /&gt;XMLNode xNode=xMainNode.getChildNode("Header");&lt;br /&gt; printf("Application Name is: '%s'\n", xNode.getChildNode("Application").getAttribute("name"));  &lt;br /&gt;  // this prints "Hello world!":&lt;br /&gt;printf("Text inside Header tag is :'%s'\n", xNode.getText());&lt;br /&gt;  // this gets the number of "NumericPredictor" tags:  xNode=xMainNode.getChildNode("RegressionModel").getChildNode("RegressionTable");&lt;br /&gt;  int n=xNode.nChildNode("NumericPredictor");&lt;br /&gt;  // this prints the "coefficient" value for all the "NumericPredictor" tags:  &lt;br /&gt;for (int i=0; i&lt;n; i++)&lt;br /&gt;    printf("coeff %i=%f\n",i+1,atof(xNode.getChildNode("NumericPredictor",i).getAttribute("coefficient")));&lt;br /&gt;  // this prints a formatted ouput based on the content of the first "Extension" tag of the XML file:  &lt;br /&gt;char *t=xMainNode.getChildNode("Extension").createXMLString(true);  printf("%s\n",t);  &lt;br /&gt;free(t);&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-7129216808975826155?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/7129216808975826155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=7129216808975826155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7129216808975826155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7129216808975826155'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/11/small-simple-cross-platform-free-and.html' title='Small, simple, cross-platform, free and fast  C++ XML Parser'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-7553367196570330946</id><published>2011-10-20T14:36:00.001-07:00</published><updated>2011-10-20T14:38:16.837-07:00</updated><title type='text'>XML Parser using XmlReader from an XML string in C#</title><content type='html'>System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();&lt;br /&gt;Byte[] pBytes = encoding.GetBytes(strXML);&lt;br /&gt;MemoryStream pMem = new MemoryStream(pBytes, 0, pBytes.Length, true, true); &lt;br /&gt;XmlReader reader = XmlReader.Create(pMem); &lt;br /&gt;string s = Encoding.UTF8.GetString(pMem.GetBuffer(), 0, (int)pMem.Position);&lt;br /&gt;XmlElement element;&lt;br /&gt;XmlDocument xmlDoc = new XmlDocument();&lt;br /&gt;pMem.Seek(0, SeekOrigin.Begin);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;while (reader.Read())&lt;br /&gt;{&lt;br /&gt;    XmlNode node = null;&lt;br /&gt;    switch (reader.NodeType)&lt;br /&gt;    {&lt;br /&gt;        case XmlNodeType.Element:&lt;br /&gt;            bool fEmptyElement = reader.IsEmptyElement;&lt;br /&gt;            element = xmlDoc.CreateElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);&lt;br /&gt;            //element.IsEmpty = fEmptyElement;&lt;br /&gt;            //ReadAttributes(reader, element);&lt;br /&gt;            //if (!fEmptyElement) {&lt;br /&gt;            //parent.AppendChild(element);&lt;br /&gt;            //parent = element; &lt;br /&gt;            //continue;&lt;br /&gt;            //} &lt;br /&gt;            //node = element;&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;        case XmlNodeType.EndElement:&lt;br /&gt;            //if (parent.ParentNode == null) &lt;br /&gt;            //{&lt;br /&gt;            // syntax error in document.&lt;br /&gt;            //    IXmlLineInfo li = (IXmlLineInfo)reader;&lt;br /&gt;            //    throw new XmlException(string.Format(SR.UnexpectedToken,"&lt;/"+reader.LocalName+"&gt;", li.LineNumber, li.LinePosition), null, li.LineNumber, li.LinePosition);&lt;br /&gt;            //    }&lt;br /&gt;            //parent = parent.ParentNode;&lt;br /&gt;            continue;&lt;br /&gt;&lt;br /&gt;        case XmlNodeType.EntityReference:&lt;br /&gt;            if (reader.CanResolveEntity)&lt;br /&gt;            {&lt;br /&gt;                reader.ResolveEntity();&lt;br /&gt;            }&lt;br /&gt;            continue;&lt;br /&gt;&lt;br /&gt;        case XmlNodeType.EndEntity:&lt;br /&gt;            continue;&lt;br /&gt;&lt;br /&gt;        case XmlNodeType.Attribute:&lt;br /&gt;            //node = LoadAttributeNode(parent);&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;        case XmlNodeType.Text:&lt;br /&gt;            node = xmlDoc.CreateTextNode(reader.Value);&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;        case XmlNodeType.SignificantWhitespace:&lt;br /&gt;            node = xmlDoc.CreateSignificantWhitespace(reader.Value);&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;        case XmlNodeType.Whitespace:&lt;br /&gt;            //if (preserveWhitespace) {&lt;br /&gt;            //    node = xmlDoc.CreateWhitespace(reader.Value);&lt;br /&gt;            //    break;&lt;br /&gt;            //} &lt;br /&gt;            //else {&lt;br /&gt;            //continue;&lt;br /&gt;            //}&lt;br /&gt;            continue;&lt;br /&gt;        case XmlNodeType.CDATA:&lt;br /&gt;            node = xmlDoc.CreateCDataSection(reader.Value);&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;        case XmlNodeType.XmlDeclaration:&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;        case XmlNodeType.ProcessingInstruction:&lt;br /&gt;            node = xmlDoc.CreateProcessingInstruction(reader.Name, reader.Value);&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;        case XmlNodeType.Comment:&lt;br /&gt;            node = xmlDoc.CreateComment(reader.Value);&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;        case XmlNodeType.DocumentType:&lt;br /&gt;             string pubid = r.GetAttribute("PUBLIC");&lt;br /&gt;             string sysid = r.GetAttribute("SYSTEM");&lt;br /&gt;             node = xmlDoc.CreateDocumentType(reader.Name, pubid, sysid, reader.Value);&lt;br /&gt;             break;&lt;br /&gt;&lt;br /&gt;        default:&lt;br /&gt;             //UnexpectedNodeType(reader.NodeType);&lt;br /&gt;            break;&lt;br /&gt;    }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-7553367196570330946?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/7553367196570330946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=7553367196570330946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7553367196570330946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7553367196570330946'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/10/xml-parser-using-xmlreader-from-xml.html' title='XML Parser using XmlReader from an XML string in C#'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-101889154559680583</id><published>2011-10-19T00:51:00.001-07:00</published><updated>2011-10-19T00:54:02.886-07:00</updated><title type='text'>will developers adopt adobe flash 11</title><content type='html'>&lt;a href="http://bits.blogs.nytimes.com/2011/09/21/will-developers-adopt-adobe-flash-11/"&gt;http://bits.blogs.nytimes.com/2011/09/21/will-developers-adopt-adobe-flash-11/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://alternativaplatform.com/en/showcase/"&gt;http://alternativaplatform.com/en/showcase/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-101889154559680583?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/101889154559680583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=101889154559680583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/101889154559680583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/101889154559680583'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/10/will-developers-adopt-adobe-flash-11.html' title='will developers adopt adobe flash 11'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-8223154020246488133</id><published>2011-10-17T15:38:00.000-07:00</published><updated>2011-10-20T14:56:35.634-07:00</updated><title type='text'>SearchIndexer.exe really suck !!!</title><content type='html'>Will slow down your computer bit time....&lt;br /&gt;Will suck 1 GB of memory in less than 5 minutes....&lt;br /&gt;&lt;br /&gt;Whoever wrote this at Microsoft should be fire!!!&lt;br /&gt;&lt;br /&gt;Turn off indexing and speed up Windows XP&lt;br /&gt;If you don't use Windows XP's built-in search often (like every day), disabling indexing can significantly speed up your PC.&lt;br /&gt;&lt;br /&gt;By default Windows XP indexes files on your hard drive and stores them in memory to speed up its' built-in search. But if you rarely use Windows search, turn off indexing to free up memory and CPU horsepower for the files and applications you actually do use. A few simple how-to steps after the jump.&lt;br /&gt;&lt;br /&gt;To turn off indexing:&lt;br /&gt;&lt;br /&gt;Open up "My Computer." &lt;br /&gt;Right-click on your hard drive (usually "C:") and choose "Properties." &lt;br /&gt;Uncheck the box at the bottom that reads "Allow Indexing Service to..." &lt;br /&gt;Click OK, and files will be removed from memory. This removal may take a few minutes to complete. &lt;br /&gt;To disable the indexing service:&lt;br /&gt;&lt;br /&gt;In the "Start" menu, choose "Run." &lt;br /&gt;Type "services.msc" and press Enter. &lt;br /&gt;Scroll-down to "Indexing Service" and double-click it. &lt;br /&gt;If the service status is "Running", then stop it by pressing the "Stop" button. &lt;br /&gt;To make sure this service doesn't run again, under "Startup Type:", choose "Disabled." &lt;br /&gt;Windows search will still work if you perform these steps, but it will work more slowly than if indexing was enabled.&lt;br /&gt;&lt;br /&gt;Brute force WTF (aka What The Fuck!)&lt;br /&gt;&lt;br /&gt;And to avoid rebooting the machine kill the process searchindexer.exe point to C:\WINDOWS\system32 and rename searchindexer.exe to searchindexer.exe.old.&lt;br /&gt;This time you should be good. If you don't rename searchindexer.exe process will be automatically restarted....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-8223154020246488133?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/8223154020246488133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=8223154020246488133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8223154020246488133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8223154020246488133'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/10/searchindexerexe-really-suck.html' title='SearchIndexer.exe really suck !!!'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-1827513453021402917</id><published>2011-10-13T18:33:00.001-07:00</published><updated>2011-10-14T20:31:23.590-07:00</updated><title type='text'>Farewell Dennis Ritchie</title><content type='html'>int main( int argc, char **argv )&lt;br /&gt;{&lt;br /&gt;   printf( "Goodbye, world. :(\n" );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;L'eulogie par Bjarne Stroustrup:&lt;br /&gt;&lt;br /&gt;"&lt;br /&gt;Before C, there was far more hardware diversity than we see in the&lt;br /&gt;industry today. Computers proudly sported not just deliciously&lt;br /&gt;different and offbeat instruction sets, but varied wildly in almost&lt;br /&gt;everything, right down to even things as fundamental as character bit&lt;br /&gt;widths (8 bits per byte doesn’t suit you? how about 9? or 7? or how&lt;br /&gt;about sometimes 6 and sometimes 12?) and memory addressing (don’t like&lt;br /&gt;16-bit pointers? how about 18-bit pointers, and oh by the way those&lt;br /&gt;aren’t pointers to bytes, they’re pointers to words?).&lt;br /&gt;&lt;br /&gt;There was no such thing as a general-purpose program that was both&lt;br /&gt;portable across a variety of hardware and also efficient enough to&lt;br /&gt;compete with custom code written for just that hardware. Fortran did&lt;br /&gt;okay for array-oriented number-crunching code, but nobody could do it&lt;br /&gt;for general-purpose code such as what you’d use to build just about&lt;br /&gt;anything down to, oh, say, an operating system.&lt;br /&gt;&lt;br /&gt;So this young upstart whippersnapper comes along and decides to try to&lt;br /&gt;specify a language that will let people write programs that are: (a)&lt;br /&gt;high-level, with structures and functions; (b) portable to just about&lt;br /&gt;any kind of hardware; and (c) efficient on that hardware so that&lt;br /&gt;they’re competitive with handcrafted nonportable custom assembler code&lt;br /&gt;on that hardware. A high-level, portable, efficient systems&lt;br /&gt;programming language.&lt;br /&gt;&lt;br /&gt;How silly. Everyone knew it couldn’t be done.&lt;br /&gt;&lt;br /&gt;C is a poster child for why it’s essential to keep those people who&lt;br /&gt;know a thing can’t be done from bothering the people who are doing it.&lt;br /&gt;(And keep them out of the way while the same inventors, being anything&lt;br /&gt;but lazy and always in search of new problems to conquer, go on to use&lt;br /&gt;the world’s first portable and efficient programming language to build&lt;br /&gt;the world’s first portable operating system, not knowing that was&lt;br /&gt;impossible too.)&lt;br /&gt;&lt;br /&gt;Thanks, Dennis.&lt;br /&gt;"&lt;br /&gt;&lt;br /&gt;https://plus.google.com/u/0/101960720994009339267/posts/33mmANQZDtY&lt;br /&gt;&lt;br /&gt;The UNIX Time-Sharing System&lt;br /&gt;http://www.alcatel-lucent.com/bstj/vol57-1978/articles/bstj57-6-1905.pdf&lt;br /&gt;&lt;br /&gt;UNIX Time-Sharing System: A Retrospective&lt;br /&gt;http://www.alcatel-lucent.com/bstj/vol57-1978/articles/bstj57-6-1947.pdf&lt;br /&gt;&lt;br /&gt;UNIX Time-Sharing System: The C Programming Language&lt;br /&gt;http://www.alcatel-lucent.com/bstj/vol57-1978/articles/bstj57-6-1991.pdf&lt;br /&gt;&lt;br /&gt;http://geektionnerd.net/un-genie-est-mort/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-1827513453021402917?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/1827513453021402917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=1827513453021402917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1827513453021402917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1827513453021402917'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/10/farewell-dennis-ritchie.html' title='Farewell Dennis Ritchie'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-851864029473005863</id><published>2011-10-07T18:18:00.001-07:00</published><updated>2011-10-09T18:32:15.665-07:00</updated><title type='text'>Farewell Steve</title><content type='html'>I remember when it all started, moving that turtle around on the screen in elementary school using Logo then came the Apple I.&lt;br /&gt;  &lt;br /&gt;I remember programming Basic on an Apple ][ playing, karateka, sorcelery choplifter and loderunner.&lt;br /&gt;&lt;br /&gt;I remember playing chess master on the mac+ of my uncle.&lt;br /&gt;&lt;br /&gt;I remember beeing impressed by the 16 millions color of the Next Cube and it's DSP processor and I remember looking at the Next computer in Reims and drooling  on being able to compile anything on it.&lt;br /&gt;&lt;br /&gt;I remember seeing Toy Story and some cool pixar CGI done with renderman.&lt;br /&gt;&lt;br /&gt;I remember working on a car adapter for the iPod at Motorola when the stock rise begin&lt;br /&gt;&lt;br /&gt;I remember the simplicity of the iPod Touch.&lt;br /&gt;&lt;br /&gt;I remember trading an iPod touch against two Adobe products to listen to music in my car after quite some resistence.  &lt;br /&gt;&lt;br /&gt;I remember comparing Microsoft, Google, Apple and the NASDAQ chart on yahoo and Google finance  web site and see how Apple reaches 400$ and became the largest company in US by passing Chevron. &lt;br /&gt;&lt;br /&gt;I remember enjoying writing COCOA code for Adobe on a very slick Mac Book Pro 17 inch.&lt;br /&gt;&lt;br /&gt;I remember seeing Steve so incredibly excited to give a “small token” of appreciation at the Apple all-hands by giving everyone an iPod shuffle.&lt;br /&gt;&lt;br /&gt;I remember the war between Apple and Adobe around Flash and in the end I think you made the right decision and left an open window for  engineer to replace FLash by HTML5.&lt;br /&gt;  &lt;br /&gt;I remember seeing the words pancreatic cancer on the internet.&lt;br /&gt;&lt;br /&gt;I remember my first iPhone 4 and that I will have an iPad soon :)&lt;br /&gt;  &lt;br /&gt;I remember my optimism and the world optimisim of seeing Steve beating this thing like Phil Lesh, the bassist of the Grateful Dead who defeated prostate cancer.  This is sad to see that the one-year relative survival rate for pancreatic cancer is 20%, and the five-year rate is 4%.&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;This week many folks stopped by the Apple campus to pay some respects and remember Steve. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The parking lot was packed. There was some security, a bench with some flowers, some candles, and an iPad with the photo of Steve on the display.&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;Silence, Sadness and Loss.&lt;br /&gt;&lt;br /&gt;Steve touched our lives in so many personal, and emotional ways. Thanks you for being different and a genius leader!&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;You will be missed Steve!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cnn.com/2011/10/05/us/obit-steve-jobs/index.html"&gt;http://www.cnn.com/2011/10/05/us/obit-steve-jobs/index.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-851864029473005863?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/851864029473005863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=851864029473005863' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/851864029473005863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/851864029473005863'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/10/farewell-steve.html' title='Farewell Steve'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-1695634552140512329</id><published>2011-09-15T11:25:00.000-07:00</published><updated>2011-09-15T11:26:02.447-07:00</updated><title type='text'>Microsoft jettisons Flash with 'plug-in free' Windows 8 Metro IE10</title><content type='html'>http://www.appleinsider.com/articles/11/09/15/microsoft_to_jettison_adobe_flash_with_plug_in_free_browsing_in_windows_8_metro_ie10.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-1695634552140512329?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/1695634552140512329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=1695634552140512329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1695634552140512329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1695634552140512329'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/09/microsoft-jettisons-flash-with-plug-in.html' title='Microsoft jettisons Flash with &apos;plug-in free&apos; Windows 8 Metro IE10'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-6037396834557280684</id><published>2011-09-09T14:13:00.000-07:00</published><updated>2011-09-12T14:36:13.109-07:00</updated><title type='text'>Electric Commander PERL system call limition</title><content type='html'>If you ever wanted to execute a UI process on Windows using an Electric Commander step written in perl you will realize that you can only execute binary using STD IO in case your agent is running as a service.&lt;br /&gt;One reason is that Electric commander will pipe all STD IO to its internal logging mecanism associated to each JOB you are running for each STEP. &lt;br /&gt;&lt;br /&gt;Complete reason has been posted here&lt;br /&gt;&lt;a href="https://electriccloud.zendesk.com/entries/64647-kbec-00037-running-steps-that-require-an-interactive-windows-desktop-on-the-agent-machine"&gt;https://electriccloud.zendesk.com/entries/64647-kbec-00037-running-steps-that-require-an-interactive-windows-desktop-on-the-agent-machine&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The only workaround I found is to implement an IOCP WIN32 service that you can use to send message using SOCKET. At this point the IOCP WIN32 service can execute the native application including complex application which may require OLE AUTOMATION. EG Itunes :), Microsoft Excel, etc...&lt;br /&gt;&lt;br /&gt;Will not work&lt;br /&gt;&lt;br /&gt;my $exePath = 'C:/Program Files/Notepad++/Notepad++.exe';&lt;br /&gt;print "Execute $exePath \n";&lt;br /&gt;$exitCode = system($exePath );&lt;br /&gt;&lt;br /&gt;The process is spawn. I can see it using the Task Manager under Process tab but the Process doesn't receive ACTIVATION.&lt;br /&gt;&lt;br /&gt;Here is the script that I use!&lt;br /&gt;&lt;br /&gt;use IO::Socket;&lt;br /&gt;use ElectricCommander;&lt;br /&gt;use Cwd;&lt;br /&gt;use Time::Local;&lt;br /&gt;&lt;br /&gt;use Win32::Process;&lt;br /&gt;use Win32::TieRegistry;&lt;br /&gt;use Win32::TieRegistry qw(:KEY_);&lt;br /&gt;&lt;br /&gt;my $regKey;&lt;br /&gt;my $UserShellFoldersKey;&lt;br /&gt;my $valueString;&lt;br /&gt;my $exitCode = -1;&lt;br /&gt;my $process;&lt;br /&gt;&lt;br /&gt;# if you need to request current user folder&lt;br /&gt;$regKey = new Win32::TieRegistry "CUser",&lt;br /&gt;      { Access=&gt;KEY_READ(), Delimiter=&gt;"/" };&lt;br /&gt;$UserShellFoldersKey = $regKey-&gt;Open( "Software/Microsoft/Windows/CurrentVersion/Explorer/User Shell Folders" );&lt;br /&gt;&lt;br /&gt;# Get value data:&lt;br /&gt;$valueString= $UserShellFoldersKey-&gt;GetValue("Personal");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;my $launchedByUser = '$[/myJob/launchedByUser]';&lt;br /&gt;my $jobName = '$[/myJob/jobName]';&lt;br /&gt;&lt;br /&gt;my $build_test_dir = 'C:\\ec_workspace\\'.$jobName.'\\';&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;my $msg = '';&lt;br /&gt;&lt;br /&gt;#the caller&lt;br /&gt;my $sock_call = new IO::Socket::INET (&lt;br /&gt;                                  PeerAddr =&gt; 'localhost',&lt;br /&gt;                                  PeerPort =&gt; '4000',&lt;br /&gt;                                  Proto =&gt; 'tcp',&lt;br /&gt;                                 );&lt;br /&gt;if ($sock_call)&lt;br /&gt;{&lt;br /&gt; print $sock_call "LaunchNotepad++\n";&lt;br /&gt; my $sock_addr = recv($sock_call,$msg,190,0);&lt;br /&gt; print $msg;&lt;br /&gt;&lt;br /&gt; close($sock_call);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt; print "ERROR Could not create client socket to IOCP Broadcom Automation Service!\n";&lt;br /&gt; die "Could not create client socket to IOCP Broadcom Automation Service $!\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;The IOCP server (WIN32 service) is very small and powerful because it is using asynchronous IO so it can handle a lot of simultaneous request comming from multiple Electric commander JOBS. In my case the IOCP server will take care of enumerating the target process before executing it because the target process was not single instance and in my case if two JOBS were running at the same time I wanted to make sure not to end up with two running instances. Off course you can limit this inside Electric Commander itself by preventing job concurrency but then the UI can be left open at the end of its execution. Maybe you want to Remote Desktop the machine the next day to look at results. During this time you want to prevent others automation to be executed. To perform synchronisation the script can wait on idle for the same time used by the automation process to complete. You know this only after monitoring the automation process. Once you know you'll have to tune your step.&lt;br /&gt;&lt;br /&gt;Electric Commander is very powerful. I wish I could afford the license to use it to perform recuring video security monitoring and reporting on a server running at home because once you can send message using local socket between EC apache instance and your process, you are entitled to implement a million of creative ideas!&lt;br /&gt;&lt;br /&gt;Automation server and bot rules the world! Aren't they ?&lt;br /&gt;&lt;br /&gt;IOCP Server&lt;br /&gt;&lt;br /&gt;int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE ,LPSTR ,int ){&lt;br /&gt;....&lt;br /&gt; init();&lt;br /&gt;     run();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void init(void)&lt;br /&gt;{&lt;br /&gt;   init_winsock();&lt;br /&gt;   create_io_completion_port();&lt;br /&gt;   create_listening_socket();&lt;br /&gt;   bind_listening_socket();&lt;br /&gt;   start_listening();&lt;br /&gt;   load_accept_ex();&lt;br /&gt;   start_accepting();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void run(void)&lt;br /&gt;{&lt;br /&gt;   DWORD length;&lt;br /&gt;   BOOL resultOk;&lt;br /&gt;   WSAOVERLAPPED* ovl_res;&lt;br /&gt;   SocketState* socketState;&lt;br /&gt;&lt;br /&gt;   for (;;)&lt;br /&gt;   {&lt;br /&gt;      resultOk = get_completion_status(&amp;length, &amp;socketState, &amp;ovl_res);&lt;br /&gt;&lt;br /&gt;      switch (socketState-&gt;operation)&lt;br /&gt;      {&lt;br /&gt;         case OP_ACCEPT:&lt;br /&gt;            OutputDebugString(L"* operation ACCEPT completed\n");&lt;br /&gt;            accept_completed(resultOk, length, socketState, ovl_res);&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;         case OP_READ:&lt;br /&gt;            OutputDebugString(L"* operation READ completed\n");&lt;br /&gt;            read_completed(resultOk, length, socketState, ovl_res);&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;         case OP_WRITE:&lt;br /&gt;            OutputDebugString(L"* operation WRITE completed\n");&lt;br /&gt;            write_completed(resultOk, length, socketState, ovl_res);&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;         default:&lt;br /&gt;            OutputDebugString(L"* error, unknown operation!!!\n");&lt;br /&gt;            destroy_connection(socketState, ovl_res); // hope for the best!&lt;br /&gt;            break;&lt;br /&gt;      } // switch&lt;br /&gt;   } // for&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void read_completed(BOOL resultOk, DWORD length,&lt;br /&gt;   SocketState* socketState, WSAOVERLAPPED* ovl)&lt;br /&gt;{&lt;br /&gt; &lt;br /&gt;   if (resultOk)&lt;br /&gt;   {&lt;br /&gt;      if (length &gt; 0)&lt;br /&gt;      {&lt;br /&gt;      _TCHAR  message[512];&lt;br /&gt;      _sntprintf(message,512,L"* read operation completed, %d bytes read\n", length);&lt;br /&gt;         OutputDebugString(message);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  wchar_t *pwText = NULL;&lt;br /&gt;  pwText = new wchar_t[length];&lt;br /&gt;  if(!pwText)&lt;br /&gt;  {&lt;br /&gt;   delete []pwText;&lt;br /&gt;  }&lt;br /&gt;        memset(pwText,0,length*sizeof(wchar_t));&lt;br /&gt;  MultiByteToWideChar (CP_ACP, 0, socketState-&gt;buf, -1, pwText, length-1 );&lt;br /&gt;&lt;br /&gt;   _sntprintf(message,512,L"* buffer: %s\n", pwText);&lt;br /&gt;   OutputDebugString(message);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;         HINSTANCE hInstanceMobCat = NULL;&lt;br /&gt;         HWND hWndMobCat = NULL;&lt;br /&gt;         DWORD dwProcessIdMobcat = 0;&lt;br /&gt;&lt;br /&gt;         if (_tcsicmp(pwText,L"LaunchNotepad++")==0)&lt;br /&gt;      {&lt;br /&gt;              std::string szExecutable = "C:\\Program Files\\Notepad++\\Notepad++.exe";&lt;br /&gt;&lt;br /&gt;                 bstrExecutable = utf8toUTF16(szExecutable);&lt;br /&gt; // Can't call ShellExecuteEx on main thread since it runs a message loop!&lt;br /&gt;                 // That would let windows messages sneak in before they are expected (Bug 2507120)&lt;br /&gt;                 HANDLE const hShellExecThread = CreateThread(NULL, 0, callShellExecThreadProc, bstrExecutable, 0, NULL);&lt;br /&gt;                 if (!hShellExecThread) &lt;br /&gt;                 {&lt;br /&gt;                 }&lt;br /&gt;                 DWORD result = WaitForSingleObject( hShellExecThread, INFINITE );&lt;br /&gt;                 if( result == WAIT_FAILED ) &lt;br /&gt;                 {&lt;br /&gt;                 }&lt;br /&gt;                 DWORD exitCode = 5;&lt;br /&gt;                 BOOL success = ::GetExitCodeProcess( hShellExecThread, &amp;exitCode );&lt;br /&gt;                 if( !success ) exitCode = 5;&lt;br /&gt;                 CloseHandle(hShellExecThread);&lt;br /&gt;               }&lt;br /&gt;&lt;br /&gt;delete []pwText;&lt;br /&gt;      &lt;br /&gt;         // starts another write back to caller&lt;br /&gt;         socketState-&gt;length = length;&lt;br /&gt;         start_writing(socketState, ovl);&lt;br /&gt;      }&lt;br /&gt;      else // length == 0&lt;br /&gt;      {&lt;br /&gt;         OutputDebugString(L"* connection closed by client\n");&lt;br /&gt;         destroy_connection(socketState, ovl);&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   else // !resultOk, assumes connection was reset&lt;br /&gt;   {  int err = GetLastError();&lt;br /&gt;&lt;br /&gt;         _TCHAR  message[512];&lt;br /&gt;      &lt;br /&gt;      _sntprintf(message,512,L"* error %d in recv, assuming connection was reset by client\n", err);&lt;br /&gt;&lt;br /&gt;         OutputDebugString(message);&lt;br /&gt;      destroy_connection(socketState, ovl);&lt;br /&gt;   }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-6037396834557280684?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/6037396834557280684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=6037396834557280684' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6037396834557280684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6037396834557280684'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/09/electric-commander-perl-system-call.html' title='Electric Commander PERL system call limition'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-1189602661542387699</id><published>2011-08-15T11:11:00.000-07:00</published><updated>2011-08-15T11:12:32.049-07:00</updated><title type='text'>GOOGLE buying MMI</title><content type='html'>One of those acquisition to remember&lt;br /&gt;&lt;br /&gt;http://www.businessinsider.com/live-google-and-motorola-explain-the-big-acquisition-2011-8&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;http://www.businessinsider.com/google-just-admitted-that-android-is-a-mess-2011-8&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-1189602661542387699?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/1189602661542387699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=1189602661542387699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1189602661542387699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1189602661542387699'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/08/google-buying-mmi.html' title='GOOGLE buying MMI'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-7351991106546064037</id><published>2011-08-03T16:38:00.000-07:00</published><updated>2011-08-03T16:47:24.054-07:00</updated><title type='text'>Android Monkey Script DispatchPress Bug</title><content type='html'>When using Monkey Script I noticed that DispatchPress(KEYCODE_BACK)&lt;br /&gt;is doing nothing which really suck. In many cases this is due to the fact that the Actibity doesn't consume the Key event.&lt;br /&gt;The solution to this problem is to use a mix of monkey script and&lt;br /&gt;adb shell input command in a sequence. &lt;br /&gt;&lt;br /&gt;1 Using monkey script gave some great timing&lt;br /&gt;control. Wait a certain amount of second for the activity and is a &lt;br /&gt;blocking adb call. &lt;br /&gt;2 Finally sending adb shell input keyevent 4 will end the running APK.&lt;br /&gt;&lt;br /&gt;EG&lt;br /&gt;&lt;br /&gt;adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1&lt;br /&gt;adb shell input keyevent 4&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-7351991106546064037?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/7351991106546064037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=7351991106546064037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7351991106546064037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7351991106546064037'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/08/android-monkey-script-dispatchpress-bug.html' title='Android Monkey Script DispatchPress Bug'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-4868409315902837401</id><published>2011-07-27T09:07:00.001-07:00</published><updated>2011-07-27T09:09:25.144-07:00</updated><title type='text'>How to rotate or flip a video inside Adobe Premiere</title><content type='html'>When recording video with iPhone or Android device it is possible to record an up side down video. In this case you'll probably need to rotate/flip the video using Adobe Premiere before exporting the video to H264 :)&lt;br /&gt;&lt;br /&gt;To do so here is what you can do in Adobe Premiere CS3/CS4 and probably CS5&lt;br /&gt;&lt;br /&gt;Hit [Window] &gt; [Effect Controls] *To see the panel*&lt;br /&gt;&lt;br /&gt;Click on the clip that you want to flip&lt;br /&gt;&lt;br /&gt;Hit [Video effects] &gt; [Motion] &gt; [Rotation]&lt;br /&gt;&lt;br /&gt;Type in 180 instead of 0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-4868409315902837401?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/4868409315902837401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=4868409315902837401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4868409315902837401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4868409315902837401'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/07/how-to-rotate-or-flip-video-inside.html' title='How to rotate or flip a video inside Adobe Premiere'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-837720526940691618</id><published>2011-07-22T11:45:00.000-07:00</published><updated>2011-07-22T11:53:04.577-07:00</updated><title type='text'>Virtual Earth</title><content type='html'>When I was integrating Virtual Earth 3D in a GPS location software&lt;br /&gt;I noticed that the default InfoBox for a push pin added on the map has a fixed size. When looking at Microroft documentation they said that the style can be overriden by calling map.ClearInfoBoxStyles(). &lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb412441.aspx#Y792"&gt;http://msdn.microsoft.com/en-us/library/bb412441.aspx#Y792&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Well this is working for 2D map but for 3D the info box is blanked. &lt;br /&gt;&lt;br /&gt;The Virtual Earth CSS is poorly documented but I found a way to override the style sheet without calling ClearInfoBoxStyles and then be able to view bigger infobox.&lt;br /&gt;Include the following at the top of your hosting page&lt;br /&gt;&lt;br /&gt;/* override VE css to resize infoboxes */&lt;br /&gt;&lt;br /&gt;.ero .ero-body&lt;br /&gt;{&lt;br /&gt;    width:550px!important;&lt;br /&gt;    overflow: auto;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.ero .firstChild&lt;br /&gt;{&lt;br /&gt;    width:540px!important;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-837720526940691618?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/837720526940691618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=837720526940691618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/837720526940691618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/837720526940691618'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/07/virtual-earth.html' title='Virtual Earth'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-4879367891715907359</id><published>2011-06-15T18:35:00.000-07:00</published><updated>2011-06-15T19:41:24.198-07:00</updated><title type='text'>Android Monkey Script</title><content type='html'>Monkey:  The Monkey is a program that runs on your emulator or device and generates pseudo-random streams of user events such as clicks, touches, or gestures, as well as a number of system-level events. You can use the Monkey to stress-test applications that you are developing, in a random yet repeatable manner.&lt;br /&gt;&lt;br /&gt;Monkey script is unfortunately poorly documented but it is pretty easy to write monkey script after looking at the Monkey Script Java source code itself. The Java Source code is the code in charge of parsing the monkey script and dispatching all monkey script event in a timely manner.&lt;br /&gt;&lt;br /&gt;development/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Copyright (C) 2008 The Android Open Source Project&lt;br /&gt; *&lt;br /&gt; * Licensed under the Apache License, Version 2.0 (the "License");&lt;br /&gt; * you may not use this file except in compliance with the License.&lt;br /&gt; * You may obtain a copy of the License at&lt;br /&gt; *&lt;br /&gt; *      http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt; *&lt;br /&gt; * Unless required by applicable law or agreed to in writing, software&lt;br /&gt; * distributed under the License is distributed on an "AS IS" BASIS,&lt;br /&gt; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt; * See the License for the specific language governing permissions and&lt;br /&gt; * limitations under the License.&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;package com.android.commands.monkey;&lt;br /&gt;&lt;br /&gt;import android.os.SystemClock;&lt;br /&gt;import android.view.KeyEvent;&lt;br /&gt;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.DataInputStream;&lt;br /&gt;import java.io.FileInputStream;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStreamReader;&lt;br /&gt;import java.util.LinkedList;&lt;br /&gt;import java.util.StringTokenizer;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * monkey event queue. It takes a script to produce events&lt;br /&gt; * &lt;br /&gt; * sample script format:&lt;br /&gt; *      type= raw events&lt;br /&gt; *      count= 10&lt;br /&gt; *      speed= 1.0&lt;br /&gt; *      start data &gt;&gt;&lt;br /&gt; *      captureDispatchPointer(5109520,5109520,0,230.75429,458.1814,0.20784314,&lt;br /&gt; *          0.06666667,0,0.0,0.0,65539,0)&lt;br /&gt; *      captureDispatchKey(5113146,5113146,0,20,0,0,0,0)&lt;br /&gt; *      captureDispatchFlip(true)&lt;br /&gt; *      ...&lt;br /&gt; */&lt;br /&gt;public class MonkeySourceScript implements MonkeyEventSource {    &lt;br /&gt;    private int mEventCountInScript = 0;  //total number of events in the file&lt;br /&gt;    private int mVerbose = 0;&lt;br /&gt;    private double mSpeed = 1.0;&lt;br /&gt;    private String mScriptFileName; &lt;br /&gt;    private MonkeyEventQueue mQ;&lt;br /&gt;    &lt;br /&gt;    private static final String HEADER_TYPE = "type=";&lt;br /&gt;    private static final String HEADER_COUNT = "count=";&lt;br /&gt;    private static final String HEADER_SPEED = "speed=";&lt;br /&gt;    &lt;br /&gt;    private long mLastRecordedDownTimeKey = 0;    &lt;br /&gt;    private long mLastRecordedDownTimeMotion = 0;&lt;br /&gt;    private long mLastExportDownTimeKey = 0;&lt;br /&gt;    private long mLastExportDownTimeMotion = 0;&lt;br /&gt;    private long mLastExportEventTime = -1;&lt;br /&gt;    private long mLastRecordedEventTime = -1;&lt;br /&gt;    &lt;br /&gt;    private static final boolean THIS_DEBUG = false;&lt;br /&gt;    // a parameter that compensates the difference of real elapsed time and &lt;br /&gt;    // time in theory&lt;br /&gt;    private static final long SLEEP_COMPENSATE_DIFF = 16;    &lt;br /&gt;    &lt;br /&gt;    // maximum number of events that we read at one time&lt;br /&gt;    private static final int MAX_ONE_TIME_READS = 100;&lt;br /&gt;    &lt;br /&gt;    // number of additional events added to the script &lt;br /&gt;    // add HOME_KEY down and up events to make start UI consistent in each round &lt;br /&gt;    private static final int POLICY_ADDITIONAL_EVENT_COUNT = 2;&lt;br /&gt;&lt;br /&gt;    // event key word in the capture log    &lt;br /&gt;    private static final String EVENT_KEYWORD_POINTER = "DispatchPointer";&lt;br /&gt;    private static final String EVENT_KEYWORD_TRACKBALL = "DispatchTrackball";&lt;br /&gt;    private static final String EVENT_KEYWORD_KEY = "DispatchKey";&lt;br /&gt;    private static final String EVENT_KEYWORD_FLIP = "DispatchFlip";&lt;br /&gt;    &lt;br /&gt;    // a line at the end of the header&lt;br /&gt;    private static final String STARTING_DATA_LINE = "start data &gt;&gt;";    &lt;br /&gt;    private boolean mFileOpened = false;    &lt;br /&gt;    &lt;br /&gt;    FileInputStream mFStream;&lt;br /&gt;    DataInputStream mInputStream;&lt;br /&gt;    BufferedReader mBufferReader;&lt;br /&gt;    &lt;br /&gt;    public MonkeySourceScript(String filename, long throttle) {&lt;br /&gt;        mScriptFileName = filename;&lt;br /&gt;        mQ = new MonkeyEventQueue(throttle);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * &lt;br /&gt;     * @return the number of total events that will be generated in a round &lt;br /&gt;     */&lt;br /&gt;    public int getOneRoundEventCount() {&lt;br /&gt;        //plus one home key down and up event&lt;br /&gt;        return mEventCountInScript + POLICY_ADDITIONAL_EVENT_COUNT; &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void resetValue() {&lt;br /&gt;        mLastRecordedDownTimeKey = 0;    &lt;br /&gt;        mLastRecordedDownTimeMotion = 0;&lt;br /&gt;        mLastExportDownTimeKey = 0;&lt;br /&gt;        mLastExportDownTimeMotion = 0;    &lt;br /&gt;        mLastRecordedEventTime = -1;        &lt;br /&gt;        mLastExportEventTime = -1;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private boolean readScriptHeader() {&lt;br /&gt;        mEventCountInScript = -1;&lt;br /&gt;        mFileOpened = false;        &lt;br /&gt;        try {&lt;br /&gt;            if (THIS_DEBUG) {&lt;br /&gt;                System.out.println("reading script header");&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            mFStream  =  new FileInputStream(mScriptFileName);&lt;br /&gt;            mInputStream  = new DataInputStream(mFStream);&lt;br /&gt;            mBufferReader = new BufferedReader(&lt;br /&gt;                    new InputStreamReader(mInputStream));&lt;br /&gt;            String sLine;&lt;br /&gt;            while ((sLine = mBufferReader.readLine()) != null) {&lt;br /&gt;                sLine = sLine.trim();&lt;br /&gt;                if (sLine.indexOf(HEADER_TYPE) &gt;= 0) {&lt;br /&gt;                    // at this point, we only have one type of script&lt;br /&gt;                } else if (sLine.indexOf(HEADER_COUNT) &gt;= 0) {&lt;br /&gt;                    try {&lt;br /&gt;                        mEventCountInScript = Integer.parseInt(sLine.substring(&lt;br /&gt;                                HEADER_COUNT.length() + 1).trim());&lt;br /&gt;                    } catch (NumberFormatException e) {&lt;br /&gt;                        System.err.println(e);&lt;br /&gt;                    }&lt;br /&gt;                } else if (sLine.indexOf(HEADER_SPEED) &gt;= 0) {&lt;br /&gt;                    try {&lt;br /&gt;                        mSpeed = Double.parseDouble(sLine.substring(&lt;br /&gt;                                HEADER_SPEED.length() + 1).trim());&lt;br /&gt;                        &lt;br /&gt;                    } catch (NumberFormatException e) {&lt;br /&gt;                        System.err.println(e);&lt;br /&gt;                    }&lt;br /&gt;                } else if (sLine.indexOf(STARTING_DATA_LINE) &gt;= 0) {&lt;br /&gt;                    // header ends until we read the start data mark&lt;br /&gt;                    mFileOpened = true;&lt;br /&gt;                    if (THIS_DEBUG) {&lt;br /&gt;                        System.out.println("read script header success");&lt;br /&gt;                    }    &lt;br /&gt;                    return true;&lt;br /&gt;                }&lt;br /&gt;            }            &lt;br /&gt;        } catch (FileNotFoundException e) {&lt;br /&gt;            System.err.println(e);&lt;br /&gt;        } catch (IOException e) {&lt;br /&gt;            System.err.println(e);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        if (THIS_DEBUG) {&lt;br /&gt;            System.out.println("Error in reading script header");&lt;br /&gt;        }        &lt;br /&gt;        return false;        &lt;br /&gt;    }    &lt;br /&gt;    &lt;br /&gt;    private void processLine(String s) {&lt;br /&gt;        int index1 = s.indexOf('(');&lt;br /&gt;        int index2 = s.indexOf(')');&lt;br /&gt;        &lt;br /&gt;        if (index1 &lt; 0 || index2 &lt; 0) {&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        StringTokenizer st = new StringTokenizer(&lt;br /&gt;                s.substring(index1 + 1, index2), ",");&lt;br /&gt;        &lt;br /&gt;        if (s.indexOf(EVENT_KEYWORD_KEY) &gt;= 0) {&lt;br /&gt;            // key events&lt;br /&gt;            try {&lt;br /&gt;                long downTime = Long.parseLong(st.nextToken());&lt;br /&gt;                long eventTime = Long.parseLong(st.nextToken());&lt;br /&gt;                int action = Integer.parseInt(st.nextToken());&lt;br /&gt;                int code = Integer.parseInt(st.nextToken());&lt;br /&gt;                int repeat = Integer.parseInt(st.nextToken());&lt;br /&gt;                int metaState = Integer.parseInt(st.nextToken());&lt;br /&gt;                int device = Integer.parseInt(st.nextToken());&lt;br /&gt;                int scancode = Integer.parseInt(st.nextToken());&lt;br /&gt;                &lt;br /&gt;                MonkeyKeyEvent e = new MonkeyKeyEvent(downTime, eventTime,&lt;br /&gt;                        action, code, repeat, metaState, device, scancode);&lt;br /&gt;                mQ.addLast(e);&lt;br /&gt;                &lt;br /&gt;            } catch (NumberFormatException e) {&lt;br /&gt;                // something wrong with this line in the script               &lt;br /&gt;            }&lt;br /&gt;        } else if (s.indexOf(EVENT_KEYWORD_POINTER) &gt;= 0 || &lt;br /&gt;                s.indexOf(EVENT_KEYWORD_TRACKBALL) &gt;= 0) {&lt;br /&gt;            // trackball/pointer event &lt;br /&gt;            try {                &lt;br /&gt;                long downTime = Long.parseLong(st.nextToken());&lt;br /&gt;                long eventTime = Long.parseLong(st.nextToken());&lt;br /&gt;                int action = Integer.parseInt(st.nextToken());&lt;br /&gt;                float x = Float.parseFloat(st.nextToken());&lt;br /&gt;                float y = Float.parseFloat(st.nextToken());&lt;br /&gt;                float pressure = Float.parseFloat(st.nextToken());&lt;br /&gt;                float size = Float.parseFloat(st.nextToken());&lt;br /&gt;                int metaState = Integer.parseInt(st.nextToken());&lt;br /&gt;                float xPrecision = Float.parseFloat(st.nextToken());&lt;br /&gt;                float yPrecision = Float.parseFloat(st.nextToken());&lt;br /&gt;                int device = Integer.parseInt(st.nextToken());&lt;br /&gt;                int edgeFlags = Integer.parseInt(st.nextToken());&lt;br /&gt;                &lt;br /&gt;                int type = MonkeyEvent.EVENT_TYPE_TRACKBALL;                &lt;br /&gt;                if (s.indexOf("Pointer") &gt; 0) {&lt;br /&gt;                    type = MonkeyEvent.EVENT_TYPE_POINTER;&lt;br /&gt;                }                &lt;br /&gt;                MonkeyMotionEvent e = new MonkeyMotionEvent(type, downTime, eventTime,&lt;br /&gt;                        action, x, y, pressure, size, metaState, xPrecision, yPrecision,&lt;br /&gt;                        device, edgeFlags);&lt;br /&gt;                mQ.addLast(e);                &lt;br /&gt;            } catch (NumberFormatException e) {&lt;br /&gt;                // we ignore this event                &lt;br /&gt;            }&lt;br /&gt;        } else if (s.indexOf(EVENT_KEYWORD_FLIP) &gt;= 0) {&lt;br /&gt;            boolean keyboardOpen = Boolean.parseBoolean(st.nextToken());&lt;br /&gt;            MonkeyFlipEvent e = new MonkeyFlipEvent(keyboardOpen);&lt;br /&gt;            mQ.addLast(e);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void closeFile() {&lt;br /&gt;        mFileOpened = false;        &lt;br /&gt;        if (THIS_DEBUG) {&lt;br /&gt;            System.out.println("closing script file");&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        try {&lt;br /&gt;            mFStream.close();&lt;br /&gt;            mInputStream.close();&lt;br /&gt;        } catch (IOException e) {&lt;br /&gt;            System.out.println(e);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * add home key press/release event to the queue&lt;br /&gt;     */&lt;br /&gt;    private void addHomeKeyEvent() {        &lt;br /&gt;        MonkeyKeyEvent e = new MonkeyKeyEvent(KeyEvent.ACTION_DOWN, &lt;br /&gt;                KeyEvent.KEYCODE_HOME);&lt;br /&gt;        mQ.addLast(e);        &lt;br /&gt;        e = new MonkeyKeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HOME);&lt;br /&gt;        mQ.addLast(e);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * read next batch of events from the provided script file&lt;br /&gt;     * @return true if success&lt;br /&gt;     */&lt;br /&gt;    private boolean readNextBatch() {&lt;br /&gt;        String sLine = null;&lt;br /&gt;        int readCount = 0;&lt;br /&gt;        &lt;br /&gt;        if (THIS_DEBUG) {&lt;br /&gt;            System.out.println("readNextBatch(): reading next batch of events");&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        if (!mFileOpened) {&lt;br /&gt;            if (!readScriptHeader()) {&lt;br /&gt;                closeFile();&lt;br /&gt;                return false;&lt;br /&gt;            }             &lt;br /&gt;            resetValue();&lt;br /&gt;            &lt;br /&gt;            /* &lt;br /&gt;            * In order to allow the Monkey to replay captured events multiple times&lt;br /&gt;            * we need to define a default start UI, which is the home screen&lt;br /&gt;            * Otherwise, it won't be accurate since the captured events &lt;br /&gt;            * could end anywhere&lt;br /&gt;            */&lt;br /&gt;            addHomeKeyEvent();&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        try {            &lt;br /&gt;            while (readCount++ &lt; MAX_ONE_TIME_READS &amp;&amp;                    &lt;br /&gt;                   (sLine = mBufferReader.readLine()) != null) {&lt;br /&gt;                sLine = sLine.trim();                        &lt;br /&gt;                processLine(sLine);&lt;br /&gt;            }&lt;br /&gt;        } catch (IOException e) {&lt;br /&gt;            System.err.println(e);&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        if (sLine == null) {&lt;br /&gt;            // to the end of the file&lt;br /&gt;            if (THIS_DEBUG) {&lt;br /&gt;                System.out.println("readNextBatch(): to the end of file");&lt;br /&gt;            }&lt;br /&gt;            closeFile();&lt;br /&gt;        }        &lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * sleep for a period of given time, introducing latency among events&lt;br /&gt;     * @param time to sleep in millisecond&lt;br /&gt;     */&lt;br /&gt;    private void needSleep(long time) {        &lt;br /&gt;        if (time &lt; 1) {&lt;br /&gt;            return;    &lt;br /&gt;        }        &lt;br /&gt;        try {&lt;br /&gt;            Thread.sleep(time);&lt;br /&gt;        } catch (InterruptedException e) {            &lt;br /&gt;        }        &lt;br /&gt;    }    &lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * check whether we can successfully read the header of the script file&lt;br /&gt;     */&lt;br /&gt;    public boolean validate() {&lt;br /&gt;        boolean b = readNextBatch(); &lt;br /&gt;        if (mVerbose &gt; 0) {&lt;br /&gt;            System.out.println("Replaying " + mEventCountInScript + &lt;br /&gt;                    " events with speed " + mSpeed);&lt;br /&gt;        }&lt;br /&gt;        return b;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public void setVerbose(int verbose) {&lt;br /&gt;        mVerbose = verbose;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * adjust key downtime and eventtime according to both  &lt;br /&gt;     * recorded values and current system time &lt;br /&gt;     * @param e KeyEvent&lt;br /&gt;     */&lt;br /&gt;    private void adjustKeyEventTime(MonkeyKeyEvent e) {&lt;br /&gt;        if (e.getEventTime() &lt; 0) {&lt;br /&gt;            return;&lt;br /&gt;        }      &lt;br /&gt;        long thisDownTime = 0;&lt;br /&gt;        long thisEventTime = 0;&lt;br /&gt;        long expectedDelay = 0;&lt;br /&gt;        &lt;br /&gt;        if (mLastRecordedEventTime &lt;= 0) {&lt;br /&gt;            // first time event            &lt;br /&gt;            thisDownTime = SystemClock.uptimeMillis();&lt;br /&gt;            thisEventTime = thisDownTime;&lt;br /&gt;        } else {            &lt;br /&gt;            if (e.getDownTime() != mLastRecordedDownTimeKey) {&lt;br /&gt;                thisDownTime = e.getDownTime();&lt;br /&gt;            } else {&lt;br /&gt;                thisDownTime = mLastExportDownTimeKey;&lt;br /&gt;            }            &lt;br /&gt;            expectedDelay = (long) ((e.getEventTime() - &lt;br /&gt;                    mLastRecordedEventTime) * mSpeed);            &lt;br /&gt;            thisEventTime = mLastExportEventTime + expectedDelay;&lt;br /&gt;            // add sleep to simulate everything in recording&lt;br /&gt;            needSleep(expectedDelay - SLEEP_COMPENSATE_DIFF);&lt;br /&gt;        }        &lt;br /&gt;        mLastRecordedDownTimeKey = e.getDownTime();&lt;br /&gt;        mLastRecordedEventTime = e.getEventTime();         &lt;br /&gt;        e.setDownTime(thisDownTime);&lt;br /&gt;        e.setEventTime(thisEventTime);        &lt;br /&gt;        mLastExportDownTimeKey = thisDownTime;&lt;br /&gt;        mLastExportEventTime =  thisEventTime;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * adjust motion downtime and eventtime according to both  &lt;br /&gt;     * recorded values and current system time &lt;br /&gt;     * @param e KeyEvent&lt;br /&gt;     */&lt;br /&gt;    private void adjustMotionEventTime(MonkeyMotionEvent e) {&lt;br /&gt;        if (e.getEventTime() &lt; 0) {&lt;br /&gt;            return;&lt;br /&gt;        }      &lt;br /&gt;        long thisDownTime = 0;&lt;br /&gt;        long thisEventTime = 0;&lt;br /&gt;        long expectedDelay = 0;&lt;br /&gt;        &lt;br /&gt;        if (mLastRecordedEventTime &lt;= 0) {&lt;br /&gt;            // first time event            &lt;br /&gt;            thisDownTime = SystemClock.uptimeMillis();&lt;br /&gt;            thisEventTime = thisDownTime;&lt;br /&gt;        } else {            &lt;br /&gt;            if (e.getDownTime() != mLastRecordedDownTimeMotion) {&lt;br /&gt;                thisDownTime = e.getDownTime();&lt;br /&gt;            } else {&lt;br /&gt;                thisDownTime = mLastExportDownTimeMotion;&lt;br /&gt;            }            &lt;br /&gt;            expectedDelay = (long) ((e.getEventTime() - &lt;br /&gt;                    mLastRecordedEventTime) * mSpeed);            &lt;br /&gt;            thisEventTime = mLastExportEventTime + expectedDelay;&lt;br /&gt;            // add sleep to simulate everything in recording&lt;br /&gt;            needSleep(expectedDelay - SLEEP_COMPENSATE_DIFF);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        mLastRecordedDownTimeMotion = e.getDownTime();&lt;br /&gt;        mLastRecordedEventTime = e.getEventTime();         &lt;br /&gt;        e.setDownTime(thisDownTime);&lt;br /&gt;        e.setEventTime(thisEventTime);        &lt;br /&gt;        mLastExportDownTimeMotion = thisDownTime;&lt;br /&gt;        mLastExportEventTime =  thisEventTime;&lt;br /&gt;    }    &lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * if the queue is empty, we generate events first&lt;br /&gt;     * @return the first event in the queue, if null, indicating the system crashes &lt;br /&gt;     */&lt;br /&gt;    public MonkeyEvent getNextEvent() {&lt;br /&gt;        long recordedEventTime = -1;&lt;br /&gt;        &lt;br /&gt;        if (mQ.isEmpty()) {&lt;br /&gt;            readNextBatch();&lt;br /&gt;        }&lt;br /&gt;        MonkeyEvent e = mQ.getFirst();&lt;br /&gt;        mQ.removeFirst();&lt;br /&gt;        &lt;br /&gt;        if (e.getEventType() == MonkeyEvent.EVENT_TYPE_KEY) {&lt;br /&gt;            adjustKeyEventTime((MonkeyKeyEvent) e);        &lt;br /&gt;        } else if (e.getEventType() == MonkeyEvent.EVENT_TYPE_POINTER || &lt;br /&gt;                e.getEventType() == MonkeyEvent.EVENT_TYPE_TRACKBALL) {&lt;br /&gt;            adjustMotionEventTime((MonkeyMotionEvent) e);&lt;br /&gt;        }&lt;br /&gt;        return e;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;To write monkey script the first thing you have to do is write a small JAVA application. You can use hello world sample application. You can build it using Eclipse Java IDE and Android Windows SDK. Inside your sample application open the main activity JAVA file and add some code to enumerate the activity of an APK of your choice assuming this application is not presently running. If the application you'd like to automate is running, then use getPackageInfo(), instead of getPackageArchiveInfo().&lt;br /&gt;&lt;br /&gt;See code bellow. Run the "rever engineering" application in the debugger with the device attached to your PC/Laptop with USB cable so that you can step into the code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.content.ComponentName;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.content.pm.ActivityInfo;&lt;br /&gt;import android.content.pm.ApplicationInfo;&lt;br /&gt;import android.content.pm.PackageInfo;&lt;br /&gt;import android.content.pm.PackageManager;&lt;br /&gt;import android.util.Log;&lt;br /&gt;&lt;br /&gt;public class ReverseEngineering extends Activity&lt;br /&gt;{&lt;br /&gt;  static final String TAG = "ReverseEngineering:Log";&lt;br /&gt;&lt;br /&gt;                /** onStart() is called when the application is on the foreground.&lt;br /&gt;                * We shouldn't use onCreate() which is called only once in the phone's process life cycle.&lt;br /&gt;                * This function will override what is available in the parent Activity class. */&lt;br /&gt;                @Override&lt;br /&gt;                public void onStart()&lt;br /&gt;                {&lt;br /&gt;                                // Keep on starting.&lt;br /&gt;                                super.onStart();&lt;br /&gt;                                setContentView(R.layout.main);&lt;br /&gt;                                &lt;br /&gt;                                PackageManager pm = getPackageManager();&lt;br /&gt;                                &lt;br /&gt;                                PackageInfo info = pm.getPackageArchiveInfo("/data/app/com.company.application-1.apk", PackageManager.GET_ACTIVITIES);&lt;br /&gt;                                if(info != null){   &lt;br /&gt;            ApplicationInfo appInfo = info.applicationInfo;&lt;br /&gt;            String appName = pm.getApplicationLabel(appInfo).toString();   &lt;br /&gt;            String packageName = appInfo.packageName;   &lt;br /&gt;            Log.d(TAG, " appName =" + appName);&lt;br /&gt;            Log.d(TAG, " packageName =" + packageName);&lt;br /&gt;                                }&lt;br /&gt;                                &lt;br /&gt;                                ActivityInfo[] list = pm.getPackageArchiveInfo("/data/app/com.company.application-1.apk", PackageManager.GET_ACTIVITIES).activities;&lt;br /&gt;                                for(int i = 0;i&lt; list.length; i++){&lt;br /&gt;                                                String strName = list[i].getClass().getName();&lt;br /&gt;                                                Log.d(TAG, " ActivityInfo =" + strName);&lt;br /&gt;                                }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once you know the name of the activity you can invoke, write a small script. &lt;br /&gt;The following script named monkey_script.txt will execute a package and &lt;br /&gt;its activity. &lt;br /&gt;&lt;br /&gt;captureDispatchPointer is a tap down action followed by a tap up action at the coordinate x and y EG X 146 and Y 165 as if you were using the touch screen with your finger. To find out the coordinate for a particular screen on the device you need to capture the screen using ddms (android tool) and open the screen with your favorites image editor. Mine is PhotoShop CS5 or Gimp if you don't have that much $ to spend. Development on Android is free after all.&lt;br /&gt;&lt;br /&gt;# KEYEVENT &lt;a href="http://developer.android.com/reference/android/view/KeyEvent.html"&gt;http://developer.android.com/reference/android/view/KeyEvent.html&lt;/a&gt;# Start of Script&lt;br /&gt;type= user&lt;br /&gt;count= 49&lt;br /&gt;speed= 1.0&lt;br /&gt;start data &gt;&gt;&lt;br /&gt;LaunchActivity(com.company.application.Activity, com.company.application.Activity)&lt;br /&gt;UserWait(2000)&lt;br /&gt;# first screen&lt;br /&gt;captureDispatchPointer(5109520,5109520,0,146,165,0,0,0,0,0,0,0); &lt;br /&gt;captureDispatchPointer(5109521,5109521,1,146,165,0,0,0,0,0,0,0); &lt;br /&gt;UserWait(5000)&lt;br /&gt;# second screen&lt;br /&gt;captureDispatchPointer(5109520,5109520,0,117,268,0,0,0,0,0,0,0); &lt;br /&gt;captureDispatchPointer(5109521,5109521,1,117,268,0,0,0,0,0,0,0); &lt;br /&gt;# second screen selection dialog autoclose on selection&lt;br /&gt;UserWait(2000)&lt;br /&gt;# now access an other screen&lt;br /&gt;captureDispatchPointer(5109520,5109520,0,117,358,0,0,0,0,0,0,0); &lt;br /&gt;captureDispatchPointer(5109521,5109521,1,117,358,0,0,0,0,0,0,0); &lt;br /&gt;UserWait(2000)&lt;br /&gt;# access a selection dialog with only a cancel button. Dialog will autoclose on tap down&lt;br /&gt;captureDispatchPointer(5109520,5109520,0,117,177,0,0,0,0,0,0,0); &lt;br /&gt;captureDispatchPointer(5109521,5109521,1,117,177,0,0,0,0,0,0,0); &lt;br /&gt;UserWait(2000)&lt;br /&gt;&lt;br /&gt;A more complex script with android keypad input&lt;br /&gt;&lt;br /&gt;# KEYEVENT http://developer.android.com/reference/android/view/KeyEvent.html&lt;br /&gt;# Start of Script&lt;br /&gt;type= user&lt;br /&gt;count= 49&lt;br /&gt;speed= 1.0&lt;br /&gt;start data &gt;&gt;&lt;br /&gt;LaunchActivity(com.mpowerlabs.coin.android, com.mpowerlabs.coin.android.LoginActivity)&lt;br /&gt;# 3120021258&lt;br /&gt;DispatchPress(KEYCODE_3)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_1)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_3)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_5)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_0)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_2)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_1)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_2)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_5)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_8)&lt;br /&gt;UserWait(200)&lt;br /&gt;# Pin 12345&lt;br /&gt;DispatchPress(KEYCODE_DPAD_DOWN)&lt;br /&gt;UserWait(250)&lt;br /&gt;DispatchPress(KEYCODE_1)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_2)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_3)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_4)&lt;br /&gt;UserWait(200)&lt;br /&gt;DispatchPress(KEYCODE_5)&lt;br /&gt;UserWait(200)&lt;br /&gt;# Down and enter&lt;br /&gt;DispatchPress(KEYCODE_DPAD_DOWN)&lt;br /&gt;UserWait(250)&lt;br /&gt;DispatchPress(KEYCODE_ENTER) &lt;br /&gt;&lt;br /&gt;To execute the script on the device you need to create a batch file.&lt;br /&gt;&lt;br /&gt;1 to make sure the application is deploy on the device&lt;br /&gt;2 push the script&lt;br /&gt;3 execute the script&lt;br /&gt;&lt;br /&gt;adb root&lt;br /&gt;adb install com.company.application.apk&lt;br /&gt;adb push monkey_script.txt /sdcard/monkey_script.txt&lt;br /&gt;adb shell monkey -p com.company.application -v -v -v -f /sdcard/monkey_script.txt 1&lt;br /&gt;&lt;br /&gt;Hope you'll find this tutorial usefull !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-4879367891715907359?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/4879367891715907359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=4879367891715907359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4879367891715907359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4879367891715907359'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/06/android-monkey-script.html' title='Android Monkey Script'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-7263511422435616626</id><published>2011-06-14T17:37:00.001-07:00</published><updated>2011-06-14T17:37:13.402-07:00</updated><title type='text'>Android.mk</title><content type='html'>Android.mk file syntax specification&lt;br /&gt;&lt;br /&gt;Introduction:&lt;br /&gt;-------------&lt;br /&gt;&lt;br /&gt;This document describes the syntax of Android.mk build file&lt;br /&gt;written to describe your C and C++ source files to the Android&lt;br /&gt;NDK. To understand what follows, it is assumed that you have&lt;br /&gt;read the docs/OVERVIEW.TXT file that explains their role and&lt;br /&gt;usage.&lt;br /&gt;&lt;br /&gt;Overview:&lt;br /&gt;---------&lt;br /&gt;&lt;br /&gt;An Android.mk file is written to describe your sources to the&lt;br /&gt;build system. More specifically:&lt;br /&gt;&lt;br /&gt;- The file is really a tiny GNU Makefile fragment that will be&lt;br /&gt;  parsed one or more times by the build system. As such, you&lt;br /&gt;  should try to minimize the variables you declare there and&lt;br /&gt;  do not assume that anything is not defined during parsing.&lt;br /&gt;&lt;br /&gt;- The file syntax is designed to allow you to group your&lt;br /&gt;  sources into 'modules'. A module is one of the following:&lt;br /&gt;&lt;br /&gt;    - a static library&lt;br /&gt;    - a shared library&lt;br /&gt;&lt;br /&gt;  Only shared libraries will be installed/copied to your&lt;br /&gt;  application package. Static libraries can be used to generate&lt;br /&gt;  shared libraries though.&lt;br /&gt;&lt;br /&gt;  You can define one or more modules in each Android.mk file,&lt;br /&gt;  and you can use the same source file in several modules.&lt;br /&gt;&lt;br /&gt;- The build system handles many details for you. For example, you&lt;br /&gt;  don't need to list header files or explicit dependencies between&lt;br /&gt;  generated files in your Android.mk. The NDK build system will&lt;br /&gt;  compute these automatically for you.&lt;br /&gt;&lt;br /&gt;  This also means that, when updating to newer releases of the NDK,&lt;br /&gt;  you should be able to benefit from new toolchain/platform support&lt;br /&gt;  without having to touch your Android.mk files.&lt;br /&gt;&lt;br /&gt;Note that the syntax is *very* close to the one used in Android.mk files&lt;br /&gt;distributed with the full open-source Android platform sources. While&lt;br /&gt;the build system implementation that uses them is different, this is&lt;br /&gt;an intentional design decision made to allow reuse of 'external' libraries'&lt;br /&gt;source code easier for application developers.&lt;br /&gt;&lt;br /&gt;Simple example:&lt;br /&gt;---------------&lt;br /&gt;&lt;br /&gt;Before describing the syntax in details, let's consider the simple&lt;br /&gt;"hello JNI" example, i.e. the files under:&lt;br /&gt;&lt;br /&gt;    apps/hello-jni/project&lt;br /&gt;&lt;br /&gt;Here, we can see:&lt;br /&gt;&lt;br /&gt;  - The 'src' directory containing the Java sources for the&lt;br /&gt;    sample Android project.&lt;br /&gt;&lt;br /&gt;  - The 'jni' directory containing the native source for&lt;br /&gt;    the sample, i.e. 'jni/hello-jni.c'&lt;br /&gt;&lt;br /&gt;    This source file implements a simple shared library that&lt;br /&gt;    implements a native method that returns a string to the&lt;br /&gt;    VM application.&lt;br /&gt;&lt;br /&gt;  - The 'jni/Android.mk' file that describes the shared library&lt;br /&gt;    to the NDK build system. Its content is:&lt;br /&gt;&lt;br /&gt;   ---------- cut here ------------------&lt;br /&gt;   LOCAL_PATH := $(call my-dir)&lt;br /&gt;&lt;br /&gt;   include $(CLEAR_VARS)&lt;br /&gt;&lt;br /&gt;   LOCAL_MODULE    := hello-jni&lt;br /&gt;   LOCAL_SRC_FILES := hello-jni.c&lt;br /&gt;&lt;br /&gt;   include $(BUILD_SHARED_LIBRARY)&lt;br /&gt;   ---------- cut here ------------------&lt;br /&gt;&lt;br /&gt;Now, let's explain these lines:&lt;br /&gt;&lt;br /&gt;  LOCAL_PATH := $(call my-dir)&lt;br /&gt;&lt;br /&gt;An Android.mk file must begin with the definition of the LOCAL_PATH variable.&lt;br /&gt;It is used to locate source files in the development tree. In this example,&lt;br /&gt;the macro function 'my-dir', provided by the build system, is used to return&lt;br /&gt;the path of the current directory (i.e. the directory containing the&lt;br /&gt;Android.mk file itself).&lt;br /&gt;&lt;br /&gt;  include $(CLEAR_VARS)&lt;br /&gt;&lt;br /&gt;The CLEAR_VARS variable is provided by the build system and points to a&lt;br /&gt;special GNU Makefile that will clear many LOCAL_XXX variables for you&lt;br /&gt;(e.g. LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, etc...),&lt;br /&gt;with the exception of LOCAL_PATH. This is needed because all build&lt;br /&gt;control files are parsed in a single GNU Make execution context where&lt;br /&gt;all variables are global.&lt;br /&gt;&lt;br /&gt;  LOCAL_MODULE := hello-jni&lt;br /&gt;&lt;br /&gt;The LOCAL_MODULE variable must be defined to identify each module you&lt;br /&gt;describe in your Android.mk. The name must be *unique* and not contain&lt;br /&gt;any spaces. Note that the build system will automatically add proper&lt;br /&gt;prefix and suffix to the corresponding generated file. In other words,&lt;br /&gt;a shared library module named 'foo' will generate 'libfoo.so'.&lt;br /&gt;&lt;br /&gt;IMPORTANT NOTE:&lt;br /&gt;If you name your module 'libfoo', the build system will not&lt;br /&gt;add another 'lib' prefix and will generate libfoo.so as well.&lt;br /&gt;This is to support Android.mk files that originate from the&lt;br /&gt;Android platform sources, would you need to use these.&lt;br /&gt;&lt;br /&gt;  LOCAL_SRC_FILES := hello-jni.c&lt;br /&gt;&lt;br /&gt;The LOCAL_SRC_FILES variables must contain a list of C and/or C++ source&lt;br /&gt;files that will be built and assembled into a module. Note that you should&lt;br /&gt;not list header and included files here, because the build system will&lt;br /&gt;compute dependencies automatically for you; just list the source files&lt;br /&gt;that will be passed directly to a compiler, and you should be good.&lt;br /&gt;&lt;br /&gt;Note that the default extension for C++ source files is '.cpp'. It is&lt;br /&gt;however possible to specify a different one by defining the variable&lt;br /&gt;LOCAL_DEFAULT_CPP_EXTENSION. Don't forget the initial dot (i.e. '.cxx'&lt;br /&gt;will work, but not 'cxx').&lt;br /&gt;&lt;br /&gt;  include $(BUILD_SHARED_LIBRARY)&lt;br /&gt;&lt;br /&gt;The BUILD_SHARED_LIBRARY is a variable provided by the build system that&lt;br /&gt;points to a GNU Makefile script that is in charge of collecting all the&lt;br /&gt;information you defined in LOCAL_XXX variables since the latest&lt;br /&gt;'include $(CLEAR_VARS)' and determine what to build, and how to do it&lt;br /&gt;exactly. There is also BUILD_STATIC_LIBRARY to generate a static library.&lt;br /&gt;&lt;br /&gt;There are more complex examples under apps/, with commented&lt;br /&gt;Android.mk files that you can look at.&lt;br /&gt;&lt;br /&gt;Reference:&lt;br /&gt;----------&lt;br /&gt;&lt;br /&gt;This is the list of variables you should either rely on or define in&lt;br /&gt;an Android.mk. You can define other variables for your own usage, but&lt;br /&gt;the NDK build system reserves the following variable names:&lt;br /&gt;&lt;br /&gt;- names that begin with LOCAL_  (e.g. LOCAL_MODULE)&lt;br /&gt;- names that begin with PRIVATE_, NDK_ or APP_  (used internally)&lt;br /&gt;- lower-case names (used internally, e.g. 'my-dir')&lt;br /&gt;&lt;br /&gt;If you need to define your own convenience variables in an Android.mk&lt;br /&gt;file, we recommend using the MY_ prefix, for a trivial example:&lt;br /&gt;&lt;br /&gt;   ---------- cut here ------------------&lt;br /&gt;    MY_SOURCES := foo.c&lt;br /&gt;    ifneq ($(MY_CONFIG_BAR),)&lt;br /&gt;      MY_SOURCES += bar.c&lt;br /&gt;    endif&lt;br /&gt;&lt;br /&gt;    LOCAL_SRC_FILES += $(MY_SOURCES)&lt;br /&gt;   ---------- cut here ------------------&lt;br /&gt;&lt;br /&gt;So, here we go:&lt;br /&gt;&lt;br /&gt;NDK-provided variables:&lt;br /&gt;- - - - - - - - - - - -&lt;br /&gt;&lt;br /&gt;These GNU Make variables are defined by the build system before&lt;br /&gt;your Android.mk file is parsed. Note that under certain circumstances&lt;br /&gt;the NDK might parse your Android.mk several times, each with different&lt;br /&gt;definition for some of these variables.&lt;br /&gt;&lt;br /&gt;CLEAR_VARS&lt;br /&gt;    Points to a build script that undefines nearly all LOCAL_XXX variables&lt;br /&gt;    listed in the "Module-description" section below. You must include&lt;br /&gt;    the script before starting a new module, e.g.:&lt;br /&gt;&lt;br /&gt;      include $(CLEAR_VARS)&lt;br /&gt;&lt;br /&gt;BUILD_SHARED_LIBRARY&lt;br /&gt;    Points to a build script that collects all the information about the&lt;br /&gt;    module you provided in LOCAL_XXX variables and determines how to build&lt;br /&gt;    a target shared library from the sources you listed. Note that you&lt;br /&gt;    must have LOCAL_MODULE and LOCAL_SRC_FILES defined, at a minimum before&lt;br /&gt;    including this file. Example usage:&lt;br /&gt;&lt;br /&gt;      include $(BUILD_SHARED_LIBRARY)&lt;br /&gt;&lt;br /&gt;    note that this will generate a file named lib$(LOCAL_MODULE).so&lt;br /&gt;&lt;br /&gt;BUILD_STATIC_LIBRARY&lt;br /&gt;    A variant of BUILD_SHARED_LIBRARY that is used to build a target static&lt;br /&gt;    library instead. Static libraries are not copied into your&lt;br /&gt;    project/packages but can be used to build shared libraries (see&lt;br /&gt;    LOCAL_STATIC_LIBRARIES and LOCAL_STATIC_WHOLE_LIBRARIES described below).&lt;br /&gt;    Example usage:&lt;br /&gt;&lt;br /&gt;      include $(BUILD_STATIC_LIBRARY)&lt;br /&gt;&lt;br /&gt;    Note that this will generate a file named lib$(LOCAL_MODULE).a&lt;br /&gt;&lt;br /&gt;TARGET_ARCH&lt;br /&gt;    Name of the target CPU architecture as it is specified by the&lt;br /&gt;    full Android open-source build. This is 'arm' for any ARM-compatible&lt;br /&gt;    build, independent of the CPU architecture revision.&lt;br /&gt;&lt;br /&gt;TARGET_PLATFORM&lt;br /&gt;    Name of the target Android platform when this Android.mk is parsed.&lt;br /&gt;    For now, only 'android-3' is supported, which corresponds to the&lt;br /&gt;    Android 1.5 platform.&lt;br /&gt;&lt;br /&gt;TARGET_ARCH_ABI&lt;br /&gt;    Name of the target CPU+ABI when this Android.mk is parsed.&lt;br /&gt;    For now, only 'arm' is supported, which really means the following:&lt;br /&gt;&lt;br /&gt;       ARMv5TE or higher CPU, with 'softfloat' floating point support&lt;br /&gt;&lt;br /&gt;    Other target ABIs will be introduced in future releases of the NDK&lt;br /&gt;    and will have a different name. Note that all ARM-based ABIs will&lt;br /&gt;    have 'TARGET_ARCH' defined to 'arm', but may have different&lt;br /&gt;    'TARGET_ARCH_ABI'&lt;br /&gt;&lt;br /&gt;TARGET_ABI&lt;br /&gt;    The concatenation of target platform and abi, it really is defined&lt;br /&gt;    as $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI) and is useful when you want&lt;br /&gt;    to test against a specific target system image for a real device.&lt;br /&gt;&lt;br /&gt;    By default, this will be 'android-3-arm'&lt;br /&gt;&lt;br /&gt;NDK-provided function macros:&lt;br /&gt;- - - - - - - - - - - - - - -&lt;br /&gt;&lt;br /&gt;The following are GNU Make 'function' macros, and must be evaluated&lt;br /&gt;by using '$(call &lt;function&gt;)'. They return textual information.&lt;br /&gt;&lt;br /&gt;my-dir&lt;br /&gt;    Returns the path of the current Android.mk's directory, relative&lt;br /&gt;    to the top of the NDK build system. This is useful to define&lt;br /&gt;    LOCAL_PATH at the start of your Android.mk as with:&lt;br /&gt;&lt;br /&gt;        LOCAL_PATH := $(call my-dir)&lt;br /&gt;&lt;br /&gt;all-subdir-makefiles&lt;br /&gt;    Returns a list of Android.mk located in all sub-directories of&lt;br /&gt;    the current 'my-dir' path. For example, consider the following&lt;br /&gt;    hierarchy:&lt;br /&gt;&lt;br /&gt;        sources/foo/Android.mk&lt;br /&gt;        sources/foo/lib1/Android.mk&lt;br /&gt;        sources/foo/lib2/Android.mk&lt;br /&gt;&lt;br /&gt;    If sources/foo/Android.mk contains the single line:&lt;br /&gt;&lt;br /&gt;        include $(call all-subdir-makefiles)&lt;br /&gt;&lt;br /&gt;    Then it will include automatically sources/foo/lib1/Android.mk and&lt;br /&gt;    sources/foo/lib2/Android.mk&lt;br /&gt;&lt;br /&gt;    This function can be used to provide deep-nested source directory&lt;br /&gt;    hierarchies to the build system. Note that by default, the NDK&lt;br /&gt;    will only look for files in sources/*/Android.mk&lt;br /&gt;&lt;br /&gt;this-makefile&lt;br /&gt;    Returns the path of the current Makefile (i.e. where the function&lt;br /&gt;    is called).&lt;br /&gt;&lt;br /&gt;parent-makefile&lt;br /&gt;    Returns the path of the parent Makefile in the inclusion tree,&lt;br /&gt;    i.e. the path of the Makefile that included the current one.&lt;br /&gt;&lt;br /&gt;grand-parent-makefile&lt;br /&gt;    Guess what...&lt;br /&gt;&lt;br /&gt;Module-description variables:&lt;br /&gt;- - - - - - - - - - - - - - -&lt;br /&gt;&lt;br /&gt;The following variables are used to describe your module to the build&lt;br /&gt;system. You should define some of them between an 'include $(CLEAR_VARS)'&lt;br /&gt;and an 'include $(BUILD_XXXXX)'. As written previously, $(CLEAR_VARS) is&lt;br /&gt;a script that will undefine/clear all of these variables, unless explicitely&lt;br /&gt;noted in their description.&lt;br /&gt;&lt;br /&gt;LOCAL_PATH&lt;br /&gt;    This variable is used to give the path of the current file.&lt;br /&gt;    You MUST define it at the start of your Android.mk, which can&lt;br /&gt;    be done with:&lt;br /&gt;&lt;br /&gt;      LOCAL_PATH := $(call my-dir)&lt;br /&gt;&lt;br /&gt;    This variable is *not* cleared by $(CLEAR_VARS) so only one&lt;br /&gt;    definition per Android.mk is needed (in case you define several&lt;br /&gt;    modules in a single file).&lt;br /&gt;&lt;br /&gt;LOCAL_MODULE&lt;br /&gt;    This is the name of your module. It must be unique among all&lt;br /&gt;    module names, and shall not contain any space. You MUST define&lt;br /&gt;    it before including any $(BUILD_XXXX) script.&lt;br /&gt;&lt;br /&gt;    The module name determines the name of generated files, e.g.&lt;br /&gt;    lib&lt;foo&gt;.so for a shared library module named &lt;foo&gt;. However&lt;br /&gt;    you should only refer to other modules with their 'normal'&lt;br /&gt;    name (e.g. &lt;foo&gt;) in your NDK build files (either Android.mk&lt;br /&gt;    or Application.mk)&lt;br /&gt;&lt;br /&gt;LOCAL_SRC_FILES&lt;br /&gt;    This is a list of source files that will be built for your module.&lt;br /&gt;    Only list the files that will be passed to a compiler, since the&lt;br /&gt;    build system automatically computes dependencies for you.&lt;br /&gt;&lt;br /&gt;    Note that source files names are all relative to LOCAL_PATH and&lt;br /&gt;    you can use path components, e.g.:&lt;br /&gt;&lt;br /&gt;      LOCAL_SRC_FILES := foo.c \&lt;br /&gt;                         toto/bar.c&lt;br /&gt;&lt;br /&gt;    NOTE: Always use Unix-style forward slashes (/) in build files.&lt;br /&gt;          Windows-style back-slashes will not be handled properly.&lt;br /&gt;&lt;br /&gt;LOCAL_CPP_EXTENSION&lt;br /&gt;    This is an optional variable that can be defined to indicate&lt;br /&gt;    the file extension of C++ source files. The default is '.cpp'&lt;br /&gt;    but you can change it. For example:&lt;br /&gt;&lt;br /&gt;        LOCAL_CPP_EXTENSION := .cxx&lt;br /&gt;&lt;br /&gt;LOCAL_C_INCLUDES&lt;br /&gt;    An optional list of paths, relative to the NDK *root* directory,&lt;br /&gt;    which will be appended to the include search path when compiling&lt;br /&gt;    all sources (C, C++ and Assembly). For example:&lt;br /&gt;&lt;br /&gt;        LOCAL_C_INCLUDES := sources/foo&lt;br /&gt;&lt;br /&gt;    Or even:&lt;br /&gt;&lt;br /&gt;        LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo&lt;br /&gt;&lt;br /&gt;    These are placed before any corresponding inclusion flag in&lt;br /&gt;    LOCAL_CFLAGS / LOCAL_CPPFLAGS&lt;br /&gt;&lt;br /&gt;LOCAL_CFLAGS&lt;br /&gt;    An optional set of compiler flags that will be passed when building&lt;br /&gt;    C *and* C++ source files.&lt;br /&gt;&lt;br /&gt;    This can be useful to specify additionnal macro definitions or&lt;br /&gt;    compile options.&lt;br /&gt;&lt;br /&gt;    IMPORTANT: Try not to change the optimization/debugging level in&lt;br /&gt;               your Android.mk, this can be handled automatically for&lt;br /&gt;               you by specifying the appropriate information in&lt;br /&gt;               your Application.mk, and will let the NDK generate&lt;br /&gt;               useful data files used during debugging.&lt;br /&gt;&lt;br /&gt;    NOTE: In android-ndk-1.5_r1, the corresponding flags only applied&lt;br /&gt;          to C source files, not C++ ones. This has been corrected to&lt;br /&gt;          match the full Android build system behaviour. (You can use&lt;br /&gt;          LOCAL_CPPFLAGS to specify flags for C++ sources only now).&lt;br /&gt;&lt;br /&gt;LOCAL_CXXFLAGS&lt;br /&gt;    An alias for LOCAL_CPPFLAGS. Note that use of this flag is obsolete&lt;br /&gt;    as it may disappear in future releases of the NDK.&lt;br /&gt;&lt;br /&gt;LOCAL_CPPFLAGS&lt;br /&gt;    An optional set of compiler flags that will be passed when building&lt;br /&gt;    C++ source files *only*. They will appear after the LOCAL_CFLAGS&lt;br /&gt;    on the compiler's command-line.&lt;br /&gt;&lt;br /&gt;    NOTE: In android-ndk-1.5_r1, the corresponding flags applied to&lt;br /&gt;          both C and C++ sources. This has been corrected to match the&lt;br /&gt;          full Android build system. (You can use LOCAL_CFLAGS to specify&lt;br /&gt;          flags for both C and C++ sources now).&lt;br /&gt;&lt;br /&gt;LOCAL_STATIC_LIBRARIES&lt;br /&gt;    The list of static libraries modules (built with BUILD_STATIC_LIBRARY)&lt;br /&gt;    that should be linked to this module. This only makes sense in&lt;br /&gt;    shared library modules. &lt;br /&gt;&lt;br /&gt;LOCAL_SHARED_LIBRARIES&lt;br /&gt;    The list of shared libraries *modules* this module depends on at runtime.&lt;br /&gt;    This is necessary at link time and to embed the corresponding information&lt;br /&gt;    in the generated file.&lt;br /&gt;&lt;br /&gt;    Note that this does not append the listed modules to the build graph,&lt;br /&gt;    i.e. you should still add them to your application's required modules&lt;br /&gt;    in your Application.mk&lt;br /&gt;&lt;br /&gt;LOCAL_LDLIBS&lt;br /&gt;    The list of additional linker flags to be used when building your&lt;br /&gt;    module. This is useful to pass the name of specific system libraries&lt;br /&gt;    with the "-l" prefix. For example, the following will tell the linker&lt;br /&gt;    to generate a module that links to /system/lib/libz.so at load time:&lt;br /&gt;&lt;br /&gt;      LOCAL_LDLIBS := -lz&lt;br /&gt;&lt;br /&gt;    See docs/STABLE-APIS.TXT for the list of exposed system libraries you&lt;br /&gt;    can linked against with this NDK release.&lt;br /&gt;&lt;br /&gt;LOCAL_ALLOW_UNDEFINED_SYMBOLS&lt;br /&gt;    By default, any undefined reference encountered when trying to build&lt;br /&gt;    a shared library will result in an "undefined symbol" error. This is a&lt;br /&gt;    great help to catch bugs in your source code.&lt;br /&gt;&lt;br /&gt;    However, if for some reason you need to disable this check, set this&lt;br /&gt;    variable to 'true'. Note that the corresponding shared library may fail&lt;br /&gt;    to load at runtime.&lt;br /&gt;&lt;br /&gt;LOCAL_ARM_MODE&lt;br /&gt;    By default, ARM target binaries will be generated in 'thumb' mode, where&lt;br /&gt;    each instruction are 16-bit wide. You can define this variable to 'arm'&lt;br /&gt;    if you want to force the generation of the module's object files in&lt;br /&gt;    'arm' (32-bit instructions) mode. E.g.:&lt;br /&gt;&lt;br /&gt;      LOCAL_ARM_MODE := arm&lt;br /&gt;&lt;br /&gt;    Note that you can also instruct the build system to only build specific&lt;br /&gt;    sources in arm mode by appending an '.arm' suffix to its source file&lt;br /&gt;    name. For example, with:&lt;br /&gt;&lt;br /&gt;       LOCAL_SRC_FILES := foo.c bar.c.arm&lt;br /&gt;&lt;br /&gt;    Tells the build system to always compile 'bar.c' in arm mode, and to&lt;br /&gt;    build foo.c according to the value of LOCAL_ARM_MODE.&lt;br /&gt;&lt;br /&gt;    NOTE: Setting APP_OPTIM to 'debug' in your Application.mk will also force&lt;br /&gt;          the generation of ARM binaries as well. This is due to bugs in the&lt;br /&gt;          toolchain debugger that don't deal too well with thumb code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-7263511422435616626?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/7263511422435616626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=7263511422435616626' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7263511422435616626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7263511422435616626'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/06/androidmk.html' title='Android.mk'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-3973177776475784687</id><published>2011-06-13T20:14:00.000-07:00</published><updated>2011-06-13T20:15:06.930-07:00</updated><title type='text'>Building Video Lan Player for Android Tablet</title><content type='html'>&lt;a href="http://wiki.videolan.org/AndroidCompile"&gt;http://wiki.videolan.org/AndroidCompile&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-3973177776475784687?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/3973177776475784687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=3973177776475784687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/3973177776475784687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/3973177776475784687'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/06/building-video-lan-player-for-android.html' title='Building Video Lan Player for Android Tablet'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-1196085705862839267</id><published>2011-06-03T15:37:00.000-07:00</published><updated>2011-06-03T15:46:41.204-07:00</updated><title type='text'>PDF Processing with Perl to include in Electric Cloud</title><content type='html'>I personally love Electric Commander from Electric cloud when it comes to run automated build. Electric Commander comes with a very good Procedure and Steps engine which can integrate on Multiple agent node and be able to execute perl script.&lt;br /&gt;At the end of the build it is always recommanded to generate a nice report sometimes after running complex automation test.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PDF Packages&lt;br /&gt;&lt;br /&gt;I like &lt;a href="http://search.cpan.org/dist/PDF-Reuse/Reuse.pm"&gt;PDF::Reuse&lt;/a&gt;, but there are several other options for PDF creation and manipulation on the CPAN.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://search.cpan.org/dist/PDF-API2/"&gt;PDF::API2&lt;/a&gt;, by Alfred Reibenschuh, is actively maintained. It is the package of choice if creating new PDF documents from scratch. &lt;br /&gt;&lt;a href="http://search.cpan.org/dist/PDF-API2-Simple/"&gt;PDF::API2::Simple&lt;/a&gt;, by Red Tree Systems, is a wrapper over the PDF::API2 module for users who find the PDF::API2 module to difficult to use. &lt;br /&gt;&lt;a href="http://search.cpan.org/dist/Text-PDF/"&gt;Text::PDF&lt;/a&gt;, by Martin Hosken, can work on more than PDF file at the same time and has Truetype font support. &lt;br /&gt;&lt;a href="http://search.cpan.org/dist/CAM-PDF/"&gt;CAM::PDF&lt;/a&gt;, by Clotho Advanced Media, is like PDF::Reuse more focused on reading and manipulating existing PDF documents. However, it can work on multiple files at the same time. Use it if you need more features than PDF::Reuse actually provides. &lt;br /&gt;Conclusions&lt;br /&gt;PDF::Reuse is a well-written and well-documented package, which makes it easy to create, combine, and change existing PDF documents. The two sample applications show some of its capabilities. Two limitations should be mentioned however, PDF::Reuse can't reuse existing bookmarks, and after combining different PDF documents some of the inner document hyperlinks might stop working properly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-1196085705862839267?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/1196085705862839267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=1196085705862839267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1196085705862839267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1196085705862839267'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/06/pdf-has-become-standard-for-text.html' title='PDF Processing with Perl to include in Electric Cloud'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-586602050854289247</id><published>2011-05-24T18:20:00.001-07:00</published><updated>2011-06-16T16:45:08.885-07:00</updated><title type='text'>TIOBE Programming Community Index</title><content type='html'>May Headline: C# and Objective-C remain the strongest climbers &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Where is Action Script ??&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/tpci_definition.htm"&gt;http://www.tiobe.com/index.php/content/paperinfo/tpci/tpci_definition.htm&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-586602050854289247?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/586602050854289247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=586602050854289247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/586602050854289247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/586602050854289247'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/05/tiobe-programming-community-index.html' title='TIOBE Programming Community Index'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-4764192018357262120</id><published>2011-05-16T20:41:00.000-07:00</published><updated>2011-05-16T20:43:27.676-07:00</updated><title type='text'>Apple/Google/Microsoft</title><content type='html'>&lt;a href="http://brooksreview.net/2011/05/ballmer/"&gt;http://brooksreview.net/2011/05/ballmer/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-4764192018357262120?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/4764192018357262120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=4764192018357262120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4764192018357262120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4764192018357262120'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/05/applegooglemicrosoft.html' title='Apple/Google/Microsoft'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-5256002733302569669</id><published>2011-05-16T14:49:00.000-07:00</published><updated>2011-05-16T14:55:30.467-07:00</updated><title type='text'>URL Escape Codes</title><content type='html'>When encoding a URL, a character may not be available on the keyboard. Other times, the character of a URL might not&lt;br /&gt;  be usable in contexts where it may conflict with a reserved character. In either case, the character can be encoded&lt;br /&gt;  with a &lt;code&gt;%&lt;/code&gt; followed by its ASCII hexadecimal equivalent code. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-nCagxWe7Rrg/TdGdQ820mHI/AAAAAAAAAO8/0lzVmXDl1Vc/s1600/URL_Escape.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 305px;" src="http://3.bp.blogspot.com/-nCagxWe7Rrg/TdGdQ820mHI/AAAAAAAAAO8/0lzVmXDl1Vc/s320/URL_Escape.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5607435925592512626" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-5256002733302569669?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/5256002733302569669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=5256002733302569669' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/5256002733302569669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/5256002733302569669'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/05/url-escape-codes.html' title='URL Escape Codes'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-nCagxWe7Rrg/TdGdQ820mHI/AAAAAAAAAO8/0lzVmXDl1Vc/s72-c/URL_Escape.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-4210241739570087968</id><published>2011-04-08T14:31:00.001-07:00</published><updated>2011-04-08T14:31:54.520-07:00</updated><title type='text'>Android Code Bar is Sweet</title><content type='html'>Love it!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-mdLTnENXDnU/TZ9-v-2FI7I/AAAAAAAAAOs/0ky0B2Eslrw/s1600/android_code_bar_is_sweet.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 158px;" src="http://2.bp.blogspot.com/-mdLTnENXDnU/TZ9-v-2FI7I/AAAAAAAAAOs/0ky0B2Eslrw/s320/android_code_bar_is_sweet.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5593328625006224306" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-4210241739570087968?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/4210241739570087968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=4210241739570087968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4210241739570087968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4210241739570087968'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/04/android-code-bar-is-sweet.html' title='Android Code Bar is Sweet'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-mdLTnENXDnU/TZ9-v-2FI7I/AAAAAAAAAOs/0ky0B2Eslrw/s72-c/android_code_bar_is_sweet.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-2304398031750173615</id><published>2011-02-20T12:22:00.001-08:00</published><updated>2011-02-20T12:22:57.921-08:00</updated><title type='text'>Hexacopter in Cameroon</title><content type='html'>Simply excellent !&lt;br /&gt;&lt;br /&gt;http://vimeo.com/18873955&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-2304398031750173615?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/2304398031750173615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=2304398031750173615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/2304398031750173615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/2304398031750173615'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/02/hexacopter-in-cameroon.html' title='Hexacopter in Cameroon'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-5273269816097871240</id><published>2011-01-13T12:08:00.000-08:00</published><updated>2011-01-13T12:16:05.709-08:00</updated><title type='text'>Execute a Java application on Windows using a batch file with command line arguments</title><content type='html'>It is tricky to write batch file aimed to execute a java application on windows if you want to process command line arguments coming from the Windows OS. Windows will report path with \ and add some " automatically when draging a file or a path on the batch file itself. While when reunning from the command line you can past a windows path using the clipboard.&lt;br /&gt;&lt;br /&gt;On the other end we all know that  java is much more happy with / inside file path.&lt;br /&gt;&lt;br /&gt;So assuming %1 is the argument you will receive from the OS, you need to replace to / and then make sure you remove the quote since you are adding the " in the batch file.&lt;br /&gt;&lt;br /&gt;REM Replace - Replace a substring using string substitution&lt;br /&gt;echo %1&lt;br /&gt;set str=%1&lt;br /&gt;echo.%str%&lt;br /&gt;set str=%str:\=/%&lt;br /&gt;echo.%str%&lt;br /&gt;REM Trim Quotes - Remove surrounding quotes via FOR command&lt;br /&gt;for /f "useback tokens=*" %%a in ('%str%') do set str=%%~a&lt;br /&gt;&lt;br /&gt;java com.mycompany.MYAPP --arg1 --arg2 --input-file="%str%" --output-file="%str%.out"&lt;br /&gt;&lt;br /&gt;more tips at &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dostips.com/"&gt;http://www.dostips.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-5273269816097871240?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/5273269816097871240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=5273269816097871240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/5273269816097871240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/5273269816097871240'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2011/01/execute-java-application-on-windows.html' title='Execute a Java application on Windows using a batch file with command line arguments'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-3452768720421938093</id><published>2010-11-15T15:23:00.000-08:00</published><updated>2010-11-15T15:26:14.144-08:00</updated><title type='text'>Free ebook: Programming Windows Phone 7, by Charles Petzold</title><content type='html'>&lt;a href="http://blogs.msdn.com/b/microsoft_press/archive/2010/10/28/free-ebook-programming-windows-phone-7-by-charles-petzold.aspx"&gt;http://blogs.msdn.com/b/microsoft_press/archive/2010/10/28/free-ebook-programming-windows-phone-7-by-charles-petzold.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This book is a gift from the Windows Phone 7 team at Microsoft to the programming community, and Charles Petzold has been a part of it. Within the pages that follow, Charles Petzold shows you the basics of writing applications for Windows Phone 7 using the C# programming language with the Silverlight and XNA 2D frameworks.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This book is divided into three parts. The first part discusses basic concepts of Windows Phone 7 programming using example programs that target both Silverlight and the XNA framework. It is likely that many Windows Phone 7 developers will choose either one platform or the other, but Charles Petzold think it’s important for all developers who have at least a little knowledge of the alternative to their chosen path.&lt;br /&gt;&lt;br /&gt;The second part of this book focuses entirely on Silverlight, and the third part on XNA 2D. For your convenience, the chapters in each part build upon previous knowledge in a progressive tutorial narrative, and hence are intended to be read sequentially.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-3452768720421938093?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/3452768720421938093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=3452768720421938093' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/3452768720421938093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/3452768720421938093'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/11/free-ebook-programming-windows-phone-7.html' title='Free ebook: Programming Windows Phone 7, by Charles Petzold'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-9038867941049882749</id><published>2010-10-25T16:00:00.000-07:00</published><updated>2010-10-25T16:02:35.690-07:00</updated><title type='text'>Facebook etc... Do you still want to trust privacy ????</title><content type='html'>http://codebutler.com/firesheep&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When logging into a website you usually start by submitting your username and password. The server then checks to see if an account matching this information exists and if so, replies back to you with a "cookie" which is used by your browser for all subsequent requests. &lt;br /&gt;It's extremely common for websites to protect your password by encrypting the initial login, but surprisingly uncommon for websites to encrypt everything else. This leaves the cookie (and the user) vulnerable. HTTP session hijacking (sometimes called "sidejacking") is when an attacker gets a hold of a user's cookie, allowing them to do anything the user can do on a particular website. On an open wireless network, cookies are basically shouted through the air, making these attacks extremely easy.&lt;br /&gt;&lt;br /&gt;This is a widely known problem that has been talked about to death, yet very popular websites continue to fail at protecting their users. The only effective fix for this problem is full end-to-end encryption, known on the web as HTTPS or SSL. Facebook is constantly rolling out new "privacy" features in an endless attempt to quell the screams of unhappy users, but what's the point when someone can just take over an account entirely? Twitter forced all third party developers to use OAuth then immediately released (and promoted) a new version of their insecure website. When it comes to user privacy, SSL is the elephant in the room.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-9038867941049882749?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/9038867941049882749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=9038867941049882749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/9038867941049882749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/9038867941049882749'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/10/facebook-etc-do-you-still-want-to-trust.html' title='Facebook etc... Do you still want to trust privacy ????'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-7517003612782138524</id><published>2010-08-13T11:37:00.000-07:00</published><updated>2010-08-13T12:19:15.090-07:00</updated><title type='text'>WxWidget/GTK vs QT</title><content type='html'>&lt;span style="font-weight:bold;"&gt;wxWidgets&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;wxWidgets can be downloaded at &lt;a href="http://www.wxwidgets.org/"&gt;http://www.wxwidgets.org/&lt;/a&gt;&lt;br /&gt;and current stable build is available at &lt;a href="http://sourceforge.net/projects/wxwindows/files/2.8.11"&gt;http://sourceforge.net/projects/wxwindows/files/2.8.11&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;wxWidgets not only works for C++, but also has bindings for python, perl, java, lua, eiffel, C# (.NET), basic, ruby and even javascript (see General Information for bindings).&lt;br /&gt;It is one of the most complete GUI toolkits. There are many utility classes.&lt;br /&gt;There is a lot of documentation (though a bit fragmented in places).&lt;br /&gt;Free for personal and commercial use.&lt;br /&gt;Whenever possible, wxWidgets uses the native platform SDK. This means that a program compiled on Windows will have the look and feel of a Windows program, and when compiled on a Linux machine, it will get the look and feel of a Linux program.&lt;br /&gt;A positive side effect is that wxWidgets is thus more likely to look, behave and feel native - sometimes including native features for free (e.g. possibility to have spellchecking built-in in all text areas on OS X).&lt;br /&gt;A negative side effect of this is that it is more likely that the behaviour is different between platforms; toolkits where widgets are lightweight lose some of the native aspect but also minimize platform-specific code (hence minimizing the risk of different behaviour from platform to platform and also minimizing the risk of platform-specific bugs). Concentrating on native looks also mean wx may not be best suited for applications that want a customized look instead of the system's theme.&lt;br /&gt;&lt;br /&gt;Windows Build extract everything under&lt;br /&gt;&lt;br /&gt;C:\wxWidgets-2.8.11&lt;br /&gt;&lt;br /&gt;Go to C:\wxWidgets-2.8.11\build\msw&lt;br /&gt;&lt;br /&gt;open wx.dsw with Visual Studio 2008. Visual Studio will then ask you if&lt;br /&gt;you want to convert the Visual Studio 6 project to visual studio vcproj.&lt;br /&gt;Select yes to all. By default wxWidgets will target win32 platform but &lt;br /&gt;you can add x64 platform.&lt;br /&gt;&lt;br /&gt;All lib will be generated under&lt;br /&gt;&lt;br /&gt;C:\wxWidgets-2.8.11\lib\vc_lib&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;wxWidget works well with GTK+ because GTK is one of the choice to build wxWidget on Linux.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;GTK+&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gtk.org"&gt;http://www.gtk.org&lt;/a&gt;&lt;br /&gt;GTK+, originally the Gimp toolkit, is a LGPL C-language GUI library for Unix systems.&lt;br /&gt;It has been ported to Windows, VMS, and other systems (MacOS X currently possible through Apple's X11.app, native version in development) using the same API. However, primary development and focus is for Unix, with multi-platform development mostly as an afterthought.&lt;br /&gt;GTK+ is the primary library used to construct user interfaces in GNOME.&lt;br /&gt;Unlike wxWidgets, GTK+ supports C (and there is a C++ wrapper called GTKMM, http://www.gtkmm.org )&lt;br /&gt;The API is quite well developed, and includes safe casting and other things; but C++ has these built in.&lt;br /&gt;It's built on top of glib, a general-purpose library (similar in some ways to the C++ STL -- it provides a few data structures, functions to help memory management, etc).&lt;br /&gt;It looks the same on all platforms, except Windows XP, where it tries (with some success) to get Windows' native look and feel with the Wimp theme, which uses UxTheme. However, it's still very much a Unix library.&lt;br /&gt;&lt;br /&gt;Building GTK+ on Windows requires MinGW and MSys which might mot be an easy task&lt;br /&gt;some &lt;br /&gt;&lt;br /&gt;Stable release for GTK+ is available on:&lt;br /&gt;&lt;br /&gt; GNU/Linux and Unix&lt;br /&gt; Windows (32-bit) and 64-bit&lt;br /&gt; OSX&lt;br /&gt;&lt;br /&gt;For windows http://www.gtk.org/download-windows.html &lt;br /&gt;there are all-in-one bundles of the GTK+ stack including 3rd-party dependencies, both of GTK+ 2.16 and 2.20. The bundles contain both binaries and a lot of developer files, many of which are relatively irrelevant. If you intend to redistribute the GTK+ run-time, you need to figure out which files you can leave out yourself. &lt;br /&gt;&lt;br /&gt;Download 2.20 bundle from &lt;a href="http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/"&gt;http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/&lt;/a&gt;&lt;br /&gt;and extract everything under&lt;br /&gt;&lt;br /&gt;C:\gtk\gtk+-bundle_2.20.0-20100406_win32&lt;br /&gt;&lt;br /&gt;Using CMake&lt;br /&gt;&lt;br /&gt;CMake is a great way to generate Visual Studio 2008 solution for wxWidgets/GTK UI.&lt;br /&gt;CMake GUI will help you browse for all library include path and library.&lt;br /&gt;Cmake will update the build folder and cache all missing entry inside&lt;br /&gt;CMakeCache.txt &lt;br /&gt;&lt;br /&gt;# This is the CMakeCache file.&lt;br /&gt;# For build in directory: c:/Dev/Project/Source/build&lt;br /&gt;# It was generated by CMake: C:/Program Files (x86)/CMake 2.8/bin/cmake.exe&lt;br /&gt;# You can edit this file to change values found and used by cmake.&lt;br /&gt;# If you do not want to change any of the values, simply exit the editor.&lt;br /&gt;# If you do want to change a value, simply edit, save, and exit the editor.&lt;br /&gt;# The syntax for the file is as follows:&lt;br /&gt;# KEY:TYPE=VALUE&lt;br /&gt;# KEY is the name of a variable in the cache.&lt;br /&gt;# TYPE is a hint to GUI's for the type of VALUE, DO NOT EDIT TYPE!.&lt;br /&gt;# VALUE is the current value for the KEY.&lt;br /&gt;&lt;br /&gt;When clicking on generate a solution for your compiler EG Visual Studio 2008&lt;br /&gt;will be generated. From there you can open the solution and step into wxWidget/GTK UI.&lt;br /&gt;GTK offer the advantage to be stable in term of API which means that if you build a UI using GTK today it should work 5 years from now.&lt;br /&gt;&lt;br /&gt;Project using GTK&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gnome.org/"&gt;GNOME Desktop&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.openmoko.com/"&gt;Openmoko&lt;/a&gt;&lt;br /&gt;&lt;a href="http://maemo.org/"&gt;Maemo surf tablet&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.gimp.org/"&gt;GIMP&lt;/a&gt; on Linux and Windows and Mac&lt;br /&gt;&lt;a href="http://www.vmware.com/"&gt;VMWare&lt;/a&gt; workstation&lt;br /&gt;&lt;a href="http://www.inkscape.org/"&gt;Inkscape&lt;/a&gt; Graphics Editor&lt;br /&gt;&lt;a href="http://projects.gnome.org/gnumeric/"&gt;Gnumeric&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and earlier&lt;br /&gt;GTK+ on BeOS and GTK+ using DirectFB&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On the other hand &lt;a href="http://qt.nokia.com/"&gt;Trolltek&lt;/a&gt; team made quite some changes between QT 3 and QT 4 which require some work to translate old code to new code. See &lt;a href="Moving from Qt 3 to Qt 4"&gt;Moving from Qt 3 to Qt 4&lt;/a&gt; http://doc.trolltech.com/4.3/porting4-overview.html&lt;br /&gt;When starting a project from scratch QT 4 would be a good solution.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;QT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Both Qt (http://www.qtsoftware.com/) and wxWidgets have many non-GUI-related classes, such as date/time, containers, networking and OpenGL functionality.&lt;br /&gt;Qt4.5 is available on MS Windows, Mac, and GNU/Linux under the LGPL and under a commercial license. All ports of wxWidgets are distributed under a permissive modified (but explicitly OSI-approved) LGPL, which allows development and distribution of proprietary applications without license costs.&lt;br /&gt;Qt doesn't have true native ports like wxWidgets does. What we mean by this is that even though Qt draws them quite realistically, Qt draws its own widgets on each platform. It's worth mentioning though that Qt comes with special styles for Mac OS X and MS Windows XP and Vista that use native APIs (Appeareance Manager on Mac OS X, UxTheme on Windows XP) for drawing standard widget primitives (e.g. scrollbars or buttons) exactly like any native application. Event handling, the resulting visual feedback and widget layout are always implemented by Qt.&lt;br /&gt;An approach similar to Qt's is achieved with wxUniversal.&lt;br /&gt;It should be noted that on KDE and Qt for Embedded Linux platforms, Qt is the native GUI library.&lt;br /&gt;Qt is used by several large projects like KDE (on the other hand, wxWidgets is used by projects like the AOL Communicator)&lt;br /&gt;Qt makes extremely liberal use of virtual functions (QWidget, the base class of all widgets in Qt had 51 at last count), giving it a more OO design than wxWidgets (which uses a more MFC-like approach using macros). What this means is fewer lines of code in general when using Qt, but faster execution speed when using wxWidgets (although the degree to which this occurs depends on whom you ask).&lt;br /&gt;Qt is used by IBM and Borland Kylix (discontinued): this should yield more reliability. However, it is rumoured that wxWidgets will be used in the next version of C++BuilderX.&lt;br /&gt;Qt has a full-featured embeddable GUI (Qt for Embedded Linux) based on GNU/Linux with framebuffer. This means that once you have Linux with /dev/fb you are ready to run examples with no additional pains. Qt for Embedded Linux has a small footprint compared with X11.&lt;br /&gt;There are numerous IDEs for Qt, QtDesigner, QtCreator, QDevelop, Edyuk as well as integrations with popular IDEs such as Visual Studio, Eclipse and XCode (though there are also several IDEs for wxWidgets).&lt;br /&gt;Qt offers reliable commercial support (but so does wx, see &lt;a href="http://www.wxwidgets.org/support/support.htm"&gt;http://www.wxwidgets.org/support/support.htm&lt;/a&gt;)&lt;br /&gt;There is nothing to stop somebody writing a Qt-based implementation of wxWidgets, though wxWidgets applications can already be made to appear Qt-ish using wxGTK and GTK-Qt (this doesn’t work too good, though).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-7517003612782138524?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/7517003612782138524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=7517003612782138524' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7517003612782138524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7517003612782138524'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/08/wxwidgetgtk-vs-qt.html' title='WxWidget/GTK vs QT'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-4037048071153720176</id><published>2010-08-05T11:40:00.001-07:00</published><updated>2010-08-05T11:50:15.999-07:00</updated><title type='text'>Internet Explorer 8 Automation with Flash content using VBScript on Windows 7 64 bit</title><content type='html'>First of all running automation of Internet Explorer with Flash Content on a 64 bit OS is not easy because by default the OS will launch 64 bit version of Internet Explorer instead of the 32 bit version.&lt;br /&gt;&lt;br /&gt;InternetExplorer.Application.vbs&lt;br /&gt;&lt;br /&gt;Set objIE = CreateObject( "InternetExplorer.Application" )&lt;br /&gt;' specify  the IE  settings&lt;br /&gt;objIE.Navigate "http://www.actimus.com"&lt;br /&gt;objIE.ToolBar        = true&lt;br /&gt;objIE.Resizable      = False&lt;br /&gt;objIE.StatusBar      = False&lt;br /&gt;objIE.Width          = 800&lt;br /&gt;objIE.Height         = 600 &lt;br /&gt;' Make the window visible&lt;br /&gt;objIE.Visible = True&lt;br /&gt;WScript.Sleep 2000&lt;br /&gt;'objIE.Refresh&lt;br /&gt;'objIE.Quit&lt;br /&gt;'Set objIE = Nothing&lt;br /&gt;&lt;br /&gt;Will lead to the following message&lt;br /&gt;&lt;br /&gt;Flash Player on 64-bit operating systems&lt;br /&gt;&lt;br /&gt;Products affected&lt;br /&gt;You might be on this page because you can't view content with the Flash Player. This is likely because your computer is running a 64-bit Web browser on a 64-bit operating system and you are trying to install Flash Player. Flash Player does not run in most 64-bit browsers. If you attempt to download the Flash Player in a 64-bit browser that does not support Flash Player, you will see a message from Adobe and a link back to this page. To install Flash Player, use a 32-bit Web browser on your 64-bit operating system. All major browsers are available in 32-bit versions and the Internet Explorer 32-bit browser is the default browser on Windows 64-bit systems.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are two InternetExplorer.Application objects on x64-bit systems, one for x32 bit, the other for x64. By default, the x64 bit version is launched when you call the object, because by default the x64 bit wscript.exe is used. But you can also launch the x32 bit version of the object by using the x32 bit version of wscript.exe and passing the vbs url to it as an argument:&lt;br /&gt;&lt;br /&gt;--------------------------------------------------&lt;br /&gt;&lt;br /&gt;Set WshShell = CreateObject("WScript.Shell") &lt;br /&gt;WshShell.Run("%windir%\SysWOW64\wscript.exe " &amp; Chr(34) &amp; "C:\test\InternetExplorer.Application.vbs" &amp; Chr(34))&lt;br /&gt;&lt;br /&gt;--------------------------------------------&lt;br /&gt;&lt;br /&gt;The same works for all other x32 bit ActiveX objects in case you have to use them.&lt;br /&gt;&lt;br /&gt;If you are using CoCreateInstance() of CLSID_InternetExplorer (to obtain an out-of-proc instance of iexplore.exe), you can pass one of these new flags in the dwClsCtx field to control which kind of server (32-bit or 64-bit) you get:&lt;br /&gt; &lt;br /&gt;    CLSCTX_ACTIVATE_32_BIT_SERVER = 0x40000,  // Pick 32 bit server over 64 bit server&lt;br /&gt;    CLSCTX_ACTIVATE_64_BIT_SERVER = 0x80000  // Pick 64 bit server over 32 bit server&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-4037048071153720176?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/4037048071153720176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=4037048071153720176' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4037048071153720176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4037048071153720176'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/08/internet-explorer-8-automation-with.html' title='Internet Explorer 8 Automation with Flash content using VBScript on Windows 7 64 bit'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-6941773731660533058</id><published>2010-08-04T20:00:00.001-07:00</published><updated>2010-08-04T20:06:49.776-07:00</updated><title type='text'>INTERACTIVE VIDEO IN FLASH CS5 USING ACTIVIDEO</title><content type='html'>Activideo is a software created by a small company Actimus which can help you generate all what you need to produce the raw data needed for an interactive video experience. For more information about Activideo visit &lt;a href="http://shop.actimus.com/"&gt;http://shop.actimus.com/&lt;/a&gt; and to see how it work visit &lt;a href="http://shop.actimus.com/demo/howitworks/"&gt;http://shop.actimus.com/demo/howitworks/&lt;/a&gt;. Some video tutorials are now available to explain you how to use Activideo &lt;a href="http://shop.actimus.com/demo/tutorials/"&gt;&lt;br /&gt;http://shop.actimus.com/demo/tutorials/&lt;/a&gt; and user who purchase the software have access to online documentation.&lt;br /&gt;&lt;br /&gt;Activideo is a fast and easy way to turn your videos into interactive presentations thanks to the export of well known Adobe XMP Metadata container. Activideo adds interactive hot spots (also called overlay sequences) to your videos. It is a simple but powerful concept: user-created hyperlinks within the video at various intervals and for specific areas in the video the same way hypertext is used on the Internet. These hyperlinks and interactive hotspots are exported into Adobe XMP RDF XML file format. Activideo could also produce Adobe Flash Action script 3 file along with a FLA and HTML template to be able to build your custom SWF with Adobe Flash CS4 or  Adobe Flash CS5 thanks to a Plugin SDK. Actimus is about to release a live component for Flash CS5 which will provide the ability to validate/test each invisible hotspot by playing the video inside the Activideo Player.&lt;br /&gt;&lt;br /&gt;Input Formats:&lt;br /&gt;&lt;br /&gt;Activideo supports many input video file formats mostly any file format supported by the Direct Show software stack. Today, it currently supports MPEG1, MPEG2*, MPEG2-TS* transport streams including HD (720, 1080), DivX*, Microsoft AVI, Microsoft WMV* and WMV-HD *, Blueray * m2ts file, MKV, FLV and should work with WEBM (VP8). Activideo never modifies the original source video neither encode a Video. This tasks is left to Adobe Media Encoder and Adobe Bridge CS4 bundled with Adobe Flash CS4 Pro&lt;br /&gt;&lt;br /&gt;Overlays:&lt;br /&gt;&lt;br /&gt;The outlining of the overlay sequences is very precise because Activideo supports polygons with up to 100 vertices within a sequence. It performs linear interpolation of each vertex to transition smoothly from one shape to another. While the video is playing into Activideo, the user can move the current polygon location with the mouse visually to match any portion of the video associated and covered by polygon (and polygon are not visible on top of the final encoded Video. This is a human intervention process but it can be automated if the user doesn't plan to move the object on screen thanks to a very functional Wizard well suited to create a unique sequence and for example turn a logo encoded in the video into an hyperlink. To ease the overlay authoring process, a static logo sequence can be generate using the Creation Wizard. &lt;br /&gt;&lt;br /&gt;Demo version:&lt;br /&gt;Yes : Export of XMP&lt;br /&gt;No : Project saving.&lt;br /&gt;Yes : Wizard to create an interactive sequence available.&lt;br /&gt;21 days of evaluation. &lt;br /&gt;&lt;br /&gt;Full version:&lt;br /&gt;Yes : Export XMP&lt;br /&gt;Yes : Access to self registered COM Export Plug-ins available through Export As Menu&lt;br /&gt;NO activation required.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-6941773731660533058?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/6941773731660533058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=6941773731660533058' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6941773731660533058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6941773731660533058'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/08/interactive-video-in-flash-cs5-using.html' title='INTERACTIVE VIDEO IN FLASH CS5 USING ACTIVIDEO'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-4352855134743938065</id><published>2010-07-30T16:52:00.000-07:00</published><updated>2010-07-30T17:17:28.279-07:00</updated><title type='text'>Nokia QT with Visual Studio 2008 and MFC to QT</title><content type='html'>DOWNLOAD QT SOURCE CODE&lt;br /&gt;As the option to download only the Qt source code is a bit obfuscated on the current Nokia website, please follow these directions:&lt;br /&gt;&lt;br /&gt;Go to http://qt.nokia.com/downloads and click the Go LGPL button.&lt;br /&gt;Since you want only source code, look at the Qt: Framework Only column on the right.  Click e.g. Download Qt libraries 4.6.3 for Windows (VS 2008, 194 MB) — choose the VS2008 one.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This starts the download for pre-built Qt.  But we don’t want that as we will be building Qt ourselves.  A page will appear with &lt;Source code available on this link&gt;.  Cancel the Save As dialog in your browser to cancel the binaries download you had clicked on, then click on this link, e.g. http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.6.3.zip&lt;br /&gt;Unzip the file into e.g. c:\qt\4.6.3-vc.  Please use a path with no embedded spaces, as the Qt build tools have issues with them.&lt;br /&gt;SET ENVIRONMENT VARIABLES&lt;br /&gt;Open Computer Properties | Advanced system settings | Environment Variables:&lt;br /&gt;&lt;br /&gt;Edit environment variable to add:  QTDIR = c:\qt\4.6.3-vc&lt;br /&gt;Edit the PATH environment variable to add:  %QTDIR%\bin&lt;br /&gt;Either close all command prompts and Visual Studio instances, or reboot... the computer so the new command-line takes effect.&lt;br /&gt;BUILD VC++ VERSION OF QT&lt;br /&gt;Open a Microsoft Visual Studio 2008 Command Prompt, which is a command console with environment variables set for the specified VS.  This is easily accomplished using Start | All Programs | Microsoft Visual Studio 2005 (or 2008) | Visual Studio Tools | Visual Studio 2005 (or 2008) Command Prompt.&lt;br /&gt;Cleanup any previous build:&lt;br /&gt;c:\&gt; cd c:\qt\4.6.3-vc&lt;br /&gt;c:\qt\4.6.3-vc&gt; nmake distclean&lt;br /&gt;&lt;br /&gt;c:\qt\4.6.3-vc&gt; rm -rf tmp*  // &lt;– recursively remove all tmp\ folders and files&lt;br /&gt;I use GNU Tools or even better Cygwin. Cygwin is very useful because you can also build other open source unix source code library including complicated ffmpeg that you may want to link to your QT project. You can &lt;a href="http://sourceforge.net/projects/getgnuwin32/files/"&gt;download &lt;/a&gt;the &lt;a href="http://gnuwin32.sourceforge.net/"&gt;gnuwin32 package&lt;/a&gt; maintenance utility on the &lt;a href="http://sourceforge.net/projects/getgnuwin32/"&gt;sourceforge.net&lt;/a&gt; project portal. Cygwin can be downloaded &lt;a href="http://www.cygwin.com/"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. Run Configure to target platform vc2008:&lt;br /&gt;&lt;br /&gt;c:\qt\4.6.3-vc&gt; configure -platform win32-msvc2008 &lt;other options as needed&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Run Configure with no parameters to see a help screen.  Configure generates nmake compatible makefiles to build all the Qt DLL’s, tools, and demos.&lt;br /&gt;&lt;br /&gt;4.  Run nmake to build.&lt;br /&gt;&lt;br /&gt;c:\qt\4.6.3-vc&gt; nmake&lt;br /&gt;&lt;br /&gt;It will take awhile, but this grinds through building the specified Qt DLL’s, tools, and demos with Visual Studio.&lt;br /&gt;&lt;br /&gt;INSTALL VISUAL STUDIO ADD-IN&lt;br /&gt;The Qt Visual Studio Add-in is indispensible for developing Qt apps in Visual Studio. The Add-in has replaced the previous Qt Visual Studio Integration, which was only available to Commercial customers.  Now the Add-in is used by both LPGL and Commercial licensees, and the Integration has been deprecated.  While the Add-in does not allow integrated .ui editing (it instead launches Qt Designer to edit .ui files), it is fully supported and maintained by Nokia, whereas the Integration hadn’t been modified since the 4.3/4.4 timeframe.&lt;br /&gt;&lt;br /&gt;Because Visual Studio Express does not allow add-ins, using these free versions of Visual Studio is not recommended for Qt development.  You need at least Visual Studio Standard (Pro, Team System, etc. of course will also work).&lt;br /&gt;&lt;br /&gt;1.  Download and install the Qt Visual Studio Add-in to install the Qt plug-in into Visual Studio (both 2005 and 2008 are supported by the add-in).&lt;br /&gt;&lt;br /&gt;2.  Start Visual Studio.&lt;br /&gt;&lt;br /&gt;3.  Select menu Qt | Configure Qt Versions.  Add c:\qt\4.6.3-vc.&lt;br /&gt;&lt;br /&gt;4.  Now Qt is fully functional, and you can use VS2008 to build Qt apps.&lt;br /&gt;&lt;br /&gt;QT IN VISUAL STUDIO&lt;br /&gt;1.  See Qt menu item.  Launch Qt Designer (the Resource editor) and Qt Linguist (the localization tool).&lt;br /&gt;&lt;br /&gt;2.  Create new Qt projects.  File | New project, select Qt4 project.&lt;br /&gt;&lt;br /&gt;3.  Read Qt Help.  Available from Help menu (Qt help is merged in with Visual Studio Help and viewed in Document Explorer.)  Or, manually launch&lt;br /&gt;&lt;br /&gt;C:\Qt\4.6.3-vc\bin\assistant.exe&lt;br /&gt;&lt;br /&gt;4.  The &lt;a href="http://wholetomato.com/"&gt;Whole Tomato Visual Assist X plug-in&lt;/a&gt; is highly recommended to develop Qt within Visual Studio&lt;br /&gt;&lt;br /&gt;=====================================&lt;br /&gt;&lt;br /&gt;How to generate a vc proj from a .pro QT file&lt;br /&gt;&lt;br /&gt;there are two ways to do it.&lt;br /&gt;&lt;br /&gt;1. On the command line with "qmake -tp vcapp -r yourProfile.pro"&lt;br /&gt;&lt;br /&gt;Ensure that the QMAKESPEC environment variable is set to the appropriate value.&lt;br /&gt;If you use Visual Studio 2008, then win32-msvc2008 is the correct value.&lt;br /&gt;&lt;br /&gt;To set your environment variables in Windows, please see &lt;a href="http://en.wikipedia.org/wiki/Environment_variable"&gt;http://en.wikipedia.org/wiki/Environment_variable&lt;/a&gt;&lt;br /&gt;Note that you may have to re-open a command window before your settings are changed.&lt;br /&gt;To check that your PATH is set correctly:&lt;br /&gt;C:\&gt; qmake -v&lt;br /&gt;QMake version: 2.01a&lt;br /&gt;Using Qt version 4.6.3 in C:\Qt\4.6.3\lib&lt;br /&gt;To see if QMAKESPEC is set correctly:&lt;br /&gt;C:\&gt; echo %QMAKESPEC%&lt;br /&gt;%QMAKESPEC% // not set&lt;br /&gt;win32-msvc2008 // set&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. With the Qt Visual Studio integration via the menu "Qt-&gt;Open From &lt;br /&gt;.pro File" and save your project to also save the visual studio solution .sln file&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;==================== MFC AND QT&lt;br /&gt;&lt;br /&gt;This walkthrough covers the migration of an MFC based program, generated by Microsoft Visual Studio's MFC Application Wizard, to the Qt toolkit using the Windows Migration Framework.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://doc.trolltech.com/solutions/qtwinmigrate/winmigrate-walkthrough.html"&gt;http://doc.trolltech.com/solutions/qtwinmigrate/winmigrate-walkthrough.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and Nokia as a very nice landing page for this&lt;br /&gt;&lt;br /&gt;&lt;a href="http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Windows/qtwinmigrate/"&gt;http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Windows/qtwinmigrate/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-4352855134743938065?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/4352855134743938065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=4352855134743938065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4352855134743938065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4352855134743938065'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/07/nokia-qt-with-visual-studio-2008-and.html' title='Nokia QT with Visual Studio 2008 and MFC to QT'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-1979847244724663017</id><published>2010-07-26T16:18:00.000-07:00</published><updated>2010-07-26T18:09:09.490-07:00</updated><title type='text'>Anti Hacker Rules</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Anti-Hacker Standard Practices&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The task of protecting your software from hackers is not easy. Put simply, complete and total protection - is not possible. If the hacker has access to your complete program, they can eventually break any and all protections you put in their way. This is not opinion - it is a fact. This is simply because they control the hardware at the most "intimate" level on which your program is running. As you know, a program is simply a set of instructions. Since the hacker controls the hardware on which those instructions are executed, eventually they will find the instructions in your program where your protections lie and simply change them.&lt;br /&gt;&lt;br /&gt;A simple analogy illustrates this point: You have a lock on the front-door to your home don't you? When you leave the house, do you lock it? Of course you do. Why? You lock it because you don't want people to steal your stuff. If the door was unlocked, they would walk in and rob you. But, ask yourself, if they really wanted to get in, could they? If they had a crowbar and a chain-saw of course they could, sometimes they could simply kick in the door. If you had a great deal of valuables, you might get an alarm-system or a stronger door, but again, if they really wanted to rob you - they could. Software that resists hackers is just like a home with a locked door. You must make a reasonable attempt to keep your software safe since that will "keep the honest people honest", but at the same time, do not delude yourself into a false sense of security.&lt;br /&gt;&lt;br /&gt;Of course - all is not lost. We recommend that, in light of this knowledge and accepting the facts as they are, instead of playing "the game" of protection with the intent to "win" (to completely stop the hackers) - we play for an impasse. Since we know that a "win" is impossible, we play the "game" for the next best thing - a tie. What we mean by a "tie" is that you should engineer your protections in such a way that:&lt;br /&gt;&lt;br /&gt;It is as difficult, tedious and time consuming as possible for a cracker to crack. &lt;br /&gt;Is difficult to crack successfully or without breaking some key part of the program. &lt;br /&gt;If cracked, can be quickly and easily changed so the crack no longer works with the current version of the software. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What can you, as a developer, do to make your implementation of you software licensing solution as secure as possible? &lt;br /&gt;What can you, as a developer, do on an ongoing basis, in order to make your software as secure as possible? &lt;br /&gt;Anti-hacker standard practices are just that - standard. They should not be limited solely to your implementation of the licensing System and the code around it. So, in fact, the two concerns above are one and the same. Below are several simple "tricks" you should consider, that when used together, will force crackers trying to defeat your system to invest incrementally more time in doing so. When used in conjunction with the licensing System, their job will be unpleasant to say the least. Please be sure you understand that the purpose of playing the "game" is an impasse. &lt;br /&gt;&lt;br /&gt;Here are several standard things you should do in any software you wish to protect to slow down crackers:&lt;br /&gt;&lt;br /&gt;1 - Never give any registration or protection testing function a self describing name. Never use a function name like "IsActivated". Crackers will quickly locate these names (in most high level languages) and simply remove or rewrite them. &lt;br /&gt;2 - Avoid unnecessary error messages. If your program gives an error message after an unsuccessful activation attempt, the crackers will be able to quickly locate the error message and know that at some point in the call stack immediately before it - a protection or activation-test function call failed. &lt;br /&gt;3 - Wait using a timer in a separate thread to provide error messages. When an error message is unavoidable, you may wish to set a timer in a separate thread that will fire several seconds or minutes later to warn the user and take action. This makes tracing back to the protection call that caused the timer to start up more difficult and will slow the cracker down. &lt;br /&gt;4 - Encrypt any and all protection strings. When an error message in unavoidable, be sure to dynamically generate the message string itself. The best way to do this is to store it in encrypted form in the binary and decrypt only immediately before you need it. This makes searching for the string very difficult. Better yet - encrypt all your programs strings. &lt;br /&gt;5 - Use random tests for activation. Test that the program is correctly activated at random time intervals; hours, days or even weeks after it was first installed and run. Possibly test only after certain key functions (unrelated to activation) are used. This will often be missed by crackers and again will slow them down or make their crack worthless. &lt;br /&gt;6 - Don't start the activation test for several seconds (or even minutes) after the activation.  you may wish to store any Activation Codes input by the user temporarily in memory and after a brief pause try to activate them. You may even wish to require the user to restart the program before you input the value. This makes it difficult to trace and will slow the cracker down. &lt;br /&gt;7 - Use CRC checksums in your application and dlls. Have your EXEs check themselves, check other DLLs, or even have them check each other. Consider computing a checksum on just a small section of the file itself instead of the whole thing - this makes the crackers job more difficult. &lt;br /&gt;8 - Use Anti-Debugging tricks. Be sure you have read the Anti-Debugging section for more information on how to slow down crackers by having your software resist debuggers. &lt;br /&gt;9 - Use Anti-Disassembling tricks. Be sure you have read the Anti-Disassembling section for more information on how to slow down crackers by having your software resist disassembling. &lt;br /&gt;10 - Use more activation checking routines than the minimum necessary. You should test in several places, and in places where the crackers might not expect it. Check at random time intervals too (see above). One routine requires a time investment from the cracker to remove, then more routines will require even more time to break. &lt;br /&gt;11 - Use Honey Pots. A "Honey Pot" is a fake or decoy routine (or set of routines) you code into your program that seem to check activation, but in fact - does nothing.  Have it write and read registry keys, manipulate files, jump all over in memory computing useless values and doing meaningless comparisons. Use your imagination here. Name honey pots to draw the crackers attention (like "CheckReg"). The point is to waste their time with a ruse. &lt;br /&gt;12 - Wrap Activation testing routines in ridiculously long code. Consider using several long procedures which do a huge amount of unnecessary (but seemingly meaningful) processing. At some point during this useless processing, legitimately check the activation. Consider even checking it two or three times in different ways. This make the crackers job of tracing through this giant jumble of assembly looking for the "real" code a more frustrating experience. This will slow them down. Your testing routines can safely take 5 to 20 seconds to execute on a reasonably fast machine. &lt;br /&gt;13 - If you use a demo version of your software with limited features, make sure you don't have "grayed out" buttons or menu options. A cracker can simply change the enabled property of these controls which will effectively make your features visible again. It is always preferable to dynamically create these controls only when they are available. &lt;br /&gt;If you use a demo version of your software with limited features, consider not distributing the actual binary code to execute those functions. The simplest way to do this is to include the "paid version only code" inside a DLL which is called from your program when it is legitimately purchased. Then when a customer purchases your software, give them an Activation Code to release your software protections as well as the required DLL containing the code for the missing features. &lt;br /&gt;14 - If your program has been cracked, release a new version. This is probably the most important principle which makes all the above tricks worth while. Once you have wasted the crackers time as much as possible, slowing them down with all these tricks (and others you may think up yourself), you must immediately make all their hard work go to waste - release a new version fast. Change a few things around, re-organize the code, update the version number, test - and re-release. The cracker will have to start all over again. Reaction time is important too. Expect to move quickly if a crack is released. Try and release a new version as rapidly as possible to maximize the frustration effect. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;cyclic redundancy check&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A CRC (cyclic redundancy check) is a numeric value computed from some source (file, string, digest, etc). Unlike encryption, a CRC value is always the same size regardless of the source size. A CRC is also commonly referred to as a hash or a checksum. &lt;br /&gt;&lt;br /&gt;There are numerous sources on the internet for information on what a CRC is, so the algorithms wont be discussed in depth here.  Regardless - it may be preferable from a security standpoint for you to develop your own CRC algorithm variation based on a well-known cryptographically secure one.  &lt;br /&gt;&lt;br /&gt;A CRC can be used to help slow down hackers by computing a CRC checksum of some file (on Windows your EXE or a DLL) and comparing the computed value with a stored value from a known and trusted source. If any of the instructions have been changed, the CRC checksum will not match.&lt;br /&gt;&lt;br /&gt;This can be used by your software team in a couple ways to slow down the crackers:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Trojan Server Attack&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A cracker may try to replace the DLL (in case of COM with a Trojan COM server with the exact same interface but whose functions always returns true values). You can use a CRC value to attempt to defeat this attack: &lt;br /&gt;The basic premise is:&lt;br /&gt;&lt;br /&gt;On Windows Operating Systems, read from the registry the location of the DLL based on the known GUID of the COM server you want to check. &lt;br /&gt;If that file exists, calculate a CRC checksum on it. (Any CRC or hashing algorithm can be used - it doesn't matter). &lt;br /&gt;Compare the checksum calculated against your known checksum which you have previously computed on a trusted copy of the COM server. Take action depending on the match. &lt;br /&gt;Perform a CRC check on the dll every time your program starts but before you actually use the system. Check the return value of the CRC check on the dll against a value you store inside your program. If they are not the same - the dll has been swapped, damaged or altered. To make this even more secure have the value inside the program you check against be stored in three different places, and assemble it just before you use it. A C++ example follows where, at development time, you have already run your CRC function on a trusted copy of the dll file and you know it should return a value of 3070908778 :&lt;br /&gt;&lt;br /&gt;char buffer1[25] = {'\0'};&lt;br /&gt;char buffer2[25] = {'\0'};&lt;br /&gt;const char * val1 = "778"; // declared in a different module somewhere&lt;br /&gt;const int val2 = 3070; // declared in a different module somewhere&lt;br /&gt;static int val3 = 908; // maybe read from the registry where your installer wrote it.&lt;br /&gt;&lt;br /&gt;if (CRCCheck("mydll.dll") != atol(strcat(strcat( itoa(val2, buffer1, 10), itoa(val3, buffer2, 10)), val1)))&lt;br /&gt;{&lt;br /&gt;// DefeatAttempt! - shut down.&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;You can even implement or use you own version of itoa, atol and strcat&lt;br /&gt;&lt;br /&gt;CRCChecks can be quite simple to implement. We suggest that you use your own CRC to ensure that it is original.&lt;br /&gt;&lt;br /&gt;Binary Instruction Replacement Attack&lt;br /&gt;A cracker may simply replace the protection calls in your program to do nothing - ignoring the COM server altogether.  In fact - this is a very common attack used by most crackers.  You can use a CRC value to attempt to defeat this attack: &lt;br /&gt;&lt;br /&gt;All 32-bit executables have a CRC checksum field in their programs PE header. You can force your compiler to generate this checksum. Then, using the Win32 API MapFileAndCheckSumA() you can get both the computed checksum and the stored one. Then simply compare them. This of course only works if the cracker doesn't change the stored one, but can sometimes be effective. There are many more sophisticated approaches to using CRCs in your program to detect the integrity of both itself and external modules (dlls) but they are beyond the scope of this help file.&lt;br /&gt;&lt;br /&gt;You may even wish to consider computing the checksum on just a small section of the file itself instead of the whole thing - this makes the crackers job more difficult. Don't just have EXEs and DLLs check themselves, have them check each other.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Anti-Debugging&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Debuggers are tools just like your IDE that allow crackers to trace a programs execution as they are running - instruction by instruction.&lt;br /&gt;&lt;br /&gt;There are numerous anti-debugging tricks that are documented in books and on-line, but all approach the problem from two specific angles:&lt;br /&gt;&lt;br /&gt;They attempt to detect any debugger that is currently attached to the process or running in the background.&lt;br /&gt;&lt;br /&gt;They attempt to detect specific debuggers (like SoftICE and others).&lt;br /&gt;&lt;br /&gt;Protected software should use some sophisticated techniques to protect you from debuggers in both these ways, However, this is only effective when the Binary/DLL methods are actually called to perform some action. To be even more resistant you should consider implementing anti-debugging tricks of your own.&lt;br /&gt;&lt;br /&gt;There are simply too many well-documented ways to detect specific debuggers (like SoftICE) available to discuss them here. Many of them are very complex to implement or are ineffective. Instead, we suggest you make at least a simple attempt to detect debuggers. The simplest way to do this is with the Win32 API function call "IsDebuggerPresent". Although this is relatively simple to replace by most crackers, and only works on Windows NT, 2000 and XP, placing it in various unexpected locations in your program can sometimes be quite effective at slowing them down.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Anti-Disassembling&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Disassemblers are tools crackers use to translate application code back into assembler or even a higher level language. There are several disassemblers on the market of various quality. Some even write comments on the translated code, which makes it easier for the cracker to understand.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Since the purpose of disassembling is to understand the programs code, a good way to counter disassemblers is to make it more incomprehensible internally. The simplest way to defend against disassemblers is to insert numerous small bits of code in between the legitimate program code instructions that do nothing meaningful, but appear to, and are complex to understand.&lt;br /&gt;&lt;br /&gt;A simple way to do this is to define a number of anti-disassembling macros and inline functions. Use your imagination to write these macros and functions. Do lots of pointer arithmetic and mathematical transformations. Conditionally and unconditionally jump all around in memory. Make sure your anti-disassembling routines are macros or inline functions so the anti-disassembling code gets pre-processed and duplicated everywhere it is placed (instead of a simple function call which can be found and replaced in a single location by a cracker).&lt;br /&gt;&lt;br /&gt;Then, sprinkle these macros and functions liberally around areas of your programs you wish to protect from disassembling. Increase the density of the routines around sensitive areas. Naturally this will increase the footprint of your binary and can potentially impact performance so use this trick very wisely. You may wish to reserve its use for areas only around your protections and licensing code.&lt;br /&gt;&lt;br /&gt;The more you can make the crackers job tedious, the more time he will have to invest in cracking your software - which is the ultimate goal - to slow them down as much as possible.&lt;br /&gt;&lt;br /&gt;Reading&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/search?index=books&amp;linkCode=qs&amp;keywords=1597494224"&gt;http://www.amazon.com/gp/search?index=books&amp;linkCode=qs&amp;keywords=1597494224&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/search?index=books&amp;linkCode=qs&amp;keywords=0321294319"&gt;http://www.amazon.com/gp/search?index=books&amp;linkCode=qs&amp;keywords=0321294319&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/search?index=books&amp;linkCode=qs&amp;keywords=0072262877"&gt;http://www.amazon.com/gp/search?index=books&amp;linkCode=qs&amp;keywords=0072262877&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.technet.com/b/markrussinovich/archive/2005/10/31/sony-rootkits-and-digital-rights-management-gone-too-far.aspx"&gt;http://blogs.technet.com/b/markrussinovich/archive/2005/10/31/sony-rootkits-and-digital-rights-management-gone-too-far.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/IDA-Pro-Book-Unofficial-Disassembler/dp/1593271786/ref=pd_sim_b_7"&gt;http://www.amazon.com/IDA-Pro-Book-Unofficial-Disassembler/dp/1593271786/ref=pd_sim_b_7&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-1979847244724663017?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/1979847244724663017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=1979847244724663017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1979847244724663017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1979847244724663017'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/07/anti-hacker-rules.html' title='Anti Hacker Rules'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-4303889469433833294</id><published>2010-07-26T14:30:00.000-07:00</published><updated>2010-07-26T14:33:02.709-07:00</updated><title type='text'>Qualcomm Snapdragon vs OMA Texas Instrument</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QCVVuSkYgpc/TE3-xclQOoI/AAAAAAAAAOU/3SL3Z-6_dKU/s1600/iphone4_droidx_incredible_evo4g_nexusone.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/TE3-xclQOoI/AAAAAAAAAOU/3SL3Z-6_dKU/s1600/iphone4_droidx_incredible_evo4g_nexusone.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5498330845528734338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Qualcomm Snapdragon platform continues to generate robust industry attention to accompany its steadily expanding customer base. At the recent COMPUTEX 2010 show, Qualcomm unveiled the sampling of the third generation of its Snapdragon platform – namely its first dual-CPU Snapdragon chipsets consisting of the MSM8260, MSM8660 and QSD8672 products that feature enhanced dual cores that can run at up to 1.2GHz and 1.5GHz respectively, and are targeted at the high-end smartphone market area (the third generation Snapdragon platform is expected to support commercial products by the end of 2010). The new third-generation Snapdragon products complement its first-generation QSD8x50 1GHz core product and the second-generation MSM8x55 and QSD8x50A products with 1GHz enhanced core, including multimedia optimizations and 1.3GHz enhanced core respectively. &lt;br /&gt;&lt;br /&gt;The Snapdragon platform can be viewed as competing within the mobile application processor market segment (also referred to as the mobile multimedia processor market segment). Today the application processor segment includes IC platforms that typically integrate the application processor core along with additional functions such as baseband modem andwireless connectivity functions onto a single system-on-a-chip (SoC); this includes the Qualcomm Snapdragon. The application processor market also consists of IC platforms that exclude integration of baseband modems (e.g., TI’s OMAP 4). The application processor platform segment addresses a wide range of mobile devices including smartphones, mobile Internet devices (MIDs), netbooks and portable media devices. By its nature, the mobile application processor market segment attracts a wide swath of competition from the top-tier mobile silicon players, including Samsung, Apple, Intel and TI. Due to Qualcomm’s historically solid competitive foundation, based heavily on its CDMA chipset royalties, and the burgeoning traction of the Snapdragon platform (in over 140 device designs), it presents a mounting competitive challenge and thus generates the key issue of how the competition can position against the overall Snapdragon platform. &lt;br /&gt;Perspective Current Perspective&lt;br /&gt;The Snapdragon platform has been commercially available since Q4 2008 through the QSD8650 and QSD8250 first generation product offerings. From its inception, Qualcomm positioned the Snapdragon platform as an innovative breakthrough offering since it uses the in-house custom developed Scorpion CPU as the core application processor based on the ARMv7-based Cortex-A8 core. This approach has enabled Qualcomm to engineer improvements over standard off-the-shelf ARMv7-based Cortex-A8 processors in areas such as power consumption (e.g., the first Scorpion processor required 150 mW less power consumption at 600 MHz than the non-customized ARM equivalent and so on) as well as optimizing the processor design for the low-power (LP) process. As a result, the Snapdragon platform has proven a stalwart in the smartphone application processor market, as evidenced by the Snapdragon platform’s incorporation in over 140 device designs that include mobile devices that range from HTC’s Droid Incredible and Nexus One smartphones to Huawei’s S7 tablet, to name a few.&lt;br /&gt;&lt;br /&gt;For the first generation Snapdragon QSD82x0 products and the second generation Snapdragon MSM8x55 and QSD8x50A products, Qualcomm shares platform and product metrics in areas such as core processor clock speed/performance, flexible wireless connectivity functions, HD video/3D/display/camera support and O/S versatility. This gives rivals a wide range of product areas to seek selective differentiation against the Qualcomm Snapdragon platform, although Qualcomm is hardly unique in that regard. &lt;br /&gt;&lt;br /&gt;The topic of core processor clock speed and performance, for example, represents a straightforward and intuitive product area for rivals to assert competitive differentiation. The Snapdragon platform’s first-generation QSD8x50 supports a 1GHz core processor while the second-generation MSM8x55 and QSD8x50A products support a 1GHz enhanced core, including multimedia optimizations and a 1.3GHz enhanced core respectively. In contrast, Intel asserts that its x86 processor-based Moorestown platform via the Atom Z6xx processor series can support up to 1.5GHz clock speed for smartphone devices and up to 1.9 GHz clock speed for tablet devices. Such metrics will still match the third generation Snapdragon QSD8672 product that is designed to run dual cores that operate at 1.5GHz (this product should appear in mobile devices at retail by the end of 2010). This complements Intel’s overall efforts to position its Moorestown platform as prime time ready for smartphone technology due to the improvements realized in areas such as power consumption advances in battery life spans (based on 1500 mAh batteries) in support of 1080p/720p video (e..g, up to four hours for 1080p video) and browsing applications as well as multi-fold improvements gained in Java script, Web page, graphics and video performance. This includes up to fourfold Java script performance improvement and at least a doubling of Web page download performance and graphic performance in relation to the Qualcomm Snapdragon platform as well as wielding the industry’s only across-the-board support of 1080 HP/MP/BP 30 fps and 720 HP/MP/BP 30 fps video capabilities. Intel’s overall R&amp;D investment and marketing blitz on behalf of the Moorestown platform is certainly targeted at Snapdragon, as well as advancing Intel’s longstanding ambition to promote the x86 processor architecture as a viable alternative to the ARM processor architecture that dominates the mobile device silicon market today. Intel hopes to play a more prominent role within the overall mobile device silicon market beyond netbook silicon. There is a bit of irony here as Intel is looking to use the Intel Moorestown platform to attack the ARM-centric Snapdragon platform in Qualcomm’s backyard of smartphone and tablet silicon, while Qualcomm is developing the Snapdragon platform to help more directly challenge Intel’s prominence within the netbook silicon segment.&lt;br /&gt;&lt;br /&gt;Apple, Samsung and TI are Qualcomm rivals that also use the customization of the ARMv7-based Cortex-A8 processor to achieve select advancements over the standard ARM offering. Samsung and Apple currently have a strange bedfellow arrangement that can influence how they position their respective platforms against the Snapdragon platform. Samsung collaborated with Intrinsity in developing and introducing its 45nm-based Hummingbird platform during 2009. In April 2010, it was revealed that Apple acquired Intrinsity in stealth mode to lock up the FastCore intellectual property (IP) that was instrumental in realizing the iPad A4 processor’s enhancements to standard issue ARM Cortex-8 core processor technology (e.g., achieving 1 Ghz clock speed on a 45nm process). Through the acquisition, Apple can promote that its A4 processor development efforts are dedicated exclusively to the support of Apple products such as the iPad and iPhone, and the company can avoid the dissipation of processor engineering resources that its rivals, such as Qualcomm, are obliged to perform through the open-ended support of multiple OEM products. Samsung should look to further elucidate its plans to license the Hummingbird technology to other mobile device vendors and what if any impact this has on its Apple relationship. The Apple acquisition of Intrinsity does not change the fact that Apple’s A4 technology remains based on Samsung’s 45nm SoC technology and Samsung continues to have access and wield the Hummingbird IP gained from its joint collaboration with Intrinsity prior to the Apple acquisition of Intrinsity.&lt;br /&gt;&lt;br /&gt;Samsung continues to register significant product development and marketing advances with its Hummingbird SC5PC110 processor. The Hummingbird S5PC110 runs the Samsung Galaxy S smartphone, which Samsung asserts will launch in an astonishing 110 countries. One area the Samsung can assert clear product differentiation against Qualcomm is in the area of 3D graphics. The S5PC110 processor can scale up to support 90 million triangles per second. In contrast, the Qualcomm QSD8650 delivers only 22 million triangles per second while the pending QSD8672 will do up to 80 million triangles per second. Additionally, in the related area of 2D graphics rendering, Samsung’s S5PC110 product can support up to one billion pixels per second while Qualcomm’s QSD8650 supports only 133 million pixels per second and the upcoming QSD8672 product still comes up short against Samsung with an improved 500 million pixels per second. &lt;br /&gt;&lt;br /&gt;TI’s OMAP 4 platform using the OMAP4440 processor is slated to support mobile device products that will hit retail in late 2010/early 2011. The OMAP processor series is already found in well-known mobile handset products such as the Nokia N-series, the Motorola DROID, and the Palm Pre. However, OMAP 4 dual core clock speeds are limited to just 1 GHz, and that’s for a product that is not yet in generally available mobile products. In this regard, OMAP 4 only ties the Qualcomm Snapdragon’s first generation 1 GHz product and trails both the second and third generation 1.2Ghz-1.5Ghz products. However, TI has already staked out a competitive position against Qualcomm in this area showing how apples-to-apples comparisons can prove dicey at times in the mobile silicon space. TI asserts that the OMAP 4 can deliver improved resolution display and still image metrics in relation to the Snapdragon platform, despite the core processor clock speed differentials. For example, the OMAP 4 can deliver 20-megapixel camera support while the QSD8x50 product can only handle 12-megapixel cameras. Moreover, TI advocates the OMAP 4 platform will prove more flexible in hardware support of future video codecs in relation to the Snapdragon platform. TI will also invoke that its OMAP4440 processor will use the ARM Cortex-9 architecture, which can yield performance improvements over ARM Cortex-A8 products (up to 30 percent according to ARM) and more flexible dual core power management arrangements.&lt;br /&gt;&lt;br /&gt;Overall the most serious long-term competitive threats to the Qualcomm Snapdragon platform within the smartphone and tablet application processor market will prove to be the major mobile silicon players such as Samsung, Apple and TI, as well as Intel, who already possess competitive application processor platforms targeted specifically at smartphone, MID and tablet products. Mobile silicon rivals such as Marvell, Freescale, NVIDIA and ST-Ericsson all sport viable mobile application processor platforms but need to prove they can move the market needle more within the mobile application processor market segment to mount a serious challenge to Qualcomm in the evolving smartphone/tablet silicon market segment. Marvell and Freescale have achieved market distinction within the ereader niche, for example, but are not able to match the Snapdragon’s presence in over 140 device design wins. Samsung, Apple, Intel and TI all possess the product differentiators in areas such as core processor clock speed/performance, power consumption metrics, and HD video/3D/display/camera video performance and the global channels to challenge the Snapdragon’s early market prominence in this area into the foreseeable future. &lt;br /&gt;Recommended Actions Vendor Actions&lt;br /&gt;• Mobile application processor vendors that target emerging 4G/LTE silicon devices should consider getting out ahead of the market in explaining how their platforms optimally complement the region-sensitive E-UTRA LTE bands (TDD/FDD modes). In general, mobile application processor vendors should posit the 4G/LTE market represents a new level playing field in the market as Qualcomm’s dominance in the CDMA/3G silicon market will not directly translate into the same type of dominance within the 4G/LTE space. &lt;br /&gt;&lt;br /&gt;• Mobile application processor vendors should note that they generally rely on third-party partners to supply fundamental mobile silicon components such as baseband modems and RF transceivers to complement their application processor platforms while Qualcomm uses integrated in-house baseband modem and RF transceiver components as part of the Snapdragon offering. This provides some latitude in asserting that they can select best-of-breed components in these areas and have more supply chain flexibility in relation to Qualcomm’s single vendor approach. &lt;br /&gt;&lt;br /&gt;• Intel should continue to pointing out that the smartphone/tablet market is still in its developing stages, which gives Intel ample opportunity to capitalize on new market opportunities in this fast growing segment. This includes pointing out that the Atom Z6xx series is already in the advanced demo stage in smartphones with 3.8”+ displays and ~15mm thin tablets and the x86 platform supports rising mobile O/Ss such as Android and MeeGo. &lt;br /&gt;User Actions&lt;br /&gt;• Smartphone and tablet OEMs need to test and contrast the Intel Atom Processor Z6xx series (prior codename Lincroft SoC) against competing ARM-based mobile device SoCs, such as Qualcomm’s Snapdragon platform, due to factors such as its compact package (i.e., 13.8x13.8x1.1mm with 0.5mm pitch), support of 19 power islands with on-die clock and power gating, new ultra low-power states (i.e., SOi1, SOi3), and the leveraging of Intel’s Hi-K 45nm LP SoC process. &lt;br /&gt;&lt;br /&gt;• Smartphone and tablet OEMs should investigate the new OS power management (OSPM) capability that accompanies the overall Moorestown platform. This includes support of integrated PMUs, software-based OS power management options, and fine-grain power management functions that create power islands for sub-systems (i.e., power is only allocated to the application running and not dispersed to idle applications, etc.) and factor in such capabilities in seeking apples-to-apples validation of Intel’s power conservation claims on behalf of the Atom Moorestown platform in relation to the Snapdragon platform&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-4303889469433833294?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/4303889469433833294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=4303889469433833294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4303889469433833294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4303889469433833294'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/07/qualcomm-snapdragon-vs-oma-texas.html' title='Qualcomm Snapdragon vs OMA Texas Instrument'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_QCVVuSkYgpc/TE3-xclQOoI/AAAAAAAAAOU/3SL3Z-6_dKU/s72-c/iphone4_droidx_incredible_evo4g_nexusone.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-6918931283150960641</id><published>2010-07-21T19:31:00.000-07:00</published><updated>2010-07-21T20:06:49.780-07:00</updated><title type='text'>Android WebKIT JS/HTML framework : PhoneGap</title><content type='html'>This guide will help you setup your first android project but not a basic one. One taking advantage of WebKIT Javascript framework.&lt;br /&gt;&lt;br /&gt;The first thing to do is to download and install all the required dependencies.&lt;br /&gt; &lt;br /&gt;Please contribute platform specific instructions where needed. &lt;br /&gt; &lt;br /&gt;Installing dependencies&lt;br /&gt; &lt;br /&gt;1. Java JDK&lt;br /&gt;If you do not already have the java JDK installed on you'r system, install the Java SE Development Kit - JDK 6 from here:&lt;br /&gt;&lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;http://java.sun.com/javase/downloads/index.jsp&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;If you're running Windows this is a standard installer file, just follow the on screen instructions for installation.&lt;br /&gt; &lt;br /&gt;2. Eclipse&lt;br /&gt;Install the Eclipse IDE for Java Developers from http://www.eclipse.org/downloads/. This a ZIP archive file, extract the folder “eclipse” for me I extracted eclipse&lt;br /&gt;under C:\eclipse . Most other flavors of Eclipse (like Aptana or platform specific builds) will also work, provided that you install all the necessary Eclipse plug-ins.&lt;br /&gt; &lt;br /&gt;3. Android SDK&lt;br /&gt;Install the Android SDK Package from here:&lt;br /&gt;&lt;a href="http://developer.android.com/sdk/index.html"&gt;http://developer.android.com/sdk/index.html&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;Extract the downloaded archive and place it somewhere you'll remember like C:\sdk\android-sdk-windows &lt;br /&gt;and add the tools sub directory to your environment PATH. Additional information and instructions for adding the Android SDK to your PATH can be found at:&lt;br /&gt;&lt;a href="http://developer.android.com/sdk/installing.html"&gt;http://developer.android.com/sdk/installing.html&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Be sure to do the following (WINDOWS):&lt;br /&gt;Add android SDK to your Path&lt;br /&gt;Add android sdk tools (\android-sdk-windows\tools) to your path. This is necessary&lt;br /&gt;for ruby to find the command "android create project" later on.&lt;br /&gt; &lt;br /&gt;4. ADT Plug-in for Eclipse&lt;br /&gt;Install the ADT Plug-in for Eclipse as described here: &lt;br /&gt;&lt;a href="http://developer.android.com/sdk/eclipse-adt.html"&gt;http://developer.android.com/sdk/eclipse-adt.html&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;5. Adding Android SDK components&lt;br /&gt;Install at least the required Android SDK components using the Eclipse ADT plug-in, as described here: &lt;br /&gt;&lt;a href="http://developer.android.com/sdk/adding-components.html"&gt;http://developer.android.com/sdk/adding-components.html&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;You can also launch the ADT tool by running android in your terminal.&lt;br /&gt; &lt;br /&gt;To verify your installation of Eclipse, Android SDK, ADT, and Java, you can build a sample “Hello World” application using the instructions located here:&lt;br /&gt;&lt;a href="http://developer.android.com/guide/tutorials/hello-world.html"&gt;http://developer.android.com/guide/tutorials/hello-world.html&lt;/a&gt;. &lt;br /&gt; &lt;br /&gt;6. Apache ANT&lt;br /&gt; &lt;br /&gt;Windows - download and unzip Apache ANT and add it to your PATH &lt;a href="http://ant.apache.org/index.html"&gt;http://ant.apache.org/index.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;7. Ruby&lt;br /&gt; &lt;br /&gt;Windows - download and install Ruby from the official site &lt;a href="http://www.ruby-lang.org/en/downloads/"&gt;http://www.ruby-lang.org/en/downloads/&lt;/a&gt; or use the RubyInstaller (recommended) here &lt;a href="http://rubyinstaller.org/"&gt;http://rubyinstaller.org/&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;8. Installing PhoneGap&lt;br /&gt;Now make sure you download the latest version of PhoneGap here: &lt;br /&gt;http://github.com/phonegap/phonegap-android.&lt;br /&gt;&lt;br /&gt;9. edit the droidgap ruby file&lt;br /&gt;&lt;br /&gt;change target_id = 5 to target_id = 6 to target Android 2.0.1 if your phone is running 2.0.1&lt;br /&gt;&lt;br /&gt;10. Build framework and sample application&lt;br /&gt;&lt;br /&gt;C:\Dev\mydroid\phonegap-android&gt;ruby ./droidgap c:/sdk/android-sdk-win&lt;br /&gt;dows/ phonegap com.phonegap.droid.demo c:/Dev/mydroid/phonegap-android/example/ c:/dev/mydroid&lt;br /&gt;/phonegap-android/phonegap/&lt;br /&gt;&lt;br /&gt;11. Once the phonegap app has been generated launch eclipse&lt;br /&gt;&lt;br /&gt;To load eclipse and be able to see the workspace location use the -showlocation parameter&lt;br /&gt;&lt;br /&gt;c:\eclipse\eclipse -showlocation&lt;br /&gt;&lt;br /&gt;12. Next is to import the generated project in eclipse, fix any compilation errors, include the phonegap jar in your project build path and finally edit AndroidManifest.xml otherway you are going to see few crashes when trying to access lower level java class &lt;br /&gt;&lt;br /&gt;I replaced the &lt; by { and &gt; by }&lt;br /&gt;&lt;br /&gt;{?xml version="1.0" encoding="utf-8"?}&lt;br /&gt;{manifest xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;package="com.tuniverse.droid"&lt;br /&gt;android:versionCode="1"&lt;br /&gt;      android:versionName="1.0"}&lt;br /&gt;{uses-permission android:name="android.permission.INTERNET" /} &lt;br /&gt;{uses-permission android:name="android.permission.CAMERA" /}&lt;br /&gt;{uses-permission android:name="android.permission.VIBRATE" /}&lt;br /&gt;{uses-permission android:name="android.permission.ACCESS_GPS" /}&lt;br /&gt;{uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" /}&lt;br /&gt;{uses-permission android:name="android.permission.ACCESS_LOCATION" /}&lt;br /&gt;{uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /}&lt;br /&gt;{uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /}&lt;br /&gt;{uses-permission android:name="android.permission.READ_PHONE_STATE" /}&lt;br /&gt;{uses-permission android:name="android.permission.RECEIVE_SMS" /}&lt;br /&gt;{uses-permission android:name="android.permission.RECORD_AUDIO" /}&lt;br /&gt;{uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /}&lt;br /&gt;{application android:icon="@drawable/icon" android:label="@string/app_name"}&lt;br /&gt;{activity android:name=".WebActivity"&lt;br /&gt;android:label="@string/app_name" android:configChanges="orientation|keyboardHidden"}&lt;br /&gt; {intent-filter}&lt;br /&gt;{action android:name="android.intent.action.MAIN" /}&lt;br /&gt;{category android:name="android.intent.category.LAUNCHER" /}&lt;br /&gt;{/intent-filter}&lt;br /&gt;{/activity}&lt;br /&gt;{/application}&lt;br /&gt;{/manifest}&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_QCVVuSkYgpc/TEeyDn9KG6I/AAAAAAAAAOE/G9zxa5BYMis/s320/androidmanifest.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 269px;" src="http://2.bp.blogspot.com/_QCVVuSkYgpc/TEeyDn9KG6I/AAAAAAAAAOE/G9zxa5BYMis/s320/androidmanifest.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5496557645563829154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;13. When your app will build with no error, you can run the application&lt;br /&gt;in the debugger or in the emulator.&lt;br /&gt;&lt;br /&gt;To view the android log (emulator) open a shell (usually the same one than the one&lt;br /&gt;used to lauch eclipse and run&lt;br /&gt;&lt;br /&gt;abt logcat&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QCVVuSkYgpc/TEevgprLNqI/AAAAAAAAAN0/xVa2TPbkh3Q/s1600/adblogcat.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/TEevgprLNqI/AAAAAAAAAN0/xVa2TPbkh3Q/s1600/adblogcat.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5496554845706598050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you want a nicer logcat output you can use some very cool python script to output the android log in color !!! Install python first from &lt;a href="http://www.activestate.com/activepython"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the colored adb logcat is a huge improvement.&lt;br /&gt;&lt;br /&gt;To easily use the code, copy the files color_console.py, coloredlogcat.py and logcat.bat to your Android SDK/Tools path like c:\android-sdk-windows-1.5_r3\tools\logcat.bat. Now, instead of running "adb logcat" just run "logcat".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can download the files &lt;a href="http://www.thomasyounsi.com/colored_logcat.zip"&gt;here&lt;/a&gt; colored_logcat.zip (3 KB) &lt;br /&gt;Thanks go to &lt;br /&gt;&lt;a href="http://jsharkey.org/blog/2009/04/22/modifying-the-android-logcat-stream-for-full-color-debugging/"&gt;Jeff Sharkey&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.burgaud.com/bring-colors-to-the-windows-console-with-python/"&gt;André Burgaud&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_QCVVuSkYgpc/TEeyZ43lGCI/AAAAAAAAAOM/DbujjeXMYAM/s1600/adblogcatcolor.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_QCVVuSkYgpc/TEeyZ43lGCI/AAAAAAAAAOM/DbujjeXMYAM/s1600/adblogcatcolor.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5496558028060956706" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To install APK applications on your Android phone do the following:&lt;br /&gt;&lt;br /&gt;Copy the APK file you want to install to your phone's memory card and insert &lt;br /&gt;the card into your Android phone.&lt;br /&gt;Go to Android Market and search for the Apps Installer application.&lt;br /&gt;Open it and click on the Install button.&lt;br /&gt;After it is installed, just open it. It will show you all the APK files stored directly in the root directory of your memory card.&lt;br /&gt;Just click on the application you want to install and it will be installed.&lt;br /&gt;&lt;br /&gt;Using the Android SDK and USB driver&lt;br /&gt;&lt;br /&gt;There is one more method that can be used, you can install APK files into your phone using the Android SDK. Download the Android SDK.&lt;br /&gt;&lt;br /&gt;First of all, install the Android SDK on your computer. You will also need &lt;br /&gt;to install the Android USB drivers to connect the SDK to your phone via USB. You can get instruction on how to install it from &lt;a href="http://developer.android.com/sdk/win-usb.html"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To install applications from other sources, you also need go to Settings -&gt; Application Settings and enable Unknown Sources. Also go to Settings -&gt; SD Card and Phone Storage -&gt; Disable Use for USB Storage. You can enable it again later.&lt;br /&gt;&lt;br /&gt;Next, just open Command Prompt and type: adb install path/file.apk&lt;br /&gt;&lt;br /&gt;where path is the full path to the APK file and file is the name of the APK application file. Your application is now installed. This is all you need to do, now just open the application on your phone and use it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-6918931283150960641?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/6918931283150960641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=6918931283150960641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6918931283150960641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6918931283150960641'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/07/android-webkit-framework-phonegap.html' title='Android WebKIT JS/HTML framework : PhoneGap'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QCVVuSkYgpc/TEeyDn9KG6I/AAAAAAAAAOE/G9zxa5BYMis/s72-c/androidmanifest.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-4363350285679149419</id><published>2010-06-30T09:30:00.000-07:00</published><updated>2010-06-30T15:15:11.700-07:00</updated><title type='text'>HTML VIDEO OPEN STANDARD GOOGLE MOVING TOWARDS VP8 (ON2)</title><content type='html'>Concerns about patents and licensing have prevented some browsers from supporting H.264; this in turn has prevented the HTML5 spec from requiring support for a standard format. We believe the web needs an open video format option. One that not only helps address the licensing concerns, but is also optimized for the unique attributes of serving video on the web. To that end, we’re excited about the new &lt;a href="http://www.webmproject.org/"&gt;WebM project&lt;/a&gt;. Google is open sourcing and contributing the VP8 codec to the WebM effort. Google, Mozilla, and Opera have all committed to support WebM, and we have already started making YouTube videos available in the WebM format. Adobe has also committed to support VP8, the video codec for WebM, in an upcoming Flash Player release.&lt;br /&gt;&lt;br /&gt;Full article here:&lt;br /&gt;&lt;a href="http://apiblog.youtube.com/2010/06/flash-and-html5-tag.html"&gt;http://apiblog.youtube.com/2010/06/flash-and-html5-tag.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tons of html 5 video sample are available at &lt;a href="http://oggtv.com/"&gt;http://oggtv.com/&lt;/a&gt; mostly ogg&lt;br /&gt;&lt;br /&gt;You’ll probably already have read up on and experimented with the new HTML5 video element, which allows us to include video inside an HTML page without the need for plugins (if not, read our Introduction to HTML5 video before going any further.) You’ll probably also be aware that there is somewhat of a disagreement over codecs going on. Opera and Firefox currently support the Ogg Theora video codec, while Safari supports the H.264 codec. Google Chrome supports both, while Microsoft have announced support for H.264 in IE9. This is not ideal, as to implement a cross-browser video with HTML5 you would need to encode and reference multiple video formats. For example:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_QCVVuSkYgpc/TCuPqAFdYxI/AAAAAAAAANk/k0HzjykqN3E/s1600/videotag2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/TCuPqAFdYxI/AAAAAAAAANk/k0HzjykqN3E/s1600/videotag2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5488638522621256466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enter WebM&lt;br /&gt;Help is just around the corner — Google has released the VP8 video codec and WebM container format under royalty-free terms, with the aim of making a high quality, open video format available across different browsers and platforms. This was announced publicly at the 2010 Google I/O conference. Opera has created an experimental WebM-enabled build, which you can play with today.&lt;br /&gt;&lt;br /&gt;Windows:&lt;br /&gt;&lt;a href="http://snapshot.opera.com/webm/Opera_1054_21868_in-WebM.exe"&gt;Windows standard installer&lt;/a&gt;  &lt;br /&gt;&lt;a href="http://snapshot.opera.com/webm/Opera_1054_21868_classic-WebM.exe"&gt;Windows classic installer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mac:&lt;br /&gt;&lt;a href="http://snapshot.opera.com/webm/Opera_10.54_21874-WebM.dmg"&gt;Mac universal binary&lt;/a&gt;&lt;br /&gt;&lt;a href="http://snapshot.opera.com/webm/Opera_10.54_21874_Intel-WebM.dmg"&gt;Mac intel package&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Linux:&lt;br /&gt;&lt;a href="http://snapshot.opera.com/webm/opera-10.54-21867-webm.i386.linux.tar.bz2"&gt;Linux 32-bit&lt;/a&gt;&lt;br /&gt;&lt;a href="http://snapshot.opera.com/webm/opera-10.54-21867-webm.x86_64.linux.tar.bz2"&gt;Linux 64-bit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It is clear that Adobe now needs to integrate webm support in Flash Player and FLash Media Server ASAP.&lt;br /&gt;&lt;br /&gt;How:&lt;br /&gt;&lt;br /&gt;by providing the user the ability to decide on various fallback&lt;br /&gt;&lt;br /&gt;If your browser supports it, HTML5 video is used. &lt;br /&gt;If HTML5 video is not supported, Adobe Flash is used.&lt;br /&gt;Finally, if all else fails, a placeholder image is shown &lt;br /&gt;This is all done without JavaScript and requires only two video encodes, one OGG file, and one MP4 file. &lt;br /&gt; &lt;br /&gt;It’s compatible with HTML 4, HTML5 (valid markup), XHTML 1 and additionally also works when served as application/xhtml+xml&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_QCVVuSkYgpc/TCuTiCQlheI/AAAAAAAAANs/D1NaSEW0qz8/s1600/videoforeverybody.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/TCuTiCQlheI/AAAAAAAAANs/D1NaSEW0qz8/s1600/videoforeverybody.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5488642783812355554" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;a href="http://camendesign.com/code/video_for_everybody"&gt;http://camendesign.com/code/video_for_everybody&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ensure your server is using the correct mime-types. Firefox will not play the OGG video if the mime-type is wrong. Place these lines in your .htaccess file to send the correct mime-types to browsers &lt;br /&gt;AddType video/ogg  .ogv&lt;br /&gt;AddType video/mp4  .mp4&lt;br /&gt;AddType video/webm .webm&lt;br /&gt;&lt;br /&gt;Now I am wondering how Microsoft is going to handle ism file format and how non microsoft browser are going to respond. The fallback mecanism should work with IE9 and support ism file format.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-4363350285679149419?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/4363350285679149419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=4363350285679149419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4363350285679149419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4363350285679149419'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/06/html-video-open-standard-google-moving.html' title='HTML VIDEO OPEN STANDARD GOOGLE MOVING TOWARDS VP8 (ON2)'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_QCVVuSkYgpc/TCuPqAFdYxI/AAAAAAAAANk/k0HzjykqN3E/s72-c/videotag2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-9218881143551897742</id><published>2010-06-24T17:50:00.000-07:00</published><updated>2010-06-24T17:56:16.313-07:00</updated><title type='text'>RTMFP</title><content type='html'>Tom Krcha (platform evangelist at Adobe) has a bunch of stuff on his website about RTMFP.  &lt;br /&gt;lately he's been focusing on some of the new advanced topics, like RTMFP Groups, but he has materials &lt;br /&gt;covering the spectrum of P2P topics.  I went to https://afcs.acrobat.com/ and sign up to test RTMFP with &lt;br /&gt;Flash Builder 4.0. The video tutorial are fantastic and the COCOMO SDK is very complete and fully loaded &lt;br /&gt;with MXML sample.&lt;br /&gt;&lt;br /&gt;Few interesting articles:&lt;br /&gt;&lt;br /&gt;  http://www.flashrealtime.com/basics-of-p2p-in-flash/&lt;br /&gt;  http://www.flashrealtime.com/ .&lt;br /&gt;  http://www.ealeyes.com/  articles and tutorials on using RTMFP&lt;br /&gt;  http://www.adobe.com/devnet/flashmediaserver/articles/p2p_rtmfp_groups.html&lt;br /&gt; &lt;br /&gt;When using the COCOMO sample avoid basic and simple authentication which hardcode&lt;br /&gt;the login and password inside the MXML. Instead take advantage of authentication using&lt;br /&gt;hash.&lt;br /&gt;&lt;br /&gt;http://livedocs.adobe.com/labs/acrobatcom/com/adobe/rtc/authentication/AdobeHSAuthenticator.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-9218881143551897742?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/9218881143551897742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=9218881143551897742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/9218881143551897742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/9218881143551897742'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/06/rtmfp.html' title='RTMFP'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-2856596079570549876</id><published>2010-06-24T00:48:00.000-07:00</published><updated>2010-06-24T13:45:08.986-07:00</updated><title type='text'>Quicktime 7 / Quicktime X</title><content type='html'>QuickTime 7.x QuickTime 7 represents one of the largest architectural changes to the QuickTime lineage since its first version Initially released on April 29,2005 in conjunction with Mac OS X v10.4 (for version 10.3.9 and 10.4.x), QuickTime 7.0 featured the following: &lt;br /&gt;• Improved MPEG-4 compliance    &lt;br /&gt;• H.264/MPEG-4 AVCcod ec &lt;br /&gt;• Core Graphics (Quartz) for screen drawing, allowing for live resizing and playback on an OpenGL surface &lt;br /&gt;• Core Audior eplacin g Sound Manager, supporting high resolution sound &lt;br /&gt;• Support for using Core Image filters in Mac OS X v10.4 on live video, also known as Core Video &lt;br /&gt;• Support for Quartz Composer (.qtz) animations &lt;br /&gt;• Support for distinct decode order and display order &lt;br /&gt;• The QTKit, aCocoa framework for QuickTime After a couple of preview Windows releases, Apple released 7.0.2 as the first stable release on September 7, 2005&lt;br /&gt;for Windows 2000 and Windows XP. Version 7.0.4, released on January 10, 2006 was the first universal binary version. But it suffered numerous bugs, including a buffer overrun, which is more problematic to most users. Apple dropped support for Windows 2000 with the release of QuickTime 7.2 on July 11,2007. The last&lt;br /&gt;version available for Windows 2000, 7.1.6, contains numerous security vulnerabilities. Apple has not&lt;br /&gt;indicated that they will be providing any further security updates for older versions. QuickTime 7.2 is the first version for Windows Vista.&lt;br /&gt;&lt;br /&gt;Apple dropped support for Flash content in QuickTime 7.3, &lt;br /&gt;breaking content that relied on Flash for interactivity, or animation tracks and those feature were removed from Flash CS4 on Adobe's side.&lt;br /&gt;Security concerns seem to be part of the decision. In QuickTime 7.3, a processor that supports SSE is required. QuickTime 7.4 does not require SSE. Unlike versions 7.2 and 7.3, QuickTime 7.4 refuses to be installed on Windows XP SP1 system (its setup program checks if Service Pack 2 is installed). QuickTime 7.5 was released on June 10,2008. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;QuickTime X QuickTime X (pronounced Quicktime Ten) is the next version of QuickTime. It was announced at WWDCon June 9, 2008. It will ship with Mac OS X v10.6 in mid-2009. It will be built upon media technology first used in iPhone OS and will have support for modern codecs and more efficient media playback. &lt;br /&gt;Creating software that uses QuickTime QuickTime consists of two major subsystems: the Movie Toolbox and the Image Compression Manager. The Movie Toolbox consists of a general API for handling time-based data, while the Image Compression Manager provides services for dealing with compressedr aster data as produced by video and photo codecs. &lt;br /&gt;Developers can use the QuickTime software development kit (SDK ) to develop multimedia applications for Mac or Windows with the C programming language or with the Java programming language (see QuickTime for Java ), or, under Windows, using COM/ActiveX from a language supporting this. The COM/ActiveX option was introduced as part of QuickTime 7 for Windows and is intended for&lt;br /&gt;programmers who want to build standalone Windows applications using high-level QuickTime movie playback and control with some import, export, and editing capabilities. This is considerably easier than mastering the original QuickTime C++ API.&lt;br /&gt;&lt;br /&gt;QuickTime 7 for Windows introduces a completely redesigned COM/ActiveX control that is fully scriptable from Visual Basic, C#, JavaScript, C++ and other applications that can host COM objects. This means that its even easier for Windows programmers to build standalone Windows applications that use QuickTime without needing to master QuickTime’s C/C++ API. Fully scriptable using either JavaScript or VBScript, automating your QuickTime workflow just got a whole lot easier.&lt;br /&gt;&lt;br /&gt;For example, if your Windows server can run a Visual Basic, C# or a JavaScript application that uses QuickTime, you have the ability to create custom QuickTime content dynamically for delivery via the Web. As long as your clients have QuickTime installed, your content will work with Windows and Mac clients, Internet Explorer and non-Internet Explorer browsers. &lt;br /&gt;&lt;br /&gt;In order to access these capabilities all you need to do is download the QuickTime 7 for Windows Software Development Kit (SDK). The old link for quicktime now point to&lt;br /&gt;&lt;a href="http://developer.apple.com/technologies/mac/graphics-and-animation.html"&gt;http://developer.apple.com/technologies/mac/graphics-and-animation.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;QuickTime 7 for Mac introduced the QuickTime Kit (aka QTKit), a developer framework that is intended to replace previous APIs for Cocoa developers. This framework is for Mac only, and exists as Objective- C abstractions around a subset of the C interface. Mac OS X v10.5 extends QTKit to full 64-bit support.&lt;br /&gt;&lt;br /&gt;QTKit is an Objective-C interface to QuickTime available on Tiger, and also available with QT7 on Panther. It supercedes the Cocoa classes NSMovieView and NSMovie with a larger set of classes which provide a comprehensive interface into QuickTime from Objective-C. In addition to basic playback and tweaking, QTKit allows full-blown editing and other such goodies.&lt;br /&gt;&lt;a href="http://developer.apple.com/legacy/mac/library/documentation/QuickTime/Conceptual/QTKitProgrammingGuide/Chapter01/Introduction.html"&gt;http://developer.apple.com/legacy/mac/library/documentation/QuickTime/Conceptual/QTKitProgrammingGuide/Chapter01/Introduction.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;QTKit is also the name of an open-source wrapper around QuickTime that was made outside of Apple. For information on that wrapper, &lt;a href="http://sourceforge.net/projects/qtkit/"&gt;http://sourceforge.net/projects/qtkit/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-2856596079570549876?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/2856596079570549876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=2856596079570549876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/2856596079570549876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/2856596079570549876'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/06/quicktime-7-quicktime-x.html' title='Quicktime 7 / Quicktime X'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-4942217043951310336</id><published>2010-06-22T13:10:00.000-07:00</published><updated>2010-06-22T13:34:52.651-07:00</updated><title type='text'>Microsoft IIS Smooth Streaming Format SDK 1.0 Beta 2</title><content type='html'>On June 18 2010, Microsoft released Beta 2 of the Microsoft IIS Smooth Streaming Format SDK 1.0.&lt;br /&gt;&lt;br /&gt;The IIS Smooth Streaming Format SDK provides application developers the capability to mux encoded video and audio elementary streams into Smooth Streaming fragmented-MP4 format that is compliant with the Smooth Streaming Format and &lt;a href="http://learn.iis.net/page.aspx/685/protected-interoperable-file-format/"&gt;Protected Interoperable File Format (PIFF) specifications&lt;/a&gt;. The IIS Smooth Streaming Format SDK includes a native C++ static library that can be linked into your applications to support the muxing of fragmented-MP4 into files or sent live via HTTP POST to a server running Internet Information Services (IIS) 7.0 and IIS Media Services 3.0 and IIS Media Services 4.0 Beta 1. The SDK is available for download &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1131db16-e278-4664-bb58-37cc8bf46593&amp;displaylang=en"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Documentation for the SDK can be found online here – &lt;a href="http://msdn.microsoft.com/en-us/library/ff402318.aspx"&gt;IIS Smooth Streaming Format SDK MSDN documentation&lt;/a&gt; and the release notes are available here – &lt;a href="http://www.iis.net/community/files/media/smoothformatsdk_readme.htm"&gt;IIS Smooth Streaming Format SDK Beta 2 Release Notes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The primary purpose of the IIS Smooth Streaming Format SDK is to enable developers to create applications that can generate PIFF compliant Smooth Streaming formatted fragmented-MP4 files for use in video-on-demand and live streaming scenarios. In addition, the SDK can be used to encrypt content using standard AES encryption as required by the PIFF specification (this SDK only supports the PlayReady specific protection headers).&lt;br /&gt;&lt;br /&gt;It is expected that the video and audio encoding functionality is done externally from the SDK.  Encoding for VC-1 can be accomplished by using the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=5031c859-e8da-41bc-98e3-c13add5378b0&amp;amp;displaylang=en&amp;displaylang=en"&gt;Microsoft VC-1 Encoder SDK – Professional&lt;/a&gt;. If you wish to do H.264 encoding, you will need to acquire a 3rd party H.264 encoding SDK and AAC audio encoder.  There are lots of encoding library choices available both free and commercial. &lt;br /&gt;&lt;br /&gt;The components of the SDK include:&lt;br /&gt;&lt;br /&gt;   1. A static-linked packaging library ssfsdk.lib, along with appropriate header files, that delivers f-MP4 wrapping capability to an application for use with the following video and audio codec combinations:&lt;br /&gt;          * Closed GOP encoded VC-1 with Elementary Stream Sequence Headers and WMA Pro, or WMA audio&lt;br /&gt;          * H.264 (AVC1 closed-GOP streams only with IDR frames at the first sample of a GOP – must not be an Annex B stream. PPS and SPS NAL units are not supported in the stream)&lt;br /&gt;          * AAC-LC audio&lt;br /&gt;   2. Sample source code for a basic on-demand muxing application that uses DirectShow to source from files.&lt;br /&gt;   3. Link to online MSDN documentation.&lt;br /&gt;&lt;br /&gt;Updates included in the Beta 2 release of the Smooth Streaming Format SDK are:&lt;br /&gt;&lt;br /&gt;    * H.264 PlayReady sub-sample encryption support.&lt;br /&gt;    * PIFF 1.1 spec compliance.&lt;br /&gt;    * Multi-language audio muxing.&lt;br /&gt;    * Text stream and TTML track muxing support.&lt;br /&gt;&lt;br /&gt;This is in addition to the following supported features:&lt;br /&gt;&lt;br /&gt;    * Support for Protected Interoperable File Format (PIFF) 1.1 compliant fragmented-MP4 file output.&lt;br /&gt;    * Support for ISO Base Media (ISO/IEC 14496-12:2008) spec compliance.&lt;br /&gt;    * Support for muxing live and on-demand content.&lt;br /&gt;    * Support for appropriate header boxes and formatting required for live streaming using IIS Media Services.&lt;br /&gt;    * Support for AES-CTR encryption of VC-1 and H.264 encoded content for use with PlayReady licensing servers and Silverlight 4.0 or higher.&lt;br /&gt;    * Support for writing out a compliant Smooth Streaming Transport Protocol server manifest files.&lt;br /&gt;    * Support for writing out a compliant Smooth Streaming Transport Protocol client manifest files.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NOTE: Beta 2 includes a “Go-Live” license if you would like to use this SDK in production applications.&lt;br /&gt;&lt;br /&gt;If you have questions on how to use this SDK in your applications, comments, or feedback on the SDK please send them to me directly or to smooth@microsoft.com. &lt;br /&gt;&lt;br /&gt;Download the Smooth Streaming Format SDK Beta 2 here:&lt;br /&gt;&lt;br /&gt;    &lt;a href="http://download.microsoft.com/download/B/4/5/B450659A-BD25-4EA5-A18A-4FDB2384E513/SSFSDK_64.msi"&gt;SSFSDK_64.msi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;    &lt;a href="http://download.microsoft.com/download/B/4/5/B450659A-BD25-4EA5-A18A-4FDB2384E513/SSFSDK_32.msi"&gt;SSFSDK_32.msi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Resources&lt;br /&gt;&lt;br /&gt;    * Download the &lt;a href="http://go.microsoft.com/?linkid=9682897"&gt;Protected Interoperable File Format specification&lt;/a&gt;&lt;br /&gt;    * Download the &lt;a href="http://go.microsoft.com/?linkid=9682896"&gt;IIS Smooth Streaming Transport Protocol Specification&lt;/a&gt;&lt;br /&gt;    * &lt;a href="http://www.iis.net/download/SmoothClient"&gt;Download the Smooth Streaming Client 1.0&lt;/a&gt;&lt;br /&gt;    * &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.web.media.smoothstreaming.aspx"&gt;API documentation for Smooth Streaming Client&lt;/a&gt;&lt;br /&gt;    * More Information on &lt;a href="http://www.iis.net/download/SmoothClient"&gt;Smooth Streaming&lt;/a&gt;&lt;br /&gt;    * More Information on &lt;a href="http://www.iis.net/download/LiveSmoothStreaming"&gt;Live Smooth Streaming&lt;/a&gt;&lt;br /&gt;    * Supporting documentation on getting started  with Smooth Streaming&lt;br /&gt;          o &lt;a href="http://learn.iis.net/page.aspx/558/smooth-streaming-for-iis-7---getting-started/"&gt;Smooth Streaming for IIS 7.0 – Getting Started&lt;/a&gt;&lt;br /&gt;          o &lt;a href="http://learn.iis.net/page.aspx/620/live-smooth-streaming-for-iis-7---getting-started/"&gt;Live Smooth Streaming for IIS 7.0 – Getting Started&lt;/a&gt;&lt;br /&gt;          o &lt;a href="http://learn.iis.net/page.aspx/689/smooth-streaming-deployment-guide/"&gt;Smooth Streaming Deployment Guide&lt;/a&gt;&lt;br /&gt;          o Building your &lt;a href="http://blogs.iis.net/vsood/archive/2009/10/14/building-your-first-smooth-streaming-player.aspx"&gt;first Smooth Streaming Player&lt;/a&gt; using SSME&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-4942217043951310336?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/4942217043951310336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=4942217043951310336' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4942217043951310336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4942217043951310336'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/06/microsoft-iis-smooth-streaming-format.html' title='Microsoft IIS Smooth Streaming Format SDK 1.0 Beta 2'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-6541302902386842334</id><published>2010-06-14T19:53:00.000-07:00</published><updated>2010-06-14T19:56:36.048-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='v'/><title type='text'>Compile Live555 using VS2008</title><content type='html'>Compile Live555 using VS2005&lt;br /&gt;Live555 is a media library to support local and streaming play media files. Its source code is easy to understand and extensible so it's suitable for doing some quick experimentals or demos. It's a cross-platform solution which supports Windows and Linux. But the original source package cannot generate the correct make file for VS2005. We need do some modification listed step by step here.&lt;br /&gt; &lt;br /&gt;1. Modify the line "TOOLS32 = ..." in win32config to point to the VS2005 installed directory in your host machine. For example, "TOOLS32 =  C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC" is corresponding to my desktop's configuration. Note that I have Windows 7 64 Bit.&lt;br /&gt; &lt;br /&gt;2. Modify the line "LINK_OPTS_0 =  $(linkdebug) msvicrt.lib" in win32config to "LINK_OPTS_0 =  $(linkdebug) msvcrt.lib", otherwise VS2008 will report msvicrt.lib cannot be found.&lt;br /&gt; &lt;br /&gt;3. Run genWindowsMakefiles.cmd to generate *.mak for VS2005/VS2008&lt;br /&gt; &lt;br /&gt;4. Modify liveMedia/RTSPOverHTTPServer.cpp to add the following code:&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;#if defined(__WIN32__) || defined(_WIN32)&lt;br /&gt;#define snprintf _snprintf&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;Not require with live.2010.06.11&lt;br /&gt;&lt;br /&gt;5. Modify groupsock/Makefile.head. Change from "INCLUDES = -Iinclude -I../UsageEnvironment/include" to "INCLUDES = -Iinclude -I../UsageEnvironment/include -DNO_STRSTREAM".&lt;br /&gt; &lt;br /&gt;6. Save the following commands into a bat file in the src directory.&lt;br /&gt;call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC&lt;br /&gt;\bin\vcvarsall.bat"&lt;br /&gt;cd liveMedia&lt;br /&gt;nmake /B -f liveMedia.mak&lt;br /&gt;cd ../groupsock&lt;br /&gt;nmake /B -f groupsock.mak&lt;br /&gt;cd ../UsageEnvironment&lt;br /&gt;nmake /B -f UsageEnvironment.mak&lt;br /&gt;cd ../BasicUsageEnvironment&lt;br /&gt;nmake /B -f BasicUsageEnvironment.mak&lt;br /&gt;cd ../testProgs&lt;br /&gt;nmake /B -f testProgs.mak&lt;br /&gt;cd ../mediaServer&lt;br /&gt;nmake /B -f mediaServer.mak&lt;br /&gt; &lt;br /&gt;7. run the saved bat file. Done :)&lt;br /&gt; &lt;br /&gt;Now it's turn to debug using VS2008, because we don't have a solution file for VS2008, so we need to find another method to debug run.&lt;br /&gt;1. you need to modify win32config to enable debug mode. Just comment the line "NODEBUG=1".&lt;br /&gt;2. File-&gt;Open-&gt;Project/Solution to load a exe file to be debugged.&lt;br /&gt;3. Debug-&gt;Step Over, it will stop at the main function entry point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-6541302902386842334?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/6541302902386842334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=6541302902386842334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6541302902386842334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6541302902386842334'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/06/compile-live555-using-vs2008.html' title='Compile Live555 using VS2008'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-8237717953449952086</id><published>2010-06-14T10:45:00.000-07:00</published><updated>2010-07-13T17:22:46.265-07:00</updated><title type='text'>HTTP SMOOTH STREAMING AND FRAGMENTED MPEG-4</title><content type='html'>&lt;TABLE style="WIDTH: 100%"&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;&amp;nbsp; &lt;/TH&gt;&lt;br /&gt;&lt;TH style="WIDTH: 25%" class=style4&gt;Microsoft &lt;BR&gt;IIS Smooth Streaming&lt;/TH&gt;&lt;br /&gt;&lt;TH style="WIDTH: 25%" class=style4&gt;Adobe &lt;BR&gt;Flash Dynamic Streaming&lt;/TH&gt;&lt;br /&gt;&lt;TH style="WIDTH: 25%" class=style4&gt;Apple &lt;BR&gt;HTTP Adaptive Bitrate Streaming&lt;/TH&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Cost per Streaming Server &lt;/TH&gt;&lt;br /&gt;&lt;TD style="WIDTH: 25%" class=style4&gt;Free download&lt;SUP&gt;&lt;A href="http://learn.iis.net/ControlPanel/themes/iis/#1" mce_href="#1"&gt;1&lt;/A&gt;&lt;/SUP&gt; + $469 for OS&lt;A href="http://learn.iis.net/ControlPanel/themes/iis/#2" mce_href="#2"&gt;&lt;SUP&gt;2&lt;/SUP&gt;&lt;/A&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD style="WIDTH: 25%" class=style4&gt;$4500&lt;A href="http://learn.iis.net/ControlPanel/themes/iis/#3" mce_href="#3"&gt;&lt;SUP&gt;3&lt;/SUP&gt;&lt;/A&gt; + OS cost&lt;A href="http://learn.iis.net/ControlPanel/themes/iis/#4" mce_href="#4"&gt;&lt;SUP&gt;4&lt;/SUP&gt;&lt;/A&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD style="WIDTH: 25%" class=style4&gt;Cost of Web server&lt;A href="http://learn.iis.net/ControlPanel/themes/iis/#5" mce_href="#5"&gt;&lt;SUP&gt;5&lt;/SUP&gt;&lt;/A&gt; + segmenter OS&lt;A href="http://learn.iis.net/ControlPanel/themes/iis/#6" mce_href="#6"&gt;&lt;SUP&gt;6&lt;/SUP&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;On-demand &amp;amp; Live Streaming &lt;/TH&gt;&lt;br /&gt;&lt;TD style="WIDTH: 25%" class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD style="WIDTH: 25%" class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD style="WIDTH: 25%" class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Live Streaming DVR&lt;SPAN class=style5&gt;&lt;A href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#7" mce_href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#7"&gt;&lt;SUP&gt;7&lt;/SUP&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/TH&gt;&lt;br /&gt;&lt;TD style="WIDTH: 25%" class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD style="WIDTH: 25%" class=style4&gt;Pause &amp;amp; Seek&lt;/TD&gt;&lt;br /&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Streaming Protocol&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;HTTP&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;RTMP&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;HTTP&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Scalability via HTTP Edge Caches&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Stateless Server Connection&lt;SPAN class=style5&gt;&lt;A href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#8" mce_href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#8"&gt;&lt;SUP&gt;8&lt;/SUP&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Supported Platforms&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;Silverlight, Xbox 360, other Smooth Streaming-compatible players, and iPhone OS 3.0&lt;A href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#9" mce_href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#9"&gt;&lt;SUP&gt;9&lt;/SUP&gt;&lt;/A&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;Flash Player 10, AIR&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;iPhone OS 3.0, devices running QuickTime X &lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;DRM Support for Live, VOD&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;PlayReady&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;None&lt;A href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#10" mce_href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#10"&gt;&lt;SUP&gt;10&lt;/SUP&gt;&lt;/A&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;None&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;DRM ASP &amp;amp; Encoder ISV Support&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Interoperable DRM (DECE Approved)&lt;SPAN class=style5&gt;&lt;A href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#11" mce_href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#11"&gt;&lt;SUP&gt;11&lt;/SUP&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Real-time Client and Server Logging&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;A href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#12" mce_href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#12"&gt;&lt;SUP&gt;12&lt;/SUP&gt;&lt;/A&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Programmable Client Side Switching Logic&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Live In-Stream Ad Integration&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp; &lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp; &lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Built-in Analytics Framework&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Delivery to Mobile Devices &lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Native 64-bit Server Support &lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&amp;nbsp;&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;&lt;IMG alt="" src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif" mce_src="http://learn.iis.net/Content_Cache/792/checkmark2%5B1%5D.gif"&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Media Container&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;MPEG 4 – Part 12 (Fragmented MP4)&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;MPEG 4 – Part 12 (MP4), FLV&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;MPEG-2 TS&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Supported Video Codecs&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;Codec Agnostic (currently supports VC-1 Advanced Profile &amp;amp; H.264 Baseline, Main, and High)&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;H.264 Baseline, Main, and High; VP6&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;H.264 Baseline Level 3.0&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Supported Audio Codecs&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;Codec Agnostic (currently supports WMA &amp;amp; AAC)&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;AAC, MP3&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;MP3, HE-AAC, AAC-LC&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Maximum Bit Rate&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;No limit&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;No limit&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;1.6 Mbps&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Default Fragment Length&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;2 seconds&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;n/a&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;10 seconds&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;End-To-End Latency&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;As low as 1.5 seconds (configurable)&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;6 seconds&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;30 seconds&lt;A href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#13" mce_href="http://learn.iis.net/page.aspx/792/adaptive-streaming-comparison/#13"&gt;&lt;SUP&gt;13&lt;/SUP&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;File Type on Server&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;Contiguous&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;Contiguous&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;Fragmented&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TH class=style3&gt;Client Programming Platform&lt;/TH&gt;&lt;br /&gt;&lt;TD class=style4&gt;Microsoft .NET Framework&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;Adobe ActionScript&lt;/TD&gt;&lt;br /&gt;&lt;TD class=style4&gt;Objective-C&lt;/TD&gt;&lt;/TR&gt;&lt;br /&gt;&lt;/TABLE&gt;&lt;br /&gt;&lt;br /&gt;Footnotes...&lt;br /&gt;1 IIS Smooth Streaming is part of the free IIS Media Services download for Windows Server 2008 and Windows Server 2008 R2 .&lt;br /&gt;2 Runs on any edition of Windows Server® 2008 or Windows Server 2008 R2 including Windows® Web Server, which has a list price of $469.&lt;br /&gt;3 Assumes use of Adobe Flash Media Interactive Server to support Pause, Seek, Authentication, and higher scalability&lt;br /&gt;4 Requires Windows Server 2003 SP2, Windows Server 2008, Red Hat® Enterprise Linux® 4, or Red Hat Enterprise Linux 5.2.&lt;br /&gt;5 Runs on any Web server. Also requires the Apple streaming segmenter – see next note.&lt;br /&gt;6 The Apple stream segmenter is a utility that receives encoded MPEG2-TS and breaks it into 10 second “chunks” for delivery. This free download requires an Intel-based Mac, with a Mac Pro or an XServe having two Ethernet network interfaces recommended.&lt;br /&gt;7 Full DVR features include Pause, Seek, Fast Forward (e.g., 2x, 5x playback speeds), Fast Rewind, Go To Live, Instant Replay, and Slow Motion.&lt;br /&gt;8 A stateless (non-persistent) connection between server and client increases scalability and allows seamless failover or rollover between load-balanced servers.&lt;br /&gt;9 Support for adaptive streaming to the Apple iPhone from IIS Media Services 4 was announced on October 18th, 2009.&lt;br /&gt;10 Future support was announced Sept. 10, 2009. Proposed availability is H1 CY10 for delivery to a future version of Adobe® Flash® Player and Adobe AIR™.&lt;br /&gt;11 Digital Entertainment Content Ecosystem (DECE, LLC) is a consortium of major Hollywood studios, consumer electronics manufacturers and retailers, network hardware vendors, systems integrators and Digital Rights Management (DRM) vendors chartered to develop a set of standards for the digital distribution of premium Hollywood content.&lt;br /&gt;12 Real-time logging for Silverlight applications using the IIS Advanced Logging extension.&lt;br /&gt;13 Encoded live streams are processed by the Apple stream segmenter. This intermediate step results in increased latency for live delivery.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.iis.net/download/SmoothStreaming"&gt;http://www.iis.net/download/SmoothStreaming&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.iis.net/download/SmoothFormatSDK"&gt;http://www.iis.net/download/SmoothFormatSDK&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It's an adaptive streaming technology combining IIS and Silverlight. The core file format is fragmented MPEG-4, where each "chunk" of video is transmitted as a moof fragment starting with a Closed GOP, via a single HTTP request. A chunk will typically be 2-4 seconds long. Audio can be either muxed into the same chunk, or be provided in a parallel series of chunks to enable multilangauge audio or what have you.&lt;br /&gt;&lt;br /&gt;The file format used is straight-up ISO fragmented MPEG-4, using XML and SMIL manifests to indicate what bitrates in the file set and where the fragments in those file are. We're not trying to make up a new file format here; just take advantage of existing technologies in a novel way.&lt;br /&gt;&lt;br /&gt;Lots of other details to be had, including this roundup of links:&lt;br /&gt;&lt;a href="http://on10.net/blogs/benwagg/Beta-Release-of-Smooth-Streaming/"&gt;http://on10.net/blogs/benwagg/Beta-Release-of-Smooth-Streaming/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;More importantly, zambelli had a great post showing how Microsoft is using the file format:&lt;br /&gt;&lt;a href="http://alexzambelli.com/blog/2009/02/10/smooth-streaming-architecture/"&gt;http://alexzambelli.com/blog/2009/02/10/smooth-streaming-architecture/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And we now have some sample files up that I encoded, including the media files and manifest files:&lt;br /&gt;http://on10.net/blogs/benwagg/Big-Buck-Bunny-Smooth-Streaming-sample-for-download/&lt;br /&gt;&lt;br /&gt;(if you're curious how it was encoded)&lt;br /&gt;&lt;a href="http://on10.net/blogs/benwagg/Behind-the-Scenes-at-SmoothHDcom-Encoding-Big-Buck-Bunny/"&gt;http://on10.net/blogs/benwagg/Behind-the-Scenes-at-SmoothHDcom-Encoding-Big-Buck-Bunny/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The current samples are VC-1 and WMA 10 Pro, but we'll be supporting H.264 and AAC-LC payloads with the next version of Silverlight later in 2009.&lt;br /&gt;&lt;br /&gt;So, if you start seeing these *.ismv files out there, just know that they're&lt;br /&gt;Fragmented MPEG-4&lt;br /&gt;With VC-1 or H.264 for video&lt;br /&gt;WMA 10 Pro or AAC-LC for audio&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For apple http streaming, a tool called mediastreamsegmenter will take an MPEG2 transport stream and split it into smaller size chunk. Mediastreamsegmenter documentation is available &lt;a href="http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/mediastreamsegmenter.1.html"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-8237717953449952086?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/8237717953449952086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=8237717953449952086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8237717953449952086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8237717953449952086'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/06/http-smooth-streaming-and-fragmented.html' title='HTTP SMOOTH STREAMING AND FRAGMENTED MPEG-4'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-3316592980310506757</id><published>2010-06-08T21:41:00.001-07:00</published><updated>2010-06-08T21:41:55.695-07:00</updated><title type='text'>HTM5 Video Tag using QuickTime</title><content type='html'>Very Interesting article about HTML 5 VIDEO TAG using SAFARI&lt;br /&gt;&lt;br /&gt;http://www.streamingmedia.com/Articles/Editorial/Featured-Articles/Note-to-Apple-Safari-%26-QuickTime-are-Not-Web-Standards-67645.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-3316592980310506757?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/3316592980310506757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=3316592980310506757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/3316592980310506757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/3316592980310506757'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/06/htm5-video-tag-using-quicktime.html' title='HTM5 Video Tag using QuickTime'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-1047187638314016150</id><published>2010-06-03T09:22:00.000-07:00</published><updated>2010-07-30T10:25:11.468-07:00</updated><title type='text'>My First iPhone application</title><content type='html'>Here's what I have in the (default) login keychain:&lt;br /&gt; • A valid intermediate CA: "Apple Worldwide Developer Relations Cerfitication Authority"&lt;br /&gt; • A valid cert named "iPhone Developer: FirstName LastName" issued by the aforementioned CA&lt;br /&gt; • A RSA 2048-bit private and public key, each named "FirstName iPhone Dev Key"&lt;br /&gt;The keychain application is available through Application/Utilities/Keychain.app.&lt;br /&gt;Once your certificate has been deployed you should see under My Certificate something like iPhone Developer: FirstName LastName.&lt;br /&gt;So far, so good. Meanwhile, on the Program Portal, you need to:&lt;br /&gt; • Registered your iPod touch&lt;br /&gt; • Add an App ID (com.mycompany.myapp). I usually create one for each app keeping the com.mycompany the same.&lt;br /&gt; • Create a Development Provisioning Profile for the aforementioned App ID, device and certificate. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ProvisioningDevelopment/ProvisioningDevelopment.html"&gt;A Provisioning Profile&lt;/a&gt; is a collection of digital entities that uniquely ties developers and devices to an authorized iPhone Development Team and enables a device to be used for testing. A Development Provisioning Profile must be installed on each device on which you wish to run your application code. Each Development Provisioning Profile will contain a set of iPhone Development Certificates, Unique Device Identifiers and an App ID.&lt;br /&gt;&lt;br /&gt;Devices specified within the provisioning profile can be used for testing only by those individuals whose iPhone Development Certificates are included in the profile. A single device can contain multiple provisioning profiles.&lt;br /&gt;&lt;br /&gt;Click &lt;a href="http://developer.apple.com/iphone/index.action"&gt;here&lt;/a&gt; to access the Developer Portal and then &lt;br /&gt;click on iPhone Provisioning Portal on the top right corner.&lt;br /&gt;In the ‘Provisioning’ section of the Portal, click on iPhone Provisioning Portal. Team Admins should click 'Add' on the Development tab. Enter a name for the provisioning profile.&lt;br /&gt;Specify which devices will be associated with the provisioning profile. You must specify a device in order for that device to utilize the provisioning profile. If a device's UDID is not included in the provisioning profile the profile and your application cannot be installed on that device.&lt;br /&gt;Specify which iPhone Development Certificates will be associated with the provisioning profile. You must specify an iPhone Development Certificate in order for the application code signed with that same certificate to run on the device.&lt;br /&gt;Specify a single App ID for the Development Provisioning Profile. Each Development Provisioning Profile can specify only ONE App ID, therefore, if you have applications requiring different Keychain access, you will need to create a separate Development Provisioning Profile for each of those applications. If you are installing a suite of applications with the same required Keychain access or have a set of applications not requiring access to the Keychain, use an App ID containing the wild-card asterisk character to build all of your applications.&lt;br /&gt;Click ‘Submit’ to generate your Development Provisioning Profile.&lt;br /&gt;&lt;br /&gt;NOTE: On the Portal, the Certificate only shows as "FirstName LastName" and not "iPhone Developer: FirstName LastName". &lt;br /&gt;&lt;br /&gt;Installing a Development Provisioning Profile&lt;br /&gt;All Team Agents, Admins and Members can download a Development Provisioning Profile from the ‘Provisioning’ section of the Portal after it has been created. Only those developers whose Apple device IDs and iPhone Development Certificates are included in the provisioning profile will be able to install and test their application on their device.&lt;br /&gt;&lt;br /&gt;In the ‘Provisioning’ section of the Provisioning Portal, click the download button next to the desired provisioning profile.&lt;br /&gt;Drag the downloaded file onto the Xcode application icon in the dock or into the ‘Organizer’ window within Xcode. This will automatically copy the .mobileprovision file to the proper directory. Alternatively, you can drag the .mobileprovision file onto the iTunes icon in the dock or copy the file to ‘~/Library/MobileDevice/Provisioning Profiles’. If the directory does not exist you will need to create it. Click on the ‘+’ button in the Provisioning section of the Organizer window to install your .mobileprovision file.&lt;br /&gt;I recommend to create the Library/MobileDevice/Provisioning Profiles else after each download you will end up with all provisioning profile under you Download Folder.&lt;br /&gt;&lt;br /&gt;Now, on to the home stretch! In Xcode 2.2.1, you must have:&lt;br /&gt; • REMOVED my build directory (before launching Xcode with said project - OPTIONAL) or just perform a full project clean using XCode for the project in question .&lt;br /&gt; • Docked/synced your iPod touch&lt;br /&gt; • Dragged-and-dropped your downloaded provisioning profile into the appropriate spot in the Organizer. It's not grayed out, and the profile is also in your Library in the expected location. &lt;br /&gt; • Chosen "iPhone Device 2.2.1" as the active SDK.&lt;br /&gt; • Under Targets, select your app, then picked Get Info.&lt;br /&gt; • Under the Build tab, verified Base SDK is set to "iPhone Device 2.2.1". For Code Signing Identity, Any iPhone OS Device, there is a value of "iPhone Developer" - fine. &lt;br /&gt; • Under the Properties tab (right click on Targets then select Get Info, change the Identifier to match my App ID com.mycompany.myappid. Be careful not to add any extra leading space by mistakes (EG copy past from the web) Xcode is too stupid to remove spaces.... lame...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-1047187638314016150?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/1047187638314016150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=1047187638314016150' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1047187638314016150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1047187638314016150'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/06/my-first-iphone-application.html' title='My First iPhone application'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-3004369520806449016</id><published>2010-05-13T13:19:00.000-07:00</published><updated>2010-05-13T13:27:27.054-07:00</updated><title type='text'>RTMP PLAYER SERVER AND SWF2VIDEO</title><content type='html'>The most famous client RTMP is the Adobe Flash Player that can do streaming video and audio from RTMP servers. &lt;br /&gt;&lt;br /&gt;Adobe Open Source Media Framework&lt;br /&gt;http://opensource.adobe.com/wiki/display/osmf/Open+Source+Media+Framework&lt;br /&gt;&lt;br /&gt;Moyea Web Player version 2. 0 with RTMP Stream Plugin supports playback of live video streaming and SMIL presentations and streaming video from RTMP servers. &lt;br /&gt;http://www.moyeasoft.com/web-player/web-player-kits.html&lt;br /&gt;&lt;br /&gt;JW Player &lt;br /&gt;http://www.longtailvideo.com/&lt;br /&gt;&lt;br /&gt;Flowplayer RTMP as well. &lt;br /&gt;http://flowplayer.org/&lt;br /&gt;&lt;br /&gt;Sublime Video Player&lt;br /&gt;http://jilion.com/&lt;br /&gt;&lt;br /&gt;RTMP server software &lt;br /&gt;&lt;br /&gt;The only full RTMP server application is Adobe Flash Media Server, Onlinelib VCS Video Communication Server (including iPhone Support), Wowza media server and WebORB Integration Server (free of charge and available. NET, Java and ColdFusion), both commercial and closed source implementations. There is a reverse engineered open source project called Red5, which aims to produce a feature-complete written in Java. Finally my current favorite is C++ RTMP Server http://www.rtmpd.com/&lt;br /&gt;&lt;br /&gt;SWF2Video&lt;br /&gt;&lt;br /&gt;Moyea SWF to Video Converter V3.2&lt;br /&gt;http://www.moyeasoft.com/news/update_081027.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-3004369520806449016?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/3004369520806449016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=3004369520806449016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/3004369520806449016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/3004369520806449016'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/05/rtmp-player-server-and-swf2video.html' title='RTMP PLAYER SERVER AND SWF2VIDEO'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-8666517832798472254</id><published>2010-04-28T13:19:00.000-07:00</published><updated>2010-04-28T13:22:31.298-07:00</updated><title type='text'>Software for 2D-3D conversion - Avatar follower</title><content type='html'>StereoTracer is designed for creating 3D image out of one 2D image by means of «depth-map». The depth-map (disparity image or Z-image) serves to convert a two-dimensional image into a three-dimensional one. In the depth-map the gray color gradation shows each pixel's distance from the viewer. The lighter area in the depth-map correspond to the areas nearer to the viewer, the darker ones correspond to more distant areas. &lt;br /&gt;&lt;br /&gt;A «depth-map» can be created from source one 2D image or stereopair automatically in StereoTracer. "How to" is available here.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;StereoTracer generates a number of images which all have a slightly different viewing angle. This process models shooting of a scene from different points across the horizontal line. Resultant series of images is used for creating 3D (stereo) image by method of anaglyph encoding or making multi-view 3D lenticular picture in Triaxes 3DMasterKit or other lenticular generating application. Also a series of frames can be exported into a movie clip (AVI or animated GIF) and used for presentation purposes. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.triaxes.com/index.php?id=59"&gt;http://triaxes.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-8666517832798472254?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/8666517832798472254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=8666517832798472254' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8666517832798472254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8666517832798472254'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/04/software-for-2d-3d-conversion-avatar.html' title='Software for 2D-3D conversion - Avatar follower'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-7773976831849857789</id><published>2010-04-26T17:36:00.000-07:00</published><updated>2010-04-26T18:53:45.301-07:00</updated><title type='text'>Sublime HTML5 HD Video Player</title><content type='html'>All tests run on the following hardware:&lt;br /&gt;&lt;br /&gt;Model Identifier: MacPro3,1 &lt;br /&gt;Processor Name: Quad-Core Intel Xeon &lt;br /&gt;Processor Speed: 3 GHz &lt;br /&gt;Number of Processors: 2 &lt;br /&gt;Total Number of Cores: 8 &lt;br /&gt;L2 Cache: 12 MB &lt;br /&gt;Memory: 8 GB &lt;br /&gt;Bus Speed: 1.6 GHz &lt;br /&gt; &lt;br /&gt;For browsers, the latest release browser versions were used. For Flash Player, I used the latest labs release (Flash Player 10.1 Beta 3 : 10,1,51,95).&lt;br /&gt;&lt;br /&gt;Mac OS X Versions&lt;br /&gt;=================&lt;br /&gt;&lt;br /&gt;Mac OS X 10.6.2 &lt;br /&gt;Google Chrome 5.0.307.9 beta &lt;br /&gt;Safari 4.0.4 (6531.21.10) &lt;br /&gt;Firefox 3.6 &lt;br /&gt;Flash Player MAC 10,1,51,95 &lt;br /&gt;&lt;br /&gt;Windows 7 Versions&lt;br /&gt;==================&lt;br /&gt;&lt;br /&gt;Windows 7 7600 &lt;br /&gt;Google Chrome 4.0.249.89 (38071) &lt;br /&gt;Safari 4.0.4 (531.21.10) &lt;br /&gt;Firefox 3.6 &lt;br /&gt;Internet Explorer 8.0.7600.16385 &lt;br /&gt;Flash Player WIN 10,1,51,95 &lt;br /&gt;&lt;br /&gt;Sublime HTML 5 HD Video Example&lt;br /&gt;===============================&lt;br /&gt;&lt;br /&gt;                  Mac Windows &lt;br /&gt;Google Chrome     85% 24% &lt;br /&gt;Safari            21% 104% &lt;br /&gt;Firefox           85% 80% &lt;br /&gt;Internet Explorer NA  Did Not Work &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a href="http://jilion.com/sublime/video"&gt;http://jilion.com/sublime/video&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;An other interesting HTML5 Video Sample page (Opera)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://annevankesteren.nl/2008/fronteers-html5-video"&gt;http://annevankesteren.nl/2008/fronteers-html5-video&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And Finally a future yet to be release HTML5 book&lt;br /&gt;&lt;br /&gt;&lt;a href="http://diveintohtml5.org/video.html"&gt;http://diveintohtml5.org/video.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Other interesting benchmark&lt;br /&gt;&lt;br /&gt;&lt;a href="http://themaninblue.com/writing/perspective/2010/03/22/"&gt;http://themaninblue.com/writing/perspective/2010/03/22/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Conclusion HTML5 is catching up...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-7773976831849857789?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/7773976831849857789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=7773976831849857789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7773976831849857789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7773976831849857789'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/04/sublime-html5-hd-video-player.html' title='Sublime HTML5 HD Video Player'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-4693982077545024567</id><published>2010-04-05T14:03:00.001-07:00</published><updated>2010-04-05T14:48:49.229-07:00</updated><title type='text'>Android WebView</title><content type='html'>WebView allows you to create your own window for viewing web pages (or even develop a complete browser). In this tutorial, you'll create a simple Activity that can view and navigate web pages.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_QCVVuSkYgpc/S7pTjOplitI/AAAAAAAAANM/r_BENJpIwTM/s1600/android.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 249px;" src="http://2.bp.blogspot.com/_QCVVuSkYgpc/S7pTjOplitI/AAAAAAAAANM/r_BENJpIwTM/s320/android.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5456765763205827282" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1.Create a new project named HelloWebView.&lt;br /&gt;2.Open the res/layout/main.xml file and insert the following: &lt;br /&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;br /&gt;&lt;WebView    android:id="@+id/webview"    &lt;br /&gt;android:layout_width="fill_parent"    &lt;br /&gt;android:layout_height="fill_parent"/&gt;&lt;br /&gt;&lt;br /&gt;3.Now open the HelloWebView.java file. At the top of the class, declare a WebView object: &lt;br /&gt;&lt;br /&gt;WebView mWebView;&lt;br /&gt;&lt;br /&gt;Then use the following code for the onCreate() method:&lt;br /&gt;&lt;br /&gt;public void onCreate(Bundle savedInstanceState) &lt;br /&gt;{    &lt;br /&gt;super.onCreate(savedInstanceState);    &lt;br /&gt;setContentView(R.layout.main);    &lt;br /&gt;mWebView = (WebView) findViewById(R.id.webview);    mWebView.getSettings().setJavaScriptEnabled(true);    mWebView.loadUrl("http://www.thomasyounsi.com");&lt;br /&gt;}&lt;br /&gt;This initializes the member WebView with the one from the Activity layout; &lt;br /&gt;requests a WebSettings object with getSettings(); &lt;br /&gt;and enables JavaScript for the WebView with setJavaScriptEnabled(boolean). &lt;br /&gt;Finally, an initial web page is loaded with loadUrl(String).&lt;br /&gt;&lt;br /&gt;4.Because this application needs access to the Internet, you need to add the appropriate permissions to the Android manifest file. &lt;br /&gt;Open the AndroidManifest.xml file and add the following as a child of the &lt;manifest&gt; element: &lt;br /&gt;&lt;uses-permission android:name="android.permission.INTERNET" /&gt;&lt;br /&gt;&lt;br /&gt;What is very powerful with WebView is that you can use a two way communication between the content which is display in the web view and the Java application. This can be accomplished by using JavaScript running inside the WebView calling out Java code to get the updated fragment for the HTML div bloc that require  to be use to update the content running inside the view. This means you can use HTML div to layout your content and expand/collapse a div based on user action. The content can come from a remote database, a web service or as a JSON Object.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=" http://www.youtube.com/watch?v=Ex7YsQ_YH2U"&gt;&lt;br /&gt;http://www.youtube.com/watch?v=Ex7YsQ_YH2U&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-4693982077545024567?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/4693982077545024567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=4693982077545024567' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4693982077545024567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4693982077545024567'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/04/android-webview.html' title='Android WebView'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QCVVuSkYgpc/S7pTjOplitI/AAAAAAAAANM/r_BENJpIwTM/s72-c/android.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-7010957232926935721</id><published>2010-04-05T11:18:00.000-07:00</published><updated>2010-04-05T11:34:15.403-07:00</updated><title type='text'>Apple iPad / Microsoft Surface</title><content type='html'>In 2007, Microsoft annonced Microsoft Surface&lt;br /&gt;&lt;br /&gt;Microsoft Surface represents a new category of computing. With capabilities like direct interaction, multi-touch, multi-user, and object recognition, Microsoft Surface computing is a unique and cutting edge platform for application development.&lt;br /&gt;&lt;br /&gt;The Microsoft Surface platform goes beyond the capabilities of its core operating system foundation running Windows Vista SP1, yet it keeps the development process simple. The Microsoft Surface SDK 1.0 SP1 provides all the controls a developer needs to create innovative experiences on Microsoft Surface. And with the new capabilities that come with Service Pack 1, application development is easier than ever with new WPF controls and API enhancements that give developers more control, flexibility, and efficiency in creating applications. &lt;br /&gt;&lt;br /&gt;Plus, in order to enable a broad developer audience, Microsoft Surface is compatible with familiar programs and tools developers use today, such as:&lt;br /&gt;&lt;br /&gt;Microsoft® Windows Presentation Foundation (WPF) &lt;br /&gt;Microsoft® XNA™ &lt;br /&gt;Microsoft® Visual C#® 2008 Express Edition &lt;br /&gt;Microsoft® Visual Studio® 2008 SP1 &lt;br /&gt;Microsoft® Expression® Studio 2 &lt;br /&gt;Microsoft® Expression Blend™ 2 &lt;br /&gt;&lt;br /&gt;http://www.microsoft.com/surface/en/us/Pages/Product/Platform.aspx&lt;br /&gt;&lt;br /&gt;In 2010 Apple launched the iPad.&lt;br /&gt;&lt;br /&gt;The sdk is the same than the sdk used by the Apple iPhone&lt;br /&gt;&lt;br /&gt;http://developer.apple.com/ipad/sdk/&lt;br /&gt;&lt;br /&gt;The specs have been posted on Apple's web site.&lt;br /&gt;&lt;br /&gt;http://www.apple.com/ipad/specs/&lt;br /&gt;&lt;br /&gt;Screen size = 1024x768 and my interest will go immediately for TV and video&lt;br /&gt;&lt;br /&gt;Support for 1024 by 768 pixels with Dock Connector to VGA Adapter; 576p and 480p with Apple Component AV Cable; 576i and 480i with Apple Composite AV Cable &lt;br /&gt;H.264 video up to 720p, 30 frames per second, Main Profile level 3.1 with AAC-LC audio up to 160 Kbps, 48kHz, stereo audio in .m4v, .mp4, and .mov file formats; MPEG-4 video, up to 2.5 Mbps, 640 by 480 pixels, 30 frames per second, Simple Profile with AAC-LC audio up to 160 Kbps, 48kHz, stereo audio in .m4v, .mp4, and .mov file formats; Motion JPEG (M-JPEG) up to 35 Mbps, 1280 by 720 pixels, 30 frames per second, audio in ulaw, PCM stereo audio in .avi file format.&lt;br /&gt;&lt;br /&gt;iPad Price starting at 499$&lt;br /&gt;&lt;br /&gt;It would be nice to see microsoft coming with a small tablet "surface capable" 1280x720 P resolution where people could put there camera or phone in place on top of the tablet running an application in "surface application mode" to exchange and share contents (picture/music/video).&lt;br /&gt;&lt;br /&gt;A commercial Microsoft Surface unit is $12,500 (unit only), whereas a developer Microsoft Surface unit costs $15,000 and includes a developer unit, five seats and support. However, Microsoft said it expects prices to drop enough to make consumer versions feasible in 2010. Microsoft would have to come with a price 20x lower than the actual Microsoft Surface unit to compete with the iPad. I think it is time to come up with a product...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-7010957232926935721?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/7010957232926935721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=7010957232926935721' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7010957232926935721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/7010957232926935721'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/04/apple-ipad-microsoft-surface.html' title='Apple iPad / Microsoft Surface'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-2943508796101817983</id><published>2010-03-18T13:10:00.000-07:00</published><updated>2010-03-31T12:11:58.788-07:00</updated><title type='text'>how to Install Apache, PHP, MySQL and phpMyAdmin on Windows XP</title><content type='html'>This tutorial will show you step-by-step how to install: &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Apache 2 &lt;br /&gt;PHP 5 &lt;br /&gt;MySQL 5 &lt;br /&gt;phpMyAdmin on Windows&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For those who want to install an all in one solution on Windows I recommend&lt;br /&gt;WampServer &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wampserver.com/en/"&gt;http://www.wampserver.com/en/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;or XAMPP &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.apachefriends.org/en/xampp-windows.html"&gt;http://www.apachefriends.org/en/xampp-windows.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Apache Server combined with the power of PHP, MySQL, and phpMyAdmin, creates one of the best possible development environments for a web programmer. Getting everything properly configured can take 20-30 minutes. And it can work on a non expensive OS such as Windows XP or Windows 7 Home Edition.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Installing Apache: &lt;/span&gt;&lt;br /&gt;Follow the steps carefully. &lt;br /&gt;&lt;br /&gt;1 Go to &lt;a href="http://httpd.apache.org/download.cgi"&gt;http://httpd.apache.org/download.cgi&lt;/a&gt; and download "Win32 Binary (MSI Installer): apache_2.2.4-win32-x86-no_ssl.msi" to your desktop.&lt;br /&gt;&lt;br /&gt;Note: Make sure that you download Apache version 2.2.4 (Win32 Binary MSI Installer)! &lt;br /&gt;&lt;br /&gt;2 Double click "apache_2.2.4-win32-x86-no_ssl.msi", and if prompted, click "run".&lt;br /&gt;&lt;br /&gt;3 An installation wizard will appear:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6KKiRkfuHI/AAAAAAAAALk/B09770B18Mw/s1600-h/apache1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 246px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6KKiRkfuHI/AAAAAAAAALk/B09770B18Mw/s320/apache1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450070820508383346" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Click "Next".&lt;br /&gt;&lt;br /&gt;4 The next page contains the terms of agreement. Select "I accept", and click "Next". &lt;br /&gt;&lt;br /&gt;5 Read about the Apache Server, and click "Next"&lt;br /&gt;&lt;br /&gt;6 The next screen will ask you for specific server information. Enter the values seen below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6KK2TXzk7I/AAAAAAAAALs/EbJ2qM11Pb8/s1600-h/apache2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 246px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6KK2TXzk7I/AAAAAAAAALs/EbJ2qM11Pb8/s320/apache2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450071164589413298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Click "Next".&lt;br /&gt;&lt;br /&gt;7 On the next screen, select "Typical Installation" and click "Next".&lt;br /&gt;&lt;br /&gt;8 Click "Next".&lt;br /&gt;&lt;br /&gt;9 Click "Install".&lt;br /&gt;&lt;br /&gt;10 Open up Internet Explorer and type in "http://localhost". If you see a page that says "It works!" then the Apache server has been installed successfully.&lt;br /&gt;&lt;br /&gt;Note that if you install Flash Media Server an other instance of Apache will be installed which could cause conflict on the following default Apache server. It would be nice if the FMS team could handle this nicely in their installer....&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6KLdOsKI0I/AAAAAAAAAL0/Ir1SOtVQeso/s1600-h/apache3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 246px;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6KLdOsKI0I/AAAAAAAAAL0/Ir1SOtVQeso/s320/apache3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450071833347498818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A few notes on your Apache Server Configuration: &lt;br /&gt;Apache is installed by default in your "C:\Program Files\Apache Software Foundation\Apache2.2" directory.&lt;br /&gt;&lt;br /&gt;Inside that directory there is a folder called "htdocs" (matching of your \www\ or \public_html\ directory on a unix system). You can develop your applications inside this folder and access them by going to http://localhost/my_file_name.html&lt;br /&gt;&lt;br /&gt;The Apache Configuration settings are defined in a file named "httpd.conf" located in the "conf" directory. Do not attempt to change these settings unless you know what you're doing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Installing PHP:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next we will be installing PHP version 5. Follow the steps carefully. &lt;br /&gt;1 Go to &lt;a href="http://www.php.net/downloads.php"&gt;http://www.php.net/downloads.php&lt;/a&gt; and download the "PHP 5.2.0 zip package" to your desktop. (Be patient while it downloads, the ZIP file is over 9MB!)&lt;br /&gt;&lt;br /&gt;Note: Make sure that you download the PHP 5.2.0 zip package! The rest of the tutorial is written using this version.&lt;br /&gt;&lt;br /&gt;2 Create a new folder called "php" in your C Drive. Copy the "php-5.2.0-Win32.zip" file to there ("C:\php") and extract it using WinZIP or a similiar program.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3 Your "C:\php" directory should now look like:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6KMFeA3ypI/AAAAAAAAAL8/2VZOnXzxj3U/s1600-h/php1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 235px; height: 320px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6KMFeA3ypI/AAAAAAAAAL8/2VZOnXzxj3U/s320/php1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450072524655676050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4 Next copy the "php.ini-dist" file from "C:/php/" to "C:/WINDOWS" and rename it to "php.ini". This is your PHP configuration file. We'll come back to this later.&lt;br /&gt;&lt;br /&gt;5 Now it's time to tell Apache that PHP exists. Open up your Apache configuration file ("C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf") in notepad and add these four lines to the bottom of the "LoadModule" section:&lt;br /&gt;&lt;br /&gt;LoadModule php5_module "c:/php/php5apache2_2.dll"&lt;br /&gt;AddHandler application/x-httpd-php .php &lt;br /&gt;# configure the path to php.ini &lt;br /&gt;PHPIniDir "c:/windows"&lt;br /&gt;&lt;br /&gt;6 In your "htdocs" directory, create a file called "info.php". Open it in notepad and add this line of code to it:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6KRAUqQpYI/AAAAAAAAAM0/-YrywWV9CDw/s1600-h/phpinfo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 194px; height: 32px;" src="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6KRAUqQpYI/AAAAAAAAAM0/-YrywWV9CDw/s320/phpinfo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450077933803709826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;7 Restart your Apache Server for the changes to take effect: &lt;br /&gt;&lt;br /&gt;Start &gt; All Programs &gt; Apache HTTP Server 4.2.4 &gt; Control Apache Server &gt; Restart&lt;br /&gt;or faster use the Apache Service Monitor seating in the tray icon bottom right bar on Windows XP&lt;br /&gt;&lt;br /&gt;8 Open up Internet Explorer and type in: http://localhost/info.php. If your browser takes you to a page that looks like this, then PHP has been installed successfully!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_QCVVuSkYgpc/S6KMs0wA3UI/AAAAAAAAAME/kpEQ-jdjzoM/s1600-h/php2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 287px; height: 320px;" src="http://4.bp.blogspot.com/_QCVVuSkYgpc/S6KMs0wA3UI/AAAAAAAAAME/kpEQ-jdjzoM/s320/php2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450073200773881154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Modifying your PHP Configuration File: &lt;br /&gt;&lt;br /&gt;1 Your PHP configuration (php.ini) file is located in "C:/WINDOWS/php.ini". You can modify it with notepad or a similiar text editor. My favorite is &lt;a href="http://notepad-plus.sourceforge.net/uk/site.htm"&gt;Notepad++&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2 Open it up and find the line that says:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;extension_dir = "./"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;and change it to&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;extension_dir = "C:\php\ext"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Find the line that says:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;session.save_path = "/tmp"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;and change it to&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;session.save_path = "C:\WINDOWS\temp"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Installing MYSQL:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next we will be &lt;span style="font-weight:bold;"&gt;installing MySQL version 5&lt;/span&gt;. &lt;br /&gt;Follow the steps carefully. &lt;br /&gt;&lt;br /&gt;1 Go to http://dev.mysql.com/downloads/mysql/5.0.html#downloads and download the "Windows (x86) ZIP/Setup.EXE (version 5.0.27)" to your desktop. (To do this you'll need to register an account with MySQL.)&lt;br /&gt;&lt;br /&gt;2 Once "mysql-5.0.27-win32.zip" has finished downloading, you can extract it using WinZIP or a similiar program.&lt;br /&gt;&lt;br /&gt;3 Once extracted, double click on the "Setup.exe" file. An installation wizard will appear.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6KN0qDw6ZI/AAAAAAAAAMM/CAc6IUE_Ciw/s1600-h/mysql1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6KN0qDw6ZI/AAAAAAAAAMM/CAc6IUE_Ciw/s320/mysql1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450074434854513042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Click "Next".&lt;br /&gt;&lt;br /&gt;4 Select "Typical" Installation and click "Next".&lt;br /&gt;&lt;br /&gt;5 Click "Install". (Be patient, this can take up to several minutes).&lt;br /&gt;&lt;br /&gt;6 The next screen will ask you to "Sign Up". Select "Skip Sign-Up" for now.&lt;br /&gt;&lt;br /&gt;7 The next screen will tell you that the installation wizard is complete. Make sure that the "Configure the MySQL Server now" field is checked before clicking "Finish". &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6KN-xTdDQI/AAAAAAAAAMU/zHeCWv6EW_o/s1600-h/mysql2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6KN-xTdDQI/AAAAAAAAAMU/zHeCWv6EW_o/s320/mysql2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450074608598060290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;8 The MySQL Server Instance Configuration Wizard should appear. Click "Next".&lt;br /&gt;&lt;br /&gt;9 Select "Detailed Configuration" and click "Next".&lt;br /&gt;&lt;br /&gt;10 Select "Developer Machine" and click "Next".&lt;br /&gt;&lt;br /&gt;11 Select "Multifunctional Database" and click "Next".&lt;br /&gt;&lt;br /&gt;12 Click "Next".&lt;br /&gt;&lt;br /&gt;13 Select "Decision Support (DSS)/OLAP" and click "Next".&lt;br /&gt;&lt;br /&gt;14 Select "Multifunctional Database" and click "Next".&lt;br /&gt;&lt;br /&gt;15 Make sure "Enable TCP/IP Networking" is checked, the Port Number is set to "3306", and "Enable Strict Mode" is checked. Click "Next".&lt;br /&gt;&lt;br /&gt;16 Select "Standard Character Set" and click "Next".&lt;br /&gt;&lt;br /&gt;17 Check "Install As Windows Service", set the Service Name to "MySQL", and check "Launch the MySQL Server automatically". Make sure that the "Include Bin Directory in Windows Path" is NOT checked. Click "Next".&lt;br /&gt;&lt;br /&gt;18 On the next screen, check the box that says "Modify Security Settings". Enter a password for the default "root" account, and confirm the password in the box below. Do NOT check the boxes "Enable root access from remote machines" or "Create An Anonymous Account". Click "Next". &lt;br /&gt;&lt;br /&gt;19 Click "Execute". (This may take a few minutes. Be patient).&lt;br /&gt;&lt;br /&gt;20 Click "Finish".&lt;br /&gt;&lt;br /&gt;21 To test if MySQL was installed correct, go to: Start &gt; All Programs &gt; MySQL &gt; MySQL Server 5.0 &gt; MySQL Command Line Client. The MySQL Command Line Client will appear:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6KPAnQjZWI/AAAAAAAAAMc/NNlgxjEdpaA/s1600-h/mysql3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 211px;" src="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6KPAnQjZWI/AAAAAAAAAMc/NNlgxjEdpaA/s320/mysql3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450075739772904802" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;22 It will ask you for a password. Enter the password you created in step 18. (If you enter an incorrect password MySQL will automatically close the command line)&lt;br /&gt;&lt;br /&gt;23 Next, type in the commands shown below: (shown in blue)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6KPWi1gXVI/AAAAAAAAAMk/1K6dBlc5Sl0/s1600-h/mysql4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 211px;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6KPWi1gXVI/AAAAAAAAAMk/1K6dBlc5Sl0/s320/mysql4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450076116542840146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you don't get any errors, and it returns the information shown above, then MySQL has been successfully installed! Next we will need to configure PHP to work with MySQL. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Configuring PHP to work with MySQL:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that both PHP and MySQL are installed, we have to configure them to work together. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1 Open up your php.ini file (C:/WINDOWS/php.ini) and find the line:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;extension=php_mysql.dll&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To enable the MySQL extension, delete the semi-colon at the beginning of that line.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2 Next we must add the PHP directory to the Windows PATH. To do this, click: Start &gt; My Computer &gt; Properties &gt; Advanced &gt; Environment Variables. Under the second list (System Variables), there will be a variable called "Path". Select it and click "Edit". Add ";C:\php" to the very end of the string and click "OK".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3 Restart your computer for the changes to take effect.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4 Create a new file in your "htdocs" directory called "mysql_test.php".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5 Copy the following code into "mysql_test.php" and click save. (Make sure to replace the MYSQL_PASS constant with the MySQL Password you specified during the MySQL installation).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_QCVVuSkYgpc/S6KRdSD2DRI/AAAAAAAAAM8/PubcRIY2x-Y/s1600-h/phpmysql.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 197px;" src="http://4.bp.blogspot.com/_QCVVuSkYgpc/S6KRdSD2DRI/AAAAAAAAAM8/PubcRIY2x-Y/s320/phpmysql.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450078431321918738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6 Open up Internet Explorer and type in "http://localhost/mysql_test.php". If the "mysql_test.php" page returns something similiar to:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ID: 1&lt;br /&gt;Name: John&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then PHP &amp; MySQL have been successfully configured to work together. Congratulations! The next and final step is to install phpMyAdmin.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Installing phpMyAdmin:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that both Apache, PHP and MySQL are installed, we can install phpMyAdmin, a tool that allows you to easily manage your MySQL databases. &lt;br /&gt;1 Go to http://www.phpmyadmin.net/home_page/downloads.php and download "english.zip" under the phpMyAdmin 2.9.2 section to your desktop (I assume that since you are reading this article that you understand English).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2 Create a new folder called "phpmyadmin" in your "htdocs" directory. Extract the contents of the "phpMyAdmin-2.9.2-english.zip" ZIP file here. Your C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\phpmyadmin" directory should now look like:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6KQDsUymMI/AAAAAAAAAMs/HBGZ_O8KE5g/s1600-h/phpmyadmin1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 115px; height: 320px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6KQDsUymMI/AAAAAAAAAMs/HBGZ_O8KE5g/s320/phpmyadmin1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450076892184090818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3 Create a new file in the "phpMyAdmin" directory (above) called "config.inc.php". Place this code inside it and be sure to replace "YOUR_PASSWORD_HERE" (in both places below) with your MySQL Password:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6KSA9tjldI/AAAAAAAAANE/q-ttbxtKUrk/s1600-h/phpmyadmin2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 203px; height: 320px;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6KSA9tjldI/AAAAAAAAANE/q-ttbxtKUrk/s320/phpmyadmin2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450079044335015378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4 phpMyAdmin has now been successfully installed! To use it, open up Internet Explorer and type in "http://localhost/phpmyadmin". This will bring you to the main phpMyAdmin page. Note is is always recommended not to install admin tool in default location if deployed on a server open to internet access for security reason.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Enjoy using Apache, PHP, MySQL, and phpMyAdmin! &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-2943508796101817983?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/2943508796101817983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=2943508796101817983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/2943508796101817983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/2943508796101817983'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/03/how-to-install-apache-php-mysql-and.html' title='how to Install Apache, PHP, MySQL and phpMyAdmin on Windows XP'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_QCVVuSkYgpc/S6KKiRkfuHI/AAAAAAAAALk/B09770B18Mw/s72-c/apache1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-1526558697507574761</id><published>2010-03-16T23:56:00.000-07:00</published><updated>2010-03-17T00:41:17.133-07:00</updated><title type='text'>My Favorites Flash AS3 Component/FLA Part II</title><content type='html'>3D BUSINESS CARD SLIDE SHOW AS3&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is a XML controlled 3D slideshow, very easy to use and very customizable. It uses the 3D functions of Flash Player 10 (you need to install it if you do not have it); you need Flash CS4 if you want to open the FLA file!&lt;br /&gt;&lt;br /&gt;This component can be used as a simple image/product slideshow, a 3d banner rotator or a business card slide show.&lt;br /&gt;Settings you will find in the XML file:&lt;br /&gt;- component width and height and card holder width and height&lt;br /&gt;- mask width and height (you can display one image at a time or multiple images at once)&lt;br /&gt;- transition times and types&lt;br /&gt;- space between the cards&lt;br /&gt;- arrows positioning, description positioning and transparency and also description text (html text)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://activeden.net/item/3d-business-card-slide-show-as3/91738"&gt;http://activeden.net/item/3d-business-card-slide-show-as3/91738&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6B83qfh-NI/AAAAAAAAAJM/MHdB7wcCX0M/s1600-h/91738.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 148px;" src="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6B83qfh-NI/AAAAAAAAAJM/MHdB7wcCX0M/s320/91738.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449492844859488466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;AMAZING TWO LEVELS ACCORDION MENU AS3&lt;br /&gt;&lt;br /&gt;This is an AS3 vertical accordion menu, XML driven and resizable. It has a structure of two levels. Each main item can have a submenu or it can open a link. For each item you can set a title and a HTML formatted description.&lt;br /&gt;XML Settings:&lt;br /&gt;- component width and height&lt;br /&gt;- main item width and minimum height&lt;br /&gt;- animation time&lt;br /&gt;- items title and description&lt;br /&gt;- items thumbnail image (optional)&lt;br /&gt;- items link and link target&lt;br /&gt;&lt;br /&gt;&lt;a href="http://activeden.net/item/amazing-two-levels-accordion-menu-as3/88453"&gt;http://activeden.net/item/amazing-two-levels-accordion-menu-as3/88453&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6B9-NB0SrI/AAAAAAAAAJU/JFpIIj51_A4/s1600-h/88453.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 162px;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6B9-NB0SrI/AAAAAAAAAJU/JFpIIj51_A4/s320/88453.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449494056720943794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;HORIZONTAL RESIZABLE ULTRA MENU AS3&lt;br /&gt;&lt;br /&gt;This amazing menu can host an virtually UNLIMITED number of items organized on an unlimited number of levels.&lt;br /&gt;&lt;br /&gt;The menu can auto-hide or stay visible, all colors can easily be changed in the xml file and.&lt;br /&gt;&lt;br /&gt;It also supports scrolling, so if you have a lot of menu items (on any level) they will be scrolled if they don’t fit inside the display area.&lt;br /&gt;&lt;br /&gt;This menu is ideal for displaying a great amount of menu items in a well structured manner.&lt;br /&gt;&lt;br /&gt;It can open urls or trigger actions in flash !&lt;br /&gt;&lt;br /&gt;Each level can have a style (colors, spacing etc.) assigned by specifying the xml corresponding to the specific style !&lt;br /&gt;Settings you can change in the XML file (35+):&lt;br /&gt;- auto-hide on/off&lt;br /&gt;- open sub menu on click or on mouse-over&lt;br /&gt;- open direction down or up&lt;br /&gt;- auto-hide wait time&lt;br /&gt;- sub-level open speed, transition time and type (ex. easeOutQuad)&lt;br /&gt;- sub-level close speed, transition time and type&lt;br /&gt;- use temporary display bar for auto-hide on/off, bar height, hit zone height, bar text (ex. “Move over to open”), bar background color, text color, arrow color&lt;br /&gt;- menu width (can be set to 0 in order to make it expand to the entire stage)&lt;br /&gt;- horizontal item spacing&lt;br /&gt;- menu alignment&lt;br /&gt;* Each style has the following options (each level can have a style xml assigned) :&lt;br /&gt;- background colors for normal, mouse over and selected states&lt;br /&gt;- delimiter width&lt;br /&gt;- delimiter color&lt;br /&gt;- button height&lt;br /&gt;- text padding&lt;br /&gt;- text font size&lt;br /&gt;- text colors for normal, mouse over and selected states&lt;br /&gt;- alignment for the level (left/center/right)&lt;br /&gt;* Each menu item has the following options :&lt;br /&gt;- menu item text (display label)&lt;br /&gt;- action type (link or actionscript)&lt;br /&gt;- url and target for link&lt;br /&gt;- gotoandstop/gotoandplay and frame label/number for action&lt;br /&gt;&lt;br /&gt;&lt;a href="http://activeden.net/item/horizontal-resizable-ultra-menu-as3/88606"&gt;http://activeden.net/item/horizontal-resizable-ultra-menu-as3/88606&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6B-rfQFkRI/AAAAAAAAAJc/FCLJ20500jo/s1600-h/88606.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 50px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6B-rfQFkRI/AAAAAAAAAJc/FCLJ20500jo/s320/88606.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449494834706747666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;AS3 BUTTON CLASS&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    * Item Details&lt;br /&gt;    * Discussion&lt;br /&gt;&lt;br /&gt;3comments&lt;br /&gt;AS3 Button Class&lt;br /&gt;&lt;br /&gt;by Flactor&lt;br /&gt;&lt;br /&gt;Very easy to use class! you just need to use the interface to make the button and copy the code provided with the interface, then open a new fla file and paste the code in the first frame actions panel and import the needed font in the library and finished! Using this class you could arrange unlimited number of buttons, horizontally or vertically in 3 styles (simple, gradient and web 2.0). Complete documentation with examples and interface are available in the source file.&lt;br /&gt;&lt;br /&gt;Could be used both in “time line” and “document Class”.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://activeden.net/item/as3-button-class/81946"&gt;http://activeden.net/item/as3-button-class/81946&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6B_gYX-0jI/AAAAAAAAAJk/VhK7VFW5_P8/s1600-h/81946.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 162px;" src="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6B_gYX-0jI/AAAAAAAAAJk/VhK7VFW5_P8/s320/81946.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449495743393878578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;iButton TOGGLE SLIDER&lt;br /&gt;&lt;br /&gt;Update: the sliders can now be dragged ON or OFF using the mouse.&lt;br /&gt;&lt;br /&gt;All 100% vector graphics.&lt;br /&gt;&lt;br /&gt;Easy to implement into your flash file. Just copy &amp; paste!&lt;br /&gt;&lt;br /&gt;Customizable settings:&lt;br /&gt;&lt;br /&gt;    * the text displayed for the ON and OFF states&lt;br /&gt;    * the easing used for the sliding animation&lt;br /&gt;    * the duration of the sliding animation&lt;br /&gt;    * the default state (ON or OFF )&lt;br /&gt;    * a callback function to run when the button has been toggled.&lt;br /&gt;&lt;br /&gt;Font used on button: Lucida Gr&lt;br /&gt;&lt;br /&gt;&lt;a href="http://activeden.net/item/ibutton-toggle-slider/78111&lt;br /&gt;"&gt;http://activeden.net/item/ibutton-toggle-slider/78111&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6B_92AQ6BI/AAAAAAAAAJs/GNNP11_pZr4/s1600-h/78111.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 228px;" src="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6B_92AQ6BI/AAAAAAAAAJs/GNNP11_pZr4/s320/78111.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449496249563670546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;POWERFULL FLASH ACCORDION MENU UNLIMITED LEVELS V3&lt;br /&gt;&lt;br /&gt;This flash component allows you to create accordion menu’s and combobox’s in a few minutes and customize every detail without opening the flash file, because everything is xml driven.&lt;br /&gt;&lt;br /&gt;As it says in the title, using this component you can create accordion menu’s with as many levels as you set in the xml file, there is no limit. Also you can customize each level individually, allowing you to create complex menus and desings.&lt;br /&gt;&lt;br /&gt;In this new version you can set 4 different actions for the button, such as launch a link, go to a frame, load an image/swf or call a function.&lt;br /&gt;&lt;br /&gt;Also this menu includes some nice API features that allows you to manipulate/navigate the menu dynamically.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://activeden.net/item/powerful-flash-accordion-menu-unlimited-levels-v3/75262"&gt;http://activeden.net/item/powerful-flash-accordion-menu-unlimited-levels-v3/75262&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6CBDYLJftI/AAAAAAAAAJ0/o6MuKpD750M/s1600-h/75262.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 193px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6CBDYLJftI/AAAAAAAAAJ0/o6MuKpD750M/s320/75262.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449497444147101394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CLEAM MEDIA PLAYER BUTTONS&lt;br /&gt;&lt;br /&gt;Simple and easy to use and modify.&lt;br /&gt;&lt;br /&gt;A collection of media player buttons,clean and modern, glossy, completely resizable vectors.&lt;br /&gt;&lt;br /&gt;Just copy/paste or drag the buttons into your own project. It’s that easy.&lt;br /&gt;&lt;br /&gt;The Zip contains an CS4 Fla, CS3 Fla, CS AI file and CS EPS file. I have included the Illustrator vectors in the pack.&lt;br /&gt;&lt;br /&gt;For additional help contact me here at Graphic River or you can find my email address in the help file that comes with this product.&lt;br /&gt;&lt;br /&gt;Tags: media player, buttons, player, style, clean, glossy, gloss, play, pause, stop, next, previous, forward, backward, star&lt;br /&gt;&lt;br /&gt;&lt;a href="http://activeden.net/item/clean-media-player-buttons/69078"&gt;http://activeden.net/item/clean-media-player-buttons/69078&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6CBlx8flpI/AAAAAAAAAJ8/W9-5CSCW4w8/s1600-h/69078.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 155px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6CBlx8flpI/AAAAAAAAAJ8/W9-5CSCW4w8/s320/69078.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449498035180508818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;AS3 WEB 2.0 BUTTON CLASS&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Features:&lt;br /&gt;&lt;br /&gt;Label, Label Color, Label Size, Font name, Colors of button layers(up, over, down), Width, Height, x Margin, y Margin, corner curves, ButtonMode, dropShadow, Activeness.&lt;br /&gt;&lt;br /&gt;Can be used both in Document Class and time line.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://activeden.net/item/as3-web-20-button-class/63030"&gt;http://activeden.net/item/as3-web-20-button-class/63030&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6CB_aRHjVI/AAAAAAAAAKE/lP0zI8kmoSY/s1600-h/63030.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 165px;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6CB_aRHjVI/AAAAAAAAAKE/lP0zI8kmoSY/s320/63030.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449498475501161810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;THE SPINE XML IMAGE MENU&lt;br /&gt;&lt;br /&gt;The Spine XML Image Menu is an image based menu with lots of flexibility that is straight-forward and simple, but also fun and creative. It scales the menu image items on mouse over and you can also choose to have a tooltip. On click, the menu will link out to a URL . If the stage is wider than the menu, the menu will be centered, otherwise, if the menu is wider than the stage, it will scroll left to right on the mouse’s horizontal position. It works great as a products menu that would link out to the specific product page.&lt;br /&gt;The menu is XML driven and you can set the following things in the XML file:&lt;br /&gt;– the background color&lt;br /&gt;– the width of the menu items&lt;br /&gt;– the height of the menu items&lt;br /&gt;– the thickness of the border on mouse over of the menu items&lt;br /&gt;– the amount of scaling on mouse over of the menu items&lt;br /&gt;– whether the tooltip is on or off&lt;br /&gt;– the background color of the tooltip&lt;br /&gt;– the background transparency of the tooltip&lt;br /&gt;– the image/SWF path for each of the menu items&lt;br /&gt;– the tooltip text for each of the menu items&lt;br /&gt;– the link URL for the on click of each of the menu items&lt;br /&gt;– the link target for the on click of each of the menu items&lt;br /&gt;So you can have as many images/SWFs as you want and they can be any size you want!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://activeden.net/item/the-spine-xml-image-menu/50142"&gt;http://activeden.net/item/the-spine-xml-image-menu/50142&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6CCW9ukbMI/AAAAAAAAAKM/Q8YtgekYmGI/s1600-h/50142.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 129px;" src="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6CCW9ukbMI/AAAAAAAAAKM/Q8YtgekYmGI/s320/50142.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449498880156921026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;XML VERTICAL ACCORDION&lt;br /&gt;&lt;br /&gt; XML Accordion generated from XML .&lt;br /&gt;&lt;br /&gt;Each item in the xml has a title and a content attribute, allowing the flash file to load external contents into each item. The example above loads .jpg images, but these can be .swf, .png, .gif. (Basically any format allowed by Loader.load())&lt;br /&gt;&lt;br /&gt;    * Easy do edit xml file&lt;br /&gt;    * add as many items as your site can handle&lt;br /&gt;    * change which item opens by default&lt;br /&gt;    * clearly labeled layers and symbols for easy editing&lt;br /&gt;&lt;br /&gt;&lt;a href="http://activeden.net/item/xml-accordion/36743"&gt;http://activeden.net/item/xml-accordion/36743&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6CC0sVEhrI/AAAAAAAAAKU/U0UASkLPFM8/s1600-h/36743.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 162px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6CC0sVEhrI/AAAAAAAAAKU/U0UASkLPFM8/s320/36743.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449499390882645682" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HORIZONTAL XML ACCORDION&lt;br /&gt;&lt;br /&gt; XML Accordion generated from XML .&lt;br /&gt;&lt;br /&gt;Each item in the xml has a title and a content attribute, allowing the flash file to load external contents into each item. The example above loads .jpg images, but these can be .swf, .png, .gif. (Basically any format allowed by Loader.load())&lt;br /&gt;&lt;br /&gt;    * Easy do edit xml file&lt;br /&gt;    * add as many items as your site can handle&lt;br /&gt;    * change which item opens by default&lt;br /&gt;    * clearly labeled layers and symbols for easy editing&lt;br /&gt;&lt;br /&gt;&lt;a href="http://activeden.net/item/horizontal-xml-accordion/43382"&gt;http://activeden.net/item/horizontal-xml-accordion/43382&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6CDYDLwLOI/AAAAAAAAAKc/RIMNJq8hjdg/s1600-h/43382.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 165px;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6CDYDLwLOI/AAAAAAAAAKc/RIMNJq8hjdg/s320/43382.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449499998313000162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PREMIUM TWO LEVEL EXPANDING MENU&lt;br /&gt;&lt;br /&gt;Premium Two Level Expanding Menu&lt;br /&gt;&lt;br /&gt;This is an XML driven vertical expanding menu designed to be clean, functional, easy to implement, and very customizable. All graphics are vector, and all is editable incliding colors, sizes, fonts etc easily from Flash. Each button either expands to show a sub menu, or links out to a url (“_self” or “_blank” can be set). You can also call javascript functions with it as well.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://activeden.net/item/premium-two-level-expanding-menu/23880"&gt;http://activeden.net/item/premium-two-level-expanding-menu/23880&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6CDwUJNuAI/AAAAAAAAAKk/HGFlHLGCXj0/s1600-h/23880.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 161px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S6CDwUJNuAI/AAAAAAAAAKk/HGFlHLGCXj0/s320/23880.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449500415182616578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CIRCLE MENU&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Highly customizable menu made in ActionScript 3.&lt;br /&gt;Any number of items with own colors and selected colors are supported. Many editable properties which vary the look and feel a lot.&lt;br /&gt;&lt;br /&gt;Properties :&lt;br /&gt; innerRadius, radius, angle, radiusDecrement, angleDecrement, angleIncrement, motionType, motionTime&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ultrashock.com/#/asset/39553/circle-menu.html"&gt;http://www.ultrashock.com/#/asset/39553/circle-menu.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6CEpdlfOgI/AAAAAAAAAKs/m2k3eFYoV-o/s1600-h/39553.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 266px;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6CEpdlfOgI/AAAAAAAAAKs/m2k3eFYoV-o/s320/39553.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449501396969667074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ODOMETER AS3&lt;br /&gt;&lt;br /&gt;A number Odometer - will 'odo' to any number it's set to, up or down, from any number it was last set to. Useful for Game score displays, hit counters etc.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ultrashock.com/#/asset/43513/odometer-as3.html"&gt;http://www.ultrashock.com/#/asset/43513/odometer-as3.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6CFEd-7bkI/AAAAAAAAAK0/2YG8Ivg9_fA/s1600-h/43513.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 140px;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6CFEd-7bkI/AAAAAAAAAK0/2YG8Ivg9_fA/s320/43513.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449501860932841026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FLASH TOOLTIP AS3 V1.0.3&lt;br /&gt;&lt;br /&gt;The flashTooltip component allows you to easily add a descriptive window that appears when the user moves their mouse over Flash buttons or movie clips. The tooltip may contain text, images or SWF's. Includes 5 built-in opening and closing effects. Fully customizable. .&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ultrashock.com/#/asset/42610/flashtooltip-as3-v1.0.3.html"&gt;http://www.ultrashock.com/#/asset/42610/flashtooltip-as3-v1.0.3.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6CFgexj8eI/AAAAAAAAAK8/_bIWfOc6SJc/s1600-h/42610.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 188px;" src="http://3.bp.blogspot.com/_QCVVuSkYgpc/S6CFgexj8eI/AAAAAAAAAK8/_bIWfOc6SJc/s320/42610.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449502342181548514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PROP3D 60s TV&lt;br /&gt;&lt;br /&gt;Prop3D is a unique interactive Papervision3D media player component which can be customized and preloaded with your original videos, images &amp; audio. The player itself is a 3D object, and can auto spin or be mouse tracked in a 3D space.&lt;br /&gt;&lt;br /&gt;Prop3D includes a Collada 3D model and an ActionScript 3 component that loads it in a specific position using the component inspector. The really impressive thing about this component is that it allows you to load videos, images and sounds (displaying an equalizer) over a canvas within the model via an XML playlist. Finally, being able to customize the png meshes which construct the 3D object, makes it the most complete Papervision3D based component on the market.&lt;br /&gt;&lt;br /&gt;We've teamed up with Zero Fractal Studios (the makers of the popular Tree3D component) to bring you these premium quality, unique and exclusive UltraComponents. Stay tuned for more!&lt;br /&gt;&lt;br /&gt;Additional features include:&lt;br /&gt;* Great Memory and CPU Handling (this feature requires flash player 9.0.115 or higher). &lt;br /&gt;* Data Driven - Prop3D loads information from XML objects so you can customize your play list according to your needs. &lt;br /&gt;You can also modify the play list with the API. &lt;br /&gt;* Customizable mouse interaction - You can set the prop to face the mouse vertically, horizontally or both, with the screen always visible, or configure it by simple API calls.&lt;br /&gt;Auto Spin Spin Speed - You can set the prop to spin automatically and change its speed, even with mouse interaction.&lt;br /&gt;* Model customization - You can create your own props or use the props adding elements to the scene.&lt;br /&gt;* Customizable UI Settings - Developers can easily customize every possible aspect of the prop display: position, rotation, camera, and even mouse interaction. .&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ultrashock.com/#/asset/45591/prop3d-60s-tv.html"&gt;http://www.ultrashock.com/#/asset/45591/prop3d-60s-tv.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_QCVVuSkYgpc/S6CGKCgJaxI/AAAAAAAAALE/K7uLub-EHG0/s1600-h/45591.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://4.bp.blogspot.com/_QCVVuSkYgpc/S6CGKCgJaxI/AAAAAAAAALE/K7uLub-EHG0/s320/45591.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449503056146819858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PROP3D  MACBOOK&lt;br /&gt;&lt;br /&gt;rop3D is a unique interactive Papervision3D media player component which can be customized and preloaded with your original videos, images &amp; audio. The player itself is a 3D object, and can auto spin or be mouse tracked in a 3D space.&lt;br /&gt;&lt;br /&gt;Prop3D includes a Collada 3D model and an ActionScript 3 component that loads it in a specific position using the component inspector. The really impressive thing about this component is that it allows you to load videos, images and sounds (displaying an equalizer) over a canvas within the model via an XML playlist. Finally, being able to customize the png meshes which construct the 3D object, makes it the most complete Papervision3D based component on the market.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ultrashock.com/#/asset/45589/prop3d--macbook.html"&gt;http://www.ultrashock.com/#/asset/45589/prop3d--macbook.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_QCVVuSkYgpc/S6CGnEh92nI/AAAAAAAAALM/mRYM6w76ups/s1600-h/45589.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 224px;" src="http://4.bp.blogspot.com/_QCVVuSkYgpc/S6CGnEh92nI/AAAAAAAAALM/mRYM6w76ups/s320/45589.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449503554907527794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;LOADBAR&lt;br /&gt;&lt;br /&gt;Very easy to implement, use, and customise. Loadbar can be used for any file loading process. The progress bar is resized using some simple tweening to produce a smooth animation.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ultrashock.com/#/asset/38155/loadbar.html"&gt;http://www.ultrashock.com/#/asset/38155/loadbar.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_QCVVuSkYgpc/S6CHBxWSsVI/AAAAAAAAALU/HMWCdPtVkMk/s1600-h/38155.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 134px;" src="http://4.bp.blogspot.com/_QCVVuSkYgpc/S6CHBxWSsVI/AAAAAAAAALU/HMWCdPtVkMk/s320/38155.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449504013614756178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;CUSTOMCURSOR&lt;br /&gt;&lt;br /&gt;CustomCursor is an AS3 class that allows you to quickly and easily add custom cursors to your Flash movies. Custom cursors can be created from bitmap images or MovieClips, so there really is no limit to the custom cursor designs you want to create.&lt;br /&gt;&lt;br /&gt;Setting up your custom cursors is effortless. You simply tell the CustomCursor class which custom cursor an interactive object should use, and the everything is taken care of for you. Adding a drop shadow to your custom cursors is as simple as passing a DropShadowFilter to the CustomCursor class.&lt;br /&gt;&lt;br /&gt;If you want to get cursor creative, CustomCursor is probably the only class you will need.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ultrashock.com/#/asset/37933/customcursor.html"&gt;http://www.ultrashock.com/#/asset/37933/customcursor.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ultrashock.com/#/asset/38155/loadbar.html"&gt;http://www.ultrashock.com/#/asset/38155/loadbar.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6CHZsLh6jI/AAAAAAAAALc/MoWGXat055Q/s1600-h/37933.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 142px;" src="http://2.bp.blogspot.com/_QCVVuSkYgpc/S6CHZsLh6jI/AAAAAAAAALc/MoWGXat055Q/s320/37933.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5449504424544299570" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-1526558697507574761?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/1526558697507574761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=1526558697507574761' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1526558697507574761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1526558697507574761'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/03/my-favorites-flash-as3-componentfla.html' title='My Favorites Flash AS3 Component/FLA Part II'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QCVVuSkYgpc/S6B83qfh-NI/AAAAAAAAAJM/MHdB7wcCX0M/s72-c/91738.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-1208936668234216252</id><published>2010-03-03T16:43:00.001-08:00</published><updated>2010-03-05T16:05:14.387-08:00</updated><title type='text'>Internet Speeds and costs around the world</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S48CY96sZUI/AAAAAAAAAJE/s2JKVw-fqhA/s1600-h/xVT0F.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 285px; height: 320px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S48CY96sZUI/AAAAAAAAAJE/s2JKVw-fqhA/s320/xVT0F.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5444573102475076930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.geek2god.com/articles/brain_farts/internet-speeds-and-costs-around-the-world/"&gt;http://www.geek2god.com/articles/brain_farts/internet-speeds-and-costs-around-the-world/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-1208936668234216252?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/1208936668234216252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=1208936668234216252' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1208936668234216252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1208936668234216252'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/03/internet-speeds-and-costs-around-world.html' title='Internet Speeds and costs around the world'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_QCVVuSkYgpc/S48CY96sZUI/AAAAAAAAAJE/s2JKVw-fqhA/s72-c/xVT0F.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-8002704727340697334</id><published>2010-02-26T14:45:00.001-08:00</published><updated>2010-02-26T14:45:57.616-08:00</updated><title type='text'>Flash PLayer 10.1 on the Google Nexus One</title><content type='html'>Thibault Imbert and Michael Chaize demonstrate the power of the new Flash PLayer 10.1 on the Google Nexus One. &lt;a href="http://vimeo.com/9596010"&gt;http://vimeo.com/9596010&lt;/a&gt; I apologize for my bad battery management shooting the video. For those who wants to see how the battery reacts playing Flash content on the Google Nexus One, please check that blog post: flashmobileblog.com/2010/02/24/battery-performance-with-flash-player-10-1-on-nexus-one/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-8002704727340697334?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/8002704727340697334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=8002704727340697334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8002704727340697334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8002704727340697334'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/02/flash-player-101-on-google-nexus-one.html' title='Flash PLayer 10.1 on the Google Nexus One'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-8816586896583143596</id><published>2010-02-18T10:12:00.000-08:00</published><updated>2010-02-18T10:13:08.615-08:00</updated><title type='text'>Where Microsoft's Profits Come From</title><content type='html'>&lt;a href="http://www.osnews.com/story/22871/Where_Microsoft_s_Profits_Come_From"&gt;http://www.osnews.com/story/22871/Where_Microsoft_s_Profits_Come_From&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-8816586896583143596?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/8816586896583143596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=8816586896583143596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8816586896583143596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8816586896583143596'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/02/where-microsofts-profits-come-from.html' title='Where Microsoft&apos;s Profits Come From'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-1876242152612717009</id><published>2010-02-18T10:10:00.001-08:00</published><updated>2010-02-18T10:10:52.908-08:00</updated><title type='text'>the evolution of Photoshop</title><content type='html'>&lt;a href="http://ronation.co.uk/photoshop/the-evolution-of-photoshop-1988-2010/"&gt;http://ronation.co.uk/photoshop/the-evolution-of-photoshop-1988-2010/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-1876242152612717009?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/1876242152612717009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=1876242152612717009' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1876242152612717009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/1876242152612717009'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/02/evolution-of-photoshop.html' title='the evolution of Photoshop'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-4070142845332482327</id><published>2010-02-09T20:49:00.000-08:00</published><updated>2010-02-09T20:54:26.880-08:00</updated><title type='text'>Erik Natzke</title><content type='html'>Erik Natzke’s generative paintings are made using Flash, sometimes from sampled photos and video and other times from scratch. He controls very specifically the environment in which his creations thrive, leaving the artwork’s specificities to the whim of the code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_QCVVuSkYgpc/S3I75kHxDLI/AAAAAAAAAI8/FFcEMCrCSG4/s1600-h/eriknatzke.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 318px;" src="http://4.bp.blogspot.com/_QCVVuSkYgpc/S3I75kHxDLI/AAAAAAAAAI8/FFcEMCrCSG4/s320/eriknatzke.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5436473560324443314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jot.eriknatzke.com/"&gt;http://jot.eriknatzke.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/2090593"&gt;http://vimeo.com/2090593&lt;/a&gt;&lt;br /&gt;&lt;a href="http://centripetalnotion.com/2007/11/30/03:35:23/"&gt;http://centripetalnotion.com/2007/11/30/03:35:23/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-4070142845332482327?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/4070142845332482327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=4070142845332482327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4070142845332482327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4070142845332482327'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/02/erik-natzke.html' title='Erik Natzke'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_QCVVuSkYgpc/S3I75kHxDLI/AAAAAAAAAI8/FFcEMCrCSG4/s72-c/eriknatzke.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-2566194347645728955</id><published>2010-02-03T16:35:00.000-08:00</published><updated>2010-02-03T16:53:37.558-08:00</updated><title type='text'>Android</title><content type='html'>The Applications layer hosts all Android and third-party applications, and several or more third-party applications can execute simultaneously. However, as noted, doing so can shorten battery life.&lt;br /&gt;&lt;br /&gt;Beneath the Applications layer is the Android Frameworks layer. This layer consists of Java classes that provide application functions such as window management, window content display, application messaging, and handling phone calls. Obviously the interface Android presents at this level uses the Java programming language, and because the source code is available, you can modify these classes to extend their capabilities or over override their behavior. Note that some of the lower levels in the stack present C++ interfaces.&lt;br /&gt;&lt;br /&gt;Next on the software stack comes the Libraries and Runtime layer. The libraries implement 2D and 3D graphics support, along with multimedia content decoding. This layer has engines to support application features, such as a SQLite database engine and WebKit, which handles web content rendering.&lt;br /&gt;&lt;br /&gt;Like Java ME, Android strives for hardware independence by using a bytecode interpreter to execute Android applications. However, it doesn't use Sun's JVM, but instead uses its own Dalvik Virtual Machine (DVM). The advantage to Android's use of a different bytecode interpreter is that the DVM was designed so that multiple instances of it can run, each in their own protected memory space, and each executing an application. While this approach offers stability and a robust environment for running multiple applications, it does so at the expense of compatibility with Java ME applications.&lt;br /&gt;&lt;br /&gt;The lowest layer of the stack is the Linux kernel. It provides preemptive multitasking and system services such as threads, networking services, and process management. It handles all low-level drivers and manages the device's power&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S2oWl4mJTyI/AAAAAAAAAIs/aNV8JjZ1QxE/s1600-h/androidstack.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 288px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S2oWl4mJTyI/AAAAAAAAAIs/aNV8JjZ1QxE/s320/androidstack.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5434180740479274786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;My favorites device right now is the&lt;br /&gt;&lt;br /&gt;Samsung Behold II which is now official. It is offered by T-Mobile and run on Android OS. Behold II is also known as SGH-t939 and is quite an impressive phone.&lt;br /&gt;&lt;br /&gt;The device has a 3.2″ AMOLED touch-screen, supports 3G networks and T-Mobile promises it will be out before the holidays.&lt;br /&gt;&lt;br /&gt;Samsung Behold II will be Samsung’s first Android-powered device with T-Mobile and will have an integrated GPS receiver&lt;br /&gt;so you can take full advantage of Google Maps, and hundreds of others apps that uses location information.&lt;br /&gt;&lt;br /&gt;Samsungs Touchwiz 2.0 and Cube Interface is pretty slick and is a great demonstration of what Open GL can deliver on handled handset&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QCVVuSkYgpc/S2oZ-CD4ZnI/AAAAAAAAAI0/GBUohWJRHF4/s1600-h/samsung-behold_ii.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_QCVVuSkYgpc/S2oZ-CD4ZnI/AAAAAAAAAI0/GBUohWJRHF4/s320/samsung-behold_ii.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5434184453871658610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://support.t-mobile.com/doc/tm24124.xml?related=y&amp;Referring%20Related%20DocID%20List%20Index=1&amp;navtypeid=10&amp;pagetypeid=7&amp;prevPageIndex=9"&gt;Samsung Behold II Feature list&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-2566194347645728955?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/2566194347645728955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=2566194347645728955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/2566194347645728955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/2566194347645728955'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/02/android.html' title='Android'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_QCVVuSkYgpc/S2oWl4mJTyI/AAAAAAAAAIs/aNV8JjZ1QxE/s72-c/androidstack.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-6955692395248960987</id><published>2010-01-27T19:28:00.000-08:00</published><updated>2011-10-22T01:21:58.655-07:00</updated><title type='text'>How to retrieve XMP Data/Cuepoints using the FLVPlayback</title><content type='html'>Some users may wonder how they can retrieve the XMP data using the FLVplayback Component.&lt;br /&gt;&lt;br /&gt;The best approach is based on the following article&lt;br /&gt;&lt;br /&gt;http://www.adobe.com/devnet/flash/articles/flvplayback_fplayer9u3_04.html&lt;br /&gt;&lt;br /&gt;and consist of implementing your own Custom callbacks via a custom client class&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The FLVPlayback component automatically creates an instance of the class fl.video.VideoPlayerClient, assigns it to the NetStream's client property, and handles all callback messages that come through the NetStream. The default class fl.video.VideoPlayerClient handles only the callbacks onMetaData() and onCuePoint(). Both of these messages generate events (MetadataEvent.METADATE_RECEIVED and MetadataEvent.CUE_POINT) so that you do not need to register a custom class to handle these callbacks.&lt;br /&gt;&lt;br /&gt;However, if you do wish to use custom callbacks, you must register a custom client class. You should extend fl.video.VideoPlayerClient to ensure that the onMetaData() and onCuePoint() handling supplied by VideoPlayer and FLVPlayback will continue to work properly.&lt;br /&gt;&lt;br /&gt;The requirements for a custom client implementation are as follows:&lt;br /&gt;&lt;br /&gt;    * The constructor method must take an fl.video.VideoPlayer instance as its only parameter.&lt;br /&gt;    * The custom class must include a ready property which should be set to true when all messages expected at the very beginning of the NetStream have been received. This step is necessary because the VideoPlayer class initially hides the video and plays the beginning of the file to access the correct dimensions and duration of the video. It then quickly rewinds the video to the beginning and unhides it. If the rewind occurs before all messages at the very beginning of the file are received by VideoPlayer, there's a chance those messages may never be received.&lt;br /&gt;    * It is highly recommended that you declare the custom class as dynamic to avoid encountering runtime errors. Errors may appear if any callbacks are triggered that the class is not set up to handle.&lt;br /&gt;    * It is also recommended to extend fl.video.VideoPlayerClient to ensure proper onMetaData() and onCuePoint() handling.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1) Create a new extented Metadata EVENT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Copy IVPEvent.as from the source code of FLVplayback locally under your FLA project under fl\video sub folder&lt;br /&gt;&lt;br /&gt;Use the code below to register a new extended event save it in a file ExtendedMetadataEvent.as&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;package fl.video {&lt;br /&gt;&lt;br /&gt; import flash.events.Event;&lt;br /&gt;&lt;br /&gt;        /**&lt;br /&gt;         * Flash&lt;sup&gt;&amp;#xAE;&lt;/sup&gt; Player dispatches a ExtentedMetadataEvent object when the user &lt;br /&gt;   * requests the FLV/F4V/H264 file's metadata information packet (&lt;code&gt;NetStream.onXMPData&lt;/code&gt;) &lt;br /&gt;   * &lt;br /&gt;   * @langversion 3.0&lt;br /&gt;         * @playerversion Flash 9.0.28.0&lt;br /&gt;         */&lt;br /&gt; public class ExtendedMetadataEvent extends fl.video.MetadataEvent {&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Defines the value of the &lt;br /&gt;   * &lt;code&gt;type&lt;/code&gt; property of a &lt;code&gt;xmpDataReceived&lt;/code&gt; event object.&lt;br /&gt;   *&lt;br /&gt;   * @see FLVPlayback#event:xmpDataReceived xmpDataReceived event&lt;br /&gt;   * @eventType xmpDataReceived&lt;br /&gt;   * @langversion 3.0&lt;br /&gt;                 * @playerversion Flash 10.0.0.0&lt;br /&gt;   */&lt;br /&gt;  public static const XMPDATA_RECEIVED:String = "xmpDataReceived";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Creates an Event object that contains information about metadata events. &lt;br /&gt;   * Event objects are passed as parameters to event listeners.&lt;br /&gt;   * &lt;br /&gt;   * @param type The type of the event. Event listeners can access this information &lt;br /&gt;         * through the inherited &lt;code&gt;type&lt;/code&gt; property. Possible values are &lt;code&gt;MetadataEvent.XMPDATA_RECEIVED&lt;/code&gt;.&lt;br /&gt;   * &lt;br /&gt;   * @param bubbles Determines whether the Event object participates in the bubbling &lt;br /&gt;   * stage of the event flow. Event listeners can access this information through the &lt;br /&gt;   * inherited &lt;code&gt;bubbles&lt;/code&gt; property.&lt;br /&gt;   * &lt;br /&gt;   * @param cancelable Determines whether the Event object can be canceled. Event listeners can &lt;br /&gt;   * access this information through the inherited &lt;code&gt;cancelable&lt;/code&gt; property.&lt;br /&gt;   * &lt;br /&gt;   * @param info Determines the dynamic properties to add.&lt;br /&gt;   * &lt;br /&gt;   * @param vp Determines the index of the VideoPlayer object.&lt;br /&gt;   * &lt;br /&gt;   * @langversion 3.0&lt;br /&gt;   * @playerversion Flash 9.0.28.0&lt;br /&gt;   * &lt;br /&gt;   */&lt;br /&gt;  public function ExtendedMetadataEvent( type:String, bubbles:Boolean=false, cancelable:Boolean=false,&lt;br /&gt;                                 info:Object=null, vp:uint=0) {&lt;br /&gt;   super(type, bubbles, cancelable);&lt;br /&gt;   super.info = info;&lt;br /&gt;   super.vp = vp;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;     /**&lt;br /&gt;   *  @private&lt;br /&gt;      */    &lt;br /&gt;  override public function clone():Event &lt;br /&gt;  {&lt;br /&gt;   return new ExtendedMetadataEvent(type, bubbles, cancelable, info, vp);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; } // class ExtendedMetadataEvent&lt;br /&gt;&lt;br /&gt;} // package fl.video&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2) Use the code below to register the custom client class:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;package {&lt;br /&gt; &lt;br /&gt;   import fl.video.VideoPlayer;&lt;br /&gt;   import fl.video.VideoPlayerClient;&lt;br /&gt;   import fl.video.ExtendedMetadataEvent;&lt;br /&gt;   &lt;br /&gt;   import flash.events.Event;&lt;br /&gt;   import flash.events.EventDispatcher;&lt;br /&gt;   &lt;br /&gt;   import flash.display.Loader;&lt;br /&gt;   import flash.display.DisplayObjectContainer;&lt;br /&gt;   import flash.utils.ByteArray;&lt;br /&gt;   &lt;br /&gt; &lt;br /&gt;   /**&lt;br /&gt;    * NetstreamDataVideoClient subclasses VideoPlayerClient, the default&lt;br /&gt;    * VideoPlayer.netStreamClientClass value. This way all&lt;br /&gt;    * the metadata and cue point handling built in the&lt;br /&gt;    * VideoPlayer works properly.&lt;br /&gt;    *&lt;br /&gt;    * The class is declared dynamic so if any other&lt;br /&gt;   * messages are received that we do not support in&lt;br /&gt;   * this class (onTextData(), other custom&lt;br /&gt;   * messages) no runtime errors will occur.&lt;br /&gt;   */&lt;br /&gt; &lt;br /&gt;dynamic public class NetstreamDataVideoClient extends VideoPlayerClient&lt;br /&gt;   {&lt;br /&gt; &lt;br /&gt;   /**&lt;br /&gt;   * This variable is set in onImageData and is used to help&lt;br /&gt;   * determine when the ready property should be true.&lt;br /&gt;   */&lt;br /&gt; &lt;br /&gt;      protected var gotXMPData:Boolean;&lt;br /&gt;      protected var gotImageData:Boolean;&lt;br /&gt;      public var XMPString:String = "";&lt;br /&gt;      protected var verbose:Boolean = false;&lt;br /&gt; &lt;br /&gt;   /**&lt;br /&gt;   * The constructor must take a VideoPlayer as its&lt;br /&gt;   * only parameter. It needs to pass that argument&lt;br /&gt;   * along to the super constructor.&lt;br /&gt;   */&lt;br /&gt; &lt;br /&gt;      public function NetstreamDataVideoClient(vp:VideoPlayer) {&lt;br /&gt;         super(vp);&lt;br /&gt;         gotImageData = false;&lt;br /&gt;                                 gotXMPData = false;&lt;br /&gt;      }&lt;br /&gt; &lt;br /&gt;   /**&lt;br /&gt;   * Handling for onImageData() message&lt;br /&gt;   * Loads the image bytes into a flash.display.Loader&lt;br /&gt;   * and adds the image to the&lt;br /&gt;   */&lt;br /&gt;   &lt;br /&gt;      public function onImageData(info:Object):void {&lt;br /&gt;      // Only handle onImageData() once. Any time we seek to the&lt;br /&gt;      // start of the file, the message will call this function&lt;br /&gt;      // again&lt;br /&gt;                                  trace("onImageData");&lt;br /&gt;         if (gotImageData)&lt;br /&gt;            return;&lt;br /&gt;         var loader:Loader = new Loader();&lt;br /&gt;         loader.loadBytes(info.data);&lt;br /&gt;         var parent:DisplayObjectContainer = _owner.root as DisplayObjectContainer;&lt;br /&gt;         if (parent) {&lt;br /&gt;            parent.addChildAt(loader, 0);&lt;br /&gt;         }&lt;br /&gt;         gotImageData = true;&lt;br /&gt;      }&lt;br /&gt; &lt;br /&gt;      public function onTextData(info:Object):void {&lt;br /&gt;         trace(info);&lt;br /&gt;         recurseTrace(info, "");&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// FOR LOCAL FILE OR HTTP&lt;br /&gt;   public function onXMPData(info:Object):void  { &lt;br /&gt;   if (gotXMPData)&lt;br /&gt;      return;&lt;br /&gt;  &lt;br /&gt;                if (verbose) &lt;br /&gt;   trace("NetstreamDataVideoClient onXMPData");&lt;br /&gt;   &lt;br /&gt;   // F4V/H264 uses data to pass raw XMP&lt;br /&gt;   if (info.data!= undefined)&lt;br /&gt;   {&lt;br /&gt;if (verbose)&lt;br /&gt;     trace(info.data);&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    if (info.liveXML!= undefined)&lt;br /&gt;    {&lt;br /&gt;     // FLV uses liveXML to pass raw XMP&lt;br /&gt;if (verbose)&lt;br /&gt;     trace(info.liveXML);&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   gotXMPData = true;&lt;br /&gt;   &lt;br /&gt;   //     for (var i in info)&lt;br /&gt;   // {&lt;br /&gt;   //  trace(i + " is " + info[i]);&lt;br /&gt;   // }&lt;br /&gt;                 // trace("####\n");&lt;br /&gt;  &lt;br /&gt;   // XMP came from Adobe Media Encoder for Flash&lt;br /&gt;   if (info.data!= undefined)&lt;br /&gt;   {&lt;br /&gt;   XMPString = info.data;&lt;br /&gt;     &lt;br /&gt;    _owner.dispatchEvent(new ExtendedMetadataEvent(ExtendedMetadataEvent.XMPDATA_RECEIVED, false, false, info));&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;   if (info.liveXML!= undefined)&lt;br /&gt;   {&lt;br /&gt;    XMPString = info.liveXML;&lt;br /&gt;     &lt;br /&gt;    _owner.dispatchEvent(new ExtendedMetadataEvent(ExtendedMetadataEvent.XMPDATA_RECEIVED, false, false, info));&lt;br /&gt;   }&lt;br /&gt;   } &lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private function recurseTrace(info:Object, indent:String):void&lt;br /&gt;      {&lt;br /&gt;         for (var i:* in info) {&lt;br /&gt;            if (typeof info[i] == "object") {&lt;br /&gt;               trace(indent + i + ":");&lt;br /&gt;               recurseTrace(info[i], indent + "  ");&lt;br /&gt;            } else {&lt;br /&gt;               trace(indent + i + " : " + info[i]);&lt;br /&gt;            }&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;   &lt;br /&gt;   /**&lt;br /&gt;   * property that specifies whether early messages have been&lt;br /&gt;   * received so it is OK for the player to rewind back to the&lt;br /&gt;   * beginning. If we allow the VideoPlayer to rewind before&lt;br /&gt;   * all messages at the very beginning of the file are received,&lt;br /&gt;   * we may never receive them.&lt;br /&gt;   *&lt;br /&gt;   * The default class, VideoPlayerClient, only requires&lt;br /&gt;   * onMetaData() to be received before rewinding. onImageData()&lt;br /&gt;   * also appears at the beginning of the file, so we might miss&lt;br /&gt;   * that if we do not override this property and include a check&lt;br /&gt;   * for this data.&lt;br /&gt;   */&lt;br /&gt;   &lt;br /&gt;      override public function get ready():Boolean {&lt;br /&gt;         return (super.ready &amp;&amp; gotImageData);&lt;br /&gt;      }&lt;br /&gt; &lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IMPORTANT: Don't try to parse the XMP data in the callback as it might be causing some timing issue and you want to give the hand back to the Netstream Object ASAP. Instead fire an event back to your client event listener and make sure you will interpret the data when the video will be in a READY to seek state.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3) Receive XMP Data using FLVPlayback&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;import NetstreamDataVideoClient;&lt;br /&gt;import fl.video.ExtendedMetadataEvent;&lt;br /&gt;import flash.events.*;&lt;br /&gt;import fl.video.*;&lt;br /&gt;&lt;br /&gt;VideoPlayer.netStreamClientClass = NetstreamDataVideoClient;&lt;br /&gt;&lt;br /&gt;_playback = new FLVPlayback();&lt;br /&gt;_playback.width = 1280;&lt;br /&gt;_playback.height = 720;&lt;br /&gt;_playback.autoRewind = false;&lt;br /&gt;_playback.bufferingBarHidesAndDisablesOthers = true;&lt;br /&gt;_playback.visible = true;  &lt;br /&gt;addChild(_playback);&lt;br /&gt;_playback.addEventListener(MetadataEvent.METADATA_RECEIVED, metadataListener);&lt;br /&gt;// the XMP one&lt;br /&gt;_playback.addEventListener(ExtendedMetadataEvent.XMPDATA_RECEIVED,xmpListener);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private function xmpListener(inEvt:fl.video.ExtendedMetadataEvent):void {&lt;br /&gt;    var XMPString:String = "";&lt;br /&gt;    if (this.verbose)&lt;br /&gt;                 trace("--- xmpListener ----");&lt;br /&gt;    if (this.verbose) {&lt;br /&gt;      if (inEvt.info.data!= undefined)&lt;br /&gt;      {&lt;br /&gt;      XMPString = inEvt.info.data;&lt;br /&gt;      &lt;br /&gt;      trace("RECEIVED XMP DATA = " + XMPString);&lt;br /&gt;       // ready to parse &lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;      if (inEvt.info.liveXML!= undefined)&lt;br /&gt;      {&lt;br /&gt;       XMPString = inEvt.info.liveXML;&lt;br /&gt;       &lt;br /&gt;       trace("RECEIVED XMP DATA = " + XMPString);&lt;br /&gt;// ready to parse &lt;br /&gt;      }&lt;br /&gt;           }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hope you enjoy this article !&lt;br /&gt;Time to interpret the data now&lt;br /&gt;&lt;br /&gt;&lt;a href="http://younsi.blogspot.com/2008/12/interactive-video-in-flash-using-f4v.html"&gt;http://younsi.blogspot.com/2008/12/interactive-video-in-flash-using-f4v.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and store some useful XMP Data&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.actimus.com/"&gt;http://www.actimus.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Free AS3 Interactive Video FLVPlayback component for FLASH CS5&lt;br /&gt;&lt;br /&gt;&lt;a href="http://shop.actimus.com/product_info.php?products_id=122"&gt;http://shop.actimus.com/product_info.php?products_id=122&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-6955692395248960987?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/6955692395248960987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=6955692395248960987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6955692395248960987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/6955692395248960987'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/01/how-to-retrieve-xmp-cuepoint-for.html' title='How to retrieve XMP Data/Cuepoints using the FLVPlayback'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-8110845587541614832</id><published>2010-01-19T11:19:00.000-08:00</published><updated>2010-01-20T11:29:50.993-08:00</updated><title type='text'>Urgence Haïti. Internet is finally up</title><content type='html'>Bill (woody) is an independant internet guru  who is highly respected.&lt;br /&gt;&lt;br /&gt;On Jan 18, 2010, at 3:46 PM, @…edu.ht wrote:&lt;br /&gt;| &gt; The Teleco Building where ns1.nic.ht and ns2.nic.ht are (were) is completely dust.&lt;br /&gt;| &gt; Thanks a lot for your time to keep .ht up and running well.&lt;br /&gt;|&lt;br /&gt;| Believe me, that's the least we could do.&lt;br /&gt;| And please know that you have our deepest sympathy.&lt;br /&gt;|&lt;br /&gt;| In case you have time to look it over, here are the other things we've been focusing our effort on.&lt;br /&gt;| I'd appreciate a sanity-check, and any help you might be able to give us in prioritizing,&lt;br /&gt;| or letting us know when you know that someone else is already covering something:&lt;br /&gt;|&lt;br /&gt;|  - Arranging US military deliveries of diesel to Reynold for the two generators at Boutilliers Hill.&lt;br /&gt;|&lt;br /&gt;|  - Coordinating Columbus, Tyco, the Marine Research labs at the University of Puerto Rico, and the US Navy,&lt;br /&gt;|    to try to get a festoon cable run from Santo Domingo to Port au Prince, and/or an extension&lt;br /&gt;|    from the Columbus branching unit that lies between Port au Prince and Guantanamo.&lt;br /&gt;|    We're making sure that people understand that if this comes to fruition, ownership of anything&lt;br /&gt;|    that's been aid-funded needs to be divided among Haitian ISPs, not monopolized within Columbus.&lt;br /&gt;|&lt;br /&gt;|  - Arranging delivery of SIP VoIP phones (again to Reynold) for the use of the ISPs, emergency responders,&lt;br /&gt;|    and Haitian government.  Questions here: Are stand-alone phones preferred, or FXS ports on routers,&lt;br /&gt;|    with analog phones?  How many?  Is the local Haitian ISP community prepared to support them with&lt;br /&gt;|    an Asterisk or equivalent back-end? Is there anyone there who's prepared to configure each of&lt;br /&gt;|    a batch of stand-alone phones?&lt;br /&gt;|&lt;br /&gt;|  - Helping coordinate international law enforcement and the technical community to shut down and prosecute&lt;br /&gt;|    con-artists who are setting up fake relief donation web sites and spamming to promote them.&lt;br /&gt;|&lt;br /&gt;| What else can we do to help you?&lt;br /&gt;|                                 -Bill&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm sure other people involved in the relief work can suggest other things, but a few comments from my point of view:&lt;br /&gt;&lt;br /&gt; - Communications capability underpins the ability of other relief workers to do their jobs effectively, so although we, as a community, aren't feeding people or tending to their medical needs, we are helping those who are doing those crucial jobs by allowing them to focus on their work.&lt;br /&gt;&lt;br /&gt; - In the short-term, the equipment that's been requested by people on the ground has either already been delivered, is onboard a ship that left Jacksonville about twelve hours ago, or is being containerized to load on a ship that's leaving from Port Everglades tomorrow.&lt;br /&gt;&lt;br /&gt; - Also in the short-term, keep an eye out for con-artists who are trying to lure people in to fake aid-donation web sites with spam.  Law enforcement is coordinating internationally to take those offline as promptly as possible.  &lt;br /&gt;&lt;br /&gt; - In the mid-term, what our community needs to do is to make sure that backhaul infrastructure gets into place to move traffic in the 1Gbps-10Gbps range from Port au Prince to Miami.  There are several cable systems which land in Santo Domingo, and Columbus has a branching unit off Guantanamo, so our main efforts have been focused on getting a festoon cable run around from the Santo Domingo landing (the University of Puerto Rico Marine Research labs have committed their cable-laying ship, crew, and divers, but we're still looking for an appropriate spool of armored singlemode in the 12-24 core range (more certainly wouldn't hurt, as this would be unrepeatered), and on finding funding to get Columbus to run the spur in from their BU.  BTC apparently has fiber already existing or in process of turn-up between Port au Prince and the Bahamas, but nobody's been able to get a response from them yet about its status.&lt;br /&gt;&lt;br /&gt; - More generally, as a community, we do good when we make sure that places like this, places that may not have large or lucrative markets, are still served by diverse fiber, rather than by a single fragile monopoly, or not at all, as in Haiti's case.  There are many countries as vulnerable as Haiti, and many of them have no fiber.  Most humanitarian disasters happen in poor countries and these are generally the countries our community currently has the least capacity to serve.  We can think a little more broadly than that, looking to a future when people in poor countries have more smartphones, and students and small businesses are getting online.  We don't need to wait for markets to develop...  we can invest in those markets, and _cause_ them to develop.  Then they won't be as vulnerable to disasters like this.&lt;br /&gt;&lt;br /&gt; - Thinking to the longer term...  The majority of people who die in humanitarian disasters die of second-order effects like starvation and disease that come in the wake of an earthquake or flood or whatever.  That's just beginning now in Haiti, and will continue for some time.  The people who died in the earthquake itself will be far outnumbered by those who will die as a result of insufficiently prepared emergency response.  PCH and Cisco have been trying for _years_ to get donors to support a ready-to-go emergency communications team for disaster response, but it's been impossible to get donors to fund _preparedness_ rather than after-the-fact response.  But immediately after an emergency is the _most expensive_ time to acquire generators and fuel and solar panels and wind generators and batteries and satphones and fiber and space-segments and so forth.  All of that can be _much more cheaply_ purchased or contracted for beforehand, and delivered on-site weeks earlier.  A!&lt;br /&gt; and those weeks are the weeks of effective response that reduce second-order deaths in the wake of an emergency.  People who think they're being helpful with a donation now should understand that the donation would have saved ten times as many lives if it had been made a year ago, than if it's made now.  If your companies have charitable foundations, please get them to think about that.&lt;br /&gt;&lt;br /&gt;                               -Bill&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-8110845587541614832?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/8110845587541614832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=8110845587541614832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8110845587541614832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/8110845587541614832'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/01/urgence-haiti-internet-was-finally-up.html' title='Urgence Haïti. Internet is finally up'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-4436765678106629265</id><published>2010-01-18T21:10:00.000-08:00</published><updated>2010-01-18T21:13:27.993-08:00</updated><title type='text'>avatar vs roger dean</title><content type='html'>Did Prog Rock's Greatest Artist Inspire Avatar? All Signs Point To Yes&lt;br /&gt;&lt;br /&gt;James Cameron spent years creating Avatar's floating islands and crazy dragons, and then an army of concept artists brought them to life. But maybe they had some inspiration from somewhere else? Like classic album-cover artist Roger Dean? Behold the evidence.&lt;br /&gt;&lt;br /&gt;Chances are, if you've looked at a weirdshistic record cover by Yes, Asia or other bands, you've admired Roger Dean's paintings of surreal landscapes. If you've ever seen all good people turn their heads each day, then you're already a Dean fan.&lt;br /&gt;&lt;br /&gt;Connor Freff Cochran, founder of Conlan Press (which is busy putting out a bunch of Peter S. Beagle books, hosting Beagle's 52/50 poetry subscription service, and putting out art books) contacted us and suggested that Avatar's lush moon might have gained some inspiration from Dean. And when you look at Dean's artwork and compare it to the concept art we posted the other day, it's hard not to see the resemblance.&lt;br /&gt;&lt;br /&gt;All of this makes me want to rent Avatar (when it's released on DVD) and see if I can sync it up with YesSongs.&lt;br /&gt;&lt;br /&gt;Original Post&lt;br /&gt;&lt;br /&gt;&lt;a href="http://io9.com/5426120/did-prog-rocks-greatest-artist-inspire-avatar-all-signs-point-to-yes/"&gt;http://io9.com/5426120/did-prog-rocks-greatest-artist-inspire-avatar-all-signs-point-to-yes/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Other post&lt;br /&gt;&lt;br /&gt;http://blog.signalnoise.com/2010/01/06/avatar-vs-roger-dean/&lt;br /&gt;http://www.yannicklejeune.com/2010/01/avatar-roger-dean.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-4436765678106629265?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/4436765678106629265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=4436765678106629265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4436765678106629265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/4436765678106629265'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2010/01/avatar-vs-roger-dean.html' title='avatar vs roger dean'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-5824882582266866256</id><published>2009-12-02T11:15:00.000-08:00</published><updated>2009-12-02T11:16:11.083-08:00</updated><title type='text'>Web Analytics</title><content type='html'>With the recent news on Yahoo Finance regarding Omniture-Adobe acquisition, I was curious to know a bit more about Web Analytics and provide pointers to anyone reading my blog. I posted an article some time ago on how to add Google Web Analytics to a SWF.  Anyhow, here is a very great blog that I found at Tealium.com for those interested in Web Analytics. The blog is really well written by web Analytics Experts. Former Web Side Story, Visual Science and Omniture folks...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tealium.com/blog/"&gt;http://www.tealium.com/blog/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12185523-5824882582266866256?l=younsi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://younsi.blogspot.com/feeds/5824882582266866256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12185523&amp;postID=5824882582266866256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/5824882582266866256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12185523/posts/default/5824882582266866256'/><link rel='alternate' type='text/html' href='http://younsi.blogspot.com/2009/12/web-analytics.html' title='Web Analytics'/><author><name>Thomas Younsi</name><uri>http://www.blogger.com/profile/04829452574030205387</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12185523.post-7650875913822588076</id><published>2009-10-08T17:41:00.000-07:00</published><updated>2010-02-11T17:13:48.640-08:00</updated><title type='text'>Virtual-Key Codes Windows Platform</title><content type='html'>&lt;p&gt;&lt;font size="2" face="Arial, Helvetica, sans-serif"&gt;The following table shows &lt;br /&gt;  the symbolic constant names, decimal values, and mouse or keyboard equivalents &lt;br /&gt;  for the virtual-key codes used by the system. The codes are listed in numeric &lt;br /&gt;  order. &lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Virtual-Key Codes&lt;br /&gt;&lt;br /&gt;The following table shows the symbolic constant names, hexadecimal values, and mouse or keyboard equivalents for the virtual-key codes used by the system. The codes are listed in numeric order.&lt;br /&gt;&lt;br /&gt;Constants&lt;br /&gt;&lt;br /&gt;    VK_LBUTTON (0x01)&lt;br /&gt;        Left mouse button&lt;br /&gt;    VK_RBUTTON (0x02)&lt;br /&gt;        Right mouse button&lt;br /&gt;    VK_CANCEL (0x03)&lt;br /&gt;        Control-break processing&lt;br /&gt;    VK_MBUTTON (0x04)&lt;br /&gt;        Middle mouse button (three-button mouse)&lt;br /&gt;    VK_XBUTTON1 (0x05)&lt;br /&gt;        Windows 2000/XP: X1 mouse button&lt;br /&gt;    VK_XBUTTON2 (0x06)&lt;br /&gt;        Windows 2000/XP: X2 mouse button&lt;br /&gt;    - (0x07)&lt;br /&gt;        Undefined&lt;br /&gt;    VK_BACK (0x08)&lt;br /&gt;        BACKSPACE key&lt;br /&gt;    VK_TAB (0x09)&lt;br /&gt;        TAB key&lt;br /&gt;    - (0x0A-0B)&lt;br /&gt;        Reserved&lt;br /&gt;    VK_CLEAR (0x0C)&lt;br /&gt;        CLEAR key&lt;br /&gt;    VK_RETURN (0x0D)&lt;br /&gt;        ENTER key&lt;br /&gt;    - (0x0E-0F)&lt;br /&gt;        Undefined&lt;br /&gt;    VK_SHIFT (0x10)&lt;br /&gt;        SHIFT key&lt;br /&gt;    VK_CONTROL (0x11)&lt;br /&gt;        CTRL key&lt;br /&gt;    VK_MENU (0x12)&lt;br /&gt;        ALT key&lt;br /&gt;    VK_PAUSE (0x13)&lt;br /&gt;        PAUSE key&lt;br /&gt;    VK_CAPITAL (0x14)&lt;br /&gt;        CAPS LOCK key&lt;br /&gt;    VK_KANA (0x15)&lt;br /&gt;        Input Method Editor (IME) Kana mode&lt;br /&gt;    VK_HANGUEL (0x15)&lt;br /&gt;        IME Hanguel mode (maintained for compatibility; use VK_HANGUL)&lt;br /&gt;    VK_HANGUL (0x15)&lt;br /&gt;        IME Hangul mode&lt;br /&gt;    - (0x16)&lt;br /&gt;        Undefined&lt;br /&gt;    VK_JUNJA (0x17)&lt;br /&gt;        IME Junja mode&lt;br /&gt;    VK_FINAL (0x18)&lt;br /&gt;        IME final mode&lt;br /&gt;    VK_HANJA (0x19)&lt;br /&gt;        IME Hanja mode&lt;br /&gt;    VK_KANJI (0x19)&lt;br /&gt;        IME Kanji mode&lt;br /&gt;    - (0x1A)&lt;br /&gt;        Undefined&lt;br /&gt;    VK_ESCAPE (0x1B)&lt;br /&gt;        ESC key&lt;br /&gt;    VK_CONVERT (0x1C)&lt;br /&gt;        IME convert&lt;br /&gt;    VK_NONCONVERT (0x1D)&lt;br /&gt;        IME nonconvert&lt;br /&gt;    VK_ACCEPT (0x1E)&lt;br /&gt;        IME accept&lt;br /&gt;    VK_MODECHANGE (0x1F)&lt;br /&gt;        IME mode change request&lt;br /&gt;    VK_SPACE (0x20)&lt;br /&gt;        SPACEBAR&lt;br /&gt;    VK_PRIOR (0x21)&lt;br /&gt;        PAGE UP key&lt;br /&gt;    VK_NEXT (0x22)&lt;br /&gt;        PAGE DOWN key&lt;br /&gt;    VK_END (0x23)&lt;br /&gt;        END key&lt;br /&gt;    VK_HOME (0x24)&lt;br /&gt;        HOME key&lt;br /&gt;    VK_LEFT (0x25)&lt;br /&gt;        LEFT ARROW key&lt;br /&gt;    VK_UP (0x26)&lt;br /&gt;        UP ARROW key&lt;br /&gt;    VK_RIGHT (0x27)&lt;br /&gt;        RIGHT ARROW key&lt;br /&gt;    VK_DOWN (0x28)&lt;br /&gt;        DOWN ARROW key&lt;br /&gt;    VK_SELECT (0x29)&lt;br /&gt;        SELECT key&lt;br /&gt;    VK_PRINT (0x2A)&lt;br /&gt;        PRINT key&lt;br /&gt;    VK_EXECUTE (0x2B)&lt;br /&gt;        EXECUTE key&lt;br /&gt;    VK_SNAPSHOT (0x2C)&lt;br /&gt;        PRINT SCREEN key&lt;br /&gt;    VK_INSERT (0x2D)&lt;br /&gt;        INS key&lt;br /&gt;    VK_DELETE (0x2E)&lt;br /&gt;        DEL key&lt;br /&gt;    VK_HELP (0x2F)&lt;br /&gt;        HELP key&lt;br /&gt;     (0x30)&lt;br /&gt;        0 key&lt;br /&gt;     (0x31)&lt;br /&gt;        1 key&lt;br /&gt;     (0x32)&lt;br /&gt;        2 key&lt;br /&gt;     (0x33)&lt;br /&gt;        3 key&lt;br /&gt;     (0x34)&lt;br /&gt;        4 key&lt;br /&gt;     (0x35)&lt;br /&gt;        5 key&lt;br /&gt;     (0x36)&lt;br /&gt;        6 key&lt;br /&gt;     (0x37)&lt;br /&gt;        7 key&lt;br /&gt;     (0x38)&lt;br /&gt;        8 key&lt;br /&gt;     (0x39)&lt;br /&gt;        9 key&lt;br /&gt;    - (0x3A-40)&lt;br /&gt;        Undefined&lt;br /&gt;     (0x41)&lt;br /&gt;        A key&lt;br /&gt;     (0x42)&lt;br /&gt;        B key&lt;br /&gt;     (0x43)&lt;br /&gt;        C key&lt;br /&gt;     (0x44)&lt;br /&gt;        D key&lt;br /&gt;     (0x45)&lt;br /&gt;        E key&lt;br /&gt;     (0x46)&lt;br /&gt;        F key&lt;br /&gt;     (0x47)&lt;br /&gt;        G key&lt;br /&gt;     (0x48)&lt;br /&gt;        H key&lt;br /&gt;     (0x49)&lt;br /&gt;        I key&lt;br /&gt;     (0x4A)&lt;br /&gt;        J key&lt;br /&gt;     (0x4B)&lt;br /&gt;        K key&lt;br /&gt;     (0x4C)&lt;br /&gt;        L key&lt;br /&gt;     (0x4D)&lt;br /&gt;        M key&lt;br /&gt;     (0x4E)&lt;br /&gt;        N key&lt;br /&gt;     (0x4F)&lt;br /&gt;        O key&lt;br /&gt;     (0x50)&lt;br /&gt;        P key&lt;br /&gt;     (0x51)&lt;br /&gt;        Q key&lt;br /&gt;     (0x52)&lt;br /&gt;        R key&lt;br /&gt;     (0x53)&lt;br /&gt;        S key&lt;br /&gt;     (0x54)&lt;br /&gt;        T key&lt;br /&gt;     (0x55)&lt;br /&gt;        U key&lt;br /&gt;     (0x56)&lt;br /&gt;        V key&lt;br /&gt;     (0x57)&lt;br /&gt;        W key&lt;br /&gt;     (0x58)&lt;br /&gt;        X key&lt;br /&gt;     (0x59)&lt;br /&gt;        Y key&lt;br /&gt;     (0x5A)&lt;br /&gt;        Z key&lt;br /&gt;    VK_LWIN (0x5B)&lt;br /&gt;        Left Windows key (Microsoft Natural keyboard) &lt;br /&gt;    VK_RWIN (0x5C)&lt;br /&gt;        Right Windows key (Natural keyboard)&lt;br /&gt;    VK_APPS (0x5D)&lt;br /&gt;        Applications key (Natural keyboard)&lt;br /&gt;    - (0x5E)&lt;br /&gt;        Reserved&lt;br /&gt;    VK_SLEEP (0x5F)&lt;br /&gt;        Computer Sleep key&lt;br /&gt;    VK_NUMPAD0 (0x60)&lt;br /&gt;        Numeric keypad 0 key&lt;br /&gt;    VK_NUMPAD1 (0x61)&lt;br /&gt;        Numeric keypad 1 key&lt;br /&gt;    VK_NUMPAD2 (0x62)&lt;br /&gt;        Numeric keypad 2 key&lt;br /&gt;    VK_NUMPAD3 (0x63)&lt;br /&gt;        Numeric keypad 3 key&lt;br /&gt;    VK_NUMPAD4 (0x64)&lt;br /&gt;        Numeric keypad 4 key&lt;br /&gt;    VK_NUMPAD5 (0x65)&lt;br /&gt;        Numeric keypad 5 key&lt;br /&gt;    VK_NUMPAD6 (0x66)&lt;br /&gt;        Numeric keypad 6 key&lt;br /&gt;    VK_NUMPAD7 (0x67)&lt;br /&gt;        Numeric keypad 7 key&lt;br /&gt;    VK_NUMPAD8 (0x68)&lt;br /&gt;        Numeric keypad 8 key&lt;br /&gt;    VK_NUMPAD9 (0x69)&lt;br /&gt;        Numeric keypad 9 key&lt;br /&gt;    VK_MULTIPLY (0x6A)&lt;br /&gt;        Multiply key&lt;br /&gt;    VK_ADD (0x6B)&lt;br /&gt;        Add key&lt;br /&gt;    VK_SEPARATOR (0x6C)&lt;br /&gt;        Separator key&lt;br /&gt;    VK_SUBTRACT (0x6D)&lt;br /&gt;        Subtract key&lt;br /&gt;    VK_DECIMAL (0x6E)&lt;br /&gt;        Decimal key&lt;br /&gt;    VK_DIVIDE (0x6F)&lt;br /&gt;        Divide key&lt;br /&gt;    VK_F1 (0x70)&lt;br /&gt;        F1 key&lt;br /&gt;    VK_F2 (0x71)&lt;br /&gt;        F2 key&lt;br /&gt;    VK_F3 (0x72)&lt;br /&gt;        F3 key&lt;br /&gt;    VK_F4 (0x73)&lt;br /&gt;        F4 key&lt;br /&gt;    VK_F5 (0x74)&lt;br /&gt;        F5 key&lt;br /&gt;    VK_F6 (0x75)&lt;br /&gt;        F6 key&lt;br /&gt;    VK_F7 (0x76)&lt;br /&gt;        F7 key&lt;br /&gt;    VK_F8 (0x77)&lt;br /&gt;        F8 key&lt;br /&gt;    VK_F9 (0x78)&lt;br /&gt;        F9 key&lt;br /&gt;    VK_F10 (0x79)&lt;br /&gt;        F10 key&lt;br /&gt;    VK_F11 (0x7A)&lt;br /&gt;        F11 key&lt;br /&gt;    VK_F12 (0x7B)&lt;br /&gt;        F12 key&lt;br /&gt;    VK_F13 (0x7C)&lt;br /&gt;        F13 key&lt;br /&gt;    VK_F14 (0x7D)&lt;br /&gt;        F14 key&lt;br /&gt;    VK_F15 (0x7E)&lt;br /&gt;        F15 key&lt;br /&gt;    VK_F16 (0x7F)&lt;br /&gt;        F16 key&lt;br /&gt;    VK_F17 (0x80H)&lt;br /&gt;        F17 key&lt;br /&gt;    VK_F18 (0x81H)&lt;br /&gt;        F18 key&lt;br /&gt;    VK_F19 (0x82H)&lt;br /&gt;        F19 key&lt;br /&gt;    VK_F20 (0x83H)&lt;br /&gt;        F20 key&lt;br /&gt;    VK_F21 (0x84H)&lt;br /&gt;        F21 key&lt;br /&gt;    VK_F22 (0x85H)&lt;br /&gt;        F22 key&lt;br /&gt;    VK_F23 (0x86H)&lt;br /&gt;        F23 key&lt;br /&gt;    VK_F24 (0x87H)&lt;br /&gt;        F24 key&lt;br /&gt;    - (0x88-8F)&lt;br /&gt;        Unassigned&lt;br /&gt;    VK_NUMLOCK (0x90)&lt;br /&gt;        NUM LOCK key&lt;br /&gt;    VK_SCROLL (0x91)&lt;br /&gt;        SCROLL LOCK key&lt;br /&gt;     (0x92-96)&lt;br /&gt;        OEM specific&lt;br /&gt;    - (0x97-9F)&lt;br /&gt;        Unassigned&lt;br /&gt;    VK_LSHIFT (0xA0)&lt;br /&gt;        Left SHIFT key&lt;br /&gt;    VK_RSHIFT (0xA1)&lt;br /&gt;        Right SHIFT key&lt;br /&gt;    VK_LCONTROL (0xA2)&lt;br /&gt;        Left CONTROL key&lt;br /&gt;    VK_RCONTROL (0xA3)&lt;br /&gt;        Right CONTROL key&lt;br /&gt;    VK_LMENU (0xA4)&lt;br /&gt;        Left MENU key&lt;br /&gt;    VK_RMENU (0xA5)&lt;br /&gt;        Right MENU key&lt;br /&gt;    VK_BROWSER_BACK (0xA6)&lt;br /&gt;        Windows 2000/XP: Browser Back key&lt;br /&gt;    VK_BROWSER_FORWARD (0xA7)&lt;br /&gt;        Windows 2000/XP: Browser Forward key&lt;br /&gt;    VK_BROWSER_REFRESH (0xA8)&lt;br /&gt;        Windows 2000/XP: Browser Refresh key&lt;br /&gt;    VK_BROWSER_STOP (0xA9)&lt;br /&gt;        Windows 2000/XP: Browser Stop key&lt;br /&gt;    VK_BROWSER_SEARCH (0xAA)&lt;br /&gt;        Windows 2000/XP: Browser Search key &lt;br /&gt;    VK_BROWSER_FAVORITES (0xAB)&lt;br /&gt;        Windows 2000/XP: Browser Favorites key&lt;br /&gt;    VK_BROWSER_HOME (0xAC)&lt;br /&gt;        Windows 2000/XP: Browser Start and Home key&lt;br /&gt;    VK_VOLUME_MUTE (0xAD)&lt;br /&gt;        Windows 2000/XP: Volume Mute key&lt;br /&gt;    VK_VOLUME_DOWN (0xAE)&lt;br /&gt;        Windows 2000/XP: Volume Down key&lt;br /&gt;    VK_VOLUME_UP (0xAF)&lt;br /&gt;        Windows 2000/XP: Volume Up key&lt;br /&gt;    VK_MEDIA_NEXT_TRACK (0xB0)&lt;br /&gt;        Windows 2000/XP: Next Track key&lt;br /&gt;    VK_MEDIA_PREV_TRACK (0xB1)&lt;br /&gt;        Windows 2000/XP: Previous Track key&lt;br /&gt;    VK_MEDIA_STOP (0xB2)&lt;br /&gt;        Windows 2000/XP: Stop Media key&lt;br /&gt;    VK_MEDIA_PLAY_PAUSE (0xB3)&lt;br /&gt;        Windows 2000/XP: Play/Pause Media key&lt;br /&gt;    VK_LAUNCH_MAIL (0xB4)&lt;br /&gt;        Windows 2000/XP: Start Mail key&lt;br /&gt;    VK_LAUNCH_MEDIA_SELECT (0xB5)&lt;br /&gt;        Windows 2000/XP: Select Media key&lt;br /&gt;    VK_LAUNCH_APP1 (0xB6)&lt;br /&gt;        Windows 2000/XP: Start Application 1 key&lt;br /&gt;    VK_LAUNCH_APP2 (0xB7)&lt;br /&gt;        Windows 2000/XP: Start Application 2 key&lt;br /&gt;    - (0xB8-B9)&lt;br /&gt;        Reserved&lt;br /&gt;    VK_OEM_1 (0xBA)&lt;br /&gt;        Used for miscellaneous characters; it can vary by keyboard.&lt;br /&gt;&lt;br /&gt;        Windows 2000/XP: For the US standard keyboard, the ';:' key &lt;br /&gt;    VK_OEM_PLUS (0xBB)&lt;br /&gt;        Windows 2000/XP: For any country/region, the '+' key&lt;br /&gt;    VK_OEM_COMMA (0xBC)&lt;br /&gt;        Windows 2000/XP: For any country/region, the ',' key&lt;br /&gt;    VK_OEM_MINUS (0xBD)&lt;br /&gt;        Windows 2000/XP: For any country/region, the '-' key&lt;br /&gt;    VK_OEM_PERIOD (0xBE)&lt;br /&gt;        Windows 2000/XP: For any country/region, the '.' key&lt;br /&gt;    VK_OEM_2 (0xBF)&lt;br /&gt;        Used for miscellaneous characters; it can vary by keyboard.&lt;br /&gt;&lt;br /&gt;        Windows 2000/XP: For the US standard keyboard, the '/?' key &lt;br /&gt;    VK_OEM_3 (0xC0)&lt;br /&gt;        Used for miscellaneous characters; it can vary by keyboard.&lt;br /&gt;&lt;br /&gt;        Windows 2000/XP: For the US standard keyboard, the '`~' key &lt;br /&gt;    - (0xC1-D7)&lt;br /&gt;        Reserved&lt;br /&gt;    - (0xD8-DA)&lt;br /&gt;        Unassigned&lt;br /&gt;    VK_OEM_4 (0xDB)&lt;br /&gt;        Used for miscellaneous characters; it can vary by keyboard.&lt;br /&gt;&lt;br /&gt;        Windows 2000/XP: For the US standard keyboard, the '[{' key&lt;br /&gt;    VK_OEM_5 (0xDC)&lt;br /&gt;        Used for miscellaneous characters; it can vary by keyboard.&lt;br /&gt;&lt;br /&gt;        Windows 2000/XP: For the US standard keyboard, the '\|' key&lt;br /&gt;    VK_OEM_6 (0xDD)&lt;br /&gt;        Used for miscellaneous characters; it can vary by keyboard.&lt;br /&gt;&lt;br /&gt;        Windows 2000/XP: For the US standard keyboard, the ']}' key&lt;br /&gt;    VK_OEM_7 (0xDE)&lt;br /&gt;        Used for miscellaneous characters; it can vary by keyboard.&lt;br /&gt;&lt;br /&gt;        Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key&lt;br /&gt;    VK_OEM_8 (0xDF)&lt;br /&gt;        Used for miscellaneous characters; it can vary by keyboard.&lt;br /&gt;    - (0xE0)&lt;br /&gt;        Reserved&lt;br /&gt;     (0xE1)&lt;br /&gt;        OEM specific&lt;br /&gt;    VK_OEM_102 (0xE2)&lt;br /&gt;        Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard&lt;br /&gt;     (0xE3-E4)&lt;br /&gt;        OEM specific&lt;br /&gt;    VK_PROCESSKEY (0xE5)&lt;br /&gt;        Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key&lt;br /&gt;     (0xE6)&lt;br /&gt;        OEM specific&lt;br /&gt;    VK_PACKET (0xE7)&lt;br /&gt;        Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP&lt;br /&gt;    - (0xE8)&lt;br /&gt;        Unassigned&lt;br /&gt;     (0xE9-F5)&lt;br /&gt;        OEM specific&lt;br /&gt;    VK_ATTN (0xF6)&lt;br /&gt;        Attn key&lt;br /&gt;    VK_CRSEL (0xF7)&lt;br /&gt;        CrSel key&lt;br /&gt;    VK_EXSEL (0xF8)&lt;br /&gt;        ExSel key&lt;br /&gt;    VK_EREOF (0xF9)&lt;br /&gt;        Erase EOF key&lt;br /&gt;    VK_PLAY (0xFA)&lt;br /&gt;        Play key&lt;br /&gt;    VK_ZOOM (0xFB)&lt;br /&gt;        Zoom key&lt;br /&gt;    VK_NONAME (0xFC)&lt;br /&gt;        Reserved &lt;br /&gt;    VK_PA1 (0xFD)&lt;br /&gt;        PA1 key&lt;br /&gt;    VK_OEM_CLEA
